Agda 2.3.0.1 → 2.3.2
raw patch · 208 files changed
+23170/−12777 lines, 208 filesdep +Agdadep +Win32dep +deepseqdep −sybdep −utf8-stringdep ~QuickCheckdep ~basedep ~bytestringnew-component:exe:agdanew-uploader
Dependencies added: Agda, Win32, deepseq, geniplate, parallel, text, time, unordered-containers
Dependencies removed: syb, utf8-string
Dependency ranges changed: QuickCheck, base, bytestring, containers, directory, hashable, haskeline, haskell-src-exts, mtl
Files
- Agda.cabal +72/−44
- LICENSE +1/−1
- README +25/−11
- dist/build/Agda/Syntax/Parser/Lexer.hs +77/−73
- dist/build/Agda/Syntax/Parser/Parser.hs +5043/−4783
- doc/release-notes/2-3-2.txt +699/−0
- src/agda-mode/Main.hs +49/−17
- src/data/Agda.css +2/−0
- src/data/EpicInclude/AgdaPrelude.e +23/−45
- src/data/agda.sty +152/−0
- src/data/emacs-mode/agda-input.el +1/−2
- src/data/emacs-mode/agda2-highlight.el +125/−42
- src/data/emacs-mode/agda2-mode.el +575/−298
- src/data/emacs-mode/agda2-queue.el +43/−0
- src/data/emacs-mode/annotation.el +81/−80
- src/full/Agda/Auto/Auto.hs +11/−10
- src/full/Agda/Auto/Convert.hs +35/−29
- src/full/Agda/Compiler/CallCompiler.hs +83/−0
- src/full/Agda/Compiler/Epic/CompileState.hs +4/−3
- src/full/Agda/Compiler/Epic/Compiler.hs +11/−11
- src/full/Agda/Compiler/Epic/Epic.hs +1/−1
- src/full/Agda/Compiler/Epic/Erasure.hs +3/−3
- src/full/Agda/Compiler/Epic/ForceConstrs.hs +3/−2
- src/full/Agda/Compiler/Epic/Forcing.hs +22/−23
- src/full/Agda/Compiler/Epic/FromAgda.hs +14/−11
- src/full/Agda/Compiler/Epic/Injection.hs +19/−18
- src/full/Agda/Compiler/Epic/NatDetection.hs +9/−7
- src/full/Agda/Compiler/Epic/Primitive.hs +2/−1
- src/full/Agda/Compiler/Epic/Smashing.hs +5/−4
- src/full/Agda/Compiler/Epic/Static.hs +6/−3
- src/full/Agda/Compiler/HaskellTypes.hs +7/−5
- src/full/Agda/Compiler/JS/Compiler.hs +30/−6
- src/full/Agda/Compiler/JS/Substitution.hs +1/−1
- src/full/Agda/Compiler/JS/Syntax.hs +7/−7
- src/full/Agda/Compiler/MAlonzo/Compiler.hs +40/−48
- src/full/Agda/Compiler/MAlonzo/Misc.hs +7/−27
- src/full/Agda/Compiler/MAlonzo/Pretty.hs +22/−5
- src/full/Agda/Compiler/MAlonzo/Primitives.hs +50/−7
- src/full/Agda/Interaction/BasicOps.hs +66/−37
- src/full/Agda/Interaction/CommandLine/CommandLine.hs +29/−30
- src/full/Agda/Interaction/EmacsCommand.hs +51/−7
- src/full/Agda/Interaction/Exceptions.hs +3/−3
- src/full/Agda/Interaction/FindFile.hs +2/−3
- src/full/Agda/Interaction/GhcTop.hs +124/−0
- src/full/Agda/Interaction/GhciTop.hs +0/−1083
- src/full/Agda/Interaction/Highlighting/Emacs.hs +51/−24
- src/full/Agda/Interaction/Highlighting/Generate.hs +434/−316
- src/full/Agda/Interaction/Highlighting/Generate.hs-boot +10/−0
- src/full/Agda/Interaction/Highlighting/LaTeX.hs +455/−0
- src/full/Agda/Interaction/Highlighting/Precise.hs +200/−38
- src/full/Agda/Interaction/Highlighting/Range.hs +77/−27
- src/full/Agda/Interaction/Highlighting/Vim.hs +11/−4
- src/full/Agda/Interaction/Imports.hs +146/−121
- src/full/Agda/Interaction/InteractionTop.hs +1034/−0
- src/full/Agda/Interaction/MakeCase.hs +47/−15
- src/full/Agda/Interaction/Options.hs +85/−37
- src/full/Agda/Interaction/Response.hs +115/−0
- src/full/Agda/Interaction/Response.hs-boot +11/−0
- src/full/Agda/Main.hs +26/−22
- src/full/Agda/Syntax/Abstract.hs +372/−139
- src/full/Agda/Syntax/Abstract/Copatterns.hs +422/−0
- src/full/Agda/Syntax/Abstract/Name.hs +35/−8
- src/full/Agda/Syntax/Abstract/Views.hs +7/−0
- src/full/Agda/Syntax/Common.hs +129/−20
- src/full/Agda/Syntax/Concrete.hs +216/−51
- src/full/Agda/Syntax/Concrete/Definitions.hs +267/−103
- src/full/Agda/Syntax/Concrete/Name.hs +9/−5
- src/full/Agda/Syntax/Concrete/Operators.hs +310/−98
- src/full/Agda/Syntax/Concrete/Operators/Parser.hs +19/−18
- src/full/Agda/Syntax/Concrete/Pretty.hs +58/−39
- src/full/Agda/Syntax/Fixity.hs +21/−13
- src/full/Agda/Syntax/Info.hs +44/−10
- src/full/Agda/Syntax/Internal.hs +315/−177
- src/full/Agda/Syntax/Internal/Generic.hs +18/−0
- src/full/Agda/Syntax/Literal.hs +13/−2
- src/full/Agda/Syntax/Notation.hs +2/−2
- src/full/Agda/Syntax/Parser.hs +8/−9
- src/full/Agda/Syntax/Parser/LexActions.hs +5/−3
- src/full/Agda/Syntax/Parser/Lexer.x +21/−17
- src/full/Agda/Syntax/Parser/Parser.y +248/−118
- src/full/Agda/Syntax/Parser/Tokens.hs +6/−3
- src/full/Agda/Syntax/Position.hs +58/−34
- src/full/Agda/Syntax/Scope/Base.hs +63/−19
- src/full/Agda/Syntax/Scope/Monad.hs +23/−7
- src/full/Agda/Syntax/Strict.hs +0/−100
- src/full/Agda/Syntax/Translation/AbstractToConcrete.hs +119/−65
- src/full/Agda/Syntax/Translation/ConcreteToAbstract.hs +265/−115
- src/full/Agda/Syntax/Translation/InternalToAbstract.hs +282/−156
- src/full/Agda/Termination/CallGraph.hs +26/−7
- src/full/Agda/Termination/Lexicographic.hs +5/−0
- src/full/Agda/Termination/Matrix.hs +2/−1
- src/full/Agda/Termination/SparseMatrix.hs +3/−3
- src/full/Agda/Termination/TermCheck.hs +415/−201
- src/full/Agda/Termination/Termination.hs +11/−3
- src/full/Agda/Tests.hs +5/−1
- src/full/Agda/TypeChecking/Abstract.hs +12/−6
- src/full/Agda/TypeChecking/CompiledClause.hs +28/−9
- src/full/Agda/TypeChecking/CompiledClause/Compile.hs +80/−16
- src/full/Agda/TypeChecking/CompiledClause/Compile.hs-boot +1/−1
- src/full/Agda/TypeChecking/CompiledClause/Match.hs +12/−10
- src/full/Agda/TypeChecking/Constraints.hs +28/−88
- src/full/Agda/TypeChecking/Constraints.hs-boot +9/−0
- src/full/Agda/TypeChecking/Conversion.hs +303/−121
- src/full/Agda/TypeChecking/Coverage.hs +288/−110
- src/full/Agda/TypeChecking/Coverage/Match.hs +135/−39
- src/full/Agda/TypeChecking/Coverage/SplitTree.hs +96/−0
- src/full/Agda/TypeChecking/Datatypes.hs +48/−5
- src/full/Agda/TypeChecking/DisplayForm.hs +37/−18
- src/full/Agda/TypeChecking/DropArgs.hs +79/−0
- src/full/Agda/TypeChecking/Eliminators.hs +17/−6
- src/full/Agda/TypeChecking/Empty.hs +24/−13
- src/full/Agda/TypeChecking/Empty.hs-boot +3/−2
- src/full/Agda/TypeChecking/Errors.hs +130/−53
- src/full/Agda/TypeChecking/Errors.hs-boot +5/−0
- src/full/Agda/TypeChecking/EtaContract.hs +5/−4
- src/full/Agda/TypeChecking/Forcing.hs +5/−4
- src/full/Agda/TypeChecking/Free.hs +56/−24
- src/full/Agda/TypeChecking/Implicit.hs +58/−1
- src/full/Agda/TypeChecking/Injectivity.hs +35/−14
- src/full/Agda/TypeChecking/InstanceArguments.hs +274/−0
- src/full/Agda/TypeChecking/InstanceArguments.hs-boot +7/−0
- src/full/Agda/TypeChecking/Irrelevance.hs +49/−38
- src/full/Agda/TypeChecking/Level.hs +13/−8
- src/full/Agda/TypeChecking/LevelConstraints.hs +17/−7
- src/full/Agda/TypeChecking/MetaVars.hs +327/−159
- src/full/Agda/TypeChecking/MetaVars.hs-boot +10/−2
- src/full/Agda/TypeChecking/MetaVars/Mention.hs +8/−3
- src/full/Agda/TypeChecking/MetaVars/Occurs.hs +254/−70
- src/full/Agda/TypeChecking/Monad.hs +2/−0
- src/full/Agda/TypeChecking/Monad/Base.hs +402/−132
- src/full/Agda/TypeChecking/Monad/Base.hs-boot +7/−0
- src/full/Agda/TypeChecking/Monad/Builtin.hs +52/−4
- src/full/Agda/TypeChecking/Monad/Constraints.hs +20/−3
- src/full/Agda/TypeChecking/Monad/Context.hs +94/−62
- src/full/Agda/TypeChecking/Monad/Context.hs-boot +1/−1
- src/full/Agda/TypeChecking/Monad/Debug.hs +1/−2
- src/full/Agda/TypeChecking/Monad/Env.hs +8/−8
- src/full/Agda/TypeChecking/Monad/Exception.hs +3/−0
- src/full/Agda/TypeChecking/Monad/Imports.hs +1/−2
- src/full/Agda/TypeChecking/Monad/MetaVars.hs +56/−5
- src/full/Agda/TypeChecking/Monad/Mutual.hs +6/−4
- src/full/Agda/TypeChecking/Monad/Open.hs +2/−2
- src/full/Agda/TypeChecking/Monad/Options.hs +69/−7
- src/full/Agda/TypeChecking/Monad/Sharing.hs +55/−0
- src/full/Agda/TypeChecking/Monad/Signature.hs +174/−150
- src/full/Agda/TypeChecking/Monad/SizedTypes.hs +183/−34
- src/full/Agda/TypeChecking/Monad/State.hs +27/−1
- src/full/Agda/TypeChecking/Monad/Trace.hs +62/−7
- src/full/Agda/TypeChecking/Patterns/Match.hs +5/−3
- src/full/Agda/TypeChecking/Polarity.hs +264/−73
- src/full/Agda/TypeChecking/Polarity.hs-boot +1/−0
- src/full/Agda/TypeChecking/Positivity.hs +299/−117
- src/full/Agda/TypeChecking/Pretty.hs +30/−7
- src/full/Agda/TypeChecking/Primitive.hs +35/−22
- src/full/Agda/TypeChecking/ProjectionLike.hs +149/−0
- src/full/Agda/TypeChecking/ProjectionLike.hs-boot +7/−0
- src/full/Agda/TypeChecking/Quote.hs +27/−20
- src/full/Agda/TypeChecking/RecordPatterns.hs +370/−31
- src/full/Agda/TypeChecking/Records.hs +114/−59
- src/full/Agda/TypeChecking/Records.hs-boot +1/−1
- src/full/Agda/TypeChecking/Reduce.hs +176/−89
- src/full/Agda/TypeChecking/Rules/Builtin.hs +65/−49
- src/full/Agda/TypeChecking/Rules/Builtin/Coinduction.hs +46/−65
- src/full/Agda/TypeChecking/Rules/Builtin/Coinduction.hs-boot +2/−0
- src/full/Agda/TypeChecking/Rules/Data.hs +44/−24
- src/full/Agda/TypeChecking/Rules/Decl.hs +213/−60
- src/full/Agda/TypeChecking/Rules/Def.hs +259/−297
- src/full/Agda/TypeChecking/Rules/LHS.hs +169/−148
- src/full/Agda/TypeChecking/Rules/LHS/Implicit.hs +40/−12
- src/full/Agda/TypeChecking/Rules/LHS/Instantiate.hs +33/−19
- src/full/Agda/TypeChecking/Rules/LHS/Problem.hs +93/−14
- src/full/Agda/TypeChecking/Rules/LHS/ProblemRest.hs +129/−0
- src/full/Agda/TypeChecking/Rules/LHS/Split.hs +127/−58
- src/full/Agda/TypeChecking/Rules/LHS/Unify.hs +62/−255
- src/full/Agda/TypeChecking/Rules/Record.hs +103/−53
- src/full/Agda/TypeChecking/Rules/Term.hs +435/−263
- src/full/Agda/TypeChecking/Rules/Term.hs-boot +9/−0
- src/full/Agda/TypeChecking/Serialise.hs +281/−78
- src/full/Agda/TypeChecking/SizedTypes.hs +446/−81
- src/full/Agda/TypeChecking/Substitute.hs +359/−365
- src/full/Agda/TypeChecking/Telescope.hs +34/−32
- src/full/Agda/TypeChecking/Test/Generators.hs +15/−5
- src/full/Agda/TypeChecking/Tests.hs +1/−1
- src/full/Agda/TypeChecking/UniversePolymorphism.hs +0/−1
- src/full/Agda/TypeChecking/With.hs +42/−31
- src/full/Agda/Utils/Either.hs +17/−1
- src/full/Agda/Utils/FileName.hs +27/−2
- src/full/Agda/Utils/Generics.hs +0/−39
- src/full/Agda/Utils/Geniplate.hs +43/−0
- src/full/Agda/Utils/Graph.hs +254/−20
- src/full/Agda/Utils/HashMap.hs +6/−0
- src/full/Agda/Utils/IO/Locale.hs +0/−66
- src/full/Agda/Utils/IO/UTF8.hs +3/−18
- src/full/Agda/Utils/List.hs +42/−0
- src/full/Agda/Utils/Map.hs +10/−1
- src/full/Agda/Utils/Maybe.hs +4/−0
- src/full/Agda/Utils/Monad.hs +139/−33
- src/full/Agda/Utils/Permutation.hs +36/−9
- src/full/Agda/Utils/Pointed.hs +14/−0
- src/full/Agda/Utils/Pointer.hs +70/−17
- src/full/Agda/Utils/String.hs +6/−5
- src/full/Agda/Utils/Suffix.hs +50/−13
- src/full/Agda/Utils/TestHelpers.hs +9/−2
- src/full/Agda/Utils/Time.hs +33/−0
- src/full/Agda/Utils/Tuple.hs +51/−2
- src/full/Agda/Utils/VarSet.hs +4/−4
- src/full/Agda/Utils/Warshall.hs +18/−15
- src/main/Main.hs +12/−0
Agda.cabal view
@@ -1,10 +1,10 @@ name: Agda-version: 2.3.0.1+version: 2.3.2 cabal-version: >= 1.8 build-type: Simple license: OtherLicense license-file: LICENSE-author: Ulf Norell, Nils Anders Danielsson, Catarina Coquand, Makoto Takeyama, Andreas Abel, Darin Morrison...+author: Ulf Norell, Nils Anders Danielsson, Andreas Abel, Makoto Takeyama, Catarina Coquand, with contributions by Stevan Andjelkovic, Marcin Benke, Jean-Philippe Bernardy, James Chapman, Dominique Devriese, Peter Divanski, Fredrik Nordvall Forsberg, Olle Frediksson, Daniel Gustafsson, Alan Jeffrey, Fredrik Lindblad, Guilhem Moulin, Nicolas Pouillard, Andrés Sicard-Ramírez and many more. maintainer: Ulf Norell <ulfn@chalmers.se> homepage: http://wiki.portal.chalmers.se/agda/ bug-reports: http://code.google.com/p/agda/issues/list@@ -25,16 +25,14 @@ similarities with other proof assistants based on dependent types, such as Coq, Epigram and NuPRL. .- Note that if you want to use the command-line program (agda), then- you should also install the Agda-executable package. The Agda- package includes an Emacs mode for Agda, but you need to set up the- Emacs mode yourself (for instance by running @agda-mode setup@; see- the README).+ This package includes both a command-line program (agda) and an+ Emacs mode. If you want to use the Emacs mode you can set it up by+ running @agda-mode setup@ (see the README). .- Note also that this library does not follow the package versioning- policy, because the library is only intended to be used by the Emacs- mode and the Agda-executable package.-tested-with: GHC == 7.4.1+ Note that the Agda library does not follow the package versioning+ policy, because it is not intended to be used by third-party+ packages.+tested-with: GHC == 7.6.1 extra-source-files: src/full/Agda/undefined.h README doc/release-notes/*.txt@@ -44,6 +42,7 @@ EpicInclude/AgdaPrelude.e EpicInclude/stdagda.c EpicInclude/stdagda.h+ agda.sty source-repository head type: darcs@@ -52,13 +51,7 @@ source-repository this type: darcs location: http://code.haskell.org/Agda/- tag: 2.3.0--flag use-locale- description:- Try to use the character encoding specified by the locale for most- of the IO going to/from stdin and stdout. (Note that source files- must always be encoded using UTF8.)+ tag: 2.3.2 flag epic default: False@@ -68,38 +61,50 @@ library hs-source-dirs: src/full- if flag(use-locale)- build-depends: base >= 4.2 && < 4.6- else- build-depends: base == 4.1.*,- utf8-string == 0.3.* if flag(epic) build-depends: epic >= 0.1.13 && < 0.10- build-depends: mtl == 2.0.*,- QuickCheck >= 2.3 && < 2.5,- haskell-src-exts >= 1.9.6 && < 1.12,- containers >= 0.1 && < 0.5,++ if os(windows)+ build-depends: Win32 == 2.2.*++ build-depends: base >= 4.2 && < 4.7,+ mtl >= 2.0 && < 2.2,+ QuickCheck >= 2.3 && < 2.6,+ haskell-src-exts >= 1.9.6 && < 1.14,+ containers >= 0.1 && < 0.6,+ unordered-containers == 0.2.*, pretty >= 1.0 && < 1.2,- directory >= 1.0 && < 1.2,- old-time >= 1.0 && < 1.2,- bytestring >= 0.9.0.1 && < 0.10,+ bytestring >= 0.9.0.1 && < 0.11, array >= 0.1 && < 0.5, binary >= 0.4.4 && < 0.6, zlib >= 0.4.0.1 && < 0.6, filepath >= 1.1 && < 1.4, process >= 1.0.1.0 && < 1.2,- haskeline >= 0.6.3.2 && < 0.7,+ haskeline >= 0.6.3.2 && < 0.8, xhtml == 3000.2.*,- hashable == 1.1.*,+ hashable >= 1.1.2.3 && < 1.2, hashtables == 1.0.*,- syb >= 0.1 && < 0.4+ geniplate >= 0.6.0.3 && < 0.7,+ parallel < 3.3,+ deepseq == 1.3.*,+ text == 0.11.*++ if impl(ghc < 7.6)+ build-depends: old-time >= 1.0 && < 1.2,+ directory >= 1.0 && < 1.2+ else+ build-depends: time == 1.4.*,+ directory == 1.2.*+ build-tools: happy >= 1.15 && < 2, alex >= 2.3.1 && < 3.1 extensions: CPP exposed-modules: Agda.Main Agda.ImpossibleTest Agda.Interaction.BasicOps- Agda.Interaction.GhciTop+ Agda.Interaction.GhcTop+ Agda.Interaction.InteractionTop+ Agda.Compiler.CallCompiler Agda.Compiler.HaskellTypes Agda.Compiler.Epic.AuxAST Agda.Compiler.Epic.CaseOpts@@ -142,10 +147,13 @@ Agda.Interaction.Highlighting.Precise Agda.Interaction.Highlighting.Range Agda.Interaction.Highlighting.Vim+ Agda.Interaction.Highlighting.LaTeX Agda.Interaction.Imports+ Agda.Interaction.Response Agda.Interaction.MakeCase Agda.Interaction.Monad Agda.Interaction.Options+ Agda.Syntax.Abstract.Copatterns Agda.Syntax.Abstract.Name Agda.Syntax.Abstract.Pretty Agda.Syntax.Abstract.Views@@ -178,7 +186,6 @@ Agda.Syntax.Position Agda.Syntax.Scope.Base Agda.Syntax.Scope.Monad- Agda.Syntax.Strict Agda.Syntax.Translation.AbstractToConcrete Agda.Syntax.Translation.ConcreteToAbstract Agda.Syntax.Translation.InternalToAbstract@@ -199,8 +206,10 @@ Agda.TypeChecking.Conversion Agda.TypeChecking.Coverage Agda.TypeChecking.Coverage.Match+ Agda.TypeChecking.Coverage.SplitTree Agda.TypeChecking.Datatypes Agda.TypeChecking.DisplayForm+ Agda.TypeChecking.DropArgs Agda.TypeChecking.Eliminators Agda.TypeChecking.Empty Agda.TypeChecking.EtaContract@@ -209,6 +218,7 @@ Agda.TypeChecking.Forcing Agda.TypeChecking.Implicit Agda.TypeChecking.Injectivity+ Agda.TypeChecking.InstanceArguments Agda.TypeChecking.Irrelevance Agda.TypeChecking.Level Agda.TypeChecking.LevelConstraints@@ -228,6 +238,7 @@ Agda.TypeChecking.Monad.Mutual Agda.TypeChecking.Monad.Open Agda.TypeChecking.Monad.Options+ Agda.TypeChecking.Monad.Sharing Agda.TypeChecking.Monad.Signature Agda.TypeChecking.Monad.SizedTypes Agda.TypeChecking.Monad.State@@ -239,6 +250,7 @@ Agda.TypeChecking.Positivity Agda.TypeChecking.Pretty Agda.TypeChecking.Primitive+ Agda.TypeChecking.ProjectionLike Agda.TypeChecking.Quote Agda.TypeChecking.Rebind Agda.TypeChecking.RecordPatterns@@ -253,6 +265,7 @@ Agda.TypeChecking.Rules.LHS.Implicit Agda.TypeChecking.Rules.LHS.Instantiate Agda.TypeChecking.Rules.LHS.Problem+ Agda.TypeChecking.Rules.LHS.ProblemRest Agda.TypeChecking.Rules.LHS.Split Agda.TypeChecking.Rules.LHS.Unify Agda.TypeChecking.Rules.Record@@ -271,12 +284,12 @@ Agda.Utils.FileName Agda.Utils.Fresh Agda.Utils.Function- Agda.Utils.Generics+ Agda.Utils.Geniplate Agda.Utils.Graph Agda.Utils.Hash+ Agda.Utils.HashMap Agda.Utils.Impossible Agda.Utils.IO.Binary- Agda.Utils.IO.Locale Agda.Utils.IO.UTF8 Agda.Utils.List Agda.Utils.Map@@ -284,6 +297,7 @@ Agda.Utils.Monad Agda.Utils.Permutation Agda.Utils.Pointer+ Agda.Utils.Pointed Agda.Utils.Pretty Agda.Utils.QuickCheck Agda.Utils.ReadP@@ -292,6 +306,7 @@ Agda.Utils.String Agda.Utils.Suffix Agda.Utils.TestHelpers+ Agda.Utils.Time Agda.Utils.Trie Agda.Utils.Tuple Agda.Utils.Unicode@@ -320,6 +335,8 @@ -- The Cabal-generated module Paths_Agda triggers a warning under -- GHC 7.2.1/7.2.2 (at least when certain versions of Cabal are -- used).+ -- if impl(ghc < 7.2.1) || impl(ghc > 7.2.2)+ -- ghc-options: -Werror if impl(ghc >= 6.12) ghc-options: -fwarn-dodgy-exports -fwarn-wrong-do-bind@@ -327,15 +344,26 @@ ghc-options: -fwarn-identities ghc-prof-options: -auto-all +executable agda+ hs-source-dirs: src/main+ main-is: Main.hs+ build-depends: Agda == 2.3.2,+ -- Nothing is used from the following package, except+ -- for the prelude.+ base >= 3 && < 6+ if impl(ghc >= 7)+ -- If someone installs Agda with the setuid bit set, then the+ -- presence of +RTS may be a security problem (see GHC bug #3910).+ -- However, we sometimes recommend people to use +RTS to control+ -- Agda's memory usage, so we want this functionality enabled by+ -- default.+ ghc-options: -rtsopts+ executable agda-mode hs-source-dirs: src/agda-mode main-is: Main.hs other-modules: Paths_Agda- if flag(use-locale)- build-depends: base >= 4.2 && < 4.6- else- build-depends: base == 4.1.*,- utf8-string == 0.3.*- build-depends: filepath >= 1.1 && < 1.4,+ build-depends: base >= 4.2 && < 4.7,+ filepath >= 1.1 && < 1.4, process >= 1.0.1.0 && < 1.2,- directory >= 1.0 && < 1.2+ directory >= 1.0 && < 1.3
LICENSE view
@@ -1,4 +1,4 @@-Copyright (c) 2005-2011 Ulf Norell, Nils Anders Danielsson, Catarina+Copyright (c) 2005-2012 Ulf Norell, Nils Anders Danielsson, Catarina Coquand, Makoto Takeyama, Andreas Abel, Karl Mehltretter, Marcin Benke, Darin Morrison.
README view
@@ -33,7 +33,7 @@ commands: cabal update- cabal install Agda-executable+ cabal install Agda agda-mode setup The last command tries to set up Emacs for use with Agda. As an@@ -42,6 +42,16 @@ (load-file (let ((coding-system-for-read 'utf-8)) (shell-command-to-string "agda-mode locate"))) + It is also possible (but not necessary) to compile the Emacs mode's+ files:++ agda-mode compile++ This can, in some cases, give a noticeable speedup.++ WARNING: If you reinstall the Agda mode without recompiling the Emacs+ Lisp files, then Emacs may continue using the old, compiled files.+ * Using the source tar balls available from the Agda Wiki, or the development version of the code available from our darcs repository. @@ -53,10 +63,8 @@ cabal update cabal install agda-mode setup- cd src/main- cabal install - The third command tries to set up Emacs for use with Agda. As an+ The last command tries to set up Emacs for use with Agda. As an alternative you can copy the following text to your .emacs file: (load-file (let ((coding-system-for-read 'utf-8))@@ -66,10 +74,20 @@ then you can give various flags to cabal install, see cabal install --help. - 2b) Instead of following 2a you can try to install Agda (including- batch-mode tool and Emacs mode) by running the following- command:+ It is also possible (but not necessary) to compile the Emacs+ mode's files: + agda-mode compile++ This can, in some cases, give a noticeable speedup.++ WARNING: If you reinstall the Agda mode without recompiling the+ Emacs Lisp files, then Emacs may continue using the old,+ compiled files.++ 2b) Instead of following 2a you can try to install Agda (including a+ compiled Emacs mode) by running the following command:+ make install ------------------------------------------------------------------------@@ -115,7 +133,6 @@ Alex: http://www.haskell.org/alex/ Happy: http://www.haskell.org/happy/ GNU Emacs: http://www.gnu.org/software/emacs/- haskell-mode: http://projects.haskell.org/haskellmode-emacs/ You should also make sure that programs installed by cabal-install are on your shell's search path.@@ -145,7 +162,6 @@ cabal update cabal install Agda -fepic- cabal install Agda-executable agda-mode setup * When installing using a source tar ball, following the instructions@@ -154,8 +170,6 @@ cabal update cabal install -fepic agda-mode setup- cd src/main- cabal install * When installing using a source tar ball, following the instructions in 2b) above:
dist/build/Agda/Syntax/Parser/Lexer.hs view
@@ -50,19 +50,19 @@ import GlaExts #endif alex_base :: AlexAddr-alex_base = AlexA# "\xf7\xff\xff\xff\x6c\x00\x00\x00\xc8\x00\x00\x00\x3c\x01\x00\x00\x40\x01\x00\x00\x44\x01\x00\x00\x4b\x01\x00\x00\x41\x02\x00\x00\x88\xff\xff\xff\xd9\xff\xff\xff\xda\xff\xff\xff\x99\xff\xff\xff\x20\x03\x00\x00\x5e\x00\x00\x00\x7c\x03\x00\x00\x7b\x03\x00\x00\xfb\x03\x00\x00\xa4\xff\xff\xff\x7b\x04\x00\x00\xfb\x04\x00\x00\x7b\x05\x00\x00\xfb\x05\x00\x00\x7b\x06\x00\x00\xfb\x06\x00\x00\x9b\xff\xff\xff\xa8\xff\xff\xff\x91\xff\xff\xff\xa9\xff\xff\xff\x9f\xff\xff\xff\xab\xff\xff\xff\x00\x00\x00\x00\x6c\x07\x00\x00\x00\x00\x00\x00\xdd\x07\x00\x00\xac\xff\xff\xff\x00\x00\x00\x00\x4e\x08\x00\x00\x00\x00\x00\x00\xbf\x08\x00\x00\x00\x00\x00\x00\x00\x09\x00\x00\x00\x00\x00\x00\x41\x09\x00\x00\x00\x00\x00\x00\x82\x09\x00\x00\x00\x00\x00\x00\xc3\x09\x00\x00\xa2\x0a\x00\x00\x21\x0b\x00\x00\xe1\x0a\x00\x00\x00\x00\x00\x00\xe1\x0b\x00\x00\xa1\x0b\x00\x00\x00\x00\x00\x00\xa1\x0c\x00\x00\x61\x0c\x00\x00\x00\x00\x00\x00\x61\x0d\x00\x00\x07\x00\x00\x00\xd7\x0d\x00\x00\x39\x0d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xcd\x0e\x00\x00\xc3\x0f\x00\x00\xb9\x10\x00\x00\xaf\x11\x00\x00\xa5\x12\x00\x00\x9b\x13\x00\x00\x91\x14\x00\x00\x87\x15\x00\x00\x7d\x16\x00\x00\x73\x17\x00\x00\x69\x18\x00\x00\x5f\x19\x00\x00\x55\x1a\x00\x00\x4b\x1b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x93\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x42\x1c\x00\x00\x39\x1d\x00\x00\x30\x1e\x00\x00\x27\x1f\x00\x00\x1e\x20\x00\x00\x15\x21\x00\x00\x0c\x22\x00\x00\x03\x23\x00\x00\xfa\x23\x00\x00\xf1\x24\x00\x00\xe8\x25\x00\x00\xdf\x26\x00\x00\xd6\x27\x00\x00\xcd\x28\x00\x00\xc4\x29\x00\x00\xbb\x2a\x00\x00\xb2\x2b\x00\x00\xa9\x2c\x00\x00\xa0\x2d\x00\x00\x97\x2e\x00\x00\x8e\x2f\x00\x00\x85\x30\x00\x00\x7c\x31\x00\x00\x73\x32\x00\x00\x6a\x33\x00\x00\x61\x34\x00\x00\x58\x35\x00\x00\x4f\x36\x00\x00\x46\x37\x00\x00\x3d\x38\x00\x00\x34\x39\x00\x00\x2b\x3a\x00\x00\x22\x3b\x00\x00\x19\x3c\x00\x00\x10\x3d\x00\x00\x07\x3e\x00\x00\xfe\x3e\x00\x00\xf5\x3f\x00\x00\xec\x40\x00\x00\xe3\x41\x00\x00\xda\x42\x00\x00\xd1\x43\x00\x00\xc8\x44\x00\x00\xbf\x45\x00\x00\xb6\x46\x00\x00\xad\x47\x00\x00\xa4\x48\x00\x00\x9b\x49\x00\x00\x92\x4a\x00\x00\x89\x4b\x00\x00\x80\x4c\x00\x00\x77\x4d\x00\x00\x6e\x4e\x00\x00\x65\x4f\x00\x00\x5c\x50\x00\x00\x53\x51\x00\x00\x4a\x52\x00\x00\x41\x53\x00\x00\x38\x54\x00\x00\x2f\x55\x00\x00\x26\x56\x00\x00\x1d\x57\x00\x00\x14\x58\x00\x00\x0b\x59\x00\x00\x02\x5a\x00\x00\xf9\x5a\x00\x00\xf0\x5b\x00\x00\xe7\x5c\x00\x00\xde\x5d\x00\x00\xef\xff\xff\xff\x00\x00\x00\x00\xd4\x5e\x00\x00\xd4\x5f\x00\x00\xca\x60\x00\x00\xca\x61\x00\x00\xca\x62\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc4\x0e\x00\x00\xad\x0f\x00\x00\xa3\x10\x00\x00\x99\x11\x00\x00\x85\x13\x00\x00\x7b\x14\x00\x00\x71\x15\x00\x00\x67\x16\x00\x00\x5d\x17\x00\x00\x3f\x1a\x00\x00\x39\x1c\x00\x00\x30\x1d\x00\x00\x27\x1e\x00\x00\x1e\x1f\x00\x00\x15\x20\x00\x00\x0c\x21\x00\x00\xfa\x22\x00\x00\xf1\x23\x00\x00\xe8\x24\x00\x00\xdf\x25\x00\x00\xd6\x26\x00\x00\xcd\x27\x00\x00\xc4\x28\x00\x00\xc5\x29\x00\x00\xb2\x2a\x00\x00\xaa\x2c\x00\x00\x74\x32\x00\x00\x23\x3b\x00\x00\xed\x40\x00\x00\x9b\x48\x00\x00\xbe\x5e\x00\x00\xa9\x63\x00\x00\x05\x64\x00\x00\x61\x64\x00\x00\xbd\x64\x00\x00\x00\x00\x00\x00\x19\x65\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe5\xff\xff\xff\xe6\xff\xff\xff\x00\x00\x00\x00\x75\x65\x00\x00\xd1\x65\x00\x00\x53\x34\x00\x00\x2d\x66\x00\x00\x89\x66\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe5\x66\x00\x00\x33\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x31\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\x67\x00\x00\x9d\x67\x00\x00\xf9\x67\x00\x00\x55\x68\x00\x00\xb1\x68\x00\x00\x0d\x69\x00\x00\x69\x69\x00\x00\xc5\x69\x00\x00\x21\x6a\x00\x00\x7d\x6a\x00\x00\xd9\x6a\x00\x00\x35\x6b\x00\x00\x91\x6b\x00\x00\xed\x6b\x00\x00\x49\x6c\x00\x00\xa5\x6c\x00\x00\x01\x6d\x00\x00\x5d\x6d\x00\x00\xb9\x6d\x00\x00\x15\x6e\x00\x00\x71\x6e\x00\x00\xcd\x6e\x00\x00\x29\x6f\x00\x00\x85\x6f\x00\x00\xe1\x6f\x00\x00\x3d\x70\x00\x00\x99\x70\x00\x00\xf5\x70\x00\x00\x51\x71\x00\x00\xad\x71\x00\x00\x09\x72\x00\x00\x65\x72\x00\x00\xc1\x72\x00\x00\x1d\x73\x00\x00\x79\x73\x00\x00\xd5\x73\x00\x00\x31\x74\x00\x00\x8d\x74\x00\x00\xe9\x74\x00\x00\x45\x75\x00\x00\xa1\x75\x00\x00\xfd\x75\x00\x00\x59\x76\x00\x00\xb5\x76\x00\x00\x11\x77\x00\x00\x6d\x77\x00\x00\xc9\x77\x00\x00\x25\x78\x00\x00\x81\x78\x00\x00\xdd\x78\x00\x00\x39\x79\x00\x00\x95\x79\x00\x00\xf1\x79\x00\x00\x4d\x7a\x00\x00\xa9\x7a\x00\x00\x05\x7b\x00\x00\x61\x7b\x00\x00\xbd\x7b\x00\x00\x19\x7c\x00\x00\x75\x7c\x00\x00\xd1\x7c\x00\x00\x2d\x7d\x00\x00\x89\x7d\x00\x00\xe5\x7d\x00\x00\x41\x7e\x00\x00\x9d\x7e\x00\x00\xf9\x7e\x00\x00\x55\x7f\x00\x00\xb1\x7f\x00\x00\x0d\x80\x00\x00\x69\x80\x00\x00\xc5\x80\x00\x00\x21\x81\x00\x00\x7d\x81\x00\x00\xd9\x81\x00\x00\x35\x82\x00\x00\x91\x82\x00\x00\xed\x82\x00\x00\x49\x83\x00\x00\xa5\x83\x00\x00\x01\x84\x00\x00\x5d\x84\x00\x00\xb9\x84\x00\x00\x15\x85\x00\x00\x71\x85\x00\x00\xcd\x85\x00\x00\x29\x86\x00\x00\x85\x86\x00\x00\xe1\x86\x00\x00\x3d\x87\x00\x00\x99\x87\x00\x00\xf5\x87\x00\x00\x51\x88\x00\x00\xad\x88\x00\x00\x09\x89\x00\x00\x65\x89\x00\x00\xc1\x89\x00\x00\x1d\x8a\x00\x00\x79\x8a\x00\x00\xd5\x8a\x00\x00\x31\x8b\x00\x00\x8d\x8b\x00\x00\xe9\x8b\x00\x00\x45\x8c\x00\x00\xa1\x8c\x00\x00\xfd\x8c\x00\x00\x59\x8d\x00\x00\xb5\x8d\x00\x00\x11\x8e\x00\x00\x6d\x8e\x00\x00\xc9\x8e\x00\x00\x25\x8f\x00\x00\x81\x8f\x00\x00\xdd\x8f\x00\x00\x39\x90\x00\x00\x95\x90\x00\x00\xf1\x90\x00\x00\x4d\x91\x00\x00\xa9\x91\x00\x00\x05\x92\x00\x00\x61\x92\x00\x00\xbd\x92\x00\x00\x19\x93\x00\x00\x75\x93\x00\x00\xd1\x93\x00\x00\x2d\x94\x00\x00\x89\x94\x00\x00\xe5\x94\x00\x00\x41\x95\x00\x00\x9d\x95\x00\x00\xf9\x95\x00\x00\x55\x96\x00\x00\xb1\x96\x00\x00\x0d\x97\x00\x00\x69\x97\x00\x00\xc5\x97\x00\x00\x21\x98\x00\x00\x7d\x98\x00\x00\xd9\x98\x00\x00\x35\x99\x00\x00\x91\x99\x00\x00\xed\x99\x00\x00\x49\x9a\x00\x00\xa5\x9a\x00\x00\x01\x9b\x00\x00\x5d\x9b\x00\x00\xb9\x9b\x00\x00\x15\x9c\x00\x00\x71\x9c\x00\x00"#+alex_base = AlexA# "\xf7\xff\xff\xff\x6c\x00\x00\x00\xc8\x00\x00\x00\x3c\x01\x00\x00\x40\x01\x00\x00\x44\x01\x00\x00\x4b\x01\x00\x00\x41\x02\x00\x00\x88\xff\xff\xff\xd9\xff\xff\xff\xda\xff\xff\xff\x99\xff\xff\xff\x20\x03\x00\x00\x5e\x00\x00\x00\x7c\x03\x00\x00\x7b\x03\x00\x00\xfb\x03\x00\x00\xa4\xff\xff\xff\x7b\x04\x00\x00\xfb\x04\x00\x00\x7b\x05\x00\x00\xfb\x05\x00\x00\x7b\x06\x00\x00\xfb\x06\x00\x00\x9b\xff\xff\xff\xa8\xff\xff\xff\x91\xff\xff\xff\xa9\xff\xff\xff\x9f\xff\xff\xff\xab\xff\xff\xff\x00\x00\x00\x00\x6c\x07\x00\x00\x00\x00\x00\x00\xdd\x07\x00\x00\xac\xff\xff\xff\x00\x00\x00\x00\x4e\x08\x00\x00\x00\x00\x00\x00\xbf\x08\x00\x00\x00\x00\x00\x00\x00\x09\x00\x00\x00\x00\x00\x00\x41\x09\x00\x00\x00\x00\x00\x00\x82\x09\x00\x00\x00\x00\x00\x00\xc3\x09\x00\x00\xa2\x0a\x00\x00\x21\x0b\x00\x00\xe1\x0a\x00\x00\x00\x00\x00\x00\xe1\x0b\x00\x00\xa1\x0b\x00\x00\x00\x00\x00\x00\xa1\x0c\x00\x00\x61\x0c\x00\x00\x00\x00\x00\x00\x61\x0d\x00\x00\x07\x00\x00\x00\xd7\x0d\x00\x00\x39\x0d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xcd\x0e\x00\x00\xc3\x0f\x00\x00\xb9\x10\x00\x00\xaf\x11\x00\x00\xa5\x12\x00\x00\x9b\x13\x00\x00\x91\x14\x00\x00\x87\x15\x00\x00\x7d\x16\x00\x00\x73\x17\x00\x00\x69\x18\x00\x00\x5f\x19\x00\x00\x55\x1a\x00\x00\x4b\x1b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x93\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x42\x1c\x00\x00\x39\x1d\x00\x00\x30\x1e\x00\x00\x27\x1f\x00\x00\x1e\x20\x00\x00\x15\x21\x00\x00\x0c\x22\x00\x00\x03\x23\x00\x00\xfa\x23\x00\x00\xf1\x24\x00\x00\xe8\x25\x00\x00\xdf\x26\x00\x00\xd6\x27\x00\x00\xcd\x28\x00\x00\xc4\x29\x00\x00\xbb\x2a\x00\x00\xb2\x2b\x00\x00\xa9\x2c\x00\x00\xa0\x2d\x00\x00\x97\x2e\x00\x00\x8e\x2f\x00\x00\x85\x30\x00\x00\x7c\x31\x00\x00\x73\x32\x00\x00\x6a\x33\x00\x00\x61\x34\x00\x00\x58\x35\x00\x00\x4f\x36\x00\x00\x46\x37\x00\x00\x3d\x38\x00\x00\x34\x39\x00\x00\x2b\x3a\x00\x00\x22\x3b\x00\x00\x19\x3c\x00\x00\x10\x3d\x00\x00\x07\x3e\x00\x00\xfe\x3e\x00\x00\xf5\x3f\x00\x00\xec\x40\x00\x00\xe3\x41\x00\x00\xda\x42\x00\x00\xd1\x43\x00\x00\xc8\x44\x00\x00\xbf\x45\x00\x00\xb6\x46\x00\x00\xad\x47\x00\x00\xa4\x48\x00\x00\x9b\x49\x00\x00\x92\x4a\x00\x00\x89\x4b\x00\x00\x80\x4c\x00\x00\x77\x4d\x00\x00\x6e\x4e\x00\x00\x65\x4f\x00\x00\x5c\x50\x00\x00\x53\x51\x00\x00\x4a\x52\x00\x00\x41\x53\x00\x00\x38\x54\x00\x00\x2f\x55\x00\x00\x26\x56\x00\x00\x1d\x57\x00\x00\x14\x58\x00\x00\x0b\x59\x00\x00\x02\x5a\x00\x00\xf9\x5a\x00\x00\xf0\x5b\x00\x00\xe7\x5c\x00\x00\xde\x5d\x00\x00\xd5\x5e\x00\x00\xcc\x5f\x00\x00\xc3\x60\x00\x00\xba\x61\x00\x00\xb1\x62\x00\x00\xa8\x63\x00\x00\x9f\x64\x00\x00\x96\x65\x00\x00\x8d\x66\x00\x00\x84\x67\x00\x00\x7b\x68\x00\x00\x72\x69\x00\x00\x69\x6a\x00\x00\x60\x6b\x00\x00\x57\x6c\x00\x00\x4e\x6d\x00\x00\x45\x6e\x00\x00\x3c\x6f\x00\x00\x33\x70\x00\x00\x2a\x71\x00\x00\xef\xff\xff\xff\x00\x00\x00\x00\x20\x72\x00\x00\x20\x73\x00\x00\x16\x74\x00\x00\x16\x75\x00\x00\x16\x76\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc4\x0e\x00\x00\xad\x0f\x00\x00\xa3\x10\x00\x00\x99\x11\x00\x00\x85\x13\x00\x00\x7b\x14\x00\x00\x71\x15\x00\x00\x67\x16\x00\x00\x5d\x17\x00\x00\x3f\x1a\x00\x00\x39\x1c\x00\x00\x30\x1d\x00\x00\x27\x1e\x00\x00\x1e\x1f\x00\x00\x15\x20\x00\x00\x0c\x21\x00\x00\xfa\x22\x00\x00\xf1\x23\x00\x00\xe8\x24\x00\x00\xdf\x25\x00\x00\xd6\x26\x00\x00\xcd\x27\x00\x00\xc4\x28\x00\x00\xbb\x29\x00\x00\xbc\x2a\x00\x00\xa9\x2b\x00\x00\xa1\x2d\x00\x00\x6b\x33\x00\x00\x08\x3e\x00\x00\xc9\x44\x00\x00\x5d\x50\x00\x00\x1d\x56\x00\x00\x0a\x72\x00\x00\xf5\x76\x00\x00\x51\x77\x00\x00\xad\x77\x00\x00\x09\x78\x00\x00\x65\x78\x00\x00\x00\x00\x00\x00\xc1\x78\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe5\xff\xff\xff\xe6\xff\xff\xff\x00\x00\x00\x00\x1d\x79\x00\x00\x79\x79\x00\x00\x41\x36\x00\x00\xd5\x79\x00\x00\x31\x7a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8d\x7a\x00\x00\x33\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x31\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe9\x7a\x00\x00\x45\x7b\x00\x00\xa1\x7b\x00\x00\xfd\x7b\x00\x00\x59\x7c\x00\x00\xb5\x7c\x00\x00\x11\x7d\x00\x00\x6d\x7d\x00\x00\xc9\x7d\x00\x00\x25\x7e\x00\x00\x81\x7e\x00\x00\xdd\x7e\x00\x00\x39\x7f\x00\x00\x95\x7f\x00\x00\xf1\x7f\x00\x00\x4d\x80\x00\x00\xa9\x80\x00\x00\x05\x81\x00\x00\x61\x81\x00\x00\xbd\x81\x00\x00\x19\x82\x00\x00\x75\x82\x00\x00\xd1\x82\x00\x00\x2d\x83\x00\x00\x89\x83\x00\x00\xe5\x83\x00\x00\x41\x84\x00\x00\x9d\x84\x00\x00\xf9\x84\x00\x00\x55\x85\x00\x00\xb1\x85\x00\x00\x0d\x86\x00\x00\x69\x86\x00\x00\xc5\x86\x00\x00\x21\x87\x00\x00\x7d\x87\x00\x00\xd9\x87\x00\x00\x35\x88\x00\x00\x91\x88\x00\x00\xed\x88\x00\x00\x49\x89\x00\x00\xa5\x89\x00\x00\x01\x8a\x00\x00\x5d\x8a\x00\x00\xb9\x8a\x00\x00\x15\x8b\x00\x00\x71\x8b\x00\x00\xcd\x8b\x00\x00\x29\x8c\x00\x00\x85\x8c\x00\x00\xe1\x8c\x00\x00\x3d\x8d\x00\x00\x99\x8d\x00\x00\xf5\x8d\x00\x00\x51\x8e\x00\x00\xad\x8e\x00\x00\x09\x8f\x00\x00\x65\x8f\x00\x00\xc1\x8f\x00\x00\x1d\x90\x00\x00\x79\x90\x00\x00\xd5\x90\x00\x00\x31\x91\x00\x00\x8d\x91\x00\x00\xe9\x91\x00\x00\x45\x92\x00\x00\xa1\x92\x00\x00\xfd\x92\x00\x00\x59\x93\x00\x00\xb5\x93\x00\x00\x11\x94\x00\x00\x6d\x94\x00\x00\xc9\x94\x00\x00\x25\x95\x00\x00\x81\x95\x00\x00\xdd\x95\x00\x00\x39\x96\x00\x00\x95\x96\x00\x00\xf1\x96\x00\x00\x4d\x97\x00\x00\xa9\x97\x00\x00\x05\x98\x00\x00\x61\x98\x00\x00\xbd\x98\x00\x00\x19\x99\x00\x00\x75\x99\x00\x00\xd1\x99\x00\x00\x2d\x9a\x00\x00\x89\x9a\x00\x00\xe5\x9a\x00\x00\x41\x9b\x00\x00\x9d\x9b\x00\x00\xf9\x9b\x00\x00\x55\x9c\x00\x00\xb1\x9c\x00\x00\x0d\x9d\x00\x00\x69\x9d\x00\x00\xc5\x9d\x00\x00\x21\x9e\x00\x00\x7d\x9e\x00\x00\xd9\x9e\x00\x00\x35\x9f\x00\x00\x91\x9f\x00\x00\xed\x9f\x00\x00\x49\xa0\x00\x00\xa5\xa0\x00\x00\x01\xa1\x00\x00\x5d\xa1\x00\x00\xb9\xa1\x00\x00\x15\xa2\x00\x00\x71\xa2\x00\x00\xcd\xa2\x00\x00\x29\xa3\x00\x00\x85\xa3\x00\x00\xe1\xa3\x00\x00\x3d\xa4\x00\x00\x99\xa4\x00\x00\xf5\xa4\x00\x00\x51\xa5\x00\x00\xad\xa5\x00\x00\x09\xa6\x00\x00\x65\xa6\x00\x00\xc1\xa6\x00\x00\x1d\xa7\x00\x00\x79\xa7\x00\x00\xd5\xa7\x00\x00\x31\xa8\x00\x00\x8d\xa8\x00\x00\xe9\xa8\x00\x00\x45\xa9\x00\x00\xa1\xa9\x00\x00\xfd\xa9\x00\x00\x59\xaa\x00\x00\xb5\xaa\x00\x00\x11\xab\x00\x00\x6d\xab\x00\x00\xc9\xab\x00\x00\x25\xac\x00\x00\x81\xac\x00\x00\xdd\xac\x00\x00\x39\xad\x00\x00\x95\xad\x00\x00\xf1\xad\x00\x00\x4d\xae\x00\x00\xa9\xae\x00\x00\x05\xaf\x00\x00\x61\xaf\x00\x00\xbd\xaf\x00\x00\x19\xb0\x00\x00\x75\xb0\x00\x00\xd1\xb0\x00\x00\x2d\xb1\x00\x00\x89\xb1\x00\x00\xe5\xb1\x00\x00\x41\xb2\x00\x00\x9d\xb2\x00\x00\xf9\xb2\x00\x00\x55\xb3\x00\x00\xb1\xb3\x00\x00\x0d\xb4\x00\x00\x69\xb4\x00\x00\xc5\xb4\x00\x00\x21\xb5\x00\x00\x7d\xb5\x00\x00\xd9\xb5\x00\x00\x35\xb6\x00\x00\x91\xb6\x00\x00\xed\xb6\x00\x00"# alex_table :: AlexAddr-alex_table = AlexA# "\x00\x00\x9e\x00\x4f\x00\x4f\x00\x4f\x00\x4e\x00\x98\x00\x99\x00\xc4\x00\x08\x00\x22\x00\x18\x00\x19\x00\x1d\x00\x1c\x00\x1a\x00\x11\x00\x3e\x00\x51\x00\xc7\x00\xc8\x00\x00\x00\x00\x00\x4f\x00\x2e\x01\xd9\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\xd8\x00\xd0\x00\xd1\x00\x2e\x01\x2e\x01\x2e\x01\xe7\x00\xc9\x00\x2e\x01\xde\x00\xdd\x00\xdd\x00\xdd\x00\xdd\x00\xdd\x00\xdd\x00\xdd\x00\xdd\x00\xdd\x00\xcb\x00\xca\x00\x2e\x01\xcc\x00\x2e\x01\xce\x00\xd4\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x43\x01\x2e\x01\x2e\x01\xfd\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\xd3\x00\x2e\x01\x2e\x01\xcd\x00\x2e\x01\x2f\x01\x2e\x01\x22\x01\x0a\x01\x2e\x01\x18\x01\x2e\x01\x28\x01\x6d\x01\x2e\x01\x2e\x01\xf7\x00\x21\x01\x2e\x01\x45\x01\x2a\x01\x1b\x01\x23\x01\x27\x01\x2e\x01\x1d\x01\x2e\x01\x04\x01\x2e\x01\x2e\x01\x2e\x01\xd6\x00\xcf\x00\xd7\x00\x2e\x01\x9f\x00\x4f\x00\x4f\x00\x4f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x4f\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x0a\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x4f\x00\x4f\x00\x4f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9e\x00\x4f\x00\x4f\x00\x4f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2e\x01\x00\x00\x2e\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x09\x00\x4f\x00\x2e\x01\xd9\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\xd8\x00\xd0\x00\xd1\x00\x2e\x01\x2e\x01\x2e\x01\xe7\x00\xc9\x00\x2e\x01\xde\x00\xdd\x00\xdd\x00\xdd\x00\xdd\x00\xdd\x00\xdd\x00\xdd\x00\xdd\x00\xdd\x00\xcb\x00\xca\x00\x2e\x01\xcc\x00\x2e\x01\xce\x00\xd4\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x43\x01\x2e\x01\x2e\x01\xfd\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\xd3\x00\x2e\x01\x2e\x01\xcd\x00\x2e\x01\x2f\x01\x2e\x01\x22\x01\x0a\x01\x2e\x01\x18\x01\x2e\x01\x28\x01\x6d\x01\x2e\x01\x2e\x01\xf7\x00\x21\x01\x2e\x01\x45\x01\x2a\x01\x1b\x01\x23\x01\x27\x01\x2e\x01\x1d\x01\x2e\x01\x04\x01\x2e\x01\x2e\x01\x2e\x01\xd6\x00\xcf\x00\xd7\x00\x2e\x01\x4f\x00\x4f\x00\x4f\x00\x9e\x00\x4f\x00\x4f\x00\x4f\x00\xa0\x00\x4f\x00\x4f\x00\x4f\x00\xc6\x00\x00\x00\xff\xff\x50\x00\x50\x00\x50\x00\x50\x00\x00\x00\x00\x00\x00\x00\x4f\x00\x00\x00\x97\x00\x00\x00\x4f\x00\x00\x00\x00\x00\x00\x00\x4f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0a\x00\x00\x00\x50\x00\x00\x00\x0a\x00\x6c\x00\x00\x00\x00\x00\x0a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7d\x00\x7f\x00\x00\x00\x8d\x00\x00\x00\x00\x00\x00\x00\x7b\x00\x00\x00\x00\x00\x75\x00\x00\x00\x00\x00\x81\x00\x00\x00\x00\x00\x00\x00\x82\x00\x00\x00\x1b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd5\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0b\x00\x00\x00\x00\x00\x09\x00\x00\x00\x00\x00\x00\x00\x09\x00\x00\x00\x00\x00\x00\x00\x09\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6b\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\x33\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x34\x00\x12\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x2a\x00\x16\x00\x20\x00\x20\x00\x20\x00\x21\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x4d\x00\x49\x00\x49\x00\x49\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x49\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2e\x01\x00\x00\x2e\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x36\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x37\x00\x10\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2c\x00\x15\x00\x23\x00\x23\x00\x23\x00\x24\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x00\x00\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x0d\x00\x2e\x01\x2e\x01\x0c\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x00\x00\x2e\x01\x39\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x36\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x33\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\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\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x0f\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x10\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x12\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x13\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x28\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\x2a\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x2e\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\x31\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\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\x37\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\x3c\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\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x00\x00\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\xe5\x00\xe3\x00\xe3\x00\xe3\x00\xe3\x00\xe3\x00\xe3\x00\xe3\x00\xe3\x00\xe3\x00\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x0d\x00\x2e\x01\x2e\x01\x0c\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x00\x00\x2e\x01\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x39\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3c\x00\x0f\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2e\x00\x14\x00\x25\x00\x25\x00\x25\x00\x26\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\x3f\x00\x3f\x00\x3f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x3f\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x0e\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x00\x00\x2e\x01\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\x36\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x37\x00\x10\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2c\x00\x15\x00\x23\x00\x23\x00\x23\x00\x24\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x0e\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\xfa\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x00\x00\x2e\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\x3f\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\x36\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x37\x00\x10\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2c\x00\x15\x00\x23\x00\x23\x00\x23\x00\x24\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x0e\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x40\x00\x2e\x01\x00\x00\x2e\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x36\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x37\x00\x10\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2c\x00\x15\x00\x23\x00\x23\x00\x23\x00\x24\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x0e\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x00\x00\x2e\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4c\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x36\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x37\x00\x10\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2c\x00\x15\x00\x23\x00\x23\x00\x23\x00\x24\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x42\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x36\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x37\x00\x10\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2c\x00\x15\x00\x23\x00\x23\x00\x23\x00\x24\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x0e\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x00\x00\x2e\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\x43\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\x36\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x37\x00\x10\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2c\x00\x15\x00\x23\x00\x23\x00\x23\x00\x24\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x0e\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x00\x00\x2e\x01\x4b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x36\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x37\x00\x10\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2c\x00\x15\x00\x23\x00\x23\x00\x23\x00\x24\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x0e\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x45\x00\x2e\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x36\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x37\x00\x10\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2c\x00\x15\x00\x23\x00\x23\x00\x23\x00\x24\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x0e\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x46\x00\x2e\x01\x00\x00\x2e\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x36\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x37\x00\x10\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2c\x00\x15\x00\x23\x00\x23\x00\x23\x00\x24\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x0e\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x00\x00\x2e\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x36\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x37\x00\x10\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2c\x00\x15\x00\x23\x00\x23\x00\x23\x00\x24\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x49\x00\x49\x00\x49\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x49\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x36\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x37\x00\x10\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2c\x00\x15\x00\x23\x00\x23\x00\x23\x00\x24\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x47\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x36\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x37\x00\x10\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2c\x00\x15\x00\x23\x00\x23\x00\x23\x00\x24\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x0e\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x00\x00\x2e\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x44\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x36\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x37\x00\x10\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2c\x00\x15\x00\x23\x00\x23\x00\x23\x00\x24\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x36\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x37\x00\x10\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2c\x00\x15\x00\x23\x00\x23\x00\x23\x00\x24\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\xff\xff\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x0e\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x00\x00\x2e\x01\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\x33\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x34\x00\x12\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x2a\x00\x16\x00\x20\x00\x20\x00\x20\x00\x21\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\xff\xff\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x0e\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x00\x00\x2e\x01\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\x33\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x34\x00\x12\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x2a\x00\x16\x00\x20\x00\x20\x00\x20\x00\x21\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\xff\xff\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x0e\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x00\x00\x2e\x01\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\x33\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x34\x00\x12\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x2a\x00\x16\x00\x20\x00\x20\x00\x20\x00\x21\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\xff\xff\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x0e\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x00\x00\x2e\x01\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\x33\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x34\x00\x12\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x2a\x00\x16\x00\x20\x00\x20\x00\x20\x00\x21\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\xff\xff\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x0e\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x00\x00\x2e\x01\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\x33\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x34\x00\x12\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x2a\x00\x16\x00\x20\x00\x20\x00\x20\x00\x21\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\xff\xff\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x0e\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\xb1\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\xb2\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x00\x00\x2e\x01\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\x33\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x34\x00\x12\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x2a\x00\x16\x00\x20\x00\x20\x00\x20\x00\x21\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x90\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x33\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x34\x00\x12\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x2a\x00\x16\x00\x20\x00\x20\x00\x20\x00\x21\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\xff\xff\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x0e\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x00\x00\x2e\x01\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\x33\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x34\x00\x12\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x2a\x00\x16\x00\x20\x00\x20\x00\x20\x00\x21\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\xff\xff\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x0e\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x00\x00\x2e\x01\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\x33\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x34\x00\x12\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x2a\x00\x16\x00\x20\x00\x20\x00\x20\x00\x21\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\xff\xff\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x0e\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x00\x00\x2e\x01\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\x33\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x34\x00\x12\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x2a\x00\x16\x00\x20\x00\x20\x00\x20\x00\x21\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\xff\xff\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x0e\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x00\x00\x2e\x01\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\x33\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x34\x00\x12\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x2a\x00\x16\x00\x20\x00\x20\x00\x20\x00\x21\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\xff\xff\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x0e\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x00\x00\x2e\x01\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\x33\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x34\x00\x12\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x2a\x00\x16\x00\x20\x00\x20\x00\x20\x00\x21\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\xff\xff\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x0e\x00\x2e\x01\xbb\x00\xba\x00\xba\x00\xba\x00\xba\x00\xba\x00\xba\x00\xba\x00\xba\x00\xba\x00\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x00\x00\x2e\x01\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\x33\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x34\x00\x12\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x2a\x00\x16\x00\x20\x00\x20\x00\x20\x00\x21\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\xff\xff\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x0e\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x00\x00\x2e\x01\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\x33\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x34\x00\x12\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x2a\x00\x16\x00\x20\x00\x20\x00\x20\x00\x21\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x2e\x01\x52\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x0e\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x00\x00\x2e\x01\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x33\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x34\x00\x12\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x2a\x00\x16\x00\x20\x00\x20\x00\x20\x00\x21\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\xff\xff\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x0e\x00\x2e\x01\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x00\x00\x2e\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x53\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\x33\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x34\x00\x12\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x2a\x00\x16\x00\x20\x00\x20\x00\x20\x00\x21\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x54\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x33\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x34\x00\x12\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x2a\x00\x16\x00\x20\x00\x20\x00\x20\x00\x21\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x0e\x00\x2e\x01\xba\x00\xba\x00\xba\x00\xba\x00\xba\x00\xba\x00\xba\x00\xba\x00\xba\x00\xba\x00\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x56\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x00\x00\x2e\x01\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x33\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x34\x00\x12\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x2a\x00\x16\x00\x20\x00\x20\x00\x20\x00\x21\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x57\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x33\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x34\x00\x12\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x2a\x00\x16\x00\x20\x00\x20\x00\x20\x00\x21\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x33\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x34\x00\x12\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x2a\x00\x16\x00\x20\x00\x20\x00\x20\x00\x21\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x33\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x34\x00\x12\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x2a\x00\x16\x00\x20\x00\x20\x00\x20\x00\x21\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x33\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x34\x00\x12\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x2a\x00\x16\x00\x20\x00\x20\x00\x20\x00\x21\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x33\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x34\x00\x12\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x2a\x00\x16\x00\x20\x00\x20\x00\x20\x00\x21\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x0e\x00\x2e\x01\xba\x00\xba\x00\xba\x00\xba\x00\xba\x00\xba\x00\xba\x00\xba\x00\xba\x00\xba\x00\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x5e\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x60\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x00\x00\x2e\x01\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x33\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x34\x00\x12\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x2a\x00\x16\x00\x20\x00\x20\x00\x20\x00\x21\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x33\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x34\x00\x12\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x2a\x00\x16\x00\x20\x00\x20\x00\x20\x00\x21\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\xff\xff\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x60\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x00\x00\x2e\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x33\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x34\x00\x12\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x2a\x00\x16\x00\x20\x00\x20\x00\x20\x00\x21\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x61\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x33\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x34\x00\x12\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x2a\x00\x16\x00\x20\x00\x20\x00\x20\x00\x21\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x96\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x33\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x34\x00\x12\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x2a\x00\x16\x00\x20\x00\x20\x00\x20\x00\x21\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x95\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x33\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x34\x00\x12\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x2a\x00\x16\x00\x20\x00\x20\x00\x20\x00\x21\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x65\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x33\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x34\x00\x12\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x2a\x00\x16\x00\x20\x00\x20\x00\x20\x00\x21\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x33\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x34\x00\x12\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x2a\x00\x16\x00\x20\x00\x20\x00\x20\x00\x21\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x93\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x33\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x34\x00\x12\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x2a\x00\x16\x00\x20\x00\x20\x00\x20\x00\x21\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x0e\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x92\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x00\x00\x2e\x01\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x33\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x34\x00\x12\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x2a\x00\x16\x00\x20\x00\x20\x00\x20\x00\x21\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x91\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x33\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x34\x00\x12\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x2a\x00\x16\x00\x20\x00\x20\x00\x20\x00\x21\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x33\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x34\x00\x12\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x2a\x00\x16\x00\x20\x00\x20\x00\x20\x00\x21\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x33\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x34\x00\x12\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x2a\x00\x16\x00\x20\x00\x20\x00\x20\x00\x21\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x71\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x33\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x34\x00\x12\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x2a\x00\x16\x00\x20\x00\x20\x00\x20\x00\x21\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x33\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x34\x00\x12\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x2a\x00\x16\x00\x20\x00\x20\x00\x20\x00\x21\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x0e\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x88\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x11\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x13\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x00\x00\x2e\x01\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x33\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x34\x00\x12\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x2a\x00\x16\x00\x20\x00\x20\x00\x20\x00\x21\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x87\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x33\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x34\x00\x12\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x2a\x00\x16\x00\x20\x00\x20\x00\x20\x00\x21\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x86\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x33\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x34\x00\x12\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x2a\x00\x16\x00\x20\x00\x20\x00\x20\x00\x21\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x85\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x33\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x34\x00\x12\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x2a\x00\x16\x00\x20\x00\x20\x00\x20\x00\x21\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x79\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x33\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x34\x00\x12\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x2a\x00\x16\x00\x20\x00\x20\x00\x20\x00\x21\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x33\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x34\x00\x12\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x2a\x00\x16\x00\x20\x00\x20\x00\x20\x00\x21\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x83\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x33\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x34\x00\x12\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x2a\x00\x16\x00\x20\x00\x20\x00\x20\x00\x21\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x33\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x34\x00\x12\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x2a\x00\x16\x00\x20\x00\x20\x00\x20\x00\x21\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\xff\xff\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x0e\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x00\x00\x2e\x01\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\x33\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x34\x00\x12\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x2a\x00\x16\x00\x20\x00\x20\x00\x20\x00\x21\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x84\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x33\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x34\x00\x12\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x2a\x00\x16\x00\x20\x00\x20\x00\x20\x00\x21\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x78\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x33\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x34\x00\x12\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x2a\x00\x16\x00\x20\x00\x20\x00\x20\x00\x21\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x77\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x33\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x34\x00\x12\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x2a\x00\x16\x00\x20\x00\x20\x00\x20\x00\x21\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x76\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x33\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x34\x00\x12\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x2a\x00\x16\x00\x20\x00\x20\x00\x20\x00\x21\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x74\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x33\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x34\x00\x12\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x2a\x00\x16\x00\x20\x00\x20\x00\x20\x00\x21\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x33\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x34\x00\x12\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x2a\x00\x16\x00\x20\x00\x20\x00\x20\x00\x21\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x33\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x34\x00\x12\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x2a\x00\x16\x00\x20\x00\x20\x00\x20\x00\x21\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x70\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x33\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x34\x00\x12\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x2a\x00\x16\x00\x20\x00\x20\x00\x20\x00\x21\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x33\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x34\x00\x12\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x2a\x00\x16\x00\x20\x00\x20\x00\x20\x00\x21\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x33\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x34\x00\x12\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x2a\x00\x16\x00\x20\x00\x20\x00\x20\x00\x21\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x33\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x34\x00\x12\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x2a\x00\x16\x00\x20\x00\x20\x00\x20\x00\x21\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x33\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x34\x00\x12\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x2a\x00\x16\x00\x20\x00\x20\x00\x20\x00\x21\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x69\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x33\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x34\x00\x12\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x2a\x00\x16\x00\x20\x00\x20\x00\x20\x00\x21\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x68\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x33\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x34\x00\x12\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x2a\x00\x16\x00\x20\x00\x20\x00\x20\x00\x21\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x94\x00\x7c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x33\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x34\x00\x12\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x2a\x00\x16\x00\x20\x00\x20\x00\x20\x00\x21\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x72\x00\x89\x00\x00\x00\x00\x00\x00\x00\x00\x00\x66\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x73\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x33\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x34\x00\x12\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x2a\x00\x16\x00\x20\x00\x20\x00\x20\x00\x21\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x64\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x33\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x34\x00\x12\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x2a\x00\x16\x00\x20\x00\x20\x00\x20\x00\x21\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x63\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x33\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x34\x00\x12\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x2a\x00\x16\x00\x20\x00\x20\x00\x20\x00\x21\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x62\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x33\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x34\x00\x12\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x2a\x00\x16\x00\x20\x00\x20\x00\x20\x00\x21\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x33\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x34\x00\x12\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x2a\x00\x16\x00\x20\x00\x20\x00\x20\x00\x21\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x58\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x33\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x34\x00\x12\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x2a\x00\x16\x00\x20\x00\x20\x00\x20\x00\x21\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x55\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x33\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x34\x00\x12\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x2a\x00\x16\x00\x20\x00\x20\x00\x20\x00\x21\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\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x0e\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x00\x00\x2e\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x31\x00\x13\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x28\x00\x17\x00\x1e\x00\x1e\x00\x1e\x00\x1f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x99\x00\x99\x00\x99\x00\x99\x00\x99\x00\x99\x00\x99\x00\x99\x00\x99\x00\x99\x00\xff\xff\x99\x00\x99\x00\x99\x00\x99\x00\x99\x00\x99\x00\x99\x00\x99\x00\x99\x00\x99\x00\x99\x00\x99\x00\x99\x00\x99\x00\x99\x00\x99\x00\x99\x00\x99\x00\x99\x00\x99\x00\x99\x00\x99\x00\x00\x00\x99\x00\x00\x00\x00\x00\x00\x00\x00\x00\x99\x00\x99\x00\x99\x00\x00\x00\x00\x00\x00\x00\x00\x00\x99\x00\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x99\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9b\x00\x00\x00\x00\x00\x9c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00\x00\x00\x99\x00\x00\x00\x99\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\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\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x31\x00\x13\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x28\x00\x17\x00\x1e\x00\x1e\x00\x1e\x00\x1f\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9d\x00\x00\x00\x9d\x00\x9d\x00\x9d\x00\x9d\x00\x9d\x00\x00\x00\x00\x00\x9d\x00\x9d\x00\x9d\x00\x9d\x00\x00\x00\x9d\x00\x9d\x00\x9d\x00\x9d\x00\x9d\x00\x9d\x00\x9d\x00\x9d\x00\x9d\x00\x9d\x00\x9d\x00\x9d\x00\x00\x00\x9d\x00\x9d\x00\x9d\x00\x9d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9d\x00\x9d\x00\x9d\x00\x9d\x00\x00\x00\x9d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9d\x00\x00\x00\x9d\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\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\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x31\x00\x13\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x28\x00\x17\x00\x1e\x00\x1e\x00\x1e\x00\x1f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x99\x00\x99\x00\x99\x00\x99\x00\x99\x00\x99\x00\x99\x00\x99\x00\x99\x00\x99\x00\xff\xff\x99\x00\x99\x00\x99\x00\x99\x00\x99\x00\x99\x00\x99\x00\x99\x00\x99\x00\x99\x00\x99\x00\x99\x00\x99\x00\x99\x00\x99\x00\x99\x00\x99\x00\x99\x00\x99\x00\x99\x00\x99\x00\x99\x00\x00\x00\x99\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x99\x00\x99\x00\x00\x00\x00\x00\x00\x00\x00\x00\x99\x00\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x99\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00\x00\x00\x99\x00\x00\x00\x99\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\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\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x31\x00\x13\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x28\x00\x17\x00\x1e\x00\x1e\x00\x1e\x00\x1f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x99\x00\x99\x00\x99\x00\x99\x00\x99\x00\x99\x00\x99\x00\x99\x00\x99\x00\x99\x00\xff\xff\x99\x00\x99\x00\x99\x00\x99\x00\x99\x00\x99\x00\x99\x00\x99\x00\x99\x00\x99\x00\x99\x00\x99\x00\x99\x00\x99\x00\x99\x00\x99\x00\x99\x00\x99\x00\x99\x00\x99\x00\x99\x00\x99\x00\x00\x00\x99\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x99\x00\x99\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x99\x00\x00\x00\x00\x00\x00\x00\x00\x00\x99\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00\x00\x00\x99\x00\x00\x00\x99\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\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\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x31\x00\x13\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x28\x00\x17\x00\x1e\x00\x1e\x00\x1e\x00\x1f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x0e\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x0e\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x0e\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x0e\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x0e\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x0e\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x0e\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x0e\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x0e\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x0e\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x00\x00\x2e\x01\x5c\x01\x2e\x01\x5c\x01\x2f\x00\x2e\x01\xdc\x00\xdb\x00\xdb\x00\xdb\x00\xdb\x00\xdb\x00\xdb\x00\xdb\x00\xdb\x00\xdb\x00\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\xdb\x00\xdb\x00\xdb\x00\xdb\x00\xda\x00\xdb\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\xdb\x00\xdb\x00\xdb\x00\xdb\x00\xda\x00\xdb\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2f\x00\x2e\x01\xdb\x00\xdb\x00\xdb\x00\xdb\x00\xdb\x00\xdb\x00\xdb\x00\xdb\x00\xdb\x00\xdb\x00\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\xdb\x00\xdb\x00\xdb\x00\xdb\x00\xda\x00\xdb\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\xdb\x00\xdb\x00\xdb\x00\xdb\x00\xda\x00\xdb\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2f\x00\x2e\x01\xdb\x00\xdb\x00\xdb\x00\xdb\x00\xdb\x00\xdb\x00\xdb\x00\xdb\x00\xdb\x00\xdb\x00\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\xdb\x00\xdb\x00\xdb\x00\xdb\x00\xda\x00\xdb\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\xdb\x00\xdb\x00\xdb\x00\xdb\x00\xda\x00\xdb\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x59\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2f\x00\x2e\x01\xdd\x00\xdd\x00\xdd\x00\xdd\x00\xdd\x00\xdd\x00\xdd\x00\xdd\x00\xdd\x00\xdd\x00\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x5b\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x5b\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2f\x00\x2e\x01\xdd\x00\xdd\x00\xdd\x00\xdd\x00\xdd\x00\xdd\x00\xdd\x00\xdd\x00\xdd\x00\xdd\x00\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x5b\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x5b\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x5d\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x00\x00\x2e\x01\x5c\x01\x2e\x01\x5c\x01\x0e\x00\x2e\x01\xe2\x00\xe0\x00\xe0\x00\xe0\x00\xe0\x00\xe0\x00\xe0\x00\xe0\x00\xe0\x00\xe0\x00\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\xe0\x00\xe0\x00\xe0\x00\xe0\x00\xdf\x00\xe0\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\xe0\x00\xe0\x00\xe0\x00\xe0\x00\xdf\x00\xe0\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x0e\x00\x2e\x01\xe0\x00\xe0\x00\xe0\x00\xe0\x00\xe0\x00\xe0\x00\xe0\x00\xe0\x00\xe0\x00\xe0\x00\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\xe0\x00\xe0\x00\xe0\x00\xe0\x00\xdf\x00\xe0\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\xe0\x00\xe0\x00\xe0\x00\xe0\x00\xdf\x00\xe0\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x0e\x00\x2e\x01\xe1\x00\xe1\x00\xe1\x00\xe1\x00\xe1\x00\xe1\x00\xe1\x00\xe1\x00\xe1\x00\xe1\x00\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\xe1\x00\xe1\x00\xe1\x00\xe1\x00\xe1\x00\xe1\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\xe1\x00\xe1\x00\xe1\x00\xe1\x00\xe1\x00\xe1\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x0e\x00\x2e\x01\xe0\x00\xe0\x00\xe0\x00\xe0\x00\xe0\x00\xe0\x00\xe0\x00\xe0\x00\xe0\x00\xe0\x00\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\xe0\x00\xe0\x00\xe0\x00\xe0\x00\xdf\x00\xe0\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\xe0\x00\xe0\x00\xe0\x00\xe0\x00\xdf\x00\xe0\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x59\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x0e\x00\x2e\x01\xe3\x00\xe3\x00\xe3\x00\xe3\x00\xe3\x00\xe3\x00\xe3\x00\xe3\x00\xe3\x00\xe3\x00\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x5b\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x5b\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x0e\x00\x2e\x01\xe4\x00\xe4\x00\xe4\x00\xe4\x00\xe4\x00\xe4\x00\xe4\x00\xe4\x00\xe4\x00\xe4\x00\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x0e\x00\x2e\x01\xe3\x00\xe3\x00\xe3\x00\xe3\x00\xe3\x00\xe3\x00\xe3\x00\xe3\x00\xe3\x00\xe3\x00\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x5b\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x5b\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x5a\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x0e\x00\x2e\x01\xe4\x00\xe4\x00\xe4\x00\xe4\x00\xe4\x00\xe4\x00\xe4\x00\xe4\x00\xe4\x00\xe4\x00\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x59\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x00\x00\x2e\x01\x2e\x01\x2e\x01\x9d\x00\x0e\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\xd2\x00\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x0e\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\xa3\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x0e\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\xa6\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x0e\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\xa7\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x0e\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\xa8\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x0e\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\xab\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x0e\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\xac\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x0e\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\xad\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x0e\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\xb5\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x0e\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\xbd\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x0e\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\xbe\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x0e\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\xbf\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x0e\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\xc1\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x0e\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\xc2\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x0e\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\xc3\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x0e\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\xc5\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x0e\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x6e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x0e\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x6a\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x0e\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x67\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x0e\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x66\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x0e\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x65\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x0e\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x64\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x0e\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x63\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x0e\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x62\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x0e\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x5f\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x0e\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x5e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x0e\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\xf6\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x0e\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x58\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x0e\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x57\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x0e\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x02\x01\x56\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x0e\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x55\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x0e\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x54\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x0e\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x53\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x0e\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x52\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x0e\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x51\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x0e\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x50\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x0e\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x4f\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x0e\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x4e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x0e\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\xfb\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x0e\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\xfc\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x0e\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x4d\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x0e\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x4c\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x0e\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\xff\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x0e\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x4b\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x0e\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x4a\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x0e\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x49\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x0e\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x48\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x0e\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x47\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x0e\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x46\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x0e\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x03\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x37\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x0e\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x0c\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x29\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x40\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x0e\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x44\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x0e\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x12\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x0e\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x14\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x0e\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x26\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x15\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x0e\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x17\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x0e\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x3f\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x0e\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x3e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x0e\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x3c\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x3a\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x0e\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x3b\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x0e\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x19\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x0e\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x1a\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x0e\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x38\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x0e\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x1c\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x0e\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x36\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x0e\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x35\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x0e\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x1e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x0e\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2c\x01\x2e\x01\x2e\x01\x25\x01\x2e\x01\x2e\x01\x34\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x0e\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x33\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x0e\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x32\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x0e\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x30\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x0e\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x0e\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2b\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x0e\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x31\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x0e\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x24\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x0e\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x1f\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x0e\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x39\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x0e\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x41\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x0e\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x16\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x0e\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x42\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x0e\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x10\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x0e\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x20\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x0f\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x0e\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x0e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x0e\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x0d\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x0e\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x0b\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2d\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x0e\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x09\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x0e\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x08\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x0e\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x07\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x0e\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x06\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x0e\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x05\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x0e\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x01\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x0e\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x0e\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\xfe\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x0e\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\xf9\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x0e\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\xf8\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x0e\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\xf5\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x0e\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\xf4\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x0e\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\xf3\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x0e\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\xf2\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x0e\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\xf1\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x0e\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\xf0\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x0e\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x61\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x0e\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\xef\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x0e\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x68\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x0e\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\xee\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x0e\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\xed\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x0e\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\xec\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x0e\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x69\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x0e\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\xeb\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x0e\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\xea\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x0e\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\xe9\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x0e\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x6b\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x0e\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x6c\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x0e\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\xe8\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x0e\x00\x2e\x01\xe1\x00\xe1\x00\xe1\x00\xe1\x00\xe1\x00\xe1\x00\xe1\x00\xe1\x00\xe1\x00\xe1\x00\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\xe1\x00\xe1\x00\xe1\x00\xe1\x00\xe1\x00\xe1\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\xe1\x00\xe1\x00\xe1\x00\xe1\x00\xe1\x00\xe1\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x0e\x00\x2e\x01\xe0\x00\xe0\x00\xe0\x00\xe0\x00\xe0\x00\xe0\x00\xe0\x00\xe0\x00\xe0\x00\xe0\x00\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\xe0\x00\xe0\x00\xe0\x00\xe0\x00\xe0\x00\xe0\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\xe0\x00\xe0\x00\xe0\x00\xe0\x00\xe0\x00\xe0\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x00\x00\x2e\x01\x5c\x01\x2e\x01\x5c\x01\x0e\x00\x2e\x01\xe6\x00\xe4\x00\xe4\x00\xe4\x00\xe4\x00\xe4\x00\xe4\x00\xe4\x00\xe4\x00\xe4\x00\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x0e\x00\x2e\x01\xe6\x00\xe4\x00\xe4\x00\xe4\x00\xe4\x00\xe4\x00\xe4\x00\xe4\x00\xe4\x00\xe4\x00\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x0e\x00\x2e\x01\xdb\x00\xdb\x00\xdb\x00\xdb\x00\xdb\x00\xdb\x00\xdb\x00\xdb\x00\xdb\x00\xdb\x00\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\xdb\x00\xdb\x00\xdb\x00\xdb\x00\xdb\x00\xdb\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\xdb\x00\xdb\x00\xdb\x00\xdb\x00\xdb\x00\xdb\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x0e\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\xc0\x00\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x0e\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\xbc\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x0e\x00\x2e\x01\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x0e\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\xb8\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x0e\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\xb7\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x0e\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\xb6\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x0e\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\xb4\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x0e\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\xb3\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x0e\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\xb0\x00\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x0e\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\xaf\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x0e\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\xae\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x0e\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\xaa\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x0e\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\xa9\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x0e\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\xa5\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x0e\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\xa4\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x0e\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x3d\x01\xa2\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x0e\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\xa1\x00\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x2e\x01\x00\x00\x2e\x01\x00\x00\x2e\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\xb2\x00\x4f\x00\x4f\x00\x4f\x00\x4e\x00\xac\x00\xad\x00\xdb\x00\x08\x00\x22\x00\x18\x00\x19\x00\x1d\x00\x1c\x00\x1a\x00\x11\x00\x3e\x00\x51\x00\xde\x00\xdf\x00\x00\x00\x00\x00\x4f\x00\x4e\x01\xf0\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\xef\x00\xe7\x00\xe8\x00\x4e\x01\x4e\x01\x4e\x01\xfe\x00\xe0\x00\x4e\x01\xf5\x00\xf4\x00\xf4\x00\xf4\x00\xf4\x00\xf4\x00\xf4\x00\xf4\x00\xf4\x00\xf4\x00\xe2\x00\xe1\x00\x4e\x01\xe3\x00\x4e\x01\xe5\x00\xeb\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x69\x01\x4e\x01\x4e\x01\x16\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\xea\x00\x4e\x01\x4e\x01\xe4\x00\x4e\x01\x50\x01\x4e\x01\x3e\x01\x23\x01\x4e\x01\x34\x01\x4e\x01\x46\x01\x97\x01\x4e\x01\x4e\x01\x10\x01\x3d\x01\x4e\x01\x6b\x01\x48\x01\x37\x01\x3f\x01\x45\x01\x4e\x01\x39\x01\x4e\x01\x1d\x01\x4e\x01\x4e\x01\x4e\x01\xed\x00\xe6\x00\xee\x00\x4e\x01\xb3\x00\x4f\x00\x4f\x00\x4f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4f\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x0a\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4f\x00\x4f\x00\x4f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb2\x00\x4f\x00\x4f\x00\x4f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4e\x01\x00\x00\x4e\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x09\x00\x4f\x00\x4e\x01\xf0\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\xef\x00\xe7\x00\xe8\x00\x4e\x01\x4e\x01\x4e\x01\xfe\x00\xe0\x00\x4e\x01\xf5\x00\xf4\x00\xf4\x00\xf4\x00\xf4\x00\xf4\x00\xf4\x00\xf4\x00\xf4\x00\xf4\x00\xe2\x00\xe1\x00\x4e\x01\xe3\x00\x4e\x01\xe5\x00\xeb\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x69\x01\x4e\x01\x4e\x01\x16\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\xea\x00\x4e\x01\x4e\x01\xe4\x00\x4e\x01\x50\x01\x4e\x01\x3e\x01\x23\x01\x4e\x01\x34\x01\x4e\x01\x46\x01\x97\x01\x4e\x01\x4e\x01\x10\x01\x3d\x01\x4e\x01\x6b\x01\x48\x01\x37\x01\x3f\x01\x45\x01\x4e\x01\x39\x01\x4e\x01\x1d\x01\x4e\x01\x4e\x01\x4e\x01\xed\x00\xe6\x00\xee\x00\x4e\x01\x4f\x00\x4f\x00\x4f\x00\xb2\x00\x4f\x00\x4f\x00\x4f\x00\xb4\x00\x4f\x00\x4f\x00\x4f\x00\xdd\x00\x00\x00\xff\xff\x50\x00\x50\x00\x50\x00\x50\x00\x00\x00\x00\x00\x00\x00\x4f\x00\x00\x00\xab\x00\x00\x00\x4f\x00\x00\x00\x00\x00\x00\x00\x4f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0a\x00\x00\x00\x50\x00\x00\x00\x0a\x00\x6e\x00\x00\x00\x00\x00\x0a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x82\x00\x85\x00\x00\x00\xa1\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x79\x00\x00\x00\x8d\x00\x94\x00\x00\x00\x00\x00\x00\x00\x95\x00\x00\x00\x1b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xec\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0b\x00\x00\x00\x00\x00\x09\x00\x00\x00\x00\x00\x00\x00\x09\x00\x00\x00\x00\x00\x00\x00\x09\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6d\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\x33\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x34\x00\x12\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x2a\x00\x16\x00\x20\x00\x20\x00\x20\x00\x21\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x4d\x00\x49\x00\x49\x00\x49\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x49\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4e\x01\x00\x00\x4e\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x36\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x37\x00\x10\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2c\x00\x15\x00\x23\x00\x23\x00\x23\x00\x24\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x00\x00\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x0d\x00\x4e\x01\x4e\x01\x0c\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x00\x00\x4e\x01\x39\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x36\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x33\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\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\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x0f\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x10\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x12\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x13\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x28\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\x2a\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x2e\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\x31\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\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\x37\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\x3c\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\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x00\x00\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\xfc\x00\xfa\x00\xfa\x00\xfa\x00\xfa\x00\xfa\x00\xfa\x00\xfa\x00\xfa\x00\xfa\x00\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x0d\x00\x4e\x01\x4e\x01\x0c\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x00\x00\x4e\x01\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x39\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3c\x00\x0f\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2e\x00\x14\x00\x25\x00\x25\x00\x25\x00\x26\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\x3f\x00\x3f\x00\x3f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x3f\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x0e\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x00\x00\x4e\x01\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\x36\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x37\x00\x10\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2c\x00\x15\x00\x23\x00\x23\x00\x23\x00\x24\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x0e\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x49\x01\x4e\x01\x13\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x00\x00\x4e\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\x3f\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\x36\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x37\x00\x10\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2c\x00\x15\x00\x23\x00\x23\x00\x23\x00\x24\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x0e\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x40\x00\x4e\x01\x00\x00\x4e\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x36\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x37\x00\x10\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2c\x00\x15\x00\x23\x00\x23\x00\x23\x00\x24\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x0e\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x00\x00\x4e\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4c\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x36\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x37\x00\x10\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2c\x00\x15\x00\x23\x00\x23\x00\x23\x00\x24\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x42\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x36\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x37\x00\x10\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2c\x00\x15\x00\x23\x00\x23\x00\x23\x00\x24\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x0e\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x00\x00\x4e\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\x43\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\x36\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x37\x00\x10\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2c\x00\x15\x00\x23\x00\x23\x00\x23\x00\x24\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x0e\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x00\x00\x4e\x01\x4b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x36\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x37\x00\x10\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2c\x00\x15\x00\x23\x00\x23\x00\x23\x00\x24\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x0e\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x45\x00\x4e\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x36\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x37\x00\x10\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2c\x00\x15\x00\x23\x00\x23\x00\x23\x00\x24\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x0e\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x46\x00\x4e\x01\x00\x00\x4e\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x36\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x37\x00\x10\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2c\x00\x15\x00\x23\x00\x23\x00\x23\x00\x24\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x0e\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x00\x00\x4e\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x36\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x37\x00\x10\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2c\x00\x15\x00\x23\x00\x23\x00\x23\x00\x24\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x49\x00\x49\x00\x49\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x49\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x36\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x37\x00\x10\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2c\x00\x15\x00\x23\x00\x23\x00\x23\x00\x24\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x47\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x36\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x37\x00\x10\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2c\x00\x15\x00\x23\x00\x23\x00\x23\x00\x24\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x0e\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x00\x00\x4e\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x44\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x36\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x37\x00\x10\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2c\x00\x15\x00\x23\x00\x23\x00\x23\x00\x24\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x36\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x37\x00\x10\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2c\x00\x15\x00\x23\x00\x23\x00\x23\x00\x24\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\xff\xff\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x0e\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x00\x00\x4e\x01\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\x33\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x34\x00\x12\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x2a\x00\x16\x00\x20\x00\x20\x00\x20\x00\x21\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\xff\xff\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x0e\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x00\x00\x4e\x01\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\x33\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x34\x00\x12\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x2a\x00\x16\x00\x20\x00\x20\x00\x20\x00\x21\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\xff\xff\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x0e\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x00\x00\x4e\x01\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\x33\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x34\x00\x12\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x2a\x00\x16\x00\x20\x00\x20\x00\x20\x00\x21\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\xff\xff\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x0e\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x00\x00\x4e\x01\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\x33\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x34\x00\x12\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x2a\x00\x16\x00\x20\x00\x20\x00\x20\x00\x21\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\xff\xff\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x0e\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x00\x00\x4e\x01\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\x33\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x34\x00\x12\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x2a\x00\x16\x00\x20\x00\x20\x00\x20\x00\x21\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\xff\xff\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x0e\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x00\x00\x4e\x01\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\x33\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x34\x00\x12\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x2a\x00\x16\x00\x20\x00\x20\x00\x20\x00\x21\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x33\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x34\x00\x12\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x2a\x00\x16\x00\x20\x00\x20\x00\x20\x00\x21\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\xff\xff\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x0e\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x00\x00\x4e\x01\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\x33\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x34\x00\x12\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x2a\x00\x16\x00\x20\x00\x20\x00\x20\x00\x21\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\xff\xff\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x0e\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\xc7\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\xc8\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x00\x00\x4e\x01\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\x33\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x34\x00\x12\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x2a\x00\x16\x00\x20\x00\x20\x00\x20\x00\x21\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\xff\xff\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x0e\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x00\x00\x4e\x01\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\x33\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x34\x00\x12\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x2a\x00\x16\x00\x20\x00\x20\x00\x20\x00\x21\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\xff\xff\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x0e\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x00\x00\x4e\x01\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\x33\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x34\x00\x12\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x2a\x00\x16\x00\x20\x00\x20\x00\x20\x00\x21\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\xff\xff\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x0e\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x00\x00\x4e\x01\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\x33\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x34\x00\x12\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x2a\x00\x16\x00\x20\x00\x20\x00\x20\x00\x21\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\xff\xff\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x0e\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x00\x00\x4e\x01\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\x33\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x34\x00\x12\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x2a\x00\x16\x00\x20\x00\x20\x00\x20\x00\x21\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\xff\xff\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x0e\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x00\x00\x4e\x01\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\x33\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x34\x00\x12\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x2a\x00\x16\x00\x20\x00\x20\x00\x20\x00\x21\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\xff\xff\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x0e\x00\x4e\x01\xd1\x00\xd0\x00\xd0\x00\xd0\x00\xd0\x00\xd0\x00\xd0\x00\xd0\x00\xd0\x00\xd0\x00\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x00\x00\x4e\x01\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\x33\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x34\x00\x12\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x2a\x00\x16\x00\x20\x00\x20\x00\x20\x00\x21\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x4e\x01\x52\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x0e\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x00\x00\x4e\x01\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x33\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x34\x00\x12\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x2a\x00\x16\x00\x20\x00\x20\x00\x20\x00\x21\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\xff\xff\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x0e\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x00\x00\x4e\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x53\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\x33\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x34\x00\x12\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x2a\x00\x16\x00\x20\x00\x20\x00\x20\x00\x21\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x54\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x33\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x34\x00\x12\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x2a\x00\x16\x00\x20\x00\x20\x00\x20\x00\x21\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x0e\x00\x4e\x01\xcf\x00\xcf\x00\xcf\x00\xcf\x00\xcf\x00\xcf\x00\xcf\x00\xcf\x00\xcf\x00\xcf\x00\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x56\x00\xcf\x00\xcf\x00\xcf\x00\xcf\x00\xcf\x00\xcf\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\xcf\x00\xcf\x00\xcf\x00\xcf\x00\xcf\x00\xcf\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x00\x00\x4e\x01\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x33\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x34\x00\x12\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x2a\x00\x16\x00\x20\x00\x20\x00\x20\x00\x21\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x57\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x33\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x34\x00\x12\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x2a\x00\x16\x00\x20\x00\x20\x00\x20\x00\x21\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x33\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x34\x00\x12\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x2a\x00\x16\x00\x20\x00\x20\x00\x20\x00\x21\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x33\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x34\x00\x12\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x2a\x00\x16\x00\x20\x00\x20\x00\x20\x00\x21\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x33\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x34\x00\x12\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x2a\x00\x16\x00\x20\x00\x20\x00\x20\x00\x21\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x33\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x34\x00\x12\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x2a\x00\x16\x00\x20\x00\x20\x00\x20\x00\x21\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x0e\x00\x4e\x01\xd0\x00\xd0\x00\xd0\x00\xd0\x00\xd0\x00\xd0\x00\xd0\x00\xd0\x00\xd0\x00\xd0\x00\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x5e\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x00\x00\x4e\x01\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x33\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x34\x00\x12\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x2a\x00\x16\x00\x20\x00\x20\x00\x20\x00\x21\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x33\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x34\x00\x12\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x2a\x00\x16\x00\x20\x00\x20\x00\x20\x00\x21\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x60\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x33\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x34\x00\x12\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x2a\x00\x16\x00\x20\x00\x20\x00\x20\x00\x21\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\xff\xff\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x61\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x00\x00\x4e\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x33\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x34\x00\x12\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x2a\x00\x16\x00\x20\x00\x20\x00\x20\x00\x21\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x62\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x33\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x34\x00\x12\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x2a\x00\x16\x00\x20\x00\x20\x00\x20\x00\x21\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xaa\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x33\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x34\x00\x12\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x2a\x00\x16\x00\x20\x00\x20\x00\x20\x00\x21\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x33\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x34\x00\x12\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x2a\x00\x16\x00\x20\x00\x20\x00\x20\x00\x21\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x66\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x33\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x34\x00\x12\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x2a\x00\x16\x00\x20\x00\x20\x00\x20\x00\x21\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x68\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x33\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x34\x00\x12\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x2a\x00\x16\x00\x20\x00\x20\x00\x20\x00\x21\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x33\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x34\x00\x12\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x2a\x00\x16\x00\x20\x00\x20\x00\x20\x00\x21\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa7\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x33\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x34\x00\x12\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x2a\x00\x16\x00\x20\x00\x20\x00\x20\x00\x21\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x0e\x00\x4e\x01\xd0\x00\xd0\x00\xd0\x00\xd0\x00\xd0\x00\xd0\x00\xd0\x00\xd0\x00\xd0\x00\xd0\x00\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\xa6\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x8a\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x00\x00\x4e\x01\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x33\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x34\x00\x12\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x2a\x00\x16\x00\x20\x00\x20\x00\x20\x00\x21\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa5\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x33\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x34\x00\x12\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x2a\x00\x16\x00\x20\x00\x20\x00\x20\x00\x21\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x33\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x34\x00\x12\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x2a\x00\x16\x00\x20\x00\x20\x00\x20\x00\x21\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x73\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x33\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x34\x00\x12\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x2a\x00\x16\x00\x20\x00\x20\x00\x20\x00\x21\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x33\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x34\x00\x12\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x2a\x00\x16\x00\x20\x00\x20\x00\x20\x00\x21\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x74\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x33\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x34\x00\x12\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x2a\x00\x16\x00\x20\x00\x20\x00\x20\x00\x21\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x33\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x34\x00\x12\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x2a\x00\x16\x00\x20\x00\x20\x00\x20\x00\x21\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x0e\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x9c\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x00\x00\x4e\x01\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x33\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x34\x00\x12\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x2a\x00\x16\x00\x20\x00\x20\x00\x20\x00\x21\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x33\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x34\x00\x12\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x2a\x00\x16\x00\x20\x00\x20\x00\x20\x00\x21\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x33\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x34\x00\x12\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x2a\x00\x16\x00\x20\x00\x20\x00\x20\x00\x21\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x33\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x34\x00\x12\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x2a\x00\x16\x00\x20\x00\x20\x00\x20\x00\x21\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x33\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x34\x00\x12\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x2a\x00\x16\x00\x20\x00\x20\x00\x20\x00\x21\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x98\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x33\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x34\x00\x12\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x2a\x00\x16\x00\x20\x00\x20\x00\x20\x00\x21\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x33\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x34\x00\x12\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x2a\x00\x16\x00\x20\x00\x20\x00\x20\x00\x21\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x96\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x33\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x34\x00\x12\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x2a\x00\x16\x00\x20\x00\x20\x00\x20\x00\x21\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x81\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x33\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x34\x00\x12\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x2a\x00\x16\x00\x20\x00\x20\x00\x20\x00\x21\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x83\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x33\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x34\x00\x12\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x2a\x00\x16\x00\x20\x00\x20\x00\x20\x00\x21\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x93\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x33\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x34\x00\x12\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x2a\x00\x16\x00\x20\x00\x20\x00\x20\x00\x21\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x86\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x33\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x34\x00\x12\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x2a\x00\x16\x00\x20\x00\x20\x00\x20\x00\x21\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x0e\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x92\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x2c\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x2e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x00\x00\x4e\x01\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x33\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x34\x00\x12\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x2a\x00\x16\x00\x20\x00\x20\x00\x20\x00\x21\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x91\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x33\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x34\x00\x12\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x2a\x00\x16\x00\x20\x00\x20\x00\x20\x00\x21\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x89\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x33\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x34\x00\x12\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x2a\x00\x16\x00\x20\x00\x20\x00\x20\x00\x21\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x90\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x33\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x34\x00\x12\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x2a\x00\x16\x00\x20\x00\x20\x00\x20\x00\x21\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x33\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x34\x00\x12\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x2a\x00\x16\x00\x20\x00\x20\x00\x20\x00\x21\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x33\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x34\x00\x12\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x2a\x00\x16\x00\x20\x00\x20\x00\x20\x00\x21\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\xff\xff\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x0e\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x00\x00\x4e\x01\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\x33\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x34\x00\x12\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x2a\x00\x16\x00\x20\x00\x20\x00\x20\x00\x21\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x33\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x34\x00\x12\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x2a\x00\x16\x00\x20\x00\x20\x00\x20\x00\x21\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x33\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x34\x00\x12\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x2a\x00\x16\x00\x20\x00\x20\x00\x20\x00\x21\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x88\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x33\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x34\x00\x12\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x2a\x00\x16\x00\x20\x00\x20\x00\x20\x00\x21\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x87\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x33\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x34\x00\x12\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x2a\x00\x16\x00\x20\x00\x20\x00\x20\x00\x21\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x84\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x33\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x34\x00\x12\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x2a\x00\x16\x00\x20\x00\x20\x00\x20\x00\x21\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x33\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x34\x00\x12\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x2a\x00\x16\x00\x20\x00\x20\x00\x20\x00\x21\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x33\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x34\x00\x12\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x2a\x00\x16\x00\x20\x00\x20\x00\x20\x00\x21\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x33\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x34\x00\x12\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x2a\x00\x16\x00\x20\x00\x20\x00\x20\x00\x21\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x33\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x34\x00\x12\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x2a\x00\x16\x00\x20\x00\x20\x00\x20\x00\x21\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x78\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x33\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x34\x00\x12\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x2a\x00\x16\x00\x20\x00\x20\x00\x20\x00\x21\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x77\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x33\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x34\x00\x12\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x2a\x00\x16\x00\x20\x00\x20\x00\x20\x00\x21\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x33\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x34\x00\x12\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x2a\x00\x16\x00\x20\x00\x20\x00\x20\x00\x21\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x33\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x34\x00\x12\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x2a\x00\x16\x00\x20\x00\x20\x00\x20\x00\x21\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x72\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x33\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x34\x00\x12\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x2a\x00\x16\x00\x20\x00\x20\x00\x20\x00\x21\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x71\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x33\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x34\x00\x12\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x2a\x00\x16\x00\x20\x00\x20\x00\x20\x00\x21\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x70\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x33\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x34\x00\x12\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x2a\x00\x16\x00\x20\x00\x20\x00\x20\x00\x21\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x33\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x34\x00\x12\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x2a\x00\x16\x00\x20\x00\x20\x00\x20\x00\x21\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x33\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x34\x00\x12\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x2a\x00\x16\x00\x20\x00\x20\x00\x20\x00\x21\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x33\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x34\x00\x12\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x2a\x00\x16\x00\x20\x00\x20\x00\x20\x00\x21\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x69\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x33\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x34\x00\x12\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x2a\x00\x16\x00\x20\x00\x20\x00\x20\x00\x21\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa8\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x33\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x34\x00\x12\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x2a\x00\x16\x00\x20\x00\x20\x00\x20\x00\x21\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x75\x00\x9d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x67\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x76\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x33\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x34\x00\x12\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x2a\x00\x16\x00\x20\x00\x20\x00\x20\x00\x21\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x65\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x33\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x34\x00\x12\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x2a\x00\x16\x00\x20\x00\x20\x00\x20\x00\x21\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x64\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x33\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x34\x00\x12\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x2a\x00\x16\x00\x20\x00\x20\x00\x20\x00\x21\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x63\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x33\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x34\x00\x12\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x2a\x00\x16\x00\x20\x00\x20\x00\x20\x00\x21\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x33\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x34\x00\x12\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x2a\x00\x16\x00\x20\x00\x20\x00\x20\x00\x21\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x58\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x33\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x34\x00\x12\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x2a\x00\x16\x00\x20\x00\x20\x00\x20\x00\x21\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x55\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x33\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x34\x00\x12\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x2a\x00\x16\x00\x20\x00\x20\x00\x20\x00\x21\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\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x0e\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x00\x00\x4e\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x31\x00\x13\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x28\x00\x17\x00\x1e\x00\x1e\x00\x1e\x00\x1f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xff\xff\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\x00\x00\xad\x00\x00\x00\x00\x00\x00\x00\x00\x00\xad\x00\xad\x00\xad\x00\x00\x00\x00\x00\x00\x00\x00\x00\xad\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xad\x00\x00\x00\x00\x00\x00\x00\x00\x00\xad\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xaf\x00\x00\x00\x00\x00\xb0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xad\x00\x00\x00\xad\x00\x00\x00\xad\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\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\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x31\x00\x13\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x28\x00\x17\x00\x1e\x00\x1e\x00\x1e\x00\x1f\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb1\x00\x00\x00\xb1\x00\xb1\x00\xb1\x00\xb1\x00\xb1\x00\x00\x00\x00\x00\xb1\x00\xb1\x00\xb1\x00\xb1\x00\x00\x00\xb1\x00\xb1\x00\xb1\x00\xb1\x00\xb1\x00\xb1\x00\xb1\x00\xb1\x00\xb1\x00\xb1\x00\xb1\x00\xb1\x00\x00\x00\xb1\x00\xb1\x00\xb1\x00\xb1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb1\x00\xb1\x00\xb1\x00\xb1\x00\x00\x00\xb1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb1\x00\x00\x00\xb1\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\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\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x31\x00\x13\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x28\x00\x17\x00\x1e\x00\x1e\x00\x1e\x00\x1f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xff\xff\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\x00\x00\xad\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xad\x00\xad\x00\x00\x00\x00\x00\x00\x00\x00\x00\xad\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xad\x00\x00\x00\x00\x00\x00\x00\x00\x00\xad\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xad\x00\x00\x00\xad\x00\x00\x00\xad\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\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\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x31\x00\x13\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x28\x00\x17\x00\x1e\x00\x1e\x00\x1e\x00\x1f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xff\xff\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\x00\x00\xad\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xad\x00\xad\x00\x00\x00\x00\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\xad\x00\x00\x00\x00\x00\x00\x00\x00\x00\xad\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xad\x00\x00\x00\xad\x00\x00\x00\xad\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\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\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x31\x00\x13\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x28\x00\x17\x00\x1e\x00\x1e\x00\x1e\x00\x1f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x0e\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x0e\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x0e\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x0e\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x0e\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x0e\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x0e\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x0e\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x0e\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x0e\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x0e\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x00\x00\x4e\x01\x85\x01\x4e\x01\x85\x01\x2f\x00\x4e\x01\xf3\x00\xf2\x00\xf2\x00\xf2\x00\xf2\x00\xf2\x00\xf2\x00\xf2\x00\xf2\x00\xf2\x00\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\xf2\x00\xf2\x00\xf2\x00\xf2\x00\xf1\x00\xf2\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\xf2\x00\xf2\x00\xf2\x00\xf2\x00\xf1\x00\xf2\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x2f\x00\x4e\x01\xf2\x00\xf2\x00\xf2\x00\xf2\x00\xf2\x00\xf2\x00\xf2\x00\xf2\x00\xf2\x00\xf2\x00\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\xf2\x00\xf2\x00\xf2\x00\xf2\x00\xf1\x00\xf2\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\xf2\x00\xf2\x00\xf2\x00\xf2\x00\xf1\x00\xf2\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x2f\x00\x4e\x01\xf2\x00\xf2\x00\xf2\x00\xf2\x00\xf2\x00\xf2\x00\xf2\x00\xf2\x00\xf2\x00\xf2\x00\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\xf2\x00\xf2\x00\xf2\x00\xf2\x00\xf1\x00\xf2\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\xf2\x00\xf2\x00\xf2\x00\xf2\x00\xf1\x00\xf2\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x82\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x2f\x00\x4e\x01\xf4\x00\xf4\x00\xf4\x00\xf4\x00\xf4\x00\xf4\x00\xf4\x00\xf4\x00\xf4\x00\xf4\x00\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x84\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x84\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x2f\x00\x4e\x01\xf4\x00\xf4\x00\xf4\x00\xf4\x00\xf4\x00\xf4\x00\xf4\x00\xf4\x00\xf4\x00\xf4\x00\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x84\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x84\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x86\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x00\x00\x4e\x01\x85\x01\x4e\x01\x85\x01\x0e\x00\x4e\x01\xf9\x00\xf7\x00\xf7\x00\xf7\x00\xf7\x00\xf7\x00\xf7\x00\xf7\x00\xf7\x00\xf7\x00\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\xf7\x00\xf7\x00\xf7\x00\xf7\x00\xf6\x00\xf7\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\xf7\x00\xf7\x00\xf7\x00\xf7\x00\xf6\x00\xf7\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x0e\x00\x4e\x01\xf7\x00\xf7\x00\xf7\x00\xf7\x00\xf7\x00\xf7\x00\xf7\x00\xf7\x00\xf7\x00\xf7\x00\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\xf7\x00\xf7\x00\xf7\x00\xf7\x00\xf6\x00\xf7\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\xf7\x00\xf7\x00\xf7\x00\xf7\x00\xf6\x00\xf7\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x0e\x00\x4e\x01\xf8\x00\xf8\x00\xf8\x00\xf8\x00\xf8\x00\xf8\x00\xf8\x00\xf8\x00\xf8\x00\xf8\x00\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\xf8\x00\xf8\x00\xf8\x00\xf8\x00\xf8\x00\xf8\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\xf8\x00\xf8\x00\xf8\x00\xf8\x00\xf8\x00\xf8\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x0e\x00\x4e\x01\xf7\x00\xf7\x00\xf7\x00\xf7\x00\xf7\x00\xf7\x00\xf7\x00\xf7\x00\xf7\x00\xf7\x00\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\xf7\x00\xf7\x00\xf7\x00\xf7\x00\xf6\x00\xf7\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\xf7\x00\xf7\x00\xf7\x00\xf7\x00\xf6\x00\xf7\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x82\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x0e\x00\x4e\x01\xfa\x00\xfa\x00\xfa\x00\xfa\x00\xfa\x00\xfa\x00\xfa\x00\xfa\x00\xfa\x00\xfa\x00\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x84\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x84\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x0e\x00\x4e\x01\xfb\x00\xfb\x00\xfb\x00\xfb\x00\xfb\x00\xfb\x00\xfb\x00\xfb\x00\xfb\x00\xfb\x00\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x0e\x00\x4e\x01\xfa\x00\xfa\x00\xfa\x00\xfa\x00\xfa\x00\xfa\x00\xfa\x00\xfa\x00\xfa\x00\xfa\x00\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x84\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x84\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x83\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x0e\x00\x4e\x01\xfb\x00\xfb\x00\xfb\x00\xfb\x00\xfb\x00\xfb\x00\xfb\x00\xfb\x00\xfb\x00\xfb\x00\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x82\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x00\x00\x4e\x01\x4e\x01\x4e\x01\xb1\x00\x0e\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\xe9\x00\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x0e\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\xb7\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x0e\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\xba\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x0e\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\xbb\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x0e\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\xbc\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x0e\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\xbf\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x0e\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\xc0\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x0e\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\xc1\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x0e\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\xc4\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x0e\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\xc5\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x0e\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\xcb\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x0e\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\xd3\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x0e\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\xd4\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x0e\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\xd5\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x0e\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\xd8\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x0e\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\xd9\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x0e\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\xda\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x0e\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\xdc\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x0e\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x98\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x0e\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x94\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x0e\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x91\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x0e\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x90\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x0e\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x8f\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x0e\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x8e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x0e\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x8d\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x0e\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x8c\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x0e\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x89\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x0e\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x88\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x0e\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x0f\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x0e\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x81\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x0e\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x80\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x0e\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x1b\x01\x7f\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x0e\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x7e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x0e\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x7d\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x0e\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x7c\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x0e\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x7b\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x0e\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x7a\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x0e\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x79\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x0e\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x78\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x0e\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x77\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x0e\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x76\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x0e\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x75\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x0e\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x14\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x0e\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x15\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x0e\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x74\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x0e\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x73\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x0e\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x18\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x0e\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x72\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x0e\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x71\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x0e\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x70\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x0e\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x6f\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x0e\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x6e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x0e\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x6d\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x0e\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x6c\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x0e\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x1c\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x5b\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x0e\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x25\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x47\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x66\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x0e\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x6a\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x0e\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x2d\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x0e\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x2f\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x0e\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x44\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x31\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x0e\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x33\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x0e\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x65\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x0e\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x64\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x0e\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x62\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x5e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x0e\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x61\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x0e\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x35\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x0e\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x36\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x0e\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x60\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x0e\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x5f\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x0e\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x5c\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x0e\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x38\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x0e\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x5a\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x0e\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x58\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x0e\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x3a\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x0e\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x55\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4c\x01\x4e\x01\x4e\x01\x43\x01\x4e\x01\x4e\x01\x57\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x0e\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x41\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x0e\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x42\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x0e\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x56\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x0e\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x54\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x0e\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x52\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x0e\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x0e\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x51\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x0e\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4b\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x0e\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4a\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x0e\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x53\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x0e\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x40\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x0e\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x3b\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x0e\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x59\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x0e\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x5d\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x0e\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x67\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x0e\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x32\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x0e\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x30\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x0e\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x68\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x0e\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x2b\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x0e\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x3c\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x2a\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x0e\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x29\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x0e\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x28\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x0e\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x27\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x0e\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x26\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x0e\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x24\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4f\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4d\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x0e\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x22\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x0e\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x21\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x0e\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x20\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x0e\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x1f\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x0e\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x1e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x0e\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x1a\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x0e\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x19\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x0e\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x17\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x0e\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x12\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x0e\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x11\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x0e\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x0e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x0e\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x0d\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x0e\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x0c\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x0e\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x87\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x0e\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x0b\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x0e\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x0a\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x0e\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x09\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x0e\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x8b\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x0e\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x08\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x0e\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x07\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x0e\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x06\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x0e\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x92\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x0e\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x05\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x0e\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x04\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x0e\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x03\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x0e\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x93\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x0e\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x02\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x0e\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x01\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x0e\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x0e\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x95\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x0e\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x96\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x0e\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\xff\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x0e\x00\x4e\x01\xf8\x00\xf8\x00\xf8\x00\xf8\x00\xf8\x00\xf8\x00\xf8\x00\xf8\x00\xf8\x00\xf8\x00\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\xf8\x00\xf8\x00\xf8\x00\xf8\x00\xf8\x00\xf8\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\xf8\x00\xf8\x00\xf8\x00\xf8\x00\xf8\x00\xf8\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x0e\x00\x4e\x01\xf7\x00\xf7\x00\xf7\x00\xf7\x00\xf7\x00\xf7\x00\xf7\x00\xf7\x00\xf7\x00\xf7\x00\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\xf7\x00\xf7\x00\xf7\x00\xf7\x00\xf7\x00\xf7\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\xf7\x00\xf7\x00\xf7\x00\xf7\x00\xf7\x00\xf7\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x00\x00\x4e\x01\x85\x01\x4e\x01\x85\x01\x0e\x00\x4e\x01\xfd\x00\xfb\x00\xfb\x00\xfb\x00\xfb\x00\xfb\x00\xfb\x00\xfb\x00\xfb\x00\xfb\x00\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x0e\x00\x4e\x01\xfd\x00\xfb\x00\xfb\x00\xfb\x00\xfb\x00\xfb\x00\xfb\x00\xfb\x00\xfb\x00\xfb\x00\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x0e\x00\x4e\x01\xf2\x00\xf2\x00\xf2\x00\xf2\x00\xf2\x00\xf2\x00\xf2\x00\xf2\x00\xf2\x00\xf2\x00\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\xf2\x00\xf2\x00\xf2\x00\xf2\x00\xf2\x00\xf2\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\xf2\x00\xf2\x00\xf2\x00\xf2\x00\xf2\x00\xf2\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x0e\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\xd7\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x0e\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\xd6\x00\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x0e\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\xd2\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x0e\x00\x4e\x01\xcf\x00\xcf\x00\xcf\x00\xcf\x00\xcf\x00\xcf\x00\xcf\x00\xcf\x00\xcf\x00\xcf\x00\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\xcf\x00\xcf\x00\xcf\x00\xcf\x00\xcf\x00\xcf\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\xcf\x00\xcf\x00\xcf\x00\xcf\x00\xcf\x00\xcf\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x0e\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\xce\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x0e\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\xcd\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x0e\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\xcc\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x0e\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\xca\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x0e\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\xc9\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x0e\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\xc6\x00\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x0e\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\xc3\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x0e\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\xc2\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x0e\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\xbe\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x0e\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\xbd\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x0e\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\xb9\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x0e\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\xb8\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x0e\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x63\x01\xb6\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x0e\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\xb5\x00\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x4e\x01\x00\x00\x4e\x01\x00\x00\x4e\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"# alex_check :: AlexAddr-alex_check = AlexA# "\xff\xff\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x7d\x00\x2d\x00\x2d\x00\x6f\x00\x65\x00\x6f\x00\x63\x00\x7b\x00\x6e\x00\x65\x00\x64\x00\x64\x00\x0a\x00\x23\x00\x2e\x00\x2e\x00\xff\xff\xff\xff\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\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x20\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\x2d\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x0b\x00\x0c\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\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5b\x00\x5c\x00\x5d\x00\x5e\x00\xff\xff\x60\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\x7c\x00\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x7b\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\x0b\x00\x0c\x00\x0d\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x21\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\x2d\x00\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\x2d\x00\xff\xff\x20\x00\xff\xff\x2d\x00\x23\x00\xff\xff\xff\xff\x2d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x42\x00\x43\x00\xff\xff\x45\x00\xff\xff\xff\xff\xff\xff\x49\x00\xff\xff\xff\xff\x4c\x00\xff\xff\xff\xff\x4f\x00\xff\xff\xff\xff\xff\xff\x53\x00\xff\xff\x5c\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x7b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x74\x00\xff\xff\xff\xff\x7b\x00\xff\xff\xff\xff\xff\xff\x7b\x00\xff\xff\xff\xff\xff\xff\x7b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x7b\x00\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\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x20\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\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\x5b\x00\x5c\x00\x5d\x00\x5e\x00\xff\xff\x60\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x7c\x00\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\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\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\xff\xff\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\xff\xff\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\xff\xff\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\xff\xff\x7e\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\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\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\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\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\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\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\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\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\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\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\x23\x00\x24\x00\x25\x00\x26\x00\xff\xff\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\xff\xff\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\xff\xff\x7e\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\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\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\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\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\x21\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\x20\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\xff\xff\x7e\x00\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\x0a\x00\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x7d\x00\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\x0a\x00\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\x65\x00\x7c\x00\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\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\x0a\x00\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x6f\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\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\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\x63\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\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\x0a\x00\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x7b\x00\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\x0a\x00\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\xff\xff\x7e\x00\x69\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\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\x0a\x00\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x67\x00\x7e\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\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\x0a\x00\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\x65\x00\x7c\x00\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\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\x0a\x00\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\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\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\x0a\x00\x0b\x00\x0c\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\x20\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\x5c\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\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\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\x62\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\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\x0a\x00\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x6e\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\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\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\x64\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\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\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\x20\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\xff\xff\x7e\x00\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\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\x20\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\xff\xff\x7e\x00\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\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\x20\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\xff\xff\x7e\x00\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\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\x20\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\xff\xff\x7e\x00\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\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\x20\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\xff\xff\x7e\x00\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\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\x20\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\xff\xff\x7e\x00\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\x09\x00\x0a\x00\x0b\x00\x0c\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\x20\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\x5f\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\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\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\x20\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\xff\xff\x7e\x00\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\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\x20\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\xff\xff\x7e\x00\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\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\x20\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\xff\xff\x7e\x00\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\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\x20\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\xff\xff\x7e\x00\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\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\x20\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\xff\xff\x7e\x00\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\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\x20\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\xff\xff\x7e\x00\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\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\x20\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\xff\xff\x7e\x00\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\x09\x00\x0a\x00\x0b\x00\x0c\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\x20\x00\xff\xff\x21\x00\x23\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\xff\xff\x7e\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\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\x20\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x7d\x00\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\x09\x00\x0a\x00\x0b\x00\x0c\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\x20\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\x53\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\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\x09\x00\x0a\x00\x0b\x00\x0c\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\x20\x00\xff\xff\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x41\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\xff\xff\x7c\x00\xff\xff\x7e\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\x09\x00\x0a\x00\x0b\x00\x0c\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\x20\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\x45\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\x09\x00\x0a\x00\x0b\x00\x0c\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\x20\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\x43\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\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\x09\x00\x0a\x00\x0b\x00\x0c\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\x20\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\x53\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\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\x09\x00\x0a\x00\x0b\x00\x0c\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\x20\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\x43\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\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\x09\x00\x0a\x00\x0b\x00\x0c\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\x20\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\x45\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\x09\x00\x0a\x00\x0b\x00\x0c\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\x20\x00\xff\xff\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x41\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\xff\xff\x7c\x00\xff\xff\x7e\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\x09\x00\x0a\x00\x0b\x00\x0c\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\x20\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\x45\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x20\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\x2d\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\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\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\x09\x00\x0a\x00\x0b\x00\x0c\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\x20\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\x2d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\x09\x00\x0a\x00\x0b\x00\x0c\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\x20\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\x49\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\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\x09\x00\x0a\x00\x0b\x00\x0c\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\x20\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\x45\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\x09\x00\x0a\x00\x0b\x00\x0c\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\x20\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\x49\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\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\x09\x00\x0a\x00\x0b\x00\x0c\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\x20\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\x49\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\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\x09\x00\x0a\x00\x0b\x00\x0c\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\x20\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\x4f\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\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\x09\x00\x0a\x00\x0b\x00\x0c\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\x20\x00\xff\xff\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x41\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\xff\xff\x7c\x00\xff\xff\x7e\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\x09\x00\x0a\x00\x0b\x00\x0c\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\x20\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\x59\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\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\x09\x00\x0a\x00\x0b\x00\x0c\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\x20\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\x4f\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\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\x09\x00\x0a\x00\x0b\x00\x0c\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\x20\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\x49\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\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\x09\x00\x0a\x00\x0b\x00\x0c\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\x20\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\x49\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\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\x09\x00\x0a\x00\x0b\x00\x0c\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\x20\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\x49\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\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\x09\x00\x0a\x00\x0b\x00\x0c\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\x20\x00\xff\xff\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x41\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\xff\xff\x7c\x00\xff\xff\x7e\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\x09\x00\x0a\x00\x0b\x00\x0c\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\x20\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\x49\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\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\x09\x00\x0a\x00\x0b\x00\x0c\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\x20\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\x49\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\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\x09\x00\x0a\x00\x0b\x00\x0c\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\x20\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\x4d\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\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\x09\x00\x0a\x00\x0b\x00\x0c\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\x20\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\x53\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\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\x09\x00\x0a\x00\x0b\x00\x0c\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\x20\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\x55\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\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\x09\x00\x0a\x00\x0b\x00\x0c\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\x20\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\x4d\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\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\x09\x00\x0a\x00\x0b\x00\x0c\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\x20\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\x4f\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\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\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\x20\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\xff\xff\x7e\x00\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\x09\x00\x0a\x00\x0b\x00\x0c\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\x20\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\x50\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\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\x09\x00\x0a\x00\x0b\x00\x0c\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\x20\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\x54\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\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\x09\x00\x0a\x00\x0b\x00\x0c\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\x20\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\x50\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\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\x09\x00\x0a\x00\x0b\x00\x0c\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\x20\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\x54\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\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\x09\x00\x0a\x00\x0b\x00\x0c\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\x20\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\x50\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\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\x09\x00\x0a\x00\x0b\x00\x0c\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\x20\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\x4c\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\x09\x00\x0a\x00\x0b\x00\x0c\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\x20\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\x42\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\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\x09\x00\x0a\x00\x0b\x00\x0c\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\x20\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\x54\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\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\x09\x00\x0a\x00\x0b\x00\x0c\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\x20\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\x50\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\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\x09\x00\x0a\x00\x0b\x00\x0c\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\x20\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\x4c\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\x09\x00\x0a\x00\x0b\x00\x0c\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\x20\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\x54\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\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\x09\x00\x0a\x00\x0b\x00\x0c\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\x20\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\x4e\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\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\x09\x00\x0a\x00\x0b\x00\x0c\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\x20\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\x54\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\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\x09\x00\x0a\x00\x0b\x00\x0c\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\x20\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\x4c\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\x09\x00\x0a\x00\x0b\x00\x0c\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\x20\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\x52\x00\x53\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\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\x09\x00\x0a\x00\x0b\x00\x0c\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\x20\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\x44\x00\x45\x00\xff\xff\xff\xff\xff\xff\xff\xff\x4a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x54\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\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\x09\x00\x0a\x00\x0b\x00\x0c\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\x20\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\x50\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\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\x09\x00\x0a\x00\x0b\x00\x0c\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\x20\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\x54\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\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\x09\x00\x0a\x00\x0b\x00\x0c\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\x20\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\x4e\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\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\x09\x00\x0a\x00\x0b\x00\x0c\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\x20\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\x54\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\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\x09\x00\x0a\x00\x0b\x00\x0c\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\x20\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\x44\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\x09\x00\x0a\x00\x0b\x00\x0c\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\x20\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\x4e\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\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\x0a\x00\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\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\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\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\xff\xff\x22\x00\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\x28\x00\x29\x00\xff\xff\xff\xff\xff\xff\xff\xff\x2e\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\x3b\x00\xff\xff\xff\xff\xff\xff\xff\xff\x40\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\x5c\x00\xff\xff\xff\xff\x5f\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\x7b\x00\xff\xff\x7d\x00\xff\xff\x7f\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\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\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\xff\xff\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\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\x5b\x00\x5c\x00\x5d\x00\x5e\x00\xff\xff\x60\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\x7c\x00\xff\xff\x7e\x00\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\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\xff\xff\x22\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x28\x00\x29\x00\xff\xff\xff\xff\xff\xff\xff\xff\x2e\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\x3b\x00\xff\xff\xff\xff\xff\xff\xff\xff\x40\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\x7b\x00\xff\xff\x7d\x00\xff\xff\x7f\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\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\xff\xff\x22\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x28\x00\x29\x00\xff\xff\xff\xff\xff\xff\xff\xff\x2e\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\x3b\x00\xff\xff\xff\xff\xff\xff\xff\xff\x40\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\x7b\x00\xff\xff\x7d\x00\xff\xff\x7f\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\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x7d\x00\x2d\x00\x2d\x00\x6f\x00\x65\x00\x6f\x00\x63\x00\x7b\x00\x6e\x00\x65\x00\x64\x00\x64\x00\x0a\x00\x23\x00\x2e\x00\x2e\x00\xff\xff\xff\xff\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\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x20\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\x2d\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x0b\x00\x0c\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\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5b\x00\x5c\x00\x5d\x00\x5e\x00\xff\xff\x60\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\x7c\x00\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x7b\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\x0b\x00\x0c\x00\x0d\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x21\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\x2d\x00\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\x2d\x00\xff\xff\x20\x00\xff\xff\x2d\x00\x23\x00\xff\xff\xff\xff\x2d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x42\x00\x43\x00\xff\xff\x45\x00\xff\xff\xff\xff\xff\xff\x49\x00\xff\xff\xff\xff\x4c\x00\xff\xff\x4e\x00\x4f\x00\xff\xff\xff\xff\xff\xff\x53\x00\xff\xff\x5c\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x7b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x74\x00\xff\xff\xff\xff\x7b\x00\xff\xff\xff\xff\xff\xff\x7b\x00\xff\xff\xff\xff\xff\xff\x7b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x7b\x00\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\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x20\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\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\x5b\x00\x5c\x00\x5d\x00\x5e\x00\xff\xff\x60\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x7c\x00\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\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\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\xff\xff\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\xff\xff\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\xff\xff\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\xff\xff\x7e\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\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\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\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\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\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\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\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\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\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\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\x23\x00\x24\x00\x25\x00\x26\x00\xff\xff\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\xff\xff\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\xff\xff\x7e\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\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\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\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\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\x21\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\x20\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\xff\xff\x7e\x00\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\x0a\x00\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x7d\x00\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\x0a\x00\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\x65\x00\x7c\x00\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\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\x0a\x00\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x6f\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\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\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\x63\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\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\x0a\x00\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x7b\x00\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\x0a\x00\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\xff\xff\x7e\x00\x69\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\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\x0a\x00\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x67\x00\x7e\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\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\x0a\x00\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\x65\x00\x7c\x00\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\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\x0a\x00\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\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\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\x0a\x00\x0b\x00\x0c\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\x20\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\x5c\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\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\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\x62\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\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\x0a\x00\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x6e\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\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\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\x64\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\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\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\x20\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\xff\xff\x7e\x00\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\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\x20\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\xff\xff\x7e\x00\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\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\x20\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\xff\xff\x7e\x00\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\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\x20\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\xff\xff\x7e\x00\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\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\x20\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\xff\xff\x7e\x00\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\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\x20\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\xff\xff\x7e\x00\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\x09\x00\x0a\x00\x0b\x00\x0c\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\x20\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\x5f\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\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\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\x20\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\xff\xff\x7e\x00\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\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\x20\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\xff\xff\x7e\x00\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\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\x20\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\xff\xff\x7e\x00\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\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\x20\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\xff\xff\x7e\x00\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\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\x20\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\xff\xff\x7e\x00\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\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\x20\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\xff\xff\x7e\x00\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\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\x20\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\xff\xff\x7e\x00\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\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\x20\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\xff\xff\x7e\x00\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\x09\x00\x0a\x00\x0b\x00\x0c\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\x20\x00\xff\xff\x21\x00\x23\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\xff\xff\x7e\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\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\x20\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x7d\x00\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\x09\x00\x0a\x00\x0b\x00\x0c\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\x20\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\x53\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\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\x09\x00\x0a\x00\x0b\x00\x0c\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\x20\x00\xff\xff\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x41\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\xff\xff\x7c\x00\xff\xff\x7e\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\x09\x00\x0a\x00\x0b\x00\x0c\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\x20\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\x45\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\x09\x00\x0a\x00\x0b\x00\x0c\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\x20\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\x43\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\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\x09\x00\x0a\x00\x0b\x00\x0c\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\x20\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\x53\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\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\x09\x00\x0a\x00\x0b\x00\x0c\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\x20\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\x43\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\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\x09\x00\x0a\x00\x0b\x00\x0c\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\x20\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\x45\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\x09\x00\x0a\x00\x0b\x00\x0c\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\x20\x00\xff\xff\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x41\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\xff\xff\x7c\x00\xff\xff\x7e\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\x09\x00\x0a\x00\x0b\x00\x0c\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\x20\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\x4b\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\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\x09\x00\x0a\x00\x0b\x00\x0c\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\x20\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\x45\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x20\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\x2d\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\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\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\x09\x00\x0a\x00\x0b\x00\x0c\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\x20\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\x2d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\x09\x00\x0a\x00\x0b\x00\x0c\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\x20\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\x49\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\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\x09\x00\x0a\x00\x0b\x00\x0c\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\x20\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\x45\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\x09\x00\x0a\x00\x0b\x00\x0c\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\x20\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\x49\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\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\x09\x00\x0a\x00\x0b\x00\x0c\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\x20\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\x49\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\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\x09\x00\x0a\x00\x0b\x00\x0c\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\x20\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\x43\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\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\x09\x00\x0a\x00\x0b\x00\x0c\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\x20\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\x4f\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\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\x09\x00\x0a\x00\x0b\x00\x0c\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\x20\x00\xff\xff\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x41\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\xff\xff\x7c\x00\xff\xff\x7e\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\x09\x00\x0a\x00\x0b\x00\x0c\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\x20\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\x59\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\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\x09\x00\x0a\x00\x0b\x00\x0c\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\x20\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\x4f\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\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\x09\x00\x0a\x00\x0b\x00\x0c\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\x20\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\x45\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\x09\x00\x0a\x00\x0b\x00\x0c\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\x20\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\x49\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\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\x09\x00\x0a\x00\x0b\x00\x0c\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\x20\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\x49\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\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\x09\x00\x0a\x00\x0b\x00\x0c\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\x20\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\x49\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\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\x09\x00\x0a\x00\x0b\x00\x0c\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\x20\x00\xff\xff\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x41\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\xff\xff\x7c\x00\xff\xff\x7e\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\x09\x00\x0a\x00\x0b\x00\x0c\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\x20\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\x49\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\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\x09\x00\x0a\x00\x0b\x00\x0c\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\x20\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\x49\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\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\x09\x00\x0a\x00\x0b\x00\x0c\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\x20\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\x4d\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\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\x09\x00\x0a\x00\x0b\x00\x0c\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\x20\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\x53\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\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\x09\x00\x0a\x00\x0b\x00\x0c\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\x20\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\x43\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\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\x09\x00\x0a\x00\x0b\x00\x0c\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\x20\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\x55\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\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\x09\x00\x0a\x00\x0b\x00\x0c\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\x20\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\x4d\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\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\x09\x00\x0a\x00\x0b\x00\x0c\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\x20\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\x5f\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\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\x09\x00\x0a\x00\x0b\x00\x0c\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\x20\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\x4f\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\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\x09\x00\x0a\x00\x0b\x00\x0c\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\x20\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\x4f\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\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\x09\x00\x0a\x00\x0b\x00\x0c\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\x20\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\x49\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\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\x09\x00\x0a\x00\x0b\x00\x0c\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\x20\x00\xff\xff\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x41\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\xff\xff\x7c\x00\xff\xff\x7e\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\x09\x00\x0a\x00\x0b\x00\x0c\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\x20\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\x49\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\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\x09\x00\x0a\x00\x0b\x00\x0c\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\x20\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\x4d\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\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\x09\x00\x0a\x00\x0b\x00\x0c\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\x20\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\x45\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\x09\x00\x0a\x00\x0b\x00\x0c\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\x20\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\x5f\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\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\x09\x00\x0a\x00\x0b\x00\x0c\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\x20\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\x4f\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\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\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\x20\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\xff\xff\x7e\x00\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\x09\x00\x0a\x00\x0b\x00\x0c\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\x20\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\x54\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\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\x09\x00\x0a\x00\x0b\x00\x0c\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\x20\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\x52\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\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\x09\x00\x0a\x00\x0b\x00\x0c\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\x20\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\x4e\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\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\x09\x00\x0a\x00\x0b\x00\x0c\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\x20\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\x54\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\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\x09\x00\x0a\x00\x0b\x00\x0c\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\x20\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\x4e\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\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\x09\x00\x0a\x00\x0b\x00\x0c\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\x20\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\x50\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\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\x09\x00\x0a\x00\x0b\x00\x0c\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\x20\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\x54\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\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\x09\x00\x0a\x00\x0b\x00\x0c\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\x20\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\x50\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\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\x09\x00\x0a\x00\x0b\x00\x0c\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\x20\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\x54\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\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\x09\x00\x0a\x00\x0b\x00\x0c\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\x20\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\x48\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\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\x09\x00\x0a\x00\x0b\x00\x0c\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\x20\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\x50\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\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\x09\x00\x0a\x00\x0b\x00\x0c\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\x20\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\x4c\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\x09\x00\x0a\x00\x0b\x00\x0c\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\x20\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\x42\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\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\x09\x00\x0a\x00\x0b\x00\x0c\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\x20\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\x54\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\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\x09\x00\x0a\x00\x0b\x00\x0c\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\x20\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\x50\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\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\x09\x00\x0a\x00\x0b\x00\x0c\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\x20\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\x4c\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\x09\x00\x0a\x00\x0b\x00\x0c\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\x20\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\x54\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\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\x09\x00\x0a\x00\x0b\x00\x0c\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\x20\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\x4e\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\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\x09\x00\x0a\x00\x0b\x00\x0c\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\x20\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\x54\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\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\x09\x00\x0a\x00\x0b\x00\x0c\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\x20\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\x4c\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\x09\x00\x0a\x00\x0b\x00\x0c\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\x20\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\x52\x00\x53\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\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\x09\x00\x0a\x00\x0b\x00\x0c\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\x20\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\x44\x00\x45\x00\xff\xff\xff\xff\xff\xff\xff\xff\x4a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x54\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\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\x09\x00\x0a\x00\x0b\x00\x0c\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\x20\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\x50\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\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\x09\x00\x0a\x00\x0b\x00\x0c\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\x20\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\x54\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\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\x09\x00\x0a\x00\x0b\x00\x0c\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\x20\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\x4e\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\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\x09\x00\x0a\x00\x0b\x00\x0c\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\x20\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\x54\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\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\x09\x00\x0a\x00\x0b\x00\x0c\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\x20\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\x44\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\x09\x00\x0a\x00\x0b\x00\x0c\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\x20\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\x4e\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\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\x0a\x00\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\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\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\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\xff\xff\x22\x00\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\x28\x00\x29\x00\xff\xff\xff\xff\xff\xff\xff\xff\x2e\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\x3b\x00\xff\xff\xff\xff\xff\xff\xff\xff\x40\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\x5c\x00\xff\xff\xff\xff\x5f\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\x7b\x00\xff\xff\x7d\x00\xff\xff\x7f\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\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\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\xff\xff\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\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\x5b\x00\x5c\x00\x5d\x00\x5e\x00\xff\xff\x60\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\x7c\x00\xff\xff\x7e\x00\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\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\xff\xff\x22\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x28\x00\x29\x00\xff\xff\xff\xff\xff\xff\xff\xff\x2e\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\x3b\x00\xff\xff\xff\xff\xff\xff\xff\xff\x40\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\x7b\x00\xff\xff\x7d\x00\xff\xff\x7f\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\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\xff\xff\x22\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x28\x00\x29\x00\xff\xff\xff\xff\xff\xff\xff\xff\x2e\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\x3b\x00\xff\xff\xff\xff\xff\xff\xff\xff\x40\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\x7b\x00\xff\xff\x7d\x00\xff\xff\x7f\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\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\x21\x00\x7e\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\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\xff\xff\x7c\x00\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff"# alex_deflt :: AlexAddr-alex_deflt = AlexA# "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x80\x00\x48\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\x27\x00\x27\x00\x29\x00\x29\x00\xff\xff\x2b\x00\x2b\x00\x2d\x00\x2d\x00\x32\x00\x32\x00\x35\x00\x35\x00\x38\x00\x38\x00\x3d\x00\x3d\x00\xff\xff\x99\x00\x99\x00\x99\x00\x80\x00\x80\x00\x80\x00\x48\x00\x48\x00\x48\x00\x3e\x00\xff\xff\x3e\x00\x3e\x00\x3e\x00\xff\xff\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x80\x00\x80\x00\x80\x00\x80\x00\x80\x00\x80\x00\x80\x00\x80\x00\x80\x00\x80\x00\x80\x00\x80\x00\x80\x00\x80\x00\x80\x00\x80\x00\x80\x00\x80\x00\x80\x00\x80\x00\x80\x00\x80\x00\x80\x00\x80\x00\x80\x00\x80\x00\x80\x00\x80\x00\x80\x00\x80\x00\x80\x00\x80\x00\x80\x00\x80\x00\x80\x00\x80\x00\x80\x00\x80\x00\x80\x00\x80\x00\x80\x00\x80\x00\x80\x00\x80\x00\x80\x00\x80\x00\x80\x00\x80\x00\x80\x00\x80\x00\x80\x00\x80\x00\x80\x00\x80\x00\x80\x00\x80\x00\x80\x00\x80\x00\x80\x00\x80\x00\x80\x00\x80\x00\x80\x00\x80\x00\x80\x00\x80\x00\x80\x00\x80\x00\x80\x00\xff\xff\xff\xff\x99\x00\x9d\x00\x99\x00\x9d\x00\x9d\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\xff\xff\xff\xff\xff\xff\xff\xff\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x8e\x00\x48\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\x27\x00\x27\x00\x29\x00\x29\x00\xff\xff\x2b\x00\x2b\x00\x2d\x00\x2d\x00\x32\x00\x32\x00\x35\x00\x35\x00\x38\x00\x38\x00\x3d\x00\x3d\x00\xff\xff\xad\x00\xad\x00\xad\x00\x8e\x00\x8e\x00\x8e\x00\x48\x00\x48\x00\x48\x00\x3e\x00\xff\xff\x3e\x00\x3e\x00\x3e\x00\xff\xff\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x8e\x00\x8e\x00\x8e\x00\x8e\x00\x8e\x00\x8e\x00\x8e\x00\x8e\x00\x8e\x00\x8e\x00\x8e\x00\x8e\x00\x8e\x00\x8e\x00\x8e\x00\x8e\x00\x8e\x00\x8e\x00\x8e\x00\x8e\x00\x8e\x00\x8e\x00\x8e\x00\x8e\x00\x8e\x00\x8e\x00\x8e\x00\x8e\x00\x8e\x00\x8e\x00\x8e\x00\x8e\x00\x8e\x00\x8e\x00\x8e\x00\x8e\x00\x8e\x00\x8e\x00\x8e\x00\x8e\x00\x8e\x00\x8e\x00\x8e\x00\x8e\x00\x8e\x00\x8e\x00\x8e\x00\x8e\x00\x8e\x00\x8e\x00\x8e\x00\x8e\x00\x8e\x00\x8e\x00\x8e\x00\x8e\x00\x8e\x00\x8e\x00\x8e\x00\x8e\x00\x8e\x00\x8e\x00\x8e\x00\x8e\x00\x8e\x00\x8e\x00\x8e\x00\x8e\x00\x8e\x00\x8e\x00\x8e\x00\x8e\x00\x8e\x00\x8e\x00\x8e\x00\x8e\x00\x8e\x00\x8e\x00\x8e\x00\x8e\x00\x8e\x00\x8e\x00\x8e\x00\x8e\x00\x8e\x00\x8e\x00\x8e\x00\x8e\x00\x8e\x00\xff\xff\xff\xff\xad\x00\xb1\x00\xad\x00\xb1\x00\xb1\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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,366) [[],[(AlexAccPred (alex_action_29) ( not' eof ))],[],[(AlexAcc (alex_action_32))],[],[(AlexAcc (alex_action_31))],[],[(AlexAccPred (alex_action_4) ( eof ))],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[(AlexAccSkip)],[(AlexAccPred (alex_action_0) (alexRightContext 58)),(AlexAccPred (alex_action_1) ( keepComments )),(AlexAccSkip)],[(AlexAccPred (alex_action_1) ( keepComments )),(AlexAccSkip)],[(AlexAccPred (alex_action_1) ( keepComments )),(AlexAccSkip)],[(AlexAccPred (alex_action_1) ( keepComments )),(AlexAccSkip)],[(AlexAccPred (alex_action_1) ( keepComments )),(AlexAccSkip)],[(AlexAccPred (alex_action_1) ( keepComments )),(AlexAccSkip)],[(AlexAccPred (alex_action_1) ( keepComments )),(AlexAccSkip)],[(AlexAccPred (alex_action_1) ( keepComments )),(AlexAccSkip)],[(AlexAccPred (alex_action_1) ( keepComments )),(AlexAccSkip)],[(AlexAccPred (alex_action_1) ( keepComments )),(AlexAccSkip)],[(AlexAccPred (alex_action_1) ( keepComments )),(AlexAccSkip)],[(AlexAccPred (alex_action_1) ( keepComments )),(AlexAccSkip)],[(AlexAccPred (alex_action_1) ( keepComments )),(AlexAccSkip)],[(AlexAccPred (alex_action_1) ( keepComments )),(AlexAccSkip)],[(AlexAccSkip)],[(AlexAccPred (alex_action_5) ( inState code ))],[(AlexAccSkip)],[(AlexAccSkip)],[(AlexAcc (alex_action_8))],[(AlexAcc (alex_action_9))],[(AlexAcc (alex_action_10))],[(AlexAcc (alex_action_11))],[(AlexAcc (alex_action_12))],[(AlexAcc (alex_action_13))],[(AlexAcc (alex_action_14))],[(AlexAcc (alex_action_15))],[(AlexAcc (alex_action_16))],[(AlexAcc (alex_action_17))],[(AlexAcc (alex_action_18))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_20))],[(AlexAcc (alex_action_21))],[(AlexAcc (alex_action_22))],[(AlexAcc (alex_action_23))],[(AlexAcc (alex_action_23))],[(AlexAcc (alex_action_23))],[(AlexAcc (alex_action_23))],[(AlexAcc (alex_action_23))],[(AlexAcc (alex_action_23))],[(AlexAcc (alex_action_23))],[(AlexAcc (alex_action_23))],[(AlexAcc (alex_action_23))],[(AlexAcc (alex_action_23))],[(AlexAcc (alex_action_23))],[(AlexAcc (alex_action_23))],[(AlexAcc (alex_action_23))],[(AlexAcc (alex_action_23))],[(AlexAcc (alex_action_23))],[(AlexAcc (alex_action_23))],[(AlexAcc (alex_action_23))],[(AlexAcc (alex_action_23))],[(AlexAcc (alex_action_23))],[(AlexAcc (alex_action_23))],[(AlexAcc (alex_action_23))],[(AlexAcc (alex_action_23))],[(AlexAcc (alex_action_23))],[(AlexAcc (alex_action_23))],[(AlexAcc (alex_action_23))],[(AlexAcc (alex_action_23))],[(AlexAcc (alex_action_23))],[(AlexAcc (alex_action_23))],[(AlexAcc (alex_action_23))],[(AlexAcc (alex_action_23))],[(AlexAcc (alex_action_23))],[(AlexAcc (alex_action_23))],[(AlexAcc (alex_action_23))],[(AlexAcc (alex_action_23))],[(AlexAcc (alex_action_23))],[(AlexAcc (alex_action_23))],[(AlexAcc (alex_action_23))],[(AlexAcc (alex_action_23))],[(AlexAcc (alex_action_23))],[(AlexAcc (alex_action_23))],[(AlexAcc (alex_action_23))],[(AlexAcc (alex_action_23))],[(AlexAcc (alex_action_23))],[(AlexAcc (alex_action_23))],[(AlexAcc (alex_action_23))],[(AlexAcc (alex_action_23))],[(AlexAcc (alex_action_23))],[(AlexAcc (alex_action_23))],[(AlexAcc (alex_action_23))],[(AlexAcc (alex_action_23))],[(AlexAcc (alex_action_23))],[(AlexAcc (alex_action_23))],[(AlexAcc (alex_action_23))],[(AlexAcc (alex_action_23))],[(AlexAcc (alex_action_23))],[(AlexAccPred (alex_action_24) ( not' (followedBy '#') ))],[(AlexAccPred (alex_action_24) ( not' (followedBy '#') ))],[(AlexAccPred (alex_action_25) ( keepComments .&&. (followedBy '\n' .||. eof) )),(AlexAccSkipPred ( followedBy '\n' .||. eof ))],[(AlexAccPred (alex_action_25) ( keepComments .&&. (followedBy '\n' .||. eof) )),(AlexAccSkipPred ( followedBy '\n' .||. eof ))],[(AlexAccPred (alex_action_25) ( keepComments .&&. (followedBy '\n' .||. eof) )),(AlexAccSkipPred ( followedBy '\n' .||. eof ))],[(AlexAccPred (alex_action_25) ( keepComments .&&. (followedBy '\n' .||. eof) )),(AlexAccSkipPred ( followedBy '\n' .||. eof ))],[(AlexAccPred (alex_action_25) ( keepComments .&&. (followedBy '\n' .||. eof) )),(AlexAccSkipPred ( followedBy '\n' .||. eof )),(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_27))],[(AlexAccSkip)],[(AlexAccSkip)],[(AlexAcc (alex_action_33))],[(AlexAcc (alex_action_34))],[(AlexAcc (alex_action_35))],[(AlexAcc (alex_action_36))],[(AlexAcc (alex_action_37))],[(AlexAcc (alex_action_38))],[(AlexAcc (alex_action_39))],[(AlexAcc (alex_action_40))],[(AlexAcc (alex_action_41))],[(AlexAcc (alex_action_42))],[(AlexAcc (alex_action_43))],[(AlexAcc (alex_action_44))],[(AlexAcc (alex_action_45))],[(AlexAcc (alex_action_46))],[(AlexAcc (alex_action_47))],[(AlexAcc (alex_action_48))],[(AlexAcc (alex_action_49))],[(AlexAcc (alex_action_50))],[(AlexAcc (alex_action_51))],[(AlexAcc (alex_action_52))],[(AlexAcc (alex_action_53))],[(AlexAcc (alex_action_54))],[(AlexAcc (alex_action_55))],[(AlexAcc (alex_action_56))],[(AlexAcc (alex_action_57))],[(AlexAcc (alex_action_57))],[(AlexAcc (alex_action_57))],[(AlexAcc (alex_action_58))],[(AlexAcc (alex_action_59))],[(AlexAcc (alex_action_60))],[(AlexAcc (alex_action_61))],[(AlexAcc (alex_action_62))],[(AlexAcc (alex_action_63))],[(AlexAcc (alex_action_64))],[(AlexAcc (alex_action_65))],[(AlexAcc (alex_action_66))],[(AlexAcc (alex_action_67))],[(AlexAcc (alex_action_68))],[(AlexAcc (alex_action_69))],[(AlexAcc (alex_action_70))],[(AlexAcc (alex_action_71))],[(AlexAcc (alex_action_72))],[(AlexAcc (alex_action_73))],[(AlexAcc (alex_action_74))],[(AlexAcc (alex_action_75))],[(AlexAcc (alex_action_76))],[(AlexAcc (alex_action_77))],[(AlexAcc (alex_action_78))],[(AlexAcc (alex_action_79))],[(AlexAcc (alex_action_80))],[(AlexAcc (alex_action_81))],[(AlexAcc (alex_action_82))],[(AlexAccPred (alex_action_83) (alexRightContext 59))],[(AlexAcc (alex_action_84))],[(AlexAcc (alex_action_85))],[(AlexAcc (alex_action_86))],[(AlexAcc (alex_action_87))],[(AlexAcc (alex_action_88))],[(AlexAcc (alex_action_88))],[(AlexAcc (alex_action_88))],[(AlexAcc (alex_action_88))],[(AlexAcc (alex_action_88))],[(AlexAcc (alex_action_89))],[(AlexAcc (alex_action_89))],[(AlexAcc (alex_action_89))],[(AlexAcc (alex_action_89))],[(AlexAcc (alex_action_89))],[(AlexAcc (alex_action_89))],[(AlexAcc (alex_action_89))],[(AlexAcc (alex_action_89))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))]]-{-# LINE 208 "src/full/Agda/Syntax/Parser/Lexer.x" #-}+alex_accept = listArray (0::Int,408) [[],[(AlexAccPred (alex_action_30) ( not' eof ))],[],[(AlexAcc (alex_action_33))],[],[(AlexAcc (alex_action_32))],[],[(AlexAccPred (alex_action_4) ( eof ))],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[(AlexAccSkip)],[(AlexAccPred (alex_action_0) (alexRightContext 58)),(AlexAccPred (alex_action_1) ( keepComments )),(AlexAccSkip)],[(AlexAccPred (alex_action_1) ( keepComments )),(AlexAccSkip)],[(AlexAccPred (alex_action_1) ( keepComments )),(AlexAccSkip)],[(AlexAccPred (alex_action_1) ( keepComments )),(AlexAccSkip)],[(AlexAccPred (alex_action_1) ( keepComments )),(AlexAccSkip)],[(AlexAccPred (alex_action_1) ( keepComments )),(AlexAccSkip)],[(AlexAccPred (alex_action_1) ( keepComments )),(AlexAccSkip)],[(AlexAccPred (alex_action_1) ( keepComments )),(AlexAccSkip)],[(AlexAccPred (alex_action_1) ( keepComments )),(AlexAccSkip)],[(AlexAccPred (alex_action_1) ( keepComments )),(AlexAccSkip)],[(AlexAccPred (alex_action_1) ( keepComments )),(AlexAccSkip)],[(AlexAccPred (alex_action_1) ( keepComments )),(AlexAccSkip)],[(AlexAccPred (alex_action_1) ( keepComments )),(AlexAccSkip)],[(AlexAccPred (alex_action_1) ( keepComments )),(AlexAccSkip)],[(AlexAccSkip)],[(AlexAccPred (alex_action_5) ( inState code ))],[(AlexAccSkip)],[(AlexAccSkip)],[(AlexAcc (alex_action_8))],[(AlexAcc (alex_action_9))],[(AlexAcc (alex_action_10))],[(AlexAcc (alex_action_11))],[(AlexAcc (alex_action_12))],[(AlexAcc (alex_action_13))],[(AlexAcc (alex_action_14))],[(AlexAcc (alex_action_15))],[(AlexAcc (alex_action_16))],[(AlexAcc (alex_action_17))],[(AlexAcc (alex_action_18))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_20))],[(AlexAcc (alex_action_21))],[(AlexAcc (alex_action_22))],[(AlexAcc (alex_action_23))],[(AlexAcc (alex_action_24))],[(AlexAcc (alex_action_24))],[(AlexAcc (alex_action_24))],[(AlexAcc (alex_action_24))],[(AlexAcc (alex_action_24))],[(AlexAcc (alex_action_24))],[(AlexAcc (alex_action_24))],[(AlexAcc (alex_action_24))],[(AlexAcc (alex_action_24))],[(AlexAcc (alex_action_24))],[(AlexAcc (alex_action_24))],[(AlexAcc (alex_action_24))],[(AlexAcc (alex_action_24))],[(AlexAcc (alex_action_24))],[(AlexAcc (alex_action_24))],[(AlexAcc (alex_action_24))],[(AlexAcc (alex_action_24))],[(AlexAcc (alex_action_24))],[(AlexAcc (alex_action_24))],[(AlexAcc (alex_action_24))],[(AlexAcc (alex_action_24))],[(AlexAcc (alex_action_24))],[(AlexAcc (alex_action_24))],[(AlexAcc (alex_action_24))],[(AlexAcc (alex_action_24))],[(AlexAcc (alex_action_24))],[(AlexAcc (alex_action_24))],[(AlexAcc (alex_action_24))],[(AlexAcc (alex_action_24))],[(AlexAcc (alex_action_24))],[(AlexAcc (alex_action_24))],[(AlexAcc (alex_action_24))],[(AlexAcc (alex_action_24))],[(AlexAcc (alex_action_24))],[(AlexAcc (alex_action_24))],[(AlexAcc (alex_action_24))],[(AlexAcc (alex_action_24))],[(AlexAcc (alex_action_24))],[(AlexAcc (alex_action_24))],[(AlexAcc (alex_action_24))],[(AlexAcc (alex_action_24))],[(AlexAcc (alex_action_24))],[(AlexAcc (alex_action_24))],[(AlexAcc (alex_action_24))],[(AlexAcc (alex_action_24))],[(AlexAcc (alex_action_24))],[(AlexAcc (alex_action_24))],[(AlexAcc (alex_action_24))],[(AlexAcc (alex_action_24))],[(AlexAcc (alex_action_24))],[(AlexAcc (alex_action_24))],[(AlexAcc (alex_action_24))],[(AlexAcc (alex_action_24))],[(AlexAcc (alex_action_24))],[(AlexAcc (alex_action_24))],[(AlexAcc (alex_action_24))],[(AlexAcc (alex_action_24))],[(AlexAcc (alex_action_24))],[(AlexAcc (alex_action_24))],[(AlexAcc (alex_action_24))],[(AlexAcc (alex_action_24))],[(AlexAcc (alex_action_24))],[(AlexAcc (alex_action_24))],[(AlexAcc (alex_action_24))],[(AlexAcc (alex_action_24))],[(AlexAcc (alex_action_24))],[(AlexAcc (alex_action_24))],[(AlexAcc (alex_action_24))],[(AlexAcc (alex_action_24))],[(AlexAcc (alex_action_24))],[(AlexAcc (alex_action_24))],[(AlexAcc (alex_action_24))],[(AlexAcc (alex_action_24))],[(AlexAcc (alex_action_24))],[(AlexAccPred (alex_action_25) ( not' (followedBy '#') ))],[(AlexAccPred (alex_action_25) ( not' (followedBy '#') ))],[(AlexAccPred (alex_action_26) ( keepComments .&&. (followedBy '\n' .||. eof) )),(AlexAccSkipPred ( followedBy '\n' .||. eof ))],[(AlexAccPred (alex_action_26) ( keepComments .&&. (followedBy '\n' .||. eof) )),(AlexAccSkipPred ( followedBy '\n' .||. eof ))],[(AlexAccPred (alex_action_26) ( keepComments .&&. (followedBy '\n' .||. eof) )),(AlexAccSkipPred ( followedBy '\n' .||. eof ))],[(AlexAccPred (alex_action_26) ( keepComments .&&. (followedBy '\n' .||. eof) )),(AlexAccSkipPred ( followedBy '\n' .||. eof ))],[(AlexAccPred (alex_action_26) ( keepComments .&&. (followedBy '\n' .||. eof) )),(AlexAccSkipPred ( followedBy '\n' .||. eof )),(AlexAcc (alex_action_94))],[(AlexAcc (alex_action_28))],[(AlexAccSkip)],[(AlexAccSkip)],[(AlexAcc (alex_action_34))],[(AlexAcc (alex_action_35))],[(AlexAcc (alex_action_36))],[(AlexAcc (alex_action_37))],[(AlexAcc (alex_action_38))],[(AlexAcc (alex_action_39))],[(AlexAcc (alex_action_40))],[(AlexAcc (alex_action_41))],[(AlexAcc (alex_action_42))],[(AlexAcc (alex_action_43))],[(AlexAcc (alex_action_44))],[(AlexAcc (alex_action_45))],[(AlexAcc (alex_action_46))],[(AlexAcc (alex_action_47))],[(AlexAcc (alex_action_48))],[(AlexAcc (alex_action_49))],[(AlexAcc (alex_action_50))],[(AlexAcc (alex_action_51))],[(AlexAcc (alex_action_52))],[(AlexAcc (alex_action_53))],[(AlexAcc (alex_action_54))],[(AlexAcc (alex_action_55))],[(AlexAcc (alex_action_56))],[(AlexAcc (alex_action_57))],[(AlexAcc (alex_action_58))],[(AlexAcc (alex_action_59))],[(AlexAcc (alex_action_60))],[(AlexAcc (alex_action_60))],[(AlexAcc (alex_action_60))],[(AlexAcc (alex_action_61))],[(AlexAcc (alex_action_62))],[(AlexAcc (alex_action_63))],[(AlexAcc (alex_action_64))],[(AlexAcc (alex_action_65))],[(AlexAcc (alex_action_66))],[(AlexAcc (alex_action_67))],[(AlexAcc (alex_action_68))],[(AlexAcc (alex_action_69))],[(AlexAcc (alex_action_70))],[(AlexAcc (alex_action_71))],[(AlexAcc (alex_action_72))],[(AlexAcc (alex_action_73))],[(AlexAcc (alex_action_74))],[(AlexAcc (alex_action_75))],[(AlexAcc (alex_action_76))],[(AlexAcc (alex_action_77))],[(AlexAcc (alex_action_78))],[(AlexAcc (alex_action_79))],[(AlexAcc (alex_action_80))],[(AlexAcc (alex_action_81))],[(AlexAcc (alex_action_82))],[(AlexAcc (alex_action_83))],[(AlexAcc (alex_action_84))],[(AlexAcc (alex_action_85))],[(AlexAcc (alex_action_86))],[(AlexAccPred (alex_action_87) (alexRightContext 59))],[(AlexAcc (alex_action_88))],[(AlexAcc (alex_action_89))],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_91))],[(AlexAcc (alex_action_92))],[(AlexAcc (alex_action_92))],[(AlexAcc (alex_action_92))],[(AlexAcc (alex_action_92))],[(AlexAcc (alex_action_92))],[(AlexAcc (alex_action_93))],[(AlexAcc (alex_action_93))],[(AlexAcc (alex_action_93))],[(AlexAcc (alex_action_93))],[(AlexAcc (alex_action_93))],[(AlexAcc (alex_action_93))],[(AlexAcc (alex_action_93))],[(AlexAcc (alex_action_93))],[(AlexAcc (alex_action_94))],[(AlexAcc (alex_action_94))],[(AlexAcc (alex_action_94))],[(AlexAcc (alex_action_94))],[(AlexAcc (alex_action_94))],[(AlexAcc (alex_action_94))],[(AlexAcc (alex_action_94))],[(AlexAcc (alex_action_94))],[(AlexAcc (alex_action_94))],[(AlexAcc (alex_action_94))],[(AlexAcc (alex_action_94))],[(AlexAcc (alex_action_94))],[(AlexAcc (alex_action_94))],[(AlexAcc (alex_action_94))],[(AlexAcc (alex_action_94))],[(AlexAcc (alex_action_94))],[(AlexAcc (alex_action_94))],[(AlexAcc (alex_action_94))],[(AlexAcc (alex_action_94))],[(AlexAcc (alex_action_94))],[(AlexAcc (alex_action_94))],[(AlexAcc (alex_action_94))],[(AlexAcc (alex_action_94))],[(AlexAcc (alex_action_94))],[(AlexAcc (alex_action_94))],[(AlexAcc (alex_action_94))],[(AlexAcc (alex_action_94))],[(AlexAcc (alex_action_94))],[(AlexAcc (alex_action_94))],[(AlexAcc (alex_action_94))],[(AlexAcc (alex_action_94))],[(AlexAcc (alex_action_94))],[(AlexAcc (alex_action_94))],[(AlexAcc (alex_action_94))],[(AlexAcc (alex_action_94))],[(AlexAcc (alex_action_94))],[(AlexAcc (alex_action_94))],[(AlexAcc (alex_action_94))],[(AlexAcc (alex_action_94))],[(AlexAcc (alex_action_94))],[(AlexAcc (alex_action_94))],[(AlexAcc (alex_action_94))],[(AlexAcc (alex_action_94))],[(AlexAcc (alex_action_94))],[(AlexAcc (alex_action_94))],[(AlexAcc (alex_action_94))],[(AlexAcc (alex_action_94))],[(AlexAcc (alex_action_94))],[(AlexAcc (alex_action_94))],[(AlexAcc (alex_action_94))],[(AlexAcc (alex_action_94))],[(AlexAcc (alex_action_94))],[(AlexAcc (alex_action_94))],[(AlexAcc (alex_action_94))],[(AlexAcc (alex_action_94))],[(AlexAcc (alex_action_94))],[(AlexAcc (alex_action_94))],[(AlexAcc (alex_action_94))],[(AlexAcc (alex_action_94))],[(AlexAcc (alex_action_94))],[(AlexAcc (alex_action_94))],[(AlexAcc (alex_action_94))],[(AlexAcc (alex_action_94))],[(AlexAcc (alex_action_94))],[(AlexAcc (alex_action_94))],[(AlexAcc (alex_action_94))],[(AlexAcc (alex_action_94))],[(AlexAcc (alex_action_94))],[(AlexAcc (alex_action_94))],[(AlexAcc (alex_action_94))],[(AlexAcc (alex_action_94))],[(AlexAcc (alex_action_94))],[(AlexAcc (alex_action_94))],[(AlexAcc (alex_action_94))],[(AlexAcc (alex_action_94))],[(AlexAcc (alex_action_94))],[(AlexAcc (alex_action_94))],[(AlexAcc (alex_action_94))],[(AlexAcc (alex_action_94))],[(AlexAcc (alex_action_94))],[(AlexAcc (alex_action_94))],[(AlexAcc (alex_action_94))],[(AlexAcc (alex_action_94))],[(AlexAcc (alex_action_94))],[(AlexAcc (alex_action_94))],[(AlexAcc (alex_action_94))],[(AlexAcc (alex_action_94))],[(AlexAcc (alex_action_94))],[(AlexAcc (alex_action_94))],[(AlexAcc (alex_action_94))],[(AlexAcc (alex_action_94))],[(AlexAcc (alex_action_94))],[(AlexAcc (alex_action_94))],[(AlexAcc (alex_action_94))],[(AlexAcc (alex_action_94))],[(AlexAcc (alex_action_94))],[(AlexAcc (alex_action_94))],[(AlexAcc (alex_action_94))],[(AlexAcc (alex_action_94))],[(AlexAcc (alex_action_94))],[(AlexAcc (alex_action_94))],[(AlexAcc (alex_action_94))],[(AlexAcc (alex_action_94))],[(AlexAcc (alex_action_94))],[(AlexAcc (alex_action_94))],[(AlexAcc (alex_action_94))],[(AlexAcc (alex_action_94))],[(AlexAcc (alex_action_94))],[(AlexAcc (alex_action_94))],[(AlexAcc (alex_action_94))],[(AlexAcc (alex_action_94))],[(AlexAcc (alex_action_94))],[(AlexAcc (alex_action_94))],[(AlexAcc (alex_action_94))],[(AlexAcc (alex_action_94))],[(AlexAcc (alex_action_94))],[(AlexAcc (alex_action_94))],[(AlexAcc (alex_action_94))],[(AlexAcc (alex_action_94))],[(AlexAcc (alex_action_94))],[(AlexAcc (alex_action_94))],[(AlexAcc (alex_action_94))],[(AlexAcc (alex_action_94))],[(AlexAcc (alex_action_94))],[(AlexAcc (alex_action_94))],[(AlexAcc (alex_action_94))],[(AlexAcc (alex_action_94))],[(AlexAcc (alex_action_94))],[(AlexAcc (alex_action_94))],[(AlexAcc (alex_action_94))],[(AlexAcc (alex_action_94))],[(AlexAcc (alex_action_94))],[(AlexAcc (alex_action_94))],[(AlexAcc (alex_action_94))],[(AlexAcc (alex_action_94))],[(AlexAcc (alex_action_94))],[(AlexAcc (alex_action_94))],[(AlexAcc (alex_action_94))],[(AlexAcc (alex_action_94))],[(AlexAcc (alex_action_94))],[(AlexAcc (alex_action_94))],[(AlexAcc (alex_action_94))],[(AlexAcc (alex_action_94))],[(AlexAcc (alex_action_94))],[(AlexAcc (alex_action_94))],[(AlexAcc (alex_action_94))],[(AlexAcc (alex_action_94))],[(AlexAcc (alex_action_94))],[(AlexAcc (alex_action_94))],[(AlexAcc (alex_action_94))],[(AlexAcc (alex_action_94))],[(AlexAcc (alex_action_94))],[(AlexAcc (alex_action_94))],[(AlexAcc (alex_action_94))],[(AlexAcc (alex_action_94))]]+{-# LINE 212 "src/full/Agda/Syntax/Parser/Lexer.x" #-} -- | This is the initial state for parsing a literate file. Code blocks@@ -164,76 +164,80 @@ alex_action_19 = keyword KwIMPORT alex_action_20 = keyword KwIMPOSSIBLE alex_action_21 = keyword KwETA -alex_action_22 = keyword KwLINE -alex_action_23 = withInterval $ TokString -alex_action_24 = nestedComment -alex_action_25 = withInterval TokComment -alex_action_27 = begin bol_ -alex_action_29 = offsideRule -alex_action_31 = endWith newLayoutContext -alex_action_32 = emptyLayout -alex_action_33 = keyword KwLet -alex_action_34 = keyword KwIn -alex_action_35 = keyword KwWhere -alex_action_36 = keyword KwField -alex_action_37 = keyword KwWith -alex_action_38 = keyword KwRewrite -alex_action_39 = keyword KwPostulate -alex_action_40 = keyword KwPrimitive -alex_action_41 = keyword KwOpen -alex_action_42 = keyword KwImport -alex_action_43 = keyword KwModule -alex_action_44 = keyword KwData -alex_action_45 = keyword KwCoData -alex_action_46 = keyword KwRecord -alex_action_47 = keyword KwConstructor -alex_action_48 = keyword KwInfix -alex_action_49 = keyword KwInfixL -alex_action_50 = keyword KwInfixR -alex_action_51 = keyword KwMutual -alex_action_52 = keyword KwAbstract -alex_action_53 = keyword KwPrivate -alex_action_54 = keyword KwSet -alex_action_55 = keyword KwProp -alex_action_56 = keyword KwForall -alex_action_57 = withInterval' (read . drop 3) TokSetN -alex_action_58 = keyword KwQuoteGoal -alex_action_59 = keyword KwQuote -alex_action_60 = keyword KwQuoteTerm -alex_action_61 = keyword KwUnquote -alex_action_62 = keyword KwSyntax -alex_action_63 = keyword KwUsing -alex_action_64 = keyword KwHiding -alex_action_65 = keyword KwRenaming -alex_action_66 = endWith $ keyword KwTo -alex_action_67 = keyword KwPublic -alex_action_68 = hole -alex_action_69 = symbol SymEllipsis -alex_action_70 = symbol SymDotDot -alex_action_71 = symbol SymDot -alex_action_72 = symbol SymSemi -alex_action_73 = symbol SymColon -alex_action_74 = symbol SymEqual -alex_action_75 = symbol SymUnderscore -alex_action_76 = symbol SymQuestionMark -alex_action_77 = symbol SymBar -alex_action_78 = symbol SymOpenParen -alex_action_79 = symbol SymCloseParen -alex_action_80 = symbol SymArrow -alex_action_81 = symbol SymLambda -alex_action_82 = symbol SymAs -alex_action_83 = symbol SymDoubleOpenBrace -alex_action_84 = symbol SymOpenBrace -alex_action_85 = symbol SymCloseBrace -alex_action_86 = litChar -alex_action_87 = litString -alex_action_88 = literal LitInt -alex_action_89 = literal LitFloat -alex_action_90 = identifier +alex_action_22 = keyword KwNO_TERMINATION_CHECK +alex_action_23 = keyword KwLINE +alex_action_24 = withInterval $ TokString +alex_action_25 = nestedComment +alex_action_26 = withInterval TokComment +alex_action_28 = begin bol_ +alex_action_30 = offsideRule +alex_action_32 = endWith newLayoutContext +alex_action_33 = emptyLayout +alex_action_34 = keyword KwLet +alex_action_35 = keyword KwIn +alex_action_36 = keyword KwWhere +alex_action_37 = keyword KwField +alex_action_38 = keyword KwWith +alex_action_39 = keyword KwRewrite +alex_action_40 = keyword KwPostulate +alex_action_41 = keyword KwPrimitive +alex_action_42 = keyword KwOpen +alex_action_43 = keyword KwImport +alex_action_44 = keyword KwModule +alex_action_45 = keyword KwData +alex_action_46 = keyword KwCoData +alex_action_47 = keyword KwRecord +alex_action_48 = keyword KwConstructor +alex_action_49 = keyword KwInductive +alex_action_50 = keyword KwCoInductive +alex_action_51 = keyword KwInfix +alex_action_52 = keyword KwInfixL +alex_action_53 = keyword KwInfixR +alex_action_54 = keyword KwMutual +alex_action_55 = keyword KwAbstract +alex_action_56 = keyword KwPrivate +alex_action_57 = keyword KwSet +alex_action_58 = keyword KwProp +alex_action_59 = keyword KwForall +alex_action_60 = withInterval' (read . drop 3) TokSetN +alex_action_61 = keyword KwQuoteGoal +alex_action_62 = keyword KwQuote +alex_action_63 = keyword KwQuoteTerm +alex_action_64 = keyword KwUnquote +alex_action_65 = keyword KwSyntax +alex_action_66 = keyword KwPatternSyn +alex_action_67 = keyword KwUsing +alex_action_68 = keyword KwHiding +alex_action_69 = keyword KwRenaming +alex_action_70 = endWith $ keyword KwTo +alex_action_71 = keyword KwPublic +alex_action_72 = hole +alex_action_73 = symbol SymEllipsis +alex_action_74 = symbol SymDotDot +alex_action_75 = symbol SymDot +alex_action_76 = symbol SymSemi +alex_action_77 = symbol SymColon +alex_action_78 = symbol SymEqual +alex_action_79 = symbol SymUnderscore +alex_action_80 = symbol SymQuestionMark +alex_action_81 = symbol SymBar +alex_action_82 = symbol SymOpenParen +alex_action_83 = symbol SymCloseParen +alex_action_84 = symbol SymArrow +alex_action_85 = symbol SymLambda +alex_action_86 = symbol SymAs +alex_action_87 = symbol SymDoubleOpenBrace +alex_action_88 = symbol SymOpenBrace +alex_action_89 = symbol SymCloseBrace +alex_action_90 = litChar +alex_action_91 = litString +alex_action_92 = literal LitInt +alex_action_93 = literal LitFloat +alex_action_94 = identifier {-# LINE 1 "templates/GenericTemplate.hs" #-} {-# LINE 1 "templates/GenericTemplate.hs" #-} {-# LINE 1 "<built-in>" #-}-{-# LINE 1 "<command-line>" #-}+{-# LINE 1 "<command line>" #-} {-# LINE 1 "templates/GenericTemplate.hs" #-} -- ----------------------------------------------------------------------------- -- ALEX TEMPLATE
dist/build/Agda/Syntax/Parser/Parser.hs view
@@ -2,4789 +2,5049 @@ {-# OPTIONS -fglasgow-exts -cpp #-} {-# OPTIONS_GHC -fno-warn-incomplete-patterns -fno-warn-deprecated-flags #-}-{-# LANGUAGE BangPatterns #-}-{-| The parser is generated by Happy (<http://www.haskell.org/happy>).--}-module Agda.Syntax.Parser.Parser (- moduleParser- , exprParser- , tokensParser- , tests- ) where--import Control.Arrow-import Control.Monad-import Control.Monad.State-import Data.Char-import Data.List-import Data.Maybe-import qualified Data.Traversable as T--import Agda.Syntax.Position hiding (tests)-import Agda.Syntax.Parser.Monad-import Agda.Syntax.Parser.Lexer-import Agda.Syntax.Parser.Tokens-import Agda.Syntax.Concrete-import Agda.Syntax.Concrete.Name-import Agda.Syntax.Concrete.Pretty-import Agda.Syntax.Common-import Agda.Syntax.Fixity-import Agda.Syntax.Notation-import Agda.Syntax.Literal--import Agda.Utils.Monad-import Agda.Utils.QuickCheck-import Agda.Utils.TestHelpers-import qualified Data.Array as Happy_Data_Array-import qualified GHC.Exts as Happy_GHC_Exts---- parser produced by Happy Version 1.18.9--newtype HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70 = HappyAbsSyn HappyAny-#if __GLASGOW_HASKELL__ >= 607-type HappyAny = Happy_GHC_Exts.Any-#else-type HappyAny = forall a . a-#endif-happyIn6 :: ([Token]) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)-happyIn6 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn6 #-}-happyOut6 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> ([Token])-happyOut6 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut6 #-}-happyIn7 :: ([Token]) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)-happyIn7 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn7 #-}-happyOut7 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> ([Token])-happyOut7 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut7 #-}-happyIn8 :: (Token) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)-happyIn8 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn8 #-}-happyOut8 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> (Token)-happyOut8 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut8 #-}-happyIn9 :: (([Pragma], [Declaration])) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)-happyIn9 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn9 #-}-happyOut9 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> (([Pragma], [Declaration]))-happyOut9 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut9 #-}-happyIn10 :: t10 -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)-happyIn10 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn10 #-}-happyOut10 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> t10-happyOut10 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut10 #-}-happyIn11 :: t11 -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)-happyIn11 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn11 #-}-happyOut11 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> t11-happyOut11 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut11 #-}-happyIn12 :: t12 -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)-happyIn12 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn12 #-}-happyOut12 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> t12-happyOut12 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut12 #-}-happyIn13 :: (()) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)-happyIn13 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn13 #-}-happyOut13 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> (())-happyOut13 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut13 #-}-happyIn14 :: (Integer) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)-happyIn14 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn14 #-}-happyOut14 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> (Integer)-happyOut14 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut14 #-}-happyIn15 :: (Name) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)-happyIn15 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn15 #-}-happyOut15 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> (Name)-happyOut15 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut15 #-}-happyIn16 :: ([Name]) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)-happyIn16 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn16 #-}-happyOut16 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> ([Name])-happyOut16 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut16 #-}-happyIn17 :: (Range) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)-happyIn17 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn17 #-}-happyOut17 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> (Range)-happyOut17 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut17 #-}-happyIn18 :: (Arg Name) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)-happyIn18 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn18 #-}-happyOut18 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> (Arg Name)-happyOut18 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut18 #-}-happyIn19 :: ([Arg Name]) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)-happyIn19 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn19 #-}-happyOut19 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> ([Arg Name])-happyOut19 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut19 #-}-happyIn20 :: ([Arg Name]) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)-happyIn20 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn20 #-}-happyOut20 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> ([Arg Name])-happyOut20 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut20 #-}-happyIn21 :: (QName) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)-happyIn21 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn21 #-}-happyOut21 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> (QName)-happyOut21 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut21 #-}-happyIn22 :: (QName) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)-happyIn22 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn22 #-}-happyOut22 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> (QName)-happyOut22 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut22 #-}-happyIn23 :: (Name) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)-happyIn23 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn23 #-}-happyOut23 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> (Name)-happyOut23 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut23 #-}-happyIn24 :: ([Name]) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)-happyIn24 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn24 #-}-happyOut24 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> ([Name])-happyOut24 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut24 #-}-happyIn25 :: ([Name]) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)-happyIn25 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn25 #-}-happyOut25 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> ([Name])-happyOut25 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut25 #-}-happyIn26 :: (Either [Name] [Expr]) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)-happyIn26 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn26 #-}-happyOut26 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> (Either [Name] [Expr])-happyOut26 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut26 #-}-happyIn27 :: ([String]) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)-happyIn27 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn27 #-}-happyOut27 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> ([String])-happyOut27 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut27 #-}-happyIn28 :: (QName) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)-happyIn28 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn28 #-}-happyOut28 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> (QName)-happyOut28 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut28 #-}-happyIn29 :: (Expr) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)-happyIn29 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn29 #-}-happyOut29 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> (Expr)-happyOut29 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut29 #-}-happyIn30 :: t30 -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)-happyIn30 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn30 #-}-happyOut30 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> t30-happyOut30 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut30 #-}-happyIn31 :: ([Expr]) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)-happyIn31 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn31 #-}-happyOut31 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> ([Expr])-happyOut31 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut31 #-}-happyIn32 :: ([Expr]) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)-happyIn32 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn32 #-}-happyOut32 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> ([Expr])-happyOut32 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut32 #-}-happyIn33 :: t33 -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)-happyIn33 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn33 #-}-happyOut33 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> t33-happyOut33 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut33 #-}-happyIn34 :: ([Expr]) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)-happyIn34 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn34 #-}-happyOut34 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> ([Expr])-happyOut34 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut34 #-}-happyIn35 :: t35 -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)-happyIn35 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn35 #-}-happyOut35 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> t35-happyOut35 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut35 #-}-happyIn36 :: t36 -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)-happyIn36 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn36 #-}-happyOut36 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> t36-happyOut36 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut36 #-}-happyIn37 :: t37 -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)-happyIn37 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn37 #-}-happyOut37 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> t37-happyOut37 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut37 #-}-happyIn38 :: ([(Name, Expr)]) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)-happyIn38 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn38 #-}-happyOut38 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> ([(Name, Expr)])-happyOut38 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut38 #-}-happyIn39 :: ([(Name, Expr)]) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)-happyIn39 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn39 #-}-happyOut39 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> ([(Name, Expr)])-happyOut39 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut39 #-}-happyIn40 :: ((Name, Expr)) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)-happyIn40 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn40 #-}-happyOut40 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> ((Name, Expr))-happyOut40 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut40 #-}-happyIn41 :: t41 -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)-happyIn41 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn41 #-}-happyOut41 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> t41-happyOut41 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut41 #-}-happyIn42 :: t42 -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)-happyIn42 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn42 #-}-happyOut42 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> t42-happyOut42 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut42 #-}-happyIn43 :: ([TypedBindings]) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)-happyIn43 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn43 #-}-happyOut43 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> ([TypedBindings])-happyOut43 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut43 #-}-happyIn44 :: (TypedBindings) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)-happyIn44 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn44 #-}-happyOut44 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> (TypedBindings)-happyOut44 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut44 #-}-happyIn45 :: (TypedBinding) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)-happyIn45 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn45 #-}-happyOut45 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> (TypedBinding)-happyOut45 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut45 #-}-happyIn46 :: ([LamBinding]) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)-happyIn46 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn46 #-}-happyOut46 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> ([LamBinding])-happyOut46 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut46 #-}-happyIn47 :: (Either ([LamBinding], Hiding) [Expr]) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)-happyIn47 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn47 #-}-happyOut47 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> (Either ([LamBinding], Hiding) [Expr])-happyOut47 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut47 #-}-happyIn48 :: ([Either Hiding LamBinding]) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)-happyIn48 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn48 #-}-happyOut48 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> ([Either Hiding LamBinding])-happyOut48 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut48 #-}-happyIn49 :: (Either [Either Hiding LamBinding] [Expr]) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)-happyIn49 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn49 #-}-happyOut49 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> (Either [Either Hiding LamBinding] [Expr])-happyOut49 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut49 #-}-happyIn50 :: ((LHS,RHS,WhereClause)) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)-happyIn50 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn50 #-}-happyOut50 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> ((LHS,RHS,WhereClause))-happyOut50 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut50 #-}-happyIn51 :: ((LHS,RHS,WhereClause)) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)-happyIn51 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn51 #-}-happyOut51 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> ((LHS,RHS,WhereClause))-happyOut51 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut51 #-}-happyIn52 :: ((LHS,RHS,WhereClause)) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)-happyIn52 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn52 #-}-happyOut52 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> ((LHS,RHS,WhereClause))-happyOut52 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut52 #-}-happyIn53 :: ([(LHS,RHS,WhereClause)]) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)-happyIn53 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn53 #-}-happyOut53 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> ([(LHS,RHS,WhereClause)])-happyOut53 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut53 #-}-happyIn54 :: ([LamBinding]) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)-happyIn54 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn54 #-}-happyOut54 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> ([LamBinding])-happyOut54 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut54 #-}-happyIn55 :: ([LamBinding]) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)-happyIn55 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn55 #-}-happyOut55 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> ([LamBinding])-happyOut55 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut55 #-}-happyIn56 :: ([LamBinding]) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)-happyIn56 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn56 #-}-happyOut56 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> ([LamBinding])-happyOut56 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut56 #-}-happyIn57 :: ([LamBinding]) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)-happyIn57 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn57 #-}-happyOut57 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> ([LamBinding])-happyOut57 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut57 #-}-happyIn58 :: (Either [LamBinding] [Expr]) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)-happyIn58 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn58 #-}-happyOut58 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> (Either [LamBinding] [Expr])-happyOut58 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut58 #-}-happyIn59 :: ((Maybe AsName, ImportDirective)) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)-happyIn59 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn59 #-}-happyOut59 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> ((Maybe AsName, ImportDirective))-happyOut59 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut59 #-}-happyIn60 :: (ImportDirective) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)-happyIn60 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn60 #-}-happyOut60 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> (ImportDirective)-happyOut60 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut60 #-}-happyIn61 :: (ImportDirective) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)-happyIn61 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn61 #-}-happyOut61 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> (ImportDirective)-happyOut61 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut61 #-}-happyIn62 :: (ImportDirective) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)-happyIn62 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn62 #-}-happyOut62 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> (ImportDirective)-happyOut62 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut62 #-}-happyIn63 :: ((UsingOrHiding , Range)) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)-happyIn63 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn63 #-}-happyOut63 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> ((UsingOrHiding , Range))-happyOut63 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut63 #-}-happyIn64 :: (([Renaming] , Range)) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)-happyIn64 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn64 #-}-happyOut64 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> (([Renaming] , Range))-happyOut64 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut64 #-}-happyIn65 :: ([Renaming]) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)-happyIn65 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn65 #-}-happyOut65 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> ([Renaming])-happyOut65 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut65 #-}-happyIn66 :: (Renaming) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)-happyIn66 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn66 #-}-happyOut66 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> (Renaming)-happyOut66 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut66 #-}-happyIn67 :: (ImportedName) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)-happyIn67 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn67 #-}-happyOut67 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> (ImportedName)-happyOut67 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut67 #-}-happyIn68 :: (ImportedName) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)-happyIn68 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn68 #-}-happyOut68 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> (ImportedName)-happyOut68 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut68 #-}-happyIn69 :: ([ImportedName]) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)-happyIn69 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn69 #-}-happyOut69 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> ([ImportedName])-happyOut69 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut69 #-}-happyIn70 :: t70 -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)-happyIn70 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn70 #-}-happyOut70 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> t70-happyOut70 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut70 #-}-happyIn71 :: (LHS) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)-happyIn71 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn71 #-}-happyOut71 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> (LHS)-happyOut71 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut71 #-}-happyIn72 :: ([Pattern]) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)-happyIn72 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn72 #-}-happyOut72 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> ([Pattern])-happyOut72 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut72 #-}-happyIn73 :: ([Expr]) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)-happyIn73 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn73 #-}-happyOut73 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> ([Expr])-happyOut73 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut73 #-}-happyIn74 :: ([Expr]) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)-happyIn74 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn74 #-}-happyOut74 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> ([Expr])-happyOut74 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut74 #-}-happyIn75 :: (WhereClause) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)-happyIn75 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn75 #-}-happyOut75 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> (WhereClause)-happyOut75 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut75 #-}-happyIn76 :: ([Declaration]) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)-happyIn76 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn76 #-}-happyOut76 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> ([Declaration])-happyOut76 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut76 #-}-happyIn77 :: ([Declaration]) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)-happyIn77 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn77 #-}-happyOut77 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> ([Declaration])-happyOut77 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut77 #-}-happyIn78 :: (Declaration) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)-happyIn78 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn78 #-}-happyOut78 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> (Declaration)-happyOut78 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut78 #-}-happyIn79 :: ([Declaration]) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)-happyIn79 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn79 #-}-happyOut79 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> ([Declaration])-happyOut79 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut79 #-}-happyIn80 :: ([Arg Declaration]) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)-happyIn80 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn80 #-}-happyOut80 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> ([Arg Declaration])-happyOut80 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut80 #-}-happyIn81 :: (Declaration) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)-happyIn81 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn81 #-}-happyOut81 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> (Declaration)-happyOut81 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut81 #-}-happyIn82 :: (RHS) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)-happyIn82 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn82 #-}-happyOut82 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> (RHS)-happyOut82 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut82 #-}-happyIn83 :: (Declaration) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)-happyIn83 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn83 #-}-happyOut83 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> (Declaration)-happyOut83 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut83 #-}-happyIn84 :: (Declaration) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)-happyIn84 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn84 #-}-happyOut84 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> (Declaration)-happyOut84 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut84 #-}-happyIn85 :: (Declaration) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)-happyIn85 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn85 #-}-happyOut85 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> (Declaration)-happyOut85 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut85 #-}-happyIn86 :: (Declaration) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)-happyIn86 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn86 #-}-happyOut86 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> (Declaration)-happyOut86 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut86 #-}-happyIn87 :: (Name) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)-happyIn87 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn87 #-}-happyOut87 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> (Name)-happyOut87 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut87 #-}-happyIn88 :: (Declaration) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)-happyIn88 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn88 #-}-happyOut88 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> (Declaration)-happyOut88 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut88 #-}-happyIn89 :: ([Declaration]) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)-happyIn89 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn89 #-}-happyOut89 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> ([Declaration])-happyOut89 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut89 #-}-happyIn90 :: (Declaration) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)-happyIn90 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn90 #-}-happyOut90 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> (Declaration)-happyOut90 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut90 #-}-happyIn91 :: (Declaration) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)-happyIn91 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn91 #-}-happyOut91 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> (Declaration)-happyOut91 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut91 #-}-happyIn92 :: (Declaration) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)-happyIn92 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn92 #-}-happyOut92 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> (Declaration)-happyOut92 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut92 #-}-happyIn93 :: (Declaration) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)-happyIn93 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn93 #-}-happyOut93 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> (Declaration)-happyOut93 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut93 #-}-happyIn94 :: (Declaration) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)-happyIn94 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn94 #-}-happyOut94 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> (Declaration)-happyOut94 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut94 #-}-happyIn95 :: (Declaration) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)-happyIn95 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn95 #-}-happyOut95 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> (Declaration)-happyOut95 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut95 #-}-happyIn96 :: ([String]) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)-happyIn96 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn96 #-}-happyOut96 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> ([String])-happyOut96 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut96 #-}-happyIn97 :: ([HoleName]) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)-happyIn97 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn97 #-}-happyOut97 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> ([HoleName])-happyOut97 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut97 #-}-happyIn98 :: (HoleName) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)-happyIn98 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn98 #-}-happyOut98 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> (HoleName)-happyOut98 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut98 #-}-happyIn99 :: (String) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)-happyIn99 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn99 #-}-happyOut99 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> (String)-happyOut99 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut99 #-}-happyIn100 :: (Declaration) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)-happyIn100 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn100 #-}-happyOut100 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> (Declaration)-happyOut100 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut100 #-}-happyIn101 :: ([Expr]) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)-happyIn101 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn101 #-}-happyOut101 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> ([Expr])-happyOut101 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut101 #-}-happyIn102 :: ([TypedBindings] -> Parser ModuleApplication) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)-happyIn102 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn102 #-}-happyOut102 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> ([TypedBindings] -> Parser ModuleApplication)-happyOut102 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut102 #-}-happyIn103 :: (Declaration) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)-happyIn103 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn103 #-}-happyOut103 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> (Declaration)-happyOut103 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut103 #-}-happyIn104 :: (Declaration) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)-happyIn104 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn104 #-}-happyOut104 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> (Declaration)-happyOut104 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut104 #-}-happyIn105 :: (Declaration) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)-happyIn105 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn105 #-}-happyOut105 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> (Declaration)-happyOut105 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut105 #-}-happyIn106 :: ([Declaration]) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)-happyIn106 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn106 #-}-happyOut106 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> ([Declaration])-happyOut106 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut106 #-}-happyIn107 :: (Declaration) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)-happyIn107 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn107 #-}-happyOut107 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> (Declaration)-happyOut107 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut107 #-}-happyIn108 :: (Declaration) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)-happyIn108 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn108 #-}-happyOut108 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> (Declaration)-happyOut108 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut108 #-}-happyIn109 :: (Pragma) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)-happyIn109 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn109 #-}-happyOut109 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> (Pragma)-happyOut109 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut109 #-}-happyIn110 :: (Pragma) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)-happyIn110 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn110 #-}-happyOut110 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> (Pragma)-happyOut110 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut110 #-}-happyIn111 :: (Pragma) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)-happyIn111 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn111 #-}-happyOut111 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> (Pragma)-happyOut111 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut111 #-}-happyIn112 :: (Pragma) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)-happyIn112 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn112 #-}-happyOut112 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> (Pragma)-happyOut112 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut112 #-}-happyIn113 :: (Pragma) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)-happyIn113 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn113 #-}-happyOut113 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> (Pragma)-happyOut113 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut113 #-}-happyIn114 :: (Pragma) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)-happyIn114 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn114 #-}-happyOut114 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> (Pragma)-happyOut114 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut114 #-}-happyIn115 :: (Pragma) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)-happyIn115 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn115 #-}-happyOut115 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> (Pragma)-happyOut115 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut115 #-}-happyIn116 :: (Pragma) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)-happyIn116 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn116 #-}-happyOut116 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> (Pragma)-happyOut116 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut116 #-}-happyIn117 :: (Pragma) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)-happyIn117 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn117 #-}-happyOut117 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> (Pragma)-happyOut117 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut117 #-}-happyIn118 :: (Pragma) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)-happyIn118 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn118 #-}-happyOut118 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> (Pragma)-happyOut118 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut118 #-}-happyIn119 :: (Pragma) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)-happyIn119 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn119 #-}-happyOut119 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> (Pragma)-happyOut119 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut119 #-}-happyIn120 :: (Pragma) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)-happyIn120 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn120 #-}-happyOut120 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> (Pragma)-happyOut120 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut120 #-}-happyIn121 :: (Pragma) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)-happyIn121 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn121 #-}-happyOut121 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> (Pragma)-happyOut121 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut121 #-}-happyIn122 :: ([TypeSignature]) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)-happyIn122 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn122 #-}-happyOut122 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> ([TypeSignature])-happyOut122 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut122 #-}-happyIn123 :: ([TypeSignature]) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)-happyIn123 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn123 #-}-happyOut123 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> ([TypeSignature])-happyOut123 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut123 #-}-happyIn124 :: ([TypeSignature]) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)-happyIn124 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn124 #-}-happyOut124 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> ([TypeSignature])-happyOut124 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut124 #-}-happyIn125 :: ([TypeSignature]) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)-happyIn125 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn125 #-}-happyOut125 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> ([TypeSignature])-happyOut125 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut125 #-}-happyIn126 :: ([Arg TypeSignature]) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)-happyIn126 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn126 #-}-happyOut126 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> ([Arg TypeSignature])-happyOut126 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut126 #-}-happyIn127 :: ([Arg TypeSignature]) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)-happyIn127 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn127 #-}-happyOut127 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> ([Arg TypeSignature])-happyOut127 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut127 #-}-happyIn128 :: ([Constructor]) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)-happyIn128 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn128 #-}-happyOut128 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> ([Constructor])-happyOut128 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut128 #-}-happyIn129 :: ((Maybe Name, [Declaration])) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)-happyIn129 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn129 #-}-happyOut129 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> ((Maybe Name, [Declaration]))-happyOut129 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut129 #-}-happyIn130 :: ([Declaration]) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)-happyIn130 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn130 #-}-happyOut130 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> ([Declaration])-happyOut130 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut130 #-}-happyIn131 :: ([Declaration]) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)-happyIn131 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn131 #-}-happyOut131 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> ([Declaration])-happyOut131 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut131 #-}-happyIn132 :: ([Declaration]) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)-happyIn132 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn132 #-}-happyOut132 :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> ([Declaration])-happyOut132 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut132 #-}-happyInTok :: (Token) -> (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70)-happyInTok x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyInTok #-}-happyOutTok :: (HappyAbsSyn t10 t11 t12 t30 t33 t35 t36 t37 t41 t42 t70) -> (Token)-happyOutTok x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOutTok #-}---happyActOffsets :: HappyAddr-happyActOffsets = HappyA# "\x00\x00\xd9\x05\x1f\x00\x00\x00\xb8\x02\x34\x05\x00\x00\x4d\x02\x4d\x02\x00\x00\x00\x00\x1f\x00\x00\x00\x58\x00\xc7\x03\xc7\x03\x59\x05\x3a\x05\x00\x00\x2a\x05\x00\x00\x00\x00\x00\x00\x00\x00\xfb\x00\x00\x00\x00\x00\xa8\x05\x81\x05\x35\x05\x00\x00\xff\x00\x2c\x05\x9a\x07\x00\x00\x00\x00\x66\x07\x2b\x05\x00\x00\x00\x00\x00\x00\x00\x00\xd0\x02\x73\x07\x00\x00\x00\x00\x3f\x07\xaa\x04\x90\x03\x77\x04\x00\x00\x00\x00\x00\x00\x24\x05\xe5\x00\x38\x05\x00\x00\x27\x05\xd4\x01\x25\x05\x00\x00\xe1\x00\x00\x00\x69\x01\x69\x01\x00\x00\x23\x05\x26\x05\x1c\x05\x00\x00\x00\x00\x00\x00\xa4\x01\x81\x05\x00\x00\x20\x05\x00\x00\x18\x07\x39\x01\x6c\x02\x20\x02\x00\x00\x89\x06\x50\x05\x58\x06\x00\x00\x4c\x07\x50\x04\x90\x03\x1d\x04\xb0\x06\xb0\x06\xb0\x06\x4e\x05\xf1\x06\x29\x05\x1f\x05\xf1\x06\x00\x00\xb0\x06\xb0\x06\xb0\x06\x11\x05\xf6\x03\x90\x03\x06\x05\x4a\x05\x03\x03\x00\x00\x60\x01\xb0\x06\xb0\x06\x00\x00\x00\x00\x00\x00\x00\x00\xc3\x03\x29\x05\xb0\x06\x4c\x07\x03\x05\x00\x00\x00\x00\xf1\x06\x35\x00\x25\x07\xc7\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x35\x00\xfe\x06\x36\x02\x5d\x03\x00\x00\x00\x00\x00\x00\x00\x00\x36\x05\x00\x00\x02\x05\x01\x05\xff\x04\x71\x03\xee\x04\xf1\x06\x31\x05\xf1\x06\xec\x04\xe7\x04\x00\x00\x00\x00\xed\x04\x00\x00\x00\x00\xb0\x06\xb0\x06\xb0\x06\xb0\x06\xd2\x01\x22\x05\xeb\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x59\x00\xdc\x04\xda\x04\x9f\x00\xc9\x04\xc9\x04\xc9\x04\xd7\x06\xd8\x04\xcc\x04\xcc\x04\xcc\x04\xd2\x04\xd2\x04\xd2\x04\xc4\x04\xc6\x04\xa7\x01\xc7\x0c\x29\x05\xbe\x04\xb8\x04\x00\x00\xbc\x04\xb0\x04\xb4\x04\xcf\xff\x00\x00\x00\x00\x00\x00\x00\x00\x29\x05\xa8\x04\x69\x01\xb1\x04\xa4\x04\x69\x01\x9c\x04\xca\x00\xac\x04\x00\x00\x73\x00\xe8\xff\xa7\x04\xa6\x04\xa5\x04\x00\x00\xb0\x06\xb0\x06\x00\x00\xb0\x06\xb0\x06\xca\x06\xa2\x04\xca\x06\x31\x06\xf8\x04\x00\x06\x00\x00\x00\x00\xa0\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd1\x04\x00\x00\x00\x00\xd1\x04\xd1\x04\x91\x04\x00\x00\x69\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x91\x00\xcf\xff\x64\x00\xcf\xff\xb0\x06\x00\x00\x00\x00\x00\x00\xb0\x06\xd1\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x75\x04\x86\x04\x00\x00\xd1\x04\x00\x00\x7e\x04\x7a\x04\x7c\x04\x74\x04\x74\x04\x74\x04\x74\x04\x74\x04\x74\x04\x74\x04\xcc\x00\xb5\x04\xa7\x01\xc5\x00\x00\x00\x00\x00\x00\x00\x6e\x00\x00\x00\x6e\x00\x6e\x00\x00\x00\xce\x04\xaa\x03\xaf\x06\xaf\x06\xaf\x06\x6d\x04\x00\x00\x6d\x04\x00\x00\xed\xff\x00\x00\x03\x03\x00\x00\x00\x00\xdf\x00\xd1\x04\xae\x04\xd1\x04\xd1\x04\x00\x00\x00\x00\x00\x00\x70\x04\x00\x00\x36\x02\x00\x00\xa1\x04\x14\x00\x14\x00\x00\x00\x69\x01\x00\x00\x00\x00\x00\x00\x36\x02\x00\x00\x6b\x04\x6f\x04\x00\x00\x5f\x04\x6e\x04\x5e\x04\x60\x04\x69\x04\x8d\x04\x00\x00\x00\x00\x00\x00\x00\x00\x6d\x02\x00\x00\x00\x00\x00\x00\xd1\x04\x00\x00\x00\x00\x59\x04\x4f\x04\x00\x00\x00\x00\xed\xff\x61\x04\x00\x00\x59\x00\x4d\x04\x4d\x04\x5b\x04\x00\x00\x59\x00\xaf\x06\x7f\x00\xac\x00\x9c\x00\x09\x00\xce\x04\x57\x04\x00\x00\x59\x00\x0e\x01\xc9\x01\xed\xff\xed\xff\x6e\x00\x00\x00\x00\x00\x00\x00\xeb\x00\x00\x00\x00\x00\x51\x04\x00\x00\x45\x04\xa7\x01\x6a\x04\xd1\x04\x39\x04\x00\x00\x20\x04\x20\x04\x20\x04\x1f\x04\x1a\x04\x38\x04\x00\x00\x32\x04\x16\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x14\x04\x00\x00\x00\x00\x12\x04\x13\x04\x11\x04\x0f\x04\x0c\x04\x00\x00\x00\x00\x00\x00\x00\x00\x0a\x04\x00\x00\x0a\x04\x00\x00\x0b\x04\x49\x01\x00\x00\x04\x04\x04\x04\x04\x04\x04\x04\x00\x00\xce\x04\xd1\x04\x00\x00\x02\x04\xd1\x04\x01\x04\xd1\x04\x01\x04\xd1\x04\x00\x04\xc7\x03\x06\x04\x00\x00\xf3\x03\xd1\x04\x00\x00\x00\x00\xed\xff\xd1\x04\x00\x00\x2f\x04\x00\x00\x00\x00\x00\x00\xe9\x03\xe9\x03\x27\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x14\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xbe\x03\x00\x00\x00\x00\x00\x00\x00\x00\xc7\x03\x3c\x01\x36\x02\x00\x00\x24\x04\x00\x00\x00\x00\x13\x00\x23\x04\x00\x00\x22\x04\x00\x00\x21\x02\x00\x00\x00\x00\xdd\x03\x49\x01\xd2\x03\x49\x01\xce\x04\xce\x04\xc2\x03\x00\x00\xcd\x03\x00\x00\x00\x00\x00\x00\xbc\x03\x00\x00\x00\x00\x00\x00\xb7\x03\x00\x00\x00\x00\x00\x00\xce\x04\xce\x04\xce\x04\xce\x04\x00\x00\x59\x00\x59\x00\xab\x03\xb5\x03\xa5\x03\x00\x00\xa5\x03\x00\x00\x00\x00\x2a\x03\x36\x02\x00\x00\x00\x00\x49\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x03\x00\x00\x00\x00\x00\x00\x00\x00\xac\x03\x00\x00\x59\x00\x00\x00\x00\x00\x00\x00"#--happyGotoOffsets :: HappyAddr-happyGotoOffsets = HappyA# "\xbf\x03\xc0\x0c\x1a\x00\xe5\x03\xd8\x03\x00\x00\x00\x00\x01\x03\xc2\x02\x00\x00\x00\x00\x2e\x00\x00\x00\x81\x02\x68\x02\x1c\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x98\x03\xa8\x0c\x00\x00\x00\x00\x8b\x03\x5b\x03\xf4\x00\x00\x00\x00\x00\x17\x05\xcb\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x05\x00\x00\x00\x00\x1d\x02\x7d\x08\x19\x08\x64\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc8\x03\xba\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc8\x05\x90\x0c\x00\x00\x00\x00\x00\x00\x70\x05\x00\x00\x0d\x01\x22\x00\x00\x00\x51\x0a\xb3\x08\xdb\x07\x00\x00\x40\x05\x4b\x08\xfa\x07\x32\x08\x3a\x0a\x23\x0a\x0c\x0a\x00\x00\xb8\x07\x78\x0c\x00\x00\x76\x06\x00\x00\xf5\x09\xde\x09\xc7\x09\x00\x00\x60\x0c\x68\x0a\xf3\x00\x00\x00\x42\x01\x00\x00\x00\x00\xb0\x09\x99\x09\x00\x00\x00\x00\x00\x00\x00\x00\x48\x0c\x30\x0c\x65\x03\x0f\x05\xb9\x03\x00\x00\x00\x00\x1e\x06\x44\x0a\xdc\x00\xae\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc6\x07\x8d\x00\x7b\x08\x68\x0a\x00\x00\x00\x00\x00\x00\x00\x00\x92\x03\x00\x00\x00\x00\x00\x00\x00\x00\x18\x03\xaf\x03\xc6\x05\x00\x00\x6e\x05\x00\x00\x86\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb2\x04\x82\x09\x6b\x09\x54\x09\x00\x00\x5c\x03\x4d\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa9\x03\x1c\x03\xf4\x02\x43\x01\x57\x03\x4a\x03\x3f\x03\xda\x00\xc7\x02\x2f\x03\x24\x03\x22\x03\xac\x02\x9a\x02\x92\x02\xae\x02\x70\x02\xe8\x04\x00\x00\x18\x0c\x00\x00\x00\x00\x00\x00\x00\x00\xee\x00\x00\x00\x9d\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0c\x00\x00\x9b\x02\x00\x00\x00\x00\x94\x02\x00\x00\x00\x00\x00\x00\x00\x00\x8e\x02\x75\x02\x00\x00\x00\x00\x00\x00\x00\x00\x3d\x09\x26\x09\x00\x00\x0f\x09\xf8\x08\xff\x02\x00\x00\x69\x02\xe1\x08\x9c\x08\xca\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe8\x0b\x00\x00\x00\x00\xd0\x0b\xb8\x0b\x00\x00\x00\x00\x6e\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5b\x02\x00\x00\x59\x02\x58\x04\x00\x00\x00\x00\x00\x00\xfe\x03\xa0\x0b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8f\x00\x00\x00\x88\x0b\x00\x00\x00\x00\x00\x00\x00\x00\x44\x02\x3d\x02\x28\x02\x19\x02\x17\x02\xf6\x01\xf3\x01\x00\x00\xba\x01\xb2\x01\xaa\x02\x00\x00\x00\x00\x00\x00\xd9\x01\x00\x00\x95\x01\x6e\x01\x00\x00\x16\x00\x97\x04\x3d\x04\xe3\x03\xb0\x03\xf0\x01\x00\x00\x1c\x00\x00\x00\xfd\xff\x00\x00\xad\x01\x00\x00\x00\x00\xaf\x01\x70\x0b\xb3\x01\x58\x0b\x40\x0b\x00\x00\x00\x00\x00\x00\x2d\x03\x00\x00\xba\x07\x00\x00\xce\x00\xc0\x00\xf9\xff\x00\x00\xd1\x01\x00\x00\x00\x00\x00\x00\x9f\x06\x00\x00\x00\x00\x00\x00\x00\x00\xe0\x01\x00\x00\xd7\x01\x00\x00\x00\x00\x00\x00\xc6\x01\x00\x00\x00\x00\x00\x00\x6c\x00\x00\x00\x00\x00\x00\x00\x28\x0b\x00\x00\x00\x00\x48\x01\xb6\x01\x00\x00\x00\x00\x64\x03\x00\x00\x00\x00\x9e\x03\xb1\x01\x6d\x03\x00\x00\x00\x00\x87\x03\x5a\x02\x00\x00\x00\x00\x00\x00\x00\x00\x34\x04\x00\x00\x00\x00\x80\x03\x00\x00\xb1\x01\x2c\x03\x89\x02\x08\x01\x00\x00\x00\x00\x00\x00\xfd\x02\x00\x00\x00\x00\x00\x00\x00\x00\x76\x01\x47\x01\x3b\x01\x10\x0b\x00\x00\x00\x00\x7e\x01\x79\x01\x6d\x01\x00\x00\x67\x01\x00\x00\x00\x00\x00\x00\x5f\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\x58\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x05\x01\x00\x00\x14\x01\x00\x00\x00\x00\x4e\x01\x00\x00\x19\x03\xa6\x02\x98\x02\x66\x02\x00\x00\x28\x00\xf8\x0a\x00\x00\xd9\x00\xe0\x0a\x7d\x01\xc8\x0a\x73\x01\xb0\x0a\xcd\x01\x67\x00\x00\x00\x00\x00\x32\x00\x98\x0a\x00\x00\x00\x00\xbf\x00\x80\x0a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2d\x01\x1a\x01\xc9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x71\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x85\x00\x75\x06\x00\x00\x00\x00\x00\x00\x00\x00\xfe\xff\x00\x00\x00\x00\x00\x00\x00\x00\xfc\xff\x00\x00\x00\x00\x00\x00\xb2\x00\x00\x00\xa8\x00\xf0\x03\xbd\x03\x4c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xeb\xff\x00\x00\x00\x00\x00\x00\x8a\x03\x41\x03\x35\x03\x04\x00\x00\x00\x1e\x02\xd3\x01\x31\x00\xb1\xff\x28\x01\x00\x00\x12\x01\x00\x00\x00\x00\x68\x0a\x1d\x06\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd7\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x95\x00\x00\x00\x00\x00\x00\x00"#--happyDefActions :: HappyAddr-happyDefActions = HappyA# "\xfa\xff\x00\x00\x00\x00\x00\x00\xfc\xff\x00\x00\xae\xff\x00\x00\x00\x00\xad\xff\xbb\xfe\x00\x00\xb6\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x8d\xff\x6e\xff\x00\x00\x7f\xff\x7e\xff\x7c\xff\x7b\xff\x00\x00\x5b\xff\x5a\xff\x75\xff\x00\x00\x00\x00\x53\xff\x51\xff\x00\x00\x00\x00\x6a\xff\x69\xff\x00\x00\x00\x00\x68\xff\x67\xff\x66\xff\x65\xff\x00\x00\x00\x00\x6b\xff\x6c\xff\x00\x00\x00\x00\x00\x00\x00\x00\xa5\xff\x8e\xff\x6d\xff\x00\x00\x8d\xff\x00\x00\x87\xff\x00\x00\x86\xff\x00\x00\x6f\xff\x8d\xff\x60\xff\x00\x00\x00\x00\xa2\xff\x00\x00\x00\x00\x00\x00\x61\xff\x8b\xff\x26\xff\x3a\xff\x00\x00\x77\xff\x00\x00\x45\xff\x42\xff\x3b\xff\x00\x00\x00\x00\x8a\xff\x00\x00\x00\x00\x00\x00\x5e\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2b\xff\x00\x00\x00\x00\x2c\xff\x27\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x59\xff\x00\x00\x00\x00\x52\xff\x00\x00\x00\x00\x00\x00\x54\xff\x82\xff\x7a\xff\x72\xff\x00\x00\x00\x00\x00\x00\x00\x00\x85\xff\x8d\xff\x8c\xff\x28\xff\x15\xff\xc4\xfe\x00\x00\xac\xff\xba\xfe\xb9\xfe\xfb\xff\xf9\xff\xf8\xff\xf7\xff\xf6\xff\xf5\xff\xf4\xff\xf3\xff\xf2\xff\xf1\xff\xf0\xff\xef\xff\xee\xff\xed\xff\xec\xff\xeb\xff\xea\xff\xe9\xff\xe8\xff\xe7\xff\xe6\xff\xe5\xff\xe4\xff\xe3\xff\xe2\xff\xe1\xff\xe0\xff\xdf\xff\xde\xff\xdd\xff\xdc\xff\xdb\xff\xda\xff\xd9\xff\xd2\xff\xd1\xff\xd8\xff\xd7\xff\xd6\xff\xd5\xff\xd4\xff\xd3\xff\xd0\xff\xcf\xff\xce\xff\xcd\xff\xcc\xff\xcb\xff\xca\xff\xc9\xff\xc8\xff\xc7\xff\xc6\xff\xc5\xff\xc4\xff\xc3\xff\xc2\xff\xc1\xff\xc0\xff\xbf\xff\xbe\xff\xbd\xff\xbc\xff\xbb\xff\xba\xff\xb9\xff\xb8\xff\xb7\xff\xb6\xff\xb5\xff\xb4\xff\xb3\xff\xb2\xff\xb1\xff\xb0\xff\xaf\xff\x15\xff\xc4\xfe\x15\xff\x00\x00\xbe\xfe\x1d\xff\x1b\xff\x19\xff\x16\xff\x17\xff\x00\x00\x00\x00\x00\x00\x15\xff\x00\x00\x28\xff\x00\x00\x28\xff\x00\x00\x85\xff\x5f\xff\x7d\xff\x00\x00\x80\xff\x86\xff\x75\xff\x00\x00\x00\x00\x00\x00\x8d\xff\x00\xff\xe1\xfe\x8d\xfe\xfb\xfe\xf9\xfe\xf8\xfe\xf7\xfe\xf6\xfe\xf5\xfe\xf4\xfe\xfa\xfe\xf3\xfe\xf2\xfe\xf1\xfe\xf0\xfe\xef\xfe\xe9\xfe\xee\xfe\xec\xfe\xed\xfe\xeb\xfe\xea\xfe\xb7\xfe\xb5\xfe\xb4\xfe\xb2\xfe\xb3\xfe\xb1\xfe\xb0\xfe\xaf\xfe\xac\xfe\xae\xfe\xad\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x58\xff\x57\xff\x59\xff\x87\xff\x00\x00\x2e\xff\x2f\xff\x81\xff\x2d\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x35\xff\x00\x00\x30\xff\x00\x00\x00\x00\x38\xff\x37\xff\x39\xff\x25\xff\x00\x00\x00\x00\x24\xff\x00\x00\x00\x00\x41\xff\x3d\xff\x42\xff\x00\x00\x00\x00\x00\x00\x46\xff\x79\xff\x3c\xff\x4a\xff\x62\xff\xa1\xff\x49\xff\x64\xff\x00\x00\x48\xff\x71\xff\x00\x00\x00\x00\x00\x00\x47\xff\x00\x00\x3f\xff\x3e\xff\x40\xff\x44\xff\x43\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa9\xff\x78\xff\xa8\xff\x00\x00\x00\x00\x50\xff\x4e\xff\x4f\xff\x4d\xff\x4b\xff\x4c\xff\x74\xff\x22\xff\x23\xff\x00\x00\x00\x00\x5d\xff\x00\x00\x76\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8d\xff\x00\xff\x00\x00\x00\x00\xd1\xfe\xd2\xfe\xd3\xfe\x00\x00\xa6\xff\x00\x00\x00\x00\xd4\xfe\x00\x00\x28\xff\x28\xff\x28\xff\x28\xff\x00\x00\xcf\xfe\x00\x00\xd0\xfe\x00\x00\x91\xfe\x00\x00\xaa\xff\xab\xff\xfe\xfe\x00\x00\x02\xff\x00\x00\x00\x00\x84\xff\xab\xfe\x2a\xff\x00\x00\x29\xff\x15\xff\x1a\xff\xa7\xff\x00\x00\x0a\xff\x18\xff\x00\x00\xc6\xfe\xc3\xfe\xbd\xfe\x15\xff\x0c\xff\x08\xff\x00\x00\x09\xff\x00\x00\x00\x00\x00\x00\x00\x00\x10\xff\x00\x00\xa7\xff\x1c\xff\x8f\xfe\xb8\xfe\x00\x00\xe6\xfe\xff\xfe\x06\xff\x00\x00\xe2\xfe\xe3\xfe\x00\x00\x00\x00\x8e\xfe\x9f\xff\x9d\xff\x00\x00\x9b\xfe\x00\x00\x00\x00\xa3\xff\x00\x00\x9e\xfe\x00\x00\x28\xff\x00\x00\x00\x00\x00\x00\x00\x00\x9b\xff\x00\x00\x98\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x88\xff\xd7\xfe\xd6\xfe\xd5\xfe\x00\x00\xcb\xfe\xc9\xfe\x00\x00\xc7\xfe\x04\xff\x73\xff\x02\xff\x00\x00\x00\x00\x83\xff\x85\xff\x85\xff\x85\xff\x00\x00\x85\xff\x00\x00\xa1\xfe\x00\x00\x00\x00\x55\xff\x56\xff\x5c\xff\x36\xff\x35\xff\x34\xff\x33\xff\x31\xff\x32\xff\x20\xff\x21\xff\x1e\xff\x1f\xff\x63\xff\x70\xff\x00\x00\xa2\xfe\xa3\xfe\x00\x00\x85\xff\x00\x00\x00\x00\x00\x00\xa4\xfe\xe7\xfe\x05\xff\x03\xff\x00\x00\xca\xfe\x00\x00\x89\xff\x00\x00\x00\x00\xa0\xff\x00\x00\x00\x00\x00\x00\x00\x00\x9a\xfe\x00\x00\x00\x00\x9c\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa0\xfe\x00\x00\x00\x00\xa4\xff\x9d\xfe\x00\x00\x00\x00\x9e\xff\x00\x00\xfd\xfe\x01\xff\x90\xfe\x00\x00\x00\x00\xa7\xff\x12\xff\x0e\xff\x13\xff\x0b\xff\x14\xff\x00\x00\xc5\xfe\x07\xff\x11\xff\x0f\xff\x0d\xff\x00\x00\xe5\xfe\x9c\xfe\xe8\xfe\x9f\xfe\x00\x00\xc4\xfe\x15\xff\xbc\xfe\xdc\xfe\x96\xfe\xde\xfe\x00\x00\x00\x00\xdd\xfe\xd9\xfe\xda\xfe\x00\x00\xe4\xfe\x99\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x99\xff\x97\xff\xce\xfe\xcd\xfe\x00\x00\xa5\xfe\xa6\xfe\xa8\xfe\x00\x00\xa9\xfe\xaa\xfe\xa7\xfe\x00\x00\xcc\xfe\x98\xff\x9a\xff\x93\xff\x95\xff\x8f\xff\x91\xff\x95\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\xfe\x00\x00\xc0\xfe\xc1\xfe\x00\x00\x15\xff\xfc\xfe\xbf\xfe\x00\x00\xe0\xfe\xdf\xfe\xdb\xfe\xd8\xfe\x92\xfe\x94\xfe\x00\x00\x92\xff\x90\xff\x96\xff\x94\xff\x00\x00\xc8\xfe\x00\x00\xc2\xfe\x93\xfe"#--happyCheck :: HappyAddr-happyCheck = HappyA# "\xff\xff\x05\x00\x09\x00\x05\x00\x35\x00\x09\x00\x09\x00\x09\x00\x0a\x00\x0c\x00\x0d\x00\x0f\x00\x03\x00\x09\x00\x0b\x00\x40\x00\x0c\x00\x42\x00\x0e\x00\x00\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x34\x00\x03\x00\x04\x00\x09\x00\x33\x00\x09\x00\x0c\x00\x0f\x00\x0e\x00\x09\x00\x0a\x00\x08\x00\x09\x00\x09\x00\x42\x00\x09\x00\x7b\x00\x45\x00\x0f\x00\x0f\x00\x10\x00\x09\x00\x04\x00\x11\x00\x0c\x00\x48\x00\x0e\x00\x3e\x00\x3f\x00\x40\x00\x09\x00\x09\x00\x0a\x00\x41\x00\x35\x00\x0a\x00\x0b\x00\x0c\x00\x46\x00\x0e\x00\x48\x00\x47\x00\x49\x00\x4b\x00\x5d\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x3e\x00\x44\x00\x40\x00\x00\x00\x5e\x00\x48\x00\x48\x00\x61\x00\x62\x00\x63\x00\x4a\x00\x09\x00\x66\x00\x47\x00\x68\x00\x46\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x09\x00\x05\x00\x4a\x00\x75\x00\x77\x00\x09\x00\x0f\x00\x10\x00\x5e\x00\x47\x00\x7e\x00\x0f\x00\x62\x00\x48\x00\x64\x00\x65\x00\x60\x00\x67\x00\x03\x00\x69\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x5e\x00\x34\x00\x09\x00\x79\x00\x62\x00\x75\x00\x64\x00\x65\x00\x0f\x00\x67\x00\x09\x00\x69\x00\x09\x00\x35\x00\x05\x00\x06\x00\x0f\x00\x44\x00\x45\x00\x03\x00\x48\x00\x49\x00\x1d\x00\x1e\x00\x1f\x00\x37\x00\x42\x00\x34\x00\x09\x00\x5d\x00\x1d\x00\x1e\x00\x1f\x00\x41\x00\x0f\x00\x03\x00\x21\x00\x22\x00\x46\x00\x0b\x00\x48\x00\x36\x00\x48\x00\x4b\x00\x45\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x0b\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x35\x00\x60\x00\x09\x00\x09\x00\x5e\x00\x0c\x00\x0d\x00\x61\x00\x62\x00\x63\x00\x07\x00\x35\x00\x66\x00\x42\x00\x68\x00\x07\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x09\x00\x35\x00\x03\x00\x09\x00\x5f\x00\x09\x00\x0f\x00\x48\x00\x49\x00\x0f\x00\x7e\x00\x0f\x00\x5f\x00\x7c\x00\x0f\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x09\x00\x1e\x00\x1d\x00\x1e\x00\x1f\x00\x09\x00\x09\x00\x3e\x00\x35\x00\x40\x00\x35\x00\x3d\x00\x0f\x00\x3b\x00\x3c\x00\x3d\x00\x3b\x00\x49\x00\x3b\x00\x3c\x00\x3d\x00\x42\x00\x48\x00\x20\x00\x21\x00\x22\x00\x09\x00\x1e\x00\x20\x00\x21\x00\x22\x00\x09\x00\x36\x00\x41\x00\x11\x00\x12\x00\x36\x00\x3b\x00\x46\x00\x11\x00\x48\x00\x3b\x00\x36\x00\x4b\x00\x09\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x3d\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x32\x00\x33\x00\x48\x00\x39\x00\x5e\x00\x09\x00\x3c\x00\x61\x00\x62\x00\x63\x00\x5f\x00\x3d\x00\x66\x00\x3f\x00\x68\x00\x41\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x09\x00\x09\x00\x3f\x00\x12\x00\x41\x00\x09\x00\x0f\x00\x0f\x00\x10\x00\x7b\x00\x7e\x00\x0f\x00\x1b\x00\x1c\x00\x0b\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x5d\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x32\x00\x33\x00\x15\x00\x5a\x00\x33\x00\x37\x00\x5d\x00\x39\x00\x37\x00\x38\x00\x16\x00\x3d\x00\x09\x00\x3f\x00\x3d\x00\x41\x00\x3f\x00\x15\x00\x41\x00\x43\x00\x11\x00\x12\x00\x48\x00\x15\x00\x41\x00\x48\x00\x49\x00\x74\x00\x4b\x00\x46\x00\x40\x00\x48\x00\x42\x00\x7a\x00\x4b\x00\x15\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x15\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x74\x00\x3d\x00\x09\x00\x3f\x00\x5e\x00\x41\x00\x7a\x00\x61\x00\x62\x00\x63\x00\x11\x00\x12\x00\x66\x00\x40\x00\x68\x00\x42\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x09\x00\x09\x00\x42\x00\x12\x00\x09\x00\x09\x00\x0f\x00\x0f\x00\x10\x00\x09\x00\x7e\x00\x0f\x00\x1b\x00\x1c\x00\x7c\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x07\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x32\x00\x33\x00\x05\x00\x06\x00\x33\x00\x37\x00\x0b\x00\x39\x00\x37\x00\x38\x00\x09\x00\x3d\x00\x09\x00\x3f\x00\x3d\x00\x41\x00\x3f\x00\x74\x00\x41\x00\x09\x00\x11\x00\x12\x00\x48\x00\x7a\x00\x41\x00\x48\x00\x49\x00\x74\x00\x4b\x00\x46\x00\x45\x00\x48\x00\x43\x00\x7a\x00\x4b\x00\x09\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x44\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x35\x00\x3f\x00\x16\x00\x41\x00\x5e\x00\x16\x00\x3b\x00\x61\x00\x62\x00\x63\x00\x48\x00\x3e\x00\x66\x00\x40\x00\x68\x00\x42\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x00\x00\x01\x00\x05\x00\x06\x00\x09\x00\x09\x00\x06\x00\x07\x00\x08\x00\x09\x00\x0f\x00\x10\x00\x16\x00\x11\x00\x16\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\x16\x00\x1e\x00\x0a\x00\x0b\x00\x0c\x00\x26\x00\x0e\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x7c\x00\x7d\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x33\x00\x34\x00\x31\x00\x16\x00\x33\x00\x08\x00\x09\x00\x37\x00\x37\x00\x38\x00\x16\x00\x3a\x00\x0f\x00\x3d\x00\x3d\x00\x3f\x00\x3f\x00\x41\x00\x41\x00\x09\x00\x0b\x00\x44\x00\x0b\x00\x46\x00\x48\x00\x48\x00\x49\x00\x11\x00\x4b\x00\x00\x00\x01\x00\x09\x00\x0a\x00\x09\x00\x09\x00\x06\x00\x07\x00\x08\x00\x09\x00\x0f\x00\x10\x00\x0b\x00\x11\x00\x06\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x26\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x09\x00\x1e\x00\x32\x00\x33\x00\x34\x00\x26\x00\x0f\x00\x10\x00\x09\x00\x2a\x00\x06\x00\x0c\x00\x0d\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x33\x00\x34\x00\x31\x00\x0b\x00\x33\x00\x09\x00\x0a\x00\x37\x00\x37\x00\x38\x00\x0b\x00\x3a\x00\x0b\x00\x3d\x00\x3d\x00\x3f\x00\x3f\x00\x41\x00\x41\x00\x09\x00\x0a\x00\x44\x00\x42\x00\x46\x00\x48\x00\x48\x00\x49\x00\x09\x00\x4b\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\x01\x00\x5b\x00\x5c\x00\x5d\x00\x09\x00\x06\x00\x07\x00\x08\x00\x09\x00\x3d\x00\x7c\x00\x3f\x00\x11\x00\x41\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x7c\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x5e\x00\x1e\x00\x09\x00\x0a\x00\x62\x00\x26\x00\x64\x00\x65\x00\x7c\x00\x2a\x00\x08\x00\x01\x00\x08\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x33\x00\x34\x00\x31\x00\x09\x00\x33\x00\x08\x00\x0c\x00\x0d\x00\x37\x00\x38\x00\x12\x00\x3a\x00\x09\x00\x78\x00\x3d\x00\x0c\x00\x3f\x00\x0e\x00\x41\x00\x1b\x00\x1c\x00\x1d\x00\x09\x00\x46\x00\x09\x00\x48\x00\x49\x00\x0c\x00\x4b\x00\x0e\x00\x38\x00\x39\x00\x3a\x00\x09\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x5c\x00\x5d\x00\x31\x00\x32\x00\x33\x00\x01\x00\x5e\x00\x09\x00\x37\x00\x38\x00\x62\x00\x3a\x00\x64\x00\x65\x00\x3d\x00\x74\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x09\x00\x09\x00\x12\x00\x0c\x00\x0d\x00\x48\x00\x49\x00\x0f\x00\x4b\x00\x09\x00\x0a\x00\x1b\x00\x1c\x00\x1d\x00\x0a\x00\x0b\x00\x0c\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x05\x00\x06\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x05\x00\x06\x00\x31\x00\x32\x00\x33\x00\x01\x00\x76\x00\x09\x00\x37\x00\x38\x00\x0c\x00\x3a\x00\x0e\x00\x4c\x00\x3d\x00\x15\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x44\x00\x09\x00\x12\x00\x05\x00\x06\x00\x48\x00\x49\x00\x0f\x00\x4b\x00\x7c\x00\x7d\x00\x1b\x00\x1c\x00\x1d\x00\x05\x00\x06\x00\x25\x00\x26\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x09\x00\x09\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x00\x00\x01\x00\x11\x00\x32\x00\x33\x00\x01\x00\x0b\x00\x09\x00\x37\x00\x38\x00\x0c\x00\x3a\x00\x0e\x00\x3a\x00\x3d\x00\x15\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x0b\x00\x09\x00\x12\x00\x26\x00\x7c\x00\x48\x00\x49\x00\x02\x00\x4b\x00\x32\x00\x33\x00\x1b\x00\x1c\x00\x1d\x00\x37\x00\x32\x00\x33\x00\x34\x00\x3b\x00\x01\x00\x3d\x00\x43\x00\x3f\x00\x3e\x00\x41\x00\x09\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x48\x00\x48\x00\x11\x00\x32\x00\x33\x00\x01\x00\x43\x00\x09\x00\x37\x00\x38\x00\x0c\x00\x3a\x00\x0e\x00\x48\x00\x3d\x00\x43\x00\x3f\x00\x47\x00\x41\x00\x42\x00\x39\x00\x09\x00\x12\x00\x26\x00\x48\x00\x48\x00\x49\x00\x0f\x00\x4b\x00\x48\x00\x49\x00\x1b\x00\x1c\x00\x1d\x00\x42\x00\x32\x00\x33\x00\x34\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x01\x00\x42\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x03\x00\x03\x00\x03\x00\x32\x00\x33\x00\x2c\x00\x2d\x00\x2e\x00\x37\x00\x38\x00\x12\x00\x3a\x00\x48\x00\x03\x00\x3d\x00\x3e\x00\x3f\x00\x0f\x00\x41\x00\x1b\x00\x1c\x00\x1d\x00\x48\x00\x36\x00\x09\x00\x48\x00\x49\x00\x0c\x00\x4b\x00\x0e\x00\x43\x00\x43\x00\x43\x00\x09\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x48\x00\x42\x00\x11\x00\x32\x00\x33\x00\x01\x00\x48\x00\x47\x00\x37\x00\x38\x00\x47\x00\x3a\x00\x47\x00\x47\x00\x3d\x00\x47\x00\x3f\x00\x4a\x00\x41\x00\x42\x00\x4a\x00\x09\x00\x12\x00\x26\x00\x4a\x00\x48\x00\x49\x00\x0f\x00\x4b\x00\x4a\x00\x4a\x00\x1b\x00\x1c\x00\x1d\x00\x04\x00\x32\x00\x33\x00\x34\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x01\x00\x47\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x47\x00\x47\x00\x3c\x00\x32\x00\x33\x00\x2c\x00\x2d\x00\x2e\x00\x37\x00\x38\x00\x12\x00\x3a\x00\x3a\x00\x35\x00\x3d\x00\x3e\x00\x3f\x00\x35\x00\x41\x00\x1b\x00\x1c\x00\x1d\x00\x48\x00\x35\x00\x48\x00\x48\x00\x49\x00\x0d\x00\x4b\x00\x43\x00\x34\x00\x3e\x00\x34\x00\x09\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x48\x00\x48\x00\x11\x00\x32\x00\x33\x00\x01\x00\x3e\x00\x3e\x00\x37\x00\x38\x00\x0f\x00\x3a\x00\x04\x00\x43\x00\x3d\x00\x48\x00\x3f\x00\x42\x00\x41\x00\x42\x00\x05\x00\x09\x00\x12\x00\x26\x00\x4a\x00\x48\x00\x49\x00\x0f\x00\x4b\x00\x47\x00\x4a\x00\x1b\x00\x1c\x00\x1d\x00\x4a\x00\x32\x00\x33\x00\x34\x00\x1a\x00\x1b\x00\x48\x00\x1d\x00\x1e\x00\x1f\x00\x01\x00\x42\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x39\x00\x3e\x00\x39\x00\x32\x00\x33\x00\x39\x00\x39\x00\x39\x00\x37\x00\x38\x00\x12\x00\x3a\x00\x39\x00\x42\x00\x3d\x00\x3e\x00\x3f\x00\x42\x00\x41\x00\x1b\x00\x1c\x00\x1d\x00\x3e\x00\x34\x00\x09\x00\x48\x00\x49\x00\x36\x00\x4b\x00\x42\x00\x0f\x00\x48\x00\x01\x00\x42\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x32\x00\x33\x00\x3c\x00\x32\x00\x33\x00\x1d\x00\x1e\x00\x1f\x00\x37\x00\x38\x00\x12\x00\x3a\x00\x48\x00\x3f\x00\x3d\x00\x41\x00\x3f\x00\x48\x00\x41\x00\x1b\x00\x1c\x00\x43\x00\x48\x00\x4b\x00\x09\x00\x48\x00\x49\x00\x43\x00\x4b\x00\x43\x00\x0f\x00\x43\x00\x09\x00\x36\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x05\x00\x11\x00\x3c\x00\x01\x00\x33\x00\x1d\x00\x1e\x00\x1f\x00\x37\x00\x38\x00\x4a\x00\x3a\x00\x47\x00\x03\x00\x3d\x00\x48\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x12\x00\x3d\x00\x26\x00\x3d\x00\x3d\x00\x48\x00\x49\x00\x0c\x00\x4b\x00\x1b\x00\x1c\x00\x1d\x00\x30\x00\x31\x00\x09\x00\x33\x00\x34\x00\x02\x00\x4a\x00\x48\x00\x0f\x00\x02\x00\x01\x00\x41\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x39\x00\x39\x00\x3e\x00\x32\x00\x33\x00\x1d\x00\x1e\x00\x1f\x00\x37\x00\x38\x00\x12\x00\x3a\x00\x3e\x00\x42\x00\x3d\x00\x42\x00\x3f\x00\x42\x00\x41\x00\x1b\x00\x1c\x00\x35\x00\x39\x00\x43\x00\x4c\x00\x48\x00\x49\x00\x48\x00\x4b\x00\x3b\x00\x4c\x00\x09\x00\x1f\x00\x09\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x11\x00\x4c\x00\x11\x00\x01\x00\x33\x00\xff\xff\xff\xff\xff\xff\x37\x00\x38\x00\xff\xff\x3a\x00\xff\xff\xff\xff\x3d\x00\xff\xff\x3f\x00\x40\x00\x41\x00\x42\x00\x12\x00\x26\x00\xff\xff\x26\x00\xff\xff\x48\x00\x49\x00\x2a\x00\x4b\x00\x1b\x00\x1c\x00\x1d\x00\xff\xff\x32\x00\x33\x00\x34\x00\x33\x00\x34\x00\xff\xff\xff\xff\xff\xff\xff\xff\x01\x00\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\xff\xff\xff\xff\xff\xff\x32\x00\x33\x00\xff\xff\xff\xff\xff\xff\x37\x00\x38\x00\x12\x00\x3a\x00\xff\xff\xff\xff\x3d\x00\xff\xff\x3f\x00\xff\xff\x41\x00\x1b\x00\x1c\x00\xff\xff\xff\xff\xff\xff\xff\xff\x48\x00\x49\x00\xff\xff\x4b\x00\xff\xff\xff\xff\x09\x00\xff\xff\x09\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x11\x00\xff\xff\x11\x00\x01\x00\x33\x00\xff\xff\xff\xff\xff\xff\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\xff\xff\x3f\x00\xff\xff\x41\x00\xff\xff\x12\x00\x26\x00\xff\xff\x26\x00\xff\xff\x48\x00\x49\x00\x2a\x00\x4b\x00\x1b\x00\x1c\x00\x1d\x00\xff\xff\x32\x00\x33\x00\x34\x00\x33\x00\x34\x00\xff\xff\xff\xff\xff\xff\xff\xff\x01\x00\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\xff\xff\xff\xff\xff\xff\x32\x00\x33\x00\xff\xff\xff\xff\xff\xff\x37\x00\x38\x00\x12\x00\x3a\x00\xff\xff\xff\xff\x3d\x00\xff\xff\x3f\x00\xff\xff\x41\x00\x1b\x00\x1c\x00\xff\xff\xff\xff\xff\xff\xff\xff\x48\x00\x49\x00\xff\xff\x4b\x00\xff\xff\xff\xff\x09\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x11\x00\xff\xff\xff\xff\x01\x00\x33\x00\xff\xff\xff\xff\xff\xff\x37\x00\x38\x00\xff\xff\x3a\x00\xff\xff\xff\xff\x3d\x00\xff\xff\x3f\x00\xff\xff\x41\x00\x42\x00\x12\x00\x26\x00\xff\xff\xff\xff\xff\xff\x48\x00\x49\x00\xff\xff\x4b\x00\x1b\x00\x1c\x00\xff\xff\xff\xff\x32\x00\x33\x00\x34\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x01\x00\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\xff\xff\xff\xff\xff\xff\xff\xff\x33\x00\xff\xff\xff\xff\xff\xff\x37\x00\x38\x00\x12\x00\x3a\x00\xff\xff\xff\xff\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x1b\x00\x1c\x00\xff\xff\xff\xff\xff\xff\xff\xff\x48\x00\x49\x00\xff\xff\x4b\x00\xff\xff\xff\xff\x09\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x11\x00\xff\xff\xff\xff\x01\x00\x33\x00\xff\xff\xff\xff\xff\xff\x37\x00\x38\x00\xff\xff\x3a\x00\xff\xff\xff\xff\x3d\x00\xff\xff\x3f\x00\xff\xff\x41\x00\x42\x00\x12\x00\x26\x00\xff\xff\xff\xff\xff\xff\x48\x00\x49\x00\xff\xff\x4b\x00\x1b\x00\x1c\x00\xff\xff\x31\x00\xff\xff\x33\x00\x34\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x01\x00\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\xff\xff\xff\xff\xff\xff\xff\xff\x33\x00\xff\xff\xff\xff\xff\xff\x37\x00\x38\x00\x12\x00\x3a\x00\xff\xff\xff\xff\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x1b\x00\x1c\x00\xff\xff\xff\xff\xff\xff\xff\xff\x48\x00\x49\x00\xff\xff\x4b\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\xff\xff\xff\xff\x32\x00\x33\x00\x33\x00\xff\xff\xff\xff\x37\x00\x37\x00\x38\x00\x12\x00\x3a\x00\xff\xff\x3d\x00\x3d\x00\x3f\x00\x3f\x00\x41\x00\x41\x00\x1b\x00\x1c\x00\xff\xff\xff\xff\xff\xff\x48\x00\x48\x00\x49\x00\xff\xff\x4b\x00\x32\x00\x33\x00\xff\xff\xff\xff\xff\xff\x37\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\xff\xff\x3d\x00\xff\xff\x3f\x00\x33\x00\x41\x00\xff\xff\xff\xff\x37\x00\x38\x00\x12\x00\xff\xff\x48\x00\xff\xff\x3d\x00\xff\xff\x3f\x00\xff\xff\x41\x00\x1b\x00\x1c\x00\xff\xff\xff\xff\xff\xff\xff\xff\x48\x00\x49\x00\xff\xff\x4b\x00\x32\x00\x33\x00\xff\xff\xff\xff\xff\xff\x37\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\xff\xff\x3d\x00\xff\xff\x3f\x00\x33\x00\x41\x00\xff\xff\xff\xff\x37\x00\x38\x00\x12\x00\xff\xff\x48\x00\xff\xff\x3d\x00\xff\xff\x3f\x00\xff\xff\x41\x00\x1b\x00\x1c\x00\xff\xff\xff\xff\xff\xff\xff\xff\x48\x00\x49\x00\xff\xff\x4b\x00\x32\x00\x33\x00\xff\xff\xff\xff\xff\xff\x37\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\xff\xff\x3d\x00\xff\xff\x3f\x00\x33\x00\x41\x00\xff\xff\xff\xff\x37\x00\x38\x00\x12\x00\xff\xff\x48\x00\xff\xff\x3d\x00\xff\xff\x3f\x00\xff\xff\x41\x00\x1b\x00\x1c\x00\xff\xff\xff\xff\xff\xff\xff\xff\x48\x00\x49\x00\xff\xff\x4b\x00\x32\x00\x33\x00\xff\xff\xff\xff\xff\xff\x37\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\xff\xff\x3d\x00\xff\xff\x3f\x00\x33\x00\x41\x00\xff\xff\xff\xff\x37\x00\x38\x00\x12\x00\xff\xff\x48\x00\xff\xff\x3d\x00\xff\xff\x3f\x00\xff\xff\x41\x00\x1b\x00\x1c\x00\xff\xff\xff\xff\xff\xff\xff\xff\x48\x00\x49\x00\xff\xff\x4b\x00\x32\x00\x33\x00\xff\xff\xff\xff\xff\xff\x37\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\xff\xff\x3d\x00\xff\xff\x3f\x00\x33\x00\x41\x00\xff\xff\xff\xff\x37\x00\x38\x00\x12\x00\xff\xff\x48\x00\xff\xff\x3d\x00\xff\xff\x3f\x00\xff\xff\x41\x00\x1b\x00\x1c\x00\xff\xff\xff\xff\xff\xff\xff\xff\x48\x00\x49\x00\xff\xff\x4b\x00\xff\xff\xff\xff\x09\x00\xff\xff\xff\xff\xff\xff\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x11\x00\xff\xff\xff\xff\xff\xff\x33\x00\xff\xff\xff\xff\xff\xff\x37\x00\x38\x00\xff\xff\xff\xff\xff\xff\xff\xff\x3d\x00\xff\xff\x3f\x00\xff\xff\x41\x00\xff\xff\xff\xff\x26\x00\xff\xff\xff\xff\xff\xff\x48\x00\x49\x00\x09\x00\x4b\x00\xff\xff\xff\xff\xff\xff\x31\x00\x0f\x00\x33\x00\x34\x00\xff\xff\x13\x00\x14\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x27\x00\x09\x00\xff\xff\x0b\x00\xff\xff\x2c\x00\x2d\x00\x0f\x00\x2f\x00\xff\xff\xff\xff\x13\x00\x14\x00\xff\xff\xff\xff\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\xff\xff\xff\xff\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x09\x00\xff\xff\x0b\x00\xff\xff\xff\xff\xff\xff\x0f\x00\xff\xff\xff\xff\xff\xff\x13\x00\x14\x00\xff\xff\xff\xff\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\xff\xff\xff\xff\x09\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x0f\x00\xff\xff\xff\xff\xff\xff\x13\x00\x14\x00\xff\xff\xff\xff\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\xff\xff\xff\xff\x09\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x0f\x00\xff\xff\xff\xff\xff\xff\x13\x00\x14\x00\xff\xff\xff\xff\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\xff\xff\xff\xff\x09\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x0f\x00\xff\xff\xff\xff\xff\xff\x13\x00\x14\x00\xff\xff\xff\xff\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\xff\xff\xff\xff\x09\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x0f\x00\xff\xff\xff\xff\xff\xff\x13\x00\x14\x00\xff\xff\xff\xff\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\xff\xff\xff\xff\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x09\x00\xff\xff\x0b\x00\xff\xff\xff\xff\xff\xff\x0f\x00\xff\xff\xff\xff\xff\xff\x13\x00\x14\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x1a\x00\x1b\x00\xff\xff\x1d\x00\x1e\x00\x1f\x00\x09\x00\xff\xff\x0b\x00\xff\xff\xff\xff\xff\xff\x0f\x00\x27\x00\xff\xff\xff\xff\x13\x00\x14\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\x1b\x00\xff\xff\x1d\x00\x1e\x00\x1f\x00\x09\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x0f\x00\x27\x00\xff\xff\xff\xff\x13\x00\x14\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\x1b\x00\xff\xff\x1d\x00\x1e\x00\x1f\x00\x09\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x0f\x00\x27\x00\xff\xff\xff\xff\x13\x00\x14\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\x1b\x00\xff\xff\x1d\x00\x1e\x00\x1f\x00\x09\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x0f\x00\x27\x00\xff\xff\xff\xff\x13\x00\x14\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\x1b\x00\xff\xff\x1d\x00\x1e\x00\x1f\x00\x09\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x0f\x00\x27\x00\xff\xff\xff\xff\x13\x00\x14\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\x1b\x00\xff\xff\x1d\x00\x1e\x00\x1f\x00\x09\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x0f\x00\x27\x00\xff\xff\xff\xff\x13\x00\x14\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\x1b\x00\xff\xff\x1d\x00\x1e\x00\x1f\x00\x09\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x0f\x00\x27\x00\xff\xff\xff\xff\x13\x00\x14\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\x1b\x00\xff\xff\x1d\x00\x1e\x00\x1f\x00\x09\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x0f\x00\x27\x00\xff\xff\xff\xff\x13\x00\x14\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\x1b\x00\xff\xff\x1d\x00\x1e\x00\x1f\x00\x09\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x0f\x00\x27\x00\xff\xff\xff\xff\x13\x00\x14\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\x1b\x00\xff\xff\x1d\x00\x1e\x00\x1f\x00\x09\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x0f\x00\x27\x00\xff\xff\xff\xff\x13\x00\x14\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\x1b\x00\xff\xff\x1d\x00\x1e\x00\x1f\x00\x09\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x0f\x00\x27\x00\xff\xff\xff\xff\x13\x00\x14\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\x1b\x00\xff\xff\x1d\x00\x1e\x00\x1f\x00\x09\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x0f\x00\x27\x00\xff\xff\xff\xff\x13\x00\x14\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\x1b\x00\xff\xff\x1d\x00\x1e\x00\x1f\x00\x09\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x0f\x00\x27\x00\xff\xff\xff\xff\x13\x00\x14\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\x1b\x00\xff\xff\x1d\x00\x1e\x00\x1f\x00\x09\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x0f\x00\x27\x00\xff\xff\xff\xff\x13\x00\x14\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\x1b\x00\xff\xff\x1d\x00\x1e\x00\x1f\x00\x09\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x0f\x00\x27\x00\xff\xff\xff\xff\x13\x00\x14\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\x1b\x00\xff\xff\x1d\x00\x1e\x00\x1f\x00\x09\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x0f\x00\x27\x00\xff\xff\xff\xff\x13\x00\x14\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\x1b\x00\xff\xff\x1d\x00\x1e\x00\x1f\x00\x09\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x0f\x00\x27\x00\xff\xff\xff\xff\x13\x00\x14\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\x1b\x00\xff\xff\x1d\x00\x1e\x00\x1f\x00\x09\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x0f\x00\x27\x00\xff\xff\xff\xff\x13\x00\x14\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\x1b\x00\xff\xff\x1d\x00\x1e\x00\x1f\x00\x09\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x0f\x00\x27\x00\xff\xff\xff\xff\x13\x00\x14\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\x1b\x00\xff\xff\x1d\x00\x1e\x00\x1f\x00\x09\x00\xff\xff\x0b\x00\xff\xff\xff\xff\xff\xff\x0f\x00\x27\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\xff\xff\x09\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x0f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\xff\xff\x09\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x0f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\xff\xff\x09\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x0f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\xff\xff\x09\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x0f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\xff\xff\x09\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x0f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\xff\xff\x09\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x0f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\xff\xff\x09\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x0f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\xff\xff\x09\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x0f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\xff\xff\x09\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x0f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\xff\xff\x09\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x0f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\xff\xff\x09\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x0f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\xff\xff\x09\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x0f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\xff\xff\x09\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x0f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\xff\xff\x09\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x0f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\xff\xff\x09\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x0f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\xff\xff\x09\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x0f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\xff\xff\x09\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x0f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\xff\xff\x09\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x0f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\xff\xff\x09\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x0f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\xff\xff\x09\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x0f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\xff\xff\x09\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x0f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\xff\xff\x09\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x0f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\xff\xff\x09\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x0f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\xff\xff\x09\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x0f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\xff\xff\x09\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x0f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\xff\xff\xff\xff\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff"#--happyTable :: HappyAddr-happyTable = HappyA# "\x00\x00\x6d\x02\xad\x01\x73\x02\x53\x01\xeb\x00\xc5\x01\xcb\x01\xcc\x01\xc6\x01\xc7\x01\x12\x00\x1f\x02\xc5\x01\x8a\x02\x42\x00\xd4\x01\x43\x00\x83\x02\x97\x01\xec\x00\x15\x00\x16\x00\x17\x00\xe4\x00\x19\x00\x1a\x00\x1b\x00\x62\x01\x05\x00\x06\x00\xc5\x01\xcb\x01\xad\x01\xd4\x01\xb2\x01\xd5\x01\xcb\x01\xcc\x01\x0e\x00\x0f\x00\x79\x00\x63\x01\x46\x00\x7e\x02\x64\x01\x10\x00\x7a\x00\x47\x02\xc5\x01\x7f\x00\x3b\x01\xd4\x01\x33\x00\xd5\x01\xae\x01\xaf\x01\xb0\x01\x7f\x02\xcb\x01\xcc\x01\xed\x00\x20\x02\xd9\x00\xda\x00\xdb\x00\xee\x00\xdc\x00\xef\x00\xcd\x01\xc8\x01\xf0\x00\x87\x02\xf1\x00\xf2\x00\xf3\x00\xf4\x00\x6e\x02\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xae\x01\x98\x01\x3d\x02\x97\x01\xfd\x00\x33\x00\x33\x00\xfe\x00\xff\x00\x00\x01\xd6\x01\x7f\x00\x01\x01\xcd\x01\x02\x01\x11\x00\x03\x01\x04\x01\x05\x01\x06\x01\x07\x01\x08\x01\x09\x01\x0a\x01\x0b\x01\x0c\x01\x79\x00\x32\x02\x54\x02\xce\x01\xc9\x01\xeb\x00\x7a\x00\x47\x02\x07\x00\x45\x02\x6f\x02\x12\x00\x08\x00\xdd\x00\x09\x00\x0a\x00\x78\x02\x0b\x00\x25\x02\x0c\x00\xec\x00\x15\x00\x16\x00\x17\x00\xe4\x00\x19\x00\x1a\x00\x1b\x00\x07\x00\x62\x01\x11\x00\xd7\x01\x08\x00\xce\x01\x09\x00\x0a\x00\x12\x00\x0b\x00\x11\x00\x0c\x00\x21\x01\x53\x01\x8b\x02\x95\x01\x12\x00\x98\x01\x64\x01\x21\x02\x33\x00\x34\x00\x19\x00\x1a\x00\xcf\x00\x52\x00\xff\x01\x62\x01\x7f\x00\x66\x02\x19\x00\x1a\x00\xcf\x00\xed\x00\x90\x01\x23\x02\xf5\x01\x24\x01\xee\x00\x69\x02\xef\x00\x26\x02\x33\x00\xf0\x00\x64\x01\xf1\x00\xf2\x00\xf3\x00\xf4\x00\x6b\x02\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\x53\x01\x48\x02\xc5\x01\xad\x01\xfd\x00\xc6\x01\xc7\x01\xfe\x00\xff\x00\x00\x01\xb3\x01\x22\x02\x01\x01\x01\x02\x02\x01\xb3\x01\x03\x01\x04\x01\x05\x01\x06\x01\x07\x01\x08\x01\x09\x01\x0a\x01\x0b\x01\x0c\x01\xeb\x00\x24\x02\xc3\x01\x8b\x01\x76\x02\x11\x00\x12\x00\x33\x00\x34\x00\x12\x00\x0d\x01\x12\x00\xaa\x01\x79\x02\xc4\x01\xec\x00\x15\x00\x16\x00\x17\x00\xe4\x00\x19\x00\x1a\x00\x1b\x00\x21\x01\x66\x00\x19\x00\x1a\x00\xcf\x00\x21\x01\x11\x00\xae\x01\x86\xff\xb2\x01\xe9\x01\xe4\x01\x12\x00\x3e\x02\xb5\x01\xb6\x01\x78\x00\x43\x02\xb4\x01\xb5\x01\xb6\x01\x86\xff\xe5\x01\x6f\x01\x23\x01\x24\x01\x46\x00\x66\x00\x22\x01\x23\x01\x24\x01\x46\x00\x50\x01\xed\x00\xdc\x01\x12\x02\x54\x01\x78\x00\xee\x00\x3e\x01\xef\x00\x78\x00\x12\x02\xf0\x00\x3f\x02\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xe4\x01\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\x2b\x00\x6e\x00\xe5\x01\x76\x00\xfd\x00\x40\x02\x77\x00\xfe\x00\xff\x00\x00\x01\xd0\x00\x64\x00\x01\x01\x6f\x00\x02\x01\x70\x00\x03\x01\x04\x01\x05\x01\x06\x01\x07\x01\x08\x01\x09\x01\x0a\x01\x0b\x01\x0c\x01\xeb\x00\x79\x00\x19\x02\x22\x00\x1a\x02\x11\x00\x12\x00\x7a\x00\x7d\x00\x51\x02\x89\x02\x12\x00\x23\x00\x24\x00\x59\x02\xec\x00\x15\x00\x16\x00\x17\x00\xe4\x00\x19\x00\x1a\x00\x1b\x00\x5d\x02\x73\x00\x19\x00\x1a\x00\xe6\x01\x27\x00\x28\x00\x29\x00\x2a\x00\x27\xff\x27\xff\x61\x02\x5b\x02\x57\x00\x27\xff\x5c\x02\x27\xff\x2d\x00\x2e\x00\x03\x02\x27\xff\x46\x00\x27\xff\x68\x00\x27\xff\x78\x02\x06\x02\x75\x00\x0d\x02\xdc\x01\xdd\x01\x27\xff\x08\x02\xed\x00\x33\x00\x34\x00\x4b\x02\x35\x00\xee\x00\x42\x00\xef\x00\x43\x00\x7c\x02\xf0\x00\x09\x02\xf1\x00\xf2\x00\xf3\x00\xf4\x00\x0a\x02\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\x4b\x02\xe9\x00\x46\x00\xea\x00\xfd\x00\xeb\x00\x7d\x02\xfe\x00\xff\x00\x00\x01\xdc\x01\xde\x01\x01\x01\x42\x00\x02\x01\x43\x00\x03\x01\x04\x01\x05\x01\x06\x01\x07\x01\x08\x01\x09\x01\x0a\x01\x0b\x01\x0c\x01\xeb\x00\x79\x00\x0e\x02\x22\x00\x15\x02\x11\x00\x12\x00\x7a\x00\xce\x00\x2f\x02\x0d\x01\x12\x00\x23\x00\x24\x00\x30\x02\xec\x00\x15\x00\x16\x00\x17\x00\xe4\x00\x19\x00\x1a\x00\x1b\x00\x33\x02\xe5\x01\x19\x00\x1a\x00\xe6\x01\x27\x00\x28\x00\x29\x00\x2a\x00\x50\x00\x51\x00\x80\x02\x95\x01\x57\x00\x52\x00\xac\x01\x41\xff\x2d\x00\x2e\x00\x37\x02\x45\x01\x46\x00\x46\x01\x68\x00\x47\x01\x69\x00\x4b\x02\x75\x00\x39\x02\xdc\x01\xdf\x01\x33\x00\x4c\x02\xed\x00\x33\x00\x34\x00\x4b\x02\x35\x00\xc4\x01\xc1\x01\xef\x00\xbe\x01\x4f\x02\xf0\x00\xcf\x01\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xe7\x01\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\x9d\x01\x17\x02\xe9\x01\x18\x02\xfd\x00\xeb\x01\x78\x00\xfe\x00\xff\x00\x00\x01\x33\x00\x7c\xff\x01\x01\x7c\xff\x02\x01\x7c\xff\x03\x01\x04\x01\x05\x01\x06\x01\x07\x01\x08\x01\x09\x01\x0a\x01\x0b\x01\x0c\x01\x97\x01\x21\x00\x81\x02\x82\x02\x79\x00\x46\x00\x0f\x01\x10\x01\x11\x01\x0f\x00\x7a\x00\x7b\x00\xec\x01\x47\x00\xed\x01\x12\x01\x13\x01\x14\x01\x15\x01\x71\x02\x16\x01\x17\x01\x18\x01\x19\x01\x1a\x01\x1b\x01\x1c\x01\x23\x00\x24\x00\xee\x01\x1d\x01\xd9\x00\xda\x00\xdb\x00\x48\x00\xdc\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\xb9\x01\x49\x02\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x4d\x00\x4e\x00\x1e\x01\xef\x01\x1f\x01\x0e\x00\x0f\x00\x52\x00\x2d\x00\x2e\x00\xf0\x01\x2f\x00\x10\x00\xe9\x00\x68\x00\x3d\x01\x69\x00\x3e\x01\x75\x00\x46\x00\xfd\x01\x98\x01\xff\x01\x20\x01\x33\x00\x33\x00\x34\x00\x47\x00\x35\x00\x97\x01\x21\x00\xcb\x01\x55\x02\x79\x00\x46\x00\x0f\x01\x10\x01\x11\x01\x0f\x00\x7a\x00\x7c\x00\x01\x02\x47\x00\x60\x01\x12\x01\x13\x01\x14\x01\x15\x01\xdd\x00\x16\x01\x17\x01\x18\x01\x19\x01\x1a\x01\x1b\x01\x1c\x01\x23\x00\x24\x00\x79\x00\x1d\x01\x26\x02\xdf\x00\x62\x00\x41\x01\x7a\x00\x7d\x00\xc5\x01\x5a\x01\x64\x01\xc6\x01\x13\x02\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x43\x01\x62\x00\x1e\x01\x67\x01\x1f\x01\xcb\x01\x56\x02\x52\x00\x2d\x00\x2e\x00\x6a\x01\x2f\x00\x6d\x01\x5b\x00\x68\x00\x40\x01\x69\x00\x41\x01\x75\x00\xcb\x01\x57\x02\x98\x01\x7f\x01\x20\x01\x33\x00\x33\x00\x34\x00\x81\x01\x35\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\x21\x00\xe0\x01\xe1\x01\xe2\x01\x46\x00\x0f\x01\x10\x01\x11\x01\x0f\x00\x5b\x00\x82\x01\x5c\x00\x47\x00\x5d\x00\x12\x01\x13\x01\x14\x01\x15\x01\x83\x01\x16\x01\x17\x01\x18\x01\x19\x01\x1a\x01\x1b\x01\x1c\x01\x23\x00\x24\x00\x07\x00\x1d\x01\xcb\x01\x58\x02\x08\x00\x41\x01\x80\x00\x0a\x00\x84\x01\x5b\x01\x85\x01\x21\x00\x87\x01\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x43\x01\x62\x00\x1e\x01\xc5\x01\x1f\x01\x88\x01\xc6\x01\x14\x02\x2d\x00\x2e\x00\x22\x00\x2f\x00\xc5\x01\x89\x01\x68\x00\xd4\x01\x69\x00\x84\x02\x75\x00\x23\x00\x24\x00\x25\x00\x8c\x01\x20\x01\xc5\x01\x33\x00\x34\x00\xd4\x01\x35\x00\x85\x02\xa3\x01\xd6\x00\xd7\x00\x8d\x01\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x10\x02\xe2\x01\x7c\x02\x2b\x00\x2c\x00\x21\x00\x07\x00\x8e\x01\x2d\x00\x2e\x00\x08\x00\x2f\x00\x81\x00\x0a\x00\x30\x00\x90\x01\x31\x00\x42\x00\x32\x00\x43\x00\xc5\x01\x11\x00\x22\x00\xc6\x01\x2e\x02\x33\x00\x34\x00\x12\x00\x35\x00\xcb\x01\x2a\x02\x23\x00\x24\x00\x25\x00\xd9\x00\xda\x00\xdb\x00\xe3\x00\x16\x00\x17\x00\xe4\x00\x19\x00\x1a\x00\x1b\x00\x1a\x02\x1b\x02\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x27\x02\x28\x02\xa9\x01\x2b\x00\x2c\x00\x21\x00\x92\x01\xc5\x01\x2d\x00\x2e\x00\xd4\x01\x2f\x00\x86\x02\x98\x01\x30\x00\x9d\x01\x31\x00\x42\x00\x32\x00\x43\x00\x9a\x01\x11\x00\x22\x00\x2b\x02\x2c\x02\x33\x00\x34\x00\x12\x00\x35\x00\xb9\x01\xba\x01\x23\x00\x24\x00\x25\x00\x94\x01\x95\x01\x6c\x00\x1f\x00\x72\x00\x17\x00\x73\x00\x19\x00\x1a\x00\x1b\x00\xa2\x01\x46\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x35\x00\x04\x00\x47\x00\x2b\x00\x2c\x00\x21\x00\x4d\x01\xc5\x01\x2d\x00\x2e\x00\xd4\x01\x2f\x00\x67\x02\xa7\x01\x30\x00\xe0\x00\x31\x00\x42\x00\x32\x00\x43\x00\x4e\x01\x5d\x00\x22\x00\xdd\x00\x6a\x00\x33\x00\x34\x00\x82\x00\x35\x00\x50\x00\x51\x00\x23\x00\x24\x00\x25\x00\x52\x00\xd0\x01\xdf\x00\x62\x00\x78\x00\x04\x00\x64\x00\x4e\x02\x65\x00\x89\x02\x66\x00\x46\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x33\x00\x33\x00\x47\x00\x2b\x00\x2c\x00\x21\x00\x53\x02\xc5\x01\x2d\x00\x2e\x00\xd4\x01\x2f\x00\x68\x02\xe5\x01\x30\x00\x6c\x00\x31\x00\x65\x02\x32\x00\x3d\x00\x66\x02\x11\x00\x22\x00\xdd\x00\xe5\x01\x33\x00\x34\x00\x12\x00\x35\x00\x33\x00\x34\x00\x23\x00\x24\x00\x25\x00\x6b\x02\xd1\x01\xdf\x00\x62\x00\xf8\x01\x17\x00\x34\x01\x19\x00\x1a\x00\x1b\x00\x21\x00\x6d\x02\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x72\x02\x73\x02\x75\x02\x2b\x00\x2c\x00\xf9\x01\xfa\x01\xfb\x01\x2d\x00\x2e\x00\x22\x00\x2f\x00\x33\x00\x42\x02\x30\x00\x46\x00\x31\x00\xb8\x01\x32\x00\x23\x00\x24\x00\x25\x00\x33\x00\x47\x02\xc5\x01\x33\x00\x34\x00\xd4\x01\x35\x00\x1d\x02\xbc\x01\x4e\x02\x53\x02\x46\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x33\x00\x5b\x02\x47\x00\x2b\x00\x2c\x00\x21\x00\xe5\x01\x5f\x02\x2d\x00\x2e\x00\x60\x02\x2f\x00\x61\x02\x63\x02\x30\x00\x64\x02\x31\x00\xe2\x00\x32\x00\x3d\x00\xeb\x01\x11\x00\x22\x00\xdd\x00\xe2\x00\x33\x00\x34\x00\x12\x00\x35\x00\x08\x02\xe2\x00\x23\x00\x24\x00\x25\x00\xc0\x01\xd2\x01\xdf\x00\x62\x00\xf8\x01\x17\x00\x34\x01\x19\x00\x1a\x00\x1b\x00\x21\x00\x05\x02\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x06\x02\x0c\x02\x81\x01\x2b\x00\x2c\x00\xf9\x01\xfa\x01\xfc\x01\x2d\x00\x2e\x00\x22\x00\x2f\x00\x10\x02\x1d\x02\x30\x00\x46\x00\x31\x00\x2a\x02\x32\x00\x23\x00\x24\x00\x25\x00\x33\x00\x2e\x02\x33\x00\x33\x00\x34\x00\x35\x02\x35\x00\x6c\x00\x36\x02\x37\x02\x3c\x02\x46\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x33\x00\x33\x00\x47\x00\x2b\x00\x2c\x00\x21\x00\x39\x02\x3b\x02\x2d\x00\x2e\x00\xb8\x01\x2f\x00\xc0\x01\xbc\x01\x30\x00\x33\x00\x31\x00\xf7\x01\x32\x00\x3d\x00\x9c\x01\x11\x00\x22\x00\xdd\x00\xeb\x01\x33\x00\x34\x00\x12\x00\x35\x00\xf2\x01\xf3\x01\x23\x00\x24\x00\x25\x00\xf4\x01\xd3\x01\xdf\x00\x62\x00\x72\x00\x17\x00\x33\x00\x19\x00\x1a\x00\xe7\x00\x21\x00\x03\x02\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x43\xff\x67\x01\x44\xff\x2b\x00\x2c\x00\x40\xff\x3e\xff\x3f\xff\x2d\x00\x2e\x00\x22\x00\x2f\x00\x66\x01\x69\x01\x30\x00\x46\x00\x31\x00\x6c\x01\x32\x00\x23\x00\x24\x00\x25\x00\x6a\x01\x71\x01\x7e\x01\x33\x00\x34\x00\x73\x01\x35\x00\x6f\x01\x12\x00\x33\x00\x21\x00\x72\x01\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\xd9\x01\xda\x01\x81\x01\x2b\x00\x2c\x00\x19\x00\x1a\x00\x55\x00\x2d\x00\x2e\x00\x22\x00\x2f\x00\x33\x00\xdb\x01\x30\x00\xdc\x01\x31\x00\x33\x00\x32\x00\x23\x00\x24\x00\x6c\x00\x33\x00\x87\x01\x11\x00\x33\x00\x34\x00\x8b\x01\x35\x00\x92\x01\x12\x00\x94\x01\x46\x00\x9a\x01\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x9c\x01\x47\x00\x77\x00\x21\x00\x57\x00\x19\x00\x1a\x00\xe2\x00\x2d\x00\x2e\x00\xe2\x00\x2f\x00\x9f\x01\xa1\x01\x68\x00\x33\x00\x69\x00\x42\x00\x75\x00\x43\x00\x22\x00\xa5\x01\x5e\x00\xa6\x01\xa7\x01\x33\x00\x34\x00\xdb\x00\x35\x00\x23\x00\x24\x00\x25\x00\x5f\x00\x60\x00\x11\x00\x61\x00\x62\x00\x21\x01\xe2\x00\x33\x00\x12\x00\x2d\x01\x21\x00\x26\x01\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2a\x01\x48\x01\x4b\x01\x2b\x00\x2c\x00\x19\x00\x1a\x00\x55\x00\x2d\x00\x2e\x00\x22\x00\x2f\x00\x4c\x01\x4d\x01\x30\x00\x51\x01\x31\x00\x52\x01\x32\x00\x23\x00\x24\x00\x53\x01\x71\x00\x6c\x00\xff\xff\x33\x00\x34\x00\x33\x00\x35\x00\x78\x00\xff\xff\x46\x00\x79\x00\x46\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x47\x00\xff\xff\x47\x00\x21\x00\x57\x00\x00\x00\x00\x00\x00\x00\x2d\x00\x2e\x00\x00\x00\x2f\x00\x00\x00\x00\x00\x68\x00\x00\x00\x69\x00\x42\x00\x75\x00\x43\x00\x22\x00\xdd\x00\x00\x00\x41\x01\x00\x00\x33\x00\x34\x00\x42\x01\x35\x00\x23\x00\x24\x00\x25\x00\x00\x00\x9f\x01\xdf\x00\x62\x00\x43\x01\x62\x00\x00\x00\x00\x00\x00\x00\x00\x00\x21\x00\x00\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x00\x00\x00\x00\x00\x00\x2b\x00\x2c\x00\x00\x00\x00\x00\x00\x00\x2d\x00\x2e\x00\x22\x00\x2f\x00\x00\x00\x00\x00\x30\x00\x00\x00\x31\x00\x00\x00\x32\x00\x23\x00\x24\x00\x00\x00\x00\x00\x00\x00\x00\x00\x33\x00\x34\x00\x00\x00\x35\x00\x00\x00\x00\x00\x46\x00\x00\x00\x46\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x47\x00\x00\x00\x47\x00\x21\x00\x57\x00\x00\x00\x00\x00\x00\x00\x2d\x00\x2e\x00\x73\xff\x2f\x00\x00\x00\x73\xff\x68\x00\x00\x00\x69\x00\x00\x00\x75\x00\x00\x00\x22\x00\xdd\x00\x00\x00\x41\x01\x00\x00\x33\x00\x34\x00\x49\x01\x35\x00\x23\x00\x24\x00\x25\x00\x00\x00\xa1\x01\xdf\x00\x62\x00\x43\x01\x62\x00\x00\x00\x00\x00\x00\x00\x00\x00\x21\x00\x00\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x00\x00\x00\x00\x00\x00\x2b\x00\x2c\x00\x00\x00\x00\x00\x00\x00\x2d\x00\x2e\x00\x22\x00\x2f\x00\x00\x00\x00\x00\x30\x00\x00\x00\x31\x00\x00\x00\x32\x00\x23\x00\x24\x00\x00\x00\x00\x00\x00\x00\x00\x00\x33\x00\x34\x00\x00\x00\x35\x00\x00\x00\x00\x00\x46\x00\x00\x00\x00\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x47\x00\x00\x00\x00\x00\x21\x00\x57\x00\x00\x00\x00\x00\x00\x00\x2d\x00\x2e\x00\x00\x00\x2f\x00\x00\x00\x00\x00\x68\x00\x00\x00\x69\x00\x00\x00\x75\x00\x58\x01\x22\x00\xdd\x00\x00\x00\x00\x00\x00\x00\x33\x00\x34\x00\x00\x00\x35\x00\x23\x00\x24\x00\x00\x00\x00\x00\xde\x00\xdf\x00\x62\x00\x7a\x02\xd4\x00\xd5\x00\xd6\x00\xd7\x00\x00\x00\x21\x00\x00\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x57\x00\x00\x00\x00\x00\x00\x00\x2d\x00\x2e\x00\x22\x00\x2f\x00\x00\x00\x00\x00\x68\x00\x5a\x01\x69\x00\x00\x00\x75\x00\x23\x00\x24\x00\x00\x00\x00\x00\x00\x00\x00\x00\x33\x00\x34\x00\x00\x00\x35\x00\x00\x00\x00\x00\x46\x00\x00\x00\x00\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x47\x00\x00\x00\x00\x00\x21\x00\x57\x00\x00\x00\x00\x00\x00\x00\x2d\x00\x2e\x00\x00\x00\x2f\x00\x00\x00\x00\x00\x68\x00\x00\x00\x69\x00\x00\x00\x75\x00\x39\x01\x22\x00\x5e\x00\x00\x00\x00\x00\x00\x00\x33\x00\x34\x00\x00\x00\x35\x00\x23\x00\x24\x00\x00\x00\x28\x01\x00\x00\x61\x00\x62\x00\x75\x02\xd4\x00\xd5\x00\xd6\x00\xd7\x00\x00\x00\x21\x00\x00\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x57\x00\x00\x00\x00\x00\x00\x00\x2d\x00\x2e\x00\x22\x00\x2f\x00\x00\x00\x00\x00\x68\x00\x3b\x01\x69\x00\x00\x00\x75\x00\x23\x00\x24\x00\x00\x00\x00\x00\x00\x00\x00\x00\x33\x00\x34\x00\x00\x00\x35\x00\x3c\x02\xd4\x00\xd5\x00\xd6\x00\xd7\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x00\x00\x00\x00\x50\x00\x51\x00\x57\x00\x00\x00\x00\x00\x52\x00\x2d\x00\x2e\x00\x22\x00\x2f\x00\x00\x00\x64\x00\x68\x00\x65\x00\x69\x00\x66\x00\x75\x00\x23\x00\x24\x00\x00\x00\x00\x00\x00\x00\x33\x00\x33\x00\x34\x00\x00\x00\x35\x00\x50\x00\x51\x00\x00\x00\x00\x00\x00\x00\x52\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x00\x00\x45\x01\x00\x00\x46\x01\x57\x00\x47\x01\x00\x00\x00\x00\x2d\x00\x2e\x00\x22\x00\x00\x00\x33\x00\x00\x00\x68\x00\x00\x00\x69\x00\x00\x00\x6a\x00\x23\x00\x24\x00\x00\x00\x00\x00\x00\x00\x00\x00\x33\x00\x34\x00\x00\x00\x35\x00\x50\x00\x51\x00\x00\x00\x00\x00\x00\x00\x52\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x00\x00\x64\x00\x00\x00\x65\x00\x57\x00\x66\x00\x00\x00\x00\x00\x2d\x00\x2e\x00\x22\x00\x00\x00\x33\x00\x00\x00\x68\x00\x00\x00\x69\x00\x00\x00\x75\x00\x23\x00\x24\x00\x00\x00\x00\x00\x00\x00\x00\x00\x33\x00\x34\x00\x00\x00\x35\x00\x50\x00\x51\x00\x00\x00\x00\x00\x00\x00\x52\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x00\x00\x45\x01\x00\x00\x46\x01\x57\x00\x47\x01\x00\x00\x00\x00\x2d\x00\x2e\x00\x22\x00\x00\x00\x33\x00\x00\x00\x68\x00\x00\x00\xd2\x00\x00\x00\x75\x00\x23\x00\x24\x00\x00\x00\x00\x00\x00\x00\x00\x00\x33\x00\x34\x00\x00\x00\x35\x00\x50\x00\x51\x00\x00\x00\x00\x00\x00\x00\x52\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x00\x00\x53\x00\x00\x00\x54\x00\x57\x00\x55\x00\x00\x00\x00\x00\x2d\x00\x2e\x00\x22\x00\x00\x00\x33\x00\x00\x00\x68\x00\x00\x00\x69\x00\x00\x00\x75\x00\x23\x00\x24\x00\x00\x00\x00\x00\x00\x00\x00\x00\x33\x00\x34\x00\x00\x00\x35\x00\x50\x00\x51\x00\x00\x00\x00\x00\x00\x00\x52\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x00\x00\x64\x00\x00\x00\x65\x00\x57\x00\x66\x00\x00\x00\x00\x00\x2d\x00\x2e\x00\x22\x00\x00\x00\x33\x00\x00\x00\x58\x00\x00\x00\x59\x00\x00\x00\x5a\x00\x23\x00\x24\x00\x00\x00\x00\x00\x00\x00\x00\x00\x33\x00\x34\x00\x00\x00\x35\x00\x00\x00\x00\x00\x46\x00\x00\x00\x00\x00\x00\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x47\x00\x00\x00\x00\x00\x00\x00\x57\x00\x00\x00\x00\x00\x00\x00\x2d\x00\x2e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x68\x00\x00\x00\x69\x00\x00\x00\x6a\x00\x00\x00\x00\x00\x5e\x00\x00\x00\x00\x00\x00\x00\x33\x00\x34\x00\x11\x00\x35\x00\x00\x00\x00\x00\x00\x00\x2b\x01\x12\x00\x61\x00\x62\x00\x00\x00\x37\x00\x26\x01\xb8\x01\xd4\x00\xd5\x00\xd6\x00\xd7\x00\x33\x01\x17\x00\x34\x01\x19\x00\x1a\x00\x1b\x00\xab\x01\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\x00\x00\x3b\x00\x3d\x00\x00\x00\x3e\x00\x00\x00\x35\x01\x36\x01\x12\x00\x37\x01\x00\x00\x00\x00\x37\x00\x38\x00\x00\x00\x00\x00\x3f\x00\x14\x00\x15\x00\x3a\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x00\x00\x00\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x31\x01\x3d\x00\x00\x00\x3e\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x37\x00\x38\x00\x00\x00\x00\x00\x3f\x00\x14\x00\x15\x00\x3a\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x00\x00\x00\x00\x36\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x40\x00\x12\x00\x00\x00\x00\x00\x00\x00\x37\x00\x38\x00\x00\x00\x00\x00\x39\x00\x14\x00\x15\x00\x3a\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x00\x00\x00\x00\x11\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x30\x01\x12\x00\x00\x00\x00\x00\x00\x00\x37\x00\x38\x00\x00\x00\x00\x00\x43\x00\x14\x00\x15\x00\x3a\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x00\x00\x00\x00\x36\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x32\x01\x12\x00\x00\x00\x00\x00\x00\x00\x37\x00\x38\x00\x00\x00\x00\x00\x39\x00\x14\x00\x15\x00\x3a\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x00\x00\x00\x00\x11\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x3b\x00\x12\x00\x00\x00\x00\x00\x00\x00\x37\x00\x38\x00\x00\x00\x00\x00\x43\x00\x14\x00\x15\x00\x3a\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x00\x00\x00\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x44\x00\x11\x00\x00\x00\x58\x01\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x27\x01\x38\x00\xa9\x01\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xe6\x00\x17\x00\x00\x00\x19\x00\x1a\x00\xe7\x00\x11\x00\x00\x00\x39\x01\x00\x00\x00\x00\x00\x00\x12\x00\x40\x00\x00\x00\x00\x00\x27\x01\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe6\x00\x17\x00\x00\x00\x19\x00\x1a\x00\xe7\x00\x11\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x40\x00\x00\x00\x00\x00\x37\x00\x26\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe6\x00\x17\x00\x00\x00\x19\x00\x1a\x00\xe7\x00\x11\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x3b\x00\x00\x00\x00\x00\x37\x00\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe6\x00\x17\x00\x00\x00\x19\x00\x1a\x00\xe7\x00\x11\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x44\x00\x00\x00\x00\x00\x5c\x01\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe6\x00\x17\x00\x00\x00\x19\x00\x1a\x00\xe7\x00\x11\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x2d\x01\x00\x00\x00\x00\x5d\x01\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe6\x00\x17\x00\x00\x00\x19\x00\x1a\x00\xe7\x00\x11\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x2e\x01\x00\x00\x00\x00\x5e\x01\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe6\x00\x17\x00\x00\x00\x19\x00\x1a\x00\xe7\x00\x11\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x30\x01\x00\x00\x00\x00\x5f\x01\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe6\x00\x17\x00\x00\x00\x19\x00\x1a\x00\xe7\x00\x11\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x31\x01\x00\x00\x00\x00\x37\x00\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe6\x00\x17\x00\x00\x00\x19\x00\x1a\x00\xe7\x00\x11\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x30\x01\x00\x00\x00\x00\x37\x00\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe6\x00\x17\x00\x00\x00\x19\x00\x1a\x00\xe7\x00\x11\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x31\x01\x00\x00\x00\x00\x37\x00\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe6\x00\x17\x00\x00\x00\x19\x00\x1a\x00\xe7\x00\x11\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x32\x01\x00\x00\x00\x00\x37\x00\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe6\x00\x17\x00\x00\x00\x19\x00\x1a\x00\xe7\x00\x11\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x3b\x00\x00\x00\x00\x00\x37\x00\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe6\x00\x17\x00\x00\x00\x19\x00\x1a\x00\xe7\x00\x11\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x40\x00\x00\x00\x00\x00\x37\x00\x26\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe6\x00\x17\x00\x00\x00\x19\x00\x1a\x00\xe7\x00\x11\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x3b\x00\x00\x00\x00\x00\x27\x01\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe6\x00\x17\x00\x00\x00\x19\x00\x1a\x00\xe7\x00\x11\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x40\x00\x00\x00\x00\x00\x37\x00\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe6\x00\x17\x00\x00\x00\x19\x00\x1a\x00\xe7\x00\x11\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x44\x00\x00\x00\x00\x00\x37\x00\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe6\x00\x17\x00\x00\x00\x19\x00\x1a\x00\xe7\x00\x11\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x2d\x01\x00\x00\x00\x00\x37\x00\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe6\x00\x17\x00\x00\x00\x19\x00\x1a\x00\xe7\x00\x11\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x2e\x01\x00\x00\x00\x00\x37\x00\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe6\x00\x17\x00\x00\x00\x19\x00\x1a\x00\xe7\x00\x11\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x2f\x01\x00\x00\x00\x00\x37\x00\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe6\x00\x17\x00\x00\x00\x19\x00\x1a\x00\xe7\x00\x3d\x00\x00\x00\x3e\x00\x00\x00\x00\x00\x00\x00\x12\x00\x44\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\x3f\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x00\x00\x11\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x00\x00\x11\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x44\x02\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x00\x00\x11\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4a\x02\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x00\x00\x11\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4e\x02\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x00\x00\x11\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x50\x02\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x00\x00\x11\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x53\x02\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x00\x00\x11\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0c\x02\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x00\x00\x11\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x31\x02\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x00\x00\x11\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xbc\x01\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x00\x00\x11\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xbd\x01\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x00\x00\x11\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc0\x01\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x00\x00\x11\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf4\x01\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x00\x00\x11\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf7\x01\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x00\x00\x11\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x54\x01\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x00\x00\x11\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x55\x01\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x00\x00\x11\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x56\x01\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x00\x00\x11\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6c\x01\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x00\x00\x11\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x73\x01\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x00\x00\x11\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe5\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x00\x00\x36\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x39\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x00\x00\x11\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x43\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x00\x00\x11\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2a\x01\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x00\x00\x11\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x48\x01\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x00\x00\x11\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x71\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x00\x00\x11\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x00\x00\x00\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x75\x01\x76\x01\x77\x01\x78\x01\x79\x01\x7a\x01\x7b\x01\x7c\x01\x7d\x01\x7e\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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 (3, 370) [- (3 , happyReduce_3),- (4 , happyReduce_4),- (5 , happyReduce_5),- (6 , happyReduce_6),- (7 , happyReduce_7),- (8 , happyReduce_8),- (9 , happyReduce_9),- (10 , happyReduce_10),- (11 , happyReduce_11),- (12 , happyReduce_12),- (13 , happyReduce_13),- (14 , happyReduce_14),- (15 , happyReduce_15),- (16 , happyReduce_16),- (17 , happyReduce_17),- (18 , happyReduce_18),- (19 , happyReduce_19),- (20 , happyReduce_20),- (21 , happyReduce_21),- (22 , happyReduce_22),- (23 , happyReduce_23),- (24 , happyReduce_24),- (25 , happyReduce_25),- (26 , happyReduce_26),- (27 , happyReduce_27),- (28 , happyReduce_28),- (29 , happyReduce_29),- (30 , happyReduce_30),- (31 , happyReduce_31),- (32 , happyReduce_32),- (33 , happyReduce_33),- (34 , happyReduce_34),- (35 , happyReduce_35),- (36 , happyReduce_36),- (37 , happyReduce_37),- (38 , happyReduce_38),- (39 , happyReduce_39),- (40 , happyReduce_40),- (41 , happyReduce_41),- (42 , happyReduce_42),- (43 , happyReduce_43),- (44 , happyReduce_44),- (45 , happyReduce_45),- (46 , happyReduce_46),- (47 , happyReduce_47),- (48 , happyReduce_48),- (49 , happyReduce_49),- (50 , happyReduce_50),- (51 , happyReduce_51),- (52 , happyReduce_52),- (53 , happyReduce_53),- (54 , happyReduce_54),- (55 , happyReduce_55),- (56 , happyReduce_56),- (57 , happyReduce_57),- (58 , happyReduce_58),- (59 , happyReduce_59),- (60 , happyReduce_60),- (61 , happyReduce_61),- (62 , happyReduce_62),- (63 , happyReduce_63),- (64 , happyReduce_64),- (65 , happyReduce_65),- (66 , happyReduce_66),- (67 , happyReduce_67),- (68 , happyReduce_68),- (69 , happyReduce_69),- (70 , happyReduce_70),- (71 , happyReduce_71),- (72 , happyReduce_72),- (73 , happyReduce_73),- (74 , happyReduce_74),- (75 , happyReduce_75),- (76 , happyReduce_76),- (77 , happyReduce_77),- (78 , happyReduce_78),- (79 , happyReduce_79),- (80 , happyReduce_80),- (81 , happyReduce_81),- (82 , happyReduce_82),- (83 , happyReduce_83),- (84 , happyReduce_84),- (85 , happyReduce_85),- (86 , happyReduce_86),- (87 , happyReduce_87),- (88 , happyReduce_88),- (89 , happyReduce_89),- (90 , happyReduce_90),- (91 , happyReduce_91),- (92 , happyReduce_92),- (93 , happyReduce_93),- (94 , happyReduce_94),- (95 , happyReduce_95),- (96 , happyReduce_96),- (97 , happyReduce_97),- (98 , happyReduce_98),- (99 , happyReduce_99),- (100 , happyReduce_100),- (101 , happyReduce_101),- (102 , happyReduce_102),- (103 , happyReduce_103),- (104 , happyReduce_104),- (105 , happyReduce_105),- (106 , happyReduce_106),- (107 , happyReduce_107),- (108 , happyReduce_108),- (109 , happyReduce_109),- (110 , happyReduce_110),- (111 , happyReduce_111),- (112 , happyReduce_112),- (113 , happyReduce_113),- (114 , happyReduce_114),- (115 , happyReduce_115),- (116 , happyReduce_116),- (117 , happyReduce_117),- (118 , happyReduce_118),- (119 , happyReduce_119),- (120 , happyReduce_120),- (121 , happyReduce_121),- (122 , happyReduce_122),- (123 , happyReduce_123),- (124 , happyReduce_124),- (125 , happyReduce_125),- (126 , happyReduce_126),- (127 , happyReduce_127),- (128 , happyReduce_128),- (129 , happyReduce_129),- (130 , happyReduce_130),- (131 , happyReduce_131),- (132 , happyReduce_132),- (133 , happyReduce_133),- (134 , happyReduce_134),- (135 , happyReduce_135),- (136 , happyReduce_136),- (137 , happyReduce_137),- (138 , happyReduce_138),- (139 , happyReduce_139),- (140 , happyReduce_140),- (141 , happyReduce_141),- (142 , happyReduce_142),- (143 , happyReduce_143),- (144 , happyReduce_144),- (145 , happyReduce_145),- (146 , happyReduce_146),- (147 , happyReduce_147),- (148 , happyReduce_148),- (149 , happyReduce_149),- (150 , happyReduce_150),- (151 , happyReduce_151),- (152 , happyReduce_152),- (153 , happyReduce_153),- (154 , happyReduce_154),- (155 , happyReduce_155),- (156 , happyReduce_156),- (157 , happyReduce_157),- (158 , happyReduce_158),- (159 , happyReduce_159),- (160 , happyReduce_160),- (161 , happyReduce_161),- (162 , happyReduce_162),- (163 , happyReduce_163),- (164 , happyReduce_164),- (165 , happyReduce_165),- (166 , happyReduce_166),- (167 , happyReduce_167),- (168 , happyReduce_168),- (169 , happyReduce_169),- (170 , happyReduce_170),- (171 , happyReduce_171),- (172 , happyReduce_172),- (173 , happyReduce_173),- (174 , happyReduce_174),- (175 , happyReduce_175),- (176 , happyReduce_176),- (177 , happyReduce_177),- (178 , happyReduce_178),- (179 , happyReduce_179),- (180 , happyReduce_180),- (181 , happyReduce_181),- (182 , happyReduce_182),- (183 , happyReduce_183),- (184 , happyReduce_184),- (185 , happyReduce_185),- (186 , happyReduce_186),- (187 , happyReduce_187),- (188 , happyReduce_188),- (189 , happyReduce_189),- (190 , happyReduce_190),- (191 , happyReduce_191),- (192 , happyReduce_192),- (193 , happyReduce_193),- (194 , happyReduce_194),- (195 , happyReduce_195),- (196 , happyReduce_196),- (197 , happyReduce_197),- (198 , happyReduce_198),- (199 , happyReduce_199),- (200 , happyReduce_200),- (201 , happyReduce_201),- (202 , happyReduce_202),- (203 , happyReduce_203),- (204 , happyReduce_204),- (205 , happyReduce_205),- (206 , happyReduce_206),- (207 , happyReduce_207),- (208 , happyReduce_208),- (209 , happyReduce_209),- (210 , happyReduce_210),- (211 , happyReduce_211),- (212 , happyReduce_212),- (213 , happyReduce_213),- (214 , happyReduce_214),- (215 , happyReduce_215),- (216 , happyReduce_216),- (217 , happyReduce_217),- (218 , happyReduce_218),- (219 , happyReduce_219),- (220 , happyReduce_220),- (221 , happyReduce_221),- (222 , happyReduce_222),- (223 , happyReduce_223),- (224 , happyReduce_224),- (225 , happyReduce_225),- (226 , happyReduce_226),- (227 , happyReduce_227),- (228 , happyReduce_228),- (229 , happyReduce_229),- (230 , happyReduce_230),- (231 , happyReduce_231),- (232 , happyReduce_232),- (233 , happyReduce_233),- (234 , happyReduce_234),- (235 , happyReduce_235),- (236 , happyReduce_236),- (237 , happyReduce_237),- (238 , happyReduce_238),- (239 , happyReduce_239),- (240 , happyReduce_240),- (241 , happyReduce_241),- (242 , happyReduce_242),- (243 , happyReduce_243),- (244 , happyReduce_244),- (245 , happyReduce_245),- (246 , happyReduce_246),- (247 , happyReduce_247),- (248 , happyReduce_248),- (249 , happyReduce_249),- (250 , happyReduce_250),- (251 , happyReduce_251),- (252 , happyReduce_252),- (253 , happyReduce_253),- (254 , happyReduce_254),- (255 , happyReduce_255),- (256 , happyReduce_256),- (257 , happyReduce_257),- (258 , happyReduce_258),- (259 , happyReduce_259),- (260 , happyReduce_260),- (261 , happyReduce_261),- (262 , happyReduce_262),- (263 , happyReduce_263),- (264 , happyReduce_264),- (265 , happyReduce_265),- (266 , happyReduce_266),- (267 , happyReduce_267),- (268 , happyReduce_268),- (269 , happyReduce_269),- (270 , happyReduce_270),- (271 , happyReduce_271),- (272 , happyReduce_272),- (273 , happyReduce_273),- (274 , happyReduce_274),- (275 , happyReduce_275),- (276 , happyReduce_276),- (277 , happyReduce_277),- (278 , happyReduce_278),- (279 , happyReduce_279),- (280 , happyReduce_280),- (281 , happyReduce_281),- (282 , happyReduce_282),- (283 , happyReduce_283),- (284 , happyReduce_284),- (285 , happyReduce_285),- (286 , happyReduce_286),- (287 , happyReduce_287),- (288 , happyReduce_288),- (289 , happyReduce_289),- (290 , happyReduce_290),- (291 , happyReduce_291),- (292 , happyReduce_292),- (293 , happyReduce_293),- (294 , happyReduce_294),- (295 , happyReduce_295),- (296 , happyReduce_296),- (297 , happyReduce_297),- (298 , happyReduce_298),- (299 , happyReduce_299),- (300 , happyReduce_300),- (301 , happyReduce_301),- (302 , happyReduce_302),- (303 , happyReduce_303),- (304 , happyReduce_304),- (305 , happyReduce_305),- (306 , happyReduce_306),- (307 , happyReduce_307),- (308 , happyReduce_308),- (309 , happyReduce_309),- (310 , happyReduce_310),- (311 , happyReduce_311),- (312 , happyReduce_312),- (313 , happyReduce_313),- (314 , happyReduce_314),- (315 , happyReduce_315),- (316 , happyReduce_316),- (317 , happyReduce_317),- (318 , happyReduce_318),- (319 , happyReduce_319),- (320 , happyReduce_320),- (321 , happyReduce_321),- (322 , happyReduce_322),- (323 , happyReduce_323),- (324 , happyReduce_324),- (325 , happyReduce_325),- (326 , happyReduce_326),- (327 , happyReduce_327),- (328 , happyReduce_328),- (329 , happyReduce_329),- (330 , happyReduce_330),- (331 , happyReduce_331),- (332 , happyReduce_332),- (333 , happyReduce_333),- (334 , happyReduce_334),- (335 , happyReduce_335),- (336 , happyReduce_336),- (337 , happyReduce_337),- (338 , happyReduce_338),- (339 , happyReduce_339),- (340 , happyReduce_340),- (341 , happyReduce_341),- (342 , happyReduce_342),- (343 , happyReduce_343),- (344 , happyReduce_344),- (345 , happyReduce_345),- (346 , happyReduce_346),- (347 , happyReduce_347),- (348 , happyReduce_348),- (349 , happyReduce_349),- (350 , happyReduce_350),- (351 , happyReduce_351),- (352 , happyReduce_352),- (353 , happyReduce_353),- (354 , happyReduce_354),- (355 , happyReduce_355),- (356 , happyReduce_356),- (357 , happyReduce_357),- (358 , happyReduce_358),- (359 , happyReduce_359),- (360 , happyReduce_360),- (361 , happyReduce_361),- (362 , happyReduce_362),- (363 , happyReduce_363),- (364 , happyReduce_364),- (365 , happyReduce_365),- (366 , happyReduce_366),- (367 , happyReduce_367),- (368 , happyReduce_368),- (369 , happyReduce_369),- (370 , happyReduce_370)- ]--happy_n_terms = 77 :: Int-happy_n_nonterms = 127 :: Int--happyReduce_3 = happySpecReduce_1 0# happyReduction_3-happyReduction_3 happy_x_1- = case happyOut7 happy_x_1 of { happy_var_1 -> - happyIn6- (reverse happy_var_1- )}--happyReduce_4 = happySpecReduce_2 1# happyReduction_4-happyReduction_4 happy_x_2- happy_x_1- = case happyOut7 happy_x_1 of { happy_var_1 -> - case happyOut8 happy_x_2 of { happy_var_2 -> - happyIn7- (happy_var_2 : happy_var_1- )}}--happyReduce_5 = happySpecReduce_0 1# happyReduction_5-happyReduction_5 = happyIn7- ([]- )--happyReduce_6 = happySpecReduce_1 2# happyReduction_6-happyReduction_6 happy_x_1- = case happyOutTok happy_x_1 of { (TokKeyword KwLet happy_var_1) -> - happyIn8- (TokKeyword KwLet happy_var_1- )}--happyReduce_7 = happySpecReduce_1 2# happyReduction_7-happyReduction_7 happy_x_1- = case happyOutTok happy_x_1 of { (TokKeyword KwIn happy_var_1) -> - happyIn8- (TokKeyword KwIn happy_var_1- )}--happyReduce_8 = happySpecReduce_1 2# happyReduction_8-happyReduction_8 happy_x_1- = case happyOutTok happy_x_1 of { (TokKeyword KwWhere happy_var_1) -> - happyIn8- (TokKeyword KwWhere happy_var_1- )}--happyReduce_9 = happySpecReduce_1 2# happyReduction_9-happyReduction_9 happy_x_1- = case happyOutTok happy_x_1 of { (TokKeyword KwWith happy_var_1) -> - happyIn8- (TokKeyword KwWith happy_var_1- )}--happyReduce_10 = happySpecReduce_1 2# happyReduction_10-happyReduction_10 happy_x_1- = case happyOutTok happy_x_1 of { (TokKeyword KwRewrite happy_var_1) -> - happyIn8- (TokKeyword KwRewrite happy_var_1- )}--happyReduce_11 = happySpecReduce_1 2# happyReduction_11-happyReduction_11 happy_x_1- = case happyOutTok happy_x_1 of { (TokKeyword KwPostulate happy_var_1) -> - happyIn8- (TokKeyword KwPostulate happy_var_1- )}--happyReduce_12 = happySpecReduce_1 2# happyReduction_12-happyReduction_12 happy_x_1- = case happyOutTok happy_x_1 of { (TokKeyword KwPrimitive happy_var_1) -> - happyIn8- (TokKeyword KwPrimitive happy_var_1- )}--happyReduce_13 = happySpecReduce_1 2# happyReduction_13-happyReduction_13 happy_x_1- = case happyOutTok happy_x_1 of { (TokKeyword KwOpen happy_var_1) -> - happyIn8- (TokKeyword KwOpen happy_var_1- )}--happyReduce_14 = happySpecReduce_1 2# happyReduction_14-happyReduction_14 happy_x_1- = case happyOutTok happy_x_1 of { (TokKeyword KwImport happy_var_1) -> - happyIn8- (TokKeyword KwImport happy_var_1- )}--happyReduce_15 = happySpecReduce_1 2# happyReduction_15-happyReduction_15 happy_x_1- = case happyOutTok happy_x_1 of { (TokKeyword KwUsing happy_var_1) -> - happyIn8- (TokKeyword KwUsing happy_var_1- )}--happyReduce_16 = happySpecReduce_1 2# happyReduction_16-happyReduction_16 happy_x_1- = case happyOutTok happy_x_1 of { (TokKeyword KwHiding happy_var_1) -> - happyIn8- (TokKeyword KwHiding happy_var_1- )}--happyReduce_17 = happySpecReduce_1 2# happyReduction_17-happyReduction_17 happy_x_1- = case happyOutTok happy_x_1 of { (TokKeyword KwRenaming happy_var_1) -> - happyIn8- (TokKeyword KwRenaming happy_var_1- )}--happyReduce_18 = happySpecReduce_1 2# happyReduction_18-happyReduction_18 happy_x_1- = case happyOutTok happy_x_1 of { (TokKeyword KwTo happy_var_1) -> - happyIn8- (TokKeyword KwTo happy_var_1- )}--happyReduce_19 = happySpecReduce_1 2# happyReduction_19-happyReduction_19 happy_x_1- = case happyOutTok happy_x_1 of { (TokKeyword KwPublic happy_var_1) -> - happyIn8- (TokKeyword KwPublic happy_var_1- )}--happyReduce_20 = happySpecReduce_1 2# happyReduction_20-happyReduction_20 happy_x_1- = case happyOutTok happy_x_1 of { (TokKeyword KwModule happy_var_1) -> - happyIn8- (TokKeyword KwModule happy_var_1- )}--happyReduce_21 = happySpecReduce_1 2# happyReduction_21-happyReduction_21 happy_x_1- = case happyOutTok happy_x_1 of { (TokKeyword KwData happy_var_1) -> - happyIn8- (TokKeyword KwData happy_var_1- )}--happyReduce_22 = happySpecReduce_1 2# happyReduction_22-happyReduction_22 happy_x_1- = case happyOutTok happy_x_1 of { (TokKeyword KwCoData happy_var_1) -> - happyIn8- (TokKeyword KwCoData happy_var_1- )}--happyReduce_23 = happySpecReduce_1 2# happyReduction_23-happyReduction_23 happy_x_1- = case happyOutTok happy_x_1 of { (TokKeyword KwRecord happy_var_1) -> - happyIn8- (TokKeyword KwRecord happy_var_1- )}--happyReduce_24 = happySpecReduce_1 2# happyReduction_24-happyReduction_24 happy_x_1- = case happyOutTok happy_x_1 of { (TokKeyword KwConstructor happy_var_1) -> - happyIn8- (TokKeyword KwConstructor happy_var_1- )}--happyReduce_25 = happySpecReduce_1 2# happyReduction_25-happyReduction_25 happy_x_1- = case happyOutTok happy_x_1 of { (TokKeyword KwField happy_var_1) -> - happyIn8- (TokKeyword KwField happy_var_1- )}--happyReduce_26 = happySpecReduce_1 2# happyReduction_26-happyReduction_26 happy_x_1- = case happyOutTok happy_x_1 of { (TokKeyword KwInfix happy_var_1) -> - happyIn8- (TokKeyword KwInfix happy_var_1- )}--happyReduce_27 = happySpecReduce_1 2# happyReduction_27-happyReduction_27 happy_x_1- = case happyOutTok happy_x_1 of { (TokKeyword KwInfixL happy_var_1) -> - happyIn8- (TokKeyword KwInfixL happy_var_1- )}--happyReduce_28 = happySpecReduce_1 2# happyReduction_28-happyReduction_28 happy_x_1- = case happyOutTok happy_x_1 of { (TokKeyword KwInfixR happy_var_1) -> - happyIn8- (TokKeyword KwInfixR happy_var_1- )}--happyReduce_29 = happySpecReduce_1 2# happyReduction_29-happyReduction_29 happy_x_1- = case happyOutTok happy_x_1 of { (TokKeyword KwMutual happy_var_1) -> - happyIn8- (TokKeyword KwMutual happy_var_1- )}--happyReduce_30 = happySpecReduce_1 2# happyReduction_30-happyReduction_30 happy_x_1- = case happyOutTok happy_x_1 of { (TokKeyword KwAbstract happy_var_1) -> - happyIn8- (TokKeyword KwAbstract happy_var_1- )}--happyReduce_31 = happySpecReduce_1 2# happyReduction_31-happyReduction_31 happy_x_1- = case happyOutTok happy_x_1 of { (TokKeyword KwPrivate happy_var_1) -> - happyIn8- (TokKeyword KwPrivate happy_var_1- )}--happyReduce_32 = happySpecReduce_1 2# happyReduction_32-happyReduction_32 happy_x_1- = case happyOutTok happy_x_1 of { (TokKeyword KwProp happy_var_1) -> - happyIn8- (TokKeyword KwProp happy_var_1- )}--happyReduce_33 = happySpecReduce_1 2# happyReduction_33-happyReduction_33 happy_x_1- = case happyOutTok happy_x_1 of { (TokKeyword KwSet happy_var_1) -> - happyIn8- (TokKeyword KwSet happy_var_1- )}--happyReduce_34 = happySpecReduce_1 2# happyReduction_34-happyReduction_34 happy_x_1- = case happyOutTok happy_x_1 of { (TokKeyword KwForall happy_var_1) -> - happyIn8- (TokKeyword KwForall happy_var_1- )}--happyReduce_35 = happySpecReduce_1 2# happyReduction_35-happyReduction_35 happy_x_1- = case happyOutTok happy_x_1 of { (TokKeyword KwSyntax happy_var_1) -> - happyIn8- (TokKeyword KwSyntax happy_var_1- )}--happyReduce_36 = happySpecReduce_1 2# happyReduction_36-happyReduction_36 happy_x_1- = case happyOutTok happy_x_1 of { (TokKeyword KwOPTIONS happy_var_1) -> - happyIn8- (TokKeyword KwOPTIONS happy_var_1- )}--happyReduce_37 = happySpecReduce_1 2# happyReduction_37-happyReduction_37 happy_x_1- = case happyOutTok happy_x_1 of { (TokKeyword KwBUILTIN happy_var_1) -> - happyIn8- (TokKeyword KwBUILTIN happy_var_1- )}--happyReduce_38 = happySpecReduce_1 2# happyReduction_38-happyReduction_38 happy_x_1- = case happyOutTok happy_x_1 of { (TokKeyword KwIMPORT happy_var_1) -> - happyIn8- (TokKeyword KwIMPORT happy_var_1- )}--happyReduce_39 = happySpecReduce_1 2# happyReduction_39-happyReduction_39 happy_x_1- = case happyOutTok happy_x_1 of { (TokKeyword KwCOMPILED happy_var_1) -> - happyIn8- (TokKeyword KwCOMPILED happy_var_1- )}--happyReduce_40 = happySpecReduce_1 2# happyReduction_40-happyReduction_40 happy_x_1- = case happyOutTok happy_x_1 of { (TokKeyword KwCOMPILED_DATA happy_var_1) -> - happyIn8- (TokKeyword KwCOMPILED_DATA happy_var_1- )}--happyReduce_41 = happySpecReduce_1 2# happyReduction_41-happyReduction_41 happy_x_1- = case happyOutTok happy_x_1 of { (TokKeyword KwCOMPILED_TYPE happy_var_1) -> - happyIn8- (TokKeyword KwCOMPILED_TYPE happy_var_1- )}--happyReduce_42 = happySpecReduce_1 2# happyReduction_42-happyReduction_42 happy_x_1- = case happyOutTok happy_x_1 of { (TokKeyword KwCOMPILED_EPIC happy_var_1) -> - happyIn8- (TokKeyword KwCOMPILED_EPIC happy_var_1- )}--happyReduce_43 = happySpecReduce_1 2# happyReduction_43-happyReduction_43 happy_x_1- = case happyOutTok happy_x_1 of { (TokKeyword KwCOMPILED_JS happy_var_1) -> - happyIn8- (TokKeyword KwCOMPILED_JS happy_var_1- )}--happyReduce_44 = happySpecReduce_1 2# happyReduction_44-happyReduction_44 happy_x_1- = case happyOutTok happy_x_1 of { (TokKeyword KwSTATIC happy_var_1) -> - happyIn8- (TokKeyword KwSTATIC happy_var_1- )}--happyReduce_45 = happySpecReduce_1 2# happyReduction_45-happyReduction_45 happy_x_1- = case happyOutTok happy_x_1 of { (TokKeyword KwIMPOSSIBLE happy_var_1) -> - happyIn8- (TokKeyword KwIMPOSSIBLE happy_var_1- )}--happyReduce_46 = happySpecReduce_1 2# happyReduction_46-happyReduction_46 happy_x_1- = case happyOutTok happy_x_1 of { (TokKeyword KwETA happy_var_1) -> - happyIn8- (TokKeyword KwETA happy_var_1- )}--happyReduce_47 = happySpecReduce_1 2# happyReduction_47-happyReduction_47 happy_x_1- = case happyOutTok happy_x_1 of { (TokKeyword KwQuoteGoal happy_var_1) -> - happyIn8- (TokKeyword KwQuoteGoal happy_var_1- )}--happyReduce_48 = happySpecReduce_1 2# happyReduction_48-happyReduction_48 happy_x_1- = case happyOutTok happy_x_1 of { (TokKeyword KwQuote happy_var_1) -> - happyIn8- (TokKeyword KwQuote happy_var_1- )}--happyReduce_49 = happySpecReduce_1 2# happyReduction_49-happyReduction_49 happy_x_1- = case happyOutTok happy_x_1 of { (TokKeyword KwQuoteTerm happy_var_1) -> - happyIn8- (TokKeyword KwQuoteTerm happy_var_1- )}--happyReduce_50 = happySpecReduce_1 2# happyReduction_50-happyReduction_50 happy_x_1- = case happyOutTok happy_x_1 of { (TokKeyword KwUnquote happy_var_1) -> - happyIn8- (TokKeyword KwUnquote happy_var_1- )}--happyReduce_51 = happySpecReduce_1 2# happyReduction_51-happyReduction_51 happy_x_1- = case happyOutTok happy_x_1 of { (TokSetN happy_var_1) -> - happyIn8- (TokSetN happy_var_1- )}--happyReduce_52 = happySpecReduce_1 2# happyReduction_52-happyReduction_52 happy_x_1- = case happyOutTok happy_x_1 of { (TokTeX happy_var_1) -> - happyIn8- (TokTeX happy_var_1- )}--happyReduce_53 = happySpecReduce_1 2# happyReduction_53-happyReduction_53 happy_x_1- = case happyOutTok happy_x_1 of { (TokComment happy_var_1) -> - happyIn8- (TokComment happy_var_1- )}--happyReduce_54 = happySpecReduce_1 2# happyReduction_54-happyReduction_54 happy_x_1- = case happyOutTok happy_x_1 of { (TokSymbol SymEllipsis happy_var_1) -> - happyIn8- (TokSymbol SymEllipsis happy_var_1- )}--happyReduce_55 = happySpecReduce_1 2# happyReduction_55-happyReduction_55 happy_x_1- = case happyOutTok happy_x_1 of { (TokSymbol SymDotDot happy_var_1) -> - happyIn8- (TokSymbol SymDotDot happy_var_1- )}--happyReduce_56 = happySpecReduce_1 2# happyReduction_56-happyReduction_56 happy_x_1- = case happyOutTok happy_x_1 of { (TokSymbol SymDot happy_var_1) -> - happyIn8- (TokSymbol SymDot happy_var_1- )}--happyReduce_57 = happySpecReduce_1 2# happyReduction_57-happyReduction_57 happy_x_1- = case happyOutTok happy_x_1 of { (TokSymbol SymSemi happy_var_1) -> - happyIn8- (TokSymbol SymSemi happy_var_1- )}--happyReduce_58 = happySpecReduce_1 2# happyReduction_58-happyReduction_58 happy_x_1- = case happyOutTok happy_x_1 of { (TokSymbol SymColon happy_var_1) -> - happyIn8- (TokSymbol SymColon happy_var_1- )}--happyReduce_59 = happySpecReduce_1 2# happyReduction_59-happyReduction_59 happy_x_1- = case happyOutTok happy_x_1 of { (TokSymbol SymEqual happy_var_1) -> - happyIn8- (TokSymbol SymEqual happy_var_1- )}--happyReduce_60 = happySpecReduce_1 2# happyReduction_60-happyReduction_60 happy_x_1- = case happyOutTok happy_x_1 of { (TokSymbol SymUnderscore happy_var_1) -> - happyIn8- (TokSymbol SymUnderscore happy_var_1- )}--happyReduce_61 = happySpecReduce_1 2# happyReduction_61-happyReduction_61 happy_x_1- = case happyOutTok happy_x_1 of { (TokSymbol SymQuestionMark happy_var_1) -> - happyIn8- (TokSymbol SymQuestionMark happy_var_1- )}--happyReduce_62 = happySpecReduce_1 2# happyReduction_62-happyReduction_62 happy_x_1- = case happyOutTok happy_x_1 of { (TokSymbol SymArrow happy_var_1) -> - happyIn8- (TokSymbol SymArrow happy_var_1- )}--happyReduce_63 = happySpecReduce_1 2# happyReduction_63-happyReduction_63 happy_x_1- = case happyOutTok happy_x_1 of { (TokSymbol SymLambda happy_var_1) -> - happyIn8- (TokSymbol SymLambda happy_var_1- )}--happyReduce_64 = happySpecReduce_1 2# happyReduction_64-happyReduction_64 happy_x_1- = case happyOutTok happy_x_1 of { (TokSymbol SymAs happy_var_1) -> - happyIn8- (TokSymbol SymAs happy_var_1- )}--happyReduce_65 = happySpecReduce_1 2# happyReduction_65-happyReduction_65 happy_x_1- = case happyOutTok happy_x_1 of { (TokSymbol SymBar happy_var_1) -> - happyIn8- (TokSymbol SymBar happy_var_1- )}--happyReduce_66 = happySpecReduce_1 2# happyReduction_66-happyReduction_66 happy_x_1- = case happyOutTok happy_x_1 of { (TokSymbol SymOpenParen happy_var_1) -> - happyIn8- (TokSymbol SymOpenParen happy_var_1- )}--happyReduce_67 = happySpecReduce_1 2# happyReduction_67-happyReduction_67 happy_x_1- = case happyOutTok happy_x_1 of { (TokSymbol SymCloseParen happy_var_1) -> - happyIn8- (TokSymbol SymCloseParen happy_var_1- )}--happyReduce_68 = happySpecReduce_1 2# happyReduction_68-happyReduction_68 happy_x_1- = case happyOutTok happy_x_1 of { (TokSymbol SymDoubleOpenBrace happy_var_1) -> - happyIn8- (TokSymbol SymDoubleOpenBrace happy_var_1- )}--happyReduce_69 = happySpecReduce_1 2# happyReduction_69-happyReduction_69 happy_x_1- = case happyOutTok happy_x_1 of { (TokSymbol SymDoubleCloseBrace happy_var_1) -> - happyIn8- (TokSymbol SymDoubleCloseBrace happy_var_1- )}--happyReduce_70 = happySpecReduce_1 2# happyReduction_70-happyReduction_70 happy_x_1- = case happyOutTok happy_x_1 of { (TokSymbol SymOpenBrace happy_var_1) -> - happyIn8- (TokSymbol SymOpenBrace happy_var_1- )}--happyReduce_71 = happySpecReduce_1 2# happyReduction_71-happyReduction_71 happy_x_1- = case happyOutTok happy_x_1 of { (TokSymbol SymCloseBrace happy_var_1) -> - happyIn8- (TokSymbol SymCloseBrace happy_var_1- )}--happyReduce_72 = happySpecReduce_1 2# happyReduction_72-happyReduction_72 happy_x_1- = case happyOutTok happy_x_1 of { (TokSymbol SymOpenVirtualBrace happy_var_1) -> - happyIn8- (TokSymbol SymOpenVirtualBrace happy_var_1- )}--happyReduce_73 = happySpecReduce_1 2# happyReduction_73-happyReduction_73 happy_x_1- = case happyOutTok happy_x_1 of { (TokSymbol SymCloseVirtualBrace happy_var_1) -> - happyIn8- (TokSymbol SymCloseVirtualBrace happy_var_1- )}--happyReduce_74 = happySpecReduce_1 2# happyReduction_74-happyReduction_74 happy_x_1- = case happyOutTok happy_x_1 of { (TokSymbol SymVirtualSemi happy_var_1) -> - happyIn8- (TokSymbol SymVirtualSemi happy_var_1- )}--happyReduce_75 = happySpecReduce_1 2# happyReduction_75-happyReduction_75 happy_x_1- = case happyOutTok happy_x_1 of { (TokSymbol SymOpenPragma happy_var_1) -> - happyIn8- (TokSymbol SymOpenPragma happy_var_1- )}--happyReduce_76 = happySpecReduce_1 2# happyReduction_76-happyReduction_76 happy_x_1- = case happyOutTok happy_x_1 of { (TokSymbol SymClosePragma happy_var_1) -> - happyIn8- (TokSymbol SymClosePragma happy_var_1- )}--happyReduce_77 = happySpecReduce_1 2# happyReduction_77-happyReduction_77 happy_x_1- = case happyOutTok happy_x_1 of { (TokId happy_var_1) -> - happyIn8- (TokId happy_var_1- )}--happyReduce_78 = happySpecReduce_1 2# happyReduction_78-happyReduction_78 happy_x_1- = case happyOutTok happy_x_1 of { (TokQId happy_var_1) -> - happyIn8- (TokQId happy_var_1- )}--happyReduce_79 = happySpecReduce_1 2# happyReduction_79-happyReduction_79 happy_x_1- = case happyOutTok happy_x_1 of { (TokString happy_var_1) -> - happyIn8- (TokString happy_var_1- )}--happyReduce_80 = happySpecReduce_1 2# happyReduction_80-happyReduction_80 happy_x_1- = case happyOutTok happy_x_1 of { (TokLiteral happy_var_1) -> - happyIn8- (TokLiteral happy_var_1- )}--happyReduce_81 = happySpecReduce_1 3# happyReduction_81-happyReduction_81 happy_x_1- = case happyOut10 happy_x_1 of { happy_var_1 -> - happyIn9- (happy_var_1- )}--happyReduce_82 = happySpecReduce_1 4# happyReduction_82-happyReduction_82 happy_x_1- = case happyOut106 happy_x_1 of { happy_var_1 -> - happyIn10- (([], happy_var_1)- )}--happyReduce_83 = happySpecReduce_2 4# happyReduction_83-happyReduction_83 happy_x_2- happy_x_1- = case happyOut109 happy_x_1 of { happy_var_1 -> - case happyOut10 happy_x_2 of { happy_var_2 -> - happyIn10- (let (ps,m) = happy_var_2 in (happy_var_1 : ps, m)- )}}--happyReduce_84 = happySpecReduce_1 5# happyReduction_84-happyReduction_84 happy_x_1- = happyIn11- (()- )--happyReduce_85 = happyMonadReduce 1# 5# happyReduction_85-happyReduction_85 (happy_x_1 `HappyStk`- happyRest) tk- = happyThen (( popContext)- ) (\r -> happyReturn (happyIn11 r))--happyReduce_86 = happySpecReduce_1 6# happyReduction_86-happyReduction_86 happy_x_1- = case happyOutTok happy_x_1 of { (TokSymbol SymSemi happy_var_1) -> - happyIn12- (happy_var_1- )}--happyReduce_87 = happySpecReduce_1 6# happyReduction_87-happyReduction_87 happy_x_1- = case happyOutTok happy_x_1 of { (TokSymbol SymVirtualSemi happy_var_1) -> - happyIn12- (happy_var_1- )}--happyReduce_88 = happyMonadReduce 0# 7# happyReduction_88-happyReduction_88 (happyRest) tk- = happyThen (( pushLexState imp_dir)- ) (\r -> happyReturn (happyIn13 r))--happyReduce_89 = happyMonadReduce 1# 8# happyReduction_89-happyReduction_89 (happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { (TokLiteral happy_var_1) -> - ( case happy_var_1 of {- LitInt _ n -> return n;- _ -> fail $ "Expected integer"- })}- ) (\r -> happyReturn (happyIn14 r))--happyReduce_90 = happyMonadReduce 1# 9# happyReduction_90-happyReduction_90 (happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { (TokId happy_var_1) -> - ( mkName happy_var_1)}- ) (\r -> happyReturn (happyIn15 r))--happyReduce_91 = happySpecReduce_2 10# happyReduction_91-happyReduction_91 happy_x_2- happy_x_1- = case happyOut15 happy_x_1 of { happy_var_1 -> - case happyOut16 happy_x_2 of { happy_var_2 -> - happyIn16- (happy_var_1 : happy_var_2- )}}--happyReduce_92 = happySpecReduce_1 10# happyReduction_92-happyReduction_92 happy_x_1- = case happyOut15 happy_x_1 of { happy_var_1 -> - happyIn16- ([happy_var_1]- )}--happyReduce_93 = happySpecReduce_1 11# happyReduction_93-happyReduction_93 happy_x_1- = case happyOutTok happy_x_1 of { (TokSymbol SymDoubleCloseBrace happy_var_1) -> - happyIn17- (getRange happy_var_1- )}--happyReduce_94 = happyMonadReduce 2# 11# happyReduction_94-happyReduction_94 (happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { (TokSymbol SymCloseBrace happy_var_1) -> - case happyOutTok happy_x_2 of { (TokSymbol SymCloseBrace happy_var_2) -> - (- if posPos (fromJust (rEnd (getRange happy_var_2))) -- posPos (fromJust (rStart (getRange happy_var_1))) > 2- then parseErrorAt (fromJust (rStart (getRange happy_var_2)))- "Expecting '}}', found separated '}'s."- else return $ fuseRange (getRange happy_var_1) (getRange (happy_var_2)))}}- ) (\r -> happyReturn (happyIn17 r))--happyReduce_95 = happySpecReduce_2 12# happyReduction_95-happyReduction_95 happy_x_2- happy_x_1- = case happyOut15 happy_x_2 of { happy_var_2 -> - happyIn18- (Arg NotHidden Irrelevant happy_var_2- )}--happyReduce_96 = happySpecReduce_1 12# happyReduction_96-happyReduction_96 happy_x_1- = case happyOut15 happy_x_1 of { happy_var_1 -> - happyIn18- (defaultArg happy_var_1- )}--happyReduce_97 = happySpecReduce_2 13# happyReduction_97-happyReduction_97 happy_x_2- happy_x_1- = case happyOut18 happy_x_1 of { happy_var_1 -> - case happyOut19 happy_x_2 of { happy_var_2 -> - happyIn19- (happy_var_1 : happy_var_2- )}}--happyReduce_98 = happySpecReduce_1 13# happyReduction_98-happyReduction_98 happy_x_1- = case happyOut18 happy_x_1 of { happy_var_1 -> - happyIn19- ([happy_var_1]- )}--happyReduce_99 = happySpecReduce_2 14# happyReduction_99-happyReduction_99 happy_x_2- happy_x_1- = case happyOut18 happy_x_1 of { happy_var_1 -> - case happyOut20 happy_x_2 of { happy_var_2 -> - happyIn20- (happy_var_1 : happy_var_2- )}}--happyReduce_100 = happySpecReduce_1 14# happyReduction_100-happyReduction_100 happy_x_1- = case happyOut18 happy_x_1 of { happy_var_1 -> - happyIn20- ([happy_var_1]- )}--happyReduce_101 = happyReduce 4# 14# happyReduction_101-happyReduction_101 (happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest)- = case happyOut19 happy_x_2 of { happy_var_2 -> - case happyOut20 happy_x_4 of { happy_var_4 -> - happyIn20- (map makeInstance happy_var_2 ++ happy_var_4- ) `HappyStk` happyRest}}--happyReduce_102 = happySpecReduce_3 14# happyReduction_102-happyReduction_102 happy_x_3- happy_x_2- happy_x_1- = case happyOut19 happy_x_2 of { happy_var_2 -> - happyIn20- (map makeInstance happy_var_2- )}--happyReduce_103 = happyReduce 4# 14# happyReduction_103-happyReduction_103 (happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest)- = case happyOut19 happy_x_2 of { happy_var_2 -> - case happyOut20 happy_x_4 of { happy_var_4 -> - happyIn20- (map hide happy_var_2 ++ happy_var_4- ) `HappyStk` happyRest}}--happyReduce_104 = happySpecReduce_3 14# happyReduction_104-happyReduction_104 happy_x_3- happy_x_2- happy_x_1- = case happyOut19 happy_x_2 of { happy_var_2 -> - happyIn20- (map hide happy_var_2- )}--happyReduce_105 = happyReduce 5# 14# happyReduction_105-happyReduction_105 (happy_x_5 `HappyStk`- happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest)- = case happyOut16 happy_x_3 of { happy_var_3 -> - case happyOut20 happy_x_5 of { happy_var_5 -> - happyIn20- (map (Arg Hidden Irrelevant) happy_var_3 ++ happy_var_5- ) `HappyStk` happyRest}}--happyReduce_106 = happyReduce 4# 14# happyReduction_106-happyReduction_106 (happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest)- = case happyOut16 happy_x_3 of { happy_var_3 -> - happyIn20- (map (Arg Hidden Irrelevant) happy_var_3- ) `HappyStk` happyRest}--happyReduce_107 = happyReduce 5# 14# happyReduction_107-happyReduction_107 (happy_x_5 `HappyStk`- happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest)- = case happyOut16 happy_x_3 of { happy_var_3 -> - case happyOut20 happy_x_5 of { happy_var_5 -> - happyIn20- (map (Arg Instance Irrelevant) happy_var_3 ++ happy_var_5- ) `HappyStk` happyRest}}--happyReduce_108 = happyReduce 4# 14# happyReduction_108-happyReduction_108 (happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest)- = case happyOut16 happy_x_3 of { happy_var_3 -> - happyIn20- (map (Arg Instance Irrelevant) happy_var_3- ) `HappyStk` happyRest}--happyReduce_109 = happyReduce 5# 14# happyReduction_109-happyReduction_109 (happy_x_5 `HappyStk`- happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest)- = case happyOut16 happy_x_3 of { happy_var_3 -> - case happyOut20 happy_x_5 of { happy_var_5 -> - happyIn20- (map (Arg Hidden NonStrict) happy_var_3 ++ happy_var_5- ) `HappyStk` happyRest}}--happyReduce_110 = happyReduce 4# 14# happyReduction_110-happyReduction_110 (happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest)- = case happyOut16 happy_x_3 of { happy_var_3 -> - happyIn20- (map (Arg Hidden NonStrict) happy_var_3- ) `HappyStk` happyRest}--happyReduce_111 = happyReduce 5# 14# happyReduction_111-happyReduction_111 (happy_x_5 `HappyStk`- happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest)- = case happyOut16 happy_x_3 of { happy_var_3 -> - case happyOut20 happy_x_5 of { happy_var_5 -> - happyIn20- (map (Arg Instance NonStrict) happy_var_3 ++ happy_var_5- ) `HappyStk` happyRest}}--happyReduce_112 = happyReduce 4# 14# happyReduction_112-happyReduction_112 (happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest)- = case happyOut16 happy_x_3 of { happy_var_3 -> - happyIn20- (map (Arg Instance NonStrict) happy_var_3- ) `HappyStk` happyRest}--happyReduce_113 = happyMonadReduce 1# 15# happyReduction_113-happyReduction_113 (happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { (TokQId happy_var_1) -> - ( mkQName happy_var_1)}- ) (\r -> happyReturn (happyIn21 r))--happyReduce_114 = happySpecReduce_1 15# happyReduction_114-happyReduction_114 happy_x_1- = case happyOut15 happy_x_1 of { happy_var_1 -> - happyIn21- (QName happy_var_1- )}--happyReduce_115 = happySpecReduce_1 16# happyReduction_115-happyReduction_115 happy_x_1- = case happyOut21 happy_x_1 of { happy_var_1 -> - happyIn22- (happy_var_1- )}--happyReduce_116 = happySpecReduce_1 17# happyReduction_116-happyReduction_116 happy_x_1- = case happyOut15 happy_x_1 of { happy_var_1 -> - happyIn23- (happy_var_1- )}--happyReduce_117 = happySpecReduce_1 17# happyReduction_117-happyReduction_117 happy_x_1- = case happyOutTok happy_x_1 of { (TokSymbol SymUnderscore happy_var_1) -> - happyIn23- (Name (getRange happy_var_1) [Hole]- )}--happyReduce_118 = happySpecReduce_2 18# happyReduction_118-happyReduction_118 happy_x_2- happy_x_1- = case happyOut23 happy_x_1 of { happy_var_1 -> - case happyOut24 happy_x_2 of { happy_var_2 -> - happyIn24- (happy_var_1 : happy_var_2- )}}--happyReduce_119 = happySpecReduce_1 18# happyReduction_119-happyReduction_119 happy_x_1- = case happyOut23 happy_x_1 of { happy_var_1 -> - happyIn24- ([happy_var_1]- )}--happyReduce_120 = happySpecReduce_1 19# happyReduction_120-happyReduction_120 happy_x_1- = case happyOut26 happy_x_1 of { happy_var_1 -> - happyIn25- (case happy_var_1 of- Left ns -> ns- Right _ -> fail $ "expected sequence of bound identifiers, not absurd pattern"- )}--happyReduce_121 = happyMonadReduce 1# 20# happyReduction_121-happyReduction_121 (happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut32 happy_x_1 of { happy_var_1 -> - (- let getName (Ident (QName x)) = Just x- getName (Underscore r _) = Just (Name r [Hole])- getName _ = Nothing-- containsAbsurd (Absurd _) = True- containsAbsurd (HiddenArg _ (Named _ e)) = containsAbsurd e- containsAbsurd (InstanceArg _ (Named _ e)) = containsAbsurd e- containsAbsurd (Paren _ expr) = containsAbsurd expr- containsAbsurd (RawApp _ exprs) = any containsAbsurd exprs- containsAbsurd _ = False- in- if isJust $ find containsAbsurd happy_var_1 then return $ Right happy_var_1 else- case partition isJust $ map getName happy_var_1 of- (good, []) -> return $ Left $ map fromJust good- _ -> fail $ "expected sequence of bound identifiers")}- ) (\r -> happyReturn (happyIn26 r))--happyReduce_122 = happySpecReduce_0 21# happyReduction_122-happyReduction_122 = happyIn27- ([]- )--happyReduce_123 = happySpecReduce_2 21# happyReduction_123-happyReduction_123 happy_x_2- happy_x_1- = case happyOutTok happy_x_1 of { (TokString happy_var_1) -> - case happyOut27 happy_x_2 of { happy_var_2 -> - happyIn27- (snd happy_var_1 : happy_var_2- )}}--happyReduce_124 = happyMonadReduce 1# 22# happyReduction_124-happyReduction_124 (happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { (TokString happy_var_1) -> - ( fmap QName (mkName happy_var_1))}- ) (\r -> happyReturn (happyIn28 r))--happyReduce_125 = happySpecReduce_2 23# happyReduction_125-happyReduction_125 happy_x_2- happy_x_1- = case happyOut41 happy_x_1 of { happy_var_1 -> - case happyOut29 happy_x_2 of { happy_var_2 -> - happyIn29- (Pi happy_var_1 happy_var_2- )}}--happyReduce_126 = happySpecReduce_3 23# happyReduction_126-happyReduction_126 happy_x_3- happy_x_2- happy_x_1- = case happyOut54 happy_x_2 of { happy_var_2 -> - case happyOut29 happy_x_3 of { happy_var_3 -> - happyIn29- (forallPi happy_var_2 happy_var_3- )}}--happyReduce_127 = happySpecReduce_3 23# happyReduction_127-happyReduction_127 happy_x_3- happy_x_2- happy_x_1- = case happyOut34 happy_x_1 of { happy_var_1 -> - case happyOut29 happy_x_3 of { happy_var_3 -> - happyIn29- (Fun (fuseRange happy_var_1 happy_var_3) (RawApp (getRange happy_var_1) happy_var_1) happy_var_3- )}}--happyReduce_128 = happySpecReduce_1 23# happyReduction_128-happyReduction_128 happy_x_1- = case happyOut30 happy_x_1 of { happy_var_1 -> - happyIn29- (happy_var_1- )}--happyReduce_129 = happyMonadReduce 1# 24# happyReduction_129-happyReduction_129 (happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut31 happy_x_1 of { happy_var_1 -> - ( case happy_var_1 of- { [e] -> return e- ; e : es -> return $ WithApp (fuseRange e es) e es- ; [] -> fail "impossible: empty with expressions"- })}- ) (\r -> happyReturn (happyIn30 r))--happyReduce_130 = happySpecReduce_3 25# happyReduction_130-happyReduction_130 happy_x_3- happy_x_2- happy_x_1- = case happyOut34 happy_x_1 of { happy_var_1 -> - case happyOut31 happy_x_3 of { happy_var_3 -> - happyIn31- (RawApp (getRange happy_var_1) happy_var_1 : happy_var_3- )}}--happyReduce_131 = happySpecReduce_1 25# happyReduction_131-happyReduction_131 happy_x_1- = case happyOut32 happy_x_1 of { happy_var_1 -> - happyIn31- ([RawApp (getRange happy_var_1) happy_var_1]- )}--happyReduce_132 = happySpecReduce_1 26# happyReduction_132-happyReduction_132 happy_x_1- = case happyOut33 happy_x_1 of { happy_var_1 -> - happyIn32- ([happy_var_1]- )}--happyReduce_133 = happySpecReduce_2 26# happyReduction_133-happyReduction_133 happy_x_2- happy_x_1- = case happyOut37 happy_x_1 of { happy_var_1 -> - case happyOut32 happy_x_2 of { happy_var_2 -> - happyIn32- (happy_var_1 : happy_var_2- )}}--happyReduce_134 = happySpecReduce_3 27# happyReduction_134-happyReduction_134 happy_x_3- happy_x_2- happy_x_1- = case happyOutTok happy_x_1 of { (TokSymbol SymLambda happy_var_1) -> - case happyOut46 happy_x_2 of { happy_var_2 -> - case happyOut29 happy_x_3 of { happy_var_3 -> - happyIn33- (Lam (fuseRange happy_var_1 happy_var_3) happy_var_2 happy_var_3- )}}}--happyReduce_135 = happyReduce 4# 27# happyReduction_135-happyReduction_135 (happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest)- = case happyOutTok happy_x_1 of { (TokSymbol SymLambda happy_var_1) -> - case happyOutTok happy_x_2 of { (TokSymbol SymOpenBrace happy_var_2) -> - case happyOut53 happy_x_3 of { happy_var_3 -> - case happyOutTok happy_x_4 of { (TokSymbol SymCloseBrace happy_var_4) -> - happyIn33- (ExtendedLam (fuseRange happy_var_1 (fuseRange happy_var_2 happy_var_4)) (reverse happy_var_3)- ) `HappyStk` happyRest}}}}--happyReduce_136 = happyMonadReduce 2# 27# happyReduction_136-happyReduction_136 (happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { (TokSymbol SymLambda happy_var_1) -> - case happyOut47 happy_x_2 of { happy_var_2 -> - ( case happy_var_2 of- Left (bs, h) -> if null bs then return $ AbsurdLam r h else- return $ Lam r bs (AbsurdLam r h)- where r = fuseRange happy_var_1 bs- Right es -> do -- it is of the form @\ { p1 ... () }@- p <- exprToLHS (RawApp (getRange es) es);- return $ ExtendedLam (fuseRange happy_var_1 es)- [(p [] [], AbsurdRHS, NoWhere)])}}- ) (\r -> happyReturn (happyIn33 r))--happyReduce_137 = happyReduce 4# 27# happyReduction_137-happyReduction_137 (happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest)- = case happyOutTok happy_x_1 of { (TokKeyword KwLet happy_var_1) -> - case happyOut130 happy_x_2 of { happy_var_2 -> - case happyOut29 happy_x_4 of { happy_var_4 -> - happyIn33- (Let (fuseRange happy_var_1 happy_var_4) happy_var_2 happy_var_4- ) `HappyStk` happyRest}}}--happyReduce_138 = happySpecReduce_1 27# happyReduction_138-happyReduction_138 happy_x_1- = case happyOut37 happy_x_1 of { happy_var_1 -> - happyIn33- (happy_var_1- )}--happyReduce_139 = happyReduce 4# 27# happyReduction_139-happyReduction_139 (happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest)- = case happyOutTok happy_x_1 of { (TokKeyword KwQuoteGoal happy_var_1) -> - case happyOut15 happy_x_2 of { happy_var_2 -> - case happyOut29 happy_x_4 of { happy_var_4 -> - happyIn33- (QuoteGoal (getRange (happy_var_1,happy_var_4)) happy_var_2 happy_var_4- ) `HappyStk` happyRest}}}--happyReduce_140 = happySpecReduce_1 28# happyReduction_140-happyReduction_140 happy_x_1- = case happyOut37 happy_x_1 of { happy_var_1 -> - happyIn34- ([happy_var_1]- )}--happyReduce_141 = happySpecReduce_2 28# happyReduction_141-happyReduction_141 happy_x_2- happy_x_1- = case happyOut37 happy_x_1 of { happy_var_1 -> - case happyOut34 happy_x_2 of { happy_var_2 -> - happyIn34- (happy_var_1 : happy_var_2- )}}--happyReduce_142 = happySpecReduce_3 29# happyReduction_142-happyReduction_142 happy_x_3- happy_x_2- happy_x_1- = case happyOutTok happy_x_1 of { (TokSymbol SymOpenBrace happy_var_1) -> - case happyOut29 happy_x_2 of { happy_var_2 -> - case happyOutTok happy_x_3 of { (TokSymbol SymCloseBrace happy_var_3) -> - happyIn35- (HiddenArg (fuseRange happy_var_1 happy_var_3) (unnamed happy_var_2)- )}}}--happyReduce_143 = happyReduce 5# 29# happyReduction_143-happyReduction_143 (happy_x_5 `HappyStk`- happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest)- = case happyOutTok happy_x_1 of { (TokSymbol SymOpenBrace happy_var_1) -> - case happyOut15 happy_x_2 of { happy_var_2 -> - case happyOut29 happy_x_4 of { happy_var_4 -> - case happyOutTok happy_x_5 of { (TokSymbol SymCloseBrace happy_var_5) -> - happyIn35- (HiddenArg (fuseRange happy_var_1 happy_var_5) (named (show happy_var_2) happy_var_4)- ) `HappyStk` happyRest}}}}--happyReduce_144 = happySpecReduce_2 29# happyReduction_144-happyReduction_144 happy_x_2- happy_x_1- = case happyOutTok happy_x_1 of { (TokSymbol SymOpenBrace happy_var_1) -> - case happyOutTok happy_x_2 of { (TokSymbol SymCloseBrace happy_var_2) -> - happyIn35- (let r = fuseRange happy_var_1 happy_var_2 in HiddenArg r $ unnamed $ Absurd r- )}}--happyReduce_145 = happySpecReduce_1 30# happyReduction_145-happyReduction_145 happy_x_1- = case happyOut21 happy_x_1 of { happy_var_1 -> - happyIn36- (Ident happy_var_1- )}--happyReduce_146 = happySpecReduce_1 30# happyReduction_146-happyReduction_146 happy_x_1- = case happyOutTok happy_x_1 of { (TokLiteral happy_var_1) -> - happyIn36- (Lit happy_var_1- )}--happyReduce_147 = happySpecReduce_1 30# happyReduction_147-happyReduction_147 happy_x_1- = case happyOutTok happy_x_1 of { (TokSymbol SymQuestionMark happy_var_1) -> - happyIn36- (QuestionMark (getRange happy_var_1) Nothing- )}--happyReduce_148 = happySpecReduce_1 30# happyReduction_148-happyReduction_148 happy_x_1- = case happyOutTok happy_x_1 of { (TokSymbol SymUnderscore happy_var_1) -> - happyIn36- (Underscore (getRange happy_var_1) Nothing- )}--happyReduce_149 = happySpecReduce_1 30# happyReduction_149-happyReduction_149 happy_x_1- = case happyOutTok happy_x_1 of { (TokKeyword KwProp happy_var_1) -> - happyIn36- (Prop (getRange happy_var_1)- )}--happyReduce_150 = happySpecReduce_1 30# happyReduction_150-happyReduction_150 happy_x_1- = case happyOutTok happy_x_1 of { (TokKeyword KwSet happy_var_1) -> - happyIn36- (Set (getRange happy_var_1)- )}--happyReduce_151 = happySpecReduce_1 30# happyReduction_151-happyReduction_151 happy_x_1- = case happyOutTok happy_x_1 of { (TokKeyword KwQuote happy_var_1) -> - happyIn36- (Quote (getRange happy_var_1)- )}--happyReduce_152 = happySpecReduce_1 30# happyReduction_152-happyReduction_152 happy_x_1- = case happyOutTok happy_x_1 of { (TokKeyword KwQuoteTerm happy_var_1) -> - happyIn36- (QuoteTerm (getRange happy_var_1)- )}--happyReduce_153 = happySpecReduce_1 30# happyReduction_153-happyReduction_153 happy_x_1- = case happyOutTok happy_x_1 of { (TokKeyword KwUnquote happy_var_1) -> - happyIn36- (Unquote (getRange happy_var_1)- )}--happyReduce_154 = happySpecReduce_1 30# happyReduction_154-happyReduction_154 happy_x_1- = case happyOutTok happy_x_1 of { (TokSetN happy_var_1) -> - happyIn36- (SetN (getRange (fst happy_var_1)) (snd happy_var_1)- )}--happyReduce_155 = happySpecReduce_3 30# happyReduction_155-happyReduction_155 happy_x_3- happy_x_2- happy_x_1- = case happyOutTok happy_x_1 of { (TokSymbol SymDoubleOpenBrace happy_var_1) -> - case happyOut29 happy_x_2 of { happy_var_2 -> - case happyOut17 happy_x_3 of { happy_var_3 -> - happyIn36- (InstanceArg (fuseRange happy_var_1 happy_var_3) (unnamed happy_var_2)- )}}}--happyReduce_156 = happyReduce 5# 30# happyReduction_156-happyReduction_156 (happy_x_5 `HappyStk`- happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest)- = case happyOutTok happy_x_1 of { (TokSymbol SymDoubleOpenBrace happy_var_1) -> - case happyOut15 happy_x_2 of { happy_var_2 -> - case happyOut29 happy_x_4 of { happy_var_4 -> - case happyOut17 happy_x_5 of { happy_var_5 -> - happyIn36- (InstanceArg (fuseRange happy_var_1 happy_var_5) (named (show happy_var_2) happy_var_4)- ) `HappyStk` happyRest}}}}--happyReduce_157 = happySpecReduce_3 30# happyReduction_157-happyReduction_157 happy_x_3- happy_x_2- happy_x_1- = case happyOutTok happy_x_1 of { (TokSymbol SymOpenParen happy_var_1) -> - case happyOut29 happy_x_2 of { happy_var_2 -> - case happyOutTok happy_x_3 of { (TokSymbol SymCloseParen happy_var_3) -> - happyIn36- (Paren (fuseRange happy_var_1 happy_var_3) happy_var_2- )}}}--happyReduce_158 = happySpecReduce_2 30# happyReduction_158-happyReduction_158 happy_x_2- happy_x_1- = case happyOutTok happy_x_1 of { (TokSymbol SymOpenParen happy_var_1) -> - case happyOutTok happy_x_2 of { (TokSymbol SymCloseParen happy_var_2) -> - happyIn36- (Absurd (fuseRange happy_var_1 happy_var_2)- )}}--happyReduce_159 = happySpecReduce_2 30# happyReduction_159-happyReduction_159 happy_x_2- happy_x_1- = case happyOutTok happy_x_1 of { (TokSymbol SymDoubleOpenBrace happy_var_1) -> - case happyOut17 happy_x_2 of { happy_var_2 -> - happyIn36- (let r = fuseRange happy_var_1 happy_var_2 in InstanceArg r $ unnamed $ Absurd r- )}}--happyReduce_160 = happySpecReduce_3 30# happyReduction_160-happyReduction_160 happy_x_3- happy_x_2- happy_x_1- = case happyOut15 happy_x_1 of { happy_var_1 -> - case happyOut37 happy_x_3 of { happy_var_3 -> - happyIn36- (As (fuseRange happy_var_1 happy_var_3) happy_var_1 happy_var_3- )}}--happyReduce_161 = happySpecReduce_2 30# happyReduction_161-happyReduction_161 happy_x_2- happy_x_1- = case happyOutTok happy_x_1 of { (TokSymbol SymDot happy_var_1) -> - case happyOut37 happy_x_2 of { happy_var_2 -> - happyIn36- (Dot (fuseRange happy_var_1 happy_var_2) happy_var_2- )}}--happyReduce_162 = happyReduce 4# 30# happyReduction_162-happyReduction_162 (happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest)- = case happyOutTok happy_x_1 of { (TokKeyword KwRecord happy_var_1) -> - case happyOut38 happy_x_3 of { happy_var_3 -> - case happyOutTok happy_x_4 of { (TokSymbol SymCloseBrace happy_var_4) -> - happyIn36- (Rec (getRange (happy_var_1,happy_var_4)) happy_var_3- ) `HappyStk` happyRest}}}--happyReduce_163 = happyReduce 5# 30# happyReduction_163-happyReduction_163 (happy_x_5 `HappyStk`- happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest)- = case happyOutTok happy_x_1 of { (TokKeyword KwRecord happy_var_1) -> - case happyOut36 happy_x_2 of { happy_var_2 -> - case happyOut38 happy_x_4 of { happy_var_4 -> - case happyOutTok happy_x_5 of { (TokSymbol SymCloseBrace happy_var_5) -> - happyIn36- (RecUpdate (getRange (happy_var_1,happy_var_5)) happy_var_2 happy_var_4- ) `HappyStk` happyRest}}}}--happyReduce_164 = happySpecReduce_1 31# happyReduction_164-happyReduction_164 happy_x_1- = case happyOut35 happy_x_1 of { happy_var_1 -> - happyIn37- (happy_var_1- )}--happyReduce_165 = happySpecReduce_1 31# happyReduction_165-happyReduction_165 happy_x_1- = case happyOut36 happy_x_1 of { happy_var_1 -> - happyIn37- (happy_var_1- )}--happyReduce_166 = happySpecReduce_0 32# happyReduction_166-happyReduction_166 = happyIn38- ([]- )--happyReduce_167 = happySpecReduce_1 32# happyReduction_167-happyReduction_167 happy_x_1- = case happyOut39 happy_x_1 of { happy_var_1 -> - happyIn38- (happy_var_1- )}--happyReduce_168 = happySpecReduce_1 33# happyReduction_168-happyReduction_168 happy_x_1- = case happyOut40 happy_x_1 of { happy_var_1 -> - happyIn39- ([happy_var_1]- )}--happyReduce_169 = happySpecReduce_3 33# happyReduction_169-happyReduction_169 happy_x_3- happy_x_2- happy_x_1- = case happyOut40 happy_x_1 of { happy_var_1 -> - case happyOut39 happy_x_3 of { happy_var_3 -> - happyIn39- (happy_var_1 : happy_var_3- )}}--happyReduce_170 = happySpecReduce_3 34# happyReduction_170-happyReduction_170 happy_x_3- happy_x_2- happy_x_1- = case happyOut15 happy_x_1 of { happy_var_1 -> - case happyOut29 happy_x_3 of { happy_var_3 -> - happyIn40- ((happy_var_1, happy_var_3)- )}}--happyReduce_171 = happySpecReduce_2 35# happyReduction_171-happyReduction_171 happy_x_2- happy_x_1- = case happyOut42 happy_x_1 of { happy_var_1 -> - happyIn41- (happy_var_1- )}--happyReduce_172 = happySpecReduce_1 36# happyReduction_172-happyReduction_172 happy_x_1- = case happyOut43 happy_x_1 of { happy_var_1 -> - happyIn42- ({-TeleBind-} happy_var_1- )}--happyReduce_173 = happySpecReduce_2 37# happyReduction_173-happyReduction_173 happy_x_2- happy_x_1- = case happyOut44 happy_x_1 of { happy_var_1 -> - case happyOut43 happy_x_2 of { happy_var_2 -> - happyIn43- (happy_var_1 : happy_var_2- )}}--happyReduce_174 = happySpecReduce_1 37# happyReduction_174-happyReduction_174 happy_x_1- = case happyOut44 happy_x_1 of { happy_var_1 -> - happyIn43- ([happy_var_1]- )}--happyReduce_175 = happyReduce 4# 38# happyReduction_175-happyReduction_175 (happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest)- = case happyOutTok happy_x_2 of { (TokSymbol SymOpenParen happy_var_2) -> - case happyOut45 happy_x_3 of { happy_var_3 -> - case happyOutTok happy_x_4 of { (TokSymbol SymCloseParen happy_var_4) -> - happyIn44- (TypedBindings (fuseRange happy_var_2 happy_var_4) (Arg NotHidden Irrelevant happy_var_3)- ) `HappyStk` happyRest}}}--happyReduce_176 = happyReduce 4# 38# happyReduction_176-happyReduction_176 (happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest)- = case happyOutTok happy_x_2 of { (TokSymbol SymOpenBrace happy_var_2) -> - case happyOut45 happy_x_3 of { happy_var_3 -> - case happyOutTok happy_x_4 of { (TokSymbol SymCloseBrace happy_var_4) -> - happyIn44- (TypedBindings (fuseRange happy_var_2 happy_var_4) (Arg Hidden Irrelevant happy_var_3)- ) `HappyStk` happyRest}}}--happyReduce_177 = happyReduce 4# 38# happyReduction_177-happyReduction_177 (happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest)- = case happyOutTok happy_x_1 of { (TokSymbol SymDot happy_var_1) -> - case happyOut45 happy_x_3 of { happy_var_3 -> - happyIn44- (TypedBindings (fuseRange happy_var_1 happy_var_3) (Arg Instance Irrelevant happy_var_3)- ) `HappyStk` happyRest}}--happyReduce_178 = happyReduce 4# 38# happyReduction_178-happyReduction_178 (happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest)- = case happyOutTok happy_x_2 of { (TokSymbol SymOpenParen happy_var_2) -> - case happyOut45 happy_x_3 of { happy_var_3 -> - case happyOutTok happy_x_4 of { (TokSymbol SymCloseParen happy_var_4) -> - happyIn44- (TypedBindings (fuseRange happy_var_2 happy_var_4) (Arg NotHidden NonStrict happy_var_3)- ) `HappyStk` happyRest}}}--happyReduce_179 = happyReduce 4# 38# happyReduction_179-happyReduction_179 (happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest)- = case happyOutTok happy_x_2 of { (TokSymbol SymOpenBrace happy_var_2) -> - case happyOut45 happy_x_3 of { happy_var_3 -> - case happyOutTok happy_x_4 of { (TokSymbol SymCloseBrace happy_var_4) -> - happyIn44- (TypedBindings (fuseRange happy_var_2 happy_var_4) (Arg Hidden NonStrict happy_var_3)- ) `HappyStk` happyRest}}}--happyReduce_180 = happyReduce 4# 38# happyReduction_180-happyReduction_180 (happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest)- = case happyOutTok happy_x_1 of { (TokSymbol SymDotDot happy_var_1) -> - case happyOut45 happy_x_3 of { happy_var_3 -> - happyIn44- (TypedBindings (fuseRange happy_var_1 happy_var_3) (Arg Instance NonStrict happy_var_3)- ) `HappyStk` happyRest}}--happyReduce_181 = happySpecReduce_3 38# happyReduction_181-happyReduction_181 happy_x_3- happy_x_2- happy_x_1- = case happyOutTok happy_x_1 of { (TokSymbol SymOpenParen happy_var_1) -> - case happyOut45 happy_x_2 of { happy_var_2 -> - case happyOutTok happy_x_3 of { (TokSymbol SymCloseParen happy_var_3) -> - happyIn44- (TypedBindings (fuseRange happy_var_1 happy_var_3) (Arg NotHidden Relevant happy_var_2)- )}}}--happyReduce_182 = happySpecReduce_3 38# happyReduction_182-happyReduction_182 happy_x_3- happy_x_2- happy_x_1- = case happyOutTok happy_x_1 of { (TokSymbol SymDoubleOpenBrace happy_var_1) -> - case happyOut45 happy_x_2 of { happy_var_2 -> - case happyOut17 happy_x_3 of { happy_var_3 -> - happyIn44- (TypedBindings (fuseRange happy_var_1 happy_var_3) (Arg Instance Relevant happy_var_2)- )}}}--happyReduce_183 = happySpecReduce_3 38# happyReduction_183-happyReduction_183 happy_x_3- happy_x_2- happy_x_1- = case happyOutTok happy_x_1 of { (TokSymbol SymOpenBrace happy_var_1) -> - case happyOut45 happy_x_2 of { happy_var_2 -> - case happyOutTok happy_x_3 of { (TokSymbol SymCloseBrace happy_var_3) -> - happyIn44- (TypedBindings (fuseRange happy_var_1 happy_var_3) (Arg Hidden Relevant happy_var_2)- )}}}--happyReduce_184 = happySpecReduce_3 39# happyReduction_184-happyReduction_184 happy_x_3- happy_x_2- happy_x_1- = case happyOut25 happy_x_1 of { happy_var_1 -> - case happyOut29 happy_x_3 of { happy_var_3 -> - happyIn45- (TBind (fuseRange happy_var_1 happy_var_3) (map mkBoundName_ happy_var_1) happy_var_3- )}}--happyReduce_185 = happyMonadReduce 2# 40# happyReduction_185-happyReduction_185 (happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut48 happy_x_1 of { happy_var_1 -> - (- case reverse happy_var_1 of- Left _ : _ -> parseError "Absurd lambda cannot have a body."- _ : _ -> return [ b | Right b <- happy_var_1 ]- [] -> parsePanic "Empty LamBinds")}- ) (\r -> happyReturn (happyIn46 r))--happyReduce_186 = happyMonadReduce 1# 41# happyReduction_186-happyReduction_186 (happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut49 happy_x_1 of { happy_var_1 -> - (- case happy_var_1 of- Left lb -> case reverse lb of- Right _ : _ -> parseError "Missing body for lambda"- Left h : _ -> return $ Left ([ b | Right b <- init lb], h)- _ -> parsePanic "Empty LamBindsAbsurd"- Right es -> return $ Right es)}- ) (\r -> happyReturn (happyIn47 r))--happyReduce_187 = happySpecReduce_2 42# happyReduction_187-happyReduction_187 happy_x_2- happy_x_1- = case happyOut57 happy_x_1 of { happy_var_1 -> - case happyOut48 happy_x_2 of { happy_var_2 -> - happyIn48- (map Right happy_var_1 ++ happy_var_2- )}}--happyReduce_188 = happySpecReduce_2 42# happyReduction_188-happyReduction_188 happy_x_2- happy_x_1- = case happyOut44 happy_x_1 of { happy_var_1 -> - case happyOut48 happy_x_2 of { happy_var_2 -> - happyIn48- (Right (DomainFull happy_var_1) : happy_var_2- )}}--happyReduce_189 = happySpecReduce_1 42# happyReduction_189-happyReduction_189 happy_x_1- = case happyOut57 happy_x_1 of { happy_var_1 -> - happyIn48- (map Right happy_var_1- )}--happyReduce_190 = happySpecReduce_1 42# happyReduction_190-happyReduction_190 happy_x_1- = case happyOut44 happy_x_1 of { happy_var_1 -> - happyIn48- ([Right $ DomainFull happy_var_1]- )}--happyReduce_191 = happySpecReduce_2 42# happyReduction_191-happyReduction_191 happy_x_2- happy_x_1- = happyIn48- ([Left NotHidden]- )--happyReduce_192 = happySpecReduce_2 42# happyReduction_192-happyReduction_192 happy_x_2- happy_x_1- = happyIn48- ([Left Hidden]- )--happyReduce_193 = happySpecReduce_2 42# happyReduction_193-happyReduction_193 happy_x_2- happy_x_1- = happyIn48- ([Left Instance]- )--happyReduce_194 = happySpecReduce_2 43# happyReduction_194-happyReduction_194 happy_x_2- happy_x_1- = case happyOut57 happy_x_1 of { happy_var_1 -> - case happyOut48 happy_x_2 of { happy_var_2 -> - happyIn49- (Left $ map Right happy_var_1 ++ happy_var_2- )}}--happyReduce_195 = happySpecReduce_2 43# happyReduction_195-happyReduction_195 happy_x_2- happy_x_1- = case happyOut44 happy_x_1 of { happy_var_1 -> - case happyOut48 happy_x_2 of { happy_var_2 -> - happyIn49- (Left $ Right (DomainFull happy_var_1) : happy_var_2- )}}--happyReduce_196 = happySpecReduce_1 43# happyReduction_196-happyReduction_196 happy_x_1- = case happyOut58 happy_x_1 of { happy_var_1 -> - happyIn49- (case happy_var_1 of- Left lb -> Left $ map Right lb- Right es -> Right es- )}--happyReduce_197 = happySpecReduce_1 43# happyReduction_197-happyReduction_197 happy_x_1- = case happyOut44 happy_x_1 of { happy_var_1 -> - happyIn49- (Left [Right $ DomainFull happy_var_1]- )}--happyReduce_198 = happySpecReduce_2 43# happyReduction_198-happyReduction_198 happy_x_2- happy_x_1- = happyIn49- (Left [Left NotHidden]- )--happyReduce_199 = happySpecReduce_2 43# happyReduction_199-happyReduction_199 happy_x_2- happy_x_1- = happyIn49- (Left [Left Hidden]- )--happyReduce_200 = happySpecReduce_2 43# happyReduction_200-happyReduction_200 happy_x_2- happy_x_1- = happyIn49- (Left [Left Instance]- )--happyReduce_201 = happyMonadReduce 3# 44# happyReduction_201-happyReduction_201 (happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut34 happy_x_1 of { happy_var_1 -> - case happyOut29 happy_x_3 of { happy_var_3 -> - ( do- p <- exprToLHS (RawApp (getRange happy_var_1) happy_var_1) ;- return (p [] [], RHS happy_var_3, NoWhere))}}- ) (\r -> happyReturn (happyIn50 r))--happyReduce_202 = happyMonadReduce 1# 45# happyReduction_202-happyReduction_202 (happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut32 happy_x_1 of { happy_var_1 -> - ( do- p <- exprToLHS (RawApp (getRange happy_var_1) happy_var_1);- return (p [] [], AbsurdRHS, NoWhere))}- ) (\r -> happyReturn (happyIn51 r))--happyReduce_203 = happySpecReduce_1 46# happyReduction_203-happyReduction_203 happy_x_1- = case happyOut50 happy_x_1 of { happy_var_1 -> - happyIn52- (happy_var_1- )}--happyReduce_204 = happySpecReduce_1 46# happyReduction_204-happyReduction_204 happy_x_1- = case happyOut51 happy_x_1 of { happy_var_1 -> - happyIn52- (happy_var_1- )}--happyReduce_205 = happySpecReduce_3 47# happyReduction_205-happyReduction_205 happy_x_3- happy_x_2- happy_x_1- = case happyOut53 happy_x_1 of { happy_var_1 -> - case happyOut52 happy_x_3 of { happy_var_3 -> - happyIn53- (happy_var_3 : happy_var_1- )}}--happyReduce_206 = happySpecReduce_3 47# happyReduction_206-happyReduction_206 happy_x_3- happy_x_2- happy_x_1- = case happyOut51 happy_x_1 of { happy_var_1 -> - case happyOut52 happy_x_3 of { happy_var_3 -> - happyIn53- ([happy_var_3, happy_var_1]- )}}--happyReduce_207 = happySpecReduce_1 47# happyReduction_207-happyReduction_207 happy_x_1- = case happyOut50 happy_x_1 of { happy_var_1 -> - happyIn53- ([happy_var_1]- )}--happyReduce_208 = happySpecReduce_2 48# happyReduction_208-happyReduction_208 happy_x_2- happy_x_1- = case happyOut55 happy_x_1 of { happy_var_1 -> - happyIn54- (happy_var_1- )}--happyReduce_209 = happySpecReduce_2 49# happyReduction_209-happyReduction_209 happy_x_2- happy_x_1- = case happyOut57 happy_x_1 of { happy_var_1 -> - case happyOut55 happy_x_2 of { happy_var_2 -> - happyIn55- (happy_var_1 ++ happy_var_2- )}}--happyReduce_210 = happySpecReduce_2 49# happyReduction_210-happyReduction_210 happy_x_2- happy_x_1- = case happyOut44 happy_x_1 of { happy_var_1 -> - case happyOut55 happy_x_2 of { happy_var_2 -> - happyIn55- (DomainFull happy_var_1 : happy_var_2- )}}--happyReduce_211 = happySpecReduce_1 49# happyReduction_211-happyReduction_211 happy_x_1- = case happyOut57 happy_x_1 of { happy_var_1 -> - happyIn55- (happy_var_1- )}--happyReduce_212 = happySpecReduce_1 49# happyReduction_212-happyReduction_212 happy_x_1- = case happyOut44 happy_x_1 of { happy_var_1 -> - happyIn55- ([DomainFull happy_var_1]- )}--happyReduce_213 = happySpecReduce_2 50# happyReduction_213-happyReduction_213 happy_x_2- happy_x_1- = case happyOut57 happy_x_1 of { happy_var_1 -> - case happyOut56 happy_x_2 of { happy_var_2 -> - happyIn56- (happy_var_1 ++ happy_var_2- )}}--happyReduce_214 = happySpecReduce_2 50# happyReduction_214-happyReduction_214 happy_x_2- happy_x_1- = case happyOut44 happy_x_1 of { happy_var_1 -> - case happyOut56 happy_x_2 of { happy_var_2 -> - happyIn56- (DomainFull happy_var_1 : happy_var_2- )}}--happyReduce_215 = happySpecReduce_0 50# happyReduction_215-happyReduction_215 = happyIn56- ([]- )--happyReduce_216 = happySpecReduce_1 51# happyReduction_216-happyReduction_216 happy_x_1- = case happyOut58 happy_x_1 of { happy_var_1 -> - happyIn57- (case happy_var_1 of- Left lbs -> lbs- Right _ -> fail "expected sequence of bound identifiers, not absurd pattern"- )}--happyReduce_217 = happySpecReduce_1 52# happyReduction_217-happyReduction_217 happy_x_1- = case happyOut23 happy_x_1 of { happy_var_1 -> - happyIn58- (Left [DomainFree NotHidden Relevant $ mkBoundName_ happy_var_1]- )}--happyReduce_218 = happySpecReduce_2 52# happyReduction_218-happyReduction_218 happy_x_2- happy_x_1- = case happyOut23 happy_x_2 of { happy_var_2 -> - happyIn58- (Left [DomainFree NotHidden Irrelevant $ mkBoundName_ happy_var_2]- )}--happyReduce_219 = happySpecReduce_2 52# happyReduction_219-happyReduction_219 happy_x_2- happy_x_1- = case happyOut23 happy_x_2 of { happy_var_2 -> - happyIn58- (Left [DomainFree NotHidden NonStrict $ mkBoundName_ happy_var_2]- )}--happyReduce_220 = happySpecReduce_3 52# happyReduction_220-happyReduction_220 happy_x_3- happy_x_2- happy_x_1- = case happyOut26 happy_x_2 of { happy_var_2 -> - happyIn58- (either (Left . map (DomainFree Hidden Relevant . mkBoundName_)) Right happy_var_2- )}--happyReduce_221 = happySpecReduce_3 52# happyReduction_221-happyReduction_221 happy_x_3- happy_x_2- happy_x_1- = case happyOut25 happy_x_2 of { happy_var_2 -> - happyIn58- (Left $ map (DomainFree Instance Relevant . mkBoundName_) happy_var_2- )}--happyReduce_222 = happyReduce 4# 52# happyReduction_222-happyReduction_222 (happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest)- = case happyOut25 happy_x_3 of { happy_var_3 -> - happyIn58- (Left $ map (DomainFree Hidden Irrelevant . mkBoundName_) happy_var_3- ) `HappyStk` happyRest}--happyReduce_223 = happyReduce 4# 52# happyReduction_223-happyReduction_223 (happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest)- = case happyOut25 happy_x_3 of { happy_var_3 -> - happyIn58- (Left $ map (DomainFree Instance Irrelevant . mkBoundName_) happy_var_3- ) `HappyStk` happyRest}--happyReduce_224 = happyReduce 4# 52# happyReduction_224-happyReduction_224 (happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest)- = case happyOut25 happy_x_3 of { happy_var_3 -> - happyIn58- (Left $ map (DomainFree Hidden NonStrict . mkBoundName_) happy_var_3- ) `HappyStk` happyRest}--happyReduce_225 = happyReduce 4# 52# happyReduction_225-happyReduction_225 (happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest)- = case happyOut25 happy_x_3 of { happy_var_3 -> - happyIn58- (Left $ map (DomainFree Instance NonStrict . mkBoundName_) happy_var_3- ) `HappyStk` happyRest}--happyReduce_226 = happySpecReduce_1 53# happyReduction_226-happyReduction_226 happy_x_1- = case happyOut60 happy_x_1 of { happy_var_1 -> - happyIn59- ((Nothing, happy_var_1)- )}--happyReduce_227 = happyMonadReduce 3# 53# happyReduction_227-happyReduction_227 (happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { (TokId happy_var_1) -> - case happyOut15 happy_x_2 of { happy_var_2 -> - case happyOut60 happy_x_3 of { happy_var_3 -> - ( isName "as" happy_var_1 >>- return (Just (AsName happy_var_2 (getRange (fst happy_var_1))), happy_var_3))}}}- ) (\r -> happyReturn (happyIn59 r))--happyReduce_228 = happyMonadReduce 1# 54# happyReduction_228-happyReduction_228 (happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut61 happy_x_1 of { happy_var_1 -> - ( verifyImportDirective happy_var_1)}- ) (\r -> happyReturn (happyIn60 r))--happyReduce_229 = happySpecReduce_2 55# happyReduction_229-happyReduction_229 happy_x_2- happy_x_1- = case happyOut62 happy_x_2 of { happy_var_2 -> - happyIn61- (happy_var_2 { publicOpen = True }- )}--happyReduce_230 = happySpecReduce_1 55# happyReduction_230-happyReduction_230 happy_x_1- = case happyOut62 happy_x_1 of { happy_var_1 -> - happyIn61- (happy_var_1- )}--happyReduce_231 = happySpecReduce_2 56# happyReduction_231-happyReduction_231 happy_x_2- happy_x_1- = case happyOut63 happy_x_1 of { happy_var_1 -> - case happyOut64 happy_x_2 of { happy_var_2 -> - happyIn62- (ImportDirective (fuseRange (snd happy_var_1) (snd happy_var_2)) (fst happy_var_1) (fst happy_var_2) False- )}}--happyReduce_232 = happySpecReduce_1 56# happyReduction_232-happyReduction_232 happy_x_1- = case happyOut64 happy_x_1 of { happy_var_1 -> - happyIn62- (ImportDirective (getRange (snd happy_var_1)) (Hiding []) (fst happy_var_1) False- )}--happyReduce_233 = happySpecReduce_1 56# happyReduction_233-happyReduction_233 happy_x_1- = case happyOut63 happy_x_1 of { happy_var_1 -> - happyIn62- (ImportDirective (getRange (snd happy_var_1)) (fst happy_var_1) [] False- )}--happyReduce_234 = happySpecReduce_0 56# happyReduction_234-happyReduction_234 = happyIn62- (ImportDirective noRange (Hiding []) [] False- )--happyReduce_235 = happyReduce 4# 57# happyReduction_235-happyReduction_235 (happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest)- = case happyOutTok happy_x_1 of { (TokKeyword KwUsing happy_var_1) -> - case happyOut69 happy_x_3 of { happy_var_3 -> - case happyOutTok happy_x_4 of { (TokSymbol SymCloseParen happy_var_4) -> - happyIn63- ((Using happy_var_3 , fuseRange happy_var_1 happy_var_4)- ) `HappyStk` happyRest}}}--happyReduce_236 = happyReduce 4# 57# happyReduction_236-happyReduction_236 (happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest)- = case happyOutTok happy_x_1 of { (TokKeyword KwHiding happy_var_1) -> - case happyOut70 happy_x_3 of { happy_var_3 -> - case happyOutTok happy_x_4 of { (TokSymbol SymCloseParen happy_var_4) -> - happyIn63- ((Hiding happy_var_3 , fuseRange happy_var_1 happy_var_4)- ) `HappyStk` happyRest}}}--happyReduce_237 = happyReduce 4# 58# happyReduction_237-happyReduction_237 (happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest)- = case happyOutTok happy_x_1 of { (TokKeyword KwRenaming happy_var_1) -> - case happyOut65 happy_x_3 of { happy_var_3 -> - case happyOutTok happy_x_4 of { (TokSymbol SymCloseParen happy_var_4) -> - happyIn64- ((happy_var_3 , fuseRange happy_var_1 happy_var_4)- ) `HappyStk` happyRest}}}--happyReduce_238 = happySpecReduce_3 59# happyReduction_238-happyReduction_238 happy_x_3- happy_x_2- happy_x_1- = case happyOut66 happy_x_1 of { happy_var_1 -> - case happyOut65 happy_x_3 of { happy_var_3 -> - happyIn65- (happy_var_1 : happy_var_3- )}}--happyReduce_239 = happySpecReduce_1 59# happyReduction_239-happyReduction_239 happy_x_1- = case happyOut66 happy_x_1 of { happy_var_1 -> - happyIn65- ([happy_var_1]- )}--happyReduce_240 = happySpecReduce_3 60# happyReduction_240-happyReduction_240 happy_x_3- happy_x_2- happy_x_1- = case happyOut67 happy_x_1 of { happy_var_1 -> - case happyOutTok happy_x_2 of { (TokKeyword KwTo happy_var_2) -> - case happyOut15 happy_x_3 of { happy_var_3 -> - happyIn66- (Renaming happy_var_1 happy_var_3 (getRange happy_var_2)- )}}}--happyReduce_241 = happySpecReduce_2 61# happyReduction_241-happyReduction_241 happy_x_2- happy_x_1- = case happyOut15 happy_x_2 of { happy_var_2 -> - happyIn67- (ImportedName happy_var_2- )}--happyReduce_242 = happySpecReduce_3 61# happyReduction_242-happyReduction_242 happy_x_3- happy_x_2- happy_x_1- = case happyOut15 happy_x_3 of { happy_var_3 -> - happyIn67- (ImportedModule happy_var_3- )}--happyReduce_243 = happySpecReduce_1 62# happyReduction_243-happyReduction_243 happy_x_1- = case happyOut15 happy_x_1 of { happy_var_1 -> - happyIn68- (ImportedName happy_var_1- )}--happyReduce_244 = happySpecReduce_2 62# happyReduction_244-happyReduction_244 happy_x_2- happy_x_1- = case happyOut15 happy_x_2 of { happy_var_2 -> - happyIn68- (ImportedModule happy_var_2- )}--happyReduce_245 = happySpecReduce_0 63# happyReduction_245-happyReduction_245 = happyIn69- ([]- )--happyReduce_246 = happySpecReduce_1 63# happyReduction_246-happyReduction_246 happy_x_1- = case happyOut70 happy_x_1 of { happy_var_1 -> - happyIn69- (happy_var_1- )}--happyReduce_247 = happySpecReduce_1 64# happyReduction_247-happyReduction_247 happy_x_1- = case happyOut68 happy_x_1 of { happy_var_1 -> - happyIn70- ([happy_var_1]- )}--happyReduce_248 = happySpecReduce_3 64# happyReduction_248-happyReduction_248 happy_x_3- happy_x_2- happy_x_1- = case happyOut68 happy_x_1 of { happy_var_1 -> - case happyOut70 happy_x_3 of { happy_var_3 -> - happyIn70- (happy_var_1 : happy_var_3- )}}--happyReduce_249 = happyMonadReduce 3# 65# happyReduction_249-happyReduction_249 (happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut30 happy_x_1 of { happy_var_1 -> - case happyOut74 happy_x_2 of { happy_var_2 -> - case happyOut73 happy_x_3 of { happy_var_3 -> - ( exprToLHS happy_var_1 >>= \p -> return (p happy_var_2 happy_var_3))}}}- ) (\r -> happyReturn (happyIn71 r))--happyReduce_250 = happyReduce 4# 65# happyReduction_250-happyReduction_250 (happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest)- = case happyOutTok happy_x_1 of { (TokSymbol SymEllipsis happy_var_1) -> - case happyOut72 happy_x_2 of { happy_var_2 -> - case happyOut74 happy_x_3 of { happy_var_3 -> - case happyOut73 happy_x_4 of { happy_var_4 -> - happyIn71- (Ellipsis (fuseRange happy_var_1 happy_var_3) happy_var_2 happy_var_3 happy_var_4- ) `HappyStk` happyRest}}}}--happyReduce_251 = happySpecReduce_0 66# happyReduction_251-happyReduction_251 = happyIn72- ([]- )--happyReduce_252 = happyMonadReduce 3# 66# happyReduction_252-happyReduction_252 (happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut34 happy_x_2 of { happy_var_2 -> - case happyOut72 happy_x_3 of { happy_var_3 -> - ( exprToPattern (RawApp (getRange happy_var_2) happy_var_2) >>= \p ->- return (p : happy_var_3))}}- ) (\r -> happyReturn (happyIn72 r))--happyReduce_253 = happySpecReduce_0 67# happyReduction_253-happyReduction_253 = happyIn73- ([]- )--happyReduce_254 = happySpecReduce_2 67# happyReduction_254-happyReduction_254 happy_x_2- happy_x_1- = case happyOut29 happy_x_2 of { happy_var_2 -> - happyIn73- (case happy_var_2 of { WithApp _ e es -> e : es; e -> [e] }- )}--happyReduce_255 = happySpecReduce_0 68# happyReduction_255-happyReduction_255 = happyIn74- ([]- )--happyReduce_256 = happySpecReduce_2 68# happyReduction_256-happyReduction_256 happy_x_2- happy_x_1- = case happyOut29 happy_x_2 of { happy_var_2 -> - happyIn74- (case happy_var_2 of { WithApp _ e es -> e : es; e -> [e] }- )}--happyReduce_257 = happySpecReduce_0 69# happyReduction_257-happyReduction_257 = happyIn75- (NoWhere- )--happyReduce_258 = happySpecReduce_2 69# happyReduction_258-happyReduction_258 happy_x_2- happy_x_1- = case happyOut130 happy_x_2 of { happy_var_2 -> - happyIn75- (AnyWhere happy_var_2- )}--happyReduce_259 = happyReduce 4# 69# happyReduction_259-happyReduction_259 (happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest)- = case happyOut15 happy_x_2 of { happy_var_2 -> - case happyOut130 happy_x_4 of { happy_var_4 -> - happyIn75- (SomeWhere happy_var_2 happy_var_4- ) `HappyStk` happyRest}}--happyReduce_260 = happySpecReduce_1 70# happyReduction_260-happyReduction_260 happy_x_1- = case happyOut78 happy_x_1 of { happy_var_1 -> - happyIn76- ([happy_var_1]- )}--happyReduce_261 = happySpecReduce_1 70# happyReduction_261-happyReduction_261 happy_x_1- = case happyOut89 happy_x_1 of { happy_var_1 -> - happyIn76- (happy_var_1- )}--happyReduce_262 = happySpecReduce_1 70# happyReduction_262-happyReduction_262 happy_x_1- = case happyOut81 happy_x_1 of { happy_var_1 -> - happyIn76- ([happy_var_1]- )}--happyReduce_263 = happySpecReduce_1 70# happyReduction_263-happyReduction_263 happy_x_1- = case happyOut83 happy_x_1 of { happy_var_1 -> - happyIn76- ([happy_var_1]- )}--happyReduce_264 = happySpecReduce_1 70# happyReduction_264-happyReduction_264 happy_x_1- = case happyOut84 happy_x_1 of { happy_var_1 -> - happyIn76- ([happy_var_1]- )}--happyReduce_265 = happySpecReduce_1 70# happyReduction_265-happyReduction_265 happy_x_1- = case happyOut85 happy_x_1 of { happy_var_1 -> - happyIn76- ([happy_var_1]- )}--happyReduce_266 = happySpecReduce_1 70# happyReduction_266-happyReduction_266 happy_x_1- = case happyOut86 happy_x_1 of { happy_var_1 -> - happyIn76- ([happy_var_1]- )}--happyReduce_267 = happySpecReduce_1 70# happyReduction_267-happyReduction_267 happy_x_1- = case happyOut88 happy_x_1 of { happy_var_1 -> - happyIn76- ([happy_var_1]- )}--happyReduce_268 = happySpecReduce_1 70# happyReduction_268-happyReduction_268 happy_x_1- = case happyOut90 happy_x_1 of { happy_var_1 -> - happyIn76- ([happy_var_1]- )}--happyReduce_269 = happySpecReduce_1 70# happyReduction_269-happyReduction_269 happy_x_1- = case happyOut91 happy_x_1 of { happy_var_1 -> - happyIn76- ([happy_var_1]- )}--happyReduce_270 = happySpecReduce_1 70# happyReduction_270-happyReduction_270 happy_x_1- = case happyOut92 happy_x_1 of { happy_var_1 -> - happyIn76- ([happy_var_1]- )}--happyReduce_271 = happySpecReduce_1 70# happyReduction_271-happyReduction_271 happy_x_1- = case happyOut93 happy_x_1 of { happy_var_1 -> - happyIn76- ([happy_var_1]- )}--happyReduce_272 = happySpecReduce_1 70# happyReduction_272-happyReduction_272 happy_x_1- = case happyOut94 happy_x_1 of { happy_var_1 -> - happyIn76- ([happy_var_1]- )}--happyReduce_273 = happySpecReduce_1 70# happyReduction_273-happyReduction_273 happy_x_1- = case happyOut100 happy_x_1 of { happy_var_1 -> - happyIn76- ([happy_var_1]- )}--happyReduce_274 = happySpecReduce_1 70# happyReduction_274-happyReduction_274 happy_x_1- = case happyOut104 happy_x_1 of { happy_var_1 -> - happyIn76- ([happy_var_1]- )}--happyReduce_275 = happySpecReduce_1 70# happyReduction_275-happyReduction_275 happy_x_1- = case happyOut103 happy_x_1 of { happy_var_1 -> - happyIn76- ([happy_var_1]- )}--happyReduce_276 = happySpecReduce_1 70# happyReduction_276-happyReduction_276 happy_x_1- = case happyOut105 happy_x_1 of { happy_var_1 -> - happyIn76- ([happy_var_1]- )}--happyReduce_277 = happySpecReduce_1 70# happyReduction_277-happyReduction_277 happy_x_1- = case happyOut108 happy_x_1 of { happy_var_1 -> - happyIn76- ([happy_var_1]- )}--happyReduce_278 = happySpecReduce_1 70# happyReduction_278-happyReduction_278 happy_x_1- = case happyOut95 happy_x_1 of { happy_var_1 -> - happyIn76- ([happy_var_1]- )}--happyReduce_279 = happySpecReduce_3 71# happyReduction_279-happyReduction_279 happy_x_3- happy_x_2- happy_x_1- = case happyOut16 happy_x_1 of { happy_var_1 -> - case happyOut29 happy_x_3 of { happy_var_3 -> - happyIn77- (map (flip (TypeSig Relevant) happy_var_3) happy_var_1- )}}--happyReduce_280 = happyReduce 4# 72# happyReduction_280-happyReduction_280 (happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest)- = case happyOut15 happy_x_2 of { happy_var_2 -> - case happyOut29 happy_x_4 of { happy_var_4 -> - happyIn78- (TypeSig Irrelevant happy_var_2 happy_var_4- ) `HappyStk` happyRest}}--happyReduce_281 = happySpecReduce_3 72# happyReduction_281-happyReduction_281 happy_x_3- happy_x_2- happy_x_1- = case happyOut15 happy_x_1 of { happy_var_1 -> - case happyOut29 happy_x_3 of { happy_var_3 -> - happyIn78- (TypeSig Relevant happy_var_1 happy_var_3- )}}--happyReduce_282 = happySpecReduce_3 73# happyReduction_282-happyReduction_282 happy_x_3- happy_x_2- happy_x_1- = case happyOut19 happy_x_1 of { happy_var_1 -> - case happyOut29 happy_x_3 of { happy_var_3 -> - happyIn79- (map (\ (Arg _ rel x) -> TypeSig rel x happy_var_3) happy_var_1- )}}--happyReduce_283 = happySpecReduce_3 74# happyReduction_283-happyReduction_283 happy_x_3- happy_x_2- happy_x_1- = case happyOut20 happy_x_1 of { happy_var_1 -> - case happyOut29 happy_x_3 of { happy_var_3 -> - happyIn80- (map (fmap (flip (TypeSig Relevant) happy_var_3)) happy_var_1- )}}--happyReduce_284 = happySpecReduce_3 75# happyReduction_284-happyReduction_284 happy_x_3- happy_x_2- happy_x_1- = case happyOut71 happy_x_1 of { happy_var_1 -> - case happyOut82 happy_x_2 of { happy_var_2 -> - case happyOut75 happy_x_3 of { happy_var_3 -> - happyIn81- (FunClause happy_var_1 happy_var_2 happy_var_3- )}}}--happyReduce_285 = happySpecReduce_2 76# happyReduction_285-happyReduction_285 happy_x_2- happy_x_1- = case happyOut29 happy_x_2 of { happy_var_2 -> - happyIn82- (RHS happy_var_2- )}--happyReduce_286 = happySpecReduce_0 76# happyReduction_286-happyReduction_286 = happyIn82- (AbsurdRHS- )--happyReduce_287 = happyReduce 7# 77# happyReduction_287-happyReduction_287 (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 happyOutTok happy_x_1 of { (TokKeyword KwData happy_var_1) -> - case happyOut15 happy_x_2 of { happy_var_2 -> - case happyOut56 happy_x_3 of { happy_var_3 -> - case happyOut29 happy_x_5 of { happy_var_5 -> - case happyOutTok happy_x_6 of { (TokKeyword KwWhere happy_var_6) -> - case happyOut128 happy_x_7 of { happy_var_7 -> - happyIn83- (Data (getRange (happy_var_1, happy_var_6, happy_var_7)) Inductive happy_var_2 happy_var_3 (Just happy_var_5) happy_var_7- ) `HappyStk` happyRest}}}}}}--happyReduce_288 = happyReduce 7# 77# happyReduction_288-happyReduction_288 (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 happyOutTok happy_x_1 of { (TokKeyword KwCoData happy_var_1) -> - case happyOut15 happy_x_2 of { happy_var_2 -> - case happyOut56 happy_x_3 of { happy_var_3 -> - case happyOut29 happy_x_5 of { happy_var_5 -> - case happyOutTok happy_x_6 of { (TokKeyword KwWhere happy_var_6) -> - case happyOut128 happy_x_7 of { happy_var_7 -> - happyIn83- (Data (getRange (happy_var_1, happy_var_6, happy_var_7)) CoInductive happy_var_2 happy_var_3 (Just happy_var_5) happy_var_7- ) `HappyStk` happyRest}}}}}}--happyReduce_289 = happyReduce 5# 77# happyReduction_289-happyReduction_289 (happy_x_5 `HappyStk`- happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest)- = case happyOutTok happy_x_1 of { (TokKeyword KwData happy_var_1) -> - case happyOut15 happy_x_2 of { happy_var_2 -> - case happyOut56 happy_x_3 of { happy_var_3 -> - case happyOutTok happy_x_4 of { (TokKeyword KwWhere happy_var_4) -> - case happyOut128 happy_x_5 of { happy_var_5 -> - happyIn83- (Data (getRange (happy_var_1, happy_var_4, happy_var_5)) Inductive happy_var_2 happy_var_3 Nothing happy_var_5- ) `HappyStk` happyRest}}}}}--happyReduce_290 = happyReduce 5# 77# happyReduction_290-happyReduction_290 (happy_x_5 `HappyStk`- happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest)- = case happyOutTok happy_x_1 of { (TokKeyword KwCoData happy_var_1) -> - case happyOut15 happy_x_2 of { happy_var_2 -> - case happyOut56 happy_x_3 of { happy_var_3 -> - case happyOutTok happy_x_4 of { (TokKeyword KwWhere happy_var_4) -> - case happyOut128 happy_x_5 of { happy_var_5 -> - happyIn83- (Data (getRange (happy_var_1, happy_var_4, happy_var_5)) CoInductive happy_var_2 happy_var_3 Nothing happy_var_5- ) `HappyStk` happyRest}}}}}--happyReduce_291 = happyReduce 5# 78# happyReduction_291-happyReduction_291 (happy_x_5 `HappyStk`- happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest)- = case happyOutTok happy_x_1 of { (TokKeyword KwData happy_var_1) -> - case happyOut15 happy_x_2 of { happy_var_2 -> - case happyOut56 happy_x_3 of { happy_var_3 -> - case happyOut29 happy_x_5 of { happy_var_5 -> - happyIn84- (DataSig (fuseRange happy_var_1 happy_var_5) Inductive happy_var_2 happy_var_3 happy_var_5- ) `HappyStk` happyRest}}}}--happyReduce_292 = happyReduce 7# 79# happyReduction_292-happyReduction_292 (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 happyOutTok happy_x_1 of { (TokKeyword KwRecord happy_var_1) -> - case happyOut15 happy_x_2 of { happy_var_2 -> - case happyOut56 happy_x_3 of { happy_var_3 -> - case happyOut29 happy_x_5 of { happy_var_5 -> - case happyOutTok happy_x_6 of { (TokKeyword KwWhere happy_var_6) -> - case happyOut129 happy_x_7 of { happy_var_7 -> - happyIn85- (Record (getRange (happy_var_1, happy_var_6, happy_var_7)) happy_var_2 (fst happy_var_7) happy_var_3 (Just happy_var_5) (snd happy_var_7)- ) `HappyStk` happyRest}}}}}}--happyReduce_293 = happyReduce 5# 79# happyReduction_293-happyReduction_293 (happy_x_5 `HappyStk`- happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest)- = case happyOutTok happy_x_1 of { (TokKeyword KwRecord happy_var_1) -> - case happyOut15 happy_x_2 of { happy_var_2 -> - case happyOut56 happy_x_3 of { happy_var_3 -> - case happyOutTok happy_x_4 of { (TokKeyword KwWhere happy_var_4) -> - case happyOut129 happy_x_5 of { happy_var_5 -> - happyIn85- (Record (getRange (happy_var_1, happy_var_4, happy_var_5)) happy_var_2 (fst happy_var_5) happy_var_3 Nothing (snd happy_var_5)- ) `HappyStk` happyRest}}}}}--happyReduce_294 = happyReduce 5# 80# happyReduction_294-happyReduction_294 (happy_x_5 `HappyStk`- happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest)- = case happyOutTok happy_x_1 of { (TokKeyword KwRecord happy_var_1) -> - case happyOut15 happy_x_2 of { happy_var_2 -> - case happyOut56 happy_x_3 of { happy_var_3 -> - case happyOut29 happy_x_5 of { happy_var_5 -> - happyIn86- (RecordSig (fuseRange happy_var_1 happy_var_5) happy_var_2 happy_var_3 happy_var_5- ) `HappyStk` happyRest}}}}--happyReduce_295 = happySpecReduce_2 81# happyReduction_295-happyReduction_295 happy_x_2- happy_x_1- = case happyOut15 happy_x_2 of { happy_var_2 -> - happyIn87- (happy_var_2- )}--happyReduce_296 = happySpecReduce_3 82# happyReduction_296-happyReduction_296 happy_x_3- happy_x_2- happy_x_1- = case happyOutTok happy_x_1 of { (TokKeyword KwInfix happy_var_1) -> - case happyOut14 happy_x_2 of { happy_var_2 -> - case happyOut24 happy_x_3 of { happy_var_3 -> - happyIn88- (Infix (NonAssoc (fuseRange happy_var_1 happy_var_3) happy_var_2) happy_var_3- )}}}--happyReduce_297 = happySpecReduce_3 82# happyReduction_297-happyReduction_297 happy_x_3- happy_x_2- happy_x_1- = case happyOutTok happy_x_1 of { (TokKeyword KwInfixL happy_var_1) -> - case happyOut14 happy_x_2 of { happy_var_2 -> - case happyOut24 happy_x_3 of { happy_var_3 -> - happyIn88- (Infix (LeftAssoc (fuseRange happy_var_1 happy_var_3) happy_var_2) happy_var_3- )}}}--happyReduce_298 = happySpecReduce_3 82# happyReduction_298-happyReduction_298 happy_x_3- happy_x_2- happy_x_1- = case happyOutTok happy_x_1 of { (TokKeyword KwInfixR happy_var_1) -> - case happyOut14 happy_x_2 of { happy_var_2 -> - case happyOut24 happy_x_3 of { happy_var_3 -> - happyIn88- (Infix (RightAssoc (fuseRange happy_var_1 happy_var_3) happy_var_2) happy_var_3- )}}}--happyReduce_299 = happySpecReduce_2 83# happyReduction_299-happyReduction_299 happy_x_2- happy_x_1- = case happyOut126 happy_x_2 of { happy_var_2 -> - happyIn89- (let toField (Arg h rel (TypeSig _ x t)) = Field x (Arg h rel t) in map toField happy_var_2- )}--happyReduce_300 = happySpecReduce_2 84# happyReduction_300-happyReduction_300 happy_x_2- happy_x_1- = case happyOutTok happy_x_1 of { (TokKeyword KwMutual happy_var_1) -> - case happyOut130 happy_x_2 of { happy_var_2 -> - happyIn90- (Mutual (fuseRange happy_var_1 happy_var_2) happy_var_2- )}}--happyReduce_301 = happySpecReduce_2 85# happyReduction_301-happyReduction_301 happy_x_2- happy_x_1- = case happyOutTok happy_x_1 of { (TokKeyword KwAbstract happy_var_1) -> - case happyOut130 happy_x_2 of { happy_var_2 -> - happyIn91- (Abstract (fuseRange happy_var_1 happy_var_2) happy_var_2- )}}--happyReduce_302 = happySpecReduce_2 86# happyReduction_302-happyReduction_302 happy_x_2- happy_x_1- = case happyOutTok happy_x_1 of { (TokKeyword KwPrivate happy_var_1) -> - case happyOut130 happy_x_2 of { happy_var_2 -> - happyIn92- (Private (fuseRange happy_var_1 happy_var_2) happy_var_2- )}}--happyReduce_303 = happySpecReduce_2 87# happyReduction_303-happyReduction_303 happy_x_2- happy_x_1- = case happyOutTok happy_x_1 of { (TokKeyword KwPostulate happy_var_1) -> - case happyOut124 happy_x_2 of { happy_var_2 -> - happyIn93- (Postulate (fuseRange happy_var_1 happy_var_2) happy_var_2- )}}--happyReduce_304 = happySpecReduce_2 88# happyReduction_304-happyReduction_304 happy_x_2- happy_x_1- = case happyOutTok happy_x_1 of { (TokKeyword KwPrimitive happy_var_1) -> - case happyOut122 happy_x_2 of { happy_var_2 -> - happyIn94- (Primitive (fuseRange happy_var_1 happy_var_2) happy_var_2- )}}--happyReduce_305 = happyMonadReduce 5# 89# happyReduction_305-happyReduction_305 (happy_x_5 `HappyStk`- happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut15 happy_x_2 of { happy_var_2 -> - case happyOut97 happy_x_3 of { happy_var_3 -> - case happyOut96 happy_x_5 of { happy_var_5 -> - (- case happy_var_2 of- Name _ [_] -> case mkNotation happy_var_3 happy_var_5 of- Left err -> parseError $ "malformed syntax declaration: " ++ err- Right n -> return $ Syntax happy_var_2 n- _ -> parseError "syntax declarations are allowed only for simple names (without holes)")}}}- ) (\r -> happyReturn (happyIn95 r))--happyReduce_306 = happySpecReduce_1 90# happyReduction_306-happyReduction_306 happy_x_1- = case happyOut99 happy_x_1 of { happy_var_1 -> - happyIn96- ([happy_var_1]- )}--happyReduce_307 = happySpecReduce_2 90# happyReduction_307-happyReduction_307 happy_x_2- happy_x_1- = case happyOut96 happy_x_1 of { happy_var_1 -> - case happyOut99 happy_x_2 of { happy_var_2 -> - happyIn96- (happy_var_1 ++ [happy_var_2]- )}}--happyReduce_308 = happySpecReduce_1 91# happyReduction_308-happyReduction_308 happy_x_1- = case happyOut98 happy_x_1 of { happy_var_1 -> - happyIn97- ([happy_var_1]- )}--happyReduce_309 = happySpecReduce_2 91# happyReduction_309-happyReduction_309 happy_x_2- happy_x_1- = case happyOut97 happy_x_1 of { happy_var_1 -> - case happyOut98 happy_x_2 of { happy_var_2 -> - happyIn97- (happy_var_1 ++ [happy_var_2]- )}}--happyReduce_310 = happySpecReduce_1 92# happyReduction_310-happyReduction_310 happy_x_1- = case happyOut99 happy_x_1 of { happy_var_1 -> - happyIn98- (ExprHole happy_var_1- )}--happyReduce_311 = happyReduce 6# 92# happyReduction_311-happyReduction_311 (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 happyOut99 happy_x_3 of { happy_var_3 -> - case happyOut99 happy_x_5 of { happy_var_5 -> - happyIn98- (LambdaHole happy_var_3 happy_var_5- ) `HappyStk` happyRest}}--happyReduce_312 = happySpecReduce_1 93# happyReduction_312-happyReduction_312 happy_x_1- = case happyOutTok happy_x_1 of { (TokId happy_var_1) -> - happyIn99- (snd happy_var_1- )}--happyReduce_313 = happyReduce 4# 94# happyReduction_313-happyReduction_313 (happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest)- = case happyOutTok happy_x_1 of { (TokKeyword KwOpen happy_var_1) -> - case happyOut22 happy_x_2 of { happy_var_2 -> - case happyOut101 happy_x_3 of { happy_var_3 -> - case happyOut60 happy_x_4 of { happy_var_4 -> - happyIn100- (let- { m = happy_var_2- ; es = happy_var_3- ; dir = happy_var_4- ; r = getRange (happy_var_1, m, es, dir)- } in- case es of- { [] -> Open r m dir- ; _ -> Private r [ ModuleMacro r (noName $ beginningOf $ getRange happy_var_2)- (SectionApp (getRange (m , es)) [] (RawApp (fuseRange m es) (Ident m : es)))- DoOpen dir- ]- }- ) `HappyStk` happyRest}}}}--happyReduce_314 = happyReduce 6# 94# happyReduction_314-happyReduction_314 (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 happyOutTok happy_x_1 of { (TokKeyword KwOpen happy_var_1) -> - case happyOut22 happy_x_2 of { happy_var_2 -> - case happyOutTok happy_x_3 of { (TokSymbol SymDoubleOpenBrace happy_var_3) -> - case happyOutTok happy_x_4 of { (TokSymbol SymEllipsis happy_var_4) -> - case happyOut60 happy_x_6 of { happy_var_6 -> - happyIn100- (let r = getRange (happy_var_1, happy_var_2, happy_var_3, happy_var_4) in- Private r [ ModuleMacro r (noName $ beginningOf $ getRange happy_var_2)- (RecordModuleIFS r happy_var_2) DoOpen happy_var_6- ]- ) `HappyStk` happyRest}}}}}--happyReduce_315 = happySpecReduce_0 95# happyReduction_315-happyReduction_315 = happyIn101- ([]- )--happyReduce_316 = happySpecReduce_2 95# happyReduction_316-happyReduction_316 happy_x_2- happy_x_1- = case happyOut37 happy_x_1 of { happy_var_1 -> - case happyOut101 happy_x_2 of { happy_var_2 -> - happyIn101- (happy_var_1 : happy_var_2- )}}--happyReduce_317 = happyReduce 4# 96# happyReduction_317-happyReduction_317 (happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest)- = case happyOut22 happy_x_1 of { happy_var_1 -> - case happyOut17 happy_x_4 of { happy_var_4 -> - happyIn102- ((\ts ->- if null ts then return $ RecordModuleIFS (getRange (happy_var_1, happy_var_4)) happy_var_1- else parseError "No bindings allowed for record module with non-canonical implicits" )- ) `HappyStk` happyRest}}--happyReduce_318 = happySpecReduce_2 96# happyReduction_318-happyReduction_318 happy_x_2- happy_x_1- = case happyOut22 happy_x_1 of { happy_var_1 -> - case happyOut101 happy_x_2 of { happy_var_2 -> - happyIn102- ((\ts -> return $ SectionApp (getRange (happy_var_1, happy_var_2)) ts (RawApp (fuseRange happy_var_1 happy_var_2) (Ident happy_var_1 : happy_var_2)) )- )}}--happyReduce_319 = happyMonadReduce 6# 97# happyReduction_319-happyReduction_319 (happy_x_6 `HappyStk`- happy_x_5 `HappyStk`- happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { (TokKeyword KwModule happy_var_1) -> - case happyOut15 happy_x_2 of { happy_var_2 -> - case happyOut56 happy_x_3 of { happy_var_3 -> - case happyOut102 happy_x_5 of { happy_var_5 -> - case happyOut60 happy_x_6 of { happy_var_6 -> - ( do {ma <- happy_var_5 (map addType happy_var_3); return $ ModuleMacro (getRange (happy_var_1, ma, happy_var_6)) happy_var_2 ma DontOpen happy_var_6 })}}}}}- ) (\r -> happyReturn (happyIn103 r))--happyReduce_320 = happyMonadReduce 7# 97# happyReduction_320-happyReduction_320 (happy_x_7 `HappyStk`- happy_x_6 `HappyStk`- happy_x_5 `HappyStk`- happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { (TokKeyword KwOpen happy_var_1) -> - case happyOut15 happy_x_3 of { happy_var_3 -> - case happyOut56 happy_x_4 of { happy_var_4 -> - case happyOut102 happy_x_6 of { happy_var_6 -> - case happyOut60 happy_x_7 of { happy_var_7 -> - ( do {ma <- happy_var_6 (map addType happy_var_4); return $ ModuleMacro (getRange (happy_var_1, ma, happy_var_7)) happy_var_3 ma DoOpen happy_var_7 })}}}}}- ) (\r -> happyReturn (happyIn103 r))--happyReduce_321 = happySpecReduce_3 98# happyReduction_321-happyReduction_321 happy_x_3- happy_x_2- happy_x_1- = case happyOutTok happy_x_1 of { (TokKeyword KwImport happy_var_1) -> - case happyOut22 happy_x_2 of { happy_var_2 -> - case happyOut59 happy_x_3 of { happy_var_3 -> - happyIn104- (Import (getRange (happy_var_1,happy_var_2,snd happy_var_3)) happy_var_2 (fst happy_var_3) DontOpen (snd happy_var_3)- )}}}--happyReduce_322 = happyReduce 4# 98# happyReduction_322-happyReduction_322 (happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest)- = case happyOutTok happy_x_1 of { (TokKeyword KwOpen happy_var_1) -> - case happyOut22 happy_x_3 of { happy_var_3 -> - case happyOut59 happy_x_4 of { happy_var_4 -> - happyIn104- (Import (getRange (happy_var_1,happy_var_3,snd happy_var_4)) happy_var_3 (fst happy_var_4) DoOpen (snd happy_var_4)- ) `HappyStk` happyRest}}}--happyReduce_323 = happyReduce 5# 99# happyReduction_323-happyReduction_323 (happy_x_5 `HappyStk`- happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest)- = case happyOutTok happy_x_1 of { (TokKeyword KwModule happy_var_1) -> - case happyOut15 happy_x_2 of { happy_var_2 -> - case happyOut56 happy_x_3 of { happy_var_3 -> - case happyOutTok happy_x_4 of { (TokKeyword KwWhere happy_var_4) -> - case happyOut131 happy_x_5 of { happy_var_5 -> - happyIn105- (Module (getRange (happy_var_1,happy_var_4,happy_var_5)) (QName happy_var_2) (map addType happy_var_3) happy_var_5- ) `HappyStk` happyRest}}}}}--happyReduce_324 = happySpecReduce_1 100# happyReduction_324-happyReduction_324 happy_x_1- = case happyOut107 happy_x_1 of { happy_var_1 -> - happyIn106- ([happy_var_1]- )}--happyReduce_325 = happySpecReduce_2 100# happyReduction_325-happyReduction_325 happy_x_2- happy_x_1- = case happyOut104 happy_x_1 of { happy_var_1 -> - case happyOut106 happy_x_2 of { happy_var_2 -> - happyIn106- (happy_var_1 : happy_var_2- )}}--happyReduce_326 = happySpecReduce_2 100# happyReduction_326-happyReduction_326 happy_x_2- happy_x_1- = case happyOut100 happy_x_1 of { happy_var_1 -> - case happyOut106 happy_x_2 of { happy_var_2 -> - happyIn106- (happy_var_1 : happy_var_2- )}}--happyReduce_327 = happyReduce 5# 101# happyReduction_327-happyReduction_327 (happy_x_5 `HappyStk`- happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest)- = case happyOutTok happy_x_1 of { (TokKeyword KwModule happy_var_1) -> - case happyOut22 happy_x_2 of { happy_var_2 -> - case happyOut56 happy_x_3 of { happy_var_3 -> - case happyOutTok happy_x_4 of { (TokKeyword KwWhere happy_var_4) -> - case happyOut131 happy_x_5 of { happy_var_5 -> - happyIn107- (Module (getRange (happy_var_1,happy_var_4,happy_var_5)) happy_var_2 (map addType happy_var_3) happy_var_5- ) `HappyStk` happyRest}}}}}--happyReduce_328 = happySpecReduce_1 102# happyReduction_328-happyReduction_328 happy_x_1- = case happyOut110 happy_x_1 of { happy_var_1 -> - happyIn108- (Pragma happy_var_1- )}--happyReduce_329 = happySpecReduce_1 103# happyReduction_329-happyReduction_329 happy_x_1- = case happyOut111 happy_x_1 of { happy_var_1 -> - happyIn109- (happy_var_1- )}--happyReduce_330 = happySpecReduce_1 104# happyReduction_330-happyReduction_330 happy_x_1- = case happyOut112 happy_x_1 of { happy_var_1 -> - happyIn110- (happy_var_1- )}--happyReduce_331 = happySpecReduce_1 104# happyReduction_331-happyReduction_331 happy_x_1- = case happyOut113 happy_x_1 of { happy_var_1 -> - happyIn110- (happy_var_1- )}--happyReduce_332 = happySpecReduce_1 104# happyReduction_332-happyReduction_332 happy_x_1- = case happyOut115 happy_x_1 of { happy_var_1 -> - happyIn110- (happy_var_1- )}--happyReduce_333 = happySpecReduce_1 104# happyReduction_333-happyReduction_333 happy_x_1- = case happyOut114 happy_x_1 of { happy_var_1 -> - happyIn110- (happy_var_1- )}--happyReduce_334 = happySpecReduce_1 104# happyReduction_334-happyReduction_334 happy_x_1- = case happyOut116 happy_x_1 of { happy_var_1 -> - happyIn110- (happy_var_1- )}--happyReduce_335 = happySpecReduce_1 104# happyReduction_335-happyReduction_335 happy_x_1- = case happyOut117 happy_x_1 of { happy_var_1 -> - happyIn110- (happy_var_1- )}--happyReduce_336 = happySpecReduce_1 104# happyReduction_336-happyReduction_336 happy_x_1- = case happyOut118 happy_x_1 of { happy_var_1 -> - happyIn110- (happy_var_1- )}--happyReduce_337 = happySpecReduce_1 104# happyReduction_337-happyReduction_337 happy_x_1- = case happyOut120 happy_x_1 of { happy_var_1 -> - happyIn110- (happy_var_1- )}--happyReduce_338 = happySpecReduce_1 104# happyReduction_338-happyReduction_338 happy_x_1- = case happyOut121 happy_x_1 of { happy_var_1 -> - happyIn110- (happy_var_1- )}--happyReduce_339 = happySpecReduce_1 104# happyReduction_339-happyReduction_339 happy_x_1- = case happyOut119 happy_x_1 of { happy_var_1 -> - happyIn110- (happy_var_1- )}--happyReduce_340 = happyReduce 4# 105# happyReduction_340-happyReduction_340 (happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest)- = case happyOutTok happy_x_1 of { (TokSymbol SymOpenPragma happy_var_1) -> - case happyOut27 happy_x_3 of { happy_var_3 -> - case happyOutTok happy_x_4 of { (TokSymbol SymClosePragma happy_var_4) -> - happyIn111- (OptionsPragma (fuseRange happy_var_1 happy_var_4) happy_var_3- ) `HappyStk` happyRest}}}--happyReduce_341 = happyReduce 5# 106# happyReduction_341-happyReduction_341 (happy_x_5 `HappyStk`- happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest)- = case happyOutTok happy_x_1 of { (TokSymbol SymOpenPragma happy_var_1) -> - case happyOutTok happy_x_3 of { (TokString happy_var_3) -> - case happyOut28 happy_x_4 of { happy_var_4 -> - case happyOutTok happy_x_5 of { (TokSymbol SymClosePragma happy_var_5) -> - happyIn112- (BuiltinPragma (fuseRange happy_var_1 happy_var_5) (snd happy_var_3) (Ident happy_var_4)- ) `HappyStk` happyRest}}}}--happyReduce_342 = happyReduce 5# 107# happyReduction_342-happyReduction_342 (happy_x_5 `HappyStk`- happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest)- = case happyOutTok happy_x_1 of { (TokSymbol SymOpenPragma happy_var_1) -> - case happyOut28 happy_x_3 of { happy_var_3 -> - case happyOut27 happy_x_4 of { happy_var_4 -> - case happyOutTok happy_x_5 of { (TokSymbol SymClosePragma happy_var_5) -> - happyIn113- (CompiledPragma (fuseRange happy_var_1 happy_var_5) happy_var_3 (unwords happy_var_4)- ) `HappyStk` happyRest}}}}--happyReduce_343 = happyReduce 5# 108# happyReduction_343-happyReduction_343 (happy_x_5 `HappyStk`- happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest)- = case happyOutTok happy_x_1 of { (TokSymbol SymOpenPragma happy_var_1) -> - case happyOut28 happy_x_3 of { happy_var_3 -> - case happyOut27 happy_x_4 of { happy_var_4 -> - case happyOutTok happy_x_5 of { (TokSymbol SymClosePragma happy_var_5) -> - happyIn114- (CompiledTypePragma (fuseRange happy_var_1 happy_var_5) happy_var_3 (unwords happy_var_4)- ) `HappyStk` happyRest}}}}--happyReduce_344 = happyReduce 6# 109# happyReduction_344-happyReduction_344 (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 happyOutTok happy_x_1 of { (TokSymbol SymOpenPragma happy_var_1) -> - case happyOut28 happy_x_3 of { happy_var_3 -> - case happyOutTok happy_x_4 of { (TokString happy_var_4) -> - case happyOut27 happy_x_5 of { happy_var_5 -> - case happyOutTok happy_x_6 of { (TokSymbol SymClosePragma happy_var_6) -> - happyIn115- (CompiledDataPragma (fuseRange happy_var_1 happy_var_6) happy_var_3 (snd happy_var_4) happy_var_5- ) `HappyStk` happyRest}}}}}--happyReduce_345 = happyReduce 5# 110# happyReduction_345-happyReduction_345 (happy_x_5 `HappyStk`- happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest)- = case happyOutTok happy_x_1 of { (TokSymbol SymOpenPragma happy_var_1) -> - case happyOut28 happy_x_3 of { happy_var_3 -> - case happyOut27 happy_x_4 of { happy_var_4 -> - case happyOutTok happy_x_5 of { (TokSymbol SymClosePragma happy_var_5) -> - happyIn116- (CompiledEpicPragma (fuseRange happy_var_1 happy_var_5) happy_var_3 (unwords happy_var_4)- ) `HappyStk` happyRest}}}}--happyReduce_346 = happyReduce 5# 111# happyReduction_346-happyReduction_346 (happy_x_5 `HappyStk`- happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest)- = case happyOutTok happy_x_1 of { (TokSymbol SymOpenPragma happy_var_1) -> - case happyOut28 happy_x_3 of { happy_var_3 -> - case happyOut27 happy_x_4 of { happy_var_4 -> - case happyOutTok happy_x_5 of { (TokSymbol SymClosePragma happy_var_5) -> - happyIn117- (CompiledJSPragma (fuseRange happy_var_1 happy_var_5) happy_var_3 (unwords happy_var_4)- ) `HappyStk` happyRest}}}}--happyReduce_347 = happyReduce 4# 112# happyReduction_347-happyReduction_347 (happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest)- = case happyOutTok happy_x_1 of { (TokSymbol SymOpenPragma happy_var_1) -> - case happyOut28 happy_x_3 of { happy_var_3 -> - case happyOutTok happy_x_4 of { (TokSymbol SymClosePragma happy_var_4) -> - happyIn118- (StaticPragma (fuseRange happy_var_1 happy_var_4) happy_var_3- ) `HappyStk` happyRest}}}--happyReduce_348 = happyReduce 4# 113# happyReduction_348-happyReduction_348 (happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest)- = case happyOutTok happy_x_1 of { (TokSymbol SymOpenPragma happy_var_1) -> - case happyOut28 happy_x_3 of { happy_var_3 -> - case happyOutTok happy_x_4 of { (TokSymbol SymClosePragma happy_var_4) -> - happyIn119- (EtaPragma (fuseRange happy_var_1 happy_var_4) happy_var_3- ) `HappyStk` happyRest}}}--happyReduce_349 = happyMonadReduce 4# 114# happyReduction_349-happyReduction_349 (happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { (TokSymbol SymOpenPragma happy_var_1) -> - case happyOutTok happy_x_3 of { (TokString happy_var_3) -> - case happyOutTok happy_x_4 of { (TokSymbol SymClosePragma happy_var_4) -> - ( let s = snd happy_var_3 in- if validHaskellModuleName s- then return $ ImportPragma (fuseRange happy_var_1 happy_var_4) s- else parseError $ "Malformed module name: " ++ s ++ ".")}}}- ) (\r -> happyReturn (happyIn120 r))--happyReduce_350 = happySpecReduce_3 115# happyReduction_350-happyReduction_350 happy_x_3- happy_x_2- happy_x_1- = case happyOutTok happy_x_1 of { (TokSymbol SymOpenPragma happy_var_1) -> - case happyOutTok happy_x_3 of { (TokSymbol SymClosePragma happy_var_3) -> - happyIn121- (ImpossiblePragma (fuseRange happy_var_1 happy_var_3)- )}}--happyReduce_351 = happySpecReduce_3 116# happyReduction_351-happyReduction_351 happy_x_3- happy_x_2- happy_x_1- = case happyOut123 happy_x_2 of { happy_var_2 -> - happyIn122- (reverse happy_var_2- )}--happyReduce_352 = happySpecReduce_3 117# happyReduction_352-happyReduction_352 happy_x_3- happy_x_2- happy_x_1- = case happyOut123 happy_x_1 of { happy_var_1 -> - case happyOut77 happy_x_3 of { happy_var_3 -> - happyIn123- (reverse happy_var_3 ++ happy_var_1- )}}--happyReduce_353 = happySpecReduce_1 117# happyReduction_353-happyReduction_353 happy_x_1- = case happyOut77 happy_x_1 of { happy_var_1 -> - happyIn123- (reverse happy_var_1- )}--happyReduce_354 = happySpecReduce_3 118# happyReduction_354-happyReduction_354 happy_x_3- happy_x_2- happy_x_1- = case happyOut125 happy_x_2 of { happy_var_2 -> - happyIn124- (reverse happy_var_2- )}--happyReduce_355 = happySpecReduce_3 119# happyReduction_355-happyReduction_355 happy_x_3- happy_x_2- happy_x_1- = case happyOut125 happy_x_1 of { happy_var_1 -> - case happyOut79 happy_x_3 of { happy_var_3 -> - happyIn125- (reverse happy_var_3 ++ happy_var_1- )}}--happyReduce_356 = happySpecReduce_1 119# happyReduction_356-happyReduction_356 happy_x_1- = case happyOut79 happy_x_1 of { happy_var_1 -> - happyIn125- (reverse happy_var_1- )}--happyReduce_357 = happySpecReduce_3 120# happyReduction_357-happyReduction_357 happy_x_3- happy_x_2- happy_x_1- = case happyOut127 happy_x_2 of { happy_var_2 -> - happyIn126- (reverse happy_var_2- )}--happyReduce_358 = happySpecReduce_3 121# happyReduction_358-happyReduction_358 happy_x_3- happy_x_2- happy_x_1- = case happyOut127 happy_x_1 of { happy_var_1 -> - case happyOut80 happy_x_3 of { happy_var_3 -> - happyIn127- (reverse happy_var_3 ++ happy_var_1- )}}--happyReduce_359 = happySpecReduce_1 121# happyReduction_359-happyReduction_359 happy_x_1- = case happyOut80 happy_x_1 of { happy_var_1 -> - happyIn127- (reverse happy_var_1- )}--happyReduce_360 = happySpecReduce_2 122# happyReduction_360-happyReduction_360 happy_x_2- happy_x_1- = happyIn128- ([]- )--happyReduce_361 = happySpecReduce_1 122# happyReduction_361-happyReduction_361 happy_x_1- = case happyOut122 happy_x_1 of { happy_var_1 -> - happyIn128- (happy_var_1- )}--happyReduce_362 = happySpecReduce_2 123# happyReduction_362-happyReduction_362 happy_x_2- happy_x_1- = happyIn129- ((Nothing, [])- )--happyReduce_363 = happySpecReduce_3 123# happyReduction_363-happyReduction_363 happy_x_3- happy_x_2- happy_x_1- = case happyOut87 happy_x_2 of { happy_var_2 -> - happyIn129- ((Just happy_var_2, [])- )}--happyReduce_364 = happyReduce 5# 123# happyReduction_364-happyReduction_364 (happy_x_5 `HappyStk`- happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest)- = case happyOut87 happy_x_2 of { happy_var_2 -> - case happyOut132 happy_x_4 of { happy_var_4 -> - happyIn129- ((Just happy_var_2, reverse happy_var_4)- ) `HappyStk` happyRest}}--happyReduce_365 = happySpecReduce_3 123# happyReduction_365-happyReduction_365 happy_x_3- happy_x_2- happy_x_1- = case happyOut132 happy_x_2 of { happy_var_2 -> - happyIn129- ((Nothing, reverse happy_var_2)- )}--happyReduce_366 = happySpecReduce_3 124# happyReduction_366-happyReduction_366 happy_x_3- happy_x_2- happy_x_1- = case happyOut132 happy_x_2 of { happy_var_2 -> - happyIn130- (reverse happy_var_2- )}--happyReduce_367 = happySpecReduce_2 125# happyReduction_367-happyReduction_367 happy_x_2- happy_x_1- = happyIn131- ([]- )--happyReduce_368 = happySpecReduce_1 125# happyReduction_368-happyReduction_368 happy_x_1- = case happyOut130 happy_x_1 of { happy_var_1 -> - happyIn131- (happy_var_1- )}--happyReduce_369 = happySpecReduce_3 126# happyReduction_369-happyReduction_369 happy_x_3- happy_x_2- happy_x_1- = case happyOut132 happy_x_1 of { happy_var_1 -> - case happyOut76 happy_x_3 of { happy_var_3 -> - happyIn132- (reverse happy_var_3 ++ happy_var_1- )}}--happyReduce_370 = happySpecReduce_1 126# happyReduction_370-happyReduction_370 happy_x_1- = case happyOut76 happy_x_1 of { happy_var_1 -> - happyIn132- (reverse happy_var_1- )}--happyNewToken action sts stk- = lexer(\tk -> - let cont i = happyDoAction i tk action sts stk in- case tk of {- TokEOF -> happyDoAction 76# tk action sts stk;- TokKeyword KwLet happy_dollar_dollar -> cont 1#;- TokKeyword KwIn happy_dollar_dollar -> cont 2#;- TokKeyword KwWhere happy_dollar_dollar -> cont 3#;- TokKeyword KwWith happy_dollar_dollar -> cont 4#;- TokKeyword KwRewrite happy_dollar_dollar -> cont 5#;- TokKeyword KwPostulate happy_dollar_dollar -> cont 6#;- TokKeyword KwPrimitive happy_dollar_dollar -> cont 7#;- TokKeyword KwOpen happy_dollar_dollar -> cont 8#;- TokKeyword KwImport happy_dollar_dollar -> cont 9#;- TokKeyword KwUsing happy_dollar_dollar -> cont 10#;- TokKeyword KwHiding happy_dollar_dollar -> cont 11#;- TokKeyword KwRenaming happy_dollar_dollar -> cont 12#;- TokKeyword KwTo happy_dollar_dollar -> cont 13#;- TokKeyword KwPublic happy_dollar_dollar -> cont 14#;- TokKeyword KwModule happy_dollar_dollar -> cont 15#;- TokKeyword KwData happy_dollar_dollar -> cont 16#;- TokKeyword KwCoData happy_dollar_dollar -> cont 17#;- TokKeyword KwRecord happy_dollar_dollar -> cont 18#;- TokKeyword KwConstructor happy_dollar_dollar -> cont 19#;- TokKeyword KwField happy_dollar_dollar -> cont 20#;- TokKeyword KwInfix happy_dollar_dollar -> cont 21#;- TokKeyword KwInfixL happy_dollar_dollar -> cont 22#;- TokKeyword KwInfixR happy_dollar_dollar -> cont 23#;- TokKeyword KwMutual happy_dollar_dollar -> cont 24#;- TokKeyword KwAbstract happy_dollar_dollar -> cont 25#;- TokKeyword KwPrivate happy_dollar_dollar -> cont 26#;- TokKeyword KwProp happy_dollar_dollar -> cont 27#;- TokKeyword KwSet happy_dollar_dollar -> cont 28#;- TokKeyword KwForall happy_dollar_dollar -> cont 29#;- TokKeyword KwSyntax happy_dollar_dollar -> cont 30#;- TokKeyword KwOPTIONS happy_dollar_dollar -> cont 31#;- TokKeyword KwBUILTIN happy_dollar_dollar -> cont 32#;- TokKeyword KwIMPORT happy_dollar_dollar -> cont 33#;- TokKeyword KwIMPOSSIBLE happy_dollar_dollar -> cont 34#;- TokKeyword KwETA happy_dollar_dollar -> cont 35#;- TokKeyword KwCOMPILED happy_dollar_dollar -> cont 36#;- TokKeyword KwCOMPILED_DATA happy_dollar_dollar -> cont 37#;- TokKeyword KwCOMPILED_TYPE happy_dollar_dollar -> cont 38#;- TokKeyword KwCOMPILED_EPIC happy_dollar_dollar -> cont 39#;- TokKeyword KwCOMPILED_JS happy_dollar_dollar -> cont 40#;- TokKeyword KwSTATIC happy_dollar_dollar -> cont 41#;- TokKeyword KwQuoteGoal happy_dollar_dollar -> cont 42#;- TokKeyword KwQuote happy_dollar_dollar -> cont 43#;- TokKeyword KwQuoteTerm happy_dollar_dollar -> cont 44#;- TokKeyword KwUnquote happy_dollar_dollar -> cont 45#;- TokSetN happy_dollar_dollar -> cont 46#;- TokTeX happy_dollar_dollar -> cont 47#;- TokComment happy_dollar_dollar -> cont 48#;- TokSymbol SymEllipsis happy_dollar_dollar -> cont 49#;- TokSymbol SymDotDot happy_dollar_dollar -> cont 50#;- TokSymbol SymDot happy_dollar_dollar -> cont 51#;- TokSymbol SymSemi happy_dollar_dollar -> cont 52#;- TokSymbol SymColon happy_dollar_dollar -> cont 53#;- TokSymbol SymEqual happy_dollar_dollar -> cont 54#;- TokSymbol SymUnderscore happy_dollar_dollar -> cont 55#;- TokSymbol SymQuestionMark happy_dollar_dollar -> cont 56#;- TokSymbol SymArrow happy_dollar_dollar -> cont 57#;- TokSymbol SymLambda happy_dollar_dollar -> cont 58#;- TokSymbol SymAs happy_dollar_dollar -> cont 59#;- TokSymbol SymBar happy_dollar_dollar -> cont 60#;- TokSymbol SymOpenParen happy_dollar_dollar -> cont 61#;- TokSymbol SymCloseParen happy_dollar_dollar -> cont 62#;- TokSymbol SymDoubleOpenBrace happy_dollar_dollar -> cont 63#;- TokSymbol SymDoubleCloseBrace happy_dollar_dollar -> cont 64#;- TokSymbol SymOpenBrace happy_dollar_dollar -> cont 65#;- TokSymbol SymCloseBrace happy_dollar_dollar -> cont 66#;- TokSymbol SymOpenVirtualBrace happy_dollar_dollar -> cont 67#;- TokSymbol SymCloseVirtualBrace happy_dollar_dollar -> cont 68#;- TokSymbol SymVirtualSemi happy_dollar_dollar -> cont 69#;- TokSymbol SymOpenPragma happy_dollar_dollar -> cont 70#;- TokSymbol SymClosePragma happy_dollar_dollar -> cont 71#;- TokId happy_dollar_dollar -> cont 72#;- TokQId happy_dollar_dollar -> cont 73#;- TokString happy_dollar_dollar -> cont 74#;- TokLiteral happy_dollar_dollar -> cont 75#;- _ -> happyError' tk- })--happyError_ 76# tk = happyError' tk-happyError_ _ tk = happyError' tk--happyThen :: () => Parser a -> (a -> Parser b) -> Parser b-happyThen = (>>=)-happyReturn :: () => a -> Parser a-happyReturn = (return)-happyThen1 = happyThen-happyReturn1 :: () => a -> Parser a-happyReturn1 = happyReturn-happyError' :: () => (Token) -> Parser a-happyError' tk = (\token -> happyError) tk--tokensParser = happySomeParser where- happySomeParser = happyThen (happyParse 0#) (\x -> happyReturn (happyOut6 x))--exprParser = happySomeParser where- happySomeParser = happyThen (happyParse 1#) (\x -> happyReturn (happyOut29 x))--moduleParser = happySomeParser where- happySomeParser = happyThen (happyParse 2#) (\x -> happyReturn (happyOut9 x))--happySeq = happyDontSeq---{--------------------------------------------------------------------------- Parsers- --------------------------------------------------------------------------}---- | Parse the token stream. Used by the TeX compiler.-tokensParser :: Parser [Token]---- | Parse an expression. Could be used in interactions.-exprParser :: Parser Expr---- | Parse a module.-moduleParser :: Parser Module---{--------------------------------------------------------------------------- Happy stuff- --------------------------------------------------------------------------}---- | Required by Happy.-happyError :: Parser a-happyError = parseError "Parse error"---{--------------------------------------------------------------------------- Utility functions- --------------------------------------------------------------------------}---- | Create a name from a string.--mkName :: (Interval, String) -> Parser Name-mkName (i, s) = do- let xs = parts s- mapM_ isValidId xs- unless (alternating xs) $ fail $ "a name cannot contain two consecutive underscores"- return $ Name (getRange i) xs- where- parts :: String -> [NamePart]- parts "" = []- parts ('_' : s) = Hole : parts s- parts s = Id x : parts s'- where (x, s') = break (== '_') s-- isValidId Hole = return ()- isValidId (Id x) = case parse defaultParseFlags [0] (lexer return) x of- ParseOk _ (TokId _) -> return ()- _ -> fail $ "in the name " ++ s ++ ", the part " ++ x ++ " is not valid"-- -- we know that there are no two Ids in a row- alternating (Hole : Hole : _) = False- alternating (_ : xs) = alternating xs- alternating [] = True---- | Create a qualified name from a list of strings-mkQName :: [(Interval, String)] -> Parser QName-mkQName ss = do- xs <- mapM mkName ss- return $ foldr Qual (QName $ last xs) (init xs)---- | Match a particular name.-isName :: String -> (Interval, String) -> Parser ()-isName s (_,s')- | s == s' = return ()- | otherwise = fail $ "expected " ++ s ++ ", found " ++ s'---- | Build a forall pi (forall x y z -> ...)-forallPi :: [LamBinding] -> Expr -> Expr-forallPi bs e = Pi (map addType bs) e---- | Converts lambda bindings to typed bindings.-addType :: LamBinding -> TypedBindings-addType (DomainFull b) = b-addType (DomainFree h rel x) = TypedBindings r $ Arg h rel $ TBind r [x] $ Underscore r Nothing- where r = getRange x---- | Check that an import directive doesn't contain repeated names-verifyImportDirective :: ImportDirective -> Parser ImportDirective-verifyImportDirective i =- case filter ((>1) . length)- $ group- $ sort xs- of- [] -> return i- yss -> let Just pos = rStart $ getRange $ head $ concat yss in- parseErrorAt pos $- "repeated name" ++ s ++ " in import directive: " ++- concat (intersperse ", " $ map (show . head) yss)- where- s = case yss of- [_] -> ""- _ -> "s"- where- xs = names (usingOrHiding i) ++ map renFrom (renaming i)- names (Using xs) = xs- names (Hiding xs) = xs---- | Breaks up a string into substrings. Returns every maximal--- subsequence of zero or more characters distinct from @'.'@.------ > splitOnDots "" == [""]--- > splitOnDots "foo.bar" == ["foo", "bar"]--- > splitOnDots ".foo.bar" == ["", "foo", "bar"]--- > splitOnDots "foo.bar." == ["foo", "bar", ""]--- > splitOnDots "foo..bar" == ["foo", "", "bar"]-splitOnDots :: String -> [String]-splitOnDots "" = [""]-splitOnDots ('.' : s) = [] : splitOnDots s-splitOnDots (c : s) = case splitOnDots s of- p : ps -> (c : p) : ps--prop_splitOnDots = and- [ splitOnDots "" == [""]- , splitOnDots "foo.bar" == ["foo", "bar"]- , splitOnDots ".foo.bar" == ["", "foo", "bar"]- , splitOnDots "foo.bar." == ["foo", "bar", ""]- , splitOnDots "foo..bar" == ["foo", "", "bar"]- ]---- | Returns 'True' iff the name is a valid Haskell (hierarchical)--- module name.-validHaskellModuleName :: String -> Bool-validHaskellModuleName = all ok . splitOnDots- where- -- Checks if a dot-less module name is well-formed.- ok :: String -> Bool- ok [] = False- ok (c : s) =- isUpper c &&- all (\c -> isLower c || c == '_' ||- isUpper c ||- generalCategory c == DecimalNumber ||- c == '\'')- s--{--------------------------------------------------------------------------- Patterns- --------------------------------------------------------------------------}---- | Turn an expression into a left hand side.-exprToLHS :: Expr -> Parser ([Expr] -> [Expr] -> LHS)-exprToLHS e = case e of- WithApp r e es -> LHS <$> exprToPattern e <*> mapM exprToPattern es- _ -> LHS <$> exprToPattern e <*> return []---- | Turn an expression into a pattern. Fails if the expression is not a--- valid pattern.-exprToPattern :: Expr -> Parser Pattern-exprToPattern e =- case e of- Ident x -> return $ IdentP x- App _ e1 e2 -> AppP <$> exprToPattern e1- <*> T.mapM (T.mapM exprToPattern) e2- Paren r e -> ParenP r- <$> exprToPattern e- Underscore r _ -> return $ WildP r- Absurd r -> return $ AbsurdP r- As r x e -> AsP r x <$> exprToPattern e- Dot r (HiddenArg _ e) -> return $ HiddenP r $ fmap (DotP r) e- Dot r e -> return $ DotP r e- Lit l -> return $ LitP l- HiddenArg r e -> HiddenP r <$> T.mapM exprToPattern e- InstanceArg r e -> InstanceP r <$> T.mapM exprToPattern e- RawApp r es -> RawAppP r <$> mapM exprToPattern es- OpApp r x es -> OpAppP r x <$> mapM opAppExprToPattern es- _ ->- let Just pos = rStart $ getRange e in- parseErrorAt pos $ "Not a valid pattern: " ++ show e--opAppExprToPattern :: OpApp Expr -> Parser Pattern-opAppExprToPattern (SyntaxBindingLambda _ _ _) = parseError "syntax binding lambda cannot appear in a pattern"-opAppExprToPattern (Ordinary e) = exprToPattern e--parsePanic s = parseError $ "Internal parser error: " ++ s ++ ". Please report this as a bug."--{--------------------------------------------------------------------------- Tests- --------------------------------------------------------------------------}---- | Test suite.-tests :: IO Bool-tests = runTests "Agda.Syntax.Parser.Parser"- [ quickCheck' prop_splitOnDots- ]-{-# LINE 1 "templates/GenericTemplate.hs" #-}-{-# LINE 1 "templates/GenericTemplate.hs" #-}-{-# LINE 1 "<built-in>" #-}-{-# LINE 1 "<command-line>" #-}+{-# LANGUAGE BangPatterns, PatternGuards #-}+{-| The parser is generated by Happy (<http://www.haskell.org/happy>).+ -+ - Ideally, ranges should be as precise as possible, to get messages that+ - emphasize precisely the faulting term(s) upon error.+ -+ - However, interactive highlighting is only applied at the end of each+ - mutual block, keywords are only highlighted once (see+ - `TypeChecking.Rules.Decl'). So if the ranges of two declarations+ - interleave, one must ensure that keyword ranges are not included in+ - the intersection. (Otherwise they are uncolored by the interactive+ - highlighting.)+ -+ -}+module Agda.Syntax.Parser.Parser (+ moduleParser+ , exprParser+ , tokensParser+ , tests+ ) where++import Control.Arrow+import Control.Monad+import Control.Monad.State+import Data.Char+import Data.List+import Data.Maybe+import qualified Data.Traversable as T++import Agda.Syntax.Position hiding (tests)+import Agda.Syntax.Parser.Monad+import Agda.Syntax.Parser.Lexer+import Agda.Syntax.Parser.Tokens+import Agda.Syntax.Concrete+import Agda.Syntax.Concrete.Name+import Agda.Syntax.Concrete.Pretty+import Agda.Syntax.Common+import Agda.Syntax.Fixity+import Agda.Syntax.Notation+import Agda.Syntax.Literal++import Agda.Utils.Hash+import Agda.Utils.Monad+import Agda.Utils.QuickCheck+import Agda.Utils.TestHelpers+import Agda.Utils.Tuple+import qualified Data.Array as Happy_Data_Array+import qualified GHC.Exts as Happy_GHC_Exts++-- parser produced by Happy Version 1.18.8++newtype HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70 = HappyAbsSyn HappyAny+#if __GLASGOW_HASKELL__ >= 607+type HappyAny = Happy_GHC_Exts.Any+#else+type HappyAny = forall a . a+#endif+happyIn6 :: ([Token]) -> (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70)+happyIn6 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn6 #-}+happyOut6 :: (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70) -> ([Token])+happyOut6 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut6 #-}+happyIn7 :: ([Token]) -> (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70)+happyIn7 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn7 #-}+happyOut7 :: (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70) -> ([Token])+happyOut7 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut7 #-}+happyIn8 :: (Token) -> (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70)+happyIn8 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn8 #-}+happyOut8 :: (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70) -> (Token)+happyOut8 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut8 #-}+happyIn9 :: (([Pragma], [Declaration])) -> (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70)+happyIn9 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn9 #-}+happyOut9 :: (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70) -> (([Pragma], [Declaration]))+happyOut9 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut9 #-}+happyIn10 :: t10 -> (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70)+happyIn10 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn10 #-}+happyOut10 :: (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70) -> t10+happyOut10 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut10 #-}+happyIn11 :: t11 -> (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70)+happyIn11 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn11 #-}+happyOut11 :: (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70) -> t11+happyOut11 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut11 #-}+happyIn12 :: t12 -> (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70)+happyIn12 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn12 #-}+happyOut12 :: (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70) -> t12+happyOut12 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut12 #-}+happyIn13 :: (()) -> (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70)+happyIn13 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn13 #-}+happyOut13 :: (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70) -> (())+happyOut13 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut13 #-}+happyIn14 :: (Integer) -> (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70)+happyIn14 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn14 #-}+happyOut14 :: (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70) -> (Integer)+happyOut14 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut14 #-}+happyIn15 :: (Name) -> (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70)+happyIn15 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn15 #-}+happyOut15 :: (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70) -> (Name)+happyOut15 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut15 #-}+happyIn16 :: ([Name]) -> (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70)+happyIn16 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn16 #-}+happyOut16 :: (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70) -> ([Name])+happyOut16 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut16 #-}+happyIn17 :: (Range) -> (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70)+happyIn17 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn17 #-}+happyOut17 :: (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70) -> (Range)+happyOut17 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut17 #-}+happyIn18 :: (Arg Name) -> (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70)+happyIn18 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn18 #-}+happyOut18 :: (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70) -> (Arg Name)+happyOut18 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut18 #-}+happyIn19 :: ([Arg Name]) -> (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70)+happyIn19 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn19 #-}+happyOut19 :: (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70) -> ([Arg Name])+happyOut19 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut19 #-}+happyIn20 :: ([Arg Name]) -> (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70)+happyIn20 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn20 #-}+happyOut20 :: (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70) -> ([Arg Name])+happyOut20 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut20 #-}+happyIn21 :: (QName) -> (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70)+happyIn21 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn21 #-}+happyOut21 :: (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70) -> (QName)+happyOut21 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut21 #-}+happyIn22 :: (QName) -> (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70)+happyIn22 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn22 #-}+happyOut22 :: (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70) -> (QName)+happyOut22 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut22 #-}+happyIn23 :: (Name) -> (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70)+happyIn23 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn23 #-}+happyOut23 :: (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70) -> (Name)+happyOut23 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut23 #-}+happyIn24 :: ([Name]) -> (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70)+happyIn24 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn24 #-}+happyOut24 :: (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70) -> ([Name])+happyOut24 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut24 #-}+happyIn25 :: ([Name]) -> (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70)+happyIn25 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn25 #-}+happyOut25 :: (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70) -> ([Name])+happyOut25 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut25 #-}+happyIn26 :: (Either [Name] [Expr]) -> (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70)+happyIn26 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn26 #-}+happyOut26 :: (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70) -> (Either [Name] [Expr])+happyOut26 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut26 #-}+happyIn27 :: ([String]) -> (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70)+happyIn27 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn27 #-}+happyOut27 :: (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70) -> ([String])+happyOut27 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut27 #-}+happyIn28 :: (QName) -> (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70)+happyIn28 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn28 #-}+happyOut28 :: (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70) -> (QName)+happyOut28 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut28 #-}+happyIn29 :: (Expr) -> (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70)+happyIn29 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn29 #-}+happyOut29 :: (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70) -> (Expr)+happyOut29 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut29 #-}+happyIn30 :: t30 -> (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70)+happyIn30 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn30 #-}+happyOut30 :: (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70) -> t30+happyOut30 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut30 #-}+happyIn31 :: ([Expr]) -> (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70)+happyIn31 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn31 #-}+happyOut31 :: (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70) -> ([Expr])+happyOut31 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut31 #-}+happyIn32 :: ([Expr]) -> (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70)+happyIn32 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn32 #-}+happyOut32 :: (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70) -> ([Expr])+happyOut32 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut32 #-}+happyIn33 :: t33 -> (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70)+happyIn33 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn33 #-}+happyOut33 :: (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70) -> t33+happyOut33 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut33 #-}+happyIn34 :: (Expr) -> (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70)+happyIn34 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn34 #-}+happyOut34 :: (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70) -> (Expr)+happyOut34 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut34 #-}+happyIn35 :: ([Expr]) -> (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70)+happyIn35 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn35 #-}+happyOut35 :: (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70) -> ([Expr])+happyOut35 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut35 #-}+happyIn36 :: t36 -> (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70)+happyIn36 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn36 #-}+happyOut36 :: (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70) -> t36+happyOut36 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut36 #-}+happyIn37 :: t37 -> (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70)+happyIn37 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn37 #-}+happyOut37 :: (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70) -> t37+happyOut37 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut37 #-}+happyIn38 :: t38 -> (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70)+happyIn38 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn38 #-}+happyOut38 :: (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70) -> t38+happyOut38 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut38 #-}+happyIn39 :: ([(Name, Expr)]) -> (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70)+happyIn39 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn39 #-}+happyOut39 :: (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70) -> ([(Name, Expr)])+happyOut39 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut39 #-}+happyIn40 :: ([(Name, Expr)]) -> (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70)+happyIn40 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn40 #-}+happyOut40 :: (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70) -> ([(Name, Expr)])+happyOut40 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut40 #-}+happyIn41 :: ((Name, Expr)) -> (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70)+happyIn41 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn41 #-}+happyOut41 :: (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70) -> ((Name, Expr))+happyOut41 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut41 #-}+happyIn42 :: t42 -> (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70)+happyIn42 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn42 #-}+happyOut42 :: (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70) -> t42+happyOut42 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut42 #-}+happyIn43 :: t43 -> (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70)+happyIn43 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn43 #-}+happyOut43 :: (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70) -> t43+happyOut43 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut43 #-}+happyIn44 :: ([TypedBindings]) -> (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70)+happyIn44 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn44 #-}+happyOut44 :: (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70) -> ([TypedBindings])+happyOut44 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut44 #-}+happyIn45 :: (TypedBindings) -> (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70)+happyIn45 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn45 #-}+happyOut45 :: (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70) -> (TypedBindings)+happyOut45 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut45 #-}+happyIn46 :: (TypedBinding) -> (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70)+happyIn46 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn46 #-}+happyOut46 :: (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70) -> (TypedBinding)+happyOut46 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut46 #-}+happyIn47 :: ([LamBinding]) -> (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70)+happyIn47 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn47 #-}+happyOut47 :: (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70) -> ([LamBinding])+happyOut47 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut47 #-}+happyIn48 :: (Either ([LamBinding], Hiding) [Expr]) -> (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70)+happyIn48 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn48 #-}+happyOut48 :: (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70) -> (Either ([LamBinding], Hiding) [Expr])+happyOut48 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut48 #-}+happyIn49 :: ([Either Hiding LamBinding]) -> (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70)+happyIn49 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn49 #-}+happyOut49 :: (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70) -> ([Either Hiding LamBinding])+happyOut49 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut49 #-}+happyIn50 :: (Either [Either Hiding LamBinding] [Expr]) -> (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70)+happyIn50 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn50 #-}+happyOut50 :: (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70) -> (Either [Either Hiding LamBinding] [Expr])+happyOut50 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut50 #-}+happyIn51 :: ((LHS,RHS,WhereClause)) -> (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70)+happyIn51 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn51 #-}+happyOut51 :: (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70) -> ((LHS,RHS,WhereClause))+happyOut51 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut51 #-}+happyIn52 :: ((LHS,RHS,WhereClause)) -> (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70)+happyIn52 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn52 #-}+happyOut52 :: (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70) -> ((LHS,RHS,WhereClause))+happyOut52 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut52 #-}+happyIn53 :: ((LHS,RHS,WhereClause)) -> (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70)+happyIn53 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn53 #-}+happyOut53 :: (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70) -> ((LHS,RHS,WhereClause))+happyOut53 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut53 #-}+happyIn54 :: ([(LHS,RHS,WhereClause)]) -> (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70)+happyIn54 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn54 #-}+happyOut54 :: (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70) -> ([(LHS,RHS,WhereClause)])+happyOut54 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut54 #-}+happyIn55 :: ([LamBinding]) -> (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70)+happyIn55 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn55 #-}+happyOut55 :: (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70) -> ([LamBinding])+happyOut55 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut55 #-}+happyIn56 :: ([LamBinding]) -> (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70)+happyIn56 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn56 #-}+happyOut56 :: (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70) -> ([LamBinding])+happyOut56 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut56 #-}+happyIn57 :: ([LamBinding]) -> (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70)+happyIn57 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn57 #-}+happyOut57 :: (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70) -> ([LamBinding])+happyOut57 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut57 #-}+happyIn58 :: ([LamBinding]) -> (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70)+happyIn58 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn58 #-}+happyOut58 :: (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70) -> ([LamBinding])+happyOut58 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut58 #-}+happyIn59 :: (Either [LamBinding] [Expr]) -> (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70)+happyIn59 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn59 #-}+happyOut59 :: (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70) -> (Either [LamBinding] [Expr])+happyOut59 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut59 #-}+happyIn60 :: (ImportDirective) -> (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70)+happyIn60 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn60 #-}+happyOut60 :: (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70) -> (ImportDirective)+happyOut60 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut60 #-}+happyIn61 :: (ImportDirective) -> (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70)+happyIn61 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn61 #-}+happyOut61 :: (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70) -> (ImportDirective)+happyOut61 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut61 #-}+happyIn62 :: (ImportDirective) -> (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70)+happyIn62 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn62 #-}+happyOut62 :: (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70) -> (ImportDirective)+happyOut62 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut62 #-}+happyIn63 :: ((UsingOrHiding , Range)) -> (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70)+happyIn63 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn63 #-}+happyOut63 :: (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70) -> ((UsingOrHiding , Range))+happyOut63 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut63 #-}+happyIn64 :: (([Renaming] , Range)) -> (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70)+happyIn64 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn64 #-}+happyOut64 :: (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70) -> (([Renaming] , Range))+happyOut64 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut64 #-}+happyIn65 :: ([Renaming]) -> (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70)+happyIn65 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn65 #-}+happyOut65 :: (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70) -> ([Renaming])+happyOut65 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut65 #-}+happyIn66 :: (Renaming) -> (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70)+happyIn66 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn66 #-}+happyOut66 :: (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70) -> (Renaming)+happyOut66 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut66 #-}+happyIn67 :: (ImportedName) -> (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70)+happyIn67 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn67 #-}+happyOut67 :: (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70) -> (ImportedName)+happyOut67 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut67 #-}+happyIn68 :: (ImportedName) -> (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70)+happyIn68 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn68 #-}+happyOut68 :: (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70) -> (ImportedName)+happyOut68 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut68 #-}+happyIn69 :: ([ImportedName]) -> (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70)+happyIn69 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn69 #-}+happyOut69 :: (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70) -> ([ImportedName])+happyOut69 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut69 #-}+happyIn70 :: t70 -> (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70)+happyIn70 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn70 #-}+happyOut70 :: (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70) -> t70+happyOut70 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut70 #-}+happyIn71 :: (LHS) -> (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70)+happyIn71 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn71 #-}+happyOut71 :: (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70) -> (LHS)+happyOut71 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut71 #-}+happyIn72 :: ([Pattern]) -> (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70)+happyIn72 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn72 #-}+happyOut72 :: (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70) -> ([Pattern])+happyOut72 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut72 #-}+happyIn73 :: ([Expr]) -> (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70)+happyIn73 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn73 #-}+happyOut73 :: (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70) -> ([Expr])+happyOut73 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut73 #-}+happyIn74 :: ([Expr]) -> (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70)+happyIn74 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn74 #-}+happyOut74 :: (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70) -> ([Expr])+happyOut74 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut74 #-}+happyIn75 :: (WhereClause) -> (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70)+happyIn75 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn75 #-}+happyOut75 :: (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70) -> (WhereClause)+happyOut75 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut75 #-}+happyIn76 :: ([Declaration]) -> (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70)+happyIn76 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn76 #-}+happyOut76 :: (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70) -> ([Declaration])+happyOut76 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut76 #-}+happyIn77 :: ([Declaration]) -> (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70)+happyIn77 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn77 #-}+happyOut77 :: (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70) -> ([Declaration])+happyOut77 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut77 #-}+happyIn78 :: ([Declaration]) -> (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70)+happyIn78 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn78 #-}+happyOut78 :: (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70) -> ([Declaration])+happyOut78 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut78 #-}+happyIn79 :: ([Arg Declaration]) -> (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70)+happyIn79 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn79 #-}+happyOut79 :: (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70) -> ([Arg Declaration])+happyOut79 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut79 #-}+happyIn80 :: ([Declaration]) -> (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70)+happyIn80 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn80 #-}+happyOut80 :: (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70) -> ([Declaration])+happyOut80 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut80 #-}+happyIn81 :: (RHSOrTypeSigs) -> (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70)+happyIn81 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn81 #-}+happyOut81 :: (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70) -> (RHSOrTypeSigs)+happyOut81 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut81 #-}+happyIn82 :: (Declaration) -> (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70)+happyIn82 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn82 #-}+happyOut82 :: (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70) -> (Declaration)+happyOut82 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut82 #-}+happyIn83 :: (Declaration) -> (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70)+happyIn83 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn83 #-}+happyOut83 :: (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70) -> (Declaration)+happyOut83 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut83 #-}+happyIn84 :: (Declaration) -> (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70)+happyIn84 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn84 #-}+happyOut84 :: (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70) -> (Declaration)+happyOut84 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut84 #-}+happyIn85 :: (Declaration) -> (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70)+happyIn85 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn85 #-}+happyOut85 :: (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70) -> (Declaration)+happyOut85 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut85 #-}+happyIn86 :: (Name) -> (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70)+happyIn86 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn86 #-}+happyOut86 :: (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70) -> (Name)+happyOut86 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut86 #-}+happyIn87 :: (Declaration) -> (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70)+happyIn87 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn87 #-}+happyOut87 :: (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70) -> (Declaration)+happyOut87 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut87 #-}+happyIn88 :: ([Declaration]) -> (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70)+happyIn88 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn88 #-}+happyOut88 :: (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70) -> ([Declaration])+happyOut88 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut88 #-}+happyIn89 :: (Declaration) -> (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70)+happyIn89 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn89 #-}+happyOut89 :: (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70) -> (Declaration)+happyOut89 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut89 #-}+happyIn90 :: (Declaration) -> (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70)+happyIn90 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn90 #-}+happyOut90 :: (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70) -> (Declaration)+happyOut90 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut90 #-}+happyIn91 :: (Declaration) -> (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70)+happyIn91 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn91 #-}+happyOut91 :: (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70) -> (Declaration)+happyOut91 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut91 #-}+happyIn92 :: (Declaration) -> (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70)+happyIn92 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn92 #-}+happyOut92 :: (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70) -> (Declaration)+happyOut92 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut92 #-}+happyIn93 :: (Declaration) -> (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70)+happyIn93 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn93 #-}+happyOut93 :: (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70) -> (Declaration)+happyOut93 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut93 #-}+happyIn94 :: (Declaration) -> (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70)+happyIn94 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn94 #-}+happyOut94 :: (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70) -> (Declaration)+happyOut94 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut94 #-}+happyIn95 :: (Declaration) -> (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70)+happyIn95 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn95 #-}+happyOut95 :: (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70) -> (Declaration)+happyOut95 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut95 #-}+happyIn96 :: ([String]) -> (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70)+happyIn96 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn96 #-}+happyOut96 :: (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70) -> ([String])+happyOut96 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut96 #-}+happyIn97 :: ([HoleName]) -> (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70)+happyIn97 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn97 #-}+happyOut97 :: (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70) -> ([HoleName])+happyOut97 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut97 #-}+happyIn98 :: (HoleName) -> (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70)+happyIn98 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn98 #-}+happyOut98 :: (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70) -> (HoleName)+happyOut98 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut98 #-}+happyIn99 :: (String) -> (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70)+happyIn99 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn99 #-}+happyOut99 :: (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70) -> (String)+happyOut99 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut99 #-}+happyIn100 :: (Maybe Range) -> (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70)+happyIn100 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn100 #-}+happyOut100 :: (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70) -> (Maybe Range)+happyOut100 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut100 #-}+happyIn101 :: ([Declaration]) -> (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70)+happyIn101 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn101 #-}+happyOut101 :: (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70) -> ([Declaration])+happyOut101 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut101 #-}+happyIn102 :: ([Expr]) -> (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70)+happyIn102 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn102 #-}+happyOut102 :: (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70) -> ([Expr])+happyOut102 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut102 #-}+happyIn103 :: ([TypedBindings] -> Parser ModuleApplication) -> (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70)+happyIn103 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn103 #-}+happyOut103 :: (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70) -> ([TypedBindings] -> Parser ModuleApplication)+happyOut103 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut103 #-}+happyIn104 :: (Declaration) -> (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70)+happyIn104 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn104 #-}+happyOut104 :: (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70) -> (Declaration)+happyOut104 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut104 #-}+happyIn105 :: (Declaration) -> (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70)+happyIn105 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn105 #-}+happyOut105 :: (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70) -> (Declaration)+happyOut105 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut105 #-}+happyIn106 :: (Name) -> (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70)+happyIn106 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn106 #-}+happyOut106 :: (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70) -> (Name)+happyOut106 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut106 #-}+happyIn107 :: ([Declaration]) -> (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70)+happyIn107 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn107 #-}+happyOut107 :: (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70) -> ([Declaration])+happyOut107 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut107 #-}+happyIn108 :: (Declaration) -> (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70)+happyIn108 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn108 #-}+happyOut108 :: (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70) -> (Declaration)+happyOut108 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut108 #-}+happyIn109 :: (Declaration) -> (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70)+happyIn109 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn109 #-}+happyOut109 :: (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70) -> (Declaration)+happyOut109 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut109 #-}+happyIn110 :: (Pragma) -> (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70)+happyIn110 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn110 #-}+happyOut110 :: (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70) -> (Pragma)+happyOut110 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut110 #-}+happyIn111 :: (Pragma) -> (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70)+happyIn111 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn111 #-}+happyOut111 :: (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70) -> (Pragma)+happyOut111 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut111 #-}+happyIn112 :: (Pragma) -> (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70)+happyIn112 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn112 #-}+happyOut112 :: (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70) -> (Pragma)+happyOut112 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut112 #-}+happyIn113 :: (Pragma) -> (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70)+happyIn113 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn113 #-}+happyOut113 :: (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70) -> (Pragma)+happyOut113 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut113 #-}+happyIn114 :: (Pragma) -> (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70)+happyIn114 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn114 #-}+happyOut114 :: (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70) -> (Pragma)+happyOut114 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut114 #-}+happyIn115 :: (Pragma) -> (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70)+happyIn115 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn115 #-}+happyOut115 :: (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70) -> (Pragma)+happyOut115 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut115 #-}+happyIn116 :: (Pragma) -> (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70)+happyIn116 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn116 #-}+happyOut116 :: (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70) -> (Pragma)+happyOut116 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut116 #-}+happyIn117 :: (Pragma) -> (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70)+happyIn117 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn117 #-}+happyOut117 :: (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70) -> (Pragma)+happyOut117 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut117 #-}+happyIn118 :: (Pragma) -> (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70)+happyIn118 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn118 #-}+happyOut118 :: (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70) -> (Pragma)+happyOut118 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut118 #-}+happyIn119 :: (Pragma) -> (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70)+happyIn119 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn119 #-}+happyOut119 :: (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70) -> (Pragma)+happyOut119 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut119 #-}+happyIn120 :: (Pragma) -> (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70)+happyIn120 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn120 #-}+happyOut120 :: (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70) -> (Pragma)+happyOut120 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut120 #-}+happyIn121 :: (Pragma) -> (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70)+happyIn121 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn121 #-}+happyOut121 :: (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70) -> (Pragma)+happyOut121 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut121 #-}+happyIn122 :: (Pragma) -> (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70)+happyIn122 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn122 #-}+happyOut122 :: (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70) -> (Pragma)+happyOut122 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut122 #-}+happyIn123 :: (Pragma) -> (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70)+happyIn123 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn123 #-}+happyOut123 :: (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70) -> (Pragma)+happyOut123 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut123 #-}+happyIn124 :: ([TypeSignature]) -> (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70)+happyIn124 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn124 #-}+happyOut124 :: (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70) -> ([TypeSignature])+happyOut124 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut124 #-}+happyIn125 :: ([TypeSignature]) -> (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70)+happyIn125 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn125 #-}+happyOut125 :: (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70) -> ([TypeSignature])+happyOut125 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut125 #-}+happyIn126 :: ([TypeSignature]) -> (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70)+happyIn126 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn126 #-}+happyOut126 :: (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70) -> ([TypeSignature])+happyOut126 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut126 #-}+happyIn127 :: ([TypeSignature]) -> (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70)+happyIn127 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn127 #-}+happyOut127 :: (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70) -> ([TypeSignature])+happyOut127 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut127 #-}+happyIn128 :: ([Arg TypeSignature]) -> (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70)+happyIn128 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn128 #-}+happyOut128 :: (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70) -> ([Arg TypeSignature])+happyOut128 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut128 #-}+happyIn129 :: ([Arg TypeSignature]) -> (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70)+happyIn129 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn129 #-}+happyOut129 :: (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70) -> ([Arg TypeSignature])+happyOut129 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut129 #-}+happyIn130 :: ([Constructor]) -> (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70)+happyIn130 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn130 #-}+happyOut130 :: (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70) -> ([Constructor])+happyOut130 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut130 #-}+happyIn131 :: ((Maybe Induction, Maybe Name, [Declaration])) -> (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70)+happyIn131 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn131 #-}+happyOut131 :: (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70) -> ((Maybe Induction, Maybe Name, [Declaration]))+happyOut131 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut131 #-}+happyIn132 :: (Induction) -> (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70)+happyIn132 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn132 #-}+happyOut132 :: (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70) -> (Induction)+happyOut132 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut132 #-}+happyIn133 :: ([Declaration]) -> (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70)+happyIn133 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn133 #-}+happyOut133 :: (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70) -> ([Declaration])+happyOut133 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut133 #-}+happyIn134 :: ([Declaration]) -> (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70)+happyIn134 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn134 #-}+happyOut134 :: (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70) -> ([Declaration])+happyOut134 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut134 #-}+happyIn135 :: ([Declaration]) -> (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70)+happyIn135 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn135 #-}+happyOut135 :: (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70) -> ([Declaration])+happyOut135 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut135 #-}+happyInTok :: (Token) -> (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70)+happyInTok x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyInTok #-}+happyOutTok :: (HappyAbsSyn t10 t11 t12 t30 t33 t36 t37 t38 t42 t43 t70) -> (Token)+happyOutTok x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOutTok #-}+++happyActOffsets :: HappyAddr+happyActOffsets = HappyA# "\x00\x00\x2f\x06\x31\x00\x00\x00\xa3\x03\x44\x05\x00\x00\x81\x05\xdd\x01\x00\x00\x00\x00\x31\x00\x00\x00\x4f\x04\x4f\x04\x65\x05\x4a\x05\x00\x00\x38\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf6\xff\x00\x00\x00\x00\xfb\x05\xd9\x05\x49\x05\x00\x00\xb3\x02\x3c\x05\xcb\x07\x00\x00\x00\x00\xe7\x0d\x39\x05\x00\x00\x00\x00\x00\x00\x00\x00\x53\x03\xaa\x07\x00\x00\x00\x00\xe4\x0d\x14\x05\x19\x02\xe9\x04\x00\x00\x00\x00\x00\x00\x28\x05\xc5\x01\x48\x05\x00\x00\x36\x05\x1c\x03\x33\x05\x00\x00\xaa\x01\x00\x00\xcb\x01\xcb\x01\x00\x00\x31\x05\x32\x05\x30\x05\x00\x00\x00\x00\x00\x00\xa1\x0d\xd9\x05\x00\x00\x2f\x05\x00\x00\xd4\x0d\x9e\x0d\xeb\x02\x85\x02\x00\x00\xc9\x06\xae\x05\x9e\x06\x00\x00\x93\x07\xbe\x04\x19\x02\x93\x04\xeb\x06\xeb\x06\xeb\x06\x62\x05\xc4\x0d\x8c\x05\x22\x05\xc4\x0d\x00\x00\xeb\x06\xeb\x06\xeb\x06\x16\x05\x68\x04\x19\x02\x0c\x05\x51\x05\x33\x04\x00\x00\xf7\x02\xeb\x06\xeb\x06\x00\x00\x00\x00\x00\x00\x00\x00\x86\x02\x8c\x05\xeb\x06\x93\x07\x00\x05\x00\x00\x00\x00\xc4\x0d\x72\x07\x00\x00\x00\x00\x4f\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5b\x07\x5b\x07\x10\x04\xac\x01\xc4\x0d\x46\x05\xc4\x0d\x02\x05\xfe\x04\x00\x00\x00\x00\x08\x05\x00\x00\x00\x00\xeb\x06\xeb\x06\xeb\x06\xeb\x06\x37\x05\x4a\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9d\x00\xfa\x04\xf8\x04\x57\x00\xcb\x00\xfb\x04\xfb\x04\x3a\x07\xf7\x04\xec\x04\xec\x04\xec\x04\xf6\x04\xf6\x04\xf6\x04\xed\x04\xed\x04\xf0\x04\x11\x0e\x8c\x05\xf1\x04\xf4\x04\x00\x00\xf5\x04\xeb\x04\xee\x04\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8c\x05\xdd\x04\xcb\x01\xe7\x04\xd8\x04\xcb\x01\xe6\x04\x67\x00\xe5\x04\x00\x00\xb2\x00\x22\x01\xe4\x04\xe0\x04\xdf\x04\x00\x00\xeb\x06\xeb\x06\x00\x00\xeb\x06\xeb\x06\xc1\x0d\xd9\x04\xc1\x0d\x7c\x06\x61\x05\x51\x06\x00\x00\x00\x00\xd7\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3f\x05\x00\x00\x00\x00\x3f\x05\x3f\x05\xcd\x04\x00\x00\xcb\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf5\xff\xfe\x00\xd9\xff\xfe\x00\xeb\x06\x00\x00\x00\x00\x00\x00\xeb\x06\x3f\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc9\x04\xc6\x04\x00\x00\x3f\x05\x00\x00\xc3\x04\xc2\x04\xc1\x04\xc0\x04\xad\x04\xbb\x04\xbb\x04\xbb\x04\xbb\x04\xbb\x04\xbb\x04\xfd\x04\x23\x07\xb9\x04\xc4\x04\xc3\xff\x00\x00\x00\x00\x00\x00\x53\x00\x00\x00\x53\x00\x53\x00\x00\x00\xb9\x00\xb1\x0d\x9d\x06\x9d\x06\x9d\x06\x9d\x06\x00\x00\xb8\x04\x00\x00\xb8\x04\x00\x00\xd7\xff\x00\x00\x33\x04\x00\x00\x00\x00\x2f\x00\x3f\x05\x3f\x05\xf3\x04\x3f\x05\x00\x00\x00\x00\x00\x00\xb6\x04\x00\x00\xcb\x01\x00\x00\x00\x00\x00\x00\xea\x04\x00\x00\xb2\x04\xb1\x04\xb0\x04\xfc\x02\x00\x00\x10\x04\x00\x00\x00\x00\xdc\x04\xf9\xff\xf9\xff\x00\x00\x10\x04\x00\x00\x00\x00\x54\x03\x00\x00\x00\x00\x3f\x05\x00\x00\x00\x00\x00\x00\xa2\x04\x9c\x04\x00\x00\x00\x00\xd7\xff\xae\x04\x00\x00\x9d\x00\x9a\x04\xac\x04\x00\x00\x9d\x00\x9d\x06\xe1\x04\x09\x00\x9e\x00\x5e\x00\x06\x00\xeb\x06\xb9\x00\xaa\x04\x00\x00\x9d\x00\x38\x02\x1e\x02\xd7\xff\xd7\xff\x53\x00\x00\x00\x00\x00\x00\x00\xf0\xff\x00\x00\x00\x00\xa3\x04\x00\x00\x3f\x05\x00\x00\x9e\x04\x23\x07\xd6\x04\x8a\x04\x00\x00\x89\x04\x89\x04\x89\x04\x85\x04\x7f\x04\x00\x00\x87\x04\x00\x00\x80\x04\x7e\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7d\x04\x00\x00\x00\x00\x7c\x04\x54\x04\x7b\x04\x75\x04\x73\x04\x00\x00\x00\x00\x00\x00\x00\x00\x71\x04\x00\x00\x71\x04\x00\x00\x70\x04\x5e\x01\x00\x00\x63\x04\x63\x04\x63\x04\x63\x04\x00\x00\xb9\x00\x3f\x05\x00\x00\xcd\x00\x6c\x04\x3f\x05\x67\x04\x3f\x05\x67\x04\x3f\x05\x65\x04\x26\x04\x65\x04\x6d\x04\x00\x00\x5c\x04\x3f\x05\x00\x00\xd7\xff\x3f\x05\x00\x00\x9d\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x69\x04\x5b\x04\x00\x00\x49\x04\x51\x04\x29\x04\x3c\x04\x41\x04\x6a\x04\x00\x00\x24\x04\x24\x04\x5e\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf9\xff\x20\x04\x00\x00\x00\x00\x00\x00\x00\x00\x26\x04\x00\x00\x02\x07\x10\x04\x00\x00\x5a\x04\x00\x00\x00\x00\x2b\x00\x57\x04\x00\x00\x3a\x04\x00\x00\x04\x03\x00\x00\x00\x00\x0c\x04\x5e\x01\x02\x04\x5e\x01\xb9\x00\xb9\x00\xf4\x03\x00\x00\xfb\x03\x00\x00\x00\x00\x00\x00\xeb\x03\x00\x00\x00\x00\x00\x00\xe3\x03\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x9d\x00\x9d\x00\x9d\x00\xe0\x03\x00\x00\x00\x00\xd8\x03\xd2\x03\x00\x00\xd2\x03\x00\x00\x00\x00\x3f\x01\x10\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5e\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf2\x03\x00\x00\x33\x04\x00\x00\x00\x00\x00\x00\x00\x00\xcf\x03\x00\x00\x9d\x00\x9d\x00\x9d\x00\x00\x00\x00\x00\x00\x00\x33\x04\x00\x00\x9d\x00\x00\x00\x00\x00"#++happyGotoOffsets :: HappyAddr+happyGotoOffsets = HappyA# "\x6b\x04\xac\x0d\x34\x00\x05\x04\xf9\x03\x00\x00\x00\x00\x00\x00\x19\x01\x00\x00\x00\x00\x1a\x00\x00\x00\x49\x02\x05\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4b\x05\x93\x0d\x00\x00\x00\x00\x39\x04\x81\x03\x78\x01\x00\x00\x00\x00\x80\x06\xf5\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7c\x02\x00\x00\x00\x00\xf7\x07\x26\x09\xbe\x08\x0c\x09\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x03\x88\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x57\x08\x7a\x0d\x00\x00\x00\x00\x00\x00\x4c\x08\x00\x00\x61\x01\xac\x00\x00\x00\x23\x0b\x73\x09\x69\x08\x00\x00\x7c\x02\xf2\x08\x9e\x08\xd8\x08\x0b\x0b\xf3\x0a\xdb\x0a\x00\x00\xf6\x03\x61\x0d\x00\x00\x58\x03\x00\x00\xc3\x0a\xab\x0a\x93\x0a\x00\x00\x48\x0d\x3b\x0b\x36\x01\x00\x00\x21\x02\x00\x00\x00\x00\x7b\x0a\x63\x0a\x00\x00\x00\x00\x00\x00\x00\x00\x2f\x0d\x16\x0d\x72\x04\x16\x01\x8a\x03\x00\x00\x00\x00\x38\x08\xa9\x00\x00\x00\x00\x00\x98\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8c\x00\x87\x00\x82\x04\x3b\x0b\x2f\x08\x00\x00\x25\x08\x00\x00\x7c\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3a\x06\x4b\x0a\x33\x0a\x1b\x0a\x59\x03\x43\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x04\x09\x03\x07\x03\x99\x00\x1f\x00\x56\x03\x49\x03\x6a\x01\xff\x02\x47\x03\x3c\x03\x29\x03\xcb\x02\xc7\x02\xbe\x02\x1e\x03\x3d\x04\xed\x02\x00\x00\xfd\x0c\x00\x00\x00\x00\x00\x00\x00\x00\x31\x01\x00\x00\x18\x03\x00\x00\x00\x00\x00\x00\x00\x00\xe4\x0c\x00\x00\xfe\x02\x00\x00\x00\x00\xd3\x02\x00\x00\x00\x00\x00\x00\x00\x00\xe5\x02\xe2\x02\x00\x00\x00\x00\x00\x00\x00\x00\x03\x0a\xeb\x09\x00\x00\xd3\x09\xbb\x09\x1f\x08\x00\x00\x1c\x08\xa3\x09\x5b\x09\x8b\x09\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xcb\x0c\x00\x00\x00\x00\xb2\x0c\x99\x0c\x00\x00\x00\x00\xce\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc5\x02\x00\x00\x7e\x02\x81\x08\x00\x00\x00\x00\x00\x00\xf4\x00\x80\x0c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0a\x00\x00\x00\x67\x0c\x00\x00\x00\x00\x00\x00\x00\x00\xaf\x02\x00\x00\xad\x02\x88\x02\x70\x02\x6b\x02\x68\x02\x5b\x02\x28\x02\x0f\x02\x28\x04\x00\x00\xd6\x01\x00\x00\x00\x00\x00\x00\x3b\x02\x00\x00\xe5\x01\xe2\x01\x00\x00\x14\x00\x0a\x08\x00\x08\xc0\x07\x92\x06\x34\x06\x00\x00\x60\x02\x00\x00\x1d\x00\x00\x00\x18\x00\x00\x00\x8e\x02\x00\x00\x00\x00\x1f\x02\x4e\x0c\x35\x0c\x1d\x02\x1c\x0c\x00\x00\x00\x00\x00\x00\xa6\x03\x00\x00\x50\x02\x00\x00\x00\x00\x00\x00\x1c\x02\x00\x00\x00\x00\x00\x00\x00\x00\x8c\x01\x00\x00\x1f\x04\x00\x00\x00\x00\xe1\x00\xca\x00\xc1\x00\x00\x00\xde\x03\x00\x00\x00\x00\x6d\x00\x00\x00\x00\x00\x03\x0c\x00\x00\x00\x00\x00\x00\xc4\x01\x2b\x02\x00\x00\x00\x00\xb2\x02\x00\x00\x00\x00\xf7\x03\x13\x02\x00\x00\x00\x00\xf1\x03\x55\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x09\x72\x03\x00\x00\x00\x00\xef\x03\x00\x00\x13\x02\x39\x02\xcc\x01\xce\x01\x00\x00\x00\x00\x00\x00\x3e\x03\x00\x00\x00\x00\x00\x00\x00\x00\xea\x0b\x00\x00\xd7\x01\xa2\x01\xcd\x01\x00\x00\x00\x00\xd1\x01\xc1\x01\xb2\x01\x00\x00\x9a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x96\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\x7d\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x46\x01\x00\x00\xff\xff\x00\x00\x00\x00\x84\x01\x00\x00\x7e\x03\x5e\x03\x4f\x03\x4d\x03\x00\x00\xa8\x00\xd1\x0b\x00\x00\x00\x00\x09\x01\xb8\x0b\x23\x02\x9f\x0b\x06\x02\x86\x0b\xaa\x02\x20\x00\x73\x02\x00\x00\x00\x00\xa6\x00\x6d\x0b\x00\x00\xc5\x00\x54\x0b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x73\x01\x00\x00\x63\x01\x00\x00\x00\x00\x00\x00\x62\x01\x4c\x01\x35\x01\xdd\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc4\x00\xbc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x38\x00\xd8\x02\x00\x00\x00\x00\x00\x00\x00\x00\xfd\xff\x00\x00\x00\x00\x00\x00\x00\x00\xfc\xff\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x6a\x00\x6e\x03\x6a\x03\x8e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x21\x00\x00\x00\x00\x00\x00\x00\x3f\x03\x35\x03\x1f\x03\x45\x02\x00\x00\xe9\x02\xd1\x02\xc8\x02\x2c\x00\x00\x00\x00\x00\x90\xff\x14\x01\x00\x00\xbe\xff\x00\x00\x00\x00\x3b\x0b\x79\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf8\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xda\x00\x00\x00\xb4\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb4\x02\x9b\x02\xf7\x01\x00\x00\x00\x00\x00\x00\x47\x01\x00\x00\x10\x01\x00\x00\x00\x00"#++happyDefActions :: HappyAddr+happyDefActions = HappyA# "\xfa\xff\x00\x00\xc3\xfe\x00\x00\xfc\xff\x00\x00\xaa\xff\x00\x00\xc3\xfe\xa9\xff\xb6\xfe\xc3\xfe\xb2\xfe\xc4\xfe\x00\x00\x00\x00\x89\xff\x69\xff\x00\x00\x7b\xff\x7a\xff\x78\xff\x77\xff\x74\xff\x00\x00\x56\xff\x55\xff\x72\xff\x00\x00\x00\x00\x4e\xff\x4c\xff\x00\x00\x00\x00\x65\xff\x64\xff\x00\x00\x00\x00\x63\xff\x62\xff\x61\xff\x60\xff\x00\x00\x00\x00\x66\xff\x67\xff\x00\x00\x00\x00\x00\x00\x00\x00\xa1\xff\x8a\xff\x68\xff\x00\x00\x89\xff\x00\x00\x83\xff\x00\x00\x82\xff\x00\x00\x6a\xff\x89\xff\x5b\xff\x00\x00\x00\x00\x9e\xff\x00\x00\x00\x00\x00\x00\x5c\xff\x87\xff\x21\xff\x35\xff\x00\x00\x6f\xff\x00\x00\x40\xff\x3d\xff\x36\xff\x00\x00\x00\x00\x86\xff\x00\x00\x00\x00\x00\x00\x59\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x26\xff\x00\x00\x00\x00\x27\xff\x22\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x54\xff\x00\x00\xc3\xfe\x4d\xff\x00\x00\x00\x00\x00\x00\x4f\xff\x7e\xff\x76\xff\x6d\xff\x00\x00\x00\x00\x00\x00\x00\x00\x81\xff\x89\xff\x88\xff\x23\xff\xbf\xfe\xa8\xff\xb5\xfe\x00\x00\xfb\xff\xf9\xff\xf8\xff\xf7\xff\xf6\xff\xf5\xff\xf4\xff\xf3\xff\xf2\xff\xf1\xff\xf0\xff\xef\xff\xee\xff\xed\xff\xec\xff\xeb\xff\xea\xff\xe9\xff\xe8\xff\xe7\xff\xe6\xff\xe5\xff\xe4\xff\xe3\xff\xe2\xff\xe1\xff\xe0\xff\xdf\xff\xde\xff\xdd\xff\xdc\xff\xdb\xff\xda\xff\xd9\xff\xd8\xff\xd7\xff\xd6\xff\xcf\xff\xce\xff\xcd\xff\xd5\xff\xd4\xff\xd3\xff\xd2\xff\xd1\xff\xd0\xff\xcc\xff\xcb\xff\xca\xff\xc9\xff\xc8\xff\xc7\xff\xc6\xff\xc5\xff\xc4\xff\xc3\xff\xc2\xff\xc1\xff\xc0\xff\xbf\xff\xbe\xff\xbd\xff\xbc\xff\xbb\xff\xba\xff\xb9\xff\xb8\xff\xb7\xff\xb6\xff\xb5\xff\xb4\xff\xb3\xff\xb2\xff\xb1\xff\xb0\xff\xaf\xff\xae\xff\xad\xff\xac\xff\xab\xff\xbf\xfe\xbf\xfe\x12\xff\x00\x00\x23\xff\x00\x00\x23\xff\x00\x00\x81\xff\x5a\xff\x79\xff\x00\x00\x7c\xff\x82\xff\x72\xff\x00\x00\x00\x00\x00\x00\xfd\xfe\xe0\xfe\x81\xfe\xf7\xfe\xf6\xfe\xf5\xfe\xf4\xfe\xf3\xfe\xf2\xfe\xf8\xfe\xf1\xfe\xf0\xfe\xef\xfe\xee\xfe\xed\xfe\xe8\xfe\xe7\xfe\xec\xfe\xeb\xfe\xea\xfe\xe9\xfe\xb3\xfe\xb1\xfe\xb0\xfe\xae\xfe\xaf\xfe\xad\xfe\xac\xfe\xab\xfe\xa8\xfe\xa7\xfe\xaa\xfe\xa9\xfe\x00\x00\x00\x00\x00\x00\xc4\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\xff\x00\x00\x00\x00\x00\x00\x00\x00\x53\xff\x52\xff\x54\xff\x83\xff\x00\x00\x29\xff\x2a\xff\x7d\xff\x28\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x30\xff\x00\x00\x2b\xff\x00\x00\x00\x00\x33\xff\x32\xff\x34\xff\x20\xff\x00\x00\x00\x00\x1f\xff\x00\x00\x00\x00\x3c\xff\x38\xff\x3d\xff\x00\x00\x00\x00\x00\x00\x41\xff\x75\xff\x37\xff\x45\xff\x5d\xff\x9d\xff\x44\xff\x5f\xff\x00\x00\x43\xff\x6c\xff\x00\x00\x00\x00\x00\x00\x42\xff\x00\x00\x3a\xff\x39\xff\x3b\xff\x3f\xff\x3e\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa5\xff\x70\xff\xa4\xff\x00\x00\x00\x00\x4b\xff\x49\xff\x4a\xff\x48\xff\x46\xff\x47\xff\x71\xff\x1d\xff\x1e\xff\x00\x00\x00\x00\x58\xff\x00\x00\x73\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xfd\xfe\x00\x00\x9f\xff\x00\x00\x00\x00\xd0\xfe\xd1\xfe\xd2\xfe\x00\x00\xa2\xff\x00\x00\x00\x00\xd3\xfe\x00\x00\x23\xff\x23\xff\x23\xff\x23\xff\x23\xff\xb7\xfe\x00\x00\xce\xfe\x00\x00\xcf\xfe\x00\x00\x85\xfe\xc3\xfe\xa6\xff\xa7\xff\xfb\xfe\x00\x00\x00\x00\xff\xfe\x00\x00\x80\xff\xa6\xfe\x25\xff\x00\x00\x24\xff\x00\x00\xc1\xfe\x18\xff\x16\xff\x13\xff\x14\xff\x00\x00\x00\x00\x00\x00\x12\xff\xbe\xfe\x12\xff\xc2\xfe\x17\xff\xa3\xff\x00\x00\x07\xff\x15\xff\x12\xff\x83\xfe\xb4\xfe\x00\x00\xfc\xfe\x03\xff\x00\x00\xe2\xfe\xe1\xfe\xe3\xfe\x00\x00\x00\x00\x82\xfe\x9b\xff\x99\xff\x00\x00\x95\xfe\x00\x00\x00\x00\x00\x00\x98\xfe\x00\x00\x23\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x54\xff\x97\xff\x00\x00\x92\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x84\xff\xd6\xfe\xd5\xfe\xd4\xfe\x00\x00\xc9\xfe\xc7\xfe\x00\x00\xc5\xfe\x00\x00\xa0\xff\x01\xff\x6e\xff\xff\xfe\x00\x00\x7f\xff\x81\xff\x81\xff\x81\xff\x00\x00\x81\xff\x9d\xfe\x00\x00\x9b\xfe\x00\x00\x00\x00\x50\xff\x51\xff\x57\xff\x31\xff\x30\xff\x2f\xff\x2e\xff\x2c\xff\x2d\xff\x1b\xff\x1c\xff\x19\xff\x1a\xff\x5e\xff\x6b\xff\x00\x00\x9c\xfe\x9e\xfe\x00\x00\x81\xff\x00\x00\x00\x00\x00\x00\x9f\xfe\x02\xff\x00\xff\xcc\xfe\x00\x00\xc8\xfe\x00\x00\x85\xff\x00\x00\x00\x00\x9c\xff\x00\x00\x00\x00\x00\x00\x00\x00\x94\xfe\x00\x00\x00\x00\x98\xff\x89\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9a\xfe\x00\x00\x00\x00\x97\xfe\x00\x00\x00\x00\x9a\xff\x00\x00\xfa\xfe\xfe\xfe\x84\xfe\xc0\xfe\x09\xff\x05\xff\x00\x00\x06\xff\x00\x00\x00\x00\x00\x00\x00\x00\x0d\xff\x00\x00\xa3\xff\x00\x00\x00\x00\xa3\xff\x0f\xff\x0b\xff\x10\xff\x08\xff\x11\xff\x00\x00\x00\x00\xe5\xfe\x96\xfe\xe6\xfe\x99\xfe\x00\x00\xb8\xfe\xbf\xfe\x12\xff\xb9\xfe\xdb\xfe\x90\xfe\xdd\xfe\x00\x00\x00\x00\xdc\xfe\xd8\xfe\xd9\xfe\x00\x00\xe4\xfe\x93\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x95\xff\x93\xff\xcd\xfe\xcb\xfe\x00\x00\xa0\xfe\xa1\xfe\xa3\xfe\x00\x00\xa4\xfe\xa5\xfe\xa2\xfe\x00\x00\xca\xfe\x94\xff\x96\xff\x8f\xff\x91\xff\x8b\xff\x8d\xff\x8f\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x87\xfe\x86\xfe\x00\x00\x00\x00\x91\xfe\x00\x00\xbb\xfe\xbc\xfe\x00\x00\x12\xff\xf9\xfe\x04\xff\x0e\xff\x0c\xff\x0a\xff\xba\xfe\x00\x00\xdf\xfe\xde\xfe\xda\xfe\xd7\xfe\x8c\xfe\x8b\xfe\xc3\xfe\x8e\xfe\xc3\xfe\x8e\xff\x8c\xff\x92\xff\x90\xff\x00\x00\xc6\xfe\x00\x00\x00\x00\x00\x00\xbd\xfe\x88\xfe\x8a\xfe\xc3\xfe\x8d\xfe\x00\x00\x89\xfe"#++happyCheck :: HappyAddr+happyCheck = HappyA# "\xff\xff\x05\x00\x05\x00\x0b\x00\x41\x00\x09\x00\x09\x00\x0a\x00\x0f\x00\x03\x00\x09\x00\x0f\x00\x03\x00\x7d\x00\x37\x00\x4c\x00\x0f\x00\x10\x00\x39\x00\x09\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x09\x00\x04\x00\x46\x00\x0c\x00\x09\x00\x0e\x00\x4c\x00\x0c\x00\x0d\x00\x09\x00\x0a\x00\x09\x00\x09\x00\x3a\x00\x00\x00\x22\x00\x23\x00\x39\x00\x0f\x00\x10\x00\x41\x00\x03\x00\x3d\x00\x76\x00\x09\x00\x40\x00\x03\x00\x04\x00\x08\x00\x7c\x00\x46\x00\x4c\x00\x41\x00\x0f\x00\x39\x00\x0f\x00\x09\x00\x46\x00\x3a\x00\x47\x00\x4c\x00\x4a\x00\x0f\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x1e\x00\x1f\x00\x20\x00\x5a\x00\x5e\x00\x5f\x00\x5d\x00\x49\x00\x62\x00\x63\x00\x48\x00\x03\x00\x61\x00\x67\x00\x47\x00\x69\x00\x0f\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x05\x00\x48\x00\x77\x00\x0b\x00\x09\x00\x4c\x00\x5e\x00\x5f\x00\x7e\x00\x4a\x00\x0f\x00\x81\x00\x5d\x00\x65\x00\x66\x00\x61\x00\x68\x00\x64\x00\x6a\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x3b\x00\x7b\x00\x09\x00\x79\x00\x5e\x00\x5f\x00\x77\x00\x09\x00\x0f\x00\x39\x00\x60\x00\x65\x00\x66\x00\x0f\x00\x68\x00\x00\x00\x6a\x00\x4c\x00\x39\x00\x03\x00\x09\x00\x4c\x00\x4d\x00\x1e\x00\x1f\x00\x20\x00\x0f\x00\x10\x00\x1e\x00\x1f\x00\x20\x00\x46\x00\x41\x00\x09\x00\x0a\x00\x09\x00\x09\x00\x46\x00\x0c\x00\x09\x00\x0e\x00\x4a\x00\x0f\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x11\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x1e\x00\x1f\x00\x20\x00\x09\x00\x5e\x00\x5f\x00\x09\x00\x09\x00\x62\x00\x63\x00\x0c\x00\x0d\x00\x09\x00\x67\x00\x38\x00\x69\x00\x39\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x09\x00\x07\x00\x48\x00\x49\x00\x60\x00\x07\x00\x0f\x00\x38\x00\x5d\x00\x60\x00\x47\x00\x81\x00\x36\x00\x37\x00\x49\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x49\x00\x43\x00\x09\x00\x45\x00\x3e\x00\x3f\x00\x40\x00\x3e\x00\x0f\x00\x40\x00\x4c\x00\x3b\x00\x3a\x00\x3e\x00\x60\x00\x40\x00\x0b\x00\x3f\x00\x48\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x05\x00\x06\x00\x4c\x00\x3b\x00\x3c\x00\x3d\x00\x41\x00\x3b\x00\x3c\x00\x3d\x00\x09\x00\x46\x00\x2d\x00\x2e\x00\x2f\x00\x4a\x00\x0f\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x1e\x00\x1f\x00\x20\x00\x39\x00\x5e\x00\x5f\x00\x09\x00\x7f\x00\x62\x00\x63\x00\x09\x00\x09\x00\x01\x00\x67\x00\x44\x00\x69\x00\x46\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x09\x00\x12\x00\x21\x00\x22\x00\x23\x00\x09\x00\x0f\x00\x21\x00\x22\x00\x23\x00\x38\x00\x81\x00\x1d\x00\x1e\x00\x1f\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x46\x00\x07\x00\x09\x00\x49\x00\x09\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x11\x00\x09\x00\x35\x00\x36\x00\x37\x00\x5e\x00\x5f\x00\x0f\x00\x3b\x00\x3c\x00\x09\x00\x3e\x00\x65\x00\x66\x00\x41\x00\x09\x00\x43\x00\x44\x00\x45\x00\x46\x00\x7d\x00\x0f\x00\x41\x00\x1f\x00\x76\x00\x4c\x00\x4d\x00\x46\x00\x4f\x00\x0b\x00\x7c\x00\x4a\x00\x15\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x1f\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x09\x00\x44\x00\x5d\x00\x46\x00\x5e\x00\x5f\x00\x0f\x00\x10\x00\x62\x00\x63\x00\x09\x00\x16\x00\x01\x00\x67\x00\x15\x00\x69\x00\x0f\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x09\x00\x12\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x0f\x00\x38\x00\x39\x00\x3a\x00\x15\x00\x81\x00\x1d\x00\x1e\x00\x1f\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x09\x00\x15\x00\x09\x00\x0c\x00\x0d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x11\x00\x12\x00\x35\x00\x36\x00\x37\x00\x3a\x00\x08\x00\x15\x00\x3b\x00\x3c\x00\x3f\x00\x3e\x00\x09\x00\x0f\x00\x41\x00\x09\x00\x43\x00\x44\x00\x45\x00\x46\x00\x11\x00\x12\x00\x41\x00\x11\x00\x12\x00\x4c\x00\x4d\x00\x46\x00\x4f\x00\x05\x00\x06\x00\x4a\x00\x3a\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x3f\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x09\x00\x44\x00\x43\x00\x46\x00\x5e\x00\x5f\x00\x0f\x00\x10\x00\x62\x00\x63\x00\x09\x00\x42\x00\x01\x00\x67\x00\x09\x00\x69\x00\x0f\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x09\x00\x12\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x0f\x00\x5b\x00\x5c\x00\x5d\x00\x09\x00\x81\x00\x1d\x00\x1e\x00\x1f\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x09\x00\x7f\x00\x09\x00\x0c\x00\x0d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x11\x00\x12\x00\x09\x00\x36\x00\x37\x00\x0c\x00\x09\x00\x0e\x00\x3b\x00\x3c\x00\x3a\x00\x3e\x00\x0f\x00\x10\x00\x41\x00\x0b\x00\x43\x00\x44\x00\x45\x00\x46\x00\x43\x00\x43\x00\x41\x00\x45\x00\x45\x00\x4c\x00\x4d\x00\x46\x00\x4f\x00\x09\x00\x4c\x00\x4a\x00\x44\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x16\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x43\x00\x76\x00\x45\x00\x16\x00\x5e\x00\x5f\x00\x16\x00\x7c\x00\x62\x00\x63\x00\x09\x00\x16\x00\x01\x00\x67\x00\x0b\x00\x69\x00\x0f\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x09\x00\x12\x00\x76\x00\x1e\x00\x1f\x00\x20\x00\x0f\x00\x16\x00\x7c\x00\x05\x00\x06\x00\x81\x00\x1d\x00\x1e\x00\x1f\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x05\x00\x06\x00\x09\x00\x36\x00\x37\x00\x0c\x00\x0d\x00\x3b\x00\x3b\x00\x3c\x00\x16\x00\x3e\x00\x16\x00\x41\x00\x41\x00\x43\x00\x43\x00\x45\x00\x45\x00\x46\x00\x05\x00\x06\x00\x41\x00\x0b\x00\x4c\x00\x4c\x00\x4d\x00\x46\x00\x4f\x00\x05\x00\x06\x00\x4a\x00\x0b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x0b\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x06\x00\x36\x00\x37\x00\x06\x00\x5e\x00\x5f\x00\x05\x00\x06\x00\x62\x00\x63\x00\x7f\x00\x80\x00\x41\x00\x67\x00\x43\x00\x69\x00\x45\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x00\x00\x01\x00\x0a\x00\x0b\x00\x0c\x00\x0b\x00\x06\x00\x07\x00\x08\x00\x09\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\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\x0b\x00\x20\x00\x21\x00\x3b\x00\x09\x00\x09\x00\x7f\x00\x80\x00\x0c\x00\x41\x00\x0e\x00\x43\x00\x42\x00\x45\x00\x08\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x4c\x00\x41\x00\x35\x00\x43\x00\x37\x00\x45\x00\x7f\x00\x09\x00\x3b\x00\x3c\x00\x0c\x00\x3e\x00\x0e\x00\x08\x00\x41\x00\x7f\x00\x43\x00\x09\x00\x45\x00\x7f\x00\x0c\x00\x48\x00\x0e\x00\x4a\x00\x08\x00\x4c\x00\x4d\x00\x09\x00\x4f\x00\x00\x00\x01\x00\x09\x00\x0a\x00\x09\x00\x0a\x00\x06\x00\x07\x00\x08\x00\x09\x00\x42\x00\x09\x00\x44\x00\x09\x00\x46\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x09\x00\x0a\x00\x11\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x09\x00\x20\x00\x21\x00\x0c\x00\x09\x00\x0e\x00\x7a\x00\x0c\x00\x09\x00\x0e\x00\x76\x00\x0c\x00\x27\x00\x0e\x00\x78\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x09\x00\x0a\x00\x35\x00\x32\x00\x37\x00\x34\x00\x35\x00\x4b\x00\x3b\x00\x3c\x00\x15\x00\x3e\x00\x0b\x00\x41\x00\x41\x00\x43\x00\x43\x00\x45\x00\x45\x00\x5c\x00\x5d\x00\x48\x00\x44\x00\x4a\x00\x15\x00\x4c\x00\x4d\x00\x0b\x00\x4f\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\x01\x00\x05\x00\x06\x00\x05\x00\x06\x00\x06\x00\x07\x00\x08\x00\x02\x00\x05\x00\x06\x00\x09\x00\x09\x00\x7f\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x01\x00\x11\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x42\x00\x20\x00\x21\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x47\x00\x0a\x00\x0b\x00\x0c\x00\x27\x00\x0e\x00\x47\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x7f\x00\x80\x00\x35\x00\x32\x00\x37\x00\x34\x00\x35\x00\x4c\x00\x3b\x00\x3c\x00\x4c\x00\x3e\x00\x09\x00\x0a\x00\x41\x00\x01\x00\x43\x00\x4b\x00\x45\x00\x3d\x00\x06\x00\x07\x00\x08\x00\x4a\x00\x03\x00\x4c\x00\x4d\x00\x4c\x00\x4f\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x09\x00\x0a\x00\x46\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x46\x00\x20\x00\x21\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x03\x00\x05\x00\x06\x00\x03\x00\x09\x00\x26\x00\x27\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x11\x00\x47\x00\x35\x00\x01\x00\x37\x00\x00\x00\x01\x00\x0f\x00\x3b\x00\x3c\x00\x4c\x00\x3e\x00\x4c\x00\x4d\x00\x41\x00\x4c\x00\x43\x00\x0d\x00\x45\x00\x38\x00\x12\x00\x09\x00\x27\x00\x4a\x00\x42\x00\x4c\x00\x4d\x00\x0f\x00\x4f\x00\x39\x00\x3a\x00\x1d\x00\x1e\x00\x1f\x00\x33\x00\x34\x00\x35\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x42\x00\x01\x00\x4c\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x4c\x00\x4d\x00\x42\x00\x36\x00\x37\x00\x03\x00\x38\x00\x4e\x00\x3b\x00\x3c\x00\x12\x00\x3e\x00\x3a\x00\x4c\x00\x41\x00\x42\x00\x43\x00\x47\x00\x45\x00\x47\x00\x4c\x00\x1d\x00\x1e\x00\x1f\x00\x47\x00\x4c\x00\x4d\x00\x46\x00\x4f\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x4c\x00\x4b\x00\x01\x00\x4b\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x4b\x00\x4b\x00\x4b\x00\x36\x00\x37\x00\x4b\x00\x4e\x00\x4e\x00\x3b\x00\x3c\x00\x12\x00\x3e\x00\x4b\x00\x4e\x00\x41\x00\x4b\x00\x43\x00\x4e\x00\x45\x00\x46\x00\x04\x00\x1d\x00\x1e\x00\x1f\x00\x40\x00\x4c\x00\x4d\x00\x3e\x00\x4f\x00\x39\x00\x03\x00\x39\x00\x4c\x00\x39\x00\x4c\x00\x47\x00\x01\x00\x0f\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x41\x00\x41\x00\x41\x00\x36\x00\x37\x00\x0c\x00\x04\x00\x4b\x00\x3b\x00\x3c\x00\x12\x00\x3e\x00\x47\x00\x3a\x00\x41\x00\x42\x00\x43\x00\x05\x00\x45\x00\x4c\x00\x4c\x00\x1d\x00\x1e\x00\x1f\x00\x4e\x00\x4c\x00\x4d\x00\x4b\x00\x4f\x00\x4e\x00\x46\x00\x4e\x00\x4e\x00\x4c\x00\x46\x00\x3d\x00\x01\x00\x3d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x3d\x00\x3d\x00\x46\x00\x36\x00\x37\x00\x3d\x00\x3d\x00\x46\x00\x3b\x00\x3c\x00\x12\x00\x3e\x00\x42\x00\x42\x00\x41\x00\x3a\x00\x43\x00\x38\x00\x45\x00\x46\x00\x40\x00\x1d\x00\x1e\x00\x1f\x00\x46\x00\x4c\x00\x4d\x00\x4c\x00\x4f\x00\x4c\x00\x46\x00\x4f\x00\x05\x00\x47\x00\x47\x00\x47\x00\x01\x00\x47\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x4c\x00\x40\x00\x03\x00\x36\x00\x37\x00\x4e\x00\x4b\x00\x4e\x00\x3b\x00\x3c\x00\x12\x00\x3e\x00\x02\x00\x09\x00\x41\x00\x42\x00\x43\x00\x4c\x00\x45\x00\x0f\x00\x45\x00\x1d\x00\x1e\x00\x1f\x00\x3d\x00\x4c\x00\x4d\x00\x01\x00\x4f\x00\x02\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x3d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x42\x00\x12\x00\x42\x00\x36\x00\x37\x00\x46\x00\x50\x00\x46\x00\x3b\x00\x3c\x00\x46\x00\x3e\x00\x1d\x00\x1e\x00\x41\x00\x39\x00\x43\x00\x47\x00\x45\x00\x4c\x00\x3d\x00\x22\x00\x50\x00\x3f\x00\x09\x00\x4c\x00\x4d\x00\x01\x00\x4f\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x50\x00\xff\xff\xff\xff\xff\xff\x37\x00\xff\xff\xff\xff\xff\xff\x3b\x00\x3c\x00\x12\x00\x3e\x00\xff\xff\xff\xff\x41\x00\xff\xff\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\x1d\x00\x1e\x00\x1f\x00\xff\xff\x4c\x00\x4d\x00\x01\x00\x4f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\xff\xff\x12\x00\xff\xff\x36\x00\x37\x00\xff\xff\xff\xff\xff\xff\x3b\x00\x3c\x00\xff\xff\x3e\x00\x1d\x00\x1e\x00\x41\x00\xff\xff\x43\x00\xff\xff\x45\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x4c\x00\x4d\x00\x01\x00\x4f\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\xff\xff\xff\xff\xff\xff\xff\xff\x37\x00\xff\xff\xff\xff\xff\xff\x3b\x00\x3c\x00\x12\x00\x3e\x00\xff\xff\xff\xff\x41\x00\xff\xff\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\x1d\x00\x1e\x00\x1f\x00\xff\xff\x4c\x00\x4d\x00\x01\x00\x4f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\xff\xff\x12\x00\xff\xff\x36\x00\x37\x00\xff\xff\xff\xff\xff\xff\x3b\x00\x3c\x00\xff\xff\x3e\x00\x1d\x00\x1e\x00\x41\x00\xff\xff\x43\x00\xff\xff\x45\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x4c\x00\x4d\x00\xff\xff\x4f\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\xff\xff\xff\xff\x01\x00\xff\xff\x37\x00\xff\xff\xff\xff\xff\xff\x3b\x00\x3c\x00\x3d\x00\x3e\x00\xff\xff\x40\x00\x41\x00\x09\x00\x43\x00\xff\xff\x45\x00\x12\x00\xff\xff\x09\x00\xff\xff\x11\x00\xff\xff\x4c\x00\x4d\x00\x0f\x00\x4f\x00\xff\xff\x1d\x00\x1e\x00\x1f\x00\xff\xff\xff\xff\xff\xff\x01\x00\xff\xff\x1a\x00\x1b\x00\x1c\x00\xff\xff\x1e\x00\x1f\x00\x20\x00\x27\x00\xff\xff\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\xff\xff\x12\x00\xff\xff\x36\x00\x37\x00\x33\x00\x34\x00\x35\x00\x3b\x00\x3c\x00\xff\xff\x3e\x00\x1d\x00\x1e\x00\x41\x00\xff\xff\x43\x00\xff\xff\x45\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x4c\x00\x4d\x00\x01\x00\x4f\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\xff\xff\xff\xff\xff\xff\xff\xff\x37\x00\x09\x00\xff\xff\xff\xff\x3b\x00\x3c\x00\x12\x00\x3e\x00\xff\xff\x11\x00\x41\x00\xff\xff\x43\x00\xff\xff\x45\x00\x46\x00\xff\xff\x1d\x00\x1e\x00\x09\x00\xff\xff\x4c\x00\x4d\x00\x01\x00\x4f\x00\xff\xff\xff\xff\x11\x00\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\xff\xff\x12\x00\x31\x00\x32\x00\x37\x00\x34\x00\x35\x00\xff\xff\x3b\x00\x3c\x00\x27\x00\x3e\x00\x1d\x00\x1e\x00\x41\x00\x42\x00\x43\x00\xff\xff\x45\x00\xff\xff\xff\xff\xff\xff\x33\x00\x34\x00\x35\x00\x4c\x00\x4d\x00\x01\x00\x4f\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\xff\xff\xff\xff\x36\x00\x37\x00\x37\x00\xff\xff\xff\xff\x3b\x00\x3b\x00\x3c\x00\x12\x00\x3e\x00\xff\xff\x41\x00\x41\x00\x43\x00\x43\x00\x45\x00\x45\x00\x46\x00\xff\xff\x1d\x00\x1e\x00\xff\xff\x4c\x00\x4c\x00\x4d\x00\x01\x00\x4f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\xff\xff\x12\x00\xff\xff\xff\xff\x37\x00\xff\xff\xff\xff\xff\xff\x3b\x00\x3c\x00\xff\xff\x3e\x00\x1d\x00\x1e\x00\x41\x00\x42\x00\x43\x00\xff\xff\x45\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x12\x00\x4c\x00\x4d\x00\xff\xff\x4f\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\xff\xff\x1d\x00\x1e\x00\xff\xff\x37\x00\xff\xff\xff\xff\xff\xff\x3b\x00\x3c\x00\xff\xff\x3e\x00\xff\xff\xff\xff\x41\x00\xff\xff\x43\x00\xff\xff\x45\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x12\x00\xff\xff\x4c\x00\x4d\x00\x37\x00\x4f\x00\xff\xff\xff\xff\x3b\x00\x3c\x00\xff\xff\x1d\x00\x1e\x00\xff\xff\x41\x00\xff\xff\x43\x00\xff\xff\x45\x00\xff\xff\xff\xff\xff\xff\xff\xff\x12\x00\xff\xff\x4c\x00\x4d\x00\xff\xff\x4f\x00\x2f\x00\x30\x00\x31\x00\x32\x00\xff\xff\x1d\x00\x1e\x00\xff\xff\x37\x00\xff\xff\xff\xff\xff\xff\x3b\x00\x3c\x00\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\xff\xff\x43\x00\xff\xff\x45\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x12\x00\xff\xff\x4c\x00\x4d\x00\x37\x00\x4f\x00\xff\xff\xff\xff\x3b\x00\x3c\x00\xff\xff\x1d\x00\x1e\x00\xff\xff\x41\x00\xff\xff\x43\x00\xff\xff\x45\x00\xff\xff\xff\xff\xff\xff\xff\xff\x12\x00\xff\xff\x4c\x00\x4d\x00\xff\xff\x4f\x00\x2f\x00\x30\x00\x31\x00\x32\x00\xff\xff\x1d\x00\x1e\x00\xff\xff\x37\x00\xff\xff\xff\xff\xff\xff\x3b\x00\x3c\x00\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\xff\xff\x43\x00\xff\xff\x45\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x12\x00\xff\xff\x4c\x00\x4d\x00\x37\x00\x4f\x00\xff\xff\xff\xff\x3b\x00\x3c\x00\xff\xff\x1d\x00\x1e\x00\xff\xff\x41\x00\xff\xff\x43\x00\xff\xff\x45\x00\xff\xff\xff\xff\xff\xff\xff\xff\x12\x00\xff\xff\x4c\x00\x4d\x00\xff\xff\x4f\x00\x2f\x00\x30\x00\x31\x00\x32\x00\xff\xff\x1d\x00\x1e\x00\x09\x00\x37\x00\xff\xff\xff\xff\xff\xff\x3b\x00\x3c\x00\xff\xff\x11\x00\xff\xff\xff\xff\x41\x00\xff\xff\x43\x00\xff\xff\x45\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x12\x00\xff\xff\x4c\x00\x4d\x00\x37\x00\x4f\x00\xff\xff\xff\xff\x3b\x00\x3c\x00\x27\x00\x1d\x00\x1e\x00\xff\xff\x41\x00\xff\xff\x43\x00\xff\xff\x45\x00\xff\xff\xff\xff\xff\xff\x33\x00\x34\x00\x35\x00\x4c\x00\x4d\x00\xff\xff\x4f\x00\x2f\x00\x30\x00\x31\x00\x32\x00\xff\xff\xff\xff\x09\x00\xff\xff\x37\x00\xff\xff\xff\xff\xff\xff\x3b\x00\x3c\x00\x11\x00\x09\x00\xff\xff\xff\xff\x41\x00\xff\xff\x43\x00\xff\xff\x45\x00\x11\x00\xff\xff\x09\x00\xff\xff\xff\xff\xff\xff\x4c\x00\x4d\x00\xff\xff\x4f\x00\x11\x00\xff\xff\xff\xff\x27\x00\xff\xff\x29\x00\x2a\x00\x2b\x00\x2c\x00\xff\xff\x09\x00\xff\xff\x27\x00\x09\x00\xff\xff\xff\xff\x34\x00\x35\x00\x11\x00\x09\x00\xff\xff\x11\x00\x27\x00\xff\xff\x33\x00\x34\x00\x35\x00\x11\x00\xff\xff\x09\x00\xff\xff\xff\xff\xff\xff\xff\xff\x33\x00\x34\x00\x35\x00\x11\x00\x09\x00\xff\xff\x27\x00\xff\xff\xff\xff\x27\x00\x2b\x00\xff\xff\x11\x00\x2b\x00\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\x34\x00\x35\x00\xff\xff\x34\x00\x35\x00\x09\x00\x27\x00\xff\xff\x33\x00\x34\x00\x35\x00\xff\xff\xff\xff\x11\x00\xff\xff\x27\x00\x09\x00\xff\xff\x33\x00\x34\x00\x35\x00\xff\xff\xff\xff\xff\xff\x11\x00\xff\xff\xff\xff\x33\x00\x34\x00\x35\x00\xff\xff\xff\xff\xff\xff\xff\xff\x09\x00\x27\x00\xff\xff\xff\xff\xff\xff\x2b\x00\x0f\x00\xff\xff\xff\xff\xff\xff\x13\x00\x14\x00\x27\x00\xff\xff\x34\x00\x35\x00\x2b\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x09\x00\x34\x00\x35\x00\xff\xff\xff\xff\xff\xff\x0f\x00\x28\x00\xff\xff\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\xff\xff\x30\x00\xff\xff\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x09\x00\xff\xff\x0b\x00\xff\xff\xff\xff\xff\xff\x0f\x00\x2d\x00\x2e\x00\x2f\x00\x13\x00\x14\x00\xff\xff\xff\xff\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\xff\xff\xff\xff\xff\xff\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x09\x00\xff\xff\x0b\x00\xff\xff\xff\xff\xff\xff\x0f\x00\xff\xff\xff\xff\xff\xff\x13\x00\x14\x00\xff\xff\xff\xff\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\xff\xff\xff\xff\x09\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x0f\x00\xff\xff\xff\xff\xff\xff\x13\x00\x14\x00\xff\xff\xff\xff\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\xff\xff\xff\xff\x09\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x0f\x00\xff\xff\xff\xff\xff\xff\x13\x00\x14\x00\xff\xff\xff\xff\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\xff\xff\xff\xff\x09\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x0f\x00\xff\xff\xff\xff\xff\xff\x13\x00\x14\x00\xff\xff\xff\xff\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\xff\xff\xff\xff\x09\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x0f\x00\xff\xff\xff\xff\xff\xff\x13\x00\x14\x00\xff\xff\xff\xff\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\xff\xff\xff\xff\x09\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x0f\x00\xff\xff\xff\xff\xff\xff\x13\x00\x14\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\x1b\x00\x1c\x00\xff\xff\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x09\x00\xff\xff\x0b\x00\xff\xff\x28\x00\xff\xff\x0f\x00\xff\xff\xff\xff\xff\xff\x13\x00\x14\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\x1b\x00\x1c\x00\xff\xff\x1e\x00\x1f\x00\x20\x00\x09\x00\xff\xff\x0b\x00\xff\xff\xff\xff\xff\xff\x0f\x00\x28\x00\xff\xff\xff\xff\x13\x00\x14\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\x1b\x00\x1c\x00\xff\xff\x1e\x00\x1f\x00\x20\x00\x09\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x0f\x00\x28\x00\xff\xff\xff\xff\x13\x00\x14\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\x1b\x00\x1c\x00\xff\xff\x1e\x00\x1f\x00\x20\x00\x09\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x0f\x00\x28\x00\xff\xff\xff\xff\x13\x00\x14\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\x1b\x00\x1c\x00\xff\xff\x1e\x00\x1f\x00\x20\x00\x09\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x0f\x00\x28\x00\xff\xff\xff\xff\x13\x00\x14\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\x1b\x00\x1c\x00\xff\xff\x1e\x00\x1f\x00\x20\x00\x09\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x0f\x00\x28\x00\xff\xff\xff\xff\x13\x00\x14\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\x1b\x00\x1c\x00\xff\xff\x1e\x00\x1f\x00\x20\x00\x09\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x0f\x00\x28\x00\xff\xff\xff\xff\x13\x00\x14\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\x1b\x00\x1c\x00\xff\xff\x1e\x00\x1f\x00\x20\x00\x09\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x0f\x00\x28\x00\xff\xff\xff\xff\x13\x00\x14\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\x1b\x00\x1c\x00\xff\xff\x1e\x00\x1f\x00\x20\x00\x09\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x0f\x00\x28\x00\xff\xff\xff\xff\x13\x00\x14\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\x1b\x00\x1c\x00\xff\xff\x1e\x00\x1f\x00\x20\x00\x09\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x0f\x00\x28\x00\xff\xff\xff\xff\x13\x00\x14\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\x1b\x00\x1c\x00\xff\xff\x1e\x00\x1f\x00\x20\x00\x09\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x0f\x00\x28\x00\xff\xff\xff\xff\x13\x00\x14\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\x1b\x00\x1c\x00\xff\xff\x1e\x00\x1f\x00\x20\x00\x09\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x0f\x00\x28\x00\xff\xff\xff\xff\x13\x00\x14\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\x1b\x00\x1c\x00\xff\xff\x1e\x00\x1f\x00\x20\x00\x09\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x0f\x00\x28\x00\xff\xff\xff\xff\x13\x00\x14\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\x1b\x00\x1c\x00\xff\xff\x1e\x00\x1f\x00\x20\x00\x09\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x0f\x00\x28\x00\xff\xff\xff\xff\x13\x00\x14\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\x1b\x00\x1c\x00\xff\xff\x1e\x00\x1f\x00\x20\x00\x09\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x0f\x00\x28\x00\xff\xff\xff\xff\x13\x00\x14\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\x1b\x00\x1c\x00\xff\xff\x1e\x00\x1f\x00\x20\x00\x09\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x0f\x00\x28\x00\xff\xff\xff\xff\x13\x00\x14\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\x1b\x00\x1c\x00\xff\xff\x1e\x00\x1f\x00\x20\x00\x09\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x0f\x00\x28\x00\xff\xff\xff\xff\x13\x00\x14\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\x1b\x00\x1c\x00\xff\xff\x1e\x00\x1f\x00\x20\x00\x09\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x0f\x00\x28\x00\xff\xff\xff\xff\x13\x00\x14\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\x1b\x00\x1c\x00\xff\xff\x1e\x00\x1f\x00\x20\x00\x09\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x0f\x00\x28\x00\xff\xff\xff\xff\x13\x00\x14\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\x1b\x00\x1c\x00\xff\xff\x1e\x00\x1f\x00\x20\x00\x09\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x0f\x00\x28\x00\xff\xff\xff\xff\x13\x00\x14\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\x1b\x00\x1c\x00\xff\xff\x1e\x00\x1f\x00\x20\x00\x09\x00\xff\xff\x0b\x00\xff\xff\xff\xff\xff\xff\x0f\x00\x28\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\xff\xff\x09\x00\xff\xff\x24\x00\x25\x00\x26\x00\x27\x00\x0f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\xff\xff\x09\x00\xff\xff\x24\x00\x25\x00\x26\x00\x27\x00\x0f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\xff\xff\x09\x00\xff\xff\x24\x00\x25\x00\x26\x00\x27\x00\x0f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\xff\xff\x09\x00\xff\xff\x24\x00\x25\x00\x26\x00\x27\x00\x0f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\xff\xff\x09\x00\xff\xff\x24\x00\x25\x00\x26\x00\x27\x00\x0f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\xff\xff\x09\x00\xff\xff\x24\x00\x25\x00\x26\x00\x27\x00\x0f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\xff\xff\x09\x00\xff\xff\x24\x00\x25\x00\x26\x00\x27\x00\x0f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\xff\xff\x09\x00\xff\xff\x24\x00\x25\x00\x26\x00\x27\x00\x0f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\xff\xff\x09\x00\xff\xff\x24\x00\x25\x00\x26\x00\x27\x00\x0f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\xff\xff\x09\x00\xff\xff\x24\x00\x25\x00\x26\x00\x27\x00\x0f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\xff\xff\x09\x00\xff\xff\x24\x00\x25\x00\x26\x00\x27\x00\x0f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\xff\xff\x09\x00\xff\xff\x24\x00\x25\x00\x26\x00\x27\x00\x0f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\xff\xff\x09\x00\xff\xff\x24\x00\x25\x00\x26\x00\x27\x00\x0f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\xff\xff\x09\x00\xff\xff\x24\x00\x25\x00\x26\x00\x27\x00\x0f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\xff\xff\x09\x00\xff\xff\x24\x00\x25\x00\x26\x00\x27\x00\x0f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\xff\xff\x09\x00\xff\xff\x24\x00\x25\x00\x26\x00\x27\x00\x0f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\xff\xff\x09\x00\xff\xff\x24\x00\x25\x00\x26\x00\x27\x00\x0f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\xff\xff\x09\x00\xff\xff\x24\x00\x25\x00\x26\x00\x27\x00\x0f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\xff\xff\x09\x00\xff\xff\x24\x00\x25\x00\x26\x00\x27\x00\x0f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\xff\xff\x09\x00\xff\xff\x24\x00\x25\x00\x26\x00\x27\x00\x0f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\xff\xff\x09\x00\xff\xff\x24\x00\x25\x00\x26\x00\x27\x00\x0f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\xff\xff\x09\x00\xff\xff\x24\x00\x25\x00\x26\x00\x27\x00\x0f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\xff\xff\x09\x00\xff\xff\x24\x00\x25\x00\x26\x00\x27\x00\x0f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\xff\xff\x09\x00\xff\xff\x24\x00\x25\x00\x26\x00\x27\x00\x0f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\xff\xff\x09\x00\xff\xff\x24\x00\x25\x00\x26\x00\x27\x00\x0f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\xff\xff\xff\xff\xff\xff\x24\x00\x25\x00\x26\x00\x27\x00\x36\x00\x37\x00\xff\xff\x36\x00\x37\x00\x3b\x00\xff\xff\x3d\x00\x3b\x00\xff\xff\x3d\x00\x41\x00\xff\xff\x43\x00\x41\x00\x45\x00\x43\x00\xff\xff\x45\x00\x36\x00\x37\x00\xff\xff\x4c\x00\xff\xff\x3b\x00\x4c\x00\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\xff\xff\x43\x00\xff\xff\x45\x00\x36\x00\x37\x00\xff\xff\x36\x00\x37\x00\x3b\x00\x4c\x00\xff\xff\x3b\x00\xff\xff\xff\xff\x41\x00\xff\xff\x43\x00\x41\x00\x45\x00\x43\x00\xff\xff\x45\x00\x36\x00\x37\x00\xff\xff\x4c\x00\xff\xff\x3b\x00\x4c\x00\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\xff\xff\x43\x00\xff\xff\x45\x00\x36\x00\x37\x00\xff\xff\x36\x00\x37\x00\x3b\x00\x4c\x00\xff\xff\x3b\x00\xff\xff\xff\xff\x41\x00\xff\xff\x43\x00\x41\x00\x45\x00\x43\x00\xff\xff\x45\x00\xff\xff\xff\xff\xff\xff\x4c\x00\xff\xff\xff\xff\x4c\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\x6f\x02\x78\x02\x97\x02\xdb\x01\x10\x00\x77\x01\xc1\x01\x33\x02\x19\x02\x79\x00\x11\x00\x1f\x02\x87\x02\xc1\x01\xdc\x01\x7a\x00\x49\x02\x49\x01\x17\x01\xe2\x00\x14\x00\x15\x00\x16\x00\x17\x00\xdb\x00\x19\x00\x1a\x00\x1b\x00\xbb\x01\x7d\x00\xf8\x01\xcb\x01\xbb\x01\xcc\x01\x33\x00\xbc\x01\xbd\x01\x77\x01\xc1\x01\x86\x01\x79\x00\x0b\x02\x91\x01\xee\x01\x1a\x01\x49\x01\x7a\x00\x49\x02\xdb\x01\xb9\x01\x76\x00\x4d\x02\x88\x02\x77\x00\x05\x00\x06\x00\x0e\x00\x85\x02\xfa\x01\xdc\x01\xe3\x00\xba\x01\x1a\x02\x0f\x00\x10\x00\xe4\x00\x20\x02\xc2\x01\x33\x00\xe5\x00\x11\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\x70\x02\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\x19\x00\x1a\x00\xd1\x00\x5d\x02\x07\x00\xf3\x00\x5e\x02\xcd\x01\xf4\x00\xf5\x00\xbe\x01\x1b\x02\x7d\x02\xf6\x00\xc2\x01\xf7\x00\x8a\x01\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x00\x01\x01\x01\x02\x01\x2c\x02\x92\x01\xc3\x01\x6b\x02\x10\x00\x33\x00\x07\x00\x08\x00\x71\x02\x10\x00\x11\x00\x72\x02\x92\x02\x09\x00\x0a\x00\x4a\x02\x0b\x00\x87\x01\x0c\x00\xe2\x00\x14\x00\x15\x00\x16\x00\x17\x00\xdb\x00\x19\x00\x1a\x00\x1b\x00\x52\x00\xce\x01\x10\x00\xbf\x01\x07\x00\x08\x00\xc3\x01\x10\x00\x11\x00\x1c\x02\x7b\x02\x09\x00\x0a\x00\x11\x00\x0b\x00\x91\x01\x0c\x00\x33\x00\x82\xff\x1d\x02\x79\x00\x33\x00\x34\x00\x19\x00\x1a\x00\xd1\x00\x7a\x00\x7c\x00\x19\x00\x1a\x00\xd1\x00\x82\xff\xe3\x00\x77\x01\xc1\x01\xbb\x01\x10\x00\xe4\x00\xcb\x01\x46\x00\xcc\x01\xe5\x00\x11\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\x31\x01\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\x19\x00\x1a\x00\xd1\x00\x2e\x02\x07\x00\xf3\x00\x2e\x02\xbb\x01\xf4\x00\xf5\x00\xbc\x01\xbd\x01\x2e\x02\xf6\x00\x58\x01\xf7\x00\x1e\x02\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x00\x01\x01\x01\x02\x01\x10\x00\x34\x02\x92\x01\x5a\x01\xa6\x01\x34\x02\x11\x00\x58\x01\x68\x02\xa7\x01\x46\x02\x03\x01\xd0\x01\xd1\x01\x56\x02\xe2\x00\x14\x00\x15\x00\x16\x00\x17\x00\xdb\x00\x19\x00\x1a\x00\x1b\x00\x5a\x01\xd2\x01\x10\x00\xd3\x01\x2f\x02\x30\x02\x31\x02\x2f\x02\x11\x00\x7f\x02\x33\x00\x89\x01\x69\x01\x2f\x02\xd2\x00\x33\x02\x6d\x02\x78\x00\x44\x02\xf1\x01\x16\x00\x17\x00\x2a\x01\x19\x00\x1a\x00\x1b\x00\x9d\x02\x8f\x01\x33\x00\x80\x02\x36\x02\x37\x02\xe3\x00\x35\x02\x36\x02\x37\x02\x10\x00\xe4\x00\xf2\x01\xf3\x01\xf4\x01\xe5\x00\x11\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\x95\x02\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\x19\x00\x1a\x00\xd9\x00\x49\x01\x07\x00\xf3\x00\x17\x01\x7e\x02\xf4\x00\xf5\x00\x81\x02\x17\x01\x21\x00\xf6\x00\x42\x00\xf7\x00\x43\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x00\x01\x01\x01\x02\x01\x10\x00\x22\x00\x65\x01\x19\x01\x1a\x01\x82\x02\x11\x00\x18\x01\x19\x01\x1a\x01\x58\x01\x96\x02\x23\x00\x24\x00\x25\x00\xe2\x00\x14\x00\x15\x00\x16\x00\x17\x00\xdb\x00\x19\x00\x1a\x00\x1b\x00\x59\x01\x39\x02\x46\x00\x5a\x01\x3d\x02\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x34\x01\x10\x00\x85\x02\x2b\x00\x2c\x00\x07\x00\x08\x00\x11\x00\x2d\x00\x2e\x00\x3f\x02\x2f\x00\x7e\x00\x0a\x00\x30\x00\x10\x00\x31\x00\x42\x00\x32\x00\x43\x00\x53\x02\x11\x00\xe3\x00\x83\x01\x4d\x02\x33\x00\x34\x00\xe4\x00\x35\x00\x5b\x02\x86\x02\xe5\x00\x63\x02\xe6\x00\xe7\x00\xe8\x00\xe9\x00\x66\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\x79\x00\x42\x00\x5f\x02\x43\x00\x07\x00\xf3\x00\x7a\x00\xd0\x00\xf4\x00\xf5\x00\x10\x00\xfc\x01\x21\x00\xf6\x00\xff\x01\xf7\x00\x11\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x00\x01\x01\x01\x02\x01\x10\x00\x22\x00\x73\x00\x19\x00\x1a\x00\xdf\x01\x11\x00\xa9\x01\xa0\x01\xa1\x01\x01\x02\x9c\x02\x23\x00\x24\x00\x25\x00\xe2\x00\x14\x00\x15\x00\x16\x00\x17\x00\xdb\x00\x19\x00\x1a\x00\x1b\x00\xbb\x01\x02\x02\x46\x00\xbc\x01\x0c\x02\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\xd3\x01\x0b\x02\x9d\x01\x2b\x00\x2c\x00\x46\x01\x0e\x00\x03\x02\x2d\x00\x2e\x00\x78\x00\x2f\x00\x46\x00\x0f\x00\x30\x00\x46\x00\x31\x00\x42\x00\x32\x00\x43\x00\xd3\x01\xd4\x01\xe3\x00\xd3\x01\xd5\x01\x33\x00\x34\x00\xe4\x00\x35\x00\x98\x02\x8f\x01\xe5\x00\x4a\x01\xe6\x00\xe7\x00\xe8\x00\xe9\x00\x78\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\x79\x00\x42\x00\x05\x02\x43\x00\x07\x00\xf3\x00\x7a\x00\x7b\x00\xf4\x00\xf5\x00\x10\x00\x06\x02\x21\x00\xf6\x00\x0e\x02\xf7\x00\x11\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x00\x01\x01\x01\x02\x01\x10\x00\x22\x00\xde\x01\x19\x00\x1a\x00\xdf\x01\x11\x00\xd7\x01\xd8\x01\xd9\x01\x29\x02\x94\x02\x23\x00\x24\x00\x25\x00\xe2\x00\x14\x00\x15\x00\x16\x00\x17\x00\xdb\x00\x19\x00\x1a\x00\x1b\x00\xbb\x01\x2a\x02\x46\x00\xbc\x01\x0d\x02\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\xd3\x01\xd6\x01\xbb\x01\x2b\x00\x2c\x00\xcb\x01\x79\x00\x8e\x02\x2d\x00\x2e\x00\xad\x01\x2f\x00\x7a\x00\x7c\x00\x30\x00\xae\x01\x31\x00\x42\x00\x32\x00\x43\x00\xb3\x01\x10\x02\xe3\x00\x11\x02\xb7\x01\x33\x00\x34\x00\xe4\x00\x35\x00\xc4\x01\x33\x00\xe5\x00\xe0\x01\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xe1\x01\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\x12\x02\x4d\x02\x13\x02\xe3\x01\x07\x00\xf3\x00\xe4\x01\x4e\x02\xf4\x00\xf5\x00\x10\x00\xe5\x01\x21\x00\xf6\x00\xf6\x01\xf7\x00\x11\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x00\x01\x01\x01\x02\x01\x10\x00\x22\x00\x4d\x02\x19\x00\x1a\x00\x55\x00\x11\x00\xe6\x01\x51\x02\x99\x02\x9a\x02\x03\x01\x23\x00\x24\x00\x25\x00\xe2\x00\x14\x00\x15\x00\x16\x00\x17\x00\xdb\x00\x19\x00\x1a\x00\x1b\x00\x83\x02\x9e\x01\x9f\x01\xa0\x01\xa1\x01\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x9b\x02\x8f\x01\xbb\x01\x2b\x00\x2c\x00\xbc\x01\x28\x02\x52\x00\x2d\x00\x2e\x00\xe7\x01\x2f\x00\xe9\x01\xe0\x00\x30\x00\x33\x01\x31\x00\x34\x01\x32\x00\x3d\x00\x89\x02\x8f\x01\xe3\x00\xf8\x01\x33\x00\x33\x00\x34\x00\xba\x01\x35\x00\x8a\x02\x8b\x02\xe5\x00\xfa\x01\xe6\x00\xe7\x00\xe8\x00\xe9\x00\x5d\x01\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\x56\x01\x2b\x00\x6e\x00\x5a\x01\x07\x00\xf3\x00\x8c\x02\x8d\x02\xf4\x00\xf5\x00\xaf\x01\x48\x02\x64\x00\xf6\x00\x6f\x00\xf7\x00\x70\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x00\x01\x01\x01\x02\x01\x91\x01\x21\x00\xa3\x01\xa4\x01\xa5\x01\x60\x01\x05\x01\x06\x01\x07\x01\xc3\xfe\x7a\x02\x9e\x01\x9f\x01\xa0\x01\xa1\x01\x08\x01\x09\x01\x0a\x01\x0b\x01\x74\x02\x75\x02\x76\x02\x0c\x01\x0d\x01\x0e\x01\x0f\x01\x10\x01\x11\x01\x12\x01\x23\x00\x24\x00\x63\x01\x13\x01\x14\x01\x52\x00\x79\x01\xbb\x01\xaf\x01\x4b\x02\xcb\x01\x5b\x00\x8f\x02\x36\x01\x75\x01\x37\x01\x7d\x01\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x33\x00\xe0\x00\x15\x01\xe1\x00\x57\x00\xe2\x00\x7a\x01\xbb\x01\x2d\x00\x2e\x00\xcb\x01\x2f\x00\x90\x02\x7f\x01\x68\x00\x7b\x01\x69\x00\xbb\x01\x75\x00\x7c\x01\xcb\x01\x92\x01\x91\x02\x16\x01\x80\x01\x33\x00\x34\x00\x84\x01\x35\x00\x91\x01\x21\x00\x77\x01\x57\x02\x77\x01\x58\x02\x05\x01\x06\x01\x07\x01\xc3\xfe\x78\xff\x85\x01\x78\xff\x46\x00\x78\xff\x08\x01\x09\x01\x0a\x01\x0b\x01\x77\x01\x59\x02\x47\x00\x0c\x01\x0d\x01\x0e\x01\x0f\x01\x10\x01\x11\x01\x12\x01\x23\x00\x24\x00\xbb\x01\x13\x01\x14\x01\xcb\x01\xbb\x01\x69\x02\x81\x01\xcb\x01\xbb\x01\x6a\x02\x8a\x01\xcb\x01\x5e\x00\x16\x02\x8c\x01\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x77\x01\x5a\x02\x15\x01\x1e\x01\x57\x00\x61\x00\x62\x00\x92\x01\x2d\x00\x2e\x00\x97\x01\x2f\x00\x43\x01\x5b\x00\x68\x00\x5c\x00\x69\x00\x5d\x00\x75\x00\x09\x02\xd9\x01\x92\x01\x95\x01\x16\x01\xd7\x00\x33\x00\x34\x00\x44\x01\x35\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\x21\x00\x13\x02\x14\x02\x22\x02\x23\x02\x05\x01\x06\x01\x07\x01\x80\x00\x25\x02\x26\x02\x5d\x00\x46\x00\x6a\x00\x08\x01\x09\x01\x0a\x01\x0b\x01\x74\x02\x04\x00\x47\x00\x0c\x01\x0d\x01\x0e\x01\x0f\x01\x10\x01\x11\x01\x12\x01\x23\x00\x24\x00\x94\x02\x13\x01\x14\x01\x2d\x02\x9e\x01\x9f\x01\xa0\x01\xa1\x01\x50\x02\xa3\x01\xa4\x01\xa5\x01\x5e\x00\xa6\x01\x55\x02\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\xaf\x01\xb0\x01\x15\x01\x21\x01\x57\x00\x61\x00\x62\x00\x33\x00\x2d\x00\x2e\x00\xdc\x01\x2f\x00\x77\x01\xdd\x01\x68\x00\x21\x00\x69\x00\x67\x02\x75\x00\x68\x02\x05\x01\x06\x01\x07\x01\x16\x01\x77\x02\x33\x00\x34\x00\xdc\x01\x35\x00\x08\x01\x09\x01\x0a\x01\x0b\x01\x77\x01\x78\x01\x6d\x02\x0c\x01\x0d\x01\x0e\x01\x0f\x01\x10\x01\x11\x01\x12\x01\x23\x00\x24\x00\x6f\x02\x13\x01\x14\x01\xa8\x01\x9e\x01\x9f\x01\xa0\x01\xa1\x01\x78\x02\x8e\x01\x8f\x01\x7a\x02\x46\x00\x6c\x00\x1f\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x47\x00\x6c\x00\x15\x01\x21\x00\x57\x00\x35\x00\x04\x00\x39\x02\x2d\x00\x2e\x00\x33\x00\x2f\x00\x33\x00\x34\x00\x68\x00\x33\x00\x69\x00\x3b\x02\x75\x00\x3c\x02\x22\x00\x10\x00\xd4\x00\x16\x01\x3d\x02\x33\x00\x34\x00\x11\x00\x35\x00\x94\x01\x95\x01\x23\x00\x24\x00\x25\x00\x21\x02\xd6\x00\x62\x00\xda\x00\x15\x00\x16\x00\x17\x00\xdb\x00\x19\x00\x1a\x00\x1b\x00\x3f\x02\x21\x00\x33\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x33\x00\x34\x00\x41\x02\x2b\x00\x2c\x00\x43\x02\x42\x02\xd9\x00\x2d\x00\x2e\x00\x22\x00\x2f\x00\x48\x02\x33\x00\x30\x00\x46\x00\x31\x00\xb2\x01\x32\x00\x50\x02\x33\x00\x23\x00\x24\x00\x25\x00\x55\x02\x33\x00\x34\x00\x5d\x02\x35\x00\x9d\x01\x9e\x01\x9f\x01\xa0\x01\xa1\x01\xdc\x01\x61\x02\x21\x00\x62\x02\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x63\x02\x65\x02\x66\x02\x2b\x00\x2c\x00\xfe\x01\xe3\x01\xd9\x00\x2d\x00\x2e\x00\x22\x00\x2f\x00\xff\x01\x01\x02\x30\x00\x05\x02\x31\x00\xd9\x00\x32\x00\x3d\x00\xb5\x01\x23\x00\x24\x00\x25\x00\x77\x01\x33\x00\x34\x00\x09\x02\x35\x00\x16\x02\x21\x02\x25\x02\x33\x00\x28\x02\x33\x00\x6c\x00\x21\x00\x39\x02\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\xab\x01\xac\x01\xad\x01\x2b\x00\x2c\x00\xa5\x01\xb5\x01\xe9\x01\x2d\x00\x2e\x00\x22\x00\x2f\x00\xb2\x01\xdd\x01\x30\x00\x46\x00\x31\x00\x97\x01\x32\x00\x33\x00\x33\x00\x23\x00\x24\x00\x25\x00\xe3\x01\x33\x00\x34\x00\xeb\x01\x35\x00\xe3\x01\xf0\x01\xec\x01\xed\x01\x33\x00\xfc\x01\x3e\xff\x21\x00\x3f\xff\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x3b\xff\x39\xff\x5f\x01\x2b\x00\x2c\x00\x3a\xff\x5c\x01\x62\x01\x2d\x00\x2e\x00\x22\x00\x2f\x00\x5d\x01\x60\x01\x30\x00\x69\x01\x31\x00\x67\x01\x32\x00\x3d\x00\x77\x01\x23\x00\x24\x00\x25\x00\x65\x01\x33\x00\x34\x00\x33\x00\x35\x00\x33\x00\x68\x01\x7f\x01\x97\x01\x6c\x00\x83\x01\x8c\x01\x21\x00\x8e\x01\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x33\x00\x77\x00\x9b\x01\x2b\x00\x2c\x00\xd9\x00\x99\x01\xd9\x00\x2d\x00\x2e\x00\x22\x00\x2f\x00\x17\x01\x10\x00\x30\x00\x46\x00\x31\x00\x33\x00\x32\x00\x11\x00\x1c\x01\x23\x00\x24\x00\x25\x00\x20\x01\x33\x00\x34\x00\x21\x00\x35\x00\x23\x01\x72\x00\x16\x00\x17\x00\x73\x00\x19\x00\x1a\x00\x1b\x00\x3e\x01\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x41\x01\x22\x00\x42\x01\x2b\x00\x2c\x00\x43\x01\xff\xff\x47\x01\x2d\x00\x2e\x00\x48\x01\x2f\x00\x23\x00\x24\x00\x30\x00\x49\x01\x31\x00\x6c\x00\x32\x00\x33\x00\x71\x00\x79\x00\xff\xff\x78\x00\x80\x00\x33\x00\x34\x00\x21\x00\x35\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\xff\xff\x00\x00\x00\x00\x00\x00\x57\x00\x00\x00\x00\x00\x00\x00\x2d\x00\x2e\x00\x22\x00\x2f\x00\x00\x00\x00\x00\x68\x00\x00\x00\x69\x00\x42\x00\x75\x00\x43\x00\x00\x00\x23\x00\x24\x00\x25\x00\x00\x00\x33\x00\x34\x00\x21\x00\x35\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x00\x00\x22\x00\x00\x00\x2b\x00\x2c\x00\x00\x00\x00\x00\x00\x00\x2d\x00\x2e\x00\x00\x00\x2f\x00\x23\x00\x24\x00\x30\x00\x00\x00\x31\x00\x00\x00\x32\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x33\x00\x34\x00\x21\x00\x35\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x57\x00\x00\x00\x00\x00\x00\x00\x2d\x00\x2e\x00\x22\x00\x2f\x00\x00\x00\x00\x00\x68\x00\x00\x00\x69\x00\x42\x00\x75\x00\x43\x00\x00\x00\x23\x00\x24\x00\x25\x00\x00\x00\x33\x00\x34\x00\x21\x00\x35\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x00\x00\x22\x00\x00\x00\x2b\x00\x2c\x00\x00\x00\x00\x00\x00\x00\x2d\x00\x2e\x00\x00\x00\x2f\x00\x23\x00\x24\x00\x30\x00\x00\x00\x31\x00\x00\x00\x32\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x33\x00\x34\x00\x00\x00\x35\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x00\x00\x00\x00\x21\x00\x00\x00\x57\x00\x00\x00\x00\x00\x00\x00\x2d\x00\x2e\x00\x6e\xff\x2f\x00\x00\x00\x6e\xff\x68\x00\x46\x00\x69\x00\x00\x00\x75\x00\x22\x00\x00\x00\x10\x00\x00\x00\x47\x00\x00\x00\x33\x00\x34\x00\x11\x00\x35\x00\x00\x00\x23\x00\x24\x00\x25\x00\x00\x00\x00\x00\x00\x00\x21\x00\x00\x00\x72\x00\x16\x00\x17\x00\x00\x00\x19\x00\x1a\x00\xde\x00\xd4\x00\x00\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x00\x00\x22\x00\x00\x00\x2b\x00\x2c\x00\xc5\x01\xd6\x00\x62\x00\x2d\x00\x2e\x00\x00\x00\x2f\x00\x23\x00\x24\x00\x30\x00\x00\x00\x31\x00\x00\x00\x32\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x33\x00\x34\x00\x21\x00\x35\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x57\x00\x46\x00\x00\x00\x00\x00\x2d\x00\x2e\x00\x22\x00\x2f\x00\x00\x00\x47\x00\x68\x00\x00\x00\x69\x00\x00\x00\x75\x00\x4e\x01\x00\x00\x23\x00\x24\x00\x46\x00\x00\x00\x33\x00\x34\x00\x21\x00\x35\x00\x00\x00\x00\x00\x47\x00\x00\x00\x00\x00\x00\x00\x5e\x00\x00\x00\x00\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x00\x00\x22\x00\x5f\x00\x60\x00\x57\x00\x61\x00\x62\x00\x00\x00\x2d\x00\x2e\x00\xd4\x00\x2f\x00\x23\x00\x24\x00\x68\x00\x50\x01\x69\x00\x00\x00\x75\x00\x00\x00\x00\x00\x00\x00\xc6\x01\xd6\x00\x62\x00\x33\x00\x34\x00\x21\x00\x35\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x00\x00\x00\x00\x50\x00\x51\x00\x57\x00\x00\x00\x00\x00\x52\x00\x2d\x00\x2e\x00\x22\x00\x2f\x00\x00\x00\x64\x00\x68\x00\x65\x00\x69\x00\x66\x00\x75\x00\x2f\x01\x00\x00\x23\x00\x24\x00\x00\x00\x33\x00\x33\x00\x34\x00\x21\x00\x35\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x00\x00\x22\x00\x00\x00\x00\x00\x57\x00\x00\x00\x00\x00\x00\x00\x2d\x00\x2e\x00\x00\x00\x2f\x00\x23\x00\x24\x00\x68\x00\x31\x01\x69\x00\x00\x00\x75\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x22\x00\x33\x00\x34\x00\x00\x00\x35\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x00\x00\x23\x00\x24\x00\x00\x00\x57\x00\x00\x00\x00\x00\x00\x00\x2d\x00\x2e\x00\x00\x00\x2f\x00\x00\x00\x00\x00\x68\x00\x00\x00\x69\x00\x00\x00\x75\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x22\x00\x00\x00\x33\x00\x34\x00\x57\x00\x35\x00\x00\x00\x00\x00\x2d\x00\x2e\x00\x00\x00\x23\x00\x24\x00\x00\x00\x68\x00\x00\x00\x7d\x02\x00\x00\x75\x00\x00\x00\x00\x00\x00\x00\x00\x00\x22\x00\x00\x00\x33\x00\x34\x00\x00\x00\x35\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x00\x00\x23\x00\x24\x00\x00\x00\x57\x00\x00\x00\x00\x00\x00\x00\x2d\x00\x2e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x68\x00\x00\x00\x69\x00\x00\x00\x75\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x22\x00\x00\x00\x33\x00\x34\x00\x57\x00\x35\x00\x00\x00\x00\x00\x2d\x00\x2e\x00\x00\x00\x23\x00\x24\x00\x00\x00\x68\x00\x00\x00\x69\x00\x00\x00\x6a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x22\x00\x00\x00\x33\x00\x34\x00\x00\x00\x35\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x00\x00\x23\x00\x24\x00\x00\x00\x57\x00\x00\x00\x00\x00\x00\x00\x2d\x00\x2e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x68\x00\x00\x00\x69\x00\x00\x00\x75\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x22\x00\x00\x00\x33\x00\x34\x00\x57\x00\x35\x00\x00\x00\x00\x00\x2d\x00\x2e\x00\x00\x00\x23\x00\x24\x00\x00\x00\x68\x00\x00\x00\xd4\x00\x00\x00\x75\x00\x00\x00\x00\x00\x00\x00\x00\x00\x22\x00\x00\x00\x33\x00\x34\x00\x00\x00\x35\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x00\x00\x23\x00\x24\x00\x46\x00\x57\x00\x00\x00\x00\x00\x00\x00\x2d\x00\x2e\x00\x00\x00\x47\x00\x00\x00\x00\x00\x68\x00\x00\x00\x69\x00\x00\x00\x75\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x22\x00\x00\x00\x33\x00\x34\x00\x57\x00\x35\x00\x00\x00\x00\x00\x2d\x00\x2e\x00\xd4\x00\x23\x00\x24\x00\x00\x00\x58\x00\x00\x00\x59\x00\x00\x00\x5a\x00\x00\x00\x00\x00\x00\x00\xc7\x01\xd6\x00\x62\x00\x33\x00\x34\x00\x00\x00\x35\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x00\x00\x00\x00\x46\x00\x00\x00\x57\x00\x00\x00\x00\x00\x00\x00\x2d\x00\x2e\x00\x47\x00\x46\x00\x00\x00\x00\x00\x68\x00\x00\x00\x69\x00\x00\x00\x6a\x00\x47\x00\x00\x00\x46\x00\x00\x00\x00\x00\x00\x00\x33\x00\x34\x00\x00\x00\x35\x00\x47\x00\x00\x00\x00\x00\x48\x00\x00\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x00\x00\x46\x00\x00\x00\xd4\x00\x46\x00\x00\x00\x00\x00\x4d\x00\x4e\x00\x47\x00\x46\x00\x00\x00\x47\x00\xd4\x00\x00\x00\xc8\x01\xd6\x00\x62\x00\x47\x00\x00\x00\x46\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc9\x01\xd6\x00\x62\x00\x47\x00\x46\x00\x00\x00\x37\x01\x00\x00\x00\x00\x37\x01\x50\x01\x00\x00\x47\x00\x51\x01\x00\x00\xd4\x00\x00\x00\x00\x00\x00\x00\x39\x01\x62\x00\x00\x00\x39\x01\x62\x00\x46\x00\xd4\x00\x00\x00\x99\x01\xd6\x00\x62\x00\x00\x00\x00\x00\x47\x00\x00\x00\xd4\x00\x46\x00\x00\x00\x9b\x01\xd6\x00\x62\x00\x00\x00\x00\x00\x00\x00\x47\x00\x00\x00\x00\x00\xd5\x00\xd6\x00\x62\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x37\x01\x00\x00\x00\x00\x00\x00\x38\x01\x11\x00\x00\x00\x00\x00\x00\x00\x37\x00\x1c\x01\x37\x01\x00\x00\x39\x01\x62\x00\x3f\x01\x29\x01\x16\x00\x17\x00\x2a\x01\x19\x00\x1a\x00\x1b\x00\x10\x00\x39\x01\x62\x00\x00\x00\x00\x00\x00\x00\x11\x00\x3b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2b\x01\x2c\x01\x00\x00\x2d\x01\x00\x00\xf1\x01\x16\x00\x17\x00\x2a\x01\x19\x00\x1a\x00\x1b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3d\x00\x00\x00\x3e\x00\x00\x00\x00\x00\x00\x00\x11\x00\xf2\x01\xf3\x01\xf5\x01\x37\x00\x38\x00\x00\x00\x00\x00\x3f\x00\x13\x00\x14\x00\x3a\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x00\x00\x00\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x27\x01\x3d\x00\x00\x00\x3e\x00\x00\x00\x00\x00\x00\x00\x11\x00\x00\x00\x00\x00\x00\x00\x37\x00\x38\x00\x00\x00\x00\x00\x3f\x00\x13\x00\x14\x00\x3a\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x00\x00\x00\x00\x36\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x40\x00\x11\x00\x00\x00\x00\x00\x00\x00\x37\x00\x38\x00\x00\x00\x00\x00\x39\x00\x13\x00\x14\x00\x3a\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x00\x00\x00\x00\x10\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x26\x01\x11\x00\x00\x00\x00\x00\x00\x00\x37\x00\x38\x00\x00\x00\x00\x00\x43\x00\x13\x00\x14\x00\x3a\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x00\x00\x00\x00\x36\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x28\x01\x11\x00\x00\x00\x00\x00\x00\x00\x37\x00\x38\x00\x00\x00\x00\x00\x39\x00\x13\x00\x14\x00\x3a\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x00\x00\x00\x00\x10\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x3b\x00\x11\x00\x00\x00\x00\x00\x00\x00\x37\x00\x38\x00\x00\x00\x00\x00\x43\x00\x13\x00\x14\x00\x3a\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x00\x00\x00\x00\x17\x02\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x44\x00\x11\x00\x00\x00\x00\x00\x00\x00\x37\x00\x1c\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xdd\x00\x16\x00\x17\x00\x00\x00\x19\x00\x1a\x00\xde\x00\x65\x01\x19\x01\x1a\x01\x10\x00\x00\x00\x4e\x01\x00\x00\x3b\x00\x00\x00\x11\x00\x00\x00\x00\x00\x00\x00\x1d\x01\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xdd\x00\x16\x00\x17\x00\x00\x00\x19\x00\x1a\x00\xde\x00\x10\x00\x00\x00\x2f\x01\x00\x00\x00\x00\x00\x00\x11\x00\x40\x00\x00\x00\x00\x00\x1d\x01\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xdd\x00\x16\x00\x17\x00\x00\x00\x19\x00\x1a\x00\xde\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x11\x00\x40\x00\x00\x00\x00\x00\x37\x00\x1c\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xdd\x00\x16\x00\x17\x00\x00\x00\x19\x00\x1a\x00\xde\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x11\x00\x3b\x00\x00\x00\x00\x00\x37\x00\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xdd\x00\x16\x00\x17\x00\x00\x00\x19\x00\x1a\x00\xde\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x11\x00\x44\x00\x00\x00\x00\x00\x52\x01\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xdd\x00\x16\x00\x17\x00\x00\x00\x19\x00\x1a\x00\xde\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x11\x00\x23\x01\x00\x00\x00\x00\x53\x01\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xdd\x00\x16\x00\x17\x00\x00\x00\x19\x00\x1a\x00\xde\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x11\x00\x24\x01\x00\x00\x00\x00\x54\x01\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xdd\x00\x16\x00\x17\x00\x00\x00\x19\x00\x1a\x00\xde\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x11\x00\x26\x01\x00\x00\x00\x00\x55\x01\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xdd\x00\x16\x00\x17\x00\x00\x00\x19\x00\x1a\x00\xde\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x11\x00\x27\x01\x00\x00\x00\x00\x37\x00\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xdd\x00\x16\x00\x17\x00\x00\x00\x19\x00\x1a\x00\xde\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x11\x00\x26\x01\x00\x00\x00\x00\x37\x00\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xdd\x00\x16\x00\x17\x00\x00\x00\x19\x00\x1a\x00\xde\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x11\x00\x27\x01\x00\x00\x00\x00\x37\x00\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xdd\x00\x16\x00\x17\x00\x00\x00\x19\x00\x1a\x00\xde\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x11\x00\x28\x01\x00\x00\x00\x00\x37\x00\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xdd\x00\x16\x00\x17\x00\x00\x00\x19\x00\x1a\x00\xde\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x11\x00\x3b\x00\x00\x00\x00\x00\x37\x00\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xdd\x00\x16\x00\x17\x00\x00\x00\x19\x00\x1a\x00\xde\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x11\x00\x40\x00\x00\x00\x00\x00\x37\x00\x1c\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xdd\x00\x16\x00\x17\x00\x00\x00\x19\x00\x1a\x00\xde\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x11\x00\x3b\x00\x00\x00\x00\x00\x1d\x01\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xdd\x00\x16\x00\x17\x00\x00\x00\x19\x00\x1a\x00\xde\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x11\x00\x40\x00\x00\x00\x00\x00\x37\x00\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xdd\x00\x16\x00\x17\x00\x00\x00\x19\x00\x1a\x00\xde\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x11\x00\x44\x00\x00\x00\x00\x00\x37\x00\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xdd\x00\x16\x00\x17\x00\x00\x00\x19\x00\x1a\x00\xde\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x11\x00\x23\x01\x00\x00\x00\x00\x37\x00\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xdd\x00\x16\x00\x17\x00\x00\x00\x19\x00\x1a\x00\xde\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x11\x00\x24\x01\x00\x00\x00\x00\x37\x00\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xdd\x00\x16\x00\x17\x00\x00\x00\x19\x00\x1a\x00\xde\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x11\x00\x25\x01\x00\x00\x00\x00\x37\x00\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xdd\x00\x16\x00\x17\x00\x00\x00\x19\x00\x1a\x00\xde\x00\x3d\x00\x00\x00\x3e\x00\x00\x00\x00\x00\x00\x00\x11\x00\x44\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3f\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x00\x00\x10\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x11\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x43\x02\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x00\x00\x10\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x11\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x45\x02\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x00\x00\x10\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x11\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4c\x02\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x00\x00\x10\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x11\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x50\x02\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x00\x00\x10\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x11\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x52\x02\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x00\x00\x10\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x11\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x55\x02\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x00\x00\x10\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x11\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x02\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x00\x00\x10\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x11\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2b\x02\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x00\x00\x10\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x11\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb2\x01\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x00\x00\x10\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x11\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb5\x01\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x00\x00\x10\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x11\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb6\x01\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x00\x00\x10\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x11\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xed\x01\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x00\x00\x10\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x11\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf0\x01\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x00\x00\x10\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x11\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4a\x01\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x00\x00\x10\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x11\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4b\x01\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x00\x00\x10\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x11\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4c\x01\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x00\x00\x10\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x11\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x62\x01\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x00\x00\x10\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x11\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x69\x01\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x00\x00\x10\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x11\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xdc\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x00\x00\x36\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x11\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x39\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x00\x00\x10\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x11\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x43\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x00\x00\x10\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x11\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x01\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x00\x00\x10\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x11\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3e\x01\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x00\x00\x10\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x11\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x71\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x00\x00\x10\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x11\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x00\x00\x00\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x22\xff\x22\xff\x00\x00\x50\x00\x51\x00\x22\xff\x00\x00\x22\xff\x52\x00\x00\x00\x3c\xff\x22\xff\x00\x00\x22\xff\x3b\x01\x22\xff\x3c\x01\x00\x00\x3d\x01\x50\x00\x51\x00\x00\x00\x22\xff\x00\x00\x52\x00\x33\x00\x00\x00\x00\x00\x00\x00\x00\x00\x64\x00\x00\x00\x65\x00\x00\x00\xcb\x01\x50\x00\x51\x00\x00\x00\x50\x00\x51\x00\x52\x00\x33\x00\x00\x00\x52\x00\x00\x00\x00\x00\x3b\x01\x00\x00\x3c\x01\x64\x00\x3d\x01\x65\x00\x00\x00\x66\x00\x50\x00\x51\x00\x00\x00\x33\x00\x00\x00\x52\x00\x33\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3b\x01\x00\x00\x3c\x01\x00\x00\x3d\x01\x50\x00\x51\x00\x00\x00\x50\x00\x51\x00\x52\x00\x33\x00\x00\x00\x52\x00\x00\x00\x00\x00\x53\x00\x00\x00\x54\x00\x64\x00\x55\x00\x65\x00\x00\x00\x66\x00\x00\x00\x00\x00\x00\x00\x33\x00\x00\x00\x00\x00\x33\x00\x6b\x01\x6c\x01\x6d\x01\x6e\x01\x6f\x01\x70\x01\x71\x01\x72\x01\x73\x01\x74\x01\x75\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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 (3, 382) [+ (3 , happyReduce_3),+ (4 , happyReduce_4),+ (5 , happyReduce_5),+ (6 , happyReduce_6),+ (7 , happyReduce_7),+ (8 , happyReduce_8),+ (9 , happyReduce_9),+ (10 , happyReduce_10),+ (11 , happyReduce_11),+ (12 , happyReduce_12),+ (13 , happyReduce_13),+ (14 , happyReduce_14),+ (15 , happyReduce_15),+ (16 , happyReduce_16),+ (17 , happyReduce_17),+ (18 , happyReduce_18),+ (19 , happyReduce_19),+ (20 , happyReduce_20),+ (21 , happyReduce_21),+ (22 , happyReduce_22),+ (23 , happyReduce_23),+ (24 , happyReduce_24),+ (25 , happyReduce_25),+ (26 , happyReduce_26),+ (27 , happyReduce_27),+ (28 , happyReduce_28),+ (29 , happyReduce_29),+ (30 , happyReduce_30),+ (31 , happyReduce_31),+ (32 , happyReduce_32),+ (33 , happyReduce_33),+ (34 , happyReduce_34),+ (35 , happyReduce_35),+ (36 , happyReduce_36),+ (37 , happyReduce_37),+ (38 , happyReduce_38),+ (39 , happyReduce_39),+ (40 , happyReduce_40),+ (41 , happyReduce_41),+ (42 , happyReduce_42),+ (43 , happyReduce_43),+ (44 , happyReduce_44),+ (45 , happyReduce_45),+ (46 , happyReduce_46),+ (47 , happyReduce_47),+ (48 , happyReduce_48),+ (49 , happyReduce_49),+ (50 , happyReduce_50),+ (51 , happyReduce_51),+ (52 , happyReduce_52),+ (53 , happyReduce_53),+ (54 , happyReduce_54),+ (55 , happyReduce_55),+ (56 , happyReduce_56),+ (57 , happyReduce_57),+ (58 , happyReduce_58),+ (59 , happyReduce_59),+ (60 , happyReduce_60),+ (61 , happyReduce_61),+ (62 , happyReduce_62),+ (63 , happyReduce_63),+ (64 , happyReduce_64),+ (65 , happyReduce_65),+ (66 , happyReduce_66),+ (67 , happyReduce_67),+ (68 , happyReduce_68),+ (69 , happyReduce_69),+ (70 , happyReduce_70),+ (71 , happyReduce_71),+ (72 , happyReduce_72),+ (73 , happyReduce_73),+ (74 , happyReduce_74),+ (75 , happyReduce_75),+ (76 , happyReduce_76),+ (77 , happyReduce_77),+ (78 , happyReduce_78),+ (79 , happyReduce_79),+ (80 , happyReduce_80),+ (81 , happyReduce_81),+ (82 , happyReduce_82),+ (83 , happyReduce_83),+ (84 , happyReduce_84),+ (85 , happyReduce_85),+ (86 , happyReduce_86),+ (87 , happyReduce_87),+ (88 , happyReduce_88),+ (89 , happyReduce_89),+ (90 , happyReduce_90),+ (91 , happyReduce_91),+ (92 , happyReduce_92),+ (93 , happyReduce_93),+ (94 , happyReduce_94),+ (95 , happyReduce_95),+ (96 , happyReduce_96),+ (97 , happyReduce_97),+ (98 , happyReduce_98),+ (99 , happyReduce_99),+ (100 , happyReduce_100),+ (101 , happyReduce_101),+ (102 , happyReduce_102),+ (103 , happyReduce_103),+ (104 , happyReduce_104),+ (105 , happyReduce_105),+ (106 , happyReduce_106),+ (107 , happyReduce_107),+ (108 , happyReduce_108),+ (109 , happyReduce_109),+ (110 , happyReduce_110),+ (111 , happyReduce_111),+ (112 , happyReduce_112),+ (113 , happyReduce_113),+ (114 , happyReduce_114),+ (115 , happyReduce_115),+ (116 , happyReduce_116),+ (117 , happyReduce_117),+ (118 , happyReduce_118),+ (119 , happyReduce_119),+ (120 , happyReduce_120),+ (121 , happyReduce_121),+ (122 , happyReduce_122),+ (123 , happyReduce_123),+ (124 , happyReduce_124),+ (125 , happyReduce_125),+ (126 , happyReduce_126),+ (127 , happyReduce_127),+ (128 , happyReduce_128),+ (129 , happyReduce_129),+ (130 , happyReduce_130),+ (131 , happyReduce_131),+ (132 , happyReduce_132),+ (133 , happyReduce_133),+ (134 , happyReduce_134),+ (135 , happyReduce_135),+ (136 , happyReduce_136),+ (137 , happyReduce_137),+ (138 , happyReduce_138),+ (139 , happyReduce_139),+ (140 , happyReduce_140),+ (141 , happyReduce_141),+ (142 , happyReduce_142),+ (143 , happyReduce_143),+ (144 , happyReduce_144),+ (145 , happyReduce_145),+ (146 , happyReduce_146),+ (147 , happyReduce_147),+ (148 , happyReduce_148),+ (149 , happyReduce_149),+ (150 , happyReduce_150),+ (151 , happyReduce_151),+ (152 , happyReduce_152),+ (153 , happyReduce_153),+ (154 , happyReduce_154),+ (155 , happyReduce_155),+ (156 , happyReduce_156),+ (157 , happyReduce_157),+ (158 , happyReduce_158),+ (159 , happyReduce_159),+ (160 , happyReduce_160),+ (161 , happyReduce_161),+ (162 , happyReduce_162),+ (163 , happyReduce_163),+ (164 , happyReduce_164),+ (165 , happyReduce_165),+ (166 , happyReduce_166),+ (167 , happyReduce_167),+ (168 , happyReduce_168),+ (169 , happyReduce_169),+ (170 , happyReduce_170),+ (171 , happyReduce_171),+ (172 , happyReduce_172),+ (173 , happyReduce_173),+ (174 , happyReduce_174),+ (175 , happyReduce_175),+ (176 , happyReduce_176),+ (177 , happyReduce_177),+ (178 , happyReduce_178),+ (179 , happyReduce_179),+ (180 , happyReduce_180),+ (181 , happyReduce_181),+ (182 , happyReduce_182),+ (183 , happyReduce_183),+ (184 , happyReduce_184),+ (185 , happyReduce_185),+ (186 , happyReduce_186),+ (187 , happyReduce_187),+ (188 , happyReduce_188),+ (189 , happyReduce_189),+ (190 , happyReduce_190),+ (191 , happyReduce_191),+ (192 , happyReduce_192),+ (193 , happyReduce_193),+ (194 , happyReduce_194),+ (195 , happyReduce_195),+ (196 , happyReduce_196),+ (197 , happyReduce_197),+ (198 , happyReduce_198),+ (199 , happyReduce_199),+ (200 , happyReduce_200),+ (201 , happyReduce_201),+ (202 , happyReduce_202),+ (203 , happyReduce_203),+ (204 , happyReduce_204),+ (205 , happyReduce_205),+ (206 , happyReduce_206),+ (207 , happyReduce_207),+ (208 , happyReduce_208),+ (209 , happyReduce_209),+ (210 , happyReduce_210),+ (211 , happyReduce_211),+ (212 , happyReduce_212),+ (213 , happyReduce_213),+ (214 , happyReduce_214),+ (215 , happyReduce_215),+ (216 , happyReduce_216),+ (217 , happyReduce_217),+ (218 , happyReduce_218),+ (219 , happyReduce_219),+ (220 , happyReduce_220),+ (221 , happyReduce_221),+ (222 , happyReduce_222),+ (223 , happyReduce_223),+ (224 , happyReduce_224),+ (225 , happyReduce_225),+ (226 , happyReduce_226),+ (227 , happyReduce_227),+ (228 , happyReduce_228),+ (229 , happyReduce_229),+ (230 , happyReduce_230),+ (231 , happyReduce_231),+ (232 , happyReduce_232),+ (233 , happyReduce_233),+ (234 , happyReduce_234),+ (235 , happyReduce_235),+ (236 , happyReduce_236),+ (237 , happyReduce_237),+ (238 , happyReduce_238),+ (239 , happyReduce_239),+ (240 , happyReduce_240),+ (241 , happyReduce_241),+ (242 , happyReduce_242),+ (243 , happyReduce_243),+ (244 , happyReduce_244),+ (245 , happyReduce_245),+ (246 , happyReduce_246),+ (247 , happyReduce_247),+ (248 , happyReduce_248),+ (249 , happyReduce_249),+ (250 , happyReduce_250),+ (251 , happyReduce_251),+ (252 , happyReduce_252),+ (253 , happyReduce_253),+ (254 , happyReduce_254),+ (255 , happyReduce_255),+ (256 , happyReduce_256),+ (257 , happyReduce_257),+ (258 , happyReduce_258),+ (259 , happyReduce_259),+ (260 , happyReduce_260),+ (261 , happyReduce_261),+ (262 , happyReduce_262),+ (263 , happyReduce_263),+ (264 , happyReduce_264),+ (265 , happyReduce_265),+ (266 , happyReduce_266),+ (267 , happyReduce_267),+ (268 , happyReduce_268),+ (269 , happyReduce_269),+ (270 , happyReduce_270),+ (271 , happyReduce_271),+ (272 , happyReduce_272),+ (273 , happyReduce_273),+ (274 , happyReduce_274),+ (275 , happyReduce_275),+ (276 , happyReduce_276),+ (277 , happyReduce_277),+ (278 , happyReduce_278),+ (279 , happyReduce_279),+ (280 , happyReduce_280),+ (281 , happyReduce_281),+ (282 , happyReduce_282),+ (283 , happyReduce_283),+ (284 , happyReduce_284),+ (285 , happyReduce_285),+ (286 , happyReduce_286),+ (287 , happyReduce_287),+ (288 , happyReduce_288),+ (289 , happyReduce_289),+ (290 , happyReduce_290),+ (291 , happyReduce_291),+ (292 , happyReduce_292),+ (293 , happyReduce_293),+ (294 , happyReduce_294),+ (295 , happyReduce_295),+ (296 , happyReduce_296),+ (297 , happyReduce_297),+ (298 , happyReduce_298),+ (299 , happyReduce_299),+ (300 , happyReduce_300),+ (301 , happyReduce_301),+ (302 , happyReduce_302),+ (303 , happyReduce_303),+ (304 , happyReduce_304),+ (305 , happyReduce_305),+ (306 , happyReduce_306),+ (307 , happyReduce_307),+ (308 , happyReduce_308),+ (309 , happyReduce_309),+ (310 , happyReduce_310),+ (311 , happyReduce_311),+ (312 , happyReduce_312),+ (313 , happyReduce_313),+ (314 , happyReduce_314),+ (315 , happyReduce_315),+ (316 , happyReduce_316),+ (317 , happyReduce_317),+ (318 , happyReduce_318),+ (319 , happyReduce_319),+ (320 , happyReduce_320),+ (321 , happyReduce_321),+ (322 , happyReduce_322),+ (323 , happyReduce_323),+ (324 , happyReduce_324),+ (325 , happyReduce_325),+ (326 , happyReduce_326),+ (327 , happyReduce_327),+ (328 , happyReduce_328),+ (329 , happyReduce_329),+ (330 , happyReduce_330),+ (331 , happyReduce_331),+ (332 , happyReduce_332),+ (333 , happyReduce_333),+ (334 , happyReduce_334),+ (335 , happyReduce_335),+ (336 , happyReduce_336),+ (337 , happyReduce_337),+ (338 , happyReduce_338),+ (339 , happyReduce_339),+ (340 , happyReduce_340),+ (341 , happyReduce_341),+ (342 , happyReduce_342),+ (343 , happyReduce_343),+ (344 , happyReduce_344),+ (345 , happyReduce_345),+ (346 , happyReduce_346),+ (347 , happyReduce_347),+ (348 , happyReduce_348),+ (349 , happyReduce_349),+ (350 , happyReduce_350),+ (351 , happyReduce_351),+ (352 , happyReduce_352),+ (353 , happyReduce_353),+ (354 , happyReduce_354),+ (355 , happyReduce_355),+ (356 , happyReduce_356),+ (357 , happyReduce_357),+ (358 , happyReduce_358),+ (359 , happyReduce_359),+ (360 , happyReduce_360),+ (361 , happyReduce_361),+ (362 , happyReduce_362),+ (363 , happyReduce_363),+ (364 , happyReduce_364),+ (365 , happyReduce_365),+ (366 , happyReduce_366),+ (367 , happyReduce_367),+ (368 , happyReduce_368),+ (369 , happyReduce_369),+ (370 , happyReduce_370),+ (371 , happyReduce_371),+ (372 , happyReduce_372),+ (373 , happyReduce_373),+ (374 , happyReduce_374),+ (375 , happyReduce_375),+ (376 , happyReduce_376),+ (377 , happyReduce_377),+ (378 , happyReduce_378),+ (379 , happyReduce_379),+ (380 , happyReduce_380),+ (381 , happyReduce_381),+ (382 , happyReduce_382)+ ]++happy_n_terms = 81 :: Int+happy_n_nonterms = 130 :: Int++happyReduce_3 = happySpecReduce_1 0# happyReduction_3+happyReduction_3 happy_x_1+ = case happyOut7 happy_x_1 of { happy_var_1 -> + happyIn6+ (reverse happy_var_1+ )}++happyReduce_4 = happySpecReduce_2 1# happyReduction_4+happyReduction_4 happy_x_2+ happy_x_1+ = case happyOut7 happy_x_1 of { happy_var_1 -> + case happyOut8 happy_x_2 of { happy_var_2 -> + happyIn7+ (happy_var_2 : happy_var_1+ )}}++happyReduce_5 = happySpecReduce_0 1# happyReduction_5+happyReduction_5 = happyIn7+ ([]+ )++happyReduce_6 = happySpecReduce_1 2# happyReduction_6+happyReduction_6 happy_x_1+ = case happyOutTok happy_x_1 of { (TokKeyword KwLet happy_var_1) -> + happyIn8+ (TokKeyword KwLet happy_var_1+ )}++happyReduce_7 = happySpecReduce_1 2# happyReduction_7+happyReduction_7 happy_x_1+ = case happyOutTok happy_x_1 of { (TokKeyword KwIn happy_var_1) -> + happyIn8+ (TokKeyword KwIn happy_var_1+ )}++happyReduce_8 = happySpecReduce_1 2# happyReduction_8+happyReduction_8 happy_x_1+ = case happyOutTok happy_x_1 of { (TokKeyword KwWhere happy_var_1) -> + happyIn8+ (TokKeyword KwWhere happy_var_1+ )}++happyReduce_9 = happySpecReduce_1 2# happyReduction_9+happyReduction_9 happy_x_1+ = case happyOutTok happy_x_1 of { (TokKeyword KwWith happy_var_1) -> + happyIn8+ (TokKeyword KwWith happy_var_1+ )}++happyReduce_10 = happySpecReduce_1 2# happyReduction_10+happyReduction_10 happy_x_1+ = case happyOutTok happy_x_1 of { (TokKeyword KwRewrite happy_var_1) -> + happyIn8+ (TokKeyword KwRewrite happy_var_1+ )}++happyReduce_11 = happySpecReduce_1 2# happyReduction_11+happyReduction_11 happy_x_1+ = case happyOutTok happy_x_1 of { (TokKeyword KwPostulate happy_var_1) -> + happyIn8+ (TokKeyword KwPostulate happy_var_1+ )}++happyReduce_12 = happySpecReduce_1 2# happyReduction_12+happyReduction_12 happy_x_1+ = case happyOutTok happy_x_1 of { (TokKeyword KwPrimitive happy_var_1) -> + happyIn8+ (TokKeyword KwPrimitive happy_var_1+ )}++happyReduce_13 = happySpecReduce_1 2# happyReduction_13+happyReduction_13 happy_x_1+ = case happyOutTok happy_x_1 of { (TokKeyword KwOpen happy_var_1) -> + happyIn8+ (TokKeyword KwOpen happy_var_1+ )}++happyReduce_14 = happySpecReduce_1 2# happyReduction_14+happyReduction_14 happy_x_1+ = case happyOutTok happy_x_1 of { (TokKeyword KwImport happy_var_1) -> + happyIn8+ (TokKeyword KwImport happy_var_1+ )}++happyReduce_15 = happySpecReduce_1 2# happyReduction_15+happyReduction_15 happy_x_1+ = case happyOutTok happy_x_1 of { (TokKeyword KwUsing happy_var_1) -> + happyIn8+ (TokKeyword KwUsing happy_var_1+ )}++happyReduce_16 = happySpecReduce_1 2# happyReduction_16+happyReduction_16 happy_x_1+ = case happyOutTok happy_x_1 of { (TokKeyword KwHiding happy_var_1) -> + happyIn8+ (TokKeyword KwHiding happy_var_1+ )}++happyReduce_17 = happySpecReduce_1 2# happyReduction_17+happyReduction_17 happy_x_1+ = case happyOutTok happy_x_1 of { (TokKeyword KwRenaming happy_var_1) -> + happyIn8+ (TokKeyword KwRenaming happy_var_1+ )}++happyReduce_18 = happySpecReduce_1 2# happyReduction_18+happyReduction_18 happy_x_1+ = case happyOutTok happy_x_1 of { (TokKeyword KwTo happy_var_1) -> + happyIn8+ (TokKeyword KwTo happy_var_1+ )}++happyReduce_19 = happySpecReduce_1 2# happyReduction_19+happyReduction_19 happy_x_1+ = case happyOutTok happy_x_1 of { (TokKeyword KwPublic happy_var_1) -> + happyIn8+ (TokKeyword KwPublic happy_var_1+ )}++happyReduce_20 = happySpecReduce_1 2# happyReduction_20+happyReduction_20 happy_x_1+ = case happyOutTok happy_x_1 of { (TokKeyword KwModule happy_var_1) -> + happyIn8+ (TokKeyword KwModule happy_var_1+ )}++happyReduce_21 = happySpecReduce_1 2# happyReduction_21+happyReduction_21 happy_x_1+ = case happyOutTok happy_x_1 of { (TokKeyword KwData happy_var_1) -> + happyIn8+ (TokKeyword KwData happy_var_1+ )}++happyReduce_22 = happySpecReduce_1 2# happyReduction_22+happyReduction_22 happy_x_1+ = case happyOutTok happy_x_1 of { (TokKeyword KwCoData happy_var_1) -> + happyIn8+ (TokKeyword KwCoData happy_var_1+ )}++happyReduce_23 = happySpecReduce_1 2# happyReduction_23+happyReduction_23 happy_x_1+ = case happyOutTok happy_x_1 of { (TokKeyword KwRecord happy_var_1) -> + happyIn8+ (TokKeyword KwRecord happy_var_1+ )}++happyReduce_24 = happySpecReduce_1 2# happyReduction_24+happyReduction_24 happy_x_1+ = case happyOutTok happy_x_1 of { (TokKeyword KwConstructor happy_var_1) -> + happyIn8+ (TokKeyword KwConstructor happy_var_1+ )}++happyReduce_25 = happySpecReduce_1 2# happyReduction_25+happyReduction_25 happy_x_1+ = case happyOutTok happy_x_1 of { (TokKeyword KwInductive happy_var_1) -> + happyIn8+ (TokKeyword KwInductive happy_var_1+ )}++happyReduce_26 = happySpecReduce_1 2# happyReduction_26+happyReduction_26 happy_x_1+ = case happyOutTok happy_x_1 of { (TokKeyword KwCoInductive happy_var_1) -> + happyIn8+ (TokKeyword KwCoInductive happy_var_1+ )}++happyReduce_27 = happySpecReduce_1 2# happyReduction_27+happyReduction_27 happy_x_1+ = case happyOutTok happy_x_1 of { (TokKeyword KwField happy_var_1) -> + happyIn8+ (TokKeyword KwField happy_var_1+ )}++happyReduce_28 = happySpecReduce_1 2# happyReduction_28+happyReduction_28 happy_x_1+ = case happyOutTok happy_x_1 of { (TokKeyword KwInfix happy_var_1) -> + happyIn8+ (TokKeyword KwInfix happy_var_1+ )}++happyReduce_29 = happySpecReduce_1 2# happyReduction_29+happyReduction_29 happy_x_1+ = case happyOutTok happy_x_1 of { (TokKeyword KwInfixL happy_var_1) -> + happyIn8+ (TokKeyword KwInfixL happy_var_1+ )}++happyReduce_30 = happySpecReduce_1 2# happyReduction_30+happyReduction_30 happy_x_1+ = case happyOutTok happy_x_1 of { (TokKeyword KwInfixR happy_var_1) -> + happyIn8+ (TokKeyword KwInfixR happy_var_1+ )}++happyReduce_31 = happySpecReduce_1 2# happyReduction_31+happyReduction_31 happy_x_1+ = case happyOutTok happy_x_1 of { (TokKeyword KwMutual happy_var_1) -> + happyIn8+ (TokKeyword KwMutual happy_var_1+ )}++happyReduce_32 = happySpecReduce_1 2# happyReduction_32+happyReduction_32 happy_x_1+ = case happyOutTok happy_x_1 of { (TokKeyword KwAbstract happy_var_1) -> + happyIn8+ (TokKeyword KwAbstract happy_var_1+ )}++happyReduce_33 = happySpecReduce_1 2# happyReduction_33+happyReduction_33 happy_x_1+ = case happyOutTok happy_x_1 of { (TokKeyword KwPrivate happy_var_1) -> + happyIn8+ (TokKeyword KwPrivate happy_var_1+ )}++happyReduce_34 = happySpecReduce_1 2# happyReduction_34+happyReduction_34 happy_x_1+ = case happyOutTok happy_x_1 of { (TokKeyword KwProp happy_var_1) -> + happyIn8+ (TokKeyword KwProp happy_var_1+ )}++happyReduce_35 = happySpecReduce_1 2# happyReduction_35+happyReduction_35 happy_x_1+ = case happyOutTok happy_x_1 of { (TokKeyword KwSet happy_var_1) -> + happyIn8+ (TokKeyword KwSet happy_var_1+ )}++happyReduce_36 = happySpecReduce_1 2# happyReduction_36+happyReduction_36 happy_x_1+ = case happyOutTok happy_x_1 of { (TokKeyword KwForall happy_var_1) -> + happyIn8+ (TokKeyword KwForall happy_var_1+ )}++happyReduce_37 = happySpecReduce_1 2# happyReduction_37+happyReduction_37 happy_x_1+ = case happyOutTok happy_x_1 of { (TokKeyword KwSyntax happy_var_1) -> + happyIn8+ (TokKeyword KwSyntax happy_var_1+ )}++happyReduce_38 = happySpecReduce_1 2# happyReduction_38+happyReduction_38 happy_x_1+ = case happyOutTok happy_x_1 of { (TokKeyword KwPatternSyn happy_var_1) -> + happyIn8+ (TokKeyword KwPatternSyn happy_var_1+ )}++happyReduce_39 = happySpecReduce_1 2# happyReduction_39+happyReduction_39 happy_x_1+ = case happyOutTok happy_x_1 of { (TokKeyword KwOPTIONS happy_var_1) -> + happyIn8+ (TokKeyword KwOPTIONS happy_var_1+ )}++happyReduce_40 = happySpecReduce_1 2# happyReduction_40+happyReduction_40 happy_x_1+ = case happyOutTok happy_x_1 of { (TokKeyword KwBUILTIN happy_var_1) -> + happyIn8+ (TokKeyword KwBUILTIN happy_var_1+ )}++happyReduce_41 = happySpecReduce_1 2# happyReduction_41+happyReduction_41 happy_x_1+ = case happyOutTok happy_x_1 of { (TokKeyword KwIMPORT happy_var_1) -> + happyIn8+ (TokKeyword KwIMPORT happy_var_1+ )}++happyReduce_42 = happySpecReduce_1 2# happyReduction_42+happyReduction_42 happy_x_1+ = case happyOutTok happy_x_1 of { (TokKeyword KwCOMPILED happy_var_1) -> + happyIn8+ (TokKeyword KwCOMPILED happy_var_1+ )}++happyReduce_43 = happySpecReduce_1 2# happyReduction_43+happyReduction_43 happy_x_1+ = case happyOutTok happy_x_1 of { (TokKeyword KwCOMPILED_DATA happy_var_1) -> + happyIn8+ (TokKeyword KwCOMPILED_DATA happy_var_1+ )}++happyReduce_44 = happySpecReduce_1 2# happyReduction_44+happyReduction_44 happy_x_1+ = case happyOutTok happy_x_1 of { (TokKeyword KwCOMPILED_TYPE happy_var_1) -> + happyIn8+ (TokKeyword KwCOMPILED_TYPE happy_var_1+ )}++happyReduce_45 = happySpecReduce_1 2# happyReduction_45+happyReduction_45 happy_x_1+ = case happyOutTok happy_x_1 of { (TokKeyword KwCOMPILED_EPIC happy_var_1) -> + happyIn8+ (TokKeyword KwCOMPILED_EPIC happy_var_1+ )}++happyReduce_46 = happySpecReduce_1 2# happyReduction_46+happyReduction_46 happy_x_1+ = case happyOutTok happy_x_1 of { (TokKeyword KwCOMPILED_JS happy_var_1) -> + happyIn8+ (TokKeyword KwCOMPILED_JS happy_var_1+ )}++happyReduce_47 = happySpecReduce_1 2# happyReduction_47+happyReduction_47 happy_x_1+ = case happyOutTok happy_x_1 of { (TokKeyword KwSTATIC happy_var_1) -> + happyIn8+ (TokKeyword KwSTATIC happy_var_1+ )}++happyReduce_48 = happySpecReduce_1 2# happyReduction_48+happyReduction_48 happy_x_1+ = case happyOutTok happy_x_1 of { (TokKeyword KwIMPOSSIBLE happy_var_1) -> + happyIn8+ (TokKeyword KwIMPOSSIBLE happy_var_1+ )}++happyReduce_49 = happySpecReduce_1 2# happyReduction_49+happyReduction_49 happy_x_1+ = case happyOutTok happy_x_1 of { (TokKeyword KwETA happy_var_1) -> + happyIn8+ (TokKeyword KwETA happy_var_1+ )}++happyReduce_50 = happySpecReduce_1 2# happyReduction_50+happyReduction_50 happy_x_1+ = case happyOutTok happy_x_1 of { (TokKeyword KwNO_TERMINATION_CHECK happy_var_1) -> + happyIn8+ (TokKeyword KwNO_TERMINATION_CHECK happy_var_1+ )}++happyReduce_51 = happySpecReduce_1 2# happyReduction_51+happyReduction_51 happy_x_1+ = case happyOutTok happy_x_1 of { (TokKeyword KwQuoteGoal happy_var_1) -> + happyIn8+ (TokKeyword KwQuoteGoal happy_var_1+ )}++happyReduce_52 = happySpecReduce_1 2# happyReduction_52+happyReduction_52 happy_x_1+ = case happyOutTok happy_x_1 of { (TokKeyword KwQuote happy_var_1) -> + happyIn8+ (TokKeyword KwQuote happy_var_1+ )}++happyReduce_53 = happySpecReduce_1 2# happyReduction_53+happyReduction_53 happy_x_1+ = case happyOutTok happy_x_1 of { (TokKeyword KwQuoteTerm happy_var_1) -> + happyIn8+ (TokKeyword KwQuoteTerm happy_var_1+ )}++happyReduce_54 = happySpecReduce_1 2# happyReduction_54+happyReduction_54 happy_x_1+ = case happyOutTok happy_x_1 of { (TokKeyword KwUnquote happy_var_1) -> + happyIn8+ (TokKeyword KwUnquote happy_var_1+ )}++happyReduce_55 = happySpecReduce_1 2# happyReduction_55+happyReduction_55 happy_x_1+ = case happyOutTok happy_x_1 of { (TokSetN happy_var_1) -> + happyIn8+ (TokSetN happy_var_1+ )}++happyReduce_56 = happySpecReduce_1 2# happyReduction_56+happyReduction_56 happy_x_1+ = case happyOutTok happy_x_1 of { (TokTeX happy_var_1) -> + happyIn8+ (TokTeX happy_var_1+ )}++happyReduce_57 = happySpecReduce_1 2# happyReduction_57+happyReduction_57 happy_x_1+ = case happyOutTok happy_x_1 of { (TokComment happy_var_1) -> + happyIn8+ (TokComment happy_var_1+ )}++happyReduce_58 = happySpecReduce_1 2# happyReduction_58+happyReduction_58 happy_x_1+ = case happyOutTok happy_x_1 of { (TokSymbol SymEllipsis happy_var_1) -> + happyIn8+ (TokSymbol SymEllipsis happy_var_1+ )}++happyReduce_59 = happySpecReduce_1 2# happyReduction_59+happyReduction_59 happy_x_1+ = case happyOutTok happy_x_1 of { (TokSymbol SymDotDot happy_var_1) -> + happyIn8+ (TokSymbol SymDotDot happy_var_1+ )}++happyReduce_60 = happySpecReduce_1 2# happyReduction_60+happyReduction_60 happy_x_1+ = case happyOutTok happy_x_1 of { (TokSymbol SymDot happy_var_1) -> + happyIn8+ (TokSymbol SymDot happy_var_1+ )}++happyReduce_61 = happySpecReduce_1 2# happyReduction_61+happyReduction_61 happy_x_1+ = case happyOutTok happy_x_1 of { (TokSymbol SymSemi happy_var_1) -> + happyIn8+ (TokSymbol SymSemi happy_var_1+ )}++happyReduce_62 = happySpecReduce_1 2# happyReduction_62+happyReduction_62 happy_x_1+ = case happyOutTok happy_x_1 of { (TokSymbol SymColon happy_var_1) -> + happyIn8+ (TokSymbol SymColon happy_var_1+ )}++happyReduce_63 = happySpecReduce_1 2# happyReduction_63+happyReduction_63 happy_x_1+ = case happyOutTok happy_x_1 of { (TokSymbol SymEqual happy_var_1) -> + happyIn8+ (TokSymbol SymEqual happy_var_1+ )}++happyReduce_64 = happySpecReduce_1 2# happyReduction_64+happyReduction_64 happy_x_1+ = case happyOutTok happy_x_1 of { (TokSymbol SymUnderscore happy_var_1) -> + happyIn8+ (TokSymbol SymUnderscore happy_var_1+ )}++happyReduce_65 = happySpecReduce_1 2# happyReduction_65+happyReduction_65 happy_x_1+ = case happyOutTok happy_x_1 of { (TokSymbol SymQuestionMark happy_var_1) -> + happyIn8+ (TokSymbol SymQuestionMark happy_var_1+ )}++happyReduce_66 = happySpecReduce_1 2# happyReduction_66+happyReduction_66 happy_x_1+ = case happyOutTok happy_x_1 of { (TokSymbol SymArrow happy_var_1) -> + happyIn8+ (TokSymbol SymArrow happy_var_1+ )}++happyReduce_67 = happySpecReduce_1 2# happyReduction_67+happyReduction_67 happy_x_1+ = case happyOutTok happy_x_1 of { (TokSymbol SymLambda happy_var_1) -> + happyIn8+ (TokSymbol SymLambda happy_var_1+ )}++happyReduce_68 = happySpecReduce_1 2# happyReduction_68+happyReduction_68 happy_x_1+ = case happyOutTok happy_x_1 of { (TokSymbol SymAs happy_var_1) -> + happyIn8+ (TokSymbol SymAs happy_var_1+ )}++happyReduce_69 = happySpecReduce_1 2# happyReduction_69+happyReduction_69 happy_x_1+ = case happyOutTok happy_x_1 of { (TokSymbol SymBar happy_var_1) -> + happyIn8+ (TokSymbol SymBar happy_var_1+ )}++happyReduce_70 = happySpecReduce_1 2# happyReduction_70+happyReduction_70 happy_x_1+ = case happyOutTok happy_x_1 of { (TokSymbol SymOpenParen happy_var_1) -> + happyIn8+ (TokSymbol SymOpenParen happy_var_1+ )}++happyReduce_71 = happySpecReduce_1 2# happyReduction_71+happyReduction_71 happy_x_1+ = case happyOutTok happy_x_1 of { (TokSymbol SymCloseParen happy_var_1) -> + happyIn8+ (TokSymbol SymCloseParen happy_var_1+ )}++happyReduce_72 = happySpecReduce_1 2# happyReduction_72+happyReduction_72 happy_x_1+ = case happyOutTok happy_x_1 of { (TokSymbol SymDoubleOpenBrace happy_var_1) -> + happyIn8+ (TokSymbol SymDoubleOpenBrace happy_var_1+ )}++happyReduce_73 = happySpecReduce_1 2# happyReduction_73+happyReduction_73 happy_x_1+ = case happyOutTok happy_x_1 of { (TokSymbol SymDoubleCloseBrace happy_var_1) -> + happyIn8+ (TokSymbol SymDoubleCloseBrace happy_var_1+ )}++happyReduce_74 = happySpecReduce_1 2# happyReduction_74+happyReduction_74 happy_x_1+ = case happyOutTok happy_x_1 of { (TokSymbol SymOpenBrace happy_var_1) -> + happyIn8+ (TokSymbol SymOpenBrace happy_var_1+ )}++happyReduce_75 = happySpecReduce_1 2# happyReduction_75+happyReduction_75 happy_x_1+ = case happyOutTok happy_x_1 of { (TokSymbol SymCloseBrace happy_var_1) -> + happyIn8+ (TokSymbol SymCloseBrace happy_var_1+ )}++happyReduce_76 = happySpecReduce_1 2# happyReduction_76+happyReduction_76 happy_x_1+ = case happyOutTok happy_x_1 of { (TokSymbol SymOpenVirtualBrace happy_var_1) -> + happyIn8+ (TokSymbol SymOpenVirtualBrace happy_var_1+ )}++happyReduce_77 = happySpecReduce_1 2# happyReduction_77+happyReduction_77 happy_x_1+ = case happyOutTok happy_x_1 of { (TokSymbol SymCloseVirtualBrace happy_var_1) -> + happyIn8+ (TokSymbol SymCloseVirtualBrace happy_var_1+ )}++happyReduce_78 = happySpecReduce_1 2# happyReduction_78+happyReduction_78 happy_x_1+ = case happyOutTok happy_x_1 of { (TokSymbol SymVirtualSemi happy_var_1) -> + happyIn8+ (TokSymbol SymVirtualSemi happy_var_1+ )}++happyReduce_79 = happySpecReduce_1 2# happyReduction_79+happyReduction_79 happy_x_1+ = case happyOutTok happy_x_1 of { (TokSymbol SymOpenPragma happy_var_1) -> + happyIn8+ (TokSymbol SymOpenPragma happy_var_1+ )}++happyReduce_80 = happySpecReduce_1 2# happyReduction_80+happyReduction_80 happy_x_1+ = case happyOutTok happy_x_1 of { (TokSymbol SymClosePragma happy_var_1) -> + happyIn8+ (TokSymbol SymClosePragma happy_var_1+ )}++happyReduce_81 = happySpecReduce_1 2# happyReduction_81+happyReduction_81 happy_x_1+ = case happyOutTok happy_x_1 of { (TokId happy_var_1) -> + happyIn8+ (TokId happy_var_1+ )}++happyReduce_82 = happySpecReduce_1 2# happyReduction_82+happyReduction_82 happy_x_1+ = case happyOutTok happy_x_1 of { (TokQId happy_var_1) -> + happyIn8+ (TokQId happy_var_1+ )}++happyReduce_83 = happySpecReduce_1 2# happyReduction_83+happyReduction_83 happy_x_1+ = case happyOutTok happy_x_1 of { (TokString happy_var_1) -> + happyIn8+ (TokString happy_var_1+ )}++happyReduce_84 = happySpecReduce_1 2# happyReduction_84+happyReduction_84 happy_x_1+ = case happyOutTok happy_x_1 of { (TokLiteral happy_var_1) -> + happyIn8+ (TokLiteral happy_var_1+ )}++happyReduce_85 = happySpecReduce_1 3# happyReduction_85+happyReduction_85 happy_x_1+ = case happyOut10 happy_x_1 of { happy_var_1 -> + happyIn9+ (happy_var_1+ )}++happyReduce_86 = happySpecReduce_1 4# happyReduction_86+happyReduction_86 happy_x_1+ = case happyOut107 happy_x_1 of { happy_var_1 -> + happyIn10+ (([], happy_var_1)+ )}++happyReduce_87 = happySpecReduce_2 4# happyReduction_87+happyReduction_87 happy_x_2+ happy_x_1+ = case happyOut110 happy_x_1 of { happy_var_1 -> + case happyOut10 happy_x_2 of { happy_var_2 -> + happyIn10+ (let (ps,m) = happy_var_2 in (happy_var_1 : ps, m)+ )}}++happyReduce_88 = happySpecReduce_1 5# happyReduction_88+happyReduction_88 happy_x_1+ = happyIn11+ (()+ )++happyReduce_89 = happyMonadReduce 1# 5# happyReduction_89+happyReduction_89 (happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen (( popContext)+ ) (\r -> happyReturn (happyIn11 r))++happyReduce_90 = happySpecReduce_1 6# happyReduction_90+happyReduction_90 happy_x_1+ = case happyOutTok happy_x_1 of { (TokSymbol SymSemi happy_var_1) -> + happyIn12+ (happy_var_1+ )}++happyReduce_91 = happySpecReduce_1 6# happyReduction_91+happyReduction_91 happy_x_1+ = case happyOutTok happy_x_1 of { (TokSymbol SymVirtualSemi happy_var_1) -> + happyIn12+ (happy_var_1+ )}++happyReduce_92 = happyMonadReduce 0# 7# happyReduction_92+happyReduction_92 (happyRest) tk+ = happyThen (( pushLexState imp_dir)+ ) (\r -> happyReturn (happyIn13 r))++happyReduce_93 = happyMonadReduce 1# 8# happyReduction_93+happyReduction_93 (happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen (case happyOutTok happy_x_1 of { (TokLiteral happy_var_1) -> + ( case happy_var_1 of {+ LitInt _ n -> return n;+ _ -> fail $ "Expected integer"+ })}+ ) (\r -> happyReturn (happyIn14 r))++happyReduce_94 = happyMonadReduce 1# 9# happyReduction_94+happyReduction_94 (happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen (case happyOutTok happy_x_1 of { (TokId happy_var_1) -> + ( mkName happy_var_1)}+ ) (\r -> happyReturn (happyIn15 r))++happyReduce_95 = happySpecReduce_2 10# happyReduction_95+happyReduction_95 happy_x_2+ happy_x_1+ = case happyOut15 happy_x_1 of { happy_var_1 -> + case happyOut16 happy_x_2 of { happy_var_2 -> + happyIn16+ (happy_var_1 : happy_var_2+ )}}++happyReduce_96 = happySpecReduce_1 10# happyReduction_96+happyReduction_96 happy_x_1+ = case happyOut15 happy_x_1 of { happy_var_1 -> + happyIn16+ ([happy_var_1]+ )}++happyReduce_97 = happySpecReduce_1 11# happyReduction_97+happyReduction_97 happy_x_1+ = case happyOutTok happy_x_1 of { (TokSymbol SymDoubleCloseBrace happy_var_1) -> + happyIn17+ (getRange happy_var_1+ )}++happyReduce_98 = happyMonadReduce 2# 11# happyReduction_98+happyReduction_98 (happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen (case happyOutTok happy_x_1 of { (TokSymbol SymCloseBrace happy_var_1) -> + case happyOutTok happy_x_2 of { (TokSymbol SymCloseBrace happy_var_2) -> + (+ if posPos (fromJust (rEnd (getRange happy_var_2))) -+ posPos (fromJust (rStart (getRange happy_var_1))) > 2+ then parseErrorAt (fromJust (rStart (getRange happy_var_2)))+ "Expecting '}}', found separated '}'s."+ else return $ getRange (happy_var_1, happy_var_2))}}+ ) (\r -> happyReturn (happyIn17 r))++happyReduce_99 = happySpecReduce_2 12# happyReduction_99+happyReduction_99 happy_x_2+ happy_x_1+ = case happyOut15 happy_x_2 of { happy_var_2 -> + happyIn18+ (Arg NotHidden Irrelevant happy_var_2+ )}++happyReduce_100 = happySpecReduce_1 12# happyReduction_100+happyReduction_100 happy_x_1+ = case happyOut15 happy_x_1 of { happy_var_1 -> + happyIn18+ (defaultArg happy_var_1+ )}++happyReduce_101 = happySpecReduce_2 13# happyReduction_101+happyReduction_101 happy_x_2+ happy_x_1+ = case happyOut18 happy_x_1 of { happy_var_1 -> + case happyOut19 happy_x_2 of { happy_var_2 -> + happyIn19+ (happy_var_1 : happy_var_2+ )}}++happyReduce_102 = happySpecReduce_1 13# happyReduction_102+happyReduction_102 happy_x_1+ = case happyOut18 happy_x_1 of { happy_var_1 -> + happyIn19+ ([happy_var_1]+ )}++happyReduce_103 = happySpecReduce_2 14# happyReduction_103+happyReduction_103 happy_x_2+ happy_x_1+ = case happyOut18 happy_x_1 of { happy_var_1 -> + case happyOut20 happy_x_2 of { happy_var_2 -> + happyIn20+ (happy_var_1 : happy_var_2+ )}}++happyReduce_104 = happySpecReduce_1 14# happyReduction_104+happyReduction_104 happy_x_1+ = case happyOut18 happy_x_1 of { happy_var_1 -> + happyIn20+ ([happy_var_1]+ )}++happyReduce_105 = happyReduce 4# 14# happyReduction_105+happyReduction_105 (happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest)+ = case happyOut19 happy_x_2 of { happy_var_2 -> + case happyOut20 happy_x_4 of { happy_var_4 -> + happyIn20+ (map makeInstance happy_var_2 ++ happy_var_4+ ) `HappyStk` happyRest}}++happyReduce_106 = happySpecReduce_3 14# happyReduction_106+happyReduction_106 happy_x_3+ happy_x_2+ happy_x_1+ = case happyOut19 happy_x_2 of { happy_var_2 -> + happyIn20+ (map makeInstance happy_var_2+ )}++happyReduce_107 = happyReduce 4# 14# happyReduction_107+happyReduction_107 (happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest)+ = case happyOut19 happy_x_2 of { happy_var_2 -> + case happyOut20 happy_x_4 of { happy_var_4 -> + happyIn20+ (map hide happy_var_2 ++ happy_var_4+ ) `HappyStk` happyRest}}++happyReduce_108 = happySpecReduce_3 14# happyReduction_108+happyReduction_108 happy_x_3+ happy_x_2+ happy_x_1+ = case happyOut19 happy_x_2 of { happy_var_2 -> + happyIn20+ (map hide happy_var_2+ )}++happyReduce_109 = happyReduce 5# 14# happyReduction_109+happyReduction_109 (happy_x_5 `HappyStk`+ happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest)+ = case happyOut16 happy_x_3 of { happy_var_3 -> + case happyOut20 happy_x_5 of { happy_var_5 -> + happyIn20+ (map (Arg Hidden Irrelevant) happy_var_3 ++ happy_var_5+ ) `HappyStk` happyRest}}++happyReduce_110 = happyReduce 4# 14# happyReduction_110+happyReduction_110 (happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest)+ = case happyOut16 happy_x_3 of { happy_var_3 -> + happyIn20+ (map (Arg Hidden Irrelevant) happy_var_3+ ) `HappyStk` happyRest}++happyReduce_111 = happyReduce 5# 14# happyReduction_111+happyReduction_111 (happy_x_5 `HappyStk`+ happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest)+ = case happyOut16 happy_x_3 of { happy_var_3 -> + case happyOut20 happy_x_5 of { happy_var_5 -> + happyIn20+ (map (Arg Instance Irrelevant) happy_var_3 ++ happy_var_5+ ) `HappyStk` happyRest}}++happyReduce_112 = happyReduce 4# 14# happyReduction_112+happyReduction_112 (happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest)+ = case happyOut16 happy_x_3 of { happy_var_3 -> + happyIn20+ (map (Arg Instance Irrelevant) happy_var_3+ ) `HappyStk` happyRest}++happyReduce_113 = happyReduce 5# 14# happyReduction_113+happyReduction_113 (happy_x_5 `HappyStk`+ happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest)+ = case happyOut16 happy_x_3 of { happy_var_3 -> + case happyOut20 happy_x_5 of { happy_var_5 -> + happyIn20+ (map (Arg Hidden NonStrict) happy_var_3 ++ happy_var_5+ ) `HappyStk` happyRest}}++happyReduce_114 = happyReduce 4# 14# happyReduction_114+happyReduction_114 (happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest)+ = case happyOut16 happy_x_3 of { happy_var_3 -> + happyIn20+ (map (Arg Hidden NonStrict) happy_var_3+ ) `HappyStk` happyRest}++happyReduce_115 = happyReduce 5# 14# happyReduction_115+happyReduction_115 (happy_x_5 `HappyStk`+ happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest)+ = case happyOut16 happy_x_3 of { happy_var_3 -> + case happyOut20 happy_x_5 of { happy_var_5 -> + happyIn20+ (map (Arg Instance NonStrict) happy_var_3 ++ happy_var_5+ ) `HappyStk` happyRest}}++happyReduce_116 = happyReduce 4# 14# happyReduction_116+happyReduction_116 (happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest)+ = case happyOut16 happy_x_3 of { happy_var_3 -> + happyIn20+ (map (Arg Instance NonStrict) happy_var_3+ ) `HappyStk` happyRest}++happyReduce_117 = happyMonadReduce 1# 15# happyReduction_117+happyReduction_117 (happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen (case happyOutTok happy_x_1 of { (TokQId happy_var_1) -> + ( mkQName happy_var_1)}+ ) (\r -> happyReturn (happyIn21 r))++happyReduce_118 = happySpecReduce_1 15# happyReduction_118+happyReduction_118 happy_x_1+ = case happyOut15 happy_x_1 of { happy_var_1 -> + happyIn21+ (QName happy_var_1+ )}++happyReduce_119 = happySpecReduce_1 16# happyReduction_119+happyReduction_119 happy_x_1+ = case happyOut21 happy_x_1 of { happy_var_1 -> + happyIn22+ (happy_var_1+ )}++happyReduce_120 = happySpecReduce_1 17# happyReduction_120+happyReduction_120 happy_x_1+ = case happyOut15 happy_x_1 of { happy_var_1 -> + happyIn23+ (happy_var_1+ )}++happyReduce_121 = happySpecReduce_1 17# happyReduction_121+happyReduction_121 happy_x_1+ = case happyOutTok happy_x_1 of { (TokSymbol SymUnderscore happy_var_1) -> + happyIn23+ (Name (getRange happy_var_1) [Hole]+ )}++happyReduce_122 = happySpecReduce_2 18# happyReduction_122+happyReduction_122 happy_x_2+ happy_x_1+ = case happyOut23 happy_x_1 of { happy_var_1 -> + case happyOut24 happy_x_2 of { happy_var_2 -> + happyIn24+ (happy_var_1 : happy_var_2+ )}}++happyReduce_123 = happySpecReduce_1 18# happyReduction_123+happyReduction_123 happy_x_1+ = case happyOut23 happy_x_1 of { happy_var_1 -> + happyIn24+ ([happy_var_1]+ )}++happyReduce_124 = happySpecReduce_1 19# happyReduction_124+happyReduction_124 happy_x_1+ = case happyOut26 happy_x_1 of { happy_var_1 -> + happyIn25+ (case happy_var_1 of+ Left ns -> ns+ Right _ -> fail $ "expected sequence of bound identifiers, not absurd pattern"+ )}++happyReduce_125 = happyMonadReduce 1# 20# happyReduction_125+happyReduction_125 (happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen (case happyOut32 happy_x_1 of { happy_var_1 -> + (+ let getName (Ident (QName x)) = Just x+ getName (Underscore r _) = Just (Name r [Hole])+ getName _ = Nothing++ containsAbsurd (Absurd _) = True+ containsAbsurd (HiddenArg _ (Named _ e)) = containsAbsurd e+ containsAbsurd (InstanceArg _ (Named _ e)) = containsAbsurd e+ containsAbsurd (Paren _ expr) = containsAbsurd expr+ containsAbsurd (RawApp _ exprs) = any containsAbsurd exprs+ containsAbsurd _ = False+ in+ if isJust $ find containsAbsurd happy_var_1 then return $ Right happy_var_1 else+ case partition isJust $ map getName happy_var_1 of+ (good, []) -> return $ Left $ map fromJust good+ _ -> fail $ "expected sequence of bound identifiers")}+ ) (\r -> happyReturn (happyIn26 r))++happyReduce_126 = happySpecReduce_0 21# happyReduction_126+happyReduction_126 = happyIn27+ ([]+ )++happyReduce_127 = happySpecReduce_2 21# happyReduction_127+happyReduction_127 happy_x_2+ happy_x_1+ = case happyOutTok happy_x_1 of { (TokString happy_var_1) -> + case happyOut27 happy_x_2 of { happy_var_2 -> + happyIn27+ (snd happy_var_1 : happy_var_2+ )}}++happyReduce_128 = happyMonadReduce 1# 22# happyReduction_128+happyReduction_128 (happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen (case happyOutTok happy_x_1 of { (TokString happy_var_1) -> + ( fmap QName (mkName happy_var_1))}+ ) (\r -> happyReturn (happyIn28 r))++happyReduce_129 = happySpecReduce_2 23# happyReduction_129+happyReduction_129 happy_x_2+ happy_x_1+ = case happyOut42 happy_x_1 of { happy_var_1 -> + case happyOut29 happy_x_2 of { happy_var_2 -> + happyIn29+ (Pi happy_var_1 happy_var_2+ )}}++happyReduce_130 = happySpecReduce_3 23# happyReduction_130+happyReduction_130 happy_x_3+ happy_x_2+ happy_x_1+ = case happyOut55 happy_x_2 of { happy_var_2 -> + case happyOut29 happy_x_3 of { happy_var_3 -> + happyIn29+ (forallPi happy_var_2 happy_var_3+ )}}++happyReduce_131 = happySpecReduce_3 23# happyReduction_131+happyReduction_131 happy_x_3+ happy_x_2+ happy_x_1+ = case happyOut35 happy_x_1 of { happy_var_1 -> + case happyOutTok happy_x_2 of { (TokSymbol SymArrow happy_var_2) -> + case happyOut29 happy_x_3 of { happy_var_3 -> + happyIn29+ (Fun (getRange (happy_var_1,happy_var_2,happy_var_3))+ (RawApp (getRange happy_var_1) happy_var_1)+ happy_var_3+ )}}}++happyReduce_132 = happySpecReduce_1 23# happyReduction_132+happyReduction_132 happy_x_1+ = case happyOut30 happy_x_1 of { happy_var_1 -> + happyIn29+ (happy_var_1+ )}++happyReduce_133 = happyMonadReduce 1# 24# happyReduction_133+happyReduction_133 (happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen (case happyOut31 happy_x_1 of { happy_var_1 -> + ( case happy_var_1 of+ { [e] -> return e+ ; e : es -> return $ WithApp (fuseRange e es) e es+ ; [] -> fail "impossible: empty with expressions"+ })}+ ) (\r -> happyReturn (happyIn30 r))++happyReduce_134 = happySpecReduce_3 25# happyReduction_134+happyReduction_134 happy_x_3+ happy_x_2+ happy_x_1+ = case happyOut35 happy_x_1 of { happy_var_1 -> + case happyOut31 happy_x_3 of { happy_var_3 -> + happyIn31+ (RawApp (getRange happy_var_1) happy_var_1 : happy_var_3+ )}}++happyReduce_135 = happySpecReduce_1 25# happyReduction_135+happyReduction_135 happy_x_1+ = case happyOut32 happy_x_1 of { happy_var_1 -> + happyIn31+ ([RawApp (getRange happy_var_1) happy_var_1]+ )}++happyReduce_136 = happySpecReduce_1 26# happyReduction_136+happyReduction_136 happy_x_1+ = case happyOut33 happy_x_1 of { happy_var_1 -> + happyIn32+ ([happy_var_1]+ )}++happyReduce_137 = happySpecReduce_2 26# happyReduction_137+happyReduction_137 happy_x_2+ happy_x_1+ = case happyOut38 happy_x_1 of { happy_var_1 -> + case happyOut32 happy_x_2 of { happy_var_2 -> + happyIn32+ (happy_var_1 : happy_var_2+ )}}++happyReduce_138 = happySpecReduce_3 27# happyReduction_138+happyReduction_138 happy_x_3+ happy_x_2+ happy_x_1+ = case happyOutTok happy_x_1 of { (TokSymbol SymLambda happy_var_1) -> + case happyOut47 happy_x_2 of { happy_var_2 -> + case happyOut29 happy_x_3 of { happy_var_3 -> + happyIn33+ (Lam (getRange (happy_var_1,happy_var_2,happy_var_3)) happy_var_2 happy_var_3+ )}}}++happyReduce_139 = happySpecReduce_1 27# happyReduction_139+happyReduction_139 happy_x_1+ = case happyOut34 happy_x_1 of { happy_var_1 -> + happyIn33+ (happy_var_1+ )}++happyReduce_140 = happyReduce 4# 27# happyReduction_140+happyReduction_140 (happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest)+ = case happyOutTok happy_x_1 of { (TokKeyword KwLet happy_var_1) -> + case happyOut133 happy_x_2 of { happy_var_2 -> + case happyOutTok happy_x_3 of { (TokKeyword KwIn happy_var_3) -> + case happyOut29 happy_x_4 of { happy_var_4 -> + happyIn33+ (Let (getRange (happy_var_1,happy_var_2,happy_var_3,happy_var_4)) happy_var_2 happy_var_4+ ) `HappyStk` happyRest}}}}++happyReduce_141 = happySpecReduce_1 27# happyReduction_141+happyReduction_141 happy_x_1+ = case happyOut38 happy_x_1 of { happy_var_1 -> + happyIn33+ (happy_var_1+ )}++happyReduce_142 = happyReduce 4# 27# happyReduction_142+happyReduction_142 (happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest)+ = case happyOutTok happy_x_1 of { (TokKeyword KwQuoteGoal happy_var_1) -> + case happyOut15 happy_x_2 of { happy_var_2 -> + case happyOutTok happy_x_3 of { (TokKeyword KwIn happy_var_3) -> + case happyOut29 happy_x_4 of { happy_var_4 -> + happyIn33+ (QuoteGoal (getRange (happy_var_1,happy_var_2,happy_var_3,happy_var_4)) happy_var_2 happy_var_4+ ) `HappyStk` happyRest}}}}++happyReduce_143 = happyReduce 4# 28# happyReduction_143+happyReduction_143 (happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest)+ = case happyOutTok happy_x_1 of { (TokSymbol SymLambda happy_var_1) -> + case happyOutTok happy_x_2 of { (TokSymbol SymOpenBrace happy_var_2) -> + case happyOut54 happy_x_3 of { happy_var_3 -> + case happyOutTok happy_x_4 of { (TokSymbol SymCloseBrace happy_var_4) -> + happyIn34+ (ExtendedLam (getRange (happy_var_1,happy_var_2,happy_var_3,happy_var_4)) (reverse happy_var_3)+ ) `HappyStk` happyRest}}}}++happyReduce_144 = happyMonadReduce 2# 28# happyReduction_144+happyReduction_144 (happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen (case happyOutTok happy_x_1 of { (TokSymbol SymLambda happy_var_1) -> + case happyOut48 happy_x_2 of { happy_var_2 -> + ( case happy_var_2 of+ Left (bs, h) -> if null bs then return $ AbsurdLam r h else+ return $ Lam r bs (AbsurdLam r h)+ where r = fuseRange happy_var_1 bs+ Right es -> do -- it is of the form @\ { p1 ... () }@+ p <- exprToLHS (RawApp (getRange es) es);+ return $ ExtendedLam (fuseRange happy_var_1 es)+ [(p [] [], AbsurdRHS, NoWhere)])}}+ ) (\r -> happyReturn (happyIn34 r))++happyReduce_145 = happySpecReduce_1 29# happyReduction_145+happyReduction_145 happy_x_1+ = case happyOut38 happy_x_1 of { happy_var_1 -> + happyIn35+ ([happy_var_1]+ )}++happyReduce_146 = happySpecReduce_2 29# happyReduction_146+happyReduction_146 happy_x_2+ happy_x_1+ = case happyOut38 happy_x_1 of { happy_var_1 -> + case happyOut35 happy_x_2 of { happy_var_2 -> + happyIn35+ (happy_var_1 : happy_var_2+ )}}++happyReduce_147 = happySpecReduce_3 30# happyReduction_147+happyReduction_147 happy_x_3+ happy_x_2+ happy_x_1+ = case happyOutTok happy_x_1 of { (TokSymbol SymOpenBrace happy_var_1) -> + case happyOut29 happy_x_2 of { happy_var_2 -> + case happyOutTok happy_x_3 of { (TokSymbol SymCloseBrace happy_var_3) -> + happyIn36+ (HiddenArg (getRange (happy_var_1,happy_var_2,happy_var_3)) (unnamed happy_var_2)+ )}}}++happyReduce_148 = happyReduce 5# 30# happyReduction_148+happyReduction_148 (happy_x_5 `HappyStk`+ happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest)+ = case happyOutTok happy_x_1 of { (TokSymbol SymOpenBrace happy_var_1) -> + case happyOut15 happy_x_2 of { happy_var_2 -> + case happyOutTok happy_x_3 of { (TokSymbol SymEqual happy_var_3) -> + case happyOut29 happy_x_4 of { happy_var_4 -> + case happyOutTok happy_x_5 of { (TokSymbol SymCloseBrace happy_var_5) -> + happyIn36+ (HiddenArg (getRange (happy_var_1,happy_var_2,happy_var_3,happy_var_4,happy_var_5))+ (named (show happy_var_2) happy_var_4)+ ) `HappyStk` happyRest}}}}}++happyReduce_149 = happySpecReduce_2 30# happyReduction_149+happyReduction_149 happy_x_2+ happy_x_1+ = case happyOutTok happy_x_1 of { (TokSymbol SymOpenBrace happy_var_1) -> + case happyOutTok happy_x_2 of { (TokSymbol SymCloseBrace happy_var_2) -> + happyIn36+ (let r = fuseRange happy_var_1 happy_var_2 in HiddenArg r $ unnamed $ Absurd r+ )}}++happyReduce_150 = happySpecReduce_1 31# happyReduction_150+happyReduction_150 happy_x_1+ = case happyOut21 happy_x_1 of { happy_var_1 -> + happyIn37+ (Ident happy_var_1+ )}++happyReduce_151 = happySpecReduce_1 31# happyReduction_151+happyReduction_151 happy_x_1+ = case happyOutTok happy_x_1 of { (TokLiteral happy_var_1) -> + happyIn37+ (Lit happy_var_1+ )}++happyReduce_152 = happySpecReduce_1 31# happyReduction_152+happyReduction_152 happy_x_1+ = case happyOutTok happy_x_1 of { (TokSymbol SymQuestionMark happy_var_1) -> + happyIn37+ (QuestionMark (getRange happy_var_1) Nothing+ )}++happyReduce_153 = happySpecReduce_1 31# happyReduction_153+happyReduction_153 happy_x_1+ = case happyOutTok happy_x_1 of { (TokSymbol SymUnderscore happy_var_1) -> + happyIn37+ (Underscore (getRange happy_var_1) Nothing+ )}++happyReduce_154 = happySpecReduce_1 31# happyReduction_154+happyReduction_154 happy_x_1+ = case happyOutTok happy_x_1 of { (TokKeyword KwProp happy_var_1) -> + happyIn37+ (Prop (getRange happy_var_1)+ )}++happyReduce_155 = happySpecReduce_1 31# happyReduction_155+happyReduction_155 happy_x_1+ = case happyOutTok happy_x_1 of { (TokKeyword KwSet happy_var_1) -> + happyIn37+ (Set (getRange happy_var_1)+ )}++happyReduce_156 = happySpecReduce_1 31# happyReduction_156+happyReduction_156 happy_x_1+ = case happyOutTok happy_x_1 of { (TokKeyword KwQuote happy_var_1) -> + happyIn37+ (Quote (getRange happy_var_1)+ )}++happyReduce_157 = happySpecReduce_1 31# happyReduction_157+happyReduction_157 happy_x_1+ = case happyOutTok happy_x_1 of { (TokKeyword KwQuoteTerm happy_var_1) -> + happyIn37+ (QuoteTerm (getRange happy_var_1)+ )}++happyReduce_158 = happySpecReduce_1 31# happyReduction_158+happyReduction_158 happy_x_1+ = case happyOutTok happy_x_1 of { (TokKeyword KwUnquote happy_var_1) -> + happyIn37+ (Unquote (getRange happy_var_1)+ )}++happyReduce_159 = happySpecReduce_1 31# happyReduction_159+happyReduction_159 happy_x_1+ = case happyOutTok happy_x_1 of { (TokSetN happy_var_1) -> + happyIn37+ (SetN (getRange (fst happy_var_1)) (snd happy_var_1)+ )}++happyReduce_160 = happySpecReduce_3 31# happyReduction_160+happyReduction_160 happy_x_3+ happy_x_2+ happy_x_1+ = case happyOutTok happy_x_1 of { (TokSymbol SymDoubleOpenBrace happy_var_1) -> + case happyOut29 happy_x_2 of { happy_var_2 -> + case happyOut17 happy_x_3 of { happy_var_3 -> + happyIn37+ (InstanceArg (getRange (happy_var_1,happy_var_2,happy_var_3))+ (unnamed happy_var_2)+ )}}}++happyReduce_161 = happyReduce 5# 31# happyReduction_161+happyReduction_161 (happy_x_5 `HappyStk`+ happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest)+ = case happyOutTok happy_x_1 of { (TokSymbol SymDoubleOpenBrace happy_var_1) -> + case happyOut15 happy_x_2 of { happy_var_2 -> + case happyOutTok happy_x_3 of { (TokSymbol SymEqual happy_var_3) -> + case happyOut29 happy_x_4 of { happy_var_4 -> + case happyOut17 happy_x_5 of { happy_var_5 -> + happyIn37+ (InstanceArg (getRange (happy_var_1,happy_var_2,happy_var_3,happy_var_4,happy_var_5))+ (named (show happy_var_2) happy_var_4)+ ) `HappyStk` happyRest}}}}}++happyReduce_162 = happySpecReduce_3 31# happyReduction_162+happyReduction_162 happy_x_3+ happy_x_2+ happy_x_1+ = case happyOutTok happy_x_1 of { (TokSymbol SymOpenParen happy_var_1) -> + case happyOut29 happy_x_2 of { happy_var_2 -> + case happyOutTok happy_x_3 of { (TokSymbol SymCloseParen happy_var_3) -> + happyIn37+ (Paren (getRange (happy_var_1,happy_var_2,happy_var_3)) happy_var_2+ )}}}++happyReduce_163 = happySpecReduce_2 31# happyReduction_163+happyReduction_163 happy_x_2+ happy_x_1+ = case happyOutTok happy_x_1 of { (TokSymbol SymOpenParen happy_var_1) -> + case happyOutTok happy_x_2 of { (TokSymbol SymCloseParen happy_var_2) -> + happyIn37+ (Absurd (fuseRange happy_var_1 happy_var_2)+ )}}++happyReduce_164 = happySpecReduce_2 31# happyReduction_164+happyReduction_164 happy_x_2+ happy_x_1+ = case happyOutTok happy_x_1 of { (TokSymbol SymDoubleOpenBrace happy_var_1) -> + case happyOut17 happy_x_2 of { happy_var_2 -> + happyIn37+ (let r = fuseRange happy_var_1 happy_var_2 in InstanceArg r $ unnamed $ Absurd r+ )}}++happyReduce_165 = happySpecReduce_3 31# happyReduction_165+happyReduction_165 happy_x_3+ happy_x_2+ happy_x_1+ = case happyOut15 happy_x_1 of { happy_var_1 -> + case happyOutTok happy_x_2 of { (TokSymbol SymAs happy_var_2) -> + case happyOut38 happy_x_3 of { happy_var_3 -> + happyIn37+ (As (getRange (happy_var_1,happy_var_2,happy_var_3)) happy_var_1 happy_var_3+ )}}}++happyReduce_166 = happySpecReduce_2 31# happyReduction_166+happyReduction_166 happy_x_2+ happy_x_1+ = case happyOutTok happy_x_1 of { (TokSymbol SymDot happy_var_1) -> + case happyOut38 happy_x_2 of { happy_var_2 -> + happyIn37+ (Dot (fuseRange happy_var_1 happy_var_2) happy_var_2+ )}}++happyReduce_167 = happyReduce 4# 31# happyReduction_167+happyReduction_167 (happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest)+ = case happyOutTok happy_x_1 of { (TokKeyword KwRecord happy_var_1) -> + case happyOutTok happy_x_2 of { (TokSymbol SymOpenBrace happy_var_2) -> + case happyOut39 happy_x_3 of { happy_var_3 -> + case happyOutTok happy_x_4 of { (TokSymbol SymCloseBrace happy_var_4) -> + happyIn37+ (Rec (getRange (happy_var_1,happy_var_2,happy_var_3,happy_var_4)) happy_var_3+ ) `HappyStk` happyRest}}}}++happyReduce_168 = happyReduce 5# 31# happyReduction_168+happyReduction_168 (happy_x_5 `HappyStk`+ happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest)+ = case happyOutTok happy_x_1 of { (TokKeyword KwRecord happy_var_1) -> + case happyOut37 happy_x_2 of { happy_var_2 -> + case happyOutTok happy_x_3 of { (TokSymbol SymOpenBrace happy_var_3) -> + case happyOut39 happy_x_4 of { happy_var_4 -> + case happyOutTok happy_x_5 of { (TokSymbol SymCloseBrace happy_var_5) -> + happyIn37+ (RecUpdate (getRange (happy_var_1,happy_var_2,happy_var_3,happy_var_4,happy_var_5)) happy_var_2 happy_var_4+ ) `HappyStk` happyRest}}}}}++happyReduce_169 = happySpecReduce_1 32# happyReduction_169+happyReduction_169 happy_x_1+ = case happyOut36 happy_x_1 of { happy_var_1 -> + happyIn38+ (happy_var_1+ )}++happyReduce_170 = happySpecReduce_1 32# happyReduction_170+happyReduction_170 happy_x_1+ = case happyOut37 happy_x_1 of { happy_var_1 -> + happyIn38+ (happy_var_1+ )}++happyReduce_171 = happySpecReduce_0 33# happyReduction_171+happyReduction_171 = happyIn39+ ([]+ )++happyReduce_172 = happySpecReduce_1 33# happyReduction_172+happyReduction_172 happy_x_1+ = case happyOut40 happy_x_1 of { happy_var_1 -> + happyIn39+ (happy_var_1+ )}++happyReduce_173 = happySpecReduce_1 34# happyReduction_173+happyReduction_173 happy_x_1+ = case happyOut41 happy_x_1 of { happy_var_1 -> + happyIn40+ ([happy_var_1]+ )}++happyReduce_174 = happySpecReduce_3 34# happyReduction_174+happyReduction_174 happy_x_3+ happy_x_2+ happy_x_1+ = case happyOut41 happy_x_1 of { happy_var_1 -> + case happyOut40 happy_x_3 of { happy_var_3 -> + happyIn40+ (happy_var_1 : happy_var_3+ )}}++happyReduce_175 = happySpecReduce_3 35# happyReduction_175+happyReduction_175 happy_x_3+ happy_x_2+ happy_x_1+ = case happyOut15 happy_x_1 of { happy_var_1 -> + case happyOut29 happy_x_3 of { happy_var_3 -> + happyIn41+ ((happy_var_1, happy_var_3)+ )}}++happyReduce_176 = happySpecReduce_2 36# happyReduction_176+happyReduction_176 happy_x_2+ happy_x_1+ = case happyOut43 happy_x_1 of { happy_var_1 -> + happyIn42+ (happy_var_1+ )}++happyReduce_177 = happySpecReduce_1 37# happyReduction_177+happyReduction_177 happy_x_1+ = case happyOut44 happy_x_1 of { happy_var_1 -> + happyIn43+ ({-TeleBind-} happy_var_1+ )}++happyReduce_178 = happySpecReduce_2 38# happyReduction_178+happyReduction_178 happy_x_2+ happy_x_1+ = case happyOut45 happy_x_1 of { happy_var_1 -> + case happyOut44 happy_x_2 of { happy_var_2 -> + happyIn44+ (happy_var_1 : happy_var_2+ )}}++happyReduce_179 = happySpecReduce_1 38# happyReduction_179+happyReduction_179 happy_x_1+ = case happyOut45 happy_x_1 of { happy_var_1 -> + happyIn44+ ([happy_var_1]+ )}++happyReduce_180 = happyReduce 4# 39# happyReduction_180+happyReduction_180 (happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest)+ = case happyOutTok happy_x_2 of { (TokSymbol SymOpenParen happy_var_2) -> + case happyOut46 happy_x_3 of { happy_var_3 -> + case happyOutTok happy_x_4 of { (TokSymbol SymCloseParen happy_var_4) -> + happyIn45+ (TypedBindings (getRange (happy_var_2,happy_var_3,happy_var_4)) (Arg NotHidden Irrelevant happy_var_3)+ ) `HappyStk` happyRest}}}++happyReduce_181 = happyReduce 4# 39# happyReduction_181+happyReduction_181 (happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest)+ = case happyOutTok happy_x_2 of { (TokSymbol SymOpenBrace happy_var_2) -> + case happyOut46 happy_x_3 of { happy_var_3 -> + case happyOutTok happy_x_4 of { (TokSymbol SymCloseBrace happy_var_4) -> + happyIn45+ (TypedBindings (getRange (happy_var_2,happy_var_3,happy_var_4)) (Arg Hidden Irrelevant happy_var_3)+ ) `HappyStk` happyRest}}}++happyReduce_182 = happyReduce 4# 39# happyReduction_182+happyReduction_182 (happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest)+ = case happyOutTok happy_x_2 of { (TokSymbol SymDoubleOpenBrace happy_var_2) -> + case happyOut46 happy_x_3 of { happy_var_3 -> + case happyOut17 happy_x_4 of { happy_var_4 -> + happyIn45+ (TypedBindings (getRange (happy_var_2,happy_var_3,happy_var_4))+ (Arg Instance Irrelevant happy_var_3)+ ) `HappyStk` happyRest}}}++happyReduce_183 = happyReduce 4# 39# happyReduction_183+happyReduction_183 (happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest)+ = case happyOutTok happy_x_2 of { (TokSymbol SymOpenParen happy_var_2) -> + case happyOut46 happy_x_3 of { happy_var_3 -> + case happyOutTok happy_x_4 of { (TokSymbol SymCloseParen happy_var_4) -> + happyIn45+ (TypedBindings (getRange (happy_var_2,happy_var_3,happy_var_4)) (Arg NotHidden NonStrict happy_var_3)+ ) `HappyStk` happyRest}}}++happyReduce_184 = happyReduce 4# 39# happyReduction_184+happyReduction_184 (happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest)+ = case happyOutTok happy_x_2 of { (TokSymbol SymOpenBrace happy_var_2) -> + case happyOut46 happy_x_3 of { happy_var_3 -> + case happyOutTok happy_x_4 of { (TokSymbol SymCloseBrace happy_var_4) -> + happyIn45+ (TypedBindings (getRange (happy_var_2,happy_var_3,happy_var_4)) (Arg Hidden NonStrict happy_var_3)+ ) `HappyStk` happyRest}}}++happyReduce_185 = happyReduce 4# 39# happyReduction_185+happyReduction_185 (happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest)+ = case happyOutTok happy_x_2 of { (TokSymbol SymDoubleOpenBrace happy_var_2) -> + case happyOut46 happy_x_3 of { happy_var_3 -> + case happyOut17 happy_x_4 of { happy_var_4 -> + happyIn45+ (TypedBindings (getRange (happy_var_2,happy_var_3,happy_var_4)) (Arg Instance NonStrict happy_var_3)+ ) `HappyStk` happyRest}}}++happyReduce_186 = happySpecReduce_3 39# happyReduction_186+happyReduction_186 happy_x_3+ happy_x_2+ happy_x_1+ = case happyOutTok happy_x_1 of { (TokSymbol SymOpenParen happy_var_1) -> + case happyOut46 happy_x_2 of { happy_var_2 -> + case happyOutTok happy_x_3 of { (TokSymbol SymCloseParen happy_var_3) -> + happyIn45+ (TypedBindings (getRange (happy_var_1,happy_var_2,happy_var_3)) (Arg NotHidden Relevant happy_var_2)+ )}}}++happyReduce_187 = happySpecReduce_3 39# happyReduction_187+happyReduction_187 happy_x_3+ happy_x_2+ happy_x_1+ = case happyOutTok happy_x_1 of { (TokSymbol SymDoubleOpenBrace happy_var_1) -> + case happyOut46 happy_x_2 of { happy_var_2 -> + case happyOut17 happy_x_3 of { happy_var_3 -> + happyIn45+ (TypedBindings (getRange (happy_var_1,happy_var_2,happy_var_3)) (Arg Instance Relevant happy_var_2)+ )}}}++happyReduce_188 = happySpecReduce_3 39# happyReduction_188+happyReduction_188 happy_x_3+ happy_x_2+ happy_x_1+ = case happyOutTok happy_x_1 of { (TokSymbol SymOpenBrace happy_var_1) -> + case happyOut46 happy_x_2 of { happy_var_2 -> + case happyOutTok happy_x_3 of { (TokSymbol SymCloseBrace happy_var_3) -> + happyIn45+ (TypedBindings (getRange (happy_var_1,happy_var_2,happy_var_3)) (Arg Hidden Relevant happy_var_2)+ )}}}++happyReduce_189 = happySpecReduce_3 40# happyReduction_189+happyReduction_189 happy_x_3+ happy_x_2+ happy_x_1+ = case happyOut25 happy_x_1 of { happy_var_1 -> + case happyOutTok happy_x_2 of { (TokSymbol SymColon happy_var_2) -> + case happyOut29 happy_x_3 of { happy_var_3 -> + happyIn46+ (TBind (getRange (happy_var_1,happy_var_2,happy_var_3)) (map mkBoundName_ happy_var_1) happy_var_3+ )}}}++happyReduce_190 = happyMonadReduce 2# 41# happyReduction_190+happyReduction_190 (happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen (case happyOut49 happy_x_1 of { happy_var_1 -> + (+ case reverse happy_var_1 of+ Left _ : _ -> parseError "Absurd lambda cannot have a body."+ _ : _ -> return [ b | Right b <- happy_var_1 ]+ [] -> parsePanic "Empty LamBinds")}+ ) (\r -> happyReturn (happyIn47 r))++happyReduce_191 = happyMonadReduce 1# 42# happyReduction_191+happyReduction_191 (happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen (case happyOut50 happy_x_1 of { happy_var_1 -> + (+ case happy_var_1 of+ Left lb -> case reverse lb of+ Right _ : _ -> parseError "Missing body for lambda"+ Left h : _ -> return $ Left ([ b | Right b <- init lb], h)+ _ -> parsePanic "Empty LamBindsAbsurd"+ Right es -> return $ Right es)}+ ) (\r -> happyReturn (happyIn48 r))++happyReduce_192 = happySpecReduce_2 43# happyReduction_192+happyReduction_192 happy_x_2+ happy_x_1+ = case happyOut58 happy_x_1 of { happy_var_1 -> + case happyOut49 happy_x_2 of { happy_var_2 -> + happyIn49+ (map Right happy_var_1 ++ happy_var_2+ )}}++happyReduce_193 = happySpecReduce_2 43# happyReduction_193+happyReduction_193 happy_x_2+ happy_x_1+ = case happyOut45 happy_x_1 of { happy_var_1 -> + case happyOut49 happy_x_2 of { happy_var_2 -> + happyIn49+ (Right (DomainFull happy_var_1) : happy_var_2+ )}}++happyReduce_194 = happySpecReduce_1 43# happyReduction_194+happyReduction_194 happy_x_1+ = case happyOut58 happy_x_1 of { happy_var_1 -> + happyIn49+ (map Right happy_var_1+ )}++happyReduce_195 = happySpecReduce_1 43# happyReduction_195+happyReduction_195 happy_x_1+ = case happyOut45 happy_x_1 of { happy_var_1 -> + happyIn49+ ([Right $ DomainFull happy_var_1]+ )}++happyReduce_196 = happySpecReduce_2 43# happyReduction_196+happyReduction_196 happy_x_2+ happy_x_1+ = happyIn49+ ([Left NotHidden]+ )++happyReduce_197 = happySpecReduce_2 43# happyReduction_197+happyReduction_197 happy_x_2+ happy_x_1+ = happyIn49+ ([Left Hidden]+ )++happyReduce_198 = happySpecReduce_2 43# happyReduction_198+happyReduction_198 happy_x_2+ happy_x_1+ = happyIn49+ ([Left Instance]+ )++happyReduce_199 = happySpecReduce_2 44# happyReduction_199+happyReduction_199 happy_x_2+ happy_x_1+ = case happyOut58 happy_x_1 of { happy_var_1 -> + case happyOut49 happy_x_2 of { happy_var_2 -> + happyIn50+ (Left $ map Right happy_var_1 ++ happy_var_2+ )}}++happyReduce_200 = happySpecReduce_2 44# happyReduction_200+happyReduction_200 happy_x_2+ happy_x_1+ = case happyOut45 happy_x_1 of { happy_var_1 -> + case happyOut49 happy_x_2 of { happy_var_2 -> + happyIn50+ (Left $ Right (DomainFull happy_var_1) : happy_var_2+ )}}++happyReduce_201 = happySpecReduce_1 44# happyReduction_201+happyReduction_201 happy_x_1+ = case happyOut59 happy_x_1 of { happy_var_1 -> + happyIn50+ (case happy_var_1 of+ Left lb -> Left $ map Right lb+ Right es -> Right es+ )}++happyReduce_202 = happySpecReduce_1 44# happyReduction_202+happyReduction_202 happy_x_1+ = case happyOut45 happy_x_1 of { happy_var_1 -> + happyIn50+ (Left [Right $ DomainFull happy_var_1]+ )}++happyReduce_203 = happySpecReduce_2 44# happyReduction_203+happyReduction_203 happy_x_2+ happy_x_1+ = happyIn50+ (Left [Left NotHidden]+ )++happyReduce_204 = happySpecReduce_2 44# happyReduction_204+happyReduction_204 happy_x_2+ happy_x_1+ = happyIn50+ (Left [Left Hidden]+ )++happyReduce_205 = happySpecReduce_2 44# happyReduction_205+happyReduction_205 happy_x_2+ happy_x_1+ = happyIn50+ (Left [Left Instance]+ )++happyReduce_206 = happyMonadReduce 3# 45# happyReduction_206+happyReduction_206 (happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen (case happyOut35 happy_x_1 of { happy_var_1 -> + case happyOut29 happy_x_3 of { happy_var_3 -> + ( do+ p <- exprToLHS (RawApp (getRange happy_var_1) happy_var_1) ;+ return (p [] [], RHS happy_var_3, NoWhere))}}+ ) (\r -> happyReturn (happyIn51 r))++happyReduce_207 = happyMonadReduce 1# 46# happyReduction_207+happyReduction_207 (happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen (case happyOut32 happy_x_1 of { happy_var_1 -> + ( do+ p <- exprToLHS (RawApp (getRange happy_var_1) happy_var_1);+ return (p [] [], AbsurdRHS, NoWhere))}+ ) (\r -> happyReturn (happyIn52 r))++happyReduce_208 = happySpecReduce_1 47# happyReduction_208+happyReduction_208 happy_x_1+ = case happyOut51 happy_x_1 of { happy_var_1 -> + happyIn53+ (happy_var_1+ )}++happyReduce_209 = happySpecReduce_1 47# happyReduction_209+happyReduction_209 happy_x_1+ = case happyOut52 happy_x_1 of { happy_var_1 -> + happyIn53+ (happy_var_1+ )}++happyReduce_210 = happySpecReduce_3 48# happyReduction_210+happyReduction_210 happy_x_3+ happy_x_2+ happy_x_1+ = case happyOut54 happy_x_1 of { happy_var_1 -> + case happyOut53 happy_x_3 of { happy_var_3 -> + happyIn54+ (happy_var_3 : happy_var_1+ )}}++happyReduce_211 = happySpecReduce_3 48# happyReduction_211+happyReduction_211 happy_x_3+ happy_x_2+ happy_x_1+ = case happyOut52 happy_x_1 of { happy_var_1 -> + case happyOut53 happy_x_3 of { happy_var_3 -> + happyIn54+ ([happy_var_3, happy_var_1]+ )}}++happyReduce_212 = happySpecReduce_1 48# happyReduction_212+happyReduction_212 happy_x_1+ = case happyOut51 happy_x_1 of { happy_var_1 -> + happyIn54+ ([happy_var_1]+ )}++happyReduce_213 = happySpecReduce_2 49# happyReduction_213+happyReduction_213 happy_x_2+ happy_x_1+ = case happyOut56 happy_x_1 of { happy_var_1 -> + happyIn55+ (happy_var_1+ )}++happyReduce_214 = happySpecReduce_2 50# happyReduction_214+happyReduction_214 happy_x_2+ happy_x_1+ = case happyOut58 happy_x_1 of { happy_var_1 -> + case happyOut56 happy_x_2 of { happy_var_2 -> + happyIn56+ (happy_var_1 ++ happy_var_2+ )}}++happyReduce_215 = happySpecReduce_2 50# happyReduction_215+happyReduction_215 happy_x_2+ happy_x_1+ = case happyOut45 happy_x_1 of { happy_var_1 -> + case happyOut56 happy_x_2 of { happy_var_2 -> + happyIn56+ (DomainFull happy_var_1 : happy_var_2+ )}}++happyReduce_216 = happySpecReduce_1 50# happyReduction_216+happyReduction_216 happy_x_1+ = case happyOut58 happy_x_1 of { happy_var_1 -> + happyIn56+ (happy_var_1+ )}++happyReduce_217 = happySpecReduce_1 50# happyReduction_217+happyReduction_217 happy_x_1+ = case happyOut45 happy_x_1 of { happy_var_1 -> + happyIn56+ ([DomainFull happy_var_1]+ )}++happyReduce_218 = happySpecReduce_2 51# happyReduction_218+happyReduction_218 happy_x_2+ happy_x_1+ = case happyOut58 happy_x_1 of { happy_var_1 -> + case happyOut57 happy_x_2 of { happy_var_2 -> + happyIn57+ (happy_var_1 ++ happy_var_2+ )}}++happyReduce_219 = happySpecReduce_2 51# happyReduction_219+happyReduction_219 happy_x_2+ happy_x_1+ = case happyOut45 happy_x_1 of { happy_var_1 -> + case happyOut57 happy_x_2 of { happy_var_2 -> + happyIn57+ (DomainFull happy_var_1 : happy_var_2+ )}}++happyReduce_220 = happySpecReduce_0 51# happyReduction_220+happyReduction_220 = happyIn57+ ([]+ )++happyReduce_221 = happySpecReduce_1 52# happyReduction_221+happyReduction_221 happy_x_1+ = case happyOut59 happy_x_1 of { happy_var_1 -> + happyIn58+ (case happy_var_1 of+ Left lbs -> lbs+ Right _ -> fail "expected sequence of bound identifiers, not absurd pattern"+ )}++happyReduce_222 = happySpecReduce_1 53# happyReduction_222+happyReduction_222 happy_x_1+ = case happyOut23 happy_x_1 of { happy_var_1 -> + happyIn59+ (Left [DomainFree NotHidden Relevant $ mkBoundName_ happy_var_1]+ )}++happyReduce_223 = happySpecReduce_2 53# happyReduction_223+happyReduction_223 happy_x_2+ happy_x_1+ = case happyOut23 happy_x_2 of { happy_var_2 -> + happyIn59+ (Left [DomainFree NotHidden Irrelevant $ mkBoundName_ happy_var_2]+ )}++happyReduce_224 = happySpecReduce_2 53# happyReduction_224+happyReduction_224 happy_x_2+ happy_x_1+ = case happyOut23 happy_x_2 of { happy_var_2 -> + happyIn59+ (Left [DomainFree NotHidden NonStrict $ mkBoundName_ happy_var_2]+ )}++happyReduce_225 = happySpecReduce_3 53# happyReduction_225+happyReduction_225 happy_x_3+ happy_x_2+ happy_x_1+ = case happyOut26 happy_x_2 of { happy_var_2 -> + happyIn59+ (either (Left . map (DomainFree Hidden Relevant . mkBoundName_)) Right happy_var_2+ )}++happyReduce_226 = happySpecReduce_3 53# happyReduction_226+happyReduction_226 happy_x_3+ happy_x_2+ happy_x_1+ = case happyOut25 happy_x_2 of { happy_var_2 -> + happyIn59+ (Left $ map (DomainFree Instance Relevant . mkBoundName_) happy_var_2+ )}++happyReduce_227 = happyReduce 4# 53# happyReduction_227+happyReduction_227 (happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest)+ = case happyOut25 happy_x_3 of { happy_var_3 -> + happyIn59+ (Left $ map (DomainFree Hidden Irrelevant . mkBoundName_) happy_var_3+ ) `HappyStk` happyRest}++happyReduce_228 = happyReduce 4# 53# happyReduction_228+happyReduction_228 (happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest)+ = case happyOut25 happy_x_3 of { happy_var_3 -> + happyIn59+ (Left $ map (DomainFree Instance Irrelevant . mkBoundName_) happy_var_3+ ) `HappyStk` happyRest}++happyReduce_229 = happyReduce 4# 53# happyReduction_229+happyReduction_229 (happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest)+ = case happyOut25 happy_x_3 of { happy_var_3 -> + happyIn59+ (Left $ map (DomainFree Hidden NonStrict . mkBoundName_) happy_var_3+ ) `HappyStk` happyRest}++happyReduce_230 = happyReduce 4# 53# happyReduction_230+happyReduction_230 (happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest)+ = case happyOut25 happy_x_3 of { happy_var_3 -> + happyIn59+ (Left $ map (DomainFree Instance NonStrict . mkBoundName_) happy_var_3+ ) `HappyStk` happyRest}++happyReduce_231 = happyMonadReduce 1# 54# happyReduction_231+happyReduction_231 (happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen (case happyOut61 happy_x_1 of { happy_var_1 -> + ( verifyImportDirective happy_var_1)}+ ) (\r -> happyReturn (happyIn60 r))++happyReduce_232 = happySpecReduce_2 55# happyReduction_232+happyReduction_232 happy_x_2+ happy_x_1+ = case happyOut62 happy_x_2 of { happy_var_2 -> + happyIn61+ (happy_var_2 { publicOpen = True }+ )}++happyReduce_233 = happySpecReduce_1 55# happyReduction_233+happyReduction_233 happy_x_1+ = case happyOut62 happy_x_1 of { happy_var_1 -> + happyIn61+ (happy_var_1+ )}++happyReduce_234 = happySpecReduce_2 56# happyReduction_234+happyReduction_234 happy_x_2+ happy_x_1+ = case happyOut63 happy_x_1 of { happy_var_1 -> + case happyOut64 happy_x_2 of { happy_var_2 -> + happyIn62+ (ImportDirective (fuseRange (snd happy_var_1) (snd happy_var_2)) (fst happy_var_1) (fst happy_var_2) False+ )}}++happyReduce_235 = happySpecReduce_1 56# happyReduction_235+happyReduction_235 happy_x_1+ = case happyOut64 happy_x_1 of { happy_var_1 -> + happyIn62+ (ImportDirective (getRange (snd happy_var_1)) (Hiding []) (fst happy_var_1) False+ )}++happyReduce_236 = happySpecReduce_1 56# happyReduction_236+happyReduction_236 happy_x_1+ = case happyOut63 happy_x_1 of { happy_var_1 -> + happyIn62+ (ImportDirective (getRange (snd happy_var_1)) (fst happy_var_1) [] False+ )}++happyReduce_237 = happySpecReduce_0 56# happyReduction_237+happyReduction_237 = happyIn62+ (defaultImportDir+ )++happyReduce_238 = happyReduce 4# 57# happyReduction_238+happyReduction_238 (happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest)+ = case happyOutTok happy_x_1 of { (TokKeyword KwUsing happy_var_1) -> + case happyOutTok happy_x_2 of { (TokSymbol SymOpenParen happy_var_2) -> + case happyOut69 happy_x_3 of { happy_var_3 -> + case happyOutTok happy_x_4 of { (TokSymbol SymCloseParen happy_var_4) -> + happyIn63+ ((Using happy_var_3 , getRange (happy_var_1,happy_var_2,happy_var_3,happy_var_4))+ ) `HappyStk` happyRest}}}}++happyReduce_239 = happyReduce 4# 57# happyReduction_239+happyReduction_239 (happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest)+ = case happyOutTok happy_x_1 of { (TokKeyword KwHiding happy_var_1) -> + case happyOutTok happy_x_2 of { (TokSymbol SymOpenParen happy_var_2) -> + case happyOut70 happy_x_3 of { happy_var_3 -> + case happyOutTok happy_x_4 of { (TokSymbol SymCloseParen happy_var_4) -> + happyIn63+ ((Hiding happy_var_3 , getRange (happy_var_1,happy_var_2,happy_var_3,happy_var_4))+ ) `HappyStk` happyRest}}}}++happyReduce_240 = happyReduce 4# 58# happyReduction_240+happyReduction_240 (happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest)+ = case happyOutTok happy_x_1 of { (TokKeyword KwRenaming happy_var_1) -> + case happyOutTok happy_x_2 of { (TokSymbol SymOpenParen happy_var_2) -> + case happyOut65 happy_x_3 of { happy_var_3 -> + case happyOutTok happy_x_4 of { (TokSymbol SymCloseParen happy_var_4) -> + happyIn64+ ((happy_var_3 , getRange (happy_var_1,happy_var_2,happy_var_3,happy_var_4))+ ) `HappyStk` happyRest}}}}++happyReduce_241 = happySpecReduce_3 59# happyReduction_241+happyReduction_241 happy_x_3+ happy_x_2+ happy_x_1+ = case happyOut66 happy_x_1 of { happy_var_1 -> + case happyOut65 happy_x_3 of { happy_var_3 -> + happyIn65+ (happy_var_1 : happy_var_3+ )}}++happyReduce_242 = happySpecReduce_1 59# happyReduction_242+happyReduction_242 happy_x_1+ = case happyOut66 happy_x_1 of { happy_var_1 -> + happyIn65+ ([happy_var_1]+ )}++happyReduce_243 = happySpecReduce_3 60# happyReduction_243+happyReduction_243 happy_x_3+ happy_x_2+ happy_x_1+ = case happyOut67 happy_x_1 of { happy_var_1 -> + case happyOutTok happy_x_2 of { (TokKeyword KwTo happy_var_2) -> + case happyOut15 happy_x_3 of { happy_var_3 -> + happyIn66+ (Renaming happy_var_1 happy_var_3 (getRange happy_var_2)+ )}}}++happyReduce_244 = happySpecReduce_2 61# happyReduction_244+happyReduction_244 happy_x_2+ happy_x_1+ = case happyOut15 happy_x_2 of { happy_var_2 -> + happyIn67+ (ImportedName happy_var_2+ )}++happyReduce_245 = happySpecReduce_3 61# happyReduction_245+happyReduction_245 happy_x_3+ happy_x_2+ happy_x_1+ = case happyOut15 happy_x_3 of { happy_var_3 -> + happyIn67+ (ImportedModule happy_var_3+ )}++happyReduce_246 = happySpecReduce_1 62# happyReduction_246+happyReduction_246 happy_x_1+ = case happyOut15 happy_x_1 of { happy_var_1 -> + happyIn68+ (ImportedName happy_var_1+ )}++happyReduce_247 = happySpecReduce_2 62# happyReduction_247+happyReduction_247 happy_x_2+ happy_x_1+ = case happyOut15 happy_x_2 of { happy_var_2 -> + happyIn68+ (ImportedModule happy_var_2+ )}++happyReduce_248 = happySpecReduce_0 63# happyReduction_248+happyReduction_248 = happyIn69+ ([]+ )++happyReduce_249 = happySpecReduce_1 63# happyReduction_249+happyReduction_249 happy_x_1+ = case happyOut70 happy_x_1 of { happy_var_1 -> + happyIn69+ (happy_var_1+ )}++happyReduce_250 = happySpecReduce_1 64# happyReduction_250+happyReduction_250 happy_x_1+ = case happyOut68 happy_x_1 of { happy_var_1 -> + happyIn70+ ([happy_var_1]+ )}++happyReduce_251 = happySpecReduce_3 64# happyReduction_251+happyReduction_251 happy_x_3+ happy_x_2+ happy_x_1+ = case happyOut68 happy_x_1 of { happy_var_1 -> + case happyOut70 happy_x_3 of { happy_var_3 -> + happyIn70+ (happy_var_1 : happy_var_3+ )}}++happyReduce_252 = happyMonadReduce 3# 65# happyReduction_252+happyReduction_252 (happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen (case happyOut30 happy_x_1 of { happy_var_1 -> + case happyOut74 happy_x_2 of { happy_var_2 -> + case happyOut73 happy_x_3 of { happy_var_3 -> + ( exprToLHS happy_var_1 >>= \p -> return (p happy_var_2 happy_var_3))}}}+ ) (\r -> happyReturn (happyIn71 r))++happyReduce_253 = happyReduce 4# 65# happyReduction_253+happyReduction_253 (happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest)+ = case happyOutTok happy_x_1 of { (TokSymbol SymEllipsis happy_var_1) -> + case happyOut72 happy_x_2 of { happy_var_2 -> + case happyOut74 happy_x_3 of { happy_var_3 -> + case happyOut73 happy_x_4 of { happy_var_4 -> + happyIn71+ (Ellipsis (getRange (happy_var_1,happy_var_2,happy_var_3,happy_var_4)) happy_var_2 happy_var_3 happy_var_4+ ) `HappyStk` happyRest}}}}++happyReduce_254 = happySpecReduce_0 66# happyReduction_254+happyReduction_254 = happyIn72+ ([]+ )++happyReduce_255 = happyMonadReduce 3# 66# happyReduction_255+happyReduction_255 (happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen (case happyOut35 happy_x_2 of { happy_var_2 -> + case happyOut72 happy_x_3 of { happy_var_3 -> + ( exprToPattern (RawApp (getRange happy_var_2) happy_var_2) >>= \p ->+ return (p : happy_var_3))}}+ ) (\r -> happyReturn (happyIn72 r))++happyReduce_256 = happySpecReduce_0 67# happyReduction_256+happyReduction_256 = happyIn73+ ([]+ )++happyReduce_257 = happySpecReduce_2 67# happyReduction_257+happyReduction_257 happy_x_2+ happy_x_1+ = case happyOut29 happy_x_2 of { happy_var_2 -> + happyIn73+ (case happy_var_2 of { WithApp _ e es -> e : es; e -> [e] }+ )}++happyReduce_258 = happySpecReduce_0 68# happyReduction_258+happyReduction_258 = happyIn74+ ([]+ )++happyReduce_259 = happySpecReduce_2 68# happyReduction_259+happyReduction_259 happy_x_2+ happy_x_1+ = case happyOut29 happy_x_2 of { happy_var_2 -> + happyIn74+ (case happy_var_2 of { WithApp _ e es -> e : es; e -> [e] }+ )}++happyReduce_260 = happySpecReduce_0 69# happyReduction_260+happyReduction_260 = happyIn75+ (NoWhere+ )++happyReduce_261 = happySpecReduce_2 69# happyReduction_261+happyReduction_261 happy_x_2+ happy_x_1+ = case happyOut133 happy_x_2 of { happy_var_2 -> + happyIn75+ (AnyWhere happy_var_2+ )}++happyReduce_262 = happyReduce 4# 69# happyReduction_262+happyReduction_262 (happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest)+ = case happyOut15 happy_x_2 of { happy_var_2 -> + case happyOut133 happy_x_4 of { happy_var_4 -> + happyIn75+ (SomeWhere happy_var_2 happy_var_4+ ) `HappyStk` happyRest}}++happyReduce_263 = happySpecReduce_1 70# happyReduction_263+happyReduction_263 happy_x_1+ = case happyOut88 happy_x_1 of { happy_var_1 -> + happyIn76+ (happy_var_1+ )}++happyReduce_264 = happySpecReduce_1 70# happyReduction_264+happyReduction_264 happy_x_1+ = case happyOut80 happy_x_1 of { happy_var_1 -> + happyIn76+ (happy_var_1+ )}++happyReduce_265 = happySpecReduce_1 70# happyReduction_265+happyReduction_265 happy_x_1+ = case happyOut82 happy_x_1 of { happy_var_1 -> + happyIn76+ ([happy_var_1]+ )}++happyReduce_266 = happySpecReduce_1 70# happyReduction_266+happyReduction_266 happy_x_1+ = case happyOut83 happy_x_1 of { happy_var_1 -> + happyIn76+ ([happy_var_1]+ )}++happyReduce_267 = happySpecReduce_1 70# happyReduction_267+happyReduction_267 happy_x_1+ = case happyOut84 happy_x_1 of { happy_var_1 -> + happyIn76+ ([happy_var_1]+ )}++happyReduce_268 = happySpecReduce_1 70# happyReduction_268+happyReduction_268 happy_x_1+ = case happyOut85 happy_x_1 of { happy_var_1 -> + happyIn76+ ([happy_var_1]+ )}++happyReduce_269 = happySpecReduce_1 70# happyReduction_269+happyReduction_269 happy_x_1+ = case happyOut87 happy_x_1 of { happy_var_1 -> + happyIn76+ ([happy_var_1]+ )}++happyReduce_270 = happySpecReduce_1 70# happyReduction_270+happyReduction_270 happy_x_1+ = case happyOut89 happy_x_1 of { happy_var_1 -> + happyIn76+ ([happy_var_1]+ )}++happyReduce_271 = happySpecReduce_1 70# happyReduction_271+happyReduction_271 happy_x_1+ = case happyOut90 happy_x_1 of { happy_var_1 -> + happyIn76+ ([happy_var_1]+ )}++happyReduce_272 = happySpecReduce_1 70# happyReduction_272+happyReduction_272 happy_x_1+ = case happyOut91 happy_x_1 of { happy_var_1 -> + happyIn76+ ([happy_var_1]+ )}++happyReduce_273 = happySpecReduce_1 70# happyReduction_273+happyReduction_273 happy_x_1+ = case happyOut92 happy_x_1 of { happy_var_1 -> + happyIn76+ ([happy_var_1]+ )}++happyReduce_274 = happySpecReduce_1 70# happyReduction_274+happyReduction_274 happy_x_1+ = case happyOut93 happy_x_1 of { happy_var_1 -> + happyIn76+ ([happy_var_1]+ )}++happyReduce_275 = happySpecReduce_1 70# happyReduction_275+happyReduction_275 happy_x_1+ = case happyOut101 happy_x_1 of { happy_var_1 -> + happyIn76+ (happy_var_1+ )}++happyReduce_276 = happySpecReduce_1 70# happyReduction_276+happyReduction_276 happy_x_1+ = case happyOut104 happy_x_1 of { happy_var_1 -> + happyIn76+ ([happy_var_1]+ )}++happyReduce_277 = happySpecReduce_1 70# happyReduction_277+happyReduction_277 happy_x_1+ = case happyOut105 happy_x_1 of { happy_var_1 -> + happyIn76+ ([happy_var_1]+ )}++happyReduce_278 = happySpecReduce_1 70# happyReduction_278+happyReduction_278 happy_x_1+ = case happyOut109 happy_x_1 of { happy_var_1 -> + happyIn76+ ([happy_var_1]+ )}++happyReduce_279 = happySpecReduce_1 70# happyReduction_279+happyReduction_279 happy_x_1+ = case happyOut94 happy_x_1 of { happy_var_1 -> + happyIn76+ ([happy_var_1]+ )}++happyReduce_280 = happySpecReduce_1 70# happyReduction_280+happyReduction_280 happy_x_1+ = case happyOut95 happy_x_1 of { happy_var_1 -> + happyIn76+ ([happy_var_1]+ )}++happyReduce_281 = happySpecReduce_3 71# happyReduction_281+happyReduction_281 happy_x_3+ happy_x_2+ happy_x_1+ = case happyOut16 happy_x_1 of { happy_var_1 -> + case happyOut29 happy_x_3 of { happy_var_3 -> + happyIn77+ (map (flip (TypeSig Relevant) happy_var_3) happy_var_1+ )}}++happyReduce_282 = happySpecReduce_3 72# happyReduction_282+happyReduction_282 happy_x_3+ happy_x_2+ happy_x_1+ = case happyOut19 happy_x_1 of { happy_var_1 -> + case happyOut29 happy_x_3 of { happy_var_3 -> + happyIn78+ (map (\ (Arg _ rel x) -> TypeSig rel x happy_var_3) happy_var_1+ )}}++happyReduce_283 = happySpecReduce_3 73# happyReduction_283+happyReduction_283 happy_x_3+ happy_x_2+ happy_x_1+ = case happyOut20 happy_x_1 of { happy_var_1 -> + case happyOut29 happy_x_3 of { happy_var_3 -> + happyIn79+ (map (fmap (flip (TypeSig Relevant) happy_var_3)) happy_var_1+ )}}++happyReduce_284 = happyMonadReduce 3# 74# happyReduction_284+happyReduction_284 (happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen (case happyOut71 happy_x_1 of { happy_var_1 -> + case happyOut81 happy_x_2 of { happy_var_2 -> + case happyOut75 happy_x_3 of { happy_var_3 -> + ( funClauseOrTypeSigs happy_var_1 happy_var_2 happy_var_3)}}}+ ) (\r -> happyReturn (happyIn80 r))++happyReduce_285 = happySpecReduce_2 75# happyReduction_285+happyReduction_285 happy_x_2+ happy_x_1+ = case happyOut29 happy_x_2 of { happy_var_2 -> + happyIn81+ (JustRHS (RHS happy_var_2)+ )}++happyReduce_286 = happySpecReduce_2 75# happyReduction_286+happyReduction_286 happy_x_2+ happy_x_1+ = case happyOut29 happy_x_2 of { happy_var_2 -> + happyIn81+ (TypeSigsRHS happy_var_2+ )}++happyReduce_287 = happySpecReduce_0 75# happyReduction_287+happyReduction_287 = happyIn81+ (JustRHS AbsurdRHS+ )++happyReduce_288 = happyReduce 7# 76# happyReduction_288+happyReduction_288 (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 happyOutTok happy_x_1 of { (TokKeyword KwData happy_var_1) -> + case happyOut15 happy_x_2 of { happy_var_2 -> + case happyOut57 happy_x_3 of { happy_var_3 -> + case happyOutTok happy_x_4 of { (TokSymbol SymColon happy_var_4) -> + case happyOut29 happy_x_5 of { happy_var_5 -> + case happyOutTok happy_x_6 of { (TokKeyword KwWhere happy_var_6) -> + case happyOut130 happy_x_7 of { happy_var_7 -> + happyIn82+ (Data (getRange (happy_var_1,happy_var_2,happy_var_3,happy_var_4,happy_var_5,happy_var_6,happy_var_7)) Inductive happy_var_2 happy_var_3 (Just happy_var_5) happy_var_7+ ) `HappyStk` happyRest}}}}}}}++happyReduce_289 = happyReduce 7# 76# happyReduction_289+happyReduction_289 (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 happyOutTok happy_x_1 of { (TokKeyword KwCoData happy_var_1) -> + case happyOut15 happy_x_2 of { happy_var_2 -> + case happyOut57 happy_x_3 of { happy_var_3 -> + case happyOutTok happy_x_4 of { (TokSymbol SymColon happy_var_4) -> + case happyOut29 happy_x_5 of { happy_var_5 -> + case happyOutTok happy_x_6 of { (TokKeyword KwWhere happy_var_6) -> + case happyOut130 happy_x_7 of { happy_var_7 -> + happyIn82+ (Data (getRange (happy_var_1,happy_var_2,happy_var_3,happy_var_4,happy_var_5,happy_var_6,happy_var_7)) CoInductive happy_var_2 happy_var_3 (Just happy_var_5) happy_var_7+ ) `HappyStk` happyRest}}}}}}}++happyReduce_290 = happyReduce 5# 76# happyReduction_290+happyReduction_290 (happy_x_5 `HappyStk`+ happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest)+ = case happyOutTok happy_x_1 of { (TokKeyword KwData happy_var_1) -> + case happyOut15 happy_x_2 of { happy_var_2 -> + case happyOut57 happy_x_3 of { happy_var_3 -> + case happyOutTok happy_x_4 of { (TokKeyword KwWhere happy_var_4) -> + case happyOut130 happy_x_5 of { happy_var_5 -> + happyIn82+ (Data (getRange (happy_var_1,happy_var_2,happy_var_3,happy_var_4,happy_var_5)) Inductive happy_var_2 happy_var_3 Nothing happy_var_5+ ) `HappyStk` happyRest}}}}}++happyReduce_291 = happyReduce 5# 76# happyReduction_291+happyReduction_291 (happy_x_5 `HappyStk`+ happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest)+ = case happyOutTok happy_x_1 of { (TokKeyword KwCoData happy_var_1) -> + case happyOut15 happy_x_2 of { happy_var_2 -> + case happyOut57 happy_x_3 of { happy_var_3 -> + case happyOutTok happy_x_4 of { (TokKeyword KwWhere happy_var_4) -> + case happyOut130 happy_x_5 of { happy_var_5 -> + happyIn82+ (Data (getRange (happy_var_1,happy_var_2,happy_var_3,happy_var_4,happy_var_5)) CoInductive happy_var_2 happy_var_3 Nothing happy_var_5+ ) `HappyStk` happyRest}}}}}++happyReduce_292 = happyReduce 5# 77# happyReduction_292+happyReduction_292 (happy_x_5 `HappyStk`+ happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest)+ = case happyOutTok happy_x_1 of { (TokKeyword KwData happy_var_1) -> + case happyOut15 happy_x_2 of { happy_var_2 -> + case happyOut57 happy_x_3 of { happy_var_3 -> + case happyOutTok happy_x_4 of { (TokSymbol SymColon happy_var_4) -> + case happyOut29 happy_x_5 of { happy_var_5 -> + happyIn83+ (DataSig (getRange (happy_var_1,happy_var_2,happy_var_3,happy_var_4,happy_var_5)) Inductive happy_var_2 happy_var_3 happy_var_5+ ) `HappyStk` happyRest}}}}}++happyReduce_293 = happyMonadReduce 7# 78# happyReduction_293+happyReduction_293 (happy_x_7 `HappyStk`+ happy_x_6 `HappyStk`+ happy_x_5 `HappyStk`+ happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen (case happyOutTok happy_x_1 of { (TokKeyword KwRecord happy_var_1) -> + case happyOut37 happy_x_2 of { happy_var_2 -> + case happyOut57 happy_x_3 of { happy_var_3 -> + case happyOutTok happy_x_4 of { (TokSymbol SymColon happy_var_4) -> + case happyOut29 happy_x_5 of { happy_var_5 -> + case happyOutTok happy_x_6 of { (TokKeyword KwWhere happy_var_6) -> + case happyOut131 happy_x_7 of { happy_var_7 -> + ( exprToName happy_var_2 >>= \ n -> return $ Record (getRange (happy_var_1,happy_var_2,happy_var_3,happy_var_4,happy_var_5,happy_var_6,happy_var_7)) n (fst3 happy_var_7) (snd3 happy_var_7) happy_var_3 (Just happy_var_5) (thd3 happy_var_7))}}}}}}}+ ) (\r -> happyReturn (happyIn84 r))++happyReduce_294 = happyMonadReduce 5# 78# happyReduction_294+happyReduction_294 (happy_x_5 `HappyStk`+ happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen (case happyOutTok happy_x_1 of { (TokKeyword KwRecord happy_var_1) -> + case happyOut37 happy_x_2 of { happy_var_2 -> + case happyOut57 happy_x_3 of { happy_var_3 -> + case happyOutTok happy_x_4 of { (TokKeyword KwWhere happy_var_4) -> + case happyOut131 happy_x_5 of { happy_var_5 -> + ( exprToName happy_var_2 >>= \ n -> return $ Record (getRange (happy_var_1,happy_var_2,happy_var_3,happy_var_4,happy_var_5)) n (fst3 happy_var_5) (snd3 happy_var_5) happy_var_3 Nothing (thd3 happy_var_5))}}}}}+ ) (\r -> happyReturn (happyIn84 r))++happyReduce_295 = happyMonadReduce 5# 79# happyReduction_295+happyReduction_295 (happy_x_5 `HappyStk`+ happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen (case happyOutTok happy_x_1 of { (TokKeyword KwRecord happy_var_1) -> + case happyOut37 happy_x_2 of { happy_var_2 -> + case happyOut57 happy_x_3 of { happy_var_3 -> + case happyOutTok happy_x_4 of { (TokSymbol SymColon happy_var_4) -> + case happyOut29 happy_x_5 of { happy_var_5 -> + ( exprToName happy_var_2 >>= \ n -> return $ RecordSig (getRange (happy_var_1,happy_var_2,happy_var_3,happy_var_4,happy_var_5)) n happy_var_3 happy_var_5)}}}}}+ ) (\r -> happyReturn (happyIn85 r))++happyReduce_296 = happySpecReduce_2 80# happyReduction_296+happyReduction_296 happy_x_2+ happy_x_1+ = case happyOut15 happy_x_2 of { happy_var_2 -> + happyIn86+ (happy_var_2+ )}++happyReduce_297 = happySpecReduce_3 81# happyReduction_297+happyReduction_297 happy_x_3+ happy_x_2+ happy_x_1+ = case happyOutTok happy_x_1 of { (TokKeyword KwInfix happy_var_1) -> + case happyOut14 happy_x_2 of { happy_var_2 -> + case happyOut24 happy_x_3 of { happy_var_3 -> + happyIn87+ (Infix (NonAssoc (getRange (happy_var_1,happy_var_3)) happy_var_2) happy_var_3+ )}}}++happyReduce_298 = happySpecReduce_3 81# happyReduction_298+happyReduction_298 happy_x_3+ happy_x_2+ happy_x_1+ = case happyOutTok happy_x_1 of { (TokKeyword KwInfixL happy_var_1) -> + case happyOut14 happy_x_2 of { happy_var_2 -> + case happyOut24 happy_x_3 of { happy_var_3 -> + happyIn87+ (Infix (LeftAssoc (getRange (happy_var_1,happy_var_3)) happy_var_2) happy_var_3+ )}}}++happyReduce_299 = happySpecReduce_3 81# happyReduction_299+happyReduction_299 happy_x_3+ happy_x_2+ happy_x_1+ = case happyOutTok happy_x_1 of { (TokKeyword KwInfixR happy_var_1) -> + case happyOut14 happy_x_2 of { happy_var_2 -> + case happyOut24 happy_x_3 of { happy_var_3 -> + happyIn87+ (Infix (RightAssoc (getRange (happy_var_1,happy_var_3)) happy_var_2) happy_var_3+ )}}}++happyReduce_300 = happySpecReduce_2 82# happyReduction_300+happyReduction_300 happy_x_2+ happy_x_1+ = case happyOut128 happy_x_2 of { happy_var_2 -> + happyIn88+ (let toField (Arg h rel (TypeSig _ x t)) = Field x (Arg h rel t) in map toField happy_var_2+ )}++happyReduce_301 = happySpecReduce_2 83# happyReduction_301+happyReduction_301 happy_x_2+ happy_x_1+ = case happyOutTok happy_x_1 of { (TokKeyword KwMutual happy_var_1) -> + case happyOut133 happy_x_2 of { happy_var_2 -> + happyIn89+ (Mutual (fuseRange happy_var_1 happy_var_2) happy_var_2+ )}}++happyReduce_302 = happySpecReduce_2 84# happyReduction_302+happyReduction_302 happy_x_2+ happy_x_1+ = case happyOutTok happy_x_1 of { (TokKeyword KwAbstract happy_var_1) -> + case happyOut133 happy_x_2 of { happy_var_2 -> + happyIn90+ (Abstract (fuseRange happy_var_1 happy_var_2) happy_var_2+ )}}++happyReduce_303 = happySpecReduce_2 85# happyReduction_303+happyReduction_303 happy_x_2+ happy_x_1+ = case happyOutTok happy_x_1 of { (TokKeyword KwPrivate happy_var_1) -> + case happyOut133 happy_x_2 of { happy_var_2 -> + happyIn91+ (Private (fuseRange happy_var_1 happy_var_2) happy_var_2+ )}}++happyReduce_304 = happySpecReduce_2 86# happyReduction_304+happyReduction_304 happy_x_2+ happy_x_1+ = case happyOutTok happy_x_1 of { (TokKeyword KwPostulate happy_var_1) -> + case happyOut126 happy_x_2 of { happy_var_2 -> + happyIn92+ (Postulate (fuseRange happy_var_1 happy_var_2) happy_var_2+ )}}++happyReduce_305 = happySpecReduce_2 87# happyReduction_305+happyReduction_305 happy_x_2+ happy_x_1+ = case happyOutTok happy_x_1 of { (TokKeyword KwPrimitive happy_var_1) -> + case happyOut124 happy_x_2 of { happy_var_2 -> + happyIn93+ (Primitive (fuseRange happy_var_1 happy_var_2) happy_var_2+ )}}++happyReduce_306 = happyMonadReduce 5# 88# happyReduction_306+happyReduction_306 (happy_x_5 `HappyStk`+ happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen (case happyOut15 happy_x_2 of { happy_var_2 -> + case happyOut97 happy_x_3 of { happy_var_3 -> + case happyOut96 happy_x_5 of { happy_var_5 -> + (+ case happy_var_2 of+ Name _ [_] -> case mkNotation happy_var_3 happy_var_5 of+ Left err -> parseError $ "malformed syntax declaration: " ++ err+ Right n -> return $ Syntax happy_var_2 n+ _ -> parseError "syntax declarations are allowed only for simple names (without holes)")}}}+ ) (\r -> happyReturn (happyIn94 r))++happyReduce_307 = happyMonadReduce 4# 89# happyReduction_307+happyReduction_307 (happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen (case happyOutTok happy_x_1 of { (TokKeyword KwPatternSyn happy_var_1) -> + case happyOut16 happy_x_2 of { happy_var_2 -> + case happyOutTok happy_x_3 of { (TokSymbol SymEqual happy_var_3) -> + case happyOut29 happy_x_4 of { happy_var_4 -> + ( do+ p <- exprToPattern happy_var_4+ return (PatternSyn (getRange (happy_var_1,happy_var_2,happy_var_3,happy_var_4)) (head happy_var_2) (tail happy_var_2) p))}}}}+ ) (\r -> happyReturn (happyIn95 r))++happyReduce_308 = happySpecReduce_1 90# happyReduction_308+happyReduction_308 happy_x_1+ = case happyOut99 happy_x_1 of { happy_var_1 -> + happyIn96+ ([happy_var_1]+ )}++happyReduce_309 = happySpecReduce_2 90# happyReduction_309+happyReduction_309 happy_x_2+ happy_x_1+ = case happyOut96 happy_x_1 of { happy_var_1 -> + case happyOut99 happy_x_2 of { happy_var_2 -> + happyIn96+ (happy_var_1 ++ [happy_var_2]+ )}}++happyReduce_310 = happySpecReduce_1 91# happyReduction_310+happyReduction_310 happy_x_1+ = case happyOut98 happy_x_1 of { happy_var_1 -> + happyIn97+ ([happy_var_1]+ )}++happyReduce_311 = happySpecReduce_2 91# happyReduction_311+happyReduction_311 happy_x_2+ happy_x_1+ = case happyOut97 happy_x_1 of { happy_var_1 -> + case happyOut98 happy_x_2 of { happy_var_2 -> + happyIn97+ (happy_var_1 ++ [happy_var_2]+ )}}++happyReduce_312 = happySpecReduce_1 92# happyReduction_312+happyReduction_312 happy_x_1+ = case happyOut99 happy_x_1 of { happy_var_1 -> + happyIn98+ (ExprHole happy_var_1+ )}++happyReduce_313 = happyReduce 6# 92# happyReduction_313+happyReduction_313 (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 happyOut99 happy_x_3 of { happy_var_3 -> + case happyOut99 happy_x_5 of { happy_var_5 -> + happyIn98+ (LambdaHole happy_var_3 happy_var_5+ ) `HappyStk` happyRest}}++happyReduce_314 = happySpecReduce_1 93# happyReduction_314+happyReduction_314 happy_x_1+ = case happyOutTok happy_x_1 of { (TokId happy_var_1) -> + happyIn99+ (snd happy_var_1+ )}++happyReduce_315 = happySpecReduce_1 94# happyReduction_315+happyReduction_315 happy_x_1+ = case happyOutTok happy_x_1 of { (TokKeyword KwOpen happy_var_1) -> + happyIn100+ (Just (getRange happy_var_1)+ )}++happyReduce_316 = happySpecReduce_0 94# happyReduction_316+happyReduction_316 = happyIn100+ (Nothing+ )++happyReduce_317 = happyMonadReduce 5# 95# happyReduction_317+happyReduction_317 (happy_x_5 `HappyStk`+ happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen (case happyOut100 happy_x_1 of { happy_var_1 -> + case happyOutTok happy_x_2 of { (TokKeyword KwImport happy_var_2) -> + case happyOut22 happy_x_3 of { happy_var_3 -> + case happyOut102 happy_x_4 of { happy_var_4 -> + case happyOut60 happy_x_5 of { happy_var_5 -> + (+ let+ { doOpen = maybe DontOpen (const DoOpen) happy_var_1+ ; m = happy_var_3+ ; es = happy_var_4+ ; dir = happy_var_5+ ; r = getRange (m, es, dir)+ ; mr = getRange m+ ; unique = hash $ show $ fmap (const (Nothing :: Maybe ())) r+ -- turn range into unique id, but delete file path+ -- which is absolute and messes up suite of failing tests+ -- (different hashs on different installations)+ -- TODO: Don't use (insecure) hashes in this way.+ ; fresh = Name mr [ Id $ ".#" ++ show m ++ "-" ++ show unique ]+ ; impStm asR = Import mr m (Just (AsName fresh asR)) DontOpen defaultImportDir+ ; appStm m' es =+ let r = getRange (m, es) in+ Private r+ [ ModuleMacro r m'+ (SectionApp (getRange es) []+ (RawApp (getRange es) (Ident (QName fresh) : es)))+ doOpen dir+ ]+ ; (initArgs, last2Args) = splitAt (length es - 2) es+ ; parseAsClause = case last2Args of+ { [ Ident (QName (Name asR [Id x]))+ , Ident (QName m')+ ] | x == "as" -> Just (asR, m')+ ; _ -> Nothing+ }+ } in+ case es of+ { [] -> return [Import mr m Nothing doOpen dir]+ ; _ | Just (asR, m') <- parseAsClause ->+ if null initArgs then return+ [ Import (getRange (m, asR, m', dir)) m+ (Just (AsName m' asR)) doOpen dir+ ]+ else return [ impStm asR, appStm m' initArgs ]+ | DontOpen <- doOpen -> parseErrorAt (fromJust $ rStart $ getRange happy_var_2) "An import statement with module instantiation does not actually import the module. This statement achieves nothing. Either add the `open' keyword or bind the instantiated module with an `as' clause."+ | otherwise -> return+ [ impStm noRange+ , appStm (noName $ beginningOf $ getRange m) es+ ]+ })}}}}}+ ) (\r -> happyReturn (happyIn101 r))++happyReduce_318 = happyReduce 4# 95# happyReduction_318+happyReduction_318 (happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest)+ = case happyOut22 happy_x_2 of { happy_var_2 -> + case happyOut102 happy_x_3 of { happy_var_3 -> + case happyOut60 happy_x_4 of { happy_var_4 -> + happyIn101+ (let+ { m = happy_var_2+ ; es = happy_var_3+ ; dir = happy_var_4+ ; r = getRange (m, es, dir)+ } in+ [ case es of+ { [] -> Open r m dir+ ; _ -> Private r [ ModuleMacro r (noName $ beginningOf $ getRange m)+ (SectionApp (getRange (m , es)) [] (RawApp (fuseRange m es) (Ident m : es)))+ DoOpen dir+ ]+ }+ ]+ ) `HappyStk` happyRest}}}++happyReduce_319 = happyReduce 6# 95# happyReduction_319+happyReduction_319 (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 happyOut22 happy_x_2 of { happy_var_2 -> + case happyOut60 happy_x_6 of { happy_var_6 -> + happyIn101+ (let r = getRange happy_var_2 in+ [ Private r [ ModuleMacro r (noName $ beginningOf $ getRange happy_var_2)+ (RecordModuleIFS r happy_var_2) DoOpen happy_var_6+ ]+ ]+ ) `HappyStk` happyRest}}++happyReduce_320 = happySpecReduce_0 96# happyReduction_320+happyReduction_320 = happyIn102+ ([]+ )++happyReduce_321 = happySpecReduce_2 96# happyReduction_321+happyReduction_321 happy_x_2+ happy_x_1+ = case happyOut38 happy_x_1 of { happy_var_1 -> + case happyOut102 happy_x_2 of { happy_var_2 -> + happyIn102+ (happy_var_1 : happy_var_2+ )}}++happyReduce_322 = happyReduce 4# 97# happyReduction_322+happyReduction_322 (happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest)+ = case happyOut22 happy_x_1 of { happy_var_1 -> + case happyOutTok happy_x_2 of { (TokSymbol SymDoubleOpenBrace happy_var_2) -> + case happyOutTok happy_x_3 of { (TokSymbol SymEllipsis happy_var_3) -> + case happyOut17 happy_x_4 of { happy_var_4 -> + happyIn103+ ((\ts ->+ if null ts then return $ RecordModuleIFS (getRange (happy_var_1,happy_var_2,happy_var_3,happy_var_4)) happy_var_1+ else parseError "No bindings allowed for record module with non-canonical implicits" )+ ) `HappyStk` happyRest}}}}++happyReduce_323 = happySpecReduce_2 97# happyReduction_323+happyReduction_323 happy_x_2+ happy_x_1+ = case happyOut22 happy_x_1 of { happy_var_1 -> + case happyOut102 happy_x_2 of { happy_var_2 -> + happyIn103+ ((\ts -> return $ SectionApp (getRange (happy_var_1, happy_var_2)) ts (RawApp (fuseRange happy_var_1 happy_var_2) (Ident happy_var_1 : happy_var_2)) )+ )}}++happyReduce_324 = happyMonadReduce 6# 98# happyReduction_324+happyReduction_324 (happy_x_6 `HappyStk`+ happy_x_5 `HappyStk`+ happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen (case happyOutTok happy_x_1 of { (TokKeyword KwModule happy_var_1) -> + case happyOut15 happy_x_2 of { happy_var_2 -> + case happyOut57 happy_x_3 of { happy_var_3 -> + case happyOut103 happy_x_5 of { happy_var_5 -> + case happyOut60 happy_x_6 of { happy_var_6 -> + ( do {ma <- happy_var_5 (map addType happy_var_3); return $ ModuleMacro (getRange (happy_var_1, happy_var_2, ma, happy_var_6)) happy_var_2 ma DontOpen happy_var_6 })}}}}}+ ) (\r -> happyReturn (happyIn104 r))++happyReduce_325 = happyMonadReduce 7# 98# happyReduction_325+happyReduction_325 (happy_x_7 `HappyStk`+ happy_x_6 `HappyStk`+ happy_x_5 `HappyStk`+ happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen (case happyOutTok happy_x_1 of { (TokKeyword KwOpen happy_var_1) -> + case happyOutTok happy_x_2 of { (TokKeyword KwModule happy_var_2) -> + case happyOut15 happy_x_3 of { happy_var_3 -> + case happyOut57 happy_x_4 of { happy_var_4 -> + case happyOut103 happy_x_6 of { happy_var_6 -> + case happyOut60 happy_x_7 of { happy_var_7 -> + ( do {ma <- happy_var_6 (map addType happy_var_4); return $ ModuleMacro (getRange (happy_var_1, happy_var_2, happy_var_3, ma, happy_var_7)) happy_var_3 ma DoOpen happy_var_7 })}}}}}}+ ) (\r -> happyReturn (happyIn104 r))++happyReduce_326 = happyReduce 5# 99# happyReduction_326+happyReduction_326 (happy_x_5 `HappyStk`+ happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest)+ = case happyOutTok happy_x_1 of { (TokKeyword KwModule happy_var_1) -> + case happyOut15 happy_x_2 of { happy_var_2 -> + case happyOut57 happy_x_3 of { happy_var_3 -> + case happyOutTok happy_x_4 of { (TokKeyword KwWhere happy_var_4) -> + case happyOut134 happy_x_5 of { happy_var_5 -> + happyIn105+ (Module (getRange (happy_var_1,happy_var_2,happy_var_3,happy_var_4,happy_var_5)) (QName happy_var_2) (map addType happy_var_3) happy_var_5+ ) `HappyStk` happyRest}}}}}++happyReduce_327 = happyReduce 5# 99# happyReduction_327+happyReduction_327 (happy_x_5 `HappyStk`+ happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest)+ = case happyOutTok happy_x_1 of { (TokKeyword KwModule happy_var_1) -> + case happyOut106 happy_x_2 of { happy_var_2 -> + case happyOut57 happy_x_3 of { happy_var_3 -> + case happyOutTok happy_x_4 of { (TokKeyword KwWhere happy_var_4) -> + case happyOut134 happy_x_5 of { happy_var_5 -> + happyIn105+ (Module (getRange (happy_var_1,happy_var_2,happy_var_3,happy_var_4,happy_var_5)) (QName happy_var_2) (map addType happy_var_3) happy_var_5+ ) `HappyStk` happyRest}}}}}++happyReduce_328 = happySpecReduce_1 100# happyReduction_328+happyReduction_328 happy_x_1+ = case happyOutTok happy_x_1 of { (TokSymbol SymUnderscore happy_var_1) -> + happyIn106+ (noName (getRange happy_var_1)+ )}++happyReduce_329 = happySpecReduce_1 101# happyReduction_329+happyReduction_329 happy_x_1+ = case happyOut108 happy_x_1 of { happy_var_1 -> + happyIn107+ ([happy_var_1]+ )}++happyReduce_330 = happySpecReduce_2 101# happyReduction_330+happyReduction_330 happy_x_2+ happy_x_1+ = case happyOut101 happy_x_1 of { happy_var_1 -> + case happyOut107 happy_x_2 of { happy_var_2 -> + happyIn107+ (happy_var_1 ++ happy_var_2+ )}}++happyReduce_331 = happyReduce 5# 102# happyReduction_331+happyReduction_331 (happy_x_5 `HappyStk`+ happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest)+ = case happyOutTok happy_x_1 of { (TokKeyword KwModule happy_var_1) -> + case happyOut22 happy_x_2 of { happy_var_2 -> + case happyOut57 happy_x_3 of { happy_var_3 -> + case happyOutTok happy_x_4 of { (TokKeyword KwWhere happy_var_4) -> + case happyOut134 happy_x_5 of { happy_var_5 -> + happyIn108+ (Module (getRange (happy_var_1,happy_var_2,happy_var_3,happy_var_4,happy_var_5)) happy_var_2 (map addType happy_var_3) happy_var_5+ ) `HappyStk` happyRest}}}}}++happyReduce_332 = happySpecReduce_1 103# happyReduction_332+happyReduction_332 happy_x_1+ = case happyOut111 happy_x_1 of { happy_var_1 -> + happyIn109+ (Pragma happy_var_1+ )}++happyReduce_333 = happySpecReduce_1 104# happyReduction_333+happyReduction_333 happy_x_1+ = case happyOut112 happy_x_1 of { happy_var_1 -> + happyIn110+ (happy_var_1+ )}++happyReduce_334 = happySpecReduce_1 105# happyReduction_334+happyReduction_334 happy_x_1+ = case happyOut113 happy_x_1 of { happy_var_1 -> + happyIn111+ (happy_var_1+ )}++happyReduce_335 = happySpecReduce_1 105# happyReduction_335+happyReduction_335 happy_x_1+ = case happyOut114 happy_x_1 of { happy_var_1 -> + happyIn111+ (happy_var_1+ )}++happyReduce_336 = happySpecReduce_1 105# happyReduction_336+happyReduction_336 happy_x_1+ = case happyOut116 happy_x_1 of { happy_var_1 -> + happyIn111+ (happy_var_1+ )}++happyReduce_337 = happySpecReduce_1 105# happyReduction_337+happyReduction_337 happy_x_1+ = case happyOut115 happy_x_1 of { happy_var_1 -> + happyIn111+ (happy_var_1+ )}++happyReduce_338 = happySpecReduce_1 105# happyReduction_338+happyReduction_338 happy_x_1+ = case happyOut117 happy_x_1 of { happy_var_1 -> + happyIn111+ (happy_var_1+ )}++happyReduce_339 = happySpecReduce_1 105# happyReduction_339+happyReduction_339 happy_x_1+ = case happyOut118 happy_x_1 of { happy_var_1 -> + happyIn111+ (happy_var_1+ )}++happyReduce_340 = happySpecReduce_1 105# happyReduction_340+happyReduction_340 happy_x_1+ = case happyOut119 happy_x_1 of { happy_var_1 -> + happyIn111+ (happy_var_1+ )}++happyReduce_341 = happySpecReduce_1 105# happyReduction_341+happyReduction_341 happy_x_1+ = case happyOut122 happy_x_1 of { happy_var_1 -> + happyIn111+ (happy_var_1+ )}++happyReduce_342 = happySpecReduce_1 105# happyReduction_342+happyReduction_342 happy_x_1+ = case happyOut123 happy_x_1 of { happy_var_1 -> + happyIn111+ (happy_var_1+ )}++happyReduce_343 = happySpecReduce_1 105# happyReduction_343+happyReduction_343 happy_x_1+ = case happyOut120 happy_x_1 of { happy_var_1 -> + happyIn111+ (happy_var_1+ )}++happyReduce_344 = happySpecReduce_1 105# happyReduction_344+happyReduction_344 happy_x_1+ = case happyOut121 happy_x_1 of { happy_var_1 -> + happyIn111+ (happy_var_1+ )}++happyReduce_345 = happyReduce 4# 106# happyReduction_345+happyReduction_345 (happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest)+ = case happyOutTok happy_x_1 of { (TokSymbol SymOpenPragma happy_var_1) -> + case happyOutTok happy_x_2 of { (TokKeyword KwOPTIONS happy_var_2) -> + case happyOut27 happy_x_3 of { happy_var_3 -> + case happyOutTok happy_x_4 of { (TokSymbol SymClosePragma happy_var_4) -> + happyIn112+ (OptionsPragma (getRange (happy_var_1,happy_var_2,happy_var_4)) happy_var_3+ ) `HappyStk` happyRest}}}}++happyReduce_346 = happyReduce 5# 107# happyReduction_346+happyReduction_346 (happy_x_5 `HappyStk`+ happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest)+ = case happyOutTok happy_x_1 of { (TokSymbol SymOpenPragma happy_var_1) -> + case happyOutTok happy_x_2 of { (TokKeyword KwBUILTIN happy_var_2) -> + case happyOutTok happy_x_3 of { (TokString happy_var_3) -> + case happyOut28 happy_x_4 of { happy_var_4 -> + case happyOutTok happy_x_5 of { (TokSymbol SymClosePragma happy_var_5) -> + happyIn113+ (BuiltinPragma (getRange (happy_var_1,happy_var_2,fst happy_var_3,happy_var_4,happy_var_5)) (snd happy_var_3) (Ident happy_var_4)+ ) `HappyStk` happyRest}}}}}++happyReduce_347 = happyReduce 5# 108# happyReduction_347+happyReduction_347 (happy_x_5 `HappyStk`+ happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest)+ = case happyOutTok happy_x_1 of { (TokSymbol SymOpenPragma happy_var_1) -> + case happyOutTok happy_x_2 of { (TokKeyword KwCOMPILED happy_var_2) -> + case happyOut28 happy_x_3 of { happy_var_3 -> + case happyOut27 happy_x_4 of { happy_var_4 -> + case happyOutTok happy_x_5 of { (TokSymbol SymClosePragma happy_var_5) -> + happyIn114+ (CompiledPragma (getRange (happy_var_1,happy_var_2,happy_var_3,happy_var_5)) happy_var_3 (unwords happy_var_4)+ ) `HappyStk` happyRest}}}}}++happyReduce_348 = happyReduce 5# 109# happyReduction_348+happyReduction_348 (happy_x_5 `HappyStk`+ happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest)+ = case happyOutTok happy_x_1 of { (TokSymbol SymOpenPragma happy_var_1) -> + case happyOutTok happy_x_2 of { (TokKeyword KwCOMPILED_TYPE happy_var_2) -> + case happyOut28 happy_x_3 of { happy_var_3 -> + case happyOut27 happy_x_4 of { happy_var_4 -> + case happyOutTok happy_x_5 of { (TokSymbol SymClosePragma happy_var_5) -> + happyIn115+ (CompiledTypePragma (getRange (happy_var_1,happy_var_2,happy_var_3,happy_var_5)) happy_var_3 (unwords happy_var_4)+ ) `HappyStk` happyRest}}}}}++happyReduce_349 = happyReduce 6# 110# happyReduction_349+happyReduction_349 (happy_x_6 `HappyStk`+ happy_x_5 `HappyStk`+ happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest)+ = case happyOutTok happy_x_1 of { (TokSymbol SymOpenPragma happy_var_1) -> + case happyOutTok happy_x_2 of { (TokKeyword KwCOMPILED_DATA happy_var_2) -> + case happyOut28 happy_x_3 of { happy_var_3 -> + case happyOutTok happy_x_4 of { (TokString happy_var_4) -> + case happyOut27 happy_x_5 of { happy_var_5 -> + case happyOutTok happy_x_6 of { (TokSymbol SymClosePragma happy_var_6) -> + happyIn116+ (CompiledDataPragma (getRange (happy_var_1,happy_var_2,happy_var_3,fst happy_var_4,happy_var_6)) happy_var_3 (snd happy_var_4) happy_var_5+ ) `HappyStk` happyRest}}}}}}++happyReduce_350 = happyReduce 5# 111# happyReduction_350+happyReduction_350 (happy_x_5 `HappyStk`+ happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest)+ = case happyOutTok happy_x_1 of { (TokSymbol SymOpenPragma happy_var_1) -> + case happyOutTok happy_x_2 of { (TokKeyword KwCOMPILED_EPIC happy_var_2) -> + case happyOut28 happy_x_3 of { happy_var_3 -> + case happyOut27 happy_x_4 of { happy_var_4 -> + case happyOutTok happy_x_5 of { (TokSymbol SymClosePragma happy_var_5) -> + happyIn117+ (CompiledEpicPragma (getRange (happy_var_1,happy_var_2,happy_var_3,happy_var_5)) happy_var_3 (unwords happy_var_4)+ ) `HappyStk` happyRest}}}}}++happyReduce_351 = happyReduce 5# 112# happyReduction_351+happyReduction_351 (happy_x_5 `HappyStk`+ happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest)+ = case happyOutTok happy_x_1 of { (TokSymbol SymOpenPragma happy_var_1) -> + case happyOutTok happy_x_2 of { (TokKeyword KwCOMPILED_JS happy_var_2) -> + case happyOut28 happy_x_3 of { happy_var_3 -> + case happyOut27 happy_x_4 of { happy_var_4 -> + case happyOutTok happy_x_5 of { (TokSymbol SymClosePragma happy_var_5) -> + happyIn118+ (CompiledJSPragma (getRange (happy_var_1,happy_var_2,happy_var_3,happy_var_5)) happy_var_3 (unwords happy_var_4)+ ) `HappyStk` happyRest}}}}}++happyReduce_352 = happyReduce 4# 113# happyReduction_352+happyReduction_352 (happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest)+ = case happyOutTok happy_x_1 of { (TokSymbol SymOpenPragma happy_var_1) -> + case happyOutTok happy_x_2 of { (TokKeyword KwSTATIC happy_var_2) -> + case happyOut28 happy_x_3 of { happy_var_3 -> + case happyOutTok happy_x_4 of { (TokSymbol SymClosePragma happy_var_4) -> + happyIn119+ (StaticPragma (getRange (happy_var_1,happy_var_2,happy_var_3,happy_var_4)) happy_var_3+ ) `HappyStk` happyRest}}}}++happyReduce_353 = happyReduce 4# 114# happyReduction_353+happyReduction_353 (happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest)+ = case happyOutTok happy_x_1 of { (TokSymbol SymOpenPragma happy_var_1) -> + case happyOutTok happy_x_2 of { (TokKeyword KwETA happy_var_2) -> + case happyOut28 happy_x_3 of { happy_var_3 -> + case happyOutTok happy_x_4 of { (TokSymbol SymClosePragma happy_var_4) -> + happyIn120+ (EtaPragma (getRange (happy_var_1,happy_var_2,happy_var_3,happy_var_4)) happy_var_3+ ) `HappyStk` happyRest}}}}++happyReduce_354 = happySpecReduce_3 115# happyReduction_354+happyReduction_354 happy_x_3+ happy_x_2+ happy_x_1+ = case happyOutTok happy_x_1 of { (TokSymbol SymOpenPragma happy_var_1) -> + case happyOutTok happy_x_2 of { (TokKeyword KwNO_TERMINATION_CHECK happy_var_2) -> + case happyOutTok happy_x_3 of { (TokSymbol SymClosePragma happy_var_3) -> + happyIn121+ (NoTerminationCheckPragma (getRange (happy_var_1,happy_var_2,happy_var_3))+ )}}}++happyReduce_355 = happyMonadReduce 4# 116# happyReduction_355+happyReduction_355 (happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen (case happyOutTok happy_x_1 of { (TokSymbol SymOpenPragma happy_var_1) -> + case happyOutTok happy_x_2 of { (TokKeyword KwIMPORT happy_var_2) -> + case happyOutTok happy_x_3 of { (TokString happy_var_3) -> + case happyOutTok happy_x_4 of { (TokSymbol SymClosePragma happy_var_4) -> + ( let s = snd happy_var_3 in+ if validHaskellModuleName s+ then return $ ImportPragma (getRange (happy_var_1,happy_var_2,fst happy_var_3,happy_var_4)) s+ else parseError $ "Malformed module name: " ++ s ++ ".")}}}}+ ) (\r -> happyReturn (happyIn122 r))++happyReduce_356 = happySpecReduce_3 117# happyReduction_356+happyReduction_356 happy_x_3+ happy_x_2+ happy_x_1+ = case happyOutTok happy_x_1 of { (TokSymbol SymOpenPragma happy_var_1) -> + case happyOutTok happy_x_2 of { (TokKeyword KwIMPOSSIBLE happy_var_2) -> + case happyOutTok happy_x_3 of { (TokSymbol SymClosePragma happy_var_3) -> + happyIn123+ (ImpossiblePragma (getRange (happy_var_1,happy_var_2,happy_var_3))+ )}}}++happyReduce_357 = happySpecReduce_3 118# happyReduction_357+happyReduction_357 happy_x_3+ happy_x_2+ happy_x_1+ = case happyOut125 happy_x_2 of { happy_var_2 -> + happyIn124+ (reverse happy_var_2+ )}++happyReduce_358 = happySpecReduce_3 119# happyReduction_358+happyReduction_358 happy_x_3+ happy_x_2+ happy_x_1+ = case happyOut125 happy_x_1 of { happy_var_1 -> + case happyOut77 happy_x_3 of { happy_var_3 -> + happyIn125+ (reverse happy_var_3 ++ happy_var_1+ )}}++happyReduce_359 = happySpecReduce_1 119# happyReduction_359+happyReduction_359 happy_x_1+ = case happyOut77 happy_x_1 of { happy_var_1 -> + happyIn125+ (reverse happy_var_1+ )}++happyReduce_360 = happySpecReduce_3 120# happyReduction_360+happyReduction_360 happy_x_3+ happy_x_2+ happy_x_1+ = case happyOut127 happy_x_2 of { happy_var_2 -> + happyIn126+ (reverse happy_var_2+ )}++happyReduce_361 = happySpecReduce_3 121# happyReduction_361+happyReduction_361 happy_x_3+ happy_x_2+ happy_x_1+ = case happyOut127 happy_x_1 of { happy_var_1 -> + case happyOut78 happy_x_3 of { happy_var_3 -> + happyIn127+ (reverse happy_var_3 ++ happy_var_1+ )}}++happyReduce_362 = happySpecReduce_1 121# happyReduction_362+happyReduction_362 happy_x_1+ = case happyOut78 happy_x_1 of { happy_var_1 -> + happyIn127+ (reverse happy_var_1+ )}++happyReduce_363 = happySpecReduce_3 122# happyReduction_363+happyReduction_363 happy_x_3+ happy_x_2+ happy_x_1+ = case happyOut129 happy_x_2 of { happy_var_2 -> + happyIn128+ (reverse happy_var_2+ )}++happyReduce_364 = happySpecReduce_3 123# happyReduction_364+happyReduction_364 happy_x_3+ happy_x_2+ happy_x_1+ = case happyOut129 happy_x_1 of { happy_var_1 -> + case happyOut79 happy_x_3 of { happy_var_3 -> + happyIn129+ (reverse happy_var_3 ++ happy_var_1+ )}}++happyReduce_365 = happySpecReduce_1 123# happyReduction_365+happyReduction_365 happy_x_1+ = case happyOut79 happy_x_1 of { happy_var_1 -> + happyIn129+ (reverse happy_var_1+ )}++happyReduce_366 = happySpecReduce_2 124# happyReduction_366+happyReduction_366 happy_x_2+ happy_x_1+ = happyIn130+ ([]+ )++happyReduce_367 = happySpecReduce_1 124# happyReduction_367+happyReduction_367 happy_x_1+ = case happyOut124 happy_x_1 of { happy_var_1 -> + happyIn130+ (happy_var_1+ )}++happyReduce_368 = happySpecReduce_2 125# happyReduction_368+happyReduction_368 happy_x_2+ happy_x_1+ = happyIn131+ ((Nothing, Nothing, [])+ )++happyReduce_369 = happySpecReduce_3 125# happyReduction_369+happyReduction_369 happy_x_3+ happy_x_2+ happy_x_1+ = case happyOut86 happy_x_2 of { happy_var_2 -> + happyIn131+ ((Nothing, Just happy_var_2, [])+ )}++happyReduce_370 = happyReduce 5# 125# happyReduction_370+happyReduction_370 (happy_x_5 `HappyStk`+ happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest)+ = case happyOut86 happy_x_2 of { happy_var_2 -> + case happyOut135 happy_x_4 of { happy_var_4 -> + happyIn131+ ((Nothing, Just happy_var_2, reverse happy_var_4)+ ) `HappyStk` happyRest}}++happyReduce_371 = happySpecReduce_3 125# happyReduction_371+happyReduction_371 happy_x_3+ happy_x_2+ happy_x_1+ = case happyOut135 happy_x_2 of { happy_var_2 -> + happyIn131+ ((Nothing, Nothing, reverse happy_var_2)+ )}++happyReduce_372 = happySpecReduce_3 125# happyReduction_372+happyReduction_372 happy_x_3+ happy_x_2+ happy_x_1+ = case happyOut132 happy_x_2 of { happy_var_2 -> + happyIn131+ ((Just happy_var_2, Nothing, [])+ )}++happyReduce_373 = happyReduce 5# 125# happyReduction_373+happyReduction_373 (happy_x_5 `HappyStk`+ happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest)+ = case happyOut132 happy_x_2 of { happy_var_2 -> + case happyOut86 happy_x_4 of { happy_var_4 -> + happyIn131+ ((Just happy_var_2, Just happy_var_4, [])+ ) `HappyStk` happyRest}}++happyReduce_374 = happyReduce 7# 125# happyReduction_374+happyReduction_374 (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 happyOut132 happy_x_2 of { happy_var_2 -> + case happyOut86 happy_x_4 of { happy_var_4 -> + case happyOut135 happy_x_6 of { happy_var_6 -> + happyIn131+ ((Just happy_var_2, Just happy_var_4, reverse happy_var_6)+ ) `HappyStk` happyRest}}}++happyReduce_375 = happyReduce 5# 125# happyReduction_375+happyReduction_375 (happy_x_5 `HappyStk`+ happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest)+ = case happyOut132 happy_x_2 of { happy_var_2 -> + case happyOut135 happy_x_4 of { happy_var_4 -> + happyIn131+ ((Just happy_var_2, Nothing, reverse happy_var_4)+ ) `HappyStk` happyRest}}++happyReduce_376 = happySpecReduce_1 126# happyReduction_376+happyReduction_376 happy_x_1+ = happyIn132+ (Inductive+ )++happyReduce_377 = happySpecReduce_1 126# happyReduction_377+happyReduction_377 happy_x_1+ = happyIn132+ (CoInductive+ )++happyReduce_378 = happySpecReduce_3 127# happyReduction_378+happyReduction_378 happy_x_3+ happy_x_2+ happy_x_1+ = case happyOut135 happy_x_2 of { happy_var_2 -> + happyIn133+ (reverse happy_var_2+ )}++happyReduce_379 = happySpecReduce_2 128# happyReduction_379+happyReduction_379 happy_x_2+ happy_x_1+ = happyIn134+ ([]+ )++happyReduce_380 = happySpecReduce_1 128# happyReduction_380+happyReduction_380 happy_x_1+ = case happyOut133 happy_x_1 of { happy_var_1 -> + happyIn134+ (happy_var_1+ )}++happyReduce_381 = happySpecReduce_3 129# happyReduction_381+happyReduction_381 happy_x_3+ happy_x_2+ happy_x_1+ = case happyOut135 happy_x_1 of { happy_var_1 -> + case happyOut76 happy_x_3 of { happy_var_3 -> + happyIn135+ (reverse happy_var_3 ++ happy_var_1+ )}}++happyReduce_382 = happySpecReduce_1 129# happyReduction_382+happyReduction_382 happy_x_1+ = case happyOut76 happy_x_1 of { happy_var_1 -> + happyIn135+ (reverse happy_var_1+ )}++happyNewToken action sts stk+ = lexer(\tk -> + let cont i = happyDoAction i tk action sts stk in+ case tk of {+ TokEOF -> happyDoAction 80# tk action sts stk;+ TokKeyword KwLet happy_dollar_dollar -> cont 1#;+ TokKeyword KwIn happy_dollar_dollar -> cont 2#;+ TokKeyword KwWhere happy_dollar_dollar -> cont 3#;+ TokKeyword KwWith happy_dollar_dollar -> cont 4#;+ TokKeyword KwRewrite happy_dollar_dollar -> cont 5#;+ TokKeyword KwPostulate happy_dollar_dollar -> cont 6#;+ TokKeyword KwPrimitive happy_dollar_dollar -> cont 7#;+ TokKeyword KwOpen happy_dollar_dollar -> cont 8#;+ TokKeyword KwImport happy_dollar_dollar -> cont 9#;+ TokKeyword KwUsing happy_dollar_dollar -> cont 10#;+ TokKeyword KwHiding happy_dollar_dollar -> cont 11#;+ TokKeyword KwRenaming happy_dollar_dollar -> cont 12#;+ TokKeyword KwTo happy_dollar_dollar -> cont 13#;+ TokKeyword KwPublic happy_dollar_dollar -> cont 14#;+ TokKeyword KwModule happy_dollar_dollar -> cont 15#;+ TokKeyword KwData happy_dollar_dollar -> cont 16#;+ TokKeyword KwCoData happy_dollar_dollar -> cont 17#;+ TokKeyword KwRecord happy_dollar_dollar -> cont 18#;+ TokKeyword KwConstructor happy_dollar_dollar -> cont 19#;+ TokKeyword KwInductive happy_dollar_dollar -> cont 20#;+ TokKeyword KwCoInductive happy_dollar_dollar -> cont 21#;+ TokKeyword KwField happy_dollar_dollar -> cont 22#;+ TokKeyword KwInfix happy_dollar_dollar -> cont 23#;+ TokKeyword KwInfixL happy_dollar_dollar -> cont 24#;+ TokKeyword KwInfixR happy_dollar_dollar -> cont 25#;+ TokKeyword KwMutual happy_dollar_dollar -> cont 26#;+ TokKeyword KwAbstract happy_dollar_dollar -> cont 27#;+ TokKeyword KwPrivate happy_dollar_dollar -> cont 28#;+ TokKeyword KwProp happy_dollar_dollar -> cont 29#;+ TokKeyword KwSet happy_dollar_dollar -> cont 30#;+ TokKeyword KwForall happy_dollar_dollar -> cont 31#;+ TokKeyword KwSyntax happy_dollar_dollar -> cont 32#;+ TokKeyword KwPatternSyn happy_dollar_dollar -> cont 33#;+ TokKeyword KwOPTIONS happy_dollar_dollar -> cont 34#;+ TokKeyword KwBUILTIN happy_dollar_dollar -> cont 35#;+ TokKeyword KwIMPORT happy_dollar_dollar -> cont 36#;+ TokKeyword KwIMPOSSIBLE happy_dollar_dollar -> cont 37#;+ TokKeyword KwETA happy_dollar_dollar -> cont 38#;+ TokKeyword KwNO_TERMINATION_CHECK happy_dollar_dollar -> cont 39#;+ TokKeyword KwCOMPILED happy_dollar_dollar -> cont 40#;+ TokKeyword KwCOMPILED_DATA happy_dollar_dollar -> cont 41#;+ TokKeyword KwCOMPILED_TYPE happy_dollar_dollar -> cont 42#;+ TokKeyword KwCOMPILED_EPIC happy_dollar_dollar -> cont 43#;+ TokKeyword KwCOMPILED_JS happy_dollar_dollar -> cont 44#;+ TokKeyword KwSTATIC happy_dollar_dollar -> cont 45#;+ TokKeyword KwQuoteGoal happy_dollar_dollar -> cont 46#;+ TokKeyword KwQuote happy_dollar_dollar -> cont 47#;+ TokKeyword KwQuoteTerm happy_dollar_dollar -> cont 48#;+ TokKeyword KwUnquote happy_dollar_dollar -> cont 49#;+ TokSetN happy_dollar_dollar -> cont 50#;+ TokTeX happy_dollar_dollar -> cont 51#;+ TokComment happy_dollar_dollar -> cont 52#;+ TokSymbol SymEllipsis happy_dollar_dollar -> cont 53#;+ TokSymbol SymDotDot happy_dollar_dollar -> cont 54#;+ TokSymbol SymDot happy_dollar_dollar -> cont 55#;+ TokSymbol SymSemi happy_dollar_dollar -> cont 56#;+ TokSymbol SymColon happy_dollar_dollar -> cont 57#;+ TokSymbol SymEqual happy_dollar_dollar -> cont 58#;+ TokSymbol SymUnderscore happy_dollar_dollar -> cont 59#;+ TokSymbol SymQuestionMark happy_dollar_dollar -> cont 60#;+ TokSymbol SymArrow happy_dollar_dollar -> cont 61#;+ TokSymbol SymLambda happy_dollar_dollar -> cont 62#;+ TokSymbol SymAs happy_dollar_dollar -> cont 63#;+ TokSymbol SymBar happy_dollar_dollar -> cont 64#;+ TokSymbol SymOpenParen happy_dollar_dollar -> cont 65#;+ TokSymbol SymCloseParen happy_dollar_dollar -> cont 66#;+ TokSymbol SymDoubleOpenBrace happy_dollar_dollar -> cont 67#;+ TokSymbol SymDoubleCloseBrace happy_dollar_dollar -> cont 68#;+ TokSymbol SymOpenBrace happy_dollar_dollar -> cont 69#;+ TokSymbol SymCloseBrace happy_dollar_dollar -> cont 70#;+ TokSymbol SymOpenVirtualBrace happy_dollar_dollar -> cont 71#;+ TokSymbol SymCloseVirtualBrace happy_dollar_dollar -> cont 72#;+ TokSymbol SymVirtualSemi happy_dollar_dollar -> cont 73#;+ TokSymbol SymOpenPragma happy_dollar_dollar -> cont 74#;+ TokSymbol SymClosePragma happy_dollar_dollar -> cont 75#;+ TokId happy_dollar_dollar -> cont 76#;+ TokQId happy_dollar_dollar -> cont 77#;+ TokString happy_dollar_dollar -> cont 78#;+ TokLiteral happy_dollar_dollar -> cont 79#;+ _ -> happyError' tk+ })++happyError_ 80# tk = happyError' tk+happyError_ _ tk = happyError' tk++happyThen :: () => Parser a -> (a -> Parser b) -> Parser b+happyThen = (>>=)+happyReturn :: () => a -> Parser a+happyReturn = (return)+happyThen1 = happyThen+happyReturn1 :: () => a -> Parser a+happyReturn1 = happyReturn+happyError' :: () => (Token) -> Parser a+happyError' tk = (\token -> happyError) tk++tokensParser = happySomeParser where+ happySomeParser = happyThen (happyParse 0#) (\x -> happyReturn (happyOut6 x))++exprParser = happySomeParser where+ happySomeParser = happyThen (happyParse 1#) (\x -> happyReturn (happyOut29 x))++moduleParser = happySomeParser where+ happySomeParser = happyThen (happyParse 2#) (\x -> happyReturn (happyOut9 x))++happySeq = happyDontSeq+++{--------------------------------------------------------------------------+ Parsers+ --------------------------------------------------------------------------}++-- | Parse the token stream. Used by the TeX compiler.+tokensParser :: Parser [Token]++-- | Parse an expression. Could be used in interactions.+exprParser :: Parser Expr++-- | Parse a module.+moduleParser :: Parser Module+++{--------------------------------------------------------------------------+ Happy stuff+ --------------------------------------------------------------------------}++-- | Required by Happy.+happyError :: Parser a+happyError = parseError "Parse error"+++{--------------------------------------------------------------------------+ Utility functions+ --------------------------------------------------------------------------}++-- | Create a name from a string.++mkName :: (Interval, String) -> Parser Name+mkName (i, s) = do+ let xs = parts s+ mapM_ isValidId xs+ unless (alternating xs) $ fail $ "a name cannot contain two consecutive underscores"+ return $ Name (getRange i) xs+ where+ parts :: String -> [NamePart]+ parts "" = []+ parts ('_' : s) = Hole : parts s+ parts s = Id x : parts s'+ where (x, s') = break (== '_') s++ isValidId Hole = return ()+ isValidId (Id x) = case parse defaultParseFlags [0] (lexer return) x of+ ParseOk _ (TokId _) -> return ()+ _ -> fail $ "in the name " ++ s ++ ", the part " ++ x ++ " is not valid"++ -- we know that there are no two Ids in a row+ alternating (Hole : Hole : _) = False+ alternating (_ : xs) = alternating xs+ alternating [] = True++-- | Create a qualified name from a list of strings+mkQName :: [(Interval, String)] -> Parser QName+mkQName ss = do+ xs <- mapM mkName ss+ return $ foldr Qual (QName $ last xs) (init xs)++-- | Match a particular name.+isName :: String -> (Interval, String) -> Parser ()+isName s (_,s')+ | s == s' = return ()+ | otherwise = fail $ "expected " ++ s ++ ", found " ++ s'++-- | Build a forall pi (forall x y z -> ...)+forallPi :: [LamBinding] -> Expr -> Expr+forallPi bs e = Pi (map addType bs) e++-- | Converts lambda bindings to typed bindings.+addType :: LamBinding -> TypedBindings+addType (DomainFull b) = b+addType (DomainFree h rel x) = TypedBindings r $ Arg h rel $ TBind r [x] $ Underscore r Nothing+ where r = getRange x++-- | Check that an import directive doesn't contain repeated names+verifyImportDirective :: ImportDirective -> Parser ImportDirective+verifyImportDirective i =+ case filter ((>1) . length)+ $ group+ $ sort xs+ of+ [] -> return i+ yss -> let Just pos = rStart $ getRange $ head $ concat yss in+ parseErrorAt pos $+ "repeated name" ++ s ++ " in import directive: " +++ concat (intersperse ", " $ map (show . head) yss)+ where+ s = case yss of+ [_] -> ""+ _ -> "s"+ where+ xs = names (usingOrHiding i) ++ map renFrom (renaming i)+ names (Using xs) = xs+ names (Hiding xs) = xs++-- | Breaks up a string into substrings. Returns every maximal+-- subsequence of zero or more characters distinct from @'.'@.+--+-- > splitOnDots "" == [""]+-- > splitOnDots "foo.bar" == ["foo", "bar"]+-- > splitOnDots ".foo.bar" == ["", "foo", "bar"]+-- > splitOnDots "foo.bar." == ["foo", "bar", ""]+-- > splitOnDots "foo..bar" == ["foo", "", "bar"]+splitOnDots :: String -> [String]+splitOnDots "" = [""]+splitOnDots ('.' : s) = [] : splitOnDots s+splitOnDots (c : s) = case splitOnDots s of+ p : ps -> (c : p) : ps++prop_splitOnDots = and+ [ splitOnDots "" == [""]+ , splitOnDots "foo.bar" == ["foo", "bar"]+ , splitOnDots ".foo.bar" == ["", "foo", "bar"]+ , splitOnDots "foo.bar." == ["foo", "bar", ""]+ , splitOnDots "foo..bar" == ["foo", "", "bar"]+ ]++-- | Returns 'True' iff the name is a valid Haskell (hierarchical)+-- module name.+validHaskellModuleName :: String -> Bool+validHaskellModuleName = all ok . splitOnDots+ where+ -- Checks if a dot-less module name is well-formed.+ ok :: String -> Bool+ ok [] = False+ ok (c : s) =+ isUpper c &&+ all (\c -> isLower c || c == '_' ||+ isUpper c ||+ generalCategory c == DecimalNumber ||+ c == '\'')+ s++{--------------------------------------------------------------------------+ Patterns+ --------------------------------------------------------------------------}++-- | Turn an expression into a left hand side.+exprToLHS :: Expr -> Parser ([Expr] -> [Expr] -> LHS)+exprToLHS e = case e of+ WithApp r e es -> LHS <$> exprToPattern e <*> mapM exprToPattern es+ _ -> LHS <$> exprToPattern e <*> return []++-- | Turn an expression into a pattern. Fails if the expression is not a+-- valid pattern.+exprToPattern :: Expr -> Parser Pattern+exprToPattern e =+ case e of+ Ident x -> return $ IdentP x+ App _ e1 e2 -> AppP <$> exprToPattern e1+ <*> T.mapM (T.mapM exprToPattern) e2+ Paren r e -> ParenP r+ <$> exprToPattern e+ Underscore r _ -> return $ WildP r+ Absurd r -> return $ AbsurdP r+ As r x e -> AsP r x <$> exprToPattern e+ Dot r (HiddenArg _ e) -> return $ HiddenP r $ fmap (DotP r) e+ Dot r e -> return $ DotP r e+ Lit l -> return $ LitP l+ HiddenArg r e -> HiddenP r <$> T.mapM exprToPattern e+ InstanceArg r e -> InstanceP r <$> T.mapM exprToPattern e+ RawApp r es -> RawAppP r <$> mapM exprToPattern es+ OpApp r x es -> OpAppP r x <$> mapM opAppExprToPattern es+ _ ->+ let Just pos = rStart $ getRange e in+ parseErrorAt pos $ "Not a valid pattern: " ++ show e++opAppExprToPattern :: OpApp Expr -> Parser Pattern+opAppExprToPattern (SyntaxBindingLambda _ _ _) = parseError "syntax binding lambda cannot appear in a pattern"+opAppExprToPattern (Ordinary e) = exprToPattern e++-- | Turn an expression into a name. Fails if the expression is not a+-- valid identifier.+exprToName :: Expr -> Parser Name+exprToName (Ident (QName x)) = return x+exprToName e =+ let Just pos = rStart $ getRange e in+ parseErrorAt pos $ "Not a valid identifier: " ++ show e++parsePanic s = parseError $ "Internal parser error: " ++ s ++ ". Please report this as a bug."++{- RHS or type signature -}++data RHSOrTypeSigs = JustRHS RHS+ | TypeSigsRHS Expr++namesOfPattern :: Pattern -> Maybe [(Relevance, Name)]+namesOfPattern (IdentP (QName i)) = Just [(Relevant, i)]+namesOfPattern (DotP _ (Ident (QName i))) = Just [(Irrelevant, i)]+namesOfPattern (RawAppP _ ps) = fmap concat $ mapM namesOfPattern ps+namesOfPattern _ = Nothing++funClauseOrTypeSigs :: LHS -> RHSOrTypeSigs -> WhereClause -> Parser [Declaration]+funClauseOrTypeSigs lhs (JustRHS rhs) wh = return [FunClause lhs rhs wh]+funClauseOrTypeSigs lhs (TypeSigsRHS e) wh+ | NoWhere <- wh,+ LHS p [] [] [] <- lhs,+ Just names <- namesOfPattern p = return $ map (\(x,y) -> TypeSig x y e) names+ | otherwise = parseError "Illegal function clause or type signature"++{--------------------------------------------------------------------------+ Tests+ --------------------------------------------------------------------------}++-- | Test suite.+tests :: IO Bool+tests = runTests "Agda.Syntax.Parser.Parser"+ [ quickCheck' prop_splitOnDots+ ]+{-# LINE 1 "templates/GenericTemplate.hs" #-}+{-# LINE 1 "templates/GenericTemplate.hs" #-}+{-# LINE 1 "<built-in>" #-}+{-# LINE 1 "<command line>" #-} {-# LINE 1 "templates/GenericTemplate.hs" #-} -- Id: GenericTemplate.hs,v 1.26 2005/01/14 14:47:22 simonmar Exp
+ doc/release-notes/2-3-2.txt view
@@ -0,0 +1,699 @@+------------------------------------------------------------------------+-- Release notes for Agda 2 version 2.3.2+------------------------------------------------------------------------++Important changes since 2.3.0:++Installation+============++* The Agda-executable package has been removed.++ The executable is now provided as part of the Agda package.++* The Emacs mode no longer depends on haskell-mode or GHCi.++* Compilation of Emacs mode Lisp files.++ You can now compile the Emacs mode Lisp files by running "agda-mode+ compile". This command is run by "make install".++ Compilation can, in some cases, give a noticeable speedup.++ WARNING: If you reinstall the Agda mode without recompiling the+ Emacs Lisp files, then Emacs may continue using the old, compiled+ files.++Pragmas and Options+===================++* The --without-K check now reconstructs constructor parameters.++ New specification of --without-K:++ If the flag is activated, then Agda only accepts certain+ case-splits. If the type of the variable to be split is D pars ixs,+ where D is a data (or record) type, pars stands for the parameters,+ and ixs the indices, then the following requirements must be+ satisfied:++ * The indices ixs must be applications of constructors (or literals)+ to distinct variables. Constructors are usually not applied to+ parameters, but for the purposes of this check constructor+ parameters are treated as other arguments.++ * These distinct variables must not be free in pars.++* Irrelevant arguments are printed as _ by default now. To turn on+ printing of irrelevant arguments, use option++ --show-irrelevant++* New: Pragma NO_TERMINATION_CHECK to switch off termination checker+ for individual function definitions and mutual blocks.++ The pragma must precede a function definition or a mutual block.+ Examples (see test/succeed/NoTerminationCheck.agda):++ 1. Skipping a single definition: before type signature.++ {-# NO_TERMINATION_CHECK #-}+ a : A+ a = a++ 2. Skipping a single definition: before first clause.++ b : A+ {-# NO_TERMINATION_CHECK #-}+ b = b++ 3. Skipping an old-style mutual block: Before 'mutual' keyword.++ {-# NO_TERMINATION_CHECK #-}+ mutual+ c : A+ c = d++ d : A+ d = c++ 4. Skipping a new-style mutual block: Anywhere before a type+ signature or first function clause in the block++ i : A+ j : A++ i = j+ {-# NO_TERMINATION_CHECK #-}+ j = i++ The pragma cannot be used in --safe mode.++Language+========++* Let binding record patterns++ record _×_ (A B : Set) : Set where+ constructor _,_+ field+ fst : A+ snd : B+ open _×_++ let (x , (y , z)) = t+ in u++ will now be interpreted as++ let x = fst t+ y = fst (snd t)+ z = snd (snd t)+ in u++ Note that the type of t needs to be inferable. If you need to provide+ a type signature, you can write the following:++ let a : ...+ a = t+ (x , (y , z)) = a+ in u++* Pattern synonyms++ A pattern synonym is a declaration that can be used on the left hand+ side (when pattern matching) as well as the right hand side (in+ expressions). For example:++ pattern z = zero+ pattern ss x = suc (suc x)++ f : ℕ -> ℕ+ f z = z+ f (suc z) = ss z+ f (ss n) = n++ Pattern synonyms are implemented by substitution on the abstract+ syntax, so definitions are scope-checked but not type-checked. They+ are particularly useful for universe constructions.++* Qualified mixfix operators++ It is now possible to use a qualified mixfix operator by qualifying the first+ part of the name. For instance++ import Data.Nat as Nat+ import Data.Bool as Bool++ two = Bool.if true then 1 Nat.+ 1 else 0++* Sections [Issue 735]. Agda now parses anonymous modules as sections:++ module _ {a} (A : Set a) where++ data List : Set a where+ [] : List+ _∷_ : (x : A) (xs : List) → List++ module _ {a} {A : Set a} where++ _++_ : List A → List A → List A+ [] ++ ys = ys+ (x ∷ xs) ++ ys = x ∷ (xs ++ ys)++ test : List Nat+ test = (5 ∷ []) ++ (3 ∷ [])++ In general, now the syntax++ module _ parameters where+ declarations++ is accepted and has the same effect as++ private+ module M parameters where+ declarations+ open M public++ for a fresh name M.++* Instantiating a module in an open import statement [Issue 481]. Now accepted:++ open import Path.Module args [using/hiding/renaming (...)]++ This only brings the imported identifiers from Path.Module into scope,+ not the module itself! Consequently, the following is pointless, and raises+ an error:++ import Path.Module args [using/hiding/renaming (...)]++ You can give a private name M to the instantiated module via++ import Path.Module args as M [using/hiding/renaming (...)]+ open import Path.Module args as M [using/hiding/renaming (...)]++ Try to avoid 'as' as part of the arguments. 'as' is not a keyword;+ the following can be legal, although slightly obfuscated Agda code:++ open import as as as as as as++* Implicit module parameters can be given by name. E.g.++ open M {namedArg = bla}++ This feature has been introduced in Agda 2.3.0 already.++* Multiple type signatures sharing a same type can now be written as a single+ type signature.++ one two : ℕ+ one = suc zero+ two = suc one++Goal and error display+======================++* Meta-variables that were introduced by hidden argument `arg' are now+ printed as _arg_number instead of just _number. [Issue 526]++* Agda expands identifiers in anonymous modules when printing.+ Should make some goals nicer to read. [Issue 721]++* When a module identifier is ambiguous, Agda tells you if one+ of them is a data type module. [Issues 318, 705]++Type checking+=============++* Improved coverage checker. The coverage checker splits on+ arguments that have constructor or literal pattern, committing+ to the left-most split that makes progress.+ Consider the lookup function for vectors:++ data Fin : Nat → Set where+ zero : {n : Nat} → Fin (suc n)+ suc : {n : Nat} → Fin n → Fin (suc n)++ data Vec (A : Set) : Nat → Set where+ [] : Vec A zero+ _∷_ : {n : Nat} → A → Vec A n → Vec A (suc n)++ _!!_ : {A : Set}{n : Nat} → Vec A n → Fin n → A+ (x ∷ xs) !! zero = x+ (x ∷ xs) !! suc i = xs !! i++ In Agda up to 2.3.0, this definition is rejected unless we add+ an absurd clause++ [] !! ()++ This is because the coverage checker committed on splitting+ on the vector argument, even though this inevitably lead to+ failed coverage, because a case for the empty vector [] is missing.++ The improvement to the coverage checker consists on committing+ only on splits that have a chance of covering, since all possible+ constructor patterns are present. Thus, Agda will now split+ first on the Fin argument, since cases for both zero and suc are+ present. Then, it can split on the Vec argument, since the+ empty vector is already ruled out by instantiating n to a suc _.++* Instance arguments resolution will now consider candidates which+ still expect hidden arguments. For example:++ record Eq (A : Set) : Set where+ field eq : A → A → Bool++ open Eq {{...}}++ eqFin : {n : ℕ} → Eq (Fin n)+ eqFin = record { eq = primEqFin }++ testFin : Bool+ testFin = eq fin1 fin2++ The type-checker will now resolve the instance argument of the eq+ function to eqFin {_}. This is only done for hidden arguments, not+ instance arguments, so that the instance search stays non-recursive.++* Constraint solving: Upgraded Miller patterns to record patterns. [Issue 456]++ Agda now solves meta-variables that are applied to record patterns.+ A typical (but here, artificial) case is:++ record Sigma (A : Set)(B : A -> Set) : Set where+ constructor _,_+ field+ fst : A+ snd : B fst++ test : (A : Set)(B : A -> Set) ->+ let X : Sigma A B -> Sigma A B+ X = _+ in (x : A)(y : B x) -> X (x , y) ≡ (x , y)+ test A B x y = refl++ This yields a constraint of the form++ _X A B (x , y) := t[x,y]++ (with t[x,y] = (x, y)) which is not a Miller pattern.+ However, Agda now solves this as++ _X A B z := t[fst z,snd z].++* Changed: solving recursive constraints. [Issue 585]++ Until 2.3.0, Agda sometimes inferred values that did not pass the+ termination checker later, or would even make Agda loop. To prevent this,+ the occurs check now also looks into the definitions of the current mutual+ block, to avoid constructing recursive solutions. As a consequence, also+ terminating recursive solutions are no longer found automatically.++ This effects a programming pattern where the recursively computed+ type of a recursive function is left to Agda to solve.++ mutual++ T : D -> Set+ T pattern1 = _+ T pattern2 = _++ f : (d : D) -> T d+ f pattern1 = rhs1+ f pattern2 = rhs2++ This might no longer work from now on.+ See examples test/fail/Issue585*.agda++* Less eager introduction of implicit parameters. [Issue 679]++ Until Agda 2.3.0, trailing hidden parameters were introduced eagerly+ on the left hand side of a definition. For instance, one could not+ write++ test : {A : Set} -> Set+ test = \ {A} -> A++ because internally, the hidden argument {A : Set} was added to the+ left-hand side, yielding++ test {_} = \ {A} -> A++ which raised a type error. Now, Agda only introduces the trailing+ implicit parameters it has to, in order to maintain uniform function+ arity. For instance, in++ test : Bool -> {A B C : Set} -> Set+ test true {A} = A+ test false {B = B} = B++ Agda will introduce parameters A and B in all clauses, but not C,+ resulting in++ test : Bool -> {A B C : Set} -> Set+ test true {A} {_} = A+ test false {_} {B = B} = B++ Note that for checking where-clauses, still all hidden trailing+ parameters are in scope. For instance:++ id : {i : Level}{A : Set i} -> A -> A+ id = myId+ where myId : forall {A} -> A -> A+ myId x = x++ To be able to fill in the meta variable _1 in++ myId : {A : Set _1} -> A -> A++ the hidden parameter {i : Level} needs to be in scope.++ As a result of this more lazy introduction of implicit parameters,+ the following code now passes.++ data Unit : Set where+ unit : Unit++ T : Unit → Set+ T unit = {u : Unit} → Unit++ test : (u : Unit) → T u+ test unit with unit+ ... | _ = λ {v} → v++ Before, Agda would eagerly introduce the hidden parameter {v} as+ unnamed left-hand side parameter, leaving no way to refer to it.++ The related issue 655 has also been addressed. It is now possible+ to make `synonym' definitions++ name = expression++ even when the type of expression begins with a hidden quantifier.+ Simple example:++ id2 = id++ That resulted in unsolved metas until 2.3.0.++* Agda detects unused arguments and ignores them during equality+ checking. [Issue 691, solves also issue 44.]++ Agda's polarity checker now assigns 'Nonvariant' to arguments+ that are not actually used (except for absurd matches). If+ f's first argument is Nonvariant, then f x is definitionally equal+ to f y regardless of x and y. It is similar to irrelevance, but+ does not require user annotation.++ For instance, unused module parameters do no longer get in the way:++ module M (x : Bool) where++ not : Bool → Bool+ not true = false+ not false = true++ open M true+ open M false renaming (not to not′)++ test : (y : Bool) → not y ≡ not′ y+ test y = refl++ Matching against record or absurd patterns does not count as `use',+ so we get some form of proof irrelevance:++ data ⊥ : Set where+ record ⊤ : Set where+ constructor trivial++ data Bool : Set where+ true false : Bool++ True : Bool → Set+ True true = ⊤+ True false = ⊥++ fun : (b : Bool) → True b → Bool+ fun true trivial = true+ fun false ()++ test : (b : Bool) → (x y : True b) → fun b x ≡ fun b y+ test b x y = refl++ More examples in test/succeed/NonvariantPolarity.agda.++ Phantom arguments: Parameters of record and data types are considered+ `used' even if they are not actually used. Consider:++ False : Nat → Set+ False zero = ⊥+ False (suc n) = False n++ module Invariant where+ record Bla (n : Nat)(p : False n) : Set where++ module Nonvariant where+ Bla : (n : Nat) → False n → Set+ Bla n p = ⊤++ Even though record `Bla' does not use its parameters n and p, they+ are considered as used, allowing "phantom type" techniques.++ In contrast, the arguments of function `Bla' are recognized as unused.+ The following code type-checks if we open Invariant but leaves unsolved+ metas if we open Nonvariant.++ drop-suc : {n : Nat}{p : False n} → Bla (suc n) p → Bla n p+ drop-suc _ = _++ bla : (n : Nat) → {p : False n} → Bla n p → ⊥+ bla zero {()} b+ bla (suc n) b = bla n (drop-suc b)++ If `Bla' is considered invariant, the hidden argument in the recursive+ call can be inferred to be `p'. If it is considered non-variant, then+ `Bla n X = Bla n p' does not entail `X = p' and the hidden argument+ remains unsolved. Since `bla' does not actually use its hidden argument,+ its value is not important and it could be searched for.+ Unfortunately, polarity analysis of `bla' happens only after type+ checking, thus, the information that `bla' is non-variant in `p' is+ not available yet when meta-variables are solved.+ (See test/fail/BrokenInferenceDueToNonvariantPolarity.agda)++* Agda now expands simple definitions (one clause, terminating)+ to check whether a function is constructor headed. [Issue 747]+ For instance, the following now also works:++ MyPair : Set -> Set -> Set+ MyPair A B = Pair A B++ Vec : Set -> Nat -> Set+ Vec A zero = Unit+ Vec A (suc n) = MyPair A (Vec A n)++ Here, Unit and Pair are data or record types.++Compiler backends+=================++* -Werror is now overridable.++ To enable compilation of Haskell modules containing warnings, the+ -Werror flag for the MAlonzo backend has been made overridable. If,+ for example, --ghc-flag=-Wwarn is passed when compiling, one can get+ away with things like:++ data PartialBool : Set where+ true : PartialBool++ {-# COMPILED_DATA PartialBool Bool True #-}++ The default behavior remains as it used to be and rejects the above+ program.++Tools+=====++Emacs mode+----------++* Asynchronous Emacs mode.++ One can now use Emacs while a buffer is type-checked. If the buffer+ is edited while the type-checker runs, then syntax highlighting will+ not be updated when type-checking is complete.++* Interactive syntax highlighting.++ The syntax highlighting is updated while a buffer is type-checked:++ • At first the buffer is highlighted in a somewhat crude way+ (without go-to-definition information for overloaded+ constructors).++ • If the highlighting level is "interactive", then the piece of code+ that is currently being type-checked is highlighted as such. (The+ default is "non-interactive".)++ • When a mutual block has been type-checked it is highlighted+ properly (this highlighting includes warnings for potential+ non-termination).++ The highlighting level can be controlled via the new configuration+ variable agda2-highlight-level.++* Multiple case-splits can now be performed in one go.++ Consider the following example:++ _==_ : Bool → Bool → Bool+ b₁ == b₂ = {!!}++ If you split on "b₁ b₂", then you get the following code:++ _==_ : Bool → Bool → Bool+ true == true = {!!}+ true == false = {!!}+ false == true = {!!}+ false == false = {!!}++ The order of the variables matters. Consider the following code:++ lookup : ∀ {a n} {A : Set a} → Vec A n → Fin n → A+ lookup xs i = {!!}++ If you split on "xs i", then you get the following code:++ lookup : ∀ {a n} {A : Set a} → Vec A n → Fin n → A+ lookup [] ()+ lookup (x ∷ xs) zero = {!!}+ lookup (x ∷ xs) (suc i) = {!!}++ However, if you split on "i xs", then you get the following code+ instead:++ lookup : ∀ {a n} {A : Set a} → Vec A n → Fin n → A+ lookup (x ∷ xs) zero = ?+ lookup (x ∷ xs) (suc i) = ?++ This code is rejected by Agda 2.3.0, but accepted by 2.3.2 thanks+ to improved coverage checking (see above).++* The Emacs mode now presents information about which module is+ currently being type-checked.++* New global menu entry: Information about the character at point.++ If this entry is selected, then information about the character at+ point is displayed, including (in many cases) information about how+ to type the character.++* Commenting/uncommenting the rest of the buffer.++ One can now comment or uncomment the rest of the buffer by typing+ C-c C-x M-; or by selecting the menu entry "Comment/uncomment the+ rest of the buffer".++* The Emacs mode now uses the Agda executable instead of GHCi.++ The *ghci* buffer has been renamed to *agda2*.++ A new configuration variable has been introduced:+ agda2-program-name, the name of the Agda executable (by default+ agda).++ The variable agda2-ghci-options has been replaced by+ agda2-program-args: extra arguments given to the Agda executable (by+ default none).++ If you want to limit Agda's memory consumption you can add some+ arguments to agda2-program-args, for instance +RTS -M1.5G -RTS.++* The Emacs mode no longer depends on haskell-mode.++ Users who have customised certain haskell-mode variables (such as+ haskell-ghci-program-args) may want to update their configuration.++LaTeX-backend+-------------++An experimental LaTeX-backend which does precise highlighting a la the+HTML-backend and code alignment a la lhs2TeX has been added.++Here is a sample input literate Agda file:++ \documentclass{article}++ \usepackage{agda}++ \begin{document}++ The following module declaration will be hidden in the output.++ \AgdaHide{+ \begin{code}+ module M where+ \end{code}+ }++ Two or more spaces can be used to make the backend align stuff.++ \begin{code}+ data ℕ : Set where+ zero : ℕ+ suc : ℕ → ℕ++ _+_ : ℕ → ℕ → ℕ+ zero + n = n+ suc m + n = suc (m + n)+ \end{code}++ \end{document}++To produce an output PDF issue the following commands:++ agda --latex -i . <file>.lagda+ pdflatex latex/<file>.tex++Only the top-most module is processed, like with lhs2tex and unlike with+the HTML-backend. If you want to process imported modules you have to+call agda --latex manually on each of those modules.++There are still issues related to formatting, see the bug tracker for+more information:++ https://code.google.com/p/agda/issues/detail?id=697++The default agda.sty might therefore change in backwards-incompatible+ways, as work proceeds in trying to resolve those problems.+++Implemented features:++ * Two or more spaces can be used to force alignment of things, like+ with lhs2tex. See example above.++ * The highlighting information produced by the type checker is used to+ generate the output. For example, the data declaration in the example+ above, produces:++ \AgdaKeyword{data} \AgdaDatatype{ℕ} \AgdaSymbol{:}+ \AgdaPrimitiveType{Set} \AgdaKeyword{where}++ These latex commands are defined in agda.sty (which is imported by+ \usepackage{agda}) and cause the highlighting.++ * The latex-backend checks if agda.sty is found by the latex+ environment, if it isn't a default agda.sty is copied from Agda's+ data-dir into the working directory (and thus made available to the+ latex environment).++ If the default agda.sty isn't satisfactory (colors, fonts, spacing,+ etc) then the user can modify it and make put it somewhere where the+ latex environment can find it. Hopefully most aspects should be+ modifiable via agda.sty rather than having to tweak the+ implementation.++ * --latex-dir can be used to change the default output directory.
src/agda-mode/Main.hs view
@@ -1,11 +1,10 @@-{-# LANGUAGE CPP #-}- -- | A program which either tries to add setup code for Agda's Emacs -- mode to the users .emacs file, or provides information to Emacs -- about where the Emacs mode is installed. module Main (main) where +import Control.Applicative import Control.Exception import Control.Monad import Data.Char@@ -17,9 +16,6 @@ import System.Exit import System.FilePath import System.IO-#if !(MIN_VERSION_base(4,2,0))-import qualified System.IO.UTF8 as UTF8-#endif import System.Process import Paths_Agda (getDataDir, version)@@ -37,37 +33,42 @@ setupDotEmacs (Files { thisProgram = prog , dotEmacs = dotEmacs })+ | arg == compileFlag ->+ compileElispFiles _ -> do inform usage exitFailure -- Command line options. -setupFlag = "setup"-locateFlag = "locate"+setupFlag = "setup"+locateFlag = "locate"+compileFlag = "compile" -- | Usage information. usage :: String usage = unlines [ "This program, which is part of Agda version " ++ ver ++ ", can be run"- , "in two modes, depending on which option it is invoked with:"+ , "in three modes, depending on which option it is invoked with:" , "" , setupFlag , "" , " The program tries to add setup code for Agda's Emacs mode to the" , " current user's .emacs file. It is assumed that the .emacs file"-#if MIN_VERSION_base(4,2,0) , " uses the character encoding specified by the locale."-#else- , " uses ASCII or some other character encoding which ASCII is"- , " compatible with (like Latin-1 or UTF-8)."-#endif , "" , locateFlag , "" , " The path to the Emacs mode's main file is printed on standard" , " output (using the UTF-8 character encoding and no trailing" , " newline)."+ , ""+ , compileFlag+ , ""+ , " The program tries to compile Agda's Emacs mode's source files."+ , ""+ , " WARNING: If you reinstall the Agda mode without recompiling the Emacs"+ , " Lisp files, then Emacs may continue using the old, compiled files." ] -- | The current version of Agda.@@ -86,12 +87,8 @@ printEmacsModeFile = do dataDir <- getDataDir let path = dataDir </> "emacs-mode" </> "agda2.el"-#if MIN_VERSION_base(4,2,0) hSetEncoding stdout utf8 putStr path-#else- UTF8.putStr path-#endif ------------------------------------------------------------------------ -- Setting up the .emacs file@@ -191,6 +188,41 @@ esc c | c `elem` ['\\', '"'] = '\\' : [c] | isAscii c && isPrint c = [c] | otherwise = "\\x" ++ showHex (fromEnum c) "\\ "++------------------------------------------------------------------------+-- Compiling Emacs Lisp files++-- | The Agda mode's Emacs Lisp files, given in the order in which+-- they should be compiled.++emacsLispFiles :: [FilePath]+emacsLispFiles =+ [ "agda2-abbrevs.el"+ , "annotation.el"+ , "agda2-queue.el"+ , "eri.el"+ , "agda2.el"+ , "agda-input.el"+ , "agda2-highlight.el"+ , "agda2-mode.el"+ ]++-- | Tries to compile the Agda mode's Emacs Lisp files.++compileElispFiles :: IO ()+compileElispFiles = do+ dataDir <- (</> "emacs-mode") <$> getDataDir+ let elFiles = map (dataDir </>) emacsLispFiles+ elFiles <- filterM doesFileExist elFiles+ exit <- rawSystem "emacs" $+ [ "--no-init-file", "--no-site-file"+ , "--directory", dataDir+ , "--batch"+ , "--funcall", "batch-byte-compile"+ ] ++ elFiles+ unless (exit == ExitSuccess) $ do+ informLn "Unable to compile Emacs Lisp files."+ exitFailure ------------------------------------------------------------------------ -- Helper functions
src/data/Agda.css view
@@ -22,9 +22,11 @@ /* OtherAspects. */ .DottedPattern {} .UnsolvedMeta { color: black; background: yellow }+.UnsolvedConstraint { color: black; background: yellow } .TerminationProblem { color: black; background: #FFA07A } .IncompletePattern { color: black; background: #F5DEB3 } .Error { color: red; text-decoration: underline }+.TypeChecks { color: black; background: #ADD8E6 } /* Standard attributes. */ a { text-decoration: none }
src/data/EpicInclude/AgdaPrelude.e view
@@ -29,59 +29,38 @@ -- data String = Con 0 | Con 1 (Char*) String -freadStr (stream : Ptr) -> Data =+freadStr (stream : Ptr) -> String = let isEof : Bool = foreign Int "feof" (stream : Ptr) in if isEof then Con 0 () else let str : String = %effect(foreign String "freadStrChunk" (stream : Ptr))- in Con 1 ( str , freadStr (stream))+ in primStringAppend( str , freadStr (stream)) -readStr (u : Unit) -> Data =+readStr (u : Unit) -> String = let isEof : Bool = foreign Int "eofstdin" () in if isEof then Con 0 () else let str : String = %effect(foreign String "readStrChunk" ())- in Con 1 ( str , readStr (u))+ in primStringAppend ( str , readStr (u)) -primStringAppend (xs : Data, ys : Data) -> Data = case xs of- { Con 0 () -> ys- | Con 1 (x : String, rest : Data) -> Con 1 (x, primStringAppend (rest, ys))- }+primStringAppend (xs : String, ys : String) -> String = + foreign String "append" (xs : String, ys : String) -length (xs : Data) -> Int = case xs of- { Con 0 () -> 0- | Con 1 (x : String, rest : Data) -> strlen(x) + length(rest)- } -charAt (xs : Data, i : Int) -> Int = case xs of- { Con 0 () -> error "index: out of bounds!"- | Con 1 (x : String, rest : Data) -> - let len : Int = strlen(x)- in (if i < len then foreign Int "strIndex" (x : String, i : Int)- else charAt (rest, i - len))- }--mkString (xs : Data) -> String = case xs of- { Con 0 () -> ""- | Con 1 (s : String , rest : Data) -> - let rs : String = mkString (rest) in- {-let rsLen : Int = strlen (rs) in- if rsLen == 0 then s else-} foreign String "append" (s : String, rs : String)- }+%inline length (xs : String) -> Int = strlen (xs) -frString( xs : String) -> Data = Con 1 (xs , Con 0 ())+charAt (xs : String, i : Int) -> Int = + foreign Int "strIndex" (xs : String , i : Int) -primStringEquality (xs : Data, ys : Data) -> Bool =- foreign Int "eqString" (mkString(xs) : String, mkString(ys) : String)+primStringEquality (xs : String, ys : String) -> Bool =+ foreign Int "eqString" (xs : String, ys : String) -charToString (c : Int) -> Data = - Con 1 (charToStr(c), Con 0 ())-charToStr (c : Int) -> String = +charToString (c : Int) -> String = foreign String "charToStr" (c : Int) strlen (s : String) -> Int = foreign Int "strlen" (s : String) -- TODO: toList/fromList could be made slightly more efficient. -primStringToListS (xs : String) -> Data = %effect(+primStringToList (xs : String) -> Data = %effect( let result : Data = primNil () in let i : Int = strlen (xs) - 1 in %while (i >= 0,@@ -90,18 +69,17 @@ unit) ; result) -primStringToList (xs : Data) -> Data = case xs of- { Con 0 () -> primNil ()- | Con 1 (str : String, rest : Data) -> primListAppend(primStringToListS(str), primStringToList(rest))- } map (f : Any, l : Any) -> Any = case l of { Con 0 () -> Con 0 () | Con 1 (x : Any, xs : Any) -> Con 1 (f (x), map (f, xs)) } -primStringFromList (l : Data) -> String = map (charToStr, l)-+primStringFromList (l : Data) -> String = + case l of {+ Con 0 () -> ""+ | Con 1 (c : Char, cs : Data) -> strCons (c , primStringFromList(cs))+ } strCons(i : Int , s : String) -> String = foreign String "strCons" (i : Int, s : String)@@ -135,10 +113,10 @@ printBig (x:BigInt) -> Unit = foreign Unit "printBig" (x:BigInt) -bigToStr (x:BigInt) -> Data =- frString(foreign String "bigToStr" (x:BigInt))+bigToStr (x:BigInt) -> String =+ foreign String "bigToStr" (x:BigInt) -strToBig (x : Data) -> Any = foreign BigInt "strToBig" (mkString(x) : String)+strToBig (x : String) -> Any = foreign BigInt "strToBig" (x : String) -- strToBig (x:String) -> Any = -- foreign Any "strToBig" (x:String)@@ -162,8 +140,8 @@ -primZero() -> Any = foreign BigInt "bigZero" ()-primOne() -> Any = foreign BigInt "bigOne" ()+primZero() -> Any = 0L -- foreign BigInt "bigZero" ()+primOne() -> Any = 1L -- foreign BigInt "bigOne" () primSuc (n : Any) -> Any = primNatPlus(n, primOne())
+ src/data/agda.sty view
@@ -0,0 +1,152 @@+% ----------------------------------------------------------------------+% Some useful commands when doing highlightning of Agda code in LaTeX.+% ----------------------------------------------------------------------++\ProvidesPackage{agda}++\usepackage{ifxetex, xcolor, polytable}++% XeLaTeX+\ifxetex+ \usepackage{polyglossia}+ \usepackage{fontspec}+ \usepackage[]{unicode-math}++% pdfLaTeX+\else+ \usepackage{ucs, amsfonts, amssymb}+ \usepackage[safe]{tipa} % See page 12 of the tipa manual for what+ % safe does.++ % FIX: This doesn't seem to help solve the pipe problem?+ % http://tex.stackexchange.com/questions/1774/how-to-insert-pipe-symbol-in-latex+ \usepackage[T1]{fontenc}+ \usepackage[utf8x]{inputenc}++ % FIX: Complete the list and send it upstream to the ucs package devs.+ \DeclareUnicodeCharacter{9657}{$\triangleright$}+ \DeclareUnicodeCharacter{8759}{::}+ \DeclareUnicodeCharacter{8263}{$?\!?$}+ \DeclareUnicodeCharacter{737} {$^l$} % FIX: Ugly, apparently ^r is+ % defined, I can't find the+ % definition though.+ \DeclareUnicodeCharacter{8718}{$\blacksquare$}+ \DeclareUnicodeCharacter{8255}{$\_$} % FIX: Couldn't find \undertie.+ \DeclareUnicodeCharacter{9667}{$\triangleleft$}+ \DeclareUnicodeCharacter{10218}{$\langle\!\langle$}+ \DeclareUnicodeCharacter{10219}{$\rangle\!\rangle$}+\fi++% ----------------------------------------------------------------------+% Font styles.++% Default font style.+\newcommand{\AgdaFontStyle}[1]{\textsf{#1}}++% String font style.+\newcommand{\AgdaStringFontStyle}[1]{\texttt{#1}}++% Comment font style.+\newcommand{\AgdaCommentFontStyle}[1]{\texttt{#1}}++% Bounded variables font style.+\newcommand{\AgdaBoundFontStyle}[1]{\textit{#1}}++% ----------------------------------------------------------------------+% Colours.++% Aspect colours.+\definecolor{AgdaComment} {HTML}{B22222}+\definecolor{AgdaKeyword} {HTML}{CD6600}+\definecolor{AgdaString} {HTML}{B22222}+\definecolor{AgdaNumber} {HTML}{A020F0}+\definecolor{AgdaSymbol} {HTML}{404040}+\definecolor{AgdaPrimitiveType}{HTML}{0000CD}+\definecolor{AgdaOperator} {HTML}{000000}++% NameKind colours.+\definecolor{AgdaBound} {HTML}{000000}+\definecolor{AgdaInductiveConstructor} {HTML}{008B00}+\definecolor{AgdaCoinductiveConstructor}{HTML}{8B7500}+\definecolor{AgdaDatatype} {HTML}{0000CD}+\definecolor{AgdaField} {HTML}{EE1289}+\definecolor{AgdaFunction} {HTML}{0000CD}+\definecolor{AgdaModule} {HTML}{A020F0}+\definecolor{AgdaPostulate} {HTML}{0000CD}+\definecolor{AgdaPrimitive} {HTML}{0000CD}+\definecolor{AgdaRecord} {HTML}{0000CD}++% Other aspect colours.+\definecolor{AgdaDottedPattern} {HTML}{000000}+\definecolor{AgdaUnsolvedMeta} {HTML}{FFFF00}+\definecolor{AgdaTerminationProblem}{HTML}{FFA07A}+\definecolor{AgdaIncompletePattern} {HTML}{F5DEB3}+\definecolor{AgdaError} {HTML}{FF0000}++% Misc.+\definecolor{AgdaHole} {HTML}{9DFF9D}++% ----------------------------------------------------------------------+% Commands.++% Aspect commands.+\newcommand{\AgdaComment} [1]+ {\AgdaCommentFontStyle{\textcolor{AgdaComment}{#1}}}+\newcommand{\AgdaKeyword} [1]+ {\AgdaFontStyle{\textcolor{AgdaKeyword}{#1}}}+\newcommand{\AgdaString} [1]{\AgdaStringFontStyle{\textcolor{AgdaString}{#1}}}+\newcommand{\AgdaNumber} [1]{\textcolor{AgdaNumber}{#1}}+\newcommand{\AgdaSymbol} [1]{\textcolor{AgdaSymbol}{#1}}+\newcommand{\AgdaPrimitiveType}[1]+ {\AgdaFontStyle{\textcolor{AgdaPrimitiveType}{#1}}}+\newcommand{\AgdaOperator} [1]{\textcolor{AgdaOperator}{#1}}++% NameKind commands.+\newcommand{\AgdaBound} [1]{\AgdaBoundFontStyle{\textcolor{AgdaBound}{#1}}}+\newcommand{\AgdaInductiveConstructor}[1]+ {\AgdaFontStyle{\textcolor{AgdaInductiveConstructor}{#1}}}+\newcommand{\AgdaCoinductiveConstructor}[1]+ {\AgdaFontStyle{\textcolor{AgdaCoinductiveConstructor}{#1}}}+\newcommand{\AgdaDatatype} [1]{\AgdaFontStyle{\textcolor{AgdaDatatype}{#1}}}+\newcommand{\AgdaField} [1]{\AgdaFontStyle{\textcolor{AgdaField}{#1}}}+\newcommand{\AgdaFunction} [1]{\AgdaFontStyle{\textcolor{AgdaFunction}{#1}}}+\newcommand{\AgdaModule} [1]{\AgdaFontStyle{\textcolor{AgdaModule}{#1}}}+\newcommand{\AgdaPostulate}[1]{\AgdaFontStyle{\textcolor{AgdaPostulate}{#1}}}+\newcommand{\AgdaPrimitive}[1]{\AgdaFontStyle{\textcolor{AgdaPrimitive}{#1}}}+\newcommand{\AgdaRecord} [1]{\AgdaFontStyle{\textcolor{AgdaRecord}{#1}}}++% Other aspect commands.+\newcommand{\AgdaDottedPattern} [1]{\textcolor{AgdaDottedPattern}{#1}}+\newcommand{\AgdaUnsolvedMeta} [1]+ {\AgdaFontStyle{\colorbox{AgdaUnsolvedMeta}{#1}}}+\newcommand{\AgdaTerminationProblem}[1]+ {\AgdaFontStyle{\colorbox{AgdaTerminationProblem}{#1}}}+\newcommand{\AgdaIncompletePattern} [1]{\colorbox{AgdaIncompletePattern}{#1}}+\newcommand{\AgdaError} [1]+ {\AgdaFontStyle{\textcolor{AgdaError}{\underline{#1}}}}++% Misc.+\newcommand{\AgdaHole}[1]{\colorbox{AgdaHole}{#1}}+\long\def\AgdaHide#1{} % Used to hide code from LaTeX.++\newcommand{\AgdaIndent}[1]{\quad}++% ----------------------------------------------------------------------+% The code environment.++\newcommand{\AgdaCodeStyle}{}+% \newcommand{\AgdaCodeStyle}{\tiny}++\ifdefined\mathindent+ {}+\else+ \newdimen\mathindent\mathindent\leftmargini+\fi++\newenvironment{code}%+{\noindent\ignorespaces\advance\leftskip\mathindent\AgdaCodeStyle\pboxed}%+{\endpboxed\par\noindent%+\ignorespacesafterend}++% Default column for polytable.+\defaultcolumn{l}
src/data/emacs-mode/agda-input.el view
@@ -20,7 +20,6 @@ (require 'quail) (require 'cl)- ;; Quail is quite stateful, so be careful when editing this code. Note ;; that with-temp-buffer is used below whenever buffer-local state is ;; modified.@@ -570,7 +569,7 @@ ("Ge" . ("ε")) ("GE" . ("Ε")) ("Gz" . ("ζ")) ("GZ" . ("Ζ")) ;; \eta \Eta- ("Gth" . ("θ")) ("GTH" . ("θ"))+ ("Gth" . ("θ")) ("GTH" . ("Θ")) ("Gi" . ("ι")) ("GI" . ("Ι")) ("Gk" . ("κ")) ("GK" . ("Κ")) ("Gl" . ("λ")) ("GL" . ("Λ")) ("Gl-" . ("ƛ"))
src/data/emacs-mode/agda2-highlight.el view
@@ -15,6 +15,23 @@ "Syntax highlighting for Agda." :group 'agda2) +(defcustom agda2-highlight-level 'non-interactive+ "How much syntax highlighting should be produced?+Interactive highlighting includes highlighting of the expression+that is currently being type-checked."+ :type '(choice+ (const :tag "None" none)+ (const :tag "Non-interactive" non-interactive)+ (const :tag "Interactive" interactive))+ :group 'agda2-highlight)++(defun agda2-highlight-level nil+ "Formats the highlighting level in a Haskelly way."+ (cond ((equal agda2-highlight-level 'none) "None")+ ((equal agda2-highlight-level 'non-interactive) "NonInteractive")+ ((equal agda2-highlight-level 'interactive) "Interactive")+ (t "None")))+ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Functions for setting faces @@ -101,12 +118,18 @@ (agda2-highlight-unsolved-meta-face :foreground "black" :background "gold")+ (agda2-highlight-unsolved-constraint-face+ :foreground "black"+ :background "gold") (agda2-highlight-termination-problem-face :foreground "black" :background "red") (agda2-highlight-incomplete-pattern-face :foreground "black"- :background "purple")))+ :background "purple")+ (agda2-highlight-typechecks-face+ :foreground "black"+ :background "light steel blue"))) ((equal group 'default-faces) (list (cons 'agda2-highlight-keyword-face (agda2-highlight-face-attributes@@ -161,41 +184,52 @@ font-lock-function-name-face)) (cons 'agda2-highlight-error-face (agda2-highlight-face-attributes- font-lock-warning-face)))))))+ font-lock-warning-face))+ (cons 'agda2-highlight-typechecks-face+ (agda2-highlight-face-attributes+ font-lock-type-face))+ (cons 'agda2-highlight-typechecking-face+ (agda2-highlight-face-attributes+ font-lock-preprocessor-face))))))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Faces (defcustom agda2-highlight-face-groups nil "Colour scheme used in Agda buffers.-Note that changing this option does not remove the customisations-below; you can get them back by resetting this option and-restarting Emacs. If you are using the default-faces option and-change your colour theme the changes may not take effect in Agda-buffers until you have restarted Emacs."+Changes to this variable may not take full effect until you have+restarted Emacs. Note also that if you are using the+default-faces option and change your colour theme, then the+changes may not take effect in Agda buffers until you have+restarted Emacs." :type '(choice- (const :tag "Use the settings below." nil)- (const :tag "Use an approximation of Conor McBride's colour scheme."- conor)- (const :tag "Use simplified highlighting and default font-lock faces."- default-faces))+ (const :tag "Use the settings in the \"Agda2 Highlight Faces\" subgroup." nil)+ (const :tag "Use an approximation of Conor McBride's colour scheme."+ conor)+ (const :tag "Use simplified highlighting and default font-lock faces."+ default-faces)) :group 'agda2-highlight :set 'agda2-highlight-set-faces) +(defgroup agda2-highlight-faces nil+ "Faces used to highlight Agda code.+If `agda2-highlight-face-groups' is nil."+ :group 'agda2-highlight)+ (defface agda2-highlight-keyword-face '((t (:foreground "DarkOrange3"))) "The face used for keywords."- :group 'agda2-highlight)+ :group 'agda2-highlight-faces) (defface agda2-highlight-string-face '((t (:foreground "firebrick"))) "The face used for strings."- :group 'agda2-highlight)+ :group 'agda2-highlight-faces) (defface agda2-highlight-number-face '((t (:foreground "purple"))) "The face used for numbers."- :group 'agda2-highlight)+ :group 'agda2-highlight-faces) (defface agda2-highlight-symbol-face '((((background light))@@ -203,96 +237,108 @@ (((background dark)) (:foreground "gray75"))) "The face used for symbols like forall, =, ->, etc."- :group 'agda2-highlight)+ :group 'agda2-highlight-faces) (defface agda2-highlight-primitive-type-face '((t (:foreground "medium blue"))) "The face used for primitive types (like Set and Prop)."- :group 'agda2-highlight)+ :group 'agda2-highlight-faces) (defface agda2-highlight-bound-variable-face '((t nil)) "The face used for bound variables."- :group 'agda2-highlight)+ :group 'agda2-highlight-faces) (defface agda2-highlight-inductive-constructor-face '((t (:foreground "green4"))) "The face used for inductive constructors."- :group 'agda2-highlight)+ :group 'agda2-highlight-faces) (defface agda2-highlight-coinductive-constructor-face '((t (:foreground "gold4"))) "The face used for coinductive constructors."- :group 'agda2-highlight)+ :group 'agda2-highlight-faces) (defface agda2-highlight-datatype-face '((t (:foreground "medium blue"))) "The face used for datatypes."- :group 'agda2-highlight)+ :group 'agda2-highlight-faces) (defface agda2-highlight-field-face '((t (:foreground "DeepPink2"))) "The face used for record fields."- :group 'agda2-highlight)+ :group 'agda2-highlight-faces) (defface agda2-highlight-function-face '((t (:foreground "medium blue"))) "The face used for functions."- :group 'agda2-highlight)+ :group 'agda2-highlight-faces) (defface agda2-highlight-module-face '((t (:foreground "purple"))) "The face used for module names."- :group 'agda2-highlight)+ :group 'agda2-highlight-faces) (defface agda2-highlight-postulate-face '((t (:foreground "medium blue"))) "The face used for postulates."- :group 'agda2-highlight)+ :group 'agda2-highlight-faces) (defface agda2-highlight-primitive-face '((t (:foreground "medium blue"))) "The face used for primitive functions."- :group 'agda2-highlight)+ :group 'agda2-highlight-faces) (defface agda2-highlight-record-face '((t (:foreground "medium blue"))) "The face used for record types."- :group 'agda2-highlight)+ :group 'agda2-highlight-faces) (defface agda2-highlight-dotted-face '((t nil)) "The face used for dotted patterns."- :group 'agda2-highlight)+ :group 'agda2-highlight-faces) (defface agda2-highlight-operator-face '((t nil)) "The face used for operators."- :group 'agda2-highlight)+ :group 'agda2-highlight-faces) (defface agda2-highlight-error-face '((t (:foreground "red" :underline t))) "The face used for errors."- :group 'agda2-highlight)+ :group 'agda2-highlight-faces) (defface agda2-highlight-unsolved-meta-face '((t (:background "yellow" :foreground "black"))) "The face used for unsolved meta variables."- :group 'agda2-highlight)+ :group 'agda2-highlight-faces) +(defface agda2-highlight-unsolved-constraint-face+ '((t (:background "yellow"+ :foreground "black")))+ "The face used for unsolved constraints which are not connected to metas."+ :group 'agda2-highlight-faces)+ (defface agda2-highlight-termination-problem-face '((t (:background "light salmon" :foreground "black"))) "The face used for termination problems."- :group 'agda2-highlight)+ :group 'agda2-highlight-faces) (defface agda2-highlight-incomplete-pattern-face '((t (:background "wheat" :foreground "black"))) "The face used for incomplete patterns. (Currently unused.)"- :group 'agda2-highlight)+ :group 'agda2-highlight-faces) +(defface agda2-highlight-typechecks-face+ '((t (:background "light blue"+ :foreground "black")))+ "The face used for code which is being type-checked."+ :group 'agda2-highlight-faces)+ (defvar agda2-highlight-faces '((keyword . agda2-highlight-keyword-face) (string . agda2-highlight-string-face)@@ -313,8 +359,10 @@ (operator . agda2-highlight-operator-face) (error . agda2-highlight-error-face) (unsolvedmeta . agda2-highlight-unsolved-meta-face)+ (unsolvedconstraint . agda2-highlight-unsolved-constraint-face) (terminationproblem . agda2-highlight-termination-problem-face)- (incompletepattern . agda2-highlight-incomplete-pattern-face))+ (incompletepattern . agda2-highlight-incomplete-pattern-face)+ (typechecks . agda2-highlight-typechecks-face)) "Alist mapping code aspects to the face used when displaying them. The aspects currently recognised are the following:@@ -339,6 +387,9 @@ `string' Strings. `symbol' Symbols like forall, =, ->, etc. `terminationproblem' Termination problems.+`typechecks' Code which is being type-checked.+`unsolvedconstraint' Unsolved constraints, not connected to meta+ variables. `unsolvedmeta' Unsolved meta variables. The following aspect is ignored:@@ -349,22 +400,54 @@ table). The face `font-lock-comment-face' is used for comments.") ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;+;; Variables++(defvar agda2-highlight-in-progress nil+ "If nil, then highlighting annotations are not applied.")+(make-variable-buffer-local 'agda2-highlight-in-progress)++;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Functions (defun agda2-highlight-setup nil "Set up the `annotation' library for use with `agda2-mode'."- (font-lock-mode 0) (setq annotation-bindings agda2-highlight-faces)) -(defun agda2-highlight-load (file &optional keep)+(defun agda2-highlight-apply (&rest cmds)+ "Adds the syntax highlighting information in the annotation list CMDS.++Old syntax highlighting information is not removed."+ (let (;; Ignore read-only status, otherwise this function may fail.+ (inhibit-read-only t))+ (apply 'annotation-load+ "Click mouse-2 to jump to definition"+ cmds)))++(defun agda2-highlight-add-annotations (&rest cmds)+ "Like `agda2-highlight-apply'.+But only if `agda2-highlight-in-progress' is non-nil."+ (if agda2-highlight-in-progress+ (apply 'agda2-highlight-apply cmds)))++(defun agda2-highlight-load (file) "Load syntax highlighting information from FILE.-Old syntax highlighting information is first removed, unless KEEP++Old syntax highlighting information is not removed."+ (let* ((coding-system-for-read 'utf-8)+ (cmds (with-temp-buffer+ (insert-file-contents file)+ (goto-char (point-min))+ (read (current-buffer)))))+ (apply 'agda2-highlight-apply cmds)))++(defun agda2-highlight-load-and-delete-action (file)+ "Like `agda2-highlight-load', but deletes FILE when done.+And highlighting is only updated if `agda2-highlight-in-progress' is non-nil."- (let ((coding-system-for-read 'utf-8)- ;; Ignore read-only status, otherwise this function may fail.- (inhibit-read-only t))- (annotation-load-file file (lambda (anns) (not keep))- "Click mouse-2 to jump to definition")))+ (unwind-protect+ (if agda2-highlight-in-progress+ (agda2-highlight-load file))+ (delete-file file))) (defun agda2-highlight-clear nil "Remove all syntax highlighting added by `agda2-highlight-reload'."
src/data/emacs-mode/agda2-mode.el view
@@ -10,52 +10,51 @@ ;;; Code: -(defvar agda2-version "2.3.0"+(defvar agda2-version "2.3.2" "The version of the Agda mode.-Note that, by default, the same version of the underlying Haskell-library is used (see `agda2-ghci-options').")+Note that the same version of the Agda executable must be used.") (require 'cl) (set (make-local-variable 'lisp-indent-function) 'common-lisp-indent-function)-(require 'comint)+(require 'compile) (require 'pp)+(require 'time-date) (require 'eri) (require 'annotation) (require 'agda-input) (require 'agda2-highlight) (require 'agda2-abbrevs)-(require 'haskell-ghci)-;; due to a bug in haskell-mode-2.1-(setq haskell-ghci-mode-map (copy-keymap comint-mode-map))-;; Load filladapt, if it is installed.-(condition-case nil- (require 'filladapt)- (error nil))-(unless (fboundp 'overlays-in) (load "overlay")) ; for Xemacs-(unless (fboundp 'propertize) ; for Xemacs 21.4- (defun propertize (string &rest properties)- "Return a copy of STRING with text properties added.+(require 'agda2-queue)+(eval-and-compile+ ;; Load filladapt, if it is installed.+ (condition-case nil+ (require 'filladapt)+ (error nil))+ (unless (fboundp 'overlays-in) (load "overlay")) ; for Xemacs+ (unless (fboundp 'propertize) ; for Xemacs 21.4+ (defun propertize (string &rest properties)+ "Return a copy of STRING with text properties added. First argument is the string to copy. Remaining arguments form a sequence of PROPERTY VALUE pairs for text properties to add to the result."- (let ((str (copy-sequence string)))- (add-text-properties 0 (length str) properties str)- str)))-(unless (fboundp 'run-mode-hooks)- (fset 'run-mode-hooks 'run-hooks)) ; For Emacs versions < 21.+ (let ((str (copy-sequence string)))+ (add-text-properties 0 (length str) properties str)+ str)))+ (unless (fboundp 'run-mode-hooks)+ (fset 'run-mode-hooks 'run-hooks)) ; For Emacs versions < 21.+ (unless (fboundp 'cl-labels)+ (fset 'cl-labels 'labels)) ; For Emacs versions < 24.2.+ (unless (fboundp 'cl-flet)+ (fset 'cl-flet 'flet))) ; For Emacs versions < 24.2. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;; Utilities -(defmacro agda2-protect (form &optional default)- "Expands to (condition-case nil FORM (error DEFAULT))."- `(condition-case nil ,form (error ,default)))-(put 'agda2-protect 'lisp-indent-function 0)- (defmacro agda2-let (varbind funcbind &rest body)- "Expands to (let* VARBIND (labels FUNCBIND BODY...))."- `(let* ,varbind (labels ,funcbind ,@body)))+ "Expands to (let* VARBIND (cl-labels FUNCBIND BODY...)).+Or possibly (let* VARBIND (labels FUNCBIND BODY...))."+ `(let* ,varbind (cl-labels ,funcbind ,@body))) (put 'agda2-let 'lisp-indent-function 2) (defun agda2-chunkify (n xs)@@ -85,6 +84,21 @@ :type '(repeat directory) :group 'agda2) +(defcustom agda2-program-name "agda"+ "The name of the Agda executable."+ :type 'string+ :group 'agda2)++(defcustom agda2-program-args nil+ "Command-line arguments given to the Agda executable (one per string).++Note: Do not give several arguments in the same string.++The flag \"--interaction\" is always included as the first+argument, and does not need to be listed here."+ :type '(repeat string)+ :group 'agda2)+ (defcustom agda2-backend "MAlonzo" "The backend which is used to compile Agda programs."@@ -93,25 +107,13 @@ (const "JS")) :group 'agda2) -(defcustom agda2-ghci-options- (list (concat "-package Agda-" agda2-version))- "Options set in GHCi before loading `agda2-toplevel-module'.-Note that only dynamic options can be set using this variable."- :type '(repeat string)- :group 'agda2)- (defcustom agda2-toplevel-module "Agda.Interaction.GhciTop" "The name of the Agda toplevel module." :type 'string :group 'agda2) -(defcustom agda2-mode-hook- '(agda2-fix-ghci-for-windows)- "Hooks for `agda2-mode'."- :type 'hook :group 'agda2)- (defcustom agda2-information-window-max-height 0.35- "*The maximum height of the information window.+ "The maximum height of the information window. A multiple of the frame height." :type 'number :group 'agda2)@@ -181,11 +183,6 @@ (if (and (equal agda2-fontset-name "fontset-agda2") window-system) (create-fontset-from-fontset-spec agda2-fontset-spec-of-fontset-agda2 t t)) -(defun agda2-fix-ghci-for-windows ()- (if (string-match "windows" system-configuration)- (setq haskell-ghci-program-name "ghc"- haskell-ghci-program-args '("--interactive"))))- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;; Global and buffer-local vars, initialization @@ -223,29 +220,31 @@ (defconst agda2-command-table `(- (agda2-load "\C-c\C-l" (global) "Load")+ (agda2-load "\C-c\C-l" (global) "Load") (agda2-load "\C-c\C-x\C-l")- (agda2-compile "\C-c\C-x\C-c" (global) "Compile")- (agda2-quit "\C-c\C-x\C-q" (global) "Quit")- (agda2-restart "\C-c\C-x\C-r" (global) "Restart")- (agda2-remove-annotations "\C-c\C-x\C-d" (global) "Remove goals and highlighting (\"deactivate\")")- (agda2-display-implicit-arguments "\C-c\C-x\C-h" (global) "Toggle display of hidden arguments")- (agda2-show-constraints ,(kbd "C-c C-=") (global) "Show constraints")- (agda2-solveAll ,(kbd "C-c C-s") (global) "Solve constraints")- (agda2-show-goals ,(kbd "C-c C-?") (global) "Show goals")- (agda2-next-goal "\C-c\C-f" (global) "Next goal") ; Forward.- (agda2-previous-goal "\C-c\C-b" (global) "Previous goal") ; Back.- (agda2-give ,(kbd "C-c C-SPC") (local) "Give")- (agda2-refine "\C-c\C-r" (local) "Refine")- (agda2-auto "\C-c\C-a" (local) "Auto")- (agda2-make-case "\C-c\C-c" (local) "Case")- (agda2-goal-type "\C-c\C-t" (local) "Goal type")- (agda2-show-context "\C-c\C-e" (local) "Context (environment)")- (agda2-infer-type-maybe-toplevel "\C-c\C-d" (local global) "Infer (deduce) type")- (agda2-goal-and-context ,(kbd "C-c C-,") (local) "Goal type and context")- (agda2-goal-and-context-and-inferred ,(kbd "C-c C-.") (local) "Goal type, context and inferred type")- (agda2-module-contents-maybe-toplevel ,(kbd "C-c C-o") (local global) "Module contents")- (agda2-compute-normalised-maybe-toplevel "\C-c\C-n" (local global) "Evaluate term to normal form")+ (agda2-compile "\C-c\C-x\C-c" (global) "Compile")+ (agda2-quit "\C-c\C-x\C-q" (global) "Quit")+ (agda2-restart "\C-c\C-x\C-r" (global) "Kill and restart Agda")+ (agda2-remove-annotations "\C-c\C-x\C-d" (global) "Remove goals and highlighting (\"deactivate\")")+ (agda2-display-implicit-arguments "\C-c\C-x\C-h" (global) "Toggle display of hidden arguments")+ (agda2-show-constraints ,(kbd "C-c C-=") (global) "Show constraints")+ (agda2-solveAll ,(kbd "C-c C-s") (global) "Solve constraints")+ (agda2-show-goals ,(kbd "C-c C-?") (global) "Show goals")+ (agda2-next-goal "\C-c\C-f" (global) "Next goal") ; Forward.+ (agda2-previous-goal "\C-c\C-b" (global) "Previous goal") ; Back.+ (agda2-give ,(kbd "C-c C-SPC") (local) "Give")+ (agda2-refine "\C-c\C-r" (local) "Refine")+ (agda2-auto "\C-c\C-a" (local) "Auto")+ (agda2-make-case "\C-c\C-c" (local) "Case")+ (agda2-goal-type "\C-c\C-t" (local) "Goal type")+ (agda2-show-context "\C-c\C-e" (local) "Context (environment)")+ (agda2-infer-type-maybe-toplevel "\C-c\C-d" (local global) "Infer (deduce) type")+ (agda2-goal-and-context ,(kbd "C-c C-,") (local) "Goal type and context")+ (agda2-goal-and-context-and-inferred ,(kbd "C-c C-.") (local) "Goal type, context and inferred type")+ (agda2-module-contents-maybe-toplevel ,(kbd "C-c C-o") (local global) "Module contents")+ (agda2-compute-normalised-maybe-toplevel "\C-c\C-n" (local global) "Evaluate term to normal form")+ (describe-char nil (global) "Information about the character at point")+ (agda2-comment-dwim-rest-of-buffer ,(kbd "C-c C-x M-;") (global) "Comment/uncomment the rest of the buffer") (eri-indent ,(kbd "TAB")) (eri-indent-reverse [S-iso-lefttab]) (eri-indent-reverse [S-lefttab])@@ -286,14 +285,28 @@ map) "Keymap for agda2 goal menu.") -(defvar agda2-buffer nil "Agda subprocess buffer. Set in `agda2-restart'.")-(defvar agda2-process nil "Agda subprocess. Set in `agda2-restart'.")+(defvar agda2-info-buffer nil+ "Agda information buffer.") +(defvar agda2-process-buffer nil+ "Agda subprocess buffer.+Set in `agda2-restart'.")++(defvar agda2-process nil+ "Agda subprocess.+Set in `agda2-restart'.")++(defvar agda2-in-progress nil+ "Is the Agda process currently busy?")+ ;; Some buffer locals (defvar agda2-buffer-external-status "" "External status of an `agda2-mode' buffer (dictated by the Haskell side).") (make-variable-buffer-local 'agda2-buffer-external-status) +(defvar agda2-output-prompt "Agda2> "+ "The Agda2 buffer's prompt.")+ (defconst agda2-help-address "" "Address accepting submissions of bug reports and questions.")@@ -320,6 +333,39 @@ ;; reference. If the agda2-*-brace definitions were inlined, then ;; goals would be displayed as "{{ }}n" instead of "{ }n". +(defvar agda2-measure-data nil+ "Used by `agda2-measure-load-time'.+This value is either nil or a pair containing a continuation (or+nil) and the time at which the measurement was started.")+(make-variable-buffer-local 'agda2-measure-data)++;; The following variables are used by the filter process,+;; `agda2-output-filter'. Their values are only modified by the filter+;; process, `agda2-go', `agda2-restart', and+;; `agda2-abort-highlighting'.++(defvar agda2-responses-expected nil+ "Is the Agda process expected to produce at least one response?")+(make-variable-buffer-local 'agda2-responses-expected)++(defvar agda2-responses 0+ "The number of encountered response commands.")+(make-variable-buffer-local 'agda2-responses)++(defvar agda2-output-chunk-incomplete (agda2-queue-empty)+ "Buffer for incomplete lines.+\(See `agda2-output-filter'.)")+(make-variable-buffer-local 'agda2-output-chunk-incomplete)++(defvar agda2-last-responses nil+ "Response commands which should be run after other commands.+The command which arrived last is stored first in the list.")+(make-variable-buffer-local 'agda2-last-responses)++(defvar agda2-file-buffer nil+ "The Agda buffer.+Note that this variable is not buffer-local.")+ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;; agda2-mode @@ -328,10 +374,12 @@ ;;;###autoload (modify-coding-system-alist 'file "\\.l?agda\\'" 'utf-8) ;;;###autoload-(define-derived-mode agda2-mode nil "Agda"- "Major mode for Agda files.+(eval `(define-derived-mode agda2-mode+ ,(if (fboundp 'prog-mode) 'prog-mode)+ "Agda"+ "Major mode for Agda files. -The following paragraph does not apply to Emacs 23.+The following paragraph does not apply to Emacs 23 or newer. Note that when this mode is activated the default font of the current frame is changed to the fontset `agda2-fontset-name'.@@ -343,6 +391,19 @@ Special commands: \\{agda2-mode-map}"++ ;; Check that the right version of Agda is used.+ (let* ((coding-system-for-read 'utf-8)+ (output (with-output-to-string+ (call-process agda2-program-name+ nil standard-output nil "--version")))+ (version (and (string-match "^Agda version \\([0-9.]+\\)$" output)+ (match-string 1 output))))+ (unless (equal version agda2-version)+ (error "The Agda mode's version (%s) does not match that of %s (%s)."+ agda2-version+ agda2-program-name (or version "unknown"))))+ (setq local-abbrev-table agda2-mode-abbrev-table indent-tabs-mode nil mode-line-process@@ -355,141 +416,265 @@ (condition-case nil (set-frame-font agda2-fontset-name) (error (error "Unable to change the font; change agda2-fontset-name or tweak agda2-fontset-spec-of-fontset-agda2"))))- ;; If GHCi is not running syntax highlighting does not work properly.+ ;; Deactivate highlighting if the buffer is edited before+ ;; typechecking is complete.+ (add-hook 'first-change-hook 'agda2-abort-highlighting nil 'local)+ ;; If Agda is not running syntax highlighting does not work properly. (unless (eq 'run (agda2-process-status)) (agda2-restart)) (agda2-highlight-setup)- (agda2-highlight-reload)+ (condition-case err+ (agda2-highlight-reload)+ (error (message "Highlighting not loaded: %s"+ (error-message-string err)))) (agda2-comments-and-paragraphs-setup) (force-mode-line-update) ;; Protect global value of default-input-method from set-input-method. (make-local-variable 'default-input-method) (set-input-method "Agda")- ;; Highlighting is removed when we switch from the Agda mode. Use- ;; case: When a file M.lagda with a local variables list including- ;; "mode: latex" is loaded chances are that the Agda mode is- ;; activated before the LaTeX mode, and the LaTeX mode does not seem- ;; to remove the text properties set by the Agda mode.- (add-hook (make-local-variable 'change-major-mode-hook)- 'agda2-remove-annotations))+ ;; Highlighting etc. is removed when we switch from the Agda mode.+ ;; Use case: When a file M.lagda with a local variables list+ ;; including "mode: latex" is loaded chances are that the Agda mode+ ;; is activated before the LaTeX mode, and the LaTeX mode does not+ ;; seem to remove the text properties set by the Agda mode.+ (add-hook 'change-major-mode-hook 'agda2-quit nil 'local))) (defun agda2-restart ()- "Kill and restart the *ghci* buffer and load `agda2-toplevel-module'."+ "Kill and restart the *agda2* buffer and load `agda2-toplevel-module'." (interactive)- (save-excursion (let ((agda2-bufname "*ghci*")- (ignore-dot-ghci "-ignore-dot-ghci"))- (agda2-protect- (progn- ;; GHCi doesn't always die when its buffer is- ;; killed, so GHCi is killed before the buffer- ;; is.- (set-buffer agda2-bufname)- (agda2-protect (comint-kill-subjob))- (kill-buffer agda2-bufname)))- ;; Make sure that the user's .ghci is not read.- ;; Users can override this by adding- ;; "-read-dot-ghci" to- ;; `haskell-ghci-program-args'.- (unless (equal (car-safe haskell-ghci-program-args)- ignore-dot-ghci)- (set (make-local-variable 'haskell-ghci-program-args)- (cons ignore-dot-ghci haskell-ghci-program-args)))- (haskell-ghci-start-process nil)- (setq agda2-process haskell-ghci-process- agda2-buffer haskell-ghci-process-buffer- mode-name "Agda GHCi")- (set (make-local-variable 'comint-input-sender)- 'agda2-send)- (set-buffer-file-coding-system 'utf-8)- (set-buffer-process-coding-system 'utf-8 'utf-8)- (rename-buffer agda2-bufname)- (set-process-query-on-exit-flag agda2-process nil)))- (apply 'agda2-call-ghci ":set" agda2-ghci-options)- (agda2-call-ghci ":mod +" agda2-toplevel-module)+ (save-excursion (let ((agda2-bufname "*agda2*"))+ (condition-case nil+ (agda2-term)+ (error nil))++ ;; Start the Agda2 process in a new buffer.+ (message "Starting agda process `%s'." agda2-program-name)+ (let ((process-connection-type nil)) ; pipes are faster than PTYs+ (apply 'start-process "Agda2" agda2-bufname+ agda2-program-name+ (cons "--interaction" agda2-program-args)))++ ;; Select agda buffer temporarily.+ (with-current-buffer agda2-bufname+ (setq process-adaptive-read-buffering t)++ ;; Clear message area.+ (message "")++ (setq agda2-process (get-buffer-process agda2-bufname)+ agda2-process-buffer (process-buffer agda2-process)+ agda2-in-progress nil+ mode-name "Agda executable"+ agda2-last-responses nil)+ (set-buffer-file-coding-system 'utf-8)+ (set-buffer-process-coding-system 'utf-8 'utf-8)+ (set-process-query-on-exit-flag agda2-process nil))))+ (setq agda2-file-buffer (current-buffer))+ (set-process-filter agda2-process 'agda2-output-filter) (agda2-remove-annotations)) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;; Communicating with Agda -(defun agda2-raise-ghci-error ()+(defun agda2-raise-error () "Raises an error.-The error message directs the user to the *ghci* buffer."- (error "Problem encountered. The *ghci* buffer can perhaps explain why."))+The error message directs the user to the *agda2* buffer."+ (error "Problem encountered. The *agda2* buffer can perhaps explain why.")) -(defun agda2-send (proc s)- "Sends the string S to PROC.-Splits up S into small chunks and sends them one after the other,-because when GHCi is used in shell buffers it chokes on overly-long strings (some versions of GHCi, on some systems)."- (let* ((chunk-size 200))- (dolist (chunk (agda2-chunkify chunk-size s))- (comint-send-string proc chunk)))- (comint-send-string proc "\n"))+(defun agda2-running-p nil+ "Does the *agda2* buffer exist, and is the Agda2 process running?"+ (and (buffer-live-p agda2-process-buffer)+ (eq (agda2-process-status) 'run))) -(defun agda2-call-ghci (&rest args)- "Executes commands in GHCi.-Sends the list of strings ARGS to GHCi, waits for output and-returns the responses."- (unless (eq 'run (agda2-process-status))+(defun agda2-send-command (restart &rest args)+ "Send a command to the Agda2 asyncronous process. Saves the buffer+and sends the list of strings ARGS to Agda2. If RESTART is non-nil+and the Agda2 process is not running, or the *agda2* buffer does not+exist, then an attempt is made to restart the process."+ (save-buffer)+ (when (and restart (not (agda2-running-p))) ;; Try restarting automatically, but only once, in case there is ;; some major problem. (agda2-restart)- (unless (eq 'run (agda2-process-status))- (agda2-raise-ghci-error)))- (save-excursion- ;; By setting local-enable-local-variables to nil the call to- ;; hack-local-variables in haskell-ghci-go becomes more or less a- ;; no-op. (Note that hack-local-variables can interfere with the- ;; setup of a mode, because it can potentially perform the setup- ;; of another mode...)- (let ((local-enable-local-variables nil))- (haskell-ghci-go (apply 'concat (agda2-intersperse " " args))- nil)))- (let (response)- (with-current-buffer haskell-ghci-process-buffer- (haskell-ghci-wait-for-output)- (let ((tempfile (make-temp-file "agda2-mode")))- (unwind-protect- (let ((coding-system-for-read 'utf-8)- (coding-system-for-write 'utf-8))- (comint-write-output tempfile)- (with-temp-buffer- (insert-file-contents tempfile)- (setq response (buffer-substring-no-properties- (point-min) (point-max)))))- (delete-file tempfile))))- response))+ (unless (agda2-running-p)+ (agda2-raise-error)))+ (let ((command (apply 'concat (agda2-intersperse " " args))))+ (with-current-buffer agda2-process-buffer+ (goto-char (point-max))+ (insert command)+ (insert "\n")+ (process-send-string agda2-process (concat command "\n"))))) +(defun agda2-abort-if-in-progress ()+ "Raise an error if the Agda process is (thought to be) busy."+ (when agda2-in-progress+ (error "Another command is currently in progress+\(if a command has been aborted you may want to restart Agda)")))+ (defun agda2-go (responses-expected highlight &rest args)- "Executes commands in GHCi.-Sends the list of strings ARGS to GHCi, waits for output and-executes the responses, if any. If no responses are received, and-RESPONSES-EXPECTED is non-nil, then an error is raised; otherwise-the syntax highlighting information is reloaded (unless HIGHLIGHT-is nil; if HIGHLIGHT is a string, then highlighting info is read-from the corresponding file)."- (let* ((highlighting-temp (and highlight (not (stringp highlight))))- (highlighting (cond ((stringp highlight) highlight)- (highlighting-temp (make-temp-file "agda2-mode")))))- (unwind-protect- (let ((responses- (agda2-read-responses- (apply 'agda2-call-ghci- "ioTCM"- (agda2-string-quote (buffer-file-name))- (if highlighting-temp- (concat "(Just "- (agda2-string-quote highlighting)- ")")- "Nothing")- "("- (append args '(")"))))))- (when (and responses-expected (null responses))- (agda2-raise-ghci-error))- (if highlight (agda2-highlight-load highlighting))- (agda2-exec-responses responses))- (if highlighting-temp (delete-file highlighting)))))+ "Executes commands in the Agda2 interpreter.+Sends the list of strings ARGS to the Agda2 interpreter, waits for+output and executes the responses, if any. If no responses are+received, and RESPONSES-EXPECTED is non-nil, then an error is+raised. If HIGHLIGHT is non-nil, then the buffer's syntax+highlighting may be updated." + (agda2-abort-if-in-progress)++ (setq agda2-in-progress t+ agda2-highlight-in-progress highlight+ agda2-responses-expected responses-expected+ agda2-responses 0+ agda2-output-chunk-incomplete (agda2-queue-empty)+ agda2-file-buffer (current-buffer))++ (apply 'agda2-send-command+ 'restart+ "IOTCM"+ (agda2-string-quote (buffer-file-name))+ (if highlight (agda2-highlight-level) "None")+ "Indirect"+ "("+ (append args '(")"))))+++(defun agda2-output-filter (proc chunk)+ "Evaluate the Agda process's commands.+This filter function assumes that every line contains either some+kind of error message (which cannot be parsed as a list), or+exactly one command. Incomplete lines are stored in a+buffer (`agda2-output-chunk-incomplete').++Every command is run by this function, unless it has the form+\"(('last . priority) . cmd)\", in which case it is run by+`agda2-run-last-commands' at the end, after the Agda2 prompt+has reappeared, after all non-last commands, and after all+interactive highlighting is complete. The last commands can have+different integer priorities; those with the lowest priority are+executed first.++Non-last commands should not call the Agda process.++All commands are echoed to the *agda2* buffer, with the exception+of commands of the form \"(agda2-highlight-... ...)\".++The non-last commands are run in the order in which they appear.++When the prompt has been reached an error is raised if+`agda2-responses-expected' is non-nil and no commands have+arrived. Otherwise highlighting annotations are+reloaded from `agda2-highlighting-file', unless+`agda2-highlighting-in-progress' is nil."+++ (let (;; The input lines in the current chunk.+ (lines (split-string chunk "\n"))++ ;; Non-last commands found in the current chunk (reversed).+ (non-last-commands ())++ ;; Last incomplete line, if any.+ (output-chunk-incomplete ""))+ (with-current-buffer agda2-file-buffer+ (when (consp lines)+ (agda2-queue-enqueue agda2-output-chunk-incomplete (pop lines))+ (when (consp lines)+ ;; The previous uncomplete chunk is now complete.+ (push (agda2-queue-to-string agda2-output-chunk-incomplete)+ lines)++ ;; Stash away the last incomplete line, if any. (Note that+ ;; (split-string "...\n" "\n") evaluates to (... "").)+ (setq output-chunk-incomplete (car (last lines))+ agda2-output-chunk-incomplete+ (agda2-queue-from-string output-chunk-incomplete))++ ;; Handle every complete line.+ (dolist (line (butlast lines))+ (let* (;; The command. Lines which cannot be parsed as a single+ ;; list, without any junk, are ignored.+ (cmd (condition-case nil+ (let ((result (read-from-string line)))+ (if (and (listp (car result))+ (= (cdr result) (length line)))+ (car result)))+ (error nil))))++ (when cmd+ (unless (and (symbolp (car cmd))+ (let ((case-fold-search nil))+ (string-match "^agda2-highlight-"+ (symbol-name (car cmd)))))+ ;; Do not echo highlighting commands.+ (with-current-buffer agda2-process-buffer+ (insert line)+ (insert "\n"))+ (incf agda2-responses))+ (if (equal 'last (car-safe (car cmd)))+ (push (cons (cdr (car cmd)) (cdr cmd))+ agda2-last-responses)+ (push cmd non-last-commands)))))++ ;; Run non-last commands.+ (mapc 'agda2-exec-response (nreverse non-last-commands)))++ ;; Check if the prompt has been reached. This function assumes+ ;; that the prompt does not include any newline characters.+ (when (agda2-queue-is-prefix-of agda2-output-prompt+ agda2-output-chunk-incomplete)+ (with-current-buffer agda2-process-buffer+ (insert output-chunk-incomplete))+ (setq agda2-output-chunk-incomplete (agda2-queue-empty)+ agda2-in-progress nil+ agda2-last-responses (nreverse agda2-last-responses))++ (when (and agda2-responses-expected+ (equal agda2-responses 0))+ (agda2-raise-error))++ (agda2-run-last-commands)++ (when agda2-measure-data+ (let ((elapsed+ (format "%.2fs"+ (float-time (time-since+ (cdr agda2-measure-data)))))+ (continuation (car agda2-measure-data)))+ (setq agda2-measure-data nil)+ (message "Load time: %s." elapsed)+ (when continuation+ (funcall continuation elapsed)))))))))++(defun agda2-run-last-commands nil+ "Execute the last commands in the right order.+\(After the prompt has reappeared.) See `agda2-output-filter'."++ ;; with-current-buffer is used repeatedly below, because some last+ ;; commands may switch the focus to another buffer.++ (while (with-current-buffer agda2-file-buffer+ (and (not agda2-in-progress) (consp agda2-last-responses)))+ (with-current-buffer agda2-file-buffer+ ;; The list is sorted repeatedly because this function may be+ ;; called recursively (via `agda2-exec-response').+ (setq agda2-last-responses (sort agda2-last-responses+ (lambda (x y) (<= (car x) (car y)))))+ (let ((r (pop agda2-last-responses)))+ (agda2-exec-response (cdr r)))))++ ;; Unset agda2-highlight-in-progress when all the asynchronous+ ;; commands have terminated.+ (unless agda2-in-progress+ (setq agda2-highlight-in-progress nil)))++(defun agda2-abort-highlighting nil+ "Abort any interactive highlighting.+This function should be used in `first-change-hook'."+ (when agda2-highlight-in-progress+ (setq agda2-highlight-in-progress nil)+ (message "\"%s\" has been modified. Interrupting highlighting."+ (buffer-name (current-buffer)))))+ (defun agda2-goal-cmd (cmd &optional want ask &rest args) "Reads input from goal or minibuffer and sends command to Agda. @@ -529,33 +714,16 @@ (if input-from-goal (agda2-goal-Range o) "noRange") (agda2-string-quote txt) args)))) -(defun agda2-read-responses (response)- "Returns a list containing the responses in the response string.-Responses of the form (last . actual-response) are placed last in-the returned list, with last stripped."- (let ((responses)- (former)- (latter))- (while (string-match "agda2_mode_code" response)- (setq response (substring response (match-end 0)))- (push (read response) responses))- (dolist (r responses (append former latter))- (if (and (consp r) (equal (car r) 'last))- (push (cdr r) latter)- (push r former)))))- ;; Note that the following function is a security risk, since it ;; evaluates code without first inspecting it. The code (supposedly) ;; comes from the Agda backend, but there could be bugs in the backend ;; which can be exploited by an attacker which manages to trick ;; someone into type-checking compromised Agda code. -(defun agda2-exec-responses (responses)- "Interprets responses."- (mapc (lambda (r)- (let ((inhibit-read-only t))- (eval r)))- responses))+(defun agda2-exec-response (response)+ "Interprets response."+ (let ((inhibit-read-only t))+ (eval response))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;; User commands and response processing@@ -563,17 +731,39 @@ (defun agda2-load () "Load current buffer." (interactive)- (agda2-go t t "cmd_load"+ (agda2-go t t "Cmd_load" (agda2-string-quote (buffer-file-name)) (agda2-list-quote agda2-include-dirs) )) +(defun agda2-measure-load-time+ (&optional highlighting-level dont-touch continuation)+ "Load the current buffer and print how much time it takes.+\(Wall-clock time.)++The given HIGHLIGHTING-LEVEL is used (if non-nil).++The file is first saved and \"touched\", unless DONT-TOUCH is+non-nil.++If CONTINUATION is non-nil, then CONTINUATION is applied to the+resulting time (represented as a string)."+ (interactive)+ (agda2-abort-if-in-progress)+ (unless dont-touch+ (save-buffer)+ (shell-command (concat "touch \"" (buffer-file-name) "\"")))+ (let* ((agda2-highlight-level+ (or highlighting-level agda2-highlight-level)))+ (setq agda2-measure-data (cons continuation (current-time)))+ (agda2-load)))+ (defun agda2-compile () "Compile the current module. The variable `agda2-backend' determines which backend is used." (interactive)- (agda2-go t t "cmd_compile"+ (agda2-go t t "Cmd_compile" agda2-backend (agda2-string-quote (buffer-file-name)) (agda2-list-quote agda2-include-dirs)@@ -581,34 +771,40 @@ (defun agda2-give() "Give to the goal at point the expression in it" (interactive)- (agda2-goal-cmd "cmd_give" "expression to give"))+ (agda2-goal-cmd "Cmd_give" "expression to give")) (defun agda2-give-action (old-g paren) "Update the goal OLD-G with the expression in it." (agda2-update old-g paren)) -(defun agda2-refine ()+(defun agda2-refine (pmlambda) "Refine the goal at point. If the goal contains an expression e, and some \"suffix\" of the type of e unifies with the goal type, then the goal is replaced by e applied to a suitable number of new goals. +PMLAMBDA is only used if the goal has a functional type.+When the prefix argument is given a pattern maching lambda will+be inserted, otherwise a standard lambda will be used.+ If the goal is empty, the goal type is a data type, and there is exactly one constructor which unifies with this type, then the goal is replaced by the constructor applied to a suitable number of new goals."- (interactive)- (agda2-goal-cmd "cmd_refine_or_intro" 'goal))+ (interactive "P")+ (if pmlambda+ (agda2-goal-cmd "Cmd_refine_or_intro True" 'goal)+ (agda2-goal-cmd "Cmd_refine_or_intro False" 'goal))) (defun agda2-auto () "Simple proof search" (interactive)- (agda2-goal-cmd "cmd_auto" 'goal))+ (agda2-goal-cmd "Cmd_auto" 'goal)) (defun agda2-make-case ()- "Refine the pattern var given in the goal.-Assumes that <clause> = {!<var>!} is on one line."+ "Refine the pattern variables given in the goal.+Assumes that <clause> = {!<variables>!} is on one line." (interactive)- (agda2-goal-cmd "cmd_make_case" "pattern var to case"))+ (agda2-goal-cmd "Cmd_make_case" "pattern variables to case")) (defun agda2-make-case-action (newcls) "Replace the line at point with new clauses NEWCLS and reload."@@ -630,17 +826,22 @@ (defun agda2-make-case-action-extendlam (newcls) "Replace definition of extended lambda with new clauses NEWCLS and reload." (agda2-forget-all-goals);; we reload later anyway.- (let* ((p (+ (re-search-backward "\\({[^!]\\)\\|;") 1))- cl)- (goto-char p)- (delete-region p (- (re-search-forward "\\([^!]}\\)\\|;") 1))- (goto-char p)- (insert " ")- (goto-char (+ p 1))- (while (setq cl (pop newcls))- (insert cl)- (if newcls (insert " ; ")))- (goto-char p))+ (let* ((pmax (- (re-search-forward "\\([^!]}\\)\\|;") 1))+ (bracketCount 0)+ cl)+ (re-search-backward "{!")+ (while (and (not (equal (preceding-char) ?;)) (>= bracketCount 0))+ (backward-char)+ (if (equal (preceding-char) ?}) (incf bracketCount))+ (if (equal (preceding-char) ?{) (decf bracketCount)))+ (let ((p (point)))+ (delete-region (point) pmax)+ (insert " ")+ (while (setq cl (pop newcls))+ (insert cl)+ (if newcls (insert " ; ")))+ (insert " ")+ (goto-char p))) (agda2-load)) (defun agda2-status-action (status)@@ -649,49 +850,70 @@ major mode)." (setq agda2-buffer-external-status status)) -(defun agda2-info-action (name text)- "Insert TEXT into the Agda info buffer, display it, and display NAME-in the buffer's mode line."- (interactive)- (with-current-buffer (get-buffer-create "*Agda information*")- (erase-buffer)- (insert text)- (set-syntax-table agda2-mode-syntax-table)- (set-input-method "Agda")+(defun agda2-info-buffer nil+ "Creates the Agda info buffer, if it does not already exist.+The buffer is returned."+ (unless (buffer-live-p agda2-info-buffer)+ (setq agda2-info-buffer+ (generate-new-buffer "*Agda information*")) - ;; Support for jumping to positions mentioned in the text.- (set (make-local-variable 'compilation-error-regexp-alist)- '(("\\([\\\\/][^[:space:]]*\\):\\([0-9]+\\),\\([0-9]+\\)-\\(\\([0-9]+\\),\\)?\\([0-9]+\\)"- 1 (2 . 5) (3 . 6))))- ;; No support for recompilation. An attempt to recompile via the- ;; info buffer (using "g") will (most likely) lead to a (dynamic)- ;; type error. (The default is to run "make -k".)- (set (make-local-variable 'compile-command)- 'agda2-does-not-support-compilation-via-the-compilation-minor-mode)- (compilation-minor-mode 1)+ (with-current-buffer agda2-info-buffer+ (compilation-mode "AgdaInfo")+ ;; Support for jumping to positions mentioned in the text.+ (set (make-local-variable 'compilation-error-regexp-alist)+ '(("\\([\\\\/][^[:space:]]*\\):\\([0-9]+\\),\\([0-9]+\\)-\\(\\([0-9]+\\),\\)?\\([0-9]+\\)"+ 1 (2 . 5) (3 . 6))))+ ;; No support for recompilation. The key binding is removed, and+ ;; attempts to run `recompile' will (hopefully) result in an+ ;; error.+ (let ((map (copy-keymap (current-local-map))))+ (define-key map (kbd "g") 'undefined)+ (use-local-map map))+ (set (make-local-variable 'compile-command)+ 'agda2-does-not-support-compilation-via-the-compilation-mode) - ;; The info buffer is read-only. Compilation minor mode introduces- ;; the keybindings "g" (recompile) and "q" (bury the buffer), and- ;; these keybindings can make it rather awkward to edit the info- ;; buffer. To avoid surprises we make the buffer read-only.- (setq buffer-read-only t)+ (set-syntax-table agda2-mode-syntax-table)+ (set-input-method "Agda"))) - (goto-char (point-min))+ agda2-info-buffer)++(defun agda2-info-action (name text &optional append)+ "Insert TEXT into the Agda info buffer and display it.+NAME is displayed in the buffer's mode line.++If APPEND is non-nil, then TEXT is appended at the end of the+buffer, and point placed after this text.++If APPEND is nil, then any previous text is removed before TEXT+is inserted, and point is placed before this text."+ (interactive)+ (with-current-buffer (agda2-info-buffer)+ (unless append (erase-buffer))+ (save-excursion+ (goto-char (point-max))+ (insert text)) (put-text-property 0 (length name) 'face '(:weight bold) name) (setq mode-line-buffer-identification name) (save-selected-window- (pop-to-buffer (current-buffer) 'not-this-window 'norecord)- (fit-window-to-buffer- nil (truncate- (* (frame-height) agda2-information-window-max-height))))))+ (let (;; If there is only one window, then the info window+ ;; should be created above or below the code window, not+ ;; to the left or right.+ (split-width-threshold nil))+ (pop-to-buffer (current-buffer) nil 'norecord)+ (fit-window-to-buffer+ nil (truncate+ (* (frame-height) agda2-information-window-max-height)))+ (if append+ (goto-char (point-max))+ (goto-char (point-min))))))) (defun agda2-show-goals() "Show all goals." (interactive)- (agda2-go t t "cmd_metas"))+ (agda2-go t t "Cmd_metas")) (defun agda2-show-constraints() "Show constraints." (interactive)- (agda2-go t t "cmd_constraints"))+ (agda2-go t t "Cmd_constraints")) (defun agda2-remove-annotations () "Removes buffer annotations (overlays and text properties)."@@ -717,9 +939,19 @@ (defun agda2-quit () "Quit and clean up after agda2." (interactive)- (agda2-protect (progn (kill-buffer agda2-buffer)- (kill-buffer (current-buffer)))))+ (remove-hook 'first-change-hook 'agda2-abort-highlighting 'local)+ (agda2-remove-annotations)+ (agda2-term)) +(defun agda2-term ()+ "Send a SIGTERM signal to the Agda2 process, then kill its buffer."+ (interactive)+ (with-current-buffer agda2-process-buffer+ (condition-case nil+ (signal-process agda2-process 'SIGTERM)+ (error nil))+ (kill-buffer)))+ (defmacro agda2-maybe-normalised (name comment cmd want) "This macro constructs a function NAME which runs CMD. COMMENT is used to build the function's comment. The function@@ -734,7 +966,7 @@ With a prefix argument the result is not explicitly normalised.") (interactive "P") (let ((,eval (if not-normalise "Instantiated" "Normalised")))- (agda2-goal-cmd (concat ,cmd " Agda.Interaction.BasicOps." ,eval)+ (agda2-goal-cmd (concat ,cmd " " ,eval) ,want))))) (defmacro agda2-maybe-normalised-toplevel (name comment cmd prompt)@@ -752,19 +984,19 @@ (interactive ,(concat "P\nM" prompt ": ")) (let ((,eval (if not-normalise "Instantiated" "Normalised"))) (agda2-go t nil- (concat ,cmd " Agda.Interaction.BasicOps." ,eval " "+ (concat ,cmd " " ,eval " " (agda2-string-quote expr))))))) (agda2-maybe-normalised agda2-goal-type "Show the type of the goal at point"- "cmd_goal_type"+ "Cmd_goal_type" nil) (agda2-maybe-normalised agda2-infer-type "Infer the type of the goal at point"- "cmd_infer"+ "Cmd_infer" "expression to type") (agda2-maybe-normalised-toplevel@@ -772,7 +1004,7 @@ "Infers the type of the given expression. The scope used for the expression is that of the last point inside the current top-level module"- "cmd_infer_toplevel"+ "Cmd_infer_toplevel" "Expression") (defun agda2-infer-type-maybe-toplevel ()@@ -787,33 +1019,33 @@ (agda2-maybe-normalised agda2-goal-and-context "Shows the type of the goal at point and the currect context"- "cmd_goal_type_context"+ "Cmd_goal_type_context" nil) (agda2-maybe-normalised agda2-goal-and-context-and-inferred "Shows the context, the goal and the given expression's inferred type"- "cmd_goal_type_context_infer"+ "Cmd_goal_type_context_infer" "expression to type") (agda2-maybe-normalised agda2-show-context "Show the context of the goal at point"- "cmd_context"+ "Cmd_context" nil) (defun agda2-module-contents () "Shows all the top-level names in the given module. Along with their types." (interactive)- (agda2-goal-cmd "cmd_show_module_contents" "Module name"))+ (agda2-goal-cmd "Cmd_show_module_contents" "Module name")) (defun agda2-module-contents-toplevel (module) "Shows all the top-level names in the given module. Along with their types." (interactive "MModule name: ") (agda2-go t nil- "cmd_show_module_contents_toplevel"+ "Cmd_show_module_contents_toplevel" (agda2-string-quote module))) (defun agda2-module-contents-maybe-toplevel ()@@ -830,21 +1062,27 @@ (defun agda2-solveAll () "Solves all goals that are already instantiated internally." (interactive)- (agda2-go t t "cmd_solveAll"))+ (agda2-go t t "Cmd_solveAll")) (defun agda2-solveAll-action (iss)+ (while iss+ (let* ((g (pop iss)) (txt (pop iss))+ (cmd (cons 'agda2-solve-action (cons g (cons txt nil)))))+ (if (null agda2-last-responses)+ (push (cons 1 cmd) agda2-last-responses)+ (nconc agda2-last-responses (cons (cons 3 cmd) nil))))))++(defun agda2-solve-action (g txt) (save-excursion- (while iss- (let* ((g (pop iss)) (txt (pop iss)))- (agda2-replace-goal g txt)- (agda2-goto-goal g)- (agda2-give)))))+ (agda2-replace-goal g txt)+ (agda2-goto-goal g)+ (agda2-give))) (defun agda2-compute-normalised (&optional arg) "Compute the normal form of the expression in the goal at point. With a prefix argument \"abstract\" is ignored during the computation." (interactive "P")- (let ((cmd (concat "cmd_compute"+ (let ((cmd (concat "Cmd_compute" (if arg " True" " False")))) (agda2-goal-cmd cmd "expression to normalise"))) @@ -854,7 +1092,7 @@ top-level module. With a prefix argument \"abstract\" is ignored during the computation." (interactive "MExpression: \nP")- (let ((cmd (concat "cmd_compute_toplevel"+ (let ((cmd (concat "Cmd_compute_toplevel" (if arg " True" " False") " "))) (agda2-go t nil (concat cmd (agda2-string-quote expr)))))@@ -875,14 +1113,9 @@ (defun agda2-highlight-reload nil "Loads precomputed syntax highlighting info for the current buffer. If there is any to load."- (let ((highlighting (make-temp-file "agda2-mode")))- (unwind-protect- (progn- (agda2-go nil highlighting- "cmd_write_highlighting_info"- (agda2-string-quote (buffer-file-name))- (agda2-string-quote highlighting)))- (delete-file highlighting))))+ (agda2-go nil t+ "Cmd_load_highlighting_info"+ (agda2-string-quote (buffer-file-name)))) (defun agda2-literate-p () "Is the current buffer a literate Agda buffer?"@@ -899,26 +1132,34 @@ (agda2-let ((literate (agda2-literate-p)) stk- top)+ top+ ;; Don't run modification hooks: we don't want this function to+ ;; trigger agda2-abort-highlighting.+ (inhibit-modification-hooks t)) ((delims() (re-search-forward "[?]\\|[{][-!]\\|[-!][}]\\|--\\|\\\\begin{code}\\|\\\\end{code}" nil t)) (is-lone-questionmark () (save-excursion (save-match-data (backward-char 3) (looking-at- "\\(.[{(]\\|.\\s \\)[?]\\(\\s \\|[)};]\\|$\\)"))))+ "\\(.[{(]\\|\\(.\\|\n\\)\\s \\)[?]\\(\\s \\|[)};]\\|$\\)")))) (make(p) (agda2-make-goal p (point) (pop goals))) (inside-comment() (and stk (null (car stk)))) (inside-goal() (and stk (integerp (car stk)))) (outside-code() (and stk (eq (car stk) 'outside)))- (inside-code() (not (outside-code))))+ (inside-code() (not (outside-code)))+ ;; inside a multi-line comment ignore everything but the multi-line comment markers+ (safe-delims()+ (if (inside-comment)+ (re-search-forward "{-\\|-}" nil t)+ (delims)))) (save-excursion ;; In literate mode we should start out in the "outside of code" ;; state. (if literate (push 'outside stk)) (goto-char (point-min))- (while (and goals (delims))- (labels ((c (s) (equal s (match-string 0))))+ (while (and goals (safe-delims))+ (cl-labels ((c (s) (equal s (match-string 0)))) (cond ((c "\\begin{code}") (when (outside-code) (pop stk))) ((c "\\end{code}") (when (not stk) (push 'outside stk)))@@ -940,7 +1181,7 @@ (defun agda2-make-goal (p q n) "Make a goal with number N at <P>{!...!}<Q>. Assume the region is clean." (annotation-preserve-mod-p-and-undo- (flet ((atp (x ps) (add-text-properties x (1+ x) ps)))+ (cl-flet ((atp (x ps) (add-text-properties x (1+ x) ps))) (atp p '(category agda2-delim1)) (atp (1+ p) '(category agda2-delim2)) (atp (- q 2) '(category agda2-delim3))@@ -997,8 +1238,10 @@ ;;;; Misc (defun agda2-process-status ()- "Status of `agda2-buffer', or \"no process\"."- (agda2-protect (process-status agda2-process) "no process"))+ "Status of `agda2-process-buffer', or \"no process\"."+ (condition-case nil+ (process-status agda2-process)+ (error "no process"))) (defun agda2-intersperse (sep xs) (let(ys)(while xs (push (pop xs) ys)(push sep ys))(pop ys)(nreverse ys)))@@ -1117,6 +1360,18 @@ (interactive) (goto-char (agda2-decl-beginning))) +(defvar agda2-debug-buffer-name "*Agda debug*"+ "The name of the buffer used for Agda debug messages.")++(defun agda2-verbose (msg)+ "Appends the string MSG to the `agda2-debug-buffer-name' buffer.+Note that this buffer's contents is not erased automatically when+a file is loaded."+ (with-current-buffer (get-buffer-create agda2-debug-buffer-name)+ (save-excursion+ (goto-char (point-max))+ (insert msg))))+ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Comments and paragraphs @@ -1129,6 +1384,10 @@ ;; the syntax table). (set (make-local-variable 'font-lock-defaults) '(nil nil nil nil nil))+ ;; If the following s-expression is removed, then highlighting of+ ;; comments stops working.+ (when font-lock-mode+ (font-lock-mode t)) ;; Empty lines (all white space according to Emacs) delimit ;; paragraphs.@@ -1149,9 +1408,27 @@ (add-to-list (make-local-variable 'filladapt-token-conversion-table) '(agda2-comment . exact)))) +(defun agda2-comment-dwim-rest-of-buffer ()+ "Comment or uncomment the rest of the buffer.+From the beginning of the current line to the end of the buffer."+ (interactive)+ (save-excursion+ (forward-line 0)+ (push-mark (point) 'no-message 'activate-mark)+ (unwind-protect+ (progn+ (goto-char (point-max))+ (comment-dwim nil))+ (pop-mark))))+ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Go to definition site +(defun agda2-goto (filepos &optional other-window)+ "Like `annotation-goto', unless `agda2-highlight-in-progress' is nil."+ (if agda2-highlight-in-progress+ (annotation-goto filepos other-window)))+ (defun agda2-goto-definition-keyboard (&optional other-window) "Go to the definition site of the name under point (if any). If this function is invoked with a prefix argument then another window is used@@ -1159,16 +1436,16 @@ (interactive "P") (annotation-goto-indirect (point) other-window)) -(defun agda2-goto-definition-mouse (ev prefix)+(defun agda2-goto-definition-mouse (ev) "Go to the definition site of the name clicked on, if any.-Otherwise, yank (see `mouse-yank-at-click')."- (interactive "e\nP")+Otherwise, yank (see `mouse-yank-primary')."+ (interactive "e") (let ((pos (posn-point (event-end ev)))) (if (annotation-goto-possible pos) (annotation-goto-indirect pos) ;; FIXME: Shouldn't we use something like ;; (call-interactively (key-binding ev))? --Stef- (mouse-yank-at-click ev prefix))))+ (mouse-yank-primary ev)))) (defun agda2-go-back nil "Go back to the previous position in which@@ -1185,10 +1462,10 @@ With prefix argument, turn on display of implicit arguments if the argument is a positive number, otherwise turn it off." (interactive "P")- (cond ((eq arg nil) (agda2-go t t "toggleImplicitArgs"))+ (cond ((eq arg nil) (agda2-go t t "ToggleImplicitArgs")) ((and (numberp arg)- (> arg 0)) (agda2-go t t "showImplicitArgs" "True"))- (t (agda2-go t t "showImplicitArgs" "False"))))+ (> arg 0)) (agda2-go t t "ShowImplicitArgs" "True"))+ (t (agda2-go t t "ShowImplicitArgs" "False")))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;
+ src/data/emacs-mode/agda2-queue.el view
@@ -0,0 +1,43 @@+;;; agda2-queue.el --- Simple FIFO character queues.++(defun agda2-queue-empty ()+ "Creates a new empty FIFO character queue.+Queues are represented as pairs. The car contains the queue. If+the queue is empty, then the cdr contains the symbol nil, and+otherwise it points to the queue's last cons-cell."+ (cons nil nil))++(defun agda2-queue-is-prefix-of (prefix queue)+ "Returns a non-nil result iff the string PREFIX is a prefix of QUEUE.+Linear in the length of PREFIX."+ (let ((queue (car queue))+ (prefix (append prefix nil)))+ (while (and (consp queue) (consp prefix)+ (equal (car queue) (car prefix)))+ (pop queue)+ (pop prefix))+ (null prefix)))++(defun agda2-queue-enqueue (queue string)+ "Adds the characters in STRING to the end of QUEUE.+This function updates QUEUE destructively, and is linear in the+length of STRING."+ (let ((chars (append string nil)))+ (when (consp chars)+ (if (null (cdr queue))+ (setcar queue chars)+ (setcdr (cdr queue) chars))+ (setcdr queue (last chars))))+ queue)++(defun agda2-queue-from-string (string)+ "Creates a new FIFO containing the characters in STRING.+Linear in the length of STRING."+ (agda2-queue-enqueue (agda2-queue-empty) string))++(defun agda2-queue-to-string (queue)+ "Constructs a string containing all the characters in QUEUE.+Linear in the length of QUEUE."+ (concat "" (car queue)))++(provide 'agda2-queue)
src/data/emacs-mode/annotation.el view
@@ -57,10 +57,19 @@ (defun annotation-annotate (start end anns &optional info goto) "Annotate text between START and END in the current buffer.-ANNS are the annotations to apply. All the symbols in ANNS are-looked up in `annotation-bindings', and the font-lock-face text-property for the given character range is set to the resulting-list of faces. If the string INFO is non-nil, the mouse-face++Nothing happens if either START or END are out of bounds for the+current (possibly narrowed) buffer, or END <= START.++If ANNS is nil, then those text properties between START and END+that have been set by this function are deleted. Otherwise the+following happens.++All the symbols in ANNS are looked up in `annotation-bindings',+and the font-lock-face text property for the given character+range is set to the resulting list of faces.++If the string INFO is non-nil, the mouse-face property is set to highlight, and INFO is used as the help-echo string. If GOTO has the form (FILENAME . POSITION), then the mouse-face property is set to highlight, and the given@@ -75,93 +84,94 @@ annotation-annotations is set to a list with all the properties that have been set; this ensures that the text properties can later be removed (if the annotation-* properties are not tampered-with).--Note finally that nothing happens if either START or END are out of-bounds for the current (possibly narrowed) buffer, or END < START."+with)." (incf start annotations-offset) (incf end annotations-offset) (when (and (<= (point-min) start) (< start end) (<= end (point-max)))- (let ((faces (delq nil- (mapcar (lambda (ann)- (cdr (assoc ann annotation-bindings)))- anns)))- (props nil))- (when faces- (put-text-property start end 'font-lock-face faces)- (add-to-list 'props 'font-lock-face))- (when (consp goto)- (add-text-properties start end- `(annotation-goto ,goto- mouse-face highlight))- (add-to-list 'props 'annotation-goto)- (add-to-list 'props 'mouse-face))- (when info- (add-text-properties start end- `(mouse-face highlight help-echo ,info))- (add-to-list 'props 'mouse-face)- (add-to-list 'props 'help-echo))- (when props- (let ((pos start)- mid)- (while (< pos end)- (setq mid (next-single-property-change pos- 'annotation-annotations nil end))- (let* ((old-props (get-text-property pos 'annotation-annotations))- (all-props (union old-props props)))- (add-text-properties pos mid- `(annotation-annotated t annotation-annotations ,all-props))- (setq pos mid))))))))+ (if (null anns)+ (annotation-remove-annotations start end)+ (let ((faces (delq nil+ (mapcar (lambda (ann)+ (cdr (assoc ann annotation-bindings)))+ anns)))+ (props nil))+ (when faces+ (put-text-property start end 'font-lock-face faces)+ (add-to-list 'props 'font-lock-face))+ (when (consp goto)+ (add-text-properties start end+ `(annotation-goto ,goto+ mouse-face highlight))+ (add-to-list 'props 'annotation-goto)+ (add-to-list 'props 'mouse-face))+ (when info+ (add-text-properties start end+ `(mouse-face highlight help-echo ,info))+ (add-to-list 'props 'mouse-face)+ (add-to-list 'props 'help-echo))+ (when props+ (let ((pos start)+ mid)+ (while (< pos end)+ (setq mid (next-single-property-change pos+ 'annotation-annotations nil end))+ (let* ((old-props (get-text-property pos 'annotation-annotations))+ (all-props (union old-props props)))+ (add-text-properties pos mid+ `(annotation-annotated t annotation-annotations ,all-props))+ (setq pos mid))))))))) (defmacro annotation-preserve-mod-p-and-undo (&rest code)- "Run CODE preserving both the undo data and the modification bit."+ "Run CODE preserving both the undo data and the modification bit.+Modification hooks are also disabled." (let ((modp (make-symbol "modp"))) `(let ((,modp (buffer-modified-p)) ;; Don't check if the file is being modified by some other process. (buffer-file-name nil) ;; Don't record those changes on the undo-log.- (buffer-undo-list t))+ (buffer-undo-list t)+ ;; Don't run modification hooks.+ (inhibit-modification-hooks t)) (unwind-protect (progn ,@code) (restore-buffer-modified-p ,modp))))) -(defun annotation-remove-annotations ()- "Remove all text properties set by `annotation-annotate' in the current buffer.-This function preserves the file modification stamp of the current buffer-and does not modify the undo list.+(defun annotation-remove-annotations (&optional start end)+ "Remove all text properties set by `annotation-annotate'. -Note: This function may fail if there is read-only text in the buffer."+In the current buffer. If START and END are given, then+properties are only removed between these positions. +This function preserves the file modification stamp of the+current buffer, does not modify the undo list, and temporarily+disables all modification hooks.++Note: This function may fail if there is read-only text in the+buffer."+ ;; remove-text-properties fails for read-only text. (annotation-preserve-mod-p-and-undo- (let ((pos (point-min))+ (let ((pos (or start (point-min))) pos2) (while pos- (setq pos2 (next-single-property-change pos 'annotation-annotated))+ (setq pos2 (next-single-property-change pos 'annotation-annotated+ nil end)) (let ((props (get-text-property pos 'annotation-annotations))) (when props (remove-text-properties pos (or pos2 (point-max)) (mapcan (lambda (prop) (list prop nil)) (append '(annotation-annotated annotation-annotations) props)))))- (setq pos pos2)))))--(defun annotation-load-file (file removep &optional goto-help)- "Apply the annotations in FILE.-If FILE is empty, then this function does nothing; otherwise the-following comments apply.+ (setq pos (unless (equal pos2 end) pos2)))))) -If (`funcall' REMOVEP anns) is non-nil, then all existing text-properties set by `annotation-annotate' in the current buffer are-first removed. Here anns is a list containing all the-annotations (third argument to `annotation-annotate') to be-applied (in some order, with duplicates removed).+(defun annotation-load (goto-help &rest cmds)+ "Apply highlighting annotations in CMDS in the current buffer. -FILE, if non-empty, should contain a list of lists (start end-anns &optional info goto). Text between start and end will be+The argument CMDS should be a list of lists (start end anns+&optional info goto). Text between start and end will be annotated with the annotations in the list anns (using `annotation-annotate'). If info and/or goto are present they will be used as the corresponding arguments to `annotation-annotate'.@@ -172,28 +182,19 @@ inform the user about the \"goto\" facility. This function preserves the file modification stamp of the-current buffer and does not modify the undo list.+current buffer, does not modify the undo list, and temporarily+disables all modification hooks. -Note: This function may fail if there is read-only text in the buffer."+Note: This function may fail if there is read-only text in the+buffer." (annotation-preserve-mod-p-and-undo- (when (file-readable-p file)- (let ((cmds (with-temp-buffer- (insert-file-contents file)- (if (eq (point-min) (point-max))- 'empty-file- (goto-char (point-min))- (read (current-buffer))))))- (when (listp cmds)- (let ((anns (delete-dups- (apply 'append (mapcar (lambda (x) (nth 2 x)) cmds)))))- (if (funcall removep anns)- (annotation-remove-annotations))- (dolist (cmd cmds)- (destructuring-bind (start end anns &optional info goto) cmd- (let ((info (if (and (not info) (consp goto))- goto-help- info)))- (annotation-annotate start end anns info goto))))))))))+ (when (listp cmds)+ (dolist (cmd cmds)+ (destructuring-bind (start end anns &optional info goto) cmd+ (let ((info (if (and (not info) (consp goto))+ goto-help+ info)))+ (annotation-annotate start end anns info goto))))))) (provide 'annotation) ;;; annotation.el ends here
src/full/Agda/Auto/Auto.hs view
@@ -39,6 +39,7 @@ import qualified Agda.Syntax.Abstract.Name as AN import qualified Agda.TypeChecking.Monad.Base as MB import Agda.TypeChecking.EtaContract (etaContract)+import qualified Agda.Utils.HashMap as HMap import Agda.Auto.Convert import Agda.Auto.NarrowingSearch@@ -163,7 +164,7 @@ [] -> case Map.elems tccons of (m, mytype, mylocalVars, _) : [] -> do defdfv <- case thisdefinfo of- Just (def, _, _) -> fromIntegral `liftM` getdfv mi def+ Just (def, _, _) -> getdfv mi def Nothing -> return 0 ee <- liftIO $ newIORef $ ConstDef {cdname = "T", cdorigin = __IMPOSSIBLE__, cdtype = NotM $ Sort (Set 0), cdcont = Postulate, cddeffreevars = 0} let modargs = drop (length mylocalVars - defdfv) mylocalVars@@ -196,9 +197,9 @@ Just (def, clause, _) -> do let [rectyp'] = mymrectyp defdfv <- getdfv mi def- myrecdef <- liftIO $ newIORef $ ConstDef {cdname = "", cdorigin = (Nothing, def), cdtype = rectyp', cdcont = Postulate, cddeffreevars = fromIntegral defdfv}+ myrecdef <- liftIO $ newIORef $ ConstDef {cdname = "", cdorigin = (Nothing, def), cdtype = rectyp', cdcont = Postulate, cddeffreevars = defdfv} (_, pats) <- constructPats cmap mi clause- defdfv <- fromIntegral `liftM` getdfv mi def+ defdfv <- getdfv mi def return $ if contains_constructor pats then (Just (pats, myrecdef), defdfv) else@@ -285,7 +286,7 @@ ticks <- liftIO $ newIORef 0 let [rectyp'] = mymrectyp defdfv <- getdfv mi def- myrecdef <- liftIO $ newIORef $ ConstDef {cdname = "", cdorigin = (Nothing, def), cdtype = rectyp', cdcont = Postulate, cddeffreevars = fromIntegral defdfv}+ myrecdef <- liftIO $ newIORef $ ConstDef {cdname = "", cdorigin = (Nothing, def), cdtype = rectyp', cdcont = Postulate, cddeffreevars = defdfv} sols <- liftIO $ System.Timeout.timeout (timeout * 1000000) ( let r d = do sols <- liftIO $ caseSplitSearch ticks __IMPOSSIBLE__ myhints meqr __IMPOSSIBLE__ d myrecdef ctx mytype pats@@ -304,7 +305,7 @@ -- Normalise the dot patterns ps <- addCtxTel tel $ normalise ps body <- etaContractBody body- liftM modifyAbstractClause $ inContext [] $ reify $ NamedClause def $ I.Clause noRange tel perm ps body+ liftM modifyAbstractClause $ inContext [] $ reify $ AN.QNamed def $ I.Clause noRange tel perm ps body ) cls' pcs <- withInteractionId ii $ mapM prettyA cls'' ticks <- liftIO $ readIORef ticks@@ -319,11 +320,11 @@ MRefine listmode -> do mv <- lookupMeta mi- let HasType _ tt = mvJudgement mv+ let tt = jMetaType $ mvJudgement mv minfo = getMetaInfo mv targettyp <- withMetaInfo minfo $ do vs <- getContextArgs- let targettype = tt `piApply` permute (takeP (fromIntegral $ length vs) $ mvPermutation mv) vs+ let targettype = tt `piApply` permute (takeP (length vs) $ mvPermutation mv) vs normalise targettype let tctx = length $ envContext $ clEnv minfo @@ -331,7 +332,7 @@ st <- liftTCM $ join $ pureTCM $ \st _ -> return st let defs = sigDefinitions $ stSignature st idefs = sigDefinitions $ stImports st- alldefs = Map.keys defs ++ Map.keys idefs+ alldefs = HMap.keys defs ++ HMap.keys idefs liftM catMaybes $ mapM (\n -> case thisdefinfo of Just (def, _, _) | def == n -> return Nothing@@ -343,7 +344,7 @@ c <- getConstInfo n ctyp <- normalise $ defType c cdfv <- withMetaInfo minfo $ getDefFreeVars n- return $ case matchType cdfv (fromIntegral tctx) ctyp targettyp of+ return $ case matchType cdfv tctx ctyp targettyp of Nothing -> Nothing Just score -> Just (show cn, score) ) alldefs@@ -359,7 +360,7 @@ c <- getConstInfo n ctyp <- normalise $ defType c cdfv <- withMetaInfo minfo $ getDefFreeVars n- return $ case matchType cdfv (fromIntegral tctx) ctyp targettyp of+ return $ case matchType cdfv tctx ctyp targettyp of Nothing -> Nothing Just score -> Just (show cn, score) ) modnames
src/full/Agda/Auto/Convert.hs view
@@ -23,7 +23,7 @@ import Agda.Utils.Permutation (Permutation(Perm), idP, permute, takeP) import Agda.Interaction.BasicOps (rewrite, Rewrite(..)) import Agda.TypeChecking.Level (reallyUnLevelView)-import Agda.TypeChecking.Monad.Base (mvJudgement, mvPermutation, getMetaInfo, ctxEntry, envContext, clEnv, Judgement(HasType))+import Agda.TypeChecking.Monad.Base (mvJudgement, mvPermutation, getMetaInfo, ctxEntry, envContext, clEnv) import Agda.TypeChecking.Monad.MetaVars (lookupMeta, withMetaInfo) import Agda.TypeChecking.Monad.Context (getContextArgs) import Agda.TypeChecking.Monad.Constraints (getAllConstraints)@@ -33,6 +33,7 @@ import Agda.TypeChecking.EtaContract (etaContract) import Agda.TypeChecking.Primitive (constructorForm) import Agda.TypeChecking.Free (freeIn)+import qualified Agda.Utils.HashMap as HMap import Agda.Auto.NarrowingSearch import Agda.Auto.Syntax@@ -98,7 +99,8 @@ cons2 <- mapM (\con -> getConst True con TMAll) cons return (Datatype cons2 [], []) MB.Record {MB.recFields = fields, MB.recTel = tel} -> do -- the value of recPars seems unreliable or don't know what it signifies- let pars n (I.El _ (I.Pi it typ)) = C.Arg (C.argHiding it) (C.argRelevance it) (I.Var n []) : pars (n - 1) (I.unAbs typ)+ let pars n (I.El _ (I.Pi it typ)) = C.Arg (C.domHiding it) (C.domRelevance it) (I.var n) : pars (n - 1) (I.unAbs typ)+ pars n (I.El s (I.Shared p)) = pars n (I.El s (I.derefPtr p)) pars _ (I.El _ _) = [] contyp npar I.EmptyTel = I.El (I.mkType 0 {- arbitrary -}) (I.Def cn (pars (npar - 1) typ)) contyp npar (I.ExtendTel it (I.Abs v tel)) = I.El (I.mkType 0 {- arbitrary -}) (I.Pi it (I.Abs v (contyp (npar + 1) tel)))@@ -143,12 +145,12 @@ m <- getMeta mi sol' <- tomyExp sol modify $ \s -> s {sEqs = (Map.insert (Map.size (fst $ sEqs s)) (Just (False, Meta m, sol')) (fst $ sEqs s), snd $ sEqs s)}- let HasType _ tt = mvJudgement mv+ let tt = MB.jMetaType $ mvJudgement mv minfo = getMetaInfo mv- localVars = map (snd . C.unArg . ctxEntry) . envContext . clEnv $ minfo+ localVars = map (snd . C.unDom . ctxEntry) . envContext . clEnv $ minfo (targettype, localVars) <- lift $ withMetaInfo minfo $ do vs <- getContextArgs- let targettype = tt `piApply` permute (takeP (fromIntegral $ length vs) $ mvPermutation mv) vs+ let targettype = tt `piApply` permute (takeP (length vs) $ mvPermutation mv) vs targettype <- norm targettype localVars <- mapM norm localVars return (targettype, localVars)@@ -204,9 +206,9 @@ Nothing -> do mainm <- gets sMainMeta dfv <- lift $ getdfv mainm name- let nomi = fromIntegral $ I.arity (MB.defType def)- ccon <- lift $ liftIO $ newIORef (ConstDef {cdname = show name ++ ".CONS", cdorigin = (Just nomi, conname), cdtype = __IMPOSSIBLE__, cdcont = Constructor (nomi - fromIntegral dfv), cddeffreevars = fromIntegral dfv}) -- ?? correct value of deffreevars for records?- c <- lift $ liftIO $ newIORef (ConstDef {cdname = show name, cdorigin = (Nothing, name), cdtype = __IMPOSSIBLE__, cdcont = Datatype [ccon] [], cddeffreevars = fromIntegral dfv}) -- ?? correct value of deffreevars for records?+ let nomi = I.arity (MB.defType def)+ ccon <- lift $ liftIO $ newIORef (ConstDef {cdname = show name ++ ".CONS", cdorigin = (Just nomi, conname), cdtype = __IMPOSSIBLE__, cdcont = Constructor (nomi - dfv), cddeffreevars = dfv}) -- ?? correct value of deffreevars for records?+ c <- lift $ liftIO $ newIORef (ConstDef {cdname = show name, cdorigin = (Nothing, name), cdtype = __IMPOSSIBLE__, cdcont = Datatype [ccon] [], cddeffreevars = dfv}) -- ?? correct value of deffreevars for records? modify (\s -> s {sConsts = (Map.insert name (mode, c) cmap, name : snd (sConsts s))}) return $ if iscon then ccon else c _ -> do@@ -217,12 +219,12 @@ Nothing -> do (miscon, sname) <- if iscon then do let MB.Constructor {MB.conPars = npar, MB.conData = dname} = MB.theDef def- return (Just (fromIntegral npar), show dname ++ "." ++ show (I.qnameName name))+ return (Just npar, show dname ++ "." ++ show (I.qnameName name)) else return (Nothing, show name) mainm <- gets sMainMeta dfv <- lift $ getdfv mainm name- c <- lift $ liftIO $ newIORef (ConstDef {cdname = sname, cdorigin = (miscon, name), cdtype = __IMPOSSIBLE__, cdcont = __IMPOSSIBLE__, cddeffreevars = fromIntegral dfv})+ c <- lift $ liftIO $ newIORef (ConstDef {cdname = sname, cdorigin = (miscon, name), cdtype = __IMPOSSIBLE__, cdcont = __IMPOSSIBLE__, cddeffreevars = dfv}) modify (\s -> s {sConsts = (Map.insert name (mode, c) cmap, name : snd (sConsts s))}) return c @@ -346,7 +348,7 @@ tomyExp :: I.Term -> TOM (MExp O) tomyExp (I.Var v as) = do as' <- tomyExps as- return $ NotM $ App Nothing (NotM OKVal) (Var $ fromIntegral v) as'+ return $ NotM $ App Nothing (NotM OKVal) (Var v) as' tomyExp (I.Lam hid b) = do b' <- tomyExp (I.absBody b) return $ NotM $ Lam (cnvh hid) (Abs (Id $ I.absName b) b')@@ -367,7 +369,7 @@ cc <- lift $ liftIO $ readIORef c let Just npar = fst $ cdorigin cc return $ NotM $ App Nothing (NotM OKVal) (Const c) (foldl (\x _ -> NotM $ ALConPar x) as' [1..npar])-tomyExp (I.Pi (C.Arg hid _ x) b) = do+tomyExp (I.Pi (C.Dom hid _ x) b) = do let y = I.absBody b name = I.absName b x' <- tomyType x@@ -388,6 +390,7 @@ return $ Meta m _ -> tomyExp t tomyExp (I.DontCare _) = return $ NotM $ dontCare+tomyExp (I.Shared p) = tomyExp $ I.derefPtr p tomyExps [] = return $ NotM ALNil tomyExps (C.Arg hid _ a : as) = do@@ -410,10 +413,11 @@ fmExp m (I.Level (I.Max as)) = any (fmLevel m) as fmExp m (I.Def _ as) = fmExps m as fmExp m (I.Con _ as) = fmExps m as-fmExp m (I.Pi x y) = fmType m (C.unArg x) || fmType m (I.unAbs y)+fmExp m (I.Pi x y) = fmType m (C.unDom x) || fmType m (I.unAbs y) fmExp m (I.Sort _) = False fmExp m (I.MetaV mid _) = mid == m fmExp m (I.DontCare _) = False+fmExp m (I.Shared p) = fmExp m $ I.derefPtr p fmExps m [] = False fmExps m (a : as) = fmExp m (C.unArg a) || fmExps m as@@ -453,7 +457,7 @@ frommyExp (NotM e) = case e of App _ _ (Var v) as ->- frommyExps 0 as (I.Var (fromIntegral v) [])+ frommyExps 0 as (I.Var v []) App _ _ (Const c) as -> do cdef <- lift $ readIORef c let (iscon, name) = cdorigin cdef@@ -465,7 +469,7 @@ Pi _ hid _ x (Abs mid y) -> do x' <- frommyType x y' <- frommyType y- return $ I.Pi (C.Arg (icnvh hid) C.Relevant x') (I.Abs (case mid of {NoId -> "x"; Id id -> id}) y')+ return $ I.Pi (C.Dom (icnvh hid) C.Relevant x') (I.Abs (case mid of {NoId -> "x"; Id id -> id}) y') -- maybe have case for Pi where possdep is False which produces Fun (and has to unweaken y), return $ I.Fun (C.Arg (icnvh hid) x') y' Sort (Set l) -> return $ I.Sort (I.mkType (fromIntegral l))@@ -506,6 +510,7 @@ addend x (I.Var h xs) = I.Var h (xs ++ [x]) addend x (I.Con h xs) = I.Con h (xs ++ [x]) addend x (I.Def h xs) = I.Def h (xs ++ [x])+ addend x (I.Shared p) = addend x (I.derefPtr p) addend _ _ = __IMPOSSIBLE__ -- --------------------------------@@ -562,7 +567,7 @@ let Id id = mid tel <- ctel ctx t' <- frommyType t- return $ I.ExtendTel (C.Arg (icnvh hid) C.Relevant t') (I.Abs id tel)+ return $ I.ExtendTel (C.Dom (icnvh hid) C.Relevant t') (I.Abs id tel) tel <- ctel $ reverse ids let getperms 0 [] perm nv = return (perm, nv) getperms n [] _ _ = __IMPOSSIBLE__@@ -677,7 +682,7 @@ findClauseDeep m = do sig <- getImportedSignature let res = do- def <- Map.elems $ MB.sigDefinitions sig+ def <- HMap.elems $ MB.sigDefinitions sig MB.Function{MB.funClauses = cs} <- [MB.theDef def] c <- cs unless (peelbinds False findMeta $ I.clauseBody c) []@@ -692,43 +697,44 @@ I.NoBody -> d I.Body e -> f e findMeta e =- case e of+ case I.ignoreSharing e of I.Var _ as -> findMetas as I.Lam _ b -> findMeta (I.absBody b) I.Lit{} -> False I.Level (I.Max as) -> any (fmLevel m) as I.Def _ as -> findMetas as I.Con _ as -> findMetas as- I.Pi it ot -> findMetat (C.unArg it) || findMetat (I.unAbs ot)+ I.Pi it ot -> findMetat (C.unDom it) || findMetat (I.unAbs ot) I.Sort{} -> False I.MetaV m' _ -> m == m' I.DontCare _ -> False+ I.Shared{} -> __IMPOSSIBLE__ findMetas = any (findMeta . C.unArg) findMetat (I.El _ e) = findMeta e toplevel e =- case e of+ case I.ignoreSharing e of I.MetaV{} -> True _ -> False -- --------------------------------------- -matchType :: Integer -> Integer -> I.Type -> I.Type -> Maybe (Nat, Nat) -- Nat is deffreevars of const, Nat is ctx length of target type, left arg is const type, right is target type+matchType :: Int -> Int -> I.Type -> I.Type -> Maybe (Nat, Nat) -- Nat is deffreevars of const, Nat is ctx length of target type, left arg is const type, right is target type matchType cdfv tctx ctyp ttyp = trmodps cdfv ctyp where trmodps 0 ctyp = tr 0 0 ctyp- trmodps n ctyp = case ctyp of- I.El _ (I.Pi _ ot) -> trmodps (n - 1) (I.absBody ot)+ trmodps n ctyp = case I.ignoreSharing $ I.unEl ctyp of+ I.Pi _ ot -> trmodps (n - 1) (I.absBody ot) _ -> __IMPOSSIBLE__ tr narg na ctyp = case ft 0 0 Just ctyp ttyp of Just n -> Just (n, narg)- Nothing -> case ctyp of- I.El _ (I.Pi _ (I.Abs _ ot)) -> tr (narg + 1) (na + 1) ot- I.El _ (I.Pi _ (I.NoAbs _ ot)) -> tr (narg + 1) na ot+ Nothing -> case I.ignoreSharing $ I.unEl ctyp of+ I.Pi _ (I.Abs _ ot) -> tr (narg + 1) (na + 1) ot+ I.Pi _ (I.NoAbs _ ot) -> tr (narg + 1) na ot _ -> Nothing where ft nl n c (I.El _ e1) (I.El _ e2) = f nl n c e1 e2- f nl n c e1 e2 = case e1 of+ f nl n c e1 e2 = case I.ignoreSharing e1 of I.Var v1 as1 | v1 < nl -> case e2 of I.Var v2 as2 | v1 == v2 -> fs nl (n + 1) c as1 as2 _ -> Nothing@@ -736,14 +742,14 @@ I.Var v1 as1 -> case e2 of I.Var v2 as2 | cdfv + na + nl - v1 == tctx + nl - v2 -> fs nl (n + 1) c as1 as2 _ -> Nothing- _ -> case (e1, e2) of+ _ -> case (I.ignoreSharing e1, I.ignoreSharing e2) of (I.MetaV{}, _) -> c n (_, I.MetaV{}) -> c n (I.Lam hid1 b1, I.Lam hid2 b2) | hid1 == hid2 -> f (nl + 1) n c (I.absBody b1) (I.absBody b2) (I.Lit lit1, I.Lit lit2) | lit1 == lit2 -> c (n + 1) (I.Def n1 as1, I.Def n2 as2) | n1 == n2 -> fs nl (n + 1) c as1 as2 (I.Con n1 as1, I.Con n2 as2) | n1 == n2 -> fs nl (n + 1) c as1 as2- (I.Pi (C.Arg hid1 rel1 it1) ot1, I.Pi (C.Arg hid2 rel2 it2) ot2) | hid1 == hid2 -> ft nl n (\n -> ft (nl + 1) n c (I.absBody ot1) (I.absBody ot2)) it1 it2+ (I.Pi (C.Dom hid1 rel1 it1) ot1, I.Pi (C.Dom hid2 rel2 it2) ot2) | hid1 == hid2 -> ft nl n (\n -> ft (nl + 1) n c (I.absBody ot1) (I.absBody ot2)) it1 it2 (I.Sort{}, I.Sort{}) -> c n -- sloppy _ -> Nothing fs nl n c es1 es2 = case (es1, es2) of
+ src/full/Agda/Compiler/CallCompiler.hs view
@@ -0,0 +1,83 @@+{-# LANGUAGE CPP #-}++------------------------------------------------------------------------+-- | A command which calls a compiler+------------------------------------------------------------------------++module Agda.Compiler.CallCompiler where++import qualified Control.Exception as E+import Control.Monad.Trans+import Data.List as L+import System.Exit+import System.IO+import System.Process++import Agda.TypeChecking.Monad++import Agda.Utils.Impossible+#include "../undefined.h"++-- | Calls a compiler:+--+-- * Checks the exit code to see if the compiler exits successfully.+-- If not, then an exception is raised, containing the text the+-- compiler printed to stderr (if any).+--+-- * Uses the debug printout machinery to relay any progress+-- information the compiler prints to stdout.++callCompiler+ :: FilePath+ -- ^ The path to the compiler+ -> [String]+ -- ^ Command-line arguments.+ -> TCM ()+callCompiler cmd args = do+ merrors <- callCompiler' cmd args+ case merrors of+ Nothing -> return ()+ Just errors -> typeError (CompilationError errors)++-- | Generalisation of @callCompiler@ where the raised exception is+-- returned.+callCompiler'+ :: FilePath+ -- ^ The path to the compiler+ -> [String]+ -- ^ Command-line arguments.+ -> TCM (Maybe String)+callCompiler' cmd args = do+ reportSLn "" 1 $ "Calling: " ++ intercalate " " (cmd : args)+ (_, out, err, p) <-+ liftIO $ createProcess+ (proc cmd args) { std_err = CreatePipe+ , std_out = CreatePipe+ }++ -- In -v0 mode we throw away any progress information printed to+ -- stdout.+ case out of+ Nothing -> __IMPOSSIBLE__+ Just out -> forkTCM $ do+ -- The handle should be in text mode.+ liftIO $ hSetBinaryMode out False+ progressInfo <- liftIO $ hGetContents out+ mapM_ (reportSLn "" 1) $ lines progressInfo++ errors <- liftIO $ case err of+ Nothing -> __IMPOSSIBLE__+ Just err -> do+ -- The handle should be in text mode.+ hSetBinaryMode err False+ hGetContents err++ exitcode <- liftIO $ do+ -- Ensure that the output has been read before waiting for the+ -- process.+ E.evaluate (length errors)+ waitForProcess p++ case exitcode of+ ExitFailure _ -> return $ Just errors+ _ -> return Nothing
src/full/Agda/Compiler/Epic/CompileState.hs view
@@ -27,6 +27,7 @@ #include "../../undefined.h" import Agda.Utils.Impossible import Agda.Utils.Monad+import qualified Agda.Utils.HashMap as HM -- | Stuff we need in our compiler@@ -67,7 +68,7 @@ getType :: QName -> Compile TCM Type getType q = do map <- lift (gets (sigDefinitions . stImports))- return $ maybe __IMPOSSIBLE__ defType (M.lookup q map)+ return $ maybe __IMPOSSIBLE__ defType (HM.lookup q map) -- | Create a name which can be used in Epic code from a QName. unqname :: QName -> Var@@ -109,7 +110,7 @@ getConData :: QName -> Compile TCM QName getConData con = do lmap <- lift (gets (TM.sigDefinitions . TM.stImports))- case M.lookup con lmap of+ case HM.lookup con lmap of Just def -> case theDef def of c@(TM.Constructor{}) -> return $ TM.conData c _ -> __IMPOSSIBLE__@@ -118,7 +119,7 @@ getDataCon :: QName -> Compile TCM [QName] getDataCon con = do lmap <- lift (gets (TM.sigDefinitions . TM.stImports))- case M.lookup con lmap of+ case HM.lookup con lmap of Just def -> case theDef def of d@(TM.Datatype{}) -> return $ TM.dataCons d r@(TM.Record{}) -> return [ TM.recCon r]
src/full/Agda/Compiler/Epic/Compiler.hs view
@@ -13,23 +13,28 @@ import Data.Maybe import Data.Monoid import qualified Language.Haskell.Exts.Syntax as Haskell-import System.Directory+import System.Directory ( canonicalizePath, createDirectoryIfMissing+ , getCurrentDirectory, setCurrentDirectory+ ) import System.Exit import System.FilePath hiding (normalise) import System.Process hiding (env) import Paths_Agda+import Agda.Compiler.CallCompiler import Agda.Compiler.MAlonzo.Pretty -- TODO: Move shared code to Compiler.* import Agda.Compiler.MAlonzo.Primitives (checkTypeOfMain) import Agda.Interaction.FindFile import Agda.Interaction.Options import Agda.Interaction.Imports+import Agda.Syntax.Common (Delayed(..)) import qualified Agda.Syntax.Concrete.Name as CN import Agda.Syntax.Internal hiding (Term(..)) import Agda.TypeChecking.Monad import Agda.TypeChecking.Monad.Builtin import Agda.TypeChecking.Serialise import Agda.Utils.FileName+import qualified Agda.Utils.HashMap as HMap import qualified Agda.TypeChecking.Pretty as P @@ -120,7 +125,7 @@ "Compiling: " ++ show (iModuleName i) resetNameSupply initialAnalysis i- let defns = M.toList $ sigDefinitions $ iSignature i+ let defns = HMap.toList $ sigDefinitions $ iSignature i -- Epic cannot parse files with no definitions if (not $ null defns) then do code <- compileDefns defns@@ -142,7 +147,7 @@ initialAnalysis inter = do Prim.initialPrims modify $ \s -> s {curModule = mempty}- let defs = M.toList $ sigDefinitions $ iSignature inter+ let defs = HMap.toList $ sigDefinitions $ iSignature inter forM_ defs $ \(q, def) -> do addDefName q case theDef def of@@ -154,7 +159,7 @@ putConstrTag suc (PrimTag "primSuc") _ -> return () Constructor {conPars = np} -> do- putForcedArgs q . drop (fromIntegral np) . ForceC.makeForcedArgs $ defType def+ putForcedArgs q . drop np . ForceC.makeForcedArgs $ defType def putConArity q =<< lift (constructorArity q) f@(Function{}) -> do when ("main" == show (qnameName q)) $ do@@ -256,10 +261,5 @@ -- , "-trace" , "-i", dataDir </> "stdagda" <.> "c" ] ++ flags epicFlags- lift $ reportSLn "" 1 $- "calling: " ++ unwords (epic : epicCommand)- res <- liftIO $ system (unwords (epic : epicCommand))- -- rawSystem epic epicCommand- case res of- ExitSuccess -> return ()- ExitFailure i -> epicError $ "Epic returned " ++ show res ++ ", which should not happen. Please report this as a bug."++ lift $ callCompiler epic epicCommand
src/full/Agda/Compiler/Epic/Epic.hs view
@@ -103,7 +103,7 @@ prettyEpicLit l = case l of LInt n -> show n ++ "L" LChar c -> show (ord c)- LString s -> "Con 1" <+> many [show s, "Con 0 ()"]+ LString s -> show s LFloat f -> show f typVar :: Var -> String
src/full/Agda/Compiler/Epic/Erasure.hs view
@@ -137,9 +137,9 @@ SI.Pi a b -> mkRel a : initialRels (SI.unAbs b) rel _ -> [] where- mkRel :: SC.Arg SI.Type -> Relevance- mkRel a | ignoreForced (SC.argRelevance a) = Irr- mkRel a = case SI.unEl (SC.unArg a) of+ mkRel :: SC.Dom SI.Type -> Relevance+ mkRel a | ignoreForced (SC.domRelevance a) = Irr+ mkRel a = case SI.unEl (SC.unDom a) of SI.Sort _ -> Irr _ -> rel
src/full/Agda/Compiler/Epic/ForceConstrs.hs view
@@ -23,10 +23,11 @@ T.Pi arg ab -> isRel arg : makeForcedArgs (T.unAbs ab) _ -> [] where- isRel :: S.Arg T.Type -> Forced- isRel arg = case S.argRelevance arg of+ isRel :: S.Dom T.Type -> Forced+ isRel arg = case S.domRelevance arg of S.Relevant -> NotForced S.Irrelevant -> Forced+ S.UnusedArg -> Forced S.NonStrict -> Forced -- can never be executed S.Forced -> Forced -- It can be inferred
src/full/Agda/Compiler/Epic/Forcing.hs view
@@ -20,7 +20,8 @@ import Agda.TypeChecking.Monad import Agda.TypeChecking.Rules.LHS.Unify import Agda.TypeChecking.Rules.LHS.Instantiate-import Agda.TypeChecking.Substitute (raiseFrom, raise, substs, apply, TelV(..))+import Agda.TypeChecking.Substitute+ (raiseFrom, raise, applySubst, apply, wkS, raiseS, dropS, (++#), TelV(..)) import qualified Agda.TypeChecking.Substitute as S import Agda.TypeChecking.Pretty as P import Agda.TypeChecking.Reduce@@ -29,6 +30,7 @@ import Agda.Utils.Monad import Agda.Utils.Permutation import Agda.Utils.Size+import qualified Agda.Utils.HashMap as HM import Agda.Compiler.Epic.AuxAST import Agda.Compiler.Epic.CompileState@@ -48,7 +50,7 @@ dataParametersTCM :: QName -> TCM Nat dataParametersTCM name = do m <- (gets (sigDefinitions . stImports))- return $ maybe __IMPOSSIBLE__ (defnPars . theDef) (M.lookup name m)+ return $ maybe __IMPOSSIBLE__ (defnPars . theDef) (HM.lookup name m) where defnPars :: Defn -> Nat defnPars (Datatype {dataPars = p}) = p@@ -100,7 +102,7 @@ , text "term:" <+> prettyTCM term , text "to:" <+> prettyTCM (unAbs to) ]- (st, arg) <- case SI.unEl . unArg $ t' of+ (st, arg) <- case SI.unEl . unDom $ t' of SI.Def st arg -> return (st, arg) s -> do report 10 $ vcat@@ -113,15 +115,18 @@ -- Because: parameters occurs in the type of constructors but are not bound by it. pars <- dataParameters st report 10 $ text "apply in insertTele"- TelV ctele ctyp <- lift $ telView =<< maybe (return $ unArg t')- (`piApplyM'` take (fromIntegral pars) arg) ins-+ TelV ctele ctyp <- lift $ telView =<< maybe (return $ unDom t')+ (`piApplyM'` genericTake pars arg) ins+-- (`piApplyM'` take (fromIntegral pars) arg) ins+{- OLD CODE: () <- if length (take (fromIntegral pars) arg) == fromIntegral pars then return () else __IMPOSSIBLE__+-}+ when (genericLength arg < pars) __IMPOSSIBLE__ -- we deal with absBody to directly since we remove t return ( ctele +:+ (S.subst term $ S.raiseFrom 1 (size ctele) (unAbs to))- , (ctele, S.raise (size ctele) $ unArg t , ctyp)+ , (ctele, S.raise (size ctele) $ unDom t , ctyp) ) where -- Append the telescope, we raise since we add a new binding and all the previous@@ -149,7 +154,7 @@ remForced fs = do defs <- lift (gets (sigDefinitions . stImports)) forM fs $ \f -> case f of- Fun{} -> case funQName f >>= flip M.lookup defs of+ Fun{} -> case funQName f >>= flip HM.lookup defs of Nothing -> __IMPOSSIBLE__ Just def -> do TelV tele _ <- lift $ telView (defType def)@@ -201,32 +206,26 @@ -- unify the telescope type with the return type of the constructor unif <- case (unEl ntyp, unEl ctyp) of (SI.Def st a1, SI.Def st' a2) | st == st' -> do- typPars <- fromIntegral <$> dataParameters st+ typPars <- dataParameters st setType <- getType st report 10 $ vcat [ text "ntyp:" <+> prettyTCM ntyp , text "ctyp:" <+> prettyTCM ctyp ] unifyI (takeTele (n + length as) tele'')- (map fromIntegral $ [0 .. n + length as])+ [0 .. n + length as] (setType `apply` take typPars a1) (drop typPars a1) (drop typPars a2) _ -> __IMPOSSIBLE__ let- lower = map (raise (-1)) . drop 1- isOk t = case t of- SI.Var n xs | n >= 0 -> all (isOk . unArg) xs- SI.Con _ xs -> all (isOk . unArg) xs- SI.Def f xs -> all (isOk . unArg) xs- _ -> error $ show t+ lower = wkS (-1) . dropS 1 subT 0 tel = let ss = [fromMaybe (SI.Var n []) t- | (n , t) <- zip [0..] (unif ++ repeat Nothing)]- in (S.substs ss tel, lower ss)+ | (n , t) <- zip [0..] unif] ++#+ raiseS (length unif)+ in (applySubst ss tel, lower ss) subT n (ExtendTel a t) = let (tb' , ss) = subT (n - 1) (unAbs t)- a' | all isOk (take 100 ss) = S.substs ss a- | True = __IMPOSSIBLE__ in (ExtendTel a $ Abs (absName t) tb', lower ss) subT _ _ = __IMPOSSIBLE__ (tele'''', _) = subT (n + length as) tele''@@ -251,7 +250,7 @@ replaceForced (vars,_) tele [] _ e = forcedExpr vars tele e replaceForced (vars,uvars) tele (fvar : fvars) unif e = do let n = fromMaybe __IMPOSSIBLE__ $ elemIndex fvar uvars- mpos <- findPosition (fromIntegral n) unif+ mpos <- findPosition n unif case mpos of Nothing -> case unif !! n of Nothing | fvar `notElem` fv e ->@@ -271,7 +270,7 @@ subst fvar v <$> replaceForced (vars, uvars) tele fvars unif (Let v te e) Just (pos , term) -> do- (build, v) <- buildTerm (uvars !! fromInteger pos) (fromIntegral n) term+ (build, v) <- buildTerm (uvars !! pos) n term build . subst fvar v <$> replaceForced (vars, uvars) tele fvars unif e where@@ -284,7 +283,7 @@ buildTerm var idx (SI.Con c args) = do vs <- replicateM (length args) newName (pos , arg) <- fromMaybe __IMPOSSIBLE__ <$> findPosition idx (map (Just . unArg) args)- (fun' , v) <- buildTerm (vs !! fromInteger pos) idx arg+ (fun' , v) <- buildTerm (vs !! pos) idx arg tag <- getConstrTag c let fun e = casee (Var var) [Branch tag c vs e] return (fun . fun' , v)
src/full/Agda/Compiler/Epic/FromAgda.hs view
@@ -43,13 +43,13 @@ epDef = compiledEpic $ defCompiledRep defini in case theDef defini of d@(Datatype {}) -> do -- become functions returning unit- vars <- replicateM (fromIntegral $ dataPars d + dataIxs d) newName+ vars <- replicateM (dataPars d + dataIxs d) newName return . return $ Fun True n' (Just n) ("datatype: " ++ show n) vars UNIT f@(Function{}) -> do let projArgs = maybe 0 (pred . snd) (funProjection f) ccs <- reverseCCBody projArgs <$> normaliseStatic (funCompiled f) let len = (+ projArgs) . length . clausePats . head . funClauses $ f- toEta = fromIntegral (arity (defType defini)) - len+ toEta = arity (defType defini) - len -- forcing <- lift $ gets (optForcing . stPersistentOptions) lift $ reportSDoc "epic.fromagda" 5 $ text "compiling fun:" <+> prettyTCM n lift $ reportSDoc "epic.fromagda" 5 $ text "len:" <+> (text . show) len@@ -71,7 +71,7 @@ Just (T.Def sharp []) | sharp == n -> return <$> mkFun n n' "primSharp" 3 _ -> return <$> mkCon n tag arit r@(Record{}) -> do- vars <- replicateM (fromIntegral $ recPars r) newName+ vars <- replicateM (recPars r) newName return . return $ Fun True n' (Just n) ("record: " ++ show n) vars UNIT a@(Axiom{}) -> do -- Axioms get their code from COMPILED_EPIC pragmas case epDef of@@ -80,7 +80,7 @@ Just x -> return . return $ EpicFun n' (Just n) ("COMPILED_EPIC: " ++ show n) x p@(Primitive{}) -> do -- Primitives use primitive functions from AgdaPrelude.e of the same name. -- Hopefully they are defined!- let ar = fromIntegral $ arity $ defType defini+ let ar = arity $ defType defini return <$> mkFun n n' (primName p) ar where mkFun q = mkFunGen q apps ("primitive: " ++)@@ -129,11 +129,13 @@ reverseCCBody :: Int -> CC.CompiledClauses -> CC.CompiledClauses reverseCCBody c cc = case cc of CC.Case n (CC.Branches cbr lbr cabr) -> CC.Case (c+n)- $ CC.Branches (M.map (reverseCCBody c) cbr)+ $ CC.Branches (M.map (fmap $ reverseCCBody c) cbr) (M.map (reverseCCBody c) lbr) (fmap (reverseCCBody c) cabr)- CC.Done i t -> CC.Done i (S.substs (map (flip T.Var [])- (reverse $ take (length i) [fromIntegral c..])) t)+ CC.Done i t -> CC.Done i (S.applySubst+ (S.parallelS $ map (flip T.Var []) $+ reverse $ take (length i) [c..])+ t) CC.Fail -> CC.Fail -- | Translate from Agda's desugared pattern matching (CompiledClauses) to our AuxAST.@@ -200,8 +202,8 @@ -- TODO: Handle other literals _ -> epicError $ "case on literal not supported: " ++ show l -- Con branch- else forM (M.toList (CC.conBranches nc)) $ \(b, cc) -> do- arit <- getConArity b+ else forM (M.toList (CC.conBranches nc)) $ \(b, CC.WithArity ar cc) -> do+ arit <- getConArity b -- Andreas, 2012-10-12: is the constructor arity @ar@ from Agda the same as the one from the Epic backen? tag <- getConstrTag b vars <- replicateM arit newName cc' <- compileClauses' (replaceAt casedvar env vars) omniDefault cc@@ -217,9 +219,9 @@ -- names in the position. substTerm :: [Var] -> T.Term -> Compile TCM Expr substTerm env term = case term of- T.Var ind args -> case length env <= fromIntegral ind of+ T.Var ind args -> case length env <= ind of True -> __IMPOSSIBLE__- False -> apps (env !! fromIntegral ind) <$> mapM (substTerm env . unArg) args+ False -> apps (env !! ind) <$> mapM (substTerm env . unArg) args T.Lam _ (Abs _ te) -> do name <- newName Lam name <$> substTerm (name : env) te@@ -242,6 +244,7 @@ T.Con q args -> do let con = unqname q apps con <$> mapM (substTerm env . unArg) args+ T.Shared p -> substTerm env $ derefPtr p T.Pi _ _ -> return UNIT T.Sort _ -> return UNIT T.MetaV _ _ -> return UNIT
src/full/Agda/Compiler/Epic/Injection.hs view
@@ -24,6 +24,7 @@ import Agda.TypeChecking.Telescope import Agda.Utils.Monad import Agda.Utils.Size+import qualified Agda.Utils.HashMap as HM import Agda.Compiler.Epic.CompileState import qualified Agda.Compiler.Epic.FromAgda as FA@@ -43,12 +44,12 @@ injFuns <- solve newNames (catMaybes funs) defs' <- forM defs $ \(q, def) -> case q `isIn` injFuns of Nothing -> return (q, def)- Just inj@(InjectiveFun var arity) -> case theDef def of+ Just inj@(InjectiveFun nvar arity) -> case theDef def of f@(Function{}) -> do modifyEI $ \s -> s { injectiveFuns = M.insert q inj (injectiveFuns s) }- let ns = replicate (fromIntegral arity) (Arg NotHidden Relevant "")- return $ (,) q $ def {theDef = f { funCompiled = Done ns- (Var (arity - var - 1) []) } }+ let ns = replicate arity (Arg NotHidden Relevant "")+ return $ (,) q $ def { theDef = f { funCompiled = Done ns $+ var $ arity - nvar - 1 } } _ -> __IMPOSSIBLE__ lift $ reportSLn "epic.injection" 10 $ "injfuns: " ++ show injFuns@@ -61,8 +62,8 @@ replaceFunCC :: QName -> CompiledClauses -> Compile TCM () replaceFunCC name cc = do lift $ modify $ \s ->- s { stSignature = (stSignature s) { sigDefinitions = M.adjust replaceDef name (sigDefinitions (stSignature s)) }- , stImports = (stImports s) { sigDefinitions = M.adjust replaceDef name (sigDefinitions (stImports s)) }+ s { stSignature = (stSignature s) { sigDefinitions = HM.adjust replaceDef name (sigDefinitions (stSignature s)) }+ , stImports = (stImports s) { sigDefinitions = HM.adjust replaceDef name (sigDefinitions (stImports s)) } } where replaceDef :: Definition -> Definition@@ -87,7 +88,7 @@ cli <- forM cls $ \ cl -> isInjectiveHere nam i cl let cli' = catMaybes cli return $ if length cli == length cli'- then Just ((nam, InjectiveFun (fromIntegral i) (fromIntegral total)), concat cli')+ then Just ((nam, InjectiveFun i total), concat cli') else Nothing remAbs :: ClauseBody -> Term@@ -104,7 +105,7 @@ patternToTerm :: Nat -> Pattern -> Term patternToTerm n p = case p of- VarP v -> Var n []+ VarP v -> var n DotP t -> t ConP c typ args -> Con c $ zipWith (\ arg t -> arg {unArg = t}) args $ snd@@ -121,11 +122,11 @@ LitP l -> 0 substForDot :: [Arg Pattern] -> Substitution-substForDot ps = map (flip Var []) (makeSubst 0 0 $ reverse $ calcDots ps)+substForDot = makeSubst 0 0 . reverse . calcDots where- makeSubst i accum [] = [i + accum ..]+ makeSubst i accum [] = raiseS (i + accum) makeSubst i accum (True : ps) = makeSubst i (accum +1) ps- makeSubst i accum (False : ps) = i + accum : makeSubst (i+1) accum ps+ makeSubst i accum (False : ps) = var (i + accum) :# makeSubst (i+1) accum ps calcDots = concatMap calcDots' . map unArg calcDots' p = case p of@@ -141,13 +142,13 @@ isInjectiveHere nam idx Clause {clauseBody = body} | isNoBody body = return emptyC isInjectiveHere nam idx clause = do let t = patternToTerm idxR $ unArg $ clausePats clause !! idx- t' = substs (substForDot $ clausePats clause) t+ t' = applySubst (substForDot $ clausePats clause) t idxR = sum . map (nrBinds . unArg) . genericDrop (idx + 1) $ clausePats clause body = remAbs $ clauseBody clause body' <- lift $ reduce body injFs <- gets (injectiveFuns . importedModules)- res <- (t' <: body') (M.insert nam (InjectiveFun (fromIntegral idx)- (genericLength (clausePats clause))) injFs)+ res <- (t' <: body') (M.insert nam (InjectiveFun idx+ (length (clausePats clause))) injFs) lift $ reportSDoc "epic.injection" 20 $ vcat [ text "isInjective:" <+> text (show nam) , text "at Index :" <+> text (show idx)@@ -176,8 +177,8 @@ litCon _ = False insertAt :: (Nat,Term) -> Term -> Term-insertAt (index, ins) = substs [if i == index then ins else Var i [] | i <- [0 .. ]]-+insertAt (index, ins) =+ applySubst ([var i | i <- [0 .. index - 1]] ++# ins :# raiseS (index + 1)) solve :: [QName] -> [((QName, InjectiveFun), [(QName,QName)])] -> Compile TCM [(QName, InjectiveFun)] solve newNames xs = do@@ -248,7 +249,7 @@ if genericLength args2 /= arit then return Nothing else do- arg <- lift $ reduce $ unArg $ args2 !! fromIntegral argn+ arg <- lift $ reduce $ unArg $ args2 !! argn (t1 <: arg) injs -- (Var n1 [] <: Var n2 []) nam idx = return $ if n1 == n2 then emptyC else Nothing (Var n1 args1 <: Var n2 args2) injs | n1 == n2 && length args1 == length args2 = do@@ -304,7 +305,7 @@ let g1s = eqGroups ts !!! n1 g2s = eqGroups ts !!! n2 gs = S.union g1s g2s- ifM (not . and <$> sequence [unifiable e1 e2 | e1 <- S.toList g1s, e2 <- S.toList g2s])+ ifM (not <$> andM [unifiable e1 e2 | e1 <- S.toList g1s, e2 <- S.toList g2s]) (return Nothing) $ return $ Just $ ts { eqGroups = M.delete n2 $ M.insert n1 gs (eqGroups ts)
src/full/Agda/Compiler/Epic/NatDetection.hs view
@@ -13,23 +13,25 @@ import qualified Data.Map as M import Data.Maybe -import Agda.TypeChecking.Monad+import Agda.Syntax.Common import Agda.Syntax.Internal+import Agda.TypeChecking.Monad import Agda.TypeChecking.Substitute-import Agda.Syntax.Common+import Agda.Utils.Monad (andM) import Agda.Compiler.Epic.CompileState import Agda.Compiler.Epic.Interface #include "../../undefined.h" import Agda.Utils.Impossible+import qualified Agda.Utils.HashMap as HM -- | Get a list of all the datatypes that look like nats. The [QName] is on the -- form [zeroConstr, sucConstr] getNatish :: Compile TCM [(ForcedArgs, [QName])] getNatish = do sig <- lift (gets (sigDefinitions . stImports))- let defs = M.toList sig+ let defs = HM.toList sig fmap catMaybes $ forM defs $ \(q, def) -> case theDef def of d@(Datatype {}) -> isNatish q d@@ -40,15 +42,15 @@ isNatish q d = do -- A datatype ... case dataCons d of constrs | length constrs == 2 -> do -- with two constructors ...- b <- and <$> mapM constrInScope constrs+ b <- andM $ map constrInScope constrs if b then do z <- zip constrs <$> mapM getForcedArgs constrs case sortBy (compare `on` nrRel . snd) z of [(cz,fz), (cs,fs)] -> do sig <- lift (gets (sigDefinitions . stImports))- let ts = defType $ sig M.! cs- nr = fromIntegral $ dataPars d+ let ts = defType $ sig HM.! cs+ nr = dataPars d return $ do guard (nrRel fz == 0) -- where one constructor has zero arguments ... guard (nrRel fs == 1) -- and the other one one argument ...@@ -65,7 +67,7 @@ -- | Check if argument n is recursive isRec :: Int -> Type -> QName -> Bool isRec 0 (El _ t) dat = case t of- Pi arg _ -> argIsDef (unArg arg) dat+ Pi arg _ -> argIsDef (unDom arg) dat _ -> False isRec n (El _ t) dat = case t of Pi _ ab -> isRec (n - 1) (unAbs ab) dat
src/full/Agda/Compiler/Epic/Primitive.hs view
@@ -15,6 +15,7 @@ import qualified Agda.Syntax.Internal as T import Agda.TypeChecking.Monad hiding (defName) import Agda.TypeChecking.Monad.Builtin+import Agda.Utils.Monad (andM) import Agda.Compiler.Epic.AuxAST import Agda.Compiler.Epic.CompileState@@ -92,7 +93,7 @@ if all isJust builtins then do let names = map (defName . fromMaybe __IMPOSSIBLE__) builtins- b <- and <$> mapM constrInScope names+ b <- andM $ map constrInScope names if b then return $ Just (transf names) else return Nothing else return Nothing
src/full/Agda/Compiler/Epic/Smashing.hs view
@@ -32,6 +32,7 @@ import Agda.Utils.Monad import Agda.Utils.Size+import qualified Agda.Utils.HashMap as HM #include "../../undefined.h" import Agda.Utils.Impossible@@ -46,7 +47,7 @@ smash'em funs = do defs <- lift (gets (sigDefinitions . stImports)) funs' <- forM funs $ \f -> case f of- AA.Fun{} -> case funQName f >>= flip M.lookup defs of+ AA.Fun{} -> case funQName f >>= flip HM.lookup defs of Nothing -> do lift $ reportSDoc "epic.smashing" 10 $ vcat [ (text . show) f <+> text " was not found"]@@ -79,7 +80,7 @@ inferable visited dat args = do lift $ reportSLn "epic.smashing" 10 $ " inferring:" ++ (show dat) defs <- lift (gets (sigDefinitions . stImports))- let def = fromMaybe __IMPOSSIBLE__ $ M.lookup dat defs+ let def = fromMaybe __IMPOSSIBLE__ $ HM.lookup dat defs case theDef def of d@Datatype{} -> do case dataCons d of@@ -95,7 +96,7 @@ where inferableArgs c pars = do defs <- lift (gets (sigDefinitions . stImports))- let def = fromMaybe __IMPOSSIBLE__ $ M.lookup c defs+ let def = fromMaybe __IMPOSSIBLE__ $ HM.lookup c defs forc <- getForcedArgs c TelV tel _ <- lift $ telView (defType def `apply` genericTake pars args) tag <- getConstrTag c@@ -104,7 +105,7 @@ , text "tele" <+> prettyTCM tel , text "constr:" <+> prettyTCM c ]- (AA.Con tag c <$>) <$> sequence <$> forM (notForced forc $ flattenTel tel) (inferableTerm visited' . unEl . unArg)+ (AA.Con tag c <$>) <$> sequence <$> forM (notForced forc $ flattenTel tel) (inferableTerm visited' . unEl . unDom) visited' = S.insert dat visited inferableTerm visited t = case t of
src/full/Agda/Compiler/Epic/Static.hs view
@@ -19,11 +19,13 @@ import Agda.TypeChecking.Monad.Base import Agda.TypeChecking.Monad.Builtin import Agda.TypeChecking.Monad.Options+import Agda.TypeChecking.Monad.Sharing import Agda.TypeChecking.Reduce import Agda.TypeChecking.Substitute import Agda.TypeChecking.Pretty import Agda.Utils.Monad+import qualified Agda.Utils.HashMap as HM import Agda.Compiler.Epic.CompileState @@ -36,7 +38,7 @@ evaluateCC :: CompiledClauses -> Compile TCM CompiledClauses evaluateCC ccs = case ccs of Case n brs -> do- cbrs <- forM (M.toList $ conBranches brs) $ \(c, cc) -> (,) c <$> evaluateCC cc+ cbrs <- forM (M.toList $ conBranches brs) $ \(c, WithArity n cc) -> (,) c <$> (WithArity n <$> evaluateCC cc) lbrs <- forM (M.toList $ litBranches brs) $ \(l, cc) -> (,) l <$> evaluateCC cc cab <- case catchAllBranch brs of Nothing -> return Nothing@@ -52,7 +54,7 @@ etaExpand :: Term -> Compile TCM Term etaExpand def@(Def n ts) = do defs <- lift (gets (sigDefinitions . stImports))- let f = maybe __IMPOSSIBLE__ theDef (M.lookup n defs)+ let f = maybe __IMPOSSIBLE__ theDef (HM.lookup n defs) len = length . clausePats . head . funClauses $ f toEta :: Num a => a toEta = fromIntegral $ len - length ts@@ -86,6 +88,7 @@ MetaV i args -> return $ MetaV i args Level l -> return $ Level l DontCare i -> return $ DontCare i+ Shared{} -> updateSharedTermT evaluateTerm term where evaluateTerms :: Args -> Compile TCM Args evaluateTerms as = forM as $ \x -> do@@ -95,7 +98,7 @@ isStatic :: QName -> Compile TCM Bool isStatic q = do defs <- lift (gets (sigDefinitions . stImports))- return $ case fmap theDef $ M.lookup q defs of+ return $ case fmap theDef $ HM.lookup q defs of Nothing -> False Just (f@Function{}) -> funStatic f Just _ -> False
src/full/Agda/Compiler/HaskellTypes.hs view
@@ -12,9 +12,10 @@ import Agda.Syntax.Common import Agda.Syntax.Internal import Agda.TypeChecking.Monad+import Agda.TypeChecking.Monad.Builtin import Agda.TypeChecking.Pretty import Agda.TypeChecking.Reduce-import Agda.TypeChecking.Rules.Builtin.Coinduction+-- import Agda.TypeChecking.Rules.Builtin.Coinduction import Agda.TypeChecking.Substitute import Agda.TypeChecking.Free import Agda.Utils.Monad@@ -85,7 +86,7 @@ a <- reduce a case unEl a of Sort _ -> return hsStar- Pi a b -> hsKFun <$> haskellKind (unArg a) <*> underAbstraction a b haskellKind+ Pi a b -> hsKFun <$> haskellKind (unDom a) <*> underAbstraction a b haskellKind Def d _ -> do d <- compiledHaskell . defCompiledRep <$> getConstInfo d case d of@@ -118,15 +119,16 @@ _ -> err Def d args -> hsApp <$> getHsType d <*> fromArgs args Pi a b ->- if isBinderUsed b+ if isBinderUsed b -- Andreas, 2012-04-03. Q: could we rely on Abs/NoAbs instead of again checking freeness of variable? then underAbstraction a b $ \b -> hsForall <$> getHsVar 0 <*>- (hsFun <$> fromType (unArg a) <*> fromType b)- else hsFun <$> fromType (unArg a) <*> fromType (absApp b __IMPOSSIBLE__)+ (hsFun <$> fromType (unDom a) <*> fromType b)+ else hsFun <$> fromType (unDom a) <*> fromType (absApp b __IMPOSSIBLE__) Con c args -> hsApp <$> getHsType c <*> fromArgs args Lam{} -> err Level{} -> return hsUnit Lit{} -> return hsUnit Sort{} -> return hsUnit+ Shared p -> fromTerm $ derefPtr p MetaV{} -> err DontCare{} -> err
src/full/Agda/Compiler/JS/Compiler.hs view
@@ -5,9 +5,11 @@ import Prelude hiding ( null, writeFile ) import Control.Monad.Reader ( liftIO ) import Control.Monad.State ( get, put )-import Data.List ( intercalate, map, filter, isPrefixOf, concat, genericDrop, genericLength )+import Data.List ( intercalate, map, filter, isPrefixOf, concat, genericDrop, genericLength, partition ) import Data.Set ( Set, empty, null, insert, difference, delete ) import Data.Map ( Map, fold, singleton, fromList, toList, toAscList, insertWith, elems )+import qualified Data.Set as Set+import qualified Data.Map as Map import System.Directory ( createDirectoryIfMissing ) import System.FilePath ( pathSeparator, splitFileName, (</>) ) @@ -23,7 +25,8 @@ ( Name, Args, Type, Clause(Clause), Pattern(VarP,DotP,LitP,ConP), Abs(Abs), ClauseBody(Body,NoBody,Bind),- Term(Var,Lam,Lit,Level,Def,Con,Pi,Sort,MetaV,DontCare),+ Term(Var,Lam,Lit,Level,Def,Con,Pi,Sort,MetaV,DontCare,Shared),+ derefPtr, toTopLevelModuleName, clausePats, clauseBody, arity, unEl, unAbs ) import Agda.TypeChecking.Substitute ( absBody ) import Agda.Syntax.Literal ( Literal(LitInt,LitFloat,LitString,LitChar,LitQName) )@@ -42,9 +45,10 @@ import Agda.TypeChecking.Reduce ( instantiateFull, normalise ) import Agda.Utils.FileName ( filePath ) import Agda.Utils.Function ( iterate' )-import Agda.Utils.Monad ( (<$>), (<*>), bracket, ifM )+import Agda.Utils.Monad ( (<$>), (<*>), localState, ifM ) import Agda.Utils.IO.UTF8 ( writeFile ) import Agda.Utils.Impossible ( Impossible(Impossible), throwImpossible )+import qualified Agda.Utils.HashMap as HMap import Agda.Compiler.MAlonzo.Misc ( curDefs, curIF, curMName, setInterface ) import Agda.Compiler.MAlonzo.Primitives ( repl ) @@ -66,7 +70,7 @@ compilerMain :: Interface -> TCM () compilerMain mainI = -- Preserve the state (the compiler modifies the state).- bracket get put $ \_ -> do+ localState $ do -- Compute the output directory. opts <- commandLineOptions@@ -154,8 +158,17 @@ -- Reorder a list of exports to ensure def-before-use. -- Note that this can diverge in the case when there is no such reordering. +-- Only top-level values are evaluated before definitions are added to the+-- module, so we put those last, ordered in dependency order. There can't be+-- any recursion between top-level values (unless termination checking has been+-- disabled and someone's written a non-sensical program), so reordering will+-- terminate.+ reorder :: [Export] -> [Export]-reorder = reorder' empty+reorder es = datas ++ funs ++ reorder' (Set.fromList $ map expName $ datas ++ funs) vals+ where+ (vs, funs) = partition isTopLevelValue es+ (datas, vals) = partition isEmptyObject vs reorder' :: Set [MemberId] -> [Export] -> [Export] reorder' defs [] = []@@ -165,6 +178,16 @@ True -> e : (reorder' (insert (expName e) defs) es) False -> reorder' defs (insertAfter us e es) +isTopLevelValue :: Export -> Bool+isTopLevelValue (Export _ e) = case e of+ Lambda{} -> False+ _ -> True++isEmptyObject :: Export -> Bool+isEmptyObject (Export _ e) = case e of+ Object m -> Map.null m+ _ -> False+ insertAfter :: Set [MemberId] -> Export -> [Export] -> [Export] insertAfter us e [] = [e] insertAfter us e (f:fs) | null us = e : f : fs@@ -178,7 +201,7 @@ curModule = do m <- (jsMod <$> curMName) is <- map jsMod <$> (iImportedModules <$> curIF)- es <- mapM definition =<< (toList <$> curDefs)+ es <- mapM definition =<< (HMap.toList <$> curDefs) return (Module m (reorder es)) definition :: (QName,Definition) -> TCM Export@@ -326,6 +349,7 @@ term (Lam _ at) = Lambda 1 <$> term (absBody at) term (Lit l) = return (literal l) term (Level l) = term =<< reallyUnLevelView l+term (Shared p) = term $ derefPtr p term (Def q as) = do d <- getConstInfo q case theDef d of
src/full/Agda/Compiler/JS/Substitution.hs view
@@ -1,7 +1,7 @@ module Agda.Compiler.JS.Substitution where import Prelude hiding ( map, lookup )-import Data.Generics ( Data, Typeable )+import Data.Typeable ( Typeable ) import Data.Map ( Map, empty, toList, unionWith, singleton, findWithDefault ) import qualified Data.Map as M ( map ) import Data.Map ( Map )
src/full/Agda/Compiler/JS/Syntax.hs view
@@ -2,7 +2,7 @@ #-} module Agda.Compiler.JS.Syntax where -import Data.Generics ( Data, Typeable )+import Data.Typeable ( Typeable ) import Data.Map ( Map, fold ) import Data.Set ( Set, empty, singleton, union ) @@ -28,29 +28,29 @@ BinOp Exp String Exp | PreOp String Exp | Const String- deriving (Typeable, Data, Show)+ deriving (Typeable, Show) -- Local identifiers are named by De Bruijn indices. -- Global identifiers are named by string lists. -- Object members are named by strings. newtype LocalId = LocalId Nat- deriving (Typeable, Data, Eq, Ord, Show)+ deriving (Typeable, Eq, Ord, Show) newtype GlobalId = GlobalId [String]- deriving (Typeable, Data, Eq, Ord, Show)+ deriving (Typeable, Eq, Ord, Show) newtype MemberId = MemberId String- deriving (Typeable, Data, Eq, Ord, Show)+ deriving (Typeable, Eq, Ord, Show) -- The top-level compilation unit is a module, which names -- the GId of its exports, and a list of definitions data Export = Export { expName :: [MemberId], defn :: Exp }- deriving (Typeable, Data, Show)+ deriving (Typeable, Show) data Module = Module { modName :: GlobalId, exports :: [Export] }- deriving (Typeable, Data, Show)+ deriving (Typeable, Show) -- Note that modules are allowed to be recursive, via the Self expression, -- which is bound to the exported module.
src/full/Agda/Compiler/MAlonzo/Compiler.hs view
@@ -3,7 +3,7 @@ module Agda.Compiler.MAlonzo.Compiler where import Control.Applicative-import qualified Control.Exception as E+import Control.Monad ((<=<)) import Control.Monad.Reader import Control.Monad.State import Data.Char@@ -14,13 +14,10 @@ import qualified Language.Haskell.Exts.Parser as HS import qualified Language.Haskell.Exts.Syntax as HS import System.Cmd-import System.Directory-import System.Exit-import System.IO-import System.Time-import System.Process-import System.FilePath hiding (normalise, (<.>))+import System.Directory (createDirectoryIfMissing)+import System.FilePath hiding (normalise) +import Agda.Compiler.CallCompiler import Agda.Compiler.MAlonzo.Misc import Agda.Compiler.MAlonzo.Pretty import Agda.Compiler.MAlonzo.Primitives@@ -32,24 +29,26 @@ import Agda.Syntax.Internal import Agda.Syntax.Literal import Agda.TypeChecking.Monad+import Agda.TypeChecking.Monad.Builtin import Agda.TypeChecking.Monad.Options import Agda.TypeChecking.Reduce-import Agda.TypeChecking.Rules.Builtin.Coinduction+-- import Agda.TypeChecking.Rules.Builtin.Coinduction import Agda.TypeChecking.Pretty import Agda.TypeChecking.Substitute+import Agda.TypeChecking.Telescope import Agda.TypeChecking.Level (reallyUnLevelView) import Agda.Utils.FileName import Agda.Utils.Monad-import qualified Agda.Utils.IO.Locale as LocIO import qualified Agda.Utils.IO.UTF8 as UTF8 import Agda.Utils.Impossible+import qualified Agda.Utils.HashMap as HMap #include "../../undefined.h" compilerMain :: Interface -> TCM () compilerMain mainI = -- Preserve the state (the compiler modifies the state).- bracket get put $ \_ -> do+ localState $ do -- Compute the output directory. opts <- commandLineOptions@@ -107,9 +106,8 @@ definitions :: Definitions -> TCM [HS.Decl] definitions defs = do kit <- coinductionKit- M.fold (liftM2 (++) . (definition kit <.> instantiateFull))- declsForPrim- defs+ HMap.foldr (liftM2 (++) . (definition kit <=< instantiateFull))+ declsForPrim defs -- | Note that the INFINITY, SHARP and FLAT builtins are translated as -- follows (if a 'CoinductionKit' is given):@@ -120,17 +118,20 @@ -- sharp :: a -> a -- sharp x = x ----- flat :: forall a. () -> forall b. () -> b -> b--- flat _ _ x = x+-- flat :: a -> a+-- flat x = x -- @ definition :: Maybe CoinductionKit -> Definition -> TCM [HS.Decl] -- ignore irrelevant definitions-definition kit (Defn Forced _ _ _ _ _ _) = __IMPOSSIBLE__-definition kit (Defn NonStrict _ _ _ _ _ _) = __IMPOSSIBLE__-definition kit (Defn Irrelevant _ _ _ _ _ _) = return []-definition kit (Defn Relevant q ty _ _ compiled d) = do- checkTypeOfMain q ty+{- Andreas, 2012-10-02: Invariant no longer holds+definition kit (Defn Forced _ _ _ _ _ _ _ _) = __IMPOSSIBLE__+definition kit (Defn UnusedArg _ _ _ _ _ _ _ _) = __IMPOSSIBLE__+definition kit (Defn NonStrict _ _ _ _ _ _ _ _) = __IMPOSSIBLE__+-}+definition kit (Defn Irrelevant _ _ _ _ _ _ _ _) = return []+definition kit (Defn _ q ty _ _ _ _ compiled d) = do+ checkTypeOfMain q ty $ do (infodecl q :) <$> case d of _ | Just (HsDefn ty hs) <- compiledHaskell compiled ->@@ -168,9 +169,9 @@ x = ihname "x" 0 return $ [ HS.TypeSig dummy [flat] $ fakeType $- "forall a. () -> forall b. () -> b -> b"+ "forall a. a -> a" , HS.FunBind [HS.Match dummy flat- [HS.PWildCard, HS.PWildCard, HS.PVar x]+ [HS.PVar x] Nothing (HS.UnGuardedRhs (HS.Var (HS.UnQual x))) (HS.BDecls [])]@@ -242,7 +243,7 @@ conArityAndPars :: QName -> TCM (Nat, Nat) conArityAndPars q = do def <- getConstInfo q- TelV tel _ <- telViewM $ defType def+ TelV tel _ <- telView $ defType def let Constructor{ conPars = np } = theDef def n = genericLength (telToList tel) return (n - np, np)@@ -301,7 +302,7 @@ irr (LitP {}) = return False irr (ConP q _ ps) = (&&) <$> singleConstructorType q- <*> (and <$> mapM irr' ps)+ <*> (andM $ L.map irr' ps) -- | Irrelevant patterns are naturally irrefutable. irr' (Arg _ Irrelevant _) = return $ True@@ -319,7 +320,7 @@ -- Types are extracted as @()@. -- @DontCare@ outside of irrelevant arguments is extracted as @error@. term :: Term -> ReaderT Nat TCM HS.Exp-term tm0 = case tm0 of+term tm0 = case ignoreSharing tm0 of Var i as -> do n <- ask; apps (hsVarUQ $ ihname "v" (n - i - 1)) as Lam _ at -> do n <- ask; HS.Lambda dummy [HS.PVar $ ihname "v" n] <$> local (1+) (term $ absBody at)@@ -335,6 +336,7 @@ Sort _ -> return HS.unit_con MetaV _ _ -> mazerror "hit MetaV" DontCare _ -> return $ rtmError $ "hit DontCare"+ Shared{} -> __IMPOSSIBLE__ where apps = foldM (\h a -> HS.App h <$> term' a) -- | Irrelevant arguments are replaced by Haskells' ().@@ -444,6 +446,7 @@ , "ExistentialQuantification" , "ScopedTypeVariables" , "NoMonomorphismRestriction"+ , "Rank2Types" ] rteModule :: HS.Module@@ -466,11 +469,19 @@ ] where parse = HS.parseWithMode- HS.defaultParseMode{HS.extensions = [HS.ExplicitForall]}-+ HS.defaultParseMode{HS.extensions = [explicitForAll]} ok (HS.ParseOk d) = d ok HS.ParseFailed{} = __IMPOSSIBLE__ +explicitForAll :: HS.Extension+explicitForAll =+-- GHC 7.0.1 cannot parse the following CPP conditional+-- error: missing binary operator before token "("+#if MIN_VERSION_haskell_src_exts(1,12,0)+ HS.ExplicitForAll+#else+ HS.ExplicitForall+#endif compileDir :: TCM FilePath compileDir = do@@ -511,6 +522,7 @@ let overridableArgs = [ "-O" , "-o", mdir </> show outputName+ , "-Werror" ] otherArgs = [ "-i" ++ mdir@@ -519,7 +531,6 @@ , "--make" , "-fwarn-incomplete-patterns" , "-fno-warn-overlapping-patterns"- , "-Werror" ] args = overridableArgs ++ opts ++ otherArgs compiler = "ghc"@@ -527,23 +538,4 @@ -- Note: Some versions of GHC use stderr for progress reports. For -- those versions of GHC we don't print any progress information -- unless an error is encountered.-- reportSLn "" 1 $ "calling: " ++ L.intercalate " " (compiler : args)- (_, _, err, p) <-- liftIO $ createProcess (proc compiler args){ std_err = CreatePipe }-- errors <- liftIO $ case err of- Nothing -> __IMPOSSIBLE__- Just err -> do- -- The handle should be in text mode.- hSetBinaryMode err False- liftIO $ LocIO.hGetContents err-- exitcode <- liftIO $ do- -- Ensure that the output has been read before waiting for the- -- process.- E.evaluate (length errors)- waitForProcess p- case exitcode of- ExitFailure _ -> typeError (CompilationError errors)- _ -> return ()+ callCompiler compiler args
src/full/Agda/Compiler/MAlonzo/Misc.hs view
@@ -3,7 +3,6 @@ module Agda.Compiler.MAlonzo.Misc where import Control.Monad.State-import Data.Generics import Data.List as L import Data.Map as M import Data.Set as S@@ -11,7 +10,6 @@ import Data.Function import qualified Language.Haskell.Exts.Syntax as HS import System.IO-import System.Time import Agda.Interaction.Imports import Agda.Syntax.Common@@ -85,9 +83,12 @@ ihname s i = HS.Ident $ s ++ show i unqhname :: String -> QName -> HS.Name+{- NOT A GOOD IDEA, see Issue 728 unqhname s q | ("d", "main") == (s, show(qnameName q)) = HS.Ident "main" | otherwise = ihname s (idnum $ nameId $ qnameName $ q)- where idnum (NameId x _) = fromIntegral x+-}+unqhname s q = ihname s (idnum $ nameId $ qnameName $ q)+ where idnum (NameId x _) = fromIntegral x -- the toplevel module containing the given one tlmodOf :: ModuleName -> TCM HS.ModuleName@@ -124,7 +125,9 @@ -- qualify name s by the module of builtin b bltQual :: String -> String -> TCM HS.QName-bltQual b s = do (Def q _) <- getBuiltin b; xqual q (HS.Ident s)+bltQual b s = do+ Def q _ <- ignoreSharing <$> getBuiltin b+ xqual q (HS.Ident s) -- sub-naming for cascaded definitions for concsecutive clauses dsubname q i | i == 0 = unqhname "d" q@@ -187,26 +190,3 @@ dummy :: a dummy = error "MAlonzo : this dummy value should not have been eval'ed."-------------------------------------------------------- For Debugging----------------------------------------------------gshow' :: Data a => a -> String-gshow' = ( \t ->- "("- ++ showConstr (toConstr t)- ++ concat (gmapQ ((++) " " . gshow') t)- ++ ")" )- `extQ` (show :: String -> String)- `extQ` (show :: Name -> String)- `extQ` (show :: QName -> String)- `extQ` (show :: ModuleName -> String)- `extQ` (gshow' . M.toList :: M.Map QName [AbstractName] -> String)- `extQ` (gshow' . M.toList :: M.Map QName [AbstractModule] -> String)- `extQ` (gshow' . M.toList :: M.Map ModuleName Section -> String)- `extQ` (gshow' . M.toList :: M.Map QName Definition -> String)- `extQ` (gshow' . M.toList :: M.Map TermHead [Pattern] -> String)- `extQ` (gshow' . M.toList :: M.Map TermHead [Arg Pattern] -> String)- `extQ` (gshow' . M.toList :: M.Map String (Builtin String) -> String)- `extQ` (show :: Scope -> String)
src/full/Agda/Compiler/MAlonzo/Pretty.hs view
@@ -2,16 +2,33 @@ -- Pretty-printing of Haskell modules ------------------------------------------------------------------------ +{-# LANGUAGE FlexibleContexts, FlexibleInstances,+ MultiParamTypeClasses, TemplateHaskell #-}+ module Agda.Compiler.MAlonzo.Pretty where -import Data.Generics+import Data.Generics.Geniplate import qualified Language.Haskell.Exts.Pretty as Pretty+import qualified Language.Haskell.Exts.Syntax as HS import Agda.Compiler.MAlonzo.Encode --- | Inserts disambiguating parentheses and encodes module names just--- before pretty-printing.+-- | Encodes module names just before pretty-printing. -prettyPrint :: (Pretty.Pretty a, Data a) => a -> String+prettyPrint :: (Pretty.Pretty a, TransformBi HS.ModuleName (Wrap a)) =>+ a -> String prettyPrint = Pretty.prettyPrint .- everywhere (mkT encodeModuleName)+ unwrap .+ transformBi encodeModuleName .+ Wrap++-- | A wrapper type used to avoid orphan instances.++newtype Wrap a = Wrap { unwrap :: a }++-- Some TransformBiT instances.++instanceTransformBiT [ [t| String |] ] [t| (HS.ModuleName, Wrap HS.Exp) |]+instanceTransformBiT [ [t| String |] ] [t| (HS.ModuleName, Wrap HS.Module) |]+instanceTransformBiT [ [t| String |] ] [t| (HS.ModuleName, Wrap HS.ModuleName) |]+instanceTransformBiT [ [t| String |] ] [t| (HS.ModuleName, Wrap HS.QName) |]
src/full/Agda/Compiler/MAlonzo/Primitives.hs view
@@ -1,3 +1,4 @@+{-# LANGUAGE CPP #-} module Agda.Compiler.MAlonzo.Primitives where import Control.Monad.Reader@@ -18,29 +19,64 @@ import Agda.TypeChecking.Substitute import Agda.TypeChecking.Pretty import Agda.Utils.Monad+import Agda.Utils.Impossible+import qualified Agda.Utils.HashMap as HMap +#include "../../undefined.h"++{- OLD -- | Check that the main function has type IO a, for some a. checkTypeOfMain :: QName -> Type -> TCM () checkTypeOfMain q ty | show (qnameName q) /= "main" = return () | otherwise = do- Def io _ <- primIO+ Def io _ <- ignoreSharing <$> primIO ty <- normalise ty- case unEl ty of+ case ignoreSharing $ unEl ty of Def d _ | d == io -> return () _ -> do err <- fsep $ pwords "The type of main should be" ++ [prettyTCM io] ++ pwords " A, for some A. The given type is" ++ [prettyTCM ty] typeError $ GenericError $ show err+-} +-- | Check that the main function has type IO a, for some a.+checkTypeOfMain :: QName -> Type -> TCM [HS.Decl] -> TCM [HS.Decl]+checkTypeOfMain q ty ret+ | show (qnameName q) /= "main" = ret+ | otherwise = do+ Def io _ <- ignoreSharing <$> primIO+ ty <- normalise ty+ case ignoreSharing $ unEl ty of+ Def d _ | d == io -> (mainAlias :) <$> ret+ _ -> do+ err <- fsep $+ pwords "The type of main should be" +++ [prettyTCM io] ++ pwords " A, for some A. The given type is" ++ [prettyTCM ty]+ typeError $ GenericError $ show err+ where+ mainAlias = HS.FunBind [HS.Match dummy mainLHS [] Nothing mainRHS $ HS.BDecls [] ]+ mainLHS = HS.Ident "main"+ mainRHS = HS.UnGuardedRhs $ HS.Var $ HS.UnQual $ unqhname "d" q+ -- Haskell modules to be imported for BUILT-INs importsForPrim :: TCM [HS.ModuleName] importsForPrim = xForPrim $ L.map (\(s, ms) -> (s, return (L.map HS.ModuleName ms))) $- [ "CHAR" |-> ["Data.Char"]- -- , "IO" |-> ["System.IO"]+ [ "CHAR" |-> ["Data.Char"]+ , "primIsDigit" |-> ["Data.Char"]+ , "primIsLower" |-> ["Data.Char"]+ , "primIsDigit" |-> ["Data.Char"]+ , "primIsAlpha" |-> ["Data.Char"]+ , "primIsSpace" |-> ["Data.Char"]+ , "primIsAscii" |-> ["Data.Char"]+ , "primIsLatin1" |-> ["Data.Char"]+ , "primIsPrint" |-> ["Data.Char"]+ , "primIsHexDigit" |-> ["Data.Char"]+ , "primToUpper" |-> ["Data.Char"]+ , "primToLower" |-> ["Data.Char"] ] where (|->) = (,) @@ -107,10 +143,15 @@ xForPrim :: [(String, TCM [a])] -> TCM [a] xForPrim table = do- qs <- keys <$> curDefs+ qs <- HMap.keys <$> curDefs bs <- toList <$> gets stBuiltinThings+ let getName (Builtin (Def q _)) = q+ getName (Builtin (Con q _)) = q+ getName (Builtin (Shared p)) = getName (Builtin $ derefPtr p)+ getName (Builtin _) = __IMPOSSIBLE__+ getName (Prim (PrimFun q _ _)) = q concat <$> sequence [ maybe (return []) id $ L.lookup s table- | (s, Builtin (Def q _)) <- bs, q `elem` qs ]+ | (s, def) <- bs, getName def `elem` qs ] -- Definition bodies for primitive functions@@ -165,7 +206,7 @@ , "primIsAscii" |-> pred "Data.Char.isAscii" , "primIsLatin1" |-> pred "Data.Char.isLatin1" , "primIsPrint" |-> pred "Data.Char.isPrint"- , "primIsHExDigit" |-> pred "Data.Char.isHexDigit"+ , "primIsHexDigit" |-> pred "Data.Char.isHexDigit" , "primToUpper" |-> return "Data.Char.toUpper" , "primToLower" |-> return "Data.Char.toLower" , "primCharToNat" |-> do toN <- bltQual' "NATURAL" mazIntToNat@@ -218,7 +259,9 @@ unimplemented = typeError $ NotImplemented s lam x t = Lam Hidden (Abs x t)+{- UNUSED var x = Arg Hidden Relevant (Var x [])+-} ----------------------
src/full/Agda/Interaction/BasicOps.hs view
@@ -17,7 +17,7 @@ import Agda.Syntax.Position import Agda.Syntax.Abstract as A hiding (Open) import Agda.Syntax.Common-import Agda.Syntax.Info(ExprInfo(..),MetaInfo(..))+import Agda.Syntax.Info(ExprInfo(..),MetaInfo(..),emptyMetaInfo) import Agda.Syntax.Internal as I import Agda.Syntax.Translation.InternalToAbstract import Agda.Syntax.Translation.AbstractToConcrete@@ -29,7 +29,7 @@ import Agda.TypeChecker import Agda.TypeChecking.Conversion-import Agda.TypeChecking.Monad as M+import Agda.TypeChecking.Monad as M hiding (MetaInfo) import Agda.TypeChecking.MetaVars import Agda.TypeChecking.Reduce import Agda.TypeChecking.Substitute@@ -39,7 +39,7 @@ import Agda.TypeChecking.Records import Agda.TypeChecking.Irrelevance (wakeIrrelevantVars) import Agda.TypeChecking.Pretty (prettyTCM)-import Agda.TypeChecking.Eliminators (unElim)+-- UNUSED: import Agda.TypeChecking.Eliminators (unElim) import qualified Agda.TypeChecking.Pretty as TP import Agda.Utils.List@@ -82,7 +82,8 @@ let t' = t `piApply` ctx v <- checkExpr e t' case mvInstantiation mv of- InstV v' -> equalTerm t' v (v' `apply` ctx)+ InstV v' -> whenM ((Irrelevant /=) <$> asks envRelevance) $+ equalTerm t' v (v' `apply` ctx) _ -> updateMeta mi v reify v IsSort{} -> __IMPOSSIBLE__@@ -93,7 +94,7 @@ mis <- getInteractionPoints r <- getInteractionRange ii updateMetaVarRange mi $ maybe r id mr- giveExpr mi e `catchError` \err -> case errError err of+ giveExpr mi e `catchError` \err -> case err of PatternErr _ -> do err <- withInteractionId ii $ TP.text "Failed to give" TP.<+> prettyTCM e typeError $ GenericError $ show err@@ -129,8 +130,9 @@ { Agda.Syntax.Info.metaRange = r , Agda.Syntax.Info.metaScope = scope { scopePrecedence = ArgumentCtx } , metaNumber = Nothing+ , metaNameSuggestion = "" }- in App (ExprRange $ r) e (defaultArg $ unnamed metaVar)+ in App (ExprRange $ r) e (defaultNamedArg metaVar) --ToDo: The position of metaVar is not correct --ToDo: The fixity of metavars is not correct -- fixed? MT @@ -151,6 +153,7 @@ data Rewrite = AsIs | Instantiated | HeadNormal | Normalised+ deriving (Read) --rewrite :: Rewrite -> Term -> TCM Term rewrite AsIs t = return t@@ -171,7 +174,7 @@ | JustSort b | CmpSorts Comparison b b | Guard (OutputConstraint a b) ProblemId | Assign b a | TypedAssign b a a- | IsEmptyType a | FindInScopeOF b+ | IsEmptyType a | FindInScopeOF b a [(a,a)] deriving (Functor) -- | A subset of 'OutputConstraint'.@@ -198,7 +201,7 @@ Assign i _ -> i TypedAssign i _ _ -> i IsEmptyType _ -> __IMPOSSIBLE__ -- Should never be used on IsEmpty constraints- FindInScopeOF _ -> __IMPOSSIBLE__+ FindInScopeOF _ _ _ -> __IMPOSSIBLE__ instance Reify ProblemConstraint (Closure (OutputForm Expr Expr)) where reify (PConstr pid cl) = enterClosure cl $ \c -> buildClosure =<< (OutputForm pid <$> reify c)@@ -230,10 +233,14 @@ OpenIFS{} -> __IMPOSSIBLE__ InstS{} -> __IMPOSSIBLE__ InstV{} -> __IMPOSSIBLE__- reify (FindInScope m) = do+ reify (FindInScope m cands) = do m' <- reify (MetaV m [])- return $ FindInScopeOF m' -- IFSTODO- reify (IsEmpty a) = IsEmptyType <$> reify a+ ctxArgs <- getContextArgs+ t <- getMetaType m+ t' <- reify t+ cands' <- mapM (\(tm,ty) -> (,) <$> reify tm <*> reify ty) cands+ return $ FindInScopeOF m' t' cands' -- IFSTODO+ reify (IsEmpty r a) = IsEmptyType <$> reify a showComparison :: Comparison -> String showComparison CmpEq = " = "@@ -257,7 +264,9 @@ show (Assign m e) = show m ++ " := " ++ show e show (TypedAssign m e a) = show m ++ " := " ++ show e ++ " :? " ++ show a show (IsEmptyType a) = "Is empty: " ++ show a- show (FindInScopeOF s) = "Find in Scope: " ++ show s+ show (FindInScopeOF s t cs) = "Resolve implicit argument " ++ showCand (s,t) ++ ". Candidates: [" +++ intercalate ", " (map showCand cs) ++ "]"+ where showCand (tm,ty) = show tm ++ " : " ++ show ty instance (ToConcrete a c, ToConcrete b d) => ToConcrete (OutputForm a b) (OutputForm c d) where@@ -285,7 +294,9 @@ toConcrete (TypedAssign m e a) = TypedAssign <$> toConcrete m <*> toConcreteCtx TopCtx e <*> toConcreteCtx TopCtx a toConcrete (IsEmptyType a) = IsEmptyType <$> toConcreteCtx TopCtx a- toConcrete (FindInScopeOF s) = FindInScopeOF <$> toConcrete s+ toConcrete (FindInScopeOF s t cs) =+ FindInScopeOF <$> toConcrete s <*> toConcrete t+ <*> mapM (\(tm,ty) -> (,) <$> toConcrete tm <*> toConcrete ty) cs instance (Pretty a, Pretty b) => Pretty (OutputConstraint' a b) where pretty (OfType' e t) = pretty e <+> text ":" <+> pretty t@@ -297,8 +308,14 @@ --ToDo: Move somewhere else instance ToConcrete InteractionId C.Expr where toConcrete (InteractionId i) = return $ C.QuestionMark noRange (Just i)+{- UNUSED instance ToConcrete MetaId C.Expr where- toConcrete (MetaId i) = return $ C.Underscore noRange (Just i)+ toConcrete x@(MetaId i) = do+ return $ C.Underscore noRange (Just $ "_" ++ show i)+-}+instance ToConcrete NamedMeta C.Expr where+ toConcrete i = do+ return $ C.Underscore noRange (Just $ show i) judgToOutputForm :: Judgement a c -> OutputConstraint a c judgToOutputForm (HasType e t) = OfType e t@@ -316,7 +333,7 @@ toOutputForm (ii, mi, e) = do mv <- getMetaInfo <$> lookupMeta mi withMetaInfo mv $ do- let m = QuestionMark $ MetaInfo noRange emptyScopeInfo (Just $ fromIntegral ii)+ let m = QuestionMark $ emptyMetaInfo { metaNumber = Just $ fromIntegral ii } abstractToConcrete_ $ OutputForm 0 $ Assign m e getSolvedInteractionPoints :: TCM [(InteractionId, MetaId, Expr)]@@ -340,25 +357,30 @@ BlockedConst{} -> unsol PostponedTypeCheckingProblem{} -> unsol -typeOfMetaMI :: Rewrite -> MetaId -> TCM (OutputConstraint Expr MetaId)+typeOfMetaMI :: Rewrite -> MetaId -> TCM (OutputConstraint Expr NamedMeta) typeOfMetaMI norm mi = do mv <- lookupMeta mi withMetaInfo (getMetaInfo mv) $ rewriteJudg mv (mvJudgement mv) where rewriteJudg mv (HasType i t) = do+ ms <- getMetaNameSuggestion i t <- rewrite norm t vs <- getContextArgs+ let x = NamedMeta ms i reportSDoc "interactive.meta" 10 $ TP.vcat [ TP.text $ unwords ["permuting", show i, "with", show $ mvPermutation mv] , TP.nest 2 $ TP.vcat [ TP.text "len =" TP.<+> TP.text (show $ length vs) , TP.text "args =" TP.<+> prettyTCM vs , TP.text "t =" TP.<+> prettyTCM t+ , TP.text "x =" TP.<+> TP.text (show x) ] ]- OfType i <$> reify (t `piApply` permute (takeP (size vs) $ mvPermutation mv) vs)- rewriteJudg mv (IsSort i t) = return $ JustSort i+ OfType x <$> reify (t `piApply` permute (takeP (size vs) $ mvPermutation mv) vs)+ rewriteJudg mv (IsSort i t) = do+ ms <- getMetaNameSuggestion i+ return $ JustSort $ NamedMeta ms i typeOfMeta :: Rewrite -> InteractionId -> TCM (OutputConstraint Expr InteractionId)@@ -371,7 +393,7 @@ typesOfVisibleMetas norm = liftTCM $ mapM (typeOfMeta norm) =<< getInteractionPoints -typesOfHiddenMetas :: Rewrite -> TCM [OutputConstraint Expr MetaId]+typesOfHiddenMetas :: Rewrite -> TCM [OutputConstraint Expr NamedMeta] typesOfHiddenMetas norm = liftTCM $ do is <- getInteractionMetas store <- Map.filterWithKey (openAndImplicit is) <$> getMetaStore@@ -394,7 +416,7 @@ visible _ = __IMPOSSIBLE__ reifyContext xs = reverse <$> zipWithM out [1..] xs - out i (Arg h _ (x, t)) = escapeContext i $ do+ out i (Dom h _ (x, t)) = escapeContext i $ do t' <- reify =<< rewrite norm t return $ OfType x t' @@ -424,22 +446,22 @@ withMetaId :: MetaId -> TCM a -> TCM a withMetaId m ret = do- info <- lookupMeta m- withMetaInfo (mvInfo info) ret+ mv <- lookupMeta m+ withMetaInfo' mv ret -- The intro tactic -- Returns the terms (as strings) that can be -- used to refine the goal. Uses the coverage checker -- to find out which constructors are possible.-introTactic :: InteractionId -> TCM [String]-introTactic ii = do+introTactic :: Bool -> InteractionId -> TCM [String]+introTactic pmLambda ii = do mi <- lookupInteractionId ii mv <- lookupMeta mi withMetaInfo (getMetaInfo mv) $ case mvJudgement mv of HasType _ t -> do t <- reduce =<< piApply t <$> getContextArgs- case unEl t of+ case ignoreSharing $ unEl t of I.Def d _ -> do def <- getConstInfo d case theDef def of@@ -464,27 +486,34 @@ introFun tel = addCtxTel tel' $ do imp <- showImplicitArguments- let okHiding h = imp || h == NotHidden- vars <- mapM showTCM [ Arg h Relevant (I.Var i [])- | (h, i) <- zip hs $ reverse [0..n - 1]- , okHiding h- ]- return [ unwords $ ["λ"] ++ vars ++ ["→", "?"] ]+ let okHiding0 h = imp || h == NotHidden+ -- if none of the vars were displayed, we would get a parse error+ -- thus, we switch to displaying all+ allHidden = null (filter okHiding0 hs)+ okHiding = if allHidden then const True else okHiding0+ vars <- -- setShowImplicitArguments (imp || allHidden) $+ (if allHidden then withShowAllArguments else id) $+ mapM showTCM [ Arg h Relevant (var i)+ | (h, i) <- zip hs $ downFrom n+ , okHiding h+ ]+ if pmLambda+ then return [ unwords $ ["λ", "{"] ++ vars ++ ["→", "?", "}"] ]+ else return [ unwords $ ["λ"] ++ vars ++ ["→", "?"] ] where n = size tel- hs = map argHiding $ telToList tel+ hs = map domHiding $ telToList tel tel' = telFromList [ fmap makeName b | b <- telToList tel ] makeName ("_", t) = ("x", t) makeName (x, t) = (x, t) introData t = do- let tel = telFromList [defaultArg ("_", t)]- perm = idP 1+ let tel = telFromList [domFromArg $ defaultArg ("_", t)] pat = [defaultArg (I.VarP "c")]- r <- split CoInductive tel perm pat 0+ r <- splitLast CoInductive tel pat case r of Left err -> return []- Right cs -> mapM showTCM $ concatMap (conName . scPats) cs+ Right cov -> mapM showTCM $ concatMap (conName . scPats) $ splitClauses cov introRec d = do hfs <- getRecordFieldNames d@@ -517,7 +546,7 @@ M.withCurrentModule current $ withScope_ scope $ addContext (zipWith' (fmap . (,))- (map snd $ scopeLocals scope)+ (reverse $ map snd $ scopeLocals scope) (map (fmap snd) $ telToList tel)) $ m
src/full/Agda/Interaction/CommandLine/CommandLine.hs view
@@ -10,7 +10,6 @@ import Data.Map as Map import Data.List as List import Data.Maybe-import qualified Agda.Utils.IO.Locale as LocIO import Agda.Interaction.BasicOps as BasicOps hiding (parseExpr) import Agda.Interaction.Monad@@ -69,16 +68,16 @@ do case matchCommand cmd cmds of Right c -> go =<< liftTCM (c args) Left [] ->- do liftIO $ LocIO.putStrLn $ "Unknown command '" ++ cmd ++ "'"+ do liftIO $ putStrLn $ "Unknown command '" ++ cmd ++ "'" loop Left xs ->- do liftIO $ LocIO.putStrLn $ "More than one command match: " ++ concat (intersperse ", " xs)+ do liftIO $ putStrLn $ "More than one command match: " ++ concat (intersperse ", " xs) loop Just _ -> do go =<< liftTCM (eval $ fromJust ms) `catchError` \e -> do s <- liftTCM $ prettyError e- liftIO $ LocIO.putStrLn s+ liftIO $ putStrLn s loop -- | The interaction loop.@@ -100,8 +99,8 @@ Nothing -> emptyScopeInfo `catchError` \e -> do s <- prettyError e- liftIO $ LocIO.putStrLn s- liftIO $ LocIO.putStrLn "Failed."+ liftIO $ putStrLn s+ liftIO $ putStrLn "Failed." commands = [ "quit" |> \_ -> return $ Return ()@@ -130,13 +129,13 @@ loadFile reload [file] = do setInputFile file reload-loadFile _ _ = liftIO $ LocIO.putStrLn ":load file"+loadFile _ _ = liftIO $ putStrLn ":load file" showConstraints :: [String] -> TCM () showConstraints [] = do cs <- BasicOps.getConstraints- liftIO $ LocIO.putStrLn $ unlines (List.map show cs)-showConstraints _ = liftIO $ LocIO.putStrLn ":constraints [cid]"+ liftIO $ putStrLn $ unlines (List.map show cs)+showConstraints _ = liftIO $ putStrLn ":constraints [cid]" showMetas :: [String] -> TCM ()@@ -146,21 +145,21 @@ s <- typeOfMeta AsIs i r <- getInteractionRange i d <- showA s- liftIO $ LocIO.putStrLn $ d ++ " " ++ show r+ liftIO $ putStrLn $ d ++ " " ++ show r showMetas [m,"normal"] = do i <- InteractionId <$> readM m withInteractionId i $ do s <- showA =<< typeOfMeta Normalised i r <- getInteractionRange i- liftIO $ LocIO.putStrLn $ s ++ " " ++ show r+ liftIO $ putStrLn $ s ++ " " ++ show r showMetas [] = do interactionMetas <- typesOfVisibleMetas AsIs hiddenMetas <- typesOfHiddenMetas AsIs- mapM_ (liftIO . LocIO.putStrLn) =<< mapM showII interactionMetas+ mapM_ (liftIO . putStrLn) =<< mapM showII interactionMetas mapM_ print' hiddenMetas where showII o = withInteractionId (outputFormId $ OutputForm 0 o) $ showA o- showM o = withMetaId (outputFormId $ OutputForm 0 o) $ showA o+ showM o = withMetaId (nmid $ outputFormId $ OutputForm 0 o) $ showA o metaId (OfType i _) = i metaId (JustType i) = i@@ -168,23 +167,23 @@ metaId (Assign i e) = i metaId _ = __IMPOSSIBLE__ print' x = do- r <- getMetaRange (metaId x)+ r <- getMetaRange $ nmid $ metaId x d <- showM x- liftIO $ LocIO.putStrLn $ d ++ " [ at " ++ show r ++ " ]"-showMetas _ = liftIO $ LocIO.putStrLn $ ":meta [metaid]"+ liftIO $ putStrLn $ d ++ " [ at " ++ show r ++ " ]"+showMetas _ = liftIO $ putStrLn $ ":meta [metaid]" showScope :: TCM () showScope = do scope <- getScope- liftIO $ LocIO.print scope+ liftIO $ print scope metaParseExpr :: InteractionId -> String -> TCM A.Expr metaParseExpr ii s = do m <- lookupInteractionId ii scope <- getMetaScope <$> lookupMeta m r <- getRange <$> lookupMeta m- --liftIO $ LocIO.putStrLn $ show scope+ --liftIO $ putStrLn $ show scope let pos = case rStart r of Nothing -> __IMPOSSIBLE__ Just pos -> pos@@ -204,7 +203,7 @@ giveMeta s | length s >= 2 = do actOnMeta s (\ii -> \e -> give ii Nothing e) return ()-giveMeta _ = liftIO $ LocIO.putStrLn $ ": give" ++ " metaid expr"+giveMeta _ = liftIO $ putStrLn $ ": give" ++ " metaid expr" @@ -212,7 +211,7 @@ refineMeta s | length s >= 2 = do actOnMeta s (\ii -> \e -> refine ii Nothing e) return ()-refineMeta _ = liftIO $ LocIO.putStrLn $ ": refine" ++ " metaid expr"+refineMeta _ = liftIO $ putStrLn $ ": refine" ++ " metaid expr" @@ -223,8 +222,8 @@ evalIn :: [String] -> TCM () evalIn s | length s >= 2 = do d <- actOnMeta s $ \_ e -> prettyA =<< evalInCurrent e- liftIO $ LocIO.print d-evalIn _ = liftIO $ LocIO.putStrLn ":eval metaid expr"+ liftIO $ print d+evalIn _ = liftIO $ putStrLn ":eval metaid expr" parseExpr :: String -> TCM A.Expr parseExpr s = do@@ -236,7 +235,7 @@ do e <- parseExpr s v <- evalInCurrent e e <- prettyTCM v- liftIO $ LocIO.putStrLn $ show e+ liftIO $ putStrLn $ show e return Continue where evalInCurrent e = do@@ -250,22 +249,22 @@ do e <- parseExpr (unwords s) e0 <- typeInCurrent Normalised e e1 <- typeInCurrent AsIs e- liftIO . LocIO.putStrLn =<< showA e1+ liftIO . putStrLn =<< showA e1 typeIn :: [String] -> TCM () typeIn s@(_:_:_) = actOnMeta s $ \i e -> do e1 <- typeInMeta i Normalised e e2 <- typeInMeta i AsIs e- liftIO . LocIO.putStrLn =<< showA e1-typeIn _ = liftIO $ LocIO.putStrLn ":typeIn meta expr"+ liftIO . putStrLn =<< showA e1+typeIn _ = liftIO $ putStrLn ":typeIn meta expr" showContext :: [String] -> TCM () showContext (meta:args) = do i <- InteractionId <$> readM meta mi <- lookupMeta =<< lookupInteractionId i withMetaInfo (getMetaInfo mi) $ do- ctx <- List.map unArg . telToList <$> getContextTelescope+ ctx <- List.map unDom . telToList <$> getContextTelescope zipWithM_ display ctx $ reverse $ zipWith const [1..] ctx where display (x, t) n = do@@ -273,8 +272,8 @@ ["normal"] -> normalise $ raise n t _ -> return $ raise n t d <- prettyTCM t- liftIO $ LocIO.print $ text x <+> text ":" <+> d-showContext _ = liftIO $ LocIO.putStrLn ":Context meta"+ liftIO $ print $ text x <+> text ":" <+> d+showContext _ = liftIO $ putStrLn ":Context meta" -- | The logo that prints when Agda is started in interactive mode. splashScreen :: String@@ -294,7 +293,7 @@ -- | The help message help :: [Command a] -> IO ()-help cs = LocIO.putStr $ unlines $+help cs = putStr $ unlines $ [ "Command overview" ] ++ List.map explain cs ++ [ "<exp> Infer type of expression <exp> and evaluate it." ] where
src/full/Agda/Interaction/EmacsCommand.hs view
@@ -1,16 +1,20 @@ --------------------------------------------------------------------------- | Low-level code for instructing Emacs to do things+-- | Code for instructing Emacs to do things ------------------------------------------------------------------------ {-# LANGUAGE TypeSynonymInstances, FlexibleInstances #-} module Agda.Interaction.EmacsCommand ( Lisp(..)+ , response , putResponse+ , display_info'+ , clearRunningInfo+ , displayRunningInfo ) where -import qualified Agda.Utils.IO.Locale as LocIO import Agda.Utils.Pretty+import Agda.Utils.String -- | Simple Emacs Lisp expressions. @@ -30,16 +34,56 @@ pretty (L xs) = parens (hsep (map pretty xs)) pretty (Q x) = text "'" <> pretty x -instance Pretty String where pretty = text+instance Pretty String where+ pretty = text -instance Pretty a => Show (Lisp a) where show = show . pretty+instance Pretty a => Show (Lisp a) where+ show = show . pretty -- | Formats a response command.-+--+-- Replaces @'\n'@ with spaces to ensure that each command is a+-- single line. response :: Lisp String -> String-response l = show (text "agda2_mode_code" <+> pretty l)+response = (++ "\n") . map replaceNewLines . show . pretty+ where+ replaceNewLines '\n' = ' '+ replaceNewLines c = c -- | Writes a response command to standard output. putResponse :: Lisp String -> IO ()-putResponse = LocIO.putStrLn . response+putResponse = putStr . response++-- | @display_info' append header content@ displays @content@ (with+-- header @header@) in some suitable way. If @append@ is @True@, then+-- the content is appended to previous content (if any), otherwise any+-- previous content is deleted.++display_info' :: Bool -> String -> String -> Lisp String+display_info' append bufname content =+ L [ A "agda2-info-action"+ , A (quote bufname)+ , A (quote content)+ , A (if append then "t" else "nil")+ ]++------------------------------------------------------------------------+-- Running info++-- | The name of the running info buffer.++runningInfoBufferName :: String+runningInfoBufferName = "*Type-checking*"++-- | Clear the running info buffer.++clearRunningInfo :: Lisp String+clearRunningInfo =+ display_info' False runningInfoBufferName ""++-- | Display running information about what the type-checker is up to.++displayRunningInfo :: String -> Lisp String+displayRunningInfo s =+ display_info' True runningInfoBufferName s
src/full/Agda/Interaction/Exceptions.hs view
@@ -3,8 +3,8 @@ -} module Agda.Interaction.Exceptions where -import Prelude hiding (catch)-import Control.Exception+import Prelude+import Control.Exception as E import Control.Monad.Trans import System.Exit @@ -17,6 +17,6 @@ -- | Note that 'failOnException' only catches 'ParseError's. failOnException :: (Range -> String -> IO a) -> IO a -> IO a-failOnException h m = m `catch` handleParseException handler+failOnException h m = m `E.catch` handleParseException handler where handler x = h (getRange x) (show x)
src/full/Agda/Interaction/FindFile.hs view
@@ -26,7 +26,6 @@ import Data.Map (Map) import qualified Data.Map as Map import System.FilePath-import System.Directory import Agda.Syntax.Concrete import Agda.Syntax.Parser@@ -105,7 +104,7 @@ [".agda", ".lagda"] ] existingFiles <-- liftIO $ filterM (doesFileExist . filePath) files+ liftIO $ filterM (doesFileExistCaseSensitive . filePath) files return $ case nub existingFiles of [] -> (Left (NotFound files), modFile) [file] -> (Right file, Map.insert m file modFile)@@ -121,7 +120,7 @@ findInterfaceFile :: TopLevelModuleName -> TCM (Maybe AbsolutePath) findInterfaceFile m = do f <- toIFile <$> findFile m- ex <- liftIO $ doesFileExist $ filePath f+ ex <- liftIO $ doesFileExistCaseSensitive $ filePath f return $ if ex then Just f else Nothing -- | Ensures that the module name matches the file name. The file
+ src/full/Agda/Interaction/GhcTop.hs view
@@ -0,0 +1,124 @@+{-# LANGUAGE CPP, ScopedTypeVariables, FlexibleInstances #-}+module Agda.Interaction.GhcTop+ ( mimicGHCi+ ) where++import Data.List+import Data.Maybe+import Control.Monad.Error+import Control.Monad.State++import System.Directory+import System.Environment+import System.IO++import Agda.Utils.Pretty+import Agda.Utils.String++import Agda.TypeChecking.Monad++import Agda.Interaction.Response+import Agda.Interaction.InteractionTop+import Agda.Interaction.EmacsCommand+import Agda.Interaction.Highlighting.Emacs++----------------------------------++-- | 'mimicGHCi' is a fake ghci interpreter for the Emacs frontend+-- and for interaction tests.+--+-- 'mimicGHCi' reads the Emacs frontend commands from stdin,+-- interprets them and print the result into stdout.++mimicGHCi :: TCM ()+mimicGHCi = do++ liftIO $ hSetBuffering stdout NoBuffering++ modify $ \st -> st { stInteractionOutputCallback =+ liftIO . putStrLn . show <=< lispifyResponse }++ opts <- commandLineOptions+ _ <- interact' `runCommandM` initCommandState { optionsOnReload = opts }+ return ()+ where++ interact' :: CommandM ()+ interact' = do+ liftIO $ putStr "Agda2> "+ b <- liftIO isEOF+ if b then return () else do+ r <- liftIO getLine+ _ <- return $! length r -- force to read the full input line+ case dropWhile (==' ') r of+ "" -> return ()+ ('-':'-':_) -> return ()+ _ -> case listToMaybe $ reads r of+ Just (x, "") -> runInteraction x+ Just (_, rem) -> liftIO $ putStrLn $ "not consumed: " ++ rem+ _ -> liftIO $ putStrLn $ "cannot read: " ++ r+ interact'+++-- | Convert Response to an elisp value for the interactive emacs frontend.++lispifyResponse :: Response -> TCM (Lisp String)+lispifyResponse (Resp_HighlightingInfo info modFile) =+ lispifyHighlightingInfo info modFile+lispifyResponse (Resp_DisplayInfo info) = return $ case info of+ Info_CompilationOk -> f "The module was successfully compiled." "*Compilation result*"+ Info_Constraints s -> f s "*Constraints*"+ Info_AllGoals s -> f s "*All Goals*"+ Info_Auto s -> f s "*Auto*"+ Info_Error s -> f s "*Error*"++ Info_NormalForm s -> f (render s) "*Normal Form*" -- show?+ Info_InferredType s -> f (render s) "*Inferred Type*"+ Info_CurrentGoal s -> f (render s) "*Current Goal*"+ Info_GoalType s -> f (render s) "*Goal type etc.*"+ Info_ModuleContents s -> f (render s) "*Module contents*"+ Info_Context s -> f (render s) "*Context*"+ Info_Intro s -> f (render s) "*Intro*"+ where f content bufname = display_info' False bufname content+lispifyResponse Resp_ClearHighlighting = return $ L [ A "agda2-highlight-clear" ]+lispifyResponse Resp_ClearRunningInfo = return $ clearRunningInfo+lispifyResponse (Resp_RunningInfo s) = return $ displayRunningInfo $ s ++ "\n"+lispifyResponse (Resp_Status s)+ = return $ L [ A "agda2-status-action"+ , A (quote $ intercalate "," $ catMaybes [checked, showImpl])+ ]+ where+ boolToMaybe b x = if b then Just x else Nothing++ checked = boolToMaybe (sChecked s) "Checked"+ showImpl = boolToMaybe (sShowImplicitArguments s) "ShowImplicit"++lispifyResponse (Resp_JumpToError f p) = return $ lastTag 3 $+ L [ A "agda2-goto", Q $ L [A (quote f), A ".", A (show p)] ]+lispifyResponse (Resp_InteractionPoints is) = return $ lastTag 1 $+ L [A "agda2-goals-action", Q $ L $ map showNumIId is]+lispifyResponse (Resp_GiveAction ii s)+ = return $ L [A "agda2-give-action", showNumIId ii, A s']+ where+ s' = case s of+ Give_String str -> quote str+ Give_Paren -> "'paren"+ Give_NoParen -> "'no-paren"+lispifyResponse (Resp_MakeCaseAction cs) = return $ lastTag 2 $+ L [A "agda2-make-case-action", Q $ L $ map (A . quote) cs]+lispifyResponse (Resp_MakeCase cmd pcs) = return $ lastTag 2 $+ L [A cmd, Q $ L $ map (A . quote) pcs]+lispifyResponse (Resp_SolveAll ps) = return $ lastTag 2 $+ L [A "agda2-solveAll-action", Q . L $ concatMap prn ps]+ where+ prn (ii,e)= [showNumIId ii, A $ quote $ show e]++-- | Adds a \"last\" tag to a response.++lastTag :: Integer -> Lisp String -> Lisp String+lastTag n r = Cons (Cons (A "last") (A $ show n)) r++-- | Show an iteraction point identifier as an elisp expression.++showNumIId :: InteractionId -> Lisp String+showNumIId = A . tail . show
− src/full/Agda/Interaction/GhciTop.hs
@@ -1,1083 +0,0 @@-{-# LANGUAGE CPP, TypeSynonymInstances, FlexibleInstances #-}-{-# OPTIONS -fno-cse #-}--module Agda.Interaction.GhciTop- ( module Agda.Interaction.GhciTop- , module Agda.TypeChecker- , module Agda.TypeChecking.MetaVars- , module Agda.TypeChecking.Reduce- , module Agda.TypeChecking.Errors-- , module Agda.Syntax.Position- , module Agda.Syntax.Parser--- , module SC -- trivial clash removal: remove all!--- , module SA--- , module SI- , module Agda.Syntax.Scope.Base- , module Agda.Syntax.Scope.Monad- , module Agda.Syntax.Translation.ConcreteToAbstract- , module Agda.Syntax.Translation.AbstractToConcrete- , module Agda.Syntax.Translation.InternalToAbstract- , module Agda.Syntax.Abstract.Name-- , module Agda.Interaction.Exceptions-- , mkAbsolute- )- where--import System.Directory-import qualified System.IO as IO-import System.IO.Unsafe-import Data.Char-import Data.Maybe-import Data.IORef-import Data.Function-import Control.Applicative--import Agda.Utils.Fresh-import Agda.Utils.Monad-import Agda.Utils.Pretty as P-import Agda.Utils.String-import Agda.Utils.FileName-import qualified Agda.Utils.Trie as Trie-import Agda.Utils.Tuple-import qualified Agda.Utils.IO.UTF8 as UTF8--import Control.Monad.Error-import Control.Monad.Reader-import Control.Monad.State hiding (State)-import Control.Exception-import Data.List as List-import qualified Data.Map as Map-import System.Exit-import qualified System.Mem as System-import System.Time-import Text.PrettyPrint--import Agda.TypeChecker-import Agda.TypeChecking.Monad as TM- hiding (initState, setCommandLineOptions)-import qualified Agda.TypeChecking.Monad as TM-import Agda.TypeChecking.MetaVars-import Agda.TypeChecking.Reduce-import Agda.TypeChecking.Errors--import Agda.Syntax.Fixity-import Agda.Syntax.Position-import Agda.Syntax.Parser-import qualified Agda.Syntax.Parser.Tokens as T-import Agda.Syntax.Concrete as SC-import Agda.Syntax.Common as SCo-import Agda.Syntax.Concrete.Name as CN-import Agda.Syntax.Concrete.Pretty ()-import Agda.Syntax.Abstract as SA-import Agda.Syntax.Abstract.Pretty-import Agda.Syntax.Internal as SI-import Agda.Syntax.Scope.Base-import Agda.Syntax.Scope.Monad hiding (bindName, withCurrentModule)-import qualified Agda.Syntax.Info as Info-import Agda.Syntax.Translation.ConcreteToAbstract-import Agda.Syntax.Translation.AbstractToConcrete hiding (withScope)-import Agda.Syntax.Translation.InternalToAbstract-import Agda.Syntax.Abstract.Name--import Agda.Interaction.EmacsCommand-import Agda.Interaction.Exceptions-import Agda.Interaction.FindFile-import Agda.Interaction.Options-import Agda.Interaction.MakeCase-import qualified Agda.Interaction.BasicOps as B-import Agda.Interaction.Highlighting.Emacs-import Agda.Interaction.Highlighting.Generate-import qualified Agda.Interaction.Imports as Imp--import Agda.Termination.TermCheck--import qualified Agda.Compiler.Epic.Compiler as Epic-import qualified Agda.Compiler.MAlonzo.Compiler as MAlonzo-import qualified Agda.Compiler.JS.Compiler as JS--import qualified Agda.Auto.Auto as Auto--#include "../undefined.h"-import Agda.Utils.Impossible--data State = State- { theTCState :: TCState- , theInteractionPoints :: [InteractionId]- -- ^ The interaction points of the buffer, in the order in which- -- they appear in the buffer. The interaction points are- -- recorded in 'theTCState', but when new interaction points are- -- added by give or refine Agda does not ensure that the ranges- -- of later interaction points are updated.- , theCurrentFile :: Maybe (AbsolutePath, ClockTime)- -- ^ The file which the state applies to. Only stored if the- -- module was successfully type checked (potentially with- -- warnings). The 'ClockTime' is the modification time stamp of- -- the file when it was last loaded.- }--initState :: State-initState = State- { theTCState = TM.initState- , theInteractionPoints = []- , theCurrentFile = Nothing- }--{-# NOINLINE theState #-}-theState :: IORef State-theState = unsafePerformIO $ newIORef initState---- | Can the command run even if the relevant file has not been loaded--- into the state?--data Independence- = Independent (Maybe [FilePath])- -- ^ Yes. If the argument is @'Just' is@, then @is@ is used as the- -- command's include directories.- | Dependent- -- No.---- | An interactive computation.--data Interaction = Interaction- { independence :: Independence- -- ^ Is the command independent?- , command :: TCM (Maybe ModuleName)- -- ^ If a module name is returned, then syntax highlighting- -- information will be written for the given module (by 'ioTCM').- }---- ^ Is the command independent?--isIndependent :: Interaction -> Bool-isIndependent i = case independence i of- Independent {} -> True- Dependent {} -> False---- | Run a TCM computation in the current state. Should only--- be used for debugging.-ioTCM_ :: TCM a -> IO a-ioTCM_ m = do- tcs <- readIORef theState- result <- runTCM $ do- put $ theTCState tcs- x <- withEnv initEnv m- s <- get- return (x, s)- case result of- Right (x, s) -> do- writeIORef theState $ tcs { theTCState = s }- return x- Left err -> do- Right doc <- runTCM $ prettyTCM err- putStrLn $ render doc- return __IMPOSSIBLE__-{-- Right (x, s) <- runTCM $ do- put $ theTCState tcs- x <- withEnv initEnv m- s <- get- return (x, s)- writeIORef theState $ tcs { theTCState = s }- return x--}---- | Runs a 'TCM' computation. All calls from the Emacs mode should be--- wrapped in this function.--ioTCM :: FilePath- -- ^ The current file. If this file does not match- -- 'theCurrentFile', and the 'Interaction' is not- -- \"independent\", then an error is raised.- -> Maybe FilePath- -- ^ Syntax highlighting information will be written to this- -- file, if any.- -> Interaction- -> IO ()-ioTCM current highlightingFile cmd = infoOnException $ do-#if MIN_VERSION_base(4,2,0)- -- Ensure that UTF-8 is used for communication with the Emacs mode.- IO.hSetEncoding IO.stdout IO.utf8-#endif-- current <- absolute current-- -- Read the state.- State { theTCState = st } <- readIORef theState-- -- Run the computation.- r <- runTCM $ catchError (do- put st- x <- withEnv initEnv $ do- case independence cmd of- Dependent -> ensureFileLoaded current- Independent Nothing ->- -- Make sure that the include directories have- -- been set.- setCommandLineOptions =<< commandLineOptions- Independent (Just is) -> do- ex <- liftIO $ doesFileExist $ filePath current- setIncludeDirs is $- if ex then ProjectRoot current else CurrentDir- command cmd- st <- get- return (Right (x, st))- ) (\e -> do- pers <- stPersistent <$> get- s <- prettyError e- return (Left (pers, s, e))- )-- -- Upon success: update the state. Upon failure: update the- -- persistent state, and, for independent commands, the current- -- file.- case r of- Right (Right (m, st')) ->- modifyIORef theState $ \s ->- s { theTCState = st'- }- Right (Left (pers, _, _)) -> do- modifyIORef theState $ \s ->- s { theTCState = (theTCState s) { stPersistent = pers }- }- Left _ -> return ()- when (isIndependent cmd) $- case r of- Right (Right _) -> return ()- _ ->- modifyIORef theState $ \s ->- s { theCurrentFile = Nothing- }-- -- Write out syntax highlighting info.- case highlightingFile of- Nothing -> return ()- Just f -> do- let errHi e s = errHighlighting e- `mplus`- ((\h -> (h, Map.empty)) <$>- generateErrorInfo (getRange e) s)- UTF8.writeFile f $- showHighlightingInfo $- case r of- Right (Right (mm, st')) -> do- m <- mm- mi <- Map.lookup (SA.toTopLevelModuleName m)- (stVisitedModules st')- return ( iHighlighting $ miInterface mi- , stModuleToSource st'- )- Right (Left (_ , s, e)) -> errHi e (Just s)- Left e -> errHi e Nothing-- -- If an error was encountered, display an error message and exit- -- with an error code; otherwise, inform Emacs about the buffer's- -- goals (if current matches the new current file).- let errStatus = Status { sChecked = False- , sShowImplicitArguments =- optShowImplicit $ stPragmaOptions st- }- case r of- Right (Left (_, s, e)) -> displayErrorAndExit errStatus (getRange e) s- Left e -> displayErrorAndExit errStatus (getRange e) $- tcErrString e- Right (Right _) -> do- f <- theCurrentFile <$> readIORef theState- case f of- Just (f, _) | f === current -> do- is <- theInteractionPoints <$> liftIO (readIORef theState)- liftIO $ putResponse $- L [A "agda2-goals-action", Q $ L $ List.map showNumIId is]- _ -> return ()---- | @cmd_load m includes@ loads the module in file @m@, using--- @includes@ as the include directories.--cmd_load :: FilePath -> [FilePath] -> Interaction-cmd_load m includes =- cmd_load' m includes True (\_ -> command cmd_metas >> return ())---- | @cmd_load' m includes cmd cmd2@ loads the module in file @m@,--- using @includes@ as the include directories.------ If type checking completes without any exceptions having been--- encountered then the command @cmd r@ is executed, where @r@ is the--- result of 'Imp.typeCheck'.--cmd_load' :: FilePath -> [FilePath]- -> Bool -- ^ Allow unsolved meta-variables?- -> ((Interface, Maybe Imp.Warnings) -> TCM ())- -> Interaction-cmd_load' file includes unsolvedOK cmd =- Interaction (Independent (Just includes)) $ do- -- Forget the previous "current file" and interaction points.- liftIO $ modifyIORef theState $ \s ->- s { theInteractionPoints = []- , theCurrentFile = Nothing- }-- f <- liftIO $ absolute file- t <- liftIO $ getModificationTime file-- -- All options (except for the verbosity setting) are reset when a- -- file is reloaded, including the choice of whether or not to- -- display implicit arguments. (At this point the include- -- directories have already been set, so they are preserved.)- opts <- commandLineOptions- setCommandLineOptions $- defaultOptions { optIncludeDirs = optIncludeDirs opts- , optPragmaOptions =- (optPragmaOptions defaultOptions)- { optAllowUnsolved = unsolvedOK- , optVerbose = optVerbose (optPragmaOptions opts)- }- }-- -- Reset the state, preserving options and decoded modules. Note- -- that if the include directories have changed, then the decoded- -- modules are reset when cmd_load' is run by ioTCM.- resetState-- ok <- Imp.typeCheck f-- -- The module type checked. If the file was not changed while the- -- type checker was running then the interaction points and the- -- "current file" are stored.- t' <- liftIO $ getModificationTime file- when (t == t') $ do- is <- sortInteractionPoints =<< getInteractionPoints- liftIO $ modifyIORef theState $ \s ->- s { theInteractionPoints = is- , theCurrentFile = Just (f, t)- }-- cmd ok-- liftIO System.performGC-- return $ Just $ iModuleName (fst ok)---- | Available backends.--data Backend = MAlonzo | Epic | JS---- | @cmd_compile b m includes@ compiles the module in file @m@ using--- the backend @b@, using @includes@ as the include directories.--cmd_compile :: Backend -> FilePath -> [FilePath] -> Interaction-cmd_compile b file includes =- cmd_load' file includes False (\(i, mw) ->- case mw of- Nothing -> do- case b of- MAlonzo -> MAlonzo.compilerMain i- Epic -> Epic.compilerMain i- JS -> JS.compilerMain i- display_info "*Compilation result*"- "The module was successfully compiled."- Just w ->- display_info errorTitle $ unlines- [ "You can only compile modules without unsolved metavariables"- , "or termination checking problems."- ])--cmd_constraints :: Interaction-cmd_constraints = Interaction Dependent $ do- cs <- map show <$> B.getConstraints- display_info "*Constraints*" (unlines cs)- return Nothing---- Show unsolved metas. If there are no unsolved metas but unsolved constraints--- show those instead.-cmd_metas :: Interaction-cmd_metas = Interaction Dependent $ do -- CL.showMetas []- ims <- B.typesOfVisibleMetas B.AsIs- -- Show unsolved implicit arguments normalised.- hms <- B.typesOfHiddenMetas B.Normalised- if not $ null ims && null hms- then do- di <- mapM (\i -> B.withInteractionId (B.outputFormId $ B.OutputForm 0 i) (showATop i)) ims- dh <- mapM showA' hms- display_info "*All Goals*" $ unlines $ di ++ dh- return Nothing- else do- cs <- B.getConstraints- if null cs- then display_info "*All Goals*" "" >> return Nothing- else command cmd_constraints- where- metaId (B.OfType i _) = i- metaId (B.JustType i) = i- metaId (B.JustSort i) = i- metaId (B.Assign i e) = i- metaId _ = __IMPOSSIBLE__- showA' m = do- r <- getMetaRange (metaId m)- d <- B.withMetaId (B.outputFormId $ B.OutputForm 0 m) (showATop m)- return $ d ++ " [ at " ++ show r ++ " ]"---- | If the range is 'noRange', then the string comes from the--- minibuffer rather than the goal.--type GoalCommand = InteractionId -> Range -> String -> Interaction--cmd_give :: GoalCommand-cmd_give = give_gen B.give $ \rng s ce ->- case ce of- ce | rng == noRange -> quote (show ce)- SC.Paren _ _ -> "'paren"- _ -> "'no-paren"--cmd_refine :: GoalCommand-cmd_refine = give_gen B.refine $ \_ s -> quote . show--give_gen give_ref mk_newtxt ii rng s = Interaction Dependent $- give_gen' give_ref mk_newtxt ii rng s--give_gen' give_ref mk_newtxt ii rng s = do- scope <- getInteractionScope ii- (ae, iis) <- give_ref ii Nothing =<< B.parseExprIn ii rng s- let newtxt = A . mk_newtxt rng s $ abstractToConcrete (makeEnv scope) ae- iis <- sortInteractionPoints iis- liftIO $ modifyIORef theState $ \s ->- s { theInteractionPoints =- replace ii iis (theInteractionPoints s) }- liftIO $ putResponse $ L [A "agda2-give-action", showNumIId ii, newtxt]- command cmd_metas- return Nothing- where- -- Substitutes xs for x in ys.- replace x xs ys = concatMap (\y -> if y == x then xs else [y]) ys--cmd_intro :: GoalCommand-cmd_intro ii rng _ = Interaction Dependent $ do- ss <- B.introTactic ii- B.withInteractionId ii $ case ss of- [] -> do- display_infoD "*Intro*" $ text "No introduction forms found."- return Nothing- [s] -> command $ cmd_refine ii rng s- _:_:_ -> do- display_infoD "*Intro*" $- sep [ text "Don't know which constructor to introduce of"- , let mkOr [] = []- mkOr [x, y] = [text x <+> text "or" <+> text y]- mkOr (x:xs) = text x : mkOr xs- in nest 2 $ fsep $ punctuate comma (mkOr ss)- ]- return Nothing--cmd_refine_or_intro :: GoalCommand-cmd_refine_or_intro ii rng s =- (if null s then cmd_intro else cmd_refine) ii rng s--cmd_auto :: GoalCommand-cmd_auto ii rng s = Interaction Dependent $ do- (res, msg) <- Auto.auto ii rng s- case res of- Left xs -> do- mapM_ (\(ii, s) -> do- liftIO $ modifyIORef theState $ \s ->- s { theInteractionPoints = filter (/= ii) (theInteractionPoints s) }- liftIO $ putResponse $ L [A "agda2-give-action", showNumIId ii, A $ quote s]- ) xs- case msg of- Nothing -> command cmd_metas >> return ()- Just msg -> display_info "*Auto*" msg- return Nothing- Right (Left cs) -> do- case msg of- Nothing -> return ()- Just msg -> display_info "*Auto*" msg- liftIO $ putResponse $- Cons (A "last")- (L [ A "agda2-make-case-action",- Q $ L $ List.map (A . quote) cs- ])- return Nothing- Right (Right s) -> give_gen' B.refine (\_ s -> quote . show) ii rng s---- | Sorts interaction points based on their ranges.--sortInteractionPoints :: [InteractionId] -> TCM [InteractionId]-sortInteractionPoints is =- map fst . sortBy (compare `on` snd) <$>- mapM (\i -> (,) i <$> getInteractionRange i) is---- | Pretty-prints the type of the meta-variable.--prettyTypeOfMeta :: B.Rewrite -> InteractionId -> TCM Doc-prettyTypeOfMeta norm ii = do- form <- B.typeOfMeta norm ii- case form of- B.OfType _ e -> prettyATop e- _ -> text <$> showATop form---- | Pretty-prints the context of the given meta-variable.--prettyContext- :: B.Rewrite -- ^ Normalise?- -> Bool -- ^ Print the elements in reverse order?- -> InteractionId- -> TCM Doc-prettyContext norm rev ii = B.withInteractionId ii $ do- ctx <- B.contextOfMeta ii norm- es <- mapM (prettyATop . B.ofExpr) ctx- ns <- mapM (showATop . B.ofName) ctx- let shuffle = if rev then reverse else id- return $ align 10 $ filter (not . null. fst) $ shuffle $ zip ns (map (text ":" <+>) es)--cmd_context :: B.Rewrite -> GoalCommand-cmd_context norm ii _ _ = Interaction Dependent $ do- display_infoD "*Context*" =<< prettyContext norm False ii- return Nothing--cmd_infer :: B.Rewrite -> GoalCommand-cmd_infer norm ii rng s = Interaction Dependent $ do- display_infoD "*Inferred Type*"- =<< B.withInteractionId ii- (prettyATop =<< B.typeInMeta ii norm =<< B.parseExprIn ii rng s)- return Nothing--cmd_goal_type :: B.Rewrite -> GoalCommand-cmd_goal_type norm ii _ _ = Interaction Dependent $ do- s <- B.withInteractionId ii $ prettyTypeOfMeta norm ii- display_infoD "*Current Goal*" s- return Nothing---- | Displays the current goal, the given document, and the current--- context.--cmd_goal_type_context_and doc norm ii _ _ = do- goal <- B.withInteractionId ii $ prettyTypeOfMeta norm ii- ctx <- prettyContext norm True ii- display_infoD "*Goal type etc.*"- (text "Goal:" <+> goal $+$- doc $+$- text (replicate 60 '\x2014') $+$- ctx)- return Nothing---- | Displays the current goal and context.--cmd_goal_type_context :: B.Rewrite -> GoalCommand-cmd_goal_type_context norm ii rng s = Interaction Dependent $- cmd_goal_type_context_and P.empty norm ii rng s---- | Displays the current goal and context /and/ infers the type of an--- expression.--cmd_goal_type_context_infer :: B.Rewrite -> GoalCommand-cmd_goal_type_context_infer norm ii rng s =- Interaction Dependent $ do- typ <- B.withInteractionId ii $- prettyATop =<< B.typeInMeta ii norm =<< B.parseExprIn ii rng s- cmd_goal_type_context_and (text "Have:" <+> typ) norm ii rng s---- | Shows all the top-level names in the given module, along with--- their types.--showModuleContents :: Range -> String -> TCM ()-showModuleContents rng s = do- (modules, types) <- B.moduleContents rng s- types' <- mapM (\(x, t) -> do- t <- prettyTCM t- return (show x, text ":" <+> t))- types- display_infoD "*Module contents*" $- text "Modules" $$- nest 2 (vcat $ map (text . show) modules) $$- text "Names" $$- nest 2 (align 10 types')---- | Shows all the top-level names in the given module, along with--- their types. Uses the scope of the given goal.--cmd_show_module_contents :: GoalCommand-cmd_show_module_contents ii rng s = Interaction Dependent $ do- B.withInteractionId ii $ showModuleContents rng s- return Nothing---- | Shows all the top-level names in the given module, along with--- their types. Uses the top-level scope.--cmd_show_module_contents_toplevel :: String -> Interaction-cmd_show_module_contents_toplevel s = Interaction Dependent $ do- B.atTopLevel $ showModuleContents noRange s- return Nothing---- | Sets the command line options and updates the status information.--setCommandLineOptions :: CommandLineOptions -> TCM ()-setCommandLineOptions opts = do- TM.setCommandLineOptions opts- liftIO . displayStatus =<< status---- | Status information.--data Status = Status- { sShowImplicitArguments :: Bool- -- ^ Are implicit arguments displayed?- , sChecked :: Bool- -- ^ Has the module been successfully type checked?- }---- | Computes some status information.--status :: TCM Status-status = do- showImpl <- showImplicitArguments-- -- Check if the file was successfully type checked, and has not- -- changed since. Note: This code does not check if any dependencies- -- have changed, and uses a time stamp to check for changes.- cur <- theCurrentFile <$> liftIO (readIORef theState)- checked <- case cur of- Nothing -> return False- Just (f, t) -> do- t' <- liftIO $ getModificationTime $ filePath f- case t == t' of- False -> return False- True ->- not . miWarnings . maybe __IMPOSSIBLE__ id <$>- (getVisitedModule =<<- maybe __IMPOSSIBLE__ id .- Map.lookup f <$> sourceToModule)-- return $ Status { sShowImplicitArguments = showImpl- , sChecked = checked- }---- | Shows status information.--showStatus :: Status -> String-showStatus s = intercalate "," $ catMaybes [checked, showImpl]- where- boolToMaybe b x = if b then Just x else Nothing-- checked = boolToMaybe (sChecked s) "Checked"- showImpl = boolToMaybe (sShowImplicitArguments s) "ShowImplicit"---- | Displays\/updates status information.--displayStatus :: Status -> IO ()-displayStatus s =- putResponse $ L [A "agda2-status-action", A (quote $ showStatus s)]---- | @display_info' header content@ displays @content@ (with header--- @header@) in some suitable way.--display_info' :: String -> String -> IO ()-display_info' bufname content =- putResponse $- L [ A "agda2-info-action"- , A (quote bufname)- , A (quote content)- ]---- | @display_info@ does what 'display_info'' does, but additionally--- displays some status information (see 'status' and--- 'displayStatus').--display_info :: String -> String -> TCM ()-display_info bufname content = do- liftIO . displayStatus =<< status- liftIO $ display_info' bufname content---- | Like 'display_info', but takes a 'Doc' instead of a 'String'.--display_infoD :: String -> Doc -> TCM ()-display_infoD bufname content = display_info bufname (render content)--showNumIId = A . tail . show--takenNameStr :: TCM [String]-takenNameStr = do- xss <- sequence [ List.map (fst . unArg) <$> getContext- , Map.keys <$> asks envLetBindings- , List.map qnameName . Map.keys . sigDefinitions <$> getSignature- ]- return $ concat [ parts $ nameConcrete x | x <- concat xss]- where- parts x = [ s | Id s <- nameParts x ]--refreshStr :: [String] -> String -> ([String], String)-refreshStr taken s = go nameModifiers where- go (m:mods) = let s' = s ++ m in- if s' `elem` taken then go mods else (s':taken, s')- go _ = __IMPOSSIBLE__--nameModifiers = "" : "'" : "''" : [show i | i <-[3..]]--cmd_make_case :: GoalCommand-cmd_make_case ii rng s = Interaction Dependent $ do- (casectxt , cs) <- makeCase ii rng s- B.withInteractionId ii $ do- hidden <- showImplicitArguments- pcs <- mapM prettyA $ List.map (extlam_dropLLifted casectxt hidden) cs- liftIO $ putResponse $- Cons (A "last")- (L [ A (emacscmd casectxt)- , Q $ L $ List.map (A . quote . (extlam_dropName casectxt) . render) pcs- ])- return Nothing- where- render = renderStyle (style { mode = OneLineMode })- emacscmd :: CaseContext -> String- emacscmd FunctionDef = "agda2-make-case-action"- emacscmd (ExtendedLambda _ _) = "agda2-make-case-action-extendlam"-- -- Drops pattern added to extended lambda functions when lambda lifting them- extlam_dropLLifted :: CaseContext -> Bool -> SA.Clause -> SA.Clause- extlam_dropLLifted FunctionDef _ x = x- extlam_dropLLifted (ExtendedLambda h nh) hidden (SA.Clause (SA.LHS info name nps ps) rhs decl)- = let n = if hidden then h else nh- in- (SA.Clause (SA.LHS info name (drop n nps) ps) rhs decl)-- -- very dirty hack, string manipulation by dropping the function name- -- and replacing " = " with " -> "- extlam_dropName :: CaseContext -> String -> String- extlam_dropName FunctionDef x = x- extlam_dropName (ExtendedLambda _ _) x = unwords $ map (\ y -> if y == "=" then "→" else y) $ drop 1 $ words x--cmd_solveAll :: Interaction-cmd_solveAll = Interaction Dependent $ do- out <- getInsts- liftIO $ putResponse $- Cons (A "last")- (L [ A "agda2-solveAll-action"- , Q . L $ concatMap prn out- ])- return Nothing- where- getInsts = mapM lowr =<< B.getSolvedInteractionPoints- where- lowr (i, m, e) = do- mi <- getMetaInfo <$> lookupMeta m- e <- withMetaInfo mi $ lowerMeta <$> abstractToConcreteCtx TopCtx e- return (i, e)- prn (ii,e)= [showNumIId ii, A $ quote $ show e]--class LowerMeta a where lowerMeta :: a -> a-instance LowerMeta SC.Expr where- lowerMeta = go where- go e = case e of- Ident _ -> e- SC.Lit _ -> e- SC.QuestionMark _ _ -> preMeta- SC.Underscore _ _ -> preUscore- SC.App r e1 ae2 -> case appView e of- SC.AppView (SC.QuestionMark _ _) _ -> preMeta- SC.AppView (SC.Underscore _ _) _ -> preUscore- _ -> SC.App r (go e1) (lowerMeta ae2)- SC.WithApp r e es -> SC.WithApp r (lowerMeta e) (lowerMeta es)- SC.Lam r bs e1 -> SC.Lam r (lowerMeta bs) (go e1)- SC.AbsurdLam r h -> SC.AbsurdLam r h- SC.ExtendedLam r cs -> SC.ExtendedLam r cs- SC.Fun r ae1 e2 -> SC.Fun r (lowerMeta ae1) (go e2)- SC.Pi tb e1 -> SC.Pi (lowerMeta tb) (go e1)- SC.Set _ -> e- SC.Prop _ -> e- SC.SetN _ _ -> e- SC.ETel tel -> SC.ETel (lowerMeta tel)- SC.Let r ds e1 -> SC.Let r (lowerMeta ds) (go e1)- Paren r e1 -> case go e1 of- q@(SC.QuestionMark _ Nothing) -> q- e2 -> Paren r e2- Absurd _ -> e- As r n e1 -> As r n (go e1)- SC.Dot r e -> SC.Dot r (go e)- SC.RawApp r es -> SC.RawApp r (lowerMeta es)- SC.OpApp r x es -> SC.OpApp r x (lowerMeta es)- SC.Rec r fs -> SC.Rec r (List.map (id -*- lowerMeta) fs)- SC.RecUpdate r e fs -> SC.RecUpdate r (lowerMeta e) (List.map (id -*- lowerMeta) fs)- SC.HiddenArg r e -> SC.HiddenArg r (lowerMeta e)- SC.InstanceArg r e -> SC.InstanceArg r (lowerMeta e)- SC.QuoteGoal r x e -> SC.QuoteGoal r x (lowerMeta e)- e@SC.Quote{} -> e- e@SC.QuoteTerm{} -> e- e@SC.Unquote{} -> e- SC.DontCare e -> SC.DontCare (lowerMeta e)--instance LowerMeta (OpApp SC.Expr) where- lowerMeta (Ordinary e) = Ordinary $ lowerMeta e- lowerMeta (SyntaxBindingLambda r bs e) = SyntaxBindingLambda r (lowerMeta bs) (lowerMeta e)---instance LowerMeta SC.LamBinding where- lowerMeta b@(SC.DomainFree _ _ _) = b- lowerMeta (SC.DomainFull tb) = SC.DomainFull (lowerMeta tb)--instance LowerMeta SC.TypedBindings where- lowerMeta (SC.TypedBindings r bs) = SC.TypedBindings r (lowerMeta bs)--instance LowerMeta SC.TypedBinding where- lowerMeta (SC.TBind r ns e) = SC.TBind r ns (lowerMeta e)- lowerMeta (SC.TNoBind e) = SC.TNoBind (lowerMeta e)--instance LowerMeta SC.RHS where- lowerMeta (SC.RHS e) = SC.RHS (lowerMeta e)- lowerMeta SC.AbsurdRHS = SC.AbsurdRHS--instance LowerMeta (Maybe SC.Expr) where- lowerMeta (Just e) = Just (lowerMeta e)- lowerMeta Nothing = Nothing--instance LowerMeta SC.Declaration where- lowerMeta = go where- go d = case d of- TypeSig rel n e1 -> TypeSig rel n (lowerMeta e1)- SC.Field n e1 -> SC.Field n (lowerMeta e1)- FunClause lhs rhs whcl -> FunClause lhs (lowerMeta rhs) (lowerMeta whcl)- SC.DataSig r ind n tel e1 -> SC.DataSig r ind n- (lowerMeta tel) (lowerMeta e1)- Data r ind n tel e1 cs -> Data r ind n- (lowerMeta tel) (lowerMeta e1) (lowerMeta cs)- SC.RecordSig r n tel e1 -> SC.RecordSig r n- (lowerMeta tel) (lowerMeta e1)- SC.Record r n c tel e1 cs -> SC.Record r n c- (lowerMeta tel) (lowerMeta e1) (lowerMeta cs)- Infix _ _ -> d- Syntax _ _ -> d- SC.Mutual r ds -> SC.Mutual r (lowerMeta ds)- Abstract r ds -> Abstract r (lowerMeta ds)- Private r ds -> Private r (lowerMeta ds)- Postulate r sigs -> Postulate r (lowerMeta sigs)- SC.Primitive r sigs -> SC.Primitive r (lowerMeta sigs)- SC.Open _ _ _ -> d- SC.Import _ _ _ _ _ -> d- SC.Pragma _ -> d- ModuleMacro r n modapp op dir -> ModuleMacro r n- (lowerMeta modapp) op dir- SC.Module r qn tel ds -> SC.Module r qn (lowerMeta tel) (lowerMeta ds)--instance LowerMeta SC.ModuleApplication where- lowerMeta (SC.SectionApp r tel e) = SC.SectionApp r (lowerMeta tel) (lowerMeta e)- lowerMeta (SC.RecordModuleIFS r rec) = SC.RecordModuleIFS r rec--instance LowerMeta SC.WhereClause where- lowerMeta SC.NoWhere = SC.NoWhere- lowerMeta (SC.AnyWhere ds) = SC.AnyWhere $ lowerMeta ds- lowerMeta (SC.SomeWhere m ds) = SC.SomeWhere m $ lowerMeta ds--instance LowerMeta a => LowerMeta [a] where- lowerMeta as = List.map lowerMeta as--instance LowerMeta a => LowerMeta (Arg a) where- lowerMeta aa = fmap lowerMeta aa--instance LowerMeta a => LowerMeta (Named name a) where- lowerMeta aa = fmap lowerMeta aa---preMeta = SC.QuestionMark noRange Nothing-preUscore = SC.Underscore noRange Nothing--cmd_compute :: Bool -- ^ Ignore abstract?- -> GoalCommand-cmd_compute ignore ii rng s = Interaction Dependent $ do- e <- B.parseExprIn ii rng s- d <- B.withInteractionId ii $ do- let c = B.evalInCurrent e- v <- if ignore then ignoreAbstractMode c else c- prettyATop v- display_info "*Normal Form*" (show d)- return Nothing---- | Parses and scope checks an expression (using the \"inside scope\"--- as the scope), performs the given command with the expression as--- input, and displays the result.--parseAndDoAtToplevel- :: (SA.Expr -> TCM SA.Expr)- -- ^ The command to perform.- -> String- -- ^ The name to use for the buffer displaying the output.- -> String- -- ^ The expression to parse.- -> Interaction-parseAndDoAtToplevel cmd title s = Interaction Dependent $ do- e <- liftIO $ parse exprParser s- display_info title =<<- B.atTopLevel (showA =<< cmd =<< concreteToAbstract_ e)- return Nothing---- | Parse the given expression (as if it were defined at the--- top-level of the current module) and infer its type.--cmd_infer_toplevel- :: B.Rewrite -- ^ Normalise the type?- -> String- -> Interaction-cmd_infer_toplevel norm =- parseAndDoAtToplevel (B.typeInCurrent norm) "*Inferred Type*"---- | Parse and type check the given expression (as if it were defined--- at the top-level of the current module) and normalise it.--cmd_compute_toplevel :: Bool -- ^ Ignore abstract?- -> String -> Interaction-cmd_compute_toplevel ignore =- parseAndDoAtToplevel (if ignore then ignoreAbstractMode . c- else inConcreteMode . c)- "*Normal Form*"- where c = B.evalInCurrent----------------------------------------------------------------------------- Syntax highlighting---- | @cmd_write_highlighting_info source target@ writes syntax--- highlighting information for the module in @source@ into @target@.------ If the module does not exist, or its module name is malformed or--- cannot be determined, or the module has not already been visited,--- or the cached info is out of date, then the representation of \"no--- highlighting information available\" is instead written to--- @target@.------ This command is used to load syntax highlighting information when a--- new file is opened, and it would probably be annoying if jumping to--- the definition of an identifier reset the proof state, so this--- command tries not to do that. One result of this is that the--- command uses the current include directories, whatever they happen--- to be.--cmd_write_highlighting_info :: FilePath -> FilePath -> Interaction-cmd_write_highlighting_info source target =- Interaction (Independent Nothing) $ do- liftIO . UTF8.writeFile target . showHighlightingInfo =<< do- ex <- liftIO $ doesFileExist source- case ex of- False -> return Nothing- True -> do- mmi <- (getVisitedModule =<<- moduleName =<< liftIO (absolute source))- `catchError`- \_ -> return Nothing- case mmi of- Nothing -> return Nothing- Just mi -> do- sourceT <- liftIO $ getModificationTime source- if sourceT <= miTimeStamp mi- then do- modFile <- stModuleToSource <$> get- return $ Just (iHighlighting $ miInterface mi, modFile)- else- return Nothing- return Nothing---- | Tells the Emacs mode to go to the first error position (if any).--tellEmacsToJumpToError :: Range -> IO ()-tellEmacsToJumpToError r = do- case rStart r of- Nothing -> return ()- Just (Pn { srcFile = Nothing }) -> return ()- Just (Pn { srcFile = Just f, posPos = p }) ->- putResponse $- L [ A "annotation-goto"- , Q $ L [A (quote $ filePath f), A ".", A (show p)]- ]----------------------------------------------------------------------------- Implicit arguments---- | Tells Agda whether or not to show implicit arguments.--showImplicitArgs :: Bool -- ^ Show them?- -> Interaction-showImplicitArgs showImpl = Interaction Dependent $ do- opts <- commandLineOptions- setCommandLineOptions $- opts { optPragmaOptions =- (optPragmaOptions opts) { optShowImplicit = showImpl } }- return Nothing---- | Toggle display of implicit arguments.--toggleImplicitArgs :: Interaction-toggleImplicitArgs = Interaction Dependent $ do- opts <- commandLineOptions- let ps = optPragmaOptions opts- setCommandLineOptions $- opts { optPragmaOptions =- ps { optShowImplicit = not $ optShowImplicit ps } }- return Nothing----------------------------------------------------------------------------- Error handling---- | When an error message is displayed the following title should be--- used, if appropriate.--errorTitle :: String-errorTitle = "*Error*"---- | Displays an error, instructs Emacs to jump to the site of the--- error, and terminates the program. Because this function may switch--- the focus to another file the status information is also updated.--displayErrorAndExit :: Status- -- ^ The new status information.- -> Range -> String -> IO a-displayErrorAndExit status r s = do- display_info' errorTitle s- tellEmacsToJumpToError r- displayStatus status- exitWith (ExitFailure 1)---- | Outermost error handler.--infoOnException m =- failOnException (displayErrorAndExit s) m `catchImpossible` \e ->- displayErrorAndExit s noRange (show e)- where- s = Status { sChecked = False- , sShowImplicitArguments = False- -- Educated guess... This field is not important, so it- -- does not really matter if it is displayed- -- incorrectly when an unexpected error has occurred.- }---- | Raises an error if the given file is not the one currently--- loaded.--ensureFileLoaded :: AbsolutePath -> TCM ()-ensureFileLoaded current = do- f <- theCurrentFile <$> liftIO (readIORef theState)- when (Just current /= (fst <$> f)) $- typeError $ GenericError "Error: First load the file."---- Helpers for testing ------------------------------------------------------getCurrentFile :: IO FilePath-getCurrentFile = do- mf <- theCurrentFile <$> readIORef theState- case mf of- Nothing -> error "command: No file loaded!"- Just (f, _) -> return (filePath f)---- | Changes the 'Interaction' so that its first action is to turn off--- all debug messages.--makeSilent :: Interaction -> Interaction-makeSilent i = i { command = do- opts <- commandLineOptions- TM.setCommandLineOptions $ opts- { optPragmaOptions =- (optPragmaOptions opts)- { optVerbose = Trie.singleton [] 0 }- }- command i }--top_command' :: FilePath -> Interaction -> IO ()-top_command' f cmd = ioTCM f Nothing $ makeSilent cmd--goal_command :: InteractionId -> GoalCommand -> String -> IO ()-goal_command i cmd s = do- f <- getCurrentFile- -- TODO: Test with other ranges as well.- ioTCM f Nothing $ makeSilent $ cmd i noRange s
src/full/Agda/Interaction/Highlighting/Emacs.hs view
@@ -3,30 +3,40 @@ -- | Functions which give precise syntax highlighting info to Emacs. module Agda.Interaction.Highlighting.Emacs- ( showHighlightingInfo+ ( lispifyHighlightingInfo , Agda.Interaction.Highlighting.Emacs.tests ) where import Agda.Interaction.FindFile import Agda.Interaction.Highlighting.Precise import Agda.Interaction.Highlighting.Range+import Agda.Interaction.EmacsCommand import Agda.Syntax.Abstract (QName) import Agda.Syntax.Common import qualified Agda.Syntax.Position as P import Agda.Syntax.Translation.ConcreteToAbstract (TopLevelInfo) import Agda.TypeChecking.Errors (prettyError)+import Agda.TypeChecking.Monad+ (TCM, envHighlightingMethod, HighlightingMethod(..)) import Agda.Utils.FileName+import qualified Agda.Utils.IO.UTF8 as UTF8 import Agda.Utils.String import Agda.Utils.TestHelpers import Agda.Utils.Impossible #include "../../undefined.h" +import Control.Applicative+import qualified Control.Exception as E+import Control.Monad.Reader import Control.Monad.Trans+import Data.Char import Data.List import qualified Data.Map as Map-import Data.Char import Data.Maybe+import Data.Monoid+import qualified System.Directory as D+import qualified System.IO as IO ------------------------------------------------------------------------ -- Read/show functions@@ -56,35 +66,52 @@ showMetaInfo :: ModuleToSource -- ^ Must contain a mapping for the definition site's -- module, if any.- -> (Range, MetaInfo) -> String+ -> (Range, MetaInfo) -> Lisp String showMetaInfo modFile (r, m) =- "("- ++ show (from r)- ++ " "- ++ show (to r)- ++ " ("- ++ concat (intersperse " " (toAtoms m))- ++ ")"- ++ (maybe " nil" ((" " ++) . quote) $ note m)- ++ defSite- ++ ")"+ L $ ((map (A . show) [from r, to r])+ +++ [L $ map A $ toAtoms m]+ +++ (A $ maybe "nil" quote $ note m)+ :+ defSite) where defSite = case definitionSite m of- Nothing -> ""+ Nothing -> [] Just (m, p) -> case Map.lookup m modFile of Nothing -> __IMPOSSIBLE__- Just f -> " (" ++ quote (filePath f) ++ " . " ++ show p ++ ")"+ Just f -> [Cons (A $ quote $ filePath f) (A $ show p)] --- | Shows syntax highlighting information in an Emacsy fashion.+-- | Turns syntax highlighting information into a list of+-- S-expressions. -showHighlightingInfo- :: Maybe (HighlightingInfo, ModuleToSource)- -- ^ The 'ModuleToSource' must contain a mapping for every- -- definition site's module.- -> String-showHighlightingInfo Nothing = ""-showHighlightingInfo (Just (h, modFile)) =- "(" ++ unlines (map (showMetaInfo modFile) h) ++ ")"+lispifyHighlightingInfo+ :: HighlightingInfo+ -> ModuleToSource+ -- ^ Must contain a mapping for every definition site's module.+ -> TCM (Lisp String)+lispifyHighlightingInfo h modFile = do+ method <- envHighlightingMethod <$> ask+ liftIO $ case ranges h of+ _ | method == Direct -> direct+ ((_, mi) : _) | otherAspects mi == [TypeChecks] ||+ mi == mempty -> direct+ _ -> indirect+ where+ info = map (showMetaInfo modFile) (ranges h)++ direct = return $ L (A "agda2-highlight-add-annotations" :+ map Q info)++ indirect = do+ dir <- D.getTemporaryDirectory+ f <- E.bracket (IO.openTempFile dir "agda2-mode")+ (IO.hClose . snd) $ \ (f, h) -> do+ UTF8.hPutStr h (show $ L info)+ return f+ return $ L [ A "agda2-highlight-load-and-delete-action"+ , A (quote f)+ ] ------------------------------------------------------------------------ -- All tests
src/full/Agda/Interaction/Highlighting/Generate.hs view
@@ -1,25 +1,34 @@-{-# LANGUAGE CPP, Rank2Types, RelaxedPolyRec #-}+{-# LANGUAGE CPP, FlexibleContexts, RelaxedPolyRec #-} -- | Generates data used for precise syntax highlighting. module Agda.Interaction.Highlighting.Generate- ( generateSyntaxInfo- , generateErrorInfo+ ( Level(..)+ , generateAndPrintSyntaxInfo+ , generateTokenInfo+ , printErrorInfo+ , printUnsolvedInfo+ , printHighlightingInfo+ , highlightAsTypeChecked , Agda.Interaction.Highlighting.Generate.tests- )- where+ ) where import Agda.Interaction.FindFile+import Agda.Interaction.Response (Response(Resp_HighlightingInfo))+import Agda.Interaction.Highlighting.Emacs hiding (tests) import Agda.Interaction.Highlighting.Precise hiding (tests) import Agda.Interaction.Highlighting.Range hiding (tests)+import Agda.Interaction.EmacsCommand import qualified Agda.TypeChecking.Errors as E import Agda.TypeChecking.MetaVars (isBlockedTerm)-import Agda.TypeChecking.Monad.Options (reportSLn)+import Agda.TypeChecking.Monad.Options (reportSLn, reportSDoc) import Agda.TypeChecking.Monad hiding (MetaInfo, Primitive, Constructor, Record, Function, Datatype) import qualified Agda.TypeChecking.Monad as M+import Agda.TypeChecking.Pretty import qualified Agda.TypeChecking.Reduce as R import qualified Agda.Syntax.Abstract as A+import Agda.Syntax.Common (Delayed(..)) import qualified Agda.Syntax.Common as SC import qualified Agda.Syntax.Concrete as C import qualified Agda.Syntax.Info as SI@@ -32,316 +41,384 @@ import qualified Agda.Syntax.Translation.ConcreteToAbstract as CA import Agda.Utils.List import Agda.Utils.TestHelpers+import Agda.Utils.HashMap (HashMap)+import qualified Agda.Utils.HashMap as HMap import Control.Monad import Control.Monad.Trans import Control.Monad.State+import Control.Monad.Reader import Control.Applicative+import Control.Arrow ((***)) import Data.Monoid import Data.Function-import Agda.Utils.Generics+import Data.Generics.Geniplate import Agda.Utils.FileName+import qualified Agda.Utils.IO.UTF8 as UTF8+import Agda.Utils.Monad+import Data.HashSet (HashSet)+import qualified Data.HashSet as HSet import Data.Map (Map) import qualified Data.Map as Map import Data.Maybe-import Data.Sequence (Seq, (><)) import Data.List ((\\), isPrefixOf)-import qualified Data.Sequence as Seq import qualified Data.Foldable as Fold (toList, fold, foldMap)+import System.Directory+import System.IO import Agda.Utils.Impossible #include "../../undefined.h" --- | Generates syntax highlighting information for an error,--- represented as a range and an optional string. The error range is--- completed so that there are no gaps in it.+-- | @highlightAsTypeChecked rPre r m@ runs @m@ and returns its+-- result. Some code may additionally be highlighted: ----- Nothing is generated unless the file name component of the range is--- defined.+-- * If @r@ is non-empty and not a sub-range of @rPre@ (after+-- 'P.continuousPerLine' has been applied to both): @r@ is+-- highlighted as being type-checked while @m@ is running (this+-- highlighting is removed if @m@ completes /successfully/).+--+-- * Otherwise: Highlighting is removed for @rPre - r@ before @m@+-- runs, and if @m@ completes successfully, then @rPre - r@ is+-- highlighted as being type-checked. -generateErrorInfo :: P.Range -> Maybe String -> Maybe HighlightingInfo-generateErrorInfo r s =- case P.rStart r of- Nothing -> Nothing- Just (P.Pn { P.srcFile = Nothing }) -> Nothing- Just (P.Pn { P.srcFile = Just f, P.posPos = p }) ->- Just $ compress $ generateErrorFile r s+highlightAsTypeChecked+ :: MonadTCM tcm+ => P.Range+ -> P.Range+ -> tcm a+ -> tcm a+highlightAsTypeChecked rPre r m+ | r /= P.noRange && delta == rPre' = wrap r' highlight clear+ | otherwise = wrap delta clear highlight+ where+ rPre' = rToR (P.continuousPerLine rPre)+ r' = rToR (P.continuousPerLine r)+ delta = rPre' `minus` r'+ clear = mempty+ highlight = mempty { otherAspects = [TypeChecks] } --- | Generates syntax highlighting information for an error,--- represented as a range and an optional string. The error range is--- completed so that there are no gaps in it.+ wrap rs x y = do+ p rs x+ v <- m+ p rs y+ return v+ where+ p rs x = printHighlightingInfo (singletonC rs x) -generateErrorFile :: P.Range -> Maybe String -> File-generateErrorFile r s =- several (rToR $ P.continuousPerLine r)- (mempty { otherAspects = [Error]- , note = s- })+-- | Lispify and print the given highlighting information. --- | Generates syntax highlighting information.+printHighlightingInfo :: MonadTCM tcm => HighlightingInfo -> tcm ()+printHighlightingInfo x = do+ liftTCM $ reportSLn "highlighting" 50 $+ "Printing highlighting info:\n" ++ show x+ unless (null $ ranges x) $ do+ st <- get+ liftTCM $ stInteractionOutputCallback st+ (Resp_HighlightingInfo x (stModuleToSource st)) -generateSyntaxInfo- :: AbsolutePath -- ^ The module to highlight.- -> Maybe TCErr -- ^ 'Nothing' if the module has been- -- successfully type checked (perhaps- -- with warnings), otherwise the- -- offending error.- --- -- Precondition: The range of the error- -- must match the file name given in the- -- previous argument.- -> CA.TopLevelInfo -- ^ The abstract syntax of the module.- -> [M.TerminationError] -- ^ Termination checking problems.- -> TCM HighlightingInfo-generateSyntaxInfo file mErr top termErrs = do- reportSLn "import.iface.create" 15 $- "Generating syntax info for " ++ filePath file ++ ' ' : maybe "(No TCErr)" (const "(with TCErr)") mErr ++ "."+-- | Highlighting levels. - M.withScope_ (CA.insideScope top) $ M.ignoreAbstractMode $ do+data Level+ = Full [TerminationError]+ -- ^ Full highlighting. Should only be used after typechecking has+ -- completed successfully.+ --+ -- The list of termination problems is also highlighted.+ --+ -- Precondition: The termination problems must be located in the+ -- module that is highlighted.+ | Partial+ -- ^ Highlighting without disambiguation of overloaded+ -- constructors.++-- | Generate syntax highlighting information for the given+-- declaration, and (if appropriate) print it. If the+-- 'HighlightingLevel' is @'Full' something@, then the state is+-- additionally updated with the new highlighting info (in case of a+-- conflict new info takes precedence over old info).+--+-- The procedure makes use of some of the token highlighting info in+-- 'stTokens' (that corresponding to the interval covered by the+-- declaration). If the 'HighlightingLevel' is @'Full' something@,+-- then this token highlighting info is additionally removed from+-- 'stTokens'.++generateAndPrintSyntaxInfo :: A.Declaration -> Level -> TCM ()+generateAndPrintSyntaxInfo decl hlLevel = do+ file <- envCurrentPath <$> ask++ reportSLn "import.iface.create" 15 $+ "Generating syntax info for " ++ filePath file ++ ' ' :+ case hlLevel of+ Full {} -> "(final)"+ Partial {} -> "(first approximation)"+ ++ "."++ M.ignoreAbstractMode $ do modMap <- sourceToModule- tokens <- liftIO $ Pa.parseFile' Pa.tokensParser file- kinds <- nameKinds mErr decls- let nameInfo = mconcat $ map (generate modMap file kinds)- (Fold.toList names)+ kinds <- nameKinds hlLevel decl++ let nameInfo = mconcat $ map (generate modMap file kinds) names+ -- Constructors are only highlighted after type checking, since they -- can be overloaded.- constructorInfo <- case mErr of- Nothing -> generateConstructorInfo modMap file kinds decls- Just _ -> return mempty- metaInfo <- case mErr of- Nothing -> computeUnsolvedMetaWarnings- Just _ -> return mempty- errorInfo <- case mErr of- Nothing -> return mempty- Just e -> let r = P.getRange e in- case P.rStart r of- Just p | P.srcFile p == Just file ->- generateErrorFile r . Just <$> E.prettyError e- _ -> __IMPOSSIBLE__+ constructorInfo <- case hlLevel of+ Full _ -> generateConstructorInfo modMap file kinds decl+ _ -> return mempty++ let (from, to) = case P.rangeToInterval (P.getRange decl) of+ Nothing -> __IMPOSSIBLE__+ Just i -> let conv = toInteger . P.posPos in+ (conv $ P.iStart i, conv $ P.iEnd i)+ (prevTokens, (curTokens, postTokens)) <-+ (id *** splitAtC to) . splitAtC from . stTokens <$> get+ -- theRest needs to be placed before nameInfo here since record -- field declarations contain QNames. constructorInfo also needs -- to be placed before nameInfo since, when typechecking is done,- -- constructors are included in both lists. Finally tokInfo is- -- placed last since token highlighting is more crude than the- -- others.- return $ compress $ mconcat- [ errorInfo- , constructorInfo- , theRest modMap- , nameInfo- , metaInfo- , termInfo- , tokInfo tokens- ]- where- decls = CA.topLevelDecls top-- -- Converts an aspect and a range to a file.- aToF a r = several (rToR r) (mempty { aspect = Just a })+ -- constructors are included in both lists. Finally the token+ -- information is placed last since token highlighting is more+ -- crude than the others.+ let syntaxInfo = compress (mconcat [ constructorInfo+ , theRest modMap file+ , nameInfo+ , termInfo+ ])+ `mappend`+ curTokens - tokInfo = Fold.foldMap tokenToFile- where- tokenToFile :: T.Token -> File- tokenToFile (T.TokSetN (i, _)) = aToF PrimitiveType (P.getRange i)- tokenToFile (T.TokKeyword T.KwSet i) = aToF PrimitiveType (P.getRange i)- tokenToFile (T.TokKeyword T.KwProp i) = aToF PrimitiveType (P.getRange i)- tokenToFile (T.TokKeyword T.KwForall i) = aToF Symbol (P.getRange i)- tokenToFile (T.TokKeyword _ i) = aToF Keyword (P.getRange i)- tokenToFile (T.TokSymbol _ i) = aToF Symbol (P.getRange i)- tokenToFile (T.TokLiteral (L.LitInt r _)) = aToF Number r- tokenToFile (T.TokLiteral (L.LitFloat r _)) = aToF Number r- tokenToFile (T.TokLiteral (L.LitString r _)) = aToF String r- tokenToFile (T.TokLiteral (L.LitChar r _)) = aToF String r- tokenToFile (T.TokLiteral (L.LitQName r _)) = aToF String r- tokenToFile (T.TokComment (i, _)) = aToF Comment (P.getRange i)- tokenToFile (T.TokTeX (i, _)) = aToF Comment (P.getRange i)- tokenToFile (T.TokId {}) = mempty- tokenToFile (T.TokQId {}) = mempty- tokenToFile (T.TokString {}) = mempty- tokenToFile (T.TokDummy {}) = mempty- tokenToFile (T.TokEOF {}) = mempty+ case hlLevel of+ Full _ -> modify (\st ->+ st { stSyntaxInfo = syntaxInfo `mappend` stSyntaxInfo st+ , stTokens = prevTokens `mappend` postTokens+ })+ _ -> return () - termInfo = functionDefs `mappend` callSites+ ifTopLevelAndHighlightingLevelIs NonInteractive $+ printHighlightingInfo syntaxInfo+ where+ -- Highlighting of termination problems.+ termInfo = case hlLevel of+ Full termErrs -> functionDefs `mappend` callSites where m = mempty { otherAspects = [TerminationProblem] }- functionDefs = Fold.foldMap (\x -> several (rToR $ bindingSite x) m) $+ functionDefs = Fold.foldMap (\x -> singleton (rToR $ bindingSite x) m) $ concatMap M.termErrFunctions termErrs- callSites = Fold.foldMap (\r -> several (rToR r) m) $+ callSites = Fold.foldMap (\r -> singleton (rToR r) m) $ concatMap (map M.callInfoRange . M.termErrCalls) termErrs+ _ -> mempty - -- All names mentioned in the syntax tree (not bound variables).- names = everything' (><) (Seq.empty `mkQ` getName- `extQ` getAmbiguous)- decls- where- getName :: A.QName -> Seq A.AmbiguousQName- getName n | isPrefixOf extendlambdaname $ show $ A.qnameName n = mempty- | otherwise = Seq.singleton (A.AmbQ [n])+ -- All names mentioned in the syntax tree (not bound variables).+ names :: [A.AmbiguousQName]+ names =+ (map (A.AmbQ . (:[])) $+ filter (not . extendedLambda) $+ universeBi decl) +++ universeBi decl+ where+ extendedLambda :: A.QName -> Bool+ extendedLambda n = extendlambdaname `isPrefixOf` show (A.qnameName n) + -- Bound variables, dotted patterns, record fields, module names,+ -- the "as" and "to" symbols.+ theRest modMap file = mconcat+ [ Fold.foldMap getFieldDecl $ universeBi decl+ , Fold.foldMap getVarAndField $ universeBi decl+ , Fold.foldMap getLet $ universeBi decl+ , Fold.foldMap getLam $ universeBi decl+ , Fold.foldMap getTyped $ universeBi decl+ , Fold.foldMap getPattern $ universeBi decl+ , Fold.foldMap getModuleName $ universeBi decl+ , Fold.foldMap getModuleInfo $ universeBi decl+ ]+ where+ bound n = nameToFile modMap file []+ (A.nameConcrete n)+ (\isOp -> mempty { aspect = Just $ Name (Just Bound) isOp })+ (Just $ A.nameBindingSite n)+ field m n = nameToFile modMap file m n+ (\isOp -> mempty { aspect = Just $ Name (Just Field) isOp })+ Nothing+ asName n = nameToFile modMap file []+ n+ (\isOp -> mempty { aspect = Just $ Name (Just Module) isOp })+ Nothing+ mod isTopLevelModule n =+ nameToFile modMap file []+ (A.nameConcrete n)+ (\isOp -> mempty { aspect = Just $ Name (Just Module) isOp })+ (Just $ (if isTopLevelModule then P.beginningOfFile else id)+ (A.nameBindingSite n)) - getAmbiguous :: A.AmbiguousQName -> Seq A.AmbiguousQName- getAmbiguous = Seq.singleton+ getVarAndField :: A.Expr -> File+ getVarAndField (A.Var x) = bound x+ getVarAndField (A.Rec _ fs) = mconcat $ map (field [] . fst) fs+ getVarAndField _ = mempty - -- Bound variables, dotted patterns, record fields, module names,- -- the "as" and "to" symbols.- theRest modMap = everything' mappend query decls- where- query :: GenericQ File- query = mempty `mkQ`- getFieldDecl `extQ`- getVarAndField `extQ`- getLet `extQ`- getLam `extQ`- getTyped `extQ`- getPattern `extQ`- getModuleName `extQ`- getModuleInfo+ getLet :: A.LetBinding -> File+ getLet (A.LetBind _ _ x _ _) = bound x+ getLet A.LetPatBind{} = mempty+ getLet A.LetApply{} = mempty+ getLet A.LetOpen{} = mempty - bound n = nameToFile modMap file []- (A.nameConcrete n)- (\isOp -> mempty { aspect = Just $ Name (Just Bound) isOp })- (Just $ A.nameBindingSite n)- field m n = nameToFile modMap file m n- (\isOp -> mempty { aspect = Just $ Name (Just Field) isOp })- Nothing- asName n = nameToFile modMap file []- n- (\isOp -> mempty { aspect = Just $ Name (Just Module) isOp })- Nothing- mod isTopLevelModule n =- nameToFile modMap file []- (A.nameConcrete n)- (\isOp -> mempty { aspect = Just $ Name (Just Module) isOp })- (Just $ (if isTopLevelModule then P.beginningOfFile else id)- (A.nameBindingSite n))+ getLam :: A.LamBinding -> File+ getLam (A.DomainFree _ _ x) = bound x+ getLam (A.DomainFull {}) = mempty - getVarAndField :: A.Expr -> File- getVarAndField (A.Var x) = bound x- getVarAndField (A.Rec _ fs) = mconcat $ map (field [] . fst) fs- getVarAndField _ = mempty+ getTyped :: A.TypedBinding -> File+ getTyped (A.TBind _ xs _) = mconcat $ map bound xs+ getTyped (A.TNoBind {}) = mempty - getLet :: A.LetBinding -> File- getLet (A.LetBind _ _ x _ _) = bound x- getLet A.LetApply{} = mempty- getLet A.LetOpen{} = mempty+ getPattern :: A.Pattern -> File+ getPattern (A.VarP x) = bound x+ getPattern (A.AsP _ x _) = bound x+ getPattern (A.DotP pi _) =+ singleton (rToR $ P.getRange pi)+ (mempty { otherAspects = [DottedPattern] })+ getPattern _ = mempty - getLam :: A.LamBinding -> File- getLam (A.DomainFree _ _ x) = bound x- getLam (A.DomainFull {}) = mempty+ getFieldDecl :: A.Declaration -> File+ getFieldDecl (A.RecDef _ _ _ _ _ _ fs) = Fold.foldMap extractField fs+ where+ extractField (A.ScopedDecl _ ds) = Fold.foldMap extractField ds+ extractField (A.Field _ x _) = field (concreteQualifier x)+ (concreteBase x)+ extractField _ = mempty+ getFieldDecl _ = mempty - getTyped :: A.TypedBinding -> File- getTyped (A.TBind _ xs _) = mconcat $ map bound xs- getTyped (A.TNoBind {}) = mempty+ getModuleName :: A.ModuleName -> File+ getModuleName m@(A.MName { A.mnameToList = xs }) =+ mconcat $ map (mod isTopLevelModule) xs+ where+ isTopLevelModule =+ case catMaybes $+ map (join .+ fmap P.srcFile .+ P.rStart .+ A.nameBindingSite) xs of+ f : _ -> Map.lookup f modMap ==+ Just (C.toTopLevelModuleName $ A.mnameToConcrete m)+ [] -> False - getPattern :: A.Pattern -> File- getPattern (A.VarP x) = bound x- getPattern (A.AsP _ x _) = bound x- getPattern (A.DotP pi _) =- several (rToR $ P.getRange pi)- (mempty { otherAspects = [DottedPattern] })- getPattern _ = mempty+ getModuleInfo :: SI.ModuleInfo -> File+ getModuleInfo (SI.ModuleInfo { SI.minfoAsTo = asTo+ , SI.minfoAsName = name }) =+ singleton (rToR asTo) (mempty { aspect = Just Symbol })+ `mappend`+ maybe mempty asName name - getFieldDecl :: A.Declaration -> File- getFieldDecl (A.RecDef _ _ _ _ _ fs) = Fold.foldMap extractField fs- where- extractField (A.ScopedDecl _ ds) = Fold.foldMap extractField ds- extractField (A.Field _ x _) = field (concreteQualifier x)- (concreteBase x)- extractField _ = mempty- getFieldDecl _ = mempty+-- | Generate and return the syntax highlighting information for the+-- tokens in the given file. - getModuleName :: A.ModuleName -> File- getModuleName m@(A.MName { A.mnameToList = xs }) =- mconcat $ map (mod isTopLevelModule) xs- where- isTopLevelModule =- case catMaybes $- map (join .- fmap P.srcFile .- P.rStart .- A.nameBindingSite) xs of- f : _ -> Map.lookup f modMap ==- Just (C.toTopLevelModuleName $ A.mnameToConcrete m)- [] -> False+generateTokenInfo+ :: AbsolutePath -- ^ The module to highlight.+ -> TCM CompressedFile+generateTokenInfo file = do+ tokens <- liftIO $ Pa.parseFile' Pa.tokensParser file+ return $ merge $ map tokenToCFile tokens+ where+ -- Converts an aspect and a range to a file.+ aToF a r = singletonC (rToR r) (mempty { aspect = Just a }) - getModuleInfo :: SI.ModuleInfo -> File- getModuleInfo (SI.ModuleInfo { SI.minfoAsTo = asTo- , SI.minfoAsName = name }) =- aToF Symbol asTo `mappend` maybe mempty asName name+ -- Merges /sorted, non-overlapping/ compressed files.+ merge = CompressedFile . concat . map ranges + tokenToCFile :: T.Token -> CompressedFile+ tokenToCFile (T.TokSetN (i, _)) = aToF PrimitiveType (P.getRange i)+ tokenToCFile (T.TokKeyword T.KwSet i) = aToF PrimitiveType (P.getRange i)+ tokenToCFile (T.TokKeyword T.KwProp i) = aToF PrimitiveType (P.getRange i)+ tokenToCFile (T.TokKeyword T.KwForall i) = aToF Symbol (P.getRange i)+ tokenToCFile (T.TokKeyword _ i) = aToF Keyword (P.getRange i)+ tokenToCFile (T.TokSymbol _ i) = aToF Symbol (P.getRange i)+ tokenToCFile (T.TokLiteral (L.LitInt r _)) = aToF Number r+ tokenToCFile (T.TokLiteral (L.LitFloat r _)) = aToF Number r+ tokenToCFile (T.TokLiteral (L.LitString r _)) = aToF String r+ tokenToCFile (T.TokLiteral (L.LitChar r _)) = aToF String r+ tokenToCFile (T.TokLiteral (L.LitQName r _)) = aToF String r+ tokenToCFile (T.TokComment (i, _)) = aToF Comment (P.getRange i)+ tokenToCFile (T.TokTeX (i, _)) = aToF Comment (P.getRange i)+ tokenToCFile (T.TokId {}) = mempty+ tokenToCFile (T.TokQId {}) = mempty+ tokenToCFile (T.TokString {}) = mempty+ tokenToCFile (T.TokDummy {}) = mempty+ tokenToCFile (T.TokEOF {}) = mempty+ -- | A function mapping names to the kind of name they stand for. type NameKinds = A.QName -> Maybe NameKind -- | Builds a 'NameKinds' function. -nameKinds :: Maybe TCErr -- ^ 'Nothing' if type checking completed- -- successfully.- -> [A.Declaration]+nameKinds :: Level+ -- ^ This should only be @'Full' something@ if+ -- type-checking completed successfully (without any+ -- errors).+ -> A.Declaration -> TCM NameKinds-nameKinds mErr decls = do+nameKinds hlLevel decl = do imported <- fix . stImports <$> get- local <- case mErr of- Nothing -> fix . stSignature <$> get- Just _ -> return $+ local <- case hlLevel of+ Full _ -> fix . stSignature <$> get+ _ -> return $ -- Traverses the syntax tree and constructs a map from qualified -- names to name kinds. TODO: Handle open public.- everything' union (Map.empty `mkQ` getDecl) decls- let merged = Map.union local imported- return (\n -> Map.lookup n merged)+ foldr ($) HMap.empty $ map declToKind $ universeBi decl+ let merged = HMap.union local imported+ return (\n -> HMap.lookup n merged) where- fix = Map.map (defnToNameKind . theDef) . sigDefinitions+ fix = HMap.map (defnToKind . theDef) . sigDefinitions -- | The 'M.Axiom' constructor is used to represent various things -- which are not really axioms, so when maps are merged 'Postulate's- -- are thrown away whenever possible. The 'getDef' and 'getDecl'- -- functions below can return several explanations for one qualified- -- name; the 'Postulate's are bogus.- union = Map.unionWith dropPostulates+ -- are thrown away whenever possible. The 'declToKind' function+ -- below can return several explanations for one qualified name; the+ -- 'Postulate's are bogus.+ insert = HMap.insertWith dropPostulates where dropPostulates Postulate k = k dropPostulates k _ = k - defnToNameKind :: Defn -> NameKind- defnToNameKind (M.Axiom {}) = Postulate- defnToNameKind (M.Function {}) = Function- defnToNameKind (M.Datatype {}) = Datatype- defnToNameKind (M.Record {}) = Record- defnToNameKind (M.Constructor { M.conInd = i }) = Constructor i- defnToNameKind (M.Primitive {}) = Primitive+ defnToKind :: Defn -> NameKind+ defnToKind (M.Axiom {}) = Postulate+ defnToKind (M.Function {}) = Function+ defnToKind (M.Datatype {}) = Datatype+ defnToKind (M.Record {}) = Record+ defnToKind (M.Constructor { M.conInd = i }) = Constructor i+ defnToKind (M.Primitive {}) = Primitive getAxiomName :: A.Declaration -> A.QName getAxiomName (A.Axiom _ _ q _) = q getAxiomName _ = __IMPOSSIBLE__ - getDecl :: A.Declaration -> Map A.QName NameKind- getDecl (A.Axiom _ _ q _) = Map.singleton q Postulate- getDecl (A.Field _ q _) = Map.singleton q Function+ declToKind :: A.Declaration ->+ HashMap A.QName NameKind -> HashMap A.QName NameKind+ declToKind (A.Axiom _ _ q _) = insert q Postulate+ declToKind (A.Field _ q _) = insert q Function -- Note that the name q can be used both as a field name and as a -- projection function. Highlighting of field names is taken care -- of by "theRest" above, which does not use NameKinds.- getDecl (A.Primitive _ q _) = Map.singleton q Primitive- getDecl (A.Mutual {}) = Map.empty- getDecl (A.Section {}) = Map.empty- getDecl (A.Apply {}) = Map.empty- getDecl (A.Import {}) = Map.empty- getDecl (A.Pragma {}) = Map.empty- getDecl (A.ScopedDecl {}) = Map.empty- getDecl (A.Open {}) = Map.empty- getDecl (A.FunDef _ q _) = Map.singleton q Function- getDecl (A.DataSig _ q _ _) = Map.singleton q Datatype- getDecl (A.DataDef _ q _ cs) = Map.singleton q Datatype `union`- (Map.unions $- map (\q -> Map.singleton q (Constructor SC.Inductive)) $- map getAxiomName cs)- getDecl (A.RecSig _ q _ _) = Map.singleton q Record- getDecl (A.RecDef _ q c _ _ _) = Map.singleton q Record `union`- case c of- Nothing -> Map.empty- Just q ->- Map.singleton q (Constructor SC.Inductive)+ declToKind (A.Primitive _ q _) = insert q Primitive+ declToKind (A.Mutual {}) = id+ declToKind (A.Section {}) = id+ declToKind (A.Apply {}) = id+ declToKind (A.Import {}) = id+ declToKind (A.Pragma {}) = id+ declToKind (A.ScopedDecl {}) = id+ declToKind (A.Open {}) = id+ declToKind (A.FunDef _ q _ _) = insert q Function+ declToKind (A.DataSig _ q _ _) = insert q Datatype+ declToKind (A.DataDef _ q _ cs) = \m ->+ insert q Datatype $+ foldr (\d -> insert (getAxiomName d)+ (Constructor SC.Inductive))+ m cs+ declToKind (A.RecSig _ q _ _) = insert q Record+ declToKind (A.RecDef _ q _ c _ _ _) = insert q Record .+ case c of+ Nothing -> id+ Just q -> insert q (Constructor SC.Inductive) -- | Generates syntax highlighting information for all constructors--- occurring in patterns and expressions in the given declarations.+-- occurring in patterns and expressions in the given declaration. -- -- This function should only be called after type checking. -- Constructors can be overloaded, and the overloading is resolved by@@ -351,71 +428,130 @@ :: SourceToModule -- ^ Maps source file paths to module names. -> AbsolutePath -- ^ The module to highlight. -> NameKinds- -> [A.Declaration]+ -> A.Declaration -> TCM File-generateConstructorInfo modMap file kinds decls = do- -- Extract all defined names from the declaration list.- let names = Fold.toList $ Fold.foldMap A.allNames decls+generateConstructorInfo modMap file kinds decl = do+ -- Extract all defined names from the declaration.+ let names = Fold.toList (A.allNames decl) -- Look up the corresponding declarations in the internal syntax. defMap <- M.sigDefinitions <$> M.getSignature- let defs = catMaybes $ map (flip Map.lookup defMap) names+ let defs = catMaybes $ map (flip HMap.lookup defMap) names -- Instantiate meta variables. clauses <- R.instantiateFull $ concatMap M.defClauses defs types <- R.instantiateFull $ map defType defs - -- Find all constructors occurring in type signatures or clauses- -- within the given declarations.- constrs <- everything' (liftM2 (><)) query (types, clauses)+ let -- Find all patterns and terms.+ patterns = universeBi (types, clauses)+ terms = universeBi (types, clauses) + -- Find all constructors in the patterns and terms.+ constrs = concatMap getConstructorP patterns +++ concatMap getConstructor terms++ -- Find all constructors in right-hand sides of delayed definitions.+ delayed <- evalStateT (getDelayed terms) HSet.empty+ -- Return suitable syntax highlighting information.- return $ Fold.fold $ fmap (generate modMap file kinds . mkAmb) constrs+ return $ Fold.fold $ fmap (generate modMap file kinds . mkAmb)+ (delayed ++ constrs) where mkAmb q = A.AmbQ [q] - query :: GenericQ (TCM (Seq A.QName))- query = return mempty `mkQ`- getConstructor `extQ`- getConstructorP+ -- Finds names corresponding to delayed definitions occurring at the+ -- top of the given terms, as well as in the found definition's+ -- right-hand sides. Only definitions from the current file are+ -- considered.+ --+ -- Constructors occurring in the delayed definitions' right-hand+ -- sides are returned.+ --+ -- The set is used to avoid inspecting the same definition multiple+ -- times. - getConstructor :: I.Term -> TCM (Seq A.QName)- getConstructor (I.Con q _) = return $ Seq.singleton q- getConstructor (I.Def c _)- | fmap P.srcFile (P.rStart (P.getRange c)) == Just (Just file)- = retrieveCoconstructor c- getConstructor _ = return Seq.empty+ getDelayed :: [I.Term] -> StateT (HashSet A.QName) TCM [A.QName]+ getDelayed ts = concat <$> mapM getT ts+ where+ getT t = do+ lift $ reportSDoc "highlighting.delayed" 50 $+ text "Inspecting sub-term:" <+> prettyTCM t - getConstructorP :: I.Pattern -> TCM (Seq A.QName)- getConstructorP (I.ConP q _ _) = return $ Seq.singleton q- getConstructorP _ = return Seq.empty+ seen <- get+ case t of+ I.Def q _ | not (q `HSet.member` seen)+ &&+ fmap P.srcFile (P.rStart (P.getRange q)) ==+ Just (Just file)+ -> getQ q+ _ -> return [] - retrieveCoconstructor :: A.QName -> TCM (Seq A.QName)- retrieveCoconstructor c = do- def <- getConstInfo c- case defDelayed def of- -- Not a coconstructor.- NotDelayed -> return Seq.empty+ getQ q = do+ lift $ reportSDoc "highlighting.delayed" 30 $+ text "Inspecting name:" <+> prettyTCM q - Delayed -> do- clauses <- R.instantiateFull $ defClauses def- case clauses of- [I.Clause{ I.clauseBody = body }] -> case getRHS body of- Just (I.Con c args) -> do- s <- everything' (liftM2 (><)) query args- return $ Seq.singleton c >< s+ def <- lift $ getConstInfo q+ case defDelayed def of+ NotDelayed -> return []+ Delayed -> do+ lift $ reportSDoc "highlighting.delayed" 10 $+ text "Found delayed definition:" <+> prettyTCM q - -- The meta variable could not be instantiated.- Just (I.MetaV {}) -> return Seq.empty+ -- Mark the definition as seen.+ modify (HSet.insert q) - _ -> __IMPOSSIBLE__+ -- All sub-terms in the delayed definition's right-hand+ -- sides.+ terms <- universeBi . concat . map (getRHS . I.clauseBody) <$>+ lift (R.instantiateFull $ defClauses def) - _ -> __IMPOSSIBLE__- where- getRHS (I.Body v) = Just v- getRHS I.NoBody = Nothing- getRHS (I.Bind b) = getRHS (I.unAbs b)+ -- Find the constructors and continue the search.+ (concatMap getConstructor terms ++) <$> getDelayed terms + getRHS (I.Body v) = [v]+ getRHS I.NoBody = []+ getRHS (I.Bind b) = getRHS (I.unAbs b)++ getConstructorP :: I.Pattern -> [A.QName]+ getConstructorP (I.ConP q _ _) = [q]+ getConstructorP _ = []++ getConstructor :: I.Term -> [A.QName]+ getConstructor (I.Con q _) = [q]+ getConstructor _ = []++-- | Prints syntax highlighting info for an error.++printErrorInfo :: TCErr -> TCM ()+printErrorInfo e = do+ file <- envCurrentPath <$> ask+ let r = P.getRange e+ case P.rStart r of+ Just x | P.srcFile x == Just file -> do+ s <- E.prettyError e++ -- Erase previous highlighting.+ p (P.continuousPerLine r) mempty++ -- Print new highlighting.+ p r $ mempty { otherAspects = [Error]+ , note = Just s+ }+ _ -> internalError . ("invalid range when printing error: " ++) =<< E.prettyError e+ where+ p r x = printHighlightingInfo $ singletonC (rToR r) x++-- | Generates and prints syntax highlighting information for unsolved+-- meta-variables and certain unsolved constraints.++printUnsolvedInfo :: TCM ()+printUnsolvedInfo = do+ metaInfo <- computeUnsolvedMetaWarnings+ constraintInfo <- computeUnsolvedConstraints++ printHighlightingInfo+ (compress $ metaInfo `mappend` constraintInfo)+ -- | Generates syntax highlighting information for unsolved meta -- variables. @@ -430,9 +566,20 @@ ms <- filterM notBlocked =<< getOpenMetas rs <- mapM getMetaRange (ms \\ is)- return $ several (concatMap (rToR . P.continuousPerLine) rs)- $ mempty { otherAspects = [UnsolvedMeta] }+ return $ several (map (rToR . P.continuousPerLine) rs)+ (mempty { otherAspects = [UnsolvedMeta] }) +-- | Generates syntax highlighting information for unsolved constraints+-- that are not connected to a meta variable.++computeUnsolvedConstraints :: TCM File+computeUnsolvedConstraints = do+ cs <- getAllConstraints+ -- get ranges of emptyness constraints+ let rs = [ r | PConstr{ theConstraint = Closure{ clValue = IsEmpty r t }} <- cs ]+ return $ several (map (rToR . P.continuousPerLine) rs)+ (mempty { otherAspects = [UnsolvedConstraint] })+ -- | Generates a suitable file for a possibly ambiguous name. generate :: SourceToModule@@ -477,13 +624,13 @@ nameToFile modMap file xs x m mR = -- We don't care if we get any funny ranges. if all (== Just file) fileNames then- several rs' ((m isOp) { definitionSite = mFilePos })+ several (map rToR rs)+ ((m $ C.isOperator x) { definitionSite = mFilePos }) else mempty where fileNames = catMaybes $ map (fmap P.srcFile . P.rStart . P.getRange) (x : xs)- (rs, isOp) = getRanges x- rs' = rs ++ concatMap (fst . getRanges) xs+ rs = map P.getRange (x : xs) mFilePos = do r <- mR P.Pn { P.srcFile = Just f, P.posPos = p } <- P.rStart r@@ -516,35 +663,6 @@ concreteBase = A.nameConcrete . A.qnameName concreteQualifier = map A.nameConcrete . A.mnameToList . A.qnameModule bindingSite = A.nameBindingSite . A.qnameName---- | Like 'everything', but modified so that it does not descend into--- everything.--everything' :: (r -> r -> r) -> GenericQ r -> GenericQ r-everything' (+) = everythingBut- (+)- (False `mkQ` isString- `extQ` isAQName `extQ` isAName `extQ` isCName- `extQ` isScope `extQ` isMap1 `extQ` isMap2- `extQ` isAmbiguous)- where- isString :: String -> Bool- isAQName :: A.QName -> Bool- isAName :: A.Name -> Bool- isCName :: C.Name -> Bool- isScope :: S.ScopeInfo -> Bool- isMap1 :: Map A.QName A.QName -> Bool- isMap2 :: Map A.ModuleName A.ModuleName -> Bool- isAmbiguous :: A.AmbiguousQName -> Bool-- isString = const True- isAQName = const True- isAName = const True- isCName = const True- isScope = const True- isMap1 = const True- isMap2 = const True- isAmbiguous = const True ------------------------------------------------------------------------ -- All tests
+ src/full/Agda/Interaction/Highlighting/Generate.hs-boot view
@@ -0,0 +1,10 @@+module Agda.Interaction.Highlighting.Generate where+import Agda.TypeChecking.Monad.Base+import Agda.Syntax.Position (Range)++highlightAsTypeChecked+ :: MonadTCM tcm+ => Range+ -> Range+ -> tcm a+ -> tcm a
+ src/full/Agda/Interaction/Highlighting/LaTeX.hs view
@@ -0,0 +1,455 @@+{-# LANGUAGE CPP, ViewPatterns #-}++-- | Function for generating highlighted and aligned LaTeX from literate+-- Agda source.++module Agda.Interaction.Highlighting.LaTeX+ ( generateLaTeX+ ) where++import Data.Char+import Data.Maybe+import Data.Function+import Data.List+import Control.Monad.RWS+import Control.Monad.Error+import Control.Monad.Trans+import System.Directory+import System.FilePath+import System.Process+import System.Exit+import Data.Text (Text)+import qualified Data.Text as T+import qualified Data.Text.Encoding as E+import qualified Data.ByteString as BS++import qualified Data.List as List+import qualified Data.Map as Map++import Paths_Agda++import Agda.Syntax.Common+import qualified Agda.Syntax.Abstract as A+import Agda.Interaction.Highlighting.Precise+import Agda.TypeChecking.Monad (TCM)+import qualified Agda.TypeChecking.Monad as TCM+import Agda.Interaction.Options+import Agda.Compiler.CallCompiler+import qualified Agda.Utils.IO.UTF8 as UTF8++#include "../../undefined.h"+import Agda.Utils.Impossible++------------------------------------------------------------------------+-- * Datatypes.++-- | The @LaTeX@ monad is a combination of @ErrorT@ and @RWS@. The error+-- part is just used to keep track whether we finished or not, the+-- reader part isn't used, the writer is where the output goes and the+-- state is for keeping track of the tokens and some other useful info.+type LaTeX = ErrorT String (RWS () Text State)++data State = State+ { tokens :: Tokens+ , column :: Int -- ^ Column number, used for polytable alignment.+ , indent :: Int -- ^ Indentation level, also for alignment.+ , indentPrev :: Int+ , inCode :: Bool -- ^ Keeps track of whether we are in a code+ -- block or not.+ }++type Tokens = [Token]++data Token = Token+ { string :: Text+ , info :: MetaInfo+ , position :: Integer -- ^ Is not used currently, but could+ -- potentially be used for hyperlinks as in+ -- the HTML output?+ }++-- | Run function for the @LaTeX@ monad.+runLaTeX :: LaTeX a -> () -> State -> (Either String a, State, Text)+runLaTeX = runRWS . runErrorT++emptyState :: State+emptyState = State+ { tokens = []+ , column = 0+ , indent = 0+ , indentPrev = 0+ , inCode = False+ }++------------------------------------------------------------------------+-- * Some helpers.++(<+>) = T.append++isInfixOf' :: Text -> Text -> Maybe (Text, Text)+isInfixOf' needle haystack = go (T.tails haystack) 0+ where+ go [] n = Nothing+ go ((T.stripPrefix needle -> Just suf) : xss) n = Just (T.take n haystack, suf)+ go (_ : xss) n = go xss (n + 1)++isSpaces :: Text -> Bool+isSpaces (T.uncons -> Nothing) = True+isSpaces (T.uncons -> Just (c, s)) | isSpace c = isSpaces s+ | otherwise = False++isSpaces _ = __IMPOSSIBLE__++-- | Yields the next token, taking special care to begin/end code+-- blocks. Junk occuring before and after the code blocks is separated+-- into separate tokens, this makes it easier to keep track of whether+-- we are in a code block or not.+nextToken' :: LaTeX Token+nextToken' = do+ toks <- gets tokens+ case toks of+ [] -> throwError "Done"++ -- Clean begin/end code block or a LaTeX comment.+ t : ts | string t == beginCode || string t == endCode ||+ T.singleton '%' == T.take 1 (T.stripStart (string t)) -> do++ modify $ \s -> s { tokens = ts }+ return t++ t : ts -> do+ modify $ \s -> s { tokens = ts }++ inCode <- gets inCode+ let code = if inCode then endCode else beginCode++ case code `isInfixOf'` string t of+ Nothing -> do++ -- Spaces take care of their own column tracking.+ unless (isSpaces (string t)) $ do+ moveColumn $ T.length $ string t++ return t++ Just (pre, suf) -> do+ let t' = t { string = code }+ let t'' = t { string = suf }+ modify $ \s -> s { tokens = t' : t'' : tokens s }++ unless (isSpaces pre) $ do+ moveColumn $ T.length pre++ return $ t { string = pre }++nextToken :: LaTeX Text+nextToken = string `fmap` nextToken'++resetColumn :: LaTeX ()+resetColumn = modify $ \s -> s { column = 0 }++moveColumn :: Int -> LaTeX ()+moveColumn i = modify $ \s -> s { column = i + column s }++moveIndent :: Int -> LaTeX ()+moveIndent i = modify $ \s -> s { indent = i + indent s }++resetIndent :: LaTeX ()+resetIndent = modify $ \s -> s { indent = 0 }++setIndentPrev :: Int -> LaTeX ()+setIndentPrev i = modify $ \s -> s { indentPrev = i }++resetIndentPrev :: LaTeX ()+resetIndentPrev = modify $ \s -> s { indentPrev = 0 }++setInCode :: LaTeX ()+setInCode = modify $ \s -> s { inCode = True }++unsetInCode :: LaTeX ()+unsetInCode = modify $ \s -> s { inCode = False }++------------------------------------------------------------------------+-- * LaTeX and polytable strings.++-- Polytable, http://www.ctan.org/pkg/polytable, is used for code+-- alignment, similar to lhs2TeX's approach.++nl = T.pack "%\n"+beginCode = T.pack "\\begin{code}"+endCode = T.pack "\\end{code}"++ptOpen = T.pack "\\>"+ptOpen' i = ptOpen <+> T.pack ("[" ++ show i ++ "]")+ptClose = T.pack "\\<"+ptClose' i = ptClose <+> T.pack ("[" ++ show i ++ "]")+ptNL = nl <+> T.pack "\\\\\n"++cmdPrefix = T.pack "\\Agda"+cmdArg x = T.singleton '{' <+> x <+> T.singleton '}'+cmdIndent i = cmdPrefix <+> T.pack "Indent" <+>+ cmdArg (T.pack (show i)) <+> cmdArg T.empty++infixl' = T.pack "infixl"+infix' = T.pack "infix"+infixr' = T.pack "infixr"++------------------------------------------------------------------------+-- * Automaton.++-- | The start state, @nonCode@, prints non-code (the LaTeX part of+-- literate Agda) until it sees a @beginBlock@.+nonCode :: LaTeX ()+nonCode = do+ tok <- nextToken++ if tok == beginCode++ then do+ tell tok+ resetColumn+ setInCode+ code++ else do+ tell tok+ nonCode++-- | Deals with code blocks. Every token, except spaces, is pretty+-- printed as a LaTeX command.+code :: LaTeX ()+code = do++ col <- gets column+ when (col == 0) $ do+ tell ptOpen++ tok' <- nextToken'+ let tok = string tok'++ when (tok == endCode) $ do+ tell $ ptClose <+> tok+ unsetInCode+ nonCode++ when (tok `elem` [ infixl', infix', infixr' ]) $ do+ tell $ cmdPrefix <+> T.pack "Keyword" <+> cmdArg tok+ fixity+ code++ when (isSpaces tok) $ do+ spaces $ T.group tok+ code++ case aspect (info tok') of+ Nothing -> tell $ escape tok+ Just a -> tell $ cmdPrefix <+> T.pack (cmd a) <+> cmdArg (escape tok)+ code++ where+ cmd :: Aspect -> String+ cmd (Name mKind _) = maybe __IMPOSSIBLE__ showKind mKind+ where+ showKind :: NameKind -> String+ showKind (Constructor Inductive) = "InductiveConstructor"+ showKind (Constructor CoInductive) = "CoinductiveConstructor"+ showKind k = show k+ cmd a = show a++-- Escapes special characters.+escape :: Text -> Text+escape (T.uncons -> Nothing) = T.empty+escape (T.uncons -> Just (c, s)) = T.pack (replace c) <+> escape s+ where+ replace :: Char -> String+ replace c = case c of+ '_' -> "\\_"+ '{' -> "\\{"+ '}' -> "\\}"+ '#' -> "\\#"+ '$' -> "\\$"+ '&' -> "\\&"+ '%' -> "\\%"+ '~' -> "\textasciitilde"+ '^' -> "\textasciicircum"+ '\\' -> "\textbackslash"+ _ -> [ c ]+escape _ = __IMPOSSIBLE__++-- | Fixity declarations need a special treatment. The operations in+-- declarations like:+--+-- infix num op1 op2 op3+--+-- are treated as comments and thus grouped together with the newlines+-- that follow, which results incorrect LaTeX output -- the following+-- state remedies the problem by breaking on newlines.+fixity :: LaTeX ()+fixity = do+ tok <- nextToken++ case T.breakOn (T.pack "\n") tok of++ -- Spaces.+ (sps, nls) | nls == T.empty && isSpaces sps -> do+ spaces $ T.group sps+ fixity++ -- Fixity level.+ (num, nls) | nls == T.empty -> do+ tell $ cmdPrefix <+> T.pack "Number" <+> cmdArg num+ fixity++ -- Operations followed by newlines.+ (ops, nls) | otherwise -> do+ tell $ escape ops+ spaces (T.group nls)+++-- | Spaces are grouped before processed, because multiple consecutive+-- spaces determine the alignment of the code and consecutive newline+-- characters need special treatment as well.+spaces :: [Text] -> LaTeX ()+spaces [] = return ()+spaces ((T.uncons -> Nothing) : ss) = __IMPOSSIBLE__++-- Single spaces are ignored.+spaces ((T.uncons -> Just (' ', s)) : []) | T.null s = do+ moveColumn 1+ tell $ T.singleton ' '++-- Multiple spaces.+spaces (s@(T.uncons -> Just (' ', _)) : ss) = do+ let len = T.length s++ col <- gets column+ moveColumn len++ if col == 0+ then do++ -- FIX: What's going on here?+ ind <- gets indent+ indPrev <- gets indentPrev++ if ind == len+ then do+ tell $ ptOpen' indPrev+ else do+ if len < ind+ then do+ resetIndent+ resetIndentPrev+ tell $ ptOpen' $ if indPrev == 0 ||+ len == indPrev+ then 0+ else ind - indPrev - len+ else do+ moveIndent $ len - ind+ setIndentPrev ind+ tell $ ptOpen' ind++ tell $ cmdIndent len+ tell $ ptClose' len <+> nl <+> ptOpen' len+ else do+ tell $ T.singleton ' '+ col <- gets column+ tell $ ptClose' col <+> nl <+> ptOpen' col++ spaces ss++-- Newlines.+spaces (s@(T.uncons -> Just ('\n', _)) : ss) = do+ resetColumn+ tell $ ptClose <+> T.replicate (T.length s) ptNL+ spaces ss++-- Treat tabs as if they were spaces.+spaces (s@(T.uncons -> Just ('\t', _)) : ss) =+ spaces $ T.replicate (T.length s) (T.singleton ' ') : ss+spaces (_ : ss) = __IMPOSSIBLE__++------------------------------------------------------------------------+-- * Main.++defaultStyFile = "agda.sty"++-- | The only exported function. It's (only) called in @Main.hs@.+generateLaTeX :: A.ModuleName -> HighlightingInfo -> TCM ()+generateLaTeX mod hi = do++ options <- TCM.commandLineOptions++ -- There is a default directory given by 'defaultLaTeXDir'.+ let dir = optLaTeXDir options+ liftIO $ createDirectoryIfMissing True dir++ TCM.reportSLn "latex" 1 $ unlines+ [ ""+ , "Checking if " ++ defaultStyFile ++ " is found by the LaTeX environment."+ ]++ merrors <- callCompiler' "kpsewhich" [ defaultStyFile ]++ when (isJust merrors) $ do+ TCM.reportSLn "latex" 1 $ unlines+ [ ""+ , defaultStyFile ++ " was not found. Copying a default version of " +++ defaultStyFile+ , "into the working directory."+ ]++ liftIO $ do+ styFile <- getDataFileName defaultStyFile+ liftIO $ copyFile styFile defaultStyFile++ liftIO $ do+ source <- UTF8.readTextFile (modToFile mod <.> "lagda")+ let latex = E.encodeUtf8 $ toLaTeX source hi+ BS.writeFile (dir </> modToFile mod <.> "tex") latex++ where+ modToFile :: A.ModuleName -> FilePath+ modToFile mod = go $ show mod+ where+ go [] = []+ go ('.' : cs) = pathSeparator : go cs+ go (c : cs) = c : go cs++-- | Transforms the source code into LaTeX.+toLaTeX :: String -> HighlightingInfo -> Text+toLaTeX source hi++ = processTokens++ -- Head the list (the grouped chars contain the same meta info) and+ -- collect the characters into a string.+ . map (\xs -> case xs of+ (mi, (pos, _)) : _ ->+ Token { string = T.pack $ map (\(_, (_, c)) -> c) xs+ , info = maybe mempty id mi+ , position = pos+ }+ [] -> __IMPOSSIBLE__)++ . List.groupBy ((==) `on` fst) -- Characters which share the same+ -- meta info are the same token, so+ -- group them together.++ -- Look up the meta info at each position in the highlighting info.+ . map (\(pos, char) ->+ (Map.lookup pos infoMap, (pos, char)))++ -- Add position in file to each character.+ . zip [1..]+ $ source+ where+ infoMap = toMap (decompress hi)++processTokens :: Tokens -> Text+processTokens ts =+ case x of+ Left "Done" -> s+ _ -> __IMPOSSIBLE__+ where+ (x, _, s) = runLaTeX nonCode () (emptyState { tokens = ts })
src/full/Agda/Interaction/Highlighting/Precise.hs view
@@ -3,19 +3,31 @@ -- | Types used for precise syntax highlighting. module Agda.Interaction.Highlighting.Precise- ( Aspect(..)+ ( -- * Files+ Aspect(..) , NameKind(..) , OtherAspect(..) , MetaInfo(..) , File , HighlightingInfo+ -- ** Creation , singleton , several+ -- ** Inspection , smallestPos , toMap- , CompressedFile+ -- * Compressed files+ , CompressedFile(..)+ , compressedFileInvariant , compress , decompress+ -- ** Creation+ , singletonC+ , severalC+ , splitAtC+ -- ** Inspection+ , smallestPosC+ -- * Tests , Agda.Interaction.Highlighting.Precise.tests ) where @@ -25,15 +37,18 @@ import Data.List import Data.Function import Data.Monoid+import Control.Applicative ((<$>), (<*>))+import Control.Arrow ((&&&)) import Control.Monad-import Agda.Utils.QuickCheck+import Agda.Utils.QuickCheck hiding (ranges) import Data.Map (Map) import qualified Data.Map as Map-import Data.Generics (Typeable, Data)+import Data.Typeable (Typeable) import qualified Agda.Syntax.Abstract.Name as A import qualified Agda.Syntax.Common as C import qualified Agda.Syntax.Concrete as SC+import qualified Agda.Syntax.Position as P import Agda.Interaction.Highlighting.Range @@ -51,7 +66,7 @@ | Symbol -- ^ Symbols like forall, =, ->, etc. | PrimitiveType -- ^ Things like Set and Prop. | Name (Maybe NameKind) Bool -- ^ Is the name an operator part?- deriving (Eq, Show, Typeable, Data)+ deriving (Eq, Show, Typeable) data NameKind = Bound -- ^ Bound variable.@@ -63,7 +78,7 @@ | Postulate | Primitive -- ^ Primitive. | Record -- ^ Record type.- deriving (Eq, Show, Typeable, Data)+ deriving (Eq, Show, Typeable) -- | Other aspects. (These can overlap with each other and with -- 'Aspect's.)@@ -72,11 +87,16 @@ = Error | DottedPattern | UnsolvedMeta+ | UnsolvedConstraint+ -- ^ Unsolved constraint not connected to meta-variable. This+ -- could for instance be an emptyness constraint. | TerminationProblem | IncompletePattern -- ^ When this constructor is used it is probably a good idea to -- include a 'note' explaining why the pattern is incomplete.- deriving (Eq, Show, Enum, Bounded, Typeable, Data)+ | TypeChecks+ -- ^ Code which is being type-checked.+ deriving (Eq, Show, Enum, Bounded, Typeable) -- | Meta information which can be associated with a -- character\/character range.@@ -93,41 +113,32 @@ -- ^ The definition site of the annotated thing, if applicable and -- known. File positions are counted from 1. }- deriving (Eq, Show, Typeable, Data)+ deriving (Eq, Show, Typeable) -- | A 'File' is a mapping from file positions to meta information. -- -- The first position in the file has number 1. newtype File = File { mapping :: Map Integer MetaInfo }- deriving (Eq, Show, Typeable, Data)---- | Returns the smallest position, if any, in the 'File'.--smallestPos :: File -> Maybe Integer-smallestPos = fmap (fst . fst) . Map.minViewWithKey . mapping+ deriving (Eq, Show, Typeable) --- | Syntax highlighting information for a given source file.+-- | Syntax highlighting information. type HighlightingInfo = CompressedFile ------------------------------------------------------------------------ -- Creation --- | @'singleton' r m@ is a file whose positions are those in @r@, and--- in which every position is associated with @m@.--singleton :: Range -> MetaInfo -> File-singleton r m = File {- mapping = Map.fromAscList [ (p, m) | p <- toList r ] }+-- | @'singleton' rs m@ is a file whose positions are those in @rs@,+-- and in which every position is associated with @m@. -prop_singleton r m =- compress (singleton r m) ==- if null (toList r) then [] else [(r, m)]+singleton :: Ranges -> MetaInfo -> File+singleton rs m = File {+ mapping = Map.fromAscList [ (p, m) | p <- rangesToPositions rs ] } --- | Like 'singleton', but with several ranges instead of only one.+-- | Like 'singleton', but with several 'Ranges' instead of only one. -several :: [Range] -> MetaInfo -> File+several :: [Ranges] -> MetaInfo -> File several rs m = mconcat $ map (\r -> singleton r m) rs ------------------------------------------------------------------------@@ -170,6 +181,11 @@ ------------------------------------------------------------------------ -- Inspection +-- | Returns the smallest position, if any, in the 'File'.++smallestPos :: File -> Maybe Integer+smallestPos = fmap (fst . fst) . Map.minViewWithKey . mapping+ -- | Convert the 'File' to a map from file positions (counting from 1) -- to meta information. @@ -177,18 +193,35 @@ toMap = mapping --------------------------------------------------------------------------- Compression+-- Compressed files -- | A compressed 'File', in which consecutive positions with the same -- 'MetaInfo' are stored together. -type CompressedFile = [(Range, MetaInfo)]+newtype CompressedFile =+ CompressedFile { ranges :: [(Range, MetaInfo)] }+ deriving (Eq, Show, Typeable) +-- | Invariant for compressed files.+--+-- Note that these files are not required to be /maximally/+-- compressed, because ranges are allowed to be empty, and the+-- 'MetaInfo's in adjacent ranges are allowed to be equal.++compressedFileInvariant :: CompressedFile -> Bool+compressedFileInvariant (CompressedFile []) = True+compressedFileInvariant (CompressedFile f) =+ all rangeInvariant rs &&+ all (not . empty) rs &&+ and (zipWith (<=) (map to $ init rs) (map from $ tail rs))+ where rs = map fst f+ -- | Compresses a file by merging consecutive positions with equal -- meta information into longer ranges. compress :: File -> CompressedFile-compress f = map join $ groupBy' p (Map.toAscList $ mapping f)+compress f =+ CompressedFile $ map join $ groupBy' p (Map.toAscList $ mapping f) where p (pos1, m1) (pos2, m2) = pos2 == pos1 + 1 && m1 == m2 join pms = ( Range { from = head ps, to = last ps + 1 }@@ -203,20 +236,107 @@ File . Map.fromList . concat .- map (\(r, m) -> [ (p, m) | p <- toList r ])+ map (\(r, m) -> [ (p, m) | p <- rangeToPositions r ]) .+ ranges prop_compress f =- decompress c == f- &&- and (map (rangeInvariant . fst) c)+ compressedFileInvariant c &&- and [ not (overlapping r1 r2) | (r1, r2) <- allPairs (map fst c) ]+ decompress c == f+ where c = compress f++------------------------------------------------------------------------+-- Operations that work directly with compressed files++-- | @'singletonC' rs m@ is a file whose positions are those in @rs@,+-- and in which every position is associated with @m@.++singletonC :: Ranges -> MetaInfo -> CompressedFile+singletonC (Ranges rs) m =+ CompressedFile [(r, m) | r <- rs, not (empty r)]++prop_singleton rs m = singleton rs m == decompress (singletonC rs m)++-- | Like 'singletonR', but with a list of 'Ranges' instead of a+-- single one.++severalC :: [Ranges] -> MetaInfo -> CompressedFile+severalC rss m = mconcat $ map (\rs -> singletonC rs m) rss++prop_several rss m = several rss m == decompress (severalC rss m)++-- | Merges compressed files.++mergeC :: CompressedFile -> CompressedFile -> CompressedFile+mergeC (CompressedFile f1) (CompressedFile f2) =+ CompressedFile (mrg f1 f2) where- c = compress f+ mrg [] f2 = f2+ mrg f1 [] = f1+ mrg (p1@(i1,_):f1) (p2@(i2,_):f2)+ | to i1 <= from i2 = p1 : mrg f1 (p2:f2)+ | to i2 <= from i1 = p2 : mrg (p1:f1) f2+ | to i1 <= to i2 = ps1 ++ mrg f1 (ps2 ++ f2)+ | otherwise = ps1 ++ mrg (ps2 ++ f1) f2+ where (ps1, ps2) = fuse p1 p2 - allPairs [] = []- allPairs (x : xs) = map ((,) x) xs ++ allPairs xs+ -- Precondition: The ranges are overlapping.+ fuse (i1, m1) (i2, m2) =+ ( fix [ (Range { from = a, to = b }, ma)+ , (Range { from = b, to = c }, mergeMetaInfo m1 m2)+ ]+ , fix [ (Range { from = c, to = d }, md)+ ]+ )+ where+ [(a, ma), (b, _), (c, _), (d, md)] =+ sortBy (compare `on` fst)+ [(from i1, m1), (to i1, m1), (from i2, m2), (to i2, m2)]+ fix = filter (not . empty . fst) +prop_merge f1 f2 =+ merge f1 f2 == decompress (mergeC (compress f1) (compress f2))++instance Monoid CompressedFile where+ mempty = CompressedFile []+ mappend = mergeC++-- | @splitAtC p f@ splits the compressed file @f@ into @(f1, f2)@,+-- where all the positions in @f1@ are @< p@, and all the positions+-- in @f2@ are @>= p@.++splitAtC :: Integer -> CompressedFile ->+ (CompressedFile, CompressedFile)+splitAtC p f = (CompressedFile f1, CompressedFile f2)+ where+ (f1, f2) = split $ ranges f++ split [] = ([], [])+ split (rx@(r,x) : f)+ | p <= from r = ([], rx:f)+ | to r <= p = (rx:f1, f2)+ | otherwise = ([ (toP, x) ], (fromP, x) : f)+ where (f1, f2) = split f+ toP = Range { from = from r, to = p }+ fromP = Range { from = p, to = to r }++prop_splitAtC p f =+ all (< p) (positions f1) &&+ all (>= p) (positions f2) &&+ decompress (mergeC f1 f2) == decompress f+ where+ (f1, f2) = splitAtC p f++ positions = Map.keys . toMap . decompress++-- | Returns the smallest position, if any, in the 'CompressedFile'.++smallestPosC :: CompressedFile -> Maybe Integer+smallestPosC (CompressedFile []) = Nothing+smallestPosC (CompressedFile ((r, _) : _)) = Just (from r)++prop_smallestPos f = smallestPos (decompress f) == smallestPosC f+ ------------------------------------------------------------------------ -- Generators @@ -227,6 +347,9 @@ , (1, liftM2 Name (maybeGen arbitrary) arbitrary) ] + shrink Name{} = [Comment]+ shrink _ = []+ instance CoArbitrary Aspect where coarbitrary Comment = variant 0 coarbitrary Keyword = variant 1@@ -249,6 +372,9 @@ , Record ] + shrink Constructor{} = [Bound]+ shrink _ = []+ instance CoArbitrary NameKind where coarbitrary Bound = variant 0 coarbitrary (Constructor ind) = variant 1 . coarbitrary ind@@ -276,6 +402,12 @@ , note = note, definitionSite = defSite }) where string = listOfElements "abcdefABCDEF/\\.\"'@()åäö\n" + shrink (MetaInfo a o n d) =+ [ MetaInfo a o n d | a <- shrink a ] +++ [ MetaInfo a o n d | o <- shrink o ] +++ [ MetaInfo a o n d | n <- shrink n ] +++ [ MetaInfo a o n d | d <- shrink d ]+ instance CoArbitrary MetaInfo where coarbitrary (MetaInfo aspect otherAspects note defSite) = coarbitrary aspect .@@ -285,10 +417,28 @@ instance Arbitrary File where arbitrary = fmap (File . Map.fromList) $ listOf arbitrary+ shrink = map (File . Map.fromList) . shrink . Map.toList . toMap instance CoArbitrary File where coarbitrary (File rs) = coarbitrary (Map.toAscList rs) +instance Arbitrary CompressedFile where+ arbitrary = do+ rs <- (\ns1 ns2 -> toRanges $ sort $+ ns1 ++ concatMap (\n -> [n, succ n]) ns2) <$>+ arbitrary <*> arbitrary+ CompressedFile <$> mapM (\r -> (,) r <$> arbitrary) rs+ where+ toRanges (f : t : rs)+ | f == t = toRanges (t : rs)+ | otherwise = Range { from = f, to = t } :+ toRanges (case rs of+ f : rs | t == f -> rs+ _ -> rs)+ toRanges _ = []++ shrink (CompressedFile f) = CompressedFile <$> shrink f+ ------------------------------------------------------------------------ -- All tests @@ -296,6 +446,18 @@ tests :: IO Bool tests = runTests "Agda.Interaction.Highlighting.Precise"- [ quickCheck' prop_singleton+ [ quickCheck' compressedFileInvariant+ , quickCheck' (all compressedFileInvariant . shrink)+ , quickCheck' (\r m -> compressedFileInvariant $ singletonC r m)+ , quickCheck' (\rs m -> compressedFileInvariant $ severalC rs m)+ , quickCheck' (\f1 f2 -> compressedFileInvariant $ mergeC f1 f2)+ , quickCheck' (\i f -> all compressedFileInvariant $+ (\(f1, f2) -> [f1, f2]) $+ splitAtC i f) , quickCheck' prop_compress+ , quickCheck' prop_singleton+ , quickCheck' prop_several+ , quickCheck' prop_merge+ , quickCheck' prop_splitAtC+ , quickCheck' prop_smallestPos ]
src/full/Agda/Interaction/Highlighting/Range.hs view
@@ -5,21 +5,25 @@ module Agda.Interaction.Highlighting.Range ( Range(..) , rangeInvariant+ , Ranges(..)+ , rangesInvariant , overlapping- , toList- , getRanges- , getRangesA+ , empty+ , rangeToPositions+ , rangesToPositions , rToR+ , minus , Agda.Interaction.Highlighting.Range.tests ) where -import Agda.Utils.QuickCheck+import Control.Applicative ((<$>)) import Data.List-import Data.Generics (Typeable, Data)-import Agda.Utils.TestHelpers-import qualified Agda.Syntax.Abstract as A-import qualified Agda.Syntax.Concrete as C+import Data.Typeable (Typeable)+ import qualified Agda.Syntax.Position as P+import Agda.Utils.List+import Agda.Utils.TestHelpers+import Agda.Utils.QuickCheck -- | Character ranges. The first character in the file has position 1. -- Note that the 'to' position is considered to be outside of the@@ -28,13 +32,28 @@ -- Invariant: @'from' '<=' 'to'@. data Range = Range { from, to :: Integer }- deriving (Eq, Ord, Show, Typeable, Data)+ deriving (Eq, Ord, Show, Typeable) -- | The 'Range' invariant. rangeInvariant :: Range -> Bool rangeInvariant r = from r <= to r +-- | Zero or more consecutive and separated ranges.++newtype Ranges = Ranges [Range]+ deriving (Eq, Show)++-- | The 'Ranges' invariant.++rangesInvariant :: Ranges -> Bool+rangesInvariant (Ranges []) = True+rangesInvariant (Ranges rs) =+ and (zipWith (<) (map to $ init rs) (map from $ tail rs))++------------------------------------------------------------------------+-- Queries+ -- | 'True' iff the ranges overlap. -- -- The ranges are assumed to be well-formed.@@ -43,34 +62,30 @@ overlapping r1 r2 = not $ to r1 <= from r2 || to r2 <= from r1 --- | Converts a range to a list of positions.+-- | 'True' iff the range is empty. -toList :: Range -> [Integer]-toList r = [from r .. to r - 1]+empty :: Range -> Bool+empty r = to r <= from r ------------------------------------------------------------------------ -- Conversion --- | Calculates a set of ranges associated with a name.------ For an operator the ranges associated with the NameParts are--- returned. Otherwise the range associated with the Name is returned.------ A boolean, indicating operatorness, is also returned.+-- | Converts a range to a list of positions. -getRanges :: C.Name -> ([Range], Bool)-getRanges n = (rToR $ P.getRange n, C.isOperator n)+rangeToPositions :: Range -> [Integer]+rangeToPositions r = [from r .. to r - 1] --- | Like 'getRanges', but for 'A.QName's. Note that the module part--- of the name is thrown away; only the base part is used.+-- | Converts several ranges to a list of positions. -getRangesA :: A.QName -> ([Range], Bool)-getRangesA = getRanges . A.nameConcrete . A.qnameName+rangesToPositions :: Ranges -> [Integer]+rangesToPositions (Ranges rs) = concatMap rangeToPositions rs --- | Converts a 'P.Range' to a list of 'Range's.+prop_rangesToPositions rs = sorted (rangesToPositions rs) -rToR :: P.Range -> [Range]-rToR (P.Range is) = map iToR is+-- | Converts a 'P.Range' to a 'Ranges'.++rToR :: P.Range -> Ranges+rToR (P.Range is) = Ranges (map iToR is) where iToR (P.Interval { P.iStart = P.Pn { P.posPos = pos1 } , P.iEnd = P.Pn { P.posPos = pos2 }@@ -78,6 +93,33 @@ Range { from = toInteger pos1, to = toInteger pos2 } ------------------------------------------------------------------------+-- Operations++-- | @minus xs ys@ computes the difference between @xs@ and @ys@: the+-- result contains those positions which are present in @xs@ but not+-- in @ys@.+--+-- Linear in the lengths of the input ranges.++minus :: Ranges -> Ranges -> Ranges+minus (Ranges rs1) (Ranges rs2) = Ranges (m rs1 rs2)+ where+ m [] _ = []+ m xs [] = xs+ m (x:xs) (y:ys)+ | empty y = m (x:xs) ys+ | to x < from y = x : m xs (y:ys)+ | to y < from x = m (x:xs) ys+ | from x < from y = Range { from = from x, to = from y } :+ m (Range { from = from y, to = to x } : xs) (y:ys)+ | to y < to x = m (Range { from = to y, to = to x } : xs) ys+ | otherwise = m xs (y:ys)++prop_minus xs ys =+ rangesToPositions (xs `minus` ys) ==+ rangesToPositions xs \\ rangesToPositions ys++------------------------------------------------------------------------ -- Generators instance Arbitrary Range where@@ -88,6 +130,9 @@ instance CoArbitrary Range where coarbitrary (Range f t) = coarbitrary f . coarbitrary t +instance Arbitrary Ranges where+ arbitrary = rToR <$> arbitrary+ ------------------------------------------------------------------------ -- All tests @@ -96,4 +141,9 @@ tests :: IO Bool tests = runTests "Agda.Interaction.Highlighting.Range" [ quickCheck' rangeInvariant+ , quickCheck' rangesInvariant+ , quickCheck' (rangesInvariant . rToR)+ , quickCheck' (\r1 r2 -> rangesInvariant $ r1 `minus` r2)+ , quickCheck' prop_rangesToPositions+ , quickCheck' prop_minus ]
src/full/Agda/Interaction/Highlighting/Vim.hs view
@@ -4,6 +4,7 @@ import Control.Monad.Trans import Data.Char+import Data.Function ( on ) import Data.Set ( Set ) import Data.Map ( Map ) import System.FilePath@@ -23,7 +24,8 @@ #include "../../undefined.h" import Agda.Utils.Impossible -on f g x y = f (g x) (g y)+-- defined in Data.Function+-- on f g x y = f (g x) (g y) vimFile :: FilePath -> FilePath vimFile file =@@ -46,8 +48,8 @@ match cat ws = "syn match " ++ cat ++ " \"" ++ concat (List.intersperse "\\|" $ map escape ws) ++ "\"" -matches :: [String] -> [String] -> [String] -> [String] -> [String]-matches cons icons defs idefs =+matches :: [String] -> [String] -> [String] -> [String] -> [String] -> [String] -> [String]+matches cons icons defs idefs flds iflds = map snd $ List.sortBy (compare `on` fst) $ cons' ++ defs' ++ icons' ++ idefs'@@ -56,6 +58,8 @@ icons' = foo "agdaInfixConstructor" $ classify length icons defs' = foo "agdaFunction" $ classify length defs idefs' = foo "agdaInfixFunction" $ classify length idefs+ flds' = foo "agdaProjection" $ classify length flds+ iflds' = foo "agdaInfixProjection" $ classify length iflds classify f = List.groupBy ((==) `on` f) . List.sortBy (compare `on` f)@@ -64,16 +68,19 @@ foo cat = map (length . head /\ match cat) toVim :: NamesInScope -> String-toVim ns = unlines $ matches mcons micons mdefs midefs+toVim ns = unlines $ matches mcons micons mdefs midefs mflds miflds where cons = [ x | (x, def:_) <- Map.toList ns, anameKind def == ConName ] defs = [ x | (x, def:_) <- Map.toList ns, anameKind def == DefName ]+ flds = [ x | (x, fld:_) <- Map.toList ns, anameKind fld == FldName ] mcons = map show cons mdefs = map show defs+ mflds = map show flds micons = concatMap parts cons midefs = concatMap parts defs+ miflds = concatMap parts flds parts (NoName _ _) = [] parts (Name _ [_]) = []
src/full/Agda/Interaction/Imports.hs view
@@ -4,23 +4,26 @@ -} module Agda.Interaction.Imports where -import Prelude hiding (catch)+import Prelude import Control.Arrow import Control.Monad.Error+import Control.Monad.Reader import Control.Monad.State import qualified Control.Exception as E++import Data.Function (on) import qualified Data.Map as Map import qualified Data.List as List import qualified Data.Set as Set+import qualified Data.Foldable as Fold (toList) import qualified Data.ByteString.Lazy as BS import Data.List import Data.Maybe+import Data.Monoid (mempty, mappend) import Data.Map (Map) import Data.Set (Set)-import System.Directory-import System.Time-import qualified Agda.Utils.IO.Locale as LocIO+import System.Directory (doesFileExist, getModificationTime, removeFile) import System.FilePath hiding (splitPath) import Agda.Syntax.Position@@ -35,6 +38,7 @@ import Agda.Termination.TermCheck +import Agda.TypeChecking.Errors import Agda.TypeChecking.Reduce import Agda.TypeChecking.Monad import Agda.TypeChecking.Monad.Builtin@@ -42,8 +46,10 @@ import Agda.TypeChecking.Primitive import Agda.TypeChecker +import Agda.Interaction.EmacsCommand import Agda.Interaction.FindFile import Agda.Interaction.Options+import Agda.Interaction.Response (Response(Resp_RunningInfo)) import Agda.Interaction.Highlighting.Precise (HighlightingInfo) import Agda.Interaction.Highlighting.Generate import Agda.Interaction.Highlighting.Vim@@ -54,6 +60,7 @@ import Agda.Utils.IO.Binary import Agda.Utils.Pretty import Agda.Utils.Fresh+import Agda.Utils.Time import Agda.Utils.Impossible #include "../undefined.h"@@ -79,24 +86,25 @@ Just b1 = Map.lookup b bs Just b2 = Map.lookup b bi mapM_ check (map fst $ Map.toList $ Map.intersection bs bi)- addImportedThings sig bi (iHaskellImports i)+ addImportedThings sig bi (iHaskellImports i) (iPatternSyns i) reportSLn "import.iface.merge" 20 $ " Rebinding primitives " ++ show prim prim <- Map.fromList <$> mapM rebind prim modify $ \st -> st { stImportedBuiltins = stImportedBuiltins st `Map.union` prim } where- rebind x = do+ rebind (x, q) = do PrimImpl _ pf <- lookupPrimitiveFunction x- return (x, Prim pf)+ return (x, Prim $ pf { primFunName = q }) addImportedThings ::- Signature -> BuiltinThings PrimFun -> Set String -> TCM ()-addImportedThings isig ibuiltin hsImports =+ Signature -> BuiltinThings PrimFun -> Set String -> A.PatternSynDefns -> TCM ()+addImportedThings isig ibuiltin hsImports patsyns = modify $ \st -> st { stImports = unionSignatures [stImports st, isig] , stImportedBuiltins = Map.union (stImportedBuiltins st) ibuiltin , stHaskellImports = Set.union (stHaskellImports st) hsImports+ , stPatternSynImports = Map.union (stPatternSynImports st) patsyns } -- | Scope checks the given module. A proper version of the module@@ -107,7 +115,7 @@ reportSLn "import.scope" 5 $ "Scope checking " ++ show x verboseS "import.scope" 10 $ do visited <- Map.keys <$> getVisitedModules- liftIO $ LocIO.putStrLn $+ reportSLn "" 0 $ " visited: " ++ intercalate ", " (map (render . pretty) visited) i <- fst <$> getInterface x addImport x@@ -149,30 +157,6 @@ } return r --- | Warnings.------ Invariant: The fields are never empty at the same time.--data Warnings = Warnings- { terminationProblems :: [TerminationError]- -- ^ Termination checking problems are not reported if- -- 'optTerminationCheck' is 'False'.- , unsolvedMetaVariables :: [Range]- -- ^ Meta-variable problems are reported as type errors unless- -- 'optAllowUnsolved' is 'True'.- , unsolvedConstraints :: Constraints- -- ^ Same as 'unsolvedMetaVariables'.- }---- | Turns warnings into an error. Even if several errors are possible--- only one is raised.--warningsToError :: Warnings -> TypeError-warningsToError (Warnings [] [] []) = __IMPOSSIBLE__-warningsToError (Warnings _ w@(_:_) _) = UnsolvedMetas w-warningsToError (Warnings _ _ w@(_:_)) = UnsolvedConstraints w-warningsToError (Warnings w@(_:_) _ _) = TerminationCheckFailed w- -- | Type checks the given module (if necessary). typeCheck :: AbsolutePath -> TCM (Interface, Maybe Warnings)@@ -206,9 +190,10 @@ -- be preserved? -> TCM (Interface, Either Warnings ClockTime) getInterface' x includeStateChanges =+ withIncreasedModuleNestingLevel $ -- Preserve the pragma options unless includeStateChanges is True.- bracket (stPragmaOptions <$> get)- (unless includeStateChanges . setPragmaOptions) $ \_ -> do+ bracket_ (stPragmaOptions <$> get)+ (unless includeStateChanges . setPragmaOptions) $ do -- Forget the pragma options (locally). setCommandLineOptions . stPersistentOptions . stPersistent =<< get @@ -241,7 +226,10 @@ visited <- isVisited x reportSLn "import.iface" 5 $ if visited then " We've been here. Don't merge." else " New module. Let's check it out."- unless (visited || stateChangesIncluded) $ mergeInterface i+ unless (visited || stateChangesIncluded) $ do+ mergeInterface i+ ifTopLevelAndHighlightingLevelIs NonInteractive $+ highlightFromInterface i file modify (\s -> s { stCurrentModule = Just $ iModuleName i }) @@ -255,7 +243,7 @@ where isCached file = do let ifile = filePath $ toIFile file- exist <- liftIO $ doesFileExist ifile+ exist <- liftIO $ doesFileExistCaseSensitive ifile if not exist then return False else do@@ -265,6 +253,18 @@ Just (mi, mt) | mt >= t -> True _ -> False + -- Formats the "Checking", "Finished" and "Skipping" messages.+ chaseMsg kind file = do+ nesting <- envModuleNestingLevel <$> ask+ let s = genericReplicate nesting ' ' ++ kind +++ " " ++ render (pretty x) +++ case file of+ Nothing -> "."+ Just f -> " (" ++ f ++ ")."+ ifM (envEmacs <$> ask)+ (get >>= \st -> stInteractionOutputCallback st $ Resp_RunningInfo s)+ (reportSLn "" 1 s)+ skip file = do -- Examine the mtime of the interface file. If it is newer than the -- stored version (in stDecodedModules), or if there is no stored version,@@ -301,52 +301,63 @@ -- liftIO close -- Close the interface file. See above. typeCheck file else do- unless cached $ reportSLn "" 1 $- "Skipping " ++ render (pretty x) ++- " (" ++ ifile ++ ")."+ unless cached $ chaseMsg "Skipping" (Just ifile) -- We set the pragma options of the skipped file here, -- because if the top-level file is skipped we want the -- pragmas to apply to interactive commands in the UI. mapM_ setOptionsFromPragma (iPragmaOptions i) return (False, (i, Right t)) - typeCheck file =- let ret a = do- reportSLn "" 1 $ "Finished " ++ render (pretty x) ++ "."- return a- in do+ typeCheck file = do+ let withMsgs m = do+ chaseMsg "Checking" (Just $ filePath file)+ x <- m+ chaseMsg "Finished" Nothing+ return x+ -- Do the type checking.- reportSLn "" 1 $ "Checking " ++ render (pretty x) ++ " (" ++ filePath file ++ ")."+ if includeStateChanges then do- r <- createInterface file x+ r <- withMsgs $ createInterface file x -- Merge the signature with the signature for imported -- things. sig <- getSignature- addImportedThings sig Map.empty Set.empty+ patsyns <- getPatternSyns+ addImportedThings sig Map.empty Set.empty patsyns setSignature emptySignature+ setPatternSyns Map.empty - ret (True, r)+ return (True, r) else do ms <- getImportPath+ emacs <- envEmacs <$> ask+ nesting <- envModuleNestingLevel <$> ask mf <- stModuleToSource <$> get vs <- getVisitedModules ds <- getDecodedModules opts <- stPersistentOptions . stPersistent <$> get isig <- getImportedSignature ibuiltin <- gets stImportedBuiltins+ ipatsyns <- getPatternSynImports+ ho <- stInteractionOutputCallback <$> get -- Every interface is treated in isolation. Note: Changes -- to stDecodedModules are not preserved if an error is -- encountered in an imported module. r <- liftIO $ runTCM $- withImportPath ms $ do+ withImportPath ms $+ local (\e -> e { envEmacs = emacs+ , envModuleNestingLevel = nesting+ }) $ do setDecodedModules ds setCommandLineOptions opts- modify $ \s -> s { stModuleToSource = mf }+ modify $ \s -> s { stModuleToSource = mf+ , stInteractionOutputCallback = ho+ } setVisitedModules vs- addImportedThings isig ibuiltin Set.empty+ addImportedThings isig ibuiltin Set.empty ipatsyns - r <- createInterface file x+ r <- withMsgs $ createInterface file x mf <- stModuleToSource <$> get ds <- getDecodedModules@@ -363,13 +374,29 @@ Right (r, update) -> do update case r of- (_, Right _) -> do- r <- skip file- ret r- _ ->- ret (False, r)+ (_, Right _) ->+ -- We skip the file which has just been type-checked to+ -- be able to forget some of the local state from+ -- checking the module.+ -- Note that this doesn't actually read the interface+ -- file, only the cached interface.+ skip file+ _ -> return (False, r) +-- | Print the highlighting information contained in the given+-- interface. +highlightFromInterface+ :: Interface+ -> AbsolutePath+ -- ^ The corresponding file.+ -> TCM ()+highlightFromInterface i file = do+ reportSLn "import.iface" 5 $+ "Generating syntax info for " ++ filePath file +++ " (read from interface)."+ printHighlightingInfo (iHighlighting i)+ readInterface :: FilePath -> TCM (Maybe Interface) readInterface file = do -- Decode the interface file@@ -389,9 +416,9 @@ -- Catch exceptions `catchError` handler where- handler e = case errError e of+ handler e = case e of IOException _ e -> do- liftIO $ LocIO.putStrLn $ "IO exception: " ++ show e+ reportSLn "" 0 $ "IO exception: " ++ show e return Nothing -- Work-around for file locking bug. -- TODO: What does this refer to? Please -- document.@@ -424,12 +451,17 @@ :: AbsolutePath -- ^ The file to type check. -> C.TopLevelModuleName -- ^ The expected module name. -> TCM (Interface, Either Warnings ClockTime)-createInterface file mname = do- reportSLn "import.iface.create" 5 $+createInterface file mname =+ local (\e -> e { envCurrentPath = file }) $ do+ modFile <- stModuleToSource <$> get+ fileTokenInfo <- generateTokenInfo file+ modify $ \st -> st { stTokens = fileTokenInfo }++ reportSLn "import.iface.create" 5 $ "Creating interface for " ++ render (pretty mname) ++ "." verboseS "import.iface.create" 10 $ do visited <- Map.keys <$> getVisitedModules- liftIO $ LocIO.putStrLn $+ reportSLn "" 0 $ " visited: " ++ intercalate ", " (map (render . pretty) visited) previousHsImports <- getHaskellImports@@ -444,75 +476,55 @@ mapM_ setOptionsFromPragma options topLevel <- concreteToAbstract_ (TopLevel top) - termErrs <- catchError (do- -- Type checking.- checkDecls (topLevelDecls topLevel)- unfreezeMetas-- -- Count number of metas- verboseS "profile.metas" 10 $ do- MetaId n <- fresh- tickN "metas" n+ let ds = topLevelDecls topLevel - -- Termination checking.- termErrs <- ifM (optTerminationCheck <$> pragmaOptions)- (termDecls $ topLevelDecls topLevel)- (return [])- mapM_ (\e -> reportSLn "term.warn.no" 2- (show (termErrFunctions e) ++- " do(es) NOT pass the termination checker."))- termErrs- return termErrs- ) (\e -> do- -- If there is an error syntax highlighting info can still be- -- generated.- case rStart $ getRange e of- Just (Pn { srcFile = Just f }) | f == file -> do- syntaxInfo <- generateSyntaxInfo file (Just e) topLevel []- modFile <- stModuleToSource <$> get- -- The highlighting info is included with the error.- case errHighlighting e of- Just _ -> __IMPOSSIBLE__- Nothing ->- throwError $ e { errHighlighting =- Just (syntaxInfo, modFile) }- _ -> throwError e- )+ ifTopLevelAndHighlightingLevelIs NonInteractive $ do+ -- Generate and print approximate syntax highlighting info.+ printHighlightingInfo fileTokenInfo+ mapM_ (\d -> generateAndPrintSyntaxInfo d Partial) ds - -- Generate syntax highlighting info.- syntaxInfo <- generateSyntaxInfo file Nothing topLevel termErrs+ catchError (checkDecls ds) $ \e -> do+ ifTopLevelAndHighlightingLevelIs NonInteractive $+ printErrorInfo e+ throwError e - -- Generate Vim file.- whenM (optGenerateVimFile <$> commandLineOptions) $- withScope_ (insideScope topLevel) $ generateVimFile $ filePath file+ unfreezeMetas - -- Print stats- stats <- Map.toList <$> getStatistics- case stats of- [] -> return ()- _ -> reportS "profile" 1 $ unlines $- [ "Ticks for " ++ show (pretty mname) ] ++- [ " " ++ s ++ " = " ++ show n- | (s, n) <- sortBy (compare `on` snd) stats ]+ -- Count number of metas+ verboseS "profile.metas" 10 $ do+ MetaId n <- fresh+ tickN "metas" (fromIntegral n) - -- Check if there are unsolved meta-variables...- unsolvedOK <- optAllowUnsolved <$> pragmaOptions- unsolvedMetas <- List.nub <$> (mapM getMetaRange =<< getOpenMetas)- unless (null unsolvedMetas || unsolvedOK) $- typeError $ UnsolvedMetas unsolvedMetas+ -- Move any remaining token highlighting to stSyntaxInfo.+ ifTopLevelAndHighlightingLevelIs NonInteractive $+ printHighlightingInfo . stTokens =<< get+ modify $ \st ->+ st { stTokens = mempty+ , stSyntaxInfo = stSyntaxInfo st `mappend` stTokens st+ } - -- ...or unsolved constraints- unsolvedConstraints <- getAllConstraints- unless (null unsolvedConstraints || unsolvedOK) $- typeError $ UnsolvedConstraints unsolvedConstraints+ whenM (optGenerateVimFile <$> commandLineOptions) $+ -- Generate Vim file.+ withScope_ (insideScope topLevel) $ generateVimFile $ filePath file setScope $ outsideScope topLevel reportSLn "scope.top" 50 $ "SCOPE " ++ show (insideScope topLevel) + syntaxInfo <- stSyntaxInfo <$> get i <- buildInterface topLevel syntaxInfo previousHsImports options - if and [ null termErrs, null unsolvedMetas, null unsolvedConstraints ]+ -- TODO: It would be nice if unsolved things were highlighted+ -- after every mutual block.++ termErrs <- Fold.toList <$> stTermErrs <$> get+ unsolvedMetas <- List.nub <$> (mapM getMetaRange =<< getOpenMetas)+ unsolvedConstraints <- getAllConstraints++ ifTopLevelAndHighlightingLevelIs NonInteractive $+ printUnsolvedInfo++ r <- if and [ null termErrs, null unsolvedMetas, null unsolvedConstraints ] then do -- The file was successfully type-checked (and no warnings were -- encountered), so the interface should be written out.@@ -522,6 +534,17 @@ else return (i, Left $ Warnings termErrs unsolvedMetas unsolvedConstraints) + -- Print stats+ stats <- Map.toList <$> getStatistics+ case stats of+ [] -> return ()+ _ -> reportS "profile" 1 $ unlines $+ [ "Ticks for " ++ show (pretty mname) ] +++ [ " " ++ s ++ " = " ++ show n+ | (s, n) <- sortBy (compare `on` snd) stats ]++ return r+ -- | Builds an interface for the current module, which should already -- have been successfully type checked. @@ -543,7 +566,8 @@ builtin <- gets stLocalBuiltins ms <- getImports hsImps <- getHaskellImports- let builtin' = Map.mapWithKey (\x b -> fmap (const x) b) builtin+ patsyns <- getPatternSyns+ let builtin' = Map.mapWithKey (\x b -> fmap (\pf -> (x, primFunName pf)) b) builtin reportSLn "import.iface" 7 " instantiating all meta variables" i <- instantiateFull $ Interface { iImportedModules = Set.toList ms@@ -556,6 +580,7 @@ previousHsImports , iHighlighting = syntaxInfo , iPragmaOptions = pragmas+ , iPatternSyns = patsyns } reportSLn "import.iface" 7 " interface complete" return i
+ src/full/Agda/Interaction/InteractionTop.hs view
@@ -0,0 +1,1034 @@+{-# LANGUAGE CPP, TypeSynonymInstances, FlexibleInstances,+ MultiParamTypeClasses, Rank2Types,+ GeneralizedNewtypeDeriving, ScopedTypeVariables,+ GADTs #-}+{-# OPTIONS -fno-cse #-}++module Agda.Interaction.InteractionTop+ ( module Agda.Interaction.InteractionTop+ )+ where++import System.Directory+import qualified System.IO as IO+import Data.Maybe+import Data.Function+import Control.Applicative hiding (empty)+import qualified Control.Exception as E++import Agda.Utils.Pretty+import Agda.Utils.String+import Agda.Utils.FileName+import Agda.Utils.Tuple+import qualified Agda.Utils.IO.UTF8 as UTF8++import Control.Monad.Identity+import Control.Monad.Error+import Control.Monad.Reader+import Control.Monad.State+import Data.List as List+import qualified Data.Map as Map+import qualified System.Mem as System++import Agda.TypeChecking.Monad as TM+ hiding (initState, setCommandLineOptions)+import qualified Agda.TypeChecking.Monad as TM+import Agda.TypeChecking.Errors++import Agda.Syntax.Fixity+import Agda.Syntax.Position+import Agda.Syntax.Parser+import Agda.Syntax.Concrete as SC+import Agda.Syntax.Common as SCo+import Agda.Syntax.Concrete.Pretty ()+import Agda.Syntax.Abstract as SA+import Agda.Syntax.Abstract.Pretty+import Agda.Syntax.Translation.ConcreteToAbstract+import Agda.Syntax.Translation.AbstractToConcrete hiding (withScope)++import Agda.Interaction.Exceptions+import Agda.Interaction.FindFile+import Agda.Interaction.Options+import Agda.Interaction.MakeCase+import Agda.Interaction.Response+import qualified Agda.Interaction.BasicOps as B+import Agda.Interaction.Highlighting.Emacs+import Agda.Interaction.Highlighting.Generate+import Agda.Interaction.Highlighting.Precise hiding (Postulate)+import qualified Agda.Interaction.Imports as Imp++import qualified Agda.Compiler.Epic.Compiler as Epic+import qualified Agda.Compiler.MAlonzo.Compiler as MAlonzo+import qualified Agda.Compiler.JS.Compiler as JS++import qualified Agda.Auto.Auto as Auto+import qualified Agda.Utils.HashMap as HMap+import Agda.Utils.Time++#include "../undefined.h"+import Agda.Utils.Impossible++------------------------------------------++-- | Auxiliary state of an interactive computation.++data CommandState = CommandState+ { theInteractionPoints :: [InteractionId]+ -- ^ The interaction points of the buffer, in the order in which+ -- they appear in the buffer. The interaction points are+ -- recorded in 'theTCState', but when new interaction points are+ -- added by give or refine Agda does not ensure that the ranges+ -- of later interaction points are updated.+ , theCurrentFile :: Maybe (AbsolutePath, ClockTime)+ -- ^ The file which the state applies to. Only stored if the+ -- module was successfully type checked (potentially with+ -- warnings). The 'ClockTime' is the modification time stamp of+ -- the file when it was last loaded.+ , optionsOnReload :: CommandLineOptions+ -- ^ Reset the options on each reload to these.+ }++-- | Initial auxiliary interaction state++initCommandState :: CommandState+initCommandState = CommandState+ { theInteractionPoints = []+ , theCurrentFile = Nothing+ , optionsOnReload = defaultOptions+ }+++-- | Monad for computing answers to interactive commands.+--+-- 'CommandM' is 'TCM' extended with state 'CommandState'.+--+-- 'StateT' is in a newtype wrapper because we would like to prevent+-- the accidental use of 'lift'.+-- Instead of 'lift' one can use 'liftCommandM', see below.++newtype CommandM a = CommandM { unCommandM :: StateT CommandState TCM a }+ deriving (Monad, MonadIO, Functor, MonadState CommandState, MonadError TCErr)++-- | Wrapped 'runStateT' for 'CommandM'.++runCommandM :: CommandM a -> CommandState -> TCM (a, CommandState)+runCommandM = runStateT . unCommandM++-- | lift a TCM action to CommandM.+--+-- 'liftCommandM' is a customized form of 'lift' for 'StateT'.+-- At the end of the lifted action 'stInteractionOutputCallback' is set+-- to its original value because the value is lost during the execution+-- of some TCM actions.++liftCommandM :: TCM a -> CommandM a+liftCommandM m = CommandM $ lift $ do+ outf <- gets stInteractionOutputCallback+ a <- m+ modify $ \st -> st { stInteractionOutputCallback = outf }+ return a++-- | Build an opposite action to 'lift' for state monads.++revLift+ :: MonadState st m+ => (forall c . m c -> st -> k (c, st)) -- ^ run+ -> (forall b . k b -> m b) -- ^ lift+ -> (forall x . (m a -> k x) -> k x) -> m a -- ^ reverse lift in double negative position+revLift run lift f = do+ st <- get+ (a, st) <- lift $ f (`run` st)+ put st+ return a++-- | Opposite of 'liftIO' for 'CommandM'.+-- Use only if main errors are already catched.++commandMToIO :: (forall x . (CommandM a -> IO x) -> IO x) -> CommandM a+commandMToIO ci_i = revLift runCommandM liftCommandM $ \ct -> revLift runSafeTCM liftIO $ ci_i . (. ct)++-- | 'runSafeTCM' runs a safe 'TMC' action (a 'TCM' action which cannot fail)++runSafeTCM :: TCM a -> TCState -> IO (a, TCState)+runSafeTCM m st = do+ x <- runTCM $ do+ put st+ a <- m+ st <- get+ return (a, st)+ case x of+ Right x -> return x+ Left _ -> __IMPOSSIBLE__ -- cannot happen if 'm' is safe++-- | Lift a TCM action transformer to a CommandM action transformer.++liftCommandMT :: (forall a . TCM a -> TCM a) -> CommandM a -> CommandM a+liftCommandMT f m = revLift runCommandM liftCommandM $ f . ($ m)++-- | Put a response by the callback function given by 'stInteractionOutputCallback'.++putResponse :: Response -> CommandM ()+putResponse x = liftCommandM $ do+ callback <- stInteractionOutputCallback <$> get+ callback x++{- UNUSED++-- | Changes the 'Interaction' so that its first action is to turn off+-- all debug messages.++makeSilent :: Interaction -> Interaction+makeSilent i = i { command = do+ opts <- liftCommandM commandLineOptions+ liftCommandM $ TM.setCommandLineOptions $ opts+ { optPragmaOptions =+ (optPragmaOptions opts)+ { optVerbose = Trie.singleton [] 0 }+ }+ command i }+-}+++-- | Run an 'IOTCM' value, catch the exceptions, emit output+--+-- If an error happens the state of 'CommandM' does not change,+-- but stPersistent may change (which contains successfully+-- loaded interfaces for example).++runInteraction :: IOTCM -> CommandM ()+runInteraction (IOTCM current highlighting highlightingMethod cmd)+ = handleNastyErrors+ $ inEmacs+ $ do+ current <- liftIO $ absolute current++ res <- (`catchError` (return . Just)) $ do++ -- Raises an error if the given file is not the one currently+ -- loaded.+ cf <- gets theCurrentFile+ when (not (independent cmd) && Just current /= (fst <$> cf)) $+ liftCommandM $ typeError $ GenericError "Error: First load the file."++ interpret cmd++ cf <- gets theCurrentFile+ when (Just current == (fst <$> cf)) $+ putResponse . Resp_InteractionPoints =<< gets theInteractionPoints+ return Nothing++ maybe (return ()) handleErr res++ where+ inEmacs = liftCommandMT $ withEnv $ initEnv+ { envEmacs = True+ , envHighlightingLevel = highlighting+ , envHighlightingMethod = highlightingMethod+ }++ -- | Handle nasty errors like stack space overflow (issue 637)+ -- We assume that the input action handles other kind of errors.+ handleNastyErrors :: CommandM () -> CommandM ()+ handleNastyErrors m = commandMToIO $ \toIO ->+ toIO m `E.catch` (toIO . handleErr . Exception noRange . (show :: E.SomeException -> String))++ -- | Displays an error and instructs Emacs to jump to the site of the+ -- error. Because this function may switch the focus to another file+ -- the status information is also updated.+ handleErr e = do+ s <- liftCommandM $ prettyError e+ x <- liftCommandM . gets $ optShowImplicit . stPragmaOptions+ let+ mapM_ putResponse $+ [ Resp_DisplayInfo $ Info_Error s ] +++ tellEmacsToJumpToError (getRange e) +++ [ Resp_Status $ Status { sChecked = False+ , sShowImplicitArguments = x+ } ]+++----------------------------------------------------------------------------+-- | An interactive computation.++data Interaction+ -- | @cmd_load m includes@ loads the module in file @m@, using+ -- @includes@ as the include directories.+ = Cmd_load FilePath [FilePath]++ -- | @cmd_compile b m includes@ compiles the module in file @m@ using+ -- the backend @b@, using @includes@ as the include directories.+ | Cmd_compile Backend FilePath [FilePath]++ | Cmd_constraints++ -- | Show unsolved metas. If there are no unsolved metas but unsolved constraints+ -- show those instead.+ | Cmd_metas++ -- | Shows all the top-level names in the given module, along with+ -- their types. Uses the top-level scope.+ | Cmd_show_module_contents_toplevel+ String++ | Cmd_solveAll++ -- | Parse the given expression (as if it were defined at the+ -- top-level of the current module) and infer its type.+ | Cmd_infer_toplevel B.Rewrite -- Normalise the type?+ String+++ -- | Parse and type check the given expression (as if it were defined+ -- at the top-level of the current module) and normalise it.+ | Cmd_compute_toplevel Bool -- Ignore abstract?+ String++ ------------------------------------------------------------------------+ -- Syntax highlighting++ -- | @cmd_load_highlighting_info source@ loads syntax highlighting+ -- information for the module in @source@, and asks Emacs to apply+ -- highlighting info from this file.+ --+ -- If the module does not exist, or its module name is malformed or+ -- cannot be determined, or the module has not already been visited,+ -- or the cached info is out of date, then no highlighting information+ -- is printed.+ --+ -- This command is used to load syntax highlighting information when a+ -- new file is opened, and it would probably be annoying if jumping to+ -- the definition of an identifier reset the proof state, so this+ -- command tries not to do that. One result of this is that the+ -- command uses the current include directories, whatever they happen+ -- to be.+ | Cmd_load_highlighting_info+ FilePath++ ------------------------------------------------------------------------+ -- Implicit arguments++ -- | Tells Agda whether or not to show implicit arguments.+ | ShowImplicitArgs Bool -- Show them?+++ -- | Toggle display of implicit arguments.+ | ToggleImplicitArgs++ ------------------------------------------------------------------------+ -- | Goal commands+ --+ -- If the range is 'noRange', then the string comes from the+ -- minibuffer rather than the goal.++ | Cmd_give InteractionId Range String++ | Cmd_refine InteractionId Range String++ | Cmd_intro Bool InteractionId Range String++ | Cmd_refine_or_intro Bool InteractionId Range String++ | Cmd_auto InteractionId Range String++ | Cmd_context B.Rewrite InteractionId Range String++ | Cmd_infer B.Rewrite InteractionId Range String++ | Cmd_goal_type B.Rewrite InteractionId Range String++ -- | Displays the current goal and context.+ | Cmd_goal_type_context B.Rewrite InteractionId Range String++ -- | Displays the current goal and context /and/ infers the type of an+ -- expression.+ | Cmd_goal_type_context_infer+ B.Rewrite InteractionId Range String++ -- | Shows all the top-level names in the given module, along with+ -- their types. Uses the scope of the given goal.+ | Cmd_show_module_contents+ InteractionId Range String++ | Cmd_make_case InteractionId Range String++ | Cmd_compute Bool -- Ignore abstract?+ InteractionId Range String+ deriving Read++data IOTCM+ = IOTCM+ FilePath+ -- -^ The current file. If this file does not match+ -- 'theCurrentFile, and the 'Interaction' is not+ -- \"independent\", then an error is raised.+ HighlightingLevel+ HighlightingMethod+ Interaction+ -- -^ What to do+ deriving Read++---------------------------------------------------------+-- Read instances+++-- | The 'Parse' monad.+-- 'StateT' state holds the remaining input.++type Parse a = ErrorT String (StateT String Identity) a++-- | Converter from the type of 'reads' to 'Parse'+-- The first paramter is part of the error message+-- in case the parse fails.++readsToParse :: String -> (String -> Maybe (a, String)) -> Parse a+readsToParse s f = do+ st <- lift get+ case f st of+ Nothing -> throwError s+ Just (a, st) -> do+ lift $ put st+ return a++parseToReadsPrec :: Parse a -> Int -> String -> [(a, String)]+parseToReadsPrec p i s = case runIdentity . flip runStateT s . runErrorT $ parens' p of+ (Right a, s) -> [(a,s)]+ _ -> []++-- | Demand an exact string.++exact :: String -> Parse ()+exact s = readsToParse (show s) $ fmap (\x -> ((),x)) . stripPrefix s . dropWhile (==' ')++readParse :: Read a => Parse a+readParse = readsToParse "read failed" $ listToMaybe . reads++parens' :: Parse a -> Parse a+parens' p = do+ exact "("+ x <- p+ exact ")"+ return x+ `mplus`+ p++instance Read InteractionId where+ readsPrec = parseToReadsPrec $+ fmap InteractionId readParse++instance Read Range where+ readsPrec = parseToReadsPrec $ do+ exact "Range"+ fmap Range readParse+ `mplus` do+ exact "noRange"+ return noRange++instance Read Interval where+ readsPrec = parseToReadsPrec $ do+ exact "Interval"+ liftM2 Interval readParse readParse++instance Read AbsolutePath where+ readsPrec = parseToReadsPrec $ do+ exact "mkAbsolute"+ fmap mkAbsolute readParse++instance Read Position where+ readsPrec = parseToReadsPrec $ do+ exact "Pn"+ liftM4 Pn readParse readParse readParse readParse++---------------------------------------------------------++-- | Can the command run even if the relevant file has not been loaded+-- into the state?++independent :: Interaction -> Bool+independent (Cmd_load {}) = True+independent (Cmd_compile {}) = True+independent (Cmd_load_highlighting_info {}) = True+independent _ = False++-- | Interpret an interaction++interpret :: Interaction -> CommandM ()++interpret (Cmd_load m includes) =+ cmd_load' m includes True $ \_ -> interpret Cmd_metas++interpret (Cmd_compile b file includes) =+ cmd_load' file includes False $ \(i, mw) -> do+ case mw of+ Nothing -> do+ liftCommandM $ case b of+ MAlonzo -> MAlonzo.compilerMain i+ Epic -> Epic.compilerMain i+ JS -> JS.compilerMain i+ display_info $ Info_CompilationOk+ Just w ->+ display_info $ Info_Error $ unlines+ [ "You can only compile modules without unsolved metavariables"+ , "or termination checking problems."+ ]++interpret Cmd_constraints =+ display_info . Info_Constraints . unlines . map show =<< liftCommandM B.getConstraints++interpret Cmd_metas = do -- CL.showMetas []+ ims <- liftCommandM $ B.typesOfVisibleMetas B.AsIs+ -- Show unsolved implicit arguments normalised.+ hms <- liftCommandM $ B.typesOfHiddenMetas B.Normalised+ if not $ null ims && null hms+ then do+ di <- liftCommandM $ forM ims $ \i -> B.withInteractionId (B.outputFormId $ B.OutputForm 0 i) (showATop i)+ dh <- liftCommandM $ mapM showA' hms+ display_info $ Info_AllGoals $ unlines $ di ++ dh+ else do+ cs <- liftCommandM B.getConstraints+ if null cs+ then display_info $ Info_AllGoals ""+ else interpret Cmd_constraints+ where+ metaId (B.OfType i _) = i+ metaId (B.JustType i) = i+ metaId (B.JustSort i) = i+ metaId (B.Assign i e) = i+ metaId _ = __IMPOSSIBLE__+ showA' :: B.OutputConstraint SA.Expr NamedMeta -> TCM String+ showA' m = do+ let i = nmid $ metaId m+ r <- getMetaRange i+ d <- B.withMetaId i (showATop m)+ return $ d ++ " [ at " ++ show r ++ " ]"++interpret (Cmd_show_module_contents_toplevel s) =+ liftCommandMT B.atTopLevel $ showModuleContents noRange s++interpret Cmd_solveAll = do+ out <- liftCommandM $ mapM lowr =<< B.getSolvedInteractionPoints+ putResponse $ Resp_SolveAll out+ where+ lowr (i, m, e) = do+ mi <- getMetaInfo <$> lookupMeta m+ e <- withMetaInfo mi $ lowerMeta <$> abstractToConcreteCtx TopCtx e+ return (i, e)++interpret (Cmd_infer_toplevel norm s) =+ parseAndDoAtToplevel (B.typeInCurrent norm) Info_InferredType s++interpret (Cmd_compute_toplevel ignore s) =+ parseAndDoAtToplevel (if ignore then ignoreAbstractMode . c+ else inConcreteMode . c)+ Info_NormalForm+ s+ where c = B.evalInCurrent++interpret (ShowImplicitArgs showImpl) = do+ opts <- liftCommandM commandLineOptions+ setCommandLineOptions' $+ opts { optPragmaOptions =+ (optPragmaOptions opts) { optShowImplicit = showImpl } }++interpret ToggleImplicitArgs = do+ opts <- liftCommandM commandLineOptions+ let ps = optPragmaOptions opts+ setCommandLineOptions' $+ opts { optPragmaOptions =+ ps { optShowImplicit = not $ optShowImplicit ps } }++interpret (Cmd_load_highlighting_info source) = do+ -- Make sure that the include directories have+ -- been set.+ setCommandLineOptions' =<< liftCommandM commandLineOptions++ resp <- liftCommandM $ liftIO . tellToUpdateHighlighting =<< do+ ex <- liftIO $ doesFileExist source+ case ex of+ False -> return Nothing+ True -> do+ mmi <- (getVisitedModule =<<+ moduleName =<< liftIO (absolute source))+ `catchError`+ \_ -> return Nothing+ case mmi of+ Nothing -> return Nothing+ Just mi -> do+ sourceT <- liftIO $ getModificationTime source+ if sourceT <= miTimeStamp mi+ then do+ modFile <- gets stModuleToSource+ return $ Just (iHighlighting $ miInterface mi, modFile)+ else+ return Nothing+ mapM_ putResponse resp++interpret (Cmd_give ii rng s) = give_gen ii rng s B.give $ \rng s ce ->+ case ce of+ ce | rng == noRange -> Give_String $ show ce+ SC.Paren _ _ -> Give_Paren+ _ -> Give_NoParen++interpret (Cmd_refine ii rng s) = give_gen ii rng s B.refine $ \_ s -> Give_String . show++interpret (Cmd_intro pmLambda ii rng _) = do+ ss <- liftCommandM $ B.introTactic pmLambda ii+ liftCommandMT (B.withInteractionId ii) $ case ss of+ [] -> do+ display_info $ Info_Intro $ text "No introduction forms found."+ [s] -> do+ interpret $ Cmd_refine ii rng s+ _:_:_ -> do+ display_info $ Info_Intro $+ sep [ text "Don't know which constructor to introduce of"+ , let mkOr [] = []+ mkOr [x, y] = [text x <+> text "or" <+> text y]+ mkOr (x:xs) = text x : mkOr xs+ in nest 2 $ fsep $ punctuate comma (mkOr ss)+ ]++interpret (Cmd_refine_or_intro pmLambda ii r s) = interpret $+ (if null s then Cmd_intro pmLambda else Cmd_refine) ii r s++interpret (Cmd_auto ii rng s) = do+ (res, msg) <- liftCommandM $ Auto.auto ii rng s+ case res of+ Left xs -> do+ forM_ xs $ \(ii, s) -> do+ modify $ \st -> st { theInteractionPoints = filter (/= ii) (theInteractionPoints st) }+ putResponse $ Resp_GiveAction ii $ Give_String s+ case msg of+ Nothing -> interpret Cmd_metas+ Just msg -> display_info $ Info_Auto msg+ Right (Left cs) -> do+ case msg of+ Nothing -> return ()+ Just msg -> display_info $ Info_Auto msg+ putResponse $ Resp_MakeCaseAction cs+ Right (Right s) -> give_gen' B.refine (\_ s -> Give_String . show) ii rng s++interpret (Cmd_context norm ii _ _) =+ display_info . Info_Context =<< liftCommandM (prettyContext norm False ii)++interpret (Cmd_infer norm ii rng s) =+ display_info . Info_InferredType+ =<< liftCommandM (B.withInteractionId ii+ (prettyATop =<< B.typeInMeta ii norm =<< B.parseExprIn ii rng s))++interpret (Cmd_goal_type norm ii _ _) =+ display_info . Info_CurrentGoal+ =<< liftCommandM (B.withInteractionId ii $ prettyTypeOfMeta norm ii)++interpret (Cmd_goal_type_context norm ii rng s) =+ cmd_goal_type_context_and empty norm ii rng s++interpret (Cmd_goal_type_context_infer norm ii rng s) = do+ typ <- liftCommandM $ B.withInteractionId ii $+ prettyATop =<< B.typeInMeta ii norm =<< B.parseExprIn ii rng s+ cmd_goal_type_context_and (text "Have:" <+> typ) norm ii rng s++interpret (Cmd_show_module_contents ii rng s) =+ liftCommandMT (B.withInteractionId ii) $ showModuleContents rng s++interpret (Cmd_make_case ii rng s) = do+ (casectxt , cs) <- liftCommandM $ makeCase ii rng s+ liftCommandMT (B.withInteractionId ii) $ do+ hidden <- liftCommandM $ showImplicitArguments+ pcs <- liftCommandM $ mapM prettyA $ List.map (extlam_dropLLifted casectxt hidden) cs+ putResponse $ Resp_MakeCase (emacscmd casectxt) (List.map (extlam_dropName casectxt . render) pcs)+ where+ render = renderStyle (style { mode = OneLineMode })++ emacscmd :: CaseContext -> String+ emacscmd FunctionDef = "agda2-make-case-action"+ emacscmd (ExtendedLambda _ _) = "agda2-make-case-action-extendlam"++ -- very dirty hack, string manipulation by dropping the function name+ -- and replacing " = " with " -> "+ extlam_dropName :: CaseContext -> String -> String+ extlam_dropName FunctionDef x = x+ extlam_dropName (ExtendedLambda _ _) x+ = unwords $ map (\ y -> if y == "=" then "→" else y) $ drop 1 $ words x++ -- Drops pattern added to extended lambda functions when lambda lifting them+ extlam_dropLLifted :: CaseContext -> Bool -> SA.Clause -> SA.Clause+ extlam_dropLLifted FunctionDef _ x = x+ extlam_dropLLifted (ExtendedLambda h nh) hidden (SA.Clause (SA.LHS info (SA.LHSProj{}) ps) rhs decl) = __IMPOSSIBLE__+ extlam_dropLLifted (ExtendedLambda h nh) hidden (SA.Clause (SA.LHS info (SA.LHSHead name nps) ps) rhs decl)+ = let n = if hidden then h + nh else nh+ in+ (SA.Clause (SA.LHS info (SA.LHSHead name (drop n nps)) ps) rhs decl)++interpret (Cmd_compute ignore ii rng s) = do+ e <- liftCommandM $ B.parseExprIn ii rng s+ d <- liftCommandM $ B.withInteractionId ii $ do+ let c = B.evalInCurrent e+ v <- if ignore then ignoreAbstractMode c else c+ prettyATop v+ display_info $ Info_NormalForm d++type GoalCommand = InteractionId -> Range -> String -> Interaction++-- | @cmd_load' m includes cmd cmd2@ loads the module in file @m@,+-- using @includes@ as the include directories.+--+-- If type checking completes without any exceptions having been+-- encountered then the command @cmd r@ is executed, where @r@ is the+-- result of 'Imp.typeCheck'.++cmd_load' :: FilePath -> [FilePath]+ -> Bool -- ^ Allow unsolved meta-variables?+ -> ((Interface, Maybe Warnings) -> CommandM ())+ -> CommandM ()+cmd_load' file includes unsolvedOK cmd = do+ f <- liftIO $ absolute file+ ex <- liftIO $ doesFileExist $ filePath f+ liftCommandM $ setIncludeDirs includes $+ if ex then ProjectRoot f else CurrentDir++ -- Forget the previous "current file" and interaction points.+ modify $ \st -> st { theInteractionPoints = []+ , theCurrentFile = Nothing+ }++ t <- liftIO $ getModificationTime file++ -- All options (except for the verbosity setting) are reset when a+ -- file is reloaded, including the choice of whether or not to+ -- display implicit arguments. (At this point the include+ -- directories have already been set, so they are preserved.)+ opts <- liftCommandM $ commandLineOptions+ defaultOptions <- gets optionsOnReload+ setCommandLineOptions' $+ defaultOptions { optIncludeDirs = optIncludeDirs opts+ , optPragmaOptions =+ (optPragmaOptions defaultOptions)+ { optAllowUnsolved = unsolvedOK+ , optVerbose = optVerbose (optPragmaOptions opts)+ }+ }++ -- Reset the state, preserving options and decoded modules. Note+ -- that if the include directories have changed, then the decoded+ -- modules are reset when cmd_load' is run by ioTCM.+ liftCommandM resetState++ -- Clear the info buffer to make room for information about which+ -- module is currently being type-checked.+ putResponse Resp_ClearRunningInfo++ -- Remove any prior syntax highlighting.+ putResponse Resp_ClearHighlighting++ ok <- liftCommandM $ Imp.typeCheck f++ -- The module type checked. If the file was not changed while the+ -- type checker was running then the interaction points and the+ -- "current file" are stored.+ t' <- liftIO $ getModificationTime file+ when (t == t') $ do+ is <- liftCommandM $ sortInteractionPoints =<< getInteractionPoints+ modify $ \st -> st { theInteractionPoints = is+ , theCurrentFile = Just (f, t)+ }++ cmd ok++ liftIO System.performGC++-- | Available backends.++data Backend = MAlonzo | Epic | JS+ deriving (Show, Read)+++give_gen ii rng s give_ref mk_newtxt =+ give_gen' give_ref mk_newtxt ii rng s++give_gen' give_ref mk_newtxt ii rng s = do+ scope <- liftCommandM $ getInteractionScope ii+ (ae, iis) <- liftCommandM $ give_ref ii Nothing =<< B.parseExprIn ii rng s+ iis <- liftCommandM $ sortInteractionPoints iis+ modify $ \st -> st { theInteractionPoints =+ replace ii iis (theInteractionPoints st) }+ putResponse $ Resp_GiveAction ii $ mk_newtxt rng s $ abstractToConcrete (makeEnv scope) ae+ interpret Cmd_metas+ where+ -- Substitutes xs for x in ys.+ replace x xs ys = concatMap (\y -> if y == x then xs else [y]) ys++-- | Sorts interaction points based on their ranges.++sortInteractionPoints :: [InteractionId] -> TCM [InteractionId]+sortInteractionPoints is =+ map fst . sortBy (compare `on` snd) <$>+ mapM (\i -> (,) i <$> getInteractionRange i) is++-- | Pretty-prints the type of the meta-variable.++prettyTypeOfMeta :: B.Rewrite -> InteractionId -> TCM Doc+prettyTypeOfMeta norm ii = do+ form <- B.typeOfMeta norm ii+ case form of+ B.OfType _ e -> prettyATop e+ _ -> text <$> showATop form++-- | Pretty-prints the context of the given meta-variable.++prettyContext+ :: B.Rewrite -- ^ Normalise?+ -> Bool -- ^ Print the elements in reverse order?+ -> InteractionId+ -> TCM Doc+prettyContext norm rev ii = B.withInteractionId ii $ do+ ctx <- B.contextOfMeta ii norm+ es <- mapM (prettyATop . B.ofExpr) ctx+ ns <- mapM (showATop . B.ofName) ctx+ let shuffle = if rev then reverse else id+ return $ align 10 $ filter (not . null. fst) $ shuffle $ zip ns (map (text ":" <+>) es)++-- | Displays the current goal, the given document, and the current+-- context.++cmd_goal_type_context_and doc norm ii _ _ = do+ goal <- liftCommandM $ B.withInteractionId ii $ prettyTypeOfMeta norm ii+ ctx <- liftCommandM $ prettyContext norm True ii+ display_info $ Info_GoalType+ (text "Goal:" <+> goal $+$+ doc $+$+ text (replicate 60 '\x2014') $+$+ ctx)++-- | Shows all the top-level names in the given module, along with+-- their types.++showModuleContents :: Range -> String -> CommandM ()+showModuleContents rng s = do+ (modules, types) <- liftCommandM $ B.moduleContents rng s+ types' <- liftCommandM $ mapM (\(x, t) -> do+ t <- prettyTCM t+ return (show x, text ":" <+> t))+ types+ display_info $ Info_ModuleContents $+ text "Modules" $$+ nest 2 (vcat $ map (text . show) modules) $$+ text "Names" $$+ nest 2 (align 10 types')++-- | Sets the command line options and updates the status information.++setCommandLineOptions' :: CommandLineOptions -> CommandM ()+setCommandLineOptions' opts = do+ liftCommandM $ TM.setCommandLineOptions opts+ displayStatus+++-- | Computes some status information.++status :: CommandM Status+status = do+ cf <- gets theCurrentFile+ showImpl <- liftCommandM showImplicitArguments++ -- Check if the file was successfully type checked, and has not+ -- changed since. Note: This code does not check if any dependencies+ -- have changed, and uses a time stamp to check for changes.+ checked <- liftCommandM $ case cf of+ Nothing -> return False+ Just (f, t) -> do+ t' <- liftIO $ getModificationTime $ filePath f+ case t == t' of+ False -> return False+ True ->+ not . miWarnings . maybe __IMPOSSIBLE__ id <$>+ (getVisitedModule =<<+ maybe __IMPOSSIBLE__ id .+ Map.lookup f <$> sourceToModule)++ return $ Status { sShowImplicitArguments = showImpl+ , sChecked = checked+ }++-- | Displays\/updates status information.++displayStatus :: CommandM ()+displayStatus =+ putResponse . Resp_Status =<< status++-- | @display_info@ does what @'display_info'' False@ does, but+-- additionally displays some status information (see 'status' and+-- 'displayStatus').++display_info :: DisplayInfo -> CommandM ()+display_info info = do+ displayStatus+ putResponse $ Resp_DisplayInfo info++takenNameStr :: TCM [String]+takenNameStr = do+ xss <- sequence [ List.map (fst . unDom) <$> getContext+ , Map.keys <$> asks envLetBindings+ , List.map qnameName . HMap.keys . sigDefinitions <$> getSignature+ ]+ return $ concat [ parts $ nameConcrete x | x <- concat xss]+ where+ parts x = [ s | Id s <- nameParts x ]++refreshStr :: [String] -> String -> ([String], String)+refreshStr taken s = go nameModifiers where+ go (m:mods) = let s' = s ++ m in+ if s' `elem` taken then go mods else (s':taken, s')+ go _ = __IMPOSSIBLE__++nameModifiers = "" : "'" : "''" : [show i | i <-[3..]]+++class LowerMeta a where lowerMeta :: a -> a+instance LowerMeta SC.Expr where+ lowerMeta = go where+ go e = case e of+ Ident _ -> e+ SC.Lit _ -> e+ SC.QuestionMark _ _ -> preMeta+ SC.Underscore _ _ -> preUscore+ SC.App r e1 ae2 -> case appView e of+ SC.AppView (SC.QuestionMark _ _) _ -> preMeta+ SC.AppView (SC.Underscore _ _) _ -> preUscore+ _ -> SC.App r (go e1) (lowerMeta ae2)+ SC.WithApp r e es -> SC.WithApp r (lowerMeta e) (lowerMeta es)+ SC.Lam r bs e1 -> SC.Lam r (lowerMeta bs) (go e1)+ SC.AbsurdLam r h -> SC.AbsurdLam r h+ SC.ExtendedLam r cs -> SC.ExtendedLam r cs+ SC.Fun r ae1 e2 -> SC.Fun r (lowerMeta ae1) (go e2)+ SC.Pi tb e1 -> SC.Pi (lowerMeta tb) (go e1)+ SC.Set _ -> e+ SC.Prop _ -> e+ SC.SetN _ _ -> e+ SC.ETel tel -> SC.ETel (lowerMeta tel)+ SC.Let r ds e1 -> SC.Let r (lowerMeta ds) (go e1)+ Paren r e1 -> case go e1 of+ q@(SC.QuestionMark _ Nothing) -> q+ e2 -> Paren r e2+ Absurd _ -> e+ As r n e1 -> As r n (go e1)+ SC.Dot r e -> SC.Dot r (go e)+ SC.RawApp r es -> SC.RawApp r (lowerMeta es)+ SC.OpApp r x es -> SC.OpApp r x (lowerMeta es)+ SC.Rec r fs -> SC.Rec r (List.map (id -*- lowerMeta) fs)+ SC.RecUpdate r e fs -> SC.RecUpdate r (lowerMeta e) (List.map (id -*- lowerMeta) fs)+ SC.HiddenArg r e -> SC.HiddenArg r (lowerMeta e)+ SC.InstanceArg r e -> SC.InstanceArg r (lowerMeta e)+ SC.QuoteGoal r x e -> SC.QuoteGoal r x (lowerMeta e)+ e@SC.Quote{} -> e+ e@SC.QuoteTerm{} -> e+ e@SC.Unquote{} -> e+ SC.DontCare e -> SC.DontCare (lowerMeta e)++instance LowerMeta (OpApp SC.Expr) where+ lowerMeta (Ordinary e) = Ordinary $ lowerMeta e+ lowerMeta (SyntaxBindingLambda r bs e) = SyntaxBindingLambda r (lowerMeta bs) (lowerMeta e)++instance LowerMeta SC.LamBinding where+ lowerMeta b@(SC.DomainFree _ _ _) = b+ lowerMeta (SC.DomainFull tb) = SC.DomainFull (lowerMeta tb)++instance LowerMeta SC.TypedBindings where+ lowerMeta (SC.TypedBindings r bs) = SC.TypedBindings r (lowerMeta bs)++instance LowerMeta SC.TypedBinding where+ lowerMeta (SC.TBind r ns e) = SC.TBind r ns (lowerMeta e)+ lowerMeta (SC.TNoBind e) = SC.TNoBind (lowerMeta e)++instance LowerMeta SC.RHS where+ lowerMeta (SC.RHS e) = SC.RHS (lowerMeta e)+ lowerMeta SC.AbsurdRHS = SC.AbsurdRHS++instance LowerMeta (Maybe SC.Expr) where+ lowerMeta (Just e) = Just (lowerMeta e)+ lowerMeta Nothing = Nothing++instance LowerMeta SC.Declaration where+ lowerMeta = go where+ go d = case d of+ TypeSig rel n e1 -> TypeSig rel n (lowerMeta e1)+ SC.Field n e1 -> SC.Field n (lowerMeta e1)+ FunClause lhs rhs whcl -> FunClause lhs (lowerMeta rhs) (lowerMeta whcl)+ SC.DataSig r ind n tel e1 -> SC.DataSig r ind n+ (lowerMeta tel) (lowerMeta e1)+ Data r ind n tel e1 cs -> Data r ind n+ (lowerMeta tel) (lowerMeta e1) (lowerMeta cs)+ SC.RecordSig r n tel e1 -> SC.RecordSig r n+ (lowerMeta tel) (lowerMeta e1)+ SC.Record r n ind c tel e1 cs -> SC.Record r n ind c+ (lowerMeta tel) (lowerMeta e1) (lowerMeta cs)+ Infix _ _ -> d+ Syntax _ _ -> d+ SC.PatternSyn _ _ _ _ -> d+ SC.Mutual r ds -> SC.Mutual r (lowerMeta ds)+ Abstract r ds -> Abstract r (lowerMeta ds)+ Private r ds -> Private r (lowerMeta ds)+ Postulate r sigs -> Postulate r (lowerMeta sigs)+ SC.Primitive r sigs -> SC.Primitive r (lowerMeta sigs)+ SC.Open _ _ _ -> d+ SC.Import _ _ _ _ _ -> d+ SC.Pragma _ -> d+ ModuleMacro r n modapp op dir -> ModuleMacro r n+ (lowerMeta modapp) op dir+ SC.Module r qn tel ds -> SC.Module r qn (lowerMeta tel) (lowerMeta ds)++instance LowerMeta SC.ModuleApplication where+ lowerMeta (SC.SectionApp r tel e) = SC.SectionApp r (lowerMeta tel) (lowerMeta e)+ lowerMeta (SC.RecordModuleIFS r rec) = SC.RecordModuleIFS r rec++instance LowerMeta SC.WhereClause where+ lowerMeta SC.NoWhere = SC.NoWhere+ lowerMeta (SC.AnyWhere ds) = SC.AnyWhere $ lowerMeta ds+ lowerMeta (SC.SomeWhere m ds) = SC.SomeWhere m $ lowerMeta ds++instance LowerMeta a => LowerMeta [a] where+ lowerMeta as = List.map lowerMeta as++instance LowerMeta a => LowerMeta (Arg a) where+ lowerMeta aa = fmap lowerMeta aa++instance LowerMeta a => LowerMeta (Named name a) where+ lowerMeta aa = fmap lowerMeta aa+++preMeta = SC.QuestionMark noRange Nothing+preUscore = SC.Underscore noRange Nothing++-- | Parses and scope checks an expression (using the \"inside scope\"+-- as the scope), performs the given command with the expression as+-- input, and displays the result.++parseAndDoAtToplevel+ :: (SA.Expr -> TCM SA.Expr)+ -- ^ The command to perform.+ -> (Doc -> DisplayInfo)+ -- ^ The name to use for the buffer displaying the output.+ -> String+ -- ^ The expression to parse.+ -> CommandM ()+parseAndDoAtToplevel cmd title s = do+ e <- liftIO $ parse exprParser s+ display_info . title =<<+ liftCommandM (B.atTopLevel $ prettyA =<< cmd =<< concreteToAbstract_ e)++-- | Tell to highlight the code using the given highlighting+-- info (unless it is @Nothing@).++tellToUpdateHighlighting+ :: Maybe (HighlightingInfo, ModuleToSource) -> IO [Response]+tellToUpdateHighlighting Nothing = return []+tellToUpdateHighlighting (Just (info, modFile)) =+ return [Resp_HighlightingInfo info modFile]++-- | Tells the Emacs mode to go to the first error position (if any).++tellEmacsToJumpToError :: Range -> [Response]+tellEmacsToJumpToError r =+ case rStart r of+ Nothing -> []+ Just (Pn { srcFile = Nothing }) -> []+ Just (Pn { srcFile = Just f, posPos = p }) ->+ [ Resp_JumpToError (filePath f) p ]
src/full/Agda/Interaction/MakeCase.hs view
@@ -6,6 +6,7 @@ import Control.Applicative import Control.Monad hiding (mapM, mapM_) import Control.Monad.State hiding (mapM, mapM_)+import Data.Maybe import qualified Data.Map as Map import Data.Traversable import Data.List@@ -32,6 +33,7 @@ import Agda.Utils.Size import Agda.Utils.Permutation+import qualified Agda.Utils.HashMap as HMap #include "../undefined.h" import Agda.Utils.Impossible@@ -52,7 +54,7 @@ findClause m = do sig <- getImportedSignature let res = do- def <- Map.elems $ sigDefinitions sig+ def <- HMap.elems $ sigDefinitions sig Function{funClauses = cs} <- [theDef def] c <- cs unless (rhsIsm $ clauseBody c) []@@ -64,7 +66,7 @@ , text "expected rhs to be meta var" <+> (text $ show m) , text "but could not find it in the signature" ]- reportSDoc "interaction.case" 20 $ vcat $ map (text . show) (Map.elems $ sigDefinitions sig) -- you asked for it!+ reportSDoc "interaction.case" 100 $ vcat $ map (text . show) (HMap.elems $ sigDefinitions sig) -- you asked for it! typeError $ GenericError "Right hand side must be a single hole when making a case distinction." [(n,c)] | isPrefixOf extendlambdaname $ show $ A.qnameName n -> do Just (h , nh) <- Map.lookup n <$> getExtLambdaTele@@ -74,7 +76,7 @@ where rhsIsm (Bind b) = rhsIsm $ unAbs b rhsIsm NoBody = False- rhsIsm (Body e) = case e of+ rhsIsm (Body e) = case ignoreSharing e of MetaV m' _ -> m == m' _ -> False @@ -92,15 +94,46 @@ , text "ps =" <+> text (show ps) ] ]- var <- deBruijnIndex =<< parseExprIn hole rng s- z <- splitClauseWithAbs clause var- (case z of- Left err -> typeError . GenericError . show =<< prettyTCM err- Right (Left cl) -> ((:[]) <$> makeAbsurdClause f cl)- Right (Right c) -> (mapM (makeAbstractClause f) c)) >>= (\ x -> return (casectxt , x))+ vars <- mapM (\s -> deBruijnIndex =<< parseExprIn hole rng s) $ words s+ (,) casectxt <$> split f vars clause+ where+ split :: QName -> [Nat] -> Clause -> TCM [A.Clause]+ split f [] clause =+ (:[]) <$> makeAbstractClause f (clauseToSplitClause clause)+ split f (var : vars) clause = do+ z <- splitClauseWithAbs clause var+ case z of+ Left err -> typeError . GenericError . show =<<+ prettyTCM err+ Right (Left cl) -> (:[]) <$> makeAbsurdClause f cl+ Right (Right cov)+ | null vars -> mapM (makeAbstractClause f) $ splitClauses cov+ | otherwise -> concat <$> do+ mapM (\cl -> split f (mapMaybe (newVar cl) vars)+ (splitClauseToClause cl))+ $ splitClauses cov+ where+ -- Note that the body of the created clause is the body of the+ -- argument to split.+ splitClauseToClause :: SplitClause -> Clause+ splitClauseToClause c = Clause+ { clauseRange = noRange+ , clauseTel = scTel c+ , clausePerm = scPerm c+ , clausePats = scPats c+ , clauseBody = clauseBody clause+ } + -- Finds the new variable corresponding to an old one, if any.+ newVar :: SplitClause -> Nat -> Maybe Nat+ newVar c x = case ignoreSharing $ applySubst (scSubst c) (Var x []) of+ Var x [] -> Just x+ _ -> Nothing++ -- NOTE: clauseToSplitClause moved to Coverage.hs+ makeAbsurdClause :: QName -> SplitClause -> TCM A.Clause-makeAbsurdClause f (SClause tel perm ps _) = do+makeAbsurdClause f (SClause tel perm ps _ _) = do reportSDoc "interaction.case" 10 $ vcat [ text "Interaction.MakeCase.makeCase: split clause:" , nest 2 $ vcat@@ -113,17 +146,16 @@ withCurrentModule (qnameModule f) $ do -- Normalise the dot patterns ps <- addCtxTel tel $ normalise ps- inContext [] $ reify $ NamedClause f $ Clause noRange tel perm ps NoBody+ inContext [] $ reify $ QNamed f $ Clause noRange tel perm ps NoBody +-- | Make a clause with a question mark as rhs. makeAbstractClause :: QName -> SplitClause -> TCM A.Clause makeAbstractClause f cl = do A.Clause lhs _ _ <- makeAbsurdClause f cl return $ mkClause lhs where mkClause :: A.LHS -> A.Clause- mkClause lhs = A.Clause lhs (A.RHS $ A.QuestionMark info) []- where- info = A.MetaInfo noRange emptyScopeInfo Nothing+ mkClause lhs = A.Clause lhs (A.RHS $ A.QuestionMark A.emptyMetaInfo) [] deBruijnIndex :: A.Expr -> TCM Nat deBruijnIndex e = do@@ -131,7 +163,7 @@ -- Context.wakeIrrelevantVars $ applyRelevanceToContext Irrelevant $ inferExpr e- case v of+ case ignoreSharing v of Var n _ -> return n _ -> typeError . GenericError . show =<< (fsep $ pwords "The scrutinee of a case distinction must be a variable,"
src/full/Agda/Interaction/Options.hs view
@@ -11,6 +11,7 @@ , parsePragmaOptions , parsePluginOptions , defaultOptions+ , defaultInteractionOptions , defaultVerbosity , standardOptions_ , unsafePragmaOptions@@ -49,24 +50,27 @@ data CommandLineOptions = Options { optProgramName :: String- , optInputFile :: Maybe FilePath- , optIncludeDirs :: Either [FilePath] [AbsolutePath]+ , optInputFile :: Maybe FilePath+ , optIncludeDirs :: Either [FilePath] [AbsolutePath] -- ^ 'Left' is used temporarily, before the paths have -- been made absolute. An empty 'Left' list is -- interpreted as @["."]@ (see -- 'Agda.TypeChecking.Monad.Options.makeIncludeDirsAbsolute').- , optShowVersion :: Bool- , optShowHelp :: Bool- , optInteractive :: Bool- , optRunTests :: Bool- , optCompile :: Bool- , optEpicCompile :: Bool- , optJSCompile :: Bool+ , optShowVersion :: Bool+ , optShowHelp :: Bool+ , optInteractive :: Bool+ , optRunTests :: Bool+ , optGHCiInteraction :: Bool+ , optCompile :: Bool+ , optEpicCompile :: Bool+ , optJSCompile :: Bool , optCompileDir :: Maybe FilePath -- ^ In the absence of a path the project root is used. , optGenerateVimFile :: Bool+ , optGenerateLaTeX :: Bool , optGenerateHTML :: Bool , optDependencyGraph :: Maybe FilePath+ , optLaTeXDir :: FilePath , optHTMLDir :: FilePath , optCSSFile :: Maybe FilePath , optIgnoreInterfaces :: Bool@@ -82,6 +86,7 @@ data PragmaOptions = PragmaOptions { optShowImplicit :: Bool+ , optShowIrrelevant :: Bool , optVerbose :: Verbosity , optProofIrrelevance :: Bool , optAllowUnsolved :: Bool@@ -97,6 +102,7 @@ , optIrrelevantProjections :: Bool , optExperimentalIrrelevance :: Bool -- ^ irrelevant levels, irrelevant data matching , optWithoutK :: Bool+ , optCopatterns :: Bool -- ^ definitions by copattern matching } deriving Show @@ -112,25 +118,38 @@ mapFlag :: (String -> String) -> OptDescr a -> OptDescr a mapFlag f (Option _ long arg descr) = Option [] (map f long) arg descr +-- | For batch usage. defaultVerbosity :: Verbosity defaultVerbosity = Trie.singleton [] 1 +-- | For interactive usage, do not print any debug messages+-- by default.+defaultInteractionVerbosity :: Verbosity+defaultInteractionVerbosity = Trie.singleton [] 0++defaultInteractionOptions :: PragmaOptions+defaultInteractionOptions = defaultPragmaOptions+ { optVerbose = defaultInteractionVerbosity }+ defaultOptions :: CommandLineOptions defaultOptions = Options { optProgramName = "agda"- , optInputFile = Nothing- , optIncludeDirs = Left []- , optShowVersion = False- , optShowHelp = False- , optInteractive = False- , optRunTests = False- , optCompile = False- , optEpicCompile = False- , optJSCompile = False+ , optInputFile = Nothing+ , optIncludeDirs = Left []+ , optShowVersion = False+ , optShowHelp = False+ , optInteractive = False+ , optRunTests = False+ , optGHCiInteraction = False+ , optCompile = False+ , optEpicCompile = False+ , optJSCompile = False , optCompileDir = Nothing , optGenerateVimFile = False+ , optGenerateLaTeX = False , optGenerateHTML = False , optDependencyGraph = Nothing+ , optLaTeXDir = defaultLaTeXDir , optHTMLDir = defaultHTMLDir , optCSSFile = Nothing , optIgnoreInterfaces = False@@ -139,11 +158,12 @@ , optPragmaOptions = defaultPragmaOptions , optEpicFlags = [] , optSafe = False- }+ } defaultPragmaOptions :: PragmaOptions defaultPragmaOptions = PragmaOptions { optShowImplicit = False+ , optShowIrrelevant = False , optVerbose = defaultVerbosity , optProofIrrelevance = False , optExperimentalIrrelevance = False@@ -159,8 +179,13 @@ , optGuardingTypeConstructors = False , optUniversePolymorphism = True , optWithoutK = False+ , optCopatterns = False } +-- | The default output directory for LaTeX.++defaultLaTeXDir = "latex"+ -- | The default output directory for HTML. defaultHTMLDir = "html"@@ -181,16 +206,20 @@ checkOpts opts | not (atMostOne [optAllowUnsolved . p, optCompile]) = Left "Unsolved meta variables are not allowed when compiling.\n"- | not (atMostOne [optInteractive, optCompile, optEpicCompile, optJSCompile]) =- Left "Choose at most one: compiler/interactive mode.\n"- | not (atMostOne [optGenerateHTML, optInteractive]) =- Left "Choose at most one: HTML generator or interactive mode.\n"- | not (atMostOne [isJust . optDependencyGraph, optInteractive]) =- Left "Choose at most one: Dependency graph generator or interactive mode.\n"+ | not (atMostOne [optGHCiInteraction, isJust . optInputFile]) =+ Left "Choose at most one: input file or --interaction.\n"+ | not (atMostOne $ interactive ++ [optCompile, optEpicCompile, optJSCompile]) =+ Left "Choose at most one: compilers/--interactive/--interaction.\n"+ | not (atMostOne $ interactive ++ [optGenerateHTML]) =+ Left "Choose at most one: --html/--interactive/--interaction.\n"+ | not (atMostOne $ interactive ++ [isJust . optDependencyGraph]) =+ Left "Choose at most one: --dependency-graph/--interactive/--interaction.\n" | not (atMostOne [ optUniversePolymorphism . p , not . optUniverseCheck . p ]) = Left "Cannot have both universe polymorphism and type in type.\n"+ | not (atMostOne $ interactive ++ [optGenerateLaTeX]) =+ Left "Choose at most one: --latex/--interactive/--interaction.\n" | (not . null . optEpicFlags $ opts) && not (optEpicCompile opts) = Left "Cannot set Epic flags without using the Epic backend.\n"@@ -200,6 +229,8 @@ p = optPragmaOptions + interactive = [optInteractive, optGHCiInteraction]+ -- Check for unsafe pramas. Gives a list of used unsafe flags. unsafePragmaOptions :: PragmaOptions -> [String]@@ -212,7 +243,8 @@ [ "--sized-types" | optSizedTypes opts ] ++ [ "--injective-type-constructors" | optInjectiveTypeConstructors opts ] ++ [ "--guardedness-preserving-type-constructors" | optGuardingTypeConstructors opts ] ++- [ "--experimental-irrelevance" | optExperimentalIrrelevance opts ]+ [ "--experimental-irrelevance" | optExperimentalIrrelevance opts ] +++ [ "--copatterns" | optCopatterns opts ] -- The default pragma options should be considered safe @@ -220,15 +252,15 @@ defaultPragmaOptionsSafe | null unsafe = return True | otherwise = do putStrLn $ "Following pragmas are default but not safe: "- ++ intercalate ", " unsafe+ ++ intercalate ", " unsafe return False where unsafe = unsafePragmaOptions defaultPragmaOptions inputFlag :: FilePath -> Flag CommandLineOptions inputFlag f o = case optInputFile o of- Nothing -> return $ o { optInputFile = Just f }- Just _ -> throwError "only one input file allowed"+ Nothing -> return $ o { optInputFile = Just f }+ Just _ -> throwError "only one input file allowed" versionFlag o = return $ o { optShowVersion = True } helpFlag o = return $ o { optShowHelp = True }@@ -239,8 +271,12 @@ ignoreInterfacesFlag o = return $ o { optIgnoreInterfaces = True } allowUnsolvedFlag o = return $ o { optAllowUnsolved = True } showImplicitFlag o = return $ o { optShowImplicit = True }+showIrrelevantFlag o = return $ o { optShowIrrelevant = True } runTestsFlag o = return $ o { optRunTests = True }+ghciInteractionFlag o = return $ o { optGHCiInteraction = True } vimFlag o = return $ o { optGenerateVimFile = True }+latexFlag o = return $ o { optGenerateLaTeX = True }+latexDirFlag d o = return $ o { optLaTeXDir = d } noPositivityFlag o = return $ o { optDisablePositivity = True } dontTerminationCheckFlag o = return $ o { optTerminationCheck = False } dontCompletenessCheckFlag o = return $ o { optCompletenessCheck = False }@@ -253,11 +289,12 @@ noUniversePolymorphismFlag o = return $ o { optUniversePolymorphism = False } noForcingFlag o = return $ o { optForcing = False } withoutKFlag o = return $ o { optWithoutK = True }+copatternsFlag o = return $ o { optCopatterns = True } interactiveFlag o = return $ o { optInteractive = True , optPragmaOptions = (optPragmaOptions o) { optAllowUnsolved = True }- }+ } compileFlag o = return $ o { optCompile = True } compileEpicFlag o = return $ o { optEpicCompile = True} compileJSFlag o = return $ o { optJSCompile = True}@@ -274,8 +311,8 @@ where ds = either id (const []) $ optIncludeDirs o verboseFlag s o =- do (k,n) <- parseVerbose s- return $ o { optVerbose = Trie.insert k n $ optVerbose o }+ do (k,n) <- parseVerbose s+ return $ o { optVerbose = Trie.insert k n $ optVerbose o } where parseVerbose s = case wordsBy (`elem` ":.") s of [] -> usage@@ -293,14 +330,16 @@ integerArgument :: String -> String -> Either String Int integerArgument flag s = readM s `catchError` \_ ->- throwError $ "option '" ++ flag ++ "' requires an integer argument"+ throwError $ "option '" ++ flag ++ "' requires an integer argument" standardOptions :: [OptDescr (Flag CommandLineOptions)] standardOptions =- [ Option ['V'] ["version"] (NoArg versionFlag) "show version number"- , Option ['?'] ["help"] (NoArg helpFlag) "show this help"+ [ Option ['V'] ["version"] (NoArg versionFlag) "show version number"+ , Option ['?'] ["help"] (NoArg helpFlag) "show this help" , Option ['I'] ["interactive"] (NoArg interactiveFlag)- "start in interactive mode"+ "start in interactive mode"+ , Option [] ["interaction"] (NoArg ghciInteractionFlag)+ "for use with the Emacs mode" , Option ['c'] ["compile"] (NoArg compileFlag) "compile program using the MAlonzo backend (experimental)" , Option [] ["epic"] (NoArg compileEpicFlag) "compile program using the Epic backend"@@ -315,6 +354,11 @@ "run internal test suite" , Option [] ["vim"] (NoArg vimFlag) "generate Vim highlighting files"+ , Option [] ["latex"] (NoArg latexFlag)+ "generate LaTeX with highlighted source code"+ , Option [] ["latex-dir"] (ReqArg latexDirFlag "DIR")+ ("directory in which LaTeX files are placed (default: " +++ defaultLaTeXDir ++ ")") , Option [] ["html"] (NoArg htmlFlag) "generate HTML files with highlighted source code" , Option [] ["dependency-graph"] (ReqArg dependencyGraphFlag "FILE")@@ -343,6 +387,8 @@ pragmaOptions = [ Option [] ["show-implicit"] (NoArg showImplicitFlag) "show implicit arguments when printing"+ , Option [] ["show-irrelevant"] (NoArg showIrrelevantFlag)+ "show irrelevant arguments when printing" , Option ['v'] ["verbose"] (ReqArg verboseFlag "N") "set verbosity level to N" -- , Option [] ["proof-irrelevance"] (NoArg proofIrrelevanceFlag)@@ -375,6 +421,8 @@ "enable potentially unsound irrelevance features (irrelevant levels, irrelevant data matching)" , Option [] ["without-K"] (NoArg withoutKFlag) "disable the K rule (maybe)"+ , Option [] ["copatterns"] (NoArg copatternsFlag)+ "enable definitions by copattern matching" ] -- | Used for printing usage info.@@ -427,7 +475,7 @@ where header progName = unlines [ "Agda" , ""- , "Usage: " ++ progName ++ " [OPTIONS...] FILE"+ , "Usage: " ++ progName ++ " [OPTIONS...] [FILE]" ] pluginMsg (name, help, inherited, opts)
+ src/full/Agda/Interaction/Response.hs view
@@ -0,0 +1,115 @@+------------------------------------------------------------------------+-- | Data type for all interactive responses+------------------------------------------------------------------------+{-# LANGUAGE CPP, TypeSynonymInstances, FlexibleInstances #-}++module Agda.Interaction.Response+ ( Response (..)+ , DisplayInfo (..)+ , Status (..)+ , GiveResult (..)+ , InteractionOutputCallback+ , defaultInteractionOutputCallback+ ) where++import Agda.Interaction.Highlighting.Precise+import Agda.Interaction.FindFile (ModuleToSource)+--import Agda.Interaction.MakeCase+import Agda.TypeChecking.Monad.Base+import Agda.Syntax.Concrete (Expr)+import Agda.Utils.Pretty++import Data.Int++#include "../undefined.h"+import Agda.Utils.Impossible++-- | Responses for any interactive interface+--+-- Note that the response is given in pieces and incrementally,+-- so the user can have timely response even during long computations.++data Response+ = Resp_HighlightingInfo HighlightingInfo ModuleToSource+ | Resp_Status Status+ | Resp_JumpToError FilePath Int32+ | Resp_InteractionPoints [InteractionId]+ | Resp_GiveAction InteractionId GiveResult+ | Resp_MakeCaseAction [String]+ | Resp_MakeCase String [String]+ | Resp_SolveAll [(InteractionId, Expr)]+ | Resp_DisplayInfo DisplayInfo+ | Resp_RunningInfo String+ | Resp_ClearRunningInfo+ | Resp_ClearHighlighting++-- | Info to display at the end of an interactive command++data DisplayInfo+ = Info_CompilationOk+ | Info_Constraints String+ | Info_AllGoals String+ | Info_Error String+ -- ^ When an error message is displayed this constructor should be+ -- used, if appropriate.+ | Info_Intro Doc+ -- ^ 'Info_Intro' denotes two different types of errors+ -- TODO: split these into separate constructors+ | Info_Auto String+ -- ^ 'Info_Auto' denotes either an error or a success (when 'Resp_GiveAction' is present)+ -- TODO: split these into separate constructors+ | Info_ModuleContents Doc+ | Info_NormalForm Doc+ | Info_GoalType Doc+ | Info_CurrentGoal Doc+ | Info_InferredType Doc+ | Info_Context Doc+ deriving Show++-- | Status information.++data Status = Status+ { sShowImplicitArguments :: Bool+ -- ^ Are implicit arguments displayed?+ , sChecked :: Bool+ -- ^ Has the module been successfully type checked?+ }++-- | Give action result+--+-- Comment derived from agda2-mode.el+--+-- If 'GiveResult' is 'Give_String s', then the goal is replaced by 's',+-- and otherwise the text inside the goal is retained (parenthesised+-- if 'GiveResult' is 'Give_Paren').++data GiveResult+ = Give_String String+ | Give_Paren+ | Give_NoParen++-- | Callback fuction to call when there is a response+-- to give to the interactive frontend.+--+-- Note that the response is given in pieces and incrementally,+-- so the user can have timely response even during long computations.+--+-- Typical 'InteractionOutputCallback' functions:+--+-- * Convert the response into a 'String' representation and+-- print it on standard output+-- (suitable for inter-process communication).+--+-- * Put the response into a mutable variable stored in the+-- closure of the 'InteractionOutputCallback' function.+-- (suitable for intra-process communication).++type InteractionOutputCallback = Response -> TCM ()++-- | The default 'InteractionOutputCallback' function+-- is set to @__@@IMPOSSIBLE__@ because in this way it is easier to+-- recognize that some response is lost due to an uninitialized+-- 'InteractionOutputCallback' function.++defaultInteractionOutputCallback :: InteractionOutputCallback+defaultInteractionOutputCallback = __IMPOSSIBLE__
+ src/full/Agda/Interaction/Response.hs-boot view
@@ -0,0 +1,11 @@+module Agda.Interaction.Response+ ( InteractionOutputCallback+ , defaultInteractionOutputCallback+ ) where++import {-# SOURCE #-} Agda.TypeChecking.Monad.Base++data Response++type InteractionOutputCallback = Response -> TCM ()+defaultInteractionOutputCallback :: InteractionOutputCallback
src/full/Agda/Main.hs view
@@ -1,4 +1,5 @@ {-# LANGUAGE CPP #-}+{-# LANGUAGE PatternGuards #-} {-| Agda main module. -}@@ -16,8 +17,6 @@ import System.Environment import System.Exit import System.FilePath-import qualified Agda.Utils.IO.Locale as LocIO-import System.Time import Agda.Syntax.Position import Agda.Syntax.Parser@@ -28,16 +27,16 @@ import Agda.Syntax.Translation.AbstractToConcrete import Agda.Syntax.Translation.InternalToAbstract import Agda.Syntax.Abstract.Name-import Agda.Syntax.Strict import Agda.Syntax.Scope.Base import Agda.Interaction.Exceptions import Agda.Interaction.CommandLine.CommandLine import Agda.Interaction.Options import Agda.Interaction.Monad-import Agda.Interaction.GhciTop () -- to make sure it compiles+import Agda.Interaction.GhcTop (mimicGHCi) import qualified Agda.Interaction.Imports as Imp import qualified Agda.Interaction.Highlighting.Dot as Dot+import qualified Agda.Interaction.Highlighting.LaTeX as LaTeX import Agda.Interaction.Highlighting.HTML import Agda.TypeChecker@@ -82,6 +81,7 @@ unless ok exitFailure | isNothing (optInputFile opts) && not (optInteractive opts)+ && not (optGHCiInteraction opts) -> liftIO printUsage | otherwise -> do setCommandLineOptions opts@@ -89,18 +89,23 @@ where checkFile :: TCM () checkFile = do- i <- optInteractive <$> liftTCM commandLineOptions- compile <- optCompile <$> liftTCM commandLineOptions- epic <- optEpicCompile <$> liftTCM commandLineOptions- js <- optJSCompile <$> liftTCM commandLineOptions- when i $ liftIO $ LocIO.putStr splashScreen+ i <- optInteractive <$> liftTCM commandLineOptions+ ghci <- optGHCiInteraction <$> liftTCM commandLineOptions+ compile <- optCompile <$> liftTCM commandLineOptions+ epic <- optEpicCompile <$> liftTCM commandLineOptions+ js <- optJSCompile <$> liftTCM commandLineOptions+ when i $ liftIO $ putStr splashScreen let failIfNoInt (Just i) = return i -- The allowed combinations of command-line -- options should rule out Nothing here. failIfNoInt Nothing = __IMPOSSIBLE__ + failIfInt x Nothing = x+ failIfInt _ (Just _) = __IMPOSSIBLE__+ interaction :: TCM (Maybe Interface) -> TCM () interaction | i = runIM . interactionLoop+ | ghci = (failIfInt mimicGHCi =<<) | compile = (MAlonzo.compilerMain =<<) . (failIfNoInt =<<) | epic = (Epic.compilerMain =<<) . (failIfNoInt =<<) | js = (JS.compilerMain =<<) . (failIfNoInt =<<)@@ -115,12 +120,12 @@ unsolvedOK <- optAllowUnsolved <$> pragmaOptions result <- case mw of- Just (Imp.Warnings [] [] []) -> __IMPOSSIBLE__- Just (Imp.Warnings _ unsolved@(_:_) _)+ Just (Warnings [] [] []) -> __IMPOSSIBLE__+ Just (Warnings _ unsolved@(_:_) _) | not unsolvedOK -> typeError $ UnsolvedMetas unsolved- Just (Imp.Warnings _ _ unsolved@(_:_))+ Just (Warnings _ _ unsolved@(_:_)) | not unsolvedOK -> typeError $ UnsolvedConstraints unsolved- Just (Imp.Warnings termErrs@(_:_) _ _) ->+ Just (Warnings termErrs@(_:_) _ _) -> typeError $ TerminationCheckFailed termErrs Just _ -> return Nothing Nothing -> return $ Just i@@ -131,40 +136,39 @@ whenM (isJust . optDependencyGraph <$> commandLineOptions) $ Dot.generateDot $ i + whenM (optGenerateLaTeX <$> commandLineOptions) $+ LaTeX.generateLaTeX (iModuleName i) (iHighlighting i)+ return result -- | Print usage information. printUsage :: IO () printUsage = do progName <- getProgName- LocIO.putStr $ usage standardOptions_ [] progName+ putStr $ usage standardOptions_ [] progName -- | Print version information. printVersion :: IO () printVersion =- LocIO.putStrLn $ "Agda version " ++ version+ putStrLn $ "Agda version " ++ version -- | What to do for bad options. optionError :: String -> IO () optionError err = do- LocIO.putStrLn $ "Error: " ++ err+ putStrLn $ "Error: " ++ err printUsage exitFailure -- | Main main :: IO () main = do-#if MIN_VERSION_base(4,2,0)- -- Ensure that UTF-8 is used for functions in Agda.Utils.IO.Locale- IO.hSetEncoding IO.stdout IO.utf8-#endif r <- runTCM $ runAgda `catchError` \err -> do s <- prettyError err- liftIO $ LocIO.putStrLn s+ liftIO $ putStrLn s throwError err case r of Right _ -> exitSuccess Left _ -> exitFailure `catchImpossible` \e -> do- LocIO.putStr $ show e+ putStr $ show e exitFailure
src/full/Agda/Syntax/Abstract.hs view
@@ -1,4 +1,7 @@-{-# LANGUAGE DeriveDataTypeable, DeriveFunctor, DeriveFoldable, DeriveTraversable, CPP #-}+{-# LANGUAGE DeriveDataTypeable, DeriveFunctor, DeriveFoldable,+ DeriveTraversable, CPP, TemplateHaskell,+ MultiParamTypeClasses, FlexibleInstances,+ TypeSynonymInstances #-} {-| The abstract syntax. This is what you get after desugaring and scope analysis of the concrete syntax. The type checker works on abstract syntax, producing internal syntax ("Agda.Syntax.Internal").@@ -8,14 +11,14 @@ , module Agda.Syntax.Abstract.Name ) where -import Prelude hiding (foldr)+import Prelude hiding (foldl, foldr) import Control.Applicative import Data.Sequence (Seq, (<|), (><)) import qualified Data.Sequence as Seq import Data.Foldable as Fold import Data.Traversable import Data.Map (Map)-import Data.Generics (Typeable, Data)+import Data.Typeable (Typeable) import qualified Agda.Syntax.Concrete as C import Agda.Syntax.Concrete.Pretty ()@@ -27,6 +30,7 @@ import Agda.Syntax.Literal import Agda.Syntax.Scope.Base +import Agda.Utils.Geniplate import Agda.Utils.Tuple #include "../undefined.h"@@ -34,7 +38,7 @@ data Expr = Var Name -- ^ Bound variables- | Def QName -- ^ Constants (i.e. axioms, functions, and datatypes)+ | Def QName -- ^ Constants (i.e. axioms, functions, projections, and datatypes) | Con AmbiguousQName -- ^ Constructors | Lit Literal -- ^ Literals | QuestionMark MetaInfo -- ^ meta variable for interaction@@ -46,42 +50,43 @@ | ExtendedLam ExprInfo DefInfo QName [Clause] | Pi ExprInfo Telescope Expr -- ^ | Fun ExprInfo (Arg Expr) Expr -- ^ independent function space- | Set ExprInfo Nat -- ^ Set, Set1, Set2, ...+ | Set ExprInfo Integer -- ^ Set, Set1, Set2, ... | Prop ExprInfo -- ^ | Let ExprInfo [LetBinding] Expr -- ^ | ETel Telescope -- ^ only used when printing telescopes | Rec ExprInfo [(C.Name, Expr)] -- ^ record construction | RecUpdate ExprInfo Expr [(C.Name, Expr)] -- ^ record update | ScopedExpr ScopeInfo Expr -- ^ scope annotation- | QuoteGoal ExprInfo Name Expr -- ^+ | QuoteGoal ExprInfo Name Expr -- ^ binds @Name@ to current type in @Expr@ | Quote ExprInfo -- ^ | QuoteTerm ExprInfo -- ^ | Unquote ExprInfo -- ^ The splicing construct: unquote ... | DontCare Expr -- ^ for printing DontCare from Syntax.Internal- deriving (Typeable, Data, Show)+ | PatternSyn QName+ deriving (Typeable, Show) data Declaration = Axiom DefInfo Relevance QName Expr -- ^ postulate | Field DefInfo QName (Arg Expr) -- ^ record field | Primitive DefInfo QName Expr -- ^ primitive function- | Mutual DeclInfo [Declaration] -- ^ a bunch of mutually recursive definitions+ | Mutual MutualInfo [Declaration] -- ^ a bunch of mutually recursive definitions | Section ModuleInfo ModuleName [TypedBindings] [Declaration] | Apply ModuleInfo ModuleName ModuleApplication (Map QName QName) (Map ModuleName ModuleName) | Import ModuleInfo ModuleName | Pragma Range Pragma | Open ModuleInfo ModuleName -- ^ only retained for highlighting purposes- | FunDef DefInfo QName [Clause]+ | FunDef DefInfo QName Delayed [Clause] -- ^ sequence of function clauses | DataSig DefInfo QName Telescope Expr -- ^ lone data signature -- ^ the 'LamBinding's are 'DomainFree' and binds the parameters of the datatype. | DataDef DefInfo QName [LamBinding] [Constructor] -- ^ the 'LamBinding's are 'DomainFree' and binds the parameters of the datatype. | RecSig DefInfo QName Telescope Expr -- ^ lone record signature- | RecDef DefInfo QName (Maybe QName) [LamBinding] Expr [Declaration]+ | RecDef DefInfo QName (Maybe Induction) (Maybe QName) [LamBinding] Expr [Declaration] -- ^ The 'Expr' gives the constructor type telescope, @(x1 : A1)..(xn : An) -> Prop@, -- and the optional name is the constructor's name. | ScopedDecl ScopeInfo [Declaration] -- ^ scope annotation- deriving (Typeable, Data, Show)+ deriving (Typeable, Show) class GetDefInfo a where getDefInfo :: a -> Maybe DefInfo@@ -91,16 +96,16 @@ getDefInfo (Field i _ _) = Just i getDefInfo (Primitive i _ _) = Just i getDefInfo (ScopedDecl _ (d:_)) = getDefInfo d- getDefInfo (FunDef i _ _) = Just i+ getDefInfo (FunDef i _ _ _) = Just i getDefInfo (DataSig i _ _ _) = Just i getDefInfo (DataDef i _ _ _) = Just i getDefInfo (RecSig i _ _ _) = Just i- getDefInfo (RecDef i _ _ _ _ _) = Just i+ getDefInfo (RecDef i _ _ _ _ _ _) = Just i getDefInfo _ = Nothing data ModuleApplication = SectionApp [TypedBindings] ModuleName [NamedArg Expr] | RecordModuleIFS ModuleName- deriving (Typeable, Data, Show)+ deriving (Typeable, Show) data Pragma = OptionsPragma [String] | BuiltinPragma String Expr@@ -111,27 +116,29 @@ | CompiledJSPragma QName String | StaticPragma QName | EtaPragma QName- deriving (Typeable, Data, Show)+ deriving (Typeable, Show) data LetBinding = LetBind LetInfo Relevance Name Expr Expr -- ^ LetBind info rel name type defn+ | LetPatBind LetInfo Pattern Expr -- ^ irrefutable pattern binding | LetApply ModuleInfo ModuleName ModuleApplication (Map QName QName) (Map ModuleName ModuleName) | LetOpen ModuleInfo ModuleName -- ^ only for highlighting and abstractToConcrete- deriving (Typeable, Data, Show)+ deriving (Typeable, Show) -- | Only 'Axiom's. type TypeSignature = Declaration type Constructor = TypeSignature+type Field = TypeSignature -- | A lambda binding is either domain free or typed. data LamBinding = DomainFree Hiding Relevance Name -- ^ . @x@ or @{x}@ or @.x@ or @.{x}@ | DomainFull TypedBindings -- ^ . @(xs:e)@ or @{xs:e}@- deriving (Typeable, Data, Show)+ deriving (Typeable, Show) -- | Typed bindings with hiding information. data TypedBindings = TypedBindings Range (Arg TypedBinding) -- ^ . @(xs : e)@ or @{xs : e}@- deriving (Typeable, Data, Show)+ deriving (Typeable, Show) -- | A typed binding. Appears in dependent function spaces, typed lambdas, and -- telescopes. I might be tempting to simplify this to only bind a single@@ -141,15 +148,19 @@ -- you have to. data TypedBinding = TBind Range [Name] Expr | TNoBind Expr- deriving (Typeable, Data, Show)+ deriving (Typeable, Show) type Telescope = [TypedBindings] -- | We could throw away @where@ clauses at this point and translate them to -- @let@. It's not obvious how to remember that the @let@ was really a -- @where@ clause though, so for the time being we keep it here.-data Clause = Clause LHS RHS [Declaration]- deriving (Typeable, Data, Show)+data Clause = Clause+ { clauseLHS :: LHS+ , clauseRHS :: RHS+ , clauseWhereDecls :: [Declaration]+ } deriving (Typeable, Show)+ data RHS = RHS Expr | AbsurdRHS | WithRHS QName [Expr] [Clause] -- ^ The 'QName' is the name of the with function.@@ -157,24 +168,113 @@ -- ^ The 'QName's are the names of the generated with functions. -- One for each 'Expr'. -- The RHS shouldn't be another RewriteRHS- deriving (Typeable, Data, Show)+ deriving (Typeable, Show) -data LHS = LHS LHSInfo QName [NamedArg Pattern] [Pattern]- deriving (Typeable, Data, Show)+-- | The lhs of a clause in spine view (inside-out).+-- Projection patterns are contained in @spLhsPats@,+-- represented as @DefP d []@.+data SpineLHS = SpineLHS+ { spLhsInfo :: LHSInfo -- ^ Range.+ , spLhsDefName :: QName -- ^ Name of function we are defining.+ , spLhsPats :: [NamedArg Pattern] -- ^ Function parameters (patterns).+ , spLhsWithPats :: [Pattern] -- ^ @with@ patterns (after @|@).+ }+ deriving (Typeable, Show) +-- | The lhs of a clause in projection-application view (outside-in).+-- Projection patters are represented as 'LHSProj's.+data LHS = LHS+ { lhsInfo :: LHSInfo -- ^ Range.+ , lhsCore :: LHSCore -- ^ Copatterns.+ , lhsWithPats :: [Pattern] -- ^ @with@ patterns (after @|@).+ }+ deriving (Typeable, Show)++-- | The lhs minus @with@-patterns in projection-application view.+-- Parameterised over the type @e@ of dot patterns.+data LHSCore' e+ -- | The head applied to ordinary patterns.+ = LHSHead { lhsDefName :: QName -- ^ Head @f@.+ , lhsPats :: [NamedArg (Pattern' e)] -- ^ Applied to patterns @ps@.+ }+ -- | Projection+ | LHSProj { lhsDestructor :: QName+ -- ^ Record projection identifier.+ , lhsPatsLeft :: [NamedArg (Pattern' e)]+ -- ^ Indices of the projection.+ -- Currently none @[]@, since we do not have indexed records.+ , lhsFocus :: NamedArg (LHSCore' e)+ -- ^ Main branch.+ , lhsPatsRight :: [NamedArg (Pattern' e)]+ -- ^ Further applied to patterns.+ }+ deriving (Typeable, Show, Functor, Foldable, Traversable)++type LHSCore = LHSCore' Expr++lhsToSpine :: LHS -> SpineLHS+lhsToSpine (LHS i core wps) = SpineLHS i f ps wps+ where QNamed f ps = lhsCoreToSpine core++lhsCoreToSpine :: LHSCore' e -> QNamed [NamedArg (Pattern' e)]+lhsCoreToSpine (LHSHead f ps) = QNamed f ps+lhsCoreToSpine (LHSProj d ps1 h ps2) = (++ (p : ps2)) <$> lhsCoreToSpine (namedArg h)+ where p = updateNamedArg (const $ DefP i d ps1) h+ i = PatRange noRange++-- spineToLhsCore ::++-- | Used for checking pattern linearity.+lhsCoreAllPatterns :: LHSCore' e -> [Pattern' e]+lhsCoreAllPatterns = map namedArg . qnamed . lhsCoreToSpine+{- OLD code, dumps projection patterns, superfluous+lhsCoreAllPatterns (LHSHead f ps) = map namedArg ps+lhsCoreAllPatterns (LHSProj d ps1 l ps2) =+ map namedArg ps1 +++ lhsCoreAllPatterns (namedArg l) +++ map namedArg ps2+-}++-- | Used in AbstractToConcrete.+lhsCoreToPattern :: LHSCore -> Pattern+lhsCoreToPattern lc =+ case lc of+ LHSHead f aps -> DefP noInfo f aps+ LHSProj d aps1 lhscore aps2 -> DefP noInfo d $+ aps1 ++ fmap (fmap lhsCoreToPattern) lhscore : aps2+ where noInfo = PatRange noRange -- TODO, preserve range!++mapLHSHead :: (QName -> [NamedArg Pattern] -> LHSCore) -> LHSCore -> LHSCore+mapLHSHead f (LHSHead x ps) = f x ps+mapLHSHead f (LHSProj d ps1 l ps2) =+ LHSProj d ps1 (fmap (fmap (mapLHSHead f)) l) ps2++{- UNUSED+mapLHSHeadM :: (Monad m) => (QName -> [NamedArg Pattern] -> m LHSCore) -> LHSCore -> m LHSCore+mapLHSHeadM f (LHSHead x ps) = f x ps+mapLHSHeadM f (LHSProj d ps1 l ps2) = do+ l <- mapLHSHead f l+ return $ LHSProj d ps1 l ps2+-}+ -- | Parameterised over the type of dot patterns.-data Pattern' e = VarP Name- | ConP PatInfo AmbiguousQName [NamedArg (Pattern' e)]- | DefP PatInfo QName [NamedArg (Pattern' e)] -- ^ defined pattern- | WildP PatInfo- | AsP PatInfo Name (Pattern' e)- | DotP PatInfo e- | AbsurdP PatInfo- | LitP Literal- | ImplicitP PatInfo -- ^ generated at type checking for implicit arguments- deriving (Typeable, Data, Show, Functor, Foldable, Traversable)+data Pattern' e+ = VarP Name+ | ConP PatInfo AmbiguousQName [NamedArg (Pattern' e)]+ | DefP PatInfo QName [NamedArg (Pattern' e)]+ -- ^ Defined pattern: function definition @f ps@ or destructor pattern @d p ps@.+ | WildP PatInfo+ | AsP PatInfo Name (Pattern' e)+ | DotP PatInfo e+ | AbsurdP PatInfo+ | LitP Literal+ | ImplicitP PatInfo+ -- ^ Generated at type checking for implicit arguments.+ | PatternSynP PatInfo QName [NamedArg (Pattern' e)]+ deriving (Typeable, Show, Functor, Foldable, Traversable) -type Pattern = Pattern' Expr+type Pattern = Pattern' Expr+type Patterns = [NamedArg Pattern] {-------------------------------------------------------------------------- Instances@@ -192,63 +292,69 @@ getRange (TNoBind e) = getRange e instance HasRange Expr where- getRange (Var x) = getRange x- getRange (Def x) = getRange x- getRange (Con x) = getRange x- getRange (Lit l) = getRange l- getRange (QuestionMark i) = getRange i- getRange (Underscore i) = getRange i- getRange (App i _ _) = getRange i- getRange (WithApp i _ _) = getRange i- getRange (Lam i _ _) = getRange i- getRange (AbsurdLam i _) = getRange i- getRange (ExtendedLam i _ _ _) = getRange i- getRange (Pi i _ _) = getRange i- getRange (Fun i _ _) = getRange i- getRange (Set i _) = getRange i- getRange (Prop i) = getRange i- getRange (Let i _ _) = getRange i- getRange (Rec i _) = getRange i- getRange (RecUpdate i _ _) = getRange i- getRange (ETel tel) = getRange tel- getRange (ScopedExpr _ e) = getRange e- getRange (QuoteGoal _ _ e) = getRange e- getRange (Quote i) = getRange i- getRange (QuoteTerm i) = getRange i- getRange (Unquote i) = getRange i- getRange (DontCare{}) = noRange+ getRange (Var x) = getRange x+ getRange (Def x) = getRange x+ getRange (Con x) = getRange x+ getRange (Lit l) = getRange l+ getRange (QuestionMark i) = getRange i+ getRange (Underscore i) = getRange i+ getRange (App i _ _) = getRange i+ getRange (WithApp i _ _) = getRange i+ getRange (Lam i _ _) = getRange i+ getRange (AbsurdLam i _) = getRange i+ getRange (ExtendedLam i _ _ _) = getRange i+ getRange (Pi i _ _) = getRange i+ getRange (Fun i _ _) = getRange i+ getRange (Set i _) = getRange i+ getRange (Prop i) = getRange i+ getRange (Let i _ _) = getRange i+ getRange (Rec i _) = getRange i+ getRange (RecUpdate i _ _) = getRange i+ getRange (ETel tel) = getRange tel+ getRange (ScopedExpr _ e) = getRange e+ getRange (QuoteGoal _ _ e) = getRange e+ getRange (Quote i) = getRange i+ getRange (QuoteTerm i) = getRange i+ getRange (Unquote i) = getRange i+ getRange (DontCare{}) = noRange+ getRange (PatternSyn x) = getRange x instance HasRange Declaration where- getRange (Axiom i _ _ _ ) = getRange i- getRange (Field i _ _ ) = getRange i- getRange (Mutual i _ ) = getRange i- getRange (Section i _ _ _ ) = getRange i- getRange (Apply i _ _ _ _ ) = getRange i- getRange (Import i _ ) = getRange i- getRange (Primitive i _ _ ) = getRange i- getRange (Pragma i _ ) = getRange i- getRange (Open i _ ) = getRange i- getRange (ScopedDecl _ d ) = getRange d- getRange (FunDef i _ _ ) = getRange i- getRange (DataSig i _ _ _ ) = getRange i- getRange (DataDef i _ _ _ ) = getRange i- getRange (RecSig i _ _ _ ) = getRange i- getRange (RecDef i _ _ _ _ _ ) = getRange i+ getRange (Axiom i _ _ _ ) = getRange i+ getRange (Field i _ _ ) = getRange i+ getRange (Mutual i _ ) = getRange i+ getRange (Section i _ _ _ ) = getRange i+ getRange (Apply i _ _ _ _ ) = getRange i+ getRange (Import i _ ) = getRange i+ getRange (Primitive i _ _ ) = getRange i+ getRange (Pragma i _ ) = getRange i+ getRange (Open i _ ) = getRange i+ getRange (ScopedDecl _ d ) = getRange d+ getRange (FunDef i _ _ _ ) = getRange i+ getRange (DataSig i _ _ _ ) = getRange i+ getRange (DataDef i _ _ _ ) = getRange i+ getRange (RecSig i _ _ _ ) = getRange i+ getRange (RecDef i _ _ _ _ _ _) = getRange i instance HasRange (Pattern' e) where- getRange (VarP x) = getRange x- getRange (ConP i _ _) = getRange i- getRange (DefP i _ _) = getRange i- getRange (WildP i) = getRange i- getRange (ImplicitP i) = getRange i- getRange (AsP i _ _) = getRange i- getRange (DotP i _) = getRange i- getRange (AbsurdP i) = getRange i- getRange (LitP l) = getRange l+ getRange (VarP x) = getRange x+ getRange (ConP i _ _) = getRange i+ getRange (DefP i _ _) = getRange i+ getRange (WildP i) = getRange i+ getRange (ImplicitP i) = getRange i+ getRange (AsP i _ _) = getRange i+ getRange (DotP i _) = getRange i+ getRange (AbsurdP i) = getRange i+ getRange (LitP l) = getRange l+ getRange (PatternSynP i _ _) = getRange i instance HasRange LHS where- getRange (LHS i _ _ _) = getRange i+ getRange (LHS i _ _) = getRange i +instance HasRange (LHSCore' e) where+ getRange (LHSHead f ps) = fuseRange f ps+ getRange (LHSProj d ps1 lhscore ps2) = d `fuseRange` ps1 `fuseRange` lhscore `fuseRange` ps2+ instance HasRange Clause where getRange (Clause lhs rhs ds) = getRange (lhs,rhs,ds) @@ -260,9 +366,23 @@ instance HasRange LetBinding where getRange (LetBind i _ _ _ _ ) = getRange i+ getRange (LetPatBind i _ _ ) = getRange i getRange (LetApply i _ _ _ _ ) = getRange i getRange (LetOpen i _ ) = getRange i +-- setRange for patterns applies the range to the outermost pattern constructor+instance SetRange (Pattern' a) where+ setRange r (VarP x) = VarP (setRange r x)+ setRange r (ConP _ ns as) = ConP (PatRange r) (AmbQ $ map (setRange r) $ unAmbQ ns) as+ setRange r (DefP _ n as) = DefP (PatRange r) (setRange r n) as+ setRange r (WildP _) = WildP (PatRange r)+ setRange r (ImplicitP _) = ImplicitP (PatRange r)+ setRange r (AsP _ n p) = AsP (PatRange r) (setRange r n) p+ setRange r (DotP _ e) = DotP (PatRange r) e+ setRange r (AbsurdP _) = AbsurdP (PatRange r)+ setRange r (LitP l) = LitP (setRange r l)+ setRange r (PatternSynP _ n as) = PatternSynP (PatRange r) (setRange r n) as+ instance KillRange LamBinding where killRange (DomainFree h r x) = killRange1 (DomainFree h r) x killRange (DomainFull b) = killRange1 DomainFull b@@ -275,31 +395,34 @@ killRange (TNoBind e) = killRange1 TNoBind e instance KillRange Expr where- killRange (Var x) = killRange1 Var x- killRange (Def x) = killRange1 Def x- killRange (Con x) = killRange1 Con x- killRange (Lit l) = killRange1 Lit l- killRange (QuestionMark i) = killRange1 QuestionMark i- killRange (Underscore i) = killRange1 Underscore i- killRange (App i e1 e2) = killRange3 App i e1 e2- killRange (WithApp i e es) = killRange3 WithApp i e es- killRange (Lam i b e) = killRange3 Lam i b e- killRange (AbsurdLam i h) = killRange1 AbsurdLam i h- killRange (ExtendedLam i name di pes) = killRange4 ExtendedLam i name di pes --(\_ -> ExtendedLam i def {-name di si-}) i pes- killRange (Pi i a b) = killRange3 Pi i a b- killRange (Fun i a b) = killRange3 Fun i a b- killRange (Set i n) = Set (killRange i) n- killRange (Prop i) = killRange1 Prop i- killRange (Let i ds e) = killRange3 Let i ds e- killRange (Rec i fs) = Rec (killRange i) (map (id -*- killRange) fs)- killRange (RecUpdate i e fs) = RecUpdate (killRange i) (killRange e) (map (id -*- killRange) fs)- killRange (ETel tel) = killRange1 ETel tel- killRange (ScopedExpr s e) = killRange1 (ScopedExpr s) e- killRange (QuoteGoal i x e)= killRange3 QuoteGoal i x e- killRange (Quote i) = killRange1 Quote i- killRange (QuoteTerm i) = killRange1 QuoteTerm i- killRange (Unquote i) = killRange1 Unquote i- killRange (DontCare e) = DontCare e+ killRange (Var x) = killRange1 Var x+ killRange (Def x) = killRange1 Def x+ killRange (Con x) = killRange1 Con x+ killRange (Lit l) = killRange1 Lit l+ killRange (QuestionMark i) = killRange1 QuestionMark i+ killRange (Underscore i) = killRange1 Underscore i+ killRange (App i e1 e2) = killRange3 App i e1 e2+ killRange (WithApp i e es) = killRange3 WithApp i e es+ killRange (Lam i b e) = killRange3 Lam i b e+ killRange (AbsurdLam i h) = killRange1 AbsurdLam i h+ killRange (ExtendedLam i n d ps) = killRange4 ExtendedLam i n d ps+ killRange (Pi i a b) = killRange3 Pi i a b+ killRange (Fun i a b) = killRange3 Fun i a b+ killRange (Set i n) = Set (killRange i) n+ killRange (Prop i) = killRange1 Prop i+ killRange (Let i ds e) = killRange3 Let i ds e+ killRange (Rec i fs) = Rec (killRange i) (map (id -*- killRange) fs)+ killRange (RecUpdate i e fs) = RecUpdate (killRange i)+ (killRange e)+ (map (id -*- killRange) fs)+ killRange (ETel tel) = killRange1 ETel tel+ killRange (ScopedExpr s e) = killRange1 (ScopedExpr s) e+ killRange (QuoteGoal i x e) = killRange3 QuoteGoal i x e+ killRange (Quote i) = killRange1 Quote i+ killRange (QuoteTerm i) = killRange1 QuoteTerm i+ killRange (Unquote i) = killRange1 Unquote i+ killRange (DontCare e) = DontCare e+ killRange (PatternSyn x) = killRange1 PatternSyn x instance KillRange Relevance where killRange rel = rel -- no range to kill@@ -316,11 +439,11 @@ killRange (Pragma i a ) = Pragma (killRange i) a killRange (Open i x ) = killRange2 Open i x killRange (ScopedDecl a d ) = killRange1 (ScopedDecl a) d- killRange (FunDef i a b ) = killRange3 FunDef i a b- killRange (DataSig i a b c ) = killRange3 DataSig i a b c- killRange (DataDef i a b c ) = killRange4 DataDef i a b c- killRange (RecSig i a b c ) = killRange4 RecSig i a b c- killRange (RecDef i a b c d e ) = killRange6 RecDef i a b c d e+ killRange (FunDef i a b c ) = killRange4 FunDef i a b c+ killRange (DataSig i a b c ) = killRange4 DataSig i a b c+ killRange (DataDef i a b c ) = killRange4 DataDef i a b c+ killRange (RecSig i a b c ) = killRange4 RecSig i a b c+ killRange (RecDef i a b c d e f ) = killRange7 RecDef i a b c d e f instance KillRange ModuleApplication where killRange (SectionApp a b c ) = killRange3 SectionApp a b c@@ -330,19 +453,24 @@ killRange (ThingWithFixity c f) = ThingWithFixity (killRange c) f instance KillRange e => KillRange (Pattern' e) where- killRange (VarP x) = killRange1 VarP x- killRange (ConP i a b) = killRange3 ConP i a b- killRange (DefP i a b) = killRange3 DefP i a b- killRange (WildP i) = killRange1 WildP i- killRange (ImplicitP i) = killRange1 ImplicitP i- killRange (AsP i a b) = killRange3 AsP i a b- killRange (DotP i a) = killRange2 DotP i a- killRange (AbsurdP i) = killRange1 AbsurdP i- killRange (LitP l) = killRange1 LitP l+ killRange (VarP x) = killRange1 VarP x+ killRange (ConP i a b) = killRange3 ConP i a b+ killRange (DefP i a b) = killRange3 DefP i a b+ killRange (WildP i) = killRange1 WildP i+ killRange (ImplicitP i) = killRange1 ImplicitP i+ killRange (AsP i a b) = killRange3 AsP i a b+ killRange (DotP i a) = killRange2 DotP i a+ killRange (AbsurdP i) = killRange1 AbsurdP i+ killRange (LitP l) = killRange1 LitP l+ killRange (PatternSynP i a p) = killRange3 PatternSynP i a p instance KillRange LHS where- killRange (LHS i a b c) = killRange4 LHS i a b c+ killRange (LHS i a b) = killRange3 LHS i a b +instance KillRange e => KillRange (LHSCore' e) where+ killRange (LHSHead a b) = killRange2 LHSHead a b+ killRange (LHSProj a b c d) = killRange4 LHSProj a b c d+ instance KillRange Clause where killRange (Clause lhs rhs ds) = killRange3 Clause lhs rhs ds @@ -354,9 +482,21 @@ instance KillRange LetBinding where killRange (LetBind i rel a b c ) = killRange5 LetBind i rel a b c+ killRange (LetPatBind i a b ) = killRange3 LetPatBind i a b killRange (LetApply i a b c d ) = killRange3 LetApply i a b c d killRange (LetOpen i x ) = killRange2 LetOpen i x +instanceUniverseBiT' [] [t| (Declaration, QName) |]+instanceUniverseBiT' [] [t| (Declaration, AmbiguousQName) |]+instanceUniverseBiT' [] [t| (Declaration, Expr) |]+instanceUniverseBiT' [] [t| (Declaration, LetBinding) |]+instanceUniverseBiT' [] [t| (Declaration, LamBinding) |]+instanceUniverseBiT' [] [t| (Declaration, TypedBinding) |]+instanceUniverseBiT' [] [t| (Declaration, Pattern) |]+instanceUniverseBiT' [] [t| (Declaration, Declaration) |]+instanceUniverseBiT' [] [t| (Declaration, ModuleName) |]+instanceUniverseBiT' [] [t| (Declaration, ModuleInfo) |]+ ------------------------------------------------------------------------ -- Queries ------------------------------------------------------------------------@@ -374,9 +514,9 @@ allNames (DataSig _ q _ _) = Seq.singleton q allNames (DataDef _ q _ decls) = q <| Fold.foldMap allNames decls allNames (RecSig _ q _ _) = Seq.singleton q-allNames (RecDef _ q c _ _ decls) =+allNames (RecDef _ q _ c _ _ decls) = q <| foldMap Seq.singleton c >< Fold.foldMap allNames decls-allNames (FunDef _ q cls) = q <| Fold.foldMap allNamesC cls+allNames (FunDef _ q _ cls) = q <| Fold.foldMap allNamesC cls where allNamesC :: Clause -> Seq QName allNamesC (Clause _ rhs decls) = allNamesR rhs ><@@ -418,6 +558,7 @@ allNamesE QuoteTerm {} = Seq.empty allNamesE Unquote {} = Seq.empty allNamesE DontCare {} = Seq.empty+ allNamesE (PatternSyn x) = Seq.empty allNamesLam :: LamBinding -> Seq QName allNamesLam DomainFree {} = Seq.empty@@ -429,12 +570,13 @@ allNamesLet :: LetBinding -> Seq QName allNamesLet (LetBind _ _ _ e1 e2) = Fold.foldMap allNamesE [e1, e2]+ allNamesLet (LetPatBind _ _ e) = allNamesE e allNamesLet (LetApply _ _ app _ _) = allNamesApp app allNamesLet LetOpen {} = Seq.empty allNamesApp :: ModuleApplication -> Seq QName allNamesApp (SectionApp bindss _ es) = Fold.foldMap allNamesBinds bindss ><- Fold.foldMap allNamesE (map (namedThing . unArg) es)+ Fold.foldMap allNamesE (map namedArg es) allNamesApp RecordModuleIFS {} = Seq.empty allNames (Section _ _ _ decls) = Fold.foldMap allNames decls@@ -462,15 +604,106 @@ anyAbstract = Fold.any anyAbstract instance AnyAbstract Declaration where- anyAbstract (Axiom i _ _ _) = defAbstract i == AbstractDef- anyAbstract (Field i _ _) = defAbstract i == AbstractDef- anyAbstract (Mutual _ ds) = anyAbstract ds- anyAbstract (ScopedDecl _ ds) = anyAbstract ds- anyAbstract (Section _ _ _ ds) = anyAbstract ds- anyAbstract (FunDef i _ _) = defAbstract i == AbstractDef- anyAbstract (DataDef i _ _ _) = defAbstract i == AbstractDef- anyAbstract (RecDef i _ _ _ _ _) = defAbstract i == AbstractDef- anyAbstract (DataSig i _ _ _) = defAbstract i == AbstractDef- anyAbstract (RecSig i _ _ _) = defAbstract i == AbstractDef- anyAbstract _ = __IMPOSSIBLE__+ anyAbstract (Axiom i _ _ _) = defAbstract i == AbstractDef+ anyAbstract (Field i _ _) = defAbstract i == AbstractDef+ anyAbstract (Mutual _ ds) = anyAbstract ds+ anyAbstract (ScopedDecl _ ds) = anyAbstract ds+ anyAbstract (Section _ _ _ ds) = anyAbstract ds+ anyAbstract (FunDef i _ _ _) = defAbstract i == AbstractDef+ anyAbstract (DataDef i _ _ _) = defAbstract i == AbstractDef+ anyAbstract (RecDef i _ _ _ _ _ _) = defAbstract i == AbstractDef+ anyAbstract (DataSig i _ _ _) = defAbstract i == AbstractDef+ anyAbstract (RecSig i _ _ _) = defAbstract i == AbstractDef+ anyAbstract _ = __IMPOSSIBLE__ +app = foldl (App (ExprRange noRange))++patternToExpr :: Pattern -> Expr+patternToExpr (VarP x) = Var x+patternToExpr (ConP _ c ps) =+ Con c `app` map (fmap (fmap patternToExpr)) ps+patternToExpr (DefP _ f ps) =+ Def f `app` map (fmap (fmap patternToExpr)) ps+patternToExpr (WildP _) = Underscore emptyMetaInfo+patternToExpr (AsP _ _ p) = patternToExpr p+patternToExpr (DotP _ e) = e+patternToExpr (AbsurdP _) = Underscore emptyMetaInfo -- TODO: could this happen?+patternToExpr (LitP l) = Lit l+patternToExpr (ImplicitP _) = Underscore emptyMetaInfo+patternToExpr (PatternSynP _ _ _) = __IMPOSSIBLE__++type PatternSynDefn = ([Name], Pattern)+type PatternSynDefns = Map QName PatternSynDefn++lambdaLiftExpr :: [Name] -> Expr -> Expr+lambdaLiftExpr [] e = e+lambdaLiftExpr (n:ns) e = Lam (ExprRange noRange)+ (DomainFree NotHidden Relevant n) $+ lambdaLiftExpr ns e++substPattern :: [(Name, Pattern)] -> Pattern -> Pattern+substPattern s p = case p of+ VarP z -> case lookup z s of+ Nothing -> p+ Just x -> x+ ConP i q ps -> ConP i q (fmap (fmap (fmap (substPattern s))) ps)+ WildP i -> p+ DotP i e -> DotP i (substExpr (map (fmap patternToExpr) s) e)+ AbsurdP i -> p+ LitP l -> p+ _ -> __IMPOSSIBLE__ -- Implicits (generated at TC time),+ -- pattern synonyms (already gone), and+ -- @-patterns (not supported anyways).++substExpr :: [(Name, Expr)] -> Expr -> Expr+substExpr s e = case e of+ Var n -> case lookup n s of+ Nothing -> e+ Just z -> z+ Def _ -> e+ Con _ -> e+ Lit _ -> e+ QuestionMark _ -> e+ Underscore _ -> e+ App i e e' -> App i (substExpr s e)+ (fmap (fmap (substExpr s)) e')+ WithApp i e es -> WithApp i (substExpr s e)+ (fmap (substExpr s) es)+ Lam i lb e -> Lam i lb (substExpr s e)+ AbsurdLam i h -> e+ ExtendedLam i di n cs -> __IMPOSSIBLE__ -- Maybe later...+ Pi i t e -> Pi i (fmap (substTypedBindings s) t)+ (substExpr s e)+ Fun i ae e -> Fun i (fmap (substExpr s) ae)+ (substExpr s e)+ Set i n -> e+ Prop i -> e+ Let i ls e -> Let i (fmap (substLetBinding s) ls)+ (substExpr s e)+ ETel t -> e+ Rec i nes -> Rec i (fmap (fmap (substExpr s)) nes)+ RecUpdate i e nes -> RecUpdate i (substExpr s e)+ (fmap (fmap (substExpr s)) nes)+ -- XXX: Do we need to do more with ScopedExprs?+ ScopedExpr si e -> ScopedExpr si (substExpr s e)+ QuoteGoal i n e -> QuoteGoal i n (substExpr s e)+ Quote i -> e+ QuoteTerm i -> e+ Unquote i -> e+ DontCare e -> DontCare (substExpr s e)+ PatternSyn x -> e++substLetBinding :: [(Name, Expr)] -> LetBinding -> LetBinding+substLetBinding s lb = case lb of+ LetBind i r n e e' -> LetBind i r n (substExpr s e) (substExpr s e')+ LetPatBind i p e -> LetPatBind i p (substExpr s e) -- Andreas, 2012-06-04: what about the pattern p+ _ -> lb++substTypedBindings :: [(Name, Expr)] -> TypedBindings -> TypedBindings+substTypedBindings s (TypedBindings r atb) = TypedBindings r+ (fmap (substTypedBinding s) atb)++substTypedBinding :: [(Name, Expr)] -> TypedBinding -> TypedBinding+substTypedBinding s tb = case tb of+ TBind r ns e -> TBind r ns $ substExpr s e+ TNoBind e -> TNoBind $ substExpr s e
+ src/full/Agda/Syntax/Abstract/Copatterns.hs view
@@ -0,0 +1,422 @@+{-# LANGUAGE CPP, TupleSections, PatternGuards, DeriveFunctor, StandaloneDeriving, ScopedTypeVariables, TypeSynonymInstances, FlexibleContexts, FlexibleInstances #-}+module Agda.Syntax.Abstract.Copatterns (translateCopatternClauses) where++import Prelude hiding (mapM)++import Control.Applicative+import Control.Monad hiding (mapM)+import Control.Monad.Writer hiding (mapM)++import Data.Function+import Data.List++import Data.Traversable as T++import Agda.Syntax.Abstract+import Agda.Syntax.Abstract.Name as A+import Agda.Syntax.Common+import qualified Agda.Syntax.Concrete.Name as C+import Agda.Syntax.Info+import Agda.Syntax.Position+import Agda.Syntax.Scope.Base+import Agda.Syntax.Scope.Monad++import Agda.TypeChecking.Monad.Base (TypeError(..), Call(..), typeError,+ TCErr(..))+import Agda.Utils.List+import Agda.Utils.Tuple++#include "../../undefined.h"+import Agda.Utils.Impossible++{- Andreas 2012-04-07, 2012-05-08++ Translating copatterns into record expressions++This is a preliminary solution until we have proper copattern type+checking and evaluation.++Example 1:++ record Stream (A : Set) : Set where+ field+ head : A+ tail : Stream A+ open Stream++ alternate : Stream Nat+ ( head alternate ) = zero+ (head (tail alternate)) = suc zero+ (tail (tail alternate)) = alternate++with pathes++ Path [head] zero+ Path [tail,head] (suc zero)+ Path [tail,tail] alternate++is translated into++ alternate = record+ { head = zero+ ; tail = record+ { head = suc zero+ ; tail = alternate+ }+ }++Example 2:++ record State (S A : Set) : Set where+ constructor state+ field+ runState : S → A × S+ open State++ record Monad (M : Set → Set) : Set1 where+ constructor monad+ field+ return : {A : Set} → A → M A+ _>>=_ : {A B : Set} → M A → (A → M B) → M B+ open Monad++ stateMonad : {S : Set} → Monad (State S)+ runState (return stateMonad a ) s = a , s+ runState (_>>=_ stateMonad m k) s₀ =+ let as₁ = runState m s₀+ in runState (k (proj₁ as₁)) (proj₂ as₁)++with pathes++ Path [(return,[a] ), (runstate,[s ])] (a,s)+ Path [(_>>=_, [m,k]), (runstate,[s₀])] (let...)++is translated to++ stateMonad = record+ { return = λ a → record { runState = λ s → a , s }+ ; _>>=_ = λ m k → record { runState = λ s₀ →+ let as₁ = runState m s₀+ in runState (k (proj₁ as₁)) (proj₂ as₁)+ }++Example 3:++ swap3 : {A B C X : Set} → (X → A) × ((X → B) × C) → (X → C) × (X → (B × A))+ fst (swap3 t) x = snd (snd t)+ fst (snd (swap3 t) y) = fst (snd t) y+ snd (snd (swap3 t) z) = fst t z++with pathes++ Path [(fst,[x])] (snd (snd t))+ Path [(snd,[y]), (fst,[])] (fst (snd t) y)+ Path [(snd,[z]), (snd,[])] (fst t z)++ist translated to++ swap3 t = record+ { fst = λ x → snd (snd t)+ ; snd = λ y → record+ { fst = fst (snd t) y+ ; snd = (fst t z){z := y}+ }+ }++How to translate:+- group clauses into those with same LHSCore and same withpatterns++-}++translateCopatternClauses :: [Clause] -> ScopeM (Delayed, [Clause])+translateCopatternClauses cs = if all noCopats cs then return (NotDelayed, cs) else (Delayed,) <$> do+ pcs :: [ProjPath Clause] <- mapM clauseToPath cs+ let cps :: [(Clause, [ProjPath Expr])]+ cps = groupClauses pcs+{-+ cps = map ((theContent . head) /\ map (fmap (rhsExpr . clauseRHS))) $+ groupBy ((==) `on` clauseLHS . theContent) pcs+-}+ ces <- mapM (mapSndM pathToRecord) $+ map (mapSnd $ sortBy (compare `on` thePath)) cps+ return $ map (\ (c, e) -> c { clauseRHS = RHS e }) ces+ where+ noCopats Clause{ clauseLHS = LHS _ LHSHead{} _ } = True+ noCopats _ = False+ rhsExpr (RHS e) = e+ rhsExpr _ = __IMPOSSIBLE__++-- | A sequence of decisions @b@ leading to a head @a@.+data Path a b = Path+ { thePath :: [a] -- ^ the list of choices+ , theContent :: b+ } deriving (Functor) -- NB: this means @Path a@ is a functor for any @a@++mapContent :: (b -> c) -> Path a b -> Path a c+mapContent f (Path p c) = Path p (f c)++data ProjEntry = ProjEntry+ { projPE :: QName+ , patsPE :: [NamedArg Name] -- ^ currently we only support variable patterns+ } deriving (Eq, Ord)++type ProjPath = Path ProjEntry++instance HasRange ProjEntry where+ getRange (ProjEntry p ps) = getRange (p,ps)++-- | This is a n^2 grouping algorithm which uses only alpha-equality+groupClauses :: [ProjPath Clause] -> [(Clause, [ProjPath Expr])]+groupClauses [] = []+groupClauses (pc@(Path p c) : pcs) = (c, Path p (rhs c) : grp) : groupClauses rest+ where+ (grp, rest) = collect pcs+ -- Collect l splits l into pc's group and the remainder+ -- If the lhs of the next clause is alpha-equivalent to the current lhs+ -- then add the next clause to this group, performing the alpha-conversion+ collect (Path p' c' : pcs) | Just rho <- alpha (clauseLHS c') (clauseLHS c) =+ mapFst (Path p' (rename' rho (rhs c')) :) $ collect pcs+ -- we go through all the clauses, since they could be in random order...+ collect (pc : pcs) = mapSnd (pc :) $ collect pcs+ collect [] = ([], [])++ rhs = rhsExpr . clauseRHS+ rhsExpr (RHS e) = e+ rhsExpr _ = __IMPOSSIBLE__++clauseToPath :: Clause -> ScopeM (ProjPath Clause)+clauseToPath (Clause (LHS i lhs wps) (RHS e) []) =+ fmap (\ lhs -> Clause (LHS i lhs wps) (RHS e) []) <$> lhsToPath [] lhs+clauseToPath (Clause lhs (RHS e) (_:_)) = typeError $ NotImplemented $ "copattern clauses with where declarations"+clauseToPath (Clause lhs _ wheredecls) = typeError $ NotImplemented $ "copattern clauses with absurd, with or rewrite right hand side"++lhsToPath :: [ProjEntry] -> LHSCore -> ScopeM (ProjPath LHSCore)+lhsToPath acc lhs@LHSHead{} = return $ Path acc lhs+lhsToPath acc (LHSProj f [] lhs ps) | Just xs <- mapM (T.mapM (T.mapM fromVarP)) ps =+ lhsToPath (ProjEntry f xs : acc) $ namedArg lhs+ where fromVarP :: Pattern -> Maybe Name+ fromVarP (VarP n) = Just n+ fromVarP _ = Nothing+lhsToPath acc (LHSProj f _ lhs _) = typeError $ NotImplemented $+ "copatterns with patterns before the principal argument"++-- | Expects a sorted list.+pathToRecord :: [ProjPath Expr] -> ScopeM Expr+pathToRecord [] = __IMPOSSIBLE__+pathToRecord [Path [] e] = return e+pathToRecord pps =+ case pathHeads pps of+ Nothing -> typeError $ GenericError $ "overlapping copattern clauses"+ Just pps -> do+ pes <- mapM (mapSndM pathToRecord) $ groupPathes pps+ let ei = ExprRange $ getRange $ map fst pes+ Rec ei <$> mapM abstractions pes++ where+ abstractions :: (ProjEntry, Expr) -> ScopeM (C.Name, Expr)+ abstractions (ProjEntry p xs, e) = (C.unqualify $ qnameToConcrete p,) <$>+ foldr abstract (return e) xs++ abstract :: NamedArg Name -> ScopeM Expr -> ScopeM Expr+ abstract (Arg h r (Named Nothing x)) me =+ Lam (ExprRange noRange) (DomainFree h r x) <$> me+ abstract (Arg _ _ (Named Just{} _)) me = typeError $ NotImplemented $+ "named arguments in projection patterns"++-- | Similar to 'groupClauses'.+groupPathes :: [(ProjEntry, ProjPath Expr)] -> [(ProjEntry, [ProjPath Expr])]+groupPathes [] = []+groupPathes ((pe@(ProjEntry p xs), path) : pps) = (pe, path : grp) : groupPathes rest+ -- Now group all following pps that have the same projection p+ -- We expect that they have alpha-equivalent xs+ where+ (grp, rest) = collect pps+ collect l@((ProjEntry p' xs', path) : pps) | p == p', Just rho <- alpha xs' xs =+ -- add the alpha-converted path to the group+ -- NOTE: because the path contains only projections and pattern vars+ -- we only alpha-convert the content (rhs Expr)+ -- When the path will contain dot patterns, we have to rename in them+ mapFst (mapContent (rename' rho) path :) $ collect pps+ collect l = ([], l) -- null or different projection: close group++pathHeads :: [Path a b] -> Maybe [(a, Path a b)]+pathHeads = mapM pathSplit++pathSplit :: Path a b -> Maybe (a, Path a b)+pathSplit (Path [] b) = Nothing+pathSplit (Path (a:as) b) = Just (a, Path as b)+++-- * Alpha conversion++type NameMap = [(Name,Name)]++class Rename e where+ rename :: (Name -> Maybe Name) -> e -> e+ rename' :: NameMap -> e -> e+ rename' rho = rename (flip lookup rho)++instance Rename Expr where+ rename rho e =+ case e of+ Var x -> Var $ maybe x id (rho x)+ Def f -> e+ Con c -> e+ Lit l -> e+ QuestionMark i -> e+ Underscore i -> e+ App i e es -> App i (rename rho e) (rename rho es)+ WithApp i e es -> WithApp i (rename rho e) (rename rho es)+ Lam i lb e -> Lam i (rename rho lb) (rename rho e)+ AbsurdLam{} -> e+ ExtendedLam i i' n cs -> ExtendedLam i i' n (rename rho cs)+ Pi i tel e -> Pi i (rename rho tel) (rename rho e)+ Fun i a e -> Fun i (rename rho a) (rename rho e)+ Set{} -> e+ Prop{} -> e+ Let i bs e -> Let i (rename rho bs) (rename rho e)+ ETel tel -> ETel (rename rho tel)+ Rec i fes -> Rec i $ map (id -*- rename rho) fes+ RecUpdate i e fes -> RecUpdate i (rename rho e) $ map (id -*- rename rho) fes+ ScopedExpr i e -> ScopedExpr i (rename rho e)+ QuoteGoal i n e -> QuoteGoal i n (rename rho e)+ Quote i -> e+ QuoteTerm i -> e+ Unquote i -> e+ DontCare e -> DontCare (rename rho e)+ PatternSyn n -> e++instance Rename LetBinding where+ rename rho e =+ case e of+ LetBind i r n e e' -> LetBind i r n (rename rho e) (rename rho e')+ LetPatBind i p e -> LetPatBind i (rename rho p) (rename rho e)+ LetApply{} -> e+ LetOpen{} -> e++instance Rename LamBinding where+ rename rho e =+ case e of+ DomainFree{} -> e+ DomainFull tb -> DomainFull (rename rho tb)++instance Rename TypedBindings where+ rename rho (TypedBindings r tb) = TypedBindings r (rename rho tb)++instance Rename TypedBinding where+ rename rho (TBind r ns e) = TBind r ns (rename rho e)+ rename rho (TNoBind e) = TNoBind (rename rho e)++instance Rename Clause where+ rename rho (Clause lhs rhs wheredecls) =+ Clause (rename rho lhs) (rename rho rhs) (rename rho wheredecls)++instance Rename RHS where+ rename rho e = case e of+ RHS e -> RHS (rename rho e)+ AbsurdRHS -> e+ WithRHS n es cs -> WithRHS n (rename rho es) (rename rho cs)+ RewriteRHS ns es r ds -> RewriteRHS ns (rename rho es) (rename rho r) (rename rho ds)++instance Rename LHS where+ rename rho (LHS i core ps) = LHS i (rename rho core) (rename rho ps)++instance Rename LHSCore where+ rename rho = fmap (rename rho) -- only rename in dot patterns+{-+ rename rho = ren where+ ren e = case e of+ LHSHead f ps -> LHSHead f (ren ps)+ LHSProj d ps1 core ps2 -> LHSProj d (ren ps1) (ren core) (ren ps2)+-}++instance Rename Pattern where+ rename rho = fmap (rename rho) -- only rename in dot patterns++instance Rename Declaration where+ rename rho d = __IMPOSSIBLE__++instance Rename a => Rename (Arg a) where+ rename rho = fmap (rename rho)++instance Rename a => Rename (Named n a) where+ rename rho = fmap (rename rho)++instance Rename a => Rename [a] where+ rename rho = map (rename rho)+++++-- | Alpha-Equivalence of patterns, ignoring dot patterns+class Alpha t where+ alpha :: t -> t -> Maybe NameMap+ alpha t t' = fmap snd $ runWriterT $ alpha' t t'++ alpha' :: t -> t -> WriterT NameMap Maybe ()+ alpha' t t' = WriterT $ fmap ((),) $ alpha t t'++instance Alpha Name where+ alpha' x x' = tell1 (x, x')++instance Alpha (Pattern' e) where+ alpha' p p' =+ case (p,p') of+ ((VarP x) , (VarP x') ) -> tell1 (x, x')+ ((ConP _ x ps) , (ConP _ x' ps') ) -> guard (x == x') >> alpha' ps ps'+ ((DefP _ x ps) , (DefP _ x' ps') ) -> guard (x == x') >> alpha' ps ps'+ ((WildP _) , (WildP _) ) -> return ()+ ((AsP _ x p) , (AsP _ x' p') ) -> tell1 (x, x') >> alpha' p p'+ ((DotP _ _) , (DotP _ _) ) -> return ()+ (AbsurdP{} , AbsurdP{} ) -> return ()+ ((LitP l) , (LitP l') ) -> guard (l == l')+ (ImplicitP{} , ImplicitP{} ) -> return ()+ ((PatternSynP _ x ps) , (PatternSynP _ x' ps')) -> guard (x == x') >> alpha' ps ps'+ (_ , _ ) -> fail "not alpha equivalent"++tell1 :: (MonadWriter [a] m) => a -> m ()+tell1 a = tell [a]++deriving instance Eq AmbiguousQName++instance Alpha (LHSCore' e) where+ alpha' (LHSHead f ps) (LHSHead f' ps') = guard (f == f') >> alpha' ps ps'+ alpha' (LHSProj d ps1 lhs ps2) (LHSProj d' ps1' lhs' ps2') =+ guard (d == d') >> alpha' ps1 ps1' >> alpha' lhs lhs' >> alpha' ps2 ps2'+ alpha' _ _ = fail "not alpha equivalent"++instance Alpha LHS where+ alpha' (LHS _ core wps) (LHS _ core' wps') = alpha' core core' >> alpha' wps wps'++instance Alpha a => Alpha (Arg a) where+ alpha' a a' = alpha' (unArg a) (unArg a')++instance (Eq n, Alpha a) => Alpha (Named n a) where+ alpha' a a' = guard (nameOf a == nameOf a') >> alpha' (namedThing a) (namedThing a')++instance Alpha a => Alpha [a] where+ alpha' l l' = guard (length l == length l') >> zipWithM_ alpha' l l'++-- | Literal equality of patterns, ignoring dot patterns+instance Eq (Pattern' e) where+ p == p' =+ case (p,p') of+ ((VarP x) , (VarP x') ) -> x === x'+ ((ConP _ x ps) , (ConP _ x' ps') ) -> x == x' && ps == ps'+ ((DefP _ x ps) , (DefP _ x' ps') ) -> x == x' && ps == ps'+ ((WildP _) , (WildP _) ) -> True+ ((AsP _ x p) , (AsP _ x' p') ) -> x === x' && p == p'+ ((DotP _ _) , (DotP _ _) ) -> True+ (AbsurdP{} , AbsurdP{} ) -> True+ ((LitP l) , (LitP l') ) -> l == l'+ (ImplicitP{} , ImplicitP{} ) -> True+ ((PatternSynP _ x ps) , (PatternSynP _ x' ps')) -> x == x' && ps == ps'+ (_ , _ ) -> False+ where (A.Name _ (C.Name _ x) _ _) === (A.Name _ (C.Name _ x') _ _) = True+ (A.Name _ C.NoName{} _ _) === (A.Name _ C.NoName{} _ _) = True+ _ === _ = False++deriving instance Eq (LHSCore' e)++instance Eq LHS where+ (LHS _ core wps) == (LHS _ core' wps') = core == core' && wps == wps'
src/full/Agda/Syntax/Abstract/Name.hs view
@@ -1,13 +1,20 @@-{-# LANGUAGE CPP, DeriveDataTypeable, GeneralizedNewtypeDeriving, FlexibleContexts #-}+{-# LANGUAGE CPP,+ DeriveDataTypeable, GeneralizedNewtypeDeriving,+ DeriveFunctor, DeriveFoldable, DeriveTraversable,+ FlexibleContexts #-} {-| Abstract names should carry unique identifiers and stuff. Not right now though. -} module Agda.Syntax.Abstract.Name where import Control.Monad.State-import Data.Generics (Typeable, Data)++import Data.Foldable (Foldable)+import Data.Traversable (Traversable)+import Data.Typeable (Typeable) import Data.List import Data.Function+import Data.Hashable import Agda.Syntax.Position import Agda.Syntax.Common@@ -31,7 +38,7 @@ , nameBindingSite :: Range , nameFixity :: Fixity' }- deriving (Typeable, Data)+ deriving (Typeable) -- | Qualified names are non-empty lists of names. Equality on qualified names -- are just equality on the last name, i.e. the module part is just@@ -42,32 +49,44 @@ data QName = QName { qnameModule :: ModuleName , qnameName :: Name }- deriving (Typeable, Data)+ deriving (Typeable) +-- | Something preceeded by a qualified name.+data QNamed a = QNamed+ { qname :: QName+ , qnamed :: a+ }+ deriving (Typeable, Show, Functor, Foldable, Traversable)+ -- | A module name is just a qualified name. -- -- The 'SetRange' instance for module names sets all individual ranges -- to the given one. newtype ModuleName = MName { mnameToList :: [Name] }- deriving (Eq, Ord, Typeable, Data)+ deriving (Eq, Ord, Typeable) -- | Ambiguous qualified names. Used for overloaded constructors. -- -- Invariant: All the names in the list must have the same concrete, -- unqualified name. newtype AmbiguousQName = AmbQ { unAmbQ :: [QName] }- deriving (Typeable, Data, HasRange, Show)+ deriving (Typeable, HasRange, Show) instance HasRange ModuleName where getRange (MName []) = noRange getRange (MName xs) = getRange xs +-- | A module is anonymous if the qualification path ends in an underscore.+isAnonymousModuleName :: ModuleName -> Bool+isAnonymousModuleName (MName []) = False+isAnonymousModuleName (MName ms) = C.isNoName $ nameConcrete $ last ms+ -- | Sets the ranges of the individual names in the module name to -- match those of the corresponding concrete names. If the concrete -- names are fewer than the number of module name name parts, then the -- initial name parts get the range 'noRange'. ----- @C.D.E `withRangesOf` [A, B]@ returns @C.D.E@ but with ranges set+-- @C.D.E \`withRangesOf\` [A, B]@ returns @C.D.E@ but with ranges set -- as follows: -- -- * @C@: 'noRange'.@@ -193,7 +212,7 @@ freshNoName_ :: (MonadState s m, HasFresh NameId s) => m Name freshNoName_ = freshNoName noRange --- | Get the next version of the concrete name. For instance, @nextName "x" = "x'"@.+-- | Get the next version of the concrete name. For instance, @nextName "x" = "x₁"@. -- The name must not be a 'NoName'. nextName :: Name -> Name nextName x = x { nameConcrete = C.Name noRange $ nextSuf ps }@@ -219,6 +238,10 @@ instance Show Name where show x = show (nameConcrete x) -- ++ "|" ++ show (nameId x) +instance Hashable Name where+ {-# INLINE hash #-}+ hash = hash . nameId+ instance Show QName where show q = concat $ intersperse "." $ map show $ qnameToList q @@ -230,6 +253,10 @@ instance Ord QName where compare = compare `on` qnameName++instance Hashable QName where+ {-# INLINE hash #-}+ hash = hash . qnameName instance HasRange Name where getRange = getRange . nameConcrete
src/full/Agda/Syntax/Abstract/Views.hs view
@@ -26,3 +26,10 @@ unAppView :: AppView -> Expr unAppView (Application h es) = foldl (App (ExprRange noRange)) h es++-- | Check whether we are dealing with a universe.+isSet :: Expr -> Bool+isSet (ScopedExpr _ e) = isSet e+isSet (App _ e _) = isSet e+isSet (Set{}) = True+isSet _ = False
src/full/Agda/Syntax/Common.hs view
@@ -5,10 +5,11 @@ -} module Agda.Syntax.Common where -import Data.Generics (Typeable, Data)+import Data.Typeable (Typeable) import Control.Applicative import Data.Foldable import Data.Traversable+import Data.Hashable import Test.QuickCheck import Agda.Syntax.Position@@ -18,28 +19,59 @@ #include "../undefined.h" import Agda.Utils.Impossible +-- | Used to specify whether something should be delayed.+data Delayed = Delayed | NotDelayed+ deriving (Typeable, Show, Eq, Ord)+ data Induction = Inductive | CoInductive- deriving (Typeable, Data, Show, Eq, Ord)+ deriving (Typeable, Eq, Ord) +instance Show Induction where+ show Inductive = "inductive"+ show CoInductive = "coinductive"++instance HasRange Induction where+ getRange _ = noRange+ data Hiding = Hidden | Instance | NotHidden- deriving (Typeable, Data, Show, Eq, Ord)+ deriving (Typeable, Show, Eq, Ord) +instance KillRange Delayed where killRange = id+instance KillRange Induction where killRange = id+instance KillRange Hiding where killRange = id++---------------------------------------------------------------------------+-- * Relevance+---------------------------------------------------------------------------+ -- | A function argument can be relevant or irrelevant. -- See 'Agda.TypeChecking.Irrelevance'. data Relevance- = Relevant -- ^ the argument is (possibly) relevant at compile-time- | NonStrict -- ^ the argument may never flow into evaluation position.+ = Relevant -- ^ The argument is (possibly) relevant at compile-time.+ | NonStrict -- ^ The argument may never flow into evaluation position. -- Therefore, it is irrelevant at run-time. -- It is treated relevantly during equality checking.- | Irrelevant -- ^ the argument is irrelevant at compile- and runtime- | Forced -- ^ the argument can be skipped during equality checking- deriving (Typeable, Data, Show, Eq)+ | Irrelevant -- ^ The argument is irrelevant at compile- and runtime.+ | Forced -- ^ The argument can be skipped during equality checking+ -- because its value is already determined by the type.+ | UnusedArg -- ^ The polarity checker has determined that this argument+ -- is unused in the definition. It can be skipped during+ -- equality checking but should be mined for solutions+ -- of meta-variables with relevance 'UnusedArg'+ deriving (Typeable, Show, Eq, Enum, Bounded) +instance Arbitrary Relevance where+ arbitrary = elements [minBound..maxBound]+ instance Ord Relevance where (<=) = moreRelevant -- | Information ordering.--- @Relevant `moreRelevant` Forced `moreRelevant` NonStrict `moreRelevant` Irrelevant@+-- @Relevant \`moreRelevant\`+-- UnusedArg \`moreRelevant\`+-- Forced \`moreRelevant\`+-- NonStrict \`moreRelevant\`+-- Irrelevant@ moreRelevant :: Relevance -> Relevance -> Bool moreRelevant r r' = case (r, r') of@@ -50,24 +82,76 @@ (Relevant, _) -> True (_, Relevant) -> False -- second bottom+ (UnusedArg, _) -> True+ (_, UnusedArg) -> False+ -- third bottom (Forced, _) -> True (_, Forced) -> False -- remaining case (NonStrict,NonStrict) -> True -instance KillRange Induction where killRange = id-instance KillRange Hiding where killRange = id+---------------------------------------------------------------------------+-- * Function type domain+--------------------------------------------------------------------------- +-- | Similar to 'Arg', but we need to distinguish+-- an irrelevance annotation in a function domain+-- (the domain itself is not irrelevant!)+-- from an irrelevant argument.+--+-- @Dom@ is used in 'Pi' of internal syntax, in 'Context' and 'Telescope'.+-- 'Arg' is used for actual arguments ('Var', 'Con', 'Def' etc.)+-- and in 'Abstract' syntax and other situations.+data Dom e = Dom+ { domHiding :: Hiding+ , domRelevance :: Relevance+ , unDom :: e+ } deriving (Typeable, Eq, Ord, Functor, Foldable, Traversable)++argFromDom :: Dom a -> Arg a+argFromDom (Dom h r a) = Arg h r a++domFromArg :: Arg a -> Dom a+domFromArg (Arg h r a) = Dom h r a++mapDomHiding :: (Hiding -> Hiding) -> Dom a -> Dom a+mapDomHiding f dom = dom { domHiding = f (domHiding dom) }++mapDomRelevance :: (Relevance -> Relevance) -> Dom a -> Dom a+mapDomRelevance f dom = dom { domRelevance = f (domRelevance dom) }++instance HasRange a => HasRange (Dom a) where+ getRange = getRange . unDom++instance KillRange a => KillRange (Dom a) where+ killRange = fmap killRange++instance Sized a => Sized (Dom a) where+ size = size . unDom++instance Show a => Show (Dom a) where+ show = show . argFromDom++---------------------------------------------------------------------------+-- * Argument decoration+---------------------------------------------------------------------------+ -- | A function argument can be hidden and/or irrelevant. data Arg e = Arg { argHiding :: Hiding , argRelevance :: Relevance , unArg :: e- } deriving (Typeable, Data, Ord, Functor, Foldable, Traversable)+ } deriving (Typeable, Ord, Functor, Foldable, Traversable) instance Eq a => Eq (Arg a) where Arg h1 _ x1 == Arg h2 _ x2 = (h1, x1) == (h2, x2) +mapArgHiding :: (Hiding -> Hiding) -> Arg a -> Arg a+mapArgHiding f arg = arg { argHiding = f (argHiding arg) }++mapArgRelevance :: (Relevance -> Relevance) -> Arg a -> Arg a+mapArgRelevance f arg = arg { argRelevance = f (argRelevance arg) }+ makeInstance :: Arg a -> Arg a makeInstance a = a { argHiding = Instance } @@ -80,7 +164,7 @@ isHiddenArg :: Arg a -> Bool isHiddenArg arg = argHiding arg /= NotHidden --- | @xs `withArgsFrom` args@ translates @xs@ into a list of 'Arg's,+-- | @xs \`withArgsFrom\` args@ translates @xs@ into a list of 'Arg's, -- using the elements in @args@ to fill in the non-'unArg' fields. -- -- Precondition: The two lists should have equal length.@@ -107,13 +191,18 @@ showR Irrelevant s = "." ++ s showR NonStrict s = "?" ++ s showR Forced s = "!" ++ s+ showR UnusedArg s = "k" ++ s -- constant showR Relevant s = "r" ++ s -- Andreas: I want to see it explicitly +---------------------------------------------------------------------------+-- * Named arguments+---------------------------------------------------------------------------+ data Named name a = Named { nameOf :: Maybe name , namedThing :: a }- deriving (Eq, Ord, Typeable, Data, Functor, Foldable, Traversable)+ deriving (Eq, Ord, Typeable, Functor, Foldable, Traversable) unnamed :: a -> Named name a unnamed = Named Nothing@@ -137,34 +226,54 @@ -- | Only 'Hidden' arguments can have names. type NamedArg a = Arg (Named String a) +-- | Get the content of a 'NamedArg'.+namedArg :: NamedArg a -> a+namedArg = namedThing . unArg++defaultNamedArg :: a -> NamedArg a+defaultNamedArg = defaultArg . unnamed++-- | The functor instance for 'NamedArg' would be ambiguous,+-- so we give it another name here.+updateNamedArg :: (a -> b) -> NamedArg a -> NamedArg b+updateNamedArg = fmap . fmap++---------------------------------------------------------------------------+-- * Infixity, access, abstract, etc.+---------------------------------------------------------------------------+ -- | Functions can be defined in both infix and prefix style. See -- 'Agda.Syntax.Concrete.LHS'. data IsInfix = InfixDef | PrefixDef- deriving (Typeable, Data, Show, Eq, Ord)+ deriving (Typeable, Show, Eq, Ord) -- | Access modifier. data Access = PrivateAccess | PublicAccess | OnlyQualified -- ^ Visible from outside, but not exported when opening the module -- Used for qualified constructors.- deriving (Typeable, Data, Show, Eq, Ord)+ deriving (Typeable, Show, Eq, Ord) -- | Abstract or concrete data IsAbstract = AbstractDef | ConcreteDef- deriving (Typeable, Data, Show, Eq, Ord)+ deriving (Typeable, Show, Eq, Ord) -type Nat = Integer+type Nat = Int type Arity = Nat -- | The unique identifier of a name. Second argument is the top-level module -- identifier.-data NameId = NameId Nat Integer- deriving (Eq, Ord, Typeable, Data)+data NameId = NameId Integer Integer+ deriving (Eq, Ord, Typeable) instance Enum NameId where succ (NameId n m) = NameId (n + 1) m pred (NameId n m) = NameId (n - 1) m toEnum n = __IMPOSSIBLE__ -- should not be used fromEnum (NameId n _) = fromIntegral n++instance Hashable NameId where+ {-# INLINE hash #-}+ hash (NameId n m) = hash (n, m) newtype Constr a = Constr a
src/full/Agda/Syntax/Concrete.hs view
@@ -22,12 +22,11 @@ , ModuleApplication(..) , TypeSignature , Constructor- , Field , ImportDirective(..), UsingOrHiding(..), ImportedName(..) , Renaming(..), AsName(..) , defaultImportDir- , OpenShortHand(..)- , LHS(..), Pattern(..)+ , OpenShortHand(..), RewriteEqn, WithExpr+ , LHS(..), Pattern(..), LHSCore(..) , RHS(..), WhereClause(..) , Pragma(..) , Module@@ -38,7 +37,7 @@ ) where -import Data.Generics (Typeable, Data)+import Data.Typeable (Typeable) import Data.Foldable hiding (concatMap) import Data.Traversable import Agda.Syntax.Position@@ -55,7 +54,7 @@ data OpApp e = SyntaxBindingLambda !Range [LamBinding] e -- ^ an abstraction inside a special syntax declaration (see Issue 358 why we introduce this). | Ordinary e- deriving (Typeable, Data, Functor)+ deriving (Typeable, Functor) fromOrdinary :: e -> OpApp e -> e fromOrdinary d (Ordinary e) = e@@ -66,10 +65,10 @@ = Ident QName -- ^ ex: @x@ | Lit Literal -- ^ ex: @1@ or @\"foo\"@ | QuestionMark !Range (Maybe Nat) -- ^ ex: @?@ or @{! ... !}@- | Underscore !Range (Maybe Nat) -- ^ ex: @_@+ | Underscore !Range (Maybe String) -- ^ ex: @_@ or @_A_5@ | RawApp !Range [Expr] -- ^ before parsing operators | App !Range Expr (NamedArg Expr) -- ^ ex: @e e@, @e {e}@, or @e {x = e}@- | OpApp !Range Name [OpApp Expr] -- ^ ex: @e + e@+ | OpApp !Range QName [OpApp Expr] -- ^ ex: @e + e@ | WithApp !Range Expr [Expr] -- ^ ex: @e | e1 | .. | en@ | HiddenArg !Range (Named String Expr) -- ^ ex: @{e}@ or @{x=e}@ | InstanceArg !Range (Named String Expr) -- ^ ex: @{{e}}@ or @{{x=e}}@@@ -80,7 +79,7 @@ | Pi Telescope Expr -- ^ ex: @(xs:e) -> e@ or @{xs:e} -> e@ | Set !Range -- ^ ex: @Set@ | Prop !Range -- ^ ex: @Prop@- | SetN !Range Nat -- ^ ex: @Set0, Set1, ..@+ | SetN !Range Integer -- ^ ex: @Set0, Set1, ..@ | Rec !Range [(Name, Expr)] -- ^ ex: @record {x = a; y = b}@ | RecUpdate !Range Expr [(Name, Expr)] -- ^ ex: @record e {x = a; y = b}@ | Let !Range [Declaration] Expr -- ^ ex: @let Ds in e@@@ -94,44 +93,44 @@ | QuoteTerm !Range -- ^ ex: @quoteTerm@, should be applied to a term | Unquote !Range -- ^ ex: @unquote@, should be applied to a term of type @Term@ | DontCare Expr -- ^ to print irrelevant things- deriving (Typeable, Data)+ deriving (Typeable) -- | Concrete patterns. No literals in patterns at the moment. data Pattern- = IdentP QName- | AppP Pattern (NamedArg Pattern)- | RawAppP !Range [Pattern]- | OpAppP !Range Name [Pattern]- | HiddenP !Range (Named String Pattern)- | InstanceP !Range (Named String Pattern)- | ParenP !Range Pattern- | WildP !Range- | AbsurdP !Range- | AsP !Range Name Pattern- | DotP !Range Expr- | LitP Literal- deriving (Typeable, Data)+ = IdentP QName -- ^ @c@ or @x@+ | AppP Pattern (NamedArg Pattern) -- ^ @p p'@ or @p {x = p'}@+ | RawAppP !Range [Pattern] -- ^ @p1..pn@ before parsing operators+ | OpAppP !Range QName [Pattern] -- ^ eg: @p => p'@ for operator @_=>_@+ | HiddenP !Range (Named String Pattern) -- ^ @{p}@ or @{x = p}@+ | InstanceP !Range (Named String Pattern) -- ^ @{{p}}@ or @{{x = p}}@+ | ParenP !Range Pattern -- ^ @(p)@+ | WildP !Range -- ^ @_@+ | AbsurdP !Range -- ^ @()@+ | AsP !Range Name Pattern -- ^ @x\@p@ unused+ | DotP !Range Expr -- ^ @.e@+ | LitP Literal -- ^ @0@, @1@, etc.+ deriving (Typeable) -- | A lambda binding is either domain free or typed. data LamBinding = DomainFree Hiding Relevance BoundName -- ^ . @x@ or @{x}@ or @.x@ or @.{x}@ or @{.x}@ | DomainFull TypedBindings -- ^ . @(xs : e)@ or @{xs : e}@- deriving (Typeable, Data)+ deriving (Typeable) -- | A sequence of typed bindings with hiding information. Appears in dependent -- function spaces, typed lambdas, and telescopes. data TypedBindings = TypedBindings !Range (Arg TypedBinding) -- ^ . @(xs : e)@ or @{xs : e}@- deriving (Typeable, Data)+ deriving (Typeable) data BoundName = BName { boundName :: Name , bnameFixity :: Fixity' }- deriving (Typeable, Data)+ deriving (Typeable) mkBoundName_ :: Name -> BoundName mkBoundName_ x = BName x defaultFixity'@@ -140,7 +139,7 @@ data TypedBinding = TBind !Range [BoundName] Expr -- Binding @x1,..,xn:A@ | TNoBind Expr -- No binding @A@, equivalent to @_ : A@.- deriving (Typeable, Data)+ deriving (Typeable) -- | A telescope is a sequence of typed bindings. Bound variables are in scope@@ -154,25 +153,46 @@ We use fixity information to see which name is actually defined. -}-data LHS = LHS { lhsOriginalPattern :: Pattern- , lhsWithPattern :: [Pattern]- , lhsRewriteEqn :: [RewriteEqn]- , lhsWithExpr :: [WithExpr]+data LHS = LHS { lhsOriginalPattern :: Pattern -- ^ @f ps@+ , lhsWithPattern :: [Pattern] -- ^ @| p@ (many)+ , lhsRewriteEqn :: [RewriteEqn] -- ^ @rewrite e@ (many)+ , lhsWithExpr :: [WithExpr] -- ^ @with e@ (many) } -- ^ original pattern, with-patterns, rewrite equations and with-expressions | Ellipsis Range [Pattern] [RewriteEqn] [WithExpr] -- ^ new with-patterns, rewrite equations and with-expressions- deriving (Typeable, Data)+ deriving (Typeable) type RewriteEqn = Expr type WithExpr = Expr +-- | Processed (scope-checked) intermediate form of the core @f ps@ of 'LHS'.+-- Corresponds to 'lhsOriginalPattern'.+data LHSCore+ = LHSHead { lhsDefName :: Name -- ^ @f@+ , lhsPats :: [NamedArg Pattern] -- ^ @ps@+ }+ | LHSProj { lhsDestructor :: QName -- ^ record projection identifier+ , lhsPatsLeft :: [NamedArg Pattern] -- ^ side patterns+ , lhsFocus :: NamedArg LHSCore -- ^ main branch+ , lhsPatsRight :: [NamedArg Pattern] -- ^ side patterns+ }+ deriving (Typeable)++{- TRASH+lhsCoreToPattern :: LHSCore -> Pattern+lhsCoreToPattern (LHSHead f args) = OpAppP (fuseRange f args) (unqualify f) args+lhsCoreToPattern (LHSProj d ps1 lhscore ps2) = OpAppP (fuseRange d ps) (unqualify) ps+ where p = lhsCoreToPattern lhscore+ ps = ps1 ++ p : ps2+-}+ data RHS = AbsurdRHS | RHS Expr- deriving (Typeable, Data)+ deriving (Typeable) data WhereClause = NoWhere | AnyWhere [Declaration] | SomeWhere Name [Declaration]- deriving (Typeable, Data)+ deriving (Typeable) -- | The things you are allowed to say when you shuffle names between name@@ -184,20 +204,21 @@ , renaming :: [Renaming] , publicOpen :: Bool -- ^ Only for @open@. Exports the opened names from the current module. }- deriving (Typeable, Data)+ deriving (Typeable) +-- | Default is directive is @private@ (use everything, but do not export). defaultImportDir :: ImportDirective defaultImportDir = ImportDirective noRange (Hiding []) [] False data UsingOrHiding = Hiding [ImportedName] | Using [ImportedName]- deriving (Typeable, Data)+ deriving (Typeable) -- | An imported name can be a module or a defined name data ImportedName = ImportedModule { importedName :: Name } | ImportedName { importedName :: Name }- deriving (Typeable, Data, Eq, Ord)+ deriving (Typeable, Eq, Ord) instance Show ImportedName where show (ImportedModule x) = "module " ++ show x@@ -211,7 +232,7 @@ -- ^ The range of the \"to\" keyword. Retained -- for highlighting purposes. }- deriving (Typeable, Data)+ deriving (Typeable) data AsName = AsName { asName :: Name -- ^ The \"as\" name.@@ -219,7 +240,7 @@ -- ^ The range of the \"as\" keyword. Retained -- for highlighting purposes. }- deriving (Typeable, Data, Show)+ deriving (Typeable, Show) {-------------------------------------------------------------------------- Declarations@@ -228,9 +249,8 @@ -- | Just type signatures. type TypeSignature = Declaration --- | A constructor or field declaration is just a type signature.+-- | A data constructor declaration is just a type signature. type Constructor = TypeSignature-type Field = TypeSignature {-| The representation type of a declaration. The comments indicate which type in the intended family the constructor targets.@@ -243,10 +263,11 @@ | DataSig !Range Induction Name [LamBinding] Expr -- ^ lone data signature in mutual block | Data !Range Induction Name [LamBinding] (Maybe Expr) [Constructor] | RecordSig !Range Name [LamBinding] Expr -- ^ lone record signature in mutual block- | Record !Range Name (Maybe Name) [LamBinding] (Maybe Expr) [Declaration]+ | Record !Range Name (Maybe Induction) (Maybe Name) [LamBinding] (Maybe Expr) [Declaration] -- ^ The optional name is a name for the record constructor. | Infix Fixity [Name] | Syntax Name Notation -- ^ notation declaration for a name+ | PatternSyn !Range Name [Name] Pattern | Mutual !Range [Declaration] | Abstract !Range [Declaration] | Private !Range [Declaration]@@ -257,14 +278,14 @@ | ModuleMacro !Range Name ModuleApplication OpenShortHand ImportDirective | Module !Range QName [TypedBindings] [Declaration] | Pragma Pragma- deriving (Typeable, Data)+ deriving (Typeable) data ModuleApplication = SectionApp Range [TypedBindings] Expr | RecordModuleIFS Range QName- deriving (Typeable, Data)+ deriving (Typeable) data OpenShortHand = DoOpen | DontOpen- deriving (Typeable, Data, Show)+ deriving (Typeable, Show) -- Pragmas ---------------------------------------------------------------- @@ -281,7 +302,8 @@ -- module name. | ImpossiblePragma !Range | EtaPragma !Range QName- deriving (Typeable, Data)+ | NoTerminationCheckPragma !Range+ deriving (Typeable) --------------------------------------------------------------------------- @@ -312,8 +334,9 @@ vApp (AppView e es) arg = AppView e (es ++ [arg]) appView (RawApp _ (e:es)) = AppView e $ map arg es where- arg (HiddenArg _ e) = Arg Hidden Relevant e- arg e = Arg NotHidden Relevant (unnamed e)+ arg (HiddenArg _ e) = Arg Hidden Relevant e+ arg (InstanceArg _ e) = Arg Instance Relevant e+ arg e = Arg NotHidden Relevant (unnamed e) appView e = AppView e [] {--------------------------------------------------------------------------@@ -328,7 +351,7 @@ AppP p p' -> patternHead p RawAppP _ [] -> __IMPOSSIBLE__ RawAppP _ (p:_) -> patternHead p- OpAppP _ name ps -> return $ name+ OpAppP _ name ps -> return $ unqualify name HiddenP _ (namedPat) -> patternHead (namedThing namedPat) ParenP _ p -> patternHead p WildP _ -> Nothing@@ -345,9 +368,9 @@ patternNames p = case p of IdentP x -> [unqualify x]- AppP p p' -> concatMap patternNames [p, namedThing $ unArg p']+ AppP p p' -> concatMap patternNames [p, namedArg p'] RawAppP _ ps -> concatMap patternNames ps- OpAppP _ name ps -> name : concatMap patternNames ps+ OpAppP _ name ps -> unqualify name : concatMap patternNames ps HiddenP _ (namedPat) -> patternNames (namedThing namedPat) ParenP _ p -> patternNames p WildP _ -> []@@ -435,7 +458,7 @@ getRange (DataSig r _ _ _ _) = r getRange (Data r _ _ _ _ _) = r getRange (RecordSig r _ _ _) = r- getRange (Record r _ _ _ _ _) = r+ getRange (Record r _ _ _ _ _ _) = r getRange (Mutual r _) = r getRange (Abstract r _) = r getRange (Open r _ _) = r@@ -447,12 +470,17 @@ getRange (Module r _ _ _) = r getRange (Infix f _) = getRange f getRange (Syntax n _) = getRange n+ getRange (PatternSyn r _ _ _) = r getRange (Pragma p) = getRange p instance HasRange LHS where getRange (LHS p ps eqns ws) = fuseRange p (fuseRange ps (eqns ++ ws)) getRange (Ellipsis r _ _ _) = r +instance HasRange LHSCore where+ getRange (LHSHead f ps) = fuseRange f ps+ getRange (LHSProj d ps1 lhscore ps2) = d `fuseRange` ps1 `fuseRange` lhscore `fuseRange` ps2+ instance HasRange RHS where getRange AbsurdRHS = noRange getRange (RHS e) = getRange e@@ -469,6 +497,7 @@ getRange (ImportPragma r _) = r getRange (ImpossiblePragma r) = r getRange (EtaPragma r _) = r+ getRange (NoTerminationCheckPragma r) = r instance HasRange UsingOrHiding where getRange (Using xs) = getRange xs@@ -500,3 +529,139 @@ getRange (HiddenP r _) = r getRange (InstanceP r _) = r getRange (DotP r _) = r++instance KillRange AsName where+ killRange (AsName n _) = killRange1 (flip AsName noRange) n++instance KillRange BoundName where+ killRange (BName n f) = killRange2 BName n f++instance KillRange Declaration where+ killRange (TypeSig r n e) = killRange2 (TypeSig r) n e+ killRange (Field n a) = killRange2 Field n a+ killRange (FunClause l r w) = killRange3 FunClause l r w+ killRange (DataSig _ i n l e) = killRange4 (DataSig noRange) i n l e+ killRange (Data _ i n l e c) = killRange4 (Data noRange i) n l e c+ killRange (RecordSig _ n l e) = killRange3 (RecordSig noRange) n l e+ killRange (Record _ n mi mn k e d)= killRange6 (Record noRange) n mi mn k e d+ killRange (Infix f n) = killRange2 Infix f n+ killRange (Syntax n no) = killRange1 (\n -> Syntax n no) n+ killRange (PatternSyn _ n ns p) = killRange3 (PatternSyn noRange) n ns p+ killRange (Mutual _ d) = killRange1 (Mutual noRange) d+ killRange (Abstract _ d) = killRange1 (Abstract noRange) d+ killRange (Private _ d) = killRange1 (Private noRange) d+ killRange (Postulate _ t) = killRange1 (Postulate noRange) t+ killRange (Primitive _ t) = killRange1 (Primitive noRange) t+ killRange (Open _ q i) = killRange2 (Open noRange) q i+ killRange (Import _ q a o i) = killRange3 (\q a -> Import noRange q a o) q a i+ killRange (ModuleMacro _ n m o i) = killRange3 (\n m -> ModuleMacro noRange n m o) n m i+ killRange (Module _ q t d) = killRange3 (Module noRange) q t d+ killRange (Pragma p) = killRange1 Pragma p++instance KillRange Expr where+ killRange (Ident q) = killRange1 Ident q+ killRange (Lit l) = killRange1 Lit l+ killRange (QuestionMark _ n) = QuestionMark noRange n+ killRange (Underscore _ n) = Underscore noRange n+ killRange (RawApp _ e) = killRange1 (RawApp noRange) e+ killRange (App _ e a) = killRange2 (App noRange) e a+ killRange (OpApp _ n o) = killRange2 (OpApp noRange) n o+ killRange (WithApp _ e es) = killRange2 (WithApp noRange) e es+ killRange (HiddenArg _ n) = killRange1 (HiddenArg noRange) n+ killRange (InstanceArg _ n) = killRange1 (InstanceArg noRange) n+ killRange (Lam _ l e) = killRange2 (Lam noRange) l e+ killRange (AbsurdLam _ h) = killRange1 (AbsurdLam noRange) h+ killRange (ExtendedLam _ lrw) = killRange1 (ExtendedLam noRange) lrw+ killRange (Fun _ e1 e2) = killRange2 (Fun noRange) e1 e2+ killRange (Pi t e) = killRange2 Pi t e+ killRange (Set _) = Set noRange+ killRange (Prop _) = Prop noRange+ killRange (SetN _ n) = SetN noRange n+ killRange (Rec _ ne) = killRange1 (Rec noRange) ne+ killRange (RecUpdate _ e ne) = killRange2 (RecUpdate noRange) e ne+ killRange (Let _ d e) = killRange2 (Let noRange) d e+ killRange (Paren _ e) = killRange1 (Paren noRange) e+ killRange (Absurd _) = Absurd noRange+ killRange (As _ n e) = killRange2 (As noRange) n e+ killRange (Dot _ e) = killRange1 (Dot noRange) e+ killRange (ETel t) = killRange1 ETel t+ killRange (QuoteGoal _ n e) = killRange2 (QuoteGoal noRange) n e+ killRange (Quote _) = Quote noRange+ killRange (QuoteTerm _) = QuoteTerm noRange+ killRange (Unquote _) = Unquote noRange+ killRange (DontCare e) = killRange1 DontCare e++instance KillRange ImportDirective where+ killRange (ImportDirective _ u r p) =+ killRange2 (\u r -> ImportDirective noRange u r p) u r++instance KillRange ImportedName where+ killRange (ImportedModule n) = killRange1 ImportedModule n+ killRange (ImportedName n) = killRange1 ImportedName n++instance KillRange LamBinding where+ killRange (DomainFree h r b) = killRange2 (\h -> DomainFree h r) h b+ killRange (DomainFull t) = killRange1 DomainFull t++instance KillRange LHS where+ killRange (LHS p ps r w) = killRange4 LHS p ps r w+ killRange (Ellipsis _ p r w) = killRange3 (Ellipsis noRange) p r w++instance KillRange ModuleApplication where+ killRange (SectionApp _ t e) = killRange2 (SectionApp noRange) t e+ killRange (RecordModuleIFS _ q) = killRange1 (RecordModuleIFS noRange) q++instance KillRange e => KillRange (OpApp e) where+ killRange (SyntaxBindingLambda _ l e) = killRange2 (SyntaxBindingLambda noRange) l e+ killRange (Ordinary e) = killRange1 Ordinary e++instance KillRange Pattern where+ killRange (IdentP q) = killRange1 IdentP q+ killRange (AppP p n) = killRange2 AppP p n+ killRange (RawAppP _ p) = killRange1 (RawAppP noRange) p+ killRange (OpAppP _ n p) = killRange2 (OpAppP noRange) n p+ killRange (HiddenP _ n) = killRange1 (HiddenP noRange) n+ killRange (InstanceP _ n) = killRange1 (InstanceP noRange) n+ killRange (ParenP _ p) = killRange1 (ParenP noRange) p+ killRange (WildP _) = WildP noRange+ killRange (AbsurdP _) = AbsurdP noRange+ killRange (AsP _ n p) = killRange2 (AsP noRange) n p+ killRange (DotP _ e) = killRange1 (DotP noRange) e+ killRange (LitP l) = killRange1 LitP l++instance KillRange Pragma where+ killRange (OptionsPragma _ s) = OptionsPragma noRange s+ killRange (BuiltinPragma _ s e) = killRange1 (BuiltinPragma noRange s) e+ killRange (CompiledDataPragma _ q s ss) = killRange1 (\q -> CompiledDataPragma noRange q s ss) q+ killRange (CompiledTypePragma _ q s) = killRange1 (\q -> CompiledTypePragma noRange q s) q+ killRange (CompiledPragma _ q s) = killRange1 (\q -> CompiledPragma noRange q s) q+ killRange (CompiledEpicPragma _ q s) = killRange1 (\q -> CompiledEpicPragma noRange q s) q+ killRange (CompiledJSPragma _ q s) = killRange1 (\q -> CompiledJSPragma noRange q s) q+ killRange (StaticPragma _ q) = killRange1 (StaticPragma noRange) q+ killRange (ImportPragma _ s) = ImportPragma noRange s+ killRange (ImpossiblePragma _) = ImpossiblePragma noRange+ killRange (EtaPragma _ q) = killRange1 (EtaPragma noRange) q+ killRange (NoTerminationCheckPragma _) = NoTerminationCheckPragma noRange++instance KillRange Renaming where+ killRange (Renaming i n _) = killRange2 (\i n -> Renaming i n noRange) i n++instance KillRange RHS where+ killRange AbsurdRHS = AbsurdRHS+ killRange (RHS e) = killRange1 RHS e++instance KillRange TypedBinding where+ killRange (TBind _ b e) = killRange2 (TBind noRange) b e+ killRange (TNoBind e) = killRange1 TNoBind e++instance KillRange TypedBindings where+ killRange (TypedBindings _ t) = killRange1 (TypedBindings noRange) t++instance KillRange UsingOrHiding where+ killRange (Hiding i) = killRange1 Hiding i+ killRange (Using i) = killRange1 Using i++instance KillRange WhereClause where+ killRange NoWhere = NoWhere+ killRange (AnyWhere d) = killRange1 AnyWhere d+ killRange (SomeWhere n d) = killRange2 SomeWhere n d
src/full/Agda/Syntax/Concrete/Definitions.hs view
@@ -7,18 +7,18 @@ , DeclarationException(..) , Nice, runNice , niceDeclarations- , notSoNiceDeclarations+ , notSoNiceDeclaration ) where import Control.Arrow ((***), (&&&)) import Control.Applicative-import Data.Generics (Typeable, Data)+import Data.Typeable (Typeable) import Data.Foldable hiding (concatMap, mapM_, notElem, elem, all) import qualified Data.Map as Map import Data.Map (Map) import Control.Monad.Error import Control.Monad.State-import Data.List+import Data.List as List import Data.Maybe import Data.Traversable (traverse) @@ -56,7 +56,7 @@ -- ^ Axioms and functions can be declared irrelevant. | NiceField Range Fixity' Access IsAbstract Name (Arg Expr) | PrimitiveFunction Range Fixity' Access IsAbstract Name Expr- | NiceMutual Range [NiceDeclaration]+ | NiceMutual Range TerminationCheck [NiceDeclaration] | NiceModule Range Access IsAbstract QName Telescope [Declaration] | NiceModuleMacro Range Access IsAbstract Name ModuleApplication OpenShortHand ImportDirective | NiceOpen Range QName ImportDirective@@ -64,12 +64,19 @@ | NicePragma Range Pragma | NiceRecSig Range Fixity' Access Name [LamBinding] Expr | NiceDataSig Range Fixity' Access Name [LamBinding] Expr- | FunSig Range Fixity' Access Relevance Name Expr- | FunDef Range [Declaration] Fixity' IsAbstract Name [Clause] -- ^ block of function clauses (we have seen the type signature before)+ | NiceFunClause Range Access IsAbstract TerminationCheck Declaration+ -- ^ a uncategorized function clause, could be a function clause+ -- without type signature or a pattern lhs (e.g. for irrefutable let)x+ | FunSig Range Fixity' Access Relevance TerminationCheck Name Expr+ | FunDef Range [Declaration] Fixity' IsAbstract TerminationCheck Name [Clause] -- ^ block of function clauses (we have seen the type signature before) | DataDef Range Fixity' IsAbstract Name [LamBinding] [NiceConstructor]- | RecDef Range Fixity' IsAbstract Name (Maybe (ThingWithFixity Name)) [LamBinding] [NiceDeclaration]- deriving (Typeable, Data, Show)+ | RecDef Range Fixity' IsAbstract Name (Maybe Induction) (Maybe (ThingWithFixity Name)) [LamBinding] [NiceDeclaration]+ | NicePatternSyn Range Fixity' Name [Name] Pattern+ deriving (Typeable, Show) +-- | Termination check? (Default = True).+type TerminationCheck = Bool+ -- | Only 'Axiom's. type NiceConstructor = NiceTypeSignature @@ -79,15 +86,17 @@ -- | One clause in a function definition. There is no guarantee that the 'LHS' -- actually declares the 'Name'. We will have to check that later. data Clause = Clause Name LHS RHS WhereClause [Clause]- deriving (Typeable, Data, Show)+ deriving (Typeable, Show) -- | The exception type. data DeclarationException = MultipleFixityDecls [(Name, [Fixity'])] | MissingDefinition Name | MissingWithClauses Name- | MissingTypeSignature LHS+ | MissingTypeSignature LHS -- Andreas 2012-06-02: currently unused, remove after a while -- Fredrik 2012-09-20: now used, can we keep it? | MissingDataSignature Name+ | WrongDefinition Name DataRecOrFun DataRecOrFun+ | WrongParameters Name | NotAllowedInMutual NiceDeclaration | UnknownNamesInFixityDecl [Name] | Codata Range@@ -95,6 +104,7 @@ | UselessPrivate Range | UselessAbstract Range | AmbiguousFunClauses LHS [Name] -- ^ in a mutual block, a clause could belong to any of the @[Name]@ type signatures+ | InvalidNoTerminationCheckPragma Range deriving (Typeable) instance HasRange DeclarationException where@@ -103,6 +113,8 @@ getRange (MissingWithClauses x) = getRange x getRange (MissingTypeSignature x) = getRange x getRange (MissingDataSignature x) = getRange x+ getRange (WrongDefinition x k k') = getRange x+ getRange (WrongParameters x) = getRange x getRange (AmbiguousFunClauses lhs xs) = getRange lhs getRange (NotAllowedInMutual x) = getRange x getRange (UnknownNamesInFixityDecl xs) = getRange . head $ xs@@ -110,23 +122,26 @@ getRange (DeclarationPanic _) = noRange getRange (UselessPrivate r) = r getRange (UselessAbstract r) = r+ getRange (InvalidNoTerminationCheckPragma r) = r instance HasRange NiceDeclaration where getRange (Axiom r _ _ _ _ _) = r getRange (NiceField r _ _ _ _ _) = r- getRange (NiceMutual r _) = r+ getRange (NiceMutual r _ _) = r getRange (NiceModule r _ _ _ _ _) = r getRange (NiceModuleMacro r _ _ _ _ _ _) = r getRange (NiceOpen r _ _) = r getRange (NiceImport r _ _ _ _) = r getRange (NicePragma r _) = r getRange (PrimitiveFunction r _ _ _ _ _) = r- getRange (FunSig r _ _ _ _ _) = r- getRange (FunDef r _ _ _ _ _) = r+ getRange (FunSig r _ _ _ _ _ _) = r+ getRange (FunDef r _ _ _ _ _ _) = r getRange (DataDef r _ _ _ _ _) = r- getRange (RecDef r _ _ _ _ _ _) = r+ getRange (RecDef r _ _ _ _ _ _ _) = r getRange (NiceRecSig r _ _ _ _ _) = r getRange (NiceDataSig r _ _ _ _ _) = r+ getRange (NicePatternSyn r _ _ _ _) = r+ getRange (NiceFunClause r _ _ _ _) = r instance Error DeclarationException where noMsg = strMsg ""@@ -147,6 +162,11 @@ pwords "Missing type signature for left hand side" ++ [pretty x] show (MissingDataSignature x) = show $ fsep $ pwords "Missing type signature for " ++ [pretty x]+ show (WrongDefinition x k k') = show $ fsep $ pretty x :+ pwords ("has been declared as a " ++ show k +++ ", but is being defined as a " ++ show k')+ show (WrongParameters x) = show $ fsep $+ pwords "List of parameters does not match previous signature for" ++ [pretty x] show (AmbiguousFunClauses lhs xs) = show $ fsep $ pwords "More than one matching type signature for left hand side" ++ [pretty lhs] ++ pwords "it could belong to any of:" ++ map pretty xs@@ -156,6 +176,8 @@ pwords "Using private here has no effect. Move it to the type signatures to make the definitions private." show (UselessAbstract _) = show $ fsep $ pwords "Using abstract here has no effect. Move it to the definitions to make them abstract."+ show (InvalidNoTerminationCheckPragma _) = show $ fsep $+ pwords "The NO_TERMINATION_CHECK pragma can only preceed a mutual block or a function definition." show (NotAllowedInMutual nd) = show $ fsep $ [text $ decl nd] ++ pwords "are not allowed in mutual blocks" where@@ -168,6 +190,7 @@ decl (NiceImport{}) = "Import statements" decl (NicePragma{}) = "Pragmas" decl (PrimitiveFunction{}) = "Primitive declarations"+ decl (NicePatternSyn{}) = "Pattern synonyms" decl _ = __IMPOSSIBLE__ show (Codata _) = "The codata construction has been removed. " ++@@ -183,11 +206,37 @@ | NotInMutual -- ^ we are nicifying decls not in a mutual block deriving (Eq, Show) -data DataRecOrFun = DataName | RecName | FunName+-- | The kind of the forward declaration, remembering the parameters.+data DataRecOrFun+ = DataName Params -- ^ name of a data with parameters+ | RecName Params -- ^ name of a record with parameters+ | FunName TerminationCheck -- ^ name of a function deriving (Eq, Ord) +type Params = [Hiding]++instance Show DataRecOrFun where+ show (DataName n) = "data type" -- "with " ++ show n ++ " visible parameters"+ show (RecName n) = "record type" -- "with " ++ show n ++ " visible parameters"+ show (FunName{}) = "function"++isFunName :: DataRecOrFun -> Bool+isFunName (FunName{}) = True+isFunName _ = False++sameKind :: DataRecOrFun -> DataRecOrFun -> Bool+sameKind DataName{} DataName{} = True+sameKind RecName{} RecName{} = True+sameKind FunName{} FunName{} = True+sameKind _ _ = False++terminationCheck :: DataRecOrFun -> Bool+terminationCheck (FunName tc) = tc+terminationCheck _ = True++type LoneSigs = [(DataRecOrFun, Name)] data NiceEnv = NiceEnv- { loneSigs :: [(DataRecOrFun, Name)] -- ^ lone type signatures that wait for their fun.clauses+ { loneSigs :: LoneSigs -- ^ lone type signatures that wait for their definition , fixs :: Map Name Fixity' } @@ -199,24 +248,28 @@ type Nice = StateT NiceEnv (Either DeclarationException) +{- Andreas, 2012-04-30 MOVED to Utils.Monad localState :: Nice a -> Nice a localState m = bracket get put (const m)+-} addLoneSig :: DataRecOrFun -> Name -> Nice () addLoneSig k x = modify $ \ niceEnv -> niceEnv { loneSigs = (k, x) : loneSigs niceEnv } -removeLoneSig :: DataRecOrFun -> Name -> Nice ()-removeLoneSig k x = modify $ \ niceEnv -> niceEnv { loneSigs = delete (k, x) $ loneSigs niceEnv }+removeLoneSig :: Name -> Nice ()+removeLoneSig x = modify $ \ niceEnv ->+ niceEnv { loneSigs = filter (\ (k', x') -> x /= x') $ loneSigs niceEnv } -hasSig :: DataRecOrFun -> Name -> Nice Bool-hasSig k x = gets $ elem (k, x) . loneSigs+-- | Search for forward type signature that+getSig :: Name -> Nice (Maybe DataRecOrFun)+getSig n = gets $ fmap fst . List.find (\ (k, x) -> x == n) . loneSigs noLoneSigs :: Nice Bool noLoneSigs = gets $ null . loneSigs -checkLoneSigs :: Nice ()-checkLoneSigs = do- xs <- gets loneSigs+-- | Ensure that all forward declarations have been given a definition.+checkLoneSigs :: LoneSigs -> Nice ()+checkLoneSigs xs = case xs of [] -> return () (_, x):_ -> throwError $ MissingDefinition x@@ -229,14 +282,39 @@ data DeclKind = LoneSig DataRecOrFun Name | LoneDef DataRecOrFun Name | OtherDecl -declKind (FunSig _ _ _ _ x _) = LoneSig FunName x-declKind (NiceRecSig _ _ _ x _ _) = LoneSig RecName x-declKind (NiceDataSig _ _ _ x _ _) = LoneSig DataName x-declKind (FunDef _ _ _ _ x _) = LoneDef FunName x-declKind (DataDef _ _ _ x _ _) = LoneDef DataName x-declKind (RecDef _ _ _ x _ _ _) = LoneDef RecName x-declKind _ = OtherDecl+declKind (FunSig _ _ _ _ tc x _) = LoneSig (FunName tc) x+declKind (NiceRecSig _ _ _ x pars _) = LoneSig (RecName $ parameters pars) x+declKind (NiceDataSig _ _ _ x pars _) = LoneSig (DataName $ parameters pars) x+declKind (FunDef _ _ _ _ tc x _) = LoneDef (FunName tc) x+declKind (DataDef _ _ _ x pars _) = LoneDef (DataName $ parameters pars) x+declKind (RecDef _ _ _ x _ _ pars _) = LoneDef (RecName $ parameters pars) x+declKind _ = OtherDecl +-- | Compute visible parameters of a data or record signature or definition.+parameters :: [LamBinding] -> Params+parameters = List.concat . List.map numP where+ numP (DomainFree h _ _) = [h]+ numP (DomainFull (TypedBindings _ (Arg h _ (TBind _ xs _)))) = List.replicate (length xs) h+ numP (DomainFull (TypedBindings _ (Arg _ _ (TNoBind{})))) = __IMPOSSIBLE__++{- OLD:++-- | Compute number of visible parameters of a data or record signature or definition.+numberOfPars :: [LamBinding] -> Params+numberOfPars = List.sum . List.map numP where+ numP (DomainFree NotHidden _ _) = 1+ numP (DomainFull (TypedBindings _ (Arg NotHidden _ (TBind _ xs _)))) = length xs+ numP (DomainFull (TypedBindings _ (Arg _ _ (TNoBind{})))) = __IMPOSSIBLE__+ numP _ = 0 -- hidden / instance argument+-- | Compute number of parameters of a data or record signature or definition.+numberOfPars :: [LamBinding] -> Int+numberOfPars = List.sum . List.map numP where+ numP (DomainFree{}) = 1+ numP (DomainFull (TypedBindings _ arg)) = nP $ unArg arg where+ nP (TBind _ xs _) = length xs+ nP (TNoBind _) = __IMPOSSIBLE__+-}+ niceDeclarations :: [Declaration] -> Nice [NiceDeclaration] niceDeclarations ds = do fixs <- fixities ds@@ -244,7 +322,7 @@ [] -> localState $ do put $ initNiceEnv { fixs = fixs } ds <- nice ds- checkLoneSigs+ checkLoneSigs =<< gets loneSigs modify $ \s -> s { loneSigs = [] } inferMutualBlocks ds xs -> throwError $ UnknownNamesInFixityDecl xs@@ -260,9 +338,10 @@ DataSig _ _ x _ _ -> [x] Data _ _ x _ _ cs -> x : concatMap declaredNames cs RecordSig _ x _ _ -> [x]- Record _ x c _ _ _ -> x : foldMap (:[]) c+ Record _ x _ c _ _ _ -> x : foldMap (:[]) c Infix _ _ -> [] Syntax _ _ -> []+ PatternSyn _ x _ _ -> [x] Mutual _ ds -> concatMap declaredNames ds Abstract _ ds -> concatMap declaredNames ds Private _ ds -> concatMap declaredNames ds@@ -282,76 +361,65 @@ LoneDef _ x -> __IMPOSSIBLE__ LoneSig k x -> do addLoneSig k x- (ds0, ds1) <- untilAllDefined ds- (NiceMutual (getRange (d : ds0)) (d : ds0) :) <$> inferMutualBlocks ds1+ (tc, (ds0, ds1)) <- untilAllDefined (terminationCheck k) ds++ -- Record modules are, for performance reasons, not always+ -- placed in mutual blocks.+ let prefix = case (d, ds0) of+ (NiceRecSig{}, [r@RecDef{}]) -> ([d, r] ++)+ _ ->+ (NiceMutual (getRange (d : ds0)) tc (d : ds0) :)+ prefix <$> inferMutualBlocks ds1 where- untilAllDefined ds = do+ untilAllDefined :: TerminationCheck+ -> [NiceDeclaration]+ -> Nice (TerminationCheck, ([NiceDeclaration], [NiceDeclaration]))+ untilAllDefined tc ds = do done <- noLoneSigs- if done then return ([], ds) else+ if done then return (tc, ([], ds)) else case ds of- [] -> __IMPOSSIBLE__ <$ checkLoneSigs+ [] -> __IMPOSSIBLE__ <$ (checkLoneSigs =<< gets loneSigs) d : ds -> case declKind d of- LoneSig k x -> addLoneSig k x >> cons d (untilAllDefined ds)- LoneDef k x -> removeLoneSig k x >> cons d (untilAllDefined ds)- OtherDecl -> cons d (untilAllDefined ds)+ LoneSig k x -> addLoneSig k x >> cons d (untilAllDefined (tc && terminationCheck k) ds)+ LoneDef k x -> removeLoneSig x >> cons d (untilAllDefined (tc && terminationCheck k) ds)+ OtherDecl -> cons d (untilAllDefined tc ds) where- cons d = fmap ((d :) *** id)+ cons d = fmap (id *** (d :) *** id) nice :: [Declaration] -> Nice [NiceDeclaration] nice [] = return []+ nice (Pragma (NoTerminationCheckPragma r) : ds@(Mutual{} : _)) = do+ ds <- nice ds+ case ds of+ NiceMutual r _ ds' : ds -> return $ NiceMutual r False ds' : ds+ _ -> __IMPOSSIBLE__+ nice (Pragma (NoTerminationCheckPragma r) : d@TypeSig{} : ds) =+ niceTypeSig False d ds+ nice (Pragma (NoTerminationCheckPragma r) : d@FunClause{} : ds) =+ niceFunClause False d ds nice (d:ds) = do case d of- TypeSig rel x t -> do- fx <- getFixity x- -- register x as lone type signature, to recognize clauses later- addLoneSig FunName x- ds <- nice ds- return $ FunSig (getRange d) fx PublicAccess rel x t : ds- cl@(FunClause lhs _ _) -> do- xs <- gets $ map snd . filter ((== FunName) . fst) . loneSigs- -- for each type signature 'x' waiting for clauses, we try- -- if we have some clauses for 'x'- fixs <- gets fixs- case filter (\ (x,(fits,rest)) -> not $ null fits) $- map (\ x -> (x, span (couldBeFunClauseOf (Map.lookup x fixs) x) $ d : ds)) xs of- -- case: clauses match none of the sigs- -- treat it as a function clause without a type signature- [] -> case lhs of- LHS p [] _ _ | IdentP (QName x) <- removeSingletonRawAppP p -> do- ds <- nice ds- d <- mkFunDef Relevant x Nothing [cl] -- fun def without type signature is relevant- return $ d ++ ds- _ -> throwError $ MissingTypeSignature lhs- -- case: clauses match exactly one of the sigs- [(x,(fits,rest))] -> do- removeLoneSig FunName x- cs <- mkClauses x $ expandEllipsis fits- ds1 <- nice rest- fx <- getFixity x- d <- return $ FunDef (getRange fits) fits fx ConcreteDef x cs- return $ d : ds1- -- case: clauses match more than one sigs (ambiguity)- l -> throwError $ AmbiguousFunClauses lhs (map fst l) -- "ambiguous function clause; cannot assign it uniquely to one type signature"-+ TypeSig{} -> niceTypeSig True d ds+ FunClause{} -> niceFunClause True d ds Field x t -> (++) <$> niceAxioms [ d ] <*> nice ds DataSig r CoInductive x tel t -> throwError (Codata r) Data r CoInductive x tel t cs -> throwError (Codata r) DataSig r Inductive x tel t -> do- addLoneSig DataName x+ addLoneSig (DataName $ parameters tel) x (++) <$> dataOrRec DataDef NiceDataSig niceAxioms r x tel (Just t) Nothing <*> nice ds Data r Inductive x tel t cs -> do- t <- defaultTypeSig DataName x t+ t <- defaultTypeSig (DataName $ parameters tel) x t (++) <$> dataOrRec DataDef NiceDataSig niceAxioms r x tel t (Just cs) <*> nice ds RecordSig r x tel t -> do- addLoneSig RecName x+ addLoneSig (RecName $ parameters tel) x fx <- getFixity x (NiceRecSig r fx PublicAccess x tel t :) <$> nice ds- Record r x c tel t cs -> do- t <- defaultTypeSig RecName x t+ Record r x i c tel t cs -> do+ t <- defaultTypeSig (RecName $ parameters tel) x t c <- traverse (\c -> ThingWithFixity c <$> getFixity c) c- (++) <$> dataOrRec (\x1 x2 x3 x4 -> RecDef x1 x2 x3 x4 c) NiceRecSig+ (++) <$> dataOrRec (\x1 x2 x3 x4 -> RecDef x1 x2 x3 x4 i c) NiceRecSig niceDeclarations r x tel t (Just cs) <*> nice ds Mutual r ds' ->@@ -376,18 +444,77 @@ Infix _ _ -> nice ds Syntax _ _ -> nice ds+ PatternSyn r n as p -> do+ fx <- getFixity n+ (NicePatternSyn r fx n as p :) <$> nice ds Open r x is -> (NiceOpen r x is :) <$> nice ds Import r x as op is -> (NiceImport r x as op is :) <$> nice ds + Pragma (NoTerminationCheckPragma r) ->+ throwError $ InvalidNoTerminationCheckPragma r Pragma p -> (NicePragma (getRange p) p :) <$> nice ds + niceFunClause :: TerminationCheck -> Declaration -> [Declaration] -> Nice [NiceDeclaration]+ niceFunClause termCheck d@(FunClause lhs _ _) ds = do+ xs <- gets $ map snd . filter (isFunName . fst) . loneSigs+ -- for each type signature 'x' waiting for clauses, we try+ -- if we have some clauses for 'x'+ fixs <- gets fixs+{- OLD CODE, a bit dense+ case filter (\ (x,(fits,rest)) -> not $ null fits) $+ map (\ x -> (x, span (couldBeFunClauseOf (Map.lookup x fixs) x) $ d : ds)) xs of+-}+ case [ (x, (fits, rest))+ | x <- xs+ , let (fits, rest) =+ span (couldBeFunClauseOf (Map.lookup x fixs) x) (d : ds)+ , not (null fits)+ ] of+ -- case: clauses match none of the sigs+ -- then the lhs can only be a single identifier+ -- treat it as a function clause without a type signature+ [] -> case lhs of+ LHS p [] _ _ | IdentP (QName x) <- removeSingletonRawAppP p -> do+ ds <- nice ds+ d <- mkFunDef Relevant termCheck x Nothing [d] -- fun def without type signature is relevant+ return $ d ++ ds+ _ -> do+ ds <- nice ds+ return $ NiceFunClause (getRange d) PublicAccess ConcreteDef termCheck d : ds+-- OLD: _ -> throwError $ MissingTypeSignature lhs+-- error now raised in ConcreteToAbstract+ -- case: clauses match exactly one of the sigs+ [(x,(fits,rest))] -> do+ removeLoneSig x+ cs <- mkClauses x $ expandEllipsis fits+ ds1 <- nice rest+ fx <- getFixity x+ d <- return $ FunDef (getRange fits) fits fx ConcreteDef termCheck x cs+ return $ d : ds1+ -- case: clauses match more than one sigs (ambiguity)+ l -> throwError $ AmbiguousFunClauses lhs (map fst l) -- "ambiguous function clause; cannot assign it uniquely to one type signature"+ niceFunClause _ _ _ = __IMPOSSIBLE__++ niceTypeSig :: TerminationCheck -> Declaration -> [Declaration] -> Nice [NiceDeclaration]+ niceTypeSig termCheck d@(TypeSig rel x t) ds = do+ fx <- getFixity x+ -- register x as lone type signature, to recognize clauses later+ addLoneSig (FunName termCheck) x+ ds <- nice ds+ return $ FunSig (getRange d) fx PublicAccess rel termCheck x t : ds+ niceTypeSig _ _ _ = __IMPOSSIBLE__+ -- We could add a default type signature here, but at the moment we can't -- infer the type of a record or datatype, so better to just fail here.+ defaultTypeSig :: DataRecOrFun -> Name -> Maybe Expr -> Nice (Maybe Expr) defaultTypeSig k x t@Just{} = return t- defaultTypeSig k x Nothing =- ifM (hasSig k x)- (Nothing <$ removeLoneSig k x)- (throwError $ MissingDataSignature x)+ defaultTypeSig k x Nothing = do+ mk <- getSig x+ case mk of+ Nothing -> throwError $ MissingDataSignature x+ Just k' | k == k' -> Nothing <$ removeLoneSig x+ | sameKind k k' -> throwError $ WrongParameters x+ | otherwise -> throwError $ WrongDefinition x k' k dataOrRec mkDef mkSig niceD r x tel mt mcs = do mds <- traverse niceD mcs@@ -420,11 +547,11 @@ toPrim _ = __IMPOSSIBLE__ -- Create a function definition.- mkFunDef rel x mt ds0 = do+ mkFunDef rel termCheck x mt ds0 = do cs <- mkClauses x $ expandEllipsis ds0 f <- getFixity x- return [ FunSig (fuseRange x t) f PublicAccess rel x t- , FunDef (getRange ds0) ds0 f ConcreteDef x cs ]+ return [ FunSig (fuseRange x t) f PublicAccess rel termCheck x t+ , FunDef (getRange ds0) ds0 f ConcreteDef termCheck x cs ] where t = case mt of Just t -> t@@ -512,7 +639,7 @@ isFunClauseOf x (FunClause (LHS p _ _ _) _ _) = -- p is the whole left hand side, excluding "with" patterns and clauses case removeSingletonRawAppP p of- IdentP (QName q) -> x == q+ IdentP (QName q) -> x == q -- lhs is just an identifier _ -> True -- more complicated lhss must come with type signatures, so we just assume -- it's part of the current definition@@ -526,22 +653,23 @@ mkOldMutual :: Range -> [NiceDeclaration] -> Nice NiceDeclaration mkOldMutual r ds = do -- Check that there aren't any missing definitions- case filter (`notElem` defNames) sigNames of- [] -> return ()- (_, x):_ -> throwError $ MissingDefinition x+ checkLoneSigs loneNames -- Check that there are no declarations that aren't allowed in old style mutual blocks case [ d | (d, OtherDecl) <- zip ds $ map declKind ds ] of [] -> return ()+ (NiceFunClause _ _ _ _ (FunClause lhs _ _)):_ -> throwError $ MissingTypeSignature lhs d:_ -> throwError $ NotAllowedInMutual d- return $ NiceMutual r $ sigs ++ other+ return $ NiceMutual r True $ sigs ++ other -- termCheck is adjusted later where -- Pull type signatures to the top (sigs, other) = partition isTypeSig ds isTypeSig d | LoneSig{} <- declKind d = True isTypeSig _ = False - sigNames = [ (k, x) | LoneSig k x <- map declKind ds ]- defNames = [ (k, x) | LoneDef k x <- map declKind ds ]+ sigNames = [ (k, x) | LoneSig k x <- map declKind ds ]+ defNames = [ (k, x) | LoneDef k x <- map declKind ds ]+ -- compute the set difference with equality just on names+ loneNames = filter (\ (_, x) -> not (List.any (\ (_, x') -> x == x') defNames)) sigNames abstractBlock _ [] = return [] abstractBlock r ds@@ -572,11 +700,12 @@ case d of NiceField r f a _ x e -> NiceField r f a AbstractDef x e PrimitiveFunction r f a _ x e -> PrimitiveFunction r f a AbstractDef x e- NiceMutual r ds -> NiceMutual r (map mkAbstract ds)+ NiceMutual r termCheck ds -> NiceMutual r termCheck (map mkAbstract ds) NiceModuleMacro r a _ x ma op is -> NiceModuleMacro r a AbstractDef x ma op is- FunDef r ds f _ x cs -> FunDef r ds f AbstractDef x (map mkAbstractClause cs)+ FunDef r ds f _ tc x cs -> FunDef r ds f AbstractDef tc x (map mkAbstractClause cs) DataDef r f _ x ps cs -> DataDef r f AbstractDef x ps $ map mkAbstract cs- RecDef r f _ x c ps cs -> RecDef r f AbstractDef x c ps $ map mkAbstract cs+ RecDef r f _ x i c ps cs -> RecDef r f AbstractDef x i c ps $ map mkAbstract cs+ NiceFunClause r a _ termCheck d -> NiceFunClause r a AbstractDef termCheck d NiceModule{} -> d Axiom{} -> d NicePragma{} -> d@@ -585,6 +714,7 @@ FunSig{} -> d NiceRecSig{} -> d NiceDataSig{} -> d+ NicePatternSyn{} -> d mkAbstractClause (Clause x lhs rhs wh with) = Clause x lhs rhs (mkAbstractWhere wh) (map mkAbstractClause with)@@ -599,18 +729,20 @@ Axiom r f _ rel x e -> Axiom r f PrivateAccess rel x e NiceField r f _ a x e -> NiceField r f PrivateAccess a x e PrimitiveFunction r f _ a x e -> PrimitiveFunction r f PrivateAccess a x e- NiceMutual r ds -> NiceMutual r (map mkPrivate ds)+ NiceMutual r termCheck ds -> NiceMutual r termCheck (map mkPrivate ds) NiceModule r _ a x tel ds -> NiceModule r PrivateAccess a x tel ds NiceModuleMacro r _ a x ma op is -> NiceModuleMacro r PrivateAccess a x ma op is- FunSig r f _ rel x e -> FunSig r f PrivateAccess rel x e- NiceRecSig r f _ x ls t -> NiceRecSig r f PrivateAccess x ls t- NiceDataSig r f _ x ls t -> NiceDataSig r f PrivateAccess x ls t+ FunSig r f _ rel tc x e -> FunSig r f PrivateAccess rel tc x e+ NiceRecSig r f _ x ls t -> NiceRecSig r f PrivateAccess x ls t+ NiceDataSig r f _ x ls t -> NiceDataSig r f PrivateAccess x ls t+ NiceFunClause r _ a termCheck d -> NiceFunClause r PrivateAccess a termCheck d NicePragma _ _ -> d NiceOpen _ _ _ -> d NiceImport _ _ _ _ _ -> d FunDef{} -> d DataDef{} -> d RecDef{} -> d+ NicePatternSyn _ _ _ _ _ -> d mkPrivateClause (Clause x lhs rhs wh with) = Clause x lhs rhs (mkPrivateWhere wh) (map mkPrivateClause with)@@ -652,6 +784,36 @@ _ -> fixities ds fixities [] = return $ Map.empty ++-- Andreas, 2012-04-07+-- The following function is only used twice, for building a Let, and for+-- printing an error message.+notSoNiceDeclaration :: NiceDeclaration -> Declaration+notSoNiceDeclaration d =+ case d of+ Axiom _ _ _ rel x e -> TypeSig rel x e+ NiceField _ _ _ _ x argt -> Field x argt+ PrimitiveFunction r _ _ _ x e -> Primitive r [TypeSig Relevant x e]+ NiceMutual r _ ds -> Mutual r $ map notSoNiceDeclaration ds+ NiceModule r _ _ x tel ds -> Module r x tel ds+ NiceModuleMacro r _ _ x ma o dir -> ModuleMacro r x ma o dir+ NiceOpen r x dir -> Open r x dir+ NiceImport r x as o dir -> Import r x as o dir+ NicePragma _ p -> Pragma p+ NiceRecSig r _ _ x bs e -> RecordSig r x bs e+ NiceDataSig r _ _ x bs e -> DataSig r Inductive x bs e+ NiceFunClause _ _ _ _ d -> d+ FunSig _ _ _ rel tc x e -> TypeSig rel x e+ FunDef r [d] _ _ _ _ _ -> d+ FunDef r ds _ _ _ _ _ -> Mutual r ds -- Andreas, 2012-04-07 Hack!+ DataDef r _ _ x bs cs -> Data r Inductive x bs Nothing $ map notSoNiceDeclaration cs+ RecDef r _ _ x i c bs ds -> Record r x i (unThing <$> c) bs Nothing $ map notSoNiceDeclaration ds+ where unThing (ThingWithFixity c _) = c+ NicePatternSyn r _ n as p -> PatternSyn r n as p++{-+-- Andreas, 2012-03-08 the following function is only used twice,+-- both just on a single declaration. notSoNiceDeclarations :: [NiceDeclaration] -> [Declaration] notSoNiceDeclarations = concatMap notNice where@@ -659,7 +821,7 @@ Axiom _ _ _ rel x e -> [TypeSig rel x e] NiceField _ _ _ _ x argt -> [Field x argt] PrimitiveFunction r _ _ _ x e -> [Primitive r [TypeSig Relevant x e]]- NiceMutual _ ds -> concatMap notNice ds+ NiceMutual _ _ ds -> concatMap notNice ds NiceModule r _ _ x tel ds -> [Module r x tel ds] NiceModuleMacro r _ _ x ma o dir -> [ModuleMacro r x ma o dir] NiceOpen r x dir -> [Open r x dir]@@ -667,8 +829,10 @@ NicePragma _ p -> [Pragma p] NiceRecSig r _ _ x bs e -> [RecordSig r x bs e] NiceDataSig r _ _ x bs e -> [DataSig r Inductive x bs e]- FunSig _ _ _ rel x e -> [TypeSig rel x e]- FunDef _ ds _ _ _ _ -> ds+ FunSig _ _ _ rel tc x e -> [TypeSig rel x e]+ FunDef _ ds _ _ _ _ _ -> ds DataDef r _ _ x bs cs -> [Data r Inductive x bs Nothing $ concatMap notNice cs] RecDef r _ _ x c bs ds -> [Record r x (unThing <$> c) bs Nothing $ concatMap notNice ds] where unThing (ThingWithFixity c _) = c+ NicePatternSyn r _ n as p -> [PatternSyn r n as p]+-}
src/full/Agda/Syntax/Concrete/Name.hs view
@@ -9,7 +9,7 @@ import Data.List import Data.Maybe-import Data.Generics (Typeable, Data)+import Data.Typeable (Typeable) import System.FilePath @@ -33,10 +33,10 @@ -} data Name = Name !Range [NamePart] | NoName !Range NameId- deriving (Typeable, Data)+ deriving (Typeable) data NamePart = Hole | Id String- deriving (Typeable, Data)+ deriving (Typeable) -- | @noName_ = 'noName' 'noRange'@ noName_ :: Name@@ -124,7 +124,7 @@ -- lookup table for namespace names). data QName = Qual Name QName | QName Name- deriving (Typeable, Data, Eq, Ord)+ deriving (Typeable, Eq, Ord) -- | Top-level module names. --@@ -132,7 +132,7 @@ newtype TopLevelModuleName = TopLevelModuleName { moduleNameParts :: [String] }- deriving (Show, Eq, Ord, Typeable, Data)+ deriving (Show, Eq, Ord, Typeable) -- | Turns a qualified name into a 'TopLevelModuleName'. The qualified -- name is assumed to represent a top-level module name.@@ -205,6 +205,10 @@ instance SetRange Name where setRange r (Name _ ps) = Name r ps setRange r (NoName _ i) = NoName r i++instance SetRange QName where+ setRange r (QName x) = QName (setRange r x)+ setRange r (Qual n x) = Qual (setRange r n) (setRange r x) instance KillRange QName where killRange (QName x) = QName $ killRange x
src/full/Agda/Syntax/Concrete/Operators.hs view
@@ -3,7 +3,7 @@ {-| The parser doesn't know about operators and parses everything as normal function application. This module contains the functions that parses the operators properly. For a stand-alone implementation of this see- @src\/prototyping\/mixfix@.+ @src\/prototyping\/mixfix\/old@. It also contains the function that puts parenthesis back given the precedence of the context.@@ -11,14 +11,28 @@ module Agda.Syntax.Concrete.Operators ( parseApplication , parseLHS+ , parsePattern+ , parsePatternSyn , paren , mparen+ -- exports for Copatterns+ , validConPattern+ , patternAppView+ , fullParen+ , buildParser+ , parsePat+ , getDefinedNames+ , UseBoundNames(..)+ , qualifierModules+ , patternQNames ) where import Control.Applicative+import Control.Monad import Control.Monad.Trans import Data.Typeable import Data.Traversable (traverse)+import qualified Data.Traversable as Trav import qualified Data.Map as Map import qualified Data.Set as Set import Data.Set (Set)@@ -27,7 +41,7 @@ import Agda.Syntax.Concrete.Pretty () import Agda.Syntax.Common-import Agda.Syntax.Concrete+import Agda.Syntax.Concrete hiding (appView) import Agda.Syntax.Concrete.Operators.Parser import qualified Agda.Syntax.Abstract.Name as A import Agda.Syntax.Position@@ -36,11 +50,12 @@ import Agda.Syntax.Scope.Base import Agda.Syntax.Scope.Monad -import Agda.TypeChecking.Monad.Base (typeError, TypeError(..))+import Agda.TypeChecking.Monad.Base (typeError, TypeError(..), LHSOrPatSyn(..)) import Agda.TypeChecking.Monad.State (getScope) import Agda.TypeChecking.Monad.Options import Agda.TypeChecking.Monad.Statistics +import Agda.Utils.Either import Agda.Utils.ReadP import Agda.Utils.Monad import Agda.Utils.Tuple@@ -55,47 +70,52 @@ -- * Building the parser --------------------------------------------------------------------------- -partsInScope :: ScopeM (Set Name)-partsInScope = do- (names, ops) <- localNames+partsInScope :: FlatScope -> ScopeM (Set QName)+partsInScope flat = do+ (names, ops) <- localNames flat let xs = concatMap parts names ++ concatMap notationNames ops return $ Set.fromList xs where- parts (NoName _ _) = []- parts x@(Name _ [_]) = [x]- parts x@(Name _ xs) = x : [ Name noRange [i] | i@(Id {}) <- xs ]+ qual xs x = foldr Qual (QName x) xs+ parts q = parts' (init $ qnameParts q) (unqualify q)+ parts' ms (NoName _ _) = []+ parts' ms x@(Name _ [_]) = [qual ms x]+ -- The first part should be qualified, but not the rest+ parts' ms x@(Name _ xs) = qual ms x : qual ms (Name noRange [first]) : [ QName $ Name noRange [i] | i <- iparts ]+ where+ first:iparts = [ i | i@(Id {}) <- xs ] +type FlatScope = Map.Map QName [AbstractName]+ -- | Compute all unqualified defined names in scope and their fixities.-getDefinedNames :: [KindOfName] -> ScopeM [(Name, Fixity')]-getDefinedNames kinds = do- names <- nsNames . everythingInScope <$> getScope- reportSLn "scope.operators" 20 $ "everythingInScope: " ++ show names- return [ (x, A.nameFixity $ A.qnameName $ anameName d)- | (x, ds) <- Map.assocs names- , d <- take 1 ds- , anameKind d `elem` kinds- ]+getDefinedNames :: [KindOfName] -> FlatScope -> [(QName, Fixity')]+getDefinedNames kinds names =+ [ (x, A.nameFixity $ A.qnameName $ anameName d)+ | (x, ds) <- Map.toList names+ , d <- take 1 ds+ , anameKind d `elem` kinds+ ] -- | Compute all names (first component) and operators (second component) in -- scope.-localNames :: ScopeM ([Name], [NewNotation])-localNames = do- defs <- getDefinedNames [DefName, ConName]+localNames :: FlatScope -> ScopeM ([QName], [NewNotation])+localNames flat = do+ let defs = getDefinedNames allKindsOfNames flat locals <- scopeLocals <$> getScope return $ split $ uniqBy fst $ map localOp locals ++ defs where- localOp (x, y) = (x, A.nameFixity y)+ localOp (x, y) = (QName x, A.nameFixity y) split ops = ([ x | Left x <- zs], [ y | Right y <- zs ]) where zs = concatMap opOrNot ops - opOrNot (x, Fixity' fx syn) = Left x- : case x of+ opOrNot (q, Fixity' fx syn) = Left q+ : case unqualify q of Name _ [_] -> []- _ -> [Right (x, fx, syntaxOf x)]+ x -> [Right (q, fx, syntaxOf x)] ++ case syn of [] -> []- _ -> [Right (x, fx, syn)]+ _ -> [Right (q, fx, syn)] data UseBoundNames = UseBoundNames | DontUseBoundNames @@ -144,13 +164,20 @@ (False,False) -> Nonfix -notationNames :: NewNotation -> [Name]-notationNames (_, _, ps) = [Name noRange [Id x] | IdPart x <- ps ]+notationNames :: NewNotation -> [QName]+notationNames (q, _, ps) = zipWith ($) (requal : repeat QName) [Name noRange [Id x] | IdPart x <- ps ]+ where+ ms = init (qnameParts q)+ requal x = foldr Qual (QName x) ms -buildParser :: forall e. IsExpr e => Range -> UseBoundNames -> ScopeM (ReadP e e)-buildParser r use = do- (names, ops) <- localNames- cons <- getDefinedNames [ConName]+buildParser :: forall e. IsExpr e => Range -> FlatScope -> UseBoundNames -> ScopeM (ReadP e e)+buildParser r flat use = do+ (names, ops) <- localNames flat+ let cons = getDefinedNames [ConName, PatternSynName] flat+ reportSLn "scope.operators" 50 $ unlines+ [ "names = " ++ show names+ , "ops = " ++ show ops+ , "cons = " ++ show cons ] let conparts = Set.fromList $ concatMap notationNames $ map oldToNewNotation cons opsparts = Set.fromList $ concatMap notationNames $ ops allParts = Set.union conparts opsparts@@ -169,13 +196,9 @@ ++ map (nonfixP . opP p) non -- for things with no outer "holes" ++ [ const $ atomP isAtom ] where--- level :: NewNotation -> Nat+ level :: NewNotation -> Integer level (_name, fixity, _syn) = fixityLevel fixity - on f g x y = f (g x) (g y)- isinfixl, isinfixr, isinfix, nonfix, isprefix, ispostfix :: NewNotation -> Bool isinfixl (_, LeftAssoc _ _, syn) = isInfix syn@@ -222,7 +245,7 @@ instance IsExpr Expr where exprView e = case e of- Ident (QName x) -> LocalV x+ Ident x -> LocalV x App _ e1 e2 -> AppV e1 e2 OpApp r d es -> OpAppV d es HiddenArg _ e -> HiddenArgV e@@ -232,7 +255,7 @@ Underscore{} -> WildV e _ -> OtherV e unExprView e = case e of- LocalV x -> Ident (QName x)+ LocalV x -> Ident x AppV e1 e2 -> App (fuseRange e1 e2) e1 e2 OpAppV d es -> OpApp (fuseRange d es) d es HiddenArgV e -> HiddenArg (getRange e) e@@ -245,94 +268,281 @@ instance IsExpr Pattern where exprView e = case e of- IdentP (QName x) -> LocalV x- AppP e1 e2 -> AppV e1 e2- OpAppP r d es -> OpAppV d (map Ordinary es)- HiddenP _ e -> HiddenArgV e- InstanceP _ e -> InstanceArgV e- ParenP _ e -> ParenV e- WildP{} -> WildV e- _ -> OtherV e+ IdentP x -> LocalV x+ AppP e1 e2 -> AppV e1 e2+ OpAppP r d es -> OpAppV d (map Ordinary es)+ HiddenP _ e -> HiddenArgV e+ InstanceP _ e -> InstanceArgV e+ ParenP _ e -> ParenV e+ WildP{} -> WildV e+ _ -> OtherV e unExprView e = case e of- LocalV x -> IdentP (QName x)- AppV e1 e2 -> AppP e1 e2- OpAppV d es -> let ess :: [Pattern]- ess = (map (fromOrdinary __IMPOSSIBLE__) es)- in OpAppP (fuseRange d es) d ess- HiddenArgV e -> HiddenP (getRange e) e- InstanceArgV e -> InstanceP (getRange e) e- ParenV e -> ParenP (getRange e) e- LamV _ _ -> __IMPOSSIBLE__- WildV e -> e- OtherV e -> e+ LocalV x -> IdentP x+ AppV e1 e2 -> AppP e1 e2+ OpAppV d es -> let ess :: [Pattern]+ ess = (map (fromOrdinary __IMPOSSIBLE__) es)+ in OpAppP (fuseRange d es) d ess+ HiddenArgV e -> HiddenP (getRange e) e+ InstanceArgV e -> InstanceP (getRange e) e+ ParenV e -> ParenP (getRange e) e+ LamV _ _ -> __IMPOSSIBLE__+ WildV e -> e+ OtherV e -> e +{- TRASH+instance IsExpr LHSCore where+ exprView e = case e of+ LHSHead f ps -> foldl AppV (LocalV f) $ map exprView ps+ LHSProj d ps1 e ps2 -> foldl AppV (LocalV d) $+ map exprView ps1 ++ exprView e : map exprView ps2+ unExprView e = LHSHead f ps+ where p :: Pattern+ p = unExprView+ (f, ps) = lhsArgs p+-} +---------------------------------------------------------------------------+-- * Helpers for pattern and lhs parsing+--------------------------------------------------------------------------- +-- Andreas, 2011-11-24 moved here from ConcreteToAbstract+lhsArgs :: Pattern -> (Name, [NamedArg Pattern])+lhsArgs p = case lhsArgs' p of+ Just (x, args) -> (x, args)+ Nothing -> __IMPOSSIBLE__++-- | @lhsArgs' p@ splits a lhs @f ps@, given as a pattern @p@,+-- into @(f, ps)@.+lhsArgs' :: Pattern -> Maybe (Name, [NamedArg Pattern])+lhsArgs' p = case patternAppView p of+ Arg _ _ (Named _ (IdentP (QName x))) : ps -> Just (x, ps)+ _ -> Nothing++-- | View a pattern @p@ as a list @p0 .. pn@ where @p0@ is the identifier+-- (in most cases a constructor).+--+-- Pattern needs to be parsed already (operators resolved).+patternAppView :: Pattern -> [NamedArg Pattern]+patternAppView p = case p of+ AppP p arg -> patternAppView p ++ [arg]+ OpAppP _ x ps -> mkHead (IdentP x) : map notHidden ps+ ParenP _ p -> patternAppView p+ RawAppP _ _ -> __IMPOSSIBLE__+ _ -> [ mkHead p ]+ where mkHead = Arg NotHidden Relevant . unnamed+ notHidden = Arg NotHidden Relevant . unnamed++ --------------------------------------------------------------------------- -- * Parse functions --------------------------------------------------------------------------- -- | Returns the list of possible parses.-parsePattern :: ReadP Pattern Pattern -> Pattern -> [Pattern]-parsePattern prs p = case p of- AppP p (Arg h r q) -> fullParen' <$> (AppP <$> parsePattern prs p <*> (Arg h r <$> traverse (parsePattern prs) q))- RawAppP _ ps -> fullParen' <$> (parsePattern prs =<< parse prs ps)- OpAppP r d ps -> fullParen' . OpAppP r d <$> mapM (parsePattern prs) ps+parsePat :: ReadP Pattern Pattern -> Pattern -> [Pattern]+parsePat prs p = case p of+ AppP p (Arg h r q) -> fullParen' <$> (AppP <$> parsePat prs p <*> (Arg h r <$> traverse (parsePat prs) q))+ RawAppP _ ps -> fullParen' <$> (parsePat prs =<< parse prs ps)+ OpAppP r d ps -> fullParen' . OpAppP r d <$> mapM (parsePat prs) ps HiddenP _ _ -> fail "bad hidden argument" InstanceP _ _ -> fail "bad instance argument"- AsP r x p -> AsP r x <$> parsePattern prs p+ AsP r x p -> AsP r x <$> parsePat prs p DotP r e -> return $ DotP r e- ParenP r p -> fullParen' <$> parsePattern prs p+ ParenP r p -> fullParen' <$> parsePat prs p WildP _ -> return p AbsurdP _ -> return p LitP _ -> return p IdentP _ -> return p +{- Implement parsing of copattern left hand sides, e.g.++ record Tree (A : Set) : Set where+ field+ label : A+ child : Bool -> Tree A++ -- corecursive function defined by copattern matching+ alternate : {A : Set}(a b : A) -> Tree A+ -- shallow copatterns+ label (alternate a b) = a+ child (alternate a b) True = alternate b a+ -- deep copatterns:+ label (child (alternate a b) False) = b+ child (child (alternate a b) False) True = alternate a b+ child (child (alternate a b) False) False = alternate a b++ Delivers an infinite tree++ a+ b b+ a a a a+ b b b b b b b b+ ...++ Each lhs is a pattern tree with a distinct path of destructors+ ("child", "label") from the root to the defined symbol ("alternate").+ All branches besides this distinct path are patterns.++ Syntax.Concrete.LHSCore represents a lhs+ - the destructor path+ - the side patterns+ - the defined function symbol+ - the applied patterns+-}++type ParseLHS = Either Pattern (Name, LHSCore)++parseLHS' :: LHSOrPatSyn -> Maybe Name -> Pattern -> ScopeM ParseLHS+parseLHS' lhsOrPatSyn top p = do+ let ms = qualifierModules $ patternQNames p+ flat <- flattenScope ms <$> getScope+ patP <- buildParser (getRange p) flat DontUseBoundNames+ let cons = getNames [ConName, PatternSynName] flat+ let flds = getNames [FldName] flat+ case [ res | p' <- parsePat patP p+ , res <- validPattern (PatternCheckConfig top cons flds) p' ] of+ [(p,lhs)] -> return lhs+ [] -> typeError $ NoParseForLHS lhsOrPatSyn p+ rs -> typeError $ AmbiguousParseForLHS lhsOrPatSyn p $+ map (fullParen . fst) rs+ where+ getNames kinds flat = map fst $ getDefinedNames kinds flat++ -- validPattern returns an empty or singleton list (morally a Maybe)+ validPattern :: PatternCheckConfig -> Pattern -> [(Pattern, ParseLHS)]+ validPattern conf p = case (classifyPattern conf p, top) of+ (Just r@(Left _), Nothing) -> [(p, r)] -- expect pattern+ (Just r@(Right _), Just{}) -> [(p, r)] -- expect lhs+ _ -> []++-- | Name sets for classifying a pattern.+data PatternCheckConfig = PatternCheckConfig+ { topName :: Maybe Name -- ^ name of defined symbol+ , conNames :: [QName] -- ^ valid constructor names+ , fldNames :: [QName] -- ^ valid field names+ }++-- | Returns zero or one classified patterns.+classifyPattern :: PatternCheckConfig -> Pattern -> Maybe ParseLHS+classifyPattern conf p =+ case patternAppView p of++ -- case @f ps@+ Arg _ _ (Named _ (IdentP x@(QName f))) : ps | Just f == topName conf -> do+ guard $ all validPat ps+ return $ Right (f, LHSHead f ps)++ -- case @d ps@+ Arg _ _ (Named _ (IdentP x)) : ps | x `elem` fldNames conf -> do+ -- ps0 :: [NamedArg ParseLHS]+ ps0 <- mapM classPat ps+ let (ps1, rest) = span (isLeft . namedArg) ps0+ (p2, ps3) <- uncons rest -- when (null rest): no field pattern or def pattern found+ guard $ all (isLeft . namedArg) ps3+ let (f, lhs) = fromR p2+ (ps', _:ps'') = splitAt (length ps1) ps+ return $ Right (f, LHSProj x ps' lhs ps'')++ -- case: ordinary pattern+ _ -> do+ guard $ validConPattern (conNames conf) p+ return $ Left p++ where -- allNames = conNames conf ++ fldNames conf+ validPat = validConPattern (conNames conf) . namedArg+ classPat :: NamedArg Pattern -> Maybe (NamedArg ParseLHS)+ classPat = Trav.mapM (Trav.mapM (classifyPattern conf))+ fromR :: NamedArg (Either a (b, c)) -> (b, NamedArg c)+ fromR (Arg h r (Named n (Right (b, c)))) = (b, Arg h r (Named n c))+ fromR (Arg h r (Named n (Left a ))) = __IMPOSSIBLE__+++ -- | Parses a left-hand side, and makes sure that it defined the expected name. -- TODO: check the arities of constructors. There is a possible ambiguity with -- postfix constructors: -- Assume _ * is a constructor. Then 'true *' can be parsed as either the -- intended _* applied to true, or as true applied to a variable *. If we -- check arities this problem won't appear.-parseLHS :: Maybe Name -> Pattern -> ScopeM Pattern+parseLHS :: Name -> Pattern -> ScopeM LHSCore parseLHS top p = do- patP <- buildParser (getRange p) DontUseBoundNames- cons <- getNames [ConName]- case filter (validPattern top cons) $ parsePattern patP p of- [p] -> return p- [] -> typeError $ NoParseForLHS p- ps -> typeError $ AmbiguousParseForLHS p $ map fullParen ps- where- getNames kinds = map fst <$> getDefinedNames kinds+ res <- parseLHS' IsLHS (Just top) p+ case res of+ Right (f, lhs) -> return lhs+ _ -> typeError $ NoParseForLHS IsLHS p - validPattern :: Maybe Name -> [Name] -> Pattern -> Bool- validPattern (Just top) cons p = case appView p of- IdentP (QName x) : ps -> x == top && all (validPat cons) ps- _ -> False- validPattern Nothing cons p = validPat cons p+-- | Parses a pattern.+-- TODO: check the arities of constructors. There is a possible ambiguity with+-- postfix constructors:+-- Assume _ * is a constructor. Then 'true *' can be parsed as either the+-- intended _* applied to true, or as true applied to a variable *. If we+-- check arities this problem won't appear.+parsePattern :: Pattern -> ScopeM Pattern+parsePattern = parsePatternOrSyn IsLHS - validPat :: [Name] -> Pattern -> Bool- validPat cons p = case appView p of- [_] -> True- IdentP (QName x) : ps -> elem x cons && all (validPat cons) ps- ps -> all (validPat cons) ps+parsePatternSyn :: Pattern -> ScopeM Pattern+parsePatternSyn = parsePatternOrSyn IsPatSyn - appView :: Pattern -> [Pattern]- appView p = case p of- AppP p a -> appView p ++ [namedThing (unArg a)]- OpAppP _ op ps -> IdentP (QName op) : ps- ParenP _ p -> appView p- RawAppP _ _ -> __IMPOSSIBLE__- HiddenP _ _ -> __IMPOSSIBLE__- InstanceP _ _ -> __IMPOSSIBLE__- _ -> [p]+parsePatternOrSyn :: LHSOrPatSyn -> Pattern -> ScopeM Pattern+parsePatternOrSyn lhsOrPatSyn p = do+ res <- parseLHS' lhsOrPatSyn Nothing p+ case res of+ Left p -> return p+ _ -> typeError $ NoParseForLHS lhsOrPatSyn p +-- | Helper function for 'parseLHS' and 'parsePattern'.+validConPattern :: [QName] -> Pattern -> Bool+validConPattern cons p = case appView p of+ [_] -> True+ IdentP x : ps -> elem x cons && all (validConPattern cons) ps+ _ -> False+-- Andreas, 2012-06-04: I do not know why the following line was+-- the catch-all case. It seems that the new catch-all works also+-- and is more logical.+-- ps -> all (validConPattern cons) ps++-- | Helper function for 'parseLHS' and 'parsePattern'.+appView :: Pattern -> [Pattern]+appView p = case p of+ AppP p a -> appView p ++ [namedThing (unArg a)]+ OpAppP _ op ps -> IdentP op : ps+ ParenP _ p -> appView p+ RawAppP _ _ -> __IMPOSSIBLE__+ HiddenP _ _ -> __IMPOSSIBLE__+ InstanceP _ _ -> __IMPOSSIBLE__+ _ -> [p]++-- | Collect all names in a pattern into a list of qualified names.+patternQNames :: Pattern -> [QName]+patternQNames p = case p of+ RawAppP _ ps -> concatMap patternQNames ps+ IdentP q -> [q]+ ParenP _ p -> patternQNames p+ HiddenP _ p -> patternQNames (namedThing p)+ InstanceP _ p -> patternQNames (namedThing p)+ OpAppP r d ps -> __IMPOSSIBLE__+ AppP{} -> __IMPOSSIBLE__+ AsP{} -> __IMPOSSIBLE__+ AbsurdP{} -> []+ WildP{} -> []+ DotP{} -> []+ LitP{} -> []++-- | Return all qualifiers occuring in a list of 'QName's.+-- Each qualifier is returned as a list of names, e.g.+-- for @Data.Nat._+_@ we return the list @[Data,Nat]@.+qualifierModules :: [QName] -> [[Name]]+qualifierModules qs =+ nub $ filter (not . null) $ map (init . qnameParts) qs++-- | Parse a list of expressions into an application. parseApplication :: [Expr] -> ScopeM Expr parseApplication [e] = return e parseApplication es = do -- Build the parser- p <- buildParser (getRange es) UseBoundNames+ let ms = qualifierModules [ q | Ident q <- es ]+ flat <- flattenScope ms <$> getScope+ p <- buildParser (getRange es) flat UseBoundNames -- Parse case parse p es of@@ -340,14 +550,16 @@ [] -> do -- When the parser fails and a name is not in scope, it is more -- useful to say that to the user rather than just "failed".- inScope <- partsInScope- case [ QName x | Ident (QName x) <- es, not (Set.member x inScope) ] of+ inScope <- partsInScope flat+ case [ x | Ident x <- es, not (Set.member x inScope) ] of [] -> typeError $ NoParseForApplication es xs -> typeError $ NotInScope xs es' -> typeError $ AmbiguousParseForApplication es $ map fullParen es' --- Inserting parenthesis --------------------------------------------------+---------------------------------------------------------------------------+-- * Inserting parenthesis+--------------------------------------------------------------------------- fullParen :: IsExpr e => e -> e fullParen e = case exprView $ fullParen' e of@@ -373,7 +585,7 @@ where par = unExprView . ParenV -paren :: Monad m => (Name -> m Fixity) -> Expr -> m (Precedence -> Expr)+paren :: Monad m => (QName -> m Fixity) -> Expr -> m (Precedence -> Expr) paren _ e@(App _ _ _) = return $ \p -> mparen (appBrackets p) e paren f e@(OpApp _ op _) = do fx <- f op; return $ \p -> mparen (opBrackets fx p) e paren _ e@(Lam _ _ _) = return $ \p -> mparen (lamBrackets p) e
src/full/Agda/Syntax/Concrete/Operators/Parser.hs view
@@ -15,11 +15,11 @@ import Agda.Utils.Impossible data ExprView e- = LocalV Name+ = LocalV QName | WildV e | OtherV e | AppV e (NamedArg e)- | OpAppV Name [OpApp e]+ | OpAppV QName [OpApp e] | HiddenArgV (Named String e) | InstanceArgV (Named String e) | LamV [LamBinding] e@@ -63,16 +63,17 @@ -- Specific combinators -- | Parse a specific identifier as a NamePart-partP :: IsExpr e => String -> ReadP e (Range, NamePart)-partP s = do+partP :: IsExpr e => [Name] -> String -> ReadP e Range+partP ms s = do tok <- get- case isLocal s tok of+ case isLocal tok of Just p -> return p Nothing -> pfail where- isLocal x e = case exprView e of- LocalV (Name r [Id y]) | x == y -> Just (r, Id y)- _ -> Nothing+ str = show (foldr Qual (QName (Name noRange [Id s])) ms)+ isLocal e = case exprView e of+ LocalV y | str == show y -> Just (getRange y)+ _ -> Nothing binop :: IsExpr e => ReadP e (NewNotation,Range,[e]) -> ReadP e (e -> e -> ReadP a e) binop middleP = do@@ -97,16 +98,16 @@ -- place as where the holes are discarded, however that would require a dependently -- typed function (or duplicated code) opP :: IsExpr e => ReadP e e -> NewNotation -> ReadP e (NewNotation,Range,[e])-opP p nsyn@(_,_,syn) = do- (range,es) <- worker $ removeExternalHoles syn+opP p nsyn@(q,_,syn) = do+ (range,es) <- worker (init $ qnameParts q) $ removeExternalHoles syn return (nsyn,range,es)- where worker [IdPart x] = do (r, part) <- partP x; return (r,[])- worker (IdPart x : _ : xs) = do- (r1, part) <- partP x- e <- p- (r2 , es) <- worker xs+ where worker ms [IdPart x] = do r <- partP ms x; return (r,[])+ worker ms (IdPart x : _ : xs) = do+ r1 <- partP ms x+ e <- p+ (r2 , es) <- worker [] xs -- only the first part is qualified return (fuseRanges r1 r2, e : es)- worker x = __IMPOSSIBLE__ -- holes and non-holes must be alternated.+ worker _ x = __IMPOSSIBLE__ -- holes and non-holes must be alternated. removeExternalHoles = reverse . removeLeadingHoles . reverse . removeLeadingHoles where removeLeadingHoles = dropWhile isAHole@@ -131,7 +132,7 @@ rebuildBinding :: ExprView e -> ReadP a LamBinding -- Andreas, 2011-04-07 put just 'Relevant' here, is this correct?-rebuildBinding (LocalV name) = return $ DomainFree NotHidden Relevant (mkBoundName_ name)+rebuildBinding (LocalV (QName name)) = return $ DomainFree NotHidden Relevant (mkBoundName_ name) rebuildBinding (WildV e) = return $ DomainFree NotHidden Relevant (mkBoundName_ $ Name noRange [Hole]) rebuildBinding _ = fail "variable name expected"@@ -201,7 +202,7 @@ HiddenArgV e <- exprView <$> satisfy (isHidden . exprView) return $ Arg Hidden Relevant e -atomP :: IsExpr e => (Name -> Bool) -> ReadP e e+atomP :: IsExpr e => (QName -> Bool) -> ReadP e e atomP p = do e <- get case exprView e of
src/full/Agda/Syntax/Concrete/Pretty.hs view
@@ -8,6 +8,7 @@ import Data.Char import Agda.Syntax.Common+import Agda.Syntax.Position import Agda.Syntax.Concrete import Agda.Syntax.Fixity import Agda.Syntax.Literal@@ -46,7 +47,12 @@ pHidden NotHidden = pretty pRelevance :: Pretty a => Relevance -> a -> Doc+pRelevance rel a =+ let d = pretty a+ in if render d == "_" then d else pretty rel <> d+{- pRelevance Forced a = pretty a+pRelevance UnusedArg a = pretty a pRelevance Relevant a = pretty a pRelevance Irrelevant a = let d = pretty a@@ -54,11 +60,6 @@ pRelevance NonStrict a = let d = pretty a in if render d == "_" then d else text ".." <> d--{- UNUSED--- | Use for printing non-dependent function types-prettyWithRelevance :: Pretty a => Arg a -> Doc-prettyWithRelevance a = pRelevance (argRelevance a) a -} instance Pretty (ThingWithFixity Name) where@@ -91,6 +92,7 @@ instance Pretty Relevance where pretty Forced = empty+ pretty UnusedArg = empty pretty Relevant = empty pretty Irrelevant = text "." pretty NonStrict = text ".."@@ -109,7 +111,8 @@ Ident x -> pretty x Lit l -> pretty l QuestionMark _ n -> text "?" <> maybe empty (text . show) n- Underscore _ n -> underscore <> maybe empty (text . show) n+ Underscore _ n -> maybe underscore text n+-- Underscore _ n -> underscore <> maybe empty (text . show) n App _ _ _ -> case appView e of AppView e1 args ->@@ -118,13 +121,7 @@ -- , nest 2 $ fsep $ map pretty args -- ] RawApp _ es -> fsep $ map pretty es- OpApp _ (Name _ xs) es -> fsep $ prOp xs es- where- prOp (Hole : xs) (e : es) = pretty e : prOp xs es- prOp (Hole : _) [] = __IMPOSSIBLE__- prOp (Id x : xs) es = text x : prOp xs es- prOp [] es = map pretty es- OpApp _ (NoName _ _) _ -> __IMPOSSIBLE__+ OpApp _ q es -> fsep $ prettyOpApp q es WithApp _ e es -> fsep $ pretty e : map ((text "|" <+>) . pretty) es@@ -139,7 +136,7 @@ AbsurdLam _ Instance -> lambda <+> text "{{}}" AbsurdLam _ Hidden -> lambda <+> text "{}" ExtendedLam _ pes ->- lambda <+> braces (fsep $ punctuate (text ";") (map (\(x,y,z) -> prettyClause x y z) pes))+ lambda <+> braces' (fsep $ punctuate (text ";") (map (\(x,y,z) -> prettyClause x y z) pes)) where prettyClause lhs rhs wh = sep [ pretty lhs , nest 2 $ pretty' rhs ] $$ nest 2 (pretty wh)@@ -247,6 +244,13 @@ pThing thing (e : es) = fsep $ (text thing <+> pretty e) : map ((text "|" <+>) . pretty) es +instance Show LHSCore where show = show . pretty+instance Pretty LHSCore where+ pretty (LHSHead f ps) = sep $ pretty f : map (parens . pretty) ps+ pretty (LHSProj d ps lhscore ps') = sep $+ pretty d : map (parens . pretty) ps +++ parens (pretty lhscore) : map (parens . pretty) ps'+ instance Pretty [Declaration] where pretty = vcat . map pretty @@ -308,19 +312,25 @@ , pretty e ] ]- Record _ x con tel (Just e) cs ->+ Record _ x ind con tel me cs -> sep [ hsep [ text "record" , pretty x , fcat (map pretty tel) ]- , nest 2 $ hsep+ , nest 2 $ pType me+ ] $$ nest 2 (vcat $ pInd +++ pCon +++ map pretty cs)+ where pType (Just e) = hsep [ text ":" , pretty e , text "where" ]- ] $$ nest 2 (vcat $ maybe [] (\c -> [text "constructor" <+> pretty c])- con ++- map pretty cs)+ pType Nothing =+ text "where"+ pInd = maybe [] (\i -> [text $ show i]) ind+ pCon = maybe [] (\c -> [text "constructor" <+> pretty c]) con+{- ELIMINATED CUT-AND-PASTE CODE Record _ x con tel Nothing cs -> sep [ hsep [ text "record" , pretty x@@ -330,10 +340,12 @@ ] $$ nest 2 (vcat $ maybe [] (\c -> [text "constructor" <+> pretty c]) con ++ map pretty cs)-+-} Infix f xs -> pretty f <+> (fsep $ punctuate comma $ map pretty xs) Syntax n xs -> text "syntax" <+> pretty n <+> text "..."+ PatternSyn _ n as p -> text "pattern" <+> pretty n <+> fsep (map pretty as)+ <+> text "=" <+> pretty p Mutual _ ds -> namedBlock "mutual" ds Abstract _ ds -> namedBlock "abstract" ds Private _ ds -> namedBlock "private" ds@@ -396,6 +408,7 @@ hsep $ [text "IMPOSSIBLE"] pretty (EtaPragma _ x) = hsep $ [text "ETA", pretty x]+ pretty (NoTerminationCheckPragma _) = text "NO_TERMINATION_CHECK" instance Pretty Fixity where pretty (LeftAssoc _ n) = text "infixl" <+> text (show n)@@ -418,25 +431,31 @@ instance Pretty Pattern where pretty p = case p of- IdentP x -> pretty x- AppP p1 p2 -> sep [ pretty p1, nest 2 $ pretty p2 ]- RawAppP _ ps -> fsep $ map pretty ps- OpAppP _ (Name _ xs) ps -> fsep $ prOp xs ps- where- prOp (Hole : xs) (e : es) = pretty e : prOp xs es- prOp (Hole : _) [] = __IMPOSSIBLE__- prOp (Id x : xs) es = text x : prOp xs es- prOp [] [] = []- prOp [] es = map pretty es- OpAppP _ (NoName _ _) _ -> __IMPOSSIBLE__- HiddenP _ p -> braces' $ pretty p- InstanceP _ p -> dbraces $ pretty p- ParenP _ p -> parens $ pretty p- WildP _ -> underscore- AsP _ x p -> pretty x <> text "@" <> pretty p- DotP _ p -> text "." <> pretty p- AbsurdP _ -> text "()"- LitP l -> pretty l+ IdentP x -> pretty x+ AppP p1 p2 -> sep [ pretty p1, nest 2 $ pretty p2 ]+ RawAppP _ ps -> fsep $ map pretty ps+ OpAppP _ q ps -> fsep $ prettyOpApp q ps+ HiddenP _ p -> braces' $ pretty p+ InstanceP _ p -> dbraces $ pretty p+ ParenP _ p -> parens $ pretty p+ WildP _ -> underscore+ AsP _ x p -> pretty x <> text "@" <> pretty p+ DotP _ p -> text "." <> pretty p+ AbsurdP _ -> text "()"+ LitP l -> pretty l++prettyOpApp :: Pretty a => QName -> [a] -> [Doc]+prettyOpApp q es = prOp ms xs es+ where+ ms = init (qnameParts q)+ xs = case unqualify q of+ Name _ xs -> xs+ NoName{} -> __IMPOSSIBLE__+ prOp ms (Hole : xs) (e : es) = pretty e : prOp ms xs es+ prOp _ (Hole : _) [] = __IMPOSSIBLE__+ prOp ms (Id x : xs) es = pretty (foldr Qual (QName (Name noRange $ [Id x])) ms) : prOp [] xs es+ prOp _ [] [] = []+ prOp _ [] es = map pretty es instance Pretty ImportDirective where pretty i =
src/full/Agda/Syntax/Fixity.hs view
@@ -4,7 +4,7 @@ -} module Agda.Syntax.Fixity where -import Data.Generics (Typeable, Data)+import Data.Typeable (Typeable) import Data.Foldable import Data.Traversable @@ -18,15 +18,15 @@ data Fixity' = Fixity' {theFixity :: Fixity, theNotation :: Notation}- deriving (Typeable, Data, Show, Eq)+ deriving (Typeable, Show, Eq) -data ThingWithFixity x = ThingWithFixity x Fixity' deriving (Functor,Foldable,Traversable,Typeable,Data,Show)+data ThingWithFixity x = ThingWithFixity x Fixity' deriving (Functor,Foldable,Traversable,Typeable,Show) -- | All the notation information related to a name.-type NewNotation = (Name, Fixity, Notation)+type NewNotation = (QName, Fixity, Notation) -- | If an operator has no specific notation, recover it from its name.-oldToNewNotation :: (Name, Fixity') -> NewNotation-oldToNewNotation (name, Fixity' f []) = (name, f, syntaxOf name)+oldToNewNotation :: (QName, Fixity') -> NewNotation+oldToNewNotation (name, Fixity' f []) = (name, f, syntaxOf $ unqualify name) oldToNewNotation (name, Fixity' f syn) = (name, f, syn) syntaxOf :: Name -> Notation@@ -41,13 +41,13 @@ defaultFixity' = Fixity' defaultFixity defaultNotation -noFixity = NonAssoc noRange (negate 666)+noFixity = NonAssoc noRange (negate 666) -- ts,ts,ts, why the number of the beast? Revelation 13, 18 -- | Fixity of operators.-data Fixity = LeftAssoc Range Nat- | RightAssoc Range Nat- | NonAssoc Range Nat- deriving (Typeable, Data, Show)+data Fixity = LeftAssoc Range Integer+ | RightAssoc Range Integer+ | NonAssoc Range Integer+ deriving (Typeable, Show) instance Eq Fixity where LeftAssoc _ n == LeftAssoc _ m = n == m@@ -55,7 +55,7 @@ NonAssoc _ n == NonAssoc _ m = n == m _ == _ = False -fixityLevel :: Fixity -> Nat+fixityLevel :: Fixity -> Integer fixityLevel (LeftAssoc _ n) = n fixityLevel (RightAssoc _ n) = n fixityLevel (NonAssoc _ n) = n@@ -69,7 +69,7 @@ | LeftOperandCtx Fixity | RightOperandCtx Fixity | FunctionCtx | ArgumentCtx | InsideOperandCtx | WithFunCtx | WithArgCtx | DotPatternCtx- deriving (Show,Typeable,Data)+ deriving (Show,Typeable) -- | The precedence corresponding to a possibly hidden argument.@@ -135,3 +135,11 @@ getRange (LeftAssoc r _) = r getRange (RightAssoc r _) = r getRange (NonAssoc r _) = r++instance KillRange Fixity where+ killRange (LeftAssoc _ n) = LeftAssoc noRange n+ killRange (RightAssoc _ n) = RightAssoc noRange n+ killRange (NonAssoc _ n) = NonAssoc noRange n++instance KillRange Fixity' where+ killRange (Fixity' f n) = killRange1 (flip Fixity' n) f
src/full/Agda/Syntax/Info.hs view
@@ -7,7 +7,7 @@ module Agda.Syntax.Info where -import Data.Generics (Typeable, Data)+import Data.Typeable (Typeable) import Text.Show.Functions import qualified Agda.Syntax.Concrete.Name as C@@ -15,7 +15,7 @@ import Agda.Syntax.Position import Agda.Syntax.Concrete import Agda.Syntax.Fixity-import Agda.Syntax.Scope.Base (ScopeInfo)+import Agda.Syntax.Scope.Base (ScopeInfo, emptyScopeInfo) {-------------------------------------------------------------------------- No information@@ -31,9 +31,18 @@ MetaInfo { metaRange :: Range , metaScope :: ScopeInfo , metaNumber :: Maybe Nat+ , metaNameSuggestion :: String }- deriving (Typeable, Data, Show)+ deriving (Typeable, Show) +emptyMetaInfo :: MetaInfo+emptyMetaInfo = MetaInfo+ { metaRange = noRange+ , metaScope = emptyScopeInfo+ , metaNumber = Nothing+ , metaNameSuggestion = ""+ }+ instance HasRange MetaInfo where getRange = metaRange @@ -51,7 +60,7 @@ | ExprSource Range (Precedence -> Expr) -- ^ Even if we store the original expression we have to know -- whether to put parenthesis around it.- deriving (Typeable, Data, Show)+ deriving (Typeable, Show) instance HasRange ExprInfo where getRange (ExprRange r ) = r@@ -77,13 +86,16 @@ , minfoDirective :: Maybe ImportDirective -- Retained for abstractToConcrete of ModuleMacro }- deriving (Typeable, Data)+ deriving (Typeable) deriving instance (Show OpenShortHand, Show ImportDirective) => Show ModuleInfo instance HasRange ModuleInfo where getRange = minfoRange +instance SetRange ModuleInfo where+ setRange r i = i { minfoRange = r }+ instance KillRange ModuleInfo where killRange m = m { minfoRange = killRange $ minfoRange m } @@ -92,7 +104,7 @@ --------------------------------------------------------------------------- newtype LetInfo = LetRange Range- deriving (Typeable, Data, Show)+ deriving (Typeable, Show) instance HasRange LetInfo where getRange (LetRange r) = r@@ -110,7 +122,7 @@ , defAbstract :: IsAbstract , defInfo :: DeclInfo }- deriving (Typeable, Data, Show)+ deriving (Typeable, Show) mkDefInfo :: Name -> Fixity' -> Access -> IsAbstract -> Range -> DefInfo mkDefInfo x f a ab r = DefInfo f a ab (DeclInfo x r)@@ -118,6 +130,9 @@ instance HasRange DefInfo where getRange = getRange . defInfo +instance SetRange DefInfo where+ setRange r i = i { defInfo = setRange r (defInfo i) }+ instance KillRange DefInfo where killRange i = i { defInfo = killRange $ defInfo i } @@ -129,20 +144,39 @@ DeclInfo { declName :: Name , declRange :: Range }- deriving (Typeable, Data, Show)+ deriving (Typeable, Show) instance HasRange DeclInfo where getRange = declRange +instance SetRange DeclInfo where+ setRange r i = i { declRange = r }+ instance KillRange DeclInfo where killRange i = i { declRange = killRange $ declRange i } {--------------------------------------------------------------------------+ Mutual block information+ --------------------------------------------------------------------------}++data MutualInfo =+ MutualInfo { mutualTermCheck :: Bool -- ^ termination check (default=True)+ , mutualRange :: Range+ }+ deriving (Typeable, Show)++instance HasRange MutualInfo where+ getRange = mutualRange++instance KillRange MutualInfo where+ killRange i = i { mutualRange = killRange $ mutualRange i }++{-------------------------------------------------------------------------- Left hand side information --------------------------------------------------------------------------} newtype LHSInfo = LHSRange Range- deriving (Typeable, Data, Show)+ deriving (Typeable, Show) instance HasRange LHSInfo where getRange (LHSRange r) = r@@ -159,7 +193,7 @@ data PatInfo = PatRange Range | PatSource Range (Precedence -> Pattern)- deriving (Typeable, Data)+ deriving (Typeable) instance Show PatInfo where show (PatRange r) = "PatRange " ++ show r
src/full/Agda/Syntax/Internal.hs view
@@ -1,17 +1,23 @@ {-# LANGUAGE CPP, DeriveDataTypeable, GeneralizedNewtypeDeriving,- DeriveFunctor, DeriveFoldable, DeriveTraversable #-}+ DeriveFunctor, DeriveFoldable, DeriveTraversable,+ TemplateHaskell,+ MultiParamTypeClasses, FlexibleInstances,+ TypeSynonymInstances #-} module Agda.Syntax.Internal ( module Agda.Syntax.Internal , module Agda.Syntax.Abstract.Name+ , module Agda.Utils.Pointer ) where import Prelude hiding (foldr) import Control.Applicative-import Data.Generics (Typeable, Data)+import Control.Parallel+import Data.Typeable (Typeable) import Data.Foldable import Data.Traversable import Data.Function+import Data.Maybe import qualified Data.List as List import Agda.Syntax.Position@@ -19,9 +25,11 @@ import Agda.Syntax.Literal import Agda.Syntax.Abstract.Name +import Agda.Utils.Geniplate import Agda.Utils.Monad import Agda.Utils.Size import Agda.Utils.Permutation+import Agda.Utils.Pointer #include "../undefined.h" import Agda.Utils.Impossible@@ -33,28 +41,58 @@ -- every constant, even if the definition is an empty -- list of clauses. ---data Term = Var Nat Args- | Lam Hiding (Abs Term) -- ^ terms are beta normal+data Term = Var {-# UNPACK #-} !Int Args -- ^ @x vs@ neutral+ | Lam Hiding (Abs Term) -- ^ terms are beta normal | Lit Literal- | Def QName Args- | Con QName Args- | Pi (Arg Type) (Abs Type)+ | Def QName Args -- ^ @f vs@, possibly a redex+ | Con QName Args -- ^ @c vs@+ | Pi (Dom Type) (Abs Type) -- ^ dependent or non-dependent function space | Sort Sort | Level Level- | MetaV MetaId Args- | DontCare Term -- ^ irrelevant stuff- deriving (Typeable, Data, Show)+ | MetaV {-# UNPACK #-} !MetaId Args+ | DontCare Term+ -- ^ Irrelevant stuff in relevant position, but created+ -- in an irrelevant context. Basically, an internal+ -- version of the irrelevance axiom @.irrAx : .A -> A@.+ | Shared !(Ptr Term)+ -- ^ Explicit sharing+ deriving (Typeable, Show) -data Type = El Sort Term- deriving (Typeable, Data, Show)+-- | Type of argument lists.+--+type Args = [Arg Term] +-- | Eliminations, subsuming applications and projections.+-- Used for a view which exposes the head of a neutral term.+-- data Elim = Apply (Arg Term) | Proj QName -- ^ name of a record projection deriving (Show) --- | Top sort (Set\omega).-topSort :: Type-topSort = El Inf (Sort Inf)+-- | Binder.+-- 'Abs': The bound variable might appear in the body.+-- 'NoAbs' is pseudo-binder, it does not introduce a fresh variable,+-- similar to the @const@ of Haskell.+data Abs a = Abs { absName :: String, unAbs :: a }+ -- ^ The body has (at least) one free variable.+ -- Danger: 'unAbs' doesn't shift variables properly+ | NoAbs { absName :: String, unAbs :: a }+ deriving (Typeable, Functor, Foldable, Traversable) +-- | Types are terms with a sort annotation.+--+data Type = El { getSort :: Sort, unEl :: Term }+ deriving (Typeable, Show)++-- | Sequence of types. An argument of the first type is bound in later types+-- and so on.+data Tele a = EmptyTel+ | ExtendTel a (Abs (Tele a)) -- ^ 'Abs' is never 'NoAbs'.+ deriving (Typeable, Show, Functor, Foldable, Traversable)++type Telescope = Tele (Dom Type)++-- | Sorts.+-- data Sort = Type Level | Prop -- ignore me | Inf@@ -62,35 +100,266 @@ -- ^ if the free variable occurs in the second sort -- the whole thing should reduce to Inf, otherwise -- it's the normal Lub- deriving (Typeable, Data, Show)+ deriving (Typeable, Show) +-- | A level is a maximum expression of 0..n plus expressions+-- each of which is a number or an atom plus a number.+-- newtype Level = Max [PlusLevel]- deriving (Show, Typeable, Data)+ deriving (Show, Typeable) data PlusLevel = ClosedLevel Integer | Plus Integer LevelAtom- deriving (Show, Typeable, Data)+ deriving (Show, Typeable) data LevelAtom = MetaLevel MetaId Args | BlockedLevel MetaId Term | NeutralLevel Term | UnreducedLevel Term- deriving (Show, Typeable, Data)+ deriving (Show, Typeable) +-- | A meta variable identifier is just a natural number.+--+newtype MetaId = MetaId Nat+ deriving (Eq, Ord, Num, Real, Enum, Integral, Typeable)+ -- | Something where a meta variable may block reduction. data Blocked t = Blocked MetaId t | NotBlocked t- deriving (Typeable, Data, Eq, Ord, Functor, Foldable, Traversable)+ deriving (Typeable, Eq, Ord, Functor, Foldable, Traversable) +instance Applicative Blocked where+ pure = notBlocked+ Blocked x f <*> e = Blocked x $ f (ignoreBlocking e)+ NotBlocked f <*> e = f <$> e+++---------------------------------------------------------------------------+-- * Definitions+---------------------------------------------------------------------------++-- | A clause is a list of patterns and the clause body should @Bind@.+--+-- The telescope contains the types of the pattern variables and the+-- permutation is how to get from the order the variables occur in+-- the patterns to the order they occur in the telescope. The body+-- binds the variables in the order they appear in the patterns.+--+-- @clauseTel ~ permute clausePerm (patternVars clausPats)@+--+-- For the purpose of the permutation and the body dot patterns count+-- as variables. TODO: Change this!+data Clause = Clause+ { clauseRange :: Range+ , clauseTel :: Telescope+ , clausePerm :: Permutation+ , clausePats :: [Arg Pattern]+ , clauseBody :: ClauseBody+ }+ deriving (Typeable, Show)+data ClauseBody = Body Term+ | Bind (Abs ClauseBody)+ | NoBody -- ^ for absurd clauses.+ deriving (Typeable, Show)++instance HasRange Clause where+ getRange = clauseRange++-- | Patterns are variables, constructors, or wildcards.+-- @QName@ is used in @ConP@ rather than @Name@ since+-- a constructor might come from a particular namespace.+-- This also meshes well with the fact that values (i.e.+-- the arguments we are matching with) use @QName@.+--+data Pattern = VarP String -- name suggestion+ | DotP Term+ | ConP QName (Maybe (Arg Type)) [Arg Pattern]+ -- ^ The type is @'Just' t@' iff the pattern is a+ -- record pattern. The scope used for the type is given+ -- by any outer scope plus the clause's telescope+ -- ('clauseTel').+ | LitP Literal+ deriving (Typeable, Show)++-- | Extract pattern variables in left-to-right order.+-- A 'DotP' is also treated as variable (see docu for 'Clause').+patternVars :: Arg Pattern -> [Arg (Either String Term)]+patternVars (Arg h r (VarP x) ) = [Arg h r $ Left x]+patternVars (Arg h r (DotP t) ) = [Arg h r $ Right t]+patternVars (Arg h r (ConP _ _ ps)) = List.concat $ map patternVars ps+patternVars (Arg h r (LitP l) ) = []++-- | Does the pattern perform a match that could fail?+properlyMatching :: Pattern -> Bool+properlyMatching VarP{} = False+properlyMatching DotP{} = False+properlyMatching LitP{} = True+properlyMatching (ConP _ mt ps) = List.or $ isNothing mt -- not a record cons+ : map (properlyMatching . unArg) ps -- or one of subpatterns is a proper m++---------------------------------------------------------------------------+-- * Smart constructors+---------------------------------------------------------------------------++ignoreSharing :: Term -> Term+-- ignoreSharing (Shared p) = ignoreSharing $ derefPtr p+ignoreSharing v = v++ignoreSharingType :: Type -> Type+-- ignoreSharingType (El s v) = El s (ignoreSharing v)+ignoreSharingType v = v++shared :: Term -> Term+-- shared v@Shared{} = v+-- shared v@(Var _ []) = v+-- shared v = Shared (newPtr v)+shared v = v++sharedType :: Type -> Type+-- sharedType (El s v) = El s (shared v)+sharedType v = v++-- | Typically m would be TCM and f would be Blocked.+updateSharedFM :: (Monad m, Applicative m, Traversable f) => (Term -> m (f Term)) -> Term -> m (f Term)+updateSharedFM f v0@(Shared p) = do+ fv <- f (derefPtr p)+ flip traverse fv $ \v ->+ case derefPtr (setPtr v p) of+ Var _ [] -> return v+ _ -> compressPointerChain v0 `pseq` return v0+updateSharedFM f v = f v++updateSharedM :: Monad m => (Term -> m Term) -> Term -> m Term+updateSharedM f v0@(Shared p) = do+ v <- f (derefPtr p)+ case derefPtr (setPtr v p) of+ Var _ [] -> return v+ _ -> compressPointerChain v0 `pseq` return v0+updateSharedM f v = f v++updateShared :: (Term -> Term) -> Term -> Term+updateShared f v0@(Shared p) =+ case derefPtr (setPtr (f $ derefPtr p) p) of+ v@(Var _ []) -> v+ _ -> compressPointerChain v0 `pseq` v0+updateShared f v = f v++pointerChain :: Term -> [Ptr Term]+pointerChain (Shared p) = p : pointerChain (derefPtr p)+pointerChain _ = []++-- Redirect all top-level pointers to point to the last pointer. So, after+-- compression there are at most two top-level indirections.+compressPointerChain :: Term -> Term+compressPointerChain v =+ case reverse $ pointerChain v of+ p:_:ps@(_:_) -> setPointers (Shared p) ps+ _ -> v+ where+ setPointers _ [] = v+ setPointers u (p : ps) =+ setPtr u p `seq` setPointers u ps++-- | An unapplied variable.+var :: Nat -> Term+var i = Var i []++-- | A dummy type.+typeDontCare :: Type+typeDontCare = El Prop (Sort Prop)++-- | Top sort (Set\omega).+topSort :: Type+topSort = El Inf (Sort Inf)++set0 = set 0+set n = sort $ mkType n+prop = sort Prop+sort s = El (sSuc s) $ Sort s+varSort n = Type $ Max [Plus 0 $ NeutralLevel $ Var n []]++-- | Get the next higher sort.+sSuc :: Sort -> Sort+sSuc Prop = mkType 1+sSuc Inf = Inf+sSuc (DLub a b) = DLub (sSuc a) (fmap sSuc b)+sSuc (Type l) = Type $ levelSuc l++levelSuc (Max []) = Max [ClosedLevel 1]+levelSuc (Max as) = Max $ map inc as+ where inc (ClosedLevel n) = ClosedLevel (n + 1)+ inc (Plus n l) = Plus (n + 1) l++mkType n = Type $ Max [ClosedLevel n | n > 0]++impossibleTerm :: String -> Int -> Term+impossibleTerm file line = Lit $ LitString noRange $ unlines+ [ "An internal error has occurred. Please report this as a bug."+ , "Location of the error: " ++ file ++ ":" ++ show line+ ]++---------------------------------------------------------------------------+-- * Handling blocked terms.+---------------------------------------------------------------------------++blockingMeta :: Blocked t -> Maybe MetaId+blockingMeta (Blocked m _) = Just m+blockingMeta (NotBlocked _) = Nothing++blocked :: MetaId -> a -> Blocked a+blocked x = Blocked x++notBlocked :: a -> Blocked a+notBlocked = NotBlocked++ignoreBlocking :: Blocked a -> a+ignoreBlocking (Blocked _ x) = x+ignoreBlocking (NotBlocked x) = x++---------------------------------------------------------------------------+-- * Simple operations on terms and types.+---------------------------------------------------------------------------++-- | Removing a topmost 'DontCare' constructor.+stripDontCare :: Term -> Term+stripDontCare v = case ignoreSharing v of+ DontCare v -> v+ _ -> v++-- | Doesn't do any reduction.+arity :: Type -> Nat+arity t = case ignoreSharing $ unEl t of+ Pi _ b -> 1 + arity (unAbs b)+ _ -> 0++-- | Suggest a name for the first argument of a function of the given type.+argName :: Type -> String+argName = argN . ignoreSharing . unEl+ where+ argN (Pi _ b) = "." ++ absName b+ argN _ = __IMPOSSIBLE__++---------------------------------------------------------------------------+-- * Show instances.+---------------------------------------------------------------------------++instance Show a => Show (Abs a) where+ showsPrec p (Abs x a) = showParen (p > 0) $+ showString "Abs " . shows x . showString " " . showsPrec 10 a+ showsPrec p (NoAbs x a) = showParen (p > 0) $+ showString "NoAbs " . shows x . showString " " . showsPrec 10 a++instance Show MetaId where+ show (MetaId n) = "_" ++ show n+ instance Show t => Show (Blocked t) where showsPrec p (Blocked m x) = showParen (p > 0) $ showString "Blocked " . shows m . showString " " . showsPrec 10 x showsPrec p (NotBlocked x) = showsPrec p x -instance Applicative Blocked where- pure = notBlocked- Blocked x f <*> e = Blocked x $ f (ignoreBlocking e)- NotBlocked f <*> e = f <$> e+---------------------------------------------------------------------------+-- * Sized instances.+--------------------------------------------------------------------------- instance Sized Term where size v = case v of@@ -104,6 +373,7 @@ Pi a b -> 1 + size a + size b Sort s -> 1 DontCare mv -> size mv+ Shared p -> size (derefPtr p) instance Sized Type where size = size . unEl@@ -113,14 +383,25 @@ instance Sized PlusLevel where size (ClosedLevel _) = 1- size (Plus _ a) = size a+ size (Plus _ a) = size a instance Sized LevelAtom where- size (MetaLevel _ vs) = 1 + Prelude.sum (map size vs)+ size (MetaLevel _ vs) = 1 + Prelude.sum (map size vs) size (BlockedLevel _ v) = size v- size (NeutralLevel v) = size v+ size (NeutralLevel v) = size v size (UnreducedLevel v) = size v +instance Sized (Tele a) where+ size EmptyTel = 0+ size (ExtendTel _ tel) = 1 + size tel++instance Sized a => Sized (Abs a) where+ size = size . unAbs++---------------------------------------------------------------------------+-- * KillRange instances.+---------------------------------------------------------------------------+ instance KillRange Term where killRange v = case v of Var i vs -> killRange1 (Var i) vs@@ -133,6 +414,7 @@ Pi a b -> killRange2 Pi a b Sort s -> killRange1 Sort s DontCare mv -> killRange1 DontCare mv+ Shared p -> Shared $ updatePtr killRange p instance KillRange Level where killRange (Max as) = killRange1 Max as@@ -172,156 +454,12 @@ instance KillRange a => KillRange (Abs a) where killRange = fmap killRange --- | Type of argument lists.----type Args = [Arg Term]---- | Sequence of types. An argument of the first type is bound in later types--- and so on.-data Tele a = EmptyTel- | ExtendTel a (Abs (Tele a)) -- ^ Abs is never NoAbs.- deriving (Typeable, Data, Show, Functor, Foldable, Traversable)--type Telescope = Tele (Arg Type)--instance Sized (Tele a) where- size EmptyTel = 0- size (ExtendTel _ tel) = 1 + size tel---- | The body has (at least) one free variable.-data Abs a = Abs String a- | NoAbs String a- deriving (Typeable, Data, Functor, Foldable, Traversable)---- | Danger: doesn't shift variables properly-unAbs :: Abs a -> a-unAbs (Abs _ v) = v-unAbs (NoAbs _ v) = v--absName :: Abs a -> String-absName (Abs x _) = x-absName (NoAbs x _) = x--instance Show a => Show (Abs a) where- showsPrec p (Abs x a) = showParen (p > 0) $- showString "Abs " . shows x . showString " " . showsPrec 10 a- showsPrec p (NoAbs x a) = showParen (p > 0) $- showString "NoAbs " . shows x . showString " " . showsPrec 10 a--instance Sized a => Sized (Abs a) where- size = size . unAbs------- Definitions------- | A clause is a list of patterns and the clause body should @Bind@.------ The telescope contains the types of the pattern variables and the--- permutation is how to get from the order the variables occur in--- the patterns to the order they occur in the telescope. The body--- binds the variables in the order they appear in the patterns.------ For the purpose of the permutation and the body dot patterns count--- as variables. TODO: Change this!-data Clause = Clause- { clauseRange :: Range- , clauseTel :: Telescope- , clausePerm :: Permutation- , clausePats :: [Arg Pattern]- , clauseBody :: ClauseBody- }- deriving (Typeable, Data, Show)-data ClauseBody = Body Term- | Bind (Abs ClauseBody)- | NoBody -- ^ for absurd clauses.- deriving (Typeable, Data, Show)--instance HasRange Clause where- getRange = clauseRange---- | Patterns are variables, constructors, or wildcards.--- @QName@ is used in @ConP@ rather than @Name@ since--- a constructor might come from a particular namespace.--- This also meshes well with the fact that values (i.e.--- the arguments we are matching with) use @QName@.----data Pattern = VarP String -- name suggestion- | DotP Term- | ConP QName (Maybe (Arg Type)) [Arg Pattern]- -- ^ The type is @'Just' t@' iff the pattern is a- -- record pattern. The scope used for the type is given- -- by any outer scope plus the clause's telescope- -- ('clauseTel').- | LitP Literal- deriving (Typeable, Data, Show)--newtype MetaId = MetaId Nat- deriving (Eq, Ord, Num, Real, Enum, Integral, Typeable, Data)--instance Show MetaId where- show (MetaId n) = "_" ++ show n---- | Doesn't do any reduction.-arity :: Type -> Nat-arity t = case unEl t of- Pi _ b -> 1 + arity (unAbs b)- _ -> 0---- | Suggest a name for the first argument of a function of the given type.-argName :: Type -> String-argName = argN . unEl- where- argN (Pi _ b) = "." ++ absName b- argN _ = __IMPOSSIBLE__-- ------------------------------------------------------------------------------ * Smart constructors+-- * UniverseBi instances. --------------------------------------------------------------------------- -blockingMeta :: Blocked t -> Maybe MetaId-blockingMeta (Blocked m _) = Just m-blockingMeta (NotBlocked _) = Nothing--blocked :: MetaId -> a -> Blocked a-blocked x = Blocked x--notBlocked :: a -> Blocked a-notBlocked = NotBlocked--ignoreBlocking :: Blocked a -> a-ignoreBlocking (Blocked _ x) = x-ignoreBlocking (NotBlocked x) = x--set0 = set 0-set n = sort $ mkType n-prop = sort Prop-sort s = El (sSuc s) $ Sort s-varSort n = Type $ Max [Plus 0 $ NeutralLevel $ Var n []]---- | Get the next higher sort.-sSuc :: Sort -> Sort-sSuc Prop = mkType 1-sSuc Inf = Inf-sSuc (DLub a b) = DLub (sSuc a) (fmap sSuc b)-sSuc (Type l) = Type $ levelSuc l--levelSuc (Max []) = Max [ClosedLevel 1]-levelSuc (Max as) = Max $ map inc as- where inc (ClosedLevel n) = ClosedLevel (n + 1)- inc (Plus n l) = Plus (n + 1) l--mkType n = Type $ Max [ClosedLevel n | n > 0]--getSort :: Type -> Sort-getSort (El s _) = s--unEl :: Type -> Term-unEl (El _ t) = t--impossibleTerm :: String -> Int -> Term-impossibleTerm file line = Lit $ LitString noRange $ unlines- [ "An internal error has occurred. Please report this as a bug."- , "Location of the error: " ++ file ++ ":" ++ show line- ]+instanceUniverseBiT' [] [t| (([Type], [Clause]), Pattern) |]+instanceUniverseBiT' [] [t| (Args, Pattern) |]+instanceUniverseBiT' [] [t| (([Type], [Clause]), Term) |]+instanceUniverseBiT' [] [t| (Args, Term) |]+instanceUniverseBiT' [] [t| ([Term], Term) |]
src/full/Agda/Syntax/Internal/Generic.hs view
@@ -22,6 +22,11 @@ traverseTermM f = traverse (traverseTermM f) foldTerm f = foldMap (foldTerm f) +instance TermLike a => TermLike (Dom a) where+ traverseTerm f = fmap (traverseTerm f)+ traverseTermM f = traverse (traverseTermM f)+ foldTerm f = foldMap (foldTerm f)+ instance TermLike a => TermLike [a] where traverseTerm f = fmap (traverseTerm f) traverseTermM f = traverse (traverseTermM f)@@ -42,6 +47,11 @@ traverseTermM f = traverse (traverseTermM f) foldTerm f = foldMap (foldTerm f) +instance TermLike a => TermLike (Ptr a) where+ traverseTerm f = fmap (traverseTerm f)+ traverseTermM f = traverse (traverseTermM f)+ foldTerm f = foldMap (foldTerm f)+ instance TermLike Term where traverseTerm f t = case t of Var i xs -> f $ Var i $ traverseTerm f xs@@ -54,6 +64,7 @@ Lit _ -> f t Sort _ -> f t DontCare mv -> f $ DontCare $ traverseTerm f mv+ Shared p -> f $ Shared $ traverseTerm f p traverseTermM f t = case t of Var i xs -> f =<< Var i <$> traverseTermM f xs@@ -66,6 +77,7 @@ Lit _ -> f t Sort _ -> f t DontCare mv -> f =<< DontCare <$> traverseTermM f mv+ Shared p -> f =<< Shared <$> traverseTermM f p foldTerm f t = f t `mappend` case t of Var i xs -> foldTerm f xs@@ -78,6 +90,7 @@ Lit _ -> mempty Sort _ -> mempty DontCare mv -> foldTerm f mv+ Shared p -> foldTerm f p instance TermLike Level where traverseTerm f (Max as) = Max $ traverseTerm f as@@ -115,3 +128,8 @@ traverseTerm f (El s t) = El s $ traverseTerm f t traverseTermM f (El s t) = El s <$> traverseTermM f t foldTerm f (El s t) = foldTerm f t++-- | Put it in a monad to make it possible to do strictly.+copyTerm :: (TermLike a, Applicative m, Monad m) => a -> m a+copyTerm = traverseTermM return+
src/full/Agda/Syntax/Literal.hs view
@@ -1,7 +1,7 @@ {-# LANGUAGE DeriveDataTypeable #-} module Agda.Syntax.Literal where -import Data.Generics (Typeable, Data)+import Data.Typeable (Typeable) import Agda.Syntax.Position import Agda.Syntax.Abstract.Name @@ -10,7 +10,18 @@ | LitString Range String | LitChar Range Char | LitQName Range QName- deriving (Typeable, Data, Show)+ deriving (Typeable)++instance Show Literal where+ showsPrec p l = showParen (p > 9) $ case l of+ LitInt _ n -> sh "LitInt" n+ LitFloat _ x -> sh "LitFloat" x+ LitString _ s -> sh "LitString" s+ LitChar _ c -> sh "LitChar" c+ LitQName _ q -> sh "LitQName" q+ where+ sh :: Show a => String -> a -> ShowS+ sh c x = showString (c ++ " ") . shows x instance Eq Literal where LitInt _ n == LitInt _ m = n == m
src/full/Agda/Syntax/Notation.hs view
@@ -8,7 +8,7 @@ import Control.Monad.Error (throwError) import Data.List import Data.Maybe-import Data.Generics (Typeable, Data)+import Data.Typeable (Typeable) import System.FilePath @@ -46,7 +46,7 @@ data GenPart = BindHole Int -- ^ Argument is the position of the hole (with binding) where the binding should occur. | NormalHole Int -- ^ Argument is where the expression should go | IdPart String- deriving (Data, Typeable, Show, Eq)+ deriving (Typeable, Show, Eq) -- | Get a flat list of identifier parts of a notation. stringParts :: Notation -> [String]
src/full/Agda/Syntax/Parser.hs view
@@ -24,7 +24,6 @@ import qualified Agda.Syntax.Parser.Monad as M import qualified Agda.Syntax.Parser.Parser as P import Agda.Syntax.Parser.Lexer-import Agda.Syntax.Strict import Agda.Syntax.Concrete import Agda.Syntax.Parser.Tokens @@ -33,11 +32,11 @@ ------------------------------------------------------------------------ -- Wrapping parse results -wrap :: Strict a => ParseResult a -> a+wrap :: ParseResult a -> a wrap (ParseOk _ x) = x wrap (ParseFailed err) = throw err -wrapM:: (Strict a, Monad m) => m (ParseResult a) -> m a+wrapM:: Monad m => m (ParseResult a) -> m a wrapM m = do r <- m case r of@@ -54,25 +53,25 @@ , parseFlags :: ParseFlags } -parse :: Strict a => Parser a -> String -> IO a+parse :: Parser a -> String -> IO a parse p = wrapM . return . M.parse (parseFlags p) [normal] (parser p) -parseFile :: Strict a => Parser a -> AbsolutePath -> IO a+parseFile :: Parser a -> AbsolutePath -> IO a parseFile p = wrapM . M.parseFile (parseFlags p) [normal] (parser p) -parseLiterate :: Strict a => Parser a -> String -> IO a+parseLiterate :: Parser a -> String -> IO a parseLiterate p = wrapM . return . M.parse (parseFlags p) [literate, code] (parser p) -parseLiterateFile :: Strict a => Parser a -> AbsolutePath -> IO a+parseLiterateFile :: Parser a -> AbsolutePath -> IO a parseLiterateFile p = wrapM . M.parseFile (parseFlags p) [literate, code] (parser p) -parsePosString :: Strict a => Parser a -> Position -> String -> IO a+parsePosString :: Parser a -> Position -> String -> IO a parsePosString p pos = wrapM . return . M.parsePosString pos (parseFlags p) [normal] (parser p) -parseFile' :: Strict a => Parser a -> AbsolutePath -> IO a+parseFile' :: Parser a -> AbsolutePath -> IO a parseFile' p file = if "lagda" `isSuffixOf` filePath file then Agda.Syntax.Parser.parseLiterateFile p file
src/full/Agda/Syntax/Parser/LexActions.hs view
@@ -215,7 +215,9 @@ [x] -> return $ tok $ Left x xs -> return $ tok $ Right xs where- -- Compute the ranges for the substrings (separated by '.') of a name.+ -- Compute the ranges for the substrings (separated by '.') of+ -- a name. Dots are included: the intervals generated for+ -- "A.B.x" correspond to "A.", "B." and "x". mkName :: Interval -> [String] -> [(Interval, String)] mkName _ [] = [] mkName i [x] = [(i, x)]@@ -223,9 +225,9 @@ where p0 = iStart i p1 = iEnd i- p' = movePosByString p0 x+ p' = movePos (movePosByString p0 x) '.' i0 = Interval p0 p'- i1 = Interval (movePos p' '.') p1+ i1 = Interval p' p1 {--------------------------------------------------------------------------
src/full/Agda/Syntax/Parser/Lexer.x view
@@ -73,22 +73,23 @@ <pragma_> $white_notab ; -- Pragmas-<0,code> "{-#" { begin pragma }-<pragma_> "{-#" { symbol SymOpenPragma }-<pragma_> "#-}" { endWith $ symbol SymClosePragma }-<pragma_> "OPTIONS" { keyword KwOPTIONS }-<pragma_> "BUILTIN" { keyword KwBUILTIN }-<pragma_> "COMPILED_DATA" { keyword KwCOMPILED_DATA }-<pragma_> "COMPILED_TYPE" { keyword KwCOMPILED_TYPE }-<pragma_> "COMPILED" { keyword KwCOMPILED }-<pragma_> "COMPILED_EPIC" { keyword KwCOMPILED_EPIC }-<pragma_> "COMPILED_JS" { keyword KwCOMPILED_JS }-<pragma_> "STATIC" { keyword KwSTATIC }-<pragma_> "IMPORT" { keyword KwIMPORT }-<pragma_> "IMPOSSIBLE" { keyword KwIMPOSSIBLE }-<pragma_> "ETA" { keyword KwETA }-<pragma_> "LINE" { keyword KwLINE }-<pragma_> . # [ $white ] + { withInterval $ TokString }+<0,code> "{-#" { begin pragma }+<pragma_> "{-#" { symbol SymOpenPragma }+<pragma_> "#-}" { endWith $ symbol SymClosePragma }+<pragma_> "OPTIONS" { keyword KwOPTIONS }+<pragma_> "BUILTIN" { keyword KwBUILTIN }+<pragma_> "COMPILED_DATA" { keyword KwCOMPILED_DATA }+<pragma_> "COMPILED_TYPE" { keyword KwCOMPILED_TYPE }+<pragma_> "COMPILED" { keyword KwCOMPILED }+<pragma_> "COMPILED_EPIC" { keyword KwCOMPILED_EPIC }+<pragma_> "COMPILED_JS" { keyword KwCOMPILED_JS }+<pragma_> "STATIC" { keyword KwSTATIC }+<pragma_> "IMPORT" { keyword KwIMPORT }+<pragma_> "IMPOSSIBLE" { keyword KwIMPOSSIBLE }+<pragma_> "ETA" { keyword KwETA }+<pragma_> "NO_TERMINATION_CHECK" { keyword KwNO_TERMINATION_CHECK }+<pragma_> "LINE" { keyword KwLINE }+<pragma_> . # [ $white ] + { withInterval $ TokString } -- Comments -- We need to rule out pragmas here. Usually longest match would take@@ -142,6 +143,8 @@ <0,code> codata { keyword KwCoData } <0,code> record { keyword KwRecord } <0,code> constructor { keyword KwConstructor }+<0,code> inductive { keyword KwInductive }+<0,code> coinductive { keyword KwCoInductive } <0,code> infix { keyword KwInfix } <0,code> infixl { keyword KwInfixL } <0,code> infixr { keyword KwInfixR }@@ -156,7 +159,8 @@ <0,code> quote { keyword KwQuote } <0,code> quoteTerm { keyword KwQuoteTerm } <0,code> unquote { keyword KwUnquote }-<0,code> syntax { keyword KwSyntax }+<0,code> syntax { keyword KwSyntax }+<0,code> pattern { keyword KwPatternSyn } -- The parser is responsible to put the lexer in the imp_dir_ state when it -- expects an import directive keyword. This means that if you run the
src/full/Agda/Syntax/Parser/Parser.y view
@@ -1,9 +1,20 @@ { {-# OPTIONS_GHC -fno-warn-incomplete-patterns -fno-warn-deprecated-flags #-}-{-# LANGUAGE BangPatterns #-}+{-# LANGUAGE BangPatterns, PatternGuards #-} {-| The parser is generated by Happy (<http://www.haskell.org/happy>).--}+ -+ - Ideally, ranges should be as precise as possible, to get messages that+ - emphasize precisely the faulting term(s) upon error.+ -+ - However, interactive highlighting is only applied at the end of each+ - mutual block, keywords are only highlighted once (see+ - `TypeChecking.Rules.Decl'). So if the ranges of two declarations+ - interleave, one must ensure that keyword ranges are not included in+ - the intersection. (Otherwise they are uncolored by the interactive+ - highlighting.)+ -+ -} module Agda.Syntax.Parser.Parser ( moduleParser , exprParser@@ -31,9 +42,11 @@ import Agda.Syntax.Notation import Agda.Syntax.Literal +import Agda.Utils.Hash import Agda.Utils.Monad import Agda.Utils.QuickCheck import Agda.Utils.TestHelpers+import Agda.Utils.Tuple } %name tokensParser Tokens@@ -69,6 +82,8 @@ 'codata' { TokKeyword KwCoData $$ } 'record' { TokKeyword KwRecord $$ } 'constructor' { TokKeyword KwConstructor $$ }+ 'inductive' { TokKeyword KwInductive $$ }+ 'coinductive' { TokKeyword KwCoInductive $$ } 'field' { TokKeyword KwField $$ } 'infix' { TokKeyword KwInfix $$ } 'infixl' { TokKeyword KwInfixL $$ }@@ -80,11 +95,13 @@ 'Set' { TokKeyword KwSet $$ } 'forall' { TokKeyword KwForall $$ } 'syntax' { TokKeyword KwSyntax $$ }+ 'pattern' { TokKeyword KwPatternSyn $$ } 'OPTIONS' { TokKeyword KwOPTIONS $$ } 'BUILTIN' { TokKeyword KwBUILTIN $$ } 'IMPORT' { TokKeyword KwIMPORT $$ } 'IMPOSSIBLE' { TokKeyword KwIMPOSSIBLE $$ } 'ETA' { TokKeyword KwETA $$ }+ 'NO_TERMINATION_CHECK' { TokKeyword KwNO_TERMINATION_CHECK $$ } 'COMPILED' { TokKeyword KwCOMPILED $$ } 'COMPILED_DATA' { TokKeyword KwCOMPILED_DATA $$ } 'COMPILED_TYPE' { TokKeyword KwCOMPILED_TYPE $$ }@@ -168,6 +185,8 @@ | 'codata' { TokKeyword KwCoData $1 } | 'record' { TokKeyword KwRecord $1 } | 'constructor' { TokKeyword KwConstructor $1 }+ | 'inductive' { TokKeyword KwInductive $1 }+ | 'coinductive' { TokKeyword KwCoInductive $1 } | 'field' { TokKeyword KwField $1 } | 'infix' { TokKeyword KwInfix $1 } | 'infixl' { TokKeyword KwInfixL $1 }@@ -179,6 +198,7 @@ | 'Set' { TokKeyword KwSet $1 } | 'forall' { TokKeyword KwForall $1 } | 'syntax' { TokKeyword KwSyntax $1 }+ | 'pattern' { TokKeyword KwPatternSyn $1 } | 'OPTIONS' { TokKeyword KwOPTIONS $1 } | 'BUILTIN' { TokKeyword KwBUILTIN $1 } | 'IMPORT' { TokKeyword KwIMPORT $1 }@@ -190,6 +210,7 @@ | 'STATIC' { TokKeyword KwSTATIC $1 } | 'IMPOSSIBLE' { TokKeyword KwIMPOSSIBLE $1 } | 'ETA' { TokKeyword KwETA $1 }+ | 'NO_TERMINATION_CHECK' { TokKeyword KwNO_TERMINATION_CHECK $1 } | 'quoteGoal' { TokKeyword KwQuoteGoal $1 } | 'quote' { TokKeyword KwQuote $1 } | 'quoteTerm' { TokKeyword KwQuoteTerm $1 }@@ -315,7 +336,7 @@ posPos (fromJust (rStart (getRange $1))) > 2 then parseErrorAt (fromJust (rStart (getRange $2))) "Expecting '}}', found separated '}'s."- else return $ fuseRange (getRange $1) (getRange ($2))+ else return $ getRange ($1, $2) } {- UNUSED@@ -486,7 +507,9 @@ Expr : TeleArrow Expr { Pi $1 $2 } | 'forall' ForallBindings Expr { forallPi $2 $3 }- | Application3 '->' Expr { Fun (fuseRange $1 $3) (RawApp (getRange $1) $1) $3 }+ | Application3 '->' Expr { Fun (getRange ($1,$2,$3))+ (RawApp (getRange $1) $1)+ $3 } | Expr1 %prec LOWEST { $1 } -- Level 1: Application@@ -509,8 +532,15 @@ -- Level 2: Lambdas and lets Expr2- : '\\' LamBindings Expr { Lam (fuseRange $1 $3) $2 $3 }- | '\\' '{' LamClauses '}' { ExtendedLam (fuseRange $1 (fuseRange $2 $4)) (reverse $3) }+ : '\\' LamBindings Expr { Lam (getRange ($1,$2,$3)) $2 $3 }+ | ExtendedOrAbsurdLam { $1 }+ | 'let' Declarations 'in' Expr { Let (getRange ($1,$2,$3,$4)) $2 $4 }+ | Expr3 { $1 }+ | 'quoteGoal' Id 'in' Expr { QuoteGoal (getRange ($1,$2,$3,$4)) $2 $4 }++ExtendedOrAbsurdLam :: { Expr }+ExtendedOrAbsurdLam+ : '\\' '{' LamClauses '}' { ExtendedLam (getRange ($1,$2,$3,$4)) (reverse $3) } | '\\' AbsurdLamBindings {% case $2 of Left (bs, h) -> if null bs then return $ AbsurdLam r h else return $ Lam r bs (AbsurdLam r h)@@ -520,9 +550,6 @@ return $ ExtendedLam (fuseRange $1 es) [(p [] [], AbsurdRHS, NoWhere)] }- | 'let' Declarations 'in' Expr { Let (fuseRange $1 $4) $2 $4 }- | Expr3 { $1 }- | 'quoteGoal' Id 'in' Expr { QuoteGoal (getRange ($1,$4)) $2 $4} Application3 :: { [Expr] } Application3@@ -531,8 +558,9 @@ -- Level 3: Atoms Expr3Curly- : '{' Expr '}' { HiddenArg (fuseRange $1 $3) (unnamed $2) }- | '{' Id '=' Expr '}' { HiddenArg (fuseRange $1 $5) (named (show $2) $4) }+ : '{' Expr '}' { HiddenArg (getRange ($1,$2,$3)) (unnamed $2) }+ | '{' Id '=' Expr '}' { HiddenArg (getRange ($1,$2,$3,$4,$5))+ (named (show $2) $4) } | '{' '}' { let r = fuseRange $1 $2 in HiddenArg r $ unnamed $ Absurd r } Expr3NoCurly@@ -546,15 +574,17 @@ | 'quoteTerm' { QuoteTerm (getRange $1) } | 'unquote' { Unquote (getRange $1) } | setN { SetN (getRange (fst $1)) (snd $1) }- | '{{' Expr DoubleCloseBrace { InstanceArg (fuseRange $1 $3) (unnamed $2) }- | '{{' Id '=' Expr DoubleCloseBrace { InstanceArg (fuseRange $1 $5) (named (show $2) $4) }- | '(' Expr ')' { Paren (fuseRange $1 $3) $2 }+ | '{{' Expr DoubleCloseBrace { InstanceArg (getRange ($1,$2,$3))+ (unnamed $2) }+ | '{{' Id '=' Expr DoubleCloseBrace { InstanceArg (getRange ($1,$2,$3,$4,$5))+ (named (show $2) $4) }+ | '(' Expr ')' { Paren (getRange ($1,$2,$3)) $2 } | '(' ')' { Absurd (fuseRange $1 $2) } | '{{' DoubleCloseBrace { let r = fuseRange $1 $2 in InstanceArg r $ unnamed $ Absurd r }- | Id '@' Expr3 { As (fuseRange $1 $3) $1 $3 }+ | Id '@' Expr3 { As (getRange ($1,$2,$3)) $1 $3 } | '.' Expr3 { Dot (fuseRange $1 $2) $2 }- | 'record' '{' FieldAssignments '}' { Rec (getRange ($1,$4)) $3 }- | 'record' Expr3NoCurly '{' FieldAssignments '}' { RecUpdate (getRange ($1,$5)) $2 $4 }+ | 'record' '{' FieldAssignments '}' { Rec (getRange ($1,$2,$3,$4)) $3 }+ | 'record' Expr3NoCurly '{' FieldAssignments '}' { RecUpdate (getRange ($1,$2,$3,$4,$5)) $2 $4 } Expr3 : Expr3Curly { $1 }@@ -595,20 +625,21 @@ -- Andreas, 2011-04-27: or ..(x1 .. xn : A) or ..{y1 .. ym : B} TypedBindings :: { TypedBindings } TypedBindings- : '.' '(' TBind ')' { TypedBindings (fuseRange $2 $4) (Arg NotHidden Irrelevant $3) }- | '.' '{' TBind '}' { TypedBindings (fuseRange $2 $4) (Arg Hidden Irrelevant $3) }- | '.' '{{' TBind DoubleCloseBrace { TypedBindings (fuseRange $1 $3) (Arg Instance Irrelevant $3) }- | '..' '(' TBind ')' { TypedBindings (fuseRange $2 $4) (Arg NotHidden NonStrict $3) }- | '..' '{' TBind '}' { TypedBindings (fuseRange $2 $4) (Arg Hidden NonStrict $3) }- | '..' '{{' TBind DoubleCloseBrace { TypedBindings (fuseRange $1 $3) (Arg Instance NonStrict $3) }- | '(' TBind ')' { TypedBindings (fuseRange $1 $3) (Arg NotHidden Relevant $2) }- | '{{' TBind DoubleCloseBrace { TypedBindings (fuseRange $1 $3) (Arg Instance Relevant $2) }- | '{' TBind '}' { TypedBindings (fuseRange $1 $3) (Arg Hidden Relevant $2) }+ : '.' '(' TBind ')' { TypedBindings (getRange ($2,$3,$4)) (Arg NotHidden Irrelevant $3) }+ | '.' '{' TBind '}' { TypedBindings (getRange ($2,$3,$4)) (Arg Hidden Irrelevant $3) }+ | '.' '{{' TBind DoubleCloseBrace { TypedBindings (getRange ($2,$3,$4))+ (Arg Instance Irrelevant $3) }+ | '..' '(' TBind ')' { TypedBindings (getRange ($2,$3,$4)) (Arg NotHidden NonStrict $3) }+ | '..' '{' TBind '}' { TypedBindings (getRange ($2,$3,$4)) (Arg Hidden NonStrict $3) }+ | '..' '{{' TBind DoubleCloseBrace { TypedBindings (getRange ($2,$3,$4)) (Arg Instance NonStrict $3) }+ | '(' TBind ')' { TypedBindings (getRange ($1,$2,$3)) (Arg NotHidden Relevant $2) }+ | '{{' TBind DoubleCloseBrace { TypedBindings (getRange ($1,$2,$3)) (Arg Instance Relevant $2) }+ | '{' TBind '}' { TypedBindings (getRange ($1,$2,$3)) (Arg Hidden Relevant $2) } -- x1 .. xn:A TBind :: { TypedBinding }-TBind : CommaBIds ':' Expr { TBind (fuseRange $1 $3) (map mkBoundName_ $1) $3 }+TBind : CommaBIds ':' Expr { TBind (getRange ($1,$2,$3)) (map mkBoundName_ $1) $3 } -- A non-empty sequence of lambda bindings.@@ -747,11 +778,11 @@ --------------------------------------------------------------------------} -- You can rename imports-ImportImportDirective :: { (Maybe AsName, ImportDirective) }-ImportImportDirective- : ImportDirective { (Nothing, $1) }- | id Id ImportDirective {% isName "as" $1 >>- return (Just (AsName $2 (getRange (fst $1))), $3) }+-- ImportImportDirective :: { (Maybe AsName, ImportDirective) }+-- ImportImportDirective+-- : ImportDirective { (Nothing, $1) }+-- | id Id ImportDirective {% isName "as" $1 >>+-- return (Just (AsName $2 (getRange (fst $1))), $3) } -- Import directives ImportDirective :: { ImportDirective }@@ -768,17 +799,17 @@ : UsingOrHiding RenamingDir { ImportDirective (fuseRange (snd $1) (snd $2)) (fst $1) (fst $2) False } | RenamingDir { ImportDirective (getRange (snd $1)) (Hiding []) (fst $1) False } | UsingOrHiding { ImportDirective (getRange (snd $1)) (fst $1) [] False }- | {- empty -} { ImportDirective noRange (Hiding []) [] False }+ | {- empty -} { defaultImportDir } UsingOrHiding :: { (UsingOrHiding , Range) } UsingOrHiding- : 'using' '(' CommaImportNames ')' { (Using $3 , fuseRange $1 $4) }+ : 'using' '(' CommaImportNames ')' { (Using $3 , getRange ($1,$2,$3,$4)) } -- only using can have an empty list- | 'hiding' '(' CommaImportNames1 ')' { (Hiding $3 , fuseRange $1 $4) }+ | 'hiding' '(' CommaImportNames1 ')' { (Hiding $3 , getRange ($1,$2,$3,$4)) } RenamingDir :: { ([Renaming] , Range) } RenamingDir- : 'renaming' '(' Renamings ')' { ($3 , fuseRange $1 $4) }+ : 'renaming' '(' Renamings ')' { ($3 , getRange ($1,$2,$3,$4)) } -- Renamings of the form 'x to y' Renamings :: { [Renaming] }@@ -821,7 +852,7 @@ LHS : Expr1 RewriteEquations WithExpressions {% exprToLHS $1 >>= \p -> return (p $2 $3) } | '...' WithPats RewriteEquations WithExpressions- { Ellipsis (fuseRange $1 $3) $2 $3 $4 }+ { Ellipsis (getRange ($1,$2,$3,$4)) $2 $3 $4 } WithPats :: { [Pattern] } WithPats : {- empty -} { [] }@@ -857,9 +888,8 @@ -- Top-level definitions. Declaration :: { [Declaration] } Declaration- : RelTypeSig { [$1] } -- Possibly dotted type signature.- | Fields { $1 }- | FunClause { [$1] }+ : Fields { $1 }+ | FunClause { $1 } | Data { [$1] } | DataSig { [$1] } -- lone data type signature in mutual block | Record { [$1] }@@ -870,12 +900,13 @@ | Private { [$1] } | Postulate { [$1] } | Primitive { [$1] }- | Open { [$1] }- | Import { [$1] }+ | Open { $1 }+-- | Import { [$1] } | ModuleMacro { [$1] } | Module { [$1] } | Pragma { [$1] } | Syntax { [$1] }+ | PatternSyn { [$1] } {--------------------------------------------------------------------------@@ -887,12 +918,6 @@ TypeSigs :: { [Declaration] } TypeSigs : SpaceIds ':' Expr { map (flip (TypeSig Relevant) $3) $1 } --- Some declaration can include relevance information (axioms, functions)-RelTypeSig :: { Declaration }-RelTypeSig- : '.' Id ':' Expr { TypeSig Irrelevant $2 $4 }- | Id ':' Expr { TypeSig Relevant $1 $3 }- RelTypeSigs :: { [Declaration] } RelTypeSigs : MaybeDottedIds ':' Expr { map (\ (Arg _ rel x) -> TypeSig rel x $3) $1 } @@ -904,44 +929,50 @@ -- Function declarations. The left hand side is parsed as an expression to allow -- declarations like 'x::xs ++ ys = e', when '::' has higher precedence than '++'.-FunClause :: { Declaration }-FunClause : LHS RHS WhereClause { FunClause $1 $2 $3 }+-- FunClause also handle possibly dotted type signatures.+FunClause :: { [Declaration] }+FunClause : LHS RHS WhereClause {% funClauseOrTypeSigs $1 $2 $3 } -RHS :: { RHS }-RHS : '=' Expr { RHS $2 }- | {- empty -} { AbsurdRHS }+RHS :: { RHSOrTypeSigs }+RHS : '=' Expr { JustRHS (RHS $2) }+ | ':' Expr { TypeSigsRHS $2 }+ | {- empty -} { JustRHS AbsurdRHS } -- Data declaration. Can be local. Data :: { Declaration } Data : 'data' Id TypedUntypedBindings ':' Expr 'where'- Constructors { Data (getRange ($1, $6, $7)) Inductive $2 $3 (Just $5) $7 }+ Constructors { Data (getRange ($1,$2,$3,$4,$5,$6,$7)) Inductive $2 $3 (Just $5) $7 } | 'codata' Id TypedUntypedBindings ':' Expr 'where'- Constructors { Data (getRange ($1, $6, $7)) CoInductive $2 $3 (Just $5) $7 }+ Constructors { Data (getRange ($1,$2,$3,$4,$5,$6,$7)) CoInductive $2 $3 (Just $5) $7 } -- New cases when we already had a DataSig. Then one can omit the sort. | 'data' Id TypedUntypedBindings 'where'- Constructors { Data (getRange ($1, $4, $5)) Inductive $2 $3 Nothing $5 }+ Constructors { Data (getRange ($1,$2,$3,$4,$5)) Inductive $2 $3 Nothing $5 } | 'codata' Id TypedUntypedBindings 'where'- Constructors { Data (getRange ($1, $4, $5)) CoInductive $2 $3 Nothing $5 }+ Constructors { Data (getRange ($1,$2,$3,$4,$5)) CoInductive $2 $3 Nothing $5 } -- Data type signature. Found in mutual blocks. DataSig :: { Declaration } DataSig : 'data' Id TypedUntypedBindings ':' Expr- { DataSig (fuseRange $1 $5) Inductive $2 $3 $5 }+ { DataSig (getRange ($1,$2,$3,$4,$5)) Inductive $2 $3 $5 } +-- Andreas, 2012-03-16: The Expr3NoCurly instead of Id in everything+-- following 'record' is to remove the (harmless) shift/reduce conflict+-- introduced by record update expressions.+ -- Record declarations. Record :: { Declaration }-Record : 'record' Id TypedUntypedBindings ':' Expr 'where'+Record : 'record' Expr3NoCurly TypedUntypedBindings ':' Expr 'where' RecordDeclarations- { Record (getRange ($1, $6, $7)) $2 (fst $7) $3 (Just $5) (snd $7) }- | 'record' Id TypedUntypedBindings 'where'+ {% exprToName $2 >>= \ n -> return $ Record (getRange ($1,$2,$3,$4,$5,$6,$7)) n (fst3 $7) (snd3 $7) $3 (Just $5) (thd3 $7) }+ | 'record' Expr3NoCurly TypedUntypedBindings 'where' RecordDeclarations- { Record (getRange ($1, $4, $5)) $2 (fst $5) $3 Nothing (snd $5) }+ {% exprToName $2 >>= \ n -> return $ Record (getRange ($1,$2,$3,$4,$5)) n (fst3 $5) (snd3 $5) $3 Nothing (thd3 $5) } -- Record type signature. In mutual blocks. RecordSig :: { Declaration }-RecordSig : 'record' Id TypedUntypedBindings ':' Expr- { RecordSig (fuseRange $1 $5) $2 $3 $5 }+RecordSig : 'record' Expr3NoCurly TypedUntypedBindings ':' Expr+ {% exprToName $2 >>= \ n -> return $ RecordSig (getRange ($1,$2,$3,$4,$5)) n $3 $5 } -- Declaration of record constructor name. RecordConstructorName :: { Name }@@ -949,9 +980,9 @@ -- Fixity declarations. Infix :: { Declaration }-Infix : 'infix' Int SpaceBIds { Infix (NonAssoc (fuseRange $1 $3) $2) $3 }- | 'infixl' Int SpaceBIds { Infix (LeftAssoc (fuseRange $1 $3) $2) $3 }- | 'infixr' Int SpaceBIds { Infix (RightAssoc (fuseRange $1 $3) $2) $3 }+Infix : 'infix' Int SpaceBIds { Infix (NonAssoc (getRange ($1,$3)) $2) $3 }+ | 'infixl' Int SpaceBIds { Infix (LeftAssoc (getRange ($1,$3)) $2) $3 }+ | 'infixr' Int SpaceBIds { Infix (RightAssoc (getRange ($1,$3)) $2) $3 } -- Field declarations. Fields :: { [Declaration] }@@ -992,6 +1023,13 @@ _ -> parseError "syntax declarations are allowed only for simple names (without holes)" } +-- Pattern synonyms.+PatternSyn :: { Declaration }+PatternSyn : 'pattern' SpaceIds '=' Expr {% do+ p <- exprToPattern $4+ return (PatternSyn (getRange ($1,$2,$3,$4)) (head $2) (tail $2) p)+ }+ SimpleIds :: { [String] } SimpleIds : SimpleId { [$1] } | SimpleIds SimpleId {$1 ++ [$2]}@@ -1009,29 +1047,80 @@ SimpleId :: { String } SimpleId : id { snd $1 } +MaybeOpen :: { Maybe Range }+MaybeOpen : 'open' { Just (getRange $1) }+ | {- empty -} { Nothing } -- Open-Open :: { Declaration }-Open : 'open' ModuleName OpenArgs ImportDirective {+Open :: { [Declaration] }+Open : MaybeOpen 'import' ModuleName OpenArgs ImportDirective {% let+ { doOpen = maybe DontOpen (const DoOpen) $1+ ; m = $3+ ; es = $4+ ; dir = $5+ ; r = getRange (m, es, dir)+ ; mr = getRange m+ ; unique = hash $ show $ fmap (const (Nothing :: Maybe ())) r+ -- turn range into unique id, but delete file path+ -- which is absolute and messes up suite of failing tests+ -- (different hashs on different installations)+ -- TODO: Don't use (insecure) hashes in this way.+ ; fresh = Name mr [ Id $ ".#" ++ show m ++ "-" ++ show unique ]+ ; impStm asR = Import mr m (Just (AsName fresh asR)) DontOpen defaultImportDir+ ; appStm m' es =+ let r = getRange (m, es) in+ Private r+ [ ModuleMacro r m'+ (SectionApp (getRange es) []+ (RawApp (getRange es) (Ident (QName fresh) : es)))+ doOpen dir+ ]+ ; (initArgs, last2Args) = splitAt (length es - 2) es+ ; parseAsClause = case last2Args of+ { [ Ident (QName (Name asR [Id x]))+ , Ident (QName m')+ ] | x == "as" -> Just (asR, m')+ ; _ -> Nothing+ }+ } in+ case es of+ { [] -> return [Import mr m Nothing doOpen dir]+ ; _ | Just (asR, m') <- parseAsClause ->+ if null initArgs then return+ [ Import (getRange (m, asR, m', dir)) m+ (Just (AsName m' asR)) doOpen dir+ ]+ else return [ impStm asR, appStm m' initArgs ]+ | DontOpen <- doOpen -> parseErrorAt (fromJust $ rStart $ getRange $2) "An import statement with module instantiation does not actually import the module. This statement achieves nothing. Either add the `open' keyword or bind the instantiated module with an `as' clause."+ | otherwise -> return+ [ impStm noRange+ , appStm (noName $ beginningOf $ getRange m) es+ ]+ }+ }+ |'open' ModuleName OpenArgs ImportDirective {+ let { m = $2 ; es = $3 ; dir = $4- ; r = getRange ($1, m, es, dir)+ ; r = getRange (m, es, dir) } in- case es of- { [] -> Open r m dir- ; _ -> Private r [ ModuleMacro r (noName $ beginningOf $ getRange $2)+ [ case es of+ { [] -> Open r m dir+ ; _ -> Private r [ ModuleMacro r (noName $ beginningOf $ getRange m) (SectionApp (getRange (m , es)) [] (RawApp (fuseRange m es) (Ident m : es))) DoOpen dir- ]- }+ ]+ }+ ] } | 'open' ModuleName '{{' '...' DoubleCloseBrace ImportDirective {- let r = getRange ($1, $2, $3, $4) in- Private r [ ModuleMacro r (noName $ beginningOf $ getRange $2)+ let r = getRange $2 in+ [ Private r [ ModuleMacro r (noName $ beginningOf $ getRange $2) (RecordModuleIFS r $2) DoOpen $6- ]+ ]+ ] } OpenArgs :: { [Expr] }@@ -1040,7 +1129,7 @@ ModuleApplication :: { [TypedBindings] -> Parser ModuleApplication } ModuleApplication : ModuleName '{{' '...' DoubleCloseBrace { (\ts ->- if null ts then return $ RecordModuleIFS (getRange ($1, $4)) $1+ if null ts then return $ RecordModuleIFS (getRange ($1,$2,$3,$4)) $1 else parseError "No bindings allowed for record module with non-canonical implicits" ) } | ModuleName OpenArgs {@@ -1050,32 +1139,30 @@ -- Module instantiation ModuleMacro :: { Declaration } ModuleMacro : 'module' Id TypedUntypedBindings '=' ModuleApplication ImportDirective- {% do {ma <- $5 (map addType $3); return $ ModuleMacro (getRange ($1, ma, $6)) $2 ma DontOpen $6 } }+ {% do {ma <- $5 (map addType $3); return $ ModuleMacro (getRange ($1, $2, ma, $6)) $2 ma DontOpen $6 } } | 'open' 'module' Id TypedUntypedBindings '=' ModuleApplication ImportDirective- {% do {ma <- $6 (map addType $4); return $ ModuleMacro (getRange ($1, ma, $7)) $3 ma DoOpen $7 } }---- Import-Import :: { Declaration }-Import : 'import' ModuleName ImportImportDirective- { Import (getRange ($1,$2,snd $3)) $2 (fst $3) DontOpen (snd $3) }- | 'open' 'import' ModuleName ImportImportDirective- { Import (getRange ($1,$3,snd $4)) $3 (fst $4) DoOpen (snd $4) }+ {% do {ma <- $6 (map addType $4); return $ ModuleMacro (getRange ($1, $2, $3, ma, $7)) $3 ma DoOpen $7 } } -- Module Module :: { Declaration } Module : 'module' Id TypedUntypedBindings 'where' Declarations0- { Module (getRange ($1,$4,$5)) (QName $2) (map addType $3) $5 }+ { Module (getRange ($1,$2,$3,$4,$5)) (QName $2) (map addType $3) $5 }+ | 'module' Underscore TypedUntypedBindings 'where' Declarations0+ { Module (getRange ($1,$2,$3,$4,$5)) (QName $2) (map addType $3) $5 } +Underscore :: { Name }+Underscore : '_' { noName (getRange $1) }+ -- The top-level consist of a bunch of import and open followed by a top-level module. TopLevel :: { [Declaration] } TopLevel : TopModule { [$1] }- | Import TopLevel { $1 : $2 }- | Open TopLevel { $1 : $2 }+-- | Import TopLevel { $1 : $2 }+ | Open TopLevel { $1 ++ $2 } -- The top-level module can have a qualified name. TopModule :: { Declaration } TopModule : 'module' ModuleName TypedUntypedBindings 'where' Declarations0- { Module (getRange ($1,$4,$5)) $2 (map addType $3) $5 }+ { Module (getRange ($1,$2,$3,$4,$5)) $2 (map addType $3) $5 } Pragma :: { Declaration } Pragma : DeclarationPragma { Pragma $1 }@@ -1086,71 +1173,77 @@ DeclarationPragma :: { Pragma } DeclarationPragma- : BuiltinPragma { $1 }- | CompiledPragma { $1 }- | CompiledDataPragma { $1 }- | CompiledTypePragma { $1 }- | CompiledEpicPragma { $1 }- | CompiledJSPragma { $1 }- | StaticPragma { $1 }- | ImportPragma { $1 }- | ImpossiblePragma { $1 }- | RecordEtaPragma { $1 }+ : BuiltinPragma { $1 }+ | CompiledPragma { $1 }+ | CompiledDataPragma { $1 }+ | CompiledTypePragma { $1 }+ | CompiledEpicPragma { $1 }+ | CompiledJSPragma { $1 }+ | StaticPragma { $1 }+ | ImportPragma { $1 }+ | ImpossiblePragma { $1 }+ | RecordEtaPragma { $1 }+ | NoTerminationCheckPragma { $1 } OptionsPragma :: { Pragma }-OptionsPragma : '{-#' 'OPTIONS' PragmaStrings '#-}' { OptionsPragma (fuseRange $1 $4) $3 }+OptionsPragma : '{-#' 'OPTIONS' PragmaStrings '#-}' { OptionsPragma (getRange ($1,$2,$4)) $3 } BuiltinPragma :: { Pragma } BuiltinPragma : '{-#' 'BUILTIN' string PragmaName '#-}'- { BuiltinPragma (fuseRange $1 $5) (snd $3) (Ident $4) }+ { BuiltinPragma (getRange ($1,$2,fst $3,$4,$5)) (snd $3) (Ident $4) } CompiledPragma :: { Pragma } CompiledPragma : '{-#' 'COMPILED' PragmaName PragmaStrings '#-}'- { CompiledPragma (fuseRange $1 $5) $3 (unwords $4) }+ { CompiledPragma (getRange ($1,$2,$3,$5)) $3 (unwords $4) } CompiledTypePragma :: { Pragma } CompiledTypePragma : '{-#' 'COMPILED_TYPE' PragmaName PragmaStrings '#-}'- { CompiledTypePragma (fuseRange $1 $5) $3 (unwords $4) }+ { CompiledTypePragma (getRange ($1,$2,$3,$5)) $3 (unwords $4) } CompiledDataPragma :: { Pragma } CompiledDataPragma : '{-#' 'COMPILED_DATA' PragmaName string PragmaStrings '#-}'- { CompiledDataPragma (fuseRange $1 $6) $3 (snd $4) $5 }+ { CompiledDataPragma (getRange ($1,$2,$3,fst $4,$6)) $3 (snd $4) $5 } CompiledEpicPragma :: { Pragma } CompiledEpicPragma : '{-#' 'COMPILED_EPIC' PragmaName PragmaStrings '#-}'- { CompiledEpicPragma (fuseRange $1 $5) $3 (unwords $4) }+ { CompiledEpicPragma (getRange ($1,$2,$3,$5)) $3 (unwords $4) } CompiledJSPragma :: { Pragma } CompiledJSPragma : '{-#' 'COMPILED_JS' PragmaName PragmaStrings '#-}'- { CompiledJSPragma (fuseRange $1 $5) $3 (unwords $4) }+ { CompiledJSPragma (getRange ($1,$2,$3,$5)) $3 (unwords $4) } StaticPragma :: { Pragma } StaticPragma : '{-#' 'STATIC' PragmaName '#-}'- { StaticPragma (fuseRange $1 $4) $3 }+ { StaticPragma (getRange ($1,$2,$3,$4)) $3 } RecordEtaPragma :: { Pragma } RecordEtaPragma : '{-#' 'ETA' PragmaName '#-}'- { EtaPragma (fuseRange $1 $4) $3 }+ { EtaPragma (getRange ($1,$2,$3,$4)) $3 } +NoTerminationCheckPragma :: { Pragma }+NoTerminationCheckPragma+ : '{-#' 'NO_TERMINATION_CHECK' '#-}'+ { NoTerminationCheckPragma (getRange ($1,$2,$3)) }+ ImportPragma :: { Pragma } ImportPragma : '{-#' 'IMPORT' string '#-}' {% let s = snd $3 in if validHaskellModuleName s- then return $ ImportPragma (fuseRange $1 $4) s+ then return $ ImportPragma (getRange ($1,$2,fst $3,$4)) s else parseError $ "Malformed module name: " ++ s ++ "." } ImpossiblePragma :: { Pragma }- : '{-#' 'IMPOSSIBLE' '#-}' { ImpossiblePragma (fuseRange $1 $3) }+ : '{-#' 'IMPOSSIBLE' '#-}' { ImpossiblePragma (getRange ($1,$2,$3)) } {-------------------------------------------------------------------------- Sequences of declarations@@ -1198,13 +1291,23 @@ | TypeSignatures { $1 } -- Record declarations, including an optional record constructor name.-RecordDeclarations :: { (Maybe Name, [Declaration]) }+RecordDeclarations :: { (Maybe Induction, Maybe Name, [Declaration]) } RecordDeclarations- : vopen close { (Nothing, []) }- | vopen RecordConstructorName close { (Just $2, []) }- | vopen RecordConstructorName semi Declarations1 close { (Just $2, reverse $4) }- | vopen Declarations1 close { (Nothing, reverse $2) }+ : vopen close { (Nothing, Nothing, []) }+ | vopen RecordConstructorName close { (Nothing, Just $2, []) }+ | vopen RecordConstructorName semi Declarations1 close { (Nothing, Just $2, reverse $4) }+ | vopen Declarations1 close { (Nothing, Nothing, reverse $2) }+ | vopen RecordInduction close { (Just $2, Nothing, []) }+ | vopen RecordInduction semi RecordConstructorName close { (Just $2, Just $4, []) }+ | vopen RecordInduction semi RecordConstructorName semi Declarations1 close { (Just $2, Just $4, reverse $6) }+ | vopen RecordInduction semi Declarations1 close { (Just $2, Nothing, reverse $4) } +-- Declaration of record as 'inductive' or 'coinductive'.+RecordInduction :: { Induction }+RecordInduction+ : 'inductive' { Inductive }+ | 'coinductive' { CoInductive }+ -- Arbitrary declarations Declarations :: { [Declaration] } Declarations@@ -1395,7 +1498,34 @@ opAppExprToPattern (SyntaxBindingLambda _ _ _) = parseError "syntax binding lambda cannot appear in a pattern" opAppExprToPattern (Ordinary e) = exprToPattern e +-- | Turn an expression into a name. Fails if the expression is not a+-- valid identifier.+exprToName :: Expr -> Parser Name+exprToName (Ident (QName x)) = return x+exprToName e =+ let Just pos = rStart $ getRange e in+ parseErrorAt pos $ "Not a valid identifier: " ++ show e+ parsePanic s = parseError $ "Internal parser error: " ++ s ++ ". Please report this as a bug."++{- RHS or type signature -}++data RHSOrTypeSigs = JustRHS RHS+ | TypeSigsRHS Expr++namesOfPattern :: Pattern -> Maybe [(Relevance, Name)]+namesOfPattern (IdentP (QName i)) = Just [(Relevant, i)]+namesOfPattern (DotP _ (Ident (QName i))) = Just [(Irrelevant, i)]+namesOfPattern (RawAppP _ ps) = fmap concat $ mapM namesOfPattern ps+namesOfPattern _ = Nothing++funClauseOrTypeSigs :: LHS -> RHSOrTypeSigs -> WhereClause -> Parser [Declaration]+funClauseOrTypeSigs lhs (JustRHS rhs) wh = return [FunClause lhs rhs wh]+funClauseOrTypeSigs lhs (TypeSigsRHS e) wh+ | NoWhere <- wh,+ LHS p [] [] [] <- lhs,+ Just names <- namesOfPattern p = return $ map (\(x,y) -> TypeSig x y e) names+ | otherwise = parseError "Illegal function clause or type signature" {-------------------------------------------------------------------------- Tests
src/full/Agda/Syntax/Parser/Tokens.hs view
@@ -16,11 +16,12 @@ | KwOpen | KwImport | KwModule | KwPrimitive | KwInfix | KwInfixL | KwInfixR | KwWith | KwRewrite | KwSet | KwProp | KwForall | KwRecord | KwConstructor | KwField+ | KwInductive | KwCoInductive | KwHiding | KwUsing | KwRenaming | KwTo | KwPublic | KwOPTIONS | KwBUILTIN | KwLINE | KwCOMPILED_DATA | KwCOMPILED_TYPE | KwCOMPILED | KwCOMPILED_EPIC | KwCOMPILED_JS- | KwIMPORT | KwIMPOSSIBLE | KwETA | KwSTATIC- | KwQuoteGoal | KwQuote | KwQuoteTerm | KwUnquote | KwSyntax+ | KwIMPORT | KwIMPOSSIBLE | KwETA | KwNO_TERMINATION_CHECK | KwSTATIC+ | KwQuoteGoal | KwQuote | KwQuoteTerm | KwUnquote | KwSyntax | KwPatternSyn deriving (Eq, Show) layoutKeywords :: [Keyword]@@ -43,7 +44,9 @@ = TokKeyword Keyword Interval -- Identifiers and operators | TokId (Interval, String)- | TokQId [(Interval, String)] -- non empty namespace+ | TokQId [(Interval, String)]+ -- Non-empty namespace. The intervals for+ -- "A.B.x" correspond to "A.", "B." and "x". -- Literals | TokLiteral Literal -- Special symbols
src/full/Agda/Syntax/Position.hs view
@@ -1,11 +1,12 @@-{-# LANGUAGE CPP, DeriveDataTypeable #-}+{-# LANGUAGE CPP, DeriveDataTypeable, DeriveFunctor, TypeSynonymInstances, FlexibleInstances, ScopedTypeVariables #-} {-| Position information for syntax. Crucial for giving good error messages. -} module Agda.Syntax.Position ( -- * Positions- Position(..)+ Position+ , Position'(..) , positionInvariant , startPos , movePos@@ -13,13 +14,15 @@ , backupPos -- * Intervals- , Interval(..)+ , Interval+ , Interval'(..) , intervalInvariant , takeI , dropI -- * Ranges- , Range(..)+ , Range+ , Range'(..) , rangeInvariant , noRange , posToRange@@ -42,7 +45,7 @@ , tests ) where -import Data.Generics (Typeable, Data)+import Data.Typeable (Typeable) import Data.List import Data.Function import Data.Set (Set, (\\))@@ -70,35 +73,41 @@ -- messages for the user. -- -- Note the invariant which positions have to satisfy: 'positionInvariant'.-data Position = Pn { srcFile :: Maybe AbsolutePath- -- ^ File.- , posPos :: !Int32- -- ^ Position.- , posLine :: !Int32- -- ^ Line number, counting from 1.- , posCol :: !Int32- -- ^ Column number, counting from 1.- }- deriving (Typeable, Data)+data Position' a = Pn+ { srcFile :: a+ -- ^ File.+ , posPos :: !Int32+ -- ^ Position.+ , posLine :: !Int32+ -- ^ Line number, counting from 1.+ , posCol :: !Int32+ -- ^ Column number, counting from 1.+ }+ deriving (Typeable, Functor) +type SrcFile = Maybe AbsolutePath+type Position = Position' SrcFile+ positionInvariant :: Position -> Bool positionInvariant p = posPos p > 0 && posLine p > 0 && posCol p > 0 importantPart p = (srcFile p, posPos p) -instance Eq Position where+instance Eq a => Eq (Position' a) where (==) = (==) `on` importantPart -instance Ord Position where+instance Ord a => Ord (Position' a) where compare = compare `on` importantPart -- | An interval. The @iEnd@ position is not included in the interval. -- -- Note the invariant which intervals have to satisfy: 'intervalInvariant'.-data Interval = Interval { iStart, iEnd :: !Position }- deriving (Typeable, Data, Eq, Ord)+data Interval' a = Interval { iStart, iEnd :: !(Position' a) }+ deriving (Typeable, Eq, Ord, Functor) +type Interval = Interval' SrcFile+ intervalInvariant :: Interval -> Bool intervalInvariant i = all positionInvariant [iStart i, iEnd i] &&@@ -113,9 +122,11 @@ -- consecutive and separated. -- -- Note the invariant which ranges have to satisfy: 'rangeInvariant'.-newtype Range = Range [Interval]- deriving (Typeable, Data, Eq, Ord)+newtype Range' a = Range [Interval' a]+ deriving (Typeable, Eq, Ord, Functor) +type Range = Range' SrcFile+ rangeInvariant :: Range -> Bool rangeInvariant (Range []) = True rangeInvariant (Range is) =@@ -142,8 +153,17 @@ getRange (x,y,z) = getRange (x,(y,z)) instance (HasRange a, HasRange b, HasRange c, HasRange d) => HasRange (a,b,c,d) where- getRange (x,y,z,w) = getRange (x,(y,(z, w)))+ getRange (x,y,z,w) = getRange (x,(y,(z,w))) +instance (HasRange a, HasRange b, HasRange c, HasRange d, HasRange e) => HasRange (a,b,c,d,e) where+ getRange (x,y,z,w,v) = getRange (x,(y,(z,(w,v))))++instance (HasRange a, HasRange b, HasRange c, HasRange d, HasRange e, HasRange f) => HasRange (a,b,c,d,e,f) where+ getRange (x,y,z,w,v,u) = getRange (x,(y,(z,(w,(v,u)))))++instance (HasRange a, HasRange b, HasRange c, HasRange d, HasRange e, HasRange f, HasRange g) => HasRange (a,b,c,d,e,f,g) where+ getRange (x,y,z,w,v,u,t) = getRange (x,(y,(z,(w,(v,(u,t))))))+ instance HasRange a => HasRange (Maybe a) where getRange Nothing = noRange getRange (Just a) = getRange a@@ -178,6 +198,10 @@ instance (KillRange a, KillRange b) => KillRange (a, b) where killRange (x, y) = (killRange x, killRange y) +instance (KillRange a, KillRange b, KillRange c) =>+ KillRange (a, b, c) where+ killRange (x, y, z) = killRange3 (,,) x y z+ instance KillRange a => KillRange (Maybe a) where killRange = fmap killRange @@ -189,11 +213,11 @@ Pretty printing --------------------------------------------------------------------------} -instance Show Position where+instance Show a => Show (Position' (Maybe a)) where show (Pn Nothing _ l c) = show l ++ "," ++ show c- show (Pn (Just f) _ l c) = filePath f ++ ":" ++ show l ++ "," ++ show c+ show (Pn (Just f) _ l c) = show f ++ ":" ++ show l ++ "," ++ show c -instance Show Interval where+instance Show a => Show (Interval' (Maybe a)) where show (Interval s e) = file ++ start ++ "-" ++ end where f = srcFile s@@ -203,13 +227,13 @@ ec = posCol e file = case f of Nothing -> ""- Just f -> filePath f ++ ":"+ Just f -> show f ++ ":" start = show sl ++ "," ++ show sc end | sl == el = show ec | otherwise = show el ++ "," ++ show ec -instance Show Range where+instance Show a => Show (Range' (Maybe a)) where show r = case rangeToInterval r of Nothing -> "" Just i -> show i@@ -269,7 +293,7 @@ | otherwise = Range [Interval p2 p1] -- | Converts a range to an interval, if possible.-rangeToInterval :: Range -> Maybe Interval+rangeToInterval :: Range' a -> Maybe (Interval' a) rangeToInterval (Range []) = Nothing rangeToInterval (Range is) = Just $ Interval { iStart = iStart (head is) , iEnd = iEnd (last is)@@ -284,7 +308,7 @@ -- | Removes gaps between intervals on the same line. continuousPerLine :: Range -> Range continuousPerLine (Range []) = Range []-continuousPerLine (Range (i:is)) = Range $ fuse i $ sortBy (compare `on` iStart) is+continuousPerLine (Range (i:is)) = Range $ fuse i is where fuse i [] = [i] fuse i (j:is)@@ -339,7 +363,7 @@ Just (Pn { srcFile = f }) -> posToRange p p where p = startPos f --- | @x `withRangeOf` y@ sets the range of @x@ to the range of @y@.+-- | @x \`withRangeOf\` y@ sets the range of @x@ to the range of @y@. withRangeOf :: (SetRange t, HasRange u) => t -> u -> t x `withRangeOf` y = setRange (getRange y) x @@ -409,7 +433,7 @@ prop_beginningOfFile r = rangeInvariant (beginningOfFile r) -instance Arbitrary Position where+instance Arbitrary a => Arbitrary (Position' a) where arbitrary = do srcFile <- arbitrary NonZero (NonNegative pos') <- arbitrary@@ -421,7 +445,7 @@ -- | Sets the 'srcFile' components of the interval. -setFile :: Maybe AbsolutePath -> Interval -> Interval+setFile :: SrcFile -> Interval -> Interval setFile f (Interval p1 p2) = Interval (p1 { srcFile = f }) (p2 { srcFile = f }) @@ -435,9 +459,9 @@ intervalInvariant i' && srcFile (iStart i) == srcFile (iStart i') -instance Arbitrary Interval where+instance (Arbitrary a, Ord a) => Arbitrary (Interval' a) where arbitrary = do- (p1, p2) <- liftM2 (,) arbitrary arbitrary+ (p1, p2 :: Position' a) <- liftM2 (,) arbitrary arbitrary let [p1', p2'] = sort [p1, p2 { srcFile = srcFile p1 }] return (Interval p1' p2')
src/full/Agda/Syntax/Scope/Base.hs view
@@ -1,4 +1,4 @@-{-# LANGUAGE CPP, DeriveDataTypeable, GADTs, ScopedTypeVariables, TupleSections #-}+{-# LANGUAGE CPP, DeriveDataTypeable, GADTs, ScopedTypeVariables, TupleSections, RankNTypes #-} {-| This module defines the notion of a scope and operations on scopes. -}@@ -6,7 +6,7 @@ import Control.Arrow ((***), (&&&)) import Control.Applicative-import Data.Generics (Typeable, Data)+import Data.Typeable (Typeable) import Data.List import Data.Map (Map) import qualified Data.Map as Map@@ -31,15 +31,16 @@ -- | A scope is a named collection of names partitioned into public and private -- names. data Scope = Scope- { scopeName :: A.ModuleName- , scopeParents :: [A.ModuleName]- , scopeNameSpaces :: [(NameSpaceId, NameSpace)]- , scopeImports :: Map C.QName A.ModuleName+ { scopeName :: A.ModuleName+ , scopeParents :: [A.ModuleName]+ , scopeNameSpaces :: [(NameSpaceId, NameSpace)]+ , scopeImports :: Map C.QName A.ModuleName+ , scopeDatatypeModule :: Bool }- deriving (Typeable, Data)+ deriving (Typeable) data NameSpaceId = PrivateNS | PublicNS | ImportedNS | OnlyQualifiedNS- deriving (Typeable, Data, Eq, Bounded, Enum)+ deriving (Typeable, Eq, Bounded, Enum) localNameSpace :: Access -> NameSpaceId localNameSpace PublicAccess = PublicNS@@ -61,7 +62,7 @@ , scopeLocals :: LocalVars , scopePrecedence :: Precedence }- deriving (Typeable, Data)+ deriving (Typeable) -- | Local variables type LocalVars = [(C.Name, A.Name)]@@ -73,7 +74,7 @@ { nsNames :: NamesInScope , nsModules :: ModulesInScope }- deriving (Typeable, Data)+ deriving (Typeable) type ThingsInScope a = Map C.Name [a] type NamesInScope = ThingsInScope AbstractName@@ -101,22 +102,25 @@ inScopeTag = ModuleTag -- | We distinguish constructor names from other names.-data KindOfName = ConName | DefName- deriving (Eq, Show, Typeable, Data)+data KindOfName = ConName | FldName | DefName | PatternSynName+ deriving (Eq, Show, Typeable, Enum, Bounded) +allKindsOfNames :: [KindOfName]+allKindsOfNames = [minBound..maxBound]+ -- | Apart from the name, we also record whether it's a constructor or not and -- what the fixity is. data AbstractName = AbsName { anameName :: A.QName , anameKind :: KindOfName }- deriving (Typeable, Data)+ deriving (Typeable) -- | For modules we record the arity. I'm not sure that it's every used anywhere. data AbstractModule = AbsModule { amodName :: A.ModuleName }- deriving (Typeable, Data)+ deriving (Typeable) instance Eq AbstractName where (==) = (==) `on` anameName@@ -234,11 +238,12 @@ -- | The empty scope. emptyScope :: Scope-emptyScope = Scope { scopeName = noModuleName- , scopeParents = []- , scopeNameSpaces = [ (nsid, emptyNameSpace) | nsid <- [minBound..maxBound] ]- , scopeImports = Map.empty- }+emptyScope = Scope { scopeName = noModuleName+ , scopeParents = []+ , scopeNameSpaces = [ (nsid, emptyNameSpace) | nsid <- [minBound..maxBound] ]+ , scopeImports = Map.empty+ , scopeDatatypeModule = False+ } -- | The empty scope info. emptyScopeInfo :: ScopeInfo@@ -473,6 +478,45 @@ Just s -> scopeParents s Nothing -> __IMPOSSIBLE__ current = this : parents++-- | Compute a flattened scope. Only include unqualified names or names+-- qualified by modules in the first argument.+flattenScope :: [[C.Name]] -> ScopeInfo -> Map C.QName [AbstractName]+flattenScope ms scope =+ -- Map.filterKeys (\q -> elem (init $ C.qnameParts q) ([]:ms)) $+ Map.unionWith (++)+ (build ms allNamesInScope root)+ imported+ where+ current = moduleScope $ scopeCurrent scope+ root = mergeScopes $ current : map moduleScope (scopeParents current)++ imported = Map.unionsWith (++)+ [ qual c (build ms' exportedNamesInScope $ moduleScope a)+ | (c, a) <- Map.toList $ scopeImports root+ , let m = C.qnameParts c+ ms' = map (drop (length m)) $ filter (m `isPrefixOf`) ms+ , not $ null ms' ]+ qual c = Map.mapKeys (q c)+ where+ q (C.QName x) = C.Qual x+ q (C.Qual m x) = C.Qual m . q x++ build :: [[C.Name]] -> (forall a. InScope a => Scope -> ThingsInScope a) -> Scope -> Map C.QName [AbstractName]+ build ms getNames s =+ Map.unionWith (++)+ (Map.mapKeys (\x -> C.QName x) (getNames s))+ $ Map.unionsWith (++) $+ [ Map.mapKeys (\y -> C.Qual x y) $ build ms' exportedNamesInScope $ moduleScope m+ | (x, mods) <- Map.toList (getNames s)+ , let ms' = [ ms' | m':ms' <- ms, m' == x ]+ , not $ null ms'+ , AbsModule m <- mods ]++ moduleScope :: A.ModuleName -> Scope+ moduleScope name = case Map.lookup name (scopeModules scope) of+ Nothing -> __IMPOSSIBLE__+ Just s -> s -- | Look up a name in the scope scopeLookup :: InScope a => C.QName -> ScopeInfo -> [a]
src/full/Agda/Syntax/Scope/Monad.hs view
@@ -46,6 +46,11 @@ notInScope :: C.QName -> ScopeM a notInScope x = typeError $ NotInScope [x] +isDatatypeModule :: A.ModuleName -> ScopeM Bool+isDatatypeModule m = do+ sc <- getScope+ return $ maybe __IMPOSSIBLE__ scopeDatatypeModule (Map.lookup m (scopeModules sc))+ -- * General operations getCurrentModule :: ScopeM A.ModuleName@@ -82,12 +87,14 @@ getCurrentScope :: ScopeM Scope getCurrentScope = getNamedScope =<< getCurrentModule --- | Create a new module with an empty scope-createModule :: A.ModuleName -> ScopeM ()-createModule m = do+-- | Create a new module with an empty scope (Bool is True if it is a datatype module)+createModule :: Bool -> A.ModuleName -> ScopeM ()+createModule b m = do s <- getCurrentScope let parents = scopeName s : scopeParents s- modifyScopes $ Map.insert m emptyScope { scopeName = m, scopeParents = parents }+ modifyScopes $ Map.insert m emptyScope { scopeName = m+ , scopeParents = parents+ , scopeDatatypeModule = b } -- | Apply a function to the scope info. modifyScopeInfo :: (ScopeInfo -> ScopeInfo) -> ScopeM ()@@ -184,7 +191,9 @@ data ResolvedName = VarName A.Name | DefinedName Access AbstractName+ | FieldName AbstractName -- ^ record fields names need to be distinguished to parse copatterns | ConstructorName [AbstractName]+ | PatternSynResName AbstractName | UnknownName deriving (Show) @@ -200,6 +209,9 @@ ds | all ((==ConName) . anameKind . fst) ds -> return $ ConstructorName $ map (\ (d, _) -> updateConcreteName d $ unqualify x) ds+ [(d, a)] | anameKind d == FldName -> return $ FieldName $ updateConcreteName d (unqualify x)+ [(d, a)] | anameKind d == PatternSynName ->+ return $ PatternSynResName (updateConcreteName d $ unqualify x) [(d, a)] -> return $ DefinedName a $ updateConcreteName d (unqualify x) ds -> typeError $ AmbiguousName x (map (anameName . fst) ds) where@@ -223,13 +235,15 @@ case r of VarName y -> return $ nameFixity y DefinedName _ d -> return $ nameFixity $ qnameName $ anameName d+ FieldName d -> return $ nameFixity $ qnameName $ anameName d ConstructorName ds | null fs -> __IMPOSSIBLE__ | allEqual fs -> return $ head fs | otherwise -> return defaultFixity' where fs = map (nameFixity . qnameName . anameName) ds- UnknownName -> __IMPOSSIBLE__+ PatternSynResName n -> return $ nameFixity $ qnameName $ anameName n+ UnknownName -> __IMPOSSIBLE__ -- * Binding names @@ -244,13 +258,15 @@ bindName acc kind x y = do r <- resolveName (C.QName x) ys <- case r of+ FieldName d -> typeError $ ClashingDefinition (C.QName x) $ anameName d DefinedName _ d -> typeError $ ClashingDefinition (C.QName x) $ anameName d VarName z -> typeError $ ClashingDefinition (C.QName x) $ A.qualify (mnameFromList []) z ConstructorName [] -> __IMPOSSIBLE__ ConstructorName ds | kind == ConName && all ((==ConName) . anameKind) ds -> return [ AbsName y kind ] | otherwise -> typeError $ ClashingDefinition (C.QName x) $ anameName (head' ds)- UnknownName -> return [AbsName y kind]+ PatternSynResName n -> typeError $ ClashingDefinition (C.QName x) $ anameName n+ UnknownName -> return [AbsName y kind] modifyCurrentScope $ addNamesToScope (localNameSpace acc) x ys where head' [] = {- ' -} __IMPOSSIBLE__@@ -355,7 +371,7 @@ addMod x y -- We need to copy the contents of included modules recursively- s0 <- lift $ createModule y >> getNamedScope x+ s0 <- lift $ createModule False y >> getNamedScope x s <- withCurrentModule' y $ copy y s0 lift $ modifyNamedScope y (const s) return y
− src/full/Agda/Syntax/Strict.hs
@@ -1,100 +0,0 @@-{-# LANGUAGE CPP #-}--module Agda.Syntax.Strict where--import Data.Generics (everything)--import Agda.Syntax.Common-import Agda.Syntax.Internal-import Agda.Syntax.Parser.Tokens-import qualified Agda.Syntax.Concrete as C-import qualified Agda.Syntax.Concrete.Definitions as C--#include "../undefined.h"-import Agda.Utils.Impossible---- | @force@ is the recursive @const 0@ function, to force Haskell to evaluate.-class Strict a where- force :: a -> Int--instance Strict Term where- force t = case t of- Var _ ts -> force ts- Def _ ts -> force ts- Con _ ts -> force ts- Lam _ t -> force t- Lit _ -> 0- Level l -> force l- Pi a b -> force (a,b)- Sort s -> force s- MetaV _ ts -> force ts- DontCare mt -> force mt--instance Strict Type where- force (El s t) = force (s,t)--instance Strict Sort where- force s = case s of- Type n -> force n- Prop -> 0- Inf -> 0- DLub s1 s2 -> force (s1, s2)--instance Strict Level where- force (Max as) = force as--instance Strict PlusLevel where- force ClosedLevel{} = 0- force (Plus _ l) = force l--instance Strict LevelAtom where- force l = case l of- MetaLevel _ vs -> force vs- NeutralLevel v -> force v- BlockedLevel _ v -> force v- UnreducedLevel v -> force v--instance Strict ClauseBody where- force (Body t) = force t- force (Bind b) = force b- force NoBody = 0--instance Strict C.Expr where- force e = everything (+) (const 1) e--instance Strict C.Declaration where- force e = everything (+) (const 1) e--instance Strict C.Pragma where- force e = everything (+) (const 1) e--instance Strict C.NiceDeclaration where- force d = everything (+) (const 1) d--instance (Strict a, Strict b) => Strict (a,b) where- force (x,y) = force x + force y--instance Strict a => Strict (Arg a) where- force = force . unArg--instance Strict a => Strict [a] where- force = sum . map force--instance Strict a => Strict (Maybe a) where- force = maybe 0 force--instance Strict a => Strict (Abs a) where- force = force . unAbs--instance Strict Token where- -- TODO: This is just a dummy instance. Why can't we just use the- -- NFData derivation provided by Drift?- force = (`seq` 0)--infixr 0 $!!--($!!) :: Strict a => (a -> b) -> a -> b-f $!! x = force x `seq` f x--strict :: Strict a => a -> a-strict x = id $!! x
src/full/Agda/Syntax/Translation/AbstractToConcrete.hs view
@@ -35,6 +35,7 @@ import Agda.Syntax.Common import Agda.Syntax.Position import Agda.Syntax.Info+import Agda.Syntax.Internal (MetaId(..)) import Agda.Syntax.Fixity import Agda.Syntax.Concrete as C import Agda.Syntax.Concrete.Pretty@@ -43,7 +44,7 @@ import Agda.Syntax.Scope.Base import Agda.TypeChecking.Monad.State (getScope)-import Agda.TypeChecking.Monad.Base (TCM)+import Agda.TypeChecking.Monad.Base (TCM, NamedMeta(..)) import Agda.Utils.Maybe import Agda.Utils.Monad hiding (bracket)@@ -311,9 +312,9 @@ toConcrete (A.QuestionMark i) = return $ C.QuestionMark (getRange i) (metaNumber i)- toConcrete (A.Underscore i) = return $ C.Underscore- (getRange i)- (metaNumber i)+ toConcrete (A.Underscore i) = return $+ C.Underscore (getRange i) $+ fmap (show . NamedMeta (metaNameSuggestion i) . MetaId) (metaNumber i) toConcrete e@(A.App i e1 e2) = tryToRecoverOpApp e@@ -350,10 +351,14 @@ (bs@(A.DomainFull _ : _), e) -> (b:bs, e) _ -> ([b], e) lamView e = ([], e)- toConcrete (A.ExtendedLam i di qname cs) = do+ toConcrete (A.ExtendedLam i di qname cs) =+ bracket lamBrackets $ do decls <- toConcrete cs- let removeApp (C.RawAppP r (lam:es)) = C.RawAppP r es- removeApp (C.AppP p np) = namedThing $ unArg np+ -- we know all lhs are of the form `.extlam p1 p2 ... pn`,+ -- with the name .extlam leftmost. It is our mission to remove it.+ let removeApp (C.RawAppP r (_:es)) = C.RawAppP r es+ removeApp (C.AppP (C.IdentP _) np) = namedArg np+ removeApp (C.AppP p np) = (C.AppP (removeApp p) np) removeApp _ = __IMPOSSIBLE__ let decl2clause (C.FunClause lhs rhs wh) = (lhs {lhsOriginalPattern = removeApp $ lhsOriginalPattern lhs},rhs,wh) decl2clause _ = __IMPOSSIBLE__@@ -373,10 +378,14 @@ bracket piBrackets $ do a' <- toConcreteCtx (if irr then DotPatternCtx else FunctionSpaceDomainCtx) a b' <- toConcreteCtx TopCtx b- return $ C.Fun (getRange i) (addDot a' $ mkArg a') b'+ return $ C.Fun (getRange i) (addRel a' $ mkArg a') b' where- irr = argRelevance a == Irrelevant- addDot a e = if irr then Dot (getRange a) e else e+ irr = argRelevance a `elem` [Irrelevant, NonStrict]+ addRel a e = case argRelevance a of+ Irrelevant -> addDot a e+ NonStrict -> addDot a (addDot a e)+ _ -> e+ addDot a e = Dot (getRange a) e mkArg (Arg Hidden r e) = HiddenArg (getRange e) (unnamed e) mkArg (Arg Instance r e) = InstanceArg (getRange e) (unnamed e) mkArg (Arg NotHidden r e) = e@@ -419,13 +428,16 @@ toConcrete (A.QuoteTerm i) = return $ C.QuoteTerm (getRange i) toConcrete (A.Unquote i) = return $ C.Unquote (getRange i) + -- Andreas, 2012-04-02: TODO! print DontCare as irrAxiom -- Andreas, 2010-10-05 print irrelevant things as ordinary things- toConcrete (A.DontCare e) = toConcrete e+ toConcrete (A.DontCare e) = C.Dot r . C.Paren r <$> toConcrete e+ where r = getRange e -- toConcrete (A.DontCare e) = C.DontCare <$> toConcreteCtx TopCtx e {- -- Andreas, 2010-09-21 abuse C.Underscore to print irrelevant things toConcrete (A.DontCare) = return $ C.Underscore noRange Nothing -}+ toConcrete (A.PatternSyn n) = C.Ident <$> toConcrete n makeDomainFree :: A.LamBinding -> A.LamBinding makeDomainFree b@(A.DomainFull (A.TypedBindings r (Arg h rel (A.TBind _ [x] t)))) =@@ -465,12 +477,17 @@ , C.FunClause (C.LHS (C.IdentP $ C.QName x) [] [] []) e C.NoWhere ]+ -- TODO: bind variables+ bindToConcrete (LetPatBind i p e) ret = do+ p <- toConcrete p+ e <- toConcrete e+ ret [ C.FunClause (C.LHS p [] [] []) (C.RHS e) NoWhere ] bindToConcrete (LetApply i x modapp _ _) ret = do x' <- unqualify <$> toConcrete x modapp <- toConcrete modapp let r = getRange modapp open = maybe DontOpen id $ minfoOpenShort i- dir = maybe (ImportDirective r (Hiding []) [] False) id $ minfoDirective i+ dir = maybe defaultImportDir{ importDirRange = r } id $ minfoDirective i -- This is no use since toAbstract LetDefs is in localToAbstract. local (openModule' x dir id) $ ret [ C.ModuleMacro (getRange i) x' modapp open dir ]@@ -493,8 +510,8 @@ ret . AnyWhere =<< declsToConcrete ds mergeSigAndDef :: [C.Declaration] -> [C.Declaration]-mergeSigAndDef (C.RecordSig _ x bs e : C.Record r y c _ Nothing fs : ds)- | x == y = C.Record r y c bs (Just e) fs : mergeSigAndDef ds+mergeSigAndDef (C.RecordSig _ x bs e : C.Record r y ind c _ Nothing fs : ds)+ | x == y = C.Record r y ind c bs (Just e) fs : mergeSigAndDef ds mergeSigAndDef (C.DataSig _ _ x bs e : C.Data r i y _ Nothing cs : ds) | x == y = C.Data r i y bs (Just e) cs : mergeSigAndDef ds mergeSigAndDef (d : ds) = d : mergeSigAndDef ds@@ -610,7 +627,7 @@ return [C.Primitive (getRange i) [C.TypeSig Relevant x' t']] -- Primitives are always relevant. - toConcrete (A.FunDef i _ cs) =+ toConcrete (A.FunDef i _ _ cs) = withAbstractPrivate i $ concat <$> toConcrete cs toConcrete (A.DataSig i x bs t) =@@ -633,11 +650,11 @@ t' <- toConcreteCtx TopCtx t return [ C.RecordSig (getRange i) x' (map C.DomainFull tel') t' ] - toConcrete (A.RecDef i x c bs t cs) =+ toConcrete (A.RecDef i x ind c bs t cs) = withAbstractPrivate i $ bindToConcrete (map makeDomainFree bs) $ \tel' -> do (x',cs') <- (unsafeQNameToName -*- id) <$> toConcrete (x, map Constr cs)- return [ C.Record (getRange i) x' Nothing tel' Nothing cs' ]+ return [ C.Record (getRange i) x' ind Nothing tel' Nothing cs' ] toConcrete (A.Mutual i ds) = declsToConcrete ds @@ -652,7 +669,7 @@ modapp <- toConcrete modapp let r = getRange modapp open = maybe DontOpen id $ minfoOpenShort i- dir = maybe (ImportDirective r (Hiding []) [] False) id $ minfoDirective i+ dir = maybe defaultImportDir{ importDirRange = r } id $ minfoDirective i return [ C.ModuleMacro (getRange i) x modapp open dir ] toConcrete (A.Import i x) = do@@ -669,6 +686,7 @@ x <- toConcrete x return [C.Open (getRange i) x defaultImportDir] + data RangeAndPragma = RangeAndPragma Range A.Pragma instance ToConcrete RangeAndPragma C.Pragma where@@ -699,19 +717,40 @@ -- Left hand sides -------------------------------------------------------- -noImplicitArgs = filter (noImplicit . namedThing . unArg)+noImplicitArgs = filter (noImplicit . namedArg) noImplicitPats = filter noImplicit noImplicit (A.ImplicitP _) = False noImplicit _ = True instance ToConcrete A.LHS C.LHS where- bindToConcrete (A.LHS i x args wps) ret = do+ bindToConcrete (A.LHS i lhscore wps) ret = do+ bindToConcreteCtx TopCtx lhscore $ \lhs ->+ bindToConcreteCtx TopCtx (noImplicitPats wps) $ \wps ->+ ret $ C.LHS lhs wps [] []+{-+ bindToConcrete (A.LHS i (A.LHSHead x args) wps) ret = do bindToConcreteCtx TopCtx (A.DefP info x args) $ \lhs -> bindToConcreteCtx TopCtx (noImplicitPats wps) $ \wps -> ret $ C.LHS lhs wps [] [] where info = PatRange (getRange i)+-} +instance ToConcrete A.LHSCore C.Pattern where+ bindToConcrete = bindToConcrete . lhsCoreToPattern+{-+ bindToConcrete (A.LHSHead x args) ret = do+ bindToConcreteCtx TopCtx (A.DefP info x args) $ \ lhs ->+ ret $ lhs+ where info = PatRange noRange -- seems to be unused anyway+ bindToConcrete (A.LHSProj d ps1 lhscore ps2) ret = do+ d <- toConcrete d+ bindToConcrete ps1 $ \ ps1 ->+ bindToConcrete lhscore $ \ p ->+ bindToConcrete ps2 $ \ ps2 ->+ ret $ makePattern d ps1 p ps2+ -}+ appBrackets' :: [arg] -> Precedence -> Bool appBrackets' [] _ = False appBrackets' (_:_) ctx = appBrackets ctx@@ -744,12 +783,14 @@ return $ C.DotP (getRange i) e -- just for debugging purposes (shouldn't show up in practise) toConcrete (A.ImplicitP i) = return $ C.IdentP (C.QName $ C.Name noRange [C.Id "(implicit)"])+ toConcrete (A.PatternSynP i n _) = IdentP <$> toConcrete n + -- Helpers for recovering C.OpApp ------------------------------------------ data Hd = HdVar A.Name | HdCon A.QName | HdDef A.QName -cOpApp :: Range -> C.Name -> [C.Expr] -> C.Expr+cOpApp :: Range -> C.QName -> [C.Expr] -> C.Expr cOpApp r n es = C.OpApp r n (map Ordinary es) tryToRecoverOpApp :: A.Expr -> AbsToCon C.Expr -> AbsToCon C.Expr@@ -771,83 +812,96 @@ DefP _ f ps -> Just (HdDef f, ps) _ -> Nothing -recoverOpApp :: (ToConcrete a c, HasRange c) =>- ((Precedence -> Bool) -> AbsToCon c -> AbsToCon c) ->- (Range -> C.Name -> [c] -> c) -> (a -> Maybe (Hd, [NamedArg a])) -> a ->- AbsToCon c -> AbsToCon c-recoverOpApp bracket opApp view e mdefault = case view e of- Nothing -> mdefault+recoverOpApp :: (ToConcrete a c, HasRange c)+ => ((Precedence -> Bool) -> AbsToCon c -> AbsToCon c)+ -> (Range -> C.QName -> [c] -> c)+ -> (a -> Maybe (Hd, [NamedArg a]))+ -> a+ -> AbsToCon c+ -> AbsToCon c+recoverOpApp bracket opApp view e mDefault = case view e of+ Nothing -> mDefault Just (hd, args) | all notHidden args -> do- let args' = map (namedThing . unArg) args+ let args' = map namedArg args case hd of- HdVar n | isNoName n -> mdefault- | otherwise -> do- x <- toConcrete n- doCName (theFixity $ nameFixity n) x args'- HdDef qn -> doQName qn args'- HdCon qn -> doQName qn args'- | otherwise -> mdefault+ HdVar n+ | isNoName n -> mDefault+ | otherwise -> doQNameHelper id C.QName n args'+ HdDef qn -> doQNameHelper qnameName id qn args'+ HdCon qn -> doQNameHelper qnameName id qn args'+ | otherwise -> mDefault where - isNoName x = C.isNoName $ A.nameConcrete x+ isNoName :: A.Name -> Bool+ isNoName x = C.isNoName $ A.nameConcrete x + notHidden :: NamedArg a -> Bool notHidden a = argHiding a == NotHidden - -- qualified names can't use mixfix syntax- doQName qn as = do- x <- toConcrete qn- case x of- C.QName x -> doCName (theFixity $ nameFixity $ qnameName qn) x as- _ -> mdefault+ doQNameHelper fixityHelper conHelper n as = do+ x <- toConcrete n+ doQName (theFixity $ nameFixity $ fixityHelper n) (conHelper x) as -- fall-back (wrong number of arguments or no holes)- doCName _ cn@(C.Name _ xs) es- | length xs == 1 = mdefault- | length es /= numHoles = mdefault- | List.null es = mdefault- where numHoles = length [ () | Hole <- xs ]- msg = "doCName " ++ showList xs "" ++ " on " ++ show (length es) ++ " args"+ doQName _ n es+ | length xs == 1 = mDefault+ | length es /= numHoles = mDefault+ | List.null es = mDefault+ where+ xs = C.nameParts $ C.unqualify n+ numHoles = length (filter (== Hole) xs)+ msg = concat [ "doQName "+ , showList xs ""+ , " on "+ , show (length es)+ , " args" ] -- binary case- doCName fixity cn@(C.Name _ xs) as+ doQName fixity n as | Hole <- head xs , Hole <- last xs = do- let a1 = head as- an = last as- as' = case as of- as@(_:_:_) -> init $ tail as- _ -> __IMPOSSIBLE__+ let a1 = head as+ an = last as+ as' = case as of+ as@(_ : _ : _) -> init $ tail as+ _ -> __IMPOSSIBLE__ e1 <- toConcreteCtx (LeftOperandCtx fixity) a1 es <- mapM (toConcreteCtx InsideOperandCtx) as' en <- toConcreteCtx (RightOperandCtx fixity) an bracket (opBrackets fixity)- $ return $ opApp (getRange (e1,en)) cn ([e1] ++ es ++ [en])+ $ return $ opApp (getRange (e1, en)) n ([e1] ++ es ++ [en])+ where+ xs = C.nameParts $ C.unqualify n -- prefix- doCName fixity cn@(C.Name _ xs) as+ doQName fixity n as | Hole <- last xs = do let an = last as as' = case as of- as@(_:_) -> init as- _ -> __IMPOSSIBLE__+ as@(_ : _) -> init as+ _ -> __IMPOSSIBLE__ es <- mapM (toConcreteCtx InsideOperandCtx) as' en <- toConcreteCtx (RightOperandCtx fixity) an bracket (opBrackets fixity)- $ return $ opApp (getRange (cn,en)) cn (es ++ [en])+ $ return $ opApp (getRange (n, en)) n (es ++ [en])+ where+ xs = C.nameParts $ C.unqualify n -- postfix- doCName fixity cn@(C.Name _ xs) as+ doQName fixity n as | Hole <- head xs = do- let a1 = head as- as' = tail as+ let a1 = head as+ as' = tail as e1 <- toConcreteCtx (LeftOperandCtx fixity) a1 es <- mapM (toConcreteCtx InsideOperandCtx) as' bracket (opBrackets fixity)- $ return $ opApp (getRange (e1,cn)) cn ([e1] ++ es)+ $ return $ opApp (getRange (e1, n)) n ([e1] ++ es)+ where+ xs = C.nameParts $ C.unqualify n -- roundfix- doCName _ cn as = do+ doQName _ n as = do es <- mapM (toConcreteCtx InsideOperandCtx) as bracket roundFixBrackets- $ return $ opApp (getRange cn) cn es+ $ return $ opApp (getRange n) n es
src/full/Agda/Syntax/Translation/ConcreteToAbstract.hs view
@@ -1,5 +1,6 @@ {-# LANGUAGE CPP, MultiParamTypeClasses, FunctionalDependencies,- FlexibleInstances, UndecidableInstances, OverlappingInstances+ FlexibleInstances, UndecidableInstances, OverlappingInstances,+ ScopedTypeVariables #-} {-| Translation from "Agda.Syntax.Concrete" to "Agda.Syntax.Abstract". Involves scope analysis,@@ -26,28 +27,28 @@ import Control.Monad.Reader hiding (mapM) import Control.Monad.Error hiding (mapM) import Data.Typeable-import Data.Traversable (mapM)-import Data.List ((\\), nub)+import Data.Traversable (mapM, traverse)+import Data.List ((\\), nub, foldl') import qualified Data.Map as Map import Agda.Syntax.Concrete as C hiding (topLevelModuleName) import Agda.Syntax.Concrete.Operators+-- import qualified Agda.Syntax.Concrete.Copatterns as Cop -- merged into Operators import Agda.Syntax.Abstract as A+import Agda.Syntax.Abstract.Copatterns import Agda.Syntax.Position import Agda.Syntax.Common import Agda.Syntax.Info import Agda.Syntax.Concrete.Definitions as C-import Agda.Syntax.Concrete.Operators import Agda.Syntax.Concrete.Pretty import Agda.Syntax.Abstract.Pretty import Agda.Syntax.Fixity import Agda.Syntax.Notation import Agda.Syntax.Scope.Base import Agda.Syntax.Scope.Monad-import Agda.Syntax.Strict import Agda.TypeChecking.Monad.Base (TypeError(..), Call(..), typeError,- TCErr(..), TCErr'(..), extendlambdaname)+ TCErr(..), extendlambdaname) import Agda.TypeChecking.Monad.Trace (traceCall, traceCallCPS, setCurrentRange) import Agda.TypeChecking.Monad.State import Agda.TypeChecking.Monad.Options@@ -85,26 +86,12 @@ printScope :: String -> Int -> String -> ScopeM () printScope tag v s = verboseS ("scope." ++ tag) v $ do scope <- getScope- reportSLn "" 0 $ s ++ " " ++ show scope+ reportSDoc "" 0 $ return $ vcat [ text s, text $ show scope ] {-------------------------------------------------------------------------- Helpers --------------------------------------------------------------------------} -lhsArgs :: C.Pattern -> (C.Name, [NamedArg C.Pattern])-lhsArgs p = case appView p of- Arg _ _ (Named _ (IdentP (C.QName x))) : ps -> (x, ps)- _ -> __IMPOSSIBLE__- where- mkHead = Arg NotHidden Relevant . unnamed- notHidden = Arg NotHidden Relevant . unnamed- appView p = case p of- AppP p arg -> appView p ++ [arg]- OpAppP _ x ps -> mkHead (IdentP $ C.QName x) : map notHidden ps- ParenP _ p -> appView p- RawAppP _ _ -> __IMPOSSIBLE__- _ -> [ mkHead p ]- annotateDecl :: ScopeM A.Declaration -> ScopeM A.Declaration annotateDecl m = annotateDecls $ (:[]) <$> m @@ -134,15 +121,18 @@ xs = concatMap vars ps vars :: A.Pattern' e -> [C.Name] vars p = case p of- A.VarP x -> [nameConcrete x]- A.ConP _ _ args -> concatMap (vars . namedThing . unArg) args- A.WildP _ -> []- A.AsP _ x p -> nameConcrete x : vars p- A.DotP _ _ -> []- A.AbsurdP _ -> []- A.LitP _ -> []- A.DefP _ _ args -> __IMPOSSIBLE__- A.ImplicitP _ -> __IMPOSSIBLE__+ A.VarP x -> [nameConcrete x]+ A.ConP _ _ args -> concatMap (vars . namedArg) args+ A.WildP _ -> []+ A.AsP _ x p -> nameConcrete x : vars p+ A.DotP _ _ -> []+ A.AbsurdP _ -> []+ A.LitP _ -> []+ A.DefP _ _ args -> concatMap (vars . namedArg) args+ -- Projection pattern, @args@ should be empty unless we have+ -- indexed records.+ A.ImplicitP _ -> __IMPOSSIBLE__+ A.PatternSynP _ _ args -> concatMap (vars . namedArg) args -- | Compute the type of the record constructor (with bogus target type) recordConstructorType :: [NiceDeclaration] -> C.Expr@@ -156,7 +146,8 @@ build (NiceField r f _ _ x (Arg h rel e) : fs) = C.Pi [C.TypedBindings r $ Arg h rel (C.TBind r [BName x f] e)] $ build fs where r = getRange x- build (d : fs) = C.Let noRange (notSoNiceDeclarations [d]) $ build fs+ build (d : fs) = C.Let noRange [killRange $ notSoNiceDeclaration d] $+ build fs build [] = C.SetN noRange 0 -- todo: nicer checkModuleApplication (C.SectionApp _ tel e) m0 x dir' =@@ -180,12 +171,12 @@ printScope "mod.inst" 20 "copied source module" reportSLn "scope.mod.inst" 30 $ "renamings:\n " ++ show renD ++ "\n " ++ show renM return ((A.SectionApp tel' m1 args'), renD, renM)-checkModuleApplication (C.RecordModuleIFS _ rec) m0 x dir' =+checkModuleApplication (C.RecordModuleIFS _ recN) m0 x dir' = withCurrentModule m0 $ do- m1 <- toAbstract $ OldModuleName rec+ m1 <- toAbstract $ OldModuleName recN s <- getNamedScope m1 (s', (renM, renD)) <- copyScope m0 s- s' <- applyImportDirectiveM rec dir' s'+ s' <- applyImportDirectiveM recN dir' s' modifyCurrentScope $ const s' printScope "mod.inst" 20 "copied record module"@@ -318,21 +309,26 @@ nameExpr :: AbstractName -> A.Expr nameExpr d = mk (anameKind d) $ anameName d where- mk DefName = Def- mk ConName = Con . AmbQ . (:[])+ mk DefName = Def+ mk FldName = Def+ mk ConName = Con . AmbQ . (:[])+ mk PatternSynName = A.PatternSyn instance ToAbstract OldQName A.Expr where toAbstract (OldQName x) = do qx <- resolveName x reportSLn "scope.name" 10 $ "resolved " ++ show x ++ ": " ++ show qx case qx of- VarName x' -> return $ A.Var x'- DefinedName _ d -> return $ nameExpr d- ConstructorName ds -> return $ A.Con $ AmbQ (map anameName ds)- UnknownName -> notInScope x+ VarName x' -> return $ A.Var x'+ DefinedName _ d -> return $ nameExpr d+ FieldName d -> return $ nameExpr d+ ConstructorName ds -> return $ A.Con $ AmbQ (map anameName ds)+ UnknownName -> notInScope x+ PatternSynResName d -> return $ nameExpr d data APatName = VarPatName A.Name | ConPatName [AbstractName]+ | PatternSynPatName AbstractName instance ToAbstract PatName APatName where toAbstract (PatName x) = do@@ -341,9 +337,11 @@ z <- case (rx, x) of -- TODO: warn about shadowing (VarName y, C.QName x) -> return $ Left x -- typeError $ RepeatedVariableInPattern y x+ (FieldName d, C.QName x) -> return $ Left x (DefinedName _ d, C.QName x) | DefName == anameKind d -> return $ Left x (UnknownName, C.QName x) -> return $ Left x- (ConstructorName ds, _) -> return $ Right ds+ (ConstructorName ds, _) -> return $ Right (Left ds)+ (PatternSynResName d, _) -> return $ Right (Right d) _ -> typeError $ GenericError $ "Cannot pattern match on " ++ show x ++ ", because it is not a constructor"@@ -353,10 +351,14 @@ p <- VarPatName <$> toAbstract (NewName x) printLocals 10 "bound it:" return p- Right cs -> do- reportSLn "scope.pat" 10 $ "it was a con: " ++ show (map anameName cs)- return $ ConPatName cs+ Right (Left ds) -> do+ reportSLn "scope.pat" 10 $ "it was a con: " ++ show (map anameName ds)+ return $ ConPatName ds+ Right (Right d) -> do+ reportSLn "scope.pat" 10 $ "it was a pat syn: " ++ show (anameName d)+ return $ PatternSynPatName d + -- Should be a defined name. instance ToAbstract OldName A.QName where toAbstract (OldName x) = do@@ -375,9 +377,10 @@ checkForModuleClash :: C.Name -> ScopeM () checkForModuleClash x = do ms <- scopeLookup (C.QName x) <$> getScope- unless (null ms) $+ unless (null ms) $ do+ reportSLn "scope.clash" 20 $ "clashing modules ms = " ++ show ms setCurrentRange (getRange x) $- typeError $ ShadowedModule $+ typeError $ ShadowedModule x $ map ((`withRangeOf` x) . amodName) ms instance ToAbstract NewModuleName A.ModuleName where@@ -385,7 +388,7 @@ checkForModuleClash x m <- getCurrentModule y <- freshQModule m x- createModule y+ createModule False y return y instance ToAbstract NewModuleQName A.ModuleName where@@ -393,7 +396,7 @@ where toAbs m (C.QName x) = do y <- freshQModule m x- createModule y+ createModule False y return y toAbs m (C.Qual x q) = do m' <- freshQModule m x@@ -477,13 +480,15 @@ { metaRange = r , metaScope = scope , metaNumber = n+ , metaNameSuggestion = "" } C.Underscore r n -> do scope <- getScope return $ A.Underscore $ MetaInfo { metaRange = r , metaScope = scope- , metaNumber = n+ , metaNumber = maybe Nothing __IMPOSSIBLE__ n+ , metaNameSuggestion = maybe "" id n } -- Raw application@@ -537,11 +542,11 @@ insertApp _ = __IMPOSSIBLE__ insertHead (C.LHS p wps eqs with) = C.LHS (insertApp p) wps eqs with insertHead (C.Ellipsis r wps eqs with) = C.Ellipsis r wps eqs with- scdef <- toAbstract (C.FunDef r [] defaultFixity' ConcreteDef cname+ scdef <- toAbstract (C.FunDef r [] defaultFixity' ConcreteDef True cname (map (\(lhs,rhs,wh) -> -- wh = NoWhere, see parser for more info C.Clause cname (insertHead lhs) rhs wh []) cs)) case scdef of- (A.ScopedDecl si [A.FunDef di qname' cs]) -> do+ (A.ScopedDecl si [A.FunDef di qname' NotDelayed cs]) -> do setScope si return $ A.ExtendedLam (ExprRange r) di qname' cs _ -> __IMPOSSIBLE__@@ -557,7 +562,7 @@ -- Irrelevant non-dependent function type C.Fun r e1 e2 -> do- Arg h rel (e0, dotted) <- fmapM (toAbstractDot FunctionSpaceDomainCtx) $ mkArg e1+ Arg h rel (e0, dotted) <- traverse (toAbstractDot FunctionSpaceDomainCtx) $ mkArg e1 let e1 = Arg h (if dotted then Irrelevant else rel) e0 e2 <- toAbstractCtx TopCtx e2 let info = ExprRange r@@ -698,11 +703,18 @@ -- | runs Syntax.Concrete.Definitions.niceDeclarations on main module niceDecls :: [C.Declaration] -> ScopeM [NiceDeclaration] niceDecls ds = case runNice $ niceDeclarations ds of- Left e -> throwError $ TCErr Nothing $ Exception (getRange e) (show e)+ Left e -> throwError $ Exception (getRange e) (show e) Right ds -> return ds instance ToAbstract [C.Declaration] [A.Declaration] where- toAbstract ds = toAbstract =<< niceDecls ds+ toAbstract ds = do+ -- don't allow to switch off termination checker in --safe mode+ ds <- ifM (optSafe <$> commandLineOptions) (mapM noNoTermCheck ds) (return ds)+ toAbstract =<< niceDecls ds+ where+ noNoTermCheck (C.Pragma (NoTerminationCheckPragma r)) =+ typeError $ SafeFlagNoTerminationCheck+ noNoTermCheck d = return d newtype LetDefs = LetDefs [C.Declaration] newtype LetDef = LetDef NiceDeclaration@@ -714,7 +726,7 @@ instance ToAbstract LetDef [A.LetBinding] where toAbstract (LetDef d) = case d of- NiceMutual _ d@[C.FunSig _ fx _ rel x t, C.FunDef _ _ _ abstract _ [cl]] ->+ NiceMutual _ _ d@[C.FunSig _ fx _ rel _ x t, C.FunDef _ _ _ abstract _ _ [cl]] -> do when (abstract == AbstractDef) $ do typeError $ GenericError $ "abstract not allowed in let expressions" e <- letToAbstract cl@@ -722,6 +734,15 @@ x <- toAbstract (NewName $ C.BName x fx) return [ A.LetBind (LetRange $ getRange d) rel x t e ] + -- irrefutable let binding, like (x , y) = rhs+ NiceFunClause r PublicAccess ConcreteDef termCheck d@(C.FunClause (C.LHS p [] [] []) (C.RHS rhs) NoWhere) -> do+ rhs <- toAbstract rhs+ p <- parsePattern p+ p <- toAbstract p+ checkPatternLinearity [p]+ p <- toAbstract p+ return [ A.LetPatBind (LetRange r) p rhs ]+ -- You can't open public in a let NiceOpen r x dirs | not (C.publicOpen dirs) -> do m <- toAbstract (OldModuleName x)@@ -743,8 +764,17 @@ _ -> notAValidLetBinding d where letToAbstract (C.Clause top clhs@(C.LHS p [] [] []) (C.RHS rhs) NoWhere []) = do- p <- parseLHS (Just top) p+{-+ p <- parseLHS top p localToAbstract (snd $ lhsArgs p) $ \args ->+-}+ (x, args) <- do+ res <- parseLHS top p+ case res of+ C.LHSHead x args -> return (x, args)+ C.LHSProj{} -> typeError $ GenericError $ "copatterns not allowed in let bindings"++ localToAbstract args $ \args -> do rhs <- toAbstract rhs foldM lambda rhs (reverse args) -- just reverse because these DomainFree letToAbstract _ = notAValidLetBinding d@@ -770,15 +800,15 @@ -- Axiom C.Axiom r f p rel x t -> do+ -- check that we do not postulate in --safe mode clo <- commandLineOptions when (optSafe clo) (typeError (SafeFlagPostulate x))- t' <- toAbstractCtx TopCtx t- y <- freshAbstractQName f x- bindName p DefName x y- return [ A.Axiom (mkDefInfo x f p ConcreteDef r) rel y t' ]+ -- check the postulate+ toAbstractNiceAxiom d -- Fields C.NiceField r f p a x t -> do+ unless (p == PublicAccess) $ typeError $ GenericError "Record fields can not be private" t' <- toAbstractCtx TopCtx t y <- freshAbstractQName f x irrProj <- optIrrelevantProjections <$> pragmaOptions@@ -786,7 +816,7 @@ -- Andreas, 2010-09-24: irrelevant fields are not in scope -- this ensures that projections out of irrelevant fields cannot occur -- Ulf: unless you turn on --irrelevant-projections- bindName p DefName x y+ bindName p FldName x y return [ A.Field (mkDefInfo x f p a r) y t' ] -- Primitive function@@ -797,10 +827,9 @@ return [ A.Primitive (mkDefInfo x f p a r) y t' ] -- Definitions (possibly mutual)- NiceMutual r ds -> do+ NiceMutual r termCheck ds -> do ds' <- toAbstract ds- return [ A.Mutual (DeclInfo C.noName_ r) ds' ]- -- TODO: what does the info mean here?+ return [ A.Mutual (MutualInfo termCheck r) ds' ] C.NiceRecSig r f a x ls t -> withLocalVars $ do let toTypeBinding :: C.LamBinding -> C.TypedBindings@@ -820,17 +849,26 @@ _ -> __IMPOSSIBLE__ ls' <- toAbstract (map toTypeBinding ls) x' <- freshAbstractQName f x+ {- -- Andreas, 2012-01-16: remember number of parameters+ bindName a (DataName (length ls)) x x' -} bindName a DefName x x' t' <- toAbstract t return [ A.DataSig (mkDefInfo x f a ConcreteDef r) x' ls' t' ] -- Type signatures- C.FunSig r f p rel x t -> (:[]) <$> toAbstract (C.Axiom r f p rel x t)+ C.FunSig r f p rel tc x t -> toAbstractNiceAxiom (C.Axiom r f p rel x t) -- Function definitions- C.FunDef r ds f a x cs -> do+ C.FunDef r ds f a tc x cs -> do printLocals 10 $ "checking def " ++ show x- (x',cs') <- toAbstract (OldName x,cs)- return [ A.FunDef (mkDefInfo x f PublicAccess a r) x' cs' ]+ (x',cs) <- toAbstract (OldName x,cs)+ (delayed, cs) <- translateCopatternClauses cs+ return [ A.FunDef (mkDefInfo x f PublicAccess a r) x' delayed cs ] + -- Uncategorized function clauses+ C.NiceFunClause r acc abs termCheck (C.FunClause lhs rhs wcls) ->+ typeError $ GenericError $+ "Missing type signature for left hand side " ++ show lhs+ C.NiceFunClause{} -> __IMPOSSIBLE__+ -- Data definitions C.DataDef r f a x pars cons -> withLocalVars $ do printScope "scope.data.def" 20 ("checking DataDef for " ++ show x)@@ -848,7 +886,7 @@ -- Create the module for the qualified constructors checkForModuleClash x -- disallow shadowing previously defined modules let m = mnameFromList $ qnameToList x'- createModule m+ createModule True m bindModule p x m -- make it a proper module cons <- toAbstract (map (ConstrDecl NoRec m a p) cons) -- Open the module@@ -860,7 +898,7 @@ conName _ = __IMPOSSIBLE__ -- Record definitions (mucho interesting)- C.RecDef r f a x cm pars fields ->+ C.RecDef r f a x ind cm pars fields -> withLocalVars $ do -- Check that the generated module doesn't clash with a previously -- defined module@@ -872,7 +910,7 @@ m0 <- getCurrentModule let m = A.qualifyM m0 $ mnameFromList $ (:[]) $ last $ qnameToList x' printScope "rec" 15 "before record"- createModule m+ createModule False m afields <- withCurrentModule m $ do afields <- toAbstract fields printScope "rec" 15 "checked fields"@@ -880,14 +918,24 @@ bindModule p x m cm' <- mapM (\(ThingWithFixity c f) -> bindConstructorName m c f a p YesRec) cm printScope "rec" 15 "record complete"- return [ A.RecDef (mkDefInfo x f PublicAccess a r) x' cm' pars contel afields ]+ return [ A.RecDef (mkDefInfo x f PublicAccess a r) x' ind cm' pars contel afields ] + -- Andreas, 2012-10-30 anonymous modules are like Coq sections NiceModule r p a (C.QName name) tel ds -> traceCall (ScopeCheckDeclaration $ NiceModule r p a (C.QName name) tel []) $ do+ (name, p, isSection) <- if not (C.isNoName name)+ then return (name, p, False)+ else do+ (i :: NameId) <- fresh+ return (C.NoName (getRange name) i, PrivateAccess, True) aname <- toAbstract (NewModuleName name)- x <- snd <$> scopeCheckModule r (C.QName name) aname tel ds+ ds <- snd <$> scopeCheckModule r (C.QName name) aname tel ds bindModule p name aname- return x+ -- if the module was anonymous open it public+ when isSection $+ openModule_ (C.QName name) $+ defaultImportDir { publicOpen = True }+ return ds NiceModule _ _ _ C.Qual{} _ _ -> __IMPOSSIBLE__ @@ -962,11 +1010,38 @@ }) m ] + NicePatternSyn r fx n as p -> do+ reportSLn "scope.pat" 10 $ "found nice pattern syn: " ++ show r + isparameterised <- not . null <$> getLocalVars+ when isparameterised $ typeError $ NotSupported+ "pattern synonym in parameterised module"++ y <- freshAbstractQName fx n+ bindName PublicAccess PatternSynName n y+ defn <- withLocalVars $ do+ p' <- killRange <$> (toAbstract =<< toAbstract =<< parsePatternSyn p)+ as' <- mapM (\a -> unVarName =<< resolveName (C.QName a)) as+ return (as', p')+ modifyPatternSyns (Map.insert y defn)+ return []+ where unVarName (VarName a) = return a+ unVarName _ = typeError $ UnusedVariableInPatternSynonym++ where+ -- checking postulate or type sig. without checking safe flag+ toAbstractNiceAxiom (C.Axiom r f p rel x t) = do+ t' <- toAbstractCtx TopCtx t+ y <- freshAbstractQName f x+ bindName p DefName x y+ return [ A.Axiom (mkDefInfo x f p ConcreteDef r) rel y t' ]+ toAbstractNiceAxiom _ = __IMPOSSIBLE__++ data IsRecordCon = YesRec | NoRec data ConstrDecl = ConstrDecl IsRecordCon A.ModuleName IsAbstract Access C.NiceDeclaration -bindConstructorName m x f a p rec = do+bindConstructorName m x f a p record = do -- The abstract name is the qualified one y <- withCurrentModule m $ freshAbstractQName f x -- Bind it twice, once unqualified and once qualified@@ -979,17 +1054,17 @@ p' = case a of AbstractDef -> PrivateAccess _ -> p- p'' = case (a, rec) of+ p'' = case (a, record) of (AbstractDef, _) -> PrivateAccess (_, YesRec) -> OnlyQualified -- record constructors aren't really in the record module _ -> PublicAccess instance ToAbstract ConstrDecl A.Declaration where- toAbstract (ConstrDecl rec m a p (C.Axiom r f _ rel x t)) = do -- rel==Relevant+ toAbstract (ConstrDecl record m a p (C.Axiom r f _ rel x t)) = do -- rel==Relevant t' <- toAbstractCtx TopCtx t -- The abstract name is the qualified one -- Bind it twice, once unqualified and once qualified- y <- bindConstructorName m x f a p rec+ y <- bindConstructorName m x f a p record printScope "con" 15 "bound constructor" return $ A.Axiom (mkDefInfo x f p ConcreteDef r) rel y t' @@ -1046,11 +1121,16 @@ case e of A.Def x -> return [ A.EtaPragma x ] _ -> fail "Bad ETA pragma"+ -- NO_TERMINATION_CHECK is handled by the nicifier+ toAbstract (C.NoTerminationCheckPragma _) = __IMPOSSIBLE__ instance ToAbstract C.Clause A.Clause where toAbstract (C.Clause top C.Ellipsis{} _ _ _) = fail "bad '...'" -- TODO: errors message toAbstract (C.Clause top lhs@(C.LHS p wps eqs with) rhs wh wcs) = withLocalVars $ do- let wcs' = map (expandEllipsis p wps) wcs+-- WAS: let wcs' = map (expandEllipsis p wps) wcs+ -- Andreas, 2012-02-14: need to reset local vars before checking subclauses+ vars <- getLocalVars+ let wcs' = map (\ c -> setLocalVars vars >> do return $ expandEllipsis p wps c) wcs lhs' <- toAbstract (LeftHandSide top p wps) printLocals 10 "after lhs:" let (whname, whds) = case wh of@@ -1085,9 +1165,16 @@ bindModule acc m am return (x, ds) -data RightHandSide = RightHandSide [C.Expr] [C.Expr] [C.Clause] C.RHS [C.Declaration]+data RightHandSide = RightHandSide+ { rhsRewriteEqn :: [C.RewriteEqn] -- ^ @rewrite e@ (many)+ , rhsWithExpr :: [C.WithExpr] -- ^ @with e@ (many)+ , rhsSubclauses :: [ScopeM C.Clause] -- ^ the subclauses spawned by a with (monadic because we need to reset the local vars before checking these clauses)+ , rhs :: C.RHS+ , rhsWhereDecls :: [C.Declaration]+ }+ data AbstractRHS = AbsurdRHS'- | WithRHS' [A.Expr] [C.Clause] -- ^ The with clauses haven't been translated yet+ | WithRHS' [A.Expr] [ScopeM C.Clause] -- ^ The with clauses haven't been translated yet | RHS' A.Expr | RewriteRHS' [A.Expr] AbstractRHS [A.Declaration] @@ -1110,7 +1197,7 @@ return $ RewriteRHS auxs eqs rhs wh toAbstract (WithRHS' es cs) = do aux <- withFunctionName "with-"- A.WithRHS aux es <$> toAbstract cs+ A.WithRHS aux es <$> do toAbstract =<< sequence cs instance ToAbstract RightHandSide AbstractRHS where toAbstract (RightHandSide eqs@(_:_) es cs rhs wh) = do@@ -1139,67 +1226,132 @@ instance ToAbstract LeftHandSide A.LHS where toAbstract (LeftHandSide top lhs wps) = traceCall (ScopeCheckLHS top lhs) $ do- p <- parseLHS (Just top) lhs+ lhscore <- parseLHS top lhs+ reportSLn "scope.lhs" 5 $ "parsed lhs: " ++ show lhscore printLocals 10 "before lhs:"- let (x, ps) = lhsArgs p- x <- withLocalVars $ setLocalVars [] >> toAbstract (OldName x)- args <- toAbstract ps- wps <- toAbstract =<< mapM (parseLHS Nothing) wps- checkPatternLinearity (map (namedThing . unArg) args ++ wps)+ -- error if copattern parsed but no --copatterns option+ haveCoPats <- optCopatterns <$> pragmaOptions+ unless haveCoPats $+ case lhscore of+ C.LHSHead x ps -> return ()+ C.LHSProj{} -> typeError $ NeedOptionCopatterns+ -- scope check patterns except for dot patterns+ lhscore <- toAbstract lhscore+ reportSLn "scope.lhs" 5 $ "parsed lhs patterns: " ++ show lhscore+ wps <- toAbstract =<< mapM parsePattern wps+ checkPatternLinearity $ lhsCoreAllPatterns lhscore ++ wps printLocals 10 "checked pattern:"- args <- toAbstract args -- take care of dot patterns- wps <- toAbstract wps+ -- scope check dot patterns+ lhscore <- toAbstract lhscore+ reportSLn "scope.lhs" 5 $ "parsed lhs dot patterns: " ++ show lhscore+ wps <- toAbstract wps printLocals 10 "checked dots:"- return $ A.LHS (LHSRange $ getRange (lhs, wps)) x args wps+ return $ A.LHS (LHSRange $ getRange (lhs, wps)) lhscore wps +-- does not check pattern linearity+instance ToAbstract C.LHSCore (A.LHSCore' C.Expr) where+ toAbstract (C.LHSHead x ps) = do+ x <- withLocalVars $ setLocalVars [] >> toAbstract (OldName x)+ args <- toAbstract ps+ return $ A.LHSHead x args+ toAbstract (C.LHSProj d ps1 l ps2) = do+ qx <- resolveName d+ d <- case qx of+ FieldName d -> return $ anameName d+ UnknownName -> notInScope d+ _ -> typeError $ GenericError $+ "head of copattern needs to be a field identifier, but "+ ++ show d ++ " isn't one"+ args1 <- toAbstract ps1+ l <- toAbstract l+ args2 <- toAbstract ps2+ return $ A.LHSProj d args1 l args2+ instance ToAbstract c a => ToAbstract (Arg c) (Arg a) where toAbstract (Arg h r e) = Arg h r <$> toAbstractCtx (hiddenArgumentCtx h) e instance ToAbstract c a => ToAbstract (Named name c) (Named name a) where toAbstract (Named n e) = Named n <$> toAbstract e +{- DOES NOT WORK ANYMORE with pattern synonyms+instance ToAbstract c a => ToAbstract (A.LHSCore' c) (A.LHSCore' a) where+ toAbstract = mapM toAbstract+-}++instance ToAbstract (A.LHSCore' C.Expr) (A.LHSCore' A.Expr) where+ toAbstract (A.LHSHead f ps) = A.LHSHead f <$> mapM toAbstract ps+ toAbstract (A.LHSProj d ps lhscore ps') = A.LHSProj d <$> mapM toAbstract ps+ <*> mapM toAbstract lhscore <*> mapM toAbstract ps'+ -- Patterns are done in two phases. First everything but the dot patterns, and -- then the dot patterns. This is because dot patterns can refer to variables -- bound anywhere in the pattern. -instance ToAbstract c a => ToAbstract (A.Pattern' c) (A.Pattern' a) where- toAbstract = mapM toAbstract+instance ToAbstract (A.Pattern' C.Expr) (A.Pattern' A.Expr) where+ toAbstract (A.VarP x) = return $ A.VarP x+ toAbstract (A.ConP i ds as) = A.ConP i ds <$> mapM toAbstract as+ toAbstract (A.DefP i x as) = A.DefP i x <$> mapM toAbstract as+ toAbstract (A.WildP i) = return $ A.WildP i+ toAbstract (A.AsP i x p) = A.AsP i x <$> toAbstract p+ toAbstract (A.DotP i e) = A.DotP i <$> toAbstract e+ toAbstract (A.AbsurdP i) = return $ A.AbsurdP i+ toAbstract (A.LitP l) = return $ A.LitP l+ toAbstract (A.ImplicitP i) = return $ A.ImplicitP i+ toAbstract (A.PatternSynP i x as) = do+ p <- lookupPatternSyn x+ as' <- mapM toAbstract as+ instPatternSyn p as'+ where+ instPatternSyn :: A.PatternSynDefn -> [NamedArg A.Pattern] -> ScopeM A.Pattern+ instPatternSyn (ns, p) as+ | length ns == length as = return $ substPattern s $ setRange (getRange i) p+ | otherwise = typeError $ PatternSynonymArityMismatch x+ where+ s = zipWith' (\n a -> (n, namedThing (unArg a))) ns as + instance ToAbstract C.Pattern (A.Pattern' C.Expr) where toAbstract p@(C.IdentP x) = do px <- toAbstract (PatName x) case px of- VarPatName y -> return $ VarP y- ConPatName ds -> return $ ConP (PatRange (getRange p))- (AmbQ $ map anameName ds)- []+ VarPatName y -> return $ VarP y+ ConPatName ds -> return $ ConP (PatRange (getRange p))+ (AmbQ $ map anameName ds)+ []+ PatternSynPatName d -> return $ PatternSynP (PatRange (getRange p))+ (anameName d) [] toAbstract p0@(AppP p q) = do (p', q') <- toAbstract (p,q) case p' of- ConP _ x as -> return $ ConP info x (as ++ [q'])- DefP _ x as -> return $ DefP info x (as ++ [q'])- _ -> typeError $ InvalidPattern p0+ ConP _ x as -> return $ ConP info x (as ++ [q'])+ DefP _ x as -> return $ DefP info x (as ++ [q'])+ PatternSynP _ x as -> return $ PatternSynP info x (as ++ [q'])+ _ -> typeError $ InvalidPattern p0 where r = getRange p0 info = PatSource r $ \pr -> if appBrackets pr then ParenP r p0 else p0 toAbstract p0@(OpAppP r op ps) = do- p <- toAbstract (IdentP $ C.QName op)+ p <- toAbstract (IdentP op) ps <- toAbstract ps case p of- ConP _ x as -> return $ ConP info x (as ++ map (Arg NotHidden Relevant . unnamed) ps)- DefP _ x as -> return $ DefP info x (as ++ map (Arg NotHidden Relevant. unnamed) ps)- _ -> __IMPOSSIBLE__+ ConP _ x as -> return $ ConP info x+ (as ++ map (Arg NotHidden Relevant . unnamed) ps)+ DefP _ x as -> return $ DefP info x+ (as ++ map (Arg NotHidden Relevant . unnamed) ps)+ PatternSynP _ x as -> return $ PatternSynP info x+ (as ++ map (Arg NotHidden Relevant . unnamed) ps)+ _ -> __IMPOSSIBLE__ where- r = getRange p0+ r = getRange p0 info = PatSource r $ \pr -> if appBrackets pr then ParenP r p0 else p0 -- Removed when parsing- toAbstract (HiddenP _ _) = __IMPOSSIBLE__+ toAbstract (HiddenP _ _) = __IMPOSSIBLE__ toAbstract (InstanceP _ _) = __IMPOSSIBLE__- toAbstract (RawAppP _ _) = __IMPOSSIBLE__+ toAbstract (RawAppP _ _) = __IMPOSSIBLE__ toAbstract p@(C.WildP r) = return $ A.WildP (PatSource r $ const p) toAbstract (C.ParenP _ p) = toAbstract p@@ -1216,18 +1368,16 @@ toAbstract p0@(C.DotP r e) = return $ A.DotP info e where info = PatSource r $ \_ -> p0 toAbstract p0@(C.AbsurdP r) = return $ A.AbsurdP info- where- info = PatSource r $ \_ -> p0+ where info = PatSource r $ \_ -> p0 -- | Turn an operator application into abstract syntax. Make sure to record the -- right precedences for the various arguments.-toAbstractOpApp :: C.Name -> [OpApp C.Expr] -> ScopeM A.Expr-toAbstractOpApp op@(C.NoName _ _) es = __IMPOSSIBLE__-toAbstractOpApp op@(C.Name _ _) es = do- f <- getFixity (C.QName op)+toAbstractOpApp :: C.QName -> [OpApp C.Expr] -> ScopeM A.Expr+toAbstractOpApp op es = do+ f <- getFixity op let (_,_,parts) = oldToNewNotation $ (op, f)- op <- toAbstract (OldQName $ C.QName op)- foldl app op <$> left (theFixity f) [p | p <- parts, not (isBindingHole p)] es+ op <- toAbstract (OldQName op)+ foldl' app op <$> left (theFixity f) [p | p <- parts, not (isBindingHole p)] es where app e arg = A.App (ExprRange (fuseRange e arg)) e $ Arg NotHidden Relevant $ unnamed arg
src/full/Agda/Syntax/Translation/InternalToAbstract.hs view
@@ -1,5 +1,6 @@ {-# LANGUAGE CPP, MultiParamTypeClasses, FunctionalDependencies,- UndecidableInstances, TypeSynonymInstances, FlexibleInstances+ UndecidableInstances, TypeSynonymInstances, FlexibleInstances,+ ScopedTypeVariables #-} {-|@@ -13,7 +14,12 @@ - meta parameters - shadowing -}-module Agda.Syntax.Translation.InternalToAbstract where+module Agda.Syntax.Translation.InternalToAbstract+ ( Reify(..)+ , ReifyWhen(..)+ , NamedClause+ , reifyPatterns+ ) where import Prelude hiding (mapM_, mapM) import Control.Applicative@@ -26,7 +32,7 @@ import qualified Data.Map as Map import Data.Map (Map) import Data.List hiding (sort)-import Data.Traversable+import Data.Traversable as Trav import Agda.Syntax.Literal import Agda.Syntax.Position@@ -39,7 +45,7 @@ import Agda.Syntax.Scope.Base import Agda.Syntax.Scope.Monad -import Agda.TypeChecking.Monad as M+import Agda.TypeChecking.Monad as M hiding (MetaInfo) import Agda.TypeChecking.Reduce import {-# SOURCE #-} Agda.TypeChecking.Records import Agda.TypeChecking.DisplayForm@@ -49,6 +55,7 @@ import Agda.TypeChecking.Free import Agda.TypeChecking.Substitute import Agda.TypeChecking.Telescope+import Agda.TypeChecking.DropArgs import Agda.Utils.Monad import Agda.Utils.Tuple@@ -58,30 +65,66 @@ #include "../../undefined.h" import Agda.Utils.Impossible -apps :: (Expr, [Arg Expr]) -> TCM Expr-apps (e, []) = return e-apps (e, arg : args) | isHiddenArg arg =- do showImp <- showImplicitArguments- if showImp then apps (App exprInfo e (unnamed <$> arg), args)- else apps (e, args)-apps (e, arg:args) =- apps (App exprInfo e (unnamed <$> arg), args)+-- Composition reified applications --------------------------------------- +napps :: Expr -> [NamedArg Expr] -> TCM Expr+napps e args = do+ dontShowImp <- not <$> showImplicitArguments+ let apply1 e arg | isHiddenArg arg && dontShowImp = e+ | otherwise = App exprInfo e arg+ return $ foldl' apply1 e args++apps :: Expr -> [Arg Expr] -> TCM Expr+apps e args = napps e $ map (fmap unnamed) args++reifyApp :: Expr -> [Arg Term] -> TCM Expr+reifyApp e vs = apps e =<< reify vs++-- Omitting information ---------------------------------------------------+ exprInfo :: ExprInfo exprInfo = ExprRange noRange -reifyApp :: Expr -> [Arg Term] -> TCM Expr-reifyApp e vs = curry apps e =<< reify vs+underscore :: Expr+underscore = A.Underscore $ Info.emptyMetaInfo +-- Conditional reification to omitt terms that are not shown --------------++-- | @ReifyWhen@ is a auxiliary type class to reify 'Arg'.+--+-- @reifyWhen False@ should produce an 'underscore'.+-- This function serves to reify hidden/irrelevant things.+class Reify i a => ReifyWhen i a where+ reifyWhen :: Bool -> i -> TCM a+ reifyWhen _ = reify++instance Reify i Expr => ReifyWhen i Expr where+ reifyWhen True i = reify i+ reifyWhen False t = return underscore++instance ReifyWhen i a => ReifyWhen (Arg i) (Arg a) where+ reifyWhen b = traverse (reifyWhen b)++instance ReifyWhen i a => ReifyWhen (Named n i) (Named n a) where+ reifyWhen b = traverse (reifyWhen b)++-- Reification ------------------------------------------------------------+ class Reify i a | i -> a where- reify :: i -> TCM a+ reify :: i -> TCM a +instance Reify Expr Expr where+ reify = return+ instance Reify MetaId Expr where reify x@(MetaId n) = liftTCM $ do- mi <- getMetaInfo <$> lookupMeta x- let mi' = Info.MetaInfo (getRange mi)- (M.clScope mi)- (Just n)+ mi <- mvInfo <$> lookupMeta x+ let mi' = Info.MetaInfo+ { metaRange = getRange $ miClosRange mi+ , metaScope = M.clScope $ miClosRange mi+ , metaNumber = Just n+ , metaNameSuggestion = miNameSuggestion mi+ } ifM shouldReifyInteractionPoints (do iis <- map (snd /\ fst) . Map.assocs <$> gets stInteractionPoints@@ -93,10 +136,10 @@ instance Reify DisplayTerm Expr where reify d = case d of- DTerm v -> reify v+ DTerm v -> reifyTerm False v DDot v -> reify v- DCon c vs -> curry apps (A.Con (AmbQ [c])) =<< reify vs- DDef f vs -> curry apps (A.Def f) =<< reify vs+ DCon c vs -> apps (A.Con (AmbQ [c])) =<< reify vs+ DDef f vs -> apps (A.Def f) =<< reify vs DWithApp us vs -> do us <- reify us let wapp [e] = e@@ -116,15 +159,17 @@ else fallback reifyDisplayFormP :: A.LHS -> TCM A.LHS-reifyDisplayFormP lhs@(A.LHS i x ps wps) =+reifyDisplayFormP lhs@(A.LHS i A.LHSProj{} wps) =+ typeError $ NotImplemented "reifyDisplayForm for copatterns"+reifyDisplayFormP lhs@(A.LHS i (A.LHSHead x ps) wps) = ifM (not <$> displayFormsEnabled) (return lhs) $ do- let vs = [ Arg h Relevant $ I.Var n [] | (n, h) <- zip [0..] $ map argHiding ps]+ let vs = [ Arg h Relevant $ I.var n | (n, h) <- zip [0..] $ map argHiding ps] md <- liftTCM $ displayForm x vs reportSLn "syntax.reify.display" 20 $ "display form of " ++ show x ++ " " ++ show ps ++ " " ++ show wps ++ ":\n " ++ show md case md of Just d | okDisplayForm d ->- reifyDisplayFormP =<< displayLHS (map (namedThing . unArg) ps) wps d+ reifyDisplayFormP =<< displayLHS (map namedArg ps) wps d _ -> return lhs where okDisplayForm (DWithApp (d : ds) []) =@@ -160,7 +205,7 @@ (f, vs, ds) -> do ds <- mapM termToPat ds vs <- mapM argToPat vs- return $ LHS i f vs (ds ++ wps)+ return $ LHS i (LHSHead f vs) (ds ++ wps) where info = PatRange noRange argToPat arg = fmap unnamed <$> traverse termToPat arg@@ -168,7 +213,7 @@ len = genericLength ps termToPat :: DisplayTerm -> TCM A.Pattern- termToPat (DTerm (I.Var n [])) = return $ ps !! fromIntegral n+ termToPat (DTerm (I.Var n [])) = return $ ps !! n termToPat (DCon c vs) = A.ConP info (AmbQ [c]) <$> mapM argToPat vs termToPat (DDot v) = A.DotP info <$> termToExpr v termToPat (DDef _ []) = return $ A.WildP info@@ -181,51 +226,136 @@ -- TODO: restructure this to avoid having to repeat the code for reify termToExpr :: Term -> TCM A.Expr termToExpr (I.Var n [])- | n < len = return $ patToTerm $ ps !! fromIntegral n+ | n < len = return $ A.patternToExpr $ ps !! n termToExpr (I.Con c vs) =- curry apps (A.Con (AmbQ [c])) =<< argsToExpr vs+ apps (A.Con (AmbQ [c])) =<< argsToExpr vs termToExpr (I.Def f vs) =- curry apps (A.Def f) =<< argsToExpr vs+ apps (A.Def f) =<< argsToExpr vs termToExpr (I.Var n vs) =- apps =<< (,) <$> reify (I.Var (n - len) []) <*> argsToExpr vs- termToExpr _ = return $ A.Underscore minfo-- minfo = MetaInfo noRange emptyScopeInfo Nothing- einfo = ExprRange noRange- app = foldl (App einfo)-- patToTerm :: A.Pattern -> A.Expr- patToTerm (A.VarP x) = A.Var x- patToTerm (A.ConP _ c ps) =- A.Con c `app` map (fmap (fmap patToTerm)) ps- patToTerm (A.DefP _ f ps) =- A.Def f `app` map (fmap (fmap patToTerm)) ps- patToTerm (A.WildP _) = A.Underscore minfo- patToTerm (A.AsP _ _ p) = patToTerm p- patToTerm (A.DotP _ e) = e- patToTerm (A.AbsurdP _) = A.Underscore minfo -- TODO: could this happen?- patToTerm (A.LitP l) = A.Lit l- patToTerm (A.ImplicitP _) = A.Underscore minfo+ uncurry apps =<< (,) <$> reify (I.var (n - len)) <*> argsToExpr vs+ termToExpr _ = return underscore instance Reify Literal Expr where reify l@(LitInt {}) = return (A.Lit l) reify l@(LitFloat {}) = return (A.Lit l) reify l@(LitString {}) = return (A.Lit l) reify l@(LitChar {}) = return (A.Lit l)- reify l@(LitQName {}) = return (A.Lit l)+ reify l@(LitQName {}) = return (A.Lit l) instance Reify Term Expr where- reify v = do+ reify v = reifyTerm True v++reifyTerm :: Bool -> Term -> TCM Expr+reifyTerm expandAnonDefs v = do v <- instantiate v case v of I.Var n vs -> do x <- liftTCM $ nameOfBV n `catchError` \_ -> freshName_ ("@" ++ show n) reifyApp (A.Var x) vs- I.Def x@(QName _ name) vs -> reifyDisplayForm x vs $ do+ I.Def x vs -> reifyDisplayForm x vs $ reifyDef expandAnonDefs x vs+ I.Con x vs -> do+ isR <- isGeneratedRecordConstructor x+ case isR of+ True -> do+ showImp <- showImplicitArguments+ let keep (a, v) = showImp || argHiding a == NotHidden+ r <- getConstructorData x+ xs <- getRecordFieldNames r+ vs <- map unArg <$> reify vs+ return $ A.Rec exprInfo $ map (unArg *** id) $ filter keep $ zip xs vs+ False -> reifyDisplayForm x vs $ do+ ci <- getConstInfo x+ let Constructor{conPars = np} = theDef ci+ -- if we are the the module that defines constructor x+ -- then we have to drop at least the n module parameters+ n <- getDefFreeVars x+ -- the number of parameters is greater (if the data decl has+ -- extra parameters) or equal (if not) to n+ when (n > np) __IMPOSSIBLE__+ let h = A.Con (AmbQ [x])+ if null vs then return h else do+ es <- reify vs+ -- Andreas, 2012-04-20: do not reify parameter arguments of constructor+ -- if the first regular constructor argument is hidden+ -- we turn it into a named argument, in order to avoid confusion+ -- with the parameter arguments which can be supplied in abstract syntax+ --+ -- Andreas, 2012-09-17: this does not remove all sources of confusion,+ -- since parameters could have the same name as regular arguments+ -- (see for example the parameter {i} to Data.Star.Star, which is also+ -- the first argument to the cons).+ -- @data Star {i}{I : Set i} ... where cons : {i : I} ...@+ if (np == 0) then apps h es -- if np==0 then n==0+ -- WAS: if (np == 0) then apps h $ genericDrop n es+ else do -- get name of argument from type of constructor+ TelV tel _ <- telView (defType ci) -- need reducing version of telView because target of constructor could be a definition expanding into a function type+ let -- TelV tel _ = telView' (defType ci) -- WRONG, see test/suceed/NameFirstIfHidden+ doms = genericDrop np $ telToList tel+ case doms of+ -- Andreas, 2012-09-18+ -- If the first regular constructor argument is hidden,+ -- we keep the parameters to avoid confusion.+ (Dom Hidden _ _ : _) -> do+ let us = genericReplicate (np - n) $ Arg Hidden Relevant underscore+ apps h $ us ++ es+ -- otherwise, we drop all parameters+ _ -> apps h es+{- CODE FROM 2012-04-xx+ reportSLn "syntax.reify.con" 30 $ unlines+ [ "calling nameFirstIfHidden"+ , "doms = " ++ show doms+ , "es = " ++ show es+ , "n = " ++ show n+ , "np = " ++ show np+ ]+ napps h $ genericDrop (n - np) $ nameFirstIfHidden doms es+-}+ I.Lam h b -> do+ (x,e) <- reify b+ return $ A.Lam exprInfo (DomainFree h Relevant x) e+ -- Andreas, 2011-04-07 we do not need relevance information at internal Lambda+ I.Lit l -> reify l+ I.Level l -> reify l+ I.Pi a b -> case b of+ NoAbs _ b -> uncurry (A.Fun $ exprInfo) <$> reify (a,b)+ b -> do+ Arg h r a <- reify a+ (x, b) <- reify b+ return $ A.Pi exprInfo [TypedBindings noRange $ Arg h r (TBind noRange [x] a)] b+ I.Sort s -> reify s+ I.MetaV x vs -> uncurry apps =<< reify (x,vs)+ I.DontCare v -> A.DontCare <$> reifyTerm expandAnonDefs v+ I.Shared p -> reifyTerm expandAnonDefs $ derefPtr p++ where+ -- Andreas, 2012-10-20 expand a copy in an anonymous module+ -- to improve error messages.+ -- Don't do this if we have just expanded into a display form,+ -- otherwise we loop!+ reifyDef True x@(QName m name) vs | A.isAnonymousModuleName m = do+ r <- reduceDefCopy x vs+ case r of+ YesReduction v -> do+ reportSLn "reify.anon" 20 $ unlines+ [ "reduction on defined ident. in anonymous module"+ , "x = " ++ show x+ , "v = " ++ show v+ ]+ reify v+ NoReduction () -> do+ reportSLn "reify.anon" 20 $ unlines+ [ "no reduction on defined ident. in anonymous module"+ , "x = " ++ show x+ , "vs = " ++ show vs+ ]+ reifyDef' x vs+ reifyDef _ x vs = reifyDef' x vs++ reifyDef' x@(QName _ name) vs = do mdefn <- liftTCM $ (Just <$> getConstInfo x) `catchError` \_ -> return Nothing- (pad, vs) <-+ (pad, vs :: [NamedArg Term]) <- case mdefn of- Nothing -> (,) [] <$> (flip genericDrop vs <$> getDefFreeVars x)+ Nothing -> (,) [] <$> do map (fmap unnamed) <$> (flip genericDrop vs <$> getDefFreeVars x) Just defn -> do let def = theDef defn -- This is tricky:@@ -239,77 +369,59 @@ -- We should drop this many arguments from the local context. n <- getDefFreeVars x -- These are the dropped projection arguments- pad <- case def of+ (np, pad, dom) <-+ case def of Function{ funProjection = Just (_, np) } -> do TelV tel _ <- telView (defType defn) scope <- getScope- let as = take (np - 1) $ telToList tel- whocares = A.Underscore (Info.MetaInfo noRange scope Nothing)- return $ map (fmap $ const whocares) as- _ -> return []+ let (as, dom:_) = splitAt (np - 1) $ telToList tel+ whocares = A.Underscore $ Info.emptyMetaInfo { metaScope = scope }+ return (np, map (argFromDom . (fmap $ const whocares)) as, dom)+ _ -> return (0, [], __IMPOSSIBLE__) -- Now pad' ++ vs' = drop n (pad ++ vs) let pad' = genericDrop n pad+ vs' :: [Arg Term] vs' = genericDrop (max 0 (n - size pad)) vs- -- If showImplicit then keep the padding otherwise ignore it- ifM showImplicitArguments- (return (pad', vs'))- (return ([], vs'))+ -- Andreas, 2012-04-21: get rid of hidden underscores {_}+ -- Keep non-hidden arguments of the padding+ showImp <- showImplicitArguments+ return (filter (not . isHiddenArg) pad',+ if not (null pad) && showImp && isHiddenArg (last pad)+ then nameFirstIfHidden [dom] vs'+ else map (fmap unnamed) vs') df <- displayFormsEnabled if df && isPrefixOf extendlambdaname (show name) then do reportSLn "int2abs.reifyterm.def" 10 $ "reifying extended lambda with definition: " ++ show x info <- getConstInfo x- cls <- mapM (reify . (NamedClause x)) $ defClauses info+ --drop lambda lifted arguments+ Just (h , nh) <- Map.lookup x <$> getExtLambdaTele+ let n = h + nh+ cls <- mapM (reify . (QNamed x) . (dropArgs n)) $ defClauses info -- Karim: Currently Abs2Conc does not require a DefInfo thus we -- use __IMPOSSIBLE__.- reifyApp (A.ExtendedLam exprInfo __IMPOSSIBLE__ x cls) vs- else- let apps = foldl (\e a -> A.App exprInfo e (fmap unnamed a)) in- reifyApp (A.Def x `apps` pad) vs- I.Con x vs -> do- isR <- isGeneratedRecordConstructor x- case isR of- True -> do- showImp <- showImplicitArguments- let keep (a, v) = showImp || argHiding a == NotHidden- r <- getConstructorData x- xs <- getRecordFieldNames r- vs <- reify $ map unArg vs- return $ A.Rec exprInfo $ map (unArg *** id) $ filter keep $ zip xs vs- False -> reifyDisplayForm x vs $ do- -- let hide a = a { argHiding = Hidden }- Constructor{conPars = np} <- theDef <$> getConstInfo x- scope <- getScope- let whocares = A.Underscore (Info.MetaInfo noRange scope Nothing)- us = replicate (fromIntegral np) $ Arg Hidden Relevant whocares- n <- getDefFreeVars x- es <- reify vs- apps (A.Con (AmbQ [x]), genericDrop n $ us ++ es)- I.Lam h b -> do- (x,e) <- reify b- return $ A.Lam exprInfo (DomainFree h Relevant x) e- -- Andreas, 2011-04-07 we do not need relevance information at internal Lambda- I.Lit l -> reify l- I.Level l -> reify l- I.Pi a b -> case b of- NoAbs _ b -> uncurry (A.Fun $ exprInfo) <$> reify (a,b)- b -> do- Arg h r a <- reify a- (x, b) <- reify b- return $ A.Pi exprInfo [TypedBindings noRange $ Arg h r (TBind noRange [x] a)] b- I.Sort s -> reify s- I.MetaV x vs -> apps =<< reify (x,vs)- I.DontCare v -> A.DontCare <$> reify v-{- Andreas: I want to see irrelevant, but not implicit arguments- ifM showImplicitArguments- (reify v)- (return A.DontCare)--}-{- Andreas, 2011-09-09- I.DontCare Nothing -> return A.DontCare- I.DontCare (Just v) -> reify v -- leads to paradox error msg in test/fail/UnifyWithIrrelevantArgument--}+ napps (A.ExtendedLam exprInfo __IMPOSSIBLE__ x cls) =<< reify vs+ else do+ let apps = foldl' (\e a -> A.App exprInfo e (fmap unnamed a))+ napps (A.Def x `apps` pad) =<< reify vs +-- | @nameFirstIfHidden n (a1->...an->{x:a}->b) ({e} es) = {x = e} es@+nameFirstIfHidden :: [Dom (String, t)] -> [Arg a] -> [NamedArg a]+nameFirstIfHidden _ [] = []+nameFirstIfHidden [] (_ : _) = __IMPOSSIBLE__+nameFirstIfHidden (dom : _) (Arg Hidden r e : es) =+ Arg Hidden r (Named (Just $ fst $ unDom dom) e) : map (fmap unnamed) es+nameFirstIfHidden _ es = map (fmap unnamed) es++instance Reify i a => Reify (Named n i) (Named n a) where+ reify = traverse reify++-- | Skip reification of implicit and irrelevant args if option is off.+instance (ReifyWhen i a) => Reify (Arg i) (Arg a) where+ reify (Arg h r i) = Arg h r <$> do flip reifyWhen i =<< condition+ where condition = (return (h /= Hidden) `or2M` showImplicitArguments)+ `and2M` (return (r /= Irrelevant) `or2M` showIrrelevantArguments)+ instance Reify Elim Expr where reify e = case e of I.Apply v -> appl "apply" <$> reify v@@ -318,9 +430,8 @@ appl :: String -> Arg Expr -> Expr appl s v = A.App exprInfo (A.Lit (LitString noRange s)) $ fmap unnamed v -data NamedClause = NamedClause QName I.Clause--- Named clause does not need 'Recursion' flag since I.Clause has it--- data NamedClause = NamedClause QName Recursion I.Clause+type NamedClause = QNamed I.Clause+-- data NamedClause = NamedClause QName I.Clause instance Reify ClauseBody RHS where reify NoBody = return AbsurdRHS@@ -338,17 +449,17 @@ , " wps = " ++ show wps , " vars = " ++ show vars ]- let allps = ps ++ map (defaultArg . unnamed) wps+ let allps = ps ++ map defaultNamedArg wps sps = foldl (.) (strip vars) (map rearrangeBinding $ Set.toList vars) $ allps (ps', wps') = splitAt (length sps - length wps) sps reportSLn "syntax.reify.implicit" 30 $ unlines [ " ps' = " ++ show ps'- , " wps' = " ++ show (map (namedThing . unArg) wps')+ , " wps' = " ++ show (map namedArg wps') ]- return (ps', map (namedThing . unArg) wps')+ return (ps', map namedArg wps') where argsVars = Set.unions . map argVars- argVars = patVars . namedThing . unArg+ argVars = patVars . namedArg patVars p = case p of A.VarP x -> Set.singleton x A.ConP _ _ ps -> argsVars ps@@ -359,6 +470,7 @@ A.LitP _ -> Set.empty A.ImplicitP _ -> Set.empty A.AsP _ _ p -> patVars p+ A.PatternSynP _ _ _ -> __IMPOSSIBLE__ -- Set.empty -- Pick the "best" place to bind the variable. Best in this case -- is the left-most explicit binding site. But, of course we can't@@ -379,7 +491,7 @@ , noInterestingBindings p , all (flip canStrip []) $ takeWhile ((Hidden ==) . argHiding) as ]- where p = namedThing $ unArg a+ where p = namedArg a stripArg a = fmap (fmap stripPat) a @@ -393,6 +505,7 @@ A.LitP _ -> p A.ImplicitP _ -> p A.AsP i x p -> A.AsP i x $ stripPat p+ A.PatternSynP _ _ _ -> __IMPOSSIBLE__ -- p noInterestingBindings p = Set.null $ dvs `Set.intersection` patVars p@@ -438,37 +551,39 @@ A.LitP _ -> Set.empty A.ImplicitP _ -> Set.empty A.AsP _ _ p -> dotVars p+ A.PatternSynP _ _ _ -> __IMPOSSIBLE__ -- Set.empty -- | Getting all(!) variables of an expression. -- It should only get free ones, but it does not matter to include -- the bound ones. instance DotVars A.Expr where dotVars e = case e of- A.ScopedExpr _ e -> dotVars e- A.Var x -> Set.singleton x -- add any expression variable- A.Def _ -> Set.empty- A.Con _ -> Set.empty- A.Lit _ -> Set.empty- A.QuestionMark _ -> Set.empty- A.Underscore _ -> Set.empty- A.App _ e1 e2 -> dotVars (e1, e2)- A.WithApp _ e es -> dotVars (e, es)- A.Lam _ _ e -> dotVars e- A.AbsurdLam _ _ -> Set.empty+ A.ScopedExpr _ e -> dotVars e+ A.Var x -> Set.singleton x -- add any expression variable+ A.Def _ -> Set.empty+ A.Con _ -> Set.empty+ A.Lit _ -> Set.empty+ A.QuestionMark _ -> Set.empty+ A.Underscore _ -> Set.empty+ A.App _ e1 e2 -> dotVars (e1, e2)+ A.WithApp _ e es -> dotVars (e, es)+ A.Lam _ _ e -> dotVars e+ A.AbsurdLam _ _ -> Set.empty A.ExtendedLam _ _ _ cs -> dotVars cs- A.Pi _ tel e -> dotVars (tel, e)- A.Fun _ a b -> dotVars (a, b)- A.Set _ _ -> Set.empty- A.Prop _ -> Set.empty- A.Let _ _ _ -> __IMPOSSIBLE__- A.Rec _ es -> dotVars $ map snd es- A.RecUpdate _ e es -> dotVars (e, map snd es)- A.ETel _ -> __IMPOSSIBLE__- A.QuoteGoal {} -> __IMPOSSIBLE__- A.Quote {} -> __IMPOSSIBLE__- A.QuoteTerm {} -> __IMPOSSIBLE__- A.Unquote {} -> __IMPOSSIBLE__- A.DontCare v -> dotVars v+ A.Pi _ tel e -> dotVars (tel, e)+ A.Fun _ a b -> dotVars (a, b)+ A.Set _ _ -> Set.empty+ A.Prop _ -> Set.empty+ A.Let _ _ _ -> __IMPOSSIBLE__+ A.Rec _ es -> dotVars $ map snd es+ A.RecUpdate _ e es -> dotVars (e, map snd es)+ A.ETel _ -> __IMPOSSIBLE__+ A.QuoteGoal {} -> __IMPOSSIBLE__+ A.Quote {} -> __IMPOSSIBLE__+ A.QuoteTerm {} -> __IMPOSSIBLE__+ A.Unquote {} -> __IMPOSSIBLE__+ A.DontCare v -> dotVars v+ A.PatternSyn n -> Set.empty instance DotVars RHS where dotVars (RHS e) = dotVars e@@ -505,28 +620,40 @@ let vars = Set.map show (dotVars t) tick if Set.member "()" vars- then return $ A.DotP i $ A.Underscore mi+ then return $ A.DotP i $ underscore else return $ A.DotP i t I.LitP l -> return (A.LitP l) I.ConP c _ ps -> A.ConP i (AmbQ [c]) <$> reifyArgs ps where i = PatRange noRange- mi = MetaInfo noRange emptyScopeInfo Nothing instance Reify NamedClause A.Clause where- reify (NamedClause f (I.Clause _ tel perm ps body)) = addCtxTel tel $ do+ reify (QNamed f (I.Clause _ tel perm ps body)) = addCtxTel tel $ do ps <- reifyPatterns tel perm ps- lhs <- liftTCM $ reifyDisplayFormP $ LHS info f ps []+ lhs <- liftTCM $ reifyDisplayFormP $ LHS info (LHSHead f ps) [] nfv <- getDefFreeVars f lhs <- stripImps $ dropParams nfv lhs rhs <- reify body return $ A.Clause lhs rhs [] where info = LHSRange noRange- dropParams n (LHS i f ps wps) = LHS i f (genericDrop n ps) wps- stripImps (LHS i f ps wps) = do+ dropParams n (LHS i lhscore wps) =+ LHS i (mapLHSHead (\ f ps -> LHSHead f (genericDrop n ps)) lhscore) wps+ stripImps (LHS i lhscore wps) = do+ (wps', lhscore) <- stripIs lhscore+ return $ LHS i lhscore wps'+ where stripIs (LHSHead f ps) = do+ (ps, wps) <- stripImplicits ps wps+ return (wps, LHSHead f ps)+ stripIs (LHSProj d ps1 l ps2) = do+ Arg h r (Named n (wps, l)) <- Trav.mapM (Trav.mapM stripIs) l+ return (wps, LHSProj d ps1 (Arg h r (Named n l)) ps2)+{-+ dropParams n (LHS i (LHSHead f ps) wps) = LHS i (LHSHead f (genericDrop n ps)) wps+ stripImps (LHS i (LHSHead f ps) wps) = do (ps, wps) <- stripImplicits ps wps- return $ LHS i f ps wps+ return $ LHS i (LHSHead f ps) wps+-} instance Reify Type Expr where reify (I.El _ t) = reify t@@ -539,14 +666,13 @@ I.Type (I.Max [I.ClosedLevel n]) -> return $ A.Set exprInfo n I.Type a -> do a <- reify a- return $ A.App exprInfo (A.Set exprInfo 0)- (defaultArg (unnamed a))+ return $ A.App exprInfo (A.Set exprInfo 0) (defaultNamedArg a) I.Prop -> return $ A.Prop exprInfo I.Inf -> A.Var <$> freshName_ "Setω" I.DLub s1 s2 -> do lub <- freshName_ "dLub" -- TODO: hack (e1,e2) <- reify (s1, I.Lam NotHidden $ fmap Sort s2)- let app x y = A.App exprInfo x (defaultArg $ unnamed y)+ let app x y = A.App exprInfo x (defaultNamedArg y) return $ A.Var lub `app` e1 `app` e2 instance Reify Level Expr where@@ -561,7 +687,7 @@ s <- return $ if s == "_" && 0 `freeIn` v then "z" else s x <- freshName_ s- e <- addCtx x (defaultArg $ sort I.Prop) -- type doesn't matter+ e <- addCtx x dummyDom -- type doesn't matter $ reify v return (x,e) @@ -573,8 +699,8 @@ let r = getRange e return $ TypedBindings r (Arg h rel (TBind r [x] e)) : bs -instance Reify i a => Reify (Arg i) (Arg a) where- reify = traverse reify+instance Reify i a => Reify (Dom i) (Arg a) where+ reify (Dom h r i) = Arg h r <$> reify i instance Reify i a => Reify [i] [a] where reify = traverse reify
src/full/Agda/Termination/CallGraph.hs view
@@ -9,6 +9,7 @@ module Agda.Termination.CallGraph ( -- * Structural orderings Order(Mat), decr+ , increase, decrease , (.*.) , supremum, infimum , decreasing, le, lt, unknown, orderMat@@ -89,6 +90,17 @@ instance HasZero Order where zeroElement = Unknown +-- | Raw increase which does not cut off.+increase :: Int -> Order -> Order+increase i o = case o of+ Unknown -> Unknown+ Decr k -> Decr $ k - i+ Mat m -> Mat $ fmap (increase i) m++-- | Raw decrease which does not cut off.+decrease :: Int -> Order -> Order+decrease i o = increase (-i) o+ -- | Smart constructor for @Decr k :: Order@ which cuts off too big values. -- -- Possible values for @k@: @- ?cutoff '<=' k '<=' ?cutoff + 1@.@@ -214,10 +226,14 @@ okM m1 m2 = (rows $ size m2) == (cols $ size m1) -- | The supremum of a (possibly empty) list of 'Order's.-+-- More information (i.e., more decrease) is bigger.+-- 'Unknown' is no information, thus, smallest. supremum :: (?cutoff :: Int) => [Order] -> Order supremum = foldr maxO Unknown +-- | @('Order', 'maxO', '.*.')@ forms a semiring, with 'Unknown' as+-- zero and 'Le' as one.+ maxO :: (?cutoff :: Int) => Order -> Order -> Order maxO o1 o2 = case (o1,o2) of (Decr k, Decr l) -> Decr (max k l) -- cut off not needed@@ -227,14 +243,11 @@ (Mat m,_) -> maxO (collapse m) o2 (_,Mat m) -> maxO o1 (collapse m) --- | @('Order', 'max', '.*.')@ forms a semiring, with 'Unknown' as--- zero and 'Le' as one.- -- | The infimum of a (non empty) list of 'Order's.-+-- 'Unknown' is the least element, thus, dominant. infimum :: (?cutoff :: Int) => [Order] -> Order-infimum (o:l) = foldl minO o l-infimum [] = __IMPOSSIBLE__+infimum (o:l) = foldl' minO o l+infimum [] = __IMPOSSIBLE__ minO :: (?cutoff :: Int) => Order -> Order -> Order minO o1 o2 = case (o1,o2) of@@ -435,6 +448,12 @@ union :: Monoid meta => CallGraph meta -> CallGraph meta -> CallGraph meta union cs1 cs2 = CallGraph $ (Map.unionWith mappend `on` cg) cs1 cs2++-- | 'CallGraph' is a monoid under 'union'.++instance Monoid meta => Monoid (CallGraph meta) where+ mempty = empty+ mappend = union -- | Inserts a call into a call graph.
src/full/Agda/Termination/Lexicographic.hs view
@@ -1,3 +1,4 @@+{-# LANGUAGE CPP #-} -- | Lexicographic order search, more or less as defined in -- \"A Predicative Analysis of Structural Recursion\" by -- Andreas Abel and Thorsten Altenkirch.@@ -230,7 +231,11 @@ , quickCheck' prop_fromDiagonals , quickCheck' prop_newBehaviour , quickCheckWith' stdArgs{ maxSuccess = 50+#if MIN_VERSION_QuickCheck(2,5,0)+ , maxDiscardRatio = 4+#else , maxDiscard = 200+#endif , maxSize = 20 } prop_lexOrder
src/full/Agda/Termination/Matrix.hs view
@@ -1,3 +1,4 @@+{-# LANGUAGE GeneralizedNewtypeDeriving #-} -- | Naive implementation of simple matrix library. -- Originally copied from Agda1 sources.@@ -96,7 +97,7 @@ -- | Type of matrices, parameterised on the type of values. newtype Matrix i b = M { unM :: Array (MIx i) b }- deriving (Eq, Ord)+ deriving (Eq, Ord, Functor) matrixInvariant :: (Num i, Ix i) => Matrix i b -> Bool matrixInvariant m =
src/full/Agda/Termination/SparseMatrix.hs view
@@ -1,4 +1,4 @@-{-# LANGUAGE CPP #-}+{-# LANGUAGE CPP, DeriveFunctor #-} {- | Sparse matrices. @@ -108,7 +108,7 @@ -- | Type of matrices, parameterised on the type of values. data Matrix i b = M { size :: Size i, unM :: [(MIx i, b)] }- deriving (Eq, Ord)+ deriving (Eq, Ord, Functor) matrixInvariant :: (Num i, Ix i) => Matrix i b -> Bool matrixInvariant m = all (\ (MIx i j, b) -> 1 <= i && i <= rows sz@@ -334,7 +334,7 @@ => Semiring a -> Matrix i a -> Matrix i a -> Matrix i a mul semiring m1 m2 = M (Size { rows = rows (size m1), cols = cols (size m2) }) $ filter (\ (i,b) -> b /= Semiring.zero semiring) $- [ (MIx i j, foldl (Semiring.add semiring) (Semiring.zero semiring) $+ [ (MIx i j, List.foldl' (Semiring.add semiring) (Semiring.zero semiring) $ map snd $ interAssocWith (Semiring.mul semiring) v w) | (i,v) <- toSparseRows m1 , (j,w) <- toSparseRows $ transpose m2 ]
src/full/Agda/Termination/TermCheck.hs view
@@ -1,4 +1,4 @@-{-# LANGUAGE CPP, PatternGuards, ImplicitParams #-}+{-# LANGUAGE CPP, PatternGuards, ImplicitParams, TupleSections #-} {- Checking for Structural recursion Authors: Andreas Abel, Nils Anders Danielsson, Ulf Norell,@@ -8,25 +8,30 @@ -} module Agda.Termination.TermCheck- ( termDecls+ ( termDecl , Result, DeBruijnPat ) where import Control.Applicative import Control.Monad.Error+import Control.Monad.State+ import Data.List as List import qualified Data.Map as Map import Data.Map (Map) import qualified Data.Maybe as Maybe+import Data.Monoid import qualified Data.Set as Set import Data.Set (Set) import qualified Agda.Syntax.Abstract as A+-- import Agda.Syntax.Abstract.Pretty (prettyA) import Agda.Syntax.Internal import qualified Agda.Syntax.Info as Info import Agda.Syntax.Position import Agda.Syntax.Common import Agda.Syntax.Literal (Literal(LitString))+import Agda.Syntax.Translation.InternalToAbstract import Agda.Termination.CallGraph as Term import qualified Agda.Termination.SparseMatrix as Term@@ -35,23 +40,28 @@ import Agda.TypeChecking.Monad import Agda.TypeChecking.Pretty import Agda.TypeChecking.Reduce (reduce, normalise, instantiate, instantiateFull)-import Agda.TypeChecking.Records (isRecordConstructor)+import Agda.TypeChecking.Records (isRecordConstructor, isRecord, isInductiveRecord) import Agda.TypeChecking.Rules.Builtin.Coinduction import Agda.TypeChecking.Rules.Term (isType_)-import Agda.TypeChecking.Substitute (abstract,raise,substs)+import Agda.TypeChecking.Substitute (abstract,raise) import Agda.TypeChecking.Telescope import Agda.TypeChecking.EtaContract import Agda.TypeChecking.Monad.Builtin-import Agda.TypeChecking.Monad.Signature (isProjection)+import Agda.TypeChecking.Monad.Signature (isProjection, mutuallyRecursive) import Agda.TypeChecking.Primitive (constructorForm) import Agda.TypeChecking.Level (reallyUnLevelView) import Agda.TypeChecking.Substitute+import Agda.TypeChecking.SizedTypes import qualified Agda.Interaction.Highlighting.Range as R import Agda.Interaction.Options +import Agda.Utils.List import Agda.Utils.Size-import Agda.Utils.Monad (thread, (<$>), ifM)+import Agda.Utils.Monad ((<$>), mapM', forM', ifM)+-- import Agda.Utils.NubList+import Agda.Utils.Pointed+import Agda.Utils.Permutation #include "../undefined.h" import Agda.Utils.Impossible@@ -60,12 +70,15 @@ type MutualNames = [QName] -- | The result of termination checking a module.-+-- Must be 'Pointed' and a 'Monoid'. type Result = [TerminationError] +-- use of a NubList did not achieve the desired effect, now unnecessary+-- type Result = NubList TerminationError+ -- | Termination check a sequence of declarations. termDecls :: [A.Declaration] -> TCM Result-termDecls ds = fmap concat $ mapM termDecl ds+termDecls ds = concat <$> mapM termDecl ds -- | Termination check a single declaration. termDecl :: A.Declaration -> TCM Result@@ -73,30 +86,27 @@ setScope scope termDecls ds termDecl d = case d of- A.Axiom {} -> return []- A.Field {} -> return []- A.Primitive {} -> return []+ A.Axiom {} -> return mempty+ A.Field {} -> return mempty+ A.Primitive {} -> return mempty A.Mutual _ ds- | [A.RecSig{}, A.RecDef _ r _ _ _ rds] <- unscopeDefs ds- -> do- let m = mnameFromList $ qnameToList r- setScopeFromDefs ds- termSection m rds- A.Mutual i ds -> termMutual i ds+ | [A.RecSig{}, A.RecDef _ r _ _ _ _ rds] <- unscopeDefs ds+ -> checkRecDef ds r rds+ A.Mutual i ds -> termMutual i ds A.Section _ x _ ds -> termSection x ds- A.Apply {} -> return []- A.Import {} -> return []- A.Pragma {} -> return []- A.Open {} -> return []+ A.Apply {} -> return mempty+ A.Import {} -> return mempty+ A.Pragma {} -> return mempty+ A.Open {} -> return mempty -- open is just an artifact from the concrete syntax A.ScopedDecl{} -> __IMPOSSIBLE__ -- taken care of above+ A.RecSig{} -> return mempty+ A.RecDef _ r _ _ _ _ ds -> checkRecDef [] r ds -- These should all be wrapped in mutual blocks A.FunDef{} -> __IMPOSSIBLE__ A.DataSig{} -> __IMPOSSIBLE__ A.DataDef{} -> __IMPOSSIBLE__- A.RecSig{} -> __IMPOSSIBLE__- A.RecDef{} -> __IMPOSSIBLE__ where setScopeFromDefs = mapM_ setScopeFromDef setScopeFromDef (A.ScopedDecl scope d) = setScope scope@@ -107,32 +117,36 @@ unscopeDef (A.ScopedDecl _ ds) = unscopeDefs ds unscopeDef d = [d] -collectCalls :: (a -> TCM Calls) -> [a] -> TCM Calls-collectCalls f [] = return Term.empty-collectCalls f (a : as) = do c1 <- f a- c2 <- collectCalls f as- return (c1 `Term.union` c2)+ checkRecDef ds r rds = do+ setScopeFromDefs ds+ termSection (mnameFromList $ qnameToList r) rds -- | Termination check a bunch of mutually inductive recursive definitions.-termMutual :: Info.DeclInfo -> [A.Declaration] -> TCM Result-termMutual i ds = if names == [] then return [] else- do -- get list of sets of mutually defined names from the TCM+termMutual :: Info.MutualInfo -> [A.Declaration] -> TCM Result+termMutual i ds = if names == [] then return mempty else+ -- we set the range to avoid panics when printing error messages+ traceCall (SetRange (Info.mutualRange i)) $ do++ mutualBlock <- findMutualBlock (head names)+ let allNames = Set.elems mutualBlock++ if not (Info.mutualTermCheck i) then do+ reportSLn "term.warn.yes" 2 $ "Skipping termination check for " ++ show names+ forM_ allNames $ \ q -> setTerminates q True -- considered terminating!+ return mempty+ else do+ -- get list of sets of mutually defined names from the TCM -- this includes local and auxiliary functions introduced -- during type-checking cutoff <- optTerminationDepth <$> pragmaOptions- let ?cutoff = cutoff+ let ?cutoff = cutoff -- needed for Term.terminates reportSLn "term.top" 10 $ "Termination checking " ++ show names ++ " with cutoff=" ++ show cutoff ++ "..."- mutualBlock <- findMutualBlock (head names)- let allNames = Set.elems mutualBlock - -- collect all recursive calls in the block- let collect use = collectCalls (termDef use allNames) allNames- -- Get the name of size suc (if sized types are enabled)- suc <- sizeSuc+ suc <- sizeSucName -- The name of sharp (if available). sharp <- fmap nameOfSharp <$> coinductionKit@@ -140,70 +154,143 @@ guardingTypeConstructors <- optGuardingTypeConstructors <$> pragmaOptions - -- first try to termination check ignoring the dot patterns let conf = DBPConf { useDotPatterns = False , guardingTypeConstructors = guardingTypeConstructors , withSizeSuc = suc , sharp = sharp+ , currentTarget = Nothing }++ -- new check currently only makes a difference for copatterns+ -- since it is slow, only invoke it if --copatterns+ res <- ifM (optCopatterns <$> pragmaOptions)+ (forM' allNames $ termFunction conf names allNames) -- new check one after another+ (termMutual' conf names allNames) -- old check, all at once++ -- record result of termination check in signature+ let terminates = null res+ forM_ allNames $ \ q -> setTerminates q terminates+ return res++ where+ getName (A.FunDef i x delayed cs) = [x]+ getName (A.RecDef _ _ _ _ _ _ ds) = concatMap getName ds+ getName (A.Mutual _ ds) = concatMap getName ds+ getName (A.Section _ _ _ ds) = concatMap getName ds+ getName (A.ScopedDecl _ ds) = concatMap getName ds+ getName _ = []++ -- the mutual names mentioned in the abstract syntax+ names = concatMap getName ds+++-- | @termMutual' conf names allNames@ checks @allNames@ for termination.+--+-- @names@ is taken from the 'Abstract' syntax, so it contains only+-- the names the user has declared. This is for error reporting.+--+-- @allNames@ is taken from 'Internal' syntax, it contains also+-- the definitions created by the type checker (e.g., with-functions).+--+termMutual' :: (?cutoff :: Int) => DBPConf -> [QName] -> MutualNames -> TCM Result+termMutual' conf names allNames = do++ -- collect all recursive calls in the block+ let collect conf = mapM' (termDef conf allNames) allNames++ -- first try to termination check ignoring the dot patterns calls1 <- collect conf{ useDotPatterns = False }- reportS "term.lex" 20 $ unlines- [ "Calls (no dot patterns): " ++ show calls1- ]- reportSDoc "term.behaviours" 20 $ vcat- [ text "Recursion behaviours (no dot patterns):"- , nest 2 $ return $ Term.prettyBehaviour (Term.complete calls1)- ]- reportSDoc "term.matrices" 30 $ vcat- [ text "Call matrices (no dot patterns):"- , nest 2 $ pretty $ Term.complete calls1- ]- r <- do let r = Term.terminates calls1- case r of- Right _ -> return r- Left _ -> do- -- Try again, but include the dot patterns this time.- calls2 <- collect conf{ useDotPatterns = True }- reportS "term.lex" 20 $ unlines- [ "Calls (dot patterns): " ++ show calls2- ]- reportSDoc "term.behaviours" 20 $ vcat- [ text "Recursion behaviours (dot patterns):"- , nest 2 $ return $- Term.prettyBehaviour (Term.complete calls2)- ]- reportSDoc "term.matrices" 30 $ vcat- [ text "Call matrices (dot patterns):"- , nest 2 $ pretty $ Term.complete calls2- ]- return $ Term.terminates calls2+ reportCalls "no " calls1++ r <- case Term.terminates calls1 of+ r@Right{} -> return r+ Left{} -> do+ -- Try again, but include the dot patterns this time.+ calls2 <- collect conf{ useDotPatterns = True }+ reportCalls "" calls2+ return $ Term.terminates calls2 case r of Left calls -> do- return [TerminationError+ return $ point $ TerminationError { termErrFunctions = names- -- TODO: This could be changed to allNames. , termErrCalls = Set.toList calls }- ] Right _ -> do reportSLn "term.warn.yes" 2 (show (names) ++ " does termination check")- return []+ return mempty where- getName (A.FunDef i x cs) = [x]- getName (A.RecDef _ _ _ _ _ ds) = concatMap getName ds- getName (A.Mutual _ ds) = concatMap getName ds- getName (A.Section _ _ _ ds) = concatMap getName ds- getName (A.ScopedDecl _ ds) = concatMap getName ds- getName _ = [] - -- the mutual names mentioned in the abstract syntax- names = concatMap getName ds+reportCalls no calls = do+ reportS "term.lex" 20 $ unlines+ [ "Calls (" ++ no ++ "dot patterns): " ++ show calls+ ]+ reportSDoc "term.behaviours" 20 $ vcat+ [ text $ "Recursion behaviours (" ++ no ++ "dot patterns):"+ , nest 2 $ return $ Term.prettyBehaviour (Term.complete calls)+ ]+ reportSDoc "term.matrices" 30 $ vcat+ [ text $ "Call matrices (" ++ no ++ "dot patterns):"+ , nest 2 $ pretty $ Term.complete calls+ ] - concat' :: Ord a => [Set a] -> [a]- concat' = Set.toList . Set.unions+-- | @termFunction conf names allNames name@ checks @name@ for termination.+--+-- @names@ is taken from the 'Abstract' syntax, so it contains only+-- the names the user has declared. This is for error reporting.+--+-- @allNames@ is taken from 'Internal' syntax, it contains also+-- the definitions created by the type checker (e.g., with-functions).+--+termFunction :: (?cutoff :: Int) => DBPConf -> [QName] -> MutualNames -> QName -> TCM Result+termFunction conf0 names allNames name = do + let index = toInteger $ maybe __IMPOSSIBLE__ id $+ List.elemIndex name allNames++ conf <- do+ r <- typeEndsInDef =<< typeOfConst name+ reportTarget r+ return $ conf0 { currentTarget = r }++ -- collect all recursive calls in the block+ let collect conf = mapM' (termDef conf allNames) allNames++ -- first try to termination check ignoring the dot patterns+ calls1 <- collect conf{ useDotPatterns = False }+ reportCalls "no " calls1++ r <- case Term.terminatesFilter (== index) calls1 of+ r@Right{} -> return r+ Left{} -> do+ -- Try again, but include the dot patterns this time.+ calls2 <- collect conf{ useDotPatterns = True }+ reportCalls "" calls2+ return $ Term.terminatesFilter (== index) calls2+ case r of+ Left calls -> do+ return $ point $ TerminationError+ { termErrFunctions = if name `elem` names then [name] else []+ , termErrCalls = Set.toList calls+ }+ Right _ -> do+ reportSLn "term.warn.yes" 2+ (show (name) ++ " does termination check")+ return mempty+ where+ reportTarget r = reportSLn "term.target" 20 $ maybe+ (" target type not recognized")+ (\ q -> " target type ends in " ++ show q)+ r++typeEndsInDef :: Type -> TCM (Maybe QName)+typeEndsInDef t = do+ TelV _ core <- telView t+ case ignoreSharing $ unEl core of+ Def d vs -> return $ Just d+ _ -> return Nothing+ -- | Termination check a module. termSection :: ModuleName -> [A.Declaration] -> TCM Result termSection x ds = do@@ -228,8 +315,8 @@ , nest 2 $ text ":" <+> (prettyTCM $ defType def) ] case (theDef def) of- Function{ funClauses = cls } ->- collectCalls (termClause use names name) cls+ Function{ funClauses = cls, funDelayed = delayed } ->+ mapM' (termClause use names name delayed) cls _ -> return Term.empty @@ -286,16 +373,45 @@ {- | Configuration parameters to termination checker. -}-data DBPConf = DBPConf { useDotPatterns :: Bool- , guardingTypeConstructors :: Bool- -- ^ Do we assume that record and data type- -- constructors preserve guardedness?- , withSizeSuc :: Maybe QName- , sharp :: Maybe QName- -- ^ The name of the sharp constructor, if- -- any.- }+data DBPConf = DBPConf+ { useDotPatterns :: Bool+ , guardingTypeConstructors :: Bool+ -- ^ Do we assume that record and data type constructors preserve guardedness?+ , withSizeSuc :: Maybe QName+ , sharp :: Maybe QName+ -- ^ The name of the sharp constructor, if any.+ , currentTarget :: Maybe Target+ -- ^ Target type of the function we are currently termination checking.+ -- Only the constructors of 'Target' are considered guarding.+ } +type Target = QName++targetElem :: DBPConf -> [Target] -> Bool+targetElem conf ds = maybe False (`elem` ds) (currentTarget conf)++{-+-- | Check wether a 'Target" corresponds to the current one.+matchingTarget :: DBPConf -> Target -> TCM Bool+matchingTarget conf d = maybe (return True) (mutuallyRecursive d) (currentTarget conf)+-}++{-+-- | The target type of the considered recursive definition.+data Target+ = Set -- ^ Constructing a Set (only meaningful with 'guardingTypeConstructors').+ | Data QName -- ^ Constructing a coinductive or mixed type (could be data or record).+ deriving (Eq, Show)++-- | Check wether a 'Target" corresponds to the current one.+matchingTarget :: DBPConf -> Target -> TCM Bool+matchingTarget conf t = maybe (return True) (match t) (currentTarget conf)+ where+ match Set Set = return True+ match (Data d) (Data d') = mutuallyRecursive d d'+ match _ _ = return False+-}+ {- | Convert a term (from a dot pattern) to a DeBruijn pattern. -} @@ -304,7 +420,7 @@ | not $ useDotPatterns conf = return $ unusedVar | otherwise = do t <- stripProjections =<< constructorForm t- case t of+ case ignoreSharing t of Var i [] -> return $ VarDBP i Con c args -> ConDBP c <$> mapM (termToDBP conf . unArg) args Def s [arg]@@ -326,6 +442,7 @@ Inductive -> ConDBP c <$> mapM (stripCoConstructors conf) args CoInductive -> return unusedVar +{- Andreas, 2012-09-19 BAD CODE, RETIRED {- | stripBind i p b = Just (i', dbp, b') converts a pattern into a de Bruijn pattern@@ -367,23 +484,67 @@ Just (i2, dbps, b2) -> return $ Just (i2, dbp:dbps, b2) Nothing -> return Nothing Nothing -> return Nothing+-} +-- | cf. 'TypeChecking.Coverage.Match.buildMPatterns'+openClause :: DBPConf -> Permutation -> [Pattern] -> ClauseBody -> TCM ([DeBruijnPat], Maybe Term)+openClause conf perm ps body = do+ -- invariant: xs has enough variables for the body+ unless (permRange perm == genericLength xs) __IMPOSSIBLE__+ dbps <- evalStateT (mapM build ps) xs+ return . (dbps,) $ case body `apply` map (defaultArg . var) xs of+ NoBody -> Nothing+ Body v -> Just v+ _ -> __IMPOSSIBLE__+ where+ -- length of the telescope+ n = size perm+ -- the variables as a map from the body variables to the clause telescope+ xs = permute (invertP perm) $ downFrom (size perm)++ tick = do x : xs <- get; put xs; return x++ build :: Pattern -> StateT [Nat] TCM DeBruijnPat+ build (VarP _) = VarDBP <$> tick+ build (ConP con _ ps) = ConDBP con <$> mapM (build . unArg) ps+ build (DotP t) = tick *> do lift $ termToDBP conf t+ build (LitP l) = return $ LitDBP l++ -- | Extract recursive calls from one clause.-termClause :: DBPConf -> MutualNames -> QName -> Clause -> TCM Calls-termClause use names name (Clause { clauseTel = tel- , clausePerm = perm- , clausePats = argPats'- , clauseBody = body }) =+termClause :: DBPConf -> MutualNames -> QName -> Delayed -> Clause -> TCM Calls+termClause conf names name delayed+ (Clause { clauseTel = tel+ , clausePerm = perm+ , clausePats = argPats'+ , clauseBody = body }) = do+ reportSDoc "term.check.clause" 25 $ vcat+ [ text "termClause"+ , nest 2 $ text "tel =" <+> prettyTCM tel+ , nest 2 $ text ("perm = " ++ show perm)+ -- how to get the following right?+ -- , nest 2 $ text "argPats' =" <+> do prettyA =<< reifyPatterns tel perm argPats'+ ] addCtxTel tel $ do+ ps <- normalise $ map unArg argPats'+ (dbpats, res) <- openClause conf perm ps body+ case res of+ Nothing -> return Term.empty+ Just t -> do+ dbpats <- mapM (stripCoConstructors conf) dbpats+ termTerm conf names name delayed dbpats t++{-+ addCtxTel tel $ do argPats' <- normalise argPats' -- The termination checker doesn't know about reordered telescopes let argPats = substs (renamingR perm) argPats'- dbs <- stripBinds use (nVars - 1) (map unArg argPats) body+ dbs <- stripBinds conf (nVars - 1) (map unArg argPats) body case dbs of Nothing -> return Term.empty Just (-1, dbpats, Body t) -> do- dbpats <- mapM (stripCoConstructors use) dbpats- termTerm use names name dbpats t+ dbpats <- mapM (stripCoConstructors conf) dbpats+ termTerm conf names name delayed dbpats t -- note: convert dB levels into dB indices Just (n, dbpats, Body t) -> internalError $ "termClause: misscalculated number of vars: guess=" ++ show nVars ++ ", real=" ++ show (nVars - 1 - n) Just (n, dbpats, b) -> internalError $ "termClause: not a Body" -- ++ show b@@ -392,20 +553,35 @@ boundVars (Bind b) = 1 + boundVars (absBody b) boundVars NoBody = 0 boundVars (Body _) = 0+-} -- | Extract recursive calls from a term.-termTerm :: DBPConf -> MutualNames -> QName -> [DeBruijnPat] -> Term -> TCM Calls-termTerm conf names f pats0 t0 = do+termTerm :: DBPConf -> MutualNames -> QName -> Delayed -> [DeBruijnPat] -> Term -> TCM Calls+termTerm conf names f delayed pats0 t0 = do cutoff <- optTerminationDepth <$> pragmaOptions let ?cutoff = cutoff do reportSDoc "term.check.clause" 6- (sep [ text "termination checking clause of" <+> prettyTCM f+ (sep [ text ("termination checking " +++ (if delayed == Delayed then "delayed " else "") ++ "clause of")+ <+> prettyTCM f , nest 2 $ text "lhs:" <+> hsep (map prettyTCM pats0) , nest 2 $ text "rhs:" <+> prettyTCM t0 ])- loop pats0 Term.le t0+ {-+ -- if we are checking a delayed definition, we treat it as if there were+ -- a guarding coconstructor (sharp)+ let guarded = case delayed of+ Delayed -> Term.lt+ NotDelayed -> Term.le+ -}+ let guarded = Term.le -- not initially guarded+ loop pats0 guarded t0 where+ -- only a delayed definition can be guarded+ ifDelayed o | Term.decreasing o && delayed == NotDelayed = Term.le+ | otherwise = o+ Just fInd = toInteger <$> List.elemIndex f names -- sorts can contain arb. terms of type Nat,@@ -414,10 +590,18 @@ -- a subgrammar of Term, then we would not need this boilerplate. loopSort :: (?cutoff :: Int) => [DeBruijnPat] -> Sort -> TCM Calls loopSort pats s = do+ reportSDoc "term.sort" 20 $ text "extracting calls from sort" <+> prettyTCM s+ reportSDoc "term.sort" 50 $ text ("s = " ++ show s)+ -- s <- instantiateFull s -- Andreas, 2012-09-05 NOT NECESSARY+ -- instantiateFull resolves problems with reallyUnLevelView+ -- in the absense of level built-ins.+ -- However, the termination checker should only receive terms+ -- that are already fully instantiated.+ case s of Type (Max []) -> return Term.empty Type (Max [ClosedLevel _]) -> return Term.empty- Type t -> loop pats Term.unknown (Level t)+ Type t -> loop pats Term.unknown (Level t) -- no guarded levels Prop -> return Term.empty Inf -> return Term.empty DLub s1 (NoAbs x s2) -> Term.union <$> loopSort pats s1 <*> loopSort pats s2@@ -438,7 +622,6 @@ -> TCM Calls loop pats guarded t = do t <- instantiate t -- instantiate top-level MetaVar- suc <- sizeSuc -- Handles constructor applications. let constructor@@ -453,7 +636,7 @@ -- argument should be viewed as preserving -- guardedness. -> TCM Calls- constructor c ind args = collectCalls loopArg args+ constructor c ind args = mapM' loopArg args where loopArg (arg , preserves) = do loop pats g' (unArg arg)@@ -469,22 +652,22 @@ args2 <- mapM instantiateFull args1 -- We have to reduce constructors in case they're reexported.- let reduceCon (Con c vs) = (`apply` vs) <$> reduce (Con c []) -- make sure we don't reduce the arguments- reduceCon t = return t+ let reduceCon t = case ignoreSharing t of+ Con c vs -> (`apply` vs) <$> reduce (Con c []) -- make sure we don't reduce the arguments+ _ -> return t args2 <- mapM reduceCon args2 args <- mapM etaContract args2 -- If the function is a projection, then preserve guardedness -- for its principal argument.- isProj <- isProjection g+ isProj <- isProjectionButNotFlat g let unguards = repeat Term.unknown- let guards = maybe unguards -- not a proj. ==> unguarded- (\ _ -> guarded : unguards)- -- proj. => preserve g. of princ. arg. (counting starts with 1)- isProj+ let guards = if isProj then guarded : unguards+ -- proj => preserve guardedness of principal argument+ else unguards -- not a proj ==> unguarded -- collect calls in the arguments of this call- calls <- collectCalls (uncurry (loop pats)) (zip guards args)- -- calls <- collectCalls (loop pats Term.unknown) args+ calls <- mapM' (uncurry (loop pats)) (zip guards args)+ -- calls <- mapM' (loop pats Term.unknown) args reportSDoc "term.found.call" 20@@ -501,8 +684,9 @@ -- call is to one of the mutally recursive functions Just gInd' -> do - matrix <- compareArgs suc pats args- let (nrows, ncols, matrix') = addGuardedness guarded+ matrix <- compareArgs (withSizeSuc conf) pats args+ let (nrows, ncols, matrix') = addGuardedness+ (ifDelayed guarded) -- only delayed defs can be guarded (genericLength args) -- number of rows (genericLength pats) -- number of cols matrix@@ -530,58 +714,76 @@ calls) - case t of+ case ignoreSharing t of -- Constructed value. Con c args | Just c == sharp conf -> constructor c CoInductive $ zip args (repeat True)- | otherwise ->- constructor c Inductive $ zip args (repeat True)+ | otherwise -> do+ -- If we encounter a coinductive record constructor+ -- in a type mutual with the current target+ -- then we count it as guarding.+ ind <- do+ r <- isRecordConstructor c+ case r of+ Nothing -> return Inductive+ Just (q, def) -> return . (\ b -> if b then CoInductive else Inductive) $+ and [ recRecursive def+ , recInduction def == CoInductive+ , targetElem conf (q : recMutual def)+ ]+ constructor c ind $ zip args (repeat True) Def g args0 | guardingTypeConstructors conf -> do- gDef <- theDef <$> getConstInfo g- case gDef of+ def <- getConstInfo g+ let occs = defArgOccurrences def+ case theDef def of+{- Datatype {dataArgOccurrences = occs} -> con occs Record {recArgOccurrences = occs} -> con occs- _ -> fun+-}+ Datatype{} -> con occs+ Record{} -> con occs+ _ -> fun | otherwise -> fun where -- Data or record type constructor. con occs = constructor g Inductive $ -- guardedness preserving- -- constructor g CoInductive $ -- guarding! (Andreas, 2011-04-10) -- does not work, might lead to infinite unfolding in eq. checking (Ripley!) zip args0 (map preserves occs ++ repeat False) where- preserves Positive = True- preserves Negative = False+ preserves = (StrictPos <=) -- everything which is at least strictly positive+{- SPELLED OUT, this means: preserves Unused = True+ preserves GuardPos = True+ preserves StrictPos = True+ preserves Mixed = False+-} -- Call to defined function. fun = function g args0 -- Abstraction. Preserves guardedness.- Lam h (Abs x t) -> addCtxString x (Arg { argHiding = h- , argRelevance = __IMPOSSIBLE__- , unArg = __IMPOSSIBLE__- }) $+ Lam h (Abs x t) -> addCtxString_ x $ loop (map liftDBP pats) guarded t Lam h (NoAbs _ t) -> loop pats guarded t -- Neutral term. Destroys guardedness.- Var i args -> collectCalls (loop pats Term.unknown) (map unArg args)+ Var i args -> mapM' (loop pats Term.unknown) (map unArg args) -- Dependent function space. Pi a (Abs x b) ->- do g1 <- loopType pats Term.unknown (unArg a)+ do g1 <- loopType pats Term.unknown (unDom a)+ a <- maskSizeLt a g2 <- addCtxString x a $ loopType (map liftDBP pats) piArgumentGuarded b return $ g1 `Term.union` g2 -- Non-dependent function space. Pi a (NoAbs _ b) ->- do g1 <- loopType pats Term.unknown (unArg a)+ do g1 <- loopType pats Term.unknown (unDom a) g2 <- loopType pats piArgumentGuarded b return $ g1 `Term.union` g2 @@ -599,18 +801,37 @@ DontCare t -> loop pats guarded t -- Level.- Level l -> loop pats guarded =<< reallyUnLevelView l+ Level l -> do+ l <- catchError (reallyUnLevelView l) $ const $ internalError $+ "Termination checker: cannot view level expression, " +++ "probably due to missing level built-ins."+ loop pats guarded l + Shared{} -> __IMPOSSIBLE__+ where -- Should function and Π type constructors be treated as -- preserving guardedness in their right arguments? piArgumentGuarded = if guardingTypeConstructors conf then guarded -- preserving guardedness- -- Term.lt -- guarding! (Andreas, 2011-04-10) -- SEE ABOVE else Term.unknown +-- | Rewrite type @tel -> Size< u@ to @tel -> Size@.+maskSizeLt :: Dom Type -> TCM (Dom Type)+maskSizeLt dom@(Dom h r a) = do+ (msize, msizelt) <- getBuiltinSize+ case (msize, msizelt) of+ (_ , Nothing) -> return dom+ (Nothing, _) -> __IMPOSSIBLE__+ (Just size, Just sizelt) -> do+ TelV tel c <- telView a+ case ignoreSharingType a of+ El s (Def d [v]) | d == sizelt -> return $ Dom h r $+ abstract tel $ El s $ Def size []+ _ -> return dom+ {- | compareArgs suc pats ts compare a list of de Bruijn patterns (=parameters) @pats@@@ -644,21 +865,9 @@ -- | Stripping off a record constructor is not counted as decrease, in -- contrast to a data constructor.-decreaseFromConstructor :: QName -> TCM Order-decreaseFromConstructor c = do- isRC <- isRecordConstructor c- return $ if isRC then Term.le else Term.lt--increaseFromConstructor :: (?cutoff :: Int) => QName -> TCM Order-increaseFromConstructor c = do- isRC <- isRecordConstructor c- return $ if isRC then Term.le else Term.decr (-1)--{--increaseFromConstructor c = negateOrder <$> decreaseFromConstructor c- where negateOrder (Decr k) = Decr (- k)- negateOrder _ = __IMPOSSIBLE__--}+-- A record constructor increases/decreases by 0, a data constructor by 1.+offsetFromConstructor :: QName -> TCM Int+offsetFromConstructor c = maybe 1 (const 0) <$> isRecordConstructor c -- | Compute the sub patterns of a 'DeBruijnPat'. subPatterns :: DeBruijnPat -> [DeBruijnPat]@@ -678,16 +887,33 @@ cmp p' = (Term..*.) Term.lt (compareTerm' t p') -} +-- | For termination checking purposes flat should not be considered a+-- projection. That is, it flat doesn't preserve either structural order+-- or guardedness like other projections do.+-- Andreas, 2012-06-09: the same applies to projections of recursive records.+isProjectionButNotFlat :: QName -> TCM Bool+isProjectionButNotFlat qn = do+ flat <- fmap nameOfFlat <$> coinductionKit+ if Just qn == flat+ then return False+ else do+ mp <- isProjection qn+ case mp of+ Nothing -> return False+ Just (r, _) -> isInductiveRecord r++ -- | Remove projections until a term is no longer a projection. -- Also, remove 'DontCare's. stripProjections :: Term -> TCM Term-stripProjections (DontCare t) = stripProjections t-stripProjections t@(Def qn ts@(~(r : _))) = do- isProj <- isProjection qn- case isProj of- Just{} | not (null ts) -> stripProjections $ unArg r- _ -> return t-stripProjections t = return t+stripProjections t = case ignoreSharing t of+ DontCare t -> stripProjections t+ Def qn ts@(~(r : _)) -> do+ isProj <- isProjectionButNotFlat qn+ case isProj of+ True | not (null ts) -> stripProjections $ unArg r+ _ -> return t+ _ -> return t -- | Remove all projections from an algebraic term (not going under binders). class StripAllProjections a where@@ -702,62 +928,41 @@ instance StripAllProjections Term where stripAllProjections t = do t <- stripProjections t- case t of+ case ignoreSharing t of Con c ts -> Con c <$> stripAllProjections ts Def d ts -> Def d <$> stripAllProjections ts _ -> return t -{---- | Remove all projections from an algebraic term (not going under binders).-stripAllProjections :: Term -> TCM Term-stripAllProjections t = do- t <- stripProjections t- case t of- Con c ts -> Con c <$> mapM stripAllProjections ts- Def d ts -> Def d <$> mapM stripAllProjections ts- _ -> return t--}- -- | compareTerm t dbpat -- Precondition: top meta variable resolved compareTerm' :: (?cutoff :: Int) => Maybe QName -> Term -> DeBruijnPat -> TCM Term.Order-compareTerm' _ (Var i _) p = compareVar i p+compareTerm' suc (Shared x) p = compareTerm' suc (derefPtr x) p+compareTerm' suc (Var i _) p = compareVar suc i p compareTerm' suc (DontCare t) p = compareTerm' suc t p compareTerm' _ (Lit l) (LitDBP l') | l == l' = return Term.le | otherwise = return Term.unknown compareTerm' suc (Lit l) p = do t <- constructorForm (Lit l)- case t of+ case ignoreSharing t of Lit _ -> return Term.unknown _ -> compareTerm' suc t p -- Andreas, 2011-04-19 give subterm priority over matrix order compareTerm' _ t@Con{} (ConDBP c ps)- | any (isSubTerm t) ps = decreaseFromConstructor c+ | any (isSubTerm t) ps = decrease <$> offsetFromConstructor c <*> return Term.le compareTerm' suc (Con c ts) (ConDBP c' ps) | c == c' = compareConArgs suc ts ps compareTerm' suc (Def s ts) (ConDBP s' ps) | s == s' && Just s == suc = compareConArgs suc ts ps -- new cases for counting constructors / projections -- register also increase-compareTerm' suc (Def s ts) p | Just s == suc = do- os <- mapM (\ t -> compareTerm' suc (unArg t) p) ts- return $ decr (-1) .*. infimum os-{- Andreas 2011-07-07 Projections are now being removed in a preprocess--- projections are size preserving-compareTerm' suc (Def qn ts) p = do- isProj <- isProjection qn- case isProj of- -- strip off projection (n is the number of the record argument, counting starts with 1)- Just n | length ts >= n && n >= 1 ->- compareTerm' suc (unArg (ts !! (n - 1))) p- -- not a projection or underapplied:- _ -> return Term.unknown--}+compareTerm' suc (Def s [t]) p | Just s == suc = do+ -- Andreas, 2012-10-19 do not cut off here+ increase 1 <$> compareTerm' suc (unArg t) p+compareTerm' suc (Con c []) p = return Term.le compareTerm' suc (Con c ts) p = do- os <- mapM (\ t -> compareTerm' suc (unArg t) p) ts- oc <- increaseFromConstructor c- return $ if (null os) then Term.unknown else oc .*. infimum os+ increase <$> offsetFromConstructor c+ <*> (infimum <$> mapM (\ t -> compareTerm' suc (unArg t) p) ts) compareTerm' suc t p | isSubTerm t p = return Term.le compareTerm' _ _ _ = return Term.unknown @@ -765,6 +970,7 @@ isSubTerm :: Term -> DeBruijnPat -> Bool isSubTerm t p = equal t p || properSubTerm t p where+ equal (Shared p) dbp = equal (derefPtr p) dbp equal (Con c ts) (ConDBP c' ps) = and $ (c == c') : (length ts == length ps)@@ -797,11 +1003,19 @@ -- allows examples like (x, y) < (Succ x, y) -} -compareVar :: (?cutoff :: Int) => Nat -> DeBruijnPat -> TCM Term.Order-compareVar i (VarDBP j) = return $ if i == j then Term.le else Term.unknown-compareVar i (LitDBP _) = return $ Term.unknown-compareVar i (ConDBP c ps) = do- os <- mapM (compareVar i) ps- let o = Term.supremum os- oc <- decreaseFromConstructor c- return $ (Term..*.) oc o+compareVar :: (?cutoff :: Int) => Maybe QName -> Nat -> DeBruijnPat -> TCM Term.Order+compareVar suc i (VarDBP j) = compareVarVar suc i j+compareVar suc i (LitDBP _) = return $ Term.unknown+compareVar suc i (ConDBP c ps) = do+ decrease <$> offsetFromConstructor c+ <*> (Term.supremum <$> mapM (compareVar suc i) ps)++-- | Compare two variables+compareVarVar :: (?cutoff :: Int) => Maybe QName -> Nat -> Nat -> TCM Term.Order+compareVarVar suc i j+ | i == j = return Term.le+ | otherwise = do+ res <- isBounded i+ case res of+ BoundedNo -> return Term.unknown+ BoundedLt v -> decrease 1 <$> compareTerm' suc v (VarDBP j)
src/full/Agda/Termination/Termination.hs view
@@ -9,24 +9,27 @@ module Agda.Termination.Termination ( terminates+ , terminatesFilter , Agda.Termination.Termination.tests ) where import Agda.Termination.Lexicographic import Agda.Termination.CallGraph import Agda.Termination.SparseMatrix+ import Agda.Utils.Either import Agda.Utils.TestHelpers-import Control.Arrow import Agda.Utils.QuickCheck-import qualified Data.Set as Set++import Control.Arrow++import Data.Array (Array) import qualified Data.Array as Array import Data.Set (Set) import qualified Data.Set as Set import Data.Map (Map) import qualified Data.Map as Map import Data.Monoid-import Data.Array (Array) -- | TODO: This comment seems to be partly out of date. --@@ -56,6 +59,11 @@ terminates cs = let ccs = complete cs in checkIdems $ toList ccs++terminatesFilter :: (Ord meta, Monoid meta, ?cutoff :: Int) =>+ (Index -> Bool) -> CallGraph meta -> Either meta ()+terminatesFilter f cs = checkIdems $ filter f' $ toList $ complete cs+ where f' (c,m) = f (source c) && f (target c) checkIdems :: (Ord meta, Monoid meta, ?cutoff :: Int) => [(Call,meta)] -> Either meta () checkIdems [] = Right ()
src/full/Agda/Tests.hs view
@@ -18,15 +18,18 @@ import Agda.Termination.Matrix as TermMatrix (tests) import Agda.Termination.Semiring as TermRing (tests) import Agda.Termination.SparseMatrix as TermSparse (tests)+import Agda.TypeChecking.Irrelevance as Irrel (tests) import Agda.TypeChecking.Tests as TypeChck (tests) import Agda.Utils.Either as UtilEith (tests) import Agda.Utils.FileName as UtilFile (tests)+import Agda.Utils.Graph as UtilGrap (tests) import Agda.Utils.List as UtilList (tests) import Agda.Utils.Warshall as UtilWarsh (tests) testSuite :: IO Bool testSuite = runTests "QuickCheck test suite:"- [ CompEnco.tests+ [ Irrel.tests+ , CompEnco.tests , InteEmac.tests , InteGene.tests , IntePrec.tests@@ -43,6 +46,7 @@ , TypeChck.tests , UtilEith.tests , UtilFile.tests+ , UtilGrap.tests , UtilList.tests , UtilWarsh.tests ]
src/full/Agda/TypeChecking/Abstract.hs view
@@ -14,7 +14,7 @@ piAbstractTerm :: Term -> Type -> Type -> Type piAbstractTerm v a b = fun a (abstractTerm v b) where- fun a b = El s $ Pi (Arg NotHidden Relevant a) $ mkAbs "w" b+ fun a b = El s $ Pi (Dom NotHidden Relevant a) $ mkAbs "w" b where s = (sLub `on` getSort) a b class AbstractTerm a where@@ -34,9 +34,13 @@ Sort s -> Sort $ absT s MetaV m vs -> MetaV m $ absT vs DontCare mv -> DontCare $ absT mv+ Shared p -> Shared $ absT p where absT x = abstractTerm u x +instance AbstractTerm a => AbstractTerm (Ptr a) where+ abstractTerm u = fmap (abstractTerm u)+ instance AbstractTerm Type where abstractTerm u (El s v) = El (abstractTerm u s) (abstractTerm u v) @@ -65,19 +69,21 @@ instance AbstractTerm a => AbstractTerm (Arg a) where abstractTerm = fmap . abstractTerm +instance AbstractTerm a => AbstractTerm (Dom a) where+ abstractTerm = fmap . abstractTerm+ instance AbstractTerm a => AbstractTerm [a] where abstractTerm = fmap . abstractTerm instance AbstractTerm a => AbstractTerm (Maybe a) where abstractTerm = fmap . abstractTerm -instance (Raise a, AbstractTerm a) => AbstractTerm (Abs a) where+instance (Subst a, AbstractTerm a) => AbstractTerm (Abs a) where abstractTerm u (NoAbs x v) = NoAbs x $ abstractTerm u v- abstractTerm u (Abs x v) = Abs x $ rename swap $ abstractTerm (raise 1 u) v+ abstractTerm u (Abs x v) = Abs x $ applySubst swap $ abstractTerm (raise 1 u) v where- swap 0 = 1- swap 1 = 0- swap i = i+ -- This swaps var 0 and var 1 (we hope)+ swap = var 1 :# liftS 1 (raiseS 1) instance (AbstractTerm a, AbstractTerm b) => AbstractTerm (a, b) where abstractTerm u (x, y) = (abstractTerm u x, abstractTerm u y)
src/full/Agda/TypeChecking/CompiledClause.hs view
@@ -1,24 +1,33 @@-{-# LANGUAGE TypeOperators, CPP, DeriveDataTypeable, DeriveFunctor #-}+{-# LANGUAGE TypeOperators, CPP, DeriveDataTypeable, DeriveFunctor, DeriveFoldable, DeriveTraversable #-} module Agda.TypeChecking.CompiledClause where import qualified Data.Map as Map import Data.Map (Map) import Data.Monoid-import Data.Generics+import Data.Typeable (Typeable)+import Data.Foldable (Foldable)+import Data.Traversable (Traversable) import Agda.Syntax.Common import Agda.Syntax.Internal import Agda.Syntax.Literal+ import Agda.Utils.Pretty+import Agda.Utils.Impossible+#include "../undefined.h" type key :-> value = Map key value -data Case c = Branches { conBranches :: QName :-> c- , litBranches :: Literal :-> c- , catchAllBranch :: Maybe c- }- deriving (Typeable, Data, Functor)+data WithArity c = WithArity { arity :: Int, content :: c }+ deriving (Typeable, Functor, Foldable, Traversable) +data Case c = Branches+ { conBranches :: QName :-> WithArity c -- ^ Map from constructor names to their arity and the case subtree+ , litBranches :: Literal :-> c -- ^ Map from literal to case subtree+ , catchAllBranch :: Maybe c -- ^ (Possibly additional) catch-all clause+ }+ deriving (Typeable, Functor, Foldable, Traversable)+ data CompiledClauses = Case Int (Case CompiledClauses) -- ^ @Case n bs@ stands for a match on the @n@-th argument@@ -30,12 +39,19 @@ -- still reduce. | Fail -- ^ Absurd case.- deriving (Typeable, Data)+ deriving (Typeable) +emptyBranches = Branches Map.empty Map.empty Nothing litCase l x = Branches Map.empty (Map.singleton l x) Nothing conCase c x = Branches (Map.singleton c x) Map.empty Nothing catchAll x = Branches Map.empty Map.empty (Just x) +instance Monoid c => Monoid (WithArity c) where+ mempty = WithArity __IMPOSSIBLE__ mempty+ mappend (WithArity n1 c1) (WithArity n2 c2)+ | n1 == n2 = WithArity n1 $ mappend c1 c2+ | otherwise = __IMPOSSIBLE__ -- arity must match!+ instance Monoid m => Monoid (Case m) where mempty = Branches Map.empty Map.empty Nothing mappend (Branches cs ls m)@@ -49,6 +65,9 @@ instance Show CompiledClauses where show = show . pretty +instance Pretty a => Pretty (WithArity a) where+ pretty = pretty . content+ instance Pretty a => Pretty (Case a) where prettyPrec p (Branches cs ls m) = mparens (p > 0) $ vcat $@@ -61,7 +80,7 @@ | (x, v) <- Map.toList m ] instance Pretty CompiledClauses where- pretty (Done hs t) = text ("done" ++ show hs) <+> text (show t)+ pretty (Done hs t) = text ("done" ++ show hs) <+> text (show t) pretty Fail = text "fail" pretty (Case n bs) = sep [ text ("case " ++ show n ++ " of")
src/full/Agda/TypeChecking/CompiledClause/Compile.hs view
@@ -3,41 +3,102 @@ import Data.Monoid import qualified Data.Map as Map-import Data.List (genericReplicate, nubBy)+import Data.List (genericReplicate, nubBy, findIndex) import Data.Function import Agda.Syntax.Common import Agda.Syntax.Internal import Agda.TypeChecking.CompiledClause+import Agda.TypeChecking.Coverage+import Agda.TypeChecking.Coverage.SplitTree import Agda.TypeChecking.Monad import Agda.TypeChecking.RecordPatterns import Agda.TypeChecking.Substitute import Agda.TypeChecking.Pretty-import Agda.Utils.List +import Agda.Utils.List import Agda.Utils.Impossible #include "../../undefined.h" +-- | Process function clauses into case tree.+-- This involves:+-- 1. Coverage checking, generating a split tree.+-- 2. Translation of lhs record patterns into rhs uses of projection.+-- Update the split tree.+-- 3. Generating a case tree from the split tree.+-- Phases 1. and 2. are skipped if @Nothing@. compileClauses ::- Bool -- ^ Translate record patterns?+ Maybe (QName, Type) -- ^ Translate record patterns and coverage check with given type? -> [Clause] -> TCM CompiledClauses-compileClauses translate cs = do- cs <- if translate then- mapM translateRecordPatterns cs- else- return cs- return $ compile [(clausePats c, clauseBody c) | c <- cs]+compileClauses mt cs = do+ let cls = [(clausePats c, clauseBody c) | c <- cs]+ case mt of+ Nothing -> return $ compile cls+ Just (q, t) -> do+ splitTree <- coverageCheck q t cs+ {-+ splitTree <- translateSplitTree splitTree+ reportSDoc "tc.cc.splittree" 10 $ vcat+ [ text "translated split tree for" <+> prettyTCM q+ , text $ show splitTree+ ]+ -}+ -- cs <- mapM translateRecordPatterns cs+ reportSDoc "tc.cc" 50 $ do+ sep [ text "clauses before compilation"+ , (nest 2 . text . show) cs+ ] -- ++ map (nest 2 . text . show) cs+ let cc = compileWithSplitTree splitTree cls+ reportSDoc "tc.cc" 12 $ sep+ [ text "compiled clauses (still containing record splits)"+ , nest 2 $ text (show cc)+ ]+ cc <- translateCompiledClauses cc+ return cc type Cl = ([Arg Pattern], ClauseBody) type Cls = [Cl] +compileWithSplitTree :: SplitTree -> Cls -> CompiledClauses+compileWithSplitTree t cs = case t of+ SplitAt i ts ->+ -- the coverage checker does not count dot patterns as variables+ -- in case trees however, they count as variable patterns+ let n = i -- countInDotPatterns i cs+ in Case n $ compiles ts $ splitOn n cs+ SplittingDone n -> compile cs+ -- after end of split tree, continue with left-to-right strategy++ where++ compiles :: SplitTrees -> Case Cls -> Case CompiledClauses+ compiles ts br@Branches{ conBranches = cons+ , litBranches = lits+ , catchAllBranch = Nothing }+ | Map.null lits = emptyBranches { conBranches = updCons cons }+ where+ updCons = Map.mapWithKey $ \ c cl -> case lookup c ts of+ Nothing -> __IMPOSSIBLE__+ Just t -> fmap (compileWithSplitTree t) cl+ compiles ts br = fmap compile br++ -- increase split index by number of dot patterns we have skipped+ countInDotPatterns :: Int -> [Cl] -> Int+ countInDotPatterns i [] = __IMPOSSIBLE__+ countInDotPatterns i ((ps, _) : _) = i + loop i (map unArg ps) where+ loop 0 ps = 0+ loop i [] = __IMPOSSIBLE__+ loop i (DotP{} : ps) = 1 + loop i ps+ loop i (_ : ps) = loop (i - 1) ps++ compile :: Cls -> CompiledClauses compile cs = case nextSplit cs of Just n -> Case n $ fmap compile $ splitOn n cs Nothing -> case map getBody cs of -- It's possible to get more than one clause here due to -- catch-all expansion.- Just t : _ -> Done (map (fmap name) $ fst $ head cs) t+ Just t : _ -> Done (map (fmap name) $ fst $ head cs) (shared t) Nothing : _ -> Fail [] -> __IMPOSSIBLE__ where@@ -50,9 +111,12 @@ body (Body t) = Just t body NoBody = Nothing +-- | Get the index of the next argument we need to split on.+-- This the number of the first pattern that does a match in the first clause. nextSplit :: Cls -> Maybe Int-nextSplit [] = __IMPOSSIBLE__-nextSplit ((ps, _):_) = mhead [ n | (a, n) <- zip ps [0..], isPat (unArg a) ]+nextSplit [] = __IMPOSSIBLE__+nextSplit ((ps, _):_) = findIndex isPat $ map unArg ps+ -- OLD, IDENTICAL: mhead [ n | (a, n) <- zip ps [0..], isPat (unArg a) ] where isPat VarP{} = False isPat DotP{} = False@@ -64,7 +128,7 @@ splitC :: Int -> Cl -> Case Cl splitC n (ps, b) = case unArg p of- ConP c _ qs -> conCase c (ps0 ++ qs ++ ps1, b)+ ConP c _ qs -> conCase c $ WithArity (length qs) (ps0 ++ qs ++ ps1, b) LitP l -> litCase l (ps0 ++ ps1, b) _ -> catchAll (ps, b) where@@ -99,7 +163,7 @@ case q of ConP c _ qs' -> (ps0 ++ [defaultArg $ ConP c Nothing (genericReplicate m $ defaultArg $ VarP "_")] ++ ps1, substBody n' m (Con c (map var [m - 1, m - 2..0])) b)- where m = fromIntegral $ length qs'+ where m = length qs' LitP l -> (ps0 ++ [defaultArg $ LitP l] ++ ps1, substBody n' 0 (Lit l) b) _ -> __IMPOSSIBLE__ where@@ -114,10 +178,10 @@ var x = defaultArg $ Var x [] -substBody :: Int -> Integer -> Term -> ClauseBody -> ClauseBody+substBody :: Int -> Int -> Term -> ClauseBody -> ClauseBody substBody _ _ _ NoBody = NoBody substBody 0 m v b = case b of- Bind b -> foldr (.) id (genericReplicate m (Bind . Abs "_")) $ subst v (absBody $ raise m b)+ Bind b -> foldr (.) id (replicate m (Bind . Abs "_")) $ subst v (absBody $ raise m b) _ -> __IMPOSSIBLE__ substBody n m v b = case b of Bind b -> Bind $ fmap (substBody (n - 1) m v) b
src/full/Agda/TypeChecking/CompiledClause/Compile.hs-boot view
@@ -4,4 +4,4 @@ import Agda.TypeChecking.CompiledClause import Agda.TypeChecking.Monad.Base -compileClauses :: Bool -> [Clause] -> TCM CompiledClauses+compileClauses :: Maybe (QName, Type) -> [Clause] -> TCM CompiledClauses
src/full/Agda/TypeChecking/CompiledClause/Match.hs view
@@ -29,14 +29,15 @@ match :: CompiledClauses -> MaybeReducedArgs -> (Args -> Args) -> Stack -> TCM (Reduced (Blocked Args) Term) match Fail args patch stack = return $ NoReduction $ NotBlocked (patch $ map ignoreReduced args) match (Done xs t) args _ _- | m < n = return $ YesReduction $ substs (reverse $ toTm args)+ | m < n = return $ YesReduction $ applySubst (parallelS $ reverse $ toTm args) $ foldr lam t (drop m xs)- | otherwise = return $ YesReduction $ substs (reverse $ toTm args0) t `apply` map ignoreReduced args1+ | otherwise = return $ YesReduction $+ applySubst (parallelS $ reverse $ toTm args0) t `apply` map ignoreReduced args1 where n = length xs m = length args toTm = map (unArg . ignoreReduced)- (args0, args1) = splitAt n args+ (args0, args1) = splitAt n $ map (fmap $ fmap shared) args lam x t = Lam (argHiding x) (Abs (unArg x) t) match (Case n bs) args patch stack = case genericSplitAt n args of@@ -56,22 +57,24 @@ patchCon c m args = patch (args0 ++ [Arg h r $ Con c vs] ++ args1) where (args0, args1') = splitAt n args (vs, args1) = splitAt m args1'- case w of+ case ignoreSharing <$> w of Blocked x _ -> return $ NoReduction $ Blocked x (patch $ map ignoreReduced args') NotBlocked (MetaV x _) -> return $ NoReduction $ Blocked x (patch $ map ignoreReduced args') NotBlocked (Lit l) -> case Map.lookup l (litBranches bs) of Nothing -> match' stack'' Just cc -> match cc (args0 ++ args1) patchLit stack'' where- stack'' = (++ stack') $ case cv of+ stack'' = (++ stack') $ case ignoreSharing cv of Con c vs -> case Map.lookup c (conBranches bs) of Nothing -> []- Just cc -> [(cc, args0 ++ map (MaybeRed red) vs ++ args1, patchCon c (length vs))]+ Just cc -> [(content cc, args0 ++ map (MaybeRed red) vs ++ args1, patchCon c (length vs))] _ -> [] NotBlocked (Con c vs) -> case Map.lookup c (conBranches bs) of Nothing -> match' stack'- Just cc -> match cc (args0 ++ map (MaybeRed red) vs ++ args1)- (patchCon c (length vs)) stack'+ Just cc -> match (content cc)+ (args0 ++ map (MaybeRed red) vs ++ args1)+ (patchCon c (length vs))+ stack' NotBlocked _ -> return $ NoReduction $ NotBlocked (patch $ map ignoreReduced args') match' :: Stack -> TCM (Reduced (Blocked Args) Term)@@ -79,7 +82,6 @@ match' [] = typeError $ GenericError "Incomplete pattern matching" unfoldCorecursion v = case v of- -- Andreas, 2011-10-03 removing DontCare here allow matching on irrelevant things- DontCare v -> unfoldCorecursion v Def f args -> unfoldDefinition True unfoldCorecursion (Def f []) f args+ Shared{} -> fmap shared <$> unfoldCorecursion (ignoreSharing v) -- don't update when unfolding corecursion! _ -> reduceB v
src/full/Agda/TypeChecking/Constraints.hs view
@@ -12,17 +12,22 @@ import Data.Set as Set import Agda.Syntax.Common+import Agda.Syntax.Position import Agda.Syntax.Internal+import qualified Agda.Syntax.Abstract as A import Agda.Syntax.Scope.Base import Agda.TypeChecking.Monad import Agda.TypeChecking.Errors+import Agda.TypeChecking.InstanceArguments+import Agda.TypeChecking.Irrelevance (unusableRelevance) import Agda.TypeChecking.Pretty import Agda.TypeChecking.Reduce import Agda.TypeChecking.Substitute import Agda.TypeChecking.LevelConstraints+-- import Agda.TypeChecking.SizedTypes (solveSizeConstraints) import Agda.TypeChecking.MetaVars.Mention -import {-# SOURCE #-} Agda.TypeChecking.Rules.Term (checkExpr)+import {-# SOURCE #-} Agda.TypeChecking.Rules.Term (checkExpr, checkArguments) import {-# SOURCE #-} Agda.TypeChecking.Conversion import {-# SOURCE #-} Agda.TypeChecking.MetaVars import {-# SOURCE #-} Agda.TypeChecking.Empty@@ -40,7 +45,7 @@ catchConstraint :: Constraint -> TCM () -> TCM () catchConstraint c v = liftTCM $ catchError_ v $ \err ->- case errError err of+ case err of -- Not putting s (which should really be the what's already there) makes things go -- a lot slower (+20% total time on standard library). How is that possible?? -- The problem is most likely that there are internal catchErrors which forgets the@@ -63,7 +68,13 @@ reportSDoc "tc.constr.add" 20 $ text " simplified:" <+> prettyTCM c' solveConstraint_ c' else addConstraint' c'+ -- the added constraint can cause IFS constraints to be solved+ unless (isIFSConstraint c) $+ wakeConstraints (isIFSConstraint . clValue . theConstraint) where+ isIFSConstraint :: Constraint -> Bool+ isIFSConstraint FindInScope{} = True+ isIFSConstraint _ = False simpl :: Constraint -> TCM Constraint simpl c = do n <- genericLength <$> getContext@@ -103,9 +114,10 @@ ifNoConstraints_ :: TCM () -> TCM a -> (ProblemId -> TCM a) -> TCM a ifNoConstraints_ check ifNo ifCs = ifNoConstraints check (const ifNo) (\pid _ -> ifCs pid) --- | @guardConstraint cs c@ tries to solve constraints @cs@ first.--- If successful, it moves on to solve @c@, otherwise it returns--- a @Guarded c cs@.+-- | @guardConstraint c blocker@ tries to solve @blocker@ first.+-- If successful without constraints, it moves on to solve @c@, otherwise it+-- adds a @Guarded c cs@ constraint+-- to the @blocker@-generated constraints @cs@. guardConstraint :: Constraint -> TCM () -> TCM () guardConstraint c blocker = ifNoConstraints_ blocker (solveConstraint_ c) (addConstraint . Guarded c)@@ -119,7 +131,7 @@ -- | Wake up the constraints depending on the given meta. wakeupConstraints :: MetaId -> TCM () wakeupConstraints x = do- wakeConstraints (mentionsMeta x)+ wakeConstraints (const True) -- (mentionsMeta x) -- TODO: needs fixing to cope with shared updates solveAwakeConstraints -- | Wake up all constraints.@@ -129,9 +141,14 @@ solveAwakeConstraints solveAwakeConstraints :: TCM ()-solveAwakeConstraints = do+solveAwakeConstraints = solveAwakeConstraints' False++solveAwakeConstraints' :: Bool -> TCM ()+solveAwakeConstraints' force = do verboseS "profile.constraints" 10 $ liftTCM $ tickMax "max-open-constraints" . genericLength =<< getAllConstraints- unlessM isSolvingConstraints $ nowSolvingConstraints solve+ whenM ((force ||) . not <$> isSolvingConstraints) $ nowSolvingConstraints $ do+ -- solveSizeConstraints -- Andreas, 2012-09-27 attacks size constrs too early+ solve where solve = do reportSDoc "tc.constr.solve" 10 $ hsep [ text "Solving awake constraints."@@ -150,6 +167,7 @@ reportSDoc "tc.constr.solve" 20 $ text (show pids) <+> prettyTCM c solveConstraint_ c +solveConstraint_ :: Constraint -> TCM () solveConstraint_ (ValueCmp cmp a u v) = compareTerm cmp a u v solveConstraint_ (ElimCmp cmp a e u v) = compareElims cmp a e u v solveConstraint_ (TypeCmp cmp a b) = compareType cmp a b@@ -159,7 +177,7 @@ solveConstraint_ c0@(Guarded c pid) = do ifM (isProblemSolved pid) (solveConstraint_ c) (addConstraint c0)-solveConstraint_ (IsEmpty t) = isEmptyType t+solveConstraint_ (IsEmpty r t) = isEmptyType r t solveConstraint_ (UnBlock m) = ifM (isFrozen m) (addConstraint $ UnBlock m) $ do inst <- mvInstantiation <$> lookupMeta m@@ -187,82 +205,4 @@ -- Open (whatever that means) Open -> __IMPOSSIBLE__ OpenIFS -> __IMPOSSIBLE__-solveConstraint_ (FindInScope m) =- ifM (isFrozen m) (addConstraint $ FindInScope m) $ do- reportSDoc "tc.constr.findInScope" 15 $ text ("findInScope constraint: " ++ show m)- mv <- lookupMeta m- let j = mvJudgement mv- case j of- IsSort{} -> __IMPOSSIBLE__- HasType _ tj -> do- ctx <- getContextVars- ctxArgs <- getContextArgs- t <- normalise $ tj `piApply` ctxArgs- reportSLn "tc.constr.findInScope" 15 $ "findInScope t: " ++ show t- let candsP1 = [(term, t) | (term, t, Instance) <- ctx]- let candsP2 = [(term, t) | (term, t, h) <- ctx, h /= Instance]- let scopeInfo = getMetaScope mv- let ns = everythingInScope scopeInfo- let nsList = Map.toList $ nsNames ns- -- try all abstract names in scope (even ones that you can't refer to- -- unambiguously)- let candsP3Names = nsList >>= snd- candsP3Types <- mapM (typeOfConst . anameName) candsP3Names- candsP3FV <- mapM (freeVarsToApply . anameName) candsP3Names- let candsP3 = [(Def (anameName an) vs, t) |- (an, t, vs) <- zip3 candsP3Names candsP3Types candsP3FV]- let cands = [candsP1, candsP2, candsP3]- cands <- mapM (filterM (uncurry $ checkCandidateForMeta m t )) cands- let iterCands :: [(Int, [(Term, Type)])] -> TCM ()- iterCands [] = do reportSDoc "tc.constr.findInScope" 15 $ text "not a single candidate found..."- typeError $ IFSNoCandidateInScope t- iterCands ((p, []) : cs) = do reportSDoc "tc.constr.findInScope" 15 $ text $- "no candidates found at p=" ++ show p ++ ", trying next p..."- iterCands cs- iterCands ((p, [(term, t')]):_) =- do reportSDoc "tc.constr.findInScope" 15 $ text (- "one candidate at p=" ++ show p ++ " found for type '") <+>- prettyTCM t <+> text "': '" <+> prettyTCM term <+>- text "', of type '" <+> prettyTCM t' <+> text "'."- leqType t t'- assignV m ctxArgs term- iterCands ((p, cs):_) = do reportSDoc "tc.constr.findInScope" 15 $- text ("still more than one candidate at p=" ++ show p ++ ": ") <+>- prettyTCM (List.map fst cs)- addConstraint $ FindInScope m- iterCands [(1,concat cands)]- where- getContextVars :: TCM [(Term, Type, Hiding)]- getContextVars = do- ctx <- getContext- let ids = [0.. fromIntegral (length ctx) - 1] :: [Nat]- types <- mapM typeOfBV ids- return $ [ (Var i [], t, h) | (Arg h _ _, i, t) <- zip3 ctx [0..] types ]- checkCandidateForMeta :: MetaId -> Type -> Term -> Type -> TCM Bool- checkCandidateForMeta m t term t' =- liftTCM $ flip catchError (\err -> return False) $ do- reportSLn "tc.constr.findInScope" 20 $ "checkCandidateForMeta\n t: " ++ show t ++ "\n t':" ++ show t' ++ "\n term: " ++ show term ++ "."- localState $ do- -- domi: we assume that nothing below performs direct IO (except- -- for logging and such, I guess)- leqType t t'- tel <- getContextTelescope- assignTerm m (teleLam tel term)- -- make a pass over constraints, to detect cases where some are made- -- unsolvable by the assignment, but don't do this for FindInScope's- -- to prevent loops. We currently also ignore UnBlock constraints- -- to be on the safe side.- wakeConstraints (isSimpleConstraint . clValue . theConstraint)- solveAwakeConstraints- return True- isSimpleConstraint :: Constraint -> Bool- isSimpleConstraint FindInScope{} = False- isSimpleConstraint UnBlock{} = False- isSimpleConstraint _ = True--localState :: MonadState s m => m a -> m a-localState m = do- s <- get- x <- m- put s- return x+solveConstraint_ (FindInScope m cands) = findInScope m cands
+ src/full/Agda/TypeChecking/Constraints.hs-boot view
@@ -0,0 +1,9 @@+module Agda.TypeChecking.Constraints where++import Agda.TypeChecking.Monad.Base++addConstraint :: Constraint -> TCM ()+solveConstraint :: Constraint -> TCM ()+solveAwakeConstraints' :: Bool -> TCM ()+noConstraints :: TCM a -> TCM a+ifNoConstraints_ :: TCM () -> TCM a -> (ProblemId -> TCM a) -> TCM a
src/full/Agda/TypeChecking/Conversion.hs view
@@ -4,20 +4,24 @@ import Control.Applicative import Control.Monad+import Control.Monad.Reader import Control.Monad.State import Control.Monad.Error import Data.Traversable hiding (mapM, sequence) import Data.List hiding (sort) import qualified Data.List as List +import Agda.Syntax.Abstract.Views (isSet) import Agda.Syntax.Literal import Agda.Syntax.Common import Agda.Syntax.Internal+import Agda.Syntax.Translation.InternalToAbstract (reify) import Agda.TypeChecking.Monad import Agda.TypeChecking.MetaVars import Agda.TypeChecking.MetaVars.Occurs (killArgs,PruneResult(..))-import Agda.TypeChecking.Substitute import Agda.TypeChecking.Reduce+import Agda.TypeChecking.Substitute+import Agda.TypeChecking.Telescope import Agda.TypeChecking.Constraints import Agda.TypeChecking.Errors import Agda.TypeChecking.Primitive (constructorForm)@@ -25,15 +29,19 @@ import Agda.TypeChecking.Records import Agda.TypeChecking.Pretty import Agda.TypeChecking.Injectivity+import Agda.TypeChecking.Polarity import Agda.TypeChecking.SizedTypes import Agda.TypeChecking.Monad.Builtin import Agda.TypeChecking.Level+import Agda.TypeChecking.Implicit (implicitArgs) import Agda.TypeChecking.Irrelevance import Agda.TypeChecking.EtaContract import Agda.TypeChecking.Eliminators -- import Agda.TypeChecking.UniversePolymorphism +import Agda.Utils.Size import Agda.Utils.Monad+import Agda.Utils.Maybe import Agda.TypeChecking.Monad.Debug @@ -43,9 +51,6 @@ mlevel :: TCM (Maybe Term) mlevel = liftTCM $ (Just <$> primLevel) `catchError` \_ -> return Nothing -nextPolarity [] = (Invariant, [])-nextPolarity (p : ps) = (p, ps)- -- | Check if to lists of arguments are the same (and all variables). -- Precondition: the lists have the same length. sameVars :: Args -> Args -> Bool@@ -73,37 +78,80 @@ equalType :: Type -> Type -> TCM () equalType = compareType CmpEq +{- Comparing in irrelevant context always succeeds.++ However, we might want to dig for solutions of irrelevant metas.++ To this end, we can just ignore errors during conversion checking.+ -}++-- convError :: MonadTCM tcm => TypeError -> tcm a+-- | Ignore errors in irrelevant context.+convError :: TypeError -> TCM ()+convError err = ifM ((==) Irrelevant <$> asks envRelevance) (return ()) $ typeError err+ -- | Type directed equality on values. -- compareTerm :: Comparison -> Type -> Term -> Term -> TCM () -- If one term is a meta, try to instantiate right away. This avoids unnecessary unfolding.-compareTerm cmp a u v = liftTCM $ do- (u, v) <- instantiate (u, v)+ -- Andreas, 2012-02-14: This is UNSOUND for subtyping!+compareTerm cmp a u v = do+ -- Check syntactic equality first. This actually saves us quite a bit of work.+ (u, v) <- instantiateFull (u, v)+ if u == v then unifyPointers cmp u v $ verboseS "profile.sharing" 20 $ tick "equal terms" else do+ verboseS "profile.sharing" 20 $ tick "unequal terms"+ let checkPointerEquality def | not $ null $ List.intersect (pointerChain u) (pointerChain v) = do+ verboseS "profile.sharing" 10 $ tick "pointer equality"+ return ()+ checkPointerEquality def = def+ checkPointerEquality $ do reportSDoc "tc.conv.term" 10 $ sep [ text "compareTerm" , nest 2 $ prettyTCM u <+> prettyTCM cmp <+> prettyTCM v , nest 2 $ text ":" <+> prettyTCM a ] let fallback = compareTerm' cmp a u v- case (u, v) of- (u@(MetaV x us), v@(MetaV y vs))- | x /= y -> solve1 `orelse` solve2 `orelse` compareTerm' cmp a u v+ unlessSubtyping cont =+ if cmp == CmpEq then cont else do+ -- do not short circuit size comparison!+ isSize <- isJust <$> do isSizeTypeTest <*> reduce a+ if isSize then fallback else cont+ case (ignoreSharing u, ignoreSharing v) of+ (MetaV x us, MetaV y vs)+ | x /= y -> unlessSubtyping $ solve1 `orelse` solve2 `orelse` compareTerm' cmp a u v | otherwise -> fallback where (solve1, solve2) | x > y = (assign x us v, assign y vs u) | otherwise = (assign y vs u, assign x us v)- (u@(MetaV x us), v) -> assign x us v `orelse` fallback- (u, v@(MetaV y vs)) -> assign y vs u `orelse` fallback- _ -> fallback+ (MetaV x us, _) -> unlessSubtyping $ assign x us v `orelse` fallback+ (_, MetaV y vs) -> unlessSubtyping $ assign y vs u `orelse` fallback+ _ -> fallback where assign x us v = do- reportSDoc "tc.conv.term" 20 $ sep [ text "attempting shortcut"- , nest 2 $ prettyTCM (MetaV x us) <+> text ":=" <+> prettyTCM v ]+ reportSDoc "tc.conv.term.shortcut" 20 $ sep+ [ text "attempting shortcut"+ , nest 2 $ prettyTCM (MetaV x us) <+> text ":=" <+> prettyTCM v+ ] ifM (isInstantiatedMeta x) patternViolation (assignV x us v)+ instantiate u+ -- () <- seq u' $ return ()+ reportSLn "tc.conv.term.shortcut" 50 $+ "shortcut successful\n result: " ++ show u -- Should be ok with catchError_ but catchError is much safer since we don't -- rethrow errors.- m `orelse` h = m `catchError` \err -> case errError err of+ m `orelse` h = m `catchError` \err -> case err of PatternErr s -> put s >> h _ -> h +unifyPointers _ _ _ action = action+-- unifyPointers cmp _ _ action | cmp /= CmpEq = action+-- unifyPointers _ u v action = do+-- old <- gets stDirty+-- modify $ \s -> s { stDirty = False }+-- action+-- (u, v) <- instantiate (u, v)+-- dirty <- gets stDirty+-- modify $ \s -> s { stDirty = old }+-- when (not dirty) $ forceEqualTerms u v+ compareTerm' :: Comparison -> Type -> Term -> Term -> TCM () compareTerm' cmp a m n = verboseBracket "tc.conv.term" 20 "compareTerm" $ do@@ -112,18 +160,19 @@ reportSDoc "tc.conv.term" 30 $ fsep [ text "compareTerm", prettyTCM m, prettyTCM cmp, prettyTCM n, text ":", prettyTCM a' ] proofIrr <- proofIrrelevance- isSize <- isSizeType a'+ isSize <- isJust <$> isSizeType a' s <- reduce $ getSort a' mlvl <- mlevel case s of Prop | proofIrr -> return () _ | isSize -> compareSizes cmp m n- _ -> case unEl a' of+ _ -> case ignoreSharing $ unEl a' of a | Just a == mlvl -> do a <- levelView m b <- levelView n equalLevel a b- Pi a _ -> equalFun (a,a') m n+-- OLD: Pi dom _ -> equalFun (dom, a') m n+ a@Pi{} -> equalFun a m n Lam _ _ -> __IMPOSSIBLE__ Def r ps -> do isrec <- isEtaRecord r@@ -157,23 +206,40 @@ -- Andreas, 2010-10-11: allowing neutrals to be blocked things does not seem -- to change Agda's behavior -- isNeutral Blocked{} = False- isNeutral (NotBlocked Con{}) = False- isNeutral _ = True- isMeta (NotBlocked MetaV{}) = True- isMeta _ = False+ isNeutral = isNeutral' . fmap ignoreSharing+ isMeta = isMeta' . fmap ignoreSharing+ isNeutral' (NotBlocked Con{}) = False+ isNeutral' _ = True+ isMeta' (NotBlocked MetaV{}) = True+ isMeta' _ = False - equalFun (a,t) m n = do+ -- equality at function type (accounts for eta)+ equalFun :: Term -> Term -> Term -> TCM ()+ equalFun (Shared p) m n = equalFun (derefPtr p) m n+ equalFun (Pi dom@(Dom h r _) b) m n = do+ name <- freshName_ $ properName $ absName b+ addCtx name dom $ compareTerm cmp (absBody b) m' n'+ where+ (m',n') = raise 1 (m,n) `apply` [Arg h r $ var 0]+ properName "_" = "x"+ properName x = x+ equalFun _ _ _ = __IMPOSSIBLE__+{- OLD CODE+ equalFun :: (Dom Type, Type) -> Term -> Term -> TCM ()+ equalFun (a@(Dom h r _), t) m n = do name <- freshName_ (suggest $ unEl t) addCtx name a $ compareTerm cmp t' m' n' where- p = fmap (const $ Var 0 []) a+ p = Arg h r $ var 0 (m',n') = raise 1 (m,n) `apply` [p] t' = raise 1 t `piApply` [p] suggest (Pi _ b) = absName b suggest _ = __IMPOSSIBLE__+-} --- | @compareTel t1 t2 cmp tel1 tel1@ checks whether pointwise @tel1 `cmp` tel2@--- and complains that @t2 `cmp` t1@ failed if not.+-- | @compareTel t1 t2 cmp tel1 tel1@ checks whether pointwise+-- @tel1 \`cmp\` tel2@ and complains that @t2 \`cmp\` t1@ failed if+-- not. compareTel :: Type -> Type -> Comparison -> Telescope -> Telescope -> TCM () compareTel t1 t2 cmp tel1 tel2 =@@ -182,17 +248,20 @@ (EmptyTel, EmptyTel) -> return () (EmptyTel, _) -> bad (_, EmptyTel) -> bad- (ExtendTel arg1@(Arg h1 r1 a1) tel1, ExtendTel arg2@(Arg h2 r2 a2) tel2)+ (ExtendTel arg1@(Dom h1 r1 a1) tel1, ExtendTel arg2@(Dom h2 r2 a2) tel2) | h1 /= h2 -> bad -- Andreas, 2011-09-11 do not test r1 == r2 because they could differ -- e.g. one could be Forced and the other Relevant (see fail/UncurryMeta) | otherwise -> do- let (tel1', tel2') = raise 1 (tel1, tel2)- arg = Var 0 [] name <- freshName_ (suggest (absName tel1) (absName tel2)) let checkArg = escapeContext 1 $ compareType cmp a1 a2- let c = TelCmp t1 t2 cmp (absApp tel1' arg) (absApp tel2' arg)- let r = max r1 r2 -- take "most irrelevant"+{- OLD+ let (tel1', tel2') = raise 1 (tel1, tel2)+ arg = var 0+ c = TelCmp t1 t2 cmp (absApp tel1' arg) (absApp tel2' arg)+-}+ c = TelCmp t1 t2 cmp (absBody tel1) (absBody tel2)+ r = max r1 r2 -- take "most irrelevant" dependent = (r /= Irrelevant) && isBinderUsed tel2 addCtx name arg1 $ if dependent@@ -213,14 +282,25 @@ verboseBracket "tc.conv.atom" 20 "compareAtom" $ -- if a PatternErr is thrown, rebuild constraint! catchConstraint (ValueCmp cmp t m n) $ do- let unLevel (Level l) = reallyUnLevelView l- unLevel v = return v- -- constructorForm changes literal to constructors+ reportSDoc "tc.conv.atom" 50 $+ text "compareAtom" <+> fsep [ prettyTCM m <+> prettyTCM cmp+ , prettyTCM n+ , text ":" <+> prettyTCM t ] -- Andreas: what happens if I cut out the eta expansion here? -- Answer: Triggers issue 245, does not resolve 348- mb <- traverse unLevel =<< traverse constructorForm =<< etaExpandBlocked =<< reduceB m- nb <- traverse unLevel =<< traverse constructorForm =<< etaExpandBlocked =<< reduceB n+ mb' <- etaExpandBlocked =<< reduceB m+ nb' <- etaExpandBlocked =<< reduceB n + -- constructorForm changes literal to constructors+ -- only needed if the other side is not a literal+ (mb'', nb'') <- case (ignoreSharing $ ignoreBlocking mb', ignoreSharing $ ignoreBlocking nb') of+ (Lit _, Lit _) -> return (mb', nb')+ _ -> (,) <$> traverse constructorForm mb'+ <*> traverse constructorForm nb'++ mb <- traverse unLevel mb''+ nb <- traverse unLevel nb''+ let m = ignoreBlocking mb n = ignoreBlocking nb @@ -233,11 +313,13 @@ then return () -- Check syntactic equality for blocked terms else postpone + unifyPointers cmp (ignoreBlocking mb') (ignoreBlocking nb') $ do -- this needs to go after eta expansion to avoid creating infinite terms+ reportSDoc "tc.conv.atom" 30 $ text "compareAtom" <+> fsep [ prettyTCM mb <+> prettyTCM cmp , prettyTCM nb , text ":" <+> prettyTCM t ]- case (mb, nb) of+ case (ignoreSharing <$> mb, ignoreSharing <$> nb) of -- equate two metas x and y. if y is the younger meta, -- try first y := x and then x := y (NotBlocked (MetaV x xArgs), NotBlocked (MetaV y yArgs))@@ -265,7 +347,7 @@ where l = assignV x xArgs n r = assignV y yArgs m - try m h = m `catchError_` \err -> case errError err of+ try m h = m `catchError_` \err -> case err of PatternErr s -> put s >> h _ -> throwError err @@ -280,7 +362,7 @@ (Blocked{}, Blocked{}) -> checkSyntacticEquality (Blocked{}, _) -> useInjectivity cmp t m n (_,Blocked{}) -> useInjectivity cmp t m n- _ -> case (m, n) of+ _ -> case (ignoreSharing m, ignoreSharing n) of (Pi{}, Pi{}) -> equalFun m n (Sort s1, Sort s2) -> compareSort CmpEq s1 s2@@ -293,11 +375,24 @@ (Def{}, Def{}) -> do ev1 <- elimView m ev2 <- elimView n+ reportSDoc "tc.conv.atom" 50 $+ sep [ text $ "ev1 = " ++ show ev1+ , text $ "ev2 = " ++ show ev2 ] case (ev1, ev2) of (VarElim x els1, VarElim y els2) | x == y -> cmpElim (typeOfBV x) (Var x []) els1 els2- (ConElim x els1, ConElim y els2) | x == y -> cmpElim (conType x t) (Con x []) els1 els2+ (ConElim x els1, ConElim y els2) | x == y ->+ cmpElim (conType x t) (Con x []) els1 els2+ -- Andreas 2012-01-17 careful! In the presence of+ -- projection eliminations, t is NOT the datatype x belongs to+ -- Ulf 2012-07-12: actually projection likeness is carefully+ -- set up so that there can't be any projections from+ -- constructor applications at this point, so t really is the+ -- datatype of x. See issue 676 for an example where it+ -- failed. (DefElim x els1, DefElim y els2) | x == y -> cmpElim (defType <$> getConstInfo x) (Def x []) els1 els2+ (DefElim x els1, DefElim y els2) ->+ trySizeUniv cmp t m n x els1 y els2 (MetaElim{}, _) -> __IMPOSSIBLE__ -- projections from metas should have been eta expanded (_, MetaElim{}) -> __IMPOSSIBLE__ _ -> typeError $ UnequalTerms cmp m n t@@ -324,50 +419,44 @@ compareArgs [] a' (Con x []) xArgs yArgs _ -> typeError $ UnequalTerms cmp m n t where- conType c (El _ (Def d args)) = do- npars <- do- def <- theDef <$> getConstInfo d- return $ case def of Datatype{dataPars = n} -> n- Record{recPars = n} -> n- _ -> __IMPOSSIBLE__- a <- defType <$> getConstInfo c- return $ piApply a (genericTake npars args)- conType _ _ = __IMPOSSIBLE__+ conType c (El _ v) = case ignoreSharing v of+ Def d args -> do+ npars <- do+ def <- theDef <$> getConstInfo d+ return $ case def of Datatype{dataPars = n} -> n+ Record{recPars = n} -> n+ _ -> __IMPOSSIBLE__+ a <- defType <$> getConstInfo c+ return $ piApply a (genericTake npars args)+ _ -> __IMPOSSIBLE__ - equalFun t1@(Pi arg1@(Arg h1 r1 a1) _) t2@(Pi (Arg h2 r2 a2) _)- | h1 /= h2 = typeError $ UnequalHiding ty1 ty2+ equalFun t1 t2 = case (ignoreSharing t1, ignoreSharing t2) of+ (Pi dom1@(Dom h1 r1 a1) b1, Pi (Dom h2 r2 a2) b2)+ | h1 /= h2 -> typeError $ UnequalHiding t1 t2 -- Andreas 2010-09-21 compare r1 and r2, but ignore forcing annotations!- | ignoreForced r1 /= ignoreForced r2 = typeError $ UnequalRelevance ty1 ty2- | otherwise = verboseBracket "tc.conv.fun" 15 "compare function types" $ do+ | not (compareRelevance cmp (ignoreForced r2) (ignoreForced r1)) -> typeError $ UnequalRelevance cmp t1 t2+ | otherwise -> verboseBracket "tc.conv.fun" 15 "compare function types" $ do reportSDoc "tc.conv.fun" 20 $ nest 2 $ vcat [ text "t1 =" <+> prettyTCM t1 , text "t2 =" <+> prettyTCM t2 ]- let (ty1',ty2') = raise 1 (ty1,ty2)- arg = Arg h1 r1 (Var 0 [])- name <- freshName_ (suggest t1 t2)- let checkArg = escapeContext 1 $ compareType cmp a2 a1- c = TypeCmp cmp (piApply ty1' [arg]) (piApply ty2' [arg])-+ let checkDom = escapeContext 1 $ compareType cmp a2 a1+ conCoDom = TypeCmp cmp (absBody b1) (absBody b2) -- We only need to require a1 == a2 if t2 is a dependent function type. -- If it's non-dependent it doesn't matter what we add to the context.- let dependent = case t2 of- Pi _ b -> isBinderUsed b- _ -> __IMPOSSIBLE__- addCtx name arg1 $- if dependent- then guardConstraint c checkArg- else checkArg >> solveConstraint_ c+ name <- freshName_ (suggest b1 b2)+ addCtx name dom1 $+ if isBinderUsed b2 -- dependent function type?+ then guardConstraint conCoDom checkDom+ else checkDom >> solveConstraint_ conCoDom where- ty1 = El (getSort a1) t1 -- TODO: wrong (but it doesn't matter)- ty2 = El (getSort a2) t2- suggest t1 t2 = case concatMap name [t1,t2] of- [] -> "_"- x:_ -> x- where- name (Pi _ b) = filter (/= "_") [absName b]- name _ = __IMPOSSIBLE__- equalFun _ _ = __IMPOSSIBLE__+ suggest b1 b2 = head $+ [ x | x <- map absName [b1,b2], x /= "_"] ++ ["_"]+ _ -> __IMPOSSIBLE__ +compareRelevance :: Comparison -> Relevance -> Relevance -> Bool+compareRelevance CmpEq = (==)+compareRelevance CmpLeq = (<=)+ -- | Type-directed equality on eliminator spines compareElims :: [Polarity] -> Type -> Term -> [Elim] -> [Elim] -> TCM () compareElims _ _ _ [] [] = return ()@@ -380,29 +469,31 @@ reportSDoc "tc.conv.elim" 25 $ nest 2 $ vcat [ text "a =" <+> prettyTCM a , text "v =" <+> prettyTCM v- , text "els1 =" <+> prettyTCM els01- , text "els2 =" <+> prettyTCM els02+ , text "arg1 =" <+> prettyTCM arg1+ , text "arg2 =" <+> prettyTCM arg2 ]+ reportSDoc "tc.conv.elim" 50 $ nest 2 $ vcat+ [ text "v =" <+> text (show v)+ , text "arg1 =" <+> text (show arg1)+ , text "arg2 =" <+> text (show arg2)+ ] let (pol, pols) = nextPolarity pols0 ab <- reduceB a let a = ignoreBlocking ab catchConstraint (ElimCmp pols0 a v els01 els02) $ do- case unEl <$> ab of+ case ignoreSharing . unEl <$> ab of Blocked{} -> patternViolation NotBlocked MetaV{} -> patternViolation- NotBlocked (Pi (Arg _ r b) _) -> do- let cmp x y = case pol of- Invariant -> compareTerm CmpEq b x y- Covariant -> compareTerm CmpLeq b x y- Contravariant -> compareTerm CmpLeq b y x+ NotBlocked (Pi (Dom _ r b) _) -> do mlvl <- mlevel- let checkArg = case r of+ let checkArg = applyRelevanceToContext r $ case r of Forced -> return ()- Irrelevant -> return () -- Andreas: ignore irr. func. args.- _ -> applyRelevanceToContext r $- cmp (unArg arg1) (unArg arg2)- dependent = case unEl a of- Pi (Arg _ _ (El _ lvl')) c -> 0 `freeInIgnoringSorts` absBody c+ r | irrelevantOrUnused r ->+ compareIrrelevant b (unArg arg1) (unArg arg2)+ _ -> compareWithPol pol (flip compareTerm b)+ (unArg arg1) (unArg arg2)+ dependent = case ignoreSharing $ unEl a of+ Pi (Dom _ _ (El _ lvl')) c -> 0 `freeInIgnoringSorts` absBody c && Just lvl' /= mlvl _ -> False @@ -417,26 +508,74 @@ | f /= f' = typeError . GenericError . show =<< prettyTCM f <+> text "/=" <+> prettyTCM f' | otherwise = do a <- reduce a- case unEl a of+ case ignoreSharing $ unEl a of Def r us -> do let (pol, _) = nextPolarity pols- ft <- defType <$> getConstInfo f+ ft <- defType <$> getConstInfo f -- get type of projection function let arg = Arg NotHidden Relevant v -- TODO: not necessarily relevant? let c = piApply ft (us ++ [arg]) (cmp, els1, els2) <- return $ case pol of Invariant -> (CmpEq, els1, els2) Covariant -> (CmpLeq, els1, els2)- Contravariant -> (CmpLeq, els2, els2)+ Contravariant -> (CmpLeq, els2, els1)+ Nonvariant -> __IMPOSSIBLE__ -- the polarity should be Invariant pols' <- getPolarity' cmp f compareElims pols' c (Def f [arg]) els1 els2 _ -> __IMPOSSIBLE__ +-- | "Compare" two terms in irrelevant position. This always succeeds.+-- However, we can dig for solutions of irrelevant metas in the+-- terms we compare.+-- (Certainly not the systematic solution, that'd be proof search...)+compareIrrelevant :: Type -> Term -> Term -> TCM ()+{- 2012-04-02 DontCare no longer present+compareIrrelevant a (DontCare v) w = compareIrrelevant a v w+compareIrrelevant a v (DontCare w) = compareIrrelevant a v w+-}+compareIrrelevant a v w = do+ reportSDoc "tc.conv.irr" 20 $ vcat+ [ text "compareIrrelevant"+ , nest 2 $ text "v =" <+> prettyTCM v+ , nest 2 $ text "w =" <+> prettyTCM w+ ]+ reportSDoc "tc.conv.irr" 50 $ vcat+ [ nest 2 $ text $ "v = " ++ show v+ , nest 2 $ text $ "w = " ++ show w+ ]+ try v w $ try w v $ return ()+ where+ try (Shared p) w fallback = try (derefPtr p) w fallback+ try (MetaV x vs) w fallback = do+ mv <- lookupMeta x+ let rel = getMetaRelevance mv+ inst = case mvInstantiation mv of+ InstV{} -> True+ InstS{} -> True+ _ -> False+ reportSDoc "tc.conv.irr" 20 $ vcat+ [ nest 2 $ text $ "rel = " ++ show rel+ , nest 2 $ text $ "inst = " ++ show inst+ ]+ if not (irrelevantOrUnused rel) || inst then fallback else assignV x vs w+ -- the value of irrelevant or unused meta does not matter+ try v w fallback = fallback++compareWithPol :: Polarity -> (Comparison -> a -> a -> TCM ()) -> a -> a -> TCM ()+compareWithPol Invariant cmp x y = cmp CmpEq x y+compareWithPol Covariant cmp x y = cmp CmpLeq x y+compareWithPol Contravariant cmp x y = cmp CmpLeq y x+compareWithPol Nonvariant cmp x y = return ()+ -- | Type-directed equality on argument lists -- compareArgs :: [Polarity] -> Type -> Term -> Args -> Args -> TCM () compareArgs pol a v args1 args2 = compareElims pol a v (map Apply args1) (map Apply args2) +---------------------------------------------------------------------------+-- * Types+---------------------------------------------------------------------------+ -- | Equality on Types compareType :: Comparison -> Type -> Type -> TCM () compareType cmp ty1@(El s1 a1) ty2@(El s2 a2) =@@ -449,35 +588,71 @@ ] -- Andreas, 2011-4-27 should not compare sorts, but currently this is needed -- for solving sort and level metas--- let cs1 = []- compareSort CmpEq s1 s2 `catchError` \err -> case errError err of- TypeError _ _ -> do- reportSDoc "tc.conv.type" 30 $ vcat- [ text "sort comparison failed"- , nest 2 $ vcat- [ text "s1 =" <+> prettyTCM s1- , text "s2 =" <+> prettyTCM s2- ]- ]- -- This error will probably be more informative- compareTerm cmp (sort s1) a1 a2- -- Throw the original error if the above doesn't- -- give an error (for instance, due to pending- -- constraints).- -- Or just ignore it... We run into this with irrelevant levels- -- which may show up in sort constraints, causing them to fail.- -- In any case it's not safe to ignore the error, for instance- -- a1 might be Set and a2 a meta of type Set, in which case we- -- really need the sort comparison to fail, instead of silently- -- instantiating the meta.- throwError err- _ -> throwError err+ compareSort CmpEq s1 s2 `catchError` \err -> case err of+ TypeError _ e -> do+ reportSDoc "tc.conv.type" 30 $ vcat+ [ text "sort comparison failed"+ , nest 2 $ vcat+ [ text "s1 =" <+> prettyTCM s1+ , text "s2 =" <+> prettyTCM s2+ ]+ ]+ case clValue e of+ -- Issue 659: Better error message+ SetOmegaNotValidType -> typeError $ UnequalBecauseOfUniverseConflict cmp a1 a2+ _ -> do+ -- This error will probably be more informative+ compareTerm cmp (sort s1) a1 a2+ -- Throw the original error if the above doesn't+ -- give an error (for instance, due to pending+ -- constraints).+ -- Or just ignore it... We run into this with irrelevant levels+ -- which may show up in sort constraints, causing them to fail.+ -- In any case it's not safe to ignore the error, for instance+ -- a1 might be Set and a2 a meta of type Set, in which case we+ -- really need the sort comparison to fail, instead of silently+ -- instantiating the meta.+ throwError err+ _ -> throwError err compareTerm cmp (sort s1) a1 a2 return () leqType :: Type -> Type -> TCM () leqType = compareType CmpLeq +-- | @coerce v a b@ coerces @v : a@ to type @b@, returning a @v' : b@+-- with maybe extra hidden applications or hidden abstractions.+--+-- In principle, this function can host coercive subtyping, but+-- currently it only tries to fix problems with hidden function types.+coerce :: Term -> Type -> Type -> TCM Term+coerce v t1 t2 = blockTerm t2 $ do+ verboseS "tc.conv.coerce" 10 $ do+ (a1,a2) <- reify (t1,t2)+ let dbglvl = if isSet a1 && isSet a2 then 50 else 10+ reportSDoc "tc.conv.coerce" dbglvl $+ text "coerce" <+> vcat+ [ text "term v =" <+> prettyTCM v+ , text "from type t1 =" <+> prettyTCM a1+ , text "to type t2 =" <+> prettyTCM a2+ ]+ -- v <$ do workOnTypes $ leqType t1 t2+ -- take off hidden/instance domains from t1 and t2+ TelV tel1 b1 <- telViewUpTo' (-1) ((NotHidden /=) . domHiding) t1+ TelV tel2 b2 <- telViewUpTo' (-1) ((NotHidden /=) . domHiding) t2+ let n = size tel1 - size tel2+ -- the crude solution would be+ -- v' = λ {tel2} → v {tel1}+ -- however, that may introduce unneccessary many function types+ -- If n > 0 and b2 is not blocked, it is safe to+ -- insert n many hidden args+ if n <= 0 then fallback else do+ ifBlockedType b2 (\ _ _ -> fallback) $ \ _ -> do+ (args, t1') <- implicitArgs n (NotHidden /=) t1+ v `apply` args <$ do workOnTypes $ leqType t1' t2+ where+ fallback = v <$ do workOnTypes $ leqType t1 t2+ --------------------------------------------------------------------------- -- * Sorts ---------------------------------------------------------------------------@@ -497,7 +672,7 @@ , nest 2 $ fsep [ prettyTCM s1 <+> text "=<" , prettyTCM s2 ] ]- case (s1,s2) of+ case (s1, s2) of (Type a, Type b) -> leqLevel a b @@ -558,6 +733,9 @@ [n] -> Just n _ -> Nothing + -- Andreas, 2012-10-02 raise error on unsolvable constraint+ ([ClosedLevel n], [ClosedLevel m]) -> if n <= m then ok else notok+ -- closed ≤ bs ([ClosedLevel n], bs) | n <= maximum (map constant bs) -> ok@@ -589,7 +767,7 @@ postpone = patternViolation wrap m = catchError m $ \e ->- case errError e of+ case e of TypeError{} -> notok _ -> throwError e @@ -613,7 +791,7 @@ -- choice [] = patternViolation -- choice (m:ms) = noConstraints m `catchError` \_ -> choice ms--- case errError e of+-- case e of -- PatternErr{} -> choice ms -- _ -> throwError e @@ -680,7 +858,10 @@ _ | any isMeta (as ++ bs) -> postpone -- neutral/closed == neutral/closed- _ | all isNeutralOrClosed (as ++ bs) -> as =!= bs+ _ | all isNeutralOrClosed (as ++ bs) ->+ if length as == length bs+ then zipWithM_ (\a b -> [a] =!= [b]) as bs+ else notok -- more cases? _ -> postpone@@ -704,7 +885,7 @@ -- Make sure to give a sensible error message wrap m = m `catchError` \err ->- case errError err of+ case err of TypeError{} -> notok _ -> throwError err @@ -750,7 +931,7 @@ , text (show s2) ] ] ]- case (s1,s2) of+ case (s1, s2) of (Type a , Type b ) -> equalLevel a b @@ -778,5 +959,6 @@ isInf notok ClosedLevel{} = notok isInf notok (Plus _ l) = case l of MetaLevel x vs -> assignV x vs (Sort Inf)+ NeutralLevel (Shared p) -> isInf notok (Plus 0 $ NeutralLevel $ derefPtr p) NeutralLevel (Sort Inf) -> return () _ -> notok
src/full/Agda/TypeChecking/Coverage.hs view
@@ -1,4 +1,4 @@-{-# LANGUAGE CPP, FlexibleContexts #-}+{-# LANGUAGE CPP, PatternGuards, FlexibleContexts, TupleSections #-} module Agda.TypeChecking.Coverage where @@ -15,6 +15,7 @@ import Agda.Syntax.Internal.Pattern import Agda.TypeChecking.Monad.Base+import Agda.TypeChecking.Monad.Closure import Agda.TypeChecking.Monad.Trace import Agda.TypeChecking.Monad.Signature import Agda.TypeChecking.Monad.Options@@ -27,6 +28,7 @@ import qualified Agda.TypeChecking.Rules.LHS.Split as Split import Agda.TypeChecking.Coverage.Match+import Agda.TypeChecking.Coverage.SplitTree import Agda.TypeChecking.Pretty import Agda.TypeChecking.Substitute@@ -40,40 +42,66 @@ import Agda.Utils.Permutation import Agda.Utils.Size import Agda.Utils.Tuple+import Agda.Utils.List+import Agda.Utils.Maybe import Agda.Utils.Monad #include "../undefined.h" import Agda.Utils.Impossible data SplitClause = SClause- { scTel :: Telescope -- ^ type of variables in scPats- , scPerm :: Permutation -- ^ how to get from the variables in the patterns to the telescope- , scPats :: [Arg Pattern]- , scSubst :: [Term] -- ^ substitution from scTel to old context+ { scTel :: Telescope -- ^ Type of variables in @scPats@.+ , scPerm :: Permutation -- ^ How to get from the variables in the patterns to the telescope.+ , scPats :: [Arg Pattern] -- ^ The patterns leading to the currently considered branch of the split tree.+ , scSubst :: Substitution -- ^ Substitution from @scTel@ to old context.+ , scTarget :: Maybe Type -- ^ The type of the rhs. } -type Covering = [SplitClause]+-- | A @Covering@ is the result of splitting a 'SplitClause'.+data Covering = Covering+ { covSplitArg :: Nat -- ^ De Bruijn level of argument we split on.+ , covSplitClauses :: [(QName, SplitClause)]+ -- ^ Covering clauses, indexed by constructor these clauses share.+ } -data SplitError = NotADatatype Type -- ^ neither data type nor record- | IrrelevantDatatype Type -- ^ data type, but in irrelevant position- | CoinductiveDatatype Type -- ^ coinductive data type+-- | Project the split clauses out of a covering.+splitClauses :: Covering -> [SplitClause]+splitClauses (Covering _ qcs) = map snd qcs++-- | Create a split clause from a clause in internal syntax.+clauseToSplitClause :: Clause -> SplitClause+clauseToSplitClause cl = SClause+ { scTel = clauseTel cl+ , scPerm = clausePerm cl+ , scPats = clausePats cl+ , scSubst = __IMPOSSIBLE__+ , scTarget = Nothing+ }++data SplitError = NotADatatype (Closure Type) -- ^ neither data type nor record+ | IrrelevantDatatype (Closure Type) -- ^ data type, but in irrelevant position+ | CoinductiveDatatype (Closure Type) -- ^ coinductive data type+{- UNUSED | NoRecordConstructor Type -- ^ record type, but no constructor+ -} | CantSplit QName Telescope Args Args [Term] | GenericSplitError String deriving (Show) instance PrettyTCM SplitError where prettyTCM err = case err of- NotADatatype t -> fsep $+ NotADatatype t -> enterClosure t $ \ t -> fsep $ pwords "Cannot pattern match on non-datatype" ++ [prettyTCM t]- IrrelevantDatatype t -> fsep $+ IrrelevantDatatype t -> enterClosure t $ \ t -> fsep $ pwords "Cannot pattern match on datatype" ++ [prettyTCM t] ++ pwords "since it is declared irrelevant"- CoinductiveDatatype t -> fsep $+ CoinductiveDatatype t -> enterClosure t $ \ t -> fsep $ pwords "Cannot pattern match on the coinductive type" ++ [prettyTCM t]+{- UNUSED NoRecordConstructor t -> fsep $ pwords "Cannot pattern match on record" ++ [prettyTCM t] ++ pwords "because it has no constructor"+ -} CantSplit c tel cIxs gIxs flex -> addCtxTel tel $ vcat [ fsep $ pwords "Cannot decide whether there should be a case for the constructor" ++ [prettyTCM c <> text ","] ++ pwords "since the unification gets stuck on unifying the inferred indices"@@ -90,50 +118,84 @@ type CoverM = ExceptionT SplitError TCM -typeOfVar :: Telescope -> Nat -> Arg Type+{- UNUSED+typeOfVar :: Telescope -> Nat -> Dom Type typeOfVar tel n | n >= len = __IMPOSSIBLE__ | otherwise = fmap snd -- throw away name, keep Arg Type- $ ts !! fromIntegral n+ $ ts !! fromIntegral (len - 1 - n) where len = genericLength ts- ts = reverse $ telToList tel+ ts = telToList tel+-} --- | Top-level function for checking pattern coverage.+-- | Old top-level function for checking pattern coverage.+-- DEPRECATED checkCoverage :: QName -> TCM () checkCoverage f = do d <- getConstInfo f- TelV gamma _ <- telView $ defType d- let defn = theDef d- case defn of- Function{ funProjection = proj, funClauses = cs@(_:_) } -> do- let n = genericLength $ clausePats $ head cs- np = maybe 0 snd proj- gamma' = telFromList $ genericTake n $ genericDrop np $ telToList gamma- xs = map (fmap $ const $ VarP "_") $ telToList gamma'- reportSDoc "tc.cover.top" 10 $ vcat- [ text "Coverage checking"- , nest 2 $ vcat $ map (text . show . clausePats) cs- ]- (used, pss) <- cover cs $ SClause gamma' (idP n) xs (idSub gamma')- whenM (optCompletenessCheck <$> pragmaOptions) $- case pss of- [] -> return ()- _ ->- setCurrentRange (getRange cs) $- typeError $ CoverageFailure f pss- case Set.toList $ Set.difference (Set.fromList [0..genericLength cs - 1]) used of- [] -> return ()- is -> do- let unreached = map ((cs !!) . fromIntegral) is- setCurrentRange (getRange unreached) $- typeError $ UnreachableClauses f (map clausePats unreached)- _ -> __IMPOSSIBLE__+ case theDef d of+ Function{ funProjection = Nothing, funClauses = cs@(_:_) } -> do+ coverageCheck f (defType d) cs+ return ()+ Function{ funProjection = Just _ } -> __IMPOSSIBLE__+ _ -> __IMPOSSIBLE__ --- | Check that the list of clauses covers the given split clause.--- Returns the missing cases.-cover :: [Clause] -> SplitClause -> TCM (Set Nat, [[Arg Pattern]])-cover cs (SClause tel perm ps _) = do+-- | Top-level function for checking pattern coverage.+coverageCheck :: QName -> Type -> [Clause] -> TCM SplitTree+coverageCheck f t cs = do+ TelV gamma a <- telView t+ let -- n = arity+ -- lgamma/gamma' = telescope of non-dropped arguments+ -- xs = variable patterns fitting lgamma+ n = size gamma+ lgamma = telToList gamma+ xs = map (argFromDom . fmap (const $ VarP "_")) $ lgamma+ -- construct the initial split clause+ sc = SClause gamma (idP n) xs idS $ Just a+{- OLD+ let -- n = arity+ -- lgamma/gamma' = telescope of non-dropped arguments+ -- xs = variable patterns fitting lgamma+ n = genericLength $ clausePats $ head cs+ (lgamma, rgamma) = genericSplitAt n $ telToList gamma+ gamma' = telFromList lgamma+ xs = map (argFromDom . fmap (const $ VarP "_")) $ lgamma+ -- construct the initial split clause+ b = telePi (telFromList rgamma) a+ sc = SClause gamma' (idP n) xs idS $ Just b+-}+ reportSDoc "tc.cover.top" 10 $ vcat+ [ text "Coverage checking"+ , nest 2 $ vcat $ map (text . show . clausePats) cs+ ]+ -- used = actually used clauses for cover+ -- pss = uncovered cases+ (splitTree, used, pss) <- cover cs sc+ reportSDoc "tc.cover.splittree" 10 $ vcat+ [ text "generated split tree for" <+> prettyTCM f+ , text $ show splitTree+ ]+ whenM (optCompletenessCheck <$> pragmaOptions) $+ -- report an error if there are uncovered cases+ unless (null pss) $+ setCurrentRange (getRange cs) $+ typeError $ CoverageFailure f pss+ -- is = indices of unreachable clauses+ let is = Set.toList $ Set.difference (Set.fromList [0..genericLength cs - 1]) used+ -- report an error if there are unreachable clauses+ unless (null is) $ do+ let unreached = map (cs !!) is+ setCurrentRange (getRange unreached) $+ typeError $ UnreachableClauses f (map clausePats unreached)+ return splitTree+++-- | @cover cs (SClause _ _ ps _) = return (splitTree, used, pss)@.+-- checks that the list of clauses @cs@ covers the given split clause.+-- Returns the @splitTree@, the @used@ clauses, and missing cases @pss@.+cover :: [Clause] -> SplitClause -> TCM (SplitTree, Set Nat, [[Arg Pattern]])+cover cs sc@(SClause tel perm ps _ target) = do reportSDoc "tc.cover.cover" 10 $ vcat [ text "checking coverage of pattern:" , nest 2 $ text "tel =" <+> prettyTCM tel@@ -144,67 +206,122 @@ Yes i -> do reportSLn "tc.cover.cover" 10 $ "pattern covered by clause " ++ show i -- Check if any earlier clauses could match with appropriate literals- let is = [ j | (j, c) <- zip [0..] (genericTake i cs), matchLits c ps perm ]+ let is = [ j | (j, c) <- zip [0..i-1] cs, matchLits c ps perm ]+ -- OLD: let is = [ j | (j, c) <- zip [0..] (genericTake i cs), matchLits c ps perm ] reportSLn "tc.cover.cover" 10 $ "literal matches: " ++ show is- return (Set.fromList (i : is), [])- No -> return (Set.empty, [ps])- Block x -> do- r <- split Inductive tel perm ps x+ return (SplittingDone (size tel), Set.fromList (i : is), [])+ No -> return (SplittingDone (size tel), Set.empty, [ps])+ Block bs -> do+ reportSLn "tc.cover.strategy" 20 $ "blocking vars = " ++ show bs+ -- xs is a non-empty lists of blocking variables+ -- try splitting on one of them+ xs <- splitStrategy bs tel+ r <- altM1 (split Inductive sc) xs case r of Left err -> case err of CantSplit c tel us vs _ -> typeError $ CoverageCantSplitOn c tel us vs- NotADatatype a -> typeError $ CoverageCantSplitType a- IrrelevantDatatype a -> typeError $ CoverageCantSplitIrrelevantType a- CoinductiveDatatype a -> typeError $ CoverageCantSplitType a+ NotADatatype a -> enterClosure a $ typeError . CoverageCantSplitType+ IrrelevantDatatype a -> enterClosure a $ typeError . CoverageCantSplitIrrelevantType+ CoinductiveDatatype a -> enterClosure a $ typeError . CoverageCantSplitType+{- UNUSED NoRecordConstructor a -> typeError $ CoverageCantSplitType a+ -} GenericSplitError s -> fail $ "failed to split: " ++ s- Right scs -> (Set.unions -*- concat) . unzip <$> mapM (cover cs) scs+ -- If we get the empty covering, we have reached an impossible case+ -- and are done.+ Right (Covering n []) ->+ return (SplittingDone (size tel), Set.empty, [])+ Right (Covering n scs) -> do+ (trees, useds, psss) <- unzip3 <$> mapM (cover cs) (map snd scs)+ let tree = SplitAt n $ zipWith (\ (q,_) t -> (q,t)) scs trees+ return (tree, Set.unions useds, concat psss) +splitStrategy :: BlockingVars -> Telescope -> TCM BlockingVars+splitStrategy bs tel = return $ updateLast (mapSnd (const Nothing)) xs+ -- Make sure we do not insists on precomputed coverage when+ -- we make our last try to split.+ -- Otherwise, we will not get a nice error message.+ where+ xs = bs+{-+-- Andreas, 2012-10-13+-- The following split strategy which prefers all-constructor columns+-- fails on test/fail/CoverStrategy+ xs = ys ++ zs+ (ys, zs) = partition allConstructors bs+ allConstructors :: BlockingVar -> Bool+ allConstructors = isJust . snd+-}+ -- | Check that a type is a non-irrelevant datatype or a record with -- named constructor. Unless the 'Induction' argument is 'CoInductive' -- the data type must be inductive. isDatatype :: (MonadTCM tcm, MonadException SplitError tcm) =>- Induction -> Arg Type ->+ Induction -> Dom Type -> tcm (QName, [Arg Term], [Arg Term], [QName]) isDatatype ind at = do- let t = unArg at+ let t = unDom at+ throw f = throwException . f =<< do liftTCM $ buildClosure t t' <- liftTCM $ reduce t- case unEl t' of+ case ignoreSharing $ unEl t' of Def d args -> do def <- liftTCM $ theDef <$> getConstInfo d splitOnIrrelevantDataAllowed <- liftTCM $ optExperimentalIrrelevance <$> pragmaOptions case def of Datatype{dataPars = np, dataCons = cs, dataInduction = i} | i == CoInductive && ind /= CoInductive ->- throwException $ CoinductiveDatatype t- -- Andreas, 2011-10-03 allow some splitting on data (if only one constr. matches)- | argRelevance at == Irrelevant && not splitOnIrrelevantDataAllowed ->- throwException $ IrrelevantDatatype t+ throw CoinductiveDatatype+ -- Andreas, 2011-10-03 allow some splitting on irrelevant data (if only one constr. matches)+ | domRelevance at == Irrelevant && not splitOnIrrelevantDataAllowed ->+ throw IrrelevantDatatype | otherwise -> do let (ps, is) = genericSplitAt np args return (d, ps, is, cs)- Record{recPars = np, recCon = c, recNamedCon = hasCon} ->- if hasCon then return (d, args, [], [c])- else throwException $ NoRecordConstructor t- _ -> throwException $ NotADatatype t- _ -> throwException $ NotADatatype t+ Record{recPars = np, recCon = c} ->+ return (d, args, [], [c])+ _ -> throw NotADatatype+ _ -> throw NotADatatype --- | @dtype == d pars ixs@-computeNeighbourhood :: Telescope -> Telescope -> Permutation -> QName -> Args -> Args -> Nat -> OneHolePatterns -> QName -> CoverM [SplitClause]-computeNeighbourhood delta1 delta2 perm d pars ixs hix hps con = do+-- | @computeNeighbourhood delta1 delta2 perm d pars ixs hix hps con@+--+-- @+-- delta1 Telescope before split point+-- n Name of pattern variable at split point+-- delta2 Telescope after split point+-- d Name of datatype to split at+-- pars Data type parameters+-- ixs Data type indices+-- hix Index of split variable+-- hps Patterns with hole at split point+-- con Constructor to fit into hole+-- @+-- @dtype == d pars ixs@+computeNeighbourhood :: Telescope -> String -> Telescope -> Permutation -> QName -> Args -> Args -> Nat -> OneHolePatterns -> QName -> CoverM [SplitClause]+computeNeighbourhood delta1 n delta2 perm d pars ixs hix hps con = do -- Get the type of the datatype dtype <- liftTCM $ (`piApply` pars) . defType <$> getConstInfo d -- Get the real constructor name- Con con [] <- liftTCM $ constructorForm =<< normalise (Con con [])+ Con con [] <- liftTCM $ ignoreSharing <$> (constructorForm =<< normalise (Con con [])) -- Get the type of the constructor ctype <- liftTCM $ defType <$> getConstInfo con -- Lookup the type of the constructor at the given parameters- TelV gamma (El _ (Def _ cixs)) <- liftTCM $ telView (ctype `piApply` pars)+ (gamma0, cixs) <- do+ TelV gamma0 (El _ d) <- liftTCM $ telView (ctype `piApply` pars)+ let Def _ cixs = ignoreSharing d+ return (gamma0, cixs) + -- Andreas, 2012-02-25 preserve name suggestion for recursive arguments+ -- of constructor++ let preserve (x, t@(El _ (Def d' _))) | d == d' = (n, t)+ preserve (x, (El s (Shared p))) = preserve (x, El s $ derefPtr p)+ preserve p = p+ gamma = telFromList . map (fmap preserve) . telToList $ gamma0+ debugInit con ctype pars ixs cixs delta1 delta2 gamma hps hix -- All variables are flexible@@ -224,7 +341,7 @@ DontKnow _ -> do debugCantSplit throwException $ CantSplit con (delta1 `abstract` gamma) conIxs givenIxs- [ Var i [] | i <- flex ]+ [ var i | i <- flex ] Unifies sub -> do debugSubst "sub" sub @@ -233,16 +350,17 @@ delta2' = subst conv $ raiseFrom 1 (size gamma) delta2 debugTel "delta2'" delta2' - -- Compute a substitution ρ : Δ₁ΓΔ₂' → Δ₁(x:D)Δ₂- let rho = [ Var i [] | i <- [0..size delta2' - 1] ]- ++ [ raise (size delta2') conv ]- ++ [ Var i [] | i <- [size delta2' + size gamma ..] ]+ -- Compute a substitution ρ : Δ₁ΓΔ₂' → Δ₁(x:D)Δ₂'+ let rho = liftS (size delta2') $ conv :# raiseS (size gamma)+ -- [ Var i [] | i <- [0..size delta2' - 1] ]+ -- ++ [ raise (size delta2') conv ]+ -- ++ [ Var i [] | i <- [size delta2' + size gamma ..] ] -- Plug the hole with the constructor and apply ρ -- TODO: Is it really correct to use Nothing here? let conp = ConP con Nothing $ map (fmap VarP) $ teleArgNames gamma ps = plugHole conp hps- ps' = substs rho ps -- Δ₁ΓΔ₂' ⊢ ps'+ ps' = applySubst rho ps -- Δ₁ΓΔ₂' ⊢ ps' debugPlugged ps ps' -- Δ₁Γ ⊢ sub, we need something in Δ₁ΓΔ₂'@@ -271,14 +389,14 @@ -- Compute the final patterns let ps'' = instantiatePattern sub' perm' ps'- rps = substs rho' ps''+ rps = applySubst rho' ps'' -- Compute the final substitution- let rsub = substs rho' rho+ let rsub = applySubst rho' rho debugFinal theta' rperm rps - return [SClause theta' rperm rps rsub]+ return [SClause theta' rperm rps rsub Nothing] -- target fixed later where debugInit con ctype pars ixs cixs delta1 delta2 gamma hps hix =@@ -332,43 +450,62 @@ , text "rps =" <+> text (show ps) ] --- | split Δ x ps. Δ ⊢ ps, x ∈ Δ (deBruijn index)-splitClause :: Clause -> Nat -> TCM (Either SplitError Covering)-splitClause c x =- split Inductive (clauseTel c) (clausePerm c) (clausePats c) x-+-- | Entry point from @Interaction.MakeCase@.+-- @Abs@ is for absurd clause. splitClauseWithAbs :: Clause -> Nat -> TCM (Either SplitError (Either SplitClause Covering))-splitClauseWithAbs c x =- split' Inductive (clauseTel c) (clausePerm c) (clausePats c) x+splitClauseWithAbs c x = split' Inductive (clauseToSplitClause c) (x, Nothing) +-- | Entry point from @TypeChecking.Empty@ and @Interaction.BasicOps@.+splitLast :: Induction -> Telescope -> [Arg Pattern] -> TCM (Either SplitError Covering)+splitLast ind tel ps = split ind sc (0, Nothing)+ where sc = SClause tel (idP $ size tel) ps __IMPOSSIBLE__ Nothing++-- | @split _ Δ π ps x@. FIXME: Δ ⊢ ps, x ∈ Δ (deBruijn index) split :: Induction -- ^ Coinductive constructors are allowed if this argument is -- 'CoInductive'.- -> Telescope -> Permutation -> [Arg Pattern] -> Nat+ -> SplitClause+ -> BlockingVar -> TCM (Either SplitError Covering)-split ind tel perm ps x = do- r <- split' ind tel perm ps x+split ind sc x = fmap (blendInAbsurdClause (splitDbIndexToLevel sc x)) <$>+ split' ind sc x+{- OLD+split ind sc@SClause{ scTel = tel, scPerm = perm, scPats = ps } x =+ r <- split' ind sc x return $ case r of Left err -> Left err- Right (Left _) -> Right []+ Right (Left _) -> Right $ Covering (dbIndexToLevel tel perm $ fst x) [] Right (Right c) -> Right c+-} +blendInAbsurdClause :: Nat -> Either SplitClause Covering -> Covering+blendInAbsurdClause n = either (const $ Covering n []) id++splitDbIndexToLevel :: SplitClause -> BlockingVar -> Nat+splitDbIndexToLevel sc@SClause{ scTel = tel, scPerm = perm } x =+ dbIndexToLevel tel perm $ fst x++-- | Convert a de Bruijn index relative to a telescope to a de Buijn level.+-- The result should be the argument (counted from left, starting with 0)+-- to split at (dot patterns included!).+dbIndexToLevel tel perm x = if n < 0 then __IMPOSSIBLE__ else n+ where n = permute perm [0..] !! (size tel - x - 1)+ split' :: Induction -- ^ Coinductive constructors are allowed if this argument is -- 'CoInductive'.- -> Telescope -> Permutation -> [Arg Pattern] -> Nat+ -> SplitClause+ -> BlockingVar -> TCM (Either SplitError (Either SplitClause Covering))-split' ind tel perm ps x = liftTCM $ runExceptionT $ do+split' ind sc@(SClause tel perm ps _ target) (x, mcons) = liftTCM $ runExceptionT $ do debugInit tel perm x ps -- Split the telescope at the variable- (delta1, delta2) <- do- let (tel1, _ : tel2) = genericSplitAt (size tel - x - 1) $ telToList tel- return (telFromList tel1, telFromList tel2)-- -- Get the type of the variable- let t = typeOfVar tel x -- Δ₁ ⊢ t+ -- t = type of the variable, Δ₁ ⊢ t+ (n, t, delta1, delta2) <- do+ let (tel1, Dom h r (n, t) : tel2) = genericSplitAt (size tel - x - 1) $ telToList tel+ return (n, Dom h r t, telFromList tel1, telFromList tel2) -- Compute the one hole context of the patterns at the variable (hps, hix) <- do@@ -377,20 +514,25 @@ fail "split: bad holes or tel" -- There is always a variable at the given hole.- let (hix, (VarP s, hps)) = holes !! fromIntegral x+ let (hix, (VarP s, hps)) = holes !! x debugHoleAndType delta1 delta2 s hps t return (hps, hix) -- Check that t is a datatype or a record -- Andreas, 2010-09-21, isDatatype now directly throws an exception if it fails+ -- cons = constructors of this datatype (d, pars, ixs, cons) <- inContextOfT $ isDatatype ind t liftTCM $ whenM (optWithoutK <$> pragmaOptions) $- inContextOfT $ Split.wellFormedIndices pars ixs+ inContextOfT $ Split.wellFormedIndices (unDom t) -- Compute the neighbourhoods for the constructors- ns <- concat <$> mapM (computeNeighbourhood delta1 delta2 perm d pars ixs hix hps) cons+ ns <- concat <$> do+ forM cons $ \ con ->+ map (con,) <$> do+ mapM fixTarget =<<+ computeNeighbourhood delta1 n delta2 perm d pars ixs hix hps con case ns of [] -> do let absurd = VarP "()"@@ -400,26 +542,62 @@ telToList delta2 , scPerm = perm , scPats = plugHole absurd hps- , scSubst = [] -- not used anyway+ , scSubst = idS -- not used anyway+ , scTarget = Nothing -- not used } -- Andreas, 2011-10-03 -- if more than one constructor matches, we cannot be irrelevant -- (this piece of code is unreachable if --experimental-irrelevance is off)- (_ : _ : _) | unusableRelevance (argRelevance t) ->- throwException $ IrrelevantDatatype (unArg t)+ (_ : _ : _) | unusableRelevance (domRelevance t) ->+ throwException . IrrelevantDatatype =<< do liftTCM $ buildClosure (unDom t) - _ -> return $ Right ns+ -- Andreas, 2012-10-10 fail if precomputed constructor set does not cover+ -- all the data type constructors + _ | Just pcons <- mcons,+ let cons = (map fst ns),+ let diff = Set.fromList cons Set.\\ Set.fromList pcons,+ not (Set.null diff) -> do+ liftTCM $ reportSDoc "tc.cover.precomputed" 10 $ vcat+ [ hsep $ text "pcons =" : map prettyTCM pcons+ , hsep $ text "cons =" : map prettyTCM cons+ ]+ throwException (GenericSplitError "precomputed set of constructors does not cover all cases")++ _ -> return $ Right $ Covering xDBLevel ns+ where+ xDBLevel = dbIndexToLevel tel perm x + -- update the target type, add more patterns to split clause+ -- if target becomes a function type.+ fixTarget :: SplitClause -> CoverM SplitClause+ fixTarget sc@SClause{ scSubst = sigma } =+ flip (maybe $ return sc) target $ \ a -> do+ TelV tel b <- lift $ telView $ applySubst sigma a+ let n = size tel+ lgamma = telToList tel+ xs = map (argFromDom . fmap (const $ VarP "_")) $ lgamma+ if (n == 0) then return sc { scTarget = Just b }+ else return $ SClause+ { scTel = telFromList $ telToList (scTel sc) ++ lgamma+ , scPerm = liftP n $ scPerm sc+ , scPats = scPats sc ++ xs+ , scSubst = liftS n $ sigma+ , scTarget = Just b+ }+ inContextOfT :: MonadTCM tcm => tcm a -> tcm a- inContextOfT = escapeContext (fromIntegral x + 1)+ inContextOfT = addCtxTel tel . escapeContext (x + 1) + inContextOfDelta2 :: MonadTCM tcm => tcm a -> tcm a+ inContextOfDelta2 = addCtxTel tel . escapeContext x+ -- Debug printing debugInit tel perm x ps = liftTCM $ reportSDoc "tc.cover.top" 10 $ vcat- [ text "TypeChecking.Rules.LHS.Coverage.split': split"+ [ text "TypeChecking.Coverage.split': split" , nest 2 $ vcat [ text "tel =" <+> prettyTCM tel , text "perm =" <+> text (show perm)@@ -433,6 +611,6 @@ [ text "p =" <+> text s , text "hps =" <+> text (show hps) , text "delta1 =" <+> prettyTCM delta1- , text "delta2 =" <+> prettyTCM delta2+ , text "delta2 =" <+> inContextOfDelta2 (prettyTCM delta2) , text "t =" <+> inContextOfT (prettyTCM t) ]
src/full/Agda/TypeChecking/Coverage/Match.hs view
@@ -1,9 +1,12 @@-{-# LANGUAGE CPP, DeriveFunctor #-}+{-# LANGUAGE CPP, PatternGuards, DeriveFunctor #-} module Agda.TypeChecking.Coverage.Match where import Control.Applicative import Control.Monad.State++import Data.Map (Map)+import qualified Data.Map as Map import Data.Monoid import Data.Traversable (traverse) import Data.Function@@ -15,10 +18,50 @@ import Agda.Utils.Permutation import Agda.Utils.Size+import Agda.Utils.List #include "../../undefined.h" import Agda.Utils.Impossible +{-| Given++ 1. the function clauses @cs@+ 2. the patterns @ps@ and permutation @perm@ of a split clause++we want to compute a variable index of the split clause to split on next.++First, we find the set @cs'@ of all the clauses that are+instances (via substitutions @rhos@) of the split clause.++In these substitutions, we look for a column that has only constructor patterns.+We try to split on this column first.+-}+{-+nonOverlappingCompleteMatches :: [Clause] -> [Arg Pattern] -> Permutation -> Match Nat+nonOverlappingCompleteMatches cs ps perm+-}++-- | Match the given patterns against a list of clauses+match :: [Clause] -> [Arg Pattern] -> Permutation -> Match Nat+match cs ps perm = foldr choice No $ zipWith matchIt [0..] cs+ where+ mps = buildMPatterns perm ps++ -- If liberal matching on literals fails or blocks we go with that.+ -- If it succeeds we use the result from conservative literal matching.+ -- This is to make sure that we split enough when literals are involved.+ -- For instance,+ -- f ('x' :: 'y' :: _) = ...+ -- f (c :: s) = ...+ -- would never split the tail of the list if we only used conservative+ -- literal matching.+ matchIt i c = matchClause yesMatchLit mps i c ++++ matchClause noMatchLit mps i c++ Yes _ +++ m = m+ No +++ _ = No+ Block x +++ _ = Block x+ -- | We use a special representation of the patterns we're trying to match -- against a clause. In particular we want to keep track of which variables -- are blocking a match.@@ -27,7 +70,7 @@ buildMPatterns :: Permutation -> [Arg Pattern] -> [Arg MPat] buildMPatterns perm ps = evalState (mapM (traverse build) ps) xs where- xs = permute (invertP perm) $ reverse [0 .. size perm - 1]+ xs = permute (invertP perm) $ downFrom (size perm) -- reverse [0 .. size perm - 1] tick = do x : xs <- get; put xs; return x build (VarP _) = VarMP <$> tick@@ -39,23 +82,44 @@ buildT (Var i []) = return (VarMP i) buildT _ = return WildMP + -- | If matching is inconclusive (@Block@) we want to know which--- variable is blocking the match.-data Match a = Yes a | No | Block Nat+-- variables are blocking the match.+data Match a+ = Yes a -- ^ Matches unconditionally.+ | No -- ^ Definitely does not match.+ | Block BlockingVars -- ^ Could match if non-empty list of blocking variables+ -- is instantiated properly. deriving (Functor) -instance Monoid a => Monoid (Match a) where- mempty = Yes mempty- Yes a `mappend` Yes b = Yes $ mappend a b- Yes _ `mappend` No = No- Yes _ `mappend` Block x = Block x- No `mappend` _ = No- Block x `mappend` _ = Block x+-- | @Nothing@ means there is an overlapping match for this variable.+-- @Just cons@ means that it is an non-overlapping match and+-- @cons@ are the encountered constructors.+type BlockingVar = (Nat, (Maybe [QName]))+type BlockingVars = [BlockingVar] +overlapping :: BlockingVars -> BlockingVars+overlapping = map $ \ (x, _) -> (x, Nothing)++-- | Left dominant merge of blocking vars.+zipBlockingVars :: BlockingVars -> BlockingVars -> BlockingVars+zipBlockingVars xs ys = map upd xs+ where+ upd (x, Just cons) | Just (Just cons') <- lookup x ys =+ (x, Just $ cons ++ cons')+ upd (x, _) = (x, Nothing)++-- | @choice m m'@ combines the match results @m@ of a function clause+-- with the (already combined) match results $m'$ of the later clauses.+-- It is for skipping clauses that definitely do not match ('No').+-- It is left-strict, to be used with @foldr@.+-- If one clause unconditionally matches ('Yes') we do not look further. choice :: Match a -> Match a -> Match a-choice (Yes a) _ = Yes a-choice (Block x) _ = Block x-choice No m = m+choice (Yes a) _ = Yes a+choice (Block x) (Block y) = Block (zipBlockingVars x y)+choice (Block x) (Yes _) = Block $ overlapping x+choice (Block x) No = Block x+choice No m = m type MatchLit = Literal -> MPat -> Match () @@ -67,47 +131,79 @@ yesMatchLit _ WildMP{} = Yes () yesMatchLit _ _ = No --- | Match the given patterns against a list of clauses-match :: [Clause] -> [Arg Pattern] -> Permutation -> Match Nat-match cs ps perm = foldr choice No $ zipWith matchIt [0..] cs- where- mps = buildMPatterns perm ps-- -- If liberal matching on literals fails or blocks we go with that.- -- If it succeeds we use the result from conservative literal matching.- -- This is to make sure that we split enough when literals are involved.- -- For instance,- -- f ('x' :: 'y' :: _) = ...- -- f (c :: s) = ...- -- would never split the tail of the list if we only used conservative- -- literal matching.- matchIt i c = matchClause yesMatchLit mps i c +++- matchClause noMatchLit mps i c-- Yes _ +++ m = m- No +++ _ = No- Block x +++ _ = Block x- -- | Check if a clause could match given generously chosen literals matchLits :: Clause -> [Arg Pattern] -> Permutation -> Bool-matchLits c ps perm = case matchClause yesMatchLit (buildMPatterns perm ps) 0 c of- Yes _ -> True- _ -> False+matchLits c ps perm =+ case matchClause yesMatchLit (buildMPatterns perm ps) 0 c of+ Yes _ -> True+ _ -> False +-- | @matchClause mlist qs i c@ checks whther clause @c@ number @i@+-- covers a split clause with patterns @qs@. matchClause :: MatchLit -> [Arg MPat] -> Nat -> Clause -> Match Nat matchClause mlit qs i c = fmap (const i) $ matchPats mlit (clausePats c) qs +-- | @matchPats mlist ps qs@ checks whether a function clause with patterns+-- @ps@ covers a split clause with patterns @qs@ matchPats :: MatchLit -> [Arg Pattern] -> [Arg MPat] -> Match () matchPats mlit ps qs = mconcat $ zipWith (matchPat mlit) (map unArg ps) (map unArg qs) +-- | Combine results of checking whether function clause patterns+-- covers split clause patterns.+--+-- 'No' is dominant: if one function clause pattern is disjoint to+-- the corresponding split clause pattern, then+-- the whole clauses are disjoint.+--+-- 'Yes' is neutral: for a match, all patterns have to match.+--+-- 'Block' accumulates variables of the split clause+-- that have to be instantiated+-- to make the split clause an instance of the function clause.+instance Monoid a => Monoid (Match a) where+ mempty = Yes mempty+ Yes a `mappend` Yes b = Yes $ mappend a b+ Yes _ `mappend` No = No+ Yes _ `mappend` Block x = Block x+ No `mappend` _ = No+ Block x `mappend` Yes b = Block x+ Block x `mappend` No = No+ Block x `mappend` Block y = Block $ mappend x y++-- | @matchPat mlit p q@ checks whether a function clause pattern @p@+-- covers a split clause pattern @q@. There are three results:+-- @Yes ()@ means it covers, because @p@ is a variable+-- pattern or @q@ is a wildcard.+-- @No@ means it does not cover.+-- @Block [x]@ means @p@ is a proper instance of @q@ and could become+-- a cover if @q@ was split on variable @x@. matchPat :: MatchLit -> Pattern -> MPat -> Match () matchPat _ (VarP _) _ = Yes () matchPat _ (DotP _) _ = Yes () matchPat mlit (LitP l) q = mlit l q+-- matchPat mlit (ConP c (Just _) ps) q | recordPattern ps = Yes () -- Andreas, 2012-07-25 record patterns always match! matchPat mlit (ConP c _ ps) q = case q of- VarMP x -> Block x+ VarMP x -> Block [(x, Just [c])] WildMP -> Yes () ConMP c' qs | c == c' -> matchPats mlit ps qs | otherwise -> No LitMP _ -> __IMPOSSIBLE__++{- UNUSED+class RecordPattern a where+ recordPattern :: a -> Bool++instance RecordPattern Pattern where+ recordPattern VarP{} = True+ recordPattern DotP{} = False+ recordPattern LitP{} = False+ recordPattern (ConP _ Nothing _) = False+ recordPattern (ConP _ (Just _) ps) = recordPattern ps++instance RecordPattern a => RecordPattern [a] where+ recordPattern = all recordPattern++instance RecordPattern a => RecordPattern (Arg a) where+ recordPattern = recordPattern . unArg+-}
+ src/full/Agda/TypeChecking/Coverage/SplitTree.hs view
@@ -0,0 +1,96 @@+{-# LANGUAGE CPP #-}++{-| Split tree for transforming pattern clauses into case trees.++The coverage checker generates a split tree from the clauses.+The clause compiler uses it to transform clauses to case trees.++The initial problem is a set of clauses. The root node designates+on which argument to split and has subtrees for all the constructors.+Splitting continues until there is only a single clause left at+each leaf of the split tree.++-}+module Agda.TypeChecking.Coverage.SplitTree where++import Data.Tree+import Test.QuickCheck++import Agda.Syntax.Common+import Agda.Syntax.Abstract.Name++import Agda.Utils.Monad+import Agda.Utils.Impossible+#include "../../undefined.h"++type SplitTree = SplitTree' QName+type SplitTrees = SplitTrees' QName++-- | Abstract case tree shape.+data SplitTree' a+ = -- | No more splits coming. We are at a single, all-variable+ -- clause.+ SplittingDone+ { splitBindings :: Int -- ^ The number of variables bound in the clause+ }+ | -- | A split is necessary.+ SplitAt+ { splitArg :: Int -- ^ Arg. no to split at.+ , splitTrees :: SplitTrees' a -- ^ Sub split trees.+ }+ deriving (Eq)++-- | Split tree branching. A finite map from constructor names to splittrees+-- A list representation seems appropriate, since we are expecting not+-- so many constructors per data type, and there is no need for+-- random access.+type SplitTrees' a = [(a, SplitTree' a)]++-- * Printing a split tree++data SplitTreeLabel a = SplitTreeLabel+ { lblConstructorName :: Maybe a -- ^ 'Nothing' for root of split tree+ , lblSplitArg :: Maybe Int+ , lblBindings :: Maybe Int+ }+instance Show a => Show (SplitTreeLabel a) where+ show (SplitTreeLabel Nothing Nothing (Just n)) = "done, " ++ show n ++ " bindings"+ show (SplitTreeLabel Nothing (Just n) Nothing) = "split at " ++ show n+ show (SplitTreeLabel (Just q) Nothing (Just n)) = show q ++ " -> done, " ++ show n ++ " bindings"+ show (SplitTreeLabel (Just q) (Just n) Nothing) = show q ++ " -> split at " ++ show n+ show _ = __IMPOSSIBLE__++-- | Convert a split tree into a 'Data.Tree' (for printing).+toTree :: SplitTree' a -> Tree (SplitTreeLabel a)+toTree t = case t of+ SplittingDone n -> Node (SplitTreeLabel Nothing Nothing (Just n)) []+ SplitAt n ts -> Node (SplitTreeLabel Nothing (Just n) Nothing) $ toTrees ts++toTrees :: SplitTrees' a -> Forest (SplitTreeLabel a)+toTrees = map (\ (c,t) -> setCons c $ toTree t)+ where+ setCons :: a -> Tree (SplitTreeLabel a) -> Tree (SplitTreeLabel a)+ setCons c (Node l ts) = Node (l { lblConstructorName = Just c }) ts++instance Show a => Show (SplitTree' a) where+ show = drawTree . fmap show . toTree++-- * Generating random split trees for testing++instance Arbitrary a => Arbitrary (SplitTree' a) where+ arbitrary = frequency+ [ (5, return $ SplittingDone 0)+ , (3, SplitAt <$> choose (1,5) <*> (take 3 <$> listOf1 arbitrary))+ ]++-- * Testing the printer++newtype CName = CName String+instance Show CName where+ show (CName s) = s++instance Arbitrary CName where+ arbitrary = CName <$> elements+ [ "zero", "suc", "nil", "cons", "left", "right", "just", "nothing" ]++testSplitTreePrinting = sample (arbitrary :: Gen (SplitTree' CName))
src/full/Agda/TypeChecking/Datatypes.hs view
@@ -2,6 +2,7 @@ module Agda.TypeChecking.Datatypes where +import Control.Applicative ((<$>)) import Data.List import Agda.Syntax.Common@@ -11,8 +12,8 @@ import Agda.TypeChecking.Telescope import Agda.TypeChecking.Substitute +import Agda.Utils.Size import Agda.Utils.Impossible- #include "../undefined.h" -- | Get the name of the datatype constructed by a given constructor.@@ -24,6 +25,30 @@ Constructor{conData = d} -> return d _ -> __IMPOSSIBLE__ ++-- | Return the number of non-parameter arguments to a data constructor,+-- or the field names of a record constructor.+--+-- For getting just the arity of constructor @c@,+-- use @either id size <$> getConstructorArity c@.+getConstructorArity :: QName -> TCM (Either Nat [Arg QName])+getConstructorArity c = do+ Defn{ defType = t, theDef = def } <- getConstInfo c+ case def of+ Constructor{ conData = d, conPars = n } -> do+ def <- theDef <$> getConstInfo d+ case def of+ Record{ recFields = fs } ->+ return $ Right fs+ Datatype{} -> do+ -- TODO: I do not want to take the type of constructor apart+ -- to see its arity!+ TelV tel _ <- telView t+ return $ Left $ size tel - n+ _ -> __IMPOSSIBLE__+ _ -> __IMPOSSIBLE__++ -- | Check if a name refers to a datatype or a record with a named constructor. isDatatype :: QName -> TCM Bool isDatatype d = do@@ -33,15 +58,32 @@ Record{recNamedCon = namedC} -> return namedC _ -> return False +data DataOrRecord = IsData | IsRecord+ deriving (Eq, Ord, Show)+ -- | Check if a name refers to a datatype or a record.-isDataOrRecordType :: QName -> TCM Bool+isDataOrRecordType :: QName -> TCM (Maybe DataOrRecord) isDataOrRecordType d = do def <- getConstInfo d case theDef def of- Datatype{} -> return True- Record{} -> return True- _ -> return False+ Datatype{} -> return $ Just IsData+ Record{} -> return $ Just IsRecord+ _ -> return $ Nothing +isDataOrRecord :: Term -> TCM (Maybe QName)+isDataOrRecord (Def d _) = fmap (const d) <$> isDataOrRecordType d+isDataOrRecord (Shared p) = isDataOrRecord (derefPtr p)+isDataOrRecord _ = return Nothing++getNumberOfParameters :: QName -> TCM (Maybe Nat)+getNumberOfParameters d = do+ def <- getConstInfo d+ case theDef def of+ Datatype{ dataPars = n} -> return $ Just n+ Record{ recPars = n} -> return $ Just n+ _ -> return Nothing++{- UNUSED data DatatypeInfo = DataInfo { datatypeName :: QName , datatypeParTel :: Telescope@@ -80,3 +122,4 @@ , datatypeIxs = is } _ -> return Nothing+-}
src/full/Agda/TypeChecking/DisplayForm.hs view
@@ -5,12 +5,14 @@ import Control.Applicative import Control.Monad import Control.Monad.Error+import Data.Traversable hiding (mapM) import Agda.Syntax.Common import Agda.Syntax.Internal import Agda.TypeChecking.Monad import Agda.TypeChecking.Substitute import Agda.TypeChecking.Reduce+import Agda.TypeChecking.Level import Agda.Syntax.Scope.Base import Agda.Utils.Size @@ -28,16 +30,19 @@ xs <- mapM tryOpen odfs return [ df | Just df <- xs ] scope <- getScope- let matches dfs vs = [ m | Just m <- map (flip matchDisplayForm vs) dfs, inScope scope m ]+ ms <- do+ ms <- mapM (flip matchDisplayForm vs) dfs+ return [ m | Just m <- ms, inScope scope m ] -- Not safe when printing non-terminating terms. -- (nfdfs, us) <- normalise (dfs, vs) unless (null odfs) $ reportSLn "tc.display.top" 100 $ unlines- [ "displayForms: " ++ show dfs+ [ "name : " ++ show c+ , "displayForms: " ++ show dfs , "arguments : " ++ show vs- , "matches : " ++ show (matches dfs vs)- , "result : " ++ show (foldr (const . Just) Nothing $ matches dfs vs)+ , "matches : " ++ show ms+ , "result : " ++ show (foldr (const . Just) Nothing ms) ]- return $ foldr (const . Just) Nothing $ matches dfs vs -- ++ matches nfdfs us+ return $ foldr (const . Just) Nothing ms `catchError` \_ -> return Nothing where inScope _ _ = True -- TODO: distinguish between with display forms and other display forms@@ -46,35 +51,49 @@ -- Nothing -> __IMPOSSIBLE__ -- TODO: currently all display forms have heads hd (DTerm (Def x _)) = Just x hd (DTerm (Con x _)) = Just x+ hd (DTerm (Shared p)) = hd (DTerm $ derefPtr p) hd (DWithApp (d : _) _) = hd d hd _ = Nothing -matchDisplayForm :: DisplayForm -> Args -> Maybe DisplayTerm+matchDisplayForm :: DisplayForm -> Args -> TCM (Maybe DisplayTerm) matchDisplayForm (Display n ps v) vs- | length ps > length vs = Nothing+ | length ps > length vs = return Nothing | otherwise = do- us <- match n ps $ raise 1 (map unArg vs0)- return $ substs (reverse us ++ ctx) v `apply` vs1+ mus <- match n ps $ raise 1 (map unArg vs0)+ return $ fmap (\us -> applySubst (parallelS (reverse us)) v `apply` vs1) mus where- -- TODO: figure out the length of the context- ctx = [ Var i [] | i <- [0..] ] (vs0, vs1) = splitAt (length ps) vs class Match a where- match :: Nat -> a -> a -> Maybe [Term]+ match :: Nat -> a -> a -> TCM (Maybe [Term]) instance Match a => Match [a] where- match n xs ys = concat <$> zipWithM (match n) xs ys+ match n xs ys = fmap concat . traverse id <$> zipWithM (match n) xs ys instance Match a => Match (Arg a) where match n p v = match n (unArg p) (unArg v) instance Match Term where- match n p v = case (p, v) of- (Var 0 [], v) -> return [subst __IMPOSSIBLE__ v]+ match n p v = case (ignoreSharing p, ignoreSharing v) of+ (Var 0 [], v) -> return $ Just [subst __IMPOSSIBLE__ v] (Var i ps, Var j vs) | i == j -> match n ps vs (Def c ps, Def d vs) | c == d -> match n ps vs (Con c ps, Con d vs) | c == d -> match n ps vs- (Lit l, Lit l') | l == l' -> return []- (p, v) | p == v -> return []- _ -> fail ""+ (Lit l, Lit l') | l == l' -> return $ Just []+ (p, v) | p == v -> return $ Just []+ (p, Level l) -> match n p =<< reallyUnLevelView l+ (Sort ps, Sort pv) -> match n ps pv+ (p, Sort (Type v)) -> match n p =<< reallyUnLevelView v+ _ -> return Nothing++instance Match Sort where+ match n p v = case (p, v) of+ (Type pl, Type vl) -> match n pl vl+ _ | p == v -> return $ Just []+ _ -> return Nothing++instance Match Level where+ match n p v = do+ p <- reallyUnLevelView p+ v <- reallyUnLevelView v+ match n p v
+ src/full/Agda/TypeChecking/DropArgs.hs view
@@ -0,0 +1,79 @@+{-# LANGUAGE CPP, PatternGuards, TypeSynonymInstances, FlexibleInstances #-}+module Agda.TypeChecking.DropArgs where++import Agda.Syntax.Internal+import Agda.Syntax.Position++import Agda.TypeChecking.Monad+import Agda.TypeChecking.Substitute++import Agda.TypeChecking.CompiledClause+-- import Agda.TypeChecking.CompiledClause.Compile++import Agda.Utils.Permutation+++#include "../undefined.h"+import Agda.Utils.Impossible++---------------------------------------------------------------------------+-- * Dropping initial arguments to create a projection-like function+---------------------------------------------------------------------------++-- | When making a function projection-like, we drop the first @n@+-- arguments.+class DropArgs a where+ dropArgs :: Int -> a -> a++-- | NOTE: This creates telescopes with unbound de Bruijn indices.+instance DropArgs Telescope where+ dropArgs n tel = telFromList $ drop n $ telToList tel++instance DropArgs Permutation where+ dropArgs n (Perm m p) = Perm (m - n) $ map (subtract n) $ drop n p++-- | NOTE: does not go into the body, so does not work for recursive functions.+instance DropArgs ClauseBody where+ dropArgs 0 b = b+ dropArgs _ NoBody = NoBody+ dropArgs n (Bind b) = dropArgs (n - 1) (absBody b)+ dropArgs n Body{} = __IMPOSSIBLE__++-- | NOTE: does not work for recursive functions.+instance DropArgs Clause where+ dropArgs n cl =+ cl{ clausePerm = dropArgs n $ clausePerm cl+ , clauseTel = dropArgs n $ clauseTel cl+ -- Andreas, 2012-09-25: just dropping the front of telescope+ -- makes it ill-formed (unbound indices)+ -- we should let the telescope intact!?+ , clausePats = drop n $ clausePats cl+ , clauseBody = dropArgs n $ clauseBody cl -- BUG: need to drop also from recursive calls!!+ }++instance DropArgs FunctionInverse where+ dropArgs n finv = fmap (dropArgs n) finv++{- UNUSED, but don't remove (Andreas, 2012-10-08)+-- | Use for dropping initial lambdas in compiled clause bodies.+-- NOTE: does not reduce term, need lambdas to be present.+instance DropArgs Term where+ dropArgs 0 v = v+ dropArgs n v = case ignoreSharing v of+ Lam h b -> dropArgs (n - 1) (absBody b)+ _ -> __IMPOSSIBLE__+-}++-- | To drop the first @n@ arguments in a compiled clause,+-- we reduce the split argument indices by @n@ and+-- drop @n@ arguments from the bodies.+-- NOTE: this only works for non-recursive functions, we+-- are not dropping arguments to recursive calls in bodies.+instance DropArgs CompiledClauses where+ dropArgs n cc = case cc of+ Case i br | i < n -> __IMPOSSIBLE__+ | otherwise -> Case (i - n) $ fmap (dropArgs n) br+ Done xs t | length xs < n -> __IMPOSSIBLE__+ | otherwise -> Done (drop n xs) t+ Fail -> Fail+
src/full/Agda/TypeChecking/Eliminators.hs view
@@ -11,14 +11,17 @@ import Agda.TypeChecking.Substitute import Agda.Utils.Impossible import Agda.TypeChecking.Reduce+import Agda.TypeChecking.Level #include "../undefined.h" -data ElimView = VarElim Nat [Elim]- | DefElim QName [Elim]- | ConElim QName [Elim]- | MetaElim MetaId [Elim]- | NoElim Term+data ElimView+ = VarElim Nat [Elim]+ | DefElim QName [Elim]+ | ConElim QName [Elim]+ | MetaElim MetaId [Elim]+ | NoElim Term+ deriving (Show) elimView :: Term -> TCM ElimView elimView v = do@@ -26,7 +29,12 @@ -- since reducing a stuck application doesn't necessarily reduces all -- the arguments. v <- reduce v- case v of+ -- domi 2012-7-24: Add unLevel to handle neutral levels. The problem is that reduce turns+ -- suc (neutral) into Level (Max [Plus 1 (NeutralLevel neutral)]) which the below pattern+ -- match does not handle.+ v <- unLevel v+ reportSLn "tc.conv.elim" 50 $ "v = " ++ show v+ case ignoreSharing v of Def f vs -> do proj <- isProjection f case proj of@@ -46,6 +54,7 @@ Sort{} -> noElim Pi{} -> noElim DontCare{} -> noElim+ Shared p -> __IMPOSSIBLE__ where noElim = return $ NoElim v app f vs = return $ f $ map Apply vs@@ -56,6 +65,7 @@ elim es2 (ConElim x es1) = ConElim x (es1 ++ es2) elim es2 (MetaElim x es1) = MetaElim x (es1 ++ es2) +{- UNUSED -- | Only used when producing error messages. unElimView :: ElimView -> Term unElimView v = case v of@@ -69,3 +79,4 @@ unElim v [] = v unElim v (Apply u : es) = unElim (v `apply` [u]) es unElim v (Proj f : es) = unElim (Def f [Arg NotHidden Relevant v]) es+-}
src/full/Agda/TypeChecking/Empty.hs view
@@ -2,9 +2,11 @@ module Agda.TypeChecking.Empty where import Control.Applicative+import Control.Monad import Agda.Syntax.Common import Agda.Syntax.Internal+import Agda.Syntax.Position import Agda.TypeChecking.Monad import Agda.TypeChecking.Coverage@@ -15,31 +17,40 @@ import Agda.Utils.Permutation import Agda.Utils.Size +{- UNUSED -- | Make sure that a type is empty.-isReallyEmptyType :: Type -> TCM ()-isReallyEmptyType t = noConstraints $ isEmptyType t+isReallyEmptyType :: Range -> Type -> TCM ()+isReallyEmptyType r t = noConstraints $ isEmptyType r t+-} -isEmptyType :: Type -> TCM ()-isEmptyType t = do+-- | Check whether a type is empty. Maybe postponed as emptyness constraint.+isEmptyType :: Range -> Type -> TCM ()+isEmptyType r t = do tb <- reduceB t let t = ignoreBlocking tb- case unEl <$> tb of+ postpone = addConstraint (IsEmpty r t)+ case ignoreSharing . unEl <$> tb of -- if t is blocked or a meta, we cannot decide emptyness now. postpone- NotBlocked MetaV{} -> addConstraint (IsEmpty t)- Blocked{} -> addConstraint (IsEmpty t)+ NotBlocked MetaV{} -> postpone+ Blocked{} -> postpone _ -> do -- from the current context xs:ts, create a pattern list -- xs _ : ts t and try to split on _ (the last variable) tel0 <- getContextTelescope- let gamma = telToList tel0 ++ [defaultArg ("_", t)]- ps = [ Arg h r $ VarP x | Arg h r (x, _) <- gamma ]+ let gamma = telToList tel0 ++ [domFromArg $ defaultArg ("_", t)]+ ps = [ Arg h r $ VarP x | Dom h r (x, _) <- gamma ] tel = telFromList gamma - r <- split Inductive tel (idP $ size tel) ps 0+ dontAssignMetas $ do+ r <- splitLast Inductive tel ps case r of Left err -> case err of- CantSplit c tel us vs _ -> traceCall (CheckIsEmpty t) $ typeError $ CoverageCantSplitOn c tel us vs+ CantSplit c tel us vs _ -> postpone+ -- Andreas, 2012-03-15: allow postponement of emptyness check+ -- OLD CODE: traceCall (CheckIsEmpty t) $ typeError $ CoverageCantSplitOn c tel us vs _ -> typeError $ ShouldBeEmpty t []- Right [] -> return ()- Right cs -> typeError $ ShouldBeEmpty t $ map (unArg . last . scPats) cs+ Right cov -> do+ let cs = splitClauses cov+ unless (null cs) $+ typeError $ ShouldBeEmpty t $ map (unArg . last . scPats) $ cs
src/full/Agda/TypeChecking/Empty.hs-boot view
@@ -3,6 +3,7 @@ import Agda.TypeChecking.Monad (TCM) import Agda.Syntax.Internal (Type)+import Agda.Syntax.Position (Range) -isReallyEmptyType :: Type -> TCM ()-isEmptyType :: Type -> TCM ()+-- isReallyEmptyType :: Type -> TCM ()+isEmptyType :: Range -> Type -> TCM ()
src/full/Agda/TypeChecking/Errors.hs view
@@ -3,12 +3,17 @@ ( prettyError , PrettyTCM(..) , tcErrString+ , Warnings(..)+ , warningsToError ) where import Control.Applicative ( (<$>) ) import Control.Monad.State import Control.Monad.Error++import Data.List (nub) import qualified Data.Map as Map (empty)+ import System.FilePath import Agda.Syntax.Common@@ -24,8 +29,10 @@ import Agda.Syntax.Translation.InternalToAbstract import Agda.Syntax.Translation.AbstractToConcrete import Agda.Syntax.Scope.Base (ScopeInfo(..))--import Agda.TypeChecking.Monad+import Agda.Syntax.Scope.Monad (isDatatypeModule)+import Agda.TypeChecking.Monad.Base+import Agda.TypeChecking.Monad.Context+import Agda.TypeChecking.Monad.Options import Agda.TypeChecking.Pretty import Agda.Utils.FileName@@ -50,6 +57,34 @@ $$ vcat (map (text . tcErrString) [err,err',err'',err''']) ---------------------------------------------------------------------------+-- * Warnings+---------------------------------------------------------------------------++-- | Warnings.+--+-- Invariant: The fields are never empty at the same time.++data Warnings = Warnings+ { terminationProblems :: [TerminationError]+ -- ^ Termination checking problems are not reported if+ -- 'optTerminationCheck' is 'False'.+ , unsolvedMetaVariables :: [Range]+ -- ^ Meta-variable problems are reported as type errors unless+ -- 'optAllowUnsolved' is 'True'.+ , unsolvedConstraints :: Constraints+ -- ^ Same as 'unsolvedMetaVariables'.+ }++-- | Turns warnings into an error. Even if several errors are possible+-- only one is raised.++warningsToError :: Warnings -> TypeError+warningsToError (Warnings [] [] []) = __IMPOSSIBLE__+warningsToError (Warnings _ w@(_:_) _) = UnsolvedMetas w+warningsToError (Warnings _ _ w@(_:_)) = UnsolvedConstraints w+warningsToError (Warnings w@(_:_) _ _) = TerminationCheckFailed w++--------------------------------------------------------------------------- -- * Helpers --------------------------------------------------------------------------- @@ -70,7 +105,7 @@ r = nameBindingSite $ qnameName q tcErrString :: TCErr -> String-tcErrString err = show (getRange err) ++ " " ++ case errError err of+tcErrString err = show (getRange err) ++ " " ++ case err of TypeError _ cl -> errorString $ clValue cl Exception r s -> show r ++ " " ++ s IOException r e -> show r ++ " " ++ show e@@ -83,6 +118,7 @@ AmbiguousName{} -> "AmbiguousName" AmbiguousParseForApplication{} -> "AmbiguousParseForApplication" AmbiguousParseForLHS{} -> "AmbiguousParseForLHS"+-- AmbiguousParseForPatternSynonym{} -> "AmbiguousParseForPatternSynonym" AmbiguousTopLevelModuleName {} -> "AmbiguousTopLevelModuleName" BothWithAndRHS -> "BothWithAndRHS" BuiltinInParameterisedModule{} -> "BuiltinInParameterisedModule"@@ -100,6 +136,7 @@ CoverageCantSplitType{} -> "CoverageCantSplitType" CyclicModuleDependency{} -> "CyclicModuleDependency" DataMustEndInSort{} -> "DataMustEndInSort"+-- UNUSED: DataTooManyParameters{} -> "DataTooManyParameters" DifferentArities -> "DifferentArities" DoesNotConstructAnElementOf{} -> "DoesNotConstructAnElementOf" DuplicateBuiltinBinding{} -> "DuplicateBuiltinBinding"@@ -109,11 +146,12 @@ FieldOutsideRecord -> "FieldOutsideRecord" FileNotFound{} -> "FileNotFound" GenericError{} -> "GenericError"+ GenericDocError{} -> "GenericDocError" IFSNoCandidateInScope{} -> "IFSNoCandidateInScope" IlltypedPattern{} -> "IlltypedPattern" IncompletePatternMatching{} -> "IncompletePatternMatching"- IndexFreeInParameter{} -> "IndexFreeInParameter" IndexVariablesNotDistinct{} -> "IndexVariablesNotDistinct"+ IndicesFreeInParameters{} -> "IndicesFreeInParameters" IndicesNotConstructorApplications{} -> "IndicesNotConstructorApplications" InternalError{} -> "InternalError" InvalidPattern{} -> "InvalidPattern"@@ -124,9 +162,11 @@ ModuleDefinedInOtherFile {} -> "ModuleDefinedInOtherFile" ModuleDoesntExport{} -> "ModuleDoesntExport" ModuleNameDoesntMatchFileName {} -> "ModuleNameDoesntMatchFileName"+ NeedOptionCopatterns{} -> "NeedOptionCopatterns" NoBindingForBuiltin{} -> "NoBindingForBuiltin" NoParseForApplication{} -> "NoParseForApplication" NoParseForLHS{} -> "NoParseForLHS"+-- NoParseForPatternSynonym{} -> "NoParseForPatternSynonym" NoRHSRequiresAbsurdPattern{} -> "NoRHSRequiresAbsurdPattern" NotInductive {} -> "NotInductive" AbsurdPatternRequiresNoRHS{} -> "AbsurdPatternRequiresNoRHS"@@ -135,6 +175,7 @@ NoSuchPrimitiveFunction{} -> "NoSuchPrimitiveFunction" NotAModuleExpr{} -> "NotAModuleExpr" NotAProperTerm -> "NotAProperTerm"+ SetOmegaNotValidType -> "SetOmegaNotValidType" NotAValidLetBinding{} -> "NotAValidLetBinding" NotAnExpression{} -> "NotAnExpression" NotImplemented{} -> "NotImplemented"@@ -146,10 +187,12 @@ NothingAppliedToInstanceArg{} -> "NothingAppliedToInstanceArg" OverlappingProjects {} -> "OverlappingProjects" PatternShadowsConstructor {} -> "PatternShadowsConstructor"+ PatternSynonymArityMismatch {} -> "PatternSynonymArityMismatch" PropMustBeSingleton -> "PropMustBeSingleton" RepeatedVariablesInPattern{} -> "RepeatedVariablesInPattern" SafeFlagPostulate{} -> "SafeFlagPostulate" SafeFlagPragma{} -> "SafeFlagPragma"+ SafeFlagNoTerminationCheck{} -> "SafeFlagNoTerminationCheck" SafeFlagPrimTrustMe{} -> "SafeFlagPrimTrustMe" ShadowedModule{} -> "ShadowedModule" ShouldBeASort{} -> "ShouldBeASort"@@ -158,6 +201,7 @@ ShouldBeEmpty{} -> "ShouldBeEmpty" ShouldBePi{} -> "ShouldBePi" ShouldBeRecordType{} -> "ShouldBeRecordType"+ ShouldBeRecordPattern{} -> "ShouldBeRecordPattern" ShouldEndInApplicationOfTheDatatype{} -> "ShouldEndInApplicationOfTheDatatype" TerminationCheckFailed{} -> "TerminationCheckFailed" TooFewFields{} -> "TooFewFields"@@ -166,6 +210,7 @@ SplitOnIrrelevant{} -> "SplitOnIrrelevant" DefinitionIsIrrelevant{} -> "DefinitionIsIrrelevant" VariableIsIrrelevant{} -> "VariableIsIrrelevant"+ UnequalBecauseOfUniverseConflict{} -> "UnequalBecauseOfUniverseConflict" UnequalRelevance{} -> "UnequalRelevance" UnequalHiding{} -> "UnequalHiding" UnequalLevel{} -> "UnequalLevel"@@ -180,6 +225,7 @@ UnreachableClauses{} -> "UnreachableClauses" UnsolvedConstraints{} -> "UnsolvedConstraints" UnsolvedMetas{} -> "UnsolvedMetas"+ UnusedVariableInPatternSynonym -> "UnusedVariableInPatternSynonym" WithClausePatternMismatch{} -> "WithClausePatternMismatch" WrongHidingInApplication{} -> "WrongHidingInApplication" WrongHidingInLHS{} -> "WrongHidingInLHS"@@ -188,13 +234,10 @@ WrongNumberOfConstructorArguments{} -> "WrongNumberOfConstructorArguments" instance PrettyTCM TCErr where- prettyTCM err = case errError err of- TypeError s e -> do- s0 <- get+ prettyTCM err = case err of+ TypeError s e -> localState $ do put s- d <- sayWhen (envRange $ clEnv e) (envCall $ clEnv e) $ prettyTCM e- put s0- return d+ sayWhen (envRange $ clEnv e) (envCall $ clEnv e) $ prettyTCM e Exception r s -> sayWhere r $ fwords s IOException r e -> sayWhere r $ fwords $ show e PatternErr _ -> sayWhere err $ panic "uncaught pattern violation"@@ -208,6 +251,7 @@ NotSupported s -> fwords $ "Not supported: " ++ s CompilationError s -> sep [fwords "Compilation error:", text s] GenericError s -> fwords s+ GenericDocError d -> return d TerminationCheckFailed because -> fwords "Termination checking failed for the following functions:" $$ (nest 2 $@@ -219,12 +263,15 @@ case show (callInfoRange c) of "" -> call r -> call $$ nest 2 (text "(at" <+> text r <> text ")"))- (concatMap termErrCalls because))+ (nub $ concatMap termErrCalls because)) PropMustBeSingleton -> fwords "Datatypes in Prop must have at most one constructor when proof irrelevance is enabled" DataMustEndInSort t -> fsep $ pwords "The type of a datatype must end in a sort." ++ [prettyTCM t] ++ pwords "isn't a sort."+{- UNUSED:+ DataTooManyParameters -> fsep $ pwords "Too many parameters given to data type."+-} ShouldEndInApplicationOfTheDatatype t -> fsep $ pwords "The target of a constructor must be the datatype applied to its parameters," ++ [prettyTCM t] ++ pwords "isn't"@@ -236,6 +283,8 @@ pwords "which is not the right datatype" ShouldBeRecordType t -> fsep $ pwords "Expected record type, found " ++ [prettyTCM t]+ ShouldBeRecordPattern p -> fsep $+ pwords "Expected record pattern" -- ", found " ++ [prettyTCM p] DifferentArities -> fwords "The number of arguments in the defining equations differ" WrongHidingInLHS t -> do@@ -252,7 +301,7 @@ pwords "Failed to infer the value of dotted pattern" IlltypedPattern p a -> fsep $ pwords "Type mismatch"- TooManyArgumentsInLHS n a -> fsep $+ TooManyArgumentsInLHS a -> fsep $ pwords "Left hand side gives too many arguments to a function of type" ++ [prettyTCM a] WrongNumberOfConstructorArguments c expect given -> fsep $ pwords "The constructor" ++ [prettyTCM c] ++ pwords "expects" ++@@ -263,21 +312,33 @@ ConstructorPatternInWrongDatatype c d -> fsep $ [prettyTCM c] ++ pwords "is not a constructor of the datatype" ++ [prettyTCM d] IndicesNotConstructorApplications is ->- fsep (pwords "The following indices are not constructors" ++- pwords "(or literals) applied to variables:")+ fwords "The indices" $$ nest 2 (vcat $ map prettyTCM is)- IndexVariablesNotDistinct is ->- fsep (pwords "The variables in the following indices are not distinct:")+ $$ fsep (pwords "are not constructors (or literals) applied to variables" +++ pwords "(note that parameters count as constructor arguments)")+ IndexVariablesNotDistinct vs is ->+ fwords "The variables"+ $$ nest 2 (vcat $ map (\v -> prettyTCM (I.Var v [])) vs)+ $$ fwords "in the indices" $$ nest 2 (vcat $ map prettyTCM is)- IndexFreeInParameter i pars ->- fsep (pwords "The index" ++ [prettyTCM (I.Var i [])] ++- pwords "is free in the following parameters:")+ $$ fwords "are not distinct (note that parameters count as constructor arguments)"+ IndicesFreeInParameters vs indices pars ->+ fwords "The variables"+ $$ nest 2 (vcat $ map (\v -> prettyTCM (I.Var v [])) vs)+ $$ fwords "which are used (perhaps as constructor parameters) in the index expressions"+ $$ nest 2 (vcat $ map prettyTCM indices)+ $$ fwords "are free in the parameters" $$ nest 2 (vcat $ map prettyTCM pars)- ShadowedModule [] -> __IMPOSSIBLE__- ShadowedModule ms@(m : _) -> fsep $- pwords "Duplicate definition of module" ++ [prettyTCM m <> text "."] ++- pwords "Previous definition at" ++ [text $ show r]+ ShadowedModule x [] -> __IMPOSSIBLE__+ ShadowedModule x ms@(m : _) -> fsep $+ pwords "Duplicate definition of module" ++ [prettyTCM x <> text "."] +++ pwords "Previous definition of" ++ [help m] ++ pwords "module" ++ [prettyTCM x] +++ pwords "at" ++ [text $ show r] where+ help m = do+ b <- isDatatypeModule m+ if b then text "datatype" else empty+ r = case [ r | r <- map (defSiteOfLast . mnameToList) ms , r /= noRange ] of [] -> noRange@@ -304,6 +365,8 @@ [prettyTCM t] ++ pwords "should be a function type, but it isn't" NotAProperTerm -> fwords "Found a malformed term"+ SetOmegaNotValidType ->+ fwords "Setω is not a valid type" SplitOnIrrelevant p t -> fsep $ pwords "Cannot pattern match" ++ [prettyA p] ++ pwords "against irrelevant type" ++ [prettyTCM t]@@ -311,40 +374,30 @@ text "Identifier" : prettyTCM x : pwords "is declared irrelevant, so it cannot be used here" VariableIsIrrelevant x -> fsep $ text "Variable" : prettyTCM x : pwords "is declared irrelevant, so it cannot be used here"+ UnequalBecauseOfUniverseConflict cmp s t -> fsep $+ [prettyTCM s, notCmp cmp, prettyTCM t, text "because this would result in an invalid use of Setω" ] UnequalTerms cmp s t a -> fsep $- [prettyTCM s, f cmp, prettyTCM t] ++ pwords "of type" ++ [prettyTCM a]- where- f CmpEq = text "!="- f CmpLeq = text "!=<"+ [prettyTCM s, notCmp cmp, prettyTCM t] ++ pwords "of type" ++ [prettyTCM a] UnequalLevel cmp s t -> fsep $- [prettyTCM s, f cmp, prettyTCM t]- where- f CmpEq = text "!="- f CmpLeq = text "!=<"+ [prettyTCM s, notCmp cmp, prettyTCM t] UnequalTelescopes cmp a b -> fsep $- [prettyTCM a, f cmp, prettyTCM b]- where- f CmpEq = text "!="- f CmpLeq = text "!=<"+ [prettyTCM a, notCmp cmp, prettyTCM b] UnequalTypes cmp a b -> fsep $- [prettyTCM a, f cmp, prettyTCM b]- where- f CmpEq = text "!="- f CmpLeq = text "!=<"+ [prettyTCM a, notCmp cmp, prettyTCM b] HeterogeneousEquality u a v b -> fsep $ pwords "Refuse to solve heterogeneous constraint" ++ [prettyTCM u] ++ pwords ":" ++ [prettyTCM a] ++ pwords "=?=" ++ [prettyTCM v] ++ pwords ":" ++ [prettyTCM b]- UnequalRelevance a b -> fsep $- [prettyTCM a] ++ pwords "!=" ++ [prettyTCM b] +++ UnequalRelevance cmp a b -> fsep $+ [prettyTCM a, notCmp cmp, prettyTCM b] ++ -- Andreas 2010-09-21 to reveal Forced annotations, print also uglily--- [text $ show a] ++ pwords "!=" ++ [text $ show b] +++-- [text $ show a, notCmp cmp, text $ show b] ++ pwords "because one is a relevant function type and the other is an irrelevant function type" UnequalHiding a b -> fsep $- [prettyTCM a] ++ pwords "!=" ++ [prettyTCM b] +++ [prettyTCM a, text "!=", prettyTCM b] ++ pwords "because one is an implicit function type and the other is an explicit function type" UnequalSorts s1 s2 -> fsep $- [prettyTCM s1] ++ pwords "!=" ++ [prettyTCM s2]+ [prettyTCM s1, text "!=", prettyTCM s2] NotLeqSort s1 s2 -> fsep $ pwords "The type of the constructor does not fit in the sort of the datatype, since" ++ [prettyTCM s1] ++ pwords "is not less or equal than" ++ [prettyTCM s2]@@ -460,8 +513,13 @@ AmbiguousModule x ys -> vcat [ fsep $ pwords "Ambiguous module name" ++ [pretty x <> text "."] ++ pwords "It could refer to any one of"- , nest 2 $ vcat $ map prettyTCM ys+ , nest 2 $ vcat $ map help ys ]+ where+ help :: ModuleName -> TCM Doc+ help m = do+ b <- isDatatypeModule m+ sep [prettyTCM m, if b then text "(datatype module)" else empty] UninstantiatedModule x -> fsep ( pwords "Cannot access the contents of the parameterised module" ++ [pretty x <> text "."] ++ pwords "To do this the module first has to be instantiated. For instance:"@@ -509,12 +567,28 @@ pwords "Don't know how to parse" ++ [pretty (C.RawApp noRange es) <> text "."] ++ pwords "Could mean any one of:" ) $$ nest 2 (vcat $ map pretty es')- NoParseForLHS p -> fsep $+ UnusedVariableInPatternSynonym -> fsep $+ pwords "Unused variable in pattern synonym."+ PatternSynonymArityMismatch x -> fsep $+ pwords "Arity mismatch when using pattern synonym" ++ [prettyTCM x]+ NoParseForLHS IsLHS p -> fsep $ pwords "Could not parse the left-hand side" ++ [pretty p]- AmbiguousParseForLHS p ps -> fsep (+ NoParseForLHS IsPatSyn p -> fsep $+ pwords "Could not parse the pattern synonym" ++ [pretty p]+{- UNUSED+ NoParseForPatternSynonym p -> fsep $+ pwords "Could not parse the pattern synonym" ++ [pretty p]+-}+ AmbiguousParseForLHS lhsOrPatSyn p ps -> fsep ( pwords "Don't know how to parse" ++ [pretty p <> text "."] ++ pwords "Could mean any one of:" ) $$ nest 2 (vcat $ map pretty ps)+{- UNUSED+ AmbiguousParseForPatternSynonym p ps -> fsep (+ pwords "Don't know how to parse" ++ [pretty p <> text "."] +++ pwords "Could mean any one of:"+ ) $$ nest 2 (vcat $ map pretty ps)+-} IncompletePatternMatching v args -> fsep $ pwords "Incomplete pattern matching for" ++ [prettyTCM v <> text "."] ++ pwords "No match for" ++ map prettyTCM args@@ -585,21 +659,27 @@ | otherwise = "s" in fsep $ [fwords ("Cannot set OPTION pragma" ++ plural)] ++ map text xs ++ [fwords "with safe flag."]+ SafeFlagNoTerminationCheck -> fsep (pwords "Cannot use NO_TERMINATION_CHECK pragma with safe flag.") SafeFlagPrimTrustMe -> fsep (pwords "Cannot use primTrustMe with safe flag")+ NeedOptionCopatterns -> fsep (pwords "Option --copatterns needed to enable destructor patterns") where mpar n args | n > 0 && not (null args) = parens | otherwise = id + showArg :: Arg I.Pattern -> TCM Doc showArg (Arg Hidden r x) = braces $ showPat 0 x showArg (Arg Instance r x) = dbraces $ showPat 0 x showArg (Arg NotHidden r x) = showPat 1 x + showPat :: Integer -> I.Pattern -> TCM Doc showPat _ (I.VarP _) = text "_" showPat _ (I.DotP _) = text "._" showPat n (I.ConP c _ args) = mpar n args $ prettyTCM c <+> fsep (map showArg args) showPat _ (I.LitP l) = text (show l) +notCmp :: Comparison -> TCM Doc+notCmp cmp = text $ "!" ++ show cmp instance PrettyTCM Call where@@ -653,7 +733,7 @@ fsep $ pwords "when inferring the type of" ++ [prettyTCM x] InferDef _ x _ -> fsep $ pwords "when inferring the type of" ++ [prettyTCM x]- CheckIsEmpty t _ ->+ CheckIsEmpty r t _ -> fsep $ pwords "when checking that" ++ [prettyTCM t] ++ pwords "has no constructors" ScopeCheckExpr e _ -> fsep $ pwords "when scope checking" ++ [pretty e]@@ -663,8 +743,7 @@ ScopeCheckLHS x p _ -> fsep $ pwords "when scope checking the left-hand side" ++ [pretty p] ++ pwords "in the definition of" ++ [pretty x]- TermFunDef _ f _ _ ->- fsep $ pwords "when termination checking the definition of" ++ [prettyTCM f]+ NoHighlighting _ -> empty SetRange r _ -> fsep $ pwords "when doing something at" ++ [text $ show r] CheckSectionApplication _ m1 modapp _ -> fsep $@@ -676,6 +755,4 @@ where hPretty a = pretty =<< abstractToConcreteCtx (hiddenArgumentCtx (argHiding a)) a - simpleDecl d = d'- where [d'] = D.notSoNiceDeclarations [d]-+ simpleDecl = D.notSoNiceDeclaration
+ src/full/Agda/TypeChecking/Errors.hs-boot view
@@ -0,0 +1,5 @@+module Agda.TypeChecking.Errors where++import Agda.TypeChecking.Monad.Base++prettyError :: TCErr -> TCM String
src/full/Agda/TypeChecking/EtaContract.hs view
@@ -32,6 +32,7 @@ Sort _ -> noApp MetaV _ _ -> noApp DontCare _ -> noApp+ Shared p -> binAppView (derefPtr p) -- destroys sharing where noApp = NoApp t app f [] = noApp@@ -39,21 +40,21 @@ etaContract :: TermLike a => a -> TCM a etaContract = traverseTermM etaOnce- where etaOnce :: Term -> TCM Term-etaOnce v = ignoreAbstractMode $ eta v+etaOnce v = eta v where+ eta v@Shared{} = updateSharedTerm eta v eta t@(Lam h (Abs _ b)) = do -- NoAbs can't be eta'd imp <- shouldEtaContractImplicit case binAppView b of App u (Arg h' r v)- | isVar0 v && allowed imp h' && not (freeIn 0 u) ->+ | (r == Irrelevant || isVar0 v) && allowed imp h' && not (freeIn 0 u) -> return $ subst __IMPOSSIBLE__ u _ -> return t where+ isVar0 (Shared p) = isVar0 (derefPtr p) isVar0 (Var 0 []) = True- isVar0 (DontCare{}) = True -- Andreas, 2011-10-01 eta-contract irrelevant functions also isVar0 (Level (Max [Plus 0 l])) = case l of NeutralLevel v -> isVar0 v UnreducedLevel v -> isVar0 v
src/full/Agda/TypeChecking/Forcing.hs view
@@ -6,6 +6,7 @@ import Agda.Syntax.Common import Agda.Syntax.Internal import Agda.TypeChecking.Monad+import Agda.TypeChecking.Irrelevance import Agda.TypeChecking.Reduce import Agda.TypeChecking.Substitute import Agda.Utils.Size@@ -43,9 +44,9 @@ (forcedArgs vs) (return []) Pi a (NoAbs _ b) ->- (++) <$> forcedVariables (unEl $ unArg a)+ (++) <$> forcedVariables (unEl $ unDom a) <*> forcedVariables (unEl b)- Pi a b -> (++) <$> forcedVariables (unEl $ unArg a)+ Pi a b -> (++) <$> forcedVariables (unEl $ unDom a) <*> (underBinder <$> forcedVariables (unEl $ absBody b)) -- Sorts? _ -> return []@@ -65,9 +66,9 @@ where m = maximum (-1:xs) aux i t | i > m = t- aux i t = case t of+ aux i t = case ignoreSharingType t of El s (Pi a b) -> El s $ Pi (upd a) (fmap (aux (i + 1)) b) _ -> __IMPOSSIBLE__ where- upd a | i `elem` xs = a { argRelevance = Forced }+ upd a | i `elem` xs = a { domRelevance = composeRelevance Forced (domRelevance a) } | otherwise = a
src/full/Agda/TypeChecking/Free.hs view
@@ -9,8 +9,8 @@ , relevantVars , rigidVars , freeIn, isBinderUsed- , freeInIgnoringSorts- , relevantIn+ , freeInIgnoringSorts, freeInIgnoringSortAnn+ , relevantIn, relevantInIgnoringSortAnn , Occurrence(..) , occurrence ) where@@ -40,7 +40,8 @@ { stronglyRigidVars :: VarSet -- ^ variables at top and under constructors , weaklyRigidVars :: VarSet -- ^ ord. rigid variables, e.g., in arguments of variables , flexibleVars :: VarSet -- ^ variables occuring in arguments of metas. These are potentially free, depending how the meta variable is instantiated.- , irrelevantVars :: VarSet -- ^ variables under a @DontCare@, i.e., in irrelevant positions+ , irrelevantVars :: VarSet -- ^ variables in irrelevant arguments and under a @DontCare@, i.e., in irrelevant positions+ , unusedVars :: VarSet -- ^ variables in 'UnusedArg'uments } rigidVars :: FreeVars -> VarSet@@ -48,7 +49,7 @@ -- | @allVars fv@ includes irrelevant variables. allVars :: FreeVars -> VarSet-allVars fv = Set.unions [rigidVars fv, flexibleVars fv, irrelevantVars fv]+allVars fv = Set.unions [rigidVars fv, flexibleVars fv, irrelevantVars fv, unusedVars fv] -- | All but the irrelevant variables. relevantVars :: FreeVars -> VarSet@@ -56,17 +57,23 @@ data Occurrence = NoOccurrence+ | Irrelevantly | StronglyRigid | WeaklyRigid | Flexible+ | Unused deriving (Eq,Show) +{- NO LONGER -- | @occurrence x fv@ ignores irrelevant variables in @fv@+-} occurrence :: Nat -> FreeVars -> Occurrence occurrence x fv | x `Set.member` stronglyRigidVars fv = StronglyRigid | x `Set.member` weaklyRigidVars fv = WeaklyRigid | x `Set.member` flexibleVars fv = Flexible+ | x `Set.member` irrelevantVars fv = Irrelevantly+ | x `Set.member` unusedVars fv = Unused | otherwise = NoOccurrence -- | Mark variables as flexible. Useful when traversing arguments of metas.@@ -88,47 +95,56 @@ irrelevantly :: FreeVars -> FreeVars irrelevantly fv = empty { irrelevantVars = allVars fv } +-- | Mark all free variables as unused, except for irrelevant vars.+unused :: FreeVars -> FreeVars+unused fv = empty+ { irrelevantVars = irrelevantVars fv+ , unusedVars = Set.unions [ rigidVars fv, flexibleVars fv, unusedVars fv ]+ }+ -- | Pointwise union. union :: FreeVars -> FreeVars -> FreeVars-union (FV sv1 rv1 fv1 iv1) (FV sv2 rv2 fv2 iv2) =- FV (Set.union sv1 sv2) (Set.union rv1 rv2) (Set.union fv1 fv2) (Set.union iv1 iv2)+union (FV sv1 rv1 fv1 iv1 uv1) (FV sv2 rv2 fv2 iv2 uv2) =+ FV (Set.union sv1 sv2) (Set.union rv1 rv2) (Set.union fv1 fv2) (Set.union iv1 iv2) (Set.union uv1 uv2) unions :: [FreeVars] -> FreeVars unions = foldr union empty empty :: FreeVars-empty = FV Set.empty Set.empty Set.empty Set.empty+empty = FV Set.empty Set.empty Set.empty Set.empty Set.empty -- | @delete x fv@ deletes variable @x@ from variable set @fv@. delete :: Nat -> FreeVars -> FreeVars-delete n (FV sv rv fv iv) = FV (Set.delete n sv) (Set.delete n rv) (Set.delete n fv) (Set.delete n iv)+delete n (FV sv rv fv iv uv) = FV (Set.delete n sv) (Set.delete n rv) (Set.delete n fv) (Set.delete n iv) (Set.delete n uv) -- | @subtractFV n fv@ subtracts $n$ from each free variable in @fv@. subtractFV :: Nat -> FreeVars -> FreeVars-subtractFV n (FV sv rv fv iv) = FV (Set.subtract n sv) (Set.subtract n rv) (Set.subtract n fv) (Set.subtract n iv)+subtractFV n (FV sv rv fv iv uv) = FV (Set.subtract n sv) (Set.subtract n rv) (Set.subtract n fv) (Set.subtract n iv) (Set.subtract n uv) -- | A single (strongly) rigid variable. singleton :: Nat -> FreeVars-singleton x = FV { stronglyRigidVars = Set.singleton x- , weaklyRigidVars = Set.empty -- WAS: Set.singleton x- , flexibleVars = Set.empty- , irrelevantVars = Set.empty- }+singleton x = empty { stronglyRigidVars = Set.singleton x } -- * Collecting free variables. class Free a where- freeVars' :: FreeConf -> a -> FreeVars+ freeVars' :: FreeConf -> a -> FreeVars +-- | Where should we skip sorts in free variable analysis?+data IgnoreSorts+ = IgnoreNot -- ^ Do not skip.+ | IgnoreInAnnotations -- ^ Skip when annotation to a type.+ | IgnoreAll -- ^ Skip unconditionally.+ deriving (Eq, Show)+ data FreeConf = FreeConf- { fcIgnoreSorts :: Bool- -- ^ Ignore free variables in sorts.+ { fcIgnoreSorts :: IgnoreSorts -- ^ Ignore free variables in sorts. } -- | Doesn't go inside solved metas, but collects the variables from a -- metavariable application @X ts@ as @flexibleVars@. freeVars :: Free a => a -> FreeVars-freeVars = freeVars' FreeConf{ fcIgnoreSorts = False }+freeVars = freeVars' FreeConf{ fcIgnoreSorts = IgnoreNot } instance Free Term where freeVars' conf t = case t of@@ -145,14 +161,17 @@ Level l -> freeVars' conf l MetaV _ ts -> flexible $ freeVars' conf ts DontCare mt -> irrelevantly $ freeVars' conf mt+ Shared p -> freeVars' conf (derefPtr p) instance Free Type where- freeVars' conf (El s t) = freeVars' conf (s, t)+ freeVars' conf (El s t)+ | fcIgnoreSorts conf == IgnoreNot = freeVars' conf (s, t)+ | otherwise = freeVars' conf t instance Free Sort where freeVars' conf s- | fcIgnoreSorts conf = empty- | otherwise = case s of+ | fcIgnoreSorts conf == IgnoreAll = empty+ | otherwise = case s of Type a -> freeVars' conf a Prop -> empty Inf -> empty@@ -182,8 +201,13 @@ freeVars' conf (x,y) = freeVars' conf x `union` freeVars' conf y instance Free a => Free (Arg a) where- freeVars' conf = freeVars' conf . unArg+ freeVars' conf (Arg h Irrelevant a) = irrelevantly $ freeVars' conf a+ freeVars' conf (Arg h UnusedArg a) = unused $ freeVars' conf a+ freeVars' conf (Arg h r a) = freeVars' conf a +instance Free a => Free (Dom a) where+ freeVars' conf (Dom h r a) = freeVars' conf a+ instance Free a => Free (Abs a) where freeVars' conf (Abs _ b) = subtractFV 1 $ delete 0 $ freeVars' conf b freeVars' conf (NoAbs _ b) = freeVars' conf b@@ -202,10 +226,18 @@ freeInIgnoringSorts :: Free a => Nat -> a -> Bool freeInIgnoringSorts v t =- v `Set.member` allVars (freeVars' FreeConf{ fcIgnoreSorts = True } t)+ v `Set.member` allVars (freeVars' FreeConf{ fcIgnoreSorts = IgnoreAll } t) +freeInIgnoringSortAnn :: Free a => Nat -> a -> Bool+freeInIgnoringSortAnn v t =+ v `Set.member` allVars (freeVars' FreeConf{ fcIgnoreSorts = IgnoreInAnnotations } t)++relevantInIgnoringSortAnn :: Free a => Nat -> a -> Bool+relevantInIgnoringSortAnn v t =+ v `Set.member` relevantVars (freeVars' FreeConf{ fcIgnoreSorts = IgnoreInAnnotations } t)+ relevantIn :: Free a => Nat -> a -> Bool-relevantIn v t = v `Set.member` relevantVars (freeVars' FreeConf{ fcIgnoreSorts = True } t)+relevantIn v t = v `Set.member` relevantVars (freeVars' FreeConf{ fcIgnoreSorts = IgnoreAll } t) -- | Is the variable bound by the abstraction actually used? isBinderUsed :: Free a => Abs a -> Bool
src/full/Agda/TypeChecking/Implicit.hs view
@@ -4,11 +4,68 @@ -} module Agda.TypeChecking.Implicit where +import Control.Applicative+import Control.Monad+ import Agda.Syntax.Common+import Agda.Syntax.Internal +import Agda.TypeChecking.Irrelevance+import {-# SOURCE #-} Agda.TypeChecking.MetaVars+import Agda.TypeChecking.Monad+import Agda.TypeChecking.Reduce+import Agda.TypeChecking.Substitute+import Agda.TypeChecking.Telescope+import {-# SOURCE #-} Agda.TypeChecking.InstanceArguments++import Agda.Utils.Size+import Agda.Utils.Tuple+ #include "../undefined.h" import Agda.Utils.Impossible-import Control.Applicative+++-- | @implicitArgs n expand t@ generates up to @n@ implicit arguments+-- metas (unbounded if @n<0@), as long as @t@ is a function type+-- and @expand@ holds on the hiding info of its domain.+implicitArgs :: Int -> (Hiding -> Bool) -> Type -> TCM (Args, Type)+implicitArgs 0 expand t0 = return ([], t0)+implicitArgs n expand t0 = do+ t0' <- reduce t0+ case ignoreSharing $ unEl t0' of+ Pi (Dom h rel a) b | expand h -> do+ when (h == Instance) $ reportSLn "tc.term.args.ifs" 15 $+ "inserting implicit meta for type " ++ show a+ v <- applyRelevanceToContext rel $ newMeta h (absName b) a+ let arg = Arg h rel v+ mapFst (arg:) <$> implicitArgs (n-1) expand (absApp b v)+ _ -> return ([], t0')+ where+ newMeta Hidden = newNamedValueMeta RunMetaOccursCheck+ newMeta Instance = initializeIFSMeta+ newMeta _ = __IMPOSSIBLE__++{- UNUSED, BUT DONT REMOVE (Andreas, 2012-07-31)+introImplicits :: (Hiding -> Bool) -> Type -> (Int -> Type -> TCM a) -> TCM a+introImplicits expand t cont = do+ TelV tel t0 <- telViewUpTo' (-1) (expand . domHiding) t+ addCtxTel tel $ cont (size tel) t0+-}++{- POINTLESS, NEEDS TO BE CONTINUATION-PASSING+-- | @introImplicits expand t@ introduces domain types of @t@+-- into the context, as long as @expand@ holds on them.+introImplicits :: (Hiding -> Bool) -> Type -> TCM (Int, Type)+introImplicits expand t = do+ t <- reduce t+ case unEl t of+ Pi dom@(Dom h rel a) b | expand h ->+ addCtxString (absName b) dom $ do+ mapFst (+1) <$> introImplicits expand (absBody b)+ _ -> return (0, t)+-}++--------------------------------------------------------------------------- data ImplicitInsertion = ImpInsert [Hiding] -- ^ this many implicits have to be inserted
src/full/Agda/TypeChecking/Injectivity.hs view
@@ -25,6 +25,7 @@ import {-# SOURCE #-} Agda.TypeChecking.Conversion import Agda.TypeChecking.Pretty import Agda.TypeChecking.Constraints+import Agda.TypeChecking.Polarity import Agda.Utils.List import Agda.Utils.Monad import Agda.Utils.Permutation@@ -38,20 +39,27 @@ -- first, possibly rewrite literal v to constructor form v <- constructorForm v reportSDoc "tc.inj.reduce" 30 $ text "reduceHead" <+> prettyTCM v- case v of+ case ignoreSharing v of Def f args -> do+ let v0 = Def f [] def <- theDef <$> getConstInfo f case def of--- Function{ funClauses = [ _ ] } -> unfoldDefinition False reduceHead v f args- Datatype{ dataClause = Just _ } -> unfoldDefinition False reduceHead v f args- Record{ recClause = Just _ } -> unfoldDefinition False reduceHead v f args+ -- Andreas, 2012-11-06 unfold aliases (single clause terminating functions)+ -- see test/succeed/Issue747+ -- We restrict this to terminating functions to not make the+ -- type checker loop here on non-terminating functions.+ -- see test/fail/TerminationInfiniteRecord+ Function{ funClauses = [ _ ], funDelayed = NotDelayed, funTerminates = Just True }+ -> unfoldDefinition False reduceHead v0 f args+ Datatype{ dataClause = Just _ } -> unfoldDefinition False reduceHead v0 f args+ Record{ recClause = Just _ } -> unfoldDefinition False reduceHead v0 f args _ -> return $ notBlocked v _ -> return $ notBlocked v headSymbol :: Term -> TCM (Maybe TermHead) headSymbol v = ignoreAbstractMode $ do v <- ignoreBlocking <$> reduceHead v- case v of+ case ignoreSharing v of Def f _ -> do def <- theDef <$> getConstInfo f case def of@@ -61,17 +69,24 @@ -- Don't treat axioms in the current mutual block -- as constructors (they might have definitions we -- don't know about yet).- fs <- lookupMutualBlock =<< currentMutualBlock+ fs <- lookupMutualBlock =<< currentOrFreshMutualBlock if Set.member f fs then return Nothing else return (Just $ ConHead f)- _ -> return Nothing+ Function{} -> return Nothing+ Primitive{} -> return Nothing+ Constructor{} -> __IMPOSSIBLE__ Con c _ -> return (Just $ ConHead c) Sort _ -> return (Just SortHead) Pi _ _ -> return (Just PiHead) Lit _ -> return Nothing -- handle literal heads as well? can't think of -- any examples where it would be useful...- _ -> return Nothing+ Lam{} -> return Nothing+ Var{} -> return Nothing+ Level{} -> return Nothing+ MetaV{} -> return Nothing+ DontCare{} -> return Nothing+ Shared{} -> __IMPOSSIBLE__ checkInjectivity :: QName -> [Clause] -> TCM FunctionInverse checkInjectivity f cs@@ -115,7 +130,7 @@ -- | Argument should be on weak head normal form. functionInverse :: Term -> TCM InvView-functionInverse v = case v of+functionInverse v = case ignoreSharing v of Def f args -> do d <- theDef <$> getConstInfo f case d of@@ -130,6 +145,10 @@ useInjectivity :: Comparison -> Type -> Term -> Term -> TCM () useInjectivity cmp a u v = do+ reportSDoc "tc.inj.use" 30 $ fsep $+ pwords "useInjectivity on" +++ [ prettyTCM u, prettyTCM cmp, prettyTCM v, text ":", prettyTCM a+ ] uinv <- functionInverse u vinv <- functionInverse v case (uinv, vinv) of@@ -183,8 +202,7 @@ ] -- and this is the order the variables occur in the patterns let ms' = permute (invertP $ compactP perm) ms- cxt <- getContextTelescope- let sub = (reverse ms ++ idSub cxt)+ let sub = parallelS (reverse ms) margs <- runReaderT (evalStateT (metaArgs ps) ms') sub reportSDoc "tc.inj.invert" 20 $ vcat [ text "inversion"@@ -194,7 +212,10 @@ , text "type =" <+> prettyTCM ftype ] ]- pol <- getPolarity' cmp f+ -- Since we do not care for the value of non-variant metas here,+ -- we can treat 'Nonvariant' as 'Invariant'.+ -- That ensures these metas do not remain unsolved.+ pol <- purgeNonvariant <$> getPolarity' cmp f -- The clause might not give as many patterns as there -- are arguments (point-free style definitions). let args' = take (length margs) args@@ -219,7 +240,7 @@ , text "which does not expose a constructor" ] patternViolation- `catchError` \err -> case errError err of+ `catchError` \err -> case err of TypeError {} -> throwError err Exception {} -> throwError err IOException {} -> throwError err@@ -234,7 +255,7 @@ dotP :: Monad m => Term -> StateT [Term] (ReaderT Substitution m) Term dotP v = do sub <- ask- return $ substs sub v+ return $ applySubst sub v metaArgs args = mapM metaArg args metaArg arg = traverse metaPat arg
+ src/full/Agda/TypeChecking/InstanceArguments.hs view
@@ -0,0 +1,274 @@+{-# LANGUAGE CPP #-}++module Agda.TypeChecking.InstanceArguments where++import Control.Applicative+import Control.Monad.Error+import Control.Monad.Reader+import Control.Monad.State+import Data.Map as Map+import Data.List as List++import Agda.Syntax.Common+import Agda.Syntax.Position+import Agda.Syntax.Scope.Base+import Agda.Syntax.Internal++import Agda.TypeChecking.Implicit (implicitArgs)+import Agda.TypeChecking.Irrelevance+import Agda.TypeChecking.Monad+import Agda.TypeChecking.Pretty+import Agda.TypeChecking.Substitute+import Agda.TypeChecking.Reduce++import {-# SOURCE #-} Agda.TypeChecking.Constraints+import {-# SOURCE #-} Agda.TypeChecking.Rules.Term (checkArguments)+import {-# SOURCE #-} Agda.TypeChecking.MetaVars+import {-# SOURCE #-} Agda.TypeChecking.Conversion++import Agda.Utils.Monad++#include "../undefined.h"+import Agda.Utils.Impossible++initialIFSCandidates :: TCM [(Term, Type)]+initialIFSCandidates = do+ cands1 <- getContextVars+ cands2 <- getScopeDefs+ return $ cands1 ++ cands2+ where+ -- get a list of variables with their type, relative to current context+ getContextVars :: TCM [(Term, Type)]+ getContextVars = do+ ctx <- getContext+ let vars = [ (var i, raise (i + 1) t)+ | (Dom h r (x, t), i) <- zip ctx [0..], not (unusableRelevance r)+ ]+ -- get let bindings+ env <- asks envLetBindings+ env <- mapM (getOpen . snd) $ Map.toList env+ let lets = [ (v,t) | (v, Dom h r t) <- env, not (unusableRelevance r) ]+ return $ vars ++ lets++ getScopeDefs :: TCM [(Term, Type)]+ getScopeDefs = do+ scopeInfo <- gets stScope+ let ns = everythingInScope scopeInfo+ let nsList = Map.toList $ nsNames ns+ -- all abstract names in scope are candidates+ -- (even ones that you can't refer to unambiguously)+ let qs = List.map anameName $ snd =<< nsList+ rel <- asks envRelevance+ cands <- mapM (candidate rel) qs+ return $ concat cands++ candidate :: Relevance -> QName -> TCM [(Term, Type)]+ candidate rel q =+ -- Andreas, 2012-07-07:+ -- we try to get the info for q+ -- while opening a module, q may be in scope but not in the signature+ -- in this case, we just ignore q (issue 674)+ flip catchError handle $ do+ def <- getConstInfo q+ let r = defRelevance def+ if not (r `moreRelevant` rel) then return [] else do+ t <- defType <$> instantiateDef def+ args <- freeVarsToApply q+ let vs = case theDef def of+ -- drop parameters if it's a projection function...+ Function{ funProjection = Just (_,i) } -> genericDrop (i - 1) args+ _ -> args+ return [(Def q vs, t)]+ where+ -- unbound constant throws an internal error+ handle (TypeError _ (Closure {clValue = InternalError _})) = return []+ handle err = throwError err++{- OLD CODE+ getScopeDefs :: TCM [(Term, Type)]+ getScopeDefs = do+ scopeInfo <- gets stScope+ let ns = everythingInScope scopeInfo+ let nsList = Map.toList $ nsNames ns+ -- all abstract names in scope are candidates+ -- (even ones that you can't refer to unambiguously)+ let cands2Names = nsList >>= snd+ cands2Types <- mapM (typeOfConst . anameName) cands2Names+ cands2Rel <- mapM (relOfConst . anameName) cands2Names+ cands2FV <- mapM (constrFreeVarsToApply . anameName) cands2Names+ rel <- asks envRelevance+ return $ [(Def (anameName an) vs, t) |+ (an, t, r, vs) <- zip4 cands2Names cands2Types cands2Rel cands2FV,+ r `moreRelevant` rel ]+ constrFreeVarsToApply :: QName -> TCM Args+ constrFreeVarsToApply n = do+ args <- freeVarsToApply n+ defn <- theDef <$> getConstInfo n+ return $ case defn of+ -- drop parameters if it's a projection function...+ Function{ funProjection = Just (rn,i) } -> genericDrop (i - 1) args+ _ -> args+-}++-- | @initializeIFSMeta s t@ generates an instance meta of type @t@+-- with suggested name @s@.+initializeIFSMeta :: String -> Type -> TCM Term+initializeIFSMeta s t = do+ cands <- initialIFSCandidates+ newIFSMeta s t cands++-- | @findInScope m (v,a)s@ tries to instantiate on of the types @a@s+-- of the candidate terms @v@s to the type @t@ of the metavariable @m@.+-- If successful, meta @m@ is solved with the instantiation of @v@.+-- If unsuccessful, the constraint is regenerated, with possibly reduced+-- candidate set.+findInScope :: MetaId -> [(Term, Type)] -> TCM ()+findInScope m cands = whenJustM (findInScope' m cands) $ addConstraint . FindInScope m+{- SAME CODE, POINTFULL+ do fisres <- findInScope' m cands+ case fisres of+ Nothing -> return ()+ Just cs -> addConstraint $ FindInScope m cs+-}++-- Result says whether we need to add constraint, and if so, the set of+-- remaining candidates+findInScope' :: MetaId -> [(Term, Type)] -> TCM (Maybe [(Term, Type)])+findInScope' m cands = ifM (isFrozen m) (return (Just cands)) $ do+ reportSDoc "tc.constr.findInScope" 15 $ text ("findInScope 2: constraint: " ++ show m ++ "; candidates left: " ++ show (length cands))+ t <- getMetaTypeInContext m+ reportSDoc "tc.constr.findInScope" 15 $ text "findInScope 3: t =" <+> prettyTCM t+ reportSLn "tc.constr.findInScope" 70 $ "findInScope 3: t: " ++ show t+ mv <- lookupMeta m+ cands <- checkCandidates m t cands+ reportSLn "tc.constr.findInScope" 15 $ "findInScope 4: cands left: " ++ show (length cands)+ case cands of++ [] -> do+ reportSDoc "tc.constr.findInScope" 15 $ text "findInScope 5: not a single candidate found..."+ typeError $ IFSNoCandidateInScope t++ [(term, t')] -> do+ reportSDoc "tc.constr.findInScope" 15 $ text (+ "findInScope 5: one candidate found for type '") <+>+ prettyTCM t <+> text "': '" <+> prettyTCM term <+>+ text "', of type '" <+> prettyTCM t' <+> text "'."++ ca <- liftTCM $ runErrorT $ checkArguments ExpandLast DontExpandInstanceArguments (getRange mv) [] t' t+ case ca of+ Left _ -> __IMPOSSIBLE__+ Right (args, t'') -> do+{- TODO+ (args, t'') <- implicitArgs (...) t'+ do+-}+ leqType t'' t+ ctxArgs <- getContextArgs+ v <- (`applyDroppingParameters` args) =<< reduce term+ assignV m ctxArgs v+ reportSDoc "tc.constr.findInScope" 10 $+ text "solved by instance search:" <+> prettyTCM m+ <+> text ":=" <+> prettyTCM v+ return Nothing++ cs -> do+ reportSDoc "tc.constr.findInScope" 15 $+ text ("findInScope 5: more than one candidate found: ") <+>+ prettyTCM (List.map fst cs)+ return (Just cs)++-- return the meta's type, applied to the current context+getMetaTypeInContext :: MetaId -> TCM Type+getMetaTypeInContext m = do+ mv <- lookupMeta m+ let j = mvJudgement mv+ tj <- getMetaType m+ ctxArgs <- getContextArgs+ normalise $ tj `piApply` ctxArgs++-- returns a refined list of valid candidates and the (normalised) type of the+-- meta, applied to the context (for convenience)+checkCandidates :: MetaId -> Type -> [(Term, Type)] -> TCM [(Term, Type)]+checkCandidates m t cands = localState $ disableDestructiveUpdate $ do+ -- for candidate checking, we don't take into account other IFS+ -- constrains+ dropConstraints (isIFSConstraint . clValue . theConstraint)+ filterM (uncurry $ checkCandidateForMeta m t) cands+ where+ checkCandidateForMeta :: MetaId -> Type -> Term -> Type -> TCM Bool+ checkCandidateForMeta m t term t' =+ verboseBracket "tc.constr.findInScope" 20 ("checkCandidateForMeta " ++ show m) $ do+ liftTCM $ flip catchError handle $ do+ reportSLn "tc.constr.findInScope" 70 $ " t: " ++ show t ++ "\n t':" ++ show t' ++ "\n term: " ++ show term ++ "."+ reportSDoc "tc.constr.findInScope" 20 $ vcat+ [ text "checkCandidateForMeta"+ , text "t =" <+> prettyTCM t+ , text "t' =" <+> prettyTCM t'+ , text "term =" <+> prettyTCM term+ ]+ localState $ do+ -- domi: we assume that nothing below performs direct IO (except+ -- for logging and such, I guess)+ ca <- runErrorT $ checkArguments ExpandLast DontExpandInstanceArguments noRange [] t' t+ case ca of+ Left _ -> return False+ Right (args, t'') -> do+ reportSDoc "tc.constr.findInScope" 20 $+ text "instance search: checking" <+> prettyTCM t''+ <+> text "<=" <+> prettyTCM t+ -- if constraints remain, we abort, but keep the candidate+ flip (ifNoConstraints_ $ leqType t'' t) (const $ return True) $ do+ --tel <- getContextTelescope+ ctxArgs <- getContextArgs+ v <- (`applyDroppingParameters` args) =<< reduce term+ reportSDoc "tc.constr.findInScope" 10 $+ text "instance search: attempting" <+> prettyTCM m+ <+> text ":=" <+> prettyTCM v+ assign m ctxArgs v+-- assign m ctxArgs (term `apply` args)+ -- make a pass over constraints, to detect cases where some are made+ -- unsolvable by the assignment, but don't do this for FindInScope's+ -- to prevent loops. We currently also ignore UnBlock constraints+ -- to be on the safe side.+ solveAwakeConstraints' True+ return True+ where+ handle err = do+ reportSDoc "tc.constr.findInScope" 50 $ text "assignment failed:" <+> prettyTCM err+ return False+ isIFSConstraint :: Constraint -> Bool+ isIFSConstraint FindInScope{} = True+ isIFSConstraint UnBlock{} = True -- otherwise test/fail/Issue723 loops+ isIFSConstraint _ = False++-- | To preserve the invariant that a constructor is not applied to its+-- parameter arguments, we explicitly check whether function term+-- we are applying to arguments is a unapplied constructor.+-- In this case we drop the first 'conPars' arguments.+-- See Issue670a.+applyDroppingParameters :: Term -> Args -> TCM Term+applyDroppingParameters t vs =+ case ignoreSharing t of+ Con c [] -> do+ def <- theDef <$> getConstInfo c+ case def of+ Constructor {conPars = n} -> return $ Con c (genericDrop n vs)+ _ -> __IMPOSSIBLE__+ _ -> return $ t `apply` vs++-- | Attempt to solve irrelevant metas by instance search.+solveIrrelevantMetas :: TCM ()+solveIrrelevantMetas = mapM_ solveMetaIfIrrelevant =<< getOpenMetas++solveMetaIfIrrelevant :: MetaId -> TCM ()+solveMetaIfIrrelevant x = do+ m <- lookupMeta x+ when (irrelevantOrUnused (getMetaRelevance m)) $ do+ reportSDoc "tc.conv.irr" 20 $ sep+ [ text "instance search for solution of irrelevant meta"+ , prettyTCM x, colon, prettyTCM $ jMetaType $ mvJudgement m+ ]+ flip catchError (const $ return ()) $ do+ findInScope' x =<< initialIFSCandidates+ -- do not add constraints!+ return ()
+ src/full/Agda/TypeChecking/InstanceArguments.hs-boot view
@@ -0,0 +1,7 @@++module Agda.TypeChecking.InstanceArguments where++import Agda.TypeChecking.Monad.Base (TCM)+import Agda.Syntax.Internal (Type, Term)++initializeIFSMeta :: String -> Type -> TCM Term
src/full/Agda/TypeChecking/Irrelevance.hs view
@@ -9,7 +9,7 @@ import qualified Data.Map as Map -import Agda.Interaction.Options+import Agda.Interaction.Options hiding (tests) import Agda.Syntax.Common @@ -17,14 +17,25 @@ #include "../undefined.h" import Agda.Utils.Impossible+import Agda.Utils.QuickCheck+import Agda.Utils.TestHelpers -- | data 'Relevance' -- see 'Agda.Syntax.Common' +irrelevantOrUnused :: Relevance -> Bool+irrelevantOrUnused Irrelevant = True+irrelevantOrUnused UnusedArg = True+irrelevantOrUnused NonStrict = False+irrelevantOrUnused Relevant = False+irrelevantOrUnused Forced = False+ -- | @unusableRelevance rel == True@ iff we cannot use a variable of @rel@. unusableRelevance :: Relevance -> Bool unusableRelevance rel = NonStrict `moreRelevant` rel +-- | 'Relevance' composition.+-- 'Irrelevant' is dominant, 'Relevant' is neutral. composeRelevance :: Relevance -> Relevance -> Relevance composeRelevance r r' = case (r, r') of@@ -34,27 +45,31 @@ (_, NonStrict) -> NonStrict (Forced, _) -> Forced (_, Forced) -> Forced+ (UnusedArg, _) -> UnusedArg+ (_, UnusedArg) -> UnusedArg (Relevant, Relevant) -> Relevant -- | @inverseComposeRelevance r x@ returns the most irrelevant @y@ -- such that forall @x@, @y@ we have--- @x `moreRelevant` (r `composeRelevance` y)@+-- @x \`moreRelevant\` (r \`composeRelevance\` y)@ -- iff--- @(r `inverseComposeRelevance` x) `moreRelevant` y@ (Galois connection).+-- @(r \`inverseComposeRelevance\` x) \`moreRelevant\` y@ (Galois connection). inverseComposeRelevance :: Relevance -> Relevance -> Relevance inverseComposeRelevance r x = case (r, x) of- (_, Forced) -> Forced -- preserve @Forced@ (Relevant, x) -> x -- going to relevant arg.: nothing changes- (Forced, Relevant) -> Forced -- going forced: relevants become forced+ _ | r == x -> Relevant -- because Relevant is comp.-neutral+ (UnusedArg, x) -> x+ (Forced, UnusedArg) -> Relevant (Forced, x) -> x- (Irrelevant, _) -> Relevant -- going irrelevant: every thing usable+ (Irrelevant, x) -> Relevant -- going irrelevant: every thing usable (_, Irrelevant) -> Irrelevant -- otherwise: irrelevant things remain unusable (NonStrict, _) -> Relevant -- but @NonStrict@s become usable --- | For comparing @Relevance@ ignoring @Forced@.+-- | For comparing @Relevance@ ignoring @Forced@ and @UnusedArg@. ignoreForced :: Relevance -> Relevance ignoreForced Forced = Relevant+ignoreForced UnusedArg = Relevant ignoreForced Relevant = Relevant ignoreForced NonStrict = NonStrict ignoreForced Irrelevant = Irrelevant@@ -69,40 +84,31 @@ nonStrictToIrr NonStrict = Irrelevant nonStrictToIrr rel = rel --- * Operations on 'Arg'.+-- * Operations on 'Dom'. -- | Prepare parts of a parameter telescope for abstraction in constructors -- and projections.-hideAndRelParams :: Arg a -> Arg a+hideAndRelParams :: Dom a -> Dom a hideAndRelParams a = a- { argRelevance = nonStrictToIrr (argRelevance a)- , argHiding = Hidden+ { domRelevance = nonStrictToIrr (domRelevance a)+ , domHiding = Hidden } +{- UNUSED -- | @modifyArgRelevance f arg@ applies @f@ to the 'argRelevance' component of @arg@. modifyArgRelevance :: (Relevance -> Relevance) -> Arg a -> Arg a modifyArgRelevance f a = a { argRelevance = f (argRelevance a) }+-} -- | Used to modify context when going into a @rel@ argument.-inverseApplyRelevance :: Relevance -> Arg a -> Arg a-inverseApplyRelevance rel = modifyArgRelevance (rel `inverseComposeRelevance`)--- inverseApplyRelevance rel a = a { argRelevance = rel `inverseComposeRelevance` argRelevance a }+inverseApplyRelevance :: Relevance -> Dom a -> Dom a+inverseApplyRelevance rel = mapDomRelevance (rel `inverseComposeRelevance`) -- | Compose two relevance flags. -- This function is used to update the relevance information -- on pattern variables @a@ after a match against something @rel@.-applyRelevance :: Relevance -> Arg a -> Arg a-applyRelevance rel = modifyArgRelevance (rel `composeRelevance`)--- applyRelevance rel a = a { argRelevance = rel `composeRelevance` argRelevance a }--{- Andreas, 2011-04-26: the combination Irrelevant Forced does not arise-applyRelevance Irrelevant a | argRelevance a == Relevant =- a { argRelevance = Irrelevant }-applyRelevance Forced a | argRelevance a == Relevant =- a { argRelevance = Forced }-applyRelevance rel a = a -- ^ do nothing if rel == Relevant or a is- -- already Forced or Irrelevant--}+applyRelevance :: Relevance -> Dom a -> Dom a+applyRelevance rel = mapDomRelevance (rel `composeRelevance`) -- * Operations on 'Context'. @@ -122,7 +128,7 @@ workOnTypes' :: Bool -> TCM a -> TCM a workOnTypes' allowed cont = if allowed then- liftTCM $ modifyContext (modifyContextEntries $ modifyArgRelevance $ irrToNonStrict) cont+ liftTCM $ modifyContext (modifyContextEntries $ mapDomRelevance $ irrToNonStrict) cont else cont -- | (Conditionally) wake up irrelevant variables and make them relevant.@@ -140,7 +146,8 @@ (fmap $ \ (t, a) -> (t, inverseApplyRelevance rel a)) (envLetBindings e) -- enable local irr. defs- , envRelevance = rel -- enable global irr. defs+ , envRelevance = composeRelevance rel (envRelevance e)+ -- enable global irr. defs } -- | Wake up irrelevant variables and make them relevant. For instance,@@ -148,14 +155,18 @@ -- may be used, so they are awoken before type checking the argument. wakeIrrelevantVars :: TCM a -> TCM a wakeIrrelevantVars = applyRelevanceToContext Irrelevant-{--wakeIrrelevantVars = local $ \ e -> e- { envContext = map wakeVar (envContext e) -- enable local irr. defs- , envIrrelevant = True -- enable global irr. defs- }- where wakeVar ce = ce { ctxEntry = makeRelevant (ctxEntry ce) } -applyRelevanceToContext :: Relevance -> TCM a -> TCM a-applyRelevanceToContext Irrelevant cont = wakeIrrelevantVars cont-applyRelevanceToContext _ cont = cont--}++------------------------------------------------------------------------+-- * Tests+------------------------------------------------------------------------++prop_galois :: Relevance -> Relevance -> Relevance -> Bool+prop_galois r x y =+ x `moreRelevant` (r `composeRelevance` y) ==+ (r `inverseComposeRelevance` x) `moreRelevant` y++tests :: IO Bool+tests = runTests "Agda.TypeChecking.Irrelevance"+ [ quickCheck' prop_galois+ ]
src/full/Agda/TypeChecking/Level.hs view
@@ -35,10 +35,10 @@ builtinLevelKit :: TCM (Maybe LevelKit) builtinLevelKit = liftTCM $ do- level@(Def l []) <- primLevel- zero@(Def z []) <- primLevelZero- suc@(Def s []) <- primLevelSuc- max@(Def m []) <- primLevelMax+ level@(Def l []) <- ignoreSharing <$> primLevel+ zero@(Def z []) <- ignoreSharing <$> primLevelZero+ suc@(Def s []) <- ignoreSharing <$> primLevelSuc+ max@(Def m []) <- ignoreSharing <$> primLevelMax let a @@ b = a `apply` [defaultArg b] return $ Just $ LevelKit { lvlType = level@@ -61,6 +61,11 @@ Nothing -> sequence_ [primLevel, primLevelZero, primLevelSuc, primLevelMax] >> __IMPOSSIBLE__ Just k -> return k +unLevel :: Term -> TCM Term+unLevel (Level l) = reallyUnLevelView l+unLevel (Shared p) = unLevel (derefPtr p)+unLevel v = return v+ reallyUnLevelView :: Level -> TCM Term reallyUnLevelView nv = case nv of@@ -100,7 +105,7 @@ mmax <- maybePrimDef primLevelMax let view a = do a <- reduce a- case a of+ case ignoreSharing a of Level l -> return l Con s [arg] | Just s == msuc -> inc <$> view (unArg arg)@@ -115,10 +120,10 @@ where mkAtom a = do b <- reduceB a- return $ case b of+ return $ case ignoreSharing <$> b of NotBlocked (MetaV m as) -> atom $ MetaLevel m as- NotBlocked a -> atom $ NeutralLevel a- Blocked m a -> atom $ BlockedLevel m a+ NotBlocked _ -> atom $ NeutralLevel (ignoreBlocking b)+ Blocked m _ -> atom $ BlockedLevel m (ignoreBlocking b) atom a = Max [Plus 0 a]
src/full/Agda/TypeChecking/LevelConstraints.hs view
@@ -3,24 +3,34 @@ import Data.List +import Agda.Syntax.Common (Nat) import Agda.Syntax.Internal import Agda.TypeChecking.Monad.Base import Agda.TypeChecking.Substitute import Agda.Utils.Size -simplifyLevelConstraint :: Integer -> Constraint -> Constraints -> Constraint+-- | @simplifyLevelConstraint n c cs@ turns an @c@ into an equality+-- constraint if it is an inequality constraint and the reverse+-- inequality is contained in @cs@. Number @n@ is the length+-- of the context @c@ is defined in.+simplifyLevelConstraint :: Int -> Constraint -> Constraints -> Constraint simplifyLevelConstraint n new old = case inequalities new of [a :=< b] | elem (b' :=< a') leqs -> LevelCmp CmpEq (Max [a]) (Max [b])- where (a', b') = raise (-n) (a, b)+ where (a', b') = raise (waterLevel - n) (a, b) _ -> new where- leqs = concatMap (inequalities . unClosure) old-- -- Unclosure converts deBruijn indices to deBruijn levels to- -- enable comparing constraints under different contexts- unClosure c = raise (-size (envContext $ clEnv cl)) $ clValue cl+ -- get the constraints plus their "waterLevels", i.e.,+ -- length of contexts they are defined in+ unClosure c = (size (envContext $ clEnv cl), clValue cl) where cl = theConstraint c+ (ns, ls) = unzip $ map unClosure old+ -- compute the common water level+ waterLevel :: Nat+ waterLevel = maximum (n:ns)+ -- convert deBruijn indices to deBruijn levels to+ -- enable comparing constraints under different contexts+ leqs = concatMap inequalities $ zipWith raise (map (waterLevel -) ns) ls data Leq = PlusLevel :=< PlusLevel deriving (Show, Eq)
src/full/Agda/TypeChecking/MetaVars.hs view
@@ -5,23 +5,26 @@ import Control.Monad.Reader import Control.Monad.State import Control.Monad.Error-import Data.Generics+import Data.Function+import Data.Typeable (Typeable) import Data.List as List hiding (sort) import Data.Map (Map) import qualified Data.Map as Map-import qualified Agda.Utils.IO.Locale as LocIO import Agda.Syntax.Common import qualified Agda.Syntax.Info as Info import Agda.Syntax.Internal+import Agda.Syntax.Internal.Generic import Agda.Syntax.Position import Agda.Syntax.Literal import qualified Agda.Syntax.Abstract as A import Agda.TypeChecking.Monad import Agda.TypeChecking.Monad.Builtin+import Agda.TypeChecking.Monad.Exception import Agda.TypeChecking.Reduce import Agda.TypeChecking.Substitute+import Agda.TypeChecking.Telescope import Agda.TypeChecking.Constraints import Agda.TypeChecking.Errors import Agda.TypeChecking.Free@@ -29,6 +32,8 @@ import Agda.TypeChecking.Pretty import Agda.TypeChecking.Irrelevance import Agda.TypeChecking.EtaContract+import Agda.TypeChecking.Eliminators+import Agda.TypeChecking.SizedTypes (boundedSizeMetaHook, isSizeProblem) import Agda.TypeChecking.MetaVars.Occurs @@ -36,8 +41,10 @@ import Agda.Utils.Fresh import Agda.Utils.List+import Agda.Utils.Maybe import Agda.Utils.Monad import Agda.Utils.Size+import Agda.Utils.Tuple import Agda.Utils.Permutation import qualified Agda.Utils.VarSet as Set @@ -90,8 +97,16 @@ -- Further, the meta variable may not be 'Frozen'. assignTerm :: MetaId -> Term -> TCM () assignTerm x t = do+ -- verify (new) invariants+ whenM (isFrozen x) __IMPOSSIBLE__+ assignTerm' x t++-- | Skip frozen check. Used for eta expanding frozen metas.+assignTerm' :: MetaId -> Term -> TCM ()+assignTerm' x t = do reportSLn "tc.meta.assign" 70 $ show x ++ " := " ++ show t- whenM (isFrozen x) __IMPOSSIBLE__ -- verify (new) invariant+ -- verify (new) invariants+ whenM (not <$> asks envAssignMetas) __IMPOSSIBLE__ let i = metaInstance (killRange t) verboseS "profile.metas" 10 $ liftTCM $ tickMax "max-open-metas" . size =<< getOpenMetas modifyMetaStore $ ins x i@@ -126,7 +141,7 @@ return $ Type $ Max [Plus 0 $ MetaLevel x vs] newTypeMeta :: Sort -> TCM Type-newTypeMeta s = El s <$> newValueMeta (sort s)+newTypeMeta s = El s <$> newValueMeta RunMetaOccursCheck (sort s) newTypeMeta_ :: TCM Type newTypeMeta_ = newTypeMeta =<< (workOnTypes $ newSortMeta)@@ -135,52 +150,62 @@ -- that it has a sort. The sort comes from the solution. -- newTypeMeta_ = newTypeMeta Inf --- | Create a new "implicit from scope" metavariable-newIFSMeta :: Type -> TCM Term-newIFSMeta t = do+-- | @newIFSMeta s t cands@ creates a new "implicit from scope" metavariable+-- of type @t@ with name suggestion @s@ and initial solution candidates @cands@.+newIFSMeta :: MetaNameSuggestion -> Type -> [(Term, Type)] -> TCM Term+newIFSMeta s t cands = do vs <- getContextArgs tel <- getContextTelescope- newIFSMetaCtx (telePi_ tel t) vs+ newIFSMetaCtx s (telePi_ tel t) vs cands -- | Create a new value meta with specific dependencies.-newIFSMetaCtx :: Type -> Args -> TCM Term-newIFSMetaCtx t vs = do- i <- createMetaInfo+newIFSMetaCtx :: MetaNameSuggestion -> Type -> Args -> [(Term, Type)] -> TCM Term+newIFSMetaCtx s t vs cands = do+ reportSDoc "tc.meta.new" 50 $ fsep+ [ text "new ifs meta:"+ , nest 2 $ prettyTCM vs <+> text "|-"+ ]+ i0 <- createMetaInfo+ let i = i0 { miNameSuggestion = s } let TelV tel _ = telView' t perm = idP (size tel) x <- newMeta' OpenIFS i normalMetaPriority perm (HasType () t) reportSDoc "tc.meta.new" 50 $ fsep- [ text "new ifs meta:"- , nest 2 $ prettyTCM vs <+> text "|-"- , nest 2 $ text (show x) <+> text ":" <+> prettyTCM t+ [ nest 2 $ text (show x) <+> text ":" <+> prettyTCM t ]- solveConstraint_ $ FindInScope x+ solveConstraint_ $ FindInScope x cands return (MetaV x vs) ++newNamedValueMeta :: RunMetaOccursCheck -> MetaNameSuggestion -> Type -> TCM Term+newNamedValueMeta b s t = do+ v <- newValueMeta b t+ setValueMetaName v s+ return v+ -- | Create a new metavariable, possibly η-expanding in the process.-newValueMeta :: Type -> TCM Term-newValueMeta t = do+newValueMeta :: RunMetaOccursCheck -> Type -> TCM Term+newValueMeta b t = do vs <- getContextArgs tel <- getContextTelescope- newValueMetaCtx (telePi_ tel t) vs+ newValueMetaCtx b (telePi_ tel t) vs -newValueMetaCtx :: Type -> Args -> TCM Term-newValueMetaCtx t ctx = do- m@(MetaV i _) <- newValueMetaCtx' t ctx- instantiateFull m+newValueMetaCtx :: RunMetaOccursCheck -> Type -> Args -> TCM Term+newValueMetaCtx b t ctx =+ instantiateFull =<< newValueMetaCtx' b t ctx -- | Create a new value meta without η-expanding.-newValueMeta' :: Type -> TCM Term-newValueMeta' t = do+newValueMeta' :: RunMetaOccursCheck -> Type -> TCM Term+newValueMeta' b t = do vs <- getContextArgs tel <- getContextTelescope- newValueMetaCtx' (telePi_ tel t) vs+ newValueMetaCtx' b (telePi_ tel t) vs -- | Create a new value meta with specific dependencies.-newValueMetaCtx' :: Type -> Args -> TCM Term-newValueMetaCtx' t vs = do- i <- createMetaInfo- let TelV tel _ = telView' t+newValueMetaCtx' :: RunMetaOccursCheck -> Type -> Args -> TCM Term+newValueMetaCtx' b t vs = do+ i <- createMetaInfo' b+ let TelV tel a = telView' t perm = idP (size tel) x <- newMeta i normalMetaPriority perm (HasType () t) reportSDoc "tc.meta.new" 50 $ fsep@@ -189,30 +214,43 @@ , nest 2 $ text (show x) <+> text ":" <+> prettyTCM t ] etaExpandMetaSafe x- return $ MetaV x vs+ -- Andreas, 2012-09-24: for Metas X : Size< u add constraint X+1 <= u+ let u = shared $ MetaV x vs+ boundedSizeMetaHook u tel a+ return u newTelMeta :: Telescope -> TCM Args newTelMeta tel = newArgsMeta (abstract tel $ El Prop $ Sort Prop) +type Condition = Dom Type -> Abs Type -> Bool+trueCondition _ _ = True+ newArgsMeta :: Type -> TCM Args-newArgsMeta t = do+newArgsMeta = newArgsMeta' trueCondition++newArgsMeta' :: Condition -> Type -> TCM Args+newArgsMeta' condition t = do args <- getContextArgs tel <- getContextTelescope- newArgsMetaCtx t tel args+ newArgsMetaCtx' condition t tel args newArgsMetaCtx :: Type -> Telescope -> Args -> TCM Args-newArgsMetaCtx (El s tm) tel ctx = do+newArgsMetaCtx = newArgsMetaCtx' trueCondition++newArgsMetaCtx' :: Condition -> Type -> Telescope -> Args -> TCM Args+newArgsMetaCtx' condition (El s tm) tel ctx = do tm <- reduce tm- case tm of- Pi (Arg h r a) _ -> do- arg <- (Arg h r) <$>+ case ignoreSharing tm of+ Pi dom@(Dom h r a) codom | condition dom codom -> do+ arg <- (Arg h r) <$> do+ applyRelevanceToContext r $ {- -- Andreas, 2010-09-24 skip irrelevant record fields when eta-expanding a meta var -- Andreas, 2010-10-11 this is WRONG, see Issue 347 if r == Irrelevant then return DontCare else -}- newValueMetaCtx (telePi_ tel a) ctx- args <- newArgsMetaCtx (El s tm `piApply` [arg]) tel ctx+ newValueMetaCtx RunMetaOccursCheck (telePi_ tel a) ctx+ args <- newArgsMetaCtx' condition (El s tm `piApply` [arg]) tel ctx return $ arg : args _ -> return [] @@ -233,8 +271,11 @@ newQuestionMark :: Type -> TCM Term newQuestionMark t = do- m@(MetaV x _) <- newValueMeta' t- ii <- fresh+ -- Do not run check for recursive occurrence of meta in definitions,+ -- because we want to give the recursive solution interactively (Issue 589)+ m <- newValueMeta' DontRunMetaOccursCheck t+ let MetaV x _ = ignoreSharing m+ ii <- fresh addInteractionPoint ii x return m @@ -246,7 +287,8 @@ blockTermOnProblem :: Type -> Term -> ProblemId -> TCM Term blockTermOnProblem t v pid =- ifM (isProblemSolved pid) (return v) $ do+ -- Andreas, 2012-09-27 do not block on unsolved size constraints+ ifM (isProblemSolved pid `or2M` isSizeProblem pid) (return v) $ do i <- createMetaInfo vs <- getContextArgs tel <- getContextTelescope@@ -254,9 +296,9 @@ i lowMetaPriority (idP $ size tel) (HasType () $ telePi_ tel t) -- we don't instantiate blocked terms- escapeContext (size tel) $ addConstraint (Guarded (UnBlock x) pid)+ escapeContextToTopLevel $ addConstraint (Guarded (UnBlock x) pid) reportSDoc "tc.meta.blocked" 20 $ vcat- [ text "blocked" <+> prettyTCM x <+> text ":=" <+> escapeContext (size tel) (prettyTCM $ abstract tel v)+ [ text "blocked" <+> prettyTCM x <+> text ":=" <+> escapeContextToTopLevel (prettyTCM $ abstract tel v) , text " by" <+> (prettyTCM =<< getConstraintsForProblem pid) ] inst <- isInstantiatedMeta x case inst of@@ -266,8 +308,8 @@ -- that we compare against the blocked term once it's unblocked. This way -- blocked terms can be instantiated before they are unblocked, thus making -- constraint solving a bit more robust against instantiation order.- v <- newValueMeta t- i <- liftTCM (fresh :: TCM Integer)+ v <- newValueMeta DontRunMetaOccursCheck t+ i <- liftTCM fresh -- This constraint is woken up when unblocking, so it doesn't need a problem id. cmp <- buildProblemConstraint 0 (ValueCmp CmpEq t v (MetaV x vs)) listenToMeta (CheckConstraint i cmp) x@@ -277,12 +319,15 @@ -- -- Auxiliary function to create a postponed type checking problem. unblockedTester :: Type -> TCM Bool+unblockedTester t = ifBlocked (unEl t) (\ m t -> return False) (\ t -> return True)+{- OLD CODE unblockedTester t = do t <- reduceB $ unEl t- case t of+ case ignoreSharing <$> t of Blocked{} -> return False NotBlocked MetaV{} -> return False _ -> return True+-} -- | Create a postponed type checking problem @e : t@ that waits for type @t@ -- to unblock (become instantiated or its constraints resolved).@@ -296,17 +341,24 @@ -- is added for this meta, which links to this meta. postponeTypeCheckingProblem :: A.Expr -> Type -> TCM Bool -> TCM Term postponeTypeCheckingProblem e t unblock = do- i <- createMetaInfo+ i <- createMetaInfo' DontRunMetaOccursCheck tel <- getContextTelescope cl <- buildClosure (e, t, unblock) m <- newMeta' (PostponedTypeCheckingProblem cl) i normalMetaPriority (idP (size tel)) $ HasType () $ telePi_ tel t+ -- Create the meta that we actually return- v <- newValueMeta t- i <- liftTCM (fresh :: TCM Integer)+ -- Andreas, 2012-03-15+ -- This is an alias to the pptc meta, in order to allow pruning (issue 468)+ -- and instantiation.+ -- Since this meta's solution comes from user code, we do not need+ -- to run the extended occurs check (metaOccurs) to exclude+ -- non-terminating solutions. vs <- getContextArgs+ v <- newValueMeta DontRunMetaOccursCheck t cmp <- buildProblemConstraint 0 (ValueCmp CmpEq t v (MetaV m vs))+ i <- liftTCM fresh listenToMeta (CheckConstraint i cmp) m addConstraint (UnBlock m) return v@@ -340,7 +392,7 @@ -- ^ Meta variables of \"hereditarily singleton\" record type. | Levels -- ^ Meta variables of level type, if type-in-type is activated.- deriving (Eq, Enum, Bounded)+ deriving (Eq, Enum, Bounded, Show) -- | All possible metavariable kinds. @@ -352,51 +404,70 @@ etaExpandMeta :: [MetaKind] -> MetaId -> TCM () etaExpandMeta kinds m = whenM (isEtaExpandable m) $ do verboseBracket "tc.meta.eta" 20 ("etaExpandMeta " ++ show m) $ do- meta <- lookupMeta m+ let waitFor x = do+ reportSDoc "tc.meta.eta" 20 $ do+ text "postponing eta-expansion of meta variable" <+>+ prettyTCM m <+>+ text "which is blocked by" <+> prettyTCM x+ listenToMeta (EtaExpand m) x+ dontExpand = do+ reportSDoc "tc.meta.eta" 20 $ do+ text "we do not expand meta variable" <+> prettyTCM m <+>+ text ("(requested was expansion of " ++ show kinds ++ ")")+ meta <- lookupMeta m let HasType _ a = mvJudgement meta- TelV tel b <- telViewM a- let args = [ Arg h r $ Var i []- | (i, Arg h r _) <- reverse $ zip [0..] $ reverse $ telToList tel- ]- bb <- reduceB b -- the target in the type @a@ of @m@- case unEl <$> bb of+ TelV tel b <- telView a+{- OLD CODE+ bb <- reduceB b -- the target in the type @a@ of @m@+ case ignoreSharing . unEl <$> bb of -- if the target type of @m@ is a meta variable @x@ itself -- (@NonBlocked (MetaV{})@), -- or it is blocked by a meta-variable @x@ (@Blocked@), we cannot -- eta expand now, we have to postpone this. Once @x@ is -- instantiated, we can continue eta-expanding m. This is realized -- by adding @m@ to the listeners of @x@.- Blocked x _ -> listenToMeta (EtaExpand m) x- NotBlocked (MetaV x _) -> listenToMeta (EtaExpand m) x+ Blocked x _ -> waitFor x+ NotBlocked (MetaV x _) -> waitFor x NotBlocked lvl@(Def r ps) ->+-}+ -- if the target type @b@ of @m@ is a meta variable @x@ itself+ -- (@NonBlocked (MetaV{})@),+ -- or it is blocked by a meta-variable @x@ (@Blocked@), we cannot+ -- eta expand now, we have to postpone this. Once @x@ is+ -- instantiated, we can continue eta-expanding m. This is realized+ -- by adding @m@ to the listeners of @x@.+ ifBlocked (unEl b) (\ x _ -> waitFor x) $ \ t -> case ignoreSharing t of+ lvl@(Def r ps) -> ifM (isEtaRecord r) (do let expand = do- u <- withMetaInfo (mvInfo meta) $ newRecordMetaCtx r ps tel args- inContext [] $ addCtxTel tel $ do+ u <- abstract tel <$> do withMetaInfo' meta $ newRecordMetaCtx r ps tel $ teleArgs tel+ inTopContext $ do verboseS "tc.meta.eta" 15 $ do du <- prettyTCM u- liftIO $ LocIO.putStrLn $ "eta expanding: " ++ show m ++ " --> " ++ show du- noConstraints $ assignV m args u -- should never produce any constraints+ reportSLn "" 0 $ "eta expanding: " ++ show m ++ " --> " ++ show du+ -- Andreas, 2012-03-29: No need for occurrence check etc.+ -- we directly assign the solution for the meta+ -- 2012-05-23: We also bypass the check for frozen.+ noConstraints $ assignTerm' m u -- should never produce any constraints if Records `elem` kinds then expand- else if SingletonRecords `elem` kinds then do- singleton <- isSingletonRecord r ps- case singleton of- Left x -> listenToMeta (EtaExpand m) x- Right False -> return ()- Right True -> expand- else- return ()- ) $ when (Levels `elem` kinds) $ do- mlvl <- getBuiltin' builtinLevel- tt <- typeInType- if tt && Just lvl == mlvl- then do- reportSLn "tc.meta.eta" 20 $ "Expanding level meta to 0 (type-in-type)"- noConstraints $ assignV m args (Level $ Max [])- else- return ()- _ -> return ()+ else if (SingletonRecords `elem` kinds) then do+ singleton <- isSingletonRecord r ps+ case singleton of+ Left x -> waitFor x+ Right False -> dontExpand+ Right True -> expand+ else dontExpand+ ) $ ifM (andM [ return $ Levels `elem` kinds+ , typeInType+ , (Just lvl ==) <$> getBuiltin' builtinLevel+ ]) (do+ reportSLn "tc.meta.eta" 20 $ "Expanding level meta to 0 (type-in-type)"+ -- Andreas, 2012-03-30: No need for occurrence check etc.+ -- we directly assign the solution for the meta+ noConstraints $ assignTerm m (abstract tel $ Level $ Max [])+ ) $ dontExpand+ _ -> dontExpand -- | Eta expand blocking metavariables of record type, and reduce the -- blocked thing.@@ -422,7 +493,7 @@ -- restoration of the original constraints. assignV :: MetaId -> Args -> Term -> TCM ()-assignV x args v = do+assignV x args v = ifM (not <$> asks envAssignMetas) patternViolation $ do reportSDoc "tc.meta.assign" 10 $ do text "term" <+> prettyTCM (MetaV x args) <+> text ":=" <+> prettyTCM v liftTCM $ nowSolvingConstraints (assign x args v) `finally` solveAwakeConstraints@@ -430,6 +501,7 @@ -- | @assign sort? x vs v@ assign :: MetaId -> Args -> Term -> TCM () assign x args v = do+ mvar <- lookupMeta x -- information associated with meta x -- Andreas, 2011-05-20 TODO!@@ -446,8 +518,8 @@ v <- instantiate v reportSLn "tc.meta.assign" 50 $ "MetaVars.assign: assigning to " ++ show v - case (v, mvJudgement mvar) of- (Sort Inf, HasType{}) -> typeError $ GenericError "Setω is not a valid type."+ case (ignoreSharing v, mvJudgement mvar) of+ (Sort Inf, HasType{}) -> typeError SetOmegaNotValidType _ -> return () -- We don't instantiate frozen mvars@@ -475,18 +547,25 @@ -- even though the lhs is not a pattern, we can prune the y from _2 let varsL = freeVars args let relVL = Set.toList $ relevantVars varsL+{- Andreas, 2012-04-02: DontCare no longer present+ -- take away top-level DontCare constructors+ args <- return $ map (fmap stripDontCare) args+-} -- Andreas, 2011-10-06 only irrelevant vars that are direct -- arguments to the meta, hence, can be abstracted over, may -- appear on the rhs. (test/fail/Issue483b)- -- let irrVL = Set.toList $ irrelevantVars varsL- let fromIrrVar (Arg h Irrelevant (Var i [])) = [i]- fromIrrVar (Arg h Irrelevant (DontCare (Var i []))) = [i]- fromIrrVar _ = []- let irrVL = concat $ map fromIrrVar args+ -- Update 2011-03-27: Also irr. vars under record constructors.+ let fromIrrVar (Var i []) = return [i]+ fromIrrVar (Con c vs) =+ ifM (isNothing <$> isRecordConstructor c) (return []) $+ concat <$> mapM (fromIrrVar . {- stripDontCare .-} unArg) vs+ fromIrrVar (Shared p) = fromIrrVar (derefPtr p)+ fromIrrVar _ = return []+ irrVL <- concat <$> mapM fromIrrVar+ [ v | Arg h r v <- args, irrelevantOrUnused r ] reportSDoc "tc.meta.assign" 20 $ let pr (Var n []) = text (show n) pr (Def c []) = prettyTCM c- pr (DontCare v) = pr v pr _ = text ".." in vcat [ text "mvar args:" <+> sep (map (pr . unArg) args)@@ -504,15 +583,11 @@ reportSLn "tc.meta.assign" 15 "passed occursCheck" verboseS "tc.meta.assign" 30 $ do let n = size v- when (n > 200) $ do- d <- sep [ text "size" <+> text (show n)--- , nest 2 $ text "type" <+> prettyTCM t- , nest 2 $ text "term" <+> prettyTCM v- ]- liftIO $ LocIO.print d-- -- Check that the arguments are variables- ids <- checkAllVars args+ when (n > 200) $ reportSDoc "" 0 $+ sep [ text "size" <+> text (show n)+-- , nest 2 $ text "type" <+> prettyTCM t+ , nest 2 $ text "term" <+> prettyTCM v+ ] -- Check linearity of @ids@ -- Andreas, 2010-09-24: Herein, ignore the variables which are not@@ -523,23 +598,27 @@ reportSDoc "tc.meta.assign" 20 $ text "fvars rhs:" <+> sep (map (text . show) $ Set.toList fvs) - unless (distinct $ filter (`Set.member` fvs) ids) $ do- -- non-linear lhs: we cannot solve, but prune- killResult <- prune x args $ Set.toList fvs- reportSDoc "tc.meta.assign" 10 $- text "pruning" <+> prettyTCM x <+> (text $- if killResult `elem` [PrunedSomething,PrunedEverything] then "succeeded"- else "failed")- patternViolation+ -- Check that the arguments are variables+ ids <- do+ res <- runErrorT $ inverseSubst args+ case res of+ -- all args are variables+ Right (Just ids) -> do+ reportSDoc "tc.meta.assign" 50 $+ text "inverseSubst returns:" <+> sep (map prettyTCM ids)+ return ids+ -- we have non-variables, but these are not eliminateable+ Right Nothing -> attemptPruning x args fvs+ -- we have proper values as arguments which could be cased on+ -- here, we cannot prune, since offending vars could be eliminated+ Left () -> patternViolation -{- Andreas, 2011-04-21 this does not work- if not (distinct $ filter (`Set.member` fvs) ids) then do- -- non-linear lhs: we cannot solve, but prune- ok <- prune x args $ Set.toList fvs- if ok then return [] else patternViolation+ ids <- do+ res <- runErrorT $ checkLinearity (`Set.member` fvs) ids+ case res of+ Right ids -> return ids+ Left () -> attemptPruning x args fvs - else do--} -- we are linear, so we can solve! reportSDoc "tc.meta.assign" 25 $ text "preparing to instantiate: " <+> prettyTCM v@@ -551,13 +630,13 @@ -- ids = d b e -- then -- v' = (λ a b c d e. v) _ 1 _ 2 0- tel <- getContextTelescope- gamma <- map defaultArg <$> getContextTerms- let iargs = reverse $ zipWith (rename ids) [0..] $ reverse gamma+ tel <- getContextTelescope+ let iargs = map (defaultArg . substitute ids) $ downFrom $ size tel v' = raise (size args) (abstract tel v) `apply` iargs- return v'+ -- instantiateFull v'+ return v' - -- Andreas, 2011-04-18 to work with irrelevant parameters DontCare+ -- Andreas, 2011-04-18 to work with irrelevant parameters -- we need to construct tel' from the type of the meta variable -- (no longer from ids which may not be the complete variable list -- any more)@@ -565,7 +644,7 @@ reportSDoc "tc.meta.assign" 15 $ text "type of meta =" <+> prettyTCM t -- reportSDoc "tc.meta.assign" 30 $ text "type of meta =" <+> text (show t) - TelV tel0 core0 <- telViewM t+ TelV tel0 core0 <- telView t let n = length args reportSDoc "tc.meta.assign" 30 $ text "tel0 =" <+> prettyTCM tel0 reportSDoc "tc.meta.assign" 30 $ text "#args =" <+> text (show n)@@ -577,58 +656,147 @@ -- Perform the assignment (and wake constraints). Metas -- are top-level so we do the assignment at top-level.- n <- size <$> getContextTelescope- escapeContext n $ assignTerm x $ killRange (abstract tel' v')+ inTopContext $ assignTerm x (killRange $ abstract tel' v') return () where- -- @ids@ are the lhs variables (metavar arguments)+ -- @ids@ maps lhs variables (metavar arguments) to terms -- @i@ is the variable from the context Gamma- rename :: [Nat] -> Nat -> Arg Term -> Arg Term- rename ids i arg = case findIndex (==i) ids of- Just j -> fmap (const $ Var (fromIntegral j) []) arg- Nothing -> fmap (const __IMPOSSIBLE__) arg -- we will end up here, but never look at the result+ substitute :: [(Nat,Term)] -> Nat -> Term+ substitute ids i = maybe __IMPOSSIBLE__ id $ lookup i ids + attemptPruning x args fvs = do+ -- non-linear lhs: we cannot solve, but prune+ killResult <- prune x args $ Set.toList fvs+ reportSDoc "tc.meta.assign" 10 $+ text "pruning" <+> prettyTCM x <+> (text $+ if killResult `elem` [PrunedSomething,PrunedEverything] then "succeeded"+ else "failed")+ patternViolation+++-- cannot move this PrettyTCM instance to Typechecking.Pretty+-- because then it conflicts with an instance in Typechecking.Positivity+instance (PrettyTCM a, PrettyTCM b) => PrettyTCM (a,b) where+ prettyTCM (a, b) = parens $ prettyTCM a <> comma <> prettyTCM b+ type FVs = Set.VarSet+type SubstCand = [(Nat,Term)] -- ^ a possibly non-deterministic substitution --- | Check that arguments to a metavar are in pattern fragment.--- Assumes all arguments already in whnf.+instance Error () where+ noMsg = ()++-- | Turn non-det substitution into proper substitution, if possible.+-- The substitution can be restricted to @elemFVs@+checkLinearity :: (Nat -> Bool) -> SubstCand -> ErrorT () TCM SubstCand+checkLinearity elemFVs ids0 = do+ let ids = sortBy (compare `on` fst) $ filter (elemFVs . fst) ids0+ let grps = groupOn fst ids+ concat <$> mapM makeLinear grps+ where+ -- | Non-determinism can be healed if type is singleton. [Issue 593]+ -- (Same as for irrelevance.)+ makeLinear :: SubstCand -> ErrorT () TCM SubstCand+ makeLinear [] = __IMPOSSIBLE__+ makeLinear grp@[_] = return grp+ makeLinear (p@(i,t) : _) =+ ifM ((Right True ==) <$> do isSingletonTypeModuloRelevance =<< typeOfBV i)+ (return [p])+ (throwError ())++-- Intermediate result in the following function+type Res = Maybe [(Arg Nat, Term)]++-- | Check that arguments @args@ to a metavar are in pattern fragment.+-- Assumes all arguments already in whnf and eta-reduced. -- Parameters are represented as @Var@s so @checkArgs@ really--- checks that all args are @Var@s and returns the--- list of corresponding indices for each arg.--- Linearity has to be checked separately.+-- checks that all args are @Var@s and returns the "substitution"+-- to be applied to the rhs of the equation to solve.+-- (If @args@ is considered a substitution, its inverse is returned.) ----- @reverse@ is necessary because we are directly abstracting over this list @ids@.-checkAllVars :: Args -> TCM [Nat]-checkAllVars args =- case allVarOrIrrelevant args of- Nothing -> do- reportSDoc "tc.meta.assign" 15 $ vcat [ text "not all variables: " <+> prettyTCM args- , text " aborting assignment" ]- patternViolation- Just is -> return $ map unArg is+-- The returned list might not be ordered.+-- Linearity, i.e., whether the substitution is deterministic,+-- has to be checked separately.+--+inverseSubst :: Args -> ErrorT () TCM (Maybe SubstCand)+inverseSubst args = fmap (map (mapFst unArg)) <$> loop (zip args terms)+ where+ loop = foldM isVarOrIrrelevant (Just [])+ terms = map var (downFrom (size args))+ failure = do+ lift $ reportSDoc "tc.meta.assign" 15 $ vcat+ [ text "not all arguments are variables: " <+> prettyTCM args+ , text " aborting assignment" ]+ throwError () --- | filter out irrelevant args and check that all others are variables.--- Return the reversed list of variables.-allVarOrIrrelevant :: Args -> Maybe [Arg Nat]-allVarOrIrrelevant args = foldM isVarOrIrrelevant [] args where- isVarOrIrrelevant vars arg =- case arg of- Arg h r (Var i []) -> return $ Arg h r i : removeIrr i vars- Arg h Irrelevant (DontCare (Var i [])) -> return $ addIrrIfNotPresent h i vars- -- Andreas, 2011-04-27 keep irrelevant variables- Arg h Irrelevant _ -> return $ Arg h Irrelevant (-1) : vars -- any impossible deBruijn index will do (see Jason Reed, LFMTP 09 "_" or Nipkow "minus infinity")- _ -> Nothing- -- in case of non-linearity make sure not to count the irrelevant vars- addIrrIfNotPresent h i vars- | any (\ (Arg _ _ j) -> j == i) vars = Arg h Irrelevant (-1) : vars- | otherwise = Arg h Irrelevant i : vars- removeIrr i = map (\ a@(Arg h r j) ->- if r == Irrelevant && i == j then Arg h Irrelevant (-1) else a)+ isVarOrIrrelevant :: Res -> (Arg Term, Term) -> ErrorT () TCM Res+ isVarOrIrrelevant vars (arg, t) =+ case ignoreSharing <$> arg of+ -- i := x+ Arg h r (Var i []) -> return $ (Arg h r i, t) `cons` vars + -- (i, j) := x becomes [i := fst x, j := snd x]+ Arg h r (Con c vs) -> do+ isRC <- lift $ isRecordConstructor c+ case isRC of+ Just (_, Record{ recFields = fs }) -> do+ let aux (Arg _ _ v) (Arg h' r' f) =+ (Arg (min h h') (max r r') v, -- OLD: (stripDontCare v),+ Def f [defaultArg t])+ res <- loop $ zipWith aux vs fs+ return $ res `append` vars+ Just _ -> __IMPOSSIBLE__+ Nothing | irrelevantOrUnused r -> return vars+ | otherwise -> failure + -- An irrelevant argument which is not an irrefutable pattern is dropped+ Arg h r _ | irrelevantOrUnused r -> return vars++ -- Distinguish args that can be eliminated (Con,Lit,Lam,unsure) ==> failure+ -- from those that can only put somewhere as a whole ==> return Nothing+ Arg _ _ Var{} -> return $ Nothing -- neutral+ Arg _ _ v@(Def{}) -> do+ elV <- lift $ elimView v+ case elV of+ VarElim{} -> return $ Nothing -- neutral+ _ -> failure+ Arg _ _ Lam{} -> failure+ Arg _ _ Lit{} -> failure+ Arg _ _ MetaV{} -> failure+ Arg _ _ Pi{} -> return $ Nothing+ Arg _ _ Sort{} -> return $ Nothing+ Arg _ _ Level{} -> return $ Nothing+ Arg _ _ DontCare{} -> __IMPOSSIBLE__++ Arg h r (Shared p) -> isVarOrIrrelevant vars (Arg h r $ derefPtr p, t)++ -- managing an assoc list where duplicate indizes cannot be irrelevant vars+ append :: Res -> Res -> Res+ append Nothing _ = Nothing+ append (Just res) vars = foldr cons vars res++ -- adding an irrelevant entry only if not present+ cons :: (Arg Nat, Term) -> Res -> Res+ cons a Nothing = Nothing+ cons a@(Arg h Irrelevant i, t) (Just vars) -- TODO? UnusedArg?!+ | any ((i==) . unArg . fst) vars = Just vars+ | otherwise = Just $ a : vars+ -- adding a relevant entry:+ cons a@(Arg h r i, t) (Just vars) = Just $ a :+ -- filter out duplicate irrelevants+ filter (not . (\ a@(Arg h r j, t) -> r == Irrelevant && i == j)) vars+ updateMeta :: MetaId -> Term -> TCM () updateMeta mI v = do mv <- lookupMeta mI- withMetaInfo (getMetaInfo mv) $ do+ withMetaInfo' mv $ do args <- getContextArgs noConstraints $ assignV mI args v++-- | Returns every meta-variable occurrence in the given type, except+-- for those in 'Sort's.++allMetas :: Type -> [MetaId]+allMetas = foldTerm metas+ where+ metas (MetaV m _) = [m]+ metas _ = []
src/full/Agda/TypeChecking/MetaVars.hs-boot view
@@ -1,9 +1,17 @@ module Agda.TypeChecking.MetaVars where -import Agda.Syntax.Internal ( MetaId, Term, Sort, Type, Args )-import Agda.TypeChecking.Monad.Base ( TCM )+import Agda.Syntax.Common ( Dom )+import Agda.Syntax.Internal ( MetaId, Term, Sort, Type, Args, Abs )+import Agda.TypeChecking.Monad.Base ( TCM, RunMetaOccursCheck(..) ) +type Condition = Dom Type -> Abs Type -> Bool+newArgsMeta' :: Condition -> Type -> TCM Args+newArgsMeta :: Type -> TCM Args assignTerm :: MetaId -> Term -> TCM () etaExpandMetaSafe :: MetaId -> TCM () assignV :: MetaId -> Args -> Term -> TCM ()+assign :: MetaId -> Args -> Term -> TCM ()+newIFSMeta :: String -> Type -> [(Term, Type)] -> TCM Term+newValueMeta :: RunMetaOccursCheck -> Type -> TCM Term+newNamedValueMeta :: RunMetaOccursCheck -> String -> Type -> TCM Term
src/full/Agda/TypeChecking/MetaVars/Mention.hs view
@@ -24,6 +24,7 @@ Level l -> mm l DontCare v -> False -- we don't have to look inside don't cares when deciding to wake constraints MetaV y args -> x == y || mm args -- TODO: we really only have to look one level deep at meta args+ Shared p -> mm $ derefPtr p where mm v = mentionsMeta x v @@ -55,8 +56,12 @@ mentionsMeta x = mentionsMeta x . unAbs instance MentionsMeta t => MentionsMeta (Arg t) where- mentionsMeta x = mentionsMeta x . unArg+ mentionsMeta x (Arg h Irrelevant t) = False -- we don't have to look inside irrelevant arguments when deciding to wake constraints+ mentionsMeta x a = mentionsMeta x (unArg a) +instance MentionsMeta t => MentionsMeta (Dom t) where+ mentionsMeta x = mentionsMeta x . unDom+ instance MentionsMeta t => MentionsMeta [t] where mentionsMeta x = any (mentionsMeta x) @@ -95,8 +100,8 @@ UnBlock _ -> True -- this might be a postponed typechecking -- problem and we don't have a handle on -- what metas it depends on- FindInScope m -> True -- this needs to be woken up for any meta- IsEmpty t -> mm t+ FindInScope{} -> True -- this needs to be woken up for any meta+ IsEmpty r t -> mm t where mm v = mentionsMeta x v
src/full/Agda/TypeChecking/MetaVars/Occurs.hs view
@@ -5,6 +5,13 @@ import Control.Applicative import Control.Monad import Control.Monad.Error+import Control.Monad.Reader+import Control.Monad.State++import Data.List+import Data.Maybe+import Data.Set (Set)+import qualified Data.Set import Data.Traversable (traverse) import Agda.Syntax.Common@@ -15,7 +22,9 @@ import Agda.TypeChecking.Free hiding (Occurrence(..)) import Agda.TypeChecking.Substitute import Agda.TypeChecking.EtaContract-import Agda.TypeChecking.Datatypes (isDataOrRecordType)+import Agda.TypeChecking.Eliminators+import Agda.TypeChecking.Records+import Agda.TypeChecking.Datatypes (isDataOrRecordType, DataOrRecord(..)) import {-# SOURCE #-} Agda.TypeChecking.MetaVars import Agda.Utils.Monad@@ -26,10 +35,66 @@ import Agda.Utils.Impossible #include "../../undefined.h" +{- To address issue 585 (meta var occurrences in mutual defs)++data B : Set where+ inn : A -> B++out : B -> A+out (inn a) = a++postulate+ P : (y : A) (z : Unit -> B) → Set+ p : (x : Unit -> B) → P (out (x unit)) x++mutual+ d : Unit -> B+ d unit = inn _ -- Y++ g : P (out (d unit)) d+ g = p _ -- X++-- Agda solves d unit = inn (out (d unit))+--+-- out (X unit) = out (d unit) = out (inn Y) = Y+-- X = d++When doing the occurs check on d, we need to look at the definition of+d to discover that it mentions X.++To this end, we extend the state by names of definitions that have to+be checked when they occur. At the beginning, this is initialized+with the names in the current mutual block. Each time we encounter a+name in the list during occurs check, we delete it (if check is+successful). This way, we do not duplicate work.++-}++modifyOccursCheckDefs :: (Set QName -> Set QName) -> TCM ()+modifyOccursCheckDefs f = modify $ \ st ->+ st { stOccursCheckDefs = f (stOccursCheckDefs st) }++-- | Set the names of definitions to be looked at+-- to the defs in the current mutual block.+initOccursCheck :: MetaVariable -> TCM ()+initOccursCheck mv = modifyOccursCheckDefs . const =<<+ if (miMetaOccursCheck (mvInfo mv) == DontRunMetaOccursCheck)+ then return Data.Set.empty+ else maybe (return Data.Set.empty) lookupMutualBlock =<< asks envMutualBlock++-- | Is a def in the list of stuff to be checked?+defNeedsChecking :: QName -> TCM Bool+defNeedsChecking d = Data.Set.member d <$> gets stOccursCheckDefs++-- | Remove a def from the list of defs to be looked at.+tallyDef :: QName -> TCM ()+tallyDef d = modifyOccursCheckDefs $ \ s -> Data.Set.delete d s+ data OccursCtx = Flex -- ^ we are in arguments of a meta | Rigid -- ^ we are not in arguments of a meta but a bound var | StronglyRigid -- ^ we are at the start or in the arguments of a constructor+ | Top -- ^ we are at the term root (this turns into @StronglyRigid@) | Irrel -- ^ we are in an irrelevant argument deriving (Eq, Show) @@ -44,8 +109,14 @@ unfold NoUnfold v = NotBlocked <$> instantiate v unfold YesUnfold v = reduceB v +-- | Leave the top position.+leaveTop :: OccursCtx -> OccursCtx+leaveTop Top = StronglyRigid+leaveTop ctx = ctx+ -- | Leave the strongly rigid position. weakly :: OccursCtx -> OccursCtx+weakly Top = Rigid weakly StronglyRigid = Rigid weakly ctx = ctx @@ -53,7 +124,8 @@ strongly Rigid = StronglyRigid strongly ctx = ctx -abort :: OccursCtx -> TypeError -> TCM ()+abort :: OccursCtx -> TypeError -> TCM a+abort Top err = typeError err abort StronglyRigid err = typeError err -- here, throw an uncatchable error (unsolvable constraint) abort Flex _ = patternViolation -- throws a PatternErr, which leads to delayed constraint abort Rigid _ = patternViolation@@ -71,30 +143,26 @@ takeRelevant :: Vars -> [Nat] takeRelevant = fst -underAbs :: Vars -> Vars-underAbs (relVs, irrVs) = (0 : map (1+) relVs, map (1+) irrVs)+liftUnderAbs :: Vars -> Vars+liftUnderAbs (relVs, irrVs) = (0 : map (1+) relVs, map (1+) irrVs) -- | Extended occurs check. class Occurs t where occurs :: UnfoldStrategy -> OccursCtx -> MetaId -> Vars -> t -> TCM t+ metaOccurs :: MetaId -> t -> TCM () -- raise exception if meta occurs in t -- | When assigning @m xs := v@, check that @m@ does not occur in @v@ -- and that the free variables of @v@ are contained in @xs@. occursCheck :: MetaId -> Vars -> Term -> TCM Term occursCheck m xs v = liftTCM $ do- let bailOnSelf v = do- v <- instantiate v- case v of- -- Don't fail if trying to instantiate to just itself- MetaV m' _ | m == m' -> patternViolation- Level (Max [Plus 0 (MetaLevel m' _)])- | m == m' -> patternViolation- _ -> return v-- v <- bailOnSelf v+ mv <- lookupMeta m+ initOccursCheck mv+ -- TODO: Can we do this in a better way?+ let redo m = m -- disableDestructiveUpdate m >> m -- First try without normalising the term- occurs NoUnfold StronglyRigid m xs v `catchError` \_ -> do- occurs YesUnfold StronglyRigid m xs v `catchError` \err -> case errError err of+ redo (occurs NoUnfold Top m xs v) `catchError` \_ -> do+ initOccursCheck mv+ redo (occurs YesUnfold Top m xs v) `catchError` \err -> case err of -- Produce nicer error messages TypeError _ cl -> case clValue cl of MetaOccursInItself{} ->@@ -130,54 +198,47 @@ NotBlocked v -> occurs' ctx v where occurs' ctx v = case v of- Var i vs -> do -- abort Rigid turns this error into PatternErr- unless (i `allowedVar` xs) $ abort (strongly ctx) $ MetaCannotDependOn m (takeRelevant xs) i- Var i <$> occ (weakly ctx) vs- Lam h f -> Lam h <$> occ ctx f- Level l -> Level <$> occ ctx l+ Var i vs -> do+ if (i `allowedVar` xs) then Var i <$> occ (weakly ctx) vs else do+ -- if the offending variable is of singleton type,+ -- eta-expand it away+ isST <- isSingletonType =<< typeOfBV i+ case isST of+ -- cannot decide, blocked by meta-var+ Left mid -> patternViolation+ -- not a singleton type+ Right Nothing -> -- abort Rigid turns this error into PatternErr+ abort (strongly ctx) $ MetaCannotDependOn m (takeRelevant xs) i+ -- is a singleton type with unique inhabitant sv+ Right (Just sv) -> return $ sv `apply` vs+ Lam h f -> Lam h <$> occ (leaveTop ctx) f+ Level l -> Level <$> occ ctx l -- stay in Top Lit l -> return v DontCare v -> DontCare <$> occurs red Irrel m (goIrrelevant xs) v- Def d vs -> Def d <$> occDef d ctx vs- Con c vs -> Con c <$> occ ctx vs -- if strongly rigid, remain so- Pi a b -> uncurry Pi <$> occ ctx (a,b)- Sort s -> Sort <$> occ ctx s+ Def d vs -> Def d <$> occDef d (leaveTop ctx) vs+ Con c vs -> Con c <$> occ (leaveTop ctx) vs -- if strongly rigid, remain so+ Pi a b -> uncurry Pi <$> occ (leaveTop ctx) (a,b)+ Sort s -> Sort <$> occ (leaveTop ctx) s+ v@Shared{} -> updateSharedTerm (occ ctx) v MetaV m' vs -> do -- Check for loop -- don't fail hard on this, since we might still be on the top-level -- after some killing (Issue 442)- when (m == m') $ patternViolation+ when (m == m') $ if ctx == Top then patternViolation else+ abort ctx $ MetaOccursInItself m' -- The arguments of a meta are in a flexible position (MetaV m' <$> occurs red Flex m xs vs) `catchError` \err -> do reportSDoc "tc.meta.kill" 25 $ vcat [ text $ "error during flexible occurs check, we are " ++ show ctx- , text $ show (errError err)+ , text $ show err ]- case errError err of+ case err of -- On pattern violations try to remove offending -- flexible occurrences (if not already in a flexible context) PatternErr{} | ctx /= Flex -> do reportSLn "tc.meta.kill" 20 $ "oops, pattern violation for " ++ show m'-{-- let kills = map (hasBadRigid xs) $ map unArg vs- reportSLn "tc.meta.kill" 20 $- "oops, pattern violation for " ++ show m' ++ "\n" ++- " kills: " ++ show kills- if not (or kills)- then throwError err- else do- reportSDoc "tc.meta.kill" 10 $ vcat- [ text "attempting kills"- , nest 2 $ vcat- [ text "m' =" <+> text (show m')- , text "xs =" <+> text (show xs)- , text "vs =" <+> prettyList (map prettyTCM vs)- , text "kills =" <+> text (show kills)- ]- ]- ok <- killArgs kills m'--} killResult <- prune m' vs (takeRelevant xs) if (killResult == PrunedEverything) -- after successful pruning, restart occurs check@@ -188,15 +249,69 @@ occ ctx v = occurs red ctx m xs v -- a data or record type constructor propagates strong occurrences -- since e.g. x = List x is unsolvable- occDef d ctx v = ifM (isDataOrRecordType d) (occ ctx v)- (occ (defArgs red ctx) v)+ occDef d ctx vs = do+ def <- theDef <$> getConstInfo d+ whenM (defNeedsChecking d) $ do+ tallyDef d+ metaOccurs m def+ if (defIsDataOrRecord def) then (occ ctx vs) else (occ (defArgs red ctx) vs) + metaOccurs m v = do+ v <- instantiate v+ case v of+ Var i vs -> metaOccurs m vs+ Lam h f -> metaOccurs m f+ Level l -> metaOccurs m l+ Lit l -> return ()+ DontCare v -> metaOccurs m v+ Def d vs -> metaOccurs m d >> metaOccurs m vs+ Con c vs -> metaOccurs m vs+ Pi a b -> metaOccurs m (a,b)+ Sort s -> metaOccurs m s+ Shared p -> metaOccurs m $ derefPtr p+ MetaV m' vs | m == m' -> patternViolation+ | otherwise -> metaOccurs m vs++instance Occurs QName where+ occurs red ctx m xs d = __IMPOSSIBLE__++ metaOccurs m d = whenM (defNeedsChecking d) $ do+ tallyDef d+ metaOccurs m . theDef =<< getConstInfo d++instance Occurs Defn where+ occurs red ctx m xs def = __IMPOSSIBLE__++ metaOccurs m Axiom{} = return ()+ metaOccurs m Function{ funClauses = cls } = metaOccurs m cls+ -- since a datatype is isomorphic to the sum of its constructor types+ -- we check the constructor types+ metaOccurs m Datatype{ dataCons = cs } = mapM_ mocc cs+ where mocc c = metaOccurs m . defType =<< getConstInfo c+ metaOccurs m Record{ recConType = v } = metaOccurs m v+ metaOccurs m Constructor{} = return ()+ metaOccurs m Primitive{} = return ()++instance Occurs Clause where+ occurs red ctx m xs cl = __IMPOSSIBLE__++ metaOccurs m (Clause { clauseBody = body }) = walk body+ where walk NoBody = return ()+ walk (Body v) = metaOccurs m v+ walk (Bind b) = underAbstraction_ b walk+ instance Occurs Level where occurs red ctx m xs (Max as) = Max <$> occurs red ctx m xs as + metaOccurs m (Max as) = metaOccurs m as+ instance Occurs PlusLevel where occurs red ctx m xs l@ClosedLevel{} = return l- occurs red ctx m xs (Plus n l) = Plus n <$> occurs red ctx m xs l+ occurs red ctx m xs (Plus n l) = Plus n <$> occurs red ctx' m xs l+ where ctx' | n == 0 = ctx+ | otherwise = leaveTop ctx -- we leave Top only if we encounter at least one successor+ metaOccurs m ClosedLevel{} = return ()+ metaOccurs m (Plus n l) = metaOccurs m l instance Occurs LevelAtom where occurs red ctx m xs l = do@@ -205,15 +320,26 @@ NoUnfold -> instantiate l case l of MetaLevel m' args -> do- MetaV m' args <- occurs red ctx m xs (MetaV m' args)+ MetaV m' args <- ignoreSharing <$> occurs red ctx m xs (MetaV m' args) return $ MetaLevel m' args NeutralLevel v -> NeutralLevel <$> occurs red ctx m xs v BlockedLevel m v -> BlockedLevel m <$> occurs red Flex m xs v UnreducedLevel v -> UnreducedLevel <$> occurs red ctx m xs v + metaOccurs m l = do+ l <- instantiate l+ case l of+ MetaLevel m' args -> metaOccurs m (MetaV m' args)+ NeutralLevel v -> metaOccurs m v+ BlockedLevel m v -> metaOccurs m v+ UnreducedLevel v -> metaOccurs m v++ instance Occurs Type where occurs red ctx m xs (El s v) = uncurry El <$> occurs red ctx m xs (s,v) + metaOccurs m (El s v) = metaOccurs m (s,v)+ instance Occurs Sort where occurs red ctx m xs s = do s' <- case red of@@ -225,19 +351,45 @@ Prop -> return s' Inf -> return s' -instance Occurs a => Occurs (Abs a) where- occurs red ctx m xs (Abs s x) = Abs s <$> occurs red ctx m (underAbs xs) x- occurs red ctx m xs (NoAbs s x) = NoAbs s <$> occurs red ctx m xs x+ metaOccurs m s = do+ s <- instantiate s+ case s of+ DLub s1 s2 -> metaOccurs m (s1,s2)+ Type a -> metaOccurs m a+ Prop -> return ()+ Inf -> return () +++instance (Occurs a, Subst a) => Occurs (Abs a) where+ occurs red ctx m xs b@(Abs s x) = Abs s <$> underAbstraction_ b (occurs red ctx m (liftUnderAbs xs))+ occurs red ctx m xs b@(NoAbs s x) = NoAbs s <$> occurs red ctx m xs x++ metaOccurs m (Abs s x) = metaOccurs m x+ metaOccurs m (NoAbs s x) = metaOccurs m x+ instance Occurs a => Occurs (Arg a) where- occurs red ctx m xs (Arg h r x) = Arg h r <$> occurs red ctx m xs x+ occurs red ctx m xs (Arg h r@Irrelevant{} x) = Arg h r <$>+ occurs red Irrel m (goIrrelevant xs) x+ occurs red ctx m xs (Arg h r x) = Arg h r <$>+ occurs red ctx m xs x + metaOccurs m a = metaOccurs m (unArg a)++instance Occurs a => Occurs (Dom a) where+ occurs red ctx m xs (Dom h r x) = Dom h r <$> occurs red ctx m xs x+ metaOccurs m = metaOccurs m . unDom+ instance (Occurs a, Occurs b) => Occurs (a,b) where occurs red ctx m xs (x,y) = (,) <$> occurs red ctx m xs x <*> occurs red ctx m xs y + metaOccurs m (x,y) = metaOccurs m x >> metaOccurs m y+ instance Occurs a => Occurs [a] where occurs red ctx m xs ys = mapM (occurs red ctx m xs) ys + metaOccurs m ys = mapM_ (metaOccurs m) ys+ -- * Getting rid of flexible occurrences -- | @prune m' vs xs@ attempts to remove all arguments from @vs@ whose@@ -246,7 +398,7 @@ -- return @True@ else @False@. prune :: MetaId -> Args -> [Nat] -> TCM PruneResult prune m' vs xs = liftTCM $ do- let kills = map (hasBadRigid xs) $ map unArg vs+ kills <- mapM (hasBadRigid xs) $ map unArg vs reportSDoc "tc.meta.kill" 10 $ vcat [ text "attempting kills" , nest 2 $ vcat@@ -268,13 +420,43 @@ -- | @hasBadRigid xs v = True@ iff one of the rigid variables in @v@ is not in @xs@. -- Actually we can only prune if a bad variable is in the head. See issue 458.-hasBadRigid :: [Nat] -> Term -> Bool-hasBadRigid xs (Var v _) = notElem v xs-hasBadRigid xs _ = False- -- not $ Set.isSubsetOf- -- (rigidVars $ freeVars v)- -- (Set.fromList xs)+-- Or in a non-eliminateable position (see succeed/PruningNonMillerPattern).+hasBadRigid :: [Nat] -> Term -> TCM Bool+hasBadRigid xs (Var x _) = return $ notElem x xs+hasBadRigid xs (Lam _ v) = hasBadRigid (0 : map (+1) xs) (absBody v)+hasBadRigid xs (DontCare v) = hasBadRigid xs v+-- The following types of arguments cannot be eliminated by a pattern+-- match: data, record, Pi, levels, sorts+-- Thus, their offending rigid variables are bad.+hasBadRigid xs v@(Def f vs) =+ ifM (isJust <$> isDataOrRecordType f) (return $ vs `rigidVarsNotContainedIn` xs) $ do+ elV <- elimView v+ case elV of+ VarElim x els -> return $ notElem x xs+ _ -> return $ False+ -- Andreas, 2012-05-03: There is room for further improvement.+ -- We could also consider a defined f which is not blocked by a meta.+hasBadRigid xs (Pi a b) = return $ (a,b) `rigidVarsNotContainedIn` xs+hasBadRigid xs (Level v) = return $ v `rigidVarsNotContainedIn` xs+hasBadRigid xs (Sort s) = return $ s `rigidVarsNotContainedIn` xs+-- Since constructors can be eliminated by pattern-matching,+-- offending variables under a constructor could be removed by+-- the right instantiation of the meta variable.+-- Thus, they are not rigid.+hasBadRigid xs Con{} = return $ False+hasBadRigid xs Lit{} = return $ False -- no variables in Lit+hasBadRigid xs MetaV{} = return $ False -- no rigid variables under a meta+hasBadRigid xs (Shared p) = hasBadRigid xs (derefPtr p) +-- This could be optimized, by not computing the whole variable set+-- at once, but allow early failure+rigidVarsNotContainedIn :: Free a => a -> [Nat] -> Bool+rigidVarsNotContainedIn v xs =+ not $ Set.isSubsetOf+ (rigidVars $ freeVars v)+ (Set.fromList xs)++ data PruneResult = NothingToPrune -- ^ the kill list is empty or only @False@s | PrunedNothing -- ^ there is no possible kill (because of type dep.)@@ -328,18 +510,17 @@ ] -- | @killedType [((x1,a1),k1)..((xn,an),kn)] b = ([k'1..k'n],t')@--- (ignoring @Arg@). Let @t' = (xs:as) -> b@.+-- (ignoring @Dom@). Let @t' = (xs:as) -> b@. -- Invariant: @k'i == True@ iff @ki == True@ and pruning the @i@th argument from -- type @b@ is possible without creating unbound variables. -- @t'@ is type @t@ after pruning all @k'i==True@.-killedType :: [(Arg (String, Type), Bool)] -> Type -> ([Arg Bool], Type)+killedType :: [(Dom (String, Type), Bool)] -> Type -> ([Arg Bool], Type) killedType [] b = ([], b)-killedType ((arg, kill) : kills) b- | dontKill = (killed False : args, telePi (telFromList [arg]) b')- | otherwise = (killed True : args, subst __IMPOSSIBLE__ b')+killedType ((arg@(Dom h r _), kill) : kills) b+ | dontKill = (Arg h r False : args, mkPi arg b') -- OLD: telePi (telFromList [arg]) b')+ | otherwise = (Arg h r True : args, subst __IMPOSSIBLE__ b') where (args, b') = killedType kills b- killed k = fmap (const k) arg dontKill = not kill || 0 `freeIn` b' -- The list starts with the last argument@@ -353,13 +534,16 @@ (HasType __IMPOSSIBLE__ a) -- Andreas, 2010-10-15 eta expand new meta variable if necessary etaExpandMetaSafe m'- let vars = reverse [ Arg h r (Var i []) | (i, Arg h r False) <- zip [0..] kills ]+ let vars = reverse [ Arg h r (var i) | (i, Arg h r False) <- zip [0..] kills ]+ lam b a = Lam (argHiding a) (Abs "v" b)+ u = foldl' lam (MetaV m' vars) kills+{- OLD CODE hs = reverse [ argHiding a | a <- kills ] lam h b = Lam h (Abs "v" b) u = foldr lam (MetaV m' vars) hs+-} dbg m' u assignTerm m u- return () where dbg m' u = reportSDoc "tc.meta.kill" 10 $ vcat [ text "actual killing"
src/full/Agda/TypeChecking/Monad.hs view
@@ -10,6 +10,7 @@ , module Agda.TypeChecking.Monad.Mutual , module Agda.TypeChecking.Monad.Open , module Agda.TypeChecking.Monad.Options+ , module Agda.TypeChecking.Monad.Sharing , module Agda.TypeChecking.Monad.Signature , module Agda.TypeChecking.Monad.SizedTypes , module Agda.TypeChecking.Monad.State@@ -28,6 +29,7 @@ import Agda.TypeChecking.Monad.Mutual import Agda.TypeChecking.Monad.Options import Agda.TypeChecking.Monad.Open+import Agda.TypeChecking.Monad.Sharing import Agda.TypeChecking.Monad.Signature import Agda.TypeChecking.Monad.SizedTypes import Agda.TypeChecking.Monad.State
src/full/Agda/TypeChecking/Monad/Base.hs view
@@ -6,6 +6,8 @@ module Agda.TypeChecking.Monad.Base where import Control.Arrow+import qualified Control.Concurrent as C+import Control.DeepSeq import Control.Exception as E import Control.Monad.Error import Control.Monad.State@@ -15,11 +17,12 @@ import Data.Int import Data.Map as Map import Data.Set as Set-import Data.Generics+import Data.Sequence as Seq+import Data.Typeable (Typeable) import Data.Foldable import Data.Traversable import Data.IORef-import System.Time+import Data.Hashable import Agda.Syntax.Common import qualified Agda.Syntax.Concrete as C@@ -28,6 +31,7 @@ import Agda.Syntax.Internal import Agda.Syntax.Position import Agda.Syntax.Scope.Base+import Agda.Utils.HashMap as HMap import Agda.TypeChecking.CompiledClause @@ -35,7 +39,11 @@ import {-# SOURCE #-} Agda.Interaction.FindFile import Agda.Interaction.Options import qualified Agda.Interaction.Highlighting.Range as R-import Agda.Interaction.Highlighting.Precise (HighlightingInfo)+import {-# SOURCE #-} Agda.Interaction.Response+ (InteractionOutputCallback, defaultInteractionOutputCallback)+import Agda.Interaction.Highlighting.Precise+ (CompressedFile, HighlightingInfo)+import Data.Monoid import qualified Agda.Compiler.JS.Syntax as JS @@ -44,6 +52,7 @@ import Agda.Utils.Monad import Agda.Utils.Permutation import Agda.Utils.Pretty+import Agda.Utils.Time #include "../../undefined.h" import Agda.Utils.Impossible@@ -54,10 +63,20 @@ data TCState = TCSt { stFreshThings :: FreshThings+ , stSyntaxInfo :: CompressedFile+ -- ^ Highlighting info.+ , stTokens :: CompressedFile+ -- ^ Highlighting info for tokens (but not those tokens for+ -- which highlighting exists in 'stSyntaxInfo').+ , stTermErrs :: Seq TerminationError , stMetaStore :: MetaStore , stInteractionPoints :: InteractionPoints , stAwakeConstraints :: Constraints , stSleepingConstraints :: Constraints+ , stDirty :: Bool+ , stOccursCheckDefs :: Set QName+ -- ^ Definitions to be considered during occurs check.+ -- Initialized to the current mutual block before the check. , stSignature :: Signature , stImports :: Signature , stImportedModules :: Set ModuleName@@ -67,6 +86,8 @@ -- ^ The current module is available after it has been type -- checked. , stScope :: ScopeInfo+ , stPatternSyns :: A.PatternSynDefns+ , stPatternSynImports :: A.PatternSynDefns , stPragmaOptions :: PragmaOptions -- ^ Options applying to the current file. @OPTIONS@ -- pragmas only affect this field.@@ -79,6 +100,10 @@ -- ^ Imports that should be generated by the compiler (this -- includes imports from imported modules). , stPersistent :: PersistentTCState+ , stInteractionOutputCallback :: InteractionOutputCallback+ -- ^ Callback fuction to call when there is a response+ -- to give to the interactive frontend.+ -- See the documentation of 'InteractionOutputCallback'. } -- | A part of the state which is not reverted when an error is thrown@@ -97,7 +122,7 @@ , fName :: NameId , fCtx :: CtxId , fProblem :: ProblemId- , fInteger :: Integer+ , fInt :: Int -- ^ Can be used for various things. } deriving (Show)@@ -106,9 +131,14 @@ initState = TCSt { stFreshThings = (Fresh 0 0 0 (NameId 0 0) 0 0 0) { fProblem = 1 } , stMetaStore = Map.empty+ , stSyntaxInfo = mempty+ , stTokens = mempty+ , stTermErrs = Seq.empty , stInteractionPoints = Map.empty , stAwakeConstraints = [] , stSleepingConstraints = []+ , stDirty = False+ , stOccursCheckDefs = Set.empty , stSignature = emptySignature , stImports = emptySignature , stImportedModules = Set.empty@@ -116,7 +146,9 @@ , stVisitedModules = Map.empty , stCurrentModule = Nothing , stScope = emptyScopeInfo- , stPragmaOptions = optPragmaOptions $ defaultOptions+ , stPatternSyns = Map.empty+ , stPatternSynImports = Map.empty+ , stPragmaOptions = defaultInteractionOptions , stStatistics = Map.empty , stExtLambdaTele = Map.empty , stMutualBlocks = Map.empty@@ -127,6 +159,7 @@ { stPersistentOptions = defaultOptions , stDecodedModules = Map.empty }+ , stInteractionOutputCallback = defaultInteractionOutputCallback } stBuiltinThings :: TCState -> BuiltinThings PrimFun@@ -157,13 +190,13 @@ where i = fCtx s -instance HasFresh Integer FreshThings where- nextFresh s = (i, s { fInteger = succ i })+instance HasFresh Int FreshThings where+ nextFresh s = (i, s { fInt = succ i }) where- i = fInteger s+ i = fInt s newtype ProblemId = ProblemId Nat- deriving (Typeable, Data, Eq, Ord, Enum, Real, Integral, Num)+ deriving (Typeable, Eq, Ord, Enum, Real, Integral, Num) instance Show ProblemId where show (ProblemId n) = show n@@ -207,7 +240,7 @@ , iScope :: Map ModuleName Scope , iInsideScope :: ScopeInfo , iSignature :: Signature- , iBuiltin :: BuiltinThings String+ , iBuiltin :: BuiltinThings (String, QName) , iHaskellImports :: Set String -- ^ Haskell imports listed in -- (transitively) imported modules are@@ -215,8 +248,9 @@ , iHighlighting :: HighlightingInfo , iPragmaOptions :: [OptionsPragma] -- ^ Pragma options set in the file.+ , iPatternSyns :: A.PatternSynDefns }- deriving (Typeable, Data, Show)+ deriving (Typeable, Show) --------------------------------------------------------------------------- -- ** Closure@@ -227,7 +261,7 @@ , clScope :: ScopeInfo , clValue :: a }- deriving (Typeable, Data)+ deriving (Typeable) instance Show a => Show (Closure a) where show cl = "Closure " ++ show (clValue cl)@@ -261,22 +295,29 @@ | TelCmp Type Type Comparison Telescope Telescope -- ^ the two types are for the error message only | SortCmp Comparison Sort Sort | LevelCmp Comparison Level Level+-- | ShortCut MetaId Term Type+-- -- ^ A delayed instantiation. Replaces @ValueCmp@ in 'postponeTypeCheckingProblem'. | UnBlock MetaId | Guarded Constraint ProblemId- | IsEmpty Type- | FindInScope MetaId+ | IsEmpty Range Type+ -- ^ the range is the one of the absurd pattern+ | FindInScope MetaId [(Term, Type)] deriving (Typeable, Show) data Comparison = CmpEq | CmpLeq- deriving (Eq, Typeable, Show)+ deriving (Eq, Typeable) +instance Show Comparison where+ show CmpEq = "="+ show CmpLeq = "=<"+ --------------------------------------------------------------------------- -- * Open things --------------------------------------------------------------------------- -- | A thing tagged with the context it came from. data Open a = OpenThing [CtxId] a- deriving (Typeable, Data, Show, Functor)+ deriving (Typeable, Show, Functor) --------------------------------------------------------------------------- -- * Judgements@@ -287,7 +328,7 @@ data Judgement t a = HasType { jMetaId :: a, jMetaType :: t } | IsSort { jMetaId :: a, jMetaType :: t } -- Andreas, 2011-04-26: type needed for higher-order sort metas- deriving (Typeable, Data, Functor, Foldable, Traversable)+ deriving (Typeable, Functor, Foldable, Traversable) instance (Show t, Show a) => Show (Judgement t a) where show (HasType a t) = show a ++ " : " ++ show t@@ -355,17 +396,43 @@ newtype MetaPriority = MetaPriority Int deriving (Eq, Ord, Show) --- | TODO: Not so nice.-type MetaInfo = Closure Range+data RunMetaOccursCheck+ = RunMetaOccursCheck+ | DontRunMetaOccursCheck+ deriving (Eq, Ord, Show) +-- | @MetaInfo@ is cloned from one meta to the next during pruning.+data MetaInfo = MetaInfo+ { miClosRange :: Closure Range -- TODO: Not so nice. But we want both to have the environment of the meta (Closure) and its range.+-- , miRelevance :: Relevance -- ^ Created in irrelevant position?+ , miMetaOccursCheck :: RunMetaOccursCheck -- ^ Run the extended occurs check that goes in definitions?+ , miNameSuggestion :: MetaNameSuggestion+ -- ^ Used for printing.+ -- @Just x@ if meta-variable comes from omitted argument with name @x@.+ }++-- | Name suggestion for meta variable. Empty string means no suggestion.+type MetaNameSuggestion = String++-- | For printing, we couple a meta with its name suggestion.+data NamedMeta = NamedMeta+ { nmSuggestion :: MetaNameSuggestion+ , nmid :: MetaId+ }++instance Show NamedMeta where+ show (NamedMeta "" x) = show x+ show (NamedMeta s x) = "_" ++ s ++ show x+ type MetaStore = Map MetaId MetaVariable instance HasRange MetaVariable where getRange m = getRange $ getMetaInfo m instance SetRange MetaVariable where- setRange r (MetaVar mi p perm j inst ls frozen) =- MetaVar (mi {clValue = r}) p perm j inst ls frozen+ setRange r m = m { mvInfo = (mvInfo m)+ { miClosRange = (miClosRange (mvInfo m))+ { clValue = r }}} normalMetaPriority :: MetaPriority normalMetaPriority = MetaPriority 0@@ -376,8 +443,8 @@ highMetaPriority :: MetaPriority highMetaPriority = MetaPriority 10 -getMetaInfo :: MetaVariable -> MetaInfo-getMetaInfo = mvInfo+getMetaInfo :: MetaVariable -> Closure Range+getMetaInfo = miClosRange . mvInfo getMetaScope :: MetaVariable -> ScopeInfo getMetaScope m = clScope $ getMetaInfo m@@ -388,6 +455,9 @@ getMetaSig :: MetaVariable -> Signature getMetaSig m = clSignature $ getMetaInfo m +getMetaRelevance :: MetaVariable -> Relevance+getMetaRelevance = envRelevance . getMetaEnv+ --------------------------------------------------------------------------- -- ** Interaction meta variables ---------------------------------------------------------------------------@@ -408,10 +478,10 @@ { sigSections :: Sections , sigDefinitions :: Definitions }- deriving (Typeable, Data, Show)+ deriving (Typeable, Show) type Sections = Map ModuleName Section-type Definitions = Map QName Definition+type Definitions = HashMap QName Definition data Section = Section { secTelescope :: Telescope@@ -422,10 +492,10 @@ -- section to when translating from -- abstract to internal syntax. }- deriving (Typeable, Data, Show)+ deriving (Typeable, Show) emptySignature :: Signature-emptySignature = Sig Map.empty Map.empty+emptySignature = Sig Map.empty HMap.empty data DisplayForm = Display Nat [Term] DisplayTerm -- ^ The three arguments are:@@ -436,28 +506,30 @@ -- represents pattern vars. There should @n@ of them. -- -- * Display form. @n@ free variables.- deriving (Typeable, Data, Show)+ deriving (Typeable, Show) data DisplayTerm = DWithApp [DisplayTerm] Args | DCon QName [Arg DisplayTerm] | DDef QName [Arg DisplayTerm] | DDot Term | DTerm Term- deriving (Typeable, Data, Show)+ deriving (Typeable, Show) defaultDisplayForm :: QName -> [Open DisplayForm] defaultDisplayForm c = [] data Definition = Defn- { defRelevance :: Relevance -- ^ Some defs can be irrelevant (but not hidden).- , defName :: QName- , defType :: Type -- ^ Type of the lifted definition.- , defDisplay :: [Open DisplayForm]- , defMutual :: MutualId- , defCompiledRep :: CompiledRepresentation- , theDef :: Defn+ { defRelevance :: Relevance -- ^ Some defs can be irrelevant (but not hidden).+ , defName :: QName+ , defType :: Type -- ^ Type of the lifted definition.+ , defPolarity :: [Polarity]+ , defArgOccurrences :: [Occurrence]+ , defDisplay :: [Open DisplayForm]+ , defMutual :: MutualId+ , defCompiledRep :: CompiledRepresentation+ , theDef :: Defn }- deriving (Typeable, Data, Show)+ deriving (Typeable, Show) type HaskellCode = String type HaskellType = String@@ -467,33 +539,52 @@ data HaskellRepresentation = HsDefn HaskellType HaskellCode | HsType HaskellType- deriving (Typeable, Data, Show)+ deriving (Typeable, Show) -data Polarity = Covariant | Contravariant | Invariant- deriving (Typeable, Data, Show, Eq)+-- | Polarity for equality and subtype checking.+data Polarity+ = Covariant -- ^ monotone+ | Contravariant -- ^ antitone+ | Invariant -- ^ no information (mixed variance)+ | Nonvariant -- ^ constant+ deriving (Typeable, Show, Eq) data CompiledRepresentation = CompiledRep { compiledHaskell :: Maybe HaskellRepresentation , compiledEpic :: Maybe EpicCode , compiledJS :: Maybe JSCode }- deriving (Typeable, Data, Show)+ deriving (Typeable, Show) noCompiledRep :: CompiledRepresentation noCompiledRep = CompiledRep Nothing Nothing Nothing --- | 'Positive' means strictly positive and 'Negative' means not strictly--- positive.-data Occurrence = Positive | Negative | Unused- deriving (Typeable, Data, Show, Eq, Ord)+-- | Subterm occurrences for positivity checking.+-- The constructors are listed in increasing information they provide:+-- @Mixed <= JustPos <= StrictPos <= GuardPos <= Unused@+-- @Mixed <= JustNeg <= Unused@.+data Occurrence+ = Mixed -- ^ Arbitrary occurrence (positive and negative).+ | JustNeg -- ^ Negative occurrence.+ | JustPos -- ^ Positive occurrence, but not strictly positive.+ | StrictPos -- ^ Strictly positive occurrence.+ | GuardPos -- ^ Guarded strictly positive occurrence (i.e., under ∞). For checking recursive records.+ | Unused -- ^ No occurrence.+ deriving (Typeable, Show, Eq, Ord) +instance NFData Occurrence+ data Defn = Axiom | Function { funClauses :: [Clause] , funCompiled :: CompiledClauses , funInv :: FunctionInverse+{- MOVED to Definition , funPolarity :: [Polarity] , funArgOccurrences :: [Occurrence]+-}+ , funMutual :: [QName]+ -- ^ Mutually recursive functions, @data@s and @record@s. , funAbstr :: IsAbstract , funDelayed :: Delayed -- ^ Are the clauses of this definition delayed?@@ -506,6 +597,11 @@ -- checker. , funStatic :: Bool -- ^ Should calls to this function be normalised at compile-time?+ , funCopy :: Bool+ -- ^ Has this function been created by a module+ -- instantiation?+ , funTerminates :: Maybe Bool+ -- ^ Has this function been termination checked? Did it pass? } | Datatype { dataPars :: Nat -- nof parameters@@ -514,21 +610,29 @@ , dataClause :: (Maybe Clause) -- this might be in an instantiated module , dataCons :: [QName] -- constructor names , dataSort :: Sort+{- MOVED , dataPolarity :: [Polarity] , dataArgOccurrences :: [Occurrence]+-}+ , dataMutual :: [QName] -- ^ Mutually recursive functions, @data@s and @record@s. , dataAbstr :: IsAbstract } | Record- { recPars :: Nat+ { recPars :: Nat -- ^ Number of parameters. , recClause :: Maybe Clause , recCon :: QName -- ^ Constructor name. , recNamedCon :: Bool , recConType :: Type -- ^ The record constructor's type. , recFields :: [Arg A.QName] , recTel :: Telescope -- ^ The record field telescope+{- MOVED , recPolarity :: [Polarity] , recArgOccurrences :: [Occurrence]- , recEtaEquality :: Bool+-}+ , recMutual :: [QName] -- ^ Mutually recursive functions, @data@s and @record@s.+ , recEtaEquality :: Bool -- ^ Eta-expand at this record type. @False@ for unguarded recursive records.+ , recInduction :: Induction -- ^ 'Inductive' or 'Coinductive'? Matters only for recursive records.+ , recRecursive :: Bool -- ^ Recursive record. Implies @recEtaEquality = False@. Projections are not size-preserving. , recAbstr :: IsAbstract } | Constructor@@ -549,14 +653,19 @@ -- something@ for builtin functions. } -- ^ Primitive or builtin functions.- deriving (Typeable, Data, Show)+ deriving (Typeable, Show) defIsRecord :: Defn -> Bool defIsRecord Record{} = True defIsRecord _ = False +defIsDataOrRecord :: Defn -> Bool+defIsDataOrRecord Record{} = True+defIsDataOrRecord Datatype{} = True+defIsDataOrRecord _ = False+ newtype Fields = Fields [(C.Name, Type)]- deriving (Typeable, Data)+ deriving (Typeable) data Reduced no yes = NoReduction no | YesReduction yes deriving (Typeable, Functor)@@ -574,7 +683,7 @@ notReduced x = MaybeRed NotReduced x reduced :: Blocked (Arg Term) -> MaybeReduced (Arg Term)-reduced b = case b of+reduced b = case fmap ignoreSharing <$> b of NotBlocked (Arg _ _ (MetaV x _)) -> MaybeRed (Reduced $ Blocked x ()) v _ -> MaybeRed (Reduced $ () <$ b) v where@@ -605,15 +714,16 @@ defEpicDef :: Definition -> Maybe EpicCode defEpicDef = compiledEpic . defCompiledRep --- | Used to specify whether something should be delayed.-data Delayed = Delayed | NotDelayed- deriving (Typeable, Data, Show, Eq)- -- | Are the clauses of this definition delayed? defDelayed :: Definition -> Delayed defDelayed Defn{theDef = Function{funDelayed = d}} = d defDelayed _ = NotDelayed +-- | Is the definition just a copy created by a module instantiation?+defCopy :: Definition -> Bool+defCopy Defn{theDef = Function{funCopy = b}} = b+defCopy _ = False+ defAbstract :: Definition -> IsAbstract defAbstract d = case theDef d of Axiom{} -> ConcreteDef@@ -627,21 +737,24 @@ -- ** Injectivity --------------------------------------------------------------------------- -data FunctionInverse = NotInjective- | Inverse (Map TermHead Clause)- deriving (Typeable, Data, Show)+type FunctionInverse = FunctionInverse' Clause +data FunctionInverse' c+ = NotInjective+ | Inverse (Map TermHead c)+ deriving (Typeable, Show, Functor)+ data TermHead = SortHead | PiHead | ConHead QName- deriving (Typeable, Data, Eq, Ord, Show)+ deriving (Typeable, Eq, Ord, Show) --------------------------------------------------------------------------- -- ** Mutual blocks --------------------------------------------------------------------------- newtype MutualId = MutId Int32- deriving (Typeable, Data, Eq, Ord, Show, Num)+ deriving (Typeable, Eq, Ord, Show, Num) --------------------------------------------------------------------------- -- ** Statistics@@ -671,25 +784,16 @@ | CheckFunDef Range Name [A.Clause] (Maybe ()) | CheckPragma Range A.Pragma (Maybe ()) | CheckPrimitive Range Name A.Expr (Maybe ())- | CheckIsEmpty Type (Maybe ())+ | CheckIsEmpty Range Type (Maybe ()) | CheckWithFunctionType A.Expr (Maybe ()) | CheckSectionApplication Range ModuleName A.ModuleApplication (Maybe ()) | ScopeCheckExpr C.Expr (Maybe A.Expr) | ScopeCheckDeclaration D.NiceDeclaration (Maybe [A.Declaration]) | ScopeCheckLHS C.Name C.Pattern (Maybe A.LHS)- | forall a. TermFunDef Range Name [A.Clause] (Maybe a)+ | forall a. NoHighlighting (Maybe a) | forall a. SetRange Range (Maybe a) -- ^ used by 'setCurrentRange'- -- actually, 'a' is Agda.Termination.TermCheck.CallGraph- -- but I was to lazy to import the stuff here --Andreas,2007-5-29- deriving (Typeable) --- Dummy instance-instance Data Call where- dataTypeOf _ = mkDataType "Call" []- toConstr x = mkConstr (dataTypeOf x) "Dummy" [] Prefix- gunfold k z _ = __IMPOSSIBLE__- instance HasRange Call where getRange (CheckClause _ c _) = getRange c getRange (CheckPattern p _ _ _) = getRange p@@ -713,10 +817,10 @@ getRange (ScopeCheckLHS _ p _) = getRange p getRange (CheckDotPattern e _ _) = getRange e getRange (CheckPatternShadowing c _) = getRange c- getRange (TermFunDef i _ _ _) = getRange i getRange (SetRange r _) = r getRange (CheckSectionApplication r _ _ _) = r- getRange (CheckIsEmpty _ _) = noRange+ getRange (CheckIsEmpty r _ _) = r+ getRange (NoHighlighting _) = noRange --------------------------------------------------------------------------- -- ** Builtin things@@ -725,7 +829,7 @@ data BuiltinDescriptor = BuiltinData (TCM Type) [String] | BuiltinDataCons (TCM Type) | BuiltinPrim String (Term -> TCM ())- | BuiltinPostulate (TCM Type)+ | BuiltinPostulate Relevance (TCM Type) | BuiltinUnknown (Maybe (TCM Type)) (Term -> TCM ()) data BuiltinInfo =@@ -737,9 +841,45 @@ data Builtin pf = Builtin Term | Prim pf- deriving (Typeable, Data, Show, Functor, Foldable, Traversable)+ deriving (Typeable, Show, Functor, Foldable, Traversable) ---------------------------------------------------------------------------+-- * Highlighting levels+---------------------------------------------------------------------------++-- | How much highlighting should be sent to the user interface?++data HighlightingLevel+ = None+ | NonInteractive+ | Interactive+ -- ^ This includes both non-interactive highlighting and+ -- interactive highlighting of the expression that is currently+ -- being type-checked.+ deriving (Eq, Ord, Show, Read)++-- | How should highlighting be sent to the user interface?++data HighlightingMethod+ = Direct+ -- ^ Via stdout.+ | Indirect+ -- ^ Both via files and via stdout.+ deriving (Eq, Show, Read)++-- | @ifTopLevelAndHighlightingLevelIs l m@ runs @m@ when we're+-- type-checking the top-level module and the highlighting level is+-- /at least/ @l@.++ifTopLevelAndHighlightingLevelIs ::+ MonadTCM tcm => HighlightingLevel -> tcm () -> tcm ()+ifTopLevelAndHighlightingLevelIs l m = do+ e <- ask+ when (envModuleNestingLevel e == 0 &&+ envHighlightingLevel e >= l)+ m++--------------------------------------------------------------------------- -- * Type checking environment --------------------------------------------------------------------------- @@ -747,20 +887,22 @@ TCEnv { envContext :: Context , envLetBindings :: LetBindings , envCurrentModule :: ModuleName+ , envCurrentPath :: AbsolutePath+ -- ^ The path to the file that is currently being+ -- type-checked. , envAnonymousModules :: [(ModuleName, Nat)] -- ^ anonymous modules and their number of free variables , envImportPath :: [C.TopLevelModuleName] -- ^ to detect import cycles , envMutualBlock :: Maybe MutualId -- ^ the current (if any) mutual block , envSolvingConstraints :: Bool -- ^ Are we currently in the process of solving active constraints?+ , envAssignMetas :: Bool+ -- ^ Are we allowed to assign metas? , envActiveProblems :: [ProblemId] , envAbstractMode :: AbstractMode -- ^ When checking the typesignature of a public definition -- or the body of a non-abstract definition this is true. -- To prevent information about abstract things leaking -- outside the module.- , envTopLevel :: Bool- -- ^ Are we at the top level when checking a declaration?- -- In this case, we will freeze metas afterwards. , envRelevance :: Relevance -- ^ Are we checking an irrelevant argument? (=@Irrelevant@) -- Then top-level irrelevant declarations are enabled.@@ -775,48 +917,79 @@ -- not going to reify and retypecheck (like when doing with -- abstraction) , envRange :: Range+ , envHighlightingRange :: Range+ -- ^ Interactive highlighting uses this range rather+ -- than 'envRange'. , envCall :: Maybe (Closure Call) -- ^ what we're doing at the moment+ , envEmacs :: Bool+ -- ^ True when called from the Emacs mode.+ , envHighlightingLevel :: HighlightingLevel+ -- ^ Set to 'None' when imported modules are+ -- type-checked.+ , envHighlightingMethod :: HighlightingMethod+ , envModuleNestingLevel :: Integer+ -- ^ This number indicates how far away from the+ -- top-level module Agda has come when chasing+ -- modules. The level of a given module is not+ -- necessarily the same as the length, in the module+ -- dependency graph, of the shortest path from the+ -- top-level module; it depends on in which order+ -- Agda chooses to chase dependencies.+ , envAllowDestructiveUpdate :: Bool+ -- ^ When True, allows destructively shared updating terms+ -- during evaluation or unification. This is disabled when+ -- doing speculative checking, like solve instance metas, or+ -- when updating might break abstraction, as is the case when+ -- checking abstract definitions. }- deriving (Typeable, Data)+ deriving (Typeable) initEnv :: TCEnv initEnv = TCEnv { envContext = [] , envLetBindings = Map.empty , envCurrentModule = noModuleName+ , envCurrentPath = __IMPOSSIBLE__ , envAnonymousModules = [] , envImportPath = [] , envMutualBlock = Nothing , envSolvingConstraints = False , envActiveProblems = [0]+ , envAssignMetas = True , envAbstractMode = AbstractMode- , envTopLevel = True , envRelevance = Relevant , envDisplayFormsEnabled = True , envReifyInteractionPoints = True , envEtaContractImplicit = True , envRange = noRange+ , envHighlightingRange = noRange , envCall = Nothing+ , envEmacs = False+ , envHighlightingLevel = None+ , envHighlightingMethod = Indirect+ , envModuleNestingLevel = -1+ , envAllowDestructiveUpdate = True } --------------------------------------------------------------------------- -- ** Context --------------------------------------------------------------------------- +-- | The @Context@ is a stack of 'ContextEntry's. type Context = [ContextEntry] data ContextEntry = Ctx { ctxId :: CtxId- , ctxEntry :: Arg (Name, Type)+ , ctxEntry :: Dom (Name, Type) }- deriving (Typeable, Data)+ deriving (Typeable) newtype CtxId = CtxId Nat- deriving (Typeable, Data, Eq, Ord, Show, Enum, Real, Integral, Num)+ deriving (Typeable, Eq, Ord, Show, Enum, Real, Integral, Num) --------------------------------------------------------------------------- -- ** Let bindings --------------------------------------------------------------------------- -type LetBindings = Map Name (Open (Term, Arg Type))+type LetBindings = Map Name (Open (Term, Dom Type)) --------------------------------------------------------------------------- -- ** Abstract mode@@ -825,9 +998,22 @@ data AbstractMode = AbstractMode -- ^ abstract things in the current module can be accessed | ConcreteMode -- ^ no abstract things can be accessed | IgnoreAbstractMode -- ^ all abstract things can be accessed- deriving (Typeable, Data)+ deriving (Typeable) ---------------------------------------------------------------------------+-- ** Insertion of implicit arguments+---------------------------------------------------------------------------++data ExpandHidden+ = ExpandLast -- ^ Add implicit arguments in the end until type is no longer hidden 'Pi'.+ | DontExpandLast -- ^ Do not append implicit arguments.++data ExpandInstances+ = ExpandInstanceArguments+ | DontExpandInstanceArguments+ deriving (Eq)++--------------------------------------------------------------------------- -- * Type checking errors --------------------------------------------------------------------------- @@ -866,8 +1052,15 @@ -- automatically generated functions.) , termErrCalls :: [CallInfo] -- ^ The problematic call sites.- } deriving (Typeable, Show)+ } deriving (Typeable, Show, Eq) +{-+-- | We consider two 'TerminationError's equal if they report the same+-- invalid calls.+instance Eq TerminationError where+ (==) = (==) `on` termErrCalls+-}+ data TypeError = InternalError String | NotImplemented String@@ -876,6 +1069,11 @@ | TerminationCheckFailed [TerminationError] | PropMustBeSingleton | DataMustEndInSort Term+{- UNUSED+ | DataTooManyParameters+ -- ^ In @data D xs where@ the number of parameters @xs@ does not fit the+ -- the parameters given in the forward declaraion @data D Gamma : T@.+-} | ShouldEndInApplicationOfTheDatatype Type -- ^ The target of a constructor isn't an application of its -- datatype. The 'Type' records what it does target.@@ -887,8 +1085,11 @@ -- ^ Expected a type to be an application of a particular datatype. | ConstructorPatternInWrongDatatype QName QName -- ^ constructor, datatype | IndicesNotConstructorApplications [Arg Term] -- ^ Indices.- | IndexVariablesNotDistinct [Arg Term] -- ^ Indices.- | IndexFreeInParameter Nat [Arg Term] -- ^ Index (a variable), parameters.+ | IndexVariablesNotDistinct [Nat] [Arg Term] -- ^ Variables, indices.+ | IndicesFreeInParameters [Nat] [Arg Term] [Arg Term]+ -- ^ Indices (variables), index expressions (with+ -- constructors applied to reconstructed parameters),+ -- parameters. | DoesNotConstructAnElementOf QName Term -- ^ constructor, type | DifferentArities -- ^ Varying number of arguments for a function.@@ -905,7 +1106,7 @@ -- ^ The term does not correspond to an inductive data type. | UninstantiatedDotPattern A.Expr | IlltypedPattern A.Pattern Type- | TooManyArgumentsInLHS Nat Type+ | TooManyArgumentsInLHS Type | WrongNumberOfConstructorArguments QName Nat Nat | ShouldBeEmpty Type [Pattern] | ShouldBeASort Type@@ -913,19 +1114,22 @@ | ShouldBePi Type -- ^ The given type should have been a pi. | ShouldBeRecordType Type+ | ShouldBeRecordPattern Pattern | NotAProperTerm- | SplitOnIrrelevant A.Pattern (Arg Type)+ | SetOmegaNotValidType+ | SplitOnIrrelevant A.Pattern (Dom Type) | DefinitionIsIrrelevant QName | VariableIsIrrelevant Name | UnequalLevel Comparison Term Term | UnequalTerms Comparison Term Term Type | UnequalTypes Comparison Type Type | UnequalTelescopes Comparison Telescope Telescope- | UnequalRelevance Type Type+ | UnequalRelevance Comparison Term Term -- ^ The two function types have different relevance.- | UnequalHiding Type Type+ | UnequalHiding Term Term -- ^ The two function types have different hiding. | UnequalSorts Sort Sort+ | UnequalBecauseOfUniverseConflict Comparison Term Term | HeterogeneousEquality Term Type Term Type -- ^ We ended up with an equality constraint where the terms -- have different types. This is not supported.@@ -935,12 +1139,13 @@ -- depend on and the paratemeter that it wants to depend on. | MetaOccursInItself MetaId | GenericError String+ | GenericDocError Doc | BuiltinMustBeConstructor String A.Expr | NoSuchBuiltinName String | DuplicateBuiltinBinding String Term Term | NoBindingForBuiltin String | NoSuchPrimitiveFunction String- | ShadowedModule [A.ModuleName]+ | ShadowedModule C.Name [A.ModuleName] | BuiltinInParameterisedModule String | NoRHSRequiresAbsurdPattern [NamedArg A.Pattern] | AbsurdPatternRequiresNoRHS [NamedArg A.Pattern]@@ -998,20 +1203,32 @@ | NotAValidLetBinding D.NiceDeclaration | NothingAppliedToHiddenArg C.Expr | NothingAppliedToInstanceArg C.Expr+ | UnusedVariableInPatternSynonym+ | PatternSynonymArityMismatch A.QName -- Operator errors | NoParseForApplication [C.Expr] | AmbiguousParseForApplication [C.Expr] [C.Expr]- | NoParseForLHS C.Pattern- | AmbiguousParseForLHS C.Pattern [C.Pattern]+ | NoParseForLHS LHSOrPatSyn C.Pattern+ | AmbiguousParseForLHS LHSOrPatSyn C.Pattern [C.Pattern]+{- UNUSED+ | NoParseForPatternSynonym C.Pattern+ | AmbiguousParseForPatternSynonym C.Pattern [C.Pattern]+-} -- Usage errors -- Implicit From Scope errors | IFSNoCandidateInScope Type -- Safe flag errors | SafeFlagPostulate C.Name | SafeFlagPragma [String]+ | SafeFlagNoTerminationCheck | SafeFlagPrimTrustMe+ -- Language option errors+ | NeedOptionCopatterns deriving (Typeable, Show) +-- | Distinguish error message when parsing lhs or pattern synonym, resp.+data LHSOrPatSyn = IsLHS | IsPatSyn deriving (Eq, Show)+ -- instance Show TypeError where -- show _ = "<TypeError>" -- TODO: more info? @@ -1021,48 +1238,31 @@ -- | Type-checking errors. -data TCErr' = TypeError TCState (Closure TypeError)- | Exception Range String- | IOException Range E.IOException- | PatternErr TCState -- ^ for pattern violations- {- AbortAssign TCState -- ^ used to abort assignment to meta when there are instantiations -- UNUSED -}- deriving (Typeable)---- | Type-checking errors, potentially paired with relevant syntax--- highlighting information.--data TCErr =- TCErr { errHighlighting :: Maybe (HighlightingInfo, ModuleToSource)- -- ^ The 'ModuleToSource' can be used to map the module- -- names in the 'HighlightingInfo' to file names.- , errError :: TCErr'- }+data TCErr = TypeError TCState (Closure TypeError)+ | Exception Range String+ | IOException Range E.IOException+ | PatternErr TCState -- ^ for pattern violations+ {- AbortAssign TCState -- ^ used to abort assignment to meta when there are instantiations -- UNUSED -} deriving (Typeable) instance Error TCErr where noMsg = strMsg ""- strMsg = TCErr Nothing . Exception noRange . strMsg+ strMsg = Exception noRange . strMsg instance Show TCErr where- show = show . errError--instance Show TCErr' where show (TypeError _ e) = show (envRange $ clEnv e) ++ ": " ++ show (clValue e) show (Exception r s) = show r ++ ": " ++ s show (IOException r e) = show r ++ ": " ++ show e show (PatternErr _) = "Pattern violation (you shouldn't see this)" {- show (AbortAssign _) = "Abort assignment (you shouldn't see this)" -- UNUSED -} -instance HasRange TCErr' where+instance HasRange TCErr where getRange (TypeError _ cl) = envRange $ clEnv cl getRange (Exception r _) = r getRange (IOException r _) = r getRange (PatternErr s) = noRange {- getRange (AbortAssign s) = noRange -- UNUSED -} -instance HasRange TCErr where- getRange = getRange . errError- instance Exception TCErr ---------------------------------------------------------------------------@@ -1126,22 +1326,69 @@ -- We want a special monad implementation of fail. instance MonadIO m => Monad (TCMT m) where- return x = TCM $ \_ _ -> return x- TCM m >>= k = TCM $ \r e -> do- x <- m r e- let TCM m' = k x in m' r e- TCM m1 >> TCM m2 = TCM $ \r e -> m1 r e >> m2 r e- fail = internalError+ return = returnTCMT+ (>>=) = bindTCMT+ (>>) = thenTCMT+ fail = internalError - {-# SPECIALIZE instance Monad TCM #-}+-- One goal of the definitions and pragmas below is to inline the+-- monad operations as much as possible. This doesn't seem to have a+-- large effect on the performance of the normal executable, but (at+-- least on one machine/configuration) it has a massive effect on the+-- performance of the profiling executable [1], and reduces the time+-- attributed to bind from over 90% to about 25%.+--+-- [1] When compiled with -auto-all and run with -p: roughly 750%+-- faster for one example. +returnTCMT :: MonadIO m => a -> TCMT m a+returnTCMT = \x -> TCM $ \_ _ -> return x+{-# RULES "returnTCMT"+ returnTCMT = \x -> TCM $ \_ _ -> return x+ #-}+{-# INLINE returnTCMT #-}+{-# SPECIALIZE INLINE returnTCMT :: a -> TCM a #-}++bindTCMT :: MonadIO m => TCMT m a -> (a -> TCMT m b) -> TCMT m b+bindTCMT = \(TCM m) k -> TCM $ \r e -> m r e >>= \x -> unTCM (k x) r e+{-# RULES "bindTCMT"+ bindTCMT = \(TCM m) k -> TCM $ \r e ->+ m r e >>= \x -> unTCM (k x) r e+ #-}+{-# INLINE bindTCMT #-}+{-# SPECIALIZE INLINE bindTCMT :: TCM a -> (a -> TCM b) -> TCM b #-}++thenTCMT :: MonadIO m => TCMT m a -> TCMT m b -> TCMT m b+thenTCMT = \(TCM m1) (TCM m2) -> TCM $ \r e -> m1 r e >> m2 r e+{-# RULES "thenTCMT"+ thenTCMT = \(TCM m1) (TCM m2) -> TCM $ \r e -> m1 r e >> m2 r e+ #-}+{-# INLINE thenTCMT #-}+{-# SPECIALIZE INLINE thenTCMT :: TCM a -> TCM b -> TCM b #-}+ instance MonadIO m => Functor (TCMT m) where- fmap = liftM+ fmap = fmapTCMT +fmapTCMT :: MonadIO m => (a -> b) -> TCMT m a -> TCMT m b+fmapTCMT = \f (TCM m) -> TCM $ \r e -> liftM f (m r e)+{-# RULES "fmapTCMT"+ fmapTCMT = \f (TCM m) -> TCM $ \r e -> liftM f (m r e)+ #-}+{-# INLINE fmapTCMT #-}+{-# SPECIALIZE INLINE fmapTCMT :: (a -> b) -> TCM a -> TCM b #-}+ instance MonadIO m => Applicative (TCMT m) where- pure = return- (<*>) = ap+ pure = returnTCMT+ (<*>) = apTCMT +apTCMT :: MonadIO m => TCMT m (a -> b) -> TCMT m a -> TCMT m b+apTCMT = \(TCM mf) (TCM m) -> TCM $ \r e -> ap (mf r e) (m r e)+{-# RULES "apTCMT"+ apTCMT = \(TCM mf) (TCM m) -> TCM $ \r e -> ap (mf r e) (m r e)+ #-}+{-# INLINE apTCMT #-}+{-# SPECIALIZE INLINE apTCMT :: TCM (a -> b) -> TCM a -> TCM b #-}+ instance MonadIO m => MonadIO (TCMT m) where liftIO m = TCM $ \s e -> do let r = envRange e@@ -1152,13 +1399,13 @@ wrap r m = failOnException handleException $ E.catch m (handleIOException r) - handleIOException r e = throwIO $ TCErr Nothing $ IOException r e- handleException r s = throwIO $ TCErr Nothing $ Exception r s+ handleIOException r e = throwIO $ IOException r e+ handleException r s = throwIO $ Exception r s patternViolation :: TCM a patternViolation = do s <- get- throwError $ TCErr Nothing $ PatternErr s+ throwError $ PatternErr s internalError :: MonadTCM tcm => String -> tcm a internalError s = typeError $ InternalError s@@ -1167,7 +1414,7 @@ typeError err = liftTCM $ do cl <- buildClosure err s <- get- throwError $ TCErr Nothing $ TypeError s cl+ throwError $ TypeError s cl -- | Running the type checking monad runTCM :: TCMT IO a -> IO (Either TCErr a)@@ -1178,6 +1425,29 @@ r <- liftIO $ newIORef initState unTCM m r initEnv +-- | Runs the given computation in a separate thread, with /a copy/ of+-- the current state and environment.+--+-- Note that Agda sometimes uses actual, mutable state. If the+-- computation given to @forkTCM@ tries to /modify/ this state, then+-- bad things can happen, because accesses are not mutually exclusive.+-- The @forkTCM@ function has been added mainly to allow the thread to+-- /read/ (a snapshot of) the current state in a convenient way.+--+-- Note also that exceptions which are raised in the thread are not+-- propagated to the parent, so the thread should not do anything+-- important.++forkTCM :: TCM a -> TCM ()+forkTCM m = do+ s <- get+ e <- ask+ liftIO $ C.forkIO $ do+ runTCM $ local (\_ -> e) $ do+ put s+ m+ return ()+ return ()
+ src/full/Agda/TypeChecking/Monad/Base.hs-boot view
@@ -0,0 +1,7 @@+{-# LANGUAGE KindSignatures #-}++module Agda.TypeChecking.Monad.Base where++data TCMT (m :: * -> *) a++type TCM = TCMT IO
src/full/Agda/TypeChecking/Monad/Builtin.hs view
@@ -1,14 +1,32 @@ module Agda.TypeChecking.Monad.Builtin where -import Data.Functor+import Control.Monad.Error import Control.Monad.State++import Data.Functor import qualified Data.Map as Map import Agda.Syntax.Position+import Agda.Syntax.Literal import Agda.Syntax.Internal import Agda.TypeChecking.Monad.Base +import Agda.Utils.Monad (when_)++litType :: Literal -> TCM Type+litType l = case l of+ LitInt _ n -> do+ primZero+ when_ (n > 0) $ primSuc+ el <$> primNat+ LitFloat _ _ -> el <$> primFloat+ LitChar _ _ -> el <$> primChar+ LitString _ _ -> el <$> primString+ LitQName _ _ -> el <$> primQName+ where+ el t = El (mkType 0) t+ getBuiltinThing :: String -> TCM (Maybe (Builtin PrimFun)) getBuiltinThing b = liftM2 mplus (Map.lookup b <$> gets stLocalBuiltins) (Map.lookup b <$> gets stImportedBuiltins)@@ -61,17 +79,19 @@ primInteger, primFloat, primChar, primString, primBool, primTrue, primFalse, primList, primNil, primCons, primIO, primNat, primSuc, primZero, primNatPlus, primNatMinus, primNatTimes, primNatDivSucAux, primNatModSucAux,- primNatEquality, primNatLess, primSize, primSizeSuc, primSizeInf,+ primNatEquality, primNatLess,+ primSize, primSizeLt, primSizeSuc, primSizeInf, primInf, primSharp, primFlat, primEquality, primRefl, primLevel, primLevelZero, primLevelSuc, primLevelMax,+ primIrrAxiom, -- builtins for reflection: primQName, primArg, primArgArg, primAgdaTerm, primAgdaTermVar, primAgdaTermLam, primAgdaTermDef, primAgdaTermCon, primAgdaTermPi, primAgdaTermSort, primAgdaTermUnsupported, primAgdaType, primAgdaTypeEl, primHiding, primHidden, primInstance, primVisible,- primRelvance, primRelevant, primIrrelevant,+ primRelevance, primRelevant, primIrrelevant, primAgdaSort, primAgdaSortSet, primAgdaSortLit, primAgdaSortUnsupported, primAgdaDefinition, primAgdaDefinitionFunDef, primAgdaDefinitionDataDef, primAgdaDefinitionRecordDef, primAgdaDefinitionPostulate, primAgdaDefinitionPrimitive, primAgdaDefinitionDataConstructor,@@ -99,8 +119,10 @@ primNatEquality = getBuiltin builtinNatEquals primNatLess = getBuiltin builtinNatLess primSize = getBuiltin builtinSize+primSizeLt = getBuiltin builtinSizeLt primSizeSuc = getBuiltin builtinSizeSuc primSizeInf = getBuiltin builtinSizeInf+primSizeMax = getBuiltin builtinSizeMax primInf = getBuiltin builtinInf primSharp = getBuiltin builtinSharp primFlat = getBuiltin builtinFlat@@ -110,6 +132,7 @@ primLevelZero = getBuiltin builtinLevelZero primLevelSuc = getBuiltin builtinLevelSuc primLevelMax = getBuiltin builtinLevelMax+primIrrAxiom = getBuiltin builtinIrrAxiom primQName = getBuiltin builtinQName primArg = getBuiltin builtinArg primArgArg = getBuiltin builtinArgArg@@ -120,7 +143,7 @@ primHidden = getBuiltin builtinHidden primInstance = getBuiltin builtinInstance primVisible = getBuiltin builtinVisible-primRelvance = getBuiltin builtinRelevance+primRelevance = getBuiltin builtinRelevance primRelevant = getBuiltin builtinRelevant primIrrelevant = getBuiltin builtinIrrelevant primAgdaSortSet = getBuiltin builtinAgdaSortSet@@ -166,8 +189,10 @@ builtinCons = "CONS" builtinIO = "IO" builtinSize = "SIZE"+builtinSizeLt = "SIZELT" builtinSizeSuc = "SIZESUC" builtinSizeInf = "SIZEINF"+builtinSizeMax = "SIZEMAX" builtinInf = "INFINITY" builtinSharp = "SHARP" builtinFlat = "FLAT"@@ -177,6 +202,7 @@ builtinLevel = "LEVEL" builtinLevelZero = "LEVELZERO" builtinLevelSuc = "LEVELSUC"+builtinIrrAxiom = "IRRAXIOM" builtinQName = "QNAME" builtinAgdaSort = "AGDASORT" builtinAgdaSortSet = "AGDASORTSET"@@ -211,3 +237,25 @@ builtinAgdaDefinitionPostulate = "AGDADEFINITIONPOSTULATE" builtinAgdaDefinitionPrimitive = "AGDADEFINITIONPRIMITIVE" builtinAgdaDefinition = "AGDADEFINITION"++-- | The coinductive primitives.++data CoinductionKit = CoinductionKit+ { nameOfInf :: QName+ , nameOfSharp :: QName+ , nameOfFlat :: QName+ }++-- | Tries to build a 'CoinductionKit'.++coinductionKit :: TCM (Maybe CoinductionKit)+coinductionKit = (do+ Def inf _ <- ignoreSharing <$> primInf+ Def sharp _ <- ignoreSharing <$> primSharp+ Def flat _ <- ignoreSharing <$> primFlat+ return $ Just $ CoinductionKit+ { nameOfInf = inf+ , nameOfSharp = sharp+ , nameOfFlat = flat+ })+ `catchError` \_ -> return Nothing
src/full/Agda/TypeChecking/Monad/Constraints.hs view
@@ -52,8 +52,8 @@ isProblemSolved :: ProblemId -> TCM Bool isProblemSolved pid =- (&&) <$> (notElem pid <$> asks envActiveProblems)- <*> (all ((/= pid) . constraintProblem) <$> getAllConstraints)+ and2M (notElem pid <$> asks envActiveProblems)+ (all ((/= pid) . constraintProblem) <$> getAllConstraints) getConstraintsForProblem :: ProblemId -> TCM Constraints getConstraintsForProblem pid = List.filter ((== pid) . constraintProblem) <$> getAllConstraints@@ -73,6 +73,23 @@ , stAwakeConstraints = stAwakeConstraints s ++ wakeup } +-- danger...+dropConstraints :: (ProblemConstraint -> Bool) -> TCM ()+dropConstraints crit = do+ sleepers <- gets stSleepingConstraints+ wakers <- gets stAwakeConstraints+ let filt = List.filter (not . crit)+ modify $ \s -> s { stSleepingConstraints = filt sleepers+ , stAwakeConstraints = filt wakers+ }++putAllConstraintsToSleep :: TCM ()+putAllConstraintsToSleep = do+ awakeOnes <- gets stAwakeConstraints+ sleepers <- gets stSleepingConstraints+ modify $ \s -> s { stSleepingConstraints = sleepers ++ awakeOnes+ , stAwakeConstraints = [] }+ takeAwakeConstraint :: TCM (Maybe ProblemConstraint) takeAwakeConstraint = do cs <- getAwakeConstraints@@ -103,7 +120,7 @@ addConstraint' :: Constraint -> TCM () addConstraint' c = do pc <- build- modify $ \s -> s { stSleepingConstraints = pc : stSleepingConstraints s }+ modify $ \s -> s { stDirty = True, stSleepingConstraints = pc : stSleepingConstraints s } where build | isBlocking c = buildConstraint c | otherwise = buildProblemConstraint 0 c
src/full/Agda/TypeChecking/Monad/Context.hs view
@@ -21,12 +21,14 @@ #include "../../undefined.h" import Agda.Utils.Impossible +-- * Modifying the context+ -- | Modify the 'ctxEntry' field of a 'ContextEntry'.-modifyContextEntry :: (Arg (Name, Type) -> Arg (Name, Type)) -> ContextEntry -> ContextEntry+modifyContextEntry :: (Dom (Name, Type) -> Dom (Name, Type)) -> ContextEntry -> ContextEntry modifyContextEntry f ce = ce { ctxEntry = f (ctxEntry ce) } -- | Modify all 'ContextEntry's.-modifyContextEntries :: (Arg (Name, Type) -> Arg (Name, Type)) -> Context -> Context+modifyContextEntries :: (Dom (Name, Type) -> Dom (Name, Type)) -> Context -> Context modifyContextEntries f = map (modifyContextEntry f) -- | Modify a 'Context' in a computation.@@ -34,64 +36,96 @@ modifyContext :: MonadTCM tcm => (Context -> Context) -> tcm a -> tcm a modifyContext f = local $ \ e -> e { envContext = f (envContext e) } -{-# SPECIALIZE mkContextEntry :: Arg (Name, Type) -> TCM ContextEntry #-}-mkContextEntry :: MonadTCM tcm => Arg (Name, Type) -> tcm ContextEntry+{-# SPECIALIZE mkContextEntry :: Dom (Name, Type) -> TCM ContextEntry #-}+mkContextEntry :: MonadTCM tcm => Dom (Name, Type) -> tcm ContextEntry mkContextEntry x = do i <- fresh return $ Ctx i x +-- | Change the context.+{-# SPECIALIZE inContext :: [Dom (Name, Type)] -> TCM a -> TCM a #-}+inContext :: MonadTCM tcm => [Dom (Name, Type)] -> tcm a -> tcm a+inContext xs ret = do+ ctx <- mapM mkContextEntry xs+ modifyContext (const ctx) ret++-- | Change to top (=empty) context.+{-# SPECIALIZE inTopContext :: TCM a -> TCM a #-}+inTopContext :: MonadTCM tcm => tcm a -> tcm a+inTopContext = modifyContext $ const []++-- | Delete the last @n@ bindings from the context.+{-# SPECIALIZE escapeContext :: Int -> TCM a -> TCM a #-}+escapeContext :: MonadTCM tcm => Int -> tcm a -> tcm a+escapeContext n = modifyContext $ drop n++-- | Deprecated.+{-# SPECIALIZE escapeContextToTopLevel :: TCM a -> TCM a #-}+escapeContextToTopLevel :: MonadTCM tcm => tcm a -> tcm a+escapeContextToTopLevel = modifyContext $ const []++-- * Adding to the context+ -- | @addCtx x arg cont@ add a variable to the context. -- -- Chooses an unused 'Name'.-{-# SPECIALIZE addCtx :: Name -> Arg Type -> TCM a -> TCM a #-}-addCtx :: MonadTCM tcm => Name -> Arg Type -> tcm a -> tcm a+{-# SPECIALIZE addCtx :: Name -> Dom Type -> TCM a -> TCM a #-}+addCtx :: MonadTCM tcm => Name -> Dom Type -> tcm a -> tcm a addCtx x a ret = do- ctx <- map (nameConcrete . fst . unArg) <$> getContext+ ctx <- map (nameConcrete . fst . unDom) <$> getContext let x' = head $ filter (notTaken ctx) $ iterate nextName x ce <- mkContextEntry $ fmap ((,) x') a- flip local ret $ \e -> e { envContext = ce : envContext e }+ modifyContext (ce :) ret -- let-bindings keep track of own their context where notTaken xs x = isNoName (nameConcrete x) || nameConcrete x `notElem` xs -- | N-ary variant of @addCtx@.-{-# SPECIALIZE addContext :: [Arg (Name, Type)] -> TCM a -> TCM a #-}-addContext :: MonadTCM tcm => [Arg (Name, Type)] -> tcm a -> tcm a+{-# SPECIALIZE addContext :: [Dom (Name, Type)] -> TCM a -> TCM a #-}+addContext :: MonadTCM tcm => [Dom (Name, Type)] -> tcm a -> tcm a addContext ctx m =- foldr (\arg -> addCtx (fst $ unArg arg) (fmap snd arg)) m ctx+ foldr (\arg -> addCtx (fst $ unDom arg) (fmap snd arg)) m ctx +-- | add a bunch of variables with the same type to the context+{-# SPECIALIZE addCtxs :: [Name] -> Dom Type -> TCM a -> TCM a #-}+addCtxs :: MonadTCM tcm => [Name] -> Dom Type -> tcm a -> tcm a+addCtxs [] _ k = k+addCtxs (x:xs) t k = addCtx x t $ addCtxs xs (raise 1 t) k+ -- | Turns the string into a name and adds it to the context.-{-# SPECIALIZE addCtxString :: String -> Arg Type -> TCM a -> TCM a #-}-addCtxString :: MonadTCM tcm => String -> Arg Type -> tcm a -> tcm a+{-# SPECIALIZE addCtxString :: String -> Dom Type -> TCM a -> TCM a #-}+addCtxString :: MonadTCM tcm => String -> Dom Type -> tcm a -> tcm a addCtxString s a m = do x <- freshName_ s addCtx x a m --- | Change the context-{-# SPECIALIZE inContext :: [Arg (Name, Type)] -> TCM a -> TCM a #-}-inContext :: MonadTCM tcm => [Arg (Name, Type)] -> tcm a -> tcm a-inContext xs ret = do- ctx <- mapM mkContextEntry xs- flip local ret $ \e -> e { envContext = ctx }+-- | Turns the string into a name and adds it to the context, with dummy type.+{-# SPECIALIZE addCtxString_ :: String -> TCM a -> TCM a #-}+addCtxString_ :: MonadTCM tcm => String -> tcm a -> tcm a+addCtxString_ s = addCtxString s dummyDom +-- | Context entries without a type have this dummy type.+dummyDom :: Dom Type+dummyDom = Dom NotHidden Relevant $ El Prop $ Sort Prop+ -- | Go under an abstraction.-{-# SPECIALIZE underAbstraction :: Raise a => Arg Type -> Abs a -> (a -> TCM b) -> TCM b #-}-underAbstraction :: (Raise a, MonadTCM tcm) => Arg Type -> Abs a -> (a -> tcm b) -> tcm b+{-# SPECIALIZE underAbstraction :: Subst a => Dom Type -> Abs a -> (a -> TCM b) -> TCM b #-}+underAbstraction :: (Subst a, MonadTCM tcm) => Dom Type -> Abs a -> (a -> tcm b) -> tcm b underAbstraction _ (NoAbs _ v) k = k v underAbstraction t a k = do- xs <- map (nameConcrete . fst . unArg) <$> getContext+ xs <- map (nameConcrete . fst . unDom) <$> getContext x <- freshName_ $ realName $ absName a let y = head $ filter (notTaken xs) $ iterate nextName x addCtx y t $ k $ absBody a where notTaken xs x = isNoName (nameConcrete x) || notElem (nameConcrete x) xs- realName "_" = "y"+ realName "_" = "x" realName s = s -- | Go under an abstract without worrying about the type to add to the context.-{-# SPECIALIZE underAbstraction_ :: Raise a => Abs a -> (a -> TCM b) -> TCM b #-}-underAbstraction_ :: (Raise a, MonadTCM tcm) => Abs a -> (a -> tcm b) -> tcm b-underAbstraction_ = underAbstraction (Arg NotHidden Relevant $ sort Prop)+{-# SPECIALIZE underAbstraction_ :: Subst a => Abs a -> (a -> TCM b) -> TCM b #-}+underAbstraction_ :: (Subst a, MonadTCM tcm) => Abs a -> (a -> tcm b) -> tcm b+underAbstraction_ = underAbstraction dummyDom -- | Add a telescope to the context. {-# SPECIALIZE addCtxTel :: Telescope -> TCM a -> TCM a #-}@@ -99,17 +133,34 @@ addCtxTel EmptyTel ret = ret addCtxTel (ExtendTel t tel) ret = underAbstraction t tel $ \tel -> addCtxTel tel ret ++-- | Add a let bound variable+{-# SPECIALIZE addLetBinding :: Relevance -> Name -> Term -> Type -> TCM a -> TCM a #-}+addLetBinding :: MonadTCM tcm => Relevance -> Name -> Term -> Type -> tcm a -> tcm a+addLetBinding rel x v t0 ret = do+ let t = Dom NotHidden rel t0+ vt <- liftTCM $ makeOpen (v, t)+ flip local ret $ \e -> e { envLetBindings = Map.insert x vt $ envLetBindings e }+++-- * Querying the context+ -- | Get the current context.-{-# SPECIALIZE getContext :: TCM [Arg (Name, Type)] #-}-getContext :: MonadTCM tcm => tcm [Arg (Name, Type)]+{-# SPECIALIZE getContext :: TCM [Dom (Name, Type)] #-}+getContext :: MonadTCM tcm => tcm [Dom (Name, Type)] getContext = asks $ map ctxEntry . envContext +-- | Get the size of the current context.+{-# SPECIALIZE getContextSize :: TCM Nat #-}+getContextSize :: MonadTCM tcm => tcm Nat+getContextSize = genericLength <$> asks envContext+ -- | Generate [Var n - 1, .., Var 0] for all declarations in the context. {-# SPECIALIZE getContextArgs :: TCM Args #-} getContextArgs :: MonadTCM tcm => tcm Args getContextArgs = do ctx <- getContext- return $ reverse $ [ Arg h r $ Var i [] | (Arg h r _, i) <- zip ctx [0..] ]+ return $ reverse $ [ Arg h r $ var i | (Dom h r _, i) <- zip ctx [0..] ] {-# SPECIALIZE getContextTerms :: TCM [Term] #-} getContextTerms :: MonadTCM tcm => tcm [Term]@@ -120,45 +171,31 @@ getContextTelescope :: MonadTCM tcm => tcm Telescope getContextTelescope = foldr extTel EmptyTel . reverse <$> getContext where- extTel (Arg h r (x, t)) = ExtendTel (Arg h r t) . Abs (show x)---- | add a bunch of variables with the same type to the context-{-# SPECIALIZE addCtxs :: [Name] -> Arg Type -> TCM a -> TCM a #-}-addCtxs :: MonadTCM tcm => [Name] -> Arg Type -> tcm a -> tcm a-addCtxs [] _ k = k-addCtxs (x:xs) t k = addCtx x t $ addCtxs xs (raise 1 t) k+ extTel (Dom h r (x, t)) = ExtendTel (Dom h r t) . Abs (show x) -- | Check if we are in a compatible context, i.e. an extension of the given context. {-# SPECIALIZE getContextId :: TCM [CtxId] #-} getContextId :: MonadTCM tcm => tcm [CtxId] getContextId = asks $ map ctxId . envContext --- | Add a let bound variable-{-# SPECIALIZE addLetBinding :: Relevance -> Name -> Term -> Type -> TCM a -> TCM a #-}-addLetBinding :: MonadTCM tcm => Relevance -> Name -> Term -> Type -> tcm a -> tcm a-addLetBinding rel x v t0 ret = do- let t = Arg NotHidden rel t0- vt <- liftTCM $ makeOpen (v, t)- flip local ret $ \e -> e { envLetBindings = Map.insert x vt $ envLetBindings e }- -- | get type of bound variable (i.e. deBruijn index) ---{-# SPECIALIZE typeOfBV' :: Nat -> TCM (Arg Type) #-}-typeOfBV' :: MonadTCM tcm => Nat -> tcm (Arg Type)+{-# SPECIALIZE typeOfBV' :: Nat -> TCM (Dom Type) #-}+typeOfBV' :: MonadTCM tcm => Nat -> tcm (Dom Type) typeOfBV' n = do ctx <- getContext- Arg h r (_,t) <- ctx !!! n- return $ Arg h r $ raise (n + 1) t+ Dom h r (_,t) <- ctx !!! n+ return $ Dom h r $ raise (n + 1) t {-# SPECIALIZE typeOfBV :: Nat -> TCM Type #-} typeOfBV :: MonadTCM tcm => Nat -> tcm Type-typeOfBV i = unArg <$> typeOfBV' i+typeOfBV i = unDom <$> typeOfBV' i {-# SPECIALIZE nameOfBV :: Nat -> TCM Name #-} nameOfBV :: MonadTCM tcm => Nat -> tcm Name nameOfBV n = do ctx <- getContext- Arg _ _ (x,_) <- ctx !!! n+ Dom _ _ (x,_) <- ctx !!! n return x -- | TODO: move(?)@@ -166,28 +203,23 @@ where [] !!!! _ = do ctx <- getContext- fail $ "deBruijn index out of scope: " ++ show n ++ " in context " ++ show (map (fst . unArg) ctx)+ fail $ "deBruijn index out of scope: " ++ show n ++ " in context " ++ show (map (fst . unDom) ctx) (x:_) !!!! 0 = return x (_:xs) !!!! n = xs !!!! (n - 1) -- | Get the term corresponding to a named variable. If it is a lambda bound -- variable the deBruijn index is returned and if it is a let bound variable -- its definition is returned.-{-# SPECIALIZE getVarInfo :: Name -> TCM (Term, Arg Type) #-}-getVarInfo :: MonadTCM tcm => Name -> tcm (Term, Arg Type)+{-# SPECIALIZE getVarInfo :: Name -> TCM (Term, Dom Type) #-}+getVarInfo :: MonadTCM tcm => Name -> tcm (Term, Dom Type) getVarInfo x = do ctx <- getContext def <- asks envLetBindings- case findIndex ((==x) . fst . unArg) ctx of- Just n0 ->- do let n = fromIntegral n0- t <- typeOfBV' n- return (Var n [], t)+ case findIndex ((==x) . fst . unDom) ctx of+ Just n -> do+ t <- typeOfBV' n+ return (Var n [], t) _ -> case Map.lookup x def of Just vt -> liftTCM $ getOpen vt _ -> fail $ "unbound variable " ++ show x--{-# SPECIALIZE escapeContext :: Int -> TCM a -> TCM a #-}-escapeContext :: MonadTCM tcm => Int -> tcm a -> tcm a-escapeContext n = local $ \e -> e { envContext = drop n $ envContext e }
src/full/Agda/TypeChecking/Monad/Context.hs-boot view
@@ -5,5 +5,5 @@ import Agda.Syntax.Internal import Agda.TypeChecking.Monad.Base -getContext :: MonadTCM tcm => tcm [Arg (Name, Type)]+getContext :: MonadTCM tcm => tcm [Dom (Name, Type)] getContextId :: MonadTCM tcm => tcm [CtxId]
src/full/Agda/TypeChecking/Monad/Debug.hs view
@@ -1,8 +1,7 @@ module Agda.TypeChecking.Monad.Debug where -import qualified Agda.Utils.IO.Locale as LocIO import Control.Monad.Trans ( MonadIO(liftIO) ) debug :: MonadIO m => String -> m ()-debug s = liftIO $ LocIO.putStrLn s+debug s = liftIO $ putStrLn s
src/full/Agda/TypeChecking/Monad/Env.hs view
@@ -32,15 +32,15 @@ -- | Set the current environment to the given withEnv :: TCEnv -> TCM a -> TCM a-withEnv env m = local (const env) m+withEnv env m = local (\env0 -> env { envAllowDestructiveUpdate = envAllowDestructiveUpdate env0 }) m --- | Get the current environmnet+-- | Get the current environment getEnv :: TCM TCEnv getEnv = ask --- | Leave the top level to type check local things.-leaveTopLevel :: TCM a -> TCM a-leaveTopLevel = local $ \ env -> env { envTopLevel = False }--onTopLevel :: TCM Bool-onTopLevel = asks envTopLevel+-- | Increases the module nesting level by one in the given+-- computation.+withIncreasedModuleNestingLevel :: TCM a -> TCM a+withIncreasedModuleNestingLevel =+ local (\e -> e { envModuleNestingLevel =+ envModuleNestingLevel e + 1 })
src/full/Agda/TypeChecking/Monad/Exception.hs view
@@ -2,7 +2,10 @@ -- | Basically a copy of the ErrorT monad transformer. It's handy to slap -- onto TCM and still be a MonadTCM (which isn't possible with ErrorT).++-- Andreas, 2012-03-30: the following command seems to be STALE. -- Also, it does not require the silly Error instance for the err type.+-- The silly Error instance is back. ;-) module Agda.TypeChecking.Monad.Exception where
src/full/Agda/TypeChecking/Monad/Imports.hs view
@@ -11,12 +11,11 @@ import qualified Data.List as List import qualified Data.Set as Set -import System.Time- import Agda.Syntax.Abstract.Name import qualified Agda.Syntax.Concrete.Name as C import Agda.TypeChecking.Monad.Base import Agda.Utils.Monad+import Agda.Utils.Time addImport :: ModuleName -> TCM () addImport m =
src/full/Agda/TypeChecking/Monad/MetaVars.hs view
@@ -7,6 +7,7 @@ import qualified Data.Map as Map import qualified Data.Set as Set +import Agda.Syntax.Common import Agda.Syntax.Internal import Agda.Syntax.Position import Agda.Syntax.Scope.Base@@ -18,6 +19,8 @@ import Agda.TypeChecking.Monad.Trace import Agda.TypeChecking.Monad.Closure import Agda.TypeChecking.Monad.Open+import Agda.TypeChecking.Monad.Options (reportSLn)+import Agda.TypeChecking.Monad.Sharing import Agda.TypeChecking.Substitute -- import Agda.TypeChecking.Pretty -- LEADS TO import cycle @@ -28,6 +31,10 @@ #include "../../undefined.h" import Agda.Utils.Impossible +-- | Switch off assignment of metas.+dontAssignMetas :: TCM a -> TCM a+dontAssignMetas = local $ \ env -> env { envAssignMetas = False }+ -- | Get the meta store. getMetaStore :: TCM MetaStore getMetaStore = gets stMetaStore@@ -50,6 +57,11 @@ getMetaPriority :: MetaId -> TCM MetaPriority getMetaPriority i = mvPriority <$> lookupMeta i +{- UNUSED+getMetaRelevance :: MetaId -> TCM Relevance+getMetaRelevance x = miRelevance . mvInfo <$> lookupMeta x+-}+ isSortMeta :: MetaId -> TCM Bool isSortMeta m = do mv <- lookupMeta m@@ -57,6 +69,13 @@ HasType{} -> False IsSort{} -> True +getMetaType :: MetaId -> TCM Type+getMetaType m = do+ mv <- lookupMeta m+ return $ case mvJudgement mv of+ HasType{ jMetaType = t } -> t+ IsSort{} -> __IMPOSSIBLE__+ isInstantiatedMeta :: MetaId -> TCM Bool isInstantiatedMeta m = do mv <- lookupMeta m@@ -65,11 +84,39 @@ InstS{} -> True _ -> False +-- | Create 'MetaInfo' in the current environment. createMetaInfo :: TCM MetaInfo-createMetaInfo =- do r <- getCurrentRange- buildClosure r+createMetaInfo = createMetaInfo' RunMetaOccursCheck +createMetaInfo' :: RunMetaOccursCheck -> TCM MetaInfo+createMetaInfo' b = do+ r <- getCurrentRange+ cl <- buildClosure r+ return MetaInfo+ { miClosRange = cl+ , miMetaOccursCheck = b+ , miNameSuggestion = ""+ }++setValueMetaName :: Term -> MetaNameSuggestion -> TCM ()+setValueMetaName v s = do+ case ignoreSharing v of+ MetaV mi _ -> setMetaNameSuggestion mi s+ u -> do+ reportSLn "tc.meta.name" 70 $+ "cannot set meta name; newMeta returns " ++ show u+ return ()++getMetaNameSuggestion :: MetaId -> TCM MetaNameSuggestion+getMetaNameSuggestion mi = miNameSuggestion . mvInfo <$> lookupMeta mi++setMetaNameSuggestion :: MetaId -> MetaNameSuggestion -> TCM ()+setMetaNameSuggestion mi s = do+ reportSLn "tc.meta.name" 20 $+ "setting name of meta " ++ show mi ++ " to " ++ s+ updateMetaVar mi $ \ mvar ->+ mvar { mvInfo = (mvInfo mvar) { miNameSuggestion = s }}+ updateMetaVarRange :: MetaId -> Range -> TCM () updateMetaVarRange mi r = updateMetaVar mi (setRange r) @@ -142,8 +189,12 @@ mv <- lookupMeta mi return $ getMetaScope mv -withMetaInfo :: MetaInfo -> TCM a -> TCM a-withMetaInfo mI m = enterClosure mI $ \r -> setCurrentRange r m+withMetaInfo' :: MetaVariable -> TCM a -> TCM a+withMetaInfo' mv = withMetaInfo (miClosRange $ mvInfo mv)++withMetaInfo :: Closure Range -> TCM a -> TCM a+withMetaInfo mI cont = enterClosure mI $ \ r ->+ setCurrentRange r cont getInstantiatedMetas :: TCM [MetaId] getInstantiatedMetas = do
src/full/Agda/TypeChecking/Monad/Mutual.hs view
@@ -8,6 +8,7 @@ import qualified Data.Map as Map import Data.Set (Set) import qualified Data.Set as Set+import qualified Agda.Utils.HashMap as HMap import Agda.Syntax.Internal import Agda.TypeChecking.Monad.Base@@ -38,15 +39,16 @@ } } where- setMutId x i = flip Map.adjust x $ \defn -> defn { defMutual = i }+ setMutId x i = flip HMap.adjust x $ \defn -> defn { defMutual = i } -- | Get all mutual blocks getMutualBlocks :: TCM [Set QName] getMutualBlocks = gets $ Map.elems . stMutualBlocks --- | Get the current mutual block.-currentMutualBlock :: TCM MutualId-currentMutualBlock = maybe fresh return =<< asks envMutualBlock+-- | Get the current mutual block, if any, otherwise a fresh mutual+-- block is returned.+currentOrFreshMutualBlock :: TCM MutualId+currentOrFreshMutualBlock = maybe fresh return =<< asks envMutualBlock lookupMutualBlock :: MutualId -> TCM (Set QName) lookupMutualBlock mi = do
src/full/Agda/TypeChecking/Monad/Open.hs view
@@ -35,14 +35,14 @@ -- | Extract the value from an open term. Must be done in an extension of the -- context in which the term was created.-getOpen :: Raise a => Open a -> TCM a+getOpen :: Subst a => Open a -> TCM a getOpen (OpenThing [] x) = return x getOpen (OpenThing ctx x) = do ctx' <- getContextId unless (ctx `isSuffixOf` ctx') $ fail $ "thing out of context (" ++ show ctx ++ " is not a sub context of " ++ show ctx' ++ ")" return $ raise (genericLength ctx' - genericLength ctx) x -tryOpen :: Raise a => Open a -> TCM (Maybe a)+tryOpen :: Subst a => Open a -> TCM (Maybe a) tryOpen o = (Just <$> getOpen o) `catchError` \_ -> return Nothing
src/full/Agda/TypeChecking/Monad/Options.hs view
@@ -2,22 +2,26 @@ module Agda.TypeChecking.Monad.Options where +import Control.Monad.Error import Control.Monad.Reader import Control.Monad.State import Data.Maybe import Text.PrettyPrint-import qualified Agda.Utils.IO.Locale as LocIO import System.Directory import System.FilePath+import System.IO import Agda.Syntax.Concrete+import {-# SOURCE #-} Agda.TypeChecking.Errors import Agda.TypeChecking.Monad.Base import Agda.TypeChecking.Monad.State+import Agda.Interaction.EmacsCommand as Emacs import Agda.Interaction.FindFile import Agda.Interaction.Options import Agda.Utils.FileName import Agda.Utils.Monad import Agda.Utils.List+import Agda.Utils.String import Agda.Utils.Trie (Trie) import qualified Agda.Utils.Trie as Trie @@ -144,7 +148,7 @@ -- -- If the include directories change (and they were previously -- @'Right' something@), then the state is reset (completely, except--- for the include directories).+-- for the include directories and 'stInteractionOutputCallback'). -- -- An empty list is interpreted as @["."]@. @@ -183,7 +187,9 @@ incs <- getIncludeDirs case oldIncs of Right incs' | incs' /= incs -> do+ ho <- stInteractionOutputCallback <$> get resetAllState+ modify $ \st -> st { stInteractionOutputCallback = ho } setIncs incs _ -> return () @@ -215,6 +221,23 @@ showImplicitArguments :: TCM Bool showImplicitArguments = optShowImplicit <$> pragmaOptions +showIrrelevantArguments :: TCM Bool+showIrrelevantArguments = optShowIrrelevant <$> pragmaOptions++-- | Switch on printing of implicit and irrelevant arguments.+-- E.g. for reification in with-function generation.+withShowAllArguments :: TCM a -> TCM a+withShowAllArguments ret = do+ opts <- pragmaOptions+ let imp = optShowImplicit opts+ irr = optShowIrrelevant opts+ setPragmaOptions $ opts { optShowImplicit = True, optShowIrrelevant = True }+ x <- ret+ opts <- pragmaOptions+ setPragmaOptions $ opts { optShowImplicit = imp, optShowIrrelevant = irr }+ return x++{- RETIRED, Andreas, 2012-04-30 setShowImplicitArguments :: Bool -> TCM a -> TCM a setShowImplicitArguments showImp ret = do opts <- pragmaOptions@@ -224,6 +247,7 @@ opts <- pragmaOptions setPragmaOptions $ opts { optShowImplicit = imp } return x+-} ignoreInterfaces :: TCM Bool ignoreInterfaces = optIgnoreInterfaces <$> commandLineOptions@@ -234,6 +258,16 @@ typeInType :: TCM Bool typeInType = not . optUniverseCheck <$> pragmaOptions +------------------------------------------------------------------------+-- Verbosity++-- Invariant (which we may or may not currently break): Debug+-- printouts use one of the following functions:+--+-- reportS+-- reportSLn+-- reportSDoc+ getVerbosity :: TCM (Trie String Int) getVerbosity = optVerbose <$> pragmaOptions @@ -247,24 +281,52 @@ m = maximum $ 0 : Trie.lookupPath ks t return (n <= m) +-- | If this command is run under the Emacs mode, then it formats the+-- debug message in such a way that the Emacs mode can understand it.++emacsifyDebugMessage :: String -- ^ The debug message.+ -> TCM String+emacsifyDebugMessage s =+ ifM (envEmacs <$> ask)+ (return $ Emacs.response $+ L [ A "agda2-verbose"+ , A (quote s)+ ])+ (return s)++-- | Displays a debug message in a suitable way.+displayDebugMessage :: String -> TCM ()+displayDebugMessage s =+ liftIO . putStr =<< emacsifyDebugMessage s+ -- | Precondition: The level must be non-negative. verboseS :: VerboseKey -> Int -> TCM () -> TCM () verboseS k n action = whenM (hasVerbosity k n) action reportS :: VerboseKey -> Int -> String -> TCM ()-reportS k n s = verboseS k n $ liftIO $ LocIO.putStr s+reportS k n s = verboseS k n $ displayDebugMessage s reportSLn :: VerboseKey -> Int -> String -> TCM ()-reportSLn k n s = verboseS k n $ liftIO $ LocIO.putStrLn s >> LocIO.stdoutFlush+reportSLn k n s = verboseS k n $ do+ displayDebugMessage (s ++ "\n")+ liftIO $ hFlush stdout reportSDoc :: VerboseKey -> Int -> TCM Doc -> TCM ()-reportSDoc k n d = verboseS k n $ liftIO . LocIO.print =<< d+reportSDoc k n d = verboseS k n $ do+ displayDebugMessage . (++ "\n") . show =<< do+ d `catchError` \ err ->+ (\ s -> (sep $ map text+ [ "Printing debug message"+ , k ++ ":" ++show n+ , "failed due to error:" ]) $$+ (nest 2 $ text s)) <$> prettyError err + verboseBracket :: VerboseKey -> Int -> String -> TCM a -> TCM a verboseBracket k n s m = do v <- hasVerbosity k n if not v then m else do- liftIO $ LocIO.putStrLn $ "{ " ++ s- x <- m `finally` liftIO (LocIO.putStrLn "}")+ displayDebugMessage $ "{ " ++ s ++ "\n"+ x <- m `finally` displayDebugMessage "}\n" return x
+ src/full/Agda/TypeChecking/Monad/Sharing.hs view
@@ -0,0 +1,55 @@+{-# LANGUAGE CPP #-}+module Agda.TypeChecking.Monad.Sharing where++import Control.Monad.Reader+import Data.List+import Data.Function+import Data.Traversable++import Agda.Syntax.Internal+import Agda.TypeChecking.Monad.Base+import Agda.TypeChecking.Monad.Options+import Agda.Utils.Monad+import Agda.Utils.Impossible++#include "../../undefined.h"++updateSharedTerm :: MonadTCM tcm => (Term -> tcm Term) -> Term -> tcm Term+updateSharedTerm f v =+ ifM (liftTCM $ asks envAllowDestructiveUpdate)+ (updateSharedM f v)+ (f $ ignoreSharing v)++updateSharedTermF :: (MonadTCM tcm, Traversable f) => (Term -> tcm (f Term)) -> Term -> tcm (f Term)+updateSharedTermF f v =+ ifM (liftTCM $ asks envAllowDestructiveUpdate)+ (updateSharedFM f v)+ (f $ ignoreSharing v)++updateSharedTermT :: (MonadTCM tcm, MonadTrans t, Monad (t tcm)) => (Term -> t tcm Term) -> Term -> t tcm Term+updateSharedTermT f v =+ ifM (lift $ asks envAllowDestructiveUpdate)+ (updateSharedM f v)+ (f $ ignoreSharing v)++forceEqualTerms :: Term -> Term -> TCM ()+forceEqualTerms u v =+ whenM (asks envAllowDestructiveUpdate) $+ when (null $ (intersect `on` pointerChain) u v) $+ case (u, v) of+ (Shared p, Shared q) | p > q -> update u v+ (_, Shared{}) -> update v u+ (Shared{}, _) -> update u v+ _ -> return ()+ where+ -- TODO: compress pointer chain+ update u@(Shared{}) v = do+ report u v+ setPtr v p `seq` compressPointerChain u `seq` return ()+ where p = last $ pointerChain u+ update _ _ = __IMPOSSIBLE__+ report x y = reportSLn "tc.ptr" 50 $ "setting " ++ show x ++ "\n to " ++ show y++disableDestructiveUpdate :: TCM a -> TCM a+disableDestructiveUpdate = local $ \e -> e { envAllowDestructiveUpdate = False }+
src/full/Agda/TypeChecking/Monad/Signature.hs view
@@ -10,7 +10,6 @@ import qualified Data.Map as Map import Data.List import Data.Function-import qualified Agda.Utils.IO.Locale as LocIO import Agda.Syntax.Abstract.Name import Agda.Syntax.Common@@ -30,12 +29,14 @@ -- import Agda.TypeChecking.Pretty -- leads to cyclicity import {-# SOURCE #-} Agda.TypeChecking.CompiledClause.Compile import {-# SOURCE #-} Agda.TypeChecking.Polarity+import {-# SOURCE #-} Agda.TypeChecking.ProjectionLike import Agda.Utils.Monad import Agda.Utils.Map as Map import Agda.Utils.Size import Agda.Utils.Permutation import Agda.Utils.Pretty+import qualified Agda.Utils.HashMap as HMap #include "../../undefined.h" import Agda.Utils.Impossible@@ -66,158 +67,80 @@ setSignature sig0 return r +-- * modifiers for parts of the signature++updateDefinition :: QName -> (Definition -> Definition) -> Signature -> Signature+updateDefinition q f sig = sig { sigDefinitions = HMap.adjust f q (sigDefinitions sig) }++updateTheDef :: (Defn -> Defn) -> (Definition -> Definition)+updateTheDef f def = def { theDef = f (theDef def) }++updateDefType :: (Type -> Type) -> (Definition -> Definition)+updateDefType f def = def { defType = f (defType def) }++updateDefArgOccurrences :: ([Occurrence] -> [Occurrence]) -> (Definition -> Definition)+updateDefArgOccurrences f def = def { defArgOccurrences = f (defArgOccurrences def) }++updateDefPolarity :: ([Polarity] -> [Polarity]) -> (Definition -> Definition)+updateDefPolarity f def = def { defPolarity = f (defPolarity def) }++updateDefCompiledRep :: (CompiledRepresentation -> CompiledRepresentation) -> (Definition -> Definition)+updateDefCompiledRep f def = def { defCompiledRep = f (defCompiledRep def) }+ -- | Add a constant to the signature. Lifts the definition to top level. addConstant :: QName -> Definition -> TCM () addConstant q d = do reportSLn "tc.signature" 20 $ "adding constant " ++ show q ++ " to signature" tel <- getContextTelescope let tel' = killRange $ case theDef d of- Constructor{} -> hideTel tel+ Constructor{} -> fmap (mapDomHiding (const Hidden)) tel _ -> tel let d' = abstract tel' $ d { defName = q } reportSLn "tc.signature" 30 $ "lambda-lifted definition = " ++ show d' modifySignature $ \sig -> sig- { sigDefinitions = Map.insertWith (+++) q d' $ sigDefinitions sig }- i <- currentMutualBlock+ { sigDefinitions = HMap.insertWith (+++) q d' $ sigDefinitions sig }+ i <- currentOrFreshMutualBlock setMutualBlock i q where new +++ old = new { defDisplay = defDisplay new ++ defDisplay old } - hideTel EmptyTel = EmptyTel- hideTel (ExtendTel (Arg _ r t) tel) = ExtendTel (Arg Hidden r t) $ hideTel <$> tel---- | Turn a definition into a projection if it looks like a projection.-makeProjection :: QName -> TCM ()-makeProjection x = inContext [] $ do- reportSLn "tc.proj.like" 30 $ "Considering " ++ show x ++ " for projection likeness"- defn <- getConstInfo x- case theDef defn of- -- Constructor-headed functions can't be projection-like (at the moment). The reason- -- for this is that invoking constructor-headedness will circumvent the inference of- -- the dropped arguments.- -- Nor can abstract definitions be projection-like since they won't reduce- -- outside the abstract block.- def@Function{funProjection = Nothing, funClauses = cls, funInv = NotInjective,- funAbstr = ConcreteDef} -> do- ps0 <- filterM validProj (candidateArgs [] (unEl $ defType defn))- reportSLn "tc.proj.like" 30 $ if null ps0 then " no candidates found"- else " candidates: " ++ show ps0- ps <- return $ filter (checkOccurs cls . snd) ps0- when (not (null ps0) && null ps) $ reportSLn "tc.proj.like" 50 $ " occurs check failed\n clauses = " ++ show cls- case reverse ps of- [] -> return ()- (d, n) : _ -> do- reportSLn "tc.proj.like" 10 $ show (defName defn) ++ " is projection like in argument " ++- show n ++ " for type " ++ show d- let cls' = map (rewriteClause n) cls- cc <- compileClauses True cls'- reportSLn "tc.proj.like" 20 $ " rewrote clauses to\n " ++ show cc- let mapInv f NotInjective = NotInjective- mapInv f (Inverse inv) = Inverse (f inv)- newDef = def- { funProjection = Just (d, n + 1)- , funClauses = cls'- , funCompiled = cc- , funInv = mapInv (Map.map $ rewriteClause n) $ funInv def- , funArgOccurrences = drop n $ funArgOccurrences def- , funPolarity = drop n $ funPolarity def- }- addConstant x $ defn{ theDef = newDef- , defDisplay = [] }- _ -> return ()+-- | Set termination info of a defined function symbol.+setTerminates :: QName -> Bool -> TCM ()+setTerminates q b = modifySignature $ updateDefinition q $ updateTheDef $ setT where- validProj (_, 0) = return False- validProj (d, _) = do- defn <- theDef <$> getConstInfo d- return $ case defn of- Datatype{} -> True- Record{} -> True- Axiom{} -> True- _ -> False-- rewriteClause n cl@Clause{clausePerm = Perm m p} =- cl{ clausePerm = Perm (m - fromIntegral n) $ map (subtract $ fromIntegral n) $ drop n p- , clauseTel = telFromList $ drop n $ telToList $ clauseTel cl- , clausePats = drop n $ clausePats cl- , clauseBody = dropB n $ clauseBody cl- }- where- dropB 0 b = b- dropB _ NoBody = NoBody- dropB n (Bind b) = dropB (n - 1) (absBody b)- dropB n Body{} = __IMPOSSIBLE__-- checkOccurs cls n = all (nonOccur n) cls-- nonOccur n Clause{clausePerm = Perm _ p, clausePats = ps, clauseBody = b} =- and [ take n p == [0..fromIntegral n - 1]- , onlyMatch n ps -- projection-like functions are only allowed to match on the eliminatee- -- otherwise we may end up projecting from constructor applications, in- -- which case we can't reconstruct the dropped parameters- , checkBody n b ]-- onlyMatch n ps = all (noMatch . unArg) $ ps0 ++ drop 1 ps1- where- (ps0, ps1) = splitAt n ps- noMatch ConP{} = False- noMatch LitP{} = False- noMatch VarP{} = True- noMatch DotP{} = True-- checkBody 0 _ = True- checkBody _ NoBody = True- checkBody n (Bind b) = not (isBinderUsed b) && checkBody (n - 1) (unAbs b)- checkBody _ Body{} = __IMPOSSIBLE__-- candidateArgs vs (Pi (Arg r h (El _ (Def d us))) b)- | vs == map unArg us = (d, length vs) : candidateRec vs b- candidateArgs vs (Pi _ b) = candidateRec vs b- candidateArgs _ _ = []-- candidateRec vs NoAbs{} = []- candidateRec vs b = candidateArgs (Var (size vs) [] : vs) (unEl $ absBody b)+ setT def@Function{} = def { funTerminates = Just b }+ setT def = def addHaskellCode :: QName -> HaskellType -> HaskellCode -> TCM ()-addHaskellCode q hsTy hsDef =+addHaskellCode q hsTy hsDef = modifySignature $ updateDefinition q $ updateDefCompiledRep $ addHs -- TODO: sanity checking- modifySignature $ \sig -> sig- { sigDefinitions = Map.adjust addHs q $ sigDefinitions sig } where- addHs def = def { defCompiledRep = (defCompiledRep def) { compiledHaskell = Just $ HsDefn hsTy hsDef } }+ addHs crep = crep { compiledHaskell = Just $ HsDefn hsTy hsDef } addHaskellType :: QName -> HaskellType -> TCM ()-addHaskellType q hsTy =+addHaskellType q hsTy = modifySignature $ updateDefinition q $ updateDefCompiledRep $ addHs -- TODO: sanity checking- modifySignature $ \sig -> sig- { sigDefinitions = Map.adjust addHs q $ sigDefinitions sig } where- addHs def = def { defCompiledRep = (defCompiledRep def) { compiledHaskell = Just $ HsType hsTy } }+ addHs crep = crep { compiledHaskell = Just $ HsType hsTy } addEpicCode :: QName -> EpicCode -> TCM ()-addEpicCode q epDef =+addEpicCode q epDef = modifySignature $ updateDefinition q $ updateDefCompiledRep $ addEp -- TODO: sanity checking- modifySignature $ \sig -> sig- { sigDefinitions = Map.adjust addEp q $ sigDefinitions sig } where- --addEp def@Defn{theDef = con@Constructor{}} =- --def{theDef = con{conHsCode = Just (hsTy, hsDef)}}- addEp def = def { defCompiledRep = (defCompiledRep def) { compiledEpic = Just epDef } }+ addEp crep = crep { compiledEpic = Just epDef } addJSCode :: QName -> String -> TCM () addJSCode q jsDef = case JS.parse jsDef of Left e ->- modifySignature $ \sig -> sig- { sigDefinitions = Map.adjust (addJS (Just e)) q $ sigDefinitions sig }+ modifySignature $ updateDefinition q $ updateDefCompiledRep $ addJS (Just e) Right s -> typeError (CompilationError ("Failed to parse ECMAScript (..." ++ s ++ ") for " ++ show q)) where- addJS e def = def{defCompiledRep = (defCompiledRep def){compiledJS = e}}+ addJS e crep = crep { compiledJS = e } markStatic :: QName -> TCM ()-markStatic q =- modifySignature $ \sig -> sig- { sigDefinitions = Map.adjust mark q $ sigDefinitions sig }+markStatic q = modifySignature $ updateDefinition q $ mark where mark def@Defn{theDef = fun@Function{}} = def{theDef = fun{funStatic = True}}@@ -226,7 +149,7 @@ unionSignatures :: [Signature] -> Signature unionSignatures ss = foldr unionSignature emptySignature ss where- unionSignature (Sig a b) (Sig c d) = Sig (Map.union a c) (Map.union b d)+ unionSignature (Sig a b) (Sig c d) = Sig (Map.union a c) (HMap.union b d) -- | Add a section to the signature. addSection :: ModuleName -> Nat -> TCM ()@@ -247,23 +170,26 @@ addDisplayForms :: QName -> TCM () addDisplayForms x = do args <- getContextArgs- add args x x []+ n <- do+ proj <- isProjection x+ return $ case proj of+ Just (_, n) -> n+ Nothing -> 0+ add (drop (n - 1) args) x x [] where- add args top x ps = do+ add args top x vs0 = do def <- getConstInfo x let cs = defClauses def- n = case theDef def of- Function{ funProjection = Just (_, n) } -> n- _ -> 0 case cs of- [ Clause{ clauseBody = b } ]- | Just (m, Def y vs) <- strip b -> do- let ps' = raise 1 (map unArg vs) ++ ps- df = Display 0 ps' $ DTerm $ Def top (drop (n - 1) args)+ [ Clause{ clausePats = pats, clauseBody = b } ]+ | all (isVar . unArg) pats+ , Just (m, Def y vs) <- strip (b `apply` vs0) -> do+ let ps = raise 1 (map unArg vs)+ df = Display 0 ps $ DTerm $ Def top args reportSLn "tc.display.section" 20 $ "adding display form " ++ show y ++ " --> " ++ show top ++ "\n " ++ show df addDisplayForm y df- add args top y ps'+ add args top y vs _ -> do let reason = case cs of [] -> "no clauses"@@ -273,16 +199,19 @@ Just (m, Def y vs) | m < length args -> "too few args" | m > length args -> "too many args"- | otherwise -> "args=" ++ show args ++ " vs=" ++ show vs+ | otherwise -> "args=" ++ show args ++ " vs=" ++ show vs Just (m, v) -> "not a def body"- reportSLn "tc.display.section" 30 $ "no display form from" ++ show x ++ " because " ++ reason+ reportSLn "tc.display.section" 30 $ "no display form from " ++ show x ++ " because " ++ reason return () strip (Body v) = return (0, v) strip NoBody = Nothing strip (Bind b) = do (n, v) <- strip $ absBody b- return (n + 1, v)+ return (n + 1, ignoreSharing v) + isVar VarP{} = True+ isVar _ = False+ applySection :: ModuleName -> Telescope -> ModuleName -> Args -> Map QName QName -> Map ModuleName ModuleName -> TCM ()@@ -290,7 +219,7 @@ sig <- getSignature isig <- getImportedSignature let ss = getOld partOfOldM sigSections [sig, isig]- ds = getOld partOfOldD sigDefinitions [sig, isig]+ ds = getOldH partOfOldD sigDefinitions [sig, isig] reportSLn "tc.mod.apply" 10 $ render $ vcat [ text "applySection" , text "new =" <+> text (show new)@@ -309,6 +238,8 @@ where getOld partOfOld fromSig sigs = Map.toList $ Map.filterKeys partOfOld $ Map.unions $ map fromSig sigs+ getOldH partOfOld fromSig sigs =+ HMap.toList $ HMap.filterWithKey (const . partOfOld) $ HMap.unions $ map fromSig sigs partOfOldM x = x `isSubModuleOf` old partOfOldD x = x `isInModule` old@@ -323,49 +254,65 @@ addConstant y =<< nd y makeProjection y -- Set display form for the old name if it's not a constructor.+{- BREAKS fail/Issue478+ -- Andreas, 2012-10-20 and if we are not an anonymous module+ -- unless (isAnonymousModuleName new || isCon || size ptel > 0) $ do+-} unless (isCon || size ptel > 0) $ do addDisplayForms y where- t = defType d `apply` ts+ t = defType d `apply` ts+ pol = defPolarity d `apply` ts+ occ = defArgOccurrences d `apply` ts -- the name is set by the addConstant function- nd y = Defn (defRelevance d) y t [] (-1) noCompiledRep <$> def -- TODO: mutual block?+ nd y = Defn (defRelevance d) y t pol occ [] (-1) noCompiledRep <$> def -- TODO: mutual block? oldDef = theDef d isCon = case oldDef of Constructor{} -> True _ -> False+{- OLD getOcc d = case d of Function { funArgOccurrences = os } -> os Datatype { dataArgOccurrences = os } -> os Record { recArgOccurrences = os } -> os _ -> [] oldOcc = getOcc oldDef+-} def = case oldDef of Constructor{ conPars = np, conData = d } -> return $ oldDef { conPars = np - size ts, conData = copyName d } Datatype{ dataPars = np, dataCons = cs } -> return $ oldDef { dataPars = np - size ts, dataClause = Just cl, dataCons = map copyName cs- , dataArgOccurrences = drop (length ts) oldOcc }+ {- , dataArgOccurrences = drop (length ts) oldOcc -} } Record{ recPars = np, recConType = t, recTel = tel } -> return $ oldDef { recPars = np - size ts, recClause = Just cl , recConType = apply t ts, recTel = apply tel ts- , recArgOccurrences = drop (length ts) oldOcc+ {- , recArgOccurrences = drop (length ts) oldOcc -} } _ -> do- cc <- compileClauses True [cl]+ cc <- compileClauses Nothing [cl] -- Andreas, 2012-10-07 non need for record pattern translation let newDef = Function { funClauses = [cl] , funCompiled = cc , funDelayed = NotDelayed , funInv = NotInjective+{- , funPolarity = [] , funArgOccurrences = drop (length ts') oldOcc+-}+ , funMutual = mutual , funAbstr = ConcreteDef , funProjection = proj , funStatic = False+ , funCopy = True+ , funTerminates = Just True } reportSLn "tc.mod.apply" 80 $ "new def for " ++ show x ++ "\n " ++ show newDef return newDef where+ mutual = case oldDef of+ Function{funMutual = m} -> m+ _ -> [] proj = case oldDef of Function{funProjection = Just (r, n)} | size ts < n -> Just (r, n - size ts)@@ -398,7 +345,7 @@ modifyImportedSignature (add d) modifySignature (add d) where- add df sig = sig { sigDefinitions = Map.adjust addDf x defs }+ add df sig = sig { sigDefinitions = HMap.adjust addDf x defs } where addDf def = def { defDisplay = df : defDisplay def } defs = sigDefinitions sig@@ -414,6 +361,7 @@ where extract NoBody = __IMPOSSIBLE__ extract (Body (Def x _)) = x+ extract (Body (Shared p)) = extract (Body $ derefPtr p) extract (Body _) = __IMPOSSIBLE__ extract (Bind b) = extract (unAbs b) @@ -424,7 +372,8 @@ def <- theDef <$> getConstInfo c case def of Datatype{ dataInduction = i } -> return i- Record{} -> return Inductive+ Record{ recRecursive = False} -> return Inductive+ Record{ recInduction = i } -> return i Constructor{ conInd = i } -> return i _ -> __IMPOSSIBLE__ @@ -452,7 +401,7 @@ let defs = sigDefinitions $ stSignature st idefs = sigDefinitions $ stImports st smash = (++) `on` maybe [] (:[])- in case smash (Map.lookup q defs) (Map.lookup q idefs) of+ in case smash (HMap.lookup q defs) (HMap.lookup q idefs) of [] -> fail $ "Unbound name: " ++ show q ++ " " ++ showQNameId q [d] -> mkAbs env d ds -> fail $ "Ambiguous name: " ++ show q@@ -480,6 +429,11 @@ -- | Look up the polarity of a definition. getPolarity :: QName -> TCM [Polarity]+getPolarity q = defPolarity <$> getConstInfo q++{- OLD+-- | Look up the polarity of a definition.+getPolarity :: QName -> TCM [Polarity] getPolarity q = do defn <- theDef <$> getConstInfo q case defn of@@ -487,17 +441,25 @@ Datatype{ dataPolarity = p } -> return p Record{ recPolarity = p } -> return p _ -> return []+-} +-- | Look up polarity of a definition and compose with polarity+-- represented by 'Comparison'. getPolarity' :: Comparison -> QName -> TCM [Polarity]-getPolarity' CmpEq _ = return []-getPolarity' CmpLeq q = getPolarity q+getPolarity' CmpEq q = map (composePol Invariant) <$> getPolarity q -- return []+getPolarity' CmpLeq q = getPolarity q -- composition with Covariant is identity -- | Set the polarity of a definition. setPolarity :: QName -> [Polarity] -> TCM ()+setPolarity q pol = modifySignature $ updateDefinition q $ updateDefPolarity $ const pol++{- OLD+-- | Set the polarity of a definition.+setPolarity :: QName -> [Polarity] -> TCM () setPolarity q pol = do modifySignature setP where- setP sig = sig { sigDefinitions = Map.adjust setPx q defs }+ setP sig = sig { sigDefinitions = HMap.adjust setPx q defs } where setPx def = def { theDef = setPd $ theDef def } setPd d = case d of@@ -506,24 +468,57 @@ Record{} -> d { recPolarity = pol } _ -> d defs = sigDefinitions sig+-} +-- | Return a finite list of argument occurrences.+getArgOccurrences :: QName -> TCM [Occurrence]+getArgOccurrences d = defArgOccurrences <$> getConstInfo d++{- OLD+-- | Return a finite list of argument occurrences.+getArgOccurrences :: QName -> TCM [Occurrence]+getArgOccurrences d = do+ def <- theDef <$> getConstInfo d+ return $ getArgOccurrences_ def++getArgOccurrences_ :: Defn -> [Occurrence]+getArgOccurrences_ def = case def of+ Function { funArgOccurrences = os } -> os+ Datatype { dataArgOccurrences = os } -> os+ Record { recArgOccurrences = os } -> os+ Constructor{} -> [] -- repeat StrictPos+ _ -> [] -- repeat Mixed+-}+ getArgOccurrence :: QName -> Nat -> TCM Occurrence getArgOccurrence d i = do+ def <- getConstInfo d+ return $ case theDef def of+ Constructor{} -> StrictPos+ _ -> (defArgOccurrences def ++ repeat Mixed) !! i++setArgOccurrences :: QName -> [Occurrence] -> TCM ()+setArgOccurrences d os =+ modifySignature $ updateDefinition d $ updateDefArgOccurrences $ const os++{- OLD+getArgOccurrence :: QName -> Nat -> TCM Occurrence+getArgOccurrence d i = do def <- theDef <$> getConstInfo d return $ case def of Function { funArgOccurrences = os } -> look i os Datatype { dataArgOccurrences = os } -> look i os Record { recArgOccurrences = os } -> look i os- Constructor{} -> Positive- _ -> Negative+ Constructor{} -> StrictPos+ _ -> Mixed where- look i os = (os ++ repeat Negative) !! fromIntegral i+ look i os = (os ++ repeat Mixed) !! fromIntegral i setArgOccurrences :: QName -> [Occurrence] -> TCM () setArgOccurrences d os = modifySignature setO where- setO sig = sig { sigDefinitions = Map.adjust setOx d defs }+ setO sig = sig { sigDefinitions = HMap.adjust setOx d defs } where setOx def = def { theDef = setOd $ theDef def } setOd d = case d of@@ -532,8 +527,31 @@ Record{} -> d { recArgOccurrences = os } _ -> d defs = sigDefinitions sig+-} +-- | Get the mutually recursive identifiers.+getMutual :: QName -> TCM [QName]+getMutual d = do+ def <- theDef <$> getConstInfo d+ return $ case def of+ Function { funMutual = m } -> m+ Datatype { dataMutual = m } -> m+ Record { recMutual = m } -> m+ _ -> [] +-- | Set the mutually recursive identifiers.+setMutual :: QName -> [QName] -> TCM ()+setMutual d m = modifySignature $ updateDefinition d $ updateTheDef $ \ def ->+ case def of+ Function{} -> def { funMutual = m }+ Datatype{} -> def {dataMutual = m }+ Record{} -> def { recMutual = m }+ _ -> __IMPOSSIBLE__++-- | Check whether two definitions are mutually recursive.+mutuallyRecursive :: QName -> QName -> TCM Bool+mutuallyRecursive d d' = (d `elem`) <$> getMutual d'+ -- | Look up the number of free variables of a section. This is equal to the -- number of parameters if we're currently inside the section and 0 otherwise. getSecFreeVars :: ModuleName -> TCM Nat@@ -569,8 +587,8 @@ verboseS "tc.sig.inst" 30 $ do ctx <- getContext m <- currentModule- liftIO $ LocIO.putStrLn $ "instDef in " ++ show m ++ ": " ++ show (defName d) ++ " " ++- unwords (map show . take (size vs) . reverse . map (fst . unArg) $ ctx)+ reportSLn "" 0 $ "instDef in " ++ show m ++ ": " ++ show (defName d) ++ " " +++ unwords (map show . take (size vs) . reverse . map (fst . unDom) $ ctx) return $ d `apply` vs -- | Give the abstract view of a definition.@@ -585,7 +603,10 @@ -- | Enter abstract mode. Abstract definition in the current module are transparent. inAbstractMode :: TCM a -> TCM a-inAbstractMode = local $ \e -> e { envAbstractMode = AbstractMode }+inAbstractMode = local $ \e -> e { envAbstractMode = AbstractMode,+ envAllowDestructiveUpdate = False }+ -- Allowing destructive updates when seeing through+ -- abstract may break the abstraction. -- | Not in abstract mode. All abstract definitions are opaque. inConcreteMode :: TCM a -> TCM a@@ -593,7 +614,10 @@ -- | Ignore abstract mode. All abstract definitions are transparent. ignoreAbstractMode :: TCM a -> TCM a-ignoreAbstractMode = local $ \e -> e { envAbstractMode = IgnoreAbstractMode }+ignoreAbstractMode = local $ \e -> e { envAbstractMode = IgnoreAbstractMode,+ envAllowDestructiveUpdate = False }+ -- Allowing destructive updates when ignoring+ -- abstract may break the abstraction. -- | Check whether a name might have to be treated abstractly (either if we're -- 'inAbstractMode' or it's not a local name). Returns true for things not
src/full/Agda/TypeChecking/Monad/SizedTypes.hs view
@@ -1,75 +1,224 @@-+{-# LANGUAGE CPP, TupleSections, DeriveFunctor #-} module Agda.TypeChecking.Monad.SizedTypes where import Control.Applicative import Control.Monad.Error import Agda.Interaction.Options+ import Agda.Syntax.Common import Agda.Syntax.Internal+ import Agda.TypeChecking.Monad.Base import Agda.TypeChecking.Monad.Options import Agda.TypeChecking.Monad.Builtin+-- import Agda.TypeChecking.Reduce -- cyclic import Agda.TypeChecking.Substitute+ import Agda.Utils.Monad+import Agda.Utils.Impossible+#include "../../undefined.h" --- | Check if a type is the 'primSize' type. The argument should be 'reduce'd.+------------------------------------------------------------------------+-- * Testing for type 'Size'+------------------------------------------------------------------------ -isSizeType :: Type -> TCM Bool+-- | Result of querying whether size variable @i@ is bounded by another+-- size.+data BoundedSize+ = BoundedLt Term -- ^ yes @i : Size< t@+ | BoundedNo+ deriving (Eq, Show)++-- | Check if a type is the 'primSize' type. The argument should be 'reduce'd.+isSizeType :: Type -> TCM (Maybe BoundedSize) isSizeType v = isSizeTypeTest <*> pure v -{- ORIGINAL CODE-isSizeType :: Type -> TCM Bool-isSizeType (El _ v) = liftTCM $- ifM (not . optSizedTypes <$> pragmaOptions) (return False) $- case v of- Def x [] -> do- Def size [] <- primSize- return $ x == size- _ -> return False- `catchError` \_ -> return False--}+isSizeTypeTest :: TCM (Type -> Maybe BoundedSize)+isSizeTypeTest =+ flip (ifM (optSizedTypes <$> pragmaOptions)) (return $ const Nothing) $ do+ (size, sizelt) <- getBuiltinSize+ let testType (Def d []) | Just d == size = Just BoundedNo+ testType (Def d [v]) | Just d == sizelt = Just $ BoundedLt $ unArg v+ testType _ = Nothing+ return $ testType . ignoreSharing . unEl +getBuiltinDefName :: String -> TCM (Maybe QName)+getBuiltinDefName s = fromDef . fmap ignoreSharing <$> getBuiltin' s+ where+ fromDef (Just (Def d [])) = Just d+ fromDef _ = Nothing++getBuiltinSize :: TCM (Maybe QName, Maybe QName)+getBuiltinSize = do+ size <- getBuiltinDefName builtinSize+ sizelt <- getBuiltinDefName builtinSizeLt+ return (size, sizelt)+ isSizeNameTest :: TCM (QName -> Bool)-isSizeNameTest = liftTCM $- ifM (not . optSizedTypes <$> pragmaOptions) (return $ const False) $ do- Def size [] <- primSize- return (size ==)- `catchError` \_ -> return $ const False+isSizeNameTest = ifM (optSizedTypes <$> pragmaOptions)+ isSizeNameTestRaw+ (return $ const False) -isSizeTypeTest :: TCM (Type -> Bool)-isSizeTypeTest = do- testName <- isSizeNameTest- let testType (El _ (Def d [])) = testName d- testType _ = False- return testType+isSizeNameTestRaw :: TCM (QName -> Bool)+isSizeNameTestRaw = do+ (size, sizelt) <- getBuiltinSize+ return $ (`elem` [size, sizelt]) . Just +------------------------------------------------------------------------+-- * Constructors+------------------------------------------------------------------------+ sizeType :: TCM Type sizeType = El (mkType 0) <$> primSize -sizeSuc :: TCM (Maybe QName)-sizeSuc = liftTCM $+sizeSucName :: TCM (Maybe QName)+sizeSucName = liftTCM $ ifM (not . optSizedTypes <$> pragmaOptions) (return Nothing) $ do- Def x [] <- primSizeSuc+ Def x [] <- ignoreSharing <$> primSizeSuc return $ Just x `catchError` \_ -> return Nothing +sizeSuc :: Nat -> Term -> TCM Term+sizeSuc n v = do+ Def suc [] <- ignoreSharing <$> primSizeSuc+ return $ iterate (sizeSuc_ suc) v !! n++sizeSuc_ :: QName -> Term -> Term+sizeSuc_ suc v = Def suc [defaultArg v]++-- | Transform list of terms into a term build from binary maximum.+sizeMax :: [Term] -> TCM Term+sizeMax vs = case vs of+ [] -> __IMPOSSIBLE__ -- we do not have a zero size+ [v] -> return v+ vs -> do+ Def max [] <- primSizeMax+ return $ foldr1 (\ u v -> Def max $ map defaultArg [u,v]) vs+++------------------------------------------------------------------------+-- * Viewing and unviewing sizes+------------------------------------------------------------------------+ -- | A useful view on sizes. data SizeView = SizeInf | SizeSuc Term | OtherSize Term --- | Compute the size view of a term. The argument should be 'reduce'd.--- Precondition: sized types are enabled. sizeView :: Term -> TCM SizeView sizeView v = do- Def inf [] <- primSizeInf- Def suc [] <- primSizeSuc- case v of+ Def inf [] <- ignoreSharing <$> primSizeInf+ Def suc [] <- ignoreSharing <$> primSizeSuc+ case ignoreSharing v of Def x [] | x == inf -> return SizeInf Def x [u] | x == suc -> return $ SizeSuc (unArg u) _ -> return $ OtherSize v +type Offset = Nat++-- | A deep view on sizes.+data DeepSizeView+ = DSizeInf+ | DSizeVar Nat Offset+ | DSizeMeta MetaId Args Offset+ | DOtherSize Term++data SizeViewComparable a+ = NotComparable+ | YesAbove DeepSizeView a+ | YesBelow DeepSizeView a+ deriving (Functor)++-- | @sizeViewComparable v w@ checks whether @v >= w@ (then @Left@)+-- or @v <= w@ (then @Right@). If uncomparable, it returns @NotComparable@.+sizeViewComparable :: DeepSizeView -> DeepSizeView -> SizeViewComparable ()+sizeViewComparable v w = case (v,w) of+ (DSizeInf, _) -> YesAbove w ()+ (_, DSizeInf) -> YesBelow w ()+ (DSizeVar x n, DSizeVar y m) | x == y -> if n >= m then YesAbove w () else YesBelow w ()+ _ -> NotComparable++sizeViewSuc_ :: QName -> DeepSizeView -> DeepSizeView+sizeViewSuc_ suc v = case v of+ DSizeInf -> DSizeInf+ DSizeVar i n -> DSizeVar i (n + 1)+ DSizeMeta x vs n -> DSizeMeta x vs (n + 1)+ DOtherSize u -> DOtherSize $ sizeSuc_ suc u++-- | @sizeViewPred k v@ decrements @v@ by @k@ (must be possible!).+sizeViewPred :: Nat -> DeepSizeView -> DeepSizeView+sizeViewPred 0 v = v+sizeViewPred k v = case v of+ DSizeInf -> DSizeInf+ DSizeVar i n | n >= k -> DSizeVar i (n - k)+ DSizeMeta x vs n | n >= k -> DSizeMeta x vs (n - k)+ _ -> __IMPOSSIBLE__++-- | @sizeViewOffset v@ returns the number of successors or Nothing when infty.+sizeViewOffset :: DeepSizeView -> Maybe Offset+sizeViewOffset v = case v of+ DSizeInf -> Nothing+ DSizeVar i n -> Just n+ DSizeMeta x vs n -> Just n+ DOtherSize u -> Just 0++-- | Remove successors common to both sides.+removeSucs :: (DeepSizeView, DeepSizeView) -> (DeepSizeView, DeepSizeView)+removeSucs (v, w) = (sizeViewPred k v, sizeViewPred k w)+ where k = case (sizeViewOffset v, sizeViewOffset w) of+ (Just n, Just m) -> min n m+ (Just n, Nothing) -> n+ (Nothing, Just m) -> m+ (Nothing, Nothing) -> 0+ -- | Turn a size view into a term. unSizeView :: SizeView -> TCM Term unSizeView SizeInf = primSizeInf-unSizeView (SizeSuc v) = flip apply [Arg NotHidden Relevant v] <$> primSizeSuc+unSizeView (SizeSuc v) = sizeSuc 1 v unSizeView (OtherSize v) = return v++unDeepSizeView :: DeepSizeView -> TCM Term+unDeepSizeView v = case v of+ DSizeInf -> primSizeInf+ DSizeVar i n -> sizeSuc n $ var i+ DSizeMeta x us n -> sizeSuc n $ MetaV x us+ DOtherSize u -> return u++------------------------------------------------------------------------+-- * View on sizes where maximum is pulled to the top+------------------------------------------------------------------------++type SizeMaxView = [DeepSizeView]++maxViewMax :: SizeMaxView -> SizeMaxView -> SizeMaxView+maxViewMax v w = case (v,w) of+ (DSizeInf : _, _) -> [DSizeInf]+ (_, DSizeInf : _) -> [DSizeInf]+ _ -> foldr maxViewCons w v++-- | @maxViewCons v ws = max v ws@. It only adds @v@ to @ws@ if it is not+-- subsumed by an element of @ws@.+maxViewCons :: DeepSizeView -> SizeMaxView -> SizeMaxView+maxViewCons _ [DSizeInf] = [DSizeInf]+maxViewCons DSizeInf _ = [DSizeInf]+maxViewCons v ws = case sizeViewComparableWithMax v ws of+ NotComparable -> v:ws+ YesAbove _ ws' -> v:ws'+ YesBelow{} -> ws++-- | @sizeViewComparableWithMax v ws@ tries to find @w@ in @ws@ that compares with @v@+-- and singles this out.+-- Precondition: @v /= DSizeInv@.+sizeViewComparableWithMax :: DeepSizeView -> SizeMaxView -> SizeViewComparable SizeMaxView+sizeViewComparableWithMax v ws = case ws of+ [] -> __IMPOSSIBLE__+ [w] -> fmap (const []) $ sizeViewComparable v w+ (w:ws) -> case sizeViewComparable v w of+ NotComparable -> fmap (w:) $ sizeViewComparableWithMax v ws+ r -> fmap (const ws) r+++maxViewSuc_ :: QName -> SizeMaxView -> SizeMaxView+maxViewSuc_ suc = map (sizeViewSuc_ suc)++unMaxView :: SizeMaxView -> TCM Term+unMaxView vs = sizeMax =<< mapM unDeepSizeView vs
src/full/Agda/TypeChecking/Monad/State.hs view
@@ -4,12 +4,13 @@ import Control.Applicative import Control.Monad.State import Data.Set (Set)-import Data.Map+import Data.Map as Map import qualified Data.Set as Set import Agda.Syntax.Common import Agda.Syntax.Scope.Base import qualified Agda.Syntax.Concrete.Name as C+import Agda.Syntax.Abstract (PatternSynDefn, PatternSynDefns) import Agda.Syntax.Abstract.Name import Agda.TypeChecking.Monad.Base@@ -35,6 +36,31 @@ -- | Get the current scope. getScope :: TCM ScopeInfo getScope = gets stScope++getPatternSyns :: TCM PatternSynDefns+getPatternSyns = gets stPatternSyns++setPatternSyns :: PatternSynDefns -> TCM ()+setPatternSyns m = modify $ \s -> s { stPatternSyns = m }++modifyPatternSyns :: (PatternSynDefns -> PatternSynDefns) -> TCM ()+modifyPatternSyns f = do+ s <- getPatternSyns+ setPatternSyns $ f s++getPatternSynImports :: TCM PatternSynDefns+getPatternSynImports = gets stPatternSynImports++lookupPatternSyn :: QName -> TCM PatternSynDefn+lookupPatternSyn x = do+ s <- getPatternSyns+ case Map.lookup x s of+ Just d -> return d+ Nothing -> do+ si <- getPatternSynImports+ case Map.lookup x si of+ Just d -> return d+ Nothing -> typeError $ NotInScope [qnameToConcrete x] -- | Sets stExtLambdaTele . setExtLambdaTele :: Map QName (Int , Int) -> TCM ()
src/full/Agda/TypeChecking/Monad/Trace.hs view
@@ -8,6 +8,9 @@ import Agda.TypeChecking.Monad.Base import Agda.Utils.Monad +import {-# SOURCE #-} Agda.Interaction.Highlighting.Generate+ (highlightAsTypeChecked)+ --------------------------------------------------------------------------- -- * Trace ---------------------------------------------------------------------------@@ -18,20 +21,72 @@ InferDef _ _ _ -> False CheckArguments _ [] _ _ _ -> False SetRange _ _ -> False+ NoHighlighting {} -> False _ -> True +traceCallM :: MonadTCM tcm => tcm (Maybe r -> Call) -> tcm a -> tcm a+traceCallM mkCall m = flip traceCall m =<< mkCall+ -- | Record a function call in the trace. {-# SPECIALIZE traceCall :: (Maybe r -> Call) -> TCM a -> TCM a #-} traceCall :: MonadTCM tcm => (Maybe r -> Call) -> tcm a -> tcm a traceCall mkCall m = do- let call = mkCall Nothing- r | getRange call /= noRange = const $ getRange call- | otherwise = id+ let call = mkCall Nothing+ callRange = getRange call cl <- liftTCM $ buildClosure call- let trace | interestingCall cl = local $ \e -> e { envRange = r (envRange e)- , envCall = Just cl }- | otherwise = local $ \e -> e { envRange = r (envRange e) }- trace m+ let trace = local $+ (if interestingCall cl then+ \e -> e { envCall = Just cl }+ else+ id) .+ (if callRange /= noRange || isNoHighlighting call then+ \e -> e { envHighlightingRange = callRange+ }+ else+ id) .+ (if callRange /= noRange then+ \e -> e { envRange = callRange+ }+ else+ id)+ wrap <- ifM (do l <- envHighlightingLevel <$> ask+ return (l == Interactive && highlightCall call))+ (do oldRange <- envHighlightingRange <$> ask+ return $ highlightAsTypeChecked oldRange callRange)+ (return id)+ wrap $ trace m+ where+ -- | Should the given call trigger interactive highlighting?+ highlightCall call = case call of+ CheckClause _ _ _ -> True+ CheckPattern _ _ _ _ -> True+ CheckLetBinding _ _ -> True+ InferExpr _ _ -> True+ CheckExpr _ _ _ -> True+ CheckDotPattern _ _ _ -> True+ CheckPatternShadowing _ _ -> True+ IsTypeCall _ _ _ -> True+ IsType_ _ _ -> True+ InferVar _ _ -> True+ InferDef _ _ _ -> True+ CheckArguments _ _ _ _ _ -> True+ CheckDataDef _ _ _ _ _ -> True+ CheckRecDef _ _ _ _ _ -> True+ CheckConstructor _ _ _ _ _ -> True+ CheckFunDef _ _ _ _ -> True+ CheckPragma _ _ _ -> True+ CheckPrimitive _ _ _ _ -> True+ CheckIsEmpty _ _ _ -> True+ CheckWithFunctionType _ _ -> True+ CheckSectionApplication _ _ _ _ -> True+ ScopeCheckExpr _ _ -> False+ ScopeCheckDeclaration _ _ -> False+ ScopeCheckLHS _ _ _ -> False+ NoHighlighting _ -> True+ SetRange _ _ -> False++ isNoHighlighting (NoHighlighting {}) = True+ isNoHighlighting _ = False {-# SPECIALIZE traceCall_ :: (Maybe () -> Call) -> TCM r -> TCM r #-} traceCall_ :: MonadTCM tcm => (Maybe () -> Call) -> tcm r -> tcm r
src/full/Agda/TypeChecking/Patterns/Match.hs view
@@ -58,7 +58,7 @@ matchPattern (Arg h' r' (LitP l)) arg@(Arg h r v) = do w <- reduceB v let v = ignoreBlocking w- case w of+ case ignoreSharing <$> w of NotBlocked (Lit l') | l == l' -> return (Yes [], Arg h r v) | otherwise -> return (No, Arg h r v)@@ -66,6 +66,7 @@ Blocked x _ -> return (DontKnow $ Just x, Arg h r v) _ -> return (DontKnow Nothing, Arg h r v) +{- Andreas, 2012-04-02 NO LONGER UP-TO-DATE matchPattern (Arg h' r' (ConP c _ ps)) (Arg h Irrelevant v) = do -- Andreas, 2010-09-07 matching a record constructor against -- something irrelevant will just continue matching against@@ -73,6 +74,7 @@ (m, vs) <- matchPatterns ps $ repeat $ Arg NotHidden Irrelevant $ DontCare __IMPOSSIBLE__ return (m, Arg h Irrelevant $ Con c vs)+-} matchPattern (Arg h' r' (ConP c _ ps)) (Arg h r v) = do w <- traverse constructorForm =<< reduceB v@@ -82,7 +84,7 @@ -- 2) whatInduction c sometimes crashes because c may point to -- an axiom at this stage (if we are checking the -- projection functions for a record type).- w <- case w of+ w <- case ignoreSharing <$> w of NotBlocked (Def f args) -> unfoldDefinition True reduceB (Def f []) f args -- reduceB is used here because some constructors@@ -90,7 +92,7 @@ -- unfolded (due to open public). _ -> return w let v = ignoreBlocking w- case w of+ case ignoreSharing <$> w of -- Andreas, 2010-09-07 matching a record constructor against -- something irrelevant will just continue matching against -- irrelevant stuff
src/full/Agda/TypeChecking/Polarity.hs view
@@ -1,89 +1,279 @@-{-# LANGUAGE CPP #-}+{-# LANGUAGE CPP, PatternGuards #-} module Agda.TypeChecking.Polarity where import Control.Applicative import Control.Monad.State import Control.Monad.Error import Data.List+import Data.Traversable (traverse) import Agda.Syntax.Common import Agda.Syntax.Internal+ import Agda.TypeChecking.Monad+import Agda.TypeChecking.Pretty import Agda.TypeChecking.Positivity import Agda.TypeChecking.Substitute import Agda.TypeChecking.Telescope import Agda.TypeChecking.Reduce-import Agda.TypeChecking.Free+import Agda.TypeChecking.Free hiding (Occurrence(..)) import Agda.TypeChecking.Monad.Builtin+ import Agda.Interaction.Options++import Agda.Utils.List import Agda.Utils.Monad+import Agda.Utils.Permutation import Agda.Utils.Impossible import Agda.Utils.Size #include "../undefined.h" -getArity :: QName -> TCM Arity-getArity x = do- def <- theDef <$> getConstInfo x- case def of- Axiom{} -> return 0- Function{ funClauses = c : _ } -> return $ genericLength (clausePats c)- Function{ funClauses = [] } -> return 0- Datatype{ dataPars = np, dataIxs = ni } -> return np- Record{ recPars = n } -> return n- Constructor{} -> return 0- Primitive{} -> return 0+------------------------------------------------------------------------+-- * Polarity lattice.+------------------------------------------------------------------------ +-- | Infimum on the information lattice.+-- 'Invariant' is bottom (dominant for inf),+-- 'Nonvariant' is top (neutral for inf).+(/\) :: Polarity -> Polarity -> Polarity+Nonvariant /\ b = b+a /\ Nonvariant = a+a /\ b | a == b = a+ | otherwise = Invariant++-- | 'Polarity' negation, swapping monotone and antitone.+neg :: Polarity -> Polarity+neg Covariant = Contravariant+neg Contravariant = Covariant+neg Invariant = Invariant+neg Nonvariant = Nonvariant++-- | What is the polarity of a function composition?+composePol :: Polarity -> Polarity -> Polarity+composePol Nonvariant _ = Nonvariant+composePol _ Nonvariant = Nonvariant+composePol Invariant _ = Invariant+composePol Covariant x = x+composePol Contravariant x = neg x++polFromOcc :: Occurrence -> Polarity+polFromOcc o = case o of+ GuardPos -> Covariant+ StrictPos -> Covariant+ JustPos -> Covariant+ JustNeg -> Contravariant+ Mixed -> Invariant+ Unused -> Nonvariant++------------------------------------------------------------------------+-- * Auxiliary functions+------------------------------------------------------------------------++-- | Get the next polarity from a list, 'Invariant' if empty.+nextPolarity :: [Polarity] -> (Polarity, [Polarity])+nextPolarity [] = (Invariant, [])+nextPolarity (p : ps) = (p, ps)++-- | Replace 'Nonvariant' by 'Invariant'.+purgeNonvariant :: [Polarity] -> [Polarity]+purgeNonvariant = map (\ p -> if p == Nonvariant then Invariant else p)++------------------------------------------------------------------------+-- * Computing the polarity of a symbol.+------------------------------------------------------------------------++-- | Main function of this module. computePolarity :: QName -> TCM () computePolarity x = do- reportSLn "tc.polarity.set" 15 $ "Computing polarity of " ++ show x- n <- getArity x+ reportSLn "tc.polarity.set" 25 $ "Computing polarity of " ++ show x++ -- get basic polarity from positivity analysis+ def <- getConstInfo x+ let pol0 = map polFromOcc $ defArgOccurrences def+-- let pol0 = map polFromOcc $ getArgOccurrences_ $ theDef def+ reportSLn "tc.polarity.set" 15 $ "Polarity of " ++ show x ++ " from positivity: " ++ show pol0++{-+ -- get basic polarity from shape of def (arguments matched on or not?)+ def <- getConstInfo x+ let usagePol = usagePolarity $ theDef def+ reportSLn "tc.polarity.set" 15 $ "Polarity of " ++ show x ++ " from definition form: " ++ show usagePol+ let n = genericLength usagePol -- n <- getArity x reportSLn "tc.polarity.set" 20 $ " arity = " ++ show n- pol0 <- mapM getPol [0..n - 1] - -- Not very nice, but should work- setPolarity x $ pol0 ++ [Covariant]- pol1 <- sizePolarity x+ -- refine polarity by positivity information+ pol0 <- zipWith (/\) usagePol <$> mapM getPol [0..n - 1]+ reportSLn "tc.polarity.set" 15 $ "Polarity of " ++ show x ++ " from positivity: " ++ show pol0+-} - let pol = pol0 ++ pol1+ -- compute polarity of sized types+ pol1 <- sizePolarity x pol0++ -- refine polarity again by using type information+ let t = defType def+ reportSDoc "tc.polarity.set" 15 $ text "Refining polarity with type " <+> prettyTCM t+ pol <- enablePhantomTypes (theDef def) <$> dependentPolarity t pol1 reportSLn "tc.polarity.set" 10 $ "Polarity of " ++ show x ++ ": " ++ show pol- setPolarity x pol++ -- set the polarity in the signature+ setPolarity x $ pol -- purgeNonvariant pol -- temporarily disable non-variance++ -- make 'Nonvariant' args 'UnusedArg' in type and clause telescope+ t <- nonvariantToUnusedArg pol t+ modifySignature $ updateDefinition x $+ updateTheDef (nonvariantToUnusedArgInDef pol) . updateDefType (const t)++-- | Data and record parameters are used as phantom arguments all over+-- the test suite (and possibly in user developments).+-- @enablePhantomTypes@ turns 'Nonvariant' parameters to 'Invariant'+-- to enable phantoms.+enablePhantomTypes :: Defn -> [Polarity] -> [Polarity]+enablePhantomTypes def pol = case def of+ Datatype{ dataPars = np } -> enable np+ Record { recPars = np } -> enable np+ _ -> pol+ where enable np = let (pars, rest) = genericSplitAt np pol+ in purgeNonvariant pars ++ rest++{- UNUSED+-- | Extract a basic approximate polarity info from the shape of definition.+-- Arguments that are matched against get 'Invariant', others 'Nonvariant'.+-- For data types, parameters get 'Nonvariant', indices 'Invariant'.+usagePolarity :: Defn -> [Polarity]+usagePolarity def = case def of+ Axiom{} -> []+ Function{ funClauses = [] } -> []+ Function{ funClauses = cs } -> usage $ map clausePats cs+ Datatype{ dataPars = np, dataIxs = ni } -> genericReplicate np Nonvariant+ Record{ recPars = n } -> genericReplicate n Nonvariant+ Constructor{} -> []+ Primitive{} -> [] where- getPol :: Nat -> TCM Polarity- getPol i = do- o <- getArgOccurrence x i- case o of- Positive -> return Covariant- Negative -> return Invariant -- Negative isn't the same as contravariant- Unused -> return Invariant -- add NonVariant?+ usage = foldr1 (zipWith (/\)) . map (map (usagePat . unArg))+ usagePat VarP{} = Nonvariant+ usagePat DotP{} = Nonvariant+ usagePat ConP{} = Invariant+ usagePat LitP{} = Invariant+-} +-- | Make arguments 'Invariant' if the type of a not-'Nonvariant'+-- later argument depends on it.+dependentPolarity :: Type -> [Polarity] -> TCM [Polarity]+dependentPolarity t [] = return [] -- all remaining are 'Invariant'+dependentPolarity t pols@(p:ps) = do+ t <- reduce $ unEl t+ case ignoreSharing t of+ Pi a b -> do+ let c = absBody b+ ps <- dependentPolarity c ps+ p <- case b of+ Abs{} | p /= Invariant ->+ ifM (relevantInIgnoringNonvariant 0 c ps)+ (return Invariant)+ (return p)+ _ -> return p+ return $ p : ps+ _ -> return pols++-- | Check whether a variable is relevant in a type expression,+-- ignoring domains of non-variant arguments.+relevantInIgnoringNonvariant :: Nat -> Type -> [Polarity] -> TCM Bool+relevantInIgnoringNonvariant i t [] = return $ i `relevantInIgnoringSortAnn` t+relevantInIgnoringNonvariant i t (p:ps) = do+ t <- reduce $ unEl t+ case ignoreSharing t of+ Pi a b -> if p /= Nonvariant && i `relevantInIgnoringSortAnn` a then return True+ else relevantInIgnoringNonvariant (i + 1) (absBody b) ps+ _ -> return $ i `relevantInIgnoringSortAnn` t++-- * Turn polarity 'Nonvariant' into relevance 'UnusedArg'++-- | Record information that an argument is unused in 'Relevance'.+mkUnused :: Relevance -> Relevance+mkUnused Relevant = UnusedArg -- commenting out this line switches of 'UnusedArg' polarity machinery+mkUnused r = r -- 'Irrelevant' is more informative than 'UnusedArg'.++-- | Improve 'Relevance' information in a type by polarity information.+-- 'Nonvariant' becomes 'UnusedArg'.+nonvariantToUnusedArg :: [Polarity] -> Type -> TCM Type+nonvariantToUnusedArg [] t = return t+nonvariantToUnusedArg (p:ps) t = do+ t <- reduce t+ case ignoreSharingType t of+ El s (Pi a b) -> do+ let a' = if p == Nonvariant then mapDomRelevance mkUnused a else a+ El s . Pi a' <$> traverse (nonvariantToUnusedArg ps) b+ -- we do not lift properly but bound variables do not matter for reduce+ -- also, we do not maintain the context+ _ -> return t++-- | Propagate 'Nonvariant' 'Polarity' to 'Relevance' information in+-- 'Arg's of a defined symbol.+nonvariantToUnusedArgInDef :: [Polarity] -> Defn -> Defn+nonvariantToUnusedArgInDef pol def = case def of+ Function { funClauses = cl } ->+ def { funClauses = map (nonvariantToUnusedArgInClause pol) cl }+ _ -> def++nonvariantToUnusedArgInClause :: [Polarity] -> Clause -> Clause+nonvariantToUnusedArgInClause pol cl@Clause{clauseTel = tel, clausePerm = perm, clausePats = ps} =+ let adjPat p Nonvariant+ | properlyMatching (unArg p) = __IMPOSSIBLE__ -- if we match, we cannot be Nonvariant (sanity check)+ | otherwise = mapArgRelevance mkUnused p+ adjPat p _ = p+ -- change relevance of 'Nonvariant' arguments to 'UnusedArg'+ -- note that the associated patterns cannot be 'ConP' or 'LitP'+ ps' = zipWith adjPat ps (pol ++ repeat Invariant)+ -- get a list of 'Relevance's for the variables bound in the pattern+ rels0 = argRelevance <$> (patternVars =<< ps')+ -- this is the order the variables appear in the telescope+ rels = permute perm rels0+ -- now improve 'Relevance' in 'Telescope' by pattern relevance+ updateDom UnusedArg = mapDomRelevance mkUnused+ updateDom r = id+ tel' = telFromList $ zipWith updateDom rels $ telToList tel+ in cl { clausePats = ps', clauseTel = tel'}++------------------------------------------------------------------------+-- * Sized types+------------------------------------------------------------------------+ -- | Hack for polarity of size indices.-sizePolarity :: QName -> TCM [Polarity]-sizePolarity d =- ifM (not . optSizedTypes <$> pragmaOptions) (return []) $ do+sizePolarity :: QName -> [Polarity] -> TCM [Polarity]+sizePolarity d pol0 = do+ let exit = return pol0+ ifM (not . optSizedTypes <$> pragmaOptions) exit $ do def <- getConstInfo d case theDef def of Datatype{ dataPars = np, dataCons = cons } -> do let TelV tel _ = telView' $ defType def (parTel, ixTel) = genericSplitAt np $ telToList tel case ixTel of- [] -> return [] -- No size index- Arg _ _ (_, a) : _ -> ifM (not <$> isSizeType a) (return []) $ do+ [] -> exit -- No size index+ Dom _ _ (_, a) : _ -> ifM ((/= Just BoundedNo) <$> isSizeType a) exit $ do+ -- we assume the size index to be 'Covariant' ...+ let pol = genericTake np pol0+ polCo = pol ++ [Covariant]+ polIn = pol ++ [Invariant]+ setPolarity d $ polCo+ -- and seek confirm it by looking at the constructor types let check c = do t <- defType <$> getConstInfo c addCtxTel (telFromList parTel) $ do- let pars = reverse [ defaultArg $ Var i [] | i <- [0..np - 1] ]+--OLD: let pars = reverse [ defaultArg $ var i | i <- [0..np - 1] ]+ let pars = map (defaultArg . var) $ downFrom np TelV conTel target <- telView =<< (t `piApplyM` pars) case conTel of EmptyTel -> return False -- no size argument ExtendTel arg tel ->- ifM (not <$> isSizeType (unArg arg)) (return False) $ do -- also no size argument+ ifM ((/= Just BoundedNo) <$> isSizeType (unDom arg)) (return False) $ do -- also no size argument -- First constructor argument has type Size - -- check only positive occurences in tel+ -- check that only positive occurences in tel isPos <- underAbstraction arg tel $ \tel -> do- pols <- zipWithM polarity [0..] $ map (snd . unArg) $ telToList tel- return $ all (== Covariant) pols+ pols <- zipWithM polarity [0..] $ map (snd . unDom) $ telToList tel+ return $ all (`elem` [Nonvariant, Covariant]) pols -- check that the size argument appears in the -- right spot in the target type@@ -92,49 +282,45 @@ return $ isPos && isLin - ifM (and <$> mapM check cons)- (return [Covariant])- (return [Invariant])- _ -> return []+ ifM (andM $ map check cons)+ (return polCo) -- yes, we have a sized type here+ (return polIn) -- no, does not conform to the rules of sized types+ _ -> exit checkSizeIndex :: Nat -> Nat -> Type -> TCM Bool-checkSizeIndex np i (El _ (Def _ args)) = do- let excl = not $ freeIn i (pars ++ ixs)- s <- sizeView ix- case s of- SizeSuc (Var j []) -> return $ and [ excl, i == j ]- _ -> return False- where- (pars, Arg _ _ ix : ixs) = genericSplitAt np args-checkSizeIndex _ _ _ = __IMPOSSIBLE__--(/\) :: Polarity -> Polarity -> Polarity-a /\ b | a == b = a- | otherwise = Invariant--neg :: Polarity -> Polarity-neg Covariant = Contravariant-neg Contravariant = Covariant-neg Invariant = Invariant--composePol :: Polarity -> Polarity -> Polarity-composePol Invariant _ = Invariant-composePol Covariant x = x-composePol Contravariant x = neg x+checkSizeIndex np i a =+ case ignoreSharing $ unEl a of+ Def _ args -> do+ let excl = not $ freeIn i (pars ++ ixs)+ s <- sizeView ix+ case s of+ SizeSuc v | Var j [] <- ignoreSharing v+ -> return $ and [ excl, i == j ]+ _ -> return False+ where+ (pars, Arg _ _ ix : ixs) = genericSplitAt np args+ _ -> __IMPOSSIBLE__ +-- | @polarities i a@ computes the list of polarities of de Bruijn index @i@+-- in syntactic entity @a@. class HasPolarity a where polarities :: Nat -> a -> TCM [Polarity] +-- | @polarity i a@ computes the polarity of de Bruijn index @i@+-- in syntactic entity @a@ by taking the infimum of all 'polarities'. polarity :: HasPolarity a => Nat -> a -> TCM Polarity polarity i x = do ps <- polarities i x case ps of- [] -> return Covariant+ [] -> return Nonvariant ps -> return $ foldr1 (/\) ps instance HasPolarity a => HasPolarity (Arg a) where polarities i = polarities i . unArg +instance HasPolarity a => HasPolarity (Dom a) where+ polarities i = polarities i . unDom+ instance HasPolarity a => HasPolarity (Abs a) where polarities i (Abs _ b) = polarities (i + 1) b polarities i (NoAbs _ v) = polarities i v@@ -149,9 +335,13 @@ polarities i (El _ v) = polarities i v instance HasPolarity Term where- polarities i v = case v of- Var n ts | n == i -> (Covariant :) <$> polarities i ts- | otherwise -> polarities i ts+ polarities i v = do+ v <- instantiate v+ case v of+ -- Andreas, 2012-09-06: taking the polarities of the arguments+ -- without taking the variance of the function into account seems wrong.+ Var n ts | n == i -> (Covariant :) . map (const Invariant) <$> polarities i ts+ | otherwise -> map (const Invariant) <$> polarities i ts Lam _ t -> polarities i t Lit _ -> return [] Level l -> polarities i l@@ -159,11 +349,12 @@ pols <- getPolarity x let compose p ps = map (composePol p) ps concat . zipWith compose (pols ++ repeat Invariant) <$> mapM (polarities i) ts- Con _ ts -> polarities i ts+ Con _ ts -> polarities i ts -- constructors can be seen as monotone in all args. Pi a b -> (++) <$> (map neg <$> polarities i a) <*> polarities i b- Sort _ -> return []+ Sort s -> return [] -- polarities i s -- return [] MetaV _ ts -> map (const Invariant) <$> polarities i ts- DontCare _ -> return []+ Shared p -> polarities i $ derefPtr p+ DontCare t -> polarities i t -- return [] instance HasPolarity Level where polarities i (Max as) = polarities i as@@ -174,7 +365,7 @@ instance HasPolarity LevelAtom where polarities i l = case l of- MetaLevel _ vs -> map (const Invariant) <$> polarities i l+ MetaLevel _ vs -> map (const Invariant) <$> polarities i vs BlockedLevel _ v -> polarities i v NeutralLevel v -> polarities i v UnreducedLevel v -> polarities i v
src/full/Agda/TypeChecking/Polarity.hs-boot view
@@ -5,3 +5,4 @@ import Agda.TypeChecking.Monad.Base computePolarity :: QName -> TCM ()+composePol :: Polarity -> Polarity -> Polarity
src/full/Agda/TypeChecking/Positivity.hs view
@@ -1,19 +1,27 @@-{-# LANGUAGE CPP #-}+{-# LANGUAGE CPP, FlexibleInstances, FlexibleContexts,+ UndecidableInstances #-} -- | Check that a datatype is strictly positive. module Agda.TypeChecking.Positivity where import Control.Applicative hiding (empty)+import Control.DeepSeq+import Control.Monad.Reader+ import Data.Set (Set) import qualified Data.Set as Set import Data.Map (Map) import qualified Data.Map as Map import Data.List as List+import Data.Maybe (mapMaybe) import Agda.Syntax.Position import Agda.Syntax.Common import Agda.Syntax.Internal+import Agda.TypeChecking.Datatypes (isDataOrRecordType, DataOrRecord(..))+import Agda.TypeChecking.Records (unguardedRecord, recursiveRecord) import Agda.TypeChecking.Monad+import Agda.TypeChecking.Monad.Builtin (primInf, CoinductionKit(..), coinductionKit) import Agda.TypeChecking.Reduce import Agda.TypeChecking.Pretty import Agda.TypeChecking.Substitute@@ -21,6 +29,7 @@ import Agda.Utils.Impossible import Agda.Utils.Permutation import Agda.Utils.Size+import Agda.Utils.List import Agda.Utils.Monad import Agda.Utils.SemiRing import qualified Agda.Utils.Graph as Graph@@ -28,49 +37,87 @@ #include "../undefined.h" --- | Check that the datatypes in the given mutual block--- are strictly positive.-checkStrictlyPositive :: MutualId -> TCM ()-checkStrictlyPositive mi = do- qs <- lookupMutualBlock mi+-- | Check that the datatypes in the mutual block containing the given+-- declarations are strictly positive.+checkStrictlyPositive :: Set QName -> TCM ()+checkStrictlyPositive qs = disableDestructiveUpdate $ do+ -- compute the occurrence graph for qs reportSDoc "tc.pos.tick" 100 $ text "positivity of" <+> prettyTCM (Set.toList qs)- g <- buildOccurrenceGraph qs+ g <- Graph.filterEdges (\ (Edge o _) -> o /= Unused) <$> buildOccurrenceGraph qs let gstar = Graph.transitiveClosure $ fmap occ g reportSDoc "tc.pos.tick" 100 $ text "constructed graph" reportSLn "tc.pos.graph" 5 $ "Positivity graph: N=" ++ show (size $ Graph.nodes g) ++ " E=" ++ show (length $ Graph.edges g) reportSDoc "tc.pos.graph" 10 $ vcat [ text "positivity graph for" <+> prettyTCM (Set.toList qs)- , nest 2 $ prettyGraph g+ , nest 2 $ prettyTCM g ]+ reportSDoc "tc.pos.graph" 50 $ vcat+ [ text "transitive closure of positivity graph for" <+>+ prettyTCM (Set.toList qs)+ , nest 2 $ prettyTCM gstar+ ]++ -- remember argument occurrences for qs in the signature mapM_ (setArgs gstar) $ Set.toList qs reportSDoc "tc.pos.tick" 100 $ text "set args"++ -- check positivity for all strongly connected components of the graph for qs+ let sccs = Graph.sccs gstar+ reportSDoc "tc.pos.graph.sccs" 15 $ text $ " sccs = " ++ show sccs+ forM_ sccs $ \ scc -> setMut [ q | DefNode q <- scc ] whenM positivityCheckEnabled $ mapM_ (checkPos g) $ Set.toList qs reportSDoc "tc.pos.tick" 100 $ text "checked positivity"+ where- checkPos g q = whenM (isDatatype q) $ do+ checkPos g q = do+ -- we check positivity only for data or record definitions+ whenJustM (isDatatype q) $ \ dr -> do reportSDoc "tc.pos.check" 10 $ text "Checking positivity of" <+> prettyTCM q- case Graph.findPath isNegative (DefNode q) (DefNode q) g of- Nothing -> return ()- Just (Edge Positive _) -> __IMPOSSIBLE__- Just (Edge Unused _) -> __IMPOSSIBLE__- Just (Edge Negative how) -> do+ -- get all pathes from q to q that exhibit a non-strictly occurrence+ -- or, in case of records, any recursive occurrence+ let critical IsData = \ (Edge o _) -> o <= JustPos+ critical IsRecord = \ (Edge o _) -> o /= Unused+ loops = filter (critical dr) $ Graph.allPaths (critical dr) (DefNode q) (DefNode q) g++ -- if we have a negative loop, raise error+ forM_ [ how | Edge o how <- loops, o <= JustPos ] $ \ how -> do err <- fsep $ [prettyTCM q] ++ pwords "is not strictly positive, because it occurs" ++ [prettyTCM how] setCurrentRange (getRange q) $ typeError $ GenericError (show err) + -- if we find an unguarded record, mark it as such+ (\ just noth -> maybe noth just (mhead [ how | Edge o how <- loops, o <= StrictPos ]))+ (\ how -> do+ reportSDoc "tc.pos.record" 5 $ sep+ [ prettyTCM q <+> text "is not guarded, because it occurs"+ , prettyTCM how+ ]+ unguardedRecord q) $+ -- otherwise, if the record is recursive, mark it as well+ forM_ (take 1 [ how | Edge GuardPos how <- loops ]) $ \ how -> do+ reportSDoc "tc.pos.record" 5 $ sep+ [ prettyTCM q <+> text "is recursive, because it occurs"+ , prettyTCM how+ ]+ recursiveRecord q+ occ (Edge o _) = o- isNegative (Edge o _) = o == Negative isDatatype q = do def <- theDef <$> getConstInfo q return $ case def of- Datatype{dataClause = Nothing} -> True- Record {recClause = Nothing} -> True- _ -> False+ Datatype{dataClause = Nothing} -> Just IsData+ Record {recClause = Nothing} -> Just IsRecord+ _ -> Nothing + -- Set the mutually recursive identifiers for a SCC.+ setMut [] = return () -- nothing to do+ setMut [q] = return () -- no mutual recursion+ setMut qs = forM_ qs $ \ q -> setMutual q (delete q qs)+ -- Set the polarity of the arguments to a definition setArgs g q = do reportSDoc "tc.pos.args" 5 $ text "checking args of" <+> prettyTCM q@@ -78,21 +125,20 @@ let nArgs = maximum $ n : [ i + 1 | (ArgNode q1 i) <- Set.toList $ Graph.nodes g , q1 == q ]- findOcc i = case Graph.lookup (ArgNode q i) (DefNode q) g of- Nothing -> Unused- Just Negative -> Negative- Just Positive -> Positive- Just Unused -> Unused+ findOcc i = maybe Unused id $ Graph.lookup (ArgNode q i) (DefNode q) g args = map findOcc [0..nArgs - 1] reportSDoc "tc.pos.args" 10 $ sep [ text "args of" <+> prettyTCM q <+> text "=" , nest 2 $ prettyList $ map (text . show) args ]- setArgOccurrences q args+ -- The list args can take a long time to compute, but contains+ -- small elements, and is stored in the interface (right?), so+ -- it is computed deep-strictly.+ setArgOccurrences q $!! args getDefArity def = case theDef def of Function{ funClauses = cs, funProjection = proj } -> do- let dropped = maybe 0 (fromIntegral . subtract 1 . snd) proj+ let dropped = maybe 0 (subtract 1 . snd) proj subtract dropped . arity <$> instantiateFull (defType def) Datatype{ dataPars = n } -> return n Record{ recPars = n } -> return n@@ -100,27 +146,53 @@ -- Specification of occurrences ------------------------------------------- +-- | 'Occurrence' is a complete lattice with least element 'Mixed'+-- and greatest element 'Unused'.+--+-- It forms a commutative semiring where 'oplus' is meet (glb)+-- and 'otimes' is composition. Both operations are idempotent.+--+-- For 'oplus', 'Unused' is neutral (zero) and 'Mixed' is dominant.+-- For 'otimes', 'StrictPos' is neutral (one) and 'Unused' is dominant.+ instance SemiRing Occurrence where- oplus Negative _ = Negative- oplus _ Negative = Negative- oplus Unused o = o+ oplus Mixed _ = Mixed -- dominant+ oplus _ Mixed = Mixed+ oplus Unused o = o -- neutral oplus o Unused = o- oplus Positive Positive = Positive+ oplus JustNeg JustNeg = JustNeg+ oplus JustNeg o = Mixed -- negative and any form of positve+ oplus o JustNeg = Mixed+ oplus GuardPos o = o -- second-rank neutral+ oplus o GuardPos = o+ oplus StrictPos o = o -- third-rank neutral+ oplus o StrictPos = o+ oplus JustPos JustPos = JustPos - otimes Unused _ = Unused- otimes _ Unused = Unused- otimes Negative _ = Negative- otimes _ Negative = Negative- otimes Positive Positive = Positive+ otimes Unused _ = Unused -- dominant+ otimes _ Unused = Unused+ otimes Mixed _ = Mixed -- second-rank dominance+ otimes _ Mixed = Mixed+ otimes JustNeg JustNeg = JustPos+ otimes JustNeg _ = JustNeg -- third-rank dominance+ otimes _ JustNeg = JustNeg+ otimes JustPos _ = JustPos -- fourth-rank dominance+ otimes _ JustPos = JustPos+ otimes GuardPos _ = GuardPos -- _ `elem` [StrictPos, GuardPos]+ otimes _ GuardPos = GuardPos+ otimes StrictPos StrictPos = StrictPos -- neutral -- | Description of an occurrence. data OccursWhere = LeftOfArrow OccursWhere | DefArg QName Nat OccursWhere -- ^ in the nth argument of a define constant+ | UnderInf OccursWhere -- ^ in the principal argument of built-in ∞ | VarArg OccursWhere -- ^ as an argument to a bound variable | MetaArg OccursWhere -- ^ as an argument of a metavariable | ConArgType QName OccursWhere -- ^ in the type of a constructor+ | IndArgType QName OccursWhere -- ^ in a datatype index of a constructor | InClause Nat OccursWhere -- ^ in the nth clause of a defined function+ | Matched OccursWhere -- ^ matched against in a clause of a defined function | InDefOf QName OccursWhere -- ^ in the definition of a constant | Here | Unknown -- ^ an unknown position (treated as negative)@@ -131,10 +203,13 @@ Unknown >*< o = Unknown LeftOfArrow o1 >*< o2 = LeftOfArrow (o1 >*< o2) DefArg d i o1 >*< o2 = DefArg d i (o1 >*< o2)+UnderInf o1 >*< o2 = UnderInf (o1 >*< o2) VarArg o1 >*< o2 = VarArg (o1 >*< o2) MetaArg o1 >*< o2 = MetaArg (o1 >*< o2) ConArgType c o1 >*< o2 = ConArgType c (o1 >*< o2)+IndArgType c o1 >*< o2 = IndArgType c (o1 >*< o2) InClause i o1 >*< o2 = InClause i (o1 >*< o2)+Matched o1 >*< o2 = Matched (o1 >*< o2) InDefOf d o1 >*< o2 = InDefOf d (o1 >*< o2) instance PrettyTCM OccursWhere where@@ -160,10 +235,15 @@ LeftOfArrow o -> explain o $ pwords "to the left of an arrow" DefArg q i o -> explain o $ pwords "in the" ++ nth i ++ pwords "argument to" ++ [prettyTCM q]+ UnderInf o -> do+ Def inf _ <- ignoreSharing <$> primInf -- this cannot fail if an 'UnderInf' has been generated+ explain o $ pwords "under" ++ [prettyTCM inf] VarArg o -> explain o $ pwords "in an argument to a bound variable" MetaArg o -> explain o $ pwords "in an argument to a metavariable" ConArgType c o -> explain o $ pwords "in the type of the constructor" ++ [prettyTCM c]+ IndArgType c o -> explain o $ pwords "in an index of the target type of the constructor" ++ [prettyTCM c] InClause i o -> explain o $ pwords "in the" ++ nth i ++ pwords "clause"+ Matched o -> explain o $ pwords "as matched against" InDefOf d o -> explain o $ pwords "in the definition of" ++ [prettyTCM d] explain o ds = prettyO o $$ fsep ds@@ -173,22 +253,28 @@ Here -> Here Unknown -> Unknown DefArg q i o -> DefArg q i $ maxOneLeftOfArrow o+ UnderInf o -> UnderInf $ maxOneLeftOfArrow o InDefOf d o -> InDefOf d $ maxOneLeftOfArrow o VarArg o -> VarArg $ maxOneLeftOfArrow o MetaArg o -> MetaArg $ maxOneLeftOfArrow o ConArgType c o -> ConArgType c $ maxOneLeftOfArrow o+ IndArgType c o -> IndArgType c $ maxOneLeftOfArrow o InClause i o -> InClause i $ maxOneLeftOfArrow o+ Matched o -> Matched $ maxOneLeftOfArrow o purgeArrows o = case o of LeftOfArrow o -> purgeArrows o Here -> Here Unknown -> Unknown DefArg q i o -> DefArg q i $ purgeArrows o+ UnderInf o -> UnderInf $ purgeArrows o InDefOf d o -> InDefOf d $ purgeArrows o VarArg o -> VarArg $ purgeArrows o MetaArg o -> MetaArg $ purgeArrows o ConArgType c o -> ConArgType c $ purgeArrows o+ IndArgType c o -> IndArgType c $ purgeArrows o InClause i o -> InClause i $ purgeArrows o+ Matched o -> Matched $ purgeArrows o splitOnDef o = case o of Here -> [Here]@@ -196,10 +282,13 @@ InDefOf d o -> sp (InDefOf d) o LeftOfArrow o -> sp LeftOfArrow o DefArg q i o -> sp (DefArg q i) o+ UnderInf o -> sp UnderInf o VarArg o -> sp VarArg o MetaArg o -> sp MetaArg o ConArgType c o -> sp (ConArgType c) o+ IndArgType c o -> sp (IndArgType c) o InClause i o -> sp (InClause i) o+ Matched o -> sp Matched o where sp f o = case splitOnDef o of os@(InDefOf _ _:_) -> f Here : os@@ -226,29 +315,65 @@ here :: Item -> Occurrences here i = Map.singleton i [Here] +-- | @onlyVarsUpTo n occs@ discards occurrences of de Bruijn index @>= n@.+onlyVarsUpTo :: Nat -> Occurrences -> Occurrences+onlyVarsUpTo n = Map.filterWithKey p+ where p (AnArg i) v = i < n+ p (ADef q) v = True++-- | Context for computing occurrences.+data OccEnv = OccEnv+ { vars :: [Maybe Item] -- ^ Items corresponding to the free variables.+ , inf :: Maybe QName -- ^ Name for ∞ builtin.+ }++-- | Monad for computing occurrences.+type OccM = Reader OccEnv++withExtendedOccEnv :: Maybe Item -> OccM a -> OccM a+withExtendedOccEnv i = local $ \ e -> e { vars = i : vars e }++-- | Running the monad+getOccurrences :: ComputeOccurrences a => [Maybe Item] -> a -> TCM Occurrences+getOccurrences vars a = do+ kit <- coinductionKit+ return $ runReader (occurrences a) $ OccEnv vars $ fmap nameOfInf kit+ class ComputeOccurrences a where- -- | The first argument is the items corresponding to the free variables.- occurrences :: [Maybe Item] -> a -> Occurrences+ occurrences :: a -> OccM Occurrences instance ComputeOccurrences Clause where- occurrences vars (Clause{ clausePats = ps, clauseBody = body }) =- walk vars (patItems ps) body+ occurrences (Clause{ clausePats = ps0, clauseBody = body }) = do+ let ps = map unArg ps0+ (concatOccurs (mapMaybe matching (zip [0..] ps)) >+<) <$>+ walk (patItems ps) body where- walk _ _ NoBody = Map.empty- walk vars [] (Body v) = occurrences vars v- walk vars (i : pis) (Bind b) = walk (i : vars) pis $ absBody b- walk _ [] Bind{} = __IMPOSSIBLE__- walk _ (_ : _) Body{} = __IMPOSSIBLE__+ matching (i, p)+ | properlyMatching p = Just $ occursAs Matched $ here $ AnArg i+ | otherwise = Nothing+{-+ matching (i, VarP{}) = Nothing+ matching (i, DotP{}) = Nothing+ matching (i, ConP _ Just{} _) = Nothing -- record patterns are not matches+ matching (i, _ ) = Just (occursAs Matched $ here (AnArg i))+-} - match i (Arg _ _ VarP{}) = Map.empty- match i _ = Map.singleton (AnArg i) [Unknown]+ walk _ NoBody = return $ Map.empty+ walk [] (Body v) = occurrences v+ walk (i : pis) (Bind b) = withExtendedOccEnv i $ walk pis $ absBody b+ walk [] Bind{} = __IMPOSSIBLE__+ walk (_ : _) Body{} = __IMPOSSIBLE__ - patItems ps = concat $ zipWith patItem [0..] $ map unArg ps- patItem i (VarP _) = [Just (AnArg i)]- patItem i p = replicate (nVars p) (Just (AnArg i))- -- if we're pattern matching it's not something the positivity checker needs to worry about- -- Actually it is: see issue 464+ -- @patItems ps@ creates a map from the pattern variables of @ps@+ -- to the index of the argument they are bound in.+ -- This map is given as a list.+ patItems ps = concat $ zipWith patItem [0..] ps + -- @patItem i p@ replicates index @i@ as often as there are+ -- pattern variables in @p@+ patItem i p = replicate (nVars p) (Just (AnArg i))++ -- @nVars p@ computes the number of variables bound by pattern @p@ nVars p = case p of VarP{} -> 1 DotP{} -> 1@@ -256,22 +381,32 @@ LitP{} -> 0 instance ComputeOccurrences Term where- occurrences vars v = case v of- Var i args ->- maybe Map.empty here (index vars $ fromIntegral i)- >+< occursAs VarArg (occurrences vars args)- Def d args ->- here (ADef d) >+<- concatOccurs (zipWith (occursAs . DefArg d) [0..] $ map (occurrences vars) args)- Con c args -> occurrences vars args- MetaV _ args -> occursAs MetaArg $ occurrences vars args- Pi a b -> occursAs LeftOfArrow (occurrences vars a) >+<- occurrences vars b- Lam _ b -> occurrences vars b- Level l -> occurrences vars l- Lit{} -> Map.empty- Sort{} -> Map.empty- DontCare _ -> Map.empty -- Andreas, 2011-09-09: do we need to check for negative occurrences in irrelevant positions?+ occurrences v = case v of+ Var i args -> do+ vars <- asks vars+ occs <- occurrences args+ return $ maybe Map.empty here (index vars i)+ >+< occursAs VarArg occs+ Def d args -> do+ inf <- asks inf+ let occsAs = if Just d /= inf then occursAs . DefArg d else \ n ->+ -- the principal argument of builtin INF (∞) is the second (n==1)+ -- the first is a level argument (n==0, counting from 0!)+ if n == 1 then occursAs UnderInf else occursAs (DefArg d n)+ occs <- mapM occurrences args+ return $ here (ADef d) >+< concatOccurs (zipWith occsAs [0..] occs)+ Con c args -> occurrences args+ MetaV _ args -> occursAs MetaArg <$> occurrences args+ Pi a b -> do+ oa <- occurrences a+ ob <- occurrences b+ return $ occursAs LeftOfArrow oa >+< ob+ Lam _ b -> occurrences b+ Level l -> occurrences l+ Lit{} -> return $ Map.empty+ Sort{} -> return $ Map.empty+ DontCare _ -> return $ Map.empty -- Andreas, 2011-09-09: do we need to check for negative occurrences in irrelevant positions?+ Shared p -> occurrences $ derefPtr p where -- Apparently some development version of GHC chokes if the -- following line is replaced by vs ! i.@@ -280,38 +415,44 @@ | otherwise = __IMPOSSIBLE__ instance ComputeOccurrences Level where- occurrences vars (Max as) = occurrences vars as+ occurrences (Max as) = occurrences as instance ComputeOccurrences PlusLevel where- occurrences vars ClosedLevel{} = Map.empty- occurrences vars (Plus _ l) = occurrences vars l+ occurrences ClosedLevel{} = return $ Map.empty+ occurrences (Plus _ l) = occurrences l instance ComputeOccurrences LevelAtom where- occurrences vars l = case l of- MetaLevel _ vs -> occursAs MetaArg $ occurrences vars vs- BlockedLevel _ v -> occurrences vars v- NeutralLevel v -> occurrences vars v- UnreducedLevel v -> occurrences vars v+ occurrences l = case l of+ MetaLevel _ vs -> occursAs MetaArg <$> occurrences vs+ BlockedLevel _ v -> occurrences v+ NeutralLevel v -> occurrences v+ UnreducedLevel v -> occurrences v instance ComputeOccurrences Type where- occurrences vars (El _ v) = occurrences vars v+ occurrences (El _ v) = occurrences v instance ComputeOccurrences a => ComputeOccurrences (Tele a) where- occurrences vars EmptyTel = Map.empty- occurrences vars (ExtendTel a b) = occurrences vars (a, b)+ occurrences EmptyTel = return $ Map.empty+ occurrences (ExtendTel a b) = occurrences (a, b) instance ComputeOccurrences a => ComputeOccurrences (Abs a) where- occurrences vars (Abs _ b) = occurrences (Nothing : vars) b- occurrences vars (NoAbs _ b) = occurrences vars b+ occurrences (Abs _ b) = withExtendedOccEnv Nothing $ occurrences b+ occurrences (NoAbs _ b) = occurrences b instance ComputeOccurrences a => ComputeOccurrences (Arg a) where- occurrences vars = occurrences vars . unArg+ occurrences = occurrences . unArg +instance ComputeOccurrences a => ComputeOccurrences (Dom a) where+ occurrences = occurrences . unDom+ instance ComputeOccurrences a => ComputeOccurrences [a] where- occurrences vars = concatOccurs . map (occurrences vars)+ occurrences vs = concatOccurs <$> mapM occurrences vs instance (ComputeOccurrences a, ComputeOccurrences b) => ComputeOccurrences (a, b) where- occurrences vars (x, y) = occurrences vars x >+< occurrences vars y+ occurrences (x, y) = do+ ox <- occurrences x+ oy <- occurrences y+ return $ ox >+< oy -- | Compute the occurrences in a given definition. computeOccurrences :: QName -> TCM Occurrences@@ -321,24 +462,26 @@ Function{funClauses = cs} -> do n <- getDefArity def cs <- map (etaExpandClause n) <$> instantiateFull cs- return- $ concatOccurs- $ zipWith (occursAs . InClause) [0..]- $ map (occurrences []) cs- Datatype{dataClause = Just c} -> occurrences [] <$> instantiateFull c+ concatOccurs . zipWith (occursAs . InClause) [0..] <$>+ mapM (getOccurrences []) cs+ Datatype{dataClause = Just c} -> getOccurrences [] =<< instantiateFull c Datatype{dataPars = np, dataCons = cs} -> do let conOcc c = do a <- defType <$> getConstInfo c- TelV tel _ <- telView' <$> normalise a- let tel' = telFromList $ genericDrop np $ telToList tel- vars = reverse [ Just (AnArg i) | i <- [0..np - 1] ]- return $ occursAs (ConArgType c) $ occurrences vars tel'+ TelV tel t <- telView' <$> normalise a+ let indices = case unEl t of+ Def _ vs -> genericDrop np vs+ _ -> __IMPOSSIBLE__+ let tel' = telFromList $ genericDrop np $ telToList tel+ vars np = map (Just . AnArg) $ downFrom np+ (>+<) <$> (occursAs (ConArgType c) <$> getOccurrences (vars np) tel')+ <*> (occursAs (IndArgType c) . onlyVarsUpTo np <$> getOccurrences (vars $ size tel) indices) concatOccurs <$> mapM conOcc cs- Record{recClause = Just c} -> occurrences [] <$> instantiateFull c+ Record{recClause = Just c} -> getOccurrences [] =<< instantiateFull c Record{recPars = np, recTel = tel} -> do let tel' = telFromList $ genericDrop np $ telToList tel- vars = reverse [ Just (AnArg i) | i <- [0..np - 1] ]- occurrences vars <$> instantiateFull tel'+ vars = map (Just . AnArg) $ downFrom np+ getOccurrences vars =<< instantiateFull tel' -- Arguments to other kinds of definitions are hard-wired. Constructor{} -> return Map.empty@@ -361,7 +504,8 @@ bind 0 = id bind n = Bind . Abs "_" . bind (n - 1) - vars = reverse [ defaultArg $ Var i [] | i <- [0..m - 1] ]+ vars = map (defaultArg . var) $ downFrom m+-- vars = reverse [ defaultArg $ var i | i <- [0..m - 1] ] liftBody m (Bind b) = Bind $ fmap (liftBody m) b liftBody m NoBody = bind m NoBody@@ -381,26 +525,48 @@ prettyTCM (DefNode q) = prettyTCM q prettyTCM (ArgNode q i) = prettyTCM q <> text ("." ++ show i) -prettyGraph g = vcat $ map pr $ Map.assocs $ Graph.unGraph g- where- pr (n, es) = sep- [ prettyTCM n- , nest 2 $ vcat $ map prE $ Map.assocs es- ]- prE (n, Edge o w) = prO o <+> prettyTCM n <+> fsep (pwords $ show w)- prO Positive = text "-[+]->"- prO Negative = text "-[-]->"- prO Unused = text "-[ ]->"+instance PrettyTCM Occurrence where+ prettyTCM GuardPos = text "-[g+]->"+ prettyTCM StrictPos = text "-[++]->"+ prettyTCM JustPos = text "-[+]->"+ prettyTCM JustNeg = text "-[-]->"+ prettyTCM Mixed = text "-[*]->"+ prettyTCM Unused = text "-[ ]->" +instance PrettyTCM n => PrettyTCM (n, Edge) where+ prettyTCM (n, Edge o w) =+ prettyTCM o <+> prettyTCM n <+> fsep (pwords $ show w)++instance PrettyTCM n => PrettyTCM (n, Occurrence) where+ prettyTCM (n, o) = prettyTCM o <+> prettyTCM n++instance (PrettyTCM n, PrettyTCM (n, e)) => PrettyTCM (Graph n e) where+ prettyTCM g = vcat $ map pr $ Map.assocs $ Graph.unGraph g+ where+ pr (n, es) = sep+ [ prettyTCM n+ , nest 2 $ vcat $ map prettyTCM $ Map.assocs es+ ]+ data Edge = Edge Occurrence OccursWhere deriving (Show) +-- | These operations form a semiring if we quotient by the relation+-- \"the 'Occurrence' components are equal\".+ instance SemiRing Edge where- oplus _ e@(Edge Negative _) = e- oplus e@(Edge Negative _) _ = e- oplus (Edge Unused _) e = e- oplus e (Edge Unused _) = e- oplus (Edge Positive _) e@(Edge Positive _) = e+ oplus _ e@(Edge Mixed _) = e -- dominant+ oplus e@(Edge Mixed _) _ = e+ oplus (Edge Unused _) e = e -- neutral+ oplus e (Edge Unused _) = e+ oplus (Edge JustNeg _) e@(Edge JustNeg _) = e+ oplus _ e@(Edge JustNeg w) = Edge Mixed w+ oplus e@(Edge JustNeg w) _ = Edge Mixed w+ oplus _ e@(Edge JustPos _) = e -- dominates strict pos.+ oplus e@(Edge JustPos _) _ = e+ oplus _ e@(Edge StrictPos _) = e -- dominates 'GuardPos'+ oplus e@(Edge StrictPos _) _ = e+ oplus (Edge GuardPos _) e@(Edge GuardPos _) = e otimes (Edge o1 w1) (Edge o2 w2) = Edge (otimes o1 o2) (w1 >*< w2) @@ -423,27 +589,43 @@ -- argument is the set of names in the current mutual block. computeEdge :: Set QName -> OccursWhere -> TCM (Node, Edge) computeEdge muts o = do- (to, occ) <- mkEdge __IMPOSSIBLE__ Positive o+ (to, occ) <- mkEdge __IMPOSSIBLE__ StrictPos o return (to, Edge occ o) where mkEdge to pol o = case o of Here -> return (to, pol)- Unknown -> return (to, Negative)- VarArg o -> negative o- MetaArg o -> negative o+ Unknown -> return (to, Mixed)+ VarArg o -> mixed o+ MetaArg o -> mixed o LeftOfArrow o -> negative o+ DefArg d i o -> do+ isDR <- isDataOrRecordType d+ let pol' | isDR == Just IsData = GuardPos -- a datatype is guarding+ | otherwise = StrictPos+ if Set.member d muts then mkEdge (ArgNode d i) pol' o+ else addPol o =<< otimes pol' <$> getArgOccurrence d i+{- DefArg d i o | Set.member d muts -> inArg d i o | otherwise -> addPol o =<< getArgOccurrence d i+-}+ UnderInf o -> addPol o GuardPos -- Andreas, 2012-06-09: ∞ is guarding ConArgType _ o -> keepGoing o+ IndArgType _ o -> mixed o InClause _ o -> keepGoing o- InDefOf d o -> mkEdge (DefNode d) Positive o+ Matched o -> mixed o -- consider arguments matched against as used+ InDefOf d o -> do+ isDR <- isDataOrRecordType d+ let pol' | isDR == Just IsData = GuardPos -- a datatype is guarding+ | otherwise = StrictPos+ mkEdge (DefNode d) pol' o where keepGoing = mkEdge to pol- negative = mkEdge to Negative+ mixed = mkEdge to Mixed+ negative o = mkEdge to (otimes pol JustNeg) o addPol o pol' = mkEdge to (otimes pol pol') o -- Reset polarity when changing the target node -- D: (A B -> C) generates a positive edge B --> A.1 -- even though the context is negative.- inArg d i = mkEdge (ArgNode d i) Positive+ inArg d i = mkEdge (ArgNode d i) StrictPos
src/full/Agda/TypeChecking/Pretty.hs view
@@ -10,6 +10,7 @@ import Agda.Syntax.Translation.InternalToAbstract import Agda.Syntax.Translation.AbstractToConcrete import qualified Agda.Syntax.Abstract as A+import qualified Agda.Syntax.Concrete as C import qualified Agda.Syntax.Abstract.Pretty as P import qualified Agda.Syntax.Concrete.Pretty as P @@ -27,10 +28,12 @@ type Doc = P.Doc -empty, comma :: TCM Doc+empty, comma, colon, equals :: TCM Doc empty = return P.empty comma = return P.comma+colon = return P.colon+equals = return P.equals pretty x = return $ P.pretty x prettyA x = P.prettyA x text :: String -> TCM Doc@@ -42,8 +45,9 @@ fsep ds = P.fsep <$> sequence ds hsep ds = P.hsep <$> sequence ds vcat ds = P.vcat <$> sequence ds-($$), (<>), (<+>) :: TCM Doc -> TCM Doc -> TCM Doc+($$), ($+$), (<>), (<+>) :: TCM Doc -> TCM Doc -> TCM Doc d1 $$ d2 = (P.$$) <$> d1 <*> d2+d1 $+$ d2 = (P.$+$) <$> d1 <*> d2 d1 <> d2 = (P.<>) <$> d1 <*> d2 d1 <+> d2 = (P.<+>) <$> d1 <*> d2 nest n d = P.nest n <$> d@@ -72,6 +76,7 @@ instance PrettyTCM a => PrettyTCM [a] where prettyTCM = prettyList . map prettyTCM +instance PrettyTCM Nat where prettyTCM = text . show instance PrettyTCM Term where prettyTCM x = prettyA =<< reify x instance PrettyTCM Type where prettyTCM x = prettyA =<< reify x instance PrettyTCM Sort where prettyTCM x = prettyA =<< reify x@@ -95,15 +100,23 @@ prettyTCM (IsSort a t) = text "Sort" <+> prettyTCM a <+> text ":" <+> prettyTCM t instance PrettyTCM MetaId where- prettyTCM = text . show+ prettyTCM x = do+ mn <- getMetaNameSuggestion x+ text $ show (NamedMeta mn x) instance PrettyTCM a => PrettyTCM (Blocked a) where prettyTCM (Blocked x a) = text "[" <+> prettyTCM a <+> text "]" <> text (show x) prettyTCM (NotBlocked x) = prettyTCM x -instance (Reify a e, ToConcrete e c, P.Pretty c) => PrettyTCM (Arg a) where+instance (Reify a e, ToConcrete e c, P.Pretty c) => PrettyTCM (Named String a) where prettyTCM x = prettyA =<< reify x +instance (ReifyWhen a e, ToConcrete e c, P.Pretty c) => PrettyTCM (Arg a) where+ prettyTCM x = prettyA =<< reify x++instance (Reify a e, ToConcrete e c, P.Pretty c) => PrettyTCM (Dom a) where+ prettyTCM x = prettyA =<< reify x+ instance PrettyTCM Elim where prettyTCM (Apply v) = text "$" <+> prettyTCM v prettyTCM (Proj f) = text "." <> prettyTCM f@@ -111,11 +124,15 @@ instance PrettyTCM A.Expr where prettyTCM = prettyA +instance PrettyTCM C.Name where+ prettyTCM = text . show+ instance PrettyTCM Relevance where prettyTCM Irrelevant = text "." prettyTCM NonStrict = text ".." prettyTCM Relevant = empty prettyTCM Forced = empty+ prettyTCM UnusedArg = empty instance PrettyTCM Comparison where prettyTCM CmpEq = text "=="@@ -175,8 +192,14 @@ OpenIFS{} -> __IMPOSSIBLE__ InstS{} -> __IMPOSSIBLE__ InstV{} -> __IMPOSSIBLE__- FindInScope m -> sep [ text $ "Find in scope " ++ (show m) ]- IsEmpty t ->+ FindInScope m cands -> do+ t <- getMetaType m+ sep [ text $ "Find in scope " ++ (show m) ++ " :"+ , nest 2 $ prettyTCM t+ , sep $ flip map cands $ \(t,ty) ->+ prettyTCM t <+> text ": " <+> prettyTCM ty+ ]+ IsEmpty r t -> sep [ text "Is empty:", nest 2 $ prettyTCM t ] instance PrettyTCM Literal where@@ -203,7 +226,7 @@ prettyTCM (PrettyContext ctx) = P.fsep . reverse <$> pr (map ctxEntry ctx) where pr [] = return []- pr (Arg h r (x,t) : ctx) = escapeContext 1 $ do+ pr (Dom h r (x,t) : ctx) = escapeContext 1 $ do d <- prettyTCM t x <- prettyTCM x dctx <- pr ctx
src/full/Agda/TypeChecking/Primitive.hs view
@@ -41,9 +41,11 @@ -- | Rewrite a literal to constructor form if possible. constructorForm :: Term -> TCM Term-constructorForm v = case v of+constructorForm v = case ignoreSharing v of+{- 2012-04-02 changed semantics of DontCare -- Andreas, 2011-10-03, the following line restores IrrelevantLevel DontCare v -> constructorForm v+-} Lit (LitInt r n) -> cons primZero primSuc (Lit . LitInt r) n -- Level (Max []) -> primLevelZero -- Level (Max [ClosedLevel n]) -> cons primLevelZero primLevelSuc (Level . Max . (:[]) . ClosedLevel) n@@ -209,9 +211,10 @@ fromA <- toTerm return $ mkList nil cons toA fromA where- isCon (Lam _ b) = isCon $ absBody b- isCon (Con c _) = return c- isCon v = do+ isCon (Lam _ b) = isCon $ absBody b+ isCon (Con c _) = return c+ isCon (Shared p) = isCon (derefPtr p)+ isCon v = do d <- prettyTCM v typeError $ GenericError $ "expected constructor in built-in binding to " ++ show d -- TODO: check this when binding the things@@ -248,7 +251,7 @@ fromReducedTerm :: (Term -> Maybe a) -> TCM (FromTermFunction a) fromReducedTerm f = return $ \t -> do b <- reduceB t- case f $ unArg (ignoreBlocking b) of+ case f $ ignoreSharing $ unArg (ignoreBlocking b) of Just x -> return $ YesReduction x Nothing -> return $ NoReduction (reduced b) @@ -264,11 +267,11 @@ when (optSafe clo) (typeError SafeFlagPrimTrustMe) t <- hPi "a" (el primLevel) $ hPi "A" (return $ sort $ varSort 0) $- hPi "x" (El (varSort 1) <$> var 0) $- hPi "y" (El (varSort 2) <$> var 1) $+ hPi "x" (El (varSort 1) <$> varM 0) $+ hPi "y" (El (varSort 2) <$> varM 1) $ El (varSort 3) <$>- primEquality <#> var 3 <#> var 2 <@> var 1 <@> var 0- Con rf [] <- primRefl+ primEquality <#> varM 3 <#> varM 2 <@> varM 1 <@> varM 0+ Con rf [] <- ignoreSharing <$> primRefl n <- conPars . theDef <$> getConstInfo rf let refl x | n == 2 = Con rf [Arg Hidden Forced x] | n == 3 = Con rf []@@ -422,22 +425,30 @@ a --> b = do a' <- a b' <- b- return $ El (getSort a' `sLub` getSort b') $ Pi (defaultArg a') (NoAbs "_" b')+ return $ El (getSort a' `sLub` getSort b') $ Pi (Dom NotHidden Relevant a') (NoAbs "_" b') +infixr 4 .-->++(.-->) :: TCM Type -> TCM Type -> TCM Type+a .--> b = do+ a' <- a+ b' <- b+ return $ El (getSort a' `sLub` getSort b') $ Pi (Dom NotHidden Irrelevant a') (NoAbs "_" b')+ gpi :: Hiding -> Relevance -> String -> TCM Type -> TCM Type -> TCM Type gpi h r name a b = do a <- a x <- freshName_ name- b <- addCtx x (Arg h r a) b+ b <- addCtx x (Dom h r a) b return $ El (getSort a `dLub` Abs name (getSort b))- (Pi (Arg h r a) (Abs name b))+ (Pi (Dom h r a) (Abs name b)) hPi, nPi :: String -> TCM Type -> TCM Type -> TCM Type hPi = gpi Hidden Relevant nPi = gpi NotHidden Relevant -var :: Integer -> TCM Term-var n = return $ Var n []+varM :: Int -> TCM Term+varM = return . var infixl 9 <@>, <#> @@ -466,10 +477,12 @@ -- | Abbreviation: @argN = 'Arg' 'NotHidden' 'Relevant'@. argN = Arg NotHidden Relevant+domN = Dom NotHidden Relevant -- | Abbreviation: @argH = 'Arg' 'Hidden' 'Relevant'@. argH = Arg Hidden Relevant+domH = Dom Hidden Relevant --------------------------------------------------------------------------- -- * The actual primitive functions@@ -499,7 +512,7 @@ , "primNatPlus" |-> mkPrimFun2 ((+) :: Op Nat) , "primNatMinus" |-> mkPrimFun2 ((\x y -> max 0 (x - y)) :: Op Nat) , "primNatTimes" |-> mkPrimFun2 ((*) :: Op Nat)- , "primNatDivSucAux" |-> mkPrimFun4 ((\k m n j -> k + div (n + m - j) (m + 1)) :: Nat -> Nat -> Nat -> Nat -> Nat)+ , "primNatDivSucAux" |-> mkPrimFun4 ((\k m n j -> k + div (max 0 $ n + m - j) (m + 1)) :: Nat -> Nat -> Nat -> Nat -> Nat) , "primNatModSucAux" |-> let aux :: Nat -> Nat -> Nat -> Nat -> Nat aux k m n j | n > j = mod (n - j - 1) (m + 1)@@ -567,10 +580,10 @@ Just p -> liftTCM p Nothing -> typeError $ NoSuchPrimitiveFunction x --- | Rebind a primitive. Assumes everything is type correct. Used when--- importing a module with primitives.-rebindPrimitive :: String -> TCM PrimFun-rebindPrimitive x = do- PrimImpl _ pf <- lookupPrimitiveFunction x- bindPrimitive x pf- return pf+lookupPrimitiveFunctionQ :: QName -> TCM (String, PrimitiveImpl)+lookupPrimitiveFunctionQ q = do+ let s = case qnameName q of+ Name _ x _ _ -> show x+ PrimImpl t pf <- lookupPrimitiveFunction s+ return (s, PrimImpl t $ pf { primFunName = q })+
+ src/full/Agda/TypeChecking/ProjectionLike.hs view
@@ -0,0 +1,149 @@+{-# LANGUAGE CPP, PatternGuards, TypeSynonymInstances, FlexibleInstances #-}+module Agda.TypeChecking.ProjectionLike where++import Control.Monad++import Data.Map (Map)+import qualified Data.Map as Map+import Data.List++import Agda.Syntax.Abstract.Name+import Agda.Syntax.Common+import Agda.Syntax.Internal+import Agda.Syntax.Position++import Agda.TypeChecking.Monad+import Agda.TypeChecking.Free (isBinderUsed)+import Agda.TypeChecking.Substitute+import Agda.TypeChecking.Positivity+import Agda.TypeChecking.CompiledClause+-- import Agda.TypeChecking.CompiledClause.Compile++import Agda.TypeChecking.DropArgs++import Agda.Utils.Monad+import Agda.Utils.Size+import Agda.Utils.Permutation+--import Agda.Utils.Pretty++#include "../undefined.h"+import Agda.Utils.Impossible+++-- | Turn a definition into a projection if it looks like a projection.+makeProjection :: QName -> TCM ()+makeProjection x = inContext [] $ do+ reportSLn "tc.proj.like" 30 $ "Considering " ++ show x ++ " for projection likeness"+ defn <- getConstInfo x+ case theDef defn of+ -- Constructor-headed functions can't be projection-like (at the moment). The reason+ -- for this is that invoking constructor-headedness will circumvent the inference of+ -- the dropped arguments.+ -- Nor can abstract definitions be projection-like since they won't reduce+ -- outside the abstract block.+ def@Function{funProjection = Nothing, funClauses = cls, funCompiled = cc0, funInv = NotInjective,+ funMutual = [], -- Andreas, 2012-09-28: only consider non-mutual funs (or those whose recursion status has not yet been determined)+ funAbstr = ConcreteDef} -> do+ ps0 <- filterM validProj (candidateArgs [] (unEl $ defType defn))+ reportSLn "tc.proj.like" 30 $ if null ps0 then " no candidates found"+ else " candidates: " ++ show ps0+ unless (null ps0) $ do+ -- Andreas 2012-09-26: only consider non-recursive functions for proj.like.+ -- Issue 700: problems with recursive funs. in term.checker and reduction+ ifM recursive (reportSLn "tc.proj.like" 30 $ "recursive functions are not considered for projection-likeness") $ do+ ps <- return $ filter (checkOccurs cls . snd) ps0+ when (not (null ps0) && null ps) $ reportSLn "tc.proj.like" 50 $ " occurs check failed\n clauses = " ++ show cls+ case reverse ps of+ [] -> return ()+ (d, n) : _ -> do+ reportSLn "tc.proj.like" 10 $ show (defName defn) ++ " is projection like in argument " +++ show n ++ " for type " ++ show d+ let cls' = map (dropArgs n) cls+ cc = dropArgs n cc0+ -- cc <- compileClauses (Just (x, __IMPOSSIBLE__)) cls'+ reportSLn "tc.proj.like" 20 $ " rewrote clauses to\n " ++ show cc+ let newDef = def+ { funProjection = Just (d, n + 1)+ , funClauses = cls'+ , funCompiled = cc+ , funInv = dropArgs n $ funInv def+ }+ addConstant x $ defn { defPolarity = drop n $ defPolarity defn+ , defArgOccurrences = drop n $ defArgOccurrences defn+ , defDisplay = []+ , theDef = newDef+ }+ Function{funInv = Inverse{}} ->+ reportSLn "tc.proj.like" 30 $ " injective functions can't be projections"+ Function{funAbstr = AbstractDef} ->+ reportSLn "tc.proj.like" 30 $ " abstract functions can't be projections"+ Function{funProjection = Just{}} ->+ reportSLn "tc.proj.like" 30 $ " already projection like"+ _ -> reportSLn "tc.proj.like" 30 $ " not a function"+ where+ -- @validProj (d,n)@ checks whether the head @d@ of the type of the+ -- @n@th argument is injective in all args (i.d. being name of data/record/axiom).+ validProj :: (QName, Int) -> TCM Bool+ validProj (_, 0) = return False+ validProj (d, _) = do+ defn <- theDef <$> getConstInfo d+ return $ case defn of+ Datatype{} -> True+ Record{} -> True+ Axiom{} -> True+ _ -> False++ recursive = do+ occs <- computeOccurrences x+ let xocc = Map.lookup (ADef x) occs+ case xocc of+ Just (_ : _) -> return True -- recursive occurrence+ _ -> return False++ checkOccurs cls n = all (nonOccur n) cls++ nonOccur n Clause{clausePerm = Perm _ p, clausePats = ps, clauseBody = b} =+ and [ take n p == [0..n - 1]+ , onlyMatch n ps -- projection-like functions are only allowed to match on the eliminatee+ -- otherwise we may end up projecting from constructor applications, in+ -- which case we can't reconstruct the dropped parameters+ , checkBody n b ]++ onlyMatch n ps = all (shallowMatch . unArg) (take 1 ps1) &&+ noMatches (ps0 ++ drop 1 ps1)+ where+ (ps0, ps1) = splitAt n ps+ shallowMatch (ConP _ _ ps) = noMatches ps+ shallowMatch _ = True+ noMatches = all (noMatch . unArg)+ noMatch ConP{} = False+ noMatch LitP{} = False+ noMatch VarP{} = True+ noMatch DotP{} = True++ checkBody 0 _ = True+ checkBody _ NoBody = False -- absurd clauses are not permitted+ checkBody n (Bind b) = not (isBinderUsed b) && checkBody (n - 1) (unAbs b)+ checkBody _ Body{} = __IMPOSSIBLE__++ -- @candidateArgs [var 0,...,var(n-1)] t@ adds @(n,d)@ to the output,+ -- if @t@ is a function-type with domain @t 0 .. (n-1)@+ -- (the domain of @t@ is the type of the arg @n@).+ --+ -- This means that from the type of arg @n@ all previous arguments+ -- can be computed by a simple matching.+ -- (Provided the @d@ is data/record/postulate, checked in @validProj@).+ --+ -- E.g. f : {x : _}(y : _){z : _} -> D x y z -> ...+ -- will return (D,3) as a candidate (amongst maybe others).+ --+ candidateArgs :: [Term] -> Term -> [(QName,Int)]+ candidateArgs vs (Shared p) = candidateArgs vs $ derefPtr p+ candidateArgs vs (Pi (Dom r h (El _ def)) b)+ | Def d us <- ignoreSharing def,+ vs == map unArg us = (d, length vs) : candidateRec vs b+ candidateArgs vs (Pi _ b) = candidateRec vs b+ candidateArgs _ _ = []++ candidateRec vs NoAbs{} = []+ candidateRec vs b = candidateArgs (var (size vs) : vs) (unEl $ absBody b)
+ src/full/Agda/TypeChecking/ProjectionLike.hs-boot view
@@ -0,0 +1,7 @@+module Agda.TypeChecking.ProjectionLike where++import Agda.Syntax.Abstract.Name (QName)+import Agda.TypeChecking.Monad.Base++makeProjection :: QName -> TCM ()+
src/full/Agda/TypeChecking/Quote.hs view
@@ -40,8 +40,8 @@ sucLevel <- primLevelSuc lub <- primLevelMax el <- primAgdaTypeEl- Con z _ <- primZero- Con s _ <- primSuc+ Con z _ <- ignoreSharing <$> primZero+ Con s _ <- ignoreSharing <$> primSuc unsupported <- primAgdaTermUnsupported let t @@ u = apply t [defaultArg u] quoteHiding Hidden = hidden@@ -51,6 +51,7 @@ quoteRelevance Irrelevant = irrelevant quoteRelevance NonStrict = relevant quoteRelevance Forced = relevant+ quoteRelevance UnusedArg = relevant quoteLit (LitInt _ n) = iterate suc zero !! fromIntegral n quoteLit _ = unsupported -- We keep no ranges in the quoted term, so the equality on terms@@ -68,17 +69,19 @@ list (a : as) = cons @@ a @@ list as zero = con @@ quoteName z @@ nil suc n = con @@ quoteName s @@ list [arg @@ visible @@ relevant @@ n]+ quoteDom q (Dom h r t) = arg @@ quoteHiding h @@ quoteRelevance r @@ q t quoteArg q (Arg h r t) = arg @@ quoteHiding h @@ quoteRelevance r @@ q t quoteArgs ts = list (map (quoteArg quote) ts)- quote (Var n ts) = var @@ Lit (LitInt noRange n) @@ quoteArgs ts+ quote (Var n ts) = var @@ Lit (LitInt noRange $ fromIntegral n) @@ quoteArgs ts quote (Lam h t) = lam @@ quoteHiding h @@ quote (absBody t) quote (Def x ts) = def @@ quoteName x @@ quoteArgs ts quote (Con x ts) = con @@ quoteName x @@ quoteArgs ts- quote (Pi t u) = pi @@ quoteArg quoteType t+ quote (Pi t u) = pi @@ quoteDom quoteType t @@ quoteType (absBody u) quote (Level _) = unsupported quote (Lit lit) = quoteLit lit quote (Sort s) = sort @@ quoteSort s+ quote (Shared p) = quote $ derefPtr p quote MetaV{} = unsupported quote DontCare{} = unsupported -- could be exposed at some point but we have to take care return (quote, quoteType)@@ -100,7 +103,7 @@ isCon :: QName -> TCM Term -> TCM Bool isCon con tm = do t <- tm- case t of+ case ignoreSharing t of Con con' _ -> return (con == con') _ -> return False @@ -130,7 +133,7 @@ instance Unquote a => Unquote (Arg a) where unquote t = do t <- reduce t- case t of+ case ignoreSharing t of Con c [hid,rel,x] -> do choice [(c `isCon` primArgArg, Arg <$> unquoteN hid <*> unquoteN rel <*> unquoteN x)]@@ -140,14 +143,14 @@ instance Unquote Integer where unquote t = do t <- reduce t- case t of+ case ignoreSharing t of Lit (LitInt _ n) -> return n _ -> unquoteFailed "Integer" "not a literal integer" t instance Unquote a => Unquote [a] where unquote t = do t <- reduce t- case t of+ case ignoreSharing t of Con c [x,xs] -> do choice [(c `isCon` primCons, (:) <$> unquoteN x <*> unquoteN xs)]@@ -161,30 +164,34 @@ instance Unquote Hiding where unquote t = do t <- reduce t- case t of+ let err = unquoteFailed "Hiding" "neither `hidden' nor `visible'" t+ case ignoreSharing t of Con c [] -> do choice [(c `isCon` primHidden, return Hidden) ,(c `isCon` primInstance, return Instance) ,(c `isCon` primVisible, return NotHidden)]- (unquoteFailed "Hiding" "neither `hidden' nor `visible'" t)- _ -> unquoteFailed "Hiding" "arity is not 0" t+ err+ Con c vs -> unquoteFailed "Hiding" "the value is a constructor, but its arity is not 0" t+ _ -> err instance Unquote Relevance where unquote t = do t <- reduce t- case t of+ let err = unquoteFailed "Relevance" "neither `relevant' or `irrelevant'" t+ case ignoreSharing t of Con c [] -> do choice [(c `isCon` primRelevant, return Relevant) ,(c `isCon` primIrrelevant, return Irrelevant)]- (unquoteFailed "Relevance" "neither `relevant' or `irrelevant'" t)- _ -> unquoteFailed "Relevance" "arity is not 0" t+ err+ Con c vs -> unquoteFailed "Relevance" "the value is a constructor, but its arity is not 0" t+ _ -> err instance Unquote QName where unquote t = do t <- reduce t- case t of+ case ignoreSharing t of Lit (LitQName _ x) -> return x _ -> unquoteFailed "QName" "not a literal qname value" t @@ -195,7 +202,7 @@ instance Unquote Sort where unquote t = do t <- reduce t- case t of+ case ignoreSharing t of Con c [] -> do choice [(c `isCon` primAgdaSortUnsupported, unquoteFailed "Sort" "unsupported sort" t)]@@ -213,7 +220,7 @@ instance Unquote Type where unquote t = do t <- reduce t- case t of+ case ignoreSharing t of Con c [s, u] -> do choice [(c `isCon` primAgdaTypeEl, El <$> unquoteN s <*> unquoteN u)]@@ -223,7 +230,7 @@ instance Unquote Term where unquote t = do t <- reduce t- case t of+ case ignoreSharing t of Con c [] -> choice [(c `isCon` primAgdaTermUnsupported, unquoteFailed "Term" "unsupported term" t)]@@ -236,11 +243,11 @@ Con c [x,y] -> choice- [(c `isCon` primAgdaTermVar, Var <$> unquoteN x <*> unquoteN y)+ [(c `isCon` primAgdaTermVar, Var <$> (fromInteger <$> unquoteN x) <*> unquoteN y) ,(c `isCon` primAgdaTermCon, Con <$> unquoteN x <*> unquoteN y) ,(c `isCon` primAgdaTermDef, Def <$> unquoteN x <*> unquoteN y) ,(c `isCon` primAgdaTermLam, Lam <$> unquoteN x <*> unquoteN y)- ,(c `isCon` primAgdaTermPi, Pi <$> unquoteN x <*> unquoteN y)]+ ,(c `isCon` primAgdaTermPi, Pi <$> (domFromArg <$> unquoteN x) <*> unquoteN y)] (unquoteFailed "Term" "arity 2 and none of Var, Con, Def, Lam, Pi" t) Con{} -> unquoteFailed "Term" "neither arity 0 nor 1 nor 2" t
src/full/Agda/TypeChecking/RecordPatterns.hs view
@@ -1,10 +1,13 @@-{-# LANGUAGE CPP, GeneralizedNewtypeDeriving #-}+{-# LANGUAGE CPP, PatternGuards, TupleSections, FlexibleInstances, GeneralizedNewtypeDeriving #-} -- | Code which replaces pattern matching on record constructors with -- uses of projection functions. module Agda.TypeChecking.RecordPatterns ( translateRecordPatterns+ , translateCompiledClauses+ , translateSplitTree+ , recordPatternToProjections ) where import Control.Applicative@@ -12,23 +15,365 @@ import Control.Monad.Fix import Control.Monad.Reader import Control.Monad.State+ import Data.List+import Data.Map (Map)+import qualified Data.Map as Map+import qualified Data.Traversable as Trav import Agda.Syntax.Common import Agda.Syntax.Internal++import Agda.TypeChecking.CompiledClause+import Agda.TypeChecking.Coverage.SplitTree+import Agda.TypeChecking.Datatypes+import Agda.TypeChecking.Errors import Agda.TypeChecking.Monad import Agda.TypeChecking.Pretty+import Agda.TypeChecking.Records import Agda.TypeChecking.Reduce import Agda.TypeChecking.Substitute import Agda.TypeChecking.Telescope+ import Agda.Utils.Either import Agda.Utils.List+import qualified Agda.Utils.Map as Map+import Agda.Utils.Maybe import Agda.Utils.Permutation import Agda.Utils.Size #include "../undefined.h" import Agda.Utils.Impossible +---------------------------------------------------------------------------+-- * Record pattern translation for let bindings+---------------------------------------------------------------------------++-- | Take a record pattern @p@ and yield a list of projections+-- corresponding to the pattern variables, from left to right.+--+-- E.g. for @(x , (y , z))@ we return @[ fst, fst . snd, snd . snd ]@.+--+-- If it is not a record pattern, error 'ShouldBeRecordPattern' is raised.+recordPatternToProjections :: Pattern -> TCM [Term -> Term]+recordPatternToProjections p =+ case p of+ VarP{} -> return [ \ x -> x ]+ LitP{} -> typeError $ ShouldBeRecordPattern p+ DotP{} -> typeError $ ShouldBeRecordPattern p+ ConP c Nothing ps -> typeError $ ShouldBeRecordPattern p+ ConP c (Just t) ps -> do+ t <- reduce t+ fields <- getRecordTypeFields (unArg t)+ concat <$> zipWithM comb (map proj fields) (map unArg ps)+ where+ proj p = \ x -> Def (unArg p) [defaultArg x]+ comb :: (Term -> Term) -> Pattern -> TCM [Term -> Term]+ comb prj p = map (prj .) <$> recordPatternToProjections p+++---------------------------------------------------------------------------+-- * Record pattern translation for compiled clauses+---------------------------------------------------------------------------++-- | Take a matrix of booleans (at least one row!) and summarize the columns+-- using conjunction.+conjColumns :: [[Bool]] -> [Bool]+conjColumns = foldl1 (zipWith (&&))++-- | @insertColumn i a m@ inserts a column before the @i@th column in+-- matrix @m@ and fills it with value @a@.+insertColumn :: Int -> a -> [[a]] -> [[a]]+insertColumn i a rows = map ins rows where+ ins row = let (init, last) = splitAt i row in init ++ a : last++{- UNUSED+-- | @cutColumn i m@ removes the @i@th column from matrix @m@.+cutColumn :: Int -> [[a]] -> [[a]]+cutColumn i rows = map cut rows where+ cut row = let (init, _:last) = splitAt i row in init ++ last++-- | @cutColumns i n xss = (yss, xss')@ cuts out a submatrix @yss@+-- of width @n@ from @xss@, starting at column @i@.+cutColumns :: Int -> Int -> [[a]] -> ([[a]], [[a]])+cutColumns i n rows = unzip (map (cutSublist i n) rows)+-}++-- | @cutSublist i n xs = (xs', ys, xs'')@ cuts out a sublist @ys@+-- of width @n@ from @xs@, starting at column @i@.+cutSublist :: Int -> Int -> [a] -> ([a], [a], [a])+cutSublist i n row =+ let (init, rest) = splitAt i row+ (mid , last) = splitAt n rest+ in (init, mid, last)+++translateCompiledClauses :: CompiledClauses -> TCM CompiledClauses+translateCompiledClauses cc = snd <$> loop cc+ where++ loop :: CompiledClauses -> TCM ([Bool], CompiledClauses)+ loop cc = case cc of+ Fail -> return (repeat True, cc)+ Done xs t -> return (map (const True) xs, cc)+ Case i cs -> loops i cs++ loops :: Int -- split variable+ -> Case CompiledClauses -- original split tree+ -> TCM ([Bool], CompiledClauses)+ loops i cs@(Branches { conBranches = conMap+ , litBranches = litMap+ , catchAllBranch = catchAll }) = do++ -- recurse on and compute variable status of catch-all clause+ (xssa, catchAll) <- unzipMaybe <$> Trav.mapM loop catchAll+ let xsa = maybe (repeat True) id xssa++ -- recurse on compute variable status of literal clauses+ (xssl, litMap) <- Map.unzip <$> Trav.mapM loop litMap+ let xsl = conjColumns (xsa : insertColumn i False (Map.elems xssl))++ -- recurse on constructor clauses+ (ccs, xssc, conMap) <- Map.unzip3 <$> do+ Trav.forM (Map.mapWithKey (,) conMap) $ \ (c, WithArity ar cc) -> do+ (xs, cc) <- loop cc+ dataOrRecCon <- getConstructorArity c+ let (isRC, n) = either (False,) ((True,) . size) dataOrRecCon+ (xs0, rest) = genericSplitAt i xs+ (xs1, xs2 ) = genericSplitAt n rest+ -- if all dropped variables are virgins and we are record cons.+ -- then new variable x is also virgin+ -- and we can translate away the split+ x = isRC && and xs1+ -- xs' = updated variables+ xs' = xs0 ++ x : xs2+ -- get the record fields+ fs = either __IMPOSSIBLE__ id dataOrRecCon+ -- if x we can translate+ mcc = if x then [replaceByProjections i (map unArg fs) cc] else []++ when (n /= ar) __IMPOSSIBLE__+ return (mcc, xs', WithArity ar cc)++ -- compute result+ let xs = conjColumns (xsl : Map.elems xssc)+ case concat $ Map.elems ccs of+ -- case: no record pattern was translated+ [] -> return (xs, Case i $ Branches+ { conBranches = conMap+ , litBranches = litMap+ , catchAllBranch = catchAll })++ -- case: translated away one record pattern+ [cc] -> return (xs, cc)++ -- case: more than one record patterns (impossible)+ _ -> __IMPOSSIBLE__++-- | @replaceByProjections i projs cc@ replaces variables @i..i+n-1@+-- (counted from left) by projections @projs_1 i .. projs_n i@.+--+-- If @n==0@, we matched on a zero-field record, which means that+-- we are actually introduce a new variable, increasing split+-- positions greater or equal to @i@ by one.+-- Otherwise, we have to lower+--+replaceByProjections :: Int -> [QName] -> CompiledClauses -> CompiledClauses+replaceByProjections i projs cc =+ let n = length projs++ loop :: Int -> CompiledClauses -> CompiledClauses+ loop i cc = case cc of+ Case j cs++ -- if j < i, we leave j untouched, but we increase i by the number+ -- of variables replacing j in the branches+ | j < i -> Case j $ loops i cs++ -- if j >= i then we shrink j by (n-1)+ | otherwise -> Case (j - (n-1)) $ fmap (loop i) cs++ Done xs v ->+ -- we have to delete (n-1) variables from xs+ -- and instantiate v suitably with the projections+ let (xs0,xs1,xs2) = cutSublist i n xs+ names | null xs1 = ["r"]+ | otherwise = map unArg xs1+ x = defaultArg $ foldr1 (++) names+ xs' = xs0 ++ x : xs2+ us = map (\ p -> Def p [defaultArg $ var 0]) (reverse projs)+ -- go from level (i + n - 1) to index (subtract from |xs|-1)+ index = length xs - (i + n)+ in Done xs' $ applySubst (liftS (length xs2) $ us ++# raiseS 1) v+ -- The body is NOT guarded by lambdas!+ -- WRONG: underLambdas i (flip apply) (map defaultArg us) v++ Fail -> Fail++ loops :: Int -> Case CompiledClauses -> Case CompiledClauses+ loops i Branches{ conBranches = conMap+ , litBranches = litMap+ , catchAllBranch = catchAll } =+ Branches{ conBranches = fmap (\ (WithArity n c) -> WithArity n $ loop (i + n - 1) c) conMap+ , litBranches = fmap (loop (i - 1)) litMap+ , catchAllBranch = fmap (loop i) catchAll+ }+ in loop i cc++-- | Check if a split is on a record constructor, and return the projections+-- if yes.+isRecordCase :: Case c -> TCM (Maybe ([QName], c))+isRecordCase (Branches { conBranches = conMap+ , litBranches = litMap+ , catchAllBranch = Nothing })+ | Map.null litMap+ , [(con, WithArity _ br)] <- Map.toList conMap = do+ isRC <- isRecordConstructor con+ case isRC of+ Just (r, Record { recFields = fs }) -> return $ Just (map unArg fs, br)+ Just (r, _) -> __IMPOSSIBLE__+ Nothing -> return Nothing+isRecordCase _ = return Nothing++---------------------------------------------------------------------------+-- * Record pattern translation for split trees+---------------------------------------------------------------------------++-- | Split tree annotation.+data RecordSplitNode = RecordSplitNode+ { splitCon :: QName -- ^ Constructor name for this branch.+ , splitArity :: Int -- ^ Arity of the constructor.+ , splitRecordPattern :: Bool -- ^ Should we translate this split away?+ }++-- | Split tree annotated for record pattern translation.+type RecordSplitTree = SplitTree' RecordSplitNode+type RecordSplitTrees = SplitTrees' RecordSplitNode++++-- | Bottom-up procedure to annotate split tree.+recordSplitTree :: SplitTree -> TCM RecordSplitTree+recordSplitTree t = snd <$> loop t+ where++ loop :: SplitTree -> TCM ([Bool], RecordSplitTree)+ loop t = case t of+ SplittingDone n -> return (replicate n True, SplittingDone n)+ SplitAt i ts -> do+ (xs, ts) <- loops i ts+ return (xs, SplitAt i ts)++ loops :: Int -> SplitTrees -> TCM ([Bool], RecordSplitTrees)+ loops i ts = do+ (xss, ts) <- unzip <$> do+ forM ts $ \ (c, t) -> do+ (xs, t) <- loop t+ (isRC, n) <- either (False,) ((True,) . size) <$> getConstructorArity c+ let (xs0, rest) = genericSplitAt i xs+ (xs1, xs2) = genericSplitAt n rest+ x = isRC && and xs1+ xs' = xs0 ++ x : xs2+ return (xs, (RecordSplitNode c n x, t))+ return (foldl1 (zipWith (&&)) xss, ts)++-- | Bottom-up procedure to record-pattern-translate split tree.+translateSplitTree :: SplitTree -> TCM SplitTree+translateSplitTree t = snd <$> loop t+ where++ -- @loop t = return (xs, t')@ returns the translated split tree @t'@+ -- plus the status @xs@ of the clause variables+ -- True = variable will never be split on in @t'@ (virgin variable)+ -- False = variable will be spilt on in @t'@+ loop :: SplitTree -> TCM ([Bool], SplitTree)+ loop t = case t of+ SplittingDone n ->+ -- start with n virgin variables+ return (replicate n True, SplittingDone n)+ SplitAt i ts -> do+ (x, xs, ts) <- loops i ts+ -- if we case on record constructor, drop case+ let t' = if x then+ case ts of+ [(c,t)] -> t+ _ -> __IMPOSSIBLE__+ -- else retain case+ else SplitAt i ts+ return (xs, t')++ -- @loops i ts = return (x, xs, ts')@ cf. @loop@+ -- @x@ says wether at arg @i@ we have a record pattern split+ -- that can be removed+ loops :: Int -> SplitTrees -> TCM (Bool, [Bool], SplitTrees)+ loops i ts = do+ -- note: ts not empty+ (rs, xss, ts) <- unzip3 <$> do+ forM ts $ \ (c, t) -> do+ (xs, t) <- loop t+ (isRC, n) <- either (False,) ((True,) . size) <$> getConstructorArity c+ -- now drop variables from i to i+n-1+ let (xs0, rest) = genericSplitAt i xs+ (xs1, xs2) = genericSplitAt n rest+ -- if all dropped variables are virgins and we are record cons.+ -- then new variable x is also virgin+ -- and we can translate away the split+ x = isRC && and xs1+ -- xs' = updated variables+ xs' = xs0 ++ x : xs2+ -- delete splits from t if record match+ t' = if x then dropFrom i (n - 1) t else t+ return (x, xs', (c, t'))+ -- x = did we split on a record constructor?+ let x = and rs+ -- invariant: if record constructor, then exactly one constructor+ if x then unless (rs == [True]) __IMPOSSIBLE__+ -- else no record constructor+ else unless (or rs == False) __IMPOSSIBLE__+ return (x, conjColumns xss, ts)++-- | @dropFrom i n@ drops arguments @j@ with @j < i + n@ and @j >= i@.+-- NOTE: @n@ can be negative, in which case arguments are inserted.+class DropFrom a where+ dropFrom :: Int -> Int -> a -> a++instance DropFrom (SplitTree' c) where+ dropFrom i n t = case t of+ SplittingDone m -> SplittingDone (m - n)+ SplitAt j ts+ | j >= i + n -> SplitAt (j - n) $ dropFrom i n ts+ | j < i -> SplitAt j $ dropFrom i n ts+ | otherwise -> __IMPOSSIBLE__++instance DropFrom (c, SplitTree' c) where+ dropFrom i n (c, t) = (c, dropFrom i n t)++instance DropFrom a => DropFrom [a] where+ dropFrom i n ts = map (dropFrom i n) ts++{-+-- | Check if a split is on a record constructor, and return the projections+-- if yes.+isRecordSplit :: SplitTrees -> TCM (Maybe ([QName], c))+isRecordSplit (Branches { conBranches = conMap+ , litBranches = litMap+ , catchAllBranch = Nothing })+ | Map.null litBranches+ , [(con,br)] <- Map.toList conMap = do+ isRC <- isRecordConstructor con+ case isRC of+ Just (r, Record { recFields = fs }) -> return $ Just (map unArg fs, br)+ Just (r, _) -> __IMPOSSIBLE__+ Nothing -> return Nothing+isRecordSplit _ = return Nothing++-}+++---------------------------------------------------------------------------+-- * Record pattern translation for function definitions+---------------------------------------------------------------------------+ -- | Replaces pattern matching on record constructors with uses of -- projection functions. Does not remove record constructor patterns -- which have sub-patterns containing non-record constructor or@@ -60,19 +405,19 @@ noNewPatternVars = size cs s' = reverse s- rest = [ Var i [] | i <- [noNewPatternVars..] ]+ mkSub s = s ++# raiseS noNewPatternVars -- Substitution used to convert terms in the old RHS's -- context to terms in the new RHS's context.- rhsSubst = s' ++ rest+ rhsSubst = mkSub s' -- Substitution used to convert terms in the old telescope's -- context to terms in the new RHS's context.- rhsSubst' = permute (reverseP $ clausePerm clause) s' ++ rest+ rhsSubst' = mkSub $ permute (reverseP $ clausePerm clause) s' -- TODO: Is it OK to replace the definition above with the -- following one? --- -- rhsSubst' = permute (clausePerm clause) s ++ rest+ -- rhsSubst' = mkSub $ permute (clausePerm clause) s -- The old telescope, flattened and in textual left-to-right -- order (i.e. the type signature for the variable which occurs@@ -87,7 +432,7 @@ -- of the new RHS, in textual left-to-right order, and with -- Nothing in place of dot patterns. newTel' =- map (fmap (id *** substs rhsSubst')) $+ map (fmap (id *** applySubst rhsSubst')) $ translateTel cs $ flattenedOldTel @@ -98,7 +443,7 @@ where -- It is important that dummy does not mention any variable -- (see the definition of reorderTel).- dummy = defaultArg (El Prop (Sort Prop))+ dummy = dummyDom -- defaultArg (El Prop (Sort Prop)) isDotP n = case genericIndex cs n of Left DotP{} -> True@@ -113,25 +458,25 @@ -- Substitution used to convert terms in the old telescope's -- context to terms in the new telescope's context.- lhsSubst = map (substs lhsSubst') rhsSubst'+ lhsSubst = applySubst lhsSubst' rhsSubst' -- The new telescope. newTel = uncurry unflattenTel . unzip $ map (maybe __IMPOSSIBLE__ id) $ permute newPerm $- map (fmap (id *** substs lhsSubst')) $+ map (fmap (id *** applySubst lhsSubst')) $ newTel' -- New clause. c = clause { clauseTel = newTel , clausePerm = newPerm- , clausePats = substs lhsSubst ps+ , clausePats = applySubst lhsSubst ps , clauseBody = translateBody cs rhsSubst $ clauseBody clause } - reportSDoc "tc.lhs.top" 10 $+ reportSDoc "tc.lhs.recpat" 10 $ escapeContext (size $ clauseTel clause) $ vcat [ text "Translated clause:" , nest 2 $ vcat@@ -194,7 +539,7 @@ -- patterns, should be removed, and a new variable, with the name @x@, -- inserted instead. The type of the new variable is @t@. -type Changes = [Either Pattern (Kind -> Nat, String, Arg Type)]+type Changes = [Either Pattern (Kind -> Nat, String, Dom Type)] -- | Record pattern trees. @@ -229,7 +574,7 @@ -- | Converts a record tree to a single pattern along with information -- about the deleted pattern variables. -removeTree :: RecordTree -> RecPatM (Pattern, Substitution, Changes)+removeTree :: RecordTree -> RecPatM (Pattern, [Term], Changes) removeTree tree = do (pat, x) <- nextVar let ps = projections tree@@ -239,7 +584,7 @@ return $ case tree of Leaf p -> (p, s, [Left p])- RecCon t _ -> (pat, s, [Right (count, "r", t)])+ RecCon t _ -> (pat, s, [Right (count, "r", domFromArg t)]) ------------------------------------------------------------------------ -- Translation of patterns@@ -267,7 +612,7 @@ -- -- This function assumes that literals are never of record type. -translatePattern :: Pattern -> RecPatM (Pattern, Substitution, Changes)+translatePattern :: Pattern -> RecPatM (Pattern, [Term], Changes) translatePattern (ConP c Nothing ps) = do (ps, s, cs) <- translatePatterns ps return (ConP c Nothing ps, s, cs)@@ -283,7 +628,7 @@ -- | 'translatePattern' lifted to lists of arguments. translatePatterns ::- [Arg Pattern] -> RecPatM ([Arg Pattern], Substitution, Changes)+ [Arg Pattern] -> RecPatM ([Arg Pattern], [Term], Changes) translatePatterns ps = do (ps', ss, cs) <- unzip3 <$> mapM (translatePattern . unArg) ps return (ps' `withArgsFrom` ps, concat ss, concat cs)@@ -304,7 +649,7 @@ recordTree :: Pattern ->- RecPatM (Either (RecPatM (Pattern, Substitution, Changes)) RecordTree)+ RecPatM (Either (RecPatM (Pattern, [Term], Changes)) RecordTree) recordTree p@(ConP _ Nothing _) = return $ Left $ translatePattern p recordTree (ConP c (Just t) ps) = do rs <- mapM (recordTree . unArg) ps@@ -316,15 +661,9 @@ concat ss, concat cs) Right ts -> liftTCM $ do t <- reduce t- case t of- Arg { unArg = El _ (Def r _) } -> do- rDef <- theDef <$> getConstInfo r- case rDef of- Record { recFields = fields } -> do- let proj p = \t -> Def (unArg p) [defaultArg t]- return $ Right $ RecCon t $ zip (map proj fields) ts- _ -> __IMPOSSIBLE__- _ -> __IMPOSSIBLE__+ fields <- getRecordTypeFields (unArg t)+ let proj p = \x -> Def (unArg p) [defaultArg x]+ return $ Right $ RecCon t $ zip (map proj fields) ts recordTree p@VarP{} = return (Right (Leaf p)) recordTree p@DotP{} = return (Right (Leaf p)) recordTree p@LitP{} = return $ Left $ translatePattern p@@ -338,10 +677,10 @@ :: Changes -- ^ Explanation of how the telescope should be changed. Types -- should be in the context of the old telescope.- -> [(String, Arg Type)]+ -> [(String, Dom Type)] -- ^ Old telescope, flattened, in textual left-to-right -- order.- -> [Maybe (String, Arg Type)]+ -> [Maybe (String, Dom Type)] -- ^ New telescope, flattened, in textual left-to-right order. -- 'Nothing' is used to indicate the locations of dot patterns. translateTel (Left (DotP{}) : rest) tel = Nothing : translateTel rest tel@@ -362,7 +701,7 @@ Bind $ Abs x $ translateBody rest s $ dropBinds n' b where n' = sum $ map n [VarPat, DotPat] translateBody (Left _ : rest) s (Bind b) = Bind $ fmap (translateBody rest s) b-translateBody [] s (Body t) = Body $ substs s t+translateBody [] s (Body t) = Body $ applySubst s t translateBody _ _ _ = __IMPOSSIBLE__ ------------------------------------------------------------------------@@ -372,11 +711,11 @@ permToSubst :: Permutation -> Substitution permToSubst (Perm n is) =- [ makeVar i | i <- [0..n-1] ] ++ [ Var i [] | i <- [size is..] ]+ [ makeVar i | i <- [0..n - 1] ] ++# raiseS (size is) where makeVar i = case genericElemIndex i is of Nothing -> __IMPOSSIBLE__- Just k -> Var k []+ Just k -> var k -- | @dropBinds n b@ drops the initial @n@ occurrences of 'Bind' from @b@. --
src/full/Agda/TypeChecking/Records.hs view
@@ -1,4 +1,4 @@-{-# LANGUAGE CPP #-}+{-# LANGUAGE CPP, TupleSections #-} module Agda.TypeChecking.Records where @@ -21,8 +21,11 @@ import Agda.TypeChecking.Reduce import Agda.TypeChecking.Telescope import Agda.TypeChecking.Datatypes+import Agda.Utils.Either import Agda.Utils.List+import Agda.Utils.Maybe import Agda.Utils.Monad+import qualified Agda.Utils.HashMap as HMap #include "../undefined.h" import Agda.Utils.Impossible@@ -71,12 +74,12 @@ -- | Find all records with at least the given fields. findPossibleRecords :: [C.Name] -> TCM [QName] findPossibleRecords fields = do- defs <- (Map.union `on` sigDefinitions) <$> getSignature <*> getImportedSignature+ defs <- (HMap.union `on` sigDefinitions) <$> getSignature <*> getImportedSignature let possible def = case theDef def of Record{ recFields = fs } -> Set.isSubsetOf given inrecord where inrecord = Set.fromList $ map (nameConcrete . qnameName . unArg) fs _ -> False- return [ defName d | d <- Map.elems defs, possible d ]+ return [ defName d | d <- HMap.elems defs, possible d ] where given = Set.fromList fields @@ -84,6 +87,18 @@ getRecordFieldTypes :: QName -> TCM Telescope getRecordFieldTypes r = recTel <$> getRecordDef r +-- | Get the field names belonging to a record type.+getRecordTypeFields :: Type -> TCM [Arg QName]+getRecordTypeFields t =+ case ignoreSharing $ unEl t of+ Def r _ -> do+ rDef <- theDef <$> getConstInfo r+ case rDef of+ Record { recFields = fields } -> return fields+ _ -> __IMPOSSIBLE__+ _ -> __IMPOSSIBLE__++ -- | Get the type of the record constructor. getRecordConstructorType :: QName -> TCM Type getRecordConstructorType r = recConType <$> getRecordDef r@@ -94,33 +109,36 @@ getRecordConstructor r = killRange <$> recCon <$> getRecordDef r -- | Check if a name refers to a record.-isRecord :: QName -> TCM Bool+-- If yes, return record definition.+isRecord :: QName -> TCM (Maybe Defn) isRecord r = do def <- theDef <$> getConstInfo r return $ case def of- Record{} -> True- _ -> False+ Record{} -> Just def+ _ -> Nothing -- | Check if a name refers to an eta expandable record. isEtaRecord :: QName -> TCM Bool-isEtaRecord r = do- def <- theDef <$> getConstInfo r- return $ case def of- Record{recEtaEquality = eta} -> eta- _ -> False+isEtaRecord r = maybe False recEtaEquality <$> isRecord r +-- | Check if a name refers to a record which is not coinductive. (Projections are then size-preserving)+isInductiveRecord :: QName -> TCM Bool+isInductiveRecord r = maybe False (\ d -> recInduction d == Inductive || not (recRecursive d)) <$> isRecord r+ -- | Check if a type is an eta expandable record and return the record identifier and the parameters. isEtaRecordType :: Type -> TCM (Maybe (QName, Args))-isEtaRecordType (El _ (Def d ps)) = ifM (isEtaRecord d) (return $ Just (d, ps)) (return Nothing)-isEtaRecordType _ = return Nothing+isEtaRecordType a = case ignoreSharing $ unEl a of+ Def d ps -> ifM (isEtaRecord d) (return $ Just (d, ps)) (return Nothing)+ _ -> return Nothing -- | Check if a name refers to a record constructor.-isRecordConstructor :: QName -> TCM Bool+-- If yes, return record definition.+isRecordConstructor :: QName -> TCM (Maybe (QName, Defn)) isRecordConstructor c = do def <- theDef <$> getConstInfo c case def of- Constructor{ conData = r } -> isRecord r- _ -> return False+ Constructor{ conData = r } -> fmap (r,) <$> isRecord r+ _ -> return Nothing -- | Check if a constructor name is the internally generated record constructor. isGeneratedRecordConstructor :: QName -> TCM Bool@@ -134,6 +152,20 @@ _ -> return False _ -> return False +-- | Mark record type as unguarded.+-- No eta-expansion. Projections do not preserve guardedness.+unguardedRecord :: QName -> TCM ()+unguardedRecord q = modifySignature $ updateDefinition q $ updateTheDef $ updateRecord+ where updateRecord r@Record{} = r { recEtaEquality = False, recRecursive = True }+ updateRecord _ = __IMPOSSIBLE__++-- | Mark record type as recursive.+-- Projections do not preserve guardedness.+recursiveRecord :: QName -> TCM ()+recursiveRecord q = modifySignature $ updateDefinition q $ updateTheDef $ updateRecord+ where updateRecord r@Record{} = r { recRecursive = True }+ updateRecord _ = __IMPOSSIBLE__+ {-| Compute the eta expansion of a record. The first argument should be the name of a record type. Given @@ -143,50 +175,48 @@ -} etaExpandRecord :: QName -> Args -> Term -> TCM (Telescope, Args) etaExpandRecord r pars u = do- Record{ recFields = xs, recTel = tel } <- getRecordDef r+ Record{ recFields = xs, recTel = tel, recEtaEquality = eta } <- getRecordDef r+ unless eta __IMPOSSIBLE__ -- make sure we do not expand non-eta records let tel' = apply tel pars- case u of+ case ignoreSharing u of Con _ args -> return (tel', args) -- Already expanded. _ -> do- -- irrelevant fields are expanded to DontCare- -- this is sound because etaExpandRecord is only called during conversion- -- WARNING: do not use etaExpandRecord to expand MetaVars!!- let proj (Arg h Irrelevant x) = Arg h Irrelevant $ DontCare (Def x [defaultArg u])- proj (Arg h rel x) = Arg h rel $- Def x [defaultArg u]+ let xs' = map (fmap (\ x -> Def x [defaultArg u])) xs reportSDoc "tc.record.eta" 20 $ vcat [ text "eta expanding" <+> prettyTCM u <+> text ":" <+> prettyTCM r , nest 2 $ vcat [ text "tel' =" <+> prettyTCM tel'- , text "args =" <+> prettyTCM (map proj xs)+ , text "args =" <+> prettyTCM xs' ] ]- return (tel', map proj xs)- where- hide a = a { argHiding = Hidden }+ return (tel', xs') -- | The fields should be eta contracted already.+--+-- We can eta constract if all fields @f = ...@ are irrelevant+-- or the corresponding projection @f = f v@ of the same value @v@,+-- but we need at least one relevant field to find the value @v@. etaContractRecord :: QName -> QName -> Args -> TCM Term etaContractRecord r c args = do Record{ recPars = npars, recFields = xs } <- getRecordDef r- let check a ax = do+ let check :: Arg Term -> Arg QName -> Maybe (Maybe Term)+ check a ax = do -- @a@ is the constructor argument, @ax@ the corr. record field name -- skip irrelevant record fields by returning DontCare- case (argRelevance a, unArg a) of- (Irrelevant, v) -> return $ Just $ DontCare __IMPOSSIBLE__ -- thrown out later+ case (argRelevance a, ignoreSharing $ unArg a) of+ (Irrelevant, _) -> Just Nothing -- if @a@ is the record field name applied to a single argument -- then it passes the check- (_, Def y [arg]) | unArg ax == y- -> return (Just $ unArg arg)- _ -> return Nothing+ (_, Def f [arg]) | unArg ax == f+ -> Just $ Just $ unArg arg+ _ -> Nothing fallBack = return (Con c args) case compare (length args) (length xs) of LT -> fallBack -- Not fully applied GT -> __IMPOSSIBLE__ -- Too many arguments. Impossible. EQ -> do- as <- zipWithM check args xs- case sequence as of- Just as -> case filter notDontCare as of+ case zipWithM check args xs of+ Just as -> case [ a | Just a <- as ] of (a:as) -> if all (a ==) as then do@@ -196,41 +226,66 @@ ] return a else fallBack- _ -> fallBack -- just DontCares+ _ -> fallBack -- just irrelevant terms _ -> fallBack -- a Nothing- where notDontCare (DontCare _) = False- notDontCare _ = True -- | Is the type a hereditarily singleton record type? May return a -- blocking metavariable. -- -- Precondition: The name should refer to a record type, and the -- arguments should be the parameters to the type.- isSingletonRecord :: QName -> Args -> TCM (Either MetaId Bool)-isSingletonRecord = isSingletonRecord' False+isSingletonRecord r ps = mapRight isJust <$> isSingletonRecord' False r ps isSingletonRecordModuloRelevance :: QName -> Args -> TCM (Either MetaId Bool)-isSingletonRecordModuloRelevance = isSingletonRecord' True+isSingletonRecordModuloRelevance r ps = mapRight isJust <$> isSingletonRecord' True r ps -isSingletonRecord' :: Bool -> QName -> Args -> TCM (Either MetaId Bool)-isSingletonRecord' regardIrrelevance r ps =- check =<< ((`apply` ps) <$> getRecordFieldTypes r)+-- | Return the unique (closed) inhabitant if exists.+-- In case of counting irrelevance in, the returned inhabitant+-- contains garbage.+isSingletonRecord' :: Bool -> QName -> Args -> TCM (Either MetaId (Maybe Term))+isSingletonRecord' regardIrrelevance r ps = do+ def <- getRecordDef r+ emap (Con $ recCon def) <$> check (recTel def `apply` ps) where- check EmptyTel = return (Right True)- check (ExtendTel arg tel) | regardIrrelevance && argRelevance arg == Irrelevant =- underAbstraction arg tel check- check (ExtendTel arg tel) = do- TelV _ t <- telView $ unArg arg+ check :: Telescope -> TCM (Either MetaId (Maybe [Arg Term]))+ check EmptyTel = return $ Right $ Just []+ check (ExtendTel arg@(Dom h Irrelevant _) tel) | regardIrrelevance =+ underAbstraction arg tel $ \ tel ->+ emap (Arg h Irrelevant garbage :) <$> check tel+ check (ExtendTel arg@(Dom h r t) tel) = do+ isSing <- isSingletonType' regardIrrelevance t+ case isSing of+ Left mid -> return $ Left mid+ Right Nothing -> return $ Right Nothing+ Right (Just v) -> underAbstraction arg tel $ \ tel ->+ emap (Arg h r v :) <$> check tel+ garbage :: Term+ garbage = Sort Prop++-- | Check whether a type has a unique inhabitant and return it.+-- Can be blocked by a metavar.+isSingletonType :: Type -> TCM (Either MetaId (Maybe Term))+isSingletonType = isSingletonType' False++-- | Check whether a type has a unique inhabitant (irrelevant parts ignored).+-- Can be blocked by a metavar.+isSingletonTypeModuloRelevance :: (MonadTCM tcm) => Type -> tcm (Either MetaId Bool)+isSingletonTypeModuloRelevance t = liftTCM $ do+ mapRight isJust <$> isSingletonType' True t++isSingletonType' :: Bool -> Type -> TCM (Either MetaId (Maybe Term))+isSingletonType' regardIrrelevance t = do+ TelV tel t <- telView t t <- reduceB $ unEl t- case t of+ case ignoreSharing <$> t of Blocked m _ -> return (Left m) NotBlocked (MetaV m _) -> return (Left m) NotBlocked (Def r ps) ->- ifM (not <$> isRecord r) (return $ Right False) $ do- isRec <- isSingletonRecord' regardIrrelevance r ps- case isRec of- Left _ -> return isRec- Right False -> return isRec- Right True -> underAbstraction arg tel $ check- _ -> return (Right False)+ ifM (isNothing <$> isRecord r) (return $ Right Nothing) $ do+ emap (abstract tel) <$> isSingletonRecord' regardIrrelevance r ps+ _ -> return (Right Nothing)++-- | Auxiliary function.+emap :: (a -> b) -> Either c (Maybe a) -> Either c (Maybe b)+emap = mapRight . fmap
src/full/Agda/TypeChecking/Records.hs-boot view
@@ -7,7 +7,7 @@ import qualified Agda.Syntax.Concrete.Name as C import Agda.TypeChecking.Monad -isRecord :: QName -> TCM Bool+isRecord :: QName -> TCM (Maybe Defn) isEtaRecord :: QName -> TCM Bool getRecordFieldNames :: QName -> TCM [Arg C.Name] etaContractRecord :: QName -> QName -> Args -> TCM Term
src/full/Agda/TypeChecking/Reduce.hs view
@@ -13,6 +13,7 @@ import Data.Map (Map) import qualified Data.Set as Set import Data.Traversable+import Data.Hashable import Agda.Syntax.Position import Agda.Syntax.Common@@ -34,6 +35,8 @@ import {-# SOURCE #-} Agda.TypeChecking.CompiledClause.Match import Agda.Utils.Monad+import Agda.Utils.HashMap (HashMap)+import qualified Agda.Utils.HashMap as HMap #include "../undefined.h" import Agda.Utils.Impossible@@ -71,6 +74,7 @@ InstS _ -> __IMPOSSIBLE__ instantiate (Level l) = levelTm <$> instantiate l instantiate (Sort s) = sortTm <$> instantiate s+ instantiate v@Shared{} = updateSharedTerm instantiate v instantiate t = return t instance Instantiate Level where@@ -84,7 +88,7 @@ instantiate l = case l of MetaLevel m vs -> do v <- instantiate (MetaV m vs)- case v of+ case ignoreSharing v of MetaV m vs -> return $ MetaLevel m vs _ -> return $ UnreducedLevel v UnreducedLevel l -> UnreducedLevel <$> instantiate l@@ -120,6 +124,9 @@ instance Instantiate t => Instantiate (Arg t) where instantiate = traverse instantiate +instance Instantiate t => Instantiate (Dom t) where+ instantiate = traverse instantiate+ instance Instantiate t => Instantiate [t] where instantiate = traverse instantiate @@ -150,17 +157,33 @@ instantiate (SortCmp cmp a b) = uncurry (SortCmp cmp) <$> instantiate (a,b) instantiate (Guarded c pid) = Guarded <$> instantiate c <*> pure pid instantiate (UnBlock m) = return $ UnBlock m- instantiate (FindInScope m) = return $ FindInScope m- instantiate (IsEmpty t) = IsEmpty <$> instantiate t+ instantiate (FindInScope m args) = FindInScope m <$> mapM instantiate args+ instantiate (IsEmpty r t) = IsEmpty r <$> instantiate t instance (Ord k, Instantiate e) => Instantiate (Map k e) where instantiate = traverse instantiate ------ Reduction to weak head normal form.---+---------------------------------------------------------------------------+-- * Reduction to weak head normal form.+--------------------------------------------------------------------------- +ifBlocked :: MonadTCM tcm => Term -> (MetaId -> Term -> tcm a) -> (Term -> tcm a) -> tcm a+ifBlocked t blocked unblocked = do+ t <- liftTCM $ reduceB t+ case ignoreSharing <$> t of+ Blocked m _ -> blocked m (ignoreBlocking t)+ NotBlocked (MetaV m _) -> blocked m (ignoreBlocking t)+ NotBlocked _ -> unblocked (ignoreBlocking t)++ifBlockedType :: MonadTCM tcm => Type -> (MetaId -> Type -> tcm a) -> (Type -> tcm a) -> tcm a+ifBlockedType t blocked unblocked = do+ t <- liftTCM $ reduceB t+ case ignoreSharing . unEl <$> t of+ Blocked m _ -> blocked m (ignoreBlocking t)+ NotBlocked (MetaV m _) -> blocked m (ignoreBlocking t)+ NotBlocked _ -> unblocked (ignoreBlocking t)+ class Reduce t where reduce :: t -> TCM t reduceB :: t -> TCM (Blocked t)@@ -211,13 +234,14 @@ where fromTm v = do bv <- reduceB v- case bv of- Blocked m v -> return $ Blocked m $ BlockedLevel m v+ let v = ignoreBlocking bv+ case ignoreSharing <$> bv of NotBlocked (MetaV m vs) -> return $ NotBlocked $ MetaLevel m vs- NotBlocked v -> return $ NotBlocked $ NeutralLevel v+ Blocked m _ -> return $ Blocked m $ BlockedLevel m v+ NotBlocked _ -> return $ NotBlocked $ NeutralLevel v -instance (Raise t, Reduce t) => Reduce (Abs t) where+instance (Subst t, Reduce t) => Reduce (Abs t) where reduce b@(Abs x _) = Abs x <$> underAbstraction_ b reduce reduce (NoAbs x v) = NoAbs x <$> reduce v @@ -226,9 +250,15 @@ reduce = traverse reduce instance Reduce t => Reduce (Arg t) where- reduce = traverse reduce+ reduce a@(Arg h Irrelevant t) = return a -- Don't reduce irr. args!?+ reduce a = traverse reduce a+ reduceB t = traverse id <$> traverse reduceB t +instance Reduce t => Reduce (Dom t) where+ reduce = traverse reduce+ reduceB t = traverse id <$> traverse reduceB t+ -- Tuples are never blocked instance (Reduce a, Reduce b) => Reduce (a,b) where reduce (x,y) = (,) <$> reduce x <*> reduce y@@ -240,7 +270,10 @@ reduceB v = {-# SCC "reduce<Term>" #-} do v <- instantiate v case v of- MetaV x args -> notBlocked . MetaV x <$> reduce args+-- Andreas, 2012-11-05 not reducing meta args does not destroy anything+-- and seems to save 2% sec on the standard library+-- MetaV x args -> notBlocked . MetaV x <$> reduce args+ MetaV x args -> return $ notBlocked v Def f args -> unfoldDefinition False reduceB (Def f []) f args Con c args -> do -- Constructors can reduce when they come from an@@ -254,20 +287,22 @@ Var _ _ -> return $ notBlocked v Lam _ _ -> return $ notBlocked v DontCare _ -> return $ notBlocked v+ Shared{} -> updateSharedTermF reduceB v where -- NOTE: reduceNat can traverse the entire term.+ reduceNat v@Shared{} = updateSharedTerm reduceNat v reduceNat v@(Con c []) = do mz <- getBuiltin' builtinZero case v of _ | Just v == mz -> return $ Lit $ LitInt (getRange c) 0 _ -> return v reduceNat v@(Con c [Arg NotHidden Relevant w]) = do- ms <- getBuiltin' builtinSuc+ ms <- fmap ignoreSharing <$> getBuiltin' builtinSuc case v of _ | Just (Con c []) == ms -> inc <$> reduce w _ -> return v where- inc w = case w of+ inc w = case ignoreSharing w of Lit (LitInt r n) -> Lit (LitInt (fuseRange c r) $ n + 1) _ -> Con c [Arg NotHidden Relevant w] reduceNat v = return v@@ -313,7 +348,7 @@ mredToBlocked (MaybeRed NotReduced x) = notBlocked x mredToBlocked (MaybeRed (Reduced b) x) = x <$ b - -- reduceNormal :: Term -> QName -> [MaybeReduced (Arg Term)] -> Delayed -> [Clause] -> Maybe CompiledClauses -> TCM (Blocked Term)+ reduceNormal :: Term -> QName -> [MaybeReduced (Arg Term)] -> Delayed -> [Clause] -> Maybe CompiledClauses -> TCM (Blocked Term) reduceNormal v0 f args delayed def mcc = {-# SCC "reduceNormal" #-} do case def of _ | Delayed <- delayed,@@ -333,61 +368,90 @@ reportSDoc "tc.reduce" 90 $ vcat [ text "*** reduced definition: " <+> prettyTCM f ]- reportSDoc "tc.reduce" 100 $ text " result" <+> prettyTCM v+ reportSDoc "tc.reduce" 100 $ text " result" <+> prettyTCM v $$+ text " raw " <+> text (show v) keepGoing v where defaultResult = return $ notBlocked $ v0 `apply` (map ignoreReduced args) - -- Apply a defined function to it's arguments.- -- The original term is the first argument applied to the third.- appDef :: Term -> CompiledClauses -> MaybeReducedArgs -> TCM (Reduced (Blocked Term) Term)- appDef v cc args = liftTCM $ do- r <- matchCompiled cc args- case r of+-- | Reduce a non-primitive definition if it is a copy linking to another def.+reduceDefCopy :: QName -> Args -> TCM (Reduced () Term)+reduceDefCopy f vs = do+ info <- getConstInfo f+ if (defCopy info) then reduceDef_ info f vs else return $ NoReduction ()++-- | Reduce a non-primitive definition once unless it is delayed.+reduceDef :: QName -> Args -> TCM (Reduced () Term)+reduceDef f vs = do+ info <- getConstInfo f+ reduceDef_ info f vs++reduceDef_ :: Definition -> QName -> Args -> TCM (Reduced () Term)+reduceDef_ info f vs = do+ let v0 = Def f []+ args = map notReduced vs+ cls = (defClauses info)+ mcc = (defCompiled info)+ delayed = (defDelayed info)+ case delayed of+ Delayed -> return $ NoReduction ()+ NotDelayed -> do+ ev <- maybe (appDef' v0 cls args)+ (\cc -> appDef v0 cc args) mcc+ case ev of YesReduction t -> return $ YesReduction t- NoReduction args' -> return $ NoReduction $ fmap (apply v) args'+ NoReduction args' -> return $ NoReduction () - appDef' :: Term -> [Clause] -> MaybeReducedArgs -> TCM (Reduced (Blocked Term) Term)- appDef' _ [] _ = {- ' -} __IMPOSSIBLE__- appDef' v cls@(Clause {clausePats = ps} : _) args- | m < n = return $ NoReduction $ notBlocked $ v `apply` map ignoreReduced args- | otherwise = do- let (args0, args1) = splitAt n args- r <- goCls cls (map ignoreReduced args0)- case r of- YesReduction u -> return $ YesReduction $ u `apply` map ignoreReduced args1- NoReduction v -> return $ NoReduction $ (`apply` map ignoreReduced args1) <$> v- where+-- Apply a defined function to it's arguments.+-- The original term is the first argument applied to the third.+appDef :: Term -> CompiledClauses -> MaybeReducedArgs -> TCM (Reduced (Blocked Term) Term)+appDef v cc args = liftTCM $ do+ r <- matchCompiled cc args+ case r of+ YesReduction t -> return $ YesReduction t+ NoReduction args' -> return $ NoReduction $ fmap (apply v) args' - n = genericLength ps- m = genericLength args+appDef' :: Term -> [Clause] -> MaybeReducedArgs -> TCM (Reduced (Blocked Term) Term)+appDef' _ [] _ = {- ' -} __IMPOSSIBLE__+appDef' v cls@(Clause {clausePats = ps} : _) args+ | m < n = return $ NoReduction $ notBlocked $ v `apply` map ignoreReduced args+ | otherwise = do+ let (args0, args1) = splitAt n args+ r <- goCls cls (map ignoreReduced args0)+ case r of+ YesReduction u -> return $ YesReduction $ u `apply` map ignoreReduced args1+ NoReduction v -> return $ NoReduction $ (`apply` map ignoreReduced args1) <$> v+ where - goCls :: [Clause] -> Args -> TCM (Reduced (Blocked Term) Term)- goCls [] args = typeError $ IncompletePatternMatching v args- goCls (cl@(Clause { clausePats = pats- , clauseBody = body }) : cls) args = do- (m, args) <- matchPatterns pats args- case m of- No -> goCls cls args- DontKnow Nothing -> return $ NoReduction $ notBlocked $ v `apply` args- DontKnow (Just m) -> return $ NoReduction $ blocked m $ v `apply` args- Yes args'- | hasBody body -> return $ YesReduction (- -- TODO: let matchPatterns also return the reduced forms- -- of the original arguments!- app args' body)- | otherwise -> return $ NoReduction $ notBlocked $ v `apply` args+ n = genericLength ps+ m = genericLength args - hasBody (Body _) = True- hasBody NoBody = False- hasBody (Bind b) = hasBody (unAbs b)+ goCls :: [Clause] -> Args -> TCM (Reduced (Blocked Term) Term)+ goCls [] args = typeError $ IncompletePatternMatching v args+ goCls (cl@(Clause { clausePats = pats+ , clauseBody = body }) : cls) args = do+ (m, args) <- matchPatterns pats args+ case m of+ No -> goCls cls args+ DontKnow Nothing -> return $ NoReduction $ notBlocked $ v `apply` args+ DontKnow (Just m) -> return $ NoReduction $ blocked m $ v `apply` args+ Yes args'+ | hasBody body -> return $ YesReduction (+ -- TODO: let matchPatterns also return the reduced forms+ -- of the original arguments!+ app args' body)+ | otherwise -> return $ NoReduction $ notBlocked $ v `apply` args - app [] (Body v') = v'- app (arg : args) (Bind b) = app args $ absApp b arg -- CBN- app _ NoBody = __IMPOSSIBLE__- app (_ : _) (Body _) = __IMPOSSIBLE__- app [] (Bind _) = __IMPOSSIBLE__+ hasBody (Body _) = True+ hasBody NoBody = False+ hasBody (Bind b) = hasBody (unAbs b) + app [] (Body v') = v'+ app (arg : args) (Bind b) = app args $ absApp b arg -- CBN+ app _ NoBody = __IMPOSSIBLE__+ app (_ : _) (Body _) = __IMPOSSIBLE__+ app [] (Bind _) = __IMPOSSIBLE__ + instance Reduce a => Reduce (Closure a) where reduce cl = do x <- enterClosure cl reduce@@ -402,14 +466,14 @@ return $ ValueCmp cmp t u v reduce (ElimCmp cmp t v as bs) = ElimCmp cmp <$> reduce t <*> reduce v <*> reduce as <*> reduce bs- reduce (LevelCmp cmp u v) = uncurry (LevelCmp cmp) <$> reduce (u,v)- reduce (TypeCmp cmp a b) = uncurry (TypeCmp cmp) <$> reduce (a,b)+ reduce (LevelCmp cmp u v) = uncurry (LevelCmp cmp) <$> reduce (u,v)+ reduce (TypeCmp cmp a b) = uncurry (TypeCmp cmp) <$> reduce (a,b) reduce (TelCmp a b cmp tela telb) = uncurry (TelCmp a b cmp) <$> reduce (tela,telb)- reduce (SortCmp cmp a b) = uncurry (SortCmp cmp) <$> reduce (a,b)- reduce (Guarded c pid) = Guarded <$> reduce c <*> pure pid- reduce (UnBlock m) = return $ UnBlock m- reduce (FindInScope m) = return $ FindInScope m- reduce (IsEmpty t) = IsEmpty <$> reduce t+ reduce (SortCmp cmp a b) = uncurry (SortCmp cmp) <$> reduce (a,b)+ reduce (Guarded c pid) = Guarded <$> reduce c <*> pure pid+ reduce (UnBlock m) = return $ UnBlock m+ reduce (FindInScope m cands) = FindInScope m <$> mapM reduce cands+ reduce (IsEmpty r t) = IsEmpty r <$> reduce t instance (Ord k, Reduce e) => Reduce (Map k e) where reduce = traverse reduce@@ -446,6 +510,7 @@ Lam h b -> Lam h <$> normalise b Sort s -> sortTm <$> normalise s Pi a b -> uncurry Pi <$> normalise (a,b)+ Shared{} -> updateSharedTerm normalise v DontCare _ -> return v instance Normalise Elim where@@ -473,11 +538,15 @@ normalise (Bind b) = Bind <$> normalise b normalise NoBody = return NoBody -instance (Raise t, Normalise t) => Normalise (Abs t) where+instance (Subst t, Normalise t) => Normalise (Abs t) where normalise a@(Abs x _) = Abs x <$> underAbstraction_ a normalise normalise (NoAbs x v) = NoAbs x <$> normalise v instance Normalise t => Normalise (Arg t) where+ normalise a@(Arg h Irrelevant t) = return a -- Andreas, 2012-04-02: Do not normalize irrelevant terms!?+ normalise a = traverse normalise a++instance Normalise t => Normalise (Dom t) where normalise = traverse normalise instance Normalise t => Normalise [t] where@@ -496,7 +565,7 @@ x <- enterClosure cl normalise return $ cl { clValue = x } -instance (Raise a, Normalise a) => Normalise (Tele a) where+instance (Subst a, Normalise a) => Normalise (Tele a) where normalise EmptyTel = return EmptyTel normalise (ExtendTel a b) = uncurry ExtendTel <$> normalise (a, b) @@ -509,14 +578,14 @@ return $ ValueCmp cmp t u v normalise (ElimCmp cmp t v as bs) = ElimCmp cmp <$> normalise t <*> normalise v <*> normalise as <*> normalise bs- normalise (LevelCmp cmp u v) = uncurry (LevelCmp cmp) <$> normalise (u,v)- normalise (TypeCmp cmp a b) = uncurry (TypeCmp cmp) <$> normalise (a,b)+ normalise (LevelCmp cmp u v) = uncurry (LevelCmp cmp) <$> normalise (u,v)+ normalise (TypeCmp cmp a b) = uncurry (TypeCmp cmp) <$> normalise (a,b) normalise (TelCmp a b cmp tela telb) = uncurry (TelCmp a b cmp) <$> normalise (tela,telb)- normalise (SortCmp cmp a b) = uncurry (SortCmp cmp) <$> normalise (a,b)- normalise (Guarded c pid) = Guarded <$> normalise c <*> pure pid- normalise (UnBlock m) = return $ UnBlock m- normalise (FindInScope m) = return $ FindInScope m- normalise (IsEmpty t) = IsEmpty <$> normalise t+ normalise (SortCmp cmp a b) = uncurry (SortCmp cmp) <$> normalise (a,b)+ normalise (Guarded c pid) = Guarded <$> normalise c <*> pure pid+ normalise (UnBlock m) = return $ UnBlock m+ normalise (FindInScope m cands) = FindInScope m <$> mapM normalise cands+ normalise (IsEmpty r t) = IsEmpty r <$> normalise t instance Normalise Pattern where normalise p = case p of@@ -574,6 +643,7 @@ Lam h b -> Lam h <$> instantiateFull b Sort s -> sortTm <$> instantiateFull s Pi a b -> uncurry Pi <$> instantiateFull (a,b)+ Shared{} -> updateSharedTerm instantiateFull v DontCare v -> DontCare <$> instantiateFull v instance InstantiateFull Level where@@ -587,7 +657,7 @@ instantiateFull l = case l of MetaLevel m vs -> do v <- instantiateFull (MetaV m vs)- case v of+ case ignoreSharing v of MetaV m vs -> return $ MetaLevel m vs _ -> return $ UnreducedLevel v NeutralLevel v -> NeutralLevel <$> instantiateFull v@@ -608,13 +678,16 @@ instantiateFull (Bind b) = Bind <$> instantiateFull b instantiateFull NoBody = return NoBody -instance (Raise t, InstantiateFull t) => InstantiateFull (Abs t) where+instance (Subst t, InstantiateFull t) => InstantiateFull (Abs t) where instantiateFull a@(Abs x _) = Abs x <$> underAbstraction_ a instantiateFull instantiateFull (NoAbs x a) = NoAbs x <$> instantiateFull a instance InstantiateFull t => InstantiateFull (Arg t) where instantiateFull = traverse instantiateFull +instance InstantiateFull t => InstantiateFull (Dom t) where+ instantiateFull = traverse instantiateFull+ instance InstantiateFull t => InstantiateFull [t] where instantiateFull = traverse instantiateFull @@ -641,14 +714,14 @@ return $ ValueCmp cmp t u v ElimCmp cmp t v as bs -> ElimCmp cmp <$> instantiateFull t <*> instantiateFull v <*> instantiateFull as <*> instantiateFull bs- LevelCmp cmp u v -> uncurry (LevelCmp cmp) <$> instantiateFull (u,v)- TypeCmp cmp a b -> uncurry (TypeCmp cmp) <$> instantiateFull (a,b)+ LevelCmp cmp u v -> uncurry (LevelCmp cmp) <$> instantiateFull (u,v)+ TypeCmp cmp a b -> uncurry (TypeCmp cmp) <$> instantiateFull (a,b) TelCmp a b cmp tela telb -> uncurry (TelCmp a b cmp) <$> instantiateFull (tela,telb)- SortCmp cmp a b -> uncurry (SortCmp cmp) <$> instantiateFull (a,b)- Guarded c pid -> Guarded <$> instantiateFull c <*> pure pid- UnBlock m -> return $ UnBlock m- FindInScope m -> return $ FindInScope m- IsEmpty t -> IsEmpty <$> instantiateFull t+ SortCmp cmp a b -> uncurry (SortCmp cmp) <$> instantiateFull (a,b)+ Guarded c pid -> Guarded <$> instantiateFull c <*> pure pid+ UnBlock m -> return $ UnBlock m+ FindInScope m cands -> FindInScope m <$> mapM instantiateFull cands+ IsEmpty r t -> IsEmpty r <$> instantiateFull t instance InstantiateFull Elim where instantiateFull (Apply v) = Apply <$> instantiateFull v@@ -657,6 +730,9 @@ instance (Ord k, InstantiateFull e) => InstantiateFull (Map k e) where instantiateFull = traverse instantiateFull +instance (Eq k, Hashable k, InstantiateFull e) => InstantiateFull (HashMap k e) where+ instantiateFull = traverse instantiateFull+ instance InstantiateFull ModuleName where instantiateFull = return @@ -669,7 +745,7 @@ instance InstantiateFull Section where instantiateFull (Section tel n) = flip Section n <$> instantiateFull tel -instance (Raise a, InstantiateFull a) => InstantiateFull (Tele a) where+instance (Subst a, InstantiateFull a) => InstantiateFull (Tele a) where instantiateFull EmptyTel = return EmptyTel instantiateFull (ExtendTel a b) = uncurry ExtendTel <$> instantiateFull (a, b) @@ -677,9 +753,9 @@ instantiateFull = return instance InstantiateFull Definition where- instantiateFull (Defn rel x t df i c d) = do+ instantiateFull (Defn rel x t pol occ df i c d) = do (t, (df, d)) <- instantiateFull (t, (df, d))- return $ Defn rel x t df i c d+ return $ Defn rel x t pol occ df i c d instance InstantiateFull a => InstantiateFull (Open a) where instantiateFull (OpenThing n a) = OpenThing n <$> instantiateFull a@@ -718,6 +794,9 @@ instantiateFull NotInjective = return NotInjective instantiateFull (Inverse inv) = Inverse <$> instantiateFull inv +instance InstantiateFull a => InstantiateFull (WithArity a) where+ instantiateFull (WithArity n a) = WithArity n <$> instantiateFull a+ instance InstantiateFull a => InstantiateFull (Case a) where instantiateFull (Branches cs ls m) = Branches <$> instantiateFull cs@@ -738,28 +817,36 @@ instance InstantiateFull Interface where instantiateFull (Interface ms mod scope inside- sig b hsImports highlighting pragmas) =+ sig b hsImports highlighting pragmas patsyns) = Interface ms mod scope inside <$> instantiateFull sig <*> instantiateFull b <*> return hsImports <*> return highlighting <*> return pragmas+ <*> return patsyns instance InstantiateFull a => InstantiateFull (Builtin a) where instantiateFull (Builtin t) = Builtin <$> instantiateFull t instantiateFull (Prim x) = Prim <$> instantiateFull x +instance InstantiateFull QName where+ instantiateFull = return+ instance InstantiateFull a => InstantiateFull (Maybe a) where instantiateFull = mapM instantiateFull ++{- DUPLICATE of Telescope.telView+ -- | @telViewM t@ is like @telView' t@, but it reduces @t@ to expose -- function type constructors. telViewM :: Type -> TCM TelView telViewM t = do t <- reduce t -- also instantiates meta if in head position- case unEl t of+ case ignoreSharing $ unEl t of Pi a b -> absV a (absName b) <$> telViewM (absBody b) _ -> return $ TelV EmptyTel t where absV a x (TelV tel t) = TelV (ExtendTel a (Abs x tel)) t+-}
src/full/Agda/TypeChecking/Rules/Builtin.hs view
@@ -20,7 +20,8 @@ import Agda.TypeChecking.Constraints import Agda.TypeChecking.Reduce import Agda.TypeChecking.Pretty-+import Agda.TypeChecking.Irrelevance+import Agda.TypeChecking.SizedTypes ( builtinSizeHook ) import Agda.TypeChecking.Rules.Term ( checkExpr , inferExpr ) import {-# SOURCE #-} Agda.TypeChecking.Rules.Builtin.Coinduction @@ -33,19 +34,22 @@ -- * Checking builtin pragmas --------------------------------------------------------------------------- +builtinPostulate :: TCM Type -> BuiltinDescriptor+builtinPostulate = BuiltinPostulate Relevant+ coreBuiltins :: [BuiltinInfo] coreBuiltins = map (\(x,z) -> BuiltinInfo x z) [ (builtinList |-> BuiltinData (tset --> tset) [builtinNil, builtinCons]) , (builtinArg |-> BuiltinData (tset --> tset) [builtinArgArg]) , (builtinBool |-> BuiltinData tset [builtinTrue, builtinFalse]) , (builtinNat |-> BuiltinData tset [builtinZero, builtinSuc])- , (builtinLevel |-> BuiltinPostulate tset)- , (builtinInteger |-> BuiltinPostulate tset)- , (builtinFloat |-> BuiltinPostulate tset)- , (builtinChar |-> BuiltinPostulate tset)- , (builtinString |-> BuiltinPostulate tset)- , (builtinQName |-> BuiltinPostulate tset)- , (builtinIO |-> BuiltinPostulate (tset --> tset))+ , (builtinLevel |-> builtinPostulate tset)+ , (builtinInteger |-> builtinPostulate tset)+ , (builtinFloat |-> builtinPostulate tset)+ , (builtinChar |-> builtinPostulate tset)+ , (builtinString |-> builtinPostulate tset)+ , (builtinQName |-> builtinPostulate tset)+ , (builtinIO |-> builtinPostulate (tset --> tset)) , (builtinAgdaSort |-> BuiltinData tset [builtinAgdaSortSet, builtinAgdaSortLit, builtinAgdaSortUnsupported]) , (builtinAgdaType |-> BuiltinData tset [builtinAgdaTypeEl]) , (builtinAgdaTerm |-> BuiltinData tset@@ -55,15 +59,15 @@ ,builtinAgdaTermUnsupported]) , (builtinEquality |-> BuiltinData (hPi "a" (el primLevel) $ hPi "A" (return $ sort $ varSort 0) $- (El (varSort 1) <$> var 0) -->- (El (varSort 1) <$> var 0) -->+ (El (varSort 1) <$> varM 0) -->+ (El (varSort 1) <$> varM 0) --> return (sort $ varSort 1)) [builtinRefl]) , (builtinHiding |-> BuiltinData tset [builtinHidden, builtinInstance, builtinVisible]) , (builtinRelevance |-> BuiltinData tset [builtinRelevant, builtinIrrelevant]) , (builtinRefl |-> BuiltinDataCons (hPi "a" (el primLevel) $ hPi "A" (return $ sort $ varSort 0) $- hPi "x" (El (varSort 1) <$> var 0) $- El (varSort 2) <$> primEquality <#> var 2 <#> var 1 <@> var 0 <@> var 0))+ hPi "x" (El (varSort 1) <$> varM 0) $+ El (varSort 2) <$> primEquality <#> varM 2 <#> varM 1 <@> varM 0 <@> varM 0)) , (builtinNil |-> BuiltinDataCons (hPi "A" tset (el (list v0)))) , (builtinCons |-> BuiltinDataCons (hPi "A" tset (tv0 --> el (list v0) --> el (list v0)))) , (builtinZero |-> BuiltinDataCons tnat)@@ -84,9 +88,17 @@ , (builtinVisible |-> BuiltinDataCons thiding) , (builtinRelevant |-> BuiltinDataCons trelevance) , (builtinIrrelevant |-> BuiltinDataCons trelevance)- , (builtinSize |-> BuiltinPostulate tset)- , (builtinSizeSuc |-> BuiltinPostulate (tsize --> tsize))- , (builtinSizeInf |-> BuiltinPostulate tsize)+ , (builtinSize |-> builtinPostulate tset)+ , (builtinSizeLt |-> builtinPostulate (tsize --> tset))+ , (builtinSizeSuc |-> builtinPostulate (tsize --> tsize))+ , (builtinSizeInf |-> builtinPostulate tsize)+ -- postulate max : {i : Size} -> Size< i -> Size< i -> Size< i+ , (builtinSizeMax |-> builtinPostulate (tsize --> tsize --> tsize))+ -- (hPi "i" tsize $ let a = el $ primSizeLt <@> v0 in (a --> a --> a)))+ -- postulate .irrelevant : {a : Level}{A : Set a} -> .A -> A+ , (builtinIrrAxiom |-> BuiltinPostulate Irrelevant+ (hPi "a" (el primLevel) $ hPi "A" (return $ sort $ varSort 0) $+ (El (varSort 1) <$> varM 0) .--> (El (varSort 1) <$> varM 0))) , (builtinAgdaSortSet |-> BuiltinDataCons (tterm --> tsort)) , (builtinAgdaSortLit |-> BuiltinDataCons (tnat --> tsort)) , (builtinAgdaSortUnsupported|-> BuiltinDataCons tsort)@@ -100,9 +112,9 @@ , (builtinLevelZero |-> BuiltinPrim "primLevelZero" (const $ return ())) , (builtinLevelSuc |-> BuiltinPrim "primLevelSuc" (const $ return ())) , (builtinLevelMax |-> BuiltinPrim "primLevelMax" verifyMax)- , (builtinAgdaFunDef |-> BuiltinPostulate tset) -- internally this is QName- , (builtinAgdaDataDef |-> BuiltinPostulate tset) -- internally this is QName- , (builtinAgdaRecordDef |-> BuiltinPostulate tset) -- internally this is QName+ , (builtinAgdaFunDef |-> builtinPostulate tset) -- internally this is QName+ , (builtinAgdaDataDef |-> builtinPostulate tset) -- internally this is QName+ , (builtinAgdaRecordDef |-> builtinPostulate tset) -- internally this is QName , (builtinAgdaDefinition |-> BuiltinData tset [builtinAgdaDefinitionFunDef ,builtinAgdaDefinitionDataDef ,builtinAgdaDefinitionDataConstructor@@ -119,8 +131,8 @@ where (|->) = (,) - v0 = var 0- v1 = var 1+ v0 = varM 0+ v1 = varM 1 tv0,tv1 :: TCM Type tv0 = el v0@@ -137,7 +149,7 @@ tsize = el primSize tbool = el primBool thiding = el primHiding- trelevance = el primRelvance+ trelevance = el primRelevance ttype = el primAgdaType tsort = el primAgdaSort tdefn = el primAgdaDefinition@@ -147,8 +159,8 @@ verifyPlus plus = verify ["n","m"] $ \(@@) zero suc (==) choice -> do- let m = Var 0 []- n = Var 1 []+ let m = var 0+ n = var 1 x + y = plus @@ x @@ y -- We allow recursion on any argument@@ -161,8 +173,8 @@ verifyMinus minus = verify ["n","m"] $ \(@@) zero suc (==) choice -> do- let m = Var 0 []- n = Var 1 []+ let m = var 0+ n = var 1 x - y = minus @@ x @@ y -- We allow recursion on any argument@@ -174,8 +186,8 @@ verifyTimes times = do plus <- primNatPlus verify ["n","m"] $ \(@@) zero suc (==) choice -> do- let m = Var 0 []- n = Var 1 []+ let m = var 0+ n = var 1 x + y = plus @@ x @@ y x * y = times @@ x @@ y @@ -193,10 +205,10 @@ verifyDivSucAux dsAux = verify ["k","m","n","j"] $ \(@@) zero suc (==) choice -> do let aux k m n j = dsAux @@ k @@ m @@ n @@ j- k = Var 0 []- m = Var 1 []- n = Var 2 []- j = Var 3 []+ k = var 0+ m = var 1+ n = var 2+ j = var 3 aux k m zero j == k aux k m (suc n) zero == aux (suc k) m n m@@ -205,10 +217,10 @@ verifyModSucAux dsAux = verify ["k","m","n","j"] $ \(@@) zero suc (==) choice -> do let aux k m n j = dsAux @@ k @@ m @@ n @@ j- k = Var 0 []- m = Var 1 []- n = Var 2 []- j = Var 3 []+ k = var 0+ m = var 1+ n = var 2+ j = var 3 aux k m zero j == k aux k m (suc n) zero == aux zero m n m@@ -219,8 +231,8 @@ true <- primTrue false <- primFalse let x == y = eq @@ x @@ y- m = Var 0 []- n = Var 1 []+ m = var 0+ n = var 1 (zero == zero ) === true (suc n == suc m) === (n == m) (suc n == zero ) === false@@ -231,8 +243,8 @@ true <- primTrue false <- primFalse let x < y = leq @@ x @@ y- m = Var 0 []- n = Var 1 []+ m = var 0+ n = var 1 (n < zero) === false (suc n < suc m) === (n < m) (zero < suc m) === true@@ -254,14 +266,14 @@ suc n = s @@ n choice = foldr1 (\x y -> x `catchError` \_ -> y) xs <- mapM freshName_ xs- addCtxs xs (defaultArg nat) $ f (@@) zero suc (==) choice+ addCtxs xs (domFromArg $ defaultArg nat) $ f (@@) zero suc (==) choice inductiveCheck :: String -> Int -> Term -> TCM () inductiveCheck b n t = do t <- etaContract =<< normalise t let err = typeError (NotInductive t)- case t of+ case ignoreSharing t of Def t _ -> do t <- theDef <$> getConstInfo t case t of@@ -313,8 +325,8 @@ level <- getBuiltin' builtinLevel case (nat, level) of (Just nat, Just level) -> do- Def nat _ <- normalise nat- Def level _ <- normalise level+ Def nat _ <- ignoreSharing <$> normalise nat+ Def level _ <- ignoreSharing <$> normalise level when (nat == level) $ typeError $ GenericError $ builtinNat ++ " and " ++ builtinLevel ++ " have to be different types."@@ -323,9 +335,10 @@ BuiltinDataCons t -> do - let name (Lam h b) = name (absBody b)- name (Con c _) = Con c []- name _ = __IMPOSSIBLE__+ let name (Lam h b) = name (absBody b)+ name (Con c _) = Con c []+ name (Shared p) = name $ ignoreSharing (derefPtr p)+ name _ = __IMPOSSIBLE__ e' <- checkExpr e =<< t @@ -356,15 +369,18 @@ _ -> typeError $ GenericError $ "Builtin " ++ s ++ " must be bound to a function" - BuiltinPostulate t -> do- e' <- checkExpr e =<< t+ BuiltinPostulate rel t -> do+ t' <- t+ e' <- applyRelevanceToContext rel $ checkExpr e t' let err = typeError $ GenericError $ "The argument to BUILTIN " ++ s ++ " must be a postulated name" case e of A.Def q -> do def <- ignoreAbstractMode $ getConstInfo q case theDef def of- Axiom {} -> bindBuiltinName s e'+ Axiom {} -> do+ builtinSizeHook s q e' t'+ bindBuiltinName s e' _ -> err _ -> err
src/full/Agda/TypeChecking/Rules/Builtin/Coinduction.hs view
@@ -7,7 +7,6 @@ module Agda.TypeChecking.Rules.Builtin.Coinduction where import Control.Applicative-import Control.Monad.Error import qualified Data.Map as Map @@ -31,27 +30,27 @@ #include "../../../undefined.h" --- | The type of @∞@.+-- | The type of @∞@. typeOfInf :: TCM Type typeOfInf = hPi "a" (el primLevel) $ (return . sort $ varSort 0) --> (return . sort $ varSort 0) --- | The type of @♯_@.+-- | The type of @♯_@. typeOfSharp :: TCM Type typeOfSharp = hPi "a" (el primLevel) $ hPi "A" (return . sort $ varSort 0) $- (El (varSort 1) <$> var 0) -->- (El (varSort 1) <$> primInf <#> var 1 <@> var 0)+ (El (varSort 1) <$> varM 0) -->+ (El (varSort 1) <$> primInf <#> varM 1 <@> varM 0) --- | The type of @♭@.+-- | The type of @♭@. typeOfFlat :: TCM Type typeOfFlat = hPi "a" (el primLevel) $ hPi "A" (return . sort $ varSort 0) $- (El (varSort 1) <$> primInf <#> var 1 <@> var 0) -->- (El (varSort 1) <$> var 0)+ (El (varSort 1) <$> primInf <#> varM 1 <@> varM 0) -->+ (El (varSort 1) <$> varM 0) -- | Binds the INFINITY builtin, but does not change the type's -- definition.@@ -65,27 +64,30 @@ -- The following (no longer supported) definition is used: ----- codata ∞ {a} (A : Set a) : Set a where--- ♯_ : (x : A) → ∞ A+-- codata ∞ {a} (A : Set a) : Set a where+-- ♯_ : (x : A) → ∞ A bindBuiltinSharp :: A.Expr -> TCM () bindBuiltinSharp e = bindPostulatedName builtinSharp e $ \sharp sharpDefn -> do- sharpE <- instantiateFull =<< checkExpr (A.Def sharp) =<< typeOfSharp- inf <- primInf- infDefn <- case inf of- Def inf _ -> getConstInfo inf- _ -> __IMPOSSIBLE__+ sharpE <- instantiateFull =<< checkExpr (A.Def sharp) =<< typeOfSharp+ Def inf _ <- ignoreSharing <$> primInf+ infDefn <- getConstInfo inf addConstant (defName infDefn) $- infDefn { theDef = Datatype+ infDefn { defPolarity = [] -- not monotone+ , defArgOccurrences = [Unused, StrictPos]+ , theDef = Datatype { dataPars = 2 , dataIxs = 0 , dataInduction = CoInductive , dataClause = Nothing , dataCons = [sharp] , dataSort = varSort 1+{- , dataPolarity = [Invariant, Invariant]- , dataArgOccurrences = [Unused, Positive]+ , dataArgOccurrences = [Unused, StrictPos]+-}+ , dataMutual = [] , dataAbstr = ConcreteDef } }@@ -104,74 +106,53 @@ -- The following (no longer supported) definition is used: ----- ♭ : ∀ {a} {A : Set a} → ∞ A → A--- ♭ (♯ x) = x+-- ♭ : ∀ {a} {A : Set a} → ∞ A → A+-- ♭ (♯ x) = x bindBuiltinFlat :: A.Expr -> TCM () bindBuiltinFlat e = bindPostulatedName builtinFlat e $ \flat flatDefn -> do- flatE <- instantiateFull =<< checkExpr (A.Def flat) =<< typeOfFlat- sharp <- (\t -> case t of- Def q _ -> q- _ -> __IMPOSSIBLE__)- <$> primSharp- kit <- requireLevels+ flatE <- instantiateFull =<< checkExpr (A.Def flat) =<< typeOfFlat+ Def sharp _ <- ignoreSharing <$> primSharp+ kit <- requireLevels+ Def inf _ <- ignoreSharing <$> primInf let clause = Clause { clauseRange = noRange- , clauseTel = ExtendTel (argH (El (mkType 0) (Def (typeName kit) [])))- (Abs "a" (ExtendTel (argH $ sort $ varSort 0)- (Abs "A" (ExtendTel (argN (El (varSort 1) (Var 0 [])))+ , clauseTel = ExtendTel (domH (El (mkType 0) (Def (typeName kit) [])))+ (Abs "a" (ExtendTel (domH $ sort $ varSort 0)+ (Abs "A" (ExtendTel (domN (El (varSort 1) (var 0))) (Abs "x" EmptyTel)))))- , clausePerm = idP 3- , clausePats = [ argH (VarP "a")- , argH (VarP "A")- , argN (ConP sharp Nothing [argN (VarP "x")])+ , clausePerm = idP 1+ , clausePats = [ argN (ConP sharp Nothing [argN (VarP "x")]) ]- , clauseBody = Bind $ Abs "h0" $- Bind $ Abs "h1" $- Bind $ Abs "h2" $ Body (Var 0 [])+ , clauseBody = Bind $ Abs "x" $ Body (var 0) } addConstant flat $- flatDefn { theDef = Function+ flatDefn { defPolarity = []+ , defArgOccurrences = [StrictPos]+ , theDef = Function { funClauses = [clause] , funCompiled = let hid = Arg Hidden Relevant nohid = defaultArg in- Case 2 (Branches (Map.singleton sharp- (Done [hid "a", hid "A", nohid "x"] (Var 0 [])))+ Case 0 (Branches (Map.singleton sharp+ (WithArity 1 (Done [nohid "x"] (var 0)))) Map.empty Nothing) , funInv = NotInjective- , funPolarity = [Invariant, Invariant, Invariant]- , funArgOccurrences = [Unused, Unused, Positive]+{-+ , funPolarity = [Invariant]+ , funArgOccurrences = [StrictPos] -- changing that to [Mixed] destroys monotonicity of 'Rec' in test/succeed/GuardednessPreservingTypeConstructors+-}+ , funMutual = [] , funAbstr = ConcreteDef , funDelayed = NotDelayed- , funProjection = Nothing- {- flat is a projection, but in the termination checker- it destroys the (inductive) structural ordering.- Thus, we do not register it as a projection. -}+ , funProjection = Just (inf, 3) , funStatic = False+ , funCopy = False+ , funTerminates = Just True } } return flatE --- | The coinductive primitives.--data CoinductionKit = CoinductionKit- { nameOfInf :: QName- , nameOfSharp :: QName- , nameOfFlat :: QName- }---- | Tries to build a 'CoinductionKit'.--coinductionKit :: TCM (Maybe CoinductionKit)-coinductionKit = (do- Def inf _ <- primInf- Def sharp _ <- primSharp- Def flat _ <- primFlat- return $ Just $ CoinductionKit- { nameOfInf = inf- , nameOfSharp = sharp- , nameOfFlat = flat- })- `catchError` \_ -> return Nothing+-- The coinductive primitives.+-- moved to TypeChecking.Monad.Builtin
src/full/Agda/TypeChecking/Rules/Builtin/Coinduction.hs-boot view
@@ -7,9 +7,11 @@ bindBuiltinSharp :: Expr -> TCM () bindBuiltinFlat :: Expr -> TCM () +{- MOVED to TypeChecking.Monad.Builtin data CoinductionKit nameOfInf :: CoinductionKit -> QName nameOfSharp :: CoinductionKit -> QName nameOfFlat :: CoinductionKit -> QName coinductionKit :: TCM (Maybe CoinductionKit)+-}
src/full/Agda/TypeChecking/Rules/Data.hs view
@@ -6,6 +6,8 @@ import Control.Monad import Control.Monad.Trans +import Data.List (genericTake)+ import qualified Agda.Syntax.Abstract as A import Agda.Syntax.Internal import Agda.Syntax.Common@@ -25,10 +27,11 @@ import Agda.TypeChecking.Irrelevance import Agda.TypeChecking.Telescope -import Agda.TypeChecking.Rules.Term ( isType_ )+import {-# SOURCE #-} Agda.TypeChecking.Rules.Term ( isType_ ) import Agda.Interaction.Options +import Agda.Utils.List import Agda.Utils.Monad import Agda.Utils.Size import Agda.Utils.Tuple@@ -69,6 +72,7 @@ -- The type we get from bindParameters is Θ -> s where Θ is the type of -- the indices. We count the number of indices and return s.+ -- We check that s is a sort. (nofIxs, s) <- splitType t0 when (any (`freeIn` s) [0..nofIxs - 1]) $ do@@ -99,12 +103,16 @@ , dataCons = [] -- Constructors are added later , dataSort = s , dataAbstr = Info.defAbstract i+{-+ -- determined by the positivity checker: , dataPolarity = [] , dataArgOccurrences = []+-}+ , dataMutual = [] } escapeContext (size tel) $ do- addConstant name ( Defn Relevant name t (defaultDisplayForm name) 0 noCompiledRep dataDef )+ addConstant name ( Defn Relevant name t [] [] (defaultDisplayForm name) 0 noCompiledRep dataDef ) -- Check the types of the constructors mapM_ (checkConstructor name tel' nofIxs s) cs@@ -128,10 +136,11 @@ -- Add the datatype to the signature with its constructors. It was previously -- added without them.- addConstant name (Defn Relevant name t (defaultDisplayForm name) 0 noCompiledRep $+ addConstant name (Defn Relevant name t [] [] (defaultDisplayForm name) 0 noCompiledRep $ dataDef { dataCons = map cname cs } )- computePolarity name+ -- Andreas 2012-02-13: postpone polarity computation until after positivity check+ -- computePolarity name where cname (A.ScopedDecl _ [d]) = cname d cname (A.Axiom _ _ x _) = x@@ -140,12 +149,14 @@ hideTel EmptyTel = EmptyTel hideTel (ExtendTel a tel) = ExtendTel (hideAndRelParams a) $ hideTel <$> tel - splitType (El _ (Pi _ b)) = ((+ 1) -*- id) <$> splitType (absBody b)- splitType (El _ (Sort s)) = return (0, s)- splitType a = do- s <- newSortMeta- equalType a (sort s)- return (0, s)+ splitType :: Type -> TCM (Int, Sort)+ splitType t = case ignoreSharing $ unEl t of+ Pi a b -> ((+ 1) -*- id) <$> do addCtxString (absName b) a $ splitType (absBody b)+ Sort s -> return (0, s)+ _ -> do+ s <- newSortMeta+ equalType t (sort s)+ return (0, s) -- | Type check a constructor declaration. Checks that the constructor targets -- the datatype and that it fits inside the declared sort.@@ -182,7 +193,7 @@ -- add parameters to constructor type and put into signature escapeContext (size tel) $ addConstant c- $ Defn Relevant c (telePi tel t') (defaultDisplayForm c) 0 noCompiledRep+ $ Defn Relevant c (telePi tel t') [] [] (defaultDisplayForm c) 0 noCompiledRep $ Constructor (size tel) c d (Info.defAbstract i) Inductive where debugEnter c e =@@ -217,15 +228,19 @@ bindParameters (A.DomainFull (A.TypedBindings _ (Arg h rel (A.TNoBind _))) : bs) a ret = do x <- freshNoName_ bindParameters (A.DomainFree h rel x : bs) a ret-bindParameters (A.DomainFree h rel x : ps) (El _ (Pi (Arg h' rel' a) b)) ret+bindParameters ps0@(A.DomainFree h rel x : ps) (El _ (Pi arg@(Dom h' rel' a) b)) ret -- Andreas, 2011-04-07 ignore relevance information in binding?! | h /= h' = __IMPOSSIBLE__ | otherwise = addCtx x arg $ bindParameters ps (absBody b) $ \tel s -> ret (ExtendTel arg $ Abs (show x) tel) s- where- arg = Arg h rel' a-bindParameters _ _ _ = __IMPOSSIBLE__+bindParameters bs (El s (Shared p)) ret = bindParameters bs (El s $ derefPtr p) ret+bindParameters (b : bs) t _ = __IMPOSSIBLE__+{- Andreas, 2012-01-17 Concrete.Definitions ensures number and hiding of parameters to be correct+-- Andreas, 2012-01-13 due to separation of data declaration/definition, the user+-- could give more parameters than declared.+bindParameters (b : bs) t _ = typeError $ DataTooManyParameters+-} -- | Check that the arguments to a constructor fits inside the sort of the datatype.@@ -242,12 +257,12 @@ -- The line below would be simpler, but doesn't allow datatypes -- to be indexed by the universe level. -- noConstraints $ s' `leqSort` s- case unEl t of- Pi arg@(Arg h r a) _ -> do+ case ignoreSharing $ unEl t of+ Pi arg@(Dom h r a) _ -> do let s' = getSort a s' `leqSort` s x <- freshName_ (argName t)- let v = Arg h r $ Var 0 []+ let v = Arg h r $ var 0 t' = piApply (raise 1 t) [v] addCtx x arg $ fitsIn t' (raise 1 s) _ -> return ()@@ -264,7 +279,7 @@ constr :: Nat -> Sort -> Term -> TCM () constr n s v = do v <- reduce v- case v of+ case ignoreSharing v of Pi _ (NoAbs _ b) -> constrT n b Pi a b -> underAbstraction a b $ \t -> constrT (n + 1) t@@ -277,21 +292,24 @@ checkParams n vs = zipWithM_ sameVar vs ps where- ps = reverse [ i | (i,_) <- zip [n..] vs ]+-- ps = reverse [ i | (i,_) <- zip [n..] vs ]+ nvs = size vs+ ps = genericTake nvs $ downFrom (n + nvs) sameVar arg i -- skip irrelevant parameters | argRelevance arg == Irrelevant = return () | otherwise = do t <- typeOfBV i- equalTerm t (unArg arg) (Var i [])+ equalTerm t (unArg arg) (var i) +{- UNUSED, Andreas 2012-09-13 -- | Force a type to be a specific datatype. forceData :: QName -> Type -> TCM Type forceData d (El s0 t) = liftTCM $ do t' <- reduce t d <- canonicalName d- case t' of+ case ignoreSharing t' of Def d' _ | d == d' -> return $ El s0 t' | otherwise -> fail $ "wrong datatype " ++ show d ++ " != " ++ show d'@@ -301,14 +319,15 @@ noConstraints $ leqType (El s0 t') (El s (Def d ps)) -- TODO: need equalType? reduce $ El s0 t' _ -> typeError $ ShouldBeApplicationOf (El s0 t) d+-} -- | Is the type coinductive? Returns 'Nothing' if the answer cannot -- be determined. isCoinductive :: Type -> TCM (Maybe Bool) isCoinductive t = do- El _ t <- normalise t- case t of+ El s t <- normalise t+ case ignoreSharing t of Def q _ -> do def <- getConstInfo q case theDef def of@@ -327,4 +346,5 @@ Pi {} -> return (Just False) Sort {} -> return (Just False) MetaV {} -> return Nothing+ Shared{} -> __IMPOSSIBLE__ DontCare{} -> __IMPOSSIBLE__
src/full/Agda/TypeChecking/Rules/Decl.hs view
@@ -1,12 +1,21 @@-{-# LANGUAGE CPP #-}+{-# LANGUAGE CPP, TupleSections #-} module Agda.TypeChecking.Rules.Decl where import Control.Monad+import Control.Monad.Error+import Control.Monad.Reader import Control.Monad.Trans+import Control.Monad.State (modify)++import qualified Data.Foldable as Fold+import Data.Maybe import qualified Data.Map as Map import Data.Map (Map)-import qualified Agda.Utils.IO.Locale as LocIO+import qualified Data.List as List+import qualified Data.Set as Set+import Data.Set (Set)+import Data.Sequence ((|>)) import Agda.Syntax.Abstract (AnyAbstract(..)) import qualified Agda.Syntax.Abstract as A@@ -15,19 +24,24 @@ import Agda.Syntax.Position import Agda.Syntax.Common +import Agda.TypeChecking.Errors import Agda.TypeChecking.Monad import Agda.TypeChecking.Monad.Builtin import Agda.TypeChecking.Monad.Mutual import Agda.TypeChecking.Pretty import Agda.TypeChecking.Constraints import Agda.TypeChecking.Positivity+import Agda.TypeChecking.Polarity import Agda.TypeChecking.Primitive hiding (Nat)+import Agda.TypeChecking.ProjectionLike import Agda.TypeChecking.Conversion import Agda.TypeChecking.Substitute import Agda.TypeChecking.Reduce import Agda.TypeChecking.SizedTypes import Agda.TypeChecking.Telescope import Agda.TypeChecking.Forcing+import Agda.TypeChecking.Injectivity+import Agda.TypeChecking.InstanceArguments (solveIrrelevantMetas) import Agda.TypeChecking.Rules.Term import Agda.TypeChecking.Rules.Data ( checkDataDef )@@ -39,7 +53,14 @@ import Agda.Utils.Size import Agda.Utils.Monad+import qualified Agda.Utils.HashMap as HMap+-- import Agda.Utils.NubList -- reverted +import Agda.Interaction.Highlighting.Generate++import Agda.Termination.TermCheck+import Agda.Interaction.Options+ #include "../../undefined.h" import Agda.Utils.Impossible @@ -51,64 +72,193 @@ -- whenM onTopLevel unfreezeMetas -- | Type check a single declaration.+ checkDecl :: A.Declaration -> TCM () checkDecl d = do -- Issue 418 fix: freeze metas before checking an abstract things when isAbstract freezeMetas- leaveTopLevelConditionally d $ case d of- A.Axiom i rel x e -> checkAxiom i rel x e- A.Field{} -> typeError FieldOutsideRecord- A.Primitive i x e -> checkPrimitive i x e- A.Mutual i ds -> checkMutual i ds- A.Section i x tel ds -> checkSection i x tel ds- A.Apply i x modapp rd rm -> checkSectionApplication i x modapp rd rm- A.Import i x -> checkImport i x- A.Pragma i p -> checkPragma i p- A.ScopedDecl scope ds -> setScope scope >> checkDecls ds- A.FunDef i x cs -> check x i $ checkFunDef NotDelayed i x cs- A.DataDef i x ps cs -> check x i $ checkDataDef i x ps cs- A.RecDef i x c ps tel cs -> check x i $ checkRecDef i x c ps tel cs- A.DataSig i x ps t -> checkAxiom i Relevant x (A.Pi (Info.ExprRange (fuseRange ps t)) ps t)- A.RecSig i x ps t -> checkAxiom i Relevant x (A.Pi (Info.ExprRange (fuseRange ps t)) ps t)- A.Open _ _ -> return ()- top <- onTopLevel- when top $ solveSizeConstraints >> freezeMetas++ let -- What kind of final checks/computations should be performed+ -- if we're not inside a mutual block?+ none m = m >> return Nothing+ meta m = m >> return (Just (return []))+ mutual m = m >>= return . Just . mutualChecks+ impossible m = m >> return __IMPOSSIBLE__+ -- We're definitely inside a mutual block.++ topLevelKind <- case d of+ A.Axiom{} -> meta $ checkTypeSignature d+ A.Field{} -> typeError FieldOutsideRecord+ A.Primitive i x e -> meta $ checkPrimitive i x e+ A.Mutual i ds -> mutual $ checkMutual i ds+ A.Section i x tel ds -> meta $ checkSection i x tel ds+ A.Apply i x modapp rd rm -> meta $ checkSectionApplication i x modapp rd rm+ A.Import i x -> none $ checkImport i x+ A.Pragma i p -> none $ checkPragma i p+ A.ScopedDecl scope ds -> none $ setScope scope >> checkDecls ds+ A.FunDef i x delayed cs -> impossible $ check x i $ checkFunDef delayed i x cs+ A.DataDef i x ps cs -> impossible $ check x i $ checkDataDef i x ps cs+ A.RecDef i x ind c ps tel cs -> mutual $ check x i $ do+ checkRecDef i x ind c ps tel cs+ return (Set.singleton x)+ A.DataSig i x ps t -> impossible $ checkSig i x ps t+ A.RecSig i x ps t -> none $ checkSig i x ps t+ -- A record signature is always followed by a+ -- record definition. Metas should not be+ -- frozen until after the definition has been+ -- checked. NOTE: Metas are not frozen+ -- immediately after the last field. Perhaps+ -- they should be (unless we're in a mutual+ -- block).+ A.Open _ _ -> none $ return ()+ -- Open is just an artifact from the concrete+ -- syntax, retained for highlighting purposes.++ unlessM (isJust . envMutualBlock <$> ask) $ do+ termErrs <- case topLevelKind of+ Nothing -> return []+ Just mutualChecks -> do++ solveSizeConstraints+ solveIrrelevantMetas+ wakeupConstraints_ -- solve emptyness constraints+ freezeMetas++ mutualChecks++ -- Syntax highlighting.+ let highlight d = generateAndPrintSyntaxInfo d (Full termErrs)+ case d of+ A.Axiom{} -> highlight d+ A.Field{} -> __IMPOSSIBLE__+ A.Primitive{} -> highlight d+ A.Mutual{} -> highlight d+ A.Apply{} -> highlight d+ A.Import{} -> highlight d+ A.Pragma{} -> highlight d+ A.ScopedDecl{} -> return ()+ A.FunDef{} -> __IMPOSSIBLE__+ A.DataDef{} -> __IMPOSSIBLE__+ A.DataSig{} -> __IMPOSSIBLE__+ A.Open{} -> highlight d+ A.Section i x tel _ -> highlight (A.Section i x tel [])+ -- Each block in the section has already been highlighted,+ -- all that remains is the module declaration.+ A.RecSig{} -> highlight d+ A.RecDef i x ind c ps tel cs ->+ highlight (A.RecDef i x ind c [] tel (fields cs))+ -- The telescope and all record module declarations except+ -- for the fields have already been highlighted.+ where+ fields (A.ScopedDecl _ ds1 : ds2) = fields ds1 ++ fields ds2+ fields (d@A.Field{} : ds) = d : fields ds+ fields (_ : ds) = fields ds+ fields [] = []+ where- unScope (A.ScopedDecl scope ds) = setScope scope >> unScope d- unScope d = return d+ unScope (A.ScopedDecl scope ds) = setScope scope >> unScope d+ unScope d = return d - check x i m = do- reportSDoc "tc.decl" 5 $ text "Checking" <+> prettyTCM x <> text "."- r <- abstract (Info.defAbstract i) m- reportSDoc "tc.decl" 5 $ text "Checked" <+> prettyTCM x <> text "."- return r+ checkSig i x ps t = checkTypeSignature $+ A.Axiom i Relevant x (A.Pi (Info.ExprRange (fuseRange ps t)) ps t) - isAbstract = fmap Info.defAbstract (A.getDefInfo d) == Just AbstractDef+ check x i m = do+ reportSDoc "tc.decl" 5 $ text "Checking" <+> prettyTCM x <> text "."+ r <- abstract (Info.defAbstract i) m+ reportSDoc "tc.decl" 5 $ text "Checked" <+> prettyTCM x <> text "."+ return r - -- Concrete definitions cannot use information about abstract things.- abstract ConcreteDef = inConcreteMode- abstract AbstractDef = inAbstractMode- -- open is just an artifact from the concrete syntax- -- retained for highlighting purposes+ isAbstract = fmap Info.defAbstract (A.getDefInfo d) == Just AbstractDef - leaveTopLevelConditionally d =- case d of- A.Section{} -> id- A.ScopedDecl{} -> id- _ -> leaveTopLevel+ -- Concrete definitions cannot use information about abstract things.+ abstract ConcreteDef = inConcreteMode+ abstract AbstractDef = inAbstractMode + -- Some checks that should be run at the end of a mutual+ -- block (or non-mutual record declaration). The set names+ -- contains the names defined in the mutual block.+ mutualChecks names = do++ checkStrictlyPositive names++ -- Andreas, 2012-02-13: Polarity computation uses info from+ -- positivity check, so it needs happen after positivity+ -- check.+ let -- | Do we need to compute polarity information for the+ -- definition corresponding to the given name?+ relevant q = do+ def <- theDef <$> getConstInfo q+ return $ case def of+ Function{} -> Just q+ Datatype{} -> Just q+ Record{} -> Just q+ Axiom{} -> Nothing+ Constructor{} -> Nothing+ Primitive{} -> Nothing+ mapM_ computePolarity =<<+ (catMaybes <$> mapM relevant (Set.toList names))++ -- Andreas, 2012-09-11: Injectivity check stores clauses+ -- whose 'Relevance' is affected by polarity computation,+ -- so do it here.++ let checkInj (q, def@Defn{ theDef = d@Function{ funClauses = cs }}) = do+ inv <- checkInjectivity q cs+ modifySignature $ updateDefinition q $ const $+ def { theDef = d { funInv = inv }}+ checkInj _ = return ()++ namesDefs <- mapM (\ q -> (q,) <$> getConstInfo q) $ Set.toList names+ mapM_ checkInj namesDefs++ -- Non-mutual definitions can be considered for+ -- projection likeness+ case Set.toList names of+ [d] -> do+ def <- getConstInfo d+ case theDef def of+ Function{} -> makeProjection (defName def)+ _ -> return ()+ _ -> return ()++ -- Termination checking.+ termErrs <-+ ifM (optTerminationCheck <$> pragmaOptions)+ (disableDestructiveUpdate $ case d of+ A.RecDef {} -> return []+ -- Record module definitions should not be+ -- termination-checked twice.+ _ -> do+ termErrs <- {- nubList <$> -} termDecl d+ modify $ \st ->+ st { stTermErrs = Fold.foldl' (|>) (stTermErrs st) termErrs }+ return termErrs)+ (return [])++ return termErrs+ -- | Type check an axiom. checkAxiom :: Info.DefInfo -> Relevance -> QName -> A.Expr -> TCM ()-checkAxiom i rel x e = do+checkAxiom i rel0 x e = do+ -- Andreas, 2012-04-18 if we are in irrelevant context, axioms is irrelevant+ -- even if not declared as such (Issue 610).+ rel <- max rel0 <$> asks envRelevance+ -- rel <- ifM ((Irrelevant ==) <$> asks envRelevance) (return Irrelevant) (return rel0) t <- isType_ e reportSDoc "tc.decl.ax" 10 $ sep- [ text "checked axiom"- , nest 2 $ prettyTCM rel <> prettyTCM x <+> text ":" <+> (prettyTCM =<< instantiateFull t)+ [ text $ "checked type signature"+ , nest 2 $ prettyTCM rel <> prettyTCM x <+> text ":" <+> prettyTCM t ] -- Not safe. See Issue 330 -- t <- addForcingAnnotations t- addConstant x (Defn rel x t (defaultDisplayForm x) 0 noCompiledRep Axiom)- solveSizeConstraints+ addConstant x (Defn rel x t [] [] (defaultDisplayForm x) 0 noCompiledRep Axiom)++ -- for top-level axioms (postulates) try to solve irrelevant metas+ -- when postulate $+ maybe solveIrrelevantMetas (const $ return ()) =<< asks envMutualBlock++ traceCall (IsType_ e) $ solveSizeConstraints -- need Range for error message+ -- Andreas, 2011-05-31, that freezing below is probably wrong: -- when (Info.defAbstract i == AbstractDef) $ freezeMetas @@ -116,12 +266,12 @@ checkPrimitive :: Info.DefInfo -> QName -> A.Expr -> TCM () checkPrimitive i x e = traceCall (CheckPrimitive (getRange i) (qnameName x) e) $ do -- TODO!! (qnameName)- PrimImpl t' pf <- lookupPrimitiveFunction (nameString $ qnameName x)+ (_, PrimImpl t' pf) <- lookupPrimitiveFunctionQ x t <- isType_ e noConstraints $ equalType t t' let s = show $ nameConcrete $ qnameName x- bindPrimitive s $ pf { primFunName = x }- addConstant x (Defn Relevant x t (defaultDisplayForm x) 0 noCompiledRep $+ bindPrimitive s pf+ addConstant x (Defn Relevant x t [] [] (defaultDisplayForm x) 0 noCompiledRep $ Primitive (Info.defAbstract i) s Nothing Nothing) where nameString (Name _ x _ _) = show x@@ -205,7 +355,7 @@ A.OptionsPragma _ -> __IMPOSSIBLE__ -- not allowed here A.EtaPragma r -> modifySignature eta where- eta sig = sig { sigDefinitions = Map.adjust setEta r defs }+ eta sig = sig { sigDefinitions = HMap.adjust setEta r defs } where setEta def = def { theDef = setEtad $ theDef def } setEtad d = case d of@@ -214,19 +364,22 @@ defs = sigDefinitions sig -- | Type check a bunch of mutual inductive recursive definitions.-checkMutual :: Info.DeclInfo -> [A.Declaration] -> TCM ()+--+-- All definitions which have so far been assigned to the given mutual+-- block are returned.+checkMutual :: Info.MutualInfo -> [A.Declaration] -> TCM (Set QName) checkMutual i ds = inMutualBlock $ do- mapM_ checkDecl ds - checkStrictlyPositive =<< currentMutualBlock- let unScope (A.ScopedDecl _ ds) = concatMap unScope ds- unScope d = [d]- case concatMap unScope ds of- -- Non-mutual definitions can be considered for projection likeness- [A.Axiom _ _ x _, A.FunDef _ y _] | x == y -> makeProjection x- _ -> return ()+ verboseS "tc.decl.mutual" 20 $ do+ blockId <- currentOrFreshMutualBlock+ reportSDoc "" 0 $ vcat $+ (text "Checking mutual block" <+> text (show blockId) <> text ":") :+ map (nest 2 . prettyA) ds + mapM_ checkDecl ds + lookupMutualBlock =<< currentOrFreshMutualBlock+ -- | Type check the type signature of an inductive or recursive definition. checkTypeSignature :: A.TypeSignature -> TCM () checkTypeSignature (A.ScopedDecl scope ds) = do@@ -248,8 +401,8 @@ dx <- prettyTCM x dtel <- mapM prettyA tel dtel' <- prettyTCM =<< lookupSection x- liftIO $ LocIO.putStrLn $ "checking section " ++ show dx ++ " " ++ show dtel- liftIO $ LocIO.putStrLn $ " actual tele: " ++ show dtel'+ reportSLn "" 0 $ "checking section " ++ show dx ++ " " ++ show dtel+ reportSLn "" 0 $ " actual tele: " ++ show dtel' withCurrentModule x $ checkDecls ds checkModuleArity :: ModuleName -> Telescope -> [NamedArg A.Expr] -> TCM Telescope@@ -259,7 +412,7 @@ check eta [] = return eta check EmptyTel (_:_) = bad- check (ExtendTel (Arg h _ _) btel) args0@(Arg h' _ (Named name _) : args) =+ check (ExtendTel (Dom h _ _) btel) args0@(Arg h' _ (Named name _) : args) = let y = absName btel tel = absBody btel in case (h, h', name) of@@ -326,7 +479,7 @@ telInst = instFinal tel instFinal :: Telescope -> Telescope instFinal (ExtendTel _ NoAbs{}) = __IMPOSSIBLE__- instFinal (ExtendTel (Arg h r t) (Abs n EmptyTel)) = ExtendTel (Arg Instance r t) (Abs n EmptyTel)+ instFinal (ExtendTel (Dom h r t) (Abs n EmptyTel)) = ExtendTel (Dom Instance r t) (Abs n EmptyTel) instFinal (ExtendTel arg (Abs n tel)) = ExtendTel arg (Abs n (instFinal tel)) instFinal EmptyTel = __IMPOSSIBLE__ args = teleArgs tel
src/full/Agda/TypeChecking/Rules/Def.hs view
@@ -9,11 +9,12 @@ import Control.Monad.Reader hiding (mapM) import Control.Monad.Error hiding (mapM) import Control.Monad hiding (mapM)++import Data.Function import Data.List hiding (sort) import Data.Traversable import Data.Set (Set) import qualified Data.Set as Set-import qualified Agda.Utils.IO.Locale as LocIO import Agda.Syntax.Common import Agda.Syntax.Position@@ -43,11 +44,14 @@ import Agda.TypeChecking.Injectivity import Agda.TypeChecking.Polarity import Agda.TypeChecking.Irrelevance+import Agda.TypeChecking.Implicit import Agda.TypeChecking.SizedTypes+import Agda.TypeChecking.CompiledClause (CompiledClauses(..)) import Agda.TypeChecking.CompiledClause.Compile -import Agda.TypeChecking.Rules.Term ( checkExpr, inferExpr, checkTelescope_, isType_ )+import Agda.TypeChecking.Rules.Term ( checkExpr, inferExpr, inferExprForWith, inferOrCheck, checkTelescope_, isType_ ) import Agda.TypeChecking.Rules.LHS ( checkLeftHandSide )+import Agda.TypeChecking.Rules.LHS.Implicit ( insertImplicitPatterns ) import {-# SOURCE #-} Agda.TypeChecking.Rules.Decl ( checkDecls ) import Agda.TypeChecking.Rules.Data ( isCoinductive ) @@ -72,9 +76,61 @@ -- Get the type and relevance of the function t <- typeOfConst name rel <- relOfConst name- checkFunDef' t rel delayed i name cs+ case trivialClause cs of+ -- if we have just one clause without pattern matching and+ -- without a type signature, then infer, to allow+ -- "aliases" for things starting with hidden abstractions+ Just e | isMeta (ignoreSharing $ unEl t) ->+ traceCall (CheckFunDef (getRange i) (qnameName name) cs) $+ checkAlias t rel delayed i name e+ _ -> checkFunDef' t rel delayed i name cs+ where+ isMeta MetaV{} = True+ isMeta _ = False+ trivialClause [A.Clause (A.LHS i (A.LHSHead f []) []) (A.RHS e) []] = Just e+ trivialClause _ = Nothing --- | Type check a definition by pattern matching. The first argument+-- | Check a trivial definition of the form @f = e@+checkAlias :: Type -> Relevance -> Delayed -> Info.DefInfo -> QName -> A.Expr -> TCM ()+checkAlias t' rel delayed i name e = do+ reportSDoc "tc.def.alias" 10 $ text "checkAlias" <+> vcat+ [ text (show name) <+> colon <+> prettyTCM t'+ , text (show name) <+> equals <+> prettyTCM e+ ]+ -- Infer the type of the rhs+ (v, t) <- applyRelevanceToContext rel $ inferOrCheck e (Just t')+ -- v <- coerce v t t'+ reportSDoc "tc.def.alias" 20 $ text "checkAlias: finished checking"++ solveSizeConstraints++ v <- instantiateFull v -- if we omit this, we loop (stdlib: Relation.Binary.Sum)+ -- or the termination checker might stumble over levels in sorts+ -- that cannot be converted to expressions without the level built-ins+ -- (test/succeed/Issue655.agda)++ -- Add the definition+ addConstant name $ Defn rel name t [] [] (defaultDisplayForm name) 0 noCompiledRep+ $ Function+ { funClauses = [Clause (getRange i) EmptyTel (idP 0) [] $ Body v] -- trivial clause @name = v@+ , funCompiled = Done [] v+ , funDelayed = delayed+ , funInv = NotInjective+ , funAbstr = Info.defAbstract i+{-+ , funPolarity = []+ , funArgOccurrences = []+-}+ , funMutual = []+ , funProjection = Nothing+ , funStatic = False+ , funCopy = False+ , funTerminates = Nothing+ }+ reportSDoc "tc.def.alias" 20 $ text "checkAlias: leaving"+++-- | Type check a definition by pattern matching. The third argument -- specifies whether the clauses are delayed or not. checkFunDef' :: Type -> Relevance -> Delayed -> Info.DefInfo -> QName -> [A.Clause] -> TCM () checkFunDef' t rel delayed i name cs =@@ -86,19 +142,24 @@ , nest 2 $ text "full type:" <+> (prettyTCM . defType =<< getConstInfo name) ] + -- Ensure that all clauses have the same number of trailing hidden patterns+ -- This is necessary since trailing implicits are no longer eagerly inserted.+ cs <- trailingImplicits t cs+ -- Check the clauses let check c = do c <- applyRelevanceToContext rel $ checkClause t c solveSizeConstraints return c- cs <- mapM check cs+ cs <- traceCall NoHighlighting $ -- To avoid flicker.+ mapM check cs -- Check that all clauses have the same number of arguments unless (allEqual $ map npats cs) $ typeError DifferentArities reportSDoc "tc.cc" 15 $ do sep [ text "clauses before rebindClause"- , nest 2 $ prettyTCM (map (NamedClause name) cs)+ , nest 2 $ prettyTCM (map (QNamed name) cs) ] -- Annotate the clauses with which arguments are actually used.@@ -114,11 +175,11 @@ reportSDoc "tc.cc" 15 $ do sep [ text "clauses before compilation"- , nest 2 $ prettyTCM (map (NamedClause name) cs)+ , nest 2 $ prettyTCM (map (QNamed name) cs) ] - -- Compile the clauses- cc <- compileClauses True cs+ -- Coverage check and compile the clauses+ cc <- compileClauses (Just (name, t)) cs reportSDoc "tc.cc" 10 $ do sep [ text "compiled clauses of" <+> prettyTCM name@@ -126,39 +187,151 @@ ] -- Add the definition- addConstant name $ Defn rel name t (defaultDisplayForm name) 0 noCompiledRep+ addConstant name $ Defn rel name t [] [] (defaultDisplayForm name) 0 noCompiledRep $ Function { funClauses = cs , funCompiled = cc , funDelayed = delayed , funInv = inv , funAbstr = Info.defAbstract i+{- , funPolarity = [] , funArgOccurrences = []+-}+ , funMutual = [] , funProjection = Nothing , funStatic = False+ , funCopy = False+ , funTerminates = Nothing }- computePolarity name++ -- Andreas 2012-02-13: postpone polarity computation until after positivity check+ -- computePolarity name+ reportSDoc "tc.def.fun" 10 $ do sep [ text "added " <+> prettyTCM name <+> text ":" , nest 2 $ prettyTCM . defType =<< getConstInfo name ]-- -- Check pattern coverage- checkCoverage name-- reportSLn "tc.def.fun.compile" 10 $- "compiled clauses for " ++ show name ++ ":\n" ++ show cc where npats = size . clausePats +{- | Ensure that all clauses have the same number of trailing implicits.+Example: +@+ test : Bool → {A B : Set} → Set+ test true {A} = A+ test false {B = B} = B+@++@trailingImplicits@ patches these clauses to++@+ test : Bool → {A B : Set} → Set+ test true {A} {_} = A+ test false {_} {B = B} = B+@++such that the arity of the clauses of @test@ is uniform.+-}+trailingImplicits :: Type -> [A.Clause] -> TCM [A.Clause]+trailingImplicits t [] = __IMPOSSIBLE__+trailingImplicits t cs@(c:_) = do+ pps@((ps,ips):_) <- mapM splitTrailingImplicits cs+ -- compute the trailing implicits from type t+ TelV tel t0 <- telView t+ let -- number of non-hidden patterns+ nh = genericLength $ filter ((NotHidden ==) . argHiding) ps+ -- drop nh non-hidden domains from t+ l = dropNonHidden nh $ telToList tel+ -- take the hidden domains immediately after the dropped stuff+ is = takeWhile ((NotHidden /=) . domHiding) l+ itel = telFromList is+ -- get the trailing implicit patterns+ ipss = map snd pps+ -- complete the implicit pattern lists+ ipss <- mapM (\ ps -> insertImplicitPatterns DontExpandLast ps itel) ipss+ let longest = head $ sortBy (compare `on` ((0-) . length)) ipss+ pps' = zip (map fst pps) ipss+ return $ zipWith (patchUpTrailingImplicits longest) pps' cs++-- | @dropNonHidden n tel@ drops @n@ non-hidden domains from @tel@,+-- including all hidden domains that come before the @n@th non-hidden one.+dropNonHidden :: Nat -> [Dom (String, Type)] -> [Dom (String, Type)]+dropNonHidden 0 l = l+dropNonHidden n l = case dropWhile ((NotHidden /=) . domHiding) l of+ [] -> [] -- or raise a type checking error "too many arguments in lhs"+ (_:l) -> dropNonHidden (n-1) l++-- | @splitTrailingImplicits c@ returns the patterns of clause @c@+-- as pair @(ps, ips)@ where @ips@ are the trailing implicit patterns+-- and @ps@ is the rest.+splitTrailingImplicits :: A.Clause -> TCM (A.Patterns, A.Patterns)+splitTrailingImplicits (A.Clause (A.LHS _ A.LHSProj{} []) _ _) =+ typeError $ NotImplemented "type checking definitions by copatterns"+splitTrailingImplicits (A.Clause (A.LHS _ _ ps@(_ : _)) _ _) =+ typeError $ UnexpectedWithPatterns ps+splitTrailingImplicits (A.Clause (A.LHS _ (A.LHSHead _ aps) []) _ _) = do+ let (ips, ps) = span ((Hidden==) . argHiding) $ reverse aps+ return (reverse ps, reverse ips)++{- UNUSED+-- | Compute the difference between two list of hidden patterns.+-- The first pattern list must be longer.+-- Both pattern lists must be complete, i.e., not skip any hidden patterns.+patternDiff :: A.Patterns -> A.Patterns -> A.Patterns+patternDiff ps1 ps2 = drop (length ps2) ps1+-}++-- | @patchUpTrailingImplicits should (ps, is) c@ takes a clause @c@ whose+-- patterns are split into @(ps, is)@ where @is@ are the trailing+-- implicit patterns and @ps@ the rest. @is@ has already been patched+-- with omitted implicit patterns (which can occur if named implicit patterns+-- are there originally). @should@ is an extension of @is@.+-- The returned clause contains an extension of @is@ by new wildcards+-- to match @should@.+patchUpTrailingImplicits :: A.Patterns -> (A.Patterns, A.Patterns) -> A.Clause -> A.Clause+patchUpTrailingImplicits should (ps, is) c | length is >= length should = c+patchUpTrailingImplicits should (ps, is) (A.Clause (A.LHS i (A.LHSHead x aps) []) rhs0 wh) =+ let imp = Arg Hidden Relevant $ Named Nothing $ A.ImplicitP $+ Info.PatRange noRange+ imps = replicate (length should - length is) imp+ in A.Clause (A.LHS i (A.LHSHead x (ps ++ is ++ imps)) []) rhs0 wh+patchUpTrailingImplicits _ _ _ = __IMPOSSIBLE__++{- OLD+-- | Ensure that all clauses have the same number of trailing implicits.+trailingImplicits :: [A.Clause] -> TCM [A.Clause]+trailingImplicits [] = __IMPOSSIBLE__+trailingImplicits cs = do+ ns <- mapM numberOfTrailingImplicits cs+ let n = maximum ns+ return $ zipWith (patchUpTrailingImplicits n) ns cs++numberOfTrailingImplicits :: A.Clause -> TCM Int+numberOfTrailingImplicits (A.Clause (A.LHS _ A.LHSProj{} []) _ _) =+ typeError $ NotImplemented "type checking definitions by copatterns"+numberOfTrailingImplicits (A.Clause (A.LHS _ _ ps@(_ : _)) _ _) =+ typeError $ UnexpectedWithPatterns ps+numberOfTrailingImplicits (A.Clause (A.LHS _ (A.LHSHead _ aps) []) _ _) =+ return $ length $ takeWhile ((Hidden==) . argHiding) $ reverse aps++patchUpTrailingImplicits :: Int -> Int -> A.Clause -> A.Clause+patchUpTrailingImplicits should is c | is >= should = c+patchUpTrailingImplicits should is (A.Clause (A.LHS i (A.LHSHead x aps) []) rhs0 wh) =+ let imp = Arg Hidden Relevant $ Named Nothing $ A.ImplicitP $+ Info.PatRange noRange+ imps = replicate (should - is) imp+ in A.Clause (A.LHS i (A.LHSHead x (aps ++ imps)) []) rhs0 wh+patchUpTrailingImplicits _ _ _ = __IMPOSSIBLE__+-}+ -- | Insert some patterns in the in with-clauses LHS of the given RHS insertPatterns :: [A.Pattern] -> A.RHS -> A.RHS insertPatterns pats (A.WithRHS aux es cs) = A.WithRHS aux es (map insertToClause cs)- where insertToClause (A.Clause (A.LHS i x aps ps) rhs ds)+ where insertToClause (A.Clause (A.LHS i lhscore ps) rhs ds) -- = A.Clause (A.LHS i x (aps ++ map (Arg NotHidden . unnamed) pats) (ps)) (insertPatterns pats rhs) ds- = A.Clause (A.LHS i x aps (pats ++ ps)) (insertPatterns pats rhs) ds+ = A.Clause (A.LHS i lhscore (pats ++ ps)) (insertPatterns pats rhs) ds insertPatterns pats (A.RewriteRHS qs eqs rhs wh) = A.RewriteRHS qs eqs (insertPatterns pats rhs) wh insertPatterns pats rhs = rhs @@ -180,21 +353,27 @@ -- | Type check a function clause. checkClause :: Type -> A.Clause -> TCM Clause-checkClause t c@(A.Clause (A.LHS i x aps []) rhs0 wh) =+checkClause t c@(A.Clause (A.LHS i (A.LHSProj{}) []) rhs0 wh) =+ typeError $ NotImplemented "type checking definitions by copatterns"+checkClause t c@(A.Clause (A.LHS i (A.LHSHead x aps) []) rhs0 wh) = traceCall (CheckClause t c) $- checkLeftHandSide c aps t $ \gamma delta sub xs ps t' perm -> do- let mkBody v = foldr (\x t -> Bind $ Abs x t) (Body $ substs sub v) xs- (body, with) <- checkWhere (size delta) wh $ let+ checkLeftHandSide (CheckPatternShadowing c) aps t $ \ mgamma delta sub xs ps t' perm -> do+ let mkBody v = foldr (\x t -> Bind $ Abs x t) (Body $ applySubst sub v) xs+ -- introduce trailing implicits for checking the where decls+ TelV htel t0 <- telViewUpTo' (-1) ((Hidden==) . domHiding) t'+ let n = size htel+ (body, with) <- addCtxTel htel $ checkWhere (size delta + n) wh $ escapeContext (size htel) $ let+ -- for the body, we remove the implicits again handleRHS rhs = case rhs of A.RHS e- | any (containsAbsurdPattern . namedThing . unArg) aps ->+ | any (containsAbsurdPattern . namedArg) aps -> typeError $ AbsurdPatternRequiresNoRHS aps | otherwise -> do v <- checkExpr e t' return (mkBody v, NoWithFunction) A.AbsurdRHS- | any (containsAbsurdPattern . namedThing . unArg) aps+ | any (containsAbsurdPattern . namedArg) aps -> return (NoBody, NoWithFunction) | otherwise -> typeError $ NoRHSRequiresAbsurdPattern aps A.RewriteRHS [] (_:_) _ _ -> __IMPOSSIBLE__@@ -205,19 +384,20 @@ (proof,t) <- inferExpr eq t' <- reduce =<< instantiateFull t equality <- primEquality >>= \eq ->- let lamV (Lam h b) = ((h:) *** id) $ lamV (unAbs b)- lamV v = ([], v) in+ let lamV (Lam h b) = ((h:) *** id) $ lamV (unAbs b)+ lamV (Shared p) = lamV (derefPtr p)+ lamV v = ([], v) in return $ case lamV eq of ([Hidden, Hidden], Def equality _) -> equality ([Hidden], Def equality _) -> equality ([], Def equality _) -> equality _ -> __IMPOSSIBLE__- reflCon <- primRefl >>= \refl -> return $ case refl of+ reflCon <- primRefl >>= \refl -> return $ case ignoreSharing refl of Con reflCon [] -> reflCon _ -> __IMPOSSIBLE__- (rewriteType,rewriteFrom,rewriteTo) <- case t' of- El _Set0 (Def equality' [_level, Arg Hidden Relevant rewriteType,- Arg NotHidden Relevant rewriteFrom, Arg NotHidden Relevant rewriteTo])+ (rewriteType,rewriteFrom,rewriteTo) <- case ignoreSharing $ unEl t' of+ Def equality' [_level, Arg Hidden Relevant rewriteType,+ Arg NotHidden Relevant rewriteFrom, Arg NotHidden Relevant rewriteTo] | equality' == equality -> return (rewriteType, rewriteFrom, rewriteTo) _ -> do@@ -225,17 +405,17 @@ typeError $ GenericError $ show err let info = PatRange noRange- metaInfo = Info.MetaInfo noRange emptyScopeInfo Nothing+ metaInfo = Info.emptyMetaInfo underscore = A.Underscore metaInfo [rewriteFromExpr,rewriteToExpr,rewriteTypeExpr, proofExpr] <-- disableDisplayForms $ setShowImplicitArguments True $ reify+ disableDisplayForms $ withShowAllArguments $ reify [rewriteFrom, rewriteTo, rewriteType , proof] let (inner, outer) -- the where clauses should go on the inner-most with | null eqs = ([], wh) | otherwise = (wh, []) newRhs = A.WithRHS qname [rewriteFromExpr, proofExpr]- [A.Clause (A.LHS i x aps pats)+ [A.Clause (A.LHS i (A.LHSHead x aps) pats) (A.RewriteRHS names eqs (insertPatterns pats rhs) inner) outer] pats = [A.DotP info underscore, -- rewriteToExpr,@@ -254,7 +434,7 @@ reportSDoc "tc.with.top" 30 $ prettyA c -- Infer the types of the with expressions- vas <- mapM inferExpr es+ vas <- mapM inferExprForWith es (vs0, as) <- instantiateFull (unzip vas) (vs, as) <- normalise (vs0, as) @@ -268,11 +448,15 @@ SplitTel delta1 delta2 perm' = splitTelescope fv delta finalPerm = composeP perm' perm - reportSDoc "tc.with.top" 25 $ vcat+ -- Andreas, 2012-09-17: for printing delta,+ -- we should remove it from the context first+ reportSDoc "tc.with.top" 25 $ escapeContext (size delta) $ vcat [ text "delta =" <+> prettyTCM delta , text "delta1 =" <+> prettyTCM delta1 , text "delta2 =" <+> addCtxTel delta1 (prettyTCM delta2)- , text "vs =" <+> prettyTCM vs+ ]+ reportSDoc "tc.with.top" 25 $ vcat+ [ text "vs =" <+> prettyTCM vs , text "as =" <+> prettyTCM as , text "perm' =" <+> text (show perm') , text "perm =" <+> text (show perm)@@ -280,11 +464,17 @@ ] -- Create the body of the original function+{- OLD ctx <- getContextTelescope let n = size ctx m = size delta -- All the context variables- us = [ Arg h r (Var i []) | (i, Arg h r _) <- zip [n - 1,n - 2..0] $ telToList ctx ]+ us = [ Arg h r (var i) | (i, Arg h r _) <- zip [n - 1,n - 2..0] $ telToList ctx ]+-}+ -- All the context variables+ us <- getContextArgs+ let n = size us+ m = size delta -- First the variables bound outside this definition (us0, us1') = genericSplitAt (n - m) us -- Then permute the rest and grab those needed to for the with arguments@@ -296,21 +486,20 @@ t' <- return $ renameP (reverseP perm') t' -- and Δ₁ ⊢ vs : as (vs, as) <- do- let var = flip Var []- -- We know that as does not depend on Δ₂- rho = replicate (size delta2) __IMPOSSIBLE__ ++ map var [0..]- return $ substs rho $ renameP (reverseP perm') (vs, as)+ let -- We know that as does not depend on Δ₂+ rho = parallelS (replicate (size delta2) __IMPOSSIBLE__)+ return $ applySubst rho $ renameP (reverseP perm') (vs, as) reportSDoc "tc.with.top" 20 $ vcat- [ text " with arguments" <+> prettyList (map prettyTCM vs)- , text " types" <+> prettyList (map prettyTCM as)+ [ text " with arguments" <+> do escapeContext (size delta2) $ prettyList (map prettyTCM vs)+ , text " types" <+> do escapeContext (size delta2) $ prettyList (map prettyTCM as) , text "with function call" <+> prettyTCM v , text " context" <+> (prettyTCM =<< getContextTelescope)- , text " delta" <+> prettyTCM delta+ , text " delta" <+> do escapeContext (size delta) $ prettyTCM delta , text " fv" <+> text (show fv) , text " body" <+> (addCtxTel delta $ prettyTCM $ mkBody v) ]-+ gamma <- maybe (typeError $ NotImplemented "with clauses for functions with unfolding arity") return mgamma return (mkBody v, WithFunction x aux gamma delta1 delta2 vs as t' ps perm' finalPerm cs) in handleRHS rhs0 escapeContext (size delta) $ checkWithFunction with@@ -334,7 +523,7 @@ , clauseBody = body } -checkClause t (A.Clause (A.LHS _ _ _ ps@(_ : _)) _ _) = typeError $ UnexpectedWithPatterns ps+checkClause t (A.Clause (A.LHS _ _ ps@(_ : _)) _ _) = typeError $ UnexpectedWithPatterns ps checkWithFunction :: WithFunctionProblem -> TCM () checkWithFunction NoWithFunction = return ()@@ -344,11 +533,11 @@ [ text "checkWithFunction" , nest 2 $ vcat [ text "delta1 =" <+> prettyTCM delta1- , text "delta2 =" <+> prettyTCM delta2+ , text "delta2 =" <+> addCtxTel delta1 (prettyTCM delta2) , text "gamma =" <+> prettyTCM gamma , text "as =" <+> addCtxTel delta1 (prettyTCM as) , text "vs =" <+> addCtxTel delta1 (prettyTCM vs)- , text "b =" <+> prettyTCM b+ , text "b =" <+> do addCtxTel delta1 $ addCtxTel delta2 $ prettyTCM b , text "qs =" <+> text (show qs) , text "perm' =" <+> text (show perm') , text "perm =" <+> text (show perm)@@ -365,18 +554,25 @@ -- Generate the type of the with function candidateType <- withFunctionType delta1 vs as delta2 b reportSDoc "tc.with.type" 10 $ sep [ text "candidate type:", nest 2 $ prettyTCM candidateType ]- absAuxType <- setShowImplicitArguments True+ reportSDoc "tc.with.type" 50 $ sep [ text "candidate type:", nest 2 $ text $ show candidateType ]+ absAuxType <- withShowAllArguments $ disableDisplayForms $ dontReifyInteractionPoints $ reify candidateType- reportSDoc "tc.with.top" 15 $+ reportSDoc "tc.with.type" 15 $ vcat [ text "type of with function:" , nest 2 $ prettyTCM absAuxType ]+ reportSDoc "tc.with.type" 50 $+ vcat [ text "type of with function:"+ , nest 2 $ text $ show absAuxType+ ] -- The ranges in the generated type are completely bogus, so we kill them.- auxType <- setCurrentRange (getRange cs) (isType_ $ killRange absAuxType)- `catchError` \err -> case errError err of- TypeError _ e -> enterClosure e $ traceCall (CheckWithFunctionType absAuxType) . typeError+ auxType <- setCurrentRange (getRange cs)+ (traceCall NoHighlighting $ -- To avoid flicker.+ isType_ $ killRange absAuxType)+ `catchError` \err -> case err of+ TypeError s e -> put s >> enterClosure e (traceCall (CheckWithFunctionType absAuxType) . typeError) _ -> throwError err case df of@@ -385,7 +581,7 @@ , prettyList $ map prettyTCM ts , prettyTCM dt ]- addConstant aux (Defn Relevant aux auxType [df] 0 noCompiledRep Axiom)+ addConstant aux (Defn Relevant aux auxType [] [] [df] 0 noCompiledRep Axiom) solveSizeConstraints reportSDoc "tc.with.top" 10 $ sep@@ -418,10 +614,9 @@ dx <- prettyTCM m dtel <- mapM prettyA tel dtel' <- prettyTCM =<< lookupSection m- liftIO $ LocIO.putStrLn $ "checking where section " ++ show dx ++ " " ++ show dtel- liftIO $ LocIO.putStrLn $ " actual tele: " ++ show dtel'- x <- withCurrentModule m $ checkDecls ds >> ret- return x+ reportSLn "" 0 $ "checking where section " ++ show dx ++ " " ++ show dtel+ reportSLn "" 0 $ " actual tele: " ++ show dtel'+ withCurrentModule m $ checkDecls ds >> ret checkWhere _ _ _ = __IMPOSSIBLE__ -- | Check if a pattern contains an absurd pattern. For instance, @suc ()@@@ -434,253 +629,20 @@ A.DotP _ _ -> False A.LitP _ -> False A.AsP _ _ p -> containsAbsurdPattern p- A.ConP _ _ ps -> any (containsAbsurdPattern . namedThing . unArg) ps+ A.ConP _ _ ps -> any (containsAbsurdPattern . namedArg) ps A.DefP _ _ _ -> __IMPOSSIBLE__--{---- | Type check a left-hand side.-checkLHS :: [NamedArg A.Pattern] -> Type -> ([Term] -> [String] -> [Arg Pattern] -> Type -> TCM a) -> TCM a-checkLHS ps t ret = do-- verbose 15 $ do- dt <- prettyTCM t- dps <- mapM prettyA ps- liftIO $ LocIO.putStrLn $ "checking clause " ++ show dps ++ " : " ++ show dt-- -- Save the state for later. (should this be done with the undo monad, or- -- would that interfere with normal undo?)- rollback <- do- st <- get- env <- ask- return $ \k -> do put st; local (const env) k-- -- Preliminary type checking to decide what should be variables and what- -- should be dotted. Ignore empty types.- runCheckPatM (checkPatterns ps t) $ \xs metas _ (ps0, ps, ts, a) -> do-- -- Build the new pattern, turning implicit patterns into variables when- -- they couldn't be solved.- ps1 <- evalStateT (buildNewPatterns ps0) metas-- verbose 10 $ do- d0 <- A.showA ps0- d1 <- A.showA ps1- liftIO $ do- LocIO.putStrLn $ "first check"- LocIO.putStrLn $ " xs = " ++ show xs- LocIO.putStrLn $ " metas = " ++ show metas- LocIO.putStrLn $ " ps0 = " ++ d0- LocIO.putStrLn $ " ps1 = " ++ d1-- verbose 10 $ do- is <- mapM (instantiateFull . flip MetaV []) metas- ds <- mapM prettyTCM is- dts <- mapM prettyTCM =<< mapM instantiateFull ts- liftIO $ LocIO.putStrLn $ " is = " ++ concat (intersperse ", " $ map show ds)- liftIO $ LocIO.putStrLn $ " ts = " ++ concat (intersperse ", " $ map show dts)-- -- Now we forget that we ever type checked anything and type check the new- -- pattern.- rollback $ runCheckPatM (checkPatterns ps1 t)- $ \xs metas emptyTypes (_, ps, ts, a) -> do-- -- Check that the empty types are indeed empty- mapM_ isEmptyType emptyTypes-- verbose 10 $ liftIO $ do- LocIO.putStrLn $ "second check"- LocIO.putStrLn $ " xs = " ++ show xs- LocIO.putStrLn $ " metas = " ++ show metas-- verbose 10 $ do- is <- mapM (instantiateFull . flip MetaV []) metas- ds <- mapM prettyTCM is- liftIO $ LocIO.putStrLn $ " is = " ++ concat (intersperse ", " $ map show ds)-- -- Finally we type check the dot patterns and check that they match their- -- instantiations.- evalStateT (checkDotPatterns ps1) metas-- reportLn 15 "dot patterns check out"-- -- Sanity check. Make sure that all metas were instantiated.- is <- mapM lookupMeta metas- case [ getRange i | i <- is, FirstOrder <- [mvInstantiation i] ] of- [] -> return ()- rs -> fail $ "unsolved pattern metas at\n" ++ unlines (map show rs)-- -- Make sure to purge the type and the context from any first-order metas.- a <- instantiateFull a- flat <- instantiateFull =<< flatContext-- -- The context might not be well-formed. We may have to do some reordering.- reportLn 20 $ "Before reordering:"- verbose 20 $ dumpContext flat-- flat' <- reorderCtx flat-- -- Compute renamings to and from the new context- let sub = (computeSubst `on` map (fst . unArg)) flat flat'- rsub = (computeSubst `on` map (fst . unArg)) flat' flat-- -- Apply the reordering to the types in the new context- let flat'' = map (fmap $ id -*- substs sub) flat'-- reportLn 20 $ "After reordering:"- verbose 20 $ dumpContext flat'-- -- Deflatten the context- let ctx = mkContext flat''-- inContext ctx $ do-- verbose 20 $ do- d <- prettyTCM ctx- dt <- prettyTCM (substs sub a)- liftIO $ LocIO.putStrLn $ "context = " ++ show d- liftIO $ LocIO.putStrLn $ "type = " ++ show dt-- reportLn 20 $ "finished type checking left hand side"- ret rsub xs ps (substs sub a)- where- popMeta = do- x : xs <- get- put xs- return x-- buildNewPatterns :: [NamedArg A.Pattern] -> StateT [MetaId] TCM [NamedArg A.Pattern]- buildNewPatterns = mapM buildNewPattern'-- buildNewPattern' = (traverse . traverse) buildNewPattern-- buildNewPattern :: A.Pattern -> StateT [MetaId] TCM A.Pattern- buildNewPattern (A.ImplicitP i) = do- x <- popMeta- v <- lift $ instantiate (MetaV x [])- lift $ verbose 6 $ do- d <- prettyTCM v- liftIO $ LocIO.putStrLn $ "new pattern for " ++ show x ++ " = " ++ show d- case v of- -- Unsolved metas become variables- MetaV y _ | x == y -> return $ A.WildP i- -- Anything else becomes dotted- _ -> do- lift $ verbose 6 $ do- d <- prettyTCM =<< instantiateFull v- liftIO $ LocIO.putStrLn $ show x ++ " := " ++ show d- scope <- lift getScope- return $ A.DotP i (A.Underscore $ info scope)- where info s = Info.MetaInfo (getRange i) s Nothing-- buildNewPattern p@(A.VarP _) = return p- buildNewPattern p@(A.WildP _) = return p- buildNewPattern p@(A.DotP _ _) = popMeta >> return p- buildNewPattern (A.AsP i x p) = A.AsP i x <$> buildNewPattern p- buildNewPattern (A.ConP i c ps) = A.ConP i c <$> buildNewPatterns ps- buildNewPattern (A.DefP i c ps) = A.DefP i c <$> buildNewPatterns ps- buildNewPattern p@(A.AbsurdP _) = return p- buildNewPattern p@(A.LitP _) = return p-- checkDotPatterns :: [NamedArg A.Pattern] -> StateT [MetaId] TCM ()- checkDotPatterns = mapM_ checkDotPattern'-- checkDotPattern' p = (traverse . traverse) checkDotPattern p >> return ()-- checkDotPattern :: A.Pattern -> StateT [MetaId] TCM ()- checkDotPattern (A.ImplicitP i) = __IMPOSSIBLE__ -- there should be no implicits left at this point- checkDotPattern p@(A.VarP _) = return ()- checkDotPattern p@(A.WildP _) = return ()- checkDotPattern p@(A.DotP i e) = do- x <- popMeta- lift $ do- firstOrder <- isFirstOrder x -- first order and uninstantiated- when firstOrder $ typeError- $ InternalError -- TODO: proper error- $ "uninstantiated dot pattern at " ++ show (getRange i)- HasType _ o <- mvJudgement <$> lookupMeta x- a <- getOpen o- v <- checkExpr e a- noConstraints $ equalTerm t v (MetaV x [])- checkDotPattern (A.AsP i x p) = checkDotPattern p- checkDotPattern (A.ConP i c ps) = checkDotPatterns ps- checkDotPattern (A.DefP i c ps) = checkDotPatterns ps- checkDotPattern p@(A.AbsurdP _) = return ()- checkDotPattern p@(A.LitP _) = return ()-- -- Get the flattened context- flatContext :: TCM Context- flatContext = do- n <- size <$> getContext- mapM f [0..n - 1]- where- f i = do- Arg h t <- instantiateFull =<< typeOfBV' i- x <- nameOfBV i- return $ Arg h (x, t)-- -- Reorder a flat context to make sure it's valid.- reorderCtx :: Context -> TCM Context- reorderCtx ctx = reverse <$> reorder (reverse ctx)- where- free t = mapM nameOfBV (Set.toList $ allVars $ freeVars t)-- reorder :: [Arg (Name, Type)] -> TCM [Arg (Name, Type)]- reorder [] = return []- reorder (Arg h (x,t) : tel) = do- tel' <- reorder tel- xs <- free t- verbose 20 $ do- d <- prettyTCM t- liftIO $ LocIO.putStrLn $ "freeIn " ++ show x ++ " : " ++ show d ++ " are " ++ show xs- case intersect (map (fst . unArg) tel') xs of- [] -> return $ Arg h (x,t) : tel'- zs -> return $ ins zs (Arg h (x,t)) tel'-- ins [] p tel = p : tel- ins xs p (Arg h (x,t):tel) = Arg h (x,t) : ins (delete x xs) p tel- ins (_:_) _ [] = __IMPOSSIBLE__-- -- Compute a renaming from the first names to the second.- computeSubst :: [Name] -> [Name] -> [Term]- computeSubst old new = map ix old- where- ix x = case findIndex (==x) new of- Just i -> Var i []- Nothing -> __IMPOSSIBLE__-- -- Take a flat (but valid) context and turn it into a proper context.- mkContext :: [Arg (Name, Type)] -> Context- mkContext = reverse . mkCtx . reverse- where- mkCtx [] = []- mkCtx ctx0@(Arg h (x,t) : ctx) = Arg h (x, substs sub t) : mkCtx ctx- where- sub = map err ctx0 ++ [ Var i [] | i <- [0..] ]-- err (Arg _ (y,_)) = error $ show y ++ " occurs in the type of " ++ show x-- -- Print a flat context- dumpContext :: Context -> TCM ()- dumpContext ctx = do- let pr (Arg h (x,t)) = do- d <- prettyTCM t- return $ " " ++ par h (show x ++ " : " ++ show d)- par Hidden s = "{" ++ s ++ "}"- par NotHidden s = "(" ++ s ++ ")"- ds <- mapM pr ctx- liftIO $ LocIO.putStr $ unlines $ reverse ds--}+ A.PatternSynP _ _ _ -> __IMPOSSIBLE__ -- False actualConstructor :: QName -> TCM QName actualConstructor c = do v <- constructorForm =<< normalise (Con c [])- case v of+ case ignoreSharing v of Con c _ -> return c _ -> actualConstructor =<< stripLambdas v where- stripLambdas v = case v of+ stripLambdas v = case ignoreSharing v of Con c _ -> return c Lam h b -> do x <- freshName_ $ absName b- addCtx x (Arg h Relevant $ sort Prop) $ stripLambdas (absBody b)+ addCtx x (Dom h Relevant $ sort Prop) $ stripLambdas (absBody b) _ -> typeError $ GenericError $ "Not a constructor: " ++ show c
src/full/Agda/TypeChecking/Rules/LHS.hs view
@@ -20,22 +20,27 @@ import Agda.TypeChecking.Records -- isRecord import Agda.TypeChecking.Reduce import Agda.TypeChecking.Substitute hiding (Substitution)+import qualified Agda.TypeChecking.Substitute as S (Substitution) import Agda.TypeChecking.Telescope import Agda.TypeChecking.Conversion import Agda.TypeChecking.Constraints import Agda.TypeChecking.Irrelevance import Agda.TypeChecking.Primitive (constructorForm)-import {-# SOURCE #-} Agda.TypeChecking.Empty (isReallyEmptyType)-import Agda.TypeChecking.Telescope (renamingR, teleArgs)+import {-# SOURCE #-} Agda.TypeChecking.Empty+-- Duplicate import??+-- import Agda.TypeChecking.Telescope (renamingR, teleArgs) -import Agda.TypeChecking.Rules.Term (checkExpr)+import {-# SOURCE #-} Agda.TypeChecking.Rules.Term (checkExpr) import Agda.TypeChecking.Rules.LHS.Problem+import Agda.TypeChecking.Rules.LHS.ProblemRest import Agda.TypeChecking.Rules.LHS.Unify import Agda.TypeChecking.Rules.LHS.Split import Agda.TypeChecking.Rules.LHS.Implicit import Agda.TypeChecking.Rules.LHS.Instantiate import Agda.TypeChecking.Rules.Data +import Agda.Interaction.Highlighting.Generate+ import Agda.Utils.Permutation import Agda.Utils.Size import Agda.Utils.Monad@@ -43,58 +48,48 @@ #include "../../undefined.h" import Agda.Utils.Impossible -data DotPatternInst = DPI A.Expr Term Type-data AsBinding = AsB Name Term Type--instance Subst DotPatternInst where- substs us (DPI e v a) = uncurry (DPI e) $ substs us (v,a)- substUnder n u (DPI e v a) = uncurry (DPI e) $ substUnder n u (v,a)--instance PrettyTCM DotPatternInst where- prettyTCM (DPI e v a) = sep [ prettyA e <+> text "="- , nest 2 $ prettyTCM v <+> text ":"- , nest 2 $ prettyTCM a- ]--instance Subst AsBinding where- substs us (AsB x v a) = uncurry (AsB x) $ substs us (v, a)- substUnder n u (AsB x v a) = uncurry (AsB x) $ substUnder n u (v, a)--instance Raise AsBinding where- raiseFrom m k (AsB x v a) = uncurry (AsB x) $ raiseFrom m k (v, a)- renameFrom m k (AsB x v a) = uncurry (AsB x) $ renameFrom m k (v, a)--instance PrettyTCM AsBinding where- prettyTCM (AsB x v a) =- sep [ prettyTCM x <> text "@" <> parens (prettyTCM v)- , nest 2 $ text ":" <+> prettyTCM a- ]- -- | Compute the set of flexible patterns in a list of patterns. The result is -- the deBruijn indices of the flexible patterns. A pattern is flexible if it -- is dotted or implicit.-flexiblePatterns :: [NamedArg A.Pattern] -> FlexibleVars-flexiblePatterns nps = [ i | (i, p) <- zip [0..] $ reverse ps, flexible p ]+flexiblePatterns :: [NamedArg A.Pattern] -> TCM FlexibleVars+flexiblePatterns nps = map fst <$> filterM (flexible . snd) (zip [0..] $ reverse ps) where- ps = map (namedThing . unArg) nps- flexible (A.DotP _ _) = True- flexible (A.ImplicitP _) = True- flexible _ = False+ ps = map namedArg nps+ flexible (A.DotP _ _) = return True+ flexible (A.ImplicitP _) = return True+ flexible (A.ConP _ (A.AmbQ [c]) qs) =+ ifM (isJust <$> isRecordConstructor c)+ (andM $ map (flexible . namedArg) qs)+ (return False)+ flexible _ = return False -- | Compute the dot pattern instantiations.-dotPatternInsts :: [NamedArg A.Pattern] -> Substitution -> [Type] -> [DotPatternInst]-dotPatternInsts ps s as = dpi (map (namedThing . unArg) ps) (reverse s) as+dotPatternInsts :: [NamedArg A.Pattern] -> Substitution -> [Dom Type] -> TCM [DotPatternInst]+dotPatternInsts ps s as = dpi (map namedArg ps) (reverse s) as where dpi (_ : _) [] _ = __IMPOSSIBLE__ dpi (_ : _) (Just _ : _) [] = __IMPOSSIBLE__ -- the substitution also contains entries for module parameters, so it can -- be longer than the pattern- dpi [] _ _ = []+ dpi [] _ _ = return [] dpi (_ : ps) (Nothing : s) as = dpi ps s as dpi (p : ps) (Just u : s) (a : as) = case p of- A.DotP _ e -> DPI e u a : dpi ps s as+ A.DotP _ e -> (DPI e u a :) <$> dpi ps s as A.ImplicitP _ -> dpi ps s as+ -- record pattern+ A.ConP _ (A.AmbQ [c]) qs -> do+ Def r vs <- ignoreSharing <$> reduce (unEl $ unDom a)+ (ftel, us) <- etaExpandRecord r vs u+ qs <- insertImplicitPatterns ExpandLast qs ftel+ let instTel EmptyTel _ = []+ instTel (ExtendTel arg tel) (u : us) = arg : instTel (absApp tel u) us+ instTel ExtendTel{} [] = __IMPOSSIBLE__+ bs0 = instTel ftel (map unArg us)+ -- Andreas, 2012-09-19 propagate relevance info to dot patterns+ bs = map (mapDomRelevance (composeRelevance (domRelevance a))) bs0+ dpi (map namedArg qs ++ ps) (map (Just . unArg) us ++ s) (bs ++ as)+ _ -> __IMPOSSIBLE__ instantiatePattern :: Substitution -> Permutation -> [Arg Pattern] -> [Arg Pattern]@@ -139,7 +134,7 @@ -- | Check if a problem is solved. That is, if the patterns are all variables. isSolvedProblem :: Problem -> Bool-isSolvedProblem = all (isVar . snd . asView . namedThing . unArg) . problemInPat+isSolvedProblem = all (isVar . snd . asView . namedArg) . problemInPat where isVar (A.VarP _) = True isVar (A.WildP _) = True@@ -154,26 +149,34 @@ -- -- Precondition: The problem has to be solved. +{- noShadowingOfConstructors :: A.Clause -- ^ The entire clause (used for error reporting). -> Problem -> TCM () noShadowingOfConstructors c problem = traceCall (CheckPatternShadowing c) $ do- let pat = map (snd . asView . namedThing . unArg) $+-}+noShadowingOfConstructors+ :: (Maybe r -> Call) -- ^ Trace, e.g., @CheckPatternShadowing clause@+ -> Problem -> TCM ()+noShadowingOfConstructors mkCall problem =+ traceCall mkCall $ do+ let pat = map (snd . asView . namedArg) $ problemInPat problem- tel = map (unEl . snd . unArg) $ telToList $ problemTel problem+ tel = map (unEl . snd . unDom) $ telToList $ problemTel problem zipWithM' noShadowing pat tel return () where noShadowing (A.WildP {}) t = return () noShadowing (A.AbsurdP {}) t = return () noShadowing (A.ImplicitP {}) t = return ()- noShadowing (A.ConP {}) t = __IMPOSSIBLE__+ noShadowing (A.ConP {}) t = return () -- only happens for eta expanded record patterns noShadowing (A.DefP {}) t = __IMPOSSIBLE__ noShadowing (A.AsP {}) t = __IMPOSSIBLE__ noShadowing (A.DotP {}) t = __IMPOSSIBLE__ noShadowing (A.LitP {}) t = __IMPOSSIBLE__+ noShadowing (A.PatternSynP {}) t = __IMPOSSIBLE__ noShadowing (A.VarP x) t = do t <- normalise t case t of@@ -197,6 +200,7 @@ Var {} -> return () Pi {} -> return () Sort {} -> return ()+ Shared p -> noShadowing (A.VarP x) $ derefPtr p MetaV {} -> return () -- TODO: If the type is a meta-variable, should the test be -- postponed? If there is a problem, then it will be caught when@@ -211,7 +215,7 @@ -- | Check that a dot pattern matches it's instantiation. checkDotPattern :: DotPatternInst -> TCM ()-checkDotPattern (DPI e v a) =+checkDotPattern (DPI e v (Dom h r a)) = traceCall (CheckDotPattern e v) $ do reportSDoc "tc.lhs.dot" 15 $ sep [ text "checking dot pattern"@@ -219,26 +223,42 @@ , nest 2 $ text "=" <+> prettyTCM v , nest 2 $ text ":" <+> prettyTCM a ]- u <- checkExpr e a- -- Should be ok to do noConstraints here- noConstraints $ equalTerm a u v+ applyRelevanceToContext r $ do+ u <- checkExpr e a+ -- Should be ok to do noConstraints here+ noConstraints $ equalTerm a u v -- | Bind the variables in a left hand side. Precondition: the patterns should -- all be 'A.VarP', 'A.WildP', or 'A.ImplicitP' and the telescope should have -- the same size as the pattern list.+-- There could also be 'A.ConP's resulting from eta expanded implicit record+-- patterns. bindLHSVars :: [NamedArg A.Pattern] -> Telescope -> TCM a -> TCM a bindLHSVars [] (ExtendTel _ _) _ = __IMPOSSIBLE__ bindLHSVars (_ : _) EmptyTel _ = __IMPOSSIBLE__ bindLHSVars [] EmptyTel ret = ret bindLHSVars (p : ps) (ExtendTel a tel) ret =- case namedThing $ unArg p of+ case namedArg p of A.VarP x -> addCtx x a $ bindLHSVars ps (absBody tel) ret A.WildP _ -> bindDummy (absName tel) A.ImplicitP _ -> bindDummy (absName tel)- A.AbsurdP _ -> do- isReallyEmptyType $ unArg a+ A.AbsurdP pi -> do+ -- Andreas, 2012-03-15: allow postponement of emptyness check+ isEmptyType (getRange pi) $ unDom a+ -- OLD CODE: isReallyEmptyType $ unArg a bindDummy (absName tel)- _ -> __IMPOSSIBLE__+ A.ConP _ (A.AmbQ [c]) qs -> do -- eta expanded record pattern+ Def r vs <- reduce (unEl $ unDom a)+ ftel <- (`apply` vs) <$> getRecordFieldTypes r+ let n = size ftel+ eta = Con c [ Var i [] <$ (namedThing <$> q) | (q, i) <- zip qs [n - 1, n - 2..0] ]+ bindLHSVars (qs ++ ps) (ftel `abstract` absApp (raise (size ftel) tel) eta) ret+ A.ConP{} -> __IMPOSSIBLE__+ A.DefP{} -> __IMPOSSIBLE__+ A.AsP{} -> __IMPOSSIBLE__+ A.DotP{} -> __IMPOSSIBLE__+ A.LitP{} -> __IMPOSSIBLE__+ A.PatternSynP{} -> __IMPOSSIBLE__ where name "_" = freshNoName_ name s = freshName_ ("." ++ s)@@ -256,60 +276,39 @@ ] addLetBinding Relevant x v a $ bindAsPatterns asb ret --- | Rename the variables in a telescope using the names from a given pattern-useNamesFromPattern :: [NamedArg A.Pattern] -> Telescope -> Telescope-useNamesFromPattern ps = telFromList . zipWith ren (toPats ps ++ repeat dummy) . telToList- where- dummy = A.WildP __IMPOSSIBLE__- ren (A.VarP x) (Arg NotHidden r (_, a)) = Arg NotHidden r (show x, a)- ren _ a = a- toPats = map (namedThing . unArg)- -- | Check a LHS. Main function. checkLeftHandSide- :: A.Clause- -- ^ The entire clause.+ :: (Maybe r -> Call)+ -- ^ Trace, e.g. @CheckPatternShadowing clause@ -> [NamedArg A.Pattern] -- ^ The patterns. -> Type- -- ^ The expected type.- -> (Telescope -> Telescope -> [Term] -> [String] -> [Arg Pattern]- -> Type -> Permutation -> TCM a)+ -- ^ The expected type @a = Γ → b@.+ -> (Maybe Telescope -- Γ : The types of the patterns.+ -- 'Nothing' if more patterns than domain types in @a@.+ -- Used only to construct a @with@ function; see 'stripwithClausePatterns'.+ -> Telescope -- Δ : The types of the pattern variables.+ -> S.Substitution -- σ : The patterns in form of a substitution Δ ⊢ σ : Γ+ -> [String] -- Names for the variables in Δ, for binding the body.+ -> [Arg Pattern] -- The patterns in internal syntax.+ -> Type -- The type of the body. Is @bσ@ if @Γ@ is defined.+ -> Permutation -- The permutation from pattern vars to @Δ@.+ -> TCM a) -- ^ Continuation. -> TCM a checkLeftHandSide c ps a ret = do- TelV tel0' b0 <- telView a- ps <- insertImplicitPatterns ps tel0'- unless (size tel0' >= size ps) $ typeError $ TooManyArgumentsInLHS (size ps) a- let tel0 = useNamesFromPattern ps tel0'- (as, bs) = splitAt (size ps) $ telToList tel0- gamma = telFromList as- b = telePi (telFromList bs) b0-- -- internal patterns start as all variables- ips = map (fmap (VarP . fst)) as-- problem = Problem ps (idP $ size ps, ips) gamma-- reportSDoc "tc.lhs.top" 10 $- vcat [ text "checking lhs:"- , nest 2 $ vcat- [ text "ps =" <+> fsep (map prettyA ps)- , text "a =" <+> (prettyTCM =<< normalise a)- , text "a' =" <+> prettyTCM (telePi tel0 b0)- , text "a'' =" <+> prettyTCM (telePi tel0' b0)- , text "xs =" <+> text (show $ map (fst . unArg) as)- , text "tel0 =" <+> prettyTCM tel0- , text "b0 =" <+> prettyTCM b0- , text "gamma =" <+> prettyTCM gamma- , text "b =" <+> addCtxTel gamma (prettyTCM b)- ]- ]+ problem <- problemFromPats ps a+ unless (noProblemRest problem) $ typeError $ TooManyArgumentsInLHS a+ let (Problem _ _ gamma (ProblemRest _ b)) = problem+ mgamma = if noProblemRest problem then Just gamma else Nothing+ st = LHSState problem idS [] [] - let idsub = [ Var i [] | i <- [0..] ]+ -- doing the splits:+ LHSState (Problem ps (perm, qs) delta rest) sigma dpi asb <- checkLHS st+ unless (null $ restPats rest) $ typeError $ TooManyArgumentsInLHS a - (Problem ps (perm, qs) delta, sigma, dpi, asb) <- checkLHS problem idsub [] []- let b' = substs sigma b+ -- let b' = applySubst sigma b+ let b' = restType rest noPatternMatchingOnCodata qs @@ -333,18 +332,19 @@ let rho = renamingR perm -- I'm not certain about this... Perm n _ = perm xs = [ "h" ++ show n | n <- [0..n - 1] ]- ret gamma delta rho xs qs b' perm+ ret mgamma delta rho xs qs b' perm where- checkLHS :: Problem -> [Term] -> [DotPatternInst] -> [AsBinding] ->- TCM (Problem, [Term], [DotPatternInst], [AsBinding])- checkLHS problem sigma dpi asb- | isSolvedProblem problem = do- problem <- insertImplicitProblem problem -- inserting implicit patterns preserves solvedness- noShadowingOfConstructors c problem- return (problem, sigma, dpi, asb)- | otherwise = do- sp <- splitProblem =<< insertImplicitProblem problem- reportSDoc "tc.lhs.top" 20 $ text "splitting completed"+ -- the loop: split at a variable in the problem until problem is solved+ checkLHS :: LHSState -> TCM LHSState+ checkLHS st@(LHSState problem sigma dpi asb) = do+ problem <- insertImplicitProblem problem -- inserting implicits no longer preserve solvedness+ if isSolvedProblem problem -- since we might insert eta expanded record patterns+ then do+ noShadowingOfConstructors c problem+ return $ st { lhsProblem = problem }+ else do+ sp <- splitProblem problem+ reportSDoc "tc.lhs.split" 20 $ text "splitting completed" case sp of Left NothingToSplit -> nothingToSplitError problem Left (SplitPanic err) -> __IMPOSSIBLE__@@ -354,27 +354,28 @@ -- plug the hole with a lit pattern let ip = plugHole (LitP lit) iph- iperm = expandP (fromIntegral hix) 0 $ fst (problemOutPat problem)+ iperm = expandP hix 0 $ fst (problemOutPat problem) -- substitute the literal in p1 and sigma and dpi and asb let delta1 = problemTel p0 delta2 = absApp (fmap problemTel p1) (Lit lit)- rho = [ var i | i <- [0..size delta2 - 1] ]- ++ [ raise (size delta2) $ Lit lit ]- ++ [ var i | i <- [size delta2 ..] ]- where- var i = Var i []- sigma' = substs rho sigma- dpi' = substs rho dpi- asb0 = substs rho asb- ip' = substs rho ip+ rho = liftS (size delta2) $ singletonS (Lit lit)+ -- rho = [ var i | i <- [0..size delta2 - 1] ]+ -- ++ [ raise (size delta2) $ Lit lit ]+ -- ++ [ var i | i <- [size delta2 ..] ]+ sigma' = applySubst rho sigma+ dpi' = applySubst rho dpi+ asb0 = applySubst rho asb+ ip' = applySubst rho ip+ rest' = applySubst rho (problemRest problem) -- Compute the new problem let ps' = problemInPat p0 ++ problemInPat (absBody p1) delta' = abstract delta1 delta2- problem' = Problem ps' (iperm, ip') delta'+ problem' = Problem ps' (iperm, ip') delta' rest' asb' = raise (size delta2) (map (\x -> AsB x (Lit lit) a) xs) ++ asb0- checkLHS problem' sigma' dpi' asb'+ st' <- updateProblemRest (LHSState problem' sigma' dpi' asb')+ checkLHS st' -- Split on constructor pattern Right (Split p0 xs (Arg h rel@@ -396,7 +397,7 @@ let delta1 = problemTel p0 let typeOfSplitVar = Arg h rel a - reportSDoc "tc.lhs.top" 10 $ sep+ reportSDoc "tc.lhs.split" 10 $ sep [ text "checking lhs" , nest 2 $ text "tel =" <+> prettyTCM (problemTel problem) , nest 2 $ text "rel =" <+> (text $ show rel)@@ -412,11 +413,11 @@ ] ] - Con c' [] <- constructorForm =<< normalise (Con c [])+ Con c' [] <- ignoreSharing <$> (constructorForm =<< normalise (Con c [])) c <- return $ c' `withRangeOf` c ca <- defType <$> getConstInfo c - reportSDoc "tc.lhs.top" 20 $ nest 2 $ vcat+ reportSDoc "tc.lhs.split" 20 $ nest 2 $ vcat [ text "ca =" <+> prettyTCM ca , text "vs =" <+> prettyList (map prettyTCM vs) ]@@ -425,7 +426,10 @@ let a = ca `piApply` vs -- It will end in an application of the datatype- TelV gamma' ca@(El _ (Def d' us)) <- telView a+ (gamma', ca, d', us) <- do+ TelV gamma' ca@(El _ def) <- telView a+ let Def d' us = ignoreSharing def+ return (gamma', ca, d', us) -- This should be the same datatype as we split on unless (d == d') $ typeError $ ShouldBeApplicationOf ca d'@@ -444,7 +448,7 @@ ] -} -- Insert implicit patterns- qs' <- insertImplicitPatterns qs gamma'+ qs' <- insertImplicitPatterns ExpandLast qs gamma' unless (size qs' == size gamma') $ typeError $ WrongNumberOfConstructorArguments c (size gamma') (size qs')@@ -455,7 +459,7 @@ da <- (`piApply` vs) . defType <$> getConstInfo d -- Compute the flexible variables- let flex = flexiblePatterns (problemInPat p0 ++ qs')+ flex <- flexiblePatterns (problemInPat p0 ++ qs') reportSDoc "tc.lhs.top" 15 $ addCtxTel delta1 $ sep [ text "preparing to unify"@@ -473,17 +477,17 @@ sub0 <- addCtxTel (delta1 `abstract` gamma) $ unifyIndices_ flex (raise (size gamma) da) (drop (size vs) us) (raise (size gamma) ws) - -- We should subsitute c ys for x in Δ₂ and sigma+ -- We should substitute c ys for x in Δ₂ and sigma let ys = teleArgs gamma delta2 = absApp (raise (size gamma) $ fmap problemTel p1) (Con c ys)- rho0 = [ var i | i <- [0..size delta2 - 1] ]- ++ [ raise (size delta2) $ Con c ys ]- ++ [ var i | i <- [size delta2 + size gamma ..] ]- where- var i = Var i []- sigma0 = substs rho0 sigma- dpi0 = substs rho0 dpi- asb0 = substs rho0 asb+ rho0 = liftS (size delta2) $ Con c ys :# raiseS (size gamma)+ -- rho0 = [ var i | i <- [0..size delta2 - 1] ]+ -- ++ [ raise (size delta2) $ Con c ys ]+ -- ++ [ var i | i <- [size delta2 + size gamma ..] ]+ sigma0 = applySubst rho0 sigma+ dpi0 = applySubst rho0 dpi+ asb0 = applySubst rho0 asb+ rest0 = applySubst rho0 (problemRest problem) reportSDoc "tc.lhs.top" 15 $ addCtxTel (delta1 `abstract` gamma) $ nest 2 $ vcat [ text "delta2 =" <+> prettyTCM delta2@@ -500,14 +504,14 @@ -- all variables which will be bound by patterns. -- Thus, it has to be raised by 1 (the "hole" variable) -- plus the length of delta2 (the variables coming after the hole).- storedPatternType <- ifM (isRecord d)+ storedPatternType <- ifM (isJust <$> isRecord d) (return $ Just $ raise (1 + size delta2) $ typeOfSplitVar) (return $ Nothing) -- Plug the hole in the out pattern with c ys- let ysp = map (fmap (VarP . fst)) $ telToList gamma+ let ysp = map (argFromDom . fmap (VarP . fst)) $ telToList gamma ip = plugHole (ConP c storedPatternType ysp) iph- ip0 = substs rho0 ip+ ip0 = applySubst rho0 ip -- Δ₁Γ ⊢ sub0, we need something in Δ₁ΓΔ₂ -- Also needs to be padded with Nothing's to have the right length.@@ -523,8 +527,8 @@ , text "ip0 =" <+> text (show ip0) ] reportSDoc "tc.lhs.top" 15 $ nest 2 $ vcat- [ text "rho0 =" <+> text (show $ take (size delta1 + size gamma + size delta2) rho0)- ] -- Andreas, this is showing some inital segment of rho0, not necessarily the most meaningful one+ [ text "rho0 =" <+> text (show rho0)+ ] -- Instantiate the new telescope with the given substitution (delta', perm, rho, instTypes) <- instantiateTel sub newTel@@ -547,16 +551,17 @@ -} -- Compute the new dot pattern instantiations let ps0' = problemInPat p0 ++ qs' ++ problemInPat (absBody p1)- newDpi = dotPatternInsts ps0' (substs rho sub) instTypes reportSDoc "tc.lhs.top" 15 $ nest 2 $ vcat- [ text "subst rho sub =" <+> brackets (fsep $ punctuate comma $ map (maybe (text "_") prettyTCM) (substs rho sub))+ [ text "subst rho sub =" <+> brackets (fsep $ punctuate comma $ map (maybe (text "_") prettyTCM) (applySubst rho sub)) , text "ps0' =" <+> brackets (fsep $ punctuate comma $ map prettyA ps0') ] + newDpi <- dotPatternInsts ps0' (applySubst rho sub) instTypes+ -- The final dpis and asbs are the new ones plus the old ones substituted by ρ- let dpi' = substs rho dpi0 ++ newDpi- asb' = substs rho $ asb0 ++ raise (size delta2) (map (\x -> AsB x (Con c ys) ca) xs)+ let dpi' = applySubst rho dpi0 ++ newDpi+ asb' = applySubst rho $ asb0 ++ raise (size delta2) (map (\x -> AsB x (Con c ys) ca) xs) reportSDoc "tc.lhs.top" 15 $ nest 2 $ vcat [ text "dpi' = " <+> brackets (fsep $ punctuate comma $ map prettyTCM dpi')@@ -564,7 +569,8 @@ ] -- Apply the substitution to the type- let sigma' = substs rho sigma0+ let sigma' = applySubst rho sigma0+ rest' = applySubst rho rest0 reportSDoc "tc.lhs.inst" 15 $ nest 2 $ text "ps0 = " <+> brackets (fsep $ punctuate comma $ map prettyA ps0')@@ -575,15 +581,15 @@ -- Compute the new permutation of the out patterns. This is the composition of -- the new permutation with the expansion of the old permutation to -- reflect the split.- let perm' = expandP (fromIntegral hix) (size gamma) $ fst (problemOutPat problem)+ let perm' = expandP hix (size gamma) $ fst (problemOutPat problem) iperm' = perm `composeP` perm' -- Instantiate the out patterns let ip' = instantiatePattern sub perm' ip0- newip = substs rho ip'+ newip = applySubst rho ip' -- Construct the new problem- let problem' = Problem ps' (iperm', newip) delta'+ let problem' = Problem ps' (iperm', newip) delta' rest' reportSDoc "tc.lhs.top" 12 $ sep [ text "new problem"@@ -602,8 +608,23 @@ , text "newip =" <+> text (show newip) ] + -- if rest type reduces,+ -- extend the split problem by previously not considered patterns+ st'@(LHSState problem'@(Problem ps' (iperm', ip') delta' rest')+ sigma' dpi' asb')+ <- updateProblemRest $ LHSState problem' sigma' dpi' asb'++ reportSDoc "tc.lhs.top" 12 $ sep+ [ text "new problem from rest"+ , nest 2 $ vcat+ [ text "ps' = " <+> fsep (map prettyA ps')+ , text "delta' = " <+> prettyTCM delta'+ , text "ip' =" <+> text (show ip')+ , text "iperm' =" <+> text (show iperm')+ ]+ ] -- Continue splitting- checkLHS problem' sigma' dpi' asb'+ checkLHS st' -- Ensures that we are not performing pattern matching on codata.
src/full/Agda/TypeChecking/Rules/LHS/Implicit.hs view
@@ -1,7 +1,8 @@-{-# LANGUAGE CPP #-}+{-# LANGUAGE CPP, PatternGuards #-} module Agda.TypeChecking.Rules.LHS.Implicit where +import Data.Maybe import Control.Applicative import Agda.Syntax.Common@@ -14,27 +15,32 @@ import Agda.TypeChecking.Implicit import Agda.TypeChecking.Substitute import Agda.TypeChecking.Pretty+import Agda.TypeChecking.Records+import Agda.TypeChecking.Reduce import Agda.TypeChecking.Rules.LHS.Problem +import Agda.Utils.Monad+ #include "../../../undefined.h" import Agda.Utils.Impossible -- | Insert implicit patterns in a problem. insertImplicitProblem :: Problem -> TCM Problem-insertImplicitProblem (Problem ps qs tel) = do+insertImplicitProblem (Problem ps qs tel pr) = do reportSDoc "tc.lhs.imp" 15 $ sep [ text "insertImplicits" , nest 2 $ brackets $ fsep $ punctuate comma $ map prettyA ps , nest 2 $ prettyTCM tel ]- ps' <- insertImplicitPatterns ps tel- return $ Problem ps' qs tel+ ps' <- insertImplicitPatterns ExpandLast ps tel+ return $ Problem ps' qs tel pr -- | Insert implicit patterns in a list of patterns.-insertImplicitPatterns :: [NamedArg A.Pattern] -> Telescope -> TCM [NamedArg A.Pattern]-insertImplicitPatterns ps EmptyTel = return ps-insertImplicitPatterns ps tel@(ExtendTel _ tel') = case ps of+insertImplicitPatterns :: ExpandHidden -> [NamedArg A.Pattern] -> Telescope -> TCM [NamedArg A.Pattern]+insertImplicitPatterns exh ps EmptyTel = return ps+insertImplicitPatterns DontExpandLast [] tel = return []+insertImplicitPatterns exh ps tel@(ExtendTel arg tel') = case ps of [] -> do i <- insImp dummy tel case i of@@ -45,16 +51,38 @@ i <- insImp p tel case i of Just [] -> __IMPOSSIBLE__- Just hs -> insertImplicitPatterns (implicitPs hs ++ p : ps) tel- Nothing -> (p :) <$> insertImplicitPatterns ps (absBody tel')+ Just hs -> insertImplicitPatterns exh (implicitPs hs ++ p : ps) tel+ Nothing+ | A.ImplicitP{} <- namedArg p,+ argHiding p /= Instance -> do+ -- Eta expand implicit patterns of record type (issue 473),+ -- but not instance arguments since then they won't be found+ -- by the instance search+ a <- reduce (unDom arg)+ case ignoreSharing $ unEl a of+ Def d _ ->+ -- Andreas, 2012-06-10: only expand guarded records,+ -- otherwise we might run into an infinite loop+ ifM (isEtaRecord d) (do+ c <- getRecordConstructor d+ fs <- getRecordFieldNames d+ let qs = map (implicitP <$) fs+ continue ((A.ConP (PatRange noRange) (A.AmbQ [c]) qs <$) <$> p)+ ) (continue p)+ _ -> continue p+ | otherwise -> continue p+ where+ continue p = (p :) <$> insertImplicitPatterns exh ps (absBody tel') where- dummy = defaultArg $ unnamed ()+ dummy = defaultNamedArg () - insImp x tel = case insertImplicit x $ map (fmap fst) $ telToList tel of+ insImp x tel = case insertImplicit x $ map (argFromDom . fmap fst) $ telToList tel of BadImplicits -> typeError $ WrongHidingInLHS (telePi tel $ sort Prop) NoSuchName x -> typeError $ WrongHidingInLHS (telePi tel $ sort Prop) ImpInsert n -> return $ Just n NoInsertNeeded -> return Nothing + implicitP = unnamed $ A.ImplicitP $ PatRange $ noRange+ implicitPs [] = []- implicitPs (h : hs) = (Arg h Relevant $ unnamed $ A.ImplicitP $ PatRange $ noRange) : implicitPs hs+ implicitPs (h : hs) = (Arg h Relevant implicitP) : implicitPs hs
src/full/Agda/TypeChecking/Rules/LHS/Instantiate.hs view
@@ -8,14 +8,17 @@ import Agda.TypeChecking.Monad import Agda.TypeChecking.Substitute hiding (Substitution)+import qualified Agda.TypeChecking.Substitute as S (Substitution) import Agda.TypeChecking.Free import Agda.TypeChecking.Pretty import Agda.TypeChecking.Reduce import Agda.TypeChecking.Telescope import Agda.TypeChecking.Rules.LHS.Problem+-- import Agda.TypeChecking.Rules.LHS.ProblemRest import Agda.TypeChecking.Rules.LHS.Split ( asView ) +import Agda.Utils.List import Agda.Utils.Permutation import Agda.Utils.Size @@ -25,7 +28,7 @@ -- | Instantiate a telescope with a substitution. Might reorder the telescope. -- @instantiateTel (Γ : Tel)(σ : Γ --> Γ) = Γσ~@ -- Monadic only for debugging purposes.-instantiateTel :: Substitution -> Telescope -> TCM (Telescope, Permutation, [Term], [Type])+instantiateTel :: Substitution -> Telescope -> TCM (Telescope, Permutation, S.Substitution, [Dom Type]) instantiateTel s tel = liftTCM $ do tel <- normalise tel@@ -38,9 +41,18 @@ ] -- Shrinking permutation (removing Justs) (and its complement, and reverse)- let ps = Perm (size s) [ i | (i, Nothing) <- zip [0..] $ reverse s ]+ let n = size s+ {- OLD CODE, leave as documentation+ ps = Perm n [ i | (i, Nothing) <- zip [0..] $ reverse s ] psR = reverseP ps- psC = Perm (size s) [ i | (i, Just _) <- zip [0..] $ reverse s ]+ psC = Perm n [ i | (i, Just _) <- zip [0..] $ reverse s ]+ -}+ deal (i, Nothing) = Left i+ deal (i, Just _ ) = Right i+ (is, isC) = mapEither deal $ zip [0..] $ reverse s+ ps = Perm n is+ psR = reverseP ps+ psC = Perm n isC reportSDoc "tc.lhs.inst" 10 $ vcat [ nest 2 $ text $ "ps = " ++ show ps@@ -57,6 +69,9 @@ -- rho : [Tm Γσ]Γ let rho = mkSubst s' + reportSDoc "tc.lhs.inst" 15 $ nest 2 $+ text "rho = " <+> text (show rho)+ -- tel1 : [Type Γ]Γ let tel1 = flattenTel tel names1 = teleNames tel@@ -67,7 +82,7 @@ ] -- tel2 : [Type Γσ]Γ- let tel2 = substs rho tel1+ let tel2 = applySubst rho tel1 reportSDoc "tc.lhs.inst" 15 $ nest 2 $ text "tel2 =" <+> brackets (fsep $ punctuate comma $ map prettyTCM tel2)@@ -83,7 +98,7 @@ p <- case reorderTel tel3 of Nothing -> inContext [] $ do xs <- mapM freshName_ names3- addCtxs xs (Arg NotHidden Relevant prop) $ do+ addCtxs xs (Dom NotHidden Relevant prop) $ do err <- sep [ text "Recursive telescope in left hand side:" , fsep [ parens (prettyTCM x <+> text ":" <+> prettyTCM t) | (x, t) <- zip xs tel3 ]@@ -97,7 +112,7 @@ let rho' = renaming (reverseP p) -- tel4 : [Type Γσ~]Γσ~- let tel4 = substs rho' (permute p tel3)+ let tel4 = applySubst rho' (permute p tel3) names4 = permute p names3 reportSDoc "tc.lhs.inst" 15 $ nest 2 $@@ -111,34 +126,33 @@ -- remember the types of the instantiations -- itypes : [Type Γσ~]Γ*- let itypes = substs rho' $ permute psC $ map unArg tel2+ let itypes = applySubst rho' $ permute psC tel2 - return (tel5, composeP p ps, substs rho' rho, itypes)+ return (tel5, composeP p ps, applySubst rho' rho, itypes) where - -- Turn a Substitution ([Maybe Term]) into a substitution ([Term])- -- (The result is an infinite list)- mkSubst :: [Maybe Term] -> [Term]+ -- Turn a Substitution ([Maybe Term]) into a substitution (S.Substitution)+ mkSubst :: [Maybe Term] -> S.Substitution mkSubst s = rho 0 s'- where s' = s ++ repeat Nothing- rho i (Nothing : s) = Var i [] : rho (i + 1) s- rho i (Just u : s) = u : rho i s- rho _ [] = __IMPOSSIBLE__+ where s' = s+ rho i (Nothing : s) = var i :# rho (i + 1) s+ rho i (Just u : s) = u :# rho i s+ rho i [] = raiseS i -- | Produce a nice error message when splitting failed nothingToSplitError :: Problem -> TCM a-nothingToSplitError (Problem ps _ tel) = splitError ps tel+nothingToSplitError (Problem ps _ tel pr) = splitError ps tel where splitError [] EmptyTel = __IMPOSSIBLE__ splitError (_:_) EmptyTel = __IMPOSSIBLE__ splitError [] ExtendTel{} = __IMPOSSIBLE__ splitError (p : ps) (ExtendTel a tel)- | isBad p = traceCall (CheckPattern (strip p) EmptyTel (unArg a)) $ case strip p of+ | isBad p = traceCall (CheckPattern (strip p) EmptyTel (unDom a)) $ case strip p of A.DotP _ e -> typeError $ UninstantiatedDotPattern e- p -> typeError $ IlltypedPattern p (unArg a)+ p -> typeError $ IlltypedPattern p (unDom a) | otherwise = underAbstraction a tel $ \tel -> splitError ps tel where- strip = snd . asView . namedThing . unArg+ strip = snd . asView . namedArg isBad p = case strip p of A.DotP _ _ -> True A.ConP _ _ _ -> True
src/full/Agda/TypeChecking/Rules/LHS/Problem.hs view
@@ -1,8 +1,8 @@-+{-# LANGUAGE CPP #-} module Agda.TypeChecking.Rules.LHS.Problem where import Control.Monad.Error-import Data.Monoid+import Data.Monoid ( Monoid(mappend,mempty) ) import Agda.Syntax.Common import Agda.Syntax.Literal@@ -11,49 +11,128 @@ import Agda.Syntax.Internal.Pattern import qualified Agda.Syntax.Abstract as A -import Agda.TypeChecking.Substitute+import Agda.TypeChecking.Substitute as S+import Agda.TypeChecking.Pretty import Agda.Utils.Permutation +{- UNUSED+#include "../../../undefined.h"+import Agda.Utils.Impossible+-}+ type Substitution = [Maybe Term] type FlexibleVars = [Nat] +-- | State of typechecking a LHS; input to 'split'.+-- [Ulf Norell's PhD, page. 35]+--+-- In @Problem ps p delta@,+-- @ps@ are the user patterns of supposed type @delta@.+-- @p@ is the pattern resulting from the splitting. data Problem' p = Problem { problemInPat :: [NamedArg A.Pattern] , problemOutPat :: p , problemTel :: Telescope+ , problemRest :: ProblemRest }++-- | User patterns that could not be given a type yet.+--+-- Example:+-- @+-- f : (b : Bool) -> if b then Nat else Nat -> Nat+-- f true = zero+-- f false zero = zero+-- f false (suc n) = n+-- @+-- In this sitation, for clause 2, we construct an initial problem+-- @+-- problemInPat = [false]+-- problemTel = (b : Bool)+-- problemRest.restPats = [zero]+-- problemRest.restType = if b then Nat else Nat -> Nat+-- @+-- As we instantiate @b@ to @false@, the 'restType' reduces to+-- @Nat -> Nat@ and we can move pattern @zero@ over to @problemInPat@.+data ProblemRest = ProblemRest+ { restPats :: [NamedArg A.Pattern] -- ^ non-empty list of user patterns which could not yet be typed+ , restType :: Type -- ^ type eliminated by 'restPats'+ }+ data Focus = Focus { focusCon :: QName , focusConArgs :: [NamedArg A.Pattern] , focusRange :: Range , focusOutPat :: OneHolePatterns- , focusHoleIx :: Int -- ^ index of focused variable in the out patterns+ , focusHoleIx :: Int -- ^ Index of focused variable in the out patterns. , focusDatatype :: QName , focusParams :: [Arg Term] , focusIndices :: [Arg Term]- , focusType :: Type -- type of variable we are splitting, kept for record patterns (Andreas, 2010-09-09)+ , focusType :: Type -- ^ Type of variable we are splitting, kept for record patterns. } | LitFocus Literal OneHolePatterns Int Type+ data SplitProblem = Split ProblemPart [Name] (Arg Focus) (Abs ProblemPart) -- ^ the [Name]s give the as-bindings for the focus data SplitError = NothingToSplit | SplitPanic String -type ProblemPart = Problem' ()--instance Raise (Problem' p) where- raiseFrom m k p = p { problemTel = raiseFrom m k $ problemTel p }- renameFrom m k p = p { problemTel = renameFrom m k $ problemTel p }- -- | The permutation should permute @allHoles@ of the patterns to correspond to -- the abstract patterns in the problem. type Problem = Problem' (Permutation, [Arg Pattern])+type ProblemPart = Problem' () +data DotPatternInst = DPI A.Expr Term (Dom Type)+data AsBinding = AsB Name Term Type++-- | State worked on during the main loop of checking a lhs.+data LHSState = LHSState+ { lhsProblem :: Problem+ , lhsSubst :: S.Substitution+ , lhsDPI :: [DotPatternInst]+ , lhsAsB :: [AsBinding]+ }++instance Subst ProblemRest where+ applySubst rho p = p { restType = applySubst rho $ restType p }++instance Subst (Problem' p) where+ applySubst rho p = p { problemTel = applySubst rho $ problemTel p+ , problemRest = applySubst rho $ problemRest p }++instance Subst DotPatternInst where+ applySubst rho (DPI e v a) = uncurry (DPI e) $ applySubst rho (v,a)++instance Subst AsBinding where+ applySubst rho (AsB x v a) = uncurry (AsB x) $ applySubst rho (v, a)++instance PrettyTCM DotPatternInst where+ prettyTCM (DPI e v a) = sep+ [ prettyA e <+> text "="+ , nest 2 $ prettyTCM v <+> text ":"+ , nest 2 $ prettyTCM a+ ]++instance PrettyTCM AsBinding where+ prettyTCM (AsB x v a) =+ sep [ prettyTCM x <> text "@" <> parens (prettyTCM v)+ , nest 2 $ text ":" <+> prettyTCM a+ ]+ instance Error SplitError where noMsg = NothingToSplit strMsg = SplitPanic +-- | 'ProblemRest' is a right dominant monoid.+-- @pr1 \`mappend\` pr2 = pr2@ unless @pr2 = mempty@, then it is @pr1@.+-- Basically, this means that the left 'ProblemRest' is discarded, so+-- use it wisely!+instance Monoid ProblemRest where+ mempty = ProblemRest [] typeDontCare+ mappend pr (ProblemRest [] _) = pr+ mappend _ pr = pr+ instance Monoid p => Monoid (Problem' p) where- mempty = Problem [] mempty EmptyTel- Problem ps1 qs1 tel1 `mappend` Problem ps2 qs2 tel2 =- Problem (ps1 ++ ps2) (mappend qs1 qs2) (abstract tel1 tel2)+ mempty = Problem [] mempty EmptyTel mempty+ Problem ps1 qs1 tel1 pr1 `mappend` Problem ps2 qs2 tel2 pr2 =+ Problem (ps1 ++ ps2) (mappend qs1 qs2) (abstract tel1 tel2) (mappend pr1 pr2)
+ src/full/Agda/TypeChecking/Rules/LHS/ProblemRest.hs view
@@ -0,0 +1,129 @@+{-# LANGUAGE CPP, TupleSections #-}++module Agda.TypeChecking.Rules.LHS.ProblemRest where++import Control.Applicative++import Data.Monoid++import Agda.Syntax.Common+import Agda.Syntax.Position+import Agda.Syntax.Info+import Agda.Syntax.Internal+import qualified Agda.Syntax.Abstract as A++import Agda.TypeChecking.Monad+import Agda.TypeChecking.Pretty+import Agda.TypeChecking.Reduce+import Agda.TypeChecking.Telescope+import Agda.TypeChecking.Implicit+import Agda.TypeChecking.Substitute+import Agda.TypeChecking.Pretty++import Agda.TypeChecking.Rules.LHS.Problem+import Agda.TypeChecking.Rules.LHS.Implicit++import Agda.Utils.Size+import Agda.Utils.Permutation++#include "../../../undefined.h"+import Agda.Utils.Impossible+++-- MOVED from LHS:+-- | Rename the variables in a telescope using the names from a given pattern+useNamesFromPattern :: [NamedArg A.Pattern] -> Telescope -> Telescope+useNamesFromPattern ps = telFromList . zipWith ren (toPats ps ++ repeat dummy) . telToList+ where+ dummy = A.WildP __IMPOSSIBLE__+ ren (A.VarP x) (Dom NotHidden r (_, a)) = Dom NotHidden r (show x, a)+ ren A.PatternSynP{} _ = __IMPOSSIBLE__ -- ensure there are no syns left+ ren _ a = a+ toPats = map namedArg++-- | Are there any untyped user patterns left?+noProblemRest :: Problem -> Bool+noProblemRest (Problem _ _ _ (ProblemRest ps _)) = null ps++-- | Get the type of clause. Only valid if 'noProblemRest'.+typeFromProblem :: Problem -> Type+typeFromProblem (Problem _ _ _ (ProblemRest _ a)) = a++-- | Construct an initial 'split' 'Problem' from user patterns.+problemFromPats :: [NamedArg A.Pattern] -- ^ The user patterns.+ -> Type -- ^ The type the user patterns eliminate.+ -> TCM Problem -- ^ The initial problem constructed from the user patterns.+problemFromPats ps a = do+ TelV tel0' b0 <- telView a+ -- For the initial problem, do not insert trailing implicits.+ -- This has the effect of not including trailing hidden domains in the problem telescope.+ -- In all later call to insertImplicitPatterns, we can then use ExpandLast.+ ps <- insertImplicitPatterns DontExpandLast ps tel0'+ -- unless (size tel0' >= size ps) $ typeError $ TooManyArgumentsInLHS a+ let tel0 = useNamesFromPattern ps tel0'+ (as, bs) = splitAt (size ps) $ telToList tel0+ (ps1,ps2) = splitAt (size as) ps+ gamma = telFromList as+ b = telePi (telFromList bs) b0+ -- now (gamma -> b) = a and |gamma| = |ps1|+ pr = ProblemRest ps2 b+ -- patterns ps2 eliminate type b++ -- internal patterns start as all variables+ ips = map (argFromDom . fmap (VarP . fst)) as++ -- the initial problem for starting the splitting+ problem = Problem ps1 (idP $ size ps1, ips) gamma pr+ reportSDoc "tc.lhs.problem" 10 $+ vcat [ text "checking lhs -- generated an initial split problem:"+ , nest 2 $ vcat+ [ text "ps =" <+> fsep (map prettyA ps)+ , text "a =" <+> prettyTCM a+ , text "a' =" <+> prettyTCM (telePi tel0 b0)+ , text "a'' =" <+> prettyTCM (telePi tel0' b0)+ , text "xs =" <+> text (show $ map (fst . unDom) as)+ , text "tel0 =" <+> prettyTCM tel0+ , text "b0 =" <+> prettyTCM b0+ , text "gamma =" <+> prettyTCM gamma+ , text "b =" <+> addCtxTel gamma (prettyTCM b)+ ]+ ]+ return problem++{-+todoProblemRest :: ProblemRest+todoProblemRest = mempty+-}++-- | Try to move patterns from the problem rest into the problem.+-- Possible if type of problem rest has been updated to a function type.+updateProblemRest_ :: Problem -> TCM (Nat, Problem)+updateProblemRest_ p@(Problem _ _ _ (ProblemRest [] _)) = return (0, p)+updateProblemRest_ p@(Problem ps0 (perm0@(Perm n0 is0), qs0) tel0 (ProblemRest ps a)) = do+ TelV tel' b0 <- telView a+ case tel' of+ EmptyTel -> return (0, p) -- no progress+ ExtendTel{} -> do -- a did reduce to a pi-type+ ps <- insertImplicitPatterns DontExpandLast ps tel'+ let tel = useNamesFromPattern ps tel'+ (as, bs) = splitAt (size ps) $ telToList tel+ (ps1,ps2) = splitAt (size as) ps+ tel1 = telFromList $ telToList tel0 ++ as+ b = telePi (telFromList bs) b0+ pr = ProblemRest ps2 b+ qs1 = map (argFromDom . fmap (VarP . fst)) as+ n = size as+ perm1 = liftP n perm0 -- IS: Perm (n0 + n) $ is0 ++ [n0..n0+n-1]+ return $ (n,) $ Problem (ps0 ++ ps1) (perm1, raise n qs0 ++ qs1) tel1 pr++updateProblemRest :: LHSState -> TCM LHSState+updateProblemRest st@LHSState { lhsProblem = p } = do+ (n, p') <- updateProblemRest_ p+ if (n == 0) then return st else do+ let tau = raiseS n+ return $ LHSState+ { lhsProblem = p'+ , lhsSubst = applySubst tau (lhsSubst st)+ , lhsDPI = applySubst tau (lhsDPI st)+ , lhsAsB = applySubst tau (lhsAsB st)+ }
src/full/Agda/TypeChecking/Rules/LHS/Split.hs view
@@ -4,7 +4,7 @@ import Control.Applicative import Control.Monad.Error-import Data.Monoid+import Data.Monoid (mempty, mappend) import Data.List import Data.Traversable hiding (mapM, sequence) @@ -25,7 +25,8 @@ import Agda.TypeChecking.Constraints import Agda.TypeChecking.Conversion import Agda.TypeChecking.Rules.LHS.Problem-import Agda.TypeChecking.Rules.Term+import Agda.TypeChecking.Rules.LHS.ProblemRest+-- import Agda.TypeChecking.Rules.Term import Agda.TypeChecking.Monad.Builtin import Agda.TypeChecking.Free import Agda.TypeChecking.Irrelevance@@ -56,10 +57,10 @@ ++ "the literal to the corresponding constructor pattern, so " ++ "you probably don't want to do it this way." | otherwise -> do- Con z _ <- primZero- Con s _ <- primSuc+ Con z _ <- ignoreSharing <$> primZero+ Con s _ <- ignoreSharing <$> primSuc let zero = A.ConP info (A.AmbQ [setRange r z]) []- suc p = A.ConP info (A.AmbQ [setRange r s]) [defaultArg $ unnamed p]+ suc p = A.ConP info (A.AmbQ [setRange r s]) [defaultNamedArg p] info = A.PatRange r p' = foldr ($) zero $ genericReplicate n suc return $ foldr (A.AsP info) p' xs@@ -68,7 +69,7 @@ -- | Split a problem at the first constructor of datatype type. Implicit -- patterns should have been inserted. splitProblem :: Problem -> TCM (Either SplitError SplitProblem)-splitProblem (Problem ps (perm, qs) tel) = do+splitProblem (Problem ps (perm, qs) tel pr) = do reportS "tc.lhs.split" 20 $ "initiating splitting\n" runErrorT $ splitP ps (permute perm $ zip [0..] $ allHoles qs) tel@@ -81,7 +82,7 @@ splitP (p : ps) ((i, q) : qs) tel0@(ExtendTel a tel) = do let tryAgain = splitP (p : ps) ((i, q) : qs) tel0 p <- lift $ expandLitPattern p- case asView $ namedThing $ unArg p of+ case asView $ namedArg p of -- Case: literal pattern (xs, p@(A.LitP lit)) -> do@@ -90,45 +91,45 @@ -- not indexed. -- Andreas, 2010-09-07 cannot split on irrelevant args- when (unusableRelevance $ argRelevance a) $+ when (unusableRelevance $ domRelevance a) $ typeError $ SplitOnIrrelevant p a b <- lift $ litType lit ok <- lift $ do- noConstraints (equalType (unArg a) b)+ noConstraints (equalType (unDom a) b) return True `catchError` \_ -> return False if ok then return $ Split mempty xs- (fmap (LitFocus lit q i) a)- (fmap (Problem ps ()) tel)+ (argFromDom $ fmap (LitFocus lit q i) a)+ (fmap (\ tel -> Problem ps () tel __IMPOSSIBLE__) tel) else keepGoing -- Case: constructor pattern (xs, p@(A.ConP _ (A.AmbQ cs) args)) -> do- a' <- liftTCM $ reduce $ unArg a- case unEl a' of-- -- Type is a meta and constructor is unambiguous,- -- in this case try to instantiate the meta.- MetaV{} | [c] <- cs -> do- ok <- lift $ do- Constructor{ conData = d } <- theDef <$> getConstInfo c- dt <- defType <$> getConstInfo d- vs <- newArgsMeta dt- El _ (Sort s) <- reduce $ apply dt vs- (True <$ noConstraints (equalType a' (El s $ Def d vs)))- `catchError` \_ -> return False- if not ok then keepGoing else- tryAgain+ let tryInstantiate a'+ | [c] <- cs = do+ -- Type is blocked by a meta and constructor is unambiguous,+ -- in this case try to instantiate the meta.+ ok <- lift $ do+ Constructor{ conData = d } <- theDef <$> getConstInfo c+ dt <- defType <$> getConstInfo d+ vs <- newArgsMeta dt+ Sort s <- ignoreSharing . unEl <$> reduce (apply dt vs)+ (True <$ noConstraints (equalType a' (El s $ Def d vs)))+ `catchError` \_ -> return False+ if ok then tryAgain else keepGoing+ | otherwise = keepGoing+ ifBlockedType (unDom a) (const tryInstantiate) $ \ a' -> do+ case ignoreSharing $ unEl a' of -- Subcase: split type is a Def Def d vs -> do def <- liftTCM $ theDef <$> getConstInfo d unless (defIsRecord def) $ -- cannot split on irrelevant or non-strict things- when (unusableRelevance $ argRelevance a) $ do+ when (unusableRelevance $ domRelevance a) $ do -- Andreas, 2011-10-04 unless allowed by option allowed <- liftTCM $ optExperimentalIrrelevance <$> pragmaOptions unless allowed $ typeError $ SplitOnIrrelevant p a@@ -140,7 +141,7 @@ case mp of Nothing -> keepGoing Just np ->- liftTCM $ traceCall (CheckPattern p EmptyTel (unArg a)) $ do -- TODO: wrong telescope+ liftTCM $ traceCall (CheckPattern p EmptyTel (unDom a)) $ do -- TODO: wrong telescope -- Check that we construct something in the right datatype c <- do cs' <- mapM canonicalName cs@@ -168,50 +169,118 @@ ] whenM (optWithoutK <$> pragmaOptions) $- wellFormedIndices pars ixs+ wellFormedIndices a' return $ Split mempty xs- (fmap (Focus c args (getRange p) q i d pars ixs) a)- (fmap (Problem ps ()) tel)+ (argFromDom $ fmap (Focus c args (getRange p) q i d pars ixs) a)+ (fmap (\ tel -> Problem ps () tel __IMPOSSIBLE__) tel) -- Subcase: split type is not a Def _ -> keepGoing -- Case: neither literal nor constructor pattern p -> keepGoing where keepGoing = do- let p0 = Problem [p] () (ExtendTel a $ fmap (const EmptyTel) tel)+ let p0 = Problem [p] () (ExtendTel a $ fmap (const EmptyTel) tel) mempty Split p1 xs foc p2 <- underAbstraction a tel $ \tel -> splitP ps qs tel return $ Split (mappend p0 p1) xs foc p2 --- | Checks that the indices are constructors (or literals) applied to--- distinct variables which do not occur free in the parameters.+-- | Takes a type, which must be a data or record type application,+-- and checks that the indices are constructors (or literals) applied+-- to distinct variables which do not occur free in the parameters.+-- For the purposes of this check parameters count as constructor+-- arguments; parameters are reconstructed from the given type.+--+-- Precondition: The type must be a data or record type application. -wellFormedIndices- :: [Arg Term] -- ^ Parameters.- -> [Arg Term] -- ^ Indices.- -> TCM ()-wellFormedIndices pars ixs = do- pars <- normalise pars- ixs <- normalise ixs- vs <- case constructorApplications ixs of- Nothing -> typeError $ IndicesNotConstructorApplications ixs- Just vs -> return vs+wellFormedIndices :: Type -> TCM ()+wellFormedIndices t = do+ t <- reduce t++ reportSDoc "tc.lhs.split.well-formed" 10 $+ fsep [ text "Checking if indices are well-formed:"+ , nest 2 $ prettyTCM t+ ]++ (pars, ixs) <- normalise =<< case ignoreSharing $ unEl t of+ Def d args -> do+ def <- getConstInfo d+ typedArgs <- args `withTypesFrom` defType def++ let noPars = case theDef def of+ Datatype { dataPars = n } -> n+ Record { recPars = n } -> n+ _ -> __IMPOSSIBLE__+ (pars, ixs) = genericSplitAt noPars typedArgs+ return (map fst pars, ixs)++ _ -> __IMPOSSIBLE__++ mvs <- constructorApplications ixs+ vs <- case mvs of+ Nothing -> typeError $+ IndicesNotConstructorApplications (map fst ixs)+ Just vs -> return vs+ unless (fastDistinct vs) $- typeError $ IndexVariablesNotDistinct ixs- case filter snd $ zip vs (map (`freeIn` pars) vs) of- [] -> return ()- (v , _) : _ -> typeError $ IndexFreeInParameter v pars+ typeError $ IndexVariablesNotDistinct vs (map fst ixs)++ case map fst $ filter snd $ zip vs (map (`freeIn` pars) vs) of+ [] -> return ()+ vs ->+ typeError $ IndicesFreeInParameters vs (map fst ixs) pars+ where -- | If the term consists solely of constructors (or literals)- -- applied to variables, then the variables are returned, and- -- otherwise nothing.- constructorApplication :: Term -> Maybe [Nat]- constructorApplication (Var x []) = Just [x]- constructorApplication (Con c args) = constructorApplications args- constructorApplication (Lit {}) = Just []- constructorApplication _ = Nothing+ -- applied to variables (after parameter reconstruction), then the+ -- variables are returned, and otherwise nothing.+ constructorApplication :: Term+ -> Type -- ^ The term's type.+ -> TCM (Maybe [Nat])+ constructorApplication (Var x []) _ = return (Just [x])+ constructorApplication (Lit {}) _ = return (Just [])+ constructorApplication (Shared p) t = constructorApplication (derefPtr p) t+ constructorApplication (Con c conArgs) (El _ (Def d dataArgs)) = do+ conDef <- getConstInfo c+ dataDef <- getConstInfo d - constructorApplications :: [Arg Term] -> Maybe [Nat]- constructorApplications args =- concat <$> mapM (constructorApplication . unArg) args+ let noPars = case theDef dataDef of+ Datatype { dataPars = n } -> n+ Record { recPars = n } -> n+ _ -> __IMPOSSIBLE__+ pars = genericTake noPars dataArgs+ allArgs = pars ++ conArgs++ reportSDoc "tc.lhs.split.well-formed" 20 $+ fsep [ text "Reconstructed parameters:"+ , nest 2 $+ prettyTCM (Con c []) <+>+ text "(:" <+> prettyTCM (defType conDef) <> text ")" <+>+ text "<<" <+> prettyTCM pars <+> text ">>" <+>+ prettyTCM conArgs+ ]++ constructorApplications =<< allArgs `withTypesFrom` defType conDef++ constructorApplication _ _ = return Nothing++ constructorApplications :: [(Arg Term, Dom Type)] -> TCM (Maybe [Nat])+ constructorApplications args = do+ xs <- mapM (\(e, t) -> constructorApplication (unArg e) (ignoreSharingType $ unDom t))+ args+ return (concat <$> sequence xs)++-- | @args \`withTypesFrom\` t@ returns the arguments @args@ paired up+-- with their types, taken from @t@, which is assumed to be a @length+-- args@-ary pi.+--+-- Precondition: @t@ has to start with @length args@ pis.++withTypesFrom :: Args -> Type -> TCM [(Arg Term, Dom Type)]+[] `withTypesFrom` _ = return []+(arg : args) `withTypesFrom` t = do+ t <- reduce t+ case ignoreSharing $ unEl t of+ Pi a b -> ((arg, a) :) <$>+ args `withTypesFrom` absApp b (unArg arg)+ _ -> __IMPOSSIBLE__
src/full/Agda/TypeChecking/Rules/LHS/Unify.hs view
@@ -15,7 +15,7 @@ import qualified Data.Map as Map import Data.List hiding (sort) -import Data.Generics (Typeable, Data)+import Data.Typeable (Typeable) import Data.Foldable (Foldable) import Data.Traversable (Traversable,traverse) @@ -32,6 +32,7 @@ import Agda.TypeChecking.Reduce import Agda.TypeChecking.Pretty import Agda.TypeChecking.Substitute hiding (Substitution)+import qualified Agda.TypeChecking.Substitute as S import Agda.TypeChecking.Telescope import Agda.TypeChecking.Free import Agda.TypeChecking.Records@@ -86,13 +87,7 @@ reportPostponing :: Unify () reportPostponing = tell Possibly -{- -- | Check whether unification proceeded without postponement.-listenResult :: Unify () -> Unify UnifyOutput-listenResult m = snd <$> listen m--}---- | Check whether unification proceeded without postponement. ifClean :: Unify () -> Unify a -> Unify a -> Unify a ifClean m t e = do ok <- snd <$> listen m@@ -100,16 +95,6 @@ Definitely -> t Possibly -> e -{---- | Check whether unification proceeded without postponement.-ifClean :: Unify a -> (a -> Unify b) -> (a -> Unify b) -> Unify b-ifClean m t e = do- (ok, a) <- listen m- case ok of- Definitely -> t a- Possibly -> e a--}- data Equality = Equal TypeHH Term Term type Sub = Map Nat Term @@ -134,17 +119,7 @@ constructorMismatchHH :: TypeHH -> Term -> Term -> Unify a constructorMismatchHH aHH = constructorMismatch (leftHH aHH) -- do not report heterogenity-{--constructorMismatchHH (Hom a) u v = constructorMismatch a u v-constructorMismatchHH (Het a1 a2) u v = constructorMismatch a1 u v--} -{--instance MonadReader TCEnv Unify where- ask = U . lift $ ask- local k (U m) = U . lift . lift . lift $ local k m--}- instance MonadState TCState Unify where get = U . lift . lift . lift . lift $ get put = U . lift . lift . lift . lift . put@@ -153,13 +128,8 @@ liftTCM = U . lift . lift . lift . lift instance Subst Equality where- substs us (Equal a s t) = Equal (substs us a) (substs us s) (substs us t)- substUnder n u (Equal a s t) = Equal (substUnder n u a) (substUnder n u s) (substUnder n u t)--{- UNUSED-getSub :: Unify Sub-getSub = U $ gets uniSub--}+ applySubst rho (Equal a s t) =+ Equal (applySubst rho a) (applySubst rho s) (applySubst rho t) onSub :: (Sub -> a) -> Unify a onSub f = U $ gets $ f . uniSub@@ -187,20 +157,7 @@ if ok then return () else addEquality a u v checkEqualityHH aHH@(Het a1 a2) u v = -- reportPostponing -- enter "dirty" mode addEqualityHH aHH u v -- postpone, enter "dirty" mode-{--checkEqualityHH (Het a1 a2) u v = noConstraints $ do- equalType a1 a2- equalTerm a1 u v--}-{--checkEqualityHH :: MonadTCM tcm => TypeHH -> Term -> Term -> tcm ()-checkEqualityHH aHH u v = do- a <- forceHom aHH- cs <- equalTerm a u v- if null cs then return () else addEquality a u v--} - -- | Check whether heterogeneous situation is really homogeneous. -- If not, give up. forceHom :: TypeHH -> TCM Type@@ -217,24 +174,6 @@ reportPostponing U $ modify $ \s -> s { uniConstr = Equal aHH u v : uniConstr s } -{--addEquality :: Type -> Term -> Term -> Unify ()-addEquality a u v = do- reportPostponing- U $ modify $ \s -> s { uniConstr = Equal a u v : uniConstr s }--}--{--addEquality :: Type -> Term -> Term -> Unify ()-addEquality a u v = do- p <- askPostpone- case p of- MayPostpone -> do- reportPostponing- U $ modify $ \s -> s { uniConstr = Equal a u v : uniConstr s }- MayNotPostpone -> checkEquality a u v--}- takeEqualities :: Unify [Equality] takeEqualities = U $ do s <- get@@ -246,7 +185,7 @@ occursCheck :: Nat -> Term -> Type -> Unify () occursCheck i u a = do let fv = freeVars u- v = Var i []+ v = var i case occurrence i fv of -- Andreas, 2011-04-14 -- a strongly rigid recursive occurrences signals unsolvability@@ -265,13 +204,20 @@ (|->) :: Nat -> (Term, Type) -> Unify () i |-> (u, a) = do occursCheck i u a- liftTCM $ reportSDoc "tc.lhs.unify" 15 $ prettyTCM (Var i []) <+> text ":=" <+> prettyTCM u+ liftTCM $ reportSDoc "tc.lhs.unify" 15 $ prettyTCM (var i) <+> text ":=" <+> prettyTCM u modSub $ Map.insert i (killRange u)+ -- Apply substitution to itself (issue 552)+ rho <- onSub id+ rho' <- traverse ureduce rho+ modSub $ const rho' -makeSubstitution :: Sub -> [Term]-makeSubstitution sub = map val [0..]+makeSubstitution :: Sub -> S.Substitution+makeSubstitution sub+ | Map.null sub = idS+ | otherwise = map val [0 .. highestIndex] ++# raiseS (highestIndex + 1) where- val i = maybe (Var i []) id $ Map.lookup i sub+ highestIndex = fst $ Map.findMax sub+ val i = maybe (var i) id $ Map.lookup i sub -- | Apply the current substitution on a term and reduce to weak head normal form. class UReduce t where@@ -280,14 +226,14 @@ instance UReduce Term where ureduce u = doEtaContractImplicit $ do rho <- onSub makeSubstitution- liftTCM $ etaContract =<< normalise (substs rho u)+ liftTCM $ etaContract =<< normalise (applySubst rho u) -- Andreas, 2011-06-22, fix related to issue 423 -- To make eta contraction work better, I switched reduce to normalise. -- I hope the performance penalty is not big (since we are dealing with -- l.h.s. terms only). -- A systematic solution would make unification type-directed and -- eta-insensitive...--- liftTCM $ etaContract =<< reduce (substs rho u)+-- liftTCM $ etaContract =<< reduce (applySubst rho u) instance UReduce Type where ureduce (El s t) = El s <$> ureduce t@@ -302,7 +248,7 @@ -- | Take a substitution σ and ensure that no variables from the domain appear -- in the targets. The context of the targets is not changed.--- TODO: can this be expressed using makeSubstitution and substs?+-- TODO: can this be expressed using makeSubstitution and applySubst? flattenSubstitution :: Substitution -> Substitution flattenSubstitution s = foldr instantiate s is where@@ -312,12 +258,11 @@ instantiate :: Nat -> Substitution -> Substitution instantiate i s = map (fmap $ inst i u) s where- Just u = s !! fromIntegral i+ Just u = s !! i inst :: Nat -> Term -> Term -> Term- inst i u v = substs us v- where us = [var j | j <- [0..i - 1] ] ++ [u] ++ [var j | j <- [i + 1..] ]- var j = Var j []+ inst i u v = applySubst us v+ where us = [var j | j <- [0..i - 1] ] ++# u :# raiseS (i + 1) data UnificationResult = Unifies Substitution | NoUnify Type Term Term | DontKnow TCErr @@ -325,7 +270,7 @@ data HomHet a = Hom a -- ^ homogeneous | Het a a -- ^ heterogeneous- deriving (Typeable, Data, Show, Eq, Ord, Functor, Foldable, Traversable)+ deriving (Typeable, Show, Eq, Ord, Functor, Foldable, Traversable) isHom :: HomHet a -> Bool isHom Hom{} = True@@ -343,13 +288,8 @@ rightHH (Hom a) = a rightHH (Het a1 a2) = a2 -instance (Raise a) => Raise (HomHet a) where- raiseFrom n m = fmap (raiseFrom n m)- renameFrom n f = fmap (renameFrom n f)- instance (Subst a) => Subst (HomHet a) where- substUnder n u = fmap (substUnder n u)- substs us = fmap (substs us)+ applySubst rho u = fmap (applySubst rho) u instance (PrettyTCM a) => PrettyTCM (HomHet a) where prettyTCM (Hom a) = prettyTCM a@@ -358,7 +298,7 @@ type TermHH = HomHet Term type TypeHH = HomHet Type --type FunViewHH = FunV TypeHH-type TelHH = Tele (Arg TypeHH)+type TelHH = Tele (Dom TypeHH) type TelViewHH = TelV TypeHH absAppHH :: SubstHH t tHH => Abs t -> TermHH -> tHH@@ -405,6 +345,10 @@ substUnderHH n u = fmap $ substUnderHH n u trivialHH = fmap trivialHH +instance SubstHH a b => SubstHH (Dom a) (Dom b) where+ substUnderHH n u = fmap $ substUnderHH n u+ trivialHH = fmap trivialHH+ instance SubstHH a b => SubstHH (Abs a) (Abs b) where substUnderHH n u (Abs x v) = Abs x $ substUnderHH (n + 1) u v substUnderHH n u (NoAbs x v) = NoAbs x $ substUnderHH n u v@@ -452,7 +396,7 @@ Left (StronglyRigidOccurrence a u v) -> return $ NoUnify a u v Left (GenericUnifyException err) -> fail err Right _ -> do- checkEqualities $ substs (makeSubstitution s) eqs+ checkEqualities $ applySubst (makeSubstitution s) eqs let n = maximum $ (-1) : flex return $ Unifies $ flattenSubstitution [ Map.lookup i s | i <- [0..n] ] `catchError` \err -> return $ DontKnow err@@ -460,6 +404,7 @@ flexible i = i `elem` flex flexibleTerm (Var i []) = flexible i+ flexibleTerm (Shared p) = flexibleTerm (derefPtr p) flexibleTerm _ = False {- Andreas, 2011-09-12@@ -501,7 +446,7 @@ unifyConArgs _ [] (_ : _) = __IMPOSSIBLE__ unifyConArgs _ [] [] = return () unifyConArgs EmptyTel _ _ = __IMPOSSIBLE__- unifyConArgs tel0@(ExtendTel a@(Arg _ rel bHH) tel) us0@(arg@(Arg _ _ u) : us) vs0@(Arg _ _ v : vs) = do+ unifyConArgs tel0@(ExtendTel a@(Dom _ rel bHH) tel) us0@(arg@(Arg _ _ u) : us) vs0@(Arg _ _ v : vs) = do liftTCM $ reportSDoc "tc.lhs.unify" 15 $ sep [ text "unifyConArgs" -- , nest 2 $ parens (prettyTCM tel0)@@ -513,7 +458,7 @@ (text $ "tel0 = " ++ show tel0) - -- Andreas, Ulf, 2011-09-08 (AIM XVI)+ -- Andreas, Ulf, 2011-09-08 (AIM XIV) -- in case of dependent function type, we cannot postpone -- unification of u and v, otherwise us or vs might be ill-typed -- skip irrelevant parts@@ -531,11 +476,6 @@ unifyConArgs (tel `absAppHH` uHH) us vs -{-- unifyArgs :: Type -> [Arg Term] -> [Arg Term] -> Unify ()- unifyArgs a = unifyArgsHH (Hom a)--}- -- | Used for arguments of a 'Def', not 'Con'. unifyArgs :: Type -> [Arg Term] -> [Arg Term] -> Unify () unifyArgs _ (_ : _) [] = __IMPOSSIBLE__@@ -549,21 +489,22 @@ , nest 2 $ prettyList $ map prettyTCM vs0 ] a <- ureduce a -- Q: reduce sufficient?- case unEl a of+ case ignoreSharing $ unEl a of Pi b _ -> do -- Andreas, Ulf, 2011-09-08 (AIM XVI) -- in case of dependent function type, we cannot postpone -- unification of u and v, otherwise us or vs might be ill-typed let dep = dependent $ unEl a -- skip irrelevant parts- unless (argRelevance b == Irrelevant) $+ unless (domRelevance b == Irrelevant) $ (if dep then noPostponing else id) $- unify (unArg b) u v+ unify (unDom b) u v arg <- traverse ureduce arg unifyArgs (a `piApply` [arg]) us vs _ -> __IMPOSSIBLE__ where dependent (Pi _ NoAbs{}) = False dependent (Pi b c) = 0 `relevantIn` absBody c+ dependent (Shared p) = dependent (derefPtr p) dependent _ = False -- | Check using conversion check.@@ -604,9 +545,10 @@ unifyHH aHH u v = do u <- liftTCM . constructorForm =<< ureduce u v <- liftTCM . constructorForm =<< ureduce v+ aHH <- ureduce aHH liftTCM $ reportSDoc "tc.lhs.unify" 15 $ sep [ text "unifyHH"- , nest 2 $ parens $ prettyTCM u+ , nest 2 $ (parens $ prettyTCM u) <+> text "=?=" , nest 2 $ parens $ prettyTCM v , nest 2 $ text ":" <+> prettyTCM aHH ]@@ -614,7 +556,7 @@ isSizeName <- liftTCM isSizeNameTest -- check whether types have the same shape- (aHH, sh) <- shapeViewHH =<< ureduce aHH+ (aHH, sh) <- shapeViewHH aHH case sh of ElseSh -> checkEqualityHH aHH u v -- not a type or not same types @@ -641,18 +583,18 @@ , nest 2 $ prettyTCM v <> if flexibleTerm v then text " (flexible)" else empty , nest 2 $ text ":" <+> prettyTCM aHH ]- case (u, v) of+ case (ignoreSharing u, ignoreSharing v) of -- Ulf, 2011-06-19 -- We don't want to worry about levels here.- (Level l, v) -> do+ (Level l, _) -> do u <- liftTCM $ reallyUnLevelView l unifyAtomHH aHH u v- (u, Level l) -> do+ (_, Level l) -> do v <- liftTCM $ reallyUnLevelView l unifyAtomHH aHH u v (Var i us, Var j vs) | i == j -> checkEqualityHH aHH u v- (Var i [], v) | homogeneous && flexible i -> i |->> (v, a)- (u, Var j []) | homogeneous && flexible j -> j |->> (u, a)+ (Var i [], _) | homogeneous && flexible i -> i |->> (v, a)+ (_, Var j []) | homogeneous && flexible j -> j |->> (u, a) (Con c us, Con c' vs) | c == c' -> do r <- ureduce =<< liftTCM (dataOrRecordTypeHH c aHH)@@ -684,7 +626,7 @@ -- We can instantiate metas if the other term is inert (constructor application) -- Andreas, 2011-09-13: test/succeed/IndexInference needs this feature.- (MetaV m us, v) | homogeneous -> do+ (MetaV m us, _) | homogeneous -> do ok <- liftTCM $ instMeta a m us v liftTCM $ reportSDoc "tc.lhs.unify" 40 $ vcat [ fsep [ text "inst meta", text $ if ok then "(ok)" else "(not ok)" ]@@ -692,7 +634,7 @@ ] if ok then unify a u v else addEquality a u v- (u, MetaV m vs) | homogeneous -> do+ (_, MetaV m vs) | homogeneous -> do ok <- liftTCM $ instMeta a m vs u liftTCM $ reportSDoc "tc.lhs.unify" 40 $ vcat [ fsep [ text "inst meta", text $ if ok then "(ok)" else "(not ok)" ]@@ -728,104 +670,10 @@ unify :: Type -> Term -> Term -> Unify () unify a = unifyHH (Hom a)-{-- unify :: Type -> Term -> Term -> Unify ()- unify a u v = do- u <- constructorForm =<< ureduce u- v <- constructorForm =<< ureduce v- reportSDoc "tc.lhs.unify" 15 $- sep [ text "unify"- , nest 2 $ parens $ prettyTCM u- , nest 2 $ parens $ prettyTCM v- , nest 2 $ text ":" <+> prettyTCM a- ]- isSize <- isSizeType a- if isSize then unifySizes u v- else unifyAtom a u v--} unifyAtom :: Type -> Term -> Term -> Unify () unifyAtom a = unifyAtomHH (Hom a) -{-- unifyAtom :: Type -> Term -> Term -> Unify ()- unifyAtom a u v = do- reportSDoc "tc.lhs.unify" 15 $- sep [ text "unifyAtom"- , nest 2 $ prettyTCM u <> if flexibleTerm u then text " (flexible)" else empty- , nest 2 $ text "=?="- , nest 2 $ prettyTCM v <> if flexibleTerm v then text " (flexible)" else empty- , nest 2 $ text ":" <+> prettyTCM a- ]- case (u, v) of- -- Ulf, 2011-06-19- -- We don't want to worry about levels here.- (Level l, v) -> do- u <- liftTCM $ reallyUnLevelView l- unifyAtom a u v- (u, Level l) -> do- v <- liftTCM $ reallyUnLevelView l- unifyAtom a u v- -- Andreas, 2011-05-30- -- Force equality now rather than postponing it with addEquality- (Var i us, Var j vs) | i == j -> checkEquality a u v- (Var i [], v) | flexible i -> i |->> (v, a)- (u, Var j []) | flexible j -> j |->> (u, a)- (Con c us, Con c' vs)- | c == c' -> do- a' <- dataOrRecordType c a- unifyArgs a' us vs- | otherwise -> constructorMismatch a u v- -- Definitions are ok as long as they can't reduce (i.e. datatypes/axioms)- (Def d us, Def d' vs)- | d == d' -> do- -- d must be a data, record or axiom- def <- getConstInfo d- let ok = case theDef def of- Datatype{} -> True- Record{} -> True- Axiom{} -> True- _ -> False- inj <- optInjectiveTypeConstructors <$> pragmaOptions- if inj && ok- then unifyArgs (defType def) us vs- else addEquality a u v-{- Andreas: checkEquality breaks Data.Vec.Equality- we need an injectivity test for data types, Vec A n is injective!- else checkEquality a u v- -- Andreas: force equality now instead of postponing- -- We do not want to end up in a heterogeneous situation,- -- where u and v have different types--}- -- Andreas, 2011-05-30: if heads disagree, abort- -- but do not raise "mismatch" because otherwise type constructors- -- would be distinct- | otherwise -> typeError $ UnequalTerms CmpEq u v a- (Lit l1, Lit l2)- | l1 == l2 -> return ()- | otherwise -> constructorMismatch a u v-- -- We can instantiate metas if the other term is inert (constructor application)- (MetaV m us, v) -> do- ok <- liftTCM $ instMeta a m us v- reportSDoc "tc.lhs.unify" 40 $- vcat [ fsep [ text "inst meta", text $ if ok then "(ok)" else "(not ok)" ]- , nest 2 $ sep [ prettyTCM u, text ":=", prettyTCM =<< normalise u ]- ]- if ok then unify a u v- else addEquality a u v- (u, MetaV m vs) -> do- ok <- liftTCM $ instMeta a m vs u- reportSDoc "tc.lhs.unify" 40 $- vcat [ fsep [ text "inst meta", text $ if ok then "(ok)" else "(not ok)" ]- , nest 2 $ sep [ prettyTCM v, text ":=", prettyTCM =<< normalise v ]- ]- if ok then unify a u v- else addEquality a u v- -- Andreas, 2011-05-30: If I put checkEquality below, then Issue81 fails- -- because there are definitions blocked by flexibles that need postponement- _ -> addEquality a u v--} -- The contexts are transient when unifying, so we should just instantiate to -- constructor heads and generate fresh metas for the arguments. Beware of -- constructors that aren't fully applied.@@ -841,14 +689,14 @@ Just (v', b, vs) -> do margs <- do -- The new metas should have the same dependencies as the original meta- mi <- getMetaInfo <$> lookupMeta m+ mv <- lookupMeta m -- Only generate metas for the arguments v' is actually applied to -- (in case of partial application) TelV tel0 _ <- telView b let tel = telFromList $ take (length vs) $ telToList tel0 b' = telePi tel (sort Prop)- withMetaInfo mi $ do+ withMetaInfo' mv $ do tel <- getContextTelescope -- important: create the meta in the same environment as the original meta newArgsMetaCtx b' tel us@@ -858,13 +706,8 @@ inertApplication :: Type -> Term -> TCM (Maybe (Term, Type, Args)) inertApplication a v =- case v of+ case ignoreSharing v of Con c vs -> fmap (\ b -> (Con c [], b, vs)) <$> dataOrRecordType c a-{-- Con c vs -> do- b <- dataOrRecordType c a- return $ Just (Con c [], b, vs)--} Def d vs -> do def <- getConstInfo d let ans = Just (Def d [], defType def, vs)@@ -896,7 +739,10 @@ -- data/record parameters dataOrRecordType' c a = do -- The telescope ends with a datatype or a record.- TelV _ (El _ (Def d args)) <- telView a+ (d, args) <- do+ TelV _ (El _ def) <- telView a+ let Def d args = ignoreSharing def+ return (d, args) def <- theDef <$> getConstInfo d r <- case def of Datatype{dataPars = n} -> Just . ((,) n) . defType <$> getConstInfo c@@ -934,61 +780,22 @@ _ -> return Nothing -{--dataOrRecordType :: MonadTCM tcm- => QName -- ^ Constructor name.- -> Type -- ^ Type of constructor application (must end in data/record).- -> tcm (Maybe Type) -- ^ Type of constructor, applied to pars.-dataOrRecordType c a = fmap snd <$> dataOrRecordType' c a--dataOrRecordType' :: MonadTCM tcm- => QName -- ^ Constructor name.- -> Type -- ^ Type of constructor application (must end in data/record).- -> tcm (Maybe (QName, -- ^ Name of data/record type.- Type)) -- ^ Type of constructor, applied to pars.-dataOrRecordType' c a = do- -- The telescope ends with a datatype or a record.- TelV _ (El _ (Def d args)) <- telView a- def <- theDef <$> getConstInfo d- r <- case def of- Datatype{dataPars = n} -> Just . ((,) n) . defType <$> getConstInfo c- Record {recPars = n} -> Just . ((,) n) <$> getRecordConstructorType d- _ -> return Nothing- return $ fmap (\ (n, a') -> (d, a' `apply` genericTake n args)) r---- | Heterogeneous situation.--- @a1@ and @a2@ need to end in same datatype/record.-dataOrRecordTypeHH :: MonadTCM tcm- => QName -- ^ Constructor name.- -> TypeHH -- ^ Type(s) of constructor application (must end in same data/record).- -> tcm (Maybe TypeHH) -- ^ Type of constructor, instantiated possibly heterogeneously to parameters.-dataOrRecordTypeHH c (Hom a) = fmap Hom <$> dataOrRecordType c a-dataOrRecordTypeHH c (Het a1 a2) = do- r1 <- dataOrRecordType' c a1- r2 <- dataOrRecordType' c a2 -- b2 may have different parameters than b1!- return $ case (r1, r2) of- (Just (d1, b1), Just (d2, b2)) | d1 == d2 -> Just $ Het b1 b2- _ -> Nothing--}- -- | Views an expression (pair) as type shape. Fails if not same shape. data ShapeView a- = PiSh (Arg a) (Abs a)- | FunSh (Arg a) a+ = PiSh (Dom a) (Abs a)+ | FunSh (Dom a) a | DefSh QName -- ^ data/record | VarSh Nat -- ^ neutral type | LitSh Literal -- ^ built-in type | SortSh | MetaSh -- ^ some meta | ElseSh -- ^ not a type or not definitely same shape- deriving (Typeable, Data, Show, Eq, Ord, Functor)+ deriving (Typeable, Show, Eq, Ord, Functor) -- | Return the type and its shape. Expects input in (u)reduced form. shapeView :: Type -> Unify (Type, ShapeView Type) shapeView t = do--- t <- liftTCM $ reduce t -- DO NOT REDUCE!--- -- t <- ureduce t -- BUG!! substitutes bound variables in telescope!- return . (t,) $ case unEl t of+ return . (t,) $ case ignoreSharing $ unEl t of Pi a (NoAbs _ b) -> FunSh a b Pi a (Abs x b) -> PiSh a (Abs x b) Def d vs -> DefSh d@@ -1008,13 +815,13 @@ (a2, sh2) <- shapeView a2 return . (Het a1 a2,) $ case (sh1, sh2) of - (PiSh (Arg h1 r1 a1) b1, PiSh (Arg h2 r2 a2) b2)+ (PiSh (Dom h1 r1 a1) b1, PiSh (Dom h2 r2 a2) b2) | h1 == h2 ->- PiSh (Arg h1 (min r1 r2) (Het a1 a2)) (Abs (absName b1) (Het (absBody b1) (absBody b2)))+ PiSh (Dom h1 (min r1 r2) (Het a1 a2)) (Abs (absName b1) (Het (absBody b1) (absBody b2))) - (FunSh (Arg h1 r1 a1) b1, FunSh (Arg h2 r2 a2) b2)+ (FunSh (Dom h1 r1 a1) b1, FunSh (Dom h2 r2 a2) b2) | h1 == h2 ->- FunSh (Arg h1 (min r1 r2) (Het a1 a2)) (Het b1 b2)+ FunSh (Dom h1 (min r1 r2) (Het a1 a2)) (Het b1 b2) (DefSh d1, DefSh d2) | d1 == d2 -> DefSh d1 (VarSh x1, VarSh x2) | x1 == x2 -> VarSh x1
src/full/Agda/TypeChecking/Rules/Record.hs view
@@ -13,7 +13,9 @@ import qualified Agda.Syntax.Info as Info import Agda.TypeChecking.Monad+import Agda.TypeChecking.Monad.Builtin ( primIrrAxiom ) import Agda.TypeChecking.Substitute+import Agda.TypeChecking.Telescope import Agda.TypeChecking.Reduce import Agda.TypeChecking.Pretty import Agda.TypeChecking.Polarity@@ -26,7 +28,11 @@ import Agda.Utils.Size import Agda.Utils.Permutation+import Agda.Utils.Monad +import Agda.Interaction.Options++ #include "../../undefined.h" import Agda.Utils.Impossible @@ -46,9 +52,9 @@ -- -- [@fields@] List of field signatures. ---checkRecDef :: Info.DefInfo -> QName -> Maybe A.QName -> --Maybe A.Constructor ->- [A.LamBinding] -> A.Expr -> [A.Constructor] -> TCM ()-checkRecDef i name con ps contel fields =+checkRecDef :: Info.DefInfo -> QName -> Maybe Induction -> Maybe A.QName ->+ [A.LamBinding] -> A.Expr -> [A.Field] -> TCM ()+checkRecDef i name ind con ps contel fields = traceCall (CheckRecDef (getRange i) (qnameName name) ps fields) $ do reportSDoc "tc.rec" 10 $ vcat [ text "checking record def" <+> prettyTCM name@@ -74,33 +80,18 @@ -- A record is irrelevant if all of its fields are. -- In this case, the associated module parameter will be irrelevant. -- See issue 392.- recordRelevance = minimum $ Irrelevant : (map argRelevance $ telToList ftel)+ recordRelevance = minimum $ Irrelevant : (map domRelevance $ telToList ftel) -- Compute correct type of constructor -- t = tel -> t0 where t0 must be a sort s t0' <- normalise t0- s <- case unEl t0' of+ s <- case ignoreSharing $ unEl t0' of Sort s -> return s _ -> typeError $ ShouldBeASort t0 gamma <- getContextTelescope- let m = qnameToMName name- -- make record parameters hidden and non-stricts irrelevant- htel = map hideAndRelParams $ telToList tel- -- record type (name applied to parameters)- rect = El s $ Def name $ reverse- [ Arg h r (Var i [])- | (i, Arg h r _) <- zip [0..] $ reverse $ telToList gamma- ]- telh' h = telFromList $ htel ++ [Arg h recordRelevance ("r", rect)]- tel' = telh' NotHidden- telIFS = telh' Instance- extWithRH h ret = underAbstraction (Arg h recordRelevance rect) (Abs "" ()) $ \_ -> ret- extWithR = extWithRH NotHidden- ext (Arg h r (x, t)) = addCtx x (Arg h r t)-{- UNUSED- extHide (Arg h r (x, t)) = addCtx x (Arg Hidden r t)--}+ -- record type (name applied to parameters)+ let rect = El s $ Def name $ teleArgs gamma -- Put in @rect@ as correct target of constructor type. -- Andreas, 2011-05-10 use telePi_ instead of telePi to preserve@@ -123,7 +114,9 @@ getName (A.ScopedDecl _ [f]) = getName f getName _ = [] - addConstant name $ Defn Relevant name t0 (defaultDisplayForm name) 0 noCompiledRep+ indCo = maybe Inductive id ind -- default is 'Inductive' for backwards compatibility but should maybe be 'Coinductive'++ addConstant name $ Defn Relevant name t0 [] [] (defaultDisplayForm name) 0 noCompiledRep $ Record { recPars = 0 , recClause = Nothing , recCon = conName@@ -133,24 +126,30 @@ , recTel = ftel , recAbstr = Info.defAbstract i , recEtaEquality = True+ , recInduction = indCo+ -- determined by positivity checker:+ , recRecursive = False+{- , recPolarity = [] , recArgOccurrences = []+-}+ , recMutual = [] } -- Add record constructor to signature -- Andreas, 2011-05-19 moved this here, it was below the record module -- creation addConstant conName $- Defn Relevant conName contype (defaultDisplayForm conName) 0 noCompiledRep $+ Defn Relevant conName contype [] [] (defaultDisplayForm conName) 0 noCompiledRep $ Constructor { conPars = 0 , conSrcCon = conName , conData = name , conAbstr = Info.defAbstract conInfo- , conInd = Inductive+ , conInd = indCo } -- Check that the fields fit inside the sort- let dummy = Var 0 [] -- We're only interested in the sort here+ let dummy = var 0 -- We're only interested in the sort here telePi ftel (El s dummy) `fitsIn` s {- Andreas, 2011-04-27 WRONG because field types are checked again@@ -161,9 +160,18 @@ -} -- make record parameters hidden- ctx <- (reverse . map hide . take (size tel)) <$> getContext+ ctx <- (reverse . map (mapDomHiding $ const Hidden) . take (size tel)) <$> getContext - escapeContext (size tel) $ flip (foldr ext) ctx $ extWithR $ do+ let -- name of record module+ m = qnameToMName name+ -- make record parameters hidden and non-stricts irrelevant+ htel = map hideAndRelParams $ telToList tel+ tel' = telFromList $ htel ++ [Dom NotHidden recordRelevance ("r", rect)]+ ext (Dom h r (x, t)) = addCtx x (Dom h r t)++ escapeContext (size tel) $ flip (foldr ext) ctx $+ -- the record variable has the empty name by intention, see issue 208+ underAbstraction (Dom NotHidden recordRelevance rect) (Abs "" ()) $ \_ -> do reportSDoc "tc.rec.def" 10 $ sep [ text "record section:" , nest 2 $ sep@@ -177,13 +185,13 @@ addSection m (size tel') -- Check the types of the fields- -- ftel <- checkRecordFields m name tel s [] (size fields) fields withCurrentModule m $ checkRecordProjections m name conName tel' (raise 1 ftel) fields -- Andreas, 2011-05-19 here was the code "Add record constr..." - computePolarity name+ -- Andreas 2012-02-13: postpone polarity computation until after positivity check+ -- computePolarity name return () @@ -195,7 +203,7 @@ [@q@ ] name of the record constructor - [@tel@ ] parameters+ [@tel@ ] parameters and record variable r ("self") [@ftel@ ] telescope of fields @@ -214,21 +222,21 @@ checkProjs ftel1 ftel2 (A.ScopedDecl scope fs' : fs) = setScope scope >> checkProjs ftel1 ftel2 (fs' ++ fs) - checkProjs ftel1 (ExtendTel _ ftel2) (A.Field info x (Arg h rel t) : fs) = do- -- check the type (in the context of the telescope)- -- the previous fields will be free in+ checkProjs ftel1 (ExtendTel (Dom h rel t) ftel2) (A.Field info x _ : fs) = do+ -- Andreas, 2012-06-07:+ -- Issue 387: It is wrong to just type check field types again+ -- because then meta variables are created again.+ -- Instead, we take the field type t from the field telescope. reportSDoc "tc.rec.proj" 5 $ sep- [ text "checking projection"+ [ text "checking projection" <+> text (show x) , nest 2 $ vcat [ text "top =" <+> (inContext [] . prettyTCM =<< getContextTelescope)+ , text "tel =" <+> prettyTCM tel , text "ftel1 =" <+> prettyTCM ftel1- , text "ftel2 =" <+> addCtxTel ftel1 (underAbstraction_ ftel2 prettyTCM) , text "t =" <+> prettyTCM t+ , text "ftel2 =" <+> addCtxTel ftel1 (underAbstraction_ ftel2 prettyTCM) ] ]- -- Andreas, 2011-04-27 work on rhs of ':'- -- WRONG: t <- workOnTypes $ isType_ t- t <- isType_ t -- Andreas, 2010-09-09 The following comments are misleading, TODO: update -- in fact, tel includes the variable of record type as last one@@ -249,11 +257,20 @@ -- The type of the projection function should be -- {tel} -> (r : R Δ) -> t -- where Δ = Γ, tel is the current context-- let finalt = telePi tel t projname = qualify m $ qnameName x+ projcall = Def projname [defaultArg $ var 0]+ -- the recursive call+ recurse = checkProjs (abstract ftel1 $ ExtendTel (Dom h rel t)+ $ Abs (show $ qnameName projname) EmptyTel)+ (ftel2 `absApp` projcall) fs + reportSDoc "tc.rec.proj" 25 $ nest 2 $ text "finalt=" <+> prettyTCM finalt++ -- Andreas, 2012-02-20 do not add irrelevant projections if+ -- disabled by --no-irrelevant-projections+ ifM (return (rel == Irrelevant) `and2M` do not . optIrrelevantProjections <$> pragmaOptions) recurse $ do+ reportSDoc "tc.rec.proj" 10 $ sep [ text "adding projection" , nest 2 $ prettyTCM projname <+> text ":" <+> inContext [] (prettyTCM finalt)@@ -264,23 +281,42 @@ -- Ulf, 2011-08-22: actually we're dropping the parameters from the -- projection functions so the body is now -- P.xi (r _ .. x .. _) = x+ -- Andreas, 2012-01-12: irrelevant projections get translated to+ -- P.xi (r _ .. x .. _) = irrAxiom {level of t} {t} x+ -- PROBLEM: because of dropped parameters, cannot refer to t + -- compute body modification for irrelevant projections+ bodyMod <- do+ case rel of+ Relevant -> return $ \ n x -> x -- no modification+ Irrelevant -> return $ \ n x -> DontCare x++{- 2012-04-02: DontCare instead of irrAxiom+ Irrelevant -> do+ irrAxiom <- primIrrAxiom+ let sortToLevel (Type l) = l+ sortToLevel _ = Max [ClosedLevel 0] -- something random here, we don't care a lot+ levelOfT = Level $ sortToLevel $ getSort t+ return $ \ n x -> let -- mkArg t = Arg Hidden Relevant $ raise n t+ -- ERR: Variables of t not in Scope!+ mkArg t = Arg Hidden Relevant $ Sort Prop+ in apply irrAxiom [mkArg levelOfT, mkArg (unEl t), Arg NotHidden Irrelevant x]+-}+ _ -> __IMPOSSIBLE__+ let -- Andreas, 2010-09-09: comment for existing code -- split the telescope into parameters (ptel) and the type or the record -- (rt) which should be R ptel (ptel,[rt]) = splitAt (size tel - 1) $ telToList tel conp = defaultArg- $ ConP q (Just (fmap snd rt))- $ zipWith3 Arg- (map argHiding (telToList ftel))- (map argRelevance (telToList ftel))- [ VarP "x" | _ <- [1..size ftel] ]+ $ ConP q (Just (argFromDom $ fmap snd rt))+ [ Arg h r (VarP "x") | Dom h r _ <- telToList ftel ] nobind 0 = id nobind n = Bind . Abs "_" . nobind (n - 1) body = nobind (size ftel1) $ Bind . Abs "x" $ nobind (size ftel2)- $ Body $ Var (size ftel2) []+ $ Body $ bodyMod (size ftel) $ Var (size ftel2) [] cltel = ftel clause = Clause { clauseRange = getRange info , clauseTel = killRange cltel@@ -289,11 +325,21 @@ , clauseBody = body } + reportSDoc "tc.rec.proj" 20 $ sep+ [ text "adding projection"+ , nest 2 $ prettyTCM projname <+> text (show clause)+ ]+ reportSDoc "tc.rec.proj" 10 $ sep+ [ text "adding projection"+ , nest 2 $ prettyTCM projname <+> text (show (clausePats clause)) <+> text "=" <+>+ inContext [] (addCtxTel ftel (prettyTCM (clauseBody clause)))+ ]+ -- Record patterns should /not/ be translated when the -- projection functions are defined. Record pattern -- translation is defined in terms of projection -- functions.- cc <- compileClauses False [clause]+ cc <- compileClauses Nothing [clause] reportSDoc "tc.cc" 10 $ do sep [ text "compiled clauses of " <+> prettyTCM projname@@ -301,24 +347,28 @@ ] escapeContext (size tel) $ do- addConstant projname $ Defn rel projname (killRange finalt) (defaultDisplayForm projname) 0 noCompiledRep+ addConstant projname $ Defn rel projname (killRange finalt) [] [StrictPos] (defaultDisplayForm projname) 0 noCompiledRep $ Function { funClauses = [clause] , funCompiled = cc , funDelayed = NotDelayed , funInv = NotInjective , funAbstr = ConcreteDef+{- , funPolarity = []- , funArgOccurrences = [Negative]+ , funArgOccurrences = [StrictPos]+-}+ , funMutual = [] , funProjection = Just (r, size ptel + 1) -- name of the record type and -- index of the record argument (in the type), start counting with 1 , funStatic = False+ , funCopy = False+ , funTerminates = Just True } computePolarity projname - checkProjs (abstract ftel1 $ ExtendTel (Arg h rel t)- $ Abs (show $ qnameName projname) EmptyTel- ) (absBody ftel2) fs+ recurse+ checkProjs ftel1 ftel2 (d : fs) = do checkDecl d checkProjs ftel1 ftel2 fs
src/full/Agda/TypeChecking/Rules/Term.hs view
@@ -1,4 +1,4 @@-{-# LANGUAGE CPP, PatternGuards #-}+{-# LANGUAGE CPP, PatternGuards, TupleSections #-} module Agda.TypeChecking.Rules.Term where @@ -9,10 +9,9 @@ import Control.Monad.Error import Data.Maybe import Data.List hiding (sort)-import qualified Agda.Utils.IO.Locale as LocIO import qualified Data.Map as Map import qualified Data.Set as Set-import Data.Traversable (traverse)+import Data.Traversable (traverse,sequenceA) import Agda.Interaction.Options @@ -26,7 +25,6 @@ import Agda.Syntax.Concrete.Pretty import Agda.Syntax.Fixity import Agda.Syntax.Internal-import Agda.Syntax.Internal.Generic import Agda.Syntax.Position import Agda.Syntax.Literal import Agda.Syntax.Abstract.Views@@ -40,10 +38,13 @@ import Agda.TypeChecking.MetaVars import Agda.TypeChecking.Pretty import Agda.TypeChecking.Records+import Agda.TypeChecking.RecordPatterns import Agda.TypeChecking.Conversion+import Agda.TypeChecking.Implicit (implicitArgs)+import Agda.TypeChecking.InstanceArguments import Agda.TypeChecking.Primitive import Agda.TypeChecking.Constraints-import Agda.TypeChecking.Free+import Agda.TypeChecking.Free hiding (Occurrence(..)) import Agda.TypeChecking.Telescope import Agda.TypeChecking.Datatypes import Agda.TypeChecking.Irrelevance@@ -52,10 +53,12 @@ import Agda.TypeChecking.CompiledClause import Agda.TypeChecking.Level import {-# SOURCE #-} Agda.TypeChecking.Rules.Builtin.Coinduction+import Agda.TypeChecking.Rules.LHS (checkLeftHandSide) import Agda.Utils.Fresh import Agda.Utils.Tuple import Agda.Utils.Permutation+import Agda.Utils.List (zipWithTails) import {-# SOURCE #-} Agda.TypeChecking.Empty (isEmptyType) import {-# SOURCE #-} Agda.TypeChecking.Rules.Decl (checkSectionApplication)@@ -81,12 +84,12 @@ -- | Check that an expression is a type without knowing the sort. isType_ :: A.Expr -> TCM Type isType_ e =- traceCall (IsType_ e) $- case e of- A.Fun i a b -> do- a <- traverse isType_ a+ traceCall (IsType_ e) $ sharedType <$>+ case unScope e of+ A.Fun i (Arg h r t) b -> do+ a <- Dom h r <$> isType_ t b <- isType_ b- return $ El (sLub (getSort $ unArg a) (getSort b)) (Pi a (NoAbs "_" b))+ return $ El (sLub (getSort $ unDom a) (getSort b)) (Pi a (NoAbs "_" b)) A.Pi _ tel e -> do checkTelescope_ tel $ \tel -> do t <- instantiateFull =<< isType_ e@@ -115,9 +118,9 @@ isTypeEqualTo e t = case e of A.ScopedExpr _ e -> isTypeEqualTo e t A.Underscore i | A.metaNumber i == Nothing -> return t- e -> do+ e -> workOnTypes $ do t' <- isType e (getSort t)- t' <$ leqType_ t t'+ t' <$ leqType t t' leqType_ :: Type -> Type -> TCM () leqType_ t t' = workOnTypes $ leqType t t'@@ -150,35 +153,7 @@ -- * Telescopes --------------------------------------------------------------------------- -{- UNUSED -- | Type check a telescope. Binds the variables defined by the telescope.-checkTelescope :: A.Telescope -> Sort -> (Telescope -> TCM a) -> TCM a-checkTelescope [] s ret = ret EmptyTel-checkTelescope (b : tel) s ret =- checkTypedBindings b s $ \tel1 ->- checkTelescope tel s $ \tel2 ->- ret $ abstract tel1 tel2---- | Check a typed binding and extends the context with the bound variables.--- The telescope passed to the continuation is valid in the original context.-checkTypedBindings :: A.TypedBindings -> Sort -> (Telescope -> TCM a) -> TCM a-checkTypedBindings (A.TypedBindings i (Arg h rel b)) s ret =- checkTypedBinding h rel s b $ \bs ->- ret $ foldr (\(x,t) -> ExtendTel (Arg h rel t) . Abs x) EmptyTel bs--checkTypedBinding :: Hiding -> Relevance -> Sort -> A.TypedBinding -> ([(String,Type)] -> TCM a) -> TCM a-checkTypedBinding h rel s (A.TBind i xs e) ret = do- t <- isType e s- addCtxs xs (Arg h rel t) $ ret $ mkTel xs t- where- mkTel [] t = []- mkTel (x:xs) t = (show $ nameConcrete x,t) : mkTel xs (raise 1 t)-checkTypedBinding h rel s (A.TNoBind e) ret = do- t <- isType e s- ret [("_",t)]--}---- | Type check a telescope. Binds the variables defined by the telescope. checkTelescope_ :: A.Telescope -> (Telescope -> TCM a) -> TCM a checkTelescope_ [] ret = ret EmptyTel checkTelescope_ (b : tel) ret =@@ -201,7 +176,7 @@ checkTypedBindings :: LamOrPi -> A.TypedBindings -> (Telescope -> TCM a) -> TCM a checkTypedBindings lamOrPi (A.TypedBindings i (Arg h rel b)) ret = checkTypedBinding lamOrPi h rel b $ \bs ->- ret $ foldr (\(x,t) -> ExtendTel (Arg h rel t) . Abs x) EmptyTel bs+ ret $ foldr (\(x,t) -> ExtendTel (Dom h rel t) . Abs x) EmptyTel bs checkTypedBinding :: LamOrPi -> Hiding -> Relevance -> A.TypedBinding -> ([(String,Type)] -> TCM a) -> TCM a checkTypedBinding lamOrPi h rel (A.TBind i xs e) ret = do@@ -210,7 +185,7 @@ -- 2011-10-04 if flag --experimental-irrelevance is set allowed <- optExperimentalIrrelevance <$> pragmaOptions t <- modEnv lamOrPi allowed $ isType_ e- addCtxs xs (Arg h (modRel lamOrPi allowed rel) t) $ ret $ mkTel xs t+ addCtxs xs (Dom h (modRel lamOrPi allowed rel) t) $ ret $ mkTel xs t where -- if we are checking a typed lambda, we resurrect before we check the -- types, but do not modify the new context entries@@ -230,8 +205,9 @@ checkLambda :: Arg A.TypedBinding -> A.Expr -> Type -> TCM Term checkLambda (Arg _ _ A.TNoBind{}) _ _ = __IMPOSSIBLE__ checkLambda (Arg h r (A.TBind _ xs typ)) body target = do- TelV tel btyp <- telViewUpTo (length xs) target- if size tel < size xs || length xs /= 1+ let numbinds = length xs+ TelV tel btyp <- telViewUpTo numbinds target+ if size tel < size xs || numbinds /= 1 then dontUseTargetType else useTargetType tel btyp where@@ -240,7 +216,7 @@ verboseS "tc.term.lambda" 5 $ tick "lambda-no-target-type" -- First check that argsT is a valid type- argsT <- workOnTypes $ Arg h r <$> isType_ typ+ argsT <- workOnTypes $ Dom h r <$> isType_ typ -- In order to have as much type information as possible when checking -- body, we first unify (xs : argsT) → ?t₁ with the target type. If this@@ -248,30 +224,37 @@ -- fresh problem for the check. t1 <- addCtxs xs argsT $ workOnTypes newTypeMeta_ let tel = telFromList $ mkTel xs argsT- pid <- newProblem_ $ leqType (telePi tel t1) target-- -- Now check body : ?t₁- v <- addCtxs xs argsT $ checkExpr body t1-- -- Block on the type comparison- blockTermOnProblem target (teleLam tel v) pid+ -- Do not coerce hidden lambdas+ if (h /= NotHidden) then do+ pid <- newProblem_ $ leqType (telePi tel t1) target+ -- Now check body : ?t₁+ v <- addCtxs xs argsT $ checkExpr body t1+ -- Block on the type comparison+ blockTermOnProblem target (teleLam tel v) pid+ else do+ -- Now check body : ?t₁+ v <- addCtxs xs argsT $ checkExpr body t1+ -- Block on the type comparison+ coerce (teleLam tel v) (telePi tel t1) target - useTargetType tel@(ExtendTel arg (Abs _ EmptyTel)) btyp = do+ useTargetType tel@(ExtendTel arg (Abs y EmptyTel)) btyp = do verboseS "tc.term.lambda" 5 $ tick "lambda-with-target-type"- unless (argHiding arg == h) $ typeError $ WrongHidingInLambda target+ unless (domHiding arg == h) $ typeError $ WrongHidingInLambda target -- Andreas, 2011-10-01 ignore relevance in lambda if not explicitly given- let r' = argRelevance arg -- relevance of function type+ let r' = domRelevance arg -- relevance of function type when (r == Irrelevant && r' /= r) $ typeError $ WrongIrrelevanceInLambda target -- unless (argRelevance arg == r) $ typeError $ WrongIrrelevanceInLambda target -- We only need to block the final term on the argument type -- comparison. The body will be blocked if necessary. We still want to -- compare the argument types first, so we spawn a new problem for that -- check.- (pid, argT) <- newProblem $ isTypeEqualTo typ (unArg arg)- v <- addCtx x (Arg h r' argT) $ checkExpr body btyp+ (pid, argT) <- newProblem $ isTypeEqualTo typ (unDom arg)+ v <- add x y (Dom h r' argT) $ checkExpr body btyp blockTermOnProblem target (Lam h $ Abs (show $ nameConcrete x) v) pid where [x] = xs+ add x y | C.isNoName (nameConcrete x) = addCtxString y+ | otherwise = addCtx x useTargetType _ _ = __IMPOSSIBLE__ @@ -286,17 +269,10 @@ checkLiteral :: Literal -> Type -> TCM Term checkLiteral lit t = do t' <- litType lit- blockTerm t $ Lit lit <$ leqType_ t' t+ coerce (Lit lit) t' t -litType :: Literal -> TCM Type-litType l = case l of- LitInt _ _ -> el <$> primNat- LitFloat _ _ -> el <$> primFloat- LitChar _ _ -> el <$> primChar- LitString _ _ -> el <$> primString- LitQName _ _ -> el <$> primQName- where- el t = El (mkType 0) t+-- moved to TypeChecking.Monad.Builtin to avoid import cycles:+-- litType :: Literal -> TCM Type --------------------------------------------------------------------------- -- * Terms@@ -305,7 +281,7 @@ -- TODO: move somewhere suitable reduceCon :: QName -> TCM QName reduceCon c = do- Con c [] <- constructorForm =<< reduce (Con c [])+ Con c [] <- ignoreSharing <$> (constructorForm =<< reduce (Con c [])) return c -- | @checkArguments' exph r args t0 t e k@ tries @checkArguments exph args t0 t@.@@ -315,10 +291,10 @@ -- -- Checks @e := ((_ : t0) args) : t@. checkArguments' ::- ExpandHidden -> Range -> [NamedArg A.Expr] -> Type -> Type -> A.Expr ->+ ExpandHidden -> ExpandInstances -> Range -> [NamedArg A.Expr] -> Type -> Type -> A.Expr -> (Args -> Type -> TCM Term) -> TCM Term-checkArguments' exph r args t0 t e k = do- z <- runErrorT $ checkArguments exph r args t0 t+checkArguments' exph expIFS r args t0 t e k = do+ z <- runErrorT $ checkArguments exph expIFS r args t0 t case z of Right (vs, t1) -> k vs t1 -- vs = evaluated args@@ -333,8 +309,8 @@ -- | Type check an expression. checkExpr :: A.Expr -> Type -> TCM Term checkExpr e t =- verboseBracket "tc.term.expr.top" 5 "checkExpr" $- traceCall (CheckExpr e t) $ localScope $ do+ verboseBracket "tc.term.expr.top" 5 "checkExpr" $+ traceCall (CheckExpr e t) $ localScope $ shared <$> do reportSDoc "tc.term.expr.top" 15 $ text "Checking" <+> sep [ fsep [ prettyTCM e, text ":", prettyTCM t ]@@ -352,9 +328,10 @@ unScope e = e e <- scopedExpr e+ case e of -- Insert hidden lambda if appropriate- _ | Pi (Arg h rel _) _ <- unEl t+ _ | Pi (Dom h rel _) _ <- ignoreSharing $ unEl t , not (hiddenLambdaOrHole h e) , h /= NotHidden -> do x <- freshName r (argName t)@@ -374,12 +351,12 @@ hiddenLambdaOrHole _ (A.QuestionMark _) = True hiddenLambdaOrHole _ _ = False - hiddenLHS (A.Clause (A.LHS _ _ (a : _) _) _ _) = elem (argHiding a) [Hidden, Instance]+ hiddenLHS (A.Clause (A.LHS _ (A.LHSHead _ (a : _)) _) _ _) = elem (argHiding a) [Hidden, Instance] hiddenLHS _ = False -- a meta variable without arguments: type check directly for efficiency A.QuestionMark i -> checkMeta newQuestionMark t i- A.Underscore i -> checkMeta newValueMeta t i+ A.Underscore i -> checkMeta (newValueMeta RunMetaOccursCheck) t i A.WithApp _ e es -> typeError $ NotImplemented "type checking of with application" @@ -398,7 +375,7 @@ reportSDoc "tc.univ.poly" 10 $ text "checking Set " <+> prettyTCM n <+> text "against" <+> prettyTCM t- blockTerm t $ Sort (Type n) <$ leqType_ (sort $ sSuc $ Type n) t+ coerce (Sort $ Type n) (sort $ sSuc $ Type n) t A.App i q (Arg NotHidden r e) | A.Quote _ <- unScope q -> do@@ -409,13 +386,13 @@ quoted _ = typeError $ GenericError $ "quote: not a defined name" x <- quoted (namedThing e) ty <- qNameType- blockTerm t $ quoteName x <$ leqType_ ty t+ coerce (quoteName x) ty t | A.QuoteTerm _ <- unScope q -> do (et, _) <- inferExpr (namedThing e) q <- quoteTerm =<< normalise et ty <- el primAgdaTerm- blockTerm t $ q <$ leqType_ ty t+ coerce q ty t | A.Unquote _ <- unScope q -> do e1 <- checkExpr (namedThing e) =<< el primAgdaTerm@@ -424,19 +401,16 @@ A.Quote _ -> typeError $ GenericError "quote must be applied to a defined name" A.QuoteTerm _ -> typeError $ GenericError "quoteTerm must be applied to a term" A.Unquote _ -> typeError $ GenericError "unquote must be applied to a term"- A.AbsurdLam i h -> do- t <- reduceB =<< instantiateFull t- case t of- Blocked{} -> postponeTypeCheckingProblem_ e $ ignoreBlocking t- NotBlocked (El _ MetaV{}) -> postponeTypeCheckingProblem_ e $ ignoreBlocking t- NotBlocked t' -> case unEl t' of- Pi (Arg h' _ a) _- | h == h' && not (null $ foldTerm metas a) ->- postponeTypeCheckingProblem e (ignoreBlocking t) $- null . foldTerm metas <$> instantiateFull a+ t <- instantiateFull t+ ifBlockedType t (\ m t' -> postponeTypeCheckingProblem_ e t') $ \ t' -> do+ case ignoreSharing $ unEl t' of+ Pi dom@(Dom h' r a) _+ | h == h' && not (null $ allMetas a) ->+ postponeTypeCheckingProblem e t' $+ null . allMetas <$> instantiateFull a | h == h' -> blockTerm t' $ do- isEmptyType a+ isEmptyType (getRange i) a -- Add helper function top <- currentModule let name = "absurd"@@ -448,92 +422,75 @@ [ text "Adding absurd function" <+> prettyTCM rel <> prettyTCM aux , nest 2 $ text "of type" <+> prettyTCM t' ]- addConstant aux $ Defn rel aux t' (defaultDisplayForm aux) 0 noCompiledRep- $ Function- { funClauses =- [Clause { clauseRange = getRange e- , clauseTel = EmptyTel- , clausePerm = Perm 0 []- , clausePats = [Arg h Relevant $ VarP "()"]- , clauseBody = NoBody- }- ]- , funCompiled = Fail- , funDelayed = NotDelayed- , funInv = NotInjective- , funAbstr = ConcreteDef- , funPolarity = [Covariant]- , funArgOccurrences = [Unused]- , funProjection = Nothing- , funStatic = False- }- return (Def aux [])+ addConstant aux+ $ Defn rel aux t' [Nonvariant] [Unused] (defaultDisplayForm aux) 0 noCompiledRep+ $ Function+ { funClauses =+ [Clause+ { clauseRange = getRange e+ , clauseTel = EmptyTel -- telFromList [fmap ("()",) dom]+ , clausePerm = Perm 1 [] -- Perm 1 [0]+ , clausePats = [Arg h r $ VarP "()"]+ , clauseBody = Bind $ NoAbs "()" NoBody+ }+ ]+ , funCompiled = Fail+ , funDelayed = NotDelayed+ , funInv = NotInjective+ , funAbstr = ConcreteDef+{-+ , funPolarity = [Nonvariant] -- WAS: [Covariant]+ , funArgOccurrences = [Unused]+-}+ , funMutual = []+ , funProjection = Nothing+ , funStatic = False+ , funCopy = False+ , funTerminates = Just True+ }+ -- Andreas 2012-01-30: since aux is lifted to toplevel+ -- it needs to be applied to the current telescope (issue 557)+ tel <- getContextTelescope+ return $ Def aux $ teleArgs tel+ -- WAS: return (Def aux []) | otherwise -> typeError $ WrongHidingInLambda t' _ -> typeError $ ShouldBePi t'- where- metas (MetaV m _) = [m]- metas _ = []++{- OLD A.ExtendedLam i di qname cs -> do t <- reduceB =<< instantiateFull t+ let isMeta t = case ignoreSharing $ unEl t of { MetaV{} -> True; _ -> False } case t of Blocked{} -> postponeTypeCheckingProblem_ e $ ignoreBlocking t- NotBlocked (El _ MetaV{}) -> postponeTypeCheckingProblem_ e $ ignoreBlocking t+ NotBlocked t' | isMeta t' -> postponeTypeCheckingProblem_ e $ ignoreBlocking t NotBlocked t -> do- j <- currentMutualBlock- rel <- asks envRelevance- addConstant qname (Defn rel qname t (defaultDisplayForm qname) j noCompiledRep Axiom)- reportSDoc "tc.term.exlam" 50 $ text "extended lambda's implementation \"" <> prettyTCM qname <>- text "\" has type: " $$ prettyTCM t -- <+>--- text " where clauses: " <+> text (show cs)- abstract (A.defAbstract di) $ checkFunDef' t rel NotDelayed di qname cs- tel <- getContextTelescope- addExtLambdaTele qname (counthidden tel , countnothidden tel)- reduce $ (Def qname [] `apply` (mkArgs tel))+-}+ A.ExtendedLam i di qname cs -> do+ t <- instantiateFull t+ ifBlockedType t (\ m t' -> postponeTypeCheckingProblem_ e t') $ \ t -> do+ j <- currentOrFreshMutualBlock+ rel <- asks envRelevance+ addConstant qname $+ Defn rel qname t [] [] (defaultDisplayForm qname) j noCompiledRep Axiom+ reportSDoc "tc.term.exlam" 50 $+ text "extended lambda's implementation \"" <> prettyTCM qname <>+ text "\" has type: " $$ prettyTCM t -- <+>+-- text " where clauses: " <+> text (show cs)+ abstract (A.defAbstract di) $ checkFunDef' t rel NotDelayed di qname cs+ args <- getContextArgs+ top <- currentModule+ freevars <- getSecFreeVars top+ let argsNoParam = genericDrop freevars args -- don't count module parameters+ let (hid, notHid) = partition ((Hidden ==) . argHiding) argsNoParam+ addExtLambdaTele qname (length hid, length notHid)+ reduce $ (Def qname [] `apply` args) where -- Concrete definitions cannot use information about abstract things. abstract ConcreteDef = inConcreteMode abstract AbstractDef = inAbstractMode- mkArgs :: Telescope -> Args- mkArgs tel = map arg [n - 1, n - 2..0]- where- n = size tel- arg i = defaultArg (Var i []) - metas (MetaV m _) = [m]- metas _ = []-- counthidden :: Telescope -> Int- counthidden t = length $ filter (\ (Arg h r a) -> h == Hidden ) $ teleArgs t-- countnothidden :: Telescope -> Int- countnothidden t = length $ filter (\ (Arg h r a) -> h == NotHidden ) $ teleArgs t---{- Andreas, 2011-04-27 DOES NOT WORK- -- a telescope is not for type checking abstract syn-- A.Lam i (A.DomainFull b) e -> do- -- check the types, get the telescope with unchanged relevance- (tel, t1, cs) <- workOnTypes $ checkTypedBindings_ b $ \tel -> do- t1 <- newTypeMeta_- cs <- escapeContext (size tel) $ leqType (telePi tel t1) t- return (tel, t1, cs)- -- check the body under the unchanged telescope- v <- addCtxTel tel $ do teleLam tel <$> checkExpr e t1- blockTerm t v (return cs)--} A.Lam i (A.DomainFull (A.TypedBindings _ b)) e -> checkLambda b e t - -- A.Lam i (A.DomainFull b) e -> do- -- (v, cs) <- checkTypedBindings LamNotPi b $ \tel -> do- -- (t1, cs) <- workOnTypes $ do- -- t1 <- newTypeMeta_- -- cs <- escapeContext (size tel) $ leqType (telePi tel t1) t- -- return (t1, cs)- -- v <- checkExpr e t1- -- return (teleLam tel v, cs)- -- blockTerm t v (return cs)- A.Lam i (A.DomainFree h rel x) e0 -> checkExpr (A.Lam i (domainFree h rel x) e0) t A.Lit lit -> checkLiteral lit t@@ -549,23 +506,23 @@ , nest 2 $ text "t =" <+> prettyTCM t' , nest 2 $ text "cxt =" <+> (prettyTCM =<< getContextTelescope) ]- blockTerm t $ unEl t' <$ leqType_ (sort s) t+ coerce (unEl t') (sort s) t A.Fun _ (Arg h r a) b -> do a' <- isType_ a b' <- isType_ b s <- reduce $ getSort a' `sLub` getSort b'- blockTerm t $ Pi (Arg h r a') (NoAbs "_" b') <$ leqType_ (sort s) t+ coerce (Pi (Dom h r a') (NoAbs "_" b')) (sort s) t A.Set _ n -> do n <- ifM typeInType (return 0) (return n)- blockTerm t $ Sort (mkType n) <$ leqType_ (sort $ mkType $ n + 1) t+ coerce (Sort $ mkType n) (sort $ mkType $ n + 1) t A.Prop _ -> do typeError $ GenericError "Prop is no longer supported" -- s <- ifM typeInType (return $ mkType 0) (return Prop)- -- blockTerm t (Sort Prop) $ leqType_ (sort $ mkType 1) t+ -- coerce (Sort Prop) (sort $ mkType 1) t A.Rec _ fs -> do t <- reduce t- case unEl t of+ case ignoreSharing $ unEl t of Def r vs -> do axs <- getRecordFieldNames r let xs = map unArg axs@@ -575,9 +532,9 @@ let arg x e = case [ a | a <- axs, unArg a == x ] of [a] -> unnamed e <$ a- _ -> defaultArg $ unnamed e -- we only end up here if the field names are bad- let meta = A.Underscore $ A.MetaInfo (getRange e) scope Nothing- missingExplicits = [ (unArg a, [unnamed meta <$ a])+ _ -> defaultNamedArg e -- we only end up here if the field names are bad+ let meta x = A.Underscore $ A.MetaInfo (getRange e) scope Nothing (show x)+ missingExplicits = [ (unArg a, [unnamed . meta <$> a]) | a <- axs, argHiding a == NotHidden , notElem (unArg a) (map fst fs) ] -- In es omitted explicit fields are replaced by underscores@@ -605,13 +562,16 @@ def <- getConstInfo r vs <- newArgsMeta (defType def) let target = piApply (defType def) vs- s = case unEl target of+ s = case ignoreSharing $ unEl target of Level l -> Type l Sort s -> s _ -> __IMPOSSIBLE__ inferred = El s $ Def r vs v <- checkExpr e inferred- blockTerm t $ v <$ leqType_ t inferred+ coerce v inferred t+ -- Andreas 2012-04-21: OLD CODE, WRONG DIRECTION, I GUESS:+ -- blockTerm t $ v <$ leqType_ t inferred+ -- If there are more than one possible record we postpone _:_:_ -> do reportSDoc "tc.term.expr.rec" 10 $ sep@@ -622,7 +582,7 @@ _ -> typeError $ ShouldBeRecordType t A.RecUpdate ei recexpr fs -> do- case unEl t of+ case ignoreSharing $ unEl t of Def r vs -> do rec <- checkExpr recexpr t name <- freshNoName (getRange recexpr)@@ -636,21 +596,24 @@ checkExpr (A.Rec ei [ (x, e) | (x, Just e) <- zip xs es' ]) t MetaV _ _ -> do inferred <- inferExpr recexpr >>= reduce . snd- case unEl inferred of+ case ignoreSharing $ unEl inferred of MetaV _ _ -> postponeTypeCheckingProblem_ e t _ -> do v <- checkExpr e inferred- blockTerm t $ v <$ leqType_ t inferred+ coerce v inferred t _ -> typeError $ ShouldBeRecordType t where replaceFields :: Name -> A.ExprInfo -> Arg A.QName -> Maybe A.Expr -> Maybe A.Expr- replaceFields n ei (Arg NotHidden _ p) Nothing = Just $ A.App ei (A.Def p) $ defaultArg (unnamed $ A.Var n)+ replaceFields n ei (Arg NotHidden _ p) Nothing = Just $ A.App ei (A.Def p) $ defaultNamedArg $ A.Var n replaceFields _ _ (Arg _ _ _) Nothing = Nothing replaceFields _ _ _ (Just e) = Just $ e - A.DontCare e -> -- can happen in the context of with functions- checkExpr e t-{- Andreas, 2011-10-03 why do I get an internal error for Issue337?+ A.DontCare e -> -- resurrect vars+ ifM ((Irrelevant ==) <$> asks envRelevance)+ (DontCare <$> do applyRelevanceToContext Irrelevant $ checkExpr e t)+ (internalError "DontCare may only appear in irrelevant contexts")+{- STALE?:+ Andreas, 2011-10-03 why do I get an internal error for Issue337? -- except that should be fixed now (issue 337) __IMPOSSIBLE__ -}@@ -658,17 +621,14 @@ e0@(A.QuoteGoal _ x e) -> do t' <- etaContract =<< normalise t- let metas = foldTerm (\v -> case v of- MetaV m _ -> [m]- _ -> []- ) t'+ let metas = allMetas t' case metas of- _:_ -> postponeTypeCheckingProblem e0 t' $ and <$> mapM isInstantiatedMeta metas+ _:_ -> postponeTypeCheckingProblem e0 t' $ andM $ map isInstantiatedMeta metas [] -> do quoted <- quoteTerm (unEl t') tmType <- agdaTermType (v, ty) <- addLetBinding Relevant x quoted tmType (inferExpr e)- blockTerm t' $ v <$ leqType_ ty t'+ blockTerm t' $ coerce v ty t' A.ETel _ -> __IMPOSSIBLE__ @@ -694,14 +654,14 @@ -- Type error let badCon t = typeError $ DoesNotConstructAnElementOf (fst $ head cs) t-+{- OLD CODE -- Lets look at the target type at this point let getCon = do TelV _ t1 <- telView t t1 <- reduceB $ unEl t1 reportSDoc "tc.check.term.con" 40 $ nest 2 $ text "target type: " <+> prettyTCM t1- case t1 of+ case ignoreSharing <$> t1 of NotBlocked (Def d _) -> do let dataOrRec = case [ c | (d', c) <- dcs, d == d' ] of [c] -> do@@ -719,7 +679,23 @@ NotBlocked (MetaV _ _) -> return Nothing Blocked{} -> return Nothing _ -> badCon (ignoreBlocking t1)- let unblock = isJust <$> getCon+-}+ -- Lets look at the target type at this point+ let getCon = do+ TelV _ t1 <- telView t+ reportSDoc "tc.check.term.con" 40 $ nest 2 $+ text "target type: " <+> prettyTCM t1+ ifBlocked (unEl t1) (\ m t -> return Nothing) $ \ t' ->+ (isDataOrRecord t' >>=) $ maybe (badCon t') $ \ d ->+ case [ c | (d', c) <- dcs, d == d' ] of+ [c] -> do+ reportSLn "tc.check.term" 40 $ " decided on: " ++ show c+ return (Just c)+ [] -> badCon (Def d [])+ cs -> typeError $ GenericError $+ "Can't resolve overloaded constructors targeting the same datatype (" ++ show d +++ "): " ++ unwords (map show cs)+ let unblock = isJust <$> getCon -- to unblock, call getCon later again mc <- getCon case mc of Just c -> checkConstructorApplication e t c args@@ -728,6 +704,18 @@ -- Subcase: non-ambiguous constructor | Application (A.Con (AmbQ [c])) args <- appView e -> checkConstructorApplication e t c args++ -- Subcase: pattern synonym+ | Application (A.PatternSyn n) args <- appView e -> do+ (ns, p) <- lookupPatternSyn n+ -- Expand the pattern synonym by substituting for+ -- the arguments we have got and lambda-lifting+ -- over the ones we haven't.+ let (zs, ns', as) = zipWithTails (\n a -> (n, namedThing (unArg a))) ns args+ p' = A.patternToExpr $ setRange (getRange n) p+ e' = A.lambdaLiftExpr ns' (A.substExpr zs p') `A.app` as+ checkExpr e' t+ -- Subcase: defined symbol or variable. | Application hd args <- appView e -> checkHeadApplication e t hd args@@ -736,19 +724,26 @@ A.DomainFull $ A.TypedBindings r $ Arg h rel $ A.TBind r [x] $ A.Underscore info where r = getRange x- info = A.MetaInfo{ A.metaRange = r, A.metaScope = emptyScopeInfo, A.metaNumber = Nothing }+ info = A.MetaInfo+ { A.metaRange = r+ , A.metaScope = emptyScopeInfo+ , A.metaNumber = Nothing+ , A.metaNameSuggestion = show x+ } checkMeta :: (Type -> TCM Term) -> Type -> A.MetaInfo -> TCM Term checkMeta newMeta t i = do case A.metaNumber i of Nothing -> do setScope (A.metaScope i)- newMeta t+ v <- newMeta t+ setValueMetaName v (A.metaNameSuggestion i)+ return v -- Rechecking an existing metavariable Just n -> do let v = MetaV (MetaId n) [] t' <- jMetaType . mvJudgement <$> lookupMeta (MetaId n)- blockTerm t $ v <$ leqType t' t+ coerce v t' t inferMeta :: (Type -> TCM Term) -> A.MetaInfo -> TCM (Args -> Term, Type) inferMeta newMeta i =@@ -768,9 +763,9 @@ inferHead :: A.Expr -> TCM (Args -> Term, Type) inferHead (A.Var x) = do -- traceCall (InferVar x) $ do (u, a) <- getVarInfo x- when (unusableRelevance $ argRelevance a) $+ when (unusableRelevance $ domRelevance a) $ typeError $ VariableIsIrrelevant x- return (apply u, unArg a)+ return (apply u, unDom a) inferHead (A.Def x) = do proj <- isProjection x case proj of@@ -805,13 +800,13 @@ Constructor{conPars = n} <- theDef <$> (instantiateDef =<< getConstInfo c) verboseS "tc.term.con" 7 $ do- liftIO $ LocIO.putStrLn $ unwords [show c, "has", show n, "parameters."]+ reportSLn "" 0 $ unwords [show c, "has", show n, "parameters."] -- So when applying the constructor throw away the parameters. return (apply u . genericDrop n, a) inferHead (A.Con _) = __IMPOSSIBLE__ -- inferHead will only be called on unambiguous constructors inferHead (A.QuestionMark i) = inferMeta newQuestionMark i-inferHead (A.Underscore i) = inferMeta newValueMeta i+inferHead (A.Underscore i) = inferMeta (newValueMeta RunMetaOccursCheck) i inferHead e = do (term, t) <- inferExpr e return (apply term, t) @@ -833,27 +828,49 @@ ds <- mapM prettyTCM vs dx <- prettyTCM x dt <- prettyTCM $ defType d- liftIO $ LocIO.putStrLn $ "inferred def " ++ unwords (show dx : map show ds) ++ " : " ++ show dt+ reportSLn "" 0 $ "inferred def " ++ unwords (show dx : map show ds) ++ " : " ++ show dt return (mkTerm x vs, defType d) -- | Check the type of a constructor application. This is easier than -- a general application since the implicit arguments can be inserted -- without looking at the arguments to the constructor. checkConstructorApplication :: A.Expr -> Type -> QName -> [NamedArg A.Expr] -> TCM Term-checkConstructorApplication org t c args- | hiddenArg = fallback- | otherwise = do+checkConstructorApplication org t c args = do+ reportSDoc "tc.term.con" 50 $ vcat+ [ text "entering checkConstructorApplication"+ , nest 2 $ vcat+ [ text "org =" <+> prettyTCM org+ , text "t =" <+> prettyTCM t+ , text "c =" <+> prettyTCM c+ , text "args =" <+> prettyTCM args+ ] ]+ let (args', paramsGiven) = checkForParams args+ if paramsGiven then fallback else do+ reportSDoc "tc.term.con" 50 $ text "checkConstructorApplication: no parameters explicitly supplied, continuing..." cdef <- getConstInfo c let Constructor{conData = d} = theDef cdef- case unEl t of -- Only fully applied constructors get special treatment- Def d' vs | d' == d -> do- def <- theDef <$> getConstInfo d- let npars = case def of- Datatype{ dataPars = n } -> Just n- Record{ recPars = n } -> Just n- _ -> Nothing- flip (maybe fallback) npars $ \n -> do- let ps = genericTake n vs+ reportSDoc "tc.term.con" 50 $ nest 2 $ text "d =" <+> prettyTCM d+ -- Issue 661: t maybe an evaluated form of d .., so we evaluate d+ -- as well and then check wether we deal with the same datatype+ t0 <- reduce (Def d [])+ case (ignoreSharing t0, ignoreSharing $ unEl t) of -- Only fully applied constructors get special treatment+ (Def d0 _, Def d' vs) -> do+ reportSDoc "tc.term.con" 50 $ nest 2 $ text "d0 =" <+> prettyTCM d0+ reportSDoc "tc.term.con" 50 $ nest 2 $ text "d' =" <+> prettyTCM d'+ reportSDoc "tc.term.con" 50 $ nest 2 $ text "vs =" <+> prettyTCM vs+ if d' /= d0 then fallback else do+ -- Issue 661: d' may take more parameters than d, in particular+ -- these additional parameters could be a module parameter telescope.+ -- Since we get the constructor type ctype from d but the parameters+ -- from t = Def d' vs, we drop the additional parameters.+ npars <- getNumberOfParameters d+ npars' <- getNumberOfParameters d'+ flip (maybe fallback) (sequenceA $ List2 (npars, npars')) $ \(List2 (n,n')) -> do+ reportSDoc "tc.term.con" 50 $ nest 2 $ text $ "n = " ++ show n+ reportSDoc "tc.term.con" 50 $ nest 2 $ text $ "n' = " ++ show n'+ -- when (n > n') __IMPOSSIBLE__ -- NOT IN SCOPE `__IMPOSSIBLE__' WHY???+ when (n > n') bla+ let ps = genericTake n $ genericDrop (n' - n) vs ctype = defType cdef reportSDoc "tc.term.con" 20 $ vcat [ text "special checking of constructor application of" <+> prettyTCM c@@ -861,22 +878,34 @@ , text "ctype =" <+> prettyTCM ctype ] ] let ctype' = ctype `piApply` ps reportSDoc "tc.term.con" 20 $ nest 2 $ text "ctype' =" <+> prettyTCM ctype'- checkArguments' ExpandLast (getRange c) args ctype' t org $ \us t' -> do+ -- check the non-parameter arguments+ checkArguments' ExpandLast ExpandInstanceArguments (getRange c) args' ctype' t org $ \us t' -> do reportSDoc "tc.term.con" 20 $ nest 2 $ vcat [ text "us =" <+> prettyTCM us , text "t' =" <+> prettyTCM t' ]- blockTerm t $ Con c us <$ leqType_ t' t- _ -> fallback+ coerce (Con c us) t' t+ _ -> do+ reportSDoc "tc.term.con" 50 $ nest 2 $ text "we are not at a datatype, falling back"+ fallback where fallback = checkHeadApplication org t (A.Con (AmbQ [c])) args+ bla = __IMPOSSIBLE__ -- Check if there are explicitly given hidden arguments, -- in which case we fall back to default type checking. -- We could work harder, but let's not for now.- hiddenArg = case args of- Arg Hidden _ _ : _ -> True- _ -> False+ --+ -- Andreas, 2012-04-18: if all inital args are underscores, ignore them+ checkForParams args =+ let (hargs, rest) = span isHiddenArg args+ removeScope (A.ScopedExpr _ e) = removeScope e+ removeScope e = e+ notUnderscore A.Underscore{} = False+ notUnderscore _ = True+ in (rest,) $ any notUnderscore $ map (removeScope . namedArg) hargs +{- UNUSED CODE, BUT DON'T REMOVE (2012-04-18)+ -- Split the arguments to a constructor into those corresponding -- to parameters and those that don't. Dummy underscores are inserted -- for parameters that are not given explicitly.@@ -894,6 +923,7 @@ mname = nameOf (unArg arg) dummyUnderscore = Arg Hidden Relevant (unnamed $ A.Underscore $ A.MetaInfo noRange emptyScopeInfo Nothing)+-} -- | @checkHeadApplication e t hd args@ checks that @e@ has type @t@, -- assuming that @e@ has the form @hd args@. The corresponding@@ -920,7 +950,7 @@ [ text "checkHeadApplication inferred" <+> prettyTCM c <+> text ":" <+> prettyTCM t0 ]- checkArguments' ExpandLast (getRange hd) args t0 t e $ \vs t1 -> do+ checkArguments' ExpandLast ExpandInstanceArguments (getRange hd) args t0 t e $ \vs t1 -> do TelV eTel eType <- telView t -- If the expected type @eType@ is a metavariable we have to make -- sure it's instantiated to the proper pi type@@ -950,9 +980,11 @@ "coinductive constructor in the scope of a let-bound variable" -- The name of the fresh function.- i <- fresh :: TCM Integer+ i <- fresh :: TCM Int let name = filter (/= '_') (show $ A.qnameName c) ++ "-" ++ show i- c' <- liftM2 qualify (killRange <$> currentModule) (freshName_ name)+ c' <- setRange (getRange c) <$>+ liftM2 qualify (killRange <$> currentModule)+ (freshName_ name) -- The application of the fresh function to the relevant -- arguments.@@ -960,20 +992,20 @@ -- Add the type signature of the fresh function to the -- signature.- i <- currentMutualBlock+ i <- currentOrFreshMutualBlock tel <- getContextTelescope -- If we are in irrelevant position, add definition irrelevantly. -- TODO: is this sufficient? rel <- asks envRelevance- addConstant c' (Defn rel c' t (defaultDisplayForm c') i noCompiledRep $ Axiom)+ addConstant c' (Defn rel c' t [] [] (defaultDisplayForm c') i noCompiledRep $ Axiom) -- Define and type check the fresh function. ctx <- getContext let info = A.mkDefInfo (A.nameConcrete $ A.qnameName c') defaultFixity' PublicAccess ConcreteDef noRange- pats = map (fmap $ \(n, _) -> Named Nothing (A.VarP n)) $+ pats = map (\ (Dom h r (n, _)) -> Arg h r $ Named Nothing $ A.VarP n) $ reverse ctx- clause = A.Clause (A.LHS (A.LHSRange noRange) c' pats [])+ clause = A.Clause (A.LHS (A.LHSRange noRange) (A.LHSHead c' pats) []) (A.RHS $ unAppView (A.Application (A.Con (AmbQ [c])) args)) [] @@ -988,7 +1020,7 @@ , nest 2 $ prettyA clause <> text "." ] - escapeContext (size ctx) $ checkFunDef Delayed info c' [clause]+ escapeContextToTopLevel $ checkFunDef Delayed info c' [clause] reportSDoc "tc.term.expr.coind" 15 $ do def <- theDef <$> getConstInfo c'@@ -1001,10 +1033,8 @@ where defaultResult = do (f, t0) <- inferHead hd- checkArguments' ExpandLast (getRange hd) args t0 t e $ \vs t1 ->- blockTerm t $ f vs <$ leqType_ t1 t--data ExpandHidden = ExpandLast | DontExpandLast+ checkArguments' ExpandLast ExpandInstanceArguments (getRange hd) args t0 t e $ \vs t1 ->+ coerce (f vs) t1 t instance Error Type where strMsg _ = __IMPOSSIBLE__@@ -1028,69 +1058,100 @@ -- that have to be solved for everything to be well-formed. -- -- TODO: doesn't do proper blocking of terms-checkArguments :: ExpandHidden -> Range -> [NamedArg A.Expr] -> Type -> Type ->+checkArguments :: ExpandHidden -> ExpandInstances -> Range -> [NamedArg A.Expr] -> Type -> Type -> ErrorT Type TCM (Args, Type)-checkArguments DontExpandLast _ [] t0 t1 = return ([], t0)-checkArguments exh r [] t0 t1 =+checkArguments DontExpandLast _ _ [] t0 t1 = return ([], t0)+checkArguments exh expandIFS r [] t0 t1 =+ traceCallE (CheckArguments r [] t0 t1) $ lift $ do+ t1' <- unEl <$> reduce t1+ implicitArgs (-1) (expand t1') t0+ where+ expand (Pi (Dom h _ _) _) Hidden = h /= Hidden+ expand _ Hidden = True+ expand (Pi (Dom h _ _) _) Instance = h /= Instance && expandIFS == ExpandInstanceArguments+ expand _ Instance = expandIFS == ExpandInstanceArguments+ expand _ NotHidden = False++{- OLD CODE+checkArguments exh expandIFS r [] t0 t1 = traceCallE (CheckArguments r [] t0 t1) $ do t0' <- lift $ reduce t0 t1' <- lift $ reduce t1- case unEl t0' of- Pi (Arg Hidden rel a) _ | notHPi Hidden $ unEl t1' -> do- v <- lift $ applyRelevanceToContext rel $ newValueMeta a+ case ignoreSharing $ unEl t0' of+ Pi (Dom Hidden rel a) _ | notHPi Hidden $ unEl t1' -> do+ v <- lift $ applyRelevanceToContext rel $ newValueMeta RunMetaOccursCheck a let arg = Arg Hidden rel v- (vs, t0'') <- checkArguments exh r [] (piApply t0' [arg]) t1'+ (vs, t0'') <- checkArguments exh expandIFS r [] (piApply t0' [arg]) t1' return (arg : vs, t0'')- Pi (Arg Instance rel a) _ | notHPi Instance $ unEl t1' -> do+ Pi (Dom Instance rel a) _ | expandIFS == ExpandInstanceArguments &&+ (notHPi Instance $ unEl t1') -> do lift $ reportSLn "tc.term.args.ifs" 15 $ "inserting implicit meta for type " ++ show a- v <- lift $ applyRelevanceToContext rel $ newIFSMeta a+ v <- lift $ applyRelevanceToContext rel $ initializeIFSMeta a let arg = Arg Instance rel v- (vs, t0'') <- checkArguments exh r [] (piApply t0' [arg]) t1'+ (vs, t0'') <- checkArguments exh expandIFS r [] (piApply t0' [arg]) t1' return (arg : vs, t0'') _ -> return ([], t0') where- notHPi h (Pi (Arg h' _ _) _) | h == h' = False+ notHPi h (Pi (Dom h' _ _) _) | h == h' = False+ notHPi h (Shared p) = notHPi h $ derefPtr p notHPi _ _ = True+-} -checkArguments exh r args0@(Arg h _ e : args) t0 t1 =+checkArguments exh expandIFS r args0@(Arg h _ e : args) t0 t1 = traceCallE (CheckArguments r args0 t0 t1) $ do+ lift $ reportSDoc "tc.term.args" 30 $ sep+ [ text "checkArguments"+-- , text " args0 =" <+> prettyA args0+ , nest 2 $ vcat+ [ text "e =" <+> prettyA e+ , text "t0 =" <+> prettyTCM t0+ , text "t1 =" <+> prettyTCM t1+ ]+ ] t0b <- lift $ reduceB t0+ let isMeta t = case ignoreSharing $ unEl t of { MetaV{} -> True; _ -> False } case t0b of- Blocked{} -> throwError $ ignoreBlocking t0b- NotBlocked (El _ MetaV{}) -> throwError $ ignoreBlocking t0b+ Blocked{} -> throwError $ ignoreBlocking t0b+ NotBlocked t0' | isMeta t0' -> throwError $ ignoreBlocking t0b NotBlocked t0' -> do -- (t0', cs) <- forcePi h (name e) t0 e' <- return $ namedThing e- case unEl t0' of- Pi (Arg h' rel a) _ |+ case ignoreSharing $ unEl t0' of+ Pi (Dom h' rel a) _ | h == h' && (h == NotHidden || sameName (nameOf e) (nameInPi $ unEl t0')) -> do u <- lift $ applyRelevanceToContext rel $ checkExpr e' a let arg = Arg h rel u -- save relevance info in argument- (us, t0'') <- checkArguments exh (fuseRange r e) args (piApply t0' [arg]) t1- return (nukeIfIrrelevant arg : us, t0'')+ (us, t0'') <- checkArguments exh expandIFS (fuseRange r e) args (piApply t0' [arg]) t1+ return (arg : us, t0'')+{- UNUSED. 2012-04-02 do not insert DontCare (is redundant anyway) where nukeIfIrrelevant arg = if argRelevance arg == Irrelevant then -- Andreas, 2011-09-09 keep irr. args. until after termination checking arg { unArg = DontCare $ unArg arg } else arg- Pi (Arg Instance rel a) _ -> insertIFSUnderscore rel a- Pi (Arg Hidden rel a) _ -> insertUnderscore rel- Pi (Arg NotHidden _ _) _ -> lift $ typeError $ WrongHidingInApplication t0'+-}+ Pi (Dom Instance rel a) b | expandIFS == ExpandInstanceArguments ->+ insertIFSUnderscore rel (absName b) a+ Pi (Dom Hidden rel a) b -> insertUnderscore rel (absName b)+ Pi (Dom NotHidden _ _) _ -> lift $ typeError $ WrongHidingInApplication t0' _ -> lift $ typeError $ ShouldBePi t0' where- insertIFSUnderscore rel a = do v <- lift $ applyRelevanceToContext rel $ newIFSMeta a- lift $ reportSLn "tc.term.args.ifs" 15 $ "inserting implicit meta (2) for type " ++ show a- let arg = Arg Instance rel v- (vs, t0'') <- checkArguments exh r args0 (piApply t0 [arg]) t1- return (arg : vs, t0'')- insertUnderscore rel = do+ insertIFSUnderscore rel x a = do+ lift $ reportSLn "tc.term.args.ifs" 15 $ "inserting implicit meta (2) for type " ++ show a+ v <- lift $ applyRelevanceToContext rel $ initializeIFSMeta x a+ let arg = Arg Instance rel v+ (vs, t0'') <- checkArguments exh expandIFS r args0 (piApply t0 [arg]) t1+ return (arg : vs, t0'')++ insertUnderscore rel x = do scope <- lift $ getScope let m = A.Underscore $ A.MetaInfo { A.metaRange = r , A.metaScope = scope , A.metaNumber = Nothing+ , A.metaNameSuggestion = x }- checkArguments exh r (Arg Hidden rel (unnamed m) : args0) t0 t1+ checkArguments exh expandIFS r (Arg Hidden rel (unnamed m) : args0) t0 t1 name (Named _ (A.Var x)) = show x name (Named (Just x) _) = x@@ -1099,28 +1160,79 @@ sameName Nothing _ = True sameName n1 n2 = n1 == n2 - nameInPi (Pi _ b) = Just $ absName b- nameInPi _ = __IMPOSSIBLE__+ nameInPi (Pi _ b) = Just $ absName b+ nameInPi (Shared p) = nameInPi (derefPtr p)+ nameInPi _ = __IMPOSSIBLE__ -- | Check that a list of arguments fits a telescope. checkArguments_ :: ExpandHidden -> Range -> [NamedArg A.Expr] -> Telescope -> TCM Args checkArguments_ exh r args tel = do- z <- runErrorT $ checkArguments exh r args (telePi tel $ sort Prop) (sort Prop)+ z <- runErrorT $ checkArguments exh ExpandInstanceArguments r args (telePi tel $ sort Prop) (sort Prop) case z of Right (args, _) -> return args Left _ -> __IMPOSSIBLE__ -- | Infer the type of an expression. Implemented by checking against a meta--- variable.+-- variable. Except for neutrals, for them a polymorphic type is inferred. inferExpr :: A.Expr -> TCM (Term, Type)-inferExpr e = do- -- Andreas, 2011-04-27- t <- workOnTypes $ newTypeMeta_- v <- checkExpr e t- return (v,t)+inferExpr e = inferOrCheck e Nothing+{-+case e of+ _ | Application hd args <- appView e, defOrVar hd -> traceCall (InferExpr e) $ do+ (f, t0) <- inferHead hd+ res <- runErrorT $ checkArguments DontExpandLast ExpandInstanceArguments (getRange hd) args t0 (sort Prop)+ case res of+ Right (vs, t1) -> return (f vs, t1)+ Left t1 -> fallback -- blocked on type t1+ _ -> fallback+ where+ fallback = do+ t <- workOnTypes $ newTypeMeta_+ v <- checkExpr e t+ return (v,t)+-} +defOrVar :: A.Expr -> Bool+defOrVar A.Var{} = True+defOrVar A.Def{} = True+defOrVar _ = False++inferOrCheck :: A.Expr -> Maybe Type -> TCM (Term, Type)+inferOrCheck e mt = case e of+ _ | Application hd args <- appView e, defOrVar hd -> traceCall (InferExpr e) $ do+ (f, t0) <- inferHead hd+ res <- runErrorT $ checkArguments DontExpandLast ExpandInstanceArguments (getRange hd) args t0 $ maybe (sort Prop) id mt+ case res of+ Right (vs, t1) -> maybe (return (f vs, t1))+ (\ t -> (,t) <$> coerce (f vs) t1 t)+ mt+ Left t1 -> fallback -- blocked on type t1+ _ -> fallback+ where+ fallback = do+ t <- maybe (workOnTypes $ newTypeMeta_) return mt+ v <- checkExpr e t+ return (v,t)++-- | Infer the type of an expression, and if it is of the form+-- @{tel} -> D vs@ for some datatype @D@ then insert the hidden+-- arguments. Otherwise, leave the type polymorphic.+inferExprForWith :: A.Expr -> TCM (Term, Type)+inferExprForWith e = do+ (v, t) <- inferExpr e+ TelV tel t0 <- telViewUpTo' (-1) ((NotHidden /=) . domHiding) t+ case ignoreSharing $ unEl t0 of+ Def d vs -> do+ res <- isDataOrRecordType d+ case res of+ Nothing -> return (v, t)+ Just{} -> do+ (args, t1) <- implicitArgs (-1) (NotHidden /=) t+ return (v `apply` args, t1)+ _ -> return (v, t)+ checkTerm :: Term -> Type -> TCM Term checkTerm tm ty = do atm <- reify tm checkExpr atm ty@@ -1133,11 +1245,71 @@ checkLetBindings = foldr (.) id . map checkLetBinding checkLetBinding :: A.LetBinding -> TCM a -> TCM a+ checkLetBinding b@(A.LetBind i rel x t e) ret = traceCallCPS_ (CheckLetBinding b) ret $ \ret -> do t <- isType_ t v <- applyRelevanceToContext rel $ checkExpr e t addLetBinding rel x v t ret++checkLetBinding b@(A.LetPatBind i p e) ret =+ traceCallCPS_ (CheckLetBinding b) ret $ \ret -> do+ (v, t) <- inferExpr e+ let -- construct a type t -> dummy for use in checkLeftHandSide+ t0 = El (getSort t) $ Pi (Dom NotHidden Relevant t) (NoAbs "_" typeDontCare)+ p0 = Arg NotHidden Relevant (Named Nothing p)+ reportSDoc "tc.term.let.pattern" 10 $ vcat+ [ text "let-binding pattern p at type t"+ , nest 2 $ vcat+ [ text "p (A) =" <+> text (show p) -- prettyTCM p+ , text "t =" <+> prettyTCM t+ ]+ ]+ checkLeftHandSide (CheckPattern p EmptyTel t) [p0] t0 $ \ mgamma delta sub xs ps t' perm -> do+ -- A single pattern in internal syntax is returned.+ let p = case ps of [p] -> unArg p; _ -> __IMPOSSIBLE__+ reportSDoc "tc.term.let.pattern" 20 $ nest 2 $ vcat+ [ text "p (I) =" <+> text (show p)+ , text "delta =" <+> text (show delta)+ ]+ -- We translate it into a list of projections.+ fs <- recordPatternToProjections p+ -- We remove the bindings for the pattern variables from the context.+ cxt0 <- getContext+ let (binds, cxt) = splitAt (size delta) cxt0+ escapeContext (length binds) $ do+ reportSDoc "tc.term.let.pattern" 20 $ nest 2 $ vcat+ [ text "delta =" <+> prettyTCM delta+ , text "binds =" <+> text (show binds) -- prettyTCM binds+ ]+{- WE CANNOT USE THIS BINDING+ -- We add a first let-binding for the value of e.+ x <- freshNoName (getRange e)+ addLetBinding Relevant x v t $ do+ -}+ -- We create a substitution for the let-bound variables+ -- (unfortunately, we cannot refer to x in internal syntax+ -- so we have to copy v).+ let sigma = zipWith ($) fs (repeat v)+ -- We apply the types of the let bound-variables to this substitution.+ -- The 0th variable in a context is the last one, so we reverse.+ -- Further, we need to lower all other de Bruijn indices by+ -- the size of delta, so we append the identity substitution.+ let sub = parallelS (reverse sigma)+ let fdelta = flattenTel delta+ reportSDoc "tc.term.let.pattern" 20 $ nest 2 $ vcat+ [ text "fdelta =" <+> text (show fdelta)+ ]+ let tsl = applySubst sub fdelta+ -- We get a list of types+ let ts = map unDom tsl+ -- and relevances.+ let rels = map domRelevance tsl+ -- We get list of names of the let-bound vars from the context.+ let xs = map (fst . unDom) (reverse binds)+ -- We add all the bindings to the context.+ foldr (uncurry4 addLetBinding) ret $ zip4 rels xs sigma ts+ checkLetBinding (A.LetApply i x modapp rd rm) ret = do -- Any variables in the context that doesn't belong to the current -- module should go with the new module.
src/full/Agda/TypeChecking/Rules/Term.hs-boot view
@@ -3,6 +3,15 @@ import qualified Agda.Syntax.Abstract as A import Agda.Syntax.Internal+import Agda.Syntax.Common+import Agda.Syntax.Position import Agda.TypeChecking.Monad.Base+import Control.Monad.Error (ErrorT) +isType_ :: A.Expr -> TCM Type+ checkExpr :: A.Expr -> Type -> TCM Term++checkArguments :: ExpandHidden -> ExpandInstances -> Range -> [NamedArg A.Expr] -> Type -> Type ->+ ErrorT Type TCM (Args, Type)+
src/full/Agda/TypeChecking/Serialise.hs view
@@ -53,10 +53,12 @@ import Agda.Syntax.Common import Agda.Syntax.Concrete.Name as C+import qualified Agda.Syntax.Abstract as A import Agda.Syntax.Abstract.Name as A+import Agda.Syntax.Info import Agda.Syntax.Internal as I import Agda.Syntax.Scope.Base-import Agda.Syntax.Position (Position(..), Range)+import Agda.Syntax.Position (Position, Range, noRange) import qualified Agda.Syntax.Position as P import Agda.Syntax.Common import Agda.Syntax.Fixity@@ -69,10 +71,13 @@ import Agda.TypeChecking.Monad import Agda.TypeChecking.CompiledClause+import Agda.TypeChecking.Pretty import Agda.Utils.FileName import Agda.Utils.Monad import Agda.Utils.Tuple import Agda.Utils.Permutation+import Agda.Utils.HashMap (HashMap)+import qualified Agda.Utils.HashMap as HMap #include "../undefined.h" import Agda.Utils.Impossible@@ -82,7 +87,7 @@ -- 32-bit machines). Word64 does not have these problems. currentInterfaceVersion :: Word64-currentInterfaceVersion = 20111026 * 10 + 0+currentInterfaceVersion = 20121106 * 10 + 0 -- | Constructor tag (maybe omitted) and argument indices. @@ -101,25 +106,17 @@ , stringD :: !(HashTable String Int32) , integerD :: !(HashTable Integer Int32) , doubleD :: !(HashTable Double Int32)+ , termD :: !(HashTable (Ptr Term) Int32) , nodeC :: !(IORef Int32) -- counters for fresh indexes , stringC :: !(IORef Int32) , integerC :: !(IORef Int32) , doubleC :: !(IORef Int32)+ , sharingStats :: !(IORef (Int32, Int32)) , fileMod :: !SourceToModule } data U = forall a . Typeable a => U !a-type Memo = HashTable (Int32, TypeRep') U -- (node index, type rep)---- | A newtype is used to avoid introducing an orphan instance of--- Hashable.-newtype TypeRep' = TypeRep' { unTypeRep' :: TypeRep }- deriving Eq---- | With direct access to the internals of 'TypeRep' this instance--- could presumably be improved.-instance Hashable TypeRep' where- hash = hash . show . unTypeRep'+type Memo = HashTable (Int32, TypeRep) U -- (node index, type rep) data St = St { nodeE :: !(Array Int32 Node)@@ -161,12 +158,17 @@ encode :: EmbPrj a => a -> TCM ByteString encode a = do fileMod <- sourceToModule- liftIO $ do- newD@(Dict nD sD iD dD _ _ _ _ _) <- emptyDict fileMod+ (x, shared, total) <- liftIO $ do+ newD@(Dict nD sD iD dD _ _ _ _ _ stats _) <- emptyDict fileMod root <- runReaderT (icode a) newD nL <- l nD; sL <- l sD; iL <- l iD; dL <- l dD- return $ B.encode currentInterfaceVersion `L.append`- G.compress (B.encode (root, nL, sL, iL, dL))+ (shared, total) <- readIORef stats+ return (B.encode currentInterfaceVersion `L.append`+ G.compress (B.encode (root, nL, sL, iL, dL)), shared, total)+ verboseS "profile.sharing" 10 $ do+ tickN "pointers (reused)" $ fromIntegral shared+ tickN "pointers" $ fromIntegral total+ return x where l h = List.map fst . List.sortBy (compare `on` snd) <$> H.toList h @@ -184,11 +186,11 @@ -- input is malformed. The decoder is (intended to be) strict enough -- to ensure that all such errors can be caught by the handler here. - (mf, x) <- liftIO $ E.handle (\(E.ErrorCall {}) -> noResult) $ do+ (mf, r) <- liftIO $ E.handle (\(E.ErrorCall s) -> noResult s) $ do (ver, s, _) <- return $ B.runGetState B.get s 0 if ver /= currentInterfaceVersion- then noResult+ then noResult "Wrong interface version." else do ((r, nL, sL, iL, dL), s, _) <-@@ -196,27 +198,31 @@ if s /= L.empty -- G.decompress seems to throw away garbage at the end, so -- the then branch is possibly dead code.- then noResult+ then noResult "Garbage at end." else do st <- St (ar nL) (ar sL) (ar iL) (ar dL) <$> liftIO H.new <*> return mf <*> return incs (r, st) <- runStateT (runErrorT (value r)) st- return (Just (modFile st), case r of- Left _ -> Nothing- Right x -> Just x)+ return (Just (modFile st), r) case mf of Nothing -> return () Just mf -> modify $ \s -> s { stModuleToSource = mf } - return x+ case r of+ Right x -> return (Just x)+ Left err -> do+ reportSDoc "import.iface" 5 $+ text "Error when decoding interface file:" $+$+ nest 2 (prettyTCM err)+ return Nothing where ar l = listArray (0, List.genericLength l - 1) l - noResult = return (Nothing, Nothing)+ noResult s = return (Nothing, Left $ GenericError s) -- | Encodes something. To ensure relocatability file paths in -- positions are replaced with module names.@@ -373,8 +379,8 @@ valu _ = malformed instance EmbPrj Scope where- icode (Scope a b c d) = icode4' a b c d- value = vcase valu where valu [a, b, c, d] = valu4 Scope a b c d+ icode (Scope a b c d e) = icode5' a b c d e+ value = vcase valu where valu [a, b, c, d, e] = valu5 Scope a b c d e valu _ = malformed instance EmbPrj NameSpaceId where@@ -414,8 +420,11 @@ instance EmbPrj KindOfName where icode DefName = icode0' icode ConName = icode0 1+ icode FldName = icode0 2+ icode PatternSynName = icode0 2 value = vcase valu where valu [] = valu0 DefName valu [1] = valu0 ConName+ valu [2] = valu0 FldName valu _ = malformed instance EmbPrj Agda.Syntax.Fixity.Fixity where@@ -446,6 +455,10 @@ value = vcase valu where valu [a, b] = valu2 A.QName a b valu _ = malformed +instance EmbPrj A.AmbiguousQName where+ icode (A.AmbQ a) = icode a+ value n = A.AmbQ `fmap` value n+ instance EmbPrj A.ModuleName where icode (A.MName a) = icode a value n = A.MName `fmap` value n@@ -455,6 +468,136 @@ value = vcase valu where valu [a, b, c, d] = valu4 A.Name a b c d valu _ = malformed +instance (EmbPrj s, EmbPrj t) => EmbPrj (Named s t) where+ icode (Named a b) = icode2' a b+ value = vcase valu where valu [a, b] = valu2 Named a b+ valu _ = malformed++instance EmbPrj A.Expr where+ icode (A.Var n) = icode1 0 n+ icode (A.Def n) = icode1 1 n+ icode (A.Con ns) = icode1 2 ns+ icode (A.Lit l) = icode1 3 l+ icode (A.QuestionMark _) = icode0 4+ icode (A.Underscore _) = icode0 5+ icode (A.App _ a b) = icode2 6 a b+ icode (A.WithApp _ a b) = icode2 7 a b+ icode (A.Lam _ a b) = icode2 8 a b+ icode (A.AbsurdLam _ a) = icode1 9 a+ icode (A.ExtendedLam _ _ _ _) = icode0 10+ icode (A.Pi _ a b) = icode2 11 a b+ icode (A.Fun _ a b) = icode2 12 a b+ icode (A.Set _ a) = icode1 13 a+ icode (A.Prop _) = icode0 14+ icode (A.Let _ a b) = icode2 15 a b+ icode (A.ETel a) = icode1 16 a+ icode (A.Rec _ a) = icode1 17 a+ icode (A.RecUpdate _ a b) = icode2 18 a b+ icode (A.ScopedExpr a b) = icode2 19 a b+ icode (A.QuoteGoal _ a b) = icode2 20 a b+ icode (A.Quote _) = icode0 21+ icode (A.QuoteTerm _) = icode0 22+ icode (A.Unquote _) = icode0 23+ icode (A.DontCare a) = icode1 24 a+ icode (A.PatternSyn a) = icode1 25 a++ value = vcase valu+ where+ valu [0, a] = valu1 A.Var a+ valu [1, a] = valu1 A.Def a+ valu [2, a] = valu1 A.Con a+ valu [3, a] = valu1 A.Lit a+ valu [4] = valu0 (A.QuestionMark emptyMetaInfo)+ valu [5] = valu0 (A.Underscore emptyMetaInfo)+ valu [6, a, b] = valu2 (A.App i) a b+ valu [7, a, b] = valu2 (A.WithApp i) a b+ valu [8, a, b] = valu2 (A.Lam i) a b+ valu [9, a] = valu1 (A.AbsurdLam i) a+ valu [10] = throwError $ NotSupported+ "importing pattern synonym containing extended lambda"+ valu [11, a, b] = valu2 (A.Pi i) a b+ valu [12, a, b] = valu2 (A.Fun i) a b+ valu [13, a] = valu1 (A.Set i) a+ valu [14] = valu0 (A.Prop i)+ valu [15, a, b] = valu2 (A.Let i) a b+ valu [16, a] = valu1 A.ETel a+ valu [17, a] = valu1 (A.Rec i) a+ valu [18, a, b] = valu2 (A.RecUpdate i) a b+ valu [19, a, b] = valu2 A.ScopedExpr a b+ valu [20, a, b] = valu2 (A.QuoteGoal i) a b+ valu [21] = valu0 (A.Quote i)+ valu [22] = valu0 (A.QuoteTerm i)+ valu [23] = valu0 (A.Unquote i)+ valu [24, a] = valu1 A.DontCare a+ valu [25, a] = valu1 A.PatternSyn a+ valu _ = malformed++ i = ExprRange noRange++instance EmbPrj A.Pattern where+ icode (A.VarP a) = icode1 0 a+ icode (A.ConP _ a b) = icode2 1 a b+ icode (A.DefP _ a b) = icode2 2 a b+ icode (A.WildP _) = icode0 3+ icode (A.AsP _ a b) = icode2 4 a b+ icode (A.DotP _ a) = icode1 5 a+ icode (A.AbsurdP _) = icode0 6+ icode (A.LitP a) = icode1 7 a+ icode (A.ImplicitP _) = icode0 8+ icode (A.PatternSynP _ a b) = icode2 9 a b++ value = vcase valu+ where+ valu [0, a] = valu1 A.VarP a+ valu [1, a, b] = valu2 (A.ConP i) a b+ valu [2, a, b] = valu2 (A.DefP i) a b+ valu [3] = valu0 (A.WildP i)+ valu [4, a, b] = valu2 (A.AsP i) a b+ valu [5, a] = valu1 (A.DotP i) a+ valu [6] = valu0 (A.AbsurdP i)+ valu [7, a] = valu1 (A.LitP) a+ valu [8] = valu0 (A.ImplicitP i)+ valu [9, a, b] = valu2 (A.PatternSynP i) a b+ valu _ = malformed++ i = PatRange noRange++instance EmbPrj A.LamBinding where+ icode (A.DomainFree a b c) = icode3 0 a b c+ icode (A.DomainFull a) = icode1 1 a++ value = vcase valu where valu [0, a, b, c] = valu3 A.DomainFree a b c+ valu [1, a] = valu1 A.DomainFull a+ valu _ = malformed++instance EmbPrj A.TypedBindings where+ icode (A.TypedBindings a b) = icode2' a b++ value = vcase valu where valu [a, b] = valu2 A.TypedBindings a b+ valu _ = malformed++instance EmbPrj A.TypedBinding where+ icode (A.TBind a b c) = icode3 0 a b c+ icode (A.TNoBind a) = icode1 1 a++ value = vcase valu where valu [0, a, b, c] = valu3 A.TBind a b c+ valu [1, a] = valu1 A.TNoBind a+ valu _ = malformed++instance EmbPrj A.LetBinding where+ icode (A.LetBind _ a b c d) = icode4 0 a b c d+ icode (A.LetPatBind _ a b ) = icode2 1 a b+ icode (A.LetApply _ _ _ _ _) = icode0 2+ icode (A.LetOpen _ _) = icode0 2++ value = vcase valu+ where+ valu [0, a, b, c, d] = valu4 (A.LetBind (LetRange noRange)) a b c d+ valu [1, a, b] = valu2 (A.LetPatBind (LetRange noRange)) a b+ valu [2] = throwError $ NotSupported+ "importing pattern synonym containing let module"+ valu _ = malformed+ instance EmbPrj NameId where icode (NameId a b) = icode2' a b value = vcase valu where valu [a, b] = valu2 NameId a b@@ -465,6 +608,10 @@ value = vcase valu where valu [a, b] = valu2 Sig a b valu _ = malformed +instance (Eq k, Hashable k, EmbPrj k, EmbPrj v) => EmbPrj (HashMap k v) where+ icode m = icode (HMap.toList m)+ value m = HMap.fromList `fmap` value m+ instance EmbPrj Section where icode (Section a b) = icode2' a b value = vcase valu where valu [a, b] = valu2 Section a b@@ -487,6 +634,11 @@ value = vcase valu where valu [a, b, c] = valu3 Arg a b c valu _ = malformed +instance (EmbPrj a) => EmbPrj (Agda.Syntax.Common.Dom a) where+ icode (Dom a b c) = icode3' a b c+ value = vcase valu where valu [a, b, c] = valu3 Dom a b c+ valu _ = malformed+ instance EmbPrj Agda.Syntax.Common.Induction where icode Inductive = icode0' icode CoInductive = icode0 1@@ -508,10 +660,12 @@ icode Irrelevant = icode0 1 icode Forced = icode0 2 icode NonStrict = icode0 3+ icode UnusedArg = icode0 4 value = vcase valu where valu [] = valu0 Relevant valu [1] = valu0 Irrelevant valu [2] = valu0 Forced valu [3] = valu0 NonStrict+ valu [4] = valu0 UnusedArg valu _ = malformed instance EmbPrj I.Type where@@ -537,17 +691,32 @@ icode (MetaV a b) = __IMPOSSIBLE__ icode (DontCare a ) = icode1 8 a icode (Level a ) = icode1 9 a- value = vcase valu where valu [0, a, b] = valu2 Var a b- valu [1, a, b] = valu2 Lam a b- valu [2, a] = valu1 Lit a- valu [3, a, b] = valu2 Def a b- valu [4, a, b] = valu2 Con a b- valu [5, a, b] = valu2 Pi a b- valu [7, a] = valu1 Sort a- valu [8, a] = valu1 DontCare a- valu [9, a] = valu1 Level a- valu _ = malformed+ icode (Shared p) = do+ h <- asks termD+ mi <- liftIO $ H.lookup h p+ st <- asks sharingStats+ case mi of+ Just i -> liftIO $ modifyIORef st (\(a, b) -> ((,) $! a + 1) b) >> return i+ Nothing -> do+ liftIO $ modifyIORef st (\(a, b) -> (,) a $! b + 1)+ n <- icode (derefPtr p)+ liftIO $ H.insert h p n+ return n + value r = vcase valu' r+ where+ valu' xs = shared <$> valu xs+ valu [0, a, b] = valu2 Var a b+ valu [1, a, b] = valu2 Lam a b+ valu [2, a] = valu1 Lit a+ valu [3, a, b] = valu2 Def a b+ valu [4, a, b] = valu2 Con a b+ valu [5, a, b] = valu2 Pi a b+ valu [7, a] = valu1 Sort a+ valu [8, a] = valu1 DontCare a+ valu [9, a] = valu1 Level a+ valu _ = malformed+ instance EmbPrj Level where icode (Max a) = icode1' a value = vcase valu where valu [a] = valu1 Max a@@ -624,9 +793,9 @@ value n = MutId `fmap` value n instance EmbPrj Definition where- icode (Defn rel a b c d e f) = icode7' rel a b c d e f- value = vcase valu where valu [rel, a, b, c, d, e, f] = valu7 Defn rel a b c d e f- valu _ = malformed+ icode (Defn rel a b c d e f g h) = icode9' rel a (P.killRange b) c d e f g h+ value = vcase valu where valu [rel, a, b, c, d, e, f, g, h] = valu9 Defn rel a b c d e f g h+ valu _ = malformed instance EmbPrj HaskellRepresentation where icode (HsType a) = icode1' a@@ -688,22 +857,30 @@ icode Covariant = icode0' icode Contravariant = icode0 1 icode Invariant = icode0 2+ icode Nonvariant = icode0 3 value = vcase valu where valu [] = valu0 Covariant valu [1] = valu0 Contravariant valu [2] = valu0 Invariant+ valu [3] = valu0 Nonvariant valu _ = malformed instance EmbPrj Occurrence where- icode Positive = icode0'- icode Negative = icode0 1- icode Unused = icode0 2+ icode StrictPos = icode0'+ icode Mixed = icode0 1+ icode Unused = icode0 2+ icode GuardPos = icode0 3+ icode JustPos = icode0 4+ icode JustNeg = icode0 5 value = vcase valu where- valu [] = valu0 Positive- valu [1] = valu0 Negative+ valu [] = valu0 StrictPos+ valu [1] = valu0 Mixed valu [2] = valu0 Unused+ valu [3] = valu0 GuardPos+ valu [4] = valu0 JustPos+ valu [5] = valu0 JustNeg valu _ = malformed instance EmbPrj CompiledRepresentation where@@ -712,21 +889,28 @@ valu _ = malformed instance EmbPrj Defn where- icode Axiom = icode0 0- icode (Function a b c d e f g h i) = icode9 1 a b c d e f g h i- icode (Datatype a b c d e f g h i) = icode9 2 a b c d e f g h i- icode (Record a b c d e f g h i j k) = icode11 3 a b c d e f g h i j k- icode (Constructor a b c d e) = icode5 4 a b c d e- icode (Primitive a b c d) = icode4 5 a b c d+ icode Axiom = icode0 0+ icode (Function a b c d e f g h i j) = icode10 1 a b c d e f g h i j+ icode (Datatype a b c d e f g h) = icode8 2 a b c d e f g h+ icode (Record a b c d e f g h i j k l) = icode12 3 a b c d e f g h i j k l+ icode (Constructor a b c d e) = icode5 4 a b c d e+ icode (Primitive a b c d) = icode4 5 a b c d value = vcase valu where- valu [0] = valu0 Axiom- valu [1, a, b, c, d, e, f, g, h, i] = valu9 Function a b c d e f g h i- valu [2, a, b, c, d, e, f, g, h, i] = valu9 Datatype a b c d e f g h i- valu [3, a, b, c, d, e, f, g, h, i, j, k] = valu11 Record a b c d e f g h i j k- valu [4, a, b, c, d, e] = valu5 Constructor a b c d e- valu [5, a, b, c, d] = valu4 Primitive a b c d- valu _ = malformed+ valu [0] = valu0 Axiom+ valu [1, a, b, c, d, e, f, g, h, i, j] = valu10 Function a b c d e f g h i j+ valu [2, a, b, c, d, e, f, g, h] = valu8 Datatype a b c d e f g h+ valu [3, a, b, c, d, e, f, g, h, i, j, k, l]= valu12 Record a b c d e f g h i j k l+ valu [4, a, b, c, d, e] = valu5 Constructor a b c d e+ valu [5, a, b, c, d] = valu4 Primitive a b c d+ valu _ = malformed +instance EmbPrj a => EmbPrj (WithArity a) where+ icode (WithArity a b) = icode2' a b++ value = vcase valu where+ valu [a, b] = valu2 WithArity a b+ valu _ = malformed+ instance EmbPrj a => EmbPrj (Case a) where icode (Branches a b c) = icode3' a b c @@ -736,7 +920,7 @@ instance EmbPrj CompiledClauses where icode Fail = icode0'- icode (Done a b) = icode2' a b+ icode (Done a b) = icode2' a (P.killRange b) icode (Case a b) = icode2 2 a b value = vcase valu where@@ -855,6 +1039,8 @@ icode HP.UnsolvedMeta = icode0 2 icode HP.TerminationProblem = icode0 3 icode HP.IncompletePattern = icode0 4+ icode HP.TypeChecks = icode0 5+ icode HP.UnsolvedConstraint = icode0 6 value = vcase valu where valu [0] = valu0 HP.Error@@ -862,6 +1048,8 @@ valu [2] = valu0 HP.UnsolvedMeta valu [3] = valu0 HP.TerminationProblem valu [4] = valu0 HP.IncompletePattern+ valu [5] = valu0 HP.TypeChecks+ valu [6] = valu0 HP.UnsolvedConstraint valu _ = malformed instance EmbPrj HP.MetaInfo where@@ -901,10 +1089,19 @@ value = vcase valu where valu [a, b, c, d] = valu4 ScopeInfo a b c d valu _ = malformed +instance EmbPrj HP.CompressedFile where+ icode (HP.CompressedFile f) = icode1' f+ value = vcase valu+ where+ valu [f] = valu1 HP.CompressedFile f+ valu _ = malformed+ instance EmbPrj Interface where- icode (Interface a b c d e f g h i) = icode9' a b c d e f g h i- value = vcase valu where valu [a, b, c, d, e, f, g, h, i] = valu9 Interface a b c d e f g h i- valu _ = malformed+ icode (Interface a b c d e f g h i j) = icode10' a b c d e f g h i j+ value = vcase valu+ where+ valu [a, b, c, d, e, f, g, h, i, j] = valu10 Interface a b c d e f g h i j+ valu _ = malformed -- This is used for the Epic compiler backend instance EmbPrj Epic.EInterface where@@ -942,8 +1139,6 @@ valu [1, a] = valu1 Epic.PrimTag a valu _ = malformed -{-# SPECIALIZE icodeX :: (Dict -> HashTable [Int32] Int32) ->- (Dict -> IORef Int32) -> [Int32] -> S Int32 #-} icodeX :: (Eq k, Hashable k) => (Dict -> HashTable k Int32) -> (Dict -> IORef Int32) -> k -> S Int32@@ -968,7 +1163,7 @@ vcase valu = \ix -> do memo <- gets nodeMemo (aTyp, maybeU) <- liftIO $ do- let aTyp = TypeRep' $ typeOf (undefined :: a)+ let aTyp = typeOf (undefined :: a) maybeU <- H.lookup memo (ix, aTyp) return (aTyp, maybeU) case maybeU of@@ -991,6 +1186,8 @@ icode10 tag a b c d e f g h i j = icodeN . (tag :) =<< sequence [icode a, icode b, icode c, icode d, icode e, icode f, icode g, icode h, icode i, icode j] icode11 tag a b c d e f g h i j k = icodeN . (tag :) =<< sequence [icode a, icode b, icode c, icode d, icode e, icode f, icode g, icode h, icode i, icode j, icode k] icode12 tag a b c d e f g h i j k l = icodeN . (tag :) =<< sequence [icode a, icode b, icode c, icode d, icode e, icode f, icode g, icode h, icode i, icode j, icode k, icode l]+icode13 tag a b c d e f g h i j k l m = icodeN . (tag :) =<< sequence [icode a, icode b, icode c, icode d, icode e, icode f, icode g, icode h, icode i, icode j, icode k, icode l, icode m]+icode14 tag a b c d e f g h i j k l m n = icodeN . (tag :) =<< sequence [icode a, icode b, icode c, icode d, icode e, icode f, icode g, icode h, icode i, icode j, icode k, icode l, icode m, icode n] icode0' = icodeN [] icode1' a = icodeN =<< sequence [icode a]@@ -1005,20 +1202,24 @@ icode10' a b c d e f g h i j = icodeN =<< sequence [icode a, icode b, icode c, icode d, icode e, icode f, icode g, icode h, icode i, icode j] icode11' a b c d e f g h i j k = icodeN =<< sequence [icode a, icode b, icode c, icode d, icode e, icode f, icode g, icode h, icode i, icode j, icode k] icode12' a b c d e f g h i j k l = icodeN =<< sequence [icode a, icode b, icode c, icode d, icode e, icode f, icode g, icode h, icode i, icode j, icode k, icode l]+icode13' a b c d e f g h i j k l m = icodeN =<< sequence [icode a, icode b, icode c, icode d, icode e, icode f, icode g, icode h, icode i, icode j, icode k, icode l, icode m]+icode14' a b c d e f g h i j k l m n = icodeN =<< sequence [icode a, icode b, icode c, icode d, icode e, icode f, icode g, icode h, icode i, icode j, icode k, icode l, icode m, icode n] -valu0 z = return z-valu1 z a = valu0 z `ap` value a-valu2 z a b = valu1 z a `ap` value b-valu3 z a b c = valu2 z a b `ap` value c-valu4 z a b c d = valu3 z a b c `ap` value d-valu5 z a b c d e = valu4 z a b c d `ap` value e-valu6 z a b c d e f = valu5 z a b c d e `ap` value f-valu7 z a b c d e f g = valu6 z a b c d e f `ap` value g-valu8 z a b c d e f g h = valu7 z a b c d e f g `ap` value h-valu9 z a b c d e f g h i = valu8 z a b c d e f g h `ap` value i-valu10 z a b c d e f g h i j = valu9 z a b c d e f g h i `ap` value j-valu11 z a b c d e f g h i j k = valu10 z a b c d e f g h i j `ap` value k-valu12 z a b c d e f g h i j k l = valu11 z a b c d e f g h i j k `ap` value l+valu0 z = return z+valu1 z a = valu0 z `ap` value a+valu2 z a b = valu1 z a `ap` value b+valu3 z a b c = valu2 z a b `ap` value c+valu4 z a b c d = valu3 z a b c `ap` value d+valu5 z a b c d e = valu4 z a b c d `ap` value e+valu6 z a b c d e f = valu5 z a b c d e `ap` value f+valu7 z a b c d e f g = valu6 z a b c d e f `ap` value g+valu8 z a b c d e f g h = valu7 z a b c d e f g `ap` value h+valu9 z a b c d e f g h i = valu8 z a b c d e f g h `ap` value i+valu10 z a b c d e f g h i j = valu9 z a b c d e f g h i `ap` value j+valu11 z a b c d e f g h i j k = valu10 z a b c d e f g h i j `ap` value k+valu12 z a b c d e f g h i j k l = valu11 z a b c d e f g h i j k `ap` value l+valu13 z a b c d e f g h i j k l m = valu12 z a b c d e f g h i j k l `ap` value m+valu14 z a b c d e f g h i j k l m n = valu13 z a b c d e f g h i j k l m `ap` value n -- | Creates an empty dictionary. @@ -1032,8 +1233,10 @@ <*> H.new <*> H.new <*> H.new+ <*> H.new <*> newIORef 0 <*> newIORef 0 <*> newIORef 0 <*> newIORef 0+ <*> newIORef (0, 0) <*> return fileMod
src/full/Agda/TypeChecking/SizedTypes.hs view
@@ -1,31 +1,106 @@-{-# LANGUAGE CPP #-}+{-# LANGUAGE CPP, PatternGuards #-} module Agda.TypeChecking.SizedTypes where import Control.Monad.Error import Control.Monad++import Data.Function import Data.List import qualified Data.Map as Map import Agda.Interaction.Options+ import Agda.Syntax.Common import Agda.Syntax.Internal+ import Agda.TypeChecking.Monad import Agda.TypeChecking.Monad.Builtin import Agda.TypeChecking.Pretty import Agda.TypeChecking.Reduce-import Agda.TypeChecking.MetaVars+import {-# SOURCE #-} Agda.TypeChecking.MetaVars import Agda.TypeChecking.Substitute import Agda.TypeChecking.Telescope import {-# SOURCE #-} Agda.TypeChecking.Conversion-import Agda.TypeChecking.Constraints+import {-# SOURCE #-} Agda.TypeChecking.Constraints+ import qualified Agda.Utils.Warshall as W import Agda.Utils.List+import Agda.Utils.Maybe import Agda.Utils.Monad import Agda.Utils.Impossible import Agda.Utils.Size+import Agda.Utils.Tuple+import Agda.Utils.Pretty (render) #include "../undefined.h" +builtinSizeHook :: String -> QName -> Term -> Type -> TCM ()+builtinSizeHook s q e' t = do+ when (s `elem` [builtinSizeLt, builtinSizeSuc]) $ do+ modifySignature $ updateDefinition q+ $ updateDefPolarity (const [Covariant])+ . updateDefArgOccurrences (const [StrictPos])+ when (s == builtinSizeMax) $ do+ modifySignature $ updateDefinition q+ $ updateDefPolarity (const [Covariant, Covariant])+ . updateDefArgOccurrences (const [StrictPos, StrictPos])+{-+ . updateDefType (const tmax)+ where+ -- TODO: max : (i j : Size) -> Size< (suc (max i j))+ tmax =+-}++-- | Compute the deep size view of a term.+-- Precondition: sized types are enabled.+deepSizeView :: Term -> TCM DeepSizeView+deepSizeView v = do+ Def inf [] <- ignoreSharing <$> primSizeInf+ Def suc [] <- ignoreSharing <$> primSizeSuc+ let loop v = do+ v <- reduce v+ case ignoreSharing v of+ Def x [] | x == inf -> return $ DSizeInf+ Def x [u] | x == suc -> sizeViewSuc_ suc <$> loop (unArg u)+ Var i [] -> return $ DSizeVar i 0+ MetaV x us -> return $ DSizeMeta x us 0+ _ -> return $ DOtherSize v+ loop v++sizeMaxView :: Term -> TCM SizeMaxView+sizeMaxView v = do+ inf <- getBuiltinDefName builtinSizeInf+ suc <- getBuiltinDefName builtinSizeSuc+ max <- getBuiltinDefName builtinSizeMax+ let loop v = do+ v <- reduce v+ case v of+ Def x [] | Just x == inf -> return $ [DSizeInf]+ Def x [u] | Just x == suc -> maxViewSuc_ (fromJust suc) <$> loop (unArg u)+ Def x [u1,u2] | Just x == max -> maxViewMax <$> loop (unArg u1) <*> loop (unArg u2)+ Var i [] -> return $ [DSizeVar i 0]+ MetaV x us -> return $ [DSizeMeta x us 0]+ _ -> return $ [DOtherSize v]+ loop v++-- | Account for subtyping @Size< i =< Size@+-- Preconditions:+-- @m = x els1@, @n = y els2@, @m@ and @n@ are not equal.+trySizeUniv :: Comparison -> Type -> Term -> Term+ -> QName -> [Elim] -> QName -> [Elim] -> TCM ()+trySizeUniv cmp t m n x els1 y els2 = do+ let failure = typeError $ UnequalTerms cmp m n t+ forceInfty u = compareSizes CmpEq (unArg u) =<< primSizeInf+ (size, sizelt) <- flip catchError (const failure) $ do+ Def size _ <- ignoreSharing <$> primSize+ Def sizelt _ <- ignoreSharing <$> primSizeLt+ return (size, sizelt)+ case (cmp, els1, els2) of+ (CmpLeq, [_], []) | x == sizelt && y == size -> return ()+ (_, [Apply u], []) | x == sizelt && y == size -> forceInfty u+ (_, [], [Apply u]) | x == size && y == sizelt -> forceInfty u+ _ -> failure+ -- | Compare two sizes. Only with --sized-types. compareSizes :: Comparison -> Term -> Term -> TCM () compareSizes cmp u v = do@@ -35,12 +110,123 @@ , prettyTCM v ] ]+{- u <- reduce u v <- reduce v reportSDoc "tc.conv.size" 15 $ nest 2 $ sep [ text (show u) <+> prettyTCM cmp , text (show v) ]+-}+ us <- sizeMaxView u+ vs <- sizeMaxView v+ compareMaxViews cmp us vs++compareMaxViews :: Comparison -> SizeMaxView -> SizeMaxView -> TCM ()+compareMaxViews cmp us vs = case (cmp, us, vs) of+ (CmpLeq, _, (DSizeInf : _)) -> return ()+ (cmp, [u], [v]) -> compareSizeViews cmp u v+ (CmpLeq, us, [v]) -> forM_ us $ \ u -> compareSizeViews cmp u v+ (CmpLeq, us, vs) -> forM_ us $ \ u -> compareBelowMax u vs+ (CmpEq, us, vs) -> compareMaxViews CmpLeq us vs >> compareMaxViews CmpLeq vs us+-- _ -> typeError $ NotImplemented "compareMaxViews"++-- | @compareBelowMax u vs@ checks @u <= max vs@. Precondition: @size vs >= 2@+compareBelowMax :: DeepSizeView -> SizeMaxView -> TCM ()+compareBelowMax u vs =+ alt (dontAssignMetas $ alts $ map (compareSizeViews CmpLeq u) vs) $ do+ u <- unDeepSizeView u+ v <- unMaxView vs+ size <- sizeType+ addConstraint $ ValueCmp CmpLeq size u v+ where alt c1 c2 = c1 `catchError` const c2+ alts [] = __IMPOSSIBLE__+ alts [c] = c+ alts (c:cs) = c `alt` alts cs++compareSizeViews :: Comparison -> DeepSizeView -> DeepSizeView -> TCM ()+compareSizeViews cmp s1' s2' = do+ size <- sizeType+ let (s1, s2) = removeSucs (s1', s2')+ withUnView cont = do+ u <- unDeepSizeView s1+ v <- unDeepSizeView s2+ cont u v+ failure = withUnView $ \ u v -> typeError $ UnequalTerms cmp u v size+ continue cmp = withUnView $ compareAtom cmp size+ case (cmp, s1, s2) of+ (CmpLeq, _, DSizeInf) -> return ()+ (CmpEq, DSizeInf, DSizeInf) -> return ()+ (CmpEq, DSizeVar{}, DSizeInf) -> failure+ (_ , DSizeInf, DSizeVar{}) -> failure+ (_ , DSizeInf, _ ) -> continue CmpEq+ (CmpLeq, DSizeVar i n, DSizeVar j m) | i == j -> unless (n <= m) failure+ (CmpLeq, DSizeVar i n, DSizeVar j m) | i /= j -> do+ res <- isBounded i+ case res of+ BoundedNo -> failure+ BoundedLt u' -> do+ -- now we have i < u', in the worst case i+1 = u'+ -- and we want to check i+n <= v+ v <- unDeepSizeView s2+ if n > 0 then do+ u'' <- sizeSuc (n - 1) u'+ compareSizes cmp u'' v+ else compareSizes cmp u' =<< sizeSuc 1 v+ (CmpLeq, s1, s2) -> withUnView $ \ u v -> do+ unlessM (trivial u v) $ addConstraint $ ValueCmp CmpLeq size u v+ (CmpEq, s1, s2) -> continue cmp++{-+-- | Compare two sizes. Only with --sized-types.+compareSizes :: Comparison -> Term -> Term -> TCM ()+compareSizes cmp u v = do+ reportSDoc "tc.conv.size" 10 $ vcat+ [ text "Comparing sizes"+ , nest 2 $ sep [ prettyTCM u <+> prettyTCM cmp+ , prettyTCM v+ ]+ ]+ u <- reduce u+ v <- reduce v+ reportSDoc "tc.conv.size" 15 $+ nest 2 $ sep [ text (show u) <+> prettyTCM cmp+ , text (show v)+ ]+ s1' <- deepSizeView u+ s2' <- deepSizeView v+ size <- sizeType+ let failure = typeError $ UnequalTerms cmp u v size+ (s1, s2) = removeSucs (s1', s2')+ continue cmp = do+ u <- unDeepSizeView s1+ v <- unDeepSizeView s2+ compareAtom cmp size u v+ case (cmp, s1, s2) of+ (CmpLeq, _, DSizeInf) -> return ()+ (CmpEq, DSizeInf, DSizeInf) -> return ()+ (CmpEq, DSizeVar{}, DSizeInf) -> failure+ (_ , DSizeInf, DSizeVar{}) -> failure+ (_ , DSizeInf, _ ) -> continue CmpEq+ (CmpLeq, DSizeVar i n, DSizeVar j m) | i == j -> unless (n <= m) failure+ (CmpLeq, DSizeVar i n, DSizeVar j m) | i /= j -> do+ res <- isBounded i+ case res of+ BoundedNo -> failure+ BoundedLt u' ->+ -- now we have i < u', in the worst case i+1 = u'+ -- and we want to check i+n <= v+ if n > 0 then do+ u'' <- sizeSuc (n - 1) u'+ compareSizes cmp u'' v+ else compareSizes cmp u' =<< sizeSuc 1 v+ (CmpLeq, s1, s2) -> do+ u <- unDeepSizeView s1+ v <- unDeepSizeView s2+ unlessM (trivial u v) $ addConstraint $ ValueCmp CmpLeq size u v+ (CmpEq, s1, s2) -> continue cmp+-}+{- s1 <- sizeView u s2 <- sizeView v size <- sizeType@@ -51,103 +237,205 @@ (_, SizeInf, SizeSuc v) -> compareSizes CmpEq u v (_, SizeSuc u, SizeSuc v) -> compareSizes cmp u v (CmpLeq, _, _) ->- ifM (trivial u v) (return ()) $- addConstraint $ ValueCmp CmpLeq size u v+ unlessM (trivial u v) $ addConstraint $ ValueCmp CmpLeq size u v _ -> compareAtom cmp size u v+-} +isBounded :: Nat -> TCM BoundedSize+isBounded i = do+ t <- reduce =<< typeOfBV i+ case ignoreSharing $ unEl t of+ Def x [u] -> do+ sizelt <- getBuiltin' builtinSizeLt+ return $ if (Just (Def x []) == sizelt) then BoundedLt $ unArg u else BoundedNo+ _ -> return BoundedNo+ trivial :: Term -> Term -> TCM Bool trivial u v = do a <- sizeExpr u b <- sizeExpr v+ let triv = case (a, b) of+ -- Andreas, 2012-02-24 filtering out more trivial constraints fixes+ -- test/lib-succeed/SizeInconsistentMeta4.agda+ ((e, n), (e', n')) -> e == e' && n <= n'+ {-+ ((Rigid i, n), (Rigid j, m)) -> i == j && n <= m+ _ -> False+ -} reportSDoc "tc.conv.size" 15 $- nest 2 $ sep [ text (show a) <+> text "<="+ nest 2 $ sep [ if triv then text "trivial constraint" else empty+ , text (show a) <+> text "<=" , text (show b) ]- return $ case (a, b) of- ((Rigid i, n), (Rigid j, m)) -> i == j && n <= m- _ -> False+ return triv `catchError` \_ -> return False +-- | Whenever we create a bounded size meta, add a constraint+-- expressing the bound.+-- In @boundedSizeMetaHook v tel a@, @tel@ includes the current context.+boundedSizeMetaHook :: Term -> Telescope -> Type -> TCM ()+boundedSizeMetaHook v tel0 a = do+ res <- isSizeType a+ case res of+ Just (BoundedLt u) -> do+ n <- getContextSize+ let tel | n > 0 = telFromList $ genericDrop n $ telToList tel0+ | otherwise = tel0+ addCtxTel tel $ do+ v <- sizeSuc 1 $ raise (size tel) v `apply` teleArgs tel+ -- compareSizes CmpLeq v u+ size <- sizeType+ addConstraint $ ValueCmp CmpLeq size v u+ _ -> return ()++-- | Test whether a problem consists only of size constraints.+isSizeProblem :: ProblemId -> TCM Bool+isSizeProblem pid = andM . map (isSizeConstraint . theConstraint) =<< getConstraintsForProblem pid++-- | Test is a constraint speaks about sizes.+isSizeConstraint :: Closure Constraint -> TCM Bool+isSizeConstraint (Closure{ clValue = ValueCmp _ s _ _ }) = isJust <$> isSizeType s+isSizeConstraint _ = return False+ -- | Find the size constraints.-getSizeConstraints :: TCM [SizeConstraint]+getSizeConstraints :: TCM [Closure Constraint] getSizeConstraints = do cs <- getAllConstraints- size <- sizeType- let sizeConstraints cl@(Closure{ clValue = ValueCmp CmpLeq s _ _ })- | s == size = [cl]- sizeConstraints _ = []- scs <- mapM computeSizeConstraint $ concatMap (sizeConstraints . theConstraint) cs- return [ c | Just c <- scs ]+ test <- isSizeTypeTest+ let sizeConstraint cl@Closure{ clValue = ValueCmp CmpLeq s _ _ }+ | isJust (test s) = Just cl+ sizeConstraint _ = Nothing+ return $ mapMaybe (sizeConstraint . theConstraint) cs getSizeMetas :: TCM [(MetaId, Int)] getSizeMetas = do ms <- getOpenMetas- sz <- sizeType+ test <- isSizeTypeTest let sizeCon m = do+ let nothing = return [] mi <- lookupMeta m case mvJudgement mi of HasType _ a -> do TelV tel b <- telView =<< instantiateFull a- if b /= sz- then return []- else return [(m, size tel)]- _ -> return []+ case test b of+ Nothing -> nothing+ Just _ -> return [(m, size tel)]+ _ -> nothing concat <$> mapM sizeCon ms -data SizeExpr = SizeMeta MetaId [CtxId]- | Rigid CtxId+{- ROLLED BACK+getSizeMetas :: TCM ([(MetaId, Int)], [SizeConstraint])+getSizeMetas = do+ ms <- getOpenMetas+ test <- isSizeTypeTest+ let sizeCon m = do+ let nothing = return ([], [])+ mi <- lookupMeta m+ case mvJudgement mi of+ HasType _ a -> do+ TelV tel b <- telView =<< instantiateFull a+ let noConstr = return ([(m, size tel)], [])+ case test b of+ Nothing -> nothing+ Just BoundedNo -> noConstr+ Just (BoundedLt u) -> noConstr+{- WORKS NOT+ Just (BoundedLt u) -> flip catchError (const $ noConstr) $ do+ -- we assume the metavariable is used in an+ -- extension of its creation context+ ctxIds <- getContextId+ let a = SizeMeta m $ take (size tel) $ reverse ctxIds+ (b, n) <- sizeExpr u+ return ([(m, size tel)], [Leq a (n-1) b])+-}+ _ -> nothing+ (mss, css) <- unzip <$> mapM sizeCon ms+ return (concat mss, concat css)+-} --- Leq a n b = (a =< b + n)-data SizeConstraint = Leq SizeExpr Int SizeExpr+-- | Atomic size expressions.+data SizeExpr+ = SizeMeta MetaId [Int] -- ^ A size meta applied to de Bruijn levels.+ | Rigid Int -- ^ A de Bruijn level.+ deriving (Eq) instance Show SizeExpr where show (SizeMeta m _) = "X" ++ show (fromIntegral m :: Int)- show (Rigid i) = "c" ++ show (fromIntegral i :: Int)+ show (Rigid i) = "c" ++ show i +-- | Size constraints we can solve.+data SizeConstraint+ = Leq SizeExpr Int SizeExpr -- ^ @Leq a +n b@ represents @a =< b + n@.+ -- @Leq a -n b@ represents @a + n =< b@.+ instance Show SizeConstraint where show (Leq a n b) | n == 0 = show a ++ " =< " ++ show b | n > 0 = show a ++ " =< " ++ show b ++ " + " ++ show n | otherwise = show a ++ " + " ++ show (-n) ++ " =< " ++ show b -computeSizeConstraint :: Closure Constraint -> TCM (Maybe SizeConstraint)-computeSizeConstraint cl =- enterClosure cl $ \c ->- case c of+-- | Compute a set of size constraints that all live in the same context+-- from constraints over terms of type size that may live in different+-- contexts.+--+-- cf. 'Agda.TypeChecking.LevelConstraints.simplifyLevelConstraint'+computeSizeConstraints :: [Closure Constraint] -> TCM [SizeConstraint]+computeSizeConstraints [] = return [] -- special case to avoid maximum []+computeSizeConstraints cs = do+ scs <- mapM computeSizeConstraint leqs+ return [ c | Just c <- scs ]+ where+ -- get the constraints plus contexts they are defined in+ unClosure cl = (envContext $ clEnv cl, clValue cl)+ (gammas, ls) = unzip $ map unClosure cs+ -- compute the longest context (common water level)+ gamma = maximumBy (compare `on` size) gammas+ waterLevel = size gamma+ -- convert deBruijn indices to deBruijn levels to+ -- enable comparing constraints under different contexts+ leqs = zipWith raise (map ((waterLevel -) . size) gammas) ls++-- | Turn a constraint over de Bruijn levels into a size constraint.+computeSizeConstraint :: Constraint -> TCM (Maybe SizeConstraint)+computeSizeConstraint c = case c of ValueCmp CmpLeq _ u v -> do+ reportSDoc "tc.size.solve" 50 $ sep+ [ text "converting size constraint"+ , prettyTCM c+ ] (a, n) <- sizeExpr u (b, m) <- sizeExpr v return $ Just $ Leq a (m - n) b- `catchError` \err -> case errError err of+ `catchError` \err -> case err of PatternErr _ -> return Nothing _ -> throwError err _ -> __IMPOSSIBLE__ --- | Throws a 'patternViolation' if the term isn't a proper size expression.+-- | Turn a term with de Bruijn levels into a size expression with offset.+--+-- Throws a 'patternViolation' if the term isn't a proper size expression. sizeExpr :: Term -> TCM (SizeExpr, Int) sizeExpr u = do u <- reduce u -- Andreas, 2009-02-09. -- This is necessary to surface the solutions of metavariables.+ reportSDoc "tc.conv.size" 60 $ text "sizeExpr:" <+> prettyTCM u s <- sizeView u case s of- SizeSuc u -> do- (e, n) <- sizeExpr u- return (e, n + 1)- SizeInf -> patternViolation- OtherSize u -> case u of- Var i [] -> do- cxt <- getContextId- return (Rigid (cxt !! fromIntegral i), 0)- MetaV m args- | all isVar args && distinct args -> do- cxt <- getContextId- return (SizeMeta m [ cxt !! fromIntegral i | Arg _ _ (Var i []) <- args ], 0)+ SizeInf -> patternViolation+ SizeSuc u -> mapSnd (+1) <$> sizeExpr u+ OtherSize u -> case ignoreSharing u of+ Var i [] -> return (Rigid i, 0) -- i is already a de Bruijn level.+ MetaV m args | Just xs <- mapM isVar args, fastDistinct xs+ -> return (SizeMeta m xs, 0) _ -> patternViolation where- isVar (Arg _ _ (Var _ [])) = True- isVar _ = False+ isVar v = case ignoreSharing $ unArg v of+ Var i [] -> Just i+ _ -> Nothing -flexibleVariables :: SizeConstraint -> [(MetaId, [CtxId])]+-- | Compute list of size metavariables with their arguments+-- appearing in a constraint.+flexibleVariables :: SizeConstraint -> [(MetaId, [Int])] flexibleVariables (Leq a _ b) = flex a ++ flex b where flex (Rigid _) = []@@ -155,89 +443,166 @@ haveSizedTypes :: TCM Bool haveSizedTypes = do- Def _ [] <- primSize- Def _ [] <- primSizeInf- Def _ [] <- primSizeSuc+ Def _ [] <- ignoreSharing <$> primSize+ Def _ [] <- ignoreSharing <$> primSizeInf+ Def _ [] <- ignoreSharing <$> primSizeSuc optSizedTypes <$> pragmaOptions `catchError` \_ -> return False +-- | Convert size constraint into form where each meta is applied+-- to levels @0,1,..,n-1@ where @n@ is the arity of that meta.+--+-- @X[σ] <= t@ beomes @X[id] <= t[σ^-1]@+--+-- @X[σ] ≤ Y[τ]@ becomes @X[id] ≤ Y[τ[σ^-1]]@ or @X[σ[τ^1]] ≤ Y[id]@+-- whichever is defined. If none is defined, we give up.+--+canonicalizeSizeConstraint :: SizeConstraint -> Maybe SizeConstraint+canonicalizeSizeConstraint c@(Leq a n b) =+ case (a,b) of+ (Rigid{}, Rigid{}) -> return c+ (SizeMeta m xs, Rigid i) -> do+ j <- findIndex (==i) xs+ return $ Leq (SizeMeta m [0..size xs-1]) n (Rigid j)+ (Rigid i, SizeMeta m xs) -> do+ j <- findIndex (==i) xs+ return $ Leq (Rigid j) n (SizeMeta m [0..size xs-1])+ (SizeMeta m xs, SizeMeta l ys)+ -- try to invert xs on ys+ | Just ys' <- mapM (\ y -> findIndex (==y) xs) ys ->+ return $ Leq (SizeMeta m [0..size xs-1]) n (SizeMeta l ys')+ -- try to invert ys on xs+ | Just xs' <- mapM (\ x -> findIndex (==x) ys) xs ->+ return $ Leq (SizeMeta m xs') n (SizeMeta l [0..size ys-1])+ -- give up+ | otherwise -> Nothing+ solveSizeConstraints :: TCM () solveSizeConstraints = whenM haveSizedTypes $ do- cs <- getSizeConstraints+ reportSLn "tc.size.solve" 70 $ "Considering to solve size constraints"+ cs0 <- getSizeConstraints+ cs <- computeSizeConstraints cs0 ms <- getSizeMetas+{- ROLLED BACK+ cs0 <- getSizeConstraints+ cs1 <- computeSizeConstraints cs0+ (ms,cs2) <- getSizeMetas+ let cs = cs2 ++ cs1+-} when (not (null cs) || not (null ms)) $ do reportSLn "tc.size.solve" 10 $ "Solving size constraints " ++ show cs - let metas0 = map mkMeta $ groupOn fst $ concatMap flexibleVariables cs+ cs <- return $ mapMaybe canonicalizeSizeConstraint cs+ reportSLn "tc.size.solve" 10 $ "Canonicalized constraints: " ++ show cs++ let -- Error for giving up+ cannotSolve = typeError . GenericDocError =<<+ vcat (text "Cannot solve size constraints" : map prettyTCM cs0)++{- OLD, before canonicalize++ -- Ensure that each occurrence of a meta is applied to the same+ -- arguments ("flexible variables").+ -- Andreas, 2012-10-16 this is now redundant+ mkMeta :: [(MetaId, [Int])] -> TCM (MetaId, [Int]) mkMeta ms@((m, xs) : _)- | allEqual (map snd ms) = (m, xs)- | otherwise = error $ "Inconsistent meta: " ++ show m ++ " " ++ show (map snd ms)+ | allEqual (map snd ms) = return (m, xs)+ | otherwise = do+ reportSLn "tc.size.solve" 20 $+ "Size meta variable " ++ show m ++ " not always applied to same arguments: " ++ show (nub (map snd ms))+ cannotSolve mkMeta _ = __IMPOSSIBLE__ - mkFlex (m, xs) = W.NewFlex (fromIntegral m) $ \i -> fromIntegral i `elem` xs+ metas0 <- mapM mkMeta $ groupOn fst $ concatMap flexibleVariables cs ++ let mkFlex (m, xs) = W.NewFlex (fromIntegral m) $ \i -> fromIntegral i `elem` xs+-}++ let metas0 :: [(MetaId, Int)] -- meta id + arity+ metas0 = nub $ map (mapSnd length) $ concatMap flexibleVariables cs++ mkFlex (m, ar) = W.NewFlex (fromIntegral m) $ \i -> fromIntegral i < ar+ mkConstr (Leq a n b) = W.Arc (mkNode a) n (mkNode b)- mkNode (Rigid i) = W.Rigid $ W.RVar $ fromIntegral i+ mkNode (Rigid i) = W.Rigid $ W.RVar i mkNode (SizeMeta m _) = W.Flex $ fromIntegral m found (m, _) = elem m $ map fst metas0 + -- Compute unconstrained metas+ metas1 = filter (not . found) ms++{- OLD, before canonicalize -- Compute unconstrained metas let metas1 = map mkMeta' $ filter (not . found) ms mkMeta' (m, n) = (m, [0..fromIntegral n - 1])+-} let metas = metas0 ++ metas1 reportSLn "tc.size.solve" 15 $ "Metas: " ++ show metas0 ++ ", " ++ show metas1 - verboseS "tc.size.solve" 20 $ do- let meta (m, _) = do- j <- mvJudgement <$> lookupMeta m- reportSDoc "" 0 $ prettyTCM j- mapM_ meta metas+ verboseS "tc.size.solve" 20 $+ -- debug print the type of all size metas+ forM_ metas $ \ (m, _) ->+ reportSDoc "" 0 $ prettyTCM =<< mvJudgement <$> lookupMeta m + -- run the Warshall solver case W.solve $ map mkFlex metas ++ map mkConstr cs of- Nothing -> do- typeError $ GenericError $ "Unsolvable size constraints: " ++ show cs+ Nothing -> cannotSolve Just sol -> do reportSLn "tc.size.solve" 10 $ "Solved constraints: " ++ show sol- inf <- primSizeInf- s <- primSizeSuc+ s <- primSizeSuc+ infty <- primSizeInf let suc v = s `apply` [defaultArg v] plus v 0 = v plus v n = suc $ plus v (n - 1) inst (i, e) = do- let m = fromIntegral i++ let m = fromIntegral i -- meta variable identifier+ ar = maybe __IMPOSSIBLE__ id $ lookup m metas -- meta var arity++{- OLD args = case lookup m metas of Just xs -> xs Nothing -> __IMPOSSIBLE__+-} + term (W.SizeConst W.Infinite) = infty+ term (W.SizeVar j n) | j < ar = plus (var $ ar - j - 1) n+ term _ = __IMPOSSIBLE__++{- OLD term (W.SizeConst (W.Finite _)) = __IMPOSSIBLE__- term (W.SizeConst W.Infinite) = primSizeInf term (W.SizeVar j n) = case findIndex (==fromIntegral j) $ reverse args of- Just x -> return $ plus (Var (fromIntegral x) []) n+ Just x -> return $ plus (var x) n Nothing -> __IMPOSSIBLE__-- lam _ v = Lam NotHidden $ Abs "s" v+-}+ lam _ v = Lam NotHidden $ Abs "s" v -- hiding does not matter - b <- term e- let v = foldr lam b args -- TODO: correct hiding+ -- convert size expression to term and abstract+ v = flip (foldr lam) [0..ar-1] $ term e reportSDoc "tc.size.solve" 20 $ sep [ text (show m) <+> text ":=" , nest 2 $ prettyTCM v ] - assignTerm m v+ -- Andreas, 2012-09-25: do not assign interaction metas to \infty+ let isInf (W.SizeConst W.Infinite) = True+ isInf _ = False+ unlessM (isInteractionMeta m `and2M` return (isInf e)) $+ assignTerm m v mapM_ inst $ Map.toList sol --- type Solution = Map Int SizeExpr--- data SizeExpr = SizeVar Int Int -- e.g. x + 5--- | SizeConst Weight -- a number or infinity--- data Weight = Finite Int | Infinite--- data Node = Rigid Rigid--- | Flex FlexId--- data Rigid = RConst Weight--- | RVar RigidId+ -- Andreas, 2012-09-19+ -- The returned solution might not be consistent with+ -- the hypotheses on rigid vars (j : Size< i).+ -- Thus, we double check that all size constraints+ -- have been solved correctly.+ flip catchError (const cannotSolve) $+ noConstraints $+ forM_ cs0 $ \ cl -> enterClosure cl solveConstraint
src/full/Agda/TypeChecking/Substitute.hs view
@@ -1,4 +1,4 @@-{-# LANGUAGE CPP, TypeSynonymInstances, FlexibleInstances,+{-# LANGUAGE CPP, TypeSynonymInstances, FlexibleInstances, OverlappingInstances, DeriveDataTypeable, DeriveFunctor, StandaloneDeriving #-} module Agda.TypeChecking.Substitute where @@ -6,7 +6,7 @@ import Control.Monad.Reader import Control.Arrow ((***)) -import Data.Generics (Typeable, Data)+import Data.Typeable (Typeable) import Data.List hiding (sort) import qualified Data.List as List import Data.Function@@ -16,9 +16,10 @@ import Agda.Syntax.Common import Agda.Syntax.Internal+import Agda.Syntax.Position -import Agda.TypeChecking.Monad.Base-import Agda.TypeChecking.Free+import Agda.TypeChecking.Monad.Base as Base+import Agda.TypeChecking.Free as Free import Agda.TypeChecking.CompiledClause import Agda.Utils.Monad@@ -42,6 +43,7 @@ Con c args' -> Con c (args' ++ args) Lam _ u -> absApp u (unArg a) `apply` args0 MetaV x args' -> MetaV x (args' ++ args)+ Shared p -> Shared $ apply p args Lit{} -> __IMPOSSIBLE__ Level{} -> __IMPOSSIBLE__ Pi _ _ -> __IMPOSSIBLE__@@ -56,47 +58,56 @@ apply s [] = s apply s _ = __IMPOSSIBLE__ +instance Apply a => Apply (Ptr a) where+ apply p xs = fmap (`apply` xs) p+ instance Subst a => Apply (Tele a) where apply tel [] = tel apply EmptyTel _ = __IMPOSSIBLE__ apply (ExtendTel _ tel) (t : ts) = absApp tel (unArg t) `apply` ts instance Apply Definition where- apply (Defn rel x t df m c d) args = Defn rel x (piApply t args) df m c (apply d args)+ apply (Defn rel x t pol occ df m c d) args = Defn rel x (piApply t args) (apply pol args) (apply occ args) df m c (apply d args) +instance Apply [Base.Occurrence] where+ apply occ args = drop (length args) occ++instance Apply [Polarity] where+ apply pol args = drop (length args) pol+ instance Apply Defn where apply d [] = d apply d args = case d of Axiom{} -> d Function{ funClauses = cs, funCompiled = cc, funInv = inv- , funProjection = Nothing, funArgOccurrences = occ } ->+ , funProjection = Nothing {-, funArgOccurrences = occ -} } -> d { funClauses = apply cs args , funCompiled = apply cc args , funInv = apply inv args- , funArgOccurrences = drop (length args) occ+-- , funArgOccurrences = drop (length args) occ } Function{ funClauses = cs, funCompiled = cc, funInv = inv- , funProjection = Just (r, n), funArgOccurrences = occ }+ , funProjection = Just (r, n) {-, funArgOccurrences = occ -} } | m < n -> d { funProjection = Just (r, n - m) } | otherwise -> d { funClauses = apply cs args' , funCompiled = apply cc args' , funInv = apply inv args' , funProjection = Just (r, 0)- , funArgOccurrences = drop 1 occ+-- , funArgOccurrences = drop 1 occ } where args' = [last args] m = size args Datatype{ dataPars = np, dataClause = cl- , dataArgOccurrences = occ } ->+ {-, dataArgOccurrences = occ-} } -> d { dataPars = np - size args, dataClause = apply cl args- , dataArgOccurrences = drop (length args) occ+-- , dataArgOccurrences = drop (length args) occ } Record{ recPars = np, recConType = t, recClause = cl, recTel = tel- , recArgOccurrences = occ } ->+ {-, recArgOccurrences = occ-} } -> d { recPars = np - size args, recConType = apply t args , recClause = apply cl args, recTel = apply tel args- , recArgOccurrences = drop (length args) occ+-- , recArgOccurrences = drop (length args) occ } Constructor{ conPars = np } -> d { conPars = np - size args }@@ -116,9 +127,11 @@ Fail -> Fail Done hs t | length hs >= len -> Done (drop len hs)- (substs ([ Var (fromIntegral i) []- | i <- [0..length hs - len - 1]] ++- map unArg args) t)+ (applySubst+ (parallelS $+ [ var i | i <- [0..length hs - len - 1]] +++ map unArg args)+ t) | otherwise -> __IMPOSSIBLE__ Case n bs | n >= len -> Case (n - len) (apply bs args)@@ -126,6 +139,9 @@ where len = length args +instance Apply a => Apply (WithArity a) where+ apply (WithArity n a) args = WithArity n $ apply a args+ instance Apply a => Apply (Case a) where apply (Branches cs ls m) args = Branches (apply cs args) (apply ls args) (apply m args)@@ -138,7 +154,7 @@ apply b [] = b apply (Bind (Abs _ b)) (a:args) = subst (unArg a) b `apply` args apply (Bind (NoAbs _ b)) (_:args) = b `apply` args- apply (Body _) (_:_) = __IMPOSSIBLE__+ apply (Body v) args = Body $ v `apply` args apply NoBody _ = NoBody instance Apply DisplayTerm where@@ -182,6 +198,7 @@ piApply :: Type -> Args -> Type piApply t [] = t piApply (El _ (Pi _ b)) (a:args) = absApp b (unArg a) `piApply` args+piApply (El s (Shared p)) args = piApply (El s $ derefPtr p) args piApply _ _ = __IMPOSSIBLE__ -- | @(abstract args v) args --> v[args]@.@@ -203,29 +220,38 @@ abstract (ExtendTel arg tel') tel = ExtendTel arg $ fmap (`abstract` tel) tel' instance Abstract Definition where- abstract tel (Defn rel x t df m c d) = Defn rel x (abstract tel t) df m c (abstract tel d)+ abstract tel (Defn rel x t pol occ df m c d) =+ Defn rel x (abstract tel t) (abstract tel pol) (abstract tel occ) df m c (abstract tel d) +instance Abstract [Base.Occurrence] where+ abstract tel [] = []+ abstract tel occ = replicate (size tel) Mixed ++ occ -- TODO: check occurrence++instance Abstract [Polarity] where+ abstract tel [] = []+ abstract tel pol = replicate (size tel) Invariant ++ pol -- TODO: check polarity+ instance Abstract Defn where abstract tel d = case d of Axiom{} -> d Function{ funClauses = cs, funCompiled = cc, funInv = inv- , funProjection = Nothing, funArgOccurrences = occ } ->+ , funProjection = Nothing {-, funArgOccurrences = occ-} } -> d { funClauses = abstract tel cs, funCompiled = abstract tel cc , funInv = abstract tel inv- , funArgOccurrences = replicate (size tel) Negative ++ occ -- TODO: check occurrence+-- , funArgOccurrences = replicate (size tel) Mixed ++ occ -- TODO: check occurrence } Function{ funClauses = cs, funCompiled = cc, funInv = inv- , funProjection = Just (r, n), funArgOccurrences = occ } ->+ , funProjection = Just (r, n) {-, funArgOccurrences = occ-} } -> d { funProjection = Just (r, n + size tel) }- Datatype{ dataPars = np, dataClause = cl, dataArgOccurrences = occ } ->+ Datatype{ dataPars = np, dataClause = cl {-, dataArgOccurrences = occ-} } -> d { dataPars = np + size tel, dataClause = abstract tel cl- , dataArgOccurrences = replicate (size tel) Negative ++ occ -- TODO: check occurrence+-- , dataArgOccurrences = replicate (size tel) Mixed ++ occ -- TODO: check occurrence } Record{ recPars = np, recConType = t, recClause = cl, recTel = tel'- , recArgOccurrences = occ } ->+ {-, recArgOccurrences = occ-} } -> d { recPars = np + size tel, recConType = abstract tel t , recClause = abstract tel cl, recTel = abstract tel tel'- , recArgOccurrences = replicate (size tel) Negative ++ occ -- TODO: check occurrence+-- , recArgOccurrences = replicate (size tel) Mixed ++ occ -- TODO: check occurrence } Constructor{ conPars = np } -> d { conPars = np + size tel }@@ -243,16 +269,20 @@ instance Abstract CompiledClauses where abstract tel Fail = Fail- abstract tel (Done xs t) = Done (map (fmap fst) (telToList tel) ++ xs) t+ abstract tel (Done xs t) = Done (map (argFromDom . fmap fst) (telToList tel) ++ xs) t abstract tel (Case n bs) = Case (n + fromIntegral (size tel)) (abstract tel bs) +instance Abstract a => Abstract (WithArity a) where+ abstract tel (WithArity n a) = WithArity n $ abstract tel a+ instance Abstract a => Abstract (Case a) where abstract tel (Branches cs ls m) = Branches (abstract tel cs) (abstract tel ls) (abstract tel m) +telVars :: Telescope -> [Arg Pattern] telVars EmptyTel = []-telVars (ExtendTel arg tel) = fmap (const $ VarP $ absName tel) arg : telVars (unAbs tel)+telVars (ExtendTel (Dom h r a) tel) = Arg h r (VarP $ absName tel) : telVars (unAbs tel) instance Abstract FunctionInverse where abstract tel NotInjective = NotInjective@@ -274,262 +304,203 @@ abstractArgs :: Abstract a => Args -> a -> a abstractArgs args x = abstract tel x where- tel = foldr (\(Arg h r x) -> ExtendTel (Arg h r $ sort Prop) . Abs x) EmptyTel+ tel = foldr (\(Arg h r x) -> ExtendTel (Dom h r $ sort Prop) . Abs x) EmptyTel $ zipWith (fmap . const) names args names = cycle $ map (:[]) ['a'..'z'] -- | Substitutions. -type Substitution = [Term]+infixr 4 :#+data Substitution --- | Substitute a term for the nth free variable.----class Subst t where- substs :: Substitution -> t -> t- substUnder :: Nat -> Term -> t -> t+ = IdS -- Γ ⊢ IdS : Γ -idSub :: Telescope -> Substitution-idSub tel = [ Var i [] | i <- [0..size tel - 1] ]+ | EmptyS -- Γ ⊢ EmptyS : () -subst :: Subst t => Term -> t -> t-subst u t = substUnder 0 u t+ -- Γ ⊢ ρ : Δ+ | Wk !Int Substitution -- -------------------+ -- Γ, Ψ ⊢ Wk |Ψ| ρ : Δ -instance Subst Term where- substs us t =- case t of- Var i vs -> (us !!! i) `apply` substs us vs- Lam h m -> Lam h $ substs us m- Def c vs -> Def c $ substs us vs- Con c vs -> Con c $ substs us vs- MetaV x vs -> MetaV x $ substs us vs- Lit l -> Lit l- Level l -> levelTm $ substs us l- Pi a b -> uncurry Pi $ substs us (a,b)- Sort s -> sortTm $ substs us s- DontCare mv -> DontCare $ substs us mv- where- [] !!! n = __IMPOSSIBLE__- (x:xs) !!! 0 = x- (_:xs) !!! n = xs !!! (n - 1)- substUnder n u t =- case t of- Var i vs- | i == n -> raise n u `apply` substUnder n u vs- | i < n -> Var i $ substUnder n u vs- | otherwise -> Var (i - 1) $ substUnder n u vs- Lam h m -> Lam h $ substUnder n u m- Def c vs -> Def c $ substUnder n u vs- Con c vs -> Con c $ substUnder n u vs- MetaV x vs -> MetaV x $ substUnder n u vs- Level l -> levelTm $ substUnder n u l- Lit l -> Lit l- Pi a b -> uncurry Pi $ substUnder n u (a,b)- Sort s -> sortTm $ substUnder n u s- DontCare mv -> DontCare $ substUnder n u mv+ -- Γ ⊢ u : Aρ Γ ⊢ ρ : Δ+ | Term :# Substitution -- ---------------------+ -- Γ ⊢ u :# ρ : Δ, A -instance Subst Type where- substs us (El s t) = substs us s `El` substs us t- substUnder n u (El s t) = substUnder n u s `El` substUnder n u t+ -- Γ ⊢ ρ : Δ+ | Lift !Int Substitution -- -------------------------+ -- Γ, Ψρ ⊢ Lift |Ψ| ρ : Δ, Ψ+ deriving (Eq, Ord, Show) -instance Subst Sort where- substs us s = case s of- Type n -> levelSort $ sub n- Prop -> Prop- Inf -> Inf- DLub s1 s2 -> DLub (sub s1) (sub s2)- where sub x = substs us x+idS :: Substitution+idS = IdS - substUnder n u s = case s of- Type n -> levelSort $ sub n- Prop -> Prop- Inf -> Inf- DLub s1 s2 -> DLub (sub s1) (sub s2)- where sub x = substUnder n u x+wkS :: Int -> Substitution -> Substitution+wkS 0 rho = rho+wkS n (Wk m rho) = Wk (n + m) rho+wkS n EmptyS = EmptyS+wkS n rho = Wk n rho -instance Subst Level where- substs us (Max as) = Max $ substs us as- substUnder n u (Max as) = Max $ substUnder n u as+raiseS :: Int -> Substitution+raiseS n = wkS n idS -instance Subst PlusLevel where- substs us l@ClosedLevel{} = l- substs us (Plus n l) = Plus n $ substs us l- substUnder n u l@ClosedLevel{} = l- substUnder n u (Plus m l) = Plus m $ substUnder n u l+singletonS :: Term -> Substitution+singletonS u = u :# idS -instance Subst LevelAtom where- substs us (MetaLevel m vs) = MetaLevel m $ substs us vs- substs us (BlockedLevel m v) = BlockedLevel m $ substs us v- substs us (NeutralLevel v) = UnreducedLevel $ substs us v- substs us (UnreducedLevel v) = UnreducedLevel $ substs us v- substUnder n u (MetaLevel m vs) = MetaLevel m $ substUnder n u vs- substUnder n u (BlockedLevel m v) = BlockedLevel m $ substUnder n u v- substUnder n u (NeutralLevel v) = UnreducedLevel $ substUnder n u v- substUnder n u (UnreducedLevel v) = UnreducedLevel $ substUnder n u v+liftS :: Int -> Substitution -> Substitution+liftS 0 rho = rho+liftS k IdS = IdS+liftS k (Lift n rho) = Lift (n + k) rho+liftS k rho = Lift k rho -instance Subst Pattern where- substs us p = case p of- VarP s -> VarP s- LitP l -> LitP l- ConP c mt ps -> ConP c (substs us mt) $ substs us ps- DotP t -> DotP $ substs us t- substUnder n u p = case p of- VarP s -> VarP s- LitP l -> LitP l- ConP c mt ps -> ConP c (substUnder n u mt) $ substUnder n u ps- DotP t -> DotP $ substUnder n u t+dropS :: Int -> Substitution -> Substitution+dropS 0 rho = rho+dropS n IdS = raiseS n+dropS n (Wk m rho) = wkS m (dropS n rho)+dropS n (u :# rho) = dropS (n - 1) rho+dropS n (Lift 0 rho) = __IMPOSSIBLE__+dropS n (Lift m rho) = wkS 1 $ dropS (n - 1) $ liftS (m - 1) rho+dropS n EmptyS = __IMPOSSIBLE__ -instance Subst t => Subst (Blocked t) where- substs us b = fmap (substs us) b- substUnder n u b = fmap (substUnder n u) b+-- | @applySubst (ρ `composeS` σ) v == applySubst ρ (applySubst σ v)@+composeS :: Substitution -> Substitution -> Substitution+composeS rho IdS = rho+composeS IdS sgm = sgm+composeS rho EmptyS = EmptyS+composeS rho (Wk n sgm) = composeS (dropS n rho) sgm+composeS rho (u :# sgm) = applySubst rho u :# composeS rho sgm+composeS rho (Lift 0 sgm) = __IMPOSSIBLE__+composeS (u :# rho) (Lift n sgm) = u :# composeS rho (liftS (n - 1) sgm)+composeS rho (Lift n sgm) = lookupS rho 0 :# composeS rho (wkS 1 (liftS (n - 1) sgm)) -instance Subst DisplayTerm where- substs us (DTerm v) = DTerm $ substs us v- substs us (DDot v) = DDot $ substs us v- substs us (DCon c vs) = DCon c $ substs us vs- substs us (DDef c vs) = DDef c $ substs us vs- substs us (DWithApp vs ws) = uncurry DWithApp $ substs us (vs, ws)- substUnder n u (DTerm v) = DTerm $ substUnder n u v- substUnder n u (DDot v) = DDot $ substUnder n u v- substUnder n u (DCon c vs) = DCon c $ substUnder n u vs- substUnder n u (DDef c vs) = DDef c $ substUnder n u vs- substUnder n u (DWithApp vs ws) = uncurry DWithApp $ substUnder n u (vs, ws)+-- If Γ ⊢ ρ : Δ, Θ then splitS |Θ| ρ = (σ, δ), with+-- Γ ⊢ σ : Δ+-- Γ ⊢ δ : Θσ+splitS :: Int -> Substitution -> (Substitution, Substitution)+splitS 0 rho = (rho, EmptyS)+splitS n (u :# rho) = id *** (u :#) $ splitS (n - 1) rho+splitS n (Lift 0 _) = __IMPOSSIBLE__+splitS n (Wk m rho) = wkS m *** wkS m $ splitS n rho+splitS n IdS = (raiseS n, liftS n EmptyS)+splitS n (Lift m rho) = wkS 1 *** liftS 1 $ splitS (n - 1) (liftS (m - 1) rho)+splitS n EmptyS = __IMPOSSIBLE__ -instance Subst a => Subst (Tele a) where- substs us EmptyTel = EmptyTel- substs us (ExtendTel t tel) = uncurry ExtendTel $ substs us (t, tel)- substUnder n u EmptyTel = EmptyTel- substUnder n u (ExtendTel t tel) = uncurry ExtendTel $ substUnder n u (t, tel)+infixr 4 ++# -instance Subst a => Subst (Abs a) where- substs us (Abs x t) = Abs x $ substs (Var 0 [] : raise 1 us) t- substs us (NoAbs x t) = NoAbs x $ substs us t- substUnder n u (Abs x t) = Abs x $ substUnder (n + 1) u t- substUnder n u (NoAbs x t) = NoAbs x $ substUnder n u t+(++#) :: [Term] -> Substitution -> Substitution+us ++# rho = foldr (:#) rho us -instance Subst a => Subst (Arg a) where- substs us = fmap (substs us)- substUnder n u = fmap (substUnder n u)+parallelS :: [Term] -> Substitution+parallelS us = us ++# idS -instance Subst a => Subst (Maybe a) where- substs us = fmap (substs us)- substUnder n u = fmap (substUnder n u)+lookupS :: Substitution -> Nat -> Term+lookupS rho i = case rho of+ IdS -> var i+ Wk n IdS -> let j = i + n in+ if j < 0 then __IMPOSSIBLE__ else var j+ Wk n rho -> applySubst (raiseS n) (lookupS rho i)+ u :# rho | i == 0 -> u+ | i < 0 -> __IMPOSSIBLE__+ | otherwise -> lookupS rho (i - 1)+ Lift n rho | i < n -> var i+ | otherwise -> raise n $ lookupS rho (i - n)+ EmptyS -> __IMPOSSIBLE__ -instance Subst a => Subst [a] where- substs us = map (substs us)- substUnder n u = map (substUnder n u)+-- | Apply a substitution. -instance (Subst a, Subst b) => Subst (a,b) where- substs us (x,y) = (substs us x, substs us y)- substUnder n u (x,y) = (substUnder n u x, substUnder n u y)+-- For terms:+--+-- Γ ⊢ ρ : Δ+-- Δ ⊢ t : σ+-- -----------+-- Γ ⊢ tρ : σρ -instance Subst ClauseBody where- substs us (Body t) = Body $ substs us t- substs us (Bind b) = Bind $ substs us b- substs _ NoBody = NoBody- substUnder n u (Body t) = Body $ substUnder n u t- substUnder n u (Bind b) = Bind $ substUnder n u b- substUnder _ _ NoBody = NoBody+class Subst t where+ applySubst :: Substitution -> t -> t --- | Add @k@ to index of each open variable in @x@.-class Raise t where- raiseFrom :: Nat -> Nat -> t -> t- renameFrom :: Nat -> (Nat -> Nat) -> t -> t+raise :: Subst t => Nat -> t -> t+raise = raiseFrom 0 -instance Raise () where- raiseFrom _ _ _ = ()- renameFrom _ _ _ = ()+raiseFrom :: Subst t => Nat -> Nat -> t -> t+raiseFrom n k = applySubst (liftS n $ raiseS k) -instance Raise Term where- raiseFrom m k v =- case v of- Var i vs- | i < m -> Var i $ rf vs- | otherwise -> Var (i + k) $ rf vs- Lam h m -> Lam h $ rf m- Def c vs -> Def c $ rf vs- Con c vs -> Con c $ rf vs- MetaV x vs -> MetaV x $ rf vs- Level l -> Level $ rf l- Lit l -> Lit l- Pi a b -> uncurry Pi $ rf (a,b)- Sort s -> Sort $ rf s- DontCare mv -> DontCare $ rf mv- where- rf x = raiseFrom m k x+subst :: Subst t => Term -> t -> t+subst u t = substUnder 0 u t - renameFrom m k v =- case v of- Var i vs- | i < m -> Var i $ rf vs- | otherwise -> Var (k (i - m) + m) $ rf vs- Lam h m -> Lam h $ rf m- Def c vs -> Def c $ rf vs- Con c vs -> Con c $ rf vs- MetaV x vs -> MetaV x $ rf vs- Level l -> Level $ rf l- Lit l -> Lit l- Pi a b -> uncurry Pi $ rf (a,b)- Sort s -> Sort $ rf s- DontCare mv -> DontCare $ rf mv- where- rf x = renameFrom m k x+substUnder :: Subst t => Nat -> Term -> t -> t+substUnder n u = applySubst (liftS n (singletonS u)) -instance Raise Type where- raiseFrom m k (El s t) = raiseFrom m k s `El` raiseFrom m k t- renameFrom m k (El s t) = renameFrom m k s `El` renameFrom m k t+instance Subst Substitution where+ applySubst rho sgm = composeS rho sgm -instance Raise Sort where- raiseFrom m k s = case s of- Type n -> Type $ rf n- Prop -> Prop- Inf -> Inf- DLub s1 s2 -> DLub (rf s1) (rf s2)- where rf x = raiseFrom m k x+instance Subst Term where+ applySubst IdS t = t+ applySubst rho t = case t of+ Var i vs -> lookupS rho i `apply` applySubst rho vs+ Lam h m -> Lam h $ applySubst rho m+ Def c vs -> Def c $ applySubst rho vs+ Con c vs -> Con c $ applySubst rho vs+ MetaV x vs -> MetaV x $ applySubst rho vs+ Lit l -> Lit l+ Level l -> levelTm $ applySubst rho l+ Pi a b -> uncurry Pi $ applySubst rho (a,b)+ Sort s -> sortTm $ applySubst rho s+ Shared p -> Shared $ applySubst rho p+ DontCare mv -> DontCare $ applySubst rho mv - renameFrom m k s = case s of- Type n -> Type $ rf n- Prop -> Prop- Inf -> Inf- DLub s1 s2 -> DLub (rf s1) (rf s2)- where rf x = renameFrom m k x+instance Subst a => Subst (Ptr a) where+ applySubst rho = fmap (applySubst rho) -instance Raise Level where- raiseFrom m k (Max as) = Max $ raiseFrom m k as- renameFrom m k (Max as) = Max $ renameFrom m k as+instance Subst Type where+ applySubst rho (El s t) = applySubst rho s `El` applySubst rho t -instance Raise PlusLevel where- raiseFrom m k l@ClosedLevel{} = l- raiseFrom m k (Plus n l) = Plus n $ raiseFrom m k l- renameFrom m k l@ClosedLevel{} = l- renameFrom m k (Plus n l) = Plus n $ renameFrom m k l+instance Subst Sort where+ applySubst rho s = case s of+ Type n -> levelSort $ sub n+ Prop -> Prop+ Inf -> Inf+ DLub s1 s2 -> DLub (sub s1) (sub s2)+ where sub x = applySubst rho x -instance Raise LevelAtom where- raiseFrom m k l = case l of- MetaLevel n vs -> MetaLevel n $ raiseFrom m k vs- NeutralLevel v -> NeutralLevel $ raiseFrom m k v- BlockedLevel n v -> BlockedLevel n $ raiseFrom m k v- UnreducedLevel v -> UnreducedLevel $ raiseFrom m k v- renameFrom m k l = case l of- MetaLevel n vs -> MetaLevel n $ renameFrom m k vs- NeutralLevel v -> NeutralLevel $ renameFrom m k v- BlockedLevel n v -> BlockedLevel n $ renameFrom m k v- UnreducedLevel v -> UnreducedLevel $ renameFrom m k v+instance Subst Level where+ applySubst rho (Max as) = Max $ applySubst rho as -instance Raise Constraint where- raiseFrom m k c = case c of- ValueCmp cmp a u v -> ValueCmp cmp (rf a) (rf u) (rf v)- ElimCmp ps a v e1 e2 -> ElimCmp ps (rf a) (rf v) (rf e1) (rf e2)- TypeCmp cmp a b -> TypeCmp cmp (rf a) (rf b)- TelCmp a b cmp tel1 tel2 -> TelCmp (rf a) (rf b) cmp (rf tel1) (rf tel2)- SortCmp cmp s1 s2 -> SortCmp cmp (rf s1) (rf s2)- LevelCmp cmp l1 l2 -> LevelCmp cmp (rf l1) (rf l2)- Guarded c cs -> Guarded (rf c) cs- IsEmpty a -> IsEmpty (rf a)- FindInScope{} -> c- UnBlock{} -> c- where- rf x = raiseFrom m k x- renameFrom m k c = case c of+instance Subst PlusLevel where+ applySubst rho l@ClosedLevel{} = l+ applySubst rho (Plus n l) = Plus n $ applySubst rho l++instance Subst LevelAtom where+ applySubst rho (MetaLevel m vs) = MetaLevel m $ applySubst rho vs+ applySubst rho (BlockedLevel m v) = BlockedLevel m $ applySubst rho v+ applySubst rho (NeutralLevel v) = UnreducedLevel $ applySubst rho v+ applySubst rho (UnreducedLevel v) = UnreducedLevel $ applySubst rho v++instance Subst Pattern where+ applySubst rho p = case p of+ VarP s -> VarP s+ LitP l -> LitP l+ ConP c mt ps -> ConP c (applySubst rho mt) $ applySubst rho ps+ DotP t -> DotP $ applySubst rho t++instance Subst t => Subst (Blocked t) where+ applySubst rho b = fmap (applySubst rho) b++instance Subst DisplayForm where+ applySubst rho (Display n ps v) =+ Display n (applySubst (liftS 1 rho) ps)+ (applySubst (liftS n rho) v)++instance Subst DisplayTerm where+ applySubst rho (DTerm v) = DTerm $ applySubst rho v+ applySubst rho (DDot v) = DDot $ applySubst rho v+ applySubst rho (DCon c vs) = DCon c $ applySubst rho vs+ applySubst rho (DDef c vs) = DDef c $ applySubst rho vs+ applySubst rho (DWithApp vs ws) = uncurry DWithApp $ applySubst rho (vs, ws)++instance Subst a => Subst (Tele a) where+ applySubst rho EmptyTel = EmptyTel+ applySubst rho (ExtendTel t tel) = uncurry ExtendTel $ applySubst rho (t, tel)++instance Subst Constraint where+ applySubst rho c = case c of ValueCmp cmp a u v -> ValueCmp cmp (rf a) (rf u) (rf v) ElimCmp ps a v e1 e2 -> ElimCmp ps (rf a) (rf v) (rf e1) (rf e2) TypeCmp cmp a b -> TypeCmp cmp (rf a) (rf b)@@ -537,132 +508,76 @@ SortCmp cmp s1 s2 -> SortCmp cmp (rf s1) (rf s2) LevelCmp cmp l1 l2 -> LevelCmp cmp (rf l1) (rf l2) Guarded c cs -> Guarded (rf c) cs- IsEmpty a -> IsEmpty (rf a)- FindInScope{} -> c+ IsEmpty r a -> IsEmpty r (rf a)+ FindInScope m cands -> FindInScope m (rf cands) UnBlock{} -> c where- rf x = renameFrom m k x+ rf x = applySubst rho x -instance Raise Elim where- raiseFrom m k e = case e of- Apply v -> Apply (raiseFrom m k v)- Proj{} -> e- renameFrom m k e = case e of- Apply v -> Apply (renameFrom m k v)+instance Subst Elim where+ applySubst rho e = case e of+ Apply v -> Apply (applySubst rho v) Proj{} -> e -instance Raise ClauseBody where- raiseFrom m k b = case b of- Body v -> Body $ rf v- NoBody -> NoBody- Bind b -> Bind $ rf b- where rf x = raiseFrom m k x- renameFrom m k b = case b of- Body v -> Body $ rf v- NoBody -> NoBody- Bind b -> Bind $ rf b- where rf x = renameFrom m k x---- Andreas, 2010-09-09 raise dot patterns and type info embedded in a pattern-instance Raise Pattern where- raiseFrom m k p = case p of- DotP t -> DotP $ raiseFrom m k t- ConP c mt ps -> ConP c (raiseFrom m k mt) (raiseFrom m k ps)- VarP x -> p- LitP l -> p- renameFrom m k p = case p of- DotP t -> DotP $ renameFrom m k t- ConP c mt ps -> ConP c (renameFrom m k mt) (renameFrom m k ps)- VarP x -> p- LitP l -> p--instance Raise a => Raise (Tele a) where- raiseFrom m k EmptyTel = EmptyTel- raiseFrom m k (ExtendTel a tel) = uncurry ExtendTel $ raiseFrom m k (a, tel)- renameFrom m k EmptyTel = EmptyTel- renameFrom m k (ExtendTel a tel) = uncurry ExtendTel $ renameFrom m k (a, tel)--instance Raise DisplayForm where- raiseFrom m k (Display n ps v) = Display n (raiseFrom (m + 1) k ps)- (raiseFrom (m + n) k v)- renameFrom m k (Display n ps v) = Display n (renameFrom (m + 1) k ps)- (renameFrom (m + n) k v)--instance Raise DisplayTerm where- raiseFrom m k (DWithApp xs ys) = uncurry DWithApp $ raiseFrom m k (xs, ys)- raiseFrom m k (DTerm v) = DTerm $ raiseFrom m k v- raiseFrom m k (DDot v) = DDot $ raiseFrom m k v- raiseFrom m k (DCon c vs) = DCon c $ raiseFrom m k vs- raiseFrom m k (DDef c vs) = DDef c $ raiseFrom m k vs- renameFrom m k (DWithApp xs ys) = uncurry DWithApp $ renameFrom m k (xs, ys)- renameFrom m k (DTerm v) = DTerm $ renameFrom m k v- renameFrom m k (DDot v) = DDot $ renameFrom m k v- renameFrom m k (DCon c vs) = DCon c $ renameFrom m k vs- renameFrom m k (DDef c vs) = DDef c $ renameFrom m k vs--instance Raise t => Raise (Abs t) where- raiseFrom m k (Abs x v) = Abs x $ raiseFrom (m + 1) k v- raiseFrom m k (NoAbs x v) = NoAbs x $ raiseFrom m k v- renameFrom m k (Abs x v) = Abs x $ renameFrom (m + 1) k v- renameFrom m k (NoAbs x v) = NoAbs x $ renameFrom m k v--instance Raise t => Raise (Arg t) where- raiseFrom m k = fmap (raiseFrom m k)- renameFrom m k = fmap (renameFrom m k)+instance Subst a => Subst (Abs a) where+ applySubst rho (Abs x a) = Abs x $ applySubst (liftS 1 rho) a+ applySubst rho (NoAbs x a) = NoAbs x $ applySubst rho a -instance Raise t => Raise (Blocked t) where- raiseFrom m k = fmap (raiseFrom m k)- renameFrom m k = fmap (renameFrom m k)+instance Subst a => Subst (Arg a) where+ applySubst rho = fmap (applySubst rho) -instance Raise t => Raise [t] where- raiseFrom m k = fmap (raiseFrom m k)- renameFrom m k = fmap (renameFrom m k)+instance Subst a => Subst (Dom a) where+ applySubst rho = fmap (applySubst rho) -instance Raise t => Raise (Maybe t) where- raiseFrom m k = fmap (raiseFrom m k)- renameFrom m k = fmap (renameFrom m k)+instance Subst a => Subst (Maybe a) where+ applySubst rho = fmap (applySubst rho) -instance Raise v => Raise (Map k v) where- raiseFrom m k = fmap (raiseFrom m k)- renameFrom m k = fmap (renameFrom m k)+instance Subst a => Subst [a] where+ applySubst rho = map (applySubst rho) -instance (Raise a, Raise b) => Raise (a,b) where- raiseFrom m k (x,y) = (raiseFrom m k x, raiseFrom m k y)- renameFrom m k (x,y) = (renameFrom m k x, renameFrom m k y)+instance Subst () where+ applySubst _ _ = () -raise :: Raise t => Nat -> t -> t-raise = raiseFrom 0+instance (Subst a, Subst b) => Subst (a,b) where+ applySubst rho (x,y) = (applySubst rho x, applySubst rho y) -rename :: Raise t => (Nat -> Nat) -> t -> t-rename = renameFrom 0+instance Subst ClauseBody where+ applySubst rho (Body t) = Body $ applySubst rho t+ applySubst rho (Bind b) = Bind $ applySubst rho b+ applySubst _ NoBody = NoBody -data TelV a = TelV (Tele (Arg a)) a- deriving (Typeable, Data, Show, Eq, Ord, Functor)+data TelV a = TelV (Tele (Dom a)) a+ deriving (Typeable, Show, Eq, Ord, Functor) type TelView = TelV Type--- data TelView = TelV Telescope Type -telFromList :: [Arg (String, Type)] -> Telescope-telFromList = foldr (\(Arg h r (x, a)) -> ExtendTel (Arg h r a) . Abs x) EmptyTel+telFromList :: [Dom (String, Type)] -> Telescope+telFromList = foldr (\(Dom h r (x, a)) -> ExtendTel (Dom h r a) . Abs x) EmptyTel -telToList :: Telescope -> [Arg (String, Type)]+telToList :: Telescope -> [Dom (String, Type)] telToList EmptyTel = [] telToList (ExtendTel arg tel) = fmap ((,) $ absName tel) arg : telToList (absBody tel) telView' :: Type -> TelView-telView' t = case unEl t of+telView' t = case ignoreSharing $ unEl t of Pi a b -> absV a (absName b) $ telView' (absBody b) _ -> TelV EmptyTel t where absV a x (TelV tel t) = TelV (ExtendTel a (Abs x tel)) t +-- | @mkPi dom t = telePi (telFromList [dom]) t@+mkPi :: Dom (String, Type) -> Type -> Type+mkPi (Dom h r (x, a)) b = el $ Pi (Dom h r a) (mkAbs x b)+ where+ el = El $ dLub (getSort a) (Abs x (getSort b)) -- dLub checks x freeIn+ telePi :: Telescope -> Type -> Type telePi EmptyTel t = t telePi (ExtendTel u tel) t = el $ Pi u (reAbs b) where el = El (dLub s1 s2) b = fmap (flip telePi t) tel- s1 = getSort $ unArg u+ s1 = getSort $ unDom u s2 = fmap getSort b -- | Everything will be a pi.@@ -672,12 +587,12 @@ where el = El (dLub s1 s2) b = fmap (flip telePi_ t) tel- s1 = getSort $ unArg u+ s1 = getSort $ unDom u s2 = fmap getSort b teleLam :: Telescope -> Term -> Term teleLam EmptyTel t = t-teleLam (ExtendTel u tel) t = Lam (argHiding u) $ flip teleLam t <$> tel+teleLam (ExtendTel u tel) t = Lam (domHiding u) $ flip teleLam t <$> tel -- | Dependent least upper bound, to assign a level to expressions -- like @forall i -> Set i@.@@ -687,7 +602,9 @@ dLub s1 (NoAbs _ s2) = sLub s1 s2 dLub s1 b@(Abs _ s2) = case occurrence 0 $ freeVars s2 of Flexible -> DLub s1 b+ Irrelevantly -> DLub s1 b NoOccurrence -> sLub s1 (absApp b __IMPOSSIBLE__)+ Free.Unused -> sLub s1 (absApp b __IMPOSSIBLE__) StronglyRigid -> Inf WeaklyRigid -> Inf @@ -699,26 +616,47 @@ absApp (Abs _ v) u = subst u v absApp (NoAbs _ v) _ = v -absBody :: Raise t => Abs t -> t+absBody :: Subst t => Abs t -> t absBody (Abs _ v) = v absBody (NoAbs _ v) = raise 1 v -mkAbs :: (Raise a, Free a) => String -> a -> Abs a+mkAbs :: (Subst a, Free a) => String -> a -> Abs a mkAbs x v | 0 `freeIn` v = Abs x v | otherwise = NoAbs x (raise (-1) v) -reAbs :: (Raise a, Free a) => Abs a -> Abs a+reAbs :: (Subst a, Free a) => Abs a -> Abs a reAbs (NoAbs x v) = NoAbs x v reAbs (Abs x v) = mkAbs x v -deriving instance (Raise a, Eq a) => Eq (Tele a)-deriving instance (Raise a, Ord a) => Ord (Tele a)+-- | @underAbs k a b@ applies @k@ to @a@ and the content of+-- abstraction @b@ and puts the abstraction back.+-- @a@ is raised if abstraction was proper such that+-- at point of application of @k@ and the content of @b@+-- are at the same context.+-- Precondition: @a@ and @b@ are at the same context at call time.+underAbs :: Subst a => (a -> b -> b) -> a -> Abs b -> Abs b+underAbs cont a b = case b of+ Abs x t -> Abs x $ cont (raise 1 a) t+ NoAbs x t -> NoAbs x $ cont a t +-- | @underLambdas n k a b@ drops @n@ initial 'Lam's from @b@,+-- performs operation @k@ on @a@ and the body of @b@,+-- and puts the 'Lam's back. @a@ is raised correctly+-- according to the number of abstractions.+underLambdas :: Subst a => Int -> (a -> Term -> Term) -> a -> Term -> Term+underLambdas n cont a v = loop n a v where+ loop 0 a v = cont a v+ loop n a v = case ignoreSharing v of+ Lam h b -> Lam h $ underAbs (loop $ n-1) a b+ _ -> __IMPOSSIBLE__++deriving instance (Subst a, Eq a) => Eq (Tele a)+deriving instance (Subst a, Ord a) => Ord (Tele a)+ deriving instance Eq Sort deriving instance Ord Sort deriving instance Eq Type deriving instance Ord Type-deriving instance Ord Term deriving instance Eq Level deriving instance Ord Level deriving instance Eq PlusLevel@@ -750,14 +688,50 @@ Level l == Level l' = l == l' MetaV m vs == MetaV m' vs' = m == m' && vs == vs' DontCare _ == DontCare _ = True+ Shared p == Shared q = p == q || derefPtr p == derefPtr q+ Shared p == b = derefPtr p == b+ a == Shared q = a == derefPtr q _ == _ = False -instance (Raise a, Eq a) => Eq (Abs a) where+instance Ord Term where+ Shared a `compare` Shared x | a == x = EQ+ Shared a `compare` x = compare (derefPtr a) x+ a `compare` Shared x = compare a (derefPtr x)+ Var a b `compare` Var x y = compare (a, b) (x, y)+ Var{} `compare` _ = LT+ _ `compare` Var{} = GT+ Def a b `compare` Def x y = compare (a, b) (x, y)+ Def{} `compare` _ = LT+ _ `compare` Def{} = GT+ Con a b `compare` Con x y = compare (a, b) (x, y)+ Con{} `compare` _ = LT+ _ `compare` Con{} = GT+ Lit a `compare` Lit x = compare a x+ Lit{} `compare` _ = LT+ _ `compare` Lit{} = GT+ Lam a b `compare` Lam x y = compare (a, b) (x, y)+ Lam{} `compare` _ = LT+ _ `compare` Lam{} = GT+ Pi a b `compare` Pi x y = compare (a, b) (x, y)+ Pi{} `compare` _ = LT+ _ `compare` Pi{} = GT+ Sort a `compare` Sort x = compare a x+ Sort{} `compare` _ = LT+ _ `compare` Sort{} = GT+ Level a `compare` Level x = compare a x+ Level{} `compare` _ = LT+ _ `compare` Level{} = GT+ MetaV a b `compare` MetaV x y = compare (a, b) (x, y)+ MetaV{} `compare` _ = LT+ _ `compare` MetaV{} = GT+ DontCare{} `compare` DontCare{} = EQ++instance (Subst a, Eq a) => Eq (Abs a) where NoAbs _ a == NoAbs _ b = a == b Abs _ a == Abs _ b = a == b a == b = absBody a == absBody b -instance (Raise a, Ord a) => Ord (Abs a) where+instance (Subst a, Ord a) => Ord (Abs a) where NoAbs _ a `compare` NoAbs _ b = a `compare` b Abs _ a `compare` Abs _ b = a `compare` b a `compare` b = absBody a `compare` absBody b@@ -774,9 +748,10 @@ sLub a (DLub b c) = DLub (sLub a b) c lvlView :: Term -> Level-lvlView (Level l) = l-lvlView (Sort (Type l)) = l-lvlView v = Max [Plus 0 $ UnreducedLevel v]+lvlView v = case ignoreSharing v of+ Level l -> l+ Sort (Type l) -> l+ _ -> Max [Plus 0 $ UnreducedLevel v] levelMax :: [PlusLevel] -> Level levelMax as0 = Max $ ns ++ List.sort bs@@ -784,10 +759,10 @@ as = Prelude.concatMap expand as0 ns = case [ n | ClosedLevel n <- as, n > 0 ] of [] -> []- ns -> [ ClosedLevel n | n <- [Prelude.maximum ns], n > leastB ]+ ns -> [ ClosedLevel n | n <- [Prelude.maximum ns], n > greatestB ] bs = subsume [ b | b@Plus{} <- as ]- leastB | null bs = 0- | otherwise = Prelude.minimum [ n | Plus n _ <- bs ]+ greatestB | null bs = 0+ | otherwise = Prelude.maximum [ n | Plus n _ <- bs ] expand l@ClosedLevel{} = [l] expand (Plus n l) = map (plus n) $ expand0 $ expandAtom l@@ -795,13 +770,16 @@ expand0 [] = [ClosedLevel 0] expand0 as = as - expandAtom (BlockedLevel _ (Level (Max as))) = as- expandAtom (NeutralLevel (Level (Max as))) = as- expandAtom (UnreducedLevel (Level (Max as))) = as- expandAtom (BlockedLevel _ (Sort (Type (Max as)))) = as- expandAtom (NeutralLevel (Sort (Type (Max as)))) = as- expandAtom (UnreducedLevel (Sort (Type (Max as)))) = as- expandAtom l = [Plus 0 l]+ expandAtom l = case l of+ BlockedLevel _ v -> expandTm v+ NeutralLevel v -> expandTm v+ UnreducedLevel v -> expandTm v+ MetaLevel{} -> [Plus 0 l]+ where+ expandTm v = case ignoreSharing v of+ Level (Max as) -> as+ Sort (Type (Max as)) -> as+ _ -> [Plus 0 l] plus n (ClosedLevel m) = ClosedLevel (n + m) plus n (Plus m l) = Plus (n + m) l@@ -829,9 +807,10 @@ infAtom MetaLevel{} = False infAtom BlockedLevel{} = False infTm (Sort Inf) = True+ infTm (Shared p) = infTm $ derefPtr p infTm _ = False levelSort l =- case levelTm l of+ case ignoreSharing $ levelTm l of Sort s -> s _ -> Type l @@ -846,3 +825,18 @@ unLevelAtom (UnreducedLevel v) = v unLevelAtom (BlockedLevel _ v) = v +-- Boring instances ----------------------------------------------------++instance Sized Substitution where+ size IdS = 1+ size EmptyS = 1+ size (Wk _ rho) = 1 + size rho+ size (t :# rho) = 1 + size t + size rho+ size (Lift _ rho) = 1 + size rho++instance KillRange Substitution where+ killRange IdS = IdS+ killRange EmptyS = EmptyS+ killRange (Wk n rho) = killRange1 (Wk n) rho+ killRange (t :# rho) = killRange2 (:#) t rho+ killRange (Lift n rho) = killRange1 (Lift n) rho
src/full/Agda/TypeChecking/Telescope.hs view
@@ -13,6 +13,7 @@ import Agda.TypeChecking.Substitute import Agda.TypeChecking.Free +import Agda.Utils.List import Agda.Utils.Permutation import Agda.Utils.Size import Agda.Utils.Tuple@@ -22,67 +23,62 @@ #include "../undefined.h" import Agda.Utils.Impossible --- TODO: use rename instead of substs -- | The permutation should permute the corresponding telescope. (left-to-right list) renameP :: Subst t => Permutation -> t -> t-renameP p = substs (renaming p)+renameP p = applySubst (renaming p) --- | If @permute π : [a]Γ -> [a]Δ@, then @substs (renaming π) : Term Γ -> Term Δ@-renaming :: Permutation -> [Term]+-- | If @permute π : [a]Γ -> [a]Δ@, then @applySubst (renaming π) : Term Γ -> Term Δ@+renaming :: Permutation -> Substitution renaming p = gamma' where n = size p gamma = permute (reverseP $ invertP $ reverseP p) $ map var [0..]- gamma' = gamma ++ map var [n..]- var i = Var i []+ gamma' = gamma ++# raiseS n -- | If @permute π : [a]Γ -> [a]Δ@, then @substs (renamingR π) : Term Δ -> Term Γ@-renamingR :: Permutation -> [Term]-renamingR p@(Perm n _) = permute (reverseP p) (map var [0..]) ++ map var [n..]- where- var i = Var (fromIntegral i) []+renamingR :: Permutation -> Substitution+renamingR p@(Perm n _) = permute (reverseP p) (map var [0..]) ++# raiseS n -- | Flatten telescope: (Γ : Tel) -> [Type Γ]-flattenTel :: Telescope -> [Arg Type]+flattenTel :: Telescope -> [Dom Type] flattenTel EmptyTel = [] flattenTel (ExtendTel a tel) = raise (size tel + 1) a : flattenTel (absBody tel) -- | Order a flattened telescope in the correct dependeny order: Γ -> -- Permutation (Γ -> Γ~)-reorderTel :: [Arg Type] -> Maybe Permutation+reorderTel :: [Dom Type] -> Maybe Permutation reorderTel tel = topoSort comesBefore tel' where- tel' = reverse $ zip [0..] $ reverse tel- (i, _) `comesBefore` (_, a) = i `freeIn` unEl (unArg a) -- a tiny bit unsafe+ tel' = zip (downFrom $ size tel) tel+ (i, _) `comesBefore` (_, a) = i `freeIn` unEl (unDom a) -- a tiny bit unsafe -reorderTel_ :: [Arg Type] -> Permutation+reorderTel_ :: [Dom Type] -> Permutation reorderTel_ tel = case reorderTel tel of Nothing -> __IMPOSSIBLE__ Just p -> p -- | Unflatten: turns a flattened telescope into a proper telescope. Must be -- properly ordered.-unflattenTel :: [String] -> [Arg Type] -> Telescope+unflattenTel :: [String] -> [Dom Type] -> Telescope unflattenTel [] [] = EmptyTel unflattenTel (x : xs) (a : tel) = ExtendTel a' (Abs x tel') where tel' = unflattenTel xs tel- a' = substs rho a- rho = replicate (size tel + 1) __IMPOSSIBLE_TERM__ ++ map var [0..]- where var i = Var i []+ a' = applySubst rho a+ rho = parallelS (replicate (size tel + 1) __IMPOSSIBLE_TERM__) unflattenTel [] (_ : _) = __IMPOSSIBLE__ unflattenTel (_ : _) [] = __IMPOSSIBLE__ -- | Get the suggested names from a telescope teleNames :: Telescope -> [String]-teleNames = map (fst . unArg) . telToList+teleNames = map (fst . unDom) . telToList teleArgNames :: Telescope -> [Arg String]-teleArgNames = map (fmap fst) . telToList+teleArgNames = map (argFromDom . fmap fst) . telToList teleArgs :: Telescope -> Args-teleArgs tel =- reverse [ Arg h r (Var i []) | (i, Arg h r _) <- zip [0..] $ reverse (telToList tel) ]+teleArgs tel = [ Arg h r (var i) | (i, Dom h r _) <- zip (downFrom $ size l) l ]+ where l = telToList tel -- | A telescope split in two. data SplitTel = SplitTel@@ -127,14 +123,20 @@ telView = telViewUpTo (-1) -- | @telViewUpTo n t@ takes off the first @n@ function types of @t@.--- Takes off all if $n < 0$.+-- Takes off all if @n < 0@. telViewUpTo :: Int -> Type -> TCM TelView-telViewUpTo 0 t = return $ TelV EmptyTel t-telViewUpTo n t = do+telViewUpTo n t = telViewUpTo' n (const True) t++-- | @telViewUpTo' n p t@ takes off $t$+-- the first @n@ (or arbitrary many if @n < 0@) function domains+-- as long as they satify @p@.+telViewUpTo' :: Int -> (Dom Type -> Bool) -> Type -> TCM TelView+telViewUpTo' 0 p t = return $ TelV EmptyTel t+telViewUpTo' n p t = do t <- reduce t- case unEl t of- Pi a b -> absV a (absName b) <$> telViewUpTo (n - 1) (absBody b)- _ -> return $ TelV EmptyTel t+ case ignoreSharing $ unEl t of+ Pi a b | p a -> absV a (absName b) <$> telViewUpTo' (n - 1) p (absBody b)+ _ -> return $ TelV EmptyTel t where absV a x (TelV tel t) = TelV (ExtendTel a (Abs x tel)) t @@ -144,6 +146,6 @@ piApplyM t [] = return t piApplyM t (arg : args) = do t <- reduce t- case (t, arg) of- (El _ (Pi _ b), arg) -> absApp b (unArg arg) `piApplyM` args- _ -> __IMPOSSIBLE__+ case ignoreSharing $ unEl t of+ Pi _ b -> absApp b (unArg arg) `piApplyM` args+ _ -> __IMPOSSIBLE__
src/full/Agda/TypeChecking/Test/Generators.hs view
@@ -193,8 +193,10 @@ instance GenC a => GenC (Arg a) where genC conf = (\ (h, a) -> Arg h Relevant a) <$> genC conf--- genC conf = uncurry Arg <$> genC conf +instance GenC a => GenC (Dom a) where+ genC conf = (\ (h, a) -> Dom h Relevant a) <$> genC conf+ instance GenC a => GenC (Abs a) where genC conf = Abs "x" <$> genC (extendConf conf) @@ -403,9 +405,12 @@ instance ShrinkC a b => ShrinkC (Arg a) (Arg b) where shrinkC conf (Arg h r x) = (\ (h,x) -> Arg h r x) <$> shrinkC conf (h, x)--- shrinkC conf (Arg h x) = uncurry Arg <$> shrinkC conf (h, x) noShrink = fmap noShrink +instance ShrinkC a b => ShrinkC (Dom a) (Dom b) where+ shrinkC conf (Dom h r x) = (\ (h,x) -> Dom h r x) <$> shrinkC conf (h, x)+ noShrink = fmap noShrink+ instance ShrinkC a b => ShrinkC (Blocked a) (Blocked b) where shrinkC conf (Blocked m x) = Blocked m <$> shrinkC conf x shrinkC conf (NotBlocked x) = NotBlocked <$> shrinkC conf x@@ -434,7 +439,7 @@ instance ShrinkC Term Term where shrinkC conf (DontCare _) = [] shrinkC conf (Sort Prop) = []- shrinkC conf t = filter validType $ case t of+ shrinkC conf t = filter validType $ case ignoreSharing t of Var i args -> map unArg args ++ (uncurry Var <$> shrinkC conf (VarName i, NoType args)) Def d args -> map unArg args ++@@ -444,11 +449,12 @@ Lit l -> Lit <$> shrinkC conf l Level l -> [] -- TODO Lam h b -> killAbs b : (uncurry Lam <$> shrinkC conf (h, b))- Pi a b -> unEl (unArg a) : unEl (killAbs b) :+ Pi a b -> unEl (unDom a) : unEl (killAbs b) : (uncurry Pi <$> shrinkC conf (a, b)) Sort s -> Sort <$> shrinkC conf s MetaV m args -> map unArg args ++ (MetaV m <$> shrinkC conf (NoType args)) DontCare _ -> []+ Shared{} -> __IMPOSSIBLE__ where validType t | not (tcIsType conf) = True@@ -467,7 +473,7 @@ killVar :: Nat -> a -> a instance KillVar Term where- killVar i t = case t of+ killVar i t = case ignoreSharing t of Var j args | j == i -> DontCare (Var j []) | j > i -> Var (j - 1) $ killVar i args | otherwise -> Var j $ killVar i args@@ -480,6 +486,7 @@ Pi a b -> uncurry Pi $ killVar i (a, b) MetaV m args -> MetaV m $ killVar i args DontCare mv -> DontCare $ killVar i mv+ Shared{} -> __IMPOSSIBLE__ instance KillVar Type where killVar i (El s t) = El s $ killVar i t@@ -489,6 +496,9 @@ killVar i (ExtendTel a tel) = uncurry ExtendTel $ killVar i (a, tel) instance KillVar a => KillVar (Arg a) where+ killVar i = fmap (killVar i)++instance KillVar a => KillVar (Dom a) where killVar i = fmap (killVar i) instance KillVar a => KillVar (Abs a) where
src/full/Agda/TypeChecking/Tests.hs view
@@ -62,7 +62,7 @@ conf2 = conf1 { tcFreeVariables = map (size tel2 +) (tcFreeVariables conf1) } conf' = conf { tcFreeVariables = map (size tel +) (tcFreeVariables conf) ++ vs } in forAllShrink (genC conf') (shrinkC conf') $ \t ->- isWellScoped conf2 (substs (renamingR $ invertP perm) (t :: Term))+ isWellScoped conf2 (applySubst (renamingR $ invertP perm) (t :: Term)) {- -- | The permutation generated when splitting a telescope correctly translates
src/full/Agda/TypeChecking/UniversePolymorphism.hs view
@@ -26,4 +26,3 @@ isLevelConstraint LevelCmp{} = True isLevelConstraint _ = False-
src/full/Agda/TypeChecking/With.hs view
@@ -24,6 +24,7 @@ import Agda.TypeChecking.EtaContract import Agda.TypeChecking.Telescope +import Agda.Utils.List import Agda.Utils.Permutation import Agda.Utils.Size @@ -58,12 +59,14 @@ Nat -> Nat -> [A.Clause] -> TCM [A.Clause] buildWithFunction aux gamma qs perm n1 n cs = mapM buildWithClause cs where- buildWithClause (A.Clause (LHS i _ ps wps) rhs wh) = do+ buildWithClause (A.Clause (LHS i (A.LHSProj{}) wps) rhs wh) =+ typeError $ NotImplemented "with clauses for definitions by copatterns"+ buildWithClause (A.Clause (LHS i (A.LHSHead _ ps) wps) rhs wh) = do let (wps0, wps1) = genericSplitAt n wps- ps0 = map (defaultArg . unnamed) wps0+ ps0 = map defaultNamedArg wps0 rhs <- buildRHS rhs (ps1, ps2) <- genericSplitAt n1 <$> stripWithClausePatterns gamma qs perm ps- let result = A.Clause (LHS i aux (ps1 ++ ps0 ++ ps2) wps1) rhs wh+ let result = A.Clause (LHS i (A.LHSHead aux (ps1 ++ ps0 ++ ps2)) wps1) rhs wh reportSDoc "tc.with" 20 $ vcat [ text "buildWithClause returns" <+> prettyA result ]@@ -90,7 +93,7 @@ -} stripWithClausePatterns :: Telescope -> [Arg Pattern] -> Permutation -> [NamedArg A.Pattern] -> TCM [NamedArg A.Pattern] stripWithClausePatterns gamma qs perm ps = do- psi <- insertImplicitPatterns ps gamma+ psi <- insertImplicitPatterns ExpandLast ps gamma unless (size psi == size gamma) $ fail $ "wrong number of arguments in with clause: given " ++ show (size psi) ++ ", expected " ++ show (size gamma) reportSDoc "tc.with.strip" 10 $ vcat [ text "stripping patterns"@@ -128,36 +131,37 @@ ps <- underAbstraction a tel $ \tel -> strip tel ps qs return $ p : ps - DotP v -> case namedThing $ unArg p of+ DotP v -> case namedArg p of A.DotP _ _ -> ok A.ImplicitP _ -> ok _ -> do d <- prettyA p typeError $ GenericError $ "Inaccessible (dotted) patterns from the parent clause must " ++- "also be inaccesible in the with clause, when checking the " +++ "also be inaccessible in the with clause, when checking the " ++ "pattern " ++ show d ++ "," where ok = do ps <- strip (tel `absApp` v) ps qs return $ p : ps - ConP c _ qs' -> case namedThing $ unArg p of+ ConP c _ qs' -> case namedArg p of A.ConP _ (A.AmbQ cs') ps' -> do - Con c' [] <- constructorForm =<< reduce (Con c [])+ Con c' [] <- ignoreSharing <$> (constructorForm =<< reduce (Con c [])) c <- return $ c' `withRangeOf` c let getCon (Con c []) = c+ getCon (Shared p) = getCon (derefPtr p) getCon _ = __IMPOSSIBLE__ cs' <- map getCon <$> (mapM constructorForm =<< mapM (\c' -> reduce $ Con c' []) cs') unless (elem c cs') mismatch -- The type is a datatype- Def d us <- normalise $ unEl (unArg a)+ Def d us <- ignoreSharing <$> normalise (unEl $ unDom a) -- Compute the argument telescope for the constructor- Con c [] <- constructorForm =<< normalise (Con c [])+ Con c [] <- ignoreSharing <$> (constructorForm =<< normalise (Con c [])) Defn {defType = ct, theDef = Constructor{conPars = np}} <- getConstInfo c let ct' = ct `apply` genericTake np us TelV tel' _ <- telView ct'@@ -171,7 +175,8 @@ ] -- Compute the new telescope- let v = Con c $ reverse [ Arg h r (Var i []) | (i, Arg h r _) <- zip [0..] $ reverse qs' ]+ let v = Con c [ Arg h r (var i) | (i, Arg h r _) <- zip (downFrom $ size qs') qs' ]+-- let v = Con c $ reverse [ Arg h r (var i) | (i, Arg h r _) <- zip [0..] $ reverse qs' ] tel'' = tel' `abstract` absApp (raise (size tel') tel) v reportSDoc "tc.with.strip" 15 $ sep@@ -181,26 +186,28 @@ ] -- Insert implicit patterns (just for the constructor arguments)- psi' <- insertImplicitPatterns ps' tel'+ psi' <- insertImplicitPatterns ExpandLast ps' tel' unless (size psi' == size tel') $ typeError $ WrongNumberOfConstructorArguments c (size tel') (size psi') -- Do it again for everything (is this necessary?)- psi' <- insertImplicitPatterns (psi' ++ ps) tel''+ psi' <- insertImplicitPatterns ExpandLast (psi' ++ ps) tel'' -- Keep going strip tel'' psi' (qs' ++ qs) _ -> mismatch - LitP lit -> case namedThing $ unArg p of+ LitP lit -> case namedArg p of A.LitP lit' | lit == lit' -> strip (tel `absApp` Lit lit) ps qs _ -> mismatch where- mismatch = typeError $ WithClausePatternMismatch (namedThing $ unArg p0) (unArg q)+ mismatch = typeError $ WithClausePatternMismatch (namedArg p0) (unArg q) strip tel ps qs = error $ "huh? " ++ show (size tel) ++ " " ++ show (size ps) ++ " " ++ show (size qs) -- | Construct the display form for a with function. It will display -- applications of the with function as applications to the original function. -- For instance, @aux a b c@ as @f (suc a) (suc b) | c@+--+-- @n@ is the number of with arguments. withDisplayForm :: QName -> QName -> Telescope -> Telescope -> Nat -> [Arg Pattern] -> Permutation -> TCM DisplayForm withDisplayForm f aux delta1 delta2 n qs perm@(Perm m _) = do topArgs <- raise (n + size delta1 + size delta2) <$> getContextArgs@@ -208,15 +215,20 @@ let wild = Def (qualify (mnameFromList []) x) [] let top = genericLength topArgs- vs = map (fmap DTerm) topArgs ++ (substs (sub ys wild) $ patsToTerms qs)+ vs = map (fmap DTerm) topArgs ++ (applySubst (sub ys wild) $ patsToTerms qs) dt = DWithApp (DDef f vs : map DTerm withArgs) []- withArgs = reverse $ map var [size delta2..size delta2 + n - 1]- pats = genericReplicate (n + size delta1 + size delta2 + top) (Var 0 [])+ withArgs = map var $ genericTake n $ downFrom $ size delta2 + n+-- withArgs = reverse $ map var [size delta2..size delta2 + n - 1]+ pats = genericReplicate (n + size delta1 + size delta2 + top) (var 0) -- Building the arguments to the with function (ys0, ys1) = splitAt (size delta1) (permute perm $ map Just [m - 1, m - 2..0]) ys = reverse $ ys0 ++ genericReplicate n Nothing ++ ys1 let display = Display (n + size delta1 + size delta2 + top) pats dt+ addFullCtx = addCtxTel delta1+ . flip (foldr addCtxString_) (map ("w" ++) $ map show [1..n])+ . addCtxTel delta2+ -- Andreas 2012-09-17: this seems to be the right order of contexts reportSDoc "tc.with.display" 20 $ vcat [ text "withDisplayForm"@@ -224,40 +236,39 @@ [ text "f =" <+> text (show f) , text "aux =" <+> text (show aux) , text "delta1 =" <+> prettyTCM delta1- , text "delta2 =" <+> prettyTCM delta2+ , text "delta2 =" <+> do addCtxTel delta1 $ prettyTCM delta2 , text "n =" <+> text (show n) , text "perm =" <+> text (show perm)- , text "top =" <+> prettyTCM topArgs+ , text "top =" <+> do addFullCtx $ prettyTCM topArgs , text "qs =" <+> text (show qs)- , text "dt =" <+> prettyTCM dt+ , text "dt =" <+> do addFullCtx $ prettyTCM dt , text "ys =" <+> text (show ys) , text "raw =" <+> text (show display)- , text "qsToTm =" <+> prettyTCM (patsToTerms qs)- , text "sub qs =" <+> prettyTCM (substs (sub ys wild) $ patsToTerms qs)+ , text "qsToTm =" <+> prettyTCM (patsToTerms qs) -- ctx would be permuted form of delta1 ++ delta2+ , text "sub qs =" <+> prettyTCM (applySubst (sub ys wild) $ patsToTerms qs) ] ] return display where- var i = Var i []- sub rho wild = map term [0..] -- m - 1]+ -- Note: The upper bound (m - 1) was previously commented out. I+ -- restored it in order to make the substitution finite.+ sub rho wild = parallelS $ map term [0 .. m - 1] where -- thinking required.. but ignored -- dropping the reverse seems to work better -- Andreas, 2010-09-09: I DISAGREE. -- Ulf, 2011-09-02: Thinking done. Neither was correct. -- We had the wrong permutation and we used it incorrectly. Should work now.- term i = case findIndex (Just i ==) rho of- Nothing -> wild- Just j -> Var (fromIntegral j) []+ term i = maybe wild var $ findIndex (Just i ==) rho patsToTerms :: [Arg Pattern] -> [Arg DisplayTerm] patsToTerms ps = evalState (toTerms ps) 0 where mapMr f xs = reverse <$> mapM f (reverse xs) - var :: State Nat Nat- var = do+ nextVar :: State Nat Nat+ nextVar = do i <- get put (i + 1) return i@@ -270,7 +281,7 @@ toTerm :: Pattern -> State Nat DisplayTerm toTerm p = case p of- VarP _ -> var >>= \i -> return $ DTerm (Var i [])+ VarP _ -> nextVar >>= \i -> return $ DTerm (var i) DotP t -> return $ DDot t ConP c _ ps -> DCon c <$> toTerms ps LitP l -> return $ DTerm (Lit l)
src/full/Agda/Utils/Either.hs view
@@ -5,7 +5,8 @@ ------------------------------------------------------------------------ module Agda.Utils.Either- ( isLeft, isRight+ ( mapEither, mapLeft, mapRight+ , isLeft, isRight , allRight , tests ) where@@ -16,6 +17,21 @@ #include "../undefined.h" import Agda.Utils.Impossible++-- | 'Either' is a bifunctor.++mapEither :: (a -> c) -> (b -> d) -> Either a b -> Either c d+mapEither f g = either (Left . f) (Right . g)++-- | 'Either _ b' is a functor.++mapLeft :: (a -> c) -> Either a b -> Either c b+mapLeft f = mapEither f id++-- | 'Either a' is a functor.++mapRight :: (b -> d) -> Either a b -> Either a d+mapRight = mapEither id -- | Returns 'True' iff the argument is @'Right' x@ for some @x@.
src/full/Agda/Utils/FileName.hs view
@@ -7,13 +7,14 @@ , mkAbsolute , absolute , (===)+ , doesFileExistCaseSensitive , tests ) where import Agda.Utils.TestHelpers import Agda.Utils.QuickCheck import Data.Function-import Data.Generics (Typeable, Data)+import Data.Typeable (Typeable) import Data.List import Data.Maybe import Control.Applicative@@ -21,6 +22,11 @@ import System.Directory import System.FilePath +#if mingw32_HOST_OS+import Control.Exception (bracket)+import System.Win32 (findFirstFile, findClose, getFindDataFileName)+#endif+ #include "../undefined.h" import Agda.Utils.Impossible @@ -30,8 +36,11 @@ -- paths point to the same files or directories. newtype AbsolutePath = AbsolutePath { filePath :: FilePath }- deriving (Show, Eq, Ord, Typeable, Data)+ deriving (Eq, Ord, Typeable) +instance Show AbsolutePath where+ show = filePath+ -- | The paths have to be absolute, valid and normalised, without -- trailing path separators. @@ -93,6 +102,22 @@ (===) :: AbsolutePath -> AbsolutePath -> Bool (===) = equalFilePath `on` filePath++-- | Case-sensitive doesFileExist for Windows.+-- This is case-sensitive only on the file name part, not on the directory part.+-- (Ideally, path components coming from module name components should be+-- checked case-sensitively and the other path components should be checked+-- case insenstively.)+doesFileExistCaseSensitive :: FilePath -> IO Bool+#if mingw32_HOST_OS+doesFileExistCaseSensitive f = do+ ex <- doesFileExist f+ if ex then bracket (findFirstFile f) (findClose . fst) $+ fmap (takeFileName f ==) . getFindDataFileName . snd+ else return False+#else+doesFileExistCaseSensitive f = doesFileExist f+#endif ------------------------------------------------------------------------ -- Generators
− src/full/Agda/Utils/Generics.hs
@@ -1,39 +0,0 @@-{-# LANGUAGE Rank2Types #-}-{-| Contains some generic utility functions and reexports certain- definitions from "Data.Generics".--}-module Agda.Utils.Generics- ( module Data.Generics- , isString- , everythingBut- , everywhereBut'- , everywhereButM'- ) where---- The explicit import list is included in order to support several--- versions of syb; one version of syb contains a definition named--- everythingBut.-import Data.Generics- (GenericQ, mkQ, extQ, gmapQ, GenericT, gmapT, GenericM, gmapM)--isString :: GenericQ Bool-isString = mkQ False (const True :: String -> Bool)--everythingBut :: (r -> r -> r) -> GenericQ Bool -> GenericQ r -> GenericQ r-everythingBut (+) stop collect x- | stop x = collect x- | otherwise = foldr1 (+) $- collect x : gmapQ (everythingBut (+) stop collect) x---- | Same as everywhereBut except that when the stop condition becomes--- true, the function is called on the top level term (but not on the--- children).-everywhereBut' :: GenericQ Bool -> GenericT -> GenericT-everywhereBut' q f x- | q x = f x- | otherwise = f (gmapT (everywhereBut' q f) x)--everywhereButM' :: Monad m => GenericQ Bool -> GenericM m -> GenericM m-everywhereButM' q f x- | q x = f x- | otherwise = f =<< gmapM (everywhereButM' q f) x
+ src/full/Agda/Utils/Geniplate.hs view
@@ -0,0 +1,43 @@+{-# LANGUAGE TemplateHaskell #-}++-- | Utilities related to Geniplate.++module Agda.Utils.Geniplate+ ( instanceUniverseBiT'+ , instanceTransformBiMT'+ , dontDescendInto+ ) where++import Data.Generics.Geniplate+import Data.Map (Map)++import qualified Agda.Syntax.Abstract.Name as A+import qualified Agda.Syntax.Concrete.Name as C+import qualified Agda.Syntax.Scope.Base as S++-- | Types which Geniplate should not descend into.++dontDescendInto =+ [ [t| String |]+ , [t| A.QName |]+ , [t| A.Name |]+ , [t| C.Name |]+ , [t| S.ScopeInfo |]+ , [t| Map A.QName A.QName |]+ , [t| Map A.ModuleName A.ModuleName |]+ , [t| A.AmbiguousQName |]+ ]++-- | A localised instance of 'instanceUniverseBiT'. The generated+-- 'universeBi' functions neither descend into the types in+-- 'dontDescendInto', nor into the types in the list argument.++instanceUniverseBiT' ts p =+ instanceUniverseBiT (ts ++ dontDescendInto) p++-- | A localised instance of 'instanceTransformBiMT'. The generated+-- 'transformBiM' functions neither descend into the types in+-- 'dontDescendInto', nor into the types in the list argument.++instanceTransformBiMT' ts p =+ instanceTransformBiMT (ts ++ dontDescendInto) p
src/full/Agda/Utils/Graph.hs view
@@ -1,45 +1,132 @@-{-# LANGUAGE DeriveFunctor #-}-module Agda.Utils.Graph where+{-# LANGUAGE DeriveFunctor, GeneralizedNewtypeDeriving #-} +module Agda.Utils.Graph+ ( Graph(..)+ , invariant+ , edges+ , edgesFrom+ , nodes+ , filterEdges+ , fromNodes+ , fromList+ , empty+ , singleton+ , insert+ , removeNode+ , removeEdge+ , union+ , unions+ , Agda.Utils.Graph.lookup+ , neighbours+ , sccs'+ , sccs+ , acyclic+ , transitiveClosure1+ , transitiveClosure+ , findPath+ , allPaths+ , nodeIn+ , edgeIn+ , tests+ )+ where++import Control.Applicative ((<$>), (<*>))++import Data.Function+import qualified Data.Graph as Graph+import qualified Data.List as List import qualified Data.Map as Map-import qualified Data.Set as Set import Data.Map (Map)+import qualified Data.Maybe as Maybe+import qualified Data.Set as Set import Data.Set (Set) +import qualified Agda.Utils.Map as Map+import Agda.Utils.QuickCheck import Agda.Utils.SemiRing+import Agda.Utils.TestHelpers -- Only one edge between any two nodes. newtype Graph n e = Graph { unGraph :: Map n (Map n e) }- deriving (Eq, Functor)+ deriving (Eq, Functor, Show) +-- | A structural invariant for the graphs.++invariant :: Ord n => Graph n e -> Bool+invariant g = connectedNodes `Set.isSubsetOf` nodes g+ where+ connectedNodes =+ Set.fromList $ concatMap (\(a, b, _) -> [a, b]) $ edges g+ edges :: Ord n => Graph n e -> [(n, n, e)] edges g = concatMap onNode $ Map.assocs $ unGraph g where onNode (from, es) = map (onNeighbour from) $ Map.assocs es onNeighbour from (to, w) = (from, to, w) +-- | All edges originating in the given nodes.++edgesFrom :: Ord n => Graph n e -> [n] -> [(n, n, e)]+edgesFrom (Graph g) ns =+ concat $+ Maybe.catMaybes $+ map (\n1 -> fmap (\m -> map (\(n2, w) -> (n1, n2, w)) (Map.assocs m))+ (Map.lookup n1 g))+ ns++-- | Returns all the nodes in the graph.+ nodes :: Ord n => Graph n e -> Set n-nodes = Set.fromList . concatMap f . edges- where f (a, b, _) = [a, b]+nodes g = Map.keysSet (unGraph g) +-- | Constructs a completely disconnected graph containing the given+-- nodes.++fromNodes :: Ord n => [n] -> Graph n e+fromNodes = Graph . Map.fromList . map (\n -> (n, Map.empty))++prop_nodes_fromNodes ns = nodes (fromNodes ns) == Set.fromList ns+ fromList :: (SemiRing e, Ord n) => [(n, n, e)] -> Graph n e fromList es = unions [ singleton a b w | (a, b, w) <- es ] empty :: Graph n e empty = Graph Map.empty -singleton :: n -> n -> e -> Graph n e-singleton a b w = Graph $ Map.singleton a (Map.singleton b w)+singleton :: Ord n => n -> n -> e -> Graph n e+singleton a b w =+ Graph $ Map.insert a (Map.singleton b w) $ Map.singleton b Map.empty insert :: (SemiRing e, Ord n) => n -> n -> e -> Graph n e -> Graph n e-insert from to w g = union (singleton from to w) g+insert from to w g = union g (singleton from to w) +-- | Removes the given node, and all corresponding edges, from the+-- graph.++removeNode :: Ord n => n -> Graph n e -> Graph n e+removeNode n (Graph g) =+ Graph $ Map.delete n $ Map.map (Map.delete n) g++-- | @removeEdge n1 n2 g@ removes the edge going from @n1@ to @n2@, if+-- any.++removeEdge :: Ord n => n -> n -> Graph n e -> Graph n e+removeEdge n1 n2 (Graph g) =+ Graph $ Map.adjust (Map.delete n2) n1 g++filterEdges :: Ord n => (e -> Bool) -> Graph n e -> Graph n e+filterEdges f (Graph g) = Graph $ Map.mapMaybe filt g+ where filt m =+ let m' = Map.filter f m+ in if Map.null m' then Nothing else Just m'+ union :: (SemiRing e, Ord n) => Graph n e -> Graph n e -> Graph n e union (Graph g1) (Graph g2) = Graph $ Map.unionWith (Map.unionWith oplus) g1 g2 unions :: (SemiRing e, Ord n) => [Graph n e] -> Graph n e-unions = foldr union empty+unions = List.foldl' union empty lookup :: Ord n => n -> n -> Graph n e -> Maybe e lookup a b g = Map.lookup b =<< Map.lookup a (unGraph g)@@ -47,27 +134,99 @@ neighbours :: Ord n => n -> Graph n e -> [(n, e)] neighbours a g = maybe [] Map.assocs $ Map.lookup a $ unGraph g -growGraph :: (SemiRing e, Ord n) => Graph n e -> Graph n e-growGraph g = foldr union g $ map newEdges $ edges g+-- | The graph's strongly connected components, in reverse topological+-- order.++sccs' :: Ord n => Graph n e -> [Graph.SCC n]+sccs' g =+ Graph.stronglyConnComp .+ map (\n -> (n, n, map fst $ neighbours n g)) .+ Set.toList .+ nodes $+ g++-- | The graph's strongly connected components, in reverse topological+-- order.++sccs :: Ord n => Graph n e -> [[n]]+sccs = map Graph.flattenSCC . sccs'++-- | Returns @True@ iff the graph is acyclic.++acyclic :: Ord n => Graph n e -> Bool+acyclic = all isAcyclic . sccs' where+ isAcyclic Graph.AcyclicSCC{} = True+ isAcyclic Graph.CyclicSCC{} = False++-- | Computes the transitive closure of the graph.+--+-- Note that this algorithm is not guaranteed to be correct (or+-- terminate) for arbitrary semirings.+--+-- This function operates on the entire graph at once.++transitiveClosure1 :: (Eq e, SemiRing e, Ord n) =>+ Graph n e -> Graph n e+transitiveClosure1 = loop+ where+ loop g | g == g' = g+ | otherwise = loop g'+ where g' = growGraph g++ growGraph g = List.foldl' union g $ map newEdges $ edges g+ where newEdges (a, b, w) = case Map.lookup b (unGraph g) of- Just es -> Graph $ Map.singleton a $ Map.map (otimes w) es- Nothing -> empty+ Just es -> Graph $ Map.singleton a $ Map.map (otimes w) es+ Nothing -> empty +-- | Computes the transitive closure of the graph.+--+-- Note that this algorithm is not guaranteed to be correct (or+-- terminate) for arbitrary semirings.+--+-- This function operates on one strongly connected component at a+-- time.+ transitiveClosure :: (Eq e, SemiRing e, Ord n) => Graph n e -> Graph n e-transitiveClosure g = loop g- where -- n = Set.size $ nodes g- loop g | g == g' = g- | otherwise = loop g'- where- g' = growGraph g+transitiveClosure g = List.foldl' extend g $ sccs' g+ where+ edgesFrom' g ns = (g, edgesFrom g ns) + extend g (Graph.AcyclicSCC scc) = fst $ growGraph [scc] (edgesFrom' g [scc])+ extend g (Graph.CyclicSCC scc) = loop (edgesFrom' g scc)+ where+ loop g | equal g g' = fst g+ | otherwise = loop g'+ where g' = growGraph scc g + equal = (==) `on` snd++ growGraph scc (g, es) =+ edgesFrom' (List.foldl' union g $ map newEdges es) scc+ where+ newEdges (a, b, w) = case Map.lookup b (unGraph g) of+ Just es -> Graph $ Map.singleton a $ Map.map (otimes w) es+ Nothing -> empty++prop_transitiveClosure g = label sccInfo $+ transitiveClosure g == transitiveClosure1 g+ where+ sccInfo =+ (if noSCCs <= 3 then " " ++ show noSCCs+ else ">= 4") +++ " strongly connected component(s)"+ where noSCCs = length (sccs g)+ findPath :: (SemiRing e, Ord n) => (e -> Bool) -> n -> n -> Graph n e -> Maybe e findPath good a b g = case filter good $ allPaths good a b g of [] -> Nothing w : _ -> Just w +-- | @allPaths classify a b g@ returns a list of pathes (accumulated edge weights)+-- from node @a@ to node @b@ in @g@.+-- Alternative intermediate pathes are only considered if they+-- are distinguished by the @classify@ function. allPaths :: (SemiRing e, Ord n, Ord c) => (e -> c) -> n -> n -> Graph n e -> [e] allPaths classify a b g = paths Set.empty a where@@ -81,3 +240,78 @@ where tag = (c, classify w) found | b == c = [w] | otherwise = []++------------------------------------------------------------------------+-- Utilities used to test the code above++instance (Ord n, SemiRing e, Arbitrary n, Arbitrary e) =>+ Arbitrary (Graph n e) where+ arbitrary = do+ nodes <- sized $ \n -> resize (isqrt n) arbitrary+ edges <- mapM (\(n1, n2) -> (\w -> (n1, n2, w)) <$> arbitrary) =<<+ listOfElements ((,) <$> nodes <*> nodes)+ return (fromList edges `union` fromNodes nodes)+ where+ isqrt :: Int -> Int+ isqrt = round . sqrt . fromIntegral++ shrink g =+ [ removeNode n g | n <- Set.toList $ nodes g ] +++ [ removeEdge n1 n2 g | (n1, n2, _) <- edges g ]++-- | Generates a node from the graph. (Unless the graph is empty.)++nodeIn :: (Ord n, Arbitrary n) => Graph n e -> Gen n+nodeIn g = elementsUnlessEmpty (Set.toList $ nodes g)++-- | Generates an edge from the graph. (Unless the graph contains no+-- edges.)++edgeIn :: (Ord n, Arbitrary n, Arbitrary e) =>+ Graph n e -> Gen (n, n, e)+edgeIn g = elementsUnlessEmpty (edges g)++-- | Used to test 'transitiveClosure' and 'transitiveClosure1'.++type G = Graph Int E++-- | Used to test 'transitiveClosure' and 'transitiveClosure1'.++newtype E = E { unE :: Bool }+ deriving (Arbitrary, Eq, Show)++instance SemiRing E where+ oplus (E x) (E y) = E (x || y)+ otimes (E x) (E y) = E (x && y)++-- | All tests.++tests :: IO Bool+tests = runTests "Agda.Utils.Graph"++ -- Make sure that the invariant is established/preserved.+ [ quickCheck' invariant'+ , quickCheck' (all invariant' . shrink)+ , quickCheck' (invariant' . fromNodes)+ , quickCheck' (invariant' . fromList)+ , quickCheck' (invariant' empty)+ , quickCheck' (\n1 n2 w -> invariant' (singleton n1 n2 w))+ , quickCheck' (\n1 n2 w g -> invariant' (insert n1 n2 w g))+ , quickCheck' (\g n -> invariant' (removeNode n g))+ , quickCheck' (\g -> forAll (nodeIn g) $ \n ->+ invariant' (removeNode n g))+ , quickCheck' (\g n1 n2 -> invariant' (removeEdge n1 n2 g))+ , quickCheck' (\g -> forAll (edgeIn g) $ \(n1, n2, _) ->+ invariant' (removeEdge n1 n2 g))+ , quickCheck' (\g1 g2 -> invariant' (union g1 g2))+ , quickCheck' (invariant' . unions)+ , quickCheck' (invariant' . transitiveClosure1)+ , quickCheck' (invariant' . transitiveClosure)++ -- Other properties.+ , quickCheck' (prop_nodes_fromNodes :: [Int] -> Bool)+ , quickCheck' (prop_transitiveClosure :: G -> Property)+ ]+ where+ invariant' :: G -> Bool+ invariant' = invariant
+ src/full/Agda/Utils/HashMap.hs view
@@ -0,0 +1,6 @@++module Agda.Utils.HashMap+ ( module HashMap ) where++import Data.HashMap.Strict as HashMap+
− src/full/Agda/Utils/IO/Locale.hs
@@ -1,66 +0,0 @@-{-# LANGUAGE CPP #-}---- | IO functions which are used when reading from standard input and--- writing to standard output. Uses the UTF-8 character encoding under--- versions of the base library up to 4.1, and whatever the locale--- specifies under base 4.2 (and later?; only if the locale is--- supported, see "System.IO").------ Note that 'hSetEncoding' can be used to change the behaviour of the--- functions below if base 4.2 (or later?) is used.--module Agda.Utils.IO.Locale- ( print- , putStr- , putStrLn- , stdoutFlush- , hGetContents- ) where--import Prelude (Show, IO, String)-import System.IO (Handle, hFlush, stdout)-#if MIN_VERSION_base(4,2,0)-import qualified Prelude-import qualified System.IO as IO-#else-import qualified System.IO.UTF8 as UTF8-#endif--stdoutFlush :: IO ()-stdoutFlush = hFlush stdout---- | Prints the value.--print :: Show a => a -> IO ()-#if MIN_VERSION_base(4,2,0)-print = Prelude.print-#else-print = UTF8.print-#endif---- | Prints the string.--putStr :: String -> IO ()-#if MIN_VERSION_base(4,2,0)-putStr = Prelude.putStr-#else-putStr = UTF8.putStr-#endif---- | Prints the string with an appended newline.--putStrLn :: String -> IO ()-#if MIN_VERSION_base(4,2,0)-putStrLn = Prelude.putStrLn-#else-putStrLn = UTF8.putStrLn-#endif---- | Returns the stream represented by the handle lazily.--hGetContents :: Handle -> IO String-#if MIN_VERSION_base(4,2,0)-hGetContents = IO.hGetContents-#else-hGetContents = UTF8.hGetContents-#endif
src/full/Agda/Utils/IO/UTF8.hs view
@@ -1,5 +1,3 @@-{-# LANGUAGE CPP #-}- -- | Text IO using the UTF8 character encoding. module Agda.Utils.IO.UTF8@@ -8,11 +6,7 @@ , Agda.Utils.IO.UTF8.writeFile ) where -#if MIN_VERSION_base(4,2,0) import qualified System.IO as IO-#else-import qualified System.IO.UTF8 as UTF8-#endif import Control.Applicative import Agda.Utils.Unicode@@ -22,35 +16,26 @@ readTextFile :: FilePath -> IO String readTextFile file = convertLineEndings <$> do-#if MIN_VERSION_base(4,2,0) h <- IO.openFile file IO.ReadMode IO.hSetNewlineMode h IO.noNewlineTranslation IO.hSetEncoding h IO.utf8 IO.hGetContents h-#else- UTF8.readFile file-#endif -- | Writes UTF8-encoded text to the handle, which should be opened -- for writing and in text mode. The native convention for line -- endings is used.+--+-- The handle's text encoding is not necessarily preserved, it is+-- changed to UTF8. hPutStr :: IO.Handle -> String -> IO ()-#if MIN_VERSION_base(4,2,0) hPutStr h s = do IO.hSetEncoding h IO.utf8 IO.hPutStr h s-#else-hPutStr = UTF8.hPutStr-#endif -- | Writes a UTF8-encoded text file. The native convention for line -- endings is used. writeFile :: FilePath -> String -> IO ()-#if MIN_VERSION_base(4,2,0) writeFile file s = IO.withFile file IO.WriteMode $ \h -> do hPutStr h s-#else-writeFile = UTF8.writeFile-#endif
src/full/Agda/Utils/List.hs view
@@ -22,6 +22,33 @@ mhead [] = Nothing mhead (x:_) = Just x +-- | Opposite of cons @(:)@, safe.+uncons :: [a] -> Maybe (a, [a])+uncons [] = Nothing+uncons (x:xs) = Just (x,xs)++-- | downFrom n = [n-1,..1,0]+downFrom :: Integral a => a -> [a]+downFrom n | n <= 0 = []+ | otherwise = let n' = n-1 in n' : downFrom n'++-- | Update the last element of a list, if it exists+updateLast :: (a -> a) -> [a] -> [a]+updateLast f [] = []+updateLast f [a] = [f a]+updateLast f (a : as@(_ : _)) = a : updateLast f as++-- | A generalized version of @partition@.+-- (Cf. @mapMaybe@ vs. @filter@).+mapEither :: (a -> Either b c) -> [a] -> ([b],[c])+{-# INLINE mapEither #-}+mapEither f xs = foldr (deal f) ([],[]) xs++deal :: (a -> Either b c) -> a -> ([b],[c]) -> ([b],[c])+deal f a ~(bs,cs) = case f a of+ Left b -> (b:bs, cs)+ Right c -> (bs, c:cs)+ -- | Sublist relation. isSublistOf :: Eq a => [a] -> [a] -> Bool isSublistOf [] ys = True@@ -67,6 +94,14 @@ holes [] = [] holes (x:xs) = (x, xs) : map (id -*- (x:)) (holes xs) +-- | Check whether a list is sorted.+--+-- Assumes that the 'Ord' instance implements a partial order.++sorted :: Ord a => [a] -> Bool+sorted [] = True+sorted xs = and $ zipWith (<=) (init xs) (tail xs)+ -- | Check whether all elements in a list are distinct from each -- other. Assumes that the 'Eq' instance stands for an equivalence -- relation.@@ -168,6 +203,13 @@ forAll natural $ \n -> forAll (two $ vector n) $ \(xs, ys) -> zipWith' f xs ys == zipWith f xs ys++-- | Like zipWith, but returns the leftover elements of the input lists.+zipWithTails :: (a -> b -> c) -> [a] -> [b] -> ([c], [a] , [b])+zipWithTails f xs [] = ([], xs, [])+zipWithTails f [] ys = ([], [] , ys)+zipWithTails f (x : xs) (y : ys) = (f x y : zs , as , bs)+ where (zs , as , bs) = zipWithTails f xs ys -- | Efficient version of nub that sorts the list first. The tag function is -- assumed to be cheap. If it isn't pair up the elements with their tags and
src/full/Agda/Utils/Map.hs view
@@ -4,9 +4,11 @@ import Prelude hiding (map, lookup, mapM) import Control.Applicative-import Data.Map+import Data.Map as Map import Data.Traversable+ import Agda.Utils.Monad+import Agda.Utils.Tuple #include "../undefined.h" import Agda.Utils.Impossible@@ -37,3 +39,10 @@ -- | Filter a map based on the keys. filterKeys :: Ord k => (k -> Bool) -> Map k a -> Map k a filterKeys p = filterWithKey (const . p)++-- | Unzip a map.+unzip :: Map k (a, b) -> (Map k a, Map k b)+unzip m = (Map.map fst m, Map.map snd m)++unzip3 :: Map k (a, b, c) -> (Map k a, Map k b, Map k c)+unzip3 m = (Map.map fst3 m, Map.map snd3 m, Map.map thd3 m)
src/full/Agda/Utils/Maybe.hs view
@@ -10,3 +10,7 @@ fromMaybeM :: Monad m => m a -> m (Maybe a) -> m a fromMaybeM m mm = maybe m return =<< mm++unzipMaybe :: Maybe (a,b) -> (Maybe a, Maybe b)+unzipMaybe Nothing = (Nothing, Nothing)+unzipMaybe (Just (a,b)) = (Just a, Just b)
src/full/Agda/Utils/Monad.hs view
@@ -1,7 +1,13 @@-{-# LANGUAGE FlexibleContexts #-}+{-# LANGUAGE CPP, FlexibleContexts #-} module Agda.Utils.Monad ( module Agda.Utils.Monad+{- Andreas 2012-04-21: I'd like to reexport Control.Monad except+ patching when and unless, but the hiding syntax is not valid yet+ (only a proposed language extension)++ , module Control.Monad hiding (when, unless)+-} , (<$>), (<*>) ) where@@ -14,50 +20,84 @@ import qualified Control.Monad.State.Strict as SS import Control.Monad.Writer import Control.Applicative-import Data.Traversable hiding (sequence)-import Data.Foldable+import Data.Traversable as Trav hiding (sequence)+import Data.Foldable as Fold import Data.Monoid+import Data.Maybe import Agda.Utils.List --- Monads -----------------------------------------------------------------+#include "../undefined.h"+import Agda.Utils.Impossible -infixl 8 <.>+-- Conditionals and monads ------------------------------------------------ -(<.>) :: Monad m => (b -> m c) -> (a -> m b) -> a -> m c-f <.> g = \x -> f =<< g x+-- | @when_@ is just @Control.Monad.when@ with a more general type.+when_ :: Monad m => Bool -> m a -> m ()+when_ b m = when b $ do m >> return () -whenM :: Monad m => m Bool -> m () -> m ()-whenM c m = do b <- c- when b m+-- | @unless_@ is just @Control.Monad.unless@ with a more general type.+unless_ :: Monad m => Bool -> m a -> m ()+unless_ b m = unless b $ do m >> return () -unlessM :: Monad m => m Bool -> m () -> m ()-unlessM c m = do b <- c- unless b m+whenJust :: Monad m => Maybe a -> (a -> m ()) -> m ()+whenJust m k = flip (maybe $ return ()) m k +whenM :: Monad m => m Bool -> m a -> m ()+whenM c m = c >>= (`when_` m)++unlessM :: Monad m => m Bool -> m a -> m ()+unlessM c m = c >>= (`unless_` m)++whenJustM :: Monad m => m (Maybe a) -> (a -> m ()) -> m ()+whenJustM c m = c >>= (`whenJust` m)+ ifM :: Monad m => m Bool -> m a -> m a -> m a ifM c m m' = do b <- c if b then m else m' -forgetM :: Applicative m => m a -> m ()-forgetM m = const () <$> m+-- | Lazy monadic conjunction.+and2M :: Monad m => m Bool -> m Bool -> m Bool+and2M ma mb = ifM ma mb (return False) -concatMapM :: Applicative m => (a -> m [b]) -> [a] -> m [b]-concatMapM f xs = concat <$> traverse f xs+andM :: Monad m => [m Bool] -> m Bool+andM = Fold.foldl and2M (return True) --- | Depending on the monad you have to look at the result for--- the force to be effective. For the 'IO' monad you do.-forceM :: Monad m => [a] -> m ()-forceM xs = do () <- length xs `seq` return ()- return ()+-- | Lazy monadic disjunction.+or2M :: Monad m => m Bool -> m Bool -> m Bool+or2M ma mb = ifM ma (return True) mb -commuteM :: (Traversable f, Applicative m) => f (m a) -> m (f a)-commuteM = traverse id+orM :: Monad m => [m Bool] -> m Bool+orM = Fold.foldl or2M (return False) -fmapM :: (Traversable f, Applicative m) => (a -> m b) -> f a -> m (f b)-fmapM f = commuteM . fmap f+-- | Lazy monadic disjunction with @Either@ truth values.+altM1 :: Monad m => (a -> m (Either err b)) -> [a] -> m (Either err b)+altM1 f [] = __IMPOSSIBLE__+altM1 f [a] = f a+altM1 f (a : as) = either (const $ altM1 f as) (return . Right) =<< f a +-- Loops gathering results in a Monoid ------------------------------------++-- | Generalized version of @mapM_ :: Monad m => (a -> m ()) -> [a] -> m ()@+-- Executes effects and collects results in left-to-right order.+-- Works best with left-associative monoids.+--+-- Note that there is an alternative+--+-- @mapM' f t = foldr mappend mempty <$> mapM f t@+--+-- that collects results in right-to-left order (effects still right-to-left).+-- It might be preferable for right associative monoids.+mapM' :: (Foldable t, Monad m, Monoid b) => (a -> m b) -> t a -> m b+mapM' f = Fold.foldl (\ mb a -> liftM2 mappend mb (f a)) (return mempty)++-- | Generalized version of @forM_ :: Monad m => [a] -> (a -> m ()) -> m ()@+forM' :: (Foldable t, Monad m, Monoid b) => t a -> (a -> m b) -> m b+forM' = flip mapM'++-- Continuation monad -----------------------------------------------------+ type Cont r a = (a -> r) -> r -- | 'Control.Monad.mapM' for the continuation monad. Terribly useful.@@ -66,10 +106,18 @@ thread f (x:xs) ret = f x $ \y -> thread f xs $ \ys -> ret (y:ys) +-- Lists and monads -------------------------------------------------------+ -- | Requires both lists to have the same lengths. zipWithM' :: Monad m => (a -> b -> m c) -> [a] -> [b] -> m [c] zipWithM' f xs ys = sequence (zipWith' f xs ys) +-- | A monadic version of @mapMaybe :: (a -> Maybe b) -> [a] -> [b]@.+mapMaybeM :: (Monad m, Functor m) => (a -> m (Maybe b)) -> [a] -> m [b]+mapMaybeM f xs = catMaybes <$> Trav.mapM f xs++-- Error monad ------------------------------------------------------------+ -- | Finally for the 'Error' class. Errors in the finally part take -- precedence over prior errors. @@ -92,15 +140,23 @@ resource <- acquire compute resource `finally` release resource --- Maybe --------------------------------------------------------------------mapMaybeM :: Applicative m => (a -> m b) -> Maybe a -> m (Maybe b)-mapMaybeM f = maybe (pure Nothing) (\x -> Just <$> f x)+-- State monad ------------------------------------------------------------ --- Either -----------------------------------------------------------------+-- | Bracket without failure. Typically used to preserve state.+bracket_ :: (Monad m)+ => m a -- ^ Acquires resource. Run first.+ -> (a -> m c) -- ^ Releases resource. Run last.+ -> m b -- ^ Computes result. Run in-between.+ -> m b+bracket_ acquire release compute = do+ resource <- acquire+ result <- compute+ release resource+ return result -liftEither :: MonadError e m => Either e a -> m a-liftEither = either throwError return+-- | Restore state after computation.+localState :: (MonadState s m) => m a -> m a+localState = bracket_ get put -- Read ------------------------------------------------------------------- @@ -109,3 +165,53 @@ [(x,"")] -> return x _ -> throwError $ strMsg $ "readM: parse error string " ++ s+++++-- RETIRED STUFF ----------------------------------------------------------+++{- Andreas 2012-04-21: <.> is obsolete, it is called <=< in Control.Monad+infixl 8 <.>++(<.>) :: Monad m => (b -> m c) -> (a -> m b) -> a -> m c+f <.> g = \x -> f =<< g x+-}++{- RETIRED, Andreas, 2012-04-30.+ For GHC >= 7, there is now Control.Monad.void.+forgetM :: Applicative m => m a -> m ()+forgetM m = const () <$> m+-}++{- RETIRED, Andreas, 2012-04-30. Not used.+concatMapM :: Applicative m => (a -> m [b]) -> [a] -> m [b]+concatMapM f xs = concat <$> traverse f xs++-- | Depending on the monad you have to look at the result for+-- the force to be effective. For the 'IO' monad you do.+forceM :: Monad m => [a] -> m ()+forceM xs = do () <- length xs `seq` return ()+ return ()++commuteM :: (Traversable f, Applicative m) => f (m a) -> m (f a)+commuteM = traverse id++-- these are just instances of traverse:++fmapM :: (Traversable f, Applicative m) => (a -> m b) -> f a -> m (f b)+fmapM f = commuteM . fmap f++mapMaybeM :: Applicative m => (a -> m b) -> Maybe a -> m (Maybe b)+mapMaybeM f = maybe (pure Nothing) (\x -> Just <$> f x)++-}++{- UNUSED++-- Either -----------------------------------------------------------------++liftEither :: MonadError e m => Either e a -> m a+liftEither = either throwError return+-}
src/full/Agda/Utils/Permutation.hs view
@@ -1,16 +1,20 @@ {-# LANGUAGE DeriveDataTypeable, CPP #-} module Agda.Utils.Permutation where -import Data.Generics (Typeable, Data)+import Data.Typeable (Typeable) import Data.List import Agda.Utils.Size import Agda.Utils.Impossible #include "../undefined.h" --- | @permute [2,3,1] [x,y,z] = [y,z,x]@-data Permutation = Perm Integer [Integer]- deriving (Eq, Data, Typeable)+-- | @permute [1,2,0] [x0,x1,x2] = [x1,x2,x0]@+--+-- Agda typing would be:+-- @Perm : {m : Nat}(n : Nat) -> Vec (Fin n) m -> Permutation@+-- @m@ is the 'size' of the permutation.+data Permutation = Perm { permRange :: Int, permPicks :: [Int] }+ deriving (Eq, Typeable) instance Show Permutation where show (Perm n xs) = showx [0..n - 1] ++ " -> " ++ showx xs@@ -23,10 +27,13 @@ instance Sized Permutation where size (Perm _ xs) = size xs --- | @permute [2,3,1] [x1,x2,x3] = [x2,x3,x1]@+-- | @permute [1,2,0] [x0,x1,x2] = [x1,x2,x0]@ -- More precisely, @permute indices list = sublist@, generates @sublist@ -- from @list@ by picking the elements of list as indicated by @indices@.--- @permute [2,4,1] [x1,x2,x3,x4] = [x2,x4,x1]@+-- @permute [1,3,0] [x0,x1,x2,x3] = [x1,x3,x0]@+--+-- Agda typing:+-- @permute (Perm {m} n is) : Vec A m -> Vec A n@ permute :: Permutation -> [a] -> [a] permute (Perm _ is) xs = map (xs !!!) is where@@ -34,12 +41,19 @@ (x:xs) !!! 0 = x (x:xs) !!! n = xs !!! (n - 1) -idP :: Integer -> Permutation+idP :: Int -> Permutation idP n = Perm n [0..n - 1] -takeP :: Integer -> Permutation -> Permutation+takeP :: Int -> Permutation -> Permutation takeP n (Perm m xs) = Perm n $ filter (< n) xs +-- | @liftP k@ takes a @Perm {m} n@ to a @Perm {m+k} (n+k)@.+-- Analogous to 'Agda.TypeChecking.Substitution.liftS',+-- but Permutations operate on de Bruijn LEVELS, not indices.+liftP :: Int -> Permutation -> Permutation+liftP n (Perm m xs) = Perm (n + m) $ xs ++ [m..m+n-1]+-- liftP n (Perm m xs) = Perm (n + m) $ [0..n-1] ++ map (n+) xs -- WRONG, works for indices, but not for levels+ -- | @permute (compose p1 p2) == permute p1 . permute p2@ composeP :: Permutation -> Permutation -> Permutation composeP p1 (Perm n xs) = Perm n $ permute p1 xs@@ -71,11 +85,24 @@ holesBelow k = genericLength $ filter (< k) missing adjust k = k - holesBelow k +-- | @permute (reverseP p) xs ==+-- reverse $ permute p $ reverse xs@+--+-- Example:+-- @+-- permute (reverseP (Perm 4 [1,3,0])) [x0,x1,x2,x3]+-- == permute (Perm 4 $ map (3-) [0,3,1]) [x0,x1,x2,x3]+-- == permute (Perm 4 [3,0,2]) [x0,x1,x2,x3]+-- == [x3,x0,x2]+-- == reverse [x2,x0,x3]+-- == reverse $ permute (Perm 4 [1,3,0]) [x3,x2,x1,x0]+-- == reverse $ permute (Perm 4 [1,3,0]) $ reverse [x0,x1,x2,x3]+-- @ reverseP :: Permutation -> Permutation reverseP (Perm n xs) = Perm n $ map ((n - 1) -) $ reverse xs -- | @expandP i n π@ in the domain of @π@ replace the /i/th element by /n/ elements.-expandP :: Integer -> Integer -> Permutation -> Permutation+expandP :: Int -> Int -> Permutation -> Permutation expandP i n (Perm m xs) = Perm (m + n - 1) $ concatMap expand xs where expand j
+ src/full/Agda/Utils/Pointed.hs view
@@ -0,0 +1,14 @@+module Agda.Utils.Pointed where++-- | Pointed class.+--+-- We could have used Data.Pointed by Edward Kmett, but it has a+-- lot of package dependencies.+class Pointed f where+ point :: a -> f a++instance Pointed [] where+ point a = [a]++instance Pointed Maybe where+ point = Just
src/full/Agda/Utils/Pointer.hs view
@@ -1,24 +1,77 @@---- | Wrappers for 'IORef's.-module Agda.Utils.Pointer where+{-# LANGUAGE DeriveDataTypeable #-}+module Agda.Utils.Pointer+ ( Ptr, newPtr, derefPtr, setPtr+ , updatePtr, updatePtrM+ ) where -import Control.Monad.Trans+import Control.Applicative+import Control.DeepSeq+import Control.Concurrent.MVar+import Data.Foldable+import Data.Function+import Data.Hashable import Data.IORef+import Data.Traversable+import System.IO.Unsafe+import Data.HashTable.IO+import Data.Typeable -type Ptr a = IORef a+data Ptr a = Ptr { ptrTag :: !Integer+ , ptrRef :: !(IORef a) }+ deriving (Typeable) -deref :: MonadIO io => Ptr a -> io a-deref p = liftIO $ readIORef p+{-# NOINLINE freshVar #-}+freshVar :: MVar Integer+freshVar = unsafePerformIO $ newMVar 0 -store :: MonadIO io => Ptr a -> a -> io ()-store p x = liftIO $ writeIORef p x+fresh :: IO Integer+fresh = do+ x <- takeMVar freshVar+ putMVar freshVar $! x + 1+ return x -alloc :: MonadIO io => a -> io (Ptr a)-alloc x = liftIO $ newIORef x+{-# NOINLINE newPtr #-}+newPtr :: a -> Ptr a+newPtr x = unsafePerformIO $ do+ i <- fresh+ Ptr i <$> newIORef x -updatePtr :: MonadIO io => Ptr a -> (a -> io a) -> io a-updatePtr p f = do- x <- deref p- y <- f x- store p y- return y+derefPtr :: Ptr a -> a+derefPtr p = unsafePerformIO $ readIORef $ ptrRef p++{-# NOINLINE updatePtr #-}+updatePtr :: (a -> a) -> Ptr a -> Ptr a+updatePtr f p = unsafePerformIO $ p <$ modifyIORef (ptrRef p) f++setPtr :: a -> Ptr a -> Ptr a+setPtr x = updatePtr (const x)++-- | If @f a@ contains many copies of @a@ they will all be the same pointer in+-- the result. If the function is well-behaved (i.e. preserves the implicit+-- equivalence, this shouldn't matter).+updatePtrM :: Functor f => (a -> f a) -> Ptr a -> f (Ptr a)+updatePtrM f p = flip setPtr p <$> f (derefPtr p)++instance Show a => Show (Ptr a) where+ show p = "#" ++ show (ptrTag p) ++ "{" ++ show (derefPtr p) ++ "}"++instance Functor Ptr where+ fmap f = newPtr . f . derefPtr++instance Foldable Ptr where+ foldMap f = f . derefPtr++instance Traversable Ptr where+ traverse f p = newPtr <$> f (derefPtr p)++instance Eq (Ptr a) where+ (==) = (==) `on` ptrTag++instance Ord (Ptr a) where+ compare = compare `on` ptrTag++instance Hashable (Ptr a) where+ hash = hash . ptrTag++instance NFData (Ptr a) where+
src/full/Agda/Utils/String.hs view
@@ -8,15 +8,15 @@ import Data.List import Numeric --- | 'quote' adds double quotes around the string, and escapes double--- quotes and backslashes within the string. This is different from--- the behaviour of 'show':+-- | 'quote' adds double quotes around the string, replaces newline+-- characters with @\n@, and escapes double quotes and backslashes+-- within the string. This is different from the behaviour of 'show': -- -- @ -- \> 'putStrLn' $ 'show' \"\\x2200\" -- \"\\8704\" -- \> 'putStrLn' $ 'quote' \"\\x2200\"--- \"∀\"+-- \"∀\" -- @ -- -- (The code examples above have been tested using version 4.2.0.0 of@@ -25,7 +25,8 @@ quote :: String -> String quote s = "\"" ++ concatMap escape s ++ "\"" where- escape c | c `elem` escapeChars = ['\\', c]+ escape c | c == '\n' = "\\n"+ | c `elem` escapeChars = ['\\', c] | otherwise = [c] escapeChars = "\"\\"
src/full/Agda/Utils/Suffix.hs view
@@ -1,23 +1,60 @@-{-# LANGUAGE PatternGuards #-}+{-# LANGUAGE CPP, PatternGuards #-} module Agda.Utils.Suffix where import Data.Char -data Suffix = NoSuffix | Prime Int | Index Int+#include "../undefined.h"+import Agda.Utils.Impossible -nextSuffix NoSuffix = Prime 1-nextSuffix (Prime _) = Index 0 -- we only use single primes in generated names-nextSuffix (Index i) = Index $ i + 1+------------------------------------------------------------------------+-- Subscript digits +-- | Is the character one of the subscripts @'₀'@-@'₉'@?++isSubscriptDigit :: Char -> Bool+isSubscriptDigit c = '₀' <= c && c <= '₉'++-- | Converts @'0'@-@'9'@ to @'₀'@-@'₉'@.+--+-- Precondition: The digit needs to be in range.++toSubscriptDigit :: Char -> Char+toSubscriptDigit d+ | isDigit d = toEnum (fromEnum '₀' + (fromEnum d - fromEnum '0'))+ | otherwise = __IMPOSSIBLE__++-- | Converts @'₀'@-@'₉'@ to @'0'@-@'9'@.+--+-- Precondition: The digit needs to be in range.++fromSubscriptDigit :: Char -> Char+fromSubscriptDigit d+ | isSubscriptDigit d =+ toEnum (fromEnum '0' + (fromEnum d - fromEnum '₀'))+ | otherwise = __IMPOSSIBLE__++------------------------------------------------------------------------+-- Suffices++data Suffix = NoSuffix | Prime Int | Index Int | Subscript Int++nextSuffix NoSuffix = Subscript 1+nextSuffix (Prime i) = Prime $ i + 1+nextSuffix (Index i) = Index $ i + 1+nextSuffix (Subscript i) = Subscript $ i + 1+ suffixView :: String -> (String, Suffix) suffixView s- | (ps@(_:_), s') <- span (=='\'') rs = (reverse s', Prime $ length ps)- | (ns@(_:_), s') <- span isDigit rs = (reverse s', Index $ read $ reverse ns)- | otherwise = (s, NoSuffix)- where- rs = reverse s+ | (ps@(_:_), s') <- span (=='\'') rs = (reverse s', Prime $ length ps)+ | (ns@(_:_), s') <- span isDigit rs = (reverse s', Index $ read $ reverse ns)+ | (ns@(_:_), s') <- span isSubscriptDigit rs = (reverse s',+ Subscript $ read $+ map fromSubscriptDigit $ reverse ns)+ | otherwise = (s, NoSuffix)+ where rs = reverse s addSuffix :: String -> Suffix -> String-addSuffix s NoSuffix = s-addSuffix s (Prime n) = s ++ replicate n '\''-addSuffix s (Index i) = s ++ show i+addSuffix s NoSuffix = s+addSuffix s (Prime n) = s ++ replicate n '\''+addSuffix s (Index i) = s ++ show i+addSuffix s (Subscript i) = s ++ map toSubscriptDigit (show i)
src/full/Agda/Utils/TestHelpers.hs view
@@ -15,6 +15,7 @@ , maybeGen , maybeCoGen , listOfElements+ , elementsUnlessEmpty , two , three -- * Test driver.@@ -26,7 +27,6 @@ import Data.List import Agda.Utils.QuickCheck-import qualified Agda.Utils.IO.Locale as LocIO ------------------------------------------------------------------------ -- Algebraic properties@@ -105,6 +105,13 @@ listOfElements [] = return [] listOfElements xs = listOf $ elements xs +-- | If the given list is non-empty, then an element from the list is+-- generated, and otherwise an arbitrary element is generated.++elementsUnlessEmpty :: Arbitrary a => [a] -> Gen a+elementsUnlessEmpty [] = arbitrary+elementsUnlessEmpty xs = elements xs+ -- | Generates values of 'Maybe' type, using the given generator to -- generate the contents of the 'Just' constructor. @@ -139,5 +146,5 @@ -> [IO Bool] -> IO Bool runTests name tests = do- LocIO.putStrLn name+ putStrLn name fmap and $ sequence tests
+ src/full/Agda/Utils/Time.hs view
@@ -0,0 +1,33 @@+{-# LANGUAGE CPP #-}++-- | Time-related utilities.++module Agda.Utils.Time+ ( ClockTime+ , getClockTime+ ) where++#if MIN_VERSION_directory(1,1,1)+import qualified Data.Time+#else+import qualified System.Time+#endif++-- | Timestamps.++type ClockTime =+#if MIN_VERSION_directory(1,1,1)+ Data.Time.UTCTime+#else+ System.Time.ClockTime+#endif++-- | The current time.++getClockTime :: IO ClockTime+getClockTime =+#if MIN_VERSION_directory(1,1,1)+ Data.Time.getCurrentTime+#else+ System.Time.getClockTime+#endif
src/full/Agda/Utils/Tuple.hs view
@@ -1,14 +1,63 @@+{-# LANGUAGE TupleSections, GeneralizedNewtypeDeriving, DeriveFunctor, DeriveFoldable, DeriveTraversable #-} module Agda.Utils.Tuple where +import Control.Applicative++import Data.Foldable+import Data.Traversable+ infix 2 -*- infix 3 /\ -- backslashes at EOL interacts badly with CPP... +-- | Bifunctoriality for pairs. (-*-) :: (a -> c) -> (b -> d) -> (a,b) -> (c,d)-(f -*- g) (x,y) = (f x, g y)+(f -*- g) ~(x,y) = (f x, g y) +-- | @mapFst f = f -*- id@+mapFst :: (a -> c) -> (a,b) -> (c,b)+mapFst f ~(x,y) = (f x, y)++-- | @mapSnd g = id -*- g@+mapSnd :: (b -> d) -> (a,b) -> (a,d)+mapSnd g ~(x,y) = (x, g y)++-- | Lifted pairing. (/\) :: (a -> b) -> (a -> c) -> a -> (b,c) (f /\ g) x = (f x, g x) +-- * Triple (stolen from Data.Tuple.HT)++{-# INLINE fst3 #-}+fst3 :: (a,b,c) -> a+fst3 ~(x,_,_) = x++{-# INLINE snd3 #-}+snd3 :: (a,b,c) -> b+snd3 ~(_,x,_) = x++{-# INLINE thd3 #-}+thd3 :: (a,b,c) -> c+thd3 ~(_,_,x) = x++{-# INLINE uncurry3 #-} uncurry3 :: (a -> b -> c -> d) -> (a,b,c) -> d-uncurry3 f (x,y,z) = f x y z+uncurry3 f ~(x,y,z) = f x y z++uncurry4 :: (a -> b -> c -> d -> e) -> (a,b,c,d) -> e+uncurry4 f ~(w,x,y,z) = f w x y z++-- | Monadic version of '-*-'.+mapPairM :: (Applicative m) => (a -> m c) -> (b -> m d) -> (a,b) -> m (c,d)+mapPairM f g ~(a,b) = (,) <$> f a <*> g b++-- | Monadic 'mapFst'.+mapFstM :: (Applicative m) => (a -> m c) -> (a,b) -> m (c,b)+mapFstM f ~(a,b) = (,b) <$> f a++-- | Monadic 'mapSnd'.+mapSndM :: (Applicative m) => (b -> m d) -> (a,b) -> m (a,d)+mapSndM f ~(a,b) = (a,) <$> f b++newtype List2 a = List2 { list2 :: (a,a) }+ deriving (Eq, Functor, Foldable, Traversable)
src/full/Agda/Utils/VarSet.hs view
@@ -7,12 +7,12 @@ ) where -import Data.Set as Set+import Data.IntSet as Set -type VarSet = Set Integer+type VarSet = Set.IntSet -subtract :: Integer -> VarSet -> VarSet-subtract n s = Set.mapMonotonic (Prelude.subtract n) s+subtract :: Int -> VarSet -> VarSet+subtract n s = Set.map (Prelude.subtract n) s {- import Data.Bits
src/full/Agda/Utils/Warshall.hs view
@@ -280,9 +280,11 @@ v < v for a rigid variable v +{- Andreas, 2012-09-19 OUTDATED v <= v' for rigid variables v,v' x < v for a flexible variable x and a rigid variable v+-} thus, for each flexible x, only one of the following cases is possible @@ -325,21 +327,27 @@ -- compute the sets of flexible and rigid node numbers ns = Map.keys (nodeMap gr) -- a set of flexible variables- flexs = foldl (\ l k -> case k of (Flex i) -> i : l- (Rigid _) -> l) [] ns+ flexs = foldl' (\ l k -> case k of (Flex i) -> i : l+ (Rigid _) -> l) [] ns -- a set of rigid variables- rigids = foldl (\ l k -> case k of (Flex _) -> l- (Rigid i) -> i : l) [] ns+ rigids = foldl' (\ l k -> case k of (Flex _) -> l+ (Rigid i) -> i : l) [] ns -- rigid matrix indices- rInds = foldl (\ l r -> let Just i = Map.lookup (Rigid r) (nodeMap gr)- in i : l) [] rigids+ rInds = foldl' (\ l r -> let Just i = Map.lookup (Rigid r) (nodeMap gr)+ in i : l) [] rigids -- check whether there is a solution -- d = [ m!(i,i) | i <- [0 .. (n-1)] ] -- diagonal -- a rigid variable might not be less than it self, so no -.. on the -- rigid part of the diagonal- solvable = all (\ x -> x >= Finite 0) [ m!(i,i) | i <- rInds ] &&+ solvable = all (\ x -> x >= Finite 0) [ m!(i,i) | i <- rInds ] && True++{- Andreas, 2012-09-19+ We now can have constraints between rigid variables, like i < j.+ Thus we skip the following two test. However, a solution must be+ checked for consistency with the constraints on rigid vars.+ -- a rigid variable might not be bounded below by infinity or -- bounded above by a constant -- it might not be related to another rigid variable@@ -357,7 +365,7 @@ edge = m!(row,col) in edge >= Finite 0) [ (x,v) | x <- flexs, (RVar v) <- rigids ]-+-} inScope :: FlexId -> Rigid -> Bool inScope x (RConst _) = True@@ -378,7 +386,7 @@ loop1 flxs (r:rgds) subst = let row = fromJust $ Map.lookup (Rigid r) (nodeMap gr) (flxs',subst') =- foldl (\ (flx,sub) f ->+ foldl' (\ (flx,sub) f -> let col = fromJust $ Map.lookup (Flex f) (nodeMap gr) in case (inScope f r, m!(row,col)) of -- Finite z | z <= 0 ->@@ -518,9 +526,4 @@ g =~= g' = sort (edges g) == sort (edges g') tests :: IO Bool-tests = runTests "Agda.Utils.Warshall"- [ quickCheck' prop_smaller- , quickCheck' prop_path- , quickCheck' prop_disjoint- , quickCheck' prop_stable- ]+tests = runTests "Agda.Utils.Warshall" []
+ src/main/Main.hs view
@@ -0,0 +1,12 @@+-- | Wrapper for "Agda.Main".+--+-- Agda is installed as a library. This module is used to build the+-- executable.++module Main (main) where++import qualified Agda.Main ( main )+import Prelude ( IO )++main :: IO ()+main = Agda.Main.main