[
  {
    "path": ".editorconfig",
    "content": "root = true\n\n[*]\ncharset = utf-8\n\n[*.{json,toml,yml,gyp}]\nindent_style = space\nindent_size = 2\n\n[*.js]\nindent_style = space\nindent_size = 2\n\n[*.scm]\nindent_style = space\nindent_size = 2\n\n[*.{c,cc,h}]\nindent_style = space\nindent_size = 4\n\n[*.rs]\nindent_style = space\nindent_size = 4\n\n[*.{py,pyi}]\nindent_style = space\nindent_size = 4\n\n[*.swift]\nindent_style = space\nindent_size = 4\n\n[*.go]\nindent_style = tab\nindent_size = 8\n\n[Makefile]\nindent_style = tab\nindent_size = 8\n\n[parser.c]\nindent_size = 2\n\n[{alloc,array,parser}.h]\nindent_size = 2\n"
  },
  {
    "path": ".gitattributes",
    "content": "* text=auto eol=lf\n\n# Generated source files\nsrc/*.json linguist-generated\nsrc/parser.c linguist-generated\nsrc/tree_sitter/* linguist-generated\n\n# C bindings\nbindings/c/* linguist-generated\nCMakeLists.txt linguist-generated\nMakefile linguist-generated\n\n# Rust bindings\nbindings/rust/* linguist-generated\nCargo.toml linguist-generated\nCargo.lock linguist-generated\n\n# Node.js bindings\nbindings/node/* linguist-generated\nbinding.gyp linguist-generated\npackage.json linguist-generated\npackage-lock.json linguist-generated\n\n# Python bindings\nbindings/python/** linguist-generated\nsetup.py linguist-generated\npyproject.toml linguist-generated\n\n# Go bindings\nbindings/go/* linguist-generated\ngo.mod linguist-generated\ngo.sum linguist-generated\n\n# Swift bindings\nbindings/swift/** linguist-generated\nPackage.swift linguist-generated\nPackage.resolved linguist-generated\n"
  },
  {
    "path": ".github/workflows/ci.yml",
    "content": "name: CI\n\non:\n  push:\n    branches: [master]\n    paths:\n      - grammar.js\n      - src/**\n      - test/**\n      - bindings/**\n      - binding.gyp\n  pull_request:\n    paths:\n      - grammar.js\n      - src/**\n      - test/**\n      - bindings/**\n      - binding.gyp\n\nconcurrency:\n  group: ${{github.workflow}}-${{github.ref}}\n  cancel-in-progress: true\n\njobs:\n  test:\n    name: Test parser\n    runs-on: ${{matrix.os}}\n    strategy:\n      fail-fast: false\n      matrix:\n        os: [ubuntu-latest, windows-latest, macos-14]\n    steps:\n      - name: Checkout repository\n        uses: actions/checkout@v4\n      - name: Set up tree-sitter\n        uses: tree-sitter/setup-action/cli@v1\n      - name: Set up examples\n        run: |-\n          git clone https://github.com/joshvera/effects examples/effects --single-branch --depth=1 --filter=blob:none\n          git clone https://github.com/PostgRest/postgrest examples/postgrest --single-branch --depth=1 --filter=blob:none\n          git clone https://github.com/GaloisInc/ivory examples/ivory --single-branch --depth=1 --filter=blob:none\n          git clone https://github.com/polysemy-research/polysemy examples/polysemy --single-branch --depth=1 --filter=blob:none\n          git clone https://github.com/github/semantic examples/semantic --single-branch --depth=1 --filter=blob:none\n          git clone https://github.com/haskell/haskell-language-server examples/haskell-language-server --single-branch --depth=1 --filter=blob:none\n          git clone https://github.com/AndrasKovacs/flatparse examples/flatparse --single-branch --depth=1 --filter=blob:none\n          git clone https://github.com/ekmett/lens examples/lens --single-branch --depth=1 --filter=blob:none\n          git clone https://github.com/tek/tsh-test-ghc examples/tsh-test-ghc --single-branch --depth=1 --filter=blob:none\n      - name: Run tests\n        uses: tree-sitter/parser-test-action@v2\n        with:\n          test-rust: ${{runner.os == 'Linux'}}\n      - name: Parse examples\n        id: examples\n        uses: tree-sitter/parse-action@v4\n        with:\n          files: |\n            examples/*.hs\n            !exampels/haskell-language-server/test/functional/Symbol.hs\n            !examples/lens/tests/properties.hs\n            !examples/semantic/semantic/test/fixtures/haskell/corpus/function-declarations.A.hs\n            !examples/semantic/semantic/test/fixtures/haskell/corpus/function-declarations.B.hs\n            !examples/semantic/semantic/test/fixtures/haskell/corpus/tempate-haskell.A.hs\n            !examples/semantic/semantic/test/fixtures/haskell/corpus/template-haskell.B.hs\n            !examples/semantic/semantic/test/fixtures/haskell/corpus/algebraic-datatype-declarations.A.hs\n            !examples/semantic/semantic/test/fixtures/haskell/corpus/algebraic-datatype-declarations.B.hs\n            !examples/semantic/semantic/test/fixtures/haskell/corpus/newtype-declaration.A.hs\n            !examples/semantic/semantic/test/fixtures/haskell/corpus/newtype-declaration.B.hs\n            !examples/semantic/semantic/test/fixtures/haskell/corpus/type-synonyms.A.hs\n            !examples/semantic/semantic/test/fixtures/haskell/corpus/type-synonyms.B.hs\n            !examples/polysemy/src/Polysemy/Law.hs\n            !examples/tsh-test-ghc/compiler/GHC/Builtin/PrimOps.hs\n          invalid-files: |\n            !examples/haskell-language-server/test/testdata/FuncTestFail.hs\n"
  },
  {
    "path": ".github/workflows/fuzz.yml",
    "content": "name: Fuzz Parser\n\non:\n  push:\n    branches: [master]\n    paths:\n      - src/scanner.c\n  pull_request:\n    paths:\n      - src/scanner.c\n\njobs:\n  fuzz:\n    runs-on: ubuntu-latest\n    steps:\n      - name: Checkout repository\n        uses: actions/checkout@v4\n      - name: Run fuzzer\n        uses: tree-sitter/fuzz-action@v4\n"
  },
  {
    "path": ".github/workflows/publish.yml",
    "content": "name: Publish packages\n\non:\n  push:\n    tags: [\"*\"]\n\npermissions:\n  contents: write\n  id-token: write\n  attestations: write\n\njobs:\n  github:\n    uses: tree-sitter/workflows/.github/workflows/release.yml@main\n    with:\n      generate: true\n      attestations: true\n  npm:\n    uses: tree-sitter/workflows/.github/workflows/package-npm.yml@main\n    secrets:\n      NODE_AUTH_TOKEN: ${{secrets.NPM_TOKEN}}\n    with:\n      generate: true\n  crates:\n    uses: tree-sitter/workflows/.github/workflows/package-crates.yml@main\n    secrets:\n      CARGO_REGISTRY_TOKEN: ${{secrets.CARGO_REGISTRY_TOKEN}}\n    with:\n      generate: true\n  pypi:\n    uses: tree-sitter/workflows/.github/workflows/package-pypi.yml@main\n    secrets:\n      PYPI_API_TOKEN: ${{secrets.PYPI_API_TOKEN}}\n    with:\n      generate: true\n"
  },
  {
    "path": ".gitignore",
    "content": "# Rust artifacts\ntarget/\n\n# Node artifacts\nbuild/\nprebuilds/\nnode_modules/\n\n# Swift artifacts\n.build/\n\n# Go artifacts\n_obj/\n\n# Python artifacts\n.venv/\ndist/\n*.egg-info\n*.whl\n\n# C artifacts\n*.a\n*.so\n*.so.*\n*.dylib\n*.dll\n*.pc\n\n# Example dirs\n/examples/*/\n\n# Grammar volatiles\n*.wasm\n*.obj\n*.o\n\n# Archives\n*.tar.gz\n*.tgz\n*.zip\n"
  },
  {
    "path": "CMakeLists.txt",
    "content": "cmake_minimum_required(VERSION 3.13)\n\nproject(tree-sitter-haskell\n        VERSION \"0.23.1\"\n        DESCRIPTION \"Haskell grammar for tree-sitter\"\n        HOMEPAGE_URL \"https://github.com/tree-sitter/tree-sitter-haskell\"\n        LANGUAGES C)\n\noption(BUILD_SHARED_LIBS \"Build using shared libraries\" ON)\noption(TREE_SITTER_REUSE_ALLOCATOR \"Reuse the library allocator\" OFF)\n\nset(TREE_SITTER_ABI_VERSION 14 CACHE STRING \"Tree-sitter ABI version\")\nif(NOT ${TREE_SITTER_ABI_VERSION} MATCHES \"^[0-9]+$\")\n    unset(TREE_SITTER_ABI_VERSION CACHE)\n    message(FATAL_ERROR \"TREE_SITTER_ABI_VERSION must be an integer\")\nendif()\n\nfind_program(TREE_SITTER_CLI tree-sitter DOC \"Tree-sitter CLI\")\n\nadd_custom_command(OUTPUT \"${CMAKE_CURRENT_SOURCE_DIR}/src/parser.c\"\n                   DEPENDS \"${CMAKE_CURRENT_SOURCE_DIR}/src/grammar.json\"\n                   COMMAND \"${TREE_SITTER_CLI}\" generate src/grammar.json\n                            --abi=${TREE_SITTER_ABI_VERSION}\n                   WORKING_DIRECTORY \"${CMAKE_CURRENT_SOURCE_DIR}\"\n                   COMMENT \"Generating parser.c\")\n\nadd_library(tree-sitter-haskell src/parser.c)\nif(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/src/scanner.c)\n  target_sources(tree-sitter-haskell PRIVATE src/scanner.c)\nendif()\ntarget_include_directories(tree-sitter-haskell PRIVATE src)\n\ntarget_compile_definitions(tree-sitter-haskell PRIVATE\n                           $<$<BOOL:${TREE_SITTER_REUSE_ALLOCATOR}>:TREE_SITTER_REUSE_ALLOCATOR>\n                           $<$<CONFIG:Debug>:TREE_SITTER_DEBUG>)\n\nset_target_properties(tree-sitter-haskell\n                      PROPERTIES\n                      C_STANDARD 11\n                      POSITION_INDEPENDENT_CODE ON\n                      SOVERSION \"${TREE_SITTER_ABI_VERSION}.${PROJECT_VERSION_MAJOR}\"\n                      DEFINE_SYMBOL \"\")\n\nconfigure_file(bindings/c/tree-sitter-haskell.pc.in\n               \"${CMAKE_CURRENT_BINARY_DIR}/tree-sitter-haskell.pc\" @ONLY)\n\ninclude(GNUInstallDirs)\n\ninstall(FILES bindings/c/tree-sitter-haskell.h\n        DESTINATION \"${CMAKE_INSTALL_INCLUDEDIR}/tree_sitter\")\ninstall(FILES \"${CMAKE_CURRENT_BINARY_DIR}/tree-sitter-haskell.pc\"\n        DESTINATION \"${CMAKE_INSTALL_DATAROOTDIR}/pkgconfig\")\ninstall(TARGETS tree-sitter-haskell\n        LIBRARY DESTINATION \"${CMAKE_INSTALL_LIBDIR}\")\n\nadd_custom_target(ts-test \"${TREE_SITTER_CLI}\" test\n                  WORKING_DIRECTORY \"${CMAKE_CURRENT_SOURCE_DIR}\"\n                  COMMENT \"tree-sitter test\")\n"
  },
  {
    "path": "Cargo.toml",
    "content": "[package]\nname = \"tree-sitter-haskell\"\ndescription = \"Haskell grammar for tree-sitter\"\nversion = \"0.23.1\"\nauthors = [\"Max Brunsfeld <maxbrunsfeld@gmail.com>\"]\nlicense = \"MIT\"\nreadme = \"README.md\"\nkeywords = [\"incremental\", \"parsing\", \"tree-sitter\", \"haskell\"]\ncategories = [\"parsing\", \"text-editors\"]\nrepository = \"https://github.com/tree-sitter/tree-sitter-haskell\"\nedition = \"2021\"\nautoexamples = false\n\nbuild = \"bindings/rust/build.rs\"\ninclude = [\"LICENSE\", \"bindings/rust/*\", \"grammar.js\", \"queries/*\", \"src/*\", \"tree-sitter.json\"]\n\n[lib]\npath = \"bindings/rust/lib.rs\"\n\n[dependencies]\ntree-sitter-language = \"0.1\"\n\n[build-dependencies]\ncc = \"1.1.15\"\n\n[dev-dependencies]\ntree-sitter = \"0.23\"\n"
  },
  {
    "path": "LICENSE",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2014 Max Brunsfeld\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "Makefile",
    "content": "ifeq ($(OS),Windows_NT)\n$(error Windows is not supported)\nendif\n\nLANGUAGE_NAME := tree-sitter-haskell\nHOMEPAGE_URL := https://github.com/tree-sitter/tree-sitter-haskell\nVERSION := 0.23.1\n\n# repository\nSRC_DIR := src\n\nTS ?= tree-sitter\n\n# install directory layout\nPREFIX ?= /usr/local\nINCLUDEDIR ?= $(PREFIX)/include\nLIBDIR ?= $(PREFIX)/lib\nPCLIBDIR ?= $(LIBDIR)/pkgconfig\n\n# source/object files\nPARSER := $(SRC_DIR)/parser.c\nEXTRAS := $(filter-out $(PARSER),$(wildcard $(SRC_DIR)/*.c))\nOBJS := $(patsubst %.c,%.o,$(PARSER) $(EXTRAS))\n\n# flags\nARFLAGS ?= rcs\noverride CFLAGS += -I$(SRC_DIR) -std=c11 -fPIC\n\n# ABI versioning\nSONAME_MAJOR = $(shell sed -n 's/\\#define LANGUAGE_VERSION //p' $(PARSER))\nSONAME_MINOR = $(word 1,$(subst ., ,$(VERSION)))\n\n# OS-specific bits\nifeq ($(shell uname),Darwin)\n\tSOEXT = dylib\n\tSOEXTVER_MAJOR = $(SONAME_MAJOR).$(SOEXT)\n\tSOEXTVER = $(SONAME_MAJOR).$(SONAME_MINOR).$(SOEXT)\n\tLINKSHARED = -dynamiclib -Wl,-install_name,$(LIBDIR)/lib$(LANGUAGE_NAME).$(SOEXTVER),-rpath,@executable_path/../Frameworks\nelse\n\tSOEXT = so\n\tSOEXTVER_MAJOR = $(SOEXT).$(SONAME_MAJOR)\n\tSOEXTVER = $(SOEXT).$(SONAME_MAJOR).$(SONAME_MINOR)\n\tLINKSHARED = -shared -Wl,-soname,lib$(LANGUAGE_NAME).$(SOEXTVER)\nendif\nifneq ($(filter $(shell uname),FreeBSD NetBSD DragonFly),)\n\tPCLIBDIR := $(PREFIX)/libdata/pkgconfig\nendif\n\nall: lib$(LANGUAGE_NAME).a lib$(LANGUAGE_NAME).$(SOEXT) $(LANGUAGE_NAME).pc\n\nlib$(LANGUAGE_NAME).a: $(OBJS)\n\t$(AR) $(ARFLAGS) $@ $^\n\nlib$(LANGUAGE_NAME).$(SOEXT): $(OBJS)\n\t$(CC) $(LDFLAGS) $(LINKSHARED) $^ $(LDLIBS) -o $@\nifneq ($(STRIP),)\n\t$(STRIP) $@\nendif\n\n$(LANGUAGE_NAME).pc: bindings/c/$(LANGUAGE_NAME).pc.in\n\tsed -e 's|@PROJECT_VERSION@|$(VERSION)|' \\\n\t\t-e 's|@CMAKE_INSTALL_LIBDIR@|$(LIBDIR:$(PREFIX)/%=%)|' \\\n\t\t-e 's|@CMAKE_INSTALL_INCLUDEDIR@|$(INCLUDEDIR:$(PREFIX)/%=%)|' \\\n\t\t-e 's|@PROJECT_DESCRIPTION@|$(DESCRIPTION)|' \\\n\t\t-e 's|@PROJECT_HOMEPAGE_URL@|$(HOMEPAGE_URL)|' \\\n\t\t-e 's|@CMAKE_INSTALL_PREFIX@|$(PREFIX)|' $< > $@\n\n$(PARSER): $(SRC_DIR)/grammar.json\n\t$(TS) generate $^\n\ninstall: all\n\tinstall -d '$(DESTDIR)$(INCLUDEDIR)'/tree_sitter '$(DESTDIR)$(PCLIBDIR)' '$(DESTDIR)$(LIBDIR)'\n\tinstall -m644 bindings/c/$(LANGUAGE_NAME).h '$(DESTDIR)$(INCLUDEDIR)'/tree_sitter/$(LANGUAGE_NAME).h\n\tinstall -m644 $(LANGUAGE_NAME).pc '$(DESTDIR)$(PCLIBDIR)'/$(LANGUAGE_NAME).pc\n\tinstall -m644 lib$(LANGUAGE_NAME).a '$(DESTDIR)$(LIBDIR)'/lib$(LANGUAGE_NAME).a\n\tinstall -m755 lib$(LANGUAGE_NAME).$(SOEXT) '$(DESTDIR)$(LIBDIR)'/lib$(LANGUAGE_NAME).$(SOEXTVER)\n\tln -sf lib$(LANGUAGE_NAME).$(SOEXTVER) '$(DESTDIR)$(LIBDIR)'/lib$(LANGUAGE_NAME).$(SOEXTVER_MAJOR)\n\tln -sf lib$(LANGUAGE_NAME).$(SOEXTVER_MAJOR) '$(DESTDIR)$(LIBDIR)'/lib$(LANGUAGE_NAME).$(SOEXT)\n\nuninstall:\n\t$(RM) '$(DESTDIR)$(LIBDIR)'/lib$(LANGUAGE_NAME).a \\\n\t\t'$(DESTDIR)$(LIBDIR)'/lib$(LANGUAGE_NAME).$(SOEXTVER) \\\n\t\t'$(DESTDIR)$(LIBDIR)'/lib$(LANGUAGE_NAME).$(SOEXTVER_MAJOR) \\\n\t\t'$(DESTDIR)$(LIBDIR)'/lib$(LANGUAGE_NAME).$(SOEXT) \\\n\t\t'$(DESTDIR)$(INCLUDEDIR)'/tree_sitter/$(LANGUAGE_NAME).h \\\n\t\t'$(DESTDIR)$(PCLIBDIR)'/$(LANGUAGE_NAME).pc\n\nclean:\n\t$(RM) $(OBJS) $(LANGUAGE_NAME).pc lib$(LANGUAGE_NAME).a lib$(LANGUAGE_NAME).$(SOEXT)\n\ntest:\n\t$(TS) test\n\n.PHONY: all install uninstall clean test\n"
  },
  {
    "path": "Package.resolved",
    "content": "{\n  \"object\": {\n    \"pins\": [\n      {\n        \"package\": \"SwiftTreeSitter\",\n        \"repositoryURL\": \"https://github.com/ChimeHQ/SwiftTreeSitter\",\n        \"state\": {\n          \"branch\": null,\n          \"revision\": \"2599e95310b3159641469d8a21baf2d3d200e61f\",\n          \"version\": \"0.8.0\"\n        }\n      }\n    ]\n  },\n  \"version\": 1\n}\n"
  },
  {
    "path": "Package.swift",
    "content": "// swift-tools-version:5.3\nimport PackageDescription\n\nlet package = Package(\n    name: \"TreeSitterHaskell\",\n    products: [\n        .library(name: \"TreeSitterHaskell\", targets: [\"TreeSitterHaskell\"]),\n    ],\n    dependencies: [\n        .package(url: \"https://github.com/ChimeHQ/SwiftTreeSitter\", from: \"0.8.0\"),\n    ],\n    targets: [\n        .target(\n            name: \"TreeSitterHaskell\",\n            dependencies: [],\n            path: \".\",\n            sources: [\n                \"src/parser.c\",\n                \"src/scanner.c\",\n            ],\n            resources: [\n                .copy(\"queries\")\n            ],\n            publicHeadersPath: \"bindings/swift\",\n            cSettings: [.headerSearchPath(\"src\")]\n        ),\n        .testTarget(\n            name: \"TreeSitterHaskellTests\",\n            dependencies: [\n                \"SwiftTreeSitter\",\n                \"TreeSitterHaskell\",\n            ],\n            path: \"bindings/swift/TreeSitterHaskellTests\"\n        )\n    ],\n    cLanguageStandard: .c11\n)\n"
  },
  {
    "path": "README.md",
    "content": "# tree-sitter-haskell\n\n[![CI][ci]](https://github.com/tree-sitter/tree-sitter-haskell/actions/workflows/ci.yml)\n[![discord][discord]](https://discord.gg/w7nTvsVJhm)\n[![matrix][matrix]](https://matrix.to/#/#tree-sitter-chat:matrix.org)\n[![crates][crates]](https://crates.io/crates/tree-sitter-haskell)\n[![npm][npm]](https://www.npmjs.com/package/tree-sitter-haskell)\n[![pypi][pypi]](https://pypi.org/project/tree-sitter-haskell)\n\nHaskell grammar for [tree-sitter].\n\n# References\n\n- [Haskell 2010 Language Report – Syntax References][ref]\n- [GHC Language Extensions][ext]\n\n# Supported Language Extensions\n\nThese extensions are supported ✅, unsupported ❌ or not applicable because they don't involve parsing ➖️:\n\n- AllowAmbiguousTypes ➖️\n- ApplicativeDo ➖️\n- Arrows ❌\n- BangPatterns ✅\n- BinaryLiterals ✅\n- BlockArguments ✅\n- CApiFFI ✅\n- ConstrainedClassMethods ✅\n- ConstraintKinds ✅\n- CPP ✅\n- CUSKs ✅\n- DataKinds ✅\n- DatatypeContexts ✅\n- DefaultSignatures ✅\n- DeriveAnyClass ➖️\n- DeriveDataTypeable ➖️\n- DeriveFoldable ➖️\n- DeriveFunctor ➖️\n- DeriveGeneric ➖️\n- DeriveLift ➖️\n- DeriveTraversable ➖️\n- DerivingStrategies ✅\n- DerivingVia ✅\n- DisambiguateRecordFields ➖️\n- DuplicateRecordFields ➖️\n- EmptyCase ✅\n- EmptyDataDecls ✅\n- EmptyDataDeriving ✅\n- ExistentialQuantification ✅\n- ExplicitForAll ✅\n- ExplicitNamespaces ✅\n- ExtendedDefaultRules ➖️\n- FlexibleContexts ✅\n- FlexibleInstances ✅\n- ForeignFunctionInterface ✅\n- FunctionalDependencies ✅\n- GADTs ✅\n- GADTSyntax ✅\n- GeneralisedNewtypeDeriving ➖️\n- GHCForeignImportPrim ✅\n- Haskell2010 ➖️\n- Haskell98 ➖️\n- HexFloatLiterals ✅\n- ImplicitParams ✅\n- ImplicitPrelude ➖️\n- ImportQualifiedPost ✅\n- ImpredicativeTypes ➖️\n- IncoherentInstances ➖️\n- InstanceSigs ✅\n- InterruptibleFFI ✅\n- KindSignatures ✅\n- LambdaCase ✅\n- LexicalNegation ❌\n- LiberalTypeSynonyms ✅\n- LinearTypes ✅\n- ListTuplePuns ✅\n- MagicHash ✅\n- Modifiers ❌\n- MonadComprehensions ➖️\n- MonadFailDesugaring ➖️\n- MonoLocalBinds ➖️\n- MonomorphismRestriction ➖️\n- MultiParamTypeClasses ✅\n- MultiWayIf ✅\n- NamedFieldPuns ✅\n- NamedWildCards ✅\n- NegativeLiterals ➖️\n- NondecreasingIndentation ✅\n- NPlusKPatterns ➖️\n- NullaryTypeClasses ✅\n- NumDecimals ➖️\n- NumericUnderscores ✅\n- OverlappingInstances ➖️\n- OverloadedLabels ✅\n- OverloadedLists ➖️\n- OverloadedRecordDot ✅\n- OverloadedRecordUpdate ✅\n- OverloadedStrings ➖️\n- PackageImports ✅\n- ParallelListComp ✅\n- PartialTypeSignatures ✅\n- PatternGuards ✅\n- PatternSynonyms ✅\n- PolyKinds ➖️\n- PostfixOperators ➖️\n- QualifiedDo ✅\n- QuantifiedConstraints ✅\n- QuasiQuotes ✅\n- Rank2Types ✅\n- RankNTypes ✅\n- RebindableSyntax ➖️\n- RecordWildCards ➖️\n- RecursiveDo ✅\n- RequiredTypeArguments ✅\n- RoleAnnotations ✅\n- Safe ➖️\n- ScopedTypeVariables ✅\n- StandaloneDeriving ✅\n- StandaloneKindSignatures ✅\n- StarIsType ✅\n- StaticPointers ❌\n- Strict ➖️\n- StrictData ✅\n- TemplateHaskell ✅\n- TemplateHaskellQuotes ✅\n- TraditionalRecordSyntax ➖️\n- TransformListComp ✅\n- Trustworthy ➖️\n- TupleSections ✅\n- TypeAbstractions ✅\n- TypeApplications ✅\n- TypeData ✅\n- TypeFamilies ✅\n- TypeFamilyDependencies ✅\n- TypeInType ✅\n- TypeOperators ✅\n- TypeSynonymInstances ➖️\n- UnboxedSums ✅\n- UnboxedTuples ✅\n- UndecidableInstances ➖️\n- UndecidableSuperClasses ➖️\n- UnicodeSyntax ✅\n- UnliftedFFITypes ➖️\n- UnliftedNewtypes ✅\n- Unsafe ➖️\n- ViewPatterns ✅\n\n# Bugs\n\n## CPP\n\nPreprocessor `#elif` and `#else` directives cannot be handled correctly, since the parser state would have to be\nmanually reset to what it was at the `#if`.\nAs a workaround, the code blocks in the alternative branches are parsed as part of the directives.\n\n# Querying\n\nThe grammar contains several [supertypes](https://tree-sitter.github.io/tree-sitter/using-parsers#static-node-types),\nwhich group multiple other node types under a single name.\n\nSupertype names do not occur as extra nodes in parse trees, but they can be used in queries in special ways:\n\n- As an alias, matching any of their subtypes\n- As prefix for one of their subtypes, matching its symbol only when it occurs as a production of the supertype\n\nFor example, the query `(expression)` matches the nodes `infix`, `record`, `projection`, `constructor`, and the second\nand third `variable` in this tree for `cats <> Cat {mood = moods.sleepy}`:\n\n```\n(infix\n  (variable)\n  (operator)\n  (record\n    (constructor)\n    (field_update\n      (field_name (variable))\n      (projection (variable) (field_name (variable)))))))))\n```\n\nThe two occurrences of `variable` in `field_name` (`mood` and `sleepy`) are not expressions, but record field names part\nof a composite `record` expression.\n\nMatching `variable` nodes specifically that are expressions is possible with the second special form.\nA query for `(expression/variable)` will match only the other two, `cats` and `moods`.\n\nThe grammar's supertypes consist of the following sets:\n\n- [`expression`](./grammar/exp.js)\n\n  Rules that are valid in any expression position, excluding type applications, explicit types and expression\n  signatures.\n\n- [`pattern`](./grammar/pat.js)\n\n  Rules that are valid in any pattern position, excluding type binders, explicit types and pattern signatures.\n\n- [`type`](./grammar/type.js)\n\n  Types that are either atomic (have no ambiguous associativity, like bracketed constructs, variables and type\n  constructors), applied types or infix types.\n\n- [`quantified_type`](./grammar/type.js)\n\n  Types prefixed with a `forall`, context or function parameter.\n\n- [`constraint`](./grammar/constraint.js)\n\n  Almost the same rules as `type`, but mirrored for use in contexts.\n\n- [`constraints`](./grammar/constraints.js)\n\n  Analog of `quantified_type`, for constraints with `forall` or context.\n\n- [`type_param`](./grammar/type.js)\n\n  Atomic nodes in type and class heads, like the three nodes following `A` in `data A @k a (b :: k)`.\n\n- [`declaration`](./grammar/module.js)\n\n  All top-level declarations, like functions and data types.\n\n- [`decl`](./grammar/decl.js)\n\n  Shorthand for declarations that are also valid in local bindings (`let` and `where`) and in class and instance bodies,\n  except for fixity declarations.\n  Consists of `signature`, `function` and `bind`.\n\n- [`class_decl` and `instance_decl`](./grammar/class.js)\n\n  All declarations that are valid in classes and instances, which includes associated type and data families.\n\n- [`statement`](./grammar/exp.js)\n\n  Different forms of `do`-notation statements.\n\n- [`qualifier`](./grammar/exp.js)\n\n  Different forms of list comprehension qualifiers.\n\n- [`guard`](./grammar/exp.js)\n\n  Different forms of guards in function equations and case alternatives.\n\n# Development\n\nThe main driver for generating and testing the parser for this grammar is the [tree-sitter CLI][cli].\nOther components of the project require additional tools, described below.\n\nSome are made available through `npm` – for example, `npx tree-sitter` runs the CLI.\nIf you don't have `tree-sitter` available otherwise, prefix all the commands in the following sections with `npx`.\n\n## Output path\n\nThe CLI writes the shared library containing the parser to the directory denoted by `$TREE_SITTER_LIBDIR`.\nIf that variable is unset, it defaults to `$HOME/.cache/tree-sitter/lib`.\n\nIn order to avoid clobbering this global directory with development versions, you can set the env var to a local path:\n\n```\nexport TREE_SITTER_LIBDIR=$PWD/.lib\n```\n\n## The grammar\n\nThe javascript file `grammar.js` contains the entry point into the grammar's production rules.\nPlease consult the [tree-sitter documentation][grammar-docs] for a comprehensive introduction to the syntax and\nsemantics.\n\nParsing starts with the first item in the `rules` field:\n\n```javascript\n{\n  rules: {\n    haskell: $ => seq(\n      optional($.header),\n      optional($._body),\n    ),\n  }\n}\n```\n\n## Generating the parser\n\nThe first step in the development workflow converts the javascript rule definitions to C code in `src/parser.c`:\n\n```\n$ tree-sitter generate\n```\n\nTwo byproducts of this process are written to `src/grammar.json` and `src/node-types.json`.\n\n## Compiling the parser\n\nThe C code is automatically compiled by most of the test tools mentioned below, but you can instruct tree-sitter to do\nit in one go:\n\n```\n$ tree-sitter generate --build\n```\n\nIf you've set `$TREE_SITTER_LIBDIR` as mentioned above, the shared object will be written to `$PWD/.lib/haskell.so`.\n\nAside from the generated `src/parser.c`, tree-sitter will also compile and link `src/scanner.c` into this object.\nThis file contains the _external scanner_, which is a custom extension of the built-in lexer whose purpose is to handle\nlanguage constructs that cannot be expressed (efficiently) in the javascript grammar, like Haskell layouts.\n\n### WebAssembly\n\nThe parser can be compiled to WebAssembly as well, which requires `emscripten`:\n\n```\n$ tree-sitter build --wasm\n```\n\nThe resulting binary is written to `$PWD/tree-sitter-haskell.wasm`.\n\n## Testing the parser\n\nThe most fundamental test infrastructure for tree-sitter grammars consists of a set of code snippets with associated\nreference ASTs stored in `./test/corpus/*.txt`.\n\n```\n$ tree-sitter test\n```\n\nIndividual tests can be run by specifying (a substring of) their description with `-f`:\n\n```\n$ tree-sitter test -f 'module: exports empty'\n```\n\nThe project contains several other types of tests:\n\n- `test/parse/run.bash [update] [test names ...]` parses the files in `test/parse/*.hs` and compares the output with\n  `test/parse/*.target`.\n  If `update` is specified as the first argument, it will update the `.target` file for the first failing test.\n\n- `test/query/run.bash [update] [test names ...]` parses the files in `test/query/*.hs`, applies the queries in\n  `test/query/*.query` and compares the output with `test/query/*.target`, similar to `test/parse`.\n\n- `test/rust/parse-test.rs` contains a few tests that use tree-sitter's Rust API to extract the test ranges for\n  terminals in a slightly more convenient way.\n  This requires `cargo` to be installed, and can be executed with `cargo test` (which also runs the tests in\n  `bindings/rust`).\n\n- `test/parse-libs [wasm]` clones a set of Haskell libraries to `test/libs` and parses the entire codebase.\n  When invoked as `test/parse-libs wasm`, it will use the WebAssembly parser.\n  This requires `bc` to be installed.\n\n- `test/parse-lib name [wasm]` parses only the library `name` in that directory (without cloning the repository).\n\n### Debugging\n\nThe shared library built by `tree-sitter test` includes debug symbols, so if the scanner segfaults you can just run\n`coredumpctl debug` to inspect the backtrace and memory:\n\n```\nnewline_lookahead () at src/scanner.c:2583\n2583                ((Newline *) 0)->indent = 5;\n(gdb) bt\n#0  newline_lookahead () at src/scanner.c:2583\n#1  0x00007ffff7a0740e in newline_start () at src/scanner.c:2604\n#2  scan () at src/scanner.c:2646\n#3  eval () at src/scanner.c:2684\n#4  tree_sitter_haskell_external_scanner_scan (payload=<optimized out>, lexer=<optimized out>,\n    valid_symbols=<optimized out>) at src/scanner.c:2724\n#5  0x0000555555772488 in ts_parser.lex ()\n```\n\nFor more control, launch `gdb tree-sitter` and start the process with `run test -f 'some test'`, and set a breakpoint\nwith `break tree_sitter_haskell_external_scanner_scan`.\n\nTo disable optimizations, run `tree-sitter test --debug-build`.\n\n#### Tracing\n\nThe `test` and `parse` commands offer two modes for obtaining detailed information about the parsing process.\n\nWith `tree-sitter test --debug`, every lexer step and shift/reduce action is printed to stderr.\n\nWith `tree-sitter test --debug-graph`, the CLI will generate an HTML file showing a graph representation of every step.\nThis requires `graphviz` to be installed.\n\n[tree-sitter]: https://github.com/tree-sitter/tree-sitter\n[ref]: https://www.haskell.org/onlinereport/haskell2010/haskellch10.html\n[ext]: https://downloads.haskell.org/~ghc/latest/docs/html/users_guide/exts/table.html\n[cli]: https://github.com/tree-sitter/tree-sitter/tree/master/cli\n[grammar-docs]: https://tree-sitter.github.io/tree-sitter/creating-parsers#writing-the-grammar\n[ci]: https://img.shields.io/github/actions/workflow/status/tree-sitter/tree-sitter-haskell/ci.yml?logo=github&label=CI\n[discord]: https://img.shields.io/discord/1063097320771698699?logo=discord&label=discord\n[matrix]: https://img.shields.io/matrix/tree-sitter-chat%3Amatrix.org?logo=matrix&label=matrix\n[npm]: https://img.shields.io/npm/v/tree-sitter-haskell?logo=npm\n[crates]: https://img.shields.io/crates/v/tree-sitter-haskell?logo=rust\n[pypi]: https://img.shields.io/pypi/v/tree-sitter-haskell?logo=pypi&logoColor=ffd242\n"
  },
  {
    "path": "binding.gyp",
    "content": "{\n  \"targets\": [\n    {\n      \"target_name\": \"tree_sitter_haskell_binding\",\n      \"dependencies\": [\n        \"<!(node -p \\\"require('node-addon-api').targets\\\"):node_addon_api_except\",\n      ],\n      \"include_dirs\": [\n        \"src\",\n      ],\n      \"sources\": [\n        \"bindings/node/binding.cc\",\n        \"src/parser.c\",\n        \"src/scanner.c\",\n      ],\n      \"conditions\": [\n        [\"OS!='win'\", {\n          \"cflags_c\": [\n            \"-std=c11\",\n          ],\n        }, { # OS == \"win\"\n          \"cflags_c\": [\n            \"/std:c11\",\n            \"/utf-8\",\n          ],\n        }],\n      ],\n    }\n  ]\n}\n"
  },
  {
    "path": "bindings/c/tree-sitter-haskell.h",
    "content": "#ifndef TREE_SITTER_HASKELL_H_\n#define TREE_SITTER_HASKELL_H_\n\ntypedef struct TSLanguage TSLanguage;\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\nconst TSLanguage *tree_sitter_haskell(void);\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif // TREE_SITTER_HASKELL_H_\n"
  },
  {
    "path": "bindings/c/tree-sitter-haskell.pc.in",
    "content": "prefix=@CMAKE_INSTALL_PREFIX@\nlibdir=${prefix}/@CMAKE_INSTALL_LIBDIR@\nincludedir=${prefix}/@CMAKE_INSTALL_INCLUDEDIR@\n\nName: tree-sitter-haskell\nDescription: @PROJECT_DESCRIPTION@\nURL: @PROJECT_HOMEPAGE_URL@\nVersion: @PROJECT_VERSION@\nLibs: -L${libdir} -ltree-sitter-haskell\nCflags: -I${includedir}\n"
  },
  {
    "path": "bindings/go/binding.go",
    "content": "package tree_sitter_haskell\n\n// #cgo CFLAGS: -std=c11 -fPIC\n// #include \"../../src/parser.c\"\n// #include \"../../src/scanner.c\"\nimport \"C\"\n\nimport \"unsafe\"\n\n// Get the tree-sitter Language for this grammar.\nfunc Language() unsafe.Pointer {\n\treturn unsafe.Pointer(C.tree_sitter_haskell())\n}\n"
  },
  {
    "path": "bindings/go/binding_test.go",
    "content": "package tree_sitter_haskell_test\n\nimport (\n\t\"testing\"\n\n\ttree_sitter \"github.com/tree-sitter/go-tree-sitter\"\n\ttree_sitter_haskell \"github.com/tree-sitter/tree-sitter-haskell/bindings/go\"\n)\n\nfunc TestCanLoadGrammar(t *testing.T) {\n\tlanguage := tree_sitter.NewLanguage(tree_sitter_haskell.Language())\n\tif language == nil {\n\t\tt.Errorf(\"Error loading Haskell grammar\")\n\t}\n}\n"
  },
  {
    "path": "bindings/node/binding.cc",
    "content": "#include <napi.h>\n\ntypedef struct TSLanguage TSLanguage;\n\nextern \"C\" TSLanguage *tree_sitter_haskell();\n\n// \"tree-sitter\", \"language\" hashed with BLAKE2\nconst napi_type_tag LANGUAGE_TYPE_TAG = {\n    0x8AF2E5212AD58ABF, 0xD5006CAD83ABBA16\n};\n\nNapi::Object Init(Napi::Env env, Napi::Object exports) {\n    exports[\"name\"] = Napi::String::New(env, \"haskell\");\n    auto language = Napi::External<TSLanguage>::New(env, tree_sitter_haskell());\n    language.TypeTag(&LANGUAGE_TYPE_TAG);\n    exports[\"language\"] = language;\n    return exports;\n}\n\nNODE_API_MODULE(tree_sitter_haskell_binding, Init)\n"
  },
  {
    "path": "bindings/node/binding_test.js",
    "content": "const assert = require(\"node:assert\");\nconst { test } = require(\"node:test\");\n\nconst Parser = require(\"tree-sitter\");\n\ntest(\"can load grammar\", () => {\n  const parser = new Parser();\n  assert.doesNotThrow(() => parser.setLanguage(require(\".\")));\n});\n"
  },
  {
    "path": "bindings/node/index.d.ts",
    "content": "type BaseNode = {\n  type: string;\n  named: boolean;\n};\n\ntype ChildNode = {\n  multiple: boolean;\n  required: boolean;\n  types: BaseNode[];\n};\n\ntype NodeInfo =\n  | (BaseNode & {\n      subtypes: BaseNode[];\n    })\n  | (BaseNode & {\n      fields: { [name: string]: ChildNode };\n      children: ChildNode[];\n    });\n\ntype Language = {\n  name: string;\n  language: unknown;\n  nodeTypeInfo: NodeInfo[];\n};\n\ndeclare const language: Language;\nexport = language;\n"
  },
  {
    "path": "bindings/node/index.js",
    "content": "const root = require(\"path\").join(__dirname, \"..\", \"..\");\n\nmodule.exports =\n  typeof process.versions.bun === \"string\"\n    // Support `bun build --compile` by being statically analyzable enough to find the .node file at build-time\n    ? require(`../../prebuilds/${process.platform}-${process.arch}/tree-sitter-haskell.node`)\n    : require(\"node-gyp-build\")(root);\n\ntry {\n  module.exports.nodeTypeInfo = require(\"../../src/node-types.json\");\n} catch (_) {}\n"
  },
  {
    "path": "bindings/python/tests/test_binding.py",
    "content": "from unittest import TestCase\n\nimport tree_sitter, tree_sitter_haskell\n\n\nclass TestLanguage(TestCase):\n    def test_can_load_grammar(self):\n        try:\n            tree_sitter.Language(tree_sitter_haskell.language())\n        except Exception:\n            self.fail(\"Error loading Haskell grammar\")\n"
  },
  {
    "path": "bindings/python/tree_sitter_haskell/__init__.py",
    "content": "\"\"\"Haskell grammar for tree-sitter\"\"\"\n\nfrom importlib.resources import files as _files\n\nfrom ._binding import language\n\n\ndef _get_query(name, file):\n    query = _files(f\"{__package__}.queries\") / file\n    globals()[name] = query.read_text()\n    return globals()[name]\n\n\ndef __getattr__(name):\n    if name == \"HIGHLIGHTS_QUERY\":\n        return _get_query(\"HIGHLIGHTS_QUERY\", \"highlights.scm\")\n    if name == \"INJECTIONS_QUERY\":\n        return _get_query(\"INJECTIONS_QUERY\", \"injections.scm\")\n    if name == \"LOCALS_QUERY\":\n        return _get_query(\"LOCALS_QUERY\", \"locals.scm\")\n\n    raise AttributeError(f\"module {__name__!r} has no attribute {name!r}\")\n\n\n__all__ = [\n    \"language\",\n    \"HIGHLIGHTS_QUERY\",\n    \"INJECTIONS_QUERY\",\n    \"LOCALS_QUERY\",\n]\n\n\ndef __dir__():\n    return sorted(__all__ + [\n        \"__all__\", \"__builtins__\", \"__cached__\", \"__doc__\", \"__file__\",\n        \"__loader__\", \"__name__\", \"__package__\", \"__path__\", \"__spec__\",\n    ])\n"
  },
  {
    "path": "bindings/python/tree_sitter_haskell/__init__.pyi",
    "content": "from typing import Final\n\nHIGHLIGHTS_QUERY: Final[str]\nINJECTIONS_QUERY: Final[str]\nLOCALS_QUERY: Final[str]\n\ndef language() -> object: ...\n"
  },
  {
    "path": "bindings/python/tree_sitter_haskell/binding.c",
    "content": "#include <Python.h>\n\ntypedef struct TSLanguage TSLanguage;\n\nTSLanguage *tree_sitter_haskell(void);\n\nstatic PyObject* _binding_language(PyObject *Py_UNUSED(self), PyObject *Py_UNUSED(args)) {\n    return PyCapsule_New(tree_sitter_haskell(), \"tree_sitter.Language\", NULL);\n}\n\nstatic PyMethodDef methods[] = {\n    {\"language\", _binding_language, METH_NOARGS,\n     \"Get the tree-sitter language for this grammar.\"},\n    {NULL, NULL, 0, NULL}\n};\n\nstatic struct PyModuleDef module = {\n    .m_base = PyModuleDef_HEAD_INIT,\n    .m_name = \"_binding\",\n    .m_doc = NULL,\n    .m_size = -1,\n    .m_methods = methods\n};\n\nPyMODINIT_FUNC PyInit__binding(void) {\n    return PyModule_Create(&module);\n}\n"
  },
  {
    "path": "bindings/python/tree_sitter_haskell/py.typed",
    "content": ""
  },
  {
    "path": "bindings/rust/build.rs",
    "content": "fn main() {\n    let src_dir = std::path::Path::new(\"src\");\n\n    let mut c_config = cc::Build::new();\n    c_config\n        .std(\"c11\")\n        .include(src_dir)\n        .flag_if_supported(\"-Wno-unused-value\");\n\n    #[cfg(target_env = \"msvc\")]\n    c_config.flag(\"-utf-8\");\n\n    let parser_path = src_dir.join(\"parser.c\");\n    c_config.file(&parser_path);\n    println!(\"cargo:rerun-if-changed={}\", parser_path.to_str().unwrap());\n\n    let scanner_path = src_dir.join(\"scanner.c\");\n    c_config.file(&scanner_path);\n    println!(\"cargo:rerun-if-changed={}\", scanner_path.to_str().unwrap());\n\n    c_config.compile(\"tree-sitter-haskell\");\n}\n"
  },
  {
    "path": "bindings/rust/lib.rs",
    "content": "//! This crate provides Haskell language support for the [tree-sitter][] parsing library.\n//!\n//! Typically, you will use the [language][language func] function to add this language to a\n//! tree-sitter [Parser][], and then use the parser to parse some code:\n//!\n//! ```\n//! use tree_sitter::Parser;\n//!\n//! let code = r#\"\n//! main = putStrLn \"Hello World!\"\n//! \"#;\n//! let mut parser = Parser::new();\n//! let language = tree_sitter_haskell::LANGUAGE;\n//! parser\n//!     .set_language(&language.into())\n//!     .expect(\"Error loading Haskell parser\");\n//! let tree = parser.parse(code, None).unwrap();\n//! assert!(!tree.root_node().has_error());\n//! ```\n//!\n//! [Language]: https://docs.rs/tree-sitter/*/tree_sitter/struct.Language.html\n//! [language func]: fn.language.html\n//! [Parser]: https://docs.rs/tree-sitter/*/tree_sitter/struct.Parser.html\n//! [tree-sitter]: https://tree-sitter.github.io/\n\nuse tree_sitter_language::LanguageFn;\n\nextern \"C\" {\n    fn tree_sitter_haskell() -> *const ();\n}\n\n/// The tree-sitter [`LanguageFn`] for this grammar.\npub const LANGUAGE: LanguageFn = unsafe { LanguageFn::from_raw(tree_sitter_haskell) };\n\n/// The content of the [`node-types.json`][] file for this grammar.\n///\n/// [`node-types.json`]: https://tree-sitter.github.io/tree-sitter/using-parsers#static-node-types\npub const NODE_TYPES: &str = include_str!(\"../../src/node-types.json\");\n\n/// The syntax highlighting query for this language.\npub const HIGHLIGHTS_QUERY: &str = include_str!(\"../../queries/highlights.scm\");\n\n/// The syntax highlighting query for languages injected into this one.\npub const INJECTIONS_QUERY: &str = include_str!(\"../../queries/injections.scm\");\n\n/// The local-variable syntax highlighting query for this language.\npub const LOCALS_QUERY: &str = include_str!(\"../../queries/locals.scm\");\n\n#[cfg(test)]\nmod tests {\n    #[test]\n    fn test_can_load_grammar() {\n        let mut parser = tree_sitter::Parser::new();\n        parser\n            .set_language(&super::LANGUAGE.into())\n            .expect(\"Error loading Haskell parser\");\n    }\n}\n"
  },
  {
    "path": "bindings/swift/TreeSitterHaskell/haskell.h",
    "content": "#ifndef TREE_SITTER_HASKELL_H_\n#define TREE_SITTER_HASKELL_H_\n\ntypedef struct TSLanguage TSLanguage;\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\nconst TSLanguage *tree_sitter_haskell(void);\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif // TREE_SITTER_HASKELL_H_\n"
  },
  {
    "path": "bindings/swift/TreeSitterHaskellTests/TreeSitterHaskellTests.swift",
    "content": "import XCTest\nimport SwiftTreeSitter\nimport TreeSitterHaskell\n\nfinal class TreeSitterHaskellTests: XCTestCase {\n    func testCanLoadGrammar() throws {\n        let parser = Parser()\n        let language = Language(language: tree_sitter_haskell())\n        XCTAssertNoThrow(try parser.setLanguage(language),\n                         \"Error loading Haskell grammar\")\n    }\n}\n"
  },
  {
    "path": "examples/Basic.hs",
    "content": "a = 1\nb = 2\nc = 3\n"
  },
  {
    "path": "go.mod",
    "content": "module github.com/tree-sitter/tree-sitter-haskell\n\ngo 1.22\n\nrequire github.com/tree-sitter/go-tree-sitter v0.24.0\n\nrequire github.com/mattn/go-pointer v0.0.1 // indirect\n"
  },
  {
    "path": "go.sum",
    "content": "github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=\ngithub.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/mattn/go-pointer v0.0.1 h1:n+XhsuGeVO6MEAp7xyEukFINEa+Quek5psIR/ylA6o0=\ngithub.com/mattn/go-pointer v0.0.1/go.mod h1:2zXcozF6qYGgmsG+SeTZz3oAbFLdD3OWqnUbNvJZAlc=\ngithub.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=\ngithub.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=\ngithub.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=\ngithub.com/tree-sitter/go-tree-sitter v0.24.0 h1:kRZb6aBNfcI/u0Qh8XEt3zjNVnmxTisDBN+kXK0xRYQ=\ngithub.com/tree-sitter/go-tree-sitter v0.24.0/go.mod h1:x681iFVoLMEwOSIHA1chaLkXlroXEN7WY+VHGFaoDbk=\ngithub.com/tree-sitter/tree-sitter-c v0.21.5-0.20240818205408-927da1f210eb h1:A8425heRM8mylnv4H58FPUiH+aYivyitre0PzxrfmWs=\ngithub.com/tree-sitter/tree-sitter-c v0.21.5-0.20240818205408-927da1f210eb/go.mod h1:dOF6gtQiF9UwNh995T5OphYmtIypkjsp3ap7r9AN/iA=\ngithub.com/tree-sitter/tree-sitter-cpp v0.22.4-0.20240818224355-b1a4e2b25148 h1:AfFPZwtwGN01BW1jDdqBVqscTwetvMpydqYZz57RSlc=\ngithub.com/tree-sitter/tree-sitter-cpp v0.22.4-0.20240818224355-b1a4e2b25148/go.mod h1:Bh6U3viD57rFXRYIQ+kmiYtr+1Bx0AceypDLJJSyi9s=\ngithub.com/tree-sitter/tree-sitter-embedded-template v0.21.1-0.20240819044651-ffbf64942c33 h1:TwqSV3qLp3tKSqirGLRHnjFk9Tc2oy57LIl+FQ4GjI4=\ngithub.com/tree-sitter/tree-sitter-embedded-template v0.21.1-0.20240819044651-ffbf64942c33/go.mod h1:CvCKCt3v04Ufos1zZnNCelBDeCGRpPucaN8QczoUsN4=\ngithub.com/tree-sitter/tree-sitter-go v0.21.3-0.20240818010209-8c0f0e7a6012 h1:Xvxck3tE5FW7F7bTS97iNM2ADMyCMJztVqn5HYKdJGo=\ngithub.com/tree-sitter/tree-sitter-go v0.21.3-0.20240818010209-8c0f0e7a6012/go.mod h1:T40D0O1cPvUU/+AmiXVXy1cncYQT6wem4Z0g4SfAYvY=\ngithub.com/tree-sitter/tree-sitter-html v0.20.5-0.20240818004741-d11201a263d0 h1:c46K6uh5Dz00zJeU9BfjXdb8I+E4RkUdfnWJpQADXFo=\ngithub.com/tree-sitter/tree-sitter-html v0.20.5-0.20240818004741-d11201a263d0/go.mod h1:hcNt/kOJHcIcuMvouE7LJcYdeFUFbVpBJ6d4wmOA+tU=\ngithub.com/tree-sitter/tree-sitter-java v0.21.1-0.20240824015150-576d8097e495 h1:jrt4qbJVEFs4H93/ITxygHc6u0TGqAkkate7TQ4wFSA=\ngithub.com/tree-sitter/tree-sitter-java v0.21.1-0.20240824015150-576d8097e495/go.mod h1:oyaR7fLnRV0hT9z6qwE9GkaeTom/hTDwK3H2idcOJFc=\ngithub.com/tree-sitter/tree-sitter-javascript v0.21.5-0.20240818005344-15887341e5b5 h1:om4X9AVg3asL8gxNJDcz4e/Wp+VpQj1PY3uJXKr6EOg=\ngithub.com/tree-sitter/tree-sitter-javascript v0.21.5-0.20240818005344-15887341e5b5/go.mod h1:nNqgPoV/h9uYWk6kYEFdEAhNVOacpfpRW5SFmdaP4tU=\ngithub.com/tree-sitter/tree-sitter-json v0.21.1-0.20240818005659-bdd69eb8c8a5 h1:pfV3G3k7NCKqKk8THBmyuh2zA33lgYHS3GVrzRR8ry4=\ngithub.com/tree-sitter/tree-sitter-json v0.21.1-0.20240818005659-bdd69eb8c8a5/go.mod h1:GbMKRjLfk0H+PI7nLi1Sx5lHf5wCpLz9al8tQYSxpEk=\ngithub.com/tree-sitter/tree-sitter-php v0.22.9-0.20240819002312-a552625b56c1 h1:ZXZMDwE+IhUtGug4Brv6NjJWUU3rfkZBKpemf6RY8/g=\ngithub.com/tree-sitter/tree-sitter-php v0.22.9-0.20240819002312-a552625b56c1/go.mod h1:UKCLuYnJ312Mei+3cyTmGOHzn0YAnaPRECgJmHtzrqs=\ngithub.com/tree-sitter/tree-sitter-python v0.21.1-0.20240818005537-55a9b8a4fbfb h1:EXEM82lFM7JjJb6qiKZXkpIDaCcbV2obNn82ghwj9lw=\ngithub.com/tree-sitter/tree-sitter-python v0.21.1-0.20240818005537-55a9b8a4fbfb/go.mod h1:lXCF1nGG5Dr4J3BTS0ObN4xJCCICiSu/b+Xe/VqMV7g=\ngithub.com/tree-sitter/tree-sitter-ruby v0.21.1-0.20240818211811-7dbc1e2d0e2d h1:fcYCvoXdcP1uRQYXqJHRy6Hec+uKScQdKVtMwK9JeCI=\ngithub.com/tree-sitter/tree-sitter-ruby v0.21.1-0.20240818211811-7dbc1e2d0e2d/go.mod h1:T1nShQ4v5AJtozZ8YyAS4uzUtDAJj/iv4YfwXSbUHzg=\ngithub.com/tree-sitter/tree-sitter-rust v0.21.3-0.20240818005432-2b43eafe6447 h1:o9alBu1J/WjrcTKEthYtXmdkDc5OVXD+PqlvnEZ0Lzc=\ngithub.com/tree-sitter/tree-sitter-rust v0.21.3-0.20240818005432-2b43eafe6447/go.mod h1:1Oh95COkkTn6Ezp0vcMbvfhRP5gLeqqljR0BYnBzWvc=\ngopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=\ngopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\n"
  },
  {
    "path": "grammar/class.js",
    "content": "const {\n  sep1,\n  layout,\n  context,\n  forall,\n} = require('./util.js')\n\nmodule.exports = {\n\n  // ------------------------------------------------------------------------\n  // associated families\n  // ------------------------------------------------------------------------\n\n  /**\n   * In associated family declarations, result type aliasing without injectivity is invalid, since that syntax is taken\n   * by type instance declarations.\n   */\n  _assoc_tyfam: $ => seq(\n    'type',\n    optional('family'),\n    $._type_head,\n    optional(choice(\n      $._kind_annotation,\n      seq(\n        $.type_family_result,\n        $.type_family_injectivity,\n      ),\n    )),\n  ),\n\n  _assoc_tyinst: $ => seq(\n    'type',\n    optional('instance'),\n    forall($),\n    $._cond_assoc_tyinst,\n    $._type_instance_common,\n  ),\n\n  _assoc_datafam: $ => seq(\n    'data',\n    optional('family'),\n    $._datafam,\n  ),\n\n  _assoc_datainst_adt: $ => seq(\n    'data',\n    optional('instance'),\n    $._inst_adt,\n  ),\n\n  _assoc_datainst_newtype: $ => seq(\n    'newtype',\n    optional('instance'),\n    $._inst_newtype,\n  ),\n\n  _assoc_datainst: $ => choice(\n    alias($._assoc_datainst_adt, $.data_type),\n    alias($._assoc_datainst_newtype, $.newtype),\n  ),\n\n  // ------------------------------------------------------------------------\n  // class\n  // ------------------------------------------------------------------------\n\n  default_signature: $ => seq('default', field('signature', $.signature)),\n\n  /**\n   * Classes can have both type families and instances, but only data families.\n   */\n  class_decl: $ => choice(\n    $._local_decl,\n    $.default_signature,\n    alias($._assoc_tyfam, $.type_family),\n    alias($._assoc_tyinst, $.type_instance),\n    alias($._assoc_datafam, $.data_family),\n  ),\n\n  fundep: $ => seq(\n    field('matched', repeat1($.variable)),\n    $._arrow,\n    field('determined', repeat1($.variable)),\n  ),\n\n  fundeps: $ => seq($._bar, sep1(',', field('fundep', $.fundep))),\n\n  class_declarations: $ => layout($, field('declaration', $.class_decl)),\n\n  class: $ => seq(\n    'class',\n    context($),\n    $._type_head,\n    field('fundeps', optional($.fundeps)),\n    optional(seq($._where, optional(field('declarations', $.class_declarations)))),\n  ),\n\n  // ------------------------------------------------------------------------\n  // instance\n  // ------------------------------------------------------------------------\n\n  instance_decl: $ => choice(\n    $.decl,\n    alias($._assoc_datainst, $.data_instance),\n    alias($._assoc_tyinst, $.type_instance),\n  ),\n\n  instance_declarations: $ => layout($, field('declaration', $.instance_decl)),\n\n  /**\n   * instances only allow single foralls and contexts\n   */\n  _instance: $ => seq(\n    'instance',\n    forall($),\n    context($),\n    $._type_instance_head,\n  ),\n\n  instance: $ => seq(\n    $._instance,\n    optional(seq($._where, optional(field('declarations', $.instance_declarations)))),\n  ),\n\n  deriving_instance: $ => seq(\n    optional($._phantom_deriving),\n    'deriving',\n    optional(choice(field('strategy', $.deriving_strategy), field('via', $.via))),\n    $._instance,\n  ),\n}\n"
  },
  {
    "path": "grammar/conflicts.js",
    "content": "module.exports = {\n\n  conflicts: $ => [\n\n    /**\n     * For reference in GHC:\n     * - Note [Ambiguous syntactic categories]\n     * - Note [PatBuilder]\n     * - Note [Declaration/signature overlap]\n     * - These correspond to `DisambECP`\n     *\n     * (fun x) y = undefined\n     * (fun x -> y) = undefined\n     * (fun) <> x = undefined\n     *\n     * The first one is a regular function with some redundant parens, where `fun` is the declared name.\n     * The second one is a pattern binder with a view pattern, where `fun` is a free variable.\n     * The third one is an infix pattern binder, where `fun` is a simple varid pattern with redundant parens.\n     *\n     * These conflicts are also relevant for top-level expression splices, which fundamentally conflict with decls, and\n     * since decls start with either `var` or `pat`, they cannot be disambiguated.\n     *\n     * GHC parses functions and binds as expressions and sorts them into the right LHS in a post-processing step.\n     * Since this is not possible in tree-sitter, these conflicts are more function-centric than in GHC.\n     *\n     * function:\n     * func (A a) = a\n     *\n     * bind variable:\n     * a : as = [1, 2, 3]\n     *\n     * pattern bind infix:\n     * a : as = [1, 2, 3]\n     *\n     * pattern bind prefix:\n     * Just 1 = Just 1\n     *\n     * splice:\n     * makeLenses ''A\n     *\n     * Signature and bind:\n     *\n     * fun :: Int\n     * fun :: Int = 5\n     */\n\n    // Function vs bind\n    [$._function_name, $.pattern],\n\n    // Function vs bind vs splice\n    [$._function_name, $.pattern, $.expression],\n\n    // Bind vs splice\n    [$.pattern, $.expression],\n\n    // Signature vs bind\n    [$.signature, $.pattern],\n\n    /**\n     * Unboxed syntax\n     *\n     * The hash in the opening parenthesis of unboxed tuples can be an operator.\n     */\n    [$._operator_hash_head, $._unboxed_open],\n\n    /**\n     * Types conflicting with structures that look like types\n     *\n     * Note: These conflicts have been circumvented by a lookahead mechanism in the scanner.\n     * This comment is preserved for reference.\n     *\n     * `name` and `constructor` use the same terminal symbol, but we cannot reduce `constructor` in prefix data\n     * constructor declarations.\n     *\n     * In GHC, this corresponds to `DisambTD`.\n     *\n     * > data A = Name Int\n     * > data A = Maybe Int :+ Int\n     * > data A = Monoid a => A a\n     *\n     * All of these start with a `name` node.\n     * In the first example, the `name` is a data constructor, which will not be reduced to a `type`.\n     *\n     * In the second example, the `name` is a type constructor applied to another type in the left operand of an infix\n     * data constructor, so it must be reduced to `type`, and then to `apply` with the `Int`.\n     *\n     * In the third example, the `name` is a type constructor applied to a variable resulting in a constraint.\n     * It will be reduced the same way as the second example, but using the class tree, which is mostly identical to the\n     * type tree, but conflicts since we want to distinguish classes from types granularly.\n     *\n     * In GHC, these correspond to `mkHsAppTyHeadPV` and `mkHsAppTyPV`.\n     *\n     * > data A a b = a `C` b => a `A` b\n     * > data A a b = a `A` b\n     *\n     * > data a *** b\n     * > data a +++ b => a *** b\n     *\n     * In GHC, this corresponds to `mkHsOpTyPV`.\n     *\n     * > class A where type a + b = r | r -> a b\n     * > class A where type a + b = (a, b)\n     *\n     * The first one is a type family declaration, the second one an instance.\n     *\n     * These were the conflicts that have been turned into scanner lookahead:\n     *\n     * [$._type_con, $.data_constructor],\n     * [$._type_con, $._type_head_name],\n     * [$._type_variable, $._tyvar],\n     * [$._constructor_ticked, $._tycon_ticked],\n     */\n\n  ],\n\n}\n"
  },
  {
    "path": "grammar/context.js",
    "content": "const {\n  parens,\n  sep2,\n} = require('./util.js')\n\nmodule.exports = {\n\n  // ------------------------------------------------------------------------\n  // context\n  // ------------------------------------------------------------------------\n\n  _class_apply: $ => prec.left('apply', seq(\n    field('constructor', $.constraint),\n    field('argument', $._type_apply_arg),\n  )),\n\n  _class_infix: $ => prec.right('infix', seq(\n    $._cond_infix,\n    field('left_operand', $.type),\n    field('operator', $._tyops),\n    field('right_operand', $.type),\n  )),\n\n  _ctr_parens: $ => parens($, $.constraints),\n\n  _ctr_tuple: $ => parens($, sep2(',', $.constraints)),\n\n  /**\n   * Implicit parameters have an annotation with `::` but bind tighter than `_type_signature`, with the same precedence\n   * as foralls, contexts and arrows.\n   *\n   * > A => ?a :: A   | associates as |   A => (?a :: A)\n   * > ?a :: A -> A   | associates as |   ?a :: (A -> A)\n   */\n  implicit_parameter: $ => prec.left(seq(field('name', $.implicit_variable), $._type_annotation)),\n\n  constraint: $ => choice(\n    $._type_name,\n    alias($._class_infix, $.infix),\n    alias($._class_apply, $.apply),\n    alias($._ctr_parens, $.parens),\n    alias($._ctr_tuple, $.tuple),\n    alias($._type_wildcard, $.wildcard),\n    $._universal,\n  ),\n\n  _ctr_forall: $ => prec('fun', seq($._forall_body, '.', field('constraint', $.constraints))),\n\n  _ctr_context: $ => prec('fun', seq($._context_inline, field('constraint', $.constraints))),\n\n  _ctr_signature: $ => prec('annotated', seq(field('constraint', $.constraints), $._kind_annotation)),\n\n  constraints: $ => choice(\n    $.constraint,\n    alias($._ctr_context, $.context),\n    alias($._ctr_forall, $.forall),\n    $.implicit_parameter,\n    alias($._ctr_signature, $.signature),\n  ),\n\n  _context_inline: $ => seq(\n    $._cond_context,\n    field('context', $.constraint),\n    field('arrow', $._carrow),\n  ),\n\n  context: $ => prec('qtype-single', $._context_inline),\n\n}\n"
  },
  {
    "path": "grammar/data.js",
    "content": "const {\n  sep1,\n  sep,\n  braces,\n  layout,\n  unboxed_sum_single,\n  qualified,\n  context,\n  forall,\n} = require('./util.js')\n\nmodule.exports = {\n\n  // ------------------------------------------------------------------------\n  // fields\n  // ------------------------------------------------------------------------\n\n  field_name: $ => $.variable,\n  _qfield_name: $ => qualified($, $.field_name),\n  _field_names: $ => choice($.field_name, alias($._qfield_name, $.qualified)),\n\n  field_path: $ => seq(\n    field('field', $._field_names),\n    repeat1(seq($._tight_dot, field('subfield', $.field_name))),\n  ),\n\n  _field_spec: $ => choice(\n    $._field_names,\n    $.field_path,\n  ),\n\n  field: $ => prec('annotated', seq(\n    sep1(',', field('name', $.field_name)),\n    $._colon2,\n    field('type', $._parameter_type),\n  )),\n\n  _record_fields: $ => braces($, sep(',', field('field', $.field)), optional(',')),\n\n  // ------------------------------------------------------------------------\n  // deriving\n  // ------------------------------------------------------------------------\n\n  via: $ => seq('via', field('type', $.quantified_type)),\n\n  deriving_strategy: _ => choice('stock', 'newtype', 'anyclass'),\n\n  deriving: $ => seq(\n    optional($._phantom_deriving),\n    'deriving',\n    optional(field('strategy', $.deriving_strategy)),\n    field('classes', $.constraint),\n    optional(field('via', $.via)),\n  ),\n\n  // ------------------------------------------------------------------------\n  // gadt\n  // ------------------------------------------------------------------------\n\n  _gadt_con_prefix: $ => field('type', $.quantified_type),\n\n  _gadt_con_record: $ => seq(\n    field('fields', alias($._record_fields, $.fields)),\n    field('arrow', $._fun_arrow),\n    field('type', $.quantified_type),\n  ),\n\n  /**\n   * GADT constructors only allow single foralls and contexts\n   */\n  gadt_constructor: $ => seq(\n    choice(\n      field('name', $._con),\n      field('names', alias($._con_binding_list, $.binding_list)),\n    ),\n    $._colon2,\n    forall($),\n    context($),\n    field('type', choice(\n      alias($._gadt_con_prefix, $.prefix),\n      alias($._gadt_con_record, $.record),\n    )),\n  ),\n\n  gadt_constructors: $ => layout($, field('constructor', $.gadt_constructor)),\n\n  _gadt: $ => seq(\n    optional($._kind_annotation),\n    $._where,\n    optional(field('constructors', $.gadt_constructors)),\n  ),\n\n  // ------------------------------------------------------------------------\n  // data type\n  // ------------------------------------------------------------------------\n\n  _field_type: $ => choice($.strict_field, $.lazy_field, $.type),\n\n  _datacon_prefix: $ => seq(\n    field('name', $._con),\n    repeat(prec('patterns', field('field', $._field_type))),\n  ),\n\n  _datacon_infix: $ => prec('infix', seq(\n    $._cond_data_infix,\n    field('left_operand', $._field_type),\n    field('operator', $._conop),\n    field('right_operand', $._field_type),\n  )),\n\n  _datacon_record: $ => seq(\n    field('name', $._constructor),\n    field('fields', alias($._record_fields, $.fields)),\n  ),\n\n  _datacon_unboxed_sum: $ => unboxed_sum_single($, $.quantified_type),\n\n  /**\n   * Special constructors occurring in GHC code\n   */\n  _datacon_special: $ => choice(\n    $.unit,\n    $.unboxed_unit,\n    alias($._plist, $.empty_list),\n    alias($._type_tuple, $.tuple),\n    alias($._type_unboxed_tuple, $.unboxed_tuple),\n    alias($._datacon_unboxed_sum, $.unboxed_sum),\n  ),\n\n  /**\n   * data constructors only allow single foralls and contexts\n   */\n  data_constructor: $ => seq(\n    forall($),\n    context($),\n    field('constructor', choice(\n      alias($._datacon_prefix, $.prefix),\n      alias($._datacon_infix, $.infix),\n      alias($._datacon_record, $.record),\n      alias($._datacon_special, $.special),\n    )),\n  ),\n\n  data_constructors: $ => sep1($._bar, field('constructor', $.data_constructor)),\n\n  _data_rhs: $ => choice(\n    $._kind_annotation,\n    seq('=', field('constructors', $.data_constructors)),\n    $._gadt,\n  ),\n\n  _data: $ => seq(\n    context($),\n    $._type_head,\n    optional($._data_rhs),\n    repeat(field('deriving', $.deriving)),\n  ),\n\n  data_type: $ => seq(\n    optional('type'),\n    'data',\n    $._data,\n  ),\n\n  // ------------------------------------------------------------------------\n  // newtype\n  // ------------------------------------------------------------------------\n\n  _newtype_con_field: $ =>  $.type,\n\n  newtype_constructor: $ => seq(\n    field('name', $._con),\n    field('field', choice(\n      alias($._newtype_con_field, $.field),\n      alias($._record_fields, $.record),\n    )),\n  ),\n\n  _newtype: $ => seq(\n    choice(\n      seq('=', field('constructor', $.newtype_constructor)),\n      $._gadt,\n    ),\n    repeat(field('deriving', $.deriving)),\n  ),\n\n  newtype: $ => seq(\n    'newtype',\n    context($),\n    $._type_head,\n    $._newtype,\n  ),\n\n  // ------------------------------------------------------------------------\n  // data family\n  // ------------------------------------------------------------------------\n\n  _datafam: $ => seq(\n    $._type_head,\n    optional($._kind_annotation),\n  ),\n\n  data_family: $ => seq(\n    'data',\n    'family',\n    $._datafam,\n  ),\n\n  _inst_adt: $ => seq(\n    forall($),\n    context($),\n    $._type_instance_head,\n    optional($._data_rhs),\n    repeat(field('deriving', $.deriving)),\n  ),\n\n  decl_inst_adt: $ => seq(\n    'data',\n    'instance',\n    $._inst_adt,\n  ),\n\n  _inst_newtype: $ => seq(\n    forall($),\n    context($),\n    $._type_instance_head,\n    $._newtype,\n  ),\n\n  decl_inst_newtype: $ => seq(\n    'newtype',\n    'instance',\n    $._inst_newtype,\n  ),\n\n  data_instance: $ => choice(\n    alias($.decl_inst_adt, $.data_type),\n    alias($.decl_inst_newtype, $.newtype),\n  ),\n\n}\n"
  },
  {
    "path": "grammar/decl.js",
    "content": "const {\n  sep1,\n  sep2,\n  parens,\n  layout,\n} = require('./util.js')\n\nmodule.exports = {\n\n  // ------------------------------------------------------------------------\n  // fixity\n  // ------------------------------------------------------------------------\n\n  _fun_arrow_prec: _ => seq('-', '1'),\n\n  // GHC.Types special decl\n  _fun_arrow_fixity: $ => seq(\n    field('associativity', 'infixr'),\n    field('precedence', alias($._fun_arrow_prec, $.integer)),\n    field('operator', alias('->', $.operator)),\n  ),\n\n  fixity: $ => choice(\n    $._fun_arrow_fixity,\n    seq(\n      field('associativity', choice('infixl', 'infixr', 'infix')),\n      field('precedence', optional($.integer)),\n      field('operator', sep1(',', choice($._operator_minus, $._varop, $._conop))),\n    ),\n  ),\n\n  // ------------------------------------------------------------------------\n  // signature\n  // ------------------------------------------------------------------------\n\n  _con_binding_list: $ => sep2(',', field('name', $._con)),\n\n  _var_binding_list: $ => sep2(',', field('name', $._var)),\n\n  signature: $ => seq(\n    choice(\n      field('name', $._var),\n      field('names', alias($._var_binding_list, $.binding_list)),\n    ),\n    $._type_annotation,\n  ),\n\n  // ------------------------------------------------------------------------\n  // function and pattern bind\n  // ------------------------------------------------------------------------\n\n  _simple_bind_match: $ => seq('=', field('expression', $._exp)),\n\n  _bind_match: $ => seq(\n    $._guards,\n    '=',\n    $._cmd_texp_end,\n    field('expression', $._exp),\n  ),\n\n  _bind_matches: $ => seq(\n    choice(\n      field('match', alias($._simple_bind_match, $.match)),\n      repeat1(field('match', alias($._bind_match, $.match))),\n    ),\n    optional($._where_binds),\n  ),\n\n  _function_name: $ => field('name', $._var),\n\n  function_head_parens: $ => parens(\n    $,\n    choice(\n      $._function_head,\n      $._function_head_patterns,\n    ),\n  ),\n\n  _function_head_patterns: $ => choice(\n    $._function_name,\n    field('parens', $.function_head_parens),\n  ),\n\n  /**\n   * The difference between a `function` with an `infix` head and a `bind` with `pat_infix` is that the former is for\n   * _declaring_ a `varop` and the latter uses a `conop` to pattern match on the rhs expression.\n   * The former may not have a type annotation, while the latter may.\n   *\n   * > a <> b = undefined\n   * > h : t :: [Int] = undefined\n   */\n  _function_head_infix: $ => seq(\n    field('left_operand', $.pattern),\n    optional($._cond_no_section_op),\n    field('operator', choice(seq($._cond_minus, $._operator_minus), $._varop)),\n    field('right_operand', $.pattern),\n  ),\n\n  _function_head: $ => choice(\n    seq($._function_head_patterns, field('patterns', $.patterns)),\n    alias($._function_head_infix, $.infix),\n  ),\n\n  function: $ => seq(\n    $._function_head,\n    $._bind_matches,\n  ),\n\n  /**\n   * The `implicit_variable` here is for:\n   * g = let ?par = Impy 5 in f\n   */\n  bind: $ => prec('bind', seq(\n    choice(\n      field('pattern', $._pat),\n      field('name', $._var),\n      field('implicit', $.implicit_variable),\n    ),\n    $._bind_matches,\n  )),\n\n  /**\n   * This is a supertype.\n   */\n  decl: $ => choice(\n    $.signature,\n    $.function,\n    $.bind,\n  ),\n\n  _local_decl: $ => choice(\n    $.fixity,\n    $.decl,\n  ),\n\n  local_binds: $ => layout($, field('decl', $._local_decl)),\n\n  _where_binds: $ => seq($._where, optional(field('binds', $.local_binds))),\n\n  // ------------------------------------------------------------------------\n  // foreign\n  // ------------------------------------------------------------------------\n\n  calling_convention: _ => token(choice(\n    'ccall',\n    'stdcall',\n    'capi',\n    'prim',\n    'javascript',\n    /[A-Z_]+/, // It's common in GHC to use a cpp #define for this\n  )),\n\n  safety: _ => token(choice(\n    'unsafe',\n    'safe',\n    'interruptible',\n  )),\n\n  entity: $ => $.string,\n\n  foreign_import: $ => seq(\n    'foreign',\n    'import',\n    field('calling_convention', $.calling_convention),\n    optional(field('safety', $.safety)),\n    optional(field('entity', $.entity)),\n    field('signature', $.signature),\n  ),\n\n  foreign_export: $ => seq(\n    'foreign',\n    'export',\n    field('calling_convention', $.calling_convention),\n    optional(field('entity', $.entity)),\n    field('signature', $.signature),\n  ),\n\n  // ------------------------------------------------------------------------\n  // default\n  // ------------------------------------------------------------------------\n\n  default_types: $ => seq('default', parens($, optional(sep1(',', field('type', $._ktype))))),\n\n}\n"
  },
  {
    "path": "grammar/exp.js",
    "content": "const {\n  sep1,\n  sep,\n  parens,\n  braces,\n  brackets,\n  layout_sort,\n  layout,\n  unboxed_tuple_nonempty,\n  unboxed_sum_single,\n  qualified,\n} = require('./util.js')\n\nmodule.exports = {\n\n  // ------------------------------------------------------------------------\n  // names\n  // ------------------------------------------------------------------------\n\n  _exp_name: $ => choice(\n    $._cons,\n    $._vars,\n    $.variable,\n    $.implicit_variable,\n    $.label,\n  ),\n\n  _exp_th_quoted_name: $ => choice(\n    seq('\\'', field('name', choice($._vars, $._cons))),\n    prec('prefix', seq('\\'\\'', field('type', $.type))),\n  ),\n\n  // ------------------------------------------------------------------------\n  // tuples and parens\n  // ------------------------------------------------------------------------\n\n  _exp_parens: $ => parens($, field('expression', $._exp)),\n\n  // Having this separate reduces size by ~15kB\n  _exp_tuple_elems: $ => seq(\n    choice(\n      seq(repeat1(','), field('element', $._exp)),\n      seq(field('element', $._exp), ',', optional(field('element', $._exp))),\n    ),\n    repeat(seq(',', optional(field('element', $._exp))))\n  ),\n\n  /**\n    * This needs to be disambiguated from `prefix_tuple`, which is a constructor with _only_ commas.\n    * Tuple sections aren't allowed in patterns.\n    *\n    * Since tuple expressions can contain singular expressions in sections like `(a,)` and `(,a)`, it has to be ensured\n    * that there is _at least_ each one comma and one expression in there, but the comma may be on either side and be\n    * preceded by any number of further commas, like `(,,,a)`.\n    *\n    * The final `repeat` is simpler, it just has to ensure that no two `_exp`s can be successive, but this encoding\n    * means that the optional `_exp` after `(5,)` needs to be included in the `choice`, otherwise a simple pair\n    * would be impossible.\n    */\n  _exp_tuple: $ => parens($, $._exp_tuple_elems),\n\n  /**\n   * Unlike their boxed variants, unboxed tuples may be nullary and unary, making it simpler to parse them.\n   */\n  _exp_unboxed_tuple: $ => unboxed_tuple_nonempty($, $._exp),\n\n  /**\n   * Unboxed sums must have at least one separating `|`, otherwise the expression would be a unary or nullary tuple.\n   * This is a lenient parser that allows multiple variants to be filled in, for simplicity.\n   */\n  _exp_unboxed_sum: $ => unboxed_sum_single($, $._exp),\n\n  // ------------------------------------------------------------------------\n  // lists\n  // ------------------------------------------------------------------------\n\n  _exp_list: $ => brackets($, sep1(',', field('element', $._exp)), optional(',')),\n\n  /**\n    * An expression like `[1,2..20]`.\n    */\n  _exp_arithmetic_sequence: $ => brackets(\n    $,\n    field('from', $._exp),\n    optional(seq(',', field('step', $._exp))),\n    $._dotdot,\n    optional(field('to', $._exp)),\n  ),\n\n  /**\n   * `TransformListComp`, group style.\n   *\n   * Inlining `_exp` here is necessary to avoid a conflict.\n   */\n  group: $ => seq(\n    'then',\n    'group',\n    optional(seq('by', field('key', choice(alias($._exp_signature, $.signature), $.expression)))),\n    'using',\n    field('classifier', $._exp),\n  ),\n\n  /**\n   * `TransformListComp`, simple transformation style.\n   */\n  transform: $ => seq(\n    'then',\n    field('transformation', $._exp),\n    optional(seq('by', field('key', $._exp))),\n  ),\n\n  qualifier: $ => choice(\n    $.generator,\n    $.let,\n    $.transform,\n    $.group,\n    alias($._exp, $.boolean),\n  ),\n\n  /**\n   * This is a supertype.\n   */\n  qualifiers: $ => seq(sep1(',', field('qualifier', $.qualifier))),\n\n  _exp_list_comprehension: $ => brackets(\n    $,\n    field('expression', $._exp),\n    repeat1(seq('|', field('qualifiers', $.qualifiers))),\n  ),\n\n  // ------------------------------------------------------------------------\n  // greedy block args\n  // ------------------------------------------------------------------------\n\n  _exp_lambda: $ => seq(\n    '\\\\',\n    field('patterns', $.patterns),\n    $._arrow,\n    field('expression', $._exp),\n  ),\n\n  _exp_let_in: $ => seq($._let, optional($._phantom_in), 'in', field('expression', $._exp)),\n\n  _exp_conditional: $ => seq(\n    'if',\n    field('if', $._exp),\n    repeat(';'),\n    'then',\n    field('then', $._exp),\n    repeat(';'),\n    'else',\n    field('else', $._exp),\n  ),\n\n  /**\n   * These block arguments don't end in a layout, so they all range over all following block arguments and will\n   * therefore always be the last argument in an application or infix chain.\n   * They also pull a trailing type annotation into their body.\n   */\n  _exp_greedy: $ => choice(\n    alias($._exp_lambda, $.lambda),\n    alias($._exp_let_in, $.let_in),\n    alias($._exp_conditional, $.conditional),\n  ),\n\n  // ------------------------------------------------------------------------\n  // do\n  // ------------------------------------------------------------------------\n\n  _exp_statement: $ => $._exp,\n\n  /**\n   * This is a supertype.\n   */\n  statement: $ => choice(\n    alias($._exp_statement, $.exp),\n    alias($.generator, $.bind),\n    $.let,\n    $.rec,\n  ),\n\n  _statements: $ => layout_sort($, $._cmd_layout_start_do, field('statement', $.statement)),\n\n  rec: $ => seq('rec', $._statements),\n\n  _do_keyword: _ => choice('mdo', 'do'),\n\n  do_module: $ => field('qualified_do', qualified($, $._do_keyword)),\n\n  _do: $ => choice(\n    $.do_module,\n    $._do_keyword\n  ),\n\n  _exp_do: $ => seq($._do, $._statements),\n\n  // ------------------------------------------------------------------------\n  // case\n  // ------------------------------------------------------------------------\n\n  match: $ => seq(\n    $._guards,\n    optional($._phantom_arrow),\n    $._arrow,\n    $._cmd_texp_end,\n    field('expression', $._exp),\n  ),\n\n  _simple_match: $ => seq($._arrow, field('expression', $._exp)),\n\n  _matches: $ => field('match', choice(\n    alias($._simple_match, $.match),\n    repeat1($.match),\n  )),\n\n  alternative: $ => seq(\n    field('pattern', $._pat),\n    $._matches,\n    optional($._where_binds),\n  ),\n\n  _nalt: $ => seq(\n    field('patterns', $.patterns),\n    $._matches,\n    optional($._where_binds),\n  ),\n\n  alternatives: $ => layout_sort($, $._cmd_layout_start_case, field('alternative', $.alternative)),\n  _nalts: $ => layout_sort($, $._cmd_layout_start_case, field('alternative', alias($._nalt, $.alternative))),\n\n  _exp_case: $ => seq('case', $._exp, 'of', optional(field('alternatives', $.alternatives))),\n\n  _exp_lambda_case: $ => seq(\n    '\\\\',\n    'case',\n    optional(field('alternatives', $.alternatives)),\n  ),\n\n  /**\n   * alternatives are not optional in a `\\cases` expression, but we're lenient.\n   */\n  _exp_lambda_cases: $ => seq(\n    '\\\\',\n    'cases',\n    optional(field('alternatives', alias($._nalts, $.alternatives))),\n  ),\n\n  _exp_multi_way_if: $ => seq(\n    'if',\n    $._cmd_layout_start_if,\n    repeat(field('match', $.match)),\n    $._cond_layout_end,\n  ),\n\n  // ------------------------------------------------------------------------\n  // record\n  // ------------------------------------------------------------------------\n\n  field_update: $ => choice(\n    alias('..', $.wildcard),\n    seq(\n      field('field', $._field_spec),\n      optional(seq('=', field('expression', $._exp)))\n    ),\n  ),\n\n  _exp_record: $ => prec('record', seq(\n    field('expression', $.expression),\n    braces($, sep(',', field('field', $.field_update)))),\n  ),\n\n  _exp_projection_selector: $ => parens(\n    $,\n    $._any_prefix_dot,\n    field('field', $.variable),\n    repeat(seq($._tight_dot, field('field', $.variable))),\n  ),\n\n  /**\n   * A dot-syntax field projection like `var.name.othername`.\n   */\n  _exp_projection: $ => seq(\n    prec('projection', seq(\n      field('expression', $.expression),\n      $._tight_dot,\n    )),\n    field('field', $.field_name),\n  ),\n\n  // ------------------------------------------------------------------------\n  // application\n  // ------------------------------------------------------------------------\n\n  explicit_type: $ => parens($, 'type', field('type', $.type)),\n\n  _exp_apply: $ => prec.left('apply', seq(\n    field('function', $.expression),\n    field('argument', choice(\n      $.expression,\n      alias($._at_type, $.type_application),\n      $.explicit_type,\n    )),\n  )),\n\n  // ------------------------------------------------------------------------\n  // operators\n  // ------------------------------------------------------------------------\n\n  _exp_op: $ => choice(\n    $._sym,\n    $._op_ticked,\n    alias($._prefix_dot, $.operator),\n  ),\n\n  _exp_section_left: $ => parens(\n    $,\n    field('left_operand', $.expression),\n    $._cond_left_section_op,\n    field('operator', choice(\n      $._exp_op,\n      $._operator_minus,\n      $._qsym,\n    )),\n  ),\n\n  _exp_section_right: $ => parens(\n    $,\n    choice(\n      alias($._operator_qual_dot_head, $.operator),\n      $._ops,\n    ),\n    field('right_operand', $.expression),\n  ),\n\n  _exp_negation: $ => seq(\n    field('minus', '-'),\n    prec('negation', field('expression', $.expression)),\n  ),\n\n  /**\n   * Infix expressions have severe conflicts with several structures:\n   *\n   * - Negation is supposed to bind less tight than application and tighter than infix, which requires an unsolvable\n   *   precedence configuration\n   * - Qualified operators cannot be identified with single-token lookahead, which causes ambiguity with function\n   *   application\n   * - Left operator sections require infix expressions in their operand to reduce before the section operator, but\n   *   single-token lookahead also makes this decision impossible\n   *\n   * All of these are solved with external symbols.\n   * Consult `grammar/externals.js` for more information.\n   */\n  _exp_infix: $ => prec.right('infix', seq(\n    field('left_operand', $.expression),\n    optional($._cond_no_section_op),\n    field('operator', choice(\n      seq($._cond_minus, $._operator_minus),\n      $._exp_op,\n      seq($._cond_qualified_op, $._qsym),\n    )),\n    field('right_operand', $.expression),\n  )),\n\n  // ------------------------------------------------------------------------\n  // top level\n  // ------------------------------------------------------------------------\n\n  /**\n   * This is a supertype.\n   */\n  expression: $ => choice(\n    alias($._exp_infix, $.infix),\n    alias($._exp_negation, $.negation),\n    alias($._exp_apply, $.apply),\n    alias($._exp_record, $.record),\n    alias($._exp_projection, $.projection),\n    alias($._exp_arithmetic_sequence, $.arithmetic_sequence),\n    alias($._exp_list_comprehension, $.list_comprehension),\n    alias($._exp_unboxed_tuple, $.unboxed_tuple),\n    alias($._exp_unboxed_sum, $.unboxed_sum),\n    alias($._exp_projection_selector, $.projection_selector),\n    alias($._exp_quote, $.quote),\n    alias($._exp_typed_quote, $.typed_quote),\n    alias($._exp_th_quoted_name, $.th_quoted_name),\n    alias($._exp_lambda_case, $.lambda_case),\n    alias($._exp_lambda_cases, $.lambda_cases),\n    alias($._exp_do, $.do),\n    alias($._exp_parens, $.parens),\n    alias($._exp_tuple, $.tuple),\n    alias($._exp_list, $.list),\n    // Not using a name like \"empty list\" here because it's only really special in types.\n    alias($._plist, $.list),\n    alias($._exp_section_left, $.left_section),\n    alias($._exp_section_right, $.right_section),\n    $._exp_greedy,\n    alias($._exp_case, $.case),\n    alias($._exp_multi_way_if, $.multi_way_if),\n    $._exp_name,\n    $._universal,\n  ),\n\n  _exp_signature: $ => prec.right('annotated', seq(\n    field('expression', $.expression),\n    $._type_annotation,\n  )),\n\n  _exp: $ => choice(\n    alias($._exp_signature, $.signature),\n    // Right-associative means that the reduction of `expression` to `_exp` loses against any shift.\n    prec.right($.expression),\n  ),\n\n}\n"
  },
  {
    "path": "grammar/externals.js",
    "content": "module.exports = {\n\n  /**\n   * These rules are handled manually by the custom lexer in `src/scanner.c`.\n   * Whenever the symbols are used in the rule tree, the parser executes the scanner.\n   * Since several symbols are present both here and in `extras`, the scanner will be invoked before every single\n   * natively lexed symbol, repeatedly, until it fails.\n   * This makes indentation/layout tracking simpler.\n   *\n   * There are three special behavioral classes of symbols in this grammar, indicated by their name prefix:\n   *\n   * `cmd`: Commands are sequenced after key tokens like opening braces that unconditionally trigger a state change in\n   *        the scanner.\n   *        They don't require the scanner to _decide_ that a symbol is valid – the native parser has already committed\n   *        to a symbol, and the command relays that information to the scanner so it can update its state and return.\n   *        For example, after having parsed an opening brace, the scanner adds a brace context to the stack in reaction\n   *        to `_cond_brace_open`, which will influence its future behavior.\n   *        These symbols do not produce nodes in the parse tree.\n   *\n   * `cond`: Conditions are hard requirements in the grammar that are decided by the scanner based on its state and the\n   *         lookahead.\n   *         For example, whitespace-sensitive operators (tight infix /prefix ops) like the `@` in a type application or\n   *         the `.` in a record projection are lexed when the following characters have certain properties.\n   *         When the scanner decides that such a symbol is valid, the parser cannot attempt to use an alternative\n   *         interpretation like it can with conflicts.\n   *         This is often difficult, but also especially useful to force declarations and other layout items to be\n   *         terminated when a new line has smaller or equal indent, preventing incorrect interpretations as top level\n   *         expression splices spanning multiple lines.\n   *\n   * `phantom`: Phantom symbols are used to signal to the scanner that certain constructs are valid without requiring\n   *            the scanner to actually parse them and produce text nodes for them.\n   *            In the grammar, they are always optional, and the scanner never emits the phantom symbol itself, but\n   *            decides whether to emit _other_ symbols when the phantom symbol is _not_ valid.\n   *            This is used to implement GHC's tactic of allowing layouts to end _whenever a parse error occurs_, but\n   *            using specialized heuristics.\n   *\n   * Most other symbols produce nodes, except for newline and the error sentinel.\n   */\n  externals: $ => [\n\n    // This is an unused symbol that indicates to the scanner that a parse error has occurred.\n    // Tree-sitter marks _all_ symbols as valid when calling the scanner after an error, so a symbol that's not used in\n    // the grammar is only valid if that is the case.\n    $.error_sentinel,\n\n    // Emitted after every newline with equal or less indent to terminate layout-based rules, with a few exceptions.\n    $._cond_layout_semicolon,\n\n    // Instruct the scanner to push a layout context.\n    // The first one is for declarations and miscellaneous other layouts.\n    // The others are for the specific syntax construct.\n    // The quote layout is for declaration quotes (`[d|data A ...|]`).\n    $._cmd_layout_start,\n    $._cmd_layout_start_do,\n    $._cmd_layout_start_case,\n    $._cmd_layout_start_if,\n    $._cmd_layout_start_let,\n    $._cmd_layout_start_quote,\n    // This variant is used in a `choice` with the others, and serves only to create a terminal node for explicit\n    // braces.\n    // If the scanner emitted the same symbol for virtual and explicit braces, we would either get an anonymous node\n    // ranging over the brace, or a terminal brace node even for virtual starts if we were to alias the symbol to '{'\n    // unconditionally.\n    // So we use separate symbols and alias only this one.\n    // The same reasoning applies to `_cond_layout_end_explicit`.\n    // The terminal could be ensured in different ways – adding an `optional('{')` after the start symbol, using\n    // `seq($._cmd_layout_start_explicit, '{')` instead of including the brace in the scanner range, or branching the\n    // entire layout on the start token to unconditionally use `_cmd_brace_close` instead of\n    // `_cond_layout_end_explicit`.\n    // However, these solutions are all very expensive, adding between 500 and 1000kB to the shared object size, and up\n    // to a second in generation time.\n    $._cmd_layout_start_explicit,\n\n    // Emitted when a new line's indent mandates ending the current layout (depending on the layout sort), or when a\n    // special inline layout-ending token is encountered, like an `in`.\n    $._cond_layout_end,\n    $._cond_layout_end_explicit,\n\n    // Instruct the scanner to push or pop a brace context.\n    $._cmd_brace_open,\n    $._cmd_brace_close,\n\n    // Instruct the scanner to push or pop a tuple expression context.\n    // In parenthesized or bracketed expressions, certain tokens (like commas, bars, and closing brackets), can end\n    // layouts, so the scanner must be aware of them.\n    $._cmd_texp_start,\n    $._cmd_texp_end,\n\n    // Signal to the scanner that these symbols are valid.\n    // See the explanation of phantom symbols above.\n    $._phantom_where,\n    $._phantom_in,\n    $._phantom_arrow,\n    $._phantom_bar,\n    $._phantom_deriving,\n\n    // Detect and emit text nodes for comments and CPP.\n    // In particular, #else branches of CPP conditionals a fully contained in the resulting node, since their nonlinear\n    // nature means they cannot be parsed.\n    $.comment,\n    $.haddock,\n    $.cpp,\n    $.pragma,\n\n    // Starting quote brackets are a bit messy, so it's easier to let the scanner signal that it encountered one.\n    // The body produces a text node until the ending bracket.\n    $._cond_quote_start,\n    $.quasiquote_body,\n\n    // Whitespace-sensitive operators for splices (`$`, `$$`), projection and module dots (`a.b`, `A.b`), arithmetic\n    // sequence dots `[1..10]`, as-pattern (`a@(Just b)`), type application (`@Int`), strictness and laziness\n    // annotations (`!pat`, `~Int`), and modifiers (`Int %1 -> Int`).\n    $._cond_splice,\n    $._cond_qual_dot,\n    $._cond_tight_dot,\n    $._cond_prefix_dot,\n    $._cond_dotdot,\n    $._cond_tight_at,\n    $._cond_prefix_at,\n    $._cond_tight_bang,\n    $._cond_prefix_bang,\n    $._cond_tight_tilde,\n    $._cond_prefix_tilde,\n    $._cond_prefix_percent,\n\n    // GHC lexes all qualified names as atomic tokens, but we can't do that because we need nodes for their\n    // substructures.\n    // However, infix expressions need single-token lookahead for the operator to resolve conflicts, which is\n    // impossible without an external.\n    // This symbol detects a qualified symbolic operator.\n    $._cond_qualified_op,\n    // This one performs an additional lookahead check for a following closing parenthesis, to disambiguate left\n    // sections from infix ops in `(a - b +)`.\n    $._cond_left_section_op,\n    // This is an auxiliary for `_cond_left_section_op` that allows restarting the scanner without that symbol being\n    // valid again when whitespace was skipped after a symop to discover that there's no parenthesis.\n    // Without this, we would get wrong token ranges for the operator.\n    $._cond_no_section_op,\n\n    // This symbol always succeeds when a minus is ahead.\n    // Infix expressions with minus as the operator conflict with function application.\n    // `a - b` can be parsed as `a (- b)`, which would normally be solved by a simple precedence entry, but is\n    // impossible to express because it contradicts another conflict: Negation in the left operand, `- a + b`, which\n    // must be parsed as `(- a) + b`.\n    // Simply sequencing this external before the operator solves this conflict, because a minus following an expression\n    // can never be negation; it can only occur at the beginning of an expression.\n    $._cond_minus,\n\n    /**\n     * The following symbols perform lookahead for various type constructs to resolve conflicts between infix types,\n     * contexts, and type/datacon heads, because using GLR conflicts for these is very brittle and frequently leads to\n     * misparsed trees.\n     *\n     * See the documentation under 'Constraints' in `src/scanner.c` for more.\n     */\n    $._cond_context,\n    $._cond_infix,\n    $._cond_data_infix,\n    $._cond_assoc_tyinst,\n\n    // Symbolic operators, producing text nodes.\n    // These are very difficult to parse in the grammar, because unlike most languages, Haskell's operators are not a\n    // finite set, and therefore cannot be lexically disambiguated from special operators like `->`.\n    // In the presence of runtime conflicts, this can easily lead to the invalid interpretation of reserved operators as\n    // identifiers.\n    // Furthermore, the regexes for all the unicode categories produce very large ternary operator trees if specified\n    // in the grammar.\n    $._varsym,\n    $._consym,\n\n    // The newline is used as a dummy symbol that is emitted whenever the scanner has to update its state even though\n    // the current position must be parsed by the grammar.\n    /\\n/,\n\n  ],\n\n}\n"
  },
  {
    "path": "grammar/general.js",
    "content": "const {\n  sep1,\n  layout_sort,\n} = require('./util.js')\n\nmodule.exports = {\n\n  // ------------------------------------------------------------------------\n  // guard\n  // ------------------------------------------------------------------------\n\n  generator: $ => seq(\n    field('pattern', $._pat),\n    field('arrow', $._larrow),\n    field('expression', $._exp),\n  ),\n\n  _let_binds: $ => layout_sort($, $._cmd_layout_start_let, field('decl', $.decl)),\n\n  _let: $ => seq('let', optional(field('binds', alias($._let_binds, $.local_binds)))),\n\n  let: $ => $._let,\n\n  /**\n   * This is a supertype.\n   */\n  guard: $ => choice(\n    // Cannot be named `pattern` because name clash.\n    alias($.generator, $.pattern_guard),\n    $.let,\n    alias($._exp, $.boolean),\n  ),\n\n  guards: $ => sep1(',', field('guard', $.guard)),\n\n  _guards: $ => seq(\n    $._bar,\n    $._cmd_texp_start,\n    field('guards', $.guards),\n  ),\n\n  // ------------------------------------------------------------------------\n  // rules shared by expression, pattern, type\n  // ------------------------------------------------------------------------\n\n  _universal: $ => choice(\n    $.splice,\n    $.quasiquote,\n    $.literal,\n    $._unit_cons,\n    $._tuple_cons,\n  ),\n\n}\n"
  },
  {
    "path": "grammar/id.js",
    "content": "const {\n  parens,\n  ticked,\n  promoted,\n  qualified,\n} = require('./util.js')\n\nmodule.exports = {\n  // ------------------------------------------------------------------------\n  // var\n  // ------------------------------------------------------------------------\n\n  _qualified_variable: $ => qualified($, $.variable),\n  _qvarid: $ => alias($._qualified_variable, $.qualified),\n  _varids: $ => choice($._qvarid, $.variable),\n\n  _var: $ => choice($.variable, $._pvarsym),\n  _qvar: $ => choice($._qvarid, $._pqvarsym),\n  _vars: $ => choice($._var, $._qvar),\n\n  _variable_ticked: $ => ticked($.variable),\n\n  _varop: $ => choice($.operator, alias($._variable_ticked, $.infix_id)),\n\n  _qvariable_ticked: $ => ticked($._qvarid),\n\n  _varids_ticked: $ => alias(\n    choice(\n      $._variable_ticked,\n      $._qvariable_ticked,\n    ),\n    $.infix_id,\n  ),\n\n  // ------------------------------------------------------------------------\n  // con\n  // ------------------------------------------------------------------------\n\n  _constructor: $ => alias($.name, $.constructor),\n  _qualified_constructor: $ => qualified($, $._constructor),\n  _qconid: $ => alias($._qualified_constructor, $.qualified),\n  _conids: $ => choice($._qconid, $._constructor),\n\n  _con: $ => choice($._constructor, $._pconsym),\n  _qcon: $ => choice($._qconid, $._pqconsym),\n  _cons: $ => choice(prec('con', $._con), $._qcon),\n\n  _constructor_ticked: $ => ticked($._constructor),\n  _conop: $ => choice($._constructor_operator_alias, alias($._constructor_ticked, $.infix_id)),\n\n  _qconstructor_ticked: $ => ticked($._qconid),\n\n  _conids_ticked: $ => alias(\n    choice(\n      $._constructor_ticked,\n      $._qconstructor_ticked,\n    ),\n    $.infix_id,\n  ),\n\n  // ------------------------------------------------------------------------\n  // tycon\n  // ------------------------------------------------------------------------\n\n  _tyconid: $ => $.name,\n  _qualified_type: $ => qualified($, $._tyconid),\n  _qtyconid: $ => alias($._qualified_type, $.qualified),\n  _tyconids: $ => choice($._qtyconid, $._tyconid),\n\n  _tycon_arrow: $ => parens($, alias($._arrow, $.operator)),\n  _qualified_arrow: $ => qualified($, alias($._arrow, $.operator)),\n  _qtycon_arrow: $ => parens($, alias($._qualified_arrow, $.qualified)),\n\n  _tycon: $ => choice($._tyconid, $._pvarsym, alias($._tycon_arrow, $.prefix_id), $._pconsym),\n  _qtycon: $ => choice($._qtyconid, alias($._qtycon_arrow, $.prefix_id), $._pqsym),\n  _tycons: $ => choice($._tycon, $._qtycon),\n\n  _promoted_tycons_alias: $ => seq('\\'', $._cons),\n\n  _promoted_tycons: $ => alias($._promoted_tycons_alias, $.promoted),\n\n  _tycon_ticked: $ => ticked($._tyconid),\n  _qtycon_ticked: $ => ticked($._qtyconid),\n\n  _tyconids_ticked: $ => alias(\n    choice(\n      $._tycon_ticked,\n      $._qtycon_ticked,\n    ),\n    $.infix_id,\n  ),\n\n  _tyconops: $ => choice(\n    $._sym,\n    $._qsym,\n    $._operator_minus,\n    $._tyconids_ticked,\n  ),\n\n  /**\n   * Lenient parsing: `varsym` is not legal (like `'++`).\n   */\n  _promoted_tyconops_alias: $ => promoted($._tyconops),\n\n  _promoted_tyconops: $ => alias($._promoted_tyconops_alias, $.promoted),\n\n  _tyops: $ => choice(\n    $._tyconops,\n    $._promoted_tyconops,\n  ),\n\n  // ------------------------------------------------------------------------\n  // op\n  // ------------------------------------------------------------------------\n\n  _op_ticked: $ => choice(\n    $._varids_ticked,\n    $._conids_ticked,\n  ),\n\n  _ops: $ => choice(\n    $.operator,\n    $._qvarsym,\n    $.constructor_operator,\n    $._qconsym,\n    $._op_ticked,\n  ),\n\n  _name: $ => choice($._var, $._con),\n  _qname: $ => choice($._vars, $._cons),\n\n}\n"
  },
  {
    "path": "grammar/inline.js",
    "content": "module.exports = {\n\n  inline: $ => [\n\n    // ------------------------------------------------\n    // variable\n    // ------------------------------------------------\n\n    $._var,\n    $._vars,\n    $._varids,\n    $._varids_ticked,\n    $._varop,\n\n    // ------------------------------------------------\n    // constructor\n    // ------------------------------------------------\n\n    $._constructor,\n    $._con,\n    $._qcon,\n    $._cons,\n    $._conids,\n    $._conids_ticked,\n    $._conop,\n    $._op_ticked,\n    $._modid,\n\n    // ------------------------------------------------\n    // operator\n    // ------------------------------------------------\n\n    $._qvarsym,\n    $._qconsym,\n    $._sym,\n    $._qsym,\n    $._pqsym,\n    $._any_prefix_dot,\n    $._any_tight_dot,\n    $._unboxed_bar,\n\n    // ------------------------------------------------\n    // expression\n    // ------------------------------------------------\n\n    $._exp_name,\n    $._exp_greedy,\n    $._let,\n\n    // ------------------------------------------------\n    // pattern\n    // ------------------------------------------------\n\n    $._pat_apply_arg,\n    $._pat_name,\n    $._pat_texp,\n\n    // ------------------------------------------------\n    // type\n    // ------------------------------------------------\n\n    $._tyconid,\n    $._tyconids,\n    $._tycon,\n    $._qtycon,\n    $._tycons,\n    $._tyconops,\n    $._tyops,\n\n    $._type_name,\n    $._forall,\n    $._type_apply_arg,\n    $._parameter_type,\n    $._field_type,\n    $._type_head,\n    $._type_instance_head,\n    $._type_annotation,\n    $._kind_annotation,\n\n    // ------------------------------------------------\n    // literal\n    // ------------------------------------------------\n\n    $._number,\n    $._stringly,\n    $._unit_cons,\n    $._tuple_cons,\n    $._universal,\n\n    // ------------------------------------------------\n    // decl\n    // ------------------------------------------------\n\n    $._function_head_patterns,\n    $._function_head,\n\n  ],\n\n}\n"
  },
  {
    "path": "grammar/lexeme.js",
    "content": "const id_char = /[\\pL\\p{Mn}\\pN_']*/\n\nconst varid_start_char = /[_\\p{Ll}\\p{Lo}]/\n\nconst conid_start_char = /[\\p{Lu}\\p{Lt}]/\n\nmodule.exports = {\n\n  variable: _ => token(seq(varid_start_char, id_char, /#*/)),\n\n  implicit_variable: _ => token(seq('?', varid_start_char, id_char)),\n\n  name: _ => token(seq(conid_start_char, id_char, /#*/)),\n\n  label: _ => token(seq('#', varid_start_char, id_char)),\n\n  _carrow: _ => choice('=>', '⇒'),\n  _arrow: _ => choice('->', '→'),\n  _linear_arrow: _ => choice('->.', '⊸'),\n  _larrow: _ => choice('<-', '←'),\n  _colon2: _ => choice('::', '∷'),\n  _promote: _ => '\\'',\n\n  _qual_dot: $ => seq($._cond_qual_dot, '.'),\n  _tight_dot: $ => seq($._cond_tight_dot, '.'),\n  _any_tight_dot: $ => choice($._qual_dot, $._tight_dot),\n  _prefix_dot: $ => seq($._cond_prefix_dot, '.'),\n  _any_prefix_dot: $ => choice($._qual_dot, $._prefix_dot),\n\n  _tight_at: $ => seq($._cond_tight_at, '@'),\n  _prefix_at: $ => seq($._cond_prefix_at, '@'),\n\n  _prefix_bang: $ => seq($._cond_prefix_bang, '!'),\n  _tight_bang: $ => seq($._cond_tight_bang, '!'),\n  _any_prefix_bang: $ => choice($._prefix_bang, $._tight_bang),\n\n  _prefix_tilde: $ => seq($._cond_prefix_tilde, '~'),\n  _tight_tilde: $ => seq($._cond_tight_tilde, '~'),\n  _any_prefix_tilde: $ => choice($._prefix_tilde, $._tight_tilde),\n\n  _prefix_percent: $ => seq($._cond_prefix_percent, '%'),\n\n  _dotdot: $ => seq($._cond_dotdot, '..'),\n\n  _paren_open: $ => seq(alias(/\\(/, '('), $._cmd_texp_start),\n  _paren_close: $ => seq(alias(/\\)/, ')'), $._cmd_texp_end),\n  _bracket_open: $ => seq('[', $._cmd_texp_start),\n  _bracket_close: $ => seq(']', $._cmd_texp_end),\n\n  // Sadly, this does not have the effect of creating a single terminal for the bracket :'(\n  _unboxed_open: $ => alias(seq($._paren_open, token.immediate('#')), '(#'),\n  _unboxed_close: $ => seq('#)', $._cmd_texp_end),\n  _unboxed_bar: _ => choice('|', token.immediate('|')),\n\n  _where: $ => seq(optional($._phantom_where), 'where'),\n\n  _bar: $ => seq(optional($._phantom_bar), '|'),\n\n}\n"
  },
  {
    "path": "grammar/literal.js",
    "content": "const {\n  parens,\n  brackets,\n  unboxed,\n} = require('./util.js')\n\nconst decimal = /[0-9][0-9_]*/\nconst exponent = /[eE][+-]?[0-9_]+/\nconst hex_exponent = /[pP][+-]?[0-9a-fA-F_]+/\nconst magic_hash = rule => token(seq(rule, optional(token.immediate(/##?/))))\n\nmodule.exports = {\n\n  // ------------------------------------------------------------------------\n  // literals\n  // ------------------------------------------------------------------------\n\n  // the `choice` here is necessary to avoid integers being parsed as floats\n  float: _ => magic_hash(\n    seq(\n      decimal,\n      choice(\n        seq(/\\.[0-9_]+/, optional(exponent)),\n        exponent,\n      ),\n    ),\n  ),\n\n  char: _ => magic_hash(\n    choice(\n      /'[^']'/,\n      /'\\\\[^ ]*'/,\n    ),\n  ),\n\n  string: _ => magic_hash(\n    seq(\n      '\"',\n      repeat(choice(\n        /[^\\\\\"\\n]/,\n        /\\\\(\\^)?./,\n        /\\\\\\n\\s*\\\\/,\n      )),\n      '\"',\n    ),\n  ),\n\n  _integer_literal: _ => magic_hash(decimal),\n  _binary_literal: _ => magic_hash(/0[bB][01_]+/),\n  _octal_literal: _ => magic_hash(/0[oO][0-7]+/),\n\n  _hex_literal: _ => magic_hash(\n    seq(\n      /0[xX][0-9a-fA-F_]+/,\n      optional(/\\.[0-9a-fA-F_]+/),\n      optional(hex_exponent),\n    )\n  ),\n\n  integer: $ => choice(\n    $._binary_literal,\n    $._integer_literal,\n    $._octal_literal,\n    $._hex_literal,\n  ),\n\n  _stringly: $ => choice(\n    $.string,\n    $.char,\n  ),\n\n  _number: $ => choice(\n    $.integer,\n    $.float,\n  ),\n\n  _plist: $ => brackets($),\n\n  unit: $ => parens($),\n  unboxed_unit: $ => unboxed($),\n\n  prefix_tuple: $ => parens($, repeat1(',')),\n  prefix_unboxed_tuple: $ => unboxed($, repeat1(',')),\n  prefix_unboxed_sum: $ => unboxed($, repeat1($._unboxed_bar)),\n\n  literal: $ => choice(\n    $._stringly,\n    $._number,\n  ),\n\n  _unit_cons: $ => choice(\n    $.unit,\n    $.unboxed_unit,\n  ),\n\n  _tuple_cons: $ => choice(\n    $.prefix_tuple,\n    $.prefix_unboxed_tuple,\n    $.prefix_unboxed_sum,\n  ),\n\n}\n"
  },
  {
    "path": "grammar/module.js",
    "content": "const {\n  sep1,\n  sep,\n  parens,\n  semi,\n  semi_opt,\n  semis,\n} = require('./util.js')\n\nmodule.exports = {\n\n  // ------------------------------------------------------------------------\n  // module names\n  // ------------------------------------------------------------------------\n\n  _modid: $ => alias($.name, $.module_id),\n\n  _modid_prefix: $ => prec('qualifying-module', seq($._modid, $._any_tight_dot)),\n\n  _qualifying_module: $ => repeat1($._modid_prefix),\n\n  module: $ => seq(repeat($._modid_prefix), $._modid),\n\n  // ------------------------------------------------------------------------\n  // import/export\n  // ------------------------------------------------------------------------\n\n  namespace: _ => choice('pattern', 'type'),\n\n  _child_type: $ => seq(field('namespace', 'type'), field('type', $._tyconids)),\n\n  _child: $ => choice(\n    alias($._child_type, $.associated_type),\n    $._qname,\n  ),\n\n  children: $ => parens($, sep(',', field('element', choice(alias('..', $.all_names), $._child)))),\n\n  _ie_entity: $ => seq(\n    optional(field('namespace', $.namespace)),\n    choice(\n      field('variable', $._varids),\n      field('type', $._tyconids),\n      field('operator', choice($._sym_prefix, $._pqsym)),\n    ),\n    optional(field('children', $.children)),\n  ),\n\n  // ------------------------------------------------------------------------\n  // import\n  // ------------------------------------------------------------------------\n\n  import_list: $ => parens(\n    $,\n    sep(',', field('name', alias($._ie_entity, $.import_name))),\n    optional(','),\n  ),\n\n  import: $ => seq(\n    'import',\n    optional('qualified'),\n    optional(field('package', alias($.string, $.import_package))),\n    field('module', $.module),\n    optional('qualified'),\n    optional(seq('as', field('alias', $.module))),\n    optional(seq(\n      optional('hiding'),\n      field('names', $.import_list),\n    )),\n  ),\n\n  // ------------------------------------------------------------------------\n  // export\n  // ------------------------------------------------------------------------\n\n  module_export: $ => seq('module', field('module', $.module)),\n\n  exports: $ => parens(\n    $,\n    optional(sep1(',', choice(field('export', alias($._ie_entity, $.export)), $.module_export))),\n    optional(','),\n  ),\n\n  // ------------------------------------------------------------------------\n  // module body / sections\n  // ------------------------------------------------------------------------\n\n  header: $ => seq(\n    'module',\n    field('module', $.module),\n    field('exports', optional($.exports)),\n    $._where,\n  ),\n\n  imports: $ => seq(semis($, field('import', $.import)), semi($)),\n\n  /**\n   * Using `semi` at the end instead of `semi_opt` increases parser size by a full megabyte!!\n   *\n   * This allows imports after the first declaration to prevent the tree from jittering while typing an import:\n   *\n   * > import A\n   * > imp\n   * > import B\n   *\n   * The partially typed `imp` will be parsed as a `top_splice`, which forces `imports` to reduce after `import A`.\n   * The rest of the file will then be part of `declarations` and all following imports will be broken until the keyword\n   * has been completed.\n   */\n  declarations: $ => seq($.declaration, repeat(seq(semi($), choice($.declaration, $.import))), semi_opt($)),\n\n  _body: $ => seq(\n    choice($._cmd_layout_start, alias($._cmd_layout_start_explicit, '{')),\n    semi_opt($),\n    field('imports', optional($.imports)),\n    field('declarations', optional($.declarations)),\n    $._layout_end,\n  ),\n\n  _layout_end: $ => choice(\n    $._cond_layout_end,\n    alias($._cond_layout_end_explicit, '}'),\n  ),\n\n  /**\n   * This is a supertype.\n   */\n  declaration: $ => choice(\n    $.decl,\n    $.type_synomym,\n    $.kind_signature,\n    $.type_family,\n    $.type_instance,\n    $.role_annotation,\n    $.data_type,\n    $.newtype,\n    $.data_family,\n    $.data_instance,\n    $.class,\n    $.instance,\n    $.default_types,\n    $.deriving_instance,\n    $.pattern_synonym,\n    $.foreign_import,\n    $.foreign_export,\n    $.fixity,\n    $.top_splice,\n  ),\n\n}\n"
  },
  {
    "path": "grammar/operator.js",
    "content": "const {\n  parens,\n  qualified,\n} = require('./util.js')\n\nmodule.exports = {\n\n  // ------------------------------------------------------------------------\n  // var\n  // ------------------------------------------------------------------------\n\n  _operator_qual_dot_head: $ => seq($._cond_qual_dot, $._varsym),\n\n  _operator_hash_head: _ => seq(\n    choice('#', token.immediate('#')),\n    optional(choice(token.immediate('#'), token.immediate('|'))),\n  ),\n\n  operator: $ => choice(\n    seq(optional($._cond_prefix_dot), $._varsym),\n    $._operator_hash_head,\n    '*',\n  ),\n\n  _operator_alias: $ => $.operator,\n\n  _operator_minus: $ => alias('-', $.operator),\n\n  _varsym_prefix: $ => parens(\n    $,\n    choice(\n      $.operator,\n      $._operator_minus,\n      alias($._operator_qual_dot_head, $.operator),\n    ),\n  ),\n\n  _pvarsym: $ => alias($._varsym_prefix, $.prefix_id),\n\n  _qualified_varsym: $ => qualified($, choice($.operator, $._operator_minus)),\n  _qvarsym: $ => alias($._qualified_varsym, $.qualified),\n\n  _qvarsym_prefix: $ => parens($, $._qvarsym),\n  _pqvarsym: $ => alias($._qvarsym_prefix, $.prefix_id),\n\n  // ------------------------------------------------------------------------\n  // con\n  // ------------------------------------------------------------------------\n\n  constructor_operator: $ => $._consym,\n\n  _constructor_operator_alias: $ => $.constructor_operator,\n\n  _consym_prefix: $ => parens($, $.constructor_operator),\n  _pconsym: $ => alias($._consym_prefix, $.prefix_id),\n\n  _qualified_consym: $ => qualified($, $.constructor_operator),\n  _qconsym: $ => alias($._qualified_consym, $.qualified),\n\n  _qconsym_prefix: $ => parens($, $._qconsym),\n  _pqconsym: $ => alias($._qconsym_prefix, $.prefix_id),\n\n  // ------------------------------------------------------------------------\n  // op\n  // ------------------------------------------------------------------------\n\n  _sym: $ => choice($._operator_alias, $._constructor_operator_alias),\n\n  _sym_prefix: $ => choice($._pvarsym, $._pconsym),\n\n  _qsym: $ => choice($._qvarsym, $._qconsym),\n\n  _pqsym: $ => choice($._pqvarsym, $._pqconsym),\n\n}\n"
  },
  {
    "path": "grammar/pat.js",
    "content": "const {\n  sep1,\n  sep2,\n  sep,\n  parens,\n  braces,\n  brackets,\n  unboxed_tuple_full,\n  unboxed_sum_single,\n} = require('./util.js')\n\nmodule.exports = {\n\n  // ------------------------------------------------------------------------\n  // tuples and parens\n  // ------------------------------------------------------------------------\n\n  _pat_parens: $ => parens($, field('pattern', $._pat_texp)),\n\n  _pat_tuple_elems: $ => sep2(',', field('element', $._pat_texp)),\n\n  _pat_tuple: $ => parens($, $._pat_tuple_elems),\n\n  _pat_unboxed_tuple: $ => unboxed_tuple_full($, $._pat_texp),\n\n  _pat_unboxed_sum: $ => unboxed_sum_single($, $._pat_texp),\n\n  _pat_list: $ => brackets($, sep1(',', field('element', $._pat_texp)), optional(',')),\n\n  // ------------------------------------------------------------------------\n  // record\n  // ------------------------------------------------------------------------\n\n  field_pattern: $ => choice(\n    alias('..', $.wildcard),\n    seq(field('field', $._field_names), optional(seq('=', field('pattern', $._pat_texp)))),\n  ),\n\n  _pat_record: $ => prec('record', seq(\n    field('constructor', $.pattern),\n    braces($, sep(',', field('field', $.field_pattern))),\n  )),\n\n  // ------------------------------------------------------------------------\n  // misc\n  // ------------------------------------------------------------------------\n\n  /**\n   * This dynamic precedence penalty is relevant for the conflict between `function` and `bind`.\n   * Consider:\n   *\n   * > f (A a) = exp\n   *\n   * Because of the \"single choice disambiguated with named precedences\" approach used for `pattern`, the left node in\n   * `pat_apply` can be a variable, even though it's not valid Haskell.\n   * While the static prec 'pat-name' covers this at generation time, Haskell's ambiguity requires us to use a runtime\n   * conflict for `function`/`bind`, where static prec is ineffective.\n   * Giving the reduction of `_var` to `pattern` a strong negative dynamic prec ensures that the runtime branch for\n   * `bind` has lower precedence because of `f`, so `function` always wins.\n   *\n   * While `bind` usually has a lower score than `function` anyway in this situation because it is slightly more\n   * complex, there are never any guarantees for runtime conflicts.\n   * In particular, the presence of minor parse errors later in the declaration can tip the scales randomly.\n   */\n  _pat_name: $ => choice(\n    prec('pat-name', prec.dynamic(-1000, $._var)),\n    $._cons,\n  ),\n\n  _pat_as: $ => prec('prefix', seq(field('bind', $.variable), $._tight_at, field('pattern', $.pattern))),\n\n  _pat_wildcard: _ => '_',\n\n  _pat_strict: $ => prec('prefix', seq($._any_prefix_bang, field('pattern', $.pattern))),\n\n  _pat_irrefutable: $ => prec('prefix', seq($._any_prefix_tilde, field('pattern', $.pattern))),\n\n  // ------------------------------------------------------------------------\n  // application\n  // ------------------------------------------------------------------------\n\n  _pat_apply_arg: $ => choice(\n    $.pattern,\n    alias($._at_type, $.type_binder),\n    $.explicit_type,\n  ),\n\n  _pat_apply: $ => prec.left('apply', seq(\n    field('function', $.pattern),\n    field('argument', $._pat_apply_arg),\n  )),\n\n  // ------------------------------------------------------------------------\n  // operators\n  // ------------------------------------------------------------------------\n\n  _pat_negation: $ => seq('-', field('number', $._number)),\n\n  _pat_infix: $ => prec.right('infix', seq(\n    field('left_operand', $.pattern),\n    optional($._cond_no_section_op),\n    field('operator', choice(\n      $.constructor_operator,\n      $._conids_ticked,\n      seq($._cond_qualified_op, $._qconsym),\n    )),\n    field('right_operand', $.pattern),\n  )),\n\n  // ------------------------------------------------------------------------\n  // top level\n  // ------------------------------------------------------------------------\n\n  pattern: $ => choice(\n    alias($._pat_infix, $.infix),\n    alias($._pat_negation, $.negation),\n    alias($._pat_apply, $.apply),\n    $._pat_name,\n    alias($._pat_as, $.as),\n    alias($._pat_record, $.record),\n    alias($._pat_wildcard, $.wildcard),\n    alias($._pat_parens, $.parens),\n    alias($._pat_tuple, $.tuple),\n    alias($._pat_unboxed_tuple, $.unboxed_tuple),\n    alias($._pat_unboxed_sum, $.unboxed_sum),\n    alias($._pat_list, $.list),\n    alias($._plist, $.list),\n    alias($._pat_strict, $.strict),\n    alias($._pat_irrefutable, $.irrefutable),\n    $._universal,\n  ),\n\n  patterns: $ => repeat1(prec('patterns', $._pat_apply_arg)),\n\n  _pat_signature: $ => prec.right('annotated', seq(\n    field('pattern', $.pattern),\n    $._type_annotation,\n  )),\n\n  _pat: $ => choice(\n    alias($._pat_signature, $.signature),\n    prec.right($.pattern),\n  ),\n\n  view_pattern: $ => seq(field('expression', $._exp), $._arrow, field('pattern', $._pat_texp)),\n\n  _pat_texp: $ => choice($.view_pattern, $._pat),\n\n}\n"
  },
  {
    "path": "grammar/patsyn.js",
    "content": "const {\n  layout,\n  optional_where,\n} = require('./util.js')\n\nmodule.exports = {\n  // ------------------------------------------------------------------------\n  // pattern synonym\n  // ------------------------------------------------------------------------\n\n  _patsyn_signature: $ => seq(\n    field('synonym', choice($._con, alias($._con_binding_list, $.binding_list))),\n    $._colon2,\n    field('type', $.quantified_type),\n  ),\n\n  _patsyn_cons: $ => layout($, alias($.bind, $.constructor_synonym)),\n\n  /**\n   * This allows a `where` after any equation for parsing resilience, even though it's only valid for the arrow variant\n   * (explicitly bidirectional patterns).\n   * The `where` may also be empty.\n   */\n  _patsyn_equation: $ => seq(\n    field('synonym', $.pattern),\n    choice(\n      '=',\n      $._larrow,\n    ),\n    field('pattern', $._pat),\n    optional_where($, field('constructors', alias($._patsyn_cons, $.constructor_synonyms))),\n  ),\n\n  pattern_synonym: $ => seq(\n    'pattern',\n    choice(\n      alias($._patsyn_signature, $.signature),\n      alias($._patsyn_equation, $.equation),\n    ),\n  ),\n\n}\n"
  },
  {
    "path": "grammar/precedences.js",
    "content": "module.exports = {\n\n  precedences: $ => [\n\n    // ------------------------------------------------\n    // associativity of expressions, patterns and types\n    // ------------------------------------------------\n\n    [\n      'projection',\n      'record',\n      'prefix',\n      'apply',\n      'negation',\n      'infix',\n      'implicit',\n      'fun',\n      'annotated',\n      $.quantified_type,\n    ],\n\n    // ------------------------------------------------\n    // negation\n    // ------------------------------------------------\n\n    [\n      $._pat_negation,\n      $.literal,\n    ],\n\n    // ------------------------------------------------\n    // function vs bind\n    // ------------------------------------------------\n\n    [\n      'bind',\n      'pat-name',\n    ],\n\n    // ------------------------------------------------\n    // qualified names\n    // ------------------------------------------------\n\n    /**\n     * Prioritize shifting over a tight infix dot over reducing to a qualified constructor or module.\n     */\n    [\n      'qualifying-module',\n      'qualified-id',\n    ],\n\n    /**\n     * Prioritize qualified variables over record field projection on constructors.\n     */\n    [\n      'qualifying-module',\n      'con',\n    ],\n\n    /**\n     * Prioritize qualified names over the infix operator dot in types.\n     */\n    [\n      'qualifying-module',\n      'type-name',\n    ],\n\n    // ------------------------------------------------\n    // types and constraints\n    // ------------------------------------------------\n\n    [\n      $.operator,\n      $._type_star,\n    ],\n\n    [\n      $._type_wildcard,\n      $._type_param_wildcard,\n    ],\n\n    [\n      $._constructor_ticked,\n      $._tycon_ticked,\n    ],\n\n    [\n      'qtype-single',\n      'qtype-curried',\n    ],\n\n    // ------------------------------------------------\n    // misc\n    // ------------------------------------------------\n\n    /**\n     * > f A a a = a\n     * > data A = A Int Int\n     *\n     * This should not be parsed as constructor application, but separate patterns.\n     */\n    [\n      'patterns',\n      'apply',\n    ],\n\n  ],\n\n}\n"
  },
  {
    "path": "grammar/th.js",
    "content": "const {\n  layout_sort,\n} = require('./util.js')\n\nconst quote_bracket = ($, quoter) => seq(\n  $._cond_quote_start,\n  '[',\n  field('quoter', quoter),\n    '|',\n)\n\nmodule.exports = {\n\n  // ------------------------------------------------------------------------\n  // splice\n  // ------------------------------------------------------------------------\n\n  /**\n   * Even though the doc states \"arbitrary expression\", it's very rare for any others than names and parenthesized\n   * expressions to occur, and it's very expensive to allow them.\n   * Even only allowing list and quotes adds a full megabyte to the parser size.\n   */\n  _splice_exp: $ => choice(\n    $._exp_name,\n    alias($._exp_parens, $.parens),\n    $.literal,\n  ),\n\n  _splice_dollars: $ => seq(\n    $._cond_splice,\n    choice('$', '$$'),\n  ),\n\n  splice: $ => seq($._splice_dollars, field('expression', $._splice_exp)),\n\n  /**\n   * Since `expression` includes `splice`, this allows for a top level dollar splice as well.\n   */\n  top_splice: $ => $.expression,\n\n  quoter: $ => $._varids,\n\n  /**\n   * `_cond_quote_start` (in `quote_bracket`) is a zero-width token emitted by the scanner.\n   * While the quoter and the bar may not be preceded by whitespace, this is not necessary to ensure here with\n   * `token.immediate` since the scanner already verifies it.\n   */\n  quasiquote: $ => seq(\n    quote_bracket($, $.quoter),\n    optional(field('body', $.quasiquote_body)),\n    choice(token('|]'), '⟧'),\n  ),\n\n  quoted_decls: $ => layout_sort($, $._cmd_layout_start_quote, field('declaration', $.declaration)),\n\n  /**\n  * An \"expression quotation\" is valid in an expression, and its body may contain an expression, type, pattern or\n  * declaration layout.\n  *\n  * Which of these are valid is decided by the quoter: `e`, `t`, `p` or `d`.\n  * If the quoter is empty, or the special oxford bracket character is used, the body is parsed as an expression.\n  */\n  _exp_quote: $ => seq(\n    choice(\n      seq(choice('⟦', quote_bracket($, optional('e'))), optional(alias($._exp, $.quoted_expression))),\n      seq(quote_bracket($, 't'), optional(alias($._ktype, $.quoted_type))),\n      seq(quote_bracket($, 'p'), optional(alias($._pat, $.quoted_pattern))),\n      seq(quote_bracket($, 'd'), optional($.quoted_decls)),\n    ),\n    choice(token('|]'), '⟧'),\n  ),\n\n  _exp_typed_quote: $ => seq(\n    $._cond_quote_start,\n    '[',\n    optional('e'),\n    '||',\n    optional(alias($._exp, $.quoted_expression)),\n    token('||]'),\n  ),\n\n}\n"
  },
  {
    "path": "grammar/type.js",
    "content": "const {\n  parens,\n  braces,\n  brackets,\n  prefix_at,\n  sep1,\n  sep2,\n  unboxed_tuple_full,\n  unboxed_sum_full,\n  forall,\n  layout,\n  layout_single,\n  optional_where,\n} = require('./util.js')\n\nmodule.exports = {\n\n  // ------------------------------------------------------------------------\n  // type parameters\n  // ------------------------------------------------------------------------\n\n  _inferred_tyvar: $ => braces($, $._ktype_param),\n\n  _type_param_parens: $ => parens($, $._ktype_param),\n\n  _type_param_wildcard: _ => '_',\n\n  _type_param_annotated: $ => prec('annotated', seq($.type_param, $._kind_annotation)),\n\n  _type_param_invisible: $ => prefix_at($, field('bind', $.type_param)),\n\n  /**\n   * This is a supertype.\n   */\n  type_param: $ => choice(\n    alias($._type_param_wildcard, $.wildcard),\n    alias($._type_param_invisible, $.invisible),\n    alias($._type_param_parens, $.parens),\n    field('bind', $.variable),\n  ),\n\n  _ktype_param: $ => choice(\n    $.type_param,\n    alias($._type_param_annotated, $.annotated),\n  ),\n\n  type_params: $ => repeat1(prec('patterns', $.type_param)),\n\n  quantified_variables: $ => repeat1(choice($.type_param, alias($._inferred_tyvar, $.inferred))),\n\n  // ------------------------------------------------------------------------\n  // tuples and parens\n  // ------------------------------------------------------------------------\n\n  _type_parens: $ => parens($, field('type', $._ktype)),\n\n  _type_tuple_elems: $ => sep2(',', field('element', $._ktype)),\n\n  /**\n   * Tuple types must either be saturated or empty, sections aren't legal.\n   * We could be lenient here, but it seems useful to have a different node name for the prefix variant.\n   */\n  _type_tuple: $ => parens($, $._type_tuple_elems),\n\n  _type_unboxed_tuple: $ => unboxed_tuple_full($, $._ktype),\n\n  _type_unboxed_sum: $ => unboxed_sum_full($, $._ktype),\n\n  _type_list: $ => brackets($, sep1(',', field('element', $._ktype))),\n\n  // ------------------------------------------------------------------------\n  // names etc\n  // ------------------------------------------------------------------------\n\n  _type_promoted: $ => seq(\n    '\\'',\n    choice(\n      alias($._plist, $.empty_list),\n      alias($._type_tuple, $.tuple),\n      alias($._type_list, $.list),\n      $.prefix_tuple,\n      $.unit,\n    ),\n  ),\n\n  _type_name: $ => choice(\n    $.variable,\n    $._promoted_tycons,\n    prec('type-name', $._tycons),\n  ),\n\n  _type_star: _ => choice('*', '★'),\n\n  _type_wildcard: _ => '_',\n\n  // ------------------------------------------------------------------------\n  // application\n  // ------------------------------------------------------------------------\n\n  _at_type: $ => prefix_at($, field('type', $.type)),\n\n  _type_apply_arg: $ => choice($.type, alias($._at_type, $.kind_application)),\n\n  /**\n   * Type application, as in `Either e (Int, Text)` or `TypeRep @Int`.\n   */\n  _type_apply: $ => prec.left('apply', seq(\n    field('constructor', $.type),\n    field('argument', $._type_apply_arg),\n  )),\n\n  // ------------------------------------------------------------------------\n  // infix\n  // ------------------------------------------------------------------------\n\n  _type_infix: $ => prec.right('infix', seq(\n    field('left_operand', $.type),\n    field('operator', $._tyops),\n    field('right_operand', $.type),\n  )),\n\n  // ------------------------------------------------------------------------\n  // unquantified type\n  // ------------------------------------------------------------------------\n\n  /**\n   * This is a supertype.\n   */\n  type: $ => choice(\n    $._type_name,\n    alias($._type_star, $.star),\n    alias($._type_wildcard, $.wildcard),\n    alias($._type_parens, $.parens),\n    alias($._type_promoted, $.promoted),\n    alias($._type_list, $.list),\n    alias($._plist, $.prefix_list),\n    alias($._type_unboxed_tuple, $.unboxed_tuple),\n    alias($._type_unboxed_sum, $.unboxed_sum),\n    alias($._type_tuple, $.tuple),\n    alias($._type_infix, $.infix),\n    alias($._type_apply, $.apply),\n    $._universal,\n  ),\n\n  // ------------------------------------------------------------------------\n  // forall\n  // ------------------------------------------------------------------------\n\n  _forall_keyword: _ => choice('forall', '∀'),\n\n  _forall_body: $ => seq(\n    field('quantifier', $._forall_keyword),\n    optional(field('variables', $.quantified_variables)),\n  ),\n\n  forall: $ => prec('qtype-single', seq(\n    $._forall_body,\n    '.',\n  )),\n\n  forall_required: $ => prec('qtype-single', seq(\n    $._forall_body,\n    $._arrow,\n  )),\n\n  _forall: $ => choice(\n    $.forall,\n    $.forall_required,\n  ),\n\n  _qtype_forall: $ => prec.right('qtype-curried', seq(\n    $._forall_body,\n    '.',\n    field('type', $.quantified_type),\n  )),\n\n  _qtype_forall_required: $ => prec.right('qtype-curried', seq(\n    $._forall_body,\n    $._arrow,\n    field('type', $.quantified_type),\n  )),\n\n  // ------------------------------------------------------------------------\n  // function\n  // ------------------------------------------------------------------------\n\n  _fun_arrow: $ => seq(\n    optional($._phantom_arrow),\n    field('arrow', $._arrow),\n  ),\n\n  modifier: $ => prec('prefix', seq($._prefix_percent, $.type)),\n\n  _linear_fun_arrow: $ => choice(\n    seq(\n      field('multiplicity', $.modifier),\n      $._fun_arrow,\n    ),\n    seq(\n      optional($._phantom_arrow),\n      field('arrow', $._linear_arrow),\n    ),\n  ),\n\n  /**\n   * These also allow tight infix because unpack pragmas can precede them without space.\n   * Technically pragmas aren't considered for tight infix, but it's simpler to do it this way than to track that in the\n   * scanner.\n   */\n  strict_field: $ => prec('prefix', seq($._any_prefix_bang, field('type', $.type))),\n  lazy_field: $ => prec('prefix', seq($._any_prefix_tilde, field('type', $.type))),\n\n  _parameter_type: $ => field('parameter', choice($.strict_field, $.lazy_field, $.quantified_type)),\n\n  /**\n   * We allow strict and lazy field types in function types so that GADTs don't need a separate rule tree.\n   */\n  _qtype_function: $ => prec.right(seq(\n    $._parameter_type,\n    $._fun_arrow,\n    field('result', $.quantified_type),\n  )),\n\n  _qtype_linear_function: $ => prec.right(seq(\n    $._parameter_type,\n    $._linear_fun_arrow,\n    field('result', $.quantified_type),\n  )),\n\n  // ------------------------------------------------------------------------\n  // context\n  // ------------------------------------------------------------------------\n\n  _qtype_context: $ => prec.right('qtype-curried', seq(\n    $._context_inline,\n    field('type', $.quantified_type),\n  )),\n\n  // ------------------------------------------------------------------------\n  // top level\n  // ------------------------------------------------------------------------\n\n  /**\n   * This is a supertype.\n   */\n  quantified_type: $ => choice(\n    alias($._qtype_function, $.function),\n    alias($._qtype_linear_function, $.linear_function),\n    alias($._qtype_forall, $.forall),\n    alias($._qtype_forall_required, $.forall_required),\n    alias($._qtype_context, $.context),\n    $.implicit_parameter,\n    prec.right($.type),\n  ),\n\n  _type_annotation: $ => seq(\n    $._colon2,\n    field('type', $.quantified_type),\n  ),\n\n  _kind_annotation: $ => seq(\n    $._colon2,\n    field('kind', $.quantified_type),\n  ),\n\n  _type_signature: $ => prec.right('annotated', seq(\n    field('type', $.quantified_type),\n    $._kind_annotation,\n  )),\n\n  _ktype: $ => choice(\n    alias($._type_signature, $.signature),\n    $.quantified_type,\n  ),\n\n  // ------------------------------------------------------------------------\n  // type head\n  // ------------------------------------------------------------------------\n\n  _type_head_name: $ => field('name', choice(\n    $._tycon,\n    $.unit,\n    alias($._plist, $.prefix_list),\n  )),\n\n  _type_head_parens: $ => parens(\n    $,\n    choice(\n      $._type_head,\n      $._type_head_params,\n    ),\n  ),\n\n  _type_head_params: $ => choice(\n    $._type_head_name,\n    alias($._type_head_parens, $.parens),\n  ),\n\n  _type_head_infix: $ => prec('infix', seq(\n    field('left_operand', $.type_param),\n    field('operator', $._tyconops),\n    field('right_operand', $.type_param),\n  )),\n\n  /**\n  * A type head introduces the name and parameters in the declaration of a data type/family, type synonym/family, or\n  * class.\n  *\n  * It can be in prefix or infix form:\n  *\n  * > A a b\n  * > a +++ b\n  *\n  * Parameters can be visible or invisible, the latter marked by a prefix `@`.\n  * They can be plain or parenthesized variable names, the latter with an optional kind signature.\n  * They can be wildcards.\n  *\n  * Examples: `a`, `@a`, `(a :: Type)`, `@(_ :: Type -> Type)`\n  *\n  * The rules are slightly relaxed compared to GHC.\n  */\n  _type_head: $ => choice(\n    seq($._type_head_params, optional(field('patterns', $.type_params))),\n    alias($._type_head_infix, $.infix),\n  ),\n\n  // ------------------------------------------------------------------------\n  // type instance head\n  // ------------------------------------------------------------------------\n\n  _type_instance_head_parens: $ => parens(\n    $,\n    choice(\n      $._type_instance_head,\n      $._type_instance_head_params,\n    ),\n    optional($._kind_annotation),\n  ),\n\n  _type_instance_head_params: $ => choice(\n    field('name', $._tycons),\n    alias($._type_instance_head_parens, $.parens),\n  ),\n\n  type_patterns: $ => repeat1(prec('patterns', $._type_apply_arg)),\n\n  /**\n   * The equivalent of a type head, for type instances, which can contain full type patterns rather than just variable\n   * binders.\n   */\n  _type_instance_head: $ => choice(\n    seq($._type_instance_head_params, optional(field('patterns', $.type_patterns))),\n    seq($._cond_infix, alias($._type_infix, $.infix)),\n  ),\n\n  // ------------------------------------------------------------------------\n  // type decl\n  // ------------------------------------------------------------------------\n\n  type_synomym: $ => seq(\n    'type',\n    $._type_head,\n    '=',\n    field('type', $._ktype),\n  ),\n\n  kind_signature: $ => seq(\n    'type',\n    $._type_head,\n    $._kind_annotation,\n  ),\n\n  // ------------------------------------------------------------------------\n  // type instance\n  // ------------------------------------------------------------------------\n\n  _type_instance_common: $ => seq(\n    $._type_instance_head,\n    '=',\n    $.quantified_type,\n  ),\n\n  _type_instance: $ => seq(\n    forall($),\n    $._type_instance_common,\n  ),\n\n  type_instance: $ => seq(\n    'type',\n    'instance',\n    $._type_instance,\n  ),\n\n  // ------------------------------------------------------------------------\n  // type family\n  // ------------------------------------------------------------------------\n\n  type_family_result: $ => seq('=', field('result', $.quantified_type)),\n\n  type_family_injectivity: $ => seq(\n    $._bar,\n    field('result', $.variable),\n    $._arrow,\n    field('determined', repeat1($.variable)),\n  ),\n\n  _tyfam_inj: $ => seq(\n    $.type_family_result,\n    optional($.type_family_injectivity),\n  ),\n\n  _tyfam: $ => seq(\n    $._type_head,\n    optional(choice($._kind_annotation, $._tyfam_inj)),\n  ),\n\n  _tyfam_equations: $ => layout($, field('equation', alias($._type_instance, $.equation))),\n\n  /**\n   * This syntax is valid in `.hs-boot` files.\n   */\n  abstract_family: $ => layout_single($, '..'),\n\n  type_family: $ => seq(\n    'type',\n    'family',\n    $._tyfam,\n    optional_where($, field('closed_family', choice(\n      alias($._tyfam_equations, $.equations),\n      $.abstract_family,\n    ))),\n  ),\n\n  // ------------------------------------------------------------------------\n  // role\n  // ------------------------------------------------------------------------\n\n  type_role: _ => choice(\n    'representational',\n    'nominal',\n    'phantom',\n    '_',\n  ),\n\n  role_annotation: $ => seq(\n    'type',\n    'role',\n    field('type', $._tycons),\n    repeat1(field('role', $.type_role)),\n  )\n}\n"
  },
  {
    "path": "grammar/util.js",
    "content": "// ------------------------------------------------------------------------\n// structure\n// ------------------------------------------------------------------------\n\nconst sep1 = (s, rule) => seq(rule, repeat(seq(s, rule)))\n\nconst sep2 = (s, rule) => seq(rule, repeat1(seq(s, rule)))\n\nconst sep = (s, rule) => optional(sep1(s, rule))\n\n// ------------------------------------------------------------------------\n// syntax\n// ------------------------------------------------------------------------\n\nconst parens = ($, ...rule) => seq($._paren_open, ...rule, $._paren_close)\n\nconst braces = ($, ...rule) => seq('{', $._cmd_brace_open, ...rule, '}', $._cmd_brace_close)\n\nconst brackets = ($, ...rule) => seq($._bracket_open, ...rule, $._bracket_close)\n\nconst ticked = (...rule) => seq('`', ...rule, '`')\n\nconst promoted = (...rule) => seq('\\'', ...rule)\n\nconst prefix_at = ($, ...rule) => prec('prefix', seq($._prefix_at, ...rule))\n\nconst semi = $ => choice(repeat1(';'), $._cond_layout_semicolon)\n\nconst semi_opt = $ => optional(semi($))\n\nconst semis = ($, rule) => sep1(semi($), rule)\n\n// ------------------------------------------------------------------------\n// layout\n// ------------------------------------------------------------------------\n\n/**\n * More general variant of `layout_sort`.\n */\nconst layout_sort_single = ($, start, rule) => seq(\n  choice(start, alias($._cmd_layout_start_explicit, '{')),\n  rule,\n  $._layout_end,\n)\n\n/**\n * Wrap a repeated rule in a layout.\n * This is used for `where`, `let`, `of`, `if` and `do`, and the toplevel module.\n * The `start` rule must be one of the externals starting with `_cmd_layout_<type>`, which instruct the scanner to push\n * a layout context with the current column as its indentation.\n * When a `_cond_layout_end` or `_cond_layout_semicolon` is encountered by the scanner, the recorded indent is compared\n * to the current one to make a decision.\n */\nconst layout_sort = ($, start, rule) => seq(\n  choice(start, alias($._cmd_layout_start_explicit, '{')),\n  optional(seq(\n    semi_opt($),\n    semis($, rule),\n    semi_opt($),\n  )),\n  $._layout_end,\n)\n\n/**\n * Same as `layout`, but using `layout_sort_single`.\n * This is necessary for braces without repeating layout elements.\n * Usually it is enough to just use `braces` for this (e.g. records), but if the rule is in a choice with a full\n * layout, we need to allow the layout start token since the scanner emits that unconditionally based on preceding\n * tokens.\n */\nconst layout_single = ($, rule) => layout_sort_single($, $._cmd_layout_start, rule)\n\n/**\n * Alias for `layout_sort` using the common layout type for the start token, which corresponds to declarations and GADT\n * constructors.\n */\nconst layout = ($, rule) => layout_sort($, $._cmd_layout_start, rule)\n\n// ------------------------------------------------------------------------\n// unboxed\n// ------------------------------------------------------------------------\n\nconst unboxed = ($, ...rules) => seq($._unboxed_open, ...rules, $._unboxed_close)\n\n/**\n * At least one element is filled, for expressions.\n */\nconst unboxed_tuple_nonempty = ($, rule) => unboxed(\n  $,\n  repeat(','),\n  field('element', rule),\n  repeat(seq(',', optional(field('element', rule))))\n)\n\n/**\n * All elements are filled in, for types and patterns.\n */\nconst unboxed_tuple_full = ($, rule) => unboxed($, sep1(',', field('element', rule)))\n\n/**\n * Exactly one element is filled in, used by expressions, patterns and the special data constructors.\n */\nconst unboxed_sum_single = ($, rule) => unboxed(\n  $,\n  choice(\n    seq(repeat1($._unboxed_bar), field('element', rule)),\n    seq(field('element', rule), $._unboxed_bar)\n  ),\n  repeat($._unboxed_bar),\n)\n\n/**\n * All elements are filled in, for types.\n */\nconst unboxed_sum_full = ($, rule) => unboxed($, sep2($._unboxed_bar, field('element', rule)))\n\n// ------------------------------------------------------------------------\n// where\n// ------------------------------------------------------------------------\n\nconst optional_where = ($, rule) => optional(seq($._where, optional(rule)))\n\n// ------------------------------------------------------------------------\n// misc\n// ------------------------------------------------------------------------\n\nconst qualified = ($, id) => prec('qualified-id', seq(\n  field('module', alias($._qualifying_module, $.module)),\n  field('id', id),\n))\n\nconst context = $ => optional(field('context', $.context))\n\nconst forall = $ => optional(field('forall', $._forall))\n\nmodule.exports = {\n  sep1,\n  sep2,\n  sep,\n  parens,\n  braces,\n  brackets,\n  ticked,\n  promoted,\n  prefix_at,\n  semi,\n  semi_opt,\n  semis,\n  layout_sort_single,\n  layout_sort,\n  layout_single,\n  layout,\n  unboxed,\n  unboxed_tuple_nonempty,\n  unboxed_tuple_full,\n  unboxed_sum_single,\n  unboxed_sum_full,\n  optional_where,\n  qualified,\n  context,\n  forall,\n}\n"
  },
  {
    "path": "grammar.js",
    "content": "const\n  class_ = require('./grammar/class.js'),\n  conflicts = require('./grammar/conflicts.js'),\n  context = require('./grammar/context.js'),\n  data = require('./grammar/data.js'),\n  decl = require('./grammar/decl.js'),\n  exp = require('./grammar/exp.js'),\n  externals = require('./grammar/externals.js'),\n  general = require('./grammar/general.js'),\n  id = require('./grammar/id.js'),\n  inline = require('./grammar/inline.js'),\n  lexeme = require('./grammar/lexeme.js'),\n  literal = require('./grammar/literal.js'),\n  module_ = require('./grammar/module.js'),\n  operator = require('./grammar/operator.js'),\n  pat = require('./grammar/pat.js'),\n  patsyn = require('./grammar/patsyn.js'),\n  precedences = require('./grammar/precedences.js'),\n  th = require('./grammar/th.js'),\n  type = require('./grammar/type.js')\n\nmodule.exports = grammar({\n  name: 'haskell',\n\n  rules: {\n    haskell: $ => seq(\n      optional($.header),\n      optional($._body),\n    ),\n\n    ...general,\n    ...type,\n    ...context,\n    ...exp,\n    ...pat,\n    ...module_,\n    ...data,\n    ...class_,\n    ...decl,\n    ...patsyn,\n    ...th,\n    ...literal,\n    ...id,\n    ...operator,\n    ...lexeme,\n\n  },\n\n  ...externals,\n  ...precedences,\n  ...inline,\n  ...conflicts,\n\n  /**\n   * These rules may occur anywhere in the grammar and don't have to be specified in productions.\n   */\n  extras: $ => [\n    /\\p{Zs}/,\n    /\\n/,\n    /\\r/,\n    $.cpp,\n    $.comment,\n    $.haddock,\n    $.pragma,\n  ],\n\n  /**\n   * Rules with leading underscore are generally omitted from the AST, and can therefore not be used in queries.\n   * The rules listed in this attribute are omitted from the AST, but their names can be used in queries in place of\n   * their children; as well as in combination with them, using the syntax `expression/variable`.\n   * This is most useful for choice rules that represent syntactic categories, like expressions, patterns, and types in\n   * Haskell.\n   *\n   * See the readme for a detailed explanation.\n   */\n  supertypes: $ => [\n    $.expression,\n    $.pattern,\n    $.type,\n    $.quantified_type,\n    $.constraint,\n    $.constraints,\n    $.type_param,\n    $.declaration,\n    $.decl,\n    $.class_decl,\n    $.instance_decl,\n    $.statement,\n    $.qualifier,\n    $.guard,\n  ],\n\n  /**\n   * This rule is used to detect that a reserved keyword is a prefix of an identifier.\n   *\n   * For example, if the identifier `ifM` occurs in a position where the keyword `if` is valid (so most expressions),\n   * the fact that `ifM` matches `variable` prevents tree-sitter from lexing `if` followed by `M` as a `name`.\n   */\n  word: $ => $.variable,\n\n})\n"
  },
  {
    "path": "package.json",
    "content": "{\n  \"name\": \"tree-sitter-haskell\",\n  \"version\": \"0.23.1\",\n  \"description\": \"Haskell grammar for tree-sitter\",\n  \"repository\": \"https://github.com/tree-sitter/tree-sitter-haskell\",\n  \"license\": \"MIT\",\n  \"author\": {\n    \"name\": \"Rick Winfrey\"\n  },\n  \"contributors\": [\n    {\n      \"name\": \"Max Brunsfeld\",\n      \"email\": \"maxbrunsfeld@gmail.com\"\n    },\n    {\n      \"name\": \"Owen Shepherd\"\n    },\n    {\n      \"name\": \"Torsten Schmits\"\n    }\n  ],\n  \"main\": \"bindings/node\",\n  \"types\": \"bindings/node\",\n  \"keywords\": [\n    \"incremental\",\n    \"parsing\",\n    \"tree-sitter\",\n    \"haskell\"\n  ],\n  \"files\": [\n    \"grammar.js\",\n    \"grammar/*.js\",\n    \"tree-sitter.json\",\n    \"binding.gyp\",\n    \"prebuilds/**\",\n    \"bindings/node/*\",\n    \"queries/*\",\n    \"src/**\",\n    \"*.wasm\"\n  ],\n  \"dependencies\": {\n    \"node-addon-api\": \"^8.2.2\",\n    \"node-gyp-build\": \"^4.8.2\"\n  },\n  \"devDependencies\": {\n    \"prebuildify\": \"^6.0.1\",\n    \"tree-sitter-cli\": \"^0.24.4\"\n  },\n  \"peerDependencies\": {\n    \"tree-sitter\": \"^0.21.1\"\n  },\n  \"peerDependenciesMeta\": {\n    \"tree-sitter\": {\n      \"optional\": true\n    }\n  },\n  \"scripts\": {\n    \"install\": \"node-gyp-build\",\n    \"prestart\": \"tree-sitter build --wasm\",\n    \"start\": \"tree-sitter playground\",\n    \"test\": \"node --test bindings/node/*_test.js\"\n  }\n}\n"
  },
  {
    "path": "pyproject.toml",
    "content": "[build-system]\nrequires = [\"setuptools>=42\", \"wheel\"]\nbuild-backend = \"setuptools.build_meta\"\n\n[project]\nname = \"tree-sitter-haskell\"\ndescription = \"Haskell grammar for tree-sitter\"\nversion = \"0.23.1\"\nkeywords = [\"incremental\", \"parsing\", \"tree-sitter\", \"haskell\"]\nclassifiers = [\n  \"Intended Audience :: Developers\",\n  \"License :: OSI Approved :: MIT License\",\n  \"Topic :: Software Development :: Compilers\",\n  \"Topic :: Text Processing :: Linguistic\",\n  \"Typing :: Typed\",\n]\nrequires-python = \">=3.9\"\nlicense.text = \"MIT\"\nreadme = \"README.md\"\n\n[[project.authors]]\nname = \"Rick Winfrey\"\n\n[[project.maintainers]]\nname = \"Torsten Schmits\"\n\n[project.urls]\nHomepage = \"https://github.com/tree-sitter/tree-sitter-haskell\"\n\n[project.optional-dependencies]\ncore = [\"tree-sitter~=0.22\"]\n\n[tool.cibuildwheel]\nbuild = \"cp39-*\"\nbuild-frontend = \"build\"\n"
  },
  {
    "path": "queries/highlights.scm",
    "content": "; ----------------------------------------------------------------------------\n; Parameters and variables\n; NOTE: These are at the top, so that they have low priority,\n; and don't override destructured parameters\n(variable) @variable\n\n(pattern/wildcard) @variable\n\n(decl/function\n  patterns: (patterns\n    (_) @variable.parameter))\n\n(expression/lambda\n  (_)+ @variable.parameter\n  \"->\")\n\n(decl/function\n  (infix\n    (pattern) @variable.parameter))\n\n; ----------------------------------------------------------------------------\n; Literals and comments\n(integer) @number\n\n(negation) @number\n\n(expression/literal\n  (float)) @number.float\n\n(char) @character\n\n(string) @string\n\n(unit) @string.special.symbol ; unit, as in ()\n\n(comment) @comment\n\n((haddock) @comment.documentation)\n\n; ----------------------------------------------------------------------------\n; Punctuation\n[\n  \"(\"\n  \")\"\n  \"{\"\n  \"}\"\n  \"[\"\n  \"]\"\n] @punctuation.bracket\n\n[\n  \",\"\n  \";\"\n] @punctuation.delimiter\n\n; ----------------------------------------------------------------------------\n; Keywords, operators, includes\n[\n  \"forall\"\n  ; \"∀\" ; utf-8 is not cross-platform safe\n] @keyword.repeat\n\n(pragma) @keyword.directive\n\n[\n  \"if\"\n  \"then\"\n  \"else\"\n  \"case\"\n  \"of\"\n] @keyword.conditional\n\n[\n  \"import\"\n  \"qualified\"\n  \"module\"\n] @keyword.import\n\n[\n  (operator)\n  (constructor_operator)\n  (all_names)\n  (wildcard)\n  \".\"\n  \"..\"\n  \"=\"\n  \"|\"\n  \"::\"\n  \"=>\"\n  \"->\"\n  \"<-\"\n  \"\\\\\"\n  \"`\"\n  \"@\"\n] @operator\n\n; TODO broken, also huh?\n; ((qualified_module\n;   (module) @constructor)\n;   .\n;   (module))\n\n(module\n  (module_id) @module)\n\n[\n  \"where\"\n  \"let\"\n  \"in\"\n  \"class\"\n  \"instance\"\n  \"pattern\"\n  \"data\"\n  \"newtype\"\n  \"family\"\n  \"type\"\n  \"as\"\n  \"hiding\"\n  \"deriving\"\n  \"via\"\n  \"stock\"\n  \"anyclass\"\n  \"do\"\n  \"mdo\"\n  \"rec\"\n  \"infix\"\n  \"infixl\"\n  \"infixr\"\n] @keyword\n\n; ----------------------------------------------------------------------------\n; Functions and variables\n(decl\n  [\n   name: (variable) @function\n   names: (binding_list (variable) @function)\n  ])\n\n(decl/bind\n  name: (variable) @variable)\n\n; Consider signatures (and accompanying functions)\n; with only one value on the rhs as variables\n(decl/signature\n  name: (variable) @variable\n  type: (type))\n\n((decl/signature\n  name: (variable) @_name\n  type: (type))\n  .\n  (decl\n    name: (variable) @variable)\n    match: (_)\n  (#eq? @_name @variable))\n\n; but consider a type that involves 'IO' a decl/function\n(decl/signature\n  name: (variable) @function\n  type: (type/apply\n    constructor: (name) @_type)\n  (#eq? @_type \"IO\"))\n\n((decl/signature\n  name: (variable) @_name\n  type: (type/apply\n    constructor: (name) @_type)\n  (#eq? @_type \"IO\"))\n  .\n  (decl\n    name: (variable) @function)\n    match: (_)\n  (#eq? @_name @function))\n\n((decl/signature) @function\n  .\n  (decl/function\n    name: (variable) @function))\n\n(decl/bind\n  name: (variable) @function\n  (match\n    expression: (expression/lambda)))\n\n; view patterns\n(view_pattern\n  [\n    (expression/variable) @function.call\n    (expression/qualified\n      (variable) @function.call)\n  ])\n\n; consider infix functions as operators\n(infix_id\n  [\n    (variable) @operator\n    (qualified\n      (variable) @operator)\n  ])\n\n; decl/function calls with an infix operator\n; e.g. func <$> a <*> b\n(infix\n  [\n    (variable) @function.call\n    (qualified\n      ((module) @module\n        (variable) @function.call))\n  ]\n  .\n  (operator))\n\n; infix operators applied to variables\n((expression/variable) @variable\n  .\n  (operator))\n\n((operator)\n  .\n  [\n    (expression/variable) @variable\n    (expression/qualified\n      (variable) @variable)\n  ])\n\n; decl/function calls with infix operators\n([\n    (expression/variable) @function.call\n    (expression/qualified\n      (variable) @function.call)\n  ]\n  .\n  (operator) @_op\n  (#any-of? @_op \"$\" \"<$>\" \">>=\" \"=<<\"))\n\n; right hand side of infix operator\n((infix\n  [\n    (operator)\n    (infix_id (variable))\n  ] ; infix or `func`\n  .\n  [\n    (variable) @function.call\n    (qualified\n      (variable) @function.call)\n  ])\n  .\n  (operator) @_op\n  (#any-of? @_op \"$\" \"<$>\" \"=<<\"))\n\n; decl/function composition, arrows, monadic composition (lhs)\n(\n  [\n    (expression/variable) @function\n    (expression/qualified\n      (variable) @function)\n  ]\n  .\n  (operator) @_op\n  (#any-of? @_op \".\" \">>>\" \"***\" \">=>\" \"<=<\"))\n\n; right hand side of infix operator\n((infix\n  [\n    (operator)\n    (infix_id (variable))\n  ] ; infix or `func`\n  .\n  [\n    (variable) @function\n    (qualified\n      (variable) @function)\n  ])\n  .\n  (operator) @_op\n  (#any-of? @_op \".\" \">>>\" \"***\" \">=>\" \"<=<\"))\n\n; function composition, arrows, monadic composition (rhs)\n((operator) @_op\n  .\n  [\n    (expression/variable) @function\n    (expression/qualified\n      (variable) @function)\n  ]\n  (#any-of? @_op \".\" \">>>\" \"***\" \">=>\" \"<=<\"))\n\n; function defined in terms of a function composition\n(decl/function\n  name: (variable) @function\n  (match\n    expression: (infix\n      operator: (operator) @_op\n      (#any-of? @_op \".\" \">>>\" \"***\" \">=>\" \"<=<\"))))\n\n(apply\n  [\n    (expression/variable) @function.call\n    (expression/qualified\n      (variable) @function.call)\n  ])\n\n; function compositions, in parentheses, applied\n; lhs\n(apply\n  .\n  (expression/parens\n    (infix\n      [\n        (variable) @function.call\n        (qualified\n          (variable) @function.call)\n      ]\n      .\n      (operator))))\n\n; rhs\n(apply\n  .\n  (expression/parens\n    (infix\n      (operator)\n      .\n      [\n        (variable) @function.call\n        (qualified\n          (variable) @function.call)\n      ])))\n\n; variables being passed to a function call\n(apply\n  (_)\n  .\n  [\n    (expression/variable) @variable\n    (expression/qualified\n      (variable) @variable)\n  ])\n\n; main is always a function\n; (this prevents `main = undefined` from being highlighted as a variable)\n(decl/bind\n  name: (variable) @function\n  (#eq? @function \"main\"))\n\n; scoped function types (func :: a -> b)\n(signature\n  pattern: (pattern/variable) @function\n  type: (quantified_type))\n\n; signatures that have a function type\n; + binds that follow them\n(decl/signature\n  name: (variable) @function\n  type: (quantified_type))\n\n((decl/signature\n  name: (variable) @_name\n  type: (quantified_type))\n  .\n  (decl/bind\n    (variable) @function)\n  (#eq? @function @_name))\n\n; ----------------------------------------------------------------------------\n; Types\n(name) @type\n\n(type/star) @type\n\n(variable) @type\n\n(constructor) @constructor\n\n; True or False\n((constructor) @boolean\n  (#any-of? @boolean \"True\" \"False\"))\n\n; otherwise (= True)\n((variable) @boolean\n  (#eq? @boolean \"otherwise\"))\n\n; ----------------------------------------------------------------------------\n; Quasi-quotes\n(quoter) @function.call\n\n(quasiquote\n  [\n    (quoter) @_name\n    (_\n      (variable) @_name)\n  ]\n  (#eq? @_name \"qq\")\n  (quasiquote_body) @string)\n\n(quasiquote\n  (_\n    (variable) @_name)\n  (#eq? @_name \"qq\")\n  (quasiquote_body) @string)\n\n; namespaced quasi-quoter\n(quasiquote\n  (_\n    (module) @module\n    .\n    (variable) @function.call))\n\n; Highlighting of quasiquote_body for other languages is handled by injections.scm\n; ----------------------------------------------------------------------------\n; Exceptions/error handling\n((variable) @keyword.exception\n  (#any-of? @keyword.exception\n    \"error\" \"undefined\" \"try\" \"tryJust\" \"tryAny\" \"catch\" \"catches\" \"catchJust\" \"handle\" \"handleJust\"\n    \"throw\" \"throwIO\" \"throwTo\" \"throwError\" \"ioError\" \"mask\" \"mask_\" \"uninterruptibleMask\"\n    \"uninterruptibleMask_\" \"bracket\" \"bracket_\" \"bracketOnErrorSource\" \"finally\" \"fail\"\n    \"onException\" \"expectationFailure\"))\n\n; ----------------------------------------------------------------------------\n; Debugging\n((variable) @keyword.debug\n  (#any-of? @keyword.debug\n    \"trace\" \"traceId\" \"traceShow\" \"traceShowId\" \"traceWith\" \"traceShowWith\" \"traceStack\" \"traceIO\"\n    \"traceM\" \"traceShowM\" \"traceEvent\" \"traceEventWith\" \"traceEventIO\" \"flushEventLog\" \"traceMarker\"\n    \"traceMarkerIO\"))\n\n; ----------------------------------------------------------------------------\n; Fields\n\n(field_name\n  (variable) @variable.member)\n\n(import_name\n  (name)\n  .\n  (children\n    (variable) @variable.member))\n\n\n; ----------------------------------------------------------------------------\n; Spell checking\n(comment) @spell\n"
  },
  {
    "path": "queries/injections.scm",
    "content": "; -----------------------------------------------------------------------------\n; General language injection\n(quasiquote\n  (quoter) @injection.language\n  (quasiquote_body) @injection.content)\n\n((comment) @injection.content\n  (#set! injection.language \"comment\"))\n\n; -----------------------------------------------------------------------------\n; shakespeare library\n; NOTE: doesn't support templating\n; TODO: add once CoffeeScript parser is added\n; ; CoffeeScript: Text.Coffee\n; (quasiquote\n;  (quoter) @_name\n;  (#eq? @_name \"coffee\")\n;  ((quasiquote_body) @injection.content\n;   (#set! injection.language \"coffeescript\")))\n; CSS: Text.Cassius, Text.Lucius\n(quasiquote\n  (quoter) @_name\n  (#any-of? @_name \"cassius\" \"lucius\")\n  (quasiquote_body) @injection.content\n  (#set! injection.language \"css\"))\n\n; HTML: Text.Hamlet\n(quasiquote\n  (quoter) @_name\n  (#any-of? @_name \"shamlet\" \"xshamlet\" \"hamlet\" \"xhamlet\" \"ihamlet\")\n  (quasiquote_body) @injection.content\n  (#set! injection.language \"html\"))\n\n; JS: Text.Julius\n(quasiquote\n  (quoter) @_name\n  (#any-of? @_name \"js\" \"julius\")\n  (quasiquote_body) @injection.content\n  (#set! injection.language \"javascript\"))\n\n; TS: Text.TypeScript\n(quasiquote\n  (quoter) @_name\n  (#any-of? @_name \"tsc\" \"tscJSX\")\n  (quasiquote_body) @injection.content\n  (#set! injection.language \"typescript\"))\n\n; -----------------------------------------------------------------------------\n; HSX\n(quasiquote\n  (quoter) @_name\n  (#eq? @_name \"hsx\")\n  (quasiquote_body) @injection.content\n  (#set! injection.language \"html\"))\n\n; -----------------------------------------------------------------------------\n; Inline JSON from aeson\n(quasiquote\n  (quoter) @_name\n  (#eq? @_name \"aesonQQ\")\n  (quasiquote_body) @injection.content\n  (#set! injection.language \"json\"))\n\n; -----------------------------------------------------------------------------\n; SQL\n; postgresql-simple\n(quasiquote\n  (quoter) @injection.language\n  (#eq? @injection.language \"sql\")\n  (quasiquote_body) @injection.content)\n\n(quasiquote\n  (quoter) @_name\n  (#any-of? @_name \"persistUpperCase\" \"persistLowerCase\" \"persistWith\")\n  (quasiquote_body) @injection.content\n  (#set! injection.language \"haskell_persistent\"))\n"
  },
  {
    "path": "queries/locals.scm",
    "content": "(signature name: (variable)) @local.definition\n(function name: (variable)) @local.definition\n(pattern/variable) @local.definition\n(expression/variable) @local.reference\n"
  },
  {
    "path": "setup.py",
    "content": "from os.path import isdir, join\nfrom platform import system\n\nfrom setuptools import Extension, find_packages, setup\nfrom setuptools.command.build import build\nfrom wheel.bdist_wheel import bdist_wheel\n\n\nclass Build(build):\n    def run(self):\n        if isdir(\"queries\"):\n            dest = join(self.build_lib, \"tree_sitter_haskell\", \"queries\")\n            self.copy_tree(\"queries\", dest)\n        super().run()\n\n\nclass BdistWheel(bdist_wheel):\n    def get_tag(self):\n        python, abi, platform = super().get_tag()\n        if python.startswith(\"cp\"):\n            python, abi = \"cp39\", \"abi3\"\n        return python, abi, platform\n\n\nsetup(\n    packages=find_packages(\"bindings/python\"),\n    package_dir={\"\": \"bindings/python\"},\n    package_data={\n        \"tree_sitter_haskell\": [\"*.pyi\", \"py.typed\"],\n        \"tree_sitter_haskell.queries\": [\"*.scm\"],\n    },\n    ext_package=\"tree_sitter_haskell\",\n    ext_modules=[\n        Extension(\n            name=\"_binding\",\n            sources=[\n                \"bindings/python/tree_sitter_haskell/binding.c\",\n                \"src/parser.c\",\n                \"src/scanner.c\",\n            ],\n            extra_compile_args=[\n                \"-std=c11\",\n                \"-fvisibility=hidden\",\n            ] if system() != \"Windows\" else [\n                \"/std:c11\",\n                \"/utf-8\",\n            ],\n            define_macros=[\n                (\"Py_LIMITED_API\", \"0x03090000\"),\n                (\"PY_SSIZE_T_CLEAN\", None),\n                (\"TREE_SITTER_HIDE_SYMBOLS\", None),\n            ],\n            include_dirs=[\"src\"],\n            py_limited_api=True,\n        )\n    ],\n    cmdclass={\n        \"build\": Build,\n        \"bdist_wheel\": BdistWheel\n    },\n    zip_safe=False\n)\n"
  },
  {
    "path": "src/grammar.json",
    "content": "{\n  \"$schema\": \"https://tree-sitter.github.io/tree-sitter/assets/schemas/grammar.schema.json\",\n  \"name\": \"haskell\",\n  \"word\": \"variable\",\n  \"rules\": {\n    \"haskell\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"CHOICE\",\n          \"members\": [\n            {\n              \"type\": \"SYMBOL\",\n              \"name\": \"header\"\n            },\n            {\n              \"type\": \"BLANK\"\n            }\n          ]\n        },\n        {\n          \"type\": \"CHOICE\",\n          \"members\": [\n            {\n              \"type\": \"SYMBOL\",\n              \"name\": \"_body\"\n            },\n            {\n              \"type\": \"BLANK\"\n            }\n          ]\n        }\n      ]\n    },\n    \"generator\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"FIELD\",\n          \"name\": \"pattern\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_pat\"\n          }\n        },\n        {\n          \"type\": \"FIELD\",\n          \"name\": \"arrow\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_larrow\"\n          }\n        },\n        {\n          \"type\": \"FIELD\",\n          \"name\": \"expression\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_exp\"\n          }\n        }\n      ]\n    },\n    \"_let_binds\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"CHOICE\",\n          \"members\": [\n            {\n              \"type\": \"SYMBOL\",\n              \"name\": \"_cmd_layout_start_let\"\n            },\n            {\n              \"type\": \"ALIAS\",\n              \"content\": {\n                \"type\": \"SYMBOL\",\n                \"name\": \"_cmd_layout_start_explicit\"\n              },\n              \"named\": false,\n              \"value\": \"{\"\n            }\n          ]\n        },\n        {\n          \"type\": \"CHOICE\",\n          \"members\": [\n            {\n              \"type\": \"SEQ\",\n              \"members\": [\n                {\n                  \"type\": \"CHOICE\",\n                  \"members\": [\n                    {\n                      \"type\": \"CHOICE\",\n                      \"members\": [\n                        {\n                          \"type\": \"REPEAT1\",\n                          \"content\": {\n                            \"type\": \"STRING\",\n                            \"value\": \";\"\n                          }\n                        },\n                        {\n                          \"type\": \"SYMBOL\",\n                          \"name\": \"_cond_layout_semicolon\"\n                        }\n                      ]\n                    },\n                    {\n                      \"type\": \"BLANK\"\n                    }\n                  ]\n                },\n                {\n                  \"type\": \"SEQ\",\n                  \"members\": [\n                    {\n                      \"type\": \"FIELD\",\n                      \"name\": \"decl\",\n                      \"content\": {\n                        \"type\": \"SYMBOL\",\n                        \"name\": \"decl\"\n                      }\n                    },\n                    {\n                      \"type\": \"REPEAT\",\n                      \"content\": {\n                        \"type\": \"SEQ\",\n                        \"members\": [\n                          {\n                            \"type\": \"CHOICE\",\n                            \"members\": [\n                              {\n                                \"type\": \"REPEAT1\",\n                                \"content\": {\n                                  \"type\": \"STRING\",\n                                  \"value\": \";\"\n                                }\n                              },\n                              {\n                                \"type\": \"SYMBOL\",\n                                \"name\": \"_cond_layout_semicolon\"\n                              }\n                            ]\n                          },\n                          {\n                            \"type\": \"FIELD\",\n                            \"name\": \"decl\",\n                            \"content\": {\n                              \"type\": \"SYMBOL\",\n                              \"name\": \"decl\"\n                            }\n                          }\n                        ]\n                      }\n                    }\n                  ]\n                },\n                {\n                  \"type\": \"CHOICE\",\n                  \"members\": [\n                    {\n                      \"type\": \"CHOICE\",\n                      \"members\": [\n                        {\n                          \"type\": \"REPEAT1\",\n                          \"content\": {\n                            \"type\": \"STRING\",\n                            \"value\": \";\"\n                          }\n                        },\n                        {\n                          \"type\": \"SYMBOL\",\n                          \"name\": \"_cond_layout_semicolon\"\n                        }\n                      ]\n                    },\n                    {\n                      \"type\": \"BLANK\"\n                    }\n                  ]\n                }\n              ]\n            },\n            {\n              \"type\": \"BLANK\"\n            }\n          ]\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_layout_end\"\n        }\n      ]\n    },\n    \"_let\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"STRING\",\n          \"value\": \"let\"\n        },\n        {\n          \"type\": \"CHOICE\",\n          \"members\": [\n            {\n              \"type\": \"FIELD\",\n              \"name\": \"binds\",\n              \"content\": {\n                \"type\": \"ALIAS\",\n                \"content\": {\n                  \"type\": \"SYMBOL\",\n                  \"name\": \"_let_binds\"\n                },\n                \"named\": true,\n                \"value\": \"local_binds\"\n              }\n            },\n            {\n              \"type\": \"BLANK\"\n            }\n          ]\n        }\n      ]\n    },\n    \"let\": {\n      \"type\": \"SYMBOL\",\n      \"name\": \"_let\"\n    },\n    \"guard\": {\n      \"type\": \"CHOICE\",\n      \"members\": [\n        {\n          \"type\": \"ALIAS\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"generator\"\n          },\n          \"named\": true,\n          \"value\": \"pattern_guard\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"let\"\n        },\n        {\n          \"type\": \"ALIAS\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_exp\"\n          },\n          \"named\": true,\n          \"value\": \"boolean\"\n        }\n      ]\n    },\n    \"guards\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"FIELD\",\n          \"name\": \"guard\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"guard\"\n          }\n        },\n        {\n          \"type\": \"REPEAT\",\n          \"content\": {\n            \"type\": \"SEQ\",\n            \"members\": [\n              {\n                \"type\": \"STRING\",\n                \"value\": \",\"\n              },\n              {\n                \"type\": \"FIELD\",\n                \"name\": \"guard\",\n                \"content\": {\n                  \"type\": \"SYMBOL\",\n                  \"name\": \"guard\"\n                }\n              }\n            ]\n          }\n        }\n      ]\n    },\n    \"_guards\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_bar\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_cmd_texp_start\"\n        },\n        {\n          \"type\": \"FIELD\",\n          \"name\": \"guards\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"guards\"\n          }\n        }\n      ]\n    },\n    \"_universal\": {\n      \"type\": \"CHOICE\",\n      \"members\": [\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"splice\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"quasiquote\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"literal\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_unit_cons\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_tuple_cons\"\n        }\n      ]\n    },\n    \"_inferred_tyvar\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"STRING\",\n          \"value\": \"{\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_cmd_brace_open\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_ktype_param\"\n        },\n        {\n          \"type\": \"STRING\",\n          \"value\": \"}\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_cmd_brace_close\"\n        }\n      ]\n    },\n    \"_type_param_parens\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_paren_open\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_ktype_param\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_paren_close\"\n        }\n      ]\n    },\n    \"_type_param_wildcard\": {\n      \"type\": \"STRING\",\n      \"value\": \"_\"\n    },\n    \"_type_param_annotated\": {\n      \"type\": \"PREC\",\n      \"value\": \"annotated\",\n      \"content\": {\n        \"type\": \"SEQ\",\n        \"members\": [\n          {\n            \"type\": \"SYMBOL\",\n            \"name\": \"type_param\"\n          },\n          {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_kind_annotation\"\n          }\n        ]\n      }\n    },\n    \"_type_param_invisible\": {\n      \"type\": \"PREC\",\n      \"value\": \"prefix\",\n      \"content\": {\n        \"type\": \"SEQ\",\n        \"members\": [\n          {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_prefix_at\"\n          },\n          {\n            \"type\": \"FIELD\",\n            \"name\": \"bind\",\n            \"content\": {\n              \"type\": \"SYMBOL\",\n              \"name\": \"type_param\"\n            }\n          }\n        ]\n      }\n    },\n    \"type_param\": {\n      \"type\": \"CHOICE\",\n      \"members\": [\n        {\n          \"type\": \"ALIAS\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_type_param_wildcard\"\n          },\n          \"named\": true,\n          \"value\": \"wildcard\"\n        },\n        {\n          \"type\": \"ALIAS\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_type_param_invisible\"\n          },\n          \"named\": true,\n          \"value\": \"invisible\"\n        },\n        {\n          \"type\": \"ALIAS\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_type_param_parens\"\n          },\n          \"named\": true,\n          \"value\": \"parens\"\n        },\n        {\n          \"type\": \"FIELD\",\n          \"name\": \"bind\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"variable\"\n          }\n        }\n      ]\n    },\n    \"_ktype_param\": {\n      \"type\": \"CHOICE\",\n      \"members\": [\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"type_param\"\n        },\n        {\n          \"type\": \"ALIAS\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_type_param_annotated\"\n          },\n          \"named\": true,\n          \"value\": \"annotated\"\n        }\n      ]\n    },\n    \"type_params\": {\n      \"type\": \"REPEAT1\",\n      \"content\": {\n        \"type\": \"PREC\",\n        \"value\": \"patterns\",\n        \"content\": {\n          \"type\": \"SYMBOL\",\n          \"name\": \"type_param\"\n        }\n      }\n    },\n    \"quantified_variables\": {\n      \"type\": \"REPEAT1\",\n      \"content\": {\n        \"type\": \"CHOICE\",\n        \"members\": [\n          {\n            \"type\": \"SYMBOL\",\n            \"name\": \"type_param\"\n          },\n          {\n            \"type\": \"ALIAS\",\n            \"content\": {\n              \"type\": \"SYMBOL\",\n              \"name\": \"_inferred_tyvar\"\n            },\n            \"named\": true,\n            \"value\": \"inferred\"\n          }\n        ]\n      }\n    },\n    \"_type_parens\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_paren_open\"\n        },\n        {\n          \"type\": \"FIELD\",\n          \"name\": \"type\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_ktype\"\n          }\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_paren_close\"\n        }\n      ]\n    },\n    \"_type_tuple_elems\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"FIELD\",\n          \"name\": \"element\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_ktype\"\n          }\n        },\n        {\n          \"type\": \"REPEAT1\",\n          \"content\": {\n            \"type\": \"SEQ\",\n            \"members\": [\n              {\n                \"type\": \"STRING\",\n                \"value\": \",\"\n              },\n              {\n                \"type\": \"FIELD\",\n                \"name\": \"element\",\n                \"content\": {\n                  \"type\": \"SYMBOL\",\n                  \"name\": \"_ktype\"\n                }\n              }\n            ]\n          }\n        }\n      ]\n    },\n    \"_type_tuple\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_paren_open\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_type_tuple_elems\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_paren_close\"\n        }\n      ]\n    },\n    \"_type_unboxed_tuple\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_unboxed_open\"\n        },\n        {\n          \"type\": \"SEQ\",\n          \"members\": [\n            {\n              \"type\": \"FIELD\",\n              \"name\": \"element\",\n              \"content\": {\n                \"type\": \"SYMBOL\",\n                \"name\": \"_ktype\"\n              }\n            },\n            {\n              \"type\": \"REPEAT\",\n              \"content\": {\n                \"type\": \"SEQ\",\n                \"members\": [\n                  {\n                    \"type\": \"STRING\",\n                    \"value\": \",\"\n                  },\n                  {\n                    \"type\": \"FIELD\",\n                    \"name\": \"element\",\n                    \"content\": {\n                      \"type\": \"SYMBOL\",\n                      \"name\": \"_ktype\"\n                    }\n                  }\n                ]\n              }\n            }\n          ]\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_unboxed_close\"\n        }\n      ]\n    },\n    \"_type_unboxed_sum\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_unboxed_open\"\n        },\n        {\n          \"type\": \"SEQ\",\n          \"members\": [\n            {\n              \"type\": \"FIELD\",\n              \"name\": \"element\",\n              \"content\": {\n                \"type\": \"SYMBOL\",\n                \"name\": \"_ktype\"\n              }\n            },\n            {\n              \"type\": \"REPEAT1\",\n              \"content\": {\n                \"type\": \"SEQ\",\n                \"members\": [\n                  {\n                    \"type\": \"SYMBOL\",\n                    \"name\": \"_unboxed_bar\"\n                  },\n                  {\n                    \"type\": \"FIELD\",\n                    \"name\": \"element\",\n                    \"content\": {\n                      \"type\": \"SYMBOL\",\n                      \"name\": \"_ktype\"\n                    }\n                  }\n                ]\n              }\n            }\n          ]\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_unboxed_close\"\n        }\n      ]\n    },\n    \"_type_list\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_bracket_open\"\n        },\n        {\n          \"type\": \"SEQ\",\n          \"members\": [\n            {\n              \"type\": \"FIELD\",\n              \"name\": \"element\",\n              \"content\": {\n                \"type\": \"SYMBOL\",\n                \"name\": \"_ktype\"\n              }\n            },\n            {\n              \"type\": \"REPEAT\",\n              \"content\": {\n                \"type\": \"SEQ\",\n                \"members\": [\n                  {\n                    \"type\": \"STRING\",\n                    \"value\": \",\"\n                  },\n                  {\n                    \"type\": \"FIELD\",\n                    \"name\": \"element\",\n                    \"content\": {\n                      \"type\": \"SYMBOL\",\n                      \"name\": \"_ktype\"\n                    }\n                  }\n                ]\n              }\n            }\n          ]\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_bracket_close\"\n        }\n      ]\n    },\n    \"_type_promoted\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"STRING\",\n          \"value\": \"'\"\n        },\n        {\n          \"type\": \"CHOICE\",\n          \"members\": [\n            {\n              \"type\": \"ALIAS\",\n              \"content\": {\n                \"type\": \"SYMBOL\",\n                \"name\": \"_plist\"\n              },\n              \"named\": true,\n              \"value\": \"empty_list\"\n            },\n            {\n              \"type\": \"ALIAS\",\n              \"content\": {\n                \"type\": \"SYMBOL\",\n                \"name\": \"_type_tuple\"\n              },\n              \"named\": true,\n              \"value\": \"tuple\"\n            },\n            {\n              \"type\": \"ALIAS\",\n              \"content\": {\n                \"type\": \"SYMBOL\",\n                \"name\": \"_type_list\"\n              },\n              \"named\": true,\n              \"value\": \"list\"\n            },\n            {\n              \"type\": \"SYMBOL\",\n              \"name\": \"prefix_tuple\"\n            },\n            {\n              \"type\": \"SYMBOL\",\n              \"name\": \"unit\"\n            }\n          ]\n        }\n      ]\n    },\n    \"_type_name\": {\n      \"type\": \"CHOICE\",\n      \"members\": [\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"variable\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_promoted_tycons\"\n        },\n        {\n          \"type\": \"PREC\",\n          \"value\": \"type-name\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_tycons\"\n          }\n        }\n      ]\n    },\n    \"_type_star\": {\n      \"type\": \"CHOICE\",\n      \"members\": [\n        {\n          \"type\": \"STRING\",\n          \"value\": \"*\"\n        },\n        {\n          \"type\": \"STRING\",\n          \"value\": \"★\"\n        }\n      ]\n    },\n    \"_type_wildcard\": {\n      \"type\": \"STRING\",\n      \"value\": \"_\"\n    },\n    \"_at_type\": {\n      \"type\": \"PREC\",\n      \"value\": \"prefix\",\n      \"content\": {\n        \"type\": \"SEQ\",\n        \"members\": [\n          {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_prefix_at\"\n          },\n          {\n            \"type\": \"FIELD\",\n            \"name\": \"type\",\n            \"content\": {\n              \"type\": \"SYMBOL\",\n              \"name\": \"type\"\n            }\n          }\n        ]\n      }\n    },\n    \"_type_apply_arg\": {\n      \"type\": \"CHOICE\",\n      \"members\": [\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"type\"\n        },\n        {\n          \"type\": \"ALIAS\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_at_type\"\n          },\n          \"named\": true,\n          \"value\": \"kind_application\"\n        }\n      ]\n    },\n    \"_type_apply\": {\n      \"type\": \"PREC_LEFT\",\n      \"value\": \"apply\",\n      \"content\": {\n        \"type\": \"SEQ\",\n        \"members\": [\n          {\n            \"type\": \"FIELD\",\n            \"name\": \"constructor\",\n            \"content\": {\n              \"type\": \"SYMBOL\",\n              \"name\": \"type\"\n            }\n          },\n          {\n            \"type\": \"FIELD\",\n            \"name\": \"argument\",\n            \"content\": {\n              \"type\": \"SYMBOL\",\n              \"name\": \"_type_apply_arg\"\n            }\n          }\n        ]\n      }\n    },\n    \"_type_infix\": {\n      \"type\": \"PREC_RIGHT\",\n      \"value\": \"infix\",\n      \"content\": {\n        \"type\": \"SEQ\",\n        \"members\": [\n          {\n            \"type\": \"FIELD\",\n            \"name\": \"left_operand\",\n            \"content\": {\n              \"type\": \"SYMBOL\",\n              \"name\": \"type\"\n            }\n          },\n          {\n            \"type\": \"FIELD\",\n            \"name\": \"operator\",\n            \"content\": {\n              \"type\": \"SYMBOL\",\n              \"name\": \"_tyops\"\n            }\n          },\n          {\n            \"type\": \"FIELD\",\n            \"name\": \"right_operand\",\n            \"content\": {\n              \"type\": \"SYMBOL\",\n              \"name\": \"type\"\n            }\n          }\n        ]\n      }\n    },\n    \"type\": {\n      \"type\": \"CHOICE\",\n      \"members\": [\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_type_name\"\n        },\n        {\n          \"type\": \"ALIAS\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_type_star\"\n          },\n          \"named\": true,\n          \"value\": \"star\"\n        },\n        {\n          \"type\": \"ALIAS\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_type_wildcard\"\n          },\n          \"named\": true,\n          \"value\": \"wildcard\"\n        },\n        {\n          \"type\": \"ALIAS\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_type_parens\"\n          },\n          \"named\": true,\n          \"value\": \"parens\"\n        },\n        {\n          \"type\": \"ALIAS\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_type_promoted\"\n          },\n          \"named\": true,\n          \"value\": \"promoted\"\n        },\n        {\n          \"type\": \"ALIAS\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_type_list\"\n          },\n          \"named\": true,\n          \"value\": \"list\"\n        },\n        {\n          \"type\": \"ALIAS\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_plist\"\n          },\n          \"named\": true,\n          \"value\": \"prefix_list\"\n        },\n        {\n          \"type\": \"ALIAS\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_type_unboxed_tuple\"\n          },\n          \"named\": true,\n          \"value\": \"unboxed_tuple\"\n        },\n        {\n          \"type\": \"ALIAS\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_type_unboxed_sum\"\n          },\n          \"named\": true,\n          \"value\": \"unboxed_sum\"\n        },\n        {\n          \"type\": \"ALIAS\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_type_tuple\"\n          },\n          \"named\": true,\n          \"value\": \"tuple\"\n        },\n        {\n          \"type\": \"ALIAS\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_type_infix\"\n          },\n          \"named\": true,\n          \"value\": \"infix\"\n        },\n        {\n          \"type\": \"ALIAS\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_type_apply\"\n          },\n          \"named\": true,\n          \"value\": \"apply\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_universal\"\n        }\n      ]\n    },\n    \"_forall_keyword\": {\n      \"type\": \"CHOICE\",\n      \"members\": [\n        {\n          \"type\": \"STRING\",\n          \"value\": \"forall\"\n        },\n        {\n          \"type\": \"STRING\",\n          \"value\": \"∀\"\n        }\n      ]\n    },\n    \"_forall_body\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"FIELD\",\n          \"name\": \"quantifier\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_forall_keyword\"\n          }\n        },\n        {\n          \"type\": \"CHOICE\",\n          \"members\": [\n            {\n              \"type\": \"FIELD\",\n              \"name\": \"variables\",\n              \"content\": {\n                \"type\": \"SYMBOL\",\n                \"name\": \"quantified_variables\"\n              }\n            },\n            {\n              \"type\": \"BLANK\"\n            }\n          ]\n        }\n      ]\n    },\n    \"forall\": {\n      \"type\": \"PREC\",\n      \"value\": \"qtype-single\",\n      \"content\": {\n        \"type\": \"SEQ\",\n        \"members\": [\n          {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_forall_body\"\n          },\n          {\n            \"type\": \"STRING\",\n            \"value\": \".\"\n          }\n        ]\n      }\n    },\n    \"forall_required\": {\n      \"type\": \"PREC\",\n      \"value\": \"qtype-single\",\n      \"content\": {\n        \"type\": \"SEQ\",\n        \"members\": [\n          {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_forall_body\"\n          },\n          {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_arrow\"\n          }\n        ]\n      }\n    },\n    \"_forall\": {\n      \"type\": \"CHOICE\",\n      \"members\": [\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"forall\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"forall_required\"\n        }\n      ]\n    },\n    \"_qtype_forall\": {\n      \"type\": \"PREC_RIGHT\",\n      \"value\": \"qtype-curried\",\n      \"content\": {\n        \"type\": \"SEQ\",\n        \"members\": [\n          {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_forall_body\"\n          },\n          {\n            \"type\": \"STRING\",\n            \"value\": \".\"\n          },\n          {\n            \"type\": \"FIELD\",\n            \"name\": \"type\",\n            \"content\": {\n              \"type\": \"SYMBOL\",\n              \"name\": \"quantified_type\"\n            }\n          }\n        ]\n      }\n    },\n    \"_qtype_forall_required\": {\n      \"type\": \"PREC_RIGHT\",\n      \"value\": \"qtype-curried\",\n      \"content\": {\n        \"type\": \"SEQ\",\n        \"members\": [\n          {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_forall_body\"\n          },\n          {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_arrow\"\n          },\n          {\n            \"type\": \"FIELD\",\n            \"name\": \"type\",\n            \"content\": {\n              \"type\": \"SYMBOL\",\n              \"name\": \"quantified_type\"\n            }\n          }\n        ]\n      }\n    },\n    \"_fun_arrow\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"CHOICE\",\n          \"members\": [\n            {\n              \"type\": \"SYMBOL\",\n              \"name\": \"_phantom_arrow\"\n            },\n            {\n              \"type\": \"BLANK\"\n            }\n          ]\n        },\n        {\n          \"type\": \"FIELD\",\n          \"name\": \"arrow\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_arrow\"\n          }\n        }\n      ]\n    },\n    \"modifier\": {\n      \"type\": \"PREC\",\n      \"value\": \"prefix\",\n      \"content\": {\n        \"type\": \"SEQ\",\n        \"members\": [\n          {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_prefix_percent\"\n          },\n          {\n            \"type\": \"SYMBOL\",\n            \"name\": \"type\"\n          }\n        ]\n      }\n    },\n    \"_linear_fun_arrow\": {\n      \"type\": \"CHOICE\",\n      \"members\": [\n        {\n          \"type\": \"SEQ\",\n          \"members\": [\n            {\n              \"type\": \"FIELD\",\n              \"name\": \"multiplicity\",\n              \"content\": {\n                \"type\": \"SYMBOL\",\n                \"name\": \"modifier\"\n              }\n            },\n            {\n              \"type\": \"SYMBOL\",\n              \"name\": \"_fun_arrow\"\n            }\n          ]\n        },\n        {\n          \"type\": \"SEQ\",\n          \"members\": [\n            {\n              \"type\": \"CHOICE\",\n              \"members\": [\n                {\n                  \"type\": \"SYMBOL\",\n                  \"name\": \"_phantom_arrow\"\n                },\n                {\n                  \"type\": \"BLANK\"\n                }\n              ]\n            },\n            {\n              \"type\": \"FIELD\",\n              \"name\": \"arrow\",\n              \"content\": {\n                \"type\": \"SYMBOL\",\n                \"name\": \"_linear_arrow\"\n              }\n            }\n          ]\n        }\n      ]\n    },\n    \"strict_field\": {\n      \"type\": \"PREC\",\n      \"value\": \"prefix\",\n      \"content\": {\n        \"type\": \"SEQ\",\n        \"members\": [\n          {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_any_prefix_bang\"\n          },\n          {\n            \"type\": \"FIELD\",\n            \"name\": \"type\",\n            \"content\": {\n              \"type\": \"SYMBOL\",\n              \"name\": \"type\"\n            }\n          }\n        ]\n      }\n    },\n    \"lazy_field\": {\n      \"type\": \"PREC\",\n      \"value\": \"prefix\",\n      \"content\": {\n        \"type\": \"SEQ\",\n        \"members\": [\n          {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_any_prefix_tilde\"\n          },\n          {\n            \"type\": \"FIELD\",\n            \"name\": \"type\",\n            \"content\": {\n              \"type\": \"SYMBOL\",\n              \"name\": \"type\"\n            }\n          }\n        ]\n      }\n    },\n    \"_parameter_type\": {\n      \"type\": \"FIELD\",\n      \"name\": \"parameter\",\n      \"content\": {\n        \"type\": \"CHOICE\",\n        \"members\": [\n          {\n            \"type\": \"SYMBOL\",\n            \"name\": \"strict_field\"\n          },\n          {\n            \"type\": \"SYMBOL\",\n            \"name\": \"lazy_field\"\n          },\n          {\n            \"type\": \"SYMBOL\",\n            \"name\": \"quantified_type\"\n          }\n        ]\n      }\n    },\n    \"_qtype_function\": {\n      \"type\": \"PREC_RIGHT\",\n      \"value\": 0,\n      \"content\": {\n        \"type\": \"SEQ\",\n        \"members\": [\n          {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_parameter_type\"\n          },\n          {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_fun_arrow\"\n          },\n          {\n            \"type\": \"FIELD\",\n            \"name\": \"result\",\n            \"content\": {\n              \"type\": \"SYMBOL\",\n              \"name\": \"quantified_type\"\n            }\n          }\n        ]\n      }\n    },\n    \"_qtype_linear_function\": {\n      \"type\": \"PREC_RIGHT\",\n      \"value\": 0,\n      \"content\": {\n        \"type\": \"SEQ\",\n        \"members\": [\n          {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_parameter_type\"\n          },\n          {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_linear_fun_arrow\"\n          },\n          {\n            \"type\": \"FIELD\",\n            \"name\": \"result\",\n            \"content\": {\n              \"type\": \"SYMBOL\",\n              \"name\": \"quantified_type\"\n            }\n          }\n        ]\n      }\n    },\n    \"_qtype_context\": {\n      \"type\": \"PREC_RIGHT\",\n      \"value\": \"qtype-curried\",\n      \"content\": {\n        \"type\": \"SEQ\",\n        \"members\": [\n          {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_context_inline\"\n          },\n          {\n            \"type\": \"FIELD\",\n            \"name\": \"type\",\n            \"content\": {\n              \"type\": \"SYMBOL\",\n              \"name\": \"quantified_type\"\n            }\n          }\n        ]\n      }\n    },\n    \"quantified_type\": {\n      \"type\": \"CHOICE\",\n      \"members\": [\n        {\n          \"type\": \"ALIAS\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_qtype_function\"\n          },\n          \"named\": true,\n          \"value\": \"function\"\n        },\n        {\n          \"type\": \"ALIAS\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_qtype_linear_function\"\n          },\n          \"named\": true,\n          \"value\": \"linear_function\"\n        },\n        {\n          \"type\": \"ALIAS\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_qtype_forall\"\n          },\n          \"named\": true,\n          \"value\": \"forall\"\n        },\n        {\n          \"type\": \"ALIAS\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_qtype_forall_required\"\n          },\n          \"named\": true,\n          \"value\": \"forall_required\"\n        },\n        {\n          \"type\": \"ALIAS\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_qtype_context\"\n          },\n          \"named\": true,\n          \"value\": \"context\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"implicit_parameter\"\n        },\n        {\n          \"type\": \"PREC_RIGHT\",\n          \"value\": 0,\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"type\"\n          }\n        }\n      ]\n    },\n    \"_type_annotation\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_colon2\"\n        },\n        {\n          \"type\": \"FIELD\",\n          \"name\": \"type\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"quantified_type\"\n          }\n        }\n      ]\n    },\n    \"_kind_annotation\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_colon2\"\n        },\n        {\n          \"type\": \"FIELD\",\n          \"name\": \"kind\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"quantified_type\"\n          }\n        }\n      ]\n    },\n    \"_type_signature\": {\n      \"type\": \"PREC_RIGHT\",\n      \"value\": \"annotated\",\n      \"content\": {\n        \"type\": \"SEQ\",\n        \"members\": [\n          {\n            \"type\": \"FIELD\",\n            \"name\": \"type\",\n            \"content\": {\n              \"type\": \"SYMBOL\",\n              \"name\": \"quantified_type\"\n            }\n          },\n          {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_kind_annotation\"\n          }\n        ]\n      }\n    },\n    \"_ktype\": {\n      \"type\": \"CHOICE\",\n      \"members\": [\n        {\n          \"type\": \"ALIAS\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_type_signature\"\n          },\n          \"named\": true,\n          \"value\": \"signature\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"quantified_type\"\n        }\n      ]\n    },\n    \"_type_head_name\": {\n      \"type\": \"FIELD\",\n      \"name\": \"name\",\n      \"content\": {\n        \"type\": \"CHOICE\",\n        \"members\": [\n          {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_tycon\"\n          },\n          {\n            \"type\": \"SYMBOL\",\n            \"name\": \"unit\"\n          },\n          {\n            \"type\": \"ALIAS\",\n            \"content\": {\n              \"type\": \"SYMBOL\",\n              \"name\": \"_plist\"\n            },\n            \"named\": true,\n            \"value\": \"prefix_list\"\n          }\n        ]\n      }\n    },\n    \"_type_head_parens\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_paren_open\"\n        },\n        {\n          \"type\": \"CHOICE\",\n          \"members\": [\n            {\n              \"type\": \"SYMBOL\",\n              \"name\": \"_type_head\"\n            },\n            {\n              \"type\": \"SYMBOL\",\n              \"name\": \"_type_head_params\"\n            }\n          ]\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_paren_close\"\n        }\n      ]\n    },\n    \"_type_head_params\": {\n      \"type\": \"CHOICE\",\n      \"members\": [\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_type_head_name\"\n        },\n        {\n          \"type\": \"ALIAS\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_type_head_parens\"\n          },\n          \"named\": true,\n          \"value\": \"parens\"\n        }\n      ]\n    },\n    \"_type_head_infix\": {\n      \"type\": \"PREC\",\n      \"value\": \"infix\",\n      \"content\": {\n        \"type\": \"SEQ\",\n        \"members\": [\n          {\n            \"type\": \"FIELD\",\n            \"name\": \"left_operand\",\n            \"content\": {\n              \"type\": \"SYMBOL\",\n              \"name\": \"type_param\"\n            }\n          },\n          {\n            \"type\": \"FIELD\",\n            \"name\": \"operator\",\n            \"content\": {\n              \"type\": \"SYMBOL\",\n              \"name\": \"_tyconops\"\n            }\n          },\n          {\n            \"type\": \"FIELD\",\n            \"name\": \"right_operand\",\n            \"content\": {\n              \"type\": \"SYMBOL\",\n              \"name\": \"type_param\"\n            }\n          }\n        ]\n      }\n    },\n    \"_type_head\": {\n      \"type\": \"CHOICE\",\n      \"members\": [\n        {\n          \"type\": \"SEQ\",\n          \"members\": [\n            {\n              \"type\": \"SYMBOL\",\n              \"name\": \"_type_head_params\"\n            },\n            {\n              \"type\": \"CHOICE\",\n              \"members\": [\n                {\n                  \"type\": \"FIELD\",\n                  \"name\": \"patterns\",\n                  \"content\": {\n                    \"type\": \"SYMBOL\",\n                    \"name\": \"type_params\"\n                  }\n                },\n                {\n                  \"type\": \"BLANK\"\n                }\n              ]\n            }\n          ]\n        },\n        {\n          \"type\": \"ALIAS\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_type_head_infix\"\n          },\n          \"named\": true,\n          \"value\": \"infix\"\n        }\n      ]\n    },\n    \"_type_instance_head_parens\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_paren_open\"\n        },\n        {\n          \"type\": \"CHOICE\",\n          \"members\": [\n            {\n              \"type\": \"SYMBOL\",\n              \"name\": \"_type_instance_head\"\n            },\n            {\n              \"type\": \"SYMBOL\",\n              \"name\": \"_type_instance_head_params\"\n            }\n          ]\n        },\n        {\n          \"type\": \"CHOICE\",\n          \"members\": [\n            {\n              \"type\": \"SYMBOL\",\n              \"name\": \"_kind_annotation\"\n            },\n            {\n              \"type\": \"BLANK\"\n            }\n          ]\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_paren_close\"\n        }\n      ]\n    },\n    \"_type_instance_head_params\": {\n      \"type\": \"CHOICE\",\n      \"members\": [\n        {\n          \"type\": \"FIELD\",\n          \"name\": \"name\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_tycons\"\n          }\n        },\n        {\n          \"type\": \"ALIAS\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_type_instance_head_parens\"\n          },\n          \"named\": true,\n          \"value\": \"parens\"\n        }\n      ]\n    },\n    \"type_patterns\": {\n      \"type\": \"REPEAT1\",\n      \"content\": {\n        \"type\": \"PREC\",\n        \"value\": \"patterns\",\n        \"content\": {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_type_apply_arg\"\n        }\n      }\n    },\n    \"_type_instance_head\": {\n      \"type\": \"CHOICE\",\n      \"members\": [\n        {\n          \"type\": \"SEQ\",\n          \"members\": [\n            {\n              \"type\": \"SYMBOL\",\n              \"name\": \"_type_instance_head_params\"\n            },\n            {\n              \"type\": \"CHOICE\",\n              \"members\": [\n                {\n                  \"type\": \"FIELD\",\n                  \"name\": \"patterns\",\n                  \"content\": {\n                    \"type\": \"SYMBOL\",\n                    \"name\": \"type_patterns\"\n                  }\n                },\n                {\n                  \"type\": \"BLANK\"\n                }\n              ]\n            }\n          ]\n        },\n        {\n          \"type\": \"SEQ\",\n          \"members\": [\n            {\n              \"type\": \"SYMBOL\",\n              \"name\": \"_cond_infix\"\n            },\n            {\n              \"type\": \"ALIAS\",\n              \"content\": {\n                \"type\": \"SYMBOL\",\n                \"name\": \"_type_infix\"\n              },\n              \"named\": true,\n              \"value\": \"infix\"\n            }\n          ]\n        }\n      ]\n    },\n    \"type_synomym\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"STRING\",\n          \"value\": \"type\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_type_head\"\n        },\n        {\n          \"type\": \"STRING\",\n          \"value\": \"=\"\n        },\n        {\n          \"type\": \"FIELD\",\n          \"name\": \"type\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_ktype\"\n          }\n        }\n      ]\n    },\n    \"kind_signature\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"STRING\",\n          \"value\": \"type\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_type_head\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_kind_annotation\"\n        }\n      ]\n    },\n    \"_type_instance_common\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_type_instance_head\"\n        },\n        {\n          \"type\": \"STRING\",\n          \"value\": \"=\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"quantified_type\"\n        }\n      ]\n    },\n    \"_type_instance\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"CHOICE\",\n          \"members\": [\n            {\n              \"type\": \"FIELD\",\n              \"name\": \"forall\",\n              \"content\": {\n                \"type\": \"SYMBOL\",\n                \"name\": \"_forall\"\n              }\n            },\n            {\n              \"type\": \"BLANK\"\n            }\n          ]\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_type_instance_common\"\n        }\n      ]\n    },\n    \"type_instance\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"STRING\",\n          \"value\": \"type\"\n        },\n        {\n          \"type\": \"STRING\",\n          \"value\": \"instance\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_type_instance\"\n        }\n      ]\n    },\n    \"type_family_result\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"STRING\",\n          \"value\": \"=\"\n        },\n        {\n          \"type\": \"FIELD\",\n          \"name\": \"result\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"quantified_type\"\n          }\n        }\n      ]\n    },\n    \"type_family_injectivity\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_bar\"\n        },\n        {\n          \"type\": \"FIELD\",\n          \"name\": \"result\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"variable\"\n          }\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_arrow\"\n        },\n        {\n          \"type\": \"FIELD\",\n          \"name\": \"determined\",\n          \"content\": {\n            \"type\": \"REPEAT1\",\n            \"content\": {\n              \"type\": \"SYMBOL\",\n              \"name\": \"variable\"\n            }\n          }\n        }\n      ]\n    },\n    \"_tyfam_inj\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"type_family_result\"\n        },\n        {\n          \"type\": \"CHOICE\",\n          \"members\": [\n            {\n              \"type\": \"SYMBOL\",\n              \"name\": \"type_family_injectivity\"\n            },\n            {\n              \"type\": \"BLANK\"\n            }\n          ]\n        }\n      ]\n    },\n    \"_tyfam\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_type_head\"\n        },\n        {\n          \"type\": \"CHOICE\",\n          \"members\": [\n            {\n              \"type\": \"CHOICE\",\n              \"members\": [\n                {\n                  \"type\": \"SYMBOL\",\n                  \"name\": \"_kind_annotation\"\n                },\n                {\n                  \"type\": \"SYMBOL\",\n                  \"name\": \"_tyfam_inj\"\n                }\n              ]\n            },\n            {\n              \"type\": \"BLANK\"\n            }\n          ]\n        }\n      ]\n    },\n    \"_tyfam_equations\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"CHOICE\",\n          \"members\": [\n            {\n              \"type\": \"SYMBOL\",\n              \"name\": \"_cmd_layout_start\"\n            },\n            {\n              \"type\": \"ALIAS\",\n              \"content\": {\n                \"type\": \"SYMBOL\",\n                \"name\": \"_cmd_layout_start_explicit\"\n              },\n              \"named\": false,\n              \"value\": \"{\"\n            }\n          ]\n        },\n        {\n          \"type\": \"CHOICE\",\n          \"members\": [\n            {\n              \"type\": \"SEQ\",\n              \"members\": [\n                {\n                  \"type\": \"CHOICE\",\n                  \"members\": [\n                    {\n                      \"type\": \"CHOICE\",\n                      \"members\": [\n                        {\n                          \"type\": \"REPEAT1\",\n                          \"content\": {\n                            \"type\": \"STRING\",\n                            \"value\": \";\"\n                          }\n                        },\n                        {\n                          \"type\": \"SYMBOL\",\n                          \"name\": \"_cond_layout_semicolon\"\n                        }\n                      ]\n                    },\n                    {\n                      \"type\": \"BLANK\"\n                    }\n                  ]\n                },\n                {\n                  \"type\": \"SEQ\",\n                  \"members\": [\n                    {\n                      \"type\": \"FIELD\",\n                      \"name\": \"equation\",\n                      \"content\": {\n                        \"type\": \"ALIAS\",\n                        \"content\": {\n                          \"type\": \"SYMBOL\",\n                          \"name\": \"_type_instance\"\n                        },\n                        \"named\": true,\n                        \"value\": \"equation\"\n                      }\n                    },\n                    {\n                      \"type\": \"REPEAT\",\n                      \"content\": {\n                        \"type\": \"SEQ\",\n                        \"members\": [\n                          {\n                            \"type\": \"CHOICE\",\n                            \"members\": [\n                              {\n                                \"type\": \"REPEAT1\",\n                                \"content\": {\n                                  \"type\": \"STRING\",\n                                  \"value\": \";\"\n                                }\n                              },\n                              {\n                                \"type\": \"SYMBOL\",\n                                \"name\": \"_cond_layout_semicolon\"\n                              }\n                            ]\n                          },\n                          {\n                            \"type\": \"FIELD\",\n                            \"name\": \"equation\",\n                            \"content\": {\n                              \"type\": \"ALIAS\",\n                              \"content\": {\n                                \"type\": \"SYMBOL\",\n                                \"name\": \"_type_instance\"\n                              },\n                              \"named\": true,\n                              \"value\": \"equation\"\n                            }\n                          }\n                        ]\n                      }\n                    }\n                  ]\n                },\n                {\n                  \"type\": \"CHOICE\",\n                  \"members\": [\n                    {\n                      \"type\": \"CHOICE\",\n                      \"members\": [\n                        {\n                          \"type\": \"REPEAT1\",\n                          \"content\": {\n                            \"type\": \"STRING\",\n                            \"value\": \";\"\n                          }\n                        },\n                        {\n                          \"type\": \"SYMBOL\",\n                          \"name\": \"_cond_layout_semicolon\"\n                        }\n                      ]\n                    },\n                    {\n                      \"type\": \"BLANK\"\n                    }\n                  ]\n                }\n              ]\n            },\n            {\n              \"type\": \"BLANK\"\n            }\n          ]\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_layout_end\"\n        }\n      ]\n    },\n    \"abstract_family\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"CHOICE\",\n          \"members\": [\n            {\n              \"type\": \"SYMBOL\",\n              \"name\": \"_cmd_layout_start\"\n            },\n            {\n              \"type\": \"ALIAS\",\n              \"content\": {\n                \"type\": \"SYMBOL\",\n                \"name\": \"_cmd_layout_start_explicit\"\n              },\n              \"named\": false,\n              \"value\": \"{\"\n            }\n          ]\n        },\n        {\n          \"type\": \"STRING\",\n          \"value\": \"..\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_layout_end\"\n        }\n      ]\n    },\n    \"type_family\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"STRING\",\n          \"value\": \"type\"\n        },\n        {\n          \"type\": \"STRING\",\n          \"value\": \"family\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_tyfam\"\n        },\n        {\n          \"type\": \"CHOICE\",\n          \"members\": [\n            {\n              \"type\": \"SEQ\",\n              \"members\": [\n                {\n                  \"type\": \"SYMBOL\",\n                  \"name\": \"_where\"\n                },\n                {\n                  \"type\": \"CHOICE\",\n                  \"members\": [\n                    {\n                      \"type\": \"FIELD\",\n                      \"name\": \"closed_family\",\n                      \"content\": {\n                        \"type\": \"CHOICE\",\n                        \"members\": [\n                          {\n                            \"type\": \"ALIAS\",\n                            \"content\": {\n                              \"type\": \"SYMBOL\",\n                              \"name\": \"_tyfam_equations\"\n                            },\n                            \"named\": true,\n                            \"value\": \"equations\"\n                          },\n                          {\n                            \"type\": \"SYMBOL\",\n                            \"name\": \"abstract_family\"\n                          }\n                        ]\n                      }\n                    },\n                    {\n                      \"type\": \"BLANK\"\n                    }\n                  ]\n                }\n              ]\n            },\n            {\n              \"type\": \"BLANK\"\n            }\n          ]\n        }\n      ]\n    },\n    \"type_role\": {\n      \"type\": \"CHOICE\",\n      \"members\": [\n        {\n          \"type\": \"STRING\",\n          \"value\": \"representational\"\n        },\n        {\n          \"type\": \"STRING\",\n          \"value\": \"nominal\"\n        },\n        {\n          \"type\": \"STRING\",\n          \"value\": \"phantom\"\n        },\n        {\n          \"type\": \"STRING\",\n          \"value\": \"_\"\n        }\n      ]\n    },\n    \"role_annotation\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"STRING\",\n          \"value\": \"type\"\n        },\n        {\n          \"type\": \"STRING\",\n          \"value\": \"role\"\n        },\n        {\n          \"type\": \"FIELD\",\n          \"name\": \"type\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_tycons\"\n          }\n        },\n        {\n          \"type\": \"REPEAT1\",\n          \"content\": {\n            \"type\": \"FIELD\",\n            \"name\": \"role\",\n            \"content\": {\n              \"type\": \"SYMBOL\",\n              \"name\": \"type_role\"\n            }\n          }\n        }\n      ]\n    },\n    \"_class_apply\": {\n      \"type\": \"PREC_LEFT\",\n      \"value\": \"apply\",\n      \"content\": {\n        \"type\": \"SEQ\",\n        \"members\": [\n          {\n            \"type\": \"FIELD\",\n            \"name\": \"constructor\",\n            \"content\": {\n              \"type\": \"SYMBOL\",\n              \"name\": \"constraint\"\n            }\n          },\n          {\n            \"type\": \"FIELD\",\n            \"name\": \"argument\",\n            \"content\": {\n              \"type\": \"SYMBOL\",\n              \"name\": \"_type_apply_arg\"\n            }\n          }\n        ]\n      }\n    },\n    \"_class_infix\": {\n      \"type\": \"PREC_RIGHT\",\n      \"value\": \"infix\",\n      \"content\": {\n        \"type\": \"SEQ\",\n        \"members\": [\n          {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_cond_infix\"\n          },\n          {\n            \"type\": \"FIELD\",\n            \"name\": \"left_operand\",\n            \"content\": {\n              \"type\": \"SYMBOL\",\n              \"name\": \"type\"\n            }\n          },\n          {\n            \"type\": \"FIELD\",\n            \"name\": \"operator\",\n            \"content\": {\n              \"type\": \"SYMBOL\",\n              \"name\": \"_tyops\"\n            }\n          },\n          {\n            \"type\": \"FIELD\",\n            \"name\": \"right_operand\",\n            \"content\": {\n              \"type\": \"SYMBOL\",\n              \"name\": \"type\"\n            }\n          }\n        ]\n      }\n    },\n    \"_ctr_parens\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_paren_open\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"constraints\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_paren_close\"\n        }\n      ]\n    },\n    \"_ctr_tuple\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_paren_open\"\n        },\n        {\n          \"type\": \"SEQ\",\n          \"members\": [\n            {\n              \"type\": \"SYMBOL\",\n              \"name\": \"constraints\"\n            },\n            {\n              \"type\": \"REPEAT1\",\n              \"content\": {\n                \"type\": \"SEQ\",\n                \"members\": [\n                  {\n                    \"type\": \"STRING\",\n                    \"value\": \",\"\n                  },\n                  {\n                    \"type\": \"SYMBOL\",\n                    \"name\": \"constraints\"\n                  }\n                ]\n              }\n            }\n          ]\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_paren_close\"\n        }\n      ]\n    },\n    \"implicit_parameter\": {\n      \"type\": \"PREC_LEFT\",\n      \"value\": 0,\n      \"content\": {\n        \"type\": \"SEQ\",\n        \"members\": [\n          {\n            \"type\": \"FIELD\",\n            \"name\": \"name\",\n            \"content\": {\n              \"type\": \"SYMBOL\",\n              \"name\": \"implicit_variable\"\n            }\n          },\n          {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_type_annotation\"\n          }\n        ]\n      }\n    },\n    \"constraint\": {\n      \"type\": \"CHOICE\",\n      \"members\": [\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_type_name\"\n        },\n        {\n          \"type\": \"ALIAS\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_class_infix\"\n          },\n          \"named\": true,\n          \"value\": \"infix\"\n        },\n        {\n          \"type\": \"ALIAS\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_class_apply\"\n          },\n          \"named\": true,\n          \"value\": \"apply\"\n        },\n        {\n          \"type\": \"ALIAS\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_ctr_parens\"\n          },\n          \"named\": true,\n          \"value\": \"parens\"\n        },\n        {\n          \"type\": \"ALIAS\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_ctr_tuple\"\n          },\n          \"named\": true,\n          \"value\": \"tuple\"\n        },\n        {\n          \"type\": \"ALIAS\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_type_wildcard\"\n          },\n          \"named\": true,\n          \"value\": \"wildcard\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_universal\"\n        }\n      ]\n    },\n    \"_ctr_forall\": {\n      \"type\": \"PREC\",\n      \"value\": \"fun\",\n      \"content\": {\n        \"type\": \"SEQ\",\n        \"members\": [\n          {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_forall_body\"\n          },\n          {\n            \"type\": \"STRING\",\n            \"value\": \".\"\n          },\n          {\n            \"type\": \"FIELD\",\n            \"name\": \"constraint\",\n            \"content\": {\n              \"type\": \"SYMBOL\",\n              \"name\": \"constraints\"\n            }\n          }\n        ]\n      }\n    },\n    \"_ctr_context\": {\n      \"type\": \"PREC\",\n      \"value\": \"fun\",\n      \"content\": {\n        \"type\": \"SEQ\",\n        \"members\": [\n          {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_context_inline\"\n          },\n          {\n            \"type\": \"FIELD\",\n            \"name\": \"constraint\",\n            \"content\": {\n              \"type\": \"SYMBOL\",\n              \"name\": \"constraints\"\n            }\n          }\n        ]\n      }\n    },\n    \"_ctr_signature\": {\n      \"type\": \"PREC\",\n      \"value\": \"annotated\",\n      \"content\": {\n        \"type\": \"SEQ\",\n        \"members\": [\n          {\n            \"type\": \"FIELD\",\n            \"name\": \"constraint\",\n            \"content\": {\n              \"type\": \"SYMBOL\",\n              \"name\": \"constraints\"\n            }\n          },\n          {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_kind_annotation\"\n          }\n        ]\n      }\n    },\n    \"constraints\": {\n      \"type\": \"CHOICE\",\n      \"members\": [\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"constraint\"\n        },\n        {\n          \"type\": \"ALIAS\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_ctr_context\"\n          },\n          \"named\": true,\n          \"value\": \"context\"\n        },\n        {\n          \"type\": \"ALIAS\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_ctr_forall\"\n          },\n          \"named\": true,\n          \"value\": \"forall\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"implicit_parameter\"\n        },\n        {\n          \"type\": \"ALIAS\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_ctr_signature\"\n          },\n          \"named\": true,\n          \"value\": \"signature\"\n        }\n      ]\n    },\n    \"_context_inline\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_cond_context\"\n        },\n        {\n          \"type\": \"FIELD\",\n          \"name\": \"context\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"constraint\"\n          }\n        },\n        {\n          \"type\": \"FIELD\",\n          \"name\": \"arrow\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_carrow\"\n          }\n        }\n      ]\n    },\n    \"context\": {\n      \"type\": \"PREC\",\n      \"value\": \"qtype-single\",\n      \"content\": {\n        \"type\": \"SYMBOL\",\n        \"name\": \"_context_inline\"\n      }\n    },\n    \"_exp_name\": {\n      \"type\": \"CHOICE\",\n      \"members\": [\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_cons\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_vars\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"variable\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"implicit_variable\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"label\"\n        }\n      ]\n    },\n    \"_exp_th_quoted_name\": {\n      \"type\": \"CHOICE\",\n      \"members\": [\n        {\n          \"type\": \"SEQ\",\n          \"members\": [\n            {\n              \"type\": \"STRING\",\n              \"value\": \"'\"\n            },\n            {\n              \"type\": \"FIELD\",\n              \"name\": \"name\",\n              \"content\": {\n                \"type\": \"CHOICE\",\n                \"members\": [\n                  {\n                    \"type\": \"SYMBOL\",\n                    \"name\": \"_vars\"\n                  },\n                  {\n                    \"type\": \"SYMBOL\",\n                    \"name\": \"_cons\"\n                  }\n                ]\n              }\n            }\n          ]\n        },\n        {\n          \"type\": \"PREC\",\n          \"value\": \"prefix\",\n          \"content\": {\n            \"type\": \"SEQ\",\n            \"members\": [\n              {\n                \"type\": \"STRING\",\n                \"value\": \"''\"\n              },\n              {\n                \"type\": \"FIELD\",\n                \"name\": \"type\",\n                \"content\": {\n                  \"type\": \"SYMBOL\",\n                  \"name\": \"type\"\n                }\n              }\n            ]\n          }\n        }\n      ]\n    },\n    \"_exp_parens\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_paren_open\"\n        },\n        {\n          \"type\": \"FIELD\",\n          \"name\": \"expression\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_exp\"\n          }\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_paren_close\"\n        }\n      ]\n    },\n    \"_exp_tuple_elems\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"CHOICE\",\n          \"members\": [\n            {\n              \"type\": \"SEQ\",\n              \"members\": [\n                {\n                  \"type\": \"REPEAT1\",\n                  \"content\": {\n                    \"type\": \"STRING\",\n                    \"value\": \",\"\n                  }\n                },\n                {\n                  \"type\": \"FIELD\",\n                  \"name\": \"element\",\n                  \"content\": {\n                    \"type\": \"SYMBOL\",\n                    \"name\": \"_exp\"\n                  }\n                }\n              ]\n            },\n            {\n              \"type\": \"SEQ\",\n              \"members\": [\n                {\n                  \"type\": \"FIELD\",\n                  \"name\": \"element\",\n                  \"content\": {\n                    \"type\": \"SYMBOL\",\n                    \"name\": \"_exp\"\n                  }\n                },\n                {\n                  \"type\": \"STRING\",\n                  \"value\": \",\"\n                },\n                {\n                  \"type\": \"CHOICE\",\n                  \"members\": [\n                    {\n                      \"type\": \"FIELD\",\n                      \"name\": \"element\",\n                      \"content\": {\n                        \"type\": \"SYMBOL\",\n                        \"name\": \"_exp\"\n                      }\n                    },\n                    {\n                      \"type\": \"BLANK\"\n                    }\n                  ]\n                }\n              ]\n            }\n          ]\n        },\n        {\n          \"type\": \"REPEAT\",\n          \"content\": {\n            \"type\": \"SEQ\",\n            \"members\": [\n              {\n                \"type\": \"STRING\",\n                \"value\": \",\"\n              },\n              {\n                \"type\": \"CHOICE\",\n                \"members\": [\n                  {\n                    \"type\": \"FIELD\",\n                    \"name\": \"element\",\n                    \"content\": {\n                      \"type\": \"SYMBOL\",\n                      \"name\": \"_exp\"\n                    }\n                  },\n                  {\n                    \"type\": \"BLANK\"\n                  }\n                ]\n              }\n            ]\n          }\n        }\n      ]\n    },\n    \"_exp_tuple\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_paren_open\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_exp_tuple_elems\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_paren_close\"\n        }\n      ]\n    },\n    \"_exp_unboxed_tuple\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_unboxed_open\"\n        },\n        {\n          \"type\": \"REPEAT\",\n          \"content\": {\n            \"type\": \"STRING\",\n            \"value\": \",\"\n          }\n        },\n        {\n          \"type\": \"FIELD\",\n          \"name\": \"element\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_exp\"\n          }\n        },\n        {\n          \"type\": \"REPEAT\",\n          \"content\": {\n            \"type\": \"SEQ\",\n            \"members\": [\n              {\n                \"type\": \"STRING\",\n                \"value\": \",\"\n              },\n              {\n                \"type\": \"CHOICE\",\n                \"members\": [\n                  {\n                    \"type\": \"FIELD\",\n                    \"name\": \"element\",\n                    \"content\": {\n                      \"type\": \"SYMBOL\",\n                      \"name\": \"_exp\"\n                    }\n                  },\n                  {\n                    \"type\": \"BLANK\"\n                  }\n                ]\n              }\n            ]\n          }\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_unboxed_close\"\n        }\n      ]\n    },\n    \"_exp_unboxed_sum\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_unboxed_open\"\n        },\n        {\n          \"type\": \"CHOICE\",\n          \"members\": [\n            {\n              \"type\": \"SEQ\",\n              \"members\": [\n                {\n                  \"type\": \"REPEAT1\",\n                  \"content\": {\n                    \"type\": \"SYMBOL\",\n                    \"name\": \"_unboxed_bar\"\n                  }\n                },\n                {\n                  \"type\": \"FIELD\",\n                  \"name\": \"element\",\n                  \"content\": {\n                    \"type\": \"SYMBOL\",\n                    \"name\": \"_exp\"\n                  }\n                }\n              ]\n            },\n            {\n              \"type\": \"SEQ\",\n              \"members\": [\n                {\n                  \"type\": \"FIELD\",\n                  \"name\": \"element\",\n                  \"content\": {\n                    \"type\": \"SYMBOL\",\n                    \"name\": \"_exp\"\n                  }\n                },\n                {\n                  \"type\": \"SYMBOL\",\n                  \"name\": \"_unboxed_bar\"\n                }\n              ]\n            }\n          ]\n        },\n        {\n          \"type\": \"REPEAT\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_unboxed_bar\"\n          }\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_unboxed_close\"\n        }\n      ]\n    },\n    \"_exp_list\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_bracket_open\"\n        },\n        {\n          \"type\": \"SEQ\",\n          \"members\": [\n            {\n              \"type\": \"FIELD\",\n              \"name\": \"element\",\n              \"content\": {\n                \"type\": \"SYMBOL\",\n                \"name\": \"_exp\"\n              }\n            },\n            {\n              \"type\": \"REPEAT\",\n              \"content\": {\n                \"type\": \"SEQ\",\n                \"members\": [\n                  {\n                    \"type\": \"STRING\",\n                    \"value\": \",\"\n                  },\n                  {\n                    \"type\": \"FIELD\",\n                    \"name\": \"element\",\n                    \"content\": {\n                      \"type\": \"SYMBOL\",\n                      \"name\": \"_exp\"\n                    }\n                  }\n                ]\n              }\n            }\n          ]\n        },\n        {\n          \"type\": \"CHOICE\",\n          \"members\": [\n            {\n              \"type\": \"STRING\",\n              \"value\": \",\"\n            },\n            {\n              \"type\": \"BLANK\"\n            }\n          ]\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_bracket_close\"\n        }\n      ]\n    },\n    \"_exp_arithmetic_sequence\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_bracket_open\"\n        },\n        {\n          \"type\": \"FIELD\",\n          \"name\": \"from\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_exp\"\n          }\n        },\n        {\n          \"type\": \"CHOICE\",\n          \"members\": [\n            {\n              \"type\": \"SEQ\",\n              \"members\": [\n                {\n                  \"type\": \"STRING\",\n                  \"value\": \",\"\n                },\n                {\n                  \"type\": \"FIELD\",\n                  \"name\": \"step\",\n                  \"content\": {\n                    \"type\": \"SYMBOL\",\n                    \"name\": \"_exp\"\n                  }\n                }\n              ]\n            },\n            {\n              \"type\": \"BLANK\"\n            }\n          ]\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_dotdot\"\n        },\n        {\n          \"type\": \"CHOICE\",\n          \"members\": [\n            {\n              \"type\": \"FIELD\",\n              \"name\": \"to\",\n              \"content\": {\n                \"type\": \"SYMBOL\",\n                \"name\": \"_exp\"\n              }\n            },\n            {\n              \"type\": \"BLANK\"\n            }\n          ]\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_bracket_close\"\n        }\n      ]\n    },\n    \"group\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"STRING\",\n          \"value\": \"then\"\n        },\n        {\n          \"type\": \"STRING\",\n          \"value\": \"group\"\n        },\n        {\n          \"type\": \"CHOICE\",\n          \"members\": [\n            {\n              \"type\": \"SEQ\",\n              \"members\": [\n                {\n                  \"type\": \"STRING\",\n                  \"value\": \"by\"\n                },\n                {\n                  \"type\": \"FIELD\",\n                  \"name\": \"key\",\n                  \"content\": {\n                    \"type\": \"CHOICE\",\n                    \"members\": [\n                      {\n                        \"type\": \"ALIAS\",\n                        \"content\": {\n                          \"type\": \"SYMBOL\",\n                          \"name\": \"_exp_signature\"\n                        },\n                        \"named\": true,\n                        \"value\": \"signature\"\n                      },\n                      {\n                        \"type\": \"SYMBOL\",\n                        \"name\": \"expression\"\n                      }\n                    ]\n                  }\n                }\n              ]\n            },\n            {\n              \"type\": \"BLANK\"\n            }\n          ]\n        },\n        {\n          \"type\": \"STRING\",\n          \"value\": \"using\"\n        },\n        {\n          \"type\": \"FIELD\",\n          \"name\": \"classifier\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_exp\"\n          }\n        }\n      ]\n    },\n    \"transform\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"STRING\",\n          \"value\": \"then\"\n        },\n        {\n          \"type\": \"FIELD\",\n          \"name\": \"transformation\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_exp\"\n          }\n        },\n        {\n          \"type\": \"CHOICE\",\n          \"members\": [\n            {\n              \"type\": \"SEQ\",\n              \"members\": [\n                {\n                  \"type\": \"STRING\",\n                  \"value\": \"by\"\n                },\n                {\n                  \"type\": \"FIELD\",\n                  \"name\": \"key\",\n                  \"content\": {\n                    \"type\": \"SYMBOL\",\n                    \"name\": \"_exp\"\n                  }\n                }\n              ]\n            },\n            {\n              \"type\": \"BLANK\"\n            }\n          ]\n        }\n      ]\n    },\n    \"qualifier\": {\n      \"type\": \"CHOICE\",\n      \"members\": [\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"generator\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"let\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"transform\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"group\"\n        },\n        {\n          \"type\": \"ALIAS\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_exp\"\n          },\n          \"named\": true,\n          \"value\": \"boolean\"\n        }\n      ]\n    },\n    \"qualifiers\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"SEQ\",\n          \"members\": [\n            {\n              \"type\": \"FIELD\",\n              \"name\": \"qualifier\",\n              \"content\": {\n                \"type\": \"SYMBOL\",\n                \"name\": \"qualifier\"\n              }\n            },\n            {\n              \"type\": \"REPEAT\",\n              \"content\": {\n                \"type\": \"SEQ\",\n                \"members\": [\n                  {\n                    \"type\": \"STRING\",\n                    \"value\": \",\"\n                  },\n                  {\n                    \"type\": \"FIELD\",\n                    \"name\": \"qualifier\",\n                    \"content\": {\n                      \"type\": \"SYMBOL\",\n                      \"name\": \"qualifier\"\n                    }\n                  }\n                ]\n              }\n            }\n          ]\n        }\n      ]\n    },\n    \"_exp_list_comprehension\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_bracket_open\"\n        },\n        {\n          \"type\": \"FIELD\",\n          \"name\": \"expression\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_exp\"\n          }\n        },\n        {\n          \"type\": \"REPEAT1\",\n          \"content\": {\n            \"type\": \"SEQ\",\n            \"members\": [\n              {\n                \"type\": \"STRING\",\n                \"value\": \"|\"\n              },\n              {\n                \"type\": \"FIELD\",\n                \"name\": \"qualifiers\",\n                \"content\": {\n                  \"type\": \"SYMBOL\",\n                  \"name\": \"qualifiers\"\n                }\n              }\n            ]\n          }\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_bracket_close\"\n        }\n      ]\n    },\n    \"_exp_lambda\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"STRING\",\n          \"value\": \"\\\\\"\n        },\n        {\n          \"type\": \"FIELD\",\n          \"name\": \"patterns\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"patterns\"\n          }\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_arrow\"\n        },\n        {\n          \"type\": \"FIELD\",\n          \"name\": \"expression\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_exp\"\n          }\n        }\n      ]\n    },\n    \"_exp_let_in\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_let\"\n        },\n        {\n          \"type\": \"CHOICE\",\n          \"members\": [\n            {\n              \"type\": \"SYMBOL\",\n              \"name\": \"_phantom_in\"\n            },\n            {\n              \"type\": \"BLANK\"\n            }\n          ]\n        },\n        {\n          \"type\": \"STRING\",\n          \"value\": \"in\"\n        },\n        {\n          \"type\": \"FIELD\",\n          \"name\": \"expression\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_exp\"\n          }\n        }\n      ]\n    },\n    \"_exp_conditional\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"STRING\",\n          \"value\": \"if\"\n        },\n        {\n          \"type\": \"FIELD\",\n          \"name\": \"if\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_exp\"\n          }\n        },\n        {\n          \"type\": \"REPEAT\",\n          \"content\": {\n            \"type\": \"STRING\",\n            \"value\": \";\"\n          }\n        },\n        {\n          \"type\": \"STRING\",\n          \"value\": \"then\"\n        },\n        {\n          \"type\": \"FIELD\",\n          \"name\": \"then\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_exp\"\n          }\n        },\n        {\n          \"type\": \"REPEAT\",\n          \"content\": {\n            \"type\": \"STRING\",\n            \"value\": \";\"\n          }\n        },\n        {\n          \"type\": \"STRING\",\n          \"value\": \"else\"\n        },\n        {\n          \"type\": \"FIELD\",\n          \"name\": \"else\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_exp\"\n          }\n        }\n      ]\n    },\n    \"_exp_greedy\": {\n      \"type\": \"CHOICE\",\n      \"members\": [\n        {\n          \"type\": \"ALIAS\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_exp_lambda\"\n          },\n          \"named\": true,\n          \"value\": \"lambda\"\n        },\n        {\n          \"type\": \"ALIAS\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_exp_let_in\"\n          },\n          \"named\": true,\n          \"value\": \"let_in\"\n        },\n        {\n          \"type\": \"ALIAS\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_exp_conditional\"\n          },\n          \"named\": true,\n          \"value\": \"conditional\"\n        }\n      ]\n    },\n    \"_exp_statement\": {\n      \"type\": \"SYMBOL\",\n      \"name\": \"_exp\"\n    },\n    \"statement\": {\n      \"type\": \"CHOICE\",\n      \"members\": [\n        {\n          \"type\": \"ALIAS\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_exp_statement\"\n          },\n          \"named\": true,\n          \"value\": \"exp\"\n        },\n        {\n          \"type\": \"ALIAS\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"generator\"\n          },\n          \"named\": true,\n          \"value\": \"bind\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"let\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"rec\"\n        }\n      ]\n    },\n    \"_statements\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"CHOICE\",\n          \"members\": [\n            {\n              \"type\": \"SYMBOL\",\n              \"name\": \"_cmd_layout_start_do\"\n            },\n            {\n              \"type\": \"ALIAS\",\n              \"content\": {\n                \"type\": \"SYMBOL\",\n                \"name\": \"_cmd_layout_start_explicit\"\n              },\n              \"named\": false,\n              \"value\": \"{\"\n            }\n          ]\n        },\n        {\n          \"type\": \"CHOICE\",\n          \"members\": [\n            {\n              \"type\": \"SEQ\",\n              \"members\": [\n                {\n                  \"type\": \"CHOICE\",\n                  \"members\": [\n                    {\n                      \"type\": \"CHOICE\",\n                      \"members\": [\n                        {\n                          \"type\": \"REPEAT1\",\n                          \"content\": {\n                            \"type\": \"STRING\",\n                            \"value\": \";\"\n                          }\n                        },\n                        {\n                          \"type\": \"SYMBOL\",\n                          \"name\": \"_cond_layout_semicolon\"\n                        }\n                      ]\n                    },\n                    {\n                      \"type\": \"BLANK\"\n                    }\n                  ]\n                },\n                {\n                  \"type\": \"SEQ\",\n                  \"members\": [\n                    {\n                      \"type\": \"FIELD\",\n                      \"name\": \"statement\",\n                      \"content\": {\n                        \"type\": \"SYMBOL\",\n                        \"name\": \"statement\"\n                      }\n                    },\n                    {\n                      \"type\": \"REPEAT\",\n                      \"content\": {\n                        \"type\": \"SEQ\",\n                        \"members\": [\n                          {\n                            \"type\": \"CHOICE\",\n                            \"members\": [\n                              {\n                                \"type\": \"REPEAT1\",\n                                \"content\": {\n                                  \"type\": \"STRING\",\n                                  \"value\": \";\"\n                                }\n                              },\n                              {\n                                \"type\": \"SYMBOL\",\n                                \"name\": \"_cond_layout_semicolon\"\n                              }\n                            ]\n                          },\n                          {\n                            \"type\": \"FIELD\",\n                            \"name\": \"statement\",\n                            \"content\": {\n                              \"type\": \"SYMBOL\",\n                              \"name\": \"statement\"\n                            }\n                          }\n                        ]\n                      }\n                    }\n                  ]\n                },\n                {\n                  \"type\": \"CHOICE\",\n                  \"members\": [\n                    {\n                      \"type\": \"CHOICE\",\n                      \"members\": [\n                        {\n                          \"type\": \"REPEAT1\",\n                          \"content\": {\n                            \"type\": \"STRING\",\n                            \"value\": \";\"\n                          }\n                        },\n                        {\n                          \"type\": \"SYMBOL\",\n                          \"name\": \"_cond_layout_semicolon\"\n                        }\n                      ]\n                    },\n                    {\n                      \"type\": \"BLANK\"\n                    }\n                  ]\n                }\n              ]\n            },\n            {\n              \"type\": \"BLANK\"\n            }\n          ]\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_layout_end\"\n        }\n      ]\n    },\n    \"rec\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"STRING\",\n          \"value\": \"rec\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_statements\"\n        }\n      ]\n    },\n    \"_do_keyword\": {\n      \"type\": \"CHOICE\",\n      \"members\": [\n        {\n          \"type\": \"STRING\",\n          \"value\": \"mdo\"\n        },\n        {\n          \"type\": \"STRING\",\n          \"value\": \"do\"\n        }\n      ]\n    },\n    \"do_module\": {\n      \"type\": \"FIELD\",\n      \"name\": \"qualified_do\",\n      \"content\": {\n        \"type\": \"PREC\",\n        \"value\": \"qualified-id\",\n        \"content\": {\n          \"type\": \"SEQ\",\n          \"members\": [\n            {\n              \"type\": \"FIELD\",\n              \"name\": \"module\",\n              \"content\": {\n                \"type\": \"ALIAS\",\n                \"content\": {\n                  \"type\": \"SYMBOL\",\n                  \"name\": \"_qualifying_module\"\n                },\n                \"named\": true,\n                \"value\": \"module\"\n              }\n            },\n            {\n              \"type\": \"FIELD\",\n              \"name\": \"id\",\n              \"content\": {\n                \"type\": \"SYMBOL\",\n                \"name\": \"_do_keyword\"\n              }\n            }\n          ]\n        }\n      }\n    },\n    \"_do\": {\n      \"type\": \"CHOICE\",\n      \"members\": [\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"do_module\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_do_keyword\"\n        }\n      ]\n    },\n    \"_exp_do\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_do\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_statements\"\n        }\n      ]\n    },\n    \"match\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_guards\"\n        },\n        {\n          \"type\": \"CHOICE\",\n          \"members\": [\n            {\n              \"type\": \"SYMBOL\",\n              \"name\": \"_phantom_arrow\"\n            },\n            {\n              \"type\": \"BLANK\"\n            }\n          ]\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_arrow\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_cmd_texp_end\"\n        },\n        {\n          \"type\": \"FIELD\",\n          \"name\": \"expression\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_exp\"\n          }\n        }\n      ]\n    },\n    \"_simple_match\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_arrow\"\n        },\n        {\n          \"type\": \"FIELD\",\n          \"name\": \"expression\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_exp\"\n          }\n        }\n      ]\n    },\n    \"_matches\": {\n      \"type\": \"FIELD\",\n      \"name\": \"match\",\n      \"content\": {\n        \"type\": \"CHOICE\",\n        \"members\": [\n          {\n            \"type\": \"ALIAS\",\n            \"content\": {\n              \"type\": \"SYMBOL\",\n              \"name\": \"_simple_match\"\n            },\n            \"named\": true,\n            \"value\": \"match\"\n          },\n          {\n            \"type\": \"REPEAT1\",\n            \"content\": {\n              \"type\": \"SYMBOL\",\n              \"name\": \"match\"\n            }\n          }\n        ]\n      }\n    },\n    \"alternative\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"FIELD\",\n          \"name\": \"pattern\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_pat\"\n          }\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_matches\"\n        },\n        {\n          \"type\": \"CHOICE\",\n          \"members\": [\n            {\n              \"type\": \"SYMBOL\",\n              \"name\": \"_where_binds\"\n            },\n            {\n              \"type\": \"BLANK\"\n            }\n          ]\n        }\n      ]\n    },\n    \"_nalt\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"FIELD\",\n          \"name\": \"patterns\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"patterns\"\n          }\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_matches\"\n        },\n        {\n          \"type\": \"CHOICE\",\n          \"members\": [\n            {\n              \"type\": \"SYMBOL\",\n              \"name\": \"_where_binds\"\n            },\n            {\n              \"type\": \"BLANK\"\n            }\n          ]\n        }\n      ]\n    },\n    \"alternatives\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"CHOICE\",\n          \"members\": [\n            {\n              \"type\": \"SYMBOL\",\n              \"name\": \"_cmd_layout_start_case\"\n            },\n            {\n              \"type\": \"ALIAS\",\n              \"content\": {\n                \"type\": \"SYMBOL\",\n                \"name\": \"_cmd_layout_start_explicit\"\n              },\n              \"named\": false,\n              \"value\": \"{\"\n            }\n          ]\n        },\n        {\n          \"type\": \"CHOICE\",\n          \"members\": [\n            {\n              \"type\": \"SEQ\",\n              \"members\": [\n                {\n                  \"type\": \"CHOICE\",\n                  \"members\": [\n                    {\n                      \"type\": \"CHOICE\",\n                      \"members\": [\n                        {\n                          \"type\": \"REPEAT1\",\n                          \"content\": {\n                            \"type\": \"STRING\",\n                            \"value\": \";\"\n                          }\n                        },\n                        {\n                          \"type\": \"SYMBOL\",\n                          \"name\": \"_cond_layout_semicolon\"\n                        }\n                      ]\n                    },\n                    {\n                      \"type\": \"BLANK\"\n                    }\n                  ]\n                },\n                {\n                  \"type\": \"SEQ\",\n                  \"members\": [\n                    {\n                      \"type\": \"FIELD\",\n                      \"name\": \"alternative\",\n                      \"content\": {\n                        \"type\": \"SYMBOL\",\n                        \"name\": \"alternative\"\n                      }\n                    },\n                    {\n                      \"type\": \"REPEAT\",\n                      \"content\": {\n                        \"type\": \"SEQ\",\n                        \"members\": [\n                          {\n                            \"type\": \"CHOICE\",\n                            \"members\": [\n                              {\n                                \"type\": \"REPEAT1\",\n                                \"content\": {\n                                  \"type\": \"STRING\",\n                                  \"value\": \";\"\n                                }\n                              },\n                              {\n                                \"type\": \"SYMBOL\",\n                                \"name\": \"_cond_layout_semicolon\"\n                              }\n                            ]\n                          },\n                          {\n                            \"type\": \"FIELD\",\n                            \"name\": \"alternative\",\n                            \"content\": {\n                              \"type\": \"SYMBOL\",\n                              \"name\": \"alternative\"\n                            }\n                          }\n                        ]\n                      }\n                    }\n                  ]\n                },\n                {\n                  \"type\": \"CHOICE\",\n                  \"members\": [\n                    {\n                      \"type\": \"CHOICE\",\n                      \"members\": [\n                        {\n                          \"type\": \"REPEAT1\",\n                          \"content\": {\n                            \"type\": \"STRING\",\n                            \"value\": \";\"\n                          }\n                        },\n                        {\n                          \"type\": \"SYMBOL\",\n                          \"name\": \"_cond_layout_semicolon\"\n                        }\n                      ]\n                    },\n                    {\n                      \"type\": \"BLANK\"\n                    }\n                  ]\n                }\n              ]\n            },\n            {\n              \"type\": \"BLANK\"\n            }\n          ]\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_layout_end\"\n        }\n      ]\n    },\n    \"_nalts\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"CHOICE\",\n          \"members\": [\n            {\n              \"type\": \"SYMBOL\",\n              \"name\": \"_cmd_layout_start_case\"\n            },\n            {\n              \"type\": \"ALIAS\",\n              \"content\": {\n                \"type\": \"SYMBOL\",\n                \"name\": \"_cmd_layout_start_explicit\"\n              },\n              \"named\": false,\n              \"value\": \"{\"\n            }\n          ]\n        },\n        {\n          \"type\": \"CHOICE\",\n          \"members\": [\n            {\n              \"type\": \"SEQ\",\n              \"members\": [\n                {\n                  \"type\": \"CHOICE\",\n                  \"members\": [\n                    {\n                      \"type\": \"CHOICE\",\n                      \"members\": [\n                        {\n                          \"type\": \"REPEAT1\",\n                          \"content\": {\n                            \"type\": \"STRING\",\n                            \"value\": \";\"\n                          }\n                        },\n                        {\n                          \"type\": \"SYMBOL\",\n                          \"name\": \"_cond_layout_semicolon\"\n                        }\n                      ]\n                    },\n                    {\n                      \"type\": \"BLANK\"\n                    }\n                  ]\n                },\n                {\n                  \"type\": \"SEQ\",\n                  \"members\": [\n                    {\n                      \"type\": \"FIELD\",\n                      \"name\": \"alternative\",\n                      \"content\": {\n                        \"type\": \"ALIAS\",\n                        \"content\": {\n                          \"type\": \"SYMBOL\",\n                          \"name\": \"_nalt\"\n                        },\n                        \"named\": true,\n                        \"value\": \"alternative\"\n                      }\n                    },\n                    {\n                      \"type\": \"REPEAT\",\n                      \"content\": {\n                        \"type\": \"SEQ\",\n                        \"members\": [\n                          {\n                            \"type\": \"CHOICE\",\n                            \"members\": [\n                              {\n                                \"type\": \"REPEAT1\",\n                                \"content\": {\n                                  \"type\": \"STRING\",\n                                  \"value\": \";\"\n                                }\n                              },\n                              {\n                                \"type\": \"SYMBOL\",\n                                \"name\": \"_cond_layout_semicolon\"\n                              }\n                            ]\n                          },\n                          {\n                            \"type\": \"FIELD\",\n                            \"name\": \"alternative\",\n                            \"content\": {\n                              \"type\": \"ALIAS\",\n                              \"content\": {\n                                \"type\": \"SYMBOL\",\n                                \"name\": \"_nalt\"\n                              },\n                              \"named\": true,\n                              \"value\": \"alternative\"\n                            }\n                          }\n                        ]\n                      }\n                    }\n                  ]\n                },\n                {\n                  \"type\": \"CHOICE\",\n                  \"members\": [\n                    {\n                      \"type\": \"CHOICE\",\n                      \"members\": [\n                        {\n                          \"type\": \"REPEAT1\",\n                          \"content\": {\n                            \"type\": \"STRING\",\n                            \"value\": \";\"\n                          }\n                        },\n                        {\n                          \"type\": \"SYMBOL\",\n                          \"name\": \"_cond_layout_semicolon\"\n                        }\n                      ]\n                    },\n                    {\n                      \"type\": \"BLANK\"\n                    }\n                  ]\n                }\n              ]\n            },\n            {\n              \"type\": \"BLANK\"\n            }\n          ]\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_layout_end\"\n        }\n      ]\n    },\n    \"_exp_case\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"STRING\",\n          \"value\": \"case\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_exp\"\n        },\n        {\n          \"type\": \"STRING\",\n          \"value\": \"of\"\n        },\n        {\n          \"type\": \"CHOICE\",\n          \"members\": [\n            {\n              \"type\": \"FIELD\",\n              \"name\": \"alternatives\",\n              \"content\": {\n                \"type\": \"SYMBOL\",\n                \"name\": \"alternatives\"\n              }\n            },\n            {\n              \"type\": \"BLANK\"\n            }\n          ]\n        }\n      ]\n    },\n    \"_exp_lambda_case\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"STRING\",\n          \"value\": \"\\\\\"\n        },\n        {\n          \"type\": \"STRING\",\n          \"value\": \"case\"\n        },\n        {\n          \"type\": \"CHOICE\",\n          \"members\": [\n            {\n              \"type\": \"FIELD\",\n              \"name\": \"alternatives\",\n              \"content\": {\n                \"type\": \"SYMBOL\",\n                \"name\": \"alternatives\"\n              }\n            },\n            {\n              \"type\": \"BLANK\"\n            }\n          ]\n        }\n      ]\n    },\n    \"_exp_lambda_cases\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"STRING\",\n          \"value\": \"\\\\\"\n        },\n        {\n          \"type\": \"STRING\",\n          \"value\": \"cases\"\n        },\n        {\n          \"type\": \"CHOICE\",\n          \"members\": [\n            {\n              \"type\": \"FIELD\",\n              \"name\": \"alternatives\",\n              \"content\": {\n                \"type\": \"ALIAS\",\n                \"content\": {\n                  \"type\": \"SYMBOL\",\n                  \"name\": \"_nalts\"\n                },\n                \"named\": true,\n                \"value\": \"alternatives\"\n              }\n            },\n            {\n              \"type\": \"BLANK\"\n            }\n          ]\n        }\n      ]\n    },\n    \"_exp_multi_way_if\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"STRING\",\n          \"value\": \"if\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_cmd_layout_start_if\"\n        },\n        {\n          \"type\": \"REPEAT\",\n          \"content\": {\n            \"type\": \"FIELD\",\n            \"name\": \"match\",\n            \"content\": {\n              \"type\": \"SYMBOL\",\n              \"name\": \"match\"\n            }\n          }\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_cond_layout_end\"\n        }\n      ]\n    },\n    \"field_update\": {\n      \"type\": \"CHOICE\",\n      \"members\": [\n        {\n          \"type\": \"ALIAS\",\n          \"content\": {\n            \"type\": \"STRING\",\n            \"value\": \"..\"\n          },\n          \"named\": true,\n          \"value\": \"wildcard\"\n        },\n        {\n          \"type\": \"SEQ\",\n          \"members\": [\n            {\n              \"type\": \"FIELD\",\n              \"name\": \"field\",\n              \"content\": {\n                \"type\": \"SYMBOL\",\n                \"name\": \"_field_spec\"\n              }\n            },\n            {\n              \"type\": \"CHOICE\",\n              \"members\": [\n                {\n                  \"type\": \"SEQ\",\n                  \"members\": [\n                    {\n                      \"type\": \"STRING\",\n                      \"value\": \"=\"\n                    },\n                    {\n                      \"type\": \"FIELD\",\n                      \"name\": \"expression\",\n                      \"content\": {\n                        \"type\": \"SYMBOL\",\n                        \"name\": \"_exp\"\n                      }\n                    }\n                  ]\n                },\n                {\n                  \"type\": \"BLANK\"\n                }\n              ]\n            }\n          ]\n        }\n      ]\n    },\n    \"_exp_record\": {\n      \"type\": \"PREC\",\n      \"value\": \"record\",\n      \"content\": {\n        \"type\": \"SEQ\",\n        \"members\": [\n          {\n            \"type\": \"FIELD\",\n            \"name\": \"expression\",\n            \"content\": {\n              \"type\": \"SYMBOL\",\n              \"name\": \"expression\"\n            }\n          },\n          {\n            \"type\": \"SEQ\",\n            \"members\": [\n              {\n                \"type\": \"STRING\",\n                \"value\": \"{\"\n              },\n              {\n                \"type\": \"SYMBOL\",\n                \"name\": \"_cmd_brace_open\"\n              },\n              {\n                \"type\": \"CHOICE\",\n                \"members\": [\n                  {\n                    \"type\": \"SEQ\",\n                    \"members\": [\n                      {\n                        \"type\": \"FIELD\",\n                        \"name\": \"field\",\n                        \"content\": {\n                          \"type\": \"SYMBOL\",\n                          \"name\": \"field_update\"\n                        }\n                      },\n                      {\n                        \"type\": \"REPEAT\",\n                        \"content\": {\n                          \"type\": \"SEQ\",\n                          \"members\": [\n                            {\n                              \"type\": \"STRING\",\n                              \"value\": \",\"\n                            },\n                            {\n                              \"type\": \"FIELD\",\n                              \"name\": \"field\",\n                              \"content\": {\n                                \"type\": \"SYMBOL\",\n                                \"name\": \"field_update\"\n                              }\n                            }\n                          ]\n                        }\n                      }\n                    ]\n                  },\n                  {\n                    \"type\": \"BLANK\"\n                  }\n                ]\n              },\n              {\n                \"type\": \"STRING\",\n                \"value\": \"}\"\n              },\n              {\n                \"type\": \"SYMBOL\",\n                \"name\": \"_cmd_brace_close\"\n              }\n            ]\n          }\n        ]\n      }\n    },\n    \"_exp_projection_selector\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_paren_open\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_any_prefix_dot\"\n        },\n        {\n          \"type\": \"FIELD\",\n          \"name\": \"field\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"variable\"\n          }\n        },\n        {\n          \"type\": \"REPEAT\",\n          \"content\": {\n            \"type\": \"SEQ\",\n            \"members\": [\n              {\n                \"type\": \"SYMBOL\",\n                \"name\": \"_tight_dot\"\n              },\n              {\n                \"type\": \"FIELD\",\n                \"name\": \"field\",\n                \"content\": {\n                  \"type\": \"SYMBOL\",\n                  \"name\": \"variable\"\n                }\n              }\n            ]\n          }\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_paren_close\"\n        }\n      ]\n    },\n    \"_exp_projection\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"PREC\",\n          \"value\": \"projection\",\n          \"content\": {\n            \"type\": \"SEQ\",\n            \"members\": [\n              {\n                \"type\": \"FIELD\",\n                \"name\": \"expression\",\n                \"content\": {\n                  \"type\": \"SYMBOL\",\n                  \"name\": \"expression\"\n                }\n              },\n              {\n                \"type\": \"SYMBOL\",\n                \"name\": \"_tight_dot\"\n              }\n            ]\n          }\n        },\n        {\n          \"type\": \"FIELD\",\n          \"name\": \"field\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"field_name\"\n          }\n        }\n      ]\n    },\n    \"explicit_type\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_paren_open\"\n        },\n        {\n          \"type\": \"STRING\",\n          \"value\": \"type\"\n        },\n        {\n          \"type\": \"FIELD\",\n          \"name\": \"type\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"type\"\n          }\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_paren_close\"\n        }\n      ]\n    },\n    \"_exp_apply\": {\n      \"type\": \"PREC_LEFT\",\n      \"value\": \"apply\",\n      \"content\": {\n        \"type\": \"SEQ\",\n        \"members\": [\n          {\n            \"type\": \"FIELD\",\n            \"name\": \"function\",\n            \"content\": {\n              \"type\": \"SYMBOL\",\n              \"name\": \"expression\"\n            }\n          },\n          {\n            \"type\": \"FIELD\",\n            \"name\": \"argument\",\n            \"content\": {\n              \"type\": \"CHOICE\",\n              \"members\": [\n                {\n                  \"type\": \"SYMBOL\",\n                  \"name\": \"expression\"\n                },\n                {\n                  \"type\": \"ALIAS\",\n                  \"content\": {\n                    \"type\": \"SYMBOL\",\n                    \"name\": \"_at_type\"\n                  },\n                  \"named\": true,\n                  \"value\": \"type_application\"\n                },\n                {\n                  \"type\": \"SYMBOL\",\n                  \"name\": \"explicit_type\"\n                }\n              ]\n            }\n          }\n        ]\n      }\n    },\n    \"_exp_op\": {\n      \"type\": \"CHOICE\",\n      \"members\": [\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_sym\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_op_ticked\"\n        },\n        {\n          \"type\": \"ALIAS\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_prefix_dot\"\n          },\n          \"named\": true,\n          \"value\": \"operator\"\n        }\n      ]\n    },\n    \"_exp_section_left\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_paren_open\"\n        },\n        {\n          \"type\": \"FIELD\",\n          \"name\": \"left_operand\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"expression\"\n          }\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_cond_left_section_op\"\n        },\n        {\n          \"type\": \"FIELD\",\n          \"name\": \"operator\",\n          \"content\": {\n            \"type\": \"CHOICE\",\n            \"members\": [\n              {\n                \"type\": \"SYMBOL\",\n                \"name\": \"_exp_op\"\n              },\n              {\n                \"type\": \"SYMBOL\",\n                \"name\": \"_operator_minus\"\n              },\n              {\n                \"type\": \"SYMBOL\",\n                \"name\": \"_qsym\"\n              }\n            ]\n          }\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_paren_close\"\n        }\n      ]\n    },\n    \"_exp_section_right\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_paren_open\"\n        },\n        {\n          \"type\": \"CHOICE\",\n          \"members\": [\n            {\n              \"type\": \"ALIAS\",\n              \"content\": {\n                \"type\": \"SYMBOL\",\n                \"name\": \"_operator_qual_dot_head\"\n              },\n              \"named\": true,\n              \"value\": \"operator\"\n            },\n            {\n              \"type\": \"SYMBOL\",\n              \"name\": \"_ops\"\n            }\n          ]\n        },\n        {\n          \"type\": \"FIELD\",\n          \"name\": \"right_operand\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"expression\"\n          }\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_paren_close\"\n        }\n      ]\n    },\n    \"_exp_negation\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"FIELD\",\n          \"name\": \"minus\",\n          \"content\": {\n            \"type\": \"STRING\",\n            \"value\": \"-\"\n          }\n        },\n        {\n          \"type\": \"PREC\",\n          \"value\": \"negation\",\n          \"content\": {\n            \"type\": \"FIELD\",\n            \"name\": \"expression\",\n            \"content\": {\n              \"type\": \"SYMBOL\",\n              \"name\": \"expression\"\n            }\n          }\n        }\n      ]\n    },\n    \"_exp_infix\": {\n      \"type\": \"PREC_RIGHT\",\n      \"value\": \"infix\",\n      \"content\": {\n        \"type\": \"SEQ\",\n        \"members\": [\n          {\n            \"type\": \"FIELD\",\n            \"name\": \"left_operand\",\n            \"content\": {\n              \"type\": \"SYMBOL\",\n              \"name\": \"expression\"\n            }\n          },\n          {\n            \"type\": \"CHOICE\",\n            \"members\": [\n              {\n                \"type\": \"SYMBOL\",\n                \"name\": \"_cond_no_section_op\"\n              },\n              {\n                \"type\": \"BLANK\"\n              }\n            ]\n          },\n          {\n            \"type\": \"FIELD\",\n            \"name\": \"operator\",\n            \"content\": {\n              \"type\": \"CHOICE\",\n              \"members\": [\n                {\n                  \"type\": \"SEQ\",\n                  \"members\": [\n                    {\n                      \"type\": \"SYMBOL\",\n                      \"name\": \"_cond_minus\"\n                    },\n                    {\n                      \"type\": \"SYMBOL\",\n                      \"name\": \"_operator_minus\"\n                    }\n                  ]\n                },\n                {\n                  \"type\": \"SYMBOL\",\n                  \"name\": \"_exp_op\"\n                },\n                {\n                  \"type\": \"SEQ\",\n                  \"members\": [\n                    {\n                      \"type\": \"SYMBOL\",\n                      \"name\": \"_cond_qualified_op\"\n                    },\n                    {\n                      \"type\": \"SYMBOL\",\n                      \"name\": \"_qsym\"\n                    }\n                  ]\n                }\n              ]\n            }\n          },\n          {\n            \"type\": \"FIELD\",\n            \"name\": \"right_operand\",\n            \"content\": {\n              \"type\": \"SYMBOL\",\n              \"name\": \"expression\"\n            }\n          }\n        ]\n      }\n    },\n    \"expression\": {\n      \"type\": \"CHOICE\",\n      \"members\": [\n        {\n          \"type\": \"ALIAS\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_exp_infix\"\n          },\n          \"named\": true,\n          \"value\": \"infix\"\n        },\n        {\n          \"type\": \"ALIAS\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_exp_negation\"\n          },\n          \"named\": true,\n          \"value\": \"negation\"\n        },\n        {\n          \"type\": \"ALIAS\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_exp_apply\"\n          },\n          \"named\": true,\n          \"value\": \"apply\"\n        },\n        {\n          \"type\": \"ALIAS\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_exp_record\"\n          },\n          \"named\": true,\n          \"value\": \"record\"\n        },\n        {\n          \"type\": \"ALIAS\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_exp_projection\"\n          },\n          \"named\": true,\n          \"value\": \"projection\"\n        },\n        {\n          \"type\": \"ALIAS\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_exp_arithmetic_sequence\"\n          },\n          \"named\": true,\n          \"value\": \"arithmetic_sequence\"\n        },\n        {\n          \"type\": \"ALIAS\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_exp_list_comprehension\"\n          },\n          \"named\": true,\n          \"value\": \"list_comprehension\"\n        },\n        {\n          \"type\": \"ALIAS\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_exp_unboxed_tuple\"\n          },\n          \"named\": true,\n          \"value\": \"unboxed_tuple\"\n        },\n        {\n          \"type\": \"ALIAS\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_exp_unboxed_sum\"\n          },\n          \"named\": true,\n          \"value\": \"unboxed_sum\"\n        },\n        {\n          \"type\": \"ALIAS\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_exp_projection_selector\"\n          },\n          \"named\": true,\n          \"value\": \"projection_selector\"\n        },\n        {\n          \"type\": \"ALIAS\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_exp_quote\"\n          },\n          \"named\": true,\n          \"value\": \"quote\"\n        },\n        {\n          \"type\": \"ALIAS\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_exp_typed_quote\"\n          },\n          \"named\": true,\n          \"value\": \"typed_quote\"\n        },\n        {\n          \"type\": \"ALIAS\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_exp_th_quoted_name\"\n          },\n          \"named\": true,\n          \"value\": \"th_quoted_name\"\n        },\n        {\n          \"type\": \"ALIAS\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_exp_lambda_case\"\n          },\n          \"named\": true,\n          \"value\": \"lambda_case\"\n        },\n        {\n          \"type\": \"ALIAS\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_exp_lambda_cases\"\n          },\n          \"named\": true,\n          \"value\": \"lambda_cases\"\n        },\n        {\n          \"type\": \"ALIAS\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_exp_do\"\n          },\n          \"named\": true,\n          \"value\": \"do\"\n        },\n        {\n          \"type\": \"ALIAS\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_exp_parens\"\n          },\n          \"named\": true,\n          \"value\": \"parens\"\n        },\n        {\n          \"type\": \"ALIAS\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_exp_tuple\"\n          },\n          \"named\": true,\n          \"value\": \"tuple\"\n        },\n        {\n          \"type\": \"ALIAS\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_exp_list\"\n          },\n          \"named\": true,\n          \"value\": \"list\"\n        },\n        {\n          \"type\": \"ALIAS\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_plist\"\n          },\n          \"named\": true,\n          \"value\": \"list\"\n        },\n        {\n          \"type\": \"ALIAS\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_exp_section_left\"\n          },\n          \"named\": true,\n          \"value\": \"left_section\"\n        },\n        {\n          \"type\": \"ALIAS\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_exp_section_right\"\n          },\n          \"named\": true,\n          \"value\": \"right_section\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_exp_greedy\"\n        },\n        {\n          \"type\": \"ALIAS\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_exp_case\"\n          },\n          \"named\": true,\n          \"value\": \"case\"\n        },\n        {\n          \"type\": \"ALIAS\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_exp_multi_way_if\"\n          },\n          \"named\": true,\n          \"value\": \"multi_way_if\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_exp_name\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_universal\"\n        }\n      ]\n    },\n    \"_exp_signature\": {\n      \"type\": \"PREC_RIGHT\",\n      \"value\": \"annotated\",\n      \"content\": {\n        \"type\": \"SEQ\",\n        \"members\": [\n          {\n            \"type\": \"FIELD\",\n            \"name\": \"expression\",\n            \"content\": {\n              \"type\": \"SYMBOL\",\n              \"name\": \"expression\"\n            }\n          },\n          {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_type_annotation\"\n          }\n        ]\n      }\n    },\n    \"_exp\": {\n      \"type\": \"CHOICE\",\n      \"members\": [\n        {\n          \"type\": \"ALIAS\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_exp_signature\"\n          },\n          \"named\": true,\n          \"value\": \"signature\"\n        },\n        {\n          \"type\": \"PREC_RIGHT\",\n          \"value\": 0,\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"expression\"\n          }\n        }\n      ]\n    },\n    \"_pat_parens\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_paren_open\"\n        },\n        {\n          \"type\": \"FIELD\",\n          \"name\": \"pattern\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_pat_texp\"\n          }\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_paren_close\"\n        }\n      ]\n    },\n    \"_pat_tuple_elems\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"FIELD\",\n          \"name\": \"element\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_pat_texp\"\n          }\n        },\n        {\n          \"type\": \"REPEAT1\",\n          \"content\": {\n            \"type\": \"SEQ\",\n            \"members\": [\n              {\n                \"type\": \"STRING\",\n                \"value\": \",\"\n              },\n              {\n                \"type\": \"FIELD\",\n                \"name\": \"element\",\n                \"content\": {\n                  \"type\": \"SYMBOL\",\n                  \"name\": \"_pat_texp\"\n                }\n              }\n            ]\n          }\n        }\n      ]\n    },\n    \"_pat_tuple\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_paren_open\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_pat_tuple_elems\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_paren_close\"\n        }\n      ]\n    },\n    \"_pat_unboxed_tuple\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_unboxed_open\"\n        },\n        {\n          \"type\": \"SEQ\",\n          \"members\": [\n            {\n              \"type\": \"FIELD\",\n              \"name\": \"element\",\n              \"content\": {\n                \"type\": \"SYMBOL\",\n                \"name\": \"_pat_texp\"\n              }\n            },\n            {\n              \"type\": \"REPEAT\",\n              \"content\": {\n                \"type\": \"SEQ\",\n                \"members\": [\n                  {\n                    \"type\": \"STRING\",\n                    \"value\": \",\"\n                  },\n                  {\n                    \"type\": \"FIELD\",\n                    \"name\": \"element\",\n                    \"content\": {\n                      \"type\": \"SYMBOL\",\n                      \"name\": \"_pat_texp\"\n                    }\n                  }\n                ]\n              }\n            }\n          ]\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_unboxed_close\"\n        }\n      ]\n    },\n    \"_pat_unboxed_sum\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_unboxed_open\"\n        },\n        {\n          \"type\": \"CHOICE\",\n          \"members\": [\n            {\n              \"type\": \"SEQ\",\n              \"members\": [\n                {\n                  \"type\": \"REPEAT1\",\n                  \"content\": {\n                    \"type\": \"SYMBOL\",\n                    \"name\": \"_unboxed_bar\"\n                  }\n                },\n                {\n                  \"type\": \"FIELD\",\n                  \"name\": \"element\",\n                  \"content\": {\n                    \"type\": \"SYMBOL\",\n                    \"name\": \"_pat_texp\"\n                  }\n                }\n              ]\n            },\n            {\n              \"type\": \"SEQ\",\n              \"members\": [\n                {\n                  \"type\": \"FIELD\",\n                  \"name\": \"element\",\n                  \"content\": {\n                    \"type\": \"SYMBOL\",\n                    \"name\": \"_pat_texp\"\n                  }\n                },\n                {\n                  \"type\": \"SYMBOL\",\n                  \"name\": \"_unboxed_bar\"\n                }\n              ]\n            }\n          ]\n        },\n        {\n          \"type\": \"REPEAT\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_unboxed_bar\"\n          }\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_unboxed_close\"\n        }\n      ]\n    },\n    \"_pat_list\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_bracket_open\"\n        },\n        {\n          \"type\": \"SEQ\",\n          \"members\": [\n            {\n              \"type\": \"FIELD\",\n              \"name\": \"element\",\n              \"content\": {\n                \"type\": \"SYMBOL\",\n                \"name\": \"_pat_texp\"\n              }\n            },\n            {\n              \"type\": \"REPEAT\",\n              \"content\": {\n                \"type\": \"SEQ\",\n                \"members\": [\n                  {\n                    \"type\": \"STRING\",\n                    \"value\": \",\"\n                  },\n                  {\n                    \"type\": \"FIELD\",\n                    \"name\": \"element\",\n                    \"content\": {\n                      \"type\": \"SYMBOL\",\n                      \"name\": \"_pat_texp\"\n                    }\n                  }\n                ]\n              }\n            }\n          ]\n        },\n        {\n          \"type\": \"CHOICE\",\n          \"members\": [\n            {\n              \"type\": \"STRING\",\n              \"value\": \",\"\n            },\n            {\n              \"type\": \"BLANK\"\n            }\n          ]\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_bracket_close\"\n        }\n      ]\n    },\n    \"field_pattern\": {\n      \"type\": \"CHOICE\",\n      \"members\": [\n        {\n          \"type\": \"ALIAS\",\n          \"content\": {\n            \"type\": \"STRING\",\n            \"value\": \"..\"\n          },\n          \"named\": true,\n          \"value\": \"wildcard\"\n        },\n        {\n          \"type\": \"SEQ\",\n          \"members\": [\n            {\n              \"type\": \"FIELD\",\n              \"name\": \"field\",\n              \"content\": {\n                \"type\": \"SYMBOL\",\n                \"name\": \"_field_names\"\n              }\n            },\n            {\n              \"type\": \"CHOICE\",\n              \"members\": [\n                {\n                  \"type\": \"SEQ\",\n                  \"members\": [\n                    {\n                      \"type\": \"STRING\",\n                      \"value\": \"=\"\n                    },\n                    {\n                      \"type\": \"FIELD\",\n                      \"name\": \"pattern\",\n                      \"content\": {\n                        \"type\": \"SYMBOL\",\n                        \"name\": \"_pat_texp\"\n                      }\n                    }\n                  ]\n                },\n                {\n                  \"type\": \"BLANK\"\n                }\n              ]\n            }\n          ]\n        }\n      ]\n    },\n    \"_pat_record\": {\n      \"type\": \"PREC\",\n      \"value\": \"record\",\n      \"content\": {\n        \"type\": \"SEQ\",\n        \"members\": [\n          {\n            \"type\": \"FIELD\",\n            \"name\": \"constructor\",\n            \"content\": {\n              \"type\": \"SYMBOL\",\n              \"name\": \"pattern\"\n            }\n          },\n          {\n            \"type\": \"SEQ\",\n            \"members\": [\n              {\n                \"type\": \"STRING\",\n                \"value\": \"{\"\n              },\n              {\n                \"type\": \"SYMBOL\",\n                \"name\": \"_cmd_brace_open\"\n              },\n              {\n                \"type\": \"CHOICE\",\n                \"members\": [\n                  {\n                    \"type\": \"SEQ\",\n                    \"members\": [\n                      {\n                        \"type\": \"FIELD\",\n                        \"name\": \"field\",\n                        \"content\": {\n                          \"type\": \"SYMBOL\",\n                          \"name\": \"field_pattern\"\n                        }\n                      },\n                      {\n                        \"type\": \"REPEAT\",\n                        \"content\": {\n                          \"type\": \"SEQ\",\n                          \"members\": [\n                            {\n                              \"type\": \"STRING\",\n                              \"value\": \",\"\n                            },\n                            {\n                              \"type\": \"FIELD\",\n                              \"name\": \"field\",\n                              \"content\": {\n                                \"type\": \"SYMBOL\",\n                                \"name\": \"field_pattern\"\n                              }\n                            }\n                          ]\n                        }\n                      }\n                    ]\n                  },\n                  {\n                    \"type\": \"BLANK\"\n                  }\n                ]\n              },\n              {\n                \"type\": \"STRING\",\n                \"value\": \"}\"\n              },\n              {\n                \"type\": \"SYMBOL\",\n                \"name\": \"_cmd_brace_close\"\n              }\n            ]\n          }\n        ]\n      }\n    },\n    \"_pat_name\": {\n      \"type\": \"CHOICE\",\n      \"members\": [\n        {\n          \"type\": \"PREC\",\n          \"value\": \"pat-name\",\n          \"content\": {\n            \"type\": \"PREC_DYNAMIC\",\n            \"value\": -1000,\n            \"content\": {\n              \"type\": \"SYMBOL\",\n              \"name\": \"_var\"\n            }\n          }\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_cons\"\n        }\n      ]\n    },\n    \"_pat_as\": {\n      \"type\": \"PREC\",\n      \"value\": \"prefix\",\n      \"content\": {\n        \"type\": \"SEQ\",\n        \"members\": [\n          {\n            \"type\": \"FIELD\",\n            \"name\": \"bind\",\n            \"content\": {\n              \"type\": \"SYMBOL\",\n              \"name\": \"variable\"\n            }\n          },\n          {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_tight_at\"\n          },\n          {\n            \"type\": \"FIELD\",\n            \"name\": \"pattern\",\n            \"content\": {\n              \"type\": \"SYMBOL\",\n              \"name\": \"pattern\"\n            }\n          }\n        ]\n      }\n    },\n    \"_pat_wildcard\": {\n      \"type\": \"STRING\",\n      \"value\": \"_\"\n    },\n    \"_pat_strict\": {\n      \"type\": \"PREC\",\n      \"value\": \"prefix\",\n      \"content\": {\n        \"type\": \"SEQ\",\n        \"members\": [\n          {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_any_prefix_bang\"\n          },\n          {\n            \"type\": \"FIELD\",\n            \"name\": \"pattern\",\n            \"content\": {\n              \"type\": \"SYMBOL\",\n              \"name\": \"pattern\"\n            }\n          }\n        ]\n      }\n    },\n    \"_pat_irrefutable\": {\n      \"type\": \"PREC\",\n      \"value\": \"prefix\",\n      \"content\": {\n        \"type\": \"SEQ\",\n        \"members\": [\n          {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_any_prefix_tilde\"\n          },\n          {\n            \"type\": \"FIELD\",\n            \"name\": \"pattern\",\n            \"content\": {\n              \"type\": \"SYMBOL\",\n              \"name\": \"pattern\"\n            }\n          }\n        ]\n      }\n    },\n    \"_pat_apply_arg\": {\n      \"type\": \"CHOICE\",\n      \"members\": [\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"pattern\"\n        },\n        {\n          \"type\": \"ALIAS\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_at_type\"\n          },\n          \"named\": true,\n          \"value\": \"type_binder\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"explicit_type\"\n        }\n      ]\n    },\n    \"_pat_apply\": {\n      \"type\": \"PREC_LEFT\",\n      \"value\": \"apply\",\n      \"content\": {\n        \"type\": \"SEQ\",\n        \"members\": [\n          {\n            \"type\": \"FIELD\",\n            \"name\": \"function\",\n            \"content\": {\n              \"type\": \"SYMBOL\",\n              \"name\": \"pattern\"\n            }\n          },\n          {\n            \"type\": \"FIELD\",\n            \"name\": \"argument\",\n            \"content\": {\n              \"type\": \"SYMBOL\",\n              \"name\": \"_pat_apply_arg\"\n            }\n          }\n        ]\n      }\n    },\n    \"_pat_negation\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"STRING\",\n          \"value\": \"-\"\n        },\n        {\n          \"type\": \"FIELD\",\n          \"name\": \"number\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_number\"\n          }\n        }\n      ]\n    },\n    \"_pat_infix\": {\n      \"type\": \"PREC_RIGHT\",\n      \"value\": \"infix\",\n      \"content\": {\n        \"type\": \"SEQ\",\n        \"members\": [\n          {\n            \"type\": \"FIELD\",\n            \"name\": \"left_operand\",\n            \"content\": {\n              \"type\": \"SYMBOL\",\n              \"name\": \"pattern\"\n            }\n          },\n          {\n            \"type\": \"CHOICE\",\n            \"members\": [\n              {\n                \"type\": \"SYMBOL\",\n                \"name\": \"_cond_no_section_op\"\n              },\n              {\n                \"type\": \"BLANK\"\n              }\n            ]\n          },\n          {\n            \"type\": \"FIELD\",\n            \"name\": \"operator\",\n            \"content\": {\n              \"type\": \"CHOICE\",\n              \"members\": [\n                {\n                  \"type\": \"SYMBOL\",\n                  \"name\": \"constructor_operator\"\n                },\n                {\n                  \"type\": \"SYMBOL\",\n                  \"name\": \"_conids_ticked\"\n                },\n                {\n                  \"type\": \"SEQ\",\n                  \"members\": [\n                    {\n                      \"type\": \"SYMBOL\",\n                      \"name\": \"_cond_qualified_op\"\n                    },\n                    {\n                      \"type\": \"SYMBOL\",\n                      \"name\": \"_qconsym\"\n                    }\n                  ]\n                }\n              ]\n            }\n          },\n          {\n            \"type\": \"FIELD\",\n            \"name\": \"right_operand\",\n            \"content\": {\n              \"type\": \"SYMBOL\",\n              \"name\": \"pattern\"\n            }\n          }\n        ]\n      }\n    },\n    \"pattern\": {\n      \"type\": \"CHOICE\",\n      \"members\": [\n        {\n          \"type\": \"ALIAS\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_pat_infix\"\n          },\n          \"named\": true,\n          \"value\": \"infix\"\n        },\n        {\n          \"type\": \"ALIAS\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_pat_negation\"\n          },\n          \"named\": true,\n          \"value\": \"negation\"\n        },\n        {\n          \"type\": \"ALIAS\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_pat_apply\"\n          },\n          \"named\": true,\n          \"value\": \"apply\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_pat_name\"\n        },\n        {\n          \"type\": \"ALIAS\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_pat_as\"\n          },\n          \"named\": true,\n          \"value\": \"as\"\n        },\n        {\n          \"type\": \"ALIAS\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_pat_record\"\n          },\n          \"named\": true,\n          \"value\": \"record\"\n        },\n        {\n          \"type\": \"ALIAS\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_pat_wildcard\"\n          },\n          \"named\": true,\n          \"value\": \"wildcard\"\n        },\n        {\n          \"type\": \"ALIAS\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_pat_parens\"\n          },\n          \"named\": true,\n          \"value\": \"parens\"\n        },\n        {\n          \"type\": \"ALIAS\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_pat_tuple\"\n          },\n          \"named\": true,\n          \"value\": \"tuple\"\n        },\n        {\n          \"type\": \"ALIAS\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_pat_unboxed_tuple\"\n          },\n          \"named\": true,\n          \"value\": \"unboxed_tuple\"\n        },\n        {\n          \"type\": \"ALIAS\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_pat_unboxed_sum\"\n          },\n          \"named\": true,\n          \"value\": \"unboxed_sum\"\n        },\n        {\n          \"type\": \"ALIAS\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_pat_list\"\n          },\n          \"named\": true,\n          \"value\": \"list\"\n        },\n        {\n          \"type\": \"ALIAS\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_plist\"\n          },\n          \"named\": true,\n          \"value\": \"list\"\n        },\n        {\n          \"type\": \"ALIAS\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_pat_strict\"\n          },\n          \"named\": true,\n          \"value\": \"strict\"\n        },\n        {\n          \"type\": \"ALIAS\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_pat_irrefutable\"\n          },\n          \"named\": true,\n          \"value\": \"irrefutable\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_universal\"\n        }\n      ]\n    },\n    \"patterns\": {\n      \"type\": \"REPEAT1\",\n      \"content\": {\n        \"type\": \"PREC\",\n        \"value\": \"patterns\",\n        \"content\": {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_pat_apply_arg\"\n        }\n      }\n    },\n    \"_pat_signature\": {\n      \"type\": \"PREC_RIGHT\",\n      \"value\": \"annotated\",\n      \"content\": {\n        \"type\": \"SEQ\",\n        \"members\": [\n          {\n            \"type\": \"FIELD\",\n            \"name\": \"pattern\",\n            \"content\": {\n              \"type\": \"SYMBOL\",\n              \"name\": \"pattern\"\n            }\n          },\n          {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_type_annotation\"\n          }\n        ]\n      }\n    },\n    \"_pat\": {\n      \"type\": \"CHOICE\",\n      \"members\": [\n        {\n          \"type\": \"ALIAS\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_pat_signature\"\n          },\n          \"named\": true,\n          \"value\": \"signature\"\n        },\n        {\n          \"type\": \"PREC_RIGHT\",\n          \"value\": 0,\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"pattern\"\n          }\n        }\n      ]\n    },\n    \"view_pattern\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"FIELD\",\n          \"name\": \"expression\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_exp\"\n          }\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_arrow\"\n        },\n        {\n          \"type\": \"FIELD\",\n          \"name\": \"pattern\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_pat_texp\"\n          }\n        }\n      ]\n    },\n    \"_pat_texp\": {\n      \"type\": \"CHOICE\",\n      \"members\": [\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"view_pattern\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_pat\"\n        }\n      ]\n    },\n    \"_modid\": {\n      \"type\": \"ALIAS\",\n      \"content\": {\n        \"type\": \"SYMBOL\",\n        \"name\": \"name\"\n      },\n      \"named\": true,\n      \"value\": \"module_id\"\n    },\n    \"_modid_prefix\": {\n      \"type\": \"PREC\",\n      \"value\": \"qualifying-module\",\n      \"content\": {\n        \"type\": \"SEQ\",\n        \"members\": [\n          {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_modid\"\n          },\n          {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_any_tight_dot\"\n          }\n        ]\n      }\n    },\n    \"_qualifying_module\": {\n      \"type\": \"REPEAT1\",\n      \"content\": {\n        \"type\": \"SYMBOL\",\n        \"name\": \"_modid_prefix\"\n      }\n    },\n    \"module\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"REPEAT\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_modid_prefix\"\n          }\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_modid\"\n        }\n      ]\n    },\n    \"namespace\": {\n      \"type\": \"CHOICE\",\n      \"members\": [\n        {\n          \"type\": \"STRING\",\n          \"value\": \"pattern\"\n        },\n        {\n          \"type\": \"STRING\",\n          \"value\": \"type\"\n        }\n      ]\n    },\n    \"_child_type\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"FIELD\",\n          \"name\": \"namespace\",\n          \"content\": {\n            \"type\": \"STRING\",\n            \"value\": \"type\"\n          }\n        },\n        {\n          \"type\": \"FIELD\",\n          \"name\": \"type\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_tyconids\"\n          }\n        }\n      ]\n    },\n    \"_child\": {\n      \"type\": \"CHOICE\",\n      \"members\": [\n        {\n          \"type\": \"ALIAS\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_child_type\"\n          },\n          \"named\": true,\n          \"value\": \"associated_type\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_qname\"\n        }\n      ]\n    },\n    \"children\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_paren_open\"\n        },\n        {\n          \"type\": \"CHOICE\",\n          \"members\": [\n            {\n              \"type\": \"SEQ\",\n              \"members\": [\n                {\n                  \"type\": \"FIELD\",\n                  \"name\": \"element\",\n                  \"content\": {\n                    \"type\": \"CHOICE\",\n                    \"members\": [\n                      {\n                        \"type\": \"ALIAS\",\n                        \"content\": {\n                          \"type\": \"STRING\",\n                          \"value\": \"..\"\n                        },\n                        \"named\": true,\n                        \"value\": \"all_names\"\n                      },\n                      {\n                        \"type\": \"SYMBOL\",\n                        \"name\": \"_child\"\n                      }\n                    ]\n                  }\n                },\n                {\n                  \"type\": \"REPEAT\",\n                  \"content\": {\n                    \"type\": \"SEQ\",\n                    \"members\": [\n                      {\n                        \"type\": \"STRING\",\n                        \"value\": \",\"\n                      },\n                      {\n                        \"type\": \"FIELD\",\n                        \"name\": \"element\",\n                        \"content\": {\n                          \"type\": \"CHOICE\",\n                          \"members\": [\n                            {\n                              \"type\": \"ALIAS\",\n                              \"content\": {\n                                \"type\": \"STRING\",\n                                \"value\": \"..\"\n                              },\n                              \"named\": true,\n                              \"value\": \"all_names\"\n                            },\n                            {\n                              \"type\": \"SYMBOL\",\n                              \"name\": \"_child\"\n                            }\n                          ]\n                        }\n                      }\n                    ]\n                  }\n                }\n              ]\n            },\n            {\n              \"type\": \"BLANK\"\n            }\n          ]\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_paren_close\"\n        }\n      ]\n    },\n    \"_ie_entity\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"CHOICE\",\n          \"members\": [\n            {\n              \"type\": \"FIELD\",\n              \"name\": \"namespace\",\n              \"content\": {\n                \"type\": \"SYMBOL\",\n                \"name\": \"namespace\"\n              }\n            },\n            {\n              \"type\": \"BLANK\"\n            }\n          ]\n        },\n        {\n          \"type\": \"CHOICE\",\n          \"members\": [\n            {\n              \"type\": \"FIELD\",\n              \"name\": \"variable\",\n              \"content\": {\n                \"type\": \"SYMBOL\",\n                \"name\": \"_varids\"\n              }\n            },\n            {\n              \"type\": \"FIELD\",\n              \"name\": \"type\",\n              \"content\": {\n                \"type\": \"SYMBOL\",\n                \"name\": \"_tyconids\"\n              }\n            },\n            {\n              \"type\": \"FIELD\",\n              \"name\": \"operator\",\n              \"content\": {\n                \"type\": \"CHOICE\",\n                \"members\": [\n                  {\n                    \"type\": \"SYMBOL\",\n                    \"name\": \"_sym_prefix\"\n                  },\n                  {\n                    \"type\": \"SYMBOL\",\n                    \"name\": \"_pqsym\"\n                  }\n                ]\n              }\n            }\n          ]\n        },\n        {\n          \"type\": \"CHOICE\",\n          \"members\": [\n            {\n              \"type\": \"FIELD\",\n              \"name\": \"children\",\n              \"content\": {\n                \"type\": \"SYMBOL\",\n                \"name\": \"children\"\n              }\n            },\n            {\n              \"type\": \"BLANK\"\n            }\n          ]\n        }\n      ]\n    },\n    \"import_list\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_paren_open\"\n        },\n        {\n          \"type\": \"CHOICE\",\n          \"members\": [\n            {\n              \"type\": \"SEQ\",\n              \"members\": [\n                {\n                  \"type\": \"FIELD\",\n                  \"name\": \"name\",\n                  \"content\": {\n                    \"type\": \"ALIAS\",\n                    \"content\": {\n                      \"type\": \"SYMBOL\",\n                      \"name\": \"_ie_entity\"\n                    },\n                    \"named\": true,\n                    \"value\": \"import_name\"\n                  }\n                },\n                {\n                  \"type\": \"REPEAT\",\n                  \"content\": {\n                    \"type\": \"SEQ\",\n                    \"members\": [\n                      {\n                        \"type\": \"STRING\",\n                        \"value\": \",\"\n                      },\n                      {\n                        \"type\": \"FIELD\",\n                        \"name\": \"name\",\n                        \"content\": {\n                          \"type\": \"ALIAS\",\n                          \"content\": {\n                            \"type\": \"SYMBOL\",\n                            \"name\": \"_ie_entity\"\n                          },\n                          \"named\": true,\n                          \"value\": \"import_name\"\n                        }\n                      }\n                    ]\n                  }\n                }\n              ]\n            },\n            {\n              \"type\": \"BLANK\"\n            }\n          ]\n        },\n        {\n          \"type\": \"CHOICE\",\n          \"members\": [\n            {\n              \"type\": \"STRING\",\n              \"value\": \",\"\n            },\n            {\n              \"type\": \"BLANK\"\n            }\n          ]\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_paren_close\"\n        }\n      ]\n    },\n    \"import\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"STRING\",\n          \"value\": \"import\"\n        },\n        {\n          \"type\": \"CHOICE\",\n          \"members\": [\n            {\n              \"type\": \"STRING\",\n              \"value\": \"qualified\"\n            },\n            {\n              \"type\": \"BLANK\"\n            }\n          ]\n        },\n        {\n          \"type\": \"CHOICE\",\n          \"members\": [\n            {\n              \"type\": \"FIELD\",\n              \"name\": \"package\",\n              \"content\": {\n                \"type\": \"ALIAS\",\n                \"content\": {\n                  \"type\": \"SYMBOL\",\n                  \"name\": \"string\"\n                },\n                \"named\": true,\n                \"value\": \"import_package\"\n              }\n            },\n            {\n              \"type\": \"BLANK\"\n            }\n          ]\n        },\n        {\n          \"type\": \"FIELD\",\n          \"name\": \"module\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"module\"\n          }\n        },\n        {\n          \"type\": \"CHOICE\",\n          \"members\": [\n            {\n              \"type\": \"STRING\",\n              \"value\": \"qualified\"\n            },\n            {\n              \"type\": \"BLANK\"\n            }\n          ]\n        },\n        {\n          \"type\": \"CHOICE\",\n          \"members\": [\n            {\n              \"type\": \"SEQ\",\n              \"members\": [\n                {\n                  \"type\": \"STRING\",\n                  \"value\": \"as\"\n                },\n                {\n                  \"type\": \"FIELD\",\n                  \"name\": \"alias\",\n                  \"content\": {\n                    \"type\": \"SYMBOL\",\n                    \"name\": \"module\"\n                  }\n                }\n              ]\n            },\n            {\n              \"type\": \"BLANK\"\n            }\n          ]\n        },\n        {\n          \"type\": \"CHOICE\",\n          \"members\": [\n            {\n              \"type\": \"SEQ\",\n              \"members\": [\n                {\n                  \"type\": \"CHOICE\",\n                  \"members\": [\n                    {\n                      \"type\": \"STRING\",\n                      \"value\": \"hiding\"\n                    },\n                    {\n                      \"type\": \"BLANK\"\n                    }\n                  ]\n                },\n                {\n                  \"type\": \"FIELD\",\n                  \"name\": \"names\",\n                  \"content\": {\n                    \"type\": \"SYMBOL\",\n                    \"name\": \"import_list\"\n                  }\n                }\n              ]\n            },\n            {\n              \"type\": \"BLANK\"\n            }\n          ]\n        }\n      ]\n    },\n    \"module_export\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"STRING\",\n          \"value\": \"module\"\n        },\n        {\n          \"type\": \"FIELD\",\n          \"name\": \"module\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"module\"\n          }\n        }\n      ]\n    },\n    \"exports\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_paren_open\"\n        },\n        {\n          \"type\": \"CHOICE\",\n          \"members\": [\n            {\n              \"type\": \"SEQ\",\n              \"members\": [\n                {\n                  \"type\": \"CHOICE\",\n                  \"members\": [\n                    {\n                      \"type\": \"FIELD\",\n                      \"name\": \"export\",\n                      \"content\": {\n                        \"type\": \"ALIAS\",\n                        \"content\": {\n                          \"type\": \"SYMBOL\",\n                          \"name\": \"_ie_entity\"\n                        },\n                        \"named\": true,\n                        \"value\": \"export\"\n                      }\n                    },\n                    {\n                      \"type\": \"SYMBOL\",\n                      \"name\": \"module_export\"\n                    }\n                  ]\n                },\n                {\n                  \"type\": \"REPEAT\",\n                  \"content\": {\n                    \"type\": \"SEQ\",\n                    \"members\": [\n                      {\n                        \"type\": \"STRING\",\n                        \"value\": \",\"\n                      },\n                      {\n                        \"type\": \"CHOICE\",\n                        \"members\": [\n                          {\n                            \"type\": \"FIELD\",\n                            \"name\": \"export\",\n                            \"content\": {\n                              \"type\": \"ALIAS\",\n                              \"content\": {\n                                \"type\": \"SYMBOL\",\n                                \"name\": \"_ie_entity\"\n                              },\n                              \"named\": true,\n                              \"value\": \"export\"\n                            }\n                          },\n                          {\n                            \"type\": \"SYMBOL\",\n                            \"name\": \"module_export\"\n                          }\n                        ]\n                      }\n                    ]\n                  }\n                }\n              ]\n            },\n            {\n              \"type\": \"BLANK\"\n            }\n          ]\n        },\n        {\n          \"type\": \"CHOICE\",\n          \"members\": [\n            {\n              \"type\": \"STRING\",\n              \"value\": \",\"\n            },\n            {\n              \"type\": \"BLANK\"\n            }\n          ]\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_paren_close\"\n        }\n      ]\n    },\n    \"header\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"STRING\",\n          \"value\": \"module\"\n        },\n        {\n          \"type\": \"FIELD\",\n          \"name\": \"module\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"module\"\n          }\n        },\n        {\n          \"type\": \"FIELD\",\n          \"name\": \"exports\",\n          \"content\": {\n            \"type\": \"CHOICE\",\n            \"members\": [\n              {\n                \"type\": \"SYMBOL\",\n                \"name\": \"exports\"\n              },\n              {\n                \"type\": \"BLANK\"\n              }\n            ]\n          }\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_where\"\n        }\n      ]\n    },\n    \"imports\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"SEQ\",\n          \"members\": [\n            {\n              \"type\": \"FIELD\",\n              \"name\": \"import\",\n              \"content\": {\n                \"type\": \"SYMBOL\",\n                \"name\": \"import\"\n              }\n            },\n            {\n              \"type\": \"REPEAT\",\n              \"content\": {\n                \"type\": \"SEQ\",\n                \"members\": [\n                  {\n                    \"type\": \"CHOICE\",\n                    \"members\": [\n                      {\n                        \"type\": \"REPEAT1\",\n                        \"content\": {\n                          \"type\": \"STRING\",\n                          \"value\": \";\"\n                        }\n                      },\n                      {\n                        \"type\": \"SYMBOL\",\n                        \"name\": \"_cond_layout_semicolon\"\n                      }\n                    ]\n                  },\n                  {\n                    \"type\": \"FIELD\",\n                    \"name\": \"import\",\n                    \"content\": {\n                      \"type\": \"SYMBOL\",\n                      \"name\": \"import\"\n                    }\n                  }\n                ]\n              }\n            }\n          ]\n        },\n        {\n          \"type\": \"CHOICE\",\n          \"members\": [\n            {\n              \"type\": \"REPEAT1\",\n              \"content\": {\n                \"type\": \"STRING\",\n                \"value\": \";\"\n              }\n            },\n            {\n              \"type\": \"SYMBOL\",\n              \"name\": \"_cond_layout_semicolon\"\n            }\n          ]\n        }\n      ]\n    },\n    \"declarations\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"declaration\"\n        },\n        {\n          \"type\": \"REPEAT\",\n          \"content\": {\n            \"type\": \"SEQ\",\n            \"members\": [\n              {\n                \"type\": \"CHOICE\",\n                \"members\": [\n                  {\n                    \"type\": \"REPEAT1\",\n                    \"content\": {\n                      \"type\": \"STRING\",\n                      \"value\": \";\"\n                    }\n                  },\n                  {\n                    \"type\": \"SYMBOL\",\n                    \"name\": \"_cond_layout_semicolon\"\n                  }\n                ]\n              },\n              {\n                \"type\": \"CHOICE\",\n                \"members\": [\n                  {\n                    \"type\": \"SYMBOL\",\n                    \"name\": \"declaration\"\n                  },\n                  {\n                    \"type\": \"SYMBOL\",\n                    \"name\": \"import\"\n                  }\n                ]\n              }\n            ]\n          }\n        },\n        {\n          \"type\": \"CHOICE\",\n          \"members\": [\n            {\n              \"type\": \"CHOICE\",\n              \"members\": [\n                {\n                  \"type\": \"REPEAT1\",\n                  \"content\": {\n                    \"type\": \"STRING\",\n                    \"value\": \";\"\n                  }\n                },\n                {\n                  \"type\": \"SYMBOL\",\n                  \"name\": \"_cond_layout_semicolon\"\n                }\n              ]\n            },\n            {\n              \"type\": \"BLANK\"\n            }\n          ]\n        }\n      ]\n    },\n    \"_body\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"CHOICE\",\n          \"members\": [\n            {\n              \"type\": \"SYMBOL\",\n              \"name\": \"_cmd_layout_start\"\n            },\n            {\n              \"type\": \"ALIAS\",\n              \"content\": {\n                \"type\": \"SYMBOL\",\n                \"name\": \"_cmd_layout_start_explicit\"\n              },\n              \"named\": false,\n              \"value\": \"{\"\n            }\n          ]\n        },\n        {\n          \"type\": \"CHOICE\",\n          \"members\": [\n            {\n              \"type\": \"CHOICE\",\n              \"members\": [\n                {\n                  \"type\": \"REPEAT1\",\n                  \"content\": {\n                    \"type\": \"STRING\",\n                    \"value\": \";\"\n                  }\n                },\n                {\n                  \"type\": \"SYMBOL\",\n                  \"name\": \"_cond_layout_semicolon\"\n                }\n              ]\n            },\n            {\n              \"type\": \"BLANK\"\n            }\n          ]\n        },\n        {\n          \"type\": \"FIELD\",\n          \"name\": \"imports\",\n          \"content\": {\n            \"type\": \"CHOICE\",\n            \"members\": [\n              {\n                \"type\": \"SYMBOL\",\n                \"name\": \"imports\"\n              },\n              {\n                \"type\": \"BLANK\"\n              }\n            ]\n          }\n        },\n        {\n          \"type\": \"FIELD\",\n          \"name\": \"declarations\",\n          \"content\": {\n            \"type\": \"CHOICE\",\n            \"members\": [\n              {\n                \"type\": \"SYMBOL\",\n                \"name\": \"declarations\"\n              },\n              {\n                \"type\": \"BLANK\"\n              }\n            ]\n          }\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_layout_end\"\n        }\n      ]\n    },\n    \"_layout_end\": {\n      \"type\": \"CHOICE\",\n      \"members\": [\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_cond_layout_end\"\n        },\n        {\n          \"type\": \"ALIAS\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_cond_layout_end_explicit\"\n          },\n          \"named\": false,\n          \"value\": \"}\"\n        }\n      ]\n    },\n    \"declaration\": {\n      \"type\": \"CHOICE\",\n      \"members\": [\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"decl\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"type_synomym\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"kind_signature\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"type_family\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"type_instance\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"role_annotation\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"data_type\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"newtype\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"data_family\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"data_instance\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"class\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"instance\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"default_types\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"deriving_instance\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"pattern_synonym\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"foreign_import\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"foreign_export\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"fixity\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"top_splice\"\n        }\n      ]\n    },\n    \"field_name\": {\n      \"type\": \"SYMBOL\",\n      \"name\": \"variable\"\n    },\n    \"_qfield_name\": {\n      \"type\": \"PREC\",\n      \"value\": \"qualified-id\",\n      \"content\": {\n        \"type\": \"SEQ\",\n        \"members\": [\n          {\n            \"type\": \"FIELD\",\n            \"name\": \"module\",\n            \"content\": {\n              \"type\": \"ALIAS\",\n              \"content\": {\n                \"type\": \"SYMBOL\",\n                \"name\": \"_qualifying_module\"\n              },\n              \"named\": true,\n              \"value\": \"module\"\n            }\n          },\n          {\n            \"type\": \"FIELD\",\n            \"name\": \"id\",\n            \"content\": {\n              \"type\": \"SYMBOL\",\n              \"name\": \"field_name\"\n            }\n          }\n        ]\n      }\n    },\n    \"_field_names\": {\n      \"type\": \"CHOICE\",\n      \"members\": [\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"field_name\"\n        },\n        {\n          \"type\": \"ALIAS\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_qfield_name\"\n          },\n          \"named\": true,\n          \"value\": \"qualified\"\n        }\n      ]\n    },\n    \"field_path\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"FIELD\",\n          \"name\": \"field\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_field_names\"\n          }\n        },\n        {\n          \"type\": \"REPEAT1\",\n          \"content\": {\n            \"type\": \"SEQ\",\n            \"members\": [\n              {\n                \"type\": \"SYMBOL\",\n                \"name\": \"_tight_dot\"\n              },\n              {\n                \"type\": \"FIELD\",\n                \"name\": \"subfield\",\n                \"content\": {\n                  \"type\": \"SYMBOL\",\n                  \"name\": \"field_name\"\n                }\n              }\n            ]\n          }\n        }\n      ]\n    },\n    \"_field_spec\": {\n      \"type\": \"CHOICE\",\n      \"members\": [\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_field_names\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"field_path\"\n        }\n      ]\n    },\n    \"field\": {\n      \"type\": \"PREC\",\n      \"value\": \"annotated\",\n      \"content\": {\n        \"type\": \"SEQ\",\n        \"members\": [\n          {\n            \"type\": \"SEQ\",\n            \"members\": [\n              {\n                \"type\": \"FIELD\",\n                \"name\": \"name\",\n                \"content\": {\n                  \"type\": \"SYMBOL\",\n                  \"name\": \"field_name\"\n                }\n              },\n              {\n                \"type\": \"REPEAT\",\n                \"content\": {\n                  \"type\": \"SEQ\",\n                  \"members\": [\n                    {\n                      \"type\": \"STRING\",\n                      \"value\": \",\"\n                    },\n                    {\n                      \"type\": \"FIELD\",\n                      \"name\": \"name\",\n                      \"content\": {\n                        \"type\": \"SYMBOL\",\n                        \"name\": \"field_name\"\n                      }\n                    }\n                  ]\n                }\n              }\n            ]\n          },\n          {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_colon2\"\n          },\n          {\n            \"type\": \"FIELD\",\n            \"name\": \"type\",\n            \"content\": {\n              \"type\": \"SYMBOL\",\n              \"name\": \"_parameter_type\"\n            }\n          }\n        ]\n      }\n    },\n    \"_record_fields\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"STRING\",\n          \"value\": \"{\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_cmd_brace_open\"\n        },\n        {\n          \"type\": \"CHOICE\",\n          \"members\": [\n            {\n              \"type\": \"SEQ\",\n              \"members\": [\n                {\n                  \"type\": \"FIELD\",\n                  \"name\": \"field\",\n                  \"content\": {\n                    \"type\": \"SYMBOL\",\n                    \"name\": \"field\"\n                  }\n                },\n                {\n                  \"type\": \"REPEAT\",\n                  \"content\": {\n                    \"type\": \"SEQ\",\n                    \"members\": [\n                      {\n                        \"type\": \"STRING\",\n                        \"value\": \",\"\n                      },\n                      {\n                        \"type\": \"FIELD\",\n                        \"name\": \"field\",\n                        \"content\": {\n                          \"type\": \"SYMBOL\",\n                          \"name\": \"field\"\n                        }\n                      }\n                    ]\n                  }\n                }\n              ]\n            },\n            {\n              \"type\": \"BLANK\"\n            }\n          ]\n        },\n        {\n          \"type\": \"CHOICE\",\n          \"members\": [\n            {\n              \"type\": \"STRING\",\n              \"value\": \",\"\n            },\n            {\n              \"type\": \"BLANK\"\n            }\n          ]\n        },\n        {\n          \"type\": \"STRING\",\n          \"value\": \"}\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_cmd_brace_close\"\n        }\n      ]\n    },\n    \"via\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"STRING\",\n          \"value\": \"via\"\n        },\n        {\n          \"type\": \"FIELD\",\n          \"name\": \"type\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"quantified_type\"\n          }\n        }\n      ]\n    },\n    \"deriving_strategy\": {\n      \"type\": \"CHOICE\",\n      \"members\": [\n        {\n          \"type\": \"STRING\",\n          \"value\": \"stock\"\n        },\n        {\n          \"type\": \"STRING\",\n          \"value\": \"newtype\"\n        },\n        {\n          \"type\": \"STRING\",\n          \"value\": \"anyclass\"\n        }\n      ]\n    },\n    \"deriving\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"CHOICE\",\n          \"members\": [\n            {\n              \"type\": \"SYMBOL\",\n              \"name\": \"_phantom_deriving\"\n            },\n            {\n              \"type\": \"BLANK\"\n            }\n          ]\n        },\n        {\n          \"type\": \"STRING\",\n          \"value\": \"deriving\"\n        },\n        {\n          \"type\": \"CHOICE\",\n          \"members\": [\n            {\n              \"type\": \"FIELD\",\n              \"name\": \"strategy\",\n              \"content\": {\n                \"type\": \"SYMBOL\",\n                \"name\": \"deriving_strategy\"\n              }\n            },\n            {\n              \"type\": \"BLANK\"\n            }\n          ]\n        },\n        {\n          \"type\": \"FIELD\",\n          \"name\": \"classes\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"constraint\"\n          }\n        },\n        {\n          \"type\": \"CHOICE\",\n          \"members\": [\n            {\n              \"type\": \"FIELD\",\n              \"name\": \"via\",\n              \"content\": {\n                \"type\": \"SYMBOL\",\n                \"name\": \"via\"\n              }\n            },\n            {\n              \"type\": \"BLANK\"\n            }\n          ]\n        }\n      ]\n    },\n    \"_gadt_con_prefix\": {\n      \"type\": \"FIELD\",\n      \"name\": \"type\",\n      \"content\": {\n        \"type\": \"SYMBOL\",\n        \"name\": \"quantified_type\"\n      }\n    },\n    \"_gadt_con_record\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"FIELD\",\n          \"name\": \"fields\",\n          \"content\": {\n            \"type\": \"ALIAS\",\n            \"content\": {\n              \"type\": \"SYMBOL\",\n              \"name\": \"_record_fields\"\n            },\n            \"named\": true,\n            \"value\": \"fields\"\n          }\n        },\n        {\n          \"type\": \"FIELD\",\n          \"name\": \"arrow\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_fun_arrow\"\n          }\n        },\n        {\n          \"type\": \"FIELD\",\n          \"name\": \"type\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"quantified_type\"\n          }\n        }\n      ]\n    },\n    \"gadt_constructor\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"CHOICE\",\n          \"members\": [\n            {\n              \"type\": \"FIELD\",\n              \"name\": \"name\",\n              \"content\": {\n                \"type\": \"SYMBOL\",\n                \"name\": \"_con\"\n              }\n            },\n            {\n              \"type\": \"FIELD\",\n              \"name\": \"names\",\n              \"content\": {\n                \"type\": \"ALIAS\",\n                \"content\": {\n                  \"type\": \"SYMBOL\",\n                  \"name\": \"_con_binding_list\"\n                },\n                \"named\": true,\n                \"value\": \"binding_list\"\n              }\n            }\n          ]\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_colon2\"\n        },\n        {\n          \"type\": \"CHOICE\",\n          \"members\": [\n            {\n              \"type\": \"FIELD\",\n              \"name\": \"forall\",\n              \"content\": {\n                \"type\": \"SYMBOL\",\n                \"name\": \"_forall\"\n              }\n            },\n            {\n              \"type\": \"BLANK\"\n            }\n          ]\n        },\n        {\n          \"type\": \"CHOICE\",\n          \"members\": [\n            {\n              \"type\": \"FIELD\",\n              \"name\": \"context\",\n              \"content\": {\n                \"type\": \"SYMBOL\",\n                \"name\": \"context\"\n              }\n            },\n            {\n              \"type\": \"BLANK\"\n            }\n          ]\n        },\n        {\n          \"type\": \"FIELD\",\n          \"name\": \"type\",\n          \"content\": {\n            \"type\": \"CHOICE\",\n            \"members\": [\n              {\n                \"type\": \"ALIAS\",\n                \"content\": {\n                  \"type\": \"SYMBOL\",\n                  \"name\": \"_gadt_con_prefix\"\n                },\n                \"named\": true,\n                \"value\": \"prefix\"\n              },\n              {\n                \"type\": \"ALIAS\",\n                \"content\": {\n                  \"type\": \"SYMBOL\",\n                  \"name\": \"_gadt_con_record\"\n                },\n                \"named\": true,\n                \"value\": \"record\"\n              }\n            ]\n          }\n        }\n      ]\n    },\n    \"gadt_constructors\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"CHOICE\",\n          \"members\": [\n            {\n              \"type\": \"SYMBOL\",\n              \"name\": \"_cmd_layout_start\"\n            },\n            {\n              \"type\": \"ALIAS\",\n              \"content\": {\n                \"type\": \"SYMBOL\",\n                \"name\": \"_cmd_layout_start_explicit\"\n              },\n              \"named\": false,\n              \"value\": \"{\"\n            }\n          ]\n        },\n        {\n          \"type\": \"CHOICE\",\n          \"members\": [\n            {\n              \"type\": \"SEQ\",\n              \"members\": [\n                {\n                  \"type\": \"CHOICE\",\n                  \"members\": [\n                    {\n                      \"type\": \"CHOICE\",\n                      \"members\": [\n                        {\n                          \"type\": \"REPEAT1\",\n                          \"content\": {\n                            \"type\": \"STRING\",\n                            \"value\": \";\"\n                          }\n                        },\n                        {\n                          \"type\": \"SYMBOL\",\n                          \"name\": \"_cond_layout_semicolon\"\n                        }\n                      ]\n                    },\n                    {\n                      \"type\": \"BLANK\"\n                    }\n                  ]\n                },\n                {\n                  \"type\": \"SEQ\",\n                  \"members\": [\n                    {\n                      \"type\": \"FIELD\",\n                      \"name\": \"constructor\",\n                      \"content\": {\n                        \"type\": \"SYMBOL\",\n                        \"name\": \"gadt_constructor\"\n                      }\n                    },\n                    {\n                      \"type\": \"REPEAT\",\n                      \"content\": {\n                        \"type\": \"SEQ\",\n                        \"members\": [\n                          {\n                            \"type\": \"CHOICE\",\n                            \"members\": [\n                              {\n                                \"type\": \"REPEAT1\",\n                                \"content\": {\n                                  \"type\": \"STRING\",\n                                  \"value\": \";\"\n                                }\n                              },\n                              {\n                                \"type\": \"SYMBOL\",\n                                \"name\": \"_cond_layout_semicolon\"\n                              }\n                            ]\n                          },\n                          {\n                            \"type\": \"FIELD\",\n                            \"name\": \"constructor\",\n                            \"content\": {\n                              \"type\": \"SYMBOL\",\n                              \"name\": \"gadt_constructor\"\n                            }\n                          }\n                        ]\n                      }\n                    }\n                  ]\n                },\n                {\n                  \"type\": \"CHOICE\",\n                  \"members\": [\n                    {\n                      \"type\": \"CHOICE\",\n                      \"members\": [\n                        {\n                          \"type\": \"REPEAT1\",\n                          \"content\": {\n                            \"type\": \"STRING\",\n                            \"value\": \";\"\n                          }\n                        },\n                        {\n                          \"type\": \"SYMBOL\",\n                          \"name\": \"_cond_layout_semicolon\"\n                        }\n                      ]\n                    },\n                    {\n                      \"type\": \"BLANK\"\n                    }\n                  ]\n                }\n              ]\n            },\n            {\n              \"type\": \"BLANK\"\n            }\n          ]\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_layout_end\"\n        }\n      ]\n    },\n    \"_gadt\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"CHOICE\",\n          \"members\": [\n            {\n              \"type\": \"SYMBOL\",\n              \"name\": \"_kind_annotation\"\n            },\n            {\n              \"type\": \"BLANK\"\n            }\n          ]\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_where\"\n        },\n        {\n          \"type\": \"CHOICE\",\n          \"members\": [\n            {\n              \"type\": \"FIELD\",\n              \"name\": \"constructors\",\n              \"content\": {\n                \"type\": \"SYMBOL\",\n                \"name\": \"gadt_constructors\"\n              }\n            },\n            {\n              \"type\": \"BLANK\"\n            }\n          ]\n        }\n      ]\n    },\n    \"_field_type\": {\n      \"type\": \"CHOICE\",\n      \"members\": [\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"strict_field\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"lazy_field\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"type\"\n        }\n      ]\n    },\n    \"_datacon_prefix\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"FIELD\",\n          \"name\": \"name\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_con\"\n          }\n        },\n        {\n          \"type\": \"REPEAT\",\n          \"content\": {\n            \"type\": \"PREC\",\n            \"value\": \"patterns\",\n            \"content\": {\n              \"type\": \"FIELD\",\n              \"name\": \"field\",\n              \"content\": {\n                \"type\": \"SYMBOL\",\n                \"name\": \"_field_type\"\n              }\n            }\n          }\n        }\n      ]\n    },\n    \"_datacon_infix\": {\n      \"type\": \"PREC\",\n      \"value\": \"infix\",\n      \"content\": {\n        \"type\": \"SEQ\",\n        \"members\": [\n          {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_cond_data_infix\"\n          },\n          {\n            \"type\": \"FIELD\",\n            \"name\": \"left_operand\",\n            \"content\": {\n              \"type\": \"SYMBOL\",\n              \"name\": \"_field_type\"\n            }\n          },\n          {\n            \"type\": \"FIELD\",\n            \"name\": \"operator\",\n            \"content\": {\n              \"type\": \"SYMBOL\",\n              \"name\": \"_conop\"\n            }\n          },\n          {\n            \"type\": \"FIELD\",\n            \"name\": \"right_operand\",\n            \"content\": {\n              \"type\": \"SYMBOL\",\n              \"name\": \"_field_type\"\n            }\n          }\n        ]\n      }\n    },\n    \"_datacon_record\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"FIELD\",\n          \"name\": \"name\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_constructor\"\n          }\n        },\n        {\n          \"type\": \"FIELD\",\n          \"name\": \"fields\",\n          \"content\": {\n            \"type\": \"ALIAS\",\n            \"content\": {\n              \"type\": \"SYMBOL\",\n              \"name\": \"_record_fields\"\n            },\n            \"named\": true,\n            \"value\": \"fields\"\n          }\n        }\n      ]\n    },\n    \"_datacon_unboxed_sum\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_unboxed_open\"\n        },\n        {\n          \"type\": \"CHOICE\",\n          \"members\": [\n            {\n              \"type\": \"SEQ\",\n              \"members\": [\n                {\n                  \"type\": \"REPEAT1\",\n                  \"content\": {\n                    \"type\": \"SYMBOL\",\n                    \"name\": \"_unboxed_bar\"\n                  }\n                },\n                {\n                  \"type\": \"FIELD\",\n                  \"name\": \"element\",\n                  \"content\": {\n                    \"type\": \"SYMBOL\",\n                    \"name\": \"quantified_type\"\n                  }\n                }\n              ]\n            },\n            {\n              \"type\": \"SEQ\",\n              \"members\": [\n                {\n                  \"type\": \"FIELD\",\n                  \"name\": \"element\",\n                  \"content\": {\n                    \"type\": \"SYMBOL\",\n                    \"name\": \"quantified_type\"\n                  }\n                },\n                {\n                  \"type\": \"SYMBOL\",\n                  \"name\": \"_unboxed_bar\"\n                }\n              ]\n            }\n          ]\n        },\n        {\n          \"type\": \"REPEAT\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_unboxed_bar\"\n          }\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_unboxed_close\"\n        }\n      ]\n    },\n    \"_datacon_special\": {\n      \"type\": \"CHOICE\",\n      \"members\": [\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"unit\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"unboxed_unit\"\n        },\n        {\n          \"type\": \"ALIAS\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_plist\"\n          },\n          \"named\": true,\n          \"value\": \"empty_list\"\n        },\n        {\n          \"type\": \"ALIAS\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_type_tuple\"\n          },\n          \"named\": true,\n          \"value\": \"tuple\"\n        },\n        {\n          \"type\": \"ALIAS\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_type_unboxed_tuple\"\n          },\n          \"named\": true,\n          \"value\": \"unboxed_tuple\"\n        },\n        {\n          \"type\": \"ALIAS\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_datacon_unboxed_sum\"\n          },\n          \"named\": true,\n          \"value\": \"unboxed_sum\"\n        }\n      ]\n    },\n    \"data_constructor\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"CHOICE\",\n          \"members\": [\n            {\n              \"type\": \"FIELD\",\n              \"name\": \"forall\",\n              \"content\": {\n                \"type\": \"SYMBOL\",\n                \"name\": \"_forall\"\n              }\n            },\n            {\n              \"type\": \"BLANK\"\n            }\n          ]\n        },\n        {\n          \"type\": \"CHOICE\",\n          \"members\": [\n            {\n              \"type\": \"FIELD\",\n              \"name\": \"context\",\n              \"content\": {\n                \"type\": \"SYMBOL\",\n                \"name\": \"context\"\n              }\n            },\n            {\n              \"type\": \"BLANK\"\n            }\n          ]\n        },\n        {\n          \"type\": \"FIELD\",\n          \"name\": \"constructor\",\n          \"content\": {\n            \"type\": \"CHOICE\",\n            \"members\": [\n              {\n                \"type\": \"ALIAS\",\n                \"content\": {\n                  \"type\": \"SYMBOL\",\n                  \"name\": \"_datacon_prefix\"\n                },\n                \"named\": true,\n                \"value\": \"prefix\"\n              },\n              {\n                \"type\": \"ALIAS\",\n                \"content\": {\n                  \"type\": \"SYMBOL\",\n                  \"name\": \"_datacon_infix\"\n                },\n                \"named\": true,\n                \"value\": \"infix\"\n              },\n              {\n                \"type\": \"ALIAS\",\n                \"content\": {\n                  \"type\": \"SYMBOL\",\n                  \"name\": \"_datacon_record\"\n                },\n                \"named\": true,\n                \"value\": \"record\"\n              },\n              {\n                \"type\": \"ALIAS\",\n                \"content\": {\n                  \"type\": \"SYMBOL\",\n                  \"name\": \"_datacon_special\"\n                },\n                \"named\": true,\n                \"value\": \"special\"\n              }\n            ]\n          }\n        }\n      ]\n    },\n    \"data_constructors\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"FIELD\",\n          \"name\": \"constructor\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"data_constructor\"\n          }\n        },\n        {\n          \"type\": \"REPEAT\",\n          \"content\": {\n            \"type\": \"SEQ\",\n            \"members\": [\n              {\n                \"type\": \"SYMBOL\",\n                \"name\": \"_bar\"\n              },\n              {\n                \"type\": \"FIELD\",\n                \"name\": \"constructor\",\n                \"content\": {\n                  \"type\": \"SYMBOL\",\n                  \"name\": \"data_constructor\"\n                }\n              }\n            ]\n          }\n        }\n      ]\n    },\n    \"_data_rhs\": {\n      \"type\": \"CHOICE\",\n      \"members\": [\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_kind_annotation\"\n        },\n        {\n          \"type\": \"SEQ\",\n          \"members\": [\n            {\n              \"type\": \"STRING\",\n              \"value\": \"=\"\n            },\n            {\n              \"type\": \"FIELD\",\n              \"name\": \"constructors\",\n              \"content\": {\n                \"type\": \"SYMBOL\",\n                \"name\": \"data_constructors\"\n              }\n            }\n          ]\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_gadt\"\n        }\n      ]\n    },\n    \"_data\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"CHOICE\",\n          \"members\": [\n            {\n              \"type\": \"FIELD\",\n              \"name\": \"context\",\n              \"content\": {\n                \"type\": \"SYMBOL\",\n                \"name\": \"context\"\n              }\n            },\n            {\n              \"type\": \"BLANK\"\n            }\n          ]\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_type_head\"\n        },\n        {\n          \"type\": \"CHOICE\",\n          \"members\": [\n            {\n              \"type\": \"SYMBOL\",\n              \"name\": \"_data_rhs\"\n            },\n            {\n              \"type\": \"BLANK\"\n            }\n          ]\n        },\n        {\n          \"type\": \"REPEAT\",\n          \"content\": {\n            \"type\": \"FIELD\",\n            \"name\": \"deriving\",\n            \"content\": {\n              \"type\": \"SYMBOL\",\n              \"name\": \"deriving\"\n            }\n          }\n        }\n      ]\n    },\n    \"data_type\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"CHOICE\",\n          \"members\": [\n            {\n              \"type\": \"STRING\",\n              \"value\": \"type\"\n            },\n            {\n              \"type\": \"BLANK\"\n            }\n          ]\n        },\n        {\n          \"type\": \"STRING\",\n          \"value\": \"data\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_data\"\n        }\n      ]\n    },\n    \"_newtype_con_field\": {\n      \"type\": \"SYMBOL\",\n      \"name\": \"type\"\n    },\n    \"newtype_constructor\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"FIELD\",\n          \"name\": \"name\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_con\"\n          }\n        },\n        {\n          \"type\": \"FIELD\",\n          \"name\": \"field\",\n          \"content\": {\n            \"type\": \"CHOICE\",\n            \"members\": [\n              {\n                \"type\": \"ALIAS\",\n                \"content\": {\n                  \"type\": \"SYMBOL\",\n                  \"name\": \"_newtype_con_field\"\n                },\n                \"named\": true,\n                \"value\": \"field\"\n              },\n              {\n                \"type\": \"ALIAS\",\n                \"content\": {\n                  \"type\": \"SYMBOL\",\n                  \"name\": \"_record_fields\"\n                },\n                \"named\": true,\n                \"value\": \"record\"\n              }\n            ]\n          }\n        }\n      ]\n    },\n    \"_newtype\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"CHOICE\",\n          \"members\": [\n            {\n              \"type\": \"SEQ\",\n              \"members\": [\n                {\n                  \"type\": \"STRING\",\n                  \"value\": \"=\"\n                },\n                {\n                  \"type\": \"FIELD\",\n                  \"name\": \"constructor\",\n                  \"content\": {\n                    \"type\": \"SYMBOL\",\n                    \"name\": \"newtype_constructor\"\n                  }\n                }\n              ]\n            },\n            {\n              \"type\": \"SYMBOL\",\n              \"name\": \"_gadt\"\n            }\n          ]\n        },\n        {\n          \"type\": \"REPEAT\",\n          \"content\": {\n            \"type\": \"FIELD\",\n            \"name\": \"deriving\",\n            \"content\": {\n              \"type\": \"SYMBOL\",\n              \"name\": \"deriving\"\n            }\n          }\n        }\n      ]\n    },\n    \"newtype\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"STRING\",\n          \"value\": \"newtype\"\n        },\n        {\n          \"type\": \"CHOICE\",\n          \"members\": [\n            {\n              \"type\": \"FIELD\",\n              \"name\": \"context\",\n              \"content\": {\n                \"type\": \"SYMBOL\",\n                \"name\": \"context\"\n              }\n            },\n            {\n              \"type\": \"BLANK\"\n            }\n          ]\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_type_head\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_newtype\"\n        }\n      ]\n    },\n    \"_datafam\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_type_head\"\n        },\n        {\n          \"type\": \"CHOICE\",\n          \"members\": [\n            {\n              \"type\": \"SYMBOL\",\n              \"name\": \"_kind_annotation\"\n            },\n            {\n              \"type\": \"BLANK\"\n            }\n          ]\n        }\n      ]\n    },\n    \"data_family\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"STRING\",\n          \"value\": \"data\"\n        },\n        {\n          \"type\": \"STRING\",\n          \"value\": \"family\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_datafam\"\n        }\n      ]\n    },\n    \"_inst_adt\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"CHOICE\",\n          \"members\": [\n            {\n              \"type\": \"FIELD\",\n              \"name\": \"forall\",\n              \"content\": {\n                \"type\": \"SYMBOL\",\n                \"name\": \"_forall\"\n              }\n            },\n            {\n              \"type\": \"BLANK\"\n            }\n          ]\n        },\n        {\n          \"type\": \"CHOICE\",\n          \"members\": [\n            {\n              \"type\": \"FIELD\",\n              \"name\": \"context\",\n              \"content\": {\n                \"type\": \"SYMBOL\",\n                \"name\": \"context\"\n              }\n            },\n            {\n              \"type\": \"BLANK\"\n            }\n          ]\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_type_instance_head\"\n        },\n        {\n          \"type\": \"CHOICE\",\n          \"members\": [\n            {\n              \"type\": \"SYMBOL\",\n              \"name\": \"_data_rhs\"\n            },\n            {\n              \"type\": \"BLANK\"\n            }\n          ]\n        },\n        {\n          \"type\": \"REPEAT\",\n          \"content\": {\n            \"type\": \"FIELD\",\n            \"name\": \"deriving\",\n            \"content\": {\n              \"type\": \"SYMBOL\",\n              \"name\": \"deriving\"\n            }\n          }\n        }\n      ]\n    },\n    \"decl_inst_adt\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"STRING\",\n          \"value\": \"data\"\n        },\n        {\n          \"type\": \"STRING\",\n          \"value\": \"instance\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_inst_adt\"\n        }\n      ]\n    },\n    \"_inst_newtype\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"CHOICE\",\n          \"members\": [\n            {\n              \"type\": \"FIELD\",\n              \"name\": \"forall\",\n              \"content\": {\n                \"type\": \"SYMBOL\",\n                \"name\": \"_forall\"\n              }\n            },\n            {\n              \"type\": \"BLANK\"\n            }\n          ]\n        },\n        {\n          \"type\": \"CHOICE\",\n          \"members\": [\n            {\n              \"type\": \"FIELD\",\n              \"name\": \"context\",\n              \"content\": {\n                \"type\": \"SYMBOL\",\n                \"name\": \"context\"\n              }\n            },\n            {\n              \"type\": \"BLANK\"\n            }\n          ]\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_type_instance_head\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_newtype\"\n        }\n      ]\n    },\n    \"decl_inst_newtype\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"STRING\",\n          \"value\": \"newtype\"\n        },\n        {\n          \"type\": \"STRING\",\n          \"value\": \"instance\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_inst_newtype\"\n        }\n      ]\n    },\n    \"data_instance\": {\n      \"type\": \"CHOICE\",\n      \"members\": [\n        {\n          \"type\": \"ALIAS\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"decl_inst_adt\"\n          },\n          \"named\": true,\n          \"value\": \"data_type\"\n        },\n        {\n          \"type\": \"ALIAS\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"decl_inst_newtype\"\n          },\n          \"named\": true,\n          \"value\": \"newtype\"\n        }\n      ]\n    },\n    \"_assoc_tyfam\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"STRING\",\n          \"value\": \"type\"\n        },\n        {\n          \"type\": \"CHOICE\",\n          \"members\": [\n            {\n              \"type\": \"STRING\",\n              \"value\": \"family\"\n            },\n            {\n              \"type\": \"BLANK\"\n            }\n          ]\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_type_head\"\n        },\n        {\n          \"type\": \"CHOICE\",\n          \"members\": [\n            {\n              \"type\": \"CHOICE\",\n              \"members\": [\n                {\n                  \"type\": \"SYMBOL\",\n                  \"name\": \"_kind_annotation\"\n                },\n                {\n                  \"type\": \"SEQ\",\n                  \"members\": [\n                    {\n                      \"type\": \"SYMBOL\",\n                      \"name\": \"type_family_result\"\n                    },\n                    {\n                      \"type\": \"SYMBOL\",\n                      \"name\": \"type_family_injectivity\"\n                    }\n                  ]\n                }\n              ]\n            },\n            {\n              \"type\": \"BLANK\"\n            }\n          ]\n        }\n      ]\n    },\n    \"_assoc_tyinst\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"STRING\",\n          \"value\": \"type\"\n        },\n        {\n          \"type\": \"CHOICE\",\n          \"members\": [\n            {\n              \"type\": \"STRING\",\n              \"value\": \"instance\"\n            },\n            {\n              \"type\": \"BLANK\"\n            }\n          ]\n        },\n        {\n          \"type\": \"CHOICE\",\n          \"members\": [\n            {\n              \"type\": \"FIELD\",\n              \"name\": \"forall\",\n              \"content\": {\n                \"type\": \"SYMBOL\",\n                \"name\": \"_forall\"\n              }\n            },\n            {\n              \"type\": \"BLANK\"\n            }\n          ]\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_cond_assoc_tyinst\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_type_instance_common\"\n        }\n      ]\n    },\n    \"_assoc_datafam\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"STRING\",\n          \"value\": \"data\"\n        },\n        {\n          \"type\": \"CHOICE\",\n          \"members\": [\n            {\n              \"type\": \"STRING\",\n              \"value\": \"family\"\n            },\n            {\n              \"type\": \"BLANK\"\n            }\n          ]\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_datafam\"\n        }\n      ]\n    },\n    \"_assoc_datainst_adt\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"STRING\",\n          \"value\": \"data\"\n        },\n        {\n          \"type\": \"CHOICE\",\n          \"members\": [\n            {\n              \"type\": \"STRING\",\n              \"value\": \"instance\"\n            },\n            {\n              \"type\": \"BLANK\"\n            }\n          ]\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_inst_adt\"\n        }\n      ]\n    },\n    \"_assoc_datainst_newtype\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"STRING\",\n          \"value\": \"newtype\"\n        },\n        {\n          \"type\": \"CHOICE\",\n          \"members\": [\n            {\n              \"type\": \"STRING\",\n              \"value\": \"instance\"\n            },\n            {\n              \"type\": \"BLANK\"\n            }\n          ]\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_inst_newtype\"\n        }\n      ]\n    },\n    \"_assoc_datainst\": {\n      \"type\": \"CHOICE\",\n      \"members\": [\n        {\n          \"type\": \"ALIAS\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_assoc_datainst_adt\"\n          },\n          \"named\": true,\n          \"value\": \"data_type\"\n        },\n        {\n          \"type\": \"ALIAS\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_assoc_datainst_newtype\"\n          },\n          \"named\": true,\n          \"value\": \"newtype\"\n        }\n      ]\n    },\n    \"default_signature\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"STRING\",\n          \"value\": \"default\"\n        },\n        {\n          \"type\": \"FIELD\",\n          \"name\": \"signature\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"signature\"\n          }\n        }\n      ]\n    },\n    \"class_decl\": {\n      \"type\": \"CHOICE\",\n      \"members\": [\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_local_decl\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"default_signature\"\n        },\n        {\n          \"type\": \"ALIAS\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_assoc_tyfam\"\n          },\n          \"named\": true,\n          \"value\": \"type_family\"\n        },\n        {\n          \"type\": \"ALIAS\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_assoc_tyinst\"\n          },\n          \"named\": true,\n          \"value\": \"type_instance\"\n        },\n        {\n          \"type\": \"ALIAS\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_assoc_datafam\"\n          },\n          \"named\": true,\n          \"value\": \"data_family\"\n        }\n      ]\n    },\n    \"fundep\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"FIELD\",\n          \"name\": \"matched\",\n          \"content\": {\n            \"type\": \"REPEAT1\",\n            \"content\": {\n              \"type\": \"SYMBOL\",\n              \"name\": \"variable\"\n            }\n          }\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_arrow\"\n        },\n        {\n          \"type\": \"FIELD\",\n          \"name\": \"determined\",\n          \"content\": {\n            \"type\": \"REPEAT1\",\n            \"content\": {\n              \"type\": \"SYMBOL\",\n              \"name\": \"variable\"\n            }\n          }\n        }\n      ]\n    },\n    \"fundeps\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_bar\"\n        },\n        {\n          \"type\": \"SEQ\",\n          \"members\": [\n            {\n              \"type\": \"FIELD\",\n              \"name\": \"fundep\",\n              \"content\": {\n                \"type\": \"SYMBOL\",\n                \"name\": \"fundep\"\n              }\n            },\n            {\n              \"type\": \"REPEAT\",\n              \"content\": {\n                \"type\": \"SEQ\",\n                \"members\": [\n                  {\n                    \"type\": \"STRING\",\n                    \"value\": \",\"\n                  },\n                  {\n                    \"type\": \"FIELD\",\n                    \"name\": \"fundep\",\n                    \"content\": {\n                      \"type\": \"SYMBOL\",\n                      \"name\": \"fundep\"\n                    }\n                  }\n                ]\n              }\n            }\n          ]\n        }\n      ]\n    },\n    \"class_declarations\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"CHOICE\",\n          \"members\": [\n            {\n              \"type\": \"SYMBOL\",\n              \"name\": \"_cmd_layout_start\"\n            },\n            {\n              \"type\": \"ALIAS\",\n              \"content\": {\n                \"type\": \"SYMBOL\",\n                \"name\": \"_cmd_layout_start_explicit\"\n              },\n              \"named\": false,\n              \"value\": \"{\"\n            }\n          ]\n        },\n        {\n          \"type\": \"CHOICE\",\n          \"members\": [\n            {\n              \"type\": \"SEQ\",\n              \"members\": [\n                {\n                  \"type\": \"CHOICE\",\n                  \"members\": [\n                    {\n                      \"type\": \"CHOICE\",\n                      \"members\": [\n                        {\n                          \"type\": \"REPEAT1\",\n                          \"content\": {\n                            \"type\": \"STRING\",\n                            \"value\": \";\"\n                          }\n                        },\n                        {\n                          \"type\": \"SYMBOL\",\n                          \"name\": \"_cond_layout_semicolon\"\n                        }\n                      ]\n                    },\n                    {\n                      \"type\": \"BLANK\"\n                    }\n                  ]\n                },\n                {\n                  \"type\": \"SEQ\",\n                  \"members\": [\n                    {\n                      \"type\": \"FIELD\",\n                      \"name\": \"declaration\",\n                      \"content\": {\n                        \"type\": \"SYMBOL\",\n                        \"name\": \"class_decl\"\n                      }\n                    },\n                    {\n                      \"type\": \"REPEAT\",\n                      \"content\": {\n                        \"type\": \"SEQ\",\n                        \"members\": [\n                          {\n                            \"type\": \"CHOICE\",\n                            \"members\": [\n                              {\n                                \"type\": \"REPEAT1\",\n                                \"content\": {\n                                  \"type\": \"STRING\",\n                                  \"value\": \";\"\n                                }\n                              },\n                              {\n                                \"type\": \"SYMBOL\",\n                                \"name\": \"_cond_layout_semicolon\"\n                              }\n                            ]\n                          },\n                          {\n                            \"type\": \"FIELD\",\n                            \"name\": \"declaration\",\n                            \"content\": {\n                              \"type\": \"SYMBOL\",\n                              \"name\": \"class_decl\"\n                            }\n                          }\n                        ]\n                      }\n                    }\n                  ]\n                },\n                {\n                  \"type\": \"CHOICE\",\n                  \"members\": [\n                    {\n                      \"type\": \"CHOICE\",\n                      \"members\": [\n                        {\n                          \"type\": \"REPEAT1\",\n                          \"content\": {\n                            \"type\": \"STRING\",\n                            \"value\": \";\"\n                          }\n                        },\n                        {\n                          \"type\": \"SYMBOL\",\n                          \"name\": \"_cond_layout_semicolon\"\n                        }\n                      ]\n                    },\n                    {\n                      \"type\": \"BLANK\"\n                    }\n                  ]\n                }\n              ]\n            },\n            {\n              \"type\": \"BLANK\"\n            }\n          ]\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_layout_end\"\n        }\n      ]\n    },\n    \"class\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"STRING\",\n          \"value\": \"class\"\n        },\n        {\n          \"type\": \"CHOICE\",\n          \"members\": [\n            {\n              \"type\": \"FIELD\",\n              \"name\": \"context\",\n              \"content\": {\n                \"type\": \"SYMBOL\",\n                \"name\": \"context\"\n              }\n            },\n            {\n              \"type\": \"BLANK\"\n            }\n          ]\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_type_head\"\n        },\n        {\n          \"type\": \"FIELD\",\n          \"name\": \"fundeps\",\n          \"content\": {\n            \"type\": \"CHOICE\",\n            \"members\": [\n              {\n                \"type\": \"SYMBOL\",\n                \"name\": \"fundeps\"\n              },\n              {\n                \"type\": \"BLANK\"\n              }\n            ]\n          }\n        },\n        {\n          \"type\": \"CHOICE\",\n          \"members\": [\n            {\n              \"type\": \"SEQ\",\n              \"members\": [\n                {\n                  \"type\": \"SYMBOL\",\n                  \"name\": \"_where\"\n                },\n                {\n                  \"type\": \"CHOICE\",\n                  \"members\": [\n                    {\n                      \"type\": \"FIELD\",\n                      \"name\": \"declarations\",\n                      \"content\": {\n                        \"type\": \"SYMBOL\",\n                        \"name\": \"class_declarations\"\n                      }\n                    },\n                    {\n                      \"type\": \"BLANK\"\n                    }\n                  ]\n                }\n              ]\n            },\n            {\n              \"type\": \"BLANK\"\n            }\n          ]\n        }\n      ]\n    },\n    \"instance_decl\": {\n      \"type\": \"CHOICE\",\n      \"members\": [\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"decl\"\n        },\n        {\n          \"type\": \"ALIAS\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_assoc_datainst\"\n          },\n          \"named\": true,\n          \"value\": \"data_instance\"\n        },\n        {\n          \"type\": \"ALIAS\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_assoc_tyinst\"\n          },\n          \"named\": true,\n          \"value\": \"type_instance\"\n        }\n      ]\n    },\n    \"instance_declarations\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"CHOICE\",\n          \"members\": [\n            {\n              \"type\": \"SYMBOL\",\n              \"name\": \"_cmd_layout_start\"\n            },\n            {\n              \"type\": \"ALIAS\",\n              \"content\": {\n                \"type\": \"SYMBOL\",\n                \"name\": \"_cmd_layout_start_explicit\"\n              },\n              \"named\": false,\n              \"value\": \"{\"\n            }\n          ]\n        },\n        {\n          \"type\": \"CHOICE\",\n          \"members\": [\n            {\n              \"type\": \"SEQ\",\n              \"members\": [\n                {\n                  \"type\": \"CHOICE\",\n                  \"members\": [\n                    {\n                      \"type\": \"CHOICE\",\n                      \"members\": [\n                        {\n                          \"type\": \"REPEAT1\",\n                          \"content\": {\n                            \"type\": \"STRING\",\n                            \"value\": \";\"\n                          }\n                        },\n                        {\n                          \"type\": \"SYMBOL\",\n                          \"name\": \"_cond_layout_semicolon\"\n                        }\n                      ]\n                    },\n                    {\n                      \"type\": \"BLANK\"\n                    }\n                  ]\n                },\n                {\n                  \"type\": \"SEQ\",\n                  \"members\": [\n                    {\n                      \"type\": \"FIELD\",\n                      \"name\": \"declaration\",\n                      \"content\": {\n                        \"type\": \"SYMBOL\",\n                        \"name\": \"instance_decl\"\n                      }\n                    },\n                    {\n                      \"type\": \"REPEAT\",\n                      \"content\": {\n                        \"type\": \"SEQ\",\n                        \"members\": [\n                          {\n                            \"type\": \"CHOICE\",\n                            \"members\": [\n                              {\n                                \"type\": \"REPEAT1\",\n                                \"content\": {\n                                  \"type\": \"STRING\",\n                                  \"value\": \";\"\n                                }\n                              },\n                              {\n                                \"type\": \"SYMBOL\",\n                                \"name\": \"_cond_layout_semicolon\"\n                              }\n                            ]\n                          },\n                          {\n                            \"type\": \"FIELD\",\n                            \"name\": \"declaration\",\n                            \"content\": {\n                              \"type\": \"SYMBOL\",\n                              \"name\": \"instance_decl\"\n                            }\n                          }\n                        ]\n                      }\n                    }\n                  ]\n                },\n                {\n                  \"type\": \"CHOICE\",\n                  \"members\": [\n                    {\n                      \"type\": \"CHOICE\",\n                      \"members\": [\n                        {\n                          \"type\": \"REPEAT1\",\n                          \"content\": {\n                            \"type\": \"STRING\",\n                            \"value\": \";\"\n                          }\n                        },\n                        {\n                          \"type\": \"SYMBOL\",\n                          \"name\": \"_cond_layout_semicolon\"\n                        }\n                      ]\n                    },\n                    {\n                      \"type\": \"BLANK\"\n                    }\n                  ]\n                }\n              ]\n            },\n            {\n              \"type\": \"BLANK\"\n            }\n          ]\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_layout_end\"\n        }\n      ]\n    },\n    \"_instance\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"STRING\",\n          \"value\": \"instance\"\n        },\n        {\n          \"type\": \"CHOICE\",\n          \"members\": [\n            {\n              \"type\": \"FIELD\",\n              \"name\": \"forall\",\n              \"content\": {\n                \"type\": \"SYMBOL\",\n                \"name\": \"_forall\"\n              }\n            },\n            {\n              \"type\": \"BLANK\"\n            }\n          ]\n        },\n        {\n          \"type\": \"CHOICE\",\n          \"members\": [\n            {\n              \"type\": \"FIELD\",\n              \"name\": \"context\",\n              \"content\": {\n                \"type\": \"SYMBOL\",\n                \"name\": \"context\"\n              }\n            },\n            {\n              \"type\": \"BLANK\"\n            }\n          ]\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_type_instance_head\"\n        }\n      ]\n    },\n    \"instance\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_instance\"\n        },\n        {\n          \"type\": \"CHOICE\",\n          \"members\": [\n            {\n              \"type\": \"SEQ\",\n              \"members\": [\n                {\n                  \"type\": \"SYMBOL\",\n                  \"name\": \"_where\"\n                },\n                {\n                  \"type\": \"CHOICE\",\n                  \"members\": [\n                    {\n                      \"type\": \"FIELD\",\n                      \"name\": \"declarations\",\n                      \"content\": {\n                        \"type\": \"SYMBOL\",\n                        \"name\": \"instance_declarations\"\n                      }\n                    },\n                    {\n                      \"type\": \"BLANK\"\n                    }\n                  ]\n                }\n              ]\n            },\n            {\n              \"type\": \"BLANK\"\n            }\n          ]\n        }\n      ]\n    },\n    \"deriving_instance\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"CHOICE\",\n          \"members\": [\n            {\n              \"type\": \"SYMBOL\",\n              \"name\": \"_phantom_deriving\"\n            },\n            {\n              \"type\": \"BLANK\"\n            }\n          ]\n        },\n        {\n          \"type\": \"STRING\",\n          \"value\": \"deriving\"\n        },\n        {\n          \"type\": \"CHOICE\",\n          \"members\": [\n            {\n              \"type\": \"CHOICE\",\n              \"members\": [\n                {\n                  \"type\": \"FIELD\",\n                  \"name\": \"strategy\",\n                  \"content\": {\n                    \"type\": \"SYMBOL\",\n                    \"name\": \"deriving_strategy\"\n                  }\n                },\n                {\n                  \"type\": \"FIELD\",\n                  \"name\": \"via\",\n                  \"content\": {\n                    \"type\": \"SYMBOL\",\n                    \"name\": \"via\"\n                  }\n                }\n              ]\n            },\n            {\n              \"type\": \"BLANK\"\n            }\n          ]\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_instance\"\n        }\n      ]\n    },\n    \"_fun_arrow_prec\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"STRING\",\n          \"value\": \"-\"\n        },\n        {\n          \"type\": \"STRING\",\n          \"value\": \"1\"\n        }\n      ]\n    },\n    \"_fun_arrow_fixity\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"FIELD\",\n          \"name\": \"associativity\",\n          \"content\": {\n            \"type\": \"STRING\",\n            \"value\": \"infixr\"\n          }\n        },\n        {\n          \"type\": \"FIELD\",\n          \"name\": \"precedence\",\n          \"content\": {\n            \"type\": \"ALIAS\",\n            \"content\": {\n              \"type\": \"SYMBOL\",\n              \"name\": \"_fun_arrow_prec\"\n            },\n            \"named\": true,\n            \"value\": \"integer\"\n          }\n        },\n        {\n          \"type\": \"FIELD\",\n          \"name\": \"operator\",\n          \"content\": {\n            \"type\": \"ALIAS\",\n            \"content\": {\n              \"type\": \"STRING\",\n              \"value\": \"->\"\n            },\n            \"named\": true,\n            \"value\": \"operator\"\n          }\n        }\n      ]\n    },\n    \"fixity\": {\n      \"type\": \"CHOICE\",\n      \"members\": [\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_fun_arrow_fixity\"\n        },\n        {\n          \"type\": \"SEQ\",\n          \"members\": [\n            {\n              \"type\": \"FIELD\",\n              \"name\": \"associativity\",\n              \"content\": {\n                \"type\": \"CHOICE\",\n                \"members\": [\n                  {\n                    \"type\": \"STRING\",\n                    \"value\": \"infixl\"\n                  },\n                  {\n                    \"type\": \"STRING\",\n                    \"value\": \"infixr\"\n                  },\n                  {\n                    \"type\": \"STRING\",\n                    \"value\": \"infix\"\n                  }\n                ]\n              }\n            },\n            {\n              \"type\": \"FIELD\",\n              \"name\": \"precedence\",\n              \"content\": {\n                \"type\": \"CHOICE\",\n                \"members\": [\n                  {\n                    \"type\": \"SYMBOL\",\n                    \"name\": \"integer\"\n                  },\n                  {\n                    \"type\": \"BLANK\"\n                  }\n                ]\n              }\n            },\n            {\n              \"type\": \"FIELD\",\n              \"name\": \"operator\",\n              \"content\": {\n                \"type\": \"SEQ\",\n                \"members\": [\n                  {\n                    \"type\": \"CHOICE\",\n                    \"members\": [\n                      {\n                        \"type\": \"SYMBOL\",\n                        \"name\": \"_operator_minus\"\n                      },\n                      {\n                        \"type\": \"SYMBOL\",\n                        \"name\": \"_varop\"\n                      },\n                      {\n                        \"type\": \"SYMBOL\",\n                        \"name\": \"_conop\"\n                      }\n                    ]\n                  },\n                  {\n                    \"type\": \"REPEAT\",\n                    \"content\": {\n                      \"type\": \"SEQ\",\n                      \"members\": [\n                        {\n                          \"type\": \"STRING\",\n                          \"value\": \",\"\n                        },\n                        {\n                          \"type\": \"CHOICE\",\n                          \"members\": [\n                            {\n                              \"type\": \"SYMBOL\",\n                              \"name\": \"_operator_minus\"\n                            },\n                            {\n                              \"type\": \"SYMBOL\",\n                              \"name\": \"_varop\"\n                            },\n                            {\n                              \"type\": \"SYMBOL\",\n                              \"name\": \"_conop\"\n                            }\n                          ]\n                        }\n                      ]\n                    }\n                  }\n                ]\n              }\n            }\n          ]\n        }\n      ]\n    },\n    \"_con_binding_list\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"FIELD\",\n          \"name\": \"name\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_con\"\n          }\n        },\n        {\n          \"type\": \"REPEAT1\",\n          \"content\": {\n            \"type\": \"SEQ\",\n            \"members\": [\n              {\n                \"type\": \"STRING\",\n                \"value\": \",\"\n              },\n              {\n                \"type\": \"FIELD\",\n                \"name\": \"name\",\n                \"content\": {\n                  \"type\": \"SYMBOL\",\n                  \"name\": \"_con\"\n                }\n              }\n            ]\n          }\n        }\n      ]\n    },\n    \"_var_binding_list\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"FIELD\",\n          \"name\": \"name\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_var\"\n          }\n        },\n        {\n          \"type\": \"REPEAT1\",\n          \"content\": {\n            \"type\": \"SEQ\",\n            \"members\": [\n              {\n                \"type\": \"STRING\",\n                \"value\": \",\"\n              },\n              {\n                \"type\": \"FIELD\",\n                \"name\": \"name\",\n                \"content\": {\n                  \"type\": \"SYMBOL\",\n                  \"name\": \"_var\"\n                }\n              }\n            ]\n          }\n        }\n      ]\n    },\n    \"signature\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"CHOICE\",\n          \"members\": [\n            {\n              \"type\": \"FIELD\",\n              \"name\": \"name\",\n              \"content\": {\n                \"type\": \"SYMBOL\",\n                \"name\": \"_var\"\n              }\n            },\n            {\n              \"type\": \"FIELD\",\n              \"name\": \"names\",\n              \"content\": {\n                \"type\": \"ALIAS\",\n                \"content\": {\n                  \"type\": \"SYMBOL\",\n                  \"name\": \"_var_binding_list\"\n                },\n                \"named\": true,\n                \"value\": \"binding_list\"\n              }\n            }\n          ]\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_type_annotation\"\n        }\n      ]\n    },\n    \"_simple_bind_match\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"STRING\",\n          \"value\": \"=\"\n        },\n        {\n          \"type\": \"FIELD\",\n          \"name\": \"expression\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_exp\"\n          }\n        }\n      ]\n    },\n    \"_bind_match\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_guards\"\n        },\n        {\n          \"type\": \"STRING\",\n          \"value\": \"=\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_cmd_texp_end\"\n        },\n        {\n          \"type\": \"FIELD\",\n          \"name\": \"expression\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_exp\"\n          }\n        }\n      ]\n    },\n    \"_bind_matches\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"CHOICE\",\n          \"members\": [\n            {\n              \"type\": \"FIELD\",\n              \"name\": \"match\",\n              \"content\": {\n                \"type\": \"ALIAS\",\n                \"content\": {\n                  \"type\": \"SYMBOL\",\n                  \"name\": \"_simple_bind_match\"\n                },\n                \"named\": true,\n                \"value\": \"match\"\n              }\n            },\n            {\n              \"type\": \"REPEAT1\",\n              \"content\": {\n                \"type\": \"FIELD\",\n                \"name\": \"match\",\n                \"content\": {\n                  \"type\": \"ALIAS\",\n                  \"content\": {\n                    \"type\": \"SYMBOL\",\n                    \"name\": \"_bind_match\"\n                  },\n                  \"named\": true,\n                  \"value\": \"match\"\n                }\n              }\n            }\n          ]\n        },\n        {\n          \"type\": \"CHOICE\",\n          \"members\": [\n            {\n              \"type\": \"SYMBOL\",\n              \"name\": \"_where_binds\"\n            },\n            {\n              \"type\": \"BLANK\"\n            }\n          ]\n        }\n      ]\n    },\n    \"_function_name\": {\n      \"type\": \"FIELD\",\n      \"name\": \"name\",\n      \"content\": {\n        \"type\": \"SYMBOL\",\n        \"name\": \"_var\"\n      }\n    },\n    \"function_head_parens\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_paren_open\"\n        },\n        {\n          \"type\": \"CHOICE\",\n          \"members\": [\n            {\n              \"type\": \"SYMBOL\",\n              \"name\": \"_function_head\"\n            },\n            {\n              \"type\": \"SYMBOL\",\n              \"name\": \"_function_head_patterns\"\n            }\n          ]\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_paren_close\"\n        }\n      ]\n    },\n    \"_function_head_patterns\": {\n      \"type\": \"CHOICE\",\n      \"members\": [\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_function_name\"\n        },\n        {\n          \"type\": \"FIELD\",\n          \"name\": \"parens\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"function_head_parens\"\n          }\n        }\n      ]\n    },\n    \"_function_head_infix\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"FIELD\",\n          \"name\": \"left_operand\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"pattern\"\n          }\n        },\n        {\n          \"type\": \"CHOICE\",\n          \"members\": [\n            {\n              \"type\": \"SYMBOL\",\n              \"name\": \"_cond_no_section_op\"\n            },\n            {\n              \"type\": \"BLANK\"\n            }\n          ]\n        },\n        {\n          \"type\": \"FIELD\",\n          \"name\": \"operator\",\n          \"content\": {\n            \"type\": \"CHOICE\",\n            \"members\": [\n              {\n                \"type\": \"SEQ\",\n                \"members\": [\n                  {\n                    \"type\": \"SYMBOL\",\n                    \"name\": \"_cond_minus\"\n                  },\n                  {\n                    \"type\": \"SYMBOL\",\n                    \"name\": \"_operator_minus\"\n                  }\n                ]\n              },\n              {\n                \"type\": \"SYMBOL\",\n                \"name\": \"_varop\"\n              }\n            ]\n          }\n        },\n        {\n          \"type\": \"FIELD\",\n          \"name\": \"right_operand\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"pattern\"\n          }\n        }\n      ]\n    },\n    \"_function_head\": {\n      \"type\": \"CHOICE\",\n      \"members\": [\n        {\n          \"type\": \"SEQ\",\n          \"members\": [\n            {\n              \"type\": \"SYMBOL\",\n              \"name\": \"_function_head_patterns\"\n            },\n            {\n              \"type\": \"FIELD\",\n              \"name\": \"patterns\",\n              \"content\": {\n                \"type\": \"SYMBOL\",\n                \"name\": \"patterns\"\n              }\n            }\n          ]\n        },\n        {\n          \"type\": \"ALIAS\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_function_head_infix\"\n          },\n          \"named\": true,\n          \"value\": \"infix\"\n        }\n      ]\n    },\n    \"function\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_function_head\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_bind_matches\"\n        }\n      ]\n    },\n    \"bind\": {\n      \"type\": \"PREC\",\n      \"value\": \"bind\",\n      \"content\": {\n        \"type\": \"SEQ\",\n        \"members\": [\n          {\n            \"type\": \"CHOICE\",\n            \"members\": [\n              {\n                \"type\": \"FIELD\",\n                \"name\": \"pattern\",\n                \"content\": {\n                  \"type\": \"SYMBOL\",\n                  \"name\": \"_pat\"\n                }\n              },\n              {\n                \"type\": \"FIELD\",\n                \"name\": \"name\",\n                \"content\": {\n                  \"type\": \"SYMBOL\",\n                  \"name\": \"_var\"\n                }\n              },\n              {\n                \"type\": \"FIELD\",\n                \"name\": \"implicit\",\n                \"content\": {\n                  \"type\": \"SYMBOL\",\n                  \"name\": \"implicit_variable\"\n                }\n              }\n            ]\n          },\n          {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_bind_matches\"\n          }\n        ]\n      }\n    },\n    \"decl\": {\n      \"type\": \"CHOICE\",\n      \"members\": [\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"signature\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"function\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"bind\"\n        }\n      ]\n    },\n    \"_local_decl\": {\n      \"type\": \"CHOICE\",\n      \"members\": [\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"fixity\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"decl\"\n        }\n      ]\n    },\n    \"local_binds\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"CHOICE\",\n          \"members\": [\n            {\n              \"type\": \"SYMBOL\",\n              \"name\": \"_cmd_layout_start\"\n            },\n            {\n              \"type\": \"ALIAS\",\n              \"content\": {\n                \"type\": \"SYMBOL\",\n                \"name\": \"_cmd_layout_start_explicit\"\n              },\n              \"named\": false,\n              \"value\": \"{\"\n            }\n          ]\n        },\n        {\n          \"type\": \"CHOICE\",\n          \"members\": [\n            {\n              \"type\": \"SEQ\",\n              \"members\": [\n                {\n                  \"type\": \"CHOICE\",\n                  \"members\": [\n                    {\n                      \"type\": \"CHOICE\",\n                      \"members\": [\n                        {\n                          \"type\": \"REPEAT1\",\n                          \"content\": {\n                            \"type\": \"STRING\",\n                            \"value\": \";\"\n                          }\n                        },\n                        {\n                          \"type\": \"SYMBOL\",\n                          \"name\": \"_cond_layout_semicolon\"\n                        }\n                      ]\n                    },\n                    {\n                      \"type\": \"BLANK\"\n                    }\n                  ]\n                },\n                {\n                  \"type\": \"SEQ\",\n                  \"members\": [\n                    {\n                      \"type\": \"FIELD\",\n                      \"name\": \"decl\",\n                      \"content\": {\n                        \"type\": \"SYMBOL\",\n                        \"name\": \"_local_decl\"\n                      }\n                    },\n                    {\n                      \"type\": \"REPEAT\",\n                      \"content\": {\n                        \"type\": \"SEQ\",\n                        \"members\": [\n                          {\n                            \"type\": \"CHOICE\",\n                            \"members\": [\n                              {\n                                \"type\": \"REPEAT1\",\n                                \"content\": {\n                                  \"type\": \"STRING\",\n                                  \"value\": \";\"\n                                }\n                              },\n                              {\n                                \"type\": \"SYMBOL\",\n                                \"name\": \"_cond_layout_semicolon\"\n                              }\n                            ]\n                          },\n                          {\n                            \"type\": \"FIELD\",\n                            \"name\": \"decl\",\n                            \"content\": {\n                              \"type\": \"SYMBOL\",\n                              \"name\": \"_local_decl\"\n                            }\n                          }\n                        ]\n                      }\n                    }\n                  ]\n                },\n                {\n                  \"type\": \"CHOICE\",\n                  \"members\": [\n                    {\n                      \"type\": \"CHOICE\",\n                      \"members\": [\n                        {\n                          \"type\": \"REPEAT1\",\n                          \"content\": {\n                            \"type\": \"STRING\",\n                            \"value\": \";\"\n                          }\n                        },\n                        {\n                          \"type\": \"SYMBOL\",\n                          \"name\": \"_cond_layout_semicolon\"\n                        }\n                      ]\n                    },\n                    {\n                      \"type\": \"BLANK\"\n                    }\n                  ]\n                }\n              ]\n            },\n            {\n              \"type\": \"BLANK\"\n            }\n          ]\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_layout_end\"\n        }\n      ]\n    },\n    \"_where_binds\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_where\"\n        },\n        {\n          \"type\": \"CHOICE\",\n          \"members\": [\n            {\n              \"type\": \"FIELD\",\n              \"name\": \"binds\",\n              \"content\": {\n                \"type\": \"SYMBOL\",\n                \"name\": \"local_binds\"\n              }\n            },\n            {\n              \"type\": \"BLANK\"\n            }\n          ]\n        }\n      ]\n    },\n    \"calling_convention\": {\n      \"type\": \"TOKEN\",\n      \"content\": {\n        \"type\": \"CHOICE\",\n        \"members\": [\n          {\n            \"type\": \"STRING\",\n            \"value\": \"ccall\"\n          },\n          {\n            \"type\": \"STRING\",\n            \"value\": \"stdcall\"\n          },\n          {\n            \"type\": \"STRING\",\n            \"value\": \"capi\"\n          },\n          {\n            \"type\": \"STRING\",\n            \"value\": \"prim\"\n          },\n          {\n            \"type\": \"STRING\",\n            \"value\": \"javascript\"\n          },\n          {\n            \"type\": \"PATTERN\",\n            \"value\": \"[A-Z_]+\"\n          }\n        ]\n      }\n    },\n    \"safety\": {\n      \"type\": \"TOKEN\",\n      \"content\": {\n        \"type\": \"CHOICE\",\n        \"members\": [\n          {\n            \"type\": \"STRING\",\n            \"value\": \"unsafe\"\n          },\n          {\n            \"type\": \"STRING\",\n            \"value\": \"safe\"\n          },\n          {\n            \"type\": \"STRING\",\n            \"value\": \"interruptible\"\n          }\n        ]\n      }\n    },\n    \"entity\": {\n      \"type\": \"SYMBOL\",\n      \"name\": \"string\"\n    },\n    \"foreign_import\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"STRING\",\n          \"value\": \"foreign\"\n        },\n        {\n          \"type\": \"STRING\",\n          \"value\": \"import\"\n        },\n        {\n          \"type\": \"FIELD\",\n          \"name\": \"calling_convention\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"calling_convention\"\n          }\n        },\n        {\n          \"type\": \"CHOICE\",\n          \"members\": [\n            {\n              \"type\": \"FIELD\",\n              \"name\": \"safety\",\n              \"content\": {\n                \"type\": \"SYMBOL\",\n                \"name\": \"safety\"\n              }\n            },\n            {\n              \"type\": \"BLANK\"\n            }\n          ]\n        },\n        {\n          \"type\": \"CHOICE\",\n          \"members\": [\n            {\n              \"type\": \"FIELD\",\n              \"name\": \"entity\",\n              \"content\": {\n                \"type\": \"SYMBOL\",\n                \"name\": \"entity\"\n              }\n            },\n            {\n              \"type\": \"BLANK\"\n            }\n          ]\n        },\n        {\n          \"type\": \"FIELD\",\n          \"name\": \"signature\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"signature\"\n          }\n        }\n      ]\n    },\n    \"foreign_export\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"STRING\",\n          \"value\": \"foreign\"\n        },\n        {\n          \"type\": \"STRING\",\n          \"value\": \"export\"\n        },\n        {\n          \"type\": \"FIELD\",\n          \"name\": \"calling_convention\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"calling_convention\"\n          }\n        },\n        {\n          \"type\": \"CHOICE\",\n          \"members\": [\n            {\n              \"type\": \"FIELD\",\n              \"name\": \"entity\",\n              \"content\": {\n                \"type\": \"SYMBOL\",\n                \"name\": \"entity\"\n              }\n            },\n            {\n              \"type\": \"BLANK\"\n            }\n          ]\n        },\n        {\n          \"type\": \"FIELD\",\n          \"name\": \"signature\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"signature\"\n          }\n        }\n      ]\n    },\n    \"default_types\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"STRING\",\n          \"value\": \"default\"\n        },\n        {\n          \"type\": \"SEQ\",\n          \"members\": [\n            {\n              \"type\": \"SYMBOL\",\n              \"name\": \"_paren_open\"\n            },\n            {\n              \"type\": \"CHOICE\",\n              \"members\": [\n                {\n                  \"type\": \"SEQ\",\n                  \"members\": [\n                    {\n                      \"type\": \"FIELD\",\n                      \"name\": \"type\",\n                      \"content\": {\n                        \"type\": \"SYMBOL\",\n                        \"name\": \"_ktype\"\n                      }\n                    },\n                    {\n                      \"type\": \"REPEAT\",\n                      \"content\": {\n                        \"type\": \"SEQ\",\n                        \"members\": [\n                          {\n                            \"type\": \"STRING\",\n                            \"value\": \",\"\n                          },\n                          {\n                            \"type\": \"FIELD\",\n                            \"name\": \"type\",\n                            \"content\": {\n                              \"type\": \"SYMBOL\",\n                              \"name\": \"_ktype\"\n                            }\n                          }\n                        ]\n                      }\n                    }\n                  ]\n                },\n                {\n                  \"type\": \"BLANK\"\n                }\n              ]\n            },\n            {\n              \"type\": \"SYMBOL\",\n              \"name\": \"_paren_close\"\n            }\n          ]\n        }\n      ]\n    },\n    \"_patsyn_signature\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"FIELD\",\n          \"name\": \"synonym\",\n          \"content\": {\n            \"type\": \"CHOICE\",\n            \"members\": [\n              {\n                \"type\": \"SYMBOL\",\n                \"name\": \"_con\"\n              },\n              {\n                \"type\": \"ALIAS\",\n                \"content\": {\n                  \"type\": \"SYMBOL\",\n                  \"name\": \"_con_binding_list\"\n                },\n                \"named\": true,\n                \"value\": \"binding_list\"\n              }\n            ]\n          }\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_colon2\"\n        },\n        {\n          \"type\": \"FIELD\",\n          \"name\": \"type\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"quantified_type\"\n          }\n        }\n      ]\n    },\n    \"_patsyn_cons\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"CHOICE\",\n          \"members\": [\n            {\n              \"type\": \"SYMBOL\",\n              \"name\": \"_cmd_layout_start\"\n            },\n            {\n              \"type\": \"ALIAS\",\n              \"content\": {\n                \"type\": \"SYMBOL\",\n                \"name\": \"_cmd_layout_start_explicit\"\n              },\n              \"named\": false,\n              \"value\": \"{\"\n            }\n          ]\n        },\n        {\n          \"type\": \"CHOICE\",\n          \"members\": [\n            {\n              \"type\": \"SEQ\",\n              \"members\": [\n                {\n                  \"type\": \"CHOICE\",\n                  \"members\": [\n                    {\n                      \"type\": \"CHOICE\",\n                      \"members\": [\n                        {\n                          \"type\": \"REPEAT1\",\n                          \"content\": {\n                            \"type\": \"STRING\",\n                            \"value\": \";\"\n                          }\n                        },\n                        {\n                          \"type\": \"SYMBOL\",\n                          \"name\": \"_cond_layout_semicolon\"\n                        }\n                      ]\n                    },\n                    {\n                      \"type\": \"BLANK\"\n                    }\n                  ]\n                },\n                {\n                  \"type\": \"SEQ\",\n                  \"members\": [\n                    {\n                      \"type\": \"ALIAS\",\n                      \"content\": {\n                        \"type\": \"SYMBOL\",\n                        \"name\": \"bind\"\n                      },\n                      \"named\": true,\n                      \"value\": \"constructor_synonym\"\n                    },\n                    {\n                      \"type\": \"REPEAT\",\n                      \"content\": {\n                        \"type\": \"SEQ\",\n                        \"members\": [\n                          {\n                            \"type\": \"CHOICE\",\n                            \"members\": [\n                              {\n                                \"type\": \"REPEAT1\",\n                                \"content\": {\n                                  \"type\": \"STRING\",\n                                  \"value\": \";\"\n                                }\n                              },\n                              {\n                                \"type\": \"SYMBOL\",\n                                \"name\": \"_cond_layout_semicolon\"\n                              }\n                            ]\n                          },\n                          {\n                            \"type\": \"ALIAS\",\n                            \"content\": {\n                              \"type\": \"SYMBOL\",\n                              \"name\": \"bind\"\n                            },\n                            \"named\": true,\n                            \"value\": \"constructor_synonym\"\n                          }\n                        ]\n                      }\n                    }\n                  ]\n                },\n                {\n                  \"type\": \"CHOICE\",\n                  \"members\": [\n                    {\n                      \"type\": \"CHOICE\",\n                      \"members\": [\n                        {\n                          \"type\": \"REPEAT1\",\n                          \"content\": {\n                            \"type\": \"STRING\",\n                            \"value\": \";\"\n                          }\n                        },\n                        {\n                          \"type\": \"SYMBOL\",\n                          \"name\": \"_cond_layout_semicolon\"\n                        }\n                      ]\n                    },\n                    {\n                      \"type\": \"BLANK\"\n                    }\n                  ]\n                }\n              ]\n            },\n            {\n              \"type\": \"BLANK\"\n            }\n          ]\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_layout_end\"\n        }\n      ]\n    },\n    \"_patsyn_equation\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"FIELD\",\n          \"name\": \"synonym\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"pattern\"\n          }\n        },\n        {\n          \"type\": \"CHOICE\",\n          \"members\": [\n            {\n              \"type\": \"STRING\",\n              \"value\": \"=\"\n            },\n            {\n              \"type\": \"SYMBOL\",\n              \"name\": \"_larrow\"\n            }\n          ]\n        },\n        {\n          \"type\": \"FIELD\",\n          \"name\": \"pattern\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_pat\"\n          }\n        },\n        {\n          \"type\": \"CHOICE\",\n          \"members\": [\n            {\n              \"type\": \"SEQ\",\n              \"members\": [\n                {\n                  \"type\": \"SYMBOL\",\n                  \"name\": \"_where\"\n                },\n                {\n                  \"type\": \"CHOICE\",\n                  \"members\": [\n                    {\n                      \"type\": \"FIELD\",\n                      \"name\": \"constructors\",\n                      \"content\": {\n                        \"type\": \"ALIAS\",\n                        \"content\": {\n                          \"type\": \"SYMBOL\",\n                          \"name\": \"_patsyn_cons\"\n                        },\n                        \"named\": true,\n                        \"value\": \"constructor_synonyms\"\n                      }\n                    },\n                    {\n                      \"type\": \"BLANK\"\n                    }\n                  ]\n                }\n              ]\n            },\n            {\n              \"type\": \"BLANK\"\n            }\n          ]\n        }\n      ]\n    },\n    \"pattern_synonym\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"STRING\",\n          \"value\": \"pattern\"\n        },\n        {\n          \"type\": \"CHOICE\",\n          \"members\": [\n            {\n              \"type\": \"ALIAS\",\n              \"content\": {\n                \"type\": \"SYMBOL\",\n                \"name\": \"_patsyn_signature\"\n              },\n              \"named\": true,\n              \"value\": \"signature\"\n            },\n            {\n              \"type\": \"ALIAS\",\n              \"content\": {\n                \"type\": \"SYMBOL\",\n                \"name\": \"_patsyn_equation\"\n              },\n              \"named\": true,\n              \"value\": \"equation\"\n            }\n          ]\n        }\n      ]\n    },\n    \"_splice_exp\": {\n      \"type\": \"CHOICE\",\n      \"members\": [\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_exp_name\"\n        },\n        {\n          \"type\": \"ALIAS\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_exp_parens\"\n          },\n          \"named\": true,\n          \"value\": \"parens\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"literal\"\n        }\n      ]\n    },\n    \"_splice_dollars\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_cond_splice\"\n        },\n        {\n          \"type\": \"CHOICE\",\n          \"members\": [\n            {\n              \"type\": \"STRING\",\n              \"value\": \"$\"\n            },\n            {\n              \"type\": \"STRING\",\n              \"value\": \"$$\"\n            }\n          ]\n        }\n      ]\n    },\n    \"splice\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_splice_dollars\"\n        },\n        {\n          \"type\": \"FIELD\",\n          \"name\": \"expression\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_splice_exp\"\n          }\n        }\n      ]\n    },\n    \"top_splice\": {\n      \"type\": \"SYMBOL\",\n      \"name\": \"expression\"\n    },\n    \"quoter\": {\n      \"type\": \"SYMBOL\",\n      \"name\": \"_varids\"\n    },\n    \"quasiquote\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"SEQ\",\n          \"members\": [\n            {\n              \"type\": \"SYMBOL\",\n              \"name\": \"_cond_quote_start\"\n            },\n            {\n              \"type\": \"STRING\",\n              \"value\": \"[\"\n            },\n            {\n              \"type\": \"FIELD\",\n              \"name\": \"quoter\",\n              \"content\": {\n                \"type\": \"SYMBOL\",\n                \"name\": \"quoter\"\n              }\n            },\n            {\n              \"type\": \"STRING\",\n              \"value\": \"|\"\n            }\n          ]\n        },\n        {\n          \"type\": \"CHOICE\",\n          \"members\": [\n            {\n              \"type\": \"FIELD\",\n              \"name\": \"body\",\n              \"content\": {\n                \"type\": \"SYMBOL\",\n                \"name\": \"quasiquote_body\"\n              }\n            },\n            {\n              \"type\": \"BLANK\"\n            }\n          ]\n        },\n        {\n          \"type\": \"CHOICE\",\n          \"members\": [\n            {\n              \"type\": \"TOKEN\",\n              \"content\": {\n                \"type\": \"STRING\",\n                \"value\": \"|]\"\n              }\n            },\n            {\n              \"type\": \"STRING\",\n              \"value\": \"⟧\"\n            }\n          ]\n        }\n      ]\n    },\n    \"quoted_decls\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"CHOICE\",\n          \"members\": [\n            {\n              \"type\": \"SYMBOL\",\n              \"name\": \"_cmd_layout_start_quote\"\n            },\n            {\n              \"type\": \"ALIAS\",\n              \"content\": {\n                \"type\": \"SYMBOL\",\n                \"name\": \"_cmd_layout_start_explicit\"\n              },\n              \"named\": false,\n              \"value\": \"{\"\n            }\n          ]\n        },\n        {\n          \"type\": \"CHOICE\",\n          \"members\": [\n            {\n              \"type\": \"SEQ\",\n              \"members\": [\n                {\n                  \"type\": \"CHOICE\",\n                  \"members\": [\n                    {\n                      \"type\": \"CHOICE\",\n                      \"members\": [\n                        {\n                          \"type\": \"REPEAT1\",\n                          \"content\": {\n                            \"type\": \"STRING\",\n                            \"value\": \";\"\n                          }\n                        },\n                        {\n                          \"type\": \"SYMBOL\",\n                          \"name\": \"_cond_layout_semicolon\"\n                        }\n                      ]\n                    },\n                    {\n                      \"type\": \"BLANK\"\n                    }\n                  ]\n                },\n                {\n                  \"type\": \"SEQ\",\n                  \"members\": [\n                    {\n                      \"type\": \"FIELD\",\n                      \"name\": \"declaration\",\n                      \"content\": {\n                        \"type\": \"SYMBOL\",\n                        \"name\": \"declaration\"\n                      }\n                    },\n                    {\n                      \"type\": \"REPEAT\",\n                      \"content\": {\n                        \"type\": \"SEQ\",\n                        \"members\": [\n                          {\n                            \"type\": \"CHOICE\",\n                            \"members\": [\n                              {\n                                \"type\": \"REPEAT1\",\n                                \"content\": {\n                                  \"type\": \"STRING\",\n                                  \"value\": \";\"\n                                }\n                              },\n                              {\n                                \"type\": \"SYMBOL\",\n                                \"name\": \"_cond_layout_semicolon\"\n                              }\n                            ]\n                          },\n                          {\n                            \"type\": \"FIELD\",\n                            \"name\": \"declaration\",\n                            \"content\": {\n                              \"type\": \"SYMBOL\",\n                              \"name\": \"declaration\"\n                            }\n                          }\n                        ]\n                      }\n                    }\n                  ]\n                },\n                {\n                  \"type\": \"CHOICE\",\n                  \"members\": [\n                    {\n                      \"type\": \"CHOICE\",\n                      \"members\": [\n                        {\n                          \"type\": \"REPEAT1\",\n                          \"content\": {\n                            \"type\": \"STRING\",\n                            \"value\": \";\"\n                          }\n                        },\n                        {\n                          \"type\": \"SYMBOL\",\n                          \"name\": \"_cond_layout_semicolon\"\n                        }\n                      ]\n                    },\n                    {\n                      \"type\": \"BLANK\"\n                    }\n                  ]\n                }\n              ]\n            },\n            {\n              \"type\": \"BLANK\"\n            }\n          ]\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_layout_end\"\n        }\n      ]\n    },\n    \"_exp_quote\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"CHOICE\",\n          \"members\": [\n            {\n              \"type\": \"SEQ\",\n              \"members\": [\n                {\n                  \"type\": \"CHOICE\",\n                  \"members\": [\n                    {\n                      \"type\": \"STRING\",\n                      \"value\": \"⟦\"\n                    },\n                    {\n                      \"type\": \"SEQ\",\n                      \"members\": [\n                        {\n                          \"type\": \"SYMBOL\",\n                          \"name\": \"_cond_quote_start\"\n                        },\n                        {\n                          \"type\": \"STRING\",\n                          \"value\": \"[\"\n                        },\n                        {\n                          \"type\": \"FIELD\",\n                          \"name\": \"quoter\",\n                          \"content\": {\n                            \"type\": \"CHOICE\",\n                            \"members\": [\n                              {\n                                \"type\": \"STRING\",\n                                \"value\": \"e\"\n                              },\n                              {\n                                \"type\": \"BLANK\"\n                              }\n                            ]\n                          }\n                        },\n                        {\n                          \"type\": \"STRING\",\n                          \"value\": \"|\"\n                        }\n                      ]\n                    }\n                  ]\n                },\n                {\n                  \"type\": \"CHOICE\",\n                  \"members\": [\n                    {\n                      \"type\": \"ALIAS\",\n                      \"content\": {\n                        \"type\": \"SYMBOL\",\n                        \"name\": \"_exp\"\n                      },\n                      \"named\": true,\n                      \"value\": \"quoted_expression\"\n                    },\n                    {\n                      \"type\": \"BLANK\"\n                    }\n                  ]\n                }\n              ]\n            },\n            {\n              \"type\": \"SEQ\",\n              \"members\": [\n                {\n                  \"type\": \"SEQ\",\n                  \"members\": [\n                    {\n                      \"type\": \"SYMBOL\",\n                      \"name\": \"_cond_quote_start\"\n                    },\n                    {\n                      \"type\": \"STRING\",\n                      \"value\": \"[\"\n                    },\n                    {\n                      \"type\": \"FIELD\",\n                      \"name\": \"quoter\",\n                      \"content\": {\n                        \"type\": \"STRING\",\n                        \"value\": \"t\"\n                      }\n                    },\n                    {\n                      \"type\": \"STRING\",\n                      \"value\": \"|\"\n                    }\n                  ]\n                },\n                {\n                  \"type\": \"CHOICE\",\n                  \"members\": [\n                    {\n                      \"type\": \"ALIAS\",\n                      \"content\": {\n                        \"type\": \"SYMBOL\",\n                        \"name\": \"_ktype\"\n                      },\n                      \"named\": true,\n                      \"value\": \"quoted_type\"\n                    },\n                    {\n                      \"type\": \"BLANK\"\n                    }\n                  ]\n                }\n              ]\n            },\n            {\n              \"type\": \"SEQ\",\n              \"members\": [\n                {\n                  \"type\": \"SEQ\",\n                  \"members\": [\n                    {\n                      \"type\": \"SYMBOL\",\n                      \"name\": \"_cond_quote_start\"\n                    },\n                    {\n                      \"type\": \"STRING\",\n                      \"value\": \"[\"\n                    },\n                    {\n                      \"type\": \"FIELD\",\n                      \"name\": \"quoter\",\n                      \"content\": {\n                        \"type\": \"STRING\",\n                        \"value\": \"p\"\n                      }\n                    },\n                    {\n                      \"type\": \"STRING\",\n                      \"value\": \"|\"\n                    }\n                  ]\n                },\n                {\n                  \"type\": \"CHOICE\",\n                  \"members\": [\n                    {\n                      \"type\": \"ALIAS\",\n                      \"content\": {\n                        \"type\": \"SYMBOL\",\n                        \"name\": \"_pat\"\n                      },\n                      \"named\": true,\n                      \"value\": \"quoted_pattern\"\n                    },\n                    {\n                      \"type\": \"BLANK\"\n                    }\n                  ]\n                }\n              ]\n            },\n            {\n              \"type\": \"SEQ\",\n              \"members\": [\n                {\n                  \"type\": \"SEQ\",\n                  \"members\": [\n                    {\n                      \"type\": \"SYMBOL\",\n                      \"name\": \"_cond_quote_start\"\n                    },\n                    {\n                      \"type\": \"STRING\",\n                      \"value\": \"[\"\n                    },\n                    {\n                      \"type\": \"FIELD\",\n                      \"name\": \"quoter\",\n                      \"content\": {\n                        \"type\": \"STRING\",\n                        \"value\": \"d\"\n                      }\n                    },\n                    {\n                      \"type\": \"STRING\",\n                      \"value\": \"|\"\n                    }\n                  ]\n                },\n                {\n                  \"type\": \"CHOICE\",\n                  \"members\": [\n                    {\n                      \"type\": \"SYMBOL\",\n                      \"name\": \"quoted_decls\"\n                    },\n                    {\n                      \"type\": \"BLANK\"\n                    }\n                  ]\n                }\n              ]\n            }\n          ]\n        },\n        {\n          \"type\": \"CHOICE\",\n          \"members\": [\n            {\n              \"type\": \"TOKEN\",\n              \"content\": {\n                \"type\": \"STRING\",\n                \"value\": \"|]\"\n              }\n            },\n            {\n              \"type\": \"STRING\",\n              \"value\": \"⟧\"\n            }\n          ]\n        }\n      ]\n    },\n    \"_exp_typed_quote\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_cond_quote_start\"\n        },\n        {\n          \"type\": \"STRING\",\n          \"value\": \"[\"\n        },\n        {\n          \"type\": \"CHOICE\",\n          \"members\": [\n            {\n              \"type\": \"STRING\",\n              \"value\": \"e\"\n            },\n            {\n              \"type\": \"BLANK\"\n            }\n          ]\n        },\n        {\n          \"type\": \"STRING\",\n          \"value\": \"||\"\n        },\n        {\n          \"type\": \"CHOICE\",\n          \"members\": [\n            {\n              \"type\": \"ALIAS\",\n              \"content\": {\n                \"type\": \"SYMBOL\",\n                \"name\": \"_exp\"\n              },\n              \"named\": true,\n              \"value\": \"quoted_expression\"\n            },\n            {\n              \"type\": \"BLANK\"\n            }\n          ]\n        },\n        {\n          \"type\": \"TOKEN\",\n          \"content\": {\n            \"type\": \"STRING\",\n            \"value\": \"||]\"\n          }\n        }\n      ]\n    },\n    \"float\": {\n      \"type\": \"TOKEN\",\n      \"content\": {\n        \"type\": \"SEQ\",\n        \"members\": [\n          {\n            \"type\": \"SEQ\",\n            \"members\": [\n              {\n                \"type\": \"PATTERN\",\n                \"value\": \"[0-9][0-9_]*\"\n              },\n              {\n                \"type\": \"CHOICE\",\n                \"members\": [\n                  {\n                    \"type\": \"SEQ\",\n                    \"members\": [\n                      {\n                        \"type\": \"PATTERN\",\n                        \"value\": \"\\\\.[0-9_]+\"\n                      },\n                      {\n                        \"type\": \"CHOICE\",\n                        \"members\": [\n                          {\n                            \"type\": \"PATTERN\",\n                            \"value\": \"[eE][+-]?[0-9_]+\"\n                          },\n                          {\n                            \"type\": \"BLANK\"\n                          }\n                        ]\n                      }\n                    ]\n                  },\n                  {\n                    \"type\": \"PATTERN\",\n                    \"value\": \"[eE][+-]?[0-9_]+\"\n                  }\n                ]\n              }\n            ]\n          },\n          {\n            \"type\": \"CHOICE\",\n            \"members\": [\n              {\n                \"type\": \"IMMEDIATE_TOKEN\",\n                \"content\": {\n                  \"type\": \"PATTERN\",\n                  \"value\": \"##?\"\n                }\n              },\n              {\n                \"type\": \"BLANK\"\n              }\n            ]\n          }\n        ]\n      }\n    },\n    \"char\": {\n      \"type\": \"TOKEN\",\n      \"content\": {\n        \"type\": \"SEQ\",\n        \"members\": [\n          {\n            \"type\": \"CHOICE\",\n            \"members\": [\n              {\n                \"type\": \"PATTERN\",\n                \"value\": \"'[^']'\"\n              },\n              {\n                \"type\": \"PATTERN\",\n                \"value\": \"'\\\\\\\\[^ ]*'\"\n              }\n            ]\n          },\n          {\n            \"type\": \"CHOICE\",\n            \"members\": [\n              {\n                \"type\": \"IMMEDIATE_TOKEN\",\n                \"content\": {\n                  \"type\": \"PATTERN\",\n                  \"value\": \"##?\"\n                }\n              },\n              {\n                \"type\": \"BLANK\"\n              }\n            ]\n          }\n        ]\n      }\n    },\n    \"string\": {\n      \"type\": \"TOKEN\",\n      \"content\": {\n        \"type\": \"SEQ\",\n        \"members\": [\n          {\n            \"type\": \"SEQ\",\n            \"members\": [\n              {\n                \"type\": \"STRING\",\n                \"value\": \"\\\"\"\n              },\n              {\n                \"type\": \"REPEAT\",\n                \"content\": {\n                  \"type\": \"CHOICE\",\n                  \"members\": [\n                    {\n                      \"type\": \"PATTERN\",\n                      \"value\": \"[^\\\\\\\\\\\"\\\\n]\"\n                    },\n                    {\n                      \"type\": \"PATTERN\",\n                      \"value\": \"\\\\\\\\(\\\\^)?.\"\n                    },\n                    {\n                      \"type\": \"PATTERN\",\n                      \"value\": \"\\\\\\\\\\\\n\\\\s*\\\\\\\\\"\n                    }\n                  ]\n                }\n              },\n              {\n                \"type\": \"STRING\",\n                \"value\": \"\\\"\"\n              }\n            ]\n          },\n          {\n            \"type\": \"CHOICE\",\n            \"members\": [\n              {\n                \"type\": \"IMMEDIATE_TOKEN\",\n                \"content\": {\n                  \"type\": \"PATTERN\",\n                  \"value\": \"##?\"\n                }\n              },\n              {\n                \"type\": \"BLANK\"\n              }\n            ]\n          }\n        ]\n      }\n    },\n    \"_integer_literal\": {\n      \"type\": \"TOKEN\",\n      \"content\": {\n        \"type\": \"SEQ\",\n        \"members\": [\n          {\n            \"type\": \"PATTERN\",\n            \"value\": \"[0-9][0-9_]*\"\n          },\n          {\n            \"type\": \"CHOICE\",\n            \"members\": [\n              {\n                \"type\": \"IMMEDIATE_TOKEN\",\n                \"content\": {\n                  \"type\": \"PATTERN\",\n                  \"value\": \"##?\"\n                }\n              },\n              {\n                \"type\": \"BLANK\"\n              }\n            ]\n          }\n        ]\n      }\n    },\n    \"_binary_literal\": {\n      \"type\": \"TOKEN\",\n      \"content\": {\n        \"type\": \"SEQ\",\n        \"members\": [\n          {\n            \"type\": \"PATTERN\",\n            \"value\": \"0[bB][01_]+\"\n          },\n          {\n            \"type\": \"CHOICE\",\n            \"members\": [\n              {\n                \"type\": \"IMMEDIATE_TOKEN\",\n                \"content\": {\n                  \"type\": \"PATTERN\",\n                  \"value\": \"##?\"\n                }\n              },\n              {\n                \"type\": \"BLANK\"\n              }\n            ]\n          }\n        ]\n      }\n    },\n    \"_octal_literal\": {\n      \"type\": \"TOKEN\",\n      \"content\": {\n        \"type\": \"SEQ\",\n        \"members\": [\n          {\n            \"type\": \"PATTERN\",\n            \"value\": \"0[oO][0-7]+\"\n          },\n          {\n            \"type\": \"CHOICE\",\n            \"members\": [\n              {\n                \"type\": \"IMMEDIATE_TOKEN\",\n                \"content\": {\n                  \"type\": \"PATTERN\",\n                  \"value\": \"##?\"\n                }\n              },\n              {\n                \"type\": \"BLANK\"\n              }\n            ]\n          }\n        ]\n      }\n    },\n    \"_hex_literal\": {\n      \"type\": \"TOKEN\",\n      \"content\": {\n        \"type\": \"SEQ\",\n        \"members\": [\n          {\n            \"type\": \"SEQ\",\n            \"members\": [\n              {\n                \"type\": \"PATTERN\",\n                \"value\": \"0[xX][0-9a-fA-F_]+\"\n              },\n              {\n                \"type\": \"CHOICE\",\n                \"members\": [\n                  {\n                    \"type\": \"PATTERN\",\n                    \"value\": \"\\\\.[0-9a-fA-F_]+\"\n                  },\n                  {\n                    \"type\": \"BLANK\"\n                  }\n                ]\n              },\n              {\n                \"type\": \"CHOICE\",\n                \"members\": [\n                  {\n                    \"type\": \"PATTERN\",\n                    \"value\": \"[pP][+-]?[0-9a-fA-F_]+\"\n                  },\n                  {\n                    \"type\": \"BLANK\"\n                  }\n                ]\n              }\n            ]\n          },\n          {\n            \"type\": \"CHOICE\",\n            \"members\": [\n              {\n                \"type\": \"IMMEDIATE_TOKEN\",\n                \"content\": {\n                  \"type\": \"PATTERN\",\n                  \"value\": \"##?\"\n                }\n              },\n              {\n                \"type\": \"BLANK\"\n              }\n            ]\n          }\n        ]\n      }\n    },\n    \"integer\": {\n      \"type\": \"CHOICE\",\n      \"members\": [\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_binary_literal\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_integer_literal\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_octal_literal\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_hex_literal\"\n        }\n      ]\n    },\n    \"_stringly\": {\n      \"type\": \"CHOICE\",\n      \"members\": [\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"string\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"char\"\n        }\n      ]\n    },\n    \"_number\": {\n      \"type\": \"CHOICE\",\n      \"members\": [\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"integer\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"float\"\n        }\n      ]\n    },\n    \"_plist\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_bracket_open\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_bracket_close\"\n        }\n      ]\n    },\n    \"unit\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_paren_open\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_paren_close\"\n        }\n      ]\n    },\n    \"unboxed_unit\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_unboxed_open\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_unboxed_close\"\n        }\n      ]\n    },\n    \"prefix_tuple\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_paren_open\"\n        },\n        {\n          \"type\": \"REPEAT1\",\n          \"content\": {\n            \"type\": \"STRING\",\n            \"value\": \",\"\n          }\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_paren_close\"\n        }\n      ]\n    },\n    \"prefix_unboxed_tuple\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_unboxed_open\"\n        },\n        {\n          \"type\": \"REPEAT1\",\n          \"content\": {\n            \"type\": \"STRING\",\n            \"value\": \",\"\n          }\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_unboxed_close\"\n        }\n      ]\n    },\n    \"prefix_unboxed_sum\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_unboxed_open\"\n        },\n        {\n          \"type\": \"REPEAT1\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_unboxed_bar\"\n          }\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_unboxed_close\"\n        }\n      ]\n    },\n    \"literal\": {\n      \"type\": \"CHOICE\",\n      \"members\": [\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_stringly\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_number\"\n        }\n      ]\n    },\n    \"_unit_cons\": {\n      \"type\": \"CHOICE\",\n      \"members\": [\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"unit\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"unboxed_unit\"\n        }\n      ]\n    },\n    \"_tuple_cons\": {\n      \"type\": \"CHOICE\",\n      \"members\": [\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"prefix_tuple\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"prefix_unboxed_tuple\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"prefix_unboxed_sum\"\n        }\n      ]\n    },\n    \"_qualified_variable\": {\n      \"type\": \"PREC\",\n      \"value\": \"qualified-id\",\n      \"content\": {\n        \"type\": \"SEQ\",\n        \"members\": [\n          {\n            \"type\": \"FIELD\",\n            \"name\": \"module\",\n            \"content\": {\n              \"type\": \"ALIAS\",\n              \"content\": {\n                \"type\": \"SYMBOL\",\n                \"name\": \"_qualifying_module\"\n              },\n              \"named\": true,\n              \"value\": \"module\"\n            }\n          },\n          {\n            \"type\": \"FIELD\",\n            \"name\": \"id\",\n            \"content\": {\n              \"type\": \"SYMBOL\",\n              \"name\": \"variable\"\n            }\n          }\n        ]\n      }\n    },\n    \"_qvarid\": {\n      \"type\": \"ALIAS\",\n      \"content\": {\n        \"type\": \"SYMBOL\",\n        \"name\": \"_qualified_variable\"\n      },\n      \"named\": true,\n      \"value\": \"qualified\"\n    },\n    \"_varids\": {\n      \"type\": \"CHOICE\",\n      \"members\": [\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_qvarid\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"variable\"\n        }\n      ]\n    },\n    \"_var\": {\n      \"type\": \"CHOICE\",\n      \"members\": [\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"variable\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_pvarsym\"\n        }\n      ]\n    },\n    \"_qvar\": {\n      \"type\": \"CHOICE\",\n      \"members\": [\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_qvarid\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_pqvarsym\"\n        }\n      ]\n    },\n    \"_vars\": {\n      \"type\": \"CHOICE\",\n      \"members\": [\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_var\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_qvar\"\n        }\n      ]\n    },\n    \"_variable_ticked\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"STRING\",\n          \"value\": \"`\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"variable\"\n        },\n        {\n          \"type\": \"STRING\",\n          \"value\": \"`\"\n        }\n      ]\n    },\n    \"_varop\": {\n      \"type\": \"CHOICE\",\n      \"members\": [\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"operator\"\n        },\n        {\n          \"type\": \"ALIAS\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_variable_ticked\"\n          },\n          \"named\": true,\n          \"value\": \"infix_id\"\n        }\n      ]\n    },\n    \"_qvariable_ticked\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"STRING\",\n          \"value\": \"`\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_qvarid\"\n        },\n        {\n          \"type\": \"STRING\",\n          \"value\": \"`\"\n        }\n      ]\n    },\n    \"_varids_ticked\": {\n      \"type\": \"ALIAS\",\n      \"content\": {\n        \"type\": \"CHOICE\",\n        \"members\": [\n          {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_variable_ticked\"\n          },\n          {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_qvariable_ticked\"\n          }\n        ]\n      },\n      \"named\": true,\n      \"value\": \"infix_id\"\n    },\n    \"_constructor\": {\n      \"type\": \"ALIAS\",\n      \"content\": {\n        \"type\": \"SYMBOL\",\n        \"name\": \"name\"\n      },\n      \"named\": true,\n      \"value\": \"constructor\"\n    },\n    \"_qualified_constructor\": {\n      \"type\": \"PREC\",\n      \"value\": \"qualified-id\",\n      \"content\": {\n        \"type\": \"SEQ\",\n        \"members\": [\n          {\n            \"type\": \"FIELD\",\n            \"name\": \"module\",\n            \"content\": {\n              \"type\": \"ALIAS\",\n              \"content\": {\n                \"type\": \"SYMBOL\",\n                \"name\": \"_qualifying_module\"\n              },\n              \"named\": true,\n              \"value\": \"module\"\n            }\n          },\n          {\n            \"type\": \"FIELD\",\n            \"name\": \"id\",\n            \"content\": {\n              \"type\": \"SYMBOL\",\n              \"name\": \"_constructor\"\n            }\n          }\n        ]\n      }\n    },\n    \"_qconid\": {\n      \"type\": \"ALIAS\",\n      \"content\": {\n        \"type\": \"SYMBOL\",\n        \"name\": \"_qualified_constructor\"\n      },\n      \"named\": true,\n      \"value\": \"qualified\"\n    },\n    \"_conids\": {\n      \"type\": \"CHOICE\",\n      \"members\": [\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_qconid\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_constructor\"\n        }\n      ]\n    },\n    \"_con\": {\n      \"type\": \"CHOICE\",\n      \"members\": [\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_constructor\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_pconsym\"\n        }\n      ]\n    },\n    \"_qcon\": {\n      \"type\": \"CHOICE\",\n      \"members\": [\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_qconid\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_pqconsym\"\n        }\n      ]\n    },\n    \"_cons\": {\n      \"type\": \"CHOICE\",\n      \"members\": [\n        {\n          \"type\": \"PREC\",\n          \"value\": \"con\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_con\"\n          }\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_qcon\"\n        }\n      ]\n    },\n    \"_constructor_ticked\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"STRING\",\n          \"value\": \"`\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_constructor\"\n        },\n        {\n          \"type\": \"STRING\",\n          \"value\": \"`\"\n        }\n      ]\n    },\n    \"_conop\": {\n      \"type\": \"CHOICE\",\n      \"members\": [\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_constructor_operator_alias\"\n        },\n        {\n          \"type\": \"ALIAS\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_constructor_ticked\"\n          },\n          \"named\": true,\n          \"value\": \"infix_id\"\n        }\n      ]\n    },\n    \"_qconstructor_ticked\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"STRING\",\n          \"value\": \"`\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_qconid\"\n        },\n        {\n          \"type\": \"STRING\",\n          \"value\": \"`\"\n        }\n      ]\n    },\n    \"_conids_ticked\": {\n      \"type\": \"ALIAS\",\n      \"content\": {\n        \"type\": \"CHOICE\",\n        \"members\": [\n          {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_constructor_ticked\"\n          },\n          {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_qconstructor_ticked\"\n          }\n        ]\n      },\n      \"named\": true,\n      \"value\": \"infix_id\"\n    },\n    \"_tyconid\": {\n      \"type\": \"SYMBOL\",\n      \"name\": \"name\"\n    },\n    \"_qualified_type\": {\n      \"type\": \"PREC\",\n      \"value\": \"qualified-id\",\n      \"content\": {\n        \"type\": \"SEQ\",\n        \"members\": [\n          {\n            \"type\": \"FIELD\",\n            \"name\": \"module\",\n            \"content\": {\n              \"type\": \"ALIAS\",\n              \"content\": {\n                \"type\": \"SYMBOL\",\n                \"name\": \"_qualifying_module\"\n              },\n              \"named\": true,\n              \"value\": \"module\"\n            }\n          },\n          {\n            \"type\": \"FIELD\",\n            \"name\": \"id\",\n            \"content\": {\n              \"type\": \"SYMBOL\",\n              \"name\": \"_tyconid\"\n            }\n          }\n        ]\n      }\n    },\n    \"_qtyconid\": {\n      \"type\": \"ALIAS\",\n      \"content\": {\n        \"type\": \"SYMBOL\",\n        \"name\": \"_qualified_type\"\n      },\n      \"named\": true,\n      \"value\": \"qualified\"\n    },\n    \"_tyconids\": {\n      \"type\": \"CHOICE\",\n      \"members\": [\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_qtyconid\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_tyconid\"\n        }\n      ]\n    },\n    \"_tycon_arrow\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_paren_open\"\n        },\n        {\n          \"type\": \"ALIAS\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_arrow\"\n          },\n          \"named\": true,\n          \"value\": \"operator\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_paren_close\"\n        }\n      ]\n    },\n    \"_qualified_arrow\": {\n      \"type\": \"PREC\",\n      \"value\": \"qualified-id\",\n      \"content\": {\n        \"type\": \"SEQ\",\n        \"members\": [\n          {\n            \"type\": \"FIELD\",\n            \"name\": \"module\",\n            \"content\": {\n              \"type\": \"ALIAS\",\n              \"content\": {\n                \"type\": \"SYMBOL\",\n                \"name\": \"_qualifying_module\"\n              },\n              \"named\": true,\n              \"value\": \"module\"\n            }\n          },\n          {\n            \"type\": \"FIELD\",\n            \"name\": \"id\",\n            \"content\": {\n              \"type\": \"ALIAS\",\n              \"content\": {\n                \"type\": \"SYMBOL\",\n                \"name\": \"_arrow\"\n              },\n              \"named\": true,\n              \"value\": \"operator\"\n            }\n          }\n        ]\n      }\n    },\n    \"_qtycon_arrow\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_paren_open\"\n        },\n        {\n          \"type\": \"ALIAS\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_qualified_arrow\"\n          },\n          \"named\": true,\n          \"value\": \"qualified\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_paren_close\"\n        }\n      ]\n    },\n    \"_tycon\": {\n      \"type\": \"CHOICE\",\n      \"members\": [\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_tyconid\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_pvarsym\"\n        },\n        {\n          \"type\": \"ALIAS\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_tycon_arrow\"\n          },\n          \"named\": true,\n          \"value\": \"prefix_id\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_pconsym\"\n        }\n      ]\n    },\n    \"_qtycon\": {\n      \"type\": \"CHOICE\",\n      \"members\": [\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_qtyconid\"\n        },\n        {\n          \"type\": \"ALIAS\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_qtycon_arrow\"\n          },\n          \"named\": true,\n          \"value\": \"prefix_id\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_pqsym\"\n        }\n      ]\n    },\n    \"_tycons\": {\n      \"type\": \"CHOICE\",\n      \"members\": [\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_tycon\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_qtycon\"\n        }\n      ]\n    },\n    \"_promoted_tycons_alias\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"STRING\",\n          \"value\": \"'\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_cons\"\n        }\n      ]\n    },\n    \"_promoted_tycons\": {\n      \"type\": \"ALIAS\",\n      \"content\": {\n        \"type\": \"SYMBOL\",\n        \"name\": \"_promoted_tycons_alias\"\n      },\n      \"named\": true,\n      \"value\": \"promoted\"\n    },\n    \"_tycon_ticked\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"STRING\",\n          \"value\": \"`\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_tyconid\"\n        },\n        {\n          \"type\": \"STRING\",\n          \"value\": \"`\"\n        }\n      ]\n    },\n    \"_qtycon_ticked\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"STRING\",\n          \"value\": \"`\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_qtyconid\"\n        },\n        {\n          \"type\": \"STRING\",\n          \"value\": \"`\"\n        }\n      ]\n    },\n    \"_tyconids_ticked\": {\n      \"type\": \"ALIAS\",\n      \"content\": {\n        \"type\": \"CHOICE\",\n        \"members\": [\n          {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_tycon_ticked\"\n          },\n          {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_qtycon_ticked\"\n          }\n        ]\n      },\n      \"named\": true,\n      \"value\": \"infix_id\"\n    },\n    \"_tyconops\": {\n      \"type\": \"CHOICE\",\n      \"members\": [\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_sym\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_qsym\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_operator_minus\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_tyconids_ticked\"\n        }\n      ]\n    },\n    \"_promoted_tyconops_alias\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"STRING\",\n          \"value\": \"'\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_tyconops\"\n        }\n      ]\n    },\n    \"_promoted_tyconops\": {\n      \"type\": \"ALIAS\",\n      \"content\": {\n        \"type\": \"SYMBOL\",\n        \"name\": \"_promoted_tyconops_alias\"\n      },\n      \"named\": true,\n      \"value\": \"promoted\"\n    },\n    \"_tyops\": {\n      \"type\": \"CHOICE\",\n      \"members\": [\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_tyconops\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_promoted_tyconops\"\n        }\n      ]\n    },\n    \"_op_ticked\": {\n      \"type\": \"CHOICE\",\n      \"members\": [\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_varids_ticked\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_conids_ticked\"\n        }\n      ]\n    },\n    \"_ops\": {\n      \"type\": \"CHOICE\",\n      \"members\": [\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"operator\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_qvarsym\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"constructor_operator\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_qconsym\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_op_ticked\"\n        }\n      ]\n    },\n    \"_name\": {\n      \"type\": \"CHOICE\",\n      \"members\": [\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_var\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_con\"\n        }\n      ]\n    },\n    \"_qname\": {\n      \"type\": \"CHOICE\",\n      \"members\": [\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_vars\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_cons\"\n        }\n      ]\n    },\n    \"_operator_qual_dot_head\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_cond_qual_dot\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_varsym\"\n        }\n      ]\n    },\n    \"_operator_hash_head\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"CHOICE\",\n          \"members\": [\n            {\n              \"type\": \"STRING\",\n              \"value\": \"#\"\n            },\n            {\n              \"type\": \"IMMEDIATE_TOKEN\",\n              \"content\": {\n                \"type\": \"STRING\",\n                \"value\": \"#\"\n              }\n            }\n          ]\n        },\n        {\n          \"type\": \"CHOICE\",\n          \"members\": [\n            {\n              \"type\": \"CHOICE\",\n              \"members\": [\n                {\n                  \"type\": \"IMMEDIATE_TOKEN\",\n                  \"content\": {\n                    \"type\": \"STRING\",\n                    \"value\": \"#\"\n                  }\n                },\n                {\n                  \"type\": \"IMMEDIATE_TOKEN\",\n                  \"content\": {\n                    \"type\": \"STRING\",\n                    \"value\": \"|\"\n                  }\n                }\n              ]\n            },\n            {\n              \"type\": \"BLANK\"\n            }\n          ]\n        }\n      ]\n    },\n    \"operator\": {\n      \"type\": \"CHOICE\",\n      \"members\": [\n        {\n          \"type\": \"SEQ\",\n          \"members\": [\n            {\n              \"type\": \"CHOICE\",\n              \"members\": [\n                {\n                  \"type\": \"SYMBOL\",\n                  \"name\": \"_cond_prefix_dot\"\n                },\n                {\n                  \"type\": \"BLANK\"\n                }\n              ]\n            },\n            {\n              \"type\": \"SYMBOL\",\n              \"name\": \"_varsym\"\n            }\n          ]\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_operator_hash_head\"\n        },\n        {\n          \"type\": \"STRING\",\n          \"value\": \"*\"\n        }\n      ]\n    },\n    \"_operator_alias\": {\n      \"type\": \"SYMBOL\",\n      \"name\": \"operator\"\n    },\n    \"_operator_minus\": {\n      \"type\": \"ALIAS\",\n      \"content\": {\n        \"type\": \"STRING\",\n        \"value\": \"-\"\n      },\n      \"named\": true,\n      \"value\": \"operator\"\n    },\n    \"_varsym_prefix\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_paren_open\"\n        },\n        {\n          \"type\": \"CHOICE\",\n          \"members\": [\n            {\n              \"type\": \"SYMBOL\",\n              \"name\": \"operator\"\n            },\n            {\n              \"type\": \"SYMBOL\",\n              \"name\": \"_operator_minus\"\n            },\n            {\n              \"type\": \"ALIAS\",\n              \"content\": {\n                \"type\": \"SYMBOL\",\n                \"name\": \"_operator_qual_dot_head\"\n              },\n              \"named\": true,\n              \"value\": \"operator\"\n            }\n          ]\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_paren_close\"\n        }\n      ]\n    },\n    \"_pvarsym\": {\n      \"type\": \"ALIAS\",\n      \"content\": {\n        \"type\": \"SYMBOL\",\n        \"name\": \"_varsym_prefix\"\n      },\n      \"named\": true,\n      \"value\": \"prefix_id\"\n    },\n    \"_qualified_varsym\": {\n      \"type\": \"PREC\",\n      \"value\": \"qualified-id\",\n      \"content\": {\n        \"type\": \"SEQ\",\n        \"members\": [\n          {\n            \"type\": \"FIELD\",\n            \"name\": \"module\",\n            \"content\": {\n              \"type\": \"ALIAS\",\n              \"content\": {\n                \"type\": \"SYMBOL\",\n                \"name\": \"_qualifying_module\"\n              },\n              \"named\": true,\n              \"value\": \"module\"\n            }\n          },\n          {\n            \"type\": \"FIELD\",\n            \"name\": \"id\",\n            \"content\": {\n              \"type\": \"CHOICE\",\n              \"members\": [\n                {\n                  \"type\": \"SYMBOL\",\n                  \"name\": \"operator\"\n                },\n                {\n                  \"type\": \"SYMBOL\",\n                  \"name\": \"_operator_minus\"\n                }\n              ]\n            }\n          }\n        ]\n      }\n    },\n    \"_qvarsym\": {\n      \"type\": \"ALIAS\",\n      \"content\": {\n        \"type\": \"SYMBOL\",\n        \"name\": \"_qualified_varsym\"\n      },\n      \"named\": true,\n      \"value\": \"qualified\"\n    },\n    \"_qvarsym_prefix\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_paren_open\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_qvarsym\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_paren_close\"\n        }\n      ]\n    },\n    \"_pqvarsym\": {\n      \"type\": \"ALIAS\",\n      \"content\": {\n        \"type\": \"SYMBOL\",\n        \"name\": \"_qvarsym_prefix\"\n      },\n      \"named\": true,\n      \"value\": \"prefix_id\"\n    },\n    \"constructor_operator\": {\n      \"type\": \"SYMBOL\",\n      \"name\": \"_consym\"\n    },\n    \"_constructor_operator_alias\": {\n      \"type\": \"SYMBOL\",\n      \"name\": \"constructor_operator\"\n    },\n    \"_consym_prefix\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_paren_open\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"constructor_operator\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_paren_close\"\n        }\n      ]\n    },\n    \"_pconsym\": {\n      \"type\": \"ALIAS\",\n      \"content\": {\n        \"type\": \"SYMBOL\",\n        \"name\": \"_consym_prefix\"\n      },\n      \"named\": true,\n      \"value\": \"prefix_id\"\n    },\n    \"_qualified_consym\": {\n      \"type\": \"PREC\",\n      \"value\": \"qualified-id\",\n      \"content\": {\n        \"type\": \"SEQ\",\n        \"members\": [\n          {\n            \"type\": \"FIELD\",\n            \"name\": \"module\",\n            \"content\": {\n              \"type\": \"ALIAS\",\n              \"content\": {\n                \"type\": \"SYMBOL\",\n                \"name\": \"_qualifying_module\"\n              },\n              \"named\": true,\n              \"value\": \"module\"\n            }\n          },\n          {\n            \"type\": \"FIELD\",\n            \"name\": \"id\",\n            \"content\": {\n              \"type\": \"SYMBOL\",\n              \"name\": \"constructor_operator\"\n            }\n          }\n        ]\n      }\n    },\n    \"_qconsym\": {\n      \"type\": \"ALIAS\",\n      \"content\": {\n        \"type\": \"SYMBOL\",\n        \"name\": \"_qualified_consym\"\n      },\n      \"named\": true,\n      \"value\": \"qualified\"\n    },\n    \"_qconsym_prefix\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_paren_open\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_qconsym\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_paren_close\"\n        }\n      ]\n    },\n    \"_pqconsym\": {\n      \"type\": \"ALIAS\",\n      \"content\": {\n        \"type\": \"SYMBOL\",\n        \"name\": \"_qconsym_prefix\"\n      },\n      \"named\": true,\n      \"value\": \"prefix_id\"\n    },\n    \"_sym\": {\n      \"type\": \"CHOICE\",\n      \"members\": [\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_operator_alias\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_constructor_operator_alias\"\n        }\n      ]\n    },\n    \"_sym_prefix\": {\n      \"type\": \"CHOICE\",\n      \"members\": [\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_pvarsym\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_pconsym\"\n        }\n      ]\n    },\n    \"_qsym\": {\n      \"type\": \"CHOICE\",\n      \"members\": [\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_qvarsym\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_qconsym\"\n        }\n      ]\n    },\n    \"_pqsym\": {\n      \"type\": \"CHOICE\",\n      \"members\": [\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_pqvarsym\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_pqconsym\"\n        }\n      ]\n    },\n    \"variable\": {\n      \"type\": \"TOKEN\",\n      \"content\": {\n        \"type\": \"SEQ\",\n        \"members\": [\n          {\n            \"type\": \"PATTERN\",\n            \"value\": \"[_\\\\p{Ll}\\\\p{Lo}]\"\n          },\n          {\n            \"type\": \"PATTERN\",\n            \"value\": \"[\\\\pL\\\\p{Mn}\\\\pN_']*\"\n          },\n          {\n            \"type\": \"PATTERN\",\n            \"value\": \"#*\"\n          }\n        ]\n      }\n    },\n    \"implicit_variable\": {\n      \"type\": \"TOKEN\",\n      \"content\": {\n        \"type\": \"SEQ\",\n        \"members\": [\n          {\n            \"type\": \"STRING\",\n            \"value\": \"?\"\n          },\n          {\n            \"type\": \"PATTERN\",\n            \"value\": \"[_\\\\p{Ll}\\\\p{Lo}]\"\n          },\n          {\n            \"type\": \"PATTERN\",\n            \"value\": \"[\\\\pL\\\\p{Mn}\\\\pN_']*\"\n          }\n        ]\n      }\n    },\n    \"name\": {\n      \"type\": \"TOKEN\",\n      \"content\": {\n        \"type\": \"SEQ\",\n        \"members\": [\n          {\n            \"type\": \"PATTERN\",\n            \"value\": \"[\\\\p{Lu}\\\\p{Lt}]\"\n          },\n          {\n            \"type\": \"PATTERN\",\n            \"value\": \"[\\\\pL\\\\p{Mn}\\\\pN_']*\"\n          },\n          {\n            \"type\": \"PATTERN\",\n            \"value\": \"#*\"\n          }\n        ]\n      }\n    },\n    \"label\": {\n      \"type\": \"TOKEN\",\n      \"content\": {\n        \"type\": \"SEQ\",\n        \"members\": [\n          {\n            \"type\": \"STRING\",\n            \"value\": \"#\"\n          },\n          {\n            \"type\": \"PATTERN\",\n            \"value\": \"[_\\\\p{Ll}\\\\p{Lo}]\"\n          },\n          {\n            \"type\": \"PATTERN\",\n            \"value\": \"[\\\\pL\\\\p{Mn}\\\\pN_']*\"\n          }\n        ]\n      }\n    },\n    \"_carrow\": {\n      \"type\": \"CHOICE\",\n      \"members\": [\n        {\n          \"type\": \"STRING\",\n          \"value\": \"=>\"\n        },\n        {\n          \"type\": \"STRING\",\n          \"value\": \"⇒\"\n        }\n      ]\n    },\n    \"_arrow\": {\n      \"type\": \"CHOICE\",\n      \"members\": [\n        {\n          \"type\": \"STRING\",\n          \"value\": \"->\"\n        },\n        {\n          \"type\": \"STRING\",\n          \"value\": \"→\"\n        }\n      ]\n    },\n    \"_linear_arrow\": {\n      \"type\": \"CHOICE\",\n      \"members\": [\n        {\n          \"type\": \"STRING\",\n          \"value\": \"->.\"\n        },\n        {\n          \"type\": \"STRING\",\n          \"value\": \"⊸\"\n        }\n      ]\n    },\n    \"_larrow\": {\n      \"type\": \"CHOICE\",\n      \"members\": [\n        {\n          \"type\": \"STRING\",\n          \"value\": \"<-\"\n        },\n        {\n          \"type\": \"STRING\",\n          \"value\": \"←\"\n        }\n      ]\n    },\n    \"_colon2\": {\n      \"type\": \"CHOICE\",\n      \"members\": [\n        {\n          \"type\": \"STRING\",\n          \"value\": \"::\"\n        },\n        {\n          \"type\": \"STRING\",\n          \"value\": \"∷\"\n        }\n      ]\n    },\n    \"_promote\": {\n      \"type\": \"STRING\",\n      \"value\": \"'\"\n    },\n    \"_qual_dot\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_cond_qual_dot\"\n        },\n        {\n          \"type\": \"STRING\",\n          \"value\": \".\"\n        }\n      ]\n    },\n    \"_tight_dot\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_cond_tight_dot\"\n        },\n        {\n          \"type\": \"STRING\",\n          \"value\": \".\"\n        }\n      ]\n    },\n    \"_any_tight_dot\": {\n      \"type\": \"CHOICE\",\n      \"members\": [\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_qual_dot\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_tight_dot\"\n        }\n      ]\n    },\n    \"_prefix_dot\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_cond_prefix_dot\"\n        },\n        {\n          \"type\": \"STRING\",\n          \"value\": \".\"\n        }\n      ]\n    },\n    \"_any_prefix_dot\": {\n      \"type\": \"CHOICE\",\n      \"members\": [\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_qual_dot\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_prefix_dot\"\n        }\n      ]\n    },\n    \"_tight_at\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_cond_tight_at\"\n        },\n        {\n          \"type\": \"STRING\",\n          \"value\": \"@\"\n        }\n      ]\n    },\n    \"_prefix_at\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_cond_prefix_at\"\n        },\n        {\n          \"type\": \"STRING\",\n          \"value\": \"@\"\n        }\n      ]\n    },\n    \"_prefix_bang\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_cond_prefix_bang\"\n        },\n        {\n          \"type\": \"STRING\",\n          \"value\": \"!\"\n        }\n      ]\n    },\n    \"_tight_bang\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_cond_tight_bang\"\n        },\n        {\n          \"type\": \"STRING\",\n          \"value\": \"!\"\n        }\n      ]\n    },\n    \"_any_prefix_bang\": {\n      \"type\": \"CHOICE\",\n      \"members\": [\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_prefix_bang\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_tight_bang\"\n        }\n      ]\n    },\n    \"_prefix_tilde\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_cond_prefix_tilde\"\n        },\n        {\n          \"type\": \"STRING\",\n          \"value\": \"~\"\n        }\n      ]\n    },\n    \"_tight_tilde\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_cond_tight_tilde\"\n        },\n        {\n          \"type\": \"STRING\",\n          \"value\": \"~\"\n        }\n      ]\n    },\n    \"_any_prefix_tilde\": {\n      \"type\": \"CHOICE\",\n      \"members\": [\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_prefix_tilde\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_tight_tilde\"\n        }\n      ]\n    },\n    \"_prefix_percent\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_cond_prefix_percent\"\n        },\n        {\n          \"type\": \"STRING\",\n          \"value\": \"%\"\n        }\n      ]\n    },\n    \"_dotdot\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_cond_dotdot\"\n        },\n        {\n          \"type\": \"STRING\",\n          \"value\": \"..\"\n        }\n      ]\n    },\n    \"_paren_open\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"ALIAS\",\n          \"content\": {\n            \"type\": \"PATTERN\",\n            \"value\": \"\\\\(\"\n          },\n          \"named\": false,\n          \"value\": \"(\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_cmd_texp_start\"\n        }\n      ]\n    },\n    \"_paren_close\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"ALIAS\",\n          \"content\": {\n            \"type\": \"PATTERN\",\n            \"value\": \"\\\\)\"\n          },\n          \"named\": false,\n          \"value\": \")\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_cmd_texp_end\"\n        }\n      ]\n    },\n    \"_bracket_open\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"STRING\",\n          \"value\": \"[\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_cmd_texp_start\"\n        }\n      ]\n    },\n    \"_bracket_close\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"STRING\",\n          \"value\": \"]\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_cmd_texp_end\"\n        }\n      ]\n    },\n    \"_unboxed_open\": {\n      \"type\": \"ALIAS\",\n      \"content\": {\n        \"type\": \"SEQ\",\n        \"members\": [\n          {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_paren_open\"\n          },\n          {\n            \"type\": \"IMMEDIATE_TOKEN\",\n            \"content\": {\n              \"type\": \"STRING\",\n              \"value\": \"#\"\n            }\n          }\n        ]\n      },\n      \"named\": false,\n      \"value\": \"(#\"\n    },\n    \"_unboxed_close\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"STRING\",\n          \"value\": \"#)\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_cmd_texp_end\"\n        }\n      ]\n    },\n    \"_unboxed_bar\": {\n      \"type\": \"CHOICE\",\n      \"members\": [\n        {\n          \"type\": \"STRING\",\n          \"value\": \"|\"\n        },\n        {\n          \"type\": \"IMMEDIATE_TOKEN\",\n          \"content\": {\n            \"type\": \"STRING\",\n            \"value\": \"|\"\n          }\n        }\n      ]\n    },\n    \"_where\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"CHOICE\",\n          \"members\": [\n            {\n              \"type\": \"SYMBOL\",\n              \"name\": \"_phantom_where\"\n            },\n            {\n              \"type\": \"BLANK\"\n            }\n          ]\n        },\n        {\n          \"type\": \"STRING\",\n          \"value\": \"where\"\n        }\n      ]\n    },\n    \"_bar\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"CHOICE\",\n          \"members\": [\n            {\n              \"type\": \"SYMBOL\",\n              \"name\": \"_phantom_bar\"\n            },\n            {\n              \"type\": \"BLANK\"\n            }\n          ]\n        },\n        {\n          \"type\": \"STRING\",\n          \"value\": \"|\"\n        }\n      ]\n    }\n  },\n  \"extras\": [\n    {\n      \"type\": \"PATTERN\",\n      \"value\": \"\\\\p{Zs}\"\n    },\n    {\n      \"type\": \"PATTERN\",\n      \"value\": \"\\\\n\"\n    },\n    {\n      \"type\": \"PATTERN\",\n      \"value\": \"\\\\r\"\n    },\n    {\n      \"type\": \"SYMBOL\",\n      \"name\": \"cpp\"\n    },\n    {\n      \"type\": \"SYMBOL\",\n      \"name\": \"comment\"\n    },\n    {\n      \"type\": \"SYMBOL\",\n      \"name\": \"haddock\"\n    },\n    {\n      \"type\": \"SYMBOL\",\n      \"name\": \"pragma\"\n    }\n  ],\n  \"conflicts\": [\n    [\n      \"_function_name\",\n      \"pattern\"\n    ],\n    [\n      \"_function_name\",\n      \"pattern\",\n      \"expression\"\n    ],\n    [\n      \"pattern\",\n      \"expression\"\n    ],\n    [\n      \"signature\",\n      \"pattern\"\n    ],\n    [\n      \"_operator_hash_head\",\n      \"_unboxed_open\"\n    ]\n  ],\n  \"precedences\": [\n    [\n      {\n        \"type\": \"STRING\",\n        \"value\": \"projection\"\n      },\n      {\n        \"type\": \"STRING\",\n        \"value\": \"record\"\n      },\n      {\n        \"type\": \"STRING\",\n        \"value\": \"prefix\"\n      },\n      {\n        \"type\": \"STRING\",\n        \"value\": \"apply\"\n      },\n      {\n        \"type\": \"STRING\",\n        \"value\": \"negation\"\n      },\n      {\n        \"type\": \"STRING\",\n        \"value\": \"infix\"\n      },\n      {\n        \"type\": \"STRING\",\n        \"value\": \"implicit\"\n      },\n      {\n        \"type\": \"STRING\",\n        \"value\": \"fun\"\n      },\n      {\n        \"type\": \"STRING\",\n        \"value\": \"annotated\"\n      },\n      {\n        \"type\": \"SYMBOL\",\n        \"name\": \"quantified_type\"\n      }\n    ],\n    [\n      {\n        \"type\": \"SYMBOL\",\n        \"name\": \"_pat_negation\"\n      },\n      {\n        \"type\": \"SYMBOL\",\n        \"name\": \"literal\"\n      }\n    ],\n    [\n      {\n        \"type\": \"STRING\",\n        \"value\": \"bind\"\n      },\n      {\n        \"type\": \"STRING\",\n        \"value\": \"pat-name\"\n      }\n    ],\n    [\n      {\n        \"type\": \"STRING\",\n        \"value\": \"qualifying-module\"\n      },\n      {\n        \"type\": \"STRING\",\n        \"value\": \"qualified-id\"\n      }\n    ],\n    [\n      {\n        \"type\": \"STRING\",\n        \"value\": \"qualifying-module\"\n      },\n      {\n        \"type\": \"STRING\",\n        \"value\": \"con\"\n      }\n    ],\n    [\n      {\n        \"type\": \"STRING\",\n        \"value\": \"qualifying-module\"\n      },\n      {\n        \"type\": \"STRING\",\n        \"value\": \"type-name\"\n      }\n    ],\n    [\n      {\n        \"type\": \"SYMBOL\",\n        \"name\": \"operator\"\n      },\n      {\n        \"type\": \"SYMBOL\",\n        \"name\": \"_type_star\"\n      }\n    ],\n    [\n      {\n        \"type\": \"SYMBOL\",\n        \"name\": \"_type_wildcard\"\n      },\n      {\n        \"type\": \"SYMBOL\",\n        \"name\": \"_type_param_wildcard\"\n      }\n    ],\n    [\n      {\n        \"type\": \"SYMBOL\",\n        \"name\": \"_constructor_ticked\"\n      },\n      {\n        \"type\": \"SYMBOL\",\n        \"name\": \"_tycon_ticked\"\n      }\n    ],\n    [\n      {\n        \"type\": \"STRING\",\n        \"value\": \"qtype-single\"\n      },\n      {\n        \"type\": \"STRING\",\n        \"value\": \"qtype-curried\"\n      }\n    ],\n    [\n      {\n        \"type\": \"STRING\",\n        \"value\": \"patterns\"\n      },\n      {\n        \"type\": \"STRING\",\n        \"value\": \"apply\"\n      }\n    ]\n  ],\n  \"externals\": [\n    {\n      \"type\": \"SYMBOL\",\n      \"name\": \"error_sentinel\"\n    },\n    {\n      \"type\": \"SYMBOL\",\n      \"name\": \"_cond_layout_semicolon\"\n    },\n    {\n      \"type\": \"SYMBOL\",\n      \"name\": \"_cmd_layout_start\"\n    },\n    {\n      \"type\": \"SYMBOL\",\n      \"name\": \"_cmd_layout_start_do\"\n    },\n    {\n      \"type\": \"SYMBOL\",\n      \"name\": \"_cmd_layout_start_case\"\n    },\n    {\n      \"type\": \"SYMBOL\",\n      \"name\": \"_cmd_layout_start_if\"\n    },\n    {\n      \"type\": \"SYMBOL\",\n      \"name\": \"_cmd_layout_start_let\"\n    },\n    {\n      \"type\": \"SYMBOL\",\n      \"name\": \"_cmd_layout_start_quote\"\n    },\n    {\n      \"type\": \"SYMBOL\",\n      \"name\": \"_cmd_layout_start_explicit\"\n    },\n    {\n      \"type\": \"SYMBOL\",\n      \"name\": \"_cond_layout_end\"\n    },\n    {\n      \"type\": \"SYMBOL\",\n      \"name\": \"_cond_layout_end_explicit\"\n    },\n    {\n      \"type\": \"SYMBOL\",\n      \"name\": \"_cmd_brace_open\"\n    },\n    {\n      \"type\": \"SYMBOL\",\n      \"name\": \"_cmd_brace_close\"\n    },\n    {\n      \"type\": \"SYMBOL\",\n      \"name\": \"_cmd_texp_start\"\n    },\n    {\n      \"type\": \"SYMBOL\",\n      \"name\": \"_cmd_texp_end\"\n    },\n    {\n      \"type\": \"SYMBOL\",\n      \"name\": \"_phantom_where\"\n    },\n    {\n      \"type\": \"SYMBOL\",\n      \"name\": \"_phantom_in\"\n    },\n    {\n      \"type\": \"SYMBOL\",\n      \"name\": \"_phantom_arrow\"\n    },\n    {\n      \"type\": \"SYMBOL\",\n      \"name\": \"_phantom_bar\"\n    },\n    {\n      \"type\": \"SYMBOL\",\n      \"name\": \"_phantom_deriving\"\n    },\n    {\n      \"type\": \"SYMBOL\",\n      \"name\": \"comment\"\n    },\n    {\n      \"type\": \"SYMBOL\",\n      \"name\": \"haddock\"\n    },\n    {\n      \"type\": \"SYMBOL\",\n      \"name\": \"cpp\"\n    },\n    {\n      \"type\": \"SYMBOL\",\n      \"name\": \"pragma\"\n    },\n    {\n      \"type\": \"SYMBOL\",\n      \"name\": \"_cond_quote_start\"\n    },\n    {\n      \"type\": \"SYMBOL\",\n      \"name\": \"quasiquote_body\"\n    },\n    {\n      \"type\": \"SYMBOL\",\n      \"name\": \"_cond_splice\"\n    },\n    {\n      \"type\": \"SYMBOL\",\n      \"name\": \"_cond_qual_dot\"\n    },\n    {\n      \"type\": \"SYMBOL\",\n      \"name\": \"_cond_tight_dot\"\n    },\n    {\n      \"type\": \"SYMBOL\",\n      \"name\": \"_cond_prefix_dot\"\n    },\n    {\n      \"type\": \"SYMBOL\",\n      \"name\": \"_cond_dotdot\"\n    },\n    {\n      \"type\": \"SYMBOL\",\n      \"name\": \"_cond_tight_at\"\n    },\n    {\n      \"type\": \"SYMBOL\",\n      \"name\": \"_cond_prefix_at\"\n    },\n    {\n      \"type\": \"SYMBOL\",\n      \"name\": \"_cond_tight_bang\"\n    },\n    {\n      \"type\": \"SYMBOL\",\n      \"name\": \"_cond_prefix_bang\"\n    },\n    {\n      \"type\": \"SYMBOL\",\n      \"name\": \"_cond_tight_tilde\"\n    },\n    {\n      \"type\": \"SYMBOL\",\n      \"name\": \"_cond_prefix_tilde\"\n    },\n    {\n      \"type\": \"SYMBOL\",\n      \"name\": \"_cond_prefix_percent\"\n    },\n    {\n      \"type\": \"SYMBOL\",\n      \"name\": \"_cond_qualified_op\"\n    },\n    {\n      \"type\": \"SYMBOL\",\n      \"name\": \"_cond_left_section_op\"\n    },\n    {\n      \"type\": \"SYMBOL\",\n      \"name\": \"_cond_no_section_op\"\n    },\n    {\n      \"type\": \"SYMBOL\",\n      \"name\": \"_cond_minus\"\n    },\n    {\n      \"type\": \"SYMBOL\",\n      \"name\": \"_cond_context\"\n    },\n    {\n      \"type\": \"SYMBOL\",\n      \"name\": \"_cond_infix\"\n    },\n    {\n      \"type\": \"SYMBOL\",\n      \"name\": \"_cond_data_infix\"\n    },\n    {\n      \"type\": \"SYMBOL\",\n      \"name\": \"_cond_assoc_tyinst\"\n    },\n    {\n      \"type\": \"SYMBOL\",\n      \"name\": \"_varsym\"\n    },\n    {\n      \"type\": \"SYMBOL\",\n      \"name\": \"_consym\"\n    },\n    {\n      \"type\": \"PATTERN\",\n      \"value\": \"\\\\n\"\n    }\n  ],\n  \"inline\": [\n    \"_var\",\n    \"_vars\",\n    \"_varids\",\n    \"_varids_ticked\",\n    \"_varop\",\n    \"_constructor\",\n    \"_con\",\n    \"_qcon\",\n    \"_cons\",\n    \"_conids\",\n    \"_conids_ticked\",\n    \"_conop\",\n    \"_op_ticked\",\n    \"_modid\",\n    \"_qvarsym\",\n    \"_qconsym\",\n    \"_sym\",\n    \"_qsym\",\n    \"_pqsym\",\n    \"_any_prefix_dot\",\n    \"_any_tight_dot\",\n    \"_unboxed_bar\",\n    \"_exp_name\",\n    \"_exp_greedy\",\n    \"_let\",\n    \"_pat_apply_arg\",\n    \"_pat_name\",\n    \"_pat_texp\",\n    \"_tyconid\",\n    \"_tyconids\",\n    \"_tycon\",\n    \"_qtycon\",\n    \"_tycons\",\n    \"_tyconops\",\n    \"_tyops\",\n    \"_type_name\",\n    \"_forall\",\n    \"_type_apply_arg\",\n    \"_parameter_type\",\n    \"_field_type\",\n    \"_type_head\",\n    \"_type_instance_head\",\n    \"_type_annotation\",\n    \"_kind_annotation\",\n    \"_number\",\n    \"_stringly\",\n    \"_unit_cons\",\n    \"_tuple_cons\",\n    \"_universal\",\n    \"_function_head_patterns\",\n    \"_function_head\"\n  ],\n  \"supertypes\": [\n    \"expression\",\n    \"pattern\",\n    \"type\",\n    \"quantified_type\",\n    \"constraint\",\n    \"constraints\",\n    \"type_param\",\n    \"declaration\",\n    \"decl\",\n    \"class_decl\",\n    \"instance_decl\",\n    \"statement\",\n    \"qualifier\",\n    \"guard\"\n  ]\n}\n"
  },
  {
    "path": "src/node-types.json",
    "content": "[\n  {\n    \"type\": \"class_decl\",\n    \"named\": true,\n    \"subtypes\": [\n      {\n        \"type\": \"data_family\",\n        \"named\": true\n      },\n      {\n        \"type\": \"decl\",\n        \"named\": true\n      },\n      {\n        \"type\": \"default_signature\",\n        \"named\": true\n      },\n      {\n        \"type\": \"fixity\",\n        \"named\": true\n      },\n      {\n        \"type\": \"type_family\",\n        \"named\": true\n      },\n      {\n        \"type\": \"type_instance\",\n        \"named\": true\n      }\n    ]\n  },\n  {\n    \"type\": \"constraint\",\n    \"named\": true,\n    \"subtypes\": [\n      {\n        \"type\": \"apply\",\n        \"named\": true\n      },\n      {\n        \"type\": \"infix\",\n        \"named\": true\n      },\n      {\n        \"type\": \"literal\",\n        \"named\": true\n      },\n      {\n        \"type\": \"name\",\n        \"named\": true\n      },\n      {\n        \"type\": \"parens\",\n        \"named\": true\n      },\n      {\n        \"type\": \"prefix_id\",\n        \"named\": true\n      },\n      {\n        \"type\": \"prefix_tuple\",\n        \"named\": true\n      },\n      {\n        \"type\": \"prefix_unboxed_sum\",\n        \"named\": true\n      },\n      {\n        \"type\": \"prefix_unboxed_tuple\",\n        \"named\": true\n      },\n      {\n        \"type\": \"promoted\",\n        \"named\": true\n      },\n      {\n        \"type\": \"qualified\",\n        \"named\": true\n      },\n      {\n        \"type\": \"quasiquote\",\n        \"named\": true\n      },\n      {\n        \"type\": \"splice\",\n        \"named\": true\n      },\n      {\n        \"type\": \"tuple\",\n        \"named\": true\n      },\n      {\n        \"type\": \"unboxed_unit\",\n        \"named\": true\n      },\n      {\n        \"type\": \"unit\",\n        \"named\": true\n      },\n      {\n        \"type\": \"variable\",\n        \"named\": true\n      },\n      {\n        \"type\": \"wildcard\",\n        \"named\": true\n      }\n    ]\n  },\n  {\n    \"type\": \"constraints\",\n    \"named\": true,\n    \"subtypes\": [\n      {\n        \"type\": \"constraint\",\n        \"named\": true\n      },\n      {\n        \"type\": \"context\",\n        \"named\": true\n      },\n      {\n        \"type\": \"forall\",\n        \"named\": true\n      },\n      {\n        \"type\": \"implicit_parameter\",\n        \"named\": true\n      },\n      {\n        \"type\": \"signature\",\n        \"named\": true\n      }\n    ]\n  },\n  {\n    \"type\": \"decl\",\n    \"named\": true,\n    \"subtypes\": [\n      {\n        \"type\": \"bind\",\n        \"named\": true\n      },\n      {\n        \"type\": \"function\",\n        \"named\": true\n      },\n      {\n        \"type\": \"signature\",\n        \"named\": true\n      }\n    ]\n  },\n  {\n    \"type\": \"declaration\",\n    \"named\": true,\n    \"subtypes\": [\n      {\n        \"type\": \"class\",\n        \"named\": true\n      },\n      {\n        \"type\": \"data_family\",\n        \"named\": true\n      },\n      {\n        \"type\": \"data_instance\",\n        \"named\": true\n      },\n      {\n        \"type\": \"data_type\",\n        \"named\": true\n      },\n      {\n        \"type\": \"decl\",\n        \"named\": true\n      },\n      {\n        \"type\": \"default_types\",\n        \"named\": true\n      },\n      {\n        \"type\": \"deriving_instance\",\n        \"named\": true\n      },\n      {\n        \"type\": \"fixity\",\n        \"named\": true\n      },\n      {\n        \"type\": \"foreign_export\",\n        \"named\": true\n      },\n      {\n        \"type\": \"foreign_import\",\n        \"named\": true\n      },\n      {\n        \"type\": \"instance\",\n        \"named\": true\n      },\n      {\n        \"type\": \"kind_signature\",\n        \"named\": true\n      },\n      {\n        \"type\": \"newtype\",\n        \"named\": true\n      },\n      {\n        \"type\": \"pattern_synonym\",\n        \"named\": true\n      },\n      {\n        \"type\": \"role_annotation\",\n        \"named\": true\n      },\n      {\n        \"type\": \"top_splice\",\n        \"named\": true\n      },\n      {\n        \"type\": \"type_family\",\n        \"named\": true\n      },\n      {\n        \"type\": \"type_instance\",\n        \"named\": true\n      },\n      {\n        \"type\": \"type_synomym\",\n        \"named\": true\n      }\n    ]\n  },\n  {\n    \"type\": \"expression\",\n    \"named\": true,\n    \"subtypes\": [\n      {\n        \"type\": \"apply\",\n        \"named\": true\n      },\n      {\n        \"type\": \"arithmetic_sequence\",\n        \"named\": true\n      },\n      {\n        \"type\": \"case\",\n        \"named\": true\n      },\n      {\n        \"type\": \"conditional\",\n        \"named\": true\n      },\n      {\n        \"type\": \"constructor\",\n        \"named\": true\n      },\n      {\n        \"type\": \"do\",\n        \"named\": true\n      },\n      {\n        \"type\": \"implicit_variable\",\n        \"named\": true\n      },\n      {\n        \"type\": \"infix\",\n        \"named\": true\n      },\n      {\n        \"type\": \"label\",\n        \"named\": true\n      },\n      {\n        \"type\": \"lambda\",\n        \"named\": true\n      },\n      {\n        \"type\": \"lambda_case\",\n        \"named\": true\n      },\n      {\n        \"type\": \"lambda_cases\",\n        \"named\": true\n      },\n      {\n        \"type\": \"left_section\",\n        \"named\": true\n      },\n      {\n        \"type\": \"let_in\",\n        \"named\": true\n      },\n      {\n        \"type\": \"list\",\n        \"named\": true\n      },\n      {\n        \"type\": \"list_comprehension\",\n        \"named\": true\n      },\n      {\n        \"type\": \"literal\",\n        \"named\": true\n      },\n      {\n        \"type\": \"multi_way_if\",\n        \"named\": true\n      },\n      {\n        \"type\": \"negation\",\n        \"named\": true\n      },\n      {\n        \"type\": \"parens\",\n        \"named\": true\n      },\n      {\n        \"type\": \"prefix_id\",\n        \"named\": true\n      },\n      {\n        \"type\": \"prefix_tuple\",\n        \"named\": true\n      },\n      {\n        \"type\": \"prefix_unboxed_sum\",\n        \"named\": true\n      },\n      {\n        \"type\": \"prefix_unboxed_tuple\",\n        \"named\": true\n      },\n      {\n        \"type\": \"projection\",\n        \"named\": true\n      },\n      {\n        \"type\": \"projection_selector\",\n        \"named\": true\n      },\n      {\n        \"type\": \"qualified\",\n        \"named\": true\n      },\n      {\n        \"type\": \"quasiquote\",\n        \"named\": true\n      },\n      {\n        \"type\": \"quote\",\n        \"named\": true\n      },\n      {\n        \"type\": \"record\",\n        \"named\": true\n      },\n      {\n        \"type\": \"right_section\",\n        \"named\": true\n      },\n      {\n        \"type\": \"splice\",\n        \"named\": true\n      },\n      {\n        \"type\": \"th_quoted_name\",\n        \"named\": true\n      },\n      {\n        \"type\": \"tuple\",\n        \"named\": true\n      },\n      {\n        \"type\": \"typed_quote\",\n        \"named\": true\n      },\n      {\n        \"type\": \"unboxed_sum\",\n        \"named\": true\n      },\n      {\n        \"type\": \"unboxed_tuple\",\n        \"named\": true\n      },\n      {\n        \"type\": \"unboxed_unit\",\n        \"named\": true\n      },\n      {\n        \"type\": \"unit\",\n        \"named\": true\n      },\n      {\n        \"type\": \"variable\",\n        \"named\": true\n      }\n    ]\n  },\n  {\n    \"type\": \"guard\",\n    \"named\": true,\n    \"subtypes\": [\n      {\n        \"type\": \"boolean\",\n        \"named\": true\n      },\n      {\n        \"type\": \"let\",\n        \"named\": true\n      },\n      {\n        \"type\": \"pattern_guard\",\n        \"named\": true\n      }\n    ]\n  },\n  {\n    \"type\": \"instance_decl\",\n    \"named\": true,\n    \"subtypes\": [\n      {\n        \"type\": \"data_instance\",\n        \"named\": true\n      },\n      {\n        \"type\": \"decl\",\n        \"named\": true\n      },\n      {\n        \"type\": \"type_instance\",\n        \"named\": true\n      }\n    ]\n  },\n  {\n    \"type\": \"pattern\",\n    \"named\": true,\n    \"subtypes\": [\n      {\n        \"type\": \"apply\",\n        \"named\": true\n      },\n      {\n        \"type\": \"as\",\n        \"named\": true\n      },\n      {\n        \"type\": \"constructor\",\n        \"named\": true\n      },\n      {\n        \"type\": \"infix\",\n        \"named\": true\n      },\n      {\n        \"type\": \"irrefutable\",\n        \"named\": true\n      },\n      {\n        \"type\": \"list\",\n        \"named\": true\n      },\n      {\n        \"type\": \"literal\",\n        \"named\": true\n      },\n      {\n        \"type\": \"negation\",\n        \"named\": true\n      },\n      {\n        \"type\": \"parens\",\n        \"named\": true\n      },\n      {\n        \"type\": \"prefix_id\",\n        \"named\": true\n      },\n      {\n        \"type\": \"prefix_tuple\",\n        \"named\": true\n      },\n      {\n        \"type\": \"prefix_unboxed_sum\",\n        \"named\": true\n      },\n      {\n        \"type\": \"prefix_unboxed_tuple\",\n        \"named\": true\n      },\n      {\n        \"type\": \"qualified\",\n        \"named\": true\n      },\n      {\n        \"type\": \"quasiquote\",\n        \"named\": true\n      },\n      {\n        \"type\": \"record\",\n        \"named\": true\n      },\n      {\n        \"type\": \"splice\",\n        \"named\": true\n      },\n      {\n        \"type\": \"strict\",\n        \"named\": true\n      },\n      {\n        \"type\": \"tuple\",\n        \"named\": true\n      },\n      {\n        \"type\": \"unboxed_sum\",\n        \"named\": true\n      },\n      {\n        \"type\": \"unboxed_tuple\",\n        \"named\": true\n      },\n      {\n        \"type\": \"unboxed_unit\",\n        \"named\": true\n      },\n      {\n        \"type\": \"unit\",\n        \"named\": true\n      },\n      {\n        \"type\": \"variable\",\n        \"named\": true\n      },\n      {\n        \"type\": \"wildcard\",\n        \"named\": true\n      }\n    ]\n  },\n  {\n    \"type\": \"qualifier\",\n    \"named\": true,\n    \"subtypes\": [\n      {\n        \"type\": \"boolean\",\n        \"named\": true\n      },\n      {\n        \"type\": \"generator\",\n        \"named\": true\n      },\n      {\n        \"type\": \"group\",\n        \"named\": true\n      },\n      {\n        \"type\": \"let\",\n        \"named\": true\n      },\n      {\n        \"type\": \"transform\",\n        \"named\": true\n      }\n    ]\n  },\n  {\n    \"type\": \"quantified_type\",\n    \"named\": true,\n    \"subtypes\": [\n      {\n        \"type\": \"context\",\n        \"named\": true\n      },\n      {\n        \"type\": \"forall\",\n        \"named\": true\n      },\n      {\n        \"type\": \"forall_required\",\n        \"named\": true\n      },\n      {\n        \"type\": \"function\",\n        \"named\": true\n      },\n      {\n        \"type\": \"implicit_parameter\",\n        \"named\": true\n      },\n      {\n        \"type\": \"linear_function\",\n        \"named\": true\n      },\n      {\n        \"type\": \"type\",\n        \"named\": true\n      }\n    ]\n  },\n  {\n    \"type\": \"statement\",\n    \"named\": true,\n    \"subtypes\": [\n      {\n        \"type\": \"bind\",\n        \"named\": true\n      },\n      {\n        \"type\": \"exp\",\n        \"named\": true\n      },\n      {\n        \"type\": \"let\",\n        \"named\": true\n      },\n      {\n        \"type\": \"rec\",\n        \"named\": true\n      }\n    ]\n  },\n  {\n    \"type\": \"type\",\n    \"named\": true,\n    \"subtypes\": [\n      {\n        \"type\": \"apply\",\n        \"named\": true\n      },\n      {\n        \"type\": \"infix\",\n        \"named\": true\n      },\n      {\n        \"type\": \"list\",\n        \"named\": true\n      },\n      {\n        \"type\": \"literal\",\n        \"named\": true\n      },\n      {\n        \"type\": \"name\",\n        \"named\": true\n      },\n      {\n        \"type\": \"parens\",\n        \"named\": true\n      },\n      {\n        \"type\": \"prefix_id\",\n        \"named\": true\n      },\n      {\n        \"type\": \"prefix_list\",\n        \"named\": true\n      },\n      {\n        \"type\": \"prefix_tuple\",\n        \"named\": true\n      },\n      {\n        \"type\": \"prefix_unboxed_sum\",\n        \"named\": true\n      },\n      {\n        \"type\": \"prefix_unboxed_tuple\",\n        \"named\": true\n      },\n      {\n        \"type\": \"promoted\",\n        \"named\": true\n      },\n      {\n        \"type\": \"qualified\",\n        \"named\": true\n      },\n      {\n        \"type\": \"quasiquote\",\n        \"named\": true\n      },\n      {\n        \"type\": \"splice\",\n        \"named\": true\n      },\n      {\n        \"type\": \"star\",\n        \"named\": true\n      },\n      {\n        \"type\": \"tuple\",\n        \"named\": true\n      },\n      {\n        \"type\": \"unboxed_sum\",\n        \"named\": true\n      },\n      {\n        \"type\": \"unboxed_tuple\",\n        \"named\": true\n      },\n      {\n        \"type\": \"unboxed_unit\",\n        \"named\": true\n      },\n      {\n        \"type\": \"unit\",\n        \"named\": true\n      },\n      {\n        \"type\": \"variable\",\n        \"named\": true\n      },\n      {\n        \"type\": \"wildcard\",\n        \"named\": true\n      }\n    ]\n  },\n  {\n    \"type\": \"type_param\",\n    \"named\": true,\n    \"subtypes\": [\n      {\n        \"type\": \"invisible\",\n        \"named\": true\n      },\n      {\n        \"type\": \"parens\",\n        \"named\": true\n      },\n      {\n        \"type\": \"variable\",\n        \"named\": true\n      },\n      {\n        \"type\": \"wildcard\",\n        \"named\": true\n      }\n    ]\n  },\n  {\n    \"type\": \"(#\",\n    \"named\": false,\n    \"fields\": {}\n  },\n  {\n    \"type\": \"abstract_family\",\n    \"named\": true,\n    \"fields\": {}\n  },\n  {\n    \"type\": \"alternative\",\n    \"named\": true,\n    \"fields\": {\n      \"binds\": {\n        \"multiple\": false,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"local_binds\",\n            \"named\": true\n          }\n        ]\n      },\n      \"match\": {\n        \"multiple\": true,\n        \"required\": true,\n        \"types\": [\n          {\n            \"type\": \"match\",\n            \"named\": true\n          }\n        ]\n      },\n      \"pattern\": {\n        \"multiple\": false,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"pattern\",\n            \"named\": true\n          },\n          {\n            \"type\": \"signature\",\n            \"named\": true\n          }\n        ]\n      },\n      \"patterns\": {\n        \"multiple\": false,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"patterns\",\n            \"named\": true\n          }\n        ]\n      }\n    }\n  },\n  {\n    \"type\": \"alternatives\",\n    \"named\": true,\n    \"fields\": {\n      \"alternative\": {\n        \"multiple\": true,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"alternative\",\n            \"named\": true\n          }\n        ]\n      }\n    }\n  },\n  {\n    \"type\": \"annotated\",\n    \"named\": true,\n    \"fields\": {\n      \"kind\": {\n        \"multiple\": false,\n        \"required\": true,\n        \"types\": [\n          {\n            \"type\": \"quantified_type\",\n            \"named\": true\n          }\n        ]\n      }\n    },\n    \"children\": {\n      \"multiple\": false,\n      \"required\": true,\n      \"types\": [\n        {\n          \"type\": \"type_param\",\n          \"named\": true\n        }\n      ]\n    }\n  },\n  {\n    \"type\": \"apply\",\n    \"named\": true,\n    \"fields\": {\n      \"argument\": {\n        \"multiple\": false,\n        \"required\": true,\n        \"types\": [\n          {\n            \"type\": \"explicit_type\",\n            \"named\": true\n          },\n          {\n            \"type\": \"expression\",\n            \"named\": true\n          },\n          {\n            \"type\": \"kind_application\",\n            \"named\": true\n          },\n          {\n            \"type\": \"pattern\",\n            \"named\": true\n          },\n          {\n            \"type\": \"type\",\n            \"named\": true\n          },\n          {\n            \"type\": \"type_application\",\n            \"named\": true\n          },\n          {\n            \"type\": \"type_binder\",\n            \"named\": true\n          }\n        ]\n      },\n      \"constructor\": {\n        \"multiple\": false,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"constraint\",\n            \"named\": true\n          },\n          {\n            \"type\": \"type\",\n            \"named\": true\n          }\n        ]\n      },\n      \"function\": {\n        \"multiple\": false,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"expression\",\n            \"named\": true\n          },\n          {\n            \"type\": \"pattern\",\n            \"named\": true\n          }\n        ]\n      }\n    }\n  },\n  {\n    \"type\": \"arithmetic_sequence\",\n    \"named\": true,\n    \"fields\": {\n      \"from\": {\n        \"multiple\": false,\n        \"required\": true,\n        \"types\": [\n          {\n            \"type\": \"expression\",\n            \"named\": true\n          },\n          {\n            \"type\": \"signature\",\n            \"named\": true\n          }\n        ]\n      },\n      \"step\": {\n        \"multiple\": false,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"expression\",\n            \"named\": true\n          },\n          {\n            \"type\": \"signature\",\n            \"named\": true\n          }\n        ]\n      },\n      \"to\": {\n        \"multiple\": false,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"expression\",\n            \"named\": true\n          },\n          {\n            \"type\": \"signature\",\n            \"named\": true\n          }\n        ]\n      }\n    }\n  },\n  {\n    \"type\": \"as\",\n    \"named\": true,\n    \"fields\": {\n      \"bind\": {\n        \"multiple\": false,\n        \"required\": true,\n        \"types\": [\n          {\n            \"type\": \"variable\",\n            \"named\": true\n          }\n        ]\n      },\n      \"pattern\": {\n        \"multiple\": false,\n        \"required\": true,\n        \"types\": [\n          {\n            \"type\": \"pattern\",\n            \"named\": true\n          }\n        ]\n      }\n    }\n  },\n  {\n    \"type\": \"associated_type\",\n    \"named\": true,\n    \"fields\": {\n      \"namespace\": {\n        \"multiple\": false,\n        \"required\": true,\n        \"types\": [\n          {\n            \"type\": \"type\",\n            \"named\": false\n          }\n        ]\n      },\n      \"type\": {\n        \"multiple\": false,\n        \"required\": true,\n        \"types\": [\n          {\n            \"type\": \"name\",\n            \"named\": true\n          },\n          {\n            \"type\": \"qualified\",\n            \"named\": true\n          }\n        ]\n      }\n    }\n  },\n  {\n    \"type\": \"bind\",\n    \"named\": true,\n    \"fields\": {\n      \"arrow\": {\n        \"multiple\": false,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"<-\",\n            \"named\": false\n          },\n          {\n            \"type\": \"←\",\n            \"named\": false\n          }\n        ]\n      },\n      \"binds\": {\n        \"multiple\": false,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"local_binds\",\n            \"named\": true\n          }\n        ]\n      },\n      \"expression\": {\n        \"multiple\": false,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"expression\",\n            \"named\": true\n          },\n          {\n            \"type\": \"signature\",\n            \"named\": true\n          }\n        ]\n      },\n      \"implicit\": {\n        \"multiple\": false,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"implicit_variable\",\n            \"named\": true\n          }\n        ]\n      },\n      \"match\": {\n        \"multiple\": true,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"match\",\n            \"named\": true\n          }\n        ]\n      },\n      \"name\": {\n        \"multiple\": false,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"prefix_id\",\n            \"named\": true\n          },\n          {\n            \"type\": \"variable\",\n            \"named\": true\n          }\n        ]\n      },\n      \"pattern\": {\n        \"multiple\": false,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"pattern\",\n            \"named\": true\n          },\n          {\n            \"type\": \"signature\",\n            \"named\": true\n          }\n        ]\n      }\n    }\n  },\n  {\n    \"type\": \"binding_list\",\n    \"named\": true,\n    \"fields\": {\n      \"name\": {\n        \"multiple\": true,\n        \"required\": true,\n        \"types\": [\n          {\n            \"type\": \"constructor\",\n            \"named\": true\n          },\n          {\n            \"type\": \"prefix_id\",\n            \"named\": true\n          },\n          {\n            \"type\": \"variable\",\n            \"named\": true\n          }\n        ]\n      }\n    }\n  },\n  {\n    \"type\": \"boolean\",\n    \"named\": true,\n    \"fields\": {},\n    \"children\": {\n      \"multiple\": false,\n      \"required\": true,\n      \"types\": [\n        {\n          \"type\": \"expression\",\n          \"named\": true\n        },\n        {\n          \"type\": \"signature\",\n          \"named\": true\n        }\n      ]\n    }\n  },\n  {\n    \"type\": \"case\",\n    \"named\": true,\n    \"fields\": {\n      \"alternatives\": {\n        \"multiple\": false,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"alternatives\",\n            \"named\": true\n          }\n        ]\n      }\n    },\n    \"children\": {\n      \"multiple\": false,\n      \"required\": true,\n      \"types\": [\n        {\n          \"type\": \"expression\",\n          \"named\": true\n        },\n        {\n          \"type\": \"signature\",\n          \"named\": true\n        }\n      ]\n    }\n  },\n  {\n    \"type\": \"children\",\n    \"named\": true,\n    \"fields\": {\n      \"element\": {\n        \"multiple\": true,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"all_names\",\n            \"named\": true\n          },\n          {\n            \"type\": \"associated_type\",\n            \"named\": true\n          },\n          {\n            \"type\": \"constructor\",\n            \"named\": true\n          },\n          {\n            \"type\": \"prefix_id\",\n            \"named\": true\n          },\n          {\n            \"type\": \"qualified\",\n            \"named\": true\n          },\n          {\n            \"type\": \"variable\",\n            \"named\": true\n          }\n        ]\n      }\n    }\n  },\n  {\n    \"type\": \"class\",\n    \"named\": true,\n    \"fields\": {\n      \"context\": {\n        \"multiple\": false,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"context\",\n            \"named\": true\n          }\n        ]\n      },\n      \"declarations\": {\n        \"multiple\": false,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"class_declarations\",\n            \"named\": true\n          }\n        ]\n      },\n      \"fundeps\": {\n        \"multiple\": false,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"fundeps\",\n            \"named\": true\n          }\n        ]\n      },\n      \"name\": {\n        \"multiple\": false,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"name\",\n            \"named\": true\n          },\n          {\n            \"type\": \"prefix_id\",\n            \"named\": true\n          },\n          {\n            \"type\": \"prefix_list\",\n            \"named\": true\n          },\n          {\n            \"type\": \"unit\",\n            \"named\": true\n          }\n        ]\n      },\n      \"patterns\": {\n        \"multiple\": false,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"type_params\",\n            \"named\": true\n          }\n        ]\n      }\n    },\n    \"children\": {\n      \"multiple\": false,\n      \"required\": false,\n      \"types\": [\n        {\n          \"type\": \"infix\",\n          \"named\": true\n        },\n        {\n          \"type\": \"parens\",\n          \"named\": true\n        }\n      ]\n    }\n  },\n  {\n    \"type\": \"class_declarations\",\n    \"named\": true,\n    \"fields\": {\n      \"declaration\": {\n        \"multiple\": true,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"class_decl\",\n            \"named\": true\n          }\n        ]\n      }\n    }\n  },\n  {\n    \"type\": \"conditional\",\n    \"named\": true,\n    \"fields\": {\n      \"else\": {\n        \"multiple\": false,\n        \"required\": true,\n        \"types\": [\n          {\n            \"type\": \"expression\",\n            \"named\": true\n          },\n          {\n            \"type\": \"signature\",\n            \"named\": true\n          }\n        ]\n      },\n      \"if\": {\n        \"multiple\": false,\n        \"required\": true,\n        \"types\": [\n          {\n            \"type\": \"expression\",\n            \"named\": true\n          },\n          {\n            \"type\": \"signature\",\n            \"named\": true\n          }\n        ]\n      },\n      \"then\": {\n        \"multiple\": false,\n        \"required\": true,\n        \"types\": [\n          {\n            \"type\": \"expression\",\n            \"named\": true\n          },\n          {\n            \"type\": \"signature\",\n            \"named\": true\n          }\n        ]\n      }\n    }\n  },\n  {\n    \"type\": \"constructor_operator\",\n    \"named\": true,\n    \"fields\": {}\n  },\n  {\n    \"type\": \"constructor_synonym\",\n    \"named\": true,\n    \"fields\": {\n      \"binds\": {\n        \"multiple\": false,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"local_binds\",\n            \"named\": true\n          }\n        ]\n      },\n      \"implicit\": {\n        \"multiple\": false,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"implicit_variable\",\n            \"named\": true\n          }\n        ]\n      },\n      \"match\": {\n        \"multiple\": true,\n        \"required\": true,\n        \"types\": [\n          {\n            \"type\": \"match\",\n            \"named\": true\n          }\n        ]\n      },\n      \"name\": {\n        \"multiple\": false,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"prefix_id\",\n            \"named\": true\n          },\n          {\n            \"type\": \"variable\",\n            \"named\": true\n          }\n        ]\n      },\n      \"pattern\": {\n        \"multiple\": false,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"pattern\",\n            \"named\": true\n          },\n          {\n            \"type\": \"signature\",\n            \"named\": true\n          }\n        ]\n      }\n    }\n  },\n  {\n    \"type\": \"constructor_synonyms\",\n    \"named\": true,\n    \"fields\": {},\n    \"children\": {\n      \"multiple\": true,\n      \"required\": false,\n      \"types\": [\n        {\n          \"type\": \"constructor_synonym\",\n          \"named\": true\n        }\n      ]\n    }\n  },\n  {\n    \"type\": \"context\",\n    \"named\": true,\n    \"fields\": {\n      \"arrow\": {\n        \"multiple\": false,\n        \"required\": true,\n        \"types\": [\n          {\n            \"type\": \"=>\",\n            \"named\": false\n          },\n          {\n            \"type\": \"⇒\",\n            \"named\": false\n          }\n        ]\n      },\n      \"constraint\": {\n        \"multiple\": false,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"constraints\",\n            \"named\": true\n          }\n        ]\n      },\n      \"context\": {\n        \"multiple\": false,\n        \"required\": true,\n        \"types\": [\n          {\n            \"type\": \"constraint\",\n            \"named\": true\n          }\n        ]\n      },\n      \"type\": {\n        \"multiple\": false,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"quantified_type\",\n            \"named\": true\n          }\n        ]\n      }\n    }\n  },\n  {\n    \"type\": \"data_constructor\",\n    \"named\": true,\n    \"fields\": {\n      \"constructor\": {\n        \"multiple\": false,\n        \"required\": true,\n        \"types\": [\n          {\n            \"type\": \"infix\",\n            \"named\": true\n          },\n          {\n            \"type\": \"prefix\",\n            \"named\": true\n          },\n          {\n            \"type\": \"record\",\n            \"named\": true\n          },\n          {\n            \"type\": \"special\",\n            \"named\": true\n          }\n        ]\n      },\n      \"context\": {\n        \"multiple\": false,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"context\",\n            \"named\": true\n          }\n        ]\n      },\n      \"forall\": {\n        \"multiple\": false,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"forall\",\n            \"named\": true\n          },\n          {\n            \"type\": \"forall_required\",\n            \"named\": true\n          }\n        ]\n      }\n    }\n  },\n  {\n    \"type\": \"data_constructors\",\n    \"named\": true,\n    \"fields\": {\n      \"constructor\": {\n        \"multiple\": true,\n        \"required\": true,\n        \"types\": [\n          {\n            \"type\": \"data_constructor\",\n            \"named\": true\n          }\n        ]\n      }\n    }\n  },\n  {\n    \"type\": \"data_family\",\n    \"named\": true,\n    \"fields\": {\n      \"kind\": {\n        \"multiple\": false,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"quantified_type\",\n            \"named\": true\n          }\n        ]\n      },\n      \"name\": {\n        \"multiple\": false,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"name\",\n            \"named\": true\n          },\n          {\n            \"type\": \"prefix_id\",\n            \"named\": true\n          },\n          {\n            \"type\": \"prefix_list\",\n            \"named\": true\n          },\n          {\n            \"type\": \"unit\",\n            \"named\": true\n          }\n        ]\n      },\n      \"patterns\": {\n        \"multiple\": false,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"type_params\",\n            \"named\": true\n          }\n        ]\n      }\n    },\n    \"children\": {\n      \"multiple\": false,\n      \"required\": false,\n      \"types\": [\n        {\n          \"type\": \"infix\",\n          \"named\": true\n        },\n        {\n          \"type\": \"parens\",\n          \"named\": true\n        }\n      ]\n    }\n  },\n  {\n    \"type\": \"data_instance\",\n    \"named\": true,\n    \"fields\": {},\n    \"children\": {\n      \"multiple\": false,\n      \"required\": true,\n      \"types\": [\n        {\n          \"type\": \"data_type\",\n          \"named\": true\n        },\n        {\n          \"type\": \"newtype\",\n          \"named\": true\n        }\n      ]\n    }\n  },\n  {\n    \"type\": \"data_type\",\n    \"named\": true,\n    \"fields\": {\n      \"constructors\": {\n        \"multiple\": false,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"data_constructors\",\n            \"named\": true\n          },\n          {\n            \"type\": \"gadt_constructors\",\n            \"named\": true\n          }\n        ]\n      },\n      \"context\": {\n        \"multiple\": false,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"context\",\n            \"named\": true\n          }\n        ]\n      },\n      \"deriving\": {\n        \"multiple\": true,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"deriving\",\n            \"named\": true\n          }\n        ]\n      },\n      \"forall\": {\n        \"multiple\": false,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"forall\",\n            \"named\": true\n          },\n          {\n            \"type\": \"forall_required\",\n            \"named\": true\n          }\n        ]\n      },\n      \"kind\": {\n        \"multiple\": false,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"quantified_type\",\n            \"named\": true\n          }\n        ]\n      },\n      \"name\": {\n        \"multiple\": false,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"name\",\n            \"named\": true\n          },\n          {\n            \"type\": \"prefix_id\",\n            \"named\": true\n          },\n          {\n            \"type\": \"prefix_list\",\n            \"named\": true\n          },\n          {\n            \"type\": \"qualified\",\n            \"named\": true\n          },\n          {\n            \"type\": \"unit\",\n            \"named\": true\n          }\n        ]\n      },\n      \"patterns\": {\n        \"multiple\": false,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"type_params\",\n            \"named\": true\n          },\n          {\n            \"type\": \"type_patterns\",\n            \"named\": true\n          }\n        ]\n      }\n    },\n    \"children\": {\n      \"multiple\": false,\n      \"required\": false,\n      \"types\": [\n        {\n          \"type\": \"infix\",\n          \"named\": true\n        },\n        {\n          \"type\": \"parens\",\n          \"named\": true\n        }\n      ]\n    }\n  },\n  {\n    \"type\": \"declarations\",\n    \"named\": true,\n    \"fields\": {},\n    \"children\": {\n      \"multiple\": true,\n      \"required\": true,\n      \"types\": [\n        {\n          \"type\": \"declaration\",\n          \"named\": true\n        },\n        {\n          \"type\": \"import\",\n          \"named\": true\n        }\n      ]\n    }\n  },\n  {\n    \"type\": \"default_signature\",\n    \"named\": true,\n    \"fields\": {\n      \"signature\": {\n        \"multiple\": false,\n        \"required\": true,\n        \"types\": [\n          {\n            \"type\": \"signature\",\n            \"named\": true\n          }\n        ]\n      }\n    }\n  },\n  {\n    \"type\": \"default_types\",\n    \"named\": true,\n    \"fields\": {\n      \"type\": {\n        \"multiple\": true,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"quantified_type\",\n            \"named\": true\n          },\n          {\n            \"type\": \"signature\",\n            \"named\": true\n          }\n        ]\n      }\n    }\n  },\n  {\n    \"type\": \"deriving\",\n    \"named\": true,\n    \"fields\": {\n      \"classes\": {\n        \"multiple\": false,\n        \"required\": true,\n        \"types\": [\n          {\n            \"type\": \"constraint\",\n            \"named\": true\n          }\n        ]\n      },\n      \"strategy\": {\n        \"multiple\": false,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"deriving_strategy\",\n            \"named\": true\n          }\n        ]\n      },\n      \"via\": {\n        \"multiple\": false,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"via\",\n            \"named\": true\n          }\n        ]\n      }\n    }\n  },\n  {\n    \"type\": \"deriving_instance\",\n    \"named\": true,\n    \"fields\": {\n      \"context\": {\n        \"multiple\": false,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"context\",\n            \"named\": true\n          }\n        ]\n      },\n      \"forall\": {\n        \"multiple\": false,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"forall\",\n            \"named\": true\n          },\n          {\n            \"type\": \"forall_required\",\n            \"named\": true\n          }\n        ]\n      },\n      \"name\": {\n        \"multiple\": false,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"name\",\n            \"named\": true\n          },\n          {\n            \"type\": \"prefix_id\",\n            \"named\": true\n          },\n          {\n            \"type\": \"qualified\",\n            \"named\": true\n          }\n        ]\n      },\n      \"patterns\": {\n        \"multiple\": false,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"type_patterns\",\n            \"named\": true\n          }\n        ]\n      },\n      \"strategy\": {\n        \"multiple\": false,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"deriving_strategy\",\n            \"named\": true\n          }\n        ]\n      },\n      \"via\": {\n        \"multiple\": false,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"via\",\n            \"named\": true\n          }\n        ]\n      }\n    },\n    \"children\": {\n      \"multiple\": false,\n      \"required\": false,\n      \"types\": [\n        {\n          \"type\": \"infix\",\n          \"named\": true\n        },\n        {\n          \"type\": \"parens\",\n          \"named\": true\n        }\n      ]\n    }\n  },\n  {\n    \"type\": \"deriving_strategy\",\n    \"named\": true,\n    \"fields\": {}\n  },\n  {\n    \"type\": \"do\",\n    \"named\": true,\n    \"fields\": {\n      \"statement\": {\n        \"multiple\": true,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"statement\",\n            \"named\": true\n          }\n        ]\n      }\n    },\n    \"children\": {\n      \"multiple\": false,\n      \"required\": false,\n      \"types\": [\n        {\n          \"type\": \"do_module\",\n          \"named\": true\n        }\n      ]\n    }\n  },\n  {\n    \"type\": \"do_module\",\n    \"named\": true,\n    \"fields\": {\n      \"id\": {\n        \"multiple\": false,\n        \"required\": true,\n        \"types\": [\n          {\n            \"type\": \"do\",\n            \"named\": false\n          },\n          {\n            \"type\": \"mdo\",\n            \"named\": false\n          }\n        ]\n      },\n      \"module\": {\n        \"multiple\": false,\n        \"required\": true,\n        \"types\": [\n          {\n            \"type\": \"module\",\n            \"named\": true\n          }\n        ]\n      }\n    }\n  },\n  {\n    \"type\": \"empty_list\",\n    \"named\": true,\n    \"fields\": {}\n  },\n  {\n    \"type\": \"entity\",\n    \"named\": true,\n    \"fields\": {},\n    \"children\": {\n      \"multiple\": false,\n      \"required\": true,\n      \"types\": [\n        {\n          \"type\": \"string\",\n          \"named\": true\n        }\n      ]\n    }\n  },\n  {\n    \"type\": \"equation\",\n    \"named\": true,\n    \"fields\": {\n      \"constructors\": {\n        \"multiple\": false,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"constructor_synonyms\",\n            \"named\": true\n          }\n        ]\n      },\n      \"forall\": {\n        \"multiple\": false,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"forall\",\n            \"named\": true\n          },\n          {\n            \"type\": \"forall_required\",\n            \"named\": true\n          }\n        ]\n      },\n      \"name\": {\n        \"multiple\": false,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"name\",\n            \"named\": true\n          },\n          {\n            \"type\": \"prefix_id\",\n            \"named\": true\n          },\n          {\n            \"type\": \"qualified\",\n            \"named\": true\n          }\n        ]\n      },\n      \"pattern\": {\n        \"multiple\": false,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"pattern\",\n            \"named\": true\n          },\n          {\n            \"type\": \"signature\",\n            \"named\": true\n          }\n        ]\n      },\n      \"patterns\": {\n        \"multiple\": false,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"type_patterns\",\n            \"named\": true\n          }\n        ]\n      },\n      \"synonym\": {\n        \"multiple\": false,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"pattern\",\n            \"named\": true\n          }\n        ]\n      }\n    },\n    \"children\": {\n      \"multiple\": true,\n      \"required\": false,\n      \"types\": [\n        {\n          \"type\": \"infix\",\n          \"named\": true\n        },\n        {\n          \"type\": \"parens\",\n          \"named\": true\n        },\n        {\n          \"type\": \"quantified_type\",\n          \"named\": true\n        }\n      ]\n    }\n  },\n  {\n    \"type\": \"equations\",\n    \"named\": true,\n    \"fields\": {\n      \"equation\": {\n        \"multiple\": true,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"equation\",\n            \"named\": true\n          }\n        ]\n      }\n    }\n  },\n  {\n    \"type\": \"exp\",\n    \"named\": true,\n    \"fields\": {},\n    \"children\": {\n      \"multiple\": false,\n      \"required\": true,\n      \"types\": [\n        {\n          \"type\": \"expression\",\n          \"named\": true\n        },\n        {\n          \"type\": \"signature\",\n          \"named\": true\n        }\n      ]\n    }\n  },\n  {\n    \"type\": \"explicit_type\",\n    \"named\": true,\n    \"fields\": {\n      \"type\": {\n        \"multiple\": false,\n        \"required\": true,\n        \"types\": [\n          {\n            \"type\": \"type\",\n            \"named\": true\n          }\n        ]\n      }\n    }\n  },\n  {\n    \"type\": \"export\",\n    \"named\": true,\n    \"fields\": {\n      \"children\": {\n        \"multiple\": false,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"children\",\n            \"named\": true\n          }\n        ]\n      },\n      \"namespace\": {\n        \"multiple\": false,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"namespace\",\n            \"named\": true\n          }\n        ]\n      },\n      \"operator\": {\n        \"multiple\": false,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"prefix_id\",\n            \"named\": true\n          }\n        ]\n      },\n      \"type\": {\n        \"multiple\": false,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"name\",\n            \"named\": true\n          },\n          {\n            \"type\": \"qualified\",\n            \"named\": true\n          }\n        ]\n      },\n      \"variable\": {\n        \"multiple\": false,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"qualified\",\n            \"named\": true\n          },\n          {\n            \"type\": \"variable\",\n            \"named\": true\n          }\n        ]\n      }\n    }\n  },\n  {\n    \"type\": \"exports\",\n    \"named\": true,\n    \"fields\": {\n      \"export\": {\n        \"multiple\": true,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"export\",\n            \"named\": true\n          }\n        ]\n      }\n    },\n    \"children\": {\n      \"multiple\": true,\n      \"required\": false,\n      \"types\": [\n        {\n          \"type\": \"module_export\",\n          \"named\": true\n        }\n      ]\n    }\n  },\n  {\n    \"type\": \"field\",\n    \"named\": true,\n    \"fields\": {\n      \"name\": {\n        \"multiple\": true,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"field_name\",\n            \"named\": true\n          }\n        ]\n      },\n      \"parameter\": {\n        \"multiple\": false,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"lazy_field\",\n            \"named\": true\n          },\n          {\n            \"type\": \"quantified_type\",\n            \"named\": true\n          },\n          {\n            \"type\": \"strict_field\",\n            \"named\": true\n          }\n        ]\n      },\n      \"type\": {\n        \"multiple\": false,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"lazy_field\",\n            \"named\": true\n          },\n          {\n            \"type\": \"quantified_type\",\n            \"named\": true\n          },\n          {\n            \"type\": \"strict_field\",\n            \"named\": true\n          }\n        ]\n      }\n    },\n    \"children\": {\n      \"multiple\": false,\n      \"required\": false,\n      \"types\": [\n        {\n          \"type\": \"type\",\n          \"named\": true\n        }\n      ]\n    }\n  },\n  {\n    \"type\": \"field_name\",\n    \"named\": true,\n    \"fields\": {},\n    \"children\": {\n      \"multiple\": false,\n      \"required\": true,\n      \"types\": [\n        {\n          \"type\": \"variable\",\n          \"named\": true\n        }\n      ]\n    }\n  },\n  {\n    \"type\": \"field_path\",\n    \"named\": true,\n    \"fields\": {\n      \"field\": {\n        \"multiple\": false,\n        \"required\": true,\n        \"types\": [\n          {\n            \"type\": \"field_name\",\n            \"named\": true\n          },\n          {\n            \"type\": \"qualified\",\n            \"named\": true\n          }\n        ]\n      },\n      \"subfield\": {\n        \"multiple\": true,\n        \"required\": true,\n        \"types\": [\n          {\n            \"type\": \"field_name\",\n            \"named\": true\n          }\n        ]\n      }\n    }\n  },\n  {\n    \"type\": \"field_pattern\",\n    \"named\": true,\n    \"fields\": {\n      \"field\": {\n        \"multiple\": false,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"field_name\",\n            \"named\": true\n          },\n          {\n            \"type\": \"qualified\",\n            \"named\": true\n          }\n        ]\n      },\n      \"pattern\": {\n        \"multiple\": false,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"pattern\",\n            \"named\": true\n          },\n          {\n            \"type\": \"signature\",\n            \"named\": true\n          },\n          {\n            \"type\": \"view_pattern\",\n            \"named\": true\n          }\n        ]\n      }\n    },\n    \"children\": {\n      \"multiple\": false,\n      \"required\": false,\n      \"types\": [\n        {\n          \"type\": \"wildcard\",\n          \"named\": true\n        }\n      ]\n    }\n  },\n  {\n    \"type\": \"field_update\",\n    \"named\": true,\n    \"fields\": {\n      \"expression\": {\n        \"multiple\": false,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"expression\",\n            \"named\": true\n          },\n          {\n            \"type\": \"signature\",\n            \"named\": true\n          }\n        ]\n      },\n      \"field\": {\n        \"multiple\": false,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"field_name\",\n            \"named\": true\n          },\n          {\n            \"type\": \"field_path\",\n            \"named\": true\n          },\n          {\n            \"type\": \"qualified\",\n            \"named\": true\n          }\n        ]\n      }\n    },\n    \"children\": {\n      \"multiple\": false,\n      \"required\": false,\n      \"types\": [\n        {\n          \"type\": \"wildcard\",\n          \"named\": true\n        }\n      ]\n    }\n  },\n  {\n    \"type\": \"fields\",\n    \"named\": true,\n    \"fields\": {\n      \"field\": {\n        \"multiple\": true,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"field\",\n            \"named\": true\n          }\n        ]\n      }\n    }\n  },\n  {\n    \"type\": \"fixity\",\n    \"named\": true,\n    \"fields\": {\n      \"associativity\": {\n        \"multiple\": false,\n        \"required\": true,\n        \"types\": [\n          {\n            \"type\": \"infix\",\n            \"named\": false\n          },\n          {\n            \"type\": \"infixl\",\n            \"named\": false\n          },\n          {\n            \"type\": \"infixr\",\n            \"named\": false\n          }\n        ]\n      },\n      \"operator\": {\n        \"multiple\": true,\n        \"required\": true,\n        \"types\": [\n          {\n            \"type\": \",\",\n            \"named\": false\n          },\n          {\n            \"type\": \"constructor_operator\",\n            \"named\": true\n          },\n          {\n            \"type\": \"infix_id\",\n            \"named\": true\n          },\n          {\n            \"type\": \"operator\",\n            \"named\": true\n          }\n        ]\n      },\n      \"precedence\": {\n        \"multiple\": false,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"integer\",\n            \"named\": true\n          }\n        ]\n      }\n    }\n  },\n  {\n    \"type\": \"forall\",\n    \"named\": true,\n    \"fields\": {\n      \"constraint\": {\n        \"multiple\": false,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"constraints\",\n            \"named\": true\n          }\n        ]\n      },\n      \"quantifier\": {\n        \"multiple\": false,\n        \"required\": true,\n        \"types\": [\n          {\n            \"type\": \"forall\",\n            \"named\": false\n          },\n          {\n            \"type\": \"∀\",\n            \"named\": false\n          }\n        ]\n      },\n      \"type\": {\n        \"multiple\": false,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"quantified_type\",\n            \"named\": true\n          }\n        ]\n      },\n      \"variables\": {\n        \"multiple\": false,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"quantified_variables\",\n            \"named\": true\n          }\n        ]\n      }\n    }\n  },\n  {\n    \"type\": \"forall_required\",\n    \"named\": true,\n    \"fields\": {\n      \"quantifier\": {\n        \"multiple\": false,\n        \"required\": true,\n        \"types\": [\n          {\n            \"type\": \"forall\",\n            \"named\": false\n          },\n          {\n            \"type\": \"∀\",\n            \"named\": false\n          }\n        ]\n      },\n      \"type\": {\n        \"multiple\": false,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"quantified_type\",\n            \"named\": true\n          }\n        ]\n      },\n      \"variables\": {\n        \"multiple\": false,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"quantified_variables\",\n            \"named\": true\n          }\n        ]\n      }\n    }\n  },\n  {\n    \"type\": \"foreign_export\",\n    \"named\": true,\n    \"fields\": {\n      \"calling_convention\": {\n        \"multiple\": false,\n        \"required\": true,\n        \"types\": [\n          {\n            \"type\": \"calling_convention\",\n            \"named\": true\n          }\n        ]\n      },\n      \"entity\": {\n        \"multiple\": false,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"entity\",\n            \"named\": true\n          }\n        ]\n      },\n      \"signature\": {\n        \"multiple\": false,\n        \"required\": true,\n        \"types\": [\n          {\n            \"type\": \"signature\",\n            \"named\": true\n          }\n        ]\n      }\n    }\n  },\n  {\n    \"type\": \"foreign_import\",\n    \"named\": true,\n    \"fields\": {\n      \"calling_convention\": {\n        \"multiple\": false,\n        \"required\": true,\n        \"types\": [\n          {\n            \"type\": \"calling_convention\",\n            \"named\": true\n          }\n        ]\n      },\n      \"entity\": {\n        \"multiple\": false,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"entity\",\n            \"named\": true\n          }\n        ]\n      },\n      \"safety\": {\n        \"multiple\": false,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"safety\",\n            \"named\": true\n          }\n        ]\n      },\n      \"signature\": {\n        \"multiple\": false,\n        \"required\": true,\n        \"types\": [\n          {\n            \"type\": \"signature\",\n            \"named\": true\n          }\n        ]\n      }\n    }\n  },\n  {\n    \"type\": \"function\",\n    \"named\": true,\n    \"fields\": {\n      \"arrow\": {\n        \"multiple\": false,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"->\",\n            \"named\": false\n          },\n          {\n            \"type\": \"→\",\n            \"named\": false\n          }\n        ]\n      },\n      \"binds\": {\n        \"multiple\": false,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"local_binds\",\n            \"named\": true\n          }\n        ]\n      },\n      \"match\": {\n        \"multiple\": true,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"match\",\n            \"named\": true\n          }\n        ]\n      },\n      \"name\": {\n        \"multiple\": false,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"prefix_id\",\n            \"named\": true\n          },\n          {\n            \"type\": \"variable\",\n            \"named\": true\n          }\n        ]\n      },\n      \"parameter\": {\n        \"multiple\": false,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"lazy_field\",\n            \"named\": true\n          },\n          {\n            \"type\": \"quantified_type\",\n            \"named\": true\n          },\n          {\n            \"type\": \"strict_field\",\n            \"named\": true\n          }\n        ]\n      },\n      \"parens\": {\n        \"multiple\": false,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"function_head_parens\",\n            \"named\": true\n          }\n        ]\n      },\n      \"patterns\": {\n        \"multiple\": false,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"patterns\",\n            \"named\": true\n          }\n        ]\n      },\n      \"result\": {\n        \"multiple\": false,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"quantified_type\",\n            \"named\": true\n          }\n        ]\n      }\n    },\n    \"children\": {\n      \"multiple\": false,\n      \"required\": false,\n      \"types\": [\n        {\n          \"type\": \"infix\",\n          \"named\": true\n        }\n      ]\n    }\n  },\n  {\n    \"type\": \"function_head_parens\",\n    \"named\": true,\n    \"fields\": {\n      \"name\": {\n        \"multiple\": false,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"prefix_id\",\n            \"named\": true\n          },\n          {\n            \"type\": \"variable\",\n            \"named\": true\n          }\n        ]\n      },\n      \"parens\": {\n        \"multiple\": false,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"function_head_parens\",\n            \"named\": true\n          }\n        ]\n      },\n      \"patterns\": {\n        \"multiple\": false,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"patterns\",\n            \"named\": true\n          }\n        ]\n      }\n    },\n    \"children\": {\n      \"multiple\": false,\n      \"required\": false,\n      \"types\": [\n        {\n          \"type\": \"infix\",\n          \"named\": true\n        }\n      ]\n    }\n  },\n  {\n    \"type\": \"fundep\",\n    \"named\": true,\n    \"fields\": {\n      \"determined\": {\n        \"multiple\": true,\n        \"required\": true,\n        \"types\": [\n          {\n            \"type\": \"variable\",\n            \"named\": true\n          }\n        ]\n      },\n      \"matched\": {\n        \"multiple\": true,\n        \"required\": true,\n        \"types\": [\n          {\n            \"type\": \"variable\",\n            \"named\": true\n          }\n        ]\n      }\n    }\n  },\n  {\n    \"type\": \"fundeps\",\n    \"named\": true,\n    \"fields\": {\n      \"fundep\": {\n        \"multiple\": true,\n        \"required\": true,\n        \"types\": [\n          {\n            \"type\": \"fundep\",\n            \"named\": true\n          }\n        ]\n      }\n    }\n  },\n  {\n    \"type\": \"gadt_constructor\",\n    \"named\": true,\n    \"fields\": {\n      \"context\": {\n        \"multiple\": false,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"context\",\n            \"named\": true\n          }\n        ]\n      },\n      \"forall\": {\n        \"multiple\": false,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"forall\",\n            \"named\": true\n          },\n          {\n            \"type\": \"forall_required\",\n            \"named\": true\n          }\n        ]\n      },\n      \"name\": {\n        \"multiple\": false,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"constructor\",\n            \"named\": true\n          },\n          {\n            \"type\": \"prefix_id\",\n            \"named\": true\n          }\n        ]\n      },\n      \"names\": {\n        \"multiple\": false,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"binding_list\",\n            \"named\": true\n          }\n        ]\n      },\n      \"type\": {\n        \"multiple\": false,\n        \"required\": true,\n        \"types\": [\n          {\n            \"type\": \"prefix\",\n            \"named\": true\n          },\n          {\n            \"type\": \"record\",\n            \"named\": true\n          }\n        ]\n      }\n    }\n  },\n  {\n    \"type\": \"gadt_constructors\",\n    \"named\": true,\n    \"fields\": {\n      \"constructor\": {\n        \"multiple\": true,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"gadt_constructor\",\n            \"named\": true\n          }\n        ]\n      }\n    }\n  },\n  {\n    \"type\": \"generator\",\n    \"named\": true,\n    \"fields\": {\n      \"arrow\": {\n        \"multiple\": false,\n        \"required\": true,\n        \"types\": [\n          {\n            \"type\": \"<-\",\n            \"named\": false\n          },\n          {\n            \"type\": \"←\",\n            \"named\": false\n          }\n        ]\n      },\n      \"expression\": {\n        \"multiple\": false,\n        \"required\": true,\n        \"types\": [\n          {\n            \"type\": \"expression\",\n            \"named\": true\n          },\n          {\n            \"type\": \"signature\",\n            \"named\": true\n          }\n        ]\n      },\n      \"pattern\": {\n        \"multiple\": false,\n        \"required\": true,\n        \"types\": [\n          {\n            \"type\": \"pattern\",\n            \"named\": true\n          },\n          {\n            \"type\": \"signature\",\n            \"named\": true\n          }\n        ]\n      }\n    }\n  },\n  {\n    \"type\": \"group\",\n    \"named\": true,\n    \"fields\": {\n      \"classifier\": {\n        \"multiple\": false,\n        \"required\": true,\n        \"types\": [\n          {\n            \"type\": \"expression\",\n            \"named\": true\n          },\n          {\n            \"type\": \"signature\",\n            \"named\": true\n          }\n        ]\n      },\n      \"key\": {\n        \"multiple\": false,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"expression\",\n            \"named\": true\n          },\n          {\n            \"type\": \"signature\",\n            \"named\": true\n          }\n        ]\n      }\n    }\n  },\n  {\n    \"type\": \"guards\",\n    \"named\": true,\n    \"fields\": {\n      \"guard\": {\n        \"multiple\": true,\n        \"required\": true,\n        \"types\": [\n          {\n            \"type\": \"guard\",\n            \"named\": true\n          }\n        ]\n      }\n    }\n  },\n  {\n    \"type\": \"haskell\",\n    \"named\": true,\n    \"root\": true,\n    \"fields\": {\n      \"declarations\": {\n        \"multiple\": false,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"declarations\",\n            \"named\": true\n          }\n        ]\n      },\n      \"imports\": {\n        \"multiple\": false,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"imports\",\n            \"named\": true\n          }\n        ]\n      }\n    },\n    \"children\": {\n      \"multiple\": false,\n      \"required\": false,\n      \"types\": [\n        {\n          \"type\": \"header\",\n          \"named\": true\n        }\n      ]\n    }\n  },\n  {\n    \"type\": \"header\",\n    \"named\": true,\n    \"fields\": {\n      \"exports\": {\n        \"multiple\": false,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"exports\",\n            \"named\": true\n          }\n        ]\n      },\n      \"module\": {\n        \"multiple\": false,\n        \"required\": true,\n        \"types\": [\n          {\n            \"type\": \"module\",\n            \"named\": true\n          }\n        ]\n      }\n    }\n  },\n  {\n    \"type\": \"implicit_parameter\",\n    \"named\": true,\n    \"fields\": {\n      \"name\": {\n        \"multiple\": false,\n        \"required\": true,\n        \"types\": [\n          {\n            \"type\": \"implicit_variable\",\n            \"named\": true\n          }\n        ]\n      },\n      \"type\": {\n        \"multiple\": false,\n        \"required\": true,\n        \"types\": [\n          {\n            \"type\": \"quantified_type\",\n            \"named\": true\n          }\n        ]\n      }\n    }\n  },\n  {\n    \"type\": \"import\",\n    \"named\": true,\n    \"fields\": {\n      \"alias\": {\n        \"multiple\": false,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"module\",\n            \"named\": true\n          }\n        ]\n      },\n      \"module\": {\n        \"multiple\": false,\n        \"required\": true,\n        \"types\": [\n          {\n            \"type\": \"module\",\n            \"named\": true\n          }\n        ]\n      },\n      \"names\": {\n        \"multiple\": false,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"import_list\",\n            \"named\": true\n          }\n        ]\n      },\n      \"package\": {\n        \"multiple\": false,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"import_package\",\n            \"named\": true\n          }\n        ]\n      }\n    }\n  },\n  {\n    \"type\": \"import_list\",\n    \"named\": true,\n    \"fields\": {\n      \"name\": {\n        \"multiple\": true,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"import_name\",\n            \"named\": true\n          }\n        ]\n      }\n    }\n  },\n  {\n    \"type\": \"import_name\",\n    \"named\": true,\n    \"fields\": {\n      \"children\": {\n        \"multiple\": false,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"children\",\n            \"named\": true\n          }\n        ]\n      },\n      \"namespace\": {\n        \"multiple\": false,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"namespace\",\n            \"named\": true\n          }\n        ]\n      },\n      \"operator\": {\n        \"multiple\": false,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"prefix_id\",\n            \"named\": true\n          }\n        ]\n      },\n      \"type\": {\n        \"multiple\": false,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"name\",\n            \"named\": true\n          },\n          {\n            \"type\": \"qualified\",\n            \"named\": true\n          }\n        ]\n      },\n      \"variable\": {\n        \"multiple\": false,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"qualified\",\n            \"named\": true\n          },\n          {\n            \"type\": \"variable\",\n            \"named\": true\n          }\n        ]\n      }\n    }\n  },\n  {\n    \"type\": \"imports\",\n    \"named\": true,\n    \"fields\": {\n      \"import\": {\n        \"multiple\": true,\n        \"required\": true,\n        \"types\": [\n          {\n            \"type\": \"import\",\n            \"named\": true\n          }\n        ]\n      }\n    }\n  },\n  {\n    \"type\": \"inferred\",\n    \"named\": true,\n    \"fields\": {},\n    \"children\": {\n      \"multiple\": false,\n      \"required\": true,\n      \"types\": [\n        {\n          \"type\": \"annotated\",\n          \"named\": true\n        },\n        {\n          \"type\": \"type_param\",\n          \"named\": true\n        }\n      ]\n    }\n  },\n  {\n    \"type\": \"infix\",\n    \"named\": true,\n    \"fields\": {\n      \"left_operand\": {\n        \"multiple\": false,\n        \"required\": true,\n        \"types\": [\n          {\n            \"type\": \"expression\",\n            \"named\": true\n          },\n          {\n            \"type\": \"lazy_field\",\n            \"named\": true\n          },\n          {\n            \"type\": \"pattern\",\n            \"named\": true\n          },\n          {\n            \"type\": \"strict_field\",\n            \"named\": true\n          },\n          {\n            \"type\": \"type\",\n            \"named\": true\n          },\n          {\n            \"type\": \"type_param\",\n            \"named\": true\n          }\n        ]\n      },\n      \"operator\": {\n        \"multiple\": true,\n        \"required\": true,\n        \"types\": [\n          {\n            \"type\": \"constructor_operator\",\n            \"named\": true\n          },\n          {\n            \"type\": \"infix_id\",\n            \"named\": true\n          },\n          {\n            \"type\": \"operator\",\n            \"named\": true\n          },\n          {\n            \"type\": \"promoted\",\n            \"named\": true\n          },\n          {\n            \"type\": \"qualified\",\n            \"named\": true\n          }\n        ]\n      },\n      \"right_operand\": {\n        \"multiple\": false,\n        \"required\": true,\n        \"types\": [\n          {\n            \"type\": \"expression\",\n            \"named\": true\n          },\n          {\n            \"type\": \"lazy_field\",\n            \"named\": true\n          },\n          {\n            \"type\": \"pattern\",\n            \"named\": true\n          },\n          {\n            \"type\": \"strict_field\",\n            \"named\": true\n          },\n          {\n            \"type\": \"type\",\n            \"named\": true\n          },\n          {\n            \"type\": \"type_param\",\n            \"named\": true\n          }\n        ]\n      }\n    }\n  },\n  {\n    \"type\": \"infix_id\",\n    \"named\": true,\n    \"fields\": {},\n    \"children\": {\n      \"multiple\": false,\n      \"required\": true,\n      \"types\": [\n        {\n          \"type\": \"constructor\",\n          \"named\": true\n        },\n        {\n          \"type\": \"name\",\n          \"named\": true\n        },\n        {\n          \"type\": \"qualified\",\n          \"named\": true\n        },\n        {\n          \"type\": \"variable\",\n          \"named\": true\n        }\n      ]\n    }\n  },\n  {\n    \"type\": \"instance\",\n    \"named\": true,\n    \"fields\": {\n      \"context\": {\n        \"multiple\": false,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"context\",\n            \"named\": true\n          }\n        ]\n      },\n      \"declarations\": {\n        \"multiple\": false,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"instance_declarations\",\n            \"named\": true\n          }\n        ]\n      },\n      \"forall\": {\n        \"multiple\": false,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"forall\",\n            \"named\": true\n          },\n          {\n            \"type\": \"forall_required\",\n            \"named\": true\n          }\n        ]\n      },\n      \"name\": {\n        \"multiple\": false,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"name\",\n            \"named\": true\n          },\n          {\n            \"type\": \"prefix_id\",\n            \"named\": true\n          },\n          {\n            \"type\": \"qualified\",\n            \"named\": true\n          }\n        ]\n      },\n      \"patterns\": {\n        \"multiple\": false,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"type_patterns\",\n            \"named\": true\n          }\n        ]\n      }\n    },\n    \"children\": {\n      \"multiple\": false,\n      \"required\": false,\n      \"types\": [\n        {\n          \"type\": \"infix\",\n          \"named\": true\n        },\n        {\n          \"type\": \"parens\",\n          \"named\": true\n        }\n      ]\n    }\n  },\n  {\n    \"type\": \"instance_declarations\",\n    \"named\": true,\n    \"fields\": {\n      \"declaration\": {\n        \"multiple\": true,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"instance_decl\",\n            \"named\": true\n          }\n        ]\n      }\n    }\n  },\n  {\n    \"type\": \"integer\",\n    \"named\": true,\n    \"fields\": {}\n  },\n  {\n    \"type\": \"invisible\",\n    \"named\": true,\n    \"fields\": {\n      \"bind\": {\n        \"multiple\": false,\n        \"required\": true,\n        \"types\": [\n          {\n            \"type\": \"type_param\",\n            \"named\": true\n          }\n        ]\n      }\n    }\n  },\n  {\n    \"type\": \"irrefutable\",\n    \"named\": true,\n    \"fields\": {\n      \"pattern\": {\n        \"multiple\": false,\n        \"required\": true,\n        \"types\": [\n          {\n            \"type\": \"pattern\",\n            \"named\": true\n          }\n        ]\n      }\n    }\n  },\n  {\n    \"type\": \"kind_application\",\n    \"named\": true,\n    \"fields\": {\n      \"type\": {\n        \"multiple\": false,\n        \"required\": true,\n        \"types\": [\n          {\n            \"type\": \"type\",\n            \"named\": true\n          }\n        ]\n      }\n    }\n  },\n  {\n    \"type\": \"kind_signature\",\n    \"named\": true,\n    \"fields\": {\n      \"kind\": {\n        \"multiple\": false,\n        \"required\": true,\n        \"types\": [\n          {\n            \"type\": \"quantified_type\",\n            \"named\": true\n          }\n        ]\n      },\n      \"name\": {\n        \"multiple\": false,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"name\",\n            \"named\": true\n          },\n          {\n            \"type\": \"prefix_id\",\n            \"named\": true\n          },\n          {\n            \"type\": \"prefix_list\",\n            \"named\": true\n          },\n          {\n            \"type\": \"unit\",\n            \"named\": true\n          }\n        ]\n      },\n      \"patterns\": {\n        \"multiple\": false,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"type_params\",\n            \"named\": true\n          }\n        ]\n      }\n    },\n    \"children\": {\n      \"multiple\": false,\n      \"required\": false,\n      \"types\": [\n        {\n          \"type\": \"infix\",\n          \"named\": true\n        },\n        {\n          \"type\": \"parens\",\n          \"named\": true\n        }\n      ]\n    }\n  },\n  {\n    \"type\": \"lambda\",\n    \"named\": true,\n    \"fields\": {\n      \"expression\": {\n        \"multiple\": false,\n        \"required\": true,\n        \"types\": [\n          {\n            \"type\": \"expression\",\n            \"named\": true\n          },\n          {\n            \"type\": \"signature\",\n            \"named\": true\n          }\n        ]\n      },\n      \"patterns\": {\n        \"multiple\": false,\n        \"required\": true,\n        \"types\": [\n          {\n            \"type\": \"patterns\",\n            \"named\": true\n          }\n        ]\n      }\n    }\n  },\n  {\n    \"type\": \"lambda_case\",\n    \"named\": true,\n    \"fields\": {\n      \"alternatives\": {\n        \"multiple\": false,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"alternatives\",\n            \"named\": true\n          }\n        ]\n      }\n    }\n  },\n  {\n    \"type\": \"lambda_cases\",\n    \"named\": true,\n    \"fields\": {\n      \"alternatives\": {\n        \"multiple\": false,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"alternatives\",\n            \"named\": true\n          }\n        ]\n      }\n    }\n  },\n  {\n    \"type\": \"lazy_field\",\n    \"named\": true,\n    \"fields\": {\n      \"type\": {\n        \"multiple\": false,\n        \"required\": true,\n        \"types\": [\n          {\n            \"type\": \"type\",\n            \"named\": true\n          }\n        ]\n      }\n    }\n  },\n  {\n    \"type\": \"left_section\",\n    \"named\": true,\n    \"fields\": {\n      \"left_operand\": {\n        \"multiple\": false,\n        \"required\": true,\n        \"types\": [\n          {\n            \"type\": \"expression\",\n            \"named\": true\n          }\n        ]\n      },\n      \"operator\": {\n        \"multiple\": false,\n        \"required\": true,\n        \"types\": [\n          {\n            \"type\": \"constructor_operator\",\n            \"named\": true\n          },\n          {\n            \"type\": \"infix_id\",\n            \"named\": true\n          },\n          {\n            \"type\": \"operator\",\n            \"named\": true\n          },\n          {\n            \"type\": \"qualified\",\n            \"named\": true\n          }\n        ]\n      }\n    }\n  },\n  {\n    \"type\": \"let\",\n    \"named\": true,\n    \"fields\": {\n      \"binds\": {\n        \"multiple\": false,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"local_binds\",\n            \"named\": true\n          }\n        ]\n      }\n    }\n  },\n  {\n    \"type\": \"let_in\",\n    \"named\": true,\n    \"fields\": {\n      \"binds\": {\n        \"multiple\": false,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"local_binds\",\n            \"named\": true\n          }\n        ]\n      },\n      \"expression\": {\n        \"multiple\": false,\n        \"required\": true,\n        \"types\": [\n          {\n            \"type\": \"expression\",\n            \"named\": true\n          },\n          {\n            \"type\": \"signature\",\n            \"named\": true\n          }\n        ]\n      }\n    }\n  },\n  {\n    \"type\": \"linear_function\",\n    \"named\": true,\n    \"fields\": {\n      \"arrow\": {\n        \"multiple\": false,\n        \"required\": true,\n        \"types\": [\n          {\n            \"type\": \"->\",\n            \"named\": false\n          },\n          {\n            \"type\": \"->.\",\n            \"named\": false\n          },\n          {\n            \"type\": \"→\",\n            \"named\": false\n          },\n          {\n            \"type\": \"⊸\",\n            \"named\": false\n          }\n        ]\n      },\n      \"multiplicity\": {\n        \"multiple\": false,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"modifier\",\n            \"named\": true\n          }\n        ]\n      },\n      \"parameter\": {\n        \"multiple\": false,\n        \"required\": true,\n        \"types\": [\n          {\n            \"type\": \"lazy_field\",\n            \"named\": true\n          },\n          {\n            \"type\": \"quantified_type\",\n            \"named\": true\n          },\n          {\n            \"type\": \"strict_field\",\n            \"named\": true\n          }\n        ]\n      },\n      \"result\": {\n        \"multiple\": false,\n        \"required\": true,\n        \"types\": [\n          {\n            \"type\": \"quantified_type\",\n            \"named\": true\n          }\n        ]\n      }\n    }\n  },\n  {\n    \"type\": \"list\",\n    \"named\": true,\n    \"fields\": {\n      \"element\": {\n        \"multiple\": true,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"expression\",\n            \"named\": true\n          },\n          {\n            \"type\": \"pattern\",\n            \"named\": true\n          },\n          {\n            \"type\": \"quantified_type\",\n            \"named\": true\n          },\n          {\n            \"type\": \"signature\",\n            \"named\": true\n          },\n          {\n            \"type\": \"view_pattern\",\n            \"named\": true\n          }\n        ]\n      }\n    }\n  },\n  {\n    \"type\": \"list_comprehension\",\n    \"named\": true,\n    \"fields\": {\n      \"expression\": {\n        \"multiple\": false,\n        \"required\": true,\n        \"types\": [\n          {\n            \"type\": \"expression\",\n            \"named\": true\n          },\n          {\n            \"type\": \"signature\",\n            \"named\": true\n          }\n        ]\n      },\n      \"qualifiers\": {\n        \"multiple\": true,\n        \"required\": true,\n        \"types\": [\n          {\n            \"type\": \"qualifiers\",\n            \"named\": true\n          }\n        ]\n      }\n    }\n  },\n  {\n    \"type\": \"literal\",\n    \"named\": true,\n    \"fields\": {},\n    \"children\": {\n      \"multiple\": false,\n      \"required\": true,\n      \"types\": [\n        {\n          \"type\": \"char\",\n          \"named\": true\n        },\n        {\n          \"type\": \"float\",\n          \"named\": true\n        },\n        {\n          \"type\": \"integer\",\n          \"named\": true\n        },\n        {\n          \"type\": \"string\",\n          \"named\": true\n        }\n      ]\n    }\n  },\n  {\n    \"type\": \"local_binds\",\n    \"named\": true,\n    \"fields\": {\n      \"decl\": {\n        \"multiple\": true,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"decl\",\n            \"named\": true\n          },\n          {\n            \"type\": \"fixity\",\n            \"named\": true\n          }\n        ]\n      }\n    }\n  },\n  {\n    \"type\": \"match\",\n    \"named\": true,\n    \"fields\": {\n      \"expression\": {\n        \"multiple\": false,\n        \"required\": true,\n        \"types\": [\n          {\n            \"type\": \"expression\",\n            \"named\": true\n          },\n          {\n            \"type\": \"signature\",\n            \"named\": true\n          }\n        ]\n      },\n      \"guards\": {\n        \"multiple\": false,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"guards\",\n            \"named\": true\n          }\n        ]\n      }\n    }\n  },\n  {\n    \"type\": \"modifier\",\n    \"named\": true,\n    \"fields\": {},\n    \"children\": {\n      \"multiple\": false,\n      \"required\": true,\n      \"types\": [\n        {\n          \"type\": \"type\",\n          \"named\": true\n        }\n      ]\n    }\n  },\n  {\n    \"type\": \"module\",\n    \"named\": true,\n    \"fields\": {},\n    \"children\": {\n      \"multiple\": true,\n      \"required\": true,\n      \"types\": [\n        {\n          \"type\": \"module_id\",\n          \"named\": true\n        }\n      ]\n    }\n  },\n  {\n    \"type\": \"module_export\",\n    \"named\": true,\n    \"fields\": {\n      \"module\": {\n        \"multiple\": false,\n        \"required\": true,\n        \"types\": [\n          {\n            \"type\": \"module\",\n            \"named\": true\n          }\n        ]\n      }\n    }\n  },\n  {\n    \"type\": \"multi_way_if\",\n    \"named\": true,\n    \"fields\": {\n      \"match\": {\n        \"multiple\": true,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"match\",\n            \"named\": true\n          }\n        ]\n      }\n    }\n  },\n  {\n    \"type\": \"namespace\",\n    \"named\": true,\n    \"fields\": {}\n  },\n  {\n    \"type\": \"negation\",\n    \"named\": true,\n    \"fields\": {\n      \"expression\": {\n        \"multiple\": false,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"expression\",\n            \"named\": true\n          }\n        ]\n      },\n      \"minus\": {\n        \"multiple\": false,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"-\",\n            \"named\": false\n          }\n        ]\n      },\n      \"number\": {\n        \"multiple\": false,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"float\",\n            \"named\": true\n          },\n          {\n            \"type\": \"integer\",\n            \"named\": true\n          }\n        ]\n      }\n    }\n  },\n  {\n    \"type\": \"newtype\",\n    \"named\": true,\n    \"fields\": {\n      \"constructor\": {\n        \"multiple\": false,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"newtype_constructor\",\n            \"named\": true\n          }\n        ]\n      },\n      \"constructors\": {\n        \"multiple\": false,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"gadt_constructors\",\n            \"named\": true\n          }\n        ]\n      },\n      \"context\": {\n        \"multiple\": false,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"context\",\n            \"named\": true\n          }\n        ]\n      },\n      \"deriving\": {\n        \"multiple\": true,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"deriving\",\n            \"named\": true\n          }\n        ]\n      },\n      \"forall\": {\n        \"multiple\": false,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"forall\",\n            \"named\": true\n          },\n          {\n            \"type\": \"forall_required\",\n            \"named\": true\n          }\n        ]\n      },\n      \"kind\": {\n        \"multiple\": false,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"quantified_type\",\n            \"named\": true\n          }\n        ]\n      },\n      \"name\": {\n        \"multiple\": false,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"name\",\n            \"named\": true\n          },\n          {\n            \"type\": \"prefix_id\",\n            \"named\": true\n          },\n          {\n            \"type\": \"prefix_list\",\n            \"named\": true\n          },\n          {\n            \"type\": \"qualified\",\n            \"named\": true\n          },\n          {\n            \"type\": \"unit\",\n            \"named\": true\n          }\n        ]\n      },\n      \"patterns\": {\n        \"multiple\": false,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"type_params\",\n            \"named\": true\n          },\n          {\n            \"type\": \"type_patterns\",\n            \"named\": true\n          }\n        ]\n      }\n    },\n    \"children\": {\n      \"multiple\": false,\n      \"required\": false,\n      \"types\": [\n        {\n          \"type\": \"infix\",\n          \"named\": true\n        },\n        {\n          \"type\": \"parens\",\n          \"named\": true\n        }\n      ]\n    }\n  },\n  {\n    \"type\": \"newtype_constructor\",\n    \"named\": true,\n    \"fields\": {\n      \"field\": {\n        \"multiple\": false,\n        \"required\": true,\n        \"types\": [\n          {\n            \"type\": \"field\",\n            \"named\": true\n          },\n          {\n            \"type\": \"record\",\n            \"named\": true\n          }\n        ]\n      },\n      \"name\": {\n        \"multiple\": false,\n        \"required\": true,\n        \"types\": [\n          {\n            \"type\": \"constructor\",\n            \"named\": true\n          },\n          {\n            \"type\": \"prefix_id\",\n            \"named\": true\n          }\n        ]\n      }\n    }\n  },\n  {\n    \"type\": \"operator\",\n    \"named\": true,\n    \"fields\": {}\n  },\n  {\n    \"type\": \"parens\",\n    \"named\": true,\n    \"fields\": {\n      \"expression\": {\n        \"multiple\": false,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"expression\",\n            \"named\": true\n          },\n          {\n            \"type\": \"signature\",\n            \"named\": true\n          }\n        ]\n      },\n      \"kind\": {\n        \"multiple\": false,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"quantified_type\",\n            \"named\": true\n          }\n        ]\n      },\n      \"name\": {\n        \"multiple\": false,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"name\",\n            \"named\": true\n          },\n          {\n            \"type\": \"prefix_id\",\n            \"named\": true\n          },\n          {\n            \"type\": \"prefix_list\",\n            \"named\": true\n          },\n          {\n            \"type\": \"qualified\",\n            \"named\": true\n          },\n          {\n            \"type\": \"unit\",\n            \"named\": true\n          }\n        ]\n      },\n      \"pattern\": {\n        \"multiple\": false,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"pattern\",\n            \"named\": true\n          },\n          {\n            \"type\": \"signature\",\n            \"named\": true\n          },\n          {\n            \"type\": \"view_pattern\",\n            \"named\": true\n          }\n        ]\n      },\n      \"patterns\": {\n        \"multiple\": false,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"type_params\",\n            \"named\": true\n          },\n          {\n            \"type\": \"type_patterns\",\n            \"named\": true\n          }\n        ]\n      },\n      \"type\": {\n        \"multiple\": false,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"quantified_type\",\n            \"named\": true\n          },\n          {\n            \"type\": \"signature\",\n            \"named\": true\n          }\n        ]\n      }\n    },\n    \"children\": {\n      \"multiple\": false,\n      \"required\": false,\n      \"types\": [\n        {\n          \"type\": \"annotated\",\n          \"named\": true\n        },\n        {\n          \"type\": \"constraints\",\n          \"named\": true\n        },\n        {\n          \"type\": \"infix\",\n          \"named\": true\n        },\n        {\n          \"type\": \"type_param\",\n          \"named\": true\n        }\n      ]\n    }\n  },\n  {\n    \"type\": \"pattern_guard\",\n    \"named\": true,\n    \"fields\": {\n      \"arrow\": {\n        \"multiple\": false,\n        \"required\": true,\n        \"types\": [\n          {\n            \"type\": \"<-\",\n            \"named\": false\n          },\n          {\n            \"type\": \"←\",\n            \"named\": false\n          }\n        ]\n      },\n      \"expression\": {\n        \"multiple\": false,\n        \"required\": true,\n        \"types\": [\n          {\n            \"type\": \"expression\",\n            \"named\": true\n          },\n          {\n            \"type\": \"signature\",\n            \"named\": true\n          }\n        ]\n      },\n      \"pattern\": {\n        \"multiple\": false,\n        \"required\": true,\n        \"types\": [\n          {\n            \"type\": \"pattern\",\n            \"named\": true\n          },\n          {\n            \"type\": \"signature\",\n            \"named\": true\n          }\n        ]\n      }\n    }\n  },\n  {\n    \"type\": \"pattern_synonym\",\n    \"named\": true,\n    \"fields\": {},\n    \"children\": {\n      \"multiple\": false,\n      \"required\": true,\n      \"types\": [\n        {\n          \"type\": \"equation\",\n          \"named\": true\n        },\n        {\n          \"type\": \"signature\",\n          \"named\": true\n        }\n      ]\n    }\n  },\n  {\n    \"type\": \"patterns\",\n    \"named\": true,\n    \"fields\": {},\n    \"children\": {\n      \"multiple\": true,\n      \"required\": true,\n      \"types\": [\n        {\n          \"type\": \"explicit_type\",\n          \"named\": true\n        },\n        {\n          \"type\": \"pattern\",\n          \"named\": true\n        },\n        {\n          \"type\": \"type_binder\",\n          \"named\": true\n        }\n      ]\n    }\n  },\n  {\n    \"type\": \"prefix\",\n    \"named\": true,\n    \"fields\": {\n      \"field\": {\n        \"multiple\": true,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"lazy_field\",\n            \"named\": true\n          },\n          {\n            \"type\": \"strict_field\",\n            \"named\": true\n          },\n          {\n            \"type\": \"type\",\n            \"named\": true\n          }\n        ]\n      },\n      \"name\": {\n        \"multiple\": false,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"constructor\",\n            \"named\": true\n          },\n          {\n            \"type\": \"prefix_id\",\n            \"named\": true\n          }\n        ]\n      },\n      \"type\": {\n        \"multiple\": false,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"quantified_type\",\n            \"named\": true\n          }\n        ]\n      }\n    }\n  },\n  {\n    \"type\": \"prefix_id\",\n    \"named\": true,\n    \"fields\": {},\n    \"children\": {\n      \"multiple\": false,\n      \"required\": true,\n      \"types\": [\n        {\n          \"type\": \"constructor_operator\",\n          \"named\": true\n        },\n        {\n          \"type\": \"operator\",\n          \"named\": true\n        },\n        {\n          \"type\": \"qualified\",\n          \"named\": true\n        }\n      ]\n    }\n  },\n  {\n    \"type\": \"prefix_list\",\n    \"named\": true,\n    \"fields\": {}\n  },\n  {\n    \"type\": \"prefix_tuple\",\n    \"named\": true,\n    \"fields\": {}\n  },\n  {\n    \"type\": \"prefix_unboxed_sum\",\n    \"named\": true,\n    \"fields\": {}\n  },\n  {\n    \"type\": \"prefix_unboxed_tuple\",\n    \"named\": true,\n    \"fields\": {}\n  },\n  {\n    \"type\": \"projection\",\n    \"named\": true,\n    \"fields\": {\n      \"expression\": {\n        \"multiple\": false,\n        \"required\": true,\n        \"types\": [\n          {\n            \"type\": \"expression\",\n            \"named\": true\n          }\n        ]\n      },\n      \"field\": {\n        \"multiple\": false,\n        \"required\": true,\n        \"types\": [\n          {\n            \"type\": \"field_name\",\n            \"named\": true\n          }\n        ]\n      }\n    }\n  },\n  {\n    \"type\": \"projection_selector\",\n    \"named\": true,\n    \"fields\": {\n      \"field\": {\n        \"multiple\": true,\n        \"required\": true,\n        \"types\": [\n          {\n            \"type\": \"variable\",\n            \"named\": true\n          }\n        ]\n      }\n    }\n  },\n  {\n    \"type\": \"promoted\",\n    \"named\": true,\n    \"fields\": {},\n    \"children\": {\n      \"multiple\": false,\n      \"required\": true,\n      \"types\": [\n        {\n          \"type\": \"constructor\",\n          \"named\": true\n        },\n        {\n          \"type\": \"constructor_operator\",\n          \"named\": true\n        },\n        {\n          \"type\": \"empty_list\",\n          \"named\": true\n        },\n        {\n          \"type\": \"infix_id\",\n          \"named\": true\n        },\n        {\n          \"type\": \"list\",\n          \"named\": true\n        },\n        {\n          \"type\": \"operator\",\n          \"named\": true\n        },\n        {\n          \"type\": \"prefix_id\",\n          \"named\": true\n        },\n        {\n          \"type\": \"prefix_tuple\",\n          \"named\": true\n        },\n        {\n          \"type\": \"qualified\",\n          \"named\": true\n        },\n        {\n          \"type\": \"tuple\",\n          \"named\": true\n        },\n        {\n          \"type\": \"unit\",\n          \"named\": true\n        }\n      ]\n    }\n  },\n  {\n    \"type\": \"qualified\",\n    \"named\": true,\n    \"fields\": {\n      \"id\": {\n        \"multiple\": false,\n        \"required\": true,\n        \"types\": [\n          {\n            \"type\": \"constructor\",\n            \"named\": true\n          },\n          {\n            \"type\": \"constructor_operator\",\n            \"named\": true\n          },\n          {\n            \"type\": \"field_name\",\n            \"named\": true\n          },\n          {\n            \"type\": \"name\",\n            \"named\": true\n          },\n          {\n            \"type\": \"operator\",\n            \"named\": true\n          },\n          {\n            \"type\": \"variable\",\n            \"named\": true\n          }\n        ]\n      },\n      \"module\": {\n        \"multiple\": false,\n        \"required\": true,\n        \"types\": [\n          {\n            \"type\": \"module\",\n            \"named\": true\n          }\n        ]\n      }\n    }\n  },\n  {\n    \"type\": \"qualifiers\",\n    \"named\": true,\n    \"fields\": {\n      \"qualifier\": {\n        \"multiple\": true,\n        \"required\": true,\n        \"types\": [\n          {\n            \"type\": \"qualifier\",\n            \"named\": true\n          }\n        ]\n      }\n    }\n  },\n  {\n    \"type\": \"quantified_variables\",\n    \"named\": true,\n    \"fields\": {},\n    \"children\": {\n      \"multiple\": true,\n      \"required\": true,\n      \"types\": [\n        {\n          \"type\": \"inferred\",\n          \"named\": true\n        },\n        {\n          \"type\": \"type_param\",\n          \"named\": true\n        }\n      ]\n    }\n  },\n  {\n    \"type\": \"quasiquote\",\n    \"named\": true,\n    \"fields\": {\n      \"body\": {\n        \"multiple\": false,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"quasiquote_body\",\n            \"named\": true\n          }\n        ]\n      },\n      \"quoter\": {\n        \"multiple\": false,\n        \"required\": true,\n        \"types\": [\n          {\n            \"type\": \"quoter\",\n            \"named\": true\n          }\n        ]\n      }\n    }\n  },\n  {\n    \"type\": \"quote\",\n    \"named\": true,\n    \"fields\": {\n      \"quoter\": {\n        \"multiple\": false,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"d\",\n            \"named\": false\n          },\n          {\n            \"type\": \"e\",\n            \"named\": false\n          },\n          {\n            \"type\": \"p\",\n            \"named\": false\n          },\n          {\n            \"type\": \"t\",\n            \"named\": false\n          }\n        ]\n      }\n    },\n    \"children\": {\n      \"multiple\": false,\n      \"required\": false,\n      \"types\": [\n        {\n          \"type\": \"quoted_decls\",\n          \"named\": true\n        },\n        {\n          \"type\": \"quoted_expression\",\n          \"named\": true\n        },\n        {\n          \"type\": \"quoted_pattern\",\n          \"named\": true\n        },\n        {\n          \"type\": \"quoted_type\",\n          \"named\": true\n        }\n      ]\n    }\n  },\n  {\n    \"type\": \"quoted_decls\",\n    \"named\": true,\n    \"fields\": {\n      \"declaration\": {\n        \"multiple\": true,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"declaration\",\n            \"named\": true\n          }\n        ]\n      }\n    }\n  },\n  {\n    \"type\": \"quoted_expression\",\n    \"named\": true,\n    \"fields\": {},\n    \"children\": {\n      \"multiple\": false,\n      \"required\": true,\n      \"types\": [\n        {\n          \"type\": \"expression\",\n          \"named\": true\n        },\n        {\n          \"type\": \"signature\",\n          \"named\": true\n        }\n      ]\n    }\n  },\n  {\n    \"type\": \"quoted_pattern\",\n    \"named\": true,\n    \"fields\": {},\n    \"children\": {\n      \"multiple\": false,\n      \"required\": true,\n      \"types\": [\n        {\n          \"type\": \"pattern\",\n          \"named\": true\n        },\n        {\n          \"type\": \"signature\",\n          \"named\": true\n        }\n      ]\n    }\n  },\n  {\n    \"type\": \"quoted_type\",\n    \"named\": true,\n    \"fields\": {},\n    \"children\": {\n      \"multiple\": false,\n      \"required\": true,\n      \"types\": [\n        {\n          \"type\": \"quantified_type\",\n          \"named\": true\n        },\n        {\n          \"type\": \"signature\",\n          \"named\": true\n        }\n      ]\n    }\n  },\n  {\n    \"type\": \"quoter\",\n    \"named\": true,\n    \"fields\": {},\n    \"children\": {\n      \"multiple\": false,\n      \"required\": true,\n      \"types\": [\n        {\n          \"type\": \"qualified\",\n          \"named\": true\n        },\n        {\n          \"type\": \"variable\",\n          \"named\": true\n        }\n      ]\n    }\n  },\n  {\n    \"type\": \"rec\",\n    \"named\": true,\n    \"fields\": {\n      \"statement\": {\n        \"multiple\": true,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"statement\",\n            \"named\": true\n          }\n        ]\n      }\n    }\n  },\n  {\n    \"type\": \"record\",\n    \"named\": true,\n    \"fields\": {\n      \"arrow\": {\n        \"multiple\": true,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"->\",\n            \"named\": false\n          },\n          {\n            \"type\": \"→\",\n            \"named\": false\n          }\n        ]\n      },\n      \"constructor\": {\n        \"multiple\": false,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"pattern\",\n            \"named\": true\n          }\n        ]\n      },\n      \"expression\": {\n        \"multiple\": false,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"expression\",\n            \"named\": true\n          }\n        ]\n      },\n      \"field\": {\n        \"multiple\": true,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"field\",\n            \"named\": true\n          },\n          {\n            \"type\": \"field_pattern\",\n            \"named\": true\n          },\n          {\n            \"type\": \"field_update\",\n            \"named\": true\n          }\n        ]\n      },\n      \"fields\": {\n        \"multiple\": false,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"fields\",\n            \"named\": true\n          }\n        ]\n      },\n      \"name\": {\n        \"multiple\": false,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"constructor\",\n            \"named\": true\n          }\n        ]\n      },\n      \"type\": {\n        \"multiple\": false,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"quantified_type\",\n            \"named\": true\n          }\n        ]\n      }\n    }\n  },\n  {\n    \"type\": \"right_section\",\n    \"named\": true,\n    \"fields\": {\n      \"right_operand\": {\n        \"multiple\": false,\n        \"required\": true,\n        \"types\": [\n          {\n            \"type\": \"expression\",\n            \"named\": true\n          }\n        ]\n      }\n    },\n    \"children\": {\n      \"multiple\": false,\n      \"required\": true,\n      \"types\": [\n        {\n          \"type\": \"constructor_operator\",\n          \"named\": true\n        },\n        {\n          \"type\": \"infix_id\",\n          \"named\": true\n        },\n        {\n          \"type\": \"operator\",\n          \"named\": true\n        },\n        {\n          \"type\": \"qualified\",\n          \"named\": true\n        }\n      ]\n    }\n  },\n  {\n    \"type\": \"role_annotation\",\n    \"named\": true,\n    \"fields\": {\n      \"role\": {\n        \"multiple\": true,\n        \"required\": true,\n        \"types\": [\n          {\n            \"type\": \"type_role\",\n            \"named\": true\n          }\n        ]\n      },\n      \"type\": {\n        \"multiple\": false,\n        \"required\": true,\n        \"types\": [\n          {\n            \"type\": \"name\",\n            \"named\": true\n          },\n          {\n            \"type\": \"prefix_id\",\n            \"named\": true\n          },\n          {\n            \"type\": \"qualified\",\n            \"named\": true\n          }\n        ]\n      }\n    }\n  },\n  {\n    \"type\": \"signature\",\n    \"named\": true,\n    \"fields\": {\n      \"constraint\": {\n        \"multiple\": false,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"constraints\",\n            \"named\": true\n          }\n        ]\n      },\n      \"expression\": {\n        \"multiple\": false,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"expression\",\n            \"named\": true\n          }\n        ]\n      },\n      \"kind\": {\n        \"multiple\": false,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"quantified_type\",\n            \"named\": true\n          }\n        ]\n      },\n      \"name\": {\n        \"multiple\": false,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"prefix_id\",\n            \"named\": true\n          },\n          {\n            \"type\": \"variable\",\n            \"named\": true\n          }\n        ]\n      },\n      \"names\": {\n        \"multiple\": false,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"binding_list\",\n            \"named\": true\n          }\n        ]\n      },\n      \"pattern\": {\n        \"multiple\": false,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"pattern\",\n            \"named\": true\n          }\n        ]\n      },\n      \"synonym\": {\n        \"multiple\": false,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"binding_list\",\n            \"named\": true\n          },\n          {\n            \"type\": \"constructor\",\n            \"named\": true\n          },\n          {\n            \"type\": \"prefix_id\",\n            \"named\": true\n          }\n        ]\n      },\n      \"type\": {\n        \"multiple\": false,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"quantified_type\",\n            \"named\": true\n          }\n        ]\n      }\n    }\n  },\n  {\n    \"type\": \"special\",\n    \"named\": true,\n    \"fields\": {},\n    \"children\": {\n      \"multiple\": false,\n      \"required\": true,\n      \"types\": [\n        {\n          \"type\": \"empty_list\",\n          \"named\": true\n        },\n        {\n          \"type\": \"tuple\",\n          \"named\": true\n        },\n        {\n          \"type\": \"unboxed_sum\",\n          \"named\": true\n        },\n        {\n          \"type\": \"unboxed_tuple\",\n          \"named\": true\n        },\n        {\n          \"type\": \"unboxed_unit\",\n          \"named\": true\n        },\n        {\n          \"type\": \"unit\",\n          \"named\": true\n        }\n      ]\n    }\n  },\n  {\n    \"type\": \"splice\",\n    \"named\": true,\n    \"fields\": {\n      \"expression\": {\n        \"multiple\": false,\n        \"required\": true,\n        \"types\": [\n          {\n            \"type\": \"constructor\",\n            \"named\": true\n          },\n          {\n            \"type\": \"implicit_variable\",\n            \"named\": true\n          },\n          {\n            \"type\": \"label\",\n            \"named\": true\n          },\n          {\n            \"type\": \"literal\",\n            \"named\": true\n          },\n          {\n            \"type\": \"parens\",\n            \"named\": true\n          },\n          {\n            \"type\": \"prefix_id\",\n            \"named\": true\n          },\n          {\n            \"type\": \"qualified\",\n            \"named\": true\n          },\n          {\n            \"type\": \"variable\",\n            \"named\": true\n          }\n        ]\n      }\n    }\n  },\n  {\n    \"type\": \"star\",\n    \"named\": true,\n    \"fields\": {}\n  },\n  {\n    \"type\": \"strict\",\n    \"named\": true,\n    \"fields\": {\n      \"pattern\": {\n        \"multiple\": false,\n        \"required\": true,\n        \"types\": [\n          {\n            \"type\": \"pattern\",\n            \"named\": true\n          }\n        ]\n      }\n    }\n  },\n  {\n    \"type\": \"strict_field\",\n    \"named\": true,\n    \"fields\": {\n      \"type\": {\n        \"multiple\": false,\n        \"required\": true,\n        \"types\": [\n          {\n            \"type\": \"type\",\n            \"named\": true\n          }\n        ]\n      }\n    }\n  },\n  {\n    \"type\": \"th_quoted_name\",\n    \"named\": true,\n    \"fields\": {\n      \"name\": {\n        \"multiple\": false,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"constructor\",\n            \"named\": true\n          },\n          {\n            \"type\": \"prefix_id\",\n            \"named\": true\n          },\n          {\n            \"type\": \"qualified\",\n            \"named\": true\n          },\n          {\n            \"type\": \"variable\",\n            \"named\": true\n          }\n        ]\n      },\n      \"type\": {\n        \"multiple\": false,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"type\",\n            \"named\": true\n          }\n        ]\n      }\n    }\n  },\n  {\n    \"type\": \"top_splice\",\n    \"named\": true,\n    \"fields\": {},\n    \"children\": {\n      \"multiple\": false,\n      \"required\": true,\n      \"types\": [\n        {\n          \"type\": \"expression\",\n          \"named\": true\n        }\n      ]\n    }\n  },\n  {\n    \"type\": \"transform\",\n    \"named\": true,\n    \"fields\": {\n      \"key\": {\n        \"multiple\": false,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"expression\",\n            \"named\": true\n          },\n          {\n            \"type\": \"signature\",\n            \"named\": true\n          }\n        ]\n      },\n      \"transformation\": {\n        \"multiple\": false,\n        \"required\": true,\n        \"types\": [\n          {\n            \"type\": \"expression\",\n            \"named\": true\n          },\n          {\n            \"type\": \"signature\",\n            \"named\": true\n          }\n        ]\n      }\n    }\n  },\n  {\n    \"type\": \"tuple\",\n    \"named\": true,\n    \"fields\": {\n      \"element\": {\n        \"multiple\": true,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"expression\",\n            \"named\": true\n          },\n          {\n            \"type\": \"pattern\",\n            \"named\": true\n          },\n          {\n            \"type\": \"quantified_type\",\n            \"named\": true\n          },\n          {\n            \"type\": \"signature\",\n            \"named\": true\n          },\n          {\n            \"type\": \"view_pattern\",\n            \"named\": true\n          }\n        ]\n      }\n    },\n    \"children\": {\n      \"multiple\": true,\n      \"required\": false,\n      \"types\": [\n        {\n          \"type\": \"constraints\",\n          \"named\": true\n        }\n      ]\n    }\n  },\n  {\n    \"type\": \"type_application\",\n    \"named\": true,\n    \"fields\": {\n      \"type\": {\n        \"multiple\": false,\n        \"required\": true,\n        \"types\": [\n          {\n            \"type\": \"type\",\n            \"named\": true\n          }\n        ]\n      }\n    }\n  },\n  {\n    \"type\": \"type_binder\",\n    \"named\": true,\n    \"fields\": {\n      \"type\": {\n        \"multiple\": false,\n        \"required\": true,\n        \"types\": [\n          {\n            \"type\": \"type\",\n            \"named\": true\n          }\n        ]\n      }\n    }\n  },\n  {\n    \"type\": \"type_family\",\n    \"named\": true,\n    \"fields\": {\n      \"closed_family\": {\n        \"multiple\": false,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"abstract_family\",\n            \"named\": true\n          },\n          {\n            \"type\": \"equations\",\n            \"named\": true\n          }\n        ]\n      },\n      \"kind\": {\n        \"multiple\": false,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"quantified_type\",\n            \"named\": true\n          }\n        ]\n      },\n      \"name\": {\n        \"multiple\": false,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"name\",\n            \"named\": true\n          },\n          {\n            \"type\": \"prefix_id\",\n            \"named\": true\n          },\n          {\n            \"type\": \"prefix_list\",\n            \"named\": true\n          },\n          {\n            \"type\": \"unit\",\n            \"named\": true\n          }\n        ]\n      },\n      \"patterns\": {\n        \"multiple\": false,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"type_params\",\n            \"named\": true\n          }\n        ]\n      }\n    },\n    \"children\": {\n      \"multiple\": true,\n      \"required\": false,\n      \"types\": [\n        {\n          \"type\": \"infix\",\n          \"named\": true\n        },\n        {\n          \"type\": \"parens\",\n          \"named\": true\n        },\n        {\n          \"type\": \"type_family_injectivity\",\n          \"named\": true\n        },\n        {\n          \"type\": \"type_family_result\",\n          \"named\": true\n        }\n      ]\n    }\n  },\n  {\n    \"type\": \"type_family_injectivity\",\n    \"named\": true,\n    \"fields\": {\n      \"determined\": {\n        \"multiple\": true,\n        \"required\": true,\n        \"types\": [\n          {\n            \"type\": \"variable\",\n            \"named\": true\n          }\n        ]\n      },\n      \"result\": {\n        \"multiple\": false,\n        \"required\": true,\n        \"types\": [\n          {\n            \"type\": \"variable\",\n            \"named\": true\n          }\n        ]\n      }\n    }\n  },\n  {\n    \"type\": \"type_family_result\",\n    \"named\": true,\n    \"fields\": {\n      \"result\": {\n        \"multiple\": false,\n        \"required\": true,\n        \"types\": [\n          {\n            \"type\": \"quantified_type\",\n            \"named\": true\n          }\n        ]\n      }\n    }\n  },\n  {\n    \"type\": \"type_instance\",\n    \"named\": true,\n    \"fields\": {\n      \"forall\": {\n        \"multiple\": false,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"forall\",\n            \"named\": true\n          },\n          {\n            \"type\": \"forall_required\",\n            \"named\": true\n          }\n        ]\n      },\n      \"name\": {\n        \"multiple\": false,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"name\",\n            \"named\": true\n          },\n          {\n            \"type\": \"prefix_id\",\n            \"named\": true\n          },\n          {\n            \"type\": \"qualified\",\n            \"named\": true\n          }\n        ]\n      },\n      \"patterns\": {\n        \"multiple\": false,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"type_patterns\",\n            \"named\": true\n          }\n        ]\n      }\n    },\n    \"children\": {\n      \"multiple\": true,\n      \"required\": true,\n      \"types\": [\n        {\n          \"type\": \"infix\",\n          \"named\": true\n        },\n        {\n          \"type\": \"parens\",\n          \"named\": true\n        },\n        {\n          \"type\": \"quantified_type\",\n          \"named\": true\n        }\n      ]\n    }\n  },\n  {\n    \"type\": \"type_params\",\n    \"named\": true,\n    \"fields\": {},\n    \"children\": {\n      \"multiple\": true,\n      \"required\": true,\n      \"types\": [\n        {\n          \"type\": \"type_param\",\n          \"named\": true\n        }\n      ]\n    }\n  },\n  {\n    \"type\": \"type_patterns\",\n    \"named\": true,\n    \"fields\": {},\n    \"children\": {\n      \"multiple\": true,\n      \"required\": true,\n      \"types\": [\n        {\n          \"type\": \"kind_application\",\n          \"named\": true\n        },\n        {\n          \"type\": \"type\",\n          \"named\": true\n        }\n      ]\n    }\n  },\n  {\n    \"type\": \"type_role\",\n    \"named\": true,\n    \"fields\": {}\n  },\n  {\n    \"type\": \"type_synomym\",\n    \"named\": true,\n    \"fields\": {\n      \"name\": {\n        \"multiple\": false,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"name\",\n            \"named\": true\n          },\n          {\n            \"type\": \"prefix_id\",\n            \"named\": true\n          },\n          {\n            \"type\": \"prefix_list\",\n            \"named\": true\n          },\n          {\n            \"type\": \"unit\",\n            \"named\": true\n          }\n        ]\n      },\n      \"patterns\": {\n        \"multiple\": false,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"type_params\",\n            \"named\": true\n          }\n        ]\n      },\n      \"type\": {\n        \"multiple\": false,\n        \"required\": true,\n        \"types\": [\n          {\n            \"type\": \"quantified_type\",\n            \"named\": true\n          },\n          {\n            \"type\": \"signature\",\n            \"named\": true\n          }\n        ]\n      }\n    },\n    \"children\": {\n      \"multiple\": false,\n      \"required\": false,\n      \"types\": [\n        {\n          \"type\": \"infix\",\n          \"named\": true\n        },\n        {\n          \"type\": \"parens\",\n          \"named\": true\n        }\n      ]\n    }\n  },\n  {\n    \"type\": \"typed_quote\",\n    \"named\": true,\n    \"fields\": {},\n    \"children\": {\n      \"multiple\": false,\n      \"required\": false,\n      \"types\": [\n        {\n          \"type\": \"quoted_expression\",\n          \"named\": true\n        }\n      ]\n    }\n  },\n  {\n    \"type\": \"unboxed_sum\",\n    \"named\": true,\n    \"fields\": {\n      \"element\": {\n        \"multiple\": true,\n        \"required\": true,\n        \"types\": [\n          {\n            \"type\": \"expression\",\n            \"named\": true\n          },\n          {\n            \"type\": \"pattern\",\n            \"named\": true\n          },\n          {\n            \"type\": \"quantified_type\",\n            \"named\": true\n          },\n          {\n            \"type\": \"signature\",\n            \"named\": true\n          },\n          {\n            \"type\": \"view_pattern\",\n            \"named\": true\n          }\n        ]\n      }\n    }\n  },\n  {\n    \"type\": \"unboxed_tuple\",\n    \"named\": true,\n    \"fields\": {\n      \"element\": {\n        \"multiple\": true,\n        \"required\": true,\n        \"types\": [\n          {\n            \"type\": \"expression\",\n            \"named\": true\n          },\n          {\n            \"type\": \"pattern\",\n            \"named\": true\n          },\n          {\n            \"type\": \"quantified_type\",\n            \"named\": true\n          },\n          {\n            \"type\": \"signature\",\n            \"named\": true\n          },\n          {\n            \"type\": \"view_pattern\",\n            \"named\": true\n          }\n        ]\n      }\n    }\n  },\n  {\n    \"type\": \"unboxed_unit\",\n    \"named\": true,\n    \"fields\": {}\n  },\n  {\n    \"type\": \"unit\",\n    \"named\": true,\n    \"fields\": {}\n  },\n  {\n    \"type\": \"via\",\n    \"named\": true,\n    \"fields\": {\n      \"type\": {\n        \"multiple\": false,\n        \"required\": true,\n        \"types\": [\n          {\n            \"type\": \"quantified_type\",\n            \"named\": true\n          }\n        ]\n      }\n    }\n  },\n  {\n    \"type\": \"view_pattern\",\n    \"named\": true,\n    \"fields\": {\n      \"expression\": {\n        \"multiple\": false,\n        \"required\": true,\n        \"types\": [\n          {\n            \"type\": \"expression\",\n            \"named\": true\n          },\n          {\n            \"type\": \"signature\",\n            \"named\": true\n          }\n        ]\n      },\n      \"pattern\": {\n        \"multiple\": false,\n        \"required\": true,\n        \"types\": [\n          {\n            \"type\": \"pattern\",\n            \"named\": true\n          },\n          {\n            \"type\": \"signature\",\n            \"named\": true\n          },\n          {\n            \"type\": \"view_pattern\",\n            \"named\": true\n          }\n        ]\n      }\n    }\n  },\n  {\n    \"type\": \"wildcard\",\n    \"named\": true,\n    \"fields\": {}\n  },\n  {\n    \"type\": \"!\",\n    \"named\": false\n  },\n  {\n    \"type\": \"#\",\n    \"named\": false\n  },\n  {\n    \"type\": \"#)\",\n    \"named\": false\n  },\n  {\n    \"type\": \"$\",\n    \"named\": false\n  },\n  {\n    \"type\": \"$$\",\n    \"named\": false\n  },\n  {\n    \"type\": \"%\",\n    \"named\": false\n  },\n  {\n    \"type\": \"'\",\n    \"named\": false\n  },\n  {\n    \"type\": \"''\",\n    \"named\": false\n  },\n  {\n    \"type\": \"(\",\n    \"named\": false\n  },\n  {\n    \"type\": \"(#\",\n    \"named\": false\n  },\n  {\n    \"type\": \")\",\n    \"named\": false\n  },\n  {\n    \"type\": \"*\",\n    \"named\": false\n  },\n  {\n    \"type\": \",\",\n    \"named\": false\n  },\n  {\n    \"type\": \"-\",\n    \"named\": false\n  },\n  {\n    \"type\": \"->\",\n    \"named\": false\n  },\n  {\n    \"type\": \"->.\",\n    \"named\": false\n  },\n  {\n    \"type\": \".\",\n    \"named\": false\n  },\n  {\n    \"type\": \"..\",\n    \"named\": false\n  },\n  {\n    \"type\": \"1\",\n    \"named\": false\n  },\n  {\n    \"type\": \"::\",\n    \"named\": false\n  },\n  {\n    \"type\": \";\",\n    \"named\": false\n  },\n  {\n    \"type\": \"<-\",\n    \"named\": false\n  },\n  {\n    \"type\": \"=\",\n    \"named\": false\n  },\n  {\n    \"type\": \"=>\",\n    \"named\": false\n  },\n  {\n    \"type\": \"@\",\n    \"named\": false\n  },\n  {\n    \"type\": \"[\",\n    \"named\": false\n  },\n  {\n    \"type\": \"\\\\\",\n    \"named\": false\n  },\n  {\n    \"type\": \"]\",\n    \"named\": false\n  },\n  {\n    \"type\": \"_\",\n    \"named\": false\n  },\n  {\n    \"type\": \"`\",\n    \"named\": false\n  },\n  {\n    \"type\": \"all_names\",\n    \"named\": true\n  },\n  {\n    \"type\": \"anyclass\",\n    \"named\": false\n  },\n  {\n    \"type\": \"as\",\n    \"named\": false\n  },\n  {\n    \"type\": \"by\",\n    \"named\": false\n  },\n  {\n    \"type\": \"calling_convention\",\n    \"named\": true\n  },\n  {\n    \"type\": \"case\",\n    \"named\": false\n  },\n  {\n    \"type\": \"cases\",\n    \"named\": false\n  },\n  {\n    \"type\": \"char\",\n    \"named\": true\n  },\n  {\n    \"type\": \"class\",\n    \"named\": false\n  },\n  {\n    \"type\": \"comment\",\n    \"named\": true\n  },\n  {\n    \"type\": \"constructor\",\n    \"named\": true\n  },\n  {\n    \"type\": \"cpp\",\n    \"named\": true\n  },\n  {\n    \"type\": \"d\",\n    \"named\": false\n  },\n  {\n    \"type\": \"data\",\n    \"named\": false\n  },\n  {\n    \"type\": \"default\",\n    \"named\": false\n  },\n  {\n    \"type\": \"deriving\",\n    \"named\": false\n  },\n  {\n    \"type\": \"do\",\n    \"named\": false\n  },\n  {\n    \"type\": \"e\",\n    \"named\": false\n  },\n  {\n    \"type\": \"else\",\n    \"named\": false\n  },\n  {\n    \"type\": \"export\",\n    \"named\": false\n  },\n  {\n    \"type\": \"family\",\n    \"named\": false\n  },\n  {\n    \"type\": \"float\",\n    \"named\": true\n  },\n  {\n    \"type\": \"forall\",\n    \"named\": false\n  },\n  {\n    \"type\": \"foreign\",\n    \"named\": false\n  },\n  {\n    \"type\": \"group\",\n    \"named\": false\n  },\n  {\n    \"type\": \"haddock\",\n    \"named\": true\n  },\n  {\n    \"type\": \"hiding\",\n    \"named\": false\n  },\n  {\n    \"type\": \"if\",\n    \"named\": false\n  },\n  {\n    \"type\": \"implicit_variable\",\n    \"named\": true\n  },\n  {\n    \"type\": \"import\",\n    \"named\": false\n  },\n  {\n    \"type\": \"import_package\",\n    \"named\": true\n  },\n  {\n    \"type\": \"in\",\n    \"named\": false\n  },\n  {\n    \"type\": \"infix\",\n    \"named\": false\n  },\n  {\n    \"type\": \"infixl\",\n    \"named\": false\n  },\n  {\n    \"type\": \"infixr\",\n    \"named\": false\n  },\n  {\n    \"type\": \"instance\",\n    \"named\": false\n  },\n  {\n    \"type\": \"label\",\n    \"named\": true\n  },\n  {\n    \"type\": \"let\",\n    \"named\": false\n  },\n  {\n    \"type\": \"mdo\",\n    \"named\": false\n  },\n  {\n    \"type\": \"module\",\n    \"named\": false\n  },\n  {\n    \"type\": \"module_id\",\n    \"named\": true\n  },\n  {\n    \"type\": \"name\",\n    \"named\": true\n  },\n  {\n    \"type\": \"newtype\",\n    \"named\": false\n  },\n  {\n    \"type\": \"nominal\",\n    \"named\": false\n  },\n  {\n    \"type\": \"of\",\n    \"named\": false\n  },\n  {\n    \"type\": \"p\",\n    \"named\": false\n  },\n  {\n    \"type\": \"pattern\",\n    \"named\": false\n  },\n  {\n    \"type\": \"phantom\",\n    \"named\": false\n  },\n  {\n    \"type\": \"pragma\",\n    \"named\": true\n  },\n  {\n    \"type\": \"qualified\",\n    \"named\": false\n  },\n  {\n    \"type\": \"quasiquote_body\",\n    \"named\": true\n  },\n  {\n    \"type\": \"rec\",\n    \"named\": false\n  },\n  {\n    \"type\": \"representational\",\n    \"named\": false\n  },\n  {\n    \"type\": \"role\",\n    \"named\": false\n  },\n  {\n    \"type\": \"safety\",\n    \"named\": true\n  },\n  {\n    \"type\": \"stock\",\n    \"named\": false\n  },\n  {\n    \"type\": \"string\",\n    \"named\": true\n  },\n  {\n    \"type\": \"t\",\n    \"named\": false\n  },\n  {\n    \"type\": \"then\",\n    \"named\": false\n  },\n  {\n    \"type\": \"type\",\n    \"named\": false\n  },\n  {\n    \"type\": \"using\",\n    \"named\": false\n  },\n  {\n    \"type\": \"variable\",\n    \"named\": true\n  },\n  {\n    \"type\": \"via\",\n    \"named\": false\n  },\n  {\n    \"type\": \"where\",\n    \"named\": false\n  },\n  {\n    \"type\": \"{\",\n    \"named\": false\n  },\n  {\n    \"type\": \"|\",\n    \"named\": false\n  },\n  {\n    \"type\": \"|]\",\n    \"named\": false\n  },\n  {\n    \"type\": \"||\",\n    \"named\": false\n  },\n  {\n    \"type\": \"||]\",\n    \"named\": false\n  },\n  {\n    \"type\": \"}\",\n    \"named\": false\n  },\n  {\n    \"type\": \"~\",\n    \"named\": false\n  },\n  {\n    \"type\": \"←\",\n    \"named\": false\n  },\n  {\n    \"type\": \"→\",\n    \"named\": false\n  },\n  {\n    \"type\": \"⇒\",\n    \"named\": false\n  },\n  {\n    \"type\": \"∀\",\n    \"named\": false\n  },\n  {\n    \"type\": \"∷\",\n    \"named\": false\n  },\n  {\n    \"type\": \"⊸\",\n    \"named\": false\n  },\n  {\n    \"type\": \"★\",\n    \"named\": false\n  },\n  {\n    \"type\": \"⟦\",\n    \"named\": false\n  },\n  {\n    \"type\": \"⟧\",\n    \"named\": false\n  }\n]"
  },
  {
    "path": "src/scanner.c",
    "content": "/**\n * The scanner is an extension to the built-in lexer that handles cases that are hard or impossible to express with the\n * high-level grammar rules.\n * Since Haskell is indentation sensitive and uses parse errors to end layouts, this component has many\n * responsibilities.\n *\n * tree-sitter runs the scanner at every position repeatedly until it fails, after which the built-in lexer consumes one\n * token.\n * When the scanner succeeds, it returns the index of a symbol in the `externals` array in `grammar/externals.js`, which\n * is then processed like other grammar symbols, except that it terminates any conflict branches in which the symbol\n * isn't valid.\n * The scanner's state is persisted and passed into the next run, but it is discarded when the scanner fails, i.e. when\n * it yields control back to the built-in lexer.\n *\n * The high-level workflow of the scanner consists of three distinct modes.\n * When the first character after whitespace is a newline, the scanner starts newline lookahead, otherwise it processes\n * an interior position.\n * If the state indicates that the previous run performed newline lookahead, it enters newline processing mode.\n *\n * In interior mode, a single lexing pass is performed.\n *\n * Such a pass consists of two steps:\n *\n * In the first step, the scanner identifies the immediate token by branching on the first character after whitespace\n * and examining different conditions to select one of the variants of the enum `Lexed`, which enumerates all known,\n * interesting, situations.\n * The position of the lexer may be advanced in the process to look at subsequent characters.\n * To avoid having to arrange different parts of the logic according to how many characters have been consumed,\n * lookahead is written to an array in the transient state on demand, so that each component can specify the index\n * relative to the position at the beginning of the run (modulo whitespace).\n * The entry point for this step is the function `lex`.\n *\n * The second step is different for each mode.\n * In interior mode, the `Lexed` token determines which symbol to return to the grammar based on the current state, like\n * layout contexts and valid symbols.\n * Most symbols do not contain any text, but only act as conditions in the grammar, but for symbolic operators, CPP,\n * comments, pragmas, and quasiquotes, the lexer is advanced to the end of the token and `mark_end` is called to\n * communicate the range to tree-sitter.\n *\n * In newline lookahead mode, the scanner performs repeated lexing passes until it encounters a `Lexed` token that is\n * not CPP or a comment.\n * In the second step of each pass, the token determines whether to terminate and/or which flags to set in the state to\n * guide processing in the next run.\n * If the lookahead loop has only made a single lexing pass that did not consume any characters of the following token\n * (because the first character did not match any of the conditions for lexing that require more lookahead), the scanner\n * switches to newline processing mode directly; otherwise it terminates the run after storing the newline information\n * in the persistent state.\n * This is possible by succeeding with the symbol `UPDATE`, which is mapped to newline in `externals`.\n * tree-sitter does not create a node in the parse tree for this symbol if `mark_end` wasn't called after consuming\n * lookahead, and immediately calls the scanner again at the same position.\n *\n * In either case, the scanner ends up in newline processing mode, in which it performs a series of highly\n * order-sensitive steps based on the data collected in lookahead mode, potentially returning multiple symbols in\n * successive runs until none of the newline-related conditions match.\n * This procedure ensures that nested layouts are terminated at the earliest position instead of extending over all\n * subsequent (top-level) whitespace, comments and CPP up to the next layout element.\n * Only when all layouts are terminated will the scanner process the final `Lexed` token that it stored in the state in\n * lookahead mode, using the same logic as in interior mode, and update the state to disable newline processing for the\n * next run.\n */\n\n#include \"tree_sitter/alloc.h\"\n#include \"tree_sitter/array.h\"\n#include \"tree_sitter/parser.h\"\n\n#include \"unicode.h\"\n#include <assert.h>\n#include <stdbool.h>\n#include <string.h>\n\n#define PEEK env->lexer->lookahead\n\n#ifdef TREE_SITTER_DEBUG\n\n#include <locale.h>\n\n#define S_ADVANCE advance_debug(env)\n#define S_SKIP skip_debug(env)\n#define MARK(s) mark_debug(env, s)\n#define dbg(...) do { fprintf(stderr, __VA_ARGS__); } while (0)\n\n#else\n\n// Move the parser position one character to the right.\n#define S_ADVANCE advance(env)\n\n// Move the parser position one character to the right, treating the consumed character as whitespace.\n#define S_SKIP env->lexer->advance(env->lexer, true)\n\n/**\n * Instruct the lexer that the current position is the end of the potentially detected symbol, causing the next run to\n * be started after this character in the success case.\n *\n * This is useful if the validity of the detected symbol depends on what follows.\n */\n#define MARK(s) env->lexer->mark_end(env->lexer)\n\n#define dbg(...) do {} while (0)\n\n#endif\n\n// Short circuit a parse step: If the argument expression returns 0, continue; otherwise return its result.\n// This is used with enums, so casting to unsigned should not cause problems.\n#define SEQ(expr) do { unsigned res = (unsigned) expr; if (res) return res; } while (0)\n\n// --------------------------------------------------------------------------------------------------------\n// Symbols\n// --------------------------------------------------------------------------------------------------------\n\n/**\n * This enum mirrors the symbols in `externals` in `grammar/externals.js`.\n * tree-sitter passes an array of booleans to the scanner whose entries are `true` if the symbol at the corresponding\n * index is valid at the current parser position.\n */\ntypedef enum {\n  FAIL,\n  SEMICOLON,\n  START,\n  START_DO,\n  START_CASE,\n  START_IF,\n  START_LET,\n  START_QUOTE,\n  START_EXPLICIT,\n  END,\n  END_EXPLICIT,\n  START_BRACE,\n  END_BRACE,\n  START_TEXP,\n  END_TEXP,\n  WHERE,\n  IN,\n  ARROW,\n  BAR,\n  DERIVING,\n  COMMENT,\n  HADDOCK,\n  CPP,\n  PRAGMA,\n  QQ_START,\n  QQ_BODY,\n  SPLICE,\n  QUAL_DOT,\n  TIGHT_DOT,\n  PREFIX_DOT,\n  DOTDOT,\n  TIGHT_AT,\n  PREFIX_AT,\n  TIGHT_BANG,\n  PREFIX_BANG,\n  TIGHT_TILDE,\n  PREFIX_TILDE,\n  PREFIX_PERCENT,\n  QUALIFIED_OP,\n  LEFT_SECTION_OP,\n  NO_SECTION_OP,\n  MINUS,\n  CONTEXT,\n  INFIX,\n  DATA_INFIX,\n  TYPE_INSTANCE,\n  VARSYM,\n  CONSYM,\n  UPDATE,\n} Symbol;\n\n#ifdef TREE_SITTER_DEBUG\n\nstatic const char *sym_names[] = {\n  \"fail\",\n  \"semicolon\",\n  \"start\",\n  \"start_do\",\n  \"start_case\",\n  \"start_if\",\n  \"start_let\",\n  \"start_quote\",\n  \"start_explicit\",\n  \"end\",\n  \"end_explicit\",\n  \"start_brace\",\n  \"end_brace\",\n  \"start_texp\",\n  \"end_texp\",\n  \"where\",\n  \"in\",\n  \"arrow\",\n  \"bar\",\n  \"deriving\",\n  \"comment\",\n  \"haddock\",\n  \"cpp\",\n  \"pragma\",\n  \"qq_start\",\n  \"qq_body\",\n  \"splice\",\n  \"tight_dot\",\n  \"proj_dot\",\n  \"prefix_dot\",\n  \"dotdot\",\n  \"tight_at\",\n  \"prefix_at\",\n  \"tight_bang\",\n  \"prefix_bang\",\n  \"tight_tilde\",\n  \"prefix_tilde\",\n  \"prefix_percent\",\n  \"qualified_op\",\n  \"left_section_op\",\n  \"no_section_op\",\n  \"minus\",\n  \"context\",\n  \"infix\",\n  \"data_infix\",\n  \"type_instance\",\n  \"varsym\",\n  \"consym\",\n  \"update\",\n};\n\n#endif\n\n// --------------------------------------------------------------------------------------------------------\n// Data\n// --------------------------------------------------------------------------------------------------------\n\n#ifdef TREE_SITTER_DEBUG\n\ntypedef Array(int32_t) ParseLine;\n\n/**\n * A vector of lines, persisted across runs, for visualizing the current lexer position and scanner lookahead.\n */\ntypedef Array(ParseLine) ParseLines;\n\n/**\n * Info about calls to `mark_end` and how far the lexer has progressed in a run.\n * Discarded after each run.\n */\ntypedef struct {\n  int marked;\n  unsigned marked_line;\n  unsigned start_col;\n  unsigned start_line;\n  unsigned end_col;\n  const char *marked_by;\n} Debug;\n\nDebug debug_new(TSLexer *l) {\n  return (Debug) {\n    .marked = -1,\n    .marked_line = 0,\n    .start_col = l->get_column(l),\n    .start_line = 0,\n    .end_col = 0,\n    .marked_by = \"\",\n  };\n}\n\n#endif\n\n/**\n * Different sorts of layout contexts that require special treatment.\n */\ntypedef enum {\n  DeclLayout,\n  DoLayout,\n  CaseLayout,\n  LetLayout,\n  QuoteLayout,\n  MultiWayIfLayout,\n  Braces,\n  TExp,\n  ModuleHeader,\n  NoContext,\n} ContextSort;\n\n#ifdef TREE_SITTER_DEBUG\n\nstatic char const *context_names[] = {\n  \"decls\",\n  \"do\",\n  \"case\",\n  \"let\",\n  \"multi_way_if\",\n  \"quote\",\n  \"braces\",\n  \"texp\",\n  \"module_header\",\n  \"none\",\n};\n\n#endif\n\n/**\n * The persistent state maintains a stack of layout contexts.\n * New entries are created when a layout symbol is valid at the current position, and they are removed when the indent\n * of a line satisfies conditions that depend on the current context sort, or when certain tokens (like `else`) occur.\n */\ntypedef struct {\n  ContextSort sort;\n  uint32_t indent;\n} Context;\n\n/**\n * This enumerates the lookahead tokens that have special meaning in the scanner.\n */\ntypedef enum {\n  LNothing,\n  LEof,\n  LWhere,\n  LIn,\n  LThen,\n  LElse,\n  LDeriving,\n  LModule,\n  LUpper,\n  LTick,\n  LSymop,\n  LSymopSpecial,\n  LDotDot,\n  LDotId,\n  LDotSymop,\n  LDotOpen,\n  LDollar,\n  LBang,\n  LTilde,\n  LAt,\n  LPercent,\n  LHash,\n  LBar,\n  LArrow,\n  LCArrow,\n  LTexpCloser,\n  LQuoteClose,\n  LPragma,\n  LBlockComment,\n  LLineComment,\n  LBraceClose,\n  LBraceOpen,\n  LBracketOpen,\n  LUnboxedClose,\n  LSemi,\n  LCppElse,\n  LCpp,\n} Lexed;\n\n#ifdef TREE_SITTER_DEBUG\n\nstatic const char *token_names[] = {\n  \"nothing\",\n  \"eof\",\n  \"where\",\n  \"in\",\n  \"then\",\n  \"else\",\n  \"deriving\",\n  \"module\",\n  \"upper\",\n  \"tick\",\n  \"symop\",\n  \"symop-special\",\n  \"dot-dot\",\n  \"dot-id\",\n  \"dot-symop\",\n  \"dot-open\",\n  \"dollar\",\n  \"bang\",\n  \"tilde\",\n  \"at\",\n  \"percent\",\n  \"hash\",\n  \"bar\",\n  \"arrow\",\n  \"ctr\",\n  \"texp-closer\",\n  \"quote-close\",\n  \"pragma\",\n  \"block-comment\",\n  \"line-comment\",\n  \"brace-close\",\n  \"brace-open\",\n  \"bracket-open\",\n  \"unboxed-close\",\n  \"semi\",\n  \"cpp-else\",\n  \"cpp\",\n};\n\n#endif\n\n/**\n * The current newline mode.\n * `NInit` is set during newline lookahead, and `NProcess` when lookahead has finished.\n * After processing is complete, the state is reset to `NInactive`.\n * `NResume` is a special variant that forces newline lookahead mode when a run starts without requiring a newline.\n * This is used for the beginning of the file and after pragmas (see `pragma`).\n */\ntypedef enum {\n  NInactive,\n  NInit,\n  NProcess,\n  NResume,\n} NewlineState;\n\n/**\n * The two newline modes need to operate across multiple scanner runs and adapt their behavior to the context\n * established by previous runs, encoded by this persistent state.\n */\ntypedef struct {\n  NewlineState state;\n  // The final token encountered after skipping comments and CPP.\n  Lexed end;\n  // The indent of `end`, used to decide layout actions before parsing intermediate extras.\n  uint32_t indent;\n  // When there is no token after extras, we shouldn't start layouts.\n  bool eof;\n  // Prohibit layout semicolons in future runs.\n  bool no_semi;\n  // Prohibit layout semicolons in future runs, but can be relaxed by some actions.\n  // See `explicit_semicolon`.\n  bool skip_semi;\n  // Lookahead has advanced into `end`, so the scanner has to be restarted before processing the newline result.\n  bool unsafe;\n} Newline;\n\n/**\n * The vector for the layout context stack.\n */\ntypedef Array(Context) Contexts;\n\n/**\n * Whenever the lexer is advanced over non-(leading-)whitespace, the consumed character is appended to this vector.\n * This avoids having to ensure that different components that need to examine multiple lookahead characters have to be\n * run in the correct order.\n * Instead, we refer to lookahead by the character's index using the interface described in the section 'Lookahead'.\n *\n * For example, the functions `peek0`, `char0`, `char1` operate on the first/second character relative to the start of\n * the scanner run, and the implementation advances the lexer position when it is necessary.\n *\n * The field `offset` can be used to reset relative indexing to the current lexer position.\n * This is used, for example, in `newline_lookahead`, to perform repeated lexing passes, since `lex` uses the lookahead\n * interface.\n * After processing a `Lexed` token, `newline_lookahead` continues seeking ahead after comments and CPP, and when it\n * encounters the next token, it calls `reset_lookahead` to set `offset` to the current position, ensuring that `lex`\n * can use `char0` to test the following character.\n *\n * The terminology for advancing is:\n * - \"Advance before character C at index N\" means \"`lexer->lookahead` returns C, but 'Lookahead' does not contain C and\n *   has size N\"\n * - \"Advance over character C at index N\" means \"`lexer->lookahead` returns the character following C, 'Lookahead'\n *   contains C and has size N+1\" (or \"advance before N+1\")\n * - If the size of 'Lookahead' is already larger than N, and therefore C can be read from the vector, the\n *   postconditions may not hold (when independent steps access lookahead at different indexes)\n *\n * Example:\n *\n * Assume we are parsing the following line, and the scanner is called right after the `a` in the right-hand side:\n *\n * > calc a b = a Library.Math.** b\n *               ^ (lexer position: before the character above the ^, `lexer->lookahead` returns the space)\n * || 0/0 (content of `data` between bars, empty; `len` after bars, `offset` after slash)\n *\n * 'Lookahead' is initialized with `len = 0` and `offset = 0`.\n *\n * The full lookahead string (stored in tree-sitter's internals) at this position is ` Library.Math.** b`, and all\n * _absolute_ indexes point into that string.\n * Since tree-sitter only exposes the \"next\" character at a time, indexing requires advancing the lexer and copying\n * characters to 'Lookahead' on demand.\n *\n * An initial `skip_space` advances over the space between `a` and `Lib`, which does not update 'Lookahead'.\n *\n * > calc a b = a Library.Math.** b\n *                ^\n * || 0/0\n *\n * The uppercase character in `Lib` triggers the detection of qualified operators in `qualified_op`, which repeatedly\n * lexes module segments and dots.\n *\n * The module segment step starts (in `conid`) by checking that the next character is upper case using `peek0` (short\n * for `peek(0)`), which accesses the _first_ lookahead character – but _first_ is always relative to the current\n * `offset`.\n * We call the relative index `rel` and the absolute one `abs = offset + rel`.\n * Before `Lib`, this translates to `abs = rel = 0`.\n *\n * `peek` checks if 'Lookahead' already contains the character for this index (`abs < len`), so it can directly return\n * the value at `data[abs]`, which fails, since the vector is empty.\n * Instead, it will fetch the character directly from the tree-sitter lexer.\n * The lexer provides one character of lookahead outside of 'Lookahead', which is enough for this case.\n * `peek` is a conservative action, so it will not copy the character to 'Lookahead', and leave the lexer position\n * unchanged.\n *\n * `L` is upper case, so `qualified_op` switches to the next phase: Advancing to the end of the module segment, which\n * amounts to advancing before the first character that is not an identifier character:\n *\n * > advance_while(1, is_inner_id_char)\n *\n * This function applies the specified predicate to the character at the specified index.\n * If that returns `true`, it advances over the character and increments the index.\n * These steps are repeated until the predicate is `false`.\n * The index is returned, pointing to the character after the module segment.\n *\n * `peek0` doesn't modify lookahead, so the next character is still `L`.\n * We don't need to validate it again, so the starting index specified to `advance_while` is `1`.\n *\n * Let's look at the steps performed by this function in detail.\n * It starts by accessing the character at the initial index, calling `peek(1)`.\n * As for the `L` check, this calculates `abs = offset + rel = 0 + 1` and determines that it is smaller than `len`,\n * again.\n * However, this time the requested character is the _second_ lookahead character, so `peek` calls `advance_before(1)`,\n * which calls `advance` as many times as needed to access the character via `lexer->lookahead`, which is\n * `offset + n - len` times, so _once_ in this case.\n * The result is that `L` is copied to 'Lookahead' and `lexer->advance` is invoked one time, resulting in this new\n * state:\n *\n * > calc a b = a Library.Math.** b\n *                 ^\n * || 1/0\n *\n * Now `lexer->lookahead` returns `i`, which `conid` successfully validates as an \"inner ID character\", so it increments\n * the index to 2.\n * `peek(2)` performs the exact same steps as `peek(1)`, as do all subsequent steps until `peek(7)` returns `.`, which\n * fails the predicate, terminating the loop without advancing and returning 7 from `conid`, with the final state:\n *\n * > calc a b = a Library.Math.** b\n *                       ^\n * || 7/0\n *\n * `qualified_op` now examines the returned index:\n * If it is 0, the first character was not upper case and there is no module segment at this position, so lexing fails\n * and the scanner returns control to tree-sitter.\n * Otherwise, it calls `char_at(7, '.')` to require that the character after the module segment is a dot, with the same\n * consequences.\n *\n * Since our test code meets these conditions, `qualified_op` continues with `reset_lookahead_to(8)`.\n * This sets `offset` to 8, causing all future lookahead actions that use relative indexes to operate on characters\n * _after_ this new offset.\n * Here this is the first character after the dot, `M`.\n * Note that modifying the offset does not advance the lexer right away, so the lexer position will remain at 7:\n *\n * > calc a b = a Library.Math.** b\n *                       ^ (zero-based index 7)\n * || 7/8\n *\n * After a dot, `qualified_op` decides what to do next by determining whether what follows is a symbolic operator by\n * calling `symop_lookahead`, which uses the same predicate-based function as before, `advance_while(0, symop_char)`.\n * When that function calls `peek(0)`, the absolute index `offset + 0 = 8` is requested, which is not available, so the\n * lexer is advanced once:\n *\n * > calc a b = a Library.Math.** b\n *                        ^\n * || 8/8\n *\n * Note that `len == 8` means there are eight characters in 'Lookahead', up to and including the dot, while the index\n * `offset == 8` refers to the _ninth_ character, `M`.\n *\n * `M` is not a symop character, so `qualified_op` restarts the loop and parses the next module segment.\n * The process is identical to the previous iteration except for the value of `offset`, which causes all steps that\n * examine relative lookahead with `peek0` and `peek_at` add 8 to each index.\n *\n * Once the second dot is parsed, the symop test will succeed after advancing over both asterisks, which satisfies the\n * termination condition in `qualified_op`, and the scanner run finishes with the final state:\n *\n * > calc a b = a Library.Math.** b\n *                               ^\n * || 15/13\n */\ntypedef struct {\n  int32_t *contents;\n  uint32_t size;\n  uint32_t capacity;\n  uint32_t offset;\n} Lookahead;\n\n/**\n * The state that is persisted across scanner runs.\n *\n * Although 'Lookahead' is always reset when starting a new run, storing it in the state avoids having to allocate and\n * free the array repeatedly.\n * Instead we just reset the `len` attribute to 0 and reuse the previous memory.\n *\n * REVIEW: Can tree-sitter run the scanner concurrently on multiple nodes in the same file in some situations?\n */\ntypedef struct {\n  Contexts contexts;\n  Newline newline;\n  Lookahead lookahead;\n#ifdef TREE_SITTER_DEBUG\n  ParseLines parse;\n#endif\n} State;\n\n/**\n * Transient state and stuff provided by tree-sitter.\n */\ntypedef struct {\n  TSLexer *lexer;\n  const bool *symbols;\n  uint32_t symop;\n  State *state;\n#ifdef TREE_SITTER_DEBUG\n  Debug debug;\n#endif\n} Env;\n\nstatic Env env_new(TSLexer *l, const bool * symbols, State *state) {\n  return (Env) {\n    .lexer = l,\n    .symbols = symbols,\n    .symop = 0,\n    .state = state,\n#ifdef TREE_SITTER_DEBUG\n    .debug = debug_new(l),\n#endif\n  };\n}\n\nstatic void reset_newline(Env *env) { memset(&env->state->newline, 0, sizeof(Newline)); }\n\nstatic bool newline_active(Env *env) { return env->state->newline.state == NInit || env->state->newline.state == NProcess; }\n\nstatic bool newline_init(Env *env) { return env->state->newline.state == NInit; }\n\n// --------------------------------------------------------------------------------------------------------\n// Lexer interaction\n// --------------------------------------------------------------------------------------------------------\n\nstatic bool is_eof(Env *env) { return env->lexer->eof(env->lexer); }\n\nstatic bool not_eof(Env *env) { return !(is_eof(env)); }\n\n/**\n * The parser's position in the current line.\n * Note: This is expensive to use.\n */\nstatic uint32_t column(Env *env) {\n  return is_eof(env) ? 0 : env->lexer->get_column(env->lexer);\n}\n\n/**\n * tree-sitter's lexer interface maintains a current position that determines the lookahead character and the range of\n * text that is associated with the symbol selected by the scanner, if `mark_end` is called.\n *\n * It's not possible to read earlier characters once the lexer has advanced over them, so this function appends the\n * lookahead character to the array `lookahead` in the `State`.\n *\n * Don't add zeroes to the lookahead buffer when hitting EOF – it causes `no_lookahead` to report false negatives.\n */\nstatic void advance(Env *env) {\n  if (not_eof(env)) {\n    array_push(&env->state->lookahead, PEEK);\n    env->lexer->advance(env->lexer, false);\n  }\n}\n\nstatic bool set_result_symbol(Env *env, Symbol result) {\n  if (result != FAIL) {\n    env->lexer->result_symbol = (TSSymbol) result;\n    return true;\n  }\n  return false;\n}\n\n#ifdef TREE_SITTER_DEBUG\n\nstatic void mark_debug(Env *env, const char *restrict marked_by) {\n  dbg(\"mark: %s\\n\", marked_by);\n  env->debug.marked = (int) column(env);\n  env->debug.marked_line = 0;\n  env->debug.marked_by = marked_by;\n  env->lexer->mark_end(env->lexer);\n}\n\nstatic void append_parse_buffer(Env *env);\n\nstatic void advance_debug(Env *env) {\n  append_parse_buffer(env);\n  advance(env);\n}\n\nstatic void skip_debug(Env *env) {\n  append_parse_buffer(env);\n  env->lexer->advance(env->lexer, true);\n}\n\n#endif\n\n/**\n * `inline` has a noticeable impact, reaching parity with a macro.\n */\nstatic inline bool valid(Env *env, Symbol s) { return env->symbols[s]; }\n\n// --------------------------------------------------------------------------------------------------------\n// Symbol constructors\n// --------------------------------------------------------------------------------------------------------\n\nstatic Symbol finish(Symbol s, const char *restrict desc) {\n  // Suppress unused param warning\n  (void) desc;\n  dbg(\"finish: %s\\n\", desc);\n  return s;\n}\n\nstatic Symbol finish_if_valid(Env *env, Symbol s, const char *restrict desc) {\n  if (valid(env, s)) return finish(s, desc);\n  return FAIL;\n}\n\nstatic Symbol finish_marked(Env *env, Symbol s, const char *restrict desc) {\n  (void) desc;\n  MARK(desc);\n  return s;\n}\n\nstatic Symbol update_state(const char *restrict desc) {\n  return finish(UPDATE, desc);\n}\n\n// --------------------------------------------------------------------------------------------------------\n// Lookahead\n// --------------------------------------------------------------------------------------------------------\n\n/**\n * Ensure that at least `abs + 1` characters are present in the lookahead buffer by calling `advance` `len - abs + 1`\n * times.\n */\nstatic void advance_over_abs(Env *env, uint32_t abs) {\n  for (uint32_t i = env->state->lookahead.size; i <= abs; i++) S_ADVANCE;\n}\n\n/**\n * Ensure that at least `rel` characters after and including the current `offset` are present in the lookahead buffer by\n * calling `advance` as often as the difference between the desired index (`offset + rel`) and one less than the current\n * buffer size.\n *\n * Note: The character at the offset is included in the range, so that when `len == offset == rel == 0`, this function\n * advances once, over the character at index 0.\n */\nstatic void advance_over(Env *env, uint32_t rel) {\n  advance_over_abs(env, env->state->lookahead.offset + rel);\n}\n\n/**\n * Skip whitespace relative to `offset`, but keep characters that have already been copied to the buffer.\n *\n * Example:\n *\n * > a = b\n *    ^\n *\n * Assume step A sets `offset` to 1, pointing to the first space.\n * Step B calls `peek1`, to look at the `=`. This needs to advance over the space, which is copied to the lookahead\n * buffer, causing `lexer->lookahead` to return `=`.\n * Step C then calls `peek0`, sees that it is a space, and requests that it be skipped. Since it is already in the\n * buffer, calling `lexer-advance` would skip the wrong character.\n *\n * Hence, this function only skips indexes larger than the lookahead buffer's `len`.\n *\n * Additionally, if `offset` has been set to a position outside of the buffer, all characters up to that index are\n * copied to the buffer beforehand.\n */\nstatic void skip_over(Env *env, uint32_t rel) {\n  Lookahead *l = &env->state->lookahead;\n  // Subtraction is safe because the condition establishes that `offset` is at least 1\n  if (l->offset > l->size) advance_over_abs(env, l->offset - 1);\n  uint32_t abs = l->offset + rel;\n  for (uint32_t i = env->state->lookahead.size; i <= abs; i++) S_SKIP;\n}\n\n/**\n * Ensure that the lookahead buffer is large enough to allow reading the `n`th character.\n * Since `lexer->lookahead` points at the character after the buffer, it must have `offset + n - 1` elements.\n */\nstatic void advance_before(Env *env, uint32_t rel) {\n  uint32_t abs = env->state->lookahead.offset + rel;\n  if (abs > 0) advance_over_abs(env, abs - 1);\n}\n\n/**\n * Return the lookahead character with index `n`.\n * If the index is larger than the lookahead buffer, return 0.\n *\n * Unsafe insofar as that it does not advance if the index points outside of the lookahead buffer.\n * This may happen in regular operation when a tool like `seq` attempts to look beyond EOF.\n */\nstatic int32_t unsafe_peek_abs(Env *env, uint32_t abs) {\n  return\n    abs < env->state->lookahead.size ?\n    env->state->lookahead.contents[abs] :\n    0;\n}\n\n/**\n * Return the lookahead character with index `offset + n`.\n * See `unsafe_peek_abs`.\n */\nstatic int32_t unsafe_peek(Env *env, uint32_t rel) {\n  return unsafe_peek_abs(env, env->state->lookahead.offset + rel);\n}\n\n#ifdef TREE_SITTER_DEBUG\n\nstatic void debug_peek(Env *env, uint32_t rel) {\n  uint32_t abs = env->state->lookahead.offset + rel;\n  dbg(\"peek \");\n  if (env->state->lookahead.offset > 0) dbg(\"%u->\", env->state->lookahead.offset);\n  dbg(\"%u\", rel);\n  if (abs < env->state->lookahead.size)\n    dbg(\" cached | len: %u\", env->state->lookahead.size);\n  else if (abs > env->state->lookahead.size)\n    dbg(\" advance | len: %u\", env->state->lookahead.size);\n  dbg(\"\\n\");\n}\n\n#endif\n\n/**\n * Return the lookahead character with index `offset + rel`.\n * If the character is not accessible, advance the position until it is.\n *\n * This \"peeks\" insofar as it doesn't advance over the requested character – `peek(0)` is equivalent to\n * `lexer->lookahead` if `offset == 0`.\n */\nstatic int32_t peek(Env *env, uint32_t rel) {\n#ifdef TREE_SITTER_DEBUG\n  debug_peek(env, rel);\n#endif\n  if (env->state->lookahead.offset + rel < env->state->lookahead.size) return unsafe_peek(env, rel);\n  else {\n    advance_before(env, rel);\n    return PEEK;\n  }\n}\n\n/**\n * Return the first lookahead character after the `offset` without advancing the position.\n */\nstatic int32_t peek0(Env *env) { return peek(env, 0); }\n\n/**\n * Return the second lookahead character after the `offset` without advancing the position further than the first\n * character.\n */\nstatic int32_t peek1(Env *env) { return peek(env, 1); }\n\n/**\n * Return the third lookahead character after the `offset` without advancing the position further than the second\n * character.\n */\nstatic int32_t peek2(Env *env) { return peek(env, 2); }\n\n/**\n * Test the lookahead character at index `offset + n` for equality.\n */\nstatic bool char_at(Env *env, uint32_t n, int32_t c) {\n  return peek(env, n) == c;\n}\n\n/**\n * Test the lookahead character at index `offset` for equality.\n */\nstatic bool char0(Env *env, int32_t c) {\n  return char_at(env, 0, c);\n}\n\n/**\n * Test the lookahead character at index `offset + 1` for equality.\n */\nstatic bool char1(Env *env, int32_t c) {\n  return char_at(env, 1, c);\n}\n\n/**\n * Test the lookahead character at index `offset + 2` for equality.\n */\nstatic bool char2(Env *env, int32_t c) {\n  return char_at(env, 2, c);\n}\n\n/**\n * Set the offset to `index`, so that the indexes in future calls to lookahead functions like `char0` are interpreted\n * relative to this new value.\n *\n * Resets `symop` for soundness, even though no rule would continue after advancing over symbolic characters.\n *\n * See 'Lookahead' for an example.\n */\nstatic void reset_lookahead_abs(Env *env, uint32_t abs) {\n  dbg(\"reset: %u\\n\", abs);\n  env->state->lookahead.offset = abs;\n  env->symop = 0;\n}\n\nstatic void reset_lookahead_to(Env *env, uint32_t rel) {\n  reset_lookahead_abs(env, env->state->lookahead.offset + rel);\n}\n\n/**\n * Move `offset` to the end of the consumed lookahead, causing `peek`, `char0` etc. to operate on characters following\n * the current position at the time this function is executed.\n */\nstatic void reset_lookahead(Env *env) {\n  reset_lookahead_abs(env, env->state->lookahead.size);\n}\n\n/**\n * Return whether the lookahead position has been advanced since starting the run, not considering skipped characters\n * (which are usually whitespace).\n * This is important to decide whether the scanner has to be restarted to emit certain symbols.\n *\n * For example, before starting layouts and generating layout semicolons after newlines, we skip whitespace and mark, so\n * that subsequent symbols start at their non-whitespace boundary instead of before the newline(s).\n * When newline lookahead mode finishes, it can continue directly with this step _only if_ no non-whitespace characters\n * were consumed, otherwise they would be included in the semicolon symbol.\n * We also cannot unconditionally mark after whitespace in newline lookahead mode since there are several potential\n * symbols that can be emitted before skipped whitespace is marked, like layout end, which should not extend beyond\n * newlines.\n */\nstatic bool no_lookahead(Env *env) {\n  return env->state->lookahead.size == 0;\n}\n\n/**\n * Return the column of the first lookahead character of the current run.\n * This is needed for starting layouts in interior mode, since we don't count positions across interior runs.\n */\nstatic uint32_t start_column(Env *env) {\n  return column(env) - env->state->lookahead.size;\n}\n\n/**\n * Increment `i` while the predicate is true for the lookahead character at that index (relative to `offset`), advancing\n * the position when `i` points beyond the end of the lookahead buffer.\n * Return the index after the last matching character.\n */\nstatic uint32_t advance_while(Env *env, uint32_t i, bool (*pred)(int32_t)) {\n  while (pred(peek(env, i))) { i++; }\n  return i;\n}\n\n/**\n * Same as `advance_while`, using \"not equal to `c`\" for the predicate.\n * Stops at EOF.\n */\nstatic uint32_t advance_until_char(Env *env, uint32_t i, int32_t c) {\n  while (not_eof(env) && !char_at(env, i, c)) { i++; }\n  return i;\n}\n\n// --------------------------------------------------------------------------------------------------------\n// Context manipulation and conditions\n// --------------------------------------------------------------------------------------------------------\n\nstatic bool has_contexts(Env *env) { return env->state->contexts.size != 0; }\n\n/**\n * Push a layout context onto the stack.\n */\nstatic void push_context(Env *env, ContextSort sort, uint32_t indent) {\n  dbg(\"push: %s %d\\n\", context_names[sort], indent);\n  Context ctx = (Context) {.sort = sort, .indent = indent};\n  array_push(&env->state->contexts, ctx);\n}\n\n/**\n * Remove a layout context from the stack.\n */\nstatic void pop(Env *env) {\n  if (has_contexts(env)) {\n\tdbg(\"pop: %s\\n\", context_names[array_back(&env->state->contexts)->sort]);\n\tarray_pop(&env->state->contexts);\n  }\n}\n\nstatic ContextSort current_context(Env *env) {\n  return has_contexts(env) ? array_back(&env->state->contexts)->sort : NoContext;\n}\n\nstatic bool is_layout_context(Env *env) {\n  return current_context(env) < Braces;\n}\n\n/**\n * Decide whether the current context requires generation of layout semicolons.\n * This is true for all layout contexts except for multi-way if, since that uses `|` to start layout elements.\n */\nstatic bool is_semicolon_context(Env *env) {\n  return current_context(env) < MultiWayIfLayout;\n}\n\n/**\n * Return the indent of the innermost layout context.\n * If there are non-layout contexts at the top of the stack, search downwards.\n */\nstatic uint32_t current_indent(Env *env) {\n  for (int32_t i = (int32_t) env->state->contexts.size - 1; i >= 0; i--) {\n\tContext *cur = array_get(&env->state->contexts, i);\n    if (cur->sort < Braces) return cur->indent;\n  }\n  return 0;\n}\n\nstatic bool indent_less(Env *env, uint32_t indent) {\n  return is_layout_context(env) && indent < current_indent(env);\n}\n\nstatic bool indent_lesseq(Env *env, uint32_t indent) {\n  return is_layout_context(env) && indent <= current_indent(env);\n}\n\nstatic bool top_layout(Env *env) {\n  return env->state->contexts.size == 1;\n}\n\nstatic bool in_module_header(Env *env) {\n  return current_context(env) == ModuleHeader;\n}\n\n/**\n * Return the appropriate symbol to close the given context, or FAIL if it can't be closed.\n */\nstatic Symbol context_end_sym(ContextSort s) {\n  switch (s) {\n    case TExp:\n      return END_TEXP;\n    case Braces:\n      return END_BRACE;\n    default:\n      return s < Braces ? END : FAIL;\n  }\n}\n\n// --------------------------------------------------------------------------------------------------------\n// Character and lookahead conditions\n// --------------------------------------------------------------------------------------------------------\n\n#define NEWLINE_CASES \\\n  case '\\n': \\\n  case '\\r': \\\n  case '\\f'\n\n\nstatic bool is_newline(int32_t c) {\n  switch (c) {\n    NEWLINE_CASES:\n      return true;\n    default:\n      return false;\n  }\n}\n\nstatic bool varid_start_char(const int32_t c) { return c == '_' || is_varid_start_char(c); }\n\n// TODO This should be combined with is_inner_id_char and made more explicit about when which char can occur.\n// For example, lex_symop uses this to decide about prefix dot being a field selector, where single quotes aren't valid.\nstatic bool is_id_char(const int32_t c) {\n  return c == '_' || c == '\\'' || is_identifier_char(c);\n}\n\n// TODO hashes only work at the end of identifiers\nstatic bool is_inner_id_char(const int32_t c) {\n  return is_id_char(c) || c == '#';\n}\n\nstatic bool quoter_char(const int32_t c) { return is_id_char(c) || c == '.'; }\n\nstatic bool reserved_symbolic(const int32_t c) {\n  switch (c) {\n    case '(':\n    case ')':\n    case ',':\n    case ';':\n    case '[':\n    case ']':\n    case '`':\n    case '{':\n    case '}':\n    case '\"':\n    case '\\'':\n    case '_':\n      return true;\n    default: return false;\n  }\n}\n\nstatic bool symop_char(const int32_t c) {\n  return is_symop_char(c) && !reserved_symbolic(c);\n}\n\n/**\n * Advance the position to the first character that's not valid for a symbolic operator, and return that position.\n * If the function has been called before, directly return the cached position.\n *\n * This consumes the entire symop, since the field denotes the length of the string and therefore the last (failing)\n * peek is _beyond_ the end, consuming the last valid char.\n */\nstatic uint32_t symop_lookahead(Env *env) {\n  if (env->symop == 0) {\n    env->symop = advance_while(env, 0, symop_char);\n    if (env->symop > 0)\n      dbg(\"symop: %d, %.*ls\\n\", env->symop, env->symop, env->state->lookahead.contents + env->state->lookahead.offset);\n  }\n  return env->symop;\n}\n\nstatic bool is_symop(Env *env) {\n  return symop_lookahead(env) > 0;\n}\n\n/**\n * The parser calls `scan` with all symbols declared as valid directly after it encountered an error.\n * The symbol `FAIL` is not used in the grammar, so it can only be valid in this error case.\n */\n\nstatic bool after_error(Env *env) { return valid(env, FAIL); }\n\n// --------------------------------------------------------------------------------------------------------\n// Debug printing\n// --------------------------------------------------------------------------------------------------------\n\n#ifdef TREE_SITTER_DEBUG\n\nstatic void push_parse_buffer_line(Env *env) {\n  ParseLine new_line = array_new();\n  array_reserve(&new_line, 1);\n  array_push(&env->state->parse, new_line);\n}\n\nstatic ParseLine *ensure_parse_buffer(Env *env) {\n  ParseLines *buffer = &env->state->parse;\n  if (buffer->size == 0) push_parse_buffer_line(env);\n  if (is_newline(PEEK)) push_parse_buffer_line(env);\n  return array_back(buffer);\n}\n\nstatic void append_parse_buffer(Env *env) {\n  ParseLine *current_line = ensure_parse_buffer(env);\n  if (is_newline(PEEK)) {\n    env->debug.marked_line++;\n    env->debug.start_line++;\n  }\n  else if (column(env) >= current_line->size) array_push(current_line, PEEK);\n}\n\nstatic void fill_parse_buffer(Env *env) {\n  env->debug.end_col = column(env);\n  while (!(is_newline(PEEK) || is_eof(env))) S_ADVANCE;\n}\n\nstatic bool seq(Env *env, const char *restrict s);\n\nstatic void print_lookahead(Env *env) {\n  dbg(\"lookahead: %.*ls\\n\", env->state->lookahead.size, env->state->lookahead.contents);\n}\n\nstatic const char * space = \"<space>\";\nstatic const char * newline_char = \"\\\\n\";\n\nstatic const char * show_char(int32_t c) {\n  switch (c) {\n    NEWLINE_CASES:\n      return newline_char;\n    case ' ':\n    case '\\t':\n    case '\\v':\n      return space;\n    default:\n      return NULL;\n  }\n}\n\nstatic void print_lookahead_chars_from(Env *env, uint32_t start) {\n  if (start < env->state->lookahead.size) {\n    dbg(\"lookahead from %d: \", start);\n    for (; start < env->state->lookahead.size; start++) {\n      int32_t c = env->state->lookahead.contents[start];\n      const char * s = show_char(c);\n      if (s == NULL) dbg(\"%lc\", c);\n      else dbg(\"%s\", s);\n    }\n    dbg(\"\\n\");\n  }\n  else\n    dbg(\"print_lookahead_chars_from: Too large (%d / %d)\", start, env->state->lookahead.size);\n}\n\nstatic void debug_contexts(Env *env) {\n  if (env->state->contexts.size == 0) dbg(\"empty\");\n  bool empty = true;\n  for (size_t i = 0; i < env->state->contexts.size; i++) {\n    if (!empty) dbg(\"-\");\n\tContext ctx = *array_get(&env->state->contexts, i);\n    if (ctx.sort == ModuleHeader) dbg(\"pre\");\n    else if (ctx.sort == Braces) dbg(\"brace\");\n    else if (ctx.sort == TExp) dbg(\"texp\");\n    else {\n      if (ctx.sort == DoLayout) dbg(\"do \");\n      else if (ctx.sort == LetLayout) dbg(\"let \");\n      else if (ctx.sort == CaseLayout) dbg(\"case \");\n      else if (ctx.sort == MultiWayIfLayout) dbg(\"if \");\n      else if (ctx.sort == QuoteLayout) dbg(\"quote \");\n      dbg(\"%d\", ctx.indent);\n    }\n    empty = false;\n  }\n}\n\nvoid debug_newline(Env *env) {\n  switch (env->state->newline.state) {\n    case NInactive:\n      dbg(\"no\");\n      break;\n    case NInit:\n      dbg(\"init\");\n      break;\n    case NProcess:\n      dbg(\"process\");\n      break;\n    case NResume:\n      dbg(\"resume\");\n      break;\n  }\n  if (env->state->newline.state != NInactive) dbg(\" %d %s\", env->state->newline.indent, token_names[env->state->newline.end]);\n  if (env->state->newline.eof) dbg(\" [eof]\");\n  if (env->state->newline.no_semi) dbg(\" [no_semi]\");\n  if (env->state->newline.skip_semi) dbg(\" [skip_semi]\");\n  if (env->state->newline.unsafe) dbg(\" [unsafe]\");\n}\n\n/**\n * Produce a comma-separated string of valid symbols.\n */\nstatic void debug_valid(Env *env, const bool *syms) {\n  if (after_error(env)) {\n    dbg(\"all\");\n    return;\n  }\n  bool fst = true;\n  for (Symbol i = FAIL; i <= UPDATE; i++) {\n    if (syms[i]) {\n      if (!fst) dbg(\",\");\n      dbg(\"%s\", sym_names[i]);\n      fst = false;\n    }\n  }\n}\n\nstatic bool debug_init(Env *env) {\n  setlocale(LC_ALL, \"C.UTF-8\");\n  dbg(\"\\n\");\n  dbg(\"state:\\n  syms = \");\n  debug_valid(env, env->symbols);\n  dbg(\"\\n  contexts = \");\n  debug_contexts(env);\n  dbg(\"\\n  newline = \");\n  debug_newline(env);\n  dbg(\"\\n\");\n  return false;\n}\n\nvoid sgr(const char *restrict code) {\n  dbg(\"\\x1b[%sm\", code);\n}\n\nvoid color(unsigned c) {\n  char code[3];\n  sprintf(code, \"3%d\", c);\n  sgr(code);\n}\n\nvoid palette() {\n  color(4);\n  dbg(\"before\");\n  color(2);\n  dbg(\"  marked\");\n  color(3);\n  dbg(\"  advanced\");\n  color(5);\n  dbg(\"  lookahead\");\n  sgr(\"\");\n  dbg(\"\\n\");\n}\n\nstatic bool debug_parse_metadata = false;\n\nstatic void dump_parse_metadata(Env *env) {\n  Debug *debug = &env->debug;\n  dbg(\n      \"lines: %d | start_line: %d | start_col: %d | marked_line: %d | marked: %d | end_col: %d | persist lines: %d\\n\",\n      env->state->parse.size,\n      debug->start_line,\n      debug->start_col,\n      debug->marked_line,\n      debug->marked,\n      debug->end_col,\n      env->state->parse.size - debug->marked_line\n  );\n}\n\n/**\n * Note: We're printing individual characters here instead of using a format with precision like `%.*ls` and slicing\n * the buffer, because:\n * - The buffer contains wide characters, but `fprintf` counts bytes\n * - `fwprintf` counts wide characters, but can't be interleaved with `fprintf`, so we'd have to use that function, and\n *   therefore wide literals, everywhere, which is tedious\n */\nvoid debug_parse(Env *env) {\n  Debug *debug = &env->debug;\n  ParseLines *buffer = &env->state->parse;\n  uint32_t lines = buffer->size;\n  dbg(\"-----------------------\\n\");\n  // For investigating mistakes in the debugging code.\n  if (debug_parse_metadata) dump_parse_metadata(env);\n  if (lines > 0) {\n    color(4);\n    for (uint32_t i = 0; i < lines; i++) {\n\t  ParseLine *line = array_get(buffer, i);\n      int32_t *buf = line->contents;\n      if (line->contents == NULL) break;\n      uint32_t pos = 0;\n\n      if (debug->start_line == lines - 1 - i) {\n        while (pos < debug->start_col) { dbg(\"%lc\", buf[pos]); pos++; }\n        color(2);\n      }\n\n      if (debug->marked >= 0 && debug->marked_line == lines - 1 - i) {\n        while ((int) pos < debug->marked) { dbg(\"%lc\", buf[pos]); pos++; }\n        color(3);\n      }\n\n      if (i == lines - 1) {\n        while (pos < debug->end_col) { dbg(\"%lc\", buf[pos]); pos++; }\n        color(5);\n      }\n\n      while (pos < line->size) { dbg(\"%lc\", buf[pos]); pos++; }\n\n      dbg(\"\\n\");\n    }\n    sgr(\"\");\n  }\n  dbg(\"-----------------------\\n\");\n}\n\nstatic unsigned serialize_parse_lines(char *cursor, ParseLines *parse, unsigned to_copy) {\n  for (unsigned i = 0; i < parse->size; i++) {\n\tParseLine *line = array_get(parse, i);\n    unsigned line_size = line->size * sizeof(uint32_t);\n    to_copy += line_size + sizeof(uint32_t);\n    if (to_copy > TREE_SITTER_SERIALIZATION_BUFFER_SIZE) return 0;\n    *((uint32_t *) cursor) = line->size;\n    cursor += sizeof(line->size);\n    memcpy(cursor, line->contents, line_size);\n    cursor += line_size;\n  }\n  return to_copy;\n}\n\nstatic void deserialize_parse_lines(const char *cursor, ParseLines *parse, uint32_t size) {\n  // Ensure ParseLines has room for at _least_ as many lines as the new state\n  array_reserve(parse, size);\n  for (unsigned i = 0; i < size; i++) {\n\tif (i >= parse->size) { array_push(parse, (ParseLine)array_new()); }\n    ParseLine *line = &parse->contents[i];\n    uint32_t line_len = *((uint32_t *) cursor);\n    cursor += sizeof(uint32_t);\n    array_reserve(line, line_len);\n    line->size = line_len;\n    unsigned line_size = line->size * sizeof(uint32_t);\n    memcpy(line->contents, cursor, line_size);\n    cursor += line_size;\n  }\n  // Free the excessive lines in the previous since we can't check in the next round whether there was a line in\n  // a slot before and reuse the pointer.\n  // This only happens when we didn't push any lines above, which would reset parse->len to len.\n  for (unsigned i = parse->size; i > size; i--) { array_delete(array_get(parse, i - 1)); }\n  // Truncate ParseLines in case the new state has fewer lines\n  parse->size = size;\n}\n\nvoid debug_finish(Env *env, Symbol result) {\n  dbg(\"result: \");\n  if (result) dbg(\"%s, \", sym_names[result]);\n  else dbg(\"<skipped>, \");\n  if (env->debug.marked == -1) dbg(\"%d\", column(env));\n  else dbg(\"%s@%d\", env->debug.marked_by, env->debug.marked);\n  dbg(\"\\n\\n\");\n  fill_parse_buffer(env);\n  debug_parse(env);\n  env->state->parse.size -= env->debug.marked_line;\n}\n\n#endif\n\n// --------------------------------------------------------------------------------------------------------\n// Lookahead\n// --------------------------------------------------------------------------------------------------------\n\n/**\n * Check if lookahead contains the string `s` starting at position `offset + start`.\n * This advances only over matching characters.\n */\nstatic bool seq_from(Env *env, const char *restrict s, uint32_t start) {\n  uint32_t len = (uint32_t) strlen(s);\n  for (uint32_t i = 0; i < len; i++) {\n    int32_t c = s[i];\n    int32_t c2 = peek(env, start + i);\n    if (c != c2) return false;\n  }\n  peek(env, start + len);\n  return true;\n}\n\n/**\n * Check if lookahead contains the string `s` starting at position `offset`.\n */\nstatic bool seq(Env *env, const char *restrict s) {\n  return seq_from(env, s, 0);\n}\n\n/**\n * Advance until the next newline or EOF, used to consume the body of a comment.\n */\nstatic void take_line(Env *env) {\n  while (not_eof(env) && !is_newline(PEEK)) S_ADVANCE;\n}\n\nstatic bool is_space_or_tab(int32_t c) {\n  return c == ' ' || c == '\\t';\n}\n\n/**\n * Advance until the next newline or EOF, used to consume the body of a cpp directive.\n * Escaped newlines are treated as line continuations, which allow spaces and tabs between backslash and newline.\n */\nstatic void take_line_escaped_newline(Env *env) {\n  for (;;) {\n    while (not_eof(env) && !is_newline(PEEK) && PEEK != '\\\\') S_ADVANCE;\n    if (PEEK == '\\\\') {\n      S_ADVANCE;\n      if (is_space_or_tab(PEEK)) {\n        while (is_space_or_tab(PEEK)) S_ADVANCE;\n        if (is_newline(PEEK)) S_ADVANCE;\n      }\n      else S_ADVANCE;\n    }\n    else return;\n  }\n}\n\n/**\n * Skip the lexer until the following character is neither space nor tab.\n * Return whether any characters were skipped.\n */\nstatic bool skip_space(Env *env) {\n  if (!is_space_char(PEEK)) return false;\n  S_SKIP;\n  while(is_space_char(PEEK)) S_SKIP;\n  return true;\n}\n\n/**\n * Skip the lexer until the following character is not a newline.\n * Return whether any characters were skipped.\n */\nstatic bool skip_newlines(Env *env) {\n  if (!is_newline(PEEK)) return false;\n  S_SKIP;\n  while(is_newline(PEEK)) S_SKIP;\n  return true;\n}\n\ntypedef enum {\n  NoSpace,\n  Indented,\n  BOL,\n} Space;\n\n/**\n * Alternate between skipping space and newlines, and return which was seen last.\n * This does not use the lookahead buffer, but directly accesses the lexer.\n * Only to be used when it is certain that no whitespace has been copied to the buffer by previous steps, and that no\n * previous characters should be included in the range of non-zero-width symbol.\n */\nstatic Space skip_whitespace(Env *env) {\n  Space space = NoSpace;\n  while (true) {\n    if (skip_space(env)) space = Indented;\n    else if (skip_newlines(env)) space = BOL;\n    else return space;\n  };\n}\n\n/**\n * Advance the lexer until the following character is neither space nor tab, starting at position `offset + start`, and\n * return the index of the next character.\n */\nstatic uint32_t take_space_from(Env *env, uint32_t start) {\n  return advance_while(env, start, is_space_char);\n}\n\n/**\n * Ensure that the character after a keyword like `module` is not a character that would change its meaning to be an\n * identifier.\n */\nstatic bool token_end(int32_t c) { return !is_inner_id_char(c); }\n\n/**\n * Check if lookahead contains the string `s` starting at position `offset + start`, followed by a non-id character.\n * See `seq`.\n */\nstatic bool token_from(Env *env, const char *restrict s, uint32_t start) {\n  return seq_from(env, s, start) && token_end(peek(env, start + (uint32_t) strlen(s)));\n}\n\n/**\n * `token_from` at the current offset.\n */\nstatic bool token(Env *env, const char *restrict s) {\n  return seq(env, s) && token_end(peek(env, (uint32_t) strlen(s)));\n}\n\n/**\n * Check if lookahead contains any of the strings in `tokens` starting at position `offset + start`, followed by a\n * non-id character.\n */\nstatic bool any_token_from(Env *env, size_t n, const char * tokens[], uint32_t start) {\n  for (size_t i = 0; i < n; i++) {\n    if (token_from(env, tokens[i], start)) return true;\n  }\n  return false;\n}\n\nstatic bool match_symop(Env *env, const char *restrict target) {\n  return symop_lookahead(env) == strlen(target) && seq(env, target);\n}\n\nstatic bool uninitialized(Env *env) { return !has_contexts(env); }\n\nstatic uint32_t conid(Env *env) {\n  if (!is_conid_start_char(peek0(env))) return 0;\n  return advance_while(env, 1, is_inner_id_char);\n}\n\ntypedef enum {\n  NoQualifiedName,\n  QualifiedTarget,\n  QualifiedConid,\n} QualifiedName;\n\nstatic QualifiedName qualified_name(Env *env, bool (*name)(Env *)) {\n  bool qualified = false;\n  while (true) {\n    uint32_t end = conid(env);\n    if (end == 0) break;\n    if (!char_at(env, end, '.')) {\n      if (qualified) return QualifiedConid;\n      else break;\n    }\n    qualified = true;\n    reset_lookahead_to(env, end + 1);\n    if (name(env)) return true;\n  }\n  return NoQualifiedName;\n}\n\n/**\n * Use the lookahead buffer to determine whether a character is escaped, by counting the number of backslashes.\n */\nstatic bool odd_backslashes_before(Env *env, int32_t index) {\n  bool odd = false;\n  while (index >= 0 && peek(env, (uint32_t) index) == '\\\\') {\n    odd = !odd;\n    index--;\n  }\n  return odd;\n}\n\n/**\n * Advance before the next unescaped double quote.\n */\nstatic uint32_t take_string_literal(Env *env) {\n  uint32_t end = 1;\n  while (true) {\n    end = advance_until_char(env, end, '\"') + 1;\n    if (is_eof(env) || !odd_backslashes_before(env, (int) end - 2)) return end;\n  }\n}\n\n/**\n * Advance before the single quote that validly ends a character literal.\n * If there is none, return 1.\n * Either the first character is a backslash, or the second character is a single quote.\n *\n * A single quote followed by backslash is a char unless it was part of a varid, in which case the backslash is a\n * lambda.\n * The caller must make sure to lex varids beforehand.\n */\nstatic uint32_t take_char_literal(Env *env) {\n  if (char1(env, '\\\\')) return advance_until_char(env, 2, '\\'') + 2;\n  else return char_at(env, 2, '\\'') ? 3 : 1;\n}\n\n// --------------------------------------------------------------------------------------------------------\n// Lookahead: CPP\n// --------------------------------------------------------------------------------------------------------\n\ntypedef enum {\n  CppNothing,\n  CppStart,\n  CppElse,\n  CppEnd,\n  CppOther,\n} CppDirective;\n\nstatic const char *cpp_tokens_start[3] = {\n  \"if\",\n  \"ifdef\",\n  \"ifndef\",\n};\n\nstatic bool cpp_cond_start(Env *env, uint32_t start) {\n  return any_token_from(env, 3, cpp_tokens_start, start);\n}\n\nstatic const char *cpp_tokens_else[4] = {\n  \"else\",\n  \"elif\",\n  \"elifdef\",\n  \"elifndef\",\n};\n\nstatic bool cpp_cond_else(Env *env, uint32_t start) {\n  return any_token_from(env, 4, cpp_tokens_else, start);\n}\n\nstatic bool cpp_cond_end(Env *env, uint32_t start) { return token_from(env, \"endif\", start); }\n\nstatic const char *cpp_tokens_other[7] = {\n  \"define\",\n  \"undef\",\n  \"include\",\n  \"pragma\",\n  \"error\",\n  \"warning\",\n  \"line\",\n};\n\nstatic bool cpp_directive_other(Env *env, uint32_t start) {\n  return\n    any_token_from(env, 7, cpp_tokens_other, start)\n    ||\n    // A hash followed by nothing but whitespace is CPP.\n    // If non-whitespace follows whitespace, it is a parse error, unless we're in a brace layout; then it is a varsym.\n    // Complete overkill to parse this, but eh!\n    is_newline(peek(env, start))\n    ||\n    // shebang for scripts\n    (char1(env, '!') && uninitialized(env))\n    ;\n}\n\n/**\n * If the first character at `offset` is a hash, skip space and try all tokens that start a CPP directive.\n * Return the matching variant of the enum `CppDirective`.\n */\nstatic CppDirective cpp_directive(Env *env) {\n  if (!char0(env, '#')) return CppNothing;\n  uint32_t start = take_space_from(env, 1);\n  if (cpp_cond_start(env, start)) return CppStart;\n  else if (cpp_cond_else(env, start)) return CppElse;\n  else if (cpp_cond_end(env, start)) return CppEnd;\n  else if (cpp_directive_other(env, start)) return CppOther;\n  else return CppNothing;\n}\n\n// --------------------------------------------------------------------------------------------------------\n// Starting layouts\n// --------------------------------------------------------------------------------------------------------\n\n/**\n * Opening and closing braces are always followed by a command (`grammar/util.js`), so this can unconditionally push a\n * context.\n * See `grammar/externals.js` for more.\n *\n * Note: This is not related to regular brace layouts, which are handled by `start_layout`!\n * Aside from layouts, braces are also used for records and inferred type variables, where indentation is also ignored!\n * Therefore, we add a context to skip steps like semicolon generation.\n *\n * Check out some examples in the tests:\n * - data: record zero indent\n * - type decl: inferred quantifier at column 0\n */\nstatic Symbol start_brace(Env *env) {\n  if (valid(env, START_BRACE)) {\n    push_context(env, Braces, 0);\n    return finish(START_BRACE, \"start_brace\");\n  }\n  return FAIL;\n}\n\n/**\n * See `start_brace`.\n */\nstatic Symbol end_brace(Env *env) {\n  if (valid(env, END_BRACE) && current_context(env) == Braces) {\n    pop(env);\n    return finish(END_BRACE, \"end_brace\");\n  }\n  return FAIL;\n}\n\n/**\n * Return the first valid layout start symbol.\n */\nstatic Symbol valid_layout_start_sym(Env *env) {\n  for (Symbol i = START; i < END; i++) {\n    if (valid(env, i)) return i;\n  }\n  return FAIL;\n}\n\n/**\n * Map `Symbol` to `ContextSort`.\n */\nstatic ContextSort layout_sort(Symbol s) {\n  switch (s) {\n    case START_DO:\n      return DoLayout;\n    case START_CASE:\n      return CaseLayout;\n    case START_IF:\n      return MultiWayIfLayout;\n    case START_LET:\n      return LetLayout;\n    case START_QUOTE:\n      return QuoteLayout;\n    default:\n      return DeclLayout;\n  }\n}\n\ntypedef struct {\n  Symbol sym;\n  ContextSort sort;\n} StartLayout;\n\n/**\n * Determine whether the layout sort corresponding to the potentially valid symbol can start at this position.\n * If the context stack is `uninitialized`, the first layout is added by `process_token_init`.\n * In newline processing mode, brace layouts cannot be started because there may be comments before the brace that need\n * to be emitted first.\n * Regular `if/then/else` conditionals are always valid at the same position as multi-way if layouts.\n * If we were to unconditionally start a layout when START_IF is valid, it would never be possible to parse the former,\n * so this skips that layout sort unless the `Lexed` token is `LBar`.\n */\nstatic StartLayout valid_layout_start(Env *env, Lexed next) {\n  StartLayout start = {.sym = valid_layout_start_sym(env), .sort = NoContext};\n  if (uninitialized(env) || start.sym == FAIL) return start;\n  ContextSort sort = layout_sort(start.sym);\n  switch (next) {\n    case LBar:\n      break;\n    case LBraceOpen:\n      if (newline_active(env)) return start;\n      sort = Braces;\n      start.sym = START_EXPLICIT;\n      break;\n    default:\n      if (sort == MultiWayIfLayout) return start;\n      break;\n  }\n  start.sort = sort;\n  return start;\n}\n\n/**\n * If the current context is a brace layout, any indent is legal for a new layout.\n * Otherwise, compare with the indent of the current context.\n * Since starting layouts is allowed in tuple expressions, we look at the last real indent, skipping over `TExp`s, using\n * 0 if none exists (which should never be the case).\n *\n * According to the docs for `NondecreasingIndentation`, the rule is that a nested context may start at the same column\n * _if the enclosing context is a do expression_.\n * From experimental evidence, it appears though that this is the other way round – a do expression within, say, a case\n * alt can start at the same level as the case layout.\n */\nstatic bool indent_can_start_layout(Env *env, ContextSort sort, uint32_t indent) {\n  if (current_context(env) == Braces) return true;\n  uint32_t cur = current_indent(env);\n  return (indent > cur || (indent == cur && sort == DoLayout));\n}\n\n/**\n * Start the given layout if the position allows it:\n *\n * - If the current context is `ModuleHeader`, the layout must be the `where` after `module`, so any indent is valid.\n\n * - If the new layout is a brace layout, legal indent is technically required, but we can be lenient since there's no\n *   other way to interpret an opening brace after a layout opener.\n *   However, we need to mark to include the brace in the range to create a terminal (see `grammar/externals.js` for\n *   why).\n *\n * - Otherwise, examine indent.\n */\nstatic Symbol start_layout(Env *env, const StartLayout start, uint32_t indent, const char * restrict desc) {\n  if (in_module_header(env)) pop(env);\n  else if (start.sort == Braces) MARK(\"start_layout brace\");\n  else if (!indent_can_start_layout(env, start.sort, indent)) return FAIL;\n  push_context(env, start.sort, indent);\n  return finish(start.sym, desc);\n}\n\n/**\n * The indent of a layout started at an interior token can only be determined by calling `get_column`.\n * This is an expensive operation, but hopefully it is rare enough to not make a substantial dent.\n * Because we might have advanced beyond the layout's start position to check conditions, we need to subtract the length\n * of the lookahead buffer from the current column.\n * Whitespace is skipped, and not added to the buffer, so the resulting position is after whitespace.\n */\nstatic Symbol start_layout_interior(Env *env, Lexed next) {\n  StartLayout start = valid_layout_start(env, next);\n  if (start.sort == NoContext) return FAIL;\n  return start_layout(env, start, start_column(env), \"interior\");\n}\n\n/**\n * The indent of a layout started at the beginning of a line is determined by `newline_lookahead`, so this does not have\n * to compute it.\n */\nstatic Symbol start_layout_newline(Env *env) {\n  StartLayout start = valid_layout_start(env, env->state->newline.end);\n  if (start.sort == NoContext) return FAIL;\n  Symbol result = start_layout(env, start, env->state->newline.indent, \"newline\");\n  if (result != FAIL) env->state->newline.no_semi = true;\n  return result;\n}\n\n/**\n * See `token_end_layout_texp`.\n */\nstatic Symbol texp_context(Env *env) {\n  if (valid(env, START_TEXP)) {\n    push_context(env, TExp, 0);\n    return finish(START_TEXP, \"texp_context\");\n  }\n  else if (valid(env, END_TEXP) && current_context(env) == TExp) {\n    pop(env);\n    return finish(END_TEXP, \"texp_context\");\n  }\n  else return FAIL;\n}\n\n// --------------------------------------------------------------------------------------------------------\n// Ending layouts\n// --------------------------------------------------------------------------------------------------------\n\n/**\n * Separated this from `end_layout` because it caused some weird performance glitches.\n */\nstatic Symbol end_layout_unchecked(Env *env, const char *restrict desc) {\n  pop(env);\n  return finish(END, desc);\n}\n\n/**\n * If a layout end is valid at this position, pop a context and succeed with layout end.\n */\nstatic Symbol end_layout(Env *env, const char *restrict desc) {\n  if (valid(env, END)) return end_layout_unchecked(env, desc);\n  else return FAIL;\n}\n\n/**\n * Explicit brace layouts need a dedicated symbol, see `_cmd_layout_start_explicit` for an explanation.\n * Includes the brace in the range.\n */\nstatic Symbol end_layout_brace(Env *env) {\n  if (valid(env, END_EXPLICIT) && current_context(env) == Braces) {\n    advance_over(env, 0);\n    MARK(\"end_layout_brace\");\n    pop(env);\n    return finish(END_EXPLICIT, \"brace\");\n  }\n  else return FAIL;\n}\n\n/**\n * End a layout based on indent decrease.\n *\n * If the indent of the current line is smaller than the indent of the current layout, we end the layout in most cases.\n * Exceptions are:\n *\n * - Brace layouts\n * - The top-level layout, which should only be ended at the end of file.\n *   For leniency, we change the current indent to the smaller value.\n */\nstatic Symbol end_layout_indent(Env *env) {\n  if (valid(env, END) && indent_less(env, env->state->newline.indent)) {\n    if (top_layout(env)) {\n\t  array_back(&env->state->contexts)->indent = env->state->newline.indent;\n      return update_state(\"end top layout\");\n    }\n    else {\n      env->state->newline.skip_semi = false;\n      return end_layout_unchecked(env, \"indent\");\n    }\n  }\n  return FAIL;\n}\n\n/**\n * An expression layout may be closed by an infix operator when it is not valid at that position:\n *\n * a :: IO Int\n * a = do a <- pure 5\n *        pure a\n *        >>= pure\n *\n * In this situation, the indent of the operator causes a semicolon to be generated, which leads to varsym being invalid\n * lookahead.\n * The layout is closed and the entire `do` block becomes the left operand of the `>>=`.\n * The same applies for `infix` id operators.\n *\n * It doesn't apply to multi-way if layouts, because those don't use semicolons.\n */\nstatic Symbol end_layout_infix(Env *env) {\n  if (!valid(env, VARSYM) && !valid(env, CONSYM)) return end_layout(env, \"symop invalid\");\n  return FAIL;\n}\n\n/**\n * A case alt can have a `where` clause attached to it, so a case layout is ended by a `where` only if its indent is\n * equal to or smaller than the layout indent.\n *\n * A `do` or `if` cannot have a `where`, so they are always terminated.\n *\n * It would be tempting to leave it at that, but there can be multiple successive `where` clauses.\n * If a `case` is followed by two of them (greater indent), the first one would attach to the last alt.\n * The second one would have to close the `case` layout and attach to the next higher allowed place (e.g. the enclosing\n * function decl), but if its indent is greater, this cannot be detected here – it would just seem like a `where`\n * attaching to an alt, since we don't keep track of the number of `where`s encountered (and we couldn't, since we're\n * dealing with layouts, not case alts).\n *\n * By tracking the validity of `where` symbols, we can simplify the condition for `do` and `if`: End any layout when\n * `where` is parsed, but invalid.\n */\nstatic Symbol end_layout_where(Env *env) {\n  if (valid(env, END) && !valid(env, WHERE) && is_layout_context(env)) return end_layout(env, \"where\");\n  return FAIL;\n}\n\n/**\n * Ending layouts with `in` heavily relies on parse errors in GHC, so this is difficult.\n * The heuristic here is that if `in` is not valid (i.e. a parse error), we pop any layout.\n *\n * Take the example of some inline layouts in a let decl:\n * `let a = case a of a -> do a in a`\n * The `do` and `case` layouts have valid `END` symbols at the `in`, but `in` itself is not valid as long as the `case`\n * hasn't reduced, so we pop until we find `IN`.\n *\n * This isn't enough though, since `let` also opened a layout that ends here, so we have to test for that explicitly.\n *\n * Note that this doesn't allow the `in` of a nested `let` to close the outer `let`, since the `END` for that isn't\n * valid before the inner `let` has reduced.\n */\nstatic Symbol end_layout_in(Env *env) {\n  if (valid(env, END) && (!valid(env, IN) || current_context(env) == LetLayout)) return end_layout(env, \"in\");\n  return FAIL;\n}\n\n/**\n * For GADT constructor layouts.\n */\nstatic Symbol end_layout_deriving(Env *env) {\n  if (valid(env, END) && !valid(env, DERIVING) && !top_layout(env) && current_context(env) == DeclLayout)\n    return end_layout(env, \"deriving\");\n  return FAIL;\n}\n\n/**\n * Return `true` if there is a `TExp` context on the stack and only layouts above it.\n */\nstatic bool layouts_in_texp(Env *env) {\n  if (is_layout_context(env) && (env->state->contexts.size > 1)) {\n    for (int32_t i = (int32_t) env->state->contexts.size - 2; i >= 0; i--) {\n\t  Context *cur = array_get(&env->state->contexts, i);\n      if (cur->sort == TExp || cur->sort == Braces) return true;\n      else if (cur->sort > Braces) break;\n    }\n  }\n  return false;\n}\n\n/**\n * Tuple expressions are constructs that syntactically delimit their contents in an unambiguous way that makes parsing\n * a lot easier.\n * In GHC, this concept is used to classify productions like view patterns and annotated expressions.\n * For us, unfortunately, it also means that there are significantly more circumstances in which layouts can be ended by\n * parse errors.\n *\n * In practice, it means that expression layouts can be closed by commas, vertical bars and closing brackets and parens\n * when they are elements in a list or tuple-like construct:\n *\n * (case a of a -> a, do a; a, if | a -> a | a -> a)\n * [case a of a -> a | a <- a]\n *\n * We encode this as a special context sort, `TExp`, that is pushed and popped at opening and closing brackets.\n *\n * Some other constructs, like guards, have similar characteristics, so we use the same mechanism for them:\n *\n * > a = case a of\n * >   a | let a = a -> a\n *\n * Here the let layout must be ended by parse error, so we start a tuple expression at the bar and end it at the arrow.\n */\nstatic Symbol token_end_layout_texp(Env *env) {\n  return (valid(env, END) && layouts_in_texp(env)) ? end_layout(env, \"texp\") : FAIL;\n}\n\nstatic Symbol force_end_context(Env *env) {\n  for (int32_t i = (int32_t) env->state->contexts.size - 1; i >= 0; i--) {\n\tContextSort ctx = array_get(&env->state->contexts, i)->sort;\n    Symbol s = context_end_sym(ctx);\n    pop(env);\n    if (s != FAIL && valid(env, s)) return finish(s, \"force_end_context\");\n  }\n  return FAIL;\n}\n\n// --------------------------------------------------------------------------------------------------------\n// Operators\n// --------------------------------------------------------------------------------------------------------\n\n/**\n * Opening tokens are a class of characters that may immediately follow prefix operators like bang pattern `!` or type\n * application `@`.\n */\nstatic bool opening_token(Env *env, uint32_t i) {\n  int32_t c = peek(env, i);\n  switch (c) {\n    case 0x27e6: // ⟦\n    case 0x2987: // ⦇\n    case '(':\n    case '[':\n    case '\"':\n      return true;\n    case '{':\n      return peek(env, i + 1) != '-';\n    default:\n      // Includes single quote\n      return is_id_char(c);\n  }\n}\n\n/**\n * Test for reserved operators of two characters.\n */\nstatic bool valid_symop_two_chars(int32_t first_char, int32_t second_char) {\n  switch (first_char) {\n    case '=':\n      return second_char != '>';\n    case '<':\n      return second_char != '-';\n    case ':':\n      return second_char != ':';\n    default:\n      return true;\n  }\n}\n\n/**\n * If a prefix operator is not followed by an opening token, it may still be a valid varsym.\n */\nstatic Lexed lex_prefix(Env *env, Lexed t) {\n  return opening_token(env, 1) ? t : LSymop;\n}\n\n/**\n * If a splice operator is not followed by an opening token, it may still be a valid varsym.\n * We only allow variables and parenthesized expressions for performance reasons, though.\n */\nstatic Lexed lex_splice(int32_t c) {\n  return varid_start_char(c) || c == '(' ? LDollar : LSymop;\n}\n\n/**\n * Lex special occurrences of symbolic operator characters, or declare a valid operator.\n *\n * For the dot:\n *\n * - Two dots: `..`: Only used for arithmetic sequences (`[a..10]`).\n *   These conflict with record field projection (`[a.b, c]`) and infix operators (`[a..+b]`), and it's too hard to\n *   disambiguate them without this special rule.\n *\n * - Tight dot `a.b.c`: A regular tight op, but it has to get a separate symbol from qualified module dots since those\n *   can be followed by symops.\n *\n * - Prefix dot `(.a)`: A regular prefix op, for record dot field selectors.\n *\n * - Qualified dot `A.B.c`, `A.B.C`, `A.B.+`: Used primarily for qualified modules, but needs to be accepted for field\n *   selectors as well due to ambiguity.\n *   This is not a regular tight op since it needs to allow symops and conid.\n */\nstatic Lexed lex_symop(Env *env) {\n  uint32_t len = symop_lookahead(env);\n  if (len == 0) return LNothing;\n  int32_t c1 = unsafe_peek(env, 0);\n  if (len == 1) {\n    switch (c1) {\n      case '?':\n        // A `?` can be the head of an implicit parameter, if followed by a varid.\n        return varid_start_char(peek1(env)) ? LNothing : LSymop;\n      case '#':\n        return char1(env, ')') ? LUnboxedClose : LHash;\n      case '|':\n        return char1(env, ']') ? LQuoteClose : LBar;\n      case '!':\n        return lex_prefix(env, LBang);\n      case '~':\n        return lex_prefix(env, LTilde);\n      case '@':\n        return lex_prefix(env, LAt);\n      case '%':\n        return lex_prefix(env, LPercent);\n      case '$':\n        return lex_splice(peek1(env));\n      case '.':\n        if (is_id_char(peek1(env))) return LDotId;\n        else if (opening_token(env, 1)) return LDotOpen;\n        else return LSymop;\n      case 0x2192: // →\n      case 0x22b8: // ⊸\n        return LArrow;\n      case 0x21d2: // ⇒\n        return LCArrow;\n      case '=':\n      case 0x27e7: // ⟧\n      case 0x2988: // ⦈\n        return LTexpCloser;\n      case '*':\n      case '-':\n        return LSymopSpecial;\n      case '\\\\':\n      case 0x2190: // ←\n      case 0x2200: // ∀\n      case 0x2237: // ∷\n      case 0x2605: // ★\n      case 0x27e6: // ⟦\n      case 0x2919: // ⤙\n      case 0x291a: // ⤚\n      case 0x291b: // ⤛\n      case 0x291c: // ⤜\n      case 0x2987: // ⦇\n        return LNothing;\n    }\n  }\n  else if (len == 2) {\n    if (seq(env, \"->\")) return LArrow;\n    if (seq(env, \"=>\")) return LCArrow;\n    int32_t c2 = unsafe_peek(env, 1);\n    switch (c1) {\n      case '$':\n        if (c2 == '$') return lex_splice(peek2(env));\n        break;\n      case '|':\n        if (c2 == '|' && char2(env, ']')) return LQuoteClose;\n        break;\n      case '.':\n        if (c2 == '.') return LDotDot;\n        else return LDotSymop;\n        break;\n      case '#':\n        // Unboxed unit `(##)` and unboxed sum with missing space `(#| Int #)`\n        if (c2 == '#' || c2 == '|') return LSymopSpecial;\n        break;\n      default:\n        if (!valid_symop_two_chars(c1, c2)) return LNothing;\n        break;\n    }\n  }\n  else switch (c1) {\n    case '-':\n      if (seq(env, \"->.\")) return LArrow;\n      break;\n    case '.':\n      return LDotSymop;\n  }\n  return LSymop;\n}\n\n/**\n * If the next character after whitespace starting from `start` is a closing parenthesis, finish with `LEFT_SECTION_OP`.\n * This is called after a previous step has already lexed a valid infix operator (symbolic or ticked varid).\n *\n * Left section operators must be detected here to disambiguate from infix expressions:\n *\n * > f = (1 - 2 +)\n *\n * When lookahead is `+`, the parser must decide whether to reduce `1 - 2` to `infix` because it is the operand of a\n * section, or to shift into another `infix`.\n * With a single lookahead token, this is not decidable.\n *\n * Note: The obvious solution would be to make `infix` left-associative, so it would always reduce.\n * Unfortunately, this doesn't work for minus, due to apparently unsurmountable problems caused by the\n * apply/infix/negation conflict.\n *\n * Note: This will fail if there are extras between the operator and the parenthesis (and the ticks and the varid).\n *\n * Note: If the operator isn't followed by a parenthesis, it will be parsed as an infix operator in the next step, since\n * those are always valid when left sections are (except for qualified symops).\n * However, this function advances over whitespace to find the paren, so if the next step marks and finishes, it will\n * either:\n * - Include the whitespace in its range, if this consumes it\n * - Have a zero-width range, if this skips whitespace\n * To mitigate this, we introduce the auxiliary symbol `NO_SECTION_OP`, which is (optionally) valid before infix\n * operators, but not before section operators.\n * When this function finds any whitespace before the parenthesis, it will finish with that symbol, so that\n * `LEFT_SECTION_OP` won't be valid in the next run, but all other infix operators are.\n */\nstatic Symbol left_section_op(Env *env, uint32_t start) {\n  if (valid(env, LEFT_SECTION_OP)) {\n    advance_before(env, start);\n    Space space = skip_whitespace(env);\n    if (char_at(env, start, ')')) return finish(LEFT_SECTION_OP, \"left section\");\n    if (space != NoSpace) return finish_if_valid(env, NO_SECTION_OP, \"left section\");\n  }\n  return FAIL;\n}\n\n/**\n * Specialization of `left_section_op` for ticked infix identifiers.\n */\nstatic Symbol left_section_ticked(Env *env) {\n  if (valid(env, LEFT_SECTION_OP)) {\n    uint32_t end_tick = advance_until_char(env, 1, '`');\n    // Could be EOF\n    if (char_at(env, end_tick, '`')) {\n      return left_section_op(env, end_tick + 1);\n    }\n  }\n  return FAIL;\n}\n\n/**\n * This calls `symop_lookahead` to ensure that the position has advanced beyond the end of the symop, which is necessary\n * because newline lookahead may have validated the symop in a previous run.\n * This marks the range to emit a terminal.\n */\nstatic Symbol finish_symop(Env *env, Symbol s) {\n  if (valid(env, s) || valid(env, LEFT_SECTION_OP)) {\n    uint32_t after_symop = symop_lookahead(env);\n    SEQ(left_section_op(env, after_symop));\n    MARK(\"symop\");\n    return s;\n  }\n  return FAIL;\n}\n\n/**\n * Tight ops like `dot.syntax` require that no initial whitespace was skipped.\n */\nstatic Symbol tight_op(Env *env, bool whitespace, Symbol s) {\n  if (!whitespace) return finish_if_valid(env, s, \"tight_op\");\n  else return FAIL;\n}\n\n/**\n * Used for situations where the operator is followed by an opening token, and so can be a prefix op if it is preceded\n * by whitespace; but is no valid tight op and therefore becomes a regular operator if not preceded by whitespace or the\n * symbol is not valid.\n *\n * Only used for `%` (modifier).\n */\nstatic Symbol prefix_or_varsym(Env *env, bool whitespace, Symbol s) {\n  if (whitespace) SEQ(finish_if_valid(env, s, \"prefix_or_varsym\"));\n  return finish_symop(env, VARSYM);\n}\n\n/**\n * Used for situations where the operator is followed by an opening token, and so can be a tight op if it is not\n * preceded by whitespace; but is no valid prefix op and therefore becomes a regular operator if preceded by whitespace\n * or the symbol is not valid.\n *\n * Only used for `.`, when a projection selector `(.fieldname)` is not valid at this position, so the dot becomes the\n * composition operator.\n */\nstatic Symbol tight_or_varsym(Env *env, bool whitespace, Symbol s) {\n  SEQ(tight_op(env, whitespace, s));\n  return finish_symop(env, VARSYM);\n}\n\n/**\n * Used for situations where the operator is followed by an opening token, and so can be a tight op if it is not\n * preceded by whitespace or a prefix op if it is.\n *\n * If neither of those symbols is valid, fall back to a regular operator.\n *\n * Used for `!`, `~` and `@`.\n */\nstatic Symbol infix_or_varsym(Env *env, bool whitespace, Symbol prefix, Symbol tight) {\n  SEQ(finish_if_valid(env, whitespace ? prefix : tight, \"infix_or_varsym\"));\n  return finish_symop(env, VARSYM);\n}\n\nstatic Symbol qualified_op(Env *env) {\n  if (qualified_name(env, is_symop) == QualifiedTarget) {\n    SEQ(left_section_op(env, symop_lookahead(env)));\n    return QUALIFIED_OP;\n  }\n  return FAIL;\n}\n\n// --------------------------------------------------------------------------------------------------------\n// Token lookahead\n// --------------------------------------------------------------------------------------------------------\n\n/**\n * Detect the start of a quasiquote: An opening bracket followed by an optional varid and a vertical bar, all without\n * whitespace in between.\n */\nstatic bool is_qq_start(Env *env) {\n  uint32_t end = advance_while(env, 1, quoter_char);\n  return char_at(env, end, '|');\n}\n\n/**\n * An end token is a keyword like `else` or `deriving` that can end a layout without newline or indent.\n */\nstatic Lexed try_end_token(Env *env, const char * restrict target, Lexed match) {\n  if (token(env, target)) return match;\n  else return LNothing;\n}\n\n/**\n * Check that a symop consists only of minuses after the second character.\n */\nstatic bool only_minus(Env *env) {\n  uint32_t i = 2;\n  while (peek(env, i) == '-') i++;\n  return !symop_char(peek(env, i));\n}\n\n/**\n * Check that a symop consists only of minuses, making it a comment herald.\n */\nstatic bool line_comment_herald(Env *env) {\n  return seq(env, \"--\") && only_minus(env);\n}\n\nstatic Lexed lex_cpp(Env *env) {\n  switch(cpp_directive(env)) {\n    case CppElse:\n      return LCppElse;\n    case CppNothing:\n      return LNothing;\n    default:\n      return LCpp;\n  }\n}\n\n/**\n * Lex pragmas, comments and CPP.\n */\nstatic Lexed lex_extras(Env *env, bool bol) {\n  switch (peek0(env)) {\n    case '{':\n      if (char1(env, '-')) return char2(env, '#') ? LPragma : LBlockComment;\n      break;\n    case '#':\n      if (bol) return lex_cpp(env);\n      break;\n    case '-':\n      if (line_comment_herald(env)) return LLineComment;\n      break;\n    default:\n      break;\n  }\n  return LNothing;\n}\n\n/**\n * The main lexing entry point, branching on the first character, then advancing as far as necessary to identify all\n * interesting tokens.\n */\nstatic Lexed lex(Env *env, bool bol) {\n  SEQ(lex_extras(env, bol));\n  if (symop_char(peek0(env))) SEQ(lex_symop(env));\n  else switch (peek0(env)) {\n    case 'w':\n      return try_end_token(env, \"where\", LWhere);\n    case 'i':\n      return try_end_token(env, \"in\", LIn);\n    case 't':\n      return try_end_token(env, \"then\", LThen);\n    case 'e':\n      return try_end_token(env, \"else\", LElse);\n    case 'd':\n      return try_end_token(env, \"deriving\", LDeriving);\n    case 'm':\n      if ((uninitialized(env) || in_module_header(env)) && token(env, \"module\")) return LModule;\n      break;\n    case '{':\n      return LBraceOpen;\n    case '}':\n      return LBraceClose;\n    case ';':\n      return LSemi;\n    case '`':\n      return LTick;\n    case '[':\n      if (valid(env, QQ_START) && is_qq_start(env)) return LBracketOpen;\n      break;\n    case ']':\n    case ')':\n    case ',':\n      return LTexpCloser;\n    default:\n      if (is_conid_start_char(peek0(env))) return LUpper;\n      break;\n  }\n  return LNothing;\n}\n\n// --------------------------------------------------------------------------------------------------------\n// CPP\n// --------------------------------------------------------------------------------------------------------\n\n/**\n * This tests for `#endif` directly after taking a line, so it only matches it at the first column.\n * Int finishes right before the `#endif`, so that pragma is parsed by `cpp_consume` in the next round.\n */\nstatic Symbol cpp_else(Env *env, bool emit) {\n  uint32_t nesting = 1;\n  do {\n    take_line_escaped_newline(env);\n    if (emit) MARK(\"cpp_else\");\n    S_ADVANCE;\n    reset_lookahead(env);\n    switch (cpp_directive(env)) {\n      case CppStart:\n        nesting++;\n        break;\n      case CppEnd:\n        nesting--;\n        break;\n      default:\n        break;\n    }\n  }\n  while (not_eof(env) && nesting > 0);\n  if (emit) return finish(CPP, \"cpp-else\");\n  else return FAIL;\n}\n\nstatic Symbol cpp_line(Env *env) {\n  take_line_escaped_newline(env);\n  return finish_marked(env, CPP, \"cpp\");\n}\n\n// --------------------------------------------------------------------------------------------------------\n// Comments\n// --------------------------------------------------------------------------------------------------------\n\n/**\n * Distinguish between haddocks and plain comments by matching on the first non-whitespace character.\n */\nstatic Symbol comment_type(Env *env) {\n  uint32_t i = 2;\n  while (peek(env, i) == '-') i++;\n  while (not_eof(env)) {\n    int32_t c = peek(env, i++);\n    if (c == '|' || c == '^') return HADDOCK;\n    else if (!is_space_char(c)) break;\n  }\n  return COMMENT;\n}\n\n/**\n * Inline comments extend over all consecutive lines that start with comments.\n * Could be improved by requiring equal indent.\n */\nstatic Symbol inline_comment(Env *env) {\n  Symbol sym = comment_type(env);\n  do {\n    take_line(env);\n    MARK(\"inline comment\");\n    S_ADVANCE;\n    reset_lookahead(env);\n  } while (line_comment_herald(env));\n  return sym;\n}\n\nstatic uint32_t consume_block_comment(Env *env, uint32_t col) {\n  uint32_t level = 0;\n  for (;;) {\n    if (is_eof(env)) return col;\n    col++;\n    switch (PEEK) {\n      case '{':\n        S_ADVANCE;\n        if (PEEK == '-') {\n          S_ADVANCE;\n          col++;\n          level++;\n        }\n        break;\n      case '-':\n        S_ADVANCE;\n        if (PEEK == '}') {\n          S_ADVANCE;\n          col++;\n          if (level == 0) return col;\n          level--;\n        }\n        break;\n      NEWLINE_CASES:\n        S_ADVANCE;\n        col = 0;\n        break;\n      case '\\t':\n        S_ADVANCE;\n        col += 7;\n        break;\n      default:\n        S_ADVANCE;\n        break;\n    }\n  }\n}\n\n/**\n * Since {- -} comments can be nested arbitrarily, this has to keep track of how many have been opened, so that the\n * outermost comment isn't closed prematurely.\n */\nstatic Symbol block_comment(Env *env) {\n  Symbol sym = comment_type(env);\n  consume_block_comment(env, env->state->lookahead.size);\n  return finish_marked(env, sym, \"block_comment\");\n}\n\n// --------------------------------------------------------------------------------------------------------\n// Pragma\n// --------------------------------------------------------------------------------------------------------\n\nstatic bool consume_pragma(Env *env) {\n  if (seq(env, \"{-#\")) {\n    while (!seq(env, \"#-}\") && not_eof(env)) {\n      reset_lookahead(env);\n      advance_over(env, 0);\n    }\n    return true;\n  }\n  return false;\n}\n\n/**\n * Since pragmas can occur anywhere, like comments, but contrarily determine indentation when occurring at the beginning\n * of a line in layouts, this sets `NResume` to continue newline processing with the indent of the pragma.\n *\n * If the pragma is followed by newline, this only ensures that no semicolon is emitted (since this rule is run before\n * `semicolon` and `NResume` restarts lookahead).\n *\n * Otherwise it ensures that the following token is treated as a layout element with the correct indent.\n */\nstatic Symbol pragma(Env *env) {\n  if (consume_pragma(env)) {\n    MARK(\"pragma\");\n    if (env->state->newline.state != NInactive) env->state->newline.state = NResume;\n    return finish(PRAGMA, \"newline\");\n  }\n  return FAIL;\n}\n\n// --------------------------------------------------------------------------------------------------------\n// Quasiquote\n// --------------------------------------------------------------------------------------------------------\n\nstatic Symbol qq_body(Env *env) {\n  for (;;) {\n    if (is_eof(env)) return finish(QQ_BODY, \"qq_body\");\n    else if (PEEK == 0x27e7) {\n      return finish_marked(env, QQ_BODY, \"qq_body\");\n    }\n    else if (PEEK == '|') {\n      MARK(\"qq_body\");\n      S_ADVANCE;\n      if (PEEK == ']') {\n        return finish(QQ_BODY, \"qq_body\");\n      }\n    } else S_ADVANCE;\n  }\n}\n\n// --------------------------------------------------------------------------------------------------------\n// Semicolon\n// --------------------------------------------------------------------------------------------------------\n\n/**\n * When encountering explicit semicolons, we want to ensure that a subsequent newline doesn't trigger a layout\n * semicolon, so we set `skip_semi`.\n * If the next symbol is not a newline (and not another semicolon), the scanner will immediate end up in\n * `resolve_semicolon`, matching the condition, where we unset the flag to avoid a mid-line semicolon from influencing\n * an unrelated newline.\n *\n * Take this example:\n *\n * > a = 1;;\n * > b = 2\n * > ;;c = 3\n *\n * At the first semicolon, `explicit_semicolon` is called (conditioned on `LSemi` in `process_token_interior`) and\n * SEMICOLON is valid, so the flag is set.\n * The scanner will be called again immediately without advancing, and first enter `resolve_semicolon`, which does\n * nothing because the next token is still `LSemi`.\n * Next it will enter `explicit_semicolon` again.\n * SEMICOLON is valid, but since the flag is set we fall through and defer to internal lexing.\n * The grammar advances into `semi` (in `util.js`), which causes SEMICOLON to become invalid.\n * The scanner is executed before the second semicolon, where both functions skip again, this time additionally because\n * SEMICOLON is now invalid.\n *\n * In the next scan, the newline branch is taken in `scan`, so this function is not executed again.\n * Newline lookahead finds the next line to begin at column 0, which would usually trigger a layout semicolon in\n * `semicolon`, but that is inhibited by `skip_semi`, so the scan only skips whitespace and resets the newline state,\n * which unsets `skip_semi` again.\n * In the following scan, the conditions for both functions are unfulfilled, so parsing continues regularly until the\n * next newline.\n *\n * Newline lookahead now encounters the third semicolon on the next line and sets `no_semi`, which supersedes\n * `skip_semi` and prohibits layout semicolon irreversibly, so the explicit semicolons are parsed by the grammar.\n *\n * Now consider an inline semicolon:\n *\n * > f = let\n * >   a = 1; b = 2\n * >   c = 3; {- x -}\n * >   d = 4\n * >   in c\n *\n * When the semicolon is lexed, `explicit_semicolon` sets `skip_semi`.\n * If we would not reset it until the newline, no layout semicolon would be generated before `c`, resulting in a parse\n * error at `=`.\n * Therefore, `resolve_semicolon` unsets `skip_semi` when lexing `b`, triggered by `skip_semi` being set and the next\n * token not being `LSemi`.\n *\n * The semicolon after `c = 3` is followed by a comment, so it is unclear if there is going to be another layout element\n * in the same line.\n * If there is none, the situation is the same as in the first example's first line; if another layout element were to\n * follow, `skip_semi` would need to be reset like in this example's first line.\n * Therefore, `resolve_semicolon` also keeps the flag as it is in this case.\n */\nstatic Symbol explicit_semicolon(Env *env) {\n  if (valid(env, SEMICOLON) && !env->state->newline.skip_semi) {\n    env->state->newline.skip_semi = true;\n    return update_state(\"explicit semicolon enable\");\n  }\n  return FAIL;\n}\n\nstatic Symbol resolve_semicolon(Env *env, Lexed next) {\n  if (env->state->newline.skip_semi) {\n    switch(next) {\n      case LLineComment:\n      case LBlockComment:\n      case LPragma:\n      case LSemi:\n        break;\n      default:\n        env->state->newline.skip_semi = false;\n        return update_state(\"explicit semicolon disable\");\n    }\n  }\n  return FAIL;\n}\n\n/**\n * Generate a layout semicolon after a newline if the indent is less or equal to the current layout's indent, unless:\n *\n * - The current context doesn't use layout semicolons, which is the case for explicit brace layouts, tuple expressions,\n *   the module header and multi-way if layouts.\n *\n * - `no_semi` was set because newline lookahead found an explicit semicolon in the next line, or this function was\n *   executed before for the same newline.\n *\n * - `skip_semi` was set because the previous line ended with an explicit semicolon.\n */\nstatic Symbol semicolon(Env *env) {\n  if (\n      is_semicolon_context(env)\n      &&\n      !(env->state->newline.no_semi || env->state->newline.skip_semi)\n      &&\n      indent_lesseq(env, env->state->newline.indent)\n     ) {\n    env->state->newline.no_semi = true;\n    return finish(SEMICOLON, \"newline\");\n  }\n  else return FAIL;\n}\n\n// --------------------------------------------------------------------------------------------------------\n// High-level `Lexed` dispatch\n// --------------------------------------------------------------------------------------------------------\n\n/**\n * Process a `Lexed` token if it results in a layout end or an extra.\n *\n * This is called by `newline_post` before marking, so the actions must not fail after advancing.\n */\nstatic Symbol process_token_safe(Env *env, Lexed next) {\n  switch (next) {\n    case LWhere:\n      return end_layout_where(env);\n    case LIn:\n      return end_layout_in(env);\n    case LThen:\n    case LElse:\n      return end_layout(env, \"then/else\");\n    case LDeriving:\n      return end_layout_deriving(env);\n    case LBar:\n      if (!valid(env, BAR)) return end_layout(env, \"bar\");\n      break;\n    case LPragma:\n      return pragma(env);\n    case LBlockComment:\n      return block_comment(env);\n    case LLineComment:\n      return inline_comment(env);\n    case LCppElse:\n      return cpp_else(env, true);\n    case LCpp:\n      return cpp_line(env);\n    case LSymop:\n    case LTick:\n    case LHash:\n      return end_layout_infix(env);\n    case LUnboxedClose:\n      SEQ(token_end_layout_texp(env));\n      return end_layout_infix(env);\n    case LArrow:\n      if (!valid(env, ARROW)) return token_end_layout_texp(env);\n      break;\n    case LTexpCloser:\n      return token_end_layout_texp(env);\n    case LQuoteClose:\n      return end_layout(env, \"quote bracket\");\n      break;\n    default:\n      break;\n  }\n  return FAIL;\n}\n\n/**\n * Process a `Lexed` token if it results in a symbolic operator.\n */\nstatic Symbol process_token_symop(Env *env, bool whitespace, Lexed next) {\n  switch (next) {\n    case LDotDot:\n      SEQ(finish_if_valid(env, DOTDOT, \"symop\"));\n      return tight_op(env, whitespace, QUAL_DOT);\n    case LDotId:\n      SEQ(finish_if_valid(env, whitespace ? PREFIX_DOT : TIGHT_DOT, \"symop\"));\n      return tight_op(env, whitespace, QUAL_DOT);\n    case LDotSymop:\n      return tight_or_varsym(env, whitespace, QUAL_DOT);\n    case LDotOpen:\n      return prefix_or_varsym(env, whitespace, PREFIX_DOT);\n    case LBang:\n      return infix_or_varsym(env, whitespace, PREFIX_BANG, TIGHT_BANG);\n    case LTilde:\n      return infix_or_varsym(env, whitespace, PREFIX_TILDE, TIGHT_TILDE);\n    case LAt:\n      return infix_or_varsym(env, whitespace, PREFIX_AT, TIGHT_AT);\n    case LPercent:\n      return prefix_or_varsym(env, whitespace, PREFIX_PERCENT);\n    case LSymop:\n      if (char0(env, ':')) return finish_symop(env, CONSYM);\n      else return finish_symop(env, VARSYM);\n    // The following are handled here despite not being purely symop tokens because `process_token_symop` is executed\n    // last, and these handlers all have potentially quite far lookahead and can fail.\n    case LSymopSpecial:\n      SEQ(left_section_op(env, symop_lookahead(env)));\n      if (valid(env, MINUS) && match_symop(env, \"-\")) return finish(MINUS, \"symop\");\n      break;\n    case LUnboxedClose:\n    case LHash:\n      return left_section_op(env, symop_lookahead(env));\n    case LTick:\n      return left_section_ticked(env);\n    case LUpper:\n      if (valid(env, QUALIFIED_OP) || valid(env, LEFT_SECTION_OP)) SEQ(qualified_op(env));\n      break;\n    default:\n      break;\n  }\n  return FAIL;\n}\n\nstatic Symbol process_token_splice(Env *env, Lexed next) {\n  switch (next) {\n    case LDollar:\n      return finish_if_valid(env, SPLICE, \"symop\");\n    default:\n      break;\n  }\n  return FAIL;\n}\n\n/**\n * Process a `Lexed` token for an interior position.\n */\nstatic Symbol process_token_interior(Env *env, Lexed next) {\n  switch (next) {\n    case LBraceClose:\n      SEQ(end_layout_brace(env));\n      return token_end_layout_texp(env);\n    // Skip layout start\n    case LModule:\n      return FAIL;\n    case LSemi:\n      return explicit_semicolon(env);\n    case LBracketOpen:\n      return finish(QQ_START, \"qq_start\");\n    default:\n      break;\n  }\n  SEQ(process_token_safe(env, next));\n  return start_layout_interior(env, next);\n}\n\n/**\n * Process a `Lexed` token to initialize the context stack.\n */\nstatic Symbol process_token_init(Env *env, uint32_t indent, Lexed next) {\n  switch (next) {\n    case LModule:\n      push_context(env, ModuleHeader, 0);\n      return update_state(\"init\");\n    case LBraceOpen:\n      advance_over(env, 0);\n      MARK(\"init brace\");\n      push_context(env, Braces, indent);\n      return finish(START_EXPLICIT, \"init\");\n    default:\n      push_context(env, DeclLayout, indent);\n      return finish(START, \"init\");\n  }\n}\n\n// --------------------------------------------------------------------------------------------------------\n// Newline actions\n// --------------------------------------------------------------------------------------------------------\n\n/**\n * `NoSpace` + `newline_init()` means that we're at the very beginning of the file, where we start in `NResume` mode\n * without a newline character that can tell us where we are.\n */\nstatic Symbol newline_extras(Env *env, Space space) {\n  bool bol = space == BOL || (space == NoSpace && newline_init(env));\n  Lexed next = lex_extras(env, bol);\n  dbg(\"newline extras token: %s\\n\", token_names[next]);\n  return process_token_safe(env, next);\n}\n\n// Don't finish newline processing before pragmas – they are indicators of layout indent, but since they are extras,\n// they cannot consume a semicolon, so when there's a pragma on a line of its own, we would get two semicolons if we\n// finished here.\n// It's guaranteed that the newline state was committed at least once because `newline_lookahead` sets `unsafe` when\n// finding a pragma.\nstatic Symbol newline_process(Env *env) {\n  dbg(\"newline post\\n\");\n  uint32_t indent = env->state->newline.indent;\n  Lexed end = env->state->newline.end;\n  SEQ(end_layout_indent(env));\n  SEQ(process_token_safe(env, end));\n  Space space = skip_whitespace(env);\n  MARK(\"newline_post\");\n  if (env->state->newline.unsafe) SEQ(newline_extras(env, space));\n  if (!env->state->newline.eof) SEQ(start_layout_newline(env));\n  // TODO it is only necessary to run this late because of very few situations, like nondecreasing indent.\n  // But it has the consequence that whitespace is included in the parent in nested layouts.\n  // Maybe there's a way to run it before and after `start_layout_newline` with conditions.\n  SEQ(semicolon(env));\n  reset_newline(env);\n  if (uninitialized(env)) SEQ(process_token_init(env, indent, end));\n  else {\n    SEQ(process_token_symop(env, true, end));\n    SEQ(process_token_splice(env, end));\n  }\n  return update_state(\"newline final\");\n}\n\nstatic Symbol newline_post(Env *env) {\n  Symbol res = newline_process(env);\n  if (newline_init(env)) env->state->newline.state = NProcess;\n  return res;\n}\n\n/**\n * Repeatedly lex lookahead until encountering something that is neither a comment nor CPP, skipping whitespace and\n * newlines in between.\n */\nstatic void newline_lookahead(Env *env, Newline *newline) {\n  for (;;) {\n    // Using `peek0` to look for whitespace requires the lookahead buffer to have been reset immediately before this\n    // statement – so before the call to this function or at the end of the for loop body.\n    // The reason this isn't using `lexer->lookahead` is that the function may be called at an interior position, to\n    // skip extras.\n    switch (peek0(env)) {\n      NEWLINE_CASES:\n        skip_over(env, 0);\n        newline->indent = 0;\n        break;\n      case '\\t':\n        skip_over(env, 0);\n        newline->indent += 8;\n        break;\n      default:\n        if (is_space_char(peek0(env))) {\n          skip_over(env, 0);\n          newline->indent++;\n          break;\n        }\n        newline->end = lex(env, newline->indent == 0);\n        dbg(\"newline token: %s, %lc\\n\", token_names[newline->end], peek0(env));\n        // Newlines without extras are only safe if `lex` didn't advance the lexer over non-whitespace.\n        newline->unsafe |= !no_lookahead(env);\n        switch (newline->end) {\n          case LEof:\n            newline->indent = 0;\n            newline->eof = true;\n            return;\n          // If/then blocks can have semicolons, but don't have a layout.\n          // Allowing layout semicolons costs 100kB.\n          case LThen:\n          case LElse:\n          case LSemi:\n            newline->no_semi = true;\n            return;\n          case LBlockComment:\n            newline->indent = consume_block_comment(env, newline->indent + 2);\n            break;\n          case LLineComment:\n            newline->indent = 0;\n            take_line(env);\n            break;\n          case LCppElse:\n            cpp_else(env, false);\n            take_line_escaped_newline(env);\n            break;\n          case LCpp:\n            take_line_escaped_newline(env);\n            break;\n          default:\n            return;\n        }\n    }\n    reset_lookahead(env);\n  }\n}\n\n/**\n * Perform newline lookahead, then either finish the run if the position was advanced into the next token, or directly\n * start newline processing if not.\n */\nstatic Symbol newline_start(Env *env) {\n  dbg(\"newline lookahead\\n\");\n  env->state->newline.state = NInit;\n  newline_lookahead(env, &env->state->newline);\n  if (env->state->newline.unsafe) return update_state(\"newline lookahead\");\n  else return newline_post(env);\n}\n\n/**\n * Perform newline lookahead with preset indent, used at the beginning of a file and after pragmas.\n */\nstatic Symbol newline_resume(Env *env) {\n  dbg(\"newline resume\\n\");\n  uint32_t indent = env->state->newline.indent;\n  // Skip space between the pragma end and the next token, which might be the first real token (or another pragma or\n  // comment, or newline).\n  // We don't want to count the space as indent.\n  skip_space(env);\n  reset_newline(env);\n  env->state->newline.indent = indent;\n  return newline_start(env);\n}\n\n// --------------------------------------------------------------------------------------------------------\n// Constraints\n// --------------------------------------------------------------------------------------------------------\n\n/**\n * The following mechanism avoids the conflict between types and classes.\n * Consider this situation:\n *\n * > data A = B b % C => D d :+ E\n * > data E = F f => G g\n *\n * After the `=`, a diverse set of constructs are valid.\n *\n * - Data constructor\n *   - Infix `D d :+ E` -> `(type/name) (type/variable) (constructor_operator) (type/name)`\n *   - Prefix `G g` -> `(name) (type/variable)`\n * - Context\n *   - Infix `B b % C` -> `(type/name) (type/variable) (operator) (type/name)`\n *   - Prefix `F f` -> `(constraint/name) (type/variable)`\n *\n * Each of these starts with a `(name)` with different reduction rules that can only be resolved when the arrow or a\n * data constructor-ending token is encountered.\n * The conflict between `D` and `G` is an additional hurdle that is not addressed here.\n *\n * Constraint lookahead scans ahead until it finds `=>` or a clear rejection criterion like `=` or (layout) semicolon,\n * emitting `_cond_context` to unlock the rules `_qtype_context`, `context` and `_ctr_context`.\n *\n * However, even the two context variants conflict, since infix classes have types in their operands, while a prefix\n * constraint starts with a class name.\n * To mitigate this, constraint lookahead additionally emits `_cond_infix` when it encounters an infix operator.\n * This symbol is only emitted when `_cond_context` is not valid (because it was parsed right before) or because no `=>`\n * is encountered afterwards (because the current position is in parentheses).\n * This only works because infix classes are localized within contexts – disambiguating all infix types like this is\n * impossible without completely restructuring the grammar.\n *\n * Note that this problem could easily be avoided by parsing all contexts as types, accepting that queries for class\n * names would be more verbose and couldn't match more complex constraints.\n * Furthermore, a much simpler fix would be a runtime conflict, which has the potential to result in randomly incorrect\n * parse trees.\n *\n * Similarly to contexts, data constructor heads have infix type-related conflicts that aren't as severe but can easily\n * piggyback on this mechanism, so they are included.\n *\n * Lastly, associated type families and instances conflict because they can both be heralded by `type` alone, so the\n * decision to reduce to type head or instance head nodes is informed by the presence of `::` or `=` without `|`.\n */\n\n/**\n * Result of constraint lookahead.\n */\ntypedef enum {\n  // Continue searching\n  CtrUndecided,\n  // Clear evidence found that no context or infix class is ahead.\n  CtrImpossible,\n  // The context arrow `=>` was found.\n  CtrArrowFound,\n  // An infix operator was found.\n  CtrInfixFound,\n  // An `=` was found.\n  CtrEqualsFound,\n  // A `|` was found.\n  CtrBarFound,\n} CtrResult;\n\n#ifdef TREE_SITTER_DEBUG\n\nstatic const char *ctr_result_names[] = {\n  \"undecided\",\n  \"impossible\",\n  \"arrow\",\n  \"infix\",\n  \"equals\",\n  \"bar\",\n};\n\n#endif\n\n/**\n * Constraint lookahead state.\n */\ntypedef struct {\n  // The amount of characters to skip after an iteration.\n  // For example, after lexing a `conid` the next token can be lexed at the end of the identifier.\n  uint32_t reset;\n  // The number of nested brackets.\n  // When this is nonzero, end tokens are not treated as pertaining to the current expression.\n  uint32_t brackets;\n  // A context arrow was found.\n  bool context;\n  // An infix operator was found.\n  bool infix;\n  bool data_infix;\n  bool type_instance;\n} CtrState;\n\n/**\n * Increment the bracket count.\n */\nstatic CtrResult ctr_bracket_open(CtrState *state) {\n  state->brackets++;\n  state->reset = 1;\n  return CtrUndecided;\n}\n\n/**\n * Decrement the bracket count.\n * If the count was zero already, parsing started inside of brackets that are closed here, so lookahead is terminated.\n */\nstatic CtrResult ctr_bracket_close(CtrState *state) {\n  if (state->brackets == 0) return CtrImpossible;\n  state->brackets--;\n  state->reset = 1;\n  return CtrUndecided;\n}\n\n/**\n * If the given token is ahead, terminate lookahead unsuccessfully.\n */\nstatic CtrResult ctr_stop_on_token(Env *env, const char * restrict target) {\n  return token(env, target) ? CtrImpossible : CtrUndecided;\n}\n\n/**\n * Check if the lexed token is `=>` or an infix operator.\n *\n * This is performed only when the current position is not in a bracketed expression, i.e. at top level relative to the\n * initial lexer position.\n * Otherwise the token belongs to a later, nested expression.\n *\n * Certain tokens are proof that no context can start at the current position, like `::` or `forall`, so lookahead is\n * terminated.\n * It is still possible that an infix class can be parsed, for example in this type when starting at the at `C` and\n * terminating at `::`:\n * > `a :: (C + D :: Constraint) => E`\n */\nstatic CtrResult ctr_top(Env *env, Lexed next) {\n  switch (next) {\n    case LCArrow:\n      return CtrArrowFound;\n    case LSymop:\n    case LSymopSpecial:\n    case LTilde:\n    case LTick:\n      return CtrInfixFound;\n    case LBar:\n      return CtrBarFound;\n    case LArrow:\n    case LWhere:\n    case LDotDot:\n    case LSemi:\n      break;\n    case LTexpCloser:\n      switch (peek0(env)) {\n        case '=':\n          return CtrEqualsFound;\n        default:\n          break;\n      }\n      break;\n    default:\n      switch (peek0(env)) {\n        // Symop is processed in `ctr_lookahead_step`, so `=` and `::` can not be a prefix\n        case '=':\n          return CtrEqualsFound;\n        case 0x2200: // ∀\n          break;\n        case ':':\n          if (char1(env, ':')) break;\n          return CtrUndecided;\n        case 'f':\n          SEQ(ctr_stop_on_token(env, \"forall\"));\n          return ctr_stop_on_token(env, \"family\");\n        case 'i':\n          return ctr_stop_on_token(env, \"instance\");\n        default:\n          return CtrUndecided;\n      }\n  }\n  return CtrImpossible;\n}\n\n/**\n * Process a lexed token for constraint lookahead:\n * - Update bracket nesting count\n * - Advance over pragmas, strings, chars and conids\n * - Set the reset index for certain tokens\n *\n * If the token wasn't identified to be irrelevant for the lookahead result, and the current bracket nesting level is\n * zero, call `ctr_top`.\n */\nstatic CtrResult ctr_lookahead_step(Env *env, CtrState *state, Lexed next) {\n  state->reset = 1;\n  switch (next) {\n    case LBraceClose:\n      return ctr_bracket_close(state);\n    case LUnboxedClose:\n      SEQ(ctr_bracket_close(state));\n      state->reset = 2;\n      return CtrUndecided;\n    case LBraceOpen:\n      return ctr_bracket_open(state);\n    case LSymopSpecial:\n    case LSymop:\n      state->reset = symop_lookahead(env);\n      break;\n    case LUpper:\n      state->reset = conid(env);\n      return CtrUndecided;\n    case LDotId:\n      return CtrUndecided;\n    case LPragma:\n      if (consume_pragma(env)) state->reset = 3;\n      return CtrUndecided;\n    case LTexpCloser:\n    case LNothing:\n      switch (peek0(env)) {\n        case ')':\n        case ']':\n          return ctr_bracket_close(state);\n        case '(':\n        case '[':\n          return ctr_bracket_open(state);\n        case '\"':\n          state->reset = take_string_literal(env);\n          return CtrUndecided;\n        case '\\'':\n          state->reset = take_char_literal(env);\n          return CtrUndecided;\n        default:\n          if (varid_start_char(peek0(env))) state->reset = advance_while(env, 1, is_id_char);\n          break;\n      }\n    default:\n      break;\n  }\n  if (state->brackets != 0) return CtrUndecided;\n  return ctr_top(env, next);\n}\n\n/**\n * Main loop for context lookahead.\n *\n * Perform newline lookahead and terminate if the end of the current layout element is encountered.\n * Otherwise use the new end token to detect a context arrow or infix operator.\n * If no termination criterion is fulfilled, reset lookahead and repeat.\n *\n * Newline lookahead skips over extras.\n *\n * A context arrow is always a termination criterion; an infix operator only if CONTEXT isn't valid.\n */\nstatic Symbol constraint_lookahead(Env *env) {\n  dbg(\"type lookahead\\n\");\n  CtrState state = {.reset = 0};\n  bool done = false;\n  while (!done && not_eof(env)) {\n    // Setting indent to 99999 only to not trigger the following termination condition when no newline was advanced over\n    Newline newline = {.state = 0, .indent = 99999};\n    newline_lookahead(env, &newline);\n    if (newline.indent <= current_indent(env) && current_context(env) != Braces) break;\n    CtrResult result = ctr_lookahead_step(env, &state, newline.end);\n    dbg(\"type: %lc, %s\\n\", peek0(env), ctr_result_names[result]);\n    switch (result) {\n      case CtrArrowFound:\n        state.context = true;\n        done = true;\n        break;\n      case CtrInfixFound:\n        if (char0(env, ':') || char0(env, '`')) state.data_infix = true;\n        state.infix = true;\n        // Context has precedence, e.g. `instance a + a => A` finds `+` first and would treat that as the class name of\n        // the head, then failing on the right operand.\n        done = !valid(env, CONTEXT);\n        break;\n      case CtrEqualsFound:\n        done = !valid(env, TYPE_INSTANCE);\n        state.type_instance = true;\n        break;\n      case CtrBarFound:\n        done = true;\n        state.type_instance = false;\n        break;\n      case CtrImpossible:\n        done = true;\n      case CtrUndecided:\n        break;\n    }\n    reset_lookahead_to(env, state.reset);\n    state.reset = 0;\n  }\n  if (state.context) SEQ(finish_if_valid(env, CONTEXT, \"ctr\"));\n  if (state.infix) SEQ(finish_if_valid(env, INFIX, \"ctr\"));\n  if (state.data_infix) SEQ(finish_if_valid(env, DATA_INFIX, \"ctr\"));\n  if (state.type_instance) SEQ(finish_if_valid(env, TYPE_INSTANCE, \"ctr\"));\n  return FAIL;\n}\n\n// --------------------------------------------------------------------------------------------------------\n// Actions that are executed for interior positions\n// --------------------------------------------------------------------------------------------------------\n\nstatic Symbol process_token_constraint(Env *env) {\n  if (\n      valid(env, CONTEXT)\n      ||\n      valid(env, INFIX)\n      ||\n      valid(env, DATA_INFIX)\n      ||\n      valid(env, TYPE_INSTANCE)\n      )\n    return constraint_lookahead(env);\n  return FAIL;\n}\n\nstatic Symbol interior(Env *env, bool whitespace) {\n  Lexed next = lex(env, false);\n  dbg(\"interior, column %d, ws %d, token %s\\n\", column(env), whitespace, token_names[next]);\n  SEQ(resolve_semicolon(env, next));\n  SEQ(process_token_interior(env, next));\n  SEQ(process_token_symop(env, whitespace, next));\n  SEQ(process_token_constraint(env));\n  SEQ(process_token_splice(env, next));\n  return FAIL;\n}\n\n// --------------------------------------------------------------------------------------------------------\n// Initial actions\n// --------------------------------------------------------------------------------------------------------\n\n/**\n * These are conditioned only on symbols and don't advance, except for `qq_body`, which cannot fail.\n */\nstatic Symbol pre_ws_commands(Env *env) {\n  SEQ(texp_context(env));\n  SEQ(start_brace(env));\n  SEQ(end_brace(env));\n  // Leading whitespace must be included in the node.\n  if (valid(env, QQ_BODY)) return qq_body(env);\n  if (newline_active(env)) SEQ(newline_post(env));\n  else if (env->state->newline.state == NResume) SEQ(newline_resume(env));\n  return FAIL;\n}\n\nstatic Symbol scan_main(Env *env) {\n  MARK(\"main\");\n  SEQ(pre_ws_commands(env));\n  bool whitespace = skip_space(env);\n  if (is_newline(PEEK)) return newline_start(env);\n  else if (not_eof(env)) return interior(env, whitespace);\n  return FAIL;\n}\n\n#ifdef TREE_SITTER_DEBUG\n\nstatic Symbol scan_debug(Env *env) {\n  if (debug_init(env)) return update_state(\"debug init parse buffer\");\n  Symbol result = scan_main(env);\n  debug_finish(env, result);\n  return result;\n}\n\n#endif\n\nstatic bool process_result(Env *env, Symbol result) {\n  if (result == FAIL && is_eof(env) && no_lookahead(env)) {\n    MARK(\"eof whitespace\");\n    // Inlined `end_layout` because of perf glitch\n    if (valid(env, END)) result = end_layout_unchecked(env, \"eof\");\n    else if (valid(env, SEMICOLON)) result = finish(SEMICOLON, \"eof\");\n    else {\n      result = force_end_context(env);\n      if (result == FAIL) {\n        dbg(\"eof | context cap: %d | lookahead cap: %d | parse cap: %d\\n\",\n          env->state->contexts.capacity, env->state->lookahead.capacity, env->state->parse.capacity);}\n    }\n  }\n  return set_result_symbol(env, result);\n}\n\n\nstatic bool scan(Env *env) {\n  if(after_error(env)) { dbg(\"error recovery\\n\"); return false; }\n#ifdef TREE_SITTER_DEBUG\n  Symbol result = scan_debug(env);\n#else\n  Symbol result = scan_main(env);\n#endif\n  return process_result(env, result);\n}\n\n// --------------------------------------------------------------------------------------------------------\n// API\n// --------------------------------------------------------------------------------------------------------\n\ntypedef struct {\n  unsigned contexts;\n  Newline newline;\n#ifdef TREE_SITTER_DEBUG\n  unsigned parse;\n#endif\n} Persist;\n\n/**\n * This function allocates the persistent state of the parser that is passed into the other API functions.\n */\nvoid *tree_sitter_haskell_external_scanner_create() {\n  State *state = ts_calloc(1, sizeof(State));\n  array_reserve(&state->contexts, 8);\n  array_reserve(&state->lookahead, 8);\n#ifdef TREE_SITTER_DEBUG\n  array_reserve(&state->parse, 20);\n#endif\n  return state;\n}\n\n/**\n * Main logic entry point.\n * Since the state is a singular vector, it can just be cast and used directly.\n */\nbool tree_sitter_haskell_external_scanner_scan(void *payload, TSLexer *lexer, const bool *valid_symbols) {\n  Env env = env_new(lexer, valid_symbols, (State*) payload);\n  return scan(&env);\n}\n\nunsigned tree_sitter_haskell_external_scanner_serialize(void *payload, char *buffer) {\n  State *state = (State *) payload;\n  Persist persist = {.contexts = state->contexts.size, .newline = state->newline};\n#ifdef TREE_SITTER_DEBUG\n  persist.parse = state->parse.size;\n#endif\n  unsigned contexts_size = persist.contexts * sizeof(Context);\n  memcpy(buffer, &persist, sizeof(Persist));\n  unsigned to_copy = sizeof(Persist) + contexts_size;\n  if (to_copy > TREE_SITTER_SERIALIZATION_BUFFER_SIZE) return 0;\n  memcpy(buffer + sizeof(Persist), state->contexts.contents, contexts_size);\n#ifdef TREE_SITTER_DEBUG\n  to_copy = serialize_parse_lines(buffer + sizeof(Persist) + contexts_size, &state->parse, to_copy);\n#endif\n  return to_copy;\n}\n\nvoid tree_sitter_haskell_external_scanner_deserialize(void *payload, const char *buffer, unsigned length) {\n  State *state = (State *) payload;\n  Persist p;\n  Persist *persist;\n  if (length > 0)\n    persist = (Persist *) buffer;\n  else {\n    p = (Persist) {.contexts = 0};\n    persist = &p;\n    persist->newline.state = NResume;\n  }\n  unsigned contexts_size = persist->contexts * sizeof(Context);\n  state->newline = persist->newline;\n  array_reserve(&state->contexts, persist->contexts);\n  state->contexts.size = persist->contexts;\n  if (length > 0)\n    memcpy(state->contexts.contents, buffer + sizeof(Persist), contexts_size);\n  state->lookahead.size = 0;\n  state->lookahead.offset = 0;\n  array_reserve(&state->lookahead, 8);\n#ifdef TREE_SITTER_DEBUG\n  if (length > 0)\n    deserialize_parse_lines(buffer + sizeof(Persist) + contexts_size, &state->parse, persist->parse);\n#endif\n}\n\nvoid tree_sitter_haskell_external_scanner_destroy(void *payload) {\n  State *state = (State*) payload;\n#ifdef TREE_SITTER_DEBUG\n  palette();\n  ParseLines *parse = &state->parse;\n  for (unsigned i = 0; i < parse->size; i++) array_delete(array_get(parse, i));\n  array_delete(parse);\n#endif\n  array_delete(&state->contexts);\n  array_delete(&state->lookahead);\n  ts_free(state);\n}\n"
  },
  {
    "path": "src/tree_sitter/alloc.h",
    "content": "#ifndef TREE_SITTER_ALLOC_H_\n#define TREE_SITTER_ALLOC_H_\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#include <stdbool.h>\n#include <stdio.h>\n#include <stdlib.h>\n\n// Allow clients to override allocation functions\n#ifdef TREE_SITTER_REUSE_ALLOCATOR\n\nextern void *(*ts_current_malloc)(size_t size);\nextern void *(*ts_current_calloc)(size_t count, size_t size);\nextern void *(*ts_current_realloc)(void *ptr, size_t size);\nextern void (*ts_current_free)(void *ptr);\n\n#ifndef ts_malloc\n#define ts_malloc  ts_current_malloc\n#endif\n#ifndef ts_calloc\n#define ts_calloc  ts_current_calloc\n#endif\n#ifndef ts_realloc\n#define ts_realloc ts_current_realloc\n#endif\n#ifndef ts_free\n#define ts_free    ts_current_free\n#endif\n\n#else\n\n#ifndef ts_malloc\n#define ts_malloc  malloc\n#endif\n#ifndef ts_calloc\n#define ts_calloc  calloc\n#endif\n#ifndef ts_realloc\n#define ts_realloc realloc\n#endif\n#ifndef ts_free\n#define ts_free    free\n#endif\n\n#endif\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif // TREE_SITTER_ALLOC_H_\n"
  },
  {
    "path": "src/tree_sitter/array.h",
    "content": "#ifndef TREE_SITTER_ARRAY_H_\n#define TREE_SITTER_ARRAY_H_\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#include \"./alloc.h\"\n\n#include <assert.h>\n#include <stdbool.h>\n#include <stdint.h>\n#include <stdlib.h>\n#include <string.h>\n\n#ifdef _MSC_VER\n#pragma warning(disable : 4101)\n#elif defined(__GNUC__) || defined(__clang__)\n#pragma GCC diagnostic push\n#pragma GCC diagnostic ignored \"-Wunused-variable\"\n#endif\n\n#define Array(T)       \\\n  struct {             \\\n    T *contents;       \\\n    uint32_t size;     \\\n    uint32_t capacity; \\\n  }\n\n/// Initialize an array.\n#define array_init(self) \\\n  ((self)->size = 0, (self)->capacity = 0, (self)->contents = NULL)\n\n/// Create an empty array.\n#define array_new() \\\n  { NULL, 0, 0 }\n\n/// Get a pointer to the element at a given `index` in the array.\n#define array_get(self, _index) \\\n  (assert((uint32_t)(_index) < (self)->size), &(self)->contents[_index])\n\n/// Get a pointer to the first element in the array.\n#define array_front(self) array_get(self, 0)\n\n/// Get a pointer to the last element in the array.\n#define array_back(self) array_get(self, (self)->size - 1)\n\n/// Clear the array, setting its size to zero. Note that this does not free any\n/// memory allocated for the array's contents.\n#define array_clear(self) ((self)->size = 0)\n\n/// Reserve `new_capacity` elements of space in the array. If `new_capacity` is\n/// less than the array's current capacity, this function has no effect.\n#define array_reserve(self, new_capacity) \\\n  _array__reserve((Array *)(self), array_elem_size(self), new_capacity)\n\n/// Free any memory allocated for this array. Note that this does not free any\n/// memory allocated for the array's contents.\n#define array_delete(self) _array__delete((Array *)(self))\n\n/// Push a new `element` onto the end of the array.\n#define array_push(self, element)                            \\\n  (_array__grow((Array *)(self), 1, array_elem_size(self)), \\\n   (self)->contents[(self)->size++] = (element))\n\n/// Increase the array's size by `count` elements.\n/// New elements are zero-initialized.\n#define array_grow_by(self, count) \\\n  do { \\\n    if ((count) == 0) break; \\\n    _array__grow((Array *)(self), count, array_elem_size(self)); \\\n    memset((self)->contents + (self)->size, 0, (count) * array_elem_size(self)); \\\n    (self)->size += (count); \\\n  } while (0)\n\n/// Append all elements from one array to the end of another.\n#define array_push_all(self, other)                                       \\\n  array_extend((self), (other)->size, (other)->contents)\n\n/// Append `count` elements to the end of the array, reading their values from the\n/// `contents` pointer.\n#define array_extend(self, count, contents)                    \\\n  _array__splice(                                               \\\n    (Array *)(self), array_elem_size(self), (self)->size, \\\n    0, count,  contents                                        \\\n  )\n\n/// Remove `old_count` elements from the array starting at the given `index`. At\n/// the same index, insert `new_count` new elements, reading their values from the\n/// `new_contents` pointer.\n#define array_splice(self, _index, old_count, new_count, new_contents)  \\\n  _array__splice(                                                       \\\n    (Array *)(self), array_elem_size(self), _index,                \\\n    old_count, new_count, new_contents                                 \\\n  )\n\n/// Insert one `element` into the array at the given `index`.\n#define array_insert(self, _index, element) \\\n  _array__splice((Array *)(self), array_elem_size(self), _index, 0, 1, &(element))\n\n/// Remove one element from the array at the given `index`.\n#define array_erase(self, _index) \\\n  _array__erase((Array *)(self), array_elem_size(self), _index)\n\n/// Pop the last element off the array, returning the element by value.\n#define array_pop(self) ((self)->contents[--(self)->size])\n\n/// Assign the contents of one array to another, reallocating if necessary.\n#define array_assign(self, other) \\\n  _array__assign((Array *)(self), (const Array *)(other), array_elem_size(self))\n\n/// Swap one array with another\n#define array_swap(self, other) \\\n  _array__swap((Array *)(self), (Array *)(other))\n\n/// Get the size of the array contents\n#define array_elem_size(self) (sizeof *(self)->contents)\n\n/// Search a sorted array for a given `needle` value, using the given `compare`\n/// callback to determine the order.\n///\n/// If an existing element is found to be equal to `needle`, then the `index`\n/// out-parameter is set to the existing value's index, and the `exists`\n/// out-parameter is set to true. Otherwise, `index` is set to an index where\n/// `needle` should be inserted in order to preserve the sorting, and `exists`\n/// is set to false.\n#define array_search_sorted_with(self, compare, needle, _index, _exists) \\\n  _array__search_sorted(self, 0, compare, , needle, _index, _exists)\n\n/// Search a sorted array for a given `needle` value, using integer comparisons\n/// of a given struct field (specified with a leading dot) to determine the order.\n///\n/// See also `array_search_sorted_with`.\n#define array_search_sorted_by(self, field, needle, _index, _exists) \\\n  _array__search_sorted(self, 0, _compare_int, field, needle, _index, _exists)\n\n/// Insert a given `value` into a sorted array, using the given `compare`\n/// callback to determine the order.\n#define array_insert_sorted_with(self, compare, value) \\\n  do { \\\n    unsigned _index, _exists; \\\n    array_search_sorted_with(self, compare, &(value), &_index, &_exists); \\\n    if (!_exists) array_insert(self, _index, value); \\\n  } while (0)\n\n/// Insert a given `value` into a sorted array, using integer comparisons of\n/// a given struct field (specified with a leading dot) to determine the order.\n///\n/// See also `array_search_sorted_by`.\n#define array_insert_sorted_by(self, field, value) \\\n  do { \\\n    unsigned _index, _exists; \\\n    array_search_sorted_by(self, field, (value) field, &_index, &_exists); \\\n    if (!_exists) array_insert(self, _index, value); \\\n  } while (0)\n\n// Private\n\ntypedef Array(void) Array;\n\n/// This is not what you're looking for, see `array_delete`.\nstatic inline void _array__delete(Array *self) {\n  if (self->contents) {\n    ts_free(self->contents);\n    self->contents = NULL;\n    self->size = 0;\n    self->capacity = 0;\n  }\n}\n\n/// This is not what you're looking for, see `array_erase`.\nstatic inline void _array__erase(Array *self, size_t element_size,\n                                uint32_t index) {\n  assert(index < self->size);\n  char *contents = (char *)self->contents;\n  memmove(contents + index * element_size, contents + (index + 1) * element_size,\n          (self->size - index - 1) * element_size);\n  self->size--;\n}\n\n/// This is not what you're looking for, see `array_reserve`.\nstatic inline void _array__reserve(Array *self, size_t element_size, uint32_t new_capacity) {\n  if (new_capacity > self->capacity) {\n    if (self->contents) {\n      self->contents = ts_realloc(self->contents, new_capacity * element_size);\n    } else {\n      self->contents = ts_malloc(new_capacity * element_size);\n    }\n    self->capacity = new_capacity;\n  }\n}\n\n/// This is not what you're looking for, see `array_assign`.\nstatic inline void _array__assign(Array *self, const Array *other, size_t element_size) {\n  _array__reserve(self, element_size, other->size);\n  self->size = other->size;\n  memcpy(self->contents, other->contents, self->size * element_size);\n}\n\n/// This is not what you're looking for, see `array_swap`.\nstatic inline void _array__swap(Array *self, Array *other) {\n  Array swap = *other;\n  *other = *self;\n  *self = swap;\n}\n\n/// This is not what you're looking for, see `array_push` or `array_grow_by`.\nstatic inline void _array__grow(Array *self, uint32_t count, size_t element_size) {\n  uint32_t new_size = self->size + count;\n  if (new_size > self->capacity) {\n    uint32_t new_capacity = self->capacity * 2;\n    if (new_capacity < 8) new_capacity = 8;\n    if (new_capacity < new_size) new_capacity = new_size;\n    _array__reserve(self, element_size, new_capacity);\n  }\n}\n\n/// This is not what you're looking for, see `array_splice`.\nstatic inline void _array__splice(Array *self, size_t element_size,\n                                 uint32_t index, uint32_t old_count,\n                                 uint32_t new_count, const void *elements) {\n  uint32_t new_size = self->size + new_count - old_count;\n  uint32_t old_end = index + old_count;\n  uint32_t new_end = index + new_count;\n  assert(old_end <= self->size);\n\n  _array__reserve(self, element_size, new_size);\n\n  char *contents = (char *)self->contents;\n  if (self->size > old_end) {\n    memmove(\n      contents + new_end * element_size,\n      contents + old_end * element_size,\n      (self->size - old_end) * element_size\n    );\n  }\n  if (new_count > 0) {\n    if (elements) {\n      memcpy(\n        (contents + index * element_size),\n        elements,\n        new_count * element_size\n      );\n    } else {\n      memset(\n        (contents + index * element_size),\n        0,\n        new_count * element_size\n      );\n    }\n  }\n  self->size += new_count - old_count;\n}\n\n/// A binary search routine, based on Rust's `std::slice::binary_search_by`.\n/// This is not what you're looking for, see `array_search_sorted_with` or `array_search_sorted_by`.\n#define _array__search_sorted(self, start, compare, suffix, needle, _index, _exists) \\\n  do { \\\n    *(_index) = start; \\\n    *(_exists) = false; \\\n    uint32_t size = (self)->size - *(_index); \\\n    if (size == 0) break; \\\n    int comparison; \\\n    while (size > 1) { \\\n      uint32_t half_size = size / 2; \\\n      uint32_t mid_index = *(_index) + half_size; \\\n      comparison = compare(&((self)->contents[mid_index] suffix), (needle)); \\\n      if (comparison <= 0) *(_index) = mid_index; \\\n      size -= half_size; \\\n    } \\\n    comparison = compare(&((self)->contents[*(_index)] suffix), (needle)); \\\n    if (comparison == 0) *(_exists) = true; \\\n    else if (comparison < 0) *(_index) += 1; \\\n  } while (0)\n\n/// Helper macro for the `_sorted_by` routines below. This takes the left (existing)\n/// parameter by reference in order to work with the generic sorting function above.\n#define _compare_int(a, b) ((int)*(a) - (int)(b))\n\n#ifdef _MSC_VER\n#pragma warning(default : 4101)\n#elif defined(__GNUC__) || defined(__clang__)\n#pragma GCC diagnostic pop\n#endif\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif  // TREE_SITTER_ARRAY_H_\n"
  },
  {
    "path": "src/tree_sitter/parser.h",
    "content": "#ifndef TREE_SITTER_PARSER_H_\n#define TREE_SITTER_PARSER_H_\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#include <stdbool.h>\n#include <stdint.h>\n#include <stdlib.h>\n\n#define ts_builtin_sym_error ((TSSymbol)-1)\n#define ts_builtin_sym_end 0\n#define TREE_SITTER_SERIALIZATION_BUFFER_SIZE 1024\n\n#ifndef TREE_SITTER_API_H_\ntypedef uint16_t TSStateId;\ntypedef uint16_t TSSymbol;\ntypedef uint16_t TSFieldId;\ntypedef struct TSLanguage TSLanguage;\n#endif\n\ntypedef struct {\n  TSFieldId field_id;\n  uint8_t child_index;\n  bool inherited;\n} TSFieldMapEntry;\n\ntypedef struct {\n  uint16_t index;\n  uint16_t length;\n} TSFieldMapSlice;\n\ntypedef struct {\n  bool visible;\n  bool named;\n  bool supertype;\n} TSSymbolMetadata;\n\ntypedef struct TSLexer TSLexer;\n\nstruct TSLexer {\n  int32_t lookahead;\n  TSSymbol result_symbol;\n  void (*advance)(TSLexer *, bool);\n  void (*mark_end)(TSLexer *);\n  uint32_t (*get_column)(TSLexer *);\n  bool (*is_at_included_range_start)(const TSLexer *);\n  bool (*eof)(const TSLexer *);\n  void (*log)(const TSLexer *, const char *, ...);\n};\n\ntypedef enum {\n  TSParseActionTypeShift,\n  TSParseActionTypeReduce,\n  TSParseActionTypeAccept,\n  TSParseActionTypeRecover,\n} TSParseActionType;\n\ntypedef union {\n  struct {\n    uint8_t type;\n    TSStateId state;\n    bool extra;\n    bool repetition;\n  } shift;\n  struct {\n    uint8_t type;\n    uint8_t child_count;\n    TSSymbol symbol;\n    int16_t dynamic_precedence;\n    uint16_t production_id;\n  } reduce;\n  uint8_t type;\n} TSParseAction;\n\ntypedef struct {\n  uint16_t lex_state;\n  uint16_t external_lex_state;\n} TSLexMode;\n\ntypedef union {\n  TSParseAction action;\n  struct {\n    uint8_t count;\n    bool reusable;\n  } entry;\n} TSParseActionEntry;\n\ntypedef struct {\n  int32_t start;\n  int32_t end;\n} TSCharacterRange;\n\nstruct TSLanguage {\n  uint32_t version;\n  uint32_t symbol_count;\n  uint32_t alias_count;\n  uint32_t token_count;\n  uint32_t external_token_count;\n  uint32_t state_count;\n  uint32_t large_state_count;\n  uint32_t production_id_count;\n  uint32_t field_count;\n  uint16_t max_alias_sequence_length;\n  const uint16_t *parse_table;\n  const uint16_t *small_parse_table;\n  const uint32_t *small_parse_table_map;\n  const TSParseActionEntry *parse_actions;\n  const char * const *symbol_names;\n  const char * const *field_names;\n  const TSFieldMapSlice *field_map_slices;\n  const TSFieldMapEntry *field_map_entries;\n  const TSSymbolMetadata *symbol_metadata;\n  const TSSymbol *public_symbol_map;\n  const uint16_t *alias_map;\n  const TSSymbol *alias_sequences;\n  const TSLexMode *lex_modes;\n  bool (*lex_fn)(TSLexer *, TSStateId);\n  bool (*keyword_lex_fn)(TSLexer *, TSStateId);\n  TSSymbol keyword_capture_token;\n  struct {\n    const bool *states;\n    const TSSymbol *symbol_map;\n    void *(*create)(void);\n    void (*destroy)(void *);\n    bool (*scan)(void *, TSLexer *, const bool *symbol_whitelist);\n    unsigned (*serialize)(void *, char *);\n    void (*deserialize)(void *, const char *, unsigned);\n  } external_scanner;\n  const TSStateId *primary_state_ids;\n};\n\nstatic inline bool set_contains(TSCharacterRange *ranges, uint32_t len, int32_t lookahead) {\n  uint32_t index = 0;\n  uint32_t size = len - index;\n  while (size > 1) {\n    uint32_t half_size = size / 2;\n    uint32_t mid_index = index + half_size;\n    TSCharacterRange *range = &ranges[mid_index];\n    if (lookahead >= range->start && lookahead <= range->end) {\n      return true;\n    } else if (lookahead > range->end) {\n      index = mid_index;\n    }\n    size -= half_size;\n  }\n  TSCharacterRange *range = &ranges[index];\n  return (lookahead >= range->start && lookahead <= range->end);\n}\n\n/*\n *  Lexer Macros\n */\n\n#ifdef _MSC_VER\n#define UNUSED __pragma(warning(suppress : 4101))\n#else\n#define UNUSED __attribute__((unused))\n#endif\n\n#define START_LEXER()           \\\n  bool result = false;          \\\n  bool skip = false;            \\\n  UNUSED                        \\\n  bool eof = false;             \\\n  int32_t lookahead;            \\\n  goto start;                   \\\n  next_state:                   \\\n  lexer->advance(lexer, skip);  \\\n  start:                        \\\n  skip = false;                 \\\n  lookahead = lexer->lookahead;\n\n#define ADVANCE(state_value) \\\n  {                          \\\n    state = state_value;     \\\n    goto next_state;         \\\n  }\n\n#define ADVANCE_MAP(...)                                              \\\n  {                                                                   \\\n    static const uint16_t map[] = { __VA_ARGS__ };                    \\\n    for (uint32_t i = 0; i < sizeof(map) / sizeof(map[0]); i += 2) {  \\\n      if (map[i] == lookahead) {                                      \\\n        state = map[i + 1];                                           \\\n        goto next_state;                                              \\\n      }                                                               \\\n    }                                                                 \\\n  }\n\n#define SKIP(state_value) \\\n  {                       \\\n    skip = true;          \\\n    state = state_value;  \\\n    goto next_state;      \\\n  }\n\n#define ACCEPT_TOKEN(symbol_value)     \\\n  result = true;                       \\\n  lexer->result_symbol = symbol_value; \\\n  lexer->mark_end(lexer);\n\n#define END_STATE() return result;\n\n/*\n *  Parse Table Macros\n */\n\n#define SMALL_STATE(id) ((id) - LARGE_STATE_COUNT)\n\n#define STATE(id) id\n\n#define ACTIONS(id) id\n\n#define SHIFT(state_value)            \\\n  {{                                  \\\n    .shift = {                        \\\n      .type = TSParseActionTypeShift, \\\n      .state = (state_value)          \\\n    }                                 \\\n  }}\n\n#define SHIFT_REPEAT(state_value)     \\\n  {{                                  \\\n    .shift = {                        \\\n      .type = TSParseActionTypeShift, \\\n      .state = (state_value),         \\\n      .repetition = true              \\\n    }                                 \\\n  }}\n\n#define SHIFT_EXTRA()                 \\\n  {{                                  \\\n    .shift = {                        \\\n      .type = TSParseActionTypeShift, \\\n      .extra = true                   \\\n    }                                 \\\n  }}\n\n#define REDUCE(symbol_name, children, precedence, prod_id) \\\n  {{                                                       \\\n    .reduce = {                                            \\\n      .type = TSParseActionTypeReduce,                     \\\n      .symbol = symbol_name,                               \\\n      .child_count = children,                             \\\n      .dynamic_precedence = precedence,                    \\\n      .production_id = prod_id                             \\\n    },                                                     \\\n  }}\n\n#define RECOVER()                    \\\n  {{                                 \\\n    .type = TSParseActionTypeRecover \\\n  }}\n\n#define ACCEPT_INPUT()              \\\n  {{                                \\\n    .type = TSParseActionTypeAccept \\\n  }}\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif  // TREE_SITTER_PARSER_H_\n"
  },
  {
    "path": "src/unicode.h",
    "content": "#include <stdbool.h>\n#include <stdint.h>\n\nstatic uint8_t bitmap_identifier_1[] = {\n0xff,3,0xfe,0xff,0xff,7,0xfe,0xff,0xff,7,0,0,0,0,0,4,0x2c,0x76,0xff,0xff,\n0x7f,0xff,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,\n0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,\n0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,\n0xff,0xff,0xc3,0xff,3,0,0x1f,0x50,0,0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,\n0xff,0xff,0xff,0xff,0xdf,0xbc,0x40,0xd7,0xff,0xff,0xfb,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,\n0xbf,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfb,0xfc,\n0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,\n0xfe,0xff,0xff,0xff,0x7f,2,0xff,0xff,0xff,0xff,0xff,1,0xfe,0xff,0xff,0xff,0xff,0xbf,0xb6,0,\n0xff,0xff,0xff,0x87,7,0,0,0,0xff,7,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xc3,\n0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xef,0x9f,0xff,0xfd,0xff,0x9f,0,0,\n0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xe7,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,\n3,0,0xff,0xff,0xff,0xff,0xff,0xff,0x3f,0x24,0xff,0xff,0xff,0xff,0xff,0x3f,0,0,0xff,0xff,\n0xff,0xf,0xff,7,0xff,0xff,0xff,0x7e,0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfb,0xff,\n0xff,0xff,0xf7,0xff,0xff,0xff,0xff,0xff,0xff,0x37,0xfe,0x21,0xff,0xff,0xcf,0xff,0xfe,0xff,0xe3,0x9f,\n0xf9,0xff,0xff,0xfd,0xc5,0x33,0x1e,0x60,0,0xb0,0xcf,0xff,0xf3,0x53,0xe6,0x87,0xf9,0xff,0xff,0xfd,\n0x6d,0x13,0x86,0x39,2,0x5e,0xc0,0xff,0x3f,0,0xe6,0xbf,0xfb,0xff,0xff,0xfd,0xed,0x33,0xbe,0x21,\n1,0,0xcf,0xff,0,0xfe,0xe2,0x9f,0xf9,0xff,0xff,0xfd,0xed,0xb3,0x1e,0x20,0x60,0xb0,0xcf,0xff,\n0xfe,0,0xec,0xc7,0x3d,0xd6,0x18,0xc7,0xff,3,1,0x20,1,0,0xc0,0xff,7,0,0xf1,0xdf,\n0xfd,0xff,0xff,0xfd,0xff,0xf3,0xc1,0x3d,0x60,0x27,0xcf,0xff,0,0x7f,0xe3,0xdf,0xfd,0xff,0xff,0xfd,\n0xef,0xb3,0x40,0x30,0,0x60,0xcf,0xff,6,0,0xf3,0xdf,0xfd,0xff,0xff,0xff,0xff,0x3f,0x1e,0x60,\n0x70,0xff,0xcf,0xff,0xff,0xfd,0xe2,0xff,0x7f,0xfc,0xff,0xff,0xfb,0x2f,0x7f,4,0x5c,0,0xc0,0xff,\n0,0,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,7,0xff,0x7f,0xff,3,0,0,0,0,0xd6,0xf7,\n0xff,0xff,0xaf,0xff,0xff,0x3f,0x5f,0x7f,0xff,0xf3,0,0,0,0,1,0,0,3,0xff,0xff,\n0xaf,2,0xff,0xfe,0xff,0xff,0xff,0x1f,0xfe,0x7f,0xdf,0xff,0xff,0xfe,0xff,0xff,0xff,0x1f,0x40,0,\n0,0,0,0,0,0,0xff,0xff,0xff,0xff,0xff,0xe7,0xfd,0xe6,0xff,3,0x3f,0xff,0x63,0xc0,\n0xff,0xff,0x67,0x60,0xff,0x23,0xff,0xff,0xff,0xff,0xbf,0x20,0xff,0xff,0xff,0xff,0xff,0xf7,0xff,0xff,\n0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,\n0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x3d,\n0x7f,0x3d,0xff,0xff,0xff,0xff,0xff,0x3d,0xff,0xff,0xff,0xff,0x3d,0x7f,0x3d,0xff,0x7f,0xff,0xff,0xff,\n0xff,0xff,0xff,0xff,0x3d,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xe7,0,0xfe,0xff,0x1f,0xff,0xff,\n0,0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x3f,0x3f,0xfe,0xff,0xff,0xff,0xff,0xff,\n0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,\n0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,\n0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,\n0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x9f,0xff,0xff,0xfe,0xff,0xff,7,0xff,0xff,\n0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xc7,0xff,1,0xff,0xff,0x1f,0x80,0xff,0xff,0xf,0,0xff,0xff,\n0xf,0,0xff,0xdf,0xd,0,0xff,0xff,0xff,0xff,0xff,0xff,0xbf,0x3f,0x40,0xfe,0x8f,0x30,0xff,3,\n0xff,3,0,0xb8,0xff,3,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,1,0xff,0xff,\n0xff,0xff,0xff,7,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x3f,0,0xff,0xff,0xff,0x7f,0x87,1,\n4,0xe,0xc0,0xff,0xff,0xff,0xff,0x3f,0x1f,0,0xff,0xff,0xff,0xff,0xff,0xf,0xff,0xff,0xff,3,\n0xff,7,0,0,0,0,0xff,0xff,0xff,9,0xff,0xff,0xff,0xff,0xff,0xff,0x5f,0x7f,0xe5,0x1f,\n0xf8,0x9f,0xff,3,0xff,3,0x80,0,0xff,0xbf,0xff,0x7f,0,0,0,0,0,0,0xef,0xff,\n0xff,0xff,0xff,0xff,0xdf,0x17,0xe4,0x1f,0xff,3,0,0xf8,0xf,0,0xfb,0xff,0xff,0xff,0x3d,0xfb,\n0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xa3,3,0,0xff,0xff,0xff,0xff,0xf,0xf0,0xcf,0,0xff,0xe3,\n0xff,0xff,0xff,0xff,0xff,0x3f,0xff,1,0xff,0xff,0xff,0xff,0xff,0xe7,0,0,0xf7,0xff,0xfd,0xff,\n0x7f,7,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,\n0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,\n0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,\n0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x3f,0x3f,0xff,0xff,0xff,0xff,0x3f,0x3f,0xff,0xaa,0xff,0xff,\n0xff,0x3f,0xff,0xff,0xff,0xff,0xff,0xff,0xdf,0x5f,0xdc,0x1f,0xcf,0xf,0xff,0x1f,0xdc,0x1f,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0xf3,0x83,0xff,3,0xff,0x1f,0,0,\n0,0,0,0,0xff,0x1f,0xe2,0xff,1,0,0x84,0xfc,0x2f,0x3e,0x50,0xbd,0xff,0xf3,0xe0,0x43,\n0xff,0xff,0xff,0xff,0xff,0xff,0xff,3,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xff,0xff,\n0xff,0xff,0xff,0xff,0xff,0xf,0,0,0,0,0,0,0,0,0,0xfc,0xff,0xff,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xc0,0xff,0xff,0xff,\n0xf,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,\n0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x1f,0xf8,0xf,0x20,0xff,0xff,0xff,0xff,0xbf,0x20,\n0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x80,0,0x80,0xff,0xff,0x7f,0,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,\n0x7f,0x7f,0xff,0xff,0xff,0xff,0,0,0,0,0,0x80,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0xe0,0,0,0,0xfe,0x3f,0x3e,0x1f,0xfe,0xff,\n0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xe6,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,\n0xff,0xf7,0xe0,0xff,0xff,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,\n0x3c,0,0xff,0xff,0xff,0xff,0,0,0,0,0,0,0xff,0xff,0,0,0,0,0xff,3,\n0,0,0,0xff,0xfe,0xff,0,0,0,0,0xff,3,0,0,0,0,0xfe,0xff,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0x80,0,0,0,0,0,0,0,0,1,\n};\n\nstatic int32_t bitmap_identifier_1_min_codepoint = 48;\n\nstatic int32_t bitmap_identifier_1_max_codepoint = 19968;\n\nstatic bool is_identifier_1_char(int32_t c) {\n  int32_t offset = c - bitmap_identifier_1_min_codepoint;\n  return (bitmap_identifier_1[offset >> 3] & (1u << (offset & 7))) > 0;\n}\n\nstatic uint8_t bitmap_identifier_2[] = {\n0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,\n0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,\n0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,\n0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,\n0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,\n0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,\n0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,\n0xff,0xff,0xff,0xff,0xff,0x3f,0,0,0,0,0,0,0,0,0xfe,0xff,0xff,0xff,0xff,0x7f,\n0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,\n0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x3f,0xfe,0xff,0xff,0x1f,0,0,\n0xfe,0xff,0xff,0xff,0xff,0xff,0xe1,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,\n0xff,0xff,7,0,0,0,0,0xff,0xf9,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,\n0xff,0xf3,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf,0xd6,7,0,0,0xf8,0xff,0xff,0xff,0xff,0xff,\n0xcf,0x20,0x7e,0,0xfe,0xff,0xff,0xff,0xff,0xff,0x1f,0,0xf8,0xff,0xff,0xff,0xff,0xff,0x1f,0,\n0x60,0,0xfe,7,0xfe,0xff,0xff,0xd1,0xff,0xff,0xff,0xff,0xff,0x7f,0xfe,0xff,0xff,0xff,7,0,\n0xfe,0xff,0xff,0x3f,0xee,0xff,0xff,0xff,0xff,0xff,0x9f,0x67,0,0,0xff,7,0xfe,0xff,0xff,0xff,\n0xfe,0xff,0xff,0xff,0xff,0xff,0xcc,0,0xfe,0x3f,0xfe,7,0xfe,0xff,0xff,0xa8,0xff,0xff,0xff,0xff,\n0xff,0xff,0xff,0xff,0xf,0,0,0x70,0xfe,0x6f,0xb8,0,0xfc,0xfc,0xfc,0,0xfe,0xfe,0xfe,0xff,\n0xff,0xff,0xff,0xef,0xff,7,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,\n0x4f,0x42,0xfe,7,2,\n};\n\nstatic int32_t bitmap_identifier_2_min_codepoint = 40959;\n\nstatic int32_t bitmap_identifier_2_max_codepoint = 44032;\n\nstatic bool is_identifier_2_char(int32_t c) {\n  int32_t offset = c - bitmap_identifier_2_min_codepoint;\n  return (bitmap_identifier_2[offset >> 3] & (1u << (offset & 7))) > 0;\n}\n\nstatic uint8_t bitmap_identifier_3[] = {\n1,0xe0,0xff,0xff,0xf,0xff,0xff,0xff,0xff,0xff,0xff,1,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0xe0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,\n0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,\n0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xe7,0xff,0xff,0xff,0xff,0xff,0xff,\n0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0,0,0,0,0xe0,0xf,0,0x1f,0xfc,0xbf,0xff,0xef,0x6b,\n0xfb,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0,0,0,0,0xff,0xff,\n0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,\n0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,\n0xff,0xff,0xff,7,0,0xe0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x9f,0xff,0xff,0xff,0xff,0xff,0xff,\n0x1f,0,0,0,0,0xe0,0xff,0xe1,0xff,0x1f,0,0xe0,0xff,0x1f,0,0,0,0,0,0,\n0,0xe0,0xfb,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,3,\n0,0xe0,0x7f,0xc0,0xff,0xff,0xff,0xc0,0xff,0xff,0xff,0,0xf8,0xff,0xff,0xff,0xff,0xff,0xff,0xff,\n0xff,0xff,0xff,0x8f,0x9f,0x9f,0x9f,3,0,0,0,0xe0,0xff,0xfd,0xff,0xff,0xef,0xff,0xff,0xf6,\n0xff,0xe7,0xff,7,0,0,0,0xe0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,\n0xff,0xff,0xff,0,0xf0,0xff,0xff,0xff,0xff,0xff,1,0xe0,0xff,0xff,0xff,0xff,0xff,0xff,0x3f,0,\n0x80,1,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0xe0,0xff,0xff,0xff,0xe3,0xff,0xff,0xff,0xff,\n0xff,0x3f,0,0xe0,0xff,0xff,0xff,0xe1,0xff,0xff,0xff,0xff,1,0xfc,0xff,0xff,0xff,0xe0,0xff,0xff,\n0xff,0xff,0xff,0xe0,0xff,0xff,0xff,0xe7,0xff,0xff,0xff,0xff,0xe1,0xdf,7,0,0,0,0,0xe0,\n0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xe7,\n0x7f,0xe0,0xff,0xff,0xff,0xff,0xe1,0xff,0xff,0xff,0xff,0xe1,0xff,0xff,0xff,0xff,0x1f,0xe0,0xff,0xff,\n0xff,0xff,0xff,0xff,1,0xe0,0xff,0xfe,0xff,0xfe,0xf6,0x7f,0xff,0x7f,0x7f,3,0,0,0,0,\n0,0,0,0xe0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,\n0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,\n0xff,0xff,0xf,0xe0,0xff,0xff,7,0xe0,0x1f,0,0,0xe0,0xf7,0xff,0xff,0xff,0xff,0xbf,0xff,0,\n0,0,0,0,0,0,0,0xe0,0xa7,0xff,0xff,0xff,0xff,0xff,0x37,0xf2,0xff,0xff,0xe7,0xff,\n0xff,0xff,0xcf,0xff,0xff,0xff,0xff,0xf,0xf0,0x1f,0,0,0,0,0,0xe0,0xff,0xff,6,0xff,\n0xff,0xff,0xff,0xe1,0xff,0xff,0x7f,0,0,0,0,0,0,0,0,0xe0,0xff,0xff,0xff,0xff,\n0xff,0xff,0x1f,0xfe,0xff,0x9f,0xff,0xff,0xff,0xff,0xff,0xff,0xd,0xfe,0xdd,0xff,0xff,0xff,0xe7,0xf0,\n0x3f,0,0,0xe0,0xff,0xff,0xff,0xef,0xff,0xff,0xff,0x1f,0,0,0,0xe0,0xdf,0xff,0xff,0xff,\n0xf,0x1f,0,0xe0,0xff,0xff,0xff,0xff,0xff,0xff,7,0xe0,0xff,0xff,0xe7,0xff,0xff,0xff,0xe0,0xff,\n0xff,0x7f,0,0,0xc0,0x1f,0,0,0,0,0,0,0,0,0,0xe0,0xff,0xff,0xff,0xff,\n0xff,0xff,0xff,0xff,0x3f,0,0,0,0,0,0,0xe0,0xff,0xff,0xff,0xff,0xff,0xff,0,0xe0,\n0xff,0xff,0xff,0xff,0xff,0xff,0x80,0xff,0xff,0xff,0xff,0xff,0x1f,0xe0,0x7f,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0xe0,0xff,0xff,0xff,0xef,0xff,0xff,0xff,0xff,\n0x7f,0x63,0,0,0,0,0,0,0,0,0,0xfc,0xff,0xff,0xff,0xff,0x1f,0xe0,0xff,0xff,\n0xff,0xff,3,0,0,0xe0,0xff,0xff,7,0,0,0,0,0xe0,0xff,0xff,0xff,1,0,0xe0,\n0xff,0xff,0xf,0x40,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf,0x80,0xff,0xff,0xff,0xff,7,0x70,\n0xff,0xff,0xff,0xff,0xff,0x1f,0xcf,0x80,0,0xe0,0xff,0xff,0x3f,0xe0,0x7f,0xe0,0xff,0xff,0xff,0xff,\n0xff,0xfd,0xfb,0x1f,0x12,0xe0,0xff,0xff,0xff,0xff,9,0x60,0xff,0xff,0xff,0xff,0xff,0xff,0xf8,0xcf,\n0xc3,0xf3,0xff,0xc2,0xff,0xff,3,0xe0,0xff,0x7f,0xff,0xff,0xff,0x71,0x1a,0x78,0,0,0,0,\n0,0,0,0xe0,0xaf,0xf7,0xff,0xf7,0x3f,0xe0,0xff,0xff,0xff,0xff,0xff,0x1f,0xff,0xe0,0x7f,0x60,\n0xfc,0x33,0xff,0xff,0xbf,0xbf,0x7d,0x27,0,0x20,0,0x7c,0xf8,0xe3,3,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0xe0,0xff,0xff,0xff,0xff,0xff,0xff,0xe3,0x9f,\n0xfb,0xe0,0x7f,0x78,0,0,0,0xe0,0xff,0xff,0xff,0xff,0xff,0x1f,0xbf,0xb0,0x17,0xe0,0x7f,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xe0,\n0xff,0xff,0xff,0xff,0xff,0x8f,7,0x36,0,0,0xe0,7,0,0,0,0xe0,0xff,0xff,0xff,0xff,\n0xff,0x1f,0xff,0x34,2,0xe0,0x7f,0,0,0,0,0xe0,0xff,0xff,0xff,0xff,0xff,0xe5,0x37,0xe0,\n0x7f,0,0,0,0,0,0,0xe0,0xff,0xff,0xff,0x9c,0xf7,0xe1,0xff,0xe1,0xf,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xe0,\n0xff,0xff,0xff,0xff,0xff,0xf1,0xdf,0,0,0,0,0,0,0,0,0,0,0,0,0xe0,\n0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0,0xf0,0x4f,0xfe,0xed,0xff,0xff,0x1f,0,0x5b,\n1,0xe0,0x7f,0,0,0,0,0,0,0,0,0xe0,0x9f,0xff,0xff,0xff,0xff,0x3f,0x9e,0x61,\n1,0,0,0xe0,0xff,0xff,0xff,0xff,0xff,0xff,0xbf,0xf,0x10,0xe0,0xcf,0xff,0xff,0xff,0xff,0xff,\n0xff,0xff,0x6f,4,0,0xe0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x3f,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0xe0,0xbf,0xff,0xff,0xff,0xff,0xef,0xef,0x37,0,0xe0,0xff,0xff,\n0xff,0x83,0xff,0xff,0xff,0x9f,0xff,0xff,0x9f,0xbf,0xd,0,0,0,0,0,0,0,0,0xe0,\n0x6f,0xff,0xff,0xff,0xff,0xff,0x8f,0xf6,0x1f,0xe0,0x7f,0xe0,0xb7,0xff,0xff,0xff,0x7f,0x60,0x34,0xe0,\n0x7f,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xe0,\n0xff,0xff,3,0xe0,0xfe,0xbf,0xff,0xff,0xff,0xff,0xf9,0xa0,0,0xe0,0x7f,0,0,0,0,0,\n0,0,0,0,0,0x20,0,0xe0,0xff,0xff,3,0,0,0,0,0xe0,0xff,0xff,0xff,0xff,\n0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,\n0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,\n0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,\n0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,\n0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,\n0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0,0,0,0,0,0,0,0,0,\n0,0,0,0xe0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf,0,0xe0,\n0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,\n0xff,0xff,0xff,0xff,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0xe0,0xff,0xff,0xff,0xff,0xff,0xff,\n0xff,0xff,0xff,0xff,0xff,0x3f,0,0xe0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,\n0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,\n0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,\n0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,\n0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,\n0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,\n0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,\n0xff,0x1f,0,0xe0,0xff,0xff,7,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0xe0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,\n0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,\n0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,\n0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,\n0xf,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xe0,\n0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,\n0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,\n0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,\n0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x3f,0xe0,0xff,0xff,0xff,0xef,0x7f,0xe0,0xff,0xff,\n0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xef,0x7f,0xe0,0xff,0xff,0xff,0xe7,3,0xe0,0xff,0xff,0xff,0xff,\n0xff,0xff,0xf,0xe0,1,0xe0,0x7f,0x7f,0xff,0xff,0x1f,0xfc,0xff,0x1f,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xe0,\n0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf,0,0,0,0,0,0,0,0,0,\n0,0,0,0xe0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x30,0,0,0,0,0,0,\n0,0xf0,0xff,0x1f,0,0,0,0,0,0,0,0x60,3,0,0,0x20,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0x10,0xe0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,\n0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,\n0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,\n0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,\n0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,\n0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,\n0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,\n0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,7,0,\n0,0,0,0x20,0x20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0xe0,0xfd,0xed,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,\n0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,\n0,0x80,0,0,0,0xe0,4,0,0x1e,0xe0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,\n0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,\n0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,1,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0xe0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,\n0xff,0xe0,0xff,0xe3,0x3f,0xe0,0x7f,0xc,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xe0,0xff,0xff,0xff,0xff,\n0xff,0xe7,0xff,0xff,0xf,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0x70,0,0,0xff,0xfc,1,0,0,\n0x80,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0x80,\n3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xe0,0xff,0xff,1,0xe0,\n0xff,0xff,1,0,0,0,0,0,0,0,0,0,0,0,0,0xe0,0xff,0xff,0x3f,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xe0,0xff,0xff,0xff,0xff,\n0xff,0xff,0xff,0xff,0xff,0xff,0xfb,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x9b,0xcc,0xfb,0x7f,0xfd,\n0xfd,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf7,0xfc,0xfb,0xfb,0xff,0xff,0x7f,0xef,0x8b,0xbf,0xff,0xff,\n0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,\n0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,\n0xe7,0xff,0xff,0xbf,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xfe,0xff,0xff,0xfb,0xff,0xff,0xff,0xfb,0xff,\n0xff,0xef,0xff,0xff,0xff,0xef,0xff,0xff,0xbf,0xff,0xff,0xff,0xbf,0xff,0xff,0xff,0xfe,0xf9,0xff,0xff,\n0xff,0xff,0xff,0x1f,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0xe0,0xff,0xff,0xff,0xff,0xff,0xff,0xf,0xff,0xff,0xff,0xff,0xff,\n0xff,3,4,0,2,0,0,0xdf,0xff,0x1f,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0xe0,0xff,0xff,0xff,0xf,0xfc,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xe0,\n0xef,0xff,0x3f,0x7f,0xfb,0xe0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,7,0,0,0,0x10,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0xe0,0xff,0xff,0xff,0xff,0xff,0xe3,0xff,0xe7,\n0x7f,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0xe0,0xff,0xff,0xff,0xf,0,0xe0,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0xe0,0xff,0xff,0xff,0xff,0x7f,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0xe0,0xef,0xed,0xff,0xef,0xff,0xff,0xff,0xff,\n0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,\n0xf3,0xff,0xf,0,0,0,0,0xe0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xe1,0x7f,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xc0,0xff,0xff,\n0xff,0xff,0xff,0xff,0xff,0xdd,3,0,0,0,0,0,0,0,0,0xc0,0xff,0xff,0xff,0xff,\n0xff,0xf7,0xff,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0xe0,0xfd,0xff,0xff,0xdf,0xd2,0xff,0x5e,0x81,0x50,0xdd,0x52,0xd5,\n0xf2,0xfe,0xde,0xeb,0x7f,0xff,0xff,0xc1,0x7d,0xff,0xff,1,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0xe0,0xff,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0xe0,0x7f,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0x20,\n};\n\nstatic int32_t bitmap_identifier_3_min_codepoint = 55203;\n\nstatic int32_t bitmap_identifier_3_max_codepoint = 131072;\n\nstatic bool is_identifier_3_char(int32_t c) {\n  int32_t offset = c - bitmap_identifier_3_min_codepoint;\n  return (bitmap_identifier_3[offset >> 3] & (1u << (offset & 7))) > 0;\n}\n\nstatic uint8_t bitmap_identifier_4[] = {\n1,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,4,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0x40,2,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,4,0,2,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,2,0,2,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0x40,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xfe,0xff,0xff,0xff,\n0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,\n0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,\n0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,\n0xff,0xff,0xff,0x7f,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,8,2,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,\n};\n\nstatic int32_t bitmap_identifier_4_min_codepoint = 173791;\n\nstatic int32_t bitmap_identifier_4_max_codepoint = 205743;\n\nstatic bool is_identifier_4_char(int32_t c) {\n  int32_t offset = c - bitmap_identifier_4_min_codepoint;\n  return (bitmap_identifier_4[offset >> 3] & (1u << (offset & 7))) > 0;\n}\n\nstatic uint8_t bitmap_identifier_5[] = {\n0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,\n0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,\n};\n\nstatic int32_t bitmap_identifier_5_min_codepoint = 917760;\n\nstatic int32_t bitmap_identifier_5_max_codepoint = 917999;\n\nstatic bool is_identifier_5_char(int32_t c) {\n  int32_t offset = c - bitmap_identifier_5_min_codepoint;\n  return (bitmap_identifier_5[offset >> 3] & (1u << (offset & 7))) > 0;\n}\n\nstatic bool is_identifier_char(int32_t c) {\n  return\n    c < bitmap_identifier_1_min_codepoint ? false :\n    c <= bitmap_identifier_1_max_codepoint ? is_identifier_1_char(c) :\n    c < bitmap_identifier_2_min_codepoint ? false :\n    c <= bitmap_identifier_2_max_codepoint ? is_identifier_2_char(c) :\n    c < bitmap_identifier_3_min_codepoint ? false :\n    c <= bitmap_identifier_3_max_codepoint ? is_identifier_3_char(c) :\n    c < bitmap_identifier_4_min_codepoint ? false :\n    c <= bitmap_identifier_4_max_codepoint ? is_identifier_4_char(c) :\n    c < bitmap_identifier_5_min_codepoint ? false :\n    c <= bitmap_identifier_5_max_codepoint ? is_identifier_5_char(c) :\n    false;\n}\n\nstatic uint8_t bitmap_varid_start_1[] = {\n0xff,0xff,0xff,3,0,0,0,0,0,2,0x10,2,0,0,0,0xc0,0xff,0xff,0xbf,0x7f,\n0x55,0x55,0x55,0x55,0x55,0x55,0xd5,0xaa,0xaa,0x55,0x55,0x55,0x55,0x55,0x55,0xea,0x94,0x18,0x12,0x27,\n0x95,0x96,0x28,0xf7,0x27,0xa9,0xaa,0x5a,0x55,0xd5,0x14,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0xfd,0xc9,\n0x42,0xd5,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0x45,0x1c,\n0,0x80,0,0,0,0xf8,0xff,0xff,0xff,0xbf,0x71,0x55,0x55,0xd5,0x97,0xc,0,0,0,0,\n0,0x80,0xff,0xff,0xff,0xff,0xff,0x7f,0x55,0x55,0x55,0x55,1,0x54,0x55,0x55,0x55,0x55,0x55,0x55,\n0xaa,0x6a,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0,0,0,0,0,0x80,\n0xff,0xff,0xff,0xff,0xff,0,0,0,0,0,0,0,0,0x80,0xff,0xff,0xff,0xc3,3,0,\n0,0,0,0x80,0xff,0xff,0xff,0x7f,0xff,3,0,0,0,0x60,0xff,0xff,0xff,0xff,0xff,0xff,\n0xff,0xff,0xff,0xff,0xff,0xff,0x17,0,0,0x60,0,0x4e,0,0x80,0xfe,0xff,0xff,0x7f,0,0,\n0,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x1f,0,1,0,0,0xfe,0xff,0xff,\n0xff,3,0,0x80,0xff,0xff,0x1f,0,0,0,0,0x80,0xff,0xff,0xff,0x80,0xff,0x83,0xff,0xff,\n0x7f,0x3f,0,0x80,0xff,0xff,0xff,0xff,0xff,0,0,0,0,0,0,0,0xf8,0xff,0xff,0xff,\n0xff,0xff,0xff,0x11,0,0x80,0x80,0xff,1,0,0xfe,0xff,0xf0,0xcf,0xfc,0xff,0xff,0xfe,0xe2,0x11,\n0,0x20,0,0xd8,1,0x80,1,8,0xf0,0xc3,0xfc,0xff,0xff,0xfe,0xb6,1,0,0,0,0x2f,\n0,0,0xe,0,0xf0,0xdf,0xfd,0xff,0xff,0xfe,0xf6,0x11,0,0x80,0,0x80,1,0,0,1,\n0xf0,0xcf,0xfc,0xff,0xff,0xfe,0xf6,0x11,0,0,0,0xd8,1,0,1,0,0xf4,0xe3,0x1e,0x6b,\n0x8c,0xe3,0xff,1,0,0x80,0,0,0,0,0,0,0xf0,0xef,0xfe,0xff,0xff,0xfe,0xff,0x11,\n0,0,0x80,0x93,1,0,0,0x80,0xf0,0xef,0xfe,0xff,0xff,0xfe,0xf7,0x11,0,0,0,0xb0,\n1,0,3,0,0xf8,0xef,0xfe,0xff,0xff,0xff,0xff,0x13,0,0x20,0x38,0xc0,1,0,0,0x7e,\n0xf0,0xff,0x3f,0xfe,0xff,0xff,0xfd,0x97,0x3f,0,0,0,0,0,0,0,0xff,0xff,0xff,0xff,\n0xff,0xff,6,0x80,0x1f,0,0,0,0,0,0,0,0xeb,0xfb,0xff,0xff,0xd7,0xff,6,0x90,\n0xf,0,0,0x78,0,0,0,0x80,0,0,0,0,0,0,0,0x80,0x7f,0xff,0xff,0xff,\n0xff,0xf,0,0,0x80,0xf,0,0,0,0,0,0,0,0,0,0,0,0,0,0x80,\n0xff,0xff,0xff,0xff,0xff,3,0,0x40,0,0x80,0x1f,0x1e,0x31,0xe0,0xf0,0xff,1,0x20,0,0,\n0,0,0,0,0,0x80,0xff,0xff,0xff,0xff,0xff,0xf3,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,\n0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,\n0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x9e,0xbf,0x9e,0xff,0xff,0xff,0xff,\n0xff,0x9e,0xff,0xff,0xff,0xff,0x9e,0xbf,0x9e,0xff,0xbf,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x9e,0xff,\n0xff,0xff,0xff,0xff,0xff,0xff,0xff,3,0,0,0,0x80,0xff,0x7f,0,0,0,0,0,0,\n0,0,0,0,0,0,0x80,0x1f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,\n0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,\n0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,\n0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,\n0xff,0xff,0xff,0xff,0xff,0xcf,0xff,0x7f,0xff,0xff,0xff,0x83,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,\n0xff,3,0xff,0x80,0xff,0xff,1,0xc0,0xff,0xff,1,0x80,0xff,0xff,1,0x80,0xff,0xef,0,0x80,\n0xff,0xff,0xff,0xff,0xff,0xff,7,0,0,0,0,8,0,0,0,0,0,0,0,0x80,\n0xff,0xff,0xff,0xff,0xfb,0xff,0xff,0xff,0xff,0xff,0xff,0x80,0xcf,0xff,0xff,0xff,0xff,0x82,0xff,0xff,\n0xff,0xff,0xff,0xff,0xff,0xff,0x1f,0x80,0xff,0xff,0xff,0x3f,0,0,0,0,0,0x80,0xff,0xff,\n0xff,0x9f,0xf,0x80,0xff,0xff,0xff,0xff,0xff,0x87,0xff,0xff,0xff,1,0,0,0,0,0,0x80,\n0xff,0xff,0x3f,0x80,0xff,0xff,0xff,0xff,0xff,0xff,0xf,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0xf0,0xff,0xff,0xff,0xff,0xff,7,0,\n0xf0,0xf,0,0,0,0,0,0,0xfc,0xff,0xff,0xff,0,0x60,0,0xfe,0xff,0xff,0xff,0xff,\n0x1f,0,0,0x80,0xff,0xff,0xff,0xff,7,0,0,0,0,0x70,0,0xfe,0xff,0xff,0x7f,0x80,\n0xff,0,0,0,0,0,0,0,0,0,0,0,0,0xef,0x37,0x82,0xff,0xff,0xff,0xff,\n0xff,7,0,0,0,0,0,0,0,0xfc,0x7f,0xff,0xff,0xff,0xff,3,0,0,0,0,\n0,0,0,0,0,0,0,0,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,\n0x55,0x55,0x55,0x55,0x55,0x55,0xf5,0x5f,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0xd5,\n0x7f,0x80,0x1f,0x80,0x7f,0x80,0x7f,0x80,0x1f,0x80,0x7f,0x80,0x7f,0x80,0xff,0x9f,0x7f,0x80,0x7f,0x80,\n0x7f,0x80,0x6f,0x20,0x6e,0x80,0x67,0x80,0x7f,0,0x6e,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0x62,4,0,0,0x40,0xf8,0x19,0xe0,0x21,0,0,0,0,0,0,\n8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0x80,0xff,0xff,0xff,0xff,0xff,0x7f,0xb1,0xa,0xed,7,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,\n0x55,0x55,0x55,0x55,0xd,0x28,4,0x80,0xff,0xff,0xff,0xff,0x5f,0x90,0xff,0xff,0xff,0xff,0xff,0xff,\n0x7f,0,0,0x80,0xff,0xff,0x3f,0x80,0xbf,0xbf,0xbf,0xbf,0xbf,0xbf,0xbf,0x3f,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0x20,0,0,0,0,0,0,8,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,\n0xff,0xff,0x3f,0x40,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x43,0xf0,0xff,0xff,0xff,\n0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x3f,0,0x80,0xff,0xff,0xff,0x7f,\n0,0,0,0,0,0x80,0xff,0x7f,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0x80,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0x40,0,0,0,0,\n0,0,0,0x80,\n};\n\nstatic int32_t bitmap_varid_start_1_min_codepoint = 97;\n\nstatic int32_t bitmap_varid_start_1_max_codepoint = 19968;\n\nstatic bool is_varid_start_1_char(int32_t c) {\n  int32_t offset = c - bitmap_varid_start_1_min_codepoint;\n  return (bitmap_varid_start_1[offset >> 3] & (1u << (offset & 7))) > 0;\n}\n\nstatic uint8_t bitmap_varid_start_2[] = {\n0xff,0xff,0xbf,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,\n0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,\n0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,\n0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,\n0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,\n0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,\n0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,\n0xff,0xff,0xff,0xff,0xff,0x3f,0,0,0,0,0,0,0,0,0xfe,0xff,0xff,0xff,0xff,1,\n0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,\n0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x1f,0xfe,0xff,1,0x18,0,0,\n0x54,0x55,0x55,0x55,0x55,0xd5,0,0,0x54,0x55,0x55,0x15,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,\n0x7f,0,0,0,0,0,0,0,0x50,0x55,0x57,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0xfd,0x2b,\n0x55,0xa1,0x75,0x55,0x55,5,0x41,0x55,0x15,0xa,0x54,5,0,0,0x80,0xf9,0x77,0xef,0xff,0xff,\n0xf,0,0,0,0xfe,0xff,0xff,0xff,0xff,0xff,0x1f,0,0xf8,0xff,0xff,0xff,0xff,0xff,0x1f,0,\n0,0,0,0,0,0,0xf8,0xd1,0,0xf8,0xff,0xff,0x7f,0,0xfe,0xff,0xff,0,0,0,\n0xfe,0xff,0xff,0x3f,0xe0,0xff,0xff,0xff,0xff,0xff,0xf,0,0,0,0,0,0x3e,0xff,1,0xf8,\n0xfe,0xff,0xff,0xff,0xff,3,0,0,0xee,0x1f,0,0,0xfe,0xff,0xfd,0x88,0xff,0xff,0xff,0xff,\n0xff,0xff,0xc5,0x7c,0xa,0,0,0x30,0xfe,0xf,8,0,0xfc,0xfc,0xfc,0,0xfe,0xfe,0xfe,0xff,\n0xff,0xff,0xff,0xf,0xfe,3,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,\n0xf,0,0,0,2,\n};\n\nstatic int32_t bitmap_varid_start_2_min_codepoint = 40959;\n\nstatic int32_t bitmap_varid_start_2_max_codepoint = 44032;\n\nstatic bool is_varid_start_2_char(int32_t c) {\n  int32_t offset = c - bitmap_varid_start_2_min_codepoint;\n  return (bitmap_varid_start_2[offset >> 3] & (1u << (offset & 7))) > 0;\n}\n\nstatic uint8_t bitmap_varid_start_3[] = {\n1,0xe0,0xff,0xff,0xf,0xff,0xff,0xff,0xff,0xff,0xff,1,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0xe0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,\n0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,\n0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xe7,0xff,0xff,0xff,0xff,0xff,0xff,\n0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0,0,0,0,0xe0,0xf,0,0x1f,0xf4,0xbf,0xff,0xef,0x6b,\n0xfb,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0,0,0,0,0xff,0xff,\n0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,\n0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,\n0xff,0xff,0xff,7,0,0xe0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x9f,0xff,0xff,0xff,0xff,0xff,0xff,\n0x1f,0,0,0,0,0xe0,0xff,1,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0xe0,0xfb,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,3,\n0,0,0,0,0,0,0,0xc0,0xff,0xff,0xff,0,0xf8,0xdf,0xff,0xff,0xff,0xff,0xff,0xe7,\n0xff,0xff,0xff,0x8f,0x9f,0x9f,0x9f,3,0,0,0,0xe0,0xff,0xfd,0xff,0xff,0xef,0xff,0xff,0xf6,\n0xff,0xe7,0xff,7,0,0,0,0xe0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,\n0xff,0xff,0xff,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0xe0,0xff,0xff,0xff,0xe3,0xff,0xff,0xff,0xff,\n0xff,0x3f,0,0,0,0,0,0xe0,0xff,0xff,0xff,0x1f,0,0xfc,0xff,0xbf,0x7f,0xe0,0xff,0xff,\n0xff,0xff,7,0xe0,0xff,0xff,0xff,0xe7,0xff,0xff,0xff,0xff,0xe1,0x1f,0,0,0,0,0,0,\n0,0,0,0,0xe0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,7,\n0,0,0,0,0,0,0xe0,0xff,0xff,0xff,0xff,0xe1,0xff,0xff,0xff,0xff,0x1f,0xe0,0xff,0xff,\n0xff,0xff,0xff,0xff,1,0,0,0,0,0,0xf0,0x7f,0xff,0x7f,0x7f,3,0,0,0,0,\n0,0,0,0xe0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,\n0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,\n0xff,0xff,0xf,0xe0,0xff,0xff,7,0xe0,0x1f,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0xe0,0xa7,0xff,0xff,0xff,0xff,0xff,0x37,0xf2,0xff,0xff,7,0xe0,\n0xff,0xff,0xf,0xe0,0xff,0xff,0xff,0xf,0,0,0,0,0,0,0,0xe0,0xff,0xff,6,0xe0,\n0xff,0xff,7,0xe0,0xff,0xff,0x7f,0,0,0,0,0,0,0,0,0xe0,0xff,0xff,0xff,0xff,\n0xff,0xff,0x1f,0x18,0,0,0,0,0,0,0,0x20,0,0xe0,0xdd,0xff,0xff,0xff,7,0,\n0,0,0,0xe0,0xff,0xff,0xff,0xe3,0xff,0xff,0xff,3,0,0,0,0xe0,0xdf,0xff,0xff,0xff,\n3,0,0,0xe0,0xff,0xff,0xff,0xff,0xff,0xff,7,0xe0,0xff,0xff,7,0xe0,0xff,0xff,0,0xe0,\n0xff,0x7f,0,0,0,0,0,0,0,0,0,0,0,0,0,0xe0,0xff,0xff,0xff,0xff,\n0xff,0xff,0xff,0xff,0x3f,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xe0,\n0xff,0xff,0xff,0xff,0xff,0xff,0,0xe0,0xff,0xff,0xff,0xff,1,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xe0,0xff,0xff,0xff,0xff,\n0x7f,0x60,0,0,0,0,0,0,0,0,0,0xe0,0xff,0xff,0xff,3,0x10,0xe0,0xff,0xff,\n7,0,0,0,0,0xe0,0xff,0x7f,0,0,0,0,0,0xe0,0xff,0xff,3,0,0,0xe0,\n0xff,0xff,0xf,0,0xff,0xff,0xff,0xff,0xff,0xff,0x1f,0,0,0,0,0,0,0xc0,4,0,\n0xff,0xff,0xff,0xff,0xff,0x1f,0,0,0,0xe0,0xff,0xff,0x3f,0,0,0,0xff,0xff,0xff,0xff,\n0xf,0,0,0,0x12,0xe0,0xff,0xff,0xff,0xff,8,0,0xff,0xff,0xff,0xff,0xff,0xff,0,0xc0,\n3,0,0x80,2,0,0,0,0xe0,0xff,0x7f,0xff,0xff,0xff,1,0,0x30,0,0,0,0,\n0,0,0,0xe0,0xaf,0xf7,0xff,0xf7,0x3f,0xe0,0xff,0xff,0xff,0xff,0xff,0xf,0,0,0,0,\n0xfc,0x33,0xff,0xff,0xbf,0xbf,0x7d,4,0,0x20,0,0x7c,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0xe0,0xff,0xff,0xff,0xff,0xff,0xff,3,0,\n0xf0,0,0,0x70,0,0,0,0xe0,0xff,0xff,0xff,0xff,0xff,0x1f,0,0,0x16,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xe0,\n0xff,0xff,0xff,0xff,0xff,0xf,0,0,0,0,0xe0,1,0,0,0,0xe0,0xff,0xff,0xff,0xff,\n0xff,0x1f,0,0,2,0,0,0,0,0,0,0xe0,0xff,0xff,0xff,0xff,0xff,0,0x20,0,\n0,0,0,0,0,0,0,0xe0,0xff,0xff,0xff,0,0,0,0,0xe0,0xf,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xe0,\n0xff,0xff,0xff,0xff,0xff,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0xe0,0xff,0xff,0xff,0x1f,0,0,0,0xf0,0x4f,0xfe,0xed,0xff,0xff,0x1f,0,0x50,\n0,0,0,0,0,0,0,0,0,0,0,0xe0,0x9f,0xff,0xff,0xff,0xff,0x3f,0,0x40,\n1,0,0,0x20,0,0xff,0xff,0xff,0xff,0xff,0x80,0,0,0x20,0,0xfe,0xff,0xff,0xff,0xff,\n0x7f,0,0,4,0,0xe0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x3f,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0xe0,0xbf,0xff,0xff,0xff,0xff,0xf,0,0x20,0,0,0,0,\n0,0x80,0xff,0xff,0xff,0x1f,0,0,0,0,0,0,0,0,0,0,0,0,0,0xe0,\n0x6f,0xff,0xff,0xff,0xff,0x3f,0,0,8,0,0,0xe0,0xb7,0xff,0xff,0xff,0x7f,0,0x20,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xe0,\n0xff,0xff,0,0x80,0xfe,0xbf,0xff,0xff,0xff,0xff,1,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0x20,0,0,0,0,0,0,0,0,0,0xe0,0xff,0xff,0xff,0xff,\n0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,\n0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,\n0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,\n0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,\n0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,\n0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xe0,\n0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,\n0xff,0xff,0xff,0xff,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0xe0,0xff,0xff,0xff,0xff,0xff,0xff,\n0xff,0xff,0xff,0xff,0xff,0x3f,0,0xe0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,\n0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,\n0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,\n0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,\n0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,\n0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,\n0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,\n0xff,0x1f,0,0xc0,0xf,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0xe0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,\n0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,\n0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,\n0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,\n0xf,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xe0,\n0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,\n0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,\n0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,\n0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x3f,0xe0,0xff,0xff,0xff,0xf,0,0xe0,0xff,0xff,\n0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf,0,0xe0,0xff,0xff,0xff,7,0,0xe0,0xff,0xff,0xff,0xff,\n0xff,0x1f,0,0,0,0,0,0,0xff,0xff,0x1f,0xfc,0xff,0x1f,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0xe0,0xff,0xff,0xff,0x1f,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0xe0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x20,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0x20,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0x10,0xe0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,\n0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,\n0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,\n0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,\n0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,\n0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,\n0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,\n0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,7,0,\n0,0,0,0x20,0x20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0xe0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,\n0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,\n0,0x80,0,0,0,0xe0,4,0,0x1e,0xe0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,\n0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,\n0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,1,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0xe0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,\n0xff,0xe0,0xff,0xe3,0x3f,0xe0,0x7f,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0x80,0xff,\n0xff,0xff,1,0,0,0xf8,0xfb,0xff,0x1f,0,0,0x80,0xff,0xff,0xff,1,0,0,0x78,0xfd,\n0xfd,0x1f,0,0,0x80,0xff,0xff,0xff,1,0,0,0xf8,0xff,0xff,0x1f,0,0,0x80,0xff,0xff,\n0xff,1,0,0,0xf8,0xff,0xff,0x1f,0,0,0x80,0xff,0xff,0xff,1,0,0,0xf8,0xff,0xff,\n0x1f,0,0,0x80,0xff,0xff,0xff,1,0,0,0xf8,0xff,0xff,0x1f,0,0,0x80,0xff,0xff,0xff,\n7,0,0,0x80,0xff,0xff,0xff,0x7e,0,0,0,0xfe,0xff,0xff,0xfb,1,0,0,0xf8,0xff,\n0xff,0xef,7,0,0,0xe0,0xff,0xff,0xbf,0x1f,0,0,0x80,0xff,0xff,0xff,0x7e,1,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0xe0,0xff,0xff,0xff,0xf,0xfc,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0xe0,0xff,0xff,0xff,0xff,0xff,3,0,0,\n0,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0xe0,0xff,0xff,0xff,7,0,0xe0,0xff,0xff,0xff,0xff,0xff,1,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0xe0,0xff,0xff,0xff,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0xe0,0xef,0xed,0xff,0xef,0xff,0xff,0xff,0xff,\n0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,\n3,0,0,0,0,0,0,0,0,0,0,0x80,0xff,0xff,0xff,0xff,1,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0xe0,0xfd,0xff,0xff,0xdf,0xd2,0xff,0x5e,0x81,0x50,0xdd,0x52,0xd5,\n0xf2,0xfe,0xde,0xeb,0x7f,0xff,0xff,0xc1,0x7d,0xff,0xff,1,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0x20,\n};\n\nstatic int32_t bitmap_varid_start_3_min_codepoint = 55203;\n\nstatic int32_t bitmap_varid_start_3_max_codepoint = 131072;\n\nstatic bool is_varid_start_3_char(int32_t c) {\n  int32_t offset = c - bitmap_varid_start_3_min_codepoint;\n  return (bitmap_varid_start_3[offset >> 3] & (1u << (offset & 7))) > 0;\n}\n\nstatic uint8_t bitmap_varid_start_4[] = {\n1,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,4,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0x40,2,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,4,0,2,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,2,0,2,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0x40,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xfe,0xff,0xff,0xff,\n0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,\n0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,\n0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,\n0xff,0xff,0xff,0x7f,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,8,2,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,\n};\n\nstatic int32_t bitmap_varid_start_4_min_codepoint = 173791;\n\nstatic int32_t bitmap_varid_start_4_max_codepoint = 205743;\n\nstatic bool is_varid_start_4_char(int32_t c) {\n  int32_t offset = c - bitmap_varid_start_4_min_codepoint;\n  return (bitmap_varid_start_4[offset >> 3] & (1u << (offset & 7))) > 0;\n}\n\nstatic bool is_varid_start_char(int32_t c) {\n  return\n    c < bitmap_varid_start_1_min_codepoint ? false :\n    c <= bitmap_varid_start_1_max_codepoint ? is_varid_start_1_char(c) :\n    c < bitmap_varid_start_2_min_codepoint ? false :\n    c <= bitmap_varid_start_2_max_codepoint ? is_varid_start_2_char(c) :\n    c < bitmap_varid_start_3_min_codepoint ? false :\n    c <= bitmap_varid_start_3_max_codepoint ? is_varid_start_3_char(c) :\n    c < bitmap_varid_start_4_min_codepoint ? false :\n    c <= bitmap_varid_start_4_max_codepoint ? is_varid_start_4_char(c) :\n    false;\n}\n\nstatic uint8_t bitmap_conid_start_1[] = {\n0xff,0xff,0xff,3,0,0,0,0,0,0,0,0,0,0,0,0x80,0xff,0xff,0xbf,0x3f,\n0,0,0,0x80,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0x2a,0x55,0x55,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0x15,\n0x6b,0xe7,0xed,0xd8,0x6a,0x69,0xd7,8,0xd8,0x56,0x55,0xa5,0xaa,0x2a,0xeb,0xaa,0xaa,0xaa,0xaa,0xaa,\n0xaa,0xaa,2,0x36,0xbd,0x2a,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0x80,0x22,0x40,0xa0,0x6b,0xff,0xff,0xfd,7,0,0,0,0x40,0x8e,0xaa,0xaa,0x2a,0x48,0xf3,\n0xff,0xff,0xff,0xff,0xff,0x7f,0,0,0,0,0,0x80,0xaa,0xaa,0xaa,0xaa,0,0xaa,0xaa,0xaa,\n0xaa,0xaa,0xaa,0xaa,0x55,0x95,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0x2a,0xff,0xff,\n0xff,0xff,0x3f,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0x80,0xff,0xff,0xff,0xff,0x5f,0x10,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0x80,\n0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x1f,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0x80,0xff,0xff,0xff,0xff,0xff,0x73,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0x80,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,\n0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xa,0xa0,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,\n0xaa,0xaa,0xaa,0x2a,0x80,0x7f,0x80,0x1f,0x80,0x7f,0x80,0x7f,0x80,0x1f,0,0x55,0x80,0x7f,0,0,\n0x80,0x7f,0x80,0x7f,0x80,0x7f,0x80,0xf,0x80,0xf,0x80,7,0x80,0xf,0x80,0xf,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0x42,0x9c,0x13,0x1f,0xa8,0x9e,7,0x60,0x10,0,0,0,\n0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0x80,\n0xff,0xff,0xff,0xff,0xff,0x7f,0,0,0,0,0,0x80,0x4e,0xf5,0x12,0xe0,0xaa,0xaa,0xaa,0xaa,\n0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,2,0x14,2,\n};\n\nstatic int32_t bitmap_conid_start_1_min_codepoint = 65;\n\nstatic int32_t bitmap_conid_start_1_max_codepoint = 11506;\n\nstatic bool is_conid_start_1_char(int32_t c) {\n  int32_t offset = c - bitmap_conid_start_1_min_codepoint;\n  return (bitmap_conid_start_1[offset >> 3] & (1u << (offset & 7))) > 0;\n}\n\nstatic uint8_t bitmap_conid_start_2[] = {\n0x55,0x55,0x55,0x55,0x55,0x15,0,0,0x55,0x55,0x55,5,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0x54,0x55,0x54,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0,0x6a,\n0x55,0x28,0x45,0x55,0x55,0x7d,0x5f,0x55,0xf5,2,0x41,1,0,0,0x20,\n};\n\nstatic int32_t bitmap_conid_start_2_min_codepoint = 42560;\n\nstatic int32_t bitmap_conid_start_2_max_codepoint = 42997;\n\nstatic bool is_conid_start_2_char(int32_t c) {\n  int32_t offset = c - bitmap_conid_start_2_min_codepoint;\n  return (bitmap_conid_start_2[offset >> 3] & (1u << (offset & 7))) > 0;\n}\n\nstatic uint8_t bitmap_conid_start_3[] = {\n0xff,0xff,0xff,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0x80,0xff,0xff,0xff,0xff,\n0x7f,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0x80,0xff,0xff,\n0xff,0xff,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0x80,0xff,0xfb,0xff,0xfb,0x1b,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0x80,0xff,0xff,0xff,0xff,0xff,0xff,3,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0x80,0xff,0xff,0xff,0x7f,\n};\n\nstatic int32_t bitmap_conid_start_3_min_codepoint = 65313;\n\nstatic int32_t bitmap_conid_start_3_max_codepoint = 71871;\n\nstatic bool is_conid_start_3_char(int32_t c) {\n  int32_t offset = c - bitmap_conid_start_3_min_codepoint;\n  return (bitmap_conid_start_3[offset >> 3] & (1u << (offset & 7))) > 0;\n}\n\nstatic uint8_t bitmap_conid_start_4[] = {\n0xff,0xff,0xff,0xff,\n};\n\nstatic int32_t bitmap_conid_start_4_min_codepoint = 93760;\n\nstatic int32_t bitmap_conid_start_4_max_codepoint = 93791;\n\nstatic bool is_conid_start_4_char(int32_t c) {\n  int32_t offset = c - bitmap_conid_start_4_min_codepoint;\n  return (bitmap_conid_start_4[offset >> 3] & (1u << (offset & 7))) > 0;\n}\n\nstatic uint8_t bitmap_conid_start_5[] = {\n0xff,0xff,0xff,3,0,0,0xf0,0xff,0xff,0x3f,0,0,0,0xff,0xff,0xff,3,0,0,0xd0,\n0x64,0xde,0x3f,0,0,0,0xff,0xff,0xff,3,0,0,0xb0,0xe7,0xdf,0x1f,0,0,0,0x7b,\n0x5f,0xfc,1,0,0,0xf0,0xff,0xff,0x3f,0,0,0,0xff,0xff,0xff,3,0,0,0xf0,0xff,\n0xff,0x3f,0,0,0,0xff,0xff,0xff,3,0,0,0xf0,0xff,0xff,0x3f,0,0,0,0xff,0xff,\n0xff,3,0,0,0,0xff,0xff,0xff,1,0,0,0,0xfc,0xff,0xff,7,0,0,0,0xf0,\n0xff,0xff,0x1f,0,0,0,0xc0,0xff,0xff,0x7f,0,0,0,0,0xff,0xff,0xff,1,0,0,\n0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0xff,0xff,0xff,0xff,3,\n};\n\nstatic int32_t bitmap_conid_start_5_min_codepoint = 119808;\n\nstatic int32_t bitmap_conid_start_5_max_codepoint = 125217;\n\nstatic bool is_conid_start_5_char(int32_t c) {\n  int32_t offset = c - bitmap_conid_start_5_min_codepoint;\n  return (bitmap_conid_start_5[offset >> 3] & (1u << (offset & 7))) > 0;\n}\n\nstatic bool is_conid_start_char(int32_t c) {\n  return\n    c < bitmap_conid_start_1_min_codepoint ? false :\n    c <= bitmap_conid_start_1_max_codepoint ? is_conid_start_1_char(c) :\n    c < bitmap_conid_start_2_min_codepoint ? false :\n    c <= bitmap_conid_start_2_max_codepoint ? is_conid_start_2_char(c) :\n    c < bitmap_conid_start_3_min_codepoint ? false :\n    c <= bitmap_conid_start_3_max_codepoint ? is_conid_start_3_char(c) :\n    c < bitmap_conid_start_4_min_codepoint ? false :\n    c <= bitmap_conid_start_4_max_codepoint ? is_conid_start_4_char(c) :\n    c < bitmap_conid_start_5_min_codepoint ? false :\n    c <= bitmap_conid_start_5_max_codepoint ? is_conid_start_5_char(c) :\n    false;\n}\n\nstatic uint8_t bitmap_symop_1[] = {\n0x7f,0x7e,0,0xfe,0,0,0,0xe8,0,0,0,0x28,0,0,0,0,0xff,0xe9,0xe9,0x40,\n0,0,0x40,0,0,0,0x40,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0x1e,0,0xfe,0x7f,0xf0,0xd7,0xff,0x7f,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0x10,0x20,0x58,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0x20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0x7e,0,0,0,0,0,0x73,0,0,0,0,0,0xa0,\n0x24,0,0,0,0,0,0xc,0,0xe0,0x7f,0,0x74,0,0,0,0,0,0,0,0,\n0,0x1e,0,0,0,0,0,0,0,0,0,0,0,0,8,0x20,0,1,0,0xb0,\n0xff,0x1f,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0xe0,0x61,0,0,0,0,0,0x80,0xff,0x3f,\n0,0,0,0x20,0,0,0,0,0x80,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0x18,0x80,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0x16,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0x20,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0x80,1,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0x80,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xfc,3,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0x40,0x40,8,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0x40,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,8,0,0,0,0,0,0,0,0,0x40,0,0x40,0,6,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xff,0xff,0x7f,0x7e,\n0,0,0xa8,0,0,0,0,0,0,0,0,0,0x10,0,0,0,0,0,0,0xe0,\n0xdf,0xef,0xff,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0x7e,0,0,\n0,0,0,0,0,0,0,0x60,0,0,0,0,0,0,0,0,0,0,0,4,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0x80,0xff,0,0,0,\n0,0x80,0xff,1,0,0,0,0,0,0,0,0,0,0,0,0x80,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0x30,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0x1c,0,0,0,0,0,0,0,0,0x30,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xb8,7,\n0,0,0,0x80,0xff,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0x80,0x18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0xe0,0xff,0xff,0xff,0x7f,0,0,0,0x60,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0x80,0xbf,0x1f,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0xfe,0xff,3,0xf8,0x3f,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0x78,0,0,0,0,0,0,0,0x7c,\n0,0,0,0,0,0,0,0x60,0,0,0,0,0,0,0,0x80,0x7f,0,4,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0xd0,1,0x70,0,0x70,0,0x70,0,0x30,\n0,0x80,0x7f,0x80,0x7f,0x80,0xff,0xfc,0xcf,0xff,0xff,0x3f,0,0,0,0xe,0,0xe,0,0x80,\n0xff,0xff,0xff,0xff,0,0,0,0,0,0,0,0x80,0xbd,1,0xe8,0xe0,0x57,0x21,0,0x86,\n0xf,0x5e,0,0,0,0,0,0,0,0x86,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,\n0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,\n0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xf8,0xff,0xff,\n0xff,0xfc,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,\n0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x3f,0,0,0x80,0xff,3,0,0,\n0,0,0,0,0,0,0,0xf8,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,1,0,0x80,\n0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,\n0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,\n0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,\n0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0,0,0,\n0,0,0xf8,0xff,0xff,0xff,0xff,0xff,0xcf,0xff,0xff,0xff,0x1f,0x80,0xff,0xff,0xff,0xff,0xff,0xff,\n0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,\n0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,\n0xff,0xff,0xff,0xff,3,0,0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xf8,0xff,0xff,0xff,0xe7,\n0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,\n0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,\n0xff,0xff,0xff,0xff,0xff,0xff,0xe7,0xff,0xff,0xff,0xdf,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,\n0xff,0xff,0xff,0x7f,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0xf0,3,0,0x6f,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0x80,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0x80,0xe1,0xe4,0xff,0x67,0,0xbe,0xff,0xff,0xfd,0xff,0xf,0x10,\n0,0,0,0x80,0xff,0xff,0xff,0xfd,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,7,0x80,\n0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,\n0xff,0xff,0xff,0xff,0xff,0xff,0x1f,0,0,0x80,0xff,0x7f,0xf,0,6,0x88,0,0x80,0x60,0x70,\n0,0,0,0,0,0,0,0,0,0,0,0x8c,0,0,0,0,0,0,0,0,\n0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0x80,0xe1,0x7f,0,0,0,0x80,0xff,0xff,0xff,0xff,7,0x40,0,0x80,0xff,0xff,0xff,0x3f,\n0,0xfe,0xff,0xff,0x7f,0x80,0,0x80,0xff,0xff,0xff,0x7f,0,0xfe,0xff,0xff,0xff,0xff,0,0x80,\n0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,\n0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0x80,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,\n};\n\nstatic int32_t bitmap_symop_1_min_codepoint = 33;\n\nstatic int32_t bitmap_symop_1_max_codepoint = 19967;\n\nstatic bool is_symop_1_char(int32_t c) {\n  int32_t offset = c - bitmap_symop_1_min_codepoint;\n  return (bitmap_symop_1[offset >> 3] & (1u << (offset & 7))) > 0;\n}\n\nstatic uint8_t bitmap_symop_2[] = {\n0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0,0,0,0,0,0,0xc0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0xe0,0,0,0,0,0,0,0,0,0,0,0,0,\n8,0x40,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xfc,0,0xff,0xff,\n0x7f,0,3,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xf,0xc0,3,0,0,\n0,0,0,0,0xf0,0,0,0,0,0,0,0,0,0,0,0xc0,0,0,0,0,\n0,0x17,0,0,0,0,0,0xc0,0,0,0,0,0,0x80,0,0,0,0,0,0,\n0,0,0,0,0,0,0xfe,0x3f,0,0xc0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0xf0,0,0,0x80,3,0,0,0,0,0,0,0,0,0,0,\n0,0xc0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0xc,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,\n};\n\nstatic int32_t bitmap_symop_2_min_codepoint = 42128;\n\nstatic int32_t bitmap_symop_2_max_codepoint = 44011;\n\nstatic bool is_symop_2_char(int32_t c) {\n  int32_t offset = c - bitmap_symop_2_min_codepoint;\n  return (bitmap_symop_2[offset >> 3] & (1u << (offset & 7))) > 0;\n}\n\nstatic uint8_t bitmap_symop_3[] = {\n1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xfe,0xff,3,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0x80,0xff,0x7f,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0x40,0,0,0,0,0,0x78,0,0x80,0x3f,1,0,0x80,0xf,0,0x30,\n0xff,0xfb,0xc0,0xbf,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0x7f,0x7e,0,0xfe,0,0,0,0xe8,0,0,0,0x28,0x19,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0x80,0xbf,0x3f,0,0x18,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0x80,3,0,0,0,0,0,0xc0,0x7f,0,0,0,0,0,\n0,0,0xff,0xff,0xb9,0xff,0x8f,0,0,0,0,0,0x80,0xff,0xff,0xff,0xff,0xff,0xf,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0x40,0,0,0,0,0,0x80,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0x40,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0x40,0,0,0,0xc0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0x40,0,0,0,0x40,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0x80,0xff,0,0,0,0,0x40,0,0,0,0,0,0,0,0,0x80,\n0,0,0,0,0x80,0x3f,0,0,0,0,0,0,0,0,0x7f,0,0,0,0,0,\n0,0,0,0,0,0,0xf,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0x10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0xf0,1,0,0,0,0,0xe0,1,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xc0,0x1f,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0xec,1,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0x80,7,0,0,0,0,0,0x18,0,0,0,0,0,0,\n0,0,0,0xf0,0x10,0,0x74,0,0,0,0,0,0,0,0,0,0,0x80,0x1f,0,\n0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0x7c,0,0x16,0,0,0,0,0,0,0,0,0,0,0,0,0x20,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0xff,0xff,0x7f,0,0,0,0,0,0,\n0,0,0,0,0,0,0,7,0,0,0x80,0xff,0xf,0,0,0,0,0,0,0,\n0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0x78,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0x38,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,2,0,0,0,0,0,0,0,0,0,0,0xc0,0x3f,0,0,0,0,\n0,0,0,0,0,0,0xee,3,0,0,0,0,0,0,0,0,0,0,0x80,0xff,\n1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0x1f,\n0,0,0,0,0x80,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0xc0,0,0,0,0,0,0,0,0,0,0xfc,0x7f,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0xf0,0xff,0xff,0xff,1,0x40,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0x80,0xf,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,3,\n};\n\nstatic int32_t bitmap_symop_3_min_codepoint = 64297;\n\nstatic int32_t bitmap_symop_3_max_codepoint = 77810;\n\nstatic bool is_symop_3_char(int32_t c) {\n  int32_t offset = c - bitmap_symop_3_min_codepoint;\n  return (bitmap_symop_3[offset >> 3] & (1u << (offset & 7))) > 0;\n}\n\nstatic uint8_t bitmap_symop_4[] = {\n3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0x80,0,0,0,\n0,0,0,0,0,0xfe,0xc3,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0x1e,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0x10,\n};\n\nstatic int32_t bitmap_symop_4_min_codepoint = 92782;\n\nstatic int32_t bitmap_symop_4_max_codepoint = 94178;\n\nstatic bool is_symop_4_char(int32_t c) {\n  int32_t offset = c - bitmap_symop_4_min_codepoint;\n  return (bitmap_symop_4[offset >> 3] & (1u << (offset & 7))) > 0;\n}\n\nstatic uint8_t bitmap_symop_5[] = {\n9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xf0,0xff,\n0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0,0,0,0,0,0,0,\n0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,\n0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,3,0xf0,0xff,0xff,0xff,0xff,0xe7,0xff,0xff,\n0xff,0xff,0xff,0xff,0xff,0xc1,1,0,0x80,1,0xff,0xff,0xff,0x3f,0xfc,0xff,0xff,0xff,0xff,0xff,\n0xff,0x7f,0,0,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x3f,2,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xf0,0xff,0xff,0xff,\n0xff,0xff,0xff,0xff,0xff,0xff,0xff,7,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0x20,0,0,0x80,\n0,0,0,0x80,0,0,0,2,0,0,0,2,0,0,8,0,0,0,8,0,\n0,0x20,0,0,0,0x20,0,0,0x80,0,0,0,0,0,0,0,0xf0,0xff,0xff,0xff,\n0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,\n0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,\n0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,\n0xf,0,0,0,0,0,0,0x78,0,0,0,0,0,0,0xfe,0xfd,0xff,0xfe,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0xc,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0x11,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0x30,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0xf0,0xff,0xff,0xff,0xff,0xff,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,\n0xff,0xff,0xff,0,0xf0,0xff,0xe7,0xff,0xef,0xff,0xef,0xff,0xff,0xff,0xff,3,0,0,0xfe,0xff,\n0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,3,0,\n0,0,0,0,0,0xfc,0xff,0xff,0x7f,0,0xf0,0xff,0xff,0xff,0xff,0xff,0xf0,0x1f,0x30,0,\n0xf0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,\n0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,\n0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,\n0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,\n0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,\n0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,\n0xff,0xff,0xff,0xf,0xff,0xff,0xf1,0xff,0xf1,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,\n0xff,0xff,0xff,0x87,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x3f,0xf0,0xff,0x10,0,\n0xf0,0xff,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0xf,0xf0,0x3f,0xf0,0xff,0xff,0xff,0xff,0xf,0xf0,0xff,\n0xff,0xff,0x33,0,0,0,0,0,0,0,0,0,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,\n0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,\n0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0,0xf0,0xff,0xf3,0xff,\n0xf1,0x1f,0xf0,0xff,0xff,0xff,0xff,0xff,0xfb,3,0xfc,0xff,0xf0,0x1f,0xf0,0x1f,0xf0,0xff,0xff,0xff,\n0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,\n0xff,0x7f,\n};\n\nstatic int32_t bitmap_symop_5_min_codepoint = 113820;\n\nstatic int32_t bitmap_symop_5_max_codepoint = 129994;\n\nstatic bool is_symop_5_char(int32_t c) {\n  int32_t offset = c - bitmap_symop_5_min_codepoint;\n  return (bitmap_symop_5[offset >> 3] & (1u << (offset & 7))) > 0;\n}\n\nstatic bool is_symop_char(int32_t c) {\n  return\n    c < bitmap_symop_1_min_codepoint ? false :\n    c <= bitmap_symop_1_max_codepoint ? is_symop_1_char(c) :\n    c < bitmap_symop_2_min_codepoint ? false :\n    c <= bitmap_symop_2_max_codepoint ? is_symop_2_char(c) :\n    c < bitmap_symop_3_min_codepoint ? false :\n    c <= bitmap_symop_3_max_codepoint ? is_symop_3_char(c) :\n    c < bitmap_symop_4_min_codepoint ? false :\n    c <= bitmap_symop_4_max_codepoint ? is_symop_4_char(c) :\n    c < bitmap_symop_5_min_codepoint ? false :\n    c <= bitmap_symop_5_max_codepoint ? is_symop_5_char(c) :\n    false;\n}\n\nstatic uint8_t bitmap_space[] = {\n1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0xff,7,0,0,0,0x80,0,0,0,0,0,0x80,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,0,0,0,0,1,\n};\n\nstatic int32_t bitmap_space_min_codepoint = 32;\n\nstatic int32_t bitmap_space_max_codepoint = 12288;\n\nstatic bool is_space_char(int32_t c) {\n  if (c < bitmap_space_min_codepoint || c > bitmap_space_max_codepoint) return false;\n  int32_t offset = c - bitmap_space_min_codepoint;\n  return (bitmap_space[offset >> 3] & (1u << (offset & 7))) > 0;\n}\n"
  },
  {
    "path": "test/corpus/char.txt",
    "content": "================================================================================\nchar: [a-zA-Z0-9_]\n================================================================================\n\na = 'a'\na = 'b'\na = '0'\na = '1'\na = '_'\na = 'A'\na = 'B'\na = ','\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (literal\n          (char))))\n    (bind\n      (variable)\n      (match\n        (literal\n          (char))))\n    (bind\n      (variable)\n      (match\n        (literal\n          (char))))\n    (bind\n      (variable)\n      (match\n        (literal\n          (char))))\n    (bind\n      (variable)\n      (match\n        (literal\n          (char))))\n    (bind\n      (variable)\n      (match\n        (literal\n          (char))))\n    (bind\n      (variable)\n      (match\n        (literal\n          (char))))\n    (bind\n      (variable)\n      (match\n        (literal\n          (char))))))\n\n================================================================================\nchar: symbols\n================================================================================\n\na = '!'\na = '#'\na = '$'\na = '%'\na = '&'\na = '⋆'\na = '+'\na = '.'\na = '/'\na = '<'\na = '='\na = '>'\na = '?'\na = '^'\na = '|'\na = '-'\na = '~'\na = ':'\na = '\"'\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (literal\n          (char))))\n    (bind\n      (variable)\n      (match\n        (literal\n          (char))))\n    (bind\n      (variable)\n      (match\n        (literal\n          (char))))\n    (bind\n      (variable)\n      (match\n        (literal\n          (char))))\n    (bind\n      (variable)\n      (match\n        (literal\n          (char))))\n    (bind\n      (variable)\n      (match\n        (literal\n          (char))))\n    (bind\n      (variable)\n      (match\n        (literal\n          (char))))\n    (bind\n      (variable)\n      (match\n        (literal\n          (char))))\n    (bind\n      (variable)\n      (match\n        (literal\n          (char))))\n    (bind\n      (variable)\n      (match\n        (literal\n          (char))))\n    (bind\n      (variable)\n      (match\n        (literal\n          (char))))\n    (bind\n      (variable)\n      (match\n        (literal\n          (char))))\n    (bind\n      (variable)\n      (match\n        (literal\n          (char))))\n    (bind\n      (variable)\n      (match\n        (literal\n          (char))))\n    (bind\n      (variable)\n      (match\n        (literal\n          (char))))\n    (bind\n      (variable)\n      (match\n        (literal\n          (char))))\n    (bind\n      (variable)\n      (match\n        (literal\n          (char))))\n    (bind\n      (variable)\n      (match\n        (literal\n          (char))))\n    (bind\n      (variable)\n      (match\n        (literal\n          (char))))))\n\n================================================================================\nchar: special symbols\n================================================================================\n\na = '('\na = ')'\na = ';'\na = '['\na = ']'\na = '`'\na = '{'\na = '}'\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (literal\n          (char))))\n    (bind\n      (variable)\n      (match\n        (literal\n          (char))))\n    (bind\n      (variable)\n      (match\n        (literal\n          (char))))\n    (bind\n      (variable)\n      (match\n        (literal\n          (char))))\n    (bind\n      (variable)\n      (match\n        (literal\n          (char))))\n    (bind\n      (variable)\n      (match\n        (literal\n          (char))))\n    (bind\n      (variable)\n      (match\n        (literal\n          (char))))\n    (bind\n      (variable)\n      (match\n        (literal\n          (char))))))\n\n================================================================================\nchar: character escape\n================================================================================\n\na = '\\a'\na = '\\b'\na = '\\f'\na = '\\n'\na = '\\r'\na = '\\t'\na = '\\v'\na = '\\\\'\na = '\\\"'\na = '\\''\na = '\\&'\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (literal\n          (char))))\n    (bind\n      (variable)\n      (match\n        (literal\n          (char))))\n    (bind\n      (variable)\n      (match\n        (literal\n          (char))))\n    (bind\n      (variable)\n      (match\n        (literal\n          (char))))\n    (bind\n      (variable)\n      (match\n        (literal\n          (char))))\n    (bind\n      (variable)\n      (match\n        (literal\n          (char))))\n    (bind\n      (variable)\n      (match\n        (literal\n          (char))))\n    (bind\n      (variable)\n      (match\n        (literal\n          (char))))\n    (bind\n      (variable)\n      (match\n        (literal\n          (char))))\n    (bind\n      (variable)\n      (match\n        (literal\n          (char))))\n    (bind\n      (variable)\n      (match\n        (literal\n          (char))))))\n\n================================================================================\nchar: space\n================================================================================\n\na = ' '\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (literal\n          (char))))))\n\n================================================================================\nchar: escape ascii\n================================================================================\n\na = '\\NUL'\na = '\\SOH'\na = '\\STX'\na = '\\ETX'\na = '\\EOT'\na = '\\ENQ'\na = '\\ACK'\na = '\\BEL'\na = '\\BS'\na = '\\HT'\na = '\\LF'\na = '\\VT'\na = '\\FF'\na = '\\CR'\na = '\\SO'\na = '\\SI'\na = '\\DLE'\na = '\\DC1'\na = '\\DC2'\na = '\\DC3'\na = '\\DC4'\na = '\\NAK'\na = '\\SYN'\na = '\\ETB'\na = '\\CAN'\na = '\\EM'\na = '\\SUB'\na = '\\ESC'\na = '\\FS'\na = '\\GS'\na = '\\RS'\na = '\\US'\na = '\\SP'\na = '\\DEL'\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (literal\n          (char))))\n    (bind\n      (variable)\n      (match\n        (literal\n          (char))))\n    (bind\n      (variable)\n      (match\n        (literal\n          (char))))\n    (bind\n      (variable)\n      (match\n        (literal\n          (char))))\n    (bind\n      (variable)\n      (match\n        (literal\n          (char))))\n    (bind\n      (variable)\n      (match\n        (literal\n          (char))))\n    (bind\n      (variable)\n      (match\n        (literal\n          (char))))\n    (bind\n      (variable)\n      (match\n        (literal\n          (char))))\n    (bind\n      (variable)\n      (match\n        (literal\n          (char))))\n    (bind\n      (variable)\n      (match\n        (literal\n          (char))))\n    (bind\n      (variable)\n      (match\n        (literal\n          (char))))\n    (bind\n      (variable)\n      (match\n        (literal\n          (char))))\n    (bind\n      (variable)\n      (match\n        (literal\n          (char))))\n    (bind\n      (variable)\n      (match\n        (literal\n          (char))))\n    (bind\n      (variable)\n      (match\n        (literal\n          (char))))\n    (bind\n      (variable)\n      (match\n        (literal\n          (char))))\n    (bind\n      (variable)\n      (match\n        (literal\n          (char))))\n    (bind\n      (variable)\n      (match\n        (literal\n          (char))))\n    (bind\n      (variable)\n      (match\n        (literal\n          (char))))\n    (bind\n      (variable)\n      (match\n        (literal\n          (char))))\n    (bind\n      (variable)\n      (match\n        (literal\n          (char))))\n    (bind\n      (variable)\n      (match\n        (literal\n          (char))))\n    (bind\n      (variable)\n      (match\n        (literal\n          (char))))\n    (bind\n      (variable)\n      (match\n        (literal\n          (char))))\n    (bind\n      (variable)\n      (match\n        (literal\n          (char))))\n    (bind\n      (variable)\n      (match\n        (literal\n          (char))))\n    (bind\n      (variable)\n      (match\n        (literal\n          (char))))\n    (bind\n      (variable)\n      (match\n        (literal\n          (char))))\n    (bind\n      (variable)\n      (match\n        (literal\n          (char))))\n    (bind\n      (variable)\n      (match\n        (literal\n          (char))))\n    (bind\n      (variable)\n      (match\n        (literal\n          (char))))\n    (bind\n      (variable)\n      (match\n        (literal\n          (char))))\n    (bind\n      (variable)\n      (match\n        (literal\n          (char))))\n    (bind\n      (variable)\n      (match\n        (literal\n          (char))))))\n\n================================================================================\nchar: Escape Control Characters\n================================================================================\n\na = '\\^A'\na = '\\^Z'\na = '\\^@'\na = '\\^['\na = '\\^]'\na = '\\^\\'\na = '\\^^'\na = '\\^_'\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (literal\n          (char))))\n    (bind\n      (variable)\n      (match\n        (literal\n          (char))))\n    (bind\n      (variable)\n      (match\n        (literal\n          (char))))\n    (bind\n      (variable)\n      (match\n        (literal\n          (char))))\n    (bind\n      (variable)\n      (match\n        (literal\n          (char))))\n    (bind\n      (variable)\n      (match\n        (literal\n          (char))))\n    (bind\n      (variable)\n      (match\n        (literal\n          (char))))\n    (bind\n      (variable)\n      (match\n        (literal\n          (char))))))\n\n================================================================================\nchar: non-ascii unicode\n================================================================================\n\na = '‘'\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (literal\n          (char))))))\n\n================================================================================\nchar: unicode whitespace\n================================================================================\n\na = a a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (apply\n          (variable)\n          (variable))))))\n\n================================================================================\nchar: magic hash\n================================================================================\n\na = 'a'#\na = 'a'##\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (literal\n          (char))))\n    (bind\n      (variable)\n      (match\n        (literal\n          (char))))))\n"
  },
  {
    "path": "test/corpus/class.txt",
    "content": "================================================================================\nclass: minimal\n================================================================================\n\nclass A a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  declarations: (declarations\n    (class\n      name: (name)\n      patterns: (type_params\n        bind: (variable)))))\n\n================================================================================\nclass: context variants\n================================================================================\n\nclass A a => Read a\nclass (A a, A a) => A a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (class\n      (context\n        (apply\n          (name)\n          (variable)))\n      (name)\n      (type_params\n        (variable)))\n    (class\n      (context\n        (tuple\n          (apply\n            (name)\n            (variable))\n          (apply\n            (name)\n            (variable))))\n      (name)\n      (type_params\n        (variable)))))\n\n================================================================================\nclass: method with context\n================================================================================\n\nclass A a where a :: A a => a -> a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  declarations: (declarations\n    (class\n      name: (name)\n      patterns: (type_params\n        bind: (variable))\n      declarations: (class_declarations\n        declaration: (signature\n          name: (variable)\n          type: (context\n            context: (apply\n              constructor: (name)\n              argument: (variable))\n            type: (function\n              parameter: (variable)\n              result: (variable))))))))\n\n================================================================================\nclass: braces\n================================================================================\n\nclass Foo a where {\n  a :: a;\n  a :: a;\n}\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (class\n      (name)\n      (type_params\n        (variable))\n      (class_declarations\n        (signature\n          (variable)\n          (variable))\n        (signature\n          (variable)\n          (variable))))))\n\n================================================================================\nclass: fixity\n================================================================================\n\nclass A where\n  infixl `op`\n  a :: Int\n  infixr 7 ++\n  a = a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (class\n      (name)\n      (class_declarations\n        (fixity\n          (infix_id\n            (variable)))\n        (signature\n          (variable)\n          (name))\n        (fixity\n          (integer)\n          (operator))\n        (bind\n          (variable)\n          (match\n            (variable)))))))\n\n================================================================================\nclass: binding list\n================================================================================\n\nclass A where\n  (<), a, (<=), (>=), a, (>) :: a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (class\n      (name)\n      (class_declarations\n        (signature\n          (binding_list\n            (prefix_id\n              (operator))\n            (variable)\n            (prefix_id\n              (operator))\n            (prefix_id\n              (operator))\n            (variable)\n            (prefix_id\n              (operator)))\n          (variable))))))\n\n================================================================================\nclass: multi param\n================================================================================\n\nclass A a a a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (class\n      (name)\n      (type_params\n        (variable)\n        (variable)\n        (variable)))))\n\n================================================================================\nclass: default signature\n================================================================================\n\nclass A where\n  a :: Int\n  default a :: Int\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (class\n      (name)\n      (class_declarations\n        (signature\n          (variable)\n          (name))\n        (default_signature\n          (signature\n            (variable)\n            (name)))))))\n\n================================================================================\nclass: type variable kind\n================================================================================\n\nclass A (a :: [*] -> k)\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (class\n      (name)\n      (type_params\n        (parens\n          (annotated\n            (variable)\n            (function\n              (list\n                (star))\n              (variable))))))))\n\n================================================================================\nclass: associated family\n================================================================================\n\nclass A a where\n  type A a :: a\n  type A a = a | a -> a\n  type A a = A\n  type family A a :: a\n  type family A a = a | a -> a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (class\n      (name)\n      (type_params\n        (variable))\n      (class_declarations\n        (type_family\n          (name)\n          (type_params\n            (variable))\n          (variable))\n        (type_family\n          (name)\n          (type_params\n            (variable))\n          (type_family_result\n            (variable))\n          (type_family_injectivity\n            (variable)\n            (variable)))\n        (type_instance\n          (name)\n          (type_patterns\n            (variable))\n          (name))\n        (type_family\n          (name)\n          (type_params\n            (variable))\n          (variable))\n        (type_family\n          (name)\n          (type_params\n            (variable))\n          (type_family_result\n            (variable))\n          (type_family_injectivity\n            (variable)\n            (variable)))))))\n\n================================================================================\nclass: associated data\n================================================================================\n\nclass A a where\n  data A a\n  data family A a :: * -> Type\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (class\n      (name)\n      (type_params\n        (variable))\n      (class_declarations\n        (data_family\n          (name)\n          (type_params\n            (variable)))\n        (data_family\n          (name)\n          (type_params\n            (variable))\n          (function\n            (star)\n            (name)))))))\n\n================================================================================\nclass: fundeps\n================================================================================\n\nclass A | a -> a a, a a -> a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  declarations: (declarations\n    (class\n      name: (name)\n      fundeps: (fundeps\n        fundep: (fundep\n          matched: (variable)\n          determined: (variable)\n          determined: (variable))\n        fundep: (fundep\n          matched: (variable)\n          matched: (variable)\n          determined: (variable))))))\n\n================================================================================\nclass: infix operator name\n================================================================================\n\nclass a ++ b\n\n--------------------------------------------------------------------------------\n\n(haskell\n  declarations: (declarations\n    (class\n      (infix\n        bind: (variable)\n        operator: (operator)\n        bind: (variable)))))\n\n================================================================================\nclass: infix constructor operator name\n================================================================================\n\nclass a :++ b\n\n--------------------------------------------------------------------------------\n\n(haskell\n  declarations: (declarations\n    (class\n      (infix\n        bind: (variable)\n        operator: (constructor_operator)\n        bind: (variable)))))\n\n================================================================================\nclass: prefix operator name\n================================================================================\n\nclass (++) a b\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (class\n      (prefix_id\n        (operator))\n      (type_params\n        (variable)\n        (variable)))))\n\n================================================================================\nclass: ticked name\n================================================================================\n\nclass ((((a)) `A` a))\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (class\n      (parens\n        (parens\n          (infix\n            (parens\n              (parens\n                (variable)))\n            (infix_id\n              (name))\n            (variable)))))))\n\n================================================================================\nclass: multiple type families unannotated\n================================================================================\n\nclass A a where\n  type A a\n  type A a\n  type A a = ()\n\n  a :: a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (class\n      (name)\n      (type_params\n        (variable))\n      (class_declarations\n        (type_family\n          (name)\n          (type_params\n            (variable)))\n        (type_family\n          (name)\n          (type_params\n            (variable)))\n        (type_instance\n          (name)\n          (type_patterns\n            (variable))\n          (unit))\n        (signature\n          (variable)\n          (variable))))))\n\n================================================================================\nclass: where on new line\n================================================================================\n\nmodule A where\nclass A\n  where\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (header\n    (module\n      (module_id)))\n  (declarations\n    (class\n      (name))))\n"
  },
  {
    "path": "test/corpus/comment.txt",
    "content": "================================================================================\ncomment: line\n================================================================================\n\n--\n-- a\n--\n-- a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (comment))\n\n================================================================================\ncomment: multi\n================================================================================\n\n{- a\n   a\n   - a\n-}\nf = a\n{-a-}\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (comment)\n  (declarations\n    (bind\n      (variable)\n      (match\n        (variable)))\n    (comment)))\n\n================================================================================\ncomment: hash inside\n================================================================================\n\n{- #comment -}\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (comment))\n\n================================================================================\ncomment: newline termination\n================================================================================\n\n--\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (comment))\n\n================================================================================\ncomment: nested\n================================================================================\n\n{- comment\n{- nested\n-}\n}\na =\n\n-}\n\na = a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (comment)\n  (declarations\n    (bind\n      (variable)\n      (match\n        (variable)))))\n\n================================================================================\ncomment: unicode symbol\n================================================================================\n\n-- ∀\n\n{- ∀ -}\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (comment)\n  (comment))\n\n================================================================================\ncomment: repeated minus before multiline end\n================================================================================\n\nmodule A where\n\n{- --}\n\n{-\na\n-----}\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (header\n    (module\n      (module_id)))\n  (comment)\n  (comment))\n\n================================================================================\ncomment: double brace before nested begin\n================================================================================\n\nmodule A where\n\n{- {{- -} -}\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (header\n    (module\n      (module_id)))\n  (comment))\n\n================================================================================\ncomment: terminated by eof\n================================================================================\n\na = a\n\n{-\n\na\n\naaa\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (variable)))\n    (comment)))\n\n================================================================================\ncomment: end of line\n================================================================================\n\na = a -- a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (variable)))\n    (comment)))\n\n================================================================================\ncomment: escaped heralds\n================================================================================\n\n{-\n{\\-\n-\\}\n-}\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (comment))\n\n================================================================================\ncomment: multiple braces\n================================================================================\n\n{-\n{{{{{\n}}}}}\n-}\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (comment))\n\n================================================================================\ncomment: symop char after first space\n================================================================================\n\na = a -- > a\n\na = a\n  -- > a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (variable)))\n    (comment)\n    (bind\n      (variable)\n      (match\n        (variable)))\n    (comment)))\n\n================================================================================\ncomment: haddock\n================================================================================\n\ndata A =\n  A\n  A -- ^ a\n  A {- ^ a -}\n\n-- | a\n-- a\na = a\n\n{- | a\n-}\ndata A\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (data_type\n      (name)\n      (data_constructors\n        (data_constructor\n          (prefix\n            (constructor)\n            (name)\n            (haddock)\n            (name)))))\n    (haddock)\n    (haddock)\n    (bind\n      (variable)\n      (match\n        (variable)))\n    (haddock)\n    (data_type\n      (name))))\n"
  },
  {
    "path": "test/corpus/consym.txt",
    "content": "================================================================================\nconsym: valid\n================================================================================\n\ndata A = Int :+ Int\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (data_type\n      (name)\n      (data_constructors\n        (data_constructor\n          (infix\n            (name)\n            (constructor_operator)\n            (name)))))))\n\n================================================================================\nconsym: error: ::\n================================================================================\n\ndata A = Int :: Int\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (data_type\n      (name)\n      (data_constructors\n        (data_constructor\n          (prefix\n            (constructor)\n            (ERROR)\n            (name)))))))\n"
  },
  {
    "path": "test/corpus/context.txt",
    "content": "================================================================================\ncontext: smoke\n================================================================================\n\na ::\n  a ->\n  a a ++ a a =>\n  a a a =>\n  (?aaa :: a -> a -> a) =>\n  (∀ a . A a => A a) =>\n  a ->\n  a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (signature\n      (variable)\n      (function\n        (variable)\n        (context\n          (infix\n            (apply\n              (variable)\n              (variable))\n            (operator)\n            (apply\n              (variable)\n              (variable)))\n          (context\n            (apply\n              (apply\n                (variable)\n                (variable))\n              (variable))\n            (context\n              (parens\n                (implicit_parameter\n                  (implicit_variable)\n                  (function\n                    (variable)\n                    (function\n                      (variable)\n                      (variable)))))\n              (context\n                (parens\n                  (forall\n                    (quantified_variables\n                      (variable))\n                    (context\n                      (apply\n                        (name)\n                        (variable))\n                      (apply\n                        (name)\n                        (variable)))))\n                (function\n                  (variable)\n                  (variable))))))))))\n\n================================================================================\ncontext: trivial\n================================================================================\n\na :: a => a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (signature\n      (variable)\n      (context\n        (variable)\n        (variable)))))\n\n================================================================================\ncontext: infix constraint simple\n================================================================================\n\na :: a ++ a => a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  declarations: (declarations\n    (signature\n      name: (variable)\n      type: (context\n        context: (infix\n          left_operand: (variable)\n          operator: (operator)\n          right_operand: (variable))\n        type: (variable)))))\n\n================================================================================\ncontext: apply in left infix operand\n================================================================================\n\na :: A a ++ a => a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (signature\n      (variable)\n      (context\n        (infix\n          (apply\n            (name)\n            (variable))\n          (operator)\n          (variable))\n        (variable)))))\n\n================================================================================\ncontext: apply in both infix operands\n================================================================================\n\na :: a -> a a ++ a a => a a a => a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (signature\n      (variable)\n      (function\n        (variable)\n        (context\n          (infix\n            (apply\n              (variable)\n              (variable))\n            (operator)\n            (apply\n              (variable)\n              (variable)))\n          (context\n            (apply\n              (apply\n                (variable)\n                (variable))\n              (variable))\n            (variable)))))))\n\n================================================================================\ncontext: quantified\n================================================================================\n\na :: (∀ a . A a => A a) => a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (signature\n      (variable)\n      (context\n        (parens\n          (forall\n            (quantified_variables\n              (variable))\n            (context\n              (apply\n                (name)\n                (variable))\n              (apply\n                (name)\n                (variable)))))\n        (variable)))))\n\n================================================================================\ncontext: apply constraint\n================================================================================\n\ntype A = A a => A\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (type_synomym\n      (name)\n      (context\n        (apply\n          (name)\n          (variable))\n        (name)))))\n\n================================================================================\ncontext: parens apply constraint\n================================================================================\n\ntype A = (a A) a => A\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (type_synomym\n      (name)\n      (context\n        (apply\n          (parens\n            (apply\n              (variable)\n              (name)))\n          (variable))\n        (name)))))\n\n================================================================================\ncontext: type annotation\n================================================================================\n\ntype A = (A :: A a -> A) a => A\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (type_synomym\n      (name)\n      (context\n        (apply\n          (parens\n            (signature\n              (name)\n              (function\n                (apply\n                  (name)\n                  (variable))\n                (name))))\n          (variable))\n        (name)))))\n\n================================================================================\ncontext: constraint, then forall, then infix constraint\n================================================================================\n\ntype A = A a => ∀ a . a *+* a => A\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (type_synomym\n      (name)\n      (context\n        (apply\n          (name)\n          (variable))\n        (forall\n          (quantified_variables\n            (variable))\n          (context\n            (infix\n              (variable)\n              (operator)\n              (variable))\n            (name)))))))\n\n================================================================================\ncontext: in fun arg\n================================================================================\n\ntype A = (A => a a) -> A\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (type_synomym\n      (name)\n      (function\n        (parens\n          (context\n            (name)\n            (apply\n              (variable)\n              (variable))))\n        (name)))))\n\n================================================================================\ncontext: ctuple\n================================================================================\n\na :: (A, A a) => a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (signature\n      (variable)\n      (context\n        (tuple\n          (name)\n          (apply\n            (name)\n            (variable)))\n        (variable)))))\n\n================================================================================\ncontext: multi, multi line\n================================================================================\n\na ::\n  A a a =>\n  (A a, A a) =>\n  (A => a a) ->\n  A a ->\n  a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (signature\n      (variable)\n      (context\n        (apply\n          (apply\n            (name)\n            (variable))\n          (variable))\n        (context\n          (tuple\n            (apply\n              (name)\n              (variable))\n            (apply\n              (name)\n              (variable)))\n          (function\n            (parens\n              (context\n                (name)\n                (apply\n                  (variable)\n                  (variable))))\n            (function\n              (apply\n                (name)\n                (variable))\n              (variable))))))))\n\n================================================================================\ncontext: multi, single line\n================================================================================\n\na :: A a a => (A a, A a) => a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (signature\n      (variable)\n      (context\n        (apply\n          (apply\n            (name)\n            (variable))\n          (variable))\n        (context\n          (tuple\n            (apply\n              (name)\n              (variable))\n            (apply\n              (name)\n              (variable)))\n          (variable))))))\n\n================================================================================\ncontext: forall/context in constraint\n================================================================================\n\na :: (forall a . A => A) => A\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (signature\n      (variable)\n      (context\n        (parens\n          (forall\n            (quantified_variables\n              (variable))\n            (context\n              (name)\n              (name))))\n        (name)))))\n\n================================================================================\ncontext: multiple nested foralls/contexts in constraint\n================================================================================\n\na :: (forall a . forall a . (forall a . A => A) => forall a . A => A) => A\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (signature\n      (variable)\n      (context\n        (parens\n          (forall\n            (quantified_variables\n              (variable))\n            (forall\n              (quantified_variables\n                (variable))\n              (context\n                (parens\n                  (forall\n                    (quantified_variables\n                      (variable))\n                    (context\n                      (name)\n                      (name))))\n                (forall\n                  (quantified_variables\n                    (variable))\n                  (context\n                    (name)\n                    (name)))))))\n        (name)))))\n\n================================================================================\ncontext: double parenthesis\n================================================================================\n\na :: ((A)) => A\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (signature\n      (variable)\n      (context\n        (parens\n          (parens\n            (name)))\n        (name)))))\n\n================================================================================\ncontext: annotated constraint tuple\n================================================================================\n\na :: ((a, a) :: (A, A)) => a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (signature\n      (variable)\n      (context\n        (parens\n          (signature\n            (tuple\n              (variable)\n              (variable))\n            (tuple\n              (name)\n              (name))))\n        (variable)))))\n\n================================================================================\ncontext: annotated quantified constraint\n================================================================================\n\na :: ((∀ a . A a) :: (A, A)) => a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (signature\n      (variable)\n      (context\n        (parens\n          (signature\n            (parens\n              (forall\n                (quantified_variables\n                  (variable))\n                (apply\n                  (name)\n                  (variable))))\n            (tuple\n              (name)\n              (name))))\n        (variable)))))\n\n================================================================================\ncontext: parenthesized contexts\n================================================================================\n\na :: (A a, a ++ a) => a\na :: ((A a ++ A a)) => a\na :: (A a => A) => a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (signature\n      (variable)\n      (context\n        (tuple\n          (apply\n            (name)\n            (variable))\n          (infix\n            (variable)\n            (operator)\n            (variable)))\n        (variable)))\n    (signature\n      (variable)\n      (context\n        (parens\n          (parens\n            (infix\n              (apply\n                (name)\n                (variable))\n              (operator)\n              (apply\n                (name)\n                (variable)))))\n        (variable)))\n    (signature\n      (variable)\n      (context\n        (parens\n          (context\n            (apply\n              (name)\n              (variable))\n            (name)))\n        (variable)))))\n\n================================================================================\ncontext: double context, infix, apply right\n================================================================================\n\na :: a ++ a a => a => a\na :: a ++ a a a => a => a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (signature\n      (variable)\n      (context\n        (infix\n          (variable)\n          (operator)\n          (apply\n            (variable)\n            (variable)))\n        (context\n          (variable)\n          (variable))))\n    (signature\n      (variable)\n      (context\n        (infix\n          (variable)\n          (operator)\n          (apply\n            (apply\n              (variable)\n              (variable))\n            (variable)))\n        (context\n          (variable)\n          (variable))))))\n\n================================================================================\ncontext: double context, infix, apply left\n================================================================================\n\na :: a a ++ a => a => a\na :: a a a ++ a => a => a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (signature\n      (variable)\n      (context\n        (infix\n          (apply\n            (variable)\n            (variable))\n          (operator)\n          (variable))\n        (context\n          (variable)\n          (variable))))\n    (signature\n      (variable)\n      (context\n        (infix\n          (apply\n            (apply\n              (variable)\n              (variable))\n            (variable))\n          (operator)\n          (variable))\n        (context\n          (variable)\n          (variable))))))\n\n================================================================================\ncontext: double context, apply\n================================================================================\n\na :: a a => a => a\na :: a a a => a => a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (signature\n      (variable)\n      (context\n        (apply\n          (variable)\n          (variable))\n        (context\n          (variable)\n          (variable))))\n    (signature\n      (variable)\n      (context\n        (apply\n          (apply\n            (variable)\n            (variable))\n          (variable))\n        (context\n          (variable)\n          (variable))))))\n\n================================================================================\ncontext: promoted varsym\n================================================================================\n\n-- It is illegal to promote a varsym but we can be lenient.\na :: a a '++ a => a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (comment)\n  (declarations\n    (signature\n      (variable)\n      (context\n        (infix\n          (apply\n            (variable)\n            (variable))\n          (promoted\n            (operator))\n          (variable))\n        (variable)))))\n\n================================================================================\ncontext: promoted consym\n================================================================================\n\na :: a a ':++ a => a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (signature\n      (variable)\n      (context\n        (infix\n          (apply\n            (variable)\n            (variable))\n          (promoted\n            (constructor_operator))\n          (variable))\n        (variable)))))\n\n================================================================================\ncontext: splice\n================================================================================\n\na :: $(a) => a\na :: (A, $(a)) => a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (signature\n      (variable)\n      (context\n        (splice\n          (parens\n            (variable)))\n        (variable)))\n    (signature\n      (variable)\n      (context\n        (tuple\n          (name)\n          (splice\n            (parens\n              (variable))))\n        (variable)))))\n\n================================================================================\ncontext: parens around class apply constructor\n================================================================================\n\na :: (A) a => a\na :: ((A)) a => a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (signature\n      (variable)\n      (context\n        (apply\n          (parens\n            (name))\n          (variable))\n        (variable)))\n    (signature\n      (variable)\n      (context\n        (apply\n          (parens\n            (parens\n              (name)))\n          (variable))\n        (variable)))))\n\n================================================================================\ncontext: type application\n================================================================================\n\na :: A @A a @a => a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (signature\n      (variable)\n      (context\n        (apply\n          (apply\n            (apply\n              (name)\n              (kind_application\n                (name)))\n            (variable))\n          (kind_application\n            (variable)))\n        (variable)))))\n\n================================================================================\ncontext: comment before arrow\n================================================================================\n\na :: A -- a\n  => A\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (signature\n      (variable)\n      (context\n        (name)\n        (comment)\n        (name)))))\n\n================================================================================\ncontext: symbol\n================================================================================\n\na :: A \"a\" => a\n\na :: A \"a\\\\\\\\\" => a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (signature\n      (variable)\n      (context\n        (apply\n          (name)\n          (literal\n            (string)))\n        (variable)))\n    (signature\n      (variable)\n      (context\n        (apply\n          (name)\n          (literal\n            (string)))\n        (variable)))))\n\n================================================================================\ncontext: char\n================================================================================\n\na :: A 'a' => a\n\na :: A '\\n' => a\n\na :: A '\\^[' => a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (signature\n      (variable)\n      (context\n        (apply\n          (name)\n          (literal\n            (char)))\n        (variable)))\n    (signature\n      (variable)\n      (context\n        (apply\n          (name)\n          (literal\n            (char)))\n        (variable)))\n    (signature\n      (variable)\n      (context\n        (apply\n          (name)\n          (literal\n            (char)))\n        (variable)))))\n\n================================================================================\ncontext: prime newline skip\n================================================================================\n\n-- lookahead for ' advances over the space to check for another ' delimiting a\n-- char, which interferes with the subsequent `newline_lookahead` skip\ninstance (A' (A)) => A\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (comment)\n  (declarations\n    (instance\n      (context\n        (parens\n          (apply\n            (name)\n            (parens\n              (name)))))\n      (name))))\n\n================================================================================\ncontext: prime char false positive\n================================================================================\n\n-- the first and third ' are parsed as chars. the second char gobbles up the\n-- paren\na :: (a' 'a')'a' => A\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (comment)\n  (declarations\n    (signature\n      (variable)\n      (context\n        (apply\n          (parens\n            (apply\n              (variable)\n              (literal\n                (char))))\n          (literal\n            (char)))\n        (name)))))\n\n================================================================================\ncontext: nonzero-indent lookahead rejection\n================================================================================\n\n-- A context is valid at `b`, and since lookahead only stops at column 0, the\n-- => on the next line is valid unless :: is a termination token.\nclass A where\n  a :: b\n  a :: a => a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (comment)\n  (declarations\n    (class\n      (name)\n      (class_declarations\n        (signature\n          (variable)\n          (variable))\n        (signature\n          (variable)\n          (context\n            (variable)\n            (variable)))))))\n\n================================================================================\ncontext: zero-indent brace context\n================================================================================\n\n-- In record braces, zero-indent does not guarantee a new layout element.\ndata A = A {a :: a\n=> a}\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (comment)\n  (declarations\n    (data_type\n      (name)\n      (data_constructors\n        (data_constructor\n          (record\n            (constructor)\n            (fields\n              (field\n                (field_name\n                  (variable))\n                (context\n                  (variable)\n                  (variable))))))))))\n\n================================================================================\ncontext: conflict between symop and context lookahead reset\n================================================================================\n\na = a @'(:)\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (apply\n          (variable)\n          (type_application\n            (promoted\n              (prefix_id\n                (constructor_operator)))))))))\n\n================================================================================\ncontext: after deriving via\n================================================================================\n\nderiving via A instance A => A\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (deriving_instance\n      (via\n        (name))\n      (context\n        (name))\n      (name))))\n\n================================================================================\ncontext: left infix nesting\n================================================================================\n\na :: (a + a) + a => a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (signature\n      (variable)\n      (context\n        (infix\n          (parens\n            (infix\n              (variable)\n              (operator)\n              (variable)))\n          (operator)\n          (variable))\n        (variable)))))\n\n================================================================================\ncontext: tight infix tilde\n================================================================================\n\na :: a~a => A\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (signature\n      (variable)\n      (context\n        (infix\n          (variable)\n          (operator)\n          (variable))\n        (name)))))\n\n================================================================================\ncontext: annotated infix in tuple\n================================================================================\n\na :: (a + a :: A, a + a :: A) => a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (signature\n      (variable)\n      (context\n        (tuple\n          (signature\n            (infix\n              (variable)\n              (operator)\n              (variable))\n            (name))\n          (signature\n            (infix\n              (variable)\n              (operator)\n              (variable))\n            (name)))\n        (variable)))))\n\n================================================================================\ncontext: infix in constraint context\n================================================================================\n\na :: (a + a => a) => a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (signature\n      (variable)\n      (context\n        (parens\n          (context\n            (infix\n              (variable)\n              (operator)\n              (variable))\n            (variable)))\n        (variable)))))\n\n================================================================================\ncontext: empty\n================================================================================\n\na :: () => a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (signature\n      (variable)\n      (context\n        (unit)\n        (variable)))))\n"
  },
  {
    "path": "test/corpus/cpp.txt",
    "content": "================================================================================\ncpp: keep layout from first if branch\n================================================================================\n\na = do\n  do\n    do\n      a <- a\n#ifndef Aaaa\n    a <- a\n#elif Aaa\n    a <- a\n    a\n  a\n#else\n    a <- a\n    a\n  a\n#endif\n    a <- a\n    a\n  a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (do\n          (exp\n            (do\n              (exp\n                (do\n                  (bind\n                    (variable)\n                    (variable))))\n              (cpp)\n              (bind\n                (variable)\n                (variable))\n              (cpp)\n              (cpp)\n              (bind\n                (variable)\n                (variable))\n              (exp\n                (variable))))\n          (exp\n            (variable)))))))\n\n================================================================================\ncpp: multiline\n================================================================================\n\na = a\n\n#if a \\\n  a \\\na \\\na\n\na = a\n\n#endif\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (variable)))\n    (cpp)\n    (bind\n      (variable)\n      (match\n        (variable)))\n    (cpp)))\n\n================================================================================\ncpp: newline after decl in layout with one-way if\n================================================================================\n\ninstance A where\n  a = a\n\n#if\n  a = a\n#endif\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (instance\n      (name)\n      (instance_declarations\n        (bind\n          (variable)\n          (match\n            (variable)))\n        (cpp)\n        (bind\n          (variable)\n          (match\n            (variable)))))\n    (cpp)))\n\n================================================================================\ncpp: incomplete #if/#else\n================================================================================\n\n#if a\na = a\n#else\n\na = a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (cpp)\n  (declarations\n    (bind\n      (variable)\n      (match\n        (variable)))\n    (cpp)))\n\n================================================================================\ncpp: mid-line #endif\n================================================================================\n\n#if a\na = a\n#else\n\ndata A #endif\n\ninstance A\n#endif\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (cpp)\n  (declarations\n    (bind\n      (variable)\n      (match\n        (variable)))\n    (cpp)\n    (cpp)))\n\n================================================================================\ncpp: do-let in #if\n================================================================================\n\na = do\n#if a\n  let a = a\n#else\n#endif\n  a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (do\n          (cpp)\n          (let\n            (local_binds\n              (bind\n                (variable)\n                (match\n                  (variable)))))\n          (cpp)\n          (cpp)\n          (exp\n            (variable)))))))\n\n================================================================================\ncpp: layout ended in #else first\n================================================================================\n\n-- This ensures that the scanner's newline lookahead skips the entire #else\n-- branch when determining the next layout element's indent.\n-- In this case, the #else contains a new decl, while the actual indent should\n-- be given by the do statement after the #endif.\na = do\n  a\n#if a\n  a\n#else\na = do\n  a\n#endif\n  a\n\na = a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (comment)\n  (declarations\n    (bind\n      (variable)\n      (match\n        (do\n          (exp\n            (variable))\n          (cpp)\n          (exp\n            (variable))\n          (cpp)\n          (cpp)\n          (exp\n            (variable)))))\n    (bind\n      (variable)\n      (match\n        (variable)))))\n\n================================================================================\ncpp: lambdacase layout interrupted by #else\n================================================================================\n\na = \\case\n#if a\n  a\n#else\n  a\n#endif\n   -> a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (lambda_case\n          (cpp)\n          (alternatives\n            (alternative\n              (variable)\n              (cpp)\n              (cpp)\n              (match\n                (variable)))))))))\n\n================================================================================\ncpp: #include as function body\n================================================================================\n\n-- From GHC.\nallThePrimOps :: [PrimOp]\nallThePrimOps =\n#include \"primop-list.hs-incl\"\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (comment)\n  (declarations\n    (signature\n      (variable)\n      (list\n        (name)))\n    (top_splice\n      (variable))\n    (ERROR)\n    (cpp)))\n\n================================================================================\ncpp: nested #if\n================================================================================\n\na = do\n\n#if\n  a <- a\n#else\n\n#if\n\n#elif\n\n#else\n\n#if\n\n#endif\n  a\n\na = a\n\n#endif\n  a <- a\n  a\n\na = a\n\n#endif\n  a <- a\n  a\n\na = a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (do\n          (cpp)\n          (bind\n            (variable)\n            (variable))\n          (cpp)\n          (cpp)\n          (bind\n            (variable)\n            (variable))\n          (exp\n            (variable)))))\n    (bind\n      (variable)\n      (match\n        (variable)))))\n\n================================================================================\ncpp: precedence over comments\n================================================================================\n\n{-\n#if 1\n#else\n-}\n#endif\n-- This is wrong, but it's unlikely that it's possible to get it right.\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (comment)\n  (cpp)\n  (comment))\n\n================================================================================\ncpp: label after newline\n================================================================================\n\na = a\n  #a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (apply\n          (variable)\n          (label))))))\n\n================================================================================\ncpp: hash operator in brace layout\n================================================================================\n\na = A { a = a\n# a\n}\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (record\n          (constructor)\n          (field_update\n            (field_name\n              (variable))\n            (infix\n              (variable)\n              (operator)\n              (variable))))))))\n\n================================================================================\ncpp: only spaces after herald\n================================================================================\n\na = do\n  a do\n    a <- a\n\n#      \n\n    a\n  a\n\na = a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (do\n          (exp\n            (apply\n              (variable)\n              (do\n                (bind\n                  (variable)\n                  (variable))\n                (cpp)\n                (exp\n                  (variable)))))\n          (exp\n            (variable)))))\n    (bind\n      (variable)\n      (match\n        (variable)))))\n\n================================================================================\ncpp: endif with trailing C comments\n================================================================================\n\n#if\na = a\n\n#else\n#endif /* a */\n\na = a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (cpp)\n  (declarations\n    (bind\n      (variable)\n      (match\n        (variable)))\n    (cpp)\n    (cpp)\n    (bind\n      (variable)\n      (match\n        (variable)))))\n\n================================================================================\ncpp: endif at eof\n================================================================================\n\na = a\n  where\n#if\n    a = a\n#else\n    a = a\n#endif\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (variable))\n      (cpp)\n      (local_binds\n        (bind\n          (variable)\n          (match\n            (variable)))))\n    (cpp)\n    (cpp)))\n\n================================================================================\ncpp: first line if\n================================================================================\n#if\nmodule A where\n#else\nmodule A where\n#endif\n\na = a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (cpp)\n  (header\n    (module\n      (module_id)))\n  (cpp)\n  (cpp)\n  (declarations\n    (bind\n      (variable)\n      (match\n        (variable)))))\n\n================================================================================\ncpp: shebang\n================================================================================\n#!/usr/bin/env cabal\na = a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (cpp)\n  (declarations\n    (bind\n      (variable)\n      (match\n        (variable)))))\n\n================================================================================\ncpp: mid-line label after block comment\n================================================================================\n\na = a\n  {-\n-}#define\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (apply\n          (variable)\n          (comment)\n          (label))))))\n\n================================================================================\ncpp: mid-line label after newline\n================================================================================\n\na = a\n\n  #define\n\na = a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (apply\n          (variable)\n          (label))))\n    (bind\n      (variable)\n      (match\n        (variable)))))\n\n================================================================================\ncpp: after do keyword\n================================================================================\n\na = do\n#if\n    !a <- a\n#endif\n    a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (do\n          (cpp)\n          (bind\n            (strict\n              (variable))\n            (variable))\n          (cpp)\n          (exp\n            (variable)))))))\n\n================================================================================\ncpp: newline continuation\n================================================================================\n\n#if \\\n1\n#endif\n\n-- this one has trailing whitespace, which is valid\n#if \\ \t  \n1\n#endif\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (cpp)\n  (cpp)\n  (comment)\n  (cpp)\n  (cpp))\n"
  },
  {
    "path": "test/corpus/data.txt",
    "content": "================================================================================\ndata: empty\n================================================================================\n\ndata A\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (data_type\n      (name))))\n\n================================================================================\ndata: one nullary con\n================================================================================\n\ndata A = A\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (data_type\n      (name)\n      (data_constructors\n        (data_constructor\n          (prefix\n            (constructor)))))))\n\n================================================================================\ndata: one unary con\n================================================================================\n\ndata A = A A\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (data_type\n      (name)\n      (data_constructors\n        (data_constructor\n          (prefix\n            (constructor)\n            (name)))))))\n\n================================================================================\ndata: strict\n================================================================================\n\ndata A = A !A !(A A)\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (data_type\n      (name)\n      (data_constructors\n        (data_constructor\n          (prefix\n            (constructor)\n            (strict_field\n              (name))\n            (strict_field\n              (parens\n                (apply\n                  (name)\n                  (name))))))))))\n\n================================================================================\ndata: lazy\n================================================================================\n\ndata A = A ~A\ndata A = ~A :+ ~A\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (data_type\n      (name)\n      (data_constructors\n        (data_constructor\n          (prefix\n            (constructor)\n            (lazy_field\n              (name))))))\n    (data_type\n      (name)\n      (data_constructors\n        (data_constructor\n          (infix\n            (lazy_field\n              (name))\n            (constructor_operator)\n            (lazy_field\n              (name))))))))\n\n================================================================================\ndata: tyvars\n================================================================================\n\ndata A a a a = A a !a [a]\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (data_type\n      (name)\n      (type_params\n        (variable)\n        (variable)\n        (variable))\n      (data_constructors\n        (data_constructor\n          (prefix\n            (constructor)\n            (variable)\n            (strict_field\n              (variable))\n            (list\n              (variable))))))))\n\n================================================================================\ndata: unpack strict\n================================================================================\n\ndata A = A {-# unpack #-} !A\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (data_type\n      (name)\n      (data_constructors\n        (data_constructor\n          (prefix\n            (constructor)\n            (pragma)\n            (strict_field\n              (name))))))))\n\n================================================================================\ndata: record\n================================================================================\n\ndata A a = A { a :: A, a, a :: A, a :: {-# unpack #-} !a, a :: !A }\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (data_type\n      (name)\n      (type_params\n        (variable))\n      (data_constructors\n        (data_constructor\n          (record\n            (constructor)\n            (fields\n              (field\n                (field_name\n                  (variable))\n                (name))\n              (field\n                (field_name\n                  (variable))\n                (field_name\n                  (variable))\n                (name))\n              (field\n                (field_name\n                  (variable))\n                (pragma)\n                (strict_field\n                  (variable)))\n              (field\n                (field_name\n                  (variable))\n                (strict_field\n                  (name))))))))))\n\n================================================================================\ndata: record zero indent\n================================================================================\n\ndata A = A {\n  a :: A,\na :: A,\n   a :: A\n, a :: A\n}\n\na = a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (data_type\n      (name)\n      (data_constructors\n        (data_constructor\n          (record\n            (constructor)\n            (fields\n              (field\n                (field_name\n                  (variable))\n                (name))\n              (field\n                (field_name\n                  (variable))\n                (name))\n              (field\n                (field_name\n                  (variable))\n                (name))\n              (field\n                (field_name\n                  (variable))\n                (name)))))))\n    (bind\n      (variable)\n      (match\n        (variable)))))\n\n================================================================================\ndata: multiple cons\n================================================================================\n\ndata A = A | A A | A !A A\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (data_type\n      (name)\n      (data_constructors\n        (data_constructor\n          (prefix\n            (constructor)))\n        (data_constructor\n          (prefix\n            (constructor)\n            (name)))\n        (data_constructor\n          (prefix\n            (constructor)\n            (strict_field\n              (name))\n            (name)))))))\n\n================================================================================\ndata: deriving basic\n================================================================================\n\ndata A = A deriving A\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (data_type\n      (name)\n      (data_constructors\n        (data_constructor\n          (prefix\n            (constructor))))\n      (deriving\n        (name)))))\n\n================================================================================\ndata: deriving empty\n================================================================================\n\ndata A deriving A\n\ndata A\n  deriving A\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (data_type\n      (name)\n      (deriving\n        (name)))\n    (data_type\n      (name)\n      (deriving\n        (name)))))\n\n================================================================================\ndata: deriving multi, strategy\n================================================================================\n\ndata A = A deriving (A, A) deriving stock (A)\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (data_type\n      (name)\n      (data_constructors\n        (data_constructor\n          (prefix\n            (constructor))))\n      (deriving\n        (tuple\n          (name)\n          (name)))\n      (deriving\n        (deriving_strategy)\n        (parens\n          (name))))))\n\n================================================================================\ndata: deriving via\n================================================================================\n\ndata A = A deriving (A) via (A A)\ndata A = A deriving (A) via A A\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (data_type\n      (name)\n      (data_constructors\n        (data_constructor\n          (prefix\n            (constructor))))\n      (deriving\n        (parens\n          (name))\n        (via\n          (parens\n            (apply\n              (name)\n              (name))))))\n    (data_type\n      (name)\n      (data_constructors\n        (data_constructor\n          (prefix\n            (constructor))))\n      (deriving\n        (parens\n          (name))\n        (via\n          (apply\n            (name)\n            (name)))))))\n\n================================================================================\ndata: deriving on newline, multiple\n================================================================================\n\ndata A =\n  A\n  deriving A\n  deriving A\ndata A =\n  A\n  deriving A\n  deriving A\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (data_type\n      (name)\n      (data_constructors\n        (data_constructor\n          (prefix\n            (constructor))))\n      (deriving\n        (name))\n      (deriving\n        (name)))\n    (data_type\n      (name)\n      (data_constructors\n        (data_constructor\n          (prefix\n            (constructor))))\n      (deriving\n        (name))\n      (deriving\n        (name)))))\n\n================================================================================\ndata: deriving with forall/context\n================================================================================\n\ndata A = A deriving (∀ a . A => A)\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (data_type\n      (name)\n      (data_constructors\n        (data_constructor\n          (prefix\n            (constructor))))\n      (deriving\n        (parens\n          (forall\n            (quantified_variables\n              (variable))\n            (context\n              (name)\n              (name))))))))\n\n================================================================================\ndata: deriving prefix op\n================================================================================\n\ndata A = A deriving ((+) A)\ndata A = A deriving ((+))\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (data_type\n      (name)\n      (data_constructors\n        (data_constructor\n          (prefix\n            (constructor))))\n      (deriving\n        (parens\n          (apply\n            (prefix_id\n              (operator))\n            (name)))))\n    (data_type\n      (name)\n      (data_constructors\n        (data_constructor\n          (prefix\n            (constructor))))\n      (deriving\n        (parens\n          (prefix_id\n            (operator)))))))\n\n================================================================================\ndata: deriving with annotation\n================================================================================\n\ndata A deriving (A :: A)\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (data_type\n      (name)\n      (deriving\n        (parens\n          (signature\n            (name)\n            (name)))))))\n\n================================================================================\ndata: deriving with all features\n================================================================================\n\ndata A deriving (∀ a . A a :: Type -> Constraint)\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (data_type\n      (name)\n      (deriving\n        (parens\n          (signature\n            (forall\n              (quantified_variables\n                (variable))\n              (apply\n                (name)\n                (variable)))\n            (function\n              (name)\n              (name))))))))\n\n================================================================================\ndata: deriving empty\n================================================================================\n\ndata A deriving ()\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (data_type\n      (name)\n      (deriving\n        (unit)))))\n\n================================================================================\ndata: datatype context trivial\n================================================================================\n\ndata A => A\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (data_type\n      (context\n        (name))\n      (name))))\n\n================================================================================\ndata: datatype context apply\n================================================================================\n\ndata A a (A a) => A = A\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (data_type\n      (context\n        (apply\n          (apply\n            (name)\n            (variable))\n          (parens\n            (apply\n              (name)\n              (variable)))))\n      (name)\n      (data_constructors\n        (data_constructor\n          (prefix\n            (constructor)))))))\n\n================================================================================\ndata: datatype context tuple\n================================================================================\n\ndata (A a, A a) => A = A\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (data_type\n      (context\n        (tuple\n          (apply\n            (name)\n            (variable))\n          (apply\n            (name)\n            (variable))))\n      (name)\n      (data_constructors\n        (data_constructor\n          (prefix\n            (constructor)))))))\n\n================================================================================\ndata: datatype context infix basic\n================================================================================\n\ndata a +++ b => a *** b\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (data_type\n      (context\n        (infix\n          (variable)\n          (operator)\n          (variable)))\n      (infix\n        (variable)\n        (operator)\n        (variable)))))\n\n================================================================================\ndata: datatype context infix parens\n================================================================================\n\ndata (a %% b) => A\n\n--------------------------------------------------------------------------------\n\n(haskell\n  declarations: (declarations\n    (data_type\n      context: (context\n        context: (parens\n          (infix\n            left_operand: (variable)\n            operator: (operator)\n            right_operand: (variable))))\n      name: (name))))\n\n================================================================================\ndata: MagicHash\n================================================================================\n\ndata A = A !A#\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (data_type\n      (name)\n      (data_constructors\n        (data_constructor\n          (prefix\n            (constructor)\n            (strict_field\n              (name))))))))\n\n================================================================================\ndata: forall\n================================================================================\n\ndata A = forall a . A | ∀ a . A\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (data_type\n      (name)\n      (data_constructors\n        (data_constructor\n          (forall\n            (quantified_variables\n              (variable)))\n          (prefix\n            (constructor)))\n        (data_constructor\n          (forall\n            (quantified_variables\n              (variable)))\n          (prefix\n            (constructor)))))))\n\n================================================================================\ndata: constructor context\n================================================================================\n\ndata A = ∀ a . A a => A\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (data_type\n      (name)\n      (data_constructors\n        (data_constructor\n          (forall\n            (quantified_variables\n              (variable)))\n          (context\n            (apply\n              (name)\n              (variable)))\n          (prefix\n            (constructor)))))))\n\n================================================================================\ndata: tyvar kind\n================================================================================\n\ndata A (a :: * -> 'A)\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (data_type\n      (name)\n      (type_params\n        (parens\n          (annotated\n            (variable)\n            (function\n              (star)\n              (promoted\n                (constructor)))))))))\n\n================================================================================\ndata: signature\n================================================================================\n\ndata A :: (k -> '[ 'A]) -> *\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (data_type\n      (name)\n      (function\n        (parens\n          (function\n            (variable)\n            (promoted\n              (list\n                (promoted\n                  (constructor))))))\n        (star)))))\n\n================================================================================\ndata: type operator varsym\n================================================================================\n\ndata a +++ b = a :+++ b\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (data_type\n      (infix\n        (variable)\n        (operator)\n        (variable))\n      (data_constructors\n        (data_constructor\n          (infix\n            (variable)\n            (constructor_operator)\n            (variable)))))))\n\n================================================================================\ndata: type operator consym\n================================================================================\n\ndata a :<- b = a :<- b\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (data_type\n      (infix\n        (variable)\n        (constructor_operator)\n        (variable))\n      (data_constructors\n        (data_constructor\n          (infix\n            (variable)\n            (constructor_operator)\n            (variable)))))))\n\n================================================================================\ndata: type operator applied parenthesized consym 1\n================================================================================\n\ndata (a :+: a) a a = A\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (data_type\n      (parens\n        (infix\n          (variable)\n          (constructor_operator)\n          (variable)))\n      (type_params\n        (variable)\n        (variable))\n      (data_constructors\n        (data_constructor\n          (prefix\n            (constructor)))))))\n\n================================================================================\ndata: type operator applied parenthesized consym 2\n================================================================================\n\ndata (((a)) :+: (a :: a)) a (a :: a) = A\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (data_type\n      (parens\n        (infix\n          (parens\n            (parens\n              (variable)))\n          (constructor_operator)\n          (parens\n            (annotated\n              (variable)\n              (variable)))))\n      (type_params\n        (variable)\n        (parens\n          (annotated\n            (variable)\n            (variable))))\n      (data_constructors\n        (data_constructor\n          (prefix\n            (constructor)))))))\n\n================================================================================\ndata: type data\n================================================================================\n\ntype data A = A\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (data_type\n      (name)\n      (data_constructors\n        (data_constructor\n          (prefix\n            (constructor)))))))\n\n================================================================================\ndata: empty record\n================================================================================\n\ndata A = A {}\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (data_type\n      (name)\n      (data_constructors\n        (data_constructor\n          (record\n            (constructor)\n            (fields)))))))\n\n================================================================================\ndata: special type heads\n================================================================================\n\ndata () = ()\ndata [] a = MkNil\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (data_type\n      (unit)\n      (data_constructors\n        (data_constructor\n          (special\n            (unit)))))\n    (data_type\n      (prefix_list)\n      (type_params\n        (variable))\n      (data_constructors\n        (data_constructor\n          (prefix\n            (constructor)))))))\n\n================================================================================\ndata: special constructors\n================================================================================\n\ndata A = ()\ndata A = (a, a)\ndata A# = (# #)\ndata A# = (# a #)\ndata A# = (# a, a #)\ndata A = (# a | #) | (# | a #)\ndata List a = [] | a : List a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (data_type\n      (name)\n      (data_constructors\n        (data_constructor\n          (special\n            (unit)))))\n    (data_type\n      (name)\n      (data_constructors\n        (data_constructor\n          (special\n            (tuple\n              (variable)\n              (variable))))))\n    (data_type\n      (name)\n      (data_constructors\n        (data_constructor\n          (special\n            (unboxed_unit)))))\n    (data_type\n      (name)\n      (data_constructors\n        (data_constructor\n          (special\n            (unboxed_tuple\n              (variable))))))\n    (data_type\n      (name)\n      (data_constructors\n        (data_constructor\n          (special\n            (unboxed_tuple\n              (variable)\n              (variable))))))\n    (data_type\n      (name)\n      (data_constructors\n        (data_constructor\n          (special\n            (unboxed_sum\n              (variable))))\n        (data_constructor\n          (special\n            (unboxed_sum\n              (variable))))))\n    (data_type\n      (name)\n      (type_params\n        (variable))\n      (data_constructors\n        (data_constructor\n          (special\n            (empty_list)))\n        (data_constructor\n          (infix\n            (variable)\n            (constructor_operator)\n            (apply\n              (name)\n              (variable))))))))\n\n================================================================================\ndata: lenient trailing comma in record\n================================================================================\n\ndata A =\n  A {\n    a :: A,\n    a :: A,\n  }\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (data_type\n      (name)\n      (data_constructors\n        (data_constructor\n          (record\n            (constructor)\n            (fields\n              (field\n                (field_name\n                  (variable))\n                (name))\n              (field\n                (field_name\n                  (variable))\n                (name)))))))))\n\n================================================================================\ndata: infix bang\n================================================================================\n\ndata A = A { a :: A ! A }\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (data_type\n      (name)\n      (data_constructors\n        (data_constructor\n          (record\n            (constructor)\n            (fields\n              (field\n                (field_name\n                  (variable))\n                (infix\n                  (name)\n                  (operator)\n                  (name))))))))))\n\n================================================================================\ndata: ticked constructor\n================================================================================\n\ndata A = a `A` a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (data_type\n      (name)\n      (data_constructors\n        (data_constructor\n          (infix\n            (variable)\n            (infix_id\n              (constructor))\n            (variable)))))))\n\n================================================================================\ndata: ticked context\n================================================================================\n\ndata A = a `A` a => A\ndata A = a `A.A` a => A\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (data_type\n      (name)\n      (data_constructors\n        (data_constructor\n          (context\n            (infix\n              (variable)\n              (infix_id\n                (name))\n              (variable)))\n          (prefix\n            (constructor)))))\n    (data_type\n      (name)\n      (data_constructors\n        (data_constructor\n          (context\n            (infix\n              (variable)\n              (infix_id\n                (qualified\n                  (module\n                    (module_id))\n                  (name)))\n              (variable)))\n          (prefix\n            (constructor)))))))\n\n================================================================================\ndata: complicated field type\n================================================================================\n\ndata A = A (∀ a a . A a => A a => A -> A -> a)\n\n--------------------------------------------------------------------------------\n\n(haskell\n  declarations: (declarations\n    (data_type\n      name: (name)\n      constructors: (data_constructors\n        constructor: (data_constructor\n          constructor: (prefix\n            name: (constructor)\n            field: (parens\n              type: (forall\n                variables: (quantified_variables\n                  bind: (variable)\n                  bind: (variable))\n                type: (context\n                  context: (apply\n                    constructor: (name)\n                    argument: (variable))\n                  type: (context\n                    context: (apply\n                      constructor: (name)\n                      argument: (variable))\n                    type: (function\n                      parameter: (name)\n                      result: (function\n                        parameter: (name)\n                        result: (variable)))))))))))))\n\n================================================================================\ndata: invisible binders\n================================================================================\n\ndata A @a (a :: A) @_ @(a :: A) @(_ :: A) = A\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (data_type\n      (name)\n      (type_params\n        (invisible\n          (variable))\n        (parens\n          (annotated\n            (variable)\n            (name)))\n        (invisible\n          (wildcard))\n        (invisible\n          (parens\n            (annotated\n              (variable)\n              (name))))\n        (invisible\n          (parens\n            (annotated\n              (wildcard)\n              (name)))))\n      (data_constructors\n        (data_constructor\n          (prefix\n            (constructor)))))))\n\n================================================================================\ndata: parens in prefix head\n================================================================================\n\ndata (A a) a = A\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (data_type\n      (parens\n        (name)\n        (type_params\n          (variable)))\n      (type_params\n        (variable))\n      (data_constructors\n        (data_constructor\n          (prefix\n            (constructor)))))))\n\n================================================================================\ndata: constructor context infix parens\n================================================================================\n\ndata A = (a %% b) => A\n\n--------------------------------------------------------------------------------\n\n(haskell\n  declarations: (declarations\n    (data_type\n      name: (name)\n      constructors: (data_constructors\n        constructor: (data_constructor\n          context: (context\n            context: (parens\n              (infix\n                left_operand: (variable)\n                operator: (operator)\n                right_operand: (variable))))\n          constructor: (prefix\n            name: (constructor)))))))\n"
  },
  {
    "path": "test/corpus/decl.txt",
    "content": "================================================================================\ndecl: two trivial successive functions\n================================================================================\n\na = a\n\na = a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (variable)))\n    (bind\n      (variable)\n      (match\n        (variable)))))\n\n================================================================================\ndecl: do and where\n================================================================================\n\na = do\n  a\n  where\n    a = a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  declarations: (declarations\n    (bind\n      name: (variable)\n      match: (match\n        expression: (do\n          statement: (exp\n            (variable))))\n      binds: (local_binds\n        decl: (bind\n          name: (variable)\n          match: (match\n            expression: (variable)))))))\n\n================================================================================\ndecl: empty where\n================================================================================\n\na =\n  a\n  where\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (variable)))))\n\n================================================================================\ndecl: where\n================================================================================\n\na = a where a = a\na =\n  a\n  where\n    a = a\n    a = a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (variable))\n      (local_binds\n        (bind\n          (variable)\n          (match\n            (variable)))))\n    (bind\n      (variable)\n      (match\n        (variable))\n      (local_binds\n        (bind\n          (variable)\n          (match\n            (variable)))\n        (bind\n          (variable)\n          (match\n            (variable)))))))\n\n================================================================================\ndecl: case and where\n================================================================================\n\na = case a of\n  A a -> a\n  A -> a\n  where a = 1\n        a = 2\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (case\n          (variable)\n          (alternatives\n            (alternative\n              (apply\n                (constructor)\n                (variable))\n              (match\n                (variable)))\n            (alternative\n              (constructor)\n              (match\n                (variable))))))\n      (local_binds\n        (bind\n          (variable)\n          (match\n            (literal\n              (integer))))\n        (bind\n          (variable)\n          (match\n            (literal\n              (integer))))))))\n\n================================================================================\ndecl: do, let, where\n================================================================================\n\na a = do\n  a <- a\n  let z = a\n  a\n  where a = pure a\n        a = 1\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (function\n      (variable)\n      (patterns\n        (variable))\n      (match\n        (do\n          (bind\n            (variable)\n            (variable))\n          (let\n            (local_binds\n              (bind\n                (variable)\n                (match\n                  (variable)))))\n          (exp\n            (variable))))\n      (local_binds\n        (bind\n          (variable)\n          (match\n            (apply\n              (variable)\n              (variable))))\n        (bind\n          (variable)\n          (match\n            (literal\n              (integer))))))))\n\n================================================================================\ndecl: variable binding list\n================================================================================\n\na, a, a :: A\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (signature\n      (binding_list\n        (variable)\n        (variable)\n        (variable))\n      (name))))\n\n================================================================================\ndecl: operator binding list\n================================================================================\n\n(<), (<=), (>=), a, (>) :: a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (signature\n      (binding_list\n        (prefix_id\n          (operator))\n        (prefix_id\n          (operator))\n        (prefix_id\n          (operator))\n        (variable)\n        (prefix_id\n          (operator)))\n      (variable))))\n\n================================================================================\ndecl: primop\n================================================================================\n\na# :: a\na# = a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (signature\n      (variable)\n      (variable))\n    (bind\n      (variable)\n      (match\n        (variable)))))\n\n================================================================================\ndecl: ticked infix pattern\n================================================================================\n\na `a` a = a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (function\n      (infix\n        (variable)\n        (infix_id\n          (variable))\n        (variable))\n      (match\n        (variable)))))\n\n================================================================================\ndecl: comment association\n================================================================================\n\na = a\n\n-- | a\na = do a\n\n-- | This comment should be located right before the following decl, but it can\n-- get pulled into the do unless the scanner is careful not to include any\n-- whitespace in layout ends.\na = a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (variable)))\n    (haddock)\n    (bind\n      (variable)\n      (match\n        (do\n          (exp\n            (variable)))))\n    (haddock)\n    (bind\n      (variable)\n      (match\n        (variable)))))\n\n================================================================================\ndecl: fixity\n================================================================================\n\ninfixr 7 `op`, `ip`, `ap`\ninfix <$>\ninfixr 7 <$>\ninfix 7 :\ninfixl 7 :.\ninfix 7 :<:\ninfixl 1 -\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (fixity\n      (integer)\n      (infix_id\n        (variable))\n      (infix_id\n        (variable))\n      (infix_id\n        (variable)))\n    (fixity\n      (operator))\n    (fixity\n      (integer)\n      (operator))\n    (fixity\n      (integer)\n      (constructor_operator))\n    (fixity\n      (integer)\n      (constructor_operator))\n    (fixity\n      (integer)\n      (constructor_operator))\n    (fixity\n      (integer)\n      (operator))))\n\n================================================================================\ndecl: infix function with extra args\n================================================================================\n\n(a ++ a) a a = a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (function\n      (function_head_parens\n        (infix\n          (variable)\n          (operator)\n          (variable)))\n      (patterns\n        (variable)\n        (variable))\n      (match\n        (variable)))))\n\n================================================================================\ndecl: symop constructor pattern in infix varop decl\n================================================================================\n\n(a :+ a) ! a = a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (function\n      (infix\n        (parens\n          (infix\n            (variable)\n            (constructor_operator)\n            (variable)))\n        (operator)\n        (variable))\n      (match\n        (variable)))))\n\n================================================================================\ndecl: infix varop decl\n================================================================================\n\na == a = a\nA a == A a = a == a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (function\n      (infix\n        (variable)\n        (operator)\n        (variable))\n      (match\n        (variable)))\n    (function\n      (infix\n        (apply\n          (constructor)\n          (variable))\n        (operator)\n        (apply\n          (constructor)\n          (variable)))\n      (match\n        (infix\n          (variable)\n          (operator)\n          (variable))))))\n\n================================================================================\ndecl: error: varop in operand of infix varop decl\n================================================================================\n\na == a + a = a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (top_splice\n      (infix\n        (variable)\n        (operator)\n        (apply\n          (infix\n            (variable)\n            (operator)\n            (variable))\n          (ERROR)\n          (variable))))))\n\n================================================================================\ndecl: tuple pattern binder\n================================================================================\n\n(a, a) = a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (tuple\n        (variable)\n        (variable))\n      (match\n        (variable)))))\n\n================================================================================\ndecl: con application pattern binder\n================================================================================\n\nA a = a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (apply\n        (constructor)\n        (variable))\n      (match\n        (variable)))))\n\n================================================================================\ndecl: parens con application pattern binder\n================================================================================\n\n(A a) = a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  declarations: (declarations\n    (bind\n      pattern: (parens\n        pattern: (apply\n          function: (constructor)\n          argument: (variable)))\n      match: (match\n        expression: (variable)))))\n\n================================================================================\ndecl: function head with parens\n================================================================================\n\n(((((f) a)) b c) d) e f = a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (function\n      (function_head_parens\n        (function_head_parens\n          (function_head_parens\n            (function_head_parens\n              (function_head_parens\n                (variable))\n              (patterns\n                (variable))))\n          (patterns\n            (variable)\n            (variable)))\n        (patterns\n          (variable)))\n      (patterns\n        (variable)\n        (variable))\n      (match\n        (variable)))))\n\n================================================================================\ndecl: implicit parameter in where\n================================================================================\n\na = a\n  where\n    ?a = a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  declarations: (declarations\n    (bind\n      name: (variable)\n      match: (match\n        expression: (variable))\n      binds: (local_binds\n        decl: (bind\n          implicit: (implicit_variable)\n          match: (match\n            expression: (variable)))))))\n\n================================================================================\ndecl: implicit parameter in do-let\n================================================================================\n\na = do\n  let ?a = a\n  a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (do\n          (let\n            (local_binds\n              (bind\n                (implicit_variable)\n                (match\n                  (variable)))))\n          (exp\n            (variable)))))))\n\n================================================================================\ndecl: function/bind ambiguity\n================================================================================\n\na a a = a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (function\n      (variable)\n      (patterns\n        (variable)\n        (variable))\n      (match\n        (variable)))))\n\n================================================================================\ndecl: special name\n================================================================================\n\ngroup :: a\n\nusing :: a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (signature\n      (variable)\n      (variable))\n    (signature\n      (variable)\n      (variable))))\n\n================================================================================\ndecl: local fixity\n================================================================================\n\na = a where\n  a + a = a\n  infixr 7 +\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (variable))\n      (local_binds\n        (function\n          (infix\n            (variable)\n            (operator)\n            (variable))\n          (match\n            (variable)))\n        (fixity\n          (integer)\n          (operator))))))\n\n================================================================================\ndecl: regression test for ambiguity bug\n================================================================================\n\na = case a of a -> b\n\nc :: (a, d a)\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (case\n          (variable)\n          (alternatives\n            (alternative\n              (variable)\n              (match\n                (variable)))))))\n    (signature\n      (variable)\n      (tuple\n        (variable)\n        (apply\n          (variable)\n          (variable))))))\n\n================================================================================\ndecl: guards\n================================================================================\n\na a | a\n    , let a = a\n          a = a\n    , a <- a\n    = a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (function\n      (variable)\n      (patterns\n        (variable))\n      (match\n        (guards\n          (boolean\n            (variable))\n          (let\n            (local_binds\n              (bind\n                (variable)\n                (match\n                  (variable)))\n              (bind\n                (variable)\n                (match\n                  (variable)))))\n          (pattern_guard\n            (variable)\n            (variable)))\n        (variable)))))\n"
  },
  {
    "path": "test/corpus/default.txt",
    "content": "================================================================================\ndefault: default decl\n================================================================================\n\ndefault ()\ndefault (A, A :: A)\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (default_types)\n    (default_types\n      (name)\n      (signature\n        (name)\n        (name)))))\n"
  },
  {
    "path": "test/corpus/exp.txt",
    "content": "================================================================================\nexp: application\n================================================================================\n\na = a a\na = a a a\na = a A.a a a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (apply\n          (variable)\n          (variable))))\n    (bind\n      (variable)\n      (match\n        (apply\n          (apply\n            (variable)\n            (variable))\n          (variable))))\n    (bind\n      (variable)\n      (match\n        (apply\n          (apply\n            (apply\n              (variable)\n              (qualified\n                (module\n                  (module_id))\n                (variable)))\n            (variable))\n          (variable))))))\n\n================================================================================\nexp: con application\n================================================================================\n\na = A a a\na = A a A\n\n--------------------------------------------------------------------------------\n\n(haskell\n  declarations: (declarations\n    (bind\n      name: (variable)\n      match: (match\n        expression: (apply\n          function: (apply\n            function: (constructor)\n            argument: (variable))\n          argument: (variable))))\n    (bind\n      name: (variable)\n      match: (match\n        expression: (apply\n          function: (apply\n            function: (constructor)\n            argument: (variable))\n          argument: (constructor))))))\n\n================================================================================\nexp: unit\n================================================================================\n\na = ()\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (unit)))))\n\n================================================================================\nexp: comprehension\n================================================================================\n\na = [(a, a) | a <- a, a <- [a..a]]\na = [a | a, let a = a]\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (list_comprehension\n          (tuple\n            (variable)\n            (variable))\n          (qualifiers\n            (generator\n              (variable)\n              (variable))\n            (generator\n              (variable)\n              (arithmetic_sequence\n                (variable)\n                (variable)))))))\n    (bind\n      (variable)\n      (match\n        (list_comprehension\n          (variable)\n          (qualifiers\n            (boolean\n              (variable))\n            (let\n              (local_binds\n                (bind\n                  (variable)\n                  (match\n                    (variable)))))))))))\n\n================================================================================\nexp: operator section right\n================================================================================\n\na = (: a)\na = (:< a)\na = (A.:+ a)\na = (`a` a)\na = (`A.a` a)\na = (+ a + a)\na = (+ a + a + a)\na = (A.+ a A.+ a)\na = (A.+ a + a)\na = (+ a A.+ a)\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (right_section\n          (constructor_operator)\n          (variable))))\n    (bind\n      (variable)\n      (match\n        (right_section\n          (constructor_operator)\n          (variable))))\n    (bind\n      (variable)\n      (match\n        (right_section\n          (qualified\n            (module\n              (module_id))\n            (constructor_operator))\n          (variable))))\n    (bind\n      (variable)\n      (match\n        (right_section\n          (infix_id\n            (variable))\n          (variable))))\n    (bind\n      (variable)\n      (match\n        (right_section\n          (infix_id\n            (qualified\n              (module\n                (module_id))\n              (variable)))\n          (variable))))\n    (bind\n      (variable)\n      (match\n        (right_section\n          (operator)\n          (infix\n            (variable)\n            (operator)\n            (variable)))))\n    (bind\n      (variable)\n      (match\n        (right_section\n          (operator)\n          (infix\n            (variable)\n            (operator)\n            (infix\n              (variable)\n              (operator)\n              (variable))))))\n    (bind\n      (variable)\n      (match\n        (right_section\n          (qualified\n            (module\n              (module_id))\n            (operator))\n          (infix\n            (variable)\n            (qualified\n              (module\n                (module_id))\n              (operator))\n            (variable)))))\n    (bind\n      (variable)\n      (match\n        (right_section\n          (qualified\n            (module\n              (module_id))\n            (operator))\n          (infix\n            (variable)\n            (operator)\n            (variable)))))\n    (bind\n      (variable)\n      (match\n        (right_section\n          (operator)\n          (infix\n            (variable)\n            (qualified\n              (module\n                (module_id))\n              (operator))\n            (variable)))))))\n\n================================================================================\nexp: operator section left\n================================================================================\n\na = (a :)\na = (a :|)\na = (a A.:|)\na = (a $)\na = (a a $)\na = (a a A.$)\na = (a `a`)\na = (a `A.a`)\na = (a + a +)\na = (a + a + a + a +)\na = (a A.+ a +)\na = (a + a A.+)\na = (a A.A.+ a A.A.+)\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (left_section\n          (variable)\n          (constructor_operator))))\n    (bind\n      (variable)\n      (match\n        (left_section\n          (variable)\n          (constructor_operator))))\n    (bind\n      (variable)\n      (match\n        (left_section\n          (variable)\n          (qualified\n            (module\n              (module_id))\n            (constructor_operator)))))\n    (bind\n      (variable)\n      (match\n        (left_section\n          (variable)\n          (operator))))\n    (bind\n      (variable)\n      (match\n        (left_section\n          (apply\n            (variable)\n            (variable))\n          (operator))))\n    (bind\n      (variable)\n      (match\n        (left_section\n          (apply\n            (variable)\n            (variable))\n          (qualified\n            (module\n              (module_id))\n            (operator)))))\n    (bind\n      (variable)\n      (match\n        (left_section\n          (variable)\n          (infix_id\n            (variable)))))\n    (bind\n      (variable)\n      (match\n        (left_section\n          (variable)\n          (infix_id\n            (qualified\n              (module\n                (module_id))\n              (variable))))))\n    (bind\n      (variable)\n      (match\n        (left_section\n          (infix\n            (variable)\n            (operator)\n            (variable))\n          (operator))))\n    (bind\n      (variable)\n      (match\n        (left_section\n          (infix\n            (variable)\n            (operator)\n            (infix\n              (variable)\n              (operator)\n              (infix\n                (variable)\n                (operator)\n                (variable))))\n          (operator))))\n    (bind\n      (variable)\n      (match\n        (left_section\n          (infix\n            (variable)\n            (qualified\n              (module\n                (module_id))\n              (operator))\n            (variable))\n          (operator))))\n    (bind\n      (variable)\n      (match\n        (left_section\n          (infix\n            (variable)\n            (operator)\n            (variable))\n          (qualified\n            (module\n              (module_id))\n            (operator)))))\n    (bind\n      (variable)\n      (match\n        (left_section\n          (infix\n            (variable)\n            (qualified\n              (module\n                (module_id)\n                (module_id))\n              (operator))\n            (variable))\n          (qualified\n            (module\n              (module_id)\n              (module_id))\n            (operator)))))))\n\n================================================================================\nexp: left section with infix id\n================================================================================\n\na = (a ` a ` )\n\na = (a `A ` )\n\na = (a ` A.A`)\n\na = (a `  \n    a  \n    `   )\n\na = (a `  \n    Aaaa.Aaaa.A.a  \n    `   )\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (left_section\n          (variable)\n          (infix_id\n            (variable)))))\n    (bind\n      (variable)\n      (match\n        (left_section\n          (variable)\n          (infix_id\n            (constructor)))))\n    (bind\n      (variable)\n      (match\n        (left_section\n          (variable)\n          (infix_id\n            (qualified\n              (module\n                (module_id))\n              (constructor))))))\n    (bind\n      (variable)\n      (match\n        (left_section\n          (variable)\n          (infix_id\n            (variable)))))\n    (bind\n      (variable)\n      (match\n        (left_section\n          (variable)\n          (infix_id\n            (qualified\n              (module\n                (module_id)\n                (module_id)\n                (module_id))\n              (variable))))))))\n\n================================================================================\nexp: left section operator after newline\n================================================================================\n\na = (a\n  #)\n\na = (a\n  -)\n\na = (a\n  A.A.++)\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (left_section\n          (variable)\n          (operator))))\n    (bind\n      (variable)\n      (match\n        (left_section\n          (variable)\n          (operator))))\n    (bind\n      (variable)\n      (match\n        (left_section\n          (variable)\n          (qualified\n            (module\n              (module_id)\n              (module_id))\n            (operator)))))))\n\n================================================================================\nexp: infix operator\n================================================================================\n\na = A <$>\n  a .: \"a\" <*>\n  a\na = do\n  a <- a =<< a\n  a <- a >>= a\na = (a + a)\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (infix\n          (constructor)\n          (operator)\n          (infix\n            (variable)\n            (operator)\n            (infix\n              (literal\n                (string))\n              (operator)\n              (variable))))))\n    (bind\n      (variable)\n      (match\n        (do\n          (bind\n            (variable)\n            (infix\n              (variable)\n              (operator)\n              (variable)))\n          (bind\n            (variable)\n            (infix\n              (variable)\n              (operator)\n              (variable))))))\n    (bind\n      (variable)\n      (match\n        (parens\n          (infix\n            (variable)\n            (operator)\n            (variable)))))))\n\n================================================================================\nexp: infix assoc\n================================================================================\n\na = a + a + a\na = a . a $ a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (infix\n          (variable)\n          (operator)\n          (infix\n            (variable)\n            (operator)\n            (variable)))))\n    (bind\n      (variable)\n      (match\n        (infix\n          (variable)\n          (operator)\n          (infix\n            (variable)\n            (operator)\n            (variable)))))))\n\n================================================================================\nexp: infix con/var\n================================================================================\n\na = a `a` a\na = a `A.a` a\na = a `A` a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (infix\n          (variable)\n          (infix_id\n            (variable))\n          (variable))))\n    (bind\n      (variable)\n      (match\n        (infix\n          (variable)\n          (infix_id\n            (qualified\n              (module\n                (module_id))\n              (variable)))\n          (variable))))\n    (bind\n      (variable)\n      (match\n        (infix\n          (variable)\n          (infix_id\n            (constructor))\n          (variable))))))\n\n================================================================================\nexp: error: infix TH-quoted consym\n================================================================================\n\na = a ':++ a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (apply\n          (variable)\n          (th_quoted_name\n            (ERROR\n              (UNEXPECTED '+'))\n            (variable)))))))\n\n================================================================================\nexp: lambda simple\n================================================================================\n\na = \\ a -> a\na = \\ (A a) -> a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (lambda\n          (patterns\n            (variable))\n          (variable))))\n    (bind\n      (variable)\n      (match\n        (lambda\n          (patterns\n            (parens\n              (apply\n                (constructor)\n                (variable))))\n          (variable))))))\n\n================================================================================\nexp: double lambda\n================================================================================\n\na = \\ a -> a >>= \\ a -> a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (lambda\n          (patterns\n            (variable))\n          (infix\n            (variable)\n            (operator)\n            (lambda\n              (patterns\n                (variable))\n              (variable))))))))\n\n================================================================================\nexp: lambda and infix\n================================================================================\n\na = \\ a -> a : a : a\na = \\ a a a -> a <$> a <*> a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (lambda\n          (patterns\n            (variable))\n          (infix\n            (variable)\n            (constructor_operator)\n            (infix\n              (variable)\n              (constructor_operator)\n              (variable))))))\n    (bind\n      (variable)\n      (match\n        (lambda\n          (patterns\n            (variable)\n            (variable)\n            (variable))\n          (infix\n            (variable)\n            (operator)\n            (infix\n              (variable)\n              (operator)\n              (variable))))))))\n\n================================================================================\nexp: parenthesized infix\n================================================================================\n\na = (a <$> a)\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (parens\n          (infix\n            (variable)\n            (operator)\n            (variable)))))))\n\n================================================================================\nexp: apply in operand of qualified varop\n================================================================================\n\na = a a A.+++ a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (infix\n          (apply\n            (variable)\n            (variable))\n          (qualified\n            (module\n              (module_id))\n            (operator))\n          (variable))))))\n\n================================================================================\nexp: tuple section\n================================================================================\n\na = (a,)\na = (a,,)\na = (,a,)\na = (,,a)\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (tuple\n          (variable))))\n    (bind\n      (variable)\n      (match\n        (tuple\n          (variable))))\n    (bind\n      (variable)\n      (match\n        (tuple\n          (variable))))\n    (bind\n      (variable)\n      (match\n        (tuple\n          (variable))))))\n\n================================================================================\nexp: conditional\n================================================================================\n\na = if a then a else a\na = if (if a then a else a) then a else a\na = if if a then a else a then a else a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  declarations: (declarations\n    (bind\n      name: (variable)\n      match: (match\n        expression: (conditional\n          if: (variable)\n          then: (variable)\n          else: (variable))))\n    (bind\n      name: (variable)\n      match: (match\n        expression: (conditional\n          if: (parens\n            expression: (conditional\n              if: (variable)\n              then: (variable)\n              else: (variable)))\n          then: (variable)\n          else: (variable))))\n    (bind\n      name: (variable)\n      match: (match\n        expression: (conditional\n          if: (conditional\n            if: (variable)\n            then: (variable)\n            else: (variable))\n          then: (variable)\n          else: (variable))))))\n\n================================================================================\nexp: implicit\n================================================================================\n\na = aa (a ?cmp)\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (apply\n          (variable)\n          (parens\n            (apply\n              (variable)\n              (implicit_variable))))))))\n\n================================================================================\nexp: let basic\n================================================================================\n\na = let a = a\n        a = a\n      in a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (let_in\n          (local_binds\n            (bind\n              (variable)\n              (match\n                (variable)))\n            (bind\n              (variable)\n              (match\n                (variable))))\n          (variable))))))\n\n================================================================================\nexp: lambda case simple\n================================================================================\n\na = \\case\n  A a -> a\n\na = a >>= \\case\n  A (A _ a) -> do\n    a <- a\n    a\n  _ -> a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (lambda_case\n          (alternatives\n            (alternative\n              (apply\n                (constructor)\n                (variable))\n              (match\n                (variable)))))))\n    (bind\n      (variable)\n      (match\n        (infix\n          (variable)\n          (operator)\n          (lambda_case\n            (alternatives\n              (alternative\n                (apply\n                  (constructor)\n                  (parens\n                    (apply\n                      (apply\n                        (constructor)\n                        (wildcard))\n                      (variable))))\n                (match\n                  (do\n                    (bind\n                      (variable)\n                      (variable))\n                    (exp\n                      (variable)))))\n              (alternative\n                (wildcard)\n                (match\n                  (variable))))))))))\n\n================================================================================\nexp: lambda case and infix\n================================================================================\n\na = \\case a -> a : a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (lambda_case\n          (alternatives\n            (alternative\n              (variable)\n              (match\n                (infix\n                  (variable)\n                  (constructor_operator)\n                  (variable))))))))))\n\n================================================================================\nexp: n-ary cases\n================================================================================\n\na = \\cases\n  A a a -> a\n  a@(A a) a -> a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  declarations: (declarations\n    (bind\n      name: (variable)\n      match: (match\n        expression: (lambda_cases\n          alternatives: (alternatives\n            alternative: (alternative\n              patterns: (patterns\n                (constructor)\n                (variable)\n                (variable))\n              match: (match\n                expression: (variable)))\n            alternative: (alternative\n              patterns: (patterns\n                (as\n                  bind: (variable)\n                  pattern: (parens\n                    pattern: (apply\n                      function: (constructor)\n                      argument: (variable))))\n                (variable))\n              match: (match\n                expression: (variable)))))))))\n\n================================================================================\nexp: do and let\n================================================================================\n\na a = do\n  let z = a\n  a <- a\n  let z = a\n  a <- a\n  pure a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  declarations: (declarations\n    (function\n      name: (variable)\n      patterns: (patterns\n        (variable))\n      match: (match\n        expression: (do\n          statement: (let\n            binds: (local_binds\n              decl: (bind\n                name: (variable)\n                match: (match\n                  expression: (variable)))))\n          statement: (bind\n            pattern: (variable)\n            expression: (variable))\n          statement: (let\n            binds: (local_binds\n              decl: (bind\n                name: (variable)\n                match: (match\n                  expression: (variable)))))\n          statement: (bind\n            pattern: (variable)\n            expression: (variable))\n          statement: (exp\n            (apply\n              function: (variable)\n              argument: (variable))))))))\n\n================================================================================\nexp: do statement with pattern lhs\n================================================================================\n\na = do\n  ((), a) <- a\n  a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (do\n          (bind\n            (tuple\n              (unit)\n              (variable))\n            (variable))\n          (exp\n            (variable)))))))\n\n================================================================================\nexp: qualified do\n================================================================================\n\na = A.A.do\n  a\n\na = A.A.mdo\n  a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (do\n          (do_module\n            (module\n              (module_id)\n              (module_id)))\n          (exp\n            (variable)))))\n    (bind\n      (variable)\n      (match\n        (do\n          (do_module\n            (module\n              (module_id)\n              (module_id)))\n          (exp\n            (variable)))))))\n\n================================================================================\nexp: i at eol (scanner tests for `in`)\n================================================================================\n\na = a i\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (apply\n          (variable)\n          (variable))))))\n\n================================================================================\nexp: record construction with wildcard\n================================================================================\n\na = A {.. }\na = A { ..}\na = A {..}\na = A { .. }\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (record\n          (constructor)\n          (field_update\n            (wildcard)))))\n    (bind\n      (variable)\n      (match\n        (record\n          (constructor)\n          (field_update\n            (wildcard)))))\n    (bind\n      (variable)\n      (match\n        (record\n          (constructor)\n          (field_update\n            (wildcard)))))\n    (bind\n      (variable)\n      (match\n        (record\n          (constructor)\n          (field_update\n            (wildcard)))))))\n\n================================================================================\nexp: record update\n================================================================================\n\na = a { a = a, a = a ++ a }\na = A { a = a } {a = a}\na = a a {a = a}\na = a a a {a = a}\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (record\n          (variable)\n          (field_update\n            (field_name\n              (variable))\n            (variable))\n          (field_update\n            (field_name\n              (variable))\n            (infix\n              (variable)\n              (operator)\n              (variable))))))\n    (bind\n      (variable)\n      (match\n        (record\n          (record\n            (constructor)\n            (field_update\n              (field_name\n                (variable))\n              (variable)))\n          (field_update\n            (field_name\n              (variable))\n            (variable)))))\n    (bind\n      (variable)\n      (match\n        (apply\n          (variable)\n          (record\n            (variable)\n            (field_update\n              (field_name\n                (variable))\n              (variable))))))\n    (bind\n      (variable)\n      (match\n        (apply\n          (apply\n            (variable)\n            (variable))\n          (record\n            (variable)\n            (field_update\n              (field_name\n                (variable))\n              (variable))))))))\n\n================================================================================\nexp: record field pun\n================================================================================\n\na = A { A.a }\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (record\n          (constructor)\n          (field_update\n            (qualified\n              (module\n                (module_id))\n              (field_name\n                (variable)))))))))\n\n================================================================================\nexp: record zero indent update\n================================================================================\n\na = do\n      a {\na = a\n, a = a\n} a\n\na = a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (do\n          (exp\n            (apply\n              (record\n                (variable)\n                (field_update\n                  (field_name\n                    (variable))\n                  (variable))\n                (field_update\n                  (field_name\n                    (variable))\n                  (variable)))\n              (variable))))))\n    (bind\n      (variable)\n      (match\n        (variable)))))\n\n================================================================================\nexp: record and minus\n================================================================================\n\na = a {a} - a a\na = a a {a} - a a\na = a a a {a} - a a\na = - a {a}\na = - a a {a}\na = - a a a {a}\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (infix\n          (record\n            (variable)\n            (field_update\n              (field_name\n                (variable))))\n          (operator)\n          (apply\n            (variable)\n            (variable)))))\n    (bind\n      (variable)\n      (match\n        (infix\n          (apply\n            (variable)\n            (record\n              (variable)\n              (field_update\n                (field_name\n                  (variable)))))\n          (operator)\n          (apply\n            (variable)\n            (variable)))))\n    (bind\n      (variable)\n      (match\n        (infix\n          (apply\n            (apply\n              (variable)\n              (variable))\n            (record\n              (variable)\n              (field_update\n                (field_name\n                  (variable)))))\n          (operator)\n          (apply\n            (variable)\n            (variable)))))\n    (bind\n      (variable)\n      (match\n        (negation\n          (record\n            (variable)\n            (field_update\n              (field_name\n                (variable)))))))\n    (bind\n      (variable)\n      (match\n        (negation\n          (apply\n            (variable)\n            (record\n              (variable)\n              (field_update\n                (field_name\n                  (variable))))))))\n    (bind\n      (variable)\n      (match\n        (negation\n          (apply\n            (apply\n              (variable)\n              (variable))\n            (record\n              (variable)\n              (field_update\n                (field_name\n                  (variable))))))))))\n\n================================================================================\nexp: type application\n================================================================================\n\na = a @A\na = a @a a\na = a @A.A a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (apply\n          (variable)\n          (type_application\n            (name)))))\n    (bind\n      (variable)\n      (match\n        (apply\n          (apply\n            (variable)\n            (type_application\n              (variable)))\n          (variable))))\n    (bind\n      (variable)\n      (match\n        (apply\n          (apply\n            (variable)\n            (type_application\n              (qualified\n                (module\n                  (module_id))\n                (name))))\n          (variable))))))\n\n================================================================================\nexp: repeated type application\n================================================================================\n\na = a @A @A @A @A\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (apply\n          (apply\n            (apply\n              (apply\n                (variable)\n                (type_application\n                  (name)))\n              (type_application\n                (name)))\n            (type_application\n              (name)))\n          (type_application\n            (name)))))))\n\n================================================================================\nexp: type application with promoted literal\n================================================================================\n\na = a @'[]\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (apply\n          (variable)\n          (type_application\n            (promoted\n              (empty_list))))))))\n\n================================================================================\nexp: block argument: lambda basic\n================================================================================\n\na = a \\ a -> a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (apply\n          (variable)\n          (lambda\n            (patterns\n              (variable))\n            (variable)))))))\n\n================================================================================\nexp: block argument: lambda case\n================================================================================\n\na = a \\case a -> a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (apply\n          (variable)\n          (lambda_case\n            (alternatives\n              (alternative\n                (variable)\n                (match\n                  (variable))))))))))\n\n================================================================================\nexp: block argument: do\n================================================================================\n\na = a do a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (apply\n          (variable)\n          (do\n            (exp\n              (variable))))))))\n\n================================================================================\nexp: block argument: let\n================================================================================\n\na = a let a = a in a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (apply\n          (variable)\n          (let_in\n            (local_binds\n              (bind\n                (variable)\n                (match\n                  (variable))))\n            (variable)))))))\n\n================================================================================\nexp: block argument: case\n================================================================================\n\na = a case a of a -> a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (apply\n          (variable)\n          (case\n            (variable)\n            (alternatives\n              (alternative\n                (variable)\n                (match\n                  (variable))))))))))\n\n================================================================================\nexp: greedy block argument: let\n================================================================================\n\na =\n  let a a = a in a\n  do a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (let_in\n          (local_binds\n            (function\n              (variable)\n              (patterns\n                (variable))\n              (match\n                (variable))))\n          (apply\n            (variable)\n            (do\n              (exp\n                (variable)))))))))\n\n================================================================================\nexp: greedy block argument: lambda\n================================================================================\n\na =\n  a\n  \\ a -> a\n  do a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (apply\n          (variable)\n          (lambda\n            (patterns\n              (variable))\n            (apply\n              (variable)\n              (do\n                (exp\n                  (variable))))))))))\n\n================================================================================\nexp: greedy block argument: cond\n================================================================================\n\na =\n  a\n  if a then a else a\n  do a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (apply\n          (variable)\n          (conditional\n            (variable)\n            (variable)\n            (apply\n              (variable)\n              (do\n                (exp\n                  (variable))))))))))\n\n================================================================================\nexp: empty lambda case\n================================================================================\n\na = \\case\n\na = a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (lambda_case)))\n    (bind\n      (variable)\n      (match\n        (variable)))))\n\n================================================================================\nexp: empty case\n================================================================================\n\na =\n  case a of\n\na = (case a of)\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (case\n          (variable))))\n    (bind\n      (variable)\n      (match\n        (parens\n          (case\n            (variable)\n            (alternatives)))))))\n\n================================================================================\nexp: multi-way if\n================================================================================\n\na = if | a -> a\n       | a -> a\na = if\n | a -> a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (multi_way_if\n          (match\n            (guards\n              (boolean\n                (variable)))\n            (variable))\n          (match\n            (guards\n              (boolean\n                (variable)))\n            (variable)))))\n    (bind\n      (variable)\n      (match\n        (multi_way_if\n          (match\n            (guards\n              (boolean\n                (variable)))\n            (variable)))))))\n\n================================================================================\nexp: multi-way if with two matches in a guard rhs\n================================================================================\n\na | a = if | a -> a\n           | a -> a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (guards\n          (boolean\n            (variable)))\n        (multi_way_if\n          (match\n            (guards\n              (boolean\n                (variable)))\n            (variable))\n          (match\n            (guards\n              (boolean\n                (variable)))\n            (variable)))))))\n\n================================================================================\nexp: list with multi-way if\n================================================================================\n\na = [if | a, a <- a -> a | a -> a]\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (list\n          (multi_way_if\n            (match\n              (guards\n                (boolean\n                  (variable))\n                (pattern_guard\n                  (variable)\n                  (variable)))\n              (variable))\n            (match\n              (guards\n                (boolean\n                  (variable)))\n              (variable))))))))\n\n================================================================================\nexp: let with sig on rhs\n================================================================================\n\na = let a = a in a :: A\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (let_in\n          (local_binds\n            (bind\n              (variable)\n              (match\n                (variable))))\n          (signature\n            (variable)\n            (name)))))))\n\n================================================================================\nexp: list con\n================================================================================\n\na = []\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (list)))))\n\n================================================================================\nexp: tuple con\n================================================================================\n\na = (,,,)\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (prefix_tuple)))))\n\n================================================================================\nexp: qualified symop\n================================================================================\n\na = a A.!? a\na = (A..!?)\na = a A.. a\na = a a a A.!? a\na = a A.!? a a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (infix\n          (variable)\n          (qualified\n            (module\n              (module_id))\n            (operator))\n          (variable))))\n    (bind\n      (variable)\n      (match\n        (prefix_id\n          (qualified\n            (module\n              (module_id))\n            (operator)))))\n    (bind\n      (variable)\n      (match\n        (infix\n          (variable)\n          (qualified\n            (module\n              (module_id))\n            (operator))\n          (variable))))\n    (bind\n      (variable)\n      (match\n        (infix\n          (apply\n            (apply\n              (variable)\n              (variable))\n            (variable))\n          (qualified\n            (module\n              (module_id))\n            (operator))\n          (variable))))\n    (bind\n      (variable)\n      (match\n        (infix\n          (variable)\n          (qualified\n            (module\n              (module_id))\n            (operator))\n          (apply\n            (variable)\n            (variable)))))))\n\n================================================================================\nexp: th-promoted qualified symop\n================================================================================\n\na = '(A..&)\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (th_quoted_name\n          (prefix_id\n            (qualified\n              (module\n                (module_id))\n              (operator))))))))\n\n================================================================================\nexp: negation in tuple\n================================================================================\n\na = (-a, a)\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (tuple\n          (negation\n            (variable))\n          (variable))))))\n\n================================================================================\nexp: negation in section\n================================================================================\n\na = (-a :)\na = (- a a :)\na = (+ -a)\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (left_section\n          (negation\n            (variable))\n          (constructor_operator))))\n    (bind\n      (variable)\n      (match\n        (left_section\n          (negation\n            (apply\n              (variable)\n              (variable)))\n          (constructor_operator))))\n    (bind\n      (variable)\n      (match\n        (right_section\n          (operator)\n          (negation\n            (variable)))))))\n\n================================================================================\nexp: unboxed tuple\n================================================================================\n\na :: (Int#, Int#)\na :: (# Int, Int #)\na = (# a, a #)\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (signature\n      (variable)\n      (tuple\n        (name)\n        (name)))\n    (signature\n      (variable)\n      (unboxed_tuple\n        (name)\n        (name)))\n    (bind\n      (variable)\n      (match\n        (unboxed_tuple\n          (variable)\n          (variable))))))\n\n================================================================================\nexp: unboxed unit\n================================================================================\n\na = (# #)\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (unboxed_unit)))))\n\n================================================================================\nexp: unboxed solo\n================================================================================\n\na = (# A a + a #)\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (unboxed_tuple\n          (infix\n            (apply\n              (constructor)\n              (variable))\n            (operator)\n            (variable)))))))\n\n================================================================================\nexp: section of unboxed tuple\n================================================================================\n\na = (# ,,a, #)\na = (# a,, #)\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (unboxed_tuple\n          (variable))))\n    (bind\n      (variable)\n      (match\n        (unboxed_tuple\n          (variable))))))\n\n================================================================================\nexp: unboxed sum\n================================================================================\n\na :: (# A | (# A, A #) | A #)\na = (# a | | #)\na = (#| a #)\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (signature\n      (variable)\n      (unboxed_sum\n        (name)\n        (unboxed_tuple\n          (name)\n          (name))\n        (name)))\n    (bind\n      (variable)\n      (match\n        (unboxed_sum\n          (variable))))\n    (bind\n      (variable)\n      (match\n        (unboxed_sum\n          (variable))))))\n\n================================================================================\nexp: error: unboxed sum with missing space between bar and closing bracket\n================================================================================\n\na = (# a |#)\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (ERROR\n    (variable)\n    (variable)\n    (operator)))\n\n================================================================================\nexp: label\n================================================================================\n\na = a #a a\na = (a)#a\na = #øøø\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (apply\n          (apply\n            (variable)\n            (label))\n          (variable))))\n    (bind\n      (variable)\n      (match\n        (apply\n          (parens\n            (variable))\n          (label))))\n    (bind\n      (variable)\n      (match\n        (label)))))\n\n================================================================================\nexp: TransformListComp\n================================================================================\n\na = [\n  a |\n  then group by a :: A using a,\n  then group by a using a,\n  then group using a a,\n  then a a by a a,\n  then a :: A by a,\n  then a a\n  ]\n\na = [a | using <- a]\n\na = [group using a, group by a using a, by, a by, a by a, by a, using, a using, a using a, using a]\n\n--------------------------------------------------------------------------------\n\n(haskell\n  declarations: (declarations\n    (bind\n      name: (variable)\n      match: (match\n        expression: (list_comprehension\n          expression: (variable)\n          qualifiers: (qualifiers\n            qualifier: (group\n              key: (signature\n                expression: (variable)\n                type: (name))\n              classifier: (variable))\n            qualifier: (group\n              key: (variable)\n              classifier: (variable))\n            qualifier: (group\n              classifier: (apply\n                function: (variable)\n                argument: (variable)))\n            qualifier: (transform\n              transformation: (apply\n                function: (variable)\n                argument: (variable))\n              key: (apply\n                function: (variable)\n                argument: (variable)))\n            qualifier: (transform\n              transformation: (signature\n                expression: (variable)\n                type: (name))\n              key: (variable))\n            qualifier: (transform\n              transformation: (apply\n                function: (variable)\n                argument: (variable)))))))\n    (bind\n      name: (variable)\n      match: (match\n        expression: (list_comprehension\n          expression: (variable)\n          qualifiers: (qualifiers\n            qualifier: (generator\n              pattern: (variable)\n              expression: (variable))))))\n    (bind\n      name: (variable)\n      match: (match\n        expression: (list\n          element: (apply\n            function: (apply\n              function: (variable)\n              argument: (variable))\n            argument: (variable))\n          element: (apply\n            function: (apply\n              function: (apply\n                function: (apply\n                  function: (variable)\n                  argument: (variable))\n                argument: (variable))\n              argument: (variable))\n            argument: (variable))\n          element: (variable)\n          element: (apply\n            function: (variable)\n            argument: (variable))\n          element: (apply\n            function: (apply\n              function: (variable)\n              argument: (variable))\n            argument: (variable))\n          element: (apply\n            function: (variable)\n            argument: (variable))\n          element: (variable)\n          element: (apply\n            function: (variable)\n            argument: (variable))\n          element: (apply\n            function: (apply\n              function: (variable)\n              argument: (variable))\n            argument: (variable))\n          element: (apply\n            function: (variable)\n            argument: (variable)))))))\n\n================================================================================\nexp: brace layout after lambda case\n================================================================================\n\na = \\case { a -> a }\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (lambda_case\n          (alternatives\n            (alternative\n              (variable)\n              (match\n                (variable)))))))))\n\n================================================================================\nexp: unicode do bind arrow\n================================================================================\n\na = do\n  a ← a\n  a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (do\n          (bind\n            (variable)\n            (variable))\n          (exp\n            (variable)))))))\n\n================================================================================\nexp: field projection with OverloadedRecordDot\n================================================================================\n\na = a.a\na = (a + a).a\na = a.a.a.a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (projection\n          (variable)\n          (field_name\n            (variable)))))\n    (bind\n      (variable)\n      (match\n        (projection\n          (parens\n            (infix\n              (variable)\n              (operator)\n              (variable)))\n          (field_name\n            (variable)))))\n    (bind\n      (variable)\n      (match\n        (projection\n          (projection\n            (projection\n              (variable)\n              (field_name\n                (variable)))\n            (field_name\n              (variable)))\n          (field_name\n            (variable)))))))\n\n================================================================================\nexp: projection in infix\n================================================================================\n\na = a ++ a.a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (infix\n          (variable)\n          (operator)\n          (projection\n            (variable)\n            (field_name\n              (variable))))))))\n\n================================================================================\nexp: projection with special name\n================================================================================\n\na = a.group a.using\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (apply\n          (projection\n            (variable)\n            (field_name\n              (variable)))\n          (projection\n            (variable)\n            (field_name\n              (variable))))))))\n\n================================================================================\nexp: field selector from projection\n================================================================================\n\na = (.a) a\na = (.a).a.a\na = ( .a)\na = (\n  .a)\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (apply\n          (projection_selector\n            (variable))\n          (variable))))\n    (bind\n      (variable)\n      (match\n        (projection\n          (projection\n            (projection_selector\n              (variable))\n            (field_name\n              (variable)))\n          (field_name\n            (variable)))))\n    (bind\n      (variable)\n      (match\n        (projection_selector\n          (variable))))\n    (bind\n      (variable)\n      (match\n        (projection_selector\n          (variable))))))\n\n================================================================================\nexp: OverloadedRecordUpdate\n================================================================================\n\na = a {a.a.a = a}\n\n--------------------------------------------------------------------------------\n\n(haskell\n  declarations: (declarations\n    (bind\n      name: (variable)\n      match: (match\n        expression: (record\n          expression: (variable)\n          field: (field_update\n            field: (field_path\n              field: (field_name\n                (variable))\n              subfield: (field_name\n                (variable))\n              subfield: (field_name\n                (variable)))\n            expression: (variable)))))))\n\n================================================================================\nexp: lambda with $ in list\n================================================================================\n\na = [a $ \\a -> a]\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (list\n          (infix\n            (variable)\n            (operator)\n            (lambda\n              (patterns\n                (variable))\n              (variable))))))))\n\n================================================================================\nexp: annotation on list element\n================================================================================\n\na = [a :: A, a :: A]\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (list\n          (signature\n            (variable)\n            (name))\n          (signature\n            (variable)\n            (name)))))))\n\n================================================================================\nexp: greedy block arg in arithmetic sequence\n================================================================================\n\na = [a \\ a -> a .. a :: A]\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (arithmetic_sequence\n          (apply\n            (variable)\n            (lambda\n              (patterns\n                (variable))\n              (variable)))\n          (signature\n            (variable)\n            (name)))))))\n\n================================================================================\nexp: annotation on tuple element\n================================================================================\n\na = (a :: A, a :: A)\na = (# a :: A, a :: A #)\na = (# | | a :: A | #)\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (tuple\n          (signature\n            (variable)\n            (name))\n          (signature\n            (variable)\n            (name)))))\n    (bind\n      (variable)\n      (match\n        (unboxed_tuple\n          (signature\n            (variable)\n            (name))\n          (signature\n            (variable)\n            (name)))))\n    (bind\n      (variable)\n      (match\n        (unboxed_sum\n          (signature\n            (variable)\n            (name)))))))\n\n================================================================================\nexp: lenient trailing comma in list\n================================================================================\n\na =\n  [\n    a,\n    A,\n  ]\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (list\n          (variable)\n          (constructor))))))\n\n================================================================================\nexp: dollar infix with applications in operands\n================================================================================\n\na = a a $ a a a\na = a a $$ a a a\na = a a $$$ a\na = a a a $$$$ a a a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (infix\n          (apply\n            (variable)\n            (variable))\n          (operator)\n          (apply\n            (apply\n              (variable)\n              (variable))\n            (variable)))))\n    (bind\n      (variable)\n      (match\n        (infix\n          (apply\n            (variable)\n            (variable))\n          (operator)\n          (apply\n            (apply\n              (variable)\n              (variable))\n            (variable)))))\n    (bind\n      (variable)\n      (match\n        (infix\n          (apply\n            (variable)\n            (variable))\n          (operator)\n          (variable))))\n    (bind\n      (variable)\n      (match\n        (infix\n          (apply\n            (apply\n              (variable)\n              (variable))\n            (variable))\n          (operator)\n          (apply\n            (apply\n              (variable)\n              (variable))\n            (variable)))))))\n\n================================================================================\nexp: pattern guard annotation\n================================================================================\n\na | a <- a :: a = a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (guards\n          (pattern_guard\n            (variable)\n            (signature\n              (variable)\n              (variable))))\n        (variable)))))\n\n================================================================================\nexp: ParallelListComp\n================================================================================\n\na = [a | a <- a | a <- a, let a = a | a <- a]\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (list_comprehension\n          (variable)\n          (qualifiers\n            (generator\n              (variable)\n              (variable)))\n          (qualifiers\n            (generator\n              (variable)\n              (variable))\n            (let\n              (local_binds\n                (bind\n                  (variable)\n                  (match\n                    (variable))))))\n          (qualifiers\n            (generator\n              (variable)\n              (variable))))))))\n\n================================================================================\nexp: case with multiple alternatives and matches\n================================================================================\n\na = case a of\n  a | a, a <- a, let a = a -> a\n    | a -> a\n  a | let a = a, a <- a, a -> a\n    | a -> a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (case\n          (variable)\n          (alternatives\n            (alternative\n              (variable)\n              (match\n                (guards\n                  (boolean\n                    (variable))\n                  (pattern_guard\n                    (variable)\n                    (variable))\n                  (let\n                    (local_binds\n                      (bind\n                        (variable)\n                        (match\n                          (variable))))))\n                (variable))\n              (match\n                (guards\n                  (boolean\n                    (variable)))\n                (variable)))\n            (alternative\n              (variable)\n              (match\n                (guards\n                  (let\n                    (local_binds\n                      (bind\n                        (variable)\n                        (match\n                          (variable)))))\n                  (pattern_guard\n                    (variable)\n                    (variable))\n                  (boolean\n                    (variable)))\n                (variable))\n              (match\n                (guards\n                  (boolean\n                    (variable)))\n                (variable)))))))))\n\n================================================================================\nexp: identifier named then#\n================================================================================\n\n-- If the hash is not included in the predicate for non-id characters, the\n-- scanner would close the do layout before the `then#`, mistaking it for a\n-- `then`.\na = if do a then# then a else a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (comment)\n  (declarations\n    (bind\n      (variable)\n      (match\n        (conditional\n          (do\n            (exp\n              (apply\n                (variable)\n                (variable))))\n          (variable)\n          (variable))))))\n\n================================================================================\nexp: explicit namespace for required type arguments\n================================================================================\n\na = a (type a) (type A) (type (A a)) (A a) (type [∀ a . A a => A])\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (apply\n          (apply\n            (apply\n              (apply\n                (apply\n                  (variable)\n                  (explicit_type\n                    (variable)))\n                (explicit_type\n                  (name)))\n              (explicit_type\n                (parens\n                  (apply\n                    (name)\n                    (variable)))))\n            (parens\n              (apply\n                (constructor)\n                (variable))))\n          (explicit_type\n            (list\n              (forall\n                (quantified_variables\n                  (variable))\n                (context\n                  (apply\n                    (name)\n                    (variable))\n                  (name))))))))))\n\n================================================================================\nexp: inline case with constructor after of\n================================================================================\n\na = case a of A a -> a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (case\n          (variable)\n          (alternatives\n            (alternative\n              (apply\n                (constructor)\n                (variable))\n              (match\n                (variable)))))))))\n\n================================================================================\nexp: qualified constructor in apply argument\n================================================================================\n\na = a A.A\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (apply\n          (variable)\n          (qualified\n            (module\n              (module_id))\n            (constructor)))))))\n\n================================================================================\nexp: type application before infix operator\n================================================================================\n\na = a @a + a\na = a @a a + a\na = a @a `a` a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (infix\n          (apply\n            (variable)\n            (type_application\n              (variable)))\n          (operator)\n          (variable))))\n    (bind\n      (variable)\n      (match\n        (infix\n          (apply\n            (apply\n              (variable)\n              (type_application\n                (variable)))\n            (variable))\n          (operator)\n          (variable))))\n    (bind\n      (variable)\n      (match\n        (infix\n          (apply\n            (variable)\n            (type_application\n              (variable)))\n          (infix_id\n            (variable))\n          (variable))))))\n\n================================================================================\nexp: th-quoted type before infix operator\n================================================================================\n\na = a ''A + a\na = a ''A `a` a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (infix\n          (apply\n            (variable)\n            (th_quoted_name\n              (name)))\n          (operator)\n          (variable))))\n    (bind\n      (variable)\n      (match\n        (infix\n          (apply\n            (variable)\n            (th_quoted_name\n              (name)))\n          (infix_id\n            (variable))\n          (variable))))))\n\n================================================================================\nexp: lambda after varid with prime followed by n with prime\n================================================================================\n\na = a'\\n' -> a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (apply\n          (variable)\n          (lambda\n            (patterns\n              (variable))\n            (variable)))))))\n"
  },
  {
    "path": "test/corpus/family.txt",
    "content": "================================================================================\nfamily: closed, nullary\n================================================================================\n\ntype family A where\n  A = A\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (type_family\n      (name)\n      (equations\n        (equation\n          (name)\n          (name))))))\n\n================================================================================\nfamily: closed, tyvars\n================================================================================\n\ntype family A a b c where\n  A a 'A c = b c\n\n--------------------------------------------------------------------------------\n\n(haskell\n  declarations: (declarations\n    (type_family\n      name: (name)\n      patterns: (type_params\n        bind: (variable)\n        bind: (variable)\n        bind: (variable))\n      closed_family: (equations\n        equation: (equation\n          name: (name)\n          patterns: (type_patterns\n            (variable)\n            (promoted\n              (constructor))\n            (variable))\n          (apply\n            constructor: (variable)\n            argument: (variable)))))))\n\n================================================================================\nfamily: closed, pattern matching\n================================================================================\n\ntype family A a b c where\n  A (Maybe a) [c] = a (Maybe c)\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (type_family\n      (name)\n      (type_params\n        (variable)\n        (variable)\n        (variable))\n      (equations\n        (equation\n          (name)\n          (type_patterns\n            (parens\n              (apply\n                (name)\n                (variable)))\n            (list\n              (variable)))\n          (apply\n            (variable)\n            (parens\n              (apply\n                (name)\n                (variable)))))))))\n\n================================================================================\nfamily: closed, signature\n================================================================================\n\ntype family A a :: (k -> *) -> 'Just k where\n  A a = a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  declarations: (declarations\n    (type_family\n      name: (name)\n      patterns: (type_params\n        bind: (variable))\n      kind: (function\n        parameter: (parens\n          type: (function\n            parameter: (variable)\n            result: (star)))\n        result: (apply\n          constructor: (promoted\n            (constructor))\n          argument: (variable)))\n      closed_family: (equations\n        equation: (equation\n          name: (name)\n          patterns: (type_patterns\n            (variable))\n          (variable))))))\n\n================================================================================\nfamily: closed, variable kind\n================================================================================\n\ntype family A (a :: ([k] -> *) -> k) where\n  A a = a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (type_family\n      (name)\n      (type_params\n        (parens\n          (annotated\n            (variable)\n            (function\n              (parens\n                (function\n                  (list\n                    (variable))\n                  (star)))\n              (variable)))))\n      (equations\n        (equation\n          (name)\n          (type_patterns\n            (variable))\n          (variable))))))\n\n================================================================================\nfamily: closed, multiple equations\n================================================================================\n\ntype family A a where\n  A a = a\n  A a = a\n  A a = a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  declarations: (declarations\n    (type_family\n      name: (name)\n      patterns: (type_params\n        bind: (variable))\n      closed_family: (equations\n        equation: (equation\n          name: (name)\n          patterns: (type_patterns\n            (variable))\n          (variable))\n        equation: (equation\n          name: (name)\n          patterns: (type_patterns\n            (variable))\n          (variable))\n        equation: (equation\n          name: (name)\n          patterns: (type_patterns\n            (variable))\n          (variable))))))\n\n================================================================================\nfamily: open\n================================================================================\n\ntype family A (a :: a) :: *\ntype instance A [A] = A\ntype instance A (A A) = A\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (type_family\n      (name)\n      (type_params\n        (parens\n          (annotated\n            (variable)\n            (variable))))\n      (star))\n    (type_instance\n      (name)\n      (type_patterns\n        (list\n          (name)))\n      (name))\n    (type_instance\n      (name)\n      (type_patterns\n        (parens\n          (apply\n            (name)\n            (name))))\n      (name))))\n\n================================================================================\nfamily: data family\n================================================================================\n\ndata family A a (a :: [a]) :: Type -> *\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (data_family\n      (name)\n      (type_params\n        (variable)\n        (parens\n          (annotated\n            (variable)\n            (list\n              (variable)))))\n      (function\n        (name)\n        (star)))))\n\n================================================================================\nfamily: data instance adt\n================================================================================\n\ndata instance ∀ a . A a A =\n  A a A a\n  |\n  A { a :: A }\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (data_instance\n      (data_type\n        (forall\n          (quantified_variables\n            (variable)))\n        (name)\n        (type_patterns\n          (variable)\n          (name))\n        (data_constructors\n          (data_constructor\n            (prefix\n              (constructor)\n              (variable)\n              (name)\n              (variable)))\n          (data_constructor\n            (record\n              (constructor)\n              (fields\n                (field\n                  (field_name\n                    (variable))\n                  (name))))))))))\n\n================================================================================\nfamily: data instance gadt\n================================================================================\n\ndata instance A a where\n  A :: A -> A a\n  deriving (A, A)\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (data_instance\n      (data_type\n        (name)\n        (type_patterns\n          (variable))\n        (gadt_constructors\n          (gadt_constructor\n            (constructor)\n            (prefix\n              (function\n                (name)\n                (apply\n                  (name)\n                  (variable))))))\n        (deriving\n          (tuple\n            (name)\n            (name)))))))\n\n================================================================================\nfamily: data instance newtype simple\n================================================================================\n\nnewtype instance A a A = A a deriving A\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (data_instance\n      (newtype\n        (name)\n        (type_patterns\n          (variable)\n          (name))\n        (newtype_constructor\n          (constructor)\n          (field\n            (variable)))\n        (deriving\n          (name))))))\n\n================================================================================\nfamily: data instance newtype gadt\n================================================================================\n\nnewtype instance A A where\n  A :: A %1 -> A A\n\nnewtype instance ∀ a . A a => A (a :: a) :: A where\n  A :: A %1 -> A [a] deriving A\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (data_instance\n      (newtype\n        (name)\n        (type_patterns\n          (name))\n        (gadt_constructors\n          (gadt_constructor\n            (constructor)\n            (prefix\n              (linear_function\n                (name)\n                (modifier\n                  (literal\n                    (integer)))\n                (apply\n                  (name)\n                  (name))))))))\n    (data_instance\n      (newtype\n        (forall\n          (quantified_variables\n            (variable)))\n        (context\n          (apply\n            (name)\n            (variable)))\n        (name)\n        (type_patterns\n          (parens\n            (signature\n              (variable)\n              (variable))))\n        (name)\n        (gadt_constructors\n          (gadt_constructor\n            (constructor)\n            (prefix\n              (linear_function\n                (name)\n                (modifier\n                  (literal\n                    (integer)))\n                (apply\n                  (name)\n                  (list\n                    (variable)))))))\n        (deriving\n          (name))))))\n\n================================================================================\nfamily: data instance newtype record\n================================================================================\n\nnewtype instance A = A { a :: A }\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (data_instance\n      (newtype\n        (name)\n        (newtype_constructor\n          (constructor)\n          (record\n            (field\n              (field_name\n                (variable))\n              (name))))))))\n\n================================================================================\nfamily: injectivity annotation\n================================================================================\nmodule A where\n\ntype family A a = r\n\ntype family A a = (r :: A) | r -> a where\n  A a = a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (header\n    (module\n      (module_id)))\n  (declarations\n    (type_family\n      (name)\n      (type_params\n        (variable))\n      (type_family_result\n        (variable)))\n    (type_family\n      (name)\n      (type_params\n        (variable))\n      (type_family_result\n        (parens\n          (signature\n            (variable)\n            (name))))\n      (type_family_injectivity\n        (variable)\n        (variable))\n      (equations\n        (equation\n          (name)\n          (type_patterns\n            (variable))\n          (variable))))))\n\n================================================================================\nfamily: infix basic\n================================================================================\n\ntype family a <> a where\n  a <> a = a\n\ntype instance A <> A = a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (type_family\n      (infix\n        (variable)\n        (operator)\n        (variable))\n      (equations\n        (equation\n          (infix\n            (variable)\n            (operator)\n            (variable))\n          (variable))))\n    (type_instance\n      (infix\n        (name)\n        (operator)\n        (name))\n      (variable))))\n\n================================================================================\nfamily: infix pattern mistaken as infix head\n================================================================================\n\n-- Many nodes to ensure the conflict is decided in favor of apply without prec\ntype family A a a a a a where\n  a <> a = a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (comment)\n  (declarations\n    (type_family\n      (name)\n      (type_params\n        (variable)\n        (variable)\n        (variable)\n        (variable)\n        (variable))\n      (equations\n        (equation\n          (infix\n            (variable)\n            (operator)\n            (variable))\n          (variable))))))\n\n================================================================================\nfamily: kind signature in pattern\n================================================================================\n\ntype family A where\n  A (a :: A, a) = a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (type_family\n      (name)\n      (equations\n        (equation\n          (name)\n          (type_patterns\n            (tuple\n              (signature\n                (variable)\n                (name))\n              (variable)))\n          (variable))))))\n\n================================================================================\nfamily: kind application\n================================================================================\n\ntype family A where\n  A @A @a @(A a) @(∀ a . A a :: A a) a = a\n\ntype instance A @a A = a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (type_family\n      (name)\n      (equations\n        (equation\n          (name)\n          (type_patterns\n            (kind_application\n              (name))\n            (kind_application\n              (variable))\n            (kind_application\n              (parens\n                (apply\n                  (name)\n                  (variable))))\n            (kind_application\n              (parens\n                (signature\n                  (forall\n                    (quantified_variables\n                      (variable))\n                    (apply\n                      (name)\n                      (variable)))\n                  (apply\n                    (name)\n                    (variable)))))\n            (variable))\n          (variable))))\n    (type_instance\n      (name)\n      (type_patterns\n        (kind_application\n          (variable))\n        (name))\n      (variable))))\n\n================================================================================\nfamily: symbolic prefix\n================================================================================\n\ntype family (<>) where\n  (<>) = A\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (type_family\n      (prefix_id\n        (operator))\n      (equations\n        (equation\n          (prefix_id\n            (operator))\n          (name))))))\n\n================================================================================\nfamily: forall before equation\n================================================================================\n\ntype family A a where\n  ∀ a . A a = a\n\ntype instance ∀ a . A a = a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (type_family\n      (name)\n      (type_params\n        (variable))\n      (equations\n        (equation\n          (forall\n            (quantified_variables\n              (variable)))\n          (name)\n          (type_patterns\n            (variable))\n          (variable))))\n    (type_instance\n      (forall\n        (quantified_variables\n          (variable)))\n      (name)\n      (type_patterns\n        (variable))\n      (variable))))\n\n================================================================================\nfamily: abstract closed family, hs-boot\n================================================================================\n\ntype family A where\n  ..\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (type_family\n      (name)\n      (abstract_family))))\n\n================================================================================\nfamily: arrow in pattern\n================================================================================\n\ntype family A where\n  A (a -> a) = a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (type_family\n      (name)\n      (equations\n        (equation\n          (name)\n          (type_patterns\n            (parens\n              (function\n                (variable)\n                (variable))))\n          (variable))))))\n\n================================================================================\nfamily: infix asterisk\n================================================================================\n\ntype family a * a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (type_family\n      (infix\n        (variable)\n        (operator)\n        (variable)))))\n\n================================================================================\nfamily: closed qualified\n================================================================================\n\ntype family A where\n  A.A.A a = a\n  a A.A.++ a = a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (type_family\n      (name)\n      (equations\n        (equation\n          (qualified\n            (module\n              (module_id)\n              (module_id))\n            (name))\n          (type_patterns\n            (variable))\n          (variable))\n        (equation\n          (infix\n            (variable)\n            (qualified\n              (module\n                (module_id)\n                (module_id))\n              (operator))\n            (variable))\n          (variable))))))\n\n================================================================================\nfamily: open qualified\n================================================================================\n\ntype instance A.A.A a = a\ntype instance a A.A.++ a = a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (type_instance\n      (qualified\n        (module\n          (module_id)\n          (module_id))\n        (name))\n      (type_patterns\n        (variable))\n      (variable))\n    (type_instance\n      (infix\n        (variable)\n        (qualified\n          (module\n            (module_id)\n            (module_id))\n          (operator))\n        (variable))\n      (variable))))\n"
  },
  {
    "path": "test/corpus/foreign.txt",
    "content": "================================================================================\nforeign: decl\n================================================================================\n\nforeign import prim safe \"fun\" a :: (# A#, A# #)\nforeign import capi unsafe \"fun\" a :: A\nforeign import ccall interruptible \"fun\" a :: A\nforeign import ccall \"fun\" a :: A\nforeign export stdcall \"fun\" a :: A\nforeign export javascript \"fun\" a :: A\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (foreign_import\n      (calling_convention)\n      (safety)\n      (entity\n        (string))\n      (signature\n        (variable)\n        (unboxed_tuple\n          (name)\n          (name))))\n    (foreign_import\n      (calling_convention)\n      (safety)\n      (entity\n        (string))\n      (signature\n        (variable)\n        (name)))\n    (foreign_import\n      (calling_convention)\n      (safety)\n      (entity\n        (string))\n      (signature\n        (variable)\n        (name)))\n    (foreign_import\n      (calling_convention)\n      (entity\n        (string))\n      (signature\n        (variable)\n        (name)))\n    (foreign_export\n      (calling_convention)\n      (entity\n        (string))\n      (signature\n        (variable)\n        (name)))\n    (foreign_export\n      (calling_convention)\n      (entity\n        (string))\n      (signature\n        (variable)\n        (name)))))\n"
  },
  {
    "path": "test/corpus/gadt.txt",
    "content": "================================================================================\ngadt: empty\n================================================================================\n\ndata A where\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (data_type\n      (name))))\n\n================================================================================\ngadt: basic\n================================================================================\n\ndata A a where\n  A :: A -> !(A a) ->\n    A a\n  A :: {-# unpack #-} A -> A a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (data_type\n      (name)\n      (type_params\n        (variable))\n      (gadt_constructors\n        (gadt_constructor\n          (constructor)\n          (prefix\n            (function\n              (name)\n              (function\n                (strict_field\n                  (parens\n                    (apply\n                      (name)\n                      (variable))))\n                (apply\n                  (name)\n                  (variable))))))\n        (gadt_constructor\n          (constructor)\n          (pragma)\n          (prefix\n            (function\n              (name)\n              (apply\n                (name)\n                (variable)))))))))\n\n================================================================================\ngadt: record\n================================================================================\n\ndata A where\n  A :: { a :: A, a :: !A } -> A\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (data_type\n      (name)\n      (gadt_constructors\n        (gadt_constructor\n          (constructor)\n          (record\n            (fields\n              (field\n                (field_name\n                  (variable))\n                (name))\n              (field\n                (field_name\n                  (variable))\n                (strict_field\n                  (name))))\n            (name)))))))\n\n================================================================================\ngadt: signature\n================================================================================\n\ndata A :: [*] -> * where\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (data_type\n      (name)\n      (function\n        (list\n          (star))\n        (star)))))\n\n================================================================================\ngadt: context\n================================================================================\n\ndata A a => A where\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (data_type\n      (context\n        (apply\n          (name)\n          (variable)))\n      (name))))\n\n================================================================================\ngadt: con context\n================================================================================\n\ndata A where\n  A :: A a => A\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (data_type\n      (name)\n      (gadt_constructors\n        (gadt_constructor\n          (constructor)\n          (context\n            (apply\n              (name)\n              (variable)))\n          (prefix\n            (name)))))))\n\n================================================================================\ngadt: forall\n================================================================================\n\ndata A where\n  A :: ∀ a . A\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (data_type\n      (name)\n      (gadt_constructors\n        (gadt_constructor\n          (constructor)\n          (forall\n            (quantified_variables\n              (variable)))\n          (prefix\n            (name)))))))\n\n================================================================================\ngadt: simple deriving\n================================================================================\n\ndata A where\n  A :: A\n  deriving A\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (data_type\n      (name)\n      (gadt_constructors\n        (gadt_constructor\n          (constructor)\n          (prefix\n            (name))))\n      (deriving\n        (name)))))\n\n================================================================================\ngadt: deriving\n================================================================================\n\ndata A where\n  A :: A\n  deriving stock A\n  deriving A via (A A)\n\ndata A where\n  A :: A deriving A deriving stock A\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (data_type\n      (name)\n      (gadt_constructors\n        (gadt_constructor\n          (constructor)\n          (prefix\n            (name))))\n      (deriving\n        (deriving_strategy)\n        (name))\n      (deriving\n        (name)\n        (via\n          (parens\n            (apply\n              (name)\n              (name))))))\n    (data_type\n      (name)\n      (gadt_constructors\n        (gadt_constructor\n          (constructor)\n          (prefix\n            (name))))\n      (deriving\n        (name))\n      (deriving\n        (deriving_strategy)\n        (name)))))\n\n================================================================================\ngadt: symbolic operator\n================================================================================\n\ndata a +++ b where\n  (:+++) :: a -> b -> a +++ b\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (data_type\n      (infix\n        (variable)\n        (operator)\n        (variable))\n      (gadt_constructors\n        (gadt_constructor\n          (prefix_id\n            (constructor_operator))\n          (prefix\n            (function\n              (variable)\n              (function\n                (variable)\n                (infix\n                  (variable)\n                  (operator)\n                  (variable))))))))))\n\n================================================================================\ngadt: newtype\n================================================================================\n\nnewtype A where\n  A :: A\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (newtype\n      (name)\n      (gadt_constructors\n        (gadt_constructor\n          (constructor)\n          (prefix\n            (name)))))))\n\n================================================================================\ngadt: symbolic type\n================================================================================\n\ndata (:#) a where\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (data_type\n      (prefix_id\n        (constructor_operator))\n      (type_params\n        (variable)))))\n\n================================================================================\ngadt: strict/lazy\n================================================================================\n\ndata A where\n  A :: ~A -> A\n  A :: !A -> A\n  A :: A ~ A => A -> A\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (data_type\n      (name)\n      (gadt_constructors\n        (gadt_constructor\n          (constructor)\n          (prefix\n            (function\n              (lazy_field\n                (name))\n              (name))))\n        (gadt_constructor\n          (constructor)\n          (prefix\n            (function\n              (strict_field\n                (name))\n              (name))))\n        (gadt_constructor\n          (constructor)\n          (context\n            (infix\n              (name)\n              (operator)\n              (name)))\n          (prefix\n            (function\n              (name)\n              (name))))))))\n\n================================================================================\ngadt: type data\n================================================================================\n\ntype data A a where\n  A :: A ~ A => A a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (data_type\n      (name)\n      (type_params\n        (variable))\n      (gadt_constructors\n        (gadt_constructor\n          (constructor)\n          (context\n            (infix\n              (name)\n              (operator)\n              (name)))\n          (prefix\n            (apply\n              (name)\n              (variable))))))))\n\n================================================================================\ngadt: multiplicity arrow\n================================================================================\n\ndata A a where\n  A :: a %1 -> A a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (data_type\n      (name)\n      (type_params\n        (variable))\n      (gadt_constructors\n        (gadt_constructor\n          (constructor)\n          (prefix\n            (linear_function\n              (variable)\n              (modifier\n                (literal\n                  (integer)))\n              (apply\n                (name)\n                (variable)))))))))\n\n================================================================================\ngadt: con list\n================================================================================\n\ndata A where\n  A, A, A :: a -> A\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (data_type\n      (name)\n      (gadt_constructors\n        (gadt_constructor\n          (binding_list\n            (constructor)\n            (constructor)\n            (constructor))\n          (prefix\n            (function\n              (variable)\n              (name))))))))\n\n================================================================================\ngadt: record with context\n================================================================================\n\ndata A where\n  A :: ∀ a . A => { a :: A } -> A\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (data_type\n      (name)\n      (gadt_constructors\n        (gadt_constructor\n          (constructor)\n          (forall\n            (quantified_variables\n              (variable)))\n          (context\n            (name))\n          (record\n            (fields\n              (field\n                (field_name\n                  (variable))\n                (name)))\n            (name)))))))\n"
  },
  {
    "path": "test/corpus/id.txt",
    "content": "================================================================================\nid: variable\n================================================================================\n\na = a\n_a0 = a\n_A0 = a\na0 = a\na9 = a\naA = a\naZ' = a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (variable)))\n    (bind\n      (variable)\n      (match\n        (variable)))\n    (bind\n      (variable)\n      (match\n        (variable)))\n    (bind\n      (variable)\n      (match\n        (variable)))\n    (bind\n      (variable)\n      (match\n        (variable)))\n    (bind\n      (variable)\n      (match\n        (variable)))\n    (bind\n      (variable)\n      (match\n        (variable)))))\n\n================================================================================\nid: constructor\n================================================================================\n\ndata B = A\n       | A0\n       | A9\n       | Aa\n       | A_\n       | Az'\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (data_type\n      (name)\n      (data_constructors\n        (data_constructor\n          (prefix\n            (constructor)))\n        (data_constructor\n          (prefix\n            (constructor)))\n        (data_constructor\n          (prefix\n            (constructor)))\n        (data_constructor\n          (prefix\n            (constructor)))\n        (data_constructor\n          (prefix\n            (constructor)))\n        (data_constructor\n          (prefix\n            (constructor)))))))\n\n================================================================================\nid: unicode\n================================================================================\n\naccenté = ()\ndata T =\n  Œufs\n  | Étonnement\n  | ǋtitlecasetest\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (unit)))\n    (data_type\n      (name)\n      (data_constructors\n        (data_constructor\n          (prefix\n            (constructor)))\n        (data_constructor\n          (prefix\n            (constructor)))\n        (data_constructor\n          (prefix\n            (constructor)))))))\n\n================================================================================\nid: hashes\n================================================================================\n\na#### = a##\n\ndata A## = A###\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (variable)))\n    (data_type\n      (name)\n      (data_constructors\n        (data_constructor\n          (prefix\n            (constructor)))))))\n"
  },
  {
    "path": "test/corpus/implicit.txt",
    "content": "================================================================================\nimplicit: synonym plain\n================================================================================\n\ntype A = ?a :: A\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (type_synomym\n      (name)\n      (implicit_parameter\n        (implicit_variable)\n        (name)))))\n\n================================================================================\nimplicit: synonym parens\n================================================================================\n\ntype A = (?a :: A)\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (type_synomym\n      (name)\n      (parens\n        (implicit_parameter\n          (implicit_variable)\n          (name))))))\n\n================================================================================\nimplicit: synonym parens kind annotation\n================================================================================\n\ntype A = (?a :: Int :: Constraint)\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (type_synomym\n      (name)\n      (parens\n        (signature\n          (implicit_parameter\n            (implicit_variable)\n            (name))\n          (name))))))\n\n================================================================================\nimplicit: synonym parens constrained\n================================================================================\n\ntype A = (A => ?a :: A)\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (type_synomym\n      (name)\n      (parens\n        (context\n          (name)\n          (implicit_parameter\n            (implicit_variable)\n            (name)))))))\n\n================================================================================\nimplicit: synonym parens constrained\n================================================================================\n\ntype A = (?a :: A.A, A)\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (type_synomym\n      (name)\n      (tuple\n        (implicit_parameter\n          (implicit_variable)\n          (qualified\n            (module\n              (module_id))\n            (name)))\n        (name)))))\n\n================================================================================\nimplicit: synonym tuple\n================================================================================\n\ntype A = (?a :: A.A, A)\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (type_synomym\n      (name)\n      (tuple\n        (implicit_parameter\n          (implicit_variable)\n          (qualified\n            (module\n              (module_id))\n            (name)))\n        (name)))))\n\n================================================================================\nimplicit: synonym context\n================================================================================\n\ntype A = (?a :: A) => A\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (type_synomym\n      (name)\n      (context\n        (parens\n          (implicit_parameter\n            (implicit_variable)\n            (name)))\n        (name)))))\n\n================================================================================\nimplicit: synonym forall/context in annotation\n================================================================================\n\ntype A = ?a :: ∀ a . A a => A\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (type_synomym\n      (name)\n      (implicit_parameter\n        (implicit_variable)\n        (forall\n          (quantified_variables\n            (variable))\n          (context\n            (apply\n              (name)\n              (variable))\n            (name)))))))\n\n================================================================================\nimplicit: signature with function in annotation\n================================================================================\n\na :: (?aaa :: a -> a -> a) => a -> a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (signature\n      (variable)\n      (context\n        (parens\n          (implicit_parameter\n            (implicit_variable)\n            (function\n              (variable)\n              (function\n                (variable)\n                (variable)))))\n        (function\n          (variable)\n          (variable))))))\n"
  },
  {
    "path": "test/corpus/import.txt",
    "content": "================================================================================\nimport: unqualified module plain\n================================================================================\n\nmodule A where\n\nimport A\n\na = a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (header\n    (module\n      (module_id)))\n  (imports\n    (import\n      (module\n        (module_id))))\n  (declarations\n    (bind\n      (variable)\n      (match\n        (variable)))))\n\n================================================================================\nimport: unqualified module with empty export list\n================================================================================\n\nimport A ()\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (imports\n    (import\n      (module\n        (module_id))\n      (import_list))))\n\n================================================================================\nimport: unqualified module with alias\n================================================================================\n\nimport A as A\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (imports\n    (import\n      (module\n        (module_id))\n      (module\n        (module_id)))))\n\n================================================================================\nimport: qualified module\n================================================================================\n\nimport A.A\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (imports\n    (import\n      (module\n        (module_id)\n        (module_id)))))\n\n================================================================================\nimport: var only\n================================================================================\n\nimport Aaa.A (aa)\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (imports\n    (import\n      (module\n        (module_id)\n        (module_id))\n      (import_list\n        (import_name\n          (variable))))))\n\n================================================================================\nimport: type only\n================================================================================\n\nimport Aaa.A (A)\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (imports\n    (import\n      (module\n        (module_id)\n        (module_id))\n      (import_list\n        (import_name\n          (name))))))\n\n================================================================================\nimport: type with constructor\n================================================================================\n\nimport Aaa.A (A(A))\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (imports\n    (import\n      (module\n        (module_id)\n        (module_id))\n      (import_list\n        (import_name\n          (name)\n          (children\n            (constructor)))))))\n\n================================================================================\nimport: type with var\n================================================================================\n\nimport Aaa.A (A(aa))\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (imports\n    (import\n      (module\n        (module_id)\n        (module_id))\n      (import_list\n        (import_name\n          (name)\n          (children\n            (variable)))))))\n\n================================================================================\nimport: type with symbolic var\n================================================================================\n\nimport Aaa.A (A((<>)))\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (imports\n    (import\n      (module\n        (module_id)\n        (module_id))\n      (import_list\n        (import_name\n          (name)\n          (children\n            (prefix_id\n              (operator))))))))\n\n================================================================================\nimport: type dotdot\n================================================================================\n\nimport Aaa.A (A(..))\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (imports\n    (import\n      (module\n        (module_id)\n        (module_id))\n      (import_list\n        (import_name\n          (name)\n          (children\n            (all_names)))))))\n\n================================================================================\nimport: qualified basic\n================================================================================\n\nimport qualified Aaa.A\nimport qualified A ()\nimport qualified Aaa.A (a)\nimport Aaa.A qualified (a)\nimport qualified Aaa.A hiding (A, a)\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (imports\n    (import\n      (module\n        (module_id)\n        (module_id)))\n    (import\n      (module\n        (module_id))\n      (import_list))\n    (import\n      (module\n        (module_id)\n        (module_id))\n      (import_list\n        (import_name\n          (variable))))\n    (import\n      (module\n        (module_id)\n        (module_id))\n      (import_list\n        (import_name\n          (variable))))\n    (import\n      (module\n        (module_id)\n        (module_id))\n      (import_list\n        (import_name\n          (name))\n        (import_name\n          (variable))))))\n\n================================================================================\nimport: qualified as\n================================================================================\n\nmodule A where\n\nimport qualified Aaa.A as A\nimport qualified Aaa.A as A (A(A, a), aa)\nimport qualified A as A ()\n\n-- a\n\nimport qualified Aaa.A as A\nimport qualified Aaa.A as Aaa.A\nimport qualified Aaa.A as A hiding (a)\n\ndata A = A\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (header\n    (module\n      (module_id)))\n  (imports\n    (import\n      (module\n        (module_id)\n        (module_id))\n      (module\n        (module_id)))\n    (import\n      (module\n        (module_id)\n        (module_id))\n      (module\n        (module_id))\n      (import_list\n        (import_name\n          (name)\n          (children\n            (constructor)\n            (variable)))\n        (import_name\n          (variable))))\n    (import\n      (module\n        (module_id))\n      (module\n        (module_id))\n      (import_list))\n    (comment)\n    (import\n      (module\n        (module_id)\n        (module_id))\n      (module\n        (module_id)))\n    (import\n      (module\n        (module_id)\n        (module_id))\n      (module\n        (module_id)\n        (module_id)))\n    (import\n      (module\n        (module_id)\n        (module_id))\n      (module\n        (module_id))\n      (import_list\n        (import_name\n          (variable)))))\n  (declarations\n    (data_type\n      (name)\n      (data_constructors\n        (data_constructor\n          (prefix\n            (constructor)))))))\n\n================================================================================\nimport: prim\n================================================================================\n\nimport Aaa.Aa (Aa#, aa#)\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (imports\n    (import\n      (module\n        (module_id)\n        (module_id))\n      (import_list\n        (import_name\n          (name))\n        (import_name\n          (variable))))))\n\n================================================================================\nimport: package\n================================================================================\n\nimport \"a\" Aaa.Aa\nimport qualified \"a\" Aaa.Aa as Aa (Aa(a))\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (imports\n    (import\n      (import_package)\n      (module\n        (module_id)\n        (module_id)))\n    (import\n      (import_package)\n      (module\n        (module_id)\n        (module_id))\n      (module\n        (module_id))\n      (import_list\n        (import_name\n          (name)\n          (children\n            (variable)))))))\n\n================================================================================\nimport: consym\n================================================================================\n\nimport A ((:<|>)((:<|>)))\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (imports\n    (import\n      (module\n        (module_id))\n      (import_list\n        (import_name\n          (prefix_id\n            (constructor_operator))\n          (children\n            (prefix_id\n              (constructor_operator))))))))\n\n================================================================================\nimport: operator\n================================================================================\n\nimport A ((<=<))\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (imports\n    (import\n      (module\n        (module_id))\n      (import_list\n        (import_name\n          (prefix_id\n            (operator)))))))\n\n================================================================================\nimport: pattern/type\n================================================================================\n\nimport A (pattern A, type A)\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (imports\n    (import\n      (module\n        (module_id))\n      (import_list\n        (import_name\n          (namespace)\n          (name))\n        (import_name\n          (namespace)\n          (name))))))\n\n================================================================================\nimport: trailing comma\n================================================================================\n\nimport A (A,)\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (imports\n    (import\n      (module\n        (module_id))\n      (import_list\n        (import_name\n          (name))))))\n\n================================================================================\nimport: type operator with namespace\n================================================================================\n\nimport A (type (++)(..))\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (imports\n    (import\n      (module\n        (module_id))\n      (import_list\n        (import_name\n          (namespace)\n          (prefix_id\n            (operator))\n          (children\n            (all_names)))))))\n\n================================================================================\nimport: namespace for type child\n================================================================================\n\nimport A (A (type A, A, ..))\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (imports\n    (import\n      (module\n        (module_id))\n      (import_list\n        (import_name\n          (name)\n          (children\n            (associated_type\n              (name))\n            (constructor)\n            (all_names)))))))\n\n================================================================================\nimport: partially typed import before the end of the block\n================================================================================\n\nimport A\nimpo\nimport A\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (imports\n    (import\n      (module\n        (module_id))))\n  (declarations\n    (top_splice\n      (variable))\n    (import\n      (module\n        (module_id)))))\n"
  },
  {
    "path": "test/corpus/instance.txt",
    "content": "================================================================================\ninstance: minimal\n================================================================================\n\ninstance A a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (instance\n      (name)\n      (type_patterns\n        (variable)))))\n\n================================================================================\ninstance: type\n================================================================================\n\ninstance A A a A\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (instance\n      (name)\n      (type_patterns\n        (name)\n        (variable)\n        (name)))))\n\n================================================================================\ninstance: forall\n================================================================================\n\ninstance forall a (a :: *) . A\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (instance\n      (forall\n        (quantified_variables\n          (variable)\n          (parens\n            (annotated\n              (variable)\n              (star)))))\n      (name))))\n\n================================================================================\ninstance: context\n================================================================================\n\ninstance A a => A\ninstance (A a, A a) => A\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (instance\n      (context\n        (apply\n          (name)\n          (variable)))\n      (name))\n    (instance\n      (context\n        (tuple\n          (apply\n            (name)\n            (variable))\n          (apply\n            (name)\n            (variable))))\n      (name))))\n\n================================================================================\ninstance: method inline\n================================================================================\n\ninstance A a where a a = Just a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (instance\n      (name)\n      (type_patterns\n        (variable))\n      (instance_declarations\n        (function\n          (variable)\n          (patterns\n            (variable))\n          (match\n            (apply\n              (constructor)\n              (variable))))))))\n\n================================================================================\ninstance: signature\n================================================================================\n\ninstance A a where\n  a :: A a => a -> a\n  a a = a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (instance\n      (name)\n      (type_patterns\n        (variable))\n      (instance_declarations\n        (signature\n          (variable)\n          (context\n            (apply\n              (name)\n              (variable))\n            (function\n              (variable)\n              (variable))))\n        (function\n          (variable)\n          (patterns\n            (variable))\n          (match\n            (variable)))))))\n\n================================================================================\ninstance: infix context\n================================================================================\n\ninstance a + a => A\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (instance\n      (context\n        (infix\n          (variable)\n          (operator)\n          (variable)))\n      (name))))\n\n================================================================================\ninstance: equality constraint\n================================================================================\n\ninstance A a ~ A a => A a\ninstance A ~~ A => ((A) a)\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (instance\n      (context\n        (infix\n          (apply\n            (name)\n            (variable))\n          (operator)\n          (apply\n            (name)\n            (variable))))\n      (name)\n      (type_patterns\n        (variable)))\n    (instance\n      (context\n        (infix\n          (name)\n          (operator)\n          (name)))\n      (parens\n        (parens\n          (name))\n        (type_patterns\n          (variable))))))\n\n================================================================================\ninstance: associated type instance\n================================================================================\n\ninstance A where\n  type A A a = A a\n  type instance A @A a = A\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (instance\n      (name)\n      (instance_declarations\n        (type_instance\n          (name)\n          (type_patterns\n            (name)\n            (variable))\n          (apply\n            (name)\n            (variable)))\n        (type_instance\n          (name)\n          (type_patterns\n            (kind_application\n              (name))\n            (variable))\n          (name))))))\n\n================================================================================\ninstance: associated data instance\n================================================================================\n\ninstance A where\n  data A a = A a | A { a :: A }\n\n  data instance ∀ a . A a => A a = A\n\n  newtype A A where\n    A :: A %1 -> A A\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (instance\n      (name)\n      (instance_declarations\n        (data_instance\n          (data_type\n            (name)\n            (type_patterns\n              (variable))\n            (data_constructors\n              (data_constructor\n                (prefix\n                  (constructor)\n                  (variable)))\n              (data_constructor\n                (record\n                  (constructor)\n                  (fields\n                    (field\n                      (field_name\n                        (variable))\n                      (name))))))))\n        (data_instance\n          (data_type\n            (forall\n              (quantified_variables\n                (variable)))\n            (context\n              (apply\n                (name)\n                (variable)))\n            (name)\n            (type_patterns\n              (variable))\n            (data_constructors\n              (data_constructor\n                (prefix\n                  (constructor))))))\n        (data_instance\n          (newtype\n            (name)\n            (type_patterns\n              (name))\n            (gadt_constructors\n              (gadt_constructor\n                (constructor)\n                (prefix\n                  (linear_function\n                    (name)\n                    (modifier\n                      (literal\n                        (integer)))\n                    (apply\n                      (name)\n                      (name))))))))))))\n\n================================================================================\ninstance: infix pattern lhs method\n================================================================================\n\ninstance A where\n  a == a = a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (instance\n      (name)\n      (instance_declarations\n        (function\n          (infix\n            (variable)\n            (operator)\n            (variable))\n          (match\n            (variable)))))))\n\n================================================================================\ninstance: standalone deriving\n================================================================================\n\nderiving instance A (A a)\nderiving instance A ++ A\nderiving instance A a => A (A a)\nderiving instance (A a, A a a) => A (A a)\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (deriving_instance\n      (name)\n      (type_patterns\n        (parens\n          (apply\n            (name)\n            (variable)))))\n    (deriving_instance\n      (infix\n        (name)\n        (operator)\n        (name)))\n    (deriving_instance\n      (context\n        (apply\n          (name)\n          (variable)))\n      (name)\n      (type_patterns\n        (parens\n          (apply\n            (name)\n            (variable)))))\n    (deriving_instance\n      (context\n        (tuple\n          (apply\n            (name)\n            (variable))\n          (apply\n            (apply\n              (name)\n              (variable))\n            (variable))))\n      (name)\n      (type_patterns\n        (parens\n          (apply\n            (name)\n            (variable)))))))\n\n================================================================================\ninstance: deriving via\n================================================================================\n\nderiving via (A a) instance A a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (deriving_instance\n      (via\n        (parens\n          (apply\n            (name)\n            (variable))))\n      (name)\n      (type_patterns\n        (variable)))))\n\n================================================================================\ninstance: qualified class\n================================================================================\n\ninstance A.A a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (instance\n      (qualified\n        (module\n          (module_id))\n        (name))\n      (type_patterns\n        (variable)))))\n\n================================================================================\ninstance: nullary method\n================================================================================\n\ninstance A where\n  a = a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (instance\n      (name)\n      (instance_declarations\n        (bind\n          (variable)\n          (match\n            (variable)))))))\n\n================================================================================\ninstance: annotation\n================================================================================\n\ninstance (A :: Constraint)\ninstance ((A :: Type -> Constraint) A :: Constraint)\n\n--------------------------------------------------------------------------------\n\n(haskell\n  declarations: (declarations\n    (instance\n      (parens\n        name: (name)\n        kind: (name)))\n    (instance\n      (parens\n        (parens\n          name: (name)\n          kind: (function\n            parameter: (name)\n            result: (name)))\n        patterns: (type_patterns\n          (name))\n        kind: (name)))))\n\n================================================================================\ninstance: minus\n================================================================================\n\ninstance a - b where\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (instance\n      (infix\n        (variable)\n        (operator)\n        (variable)))))\n"
  },
  {
    "path": "test/corpus/layout.txt",
    "content": "================================================================================\nlayout: where on same level as case alt with nothing following\n================================================================================\n\na =\n  case a of\n  a -> a\n  where a = a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (case\n          (variable)\n          (alternatives\n            (alternative\n              (variable)\n              (match\n                (variable))))))\n      (local_binds\n        (bind\n          (variable)\n          (match\n            (variable)))))))\n\n================================================================================\nlayout: error: where on same level as case alt with following alt\n================================================================================\n\na = case a of\n  a -> a\n  where\n    a = a\n  a -> a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (ERROR\n    (bind\n      (variable)\n      (match\n        (case\n          (variable)\n          (alternatives\n            (alternative\n              (variable)\n              (match\n                (variable))))))\n      (local_binds\n        (bind\n          (variable)\n          (match\n            (variable)))))\n    (variable))\n  (declarations\n    (top_splice\n      (variable))))\n\n================================================================================\nlayout: where on deeper level than case alt with following alt\n================================================================================\n\na = case a of\n  b -> c\n    where\n      d = e\n  f -> g\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (case\n          (variable)\n          (alternatives\n            (alternative\n              (variable)\n              (match\n                (variable))\n              (local_binds\n                (bind\n                  (variable)\n                  (match\n                    (variable)))))\n            (alternative\n              (variable)\n              (match\n                (variable)))))))))\n\n================================================================================\nlayout: where with subsequent top decl\n================================================================================\n\na =\n  a\n  where a = a\na = a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (variable))\n      (local_binds\n        (bind\n          (variable)\n          (match\n            (variable)))))\n    (bind\n      (variable)\n      (match\n        (variable)))))\n\n================================================================================\nlayout: indented empty where with subsequent top decl\n================================================================================\n\na =\n  a\n   where\na = a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (variable)))\n    (bind\n      (variable)\n      (match\n        (variable)))))\n\n================================================================================\nlayout: where after case alt in do, then immediate top level where indented equally\n================================================================================\n\nx = do\n  a <- b\n  case c of\n    _ -> d\n     where e = f\n     where g = h\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (do\n          (bind\n            (variable)\n            (variable))\n          (exp\n            (case\n              (variable)\n              (alternatives\n                (alternative\n                  (wildcard)\n                  (match\n                    (variable))\n                  (local_binds\n                    (bind\n                      (variable)\n                      (match\n                        (variable))))))))))\n      (local_binds\n        (bind\n          (variable)\n          (match\n            (variable)))))))\n\n================================================================================\nlayout: double where in lambda case in do\n================================================================================\n\nx = do \\case\n         _ -> d\n          where e = f\n          where g = h\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (do\n          (exp\n            (lambda_case\n              (alternatives\n                (alternative\n                  (wildcard)\n                  (match\n                    (variable))\n                  (local_binds\n                    (bind\n                      (variable)\n                      (match\n                        (variable))))))))))\n      (local_binds\n        (bind\n          (variable)\n          (match\n            (variable)))))))\n\n================================================================================\nlayout: double where in lambda cases in do\n================================================================================\n\nx = do \\cases\n         _ _ -> d\n          where e = f\n          where g = h\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (do\n          (exp\n            (lambda_cases\n              (alternatives\n                (alternative\n                  (patterns\n                    (wildcard)\n                    (wildcard))\n                  (match\n                    (variable))\n                  (local_binds\n                    (bind\n                      (variable)\n                      (match\n                        (variable))))))))))\n      (local_binds\n        (bind\n          (variable)\n          (match\n            (variable)))))))\n\n================================================================================\nlayout: where after case alt in do, then immediate toplevel where at do indent\n================================================================================\n\na = do\n  case a of\n    a -> a\n         where a = a\n  where a = a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (do\n          (exp\n            (case\n              (variable)\n              (alternatives\n                (alternative\n                  (variable)\n                  (match\n                    (variable))\n                  (local_binds\n                    (bind\n                      (variable)\n                      (match\n                        (variable))))))))))\n      (local_binds\n        (bind\n          (variable)\n          (match\n            (variable)))))))\n\n================================================================================\nlayout: where after case alt inline, then immediate toplevel where at case indent\n================================================================================\n\nf = case a of\n  a -> a where a = a\n  where a = a\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (case\n          (variable)\n          (alternatives\n            (alternative\n              (variable)\n              (match\n                (variable))\n              (local_binds\n                (bind\n                  (variable)\n                  (match\n                    (variable))))))))\n      (local_binds\n        (bind\n          (variable)\n          (match\n            (variable)))))))\n\n================================================================================\nlayout: where inline after do statement\n================================================================================\n\na = do\n  a where\n  a = a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (do\n          (exp\n            (variable))))\n      (local_binds\n        (bind\n          (variable)\n          (match\n            (variable)))))))\n\n================================================================================\nlayout: do nested\n================================================================================\n\nx = do a\n       b\n       do\n         c\n         d\n         do e\n            f\n         g\n       h\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (do\n          (exp\n            (variable))\n          (exp\n            (variable))\n          (exp\n            (do\n              (exp\n                (variable))\n              (exp\n                (variable))\n              (exp\n                (do\n                  (exp\n                    (variable))\n                  (exp\n                    (variable))))\n              (exp\n                (variable))))\n          (exp\n            (variable)))))))\n\n================================================================================\nlayout: do and indented where\n================================================================================\n\na = do\n  b\n    where c = d\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (do\n          (exp\n            (variable))))\n      (local_binds\n        (bind\n          (variable)\n          (match\n            (variable)))))))\n\n================================================================================\nlayout: if and indented where\n================================================================================\n\na = if\n  | b -> c\n    where d = e\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (multi_way_if\n          (match\n            (guards\n              (boolean\n                (variable)))\n            (variable))))\n      (local_binds\n        (bind\n          (variable)\n          (match\n            (variable)))))))\n\n================================================================================\nlayout: do and empty line\n================================================================================\n\na = do\n  a <- a\n\n  a <- a\n  a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (do\n          (bind\n            (variable)\n            (variable))\n          (bind\n            (variable)\n            (variable))\n          (exp\n            (variable)))))))\n\n================================================================================\nlayout: recursive do with rec keyword\n================================================================================\n\nf = mdo\n  a <- pure 5\n  rec\n    b <- pure c\n    c <- pure b\n  pure c\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (do\n          (bind\n            (variable)\n            (apply\n              (variable)\n              (literal\n                (integer))))\n          (rec\n            (bind\n              (variable)\n              (apply\n                (variable)\n                (variable)))\n            (bind\n              (variable)\n              (apply\n                (variable)\n                (variable))))\n          (exp\n            (apply\n              (variable)\n              (variable))))))))\n\n================================================================================\nlayout: in after let on same indent\n================================================================================\n\na = let a = a\n        in a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (let_in\n          (local_binds\n            (bind\n              (variable)\n              (match\n                (variable))))\n          (variable))))))\n\n================================================================================\nlayout: identifier named \"whe\" in place of valid \"where\" in case\n================================================================================\n\na =\n  case b of\n  whe -> d\n  where\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (case\n          (variable)\n          (alternatives\n            (alternative\n              (variable)\n              (match\n                (variable)))))))))\n\n================================================================================\nlayout: identifier named \"whe\" in place of valid \"where\" as topdecl\n================================================================================\n\na = a\nwhe = a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (variable)))\n    (bind\n      (variable)\n      (match\n        (variable)))))\n\n================================================================================\nlayout: identifier \"i\" should not prematurely fail the scanner due to \"in\" parser\n================================================================================\n\na (i:a) = a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (function\n      (variable)\n      (patterns\n        (parens\n          (infix\n            (variable)\n            (constructor_operator)\n            (variable))))\n      (match\n        (variable)))))\n\n================================================================================\nlayout: empty file\n================================================================================\n\n--------------------------------------------------------------------------------\n\n(haskell)\n\n================================================================================\nlayout: indented let/in\n================================================================================\n\na = let\n           a = let\n            a = a\n            in a\n             in do\n         a <- a\n         a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (let_in\n          (local_binds\n            (bind\n              (variable)\n              (match\n                (let_in\n                  (local_binds\n                    (bind\n                      (variable)\n                      (match\n                        (variable))))\n                  (variable)))))\n          (do\n            (bind\n              (variable)\n              (variable))\n            (exp\n              (variable))))))))\n\n================================================================================\nlayout: let layout ended by in with smaller indent\n================================================================================\n\na = let a = a\n      in a\n\na = a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (let_in\n          (local_binds\n            (bind\n              (variable)\n              (match\n                (variable))))\n          (variable))))\n    (bind\n      (variable)\n      (match\n        (variable)))))\n\n================================================================================\nlayout: let layout ended by in with larger indent\n================================================================================\n\na = let a = a\n          in a\n\na = a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (let_in\n          (local_binds\n            (bind\n              (variable)\n              (match\n                (variable))))\n          (variable))))\n    (bind\n      (variable)\n      (match\n        (variable)))))\n\n================================================================================\nlayout: let with explicit semicolon\n================================================================================\n\na =\n  let a = a;\n      a = a\n  in a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (let_in\n          (local_binds\n            (bind\n              (variable)\n              (match\n                (variable)))\n            (bind\n              (variable)\n              (match\n                (variable))))\n          (variable))))))\n\n================================================================================\nlayout: let with multiple explicit semicolons before and after newline\n================================================================================\n\na =\n  let a = a;;;;;\n      ;;;;a = a\n  in a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (let_in\n          (local_binds\n            (bind\n              (variable)\n              (match\n                (variable)))\n            (bind\n              (variable)\n              (match\n                (variable))))\n          (variable))))))\n\n================================================================================\nlayout: let with explicit braces\n================================================================================\n\na = let { a :: A;\n          a = a;\n          a :: A;\n          a = a; } in a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (let_in\n          (local_binds\n            (signature\n              (variable)\n              (name))\n            (bind\n              (variable)\n              (match\n                (variable)))\n            (signature\n              (variable)\n              (name))\n            (bind\n              (variable)\n              (match\n                (variable))))\n          (variable))))))\n\n================================================================================\nlayout: where in do-let binding\n================================================================================\n\na = do\n  let a = a\n          where a = a\n  a\n\na = do\n  let a = a\n          where\n  a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (do\n          (let\n            (local_binds\n              (bind\n                (variable)\n                (match\n                  (variable))\n                (local_binds\n                  (bind\n                    (variable)\n                    (match\n                      (variable)))))))\n          (exp\n            (variable)))))\n    (bind\n      (variable)\n      (match\n        (do\n          (let\n            (local_binds\n              (bind\n                (variable)\n                (match\n                  (variable)))))\n          (exp\n            (variable)))))))\n\n================================================================================\nlayout: conditional with explicit semicolon\n================================================================================\n\na = if a; then a;;; else a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (conditional\n          (variable)\n          (variable)\n          (variable))))))\n\n================================================================================\nlayout: where after statement, on deeper or same indent\n================================================================================\n\na = do\n  b\n      where d = e\n\na = do\n  b\n  where d = e\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (do\n          (exp\n            (variable))))\n      (local_binds\n        (bind\n          (variable)\n          (match\n            (variable)))))\n    (bind\n      (variable)\n      (match\n        (do\n          (exp\n            (variable))))\n      (local_binds\n        (bind\n          (variable)\n          (match\n            (variable)))))))\n\n================================================================================\nlayout: empty where, then indented binds after inline where\n================================================================================\n\nc = d where\ne = f where\n  g = h\ni = j\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (variable)))\n    (bind\n      (variable)\n      (match\n        (variable))\n      (local_binds\n        (bind\n          (variable)\n          (match\n            (variable)))))\n    (bind\n      (variable)\n      (match\n        (variable)))))\n\n================================================================================\nlayout: parenthesized case inline\n================================================================================\n\na =\n  (\\case a -> b) . c\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (infix\n          (parens\n            (lambda_case\n              (alternatives\n                (alternative\n                  (variable)\n                  (match\n                    (variable))))))\n          (operator)\n          (variable))))))\n\n================================================================================\nlayout: parenthesized case newline\n================================================================================\n\na =\n  (\\case a -> b\n                ) . c\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (infix\n          (parens\n            (lambda_case\n              (alternatives\n                (alternative\n                  (variable)\n                  (match\n                    (variable))))))\n          (operator)\n          (variable))))))\n\n================================================================================\nlayout: comment between where and decl\n================================================================================\n\na = b where\n  {- comment -} c = d\n\na = b where\n  -- comment\n  c = d\n\na = b where -- comment\n  c = d\n\na = b where {- comment -}\n  c = d\n\na = b where -1 = a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (variable))\n      (comment)\n      (local_binds\n        (bind\n          (variable)\n          (match\n            (variable)))))\n    (bind\n      (variable)\n      (match\n        (variable))\n      (comment)\n      (local_binds\n        (bind\n          (variable)\n          (match\n            (variable)))))\n    (bind\n      (variable)\n      (match\n        (variable))\n      (comment)\n      (local_binds\n        (bind\n          (variable)\n          (match\n            (variable)))))\n    (bind\n      (variable)\n      (match\n        (variable))\n      (comment)\n      (local_binds\n        (bind\n          (variable)\n          (match\n            (variable)))))\n    (bind\n      (variable)\n      (match\n        (variable))\n      (local_binds\n        (bind\n          (negation\n            (integer))\n          (match\n            (variable)))))))\n\n================================================================================\nlayout: comment in empty where on next line indented\n================================================================================\n\na = a where\n  {- comment\n-}\n\na = a where\n  --\na = b\n  where\n    {- comment -}\nc = d\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (variable)))\n    (comment)\n    (bind\n      (variable)\n      (match\n        (variable)))\n    (comment)\n    (bind\n      (variable)\n      (match\n        (variable)))\n    (comment)\n    (bind\n      (variable)\n      (match\n        (variable)))))\n\n================================================================================\nlayout: module in first line\n================================================================================\nmodule A where\n\na = a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (header\n    (module\n      (module_id)))\n  (declarations\n    (bind\n      (variable)\n      (match\n        (variable)))))\n\n================================================================================\nlayout: empty line before module\n================================================================================\n\nmodule A where\n\na = a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (header\n    (module\n      (module_id)))\n  (declarations\n    (bind\n      (variable)\n      (match\n        (variable)))))\n\n================================================================================\nlayout: indented module keyword, binds further left\n================================================================================\n\n    module A where\n  a = a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (header\n    (module\n      (module_id)))\n  (declarations\n    (bind\n      (variable)\n      (match\n        (variable)))))\n\n================================================================================\nlayout: closing exports paren in column 0\n================================================================================\nmodule A (\n)\nwhere\n\na = a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (header\n    (module\n      (module_id))\n    (exports))\n  (declarations\n    (bind\n      (variable)\n      (match\n        (variable)))))\n\n================================================================================\nlayout: comment in column 0 before first decl in column 2\n================================================================================\n-- a\n  a = a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (comment)\n  (declarations\n    (bind\n      (variable)\n      (match\n        (variable)))))\n\n================================================================================\nlayout: decl in line 0\n================================================================================\na = a\na = a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (variable)))\n    (bind\n      (variable)\n      (match\n        (variable)))))\n\n================================================================================\nlayout: module with smaller indent after nonzero indent at top level\n================================================================================\nmodule A where\n-- Lenient, see end_layout_indent\n#define foo\n  data A\ninstance A\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (header\n    (module\n      (module_id)))\n  (comment)\n  (cpp)\n  (declarations\n    (data_type\n      (name))\n    (instance\n      (name))))\n\n================================================================================\nlayout: smaller indent after nonzero indent at top level\n================================================================================\n-- a\n#define foo\n  data A\ninstance A\n-- This could be an error like above, but there's no point in being strict.\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (comment)\n  (cpp)\n  (declarations\n    (data_type\n      (name))\n    (instance\n      (name))\n    (comment)))\n\n================================================================================\nlayout: end two layouts at the same position\n================================================================================\n\na = case a of\n  a -> do a\na :: a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (case\n          (variable)\n          (alternatives\n            (alternative\n              (variable)\n              (match\n                (do\n                  (exp\n                    (variable)))))))))\n    (signature\n      (variable)\n      (variable))))\n\n================================================================================\nlayout: case in a list terminated by bracket\n================================================================================\n\na = [case a of a -> a]\na = [case a of a -> a\n      ]\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (list\n          (case\n            (variable)\n            (alternatives\n              (alternative\n                (variable)\n                (match\n                  (variable))))))))\n    (bind\n      (variable)\n      (match\n        (list\n          (case\n            (variable)\n            (alternatives\n              (alternative\n                (variable)\n                (match\n                  (variable))))))))))\n\n================================================================================\nlayout: case in a list terminated by comma\n================================================================================\n\na = [case a of a -> a, a]\n\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (list\n          (case\n            (variable)\n            (alternatives\n              (alternative\n                (variable)\n                (match\n                  (variable)))))\n          (variable))))))\n\n================================================================================\nlayout: case in a list terminated by comprehension bar\n================================================================================\n\na = [case a of a -> a | a <- a]\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (list_comprehension\n          (case\n            (variable)\n            (alternatives\n              (alternative\n                (variable)\n                (match\n                  (variable)))))\n          (qualifiers\n            (generator\n              (variable)\n              (variable))))))))\n\n================================================================================\nlayout: case in an explicitly braced do terminated by brace\n================================================================================\n\na = do { case a of a -> a }\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (do\n          (exp\n            (case\n              (variable)\n              (alternatives\n                (alternative\n                  (variable)\n                  (match\n                    (variable)))))))))))\n\n================================================================================\nlayout: empty do statements with explicit braces\n================================================================================\n\na = do { ; a ;;;; a ; }\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (do\n          (exp\n            (variable))\n          (exp\n            (variable)))))))\n\n================================================================================\nlayout: empty brace layout\n================================================================================\n\na = case a of {}\na = case a of { }\na = a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (case\n          (variable)\n          (alternatives))))\n    (bind\n      (variable)\n      (match\n        (case\n          (variable)\n          (alternatives))))\n    (bind\n      (variable)\n      (match\n        (variable)))))\n\n================================================================================\nlayout: end in tuple\n================================================================================\n\na =\n  (\n    case a of\n      a -> a\n      a -> a,\n    a,\n    case a of\n      a -> a\n      a -> a\n  )\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (tuple\n          (case\n            (variable)\n            (alternatives\n              (alternative\n                (variable)\n                (match\n                  (variable)))\n              (alternative\n                (variable)\n                (match\n                  (variable)))))\n          (variable)\n          (case\n            (variable)\n            (alternatives\n              (alternative\n                (variable)\n                (match\n                  (variable)))\n              (alternative\n                (variable)\n                (match\n                  (variable))))))))))\n\n================================================================================\nlayout: do in an if block\n================================================================================\n\na = if do a; a then a else a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (conditional\n          (do\n            (exp\n              (variable))\n            (exp\n              (variable)))\n          (variable)\n          (variable))))))\n\n================================================================================\nlayout: do in an if-then block\n================================================================================\n\na = if a then do a; a else a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (conditional\n          (variable)\n          (do\n            (exp\n              (variable))\n            (exp\n              (variable)))\n          (variable))))))\n\n================================================================================\nlayout: nondecreasing indent for do in if-then\n================================================================================\n\na = do\n  a <- a\n  if a then do\n  a <- a\n  pure a\n  else a\n  a <- a\n  pure a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (do\n          (bind\n            (variable)\n            (variable))\n          (exp\n            (conditional\n              (variable)\n              (do\n                (bind\n                  (variable)\n                  (variable))\n                (exp\n                  (apply\n                    (variable)\n                    (variable))))\n              (variable)))\n          (bind\n            (variable)\n            (variable))\n          (exp\n            (apply\n              (variable)\n              (variable))))))))\n\n================================================================================\nlayout: do not emit newline semicolon if the first token is \"then\" or \"else\"\n================================================================================\n\na = do\n  a <- a\n  if a\n  then a\n  else do\n    a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (do\n          (bind\n            (variable)\n            (variable))\n          (exp\n            (conditional\n              (variable)\n              (variable)\n              (do\n                (exp\n                  (variable))))))))))\n\n================================================================================\nlayout: infix in statement position ends layout\n================================================================================\n\na = do\n  a\n  >>= a\n\na = do\n  a\n  `a` a\n\na = do\n  a\n-- a\n  >>= a\n\na = \\case\n    a ->\n      pure a\n    =<< a\n\n-- don't end here\na = \\case\n    a ->\n      a\n     =<< a\n    a -> a\n\na = do\n  a\n  {-# prag #-} >>= a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (infix\n          (do\n            (exp\n              (variable)))\n          (operator)\n          (variable))))\n    (bind\n      (variable)\n      (match\n        (infix\n          (do\n            (exp\n              (variable)))\n          (infix_id\n            (variable))\n          (variable))))\n    (bind\n      (variable)\n      (match\n        (infix\n          (do\n            (exp\n              (variable))\n            (comment))\n          (operator)\n          (variable))))\n    (bind\n      (variable)\n      (match\n        (infix\n          (lambda_case\n            (alternatives\n              (alternative\n                (variable)\n                (match\n                  (apply\n                    (variable)\n                    (variable))))))\n          (operator)\n          (variable))))\n    (comment)\n    (bind\n      (variable)\n      (match\n        (lambda_case\n          (alternatives\n            (alternative\n              (variable)\n              (match\n                (infix\n                  (variable)\n                  (operator)\n                  (variable))))\n            (alternative\n              (variable)\n              (match\n                (variable)))))))\n    (bind\n      (variable)\n      (match\n        (infix\n          (do\n            (exp\n              (variable))\n            (pragma))\n          (operator)\n          (variable))))))\n\n================================================================================\nlayout: two lines starting with m without leading newline or module\n================================================================================\nm1 :: a -> a\nm1 = a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (signature\n      (variable)\n      (function\n        (variable)\n        (variable)))\n    (bind\n      (variable)\n      (match\n        (variable)))))\n\n================================================================================\nlayout: do not end do layout with bang pattern\n================================================================================\n\na = do\n  a <- a\n  !a <- a\n  ~a <- a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (do\n          (bind\n            (variable)\n            (variable))\n          (bind\n            (strict\n              (variable))\n            (variable))\n          (bind\n            (irrefutable\n              (variable))\n            (variable)))))))\n\n================================================================================\nlayout: let/in after do\n================================================================================\n\na = do\n  let g = a\n   in a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (do\n          (exp\n            (let_in\n              (local_binds\n                (bind\n                  (variable)\n                  (match\n                    (variable))))\n              (variable))))))))\n\n================================================================================\nlayout: expr after newline in exp_in, with layout ended by \"in\" token\n================================================================================\n\na =\n  let\n    a = case a of\n      a -> a\n  in\n    a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (let_in\n          (local_binds\n            (bind\n              (variable)\n              (match\n                (case\n                  (variable)\n                  (alternatives\n                    (alternative\n                      (variable)\n                      (match\n                        (variable))))))))\n          (variable))))))\n\n================================================================================\nlayout: instance after where, triggers rule for \"in\" token\n================================================================================\n\nclass A where\n\ninstance A\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (class\n      (name))\n    (instance\n      (name))))\n\n================================================================================\nlayout: carriage return\n================================================================================\n\na = a\na = a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (variable)))\n    (bind\n      (variable)\n      (match\n        (variable)))))\n\n================================================================================\nlayout: error: unparenthesized multi-way if in list comprehension result\n================================================================================\n\na = [if | a -> a | a <- a]\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (list\n          (ERROR\n            (match\n              (guards\n                (boolean\n                  (variable)))\n              (variable))\n            (guards\n              (pattern_guard\n                (variable)\n                (variable)))))))))\n\n================================================================================\nlayout: newline after record brace in pattern\n================================================================================\n\na = \\case\n  A{}\n      -> a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (lambda_case\n          (alternatives\n            (alternative\n              (record\n                (constructor))\n              (match\n                (variable)))))))))\n\n================================================================================\nlayout: signature with function arrow on new line with two chars of indent\n================================================================================\n\na :: A\n  -> A\na = a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (signature\n      (variable)\n      (function\n        (name)\n        (name)))\n    (bind\n      (variable)\n      (match\n        (variable)))))\n\n================================================================================\nlayout: same indent is permitted for multi-way if\n================================================================================\n\na = if\n    |\n    a\n    ->\n    a\n  a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (apply\n          (multi_way_if\n            (match\n              (guards\n                (boolean\n                  (variable)))\n              (variable)))\n          (variable))))))\n\n================================================================================\nlayout: close layout in guard at comma\n================================================================================\n\na\n  | case a of\n      _ -> a,\n    a\n  = a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (guards\n          (boolean\n            (case\n              (variable)\n              (alternatives\n                (alternative\n                  (wildcard)\n                  (match\n                    (variable))))))\n          (boolean\n            (variable)))\n        (variable)))))\n\n================================================================================\nlayout: obscure canary for pat prec bugs\n================================================================================\n\na = do\n  a a\n\na :: A (A [(A, A)])\na = a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (do\n          (exp\n            (apply\n              (variable)\n              (variable))))))\n    (signature\n      (variable)\n      (apply\n        (name)\n        (parens\n          (apply\n            (name)\n            (list\n              (tuple\n                (name)\n                (name)))))))\n    (bind\n      (variable)\n      (match\n        (variable)))))\n\n================================================================================\nlayout: bar operator in case layout in texp\n================================================================================\n\na = (\n    case a of\n      a -> a || a\n      a -> a\n  )\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (parens\n          (case\n            (variable)\n            (alternatives\n              (alternative\n                (variable)\n                (match\n                  (infix\n                    (variable)\n                    (operator)\n                    (variable))))\n              (alternative\n                (variable)\n                (match\n                  (variable))))))))))\n\n================================================================================\nlayout: unboxed texp\n================================================================================\n\na = (# a, case a of\n  a -> a #)\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (unboxed_tuple\n          (variable)\n          (case\n            (variable)\n            (alternatives\n              (alternative\n                (variable)\n                (match\n                  (variable))))))))))\n\n================================================================================\nlayout: only end on bar if guard is not valid\n================================================================================\n\na =\n  [case a of\n    a | a -> a\n      | a -> a,\n   a]\n\n---\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (list\n          (case\n            (variable)\n            (alternatives\n              (alternative\n                (variable)\n                (match\n                  (guards\n                    (boolean\n                      (variable)))\n                  (variable))\n                (match\n                  (guards\n                    (boolean\n                      (variable)))\n                  (variable)))))\n          (variable))))\n    (comment)))\n\n================================================================================\nlayout: closing brace before cpp else\n================================================================================\n\n#if a\na = case a of {}\n#else\na = a\n#endif\n\na = a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (cpp)\n  (declarations\n    (bind\n      (variable)\n      (match\n        (case\n          (variable)\n          (alternatives))))\n    (cpp)\n    (cpp)\n    (bind\n      (variable)\n      (match\n        (variable)))))\n\n================================================================================\nlayout: brace layout in virtual layout ending at the same position\n================================================================================\n\na = do\n  a do {\n    a\n  }\n\na = a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (do\n          (exp\n            (apply\n              (variable)\n              (do\n                (exp\n                  (variable))))))))\n    (bind\n      (variable)\n      (match\n        (variable)))))\n\n================================================================================\nlayout: strict data field after newline\n================================================================================\n\ndata A =\n  A\n  !A\n  ~A\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (data_type\n      (name)\n      (data_constructors\n        (data_constructor\n          (prefix\n            (constructor)\n            (strict_field\n              (name))\n            (lazy_field\n              (name))))))))\n\n================================================================================\nlayout: splice in do statement\n================================================================================\n\na = do\n  $a\n  a <- a\n  $$a\n  a <- a\n  a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (do\n          (exp\n            (splice\n              (variable)))\n          (bind\n            (variable)\n            (variable))\n          (exp\n            (splice\n              (variable)))\n          (bind\n            (variable)\n            (variable))\n          (exp\n            (variable)))))))\n\n================================================================================\nlayout: modifier at start of line\n================================================================================\n\na :: a\n  %1 ->\n  a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (signature\n      (variable)\n      (linear_function\n        (variable)\n        (modifier\n          (literal\n            (integer)))\n        (variable)))))\n\n================================================================================\nlayout: composition dot after newline\n================================================================================\n\na =\n  a\n  .\n  a\n\na = (\n  a\n  .\n  a\n  )\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (infix\n          (variable)\n          (operator)\n          (variable))))\n    (bind\n      (variable)\n      (match\n        (parens\n          (infix\n            (variable)\n            (operator)\n            (variable)))))))\n\n================================================================================\nlayout: comment before module without newline\n================================================================================\n{- a -} module A where\n\na = a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (comment)\n  (header\n    (module\n      (module_id)))\n  (declarations\n    (bind\n      (variable)\n      (match\n        (variable)))))\n\n================================================================================\nlayout: pragma, module, import\n================================================================================\n{-# language NoHaskell #-}\nmodule A where\nimport A\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (pragma)\n  (header\n    (module\n      (module_id)))\n  (imports\n    (import\n      (module\n        (module_id)))))\n\n================================================================================\nlayout: newline, pragma, module, import\n================================================================================\n\n{-# language NoHaskell #-}\nmodule A where\nimport A\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (pragma)\n  (header\n    (module\n      (module_id)))\n  (imports\n    (import\n      (module\n        (module_id)))))\n\n================================================================================\nlayout: function starting with special token\n================================================================================\n\n-- Newline lookahead has a special case for 'then' and 'else', which has the\n-- potential to prevent a semi\na = a\nthen' = a\nelsex = a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (comment)\n  (declarations\n    (bind\n      (variable)\n      (match\n        (variable)))\n    (bind\n      (variable)\n      (match\n        (variable)))\n    (bind\n      (variable)\n      (match\n        (variable)))))\n\n================================================================================\nlayout: case in let, single line\n================================================================================\n\na = let a = case a of a -> a in a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (let_in\n          (local_binds\n            (bind\n              (variable)\n              (match\n                (case\n                  (variable)\n                  (alternatives\n                    (alternative\n                      (variable)\n                      (match\n                        (variable))))))))\n          (variable))))))\n\n================================================================================\nlayout: do in case in nested let, single line\n================================================================================\n\na = let a = let a = case a of a -> do a in a in a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (let_in\n          (local_binds\n            (bind\n              (variable)\n              (match\n                (let_in\n                  (local_binds\n                    (bind\n                      (variable)\n                      (match\n                        (case\n                          (variable)\n                          (alternatives\n                            (alternative\n                              (variable)\n                              (match\n                                (do\n                                  (exp\n                                    (variable))))))))))\n                  (variable)))))\n          (variable))))))\n\n================================================================================\nlayout: \"the\" at end of file\n================================================================================\na =\n  the\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (variable)))))\n\n================================================================================\nlayout: obscure case where eof layout end happens prematurely without no_lookahead check\n================================================================================\n\na =\n  a\n  where a = do\n            let a = a\n            a\n          `a` if a then a else a e\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (variable))\n      (local_binds\n        (bind\n          (variable)\n          (match\n            (infix\n              (do\n                (let\n                  (local_binds\n                    (bind\n                      (variable)\n                      (match\n                        (variable)))))\n                (exp\n                  (variable)))\n              (infix_id\n                (variable))\n              (conditional\n                (variable)\n                (variable)\n                (apply\n                  (variable)\n                  (variable))))))))))\n\n================================================================================\nlayout: space at eof\n================================================================================\n-- This test only has a purpose when looking at scanner debug output.\n-- If we don't mark after skipped space at eof, the scanner gets called again.\nmodule A where\na = a   \n--------------------------------------------------------------------------------\n\n(haskell\n  (comment)\n  (header\n    (module\n      (module_id)))\n  (declarations\n    (bind\n      (variable)\n      (match\n        (variable)))))\n\n================================================================================\nlayout: braces on new line\n================================================================================\n\na = do\n  { a }\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (do\n          (exp\n            (variable)))))))\n\n================================================================================\nlayout: allow any indent nested in brace layout\n================================================================================\n\na = do do { case a of\n  a -> a\n  }\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (do\n          (exp\n            (do\n              (exp\n                (case\n                  (variable)\n                  (alternatives\n                    (alternative\n                      (variable)\n                      (match\n                        (variable)))))))))))))\n\n================================================================================\nlayout: let guard in decl\n================================================================================\n\na | let a = a = a\na | let a = a == a = a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (guards\n          (let\n            (local_binds\n              (bind\n                (variable)\n                (match\n                  (variable))))))\n        (variable)))\n    (bind\n      (variable)\n      (match\n        (guards\n          (let\n            (local_binds\n              (bind\n                (variable)\n                (match\n                  (infix\n                    (variable)\n                    (operator)\n                    (variable)))))))\n        (variable)))))\n\n================================================================================\nlayout: do expr in guard\n================================================================================\n\na | do a = a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (guards\n          (boolean\n            (do\n              (exp\n                (variable)))))\n        (variable)))))\n\n================================================================================\nlayout: case in guard\n================================================================================\n\na | case a of a -> a = a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (guards\n          (boolean\n            (case\n              (variable)\n              (alternatives\n                (alternative\n                  (variable)\n                  (match\n                    (variable)))))))\n        (variable)))))\n\n================================================================================\nlayout: multi-way if in guard\n================================================================================\n\na | if | a -> a = a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (guards\n          (boolean\n            (multi_way_if\n              (match\n                (guards\n                  (boolean\n                    (variable)))\n                (variable)))))\n        (variable)))))\n\n================================================================================\nlayout: let guard in case\n================================================================================\n\na = case a of\n  a | let a = a -> a\n\na = case a of\n  a | let a = a → a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (case\n          (variable)\n          (alternatives\n            (alternative\n              (variable)\n              (match\n                (guards\n                  (let\n                    (local_binds\n                      (bind\n                        (variable)\n                        (match\n                          (variable))))))\n                (variable)))))))\n    (bind\n      (variable)\n      (match\n        (case\n          (variable)\n          (alternatives\n            (alternative\n              (variable)\n              (match\n                (guards\n                  (let\n                    (local_binds\n                      (bind\n                        (variable)\n                        (match\n                          (variable))))))\n                (variable)))))))))\n\n================================================================================\nlayout: signature with arrow in let in texp\n================================================================================\n\na = (let a :: a -> a in a)\na = (let a :: ∀ a -> a -> a in a)\na = (let (a -> a) = a in a)\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (parens\n          (let_in\n            (local_binds\n              (signature\n                (variable)\n                (function\n                  (variable)\n                  (variable))))\n            (variable)))))\n    (bind\n      (variable)\n      (match\n        (parens\n          (let_in\n            (local_binds\n              (signature\n                (variable)\n                (forall_required\n                  (quantified_variables\n                    (variable))\n                  (function\n                    (variable)\n                    (variable)))))\n            (variable)))))\n    (bind\n      (variable)\n      (match\n        (parens\n          (let_in\n            (local_binds\n              (bind\n                (parens\n                  (view_pattern\n                    (variable)\n                    (variable)))\n                (match\n                  (variable))))\n            (variable)))))))\n\n================================================================================\nlayout: guard bar ends layout at the same indent\n================================================================================\n\na\n  | a = do\n  let a = a\n  a\n\n  | a = a\n\na =\n  a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (guards\n          (boolean\n            (variable)))\n        (do\n          (let\n            (local_binds\n              (bind\n                (variable)\n                (match\n                  (variable)))))\n          (exp\n            (variable))))\n      (match\n        (guards\n          (boolean\n            (variable)))\n        (variable)))\n    (bind\n      (variable)\n      (match\n        (variable)))))\n\n================================================================================\nlayout: symop dot ends layout\n================================================================================\n\na = do\n  a\n  . a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (infix\n          (do\n            (exp\n              (variable)))\n          (operator)\n          (variable))))))\n\n================================================================================\nlayout: symop hash ends layout\n================================================================================\n\na = do\n  a\n  # a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (infix\n          (do\n            (exp\n              (variable)))\n          (operator)\n          (variable))))))\n\n================================================================================\nlayout: do in then branch in another do with else in indent column\n================================================================================\n\na = do\n    if a then do a\n    else a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (do\n          (exp\n            (conditional\n              (variable)\n              (do\n                (exp\n                  (variable)))\n              (variable))))))))\n\n================================================================================\nlayout: explicit semicolon between topdecls\n================================================================================\n\na = a;\na = a; a = a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (variable)))\n    (bind\n      (variable)\n      (match\n        (variable)))\n    (bind\n      (variable)\n      (match\n        (variable)))))\n\n================================================================================\nlayout: semicolon after last statement in do\n================================================================================\n\na = do a;\na = a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (do\n          (exp\n            (variable)))))\n    (bind\n      (variable)\n      (match\n        (variable)))))\n\n================================================================================\nlayout: do-let layout ended by indent of next statement with leading semicolon\n================================================================================\n\na = do\n  ; let a = a\n  ; a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (do\n          (let\n            (local_binds\n              (bind\n                (variable)\n                (match\n                  (variable)))))\n          (exp\n            (variable)))))))\n\n================================================================================\nlayout: random indent with leading semicolons in do\n================================================================================\n\na = do\n  ; a\n      ; a ; a\n    ; a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (do\n          (exp\n            (variable))\n          (exp\n            (variable))\n          (exp\n            (variable))\n          (exp\n            (variable)))))))\n\n================================================================================\nlayout: pragmas, cpp, then module\n================================================================================\n{-# prag #-}\n#include \"a\"\nmodule A (A (..)) where\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (pragma)\n  (cpp)\n  (header\n    (module\n      (module_id))\n    (exports\n      (export\n        (name)\n        (children\n          (all_names))))))\n\n================================================================================\nlayout: semicolon at beginning of file\n================================================================================\n;\n\na = a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (variable)))))\n\n================================================================================\nlayout: semicolon before imports\n================================================================================\nmodule A where\n;\nimport A\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (header\n    (module\n      (module_id)))\n  (imports\n    (import\n      (module\n        (module_id)))))\n\n================================================================================\nlayout: brace layout after comment\n================================================================================\n\na = do\n  {- -} {\n    a <- a\n  }\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (do\n          (comment)\n          (bind\n            (variable)\n            (variable)))))))\n\n================================================================================\nlayout: brace layout after pragma\n================================================================================\n\na = do\n  {-# prag #-} {\n    a <- a\n  }\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (do\n          (pragma)\n          (bind\n            (variable)\n            (variable)))))))\n\n================================================================================\nlayout: brace layout in first column\n================================================================================\n{\na = a\n}\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (variable)))))\n\n================================================================================\nlayout: empty brace alternatives separated from case by comment\n================================================================================\n\na = case a of\n  -- a\n  {}\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (case\n          (variable)\n          (comment)\n          (alternatives))))))\n\n================================================================================\nlayout: comment before multi-way if bar on newline\n================================================================================\n\n-- This is only relevant for the scanner –` `newline_lookahead sets a flag when\n-- encountering the bar, which is read by `start_layout_newline` to decide that\n-- an MWI layout is valid and emit it right away, rather than deferring to the\n-- next run with `interior`.\na = if\n  {- a -} | a -> a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (comment)\n  (declarations\n    (bind\n      (variable)\n      (match\n        (multi_way_if\n          (comment)\n          (match\n            (guards\n              (boolean\n                (variable)))\n            (variable)))))))\n\n================================================================================\nlayout: block comment at eof without newline\n================================================================================\na = a {-\na -}\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (variable))))\n  (comment))\n\n================================================================================\nlayout: unicode whitespace\n================================================================================\n\na = case a of\n                 a -> a\n-- This line's leading whitespace consists of all 17 code points of the General\n-- Category Zs.\n-- Take care not to replace them! (This should probably be a generated test)\n-- That dash character is the Ogham Space Mark, and the last character is extra\n-- wide.\n                　a -> a\n                 a -> a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (case\n          (variable)\n          (alternatives\n            (alternative\n              (variable)\n              (match\n                (variable)))\n            (comment)\n            (alternative\n              (variable)\n              (match\n                (variable)))\n            (alternative\n              (variable)\n              (match\n                (variable)))))))))\n\n================================================================================\nlayout: inline braces followed by layout semicolon\n================================================================================\n\na = case a of { a -> a; }\n\na = a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (case\n          (variable)\n          (alternatives\n            (alternative\n              (variable)\n              (match\n                (variable)))))))\n    (bind\n      (variable)\n      (match\n        (variable)))))\n\n================================================================================\nlayout: nonzero toplevel indent\n================================================================================\n\n  a = a\n  a = a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (variable)))\n    (bind\n      (variable)\n      (match\n        (variable)))))\n\n================================================================================\nlayout: comment after semicolon\n================================================================================\n\na :: a; -- a\na :: a; {- a\n-}\na = a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (signature\n      (variable)\n      (variable))\n    (comment)\n    (signature\n      (variable)\n      (variable))\n    (comment)\n    (bind\n      (variable)\n      (match\n        (variable)))))\n\n================================================================================\nlayout: comment and pragma after semicolon with following layout element\n================================================================================\n\nx = let\n  a = 1; b = 2\n  c = 3; {- x -}\n  d = 4; {- x -} e = 5\n  f = 6; {-# x #-}\n  g = 7; {-# x #-} h = 8\n  i = 9\n  in c\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (let_in\n          (local_binds\n            (bind\n              (variable)\n              (match\n                (literal\n                  (integer))))\n            (bind\n              (variable)\n              (match\n                (literal\n                  (integer))))\n            (bind\n              (variable)\n              (match\n                (literal\n                  (integer))))\n            (comment)\n            (bind\n              (variable)\n              (match\n                (literal\n                  (integer))))\n            (comment)\n            (bind\n              (variable)\n              (match\n                (literal\n                  (integer))))\n            (bind\n              (variable)\n              (match\n                (literal\n                  (integer))))\n            (pragma)\n            (bind\n              (variable)\n              (match\n                (literal\n                  (integer))))\n            (pragma)\n            (bind\n              (variable)\n              (match\n                (literal\n                  (integer))))\n            (bind\n              (variable)\n              (match\n                (literal\n                  (integer)))))\n          (variable))))))\n\n================================================================================\nlayout: list pattern in let\n================================================================================\n\na = let [a] = a\n    in a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (let_in\n          (local_binds\n            (bind\n              (list\n                (variable))\n              (match\n                (variable))))\n          (variable))))))\n\n================================================================================\nlayout: instance after splice in expression splice\n================================================================================\n\na $(a)\n\ninstance A where\n  type A = A\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (top_splice\n      (apply\n        (variable)\n        (splice\n          (parens\n            (variable)))))\n    (instance\n      (name)\n      (instance_declarations\n        (type_instance\n          (name)\n          (name))))))\n\n================================================================================\nlayout: comment containing tab exceeding layout indent\n================================================================================\n\na = a\n  where\n            a = a\n{- a\t -} a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (variable))\n      (local_binds\n        (bind\n          (variable)\n          (match\n            (apply\n              (variable)\n              (comment)\n              (variable))))))))\n"
  },
  {
    "path": "test/corpus/module.txt",
    "content": "================================================================================\nmodule: exports empty\n================================================================================\n\nmodule A () where\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (header\n    (module\n      (module_id))\n    (exports)))\n\n================================================================================\nmodule: exports regular\n================================================================================\n\nmodule A (\n  a',\n  A,\n  A(),\n  A(..),\n  A(a, a),\n) where\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (header\n    (module\n      (module_id))\n    (exports\n      (export\n        (variable))\n      (export\n        (name))\n      (export\n        (name)\n        (children))\n      (export\n        (name)\n        (children\n          (all_names)))\n      (export\n        (name)\n        (children\n          (variable)\n          (variable))))))\n\n================================================================================\nmodule: exports symbolic\n================================================================================\n\nmodule A (\n  (<>)((:<>), A),\n  (:++),\n) where\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (header\n    (module\n      (module_id))\n    (exports\n      (export\n        (prefix_id\n          (operator))\n        (children\n          (prefix_id\n            (constructor_operator))\n          (constructor)))\n      (export\n        (prefix_id\n          (constructor_operator))))))\n\n================================================================================\nmodule: exports type\n================================================================================\n\nmodule A (\n  type A,\n  type (<>),\n  type (:++),\n) where\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (header\n    (module\n      (module_id))\n    (exports\n      (export\n        (namespace)\n        (name))\n      (export\n        (namespace)\n        (prefix_id\n          (operator)))\n      (export\n        (namespace)\n        (prefix_id\n          (constructor_operator))))))\n\n================================================================================\nmodule: exports pattern\n================================================================================\n\nmodule A (\n  pattern A,\n  pattern (<>),\n  A (.., a, ..),\n) where\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (header\n    (module\n      (module_id))\n    (exports\n      (export\n        (namespace)\n        (name))\n      (export\n        (namespace)\n        (prefix_id\n          (operator)))\n      (export\n        (name)\n        (children\n          (all_names)\n          (variable)\n          (all_names))))))\n\n================================================================================\nmodule: exports module\n================================================================================\n\nmodule A (\n  a,\n  module A,\n  module A.A.A,\n) where\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (header\n    (module\n      (module_id))\n    (exports\n      (export\n        (variable))\n      (module_export\n        (module\n          (module_id)))\n      (module_export\n        (module\n          (module_id)\n          (module_id)\n          (module_id))))))\n\n================================================================================\nmodule: exports qualified\n================================================================================\n\nmodule A (\n  A.A.a,\n  type (A.A.++),\n  type (A.A.:++),\n  A.A.A,\n  A.A.A((<=<), (:++), A, a),\n  type A.A((>>), A),\n  pattern A.A((>>), A),\n) where\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (header\n    (module\n      (module_id))\n    (exports\n      (export\n        (qualified\n          (module\n            (module_id)\n            (module_id))\n          (variable)))\n      (export\n        (namespace)\n        (prefix_id\n          (qualified\n            (module\n              (module_id)\n              (module_id))\n            (operator))))\n      (export\n        (namespace)\n        (prefix_id\n          (qualified\n            (module\n              (module_id)\n              (module_id))\n            (constructor_operator))))\n      (export\n        (qualified\n          (module\n            (module_id)\n            (module_id))\n          (name)))\n      (export\n        (qualified\n          (module\n            (module_id)\n            (module_id))\n          (name))\n        (children\n          (prefix_id\n            (operator))\n          (prefix_id\n            (constructor_operator))\n          (constructor)\n          (variable)))\n      (export\n        (namespace)\n        (qualified\n          (module\n            (module_id))\n          (name))\n        (children\n          (prefix_id\n            (operator))\n          (constructor)))\n      (export\n        (namespace)\n        (qualified\n          (module\n            (module_id))\n          (name))\n        (children\n          (prefix_id\n            (operator))\n          (constructor))))))\n\n================================================================================\nmodule: exports zero indent\n================================================================================\nmodule A (\nA\n, a,\nA\n) where\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (header\n    (module\n      (module_id))\n    (exports\n      (export\n        (name))\n      (export\n        (variable))\n      (export\n        (name)))))\n\n================================================================================\nmodule: qualified\n================================================================================\n\nmodule A.A'.A where\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (header\n    (module\n      (module_id)\n      (module_id)\n      (module_id))))\n\n================================================================================\nmodule: export minus\n================================================================================\n\nmodule A (type (-), (-)) where\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (header\n    (module\n      (module_id))\n    (exports\n      (export\n        (namespace)\n        (prefix_id\n          (operator)))\n      (export\n        (prefix_id\n          (operator))))))\n\n================================================================================\nmodule: export dot\n================================================================================\n\nmodule A (type (.), (.)) where\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (header\n    (module\n      (module_id))\n    (exports\n      (export\n        (namespace)\n        (prefix_id\n          (operator)))\n      (export\n        (prefix_id\n          (operator))))))\n\n================================================================================\nmodule: no trailing comma\n================================================================================\n\nmodule A (\n  A,\n  A\n) where\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (header\n    (module\n      (module_id))\n    (exports\n      (export\n        (name))\n      (export\n        (name)))))\n\n================================================================================\nmodule: namespace for type child\n================================================================================\n\nmodule A (\n  A (type A, A, ..)\n) where\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (header\n    (module\n      (module_id))\n    (exports\n      (export\n        (name)\n        (children\n          (associated_type\n            (name))\n          (constructor)\n          (all_names))))))\n"
  },
  {
    "path": "test/corpus/newtype.txt",
    "content": "================================================================================\nnewtype: basic\n================================================================================\n\nnewtype A = A A\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (newtype\n      (name)\n      (newtype_constructor\n        (constructor)\n        (field\n          (name))))))\n\n================================================================================\nnewtype: context\n================================================================================\n\nnewtype A a => A a = A a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (newtype\n      (context\n        (apply\n          (name)\n          (variable)))\n      (name)\n      (type_params\n        (variable))\n      (newtype_constructor\n        (constructor)\n        (field\n          (variable))))))\n\n================================================================================\nnewtype: record\n================================================================================\n\nnewtype A = A { a :: A a }\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (newtype\n      (name)\n      (newtype_constructor\n        (constructor)\n        (record\n          (field\n            (field_name\n              (variable))\n            (apply\n              (name)\n              (variable))))))))\n\n================================================================================\nnewtype: tyvar kind\n================================================================================\n\nnewtype A a (a :: [* -> *]) a =\n  A a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (newtype\n      (name)\n      (type_params\n        (variable)\n        (parens\n          (annotated\n            (variable)\n            (list\n              (function\n                (star)\n                (star)))))\n        (variable))\n      (newtype_constructor\n        (constructor)\n        (field\n          (variable))))))\n\n================================================================================\nnewtype: deriving\n================================================================================\n\nnewtype A = A a deriving A\nnewtype A a =\n  A { a :: A }\n  deriving (A, A)\n  deriving newtype A\n  deriving A via (A a)\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (newtype\n      (name)\n      (newtype_constructor\n        (constructor)\n        (field\n          (variable)))\n      (deriving\n        (name)))\n    (newtype\n      (name)\n      (type_params\n        (variable))\n      (newtype_constructor\n        (constructor)\n        (record\n          (field\n            (field_name\n              (variable))\n            (name))))\n      (deriving\n        (tuple\n          (name)\n          (name)))\n      (deriving\n        (deriving_strategy)\n        (name))\n      (deriving\n        (name)\n        (via\n          (parens\n            (apply\n              (name)\n              (variable))))))))\n\n================================================================================\nnewtype: unlifted\n================================================================================\n\nnewtype A :: TYPE 'A where\n  A :: A# -> A\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (newtype\n      (name)\n      (apply\n        (name)\n        (promoted\n          (constructor)))\n      (gadt_constructors\n        (gadt_constructor\n          (constructor)\n          (prefix\n            (function\n              (name)\n              (name))))))))\n\n================================================================================\nnewtype: prefix operator\n================================================================================\n\nnewtype (++) a = (:++) a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (newtype\n      (prefix_id\n        (operator))\n      (type_params\n        (variable))\n      (newtype_constructor\n        (prefix_id\n          (constructor_operator))\n        (field\n          (variable))))))\n"
  },
  {
    "path": "test/corpus/number.txt",
    "content": "================================================================================\nnumber: decimal\n================================================================================\n\na = 0\na = 100_00_532\na = 55#\na = 55##\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (literal\n          (integer))))\n    (bind\n      (variable)\n      (match\n        (literal\n          (integer))))\n    (bind\n      (variable)\n      (match\n        (literal\n          (integer))))\n    (bind\n      (variable)\n      (match\n        (literal\n          (integer))))))\n\n================================================================================\nnumber: octal\n================================================================================\n\na = 0o00\na = 0O77\na = 0O77##\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (literal\n          (integer))))\n    (bind\n      (variable)\n      (match\n        (literal\n          (integer))))\n    (bind\n      (variable)\n      (match\n        (literal\n          (integer))))))\n\n================================================================================\nnumber: hex\n================================================================================\n\na = 0xA8\na = 0XEF84Fe23\na = 0xa_e_123_4\na = 0xa_e_123_4##\na = 0x0.1p-4\na = 0xFp3\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (literal\n          (integer))))\n    (bind\n      (variable)\n      (match\n        (literal\n          (integer))))\n    (bind\n      (variable)\n      (match\n        (literal\n          (integer))))\n    (bind\n      (variable)\n      (match\n        (literal\n          (integer))))\n    (bind\n      (variable)\n      (match\n        (literal\n          (integer))))\n    (bind\n      (variable)\n      (match\n        (literal\n          (integer))))))\n\n================================================================================\nnumber: float\n================================================================================\n\na = 0.32847283472\na = 0.00e01\na = 0.00e01#\na = 0.00e+01\na = 0.99E-01\na = 00e01\na = 00e+01\na = 99E-01\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (literal\n          (float))))\n    (bind\n      (variable)\n      (match\n        (literal\n          (float))))\n    (bind\n      (variable)\n      (match\n        (literal\n          (float))))\n    (bind\n      (variable)\n      (match\n        (literal\n          (float))))\n    (bind\n      (variable)\n      (match\n        (literal\n          (float))))\n    (bind\n      (variable)\n      (match\n        (literal\n          (float))))\n    (bind\n      (variable)\n      (match\n        (literal\n          (float))))\n    (bind\n      (variable)\n      (match\n        (literal\n          (float))))))\n\n================================================================================\nnumber: binary\n================================================================================\n\na = 0b01110\na = 0B10010\na = 0B10010##\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (literal\n          (integer))))\n    (bind\n      (variable)\n      (match\n        (literal\n          (integer))))\n    (bind\n      (variable)\n      (match\n        (literal\n          (integer))))))\n"
  },
  {
    "path": "test/corpus/pat.txt",
    "content": "================================================================================\npat: basic\n================================================================================\n\na a (a:a : as) (a, a, (a, [a])) = a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  declarations: (declarations\n    (function\n      name: (variable)\n      patterns: (patterns\n        (variable)\n        (parens\n          pattern: (infix\n            left_operand: (variable)\n            operator: (constructor_operator)\n            right_operand: (infix\n              left_operand: (variable)\n              operator: (constructor_operator)\n              right_operand: (variable))))\n        (tuple\n          element: (variable)\n          element: (variable)\n          element: (tuple\n            element: (variable)\n            element: (list\n              element: (variable)))))\n      match: (match\n        expression: (variable)))))\n\n================================================================================\npat: con simple\n================================================================================\n\na A = a\na (A a) = a\na (A A A) = a\na (A a A (A a a A a)) = a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (function\n      (variable)\n      (patterns\n        (constructor))\n      (match\n        (variable)))\n    (function\n      (variable)\n      (patterns\n        (parens\n          (apply\n            (constructor)\n            (variable))))\n      (match\n        (variable)))\n    (function\n      (variable)\n      (patterns\n        (parens\n          (apply\n            (apply\n              (constructor)\n              (constructor))\n            (constructor))))\n      (match\n        (variable)))\n    (function\n      (variable)\n      (patterns\n        (parens\n          (apply\n            (apply\n              (apply\n                (constructor)\n                (variable))\n              (constructor))\n            (parens\n              (apply\n                (apply\n                  (apply\n                    (apply\n                      (constructor)\n                      (variable))\n                    (variable))\n                  (constructor))\n                (variable))))))\n      (match\n        (variable)))))\n\n================================================================================\npat: consym\n================================================================================\n\na (a :++ a) = a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (function\n      (variable)\n      (patterns\n        (parens\n          (infix\n            (variable)\n            (constructor_operator)\n            (variable))))\n      (match\n        (variable)))))\n\n================================================================================\npat: as\n================================================================================\n\na a@(A a) a@(A a) = a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (function\n      (variable)\n      (patterns\n        (as\n          (variable)\n          (parens\n            (apply\n              (constructor)\n              (variable))))\n        (as\n          (variable)\n          (parens\n            (apply\n              (constructor)\n              (variable)))))\n      (match\n        (variable)))))\n\n================================================================================\npat: wildcard\n================================================================================\n\na (A _) _ a@_ a@(!_) a@(~_) = a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (function\n      (variable)\n      (patterns\n        (parens\n          (apply\n            (constructor)\n            (wildcard)))\n        (wildcard)\n        (as\n          (variable)\n          (wildcard))\n        (as\n          (variable)\n          (parens\n            (strict\n              (wildcard))))\n        (as\n          (variable)\n          (parens\n            (irrefutable\n              (wildcard)))))\n      (match\n        (variable)))))\n\n================================================================================\npat: literal\n================================================================================\n\na 1 2 = 3\na \"a\" \"a\" = a\na 'a' 'b' = a\na 1.0 2.0 = 3.0\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (function\n      (variable)\n      (patterns\n        (literal\n          (integer))\n        (literal\n          (integer)))\n      (match\n        (literal\n          (integer))))\n    (function\n      (variable)\n      (patterns\n        (literal\n          (string))\n        (literal\n          (string)))\n      (match\n        (variable)))\n    (function\n      (variable)\n      (patterns\n        (literal\n          (char))\n        (literal\n          (char)))\n      (match\n        (variable)))\n    (function\n      (variable)\n      (patterns\n        (literal\n          (float))\n        (literal\n          (float)))\n      (match\n        (literal\n          (float))))))\n\n================================================================================\npat: record\n================================================================================\n\nf A {} = a\nf A {..} = a\nf a@A { a = a, b = a, a, .. } = a\nf !A {} = a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (function\n      (variable)\n      (patterns\n        (record\n          (constructor)))\n      (match\n        (variable)))\n    (function\n      (variable)\n      (patterns\n        (record\n          (constructor)\n          (field_pattern\n            (wildcard))))\n      (match\n        (variable)))\n    (function\n      (variable)\n      (patterns\n        (as\n          (variable)\n          (record\n            (constructor)\n            (field_pattern\n              (field_name\n                (variable))\n              (variable))\n            (field_pattern\n              (field_name\n                (variable))\n              (variable))\n            (field_pattern\n              (field_name\n                (variable)))\n            (field_pattern\n              (wildcard)))))\n      (match\n        (variable)))\n    (function\n      (variable)\n      (patterns\n        (strict\n          (record\n            (constructor))))\n      (match\n        (variable)))))\n\n================================================================================\npat: zero indent record\n================================================================================\n\na =\n  do\n    A {\na = a\n, a = a,\na, ..\n} <- a\n    a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (do\n          (bind\n            (record\n              (constructor)\n              (field_pattern\n                (field_name\n                  (variable))\n                (variable))\n              (field_pattern\n                (field_name\n                  (variable))\n                (variable))\n              (field_pattern\n                (field_name\n                  (variable)))\n              (field_pattern\n                (wildcard)))\n            (variable))\n          (exp\n            (variable)))))))\n\n================================================================================\npat: strict\n================================================================================\n\na !a = a\na !(!a) = a\na !(!(a, a), a) ![_] !_ = a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (function\n      (variable)\n      (patterns\n        (strict\n          (variable)))\n      (match\n        (variable)))\n    (function\n      (variable)\n      (patterns\n        (strict\n          (parens\n            (strict\n              (variable)))))\n      (match\n        (variable)))\n    (function\n      (variable)\n      (patterns\n        (strict\n          (tuple\n            (strict\n              (tuple\n                (variable)\n                (variable)))\n            (variable)))\n        (strict\n          (list\n            (wildcard)))\n        (strict\n          (wildcard)))\n      (match\n        (variable)))))\n\n================================================================================\npat: irrefutable\n================================================================================\n\na ~a = a\na ~(~a) = a\na ~(~(a, a), a) ~[_] ~_ = a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (function\n      (variable)\n      (patterns\n        (irrefutable\n          (variable)))\n      (match\n        (variable)))\n    (function\n      (variable)\n      (patterns\n        (irrefutable\n          (parens\n            (irrefutable\n              (variable)))))\n      (match\n        (variable)))\n    (function\n      (variable)\n      (patterns\n        (irrefutable\n          (tuple\n            (irrefutable\n              (tuple\n                (variable)\n                (variable)))\n            (variable)))\n        (irrefutable\n          (list\n            (wildcard)))\n        (irrefutable\n          (wildcard)))\n      (match\n        (variable)))))\n\n================================================================================\npat: view pattern in argument patterns\n================================================================================\n\na (a a -> Aa a a) = a\na (a -> a, a -> a) = a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (function\n      (variable)\n      (patterns\n        (parens\n          (view_pattern\n            (apply\n              (variable)\n              (variable))\n            (apply\n              (apply\n                (constructor)\n                (variable))\n              (variable)))))\n      (match\n        (variable)))\n    (function\n      (variable)\n      (patterns\n        (tuple\n          (view_pattern\n            (variable)\n            (variable))\n          (view_pattern\n            (variable)\n            (variable))))\n      (match\n        (variable)))))\n\n================================================================================\npat: view pattern in lambda\n================================================================================\n\na = \\ (a -> a) -> a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (lambda\n          (patterns\n            (parens\n              (view_pattern\n                (variable)\n                (variable))))\n          (variable))))))\n\n================================================================================\npat: parenthesized record\n================================================================================\n\na (A{}) = a\n\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (function\n      (variable)\n      (patterns\n        (parens\n          (record\n            (constructor))))\n      (match\n        (variable)))))\n\n================================================================================\npat: guards\n================================================================================\n\na a | a < 1, a > 1 = A\n    | A (A A {..} _) : a <- a = A\n    | otherwise = A\n\n--------------------------------------------------------------------------------\n\n(haskell\n  declarations: (declarations\n    (function\n      name: (variable)\n      patterns: (patterns\n        (variable))\n      match: (match\n        guards: (guards\n          guard: (boolean\n            (infix\n              left_operand: (variable)\n              operator: (operator)\n              right_operand: (literal\n                (integer))))\n          guard: (boolean\n            (infix\n              left_operand: (variable)\n              operator: (operator)\n              right_operand: (literal\n                (integer)))))\n        expression: (constructor))\n      match: (match\n        guards: (guards\n          guard: (pattern_guard\n            pattern: (infix\n              left_operand: (apply\n                function: (constructor)\n                argument: (parens\n                  pattern: (apply\n                    function: (apply\n                      function: (constructor)\n                      argument: (record\n                        constructor: (constructor)\n                        field: (field_pattern\n                          (wildcard))))\n                    argument: (wildcard))))\n              operator: (constructor_operator)\n              right_operand: (variable))\n            expression: (variable)))\n        expression: (constructor))\n      match: (match\n        guards: (guards\n          guard: (boolean\n            (variable)))\n        expression: (constructor)))))\n\n================================================================================\npat: view pattern in record\n================================================================================\n\na A { a = a -> a } = a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (function\n      (variable)\n      (patterns\n        (record\n          (constructor)\n          (field_pattern\n            (field_name\n              (variable))\n            (view_pattern\n              (variable)\n              (variable)))))\n      (match\n        (variable)))))\n\n================================================================================\npat: unboxed tuple\n================================================================================\n\na (# a, a, a #) = a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (function\n      (variable)\n      (patterns\n        (unboxed_tuple\n          (variable)\n          (variable)\n          (variable)))\n      (match\n        (variable)))))\n\n================================================================================\npat: unboxed unit\n================================================================================\n\na (# #) = a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (function\n      (variable)\n      (patterns\n        (unboxed_unit))\n      (match\n        (variable)))))\n\n================================================================================\npat: unboxed solo\n================================================================================\n\na (# A a #) = a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (function\n      (variable)\n      (patterns\n        (unboxed_tuple\n          (apply\n            (constructor)\n            (variable))))\n      (match\n        (variable)))))\n\n================================================================================\npat: unboxed sum, nullary tuple\n================================================================================\n\na (# (# #) | | #) = a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (function\n      (variable)\n      (patterns\n        (unboxed_sum\n          (unboxed_unit)))\n      (match\n        (variable)))))\n\n================================================================================\npat: signature\n================================================================================\n\na (a :: A) = a\na = do\n  let (a :: A, a) = a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (function\n      (variable)\n      (patterns\n        (parens\n          (signature\n            (variable)\n            (name))))\n      (match\n        (variable)))\n    (bind\n      (variable)\n      (match\n        (do\n          (let\n            (local_binds\n              (bind\n                (tuple\n                  (signature\n                    (variable)\n                    (name))\n                  (variable))\n                (match\n                  (variable))))))))))\n\n================================================================================\npat: do binder signature\n================================================================================\n\na = do\n  a :: A <- a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  declarations: (declarations\n    (bind\n      name: (variable)\n      match: (match\n        expression: (do\n          statement: (bind\n            pattern: (signature\n              pattern: (variable)\n              type: (name))\n            expression: (variable)))))))\n\n================================================================================\npat: pattern binding signature\n================================================================================\n\na :: A = a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (signature\n        (variable)\n        (name))\n      (match\n        (variable)))))\n\n================================================================================\npat: do binder view pattern\n================================================================================\n\na = do\n  (a -> a) <- a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (do\n          (bind\n            (parens\n              (view_pattern\n                (variable)\n                (variable)))\n            (variable)))))))\n\n================================================================================\npat: splice\n================================================================================\n\na $(a) = a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (function\n      (variable)\n      (patterns\n        (splice\n          (parens\n            (variable))))\n      (match\n        (variable)))))\n\n================================================================================\npat: quasiqoute\n================================================================================\n\na [a|a|] = a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (function\n      (variable)\n      (patterns\n        (quasiquote\n          (quoter\n            (variable))\n          (quasiquote_body)))\n      (match\n        (variable)))))\n\n================================================================================\npat: operator\n================================================================================\n\na (++) = a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (function\n      (variable)\n      (patterns\n        (prefix_id\n          (operator)))\n      (match\n        (variable)))))\n\n================================================================================\npat: negation\n================================================================================\n\nf (-1) = a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (function\n      (variable)\n      (patterns\n        (parens\n          (negation\n            (integer))))\n      (match\n        (variable)))))\n\n================================================================================\npat: type binders\n================================================================================\n\na @a (A @a @(a :: a) @(A a :: a) @(∀ a . A a :: a)) @[A a] = a\n\na = \\ @a a @a -> a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (function\n      (variable)\n      (patterns\n        (type_binder\n          (variable))\n        (parens\n          (apply\n            (apply\n              (apply\n                (apply\n                  (constructor)\n                  (type_binder\n                    (variable)))\n                (type_binder\n                  (parens\n                    (signature\n                      (variable)\n                      (variable)))))\n              (type_binder\n                (parens\n                  (signature\n                    (apply\n                      (name)\n                      (variable))\n                    (variable)))))\n            (type_binder\n              (parens\n                (signature\n                  (forall\n                    (quantified_variables\n                      (variable))\n                    (apply\n                      (name)\n                      (variable)))\n                  (variable))))))\n        (type_binder\n          (list\n            (apply\n              (name)\n              (variable)))))\n      (match\n        (variable)))\n    (bind\n      (variable)\n      (match\n        (lambda\n          (patterns\n            (type_binder\n              (variable))\n            (variable)\n            (type_binder\n              (variable)))\n          (variable))))))\n\n================================================================================\npat: cond in viewpat\n================================================================================\n\na (if a then a else a -> a) = a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (function\n      (variable)\n      (patterns\n        (parens\n          (view_pattern\n            (conditional\n              (variable)\n              (variable)\n              (variable))\n            (variable))))\n      (match\n        (variable)))))\n\n================================================================================\npat: lambda in viewpat\n================================================================================\n\na (\\ a -> a -> a) = a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (function\n      (variable)\n      (patterns\n        (parens\n          (view_pattern\n            (lambda\n              (patterns\n                (variable))\n              (variable))\n            (variable))))\n      (match\n        (variable)))))\n\n================================================================================\npat: complex viewpat\n================================================================================\n\na (a <> if a then a else a -> a) = a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (function\n      (variable)\n      (patterns\n        (parens\n          (view_pattern\n            (infix\n              (variable)\n              (operator)\n              (conditional\n                (variable)\n                (variable)\n                (variable)))\n            (variable))))\n      (match\n        (variable)))))\n\n================================================================================\npat: error: annotation in viewpat\n================================================================================\n\na (a :: A -> A {}) = a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (function\n      (variable)\n      (patterns\n        (parens\n          (signature\n            (variable)\n            (function\n              (name)\n              (name)))\n          (ERROR)))\n      (match\n        (variable)))))\n\n================================================================================\npat: multi viewpat\n================================================================================\n\na (a -> a -> a -> A) = a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (function\n      (variable)\n      (patterns\n        (parens\n          (view_pattern\n            (variable)\n            (view_pattern\n              (variable)\n              (view_pattern\n                (variable)\n                (constructor))))))\n      (match\n        (variable)))))\n\n================================================================================\npat: ticked infix\n================================================================================\n\na (a `A` a) = a\na (a `A.A` a) = a\na (A a `A` A a) = a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (function\n      (variable)\n      (patterns\n        (parens\n          (infix\n            (variable)\n            (infix_id\n              (constructor))\n            (variable))))\n      (match\n        (variable)))\n    (function\n      (variable)\n      (patterns\n        (parens\n          (infix\n            (variable)\n            (infix_id\n              (qualified\n                (module\n                  (module_id))\n                (constructor)))\n            (variable))))\n      (match\n        (variable)))\n    (function\n      (variable)\n      (patterns\n        (parens\n          (infix\n            (apply\n              (constructor)\n              (variable))\n            (infix_id\n              (constructor))\n            (apply\n              (constructor)\n              (variable)))))\n      (match\n        (variable)))))\n\n================================================================================\npat: prefix tuple con\n================================================================================\n\na ((,) a a) = a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (function\n      (variable)\n      (patterns\n        (parens\n          (apply\n            (apply\n              (prefix_tuple)\n              (variable))\n            (variable))))\n      (match\n        (variable)))))\n\n================================================================================\npat: bang in case match\n================================================================================\n\na = case a of !a -> a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (case\n          (variable)\n          (alternatives\n            (alternative\n              (strict\n                (variable))\n              (match\n                (variable)))))))))\n\n================================================================================\npat: qualified infix\n================================================================================\n\na (a A.:++ a) = a\na (a A.A.:++ a A.A.:++ a) = a\na (A a A.:++ A a) = a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (function\n      (variable)\n      (patterns\n        (parens\n          (infix\n            (variable)\n            (qualified\n              (module\n                (module_id))\n              (constructor_operator))\n            (variable))))\n      (match\n        (variable)))\n    (function\n      (variable)\n      (patterns\n        (parens\n          (infix\n            (variable)\n            (qualified\n              (module\n                (module_id)\n                (module_id))\n              (constructor_operator))\n            (infix\n              (variable)\n              (qualified\n                (module\n                  (module_id)\n                  (module_id))\n                (constructor_operator))\n              (variable)))))\n      (match\n        (variable)))\n    (function\n      (variable)\n      (patterns\n        (parens\n          (infix\n            (apply\n              (constructor)\n              (variable))\n            (qualified\n              (module\n                (module_id))\n              (constructor_operator))\n            (apply\n              (constructor)\n              (variable)))))\n      (match\n        (variable)))))\n\n================================================================================\npat: explicit type binder\n================================================================================\n\na (type a) (type (A a)) = a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (function\n      (variable)\n      (patterns\n        (explicit_type\n          (variable))\n        (explicit_type\n          (parens\n            (apply\n              (name)\n              (variable)))))\n      (match\n        (variable)))))\n"
  },
  {
    "path": "test/corpus/patsyn.txt",
    "content": "================================================================================\npatsyn: unidirectional simple\n================================================================================\n\npattern A a <- a : a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (pattern_synonym\n      (equation\n        (apply\n          (constructor)\n          (variable))\n        (infix\n          (variable)\n          (constructor_operator)\n          (variable))))))\n\n================================================================================\npatsyn: unidirectional strict\n================================================================================\n\npattern A a = A !a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (pattern_synonym\n      (equation\n        (apply\n          (constructor)\n          (variable))\n        (apply\n          (constructor)\n          (strict\n            (variable)))))))\n\n================================================================================\npatsyn: explicit bidirectional list\n================================================================================\n\npattern A a <- a : a where\n  A a = [a]\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (pattern_synonym\n      (equation\n        (apply\n          (constructor)\n          (variable))\n        (infix\n          (variable)\n          (constructor_operator)\n          (variable))\n        (constructor_synonyms\n          (constructor_synonym\n            (apply\n              (constructor)\n              (variable))\n            (match\n              (list\n                (variable)))))))))\n\n================================================================================\npatsyn: explicit bidirectional strict\n================================================================================\n\npattern A a <- A !a where\n  A !a = A a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (pattern_synonym\n      (equation\n        (apply\n          (constructor)\n          (variable))\n        (apply\n          (constructor)\n          (strict\n            (variable)))\n        (constructor_synonyms\n          (constructor_synonym\n            (apply\n              (constructor)\n              (strict\n                (variable)))\n            (match\n              (apply\n                (constructor)\n                (variable)))))))))\n\n================================================================================\npatsyn: explicit bidirectional record\n================================================================================\n\npattern A { a } <- A a where\n  A a = if a >= 0 then a else a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  declarations: (declarations\n    (pattern_synonym\n      (equation\n        synonym: (record\n          constructor: (constructor)\n          field: (field_pattern\n            field: (field_name\n              (variable))))\n        pattern: (apply\n          function: (constructor)\n          argument: (variable))\n        constructors: (constructor_synonyms\n          (constructor_synonym\n            pattern: (apply\n              function: (constructor)\n              argument: (variable))\n            match: (match\n              expression: (conditional\n                if: (infix\n                  left_operand: (variable)\n                  operator: (operator)\n                  right_operand: (literal\n                    (integer)))\n                then: (variable)\n                else: (variable)))))))))\n\n================================================================================\npatsyn: explicit bidirectional guards\n================================================================================\n\npattern A a <- A a where\n  A a\n    | a >= 0    = (A a)\n    | otherwise = A a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  declarations: (declarations\n    (pattern_synonym\n      (equation\n        synonym: (apply\n          function: (constructor)\n          argument: (variable))\n        pattern: (apply\n          function: (constructor)\n          argument: (variable))\n        constructors: (constructor_synonyms\n          (constructor_synonym\n            pattern: (apply\n              function: (constructor)\n              argument: (variable))\n            match: (match\n              guards: (guards\n                guard: (boolean\n                  (infix\n                    left_operand: (variable)\n                    operator: (operator)\n                    right_operand: (literal\n                      (integer)))))\n              expression: (parens\n                expression: (apply\n                  function: (constructor)\n                  argument: (variable))))\n            match: (match\n              guards: (guards\n                guard: (boolean\n                  (variable)))\n              expression: (apply\n                function: (constructor)\n                argument: (variable)))))))))\n\n================================================================================\npatsyn: signature\n================================================================================\n\npattern A :: A -> A -> (A, A)\npattern A, A :: A\n\n--------------------------------------------------------------------------------\n\n(haskell\n  declarations: (declarations\n    (pattern_synonym\n      (signature\n        synonym: (constructor)\n        type: (function\n          parameter: (name)\n          result: (function\n            parameter: (name)\n            result: (tuple\n              element: (name)\n              element: (name))))))\n    (pattern_synonym\n      (signature\n        synonym: (binding_list\n          name: (constructor)\n          name: (constructor))\n        type: (name)))))\n\n================================================================================\npatsyn: unidirectional record\n================================================================================\n\npattern A {a, a} = (a, a)\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (pattern_synonym\n      (equation\n        (record\n          (constructor)\n          (field_pattern\n            (field_name\n              (variable)))\n          (field_pattern\n            (field_name\n              (variable))))\n        (tuple\n          (variable)\n          (variable))))))\n\n================================================================================\npatsyn: operator\n================================================================================\n\npattern (:->) :: A\npattern a :-> b <- a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  declarations: (declarations\n    (pattern_synonym\n      (signature\n        synonym: (prefix_id\n          (constructor_operator))\n        type: (name)))\n    (pattern_synonym\n      (equation\n        synonym: (infix\n          left_operand: (variable)\n          operator: (constructor_operator)\n          right_operand: (variable))\n        pattern: (variable)))))\n\n================================================================================\npatsyn: ticked infix\n================================================================================\n\npattern A <- a `A` a\npattern A <- a `A.A` a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (pattern_synonym\n      (equation\n        (constructor)\n        (infix\n          (variable)\n          (infix_id\n            (constructor))\n          (variable))))\n    (pattern_synonym\n      (equation\n        (constructor)\n        (infix\n          (variable)\n          (infix_id\n            (qualified\n              (module\n                (module_id))\n              (constructor)))\n          (variable))))))\n"
  },
  {
    "path": "test/corpus/pragma.txt",
    "content": "================================================================================\npragma: inline\n================================================================================\n\na = a\n{-# inline a #-}\n\na = a\n{-# inline conlike [1] a #-}\n\na = a\n{-#INLINE [~2] a#-}\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (variable)))\n    (pragma)\n    (bind\n      (variable)\n      (match\n        (variable)))\n    (pragma)\n    (bind\n      (variable)\n      (match\n        (variable)))\n    (pragma)))\n\n================================================================================\npragma: without module\n================================================================================\n\n{-# LANGUAGE LambdaCase #-}\n{-# language ScopedTypeVariables, DataKinds #-}\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (pragma)\n  (pragma))\n\n================================================================================\npragma: before module\n================================================================================\n\n{-# language LambdaCase #-}\n{-# language ScopedTypeVariables, DataKinds #-}\nmodule A where\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (pragma)\n  (pragma)\n  (header\n    (module\n      (module_id))))\n\n================================================================================\npragma: after module\n================================================================================\n\nmodule A where\n{-# language X #-}\na = a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (header\n    (module\n      (module_id)))\n  (pragma)\n  (declarations\n    (bind\n      (variable)\n      (match\n        (variable)))))\n\n================================================================================\npragma: between imports\n================================================================================\n\nmodule A where\n{-# language X #-}\nimport A\n{-# language X #-}\nimport A\n{-# language X #-}\na = a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (header\n    (module\n      (module_id)))\n  (pragma)\n  (imports\n    (import\n      (module\n        (module_id)))\n    (pragma)\n    (import\n      (module\n        (module_id)))\n    (pragma))\n  (declarations\n    (bind\n      (variable)\n      (match\n        (variable)))))\n\n================================================================================\npragma: before import inline\n================================================================================\n\nmodule A where\n\nimport A\n{-# language X #-} import A\nimport A\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (header\n    (module\n      (module_id)))\n  (imports\n    (import\n      (module\n        (module_id)))\n    (pragma)\n    (import\n      (module\n        (module_id)))\n    (import\n      (module\n        (module_id)))))\n\n================================================================================\npragma: instance overlap\n================================================================================\n\ninstance {-# overlappable #-} A where\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (instance\n      (pragma)\n      (name))))\n\n================================================================================\npragma: multiline\n================================================================================\n\nmodule A where\n{-# rules\n      \"a/a\" [2] forall a . a a = a\n  #-}\n\na = a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (header\n    (module\n      (module_id)))\n  (pragma)\n  (declarations\n    (bind\n      (variable)\n      (match\n        (variable)))))\n\n================================================================================\npragma: no whitespace before strictness annotation\n================================================================================\n\ndata A = A {-# a #-}!A\ndata A = A {- a -}~A\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (data_type\n      (name)\n      (data_constructors\n        (data_constructor\n          (prefix\n            (constructor)\n            (pragma)\n            (strict_field\n              (name))))))\n    (data_type\n      (name)\n      (data_constructors\n        (data_constructor\n          (prefix\n            (constructor)\n            (comment)\n            (lazy_field\n              (name))))))))\n\n================================================================================\npragma: before do statement\n================================================================================\n\na = do\n  a <- a\n  {-# SCC \"a\" #-} a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (do\n          (bind\n            (variable)\n            (variable))\n          (pragma)\n          (exp\n            (variable)))))))\n\n================================================================================\npragma: instance method with cpp\n================================================================================\n\ninstance A where\n#if\n  a = a\n#endif\n  {-# inline a #-}\n\na = a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (instance\n      (name)\n      (cpp)\n      (instance_declarations\n        (bind\n          (variable)\n          (match\n            (variable)))\n        (cpp)\n        (pragma)))\n    (bind\n      (variable)\n      (match\n        (variable)))))\n\n================================================================================\npragma: indented before decl without module\n================================================================================\n  {-# language A #-}\n\na = a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (pragma)\n  (declarations\n    (bind\n      (variable)\n      (match\n        (variable)))))\n\n================================================================================\npragma: indented after decl\n================================================================================\na = a\n\n  {-# prag #-}\n\na = a\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (variable)))\n    (pragma)\n    (bind\n      (variable)\n      (match\n        (variable)))))\n\n================================================================================\npragma: indented after module\n================================================================================\nmodule A where\n  {-# prag #-}\na = a\n-- This is a parse error in GHC, but since we leniently readjust top level indent\n-- when it decreases, it doesn't happen here.\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (header\n    (module\n      (module_id)))\n  (pragma)\n  (declarations\n    (bind\n      (variable)\n      (match\n        (variable)))\n    (comment)))\n\n================================================================================\npragma: between decls\n================================================================================\n\na = a\n{-# prag #-}\na = a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (variable)))\n    (pragma)\n    (bind\n      (variable)\n      (match\n        (variable)))))\n\n================================================================================\npragma: followed by inline comment\n================================================================================\na = a\n{-# prag #-} -- a\na = a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (variable)))\n    (pragma)\n    (comment)\n    (bind\n      (variable)\n      (match\n        (variable)))))\n\n================================================================================\npragma: followed by block comment\n================================================================================\na = a\n{-# prag #-} {- a\n-}\na = a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (variable)))\n    (pragma)\n    (comment)\n    (bind\n      (variable)\n      (match\n        (variable)))))\n\n================================================================================\npragma: after block comment\n================================================================================\na = do\n  a\n{- a -}\n{-# prag #-}\na = a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (do\n          (exp\n            (variable)))))\n    (comment)\n    (pragma)\n    (bind\n      (variable)\n      (match\n        (variable)))))\n"
  },
  {
    "path": "test/corpus/prec.txt",
    "content": "================================================================================\nprec: infix qualified varsym with leading dot(s)\n================================================================================\n\na = a A.!? a\na = a A .!? a\n\na = a A..!? a\na = a A ..!? a\n\na = a A...!? a\na = a A ...!? a\n\na = a A.. a\na = a A..! a\na = a A..= a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (infix\n          (variable)\n          (qualified\n            (module\n              (module_id))\n            (operator))\n          (variable))))\n    (bind\n      (variable)\n      (match\n        (infix\n          (apply\n            (variable)\n            (constructor))\n          (operator)\n          (variable))))\n    (bind\n      (variable)\n      (match\n        (infix\n          (variable)\n          (qualified\n            (module\n              (module_id))\n            (operator))\n          (variable))))\n    (bind\n      (variable)\n      (match\n        (infix\n          (apply\n            (variable)\n            (constructor))\n          (operator)\n          (variable))))\n    (bind\n      (variable)\n      (match\n        (infix\n          (variable)\n          (qualified\n            (module\n              (module_id))\n            (operator))\n          (variable))))\n    (bind\n      (variable)\n      (match\n        (infix\n          (apply\n            (variable)\n            (constructor))\n          (operator)\n          (variable))))\n    (bind\n      (variable)\n      (match\n        (infix\n          (variable)\n          (qualified\n            (module\n              (module_id))\n            (operator))\n          (variable))))\n    (bind\n      (variable)\n      (match\n        (infix\n          (variable)\n          (qualified\n            (module\n              (module_id))\n            (operator))\n          (variable))))\n    (bind\n      (variable)\n      (match\n        (infix\n          (variable)\n          (qualified\n            (module\n              (module_id))\n            (operator))\n          (variable))))))\n\n================================================================================\nprec: infix qualified consym\n================================================================================\n\na = a A.:!? a\na = a A :!? a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (infix\n          (variable)\n          (qualified\n            (module\n              (module_id))\n            (constructor_operator))\n          (variable))))\n    (bind\n      (variable)\n      (match\n        (infix\n          (apply\n            (variable)\n            (constructor))\n          (constructor_operator)\n          (variable))))))\n\n================================================================================\nprec: varop decl with leading dot\n================================================================================\n\n(.&) :: a\n(.=) :: a\n(..&) :: a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (signature\n      (prefix_id\n        (operator))\n      (variable))\n    (signature\n      (prefix_id\n        (operator))\n      (variable))\n    (signature\n      (prefix_id\n        (operator))\n      (variable))))\n\n================================================================================\nprec: varop exp with leading dot\n================================================================================\n\na = (A..!?)\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (prefix_id\n          (qualified\n            (module\n              (module_id))\n            (operator)))))))\n\n================================================================================\nprec: varop import with leading dot\n================================================================================\n\nimport A ((.=))\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (imports\n    (import\n      (module\n        (module_id))\n      (import_list\n        (import_name\n          (prefix_id\n            (operator)))))))\n\n================================================================================\nprec: varop export with leading dot\n================================================================================\n\nmodule A ((.=)) where\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (header\n    (module\n      (module_id))\n    (exports\n      (export\n        (prefix_id\n          (operator))))))\n\n================================================================================\nprec: infix varop with leading dot in list\n================================================================================\n\na = [a .+ a]\na = [a ..+ a]\na = [a A..+ a]\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (list\n          (infix\n            (variable)\n            (operator)\n            (variable)))))\n    (bind\n      (variable)\n      (match\n        (list\n          (infix\n            (variable)\n            (operator)\n            (variable)))))\n    (bind\n      (variable)\n      (match\n        (list\n          (infix\n            (variable)\n            (qualified\n              (module\n                (module_id))\n              (operator))\n            (variable)))))))\n\n================================================================================\nprec: tight infix varop with leading dot\n================================================================================\n\na = a.+a\na = a..+a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (infix\n          (variable)\n          (operator)\n          (variable))))\n    (bind\n      (variable)\n      (match\n        (infix\n          (variable)\n          (operator)\n          (variable))))))\n\n================================================================================\nprec: arithmetic sequence\n================================================================================\n\na = [1..]\na = [a..]\na = [1 ..]\na = [a ..]\n\na = [1..2]\na = [a..a]\na = [1 ..2]\na = [a ..a]\na = [1.. 2]\na = [a.. a]\na = [1 .. 2]\na = [a .. a]\n\na = [1,2..]\na = [a,a..]\na = [1,2 ..]\na = [a,a ..]\n\na = [1,2..3]\na = [a,a..a]\na = [1,2 ..3]\na = [a,a ..a]\na = [1,2.. 3]\na = [a,a.. a]\na = [1,2 .. 3]\na = [a,a .. a]\n\n-- This should be an error, since a conid followed by two dots parses as the\n-- qualified composition operator, but we allow it since there's no way to use\n-- an operator here, like it would be in a section.\na = [A..a]\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (arithmetic_sequence\n          (literal\n            (integer)))))\n    (bind\n      (variable)\n      (match\n        (arithmetic_sequence\n          (variable))))\n    (bind\n      (variable)\n      (match\n        (arithmetic_sequence\n          (literal\n            (integer)))))\n    (bind\n      (variable)\n      (match\n        (arithmetic_sequence\n          (variable))))\n    (bind\n      (variable)\n      (match\n        (arithmetic_sequence\n          (literal\n            (integer))\n          (literal\n            (integer)))))\n    (bind\n      (variable)\n      (match\n        (arithmetic_sequence\n          (variable)\n          (variable))))\n    (bind\n      (variable)\n      (match\n        (arithmetic_sequence\n          (literal\n            (integer))\n          (literal\n            (integer)))))\n    (bind\n      (variable)\n      (match\n        (arithmetic_sequence\n          (variable)\n          (variable))))\n    (bind\n      (variable)\n      (match\n        (arithmetic_sequence\n          (literal\n            (integer))\n          (literal\n            (integer)))))\n    (bind\n      (variable)\n      (match\n        (arithmetic_sequence\n          (variable)\n          (variable))))\n    (bind\n      (variable)\n      (match\n        (arithmetic_sequence\n          (literal\n            (integer))\n          (literal\n            (integer)))))\n    (bind\n      (variable)\n      (match\n        (arithmetic_sequence\n          (variable)\n          (variable))))\n    (bind\n      (variable)\n      (match\n        (arithmetic_sequence\n          (literal\n            (integer))\n          (literal\n            (integer)))))\n    (bind\n      (variable)\n      (match\n        (arithmetic_sequence\n          (variable)\n          (variable))))\n    (bind\n      (variable)\n      (match\n        (arithmetic_sequence\n          (literal\n            (integer))\n          (literal\n            (integer)))))\n    (bind\n      (variable)\n      (match\n        (arithmetic_sequence\n          (variable)\n          (variable))))\n    (bind\n      (variable)\n      (match\n        (arithmetic_sequence\n          (literal\n            (integer))\n          (literal\n            (integer))\n          (literal\n            (integer)))))\n    (bind\n      (variable)\n      (match\n        (arithmetic_sequence\n          (variable)\n          (variable)\n          (variable))))\n    (bind\n      (variable)\n      (match\n        (arithmetic_sequence\n          (literal\n            (integer))\n          (literal\n            (integer))\n          (literal\n            (integer)))))\n    (bind\n      (variable)\n      (match\n        (arithmetic_sequence\n          (variable)\n          (variable)\n          (variable))))\n    (bind\n      (variable)\n      (match\n        (arithmetic_sequence\n          (literal\n            (integer))\n          (literal\n            (integer))\n          (literal\n            (integer)))))\n    (bind\n      (variable)\n      (match\n        (arithmetic_sequence\n          (variable)\n          (variable)\n          (variable))))\n    (bind\n      (variable)\n      (match\n        (arithmetic_sequence\n          (literal\n            (integer))\n          (literal\n            (integer))\n          (literal\n            (integer)))))\n    (bind\n      (variable)\n      (match\n        (arithmetic_sequence\n          (variable)\n          (variable)\n          (variable))))\n    (comment)\n    (bind\n      (variable)\n      (match\n        (arithmetic_sequence\n          (constructor)\n          (variable))))))\n\n================================================================================\nprec: section with leading dot\n================================================================================\n\na = (.& a)\na = (a .&)\na = (. a)\na = (a .)\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (right_section\n          (operator)\n          (variable))))\n    (bind\n      (variable)\n      (match\n        (left_section\n          (variable)\n          (operator))))\n    (bind\n      (variable)\n      (match\n        (right_section\n          (operator)\n          (variable))))\n    (bind\n      (variable)\n      (match\n        (left_section\n          (variable)\n          (operator))))))\n\n================================================================================\nprec: composition basic\n================================================================================\n\na = a. a\na = a .a\na = a . a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (infix\n          (variable)\n          (operator)\n          (variable))))\n    (bind\n      (variable)\n      (match\n        (infix\n          (variable)\n          (operator)\n          (variable))))\n    (bind\n      (variable)\n      (match\n        (infix\n          (variable)\n          (operator)\n          (variable))))))\n\n================================================================================\nprec: composition in parens\n================================================================================\n\n-- Note: These may be parsed as sections\na = (a. a)\na = (a .a)\na = (a . a)\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (comment)\n  (declarations\n    (bind\n      (variable)\n      (match\n        (parens\n          (infix\n            (variable)\n            (operator)\n            (variable)))))\n    (bind\n      (variable)\n      (match\n        (parens\n          (infix\n            (variable)\n            (operator)\n            (variable)))))\n    (bind\n      (variable)\n      (match\n        (parens\n          (infix\n            (variable)\n            (operator)\n            (variable)))))))\n\n================================================================================\nprec: composition and qualified names\n================================================================================\n\na = A.A.a . a\na = A.A.a . A.a\na = A.A.a. a\na = A.A.a. A.a\na = A.A.a .a\na = A.A.a .A.a\n\na = A.A.A . a\na = A.A.A . A.a\na = A.A.A. a\na = A.A.A. A.a\na = A.A.A .a\na = A.A.A .A.a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (infix\n          (qualified\n            (module\n              (module_id)\n              (module_id))\n            (variable))\n          (operator)\n          (variable))))\n    (bind\n      (variable)\n      (match\n        (infix\n          (qualified\n            (module\n              (module_id)\n              (module_id))\n            (variable))\n          (operator)\n          (qualified\n            (module\n              (module_id))\n            (variable)))))\n    (bind\n      (variable)\n      (match\n        (infix\n          (qualified\n            (module\n              (module_id)\n              (module_id))\n            (variable))\n          (operator)\n          (variable))))\n    (bind\n      (variable)\n      (match\n        (infix\n          (qualified\n            (module\n              (module_id)\n              (module_id))\n            (variable))\n          (operator)\n          (qualified\n            (module\n              (module_id))\n            (variable)))))\n    (bind\n      (variable)\n      (match\n        (infix\n          (qualified\n            (module\n              (module_id)\n              (module_id))\n            (variable))\n          (operator)\n          (variable))))\n    (bind\n      (variable)\n      (match\n        (infix\n          (qualified\n            (module\n              (module_id)\n              (module_id))\n            (variable))\n          (operator)\n          (qualified\n            (module\n              (module_id))\n            (variable)))))\n    (bind\n      (variable)\n      (match\n        (infix\n          (qualified\n            (module\n              (module_id)\n              (module_id))\n            (constructor))\n          (operator)\n          (variable))))\n    (bind\n      (variable)\n      (match\n        (infix\n          (qualified\n            (module\n              (module_id)\n              (module_id))\n            (constructor))\n          (operator)\n          (qualified\n            (module\n              (module_id))\n            (variable)))))\n    (bind\n      (variable)\n      (match\n        (infix\n          (qualified\n            (module\n              (module_id)\n              (module_id))\n            (constructor))\n          (operator)\n          (variable))))\n    (bind\n      (variable)\n      (match\n        (infix\n          (qualified\n            (module\n              (module_id)\n              (module_id))\n            (constructor))\n          (operator)\n          (qualified\n            (module\n              (module_id))\n            (variable)))))\n    (bind\n      (variable)\n      (match\n        (infix\n          (qualified\n            (module\n              (module_id)\n              (module_id))\n            (constructor))\n          (operator)\n          (variable))))\n    (bind\n      (variable)\n      (match\n        (infix\n          (qualified\n            (module\n              (module_id)\n              (module_id))\n            (constructor))\n          (operator)\n          (qualified\n            (module\n              (module_id))\n            (variable)))))))\n\n================================================================================\nprec: composition before parens\n================================================================================\n\na = a.(a)\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (infix\n          (variable)\n          (operator)\n          (parens\n            (variable)))))))\n\n================================================================================\nprec: if block arguments with exp annotation\n================================================================================\n\na = a if a :: A then \\ a -> a :: A else a :: A\na = a if | a -> a :: A\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (apply\n          (variable)\n          (conditional\n            (signature\n              (variable)\n              (name))\n            (lambda\n              (patterns\n                (variable))\n              (signature\n                (variable)\n                (name)))\n            (signature\n              (variable)\n              (name))))))\n    (bind\n      (variable)\n      (match\n        (apply\n          (variable)\n          (multi_way_if\n            (match\n              (guards\n                (boolean\n                  (variable)))\n              (signature\n                (variable)\n                (name)))))))))\n\n================================================================================\nprec: block argument: apply\n================================================================================\n\na = do \\ a -> a\n    case a of\n      a -> a\n    do a + a\n    if\n   | a -> a\n   | a -> a\n  *\n  do a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (infix\n          (apply\n            (apply\n              (apply\n                (do\n                  (exp\n                    (lambda\n                      (patterns\n                        (variable))\n                      (variable))))\n                (case\n                  (variable)\n                  (alternatives\n                    (alternative\n                      (variable)\n                      (match\n                        (variable))))))\n              (do\n                (exp\n                  (infix\n                    (variable)\n                    (operator)\n                    (variable)))))\n            (multi_way_if\n              (match\n                (guards\n                  (boolean\n                    (variable)))\n                (variable))\n              (match\n                (guards\n                  (boolean\n                    (variable)))\n                (variable))))\n          (operator)\n          (do\n            (exp\n              (variable))))))))\n\n================================================================================\nprec: greedy signature in pattern binder\n================================================================================\n\na :: A ++ A = a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (signature\n        (variable)\n        (infix\n          (name)\n          (operator)\n          (name)))\n      (match\n        (variable)))))\n\n================================================================================\nprec: signature with subsequent function vs. pattern binder\n================================================================================\n\na :: A\na = a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (signature\n      (variable)\n      (name))\n    (bind\n      (variable)\n      (match\n        (variable)))))\n\n================================================================================\nprec: hash: signature lhs\n================================================================================\n\n(#) :: a\n(#!) :: a\n(#?) :: a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (signature\n      (prefix_id\n        (operator))\n      (variable))\n    (signature\n      (prefix_id\n        (operator))\n      (variable))\n    (signature\n      (prefix_id\n        (operator))\n      (variable))))\n\n================================================================================\nprec: hash: prefix expression\n================================================================================\n\na = (#)\na = (#!)\na = (#?)\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (prefix_id\n          (operator))))\n    (bind\n      (variable)\n      (match\n        (prefix_id\n          (operator))))\n    (bind\n      (variable)\n      (match\n        (prefix_id\n          (operator))))))\n\n================================================================================\nprec: hash: right section\n================================================================================\n\na = (# a)\na = (## a)\na = (#! a)\na = (#? a)\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (right_section\n          (operator)\n          (variable))))\n    (bind\n      (variable)\n      (match\n        (right_section\n          (operator)\n          (variable))))\n    (bind\n      (variable)\n      (match\n        (right_section\n          (operator)\n          (variable))))\n    (bind\n      (variable)\n      (match\n        (right_section\n          (operator)\n          (variable))))))\n\n================================================================================\nprec: hash: left section\n================================================================================\n\na = (a #)\na = (a # )\na = (a ##)\na = (a #!)\na = (a #?)\na = (a !#)\na = (a ?#)\na = (a #|)\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (left_section\n          (variable)\n          (operator))))\n    (bind\n      (variable)\n      (match\n        (left_section\n          (variable)\n          (operator))))\n    (bind\n      (variable)\n      (match\n        (left_section\n          (variable)\n          (operator))))\n    (bind\n      (variable)\n      (match\n        (left_section\n          (variable)\n          (operator))))\n    (bind\n      (variable)\n      (match\n        (left_section\n          (variable)\n          (operator))))\n    (bind\n      (variable)\n      (match\n        (left_section\n          (variable)\n          (operator))))\n    (bind\n      (variable)\n      (match\n        (left_section\n          (variable)\n          (operator))))\n    (bind\n      (variable)\n      (match\n        (left_section\n          (variable)\n          (operator))))))\n\n================================================================================\nprec: hash: unboxed expression\n================================================================================\n\na = (# #)\na = (##)\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (unboxed_unit)))\n    (bind\n      (variable)\n      (match\n        (unboxed_unit)))))\n\n================================================================================\nprec: hash: infix\n================================================================================\n\na = a#a\na = a# a\na = a #a\na = a # a\na = a ## a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (apply\n          (variable)\n          (variable))))\n    (bind\n      (variable)\n      (match\n        (apply\n          (variable)\n          (variable))))\n    (bind\n      (variable)\n      (match\n        (apply\n          (variable)\n          (label))))\n    (bind\n      (variable)\n      (match\n        (infix\n          (variable)\n          (operator)\n          (variable))))\n    (bind\n      (variable)\n      (match\n        (infix\n          (variable)\n          (operator)\n          (variable))))))\n\n================================================================================\nprec: hash: prefix type\n================================================================================\n\ntype (#) = (#)\ntype (#!) = (#!)\ntype (#?) = (#?)\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (type_synomym\n      (prefix_id\n        (operator))\n      (prefix_id\n        (operator)))\n    (type_synomym\n      (prefix_id\n        (operator))\n      (prefix_id\n        (operator)))\n    (type_synomym\n      (prefix_id\n        (operator))\n      (prefix_id\n        (operator)))))\n\n================================================================================\nprec: hash: unboxed type\n================================================================================\n\ntype A = (# a # b, a #)\ntype A = (# a, a # b, c #)\ntype A = (# a, a # b #)\ntype A = (# A | A# #)\ntype A = (# a # b | a #)\ntype A = (# a | a # b | c #)\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (type_synomym\n      (name)\n      (unboxed_tuple\n        (infix\n          (variable)\n          (operator)\n          (variable))\n        (variable)))\n    (type_synomym\n      (name)\n      (unboxed_tuple\n        (variable)\n        (infix\n          (variable)\n          (operator)\n          (variable))\n        (variable)))\n    (type_synomym\n      (name)\n      (unboxed_tuple\n        (variable)\n        (infix\n          (variable)\n          (operator)\n          (variable))))\n    (type_synomym\n      (name)\n      (unboxed_sum\n        (name)\n        (name)))\n    (type_synomym\n      (name)\n      (unboxed_sum\n        (infix\n          (variable)\n          (operator)\n          (variable))\n        (variable)))\n    (type_synomym\n      (name)\n      (unboxed_sum\n        (variable)\n        (infix\n          (variable)\n          (operator)\n          (variable))\n        (variable)))))\n\n================================================================================\nprec: hash: edge cases\n================================================================================\n\n-- Unboxed sum opening bar without space\n(#|) :: a\na = (#|)\na = (#| a)\n-- Unboxed sum closing bar without space\n(|#) :: a\na = (|#)\na = (a |#)\n-- MagicHash decl with guard has the sequence `# |` in it\na# | a = a\n-- Same with operator\na = a# || a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (comment)\n  (declarations\n    (signature\n      (prefix_id\n        (operator))\n      (variable))\n    (bind\n      (variable)\n      (match\n        (prefix_id\n          (operator))))\n    (bind\n      (variable)\n      (match\n        (right_section\n          (operator)\n          (variable))))\n    (comment)\n    (signature\n      (prefix_id\n        (operator))\n      (variable))\n    (bind\n      (variable)\n      (match\n        (prefix_id\n          (operator))))\n    (bind\n      (variable)\n      (match\n        (left_section\n          (variable)\n          (operator))))\n    (comment)\n    (bind\n      (variable)\n      (match\n        (guards\n          (boolean\n            (variable)))\n        (variable)))\n    (comment)\n    (bind\n      (variable)\n      (match\n        (infix\n          (variable)\n          (operator)\n          (variable))))))\n\n================================================================================\nprec: annotation after lambda\n================================================================================\n\na = \\ a -> a :: A\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (lambda\n          (patterns\n            (variable))\n          (signature\n            (variable)\n            (name)))))))\n\n================================================================================\nprec: negation in right infix operand\n================================================================================\n\na = a $ - a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (infix\n          (variable)\n          (operator)\n          (negation\n            (variable)))))))\n\n================================================================================\nprec: negation vs. infix with apply\n================================================================================\n\na = a a a - a a a\na = a a - a a - a a\na = a a - a a + a a\na = a a + a a - a a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (infix\n          (apply\n            (apply\n              (variable)\n              (variable))\n            (variable))\n          (operator)\n          (apply\n            (apply\n              (variable)\n              (variable))\n            (variable)))))\n    (bind\n      (variable)\n      (match\n        (infix\n          (apply\n            (variable)\n            (variable))\n          (operator)\n          (infix\n            (apply\n              (variable)\n              (variable))\n            (operator)\n            (apply\n              (variable)\n              (variable))))))\n    (bind\n      (variable)\n      (match\n        (infix\n          (apply\n            (variable)\n            (variable))\n          (operator)\n          (infix\n            (apply\n              (variable)\n              (variable))\n            (operator)\n            (apply\n              (variable)\n              (variable))))))\n    (bind\n      (variable)\n      (match\n        (infix\n          (apply\n            (variable)\n            (variable))\n          (operator)\n          (infix\n            (apply\n              (variable)\n              (variable))\n            (operator)\n            (apply\n              (variable)\n              (variable))))))))\n\n================================================================================\nprec: negation in left operand of infix minus\n================================================================================\n\na = - a - a\na = - a a - a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (infix\n          (negation\n            (variable))\n          (operator)\n          (variable))))\n    (bind\n      (variable)\n      (match\n        (infix\n          (negation\n            (apply\n              (variable)\n              (variable)))\n          (operator)\n          (variable))))))\n\n================================================================================\nprec: left minus section with minus infix\n================================================================================\n\na = (a - a -)\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (left_section\n          (infix\n            (variable)\n            (operator)\n            (variable))\n          (operator))))))\n\n================================================================================\nprec: eldritch horror section\n================================================================================\n\na = (+ - a + - a)\na = (+ - a a + - a a)\na = (+ - a a a + - a a a)\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (right_section\n          (operator)\n          (infix\n            (negation\n              (variable))\n            (operator)\n            (negation\n              (variable))))))\n    (bind\n      (variable)\n      (match\n        (right_section\n          (operator)\n          (infix\n            (negation\n              (apply\n                (variable)\n                (variable)))\n            (operator)\n            (negation\n              (apply\n                (variable)\n                (variable)))))))\n    (bind\n      (variable)\n      (match\n        (right_section\n          (operator)\n          (infix\n            (negation\n              (apply\n                (apply\n                  (variable)\n                  (variable))\n                (variable)))\n            (operator)\n            (negation\n              (apply\n                (apply\n                  (variable)\n                  (variable))\n                (variable)))))))))\n\n================================================================================\nprec: qualified infix varsym with two module segments\n================================================================================\n\na = a A.A.+++ a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (infix\n          (variable)\n          (qualified\n            (module\n              (module_id)\n              (module_id))\n            (operator))\n          (variable))))))\n\n================================================================================\nprec: qualified infix varsym with apply in left operand\n================================================================================\n\n-- This has the strong potential to pull the operator into the apply\na = a a A.+++ a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (comment)\n  (declarations\n    (bind\n      (variable)\n      (match\n        (infix\n          (apply\n            (variable)\n            (variable))\n          (qualified\n            (module\n              (module_id))\n            (operator))\n          (variable))))))\n\n================================================================================\nprec: apply in nested infix with all qualified names with two module segments\n================================================================================\n\na = A.A.a A.A.a A.A.+++ A.A.a A.A.a A.A.+++ A.A.a A.A.a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (infix\n          (apply\n            (qualified\n              (module\n                (module_id)\n                (module_id))\n              (variable))\n            (qualified\n              (module\n                (module_id)\n                (module_id))\n              (variable)))\n          (qualified\n            (module\n              (module_id)\n              (module_id))\n            (operator))\n          (infix\n            (apply\n              (qualified\n                (module\n                  (module_id)\n                  (module_id))\n                (variable))\n              (qualified\n                (module\n                  (module_id)\n                  (module_id))\n                (variable)))\n            (qualified\n              (module\n                (module_id)\n                (module_id))\n              (operator))\n            (apply\n              (qualified\n                (module\n                  (module_id)\n                  (module_id))\n                (variable))\n              (qualified\n                (module\n                  (module_id)\n                  (module_id))\n                (variable)))))))))\n\n================================================================================\nprec: apply/infix/qualified in type\n================================================================================\n\ntype A = A.A.A A.A.A A.A.+++ A.A.A A.A.A A.A.+++ A.A.A A.A.A\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (type_synomym\n      (name)\n      (infix\n        (apply\n          (qualified\n            (module\n              (module_id)\n              (module_id))\n            (name))\n          (qualified\n            (module\n              (module_id)\n              (module_id))\n            (name)))\n        (qualified\n          (module\n            (module_id)\n            (module_id))\n          (operator))\n        (infix\n          (apply\n            (qualified\n              (module\n                (module_id)\n                (module_id))\n              (name))\n            (qualified\n              (module\n                (module_id)\n                (module_id))\n              (name)))\n          (qualified\n            (module\n              (module_id)\n              (module_id))\n            (operator))\n          (apply\n            (qualified\n              (module\n                (module_id)\n                (module_id))\n              (name))\n            (qualified\n              (module\n                (module_id)\n                (module_id))\n              (name))))))))\n"
  },
  {
    "path": "test/corpus/signature.txt",
    "content": "================================================================================\nsignature: forall\n================================================================================\n\na :: forall a (a :: * -> Type) . (∀ a . a -> a) -> A a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (signature\n      (variable)\n      (forall\n        (quantified_variables\n          (variable)\n          (parens\n            (annotated\n              (variable)\n              (function\n                (star)\n                (name)))))\n        (function\n          (parens\n            (forall\n              (quantified_variables\n                (variable))\n              (function\n                (variable)\n                (variable))))\n          (apply\n            (name)\n            (variable)))))))\n\n================================================================================\nsignature: alternating forall/context/arrow/infix\n================================================================================\n\na :: A a => ∀ a. a ++ a => a -> ∀ a. a -> A => A => A a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (signature\n      (variable)\n      (context\n        (apply\n          (name)\n          (variable))\n        (forall\n          (quantified_variables\n            (variable))\n          (context\n            (infix\n              (variable)\n              (operator)\n              (variable))\n            (function\n              (variable)\n              (forall\n                (quantified_variables\n                  (variable))\n                (function\n                  (variable)\n                  (context\n                    (name)\n                    (context\n                      (name)\n                      (apply\n                        (name)\n                        (variable)))))))))))))\n\n================================================================================\nsignature: partial\n================================================================================\n\na :: A -> _ -> (_, a) -> _a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (signature\n      (variable)\n      (function\n        (name)\n        (function\n          (wildcard)\n          (function\n            (tuple\n              (wildcard)\n              (variable))\n            (variable)))))))\n\n================================================================================\nsignature: unicode herald\n================================================================================\n\na ∷ a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (signature\n      (variable)\n      (variable))))\n"
  },
  {
    "path": "test/corpus/special.txt",
    "content": "================================================================================\nspecial: GHC fixity decl for -> in GHC.Types\n================================================================================\n\ninfixr -1 ->\n\n--------------------------------------------------------------------------------\n\n(haskell\n  declarations: (declarations\n    (fixity\n      precedence: (integer)\n      operator: (operator))))\n"
  },
  {
    "path": "test/corpus/string.txt",
    "content": "================================================================================\nstring: special chars\n================================================================================\n\na = \"\\\\\\\"\\a\\b\\f\\n\\r\\t\\v\\&\\NUL\\SOH\\STX\\ETX\\EOT\\ENQ\\ACK\\BEL\\BS\\HT\\LF\\VT\\FF\\CR\\SO\\SI\\DLE\\DC1\\DC2\\DC3\\DC4\\NAK\\SYN\\ETB\\CAN\\EM\\SUB\\ESC\\FS\\GS\\RS\\US\\SP\\DEL\\^A\\^Z\\^@\\^[\\^]\\^\\\\^^\\^_\"\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (literal\n          (string))))))\n\n================================================================================\nstring: gap\n================================================================================\n\na = \"start\\\n     \\\"\n\na = \"start\\\n    \\end\"\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (literal\n          (string))))\n    (bind\n      (variable)\n      (match\n        (literal\n          (string))))))\n\n================================================================================\nstring: magic hash\n================================================================================\n\na = \"a\"#\na = \"a\"##\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (literal\n          (string))))\n    (bind\n      (variable)\n      (match\n        (literal\n          (string))))))\n"
  },
  {
    "path": "test/corpus/th.txt",
    "content": "================================================================================\nth: quasiquotes\n================================================================================\n\nf =\n  [quoter|body|]\n  [quoter|body|with|bars\nand newline|]\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (apply\n          (quasiquote\n            (quoter\n              (variable))\n            (quasiquote_body))\n          (quasiquote\n            (quoter\n              (variable))\n            (quasiquote_body)))))))\n\n================================================================================\nth: top level splice with parens\n================================================================================\n\n$(a ''Aa)\n$(a ''A.Aa)\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (top_splice\n      (splice\n        (parens\n          (apply\n            (variable)\n            (th_quoted_name\n              (name))))))\n    (top_splice\n      (splice\n        (parens\n          (apply\n            (variable)\n            (th_quoted_name\n              (qualified\n                (module\n                  (module_id))\n                (name)))))))))\n\n================================================================================\nth: inline splice variable\n================================================================================\n\nf = $a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (splice\n          (variable))))))\n\n================================================================================\nth: inline splice parens\n================================================================================\n\nf = $(a . a $ a)\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (splice\n          (parens\n            (infix\n              (variable)\n              (operator)\n              (infix\n                (variable)\n                (operator)\n                (variable)))))))))\n\n================================================================================\nth: inline typed splice\n================================================================================\n\na = $$a\na = $$(a)\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (splice\n          (variable))))\n    (bind\n      (variable)\n      (match\n        (splice\n          (parens\n            (variable)))))))\n\n================================================================================\nth: inline splice in function application\n================================================================================\n\na = a $(a)\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (apply\n          (variable)\n          (splice\n            (parens\n              (variable))))))))\n\n================================================================================\nth: top level splice without parens\n================================================================================\n\nderive ''Aa\nderive [''Aa]\nderive $ ''Aa\nderive A a @A\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (top_splice\n      (apply\n        (variable)\n        (th_quoted_name\n          (name))))\n    (top_splice\n      (apply\n        (variable)\n        (list\n          (th_quoted_name\n            (name)))))\n    (top_splice\n      (infix\n        (variable)\n        (operator)\n        (th_quoted_name\n          (name))))\n    (top_splice\n      (apply\n        (apply\n          (apply\n            (variable)\n            (constructor))\n          (variable))\n        (type_application\n          (name))))))\n\n================================================================================\nth: comment in quote body\n================================================================================\n\na = [q|-- a|]\na = [q|{- a -}|]\na = [|{- a -}|]\na = [q|\n-- a\na -- a\n    |]\na = [e|\n-- a\n  a -- a\n    |]\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (quasiquote\n          (quoter\n            (variable))\n          (quasiquote_body))))\n    (bind\n      (variable)\n      (match\n        (quasiquote\n          (quoter\n            (variable))\n          (quasiquote_body))))\n    (bind\n      (variable)\n      (match\n        (quote\n          (comment))))\n    (bind\n      (variable)\n      (match\n        (quasiquote\n          (quoter\n            (variable))\n          (quasiquote_body))))\n    (bind\n      (variable)\n      (match\n        (quote\n          (comment)\n          (quoted_expression\n            (variable))\n          (comment))))))\n\n================================================================================\nth: error: comment in expression quote body ranging over closing bracket\n================================================================================\n\na = [t|-- a|]\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (quote\n          (comment)\n          (MISSING \"|]\"))))))\n\n================================================================================\nth: qualified quoter\n================================================================================\n\na = [A.a|a|]\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (quasiquote\n          (quoter\n            (qualified\n              (module\n                (module_id))\n              (variable)))\n          (quasiquote_body))))))\n\n================================================================================\nth: error: incomplete quote\n================================================================================\n\na = [a|\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (quasiquote\n          (quoter\n            (variable))\n          (quasiquote_body)\n          (MISSING \"|]\"))))))\n\n================================================================================\nth: do block top level splice\n================================================================================\n\ndo a <- a\n   a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (top_splice\n      (do\n        (bind\n          (variable)\n          (variable))\n        (exp\n          (variable))))))\n\n================================================================================\nth: quoted expression\n================================================================================\n\na = ⟦a + a⟧\na = [e|A a ++ [(A, a), \"hello\"]|]\na = [|a + a⟧\na = [e|a + a⟧\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (quote\n          (quoted_expression\n            (infix\n              (variable)\n              (operator)\n              (variable))))))\n    (bind\n      (variable)\n      (match\n        (quote\n          (quoted_expression\n            (infix\n              (apply\n                (constructor)\n                (variable))\n              (operator)\n              (list\n                (tuple\n                  (constructor)\n                  (variable))\n                (literal\n                  (string))))))))\n    (bind\n      (variable)\n      (match\n        (quote\n          (quoted_expression\n            (infix\n              (variable)\n              (operator)\n              (variable))))))\n    (bind\n      (variable)\n      (match\n        (quote\n          (quoted_expression\n            (infix\n              (variable)\n              (operator)\n              (variable))))))))\n\n================================================================================\nth: quoted type\n================================================================================\n\na = [t|∀ a . A a => a ++ a :: A⟧\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (quote\n          (quoted_type\n            (signature\n              (forall\n                (quantified_variables\n                  (variable))\n                (context\n                  (apply\n                    (name)\n                    (variable))\n                  (infix\n                    (variable)\n                    (operator)\n                    (variable))))\n              (name))))))))\n\n================================================================================\nth: quoted pattern\n================================================================================\n\na = [p|(a -> A {a = !A})|]\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (quote\n          (quoted_pattern\n            (parens\n              (view_pattern\n                (variable)\n                (record\n                  (constructor)\n                  (field_pattern\n                    (field_name\n                      (variable))\n                    (strict\n                      (constructor))))))))))))\n\n================================================================================\nth: quoted decls\n================================================================================\n\na = [d|\n  instance A a => A a where\n    a == a = a\n\n  a :: A => a\n\n  type family A a :: A\n        |]\n\na = [d|{\na = a\n; a = a\n}|]\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (quote\n          (quoted_decls\n            (instance\n              (context\n                (apply\n                  (name)\n                  (variable)))\n              (name)\n              (type_patterns\n                (variable))\n              (instance_declarations\n                (function\n                  (infix\n                    (variable)\n                    (operator)\n                    (variable))\n                  (match\n                    (variable)))))\n            (signature\n              (variable)\n              (context\n                (name)\n                (variable)))\n            (type_family\n              (name)\n              (type_params\n                (variable))\n              (name))))))\n    (bind\n      (variable)\n      (match\n        (quote\n          (quoted_decls\n            (bind\n              (variable)\n              (match\n                (variable)))\n            (bind\n              (variable)\n              (match\n                (variable)))))))))\n\n================================================================================\nClose nested layouts at closing bracket in decl quote\n================================================================================\n\na = a\n  where\n    a =\n      [d|instance A where\n          a = a\n          |]\n\na = a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (variable))\n      (local_binds\n        (bind\n          (variable)\n          (match\n            (quote\n              (quoted_decls\n                (instance\n                  (name)\n                  (instance_declarations\n                    (bind\n                      (variable)\n                      (match\n                        (variable)))))))))))\n    (bind\n      (variable)\n      (match\n        (variable)))))\n\n================================================================================\nth: typed expression quotation\n================================================================================\n\na = [|| a + a ||]\n\na = [e|| a + a ||]\n\na = a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (typed_quote\n          (quoted_expression\n            (infix\n              (variable)\n              (operator)\n              (variable))))))\n    (bind\n      (variable)\n      (match\n        (typed_quote\n          (quoted_expression\n            (infix\n              (variable)\n              (operator)\n              (variable))))))\n    (bind\n      (variable)\n      (match\n        (variable)))))\n\n================================================================================\nth: quoter with prime\n================================================================================\n\na = [a'a'|a|]\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (quasiquote\n          (quoter\n            (variable))\n          (quasiquote_body))))))\n\n================================================================================\nth: expression quote as splice expression\n================================================================================\n\n-- Deliberately excluded from splice expressions to avoid parser size explosion\na = a $⟦a|]\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (comment)\n  (declarations\n    (bind\n      (variable)\n      (match\n        (infix\n          (variable)\n          (operator)\n          (quote\n            (quoted_expression\n              (variable))))))))\n\n================================================================================\nth: nested splice in type\n================================================================================\n\na :: A -> $(a :: A -> $(a :: A))\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (signature\n      (variable)\n      (function\n        (name)\n        (splice\n          (parens\n            (signature\n              (variable)\n              (function\n                (name)\n                (splice\n                  (parens\n                    (signature\n                      (variable)\n                      (name))))))))))))\n\n================================================================================\nth: quasiquote escape\n================================================================================\n\na = [a|a\\|]\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (quasiquote\n          (quoter\n            (variable))\n          (quasiquote_body))))))\n\n================================================================================\nth: top-level expression splice with negation\n================================================================================\n\n-5\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (top_splice\n      (negation\n        (literal\n          (integer))))))\n"
  },
  {
    "path": "test/corpus/type.txt",
    "content": "================================================================================\ntype: basic\n================================================================================\n\ntype A = A\ntype A a = A a a A a\ntype A = A A\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (type_synomym\n      (name)\n      (name))\n    (type_synomym\n      (name)\n      (type_params\n        (variable))\n      (apply\n        (apply\n          (apply\n            (apply\n              (name)\n              (variable))\n            (variable))\n          (name))\n        (variable)))\n    (type_synomym\n      (name)\n      (apply\n        (name)\n        (name)))))\n\n================================================================================\ntype: two tycons\n================================================================================\n\ntype A = A A\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (type_synomym\n      (name)\n      (apply\n        (name)\n        (name)))))\n\n================================================================================\ntype: promoted constructor\n================================================================================\n\ntype A = ' A\ntype A = 'A\ntype A = 'A.A\ntype A = 'A.A.A\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (type_synomym\n      (name)\n      (promoted\n        (constructor)))\n    (type_synomym\n      (name)\n      (promoted\n        (constructor)))\n    (type_synomym\n      (name)\n      (promoted\n        (qualified\n          (module\n            (module_id))\n          (constructor))))\n    (type_synomym\n      (name)\n      (promoted\n        (qualified\n          (module\n            (module_id)\n            (module_id))\n          (constructor))))))\n\n================================================================================\ntype: list plain\n================================================================================\n\ntype A = []\ntype A = [A a]\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (type_synomym\n      (name)\n      (prefix_list))\n    (type_synomym\n      (name)\n      (list\n        (apply\n          (name)\n          (variable))))))\n\n================================================================================\ntype: parens\n================================================================================\n\ntype A = ()\ntype A = (,)\ntype A = (,,)\ntype A = (->)\ntype A = (A.A.->)\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (type_synomym\n      (name)\n      (unit))\n    (type_synomym\n      (name)\n      (prefix_tuple))\n    (type_synomym\n      (name)\n      (prefix_tuple))\n    (type_synomym\n      (name)\n      (prefix_id\n        (operator)))\n    (type_synomym\n      (name)\n      (prefix_id\n        (qualified\n          (module\n            (module_id)\n            (module_id))\n          (operator))))))\n\n================================================================================\ntype: varsym\n================================================================================\n\ntype A = A ++ A\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (type_synomym\n      (name)\n      (infix\n        (name)\n        (operator)\n        (name)))))\n\n================================================================================\ntype: consym\n================================================================================\n\ntype A = A :++ A ':++ A\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (type_synomym\n      (name)\n      (infix\n        (name)\n        (constructor_operator)\n        (infix\n          (name)\n          (promoted\n            (constructor_operator))\n          (name))))))\n\n================================================================================\ntype: list cons\n================================================================================\n\ntype A = A : A\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (type_synomym\n      (name)\n      (infix\n        (name)\n        (constructor_operator)\n        (name)))))\n\n================================================================================\ntype: promoted list cons\n================================================================================\n\ntype A = A ': A\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (type_synomym\n      (name)\n      (infix\n        (name)\n        (promoted\n          (constructor_operator))\n        (name)))))\n\n================================================================================\ntype: promoted list nil\n================================================================================\n\ntype A = '[]\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (type_synomym\n      (name)\n      (promoted\n        (empty_list)))))\n\n================================================================================\ntype: list literal\n================================================================================\n\ntype A = [A a, 'A, a]\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (type_synomym\n      (name)\n      (list\n        (apply\n          (name)\n          (variable))\n        (promoted\n          (constructor))\n        (variable)))))\n\n================================================================================\ntype: promoted list literal\n================================================================================\n\ntype A = ' [A a, 'A, a]\ntype A = '[a]\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (type_synomym\n      (name)\n      (promoted\n        (list\n          (apply\n            (name)\n            (variable))\n          (promoted\n            (constructor))\n          (variable))))\n    (type_synomym\n      (name)\n      (promoted\n        (list\n          (variable))))))\n\n================================================================================\ntype: qualified consym\n================================================================================\n\ntype A = A A.A.:++ A\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (type_synomym\n      (name)\n      (infix\n        (name)\n        (qualified\n          (module\n            (module_id)\n            (module_id))\n          (constructor_operator))\n        (name)))))\n\n================================================================================\ntype: promoted consym\n================================================================================\n\ntype A = A ':++ A\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (type_synomym\n      (name)\n      (infix\n        (name)\n        (promoted\n          (constructor_operator))\n        (name)))))\n\n================================================================================\ntype: qualified promoted consym\n================================================================================\n\ntype A = A 'A.:++ A\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (type_synomym\n      (name)\n      (infix\n        (name)\n        (promoted\n          (qualified\n            (module\n              (module_id))\n            (constructor_operator)))\n        (name)))))\n\n================================================================================\ntype: qualified ticked\n================================================================================\n\ntype A = A `A.A` A\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (type_synomym\n      (name)\n      (infix\n        (name)\n        (infix_id\n          (qualified\n            (module\n              (module_id))\n            (name)))\n        (name)))))\n\n================================================================================\ntype: promoted tuple\n================================================================================\n\ntype A = '(A a, A)\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (type_synomym\n      (name)\n      (promoted\n        (tuple\n          (apply\n            (name)\n            (variable))\n          (name))))))\n\n================================================================================\ntype: promoted prefix tuple\n================================================================================\n\n\ntype A = '(,,,)\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (type_synomym\n      (name)\n      (promoted\n        (prefix_tuple)))))\n\n================================================================================\ntype: equality\n================================================================================\n\ntype A = A ~ A\ntype A = A ~~ A\ntype A = ∀ a . (A a ~ A a) => A\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (type_synomym\n      (name)\n      (infix\n        (name)\n        (operator)\n        (name)))\n    (type_synomym\n      (name)\n      (infix\n        (name)\n        (operator)\n        (name)))\n    (type_synomym\n      (name)\n      (forall\n        (quantified_variables\n          (variable))\n        (context\n          (parens\n            (infix\n              (apply\n                (name)\n                (variable))\n              (operator)\n              (apply\n                (name)\n                (variable))))\n          (name))))))\n\n================================================================================\ntype: infix promoted consym after apply\n================================================================================\n\ntype A = a a ': a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (type_synomym\n      (name)\n      (infix\n        (apply\n          (variable)\n          (variable))\n        (promoted\n          (constructor_operator))\n        (variable)))))\n\n================================================================================\ntype: mixed infix\n================================================================================\n\ntype A = A :++ A A ': A (A A a) : '[] ':++ A `A.A` '[]\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (type_synomym\n      (name)\n      (infix\n        (name)\n        (constructor_operator)\n        (infix\n          (apply\n            (name)\n            (name))\n          (promoted\n            (constructor_operator))\n          (infix\n            (apply\n              (name)\n              (parens\n                (apply\n                  (apply\n                    (name)\n                    (name))\n                  (variable))))\n            (constructor_operator)\n            (infix\n              (promoted\n                (empty_list))\n              (promoted\n                (constructor_operator))\n              (infix\n                (name)\n                (infix_id\n                  (qualified\n                    (module\n                      (module_id))\n                    (name)))\n                (promoted\n                  (empty_list))))))))))\n\n================================================================================\ntype: multi-apply in infix\n================================================================================\n\ntype A = A a a a ++ A a a a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (type_synomym\n      (name)\n      (infix\n        (apply\n          (apply\n            (apply\n              (name)\n              (variable))\n            (variable))\n          (variable))\n        (operator)\n        (apply\n          (apply\n            (apply\n              (name)\n              (variable))\n            (variable))\n          (variable))))))\n\n================================================================================\ntype: symbol\n================================================================================\n\ntype A = \"a\"\ntype A = A (A \"a\")\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (type_synomym\n      (name)\n      (literal\n        (string)))\n    (type_synomym\n      (name)\n      (apply\n        (name)\n        (parens\n          (apply\n            (name)\n            (literal\n              (string))))))))\n\n================================================================================\ntype: prefix notation symbol\n================================================================================\n\ntype A = (++) a a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (type_synomym\n      (name)\n      (apply\n        (apply\n          (prefix_id\n            (operator))\n          (variable))\n        (variable)))))\n\n================================================================================\ntype: nullary context\n================================================================================\n\ntype A = A => A\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (type_synomym\n      (name)\n      (context\n        (name)\n        (name)))))\n\n================================================================================\ntype: forall only\n================================================================================\n\ntype A = ∀ a . A a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (type_synomym\n      (name)\n      (forall\n        (quantified_variables\n          (variable))\n        (apply\n          (name)\n          (variable))))))\n\n================================================================================\ntype: forall context\n================================================================================\n\ntype A = ∀ a a . A => A\ntype A = forall a a . A a => [A]\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (type_synomym\n      (name)\n      (forall\n        (quantified_variables\n          (variable)\n          (variable))\n        (context\n          (name)\n          (name))))\n    (type_synomym\n      (name)\n      (forall\n        (quantified_variables\n          (variable)\n          (variable))\n        (context\n          (apply\n            (name)\n            (variable))\n          (list\n            (name)))))))\n\n================================================================================\ntype: lhs parens\n================================================================================\n\ntype (A a a) = A\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (type_synomym\n      (parens\n        (name)\n        (type_params\n          (variable)\n          (variable)))\n      (name))))\n\n================================================================================\ntype: role\n================================================================================\n\ntype role A phantom\ntype role A.A _ representational nominal _ phantom _\ntype role (A.>>) nominal nominal\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (role_annotation\n      (name)\n      (type_role))\n    (role_annotation\n      (qualified\n        (module\n          (module_id))\n        (name))\n      (type_role)\n      (type_role)\n      (type_role)\n      (type_role)\n      (type_role)\n      (type_role))\n    (role_annotation\n      (prefix_id\n        (qualified\n          (module\n            (module_id))\n          (operator)))\n      (type_role)\n      (type_role))))\n\n================================================================================\ntype: kind signature\n================================================================================\n\ntype A a :: a -> Type\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (kind_signature\n      (name)\n      (type_params\n        (variable))\n      (function\n        (variable)\n        (name)))))\n\n================================================================================\ntype: function with multiplicity modifier\n================================================================================\n\ntype A = a %1-> a\ntype A = a %1 -> a\ntype A = a %One -> a\ntype A = a %m -> a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (type_synomym\n      (name)\n      (linear_function\n        (variable)\n        (modifier\n          (literal\n            (integer)))\n        (variable)))\n    (type_synomym\n      (name)\n      (linear_function\n        (variable)\n        (modifier\n          (literal\n            (integer)))\n        (variable)))\n    (type_synomym\n      (name)\n      (linear_function\n        (variable)\n        (modifier\n          (name))\n        (variable)))\n    (type_synomym\n      (name)\n      (linear_function\n        (variable)\n        (modifier\n          (variable))\n        (variable)))))\n\n================================================================================\ntype: special linear arrows\n================================================================================\n\ntype A = A ->. A\ntype A = A ⊸ A\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (type_synomym\n      (name)\n      (linear_function\n        (name)\n        (name)))\n    (type_synomym\n      (name)\n      (linear_function\n        (name)\n        (name)))))\n\n================================================================================\ntype: unboxed nullary tuple\n================================================================================\n\ntype A = (# #)\ntype A = (##)\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (type_synomym\n      (name)\n      (unboxed_unit))\n    (type_synomym\n      (name)\n      (unboxed_unit))))\n\n================================================================================\ntype: unboxed unary tuple\n================================================================================\n\ntype A = (# a #)\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (type_synomym\n      (name)\n      (unboxed_tuple\n        (variable)))))\n\n================================================================================\ntype: unboxed tuple with newline after opening brace\n================================================================================\n\ntype A =\n  (#\n    a #)\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (type_synomym\n      (name)\n      (unboxed_tuple\n        (variable)))))\n\n================================================================================\ntype: unboxed tuple with newline before closing brace\n================================================================================\n\ntype A =\n  (# a\n    #)\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (type_synomym\n      (name)\n      (unboxed_tuple\n        (variable)))))\n\n================================================================================\ntype: unboxed sum\n================================================================================\n\ntype A = (# A | A# #)\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (type_synomym\n      (name)\n      (unboxed_sum\n        (name)\n        (name)))))\n\n================================================================================\ntype: prefix notation unboxed tuple\n================================================================================\n\ntype A = (# ,,, #) @A @A A# A#\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (type_synomym\n      (name)\n      (apply\n        (apply\n          (apply\n            (apply\n              (prefix_unboxed_tuple)\n              (kind_application\n                (name)))\n            (kind_application\n              (name)))\n          (name))\n        (name)))))\n\n================================================================================\ntype: prefix notation unboxed sum\n================================================================================\n\ntype A = (# | #) @A @A A# A#\ntype A = (# | | | #) @A @A A# A#\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (type_synomym\n      (name)\n      (apply\n        (apply\n          (apply\n            (apply\n              (prefix_unboxed_sum)\n              (kind_application\n                (name)))\n            (kind_application\n              (name)))\n          (name))\n        (name)))\n    (type_synomym\n      (name)\n      (apply\n        (apply\n          (apply\n            (apply\n              (prefix_unboxed_sum)\n              (kind_application\n                (name)))\n            (kind_application\n              (name)))\n          (name))\n        (name)))))\n\n================================================================================\ntype: unicode arrows\n================================================================================\n\ntype A = A ⇒ a → a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (type_synomym\n      (name)\n      (context\n        (name)\n        (function\n          (variable)\n          (variable))))))\n\n================================================================================\ntype: unicode star\n================================================================================\n\ntype A = ★\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (type_synomym\n      (name)\n      (star))))\n\n================================================================================\ntype: kind application\n================================================================================\n\ntype A = A @A @A A\ntype A = A @A A\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (type_synomym\n      (name)\n      (apply\n        (apply\n          (apply\n            (name)\n            (kind_application\n              (name)))\n          (kind_application\n            (name)))\n        (name)))\n    (type_synomym\n      (name)\n      (apply\n        (apply\n          (name)\n          (kind_application\n            (name)))\n        (name)))))\n\n================================================================================\ntype: kind signature in nested type\n================================================================================\n\ntype A = (∀ a . A (a :: A) => a :: A, A)\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (type_synomym\n      (name)\n      (tuple\n        (signature\n          (forall\n            (quantified_variables\n              (variable))\n            (context\n              (apply\n                (name)\n                (parens\n                  (signature\n                    (variable)\n                    (name))))\n              (variable)))\n          (name))\n        (name)))))\n\n================================================================================\ntype: inferred binder at column 0\n================================================================================\n\ntype A :: ∀ {\na\n} . a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (kind_signature\n      (name)\n      (forall\n        (quantified_variables\n          (inferred\n            (variable)))\n        (variable)))))\n\n================================================================================\ntype: double signature\n================================================================================\n\ntype A = (A :: A) :: A\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (type_synomym\n      (name)\n      (signature\n        (parens\n          (signature\n            (name)\n            (name)))\n        (name)))))\n\n================================================================================\ntype: HKT annotation\n================================================================================\n\ntype A = (a :: (* -> *) -> *) -> a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (type_synomym\n      (name)\n      (function\n        (parens\n          (signature\n            (variable)\n            (function\n              (parens\n                (function\n                  (star)\n                  (star)))\n              (star))))\n        (variable)))))\n\n================================================================================\ntype: splice\n================================================================================\n\ntype A = a -> $(a ''A) -> a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (type_synomym\n      (name)\n      (function\n        (variable)\n        (function\n          (splice\n            (parens\n              (apply\n                (variable)\n                (th_quoted_name\n                  (name)))))\n          (variable))))))\n\n================================================================================\ntype: quasiquote\n================================================================================\n\ntype A = a -> [a|a|] -> a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (type_synomym\n      (name)\n      (function\n        (variable)\n        (function\n          (quasiquote\n            (quoter\n              (variable))\n            (quasiquote_body))\n          (variable))))))\n\n================================================================================\ntype: inferred type variable\n================================================================================\n\ntype A = ∀ {a} {a :: A} a . a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (type_synomym\n      (name)\n      (forall\n        (quantified_variables\n          (inferred\n            (variable))\n          (inferred\n            (annotated\n              (variable)\n              (name)))\n          (variable))\n        (variable)))))\n\n================================================================================\ntype: required type arguments\n================================================================================\n\ntype A = ∀ a (a :: A) {a :: A} -> forall a -> forall a . a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (type_synomym\n      (name)\n      (forall_required\n        (quantified_variables\n          (variable)\n          (parens\n            (annotated\n              (variable)\n              (name)))\n          (inferred\n            (annotated\n              (variable)\n              (name))))\n        (forall_required\n          (quantified_variables\n            (variable))\n          (forall\n            (quantified_variables\n              (variable))\n            (variable)))))))\n\n================================================================================\ntype: forall without variables\n================================================================================\n\ntype A = ∀ . a\ntype A = ∀ -> a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (type_synomym\n      (name)\n      (forall\n        (variable)))\n    (type_synomym\n      (name)\n      (forall_required\n        (variable)))))\n"
  },
  {
    "path": "test/corpus/varsym.txt",
    "content": "================================================================================\nvarsym: error: |\n================================================================================\n\nf = a | a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (variable))))\n  (ERROR\n    (variable)))\n\n================================================================================\nvarsym: error: lambda\n================================================================================\n\nf = a \\\\ a\nf = a \\ a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (infix\n          (variable)\n          (operator)\n          (variable))))\n    (bind\n      (variable)\n      (match\n        (variable)))\n    (ERROR\n      (variable))))\n\n================================================================================\nvarsym: error: ..\n================================================================================\n\nf = a .. a\nf = a ... a\nf = a . a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (apply\n          (variable)\n          (ERROR)\n          (variable))))\n    (bind\n      (variable)\n      (match\n        (infix\n          (variable)\n          (operator)\n          (variable))))\n    (bind\n      (variable)\n      (match\n        (infix\n          (variable)\n          (operator)\n          (variable))))))\n\n================================================================================\nvarsym: error: arrow\n================================================================================\n\nf = a -> a\nf = a |> a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (apply\n          (variable)\n          (ERROR)\n          (variable))))\n    (bind\n      (variable)\n      (match\n        (infix\n          (variable)\n          (operator)\n          (variable))))))\n\n================================================================================\nvarsym: error: carrow\n================================================================================\n\nf = a => a\nf = a =>> a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (apply\n          (variable)\n          (ERROR\n            (UNEXPECTED '>'))\n          (variable))))\n    (bind\n      (variable)\n      (match\n        (infix\n          (variable)\n          (operator)\n          (variable))))))\n\n================================================================================\nvarsym: error: larrow\n================================================================================\n\nf = a < a\nf = a <- a\nf = a <-- a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (infix\n          (variable)\n          (operator)\n          (variable))))\n    (bind\n      (variable)\n      (match\n        (apply\n          (variable)\n          (ERROR)\n          (variable))))\n    (bind\n      (variable)\n      (match\n        (infix\n          (variable)\n          (operator)\n          (variable))))))\n\n================================================================================\nvarsym: error: @\n================================================================================\n\nf = a @ a\nf = a @@ a\nf = a @! a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (infix\n          (variable)\n          (operator)\n          (variable))))\n    (bind\n      (variable)\n      (match\n        (infix\n          (variable)\n          (operator)\n          (variable))))\n    (bind\n      (variable)\n      (match\n        (infix\n          (variable)\n          (operator)\n          (variable))))))\n\n================================================================================\nvarsym: error: equals\n================================================================================\n\na = a = a\na = a == a\na == a\na a a == a\na =>> a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (apply\n          (variable)\n          (ERROR)\n          (variable))))\n    (bind\n      (variable)\n      (match\n        (infix\n          (variable)\n          (operator)\n          (variable))))\n    (top_splice\n      (infix\n        (variable)\n        (operator)\n        (variable)))\n    (top_splice\n      (infix\n        (apply\n          (apply\n            (variable)\n            (variable))\n          (variable))\n        (operator)\n        (variable)))\n    (top_splice\n      (infix\n        (variable)\n        (operator)\n        (variable)))))\n\n================================================================================\nvarsym: error: leading :\n================================================================================\n\nf = a :+ a\nf = a +: a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (infix\n          (variable)\n          (constructor_operator)\n          (variable))))\n    (bind\n      (variable)\n      (match\n        (infix\n          (variable)\n          (operator)\n          (variable))))))\n\n================================================================================\nvarsym: comment with more than two dashes\n================================================================================\n\na = a --- a\na = a ----- a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (variable)))\n    (comment)\n    (bind\n      (variable)\n      (match\n        (variable)))\n    (comment)))\n\n================================================================================\nvarsym: operator with large number of dashes\n================================================================================\n\na = a ------> a ----- %\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (infix\n          (variable)\n          (operator)\n          (variable))))\n    (comment)))\n\n================================================================================\nvarsym: implicit parameter\n================================================================================\n\na = ?a\n(?) = a\na = a ? a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (variable)\n      (match\n        (implicit_variable)))\n    (bind\n      (prefix_id\n        (operator))\n      (match\n        (variable)))\n    (bind\n      (variable)\n      (match\n        (infix\n          (variable)\n          (operator)\n          (variable))))))\n\n================================================================================\nvarsym: dollar terminated by opening bracket\n================================================================================\n\n-- Deliberately excluded from splice expressions to avoid parser size explosion\na = a $[a]\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (comment)\n  (declarations\n    (bind\n      (variable)\n      (match\n        (infix\n          (variable)\n          (operator)\n          (list\n            (variable)))))))\n\n================================================================================\nvarsym: unicode symbol\n================================================================================\n\n(▽/▽) = a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (prefix_id\n        (operator))\n      (match\n        (variable)))))\n\n================================================================================\nvarsym: single-char operator: bang\n================================================================================\n\n(!) = (!)\na = a!a\na = a! a\na = a !a\na = a ! a\na = (a ! a)\na = a A.! a\na = a !! a\na = (a !! a)\na ! a = a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (prefix_id\n        (operator))\n      (match\n        (prefix_id\n          (operator))))\n    (bind\n      (variable)\n      (match\n        (infix\n          (variable)\n          (operator)\n          (variable))))\n    (bind\n      (variable)\n      (match\n        (infix\n          (variable)\n          (operator)\n          (variable))))\n    (bind\n      (variable)\n      (match\n        (infix\n          (variable)\n          (operator)\n          (variable))))\n    (bind\n      (variable)\n      (match\n        (infix\n          (variable)\n          (operator)\n          (variable))))\n    (bind\n      (variable)\n      (match\n        (parens\n          (infix\n            (variable)\n            (operator)\n            (variable)))))\n    (bind\n      (variable)\n      (match\n        (infix\n          (variable)\n          (qualified\n            (module\n              (module_id))\n            (operator))\n          (variable))))\n    (bind\n      (variable)\n      (match\n        (infix\n          (variable)\n          (operator)\n          (variable))))\n    (bind\n      (variable)\n      (match\n        (parens\n          (infix\n            (variable)\n            (operator)\n            (variable)))))\n    (function\n      (infix\n        (variable)\n        (operator)\n        (variable))\n      (match\n        (variable)))))\n\n================================================================================\nvarsym: single-char operator: hash\n================================================================================\n\n(#) = (#)\na = a#a\na = a# a\na = a #a\na = a # a\na = (a # a)\na = a A.# a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (prefix_id\n        (operator))\n      (match\n        (prefix_id\n          (operator))))\n    (bind\n      (variable)\n      (match\n        (apply\n          (variable)\n          (variable))))\n    (bind\n      (variable)\n      (match\n        (apply\n          (variable)\n          (variable))))\n    (bind\n      (variable)\n      (match\n        (apply\n          (variable)\n          (label))))\n    (bind\n      (variable)\n      (match\n        (infix\n          (variable)\n          (operator)\n          (variable))))\n    (bind\n      (variable)\n      (match\n        (parens\n          (infix\n            (variable)\n            (operator)\n            (variable)))))\n    (bind\n      (variable)\n      (match\n        (infix\n          (variable)\n          (qualified\n            (module\n              (module_id))\n            (operator))\n          (variable))))))\n\n================================================================================\nvarsym: single-char operator: dollar\n================================================================================\n\n($) = ($)\n-- This turned wrong after moving dollar parsing out of the scanner, but it probably doesn't matter much.\na = a$a\na = a$ a\na = a $a\na = a $ a\na = a $$ a\na = a $$$ a\na = (a $ a)\na = a A.$ a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (prefix_id\n        (operator))\n      (match\n        (prefix_id\n          (operator))))\n    (comment)\n    (bind\n      (variable)\n      (match\n        (apply\n          (variable)\n          (splice\n            (variable)))))\n    (bind\n      (variable)\n      (match\n        (infix\n          (variable)\n          (operator)\n          (variable))))\n    (bind\n      (variable)\n      (match\n        (apply\n          (variable)\n          (splice\n            (variable)))))\n    (bind\n      (variable)\n      (match\n        (infix\n          (variable)\n          (operator)\n          (variable))))\n    (bind\n      (variable)\n      (match\n        (infix\n          (variable)\n          (operator)\n          (variable))))\n    (bind\n      (variable)\n      (match\n        (infix\n          (variable)\n          (operator)\n          (variable))))\n    (bind\n      (variable)\n      (match\n        (parens\n          (infix\n            (variable)\n            (operator)\n            (variable)))))\n    (bind\n      (variable)\n      (match\n        (infix\n          (variable)\n          (qualified\n            (module\n              (module_id))\n            (operator))\n          (variable))))))\n\n================================================================================\nvarsym: single-char operator: percent\n================================================================================\n\n(%) = (%)\na = a%a\na = a% a\na = a %a\na = a % a\na = (a % a)\na = a A.% a\ntype A = a % a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (prefix_id\n        (operator))\n      (match\n        (prefix_id\n          (operator))))\n    (bind\n      (variable)\n      (match\n        (infix\n          (variable)\n          (operator)\n          (variable))))\n    (bind\n      (variable)\n      (match\n        (infix\n          (variable)\n          (operator)\n          (variable))))\n    (bind\n      (variable)\n      (match\n        (infix\n          (variable)\n          (operator)\n          (variable))))\n    (bind\n      (variable)\n      (match\n        (infix\n          (variable)\n          (operator)\n          (variable))))\n    (bind\n      (variable)\n      (match\n        (parens\n          (infix\n            (variable)\n            (operator)\n            (variable)))))\n    (bind\n      (variable)\n      (match\n        (infix\n          (variable)\n          (qualified\n            (module\n              (module_id))\n            (operator))\n          (variable))))\n    (type_synomym\n      (name)\n      (infix\n        (variable)\n        (operator)\n        (variable)))))\n\n================================================================================\nvarsym: single-char operator: ampersand\n================================================================================\n\n(&) = (&)\na = a&a\na = a& a\na = a &a\na = a & a\na = (a & a)\na = a A.& a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (prefix_id\n        (operator))\n      (match\n        (prefix_id\n          (operator))))\n    (bind\n      (variable)\n      (match\n        (infix\n          (variable)\n          (operator)\n          (variable))))\n    (bind\n      (variable)\n      (match\n        (infix\n          (variable)\n          (operator)\n          (variable))))\n    (bind\n      (variable)\n      (match\n        (infix\n          (variable)\n          (operator)\n          (variable))))\n    (bind\n      (variable)\n      (match\n        (infix\n          (variable)\n          (operator)\n          (variable))))\n    (bind\n      (variable)\n      (match\n        (parens\n          (infix\n            (variable)\n            (operator)\n            (variable)))))\n    (bind\n      (variable)\n      (match\n        (infix\n          (variable)\n          (qualified\n            (module\n              (module_id))\n            (operator))\n          (variable))))))\n\n================================================================================\nvarsym: single-char operator: star\n================================================================================\n\n(⋆) = (⋆)\na = a⋆a\na = a⋆ a\na = a ⋆a\na = a ⋆ a\na = (a ⋆ a)\na = a A.⋆ a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (prefix_id\n        (operator))\n      (match\n        (prefix_id\n          (operator))))\n    (bind\n      (variable)\n      (match\n        (infix\n          (variable)\n          (operator)\n          (variable))))\n    (bind\n      (variable)\n      (match\n        (infix\n          (variable)\n          (operator)\n          (variable))))\n    (bind\n      (variable)\n      (match\n        (infix\n          (variable)\n          (operator)\n          (variable))))\n    (bind\n      (variable)\n      (match\n        (infix\n          (variable)\n          (operator)\n          (variable))))\n    (bind\n      (variable)\n      (match\n        (parens\n          (infix\n            (variable)\n            (operator)\n            (variable)))))\n    (bind\n      (variable)\n      (match\n        (infix\n          (variable)\n          (qualified\n            (module\n              (module_id))\n            (operator))\n          (variable))))))\n\n================================================================================\nvarsym: single-char operator: asterisk\n================================================================================\n\n(*) = (*)\na = a*a\na = a* a\na = a *a\na = a * a\na = (a * a)\na = a A.* a\ntype A = * -> *\ntype A = (* -> *)\ntype A = A * A\na = (a *)\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (prefix_id\n        (operator))\n      (match\n        (prefix_id\n          (operator))))\n    (bind\n      (variable)\n      (match\n        (infix\n          (variable)\n          (operator)\n          (variable))))\n    (bind\n      (variable)\n      (match\n        (infix\n          (variable)\n          (operator)\n          (variable))))\n    (bind\n      (variable)\n      (match\n        (infix\n          (variable)\n          (operator)\n          (variable))))\n    (bind\n      (variable)\n      (match\n        (infix\n          (variable)\n          (operator)\n          (variable))))\n    (bind\n      (variable)\n      (match\n        (parens\n          (infix\n            (variable)\n            (operator)\n            (variable)))))\n    (bind\n      (variable)\n      (match\n        (infix\n          (variable)\n          (qualified\n            (module\n              (module_id))\n            (operator))\n          (variable))))\n    (type_synomym\n      (name)\n      (function\n        (star)\n        (star)))\n    (type_synomym\n      (name)\n      (parens\n        (function\n          (star)\n          (star))))\n    (type_synomym\n      (name)\n      (infix\n        (name)\n        (operator)\n        (name)))\n    (bind\n      (variable)\n      (match\n        (left_section\n          (variable)\n          (operator))))))\n\n================================================================================\nvarsym: single-char operator: plus\n================================================================================\n\n(+) = (+)\na = a+a\na = a+ a\na = a +a\na = a + a\na = a A.+ a\na = (a + a)\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (prefix_id\n        (operator))\n      (match\n        (prefix_id\n          (operator))))\n    (bind\n      (variable)\n      (match\n        (infix\n          (variable)\n          (operator)\n          (variable))))\n    (bind\n      (variable)\n      (match\n        (infix\n          (variable)\n          (operator)\n          (variable))))\n    (bind\n      (variable)\n      (match\n        (infix\n          (variable)\n          (operator)\n          (variable))))\n    (bind\n      (variable)\n      (match\n        (infix\n          (variable)\n          (operator)\n          (variable))))\n    (bind\n      (variable)\n      (match\n        (infix\n          (variable)\n          (qualified\n            (module\n              (module_id))\n            (operator))\n          (variable))))\n    (bind\n      (variable)\n      (match\n        (parens\n          (infix\n            (variable)\n            (operator)\n            (variable)))))))\n\n================================================================================\nvarsym: single-char operator: dot\n================================================================================\n\n(.) = (.)\na = a.a\na = a. a\na = a .a\na = a . a\na = (a . a)\na = a A.. a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (prefix_id\n        (operator))\n      (match\n        (prefix_id\n          (operator))))\n    (bind\n      (variable)\n      (match\n        (projection\n          (variable)\n          (field_name\n            (variable)))))\n    (bind\n      (variable)\n      (match\n        (infix\n          (variable)\n          (operator)\n          (variable))))\n    (bind\n      (variable)\n      (match\n        (infix\n          (variable)\n          (operator)\n          (variable))))\n    (bind\n      (variable)\n      (match\n        (infix\n          (variable)\n          (operator)\n          (variable))))\n    (bind\n      (variable)\n      (match\n        (parens\n          (infix\n            (variable)\n            (operator)\n            (variable)))))\n    (bind\n      (variable)\n      (match\n        (infix\n          (variable)\n          (qualified\n            (module\n              (module_id))\n            (operator))\n          (variable))))))\n\n================================================================================\nvarsym: single-char operator: slash\n================================================================================\n\n(/) = (/)\na = a/a\na = a/ a\na = a /a\na = a / a\na = (a / a)\na = a A./ a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (prefix_id\n        (operator))\n      (match\n        (prefix_id\n          (operator))))\n    (bind\n      (variable)\n      (match\n        (infix\n          (variable)\n          (operator)\n          (variable))))\n    (bind\n      (variable)\n      (match\n        (infix\n          (variable)\n          (operator)\n          (variable))))\n    (bind\n      (variable)\n      (match\n        (infix\n          (variable)\n          (operator)\n          (variable))))\n    (bind\n      (variable)\n      (match\n        (infix\n          (variable)\n          (operator)\n          (variable))))\n    (bind\n      (variable)\n      (match\n        (parens\n          (infix\n            (variable)\n            (operator)\n            (variable)))))\n    (bind\n      (variable)\n      (match\n        (infix\n          (variable)\n          (qualified\n            (module\n              (module_id))\n            (operator))\n          (variable))))))\n\n================================================================================\nvarsym: single-char operator: left angle\n================================================================================\n\n(<) = (<)\na = a<a\na = a< a\na = a <a\na = a < a\na = (a < a)\na = a A.< a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (prefix_id\n        (operator))\n      (match\n        (prefix_id\n          (operator))))\n    (bind\n      (variable)\n      (match\n        (infix\n          (variable)\n          (operator)\n          (variable))))\n    (bind\n      (variable)\n      (match\n        (infix\n          (variable)\n          (operator)\n          (variable))))\n    (bind\n      (variable)\n      (match\n        (infix\n          (variable)\n          (operator)\n          (variable))))\n    (bind\n      (variable)\n      (match\n        (infix\n          (variable)\n          (operator)\n          (variable))))\n    (bind\n      (variable)\n      (match\n        (parens\n          (infix\n            (variable)\n            (operator)\n            (variable)))))\n    (bind\n      (variable)\n      (match\n        (infix\n          (variable)\n          (qualified\n            (module\n              (module_id))\n            (operator))\n          (variable))))))\n\n================================================================================\nvarsym: single-char operator: right angle\n================================================================================\n\n(>) = (>)\na = a>a\na = a> a\na = a >a\na = a > a\na = (a > a)\na = a A.> a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (prefix_id\n        (operator))\n      (match\n        (prefix_id\n          (operator))))\n    (bind\n      (variable)\n      (match\n        (infix\n          (variable)\n          (operator)\n          (variable))))\n    (bind\n      (variable)\n      (match\n        (infix\n          (variable)\n          (operator)\n          (variable))))\n    (bind\n      (variable)\n      (match\n        (infix\n          (variable)\n          (operator)\n          (variable))))\n    (bind\n      (variable)\n      (match\n        (infix\n          (variable)\n          (operator)\n          (variable))))\n    (bind\n      (variable)\n      (match\n        (parens\n          (infix\n            (variable)\n            (operator)\n            (variable)))))\n    (bind\n      (variable)\n      (match\n        (infix\n          (variable)\n          (qualified\n            (module\n              (module_id))\n            (operator))\n          (variable))))))\n\n================================================================================\nvarsym: single-char operator: question mark\n================================================================================\n\n(?) = (?)\n-- This is correct\na = a?a\na = a? a\na = a ?a\na = a ? a\na = (a ? a)\na = a A.? a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (prefix_id\n        (operator))\n      (match\n        (prefix_id\n          (operator))))\n    (comment)\n    (bind\n      (variable)\n      (match\n        (apply\n          (variable)\n          (implicit_variable))))\n    (bind\n      (variable)\n      (match\n        (infix\n          (variable)\n          (operator)\n          (variable))))\n    (bind\n      (variable)\n      (match\n        (apply\n          (variable)\n          (implicit_variable))))\n    (bind\n      (variable)\n      (match\n        (infix\n          (variable)\n          (operator)\n          (variable))))\n    (bind\n      (variable)\n      (match\n        (parens\n          (infix\n            (variable)\n            (operator)\n            (variable)))))\n    (bind\n      (variable)\n      (match\n        (infix\n          (variable)\n          (qualified\n            (module\n              (module_id))\n            (operator))\n          (variable))))))\n\n================================================================================\nvarsym: single-char operator: circumflex\n================================================================================\n\n(^) = (^)\na = a^a\na = a^ a\na = a ^a\na = a ^ a\na = (a ^ a)\na = a A.^ a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (prefix_id\n        (operator))\n      (match\n        (prefix_id\n          (operator))))\n    (bind\n      (variable)\n      (match\n        (infix\n          (variable)\n          (operator)\n          (variable))))\n    (bind\n      (variable)\n      (match\n        (infix\n          (variable)\n          (operator)\n          (variable))))\n    (bind\n      (variable)\n      (match\n        (infix\n          (variable)\n          (operator)\n          (variable))))\n    (bind\n      (variable)\n      (match\n        (infix\n          (variable)\n          (operator)\n          (variable))))\n    (bind\n      (variable)\n      (match\n        (parens\n          (infix\n            (variable)\n            (operator)\n            (variable)))))\n    (bind\n      (variable)\n      (match\n        (infix\n          (variable)\n          (qualified\n            (module\n              (module_id))\n            (operator))\n          (variable))))))\n\n================================================================================\nvarsym: single-char operator: minus\n================================================================================\n\n(-) = (-)\na = a-a\na = a- a\n-- This is correct – absence of whitespace doesn't change the interpretation to negation.\na = a -a\na = a - a\na = (a - a)\na = a A.- a\na = (-a)\na = (- a)\na = (a -)\na = -a\na = -(a)\na = (+++ - a)\na - a = a\ntype A = a - 1\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (prefix_id\n        (operator))\n      (match\n        (prefix_id\n          (operator))))\n    (bind\n      (variable)\n      (match\n        (infix\n          (variable)\n          (operator)\n          (variable))))\n    (bind\n      (variable)\n      (match\n        (infix\n          (variable)\n          (operator)\n          (variable))))\n    (comment)\n    (bind\n      (variable)\n      (match\n        (infix\n          (variable)\n          (operator)\n          (variable))))\n    (bind\n      (variable)\n      (match\n        (infix\n          (variable)\n          (operator)\n          (variable))))\n    (bind\n      (variable)\n      (match\n        (parens\n          (infix\n            (variable)\n            (operator)\n            (variable)))))\n    (bind\n      (variable)\n      (match\n        (infix\n          (variable)\n          (qualified\n            (module\n              (module_id))\n            (operator))\n          (variable))))\n    (bind\n      (variable)\n      (match\n        (parens\n          (negation\n            (variable)))))\n    (bind\n      (variable)\n      (match\n        (parens\n          (negation\n            (variable)))))\n    (bind\n      (variable)\n      (match\n        (left_section\n          (variable)\n          (operator))))\n    (bind\n      (variable)\n      (match\n        (negation\n          (variable))))\n    (bind\n      (variable)\n      (match\n        (negation\n          (parens\n            (variable)))))\n    (bind\n      (variable)\n      (match\n        (right_section\n          (operator)\n          (negation\n            (variable)))))\n    (function\n      (infix\n        (variable)\n        (operator)\n        (variable))\n      (match\n        (variable)))\n    (type_synomym\n      (name)\n      (infix\n        (variable)\n        (operator)\n        (literal\n          (integer))))))\n\n================================================================================\nvarsym: single-char operator: tilde\n================================================================================\n\n(~) = (~)\na = a~a\na = a~ a\na = a ~a\na = a ~ a\na = (a ~ a)\na = a A.~ a\na = a ~~ a\na = (a ~~ a)\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (prefix_id\n        (operator))\n      (match\n        (prefix_id\n          (operator))))\n    (bind\n      (variable)\n      (match\n        (infix\n          (variable)\n          (operator)\n          (variable))))\n    (bind\n      (variable)\n      (match\n        (infix\n          (variable)\n          (operator)\n          (variable))))\n    (bind\n      (variable)\n      (match\n        (infix\n          (variable)\n          (operator)\n          (variable))))\n    (bind\n      (variable)\n      (match\n        (infix\n          (variable)\n          (operator)\n          (variable))))\n    (bind\n      (variable)\n      (match\n        (parens\n          (infix\n            (variable)\n            (operator)\n            (variable)))))\n    (bind\n      (variable)\n      (match\n        (infix\n          (variable)\n          (qualified\n            (module\n              (module_id))\n            (operator))\n          (variable))))\n    (bind\n      (variable)\n      (match\n        (infix\n          (variable)\n          (operator)\n          (variable))))\n    (bind\n      (variable)\n      (match\n        (parens\n          (infix\n            (variable)\n            (operator)\n            (variable)))))))\n\n================================================================================\nvarsym: single-char operator: colon\n================================================================================\n\n(:) = (:)\na = a:a\na = a: a\na = a :a\na = a : a\na = (a : a)\na = a A.: a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (bind\n      (prefix_id\n        (constructor_operator))\n      (match\n        (prefix_id\n          (constructor_operator))))\n    (bind\n      (variable)\n      (match\n        (infix\n          (variable)\n          (constructor_operator)\n          (variable))))\n    (bind\n      (variable)\n      (match\n        (infix\n          (variable)\n          (constructor_operator)\n          (variable))))\n    (bind\n      (variable)\n      (match\n        (infix\n          (variable)\n          (constructor_operator)\n          (variable))))\n    (bind\n      (variable)\n      (match\n        (infix\n          (variable)\n          (constructor_operator)\n          (variable))))\n    (bind\n      (variable)\n      (match\n        (parens\n          (infix\n            (variable)\n            (constructor_operator)\n            (variable)))))\n    (bind\n      (variable)\n      (match\n        (infix\n          (variable)\n          (qualified\n            (module\n              (module_id))\n            (constructor_operator))\n          (variable))))))\n\n================================================================================\nvarsym: operators with bar\n================================================================================\n\na |> a = a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (function\n      (infix\n        (variable)\n        (operator)\n        (variable))\n      (match\n        (variable)))))\n\n================================================================================\nvarsym: operators with dollar\n================================================================================\n\na $! a = a\na = a $! a\n\n--------------------------------------------------------------------------------\n\n(haskell\n  (declarations\n    (function\n      (infix\n        (variable)\n        (operator)\n        (variable))\n      (match\n        (variable)))\n    (bind\n      (variable)\n      (match\n        (infix\n          (variable)\n          (operator)\n          (variable))))))\n"
  },
  {
    "path": "tree-sitter.json",
    "content": "{\n  \"grammars\": [\n    {\n      \"name\": \"haskell\",\n      \"camelcase\": \"Haskell\",\n      \"scope\": \"source.haskell\",\n      \"path\": \".\",\n      \"file-types\": [\n        \"hs\",\n        \"hs-boot\"\n      ],\n      \"highlights\": \"queries/highlights.scm\",\n      \"injection-regex\": \"^(hs|haskell)$\"\n    }\n  ],\n  \"metadata\": {\n    \"version\": \"0.23.1\",\n    \"license\": \"MIT\",\n    \"description\": \"Haskell grammar for tree-sitter\",\n    \"authors\": [\n      {\n        \"name\": \"Rick Winfrey\"\n      },\n      {\n        \"name\": \"Max Brunsfeld\",\n        \"email\": \"maxbrunsfeld@gmail.com\"\n      },\n      {\n        \"name\": \"Owen Shepherd\"\n      },\n      {\n        \"name\": \"Torsten Schmits\"\n      }\n    ],\n    \"links\": {\n      \"repository\": \"https://github.com/tree-sitter/tree-sitter-haskell\"\n    }\n  },\n  \"bindings\": {\n    \"c\": true,\n    \"go\": true,\n    \"node\": true,\n    \"python\": true,\n    \"rust\": true,\n    \"swift\": true\n  }\n}\n"
  }
]