From cbad88dfb26c55f00bd82aa5aac8f6a98b40f7a7 Mon Sep 17 00:00:00 2001
From: Felix Wolf <60103963+Felalolf@users.noreply.github.com>
Date: Mon, 3 Oct 2022 17:57:24 +0200
Subject: [PATCH 001/296] Use let expressions in encoding to reduce redundancy
(#535)
* added some let expressions in the encoding
* Update src/main/scala/viper/gobra/translator/util/ViperUtil.scala
---
.../gobra/translator/context/Context.scala | 2 +
.../encodings/combinators/TypeEncoding.scala | 16 ++++++
.../structs/SharedStructComponent.scala | 18 +++++--
.../encodings/structs/StructEncoding.scala | 45 +++++++++++------
.../typeless/AssertionEncoding.scala | 2 +-
.../library/outlines/OutlinesImpl.scala | 5 +-
.../gobra/translator/util/ViperUtil.scala | 49 +++++++++++++++++++
.../gobra/translator/util/ViperWriter.scala | 39 +++++++++++----
8 files changed, 144 insertions(+), 32 deletions(-)
diff --git a/src/main/scala/viper/gobra/translator/context/Context.scala b/src/main/scala/viper/gobra/translator/context/Context.scala
index 8486924e3..202c7d710 100644
--- a/src/main/scala/viper/gobra/translator/context/Context.scala
+++ b/src/main/scala/viper/gobra/translator/context/Context.scala
@@ -95,6 +95,8 @@ trait Context {
def reference(x: in.Location): CodeWriter[vpr.Exp] = typeEncoding.reference(this)(x)
+ def value(x: in.Expr): CodeWriter[vpr.Exp] = typeEncoding.value(this)(x)
+
def footprint(x: in.Location, perm: in.Expr): CodeWriter[vpr.Exp] = typeEncoding.addressFootprint(this)(x, perm)
def isComparable(x: in.Expr): Either[Boolean, CodeWriter[vpr.Exp]] = typeEncoding.isComparable(this)(x)
diff --git a/src/main/scala/viper/gobra/translator/encodings/combinators/TypeEncoding.scala b/src/main/scala/viper/gobra/translator/encodings/combinators/TypeEncoding.scala
index ede5d7669..32ecd72d1 100644
--- a/src/main/scala/viper/gobra/translator/encodings/combinators/TypeEncoding.scala
+++ b/src/main/scala/viper/gobra/translator/encodings/combinators/TypeEncoding.scala
@@ -272,6 +272,22 @@ trait TypeEncoding extends Generator {
unit(vprExpr)
}
+ /**
+ * Encodes an expression such that substitution is possible.
+ * For an expression `e` and a context `K`, the encoding of K[e] is semantically equal to K[x] with x := Value[e].
+ *
+ * Value[ e: T° ] = [e]
+ * Value[ loc: T@ ] = R[loc]
+ *
+ * */
+ final def value(ctx: Context): in.Expr ==> CodeWriter[vpr.Exp] = {
+ val liftedResult: in.Expr => Option[CodeWriter[vpr.Exp]] = {
+ case (l: in.Location) :: _ / Shared => reference(ctx).lift(l)
+ case e => finalExpression(ctx).lift(e)
+ }
+ liftedResult.unlift
+ }
+
/**
* Encodes the permissions for all addresses of a shared type,
* i.e. all permissions involved in converting the shared location to an exclusive r-value.
diff --git a/src/main/scala/viper/gobra/translator/encodings/structs/SharedStructComponent.scala b/src/main/scala/viper/gobra/translator/encodings/structs/SharedStructComponent.scala
index 58f41447f..7d7e9a7ea 100644
--- a/src/main/scala/viper/gobra/translator/encodings/structs/SharedStructComponent.scala
+++ b/src/main/scala/viper/gobra/translator/encodings/structs/SharedStructComponent.scala
@@ -37,8 +37,13 @@ trait SharedStructComponent extends Generator {
loc match {
case _ :: ctx.Struct(fs) / Shared =>
val vti = cptParam(fs)(ctx)
- val locFAs = fs.map(f => in.FieldRef(loc, f)(loc.info))
- sequence(locFAs.map(fa => ctx.expression(fa))).map(ex.create(_, vti)(loc)(ctx))
+ pure(
+ for {
+ x <- bind(loc)(ctx)
+ locFAs = fs.map(f => in.FieldRef(x, f)(loc.info))
+ args <- sequence(locFAs.map(fa => ctx.expression(fa)))
+ } yield ex.create(args, vti)(loc)(ctx)
+ )(ctx)
case _ :: t => Violation.violation(s"expected struct, but got $t")
}
@@ -56,8 +61,13 @@ trait SharedStructComponent extends Generator {
loc match {
case _ :: ctx.Struct(fs) / Shared =>
val (pos, info, errT) = loc.vprMeta
- val locFAs = fs.map(f => in.FieldRef(loc, f)(loc.info))
- sequence(locFAs.map(fa => ctx.footprint(fa, perm))).map(VU.bigAnd(_)(pos, info, errT))
+ pure(
+ for {
+ x <- bind(loc)(ctx)
+ locFAs = fs.map(f => in.FieldRef(x, f)(loc.info))
+ parts <- sequence(locFAs.map(fa => ctx.footprint(fa, perm)))
+ } yield VU.bigAnd(parts)(pos, info, errT)
+ )(ctx)
case _ :: t => Violation.violation(s"expected struct, but got $t")
}
diff --git a/src/main/scala/viper/gobra/translator/encodings/structs/StructEncoding.scala b/src/main/scala/viper/gobra/translator/encodings/structs/StructEncoding.scala
index 180661fb1..c4ad369c6 100644
--- a/src/main/scala/viper/gobra/translator/encodings/structs/StructEncoding.scala
+++ b/src/main/scala/viper/gobra/translator/encodings/structs/StructEncoding.scala
@@ -76,7 +76,10 @@ class StructEncoding extends TypeEncoding {
*/
override def initialization(ctx: Context): in.Location ==> CodeWriter[vpr.Stmt] = {
case l :: ctx.Struct(fs) =>
- seqns(fieldAccesses(l, fs).map(x => ctx.initialization(x)))
+ for {
+ x <- bind(l)(ctx)
+ res <- seqns(fieldAccesses(x, fs).map(x => ctx.initialization(x)))
+ } yield res
}
/**
@@ -102,9 +105,13 @@ class StructEncoding extends TypeEncoding {
ctx.assignment(in.Assignee(fa.recv), in.StructUpdate(fa.recv, fa.field, rhs)(src.info))(src)
case (in.Assignee(lhs :: ctx.Struct(lhsFs) / Shared), rhs :: ctx.Struct(rhsFs), src) =>
- val lhsFAs = fieldAccesses(lhs, lhsFs).map(in.Assignee.Field)
- val rhsFAs = fieldAccesses(rhs, rhsFs)
- seqns((lhsFAs zip rhsFAs).map{ case (lhsFA, rhsFA) => ctx.assignment(lhsFA, rhsFA)(src) })
+ for {
+ x <- bind(lhs)(ctx)
+ y <- bind(rhs)(ctx)
+ lhsFAs = fieldAccesses(x, lhsFs).map(in.Assignee.Field)
+ rhsFAs = fieldAccesses(y, rhsFs)
+ res <- seqns((lhsFAs zip rhsFAs).map { case (lhsFA, rhsFA) => ctx.assignment(lhsFA, rhsFA)(src) })
+ } yield res
}
/**
@@ -125,11 +132,16 @@ class StructEncoding extends TypeEncoding {
*/
override def equal(ctx: Context): (in.Expr, in.Expr, in.Node) ==> CodeWriter[vpr.Exp] = {
case (lhs :: ctx.Struct(lhsFs), rhs :: ctx.Struct(rhsFs), src) =>
- val lhsFAccs = fieldAccesses(lhs, lhsFs)
- val rhsFAccs = fieldAccesses(rhs, rhsFs)
- val equalFields = sequence((lhsFAccs zip rhsFAccs).map{ case (lhsFA, rhsFA) => ctx.equal(lhsFA, rhsFA)(src) })
val (pos, info, errT) = src.vprMeta
- equalFields.map(VU.bigAnd(_)(pos, info, errT))
+ pure(
+ for {
+ x <- bind(lhs)(ctx)
+ y <- bind(rhs)(ctx)
+ lhsFAccs = fieldAccesses(x, lhsFs)
+ rhsFAccs = fieldAccesses(y, rhsFs)
+ equalFields <- sequence((lhsFAccs zip rhsFAccs).map { case (lhsFA, rhsFA) => ctx.equal(lhsFA, rhsFA)(src) })
+ } yield VU.bigAnd(equalFields)(pos, info, errT)
+ )(ctx)
case (lhs :: ctx.*(ctx.Struct(lhsFs)) / Exclusive, rhs :: ctx.*(ctx.Struct(_)), src) =>
if (lhsFs.isEmpty) {
@@ -221,13 +233,16 @@ class StructEncoding extends TypeEncoding {
super.isComparable(ctx)(exp).map{ _ =>
// if executed, then for all fields f, isComb[exp.f] != Left(false)
val (pos, info, errT) = exp.vprMeta
- // fields that are not ghost and with dynamic comparability
- val fsAccs = fieldAccesses(exp, fs.filter(f => !f.ghost))
- val fsComp = fsAccs map ctx.isComparable
- // Left(true) can be removed.
- for {
- args <- sequence(fsComp collect { case Right(e) => e })
- } yield VU.bigAnd(args)(pos, info, errT)
+ pure(
+ for {
+ x <- bind(exp)(ctx)
+ // fields that are not ghost and with dynamic comparability
+ fsAccs = fieldAccesses(x, fs.filter(f => !f.ghost))
+ fsComp = fsAccs map ctx.isComparable
+ // Left(true) can be removed.
+ args <- sequence(fsComp collect { case Right(e) => e })
+ } yield VU.bigAnd(args)(pos, info, errT)
+ )(ctx)
}
}
diff --git a/src/main/scala/viper/gobra/translator/encodings/typeless/AssertionEncoding.scala b/src/main/scala/viper/gobra/translator/encodings/typeless/AssertionEncoding.scala
index 448dc0fbc..d2fdec5b9 100644
--- a/src/main/scala/viper/gobra/translator/encodings/typeless/AssertionEncoding.scala
+++ b/src/main/scala/viper/gobra/translator/encodings/typeless/AssertionEncoding.scala
@@ -67,7 +67,7 @@ class AssertionEncoding extends Encoding {
val (pos, info, errT) = n.vprMeta
for {
newTriggers <- sequence(triggers map (trigger(_)(ctx)))
- newBody <- ctx.assertion(body)
+ newBody <- pure(ctx.assertion(body))(ctx)
newForall = vpr.Forall(newVars, newTriggers, newBody)(pos, info, errT)
desugaredForall = vpr.utility.QuantifiedPermissions.desugarSourceQuantifiedPermissionSyntax(newForall)
triggeredForall = desugaredForall.map(_.autoTrigger)
diff --git a/src/main/scala/viper/gobra/translator/library/outlines/OutlinesImpl.scala b/src/main/scala/viper/gobra/translator/library/outlines/OutlinesImpl.scala
index fa3e6cfac..d19f1117a 100644
--- a/src/main/scala/viper/gobra/translator/library/outlines/OutlinesImpl.scala
+++ b/src/main/scala/viper/gobra/translator/library/outlines/OutlinesImpl.scala
@@ -7,12 +7,11 @@
package viper.gobra.translator.library.outlines
import viper.gobra.translator.util.ViperUtil
-import viper.silver.ast.Member
import viper.silver.{ast => vpr}
class OutlinesImpl extends Outlines {
- override def finalize(addMemberFn: Member => Unit): Unit = {
+ override def finalize(addMemberFn: vpr.Member => Unit): Unit = {
generatedMembers foreach addMemberFn
}
private var generatedMembers: List[vpr.Member] = List.empty
@@ -62,7 +61,7 @@ class OutlinesImpl extends Outlines {
)(pos : vpr.Position, info : vpr.Info, errT : vpr.ErrorTrafo) : vpr.Stmt = {
val (arguments, results) = {
- val bodyFree = body.undeclLocalVars.toSet
+ val bodyFree = ViperUtil.undeclLocalVarsGobraCopy(body).toSet
val preFree = pres
.map(e => vpr.utility.Expressions.freeVariables(e).collect{ case x: vpr.LocalVar => x })
.foldLeft(Set.empty[vpr.LocalVar]){ case (l,r) => l ++ r }
diff --git a/src/main/scala/viper/gobra/translator/util/ViperUtil.scala b/src/main/scala/viper/gobra/translator/util/ViperUtil.scala
index 42441b9df..447f891e3 100644
--- a/src/main/scala/viper/gobra/translator/util/ViperUtil.scala
+++ b/src/main/scala/viper/gobra/translator/util/ViperUtil.scala
@@ -46,4 +46,53 @@ object ViperUtil {
case _ => Violation.violation(s"expected vpr variable or field access, but got $left")
}
}
+
+ /**
+ * TODO: should be removed once the corresponding silver function is fixed, see /silver/issues/610.
+ *
+ * Returns a list of all undeclared local variables used in this statement.
+ * If the same local variable is used with different
+ * types, an exception is thrown.
+ */
+ def undeclLocalVarsGobraCopy(s: Stmt): Seq[LocalVar] = {
+ def extractLocal(n: Node, decls: Seq[LocalVarDecl]) =
+ n match {
+ case l: LocalVar => decls.find(_.name == l.name) match {
+ case None => List(l)
+ case Some(d) if d.typ != l.typ =>
+ sys.error(s"Local variable ${l.name} is declared with type ${d.typ} but used with type ${l.typ}.")
+ case _ => Nil
+ }
+ case _ => Nil
+ }
+
+ def combineLists(s1: Seq[LocalVar], s2: Seq[LocalVar]) = {
+ for (l1 <- s1; l2 <- s2) {
+ if (l1.name == l2.name && l1.typ != l2.typ) {
+ sys.error(s"Local variable ${l1.name} is used with different types ${l1.typ} and ${l2.typ}.")
+ }
+ }
+ (s1 ++ s2).distinct
+ }
+
+ def addDecls(n: Node, decls: Seq[LocalVarDecl]) = n match {
+ case QuantifiedExp(variables, _) =>
+ // add quantified variables
+ decls ++ variables
+ case Seqn(_, scoped) =>
+ // add variables defined in scope
+ decls ++ scoped.collect { case variable: LocalVarDecl => variable }
+ case Let(variable, _, _) =>
+ // add defined variable
+ decls ++ Seq(variable)
+ case _ =>
+ decls
+ }
+
+ def combineResults(n: Node, decls: Seq[LocalVarDecl], locals: Seq[Seq[LocalVar]]) = {
+ locals.fold(extractLocal(n, decls))(combineLists)
+ }
+
+ s.reduceWithContext(Nil, addDecls, combineResults)
+ }
}
diff --git a/src/main/scala/viper/gobra/translator/util/ViperWriter.scala b/src/main/scala/viper/gobra/translator/util/ViperWriter.scala
index d874cc7c5..de0f8bc67 100644
--- a/src/main/scala/viper/gobra/translator/util/ViperWriter.scala
+++ b/src/main/scala/viper/gobra/translator/util/ViperWriter.scala
@@ -8,6 +8,7 @@ package viper.gobra.translator.util
import viper.gobra.reporting.BackTranslator.{ErrorTransformer, ReasonTransformer, RichErrorMessage}
import viper.silver.{ast => vpr}
+import viper.gobra.ast.{internal => in}
import viper.gobra.reporting.{DefaultErrorBackTranslator, Source, VerificationError}
import viper.gobra.translator.context.Context
import viper.gobra.translator.util.{ViperUtil => vu}
@@ -366,6 +367,35 @@ object ViperWriter {
def bind(lhs: vpr.LocalVar, rhs: vpr.Exp): Writer[Unit] =
create(Vector(Binding(lhs, rhs)), ())
+ /**
+ * Can be used in expressions.
+ * When using this method in the encoding of expressions,
+ * make sure to use [[pure]] to avoid that the generated let bindings leave the context.
+ * */
+ def bind(r: vpr.Exp)(ctx: Context): CodeWriter[vpr.LocalVar] = {
+ val z = vpr.LocalVar(ctx.freshNames.next(), r.typ)(r.pos, r.info, r.errT)
+ for {
+ _ <- local(vu.toVarDecl(z))
+ _ <- bind(z, r)
+ } yield z
+ }
+
+ /**
+ * Can be used in expressions.
+ * When using this method in the encoding of expressions,
+ * make sure to use [[pure]] to avoid that the generated let bindings leave the context.
+ * */
+ def bind(e: in.Expr)(ctx: Context): CodeWriter[in.LocalVar] = {
+ val src = e.info
+ val z = in.LocalVar(ctx.freshNames.next(), e.typ)(src)
+ val vprZ = ctx.variable(z)
+ for {
+ rhs <- ctx.value(e)
+ _ <- local(vprZ)
+ _ <- bind(vprZ.localVar, rhs)
+ } yield z
+ }
+
/* Can be used in expressions. */
def assert(cond: vpr.Exp, exp: vpr.Exp, reasonT: (Source.Verifier.Info, ErrorReason) => VerificationError)(ctx: Context): Writer[vpr.Exp] = {
// In the future, this might do something more sophisticated
@@ -440,15 +470,6 @@ object ViperWriter {
/* Collects data. */
def collect(collectibles: Collectible*): Writer[Unit] =
create(collectibles.toVector, ())
-
- /* Can be used in expressions. */
- def copyResult(r: vpr.Exp)(ctx: Context): CodeWriter[vpr.LocalVar] = {
- val z = vpr.LocalVar(ctx.freshNames.next(), r.typ)(r.pos, r.info, r.errT)
- for {
- _ <- local(vu.toVarDecl(z))
- _ <- bind(z, r)
- } yield z
- }
}
type CodeWriter[+R] = CodeLevel.Writer[R]
From a1c35a1e28437dd973d231367c590775a2d9fee1 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jo=C3=A3o=20Pereira?=
Date: Tue, 4 Oct 2022 10:06:14 +0200
Subject: [PATCH 002/296] Fixes conversion to interfaces and interfaces in
struct literals (#537)
* Add bug witness
* Add fix
* Add comment
* Add extra test
* Simplify client3
---
.../viper/gobra/ast/internal/Program.scala | 5 ++++
.../scala/viper/gobra/frontend/Desugar.scala | 23 +++++++++++------
.../features/structs/literals2.gobra | 25 +++++++++++++++++++
3 files changed, 46 insertions(+), 7 deletions(-)
create mode 100644 src/test/resources/regressions/features/structs/literals2.gobra
diff --git a/src/main/scala/viper/gobra/ast/internal/Program.scala b/src/main/scala/viper/gobra/ast/internal/Program.scala
index 879334392..2ef54b7bd 100644
--- a/src/main/scala/viper/gobra/ast/internal/Program.scala
+++ b/src/main/scala/viper/gobra/ast/internal/Program.scala
@@ -1063,6 +1063,11 @@ case class ShiftRight(left: Expr, right: Expr)(val info: Source.Parser.Info) ext
}
case class BitNeg(op: Expr)(val info: Source.Parser.Info) extends IntOperation
+/*
+ * Convert 'expr' to non-interface type 'newType'. If 'newType' is
+ * an interface type, then 'ToInterface' should be used instead.
+ */
+ // TODO: maybe unify with ToInterface at some point
case class Conversion(newType: Type, expr: Expr)(val info: Source.Parser.Info) extends Expr {
override def typ: Type = newType
}
diff --git a/src/main/scala/viper/gobra/frontend/Desugar.scala b/src/main/scala/viper/gobra/frontend/Desugar.scala
index 2f7e4a07d..16bc3297e 100644
--- a/src/main/scala/viper/gobra/frontend/Desugar.scala
+++ b/src/main/scala/viper/gobra/frontend/Desugar.scala
@@ -2541,6 +2541,11 @@ object Desugar {
conv: in.EffectfulConversion = in.EffectfulConversion(target, resT, dArg)(src)
_ <- write(conv)
} yield target
+ case (t: InterfaceT, _) =>
+ for {
+ exp <- exprD(ctx, info)(arg)
+ tD = typeD(t, exp.typ.addressability)(src)
+ } yield in.ToInterface(exp, tD)(exp.info)
case _ =>
val desugaredTyp = typeD(typType, info.addressability(expr))(src)
for { expr <- exprD(ctx, info)(arg) } yield in.Conversion(desugaredTyp, expr)(src)
@@ -2728,10 +2733,13 @@ object Desugar {
if (lit.elems.exists(_.key.isEmpty)) {
// all elements are not keyed
- val wArgs = fields.zip(lit.elems).map { case (f, PKeyedElement(_, exp)) => exp match {
- case PExpCompositeVal(ev) => exprD(ctx, info)(ev)
- case PLitCompositeVal(lv) => literalValD(ctx, info)(lv, f.typ)
- }}
+ val wArgs = fields.zip(lit.elems).map { case (f, PKeyedElement(_, exp)) =>
+ val wv = exp match {
+ case PExpCompositeVal(ev) => exprD(ctx, info)(ev)
+ case PLitCompositeVal(lv) => literalValD(ctx, info)(lv, f.typ)
+ }
+ wv.map{ v => implicitConversion(v.typ, f.typ, v) }
+ }
for {
args <- sequence(wArgs)
@@ -2744,10 +2752,11 @@ object Desugar {
val vMap = lit.elems.map {
case PKeyedElement(Some(PIdentifierKey(key)), exp) =>
val f = fMap(key.name)
- exp match {
- case PExpCompositeVal(ev) => f -> exprD(ctx, info)(ev)
- case PLitCompositeVal(lv) => f -> literalValD(ctx, info)(lv, f.typ)
+ val wv = exp match {
+ case PExpCompositeVal(ev) => exprD(ctx, info)(ev)
+ case PLitCompositeVal(lv) => literalValD(ctx, info)(lv, f.typ)
}
+ f -> wv.map{ v => implicitConversion(v.typ, f.typ, v) }
case _ => Violation.violation("expected identifier as a key")
}.toMap
diff --git a/src/test/resources/regressions/features/structs/literals2.gobra b/src/test/resources/regressions/features/structs/literals2.gobra
new file mode 100644
index 000000000..ee8d26a3d
--- /dev/null
+++ b/src/test/resources/regressions/features/structs/literals2.gobra
@@ -0,0 +1,25 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/publicdomain/zero/1.0/
+
+package pkg
+
+type Element struct {
+ Next *Element
+ Value any
+}
+
+func client1() {
+ e := &Element{Value: interface{}(1)}
+}
+
+func client2() {
+ e := &Element{Value: 1}
+}
+
+type T interface { m() int }
+type X struct{}
+func (x X) m() int
+
+func client3() {
+ T(X{}).m()
+}
\ No newline at end of file
From d679a34807864706176d2892be08460fffd87f94 Mon Sep 17 00:00:00 2001
From: Linard Arquint
Date: Tue, 4 Oct 2022 15:51:41 +0200
Subject: [PATCH 003/296] writes gobrafied input files to disk if is enabled
---
.gitignore | 1 +
src/main/scala/viper/gobra/frontend/Parser.scala | 4 ++++
src/main/scala/viper/gobra/reporting/Reporter.scala | 1 +
3 files changed, 6 insertions(+)
diff --git a/.gitignore b/.gitignore
index cc684a669..c82d49c83 100644
--- a/.gitignore
+++ b/.gitignore
@@ -7,6 +7,7 @@ tmp/
sync/
logger.log
+.DS_Store
*.go.*
*.gobra.*
diff --git a/src/main/scala/viper/gobra/frontend/Parser.scala b/src/main/scala/viper/gobra/frontend/Parser.scala
index 43b3b2227..b02a7b327 100644
--- a/src/main/scala/viper/gobra/frontend/Parser.scala
+++ b/src/main/scala/viper/gobra/frontend/Parser.scala
@@ -44,6 +44,10 @@ object Parser {
def parse(input: Vector[Source], pkgInfo: PackageInfo, specOnly: Boolean = false)(config: Config): Either[Vector[VerifierError], PPackage] = {
val sources = input
.map(Gobrafier.gobrafy)
+ .map(s => {
+ config.reporter report PreprocessedInputMessage(s.name, () => s.content)
+ s
+ })
for {
parseAst <- parseSources(sources, pkgInfo, specOnly)(config)
postprocessedAst <- new ImportPostprocessor(parseAst.positions.positions).postprocess(parseAst)(config)
diff --git a/src/main/scala/viper/gobra/reporting/Reporter.scala b/src/main/scala/viper/gobra/reporting/Reporter.scala
index ca66179a5..b296b74ca 100644
--- a/src/main/scala/viper/gobra/reporting/Reporter.scala
+++ b/src/main/scala/viper/gobra/reporting/Reporter.scala
@@ -47,6 +47,7 @@ case class FileWriterReporter(name: String = "filewriter_reporter",
Logger(LoggerFactory.getLogger(getClass.getName))
override def report(msg: GobraMessage): Unit = msg match {
+ case PreprocessedInputMessage(input, content) if unparse => write(input, "gobrafied", content())
case ParsedInputMessage(input, program) if unparse => write(input, "unparsed", program().formatted)
case TypeCheckSuccessMessage(inputs, _, _, _, erasedGhostCode, goifiedGhostCode) =>
if (eraseGhost) write(inputs, "ghostLess", erasedGhostCode())
From 0ca0a700ae9bb359d392debc3c416c330c63e5b0 Mon Sep 17 00:00:00 2001
From: Linard Arquint
Date: Tue, 4 Oct 2022 16:05:45 +0200
Subject: [PATCH 004/296] adds CI to updated ViperServer submodule
---
.github/workflows/update-submodules.yml | 59 +++++++++++++++++++++++++
1 file changed, 59 insertions(+)
create mode 100644 .github/workflows/update-submodules.yml
diff --git a/.github/workflows/update-submodules.yml b/.github/workflows/update-submodules.yml
new file mode 100644
index 000000000..9493f4aec
--- /dev/null
+++ b/.github/workflows/update-submodules.yml
@@ -0,0 +1,59 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Copyright (c) 2011-2022 ETH Zurich.
+
+name: Update Submodules
+
+on:
+ workflow_dispatch: # allow to manually trigger this workflow
+ schedule:
+ - cron: '0 6 1 * *' # run on the first day of each month at 06:00 UTC
+
+jobs:
+ # Update the submodules and create a PR if there are any changes
+ update:
+ runs-on: ubuntu-latest
+ steps:
+ - name: Check out the repo
+ uses: actions/checkout@v2
+ with:
+ submodules: true
+
+ - name: Get current commits
+ run: |
+ echo "PREV_VIPERSERVER_REF=$(git -C viperserver rev-parse HEAD)" >> $GITHUB_ENV
+
+ - name: Update ViperServer submodule
+ run: git checkout master && git pull
+ working-directory: viperserver
+
+ - name: Get new commits
+ run: |
+ echo "CUR_VIPERSERVER_REF=$(git -C viperserver rev-parse HEAD)" >> $GITHUB_ENV
+
+ - name: Open a pull request
+ id: pr
+ uses: peter-evans/create-pull-request@v3
+ if: env.PREV_VIPERSERVER_REF != env.CUR_VIPERSERVER_REF
+ with:
+ # Use viper-admin's token to workaround a restriction of GitHub.
+ # See: https://github.com/peter-evans/create-pull-request/issues/48
+ token: ${{ secrets.VIPER_ADMIN_TOKEN }}
+ commit-message: Updates submodules
+ title: Update Submodules
+ branch: auto-update-submodules
+ delete-branch: true
+ labels: |
+ automated pr
+ body: |
+ * Updates ViperServer from `${{ env.PREV_VIPERSERVER_REF }}` to `${{ env.CUR_VIPERSERVER_REF }}`.
+
+ - name: Enable auto-merge of PR
+ uses: peter-evans/create-or-update-comment@v2
+ if: env.PREV_VIPERSERVER_REF != env.CUR_VIPERSERVER_REF
+ with:
+ token: ${{ secrets.VIPER_ADMIN_TOKEN }}
+ issue-number: ${{ steps.pr.outputs.pull-request-number }}
+ body: bors merge
From 8893eabc4fb8be86691a1e6f04230a13c83d62f7 Mon Sep 17 00:00:00 2001
From: Linard Arquint
Date: Tue, 4 Oct 2022 16:45:11 +0200
Subject: [PATCH 005/296] adds an option for disabling global variables
---
.../scala/viper/gobra/frontend/Config.scala | 13 +++++
.../implementation/typing/ImportTyping.scala | 10 +++-
.../implementation/typing/MemberTyping.scala | 28 +++++----
.../implementation/typing/ProgramTyping.scala | 50 ++++++++--------
.../globals/globals-disabled-fail01.gobra | 58 +++++++++++++++++++
5 files changed, 121 insertions(+), 38 deletions(-)
create mode 100644 src/test/resources/regressions/features/globals/globals-disabled-fail01.gobra
diff --git a/src/main/scala/viper/gobra/frontend/Config.scala b/src/main/scala/viper/gobra/frontend/Config.scala
index 118f9a1ec..11584b430 100644
--- a/src/main/scala/viper/gobra/frontend/Config.scala
+++ b/src/main/scala/viper/gobra/frontend/Config.scala
@@ -62,6 +62,7 @@ object ConfigDefaults {
lazy val DefaultAssumeInjectivityOnInhale: Boolean = true
lazy val DefaultParallelizeBranches: Boolean = false
lazy val DefaultDisableMoreCompleteExhale: Boolean = false
+ lazy val DefaultDisableGlobalVars: Boolean = false
}
case class Config(
@@ -109,6 +110,7 @@ case class Config(
// branches will be verified in parallel
parallelizeBranches: Boolean = ConfigDefaults.DefaultParallelizeBranches,
disableMoreCompleteExhale: Boolean = ConfigDefaults.DefaultDisableMoreCompleteExhale,
+ disableGlobalVars: Boolean = ConfigDefaults.DefaultDisableGlobalVars,
) {
def merge(other: Config): Config = {
@@ -150,6 +152,7 @@ case class Config(
assumeInjectivityOnInhale = assumeInjectivityOnInhale || other.assumeInjectivityOnInhale,
parallelizeBranches = parallelizeBranches,
disableMoreCompleteExhale = disableMoreCompleteExhale,
+ disableGlobalVars = disableGlobalVars || other.disableGlobalVars,
)
}
@@ -192,6 +195,7 @@ case class BaseConfig(gobraDirectory: Path = ConfigDefaults.DefaultGobraDirector
assumeInjectivityOnInhale: Boolean = ConfigDefaults.DefaultAssumeInjectivityOnInhale,
parallelizeBranches: Boolean = ConfigDefaults.DefaultParallelizeBranches,
disableMoreCompleteExhale: Boolean = ConfigDefaults.DefaultDisableMoreCompleteExhale,
+ disableGlobalVars: Boolean = ConfigDefaults.DefaultDisableGlobalVars,
) {
def shouldParse: Boolean = true
def shouldTypeCheck: Boolean = !shouldParseOnly
@@ -242,6 +246,7 @@ trait RawConfig {
assumeInjectivityOnInhale = baseConfig.assumeInjectivityOnInhale,
parallelizeBranches = baseConfig.parallelizeBranches,
disableMoreCompleteExhale = baseConfig.disableMoreCompleteExhale,
+ disableGlobalVars = baseConfig.disableGlobalVars,
)
}
@@ -583,6 +588,13 @@ class ScallopGobraConfig(arguments: Seq[String], isInputOptional: Boolean = fals
noshort = true,
)
+ val disableGlobalVars: ScallopOption[Boolean] = opt[Boolean](
+ name = "disableGlobalVars",
+ descr = "Disables the support for global variables and thus does not require that the sources of all transitively included packages can be located by Gobra.",
+ default = Some(ConfigDefaults.DefaultDisableGlobalVars),
+ noshort = true,
+ )
+
/**
* Exception handling
*/
@@ -715,5 +727,6 @@ class ScallopGobraConfig(arguments: Seq[String], isInputOptional: Boolean = fals
assumeInjectivityOnInhale = assumeInjectivityOnInhale(),
parallelizeBranches = parallelizeBranches(),
disableMoreCompleteExhale = disableMoreCompleteExhale(),
+ disableGlobalVars = disableGlobalVars(),
)
}
diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ImportTyping.scala b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ImportTyping.scala
index 57c45ed75..3b2acdcd8 100644
--- a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ImportTyping.scala
+++ b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ImportTyping.scala
@@ -14,13 +14,17 @@ import viper.gobra.frontend.info.implementation.TypeInfoImpl
trait ImportTyping extends BaseTyping { this: TypeInfoImpl =>
lazy val wellDefImport: WellDefinedness[PImport] = createWellDef { imp =>
- forceNonLazyImport(imp.importPath, imp)
- imp match {
+ (if (config.disableGlobalVars) {
+ imp.importPres.flatMap(importPre => message(importPre, s"Support for global variables has been disabled but an import precondition has been found"))
+ } else {
+ forceNonLazyImport(imp.importPath, imp)
+ noMessages
+ }) ++ (imp match {
case _: PExplicitQualifiedImport => noMessages
case _: PUnqualifiedImport => noMessages
// this case should never occur as these nodes should get converted in the parse postprocessing step
case n: PImplicitQualifiedImport => message(n, s"Explicit qualifier could not be derived")
- }
+ })
}
// This method forces a package to be processed non-lazily - every import can cause side effects,
diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/typing/MemberTyping.scala b/src/main/scala/viper/gobra/frontend/info/implementation/typing/MemberTyping.scala
index 13c051b43..6adeb5d9e 100644
--- a/src/main/scala/viper/gobra/frontend/info/implementation/typing/MemberTyping.scala
+++ b/src/main/scala/viper/gobra/frontend/info/implementation/typing/MemberTyping.scala
@@ -26,19 +26,23 @@ trait MemberTyping extends BaseTyping { this: TypeInfoImpl =>
case b: PConstDecl =>
b.specs.flatMap(wellDefConstSpec)
case g: PVarDecl if isGlobalVarDeclaration(g) =>
- // HACK: without this explicit check, Gobra does not find repeated declarations
- // of global variables. This has to do with the changes introduced in PR #186.
- // We need this check nonetheless because the checks performed in the "true" branch
- // assume that the ids are well-defined.
- val idsOkMsgs = g.left.flatMap(l => wellDefID(l).out)
- if (idsOkMsgs.isEmpty) {
- val isGhost = isEnclosingGhost(g)
- g.right.flatMap(isExpr(_).out) ++
- declarableTo.errors(g.right map exprType, g.typ map typeSymbType, g.left map idType)(g) ++
- error(g, s"Currently, global variables cannot be made ghost", isGhost) ++
- acyclicGlobalDeclaration.errors(g)(g)
+ if (config.disableGlobalVars) {
+ error(g, s"Support for global variables has been disabled but a global variable has been found")
} else {
- idsOkMsgs
+ // HACK: without this explicit check, Gobra does not find repeated declarations
+ // of global variables. This has to do with the changes introduced in PR #186.
+ // We need this check nonetheless because the checks performed in the "true" branch
+ // assume that the ids are well-defined.
+ val idsOkMsgs = g.left.flatMap(l => wellDefID(l).out)
+ if (idsOkMsgs.isEmpty) {
+ val isGhost = isEnclosingGhost(g)
+ g.right.flatMap(isExpr(_).out) ++
+ declarableTo.errors(g.right map exprType, g.typ map typeSymbType, g.left map idType)(g) ++
+ error(g, s"Currently, global variables cannot be made ghost", isGhost) ++
+ acyclicGlobalDeclaration.errors(g)(g)
+ } else {
+ idsOkMsgs
+ }
}
case s: PActualStatement =>
wellDefStmt(s).out
diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ProgramTyping.scala b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ProgramTyping.scala
index 6758b7696..1ee10cbf0 100644
--- a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ProgramTyping.scala
+++ b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ProgramTyping.scala
@@ -7,7 +7,7 @@
package viper.gobra.frontend.info.implementation.typing
import org.bitbucket.inkytonik.kiama.util.Entity
-import org.bitbucket.inkytonik.kiama.util.Messaging.{Messages, error}
+import org.bitbucket.inkytonik.kiama.util.Messaging.{Messages, error, message}
import viper.gobra.ast.frontend.{PExpression, POld, PPackage, PProgram, PVarDecl}
import viper.gobra.frontend.info.base.{SymbolTable => st}
import viper.gobra.frontend.info.implementation.TypeInfoImpl
@@ -18,30 +18,34 @@ trait ProgramTyping extends BaseTyping { this: TypeInfoImpl =>
lazy val wellDefProgram: WellDefinedness[PProgram] = createWellDef {
case PProgram(_, posts, imports, members) =>
- // Obtains global variable declarations sorted by the order in which they appear in the file
- val sortedByPosDecls: Vector[PVarDecl] = {
- val unsortedDecls: Vector[PVarDecl] = members.collect{ case d: PVarDecl => d }
- // we require a package to be able to obtain position information
- val pkgOpt: Option[PPackage] = unsortedDecls.headOption.flatMap(tryEnclosingPackage)
- // sort declarations by the order in which they appear in the program
- unsortedDecls.sortBy{ decl =>
- pkgOpt.get.positions.positions.getStart(decl) match {
- case Some(pos) => (pos.line, pos.column)
- case _ => Violation.violation(s"Could not find position information of $decl.")
+ if (config.disableGlobalVars) {
+ posts.flatMap(post => message(post, s"Support for global variables has been disabled but an init postcondition has been found"))
+ } else {
+ // Obtains global variable declarations sorted by the order in which they appear in the file
+ val sortedByPosDecls: Vector[PVarDecl] = {
+ val unsortedDecls: Vector[PVarDecl] = members.collect{ case d: PVarDecl => d }
+ // we require a package to be able to obtain position information
+ val pkgOpt: Option[PPackage] = unsortedDecls.headOption.flatMap(tryEnclosingPackage)
+ // sort declarations by the order in which they appear in the program
+ unsortedDecls.sortBy{ decl =>
+ pkgOpt.get.positions.positions.getStart(decl) match {
+ case Some(pos) => (pos.line, pos.column)
+ case _ => Violation.violation(s"Could not find position information of $decl.")
+ }
}
}
- }
- // HACK: without this explicit check, Gobra does not find repeated declarations
- // of global variables. This has to do with the changes introduced in PR #186.
- // We need this check nonetheless because the checks performed in the "true" branch
- // assume that the ids are well-defined.
- val idsOkMsgs = sortedByPosDecls.flatMap(d => d.left).flatMap(l => wellDefID(l).out)
- if (idsOkMsgs.isEmpty) {
- globalDeclSatisfiesDepOrder(sortedByPosDecls) ++
- hasOldExpression(posts) ++
- hasOldExpression(imports.flatMap(_.importPres))
- } else {
- idsOkMsgs
+ // HACK: without this explicit check, Gobra does not find repeated declarations
+ // of global variables. This has to do with the changes introduced in PR #186.
+ // We need this check nonetheless because the checks performed in the "true" branch
+ // assume that the ids are well-defined.
+ val idsOkMsgs = sortedByPosDecls.flatMap(d => d.left).flatMap(l => wellDefID(l).out)
+ if (idsOkMsgs.isEmpty) {
+ globalDeclSatisfiesDepOrder(sortedByPosDecls) ++
+ hasOldExpression(posts) ++
+ hasOldExpression(imports.flatMap(_.importPres))
+ } else {
+ idsOkMsgs
+ }
}
}
diff --git a/src/test/resources/regressions/features/globals/globals-disabled-fail01.gobra b/src/test/resources/regressions/features/globals/globals-disabled-fail01.gobra
new file mode 100644
index 000000000..dc33bec29
--- /dev/null
+++ b/src/test/resources/regressions/features/globals/globals-disabled-fail01.gobra
@@ -0,0 +1,58 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/publicdomain/zero/1.0/
+
+// this is the same file as `globals-simple01.gobra` but additionally provides the `--disableGlobalVars` flag to Gobra.
+// ##(--disableGlobalVars)
+
+//:: ExpectedOutput(type_error)
+initEnsures acc(&A) && acc(&B) && acc(&C, 1/2)
+package pkg
+
+//:: ExpectedOutput(type_error)
+importRequires true
+import "fmt"
+
+import (
+ //:: ExpectedOutput(type_error)
+ importRequires true
+ //:: ExpectedOutput(type_error)
+ importRequires true
+ "bytes"
+ //:: ExpectedOutput(type_error)
+ importRequires true
+ "sync"
+)
+
+
+//:: ExpectedOutput(type_error)
+var A int = 0
+//:: ExpectedOutput(type_error)
+var B, C = f()
+//:: ExpectedOutput(type_error)
+var _ = g()
+//:: ExpectedOutput(type_error)
+var D struct{}
+
+decreases
+func f() (int, bool)
+
+decreases
+func g() interface{}
+
+requires acc(&A, 1/2) && A == 1
+ensures acc(&A, 1/2)
+func testRead() {
+ var v1 int = A
+ assert v1 == 1
+}
+
+requires acc(&C) && C
+func testWrite() {
+ C = false
+}
+
+// Variable hiding works correctly, as in Go
+func tesVarHiding() {
+ var A int = 0
+ assert A == 0
+}
From 065c5005b1ec5e4dd9cd5964c7707fad9a54adbf Mon Sep 17 00:00:00 2001
From: Linard Arquint
Date: Tue, 4 Oct 2022 17:09:58 +0200
Subject: [PATCH 006/296] implements PR suggestions by Joao
---
.github/workflows/update-submodules.yml | 14 +++++++-------
1 file changed, 7 insertions(+), 7 deletions(-)
diff --git a/.github/workflows/update-submodules.yml b/.github/workflows/update-submodules.yml
index 9493f4aec..d505ddb92 100644
--- a/.github/workflows/update-submodules.yml
+++ b/.github/workflows/update-submodules.yml
@@ -50,10 +50,10 @@ jobs:
body: |
* Updates ViperServer from `${{ env.PREV_VIPERSERVER_REF }}` to `${{ env.CUR_VIPERSERVER_REF }}`.
- - name: Enable auto-merge of PR
- uses: peter-evans/create-or-update-comment@v2
- if: env.PREV_VIPERSERVER_REF != env.CUR_VIPERSERVER_REF
- with:
- token: ${{ secrets.VIPER_ADMIN_TOKEN }}
- issue-number: ${{ steps.pr.outputs.pull-request-number }}
- body: bors merge
+ # - name: Enable auto-merge of PR
+ # uses: peter-evans/create-or-update-comment@v2
+ # if: env.PREV_VIPERSERVER_REF != env.CUR_VIPERSERVER_REF
+ # with:
+ # token: ${{ secrets.VIPER_ADMIN_TOKEN }}
+ # issue-number: ${{ steps.pr.outputs.pull-request-number }}
+ # body: bors merge
From da24f81c3a9ba9db406ea5604d0cb9ea9d524012 Mon Sep 17 00:00:00 2001
From: Linard Arquint
Date: Tue, 4 Oct 2022 17:13:51 +0200
Subject: [PATCH 007/296] fixes desugarer to support lazy imports when global
variables are disabled
---
src/main/scala/viper/gobra/frontend/Desugar.scala | 11 +++++++++--
1 file changed, 9 insertions(+), 2 deletions(-)
diff --git a/src/main/scala/viper/gobra/frontend/Desugar.scala b/src/main/scala/viper/gobra/frontend/Desugar.scala
index 16bc3297e..3cd4cdfd3 100644
--- a/src/main/scala/viper/gobra/frontend/Desugar.scala
+++ b/src/main/scala/viper/gobra/frontend/Desugar.scala
@@ -3063,7 +3063,13 @@ object Desugar {
// As for imported methods, imported packages are not checked to satisfy their specification. In particular,
// Gobra does not check that the package postconditions are established by the initialization code. Instead,
// this is assumed. We only generate the proof obligations for the initialization code in the main package.
- registerPackage(mainPkg, specCollector, generateInitProof = true)(config)
+ registerPackage(mainPkg, specCollector, generateInitProof = !config.disableGlobalVars)(config)
+
+ if (config.disableGlobalVars) {
+ // early return to not add any proof obligations because we have made sure that
+ // there aren't any global variables and/or init postcondition or import preconditions
+ return
+ }
// check that the postconditions of every package are enough to satisfy all of their imports' preconditions
val src = meta(mainPkg, info)
@@ -3121,8 +3127,9 @@ object Desugar {
info.context.getTypeInfo(RegularImport(imp.importPath))(config) match {
case Some(Right(tI)) =>
val desugaredPre = imp.importPres.map(specificationD(FunctionContext.empty(), info))
+ Violation.violation(!config.disableGlobalVars || desugaredPre.isEmpty, "Import preconditions require support for global variables")
specCollector.addImportPres(tI.getTypeInfo.tree.originalRoot, desugaredPre)
- case e => Violation.violation(s"Unexpected value found $e while importing ${imp.importPath}")
+ case e => Violation.violation(config.disableGlobalVars, s"Unexpected value found $e while importing ${imp.importPath}")
}
}
From 45d84c92985649d07d65f5164ae4cd162c11c987 Mon Sep 17 00:00:00 2001
From: ArquintL
Date: Tue, 4 Oct 2022 18:48:44 +0000
Subject: [PATCH 008/296] Updates submodules
---
viperserver | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/viperserver b/viperserver
index 87089e6c5..c2622f973 160000
--- a/viperserver
+++ b/viperserver
@@ -1 +1 @@
-Subproject commit 87089e6c56a3f5b5ef7258fcd258af42bc870775
+Subproject commit c2622f973135f8a25cd0680ae6f18e74530d9135
From d01474dbd1e6dbee44f5e2d0cfcd84d7f96a9ff7 Mon Sep 17 00:00:00 2001
From: Linard Arquint
Date: Thu, 6 Oct 2022 08:57:10 +0200
Subject: [PATCH 009/296] implements CR suggestions by Joao
---
.../scala/viper/gobra/frontend/Config.scala | 26 +++++++++++--------
.../scala/viper/gobra/frontend/Desugar.scala | 18 ++++++++-----
.../implementation/typing/ImportTyping.scala | 6 +++--
.../implementation/typing/MemberTyping.scala | 10 ++++---
.../implementation/typing/ProgramTyping.scala | 6 +++--
5 files changed, 41 insertions(+), 25 deletions(-)
diff --git a/src/main/scala/viper/gobra/frontend/Config.scala b/src/main/scala/viper/gobra/frontend/Config.scala
index 11584b430..98d79d8ca 100644
--- a/src/main/scala/viper/gobra/frontend/Config.scala
+++ b/src/main/scala/viper/gobra/frontend/Config.scala
@@ -21,6 +21,7 @@ import viper.gobra.util.{TypeBounds, Violation}
import viper.silver.ast.SourcePosition
import scala.concurrent.duration.Duration
+import scala.util.matching.Regex
object LoggerDefaults {
val DefaultLevel: Level = Level.INFO
@@ -62,7 +63,7 @@ object ConfigDefaults {
lazy val DefaultAssumeInjectivityOnInhale: Boolean = true
lazy val DefaultParallelizeBranches: Boolean = false
lazy val DefaultDisableMoreCompleteExhale: Boolean = false
- lazy val DefaultDisableGlobalVars: Boolean = false
+ lazy val DefaultEnableLazyImports: Boolean = false
}
case class Config(
@@ -110,7 +111,7 @@ case class Config(
// branches will be verified in parallel
parallelizeBranches: Boolean = ConfigDefaults.DefaultParallelizeBranches,
disableMoreCompleteExhale: Boolean = ConfigDefaults.DefaultDisableMoreCompleteExhale,
- disableGlobalVars: Boolean = ConfigDefaults.DefaultDisableGlobalVars,
+ enableLazyImports: Boolean = ConfigDefaults.DefaultEnableLazyImports,
) {
def merge(other: Config): Config = {
@@ -152,7 +153,7 @@ case class Config(
assumeInjectivityOnInhale = assumeInjectivityOnInhale || other.assumeInjectivityOnInhale,
parallelizeBranches = parallelizeBranches,
disableMoreCompleteExhale = disableMoreCompleteExhale,
- disableGlobalVars = disableGlobalVars || other.disableGlobalVars,
+ enableLazyImports = enableLazyImports || other.enableLazyImports,
)
}
@@ -166,10 +167,13 @@ case class Config(
object Config {
// the header signals that a file should be considered when running on "header-only" mode
- val header = """\/\/\s*\+gobra""".r
+ val header: Regex = """\/\/\s*\+gobra""".r
val prettyPrintedHeader = "// +gobra"
require(header.matches(prettyPrintedHeader))
def sourceHasHeader(s: Source): Boolean = header.findFirstIn(s.content).nonEmpty
+
+ val enableLazyImportOptionName = "enableLazyImport"
+ val enableLazyImportOptionPrettyPrinted = s"--$enableLazyImportOptionName"
}
// have a look at `Config` to see an inline description of some of these parameters
@@ -195,7 +199,7 @@ case class BaseConfig(gobraDirectory: Path = ConfigDefaults.DefaultGobraDirector
assumeInjectivityOnInhale: Boolean = ConfigDefaults.DefaultAssumeInjectivityOnInhale,
parallelizeBranches: Boolean = ConfigDefaults.DefaultParallelizeBranches,
disableMoreCompleteExhale: Boolean = ConfigDefaults.DefaultDisableMoreCompleteExhale,
- disableGlobalVars: Boolean = ConfigDefaults.DefaultDisableGlobalVars,
+ enableLazyImports: Boolean = ConfigDefaults.DefaultEnableLazyImports,
) {
def shouldParse: Boolean = true
def shouldTypeCheck: Boolean = !shouldParseOnly
@@ -246,7 +250,7 @@ trait RawConfig {
assumeInjectivityOnInhale = baseConfig.assumeInjectivityOnInhale,
parallelizeBranches = baseConfig.parallelizeBranches,
disableMoreCompleteExhale = baseConfig.disableMoreCompleteExhale,
- disableGlobalVars = baseConfig.disableGlobalVars,
+ enableLazyImports = baseConfig.enableLazyImports,
)
}
@@ -588,10 +592,10 @@ class ScallopGobraConfig(arguments: Seq[String], isInputOptional: Boolean = fals
noshort = true,
)
- val disableGlobalVars: ScallopOption[Boolean] = opt[Boolean](
- name = "disableGlobalVars",
- descr = "Disables the support for global variables and thus does not require that the sources of all transitively included packages can be located by Gobra.",
- default = Some(ConfigDefaults.DefaultDisableGlobalVars),
+ val enableLazyImports: ScallopOption[Boolean] = opt[Boolean](
+ name = Config.enableLazyImportOptionName,
+ descr = s"Enforces that ${GoVerifier.name} parses depending packages only when necessary. Note that this disables certain language features such as global variables.",
+ default = Some(ConfigDefaults.DefaultEnableLazyImports),
noshort = true,
)
@@ -727,6 +731,6 @@ class ScallopGobraConfig(arguments: Seq[String], isInputOptional: Boolean = fals
assumeInjectivityOnInhale = assumeInjectivityOnInhale(),
parallelizeBranches = parallelizeBranches(),
disableMoreCompleteExhale = disableMoreCompleteExhale(),
- disableGlobalVars = disableGlobalVars(),
+ enableLazyImports = enableLazyImports(),
)
}
diff --git a/src/main/scala/viper/gobra/frontend/Desugar.scala b/src/main/scala/viper/gobra/frontend/Desugar.scala
index 3cd4cdfd3..262d201d3 100644
--- a/src/main/scala/viper/gobra/frontend/Desugar.scala
+++ b/src/main/scala/viper/gobra/frontend/Desugar.scala
@@ -3063,11 +3063,15 @@ object Desugar {
// As for imported methods, imported packages are not checked to satisfy their specification. In particular,
// Gobra does not check that the package postconditions are established by the initialization code. Instead,
// this is assumed. We only generate the proof obligations for the initialization code in the main package.
- registerPackage(mainPkg, specCollector, generateInitProof = !config.disableGlobalVars)(config)
-
- if (config.disableGlobalVars) {
- // early return to not add any proof obligations because we have made sure that
- // there aren't any global variables and/or init postcondition or import preconditions
+ // Note that `config.enableLazyImports` disables init blocks, global variables, import preconditions, and init
+ // postconditions in the type checker, which means that we do not have to generate an init proof.
+ registerPackage(mainPkg, specCollector, generateInitProof = !config.enableLazyImports)(config)
+
+ if (config.enableLazyImports) {
+ // early return to not add any proof obligations because we have made sure in the type checker that
+ // there aren't any global variables, init blocks, init postconditions, and import preconditions (in the
+ // packages that have been parsed). Note that packages that have been skipped because of the laziness might
+ // still contain such features.
return
}
@@ -3127,9 +3131,9 @@ object Desugar {
info.context.getTypeInfo(RegularImport(imp.importPath))(config) match {
case Some(Right(tI)) =>
val desugaredPre = imp.importPres.map(specificationD(FunctionContext.empty(), info))
- Violation.violation(!config.disableGlobalVars || desugaredPre.isEmpty, "Import preconditions require support for global variables")
+ Violation.violation(!config.enableLazyImports || desugaredPre.isEmpty, s"Import precondition found despite running with ${Config.enableLazyImportOptionPrettyPrinted}")
specCollector.addImportPres(tI.getTypeInfo.tree.originalRoot, desugaredPre)
- case e => Violation.violation(config.disableGlobalVars, s"Unexpected value found $e while importing ${imp.importPath}")
+ case e => Violation.violation(config.enableLazyImports, s"Unexpected value found $e while importing ${imp.importPath} - type information is assumed to be available for all packages when Gobra is executed with lazy imports disabled")
}
}
diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ImportTyping.scala b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ImportTyping.scala
index 3b2acdcd8..ec2b7541b 100644
--- a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ImportTyping.scala
+++ b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ImportTyping.scala
@@ -7,15 +7,17 @@
package viper.gobra.frontend.info.implementation.typing
import org.bitbucket.inkytonik.kiama.util.Messaging.{message, noMessages}
+import viper.gobra.GoVerifier
import viper.gobra.ast.frontend.{PExplicitQualifiedImport, PImplicitQualifiedImport, PImport, PNode, PUnqualifiedImport}
+import viper.gobra.frontend.Config
import viper.gobra.frontend.PackageResolver.RegularImport
import viper.gobra.frontend.info.implementation.TypeInfoImpl
trait ImportTyping extends BaseTyping { this: TypeInfoImpl =>
lazy val wellDefImport: WellDefinedness[PImport] = createWellDef { imp =>
- (if (config.disableGlobalVars) {
- imp.importPres.flatMap(importPre => message(importPre, s"Support for global variables has been disabled but an import precondition has been found"))
+ (if (config.enableLazyImports) {
+ imp.importPres.flatMap(importPre => message(importPre, s"Import preconditions are not allowed when executing ${GoVerifier.name} with ${Config.enableLazyImportOptionPrettyPrinted}"))
} else {
forceNonLazyImport(imp.importPath, imp)
noMessages
diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/typing/MemberTyping.scala b/src/main/scala/viper/gobra/frontend/info/implementation/typing/MemberTyping.scala
index 6adeb5d9e..0fcf977b9 100644
--- a/src/main/scala/viper/gobra/frontend/info/implementation/typing/MemberTyping.scala
+++ b/src/main/scala/viper/gobra/frontend/info/implementation/typing/MemberTyping.scala
@@ -7,7 +7,9 @@
package viper.gobra.frontend.info.implementation.typing
import org.bitbucket.inkytonik.kiama.util.Messaging.{Messages, error, noMessages}
+import viper.gobra.GoVerifier
import viper.gobra.ast.frontend._
+import viper.gobra.frontend.Config
import viper.gobra.frontend.info.implementation.TypeInfoImpl
import viper.gobra.util.Constants
@@ -26,8 +28,8 @@ trait MemberTyping extends BaseTyping { this: TypeInfoImpl =>
case b: PConstDecl =>
b.specs.flatMap(wellDefConstSpec)
case g: PVarDecl if isGlobalVarDeclaration(g) =>
- if (config.disableGlobalVars) {
- error(g, s"Support for global variables has been disabled but a global variable has been found")
+ if (config.enableLazyImports) {
+ error(g, s"Global variables are not allowed when executing ${GoVerifier.name} with ${Config.enableLazyImportOptionPrettyPrinted}")
} else {
// HACK: without this explicit check, Gobra does not find repeated declarations
// of global variables. This has to do with the changes introduced in PR #186.
@@ -72,7 +74,9 @@ trait MemberTyping extends BaseTyping { this: TypeInfoImpl =>
private def wellDefIfInitBlock(n: PFunctionDecl): Messages = {
val isInitFunc = n.id.name == Constants.INIT_FUNC_NAME
- if (isInitFunc) {
+ if (isInitFunc && config.enableLazyImports) {
+ error(n, s"Init functions are not supported when executing ${GoVerifier.name} with ${Config.enableLazyImportOptionPrettyPrinted}")
+ } else if (isInitFunc) {
val errorMsgEmptySpec =
s"Currently, ${Constants.INIT_FUNC_NAME} blocks cannot have specification. Instead, use package postconditions and import preconditions."
val errorMsgNoInOut = s"func ${Constants.INIT_FUNC_NAME} must have no arguments and no return values"
diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ProgramTyping.scala b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ProgramTyping.scala
index 1ee10cbf0..f0641c73e 100644
--- a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ProgramTyping.scala
+++ b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ProgramTyping.scala
@@ -8,7 +8,9 @@ package viper.gobra.frontend.info.implementation.typing
import org.bitbucket.inkytonik.kiama.util.Entity
import org.bitbucket.inkytonik.kiama.util.Messaging.{Messages, error, message}
+import viper.gobra.GoVerifier
import viper.gobra.ast.frontend.{PExpression, POld, PPackage, PProgram, PVarDecl}
+import viper.gobra.frontend.Config
import viper.gobra.frontend.info.base.{SymbolTable => st}
import viper.gobra.frontend.info.implementation.TypeInfoImpl
import viper.gobra.frontend.info.implementation.property.{AssignMode, StrictAssignMode}
@@ -18,8 +20,8 @@ trait ProgramTyping extends BaseTyping { this: TypeInfoImpl =>
lazy val wellDefProgram: WellDefinedness[PProgram] = createWellDef {
case PProgram(_, posts, imports, members) =>
- if (config.disableGlobalVars) {
- posts.flatMap(post => message(post, s"Support for global variables has been disabled but an init postcondition has been found"))
+ if (config.enableLazyImports) {
+ posts.flatMap(post => message(post, s"Init postconditions are not allowed when executing ${GoVerifier.name} with ${Config.enableLazyImportOptionPrettyPrinted}"))
} else {
// Obtains global variable declarations sorted by the order in which they appear in the file
val sortedByPosDecls: Vector[PVarDecl] = {
From 4380796d169f86b5e60935ebd74b7fcde73b5032 Mon Sep 17 00:00:00 2001
From: Linard Arquint
Date: Thu, 6 Oct 2022 09:58:14 +0200
Subject: [PATCH 010/296] fixes unit test
---
.../regressions/features/globals/globals-disabled-fail01.gobra | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/test/resources/regressions/features/globals/globals-disabled-fail01.gobra b/src/test/resources/regressions/features/globals/globals-disabled-fail01.gobra
index dc33bec29..ffb0e916f 100644
--- a/src/test/resources/regressions/features/globals/globals-disabled-fail01.gobra
+++ b/src/test/resources/regressions/features/globals/globals-disabled-fail01.gobra
@@ -2,7 +2,7 @@
// http://creativecommons.org/publicdomain/zero/1.0/
// this is the same file as `globals-simple01.gobra` but additionally provides the `--disableGlobalVars` flag to Gobra.
-// ##(--disableGlobalVars)
+// ##(--enableLazyImport)
//:: ExpectedOutput(type_error)
initEnsures acc(&A) && acc(&B) && acc(&C, 1/2)
From 81a6b5f5bdafe7e9cf41d3ff169bb3dc0e20ba28 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jo=C3=A3o=20Pereira?=
Date: Sun, 9 Oct 2022 10:23:38 +0200
Subject: [PATCH 011/296] Constant propagation (#538)
* Test constant propagation
* Clean-up
* Clean-up
* Update src/main/scala/viper/gobra/Gobra.scala
---
src/main/scala/viper/gobra/Gobra.scala | 7 ++-
.../viper/gobra/ast/internal/Program.scala | 18 ++++----
.../transform/ConstantPropagation.scala | 45 +++++++++++++++++++
3 files changed, 59 insertions(+), 11 deletions(-)
create mode 100644 src/main/scala/viper/gobra/ast/internal/transform/ConstantPropagation.scala
diff --git a/src/main/scala/viper/gobra/Gobra.scala b/src/main/scala/viper/gobra/Gobra.scala
index 95ac43533..54de7422a 100644
--- a/src/main/scala/viper/gobra/Gobra.scala
+++ b/src/main/scala/viper/gobra/Gobra.scala
@@ -14,7 +14,7 @@ import com.typesafe.scalalogging.StrictLogging
import org.slf4j.LoggerFactory
import viper.gobra.ast.frontend.PPackage
import viper.gobra.ast.internal.Program
-import viper.gobra.ast.internal.transform.{CGEdgesTerminationTransform, InternalTransform, OverflowChecksTransform}
+import viper.gobra.ast.internal.transform.{CGEdgesTerminationTransform, ConstantPropagation, InternalTransform, OverflowChecksTransform}
import viper.gobra.backend.BackendVerifier
import viper.gobra.frontend.info.{Info, TypeInfo}
import viper.gobra.frontend.{Config, Desugar, PackageInfo, Parser, ScallopGobraConfig}
@@ -266,7 +266,10 @@ class Gobra extends GoVerifier with GoIdeVerifier {
* be easily extended to perform more transformations
*/
private def performInternalTransformations(program: Program, config: Config, pkgInfo: PackageInfo): Either[Vector[VerifierError], Program] = {
- var transformations: Vector[InternalTransform] = Vector(CGEdgesTerminationTransform)
+ // constant propagation does not cause duplication of verification errors caused
+ // by overflow checks (if enabled) because all overflows in constant declarations
+ // can be found by the well-formedness checks.
+ var transformations: Vector[InternalTransform] = Vector(CGEdgesTerminationTransform, ConstantPropagation)
if (config.checkOverflows) {
transformations :+= OverflowChecksTransform
}
diff --git a/src/main/scala/viper/gobra/ast/internal/Program.scala b/src/main/scala/viper/gobra/ast/internal/Program.scala
index 2ef54b7bd..5ae635350 100644
--- a/src/main/scala/viper/gobra/ast/internal/Program.scala
+++ b/src/main/scala/viper/gobra/ast/internal/Program.scala
@@ -31,24 +31,24 @@ case class Program(
}
class LookupTable(
- private val definedTypes: Map[(String, Addressability), Type] = Map.empty,
- private val definedMethods: Map[MethodProxy, MethodLikeMember] = Map.empty,
- private val definedFunctions: Map[FunctionProxy, FunctionLikeMember] = Map.empty,
- private val definedMPredicates: Map[MPredicateProxy, MPredicateLikeMember] = Map.empty,
- private val definedFPredicates: Map[FPredicateProxy, FPredicateLikeMember] = Map.empty,
- private val definedFuncLiterals: Map[FunctionLitProxy, FunctionLitLike] = Map.empty,
+ private[internal] val definedTypes: Map[(String, Addressability), Type] = Map.empty,
+ private[internal] val definedMethods: Map[MethodProxy, MethodLikeMember] = Map.empty,
+ private[internal] val definedFunctions: Map[FunctionProxy, FunctionLikeMember] = Map.empty,
+ private[internal] val definedMPredicates: Map[MPredicateProxy, MPredicateLikeMember] = Map.empty,
+ private[internal] val definedFPredicates: Map[FPredicateProxy, FPredicateLikeMember] = Map.empty,
+ private[internal] val definedFuncLiterals: Map[FunctionLitProxy, FunctionLitLike] = Map.empty,
/**
* only has to be defined on types that implement an interface // might change depending on how embedding support changes
* SortedSet is used to achieve a consistent ordering of members across runs of Gobra
*/
- private val directMemberProxies: Map[Type, SortedSet[MemberProxy]] = Map.empty,
+ private[internal] val directMemberProxies: Map[Type, SortedSet[MemberProxy]] = Map.empty,
/**
* empty interface does not have to be included
* SortedSet is used to achieve a consistent ordering of members across runs of Gobra
*/
- private val directInterfaceImplementations: Map[InterfaceT, SortedSet[Type]] = Map.empty,
- private val implementationProofPredicateAliases: Map[(Type, InterfaceT, String), FPredicateProxy] = Map.empty,
+ private[internal] val directInterfaceImplementations: Map[InterfaceT, SortedSet[Type]] = Map.empty,
+ private[internal] val implementationProofPredicateAliases: Map[(Type, InterfaceT, String), FPredicateProxy] = Map.empty,
) {
def lookup(t: DefinedT): Type = definedTypes(t.name, t.addressability)
def lookup(m: MethodProxy): MethodLikeMember = definedMethods(m)
diff --git a/src/main/scala/viper/gobra/ast/internal/transform/ConstantPropagation.scala b/src/main/scala/viper/gobra/ast/internal/transform/ConstantPropagation.scala
new file mode 100644
index 000000000..f8f960b5e
--- /dev/null
+++ b/src/main/scala/viper/gobra/ast/internal/transform/ConstantPropagation.scala
@@ -0,0 +1,45 @@
+// This Source Code Form is subject to the terms of the Mozilla Public
+// License, v. 2.0. If a copy of the MPL was not distributed with this
+// file, You can obtain one at http://mozilla.org/MPL/2.0/.
+//
+// Copyright (c) 2011-2021 ETH Zurich.
+
+package viper.gobra.ast.internal.transform
+
+import viper.gobra.ast.{internal => in}
+import viper.gobra.util.Violation
+
+object ConstantPropagation extends InternalTransform {
+ override def name(): String = "constant_propagation"
+
+ override def transform(p: in.Program): in.Program = {
+ val (constDecls, noConstDecls) = p.members.partition(_.isInstanceOf[in.GlobalConstDecl])
+ def propagate[T <: in.Node](n: T): T = n.transform{
+ case c: in.GlobalConst =>
+ val litOpt = constDecls collectFirst { case in.GlobalConstDecl(l, r) if l == c => r.withInfo(c.info) }
+ litOpt match {
+ case Some(l) => l
+ case _ => Violation.violation(s"Did not find declaration of constant $c")
+ }
+ }
+
+ // TODO: duplicated work can be avoided - currently, propagate is applied twice per member
+ val newTable = new in.LookupTable(
+ definedTypes = p.table.definedTypes,
+ definedMethods = p.table.definedMethods.view.mapValues(propagate).toMap,
+ definedFunctions = p.table.definedFunctions.view.mapValues(propagate).toMap,
+ definedMPredicates = p.table.definedMPredicates.view.mapValues(propagate).toMap,
+ definedFPredicates = p.table.definedFPredicates.view.mapValues(propagate).toMap,
+ definedFuncLiterals = p.table.definedFuncLiterals.view.mapValues(propagate).toMap,
+ directMemberProxies = p.table.directMemberProxies,
+ directInterfaceImplementations = p.table.directInterfaceImplementations,
+ implementationProofPredicateAliases = p.table.implementationProofPredicateAliases,
+ )
+
+ in.Program(
+ types = p.types,
+ members = noConstDecls.map(propagate), // does not emit constant declarations
+ table = newTable,
+ )(p.info)
+ }
+}
\ No newline at end of file
From 46ca5f0a9d27d080234dcc104cef65357a33e864 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jo=C3=A3o=20Pereira?=
Date: Mon, 10 Oct 2022 14:55:50 +0200
Subject: [PATCH 012/296] Fix #544 (#545)
* Add fix and tests
* Fix test
* Fix test
---
.../viper/gobra/frontend/Gobrafier.scala | 8 +-
.../gobra/parsing/GobrafyUnitTests.scala | 298 +++++++++++++++++-
2 files changed, 301 insertions(+), 5 deletions(-)
diff --git a/src/main/scala/viper/gobra/frontend/Gobrafier.scala b/src/main/scala/viper/gobra/frontend/Gobrafier.scala
index fc3286406..a492fe18c 100644
--- a/src/main/scala/viper/gobra/frontend/Gobrafier.scala
+++ b/src/main/scala/viper/gobra/frontend/Gobrafier.scala
@@ -14,8 +14,8 @@ import scala.util.matching.Regex
object Gobrafier {
- private def multilineComment(str: String): String = s"/\\*@\\s*$str\\s*@\\*/"
- private def singlelineComment(str: String): String = s"//@\\s*$str\\s*"
+ private def multilineComment(str: String): String = s"/\\*\\s?@\\s*$str\\s*@\\s?\\*/"
+ private def singlelineComment(str: String): String = s"//\\s?@\\s*$str\\s*"
/**
* Keywords used in Goified files.
@@ -67,7 +67,7 @@ object Gobrafier {
* Remove the remaining goifying comments in the file.
*/
private def removeGoifyingComments(fileContent: String): String =
- fileContent.replaceAll(s"//@\\s*", "").replaceAll(s"/\\*@$non_newline*", "").replaceAll(s"(?m)$non_newline*@\\*/", "")
+ fileContent.replaceAll(s"//\\s?@\\s*", "").replaceAll(s"/\\*\\s?@$non_newline*", "").replaceAll(s"(?m)$non_newline*@\\s?\\*/", "")
@@ -198,7 +198,7 @@ object Gobrafier {
actualRhs +
(if (actualRhs == null || actualRhs == "" || ghostRhs == "" || ghostRhs == null) "" else ", ") +
(if (ghostRhs == "" || ghostRhs == null) "" else ghostRhs) +
- (if (comment == "" || comment == null) "" else "//@ " + comment)
+ (if (comment == "" || comment == null) "" else "// @ " + comment)
})
/**
diff --git a/src/test/scala/viper/gobra/parsing/GobrafyUnitTests.scala b/src/test/scala/viper/gobra/parsing/GobrafyUnitTests.scala
index 15454552a..db8aa6c76 100644
--- a/src/test/scala/viper/gobra/parsing/GobrafyUnitTests.scala
+++ b/src/test/scala/viper/gobra/parsing/GobrafyUnitTests.scala
@@ -29,6 +29,21 @@ class GobrafyUnitTests extends AnyFunSuite with Matchers with Inside {
frontend.gobrafy(input, expected)
}
+ test("function with ghost args (post Go 1.19)") {
+ val input =
+ """
+ |// @ ghost-parameters: b int, c int
+ |// @ requires a >= 0 && b >= 0
+ |func foo(a int) {}
+ |""".stripMargin
+ val expected =
+ """
+ |requires a >= 0 && b >= 0
+ |func foo(a int, ghost b int, ghost c int) {}
+ |""".stripMargin
+ frontend.gobrafy(input, expected)
+ }
+
test("function with ghost results") {
val input =
"""
@@ -46,6 +61,23 @@ class GobrafyUnitTests extends AnyFunSuite with Matchers with Inside {
frontend.gobrafy(input, expected)
}
+ test("function with ghost results (post Go 1.19)") {
+ val input =
+ """
+ |// @ ghost-results: b int, c int
+ |// @ requires a >= 0
+ |// @ ensures a == b && b == c
+ |func foo(a int) {}
+ |""".stripMargin
+ val expected =
+ """
+ |requires a >= 0
+ |ensures a == b && b == c
+ |func foo(a int) (ghost b int, ghost c int) {}
+ |""".stripMargin
+ frontend.gobrafy(input, expected)
+ }
+
test("pure interface function should stay pure") {
val input =
"""
@@ -76,6 +108,36 @@ class GobrafyUnitTests extends AnyFunSuite with Matchers with Inside {
frontend.gobrafy(input, expected)
}
+ test("pure interface function should stay pure (post Go 1.19)") {
+ val input =
+ """
+ |type stream interface {
+ | // @ pred mem()
+ |
+ | // @ requires acc(mem(), 1/2)
+ | // @ pure
+ | hasNext() bool
+ |
+ | // @ requires mem() && hasNext()
+ | // @ ensures mem()
+ | next() interface{}
+ |}""".stripMargin
+ val expected =
+ """
+ |type stream interface {
+ | pred mem()
+ |
+ | requires acc(mem(), 1/2)
+ | pure
+ | hasNext() bool
+ |
+ | requires mem() && hasNext()
+ | ensures mem()
+ | next() interface{}
+ |}""".stripMargin
+ frontend.gobrafy(input, expected)
+ }
+
test("pure interface function should stay pure even with provided implementation") {
val input =
"""
@@ -126,6 +188,56 @@ class GobrafyUnitTests extends AnyFunSuite with Matchers with Inside {
frontend.gobrafy(input, expected)
}
+ test("pure interface function should stay pure even with provided implementation (post Go 1.19)") {
+ val input =
+ """
+ |package presentation
+ |
+ |type stream interface {
+ | // @ pred mem()
+ |
+ | // @ requires acc(mem(), 1/2)
+ | // @ pure
+ | hasNext() bool
+ |}
+ |
+ |/** Implementation **/
+ |
+ |type counter struct{ f, max int }
+ |
+ |// @ requires acc(x, 1/2)
+ |// @ pure
+ |func (x *counter) hasNext() bool {
+ | return x.f < x.max
+ |}
+ |
+ |""".stripMargin
+ val expected =
+ """
+ |package presentation
+ |
+ |type stream interface {
+ | pred mem()
+ |
+ | requires acc(mem(), 1/2)
+ | pure
+ | hasNext() bool
+ |}
+ |
+ |/** Implementation **/
+ |
+ |type counter struct{ f, max int }
+ |
+ |requires acc(x, 1/2)
+ |pure
+ |func (x *counter) hasNext() bool {
+ | return x.f < x.max
+ |}
+ |
+ |""".stripMargin
+ frontend.gobrafy(input, expected)
+ }
+
test("assignment with ghost variables") {
val input =
"""
@@ -138,6 +250,18 @@ class GobrafyUnitTests extends AnyFunSuite with Matchers with Inside {
frontend.gobrafy(input, expected)
}
+ test("assignment with ghost variables (post Go 1.19)") {
+ val input =
+ """
+ |a, b, c = d, e, f // @ with: g, h = i, j
+ |""".stripMargin
+ val expected =
+ """
+ |a, b, c, g, h = d, e, f, i, j
+ |""".stripMargin
+ frontend.gobrafy(input, expected)
+ }
+
test("short variable declaration with ghost variables") {
val input =
"""
@@ -150,7 +274,19 @@ class GobrafyUnitTests extends AnyFunSuite with Matchers with Inside {
frontend.gobrafy(input, expected)
}
- test("short variable declaration with ghost variables and addressability") {
+ test("short variable declaration with ghost variables (post Go 1.19)") {
+ val input =
+ """
+ |a, b, c := d, e, f // @ with: g, h := i, j
+ |""".stripMargin
+ val expected =
+ """
+ |a, b, c, g, h := d, e, f, i, j
+ |""".stripMargin
+ frontend.gobrafy(input, expected)
+ }
+
+ test("short variable declaration with ghost variables and addressability") {
val input =
"""
|a, b, c := d, e, f //@ with: g, h := i, j; addressable: b, g
@@ -162,6 +298,18 @@ class GobrafyUnitTests extends AnyFunSuite with Matchers with Inside {
frontend.gobrafy(input, expected)
}
+ test("short variable declaration with ghost variables and addressability (post Go 1.19)") {
+ val input =
+ """
+ |a, b, c := d, e, f // @ with: g, h := i, j; addressable: b, g
+ |""".stripMargin
+ val expected =
+ """
+ |a, b@, c, g@, h := d, e, f, i, j
+ |""".stripMargin
+ frontend.gobrafy(input, expected)
+ }
+
test("ghost return mixed") {
val input =
"""
@@ -174,6 +322,19 @@ class GobrafyUnitTests extends AnyFunSuite with Matchers with Inside {
frontend.gobrafy(input, expected)
}
+ test("ghost return mixed (post Go 1.19)") {
+ val input =
+ """
+ |return a, b // @ with: c, d
+ |""".stripMargin
+ val expected =
+ """
+ |return a, b, c, d
+ |""".stripMargin
+ frontend.gobrafy(input, expected)
+ }
+
+
test("ghost return only actual") {
val input =
"""
@@ -186,6 +347,18 @@ class GobrafyUnitTests extends AnyFunSuite with Matchers with Inside {
frontend.gobrafy(input, expected)
}
+ test("ghost return only actual (post Go 1.19)") {
+ val input =
+ """
+ |return a, b // @ with:
+ |""".stripMargin
+ val expected =
+ """
+ |return a, b
+ |""".stripMargin
+ frontend.gobrafy(input, expected)
+ }
+
test("ghost return only ghost") {
val input =
"""
@@ -198,6 +371,18 @@ class GobrafyUnitTests extends AnyFunSuite with Matchers with Inside {
frontend.gobrafy(input, expected)
}
+ test("ghost return only ghost (post Go 1.19)") {
+ val input =
+ """
+ |return // @ with: a, b
+ |""".stripMargin
+ val expected =
+ """
+ |return a, b
+ |""".stripMargin
+ frontend.gobrafy(input, expected)
+ }
+
test("call with only actual arguments") {
val input =
"""
@@ -212,6 +397,22 @@ class GobrafyUnitTests extends AnyFunSuite with Matchers with Inside {
frontend.gobrafy(input, expected)
}
+ test("call with only actual arguments (post Go 1.19)") {
+ val input = {
+ // also testing with the now supported "/* @" annotation, even though Go does not enforce it
+ """
+ |foo(a, b) /* @ with: @ */
+ |foo(c, d) // @ with:
+ |""".stripMargin
+ }
+ val expected =
+ """
+ |foo(a, b)
+ |foo(c, d)
+ |""".stripMargin
+ frontend.gobrafy(input, expected)
+ }
+
test("call with only ghost arguments") {
val input =
"""
@@ -226,6 +427,21 @@ class GobrafyUnitTests extends AnyFunSuite with Matchers with Inside {
frontend.gobrafy(input, expected)
}
+ test("call with only ghost arguments (post Go 1.19)") {
+ // also testing with the now supported "/* @" annotation, even though Go does not enforce it
+ val input =
+ """
+ |foo() // @ with: a, b
+ |foo() /* @ with: c, d @ */
+ |""".stripMargin
+ val expected =
+ """
+ |foo(a, b)
+ |foo(c, d)
+ |""".stripMargin
+ frontend.gobrafy(input, expected)
+ }
+
test("call with mix arguments") {
val input =
"""
@@ -240,6 +456,21 @@ class GobrafyUnitTests extends AnyFunSuite with Matchers with Inside {
frontend.gobrafy(input, expected)
}
+ test("call with mix arguments (post Go 1.19)") {
+ // also testing with the now supported "/* @" annotation, even though Go does not enforce it
+ val input =
+ """
+ |foo(a, b) /* @ with: c, d @ */
+ |foo(e, f) // @ with: g, h
+ |""".stripMargin
+ val expected =
+ """
+ |foo(a, b, c, d)
+ |foo(e, f, g, h)
+ |""".stripMargin
+ frontend.gobrafy(input, expected)
+ }
+
test("call with spec, with only actual arguments") {
val input =
"""
@@ -260,6 +491,27 @@ class GobrafyUnitTests extends AnyFunSuite with Matchers with Inside {
frontend.gobrafy(input, expected)
}
+ test("call with spec, with only actual arguments (post Go 1.19)") {
+ // also testing with the now supported "/* @" annotation, even though Go does not enforce it
+ val input =
+ """
+ |cl(a, b) /* @ as foo{}@ */
+ |cl(c, d) /* @ as foo{} @ *//* @ with: @ */
+ |cl(c, d) /* @ as foo{1, 2} @ *//* @ with: @ */
+ |cl(c, d) /* @ as foo{x: 1, y: 2} @ *//* @ with: @ */
+ |cl(e, f) /* @ as foo{} @ */// @ with:
+ |""".stripMargin
+ val expected =
+ """
+ |cl(a, b) as foo{}
+ |cl(c, d) as foo{}
+ |cl(c, d) as foo{1, 2}
+ |cl(c, d) as foo{x: 1, y: 2}
+ |cl(e, f) as foo{}
+ |""".stripMargin
+ frontend.gobrafy(input, expected)
+ }
+
test("call with spec, with only ghost arguments") {
val input =
"""
@@ -278,6 +530,24 @@ class GobrafyUnitTests extends AnyFunSuite with Matchers with Inside {
frontend.gobrafy(input, expected)
}
+ test("call with spec, with only ghost arguments (post Go 1.19)") {
+ val input =
+ """
+ |cl() /* @ as foo{} @ *//* @ with: a, b @ */
+ |cl() /* @ as foo{} @ */// @ with: c, d
+ |cl() /* @ as foo{1, 2} @ */// @ with: c, d
+ |cl() /* @ as foo{x: 1, y: 2} @ */// @ with: c, d
+ |""".stripMargin
+ val expected =
+ """
+ |cl(a, b) as foo{}
+ |cl(c, d) as foo{}
+ |cl(c, d) as foo{1, 2}
+ |cl(c, d) as foo{x: 1, y: 2}
+ |""".stripMargin
+ frontend.gobrafy(input, expected)
+ }
+
test("call with spec, with mixed arguments") {
val input =
"""
@@ -292,6 +562,20 @@ class GobrafyUnitTests extends AnyFunSuite with Matchers with Inside {
frontend.gobrafy(input, expected)
}
+ test("call with spec, with mixed arguments (post Go 1.19) ") {
+ val input =
+ """
+ |cl(a, b) /* @ as foo{} @ *//* @ with: c, d @ */
+ |cl(e, f) /* @ as foo{} @ */// @ with: g, h
+ |""".stripMargin
+ val expected =
+ """
+ |cl(a, b, c, d) as foo{}
+ |cl(e, f, g, h) as foo{}
+ |""".stripMargin
+ frontend.gobrafy(input, expected)
+ }
+
test("unfolding predicate instance") {
val input =
"""
@@ -304,6 +588,18 @@ class GobrafyUnitTests extends AnyFunSuite with Matchers with Inside {
frontend.gobrafy(input, expected)
}
+ test("unfolding predicate instance (post Go 1.19)") {
+ val input =
+ """
+ |v := /* @ unfolding: list(n) @ */ n.val
+ |""".stripMargin
+ val expected =
+ """
+ |v := unfolding list(n) in n.val
+ |""".stripMargin
+ frontend.gobrafy(input, expected)
+ }
+
/* ** Stubs, mocks and other test setup */
From 6185b2b28f02240901ba73dd6be2d9fa09002cfb Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jo=C3=A3o=20Pereira?=
Date: Tue, 11 Oct 2022 15:04:03 +0200
Subject: [PATCH 013/296] Fix lazy generation of the string domain (#547)
---
.../viper/gobra/translator/encodings/StringEncoding.scala | 6 ++++--
1 file changed, 4 insertions(+), 2 deletions(-)
diff --git a/src/main/scala/viper/gobra/translator/encodings/StringEncoding.scala b/src/main/scala/viper/gobra/translator/encodings/StringEncoding.scala
index 6a5d5596d..f9f0bf2be 100644
--- a/src/main/scala/viper/gobra/translator/encodings/StringEncoding.scala
+++ b/src/main/scala/viper/gobra/translator/encodings/StringEncoding.scala
@@ -129,7 +129,7 @@ class StringEncoding extends LeafTypeEncoding {
override def finalize(addMemberFn: vpr.Member => Unit): Unit = {
if (isUsed) {
addMemberFn(genDomain())
- addMemberFn(strSlice)
+ if (strSliceIsUsed) { addMemberFn(strSlice) }
byteSliceToStrFuncGenerator.finalize(addMemberFn)
}
}
@@ -184,7 +184,9 @@ class StringEncoding extends LeafTypeEncoding {
* where s is a string id and l and r are the lower and upper bounds of the slice
*/
private val strSliceName: String = "strSlice"
- val strSlice: vpr.Function = {
+ private var strSliceIsUsed = false
+ lazy val strSlice: vpr.Function = {
+ strSliceIsUsed = true
val argS = vpr.LocalVarDecl("s", stringType)()
val argL = vpr.LocalVarDecl("l", vpr.Int)()
val argH = vpr.LocalVarDecl("h", vpr.Int)()
From e186b1b36014ad112be5b19794a38a2c141abcdb Mon Sep 17 00:00:00 2001
From: Linard Arquint
Date: Wed, 12 Oct 2022 16:21:58 +0200
Subject: [PATCH 014/296] decides based on the types of termination measures
which axioms to import and emits the Viper encoding before applying
Viper-to-Viper transformations
---
.../scala/viper/gobra/reporting/Message.scala | 2 +-
.../viper/gobra/translator/Translator.scala | 37 +++++++++++++++++--
.../transformers/TerminationTransformer.scala | 32 ++++++++++++++--
3 files changed, 62 insertions(+), 9 deletions(-)
diff --git a/src/main/scala/viper/gobra/reporting/Message.scala b/src/main/scala/viper/gobra/reporting/Message.scala
index 5b9157e6d..61530d91b 100644
--- a/src/main/scala/viper/gobra/reporting/Message.scala
+++ b/src/main/scala/viper/gobra/reporting/Message.scala
@@ -166,7 +166,7 @@ case class GeneratedViperMessage(taskName: String, inputs: Vector[String], vprAs
override val name: String = s"generated_viper_message"
override def toString: String = s"generated_viper_message(" +
- s"taskName=$taskName"
+ s"taskName=$taskName" +
s"files=$inputs, " +
s"vprFormated=$vprAstFormatted)"
diff --git a/src/main/scala/viper/gobra/translator/Translator.scala b/src/main/scala/viper/gobra/translator/Translator.scala
index a142a67d8..d84983a93 100644
--- a/src/main/scala/viper/gobra/translator/Translator.scala
+++ b/src/main/scala/viper/gobra/translator/Translator.scala
@@ -15,6 +15,8 @@ import viper.gobra.translator.context.DfltTranslatorConfig
import viper.gobra.translator.encodings.programs.ProgramsImpl
import viper.gobra.translator.transformers.{AssumeTransformer, TerminationTransformer, ViperTransformer}
import viper.gobra.util.Violation
+import viper.silver.ast.pretty.FastPrettyPrinter
+import viper.silver.{ast => vpr}
object Translator {
@@ -22,6 +24,8 @@ object Translator {
val translationConfig = new DfltTranslatorConfig()
val programTranslator = new ProgramsImpl()
val task = programTranslator.translate(program)(translationConfig)
+ // we report the un-transformed program as this is much more readable
+ config.reporter report GeneratedViperMessage(config.taskName, config.packageInfoInputMap(pkgInfo).map(_.name), () => sortAst(task.program), () => task.backtrack)
if (config.checkConsistency) {
val errors = task.program.checkTransitively
@@ -33,12 +37,37 @@ object Translator {
new TerminationTransformer
)
- val transformedTask = transformers.foldLeft(task) {
+ transformers.foldLeft(task) {
case (t, transformer) => transformer.transform(t)
}
-
- config.reporter report GeneratedViperMessage(config.taskName, config.packageInfoInputMap(pkgInfo).map(_.name), () => transformedTask.program, () => transformedTask.backtrack)
- transformedTask
}
+ def sortAst(program: vpr.Program): vpr.Program = {
+ implicit def domainOrdering: Ordering[vpr.Domain] = Ordering.by(_.name)
+ implicit def domainFnOrdering: Ordering[vpr.DomainFunc] = Ordering.by(_.name)
+ implicit def domainAxOrdering: Ordering[vpr.DomainAxiom] = Ordering.by(FastPrettyPrinter.pretty(_))
+ implicit def fieldOrdering: Ordering[vpr.Field] = Ordering.by(_.name)
+ implicit def functionOrdering: Ordering[vpr.Function] = Ordering.by(_.name)
+ implicit def predicateOrdering: Ordering[vpr.Predicate] = Ordering.by(_.name)
+ implicit def methodOrdering: Ordering[vpr.Method] = Ordering.by(_.name)
+ implicit def extensionOrdering: Ordering[vpr.ExtensionMember] = Ordering.by(_.name)
+
+ def sortDomain(domain: vpr.Domain): vpr.Domain = {
+ vpr.Domain(
+ domain.name,
+ domain.functions.sorted,
+ domain.axioms.sorted,
+ domain.typVars
+ )(domain.pos, domain.info, domain.errT)
+ }
+
+ vpr.Program(
+ program.domains.map(sortDomain).sorted,
+ program.fields.sorted,
+ program.functions.sorted,
+ program.predicates.sorted,
+ program.methods.sorted,
+ program.extensions.sorted,
+ )(program.pos, program.info, program.errT)
+ }
}
diff --git a/src/main/scala/viper/gobra/translator/transformers/TerminationTransformer.scala b/src/main/scala/viper/gobra/translator/transformers/TerminationTransformer.scala
index 1809fa0c7..50465895c 100644
--- a/src/main/scala/viper/gobra/translator/transformers/TerminationTransformer.scala
+++ b/src/main/scala/viper/gobra/translator/transformers/TerminationTransformer.scala
@@ -6,13 +6,13 @@
package viper.gobra.translator.transformers
import java.nio.file.Path
-
import viper.gobra.backend.BackendVerifier
import viper.gobra.util.Violation
import viper.silicon.Silicon
import viper.silver.{ast => vpr}
import viper.silver.frontend.{DefaultStates, ViperAstProvider}
-import viper.silver.plugin.standard.termination.TerminationPlugin
+import viper.silver.plugin.standard.predicateinstance.PredicateInstance.PredicateInstanceDomainName
+import viper.silver.plugin.standard.termination.{DecreasesTuple, TerminationPlugin}
import viper.silver.reporter.{NoopReporter, Reporter}
import viper.silver.plugin.standard.predicateinstance.PredicateInstancePlugin
@@ -26,9 +26,33 @@ class TerminationTransformer extends ViperTransformer {
// constructs a separate Viper program (as a string) that should be parsed
// after parsing this separate Viper program, the resulting AST is combined with `task`
+ val allImport = "decreases/all.vpr"
+ def type2Import(typ: vpr.Type): String = typ match {
+ case vpr.Bool => "decreases/bool.vpr"
+ case vpr.Int => "decreases/int.vpr"
+ case vpr.MultisetType(_) => "decreases/multiset.vpr"
+ case vpr.Perm => "decreases/rational.vpr"
+ case vpr.Ref => "decreases/ref.vpr"
+ case vpr.SeqType(_) => "decreases/seq.vpr"
+ case vpr.SetType(_) => "decreases/set.vpr"
+ case vpr.DomainType(name, _) if name == PredicateInstanceDomainName => "decreases/predicate_instance.vpr"
+ case _ => allImport // fallback
+ }
+
+ // find the types of all expressions used as decreases measues
+ val measureTypes = task.program.deepCollect {
+ case DecreasesTuple(tupleExpressions, _) => tupleExpressions.map(_.typ)
+ }.flatten.distinct
+ // map these types to the respective files that should be imported
+ val imports = measureTypes
+ .map(type2Import)
+ .distinct
+ // if `allImport` is in the list of files that should be imported, we can ignore all others and instead only import
+ // `allImport`
+ val importsAll = imports.contains(allImport)
/** list of Viper standard imports that should be parsed */
- val imports = Seq("decreases/all.vpr")
- val progWithImports = imports.map(p => s"import <${p}>").mkString("\n")
+ val filteredImports = if (importsAll) Seq(allImport) else imports
+ val progWithImports = filteredImports.map(p => s"import <${p}>").mkString("\n")
val vprProgram = parseVpr(progWithImports)
combine(task, vprProgram)
}
From d7cbcfdfef25afbddcac02f96d4c65d8d1d69c5d Mon Sep 17 00:00:00 2001
From: Linard Arquint
Date: Wed, 12 Oct 2022 17:29:06 +0200
Subject: [PATCH 015/296] reverts emitting the Viper encoding before performing
the Viper-to-Viper transformations because termination measures are printed
in invalid syntax
---
src/main/scala/viper/gobra/translator/Translator.scala | 7 ++++---
1 file changed, 4 insertions(+), 3 deletions(-)
diff --git a/src/main/scala/viper/gobra/translator/Translator.scala b/src/main/scala/viper/gobra/translator/Translator.scala
index d84983a93..993a4c3d8 100644
--- a/src/main/scala/viper/gobra/translator/Translator.scala
+++ b/src/main/scala/viper/gobra/translator/Translator.scala
@@ -24,8 +24,6 @@ object Translator {
val translationConfig = new DfltTranslatorConfig()
val programTranslator = new ProgramsImpl()
val task = programTranslator.translate(program)(translationConfig)
- // we report the un-transformed program as this is much more readable
- config.reporter report GeneratedViperMessage(config.taskName, config.packageInfoInputMap(pkgInfo).map(_.name), () => sortAst(task.program), () => task.backtrack)
if (config.checkConsistency) {
val errors = task.program.checkTransitively
@@ -37,9 +35,12 @@ object Translator {
new TerminationTransformer
)
- transformers.foldLeft(task) {
+ val transformedTask = transformers.foldLeft(task) {
case (t, transformer) => transformer.transform(t)
}
+
+ config.reporter report GeneratedViperMessage(config.taskName, config.packageInfoInputMap(pkgInfo).map(_.name), () => sortAst(transformedTask.program), () => transformedTask.backtrack)
+ transformedTask
}
def sortAst(program: vpr.Program): vpr.Program = {
From 07a80d11ad16273f2cc8794edc6368655acc151f Mon Sep 17 00:00:00 2001
From: viper-admin <59963956+viper-admin@users.noreply.github.com>
Date: Thu, 13 Oct 2022 09:01:45 +0200
Subject: [PATCH 016/296] Updates submodules (#549)
Co-authored-by: ArquintL
---
viperserver | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/viperserver b/viperserver
index c2622f973..2e4743769 160000
--- a/viperserver
+++ b/viperserver
@@ -1 +1 @@
-Subproject commit c2622f973135f8a25cd0680ae6f18e74530d9135
+Subproject commit 2e47437693fcdc32f8f18b7c923550c1143013d7
From 69df77694f5c14e5e035324dd1a09fd061817957 Mon Sep 17 00:00:00 2001
From: Linard Arquint
Date: Thu, 13 Oct 2022 11:18:00 +0200
Subject: [PATCH 017/296] implements CR suggestions by Joao
---
.../viper/gobra/translator/Translator.scala | 26 +++++++++----------
1 file changed, 12 insertions(+), 14 deletions(-)
diff --git a/src/main/scala/viper/gobra/translator/Translator.scala b/src/main/scala/viper/gobra/translator/Translator.scala
index 993a4c3d8..8cb2a1fab 100644
--- a/src/main/scala/viper/gobra/translator/Translator.scala
+++ b/src/main/scala/viper/gobra/translator/Translator.scala
@@ -43,15 +43,13 @@ object Translator {
transformedTask
}
+ /**
+ * sorts AST members alphabetically to ease the comparison of (similar) Viper ASTs
+ */
def sortAst(program: vpr.Program): vpr.Program = {
- implicit def domainOrdering: Ordering[vpr.Domain] = Ordering.by(_.name)
- implicit def domainFnOrdering: Ordering[vpr.DomainFunc] = Ordering.by(_.name)
- implicit def domainAxOrdering: Ordering[vpr.DomainAxiom] = Ordering.by(FastPrettyPrinter.pretty(_))
- implicit def fieldOrdering: Ordering[vpr.Field] = Ordering.by(_.name)
- implicit def functionOrdering: Ordering[vpr.Function] = Ordering.by(_.name)
- implicit def predicateOrdering: Ordering[vpr.Predicate] = Ordering.by(_.name)
- implicit def methodOrdering: Ordering[vpr.Method] = Ordering.by(_.name)
- implicit def extensionOrdering: Ordering[vpr.ExtensionMember] = Ordering.by(_.name)
+ lazy val memberOrdering: Ordering[vpr.Member] = Ordering.by(_.name)
+ implicit lazy val domainFnOrdering: Ordering[vpr.DomainFunc] = Ordering.by(_.name)
+ implicit lazy val domainAxOrdering: Ordering[vpr.DomainAxiom] = Ordering.by(FastPrettyPrinter.pretty(_))
def sortDomain(domain: vpr.Domain): vpr.Domain = {
vpr.Domain(
@@ -63,12 +61,12 @@ object Translator {
}
vpr.Program(
- program.domains.map(sortDomain).sorted,
- program.fields.sorted,
- program.functions.sorted,
- program.predicates.sorted,
- program.methods.sorted,
- program.extensions.sorted,
+ program.domains.map(sortDomain).sorted(memberOrdering),
+ program.fields.sorted(memberOrdering),
+ program.functions.sorted(memberOrdering),
+ program.predicates.sorted(memberOrdering),
+ program.methods.sorted(memberOrdering),
+ program.extensions.sorted(memberOrdering),
)(program.pos, program.info, program.errT)
}
}
From d3a7682d9ad1f1b7b5092a76b18e751ede14bb48 Mon Sep 17 00:00:00 2001
From: Linard Arquint
Date: Thu, 13 Oct 2022 11:51:00 +0200
Subject: [PATCH 018/296] assigns expression in expression statement to a fresh
variable to ensure that the expression does not get lost in the internal
representation
---
.../scala/viper/gobra/frontend/Desugar.scala | 10 +++++++--
.../features/purefuncs/unused-result.gobra | 22 +++++++++++++++++++
2 files changed, 30 insertions(+), 2 deletions(-)
create mode 100644 src/test/resources/regressions/features/purefuncs/unused-result.gobra
diff --git a/src/main/scala/viper/gobra/frontend/Desugar.scala b/src/main/scala/viper/gobra/frontend/Desugar.scala
index 262d201d3..f31ec1351 100644
--- a/src/main/scala/viper/gobra/frontend/Desugar.scala
+++ b/src/main/scala/viper/gobra/frontend/Desugar.scala
@@ -1032,8 +1032,14 @@ object Desugar {
))
case PExpressionStmt(e) =>
- val w = goE(e)
- create(stmts = w.stmts, decls = w.decls, res = in.Seqn(Vector.empty)(src))
+ // assign the expression's value to a temporary variable because the expression can result in proof obligations
+ // (e.g. checking the precondition for a pure function call)
+ val tempVar = freshExclusiveVar(typeD(info.typ(e), Addressability.exclusiveVariable)(src), stmt, info)(src)
+ for {
+ _ <- declare(tempVar)
+ dE <- goE(e)
+ _ <- write(singleAss(in.Assignee.Var(tempVar), dE)(src))
+ } yield in.Seqn(Vector.empty)(src)
case PAssignment(right, left) =>
if (left.size == right.size) {
diff --git a/src/test/resources/regressions/features/purefuncs/unused-result.gobra b/src/test/resources/regressions/features/purefuncs/unused-result.gobra
new file mode 100644
index 000000000..14606ad4a
--- /dev/null
+++ b/src/test/resources/regressions/features/purefuncs/unused-result.gobra
@@ -0,0 +1,22 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/publicdomain/zero/1.0/
+
+// checks that pure functions are correctly encoded even if there result is not used
+
+package functions
+
+requires false
+pure func foo() bool {
+ return true
+}
+
+func test1() {
+ //:: ExpectedOutput(precondition_error)
+ res := foo()
+ assert res
+}
+
+func test2() {
+ //:: ExpectedOutput(precondition_error)
+ foo()
+}
From c468c36e42e8642ba708d498cb987d4d5de4118e Mon Sep 17 00:00:00 2001
From: Linard Arquint
Date: Thu, 13 Oct 2022 17:34:20 +0200
Subject: [PATCH 019/296] fixes desugaring of expression stmts to support
expressions returning a tuple of zero or more results
---
.../scala/viper/gobra/frontend/Desugar.scala | 38 +++++++++++++++----
1 file changed, 30 insertions(+), 8 deletions(-)
diff --git a/src/main/scala/viper/gobra/frontend/Desugar.scala b/src/main/scala/viper/gobra/frontend/Desugar.scala
index f31ec1351..3316b2989 100644
--- a/src/main/scala/viper/gobra/frontend/Desugar.scala
+++ b/src/main/scala/viper/gobra/frontend/Desugar.scala
@@ -1032,14 +1032,36 @@ object Desugar {
))
case PExpressionStmt(e) =>
- // assign the expression's value to a temporary variable because the expression can result in proof obligations
- // (e.g. checking the precondition for a pure function call)
- val tempVar = freshExclusiveVar(typeD(info.typ(e), Addressability.exclusiveVariable)(src), stmt, info)(src)
- for {
- _ <- declare(tempVar)
- dE <- goE(e)
- _ <- write(singleAss(in.Assignee.Var(tempVar), dE)(src))
- } yield in.Seqn(Vector.empty)(src)
+ def justLocalVars(e: in.Expr): Boolean = e match {
+ case _: in.LocalVar => true
+ case in.Tuple(args) if args.forall(justLocalVars) => true
+ case _ => false
+ }
+
+ val w = goE(e)
+ // note that `w.res` might contain expressions that cause proof obligations
+ // thus, we can not simply drop them and go forward just with the writer's declarations & statements
+ if (justLocalVars(w.res)) {
+ // this is an optimization because it does not make sense to add additional temporary local variables
+ // just to assign them the local variables in `w.res`:
+ create(stmts = w.stmts, decls = w.decls, res = in.Seqn(Vector.empty)(src))
+ } else {
+ // create temporary local variables to assign them the expression in `w.res`
+ val targetTypes = info.typ(e) match {
+ case InternalTupleT(ts) => ts
+ case t => Vector(t)
+ }
+ val targets = targetTypes.map(typ => freshExclusiveVar(typeD(typ, Addressability.exclusiveVariable)(src), stmt, info)(src))
+ for {
+ _ <- declare(targets: _*)
+ dE <- w
+ _ <- targets match {
+ case Vector() => unit(()) // NOP
+ case Vector(target) => write(singleAss(in.Assignee.Var(target), dE)(src))
+ case _ => write(multiassD(targets.map(in.Assignee.Var(_)), dE, stmt)(src))
+ }
+ } yield in.Seqn(Vector.empty)(src)
+ }
case PAssignment(right, left) =>
if (left.size == right.size) {
From a573322d167a36c81b5d1af48425450048f88ee8 Mon Sep 17 00:00:00 2001
From: Dionysios Spiliopoulos <32896454+Dspil@users.noreply.github.com>
Date: Wed, 19 Oct 2022 19:45:57 +0200
Subject: [PATCH 020/296] Range (#551)
* map range changes
* range for maps and arrays/sclices
* corrected parser and parser tests
* removed shit and added some comments to the desugarer
* made with clause optional
* some feedback incorporation
* more feedback
* supporting for range
* more feedback
---
genparser.sh | 0
src/main/antlr4/GobraLexer.g4 | 1 +
src/main/antlr4/GobraParser.g4 | 7 +
.../java/viper/gobra/frontend/GobraLexer.java | 1387 +++++-----
.../viper/gobra/frontend/GobraParser.java | 2397 +++++++++--------
.../frontend/GobraParserBaseVisitor.java | 18 +-
.../gobra/frontend/GobraParserVisitor.java | 16 +-
.../scala/viper/gobra/ast/frontend/Ast.scala | 4 +-
.../gobra/ast/frontend/PrettyPrinter.scala | 9 +-
.../scala/viper/gobra/frontend/Desugar.scala | 893 +++---
.../gobra/frontend/ParseTreeTranslator.scala | 21 +-
.../frontend/info/base/SymbolTable.scala | 5 +
.../resolution/NameResolution.scala | 4 +-
.../info/implementation/typing/IdTyping.scala | 16 +-
.../implementation/typing/MiscTyping.scala | 8 +-
.../implementation/typing/StmtTyping.scala | 21 +-
.../DefaultErrorBackTranslator.scala | 11 +-
.../scala/viper/gobra/reporting/Source.scala | 3 +-
.../viper/gobra/reporting/VerifierError.scala | 7 +-
.../features/loops/range-fail1.gobra | 2 +-
.../features/loops/range-fail2.gobra | 2 +-
.../features/loops/range-fail3.gobra | 2 +-
.../features/loops/range-fail4.gobra | 2 +-
.../features/loops/range-fail5.gobra | 2 +-
.../features/loops/range-fail6.gobra | 2 +-
.../features/loops/range-fail7.gobra | 2 +-
.../features/loops/range-fail8.gobra | 4 +-
.../regressions/features/loops/range1.gobra | 27 +-
.../regressions/features/loops/range2.gobra | 17 +-
.../regressions/features/loops/range3.gobra | 29 +
.../features/loops/range_maps-fail1.gobra | 13 +
.../features/loops/range_maps1.gobra | 55 +
32 files changed, 2659 insertions(+), 2328 deletions(-)
mode change 100644 => 100755 genparser.sh
create mode 100644 src/test/resources/regressions/features/loops/range3.gobra
create mode 100644 src/test/resources/regressions/features/loops/range_maps-fail1.gobra
create mode 100644 src/test/resources/regressions/features/loops/range_maps1.gobra
diff --git a/genparser.sh b/genparser.sh
old mode 100644
new mode 100755
diff --git a/src/main/antlr4/GobraLexer.g4 b/src/main/antlr4/GobraLexer.g4
index 7db1c0e1f..db44fc749 100644
--- a/src/main/antlr4/GobraLexer.g4
+++ b/src/main/antlr4/GobraLexer.g4
@@ -85,3 +85,4 @@ IMPORT_PRE : 'importRequires';
PROOF : 'proof';
GHOST_EQUALS : '===';
GHOST_NOT_EQUALS : '!==';
+WITH : 'with';
diff --git a/src/main/antlr4/GobraParser.g4 b/src/main/antlr4/GobraParser.g4
index 632f06bdd..5b1a4fe8d 100644
--- a/src/main/antlr4/GobraParser.g4
+++ b/src/main/antlr4/GobraParser.g4
@@ -434,3 +434,10 @@ assign_op: ass_op=(
| AMPERSAND
| BIT_CLEAR
)? ASSIGN;
+
+// Add permission argument to range
+
+rangeClause: (
+ expressionList ASSIGN
+ | maybeAddressableIdentifierList DECLARE_ASSIGN
+ )? RANGE expression (WITH IDENTIFIER?)?;
diff --git a/src/main/java/viper/gobra/frontend/GobraLexer.java b/src/main/java/viper/gobra/frontend/GobraLexer.java
index 9eee0a38d..9f1810987 100644
--- a/src/main/java/viper/gobra/frontend/GobraLexer.java
+++ b/src/main/java/viper/gobra/frontend/GobraLexer.java
@@ -1,4 +1,4 @@
-// Generated from /Users/joao/Code/gobraHome/gobra/src/main/antlr4/GobraLexer.g4 by ANTLR 4.9.2
+// Generated from /main/antlr4/GobraLexer.g4 by ANTLR 4.9.1
package viper.gobra.frontend;
import org.antlr.v4.runtime.Lexer;
import org.antlr.v4.runtime.CharStream;
@@ -11,7 +11,7 @@
@SuppressWarnings({"all", "warnings", "unchecked", "unused", "cast"})
public class GobraLexer extends Lexer {
- static { RuntimeMetaData.checkVersion("4.9.2", RuntimeMetaData.VERSION); }
+ static { RuntimeMetaData.checkVersion("4.9.1", RuntimeMetaData.VERSION); }
protected static final DFA[] _decisionToDFA;
protected static final PredictionContextCache _sharedContextCache =
@@ -27,21 +27,21 @@ public class GobraLexer extends Lexer {
PRED=53, TYPE_OF=54, IS_COMPARABLE=55, SHARE=56, ADDR_MOD=57, DOT_DOT=58,
SHARED=59, EXCLUSIVE=60, PREDICATE=61, WRITEPERM=62, NOPERM=63, TRUSTED=64,
OUTLINE=65, INIT_POST=66, IMPORT_PRE=67, PROOF=68, GHOST_EQUALS=69, GHOST_NOT_EQUALS=70,
- BREAK=71, DEFAULT=72, FUNC=73, INTERFACE=74, SELECT=75, CASE=76, DEFER=77,
- GO=78, MAP=79, STRUCT=80, CHAN=81, ELSE=82, GOTO=83, PACKAGE=84, SWITCH=85,
- CONST=86, FALLTHROUGH=87, IF=88, RANGE=89, TYPE=90, CONTINUE=91, FOR=92,
- IMPORT=93, RETURN=94, VAR=95, NIL_LIT=96, IDENTIFIER=97, L_PAREN=98, R_PAREN=99,
- L_CURLY=100, R_CURLY=101, L_BRACKET=102, R_BRACKET=103, ASSIGN=104, COMMA=105,
- SEMI=106, COLON=107, DOT=108, PLUS_PLUS=109, MINUS_MINUS=110, DECLARE_ASSIGN=111,
- ELLIPSIS=112, LOGICAL_OR=113, LOGICAL_AND=114, EQUALS=115, NOT_EQUALS=116,
- LESS=117, LESS_OR_EQUALS=118, GREATER=119, GREATER_OR_EQUALS=120, OR=121,
- DIV=122, MOD=123, LSHIFT=124, RSHIFT=125, BIT_CLEAR=126, EXCLAMATION=127,
- PLUS=128, MINUS=129, CARET=130, STAR=131, AMPERSAND=132, RECEIVE=133,
- DECIMAL_LIT=134, BINARY_LIT=135, OCTAL_LIT=136, HEX_LIT=137, HEX_FLOAT_LIT=138,
- IMAGINARY_LIT=139, RUNE_LIT=140, BYTE_VALUE=141, OCTAL_BYTE_VALUE=142,
- HEX_BYTE_VALUE=143, LITTLE_U_VALUE=144, BIG_U_VALUE=145, RAW_STRING_LIT=146,
- INTERPRETED_STRING_LIT=147, WS=148, COMMENT=149, TERMINATOR=150, LINE_COMMENT=151,
- WS_NLSEMI=152, COMMENT_NLSEMI=153, LINE_COMMENT_NLSEMI=154, EOS=155, OTHER=156;
+ WITH=71, BREAK=72, DEFAULT=73, FUNC=74, INTERFACE=75, SELECT=76, CASE=77,
+ DEFER=78, GO=79, MAP=80, STRUCT=81, CHAN=82, ELSE=83, GOTO=84, PACKAGE=85,
+ SWITCH=86, CONST=87, FALLTHROUGH=88, IF=89, RANGE=90, TYPE=91, CONTINUE=92,
+ FOR=93, IMPORT=94, RETURN=95, VAR=96, NIL_LIT=97, IDENTIFIER=98, L_PAREN=99,
+ R_PAREN=100, L_CURLY=101, R_CURLY=102, L_BRACKET=103, R_BRACKET=104, ASSIGN=105,
+ COMMA=106, SEMI=107, COLON=108, DOT=109, PLUS_PLUS=110, MINUS_MINUS=111,
+ DECLARE_ASSIGN=112, ELLIPSIS=113, LOGICAL_OR=114, LOGICAL_AND=115, EQUALS=116,
+ NOT_EQUALS=117, LESS=118, LESS_OR_EQUALS=119, GREATER=120, GREATER_OR_EQUALS=121,
+ OR=122, DIV=123, MOD=124, LSHIFT=125, RSHIFT=126, BIT_CLEAR=127, EXCLAMATION=128,
+ PLUS=129, MINUS=130, CARET=131, STAR=132, AMPERSAND=133, RECEIVE=134,
+ DECIMAL_LIT=135, BINARY_LIT=136, OCTAL_LIT=137, HEX_LIT=138, HEX_FLOAT_LIT=139,
+ IMAGINARY_LIT=140, RUNE_LIT=141, BYTE_VALUE=142, OCTAL_BYTE_VALUE=143,
+ HEX_BYTE_VALUE=144, LITTLE_U_VALUE=145, BIG_U_VALUE=146, RAW_STRING_LIT=147,
+ INTERPRETED_STRING_LIT=148, WS=149, COMMENT=150, TERMINATOR=151, LINE_COMMENT=152,
+ WS_NLSEMI=153, COMMENT_NLSEMI=154, LINE_COMMENT_NLSEMI=155, EOS=156, OTHER=157;
public static final int
NLSEMI=1;
public static String[] channelNames = {
@@ -63,9 +63,9 @@ private static String[] makeRuleNames() {
"GET", "DOM", "AXIOM", "NONE", "PRED", "TYPE_OF", "IS_COMPARABLE", "SHARE",
"ADDR_MOD", "DOT_DOT", "SHARED", "EXCLUSIVE", "PREDICATE", "WRITEPERM",
"NOPERM", "TRUSTED", "OUTLINE", "INIT_POST", "IMPORT_PRE", "PROOF", "GHOST_EQUALS",
- "GHOST_NOT_EQUALS", "BREAK", "DEFAULT", "FUNC", "INTERFACE", "SELECT",
- "CASE", "DEFER", "GO", "MAP", "STRUCT", "CHAN", "ELSE", "GOTO", "PACKAGE",
- "SWITCH", "CONST", "FALLTHROUGH", "IF", "RANGE", "TYPE", "CONTINUE",
+ "GHOST_NOT_EQUALS", "WITH", "BREAK", "DEFAULT", "FUNC", "INTERFACE",
+ "SELECT", "CASE", "DEFER", "GO", "MAP", "STRUCT", "CHAN", "ELSE", "GOTO",
+ "PACKAGE", "SWITCH", "CONST", "FALLTHROUGH", "IF", "RANGE", "TYPE", "CONTINUE",
"FOR", "IMPORT", "RETURN", "VAR", "NIL_LIT", "IDENTIFIER", "L_PAREN",
"R_PAREN", "L_CURLY", "R_CURLY", "L_BRACKET", "R_BRACKET", "ASSIGN",
"COMMA", "SEMI", "COLON", "DOT", "PLUS_PLUS", "MINUS_MINUS", "DECLARE_ASSIGN",
@@ -96,15 +96,15 @@ private static String[] makeLiteralNames() {
"'some'", "'get'", "'domain'", "'axiom'", "'none'", "'pred'", "'typeOf'",
"'isComparable'", "'share'", "'@'", "'..'", "'shared'", "'exclusive'",
"'predicate'", "'writePerm'", "'noPerm'", "'trusted'", "'outline'", "'initEnsures'",
- "'importRequires'", "'proof'", "'==='", "'!=='", "'break'", "'default'",
- "'func'", "'interface'", "'select'", "'case'", "'defer'", "'go'", "'map'",
- "'struct'", "'chan'", "'else'", "'goto'", "'package'", "'switch'", "'const'",
- "'fallthrough'", "'if'", "'range'", "'type'", "'continue'", "'for'",
- "'import'", "'return'", "'var'", "'nil'", null, "'('", "')'", "'{'",
- "'}'", "'['", "']'", "'='", "','", "';'", "':'", "'.'", "'++'", "'--'",
- "':='", "'...'", "'||'", "'&&'", "'=='", "'!='", "'<'", "'<='", "'>'",
- "'>='", "'|'", "'/'", "'%'", "'<<'", "'>>'", "'&^'", "'!'", "'+'", "'-'",
- "'^'", "'*'", "'&'", "'<-'"
+ "'importRequires'", "'proof'", "'==='", "'!=='", "'with'", "'break'",
+ "'default'", "'func'", "'interface'", "'select'", "'case'", "'defer'",
+ "'go'", "'map'", "'struct'", "'chan'", "'else'", "'goto'", "'package'",
+ "'switch'", "'const'", "'fallthrough'", "'if'", "'range'", "'type'",
+ "'continue'", "'for'", "'import'", "'return'", "'var'", "'nil'", null,
+ "'('", "')'", "'{'", "'}'", "'['", "']'", "'='", "','", "';'", "':'",
+ "'.'", "'++'", "'--'", "':='", "'...'", "'||'", "'&&'", "'=='", "'!='",
+ "'<'", "'<='", "'>'", "'>='", "'|'", "'/'", "'%'", "'<<'", "'>>'", "'&^'",
+ "'!'", "'+'", "'-'", "'^'", "'*'", "'&'", "'<-'"
};
}
private static final String[] _LITERAL_NAMES = makeLiteralNames();
@@ -119,9 +119,9 @@ private static String[] makeSymbolicNames() {
"GET", "DOM", "AXIOM", "NONE", "PRED", "TYPE_OF", "IS_COMPARABLE", "SHARE",
"ADDR_MOD", "DOT_DOT", "SHARED", "EXCLUSIVE", "PREDICATE", "WRITEPERM",
"NOPERM", "TRUSTED", "OUTLINE", "INIT_POST", "IMPORT_PRE", "PROOF", "GHOST_EQUALS",
- "GHOST_NOT_EQUALS", "BREAK", "DEFAULT", "FUNC", "INTERFACE", "SELECT",
- "CASE", "DEFER", "GO", "MAP", "STRUCT", "CHAN", "ELSE", "GOTO", "PACKAGE",
- "SWITCH", "CONST", "FALLTHROUGH", "IF", "RANGE", "TYPE", "CONTINUE",
+ "GHOST_NOT_EQUALS", "WITH", "BREAK", "DEFAULT", "FUNC", "INTERFACE",
+ "SELECT", "CASE", "DEFER", "GO", "MAP", "STRUCT", "CHAN", "ELSE", "GOTO",
+ "PACKAGE", "SWITCH", "CONST", "FALLTHROUGH", "IF", "RANGE", "TYPE", "CONTINUE",
"FOR", "IMPORT", "RETURN", "VAR", "NIL_LIT", "IDENTIFIER", "L_PAREN",
"R_PAREN", "L_CURLY", "R_CURLY", "L_BRACKET", "R_BRACKET", "ASSIGN",
"COMMA", "SEMI", "COLON", "DOT", "PLUS_PLUS", "MINUS_MINUS", "DECLARE_ASSIGN",
@@ -213,7 +213,7 @@ private boolean DECIMAL_FLOAT_LIT_sempred(RuleContext _localctx, int predIndex)
}
public static final String _serializedATN =
- "\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\2\u009e\u05bc\b\1\b"+
+ "\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\2\u009f\u05c3\b\1\b"+
"\1\4\2\t\2\4\3\t\3\4\4\t\4\4\5\t\5\4\6\t\6\4\7\t\7\4\b\t\b\4\t\t\t\4\n"+
"\t\n\4\13\t\13\4\f\t\f\4\r\t\r\4\16\t\16\4\17\t\17\4\20\t\20\4\21\t\21"+
"\4\22\t\22\4\23\t\23\4\24\t\24\4\25\t\25\4\26\t\26\4\27\t\27\4\30\t\30"+
@@ -236,665 +236,668 @@ private boolean DECIMAL_FLOAT_LIT_sempred(RuleContext _localctx, int predIndex)
"\t\u009b\4\u009c\t\u009c\4\u009d\t\u009d\4\u009e\t\u009e\4\u009f\t\u009f"+
"\4\u00a0\t\u00a0\4\u00a1\t\u00a1\4\u00a2\t\u00a2\4\u00a3\t\u00a3\4\u00a4"+
"\t\u00a4\4\u00a5\t\u00a5\4\u00a6\t\u00a6\4\u00a7\t\u00a7\4\u00a8\t\u00a8"+
- "\4\u00a9\t\u00a9\4\u00aa\t\u00aa\3\2\3\2\5\2\u0159\n\2\3\2\3\2\3\3\3\3"+
- "\3\3\3\3\5\3\u0161\n\3\3\3\5\3\u0164\n\3\3\3\5\3\u0167\n\3\3\3\3\3\3\3"+
- "\3\3\5\3\u016d\n\3\5\3\u016f\n\3\3\4\3\4\3\4\3\4\3\4\3\4\3\4\3\5\3\5\3"+
- "\5\3\5\3\5\3\5\3\5\3\5\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\7\3\7\3\7\3\7\3\7"+
- "\3\7\3\7\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\n\3"+
- "\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3\13"+
- "\3\13\3\13\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\r\3\r\3\r\3\r\3\r\3\r\3\r"+
- "\3\r\3\r\3\r\3\16\3\16\3\16\3\16\3\16\3\16\3\16\3\16\3\16\3\16\3\16\3"+
- "\16\3\17\3\17\3\17\3\17\3\17\3\17\3\17\3\20\3\20\3\20\3\20\3\20\3\20\3"+
- "\20\3\20\3\20\3\20\3\20\3\21\3\21\3\21\3\22\3\22\3\22\3\22\3\22\3\22\3"+
- "\23\3\23\3\23\3\23\3\23\3\23\3\23\3\23\3\23\3\24\3\24\3\24\3\24\3\24\3"+
- "\25\3\25\3\25\3\25\3\25\3\25\3\25\3\26\3\26\3\26\3\26\3\26\3\26\3\26\3"+
- "\27\3\27\3\27\3\27\3\27\3\27\3\30\3\30\3\30\3\30\3\30\3\31\3\31\3\31\3"+
- "\31\3\31\3\31\3\31\3\32\3\32\3\32\3\32\3\32\3\32\3\32\3\32\3\32\3\32\3"+
- "\33\3\33\3\33\3\33\3\33\3\33\3\34\3\34\3\34\3\35\3\35\3\36\3\36\3\36\3"+
- "\36\3\36\3\36\3\36\3\37\3\37\3\37\3\37\3\37\3\37\3 \3 \3 \3 \3 \3 \3 "+
- "\3 \3 \3 \3 \3 \3 \3!\3!\3!\3!\3!\3!\3!\3!\3!\3\"\3\"\3\"\3\"\3#\3#\3"+
- "#\3#\3$\3$\3$\3$\3$\3$\3%\3%\3&\3&\3&\3\'\3\'\3\'\3\'\3\'\3(\3(\3(\3("+
- "\3(\3(\3)\3)\3)\3)\3)\3)\3*\3*\3*\3*\3*\3*\3*\3+\3+\3+\3+\3+\3+\3+\3,"+
- "\3,\3,\3,\3,\3,\3,\3,\3,\3-\3-\3-\3-\3-\3-\3.\3.\3.\3.\3.\3.\3/\3/\3/"+
- "\3/\3/\3/\3/\3\60\3\60\3\60\3\60\3\60\3\60\3\61\3\61\3\61\3\61\3\61\3"+
- "\61\3\61\3\62\3\62\3\62\3\62\3\62\3\62\3\63\3\63\3\63\3\63\3\63\3\63\3"+
- "\63\3\63\3\63\3\64\3\64\3\64\3\64\3\64\3\64\3\64\3\64\3\65\3\65\3\65\3"+
- "\65\3\65\3\65\3\65\3\66\3\66\3\66\3\66\3\66\3\67\3\67\3\67\3\67\3\67\3"+
- "\67\3\67\3\67\3\67\38\38\38\38\38\38\38\38\38\38\38\38\38\38\38\39\39"+
- "\39\39\39\39\3:\3:\3:\3:\3;\3;\3;\3<\3<\3<\3<\3<\3<\3<\3=\3=\3=\3=\3="+
- "\3=\3=\3=\3=\3=\3>\3>\3>\3>\3>\3>\3>\3>\3>\3>\3?\3?\3?\3?\3?\3?\3?\3?"+
- "\3?\3?\3?\3?\3@\3@\3@\3@\3@\3@\3@\3@\3@\3A\3A\3A\3A\3A\3A\3A\3A\3A\3A"+
- "\3B\3B\3B\3B\3B\3B\3B\3B\3C\3C\3C\3C\3C\3C\3C\3C\3C\3C\3C\3C\3D\3D\3D"+
- "\3D\3D\3D\3D\3D\3D\3D\3D\3D\3D\3D\3D\3E\3E\3E\3E\3E\3E\3F\3F\3F\3F\3G"+
- "\3G\3G\3G\3H\3H\3H\3H\3H\3H\3H\3H\3I\3I\3I\3I\3I\3I\3I\3I\3J\3J\3J\3J"+
- "\3J\3K\3K\3K\3K\3K\3K\3K\3K\3K\3K\3L\3L\3L\3L\3L\3L\3L\3M\3M\3M\3M\3M"+
- "\3N\3N\3N\3N\3N\3N\3O\3O\3O\3P\3P\3P\3P\3Q\3Q\3Q\3Q\3Q\3Q\3Q\3R\3R\3R"+
- "\3R\3R\3S\3S\3S\3S\3S\3T\3T\3T\3T\3T\3U\3U\3U\3U\3U\3U\3U\3U\3V\3V\3V"+
- "\3V\3V\3V\3V\3W\3W\3W\3W\3W\3W\3X\3X\3X\3X\3X\3X\3X\3X\3X\3X\3X\3X\3X"+
- "\3X\3Y\3Y\3Y\3Z\3Z\3Z\3Z\3Z\3Z\3[\3[\3[\3[\3[\3\\\3\\\3\\\3\\\3\\\3\\"+
- "\3\\\3\\\3\\\3\\\3\\\3]\3]\3]\3]\3^\3^\3^\3^\3^\3^\3^\3_\3_\3_\3_\3_\3"+
- "_\3_\3_\3_\3`\3`\3`\3`\3a\3a\3a\3a\3a\3a\3b\3b\3b\7b\u0407\nb\fb\16b\u040a"+
- "\13b\3b\3b\3c\3c\3d\3d\3d\3d\3e\3e\3f\3f\3f\3f\3g\3g\3h\3h\3h\3h\3i\3"+
- "i\3j\3j\3k\3k\3l\3l\3m\3m\3n\3n\3n\3n\3n\3o\3o\3o\3o\3o\3p\3p\3p\3q\3"+
- "q\3q\3q\3r\3r\3r\3s\3s\3s\3t\3t\3t\3u\3u\3u\3v\3v\3w\3w\3w\3x\3x\3y\3"+
- "y\3y\3z\3z\3{\3{\3|\3|\3}\3}\3}\3~\3~\3~\3\177\3\177\3\177\3\u0080\3\u0080"+
- "\3\u0081\3\u0081\3\u0082\3\u0082\3\u0083\3\u0083\3\u0084\3\u0084\3\u0085"+
- "\3\u0085\3\u0086\3\u0086\3\u0086\3\u0087\3\u0087\3\u0087\5\u0087\u0472"+
- "\n\u0087\3\u0087\7\u0087\u0475\n\u0087\f\u0087\16\u0087\u0478\13\u0087"+
- "\5\u0087\u047a\n\u0087\3\u0087\3\u0087\3\u0088\3\u0088\3\u0088\5\u0088"+
- "\u0481\n\u0088\3\u0088\6\u0088\u0484\n\u0088\r\u0088\16\u0088\u0485\3"+
- "\u0088\3\u0088\3\u0089\3\u0089\5\u0089\u048c\n\u0089\3\u0089\5\u0089\u048f"+
- "\n\u0089\3\u0089\6\u0089\u0492\n\u0089\r\u0089\16\u0089\u0493\3\u0089"+
- "\3\u0089\3\u008a\3\u008a\3\u008a\5\u008a\u049b\n\u008a\3\u008a\6\u008a"+
- "\u049e\n\u008a\r\u008a\16\u008a\u049f\3\u008a\3\u008a\3\u008b\3\u008b"+
- "\3\u008b\3\u008b\3\u008b\3\u008c\5\u008c\u04aa\n\u008c\3\u008c\6\u008c"+
- "\u04ad\n\u008c\r\u008c\16\u008c\u04ae\3\u008c\3\u008c\5\u008c\u04b3\n"+
- "\u008c\3\u008c\7\u008c\u04b6\n\u008c\f\u008c\16\u008c\u04b9\13\u008c\5"+
- "\u008c\u04bb\n\u008c\3\u008c\3\u008c\3\u008c\5\u008c\u04c0\n\u008c\3\u008c"+
- "\7\u008c\u04c3\n\u008c\f\u008c\16\u008c\u04c6\13\u008c\5\u008c\u04c8\n"+
- "\u008c\3\u008d\3\u008d\3\u008d\3\u008d\3\u008e\3\u008e\3\u008e\3\u008e"+
- "\3\u008e\5\u008e\u04d3\n\u008e\3\u008e\3\u008e\3\u008e\3\u008e\3\u008f"+
- "\3\u008f\3\u008f\5\u008f\u04dc\n\u008f\3\u008f\3\u008f\3\u0090\3\u0090"+
- "\3\u0090\3\u0090\3\u0091\3\u0091\5\u0091\u04e6\n\u0091\3\u0092\3\u0092"+
- "\3\u0092\3\u0092\3\u0092\3\u0093\3\u0093\3\u0093\3\u0093\3\u0093\3\u0094"+
- "\3\u0094\3\u0094\3\u0094\3\u0094\3\u0094\3\u0094\3\u0095\3\u0095\3\u0095"+
- "\3\u0095\3\u0095\3\u0095\3\u0095\3\u0095\3\u0095\3\u0095\3\u0095\3\u0096"+
- "\3\u0096\7\u0096\u0506\n\u0096\f\u0096\16\u0096\u0509\13\u0096\3\u0096"+
- "\3\u0096\3\u0096\3\u0096\3\u0097\3\u0097\3\u0097\7\u0097\u0512\n\u0097"+
- "\f\u0097\16\u0097\u0515\13\u0097\3\u0097\3\u0097\3\u0097\3\u0097\3\u0098"+
- "\6\u0098\u051c\n\u0098\r\u0098\16\u0098\u051d\3\u0098\3\u0098\3\u0099"+
- "\3\u0099\3\u0099\3\u0099\7\u0099\u0526\n\u0099\f\u0099\16\u0099\u0529"+
- "\13\u0099\3\u0099\3\u0099\3\u0099\3\u0099\3\u0099\3\u009a\6\u009a\u0531"+
- "\n\u009a\r\u009a\16\u009a\u0532\3\u009a\3\u009a\3\u009b\3\u009b\3\u009b"+
- "\3\u009b\7\u009b\u053b\n\u009b\f\u009b\16\u009b\u053e\13\u009b\3\u009b"+
- "\3\u009b\3\u009c\3\u009c\3\u009c\3\u009c\5\u009c\u0546\n\u009c\3\u009d"+
- "\3\u009d\3\u009d\3\u009d\3\u009d\3\u009d\3\u009d\3\u009d\3\u009d\3\u009d"+
- "\3\u009d\3\u009d\3\u009d\3\u009d\3\u009d\3\u009d\3\u009d\3\u009d\3\u009d"+
- "\3\u009d\3\u009d\3\u009d\3\u009d\3\u009d\3\u009d\3\u009d\5\u009d\u0562"+
- "\n\u009d\3\u009e\3\u009e\5\u009e\u0566\n\u009e\3\u009e\7\u009e\u0569\n"+
- "\u009e\f\u009e\16\u009e\u056c\13\u009e\3\u009f\3\u009f\3\u00a0\3\u00a0"+
- "\3\u00a1\3\u00a1\3\u00a2\3\u00a2\5\u00a2\u0576\n\u00a2\3\u00a2\3\u00a2"+
- "\3\u00a3\3\u00a3\5\u00a3\u057c\n\u00a3\3\u00a4\3\u00a4\3\u00a5\3\u00a5"+
- "\3\u00a6\6\u00a6\u0583\n\u00a6\r\u00a6\16\u00a6\u0584\3\u00a6\3\u00a6"+
- "\3\u00a7\3\u00a7\3\u00a7\3\u00a7\7\u00a7\u058d\n\u00a7\f\u00a7\16\u00a7"+
- "\u0590\13\u00a7\3\u00a7\3\u00a7\3\u00a7\3\u00a7\3\u00a7\3\u00a8\3\u00a8"+
- "\3\u00a8\3\u00a8\7\u00a8\u059b\n\u00a8\f\u00a8\16\u00a8\u059e\13\u00a8"+
- "\3\u00a8\3\u00a8\3\u00a9\6\u00a9\u05a3\n\u00a9\r\u00a9\16\u00a9\u05a4"+
- "\3\u00a9\3\u00a9\3\u00a9\3\u00a9\3\u00a9\7\u00a9\u05ac\n\u00a9\f\u00a9"+
- "\16\u00a9\u05af\13\u00a9\3\u00a9\3\u00a9\3\u00a9\5\u00a9\u05b4\n\u00a9"+
- "\3\u00a9\3\u00a9\3\u00aa\3\u00aa\3\u00aa\3\u00aa\3\u00aa\5\u0527\u058e"+
- "\u05ad\2\u00ab\4\3\6\4\b\5\n\6\f\7\16\b\20\t\22\n\24\13\26\f\30\r\32\16"+
- "\34\17\36\20 \21\"\22$\23&\24(\25*\26,\27.\30\60\31\62\32\64\33\66\34"+
- "8\35:\36<\37> @!B\"D#F$H%J&L\'N(P)R*T+V,X-Z.\\/^\60`\61b\62d\63f\64h\65"+
- "j\66l\67n8p9r:t;v|?~@\u0080A\u0082B\u0084C\u0086D\u0088E\u008aF\u008c"+
- "G\u008eH\u0090I\u0092J\u0094K\u0096L\u0098M\u009aN\u009cO\u009eP\u00a0"+
- "Q\u00a2R\u00a4S\u00a6T\u00a8U\u00aaV\u00acW\u00aeX\u00b0Y\u00b2Z\u00b4"+
- "[\u00b6\\\u00b8]\u00ba^\u00bc_\u00be`\u00c0a\u00c2b\u00c4c\u00c6d\u00c8"+
- "e\u00caf\u00ccg\u00ceh\u00d0i\u00d2j\u00d4k\u00d6l\u00d8m\u00dan\u00dc"+
- "o\u00dep\u00e0q\u00e2r\u00e4s\u00e6t\u00e8u\u00eav\u00ecw\u00eex\u00f0"+
- "y\u00f2z\u00f4{\u00f6|\u00f8}\u00fa~\u00fc\177\u00fe\u0080\u0100\u0081"+
- "\u0102\u0082\u0104\u0083\u0106\u0084\u0108\u0085\u010a\u0086\u010c\u0087"+
- "\u010e\u0088\u0110\u0089\u0112\u008a\u0114\u008b\u0116\u008c\u0118\2\u011a"+
- "\2\u011c\u008d\u011e\2\u0120\u008e\u0122\u008f\u0124\u0090\u0126\u0091"+
- "\u0128\u0092\u012a\u0093\u012c\u0094\u012e\u0095\u0130\u0096\u0132\u0097"+
- "\u0134\u0098\u0136\u0099\u0138\2\u013a\2\u013c\2\u013e\2\u0140\2\u0142"+
- "\2\u0144\2\u0146\2\u0148\2\u014a\2\u014c\u009a\u014e\u009b\u0150\u009c"+
- "\u0152\u009d\u0154\u009e\4\2\3\23\3\2\63;\3\2\62;\4\2DDdd\4\2QQqq\4\2"+
- "ZZzz\4\2RRrr\4\2--//\3\2bb\4\2$$^^\4\2\13\13\"\"\4\2\f\f\17\17\5\2\f\f"+
- "\17\17))\13\2$$))^^cdhhppttvvxx\3\2\629\5\2\62;CHch\3\2\62\63\4\2GGgg"+
- "\49\2\62\2;\2\u0662\2\u066b\2\u06f2\2\u06fb\2\u07c2\2\u07cb\2\u0968\2"+
- "\u0971\2\u09e8\2\u09f1\2\u0a68\2\u0a71\2\u0ae8\2\u0af1\2\u0b68\2\u0b71"+
- "\2\u0be8\2\u0bf1\2\u0c68\2\u0c71\2\u0ce8\2\u0cf1\2\u0d68\2\u0d71\2\u0de8"+
- "\2\u0df1\2\u0e52\2\u0e5b\2\u0ed2\2\u0edb\2\u0f22\2\u0f2b\2\u1042\2\u104b"+
- "\2\u1092\2\u109b\2\u17e2\2\u17eb\2\u1812\2\u181b\2\u1948\2\u1951\2\u19d2"+
- "\2\u19db\2\u1a82\2\u1a8b\2\u1a92\2\u1a9b\2\u1b52\2\u1b5b\2\u1bb2\2\u1bbb"+
- "\2\u1c42\2\u1c4b\2\u1c52\2\u1c5b\2\ua622\2\ua62b\2\ua8d2\2\ua8db\2\ua902"+
- "\2\ua90b\2\ua9d2\2\ua9db\2\ua9f2\2\ua9fb\2\uaa52\2\uaa5b\2\uabf2\2\uabfb"+
- "\2\uff12\2\uff1b\2\u04a2\3\u04ab\3\u1068\3\u1071\3\u10f2\3\u10fb\3\u1138"+
- "\3\u1141\3\u11d2\3\u11db\3\u12f2\3\u12fb\3\u1452\3\u145b\3\u14d2\3\u14db"+
- "\3\u1652\3\u165b\3\u16c2\3\u16cb\3\u1732\3\u173b\3\u18e2\3\u18eb\3\u1c52"+
- "\3\u1c5b\3\u1d52\3\u1d5b\3\u6a62\3\u6a6b\3\u6b52\3\u6b5b\3\ud7d0\3\ud801"+
- "\3\ue952\3\ue95b\3\u024b\2C\2\\\2c\2|\2\u00ac\2\u00ac\2\u00b7\2\u00b7"+
- "\2\u00bc\2\u00bc\2\u00c2\2\u00d8\2\u00da\2\u00f8\2\u00fa\2\u02c3\2\u02c8"+
- "\2\u02d3\2\u02e2\2\u02e6\2\u02ee\2\u02ee\2\u02f0\2\u02f0\2\u0372\2\u0376"+
- "\2\u0378\2\u0379\2\u037c\2\u037f\2\u0381\2\u0381\2\u0388\2\u0388\2\u038a"+
- "\2\u038c\2\u038e\2\u038e\2\u0390\2\u03a3\2\u03a5\2\u03f7\2\u03f9\2\u0483"+
- "\2\u048c\2\u0531\2\u0533\2\u0558\2\u055b\2\u055b\2\u0563\2\u0589\2\u05d2"+
- "\2\u05ec\2\u05f2\2\u05f4\2\u0622\2\u064c\2\u0670\2\u0671\2\u0673\2\u06d5"+
- "\2\u06d7\2\u06d7\2\u06e7\2\u06e8\2\u06f0\2\u06f1\2\u06fc\2\u06fe\2\u0701"+
- "\2\u0701\2\u0712\2\u0712\2\u0714\2\u0731\2\u074f\2\u07a7\2\u07b3\2\u07b3"+
- "\2\u07cc\2\u07ec\2\u07f6\2\u07f7\2\u07fc\2\u07fc\2\u0802\2\u0817\2\u081c"+
- "\2\u081c\2\u0826\2\u0826\2\u082a\2\u082a\2\u0842\2\u085a\2\u0862\2\u086c"+
- "\2\u08a2\2\u08b6\2\u08b8\2\u08bf\2\u0906\2\u093b\2\u093f\2\u093f\2\u0952"+
- "\2\u0952\2\u095a\2\u0963\2\u0973\2\u0982\2\u0987\2\u098e\2\u0991\2\u0992"+
- "\2\u0995\2\u09aa\2\u09ac\2\u09b2\2\u09b4\2\u09b4\2\u09b8\2\u09bb\2\u09bf"+
- "\2\u09bf\2\u09d0\2\u09d0\2\u09de\2\u09df\2\u09e1\2\u09e3\2\u09f2\2\u09f3"+
- "\2\u09fe\2\u09fe\2\u0a07\2\u0a0c\2\u0a11\2\u0a12\2\u0a15\2\u0a2a\2\u0a2c"+
- "\2\u0a32\2\u0a34\2\u0a35\2\u0a37\2\u0a38\2\u0a3a\2\u0a3b\2\u0a5b\2\u0a5e"+
- "\2\u0a60\2\u0a60\2\u0a74\2\u0a76\2\u0a87\2\u0a8f\2\u0a91\2\u0a93\2\u0a95"+
- "\2\u0aaa\2\u0aac\2\u0ab2\2\u0ab4\2\u0ab5\2\u0ab7\2\u0abb\2\u0abf\2\u0abf"+
- "\2\u0ad2\2\u0ad2\2\u0ae2\2\u0ae3\2\u0afb\2\u0afb\2\u0b07\2\u0b0e\2\u0b11"+
- "\2\u0b12\2\u0b15\2\u0b2a\2\u0b2c\2\u0b32\2\u0b34\2\u0b35\2\u0b37\2\u0b3b"+
- "\2\u0b3f\2\u0b3f\2\u0b5e\2\u0b5f\2\u0b61\2\u0b63\2\u0b73\2\u0b73\2\u0b85"+
- "\2\u0b85\2\u0b87\2\u0b8c\2\u0b90\2\u0b92\2\u0b94\2\u0b97\2\u0b9b\2\u0b9c"+
- "\2\u0b9e\2\u0b9e\2\u0ba0\2\u0ba1\2\u0ba5\2\u0ba6\2\u0baa\2\u0bac\2\u0bb0"+
- "\2\u0bbb\2\u0bd2\2\u0bd2\2\u0c07\2\u0c0e\2\u0c10\2\u0c12\2\u0c14\2\u0c2a"+
- "\2\u0c2c\2\u0c3b\2\u0c3f\2\u0c3f\2\u0c5a\2\u0c5c\2\u0c62\2\u0c63\2\u0c82"+
- "\2\u0c82\2\u0c87\2\u0c8e\2\u0c90\2\u0c92\2\u0c94\2\u0caa\2\u0cac\2\u0cb5"+
- "\2\u0cb7\2\u0cbb\2\u0cbf\2\u0cbf\2\u0ce0\2\u0ce0\2\u0ce2\2\u0ce3\2\u0cf3"+
- "\2\u0cf4\2\u0d07\2\u0d0e\2\u0d10\2\u0d12\2\u0d14\2\u0d3c\2\u0d3f\2\u0d3f"+
- "\2\u0d50\2\u0d50\2\u0d56\2\u0d58\2\u0d61\2\u0d63\2\u0d7c\2\u0d81\2\u0d87"+
- "\2\u0d98\2\u0d9c\2\u0db3\2\u0db5\2\u0dbd\2\u0dbf\2\u0dbf\2\u0dc2\2\u0dc8"+
- "\2\u0e03\2\u0e32\2\u0e34\2\u0e35\2\u0e42\2\u0e48\2\u0e83\2\u0e84\2\u0e86"+
- "\2\u0e86\2\u0e89\2\u0e8a\2\u0e8c\2\u0e8c\2\u0e8f\2\u0e8f\2\u0e96\2\u0e99"+
- "\2\u0e9b\2\u0ea1\2\u0ea3\2\u0ea5\2\u0ea7\2\u0ea7\2\u0ea9\2\u0ea9\2\u0eac"+
- "\2\u0ead\2\u0eaf\2\u0eb2\2\u0eb4\2\u0eb5\2\u0ebf\2\u0ebf\2\u0ec2\2\u0ec6"+
- "\2\u0ec8\2\u0ec8\2\u0ede\2\u0ee1\2\u0f02\2\u0f02\2\u0f42\2\u0f49\2\u0f4b"+
- "\2\u0f6e\2\u0f8a\2\u0f8e\2\u1002\2\u102c\2\u1041\2\u1041\2\u1052\2\u1057"+
- "\2\u105c\2\u105f\2\u1063\2\u1063\2\u1067\2\u1068\2\u1070\2\u1072\2\u1077"+
- "\2\u1083\2\u1090\2\u1090\2\u10a2\2\u10c7\2\u10c9\2\u10c9\2\u10cf\2\u10cf"+
- "\2\u10d2\2\u10fc\2\u10fe\2\u124a\2\u124c\2\u124f\2\u1252\2\u1258\2\u125a"+
- "\2\u125a\2\u125c\2\u125f\2\u1262\2\u128a\2\u128c\2\u128f\2\u1292\2\u12b2"+
- "\2\u12b4\2\u12b7\2\u12ba\2\u12c0\2\u12c2\2\u12c2\2\u12c4\2\u12c7\2\u12ca"+
- "\2\u12d8\2\u12da\2\u1312\2\u1314\2\u1317\2\u131a\2\u135c\2\u1382\2\u1391"+
- "\2\u13a2\2\u13f7\2\u13fa\2\u13ff\2\u1403\2\u166e\2\u1671\2\u1681\2\u1683"+
- "\2\u169c\2\u16a2\2\u16ec\2\u16f3\2\u16fa\2\u1702\2\u170e\2\u1710\2\u1713"+
- "\2\u1722\2\u1733\2\u1742\2\u1753\2\u1762\2\u176e\2\u1770\2\u1772\2\u1782"+
- "\2\u17b5\2\u17d9\2\u17d9\2\u17de\2\u17de\2\u1822\2\u1879\2\u1882\2\u1886"+
- "\2\u1889\2\u18aa\2\u18ac\2\u18ac\2\u18b2\2\u18f7\2\u1902\2\u1920\2\u1952"+
- "\2\u196f\2\u1972\2\u1976\2\u1982\2\u19ad\2\u19b2\2\u19cb\2\u1a02\2\u1a18"+
- "\2\u1a22\2\u1a56\2\u1aa9\2\u1aa9\2\u1b07\2\u1b35\2\u1b47\2\u1b4d\2\u1b85"+
- "\2\u1ba2\2\u1bb0\2\u1bb1\2\u1bbc\2\u1be7\2\u1c02\2\u1c25\2\u1c4f\2\u1c51"+
- "\2\u1c5c\2\u1c7f\2\u1c82\2\u1c8a\2\u1ceb\2\u1cee\2\u1cf0\2\u1cf3\2\u1cf7"+
- "\2\u1cf8\2\u1d02\2\u1dc1\2\u1e02\2\u1f17\2\u1f1a\2\u1f1f\2\u1f22\2\u1f47"+
- "\2\u1f4a\2\u1f4f\2\u1f52\2\u1f59\2\u1f5b\2\u1f5b\2\u1f5d\2\u1f5d\2\u1f5f"+
- "\2\u1f5f\2\u1f61\2\u1f7f\2\u1f82\2\u1fb6\2\u1fb8\2\u1fbe\2\u1fc0\2\u1fc0"+
- "\2\u1fc4\2\u1fc6\2\u1fc8\2\u1fce\2\u1fd2\2\u1fd5\2\u1fd8\2\u1fdd\2\u1fe2"+
- "\2\u1fee\2\u1ff4\2\u1ff6\2\u1ff8\2\u1ffe\2\u2073\2\u2073\2\u2081\2\u2081"+
- "\2\u2092\2\u209e\2\u2104\2\u2104\2\u2109\2\u2109\2\u210c\2\u2115\2\u2117"+
- "\2\u2117\2\u211b\2\u211f\2\u2126\2\u2126\2\u2128\2\u2128\2\u212a\2\u212a"+
- "\2\u212c\2\u212f\2\u2131\2\u213b\2\u213e\2\u2141\2\u2147\2\u214b\2\u2150"+
- "\2\u2150\2\u2185\2\u2186\2\u2c02\2\u2c30\2\u2c32\2\u2c60\2\u2c62\2\u2ce6"+
- "\2\u2ced\2\u2cf0\2\u2cf4\2\u2cf5\2\u2d02\2\u2d27\2\u2d29\2\u2d29\2\u2d2f"+
- "\2\u2d2f\2\u2d32\2\u2d69\2\u2d71\2\u2d71\2\u2d82\2\u2d98\2\u2da2\2\u2da8"+
- "\2\u2daa\2\u2db0\2\u2db2\2\u2db8\2\u2dba\2\u2dc0\2\u2dc2\2\u2dc8\2\u2dca"+
- "\2\u2dd0\2\u2dd2\2\u2dd8\2\u2dda\2\u2de0\2\u2e31\2\u2e31\2\u3007\2\u3008"+
- "\2\u3033\2\u3037\2\u303d\2\u303e\2\u3043\2\u3098\2\u309f\2\u30a1\2\u30a3"+
- "\2\u30fc\2\u30fe\2\u3101\2\u3107\2\u3130\2\u3133\2\u3190\2\u31a2\2\u31bc"+
- "\2\u31f2\2\u3201\2\u3402\2\u4db7\2\u4e02\2\u9fec\2\ua002\2\ua48e\2\ua4d2"+
- "\2\ua4ff\2\ua502\2\ua60e\2\ua612\2\ua621\2\ua62c\2\ua62d\2\ua642\2\ua670"+
- "\2\ua681\2\ua69f\2\ua6a2\2\ua6e7\2\ua719\2\ua721\2\ua724\2\ua78a\2\ua78d"+
- "\2\ua7b0\2\ua7b2\2\ua7b9\2\ua7f9\2\ua803\2\ua805\2\ua807\2\ua809\2\ua80c"+
- "\2\ua80e\2\ua824\2\ua842\2\ua875\2\ua884\2\ua8b5\2\ua8f4\2\ua8f9\2\ua8fd"+
- "\2\ua8fd\2\ua8ff\2\ua8ff\2\ua90c\2\ua927\2\ua932\2\ua948\2\ua962\2\ua97e"+
- "\2\ua986\2\ua9b4\2\ua9d1\2\ua9d1\2\ua9e2\2\ua9e6\2\ua9e8\2\ua9f1\2\ua9fc"+
- "\2\uaa00\2\uaa02\2\uaa2a\2\uaa42\2\uaa44\2\uaa46\2\uaa4d\2\uaa62\2\uaa78"+
- "\2\uaa7c\2\uaa7c\2\uaa80\2\uaab1\2\uaab3\2\uaab3\2\uaab7\2\uaab8\2\uaabb"+
- "\2\uaabf\2\uaac2\2\uaac2\2\uaac4\2\uaac4\2\uaadd\2\uaadf\2\uaae2\2\uaaec"+
- "\2\uaaf4\2\uaaf6\2\uab03\2\uab08\2\uab0b\2\uab10\2\uab13\2\uab18\2\uab22"+
- "\2\uab28\2\uab2a\2\uab30\2\uab32\2\uab5c\2\uab5e\2\uab67\2\uab72\2\uabe4"+
- "\2\uac02\2\ud7a5\2\ud7b2\2\ud7c8\2\ud7cd\2\ud7fd\2\uf902\2\ufa6f\2\ufa72"+
- "\2\ufadb\2\ufb02\2\ufb08\2\ufb15\2\ufb19\2\ufb1f\2\ufb1f\2\ufb21\2\ufb2a"+
- "\2\ufb2c\2\ufb38\2\ufb3a\2\ufb3e\2\ufb40\2\ufb40\2\ufb42\2\ufb43\2\ufb45"+
- "\2\ufb46\2\ufb48\2\ufbb3\2\ufbd5\2\ufd3f\2\ufd52\2\ufd91\2\ufd94\2\ufdc9"+
- "\2\ufdf2\2\ufdfd\2\ufe72\2\ufe76\2\ufe78\2\ufefe\2\uff23\2\uff3c\2\uff43"+
- "\2\uff5c\2\uff68\2\uffc0\2\uffc4\2\uffc9\2\uffcc\2\uffd1\2\uffd4\2\uffd9"+
- "\2\uffdc\2\uffde\2\2\3\r\3\17\3(\3*\3<\3>\3?\3A\3O\3R\3_\3\u0082\3\u00fc"+
- "\3\u0282\3\u029e\3\u02a2\3\u02d2\3\u0302\3\u0321\3\u032f\3\u0342\3\u0344"+
- "\3\u034b\3\u0352\3\u0377\3\u0382\3\u039f\3\u03a2\3\u03c5\3\u03ca\3\u03d1"+
- "\3\u0402\3\u049f\3\u04b2\3\u04d5\3\u04da\3\u04fd\3\u0502\3\u0529\3\u0532"+
- "\3\u0565\3\u0602\3\u0738\3\u0742\3\u0757\3\u0762\3\u0769\3\u0802\3\u0807"+
- "\3\u080a\3\u080a\3\u080c\3\u0837\3\u0839\3\u083a\3\u083e\3\u083e\3\u0841"+
- "\3\u0857\3\u0862\3\u0878\3\u0882\3\u08a0\3\u08e2\3\u08f4\3\u08f6\3\u08f7"+
- "\3\u0902\3\u0917\3\u0922\3\u093b\3\u0982\3\u09b9\3\u09c0\3\u09c1\3\u0a02"+
- "\3\u0a02\3\u0a12\3\u0a15\3\u0a17\3\u0a19\3\u0a1b\3\u0a35\3\u0a62\3\u0a7e"+
- "\3\u0a82\3\u0a9e\3\u0ac2\3\u0ac9\3\u0acb\3\u0ae6\3\u0b02\3\u0b37\3\u0b42"+
- "\3\u0b57\3\u0b62\3\u0b74\3\u0b82\3\u0b93\3\u0c02\3\u0c4a\3\u0c82\3\u0cb4"+
- "\3\u0cc2\3\u0cf4\3\u1005\3\u1039\3\u1085\3\u10b1\3\u10d2\3\u10ea\3\u1105"+
- "\3\u1128\3\u1152\3\u1174\3\u1178\3\u1178\3\u1185\3\u11b4\3\u11c3\3\u11c6"+
- "\3\u11dc\3\u11dc\3\u11de\3\u11de\3\u1202\3\u1213\3\u1215\3\u122d\3\u1282"+
- "\3\u1288\3\u128a\3\u128a\3\u128c\3\u128f\3\u1291\3\u129f\3\u12a1\3\u12aa"+
- "\3\u12b2\3\u12e0\3\u1307\3\u130e\3\u1311\3\u1312\3\u1315\3\u132a\3\u132c"+
- "\3\u1332\3\u1334\3\u1335\3\u1337\3\u133b\3\u133f\3\u133f\3\u1352\3\u1352"+
- "\3\u135f\3\u1363\3\u1402\3\u1436\3\u1449\3\u144c\3\u1482\3\u14b1\3\u14c6"+
- "\3\u14c7\3\u14c9\3\u14c9\3\u1582\3\u15b0\3\u15da\3\u15dd\3\u1602\3\u1631"+
- "\3\u1646\3\u1646\3\u1682\3\u16ac\3\u1702\3\u171b\3\u18a2\3\u18e1\3\u1901"+
- "\3\u1901\3\u1a02\3\u1a02\3\u1a0d\3\u1a34\3\u1a3c\3\u1a3c\3\u1a52\3\u1a52"+
- "\3\u1a5e\3\u1a85\3\u1a88\3\u1a8b\3\u1ac2\3\u1afa\3\u1c02\3\u1c0a\3\u1c0c"+
- "\3\u1c30\3\u1c42\3\u1c42\3\u1c74\3\u1c91\3\u1d02\3\u1d08\3\u1d0a\3\u1d0b"+
- "\3\u1d0d\3\u1d32\3\u1d48\3\u1d48\3\u2002\3\u239b\3\u2482\3\u2545\3\u3002"+
- "\3\u3430\3\u4402\3\u4648\3\u6802\3\u6a3a\3\u6a42\3\u6a60\3\u6ad2\3\u6aef"+
- "\3\u6b02\3\u6b31\3\u6b42\3\u6b45\3\u6b65\3\u6b79\3\u6b7f\3\u6b91\3\u6f02"+
- "\3\u6f46\3\u6f52\3\u6f52\3\u6f95\3\u6fa1\3\u6fe2\3\u6fe3\3\u7002\3\u87ee"+
- "\3\u8802\3\u8af4\3\ub002\3\ub120\3\ub172\3\ub2fd\3\ubc02\3\ubc6c\3\ubc72"+
- "\3\ubc7e\3\ubc82\3\ubc8a\3\ubc92\3\ubc9b\3\ud402\3\ud456\3\ud458\3\ud49e"+
- "\3\ud4a0\3\ud4a1\3\ud4a4\3\ud4a4\3\ud4a7\3\ud4a8\3\ud4ab\3\ud4ae\3\ud4b0"+
- "\3\ud4bb\3\ud4bd\3\ud4bd\3\ud4bf\3\ud4c5\3\ud4c7\3\ud507\3\ud509\3\ud50c"+
- "\3\ud50f\3\ud516\3\ud518\3\ud51e\3\ud520\3\ud53b\3\ud53d\3\ud540\3\ud542"+
- "\3\ud546\3\ud548\3\ud548\3\ud54c\3\ud552\3\ud554\3\ud6a7\3\ud6aa\3\ud6c2"+
- "\3\ud6c4\3\ud6dc\3\ud6de\3\ud6fc\3\ud6fe\3\ud716\3\ud718\3\ud736\3\ud738"+
- "\3\ud750\3\ud752\3\ud770\3\ud772\3\ud78a\3\ud78c\3\ud7aa\3\ud7ac\3\ud7c4"+
- "\3\ud7c6\3\ud7cd\3\ue802\3\ue8c6\3\ue902\3\ue945\3\uee02\3\uee05\3\uee07"+
- "\3\uee21\3\uee23\3\uee24\3\uee26\3\uee26\3\uee29\3\uee29\3\uee2b\3\uee34"+
- "\3\uee36\3\uee39\3\uee3b\3\uee3b\3\uee3d\3\uee3d\3\uee44\3\uee44\3\uee49"+
- "\3\uee49\3\uee4b\3\uee4b\3\uee4d\3\uee4d\3\uee4f\3\uee51\3\uee53\3\uee54"+
- "\3\uee56\3\uee56\3\uee59\3\uee59\3\uee5b\3\uee5b\3\uee5d\3\uee5d\3\uee5f"+
- "\3\uee5f\3\uee61\3\uee61\3\uee63\3\uee64\3\uee66\3\uee66\3\uee69\3\uee6c"+
- "\3\uee6e\3\uee74\3\uee76\3\uee79\3\uee7b\3\uee7e\3\uee80\3\uee80\3\uee82"+
- "\3\uee8b\3\uee8d\3\uee9d\3\ueea3\3\ueea5\3\ueea7\3\ueeab\3\ueead\3\ueebd"+
- "\3\2\4\ua6d8\4\ua702\4\ub736\4\ub742\4\ub81f\4\ub822\4\ucea3\4\uceb2\4"+
- "\uebe2\4\uf802\4\ufa1f\4\u05e7\2\4\3\2\2\2\2\6\3\2\2\2\2\b\3\2\2\2\2\n"+
- "\3\2\2\2\2\f\3\2\2\2\2\16\3\2\2\2\2\20\3\2\2\2\2\22\3\2\2\2\2\24\3\2\2"+
- "\2\2\26\3\2\2\2\2\30\3\2\2\2\2\32\3\2\2\2\2\34\3\2\2\2\2\36\3\2\2\2\2"+
- " \3\2\2\2\2\"\3\2\2\2\2$\3\2\2\2\2&\3\2\2\2\2(\3\2\2\2\2*\3\2\2\2\2,\3"+
- "\2\2\2\2.\3\2\2\2\2\60\3\2\2\2\2\62\3\2\2\2\2\64\3\2\2\2\2\66\3\2\2\2"+
- "\28\3\2\2\2\2:\3\2\2\2\2<\3\2\2\2\2>\3\2\2\2\2@\3\2\2\2\2B\3\2\2\2\2D"+
- "\3\2\2\2\2F\3\2\2\2\2H\3\2\2\2\2J\3\2\2\2\2L\3\2\2\2\2N\3\2\2\2\2P\3\2"+
- "\2\2\2R\3\2\2\2\2T\3\2\2\2\2V\3\2\2\2\2X\3\2\2\2\2Z\3\2\2\2\2\\\3\2\2"+
- "\2\2^\3\2\2\2\2`\3\2\2\2\2b\3\2\2\2\2d\3\2\2\2\2f\3\2\2\2\2h\3\2\2\2\2"+
- "j\3\2\2\2\2l\3\2\2\2\2n\3\2\2\2\2p\3\2\2\2\2r\3\2\2\2\2t\3\2\2\2\2v\3"+
- "\2\2\2\2x\3\2\2\2\2z\3\2\2\2\2|\3\2\2\2\2~\3\2\2\2\2\u0080\3\2\2\2\2\u0082"+
- "\3\2\2\2\2\u0084\3\2\2\2\2\u0086\3\2\2\2\2\u0088\3\2\2\2\2\u008a\3\2\2"+
- "\2\2\u008c\3\2\2\2\2\u008e\3\2\2\2\2\u0090\3\2\2\2\2\u0092\3\2\2\2\2\u0094"+
- "\3\2\2\2\2\u0096\3\2\2\2\2\u0098\3\2\2\2\2\u009a\3\2\2\2\2\u009c\3\2\2"+
- "\2\2\u009e\3\2\2\2\2\u00a0\3\2\2\2\2\u00a2\3\2\2\2\2\u00a4\3\2\2\2\2\u00a6"+
- "\3\2\2\2\2\u00a8\3\2\2\2\2\u00aa\3\2\2\2\2\u00ac\3\2\2\2\2\u00ae\3\2\2"+
- "\2\2\u00b0\3\2\2\2\2\u00b2\3\2\2\2\2\u00b4\3\2\2\2\2\u00b6\3\2\2\2\2\u00b8"+
- "\3\2\2\2\2\u00ba\3\2\2\2\2\u00bc\3\2\2\2\2\u00be\3\2\2\2\2\u00c0\3\2\2"+
- "\2\2\u00c2\3\2\2\2\2\u00c4\3\2\2\2\2\u00c6\3\2\2\2\2\u00c8\3\2\2\2\2\u00ca"+
- "\3\2\2\2\2\u00cc\3\2\2\2\2\u00ce\3\2\2\2\2\u00d0\3\2\2\2\2\u00d2\3\2\2"+
- "\2\2\u00d4\3\2\2\2\2\u00d6\3\2\2\2\2\u00d8\3\2\2\2\2\u00da\3\2\2\2\2\u00dc"+
- "\3\2\2\2\2\u00de\3\2\2\2\2\u00e0\3\2\2\2\2\u00e2\3\2\2\2\2\u00e4\3\2\2"+
- "\2\2\u00e6\3\2\2\2\2\u00e8\3\2\2\2\2\u00ea\3\2\2\2\2\u00ec\3\2\2\2\2\u00ee"+
- "\3\2\2\2\2\u00f0\3\2\2\2\2\u00f2\3\2\2\2\2\u00f4\3\2\2\2\2\u00f6\3\2\2"+
- "\2\2\u00f8\3\2\2\2\2\u00fa\3\2\2\2\2\u00fc\3\2\2\2\2\u00fe\3\2\2\2\2\u0100"+
- "\3\2\2\2\2\u0102\3\2\2\2\2\u0104\3\2\2\2\2\u0106\3\2\2\2\2\u0108\3\2\2"+
- "\2\2\u010a\3\2\2\2\2\u010c\3\2\2\2\2\u010e\3\2\2\2\2\u0110\3\2\2\2\2\u0112"+
- "\3\2\2\2\2\u0114\3\2\2\2\2\u0116\3\2\2\2\2\u011c\3\2\2\2\2\u0120\3\2\2"+
- "\2\2\u0122\3\2\2\2\2\u0124\3\2\2\2\2\u0126\3\2\2\2\2\u0128\3\2\2\2\2\u012a"+
- "\3\2\2\2\2\u012c\3\2\2\2\2\u012e\3\2\2\2\2\u0130\3\2\2\2\2\u0132\3\2\2"+
- "\2\2\u0134\3\2\2\2\2\u0136\3\2\2\2\3\u014c\3\2\2\2\3\u014e\3\2\2\2\3\u0150"+
- "\3\2\2\2\3\u0152\3\2\2\2\3\u0154\3\2\2\2\4\u0158\3\2\2\2\6\u016e\3\2\2"+
- "\2\b\u0170\3\2\2\2\n\u0177\3\2\2\2\f\u017f\3\2\2\2\16\u0186\3\2\2\2\20"+
- "\u018d\3\2\2\2\22\u0194\3\2\2\2\24\u019b\3\2\2\2\26\u01a4\3\2\2\2\30\u01ae"+
- "\3\2\2\2\32\u01b6\3\2\2\2\34\u01c0\3\2\2\2\36\u01cc\3\2\2\2 \u01d3\3\2"+
- "\2\2\"\u01de\3\2\2\2$\u01e1\3\2\2\2&\u01e7\3\2\2\2(\u01f0\3\2\2\2*\u01f5"+
- "\3\2\2\2,\u01fc\3\2\2\2.\u0203\3\2\2\2\60\u0209\3\2\2\2\62\u020e\3\2\2"+
- "\2\64\u0215\3\2\2\2\66\u021f\3\2\2\28\u0225\3\2\2\2:\u0228\3\2\2\2<\u022a"+
- "\3\2\2\2>\u0231\3\2\2\2@\u0237\3\2\2\2B\u0244\3\2\2\2D\u024d\3\2\2\2F"+
- "\u0251\3\2\2\2H\u0255\3\2\2\2J\u025b\3\2\2\2L\u025d\3\2\2\2N\u0260\3\2"+
- "\2\2P\u0265\3\2\2\2R\u026b\3\2\2\2T\u0271\3\2\2\2V\u0278\3\2\2\2X\u027f"+
- "\3\2\2\2Z\u0288\3\2\2\2\\\u028e\3\2\2\2^\u0294\3\2\2\2`\u029b\3\2\2\2"+
- "b\u02a1\3\2\2\2d\u02a8\3\2\2\2f\u02ae\3\2\2\2h\u02b7\3\2\2\2j\u02bf\3"+
- "\2\2\2l\u02c6\3\2\2\2n\u02cb\3\2\2\2p\u02d4\3\2\2\2r\u02e3\3\2\2\2t\u02e9"+
- "\3\2\2\2v\u02ed\3\2\2\2x\u02f0\3\2\2\2z\u02f7\3\2\2\2|\u0301\3\2\2\2~"+
- "\u030b\3\2\2\2\u0080\u0317\3\2\2\2\u0082\u0320\3\2\2\2\u0084\u032a\3\2"+
- "\2\2\u0086\u0332\3\2\2\2\u0088\u033e\3\2\2\2\u008a\u034d\3\2\2\2\u008c"+
- "\u0353\3\2\2\2\u008e\u0357\3\2\2\2\u0090\u035b\3\2\2\2\u0092\u0363\3\2"+
- "\2\2\u0094\u036b\3\2\2\2\u0096\u0370\3\2\2\2\u0098\u037a\3\2\2\2\u009a"+
- "\u0381\3\2\2\2\u009c\u0386\3\2\2\2\u009e\u038c\3\2\2\2\u00a0\u038f\3\2"+
- "\2\2\u00a2\u0393\3\2\2\2\u00a4\u039a\3\2\2\2\u00a6\u039f\3\2\2\2\u00a8"+
- "\u03a4\3\2\2\2\u00aa\u03a9\3\2\2\2\u00ac\u03b1\3\2\2\2\u00ae\u03b8\3\2"+
- "\2\2\u00b0\u03be\3\2\2\2\u00b2\u03cc\3\2\2\2\u00b4\u03cf\3\2\2\2\u00b6"+
- "\u03d5\3\2\2\2\u00b8\u03da\3\2\2\2\u00ba\u03e5\3\2\2\2\u00bc\u03e9\3\2"+
- "\2\2\u00be\u03f0\3\2\2\2\u00c0\u03f9\3\2\2\2\u00c2\u03fd\3\2\2\2\u00c4"+
- "\u0403\3\2\2\2\u00c6\u040d\3\2\2\2\u00c8\u040f\3\2\2\2\u00ca\u0413\3\2"+
- "\2\2\u00cc\u0415\3\2\2\2\u00ce\u0419\3\2\2\2\u00d0\u041b\3\2\2\2\u00d2"+
- "\u041f\3\2\2\2\u00d4\u0421\3\2\2\2\u00d6\u0423\3\2\2\2\u00d8\u0425\3\2"+
- "\2\2\u00da\u0427\3\2\2\2\u00dc\u0429\3\2\2\2\u00de\u042e\3\2\2\2\u00e0"+
- "\u0433\3\2\2\2\u00e2\u0436\3\2\2\2\u00e4\u043a\3\2\2\2\u00e6\u043d\3\2"+
- "\2\2\u00e8\u0440\3\2\2\2\u00ea\u0443\3\2\2\2\u00ec\u0446\3\2\2\2\u00ee"+
- "\u0448\3\2\2\2\u00f0\u044b\3\2\2\2\u00f2\u044d\3\2\2\2\u00f4\u0450\3\2"+
- "\2\2\u00f6\u0452\3\2\2\2\u00f8\u0454\3\2\2\2\u00fa\u0456\3\2\2\2\u00fc"+
- "\u0459\3\2\2\2\u00fe\u045c\3\2\2\2\u0100\u045f\3\2\2\2\u0102\u0461\3\2"+
- "\2\2\u0104\u0463\3\2\2\2\u0106\u0465\3\2\2\2\u0108\u0467\3\2\2\2\u010a"+
- "\u0469\3\2\2\2\u010c\u046b\3\2\2\2\u010e\u0479\3\2\2\2\u0110\u047d\3\2"+
- "\2\2\u0112\u0489\3\2\2\2\u0114\u0497\3\2\2\2\u0116\u04a3\3\2\2\2\u0118"+
- "\u04c7\3\2\2\2\u011a\u04c9\3\2\2\2\u011c\u04d2\3\2\2\2\u011e\u04d8\3\2"+
- "\2\2\u0120\u04df\3\2\2\2\u0122\u04e5\3\2\2\2\u0124\u04e7\3\2\2\2\u0126"+
- "\u04ec\3\2\2\2\u0128\u04f1\3\2\2\2\u012a\u04f8\3\2\2\2\u012c\u0503\3\2"+
- "\2\2\u012e\u050e\3\2\2\2\u0130\u051b\3\2\2\2\u0132\u0521\3\2\2\2\u0134"+
- "\u0530\3\2\2\2\u0136\u0536\3\2\2\2\u0138\u0545\3\2\2\2\u013a\u0547\3\2"+
- "\2\2\u013c\u0563\3\2\2\2\u013e\u056d\3\2\2\2\u0140\u056f\3\2\2\2\u0142"+
- "\u0571\3\2\2\2\u0144\u0573\3\2\2\2\u0146\u057b\3\2\2\2\u0148\u057d\3\2"+
- "\2\2\u014a\u057f\3\2\2\2\u014c\u0582\3\2\2\2\u014e\u0588\3\2\2\2\u0150"+
- "\u0596\3\2\2\2\u0152\u05b3\3\2\2\2\u0154\u05b7\3\2\2\2\u0156\u0159\5\6"+
- "\3\2\u0157\u0159\5\u0116\u008b\2\u0158\u0156\3\2\2\2\u0158\u0157\3\2\2"+
- "\2\u0159\u015a\3\2\2\2\u015a\u015b\b\2\2\2\u015b\5\3\2\2\2\u015c\u0166"+
- "\5\u013c\u009e\2\u015d\u015e\7\60\2\2\u015e\u0160\6\3\2\2\u015f\u0161"+
- "\5\u013c\u009e\2\u0160\u015f\3\2\2\2\u0160\u0161\3\2\2\2\u0161\u0163\3"+
- "\2\2\2\u0162\u0164\5\u0144\u00a2\2\u0163\u0162\3\2\2\2\u0163\u0164\3\2"+
- "\2\2\u0164\u0167\3\2\2\2\u0165\u0167\5\u0144\u00a2\2\u0166\u015d\3\2\2"+
- "\2\u0166\u0165\3\2\2\2\u0167\u016f\3\2\2\2\u0168\u0169\7\60\2\2\u0169"+
- "\u016a\6\3\3\2\u016a\u016c\5\u013c\u009e\2\u016b\u016d\5\u0144\u00a2\2"+
- "\u016c\u016b\3\2\2\2\u016c\u016d\3\2\2\2\u016d\u016f\3\2\2\2\u016e\u015c"+
- "\3\2\2\2\u016e\u0168\3\2\2\2\u016f\7\3\2\2\2\u0170\u0171\7v\2\2\u0171"+
- "\u0172\7t\2\2\u0172\u0173\7w\2\2\u0173\u0174\7g\2\2\u0174\u0175\3\2\2"+
- "\2\u0175\u0176\b\4\2\2\u0176\t\3\2\2\2\u0177\u0178\7h\2\2\u0178\u0179"+
- "\7c\2\2\u0179\u017a\7n\2\2\u017a\u017b\7u\2\2\u017b\u017c\7g\2\2\u017c"+
- "\u017d\3\2\2\2\u017d\u017e\b\5\2\2\u017e\13\3\2\2\2\u017f\u0180\7c\2\2"+
- "\u0180\u0181\7u\2\2\u0181\u0182\7u\2\2\u0182\u0183\7g\2\2\u0183\u0184"+
- "\7t\2\2\u0184\u0185\7v\2\2\u0185\r\3\2\2\2\u0186\u0187\7c\2\2\u0187\u0188"+
- "\7u\2\2\u0188\u0189\7u\2\2\u0189\u018a\7w\2\2\u018a\u018b\7o\2\2\u018b"+
- "\u018c\7g\2\2\u018c\17\3\2\2\2\u018d\u018e\7k\2\2\u018e\u018f\7p\2\2\u018f"+
- "\u0190\7j\2\2\u0190\u0191\7c\2\2\u0191\u0192\7n\2\2\u0192\u0193\7g\2\2"+
- "\u0193\21\3\2\2\2\u0194\u0195\7g\2\2\u0195\u0196\7z\2\2\u0196\u0197\7"+
- "j\2\2\u0197\u0198\7c\2\2\u0198\u0199\7n\2\2\u0199\u019a\7g\2\2\u019a\23"+
- "\3\2\2\2\u019b\u019c\7t\2\2\u019c\u019d\7g\2\2\u019d\u019e\7s\2\2\u019e"+
- "\u019f\7w\2\2\u019f\u01a0\7k\2\2\u01a0\u01a1\7t\2\2\u01a1\u01a2\7g\2\2"+
- "\u01a2\u01a3\7u\2\2\u01a3\25\3\2\2\2\u01a4\u01a5\7r\2\2\u01a5\u01a6\7"+
- "t\2\2\u01a6\u01a7\7g\2\2\u01a7\u01a8\7u\2\2\u01a8\u01a9\7g\2\2\u01a9\u01aa"+
- "\7t\2\2\u01aa\u01ab\7x\2\2\u01ab\u01ac\7g\2\2\u01ac\u01ad\7u\2\2\u01ad"+
- "\27\3\2\2\2\u01ae\u01af\7g\2\2\u01af\u01b0\7p\2\2\u01b0\u01b1\7u\2\2\u01b1"+
- "\u01b2\7w\2\2\u01b2\u01b3\7t\2\2\u01b3\u01b4\7g\2\2\u01b4\u01b5\7u\2\2"+
- "\u01b5\31\3\2\2\2\u01b6\u01b7\7k\2\2\u01b7\u01b8\7p\2\2\u01b8\u01b9\7"+
- "x\2\2\u01b9\u01ba\7c\2\2\u01ba\u01bb\7t\2\2\u01bb\u01bc\7k\2\2\u01bc\u01bd"+
- "\7c\2\2\u01bd\u01be\7p\2\2\u01be\u01bf\7v\2\2\u01bf\33\3\2\2\2\u01c0\u01c1"+
- "\7f\2\2\u01c1\u01c2\7g\2\2\u01c2\u01c3\7e\2\2\u01c3\u01c4\7t\2\2\u01c4"+
- "\u01c5\7g\2\2\u01c5\u01c6\7c\2\2\u01c6\u01c7\7u\2\2\u01c7\u01c8\7g\2\2"+
- "\u01c8\u01c9\7u\2\2\u01c9\u01ca\3\2\2\2\u01ca\u01cb\b\16\2\2\u01cb\35"+
- "\3\2\2\2\u01cc\u01cd\7r\2\2\u01cd\u01ce\7w\2\2\u01ce\u01cf\7t\2\2\u01cf"+
- "\u01d0\7g\2\2\u01d0\u01d1\3\2\2\2\u01d1\u01d2\b\17\2\2\u01d2\37\3\2\2"+
- "\2\u01d3\u01d4\7k\2\2\u01d4\u01d5\7o\2\2\u01d5\u01d6\7r\2\2\u01d6\u01d7"+
- "\7n\2\2\u01d7\u01d8\7g\2\2\u01d8\u01d9\7o\2\2\u01d9\u01da\7g\2\2\u01da"+
- "\u01db\7p\2\2\u01db\u01dc\7v\2\2\u01dc\u01dd\7u\2\2\u01dd!\3\2\2\2\u01de"+
- "\u01df\7c\2\2\u01df\u01e0\7u\2\2\u01e0#\3\2\2\2\u01e1\u01e2\7q\2\2\u01e2"+
- "\u01e3\7n\2\2\u01e3\u01e4\7f\2\2\u01e4\u01e5\3\2\2\2\u01e5\u01e6\b\22"+
- "\2\2\u01e6%\3\2\2\2\u01e7\u01e8\7d\2\2\u01e8\u01e9\7g\2\2\u01e9\u01ea"+
- "\7h\2\2\u01ea\u01eb\7q\2\2\u01eb\u01ec\7t\2\2\u01ec\u01ed\7g\2\2\u01ed"+
- "\u01ee\3\2\2\2\u01ee\u01ef\b\23\2\2\u01ef\'\3\2\2\2\u01f0\u01f1\7%\2\2"+
- "\u01f1\u01f2\7n\2\2\u01f2\u01f3\7j\2\2\u01f3\u01f4\7u\2\2\u01f4)\3\2\2"+
- "\2\u01f5\u01f6\7h\2\2\u01f6\u01f7\7q\2\2\u01f7\u01f8\7t\2\2\u01f8\u01f9"+
- "\7c\2\2\u01f9\u01fa\7n\2\2\u01fa\u01fb\7n\2\2\u01fb+\3\2\2\2\u01fc\u01fd"+
- "\7g\2\2\u01fd\u01fe\7z\2\2\u01fe\u01ff\7k\2\2\u01ff\u0200\7u\2\2\u0200"+
- "\u0201\7v\2\2\u0201\u0202\7u\2\2\u0202-\3\2\2\2\u0203\u0204\7c\2\2\u0204"+
- "\u0205\7e\2\2\u0205\u0206\7e\2\2\u0206\u0207\3\2\2\2\u0207\u0208\b\27"+
- "\2\2\u0208/\3\2\2\2\u0209\u020a\7h\2\2\u020a\u020b\7q\2\2\u020b\u020c"+
- "\7n\2\2\u020c\u020d\7f\2\2\u020d\61\3\2\2\2\u020e\u020f\7w\2\2\u020f\u0210"+
- "\7p\2\2\u0210\u0211\7h\2\2\u0211\u0212\7q\2\2\u0212\u0213\7n\2\2\u0213"+
- "\u0214\7f\2\2\u0214\63\3\2\2\2\u0215\u0216\7w\2\2\u0216\u0217\7p\2\2\u0217"+
- "\u0218\7h\2\2\u0218\u0219\7q\2\2\u0219\u021a\7n\2\2\u021a\u021b\7f\2\2"+
- "\u021b\u021c\7k\2\2\u021c\u021d\7p\2\2\u021d\u021e\7i\2\2\u021e\65\3\2"+
- "\2\2\u021f\u0220\7i\2\2\u0220\u0221\7j\2\2\u0221\u0222\7q\2\2\u0222\u0223"+
- "\7u\2\2\u0223\u0224\7v\2\2\u0224\67\3\2\2\2\u0225\u0226\7k\2\2\u0226\u0227"+
- "\7p\2\2\u02279\3\2\2\2\u0228\u0229\7%\2\2\u0229;\3\2\2\2\u022a\u022b\7"+
- "u\2\2\u022b\u022c\7w\2\2\u022c\u022d\7d\2\2\u022d\u022e\7u\2\2\u022e\u022f"+
- "\7g\2\2\u022f\u0230\7v\2\2\u0230=\3\2\2\2\u0231\u0232\7w\2\2\u0232\u0233"+
- "\7p\2\2\u0233\u0234\7k\2\2\u0234\u0235\7q\2\2\u0235\u0236\7p\2\2\u0236"+
- "?\3\2\2\2\u0237\u0238\7k\2\2\u0238\u0239\7p\2\2\u0239\u023a\7v\2\2\u023a"+
- "\u023b\7g\2\2\u023b\u023c\7t\2\2\u023c\u023d\7u\2\2\u023d\u023e\7g\2\2"+
- "\u023e\u023f\7e\2\2\u023f\u0240\7v\2\2\u0240\u0241\7k\2\2\u0241\u0242"+
- "\7q\2\2\u0242\u0243\7p\2\2\u0243A\3\2\2\2\u0244\u0245\7u\2\2\u0245\u0246"+
- "\7g\2\2\u0246\u0247\7v\2\2\u0247\u0248\7o\2\2\u0248\u0249\7k\2\2\u0249"+
- "\u024a\7p\2\2\u024a\u024b\7w\2\2\u024b\u024c\7u\2\2\u024cC\3\2\2\2\u024d"+
- "\u024e\7?\2\2\u024e\u024f\7?\2\2\u024f\u0250\7@\2\2\u0250E\3\2\2\2\u0251"+
- "\u0252\7/\2\2\u0252\u0253\7/\2\2\u0253\u0254\7,\2\2\u0254G\3\2\2\2\u0255"+
- "\u0256\7c\2\2\u0256\u0257\7r\2\2\u0257\u0258\7r\2\2\u0258\u0259\7n\2\2"+
- "\u0259\u025a\7{\2\2\u025aI\3\2\2\2\u025b\u025c\7A\2\2\u025cK\3\2\2\2\u025d"+
- "\u025e\7#\2\2\u025e\u025f\7>\2\2\u025fM\3\2\2\2\u0260\u0261\7#\2\2\u0261"+
- "\u0262\7@\2\2\u0262\u0263\3\2\2\2\u0263\u0264\b\'\2\2\u0264O\3\2\2\2\u0265"+
- "\u0266\7u\2\2\u0266\u0267\7g\2\2\u0267\u0268\7s\2\2\u0268\u0269\3\2\2"+
- "\2\u0269\u026a\b(\2\2\u026aQ\3\2\2\2\u026b\u026c\7u\2\2\u026c\u026d\7"+
- "g\2\2\u026d\u026e\7v\2\2\u026e\u026f\3\2\2\2\u026f\u0270\b)\2\2\u0270"+
- "S\3\2\2\2\u0271\u0272\7o\2\2\u0272\u0273\7u\2\2\u0273\u0274\7g\2\2\u0274"+
- "\u0275\7v\2\2\u0275\u0276\3\2\2\2\u0276\u0277\b*\2\2\u0277U\3\2\2\2\u0278"+
- "\u0279\7f\2\2\u0279\u027a\7k\2\2\u027a\u027b\7e\2\2\u027b\u027c\7v\2\2"+
- "\u027c\u027d\3\2\2\2\u027d\u027e\b+\2\2\u027eW\3\2\2\2\u027f\u0280\7q"+
- "\2\2\u0280\u0281\7r\2\2\u0281\u0282\7v\2\2\u0282\u0283\7k\2\2\u0283\u0284"+
- "\7q\2\2\u0284\u0285\7p\2\2\u0285\u0286\3\2\2\2\u0286\u0287\b,\2\2\u0287"+
- "Y\3\2\2\2\u0288\u0289\7n\2\2\u0289\u028a\7g\2\2\u028a\u028b\7p\2\2\u028b"+
- "\u028c\3\2\2\2\u028c\u028d\b-\2\2\u028d[\3\2\2\2\u028e\u028f\7p\2\2\u028f"+
- "\u0290\7g\2\2\u0290\u0291\7y\2\2\u0291\u0292\3\2\2\2\u0292\u0293\b.\2"+
- "\2\u0293]\3\2\2\2\u0294\u0295\7o\2\2\u0295\u0296\7c\2\2\u0296\u0297\7"+
- "m\2\2\u0297\u0298\7g\2\2\u0298\u0299\3\2\2\2\u0299\u029a\b/\2\2\u029a"+
- "_\3\2\2\2\u029b\u029c\7e\2\2\u029c\u029d\7c\2\2\u029d\u029e\7r\2\2\u029e"+
- "\u029f\3\2\2\2\u029f\u02a0\b\60\2\2\u02a0a\3\2\2\2\u02a1\u02a2\7u\2\2"+
- "\u02a2\u02a3\7q\2\2\u02a3\u02a4\7o\2\2\u02a4\u02a5\7g\2\2\u02a5\u02a6"+
- "\3\2\2\2\u02a6\u02a7\b\61\2\2\u02a7c\3\2\2\2\u02a8\u02a9\7i\2\2\u02a9"+
- "\u02aa\7g\2\2\u02aa\u02ab\7v\2\2\u02ab\u02ac\3\2\2\2\u02ac\u02ad\b\62"+
- "\2\2\u02ade\3\2\2\2\u02ae\u02af\7f\2\2\u02af\u02b0\7q\2\2\u02b0\u02b1"+
- "\7o\2\2\u02b1\u02b2\7c\2\2\u02b2\u02b3\7k\2\2\u02b3\u02b4\7p\2\2\u02b4"+
- "\u02b5\3\2\2\2\u02b5\u02b6\b\63\2\2\u02b6g\3\2\2\2\u02b7\u02b8\7c\2\2"+
- "\u02b8\u02b9\7z\2\2\u02b9\u02ba\7k\2\2\u02ba\u02bb\7q\2\2\u02bb\u02bc"+
- "\7o\2\2\u02bc\u02bd\3\2\2\2\u02bd\u02be\b\64\2\2\u02bei\3\2\2\2\u02bf"+
- "\u02c0\7p\2\2\u02c0\u02c1\7q\2\2\u02c1\u02c2\7p\2\2\u02c2\u02c3\7g\2\2"+
- "\u02c3\u02c4\3\2\2\2\u02c4\u02c5\b\65\2\2\u02c5k\3\2\2\2\u02c6\u02c7\7"+
- "r\2\2\u02c7\u02c8\7t\2\2\u02c8\u02c9\7g\2\2\u02c9\u02ca\7f\2\2\u02cam"+
- "\3\2\2\2\u02cb\u02cc\7v\2\2\u02cc\u02cd\7{\2\2\u02cd\u02ce\7r\2\2\u02ce"+
- "\u02cf\7g\2\2\u02cf\u02d0\7Q\2\2\u02d0\u02d1\7h\2\2\u02d1\u02d2\3\2\2"+
- "\2\u02d2\u02d3\b\67\2\2\u02d3o\3\2\2\2\u02d4\u02d5\7k\2\2\u02d5\u02d6"+
- "\7u\2\2\u02d6\u02d7\7E\2\2\u02d7\u02d8\7q\2\2\u02d8\u02d9\7o\2\2\u02d9"+
- "\u02da\7r\2\2\u02da\u02db\7c\2\2\u02db\u02dc\7t\2\2\u02dc\u02dd\7c\2\2"+
- "\u02dd\u02de\7d\2\2\u02de\u02df\7n\2\2\u02df\u02e0\7g\2\2\u02e0\u02e1"+
- "\3\2\2\2\u02e1\u02e2\b8\2\2\u02e2q\3\2\2\2\u02e3\u02e4\7u\2\2\u02e4\u02e5"+
- "\7j\2\2\u02e5\u02e6\7c\2\2\u02e6\u02e7\7t\2\2\u02e7\u02e8\7g\2\2\u02e8"+
- "s\3\2\2\2\u02e9\u02ea\7B\2\2\u02ea\u02eb\3\2\2\2\u02eb\u02ec\b:\2\2\u02ec"+
- "u\3\2\2\2\u02ed\u02ee\7\60\2\2\u02ee\u02ef\7\60\2\2\u02efw\3\2\2\2\u02f0"+
- "\u02f1\7u\2\2\u02f1\u02f2\7j\2\2\u02f2\u02f3\7c\2\2\u02f3\u02f4\7t\2\2"+
- "\u02f4\u02f5\7g\2\2\u02f5\u02f6\7f\2\2\u02f6y\3\2\2\2\u02f7\u02f8\7g\2"+
- "\2\u02f8\u02f9\7z\2\2\u02f9\u02fa\7e\2\2\u02fa\u02fb\7n\2\2\u02fb\u02fc"+
- "\7w\2\2\u02fc\u02fd\7u\2\2\u02fd\u02fe\7k\2\2\u02fe\u02ff\7x\2\2\u02ff"+
- "\u0300\7g\2\2\u0300{\3\2\2\2\u0301\u0302\7r\2\2\u0302\u0303\7t\2\2\u0303"+
- "\u0304\7g\2\2\u0304\u0305\7f\2\2\u0305\u0306\7k\2\2\u0306\u0307\7e\2\2"+
- "\u0307\u0308\7c\2\2\u0308\u0309\7v\2\2\u0309\u030a\7g\2\2\u030a}\3\2\2"+
- "\2\u030b\u030c\7y\2\2\u030c\u030d\7t\2\2\u030d\u030e\7k\2\2\u030e\u030f"+
- "\7v\2\2\u030f\u0310\7g\2\2\u0310\u0311\7R\2\2\u0311\u0312\7g\2\2\u0312"+
- "\u0313\7t\2\2\u0313\u0314\7o\2\2\u0314\u0315\3\2\2\2\u0315\u0316\b?\2"+
- "\2\u0316\177\3\2\2\2\u0317\u0318\7p\2\2\u0318\u0319\7q\2\2\u0319\u031a"+
- "\7R\2\2\u031a\u031b\7g\2\2\u031b\u031c\7t\2\2\u031c\u031d\7o\2\2\u031d"+
- "\u031e\3\2\2\2\u031e\u031f\b@\2\2\u031f\u0081\3\2\2\2\u0320\u0321\7v\2"+
- "\2\u0321\u0322\7t\2\2\u0322\u0323\7w\2\2\u0323\u0324\7u\2\2\u0324\u0325"+
- "\7v\2\2\u0325\u0326\7g\2\2\u0326\u0327\7f\2\2\u0327\u0328\3\2\2\2\u0328"+
- "\u0329\bA\2\2\u0329\u0083\3\2\2\2\u032a\u032b\7q\2\2\u032b\u032c\7w\2"+
- "\2\u032c\u032d\7v\2\2\u032d\u032e\7n\2\2\u032e\u032f\7k\2\2\u032f\u0330"+
- "\7p\2\2\u0330\u0331\7g\2\2\u0331\u0085\3\2\2\2\u0332\u0333\7k\2\2\u0333"+
- "\u0334\7p\2\2\u0334\u0335\7k\2\2\u0335\u0336\7v\2\2\u0336\u0337\7G\2\2"+
- "\u0337\u0338\7p\2\2\u0338\u0339\7u\2\2\u0339\u033a\7w\2\2\u033a\u033b"+
- "\7t\2\2\u033b\u033c\7g\2\2\u033c\u033d\7u\2\2\u033d\u0087\3\2\2\2\u033e"+
- "\u033f\7k\2\2\u033f\u0340\7o\2\2\u0340\u0341\7r\2\2\u0341\u0342\7q\2\2"+
- "\u0342\u0343\7t\2\2\u0343\u0344\7v\2\2\u0344\u0345\7T\2\2\u0345\u0346"+
- "\7g\2\2\u0346\u0347\7s\2\2\u0347\u0348\7w\2\2\u0348\u0349\7k\2\2\u0349"+
- "\u034a\7t\2\2\u034a\u034b\7g\2\2\u034b\u034c\7u\2\2\u034c\u0089\3\2\2"+
- "\2\u034d\u034e\7r\2\2\u034e\u034f\7t\2\2\u034f\u0350\7q\2\2\u0350\u0351"+
- "\7q\2\2\u0351\u0352\7h\2\2\u0352\u008b\3\2\2\2\u0353\u0354\7?\2\2\u0354"+
- "\u0355\7?\2\2\u0355\u0356\7?\2\2\u0356\u008d\3\2\2\2\u0357\u0358\7#\2"+
- "\2\u0358\u0359\7?\2\2\u0359\u035a\7?\2\2\u035a\u008f\3\2\2\2\u035b\u035c"+
- "\7d\2\2\u035c\u035d\7t\2\2\u035d\u035e\7g\2\2\u035e\u035f\7c\2\2\u035f"+
- "\u0360\7m\2\2\u0360\u0361\3\2\2\2\u0361\u0362\bH\2\2\u0362\u0091\3\2\2"+
- "\2\u0363\u0364\7f\2\2\u0364\u0365\7g\2\2\u0365\u0366\7h\2\2\u0366\u0367"+
- "\7c\2\2\u0367\u0368\7w\2\2\u0368\u0369\7n\2\2\u0369\u036a\7v\2\2\u036a"+
- "\u0093\3\2\2\2\u036b\u036c\7h\2\2\u036c\u036d\7w\2\2\u036d\u036e\7p\2"+
- "\2\u036e\u036f\7e\2\2\u036f\u0095\3\2\2\2\u0370\u0371\7k\2\2\u0371\u0372"+
- "\7p\2\2\u0372\u0373\7v\2\2\u0373\u0374\7g\2\2\u0374\u0375\7t\2\2\u0375"+
- "\u0376\7h\2\2\u0376\u0377\7c\2\2\u0377\u0378\7e\2\2\u0378\u0379\7g\2\2"+
- "\u0379\u0097\3\2\2\2\u037a\u037b\7u\2\2\u037b\u037c\7g\2\2\u037c\u037d"+
- "\7n\2\2\u037d\u037e\7g\2\2\u037e\u037f\7e\2\2\u037f\u0380\7v\2\2\u0380"+
- "\u0099\3\2\2\2\u0381\u0382\7e\2\2\u0382\u0383\7c\2\2\u0383\u0384\7u\2"+
- "\2\u0384\u0385\7g\2\2\u0385\u009b\3\2\2\2\u0386\u0387\7f\2\2\u0387\u0388"+
- "\7g\2\2\u0388\u0389\7h\2\2\u0389\u038a\7g\2\2\u038a\u038b\7t\2\2\u038b"+
- "\u009d\3\2\2\2\u038c\u038d\7i\2\2\u038d\u038e\7q\2\2\u038e\u009f\3\2\2"+
- "\2\u038f\u0390\7o\2\2\u0390\u0391\7c\2\2\u0391\u0392\7r\2\2\u0392\u00a1"+
- "\3\2\2\2\u0393\u0394\7u\2\2\u0394\u0395\7v\2\2\u0395\u0396\7t\2\2\u0396"+
- "\u0397\7w\2\2\u0397\u0398\7e\2\2\u0398\u0399\7v\2\2\u0399\u00a3\3\2\2"+
- "\2\u039a\u039b\7e\2\2\u039b\u039c\7j\2\2\u039c\u039d\7c\2\2\u039d\u039e"+
- "\7p\2\2\u039e\u00a5\3\2\2\2\u039f\u03a0\7g\2\2\u03a0\u03a1\7n\2\2\u03a1"+
- "\u03a2\7u\2\2\u03a2\u03a3\7g\2\2\u03a3\u00a7\3\2\2\2\u03a4\u03a5\7i\2"+
- "\2\u03a5\u03a6\7q\2\2\u03a6\u03a7\7v\2\2\u03a7\u03a8\7q\2\2\u03a8\u00a9"+
- "\3\2\2\2\u03a9\u03aa\7r\2\2\u03aa\u03ab\7c\2\2\u03ab\u03ac\7e\2\2\u03ac"+
- "\u03ad\7m\2\2\u03ad\u03ae\7c\2\2\u03ae\u03af\7i\2\2\u03af\u03b0\7g\2\2"+
- "\u03b0\u00ab\3\2\2\2\u03b1\u03b2\7u\2\2\u03b2\u03b3\7y\2\2\u03b3\u03b4"+
- "\7k\2\2\u03b4\u03b5\7v\2\2\u03b5\u03b6\7e\2\2\u03b6\u03b7\7j\2\2\u03b7"+
- "\u00ad\3\2\2\2\u03b8\u03b9\7e\2\2\u03b9\u03ba\7q\2\2\u03ba\u03bb\7p\2"+
- "\2\u03bb\u03bc\7u\2\2\u03bc\u03bd\7v\2\2\u03bd\u00af\3\2\2\2\u03be\u03bf"+
- "\7h\2\2\u03bf\u03c0\7c\2\2\u03c0\u03c1\7n\2\2\u03c1\u03c2\7n\2\2\u03c2"+
- "\u03c3\7v\2\2\u03c3\u03c4\7j\2\2\u03c4\u03c5\7t\2\2\u03c5\u03c6\7q\2\2"+
- "\u03c6\u03c7\7w\2\2\u03c7\u03c8\7i\2\2\u03c8\u03c9\7j\2\2\u03c9\u03ca"+
- "\3\2\2\2\u03ca\u03cb\bX\2\2\u03cb\u00b1\3\2\2\2\u03cc\u03cd\7k\2\2\u03cd"+
- "\u03ce\7h\2\2\u03ce\u00b3\3\2\2\2\u03cf\u03d0\7t\2\2\u03d0\u03d1\7c\2"+
- "\2\u03d1\u03d2\7p\2\2\u03d2\u03d3\7i\2\2\u03d3\u03d4\7g\2\2\u03d4\u00b5"+
- "\3\2\2\2\u03d5\u03d6\7v\2\2\u03d6\u03d7\7{\2\2\u03d7\u03d8\7r\2\2\u03d8"+
- "\u03d9\7g\2\2\u03d9\u00b7\3\2\2\2\u03da\u03db\7e\2\2\u03db\u03dc\7q\2"+
- "\2\u03dc\u03dd\7p\2\2\u03dd\u03de\7v\2\2\u03de\u03df\7k\2\2\u03df\u03e0"+
- "\7p\2\2\u03e0\u03e1\7w\2\2\u03e1\u03e2\7g\2\2\u03e2\u03e3\3\2\2\2\u03e3"+
- "\u03e4\b\\\2\2\u03e4\u00b9\3\2\2\2\u03e5\u03e6\7h\2\2\u03e6\u03e7\7q\2"+
- "\2\u03e7\u03e8\7t\2\2\u03e8\u00bb\3\2\2\2\u03e9\u03ea\7k\2\2\u03ea\u03eb"+
- "\7o\2\2\u03eb\u03ec\7r\2\2\u03ec\u03ed\7q\2\2\u03ed\u03ee\7t\2\2\u03ee"+
- "\u03ef\7v\2\2\u03ef\u00bd\3\2\2\2\u03f0\u03f1\7t\2\2\u03f1\u03f2\7g\2"+
- "\2\u03f2\u03f3\7v\2\2\u03f3\u03f4\7w\2\2\u03f4\u03f5\7t\2\2\u03f5\u03f6"+
- "\7p\2\2\u03f6\u03f7\3\2\2\2\u03f7\u03f8\b_\2\2\u03f8\u00bf\3\2\2\2\u03f9"+
- "\u03fa\7x\2\2\u03fa\u03fb\7c\2\2\u03fb\u03fc\7t\2\2\u03fc\u00c1\3\2\2"+
- "\2\u03fd\u03fe\7p\2\2\u03fe\u03ff\7k\2\2\u03ff\u0400\7n\2\2\u0400\u0401"+
- "\3\2\2\2\u0401\u0402\ba\2\2\u0402\u00c3\3\2\2\2\u0403\u0408\5\u0146\u00a3"+
- "\2\u0404\u0407\5\u0146\u00a3\2\u0405\u0407\5\u0148\u00a4\2\u0406\u0404"+
- "\3\2\2\2\u0406\u0405\3\2\2\2\u0407\u040a\3\2\2\2\u0408\u0406\3\2\2\2\u0408"+
- "\u0409\3\2\2\2\u0409\u040b\3\2\2\2\u040a\u0408\3\2\2\2\u040b\u040c\bb"+
- "\2\2\u040c\u00c5\3\2\2\2\u040d\u040e\7*\2\2\u040e\u00c7\3\2\2\2\u040f"+
- "\u0410\7+\2\2\u0410\u0411\3\2\2\2\u0411\u0412\bd\2\2\u0412\u00c9\3\2\2"+
- "\2\u0413\u0414\7}\2\2\u0414\u00cb\3\2\2\2\u0415\u0416\7\177\2\2\u0416"+
- "\u0417\3\2\2\2\u0417\u0418\bf\2\2\u0418\u00cd\3\2\2\2\u0419\u041a\7]\2"+
- "\2\u041a\u00cf\3\2\2\2\u041b\u041c\7_\2\2\u041c\u041d\3\2\2\2\u041d\u041e"+
- "\bh\2\2\u041e\u00d1\3\2\2\2\u041f\u0420\7?\2\2\u0420\u00d3\3\2\2\2\u0421"+
- "\u0422\7.\2\2\u0422\u00d5\3\2\2\2\u0423\u0424\7=\2\2\u0424\u00d7\3\2\2"+
- "\2\u0425\u0426\7<\2\2\u0426\u00d9\3\2\2\2\u0427\u0428\7\60\2\2\u0428\u00db"+
- "\3\2\2\2\u0429\u042a\7-\2\2\u042a\u042b\7-\2\2\u042b\u042c\3\2\2\2\u042c"+
- "\u042d\bn\2\2\u042d\u00dd\3\2\2\2\u042e\u042f\7/\2\2\u042f\u0430\7/\2"+
- "\2\u0430\u0431\3\2\2\2\u0431\u0432\bo\2\2\u0432\u00df\3\2\2\2\u0433\u0434"+
- "\7<\2\2\u0434\u0435\7?\2\2\u0435\u00e1\3\2\2\2\u0436\u0437\7\60\2\2\u0437"+
- "\u0438\7\60\2\2\u0438\u0439\7\60\2\2\u0439\u00e3\3\2\2\2\u043a\u043b\7"+
- "~\2\2\u043b\u043c\7~\2\2\u043c\u00e5\3\2\2\2\u043d\u043e\7(\2\2\u043e"+
- "\u043f\7(\2\2\u043f\u00e7\3\2\2\2\u0440\u0441\7?\2\2\u0441\u0442\7?\2"+
- "\2\u0442\u00e9\3\2\2\2\u0443\u0444\7#\2\2\u0444\u0445\7?\2\2\u0445\u00eb"+
- "\3\2\2\2\u0446\u0447\7>\2\2\u0447\u00ed\3\2\2\2\u0448\u0449\7>\2\2\u0449"+
- "\u044a\7?\2\2\u044a\u00ef\3\2\2\2\u044b\u044c\7@\2\2\u044c\u00f1\3\2\2"+
- "\2\u044d\u044e\7@\2\2\u044e\u044f\7?\2\2\u044f\u00f3\3\2\2\2\u0450\u0451"+
- "\7~\2\2\u0451\u00f5\3\2\2\2\u0452\u0453\7\61\2\2\u0453\u00f7\3\2\2\2\u0454"+
- "\u0455\7\'\2\2\u0455\u00f9\3\2\2\2\u0456\u0457\7>\2\2\u0457\u0458\7>\2"+
- "\2\u0458\u00fb\3\2\2\2\u0459\u045a\7@\2\2\u045a\u045b\7@\2\2\u045b\u00fd"+
- "\3\2\2\2\u045c\u045d\7(\2\2\u045d\u045e\7`\2\2\u045e\u00ff\3\2\2\2\u045f"+
- "\u0460\7#\2\2\u0460\u0101\3\2\2\2\u0461\u0462\7-\2\2\u0462\u0103\3\2\2"+
- "\2\u0463\u0464\7/\2\2\u0464\u0105\3\2\2\2\u0465\u0466\7`\2\2\u0466\u0107"+
- "\3\2\2\2\u0467\u0468\7,\2\2\u0468\u0109\3\2\2\2\u0469\u046a\7(\2\2\u046a"+
- "\u010b\3\2\2\2\u046b\u046c\7>\2\2\u046c\u046d\7/\2\2\u046d\u010d\3\2\2"+
- "\2\u046e\u047a\7\62\2\2\u046f\u0476\t\2\2\2\u0470\u0472\7a\2\2\u0471\u0470"+
- "\3\2\2\2\u0471\u0472\3\2\2\2\u0472\u0473\3\2\2\2\u0473\u0475\t\3\2\2\u0474"+
- "\u0471\3\2\2\2\u0475\u0478\3\2\2\2\u0476\u0474\3\2\2\2\u0476\u0477\3\2"+
- "\2\2\u0477\u047a\3\2\2\2\u0478\u0476\3\2\2\2\u0479\u046e\3\2\2\2\u0479"+
- "\u046f\3\2\2\2\u047a\u047b\3\2\2\2\u047b\u047c\b\u0087\2\2\u047c\u010f"+
- "\3\2\2\2\u047d\u047e\7\62\2\2\u047e\u0483\t\4\2\2\u047f\u0481\7a\2\2\u0480"+
- "\u047f\3\2\2\2\u0480\u0481\3\2\2\2\u0481\u0482\3\2\2\2\u0482\u0484\5\u0142"+
- "\u00a1\2\u0483\u0480\3\2\2\2\u0484\u0485\3\2\2\2\u0485\u0483\3\2\2\2\u0485"+
- "\u0486\3\2\2\2\u0486\u0487\3\2\2\2\u0487\u0488\b\u0088\2\2\u0488\u0111"+
- "\3\2\2\2\u0489\u048b\7\62\2\2\u048a\u048c\t\5\2\2\u048b\u048a\3\2\2\2"+
- "\u048b\u048c\3\2\2\2\u048c\u0491\3\2\2\2\u048d\u048f\7a\2\2\u048e\u048d"+
- "\3\2\2\2\u048e\u048f\3\2\2\2\u048f\u0490\3\2\2\2\u0490\u0492\5\u013e\u009f"+
- "\2\u0491\u048e\3\2\2\2\u0492\u0493\3\2\2\2\u0493\u0491\3\2\2\2\u0493\u0494"+
- "\3\2\2\2\u0494\u0495\3\2\2\2\u0495\u0496\b\u0089\2\2\u0496\u0113\3\2\2"+
- "\2\u0497\u0498\7\62\2\2\u0498\u049d\t\6\2\2\u0499\u049b\7a\2\2\u049a\u0499"+
- "\3\2\2\2\u049a\u049b\3\2\2\2\u049b\u049c\3\2\2\2\u049c\u049e\5\u0140\u00a0"+
- "\2\u049d\u049a\3\2\2\2\u049e\u049f\3\2\2\2\u049f\u049d\3\2\2\2\u049f\u04a0"+
- "\3\2\2\2\u04a0\u04a1\3\2\2\2\u04a1\u04a2\b\u008a\2\2\u04a2\u0115\3\2\2"+
- "\2\u04a3\u04a4\7\62\2\2\u04a4\u04a5\t\6\2\2\u04a5\u04a6\5\u0118\u008c"+
- "\2\u04a6\u04a7\5\u011a\u008d\2\u04a7\u0117\3\2\2\2\u04a8\u04aa\7a\2\2"+
- "\u04a9\u04a8\3\2\2\2\u04a9\u04aa\3\2\2\2\u04aa\u04ab\3\2\2\2\u04ab\u04ad"+
- "\5\u0140\u00a0\2\u04ac\u04a9\3\2\2\2\u04ad\u04ae\3\2\2\2\u04ae\u04ac\3"+
- "\2\2\2\u04ae\u04af\3\2\2\2\u04af\u04ba\3\2\2\2\u04b0\u04b7\7\60\2\2\u04b1"+
- "\u04b3\7a\2\2\u04b2\u04b1\3\2\2\2\u04b2\u04b3\3\2\2\2\u04b3\u04b4\3\2"+
- "\2\2\u04b4\u04b6\5\u0140\u00a0\2\u04b5\u04b2\3\2\2\2\u04b6\u04b9\3\2\2"+
- "\2\u04b7\u04b5\3\2\2\2\u04b7\u04b8\3\2\2\2\u04b8\u04bb\3\2\2\2\u04b9\u04b7"+
- "\3\2\2\2\u04ba\u04b0\3\2\2\2\u04ba\u04bb\3\2\2\2\u04bb\u04c8\3\2\2\2\u04bc"+
- "\u04bd\7\60\2\2\u04bd\u04c4\5\u0140\u00a0\2\u04be\u04c0\7a\2\2\u04bf\u04be"+
- "\3\2\2\2\u04bf\u04c0\3\2\2\2\u04c0\u04c1\3\2\2\2\u04c1\u04c3\5\u0140\u00a0"+
- "\2\u04c2\u04bf\3\2\2\2\u04c3\u04c6\3\2\2\2\u04c4\u04c2\3\2\2\2\u04c4\u04c5"+
- "\3\2\2\2\u04c5\u04c8\3\2\2\2\u04c6\u04c4\3\2\2\2\u04c7\u04ac\3\2\2\2\u04c7"+
- "\u04bc\3\2\2\2\u04c8\u0119\3\2\2\2\u04c9\u04ca\t\7\2\2\u04ca\u04cb\t\b"+
- "\2\2\u04cb\u04cc\5\u013c\u009e\2\u04cc\u011b\3\2\2\2\u04cd\u04d3\5\u010e"+
- "\u0087\2\u04ce\u04d3\5\u0110\u0088\2\u04cf\u04d3\5\u0112\u0089\2\u04d0"+
- "\u04d3\5\u0114\u008a\2\u04d1\u04d3\5\4\2\2\u04d2\u04cd\3\2\2\2\u04d2\u04ce"+
- "\3\2\2\2\u04d2\u04cf\3\2\2\2\u04d2\u04d0\3\2\2\2\u04d2\u04d1\3\2\2\2\u04d3"+
- "\u04d4\3\2\2\2\u04d4\u04d5\7k\2\2\u04d5\u04d6\3\2\2\2\u04d6\u04d7\b\u008e"+
- "\2\2\u04d7\u011d\3\2\2\2\u04d8\u04db\7)\2\2\u04d9\u04dc\5\u0138\u009c"+
- "\2\u04da\u04dc\5\u0122\u0091\2\u04db\u04d9\3\2\2\2\u04db\u04da\3\2\2\2"+
- "\u04dc\u04dd\3\2\2\2\u04dd\u04de\7)\2\2\u04de\u011f\3\2\2\2\u04df\u04e0"+
- "\5\u011e\u008f\2\u04e0\u04e1\3\2\2\2\u04e1\u04e2\b\u0090\2\2\u04e2\u0121"+
- "\3\2\2\2\u04e3\u04e6\5\u0124\u0092\2\u04e4\u04e6\5\u0126\u0093\2\u04e5"+
- "\u04e3\3\2\2\2\u04e5\u04e4\3\2\2\2\u04e6\u0123\3\2\2\2\u04e7\u04e8\7^"+
- "\2\2\u04e8\u04e9\5\u013e\u009f\2\u04e9\u04ea\5\u013e\u009f\2\u04ea\u04eb"+
- "\5\u013e\u009f\2\u04eb\u0125\3\2\2\2\u04ec\u04ed\7^\2\2\u04ed\u04ee\7"+
- "z\2\2\u04ee\u04ef\5\u0140\u00a0\2\u04ef\u04f0\5\u0140\u00a0\2\u04f0\u0127"+
- "\3\2\2\2\u04f1\u04f2\7^\2\2\u04f2\u04f3\7w\2\2\u04f3\u04f4\5\u0140\u00a0"+
- "\2\u04f4\u04f5\5\u0140\u00a0\2\u04f5\u04f6\5\u0140\u00a0\2\u04f6\u04f7"+
- "\5\u0140\u00a0\2\u04f7\u0129\3\2\2\2\u04f8\u04f9\7^\2\2\u04f9\u04fa\7"+
- "W\2\2\u04fa\u04fb\5\u0140\u00a0\2\u04fb\u04fc\5\u0140\u00a0\2\u04fc\u04fd"+
- "\5\u0140\u00a0\2\u04fd\u04fe\5\u0140\u00a0\2\u04fe\u04ff\5\u0140\u00a0"+
- "\2\u04ff\u0500\5\u0140\u00a0\2\u0500\u0501\5\u0140\u00a0\2\u0501\u0502"+
- "\5\u0140\u00a0\2\u0502\u012b\3\2\2\2\u0503\u0507\7b\2\2\u0504\u0506\n"+
- "\t\2\2\u0505\u0504\3\2\2\2\u0506\u0509\3\2\2\2\u0507\u0505\3\2\2\2\u0507"+
- "\u0508\3\2\2\2\u0508\u050a\3\2\2\2\u0509\u0507\3\2\2\2\u050a\u050b\7b"+
- "\2\2\u050b\u050c\3\2\2\2\u050c\u050d\b\u0096\2\2\u050d\u012d\3\2\2\2\u050e"+
- "\u0513\7$\2\2\u050f\u0512\n\n\2\2\u0510\u0512\5\u013a\u009d\2\u0511\u050f"+
- "\3\2\2\2\u0511\u0510\3\2\2\2\u0512\u0515\3\2\2\2\u0513\u0511\3\2\2\2\u0513"+
- "\u0514\3\2\2\2\u0514\u0516\3\2\2\2\u0515\u0513\3\2\2\2\u0516\u0517\7$"+
- "\2\2\u0517\u0518\3\2\2\2\u0518\u0519\b\u0097\2\2\u0519\u012f\3\2\2\2\u051a"+
- "\u051c\t\13\2\2\u051b\u051a\3\2\2\2\u051c\u051d\3\2\2\2\u051d\u051b\3"+
- "\2\2\2\u051d\u051e\3\2\2\2\u051e\u051f\3\2\2\2\u051f\u0520\b\u0098\3\2"+
- "\u0520\u0131\3\2\2\2\u0521\u0522\7\61\2\2\u0522\u0523\7,\2\2\u0523\u0527"+
- "\3\2\2\2\u0524\u0526\13\2\2\2\u0525\u0524\3\2\2\2\u0526\u0529\3\2\2\2"+
- "\u0527\u0528\3\2\2\2\u0527\u0525\3\2\2\2\u0528\u052a\3\2\2\2\u0529\u0527"+
- "\3\2\2\2\u052a\u052b\7,\2\2\u052b\u052c\7\61\2\2\u052c\u052d\3\2\2\2\u052d"+
- "\u052e\b\u0099\3\2\u052e\u0133\3\2\2\2\u052f\u0531\t\f\2\2\u0530\u052f"+
- "\3\2\2\2\u0531\u0532\3\2\2\2\u0532\u0530\3\2\2\2\u0532\u0533\3\2\2\2\u0533"+
- "\u0534\3\2\2\2\u0534\u0535\b\u009a\3\2\u0535\u0135\3\2\2\2\u0536\u0537"+
- "\7\61\2\2\u0537\u0538\7\61\2\2\u0538\u053c\3\2\2\2\u0539\u053b\n\f\2\2"+
- "\u053a\u0539\3\2\2\2\u053b\u053e\3\2\2\2\u053c\u053a\3\2\2\2\u053c\u053d"+
- "\3\2\2\2\u053d\u053f\3\2\2\2\u053e\u053c\3\2\2\2\u053f\u0540\b\u009b\3"+
- "\2\u0540\u0137\3\2\2\2\u0541\u0546\n\r\2\2\u0542\u0546\5\u0128\u0094\2"+
- "\u0543\u0546\5\u012a\u0095\2\u0544\u0546\5\u013a\u009d\2\u0545\u0541\3"+
- "\2\2\2\u0545\u0542\3\2\2\2\u0545\u0543\3\2\2\2\u0545\u0544\3\2\2\2\u0546"+
- "\u0139\3\2\2\2\u0547\u0561\7^\2\2\u0548\u0549\7w\2\2\u0549\u054a\5\u0140"+
- "\u00a0\2\u054a\u054b\5\u0140\u00a0\2\u054b\u054c\5\u0140\u00a0\2\u054c"+
- "\u054d\5\u0140\u00a0\2\u054d\u0562\3\2\2\2\u054e\u054f\7W\2\2\u054f\u0550"+
- "\5\u0140\u00a0\2\u0550\u0551\5\u0140\u00a0\2\u0551\u0552\5\u0140\u00a0"+
- "\2\u0552\u0553\5\u0140\u00a0\2\u0553\u0554\5\u0140\u00a0\2\u0554\u0555"+
- "\5\u0140\u00a0\2\u0555\u0556\5\u0140\u00a0\2\u0556\u0557\5\u0140\u00a0"+
- "\2\u0557\u0562\3\2\2\2\u0558\u0562\t\16\2\2\u0559\u055a\5\u013e\u009f"+
- "\2\u055a\u055b\5\u013e\u009f\2\u055b\u055c\5\u013e\u009f\2\u055c\u0562"+
- "\3\2\2\2\u055d\u055e\7z\2\2\u055e\u055f\5\u0140\u00a0\2\u055f\u0560\5"+
- "\u0140\u00a0\2\u0560\u0562\3\2\2\2\u0561\u0548\3\2\2\2\u0561\u054e\3\2"+
- "\2\2\u0561\u0558\3\2\2\2\u0561\u0559\3\2\2\2\u0561\u055d\3\2\2\2\u0562"+
- "\u013b\3\2\2\2\u0563\u056a\t\3\2\2\u0564\u0566\7a\2\2\u0565\u0564\3\2"+
- "\2\2\u0565\u0566\3\2\2\2\u0566\u0567\3\2\2\2\u0567\u0569\t\3\2\2\u0568"+
- "\u0565\3\2\2\2\u0569\u056c\3\2\2\2\u056a\u0568\3\2\2\2\u056a\u056b\3\2"+
- "\2\2\u056b\u013d\3\2\2\2\u056c\u056a\3\2\2\2\u056d\u056e\t\17\2\2\u056e"+
- "\u013f\3\2\2\2\u056f\u0570\t\20\2\2\u0570\u0141\3\2\2\2\u0571\u0572\t"+
- "\21\2\2\u0572\u0143\3\2\2\2\u0573\u0575\t\22\2\2\u0574\u0576\t\b\2\2\u0575"+
- "\u0574\3\2\2\2\u0575\u0576\3\2\2\2\u0576\u0577\3\2\2\2\u0577\u0578\5\u013c"+
- "\u009e\2\u0578\u0145\3\2\2\2\u0579\u057c\5\u014a\u00a5\2\u057a\u057c\7"+
- "a\2\2\u057b\u0579\3\2\2\2\u057b\u057a\3\2\2\2\u057c\u0147\3\2\2\2\u057d"+
- "\u057e\t\23\2\2\u057e\u0149\3\2\2\2\u057f\u0580\t\24\2\2\u0580\u014b\3"+
- "\2\2\2\u0581\u0583\t\13\2\2\u0582\u0581\3\2\2\2\u0583\u0584\3\2\2\2\u0584"+
- "\u0582\3\2\2\2\u0584\u0585\3\2\2\2\u0585\u0586\3\2\2\2\u0586\u0587\b\u00a6"+
- "\3\2\u0587\u014d\3\2\2\2\u0588\u0589\7\61\2\2\u0589\u058a\7,\2\2\u058a"+
- "\u058e\3\2\2\2\u058b\u058d\n\f\2\2\u058c\u058b\3\2\2\2\u058d\u0590\3\2"+
- "\2\2\u058e\u058f\3\2\2\2\u058e\u058c\3\2\2\2\u058f\u0591\3\2\2\2\u0590"+
- "\u058e\3\2\2\2\u0591\u0592\7,\2\2\u0592\u0593\7\61\2\2\u0593\u0594\3\2"+
- "\2\2\u0594\u0595\b\u00a7\3\2\u0595\u014f\3\2\2\2\u0596\u0597\7\61\2\2"+
- "\u0597\u0598\7\61\2\2\u0598\u059c\3\2\2\2\u0599\u059b\n\f\2\2\u059a\u0599"+
- "\3\2\2\2\u059b\u059e\3\2\2\2\u059c\u059a\3\2\2\2\u059c\u059d\3\2\2\2\u059d"+
- "\u059f\3\2\2\2\u059e\u059c\3\2\2\2\u059f\u05a0\b\u00a8\3\2\u05a0\u0151"+
- "\3\2\2\2\u05a1\u05a3\t\f\2\2\u05a2\u05a1\3\2\2\2\u05a3\u05a4\3\2\2\2\u05a4"+
- "\u05a2\3\2\2\2\u05a4\u05a5\3\2\2\2\u05a5\u05b4\3\2\2\2\u05a6\u05b4\7="+
- "\2\2\u05a7\u05a8\7\61\2\2\u05a8\u05a9\7,\2\2\u05a9\u05ad\3\2\2\2\u05aa"+
- "\u05ac\13\2\2\2\u05ab\u05aa\3\2\2\2\u05ac\u05af\3\2\2\2\u05ad\u05ae\3"+
- "\2\2\2\u05ad\u05ab\3\2\2\2\u05ae\u05b0\3\2\2\2\u05af\u05ad\3\2\2\2\u05b0"+
- "\u05b1\7,\2\2\u05b1\u05b4\7\61\2\2\u05b2\u05b4\7\2\2\3\u05b3\u05a2\3\2"+
- "\2\2\u05b3\u05a6\3\2\2\2\u05b3\u05a7\3\2\2\2\u05b3\u05b2\3\2\2\2\u05b4"+
- "\u05b5\3\2\2\2\u05b5\u05b6\b\u00a9\4\2\u05b6\u0153\3\2\2\2\u05b7\u05b8"+
- "\3\2\2\2\u05b8\u05b9\3\2\2\2\u05b9\u05ba\b\u00aa\4\2\u05ba\u05bb\b\u00aa"+
- "\3\2\u05bb\u0155\3\2\2\2\64\2\3\u0158\u0160\u0163\u0166\u016c\u016e\u0406"+
- "\u0408\u0471\u0476\u0479\u0480\u0485\u048b\u048e\u0493\u049a\u049f\u04a9"+
- "\u04ae\u04b2\u04b7\u04ba\u04bf\u04c4\u04c7\u04d2\u04db\u04e5\u0507\u0511"+
- "\u0513\u051d\u0527\u0532\u053c\u0545\u0561\u0565\u056a\u0575\u057b\u0584"+
- "\u058e\u059c\u05a4\u05ad\u05b3\5\4\3\2\2\3\2\4\2\2";
+ "\4\u00a9\t\u00a9\4\u00aa\t\u00aa\4\u00ab\t\u00ab\3\2\3\2\5\2\u015b\n\2"+
+ "\3\2\3\2\3\3\3\3\3\3\3\3\5\3\u0163\n\3\3\3\5\3\u0166\n\3\3\3\5\3\u0169"+
+ "\n\3\3\3\3\3\3\3\3\3\5\3\u016f\n\3\5\3\u0171\n\3\3\4\3\4\3\4\3\4\3\4\3"+
+ "\4\3\4\3\5\3\5\3\5\3\5\3\5\3\5\3\5\3\5\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\7"+
+ "\3\7\3\7\3\7\3\7\3\7\3\7\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\t\3\t\3\t\3\t\3"+
+ "\t\3\t\3\t\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\13\3\13\3\13\3\13\3\13"+
+ "\3\13\3\13\3\13\3\13\3\13\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\r\3\r\3\r"+
+ "\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\16\3\16\3\16\3\16\3\16\3\16\3\16\3\16\3"+
+ "\16\3\16\3\16\3\16\3\17\3\17\3\17\3\17\3\17\3\17\3\17\3\20\3\20\3\20\3"+
+ "\20\3\20\3\20\3\20\3\20\3\20\3\20\3\20\3\21\3\21\3\21\3\22\3\22\3\22\3"+
+ "\22\3\22\3\22\3\23\3\23\3\23\3\23\3\23\3\23\3\23\3\23\3\23\3\24\3\24\3"+
+ "\24\3\24\3\24\3\25\3\25\3\25\3\25\3\25\3\25\3\25\3\26\3\26\3\26\3\26\3"+
+ "\26\3\26\3\26\3\27\3\27\3\27\3\27\3\27\3\27\3\30\3\30\3\30\3\30\3\30\3"+
+ "\31\3\31\3\31\3\31\3\31\3\31\3\31\3\32\3\32\3\32\3\32\3\32\3\32\3\32\3"+
+ "\32\3\32\3\32\3\33\3\33\3\33\3\33\3\33\3\33\3\34\3\34\3\34\3\35\3\35\3"+
+ "\36\3\36\3\36\3\36\3\36\3\36\3\36\3\37\3\37\3\37\3\37\3\37\3\37\3 \3 "+
+ "\3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3!\3!\3!\3!\3!\3!\3!\3!\3!\3\"\3\"\3"+
+ "\"\3\"\3#\3#\3#\3#\3$\3$\3$\3$\3$\3$\3%\3%\3&\3&\3&\3\'\3\'\3\'\3\'\3"+
+ "\'\3(\3(\3(\3(\3(\3(\3)\3)\3)\3)\3)\3)\3*\3*\3*\3*\3*\3*\3*\3+\3+\3+\3"+
+ "+\3+\3+\3+\3,\3,\3,\3,\3,\3,\3,\3,\3,\3-\3-\3-\3-\3-\3-\3.\3.\3.\3.\3"+
+ ".\3.\3/\3/\3/\3/\3/\3/\3/\3\60\3\60\3\60\3\60\3\60\3\60\3\61\3\61\3\61"+
+ "\3\61\3\61\3\61\3\61\3\62\3\62\3\62\3\62\3\62\3\62\3\63\3\63\3\63\3\63"+
+ "\3\63\3\63\3\63\3\63\3\63\3\64\3\64\3\64\3\64\3\64\3\64\3\64\3\64\3\65"+
+ "\3\65\3\65\3\65\3\65\3\65\3\65\3\66\3\66\3\66\3\66\3\66\3\67\3\67\3\67"+
+ "\3\67\3\67\3\67\3\67\3\67\3\67\38\38\38\38\38\38\38\38\38\38\38\38\38"+
+ "\38\38\39\39\39\39\39\39\3:\3:\3:\3:\3;\3;\3;\3<\3<\3<\3<\3<\3<\3<\3="+
+ "\3=\3=\3=\3=\3=\3=\3=\3=\3=\3>\3>\3>\3>\3>\3>\3>\3>\3>\3>\3?\3?\3?\3?"+
+ "\3?\3?\3?\3?\3?\3?\3?\3?\3@\3@\3@\3@\3@\3@\3@\3@\3@\3A\3A\3A\3A\3A\3A"+
+ "\3A\3A\3A\3A\3B\3B\3B\3B\3B\3B\3B\3B\3C\3C\3C\3C\3C\3C\3C\3C\3C\3C\3C"+
+ "\3C\3D\3D\3D\3D\3D\3D\3D\3D\3D\3D\3D\3D\3D\3D\3D\3E\3E\3E\3E\3E\3E\3F"+
+ "\3F\3F\3F\3G\3G\3G\3G\3H\3H\3H\3H\3H\3I\3I\3I\3I\3I\3I\3I\3I\3J\3J\3J"+
+ "\3J\3J\3J\3J\3J\3K\3K\3K\3K\3K\3L\3L\3L\3L\3L\3L\3L\3L\3L\3L\3M\3M\3M"+
+ "\3M\3M\3M\3M\3N\3N\3N\3N\3N\3O\3O\3O\3O\3O\3O\3P\3P\3P\3Q\3Q\3Q\3Q\3R"+
+ "\3R\3R\3R\3R\3R\3R\3S\3S\3S\3S\3S\3T\3T\3T\3T\3T\3U\3U\3U\3U\3U\3V\3V"+
+ "\3V\3V\3V\3V\3V\3V\3W\3W\3W\3W\3W\3W\3W\3X\3X\3X\3X\3X\3X\3Y\3Y\3Y\3Y"+
+ "\3Y\3Y\3Y\3Y\3Y\3Y\3Y\3Y\3Y\3Y\3Z\3Z\3Z\3[\3[\3[\3[\3[\3[\3\\\3\\\3\\"+
+ "\3\\\3\\\3]\3]\3]\3]\3]\3]\3]\3]\3]\3]\3]\3^\3^\3^\3^\3_\3_\3_\3_\3_\3"+
+ "_\3_\3`\3`\3`\3`\3`\3`\3`\3`\3`\3a\3a\3a\3a\3b\3b\3b\3b\3b\3b\3c\3c\3"+
+ "c\7c\u040e\nc\fc\16c\u0411\13c\3c\3c\3d\3d\3e\3e\3e\3e\3f\3f\3g\3g\3g"+
+ "\3g\3h\3h\3i\3i\3i\3i\3j\3j\3k\3k\3l\3l\3m\3m\3n\3n\3o\3o\3o\3o\3o\3p"+
+ "\3p\3p\3p\3p\3q\3q\3q\3r\3r\3r\3r\3s\3s\3s\3t\3t\3t\3u\3u\3u\3v\3v\3v"+
+ "\3w\3w\3x\3x\3x\3y\3y\3z\3z\3z\3{\3{\3|\3|\3}\3}\3~\3~\3~\3\177\3\177"+
+ "\3\177\3\u0080\3\u0080\3\u0080\3\u0081\3\u0081\3\u0082\3\u0082\3\u0083"+
+ "\3\u0083\3\u0084\3\u0084\3\u0085\3\u0085\3\u0086\3\u0086\3\u0087\3\u0087"+
+ "\3\u0087\3\u0088\3\u0088\3\u0088\5\u0088\u0479\n\u0088\3\u0088\7\u0088"+
+ "\u047c\n\u0088\f\u0088\16\u0088\u047f\13\u0088\5\u0088\u0481\n\u0088\3"+
+ "\u0088\3\u0088\3\u0089\3\u0089\3\u0089\5\u0089\u0488\n\u0089\3\u0089\6"+
+ "\u0089\u048b\n\u0089\r\u0089\16\u0089\u048c\3\u0089\3\u0089\3\u008a\3"+
+ "\u008a\5\u008a\u0493\n\u008a\3\u008a\5\u008a\u0496\n\u008a\3\u008a\6\u008a"+
+ "\u0499\n\u008a\r\u008a\16\u008a\u049a\3\u008a\3\u008a\3\u008b\3\u008b"+
+ "\3\u008b\5\u008b\u04a2\n\u008b\3\u008b\6\u008b\u04a5\n\u008b\r\u008b\16"+
+ "\u008b\u04a6\3\u008b\3\u008b\3\u008c\3\u008c\3\u008c\3\u008c\3\u008c\3"+
+ "\u008d\5\u008d\u04b1\n\u008d\3\u008d\6\u008d\u04b4\n\u008d\r\u008d\16"+
+ "\u008d\u04b5\3\u008d\3\u008d\5\u008d\u04ba\n\u008d\3\u008d\7\u008d\u04bd"+
+ "\n\u008d\f\u008d\16\u008d\u04c0\13\u008d\5\u008d\u04c2\n\u008d\3\u008d"+
+ "\3\u008d\3\u008d\5\u008d\u04c7\n\u008d\3\u008d\7\u008d\u04ca\n\u008d\f"+
+ "\u008d\16\u008d\u04cd\13\u008d\5\u008d\u04cf\n\u008d\3\u008e\3\u008e\3"+
+ "\u008e\3\u008e\3\u008f\3\u008f\3\u008f\3\u008f\3\u008f\5\u008f\u04da\n"+
+ "\u008f\3\u008f\3\u008f\3\u008f\3\u008f\3\u0090\3\u0090\3\u0090\5\u0090"+
+ "\u04e3\n\u0090\3\u0090\3\u0090\3\u0091\3\u0091\3\u0091\3\u0091\3\u0092"+
+ "\3\u0092\5\u0092\u04ed\n\u0092\3\u0093\3\u0093\3\u0093\3\u0093\3\u0093"+
+ "\3\u0094\3\u0094\3\u0094\3\u0094\3\u0094\3\u0095\3\u0095\3\u0095\3\u0095"+
+ "\3\u0095\3\u0095\3\u0095\3\u0096\3\u0096\3\u0096\3\u0096\3\u0096\3\u0096"+
+ "\3\u0096\3\u0096\3\u0096\3\u0096\3\u0096\3\u0097\3\u0097\7\u0097\u050d"+
+ "\n\u0097\f\u0097\16\u0097\u0510\13\u0097\3\u0097\3\u0097\3\u0097\3\u0097"+
+ "\3\u0098\3\u0098\3\u0098\7\u0098\u0519\n\u0098\f\u0098\16\u0098\u051c"+
+ "\13\u0098\3\u0098\3\u0098\3\u0098\3\u0098\3\u0099\6\u0099\u0523\n\u0099"+
+ "\r\u0099\16\u0099\u0524\3\u0099\3\u0099\3\u009a\3\u009a\3\u009a\3\u009a"+
+ "\7\u009a\u052d\n\u009a\f\u009a\16\u009a\u0530\13\u009a\3\u009a\3\u009a"+
+ "\3\u009a\3\u009a\3\u009a\3\u009b\6\u009b\u0538\n\u009b\r\u009b\16\u009b"+
+ "\u0539\3\u009b\3\u009b\3\u009c\3\u009c\3\u009c\3\u009c\7\u009c\u0542\n"+
+ "\u009c\f\u009c\16\u009c\u0545\13\u009c\3\u009c\3\u009c\3\u009d\3\u009d"+
+ "\3\u009d\3\u009d\5\u009d\u054d\n\u009d\3\u009e\3\u009e\3\u009e\3\u009e"+
+ "\3\u009e\3\u009e\3\u009e\3\u009e\3\u009e\3\u009e\3\u009e\3\u009e\3\u009e"+
+ "\3\u009e\3\u009e\3\u009e\3\u009e\3\u009e\3\u009e\3\u009e\3\u009e\3\u009e"+
+ "\3\u009e\3\u009e\3\u009e\3\u009e\5\u009e\u0569\n\u009e\3\u009f\3\u009f"+
+ "\5\u009f\u056d\n\u009f\3\u009f\7\u009f\u0570\n\u009f\f\u009f\16\u009f"+
+ "\u0573\13\u009f\3\u00a0\3\u00a0\3\u00a1\3\u00a1\3\u00a2\3\u00a2\3\u00a3"+
+ "\3\u00a3\5\u00a3\u057d\n\u00a3\3\u00a3\3\u00a3\3\u00a4\3\u00a4\5\u00a4"+
+ "\u0583\n\u00a4\3\u00a5\3\u00a5\3\u00a6\3\u00a6\3\u00a7\6\u00a7\u058a\n"+
+ "\u00a7\r\u00a7\16\u00a7\u058b\3\u00a7\3\u00a7\3\u00a8\3\u00a8\3\u00a8"+
+ "\3\u00a8\7\u00a8\u0594\n\u00a8\f\u00a8\16\u00a8\u0597\13\u00a8\3\u00a8"+
+ "\3\u00a8\3\u00a8\3\u00a8\3\u00a8\3\u00a9\3\u00a9\3\u00a9\3\u00a9\7\u00a9"+
+ "\u05a2\n\u00a9\f\u00a9\16\u00a9\u05a5\13\u00a9\3\u00a9\3\u00a9\3\u00aa"+
+ "\6\u00aa\u05aa\n\u00aa\r\u00aa\16\u00aa\u05ab\3\u00aa\3\u00aa\3\u00aa"+
+ "\3\u00aa\3\u00aa\7\u00aa\u05b3\n\u00aa\f\u00aa\16\u00aa\u05b6\13\u00aa"+
+ "\3\u00aa\3\u00aa\3\u00aa\5\u00aa\u05bb\n\u00aa\3\u00aa\3\u00aa\3\u00ab"+
+ "\3\u00ab\3\u00ab\3\u00ab\3\u00ab\5\u052e\u0595\u05b4\2\u00ac\4\3\6\4\b"+
+ "\5\n\6\f\7\16\b\20\t\22\n\24\13\26\f\30\r\32\16\34\17\36\20 \21\"\22$"+
+ "\23&\24(\25*\26,\27.\30\60\31\62\32\64\33\66\348\35:\36<\37> @!B\"D#F"+
+ "$H%J&L\'N(P)R*T+V,X-Z.\\/^\60`\61b\62d\63f\64h\65j\66l\67n8p9r:t;v|?~@\u0080A\u0082B\u0084C\u0086D\u0088E\u008aF\u008cG\u008eH\u0090I"+
+ "\u0092J\u0094K\u0096L\u0098M\u009aN\u009cO\u009eP\u00a0Q\u00a2R\u00a4"+
+ "S\u00a6T\u00a8U\u00aaV\u00acW\u00aeX\u00b0Y\u00b2Z\u00b4[\u00b6\\\u00b8"+
+ "]\u00ba^\u00bc_\u00be`\u00c0a\u00c2b\u00c4c\u00c6d\u00c8e\u00caf\u00cc"+
+ "g\u00ceh\u00d0i\u00d2j\u00d4k\u00d6l\u00d8m\u00dan\u00dco\u00dep\u00e0"+
+ "q\u00e2r\u00e4s\u00e6t\u00e8u\u00eav\u00ecw\u00eex\u00f0y\u00f2z\u00f4"+
+ "{\u00f6|\u00f8}\u00fa~\u00fc\177\u00fe\u0080\u0100\u0081\u0102\u0082\u0104"+
+ "\u0083\u0106\u0084\u0108\u0085\u010a\u0086\u010c\u0087\u010e\u0088\u0110"+
+ "\u0089\u0112\u008a\u0114\u008b\u0116\u008c\u0118\u008d\u011a\2\u011c\2"+
+ "\u011e\u008e\u0120\2\u0122\u008f\u0124\u0090\u0126\u0091\u0128\u0092\u012a"+
+ "\u0093\u012c\u0094\u012e\u0095\u0130\u0096\u0132\u0097\u0134\u0098\u0136"+
+ "\u0099\u0138\u009a\u013a\2\u013c\2\u013e\2\u0140\2\u0142\2\u0144\2\u0146"+
+ "\2\u0148\2\u014a\2\u014c\2\u014e\u009b\u0150\u009c\u0152\u009d\u0154\u009e"+
+ "\u0156\u009f\4\2\3\23\3\2\63;\3\2\62;\4\2DDdd\4\2QQqq\4\2ZZzz\4\2RRrr"+
+ "\4\2--//\3\2bb\4\2$$^^\4\2\13\13\"\"\4\2\f\f\17\17\5\2\f\f\17\17))\13"+
+ "\2$$))^^cdhhppttvvxx\3\2\629\5\2\62;CHch\3\2\62\63\4\2GGgg\49\2\62\2;"+
+ "\2\u0662\2\u066b\2\u06f2\2\u06fb\2\u07c2\2\u07cb\2\u0968\2\u0971\2\u09e8"+
+ "\2\u09f1\2\u0a68\2\u0a71\2\u0ae8\2\u0af1\2\u0b68\2\u0b71\2\u0be8\2\u0bf1"+
+ "\2\u0c68\2\u0c71\2\u0ce8\2\u0cf1\2\u0d68\2\u0d71\2\u0de8\2\u0df1\2\u0e52"+
+ "\2\u0e5b\2\u0ed2\2\u0edb\2\u0f22\2\u0f2b\2\u1042\2\u104b\2\u1092\2\u109b"+
+ "\2\u17e2\2\u17eb\2\u1812\2\u181b\2\u1948\2\u1951\2\u19d2\2\u19db\2\u1a82"+
+ "\2\u1a8b\2\u1a92\2\u1a9b\2\u1b52\2\u1b5b\2\u1bb2\2\u1bbb\2\u1c42\2\u1c4b"+
+ "\2\u1c52\2\u1c5b\2\ua622\2\ua62b\2\ua8d2\2\ua8db\2\ua902\2\ua90b\2\ua9d2"+
+ "\2\ua9db\2\ua9f2\2\ua9fb\2\uaa52\2\uaa5b\2\uabf2\2\uabfb\2\uff12\2\uff1b"+
+ "\2\u04a2\3\u04ab\3\u1068\3\u1071\3\u10f2\3\u10fb\3\u1138\3\u1141\3\u11d2"+
+ "\3\u11db\3\u12f2\3\u12fb\3\u1452\3\u145b\3\u14d2\3\u14db\3\u1652\3\u165b"+
+ "\3\u16c2\3\u16cb\3\u1732\3\u173b\3\u18e2\3\u18eb\3\u1c52\3\u1c5b\3\u1d52"+
+ "\3\u1d5b\3\u6a62\3\u6a6b\3\u6b52\3\u6b5b\3\ud7d0\3\ud801\3\ue952\3\ue95b"+
+ "\3\u024b\2C\2\\\2c\2|\2\u00ac\2\u00ac\2\u00b7\2\u00b7\2\u00bc\2\u00bc"+
+ "\2\u00c2\2\u00d8\2\u00da\2\u00f8\2\u00fa\2\u02c3\2\u02c8\2\u02d3\2\u02e2"+
+ "\2\u02e6\2\u02ee\2\u02ee\2\u02f0\2\u02f0\2\u0372\2\u0376\2\u0378\2\u0379"+
+ "\2\u037c\2\u037f\2\u0381\2\u0381\2\u0388\2\u0388\2\u038a\2\u038c\2\u038e"+
+ "\2\u038e\2\u0390\2\u03a3\2\u03a5\2\u03f7\2\u03f9\2\u0483\2\u048c\2\u0531"+
+ "\2\u0533\2\u0558\2\u055b\2\u055b\2\u0563\2\u0589\2\u05d2\2\u05ec\2\u05f2"+
+ "\2\u05f4\2\u0622\2\u064c\2\u0670\2\u0671\2\u0673\2\u06d5\2\u06d7\2\u06d7"+
+ "\2\u06e7\2\u06e8\2\u06f0\2\u06f1\2\u06fc\2\u06fe\2\u0701\2\u0701\2\u0712"+
+ "\2\u0712\2\u0714\2\u0731\2\u074f\2\u07a7\2\u07b3\2\u07b3\2\u07cc\2\u07ec"+
+ "\2\u07f6\2\u07f7\2\u07fc\2\u07fc\2\u0802\2\u0817\2\u081c\2\u081c\2\u0826"+
+ "\2\u0826\2\u082a\2\u082a\2\u0842\2\u085a\2\u0862\2\u086c\2\u08a2\2\u08b6"+
+ "\2\u08b8\2\u08bf\2\u0906\2\u093b\2\u093f\2\u093f\2\u0952\2\u0952\2\u095a"+
+ "\2\u0963\2\u0973\2\u0982\2\u0987\2\u098e\2\u0991\2\u0992\2\u0995\2\u09aa"+
+ "\2\u09ac\2\u09b2\2\u09b4\2\u09b4\2\u09b8\2\u09bb\2\u09bf\2\u09bf\2\u09d0"+
+ "\2\u09d0\2\u09de\2\u09df\2\u09e1\2\u09e3\2\u09f2\2\u09f3\2\u09fe\2\u09fe"+
+ "\2\u0a07\2\u0a0c\2\u0a11\2\u0a12\2\u0a15\2\u0a2a\2\u0a2c\2\u0a32\2\u0a34"+
+ "\2\u0a35\2\u0a37\2\u0a38\2\u0a3a\2\u0a3b\2\u0a5b\2\u0a5e\2\u0a60\2\u0a60"+
+ "\2\u0a74\2\u0a76\2\u0a87\2\u0a8f\2\u0a91\2\u0a93\2\u0a95\2\u0aaa\2\u0aac"+
+ "\2\u0ab2\2\u0ab4\2\u0ab5\2\u0ab7\2\u0abb\2\u0abf\2\u0abf\2\u0ad2\2\u0ad2"+
+ "\2\u0ae2\2\u0ae3\2\u0afb\2\u0afb\2\u0b07\2\u0b0e\2\u0b11\2\u0b12\2\u0b15"+
+ "\2\u0b2a\2\u0b2c\2\u0b32\2\u0b34\2\u0b35\2\u0b37\2\u0b3b\2\u0b3f\2\u0b3f"+
+ "\2\u0b5e\2\u0b5f\2\u0b61\2\u0b63\2\u0b73\2\u0b73\2\u0b85\2\u0b85\2\u0b87"+
+ "\2\u0b8c\2\u0b90\2\u0b92\2\u0b94\2\u0b97\2\u0b9b\2\u0b9c\2\u0b9e\2\u0b9e"+
+ "\2\u0ba0\2\u0ba1\2\u0ba5\2\u0ba6\2\u0baa\2\u0bac\2\u0bb0\2\u0bbb\2\u0bd2"+
+ "\2\u0bd2\2\u0c07\2\u0c0e\2\u0c10\2\u0c12\2\u0c14\2\u0c2a\2\u0c2c\2\u0c3b"+
+ "\2\u0c3f\2\u0c3f\2\u0c5a\2\u0c5c\2\u0c62\2\u0c63\2\u0c82\2\u0c82\2\u0c87"+
+ "\2\u0c8e\2\u0c90\2\u0c92\2\u0c94\2\u0caa\2\u0cac\2\u0cb5\2\u0cb7\2\u0cbb"+
+ "\2\u0cbf\2\u0cbf\2\u0ce0\2\u0ce0\2\u0ce2\2\u0ce3\2\u0cf3\2\u0cf4\2\u0d07"+
+ "\2\u0d0e\2\u0d10\2\u0d12\2\u0d14\2\u0d3c\2\u0d3f\2\u0d3f\2\u0d50\2\u0d50"+
+ "\2\u0d56\2\u0d58\2\u0d61\2\u0d63\2\u0d7c\2\u0d81\2\u0d87\2\u0d98\2\u0d9c"+
+ "\2\u0db3\2\u0db5\2\u0dbd\2\u0dbf\2\u0dbf\2\u0dc2\2\u0dc8\2\u0e03\2\u0e32"+
+ "\2\u0e34\2\u0e35\2\u0e42\2\u0e48\2\u0e83\2\u0e84\2\u0e86\2\u0e86\2\u0e89"+
+ "\2\u0e8a\2\u0e8c\2\u0e8c\2\u0e8f\2\u0e8f\2\u0e96\2\u0e99\2\u0e9b\2\u0ea1"+
+ "\2\u0ea3\2\u0ea5\2\u0ea7\2\u0ea7\2\u0ea9\2\u0ea9\2\u0eac\2\u0ead\2\u0eaf"+
+ "\2\u0eb2\2\u0eb4\2\u0eb5\2\u0ebf\2\u0ebf\2\u0ec2\2\u0ec6\2\u0ec8\2\u0ec8"+
+ "\2\u0ede\2\u0ee1\2\u0f02\2\u0f02\2\u0f42\2\u0f49\2\u0f4b\2\u0f6e\2\u0f8a"+
+ "\2\u0f8e\2\u1002\2\u102c\2\u1041\2\u1041\2\u1052\2\u1057\2\u105c\2\u105f"+
+ "\2\u1063\2\u1063\2\u1067\2\u1068\2\u1070\2\u1072\2\u1077\2\u1083\2\u1090"+
+ "\2\u1090\2\u10a2\2\u10c7\2\u10c9\2\u10c9\2\u10cf\2\u10cf\2\u10d2\2\u10fc"+
+ "\2\u10fe\2\u124a\2\u124c\2\u124f\2\u1252\2\u1258\2\u125a\2\u125a\2\u125c"+
+ "\2\u125f\2\u1262\2\u128a\2\u128c\2\u128f\2\u1292\2\u12b2\2\u12b4\2\u12b7"+
+ "\2\u12ba\2\u12c0\2\u12c2\2\u12c2\2\u12c4\2\u12c7\2\u12ca\2\u12d8\2\u12da"+
+ "\2\u1312\2\u1314\2\u1317\2\u131a\2\u135c\2\u1382\2\u1391\2\u13a2\2\u13f7"+
+ "\2\u13fa\2\u13ff\2\u1403\2\u166e\2\u1671\2\u1681\2\u1683\2\u169c\2\u16a2"+
+ "\2\u16ec\2\u16f3\2\u16fa\2\u1702\2\u170e\2\u1710\2\u1713\2\u1722\2\u1733"+
+ "\2\u1742\2\u1753\2\u1762\2\u176e\2\u1770\2\u1772\2\u1782\2\u17b5\2\u17d9"+
+ "\2\u17d9\2\u17de\2\u17de\2\u1822\2\u1879\2\u1882\2\u1886\2\u1889\2\u18aa"+
+ "\2\u18ac\2\u18ac\2\u18b2\2\u18f7\2\u1902\2\u1920\2\u1952\2\u196f\2\u1972"+
+ "\2\u1976\2\u1982\2\u19ad\2\u19b2\2\u19cb\2\u1a02\2\u1a18\2\u1a22\2\u1a56"+
+ "\2\u1aa9\2\u1aa9\2\u1b07\2\u1b35\2\u1b47\2\u1b4d\2\u1b85\2\u1ba2\2\u1bb0"+
+ "\2\u1bb1\2\u1bbc\2\u1be7\2\u1c02\2\u1c25\2\u1c4f\2\u1c51\2\u1c5c\2\u1c7f"+
+ "\2\u1c82\2\u1c8a\2\u1ceb\2\u1cee\2\u1cf0\2\u1cf3\2\u1cf7\2\u1cf8\2\u1d02"+
+ "\2\u1dc1\2\u1e02\2\u1f17\2\u1f1a\2\u1f1f\2\u1f22\2\u1f47\2\u1f4a\2\u1f4f"+
+ "\2\u1f52\2\u1f59\2\u1f5b\2\u1f5b\2\u1f5d\2\u1f5d\2\u1f5f\2\u1f5f\2\u1f61"+
+ "\2\u1f7f\2\u1f82\2\u1fb6\2\u1fb8\2\u1fbe\2\u1fc0\2\u1fc0\2\u1fc4\2\u1fc6"+
+ "\2\u1fc8\2\u1fce\2\u1fd2\2\u1fd5\2\u1fd8\2\u1fdd\2\u1fe2\2\u1fee\2\u1ff4"+
+ "\2\u1ff6\2\u1ff8\2\u1ffe\2\u2073\2\u2073\2\u2081\2\u2081\2\u2092\2\u209e"+
+ "\2\u2104\2\u2104\2\u2109\2\u2109\2\u210c\2\u2115\2\u2117\2\u2117\2\u211b"+
+ "\2\u211f\2\u2126\2\u2126\2\u2128\2\u2128\2\u212a\2\u212a\2\u212c\2\u212f"+
+ "\2\u2131\2\u213b\2\u213e\2\u2141\2\u2147\2\u214b\2\u2150\2\u2150\2\u2185"+
+ "\2\u2186\2\u2c02\2\u2c30\2\u2c32\2\u2c60\2\u2c62\2\u2ce6\2\u2ced\2\u2cf0"+
+ "\2\u2cf4\2\u2cf5\2\u2d02\2\u2d27\2\u2d29\2\u2d29\2\u2d2f\2\u2d2f\2\u2d32"+
+ "\2\u2d69\2\u2d71\2\u2d71\2\u2d82\2\u2d98\2\u2da2\2\u2da8\2\u2daa\2\u2db0"+
+ "\2\u2db2\2\u2db8\2\u2dba\2\u2dc0\2\u2dc2\2\u2dc8\2\u2dca\2\u2dd0\2\u2dd2"+
+ "\2\u2dd8\2\u2dda\2\u2de0\2\u2e31\2\u2e31\2\u3007\2\u3008\2\u3033\2\u3037"+
+ "\2\u303d\2\u303e\2\u3043\2\u3098\2\u309f\2\u30a1\2\u30a3\2\u30fc\2\u30fe"+
+ "\2\u3101\2\u3107\2\u3130\2\u3133\2\u3190\2\u31a2\2\u31bc\2\u31f2\2\u3201"+
+ "\2\u3402\2\u4db7\2\u4e02\2\u9fec\2\ua002\2\ua48e\2\ua4d2\2\ua4ff\2\ua502"+
+ "\2\ua60e\2\ua612\2\ua621\2\ua62c\2\ua62d\2\ua642\2\ua670\2\ua681\2\ua69f"+
+ "\2\ua6a2\2\ua6e7\2\ua719\2\ua721\2\ua724\2\ua78a\2\ua78d\2\ua7b0\2\ua7b2"+
+ "\2\ua7b9\2\ua7f9\2\ua803\2\ua805\2\ua807\2\ua809\2\ua80c\2\ua80e\2\ua824"+
+ "\2\ua842\2\ua875\2\ua884\2\ua8b5\2\ua8f4\2\ua8f9\2\ua8fd\2\ua8fd\2\ua8ff"+
+ "\2\ua8ff\2\ua90c\2\ua927\2\ua932\2\ua948\2\ua962\2\ua97e\2\ua986\2\ua9b4"+
+ "\2\ua9d1\2\ua9d1\2\ua9e2\2\ua9e6\2\ua9e8\2\ua9f1\2\ua9fc\2\uaa00\2\uaa02"+
+ "\2\uaa2a\2\uaa42\2\uaa44\2\uaa46\2\uaa4d\2\uaa62\2\uaa78\2\uaa7c\2\uaa7c"+
+ "\2\uaa80\2\uaab1\2\uaab3\2\uaab3\2\uaab7\2\uaab8\2\uaabb\2\uaabf\2\uaac2"+
+ "\2\uaac2\2\uaac4\2\uaac4\2\uaadd\2\uaadf\2\uaae2\2\uaaec\2\uaaf4\2\uaaf6"+
+ "\2\uab03\2\uab08\2\uab0b\2\uab10\2\uab13\2\uab18\2\uab22\2\uab28\2\uab2a"+
+ "\2\uab30\2\uab32\2\uab5c\2\uab5e\2\uab67\2\uab72\2\uabe4\2\uac02\2\ud7a5"+
+ "\2\ud7b2\2\ud7c8\2\ud7cd\2\ud7fd\2\uf902\2\ufa6f\2\ufa72\2\ufadb\2\ufb02"+
+ "\2\ufb08\2\ufb15\2\ufb19\2\ufb1f\2\ufb1f\2\ufb21\2\ufb2a\2\ufb2c\2\ufb38"+
+ "\2\ufb3a\2\ufb3e\2\ufb40\2\ufb40\2\ufb42\2\ufb43\2\ufb45\2\ufb46\2\ufb48"+
+ "\2\ufbb3\2\ufbd5\2\ufd3f\2\ufd52\2\ufd91\2\ufd94\2\ufdc9\2\ufdf2\2\ufdfd"+
+ "\2\ufe72\2\ufe76\2\ufe78\2\ufefe\2\uff23\2\uff3c\2\uff43\2\uff5c\2\uff68"+
+ "\2\uffc0\2\uffc4\2\uffc9\2\uffcc\2\uffd1\2\uffd4\2\uffd9\2\uffdc\2\uffde"+
+ "\2\2\3\r\3\17\3(\3*\3<\3>\3?\3A\3O\3R\3_\3\u0082\3\u00fc\3\u0282\3\u029e"+
+ "\3\u02a2\3\u02d2\3\u0302\3\u0321\3\u032f\3\u0342\3\u0344\3\u034b\3\u0352"+
+ "\3\u0377\3\u0382\3\u039f\3\u03a2\3\u03c5\3\u03ca\3\u03d1\3\u0402\3\u049f"+
+ "\3\u04b2\3\u04d5\3\u04da\3\u04fd\3\u0502\3\u0529\3\u0532\3\u0565\3\u0602"+
+ "\3\u0738\3\u0742\3\u0757\3\u0762\3\u0769\3\u0802\3\u0807\3\u080a\3\u080a"+
+ "\3\u080c\3\u0837\3\u0839\3\u083a\3\u083e\3\u083e\3\u0841\3\u0857\3\u0862"+
+ "\3\u0878\3\u0882\3\u08a0\3\u08e2\3\u08f4\3\u08f6\3\u08f7\3\u0902\3\u0917"+
+ "\3\u0922\3\u093b\3\u0982\3\u09b9\3\u09c0\3\u09c1\3\u0a02\3\u0a02\3\u0a12"+
+ "\3\u0a15\3\u0a17\3\u0a19\3\u0a1b\3\u0a35\3\u0a62\3\u0a7e\3\u0a82\3\u0a9e"+
+ "\3\u0ac2\3\u0ac9\3\u0acb\3\u0ae6\3\u0b02\3\u0b37\3\u0b42\3\u0b57\3\u0b62"+
+ "\3\u0b74\3\u0b82\3\u0b93\3\u0c02\3\u0c4a\3\u0c82\3\u0cb4\3\u0cc2\3\u0cf4"+
+ "\3\u1005\3\u1039\3\u1085\3\u10b1\3\u10d2\3\u10ea\3\u1105\3\u1128\3\u1152"+
+ "\3\u1174\3\u1178\3\u1178\3\u1185\3\u11b4\3\u11c3\3\u11c6\3\u11dc\3\u11dc"+
+ "\3\u11de\3\u11de\3\u1202\3\u1213\3\u1215\3\u122d\3\u1282\3\u1288\3\u128a"+
+ "\3\u128a\3\u128c\3\u128f\3\u1291\3\u129f\3\u12a1\3\u12aa\3\u12b2\3\u12e0"+
+ "\3\u1307\3\u130e\3\u1311\3\u1312\3\u1315\3\u132a\3\u132c\3\u1332\3\u1334"+
+ "\3\u1335\3\u1337\3\u133b\3\u133f\3\u133f\3\u1352\3\u1352\3\u135f\3\u1363"+
+ "\3\u1402\3\u1436\3\u1449\3\u144c\3\u1482\3\u14b1\3\u14c6\3\u14c7\3\u14c9"+
+ "\3\u14c9\3\u1582\3\u15b0\3\u15da\3\u15dd\3\u1602\3\u1631\3\u1646\3\u1646"+
+ "\3\u1682\3\u16ac\3\u1702\3\u171b\3\u18a2\3\u18e1\3\u1901\3\u1901\3\u1a02"+
+ "\3\u1a02\3\u1a0d\3\u1a34\3\u1a3c\3\u1a3c\3\u1a52\3\u1a52\3\u1a5e\3\u1a85"+
+ "\3\u1a88\3\u1a8b\3\u1ac2\3\u1afa\3\u1c02\3\u1c0a\3\u1c0c\3\u1c30\3\u1c42"+
+ "\3\u1c42\3\u1c74\3\u1c91\3\u1d02\3\u1d08\3\u1d0a\3\u1d0b\3\u1d0d\3\u1d32"+
+ "\3\u1d48\3\u1d48\3\u2002\3\u239b\3\u2482\3\u2545\3\u3002\3\u3430\3\u4402"+
+ "\3\u4648\3\u6802\3\u6a3a\3\u6a42\3\u6a60\3\u6ad2\3\u6aef\3\u6b02\3\u6b31"+
+ "\3\u6b42\3\u6b45\3\u6b65\3\u6b79\3\u6b7f\3\u6b91\3\u6f02\3\u6f46\3\u6f52"+
+ "\3\u6f52\3\u6f95\3\u6fa1\3\u6fe2\3\u6fe3\3\u7002\3\u87ee\3\u8802\3\u8af4"+
+ "\3\ub002\3\ub120\3\ub172\3\ub2fd\3\ubc02\3\ubc6c\3\ubc72\3\ubc7e\3\ubc82"+
+ "\3\ubc8a\3\ubc92\3\ubc9b\3\ud402\3\ud456\3\ud458\3\ud49e\3\ud4a0\3\ud4a1"+
+ "\3\ud4a4\3\ud4a4\3\ud4a7\3\ud4a8\3\ud4ab\3\ud4ae\3\ud4b0\3\ud4bb\3\ud4bd"+
+ "\3\ud4bd\3\ud4bf\3\ud4c5\3\ud4c7\3\ud507\3\ud509\3\ud50c\3\ud50f\3\ud516"+
+ "\3\ud518\3\ud51e\3\ud520\3\ud53b\3\ud53d\3\ud540\3\ud542\3\ud546\3\ud548"+
+ "\3\ud548\3\ud54c\3\ud552\3\ud554\3\ud6a7\3\ud6aa\3\ud6c2\3\ud6c4\3\ud6dc"+
+ "\3\ud6de\3\ud6fc\3\ud6fe\3\ud716\3\ud718\3\ud736\3\ud738\3\ud750\3\ud752"+
+ "\3\ud770\3\ud772\3\ud78a\3\ud78c\3\ud7aa\3\ud7ac\3\ud7c4\3\ud7c6\3\ud7cd"+
+ "\3\ue802\3\ue8c6\3\ue902\3\ue945\3\uee02\3\uee05\3\uee07\3\uee21\3\uee23"+
+ "\3\uee24\3\uee26\3\uee26\3\uee29\3\uee29\3\uee2b\3\uee34\3\uee36\3\uee39"+
+ "\3\uee3b\3\uee3b\3\uee3d\3\uee3d\3\uee44\3\uee44\3\uee49\3\uee49\3\uee4b"+
+ "\3\uee4b\3\uee4d\3\uee4d\3\uee4f\3\uee51\3\uee53\3\uee54\3\uee56\3\uee56"+
+ "\3\uee59\3\uee59\3\uee5b\3\uee5b\3\uee5d\3\uee5d\3\uee5f\3\uee5f\3\uee61"+
+ "\3\uee61\3\uee63\3\uee64\3\uee66\3\uee66\3\uee69\3\uee6c\3\uee6e\3\uee74"+
+ "\3\uee76\3\uee79\3\uee7b\3\uee7e\3\uee80\3\uee80\3\uee82\3\uee8b\3\uee8d"+
+ "\3\uee9d\3\ueea3\3\ueea5\3\ueea7\3\ueeab\3\ueead\3\ueebd\3\2\4\ua6d8\4"+
+ "\ua702\4\ub736\4\ub742\4\ub81f\4\ub822\4\ucea3\4\uceb2\4\uebe2\4\uf802"+
+ "\4\ufa1f\4\u05ee\2\4\3\2\2\2\2\6\3\2\2\2\2\b\3\2\2\2\2\n\3\2\2\2\2\f\3"+
+ "\2\2\2\2\16\3\2\2\2\2\20\3\2\2\2\2\22\3\2\2\2\2\24\3\2\2\2\2\26\3\2\2"+
+ "\2\2\30\3\2\2\2\2\32\3\2\2\2\2\34\3\2\2\2\2\36\3\2\2\2\2 \3\2\2\2\2\""+
+ "\3\2\2\2\2$\3\2\2\2\2&\3\2\2\2\2(\3\2\2\2\2*\3\2\2\2\2,\3\2\2\2\2.\3\2"+
+ "\2\2\2\60\3\2\2\2\2\62\3\2\2\2\2\64\3\2\2\2\2\66\3\2\2\2\28\3\2\2\2\2"+
+ ":\3\2\2\2\2<\3\2\2\2\2>\3\2\2\2\2@\3\2\2\2\2B\3\2\2\2\2D\3\2\2\2\2F\3"+
+ "\2\2\2\2H\3\2\2\2\2J\3\2\2\2\2L\3\2\2\2\2N\3\2\2\2\2P\3\2\2\2\2R\3\2\2"+
+ "\2\2T\3\2\2\2\2V\3\2\2\2\2X\3\2\2\2\2Z\3\2\2\2\2\\\3\2\2\2\2^\3\2\2\2"+
+ "\2`\3\2\2\2\2b\3\2\2\2\2d\3\2\2\2\2f\3\2\2\2\2h\3\2\2\2\2j\3\2\2\2\2l"+
+ "\3\2\2\2\2n\3\2\2\2\2p\3\2\2\2\2r\3\2\2\2\2t\3\2\2\2\2v\3\2\2\2\2x\3\2"+
+ "\2\2\2z\3\2\2\2\2|\3\2\2\2\2~\3\2\2\2\2\u0080\3\2\2\2\2\u0082\3\2\2\2"+
+ "\2\u0084\3\2\2\2\2\u0086\3\2\2\2\2\u0088\3\2\2\2\2\u008a\3\2\2\2\2\u008c"+
+ "\3\2\2\2\2\u008e\3\2\2\2\2\u0090\3\2\2\2\2\u0092\3\2\2\2\2\u0094\3\2\2"+
+ "\2\2\u0096\3\2\2\2\2\u0098\3\2\2\2\2\u009a\3\2\2\2\2\u009c\3\2\2\2\2\u009e"+
+ "\3\2\2\2\2\u00a0\3\2\2\2\2\u00a2\3\2\2\2\2\u00a4\3\2\2\2\2\u00a6\3\2\2"+
+ "\2\2\u00a8\3\2\2\2\2\u00aa\3\2\2\2\2\u00ac\3\2\2\2\2\u00ae\3\2\2\2\2\u00b0"+
+ "\3\2\2\2\2\u00b2\3\2\2\2\2\u00b4\3\2\2\2\2\u00b6\3\2\2\2\2\u00b8\3\2\2"+
+ "\2\2\u00ba\3\2\2\2\2\u00bc\3\2\2\2\2\u00be\3\2\2\2\2\u00c0\3\2\2\2\2\u00c2"+
+ "\3\2\2\2\2\u00c4\3\2\2\2\2\u00c6\3\2\2\2\2\u00c8\3\2\2\2\2\u00ca\3\2\2"+
+ "\2\2\u00cc\3\2\2\2\2\u00ce\3\2\2\2\2\u00d0\3\2\2\2\2\u00d2\3\2\2\2\2\u00d4"+
+ "\3\2\2\2\2\u00d6\3\2\2\2\2\u00d8\3\2\2\2\2\u00da\3\2\2\2\2\u00dc\3\2\2"+
+ "\2\2\u00de\3\2\2\2\2\u00e0\3\2\2\2\2\u00e2\3\2\2\2\2\u00e4\3\2\2\2\2\u00e6"+
+ "\3\2\2\2\2\u00e8\3\2\2\2\2\u00ea\3\2\2\2\2\u00ec\3\2\2\2\2\u00ee\3\2\2"+
+ "\2\2\u00f0\3\2\2\2\2\u00f2\3\2\2\2\2\u00f4\3\2\2\2\2\u00f6\3\2\2\2\2\u00f8"+
+ "\3\2\2\2\2\u00fa\3\2\2\2\2\u00fc\3\2\2\2\2\u00fe\3\2\2\2\2\u0100\3\2\2"+
+ "\2\2\u0102\3\2\2\2\2\u0104\3\2\2\2\2\u0106\3\2\2\2\2\u0108\3\2\2\2\2\u010a"+
+ "\3\2\2\2\2\u010c\3\2\2\2\2\u010e\3\2\2\2\2\u0110\3\2\2\2\2\u0112\3\2\2"+
+ "\2\2\u0114\3\2\2\2\2\u0116\3\2\2\2\2\u0118\3\2\2\2\2\u011e\3\2\2\2\2\u0122"+
+ "\3\2\2\2\2\u0124\3\2\2\2\2\u0126\3\2\2\2\2\u0128\3\2\2\2\2\u012a\3\2\2"+
+ "\2\2\u012c\3\2\2\2\2\u012e\3\2\2\2\2\u0130\3\2\2\2\2\u0132\3\2\2\2\2\u0134"+
+ "\3\2\2\2\2\u0136\3\2\2\2\2\u0138\3\2\2\2\3\u014e\3\2\2\2\3\u0150\3\2\2"+
+ "\2\3\u0152\3\2\2\2\3\u0154\3\2\2\2\3\u0156\3\2\2\2\4\u015a\3\2\2\2\6\u0170"+
+ "\3\2\2\2\b\u0172\3\2\2\2\n\u0179\3\2\2\2\f\u0181\3\2\2\2\16\u0188\3\2"+
+ "\2\2\20\u018f\3\2\2\2\22\u0196\3\2\2\2\24\u019d\3\2\2\2\26\u01a6\3\2\2"+
+ "\2\30\u01b0\3\2\2\2\32\u01b8\3\2\2\2\34\u01c2\3\2\2\2\36\u01ce\3\2\2\2"+
+ " \u01d5\3\2\2\2\"\u01e0\3\2\2\2$\u01e3\3\2\2\2&\u01e9\3\2\2\2(\u01f2\3"+
+ "\2\2\2*\u01f7\3\2\2\2,\u01fe\3\2\2\2.\u0205\3\2\2\2\60\u020b\3\2\2\2\62"+
+ "\u0210\3\2\2\2\64\u0217\3\2\2\2\66\u0221\3\2\2\28\u0227\3\2\2\2:\u022a"+
+ "\3\2\2\2<\u022c\3\2\2\2>\u0233\3\2\2\2@\u0239\3\2\2\2B\u0246\3\2\2\2D"+
+ "\u024f\3\2\2\2F\u0253\3\2\2\2H\u0257\3\2\2\2J\u025d\3\2\2\2L\u025f\3\2"+
+ "\2\2N\u0262\3\2\2\2P\u0267\3\2\2\2R\u026d\3\2\2\2T\u0273\3\2\2\2V\u027a"+
+ "\3\2\2\2X\u0281\3\2\2\2Z\u028a\3\2\2\2\\\u0290\3\2\2\2^\u0296\3\2\2\2"+
+ "`\u029d\3\2\2\2b\u02a3\3\2\2\2d\u02aa\3\2\2\2f\u02b0\3\2\2\2h\u02b9\3"+
+ "\2\2\2j\u02c1\3\2\2\2l\u02c8\3\2\2\2n\u02cd\3\2\2\2p\u02d6\3\2\2\2r\u02e5"+
+ "\3\2\2\2t\u02eb\3\2\2\2v\u02ef\3\2\2\2x\u02f2\3\2\2\2z\u02f9\3\2\2\2|"+
+ "\u0303\3\2\2\2~\u030d\3\2\2\2\u0080\u0319\3\2\2\2\u0082\u0322\3\2\2\2"+
+ "\u0084\u032c\3\2\2\2\u0086\u0334\3\2\2\2\u0088\u0340\3\2\2\2\u008a\u034f"+
+ "\3\2\2\2\u008c\u0355\3\2\2\2\u008e\u0359\3\2\2\2\u0090\u035d\3\2\2\2\u0092"+
+ "\u0362\3\2\2\2\u0094\u036a\3\2\2\2\u0096\u0372\3\2\2\2\u0098\u0377\3\2"+
+ "\2\2\u009a\u0381\3\2\2\2\u009c\u0388\3\2\2\2\u009e\u038d\3\2\2\2\u00a0"+
+ "\u0393\3\2\2\2\u00a2\u0396\3\2\2\2\u00a4\u039a\3\2\2\2\u00a6\u03a1\3\2"+
+ "\2\2\u00a8\u03a6\3\2\2\2\u00aa\u03ab\3\2\2\2\u00ac\u03b0\3\2\2\2\u00ae"+
+ "\u03b8\3\2\2\2\u00b0\u03bf\3\2\2\2\u00b2\u03c5\3\2\2\2\u00b4\u03d3\3\2"+
+ "\2\2\u00b6\u03d6\3\2\2\2\u00b8\u03dc\3\2\2\2\u00ba\u03e1\3\2\2\2\u00bc"+
+ "\u03ec\3\2\2\2\u00be\u03f0\3\2\2\2\u00c0\u03f7\3\2\2\2\u00c2\u0400\3\2"+
+ "\2\2\u00c4\u0404\3\2\2\2\u00c6\u040a\3\2\2\2\u00c8\u0414\3\2\2\2\u00ca"+
+ "\u0416\3\2\2\2\u00cc\u041a\3\2\2\2\u00ce\u041c\3\2\2\2\u00d0\u0420\3\2"+
+ "\2\2\u00d2\u0422\3\2\2\2\u00d4\u0426\3\2\2\2\u00d6\u0428\3\2\2\2\u00d8"+
+ "\u042a\3\2\2\2\u00da\u042c\3\2\2\2\u00dc\u042e\3\2\2\2\u00de\u0430\3\2"+
+ "\2\2\u00e0\u0435\3\2\2\2\u00e2\u043a\3\2\2\2\u00e4\u043d\3\2\2\2\u00e6"+
+ "\u0441\3\2\2\2\u00e8\u0444\3\2\2\2\u00ea\u0447\3\2\2\2\u00ec\u044a\3\2"+
+ "\2\2\u00ee\u044d\3\2\2\2\u00f0\u044f\3\2\2\2\u00f2\u0452\3\2\2\2\u00f4"+
+ "\u0454\3\2\2\2\u00f6\u0457\3\2\2\2\u00f8\u0459\3\2\2\2\u00fa\u045b\3\2"+
+ "\2\2\u00fc\u045d\3\2\2\2\u00fe\u0460\3\2\2\2\u0100\u0463\3\2\2\2\u0102"+
+ "\u0466\3\2\2\2\u0104\u0468\3\2\2\2\u0106\u046a\3\2\2\2\u0108\u046c\3\2"+
+ "\2\2\u010a\u046e\3\2\2\2\u010c\u0470\3\2\2\2\u010e\u0472\3\2\2\2\u0110"+
+ "\u0480\3\2\2\2\u0112\u0484\3\2\2\2\u0114\u0490\3\2\2\2\u0116\u049e\3\2"+
+ "\2\2\u0118\u04aa\3\2\2\2\u011a\u04ce\3\2\2\2\u011c\u04d0\3\2\2\2\u011e"+
+ "\u04d9\3\2\2\2\u0120\u04df\3\2\2\2\u0122\u04e6\3\2\2\2\u0124\u04ec\3\2"+
+ "\2\2\u0126\u04ee\3\2\2\2\u0128\u04f3\3\2\2\2\u012a\u04f8\3\2\2\2\u012c"+
+ "\u04ff\3\2\2\2\u012e\u050a\3\2\2\2\u0130\u0515\3\2\2\2\u0132\u0522\3\2"+
+ "\2\2\u0134\u0528\3\2\2\2\u0136\u0537\3\2\2\2\u0138\u053d\3\2\2\2\u013a"+
+ "\u054c\3\2\2\2\u013c\u054e\3\2\2\2\u013e\u056a\3\2\2\2\u0140\u0574\3\2"+
+ "\2\2\u0142\u0576\3\2\2\2\u0144\u0578\3\2\2\2\u0146\u057a\3\2\2\2\u0148"+
+ "\u0582\3\2\2\2\u014a\u0584\3\2\2\2\u014c\u0586\3\2\2\2\u014e\u0589\3\2"+
+ "\2\2\u0150\u058f\3\2\2\2\u0152\u059d\3\2\2\2\u0154\u05ba\3\2\2\2\u0156"+
+ "\u05be\3\2\2\2\u0158\u015b\5\6\3\2\u0159\u015b\5\u0118\u008c\2\u015a\u0158"+
+ "\3\2\2\2\u015a\u0159\3\2\2\2\u015b\u015c\3\2\2\2\u015c\u015d\b\2\2\2\u015d"+
+ "\5\3\2\2\2\u015e\u0168\5\u013e\u009f\2\u015f\u0160\7\60\2\2\u0160\u0162"+
+ "\6\3\2\2\u0161\u0163\5\u013e\u009f\2\u0162\u0161\3\2\2\2\u0162\u0163\3"+
+ "\2\2\2\u0163\u0165\3\2\2\2\u0164\u0166\5\u0146\u00a3\2\u0165\u0164\3\2"+
+ "\2\2\u0165\u0166\3\2\2\2\u0166\u0169\3\2\2\2\u0167\u0169\5\u0146\u00a3"+
+ "\2\u0168\u015f\3\2\2\2\u0168\u0167\3\2\2\2\u0169\u0171\3\2\2\2\u016a\u016b"+
+ "\7\60\2\2\u016b\u016c\6\3\3\2\u016c\u016e\5\u013e\u009f\2\u016d\u016f"+
+ "\5\u0146\u00a3\2\u016e\u016d\3\2\2\2\u016e\u016f\3\2\2\2\u016f\u0171\3"+
+ "\2\2\2\u0170\u015e\3\2\2\2\u0170\u016a\3\2\2\2\u0171\7\3\2\2\2\u0172\u0173"+
+ "\7v\2\2\u0173\u0174\7t\2\2\u0174\u0175\7w\2\2\u0175\u0176\7g\2\2\u0176"+
+ "\u0177\3\2\2\2\u0177\u0178\b\4\2\2\u0178\t\3\2\2\2\u0179\u017a\7h\2\2"+
+ "\u017a\u017b\7c\2\2\u017b\u017c\7n\2\2\u017c\u017d\7u\2\2\u017d\u017e"+
+ "\7g\2\2\u017e\u017f\3\2\2\2\u017f\u0180\b\5\2\2\u0180\13\3\2\2\2\u0181"+
+ "\u0182\7c\2\2\u0182\u0183\7u\2\2\u0183\u0184\7u\2\2\u0184\u0185\7g\2\2"+
+ "\u0185\u0186\7t\2\2\u0186\u0187\7v\2\2\u0187\r\3\2\2\2\u0188\u0189\7c"+
+ "\2\2\u0189\u018a\7u\2\2\u018a\u018b\7u\2\2\u018b\u018c\7w\2\2\u018c\u018d"+
+ "\7o\2\2\u018d\u018e\7g\2\2\u018e\17\3\2\2\2\u018f\u0190\7k\2\2\u0190\u0191"+
+ "\7p\2\2\u0191\u0192\7j\2\2\u0192\u0193\7c\2\2\u0193\u0194\7n\2\2\u0194"+
+ "\u0195\7g\2\2\u0195\21\3\2\2\2\u0196\u0197\7g\2\2\u0197\u0198\7z\2\2\u0198"+
+ "\u0199\7j\2\2\u0199\u019a\7c\2\2\u019a\u019b\7n\2\2\u019b\u019c\7g\2\2"+
+ "\u019c\23\3\2\2\2\u019d\u019e\7t\2\2\u019e\u019f\7g\2\2\u019f\u01a0\7"+
+ "s\2\2\u01a0\u01a1\7w\2\2\u01a1\u01a2\7k\2\2\u01a2\u01a3\7t\2\2\u01a3\u01a4"+
+ "\7g\2\2\u01a4\u01a5\7u\2\2\u01a5\25\3\2\2\2\u01a6\u01a7\7r\2\2\u01a7\u01a8"+
+ "\7t\2\2\u01a8\u01a9\7g\2\2\u01a9\u01aa\7u\2\2\u01aa\u01ab\7g\2\2\u01ab"+
+ "\u01ac\7t\2\2\u01ac\u01ad\7x\2\2\u01ad\u01ae\7g\2\2\u01ae\u01af\7u\2\2"+
+ "\u01af\27\3\2\2\2\u01b0\u01b1\7g\2\2\u01b1\u01b2\7p\2\2\u01b2\u01b3\7"+
+ "u\2\2\u01b3\u01b4\7w\2\2\u01b4\u01b5\7t\2\2\u01b5\u01b6\7g\2\2\u01b6\u01b7"+
+ "\7u\2\2\u01b7\31\3\2\2\2\u01b8\u01b9\7k\2\2\u01b9\u01ba\7p\2\2\u01ba\u01bb"+
+ "\7x\2\2\u01bb\u01bc\7c\2\2\u01bc\u01bd\7t\2\2\u01bd\u01be\7k\2\2\u01be"+
+ "\u01bf\7c\2\2\u01bf\u01c0\7p\2\2\u01c0\u01c1\7v\2\2\u01c1\33\3\2\2\2\u01c2"+
+ "\u01c3\7f\2\2\u01c3\u01c4\7g\2\2\u01c4\u01c5\7e\2\2\u01c5\u01c6\7t\2\2"+
+ "\u01c6\u01c7\7g\2\2\u01c7\u01c8\7c\2\2\u01c8\u01c9\7u\2\2\u01c9\u01ca"+
+ "\7g\2\2\u01ca\u01cb\7u\2\2\u01cb\u01cc\3\2\2\2\u01cc\u01cd\b\16\2\2\u01cd"+
+ "\35\3\2\2\2\u01ce\u01cf\7r\2\2\u01cf\u01d0\7w\2\2\u01d0\u01d1\7t\2\2\u01d1"+
+ "\u01d2\7g\2\2\u01d2\u01d3\3\2\2\2\u01d3\u01d4\b\17\2\2\u01d4\37\3\2\2"+
+ "\2\u01d5\u01d6\7k\2\2\u01d6\u01d7\7o\2\2\u01d7\u01d8\7r\2\2\u01d8\u01d9"+
+ "\7n\2\2\u01d9\u01da\7g\2\2\u01da\u01db\7o\2\2\u01db\u01dc\7g\2\2\u01dc"+
+ "\u01dd\7p\2\2\u01dd\u01de\7v\2\2\u01de\u01df\7u\2\2\u01df!\3\2\2\2\u01e0"+
+ "\u01e1\7c\2\2\u01e1\u01e2\7u\2\2\u01e2#\3\2\2\2\u01e3\u01e4\7q\2\2\u01e4"+
+ "\u01e5\7n\2\2\u01e5\u01e6\7f\2\2\u01e6\u01e7\3\2\2\2\u01e7\u01e8\b\22"+
+ "\2\2\u01e8%\3\2\2\2\u01e9\u01ea\7d\2\2\u01ea\u01eb\7g\2\2\u01eb\u01ec"+
+ "\7h\2\2\u01ec\u01ed\7q\2\2\u01ed\u01ee\7t\2\2\u01ee\u01ef\7g\2\2\u01ef"+
+ "\u01f0\3\2\2\2\u01f0\u01f1\b\23\2\2\u01f1\'\3\2\2\2\u01f2\u01f3\7%\2\2"+
+ "\u01f3\u01f4\7n\2\2\u01f4\u01f5\7j\2\2\u01f5\u01f6\7u\2\2\u01f6)\3\2\2"+
+ "\2\u01f7\u01f8\7h\2\2\u01f8\u01f9\7q\2\2\u01f9\u01fa\7t\2\2\u01fa\u01fb"+
+ "\7c\2\2\u01fb\u01fc\7n\2\2\u01fc\u01fd\7n\2\2\u01fd+\3\2\2\2\u01fe\u01ff"+
+ "\7g\2\2\u01ff\u0200\7z\2\2\u0200\u0201\7k\2\2\u0201\u0202\7u\2\2\u0202"+
+ "\u0203\7v\2\2\u0203\u0204\7u\2\2\u0204-\3\2\2\2\u0205\u0206\7c\2\2\u0206"+
+ "\u0207\7e\2\2\u0207\u0208\7e\2\2\u0208\u0209\3\2\2\2\u0209\u020a\b\27"+
+ "\2\2\u020a/\3\2\2\2\u020b\u020c\7h\2\2\u020c\u020d\7q\2\2\u020d\u020e"+
+ "\7n\2\2\u020e\u020f\7f\2\2\u020f\61\3\2\2\2\u0210\u0211\7w\2\2\u0211\u0212"+
+ "\7p\2\2\u0212\u0213\7h\2\2\u0213\u0214\7q\2\2\u0214\u0215\7n\2\2\u0215"+
+ "\u0216\7f\2\2\u0216\63\3\2\2\2\u0217\u0218\7w\2\2\u0218\u0219\7p\2\2\u0219"+
+ "\u021a\7h\2\2\u021a\u021b\7q\2\2\u021b\u021c\7n\2\2\u021c\u021d\7f\2\2"+
+ "\u021d\u021e\7k\2\2\u021e\u021f\7p\2\2\u021f\u0220\7i\2\2\u0220\65\3\2"+
+ "\2\2\u0221\u0222\7i\2\2\u0222\u0223\7j\2\2\u0223\u0224\7q\2\2\u0224\u0225"+
+ "\7u\2\2\u0225\u0226\7v\2\2\u0226\67\3\2\2\2\u0227\u0228\7k\2\2\u0228\u0229"+
+ "\7p\2\2\u02299\3\2\2\2\u022a\u022b\7%\2\2\u022b;\3\2\2\2\u022c\u022d\7"+
+ "u\2\2\u022d\u022e\7w\2\2\u022e\u022f\7d\2\2\u022f\u0230\7u\2\2\u0230\u0231"+
+ "\7g\2\2\u0231\u0232\7v\2\2\u0232=\3\2\2\2\u0233\u0234\7w\2\2\u0234\u0235"+
+ "\7p\2\2\u0235\u0236\7k\2\2\u0236\u0237\7q\2\2\u0237\u0238\7p\2\2\u0238"+
+ "?\3\2\2\2\u0239\u023a\7k\2\2\u023a\u023b\7p\2\2\u023b\u023c\7v\2\2\u023c"+
+ "\u023d\7g\2\2\u023d\u023e\7t\2\2\u023e\u023f\7u\2\2\u023f\u0240\7g\2\2"+
+ "\u0240\u0241\7e\2\2\u0241\u0242\7v\2\2\u0242\u0243\7k\2\2\u0243\u0244"+
+ "\7q\2\2\u0244\u0245\7p\2\2\u0245A\3\2\2\2\u0246\u0247\7u\2\2\u0247\u0248"+
+ "\7g\2\2\u0248\u0249\7v\2\2\u0249\u024a\7o\2\2\u024a\u024b\7k\2\2\u024b"+
+ "\u024c\7p\2\2\u024c\u024d\7w\2\2\u024d\u024e\7u\2\2\u024eC\3\2\2\2\u024f"+
+ "\u0250\7?\2\2\u0250\u0251\7?\2\2\u0251\u0252\7@\2\2\u0252E\3\2\2\2\u0253"+
+ "\u0254\7/\2\2\u0254\u0255\7/\2\2\u0255\u0256\7,\2\2\u0256G\3\2\2\2\u0257"+
+ "\u0258\7c\2\2\u0258\u0259\7r\2\2\u0259\u025a\7r\2\2\u025a\u025b\7n\2\2"+
+ "\u025b\u025c\7{\2\2\u025cI\3\2\2\2\u025d\u025e\7A\2\2\u025eK\3\2\2\2\u025f"+
+ "\u0260\7#\2\2\u0260\u0261\7>\2\2\u0261M\3\2\2\2\u0262\u0263\7#\2\2\u0263"+
+ "\u0264\7@\2\2\u0264\u0265\3\2\2\2\u0265\u0266\b\'\2\2\u0266O\3\2\2\2\u0267"+
+ "\u0268\7u\2\2\u0268\u0269\7g\2\2\u0269\u026a\7s\2\2\u026a\u026b\3\2\2"+
+ "\2\u026b\u026c\b(\2\2\u026cQ\3\2\2\2\u026d\u026e\7u\2\2\u026e\u026f\7"+
+ "g\2\2\u026f\u0270\7v\2\2\u0270\u0271\3\2\2\2\u0271\u0272\b)\2\2\u0272"+
+ "S\3\2\2\2\u0273\u0274\7o\2\2\u0274\u0275\7u\2\2\u0275\u0276\7g\2\2\u0276"+
+ "\u0277\7v\2\2\u0277\u0278\3\2\2\2\u0278\u0279\b*\2\2\u0279U\3\2\2\2\u027a"+
+ "\u027b\7f\2\2\u027b\u027c\7k\2\2\u027c\u027d\7e\2\2\u027d\u027e\7v\2\2"+
+ "\u027e\u027f\3\2\2\2\u027f\u0280\b+\2\2\u0280W\3\2\2\2\u0281\u0282\7q"+
+ "\2\2\u0282\u0283\7r\2\2\u0283\u0284\7v\2\2\u0284\u0285\7k\2\2\u0285\u0286"+
+ "\7q\2\2\u0286\u0287\7p\2\2\u0287\u0288\3\2\2\2\u0288\u0289\b,\2\2\u0289"+
+ "Y\3\2\2\2\u028a\u028b\7n\2\2\u028b\u028c\7g\2\2\u028c\u028d\7p\2\2\u028d"+
+ "\u028e\3\2\2\2\u028e\u028f\b-\2\2\u028f[\3\2\2\2\u0290\u0291\7p\2\2\u0291"+
+ "\u0292\7g\2\2\u0292\u0293\7y\2\2\u0293\u0294\3\2\2\2\u0294\u0295\b.\2"+
+ "\2\u0295]\3\2\2\2\u0296\u0297\7o\2\2\u0297\u0298\7c\2\2\u0298\u0299\7"+
+ "m\2\2\u0299\u029a\7g\2\2\u029a\u029b\3\2\2\2\u029b\u029c\b/\2\2\u029c"+
+ "_\3\2\2\2\u029d\u029e\7e\2\2\u029e\u029f\7c\2\2\u029f\u02a0\7r\2\2\u02a0"+
+ "\u02a1\3\2\2\2\u02a1\u02a2\b\60\2\2\u02a2a\3\2\2\2\u02a3\u02a4\7u\2\2"+
+ "\u02a4\u02a5\7q\2\2\u02a5\u02a6\7o\2\2\u02a6\u02a7\7g\2\2\u02a7\u02a8"+
+ "\3\2\2\2\u02a8\u02a9\b\61\2\2\u02a9c\3\2\2\2\u02aa\u02ab\7i\2\2\u02ab"+
+ "\u02ac\7g\2\2\u02ac\u02ad\7v\2\2\u02ad\u02ae\3\2\2\2\u02ae\u02af\b\62"+
+ "\2\2\u02afe\3\2\2\2\u02b0\u02b1\7f\2\2\u02b1\u02b2\7q\2\2\u02b2\u02b3"+
+ "\7o\2\2\u02b3\u02b4\7c\2\2\u02b4\u02b5\7k\2\2\u02b5\u02b6\7p\2\2\u02b6"+
+ "\u02b7\3\2\2\2\u02b7\u02b8\b\63\2\2\u02b8g\3\2\2\2\u02b9\u02ba\7c\2\2"+
+ "\u02ba\u02bb\7z\2\2\u02bb\u02bc\7k\2\2\u02bc\u02bd\7q\2\2\u02bd\u02be"+
+ "\7o\2\2\u02be\u02bf\3\2\2\2\u02bf\u02c0\b\64\2\2\u02c0i\3\2\2\2\u02c1"+
+ "\u02c2\7p\2\2\u02c2\u02c3\7q\2\2\u02c3\u02c4\7p\2\2\u02c4\u02c5\7g\2\2"+
+ "\u02c5\u02c6\3\2\2\2\u02c6\u02c7\b\65\2\2\u02c7k\3\2\2\2\u02c8\u02c9\7"+
+ "r\2\2\u02c9\u02ca\7t\2\2\u02ca\u02cb\7g\2\2\u02cb\u02cc\7f\2\2\u02ccm"+
+ "\3\2\2\2\u02cd\u02ce\7v\2\2\u02ce\u02cf\7{\2\2\u02cf\u02d0\7r\2\2\u02d0"+
+ "\u02d1\7g\2\2\u02d1\u02d2\7Q\2\2\u02d2\u02d3\7h\2\2\u02d3\u02d4\3\2\2"+
+ "\2\u02d4\u02d5\b\67\2\2\u02d5o\3\2\2\2\u02d6\u02d7\7k\2\2\u02d7\u02d8"+
+ "\7u\2\2\u02d8\u02d9\7E\2\2\u02d9\u02da\7q\2\2\u02da\u02db\7o\2\2\u02db"+
+ "\u02dc\7r\2\2\u02dc\u02dd\7c\2\2\u02dd\u02de\7t\2\2\u02de\u02df\7c\2\2"+
+ "\u02df\u02e0\7d\2\2\u02e0\u02e1\7n\2\2\u02e1\u02e2\7g\2\2\u02e2\u02e3"+
+ "\3\2\2\2\u02e3\u02e4\b8\2\2\u02e4q\3\2\2\2\u02e5\u02e6\7u\2\2\u02e6\u02e7"+
+ "\7j\2\2\u02e7\u02e8\7c\2\2\u02e8\u02e9\7t\2\2\u02e9\u02ea\7g\2\2\u02ea"+
+ "s\3\2\2\2\u02eb\u02ec\7B\2\2\u02ec\u02ed\3\2\2\2\u02ed\u02ee\b:\2\2\u02ee"+
+ "u\3\2\2\2\u02ef\u02f0\7\60\2\2\u02f0\u02f1\7\60\2\2\u02f1w\3\2\2\2\u02f2"+
+ "\u02f3\7u\2\2\u02f3\u02f4\7j\2\2\u02f4\u02f5\7c\2\2\u02f5\u02f6\7t\2\2"+
+ "\u02f6\u02f7\7g\2\2\u02f7\u02f8\7f\2\2\u02f8y\3\2\2\2\u02f9\u02fa\7g\2"+
+ "\2\u02fa\u02fb\7z\2\2\u02fb\u02fc\7e\2\2\u02fc\u02fd\7n\2\2\u02fd\u02fe"+
+ "\7w\2\2\u02fe\u02ff\7u\2\2\u02ff\u0300\7k\2\2\u0300\u0301\7x\2\2\u0301"+
+ "\u0302\7g\2\2\u0302{\3\2\2\2\u0303\u0304\7r\2\2\u0304\u0305\7t\2\2\u0305"+
+ "\u0306\7g\2\2\u0306\u0307\7f\2\2\u0307\u0308\7k\2\2\u0308\u0309\7e\2\2"+
+ "\u0309\u030a\7c\2\2\u030a\u030b\7v\2\2\u030b\u030c\7g\2\2\u030c}\3\2\2"+
+ "\2\u030d\u030e\7y\2\2\u030e\u030f\7t\2\2\u030f\u0310\7k\2\2\u0310\u0311"+
+ "\7v\2\2\u0311\u0312\7g\2\2\u0312\u0313\7R\2\2\u0313\u0314\7g\2\2\u0314"+
+ "\u0315\7t\2\2\u0315\u0316\7o\2\2\u0316\u0317\3\2\2\2\u0317\u0318\b?\2"+
+ "\2\u0318\177\3\2\2\2\u0319\u031a\7p\2\2\u031a\u031b\7q\2\2\u031b\u031c"+
+ "\7R\2\2\u031c\u031d\7g\2\2\u031d\u031e\7t\2\2\u031e\u031f\7o\2\2\u031f"+
+ "\u0320\3\2\2\2\u0320\u0321\b@\2\2\u0321\u0081\3\2\2\2\u0322\u0323\7v\2"+
+ "\2\u0323\u0324\7t\2\2\u0324\u0325\7w\2\2\u0325\u0326\7u\2\2\u0326\u0327"+
+ "\7v\2\2\u0327\u0328\7g\2\2\u0328\u0329\7f\2\2\u0329\u032a\3\2\2\2\u032a"+
+ "\u032b\bA\2\2\u032b\u0083\3\2\2\2\u032c\u032d\7q\2\2\u032d\u032e\7w\2"+
+ "\2\u032e\u032f\7v\2\2\u032f\u0330\7n\2\2\u0330\u0331\7k\2\2\u0331\u0332"+
+ "\7p\2\2\u0332\u0333\7g\2\2\u0333\u0085\3\2\2\2\u0334\u0335\7k\2\2\u0335"+
+ "\u0336\7p\2\2\u0336\u0337\7k\2\2\u0337\u0338\7v\2\2\u0338\u0339\7G\2\2"+
+ "\u0339\u033a\7p\2\2\u033a\u033b\7u\2\2\u033b\u033c\7w\2\2\u033c\u033d"+
+ "\7t\2\2\u033d\u033e\7g\2\2\u033e\u033f\7u\2\2\u033f\u0087\3\2\2\2\u0340"+
+ "\u0341\7k\2\2\u0341\u0342\7o\2\2\u0342\u0343\7r\2\2\u0343\u0344\7q\2\2"+
+ "\u0344\u0345\7t\2\2\u0345\u0346\7v\2\2\u0346\u0347\7T\2\2\u0347\u0348"+
+ "\7g\2\2\u0348\u0349\7s\2\2\u0349\u034a\7w\2\2\u034a\u034b\7k\2\2\u034b"+
+ "\u034c\7t\2\2\u034c\u034d\7g\2\2\u034d\u034e\7u\2\2\u034e\u0089\3\2\2"+
+ "\2\u034f\u0350\7r\2\2\u0350\u0351\7t\2\2\u0351\u0352\7q\2\2\u0352\u0353"+
+ "\7q\2\2\u0353\u0354\7h\2\2\u0354\u008b\3\2\2\2\u0355\u0356\7?\2\2\u0356"+
+ "\u0357\7?\2\2\u0357\u0358\7?\2\2\u0358\u008d\3\2\2\2\u0359\u035a\7#\2"+
+ "\2\u035a\u035b\7?\2\2\u035b\u035c\7?\2\2\u035c\u008f\3\2\2\2\u035d\u035e"+
+ "\7y\2\2\u035e\u035f\7k\2\2\u035f\u0360\7v\2\2\u0360\u0361\7j\2\2\u0361"+
+ "\u0091\3\2\2\2\u0362\u0363\7d\2\2\u0363\u0364\7t\2\2\u0364\u0365\7g\2"+
+ "\2\u0365\u0366\7c\2\2\u0366\u0367\7m\2\2\u0367\u0368\3\2\2\2\u0368\u0369"+
+ "\bI\2\2\u0369\u0093\3\2\2\2\u036a\u036b\7f\2\2\u036b\u036c\7g\2\2\u036c"+
+ "\u036d\7h\2\2\u036d\u036e\7c\2\2\u036e\u036f\7w\2\2\u036f\u0370\7n\2\2"+
+ "\u0370\u0371\7v\2\2\u0371\u0095\3\2\2\2\u0372\u0373\7h\2\2\u0373\u0374"+
+ "\7w\2\2\u0374\u0375\7p\2\2\u0375\u0376\7e\2\2\u0376\u0097\3\2\2\2\u0377"+
+ "\u0378\7k\2\2\u0378\u0379\7p\2\2\u0379\u037a\7v\2\2\u037a\u037b\7g\2\2"+
+ "\u037b\u037c\7t\2\2\u037c\u037d\7h\2\2\u037d\u037e\7c\2\2\u037e\u037f"+
+ "\7e\2\2\u037f\u0380\7g\2\2\u0380\u0099\3\2\2\2\u0381\u0382\7u\2\2\u0382"+
+ "\u0383\7g\2\2\u0383\u0384\7n\2\2\u0384\u0385\7g\2\2\u0385\u0386\7e\2\2"+
+ "\u0386\u0387\7v\2\2\u0387\u009b\3\2\2\2\u0388\u0389\7e\2\2\u0389\u038a"+
+ "\7c\2\2\u038a\u038b\7u\2\2\u038b\u038c\7g\2\2\u038c\u009d\3\2\2\2\u038d"+
+ "\u038e\7f\2\2\u038e\u038f\7g\2\2\u038f\u0390\7h\2\2\u0390\u0391\7g\2\2"+
+ "\u0391\u0392\7t\2\2\u0392\u009f\3\2\2\2\u0393\u0394\7i\2\2\u0394\u0395"+
+ "\7q\2\2\u0395\u00a1\3\2\2\2\u0396\u0397\7o\2\2\u0397\u0398\7c\2\2\u0398"+
+ "\u0399\7r\2\2\u0399\u00a3\3\2\2\2\u039a\u039b\7u\2\2\u039b\u039c\7v\2"+
+ "\2\u039c\u039d\7t\2\2\u039d\u039e\7w\2\2\u039e\u039f\7e\2\2\u039f\u03a0"+
+ "\7v\2\2\u03a0\u00a5\3\2\2\2\u03a1\u03a2\7e\2\2\u03a2\u03a3\7j\2\2\u03a3"+
+ "\u03a4\7c\2\2\u03a4\u03a5\7p\2\2\u03a5\u00a7\3\2\2\2\u03a6\u03a7\7g\2"+
+ "\2\u03a7\u03a8\7n\2\2\u03a8\u03a9\7u\2\2\u03a9\u03aa\7g\2\2\u03aa\u00a9"+
+ "\3\2\2\2\u03ab\u03ac\7i\2\2\u03ac\u03ad\7q\2\2\u03ad\u03ae\7v\2\2\u03ae"+
+ "\u03af\7q\2\2\u03af\u00ab\3\2\2\2\u03b0\u03b1\7r\2\2\u03b1\u03b2\7c\2"+
+ "\2\u03b2\u03b3\7e\2\2\u03b3\u03b4\7m\2\2\u03b4\u03b5\7c\2\2\u03b5\u03b6"+
+ "\7i\2\2\u03b6\u03b7\7g\2\2\u03b7\u00ad\3\2\2\2\u03b8\u03b9\7u\2\2\u03b9"+
+ "\u03ba\7y\2\2\u03ba\u03bb\7k\2\2\u03bb\u03bc\7v\2\2\u03bc\u03bd\7e\2\2"+
+ "\u03bd\u03be\7j\2\2\u03be\u00af\3\2\2\2\u03bf\u03c0\7e\2\2\u03c0\u03c1"+
+ "\7q\2\2\u03c1\u03c2\7p\2\2\u03c2\u03c3\7u\2\2\u03c3\u03c4\7v\2\2\u03c4"+
+ "\u00b1\3\2\2\2\u03c5\u03c6\7h\2\2\u03c6\u03c7\7c\2\2\u03c7\u03c8\7n\2"+
+ "\2\u03c8\u03c9\7n\2\2\u03c9\u03ca\7v\2\2\u03ca\u03cb\7j\2\2\u03cb\u03cc"+
+ "\7t\2\2\u03cc\u03cd\7q\2\2\u03cd\u03ce\7w\2\2\u03ce\u03cf\7i\2\2\u03cf"+
+ "\u03d0\7j\2\2\u03d0\u03d1\3\2\2\2\u03d1\u03d2\bY\2\2\u03d2\u00b3\3\2\2"+
+ "\2\u03d3\u03d4\7k\2\2\u03d4\u03d5\7h\2\2\u03d5\u00b5\3\2\2\2\u03d6\u03d7"+
+ "\7t\2\2\u03d7\u03d8\7c\2\2\u03d8\u03d9\7p\2\2\u03d9\u03da\7i\2\2\u03da"+
+ "\u03db\7g\2\2\u03db\u00b7\3\2\2\2\u03dc\u03dd\7v\2\2\u03dd\u03de\7{\2"+
+ "\2\u03de\u03df\7r\2\2\u03df\u03e0\7g\2\2\u03e0\u00b9\3\2\2\2\u03e1\u03e2"+
+ "\7e\2\2\u03e2\u03e3\7q\2\2\u03e3\u03e4\7p\2\2\u03e4\u03e5\7v\2\2\u03e5"+
+ "\u03e6\7k\2\2\u03e6\u03e7\7p\2\2\u03e7\u03e8\7w\2\2\u03e8\u03e9\7g\2\2"+
+ "\u03e9\u03ea\3\2\2\2\u03ea\u03eb\b]\2\2\u03eb\u00bb\3\2\2\2\u03ec\u03ed"+
+ "\7h\2\2\u03ed\u03ee\7q\2\2\u03ee\u03ef\7t\2\2\u03ef\u00bd\3\2\2\2\u03f0"+
+ "\u03f1\7k\2\2\u03f1\u03f2\7o\2\2\u03f2\u03f3\7r\2\2\u03f3\u03f4\7q\2\2"+
+ "\u03f4\u03f5\7t\2\2\u03f5\u03f6\7v\2\2\u03f6\u00bf\3\2\2\2\u03f7\u03f8"+
+ "\7t\2\2\u03f8\u03f9\7g\2\2\u03f9\u03fa\7v\2\2\u03fa\u03fb\7w\2\2\u03fb"+
+ "\u03fc\7t\2\2\u03fc\u03fd\7p\2\2\u03fd\u03fe\3\2\2\2\u03fe\u03ff\b`\2"+
+ "\2\u03ff\u00c1\3\2\2\2\u0400\u0401\7x\2\2\u0401\u0402\7c\2\2\u0402\u0403"+
+ "\7t\2\2\u0403\u00c3\3\2\2\2\u0404\u0405\7p\2\2\u0405\u0406\7k\2\2\u0406"+
+ "\u0407\7n\2\2\u0407\u0408\3\2\2\2\u0408\u0409\bb\2\2\u0409\u00c5\3\2\2"+
+ "\2\u040a\u040f\5\u0148\u00a4\2\u040b\u040e\5\u0148\u00a4\2\u040c\u040e"+
+ "\5\u014a\u00a5\2\u040d\u040b\3\2\2\2\u040d\u040c\3\2\2\2\u040e\u0411\3"+
+ "\2\2\2\u040f\u040d\3\2\2\2\u040f\u0410\3\2\2\2\u0410\u0412\3\2\2\2\u0411"+
+ "\u040f\3\2\2\2\u0412\u0413\bc\2\2\u0413\u00c7\3\2\2\2\u0414\u0415\7*\2"+
+ "\2\u0415\u00c9\3\2\2\2\u0416\u0417\7+\2\2\u0417\u0418\3\2\2\2\u0418\u0419"+
+ "\be\2\2\u0419\u00cb\3\2\2\2\u041a\u041b\7}\2\2\u041b\u00cd\3\2\2\2\u041c"+
+ "\u041d\7\177\2\2\u041d\u041e\3\2\2\2\u041e\u041f\bg\2\2\u041f\u00cf\3"+
+ "\2\2\2\u0420\u0421\7]\2\2\u0421\u00d1\3\2\2\2\u0422\u0423\7_\2\2\u0423"+
+ "\u0424\3\2\2\2\u0424\u0425\bi\2\2\u0425\u00d3\3\2\2\2\u0426\u0427\7?\2"+
+ "\2\u0427\u00d5\3\2\2\2\u0428\u0429\7.\2\2\u0429\u00d7\3\2\2\2\u042a\u042b"+
+ "\7=\2\2\u042b\u00d9\3\2\2\2\u042c\u042d\7<\2\2\u042d\u00db\3\2\2\2\u042e"+
+ "\u042f\7\60\2\2\u042f\u00dd\3\2\2\2\u0430\u0431\7-\2\2\u0431\u0432\7-"+
+ "\2\2\u0432\u0433\3\2\2\2\u0433\u0434\bo\2\2\u0434\u00df\3\2\2\2\u0435"+
+ "\u0436\7/\2\2\u0436\u0437\7/\2\2\u0437\u0438\3\2\2\2\u0438\u0439\bp\2"+
+ "\2\u0439\u00e1\3\2\2\2\u043a\u043b\7<\2\2\u043b\u043c\7?\2\2\u043c\u00e3"+
+ "\3\2\2\2\u043d\u043e\7\60\2\2\u043e\u043f\7\60\2\2\u043f\u0440\7\60\2"+
+ "\2\u0440\u00e5\3\2\2\2\u0441\u0442\7~\2\2\u0442\u0443\7~\2\2\u0443\u00e7"+
+ "\3\2\2\2\u0444\u0445\7(\2\2\u0445\u0446\7(\2\2\u0446\u00e9\3\2\2\2\u0447"+
+ "\u0448\7?\2\2\u0448\u0449\7?\2\2\u0449\u00eb\3\2\2\2\u044a\u044b\7#\2"+
+ "\2\u044b\u044c\7?\2\2\u044c\u00ed\3\2\2\2\u044d\u044e\7>\2\2\u044e\u00ef"+
+ "\3\2\2\2\u044f\u0450\7>\2\2\u0450\u0451\7?\2\2\u0451\u00f1\3\2\2\2\u0452"+
+ "\u0453\7@\2\2\u0453\u00f3\3\2\2\2\u0454\u0455\7@\2\2\u0455\u0456\7?\2"+
+ "\2\u0456\u00f5\3\2\2\2\u0457\u0458\7~\2\2\u0458\u00f7\3\2\2\2\u0459\u045a"+
+ "\7\61\2\2\u045a\u00f9\3\2\2\2\u045b\u045c\7\'\2\2\u045c\u00fb\3\2\2\2"+
+ "\u045d\u045e\7>\2\2\u045e\u045f\7>\2\2\u045f\u00fd\3\2\2\2\u0460\u0461"+
+ "\7@\2\2\u0461\u0462\7@\2\2\u0462\u00ff\3\2\2\2\u0463\u0464\7(\2\2\u0464"+
+ "\u0465\7`\2\2\u0465\u0101\3\2\2\2\u0466\u0467\7#\2\2\u0467\u0103\3\2\2"+
+ "\2\u0468\u0469\7-\2\2\u0469\u0105\3\2\2\2\u046a\u046b\7/\2\2\u046b\u0107"+
+ "\3\2\2\2\u046c\u046d\7`\2\2\u046d\u0109\3\2\2\2\u046e\u046f\7,\2\2\u046f"+
+ "\u010b\3\2\2\2\u0470\u0471\7(\2\2\u0471\u010d\3\2\2\2\u0472\u0473\7>\2"+
+ "\2\u0473\u0474\7/\2\2\u0474\u010f\3\2\2\2\u0475\u0481\7\62\2\2\u0476\u047d"+
+ "\t\2\2\2\u0477\u0479\7a\2\2\u0478\u0477\3\2\2\2\u0478\u0479\3\2\2\2\u0479"+
+ "\u047a\3\2\2\2\u047a\u047c\t\3\2\2\u047b\u0478\3\2\2\2\u047c\u047f\3\2"+
+ "\2\2\u047d\u047b\3\2\2\2\u047d\u047e\3\2\2\2\u047e\u0481\3\2\2\2\u047f"+
+ "\u047d\3\2\2\2\u0480\u0475\3\2\2\2\u0480\u0476\3\2\2\2\u0481\u0482\3\2"+
+ "\2\2\u0482\u0483\b\u0088\2\2\u0483\u0111\3\2\2\2\u0484\u0485\7\62\2\2"+
+ "\u0485\u048a\t\4\2\2\u0486\u0488\7a\2\2\u0487\u0486\3\2\2\2\u0487\u0488"+
+ "\3\2\2\2\u0488\u0489\3\2\2\2\u0489\u048b\5\u0144\u00a2\2\u048a\u0487\3"+
+ "\2\2\2\u048b\u048c\3\2\2\2\u048c\u048a\3\2\2\2\u048c\u048d\3\2\2\2\u048d"+
+ "\u048e\3\2\2\2\u048e\u048f\b\u0089\2\2\u048f\u0113\3\2\2\2\u0490\u0492"+
+ "\7\62\2\2\u0491\u0493\t\5\2\2\u0492\u0491\3\2\2\2\u0492\u0493\3\2\2\2"+
+ "\u0493\u0498\3\2\2\2\u0494\u0496\7a\2\2\u0495\u0494\3\2\2\2\u0495\u0496"+
+ "\3\2\2\2\u0496\u0497\3\2\2\2\u0497\u0499\5\u0140\u00a0\2\u0498\u0495\3"+
+ "\2\2\2\u0499\u049a\3\2\2\2\u049a\u0498\3\2\2\2\u049a\u049b\3\2\2\2\u049b"+
+ "\u049c\3\2\2\2\u049c\u049d\b\u008a\2\2\u049d\u0115\3\2\2\2\u049e\u049f"+
+ "\7\62\2\2\u049f\u04a4\t\6\2\2\u04a0\u04a2\7a\2\2\u04a1\u04a0\3\2\2\2\u04a1"+
+ "\u04a2\3\2\2\2\u04a2\u04a3\3\2\2\2\u04a3\u04a5\5\u0142\u00a1\2\u04a4\u04a1"+
+ "\3\2\2\2\u04a5\u04a6\3\2\2\2\u04a6\u04a4\3\2\2\2\u04a6\u04a7\3\2\2\2\u04a7"+
+ "\u04a8\3\2\2\2\u04a8\u04a9\b\u008b\2\2\u04a9\u0117\3\2\2\2\u04aa\u04ab"+
+ "\7\62\2\2\u04ab\u04ac\t\6\2\2\u04ac\u04ad\5\u011a\u008d\2\u04ad\u04ae"+
+ "\5\u011c\u008e\2\u04ae\u0119\3\2\2\2\u04af\u04b1\7a\2\2\u04b0\u04af\3"+
+ "\2\2\2\u04b0\u04b1\3\2\2\2\u04b1\u04b2\3\2\2\2\u04b2\u04b4\5\u0142\u00a1"+
+ "\2\u04b3\u04b0\3\2\2\2\u04b4\u04b5\3\2\2\2\u04b5\u04b3\3\2\2\2\u04b5\u04b6"+
+ "\3\2\2\2\u04b6\u04c1\3\2\2\2\u04b7\u04be\7\60\2\2\u04b8\u04ba\7a\2\2\u04b9"+
+ "\u04b8\3\2\2\2\u04b9\u04ba\3\2\2\2\u04ba\u04bb\3\2\2\2\u04bb\u04bd\5\u0142"+
+ "\u00a1\2\u04bc\u04b9\3\2\2\2\u04bd\u04c0\3\2\2\2\u04be\u04bc\3\2\2\2\u04be"+
+ "\u04bf\3\2\2\2\u04bf\u04c2\3\2\2\2\u04c0\u04be\3\2\2\2\u04c1\u04b7\3\2"+
+ "\2\2\u04c1\u04c2\3\2\2\2\u04c2\u04cf\3\2\2\2\u04c3\u04c4\7\60\2\2\u04c4"+
+ "\u04cb\5\u0142\u00a1\2\u04c5\u04c7\7a\2\2\u04c6\u04c5\3\2\2\2\u04c6\u04c7"+
+ "\3\2\2\2\u04c7\u04c8\3\2\2\2\u04c8\u04ca\5\u0142\u00a1\2\u04c9\u04c6\3"+
+ "\2\2\2\u04ca\u04cd\3\2\2\2\u04cb\u04c9\3\2\2\2\u04cb\u04cc\3\2\2\2\u04cc"+
+ "\u04cf\3\2\2\2\u04cd\u04cb\3\2\2\2\u04ce\u04b3\3\2\2\2\u04ce\u04c3\3\2"+
+ "\2\2\u04cf\u011b\3\2\2\2\u04d0\u04d1\t\7\2\2\u04d1\u04d2\t\b\2\2\u04d2"+
+ "\u04d3\5\u013e\u009f\2\u04d3\u011d\3\2\2\2\u04d4\u04da\5\u0110\u0088\2"+
+ "\u04d5\u04da\5\u0112\u0089\2\u04d6\u04da\5\u0114\u008a\2\u04d7\u04da\5"+
+ "\u0116\u008b\2\u04d8\u04da\5\4\2\2\u04d9\u04d4\3\2\2\2\u04d9\u04d5\3\2"+
+ "\2\2\u04d9\u04d6\3\2\2\2\u04d9\u04d7\3\2\2\2\u04d9\u04d8\3\2\2\2\u04da"+
+ "\u04db\3\2\2\2\u04db\u04dc\7k\2\2\u04dc\u04dd\3\2\2\2\u04dd\u04de\b\u008f"+
+ "\2\2\u04de\u011f\3\2\2\2\u04df\u04e2\7)\2\2\u04e0\u04e3\5\u013a\u009d"+
+ "\2\u04e1\u04e3\5\u0124\u0092\2\u04e2\u04e0\3\2\2\2\u04e2\u04e1\3\2\2\2"+
+ "\u04e3\u04e4\3\2\2\2\u04e4\u04e5\7)\2\2\u04e5\u0121\3\2\2\2\u04e6\u04e7"+
+ "\5\u0120\u0090\2\u04e7\u04e8\3\2\2\2\u04e8\u04e9\b\u0091\2\2\u04e9\u0123"+
+ "\3\2\2\2\u04ea\u04ed\5\u0126\u0093\2\u04eb\u04ed\5\u0128\u0094\2\u04ec"+
+ "\u04ea\3\2\2\2\u04ec\u04eb\3\2\2\2\u04ed\u0125\3\2\2\2\u04ee\u04ef\7^"+
+ "\2\2\u04ef\u04f0\5\u0140\u00a0\2\u04f0\u04f1\5\u0140\u00a0\2\u04f1\u04f2"+
+ "\5\u0140\u00a0\2\u04f2\u0127\3\2\2\2\u04f3\u04f4\7^\2\2\u04f4\u04f5\7"+
+ "z\2\2\u04f5\u04f6\5\u0142\u00a1\2\u04f6\u04f7\5\u0142\u00a1\2\u04f7\u0129"+
+ "\3\2\2\2\u04f8\u04f9\7^\2\2\u04f9\u04fa\7w\2\2\u04fa\u04fb\5\u0142\u00a1"+
+ "\2\u04fb\u04fc\5\u0142\u00a1\2\u04fc\u04fd\5\u0142\u00a1\2\u04fd\u04fe"+
+ "\5\u0142\u00a1\2\u04fe\u012b\3\2\2\2\u04ff\u0500\7^\2\2\u0500\u0501\7"+
+ "W\2\2\u0501\u0502\5\u0142\u00a1\2\u0502\u0503\5\u0142\u00a1\2\u0503\u0504"+
+ "\5\u0142\u00a1\2\u0504\u0505\5\u0142\u00a1\2\u0505\u0506\5\u0142\u00a1"+
+ "\2\u0506\u0507\5\u0142\u00a1\2\u0507\u0508\5\u0142\u00a1\2\u0508\u0509"+
+ "\5\u0142\u00a1\2\u0509\u012d\3\2\2\2\u050a\u050e\7b\2\2\u050b\u050d\n"+
+ "\t\2\2\u050c\u050b\3\2\2\2\u050d\u0510\3\2\2\2\u050e\u050c\3\2\2\2\u050e"+
+ "\u050f\3\2\2\2\u050f\u0511\3\2\2\2\u0510\u050e\3\2\2\2\u0511\u0512\7b"+
+ "\2\2\u0512\u0513\3\2\2\2\u0513\u0514\b\u0097\2\2\u0514\u012f\3\2\2\2\u0515"+
+ "\u051a\7$\2\2\u0516\u0519\n\n\2\2\u0517\u0519\5\u013c\u009e\2\u0518\u0516"+
+ "\3\2\2\2\u0518\u0517\3\2\2\2\u0519\u051c\3\2\2\2\u051a\u0518\3\2\2\2\u051a"+
+ "\u051b\3\2\2\2\u051b\u051d\3\2\2\2\u051c\u051a\3\2\2\2\u051d\u051e\7$"+
+ "\2\2\u051e\u051f\3\2\2\2\u051f\u0520\b\u0098\2\2\u0520\u0131\3\2\2\2\u0521"+
+ "\u0523\t\13\2\2\u0522\u0521\3\2\2\2\u0523\u0524\3\2\2\2\u0524\u0522\3"+
+ "\2\2\2\u0524\u0525\3\2\2\2\u0525\u0526\3\2\2\2\u0526\u0527\b\u0099\3\2"+
+ "\u0527\u0133\3\2\2\2\u0528\u0529\7\61\2\2\u0529\u052a\7,\2\2\u052a\u052e"+
+ "\3\2\2\2\u052b\u052d\13\2\2\2\u052c\u052b\3\2\2\2\u052d\u0530\3\2\2\2"+
+ "\u052e\u052f\3\2\2\2\u052e\u052c\3\2\2\2\u052f\u0531\3\2\2\2\u0530\u052e"+
+ "\3\2\2\2\u0531\u0532\7,\2\2\u0532\u0533\7\61\2\2\u0533\u0534\3\2\2\2\u0534"+
+ "\u0535\b\u009a\3\2\u0535\u0135\3\2\2\2\u0536\u0538\t\f\2\2\u0537\u0536"+
+ "\3\2\2\2\u0538\u0539\3\2\2\2\u0539\u0537\3\2\2\2\u0539\u053a\3\2\2\2\u053a"+
+ "\u053b\3\2\2\2\u053b\u053c\b\u009b\3\2\u053c\u0137\3\2\2\2\u053d\u053e"+
+ "\7\61\2\2\u053e\u053f\7\61\2\2\u053f\u0543\3\2\2\2\u0540\u0542\n\f\2\2"+
+ "\u0541\u0540\3\2\2\2\u0542\u0545\3\2\2\2\u0543\u0541\3\2\2\2\u0543\u0544"+
+ "\3\2\2\2\u0544\u0546\3\2\2\2\u0545\u0543\3\2\2\2\u0546\u0547\b\u009c\3"+
+ "\2\u0547\u0139\3\2\2\2\u0548\u054d\n\r\2\2\u0549\u054d\5\u012a\u0095\2"+
+ "\u054a\u054d\5\u012c\u0096\2\u054b\u054d\5\u013c\u009e\2\u054c\u0548\3"+
+ "\2\2\2\u054c\u0549\3\2\2\2\u054c\u054a\3\2\2\2\u054c\u054b\3\2\2\2\u054d"+
+ "\u013b\3\2\2\2\u054e\u0568\7^\2\2\u054f\u0550\7w\2\2\u0550\u0551\5\u0142"+
+ "\u00a1\2\u0551\u0552\5\u0142\u00a1\2\u0552\u0553\5\u0142\u00a1\2\u0553"+
+ "\u0554\5\u0142\u00a1\2\u0554\u0569\3\2\2\2\u0555\u0556\7W\2\2\u0556\u0557"+
+ "\5\u0142\u00a1\2\u0557\u0558\5\u0142\u00a1\2\u0558\u0559\5\u0142\u00a1"+
+ "\2\u0559\u055a\5\u0142\u00a1\2\u055a\u055b\5\u0142\u00a1\2\u055b\u055c"+
+ "\5\u0142\u00a1\2\u055c\u055d\5\u0142\u00a1\2\u055d\u055e\5\u0142\u00a1"+
+ "\2\u055e\u0569\3\2\2\2\u055f\u0569\t\16\2\2\u0560\u0561\5\u0140\u00a0"+
+ "\2\u0561\u0562\5\u0140\u00a0\2\u0562\u0563\5\u0140\u00a0\2\u0563\u0569"+
+ "\3\2\2\2\u0564\u0565\7z\2\2\u0565\u0566\5\u0142\u00a1\2\u0566\u0567\5"+
+ "\u0142\u00a1\2\u0567\u0569\3\2\2\2\u0568\u054f\3\2\2\2\u0568\u0555\3\2"+
+ "\2\2\u0568\u055f\3\2\2\2\u0568\u0560\3\2\2\2\u0568\u0564\3\2\2\2\u0569"+
+ "\u013d\3\2\2\2\u056a\u0571\t\3\2\2\u056b\u056d\7a\2\2\u056c\u056b\3\2"+
+ "\2\2\u056c\u056d\3\2\2\2\u056d\u056e\3\2\2\2\u056e\u0570\t\3\2\2\u056f"+
+ "\u056c\3\2\2\2\u0570\u0573\3\2\2\2\u0571\u056f\3\2\2\2\u0571\u0572\3\2"+
+ "\2\2\u0572\u013f\3\2\2\2\u0573\u0571\3\2\2\2\u0574\u0575\t\17\2\2\u0575"+
+ "\u0141\3\2\2\2\u0576\u0577\t\20\2\2\u0577\u0143\3\2\2\2\u0578\u0579\t"+
+ "\21\2\2\u0579\u0145\3\2\2\2\u057a\u057c\t\22\2\2\u057b\u057d\t\b\2\2\u057c"+
+ "\u057b\3\2\2\2\u057c\u057d\3\2\2\2\u057d\u057e\3\2\2\2\u057e\u057f\5\u013e"+
+ "\u009f\2\u057f\u0147\3\2\2\2\u0580\u0583\5\u014c\u00a6\2\u0581\u0583\7"+
+ "a\2\2\u0582\u0580\3\2\2\2\u0582\u0581\3\2\2\2\u0583\u0149\3\2\2\2\u0584"+
+ "\u0585\t\23\2\2\u0585\u014b\3\2\2\2\u0586\u0587\t\24\2\2\u0587\u014d\3"+
+ "\2\2\2\u0588\u058a\t\13\2\2\u0589\u0588\3\2\2\2\u058a\u058b\3\2\2\2\u058b"+
+ "\u0589\3\2\2\2\u058b\u058c\3\2\2\2\u058c\u058d\3\2\2\2\u058d\u058e\b\u00a7"+
+ "\3\2\u058e\u014f\3\2\2\2\u058f\u0590\7\61\2\2\u0590\u0591\7,\2\2\u0591"+
+ "\u0595\3\2\2\2\u0592\u0594\n\f\2\2\u0593\u0592\3\2\2\2\u0594\u0597\3\2"+
+ "\2\2\u0595\u0596\3\2\2\2\u0595\u0593\3\2\2\2\u0596\u0598\3\2\2\2\u0597"+
+ "\u0595\3\2\2\2\u0598\u0599\7,\2\2\u0599\u059a\7\61\2\2\u059a\u059b\3\2"+
+ "\2\2\u059b\u059c\b\u00a8\3\2\u059c\u0151\3\2\2\2\u059d\u059e\7\61\2\2"+
+ "\u059e\u059f\7\61\2\2\u059f\u05a3\3\2\2\2\u05a0\u05a2\n\f\2\2\u05a1\u05a0"+
+ "\3\2\2\2\u05a2\u05a5\3\2\2\2\u05a3\u05a1\3\2\2\2\u05a3\u05a4\3\2\2\2\u05a4"+
+ "\u05a6\3\2\2\2\u05a5\u05a3\3\2\2\2\u05a6\u05a7\b\u00a9\3\2\u05a7\u0153"+
+ "\3\2\2\2\u05a8\u05aa\t\f\2\2\u05a9\u05a8\3\2\2\2\u05aa\u05ab\3\2\2\2\u05ab"+
+ "\u05a9\3\2\2\2\u05ab\u05ac\3\2\2\2\u05ac\u05bb\3\2\2\2\u05ad\u05bb\7="+
+ "\2\2\u05ae\u05af\7\61\2\2\u05af\u05b0\7,\2\2\u05b0\u05b4\3\2\2\2\u05b1"+
+ "\u05b3\13\2\2\2\u05b2\u05b1\3\2\2\2\u05b3\u05b6\3\2\2\2\u05b4\u05b5\3"+
+ "\2\2\2\u05b4\u05b2\3\2\2\2\u05b5\u05b7\3\2\2\2\u05b6\u05b4\3\2\2\2\u05b7"+
+ "\u05b8\7,\2\2\u05b8\u05bb\7\61\2\2\u05b9\u05bb\7\2\2\3\u05ba\u05a9\3\2"+
+ "\2\2\u05ba\u05ad\3\2\2\2\u05ba\u05ae\3\2\2\2\u05ba\u05b9\3\2\2\2\u05bb"+
+ "\u05bc\3\2\2\2\u05bc\u05bd\b\u00aa\4\2\u05bd\u0155\3\2\2\2\u05be\u05bf"+
+ "\3\2\2\2\u05bf\u05c0\3\2\2\2\u05c0\u05c1\b\u00ab\4\2\u05c1\u05c2\b\u00ab"+
+ "\3\2\u05c2\u0157\3\2\2\2\64\2\3\u015a\u0162\u0165\u0168\u016e\u0170\u040d"+
+ "\u040f\u0478\u047d\u0480\u0487\u048c\u0492\u0495\u049a\u04a1\u04a6\u04b0"+
+ "\u04b5\u04b9\u04be\u04c1\u04c6\u04cb\u04ce\u04d9\u04e2\u04ec\u050e\u0518"+
+ "\u051a\u0524\u052e\u0539\u0543\u054c\u0568\u056c\u0571\u057c\u0582\u058b"+
+ "\u0595\u05a3\u05ab\u05b4\u05ba\5\4\3\2\2\3\2\4\2\2";
public static final ATN _ATN =
new ATNDeserializer().deserialize(_serializedATN.toCharArray());
static {
diff --git a/src/main/java/viper/gobra/frontend/GobraParser.java b/src/main/java/viper/gobra/frontend/GobraParser.java
index 3031c6145..045338bf7 100644
--- a/src/main/java/viper/gobra/frontend/GobraParser.java
+++ b/src/main/java/viper/gobra/frontend/GobraParser.java
@@ -1,4 +1,4 @@
-// Generated from /Users/joao/Code/gobraHome/gobra/src/main/antlr4/GobraParser.g4 by ANTLR 4.9.2
+// Generated from /main/antlr4/GobraParser.g4 by ANTLR 4.9.1
package viper.gobra.frontend;
import org.antlr.v4.runtime.atn.*;
import org.antlr.v4.runtime.dfa.DFA;
@@ -11,7 +11,7 @@
@SuppressWarnings({"all", "warnings", "unchecked", "unused", "cast"})
public class GobraParser extends GobraParserBase {
- static { RuntimeMetaData.checkVersion("4.9.2", RuntimeMetaData.VERSION); }
+ static { RuntimeMetaData.checkVersion("4.9.1", RuntimeMetaData.VERSION); }
protected static final DFA[] _decisionToDFA;
protected static final PredictionContextCache _sharedContextCache =
@@ -27,21 +27,21 @@ public class GobraParser extends GobraParserBase {
PRED=53, TYPE_OF=54, IS_COMPARABLE=55, SHARE=56, ADDR_MOD=57, DOT_DOT=58,
SHARED=59, EXCLUSIVE=60, PREDICATE=61, WRITEPERM=62, NOPERM=63, TRUSTED=64,
OUTLINE=65, INIT_POST=66, IMPORT_PRE=67, PROOF=68, GHOST_EQUALS=69, GHOST_NOT_EQUALS=70,
- BREAK=71, DEFAULT=72, FUNC=73, INTERFACE=74, SELECT=75, CASE=76, DEFER=77,
- GO=78, MAP=79, STRUCT=80, CHAN=81, ELSE=82, GOTO=83, PACKAGE=84, SWITCH=85,
- CONST=86, FALLTHROUGH=87, IF=88, RANGE=89, TYPE=90, CONTINUE=91, FOR=92,
- IMPORT=93, RETURN=94, VAR=95, NIL_LIT=96, IDENTIFIER=97, L_PAREN=98, R_PAREN=99,
- L_CURLY=100, R_CURLY=101, L_BRACKET=102, R_BRACKET=103, ASSIGN=104, COMMA=105,
- SEMI=106, COLON=107, DOT=108, PLUS_PLUS=109, MINUS_MINUS=110, DECLARE_ASSIGN=111,
- ELLIPSIS=112, LOGICAL_OR=113, LOGICAL_AND=114, EQUALS=115, NOT_EQUALS=116,
- LESS=117, LESS_OR_EQUALS=118, GREATER=119, GREATER_OR_EQUALS=120, OR=121,
- DIV=122, MOD=123, LSHIFT=124, RSHIFT=125, BIT_CLEAR=126, EXCLAMATION=127,
- PLUS=128, MINUS=129, CARET=130, STAR=131, AMPERSAND=132, RECEIVE=133,
- DECIMAL_LIT=134, BINARY_LIT=135, OCTAL_LIT=136, HEX_LIT=137, HEX_FLOAT_LIT=138,
- IMAGINARY_LIT=139, RUNE_LIT=140, BYTE_VALUE=141, OCTAL_BYTE_VALUE=142,
- HEX_BYTE_VALUE=143, LITTLE_U_VALUE=144, BIG_U_VALUE=145, RAW_STRING_LIT=146,
- INTERPRETED_STRING_LIT=147, WS=148, COMMENT=149, TERMINATOR=150, LINE_COMMENT=151,
- WS_NLSEMI=152, COMMENT_NLSEMI=153, LINE_COMMENT_NLSEMI=154, EOS=155, OTHER=156;
+ WITH=71, BREAK=72, DEFAULT=73, FUNC=74, INTERFACE=75, SELECT=76, CASE=77,
+ DEFER=78, GO=79, MAP=80, STRUCT=81, CHAN=82, ELSE=83, GOTO=84, PACKAGE=85,
+ SWITCH=86, CONST=87, FALLTHROUGH=88, IF=89, RANGE=90, TYPE=91, CONTINUE=92,
+ FOR=93, IMPORT=94, RETURN=95, VAR=96, NIL_LIT=97, IDENTIFIER=98, L_PAREN=99,
+ R_PAREN=100, L_CURLY=101, R_CURLY=102, L_BRACKET=103, R_BRACKET=104, ASSIGN=105,
+ COMMA=106, SEMI=107, COLON=108, DOT=109, PLUS_PLUS=110, MINUS_MINUS=111,
+ DECLARE_ASSIGN=112, ELLIPSIS=113, LOGICAL_OR=114, LOGICAL_AND=115, EQUALS=116,
+ NOT_EQUALS=117, LESS=118, LESS_OR_EQUALS=119, GREATER=120, GREATER_OR_EQUALS=121,
+ OR=122, DIV=123, MOD=124, LSHIFT=125, RSHIFT=126, BIT_CLEAR=127, EXCLAMATION=128,
+ PLUS=129, MINUS=130, CARET=131, STAR=132, AMPERSAND=133, RECEIVE=134,
+ DECIMAL_LIT=135, BINARY_LIT=136, OCTAL_LIT=137, HEX_LIT=138, HEX_FLOAT_LIT=139,
+ IMAGINARY_LIT=140, RUNE_LIT=141, BYTE_VALUE=142, OCTAL_BYTE_VALUE=143,
+ HEX_BYTE_VALUE=144, LITTLE_U_VALUE=145, BIG_U_VALUE=146, RAW_STRING_LIT=147,
+ INTERPRETED_STRING_LIT=148, WS=149, COMMENT=150, TERMINATOR=151, LINE_COMMENT=152,
+ WS_NLSEMI=153, COMMENT_NLSEMI=154, LINE_COMMENT_NLSEMI=155, EOS=156, OTHER=157;
public static final int
RULE_exprOnly = 0, RULE_stmtOnly = 1, RULE_typeOnly = 2, RULE_maybeAddressableIdentifierList = 3,
RULE_maybeAddressableIdentifier = 4, RULE_sourceFile = 5, RULE_initPost = 6,
@@ -70,29 +70,29 @@ public class GobraParser extends GobraParserBase {
RULE_interfaceType = 84, RULE_predicateSpec = 85, RULE_methodSpec = 86,
RULE_type_ = 87, RULE_typeLit = 88, RULE_predType = 89, RULE_predTypeParams = 90,
RULE_literalType = 91, RULE_implicitArray = 92, RULE_slice_ = 93, RULE_low = 94,
- RULE_high = 95, RULE_cap = 96, RULE_assign_op = 97, RULE_packageClause = 98,
- RULE_importPath = 99, RULE_declaration = 100, RULE_constDecl = 101, RULE_constSpec = 102,
- RULE_identifierList = 103, RULE_expressionList = 104, RULE_typeDecl = 105,
- RULE_typeSpec = 106, RULE_varDecl = 107, RULE_block = 108, RULE_statementList = 109,
- RULE_simpleStmt = 110, RULE_expressionStmt = 111, RULE_sendStmt = 112,
- RULE_incDecStmt = 113, RULE_assignment = 114, RULE_emptyStmt = 115, RULE_labeledStmt = 116,
- RULE_returnStmt = 117, RULE_breakStmt = 118, RULE_continueStmt = 119,
- RULE_gotoStmt = 120, RULE_fallthroughStmt = 121, RULE_ifStmt = 122, RULE_switchStmt = 123,
- RULE_exprSwitchStmt = 124, RULE_exprCaseClause = 125, RULE_exprSwitchCase = 126,
- RULE_typeSwitchStmt = 127, RULE_typeSwitchGuard = 128, RULE_typeCaseClause = 129,
- RULE_typeSwitchCase = 130, RULE_typeList = 131, RULE_selectStmt = 132,
- RULE_commClause = 133, RULE_commCase = 134, RULE_recvStmt = 135, RULE_forStmt = 136,
- RULE_forClause = 137, RULE_rangeClause = 138, RULE_goStmt = 139, RULE_typeName = 140,
- RULE_arrayType = 141, RULE_arrayLength = 142, RULE_elementType = 143,
- RULE_pointerType = 144, RULE_sliceType = 145, RULE_mapType = 146, RULE_channelType = 147,
- RULE_functionType = 148, RULE_signature = 149, RULE_result = 150, RULE_parameters = 151,
- RULE_conversion = 152, RULE_nonNamedType = 153, RULE_operand = 154, RULE_literal = 155,
- RULE_integer = 156, RULE_operandName = 157, RULE_qualifiedIdent = 158,
- RULE_compositeLit = 159, RULE_literalValue = 160, RULE_elementList = 161,
- RULE_keyedElement = 162, RULE_key = 163, RULE_element = 164, RULE_structType = 165,
- RULE_fieldDecl = 166, RULE_string_ = 167, RULE_embeddedField = 168, RULE_index = 169,
- RULE_typeAssertion = 170, RULE_arguments = 171, RULE_methodExpr = 172,
- RULE_receiverType = 173, RULE_eos = 174;
+ RULE_high = 95, RULE_cap = 96, RULE_assign_op = 97, RULE_rangeClause = 98,
+ RULE_packageClause = 99, RULE_importPath = 100, RULE_declaration = 101,
+ RULE_constDecl = 102, RULE_constSpec = 103, RULE_identifierList = 104,
+ RULE_expressionList = 105, RULE_typeDecl = 106, RULE_typeSpec = 107, RULE_varDecl = 108,
+ RULE_block = 109, RULE_statementList = 110, RULE_simpleStmt = 111, RULE_expressionStmt = 112,
+ RULE_sendStmt = 113, RULE_incDecStmt = 114, RULE_assignment = 115, RULE_emptyStmt = 116,
+ RULE_labeledStmt = 117, RULE_returnStmt = 118, RULE_breakStmt = 119, RULE_continueStmt = 120,
+ RULE_gotoStmt = 121, RULE_fallthroughStmt = 122, RULE_ifStmt = 123, RULE_switchStmt = 124,
+ RULE_exprSwitchStmt = 125, RULE_exprCaseClause = 126, RULE_exprSwitchCase = 127,
+ RULE_typeSwitchStmt = 128, RULE_typeSwitchGuard = 129, RULE_typeCaseClause = 130,
+ RULE_typeSwitchCase = 131, RULE_typeList = 132, RULE_selectStmt = 133,
+ RULE_commClause = 134, RULE_commCase = 135, RULE_recvStmt = 136, RULE_forStmt = 137,
+ RULE_forClause = 138, RULE_goStmt = 139, RULE_typeName = 140, RULE_arrayType = 141,
+ RULE_arrayLength = 142, RULE_elementType = 143, RULE_pointerType = 144,
+ RULE_sliceType = 145, RULE_mapType = 146, RULE_channelType = 147, RULE_functionType = 148,
+ RULE_signature = 149, RULE_result = 150, RULE_parameters = 151, RULE_conversion = 152,
+ RULE_nonNamedType = 153, RULE_operand = 154, RULE_literal = 155, RULE_integer = 156,
+ RULE_operandName = 157, RULE_qualifiedIdent = 158, RULE_compositeLit = 159,
+ RULE_literalValue = 160, RULE_elementList = 161, RULE_keyedElement = 162,
+ RULE_key = 163, RULE_element = 164, RULE_structType = 165, RULE_fieldDecl = 166,
+ RULE_string_ = 167, RULE_embeddedField = 168, RULE_index = 169, RULE_typeAssertion = 170,
+ RULE_arguments = 171, RULE_methodExpr = 172, RULE_receiverType = 173,
+ RULE_eos = 174;
private static String[] makeRuleNames() {
return new String[] {
"exprOnly", "stmtOnly", "typeOnly", "maybeAddressableIdentifierList",
@@ -114,15 +114,15 @@ private static String[] makeRuleNames() {
"specForStmt", "loopSpec", "deferStmt", "basicLit", "primaryExpr", "functionLit",
"closureDecl", "predConstructArgs", "interfaceType", "predicateSpec",
"methodSpec", "type_", "typeLit", "predType", "predTypeParams", "literalType",
- "implicitArray", "slice_", "low", "high", "cap", "assign_op", "packageClause",
- "importPath", "declaration", "constDecl", "constSpec", "identifierList",
- "expressionList", "typeDecl", "typeSpec", "varDecl", "block", "statementList",
- "simpleStmt", "expressionStmt", "sendStmt", "incDecStmt", "assignment",
- "emptyStmt", "labeledStmt", "returnStmt", "breakStmt", "continueStmt",
- "gotoStmt", "fallthroughStmt", "ifStmt", "switchStmt", "exprSwitchStmt",
- "exprCaseClause", "exprSwitchCase", "typeSwitchStmt", "typeSwitchGuard",
- "typeCaseClause", "typeSwitchCase", "typeList", "selectStmt", "commClause",
- "commCase", "recvStmt", "forStmt", "forClause", "rangeClause", "goStmt",
+ "implicitArray", "slice_", "low", "high", "cap", "assign_op", "rangeClause",
+ "packageClause", "importPath", "declaration", "constDecl", "constSpec",
+ "identifierList", "expressionList", "typeDecl", "typeSpec", "varDecl",
+ "block", "statementList", "simpleStmt", "expressionStmt", "sendStmt",
+ "incDecStmt", "assignment", "emptyStmt", "labeledStmt", "returnStmt",
+ "breakStmt", "continueStmt", "gotoStmt", "fallthroughStmt", "ifStmt",
+ "switchStmt", "exprSwitchStmt", "exprCaseClause", "exprSwitchCase", "typeSwitchStmt",
+ "typeSwitchGuard", "typeCaseClause", "typeSwitchCase", "typeList", "selectStmt",
+ "commClause", "commCase", "recvStmt", "forStmt", "forClause", "goStmt",
"typeName", "arrayType", "arrayLength", "elementType", "pointerType",
"sliceType", "mapType", "channelType", "functionType", "signature", "result",
"parameters", "conversion", "nonNamedType", "operand", "literal", "integer",
@@ -146,15 +146,15 @@ private static String[] makeLiteralNames() {
"'some'", "'get'", "'domain'", "'axiom'", "'none'", "'pred'", "'typeOf'",
"'isComparable'", "'share'", "'@'", "'..'", "'shared'", "'exclusive'",
"'predicate'", "'writePerm'", "'noPerm'", "'trusted'", "'outline'", "'initEnsures'",
- "'importRequires'", "'proof'", "'==='", "'!=='", "'break'", "'default'",
- "'func'", "'interface'", "'select'", "'case'", "'defer'", "'go'", "'map'",
- "'struct'", "'chan'", "'else'", "'goto'", "'package'", "'switch'", "'const'",
- "'fallthrough'", "'if'", "'range'", "'type'", "'continue'", "'for'",
- "'import'", "'return'", "'var'", "'nil'", null, "'('", "')'", "'{'",
- "'}'", "'['", "']'", "'='", "','", "';'", "':'", "'.'", "'++'", "'--'",
- "':='", "'...'", "'||'", "'&&'", "'=='", "'!='", "'<'", "'<='", "'>'",
- "'>='", "'|'", "'/'", "'%'", "'<<'", "'>>'", "'&^'", "'!'", "'+'", "'-'",
- "'^'", "'*'", "'&'", "'<-'"
+ "'importRequires'", "'proof'", "'==='", "'!=='", "'with'", "'break'",
+ "'default'", "'func'", "'interface'", "'select'", "'case'", "'defer'",
+ "'go'", "'map'", "'struct'", "'chan'", "'else'", "'goto'", "'package'",
+ "'switch'", "'const'", "'fallthrough'", "'if'", "'range'", "'type'",
+ "'continue'", "'for'", "'import'", "'return'", "'var'", "'nil'", null,
+ "'('", "')'", "'{'", "'}'", "'['", "']'", "'='", "','", "';'", "':'",
+ "'.'", "'++'", "'--'", "':='", "'...'", "'||'", "'&&'", "'=='", "'!='",
+ "'<'", "'<='", "'>'", "'>='", "'|'", "'/'", "'%'", "'<<'", "'>>'", "'&^'",
+ "'!'", "'+'", "'-'", "'^'", "'*'", "'&'", "'<-'"
};
}
private static final String[] _LITERAL_NAMES = makeLiteralNames();
@@ -169,9 +169,9 @@ private static String[] makeSymbolicNames() {
"GET", "DOM", "AXIOM", "NONE", "PRED", "TYPE_OF", "IS_COMPARABLE", "SHARE",
"ADDR_MOD", "DOT_DOT", "SHARED", "EXCLUSIVE", "PREDICATE", "WRITEPERM",
"NOPERM", "TRUSTED", "OUTLINE", "INIT_POST", "IMPORT_PRE", "PROOF", "GHOST_EQUALS",
- "GHOST_NOT_EQUALS", "BREAK", "DEFAULT", "FUNC", "INTERFACE", "SELECT",
- "CASE", "DEFER", "GO", "MAP", "STRUCT", "CHAN", "ELSE", "GOTO", "PACKAGE",
- "SWITCH", "CONST", "FALLTHROUGH", "IF", "RANGE", "TYPE", "CONTINUE",
+ "GHOST_NOT_EQUALS", "WITH", "BREAK", "DEFAULT", "FUNC", "INTERFACE",
+ "SELECT", "CASE", "DEFER", "GO", "MAP", "STRUCT", "CHAN", "ELSE", "GOTO",
+ "PACKAGE", "SWITCH", "CONST", "FALLTHROUGH", "IF", "RANGE", "TYPE", "CONTINUE",
"FOR", "IMPORT", "RETURN", "VAR", "NIL_LIT", "IDENTIFIER", "L_PAREN",
"R_PAREN", "L_CURLY", "R_CURLY", "L_BRACKET", "R_BRACKET", "ASSIGN",
"COMMA", "SEMI", "COLON", "DOT", "PLUS_PLUS", "MINUS_MINUS", "DECLARE_ASSIGN",
@@ -559,7 +559,7 @@ public final SourceFileContext sourceFile() throws RecognitionException {
setState(398);
_errHandler.sync(this);
_la = _input.LA(1);
- while (((((_la - 9)) & ~0x3f) == 0 && ((1L << (_la - 9)) & ((1L << (PRE - 9)) | (1L << (PRESERVES - 9)) | (1L << (POST - 9)) | (1L << (DEC - 9)) | (1L << (PURE - 9)) | (1L << (GHOST - 9)) | (1L << (SEQ - 9)) | (1L << (SET - 9)) | (1L << (MSET - 9)) | (1L << (DICT - 9)) | (1L << (OPT - 9)) | (1L << (DOM - 9)) | (1L << (PRED - 9)) | (1L << (TRUSTED - 9)))) != 0) || ((((_la - 73)) & ~0x3f) == 0 && ((1L << (_la - 73)) & ((1L << (FUNC - 73)) | (1L << (INTERFACE - 73)) | (1L << (MAP - 73)) | (1L << (STRUCT - 73)) | (1L << (CHAN - 73)) | (1L << (CONST - 73)) | (1L << (TYPE - 73)) | (1L << (VAR - 73)) | (1L << (IDENTIFIER - 73)) | (1L << (L_PAREN - 73)) | (1L << (L_BRACKET - 73)) | (1L << (STAR - 73)) | (1L << (RECEIVE - 73)))) != 0)) {
+ while (((((_la - 9)) & ~0x3f) == 0 && ((1L << (_la - 9)) & ((1L << (PRE - 9)) | (1L << (PRESERVES - 9)) | (1L << (POST - 9)) | (1L << (DEC - 9)) | (1L << (PURE - 9)) | (1L << (GHOST - 9)) | (1L << (SEQ - 9)) | (1L << (SET - 9)) | (1L << (MSET - 9)) | (1L << (DICT - 9)) | (1L << (OPT - 9)) | (1L << (DOM - 9)) | (1L << (PRED - 9)) | (1L << (TRUSTED - 9)))) != 0) || ((((_la - 74)) & ~0x3f) == 0 && ((1L << (_la - 74)) & ((1L << (FUNC - 74)) | (1L << (INTERFACE - 74)) | (1L << (MAP - 74)) | (1L << (STRUCT - 74)) | (1L << (CHAN - 74)) | (1L << (CONST - 74)) | (1L << (TYPE - 74)) | (1L << (VAR - 74)) | (1L << (IDENTIFIER - 74)) | (1L << (L_PAREN - 74)) | (1L << (L_BRACKET - 74)) | (1L << (STAR - 74)) | (1L << (RECEIVE - 74)))) != 0)) {
{
{
setState(392);
@@ -3240,7 +3240,7 @@ public final ClosureSpecInstanceContext closureSpecInstance() throws Recognition
setState(720);
_errHandler.sync(this);
_la = _input.LA(1);
- if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FLOAT_LIT) | (1L << TRUE) | (1L << FALSE) | (1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << OLD) | (1L << BEFORE) | (1L << FORALL) | (1L << EXISTS) | (1L << ACCESS) | (1L << UNFOLDING) | (1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << LEN) | (1L << NEW) | (1L << MAKE) | (1L << CAP) | (1L << SOME) | (1L << GET) | (1L << DOM) | (1L << NONE) | (1L << PRED) | (1L << TYPE_OF) | (1L << IS_COMPARABLE) | (1L << WRITEPERM) | (1L << NOPERM))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (TRUSTED - 64)) | (1L << (FUNC - 64)) | (1L << (INTERFACE - 64)) | (1L << (MAP - 64)) | (1L << (STRUCT - 64)) | (1L << (CHAN - 64)) | (1L << (RANGE - 64)) | (1L << (TYPE - 64)) | (1L << (NIL_LIT - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (L_PAREN - 64)) | (1L << (L_BRACKET - 64)) | (1L << (EXCLAMATION - 64)))) != 0) || ((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & ((1L << (PLUS - 128)) | (1L << (MINUS - 128)) | (1L << (CARET - 128)) | (1L << (STAR - 128)) | (1L << (AMPERSAND - 128)) | (1L << (RECEIVE - 128)) | (1L << (DECIMAL_LIT - 128)) | (1L << (BINARY_LIT - 128)) | (1L << (OCTAL_LIT - 128)) | (1L << (HEX_LIT - 128)) | (1L << (IMAGINARY_LIT - 128)) | (1L << (RUNE_LIT - 128)) | (1L << (RAW_STRING_LIT - 128)) | (1L << (INTERPRETED_STRING_LIT - 128)))) != 0)) {
+ if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FLOAT_LIT) | (1L << TRUE) | (1L << FALSE) | (1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << OLD) | (1L << BEFORE) | (1L << FORALL) | (1L << EXISTS) | (1L << ACCESS) | (1L << UNFOLDING) | (1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << LEN) | (1L << NEW) | (1L << MAKE) | (1L << CAP) | (1L << SOME) | (1L << GET) | (1L << DOM) | (1L << NONE) | (1L << PRED) | (1L << TYPE_OF) | (1L << IS_COMPARABLE) | (1L << WRITEPERM) | (1L << NOPERM))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (TRUSTED - 64)) | (1L << (FUNC - 64)) | (1L << (INTERFACE - 64)) | (1L << (MAP - 64)) | (1L << (STRUCT - 64)) | (1L << (CHAN - 64)) | (1L << (RANGE - 64)) | (1L << (TYPE - 64)) | (1L << (NIL_LIT - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (L_PAREN - 64)) | (1L << (L_BRACKET - 64)))) != 0) || ((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & ((1L << (EXCLAMATION - 128)) | (1L << (PLUS - 128)) | (1L << (MINUS - 128)) | (1L << (CARET - 128)) | (1L << (STAR - 128)) | (1L << (AMPERSAND - 128)) | (1L << (RECEIVE - 128)) | (1L << (DECIMAL_LIT - 128)) | (1L << (BINARY_LIT - 128)) | (1L << (OCTAL_LIT - 128)) | (1L << (HEX_LIT - 128)) | (1L << (IMAGINARY_LIT - 128)) | (1L << (RUNE_LIT - 128)) | (1L << (RAW_STRING_LIT - 128)) | (1L << (INTERPRETED_STRING_LIT - 128)))) != 0)) {
{
setState(716);
closureSpecParams();
@@ -5016,7 +5016,7 @@ private ExpressionContext expression(int _p) throws RecognitionException {
setState(901);
((UnaryExprContext)_localctx).unary_op = _input.LT(1);
_la = _input.LA(1);
- if ( !(((((_la - 127)) & ~0x3f) == 0 && ((1L << (_la - 127)) & ((1L << (EXCLAMATION - 127)) | (1L << (PLUS - 127)) | (1L << (MINUS - 127)) | (1L << (CARET - 127)) | (1L << (STAR - 127)) | (1L << (AMPERSAND - 127)) | (1L << (RECEIVE - 127)))) != 0)) ) {
+ if ( !(((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & ((1L << (EXCLAMATION - 128)) | (1L << (PLUS - 128)) | (1L << (MINUS - 128)) | (1L << (CARET - 128)) | (1L << (STAR - 128)) | (1L << (AMPERSAND - 128)) | (1L << (RECEIVE - 128)))) != 0)) ) {
((UnaryExprContext)_localctx).unary_op = (Token)_errHandler.recoverInline(this);
}
else {
@@ -5101,7 +5101,7 @@ private ExpressionContext expression(int _p) throws RecognitionException {
setState(919);
((MulExprContext)_localctx).mul_op = _input.LT(1);
_la = _input.LA(1);
- if ( !(((((_la - 122)) & ~0x3f) == 0 && ((1L << (_la - 122)) & ((1L << (DIV - 122)) | (1L << (MOD - 122)) | (1L << (LSHIFT - 122)) | (1L << (RSHIFT - 122)) | (1L << (BIT_CLEAR - 122)) | (1L << (STAR - 122)) | (1L << (AMPERSAND - 122)))) != 0)) ) {
+ if ( !(((((_la - 123)) & ~0x3f) == 0 && ((1L << (_la - 123)) & ((1L << (DIV - 123)) | (1L << (MOD - 123)) | (1L << (LSHIFT - 123)) | (1L << (RSHIFT - 123)) | (1L << (BIT_CLEAR - 123)) | (1L << (STAR - 123)) | (1L << (AMPERSAND - 123)))) != 0)) ) {
((MulExprContext)_localctx).mul_op = (Token)_errHandler.recoverInline(this);
}
else {
@@ -5122,7 +5122,7 @@ private ExpressionContext expression(int _p) throws RecognitionException {
setState(922);
((AddExprContext)_localctx).add_op = _input.LT(1);
_la = _input.LA(1);
- if ( !(_la==WAND || ((((_la - 109)) & ~0x3f) == 0 && ((1L << (_la - 109)) & ((1L << (PLUS_PLUS - 109)) | (1L << (OR - 109)) | (1L << (PLUS - 109)) | (1L << (MINUS - 109)) | (1L << (CARET - 109)))) != 0)) ) {
+ if ( !(_la==WAND || ((((_la - 110)) & ~0x3f) == 0 && ((1L << (_la - 110)) & ((1L << (PLUS_PLUS - 110)) | (1L << (OR - 110)) | (1L << (PLUS - 110)) | (1L << (MINUS - 110)) | (1L << (CARET - 110)))) != 0)) ) {
((AddExprContext)_localctx).add_op = (Token)_errHandler.recoverInline(this);
}
else {
@@ -6472,7 +6472,7 @@ public final PredConstructArgsContext predConstructArgs() throws RecognitionExce
setState(1073);
_errHandler.sync(this);
_la = _input.LA(1);
- if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FLOAT_LIT) | (1L << TRUE) | (1L << FALSE) | (1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << OLD) | (1L << BEFORE) | (1L << FORALL) | (1L << EXISTS) | (1L << ACCESS) | (1L << UNFOLDING) | (1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << LEN) | (1L << NEW) | (1L << MAKE) | (1L << CAP) | (1L << SOME) | (1L << GET) | (1L << DOM) | (1L << NONE) | (1L << PRED) | (1L << TYPE_OF) | (1L << IS_COMPARABLE) | (1L << WRITEPERM) | (1L << NOPERM))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (TRUSTED - 64)) | (1L << (FUNC - 64)) | (1L << (INTERFACE - 64)) | (1L << (MAP - 64)) | (1L << (STRUCT - 64)) | (1L << (CHAN - 64)) | (1L << (RANGE - 64)) | (1L << (TYPE - 64)) | (1L << (NIL_LIT - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (L_PAREN - 64)) | (1L << (L_BRACKET - 64)) | (1L << (EXCLAMATION - 64)))) != 0) || ((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & ((1L << (PLUS - 128)) | (1L << (MINUS - 128)) | (1L << (CARET - 128)) | (1L << (STAR - 128)) | (1L << (AMPERSAND - 128)) | (1L << (RECEIVE - 128)) | (1L << (DECIMAL_LIT - 128)) | (1L << (BINARY_LIT - 128)) | (1L << (OCTAL_LIT - 128)) | (1L << (HEX_LIT - 128)) | (1L << (IMAGINARY_LIT - 128)) | (1L << (RUNE_LIT - 128)) | (1L << (RAW_STRING_LIT - 128)) | (1L << (INTERPRETED_STRING_LIT - 128)))) != 0)) {
+ if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FLOAT_LIT) | (1L << TRUE) | (1L << FALSE) | (1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << OLD) | (1L << BEFORE) | (1L << FORALL) | (1L << EXISTS) | (1L << ACCESS) | (1L << UNFOLDING) | (1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << LEN) | (1L << NEW) | (1L << MAKE) | (1L << CAP) | (1L << SOME) | (1L << GET) | (1L << DOM) | (1L << NONE) | (1L << PRED) | (1L << TYPE_OF) | (1L << IS_COMPARABLE) | (1L << WRITEPERM) | (1L << NOPERM))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (TRUSTED - 64)) | (1L << (FUNC - 64)) | (1L << (INTERFACE - 64)) | (1L << (MAP - 64)) | (1L << (STRUCT - 64)) | (1L << (CHAN - 64)) | (1L << (RANGE - 64)) | (1L << (TYPE - 64)) | (1L << (NIL_LIT - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (L_PAREN - 64)) | (1L << (L_BRACKET - 64)))) != 0) || ((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & ((1L << (EXCLAMATION - 128)) | (1L << (PLUS - 128)) | (1L << (MINUS - 128)) | (1L << (CARET - 128)) | (1L << (STAR - 128)) | (1L << (AMPERSAND - 128)) | (1L << (RECEIVE - 128)) | (1L << (DECIMAL_LIT - 128)) | (1L << (BINARY_LIT - 128)) | (1L << (OCTAL_LIT - 128)) | (1L << (HEX_LIT - 128)) | (1L << (IMAGINARY_LIT - 128)) | (1L << (RUNE_LIT - 128)) | (1L << (RAW_STRING_LIT - 128)) | (1L << (INTERPRETED_STRING_LIT - 128)))) != 0)) {
{
setState(1072);
expressionList();
@@ -7027,7 +7027,7 @@ public final PredTypeParamsContext predTypeParams() throws RecognitionException
setState(1152);
_errHandler.sync(this);
_la = _input.LA(1);
- if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << DOM) | (1L << PRED))) != 0) || ((((_la - 73)) & ~0x3f) == 0 && ((1L << (_la - 73)) & ((1L << (FUNC - 73)) | (1L << (INTERFACE - 73)) | (1L << (MAP - 73)) | (1L << (STRUCT - 73)) | (1L << (CHAN - 73)) | (1L << (IDENTIFIER - 73)) | (1L << (L_PAREN - 73)) | (1L << (L_BRACKET - 73)) | (1L << (STAR - 73)) | (1L << (RECEIVE - 73)))) != 0)) {
+ if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << DOM) | (1L << PRED))) != 0) || ((((_la - 74)) & ~0x3f) == 0 && ((1L << (_la - 74)) & ((1L << (FUNC - 74)) | (1L << (INTERFACE - 74)) | (1L << (MAP - 74)) | (1L << (STRUCT - 74)) | (1L << (CHAN - 74)) | (1L << (IDENTIFIER - 74)) | (1L << (L_PAREN - 74)) | (1L << (L_BRACKET - 74)) | (1L << (STAR - 74)) | (1L << (RECEIVE - 74)))) != 0)) {
{
setState(1141);
type_();
@@ -7268,7 +7268,7 @@ public final Slice_Context slice_() throws RecognitionException {
setState(1172);
_errHandler.sync(this);
_la = _input.LA(1);
- if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FLOAT_LIT) | (1L << TRUE) | (1L << FALSE) | (1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << OLD) | (1L << BEFORE) | (1L << FORALL) | (1L << EXISTS) | (1L << ACCESS) | (1L << UNFOLDING) | (1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << LEN) | (1L << NEW) | (1L << MAKE) | (1L << CAP) | (1L << SOME) | (1L << GET) | (1L << DOM) | (1L << NONE) | (1L << PRED) | (1L << TYPE_OF) | (1L << IS_COMPARABLE) | (1L << WRITEPERM) | (1L << NOPERM))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (TRUSTED - 64)) | (1L << (FUNC - 64)) | (1L << (INTERFACE - 64)) | (1L << (MAP - 64)) | (1L << (STRUCT - 64)) | (1L << (CHAN - 64)) | (1L << (RANGE - 64)) | (1L << (TYPE - 64)) | (1L << (NIL_LIT - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (L_PAREN - 64)) | (1L << (L_BRACKET - 64)) | (1L << (EXCLAMATION - 64)))) != 0) || ((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & ((1L << (PLUS - 128)) | (1L << (MINUS - 128)) | (1L << (CARET - 128)) | (1L << (STAR - 128)) | (1L << (AMPERSAND - 128)) | (1L << (RECEIVE - 128)) | (1L << (DECIMAL_LIT - 128)) | (1L << (BINARY_LIT - 128)) | (1L << (OCTAL_LIT - 128)) | (1L << (HEX_LIT - 128)) | (1L << (IMAGINARY_LIT - 128)) | (1L << (RUNE_LIT - 128)) | (1L << (RAW_STRING_LIT - 128)) | (1L << (INTERPRETED_STRING_LIT - 128)))) != 0)) {
+ if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FLOAT_LIT) | (1L << TRUE) | (1L << FALSE) | (1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << OLD) | (1L << BEFORE) | (1L << FORALL) | (1L << EXISTS) | (1L << ACCESS) | (1L << UNFOLDING) | (1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << LEN) | (1L << NEW) | (1L << MAKE) | (1L << CAP) | (1L << SOME) | (1L << GET) | (1L << DOM) | (1L << NONE) | (1L << PRED) | (1L << TYPE_OF) | (1L << IS_COMPARABLE) | (1L << WRITEPERM) | (1L << NOPERM))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (TRUSTED - 64)) | (1L << (FUNC - 64)) | (1L << (INTERFACE - 64)) | (1L << (MAP - 64)) | (1L << (STRUCT - 64)) | (1L << (CHAN - 64)) | (1L << (RANGE - 64)) | (1L << (TYPE - 64)) | (1L << (NIL_LIT - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (L_PAREN - 64)) | (1L << (L_BRACKET - 64)))) != 0) || ((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & ((1L << (EXCLAMATION - 128)) | (1L << (PLUS - 128)) | (1L << (MINUS - 128)) | (1L << (CARET - 128)) | (1L << (STAR - 128)) | (1L << (AMPERSAND - 128)) | (1L << (RECEIVE - 128)) | (1L << (DECIMAL_LIT - 128)) | (1L << (BINARY_LIT - 128)) | (1L << (OCTAL_LIT - 128)) | (1L << (HEX_LIT - 128)) | (1L << (IMAGINARY_LIT - 128)) | (1L << (RUNE_LIT - 128)) | (1L << (RAW_STRING_LIT - 128)) | (1L << (INTERPRETED_STRING_LIT - 128)))) != 0)) {
{
setState(1171);
low();
@@ -7280,7 +7280,7 @@ public final Slice_Context slice_() throws RecognitionException {
setState(1176);
_errHandler.sync(this);
_la = _input.LA(1);
- if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FLOAT_LIT) | (1L << TRUE) | (1L << FALSE) | (1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << OLD) | (1L << BEFORE) | (1L << FORALL) | (1L << EXISTS) | (1L << ACCESS) | (1L << UNFOLDING) | (1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << LEN) | (1L << NEW) | (1L << MAKE) | (1L << CAP) | (1L << SOME) | (1L << GET) | (1L << DOM) | (1L << NONE) | (1L << PRED) | (1L << TYPE_OF) | (1L << IS_COMPARABLE) | (1L << WRITEPERM) | (1L << NOPERM))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (TRUSTED - 64)) | (1L << (FUNC - 64)) | (1L << (INTERFACE - 64)) | (1L << (MAP - 64)) | (1L << (STRUCT - 64)) | (1L << (CHAN - 64)) | (1L << (RANGE - 64)) | (1L << (TYPE - 64)) | (1L << (NIL_LIT - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (L_PAREN - 64)) | (1L << (L_BRACKET - 64)) | (1L << (EXCLAMATION - 64)))) != 0) || ((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & ((1L << (PLUS - 128)) | (1L << (MINUS - 128)) | (1L << (CARET - 128)) | (1L << (STAR - 128)) | (1L << (AMPERSAND - 128)) | (1L << (RECEIVE - 128)) | (1L << (DECIMAL_LIT - 128)) | (1L << (BINARY_LIT - 128)) | (1L << (OCTAL_LIT - 128)) | (1L << (HEX_LIT - 128)) | (1L << (IMAGINARY_LIT - 128)) | (1L << (RUNE_LIT - 128)) | (1L << (RAW_STRING_LIT - 128)) | (1L << (INTERPRETED_STRING_LIT - 128)))) != 0)) {
+ if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FLOAT_LIT) | (1L << TRUE) | (1L << FALSE) | (1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << OLD) | (1L << BEFORE) | (1L << FORALL) | (1L << EXISTS) | (1L << ACCESS) | (1L << UNFOLDING) | (1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << LEN) | (1L << NEW) | (1L << MAKE) | (1L << CAP) | (1L << SOME) | (1L << GET) | (1L << DOM) | (1L << NONE) | (1L << PRED) | (1L << TYPE_OF) | (1L << IS_COMPARABLE) | (1L << WRITEPERM) | (1L << NOPERM))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (TRUSTED - 64)) | (1L << (FUNC - 64)) | (1L << (INTERFACE - 64)) | (1L << (MAP - 64)) | (1L << (STRUCT - 64)) | (1L << (CHAN - 64)) | (1L << (RANGE - 64)) | (1L << (TYPE - 64)) | (1L << (NIL_LIT - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (L_PAREN - 64)) | (1L << (L_BRACKET - 64)))) != 0) || ((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & ((1L << (EXCLAMATION - 128)) | (1L << (PLUS - 128)) | (1L << (MINUS - 128)) | (1L << (CARET - 128)) | (1L << (STAR - 128)) | (1L << (AMPERSAND - 128)) | (1L << (RECEIVE - 128)) | (1L << (DECIMAL_LIT - 128)) | (1L << (BINARY_LIT - 128)) | (1L << (OCTAL_LIT - 128)) | (1L << (HEX_LIT - 128)) | (1L << (IMAGINARY_LIT - 128)) | (1L << (RUNE_LIT - 128)) | (1L << (RAW_STRING_LIT - 128)) | (1L << (INTERPRETED_STRING_LIT - 128)))) != 0)) {
{
setState(1175);
high();
@@ -7294,7 +7294,7 @@ public final Slice_Context slice_() throws RecognitionException {
setState(1179);
_errHandler.sync(this);
_la = _input.LA(1);
- if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FLOAT_LIT) | (1L << TRUE) | (1L << FALSE) | (1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << OLD) | (1L << BEFORE) | (1L << FORALL) | (1L << EXISTS) | (1L << ACCESS) | (1L << UNFOLDING) | (1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << LEN) | (1L << NEW) | (1L << MAKE) | (1L << CAP) | (1L << SOME) | (1L << GET) | (1L << DOM) | (1L << NONE) | (1L << PRED) | (1L << TYPE_OF) | (1L << IS_COMPARABLE) | (1L << WRITEPERM) | (1L << NOPERM))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (TRUSTED - 64)) | (1L << (FUNC - 64)) | (1L << (INTERFACE - 64)) | (1L << (MAP - 64)) | (1L << (STRUCT - 64)) | (1L << (CHAN - 64)) | (1L << (RANGE - 64)) | (1L << (TYPE - 64)) | (1L << (NIL_LIT - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (L_PAREN - 64)) | (1L << (L_BRACKET - 64)) | (1L << (EXCLAMATION - 64)))) != 0) || ((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & ((1L << (PLUS - 128)) | (1L << (MINUS - 128)) | (1L << (CARET - 128)) | (1L << (STAR - 128)) | (1L << (AMPERSAND - 128)) | (1L << (RECEIVE - 128)) | (1L << (DECIMAL_LIT - 128)) | (1L << (BINARY_LIT - 128)) | (1L << (OCTAL_LIT - 128)) | (1L << (HEX_LIT - 128)) | (1L << (IMAGINARY_LIT - 128)) | (1L << (RUNE_LIT - 128)) | (1L << (RAW_STRING_LIT - 128)) | (1L << (INTERPRETED_STRING_LIT - 128)))) != 0)) {
+ if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FLOAT_LIT) | (1L << TRUE) | (1L << FALSE) | (1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << OLD) | (1L << BEFORE) | (1L << FORALL) | (1L << EXISTS) | (1L << ACCESS) | (1L << UNFOLDING) | (1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << LEN) | (1L << NEW) | (1L << MAKE) | (1L << CAP) | (1L << SOME) | (1L << GET) | (1L << DOM) | (1L << NONE) | (1L << PRED) | (1L << TYPE_OF) | (1L << IS_COMPARABLE) | (1L << WRITEPERM) | (1L << NOPERM))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (TRUSTED - 64)) | (1L << (FUNC - 64)) | (1L << (INTERFACE - 64)) | (1L << (MAP - 64)) | (1L << (STRUCT - 64)) | (1L << (CHAN - 64)) | (1L << (RANGE - 64)) | (1L << (TYPE - 64)) | (1L << (NIL_LIT - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (L_PAREN - 64)) | (1L << (L_BRACKET - 64)))) != 0) || ((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & ((1L << (EXCLAMATION - 128)) | (1L << (PLUS - 128)) | (1L << (MINUS - 128)) | (1L << (CARET - 128)) | (1L << (STAR - 128)) | (1L << (AMPERSAND - 128)) | (1L << (RECEIVE - 128)) | (1L << (DECIMAL_LIT - 128)) | (1L << (BINARY_LIT - 128)) | (1L << (OCTAL_LIT - 128)) | (1L << (HEX_LIT - 128)) | (1L << (IMAGINARY_LIT - 128)) | (1L << (RUNE_LIT - 128)) | (1L << (RAW_STRING_LIT - 128)) | (1L << (INTERPRETED_STRING_LIT - 128)))) != 0)) {
{
setState(1178);
low();
@@ -7470,12 +7470,12 @@ public final Assign_opContext assign_op() throws RecognitionException {
setState(1197);
_errHandler.sync(this);
_la = _input.LA(1);
- if (((((_la - 121)) & ~0x3f) == 0 && ((1L << (_la - 121)) & ((1L << (OR - 121)) | (1L << (DIV - 121)) | (1L << (MOD - 121)) | (1L << (LSHIFT - 121)) | (1L << (RSHIFT - 121)) | (1L << (BIT_CLEAR - 121)) | (1L << (PLUS - 121)) | (1L << (MINUS - 121)) | (1L << (CARET - 121)) | (1L << (STAR - 121)) | (1L << (AMPERSAND - 121)))) != 0)) {
+ if (((((_la - 122)) & ~0x3f) == 0 && ((1L << (_la - 122)) & ((1L << (OR - 122)) | (1L << (DIV - 122)) | (1L << (MOD - 122)) | (1L << (LSHIFT - 122)) | (1L << (RSHIFT - 122)) | (1L << (BIT_CLEAR - 122)) | (1L << (PLUS - 122)) | (1L << (MINUS - 122)) | (1L << (CARET - 122)) | (1L << (STAR - 122)) | (1L << (AMPERSAND - 122)))) != 0)) {
{
setState(1196);
((Assign_opContext)_localctx).ass_op = _input.LT(1);
_la = _input.LA(1);
- if ( !(((((_la - 121)) & ~0x3f) == 0 && ((1L << (_la - 121)) & ((1L << (OR - 121)) | (1L << (DIV - 121)) | (1L << (MOD - 121)) | (1L << (LSHIFT - 121)) | (1L << (RSHIFT - 121)) | (1L << (BIT_CLEAR - 121)) | (1L << (PLUS - 121)) | (1L << (MINUS - 121)) | (1L << (CARET - 121)) | (1L << (STAR - 121)) | (1L << (AMPERSAND - 121)))) != 0)) ) {
+ if ( !(((((_la - 122)) & ~0x3f) == 0 && ((1L << (_la - 122)) & ((1L << (OR - 122)) | (1L << (DIV - 122)) | (1L << (MOD - 122)) | (1L << (LSHIFT - 122)) | (1L << (RSHIFT - 122)) | (1L << (BIT_CLEAR - 122)) | (1L << (PLUS - 122)) | (1L << (MINUS - 122)) | (1L << (CARET - 122)) | (1L << (STAR - 122)) | (1L << (AMPERSAND - 122)))) != 0)) ) {
((Assign_opContext)_localctx).ass_op = (Token)_errHandler.recoverInline(this);
}
else {
@@ -7501,6 +7501,96 @@ public final Assign_opContext assign_op() throws RecognitionException {
return _localctx;
}
+ public static class RangeClauseContext extends ParserRuleContext {
+ public TerminalNode RANGE() { return getToken(GobraParser.RANGE, 0); }
+ public ExpressionContext expression() {
+ return getRuleContext(ExpressionContext.class,0);
+ }
+ public ExpressionListContext expressionList() {
+ return getRuleContext(ExpressionListContext.class,0);
+ }
+ public TerminalNode ASSIGN() { return getToken(GobraParser.ASSIGN, 0); }
+ public MaybeAddressableIdentifierListContext maybeAddressableIdentifierList() {
+ return getRuleContext(MaybeAddressableIdentifierListContext.class,0);
+ }
+ public TerminalNode DECLARE_ASSIGN() { return getToken(GobraParser.DECLARE_ASSIGN, 0); }
+ public TerminalNode WITH() { return getToken(GobraParser.WITH, 0); }
+ public TerminalNode IDENTIFIER() { return getToken(GobraParser.IDENTIFIER, 0); }
+ public RangeClauseContext(ParserRuleContext parent, int invokingState) {
+ super(parent, invokingState);
+ }
+ @Override public int getRuleIndex() { return RULE_rangeClause; }
+ @Override
+ public T accept(ParseTreeVisitor extends T> visitor) {
+ if ( visitor instanceof GobraParserVisitor ) return ((GobraParserVisitor extends T>)visitor).visitRangeClause(this);
+ else return visitor.visitChildren(this);
+ }
+ }
+
+ public final RangeClauseContext rangeClause() throws RecognitionException {
+ RangeClauseContext _localctx = new RangeClauseContext(_ctx, getState());
+ enterRule(_localctx, 196, RULE_rangeClause);
+ int _la;
+ try {
+ enterOuterAlt(_localctx, 1);
+ {
+ setState(1207);
+ _errHandler.sync(this);
+ switch ( getInterpreter().adaptivePredict(_input,99,_ctx) ) {
+ case 1:
+ {
+ setState(1201);
+ expressionList();
+ setState(1202);
+ match(ASSIGN);
+ }
+ break;
+ case 2:
+ {
+ setState(1204);
+ maybeAddressableIdentifierList();
+ setState(1205);
+ match(DECLARE_ASSIGN);
+ }
+ break;
+ }
+ setState(1209);
+ match(RANGE);
+ setState(1210);
+ expression(0);
+ setState(1215);
+ _errHandler.sync(this);
+ _la = _input.LA(1);
+ if (_la==WITH) {
+ {
+ setState(1211);
+ match(WITH);
+ setState(1213);
+ _errHandler.sync(this);
+ _la = _input.LA(1);
+ if (_la==IDENTIFIER) {
+ {
+ setState(1212);
+ match(IDENTIFIER);
+ }
+ }
+
+ }
+ }
+
+ }
+ }
+ catch (RecognitionException re) {
+ _localctx.exception = re;
+ _errHandler.reportError(this, re);
+ _errHandler.recover(this, re);
+ }
+ finally {
+ exitRule();
+ }
+ return _localctx;
+ }
+
public static class PackageClauseContext extends ParserRuleContext {
public Token packageName;
public TerminalNode PACKAGE() { return getToken(GobraParser.PACKAGE, 0); }
@@ -7518,13 +7608,13 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final PackageClauseContext packageClause() throws RecognitionException {
PackageClauseContext _localctx = new PackageClauseContext(_ctx, getState());
- enterRule(_localctx, 196, RULE_packageClause);
+ enterRule(_localctx, 198, RULE_packageClause);
try {
enterOuterAlt(_localctx, 1);
{
- setState(1201);
+ setState(1217);
match(PACKAGE);
- setState(1202);
+ setState(1218);
((PackageClauseContext)_localctx).packageName = match(IDENTIFIER);
}
}
@@ -7556,11 +7646,11 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final ImportPathContext importPath() throws RecognitionException {
ImportPathContext _localctx = new ImportPathContext(_ctx, getState());
- enterRule(_localctx, 198, RULE_importPath);
+ enterRule(_localctx, 200, RULE_importPath);
try {
enterOuterAlt(_localctx, 1);
{
- setState(1204);
+ setState(1220);
string_();
}
}
@@ -7598,29 +7688,29 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final DeclarationContext declaration() throws RecognitionException {
DeclarationContext _localctx = new DeclarationContext(_ctx, getState());
- enterRule(_localctx, 200, RULE_declaration);
+ enterRule(_localctx, 202, RULE_declaration);
try {
- setState(1209);
+ setState(1225);
_errHandler.sync(this);
switch (_input.LA(1)) {
case CONST:
enterOuterAlt(_localctx, 1);
{
- setState(1206);
+ setState(1222);
constDecl();
}
break;
case TYPE:
enterOuterAlt(_localctx, 2);
{
- setState(1207);
+ setState(1223);
typeDecl();
}
break;
case VAR:
enterOuterAlt(_localctx, 3);
{
- setState(1208);
+ setState(1224);
varDecl();
}
break;
@@ -7668,43 +7758,43 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final ConstDeclContext constDecl() throws RecognitionException {
ConstDeclContext _localctx = new ConstDeclContext(_ctx, getState());
- enterRule(_localctx, 202, RULE_constDecl);
+ enterRule(_localctx, 204, RULE_constDecl);
int _la;
try {
enterOuterAlt(_localctx, 1);
{
- setState(1211);
+ setState(1227);
match(CONST);
- setState(1223);
+ setState(1239);
_errHandler.sync(this);
switch (_input.LA(1)) {
case IDENTIFIER:
{
- setState(1212);
+ setState(1228);
constSpec();
}
break;
case L_PAREN:
{
- setState(1213);
+ setState(1229);
match(L_PAREN);
- setState(1219);
+ setState(1235);
_errHandler.sync(this);
_la = _input.LA(1);
while (_la==IDENTIFIER) {
{
{
- setState(1214);
+ setState(1230);
constSpec();
- setState(1215);
+ setState(1231);
eos();
}
}
- setState(1221);
+ setState(1237);
_errHandler.sync(this);
_la = _input.LA(1);
}
- setState(1222);
+ setState(1238);
match(R_PAREN);
}
break;
@@ -7748,31 +7838,31 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final ConstSpecContext constSpec() throws RecognitionException {
ConstSpecContext _localctx = new ConstSpecContext(_ctx, getState());
- enterRule(_localctx, 204, RULE_constSpec);
+ enterRule(_localctx, 206, RULE_constSpec);
int _la;
try {
enterOuterAlt(_localctx, 1);
{
- setState(1225);
+ setState(1241);
identifierList();
- setState(1231);
+ setState(1247);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,103,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,106,_ctx) ) {
case 1:
{
- setState(1227);
+ setState(1243);
_errHandler.sync(this);
_la = _input.LA(1);
- if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << DOM) | (1L << PRED))) != 0) || ((((_la - 73)) & ~0x3f) == 0 && ((1L << (_la - 73)) & ((1L << (FUNC - 73)) | (1L << (INTERFACE - 73)) | (1L << (MAP - 73)) | (1L << (STRUCT - 73)) | (1L << (CHAN - 73)) | (1L << (IDENTIFIER - 73)) | (1L << (L_PAREN - 73)) | (1L << (L_BRACKET - 73)) | (1L << (STAR - 73)) | (1L << (RECEIVE - 73)))) != 0)) {
+ if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << DOM) | (1L << PRED))) != 0) || ((((_la - 74)) & ~0x3f) == 0 && ((1L << (_la - 74)) & ((1L << (FUNC - 74)) | (1L << (INTERFACE - 74)) | (1L << (MAP - 74)) | (1L << (STRUCT - 74)) | (1L << (CHAN - 74)) | (1L << (IDENTIFIER - 74)) | (1L << (L_PAREN - 74)) | (1L << (L_BRACKET - 74)) | (1L << (STAR - 74)) | (1L << (RECEIVE - 74)))) != 0)) {
{
- setState(1226);
+ setState(1242);
type_();
}
}
- setState(1229);
+ setState(1245);
match(ASSIGN);
- setState(1230);
+ setState(1246);
expressionList();
}
break;
@@ -7812,30 +7902,30 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final IdentifierListContext identifierList() throws RecognitionException {
IdentifierListContext _localctx = new IdentifierListContext(_ctx, getState());
- enterRule(_localctx, 206, RULE_identifierList);
+ enterRule(_localctx, 208, RULE_identifierList);
try {
int _alt;
enterOuterAlt(_localctx, 1);
{
- setState(1233);
+ setState(1249);
match(IDENTIFIER);
- setState(1238);
+ setState(1254);
_errHandler.sync(this);
- _alt = getInterpreter().adaptivePredict(_input,104,_ctx);
+ _alt = getInterpreter().adaptivePredict(_input,107,_ctx);
while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) {
if ( _alt==1 ) {
{
{
- setState(1234);
+ setState(1250);
match(COMMA);
- setState(1235);
+ setState(1251);
match(IDENTIFIER);
}
}
}
- setState(1240);
+ setState(1256);
_errHandler.sync(this);
- _alt = getInterpreter().adaptivePredict(_input,104,_ctx);
+ _alt = getInterpreter().adaptivePredict(_input,107,_ctx);
}
}
}
@@ -7874,30 +7964,30 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final ExpressionListContext expressionList() throws RecognitionException {
ExpressionListContext _localctx = new ExpressionListContext(_ctx, getState());
- enterRule(_localctx, 208, RULE_expressionList);
+ enterRule(_localctx, 210, RULE_expressionList);
try {
int _alt;
enterOuterAlt(_localctx, 1);
{
- setState(1241);
+ setState(1257);
expression(0);
- setState(1246);
+ setState(1262);
_errHandler.sync(this);
- _alt = getInterpreter().adaptivePredict(_input,105,_ctx);
+ _alt = getInterpreter().adaptivePredict(_input,108,_ctx);
while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) {
if ( _alt==1 ) {
{
{
- setState(1242);
+ setState(1258);
match(COMMA);
- setState(1243);
+ setState(1259);
expression(0);
}
}
}
- setState(1248);
+ setState(1264);
_errHandler.sync(this);
- _alt = getInterpreter().adaptivePredict(_input,105,_ctx);
+ _alt = getInterpreter().adaptivePredict(_input,108,_ctx);
}
}
}
@@ -7941,43 +8031,43 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final TypeDeclContext typeDecl() throws RecognitionException {
TypeDeclContext _localctx = new TypeDeclContext(_ctx, getState());
- enterRule(_localctx, 210, RULE_typeDecl);
+ enterRule(_localctx, 212, RULE_typeDecl);
int _la;
try {
enterOuterAlt(_localctx, 1);
{
- setState(1249);
+ setState(1265);
match(TYPE);
- setState(1261);
+ setState(1277);
_errHandler.sync(this);
switch (_input.LA(1)) {
case IDENTIFIER:
{
- setState(1250);
+ setState(1266);
typeSpec();
}
break;
case L_PAREN:
{
- setState(1251);
+ setState(1267);
match(L_PAREN);
- setState(1257);
+ setState(1273);
_errHandler.sync(this);
_la = _input.LA(1);
while (_la==IDENTIFIER) {
{
{
- setState(1252);
+ setState(1268);
typeSpec();
- setState(1253);
+ setState(1269);
eos();
}
}
- setState(1259);
+ setState(1275);
_errHandler.sync(this);
_la = _input.LA(1);
}
- setState(1260);
+ setState(1276);
match(R_PAREN);
}
break;
@@ -8016,24 +8106,24 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final TypeSpecContext typeSpec() throws RecognitionException {
TypeSpecContext _localctx = new TypeSpecContext(_ctx, getState());
- enterRule(_localctx, 212, RULE_typeSpec);
+ enterRule(_localctx, 214, RULE_typeSpec);
int _la;
try {
enterOuterAlt(_localctx, 1);
{
- setState(1263);
+ setState(1279);
match(IDENTIFIER);
- setState(1265);
+ setState(1281);
_errHandler.sync(this);
_la = _input.LA(1);
if (_la==ASSIGN) {
{
- setState(1264);
+ setState(1280);
match(ASSIGN);
}
}
- setState(1267);
+ setState(1283);
type_();
}
}
@@ -8077,43 +8167,43 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final VarDeclContext varDecl() throws RecognitionException {
VarDeclContext _localctx = new VarDeclContext(_ctx, getState());
- enterRule(_localctx, 214, RULE_varDecl);
+ enterRule(_localctx, 216, RULE_varDecl);
int _la;
try {
enterOuterAlt(_localctx, 1);
{
- setState(1269);
+ setState(1285);
match(VAR);
- setState(1281);
+ setState(1297);
_errHandler.sync(this);
switch (_input.LA(1)) {
case IDENTIFIER:
{
- setState(1270);
+ setState(1286);
varSpec();
}
break;
case L_PAREN:
{
- setState(1271);
+ setState(1287);
match(L_PAREN);
- setState(1277);
+ setState(1293);
_errHandler.sync(this);
_la = _input.LA(1);
while (_la==IDENTIFIER) {
{
{
- setState(1272);
+ setState(1288);
varSpec();
- setState(1273);
+ setState(1289);
eos();
}
}
- setState(1279);
+ setState(1295);
_errHandler.sync(this);
_la = _input.LA(1);
}
- setState(1280);
+ setState(1296);
match(R_PAREN);
}
break;
@@ -8152,23 +8242,23 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final BlockContext block() throws RecognitionException {
BlockContext _localctx = new BlockContext(_ctx, getState());
- enterRule(_localctx, 216, RULE_block);
+ enterRule(_localctx, 218, RULE_block);
try {
enterOuterAlt(_localctx, 1);
{
- setState(1283);
+ setState(1299);
match(L_CURLY);
- setState(1285);
+ setState(1301);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,111,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,114,_ctx) ) {
case 1:
{
- setState(1284);
+ setState(1300);
statementList();
}
break;
}
- setState(1287);
+ setState(1303);
match(R_CURLY);
}
}
@@ -8209,12 +8299,12 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final StatementListContext statementList() throws RecognitionException {
StatementListContext _localctx = new StatementListContext(_ctx, getState());
- enterRule(_localctx, 218, RULE_statementList);
+ enterRule(_localctx, 220, RULE_statementList);
try {
int _alt;
enterOuterAlt(_localctx, 1);
{
- setState(1295);
+ setState(1311);
_errHandler.sync(this);
_alt = 1;
do {
@@ -8222,19 +8312,19 @@ public final StatementListContext statementList() throws RecognitionException {
case 1:
{
{
- setState(1290);
+ setState(1306);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,112,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,115,_ctx) ) {
case 1:
{
- setState(1289);
+ setState(1305);
eos();
}
break;
}
- setState(1292);
+ setState(1308);
statement();
- setState(1293);
+ setState(1309);
eos();
}
}
@@ -8242,9 +8332,9 @@ public final StatementListContext statementList() throws RecognitionException {
default:
throw new NoViableAltException(this);
}
- setState(1297);
+ setState(1313);
_errHandler.sync(this);
- _alt = getInterpreter().adaptivePredict(_input,113,_ctx);
+ _alt = getInterpreter().adaptivePredict(_input,116,_ctx);
} while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER );
}
}
@@ -8288,43 +8378,43 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final SimpleStmtContext simpleStmt() throws RecognitionException {
SimpleStmtContext _localctx = new SimpleStmtContext(_ctx, getState());
- enterRule(_localctx, 220, RULE_simpleStmt);
+ enterRule(_localctx, 222, RULE_simpleStmt);
try {
- setState(1304);
+ setState(1320);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,114,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,117,_ctx) ) {
case 1:
enterOuterAlt(_localctx, 1);
{
- setState(1299);
+ setState(1315);
sendStmt();
}
break;
case 2:
enterOuterAlt(_localctx, 2);
{
- setState(1300);
+ setState(1316);
incDecStmt();
}
break;
case 3:
enterOuterAlt(_localctx, 3);
{
- setState(1301);
+ setState(1317);
assignment();
}
break;
case 4:
enterOuterAlt(_localctx, 4);
{
- setState(1302);
+ setState(1318);
expressionStmt();
}
break;
case 5:
enterOuterAlt(_localctx, 5);
{
- setState(1303);
+ setState(1319);
shortVarDecl();
}
break;
@@ -8358,11 +8448,11 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final ExpressionStmtContext expressionStmt() throws RecognitionException {
ExpressionStmtContext _localctx = new ExpressionStmtContext(_ctx, getState());
- enterRule(_localctx, 222, RULE_expressionStmt);
+ enterRule(_localctx, 224, RULE_expressionStmt);
try {
enterOuterAlt(_localctx, 1);
{
- setState(1306);
+ setState(1322);
expression(0);
}
}
@@ -8399,15 +8489,15 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final SendStmtContext sendStmt() throws RecognitionException {
SendStmtContext _localctx = new SendStmtContext(_ctx, getState());
- enterRule(_localctx, 224, RULE_sendStmt);
+ enterRule(_localctx, 226, RULE_sendStmt);
try {
enterOuterAlt(_localctx, 1);
{
- setState(1308);
+ setState(1324);
((SendStmtContext)_localctx).channel = expression(0);
- setState(1309);
+ setState(1325);
match(RECEIVE);
- setState(1310);
+ setState(1326);
expression(0);
}
}
@@ -8441,14 +8531,14 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final IncDecStmtContext incDecStmt() throws RecognitionException {
IncDecStmtContext _localctx = new IncDecStmtContext(_ctx, getState());
- enterRule(_localctx, 226, RULE_incDecStmt);
+ enterRule(_localctx, 228, RULE_incDecStmt);
int _la;
try {
enterOuterAlt(_localctx, 1);
{
- setState(1312);
+ setState(1328);
expression(0);
- setState(1313);
+ setState(1329);
_la = _input.LA(1);
if ( !(_la==PLUS_PLUS || _la==MINUS_MINUS) ) {
_errHandler.recoverInline(this);
@@ -8494,15 +8584,15 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final AssignmentContext assignment() throws RecognitionException {
AssignmentContext _localctx = new AssignmentContext(_ctx, getState());
- enterRule(_localctx, 228, RULE_assignment);
+ enterRule(_localctx, 230, RULE_assignment);
try {
enterOuterAlt(_localctx, 1);
{
- setState(1315);
+ setState(1331);
expressionList();
- setState(1316);
+ setState(1332);
assign_op();
- setState(1317);
+ setState(1333);
expressionList();
}
}
@@ -8533,12 +8623,12 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final EmptyStmtContext emptyStmt() throws RecognitionException {
EmptyStmtContext _localctx = new EmptyStmtContext(_ctx, getState());
- enterRule(_localctx, 230, RULE_emptyStmt);
+ enterRule(_localctx, 232, RULE_emptyStmt);
int _la;
try {
enterOuterAlt(_localctx, 1);
{
- setState(1319);
+ setState(1335);
_la = _input.LA(1);
if ( !(_la==SEMI || _la==EOS) ) {
_errHandler.recoverInline(this);
@@ -8580,20 +8670,20 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final LabeledStmtContext labeledStmt() throws RecognitionException {
LabeledStmtContext _localctx = new LabeledStmtContext(_ctx, getState());
- enterRule(_localctx, 232, RULE_labeledStmt);
+ enterRule(_localctx, 234, RULE_labeledStmt);
try {
enterOuterAlt(_localctx, 1);
{
- setState(1321);
+ setState(1337);
match(IDENTIFIER);
- setState(1322);
+ setState(1338);
match(COLON);
- setState(1324);
+ setState(1340);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,115,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,118,_ctx) ) {
case 1:
{
- setState(1323);
+ setState(1339);
statement();
}
break;
@@ -8629,18 +8719,18 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final ReturnStmtContext returnStmt() throws RecognitionException {
ReturnStmtContext _localctx = new ReturnStmtContext(_ctx, getState());
- enterRule(_localctx, 234, RULE_returnStmt);
+ enterRule(_localctx, 236, RULE_returnStmt);
try {
enterOuterAlt(_localctx, 1);
{
- setState(1326);
+ setState(1342);
match(RETURN);
- setState(1328);
+ setState(1344);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,116,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,119,_ctx) ) {
case 1:
{
- setState(1327);
+ setState(1343);
expressionList();
}
break;
@@ -8674,18 +8764,18 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final BreakStmtContext breakStmt() throws RecognitionException {
BreakStmtContext _localctx = new BreakStmtContext(_ctx, getState());
- enterRule(_localctx, 236, RULE_breakStmt);
+ enterRule(_localctx, 238, RULE_breakStmt);
try {
enterOuterAlt(_localctx, 1);
{
- setState(1330);
+ setState(1346);
match(BREAK);
- setState(1332);
+ setState(1348);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,117,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,120,_ctx) ) {
case 1:
{
- setState(1331);
+ setState(1347);
match(IDENTIFIER);
}
break;
@@ -8719,18 +8809,18 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final ContinueStmtContext continueStmt() throws RecognitionException {
ContinueStmtContext _localctx = new ContinueStmtContext(_ctx, getState());
- enterRule(_localctx, 238, RULE_continueStmt);
+ enterRule(_localctx, 240, RULE_continueStmt);
try {
enterOuterAlt(_localctx, 1);
{
- setState(1334);
+ setState(1350);
match(CONTINUE);
- setState(1336);
+ setState(1352);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,118,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,121,_ctx) ) {
case 1:
{
- setState(1335);
+ setState(1351);
match(IDENTIFIER);
}
break;
@@ -8764,13 +8854,13 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final GotoStmtContext gotoStmt() throws RecognitionException {
GotoStmtContext _localctx = new GotoStmtContext(_ctx, getState());
- enterRule(_localctx, 240, RULE_gotoStmt);
+ enterRule(_localctx, 242, RULE_gotoStmt);
try {
enterOuterAlt(_localctx, 1);
{
- setState(1338);
+ setState(1354);
match(GOTO);
- setState(1339);
+ setState(1355);
match(IDENTIFIER);
}
}
@@ -8800,11 +8890,11 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final FallthroughStmtContext fallthroughStmt() throws RecognitionException {
FallthroughStmtContext _localctx = new FallthroughStmtContext(_ctx, getState());
- enterRule(_localctx, 242, RULE_fallthroughStmt);
+ enterRule(_localctx, 244, RULE_fallthroughStmt);
try {
enterOuterAlt(_localctx, 1);
{
- setState(1341);
+ setState(1357);
match(FALLTHROUGH);
}
}
@@ -8853,61 +8943,61 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final IfStmtContext ifStmt() throws RecognitionException {
IfStmtContext _localctx = new IfStmtContext(_ctx, getState());
- enterRule(_localctx, 244, RULE_ifStmt);
+ enterRule(_localctx, 246, RULE_ifStmt);
try {
enterOuterAlt(_localctx, 1);
{
- setState(1343);
+ setState(1359);
match(IF);
- setState(1352);
+ setState(1368);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,119,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,122,_ctx) ) {
case 1:
{
- setState(1344);
+ setState(1360);
expression(0);
}
break;
case 2:
{
- setState(1345);
+ setState(1361);
eos();
- setState(1346);
+ setState(1362);
expression(0);
}
break;
case 3:
{
- setState(1348);
+ setState(1364);
simpleStmt();
- setState(1349);
+ setState(1365);
eos();
- setState(1350);
+ setState(1366);
expression(0);
}
break;
}
- setState(1354);
+ setState(1370);
block();
- setState(1360);
+ setState(1376);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,121,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,124,_ctx) ) {
case 1:
{
- setState(1355);
+ setState(1371);
match(ELSE);
- setState(1358);
+ setState(1374);
_errHandler.sync(this);
switch (_input.LA(1)) {
case IF:
{
- setState(1356);
+ setState(1372);
ifStmt();
}
break;
case L_CURLY:
{
- setState(1357);
+ setState(1373);
block();
}
break;
@@ -8950,22 +9040,22 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final SwitchStmtContext switchStmt() throws RecognitionException {
SwitchStmtContext _localctx = new SwitchStmtContext(_ctx, getState());
- enterRule(_localctx, 246, RULE_switchStmt);
+ enterRule(_localctx, 248, RULE_switchStmt);
try {
- setState(1364);
+ setState(1380);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,122,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,125,_ctx) ) {
case 1:
enterOuterAlt(_localctx, 1);
{
- setState(1362);
+ setState(1378);
exprSwitchStmt();
}
break;
case 2:
enterOuterAlt(_localctx, 2);
{
- setState(1363);
+ setState(1379);
typeSwitchStmt();
}
break;
@@ -9014,24 +9104,24 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final ExprSwitchStmtContext exprSwitchStmt() throws RecognitionException {
ExprSwitchStmtContext _localctx = new ExprSwitchStmtContext(_ctx, getState());
- enterRule(_localctx, 248, RULE_exprSwitchStmt);
+ enterRule(_localctx, 250, RULE_exprSwitchStmt);
int _la;
try {
enterOuterAlt(_localctx, 1);
{
- setState(1366);
+ setState(1382);
match(SWITCH);
- setState(1377);
+ setState(1393);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,126,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,129,_ctx) ) {
case 1:
{
- setState(1368);
+ setState(1384);
_errHandler.sync(this);
_la = _input.LA(1);
- if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FLOAT_LIT) | (1L << TRUE) | (1L << FALSE) | (1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << OLD) | (1L << BEFORE) | (1L << FORALL) | (1L << EXISTS) | (1L << ACCESS) | (1L << UNFOLDING) | (1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << LEN) | (1L << NEW) | (1L << MAKE) | (1L << CAP) | (1L << SOME) | (1L << GET) | (1L << DOM) | (1L << NONE) | (1L << PRED) | (1L << TYPE_OF) | (1L << IS_COMPARABLE) | (1L << WRITEPERM) | (1L << NOPERM))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (TRUSTED - 64)) | (1L << (FUNC - 64)) | (1L << (INTERFACE - 64)) | (1L << (MAP - 64)) | (1L << (STRUCT - 64)) | (1L << (CHAN - 64)) | (1L << (RANGE - 64)) | (1L << (TYPE - 64)) | (1L << (NIL_LIT - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (L_PAREN - 64)) | (1L << (L_BRACKET - 64)) | (1L << (EXCLAMATION - 64)))) != 0) || ((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & ((1L << (PLUS - 128)) | (1L << (MINUS - 128)) | (1L << (CARET - 128)) | (1L << (STAR - 128)) | (1L << (AMPERSAND - 128)) | (1L << (RECEIVE - 128)) | (1L << (DECIMAL_LIT - 128)) | (1L << (BINARY_LIT - 128)) | (1L << (OCTAL_LIT - 128)) | (1L << (HEX_LIT - 128)) | (1L << (IMAGINARY_LIT - 128)) | (1L << (RUNE_LIT - 128)) | (1L << (RAW_STRING_LIT - 128)) | (1L << (INTERPRETED_STRING_LIT - 128)))) != 0)) {
+ if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FLOAT_LIT) | (1L << TRUE) | (1L << FALSE) | (1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << OLD) | (1L << BEFORE) | (1L << FORALL) | (1L << EXISTS) | (1L << ACCESS) | (1L << UNFOLDING) | (1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << LEN) | (1L << NEW) | (1L << MAKE) | (1L << CAP) | (1L << SOME) | (1L << GET) | (1L << DOM) | (1L << NONE) | (1L << PRED) | (1L << TYPE_OF) | (1L << IS_COMPARABLE) | (1L << WRITEPERM) | (1L << NOPERM))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (TRUSTED - 64)) | (1L << (FUNC - 64)) | (1L << (INTERFACE - 64)) | (1L << (MAP - 64)) | (1L << (STRUCT - 64)) | (1L << (CHAN - 64)) | (1L << (RANGE - 64)) | (1L << (TYPE - 64)) | (1L << (NIL_LIT - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (L_PAREN - 64)) | (1L << (L_BRACKET - 64)))) != 0) || ((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & ((1L << (EXCLAMATION - 128)) | (1L << (PLUS - 128)) | (1L << (MINUS - 128)) | (1L << (CARET - 128)) | (1L << (STAR - 128)) | (1L << (AMPERSAND - 128)) | (1L << (RECEIVE - 128)) | (1L << (DECIMAL_LIT - 128)) | (1L << (BINARY_LIT - 128)) | (1L << (OCTAL_LIT - 128)) | (1L << (HEX_LIT - 128)) | (1L << (IMAGINARY_LIT - 128)) | (1L << (RUNE_LIT - 128)) | (1L << (RAW_STRING_LIT - 128)) | (1L << (INTERPRETED_STRING_LIT - 128)))) != 0)) {
{
- setState(1367);
+ setState(1383);
expression(0);
}
}
@@ -9040,24 +9130,24 @@ public final ExprSwitchStmtContext exprSwitchStmt() throws RecognitionException
break;
case 2:
{
- setState(1371);
+ setState(1387);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,124,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,127,_ctx) ) {
case 1:
{
- setState(1370);
+ setState(1386);
simpleStmt();
}
break;
}
- setState(1373);
+ setState(1389);
eos();
- setState(1375);
+ setState(1391);
_errHandler.sync(this);
_la = _input.LA(1);
- if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FLOAT_LIT) | (1L << TRUE) | (1L << FALSE) | (1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << OLD) | (1L << BEFORE) | (1L << FORALL) | (1L << EXISTS) | (1L << ACCESS) | (1L << UNFOLDING) | (1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << LEN) | (1L << NEW) | (1L << MAKE) | (1L << CAP) | (1L << SOME) | (1L << GET) | (1L << DOM) | (1L << NONE) | (1L << PRED) | (1L << TYPE_OF) | (1L << IS_COMPARABLE) | (1L << WRITEPERM) | (1L << NOPERM))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (TRUSTED - 64)) | (1L << (FUNC - 64)) | (1L << (INTERFACE - 64)) | (1L << (MAP - 64)) | (1L << (STRUCT - 64)) | (1L << (CHAN - 64)) | (1L << (RANGE - 64)) | (1L << (TYPE - 64)) | (1L << (NIL_LIT - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (L_PAREN - 64)) | (1L << (L_BRACKET - 64)) | (1L << (EXCLAMATION - 64)))) != 0) || ((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & ((1L << (PLUS - 128)) | (1L << (MINUS - 128)) | (1L << (CARET - 128)) | (1L << (STAR - 128)) | (1L << (AMPERSAND - 128)) | (1L << (RECEIVE - 128)) | (1L << (DECIMAL_LIT - 128)) | (1L << (BINARY_LIT - 128)) | (1L << (OCTAL_LIT - 128)) | (1L << (HEX_LIT - 128)) | (1L << (IMAGINARY_LIT - 128)) | (1L << (RUNE_LIT - 128)) | (1L << (RAW_STRING_LIT - 128)) | (1L << (INTERPRETED_STRING_LIT - 128)))) != 0)) {
+ if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FLOAT_LIT) | (1L << TRUE) | (1L << FALSE) | (1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << OLD) | (1L << BEFORE) | (1L << FORALL) | (1L << EXISTS) | (1L << ACCESS) | (1L << UNFOLDING) | (1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << LEN) | (1L << NEW) | (1L << MAKE) | (1L << CAP) | (1L << SOME) | (1L << GET) | (1L << DOM) | (1L << NONE) | (1L << PRED) | (1L << TYPE_OF) | (1L << IS_COMPARABLE) | (1L << WRITEPERM) | (1L << NOPERM))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (TRUSTED - 64)) | (1L << (FUNC - 64)) | (1L << (INTERFACE - 64)) | (1L << (MAP - 64)) | (1L << (STRUCT - 64)) | (1L << (CHAN - 64)) | (1L << (RANGE - 64)) | (1L << (TYPE - 64)) | (1L << (NIL_LIT - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (L_PAREN - 64)) | (1L << (L_BRACKET - 64)))) != 0) || ((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & ((1L << (EXCLAMATION - 128)) | (1L << (PLUS - 128)) | (1L << (MINUS - 128)) | (1L << (CARET - 128)) | (1L << (STAR - 128)) | (1L << (AMPERSAND - 128)) | (1L << (RECEIVE - 128)) | (1L << (DECIMAL_LIT - 128)) | (1L << (BINARY_LIT - 128)) | (1L << (OCTAL_LIT - 128)) | (1L << (HEX_LIT - 128)) | (1L << (IMAGINARY_LIT - 128)) | (1L << (RUNE_LIT - 128)) | (1L << (RAW_STRING_LIT - 128)) | (1L << (INTERPRETED_STRING_LIT - 128)))) != 0)) {
{
- setState(1374);
+ setState(1390);
expression(0);
}
}
@@ -9065,23 +9155,23 @@ public final ExprSwitchStmtContext exprSwitchStmt() throws RecognitionException
}
break;
}
- setState(1379);
+ setState(1395);
match(L_CURLY);
- setState(1383);
+ setState(1399);
_errHandler.sync(this);
_la = _input.LA(1);
while (_la==DEFAULT || _la==CASE) {
{
{
- setState(1380);
+ setState(1396);
exprCaseClause();
}
}
- setState(1385);
+ setState(1401);
_errHandler.sync(this);
_la = _input.LA(1);
}
- setState(1386);
+ setState(1402);
match(R_CURLY);
}
}
@@ -9117,20 +9207,20 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final ExprCaseClauseContext exprCaseClause() throws RecognitionException {
ExprCaseClauseContext _localctx = new ExprCaseClauseContext(_ctx, getState());
- enterRule(_localctx, 250, RULE_exprCaseClause);
+ enterRule(_localctx, 252, RULE_exprCaseClause);
try {
enterOuterAlt(_localctx, 1);
{
- setState(1388);
+ setState(1404);
exprSwitchCase();
- setState(1389);
+ setState(1405);
match(COLON);
- setState(1391);
+ setState(1407);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,128,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,131,_ctx) ) {
case 1:
{
- setState(1390);
+ setState(1406);
statementList();
}
break;
@@ -9167,24 +9257,24 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final ExprSwitchCaseContext exprSwitchCase() throws RecognitionException {
ExprSwitchCaseContext _localctx = new ExprSwitchCaseContext(_ctx, getState());
- enterRule(_localctx, 252, RULE_exprSwitchCase);
+ enterRule(_localctx, 254, RULE_exprSwitchCase);
try {
- setState(1396);
+ setState(1412);
_errHandler.sync(this);
switch (_input.LA(1)) {
case CASE:
enterOuterAlt(_localctx, 1);
{
- setState(1393);
+ setState(1409);
match(CASE);
- setState(1394);
+ setState(1410);
expressionList();
}
break;
case DEFAULT:
enterOuterAlt(_localctx, 2);
{
- setState(1395);
+ setState(1411);
match(DEFAULT);
}
break;
@@ -9235,58 +9325,58 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final TypeSwitchStmtContext typeSwitchStmt() throws RecognitionException {
TypeSwitchStmtContext _localctx = new TypeSwitchStmtContext(_ctx, getState());
- enterRule(_localctx, 254, RULE_typeSwitchStmt);
+ enterRule(_localctx, 256, RULE_typeSwitchStmt);
int _la;
try {
enterOuterAlt(_localctx, 1);
{
- setState(1398);
+ setState(1414);
match(SWITCH);
- setState(1407);
+ setState(1423);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,130,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,133,_ctx) ) {
case 1:
{
- setState(1399);
+ setState(1415);
typeSwitchGuard();
}
break;
case 2:
{
- setState(1400);
+ setState(1416);
eos();
- setState(1401);
+ setState(1417);
typeSwitchGuard();
}
break;
case 3:
{
- setState(1403);
+ setState(1419);
simpleStmt();
- setState(1404);
+ setState(1420);
eos();
- setState(1405);
+ setState(1421);
typeSwitchGuard();
}
break;
}
- setState(1409);
+ setState(1425);
match(L_CURLY);
- setState(1413);
+ setState(1429);
_errHandler.sync(this);
_la = _input.LA(1);
while (_la==DEFAULT || _la==CASE) {
{
{
- setState(1410);
+ setState(1426);
typeCaseClause();
}
}
- setState(1415);
+ setState(1431);
_errHandler.sync(this);
_la = _input.LA(1);
}
- setState(1416);
+ setState(1432);
match(R_CURLY);
}
}
@@ -9324,31 +9414,31 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final TypeSwitchGuardContext typeSwitchGuard() throws RecognitionException {
TypeSwitchGuardContext _localctx = new TypeSwitchGuardContext(_ctx, getState());
- enterRule(_localctx, 256, RULE_typeSwitchGuard);
+ enterRule(_localctx, 258, RULE_typeSwitchGuard);
try {
enterOuterAlt(_localctx, 1);
{
- setState(1420);
+ setState(1436);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,132,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,135,_ctx) ) {
case 1:
{
- setState(1418);
+ setState(1434);
match(IDENTIFIER);
- setState(1419);
+ setState(1435);
match(DECLARE_ASSIGN);
}
break;
}
- setState(1422);
+ setState(1438);
primaryExpr(0);
- setState(1423);
+ setState(1439);
match(DOT);
- setState(1424);
+ setState(1440);
match(L_PAREN);
- setState(1425);
+ setState(1441);
match(TYPE);
- setState(1426);
+ setState(1442);
match(R_PAREN);
}
}
@@ -9384,20 +9474,20 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final TypeCaseClauseContext typeCaseClause() throws RecognitionException {
TypeCaseClauseContext _localctx = new TypeCaseClauseContext(_ctx, getState());
- enterRule(_localctx, 258, RULE_typeCaseClause);
+ enterRule(_localctx, 260, RULE_typeCaseClause);
try {
enterOuterAlt(_localctx, 1);
{
- setState(1428);
+ setState(1444);
typeSwitchCase();
- setState(1429);
+ setState(1445);
match(COLON);
- setState(1431);
+ setState(1447);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,133,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,136,_ctx) ) {
case 1:
{
- setState(1430);
+ setState(1446);
statementList();
}
break;
@@ -9434,24 +9524,24 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final TypeSwitchCaseContext typeSwitchCase() throws RecognitionException {
TypeSwitchCaseContext _localctx = new TypeSwitchCaseContext(_ctx, getState());
- enterRule(_localctx, 260, RULE_typeSwitchCase);
+ enterRule(_localctx, 262, RULE_typeSwitchCase);
try {
- setState(1436);
+ setState(1452);
_errHandler.sync(this);
switch (_input.LA(1)) {
case CASE:
enterOuterAlt(_localctx, 1);
{
- setState(1433);
+ setState(1449);
match(CASE);
- setState(1434);
+ setState(1450);
typeList();
}
break;
case DEFAULT:
enterOuterAlt(_localctx, 2);
{
- setState(1435);
+ setState(1451);
match(DEFAULT);
}
break;
@@ -9498,12 +9588,12 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final TypeListContext typeList() throws RecognitionException {
TypeListContext _localctx = new TypeListContext(_ctx, getState());
- enterRule(_localctx, 262, RULE_typeList);
+ enterRule(_localctx, 264, RULE_typeList);
int _la;
try {
enterOuterAlt(_localctx, 1);
{
- setState(1440);
+ setState(1456);
_errHandler.sync(this);
switch (_input.LA(1)) {
case GHOST:
@@ -9525,28 +9615,28 @@ public final TypeListContext typeList() throws RecognitionException {
case STAR:
case RECEIVE:
{
- setState(1438);
+ setState(1454);
type_();
}
break;
case NIL_LIT:
{
- setState(1439);
+ setState(1455);
match(NIL_LIT);
}
break;
default:
throw new NoViableAltException(this);
}
- setState(1449);
+ setState(1465);
_errHandler.sync(this);
_la = _input.LA(1);
while (_la==COMMA) {
{
{
- setState(1442);
+ setState(1458);
match(COMMA);
- setState(1445);
+ setState(1461);
_errHandler.sync(this);
switch (_input.LA(1)) {
case GHOST:
@@ -9568,13 +9658,13 @@ public final TypeListContext typeList() throws RecognitionException {
case STAR:
case RECEIVE:
{
- setState(1443);
+ setState(1459);
type_();
}
break;
case NIL_LIT:
{
- setState(1444);
+ setState(1460);
match(NIL_LIT);
}
break;
@@ -9583,7 +9673,7 @@ public final TypeListContext typeList() throws RecognitionException {
}
}
}
- setState(1451);
+ setState(1467);
_errHandler.sync(this);
_la = _input.LA(1);
}
@@ -9623,30 +9713,30 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final SelectStmtContext selectStmt() throws RecognitionException {
SelectStmtContext _localctx = new SelectStmtContext(_ctx, getState());
- enterRule(_localctx, 264, RULE_selectStmt);
+ enterRule(_localctx, 266, RULE_selectStmt);
int _la;
try {
enterOuterAlt(_localctx, 1);
{
- setState(1452);
+ setState(1468);
match(SELECT);
- setState(1453);
+ setState(1469);
match(L_CURLY);
- setState(1457);
+ setState(1473);
_errHandler.sync(this);
_la = _input.LA(1);
while (_la==DEFAULT || _la==CASE) {
{
{
- setState(1454);
+ setState(1470);
commClause();
}
}
- setState(1459);
+ setState(1475);
_errHandler.sync(this);
_la = _input.LA(1);
}
- setState(1460);
+ setState(1476);
match(R_CURLY);
}
}
@@ -9682,20 +9772,20 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final CommClauseContext commClause() throws RecognitionException {
CommClauseContext _localctx = new CommClauseContext(_ctx, getState());
- enterRule(_localctx, 266, RULE_commClause);
+ enterRule(_localctx, 268, RULE_commClause);
try {
enterOuterAlt(_localctx, 1);
{
- setState(1462);
+ setState(1478);
commCase();
- setState(1463);
+ setState(1479);
match(COLON);
- setState(1465);
+ setState(1481);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,139,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,142,_ctx) ) {
case 1:
{
- setState(1464);
+ setState(1480);
statementList();
}
break;
@@ -9735,28 +9825,28 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final CommCaseContext commCase() throws RecognitionException {
CommCaseContext _localctx = new CommCaseContext(_ctx, getState());
- enterRule(_localctx, 268, RULE_commCase);
+ enterRule(_localctx, 270, RULE_commCase);
try {
- setState(1473);
+ setState(1489);
_errHandler.sync(this);
switch (_input.LA(1)) {
case CASE:
enterOuterAlt(_localctx, 1);
{
- setState(1467);
+ setState(1483);
match(CASE);
- setState(1470);
+ setState(1486);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,140,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,143,_ctx) ) {
case 1:
{
- setState(1468);
+ setState(1484);
sendStmt();
}
break;
case 2:
{
- setState(1469);
+ setState(1485);
recvStmt();
}
break;
@@ -9766,7 +9856,7 @@ public final CommCaseContext commCase() throws RecognitionException {
case DEFAULT:
enterOuterAlt(_localctx, 2);
{
- setState(1472);
+ setState(1488);
match(DEFAULT);
}
break;
@@ -9811,31 +9901,31 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final RecvStmtContext recvStmt() throws RecognitionException {
RecvStmtContext _localctx = new RecvStmtContext(_ctx, getState());
- enterRule(_localctx, 270, RULE_recvStmt);
+ enterRule(_localctx, 272, RULE_recvStmt);
try {
enterOuterAlt(_localctx, 1);
{
- setState(1481);
+ setState(1497);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,142,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,145,_ctx) ) {
case 1:
{
- setState(1475);
+ setState(1491);
expressionList();
- setState(1476);
+ setState(1492);
match(ASSIGN);
}
break;
case 2:
{
- setState(1478);
+ setState(1494);
identifierList();
- setState(1479);
+ setState(1495);
match(DECLARE_ASSIGN);
}
break;
}
- setState(1483);
+ setState(1499);
((RecvStmtContext)_localctx).recvExpr = expression(0);
}
}
@@ -9877,35 +9967,35 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final ForStmtContext forStmt() throws RecognitionException {
ForStmtContext _localctx = new ForStmtContext(_ctx, getState());
- enterRule(_localctx, 272, RULE_forStmt);
+ enterRule(_localctx, 274, RULE_forStmt);
try {
enterOuterAlt(_localctx, 1);
{
- setState(1485);
+ setState(1501);
match(FOR);
- setState(1489);
+ setState(1505);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,143,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,146,_ctx) ) {
case 1:
{
- setState(1486);
+ setState(1502);
expression(0);
}
break;
case 2:
{
- setState(1487);
+ setState(1503);
forClause();
}
break;
case 3:
{
- setState(1488);
+ setState(1504);
rangeClause();
}
break;
}
- setState(1491);
+ setState(1507);
block();
}
}
@@ -9951,41 +10041,41 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final ForClauseContext forClause() throws RecognitionException {
ForClauseContext _localctx = new ForClauseContext(_ctx, getState());
- enterRule(_localctx, 274, RULE_forClause);
+ enterRule(_localctx, 276, RULE_forClause);
int _la;
try {
enterOuterAlt(_localctx, 1);
{
- setState(1494);
+ setState(1510);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,144,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,147,_ctx) ) {
case 1:
{
- setState(1493);
+ setState(1509);
((ForClauseContext)_localctx).initStmt = simpleStmt();
}
break;
}
- setState(1496);
+ setState(1512);
eos();
- setState(1498);
+ setState(1514);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,145,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,148,_ctx) ) {
case 1:
{
- setState(1497);
+ setState(1513);
expression(0);
}
break;
}
- setState(1500);
+ setState(1516);
eos();
- setState(1502);
+ setState(1518);
_errHandler.sync(this);
_la = _input.LA(1);
- if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FLOAT_LIT) | (1L << TRUE) | (1L << FALSE) | (1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << OLD) | (1L << BEFORE) | (1L << FORALL) | (1L << EXISTS) | (1L << ACCESS) | (1L << UNFOLDING) | (1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << LEN) | (1L << NEW) | (1L << MAKE) | (1L << CAP) | (1L << SOME) | (1L << GET) | (1L << DOM) | (1L << NONE) | (1L << PRED) | (1L << TYPE_OF) | (1L << IS_COMPARABLE) | (1L << WRITEPERM) | (1L << NOPERM))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (TRUSTED - 64)) | (1L << (FUNC - 64)) | (1L << (INTERFACE - 64)) | (1L << (MAP - 64)) | (1L << (STRUCT - 64)) | (1L << (CHAN - 64)) | (1L << (RANGE - 64)) | (1L << (TYPE - 64)) | (1L << (NIL_LIT - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (L_PAREN - 64)) | (1L << (L_BRACKET - 64)) | (1L << (EXCLAMATION - 64)))) != 0) || ((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & ((1L << (PLUS - 128)) | (1L << (MINUS - 128)) | (1L << (CARET - 128)) | (1L << (STAR - 128)) | (1L << (AMPERSAND - 128)) | (1L << (RECEIVE - 128)) | (1L << (DECIMAL_LIT - 128)) | (1L << (BINARY_LIT - 128)) | (1L << (OCTAL_LIT - 128)) | (1L << (HEX_LIT - 128)) | (1L << (IMAGINARY_LIT - 128)) | (1L << (RUNE_LIT - 128)) | (1L << (RAW_STRING_LIT - 128)) | (1L << (INTERPRETED_STRING_LIT - 128)))) != 0)) {
+ if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FLOAT_LIT) | (1L << TRUE) | (1L << FALSE) | (1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << OLD) | (1L << BEFORE) | (1L << FORALL) | (1L << EXISTS) | (1L << ACCESS) | (1L << UNFOLDING) | (1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << LEN) | (1L << NEW) | (1L << MAKE) | (1L << CAP) | (1L << SOME) | (1L << GET) | (1L << DOM) | (1L << NONE) | (1L << PRED) | (1L << TYPE_OF) | (1L << IS_COMPARABLE) | (1L << WRITEPERM) | (1L << NOPERM))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (TRUSTED - 64)) | (1L << (FUNC - 64)) | (1L << (INTERFACE - 64)) | (1L << (MAP - 64)) | (1L << (STRUCT - 64)) | (1L << (CHAN - 64)) | (1L << (RANGE - 64)) | (1L << (TYPE - 64)) | (1L << (NIL_LIT - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (L_PAREN - 64)) | (1L << (L_BRACKET - 64)))) != 0) || ((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & ((1L << (EXCLAMATION - 128)) | (1L << (PLUS - 128)) | (1L << (MINUS - 128)) | (1L << (CARET - 128)) | (1L << (STAR - 128)) | (1L << (AMPERSAND - 128)) | (1L << (RECEIVE - 128)) | (1L << (DECIMAL_LIT - 128)) | (1L << (BINARY_LIT - 128)) | (1L << (OCTAL_LIT - 128)) | (1L << (HEX_LIT - 128)) | (1L << (IMAGINARY_LIT - 128)) | (1L << (RUNE_LIT - 128)) | (1L << (RAW_STRING_LIT - 128)) | (1L << (INTERPRETED_STRING_LIT - 128)))) != 0)) {
{
- setState(1501);
+ setState(1517);
((ForClauseContext)_localctx).postStmt = simpleStmt();
}
}
@@ -10003,73 +10093,6 @@ public final ForClauseContext forClause() throws RecognitionException {
return _localctx;
}
- public static class RangeClauseContext extends ParserRuleContext {
- public TerminalNode RANGE() { return getToken(GobraParser.RANGE, 0); }
- public ExpressionContext expression() {
- return getRuleContext(ExpressionContext.class,0);
- }
- public ExpressionListContext expressionList() {
- return getRuleContext(ExpressionListContext.class,0);
- }
- public TerminalNode ASSIGN() { return getToken(GobraParser.ASSIGN, 0); }
- public IdentifierListContext identifierList() {
- return getRuleContext(IdentifierListContext.class,0);
- }
- public TerminalNode DECLARE_ASSIGN() { return getToken(GobraParser.DECLARE_ASSIGN, 0); }
- public RangeClauseContext(ParserRuleContext parent, int invokingState) {
- super(parent, invokingState);
- }
- @Override public int getRuleIndex() { return RULE_rangeClause; }
- @Override
- public T accept(ParseTreeVisitor extends T> visitor) {
- if ( visitor instanceof GobraParserVisitor ) return ((GobraParserVisitor extends T>)visitor).visitRangeClause(this);
- else return visitor.visitChildren(this);
- }
- }
-
- public final RangeClauseContext rangeClause() throws RecognitionException {
- RangeClauseContext _localctx = new RangeClauseContext(_ctx, getState());
- enterRule(_localctx, 276, RULE_rangeClause);
- try {
- enterOuterAlt(_localctx, 1);
- {
- setState(1510);
- _errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,147,_ctx) ) {
- case 1:
- {
- setState(1504);
- expressionList();
- setState(1505);
- match(ASSIGN);
- }
- break;
- case 2:
- {
- setState(1507);
- identifierList();
- setState(1508);
- match(DECLARE_ASSIGN);
- }
- break;
- }
- setState(1512);
- match(RANGE);
- setState(1513);
- expression(0);
- }
- }
- catch (RecognitionException re) {
- _localctx.exception = re;
- _errHandler.reportError(this, re);
- _errHandler.recover(this, re);
- }
- finally {
- exitRule();
- }
- return _localctx;
- }
-
public static class GoStmtContext extends ParserRuleContext {
public TerminalNode GO() { return getToken(GobraParser.GO, 0); }
public ExpressionContext expression() {
@@ -10092,9 +10115,9 @@ public final GoStmtContext goStmt() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(1515);
+ setState(1520);
match(GO);
- setState(1516);
+ setState(1521);
expression(0);
}
}
@@ -10129,20 +10152,20 @@ public final TypeNameContext typeName() throws RecognitionException {
TypeNameContext _localctx = new TypeNameContext(_ctx, getState());
enterRule(_localctx, 280, RULE_typeName);
try {
- setState(1520);
+ setState(1525);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,148,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,150,_ctx) ) {
case 1:
enterOuterAlt(_localctx, 1);
{
- setState(1518);
+ setState(1523);
qualifiedIdent();
}
break;
case 2:
enterOuterAlt(_localctx, 2);
{
- setState(1519);
+ setState(1524);
match(IDENTIFIER);
}
break;
@@ -10185,13 +10208,13 @@ public final ArrayTypeContext arrayType() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(1522);
+ setState(1527);
match(L_BRACKET);
- setState(1523);
+ setState(1528);
arrayLength();
- setState(1524);
+ setState(1529);
match(R_BRACKET);
- setState(1525);
+ setState(1530);
elementType();
}
}
@@ -10227,7 +10250,7 @@ public final ArrayLengthContext arrayLength() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(1527);
+ setState(1532);
expression(0);
}
}
@@ -10263,7 +10286,7 @@ public final ElementTypeContext elementType() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(1529);
+ setState(1534);
type_();
}
}
@@ -10300,9 +10323,9 @@ public final PointerTypeContext pointerType() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(1531);
+ setState(1536);
match(STAR);
- setState(1532);
+ setState(1537);
type_();
}
}
@@ -10340,11 +10363,11 @@ public final SliceTypeContext sliceType() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(1534);
+ setState(1539);
match(L_BRACKET);
- setState(1535);
+ setState(1540);
match(R_BRACKET);
- setState(1536);
+ setState(1541);
elementType();
}
}
@@ -10386,15 +10409,15 @@ public final MapTypeContext mapType() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(1538);
+ setState(1543);
match(MAP);
- setState(1539);
+ setState(1544);
match(L_BRACKET);
- setState(1540);
+ setState(1545);
type_();
- setState(1541);
+ setState(1546);
match(R_BRACKET);
- setState(1542);
+ setState(1547);
elementType();
}
}
@@ -10432,33 +10455,33 @@ public final ChannelTypeContext channelType() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(1549);
+ setState(1554);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,149,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,151,_ctx) ) {
case 1:
{
- setState(1544);
+ setState(1549);
match(CHAN);
}
break;
case 2:
{
- setState(1545);
+ setState(1550);
match(CHAN);
- setState(1546);
+ setState(1551);
match(RECEIVE);
}
break;
case 3:
{
- setState(1547);
+ setState(1552);
match(RECEIVE);
- setState(1548);
+ setState(1553);
match(CHAN);
}
break;
}
- setState(1551);
+ setState(1556);
elementType();
}
}
@@ -10495,9 +10518,9 @@ public final FunctionTypeContext functionType() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(1553);
+ setState(1558);
match(FUNC);
- setState(1554);
+ setState(1559);
signature();
}
}
@@ -10534,22 +10557,22 @@ public final SignatureContext signature() throws RecognitionException {
SignatureContext _localctx = new SignatureContext(_ctx, getState());
enterRule(_localctx, 298, RULE_signature);
try {
- setState(1560);
+ setState(1565);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,150,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,152,_ctx) ) {
case 1:
enterOuterAlt(_localctx, 1);
{
- setState(1556);
+ setState(1561);
parameters();
- setState(1557);
+ setState(1562);
result();
}
break;
case 2:
enterOuterAlt(_localctx, 2);
{
- setState(1559);
+ setState(1564);
parameters();
}
break;
@@ -10588,20 +10611,20 @@ public final ResultContext result() throws RecognitionException {
ResultContext _localctx = new ResultContext(_ctx, getState());
enterRule(_localctx, 300, RULE_result);
try {
- setState(1564);
+ setState(1569);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,151,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,153,_ctx) ) {
case 1:
enterOuterAlt(_localctx, 1);
{
- setState(1562);
+ setState(1567);
parameters();
}
break;
case 2:
enterOuterAlt(_localctx, 2);
{
- setState(1563);
+ setState(1568);
type_();
}
break;
@@ -10650,39 +10673,39 @@ public final ParametersContext parameters() throws RecognitionException {
int _alt;
enterOuterAlt(_localctx, 1);
{
- setState(1566);
+ setState(1571);
match(L_PAREN);
- setState(1578);
+ setState(1583);
_errHandler.sync(this);
_la = _input.LA(1);
- if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << DOM) | (1L << PRED))) != 0) || ((((_la - 73)) & ~0x3f) == 0 && ((1L << (_la - 73)) & ((1L << (FUNC - 73)) | (1L << (INTERFACE - 73)) | (1L << (MAP - 73)) | (1L << (STRUCT - 73)) | (1L << (CHAN - 73)) | (1L << (IDENTIFIER - 73)) | (1L << (L_PAREN - 73)) | (1L << (L_BRACKET - 73)) | (1L << (ELLIPSIS - 73)) | (1L << (STAR - 73)) | (1L << (RECEIVE - 73)))) != 0)) {
+ if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << DOM) | (1L << PRED))) != 0) || ((((_la - 74)) & ~0x3f) == 0 && ((1L << (_la - 74)) & ((1L << (FUNC - 74)) | (1L << (INTERFACE - 74)) | (1L << (MAP - 74)) | (1L << (STRUCT - 74)) | (1L << (CHAN - 74)) | (1L << (IDENTIFIER - 74)) | (1L << (L_PAREN - 74)) | (1L << (L_BRACKET - 74)) | (1L << (ELLIPSIS - 74)) | (1L << (STAR - 74)) | (1L << (RECEIVE - 74)))) != 0)) {
{
- setState(1567);
- parameterDecl();
setState(1572);
+ parameterDecl();
+ setState(1577);
_errHandler.sync(this);
- _alt = getInterpreter().adaptivePredict(_input,152,_ctx);
+ _alt = getInterpreter().adaptivePredict(_input,154,_ctx);
while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) {
if ( _alt==1 ) {
{
{
- setState(1568);
+ setState(1573);
match(COMMA);
- setState(1569);
+ setState(1574);
parameterDecl();
}
}
}
- setState(1574);
+ setState(1579);
_errHandler.sync(this);
- _alt = getInterpreter().adaptivePredict(_input,152,_ctx);
+ _alt = getInterpreter().adaptivePredict(_input,154,_ctx);
}
- setState(1576);
+ setState(1581);
_errHandler.sync(this);
_la = _input.LA(1);
if (_la==COMMA) {
{
- setState(1575);
+ setState(1580);
match(COMMA);
}
}
@@ -10690,7 +10713,7 @@ public final ParametersContext parameters() throws RecognitionException {
}
}
- setState(1580);
+ setState(1585);
match(R_PAREN);
}
}
@@ -10733,23 +10756,23 @@ public final ConversionContext conversion() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(1582);
+ setState(1587);
nonNamedType();
- setState(1583);
+ setState(1588);
match(L_PAREN);
- setState(1584);
+ setState(1589);
expression(0);
- setState(1586);
+ setState(1591);
_errHandler.sync(this);
_la = _input.LA(1);
if (_la==COMMA) {
{
- setState(1585);
+ setState(1590);
match(COMMA);
}
}
- setState(1588);
+ setState(1593);
match(R_PAREN);
}
}
@@ -10788,7 +10811,7 @@ public final NonNamedTypeContext nonNamedType() throws RecognitionException {
NonNamedTypeContext _localctx = new NonNamedTypeContext(_ctx, getState());
enterRule(_localctx, 306, RULE_nonNamedType);
try {
- setState(1595);
+ setState(1600);
_errHandler.sync(this);
switch (_input.LA(1)) {
case PRED:
@@ -10802,18 +10825,18 @@ public final NonNamedTypeContext nonNamedType() throws RecognitionException {
case RECEIVE:
enterOuterAlt(_localctx, 1);
{
- setState(1590);
+ setState(1595);
typeLit();
}
break;
case L_PAREN:
enterOuterAlt(_localctx, 2);
{
- setState(1591);
+ setState(1596);
match(L_PAREN);
- setState(1592);
+ setState(1597);
nonNamedType();
- setState(1593);
+ setState(1598);
match(R_PAREN);
}
break;
@@ -10859,31 +10882,31 @@ public final OperandContext operand() throws RecognitionException {
OperandContext _localctx = new OperandContext(_ctx, getState());
enterRule(_localctx, 308, RULE_operand);
try {
- setState(1603);
+ setState(1608);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,157,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,159,_ctx) ) {
case 1:
enterOuterAlt(_localctx, 1);
{
- setState(1597);
+ setState(1602);
literal();
}
break;
case 2:
enterOuterAlt(_localctx, 2);
{
- setState(1598);
+ setState(1603);
operandName();
}
break;
case 3:
enterOuterAlt(_localctx, 3);
{
- setState(1599);
+ setState(1604);
match(L_PAREN);
- setState(1600);
+ setState(1605);
expression(0);
- setState(1601);
+ setState(1606);
match(R_PAREN);
}
break;
@@ -10925,7 +10948,7 @@ public final LiteralContext literal() throws RecognitionException {
LiteralContext _localctx = new LiteralContext(_ctx, getState());
enterRule(_localctx, 310, RULE_literal);
try {
- setState(1608);
+ setState(1613);
_errHandler.sync(this);
switch (_input.LA(1)) {
case FLOAT_LIT:
@@ -10942,7 +10965,7 @@ public final LiteralContext literal() throws RecognitionException {
case INTERPRETED_STRING_LIT:
enterOuterAlt(_localctx, 1);
{
- setState(1605);
+ setState(1610);
basicLit();
}
break;
@@ -10959,7 +10982,7 @@ public final LiteralContext literal() throws RecognitionException {
case L_BRACKET:
enterOuterAlt(_localctx, 2);
{
- setState(1606);
+ setState(1611);
compositeLit();
}
break;
@@ -10972,7 +10995,7 @@ public final LiteralContext literal() throws RecognitionException {
case FUNC:
enterOuterAlt(_localctx, 3);
{
- setState(1607);
+ setState(1612);
functionLit();
}
break;
@@ -11016,9 +11039,9 @@ public final IntegerContext integer() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(1610);
+ setState(1615);
_la = _input.LA(1);
- if ( !(((((_la - 134)) & ~0x3f) == 0 && ((1L << (_la - 134)) & ((1L << (DECIMAL_LIT - 134)) | (1L << (BINARY_LIT - 134)) | (1L << (OCTAL_LIT - 134)) | (1L << (HEX_LIT - 134)) | (1L << (IMAGINARY_LIT - 134)) | (1L << (RUNE_LIT - 134)))) != 0)) ) {
+ if ( !(((((_la - 135)) & ~0x3f) == 0 && ((1L << (_la - 135)) & ((1L << (DECIMAL_LIT - 135)) | (1L << (BINARY_LIT - 135)) | (1L << (OCTAL_LIT - 135)) | (1L << (HEX_LIT - 135)) | (1L << (IMAGINARY_LIT - 135)) | (1L << (RUNE_LIT - 135)))) != 0)) ) {
_errHandler.recoverInline(this);
}
else {
@@ -11058,7 +11081,7 @@ public final OperandNameContext operandName() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(1612);
+ setState(1617);
match(IDENTIFIER);
}
}
@@ -11096,11 +11119,11 @@ public final QualifiedIdentContext qualifiedIdent() throws RecognitionException
try {
enterOuterAlt(_localctx, 1);
{
- setState(1614);
+ setState(1619);
match(IDENTIFIER);
- setState(1615);
+ setState(1620);
match(DOT);
- setState(1616);
+ setState(1621);
match(IDENTIFIER);
}
}
@@ -11139,9 +11162,9 @@ public final CompositeLitContext compositeLit() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(1618);
+ setState(1623);
literalType();
- setState(1619);
+ setState(1624);
literalValue();
}
}
@@ -11181,21 +11204,21 @@ public final LiteralValueContext literalValue() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(1621);
- match(L_CURLY);
setState(1626);
+ match(L_CURLY);
+ setState(1631);
_errHandler.sync(this);
_la = _input.LA(1);
- if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FLOAT_LIT) | (1L << TRUE) | (1L << FALSE) | (1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << OLD) | (1L << BEFORE) | (1L << FORALL) | (1L << EXISTS) | (1L << ACCESS) | (1L << UNFOLDING) | (1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << LEN) | (1L << NEW) | (1L << MAKE) | (1L << CAP) | (1L << SOME) | (1L << GET) | (1L << DOM) | (1L << NONE) | (1L << PRED) | (1L << TYPE_OF) | (1L << IS_COMPARABLE) | (1L << WRITEPERM) | (1L << NOPERM))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (TRUSTED - 64)) | (1L << (FUNC - 64)) | (1L << (INTERFACE - 64)) | (1L << (MAP - 64)) | (1L << (STRUCT - 64)) | (1L << (CHAN - 64)) | (1L << (RANGE - 64)) | (1L << (TYPE - 64)) | (1L << (NIL_LIT - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (L_PAREN - 64)) | (1L << (L_CURLY - 64)) | (1L << (L_BRACKET - 64)) | (1L << (EXCLAMATION - 64)))) != 0) || ((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & ((1L << (PLUS - 128)) | (1L << (MINUS - 128)) | (1L << (CARET - 128)) | (1L << (STAR - 128)) | (1L << (AMPERSAND - 128)) | (1L << (RECEIVE - 128)) | (1L << (DECIMAL_LIT - 128)) | (1L << (BINARY_LIT - 128)) | (1L << (OCTAL_LIT - 128)) | (1L << (HEX_LIT - 128)) | (1L << (IMAGINARY_LIT - 128)) | (1L << (RUNE_LIT - 128)) | (1L << (RAW_STRING_LIT - 128)) | (1L << (INTERPRETED_STRING_LIT - 128)))) != 0)) {
+ if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FLOAT_LIT) | (1L << TRUE) | (1L << FALSE) | (1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << OLD) | (1L << BEFORE) | (1L << FORALL) | (1L << EXISTS) | (1L << ACCESS) | (1L << UNFOLDING) | (1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << LEN) | (1L << NEW) | (1L << MAKE) | (1L << CAP) | (1L << SOME) | (1L << GET) | (1L << DOM) | (1L << NONE) | (1L << PRED) | (1L << TYPE_OF) | (1L << IS_COMPARABLE) | (1L << WRITEPERM) | (1L << NOPERM))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (TRUSTED - 64)) | (1L << (FUNC - 64)) | (1L << (INTERFACE - 64)) | (1L << (MAP - 64)) | (1L << (STRUCT - 64)) | (1L << (CHAN - 64)) | (1L << (RANGE - 64)) | (1L << (TYPE - 64)) | (1L << (NIL_LIT - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (L_PAREN - 64)) | (1L << (L_CURLY - 64)) | (1L << (L_BRACKET - 64)))) != 0) || ((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & ((1L << (EXCLAMATION - 128)) | (1L << (PLUS - 128)) | (1L << (MINUS - 128)) | (1L << (CARET - 128)) | (1L << (STAR - 128)) | (1L << (AMPERSAND - 128)) | (1L << (RECEIVE - 128)) | (1L << (DECIMAL_LIT - 128)) | (1L << (BINARY_LIT - 128)) | (1L << (OCTAL_LIT - 128)) | (1L << (HEX_LIT - 128)) | (1L << (IMAGINARY_LIT - 128)) | (1L << (RUNE_LIT - 128)) | (1L << (RAW_STRING_LIT - 128)) | (1L << (INTERPRETED_STRING_LIT - 128)))) != 0)) {
{
- setState(1622);
+ setState(1627);
elementList();
- setState(1624);
+ setState(1629);
_errHandler.sync(this);
_la = _input.LA(1);
if (_la==COMMA) {
{
- setState(1623);
+ setState(1628);
match(COMMA);
}
}
@@ -11203,7 +11226,7 @@ public final LiteralValueContext literalValue() throws RecognitionException {
}
}
- setState(1628);
+ setState(1633);
match(R_CURLY);
}
}
@@ -11247,25 +11270,25 @@ public final ElementListContext elementList() throws RecognitionException {
int _alt;
enterOuterAlt(_localctx, 1);
{
- setState(1630);
- keyedElement();
setState(1635);
+ keyedElement();
+ setState(1640);
_errHandler.sync(this);
- _alt = getInterpreter().adaptivePredict(_input,161,_ctx);
+ _alt = getInterpreter().adaptivePredict(_input,163,_ctx);
while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) {
if ( _alt==1 ) {
{
{
- setState(1631);
+ setState(1636);
match(COMMA);
- setState(1632);
+ setState(1637);
keyedElement();
}
}
}
- setState(1637);
+ setState(1642);
_errHandler.sync(this);
- _alt = getInterpreter().adaptivePredict(_input,161,_ctx);
+ _alt = getInterpreter().adaptivePredict(_input,163,_ctx);
}
}
}
@@ -11305,19 +11328,19 @@ public final KeyedElementContext keyedElement() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(1641);
+ setState(1646);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,162,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,164,_ctx) ) {
case 1:
{
- setState(1638);
+ setState(1643);
key();
- setState(1639);
+ setState(1644);
match(COLON);
}
break;
}
- setState(1643);
+ setState(1648);
element();
}
}
@@ -11354,7 +11377,7 @@ public final KeyContext key() throws RecognitionException {
KeyContext _localctx = new KeyContext(_ctx, getState());
enterRule(_localctx, 326, RULE_key);
try {
- setState(1647);
+ setState(1652);
_errHandler.sync(this);
switch (_input.LA(1)) {
case FLOAT_LIT:
@@ -11419,14 +11442,14 @@ public final KeyContext key() throws RecognitionException {
case INTERPRETED_STRING_LIT:
enterOuterAlt(_localctx, 1);
{
- setState(1645);
+ setState(1650);
expression(0);
}
break;
case L_CURLY:
enterOuterAlt(_localctx, 2);
{
- setState(1646);
+ setState(1651);
literalValue();
}
break;
@@ -11467,7 +11490,7 @@ public final ElementContext element() throws RecognitionException {
ElementContext _localctx = new ElementContext(_ctx, getState());
enterRule(_localctx, 328, RULE_element);
try {
- setState(1651);
+ setState(1656);
_errHandler.sync(this);
switch (_input.LA(1)) {
case FLOAT_LIT:
@@ -11532,14 +11555,14 @@ public final ElementContext element() throws RecognitionException {
case INTERPRETED_STRING_LIT:
enterOuterAlt(_localctx, 1);
{
- setState(1649);
+ setState(1654);
expression(0);
}
break;
case L_CURLY:
enterOuterAlt(_localctx, 2);
{
- setState(1650);
+ setState(1655);
literalValue();
}
break;
@@ -11592,27 +11615,27 @@ public final StructTypeContext structType() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(1653);
+ setState(1658);
match(STRUCT);
- setState(1654);
+ setState(1659);
match(L_CURLY);
- setState(1660);
+ setState(1665);
_errHandler.sync(this);
_la = _input.LA(1);
while (_la==IDENTIFIER || _la==STAR) {
{
{
- setState(1655);
+ setState(1660);
fieldDecl();
- setState(1656);
+ setState(1661);
eos();
}
}
- setState(1662);
+ setState(1667);
_errHandler.sync(this);
_la = _input.LA(1);
}
- setState(1663);
+ setState(1668);
match(R_CURLY);
}
}
@@ -11658,30 +11681,30 @@ public final FieldDeclContext fieldDecl() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(1669);
+ setState(1674);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,166,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,168,_ctx) ) {
case 1:
{
- setState(1665);
+ setState(1670);
identifierList();
- setState(1666);
+ setState(1671);
type_();
}
break;
case 2:
{
- setState(1668);
+ setState(1673);
embeddedField();
}
break;
}
- setState(1672);
+ setState(1677);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,167,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,169,_ctx) ) {
case 1:
{
- setState(1671);
+ setState(1676);
((FieldDeclContext)_localctx).tag = string_();
}
break;
@@ -11720,7 +11743,7 @@ public final String_Context string_() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(1674);
+ setState(1679);
_la = _input.LA(1);
if ( !(_la==RAW_STRING_LIT || _la==INTERPRETED_STRING_LIT) ) {
_errHandler.recoverInline(this);
@@ -11766,17 +11789,17 @@ public final EmbeddedFieldContext embeddedField() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(1677);
+ setState(1682);
_errHandler.sync(this);
_la = _input.LA(1);
if (_la==STAR) {
{
- setState(1676);
+ setState(1681);
match(STAR);
}
}
- setState(1679);
+ setState(1684);
typeName();
}
}
@@ -11814,11 +11837,11 @@ public final IndexContext index() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(1681);
+ setState(1686);
match(L_BRACKET);
- setState(1682);
+ setState(1687);
expression(0);
- setState(1683);
+ setState(1688);
match(R_BRACKET);
}
}
@@ -11857,13 +11880,13 @@ public final TypeAssertionContext typeAssertion() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(1685);
+ setState(1690);
match(DOT);
- setState(1686);
+ setState(1691);
match(L_PAREN);
- setState(1687);
+ setState(1692);
type_();
- setState(1688);
+ setState(1693);
match(R_PAREN);
}
}
@@ -11910,34 +11933,34 @@ public final ArgumentsContext arguments() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(1690);
+ setState(1695);
match(L_PAREN);
- setState(1705);
+ setState(1710);
_errHandler.sync(this);
_la = _input.LA(1);
- if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FLOAT_LIT) | (1L << TRUE) | (1L << FALSE) | (1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << OLD) | (1L << BEFORE) | (1L << FORALL) | (1L << EXISTS) | (1L << ACCESS) | (1L << UNFOLDING) | (1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << LEN) | (1L << NEW) | (1L << MAKE) | (1L << CAP) | (1L << SOME) | (1L << GET) | (1L << DOM) | (1L << NONE) | (1L << PRED) | (1L << TYPE_OF) | (1L << IS_COMPARABLE) | (1L << WRITEPERM) | (1L << NOPERM))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (TRUSTED - 64)) | (1L << (FUNC - 64)) | (1L << (INTERFACE - 64)) | (1L << (MAP - 64)) | (1L << (STRUCT - 64)) | (1L << (CHAN - 64)) | (1L << (RANGE - 64)) | (1L << (TYPE - 64)) | (1L << (NIL_LIT - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (L_PAREN - 64)) | (1L << (L_BRACKET - 64)) | (1L << (EXCLAMATION - 64)))) != 0) || ((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & ((1L << (PLUS - 128)) | (1L << (MINUS - 128)) | (1L << (CARET - 128)) | (1L << (STAR - 128)) | (1L << (AMPERSAND - 128)) | (1L << (RECEIVE - 128)) | (1L << (DECIMAL_LIT - 128)) | (1L << (BINARY_LIT - 128)) | (1L << (OCTAL_LIT - 128)) | (1L << (HEX_LIT - 128)) | (1L << (IMAGINARY_LIT - 128)) | (1L << (RUNE_LIT - 128)) | (1L << (RAW_STRING_LIT - 128)) | (1L << (INTERPRETED_STRING_LIT - 128)))) != 0)) {
+ if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FLOAT_LIT) | (1L << TRUE) | (1L << FALSE) | (1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << OLD) | (1L << BEFORE) | (1L << FORALL) | (1L << EXISTS) | (1L << ACCESS) | (1L << UNFOLDING) | (1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << LEN) | (1L << NEW) | (1L << MAKE) | (1L << CAP) | (1L << SOME) | (1L << GET) | (1L << DOM) | (1L << NONE) | (1L << PRED) | (1L << TYPE_OF) | (1L << IS_COMPARABLE) | (1L << WRITEPERM) | (1L << NOPERM))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (TRUSTED - 64)) | (1L << (FUNC - 64)) | (1L << (INTERFACE - 64)) | (1L << (MAP - 64)) | (1L << (STRUCT - 64)) | (1L << (CHAN - 64)) | (1L << (RANGE - 64)) | (1L << (TYPE - 64)) | (1L << (NIL_LIT - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (L_PAREN - 64)) | (1L << (L_BRACKET - 64)))) != 0) || ((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & ((1L << (EXCLAMATION - 128)) | (1L << (PLUS - 128)) | (1L << (MINUS - 128)) | (1L << (CARET - 128)) | (1L << (STAR - 128)) | (1L << (AMPERSAND - 128)) | (1L << (RECEIVE - 128)) | (1L << (DECIMAL_LIT - 128)) | (1L << (BINARY_LIT - 128)) | (1L << (OCTAL_LIT - 128)) | (1L << (HEX_LIT - 128)) | (1L << (IMAGINARY_LIT - 128)) | (1L << (RUNE_LIT - 128)) | (1L << (RAW_STRING_LIT - 128)) | (1L << (INTERPRETED_STRING_LIT - 128)))) != 0)) {
{
- setState(1697);
+ setState(1702);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,170,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,172,_ctx) ) {
case 1:
{
- setState(1691);
+ setState(1696);
expressionList();
}
break;
case 2:
{
- setState(1692);
+ setState(1697);
nonNamedType();
- setState(1695);
+ setState(1700);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,169,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,171,_ctx) ) {
case 1:
{
- setState(1693);
+ setState(1698);
match(COMMA);
- setState(1694);
+ setState(1699);
expressionList();
}
break;
@@ -11945,22 +11968,22 @@ public final ArgumentsContext arguments() throws RecognitionException {
}
break;
}
- setState(1700);
+ setState(1705);
_errHandler.sync(this);
_la = _input.LA(1);
if (_la==ELLIPSIS) {
{
- setState(1699);
+ setState(1704);
match(ELLIPSIS);
}
}
- setState(1703);
+ setState(1708);
_errHandler.sync(this);
_la = _input.LA(1);
if (_la==COMMA) {
{
- setState(1702);
+ setState(1707);
match(COMMA);
}
}
@@ -11968,7 +11991,7 @@ public final ArgumentsContext arguments() throws RecognitionException {
}
}
- setState(1707);
+ setState(1712);
match(R_PAREN);
}
}
@@ -12006,11 +12029,11 @@ public final MethodExprContext methodExpr() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(1709);
+ setState(1714);
nonNamedType();
- setState(1710);
+ setState(1715);
match(DOT);
- setState(1711);
+ setState(1716);
match(IDENTIFIER);
}
}
@@ -12046,7 +12069,7 @@ public final ReceiverTypeContext receiverType() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(1713);
+ setState(1718);
type_();
}
}
@@ -12080,34 +12103,34 @@ public final EosContext eos() throws RecognitionException {
EosContext _localctx = new EosContext(_ctx, getState());
enterRule(_localctx, 348, RULE_eos);
try {
- setState(1719);
+ setState(1724);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,174,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,176,_ctx) ) {
case 1:
enterOuterAlt(_localctx, 1);
{
- setState(1715);
+ setState(1720);
match(SEMI);
}
break;
case 2:
enterOuterAlt(_localctx, 2);
{
- setState(1716);
+ setState(1721);
match(EOF);
}
break;
case 3:
enterOuterAlt(_localctx, 3);
{
- setState(1717);
+ setState(1722);
match(EOS);
}
break;
case 4:
enterOuterAlt(_localctx, 4);
{
- setState(1718);
+ setState(1723);
if (!(closingBracket())) throw new FailedPredicateException(this, "closingBracket()");
}
break;
@@ -12190,7 +12213,7 @@ private boolean eos_sempred(EosContext _localctx, int predIndex) {
}
public static final String _serializedATN =
- "\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\3\u009e\u06bc\4\2\t"+
+ "\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\3\u009f\u06c1\4\2\t"+
"\2\4\3\t\3\4\4\t\4\4\5\t\5\4\6\t\6\4\7\t\7\4\b\t\b\4\t\t\t\4\n\t\n\4\13"+
"\t\13\4\f\t\f\4\r\t\r\4\16\t\16\4\17\t\17\4\20\t\20\4\21\t\21\4\22\t\22"+
"\4\23\t\23\4\24\t\24\4\25\t\25\4\26\t\26\4\27\t\27\4\30\t\30\4\31\t\31"+
@@ -12270,613 +12293,615 @@ private boolean eos_sempred(EosContext _localctx, int predIndex) {
"\u047e\13\\\3\\\5\\\u0481\n\\\5\\\u0483\n\\\3\\\3\\\3]\3]\3]\3]\3]\3]"+
"\3]\5]\u048e\n]\3^\3^\3^\3^\3^\3_\3_\5_\u0497\n_\3_\3_\5_\u049b\n_\3_"+
"\5_\u049e\n_\3_\3_\3_\3_\3_\5_\u04a5\n_\3_\3_\3`\3`\3a\3a\3b\3b\3c\5c"+
- "\u04b0\nc\3c\3c\3d\3d\3d\3e\3e\3f\3f\3f\5f\u04bc\nf\3g\3g\3g\3g\3g\3g"+
- "\7g\u04c4\ng\fg\16g\u04c7\13g\3g\5g\u04ca\ng\3h\3h\5h\u04ce\nh\3h\3h\5"+
- "h\u04d2\nh\3i\3i\3i\7i\u04d7\ni\fi\16i\u04da\13i\3j\3j\3j\7j\u04df\nj"+
- "\fj\16j\u04e2\13j\3k\3k\3k\3k\3k\3k\7k\u04ea\nk\fk\16k\u04ed\13k\3k\5"+
- "k\u04f0\nk\3l\3l\5l\u04f4\nl\3l\3l\3m\3m\3m\3m\3m\3m\7m\u04fe\nm\fm\16"+
- "m\u0501\13m\3m\5m\u0504\nm\3n\3n\5n\u0508\nn\3n\3n\3o\5o\u050d\no\3o\3"+
- "o\3o\6o\u0512\no\ro\16o\u0513\3p\3p\3p\3p\3p\5p\u051b\np\3q\3q\3r\3r\3"+
- "r\3r\3s\3s\3s\3t\3t\3t\3t\3u\3u\3v\3v\3v\5v\u052f\nv\3w\3w\5w\u0533\n"+
- "w\3x\3x\5x\u0537\nx\3y\3y\5y\u053b\ny\3z\3z\3z\3{\3{\3|\3|\3|\3|\3|\3"+
- "|\3|\3|\3|\5|\u054b\n|\3|\3|\3|\3|\5|\u0551\n|\5|\u0553\n|\3}\3}\5}\u0557"+
- "\n}\3~\3~\5~\u055b\n~\3~\5~\u055e\n~\3~\3~\5~\u0562\n~\5~\u0564\n~\3~"+
- "\3~\7~\u0568\n~\f~\16~\u056b\13~\3~\3~\3\177\3\177\3\177\5\177\u0572\n"+
- "\177\3\u0080\3\u0080\3\u0080\5\u0080\u0577\n\u0080\3\u0081\3\u0081\3\u0081"+
- "\3\u0081\3\u0081\3\u0081\3\u0081\3\u0081\3\u0081\5\u0081\u0582\n\u0081"+
- "\3\u0081\3\u0081\7\u0081\u0586\n\u0081\f\u0081\16\u0081\u0589\13\u0081"+
- "\3\u0081\3\u0081\3\u0082\3\u0082\5\u0082\u058f\n\u0082\3\u0082\3\u0082"+
- "\3\u0082\3\u0082\3\u0082\3\u0082\3\u0083\3\u0083\3\u0083\5\u0083\u059a"+
- "\n\u0083\3\u0084\3\u0084\3\u0084\5\u0084\u059f\n\u0084\3\u0085\3\u0085"+
- "\5\u0085\u05a3\n\u0085\3\u0085\3\u0085\3\u0085\5\u0085\u05a8\n\u0085\7"+
- "\u0085\u05aa\n\u0085\f\u0085\16\u0085\u05ad\13\u0085\3\u0086\3\u0086\3"+
- "\u0086\7\u0086\u05b2\n\u0086\f\u0086\16\u0086\u05b5\13\u0086\3\u0086\3"+
- "\u0086\3\u0087\3\u0087\3\u0087\5\u0087\u05bc\n\u0087\3\u0088\3\u0088\3"+
- "\u0088\5\u0088\u05c1\n\u0088\3\u0088\5\u0088\u05c4\n\u0088\3\u0089\3\u0089"+
- "\3\u0089\3\u0089\3\u0089\3\u0089\5\u0089\u05cc\n\u0089\3\u0089\3\u0089"+
- "\3\u008a\3\u008a\3\u008a\3\u008a\5\u008a\u05d4\n\u008a\3\u008a\3\u008a"+
- "\3\u008b\5\u008b\u05d9\n\u008b\3\u008b\3\u008b\5\u008b\u05dd\n\u008b\3"+
- "\u008b\3\u008b\5\u008b\u05e1\n\u008b\3\u008c\3\u008c\3\u008c\3\u008c\3"+
- "\u008c\3\u008c\5\u008c\u05e9\n\u008c\3\u008c\3\u008c\3\u008c\3\u008d\3"+
- "\u008d\3\u008d\3\u008e\3\u008e\5\u008e\u05f3\n\u008e\3\u008f\3\u008f\3"+
- "\u008f\3\u008f\3\u008f\3\u0090\3\u0090\3\u0091\3\u0091\3\u0092\3\u0092"+
- "\3\u0092\3\u0093\3\u0093\3\u0093\3\u0093\3\u0094\3\u0094\3\u0094\3\u0094"+
- "\3\u0094\3\u0094\3\u0095\3\u0095\3\u0095\3\u0095\3\u0095\5\u0095\u0610"+
- "\n\u0095\3\u0095\3\u0095\3\u0096\3\u0096\3\u0096\3\u0097\3\u0097\3\u0097"+
- "\3\u0097\5\u0097\u061b\n\u0097\3\u0098\3\u0098\5\u0098\u061f\n\u0098\3"+
- "\u0099\3\u0099\3\u0099\3\u0099\7\u0099\u0625\n\u0099\f\u0099\16\u0099"+
- "\u0628\13\u0099\3\u0099\5\u0099\u062b\n\u0099\5\u0099\u062d\n\u0099\3"+
- "\u0099\3\u0099\3\u009a\3\u009a\3\u009a\3\u009a\5\u009a\u0635\n\u009a\3"+
- "\u009a\3\u009a\3\u009b\3\u009b\3\u009b\3\u009b\3\u009b\5\u009b\u063e\n"+
- "\u009b\3\u009c\3\u009c\3\u009c\3\u009c\3\u009c\3\u009c\5\u009c\u0646\n"+
- "\u009c\3\u009d\3\u009d\3\u009d\5\u009d\u064b\n\u009d\3\u009e\3\u009e\3"+
- "\u009f\3\u009f\3\u00a0\3\u00a0\3\u00a0\3\u00a0\3\u00a1\3\u00a1\3\u00a1"+
- "\3\u00a2\3\u00a2\3\u00a2\5\u00a2\u065b\n\u00a2\5\u00a2\u065d\n\u00a2\3"+
- "\u00a2\3\u00a2\3\u00a3\3\u00a3\3\u00a3\7\u00a3\u0664\n\u00a3\f\u00a3\16"+
- "\u00a3\u0667\13\u00a3\3\u00a4\3\u00a4\3\u00a4\5\u00a4\u066c\n\u00a4\3"+
- "\u00a4\3\u00a4\3\u00a5\3\u00a5\5\u00a5\u0672\n\u00a5\3\u00a6\3\u00a6\5"+
- "\u00a6\u0676\n\u00a6\3\u00a7\3\u00a7\3\u00a7\3\u00a7\3\u00a7\7\u00a7\u067d"+
- "\n\u00a7\f\u00a7\16\u00a7\u0680\13\u00a7\3\u00a7\3\u00a7\3\u00a8\3\u00a8"+
- "\3\u00a8\3\u00a8\5\u00a8\u0688\n\u00a8\3\u00a8\5\u00a8\u068b\n\u00a8\3"+
- "\u00a9\3\u00a9\3\u00aa\5\u00aa\u0690\n\u00aa\3\u00aa\3\u00aa\3\u00ab\3"+
- "\u00ab\3\u00ab\3\u00ab\3\u00ac\3\u00ac\3\u00ac\3\u00ac\3\u00ac\3\u00ad"+
- "\3\u00ad\3\u00ad\3\u00ad\3\u00ad\5\u00ad\u06a2\n\u00ad\5\u00ad\u06a4\n"+
- "\u00ad\3\u00ad\5\u00ad\u06a7\n\u00ad\3\u00ad\5\u00ad\u06aa\n\u00ad\5\u00ad"+
- "\u06ac\n\u00ad\3\u00ad\3\u00ad\3\u00ae\3\u00ae\3\u00ae\3\u00ae\3\u00af"+
- "\3\u00af\3\u00b0\3\u00b0\3\u00b0\3\u00b0\5\u00b0\u06ba\n\u00b0\3\u00b0"+
- "\3\u02a1\4\u0092\u00a2\u00b1\2\4\6\b\n\f\16\20\22\24\26\30\32\34\36 \""+
- "$&(*,.\60\62\64\668:<>@BDFHJLNPRTVXZ\\^`bdfhjlnprtvxz|~\u0080\u0082\u0084"+
- "\u0086\u0088\u008a\u008c\u008e\u0090\u0092\u0094\u0096\u0098\u009a\u009c"+
- "\u009e\u00a0\u00a2\u00a4\u00a6\u00a8\u00aa\u00ac\u00ae\u00b0\u00b2\u00b4"+
- "\u00b6\u00b8\u00ba\u00bc\u00be\u00c0\u00c2\u00c4\u00c6\u00c8\u00ca\u00cc"+
- "\u00ce\u00d0\u00d2\u00d4\u00d6\u00d8\u00da\u00dc\u00de\u00e0\u00e2\u00e4"+
- "\u00e6\u00e8\u00ea\u00ec\u00ee\u00f0\u00f2\u00f4\u00f6\u00f8\u00fa\u00fc"+
- "\u00fe\u0100\u0102\u0104\u0106\u0108\u010a\u010c\u010e\u0110\u0112\u0114"+
- "\u0116\u0118\u011a\u011c\u011e\u0120\u0122\u0124\u0126\u0128\u012a\u012c"+
- "\u012e\u0130\u0132\u0134\u0136\u0138\u013a\u013c\u013e\u0140\u0142\u0144"+
- "\u0146\u0148\u014a\u014c\u014e\u0150\u0152\u0154\u0156\u0158\u015a\u015c"+
- "\u015e\2\25\4\2ccnn\3\2\31\32\3\2\7\n\3\2@A\3\2)+\4\2)+--\3\2\u0081\u0087"+
- "\3\2\26\27\4\2|\u0080\u0085\u0086\6\2$$oo{{\u0082\u0084\3\2 \"\3\2\35"+
- "\37\4\2GHuz\6\2..\61\61\64\64[[\4\2{\u0080\u0082\u0086\3\2op\4\2ll\u009d"+
- "\u009d\4\2\u0088\u008b\u008d\u008e\3\2\u0094\u0095\2\u0718\2\u0160\3\2"+
- "\2\2\4\u0163\3\2\2\2\6\u0166\3\2\2\2\b\u0169\3\2\2\2\n\u0171\3\2\2\2\f"+
- "\u017a\3\2\2\2\16\u0195\3\2\2\2\20\u0198\3\2\2\2\22\u01a0\3\2\2\2\24\u01ad"+
- "\3\2\2\2\26\u01c3\3\2\2\2\30\u01cb\3\2\2\2\32\u01cd\3\2\2\2\34\u01cf\3"+
- "\2\2\2\36\u01d2\3\2\2\2 \u01e5\3\2\2\2\"\u01e7\3\2\2\2$\u01e9\3\2\2\2"+
- "&\u01ee\3\2\2\2(\u01f9\3\2\2\2*\u0206\3\2\2\2,\u0209\3\2\2\2.\u0214\3"+
- "\2\2\2\60\u0216\3\2\2\2\62\u021b\3\2\2\2\64\u0220\3\2\2\2\66\u0225\3\2"+
- "\2\28\u022a\3\2\2\2:\u0237\3\2\2\2<\u0239\3\2\2\2>\u023b\3\2\2\2@\u0240"+
- "\3\2\2\2B\u0245\3\2\2\2D\u024a\3\2\2\2F\u0253\3\2\2\2H\u025a\3\2\2\2J"+
- "\u0265\3\2\2\2L\u026c\3\2\2\2N\u026e\3\2\2\2P\u0283\3\2\2\2R\u0285\3\2"+
- "\2\2T\u0295\3\2\2\2V\u02a1\3\2\2\2X\u02b0\3\2\2\2Z\u02b3\3\2\2\2\\\u02bb"+
- "\3\2\2\2^\u02bd\3\2\2\2`\u02cb\3\2\2\2b\u02d7\3\2\2\2d\u02e1\3\2\2\2f"+
- "\u02e5\3\2\2\2h\u02eb\3\2\2\2j\u0303\3\2\2\2l\u030b\3\2\2\2n\u031a\3\2"+
- "\2\2p\u031c\3\2\2\2r\u0323\3\2\2\2t\u032c\3\2\2\2v\u0331\3\2\2\2x\u0336"+
- "\3\2\2\2z\u033c\3\2\2\2|\u0343\3\2\2\2~\u0348\3\2\2\2\u0080\u034e\3\2"+
- "\2\2\u0082\u0353\3\2\2\2\u0084\u035a\3\2\2\2\u0086\u0364\3\2\2\2\u0088"+
- "\u0368\3\2\2\2\u008a\u0374\3\2\2\2\u008c\u0377\3\2\2\2\u008e\u037b\3\2"+
- "\2\2\u0090\u0382\3\2\2\2\u0092\u0396\3\2\2\2\u0094\u03d2\3\2\2\2\u0096"+
- "\u03d4\3\2\2\2\u0098\u03d7\3\2\2\2\u009a\u03dc\3\2\2\2\u009c\u03e5\3\2"+
- "\2\2\u009e\u03f3\3\2\2\2\u00a0\u03fd\3\2\2\2\u00a2\u040b\3\2\2\2\u00a4"+
- "\u0426\3\2\2\2\u00a6\u0429\3\2\2\2\u00a8\u0431\3\2\2\2\u00aa\u043a\3\2"+
- "\2\2\u00ac\u044a\3\2\2\2\u00ae\u045d\3\2\2\2\u00b0\u0466\3\2\2\2\u00b2"+
- "\u0471\3\2\2\2\u00b4\u0473\3\2\2\2\u00b6\u0476\3\2\2\2\u00b8\u048d\3\2"+
- "\2\2\u00ba\u048f\3\2\2\2\u00bc\u0494\3\2\2\2\u00be\u04a8\3\2\2\2\u00c0"+
- "\u04aa\3\2\2\2\u00c2\u04ac\3\2\2\2\u00c4\u04af\3\2\2\2\u00c6\u04b3\3\2"+
- "\2\2\u00c8\u04b6\3\2\2\2\u00ca\u04bb\3\2\2\2\u00cc\u04bd\3\2\2\2\u00ce"+
- "\u04cb\3\2\2\2\u00d0\u04d3\3\2\2\2\u00d2\u04db\3\2\2\2\u00d4\u04e3\3\2"+
- "\2\2\u00d6\u04f1\3\2\2\2\u00d8\u04f7\3\2\2\2\u00da\u0505\3\2\2\2\u00dc"+
- "\u0511\3\2\2\2\u00de\u051a\3\2\2\2\u00e0\u051c\3\2\2\2\u00e2\u051e\3\2"+
- "\2\2\u00e4\u0522\3\2\2\2\u00e6\u0525\3\2\2\2\u00e8\u0529\3\2\2\2\u00ea"+
- "\u052b\3\2\2\2\u00ec\u0530\3\2\2\2\u00ee\u0534\3\2\2\2\u00f0\u0538\3\2"+
- "\2\2\u00f2\u053c\3\2\2\2\u00f4\u053f\3\2\2\2\u00f6\u0541\3\2\2\2\u00f8"+
- "\u0556\3\2\2\2\u00fa\u0558\3\2\2\2\u00fc\u056e\3\2\2\2\u00fe\u0576\3\2"+
- "\2\2\u0100\u0578\3\2\2\2\u0102\u058e\3\2\2\2\u0104\u0596\3\2\2\2\u0106"+
- "\u059e\3\2\2\2\u0108\u05a2\3\2\2\2\u010a\u05ae\3\2\2\2\u010c\u05b8\3\2"+
- "\2\2\u010e\u05c3\3\2\2\2\u0110\u05cb\3\2\2\2\u0112\u05cf\3\2\2\2\u0114"+
- "\u05d8\3\2\2\2\u0116\u05e8\3\2\2\2\u0118\u05ed\3\2\2\2\u011a\u05f2\3\2"+
- "\2\2\u011c\u05f4\3\2\2\2\u011e\u05f9\3\2\2\2\u0120\u05fb\3\2\2\2\u0122"+
- "\u05fd\3\2\2\2\u0124\u0600\3\2\2\2\u0126\u0604\3\2\2\2\u0128\u060f\3\2"+
- "\2\2\u012a\u0613\3\2\2\2\u012c\u061a\3\2\2\2\u012e\u061e\3\2\2\2\u0130"+
- "\u0620\3\2\2\2\u0132\u0630\3\2\2\2\u0134\u063d\3\2\2\2\u0136\u0645\3\2"+
- "\2\2\u0138\u064a\3\2\2\2\u013a\u064c\3\2\2\2\u013c\u064e\3\2\2\2\u013e"+
- "\u0650\3\2\2\2\u0140\u0654\3\2\2\2\u0142\u0657\3\2\2\2\u0144\u0660\3\2"+
- "\2\2\u0146\u066b\3\2\2\2\u0148\u0671\3\2\2\2\u014a\u0675\3\2\2\2\u014c"+
- "\u0677\3\2\2\2\u014e\u0687\3\2\2\2\u0150\u068c\3\2\2\2\u0152\u068f\3\2"+
- "\2\2\u0154\u0693\3\2\2\2\u0156\u0697\3\2\2\2\u0158\u069c\3\2\2\2\u015a"+
- "\u06af\3\2\2\2\u015c\u06b3\3\2\2\2\u015e\u06b9\3\2\2\2\u0160\u0161\5\u0092"+
- "J\2\u0161\u0162\7\2\2\3\u0162\3\3\2\2\2\u0163\u0164\5\u0094K\2\u0164\u0165"+
- "\7\2\2\3\u0165\5\3\2\2\2\u0166\u0167\5\u00b0Y\2\u0167\u0168\7\2\2\3\u0168"+
- "\7\3\2\2\2\u0169\u016e\5\n\6\2\u016a\u016b\7k\2\2\u016b\u016d\5\n\6\2"+
- "\u016c\u016a\3\2\2\2\u016d\u0170\3\2\2\2\u016e\u016c\3\2\2\2\u016e\u016f"+
- "\3\2\2\2\u016f\t\3\2\2\2\u0170\u016e\3\2\2\2\u0171\u0173\7c\2\2\u0172"+
- "\u0174\7;\2\2\u0173\u0172\3\2\2\2\u0173\u0174\3\2\2\2\u0174\13\3\2\2\2"+
- "\u0175\u0176\5\16\b\2\u0176\u0177\5\u015e\u00b0\2\u0177\u0179\3\2\2\2"+
- "\u0178\u0175\3\2\2\2\u0179\u017c\3\2\2\2\u017a\u0178\3\2\2\2\u017a\u017b"+
- "\3\2\2\2\u017b\u017d\3\2\2\2\u017c\u017a\3\2\2\2\u017d\u017e\5\u00c6d"+
- "\2\u017e\u0184\5\u015e\u00b0\2\u017f\u0180\5\24\13\2\u0180\u0181\5\u015e"+
- "\u00b0\2\u0181\u0183\3\2\2\2\u0182\u017f\3\2\2\2\u0183\u0186\3\2\2\2\u0184"+
- "\u0182\3\2\2\2\u0184\u0185\3\2\2\2\u0185\u0190\3\2\2\2\u0186\u0184\3\2"+
- "\2\2\u0187\u018b\5v<\2\u0188\u018b\5\u00caf\2\u0189\u018b\5\26\f\2\u018a"+
- "\u0187\3\2\2\2\u018a\u0188\3\2\2\2\u018a\u0189\3\2\2\2\u018b\u018c\3\2"+
- "\2\2\u018c\u018d\5\u015e\u00b0\2\u018d\u018f\3\2\2\2\u018e\u018a\3\2\2"+
- "\2\u018f\u0192\3\2\2\2\u0190\u018e\3\2\2\2\u0190\u0191\3\2\2\2\u0191\u0193"+
- "\3\2\2\2\u0192\u0190\3\2\2\2\u0193\u0194\7\2\2\3\u0194\r\3\2\2\2\u0195"+
- "\u0196\7D\2\2\u0196\u0197\5\u0092J\2\u0197\17\3\2\2\2\u0198\u0199\7E\2"+
- "\2\u0199\u019a\5\u0092J\2\u019a\21\3\2\2\2\u019b\u019c\5\20\t\2\u019c"+
- "\u019d\5\u015e\u00b0\2\u019d\u019f\3\2\2\2\u019e\u019b\3\2\2\2\u019f\u01a2"+
- "\3\2\2\2\u01a0\u019e\3\2\2\2\u01a0\u01a1\3\2\2\2\u01a1\u01a4\3\2\2\2\u01a2"+
- "\u01a0\3\2\2\2\u01a3\u01a5\t\2\2\2\u01a4\u01a3\3\2\2\2\u01a4\u01a5\3\2"+
- "\2\2\u01a5\u01a6\3\2\2\2\u01a6\u01a7\5\u00c8e\2\u01a7\23\3\2\2\2\u01a8"+
- "\u01a9\5\20\t\2\u01a9\u01aa\5\u015e\u00b0\2\u01aa\u01ac\3\2\2\2\u01ab"+
- "\u01a8\3\2\2\2\u01ac\u01af\3\2\2\2\u01ad\u01ab\3\2\2\2\u01ad\u01ae\3\2"+
- "\2\2\u01ae\u01bd\3\2\2\2\u01af\u01ad\3\2\2\2\u01b0\u01b1\7_\2\2\u01b1"+
- "\u01be\5\22\n\2\u01b2\u01b3\7_\2\2\u01b3\u01b9\7d\2\2\u01b4\u01b5\5\22"+
- "\n\2\u01b5\u01b6\5\u015e\u00b0\2\u01b6\u01b8\3\2\2\2\u01b7\u01b4\3\2\2"+
- "\2\u01b8\u01bb\3\2\2\2\u01b9\u01b7\3\2\2\2\u01b9\u01ba\3\2\2\2\u01ba\u01bc"+
- "\3\2\2\2\u01bb\u01b9\3\2\2\2\u01bc\u01be\7e\2\2\u01bd\u01b0\3\2\2\2\u01bd"+
- "\u01b2\3\2\2\2\u01be\25\3\2\2\2\u01bf\u01c4\5h\65\2\u01c0\u01c4\5~@\2"+
- "\u01c1\u01c4\5\u0082B\2\u01c2\u01c4\5|?\2\u01c3\u01bf\3\2\2\2\u01c3\u01c0"+
- "\3\2\2\2\u01c3\u01c1\3\2\2\2\u01c3\u01c2\3\2\2\2\u01c4\27\3\2\2\2\u01c5"+
- "\u01c6\7\34\2\2\u01c6\u01cc\5\u0094K\2\u01c7\u01c8\t\3\2\2\u01c8\u01cc"+
- "\5.\30\2\u01c9\u01ca\t\4\2\2\u01ca\u01cc\5\u0092J\2\u01cb\u01c5\3\2\2"+
- "\2\u01cb\u01c7\3\2\2\2\u01cb\u01c9\3\2\2\2\u01cc\31\3\2\2\2\u01cd\u01ce"+
- "\5\34\17\2\u01ce\33\3\2\2\2\u01cf\u01d0\5V,\2\u01d0\u01d1\5\36\20\2\u01d1"+
- "\35\3\2\2\2\u01d2\u01d3\7C\2\2\u01d3\u01d5\7d\2\2\u01d4\u01d6\5\u00dc"+
- "o\2\u01d5\u01d4\3\2\2\2\u01d5\u01d6\3\2\2\2\u01d6\u01d7\3\2\2\2\u01d7"+
- "\u01d8\7e\2\2\u01d8\37\3\2\2\2\u01d9\u01e6\5F$\2\u01da\u01e6\5D#\2\u01db"+
- "\u01e6\5B\"\2\u01dc\u01e6\5$\23\2\u01dd\u01e6\5@!\2\u01de\u01e6\58\35"+
- "\2\u01df\u01e6\5> \2\u01e0\u01e6\5\66\34\2\u01e1\u01e6\5\62\32\2\u01e2"+
- "\u01e6\5\60\31\2\u01e3\u01e6\5\64\33\2\u01e4\u01e6\5\"\22\2\u01e5\u01d9"+
- "\3\2\2\2\u01e5\u01da\3\2\2\2\u01e5\u01db\3\2\2\2\u01e5\u01dc\3\2\2\2\u01e5"+
- "\u01dd\3\2\2\2\u01e5\u01de\3\2\2\2\u01e5\u01df\3\2\2\2\u01e5\u01e0\3\2"+
- "\2\2\u01e5\u01e1\3\2\2\2\u01e5\u01e2\3\2\2\2\u01e5\u01e3\3\2\2\2\u01e5"+
- "\u01e4\3\2\2\2\u01e6!\3\2\2\2\u01e7\u01e8\t\5\2\2\u01e8#\3\2\2\2\u01e9"+
- "\u01ea\7\\\2\2\u01ea\u01eb\7h\2\2\u01eb\u01ec\5\u00b0Y\2\u01ec\u01ed\7"+
- "i\2\2\u01ed%\3\2\2\2\u01ee\u01f3\5(\25\2\u01ef\u01f0\7k\2\2\u01f0\u01f2"+
- "\5(\25\2\u01f1\u01ef\3\2\2\2\u01f2\u01f5\3\2\2\2\u01f3\u01f1\3\2\2\2\u01f3"+
- "\u01f4\3\2\2\2\u01f4\u01f7\3\2\2\2\u01f5\u01f3\3\2\2\2\u01f6\u01f8\7k"+
- "\2\2\u01f7\u01f6\3\2\2\2\u01f7\u01f8\3\2\2\2\u01f8\'\3\2\2\2\u01f9\u01fe"+
- "\7c\2\2\u01fa\u01fb\7k\2\2\u01fb\u01fd\7c\2\2\u01fc\u01fa\3\2\2\2\u01fd"+
- "\u0200\3\2\2\2\u01fe\u01fc\3\2\2\2\u01fe\u01ff\3\2\2\2\u01ff\u0201\3\2"+
- "\2\2\u0200\u01fe\3\2\2\2\u0201\u0202\5\u0120\u0091\2\u0202)\3\2\2\2\u0203"+
- "\u0205\5,\27\2\u0204\u0203\3\2\2\2\u0205\u0208\3\2\2\2\u0206\u0204\3\2"+
- "\2\2\u0206\u0207\3\2\2\2\u0207+\3\2\2\2\u0208\u0206\3\2\2\2\u0209\u020a"+
- "\7f\2\2\u020a\u020f\5\u0092J\2\u020b\u020c\7k\2\2\u020c\u020e\5\u0092"+
- "J\2\u020d\u020b\3\2\2\2\u020e\u0211\3\2\2\2\u020f\u020d\3\2\2\2\u020f"+
- "\u0210\3\2\2\2\u0210\u0212\3\2\2\2\u0211\u020f\3\2\2\2\u0212\u0213\7g"+
- "\2\2\u0213-\3\2\2\2\u0214\u0215\5\u00a2R\2\u0215/\3\2\2\2\u0216\u0217"+
- "\7\62\2\2\u0217\u0218\7d\2\2\u0218\u0219\5\u0092J\2\u0219\u021a\7e\2\2"+
- "\u021a\61\3\2\2\2\u021b\u021c\7\66\2\2\u021c\u021d\7h\2\2\u021d\u021e"+
- "\5\u00b0Y\2\u021e\u021f\7i\2\2\u021f\63\3\2\2\2\u0220\u0221\7\63\2\2\u0221"+
- "\u0222\7d\2\2\u0222\u0223\5\u0092J\2\u0223\u0224\7e\2\2\u0224\65\3\2\2"+
- "\2\u0225\u0226\t\6\2\2\u0226\u0227\7d\2\2\u0227\u0228\5\u0092J\2\u0228"+
- "\u0229\7e\2\2\u0229\67\3\2\2\2\u022a\u022f\7\23\2\2\u022b\u022c\7h\2\2"+
- "\u022c\u022d\5:\36\2\u022d\u022e\7i\2\2\u022e\u0230\3\2\2\2\u022f\u022b"+
- "\3\2\2\2\u022f\u0230\3\2\2\2\u0230\u0231\3\2\2\2\u0231\u0232\7d\2\2\u0232"+
- "\u0233\5\u0092J\2\u0233\u0234\7e\2\2\u02349\3\2\2\2\u0235\u0238\5<\37"+
- "\2\u0236\u0238\7\25\2\2\u0237\u0235\3\2\2\2\u0237\u0236\3\2\2\2\u0238"+
- ";\3\2\2\2\u0239\u023a\7c\2\2\u023a=\3\2\2\2\u023b\u023c\7\24\2\2\u023c"+
- "\u023d\7d\2\2\u023d\u023e\5\u0092J\2\u023e\u023f\7e\2\2\u023f?\3\2\2\2"+
- "\u0240\u0241\79\2\2\u0241\u0242\7d\2\2\u0242\u0243\5\u0092J\2\u0243\u0244"+
- "\7e\2\2\u0244A\3\2\2\2\u0245\u0246\78\2\2\u0246\u0247\7d\2\2\u0247\u0248"+
- "\5\u0092J\2\u0248\u0249\7e\2\2\u0249C\3\2\2\2\u024a\u024b\7\30\2\2\u024b"+
- "\u024c\7d\2\2\u024c\u024f\5\u0092J\2\u024d\u024e\7k\2\2\u024e\u0250\5"+
- "\u0092J\2\u024f\u024d\3\2\2\2\u024f\u0250\3\2\2\2\u0250\u0251\3\2\2\2"+
- "\u0251\u0252\7e\2\2\u0252E\3\2\2\2\u0253\u0254\t\6\2\2\u0254\u0255\7h"+
- "\2\2\u0255\u0256\5\u0092J\2\u0256\u0257\7<\2\2\u0257\u0258\5\u0092J\2"+
- "\u0258\u0259\7i\2\2\u0259G\3\2\2\2\u025a\u025b\7h\2\2\u025b\u0260\5J&"+
- "\2\u025c\u025d\7k\2\2\u025d\u025f\5J&\2\u025e\u025c\3\2\2\2\u025f\u0262"+
- "\3\2\2\2\u0260\u025e\3\2\2\2\u0260\u0261\3\2\2\2\u0261\u0263\3\2\2\2\u0262"+
- "\u0260\3\2\2\2\u0263\u0264\7i\2\2\u0264I\3\2\2\2\u0265\u0266\5\u0092J"+
- "\2\u0266\u0267\7j\2\2\u0267\u0268\5\u0092J\2\u0268K\3\2\2\2\u0269\u026d"+
- "\5T+\2\u026a\u026d\5R*\2\u026b\u026d\5N(\2\u026c\u0269\3\2\2\2\u026c\u026a"+
- "\3\2\2\2\u026c\u026b\3\2\2\2\u026dM\3\2\2\2\u026e\u026f\7\64\2\2\u026f"+
- "\u0275\7f\2\2\u0270\u0271\5P)\2\u0271\u0272\5\u015e\u00b0\2\u0272\u0274"+
- "\3\2\2\2\u0273\u0270\3\2\2\2\u0274\u0277\3\2\2\2\u0275\u0273\3\2\2\2\u0275"+
- "\u0276\3\2\2\2\u0276\u0278\3\2\2\2\u0277\u0275\3\2\2\2\u0278\u0279\7g"+
- "\2\2\u0279O\3\2\2\2\u027a\u027b\7K\2\2\u027b\u027c\7c\2\2\u027c\u0284"+
- "\5\u012c\u0097\2\u027d\u027e\7\65\2\2\u027e\u027f\7f\2\2\u027f\u0280\5"+
- "\u0092J\2\u0280\u0281\5\u015e\u00b0\2\u0281\u0282\7g\2\2\u0282\u0284\3"+
- "\2\2\2\u0283\u027a\3\2\2\2\u0283\u027d\3\2\2\2\u0284Q\3\2\2\2\u0285\u0286"+
- "\7\34\2\2\u0286\u0287\7h\2\2\u0287\u0288\7i\2\2\u0288\u0289\5\u0120\u0091"+
- "\2\u0289S\3\2\2\2\u028a\u028b\t\7\2\2\u028b\u028c\7h\2\2\u028c\u028d\5"+
- "\u00b0Y\2\u028d\u028e\7i\2\2\u028e\u0296\3\2\2\2\u028f\u0290\7,\2\2\u0290"+
- "\u0291\7h\2\2\u0291\u0292\5\u00b0Y\2\u0292\u0293\7i\2\2\u0293\u0294\5"+
- "\u00b0Y\2\u0294\u0296\3\2\2\2\u0295\u028a\3\2\2\2\u0295\u028f\3\2\2\2"+
- "\u0296U\3\2\2\2\u0297\u029d\5X-\2\u0298\u0299\7\20\2\2\u0299\u029d\b,"+
- "\1\2\u029a\u029b\7B\2\2\u029b\u029d\b,\1\2\u029c\u0297\3\2\2\2\u029c\u0298"+
- "\3\2\2\2\u029c\u029a\3\2\2\2\u029d\u029e\3\2\2\2\u029e\u02a0\5\u015e\u00b0"+
- "\2\u029f\u029c\3\2\2\2\u02a0\u02a3\3\2\2\2\u02a1\u02a2\3\2\2\2\u02a1\u029f"+
- "\3\2\2\2\u02a2\u02a6\3\2\2\2\u02a3\u02a1\3\2\2\2\u02a4\u02a5\7\20\2\2"+
- "\u02a5\u02a7\b,\1\2\u02a6\u02a4\3\2\2\2\u02a6\u02a7\3\2\2\2\u02a7W\3\2"+
- "\2\2\u02a8\u02a9\7\13\2\2\u02a9\u02b1\5\\/\2\u02aa\u02ab\7\f\2\2\u02ab"+
- "\u02b1\5\\/\2\u02ac\u02ad\7\r\2\2\u02ad\u02b1\5\\/\2\u02ae\u02af\7\17"+
- "\2\2\u02af\u02b1\5Z.\2\u02b0\u02a8\3\2\2\2\u02b0\u02aa\3\2\2\2\u02b0\u02ac"+
- "\3\2\2\2\u02b0\u02ae\3\2\2\2\u02b1Y\3\2\2\2\u02b2\u02b4\5\u00d2j\2\u02b3"+
- "\u02b2\3\2\2\2\u02b3\u02b4\3\2\2\2\u02b4\u02b7\3\2\2\2\u02b5\u02b6\7Z"+
- "\2\2\u02b6\u02b8\5\u0092J\2\u02b7\u02b5\3\2\2\2\u02b7\u02b8\3\2\2\2\u02b8"+
- "[\3\2\2\2\u02b9\u02bc\3\2\2\2\u02ba\u02bc\5\u0092J\2\u02bb\u02b9\3\2\2"+
- "\2\u02bb\u02ba\3\2\2\2\u02bc]\3\2\2\2\u02bd\u02c2\7f\2\2\u02be\u02bf\7"+
- ":\2\2\u02bf\u02c0\5\u00d0i\2\u02c0\u02c1\5\u015e\u00b0\2\u02c1\u02c3\3"+
- "\2\2\2\u02c2\u02be\3\2\2\2\u02c2\u02c3\3\2\2\2\u02c3\u02c5\3\2\2\2\u02c4"+
- "\u02c6\5\u00dco\2\u02c5\u02c4\3\2\2\2\u02c5\u02c6\3\2\2\2\u02c6\u02c7"+
- "\3\2\2\2\u02c7\u02c8\7g\2\2\u02c8_\3\2\2\2\u02c9\u02cc\5\u013e\u00a0\2"+
- "\u02ca\u02cc\7c\2\2\u02cb\u02c9\3\2\2\2\u02cb\u02ca\3\2\2\2\u02cc\u02d5"+
- "\3\2\2\2\u02cd\u02d2\7f\2\2\u02ce\u02d0\5b\62\2\u02cf\u02d1\7k\2\2\u02d0"+
- "\u02cf\3\2\2\2\u02d0\u02d1\3\2\2\2\u02d1\u02d3\3\2\2\2\u02d2\u02ce\3\2"+
- "\2\2\u02d2\u02d3\3\2\2\2\u02d3\u02d4\3\2\2\2\u02d4\u02d6\7g\2\2\u02d5"+
- "\u02cd\3\2\2\2\u02d5\u02d6\3\2\2\2\u02d6a\3\2\2\2\u02d7\u02dc\5d\63\2"+
- "\u02d8\u02d9\7k\2\2\u02d9\u02db\5d\63\2\u02da\u02d8\3\2\2\2\u02db\u02de"+
- "\3\2\2\2\u02dc\u02da\3\2\2\2\u02dc\u02dd\3\2\2\2\u02ddc\3\2\2\2\u02de"+
- "\u02dc\3\2\2\2\u02df\u02e0\7c\2\2\u02e0\u02e2\7m\2\2\u02e1\u02df\3\2\2"+
- "\2\u02e1\u02e2\3\2\2\2\u02e2\u02e3\3\2\2\2\u02e3\u02e4\5\u0092J\2\u02e4"+
- "e\3\2\2\2\u02e5\u02e6\7F\2\2\u02e6\u02e7\5\u0092J\2\u02e7\u02e8\7\21\2"+
- "\2\u02e8\u02e9\5`\61\2\u02e9\u02ea\5\u00dan\2\u02eag\3\2\2\2\u02eb\u02ec"+
- "\5\u00b0Y\2\u02ec\u02ed\7\21\2\2\u02ed\u0300\5\u00b0Y\2\u02ee\u02f4\7"+
- "f\2\2\u02ef\u02f0\5p9\2\u02f0\u02f1\5\u015e\u00b0\2\u02f1\u02f3\3\2\2"+
- "\2\u02f2\u02ef\3\2\2\2\u02f3\u02f6\3\2\2\2\u02f4\u02f2\3\2\2\2\u02f4\u02f5"+
- "\3\2\2\2\u02f5\u02fc\3\2\2\2\u02f6\u02f4\3\2\2\2\u02f7\u02f8\5j\66\2\u02f8"+
- "\u02f9\5\u015e\u00b0\2\u02f9\u02fb\3\2\2\2\u02fa\u02f7\3\2\2\2\u02fb\u02fe"+
- "\3\2\2\2\u02fc\u02fa\3\2\2\2\u02fc\u02fd\3\2\2\2\u02fd\u02ff\3\2\2\2\u02fe"+
- "\u02fc\3\2\2\2\u02ff\u0301\7g\2\2\u0300\u02ee\3\2\2\2\u0300\u0301\3\2"+
- "\2\2\u0301i\3\2\2\2\u0302\u0304\7\20\2\2\u0303\u0302\3\2\2\2\u0303\u0304"+
- "\3\2\2\2\u0304\u0305\3\2\2\2\u0305\u0306\5l\67\2\u0306\u0307\7c\2\2\u0307"+
- "\u0309\5\u012c\u0097\2\u0308\u030a\5\u00dan\2\u0309\u0308\3\2\2\2\u0309"+
- "\u030a\3\2\2\2\u030ak\3\2\2\2\u030b\u030d\7d\2\2\u030c\u030e\7c\2\2\u030d"+
- "\u030c\3\2\2\2\u030d\u030e\3\2\2\2\u030e\u0310\3\2\2\2\u030f\u0311\7\u0085"+
- "\2\2\u0310\u030f\3\2\2\2\u0310\u0311\3\2\2\2\u0311\u0312\3\2\2\2\u0312"+
- "\u0313\5\u011a\u008e\2\u0313\u0314\7e\2\2\u0314m\3\2\2\2\u0315\u031b\5"+
- "\u00a2R\2\u0316\u0317\5\u00b0Y\2\u0317\u0318\7n\2\2\u0318\u0319\7c\2\2"+
- "\u0319\u031b\3\2\2\2\u031a\u0315\3\2\2\2\u031a\u0316\3\2\2\2\u031bo\3"+
- "\2\2\2\u031c\u031d\7\67\2\2\u031d\u031e\7c\2\2\u031e\u0321\7q\2\2\u031f"+
- "\u0322\5n8\2\u0320\u0322\5\u013c\u009f\2\u0321\u031f\3\2\2\2\u0321\u0320"+
- "\3\2\2\2\u0322q\3\2\2\2\u0323\u0324\7\60\2\2\u0324\u0325\7d\2\2\u0325"+
- "\u0328\5\u00b0Y\2\u0326\u0327\7k\2\2\u0327\u0329\5\u00d2j\2\u0328\u0326"+
- "\3\2\2\2\u0328\u0329\3\2\2\2\u0329\u032a\3\2\2\2\u032a\u032b\7e\2\2\u032b"+
- "s\3\2\2\2\u032c\u032d\7/\2\2\u032d\u032e\7d\2\2\u032e\u032f\5\u00b0Y\2"+
- "\u032f\u0330\7e\2\2\u0330u\3\2\2\2\u0331\u0334\5V,\2\u0332\u0335\5x=\2"+
- "\u0333\u0335\5z>\2\u0334\u0332\3\2\2\2\u0334\u0333\3\2\2\2\u0335w\3\2"+
- "\2\2\u0336\u0337\7K\2\2\u0337\u0338\7c\2\2\u0338\u033a\5\u012c\u0097\2"+
- "\u0339\u033b\5^\60\2\u033a\u0339\3\2\2\2\u033a\u033b\3\2\2\2\u033by\3"+
- "\2\2\2\u033c\u033d\7K\2\2\u033d\u033e\5\u0088E\2\u033e\u033f\7c\2\2\u033f"+
- "\u0341\5\u012c\u0097\2\u0340\u0342\5^\60\2\u0341\u0340\3\2\2\2\u0341\u0342"+
- "\3\2\2\2\u0342{\3\2\2\2\u0343\u0346\7\34\2\2\u0344\u0347\5v<\2\u0345\u0347"+
- "\5\u00caf\2\u0346\u0344\3\2\2\2\u0346\u0345\3\2\2\2\u0347}\3\2\2\2\u0348"+
- "\u0349\7\67\2\2\u0349\u034a\7c\2\2\u034a\u034c\5\u0130\u0099\2\u034b\u034d"+
- "\5\u0080A\2\u034c\u034b\3\2\2\2\u034c\u034d\3\2\2\2\u034d\177\3\2\2\2"+
- "\u034e\u034f\7f\2\2\u034f\u0350\5\u0092J\2\u0350\u0351\5\u015e\u00b0\2"+
- "\u0351\u0352\7g\2\2\u0352\u0081\3\2\2\2\u0353\u0354\7\67\2\2\u0354\u0355"+
- "\5\u0088E\2\u0355\u0356\7c\2\2\u0356\u0358\5\u0130\u0099\2\u0357\u0359"+
- "\5\u0080A\2\u0358\u0357\3\2\2\2\u0358\u0359\3\2\2\2\u0359\u0083\3\2\2"+
- "\2\u035a\u0362\5\b\5\2\u035b\u035e\5\u00b0Y\2\u035c\u035d\7j\2\2\u035d"+
- "\u035f\5\u00d2j\2\u035e\u035c\3\2\2\2\u035e\u035f\3\2\2\2\u035f\u0363"+
- "\3\2\2\2\u0360\u0361\7j\2\2\u0361\u0363\5\u00d2j\2\u0362\u035b\3\2\2\2"+
- "\u0362\u0360\3\2\2\2\u0363\u0085\3\2\2\2\u0364\u0365\5\b\5\2\u0365\u0366"+
- "\7q\2\2\u0366\u0367\5\u00d2j\2\u0367\u0087\3\2\2\2\u0368\u036a\7d\2\2"+
- "\u0369\u036b\5\n\6\2\u036a\u0369\3\2\2\2\u036a\u036b\3\2\2\2\u036b\u036c"+
- "\3\2\2\2\u036c\u036e\5\u00b0Y\2\u036d\u036f\7k\2\2\u036e\u036d\3\2\2\2"+
- "\u036e\u036f\3\2\2\2\u036f\u0370\3\2\2\2\u0370\u0371\7e\2\2\u0371\u0089"+
- "\3\2\2\2\u0372\u0375\5\u008cG\2\u0373\u0375\5\u008eH\2\u0374\u0372\3\2"+
- "\2\2\u0374\u0373\3\2\2\2\u0375\u008b\3\2\2\2\u0376\u0378\5\u00d0i\2\u0377"+
- "\u0376\3\2\2\2\u0377\u0378\3\2\2\2\u0378\u0379\3\2\2\2\u0379\u037a\5\u0090"+
- "I\2\u037a\u008d\3\2\2\2\u037b\u037d\7\34\2\2\u037c\u037e\5\u00d0i\2\u037d"+
- "\u037c\3\2\2\2\u037d\u037e\3\2\2\2\u037e\u037f\3\2\2\2\u037f\u0380\5\u0090"+
- "I\2\u0380\u008f\3\2\2\2\u0381\u0383\7r\2\2\u0382\u0381\3\2\2\2\u0382\u0383"+
- "\3\2\2\2\u0383\u0384\3\2\2\2\u0384\u0385\5\u00b0Y\2\u0385\u0091\3\2\2"+
- "\2\u0386\u0387\bJ\1\2\u0387\u0388\t\b\2\2\u0388\u0397\5\u0092J\20\u0389"+
- "\u0397\5\u00a2R\2\u038a\u038b\7\33\2\2\u038b\u038c\5.\30\2\u038c\u038d"+
- "\7\35\2\2\u038d\u038e\5\u0092J\4\u038e\u0397\3\2\2\2\u038f\u0390\t\t\2"+
- "\2\u0390\u0391\5&\24\2\u0391\u0392\7m\2\2\u0392\u0393\7m\2\2\u0393\u0394"+
- "\5*\26\2\u0394\u0395\5\u0092J\3\u0395\u0397\3\2\2\2\u0396\u0386\3\2\2"+
- "\2\u0396\u0389\3\2\2\2\u0396\u038a\3\2\2\2\u0396\u038f\3\2\2\2\u0397\u03bb"+
- "\3\2\2\2\u0398\u0399\f\16\2\2\u0399\u039a\t\n\2\2\u039a\u03ba\5\u0092"+
- "J\17\u039b\u039c\f\r\2\2\u039c\u039d\t\13\2\2\u039d\u03ba\5\u0092J\16"+
- "\u039e\u039f\f\f\2\2\u039f\u03a0\t\f\2\2\u03a0\u03ba\5\u0092J\r\u03a1"+
- "\u03a2\f\13\2\2\u03a2\u03a3\t\r\2\2\u03a3\u03ba\5\u0092J\f\u03a4\u03a5"+
- "\f\n\2\2\u03a5\u03a6\t\16\2\2\u03a6\u03ba\5\u0092J\13\u03a7\u03a8\f\b"+
- "\2\2\u03a8\u03a9\7t\2\2\u03a9\u03ba\5\u0092J\t\u03aa\u03ab\f\7\2\2\u03ab"+
- "\u03ac\7s\2\2\u03ac\u03ba\5\u0092J\b\u03ad\u03ae\f\6\2\2\u03ae\u03af\7"+
- "#\2\2\u03af\u03ba\5\u0092J\6\u03b0\u03b1\f\5\2\2\u03b1\u03b2\7&\2\2\u03b2"+
- "\u03b3\5\u0092J\2\u03b3\u03b4\7m\2\2\u03b4\u03b5\5\u0092J\5\u03b5\u03ba"+
- "\3\2\2\2\u03b6\u03b7\f\t\2\2\u03b7\u03b8\7\21\2\2\u03b8\u03ba\5`\61\2"+
- "\u03b9\u0398\3\2\2\2\u03b9\u039b\3\2\2\2\u03b9\u039e\3\2\2\2\u03b9\u03a1"+
- "\3\2\2\2\u03b9\u03a4\3\2\2\2\u03b9\u03a7\3\2\2\2\u03b9\u03aa\3\2\2\2\u03b9"+
- "\u03ad\3\2\2\2\u03b9\u03b0\3\2\2\2\u03b9\u03b6\3\2\2\2\u03ba\u03bd\3\2"+
- "\2\2\u03bb\u03b9\3\2\2\2\u03bb\u03bc\3\2\2\2\u03bc\u0093\3\2\2\2\u03bd"+
- "\u03bb\3\2\2\2\u03be\u03d3\5\30\r\2\u03bf\u03d3\5\32\16\2\u03c0\u03d3"+
- "\5\u0098M\2\u03c1\u03d3\5\u0096L\2\u03c2\u03d3\5\u00caf\2\u03c3\u03d3"+
- "\5\u00eav\2\u03c4\u03d3\5\u00dep\2\u03c5\u03d3\5\u0118\u008d\2\u03c6\u03d3"+
- "\5\u00ecw\2\u03c7\u03d3\5\u00eex\2\u03c8\u03d3\5\u00f0y\2\u03c9\u03d3"+
- "\5\u00f2z\2\u03ca\u03d3\5\u00f4{\2\u03cb\u03d3\5\u00dan\2\u03cc\u03d3"+
- "\5\u00f6|\2\u03cd\u03d3\5\u00f8}\2\u03ce\u03d3\5\u010a\u0086\2\u03cf\u03d3"+
- "\5\u009aN\2\u03d0\u03d3\5\u009eP\2\u03d1\u03d3\5f\64\2\u03d2\u03be\3\2"+
- "\2\2\u03d2\u03bf\3\2\2\2\u03d2\u03c0\3\2\2\2\u03d2\u03c1\3\2\2\2\u03d2"+
- "\u03c2\3\2\2\2\u03d2\u03c3\3\2\2\2\u03d2\u03c4\3\2\2\2\u03d2\u03c5\3\2"+
- "\2\2\u03d2\u03c6\3\2\2\2\u03d2\u03c7\3\2\2\2\u03d2\u03c8\3\2\2\2\u03d2"+
- "\u03c9\3\2\2\2\u03d2\u03ca\3\2\2\2\u03d2\u03cb\3\2\2\2\u03d2\u03cc\3\2"+
- "\2\2\u03d2\u03cd\3\2\2\2\u03d2\u03ce\3\2\2\2\u03d2\u03cf\3\2\2\2\u03d2"+
- "\u03d0\3\2\2\2\u03d2\u03d1\3\2\2\2\u03d3\u0095\3\2\2\2\u03d4\u03d5\7%"+
- "\2\2\u03d5\u03d6\5\u0092J\2\u03d6\u0097\3\2\2\2\u03d7\u03d8\7V\2\2\u03d8"+
- "\u03da\5\u0092J\2\u03d9\u03db\5\u00dan\2\u03da\u03d9\3\2\2\2\u03da\u03db"+
- "\3\2\2\2\u03db\u0099\3\2\2\2\u03dc\u03dd\5\u009cO\2\u03dd\u03de\5\u0112"+
- "\u008a\2\u03de\u009b\3\2\2\2\u03df\u03e0\7\16\2\2\u03e0\u03e1\5\u0092"+
- "J\2\u03e1\u03e2\5\u015e\u00b0\2\u03e2\u03e4\3\2\2\2\u03e3\u03df\3\2\2"+
- "\2\u03e4\u03e7\3\2\2\2\u03e5\u03e3\3\2\2\2\u03e5\u03e6\3\2\2\2\u03e6\u03ec"+
- "\3\2\2\2\u03e7\u03e5\3\2\2\2\u03e8\u03e9\7\17\2\2\u03e9\u03ea\5Z.\2\u03ea"+
- "\u03eb\5\u015e\u00b0\2\u03eb\u03ed\3\2\2\2\u03ec\u03e8\3\2\2\2\u03ec\u03ed"+
- "\3\2\2\2\u03ed\u009d\3\2\2\2\u03ee\u03ef\7O\2\2\u03ef\u03f4\5\u0092J\2"+
- "\u03f0\u03f1\7O\2\2\u03f1\u03f2\t\3\2\2\u03f2\u03f4\5.\30\2\u03f3\u03ee"+
- "\3\2\2\2\u03f3\u03f0\3\2\2\2\u03f4\u009f\3\2\2\2\u03f5\u03fe\7\5\2\2\u03f6"+
- "\u03fe\7\6\2\2\u03f7\u03fe\7b\2\2\u03f8\u03fe\5\u013a\u009e\2\u03f9\u03fe"+
- "\5\u0150\u00a9\2\u03fa\u03fe\7\3\2\2\u03fb\u03fe\7\u008d\2\2\u03fc\u03fe"+
- "\7\u008e\2\2\u03fd\u03f5\3\2\2\2\u03fd\u03f6\3\2\2\2\u03fd\u03f7\3\2\2"+
- "\2\u03fd\u03f8\3\2\2\2\u03fd\u03f9\3\2\2\2\u03fd\u03fa\3\2\2\2\u03fd\u03fb"+
- "\3\2\2\2\u03fd\u03fc\3\2\2\2\u03fe\u00a1\3\2\2\2\u03ff\u0400\bR\1\2\u0400"+
- "\u040c\5\u0136\u009c\2\u0401\u040c\5\u0132\u009a\2\u0402\u040c\5\u015a"+
- "\u00ae\2\u0403\u040c\5 \21\2\u0404\u040c\5t;\2\u0405\u040c\5r:\2\u0406"+
- "\u0407\t\17\2\2\u0407\u0408\7d\2\2\u0408\u0409\5\u0092J\2\u0409\u040a"+
- "\7e\2\2\u040a\u040c\3\2\2\2\u040b\u03ff\3\2\2\2\u040b\u0401\3\2\2\2\u040b"+
- "\u0402\3\2\2\2\u040b\u0403\3\2\2\2\u040b\u0404\3\2\2\2\u040b\u0405\3\2"+
- "\2\2\u040b\u0406\3\2\2\2\u040c\u0423\3\2\2\2\u040d\u040e\f\13\2\2\u040e"+
- "\u040f\7n\2\2\u040f\u0422\7c\2\2\u0410\u0411\f\n\2\2\u0411\u0422\5\u0154"+
- "\u00ab\2\u0412\u0413\f\t\2\2\u0413\u0422\5\u00bc_\2\u0414\u0415\f\b\2"+
- "\2\u0415\u0422\5H%\2\u0416\u0417\f\7\2\2\u0417\u0422\5\u0156\u00ac\2\u0418"+
- "\u0419\f\6\2\2\u0419\u0422\5\u0158\u00ad\2\u041a\u041b\f\5\2\2\u041b\u041c"+
- "\5\u0158\u00ad\2\u041c\u041d\7\22\2\2\u041d\u041e\5`\61\2\u041e\u0422"+
- "\3\2\2\2\u041f\u0420\f\4\2\2\u0420\u0422\5\u00a8U\2\u0421\u040d\3\2\2"+
- "\2\u0421\u0410\3\2\2\2\u0421\u0412\3\2\2\2\u0421\u0414\3\2\2\2\u0421\u0416"+
- "\3\2\2\2\u0421\u0418\3\2\2\2\u0421\u041a\3\2\2\2\u0421\u041f\3\2\2\2\u0422"+
- "\u0425\3\2\2\2\u0423\u0421\3\2\2\2\u0423\u0424\3\2\2\2\u0424\u00a3\3\2"+
- "\2\2\u0425\u0423\3\2\2\2\u0426\u0427\5V,\2\u0427\u0428\5\u00a6T\2\u0428"+
- "\u00a5\3\2\2\2\u0429\u042b\7K\2\2\u042a\u042c\7c\2\2\u042b\u042a\3\2\2"+
- "\2\u042b\u042c\3\2\2\2\u042c\u042d\3\2\2\2\u042d\u042f\5\u012c\u0097\2"+
- "\u042e\u0430\5^\60\2\u042f\u042e\3\2\2\2\u042f\u0430\3\2\2\2\u0430\u00a7"+
- "\3\2\2\2\u0431\u0433\7\'\2\2\u0432\u0434\5\u00d2j\2\u0433\u0432\3\2\2"+
- "\2\u0433\u0434\3\2\2\2\u0434\u0436\3\2\2\2\u0435\u0437\7k\2\2\u0436\u0435"+
- "\3\2\2\2\u0436\u0437\3\2\2\2\u0437\u0438\3\2\2\2\u0438\u0439\7(\2\2\u0439"+
- "\u00a9\3\2\2\2\u043a\u043b\7L\2\2\u043b\u0445\7f\2\2\u043c\u0440\5\u00ae"+
- "X\2\u043d\u0440\5\u011a\u008e\2\u043e\u0440\5\u00acW\2\u043f\u043c\3\2"+
- "\2\2\u043f\u043d\3\2\2\2\u043f\u043e\3\2\2\2\u0440\u0441\3\2\2\2\u0441"+
- "\u0442\5\u015e\u00b0\2\u0442\u0444\3\2\2\2\u0443\u043f\3\2\2\2\u0444\u0447"+
- "\3\2\2\2\u0445\u0443\3\2\2\2\u0445\u0446\3\2\2\2\u0446\u0448\3\2\2\2\u0447"+
- "\u0445\3\2\2\2\u0448\u0449\7g\2\2\u0449\u00ab\3\2\2\2\u044a\u044b\7\67"+
- "\2\2\u044b\u044c\7c\2\2\u044c\u044d\5\u0130\u0099\2\u044d\u00ad\3\2\2"+
- "\2\u044e\u0450\7\34\2\2\u044f\u044e\3\2\2\2\u044f\u0450\3\2\2\2\u0450"+
- "\u0451\3\2\2\2\u0451\u0452\5V,\2\u0452\u0453\7c\2\2\u0453\u0454\5\u0130"+
- "\u0099\2\u0454\u0455\5\u012e\u0098\2\u0455\u045e\3\2\2\2\u0456\u0458\7"+
- "\34\2\2\u0457\u0456\3\2\2\2\u0457\u0458\3\2\2\2\u0458\u0459\3\2\2\2\u0459"+
- "\u045a\5V,\2\u045a\u045b\7c\2\2\u045b\u045c\5\u0130\u0099\2\u045c\u045e"+
- "\3\2\2\2\u045d\u044f\3\2\2\2\u045d\u0457\3\2\2\2\u045e\u00af\3\2\2\2\u045f"+
- "\u0467\5\u011a\u008e\2\u0460\u0467\5\u00b2Z\2\u0461\u0467\5L\'\2\u0462"+
- "\u0463\7d\2\2\u0463\u0464\5\u00b0Y\2\u0464\u0465\7e\2\2\u0465\u0467\3"+
- "\2\2\2\u0466\u045f\3\2\2\2\u0466\u0460\3\2\2\2\u0466\u0461\3\2\2\2\u0466"+
- "\u0462\3\2\2\2\u0467\u00b1\3\2\2\2\u0468\u0472\5\u011c\u008f\2\u0469\u0472"+
- "\5\u014c\u00a7\2\u046a\u0472\5\u0122\u0092\2\u046b\u0472\5\u012a\u0096"+
- "\2\u046c\u0472\5\u00aaV\2\u046d\u0472\5\u0124\u0093\2\u046e\u0472\5\u0126"+
- "\u0094\2\u046f\u0472\5\u0128\u0095\2\u0470\u0472\5\u00b4[\2\u0471\u0468"+
- "\3\2\2\2\u0471\u0469\3\2\2\2\u0471\u046a\3\2\2\2\u0471\u046b\3\2\2\2\u0471"+
- "\u046c\3\2\2\2\u0471\u046d\3\2\2\2\u0471\u046e\3\2\2\2\u0471\u046f\3\2"+
- "\2\2\u0471\u0470\3\2\2\2\u0472\u00b3\3\2\2\2\u0473\u0474\7\67\2\2\u0474"+
- "\u0475\5\u00b6\\\2\u0475\u00b5\3\2\2\2\u0476\u0482\7d\2\2\u0477\u047c"+
- "\5\u00b0Y\2\u0478\u0479\7k\2\2\u0479\u047b\5\u00b0Y\2\u047a\u0478\3\2"+
- "\2\2\u047b\u047e\3\2\2\2\u047c\u047a\3\2\2\2\u047c\u047d\3\2\2\2\u047d"+
- "\u0480\3\2\2\2\u047e\u047c\3\2\2\2\u047f\u0481\7k\2\2\u0480\u047f\3\2"+
- "\2\2\u0480\u0481\3\2\2\2\u0481\u0483\3\2\2\2\u0482\u0477\3\2\2\2\u0482"+
- "\u0483\3\2\2\2\u0483\u0484\3\2\2\2\u0484\u0485\7e\2\2\u0485\u00b7\3\2"+
- "\2\2\u0486\u048e\5\u014c\u00a7\2\u0487\u048e\5\u011c\u008f\2\u0488\u048e"+
- "\5\u00ba^\2\u0489\u048e\5\u0124\u0093\2\u048a\u048e\5\u0126\u0094\2\u048b"+
- "\u048e\5L\'\2\u048c\u048e\5\u011a\u008e\2\u048d\u0486\3\2\2\2\u048d\u0487"+
- "\3\2\2\2\u048d\u0488\3\2\2\2\u048d\u0489\3\2\2\2\u048d\u048a\3\2\2\2\u048d"+
- "\u048b\3\2\2\2\u048d\u048c\3\2\2\2\u048e\u00b9\3\2\2\2\u048f\u0490\7h"+
- "\2\2\u0490\u0491\7r\2\2\u0491\u0492\7i\2\2\u0492\u0493\5\u0120\u0091\2"+
- "\u0493\u00bb\3\2\2\2\u0494\u04a4\7h\2\2\u0495\u0497\5\u00be`\2\u0496\u0495"+
- "\3\2\2\2\u0496\u0497\3\2\2\2\u0497\u0498\3\2\2\2\u0498\u049a\7m\2\2\u0499"+
+ "\u04b0\nc\3c\3c\3d\3d\3d\3d\3d\3d\5d\u04ba\nd\3d\3d\3d\3d\5d\u04c0\nd"+
+ "\5d\u04c2\nd\3e\3e\3e\3f\3f\3g\3g\3g\5g\u04cc\ng\3h\3h\3h\3h\3h\3h\7h"+
+ "\u04d4\nh\fh\16h\u04d7\13h\3h\5h\u04da\nh\3i\3i\5i\u04de\ni\3i\3i\5i\u04e2"+
+ "\ni\3j\3j\3j\7j\u04e7\nj\fj\16j\u04ea\13j\3k\3k\3k\7k\u04ef\nk\fk\16k"+
+ "\u04f2\13k\3l\3l\3l\3l\3l\3l\7l\u04fa\nl\fl\16l\u04fd\13l\3l\5l\u0500"+
+ "\nl\3m\3m\5m\u0504\nm\3m\3m\3n\3n\3n\3n\3n\3n\7n\u050e\nn\fn\16n\u0511"+
+ "\13n\3n\5n\u0514\nn\3o\3o\5o\u0518\no\3o\3o\3p\5p\u051d\np\3p\3p\3p\6"+
+ "p\u0522\np\rp\16p\u0523\3q\3q\3q\3q\3q\5q\u052b\nq\3r\3r\3s\3s\3s\3s\3"+
+ "t\3t\3t\3u\3u\3u\3u\3v\3v\3w\3w\3w\5w\u053f\nw\3x\3x\5x\u0543\nx\3y\3"+
+ "y\5y\u0547\ny\3z\3z\5z\u054b\nz\3{\3{\3{\3|\3|\3}\3}\3}\3}\3}\3}\3}\3"+
+ "}\3}\5}\u055b\n}\3}\3}\3}\3}\5}\u0561\n}\5}\u0563\n}\3~\3~\5~\u0567\n"+
+ "~\3\177\3\177\5\177\u056b\n\177\3\177\5\177\u056e\n\177\3\177\3\177\5"+
+ "\177\u0572\n\177\5\177\u0574\n\177\3\177\3\177\7\177\u0578\n\177\f\177"+
+ "\16\177\u057b\13\177\3\177\3\177\3\u0080\3\u0080\3\u0080\5\u0080\u0582"+
+ "\n\u0080\3\u0081\3\u0081\3\u0081\5\u0081\u0587\n\u0081\3\u0082\3\u0082"+
+ "\3\u0082\3\u0082\3\u0082\3\u0082\3\u0082\3\u0082\3\u0082\5\u0082\u0592"+
+ "\n\u0082\3\u0082\3\u0082\7\u0082\u0596\n\u0082\f\u0082\16\u0082\u0599"+
+ "\13\u0082\3\u0082\3\u0082\3\u0083\3\u0083\5\u0083\u059f\n\u0083\3\u0083"+
+ "\3\u0083\3\u0083\3\u0083\3\u0083\3\u0083\3\u0084\3\u0084\3\u0084\5\u0084"+
+ "\u05aa\n\u0084\3\u0085\3\u0085\3\u0085\5\u0085\u05af\n\u0085\3\u0086\3"+
+ "\u0086\5\u0086\u05b3\n\u0086\3\u0086\3\u0086\3\u0086\5\u0086\u05b8\n\u0086"+
+ "\7\u0086\u05ba\n\u0086\f\u0086\16\u0086\u05bd\13\u0086\3\u0087\3\u0087"+
+ "\3\u0087\7\u0087\u05c2\n\u0087\f\u0087\16\u0087\u05c5\13\u0087\3\u0087"+
+ "\3\u0087\3\u0088\3\u0088\3\u0088\5\u0088\u05cc\n\u0088\3\u0089\3\u0089"+
+ "\3\u0089\5\u0089\u05d1\n\u0089\3\u0089\5\u0089\u05d4\n\u0089\3\u008a\3"+
+ "\u008a\3\u008a\3\u008a\3\u008a\3\u008a\5\u008a\u05dc\n\u008a\3\u008a\3"+
+ "\u008a\3\u008b\3\u008b\3\u008b\3\u008b\5\u008b\u05e4\n\u008b\3\u008b\3"+
+ "\u008b\3\u008c\5\u008c\u05e9\n\u008c\3\u008c\3\u008c\5\u008c\u05ed\n\u008c"+
+ "\3\u008c\3\u008c\5\u008c\u05f1\n\u008c\3\u008d\3\u008d\3\u008d\3\u008e"+
+ "\3\u008e\5\u008e\u05f8\n\u008e\3\u008f\3\u008f\3\u008f\3\u008f\3\u008f"+
+ "\3\u0090\3\u0090\3\u0091\3\u0091\3\u0092\3\u0092\3\u0092\3\u0093\3\u0093"+
+ "\3\u0093\3\u0093\3\u0094\3\u0094\3\u0094\3\u0094\3\u0094\3\u0094\3\u0095"+
+ "\3\u0095\3\u0095\3\u0095\3\u0095\5\u0095\u0615\n\u0095\3\u0095\3\u0095"+
+ "\3\u0096\3\u0096\3\u0096\3\u0097\3\u0097\3\u0097\3\u0097\5\u0097\u0620"+
+ "\n\u0097\3\u0098\3\u0098\5\u0098\u0624\n\u0098\3\u0099\3\u0099\3\u0099"+
+ "\3\u0099\7\u0099\u062a\n\u0099\f\u0099\16\u0099\u062d\13\u0099\3\u0099"+
+ "\5\u0099\u0630\n\u0099\5\u0099\u0632\n\u0099\3\u0099\3\u0099\3\u009a\3"+
+ "\u009a\3\u009a\3\u009a\5\u009a\u063a\n\u009a\3\u009a\3\u009a\3\u009b\3"+
+ "\u009b\3\u009b\3\u009b\3\u009b\5\u009b\u0643\n\u009b\3\u009c\3\u009c\3"+
+ "\u009c\3\u009c\3\u009c\3\u009c\5\u009c\u064b\n\u009c\3\u009d\3\u009d\3"+
+ "\u009d\5\u009d\u0650\n\u009d\3\u009e\3\u009e\3\u009f\3\u009f\3\u00a0\3"+
+ "\u00a0\3\u00a0\3\u00a0\3\u00a1\3\u00a1\3\u00a1\3\u00a2\3\u00a2\3\u00a2"+
+ "\5\u00a2\u0660\n\u00a2\5\u00a2\u0662\n\u00a2\3\u00a2\3\u00a2\3\u00a3\3"+
+ "\u00a3\3\u00a3\7\u00a3\u0669\n\u00a3\f\u00a3\16\u00a3\u066c\13\u00a3\3"+
+ "\u00a4\3\u00a4\3\u00a4\5\u00a4\u0671\n\u00a4\3\u00a4\3\u00a4\3\u00a5\3"+
+ "\u00a5\5\u00a5\u0677\n\u00a5\3\u00a6\3\u00a6\5\u00a6\u067b\n\u00a6\3\u00a7"+
+ "\3\u00a7\3\u00a7\3\u00a7\3\u00a7\7\u00a7\u0682\n\u00a7\f\u00a7\16\u00a7"+
+ "\u0685\13\u00a7\3\u00a7\3\u00a7\3\u00a8\3\u00a8\3\u00a8\3\u00a8\5\u00a8"+
+ "\u068d\n\u00a8\3\u00a8\5\u00a8\u0690\n\u00a8\3\u00a9\3\u00a9\3\u00aa\5"+
+ "\u00aa\u0695\n\u00aa\3\u00aa\3\u00aa\3\u00ab\3\u00ab\3\u00ab\3\u00ab\3"+
+ "\u00ac\3\u00ac\3\u00ac\3\u00ac\3\u00ac\3\u00ad\3\u00ad\3\u00ad\3\u00ad"+
+ "\3\u00ad\5\u00ad\u06a7\n\u00ad\5\u00ad\u06a9\n\u00ad\3\u00ad\5\u00ad\u06ac"+
+ "\n\u00ad\3\u00ad\5\u00ad\u06af\n\u00ad\5\u00ad\u06b1\n\u00ad\3\u00ad\3"+
+ "\u00ad\3\u00ae\3\u00ae\3\u00ae\3\u00ae\3\u00af\3\u00af\3\u00b0\3\u00b0"+
+ "\3\u00b0\3\u00b0\5\u00b0\u06bf\n\u00b0\3\u00b0\3\u02a1\4\u0092\u00a2\u00b1"+
+ "\2\4\6\b\n\f\16\20\22\24\26\30\32\34\36 \"$&(*,.\60\62\64\668:<>@BDFH"+
+ "JLNPRTVXZ\\^`bdfhjlnprtvxz|~\u0080\u0082\u0084\u0086\u0088\u008a\u008c"+
+ "\u008e\u0090\u0092\u0094\u0096\u0098\u009a\u009c\u009e\u00a0\u00a2\u00a4"+
+ "\u00a6\u00a8\u00aa\u00ac\u00ae\u00b0\u00b2\u00b4\u00b6\u00b8\u00ba\u00bc"+
+ "\u00be\u00c0\u00c2\u00c4\u00c6\u00c8\u00ca\u00cc\u00ce\u00d0\u00d2\u00d4"+
+ "\u00d6\u00d8\u00da\u00dc\u00de\u00e0\u00e2\u00e4\u00e6\u00e8\u00ea\u00ec"+
+ "\u00ee\u00f0\u00f2\u00f4\u00f6\u00f8\u00fa\u00fc\u00fe\u0100\u0102\u0104"+
+ "\u0106\u0108\u010a\u010c\u010e\u0110\u0112\u0114\u0116\u0118\u011a\u011c"+
+ "\u011e\u0120\u0122\u0124\u0126\u0128\u012a\u012c\u012e\u0130\u0132\u0134"+
+ "\u0136\u0138\u013a\u013c\u013e\u0140\u0142\u0144\u0146\u0148\u014a\u014c"+
+ "\u014e\u0150\u0152\u0154\u0156\u0158\u015a\u015c\u015e\2\25\4\2ddoo\3"+
+ "\2\31\32\3\2\7\n\3\2@A\3\2)+\4\2)+--\3\2\u0082\u0088\3\2\26\27\4\2}\u0081"+
+ "\u0086\u0087\6\2$$pp||\u0083\u0085\3\2 \"\3\2\35\37\4\2GHv{\6\2..\61\61"+
+ "\64\64\\\\\4\2|\u0081\u0083\u0087\3\2pq\4\2mm\u009e\u009e\4\2\u0089\u008c"+
+ "\u008e\u008f\3\2\u0095\u0096\2\u071f\2\u0160\3\2\2\2\4\u0163\3\2\2\2\6"+
+ "\u0166\3\2\2\2\b\u0169\3\2\2\2\n\u0171\3\2\2\2\f\u017a\3\2\2\2\16\u0195"+
+ "\3\2\2\2\20\u0198\3\2\2\2\22\u01a0\3\2\2\2\24\u01ad\3\2\2\2\26\u01c3\3"+
+ "\2\2\2\30\u01cb\3\2\2\2\32\u01cd\3\2\2\2\34\u01cf\3\2\2\2\36\u01d2\3\2"+
+ "\2\2 \u01e5\3\2\2\2\"\u01e7\3\2\2\2$\u01e9\3\2\2\2&\u01ee\3\2\2\2(\u01f9"+
+ "\3\2\2\2*\u0206\3\2\2\2,\u0209\3\2\2\2.\u0214\3\2\2\2\60\u0216\3\2\2\2"+
+ "\62\u021b\3\2\2\2\64\u0220\3\2\2\2\66\u0225\3\2\2\28\u022a\3\2\2\2:\u0237"+
+ "\3\2\2\2<\u0239\3\2\2\2>\u023b\3\2\2\2@\u0240\3\2\2\2B\u0245\3\2\2\2D"+
+ "\u024a\3\2\2\2F\u0253\3\2\2\2H\u025a\3\2\2\2J\u0265\3\2\2\2L\u026c\3\2"+
+ "\2\2N\u026e\3\2\2\2P\u0283\3\2\2\2R\u0285\3\2\2\2T\u0295\3\2\2\2V\u02a1"+
+ "\3\2\2\2X\u02b0\3\2\2\2Z\u02b3\3\2\2\2\\\u02bb\3\2\2\2^\u02bd\3\2\2\2"+
+ "`\u02cb\3\2\2\2b\u02d7\3\2\2\2d\u02e1\3\2\2\2f\u02e5\3\2\2\2h\u02eb\3"+
+ "\2\2\2j\u0303\3\2\2\2l\u030b\3\2\2\2n\u031a\3\2\2\2p\u031c\3\2\2\2r\u0323"+
+ "\3\2\2\2t\u032c\3\2\2\2v\u0331\3\2\2\2x\u0336\3\2\2\2z\u033c\3\2\2\2|"+
+ "\u0343\3\2\2\2~\u0348\3\2\2\2\u0080\u034e\3\2\2\2\u0082\u0353\3\2\2\2"+
+ "\u0084\u035a\3\2\2\2\u0086\u0364\3\2\2\2\u0088\u0368\3\2\2\2\u008a\u0374"+
+ "\3\2\2\2\u008c\u0377\3\2\2\2\u008e\u037b\3\2\2\2\u0090\u0382\3\2\2\2\u0092"+
+ "\u0396\3\2\2\2\u0094\u03d2\3\2\2\2\u0096\u03d4\3\2\2\2\u0098\u03d7\3\2"+
+ "\2\2\u009a\u03dc\3\2\2\2\u009c\u03e5\3\2\2\2\u009e\u03f3\3\2\2\2\u00a0"+
+ "\u03fd\3\2\2\2\u00a2\u040b\3\2\2\2\u00a4\u0426\3\2\2\2\u00a6\u0429\3\2"+
+ "\2\2\u00a8\u0431\3\2\2\2\u00aa\u043a\3\2\2\2\u00ac\u044a\3\2\2\2\u00ae"+
+ "\u045d\3\2\2\2\u00b0\u0466\3\2\2\2\u00b2\u0471\3\2\2\2\u00b4\u0473\3\2"+
+ "\2\2\u00b6\u0476\3\2\2\2\u00b8\u048d\3\2\2\2\u00ba\u048f\3\2\2\2\u00bc"+
+ "\u0494\3\2\2\2\u00be\u04a8\3\2\2\2\u00c0\u04aa\3\2\2\2\u00c2\u04ac\3\2"+
+ "\2\2\u00c4\u04af\3\2\2\2\u00c6\u04b9\3\2\2\2\u00c8\u04c3\3\2\2\2\u00ca"+
+ "\u04c6\3\2\2\2\u00cc\u04cb\3\2\2\2\u00ce\u04cd\3\2\2\2\u00d0\u04db\3\2"+
+ "\2\2\u00d2\u04e3\3\2\2\2\u00d4\u04eb\3\2\2\2\u00d6\u04f3\3\2\2\2\u00d8"+
+ "\u0501\3\2\2\2\u00da\u0507\3\2\2\2\u00dc\u0515\3\2\2\2\u00de\u0521\3\2"+
+ "\2\2\u00e0\u052a\3\2\2\2\u00e2\u052c\3\2\2\2\u00e4\u052e\3\2\2\2\u00e6"+
+ "\u0532\3\2\2\2\u00e8\u0535\3\2\2\2\u00ea\u0539\3\2\2\2\u00ec\u053b\3\2"+
+ "\2\2\u00ee\u0540\3\2\2\2\u00f0\u0544\3\2\2\2\u00f2\u0548\3\2\2\2\u00f4"+
+ "\u054c\3\2\2\2\u00f6\u054f\3\2\2\2\u00f8\u0551\3\2\2\2\u00fa\u0566\3\2"+
+ "\2\2\u00fc\u0568\3\2\2\2\u00fe\u057e\3\2\2\2\u0100\u0586\3\2\2\2\u0102"+
+ "\u0588\3\2\2\2\u0104\u059e\3\2\2\2\u0106\u05a6\3\2\2\2\u0108\u05ae\3\2"+
+ "\2\2\u010a\u05b2\3\2\2\2\u010c\u05be\3\2\2\2\u010e\u05c8\3\2\2\2\u0110"+
+ "\u05d3\3\2\2\2\u0112\u05db\3\2\2\2\u0114\u05df\3\2\2\2\u0116\u05e8\3\2"+
+ "\2\2\u0118\u05f2\3\2\2\2\u011a\u05f7\3\2\2\2\u011c\u05f9\3\2\2\2\u011e"+
+ "\u05fe\3\2\2\2\u0120\u0600\3\2\2\2\u0122\u0602\3\2\2\2\u0124\u0605\3\2"+
+ "\2\2\u0126\u0609\3\2\2\2\u0128\u0614\3\2\2\2\u012a\u0618\3\2\2\2\u012c"+
+ "\u061f\3\2\2\2\u012e\u0623\3\2\2\2\u0130\u0625\3\2\2\2\u0132\u0635\3\2"+
+ "\2\2\u0134\u0642\3\2\2\2\u0136\u064a\3\2\2\2\u0138\u064f\3\2\2\2\u013a"+
+ "\u0651\3\2\2\2\u013c\u0653\3\2\2\2\u013e\u0655\3\2\2\2\u0140\u0659\3\2"+
+ "\2\2\u0142\u065c\3\2\2\2\u0144\u0665\3\2\2\2\u0146\u0670\3\2\2\2\u0148"+
+ "\u0676\3\2\2\2\u014a\u067a\3\2\2\2\u014c\u067c\3\2\2\2\u014e\u068c\3\2"+
+ "\2\2\u0150\u0691\3\2\2\2\u0152\u0694\3\2\2\2\u0154\u0698\3\2\2\2\u0156"+
+ "\u069c\3\2\2\2\u0158\u06a1\3\2\2\2\u015a\u06b4\3\2\2\2\u015c\u06b8\3\2"+
+ "\2\2\u015e\u06be\3\2\2\2\u0160\u0161\5\u0092J\2\u0161\u0162\7\2\2\3\u0162"+
+ "\3\3\2\2\2\u0163\u0164\5\u0094K\2\u0164\u0165\7\2\2\3\u0165\5\3\2\2\2"+
+ "\u0166\u0167\5\u00b0Y\2\u0167\u0168\7\2\2\3\u0168\7\3\2\2\2\u0169\u016e"+
+ "\5\n\6\2\u016a\u016b\7l\2\2\u016b\u016d\5\n\6\2\u016c\u016a\3\2\2\2\u016d"+
+ "\u0170\3\2\2\2\u016e\u016c\3\2\2\2\u016e\u016f\3\2\2\2\u016f\t\3\2\2\2"+
+ "\u0170\u016e\3\2\2\2\u0171\u0173\7d\2\2\u0172\u0174\7;\2\2\u0173\u0172"+
+ "\3\2\2\2\u0173\u0174\3\2\2\2\u0174\13\3\2\2\2\u0175\u0176\5\16\b\2\u0176"+
+ "\u0177\5\u015e\u00b0\2\u0177\u0179\3\2\2\2\u0178\u0175\3\2\2\2\u0179\u017c"+
+ "\3\2\2\2\u017a\u0178\3\2\2\2\u017a\u017b\3\2\2\2\u017b\u017d\3\2\2\2\u017c"+
+ "\u017a\3\2\2\2\u017d\u017e\5\u00c8e\2\u017e\u0184\5\u015e\u00b0\2\u017f"+
+ "\u0180\5\24\13\2\u0180\u0181\5\u015e\u00b0\2\u0181\u0183\3\2\2\2\u0182"+
+ "\u017f\3\2\2\2\u0183\u0186\3\2\2\2\u0184\u0182\3\2\2\2\u0184\u0185\3\2"+
+ "\2\2\u0185\u0190\3\2\2\2\u0186\u0184\3\2\2\2\u0187\u018b\5v<\2\u0188\u018b"+
+ "\5\u00ccg\2\u0189\u018b\5\26\f\2\u018a\u0187\3\2\2\2\u018a\u0188\3\2\2"+
+ "\2\u018a\u0189\3\2\2\2\u018b\u018c\3\2\2\2\u018c\u018d\5\u015e\u00b0\2"+
+ "\u018d\u018f\3\2\2\2\u018e\u018a\3\2\2\2\u018f\u0192\3\2\2\2\u0190\u018e"+
+ "\3\2\2\2\u0190\u0191\3\2\2\2\u0191\u0193\3\2\2\2\u0192\u0190\3\2\2\2\u0193"+
+ "\u0194\7\2\2\3\u0194\r\3\2\2\2\u0195\u0196\7D\2\2\u0196\u0197\5\u0092"+
+ "J\2\u0197\17\3\2\2\2\u0198\u0199\7E\2\2\u0199\u019a\5\u0092J\2\u019a\21"+
+ "\3\2\2\2\u019b\u019c\5\20\t\2\u019c\u019d\5\u015e\u00b0\2\u019d\u019f"+
+ "\3\2\2\2\u019e\u019b\3\2\2\2\u019f\u01a2\3\2\2\2\u01a0\u019e\3\2\2\2\u01a0"+
+ "\u01a1\3\2\2\2\u01a1\u01a4\3\2\2\2\u01a2\u01a0\3\2\2\2\u01a3\u01a5\t\2"+
+ "\2\2\u01a4\u01a3\3\2\2\2\u01a4\u01a5\3\2\2\2\u01a5\u01a6\3\2\2\2\u01a6"+
+ "\u01a7\5\u00caf\2\u01a7\23\3\2\2\2\u01a8\u01a9\5\20\t\2\u01a9\u01aa\5"+
+ "\u015e\u00b0\2\u01aa\u01ac\3\2\2\2\u01ab\u01a8\3\2\2\2\u01ac\u01af\3\2"+
+ "\2\2\u01ad\u01ab\3\2\2\2\u01ad\u01ae\3\2\2\2\u01ae\u01bd\3\2\2\2\u01af"+
+ "\u01ad\3\2\2\2\u01b0\u01b1\7`\2\2\u01b1\u01be\5\22\n\2\u01b2\u01b3\7`"+
+ "\2\2\u01b3\u01b9\7e\2\2\u01b4\u01b5\5\22\n\2\u01b5\u01b6\5\u015e\u00b0"+
+ "\2\u01b6\u01b8\3\2\2\2\u01b7\u01b4\3\2\2\2\u01b8\u01bb\3\2\2\2\u01b9\u01b7"+
+ "\3\2\2\2\u01b9\u01ba\3\2\2\2\u01ba\u01bc\3\2\2\2\u01bb\u01b9\3\2\2\2\u01bc"+
+ "\u01be\7f\2\2\u01bd\u01b0\3\2\2\2\u01bd\u01b2\3\2\2\2\u01be\25\3\2\2\2"+
+ "\u01bf\u01c4\5h\65\2\u01c0\u01c4\5~@\2\u01c1\u01c4\5\u0082B\2\u01c2\u01c4"+
+ "\5|?\2\u01c3\u01bf\3\2\2\2\u01c3\u01c0\3\2\2\2\u01c3\u01c1\3\2\2\2\u01c3"+
+ "\u01c2\3\2\2\2\u01c4\27\3\2\2\2\u01c5\u01c6\7\34\2\2\u01c6\u01cc\5\u0094"+
+ "K\2\u01c7\u01c8\t\3\2\2\u01c8\u01cc\5.\30\2\u01c9\u01ca\t\4\2\2\u01ca"+
+ "\u01cc\5\u0092J\2\u01cb\u01c5\3\2\2\2\u01cb\u01c7\3\2\2\2\u01cb\u01c9"+
+ "\3\2\2\2\u01cc\31\3\2\2\2\u01cd\u01ce\5\34\17\2\u01ce\33\3\2\2\2\u01cf"+
+ "\u01d0\5V,\2\u01d0\u01d1\5\36\20\2\u01d1\35\3\2\2\2\u01d2\u01d3\7C\2\2"+
+ "\u01d3\u01d5\7e\2\2\u01d4\u01d6\5\u00dep\2\u01d5\u01d4\3\2\2\2\u01d5\u01d6"+
+ "\3\2\2\2\u01d6\u01d7\3\2\2\2\u01d7\u01d8\7f\2\2\u01d8\37\3\2\2\2\u01d9"+
+ "\u01e6\5F$\2\u01da\u01e6\5D#\2\u01db\u01e6\5B\"\2\u01dc\u01e6\5$\23\2"+
+ "\u01dd\u01e6\5@!\2\u01de\u01e6\58\35\2\u01df\u01e6\5> \2\u01e0\u01e6\5"+
+ "\66\34\2\u01e1\u01e6\5\62\32\2\u01e2\u01e6\5\60\31\2\u01e3\u01e6\5\64"+
+ "\33\2\u01e4\u01e6\5\"\22\2\u01e5\u01d9\3\2\2\2\u01e5\u01da\3\2\2\2\u01e5"+
+ "\u01db\3\2\2\2\u01e5\u01dc\3\2\2\2\u01e5\u01dd\3\2\2\2\u01e5\u01de\3\2"+
+ "\2\2\u01e5\u01df\3\2\2\2\u01e5\u01e0\3\2\2\2\u01e5\u01e1\3\2\2\2\u01e5"+
+ "\u01e2\3\2\2\2\u01e5\u01e3\3\2\2\2\u01e5\u01e4\3\2\2\2\u01e6!\3\2\2\2"+
+ "\u01e7\u01e8\t\5\2\2\u01e8#\3\2\2\2\u01e9\u01ea\7]\2\2\u01ea\u01eb\7i"+
+ "\2\2\u01eb\u01ec\5\u00b0Y\2\u01ec\u01ed\7j\2\2\u01ed%\3\2\2\2\u01ee\u01f3"+
+ "\5(\25\2\u01ef\u01f0\7l\2\2\u01f0\u01f2\5(\25\2\u01f1\u01ef\3\2\2\2\u01f2"+
+ "\u01f5\3\2\2\2\u01f3\u01f1\3\2\2\2\u01f3\u01f4\3\2\2\2\u01f4\u01f7\3\2"+
+ "\2\2\u01f5\u01f3\3\2\2\2\u01f6\u01f8\7l\2\2\u01f7\u01f6\3\2\2\2\u01f7"+
+ "\u01f8\3\2\2\2\u01f8\'\3\2\2\2\u01f9\u01fe\7d\2\2\u01fa\u01fb\7l\2\2\u01fb"+
+ "\u01fd\7d\2\2\u01fc\u01fa\3\2\2\2\u01fd\u0200\3\2\2\2\u01fe\u01fc\3\2"+
+ "\2\2\u01fe\u01ff\3\2\2\2\u01ff\u0201\3\2\2\2\u0200\u01fe\3\2\2\2\u0201"+
+ "\u0202\5\u0120\u0091\2\u0202)\3\2\2\2\u0203\u0205\5,\27\2\u0204\u0203"+
+ "\3\2\2\2\u0205\u0208\3\2\2\2\u0206\u0204\3\2\2\2\u0206\u0207\3\2\2\2\u0207"+
+ "+\3\2\2\2\u0208\u0206\3\2\2\2\u0209\u020a\7g\2\2\u020a\u020f\5\u0092J"+
+ "\2\u020b\u020c\7l\2\2\u020c\u020e\5\u0092J\2\u020d\u020b\3\2\2\2\u020e"+
+ "\u0211\3\2\2\2\u020f\u020d\3\2\2\2\u020f\u0210\3\2\2\2\u0210\u0212\3\2"+
+ "\2\2\u0211\u020f\3\2\2\2\u0212\u0213\7h\2\2\u0213-\3\2\2\2\u0214\u0215"+
+ "\5\u00a2R\2\u0215/\3\2\2\2\u0216\u0217\7\62\2\2\u0217\u0218\7e\2\2\u0218"+
+ "\u0219\5\u0092J\2\u0219\u021a\7f\2\2\u021a\61\3\2\2\2\u021b\u021c\7\66"+
+ "\2\2\u021c\u021d\7i\2\2\u021d\u021e\5\u00b0Y\2\u021e\u021f\7j\2\2\u021f"+
+ "\63\3\2\2\2\u0220\u0221\7\63\2\2\u0221\u0222\7e\2\2\u0222\u0223\5\u0092"+
+ "J\2\u0223\u0224\7f\2\2\u0224\65\3\2\2\2\u0225\u0226\t\6\2\2\u0226\u0227"+
+ "\7e\2\2\u0227\u0228\5\u0092J\2\u0228\u0229\7f\2\2\u0229\67\3\2\2\2\u022a"+
+ "\u022f\7\23\2\2\u022b\u022c\7i\2\2\u022c\u022d\5:\36\2\u022d\u022e\7j"+
+ "\2\2\u022e\u0230\3\2\2\2\u022f\u022b\3\2\2\2\u022f\u0230\3\2\2\2\u0230"+
+ "\u0231\3\2\2\2\u0231\u0232\7e\2\2\u0232\u0233\5\u0092J\2\u0233\u0234\7"+
+ "f\2\2\u02349\3\2\2\2\u0235\u0238\5<\37\2\u0236\u0238\7\25\2\2\u0237\u0235"+
+ "\3\2\2\2\u0237\u0236\3\2\2\2\u0238;\3\2\2\2\u0239\u023a\7d\2\2\u023a="+
+ "\3\2\2\2\u023b\u023c\7\24\2\2\u023c\u023d\7e\2\2\u023d\u023e\5\u0092J"+
+ "\2\u023e\u023f\7f\2\2\u023f?\3\2\2\2\u0240\u0241\79\2\2\u0241\u0242\7"+
+ "e\2\2\u0242\u0243\5\u0092J\2\u0243\u0244\7f\2\2\u0244A\3\2\2\2\u0245\u0246"+
+ "\78\2\2\u0246\u0247\7e\2\2\u0247\u0248\5\u0092J\2\u0248\u0249\7f\2\2\u0249"+
+ "C\3\2\2\2\u024a\u024b\7\30\2\2\u024b\u024c\7e\2\2\u024c\u024f\5\u0092"+
+ "J\2\u024d\u024e\7l\2\2\u024e\u0250\5\u0092J\2\u024f\u024d\3\2\2\2\u024f"+
+ "\u0250\3\2\2\2\u0250\u0251\3\2\2\2\u0251\u0252\7f\2\2\u0252E\3\2\2\2\u0253"+
+ "\u0254\t\6\2\2\u0254\u0255\7i\2\2\u0255\u0256\5\u0092J\2\u0256\u0257\7"+
+ "<\2\2\u0257\u0258\5\u0092J\2\u0258\u0259\7j\2\2\u0259G\3\2\2\2\u025a\u025b"+
+ "\7i\2\2\u025b\u0260\5J&\2\u025c\u025d\7l\2\2\u025d\u025f\5J&\2\u025e\u025c"+
+ "\3\2\2\2\u025f\u0262\3\2\2\2\u0260\u025e\3\2\2\2\u0260\u0261\3\2\2\2\u0261"+
+ "\u0263\3\2\2\2\u0262\u0260\3\2\2\2\u0263\u0264\7j\2\2\u0264I\3\2\2\2\u0265"+
+ "\u0266\5\u0092J\2\u0266\u0267\7k\2\2\u0267\u0268\5\u0092J\2\u0268K\3\2"+
+ "\2\2\u0269\u026d\5T+\2\u026a\u026d\5R*\2\u026b\u026d\5N(\2\u026c\u0269"+
+ "\3\2\2\2\u026c\u026a\3\2\2\2\u026c\u026b\3\2\2\2\u026dM\3\2\2\2\u026e"+
+ "\u026f\7\64\2\2\u026f\u0275\7g\2\2\u0270\u0271\5P)\2\u0271\u0272\5\u015e"+
+ "\u00b0\2\u0272\u0274\3\2\2\2\u0273\u0270\3\2\2\2\u0274\u0277\3\2\2\2\u0275"+
+ "\u0273\3\2\2\2\u0275\u0276\3\2\2\2\u0276\u0278\3\2\2\2\u0277\u0275\3\2"+
+ "\2\2\u0278\u0279\7h\2\2\u0279O\3\2\2\2\u027a\u027b\7L\2\2\u027b\u027c"+
+ "\7d\2\2\u027c\u0284\5\u012c\u0097\2\u027d\u027e\7\65\2\2\u027e\u027f\7"+
+ "g\2\2\u027f\u0280\5\u0092J\2\u0280\u0281\5\u015e\u00b0\2\u0281\u0282\7"+
+ "h\2\2\u0282\u0284\3\2\2\2\u0283\u027a\3\2\2\2\u0283\u027d\3\2\2\2\u0284"+
+ "Q\3\2\2\2\u0285\u0286\7\34\2\2\u0286\u0287\7i\2\2\u0287\u0288\7j\2\2\u0288"+
+ "\u0289\5\u0120\u0091\2\u0289S\3\2\2\2\u028a\u028b\t\7\2\2\u028b\u028c"+
+ "\7i\2\2\u028c\u028d\5\u00b0Y\2\u028d\u028e\7j\2\2\u028e\u0296\3\2\2\2"+
+ "\u028f\u0290\7,\2\2\u0290\u0291\7i\2\2\u0291\u0292\5\u00b0Y\2\u0292\u0293"+
+ "\7j\2\2\u0293\u0294\5\u00b0Y\2\u0294\u0296\3\2\2\2\u0295\u028a\3\2\2\2"+
+ "\u0295\u028f\3\2\2\2\u0296U\3\2\2\2\u0297\u029d\5X-\2\u0298\u0299\7\20"+
+ "\2\2\u0299\u029d\b,\1\2\u029a\u029b\7B\2\2\u029b\u029d\b,\1\2\u029c\u0297"+
+ "\3\2\2\2\u029c\u0298\3\2\2\2\u029c\u029a\3\2\2\2\u029d\u029e\3\2\2\2\u029e"+
+ "\u02a0\5\u015e\u00b0\2\u029f\u029c\3\2\2\2\u02a0\u02a3\3\2\2\2\u02a1\u02a2"+
+ "\3\2\2\2\u02a1\u029f\3\2\2\2\u02a2\u02a6\3\2\2\2\u02a3\u02a1\3\2\2\2\u02a4"+
+ "\u02a5\7\20\2\2\u02a5\u02a7\b,\1\2\u02a6\u02a4\3\2\2\2\u02a6\u02a7\3\2"+
+ "\2\2\u02a7W\3\2\2\2\u02a8\u02a9\7\13\2\2\u02a9\u02b1\5\\/\2\u02aa\u02ab"+
+ "\7\f\2\2\u02ab\u02b1\5\\/\2\u02ac\u02ad\7\r\2\2\u02ad\u02b1\5\\/\2\u02ae"+
+ "\u02af\7\17\2\2\u02af\u02b1\5Z.\2\u02b0\u02a8\3\2\2\2\u02b0\u02aa\3\2"+
+ "\2\2\u02b0\u02ac\3\2\2\2\u02b0\u02ae\3\2\2\2\u02b1Y\3\2\2\2\u02b2\u02b4"+
+ "\5\u00d4k\2\u02b3\u02b2\3\2\2\2\u02b3\u02b4\3\2\2\2\u02b4\u02b7\3\2\2"+
+ "\2\u02b5\u02b6\7[\2\2\u02b6\u02b8\5\u0092J\2\u02b7\u02b5\3\2\2\2\u02b7"+
+ "\u02b8\3\2\2\2\u02b8[\3\2\2\2\u02b9\u02bc\3\2\2\2\u02ba\u02bc\5\u0092"+
+ "J\2\u02bb\u02b9\3\2\2\2\u02bb\u02ba\3\2\2\2\u02bc]\3\2\2\2\u02bd\u02c2"+
+ "\7g\2\2\u02be\u02bf\7:\2\2\u02bf\u02c0\5\u00d2j\2\u02c0\u02c1\5\u015e"+
+ "\u00b0\2\u02c1\u02c3\3\2\2\2\u02c2\u02be\3\2\2\2\u02c2\u02c3\3\2\2\2\u02c3"+
+ "\u02c5\3\2\2\2\u02c4\u02c6\5\u00dep\2\u02c5\u02c4\3\2\2\2\u02c5\u02c6"+
+ "\3\2\2\2\u02c6\u02c7\3\2\2\2\u02c7\u02c8\7h\2\2\u02c8_\3\2\2\2\u02c9\u02cc"+
+ "\5\u013e\u00a0\2\u02ca\u02cc\7d\2\2\u02cb\u02c9\3\2\2\2\u02cb\u02ca\3"+
+ "\2\2\2\u02cc\u02d5\3\2\2\2\u02cd\u02d2\7g\2\2\u02ce\u02d0\5b\62\2\u02cf"+
+ "\u02d1\7l\2\2\u02d0\u02cf\3\2\2\2\u02d0\u02d1\3\2\2\2\u02d1\u02d3\3\2"+
+ "\2\2\u02d2\u02ce\3\2\2\2\u02d2\u02d3\3\2\2\2\u02d3\u02d4\3\2\2\2\u02d4"+
+ "\u02d6\7h\2\2\u02d5\u02cd\3\2\2\2\u02d5\u02d6\3\2\2\2\u02d6a\3\2\2\2\u02d7"+
+ "\u02dc\5d\63\2\u02d8\u02d9\7l\2\2\u02d9\u02db\5d\63\2\u02da\u02d8\3\2"+
+ "\2\2\u02db\u02de\3\2\2\2\u02dc\u02da\3\2\2\2\u02dc\u02dd\3\2\2\2\u02dd"+
+ "c\3\2\2\2\u02de\u02dc\3\2\2\2\u02df\u02e0\7d\2\2\u02e0\u02e2\7n\2\2\u02e1"+
+ "\u02df\3\2\2\2\u02e1\u02e2\3\2\2\2\u02e2\u02e3\3\2\2\2\u02e3\u02e4\5\u0092"+
+ "J\2\u02e4e\3\2\2\2\u02e5\u02e6\7F\2\2\u02e6\u02e7\5\u0092J\2\u02e7\u02e8"+
+ "\7\21\2\2\u02e8\u02e9\5`\61\2\u02e9\u02ea\5\u00dco\2\u02eag\3\2\2\2\u02eb"+
+ "\u02ec\5\u00b0Y\2\u02ec\u02ed\7\21\2\2\u02ed\u0300\5\u00b0Y\2\u02ee\u02f4"+
+ "\7g\2\2\u02ef\u02f0\5p9\2\u02f0\u02f1\5\u015e\u00b0\2\u02f1\u02f3\3\2"+
+ "\2\2\u02f2\u02ef\3\2\2\2\u02f3\u02f6\3\2\2\2\u02f4\u02f2\3\2\2\2\u02f4"+
+ "\u02f5\3\2\2\2\u02f5\u02fc\3\2\2\2\u02f6\u02f4\3\2\2\2\u02f7\u02f8\5j"+
+ "\66\2\u02f8\u02f9\5\u015e\u00b0\2\u02f9\u02fb\3\2\2\2\u02fa\u02f7\3\2"+
+ "\2\2\u02fb\u02fe\3\2\2\2\u02fc\u02fa\3\2\2\2\u02fc\u02fd\3\2\2\2\u02fd"+
+ "\u02ff\3\2\2\2\u02fe\u02fc\3\2\2\2\u02ff\u0301\7h\2\2\u0300\u02ee\3\2"+
+ "\2\2\u0300\u0301\3\2\2\2\u0301i\3\2\2\2\u0302\u0304\7\20\2\2\u0303\u0302"+
+ "\3\2\2\2\u0303\u0304\3\2\2\2\u0304\u0305\3\2\2\2\u0305\u0306\5l\67\2\u0306"+
+ "\u0307\7d\2\2\u0307\u0309\5\u012c\u0097\2\u0308\u030a\5\u00dco\2\u0309"+
+ "\u0308\3\2\2\2\u0309\u030a\3\2\2\2\u030ak\3\2\2\2\u030b\u030d\7e\2\2\u030c"+
+ "\u030e\7d\2\2\u030d\u030c\3\2\2\2\u030d\u030e\3\2\2\2\u030e\u0310\3\2"+
+ "\2\2\u030f\u0311\7\u0086\2\2\u0310\u030f\3\2\2\2\u0310\u0311\3\2\2\2\u0311"+
+ "\u0312\3\2\2\2\u0312\u0313\5\u011a\u008e\2\u0313\u0314\7f\2\2\u0314m\3"+
+ "\2\2\2\u0315\u031b\5\u00a2R\2\u0316\u0317\5\u00b0Y\2\u0317\u0318\7o\2"+
+ "\2\u0318\u0319\7d\2\2\u0319\u031b\3\2\2\2\u031a\u0315\3\2\2\2\u031a\u0316"+
+ "\3\2\2\2\u031bo\3\2\2\2\u031c\u031d\7\67\2\2\u031d\u031e\7d\2\2\u031e"+
+ "\u0321\7r\2\2\u031f\u0322\5n8\2\u0320\u0322\5\u013c\u009f\2\u0321\u031f"+
+ "\3\2\2\2\u0321\u0320\3\2\2\2\u0322q\3\2\2\2\u0323\u0324\7\60\2\2\u0324"+
+ "\u0325\7e\2\2\u0325\u0328\5\u00b0Y\2\u0326\u0327\7l\2\2\u0327\u0329\5"+
+ "\u00d4k\2\u0328\u0326\3\2\2\2\u0328\u0329\3\2\2\2\u0329\u032a\3\2\2\2"+
+ "\u032a\u032b\7f\2\2\u032bs\3\2\2\2\u032c\u032d\7/\2\2\u032d\u032e\7e\2"+
+ "\2\u032e\u032f\5\u00b0Y\2\u032f\u0330\7f\2\2\u0330u\3\2\2\2\u0331\u0334"+
+ "\5V,\2\u0332\u0335\5x=\2\u0333\u0335\5z>\2\u0334\u0332\3\2\2\2\u0334\u0333"+
+ "\3\2\2\2\u0335w\3\2\2\2\u0336\u0337\7L\2\2\u0337\u0338\7d\2\2\u0338\u033a"+
+ "\5\u012c\u0097\2\u0339\u033b\5^\60\2\u033a\u0339\3\2\2\2\u033a\u033b\3"+
+ "\2\2\2\u033by\3\2\2\2\u033c\u033d\7L\2\2\u033d\u033e\5\u0088E\2\u033e"+
+ "\u033f\7d\2\2\u033f\u0341\5\u012c\u0097\2\u0340\u0342\5^\60\2\u0341\u0340"+
+ "\3\2\2\2\u0341\u0342\3\2\2\2\u0342{\3\2\2\2\u0343\u0346\7\34\2\2\u0344"+
+ "\u0347\5v<\2\u0345\u0347\5\u00ccg\2\u0346\u0344\3\2\2\2\u0346\u0345\3"+
+ "\2\2\2\u0347}\3\2\2\2\u0348\u0349\7\67\2\2\u0349\u034a\7d\2\2\u034a\u034c"+
+ "\5\u0130\u0099\2\u034b\u034d\5\u0080A\2\u034c\u034b\3\2\2\2\u034c\u034d"+
+ "\3\2\2\2\u034d\177\3\2\2\2\u034e\u034f\7g\2\2\u034f\u0350\5\u0092J\2\u0350"+
+ "\u0351\5\u015e\u00b0\2\u0351\u0352\7h\2\2\u0352\u0081\3\2\2\2\u0353\u0354"+
+ "\7\67\2\2\u0354\u0355\5\u0088E\2\u0355\u0356\7d\2\2\u0356\u0358\5\u0130"+
+ "\u0099\2\u0357\u0359\5\u0080A\2\u0358\u0357\3\2\2\2\u0358\u0359\3\2\2"+
+ "\2\u0359\u0083\3\2\2\2\u035a\u0362\5\b\5\2\u035b\u035e\5\u00b0Y\2\u035c"+
+ "\u035d\7k\2\2\u035d\u035f\5\u00d4k\2\u035e\u035c\3\2\2\2\u035e\u035f\3"+
+ "\2\2\2\u035f\u0363\3\2\2\2\u0360\u0361\7k\2\2\u0361\u0363\5\u00d4k\2\u0362"+
+ "\u035b\3\2\2\2\u0362\u0360\3\2\2\2\u0363\u0085\3\2\2\2\u0364\u0365\5\b"+
+ "\5\2\u0365\u0366\7r\2\2\u0366\u0367\5\u00d4k\2\u0367\u0087\3\2\2\2\u0368"+
+ "\u036a\7e\2\2\u0369\u036b\5\n\6\2\u036a\u0369\3\2\2\2\u036a\u036b\3\2"+
+ "\2\2\u036b\u036c\3\2\2\2\u036c\u036e\5\u00b0Y\2\u036d\u036f\7l\2\2\u036e"+
+ "\u036d\3\2\2\2\u036e\u036f\3\2\2\2\u036f\u0370\3\2\2\2\u0370\u0371\7f"+
+ "\2\2\u0371\u0089\3\2\2\2\u0372\u0375\5\u008cG\2\u0373\u0375\5\u008eH\2"+
+ "\u0374\u0372\3\2\2\2\u0374\u0373\3\2\2\2\u0375\u008b\3\2\2\2\u0376\u0378"+
+ "\5\u00d2j\2\u0377\u0376\3\2\2\2\u0377\u0378\3\2\2\2\u0378\u0379\3\2\2"+
+ "\2\u0379\u037a\5\u0090I\2\u037a\u008d\3\2\2\2\u037b\u037d\7\34\2\2\u037c"+
+ "\u037e\5\u00d2j\2\u037d\u037c\3\2\2\2\u037d\u037e\3\2\2\2\u037e\u037f"+
+ "\3\2\2\2\u037f\u0380\5\u0090I\2\u0380\u008f\3\2\2\2\u0381\u0383\7s\2\2"+
+ "\u0382\u0381\3\2\2\2\u0382\u0383\3\2\2\2\u0383\u0384\3\2\2\2\u0384\u0385"+
+ "\5\u00b0Y\2\u0385\u0091\3\2\2\2\u0386\u0387\bJ\1\2\u0387\u0388\t\b\2\2"+
+ "\u0388\u0397\5\u0092J\20\u0389\u0397\5\u00a2R\2\u038a\u038b\7\33\2\2\u038b"+
+ "\u038c\5.\30\2\u038c\u038d\7\35\2\2\u038d\u038e\5\u0092J\4\u038e\u0397"+
+ "\3\2\2\2\u038f\u0390\t\t\2\2\u0390\u0391\5&\24\2\u0391\u0392\7n\2\2\u0392"+
+ "\u0393\7n\2\2\u0393\u0394\5*\26\2\u0394\u0395\5\u0092J\3\u0395\u0397\3"+
+ "\2\2\2\u0396\u0386\3\2\2\2\u0396\u0389\3\2\2\2\u0396\u038a\3\2\2\2\u0396"+
+ "\u038f\3\2\2\2\u0397\u03bb\3\2\2\2\u0398\u0399\f\16\2\2\u0399\u039a\t"+
+ "\n\2\2\u039a\u03ba\5\u0092J\17\u039b\u039c\f\r\2\2\u039c\u039d\t\13\2"+
+ "\2\u039d\u03ba\5\u0092J\16\u039e\u039f\f\f\2\2\u039f\u03a0\t\f\2\2\u03a0"+
+ "\u03ba\5\u0092J\r\u03a1\u03a2\f\13\2\2\u03a2\u03a3\t\r\2\2\u03a3\u03ba"+
+ "\5\u0092J\f\u03a4\u03a5\f\n\2\2\u03a5\u03a6\t\16\2\2\u03a6\u03ba\5\u0092"+
+ "J\13\u03a7\u03a8\f\b\2\2\u03a8\u03a9\7u\2\2\u03a9\u03ba\5\u0092J\t\u03aa"+
+ "\u03ab\f\7\2\2\u03ab\u03ac\7t\2\2\u03ac\u03ba\5\u0092J\b\u03ad\u03ae\f"+
+ "\6\2\2\u03ae\u03af\7#\2\2\u03af\u03ba\5\u0092J\6\u03b0\u03b1\f\5\2\2\u03b1"+
+ "\u03b2\7&\2\2\u03b2\u03b3\5\u0092J\2\u03b3\u03b4\7n\2\2\u03b4\u03b5\5"+
+ "\u0092J\5\u03b5\u03ba\3\2\2\2\u03b6\u03b7\f\t\2\2\u03b7\u03b8\7\21\2\2"+
+ "\u03b8\u03ba\5`\61\2\u03b9\u0398\3\2\2\2\u03b9\u039b\3\2\2\2\u03b9\u039e"+
+ "\3\2\2\2\u03b9\u03a1\3\2\2\2\u03b9\u03a4\3\2\2\2\u03b9\u03a7\3\2\2\2\u03b9"+
+ "\u03aa\3\2\2\2\u03b9\u03ad\3\2\2\2\u03b9\u03b0\3\2\2\2\u03b9\u03b6\3\2"+
+ "\2\2\u03ba\u03bd\3\2\2\2\u03bb\u03b9\3\2\2\2\u03bb\u03bc\3\2\2\2\u03bc"+
+ "\u0093\3\2\2\2\u03bd\u03bb\3\2\2\2\u03be\u03d3\5\30\r\2\u03bf\u03d3\5"+
+ "\32\16\2\u03c0\u03d3\5\u0098M\2\u03c1\u03d3\5\u0096L\2\u03c2\u03d3\5\u00cc"+
+ "g\2\u03c3\u03d3\5\u00ecw\2\u03c4\u03d3\5\u00e0q\2\u03c5\u03d3\5\u0118"+
+ "\u008d\2\u03c6\u03d3\5\u00eex\2\u03c7\u03d3\5\u00f0y\2\u03c8\u03d3\5\u00f2"+
+ "z\2\u03c9\u03d3\5\u00f4{\2\u03ca\u03d3\5\u00f6|\2\u03cb\u03d3\5\u00dc"+
+ "o\2\u03cc\u03d3\5\u00f8}\2\u03cd\u03d3\5\u00fa~\2\u03ce\u03d3\5\u010c"+
+ "\u0087\2\u03cf\u03d3\5\u009aN\2\u03d0\u03d3\5\u009eP\2\u03d1\u03d3\5f"+
+ "\64\2\u03d2\u03be\3\2\2\2\u03d2\u03bf\3\2\2\2\u03d2\u03c0\3\2\2\2\u03d2"+
+ "\u03c1\3\2\2\2\u03d2\u03c2\3\2\2\2\u03d2\u03c3\3\2\2\2\u03d2\u03c4\3\2"+
+ "\2\2\u03d2\u03c5\3\2\2\2\u03d2\u03c6\3\2\2\2\u03d2\u03c7\3\2\2\2\u03d2"+
+ "\u03c8\3\2\2\2\u03d2\u03c9\3\2\2\2\u03d2\u03ca\3\2\2\2\u03d2\u03cb\3\2"+
+ "\2\2\u03d2\u03cc\3\2\2\2\u03d2\u03cd\3\2\2\2\u03d2\u03ce\3\2\2\2\u03d2"+
+ "\u03cf\3\2\2\2\u03d2\u03d0\3\2\2\2\u03d2\u03d1\3\2\2\2\u03d3\u0095\3\2"+
+ "\2\2\u03d4\u03d5\7%\2\2\u03d5\u03d6\5\u0092J\2\u03d6\u0097\3\2\2\2\u03d7"+
+ "\u03d8\7W\2\2\u03d8\u03da\5\u0092J\2\u03d9\u03db\5\u00dco\2\u03da\u03d9"+
+ "\3\2\2\2\u03da\u03db\3\2\2\2\u03db\u0099\3\2\2\2\u03dc\u03dd\5\u009cO"+
+ "\2\u03dd\u03de\5\u0114\u008b\2\u03de\u009b\3\2\2\2\u03df\u03e0\7\16\2"+
+ "\2\u03e0\u03e1\5\u0092J\2\u03e1\u03e2\5\u015e\u00b0\2\u03e2\u03e4\3\2"+
+ "\2\2\u03e3\u03df\3\2\2\2\u03e4\u03e7\3\2\2\2\u03e5\u03e3\3\2\2\2\u03e5"+
+ "\u03e6\3\2\2\2\u03e6\u03ec\3\2\2\2\u03e7\u03e5\3\2\2\2\u03e8\u03e9\7\17"+
+ "\2\2\u03e9\u03ea\5Z.\2\u03ea\u03eb\5\u015e\u00b0\2\u03eb\u03ed\3\2\2\2"+
+ "\u03ec\u03e8\3\2\2\2\u03ec\u03ed\3\2\2\2\u03ed\u009d\3\2\2\2\u03ee\u03ef"+
+ "\7P\2\2\u03ef\u03f4\5\u0092J\2\u03f0\u03f1\7P\2\2\u03f1\u03f2\t\3\2\2"+
+ "\u03f2\u03f4\5.\30\2\u03f3\u03ee\3\2\2\2\u03f3\u03f0\3\2\2\2\u03f4\u009f"+
+ "\3\2\2\2\u03f5\u03fe\7\5\2\2\u03f6\u03fe\7\6\2\2\u03f7\u03fe\7c\2\2\u03f8"+
+ "\u03fe\5\u013a\u009e\2\u03f9\u03fe\5\u0150\u00a9\2\u03fa\u03fe\7\3\2\2"+
+ "\u03fb\u03fe\7\u008e\2\2\u03fc\u03fe\7\u008f\2\2\u03fd\u03f5\3\2\2\2\u03fd"+
+ "\u03f6\3\2\2\2\u03fd\u03f7\3\2\2\2\u03fd\u03f8\3\2\2\2\u03fd\u03f9\3\2"+
+ "\2\2\u03fd\u03fa\3\2\2\2\u03fd\u03fb\3\2\2\2\u03fd\u03fc\3\2\2\2\u03fe"+
+ "\u00a1\3\2\2\2\u03ff\u0400\bR\1\2\u0400\u040c\5\u0136\u009c\2\u0401\u040c"+
+ "\5\u0132\u009a\2\u0402\u040c\5\u015a\u00ae\2\u0403\u040c\5 \21\2\u0404"+
+ "\u040c\5t;\2\u0405\u040c\5r:\2\u0406\u0407\t\17\2\2\u0407\u0408\7e\2\2"+
+ "\u0408\u0409\5\u0092J\2\u0409\u040a\7f\2\2\u040a\u040c\3\2\2\2\u040b\u03ff"+
+ "\3\2\2\2\u040b\u0401\3\2\2\2\u040b\u0402\3\2\2\2\u040b\u0403\3\2\2\2\u040b"+
+ "\u0404\3\2\2\2\u040b\u0405\3\2\2\2\u040b\u0406\3\2\2\2\u040c\u0423\3\2"+
+ "\2\2\u040d\u040e\f\13\2\2\u040e\u040f\7o\2\2\u040f\u0422\7d\2\2\u0410"+
+ "\u0411\f\n\2\2\u0411\u0422\5\u0154\u00ab\2\u0412\u0413\f\t\2\2\u0413\u0422"+
+ "\5\u00bc_\2\u0414\u0415\f\b\2\2\u0415\u0422\5H%\2\u0416\u0417\f\7\2\2"+
+ "\u0417\u0422\5\u0156\u00ac\2\u0418\u0419\f\6\2\2\u0419\u0422\5\u0158\u00ad"+
+ "\2\u041a\u041b\f\5\2\2\u041b\u041c\5\u0158\u00ad\2\u041c\u041d\7\22\2"+
+ "\2\u041d\u041e\5`\61\2\u041e\u0422\3\2\2\2\u041f\u0420\f\4\2\2\u0420\u0422"+
+ "\5\u00a8U\2\u0421\u040d\3\2\2\2\u0421\u0410\3\2\2\2\u0421\u0412\3\2\2"+
+ "\2\u0421\u0414\3\2\2\2\u0421\u0416\3\2\2\2\u0421\u0418\3\2\2\2\u0421\u041a"+
+ "\3\2\2\2\u0421\u041f\3\2\2\2\u0422\u0425\3\2\2\2\u0423\u0421\3\2\2\2\u0423"+
+ "\u0424\3\2\2\2\u0424\u00a3\3\2\2\2\u0425\u0423\3\2\2\2\u0426\u0427\5V"+
+ ",\2\u0427\u0428\5\u00a6T\2\u0428\u00a5\3\2\2\2\u0429\u042b\7L\2\2\u042a"+
+ "\u042c\7d\2\2\u042b\u042a\3\2\2\2\u042b\u042c\3\2\2\2\u042c\u042d\3\2"+
+ "\2\2\u042d\u042f\5\u012c\u0097\2\u042e\u0430\5^\60\2\u042f\u042e\3\2\2"+
+ "\2\u042f\u0430\3\2\2\2\u0430\u00a7\3\2\2\2\u0431\u0433\7\'\2\2\u0432\u0434"+
+ "\5\u00d4k\2\u0433\u0432\3\2\2\2\u0433\u0434\3\2\2\2\u0434\u0436\3\2\2"+
+ "\2\u0435\u0437\7l\2\2\u0436\u0435\3\2\2\2\u0436\u0437\3\2\2\2\u0437\u0438"+
+ "\3\2\2\2\u0438\u0439\7(\2\2\u0439\u00a9\3\2\2\2\u043a\u043b\7M\2\2\u043b"+
+ "\u0445\7g\2\2\u043c\u0440\5\u00aeX\2\u043d\u0440\5\u011a\u008e\2\u043e"+
+ "\u0440\5\u00acW\2\u043f\u043c\3\2\2\2\u043f\u043d\3\2\2\2\u043f\u043e"+
+ "\3\2\2\2\u0440\u0441\3\2\2\2\u0441\u0442\5\u015e\u00b0\2\u0442\u0444\3"+
+ "\2\2\2\u0443\u043f\3\2\2\2\u0444\u0447\3\2\2\2\u0445\u0443\3\2\2\2\u0445"+
+ "\u0446\3\2\2\2\u0446\u0448\3\2\2\2\u0447\u0445\3\2\2\2\u0448\u0449\7h"+
+ "\2\2\u0449\u00ab\3\2\2\2\u044a\u044b\7\67\2\2\u044b\u044c\7d\2\2\u044c"+
+ "\u044d\5\u0130\u0099\2\u044d\u00ad\3\2\2\2\u044e\u0450\7\34\2\2\u044f"+
+ "\u044e\3\2\2\2\u044f\u0450\3\2\2\2\u0450\u0451\3\2\2\2\u0451\u0452\5V"+
+ ",\2\u0452\u0453\7d\2\2\u0453\u0454\5\u0130\u0099\2\u0454\u0455\5\u012e"+
+ "\u0098\2\u0455\u045e\3\2\2\2\u0456\u0458\7\34\2\2\u0457\u0456\3\2\2\2"+
+ "\u0457\u0458\3\2\2\2\u0458\u0459\3\2\2\2\u0459\u045a\5V,\2\u045a\u045b"+
+ "\7d\2\2\u045b\u045c\5\u0130\u0099\2\u045c\u045e\3\2\2\2\u045d\u044f\3"+
+ "\2\2\2\u045d\u0457\3\2\2\2\u045e\u00af\3\2\2\2\u045f\u0467\5\u011a\u008e"+
+ "\2\u0460\u0467\5\u00b2Z\2\u0461\u0467\5L\'\2\u0462\u0463\7e\2\2\u0463"+
+ "\u0464\5\u00b0Y\2\u0464\u0465\7f\2\2\u0465\u0467\3\2\2\2\u0466\u045f\3"+
+ "\2\2\2\u0466\u0460\3\2\2\2\u0466\u0461\3\2\2\2\u0466\u0462\3\2\2\2\u0467"+
+ "\u00b1\3\2\2\2\u0468\u0472\5\u011c\u008f\2\u0469\u0472\5\u014c\u00a7\2"+
+ "\u046a\u0472\5\u0122\u0092\2\u046b\u0472\5\u012a\u0096\2\u046c\u0472\5"+
+ "\u00aaV\2\u046d\u0472\5\u0124\u0093\2\u046e\u0472\5\u0126\u0094\2\u046f"+
+ "\u0472\5\u0128\u0095\2\u0470\u0472\5\u00b4[\2\u0471\u0468\3\2\2\2\u0471"+
+ "\u0469\3\2\2\2\u0471\u046a\3\2\2\2\u0471\u046b\3\2\2\2\u0471\u046c\3\2"+
+ "\2\2\u0471\u046d\3\2\2\2\u0471\u046e\3\2\2\2\u0471\u046f\3\2\2\2\u0471"+
+ "\u0470\3\2\2\2\u0472\u00b3\3\2\2\2\u0473\u0474\7\67\2\2\u0474\u0475\5"+
+ "\u00b6\\\2\u0475\u00b5\3\2\2\2\u0476\u0482\7e\2\2\u0477\u047c\5\u00b0"+
+ "Y\2\u0478\u0479\7l\2\2\u0479\u047b\5\u00b0Y\2\u047a\u0478\3\2\2\2\u047b"+
+ "\u047e\3\2\2\2\u047c\u047a\3\2\2\2\u047c\u047d\3\2\2\2\u047d\u0480\3\2"+
+ "\2\2\u047e\u047c\3\2\2\2\u047f\u0481\7l\2\2\u0480\u047f\3\2\2\2\u0480"+
+ "\u0481\3\2\2\2\u0481\u0483\3\2\2\2\u0482\u0477\3\2\2\2\u0482\u0483\3\2"+
+ "\2\2\u0483\u0484\3\2\2\2\u0484\u0485\7f\2\2\u0485\u00b7\3\2\2\2\u0486"+
+ "\u048e\5\u014c\u00a7\2\u0487\u048e\5\u011c\u008f\2\u0488\u048e\5\u00ba"+
+ "^\2\u0489\u048e\5\u0124\u0093\2\u048a\u048e\5\u0126\u0094\2\u048b\u048e"+
+ "\5L\'\2\u048c\u048e\5\u011a\u008e\2\u048d\u0486\3\2\2\2\u048d\u0487\3"+
+ "\2\2\2\u048d\u0488\3\2\2\2\u048d\u0489\3\2\2\2\u048d\u048a\3\2\2\2\u048d"+
+ "\u048b\3\2\2\2\u048d\u048c\3\2\2\2\u048e\u00b9\3\2\2\2\u048f\u0490\7i"+
+ "\2\2\u0490\u0491\7s\2\2\u0491\u0492\7j\2\2\u0492\u0493\5\u0120\u0091\2"+
+ "\u0493\u00bb\3\2\2\2\u0494\u04a4\7i\2\2\u0495\u0497\5\u00be`\2\u0496\u0495"+
+ "\3\2\2\2\u0496\u0497\3\2\2\2\u0497\u0498\3\2\2\2\u0498\u049a\7n\2\2\u0499"+
"\u049b\5\u00c0a\2\u049a\u0499\3\2\2\2\u049a\u049b\3\2\2\2\u049b\u04a5"+
"\3\2\2\2\u049c\u049e\5\u00be`\2\u049d\u049c\3\2\2\2\u049d\u049e\3\2\2"+
- "\2\u049e\u049f\3\2\2\2\u049f\u04a0\7m\2\2\u04a0\u04a1\5\u00c0a\2\u04a1"+
- "\u04a2\7m\2\2\u04a2\u04a3\5\u00c2b\2\u04a3\u04a5\3\2\2\2\u04a4\u0496\3"+
- "\2\2\2\u04a4\u049d\3\2\2\2\u04a5\u04a6\3\2\2\2\u04a6\u04a7\7i\2\2\u04a7"+
+ "\2\u049e\u049f\3\2\2\2\u049f\u04a0\7n\2\2\u04a0\u04a1\5\u00c0a\2\u04a1"+
+ "\u04a2\7n\2\2\u04a2\u04a3\5\u00c2b\2\u04a3\u04a5\3\2\2\2\u04a4\u0496\3"+
+ "\2\2\2\u04a4\u049d\3\2\2\2\u04a5\u04a6\3\2\2\2\u04a6\u04a7\7j\2\2\u04a7"+
"\u00bd\3\2\2\2\u04a8\u04a9\5\u0092J\2\u04a9\u00bf\3\2\2\2\u04aa\u04ab"+
"\5\u0092J\2\u04ab\u00c1\3\2\2\2\u04ac\u04ad\5\u0092J\2\u04ad\u00c3\3\2"+
"\2\2\u04ae\u04b0\t\20\2\2\u04af\u04ae\3\2\2\2\u04af\u04b0\3\2\2\2\u04b0"+
- "\u04b1\3\2\2\2\u04b1\u04b2\7j\2\2\u04b2\u00c5\3\2\2\2\u04b3\u04b4\7V\2"+
- "\2\u04b4\u04b5\7c\2\2\u04b5\u00c7\3\2\2\2\u04b6\u04b7\5\u0150\u00a9\2"+
- "\u04b7\u00c9\3\2\2\2\u04b8\u04bc\5\u00ccg\2\u04b9\u04bc\5\u00d4k\2\u04ba"+
- "\u04bc\5\u00d8m\2\u04bb\u04b8\3\2\2\2\u04bb\u04b9\3\2\2\2\u04bb\u04ba"+
- "\3\2\2\2\u04bc\u00cb\3\2\2\2\u04bd\u04c9\7X\2\2\u04be\u04ca\5\u00ceh\2"+
- "\u04bf\u04c5\7d\2\2\u04c0\u04c1\5\u00ceh\2\u04c1\u04c2\5\u015e\u00b0\2"+
- "\u04c2\u04c4\3\2\2\2\u04c3\u04c0\3\2\2\2\u04c4\u04c7\3\2\2\2\u04c5\u04c3"+
- "\3\2\2\2\u04c5\u04c6\3\2\2\2\u04c6\u04c8\3\2\2\2\u04c7\u04c5\3\2\2\2\u04c8"+
- "\u04ca\7e\2\2\u04c9\u04be\3\2\2\2\u04c9\u04bf\3\2\2\2\u04ca\u00cd\3\2"+
- "\2\2\u04cb\u04d1\5\u00d0i\2\u04cc\u04ce\5\u00b0Y\2\u04cd\u04cc\3\2\2\2"+
- "\u04cd\u04ce\3\2\2\2\u04ce\u04cf\3\2\2\2\u04cf\u04d0\7j\2\2\u04d0\u04d2"+
- "\5\u00d2j\2\u04d1\u04cd\3\2\2\2\u04d1\u04d2\3\2\2\2\u04d2\u00cf\3\2\2"+
- "\2\u04d3\u04d8\7c\2\2\u04d4\u04d5\7k\2\2\u04d5\u04d7\7c\2\2\u04d6\u04d4"+
- "\3\2\2\2\u04d7\u04da\3\2\2\2\u04d8\u04d6\3\2\2\2\u04d8\u04d9\3\2\2\2\u04d9"+
- "\u00d1\3\2\2\2\u04da\u04d8\3\2\2\2\u04db\u04e0\5\u0092J\2\u04dc\u04dd"+
- "\7k\2\2\u04dd\u04df\5\u0092J\2\u04de\u04dc\3\2\2\2\u04df\u04e2\3\2\2\2"+
- "\u04e0\u04de\3\2\2\2\u04e0\u04e1\3\2\2\2\u04e1\u00d3\3\2\2\2\u04e2\u04e0"+
- "\3\2\2\2\u04e3\u04ef\7\\\2\2\u04e4\u04f0\5\u00d6l\2\u04e5\u04eb\7d\2\2"+
- "\u04e6\u04e7\5\u00d6l\2\u04e7\u04e8\5\u015e\u00b0\2\u04e8\u04ea\3\2\2"+
- "\2\u04e9\u04e6\3\2\2\2\u04ea\u04ed\3\2\2\2\u04eb\u04e9\3\2\2\2\u04eb\u04ec"+
- "\3\2\2\2\u04ec\u04ee\3\2\2\2\u04ed\u04eb\3\2\2\2\u04ee\u04f0\7e\2\2\u04ef"+
- "\u04e4\3\2\2\2\u04ef\u04e5\3\2\2\2\u04f0\u00d5\3\2\2\2\u04f1\u04f3\7c"+
- "\2\2\u04f2\u04f4\7j\2\2\u04f3\u04f2\3\2\2\2\u04f3\u04f4\3\2\2\2\u04f4"+
- "\u04f5\3\2\2\2\u04f5\u04f6\5\u00b0Y\2\u04f6\u00d7\3\2\2\2\u04f7\u0503"+
- "\7a\2\2\u04f8\u0504\5\u0084C\2\u04f9\u04ff\7d\2\2\u04fa\u04fb\5\u0084"+
- "C\2\u04fb\u04fc\5\u015e\u00b0\2\u04fc\u04fe\3\2\2\2\u04fd\u04fa\3\2\2"+
- "\2\u04fe\u0501\3\2\2\2\u04ff\u04fd\3\2\2\2\u04ff\u0500\3\2\2\2\u0500\u0502"+
- "\3\2\2\2\u0501\u04ff\3\2\2\2\u0502\u0504\7e\2\2\u0503\u04f8\3\2\2\2\u0503"+
- "\u04f9\3\2\2\2\u0504\u00d9\3\2\2\2\u0505\u0507\7f\2\2\u0506\u0508\5\u00dc"+
- "o\2\u0507\u0506\3\2\2\2\u0507\u0508\3\2\2\2\u0508\u0509\3\2\2\2\u0509"+
- "\u050a\7g\2\2\u050a\u00db\3\2\2\2\u050b\u050d\5\u015e\u00b0\2\u050c\u050b"+
- "\3\2\2\2\u050c\u050d\3\2\2\2\u050d\u050e\3\2\2\2\u050e\u050f\5\u0094K"+
- "\2\u050f\u0510\5\u015e\u00b0\2\u0510\u0512\3\2\2\2\u0511\u050c\3\2\2\2"+
- "\u0512\u0513\3\2\2\2\u0513\u0511\3\2\2\2\u0513\u0514\3\2\2\2\u0514\u00dd"+
- "\3\2\2\2\u0515\u051b\5\u00e2r\2\u0516\u051b\5\u00e4s\2\u0517\u051b\5\u00e6"+
- "t\2\u0518\u051b\5\u00e0q\2\u0519\u051b\5\u0086D\2\u051a\u0515\3\2\2\2"+
- "\u051a\u0516\3\2\2\2\u051a\u0517\3\2\2\2\u051a\u0518\3\2\2\2\u051a\u0519"+
- "\3\2\2\2\u051b\u00df\3\2\2\2\u051c\u051d\5\u0092J\2\u051d\u00e1\3\2\2"+
- "\2\u051e\u051f\5\u0092J\2\u051f\u0520\7\u0087\2\2\u0520\u0521\5\u0092"+
- "J\2\u0521\u00e3\3\2\2\2\u0522\u0523\5\u0092J\2\u0523\u0524\t\21\2\2\u0524"+
- "\u00e5\3\2\2\2\u0525\u0526\5\u00d2j\2\u0526\u0527\5\u00c4c\2\u0527\u0528"+
- "\5\u00d2j\2\u0528\u00e7\3\2\2\2\u0529\u052a\t\22\2\2\u052a\u00e9\3\2\2"+
- "\2\u052b\u052c\7c\2\2\u052c\u052e\7m\2\2\u052d\u052f\5\u0094K\2\u052e"+
- "\u052d\3\2\2\2\u052e\u052f\3\2\2\2\u052f\u00eb\3\2\2\2\u0530\u0532\7`"+
- "\2\2\u0531\u0533\5\u00d2j\2\u0532\u0531\3\2\2\2\u0532\u0533\3\2\2\2\u0533"+
- "\u00ed\3\2\2\2\u0534\u0536\7I\2\2\u0535\u0537\7c\2\2\u0536\u0535\3\2\2"+
- "\2\u0536\u0537\3\2\2\2\u0537\u00ef\3\2\2\2\u0538\u053a\7]\2\2\u0539\u053b"+
- "\7c\2\2\u053a\u0539\3\2\2\2\u053a\u053b\3\2\2\2\u053b\u00f1\3\2\2\2\u053c"+
- "\u053d\7U\2\2\u053d\u053e\7c\2\2\u053e\u00f3\3\2\2\2\u053f\u0540\7Y\2"+
- "\2\u0540\u00f5\3\2\2\2\u0541\u054a\7Z\2\2\u0542\u054b\5\u0092J\2\u0543"+
- "\u0544\5\u015e\u00b0\2\u0544\u0545\5\u0092J\2\u0545\u054b\3\2\2\2\u0546"+
- "\u0547\5\u00dep\2\u0547\u0548\5\u015e\u00b0\2\u0548\u0549\5\u0092J\2\u0549"+
- "\u054b\3\2\2\2\u054a\u0542\3\2\2\2\u054a\u0543\3\2\2\2\u054a\u0546\3\2"+
- "\2\2\u054b\u054c\3\2\2\2\u054c\u0552\5\u00dan\2\u054d\u0550\7T\2\2\u054e"+
- "\u0551\5\u00f6|\2\u054f\u0551\5\u00dan\2\u0550\u054e\3\2\2\2\u0550\u054f"+
- "\3\2\2\2\u0551\u0553\3\2\2\2\u0552\u054d\3\2\2\2\u0552\u0553\3\2\2\2\u0553"+
- "\u00f7\3\2\2\2\u0554\u0557\5\u00fa~\2\u0555\u0557\5\u0100\u0081\2\u0556"+
- "\u0554\3\2\2\2\u0556\u0555\3\2\2\2\u0557\u00f9\3\2\2\2\u0558\u0563\7W"+
- "\2\2\u0559\u055b\5\u0092J\2\u055a\u0559\3\2\2\2\u055a\u055b\3\2\2\2\u055b"+
- "\u0564\3\2\2\2\u055c\u055e\5\u00dep\2\u055d\u055c\3\2\2\2\u055d\u055e"+
- "\3\2\2\2\u055e\u055f\3\2\2\2\u055f\u0561\5\u015e\u00b0\2\u0560\u0562\5"+
- "\u0092J\2\u0561\u0560\3\2\2\2\u0561\u0562\3\2\2\2\u0562\u0564\3\2\2\2"+
- "\u0563\u055a\3\2\2\2\u0563\u055d\3\2\2\2\u0564\u0565\3\2\2\2\u0565\u0569"+
- "\7f\2\2\u0566\u0568\5\u00fc\177\2\u0567\u0566\3\2\2\2\u0568\u056b\3\2"+
- "\2\2\u0569\u0567\3\2\2\2\u0569\u056a\3\2\2\2\u056a\u056c\3\2\2\2\u056b"+
- "\u0569\3\2\2\2\u056c\u056d\7g\2\2\u056d\u00fb\3\2\2\2\u056e\u056f\5\u00fe"+
- "\u0080\2\u056f\u0571\7m\2\2\u0570\u0572\5\u00dco\2\u0571\u0570\3\2\2\2"+
- "\u0571\u0572\3\2\2\2\u0572\u00fd\3\2\2\2\u0573\u0574\7N\2\2\u0574\u0577"+
- "\5\u00d2j\2\u0575\u0577\7J\2\2\u0576\u0573\3\2\2\2\u0576\u0575\3\2\2\2"+
- "\u0577\u00ff\3\2\2\2\u0578\u0581\7W\2\2\u0579\u0582\5\u0102\u0082\2\u057a"+
- "\u057b\5\u015e\u00b0\2\u057b\u057c\5\u0102\u0082\2\u057c\u0582\3\2\2\2"+
- "\u057d\u057e\5\u00dep\2\u057e\u057f\5\u015e\u00b0\2\u057f\u0580\5\u0102"+
- "\u0082\2\u0580\u0582\3\2\2\2\u0581\u0579\3\2\2\2\u0581\u057a\3\2\2\2\u0581"+
- "\u057d\3\2\2\2\u0582\u0583\3\2\2\2\u0583\u0587\7f\2\2\u0584\u0586\5\u0104"+
- "\u0083\2\u0585\u0584\3\2\2\2\u0586\u0589\3\2\2\2\u0587\u0585\3\2\2\2\u0587"+
- "\u0588\3\2\2\2\u0588\u058a\3\2\2\2\u0589\u0587\3\2\2\2\u058a\u058b\7g"+
- "\2\2\u058b\u0101\3\2\2\2\u058c\u058d\7c\2\2\u058d\u058f\7q\2\2\u058e\u058c"+
- "\3\2\2\2\u058e\u058f\3\2\2\2\u058f\u0590\3\2\2\2\u0590\u0591\5\u00a2R"+
- "\2\u0591\u0592\7n\2\2\u0592\u0593\7d\2\2\u0593\u0594\7\\\2\2\u0594\u0595"+
- "\7e\2\2\u0595\u0103\3\2\2\2\u0596\u0597\5\u0106\u0084\2\u0597\u0599\7"+
- "m\2\2\u0598\u059a\5\u00dco\2\u0599\u0598\3\2\2\2\u0599\u059a\3\2\2\2\u059a"+
- "\u0105\3\2\2\2\u059b\u059c\7N\2\2\u059c\u059f\5\u0108\u0085\2\u059d\u059f"+
- "\7J\2\2\u059e\u059b\3\2\2\2\u059e\u059d\3\2\2\2\u059f\u0107\3\2\2\2\u05a0"+
- "\u05a3\5\u00b0Y\2\u05a1\u05a3\7b\2\2\u05a2\u05a0\3\2\2\2\u05a2\u05a1\3"+
- "\2\2\2\u05a3\u05ab\3\2\2\2\u05a4\u05a7\7k\2\2\u05a5\u05a8\5\u00b0Y\2\u05a6"+
- "\u05a8\7b\2\2\u05a7\u05a5\3\2\2\2\u05a7\u05a6\3\2\2\2\u05a8\u05aa\3\2"+
- "\2\2\u05a9\u05a4\3\2\2\2\u05aa\u05ad\3\2\2\2\u05ab\u05a9\3\2\2\2\u05ab"+
- "\u05ac\3\2\2\2\u05ac\u0109\3\2\2\2\u05ad\u05ab\3\2\2\2\u05ae\u05af\7M"+
- "\2\2\u05af\u05b3\7f\2\2\u05b0\u05b2\5\u010c\u0087\2\u05b1\u05b0\3\2\2"+
- "\2\u05b2\u05b5\3\2\2\2\u05b3\u05b1\3\2\2\2\u05b3\u05b4\3\2\2\2\u05b4\u05b6"+
- "\3\2\2\2\u05b5\u05b3\3\2\2\2\u05b6\u05b7\7g\2\2\u05b7\u010b\3\2\2\2\u05b8"+
- "\u05b9\5\u010e\u0088\2\u05b9\u05bb\7m\2\2\u05ba\u05bc\5\u00dco\2\u05bb"+
- "\u05ba\3\2\2\2\u05bb\u05bc\3\2\2\2\u05bc\u010d\3\2\2\2\u05bd\u05c0\7N"+
- "\2\2\u05be\u05c1\5\u00e2r\2\u05bf\u05c1\5\u0110\u0089\2\u05c0\u05be\3"+
- "\2\2\2\u05c0\u05bf\3\2\2\2\u05c1\u05c4\3\2\2\2\u05c2\u05c4\7J\2\2\u05c3"+
- "\u05bd\3\2\2\2\u05c3\u05c2\3\2\2\2\u05c4\u010f\3\2\2\2\u05c5\u05c6\5\u00d2"+
- "j\2\u05c6\u05c7\7j\2\2\u05c7\u05cc\3\2\2\2\u05c8\u05c9\5\u00d0i\2\u05c9"+
- "\u05ca\7q\2\2\u05ca\u05cc\3\2\2\2\u05cb\u05c5\3\2\2\2\u05cb\u05c8\3\2"+
- "\2\2\u05cb\u05cc\3\2\2\2\u05cc\u05cd\3\2\2\2\u05cd\u05ce\5\u0092J\2\u05ce"+
- "\u0111\3\2\2\2\u05cf\u05d3\7^\2\2\u05d0\u05d4\5\u0092J\2\u05d1\u05d4\5"+
- "\u0114\u008b\2\u05d2\u05d4\5\u0116\u008c\2\u05d3\u05d0\3\2\2\2\u05d3\u05d1"+
- "\3\2\2\2\u05d3\u05d2\3\2\2\2\u05d3\u05d4\3\2\2\2\u05d4\u05d5\3\2\2\2\u05d5"+
- "\u05d6\5\u00dan\2\u05d6\u0113\3\2\2\2\u05d7\u05d9\5\u00dep\2\u05d8\u05d7"+
- "\3\2\2\2\u05d8\u05d9\3\2\2\2\u05d9\u05da\3\2\2\2\u05da\u05dc\5\u015e\u00b0"+
- "\2\u05db\u05dd\5\u0092J\2\u05dc\u05db\3\2\2\2\u05dc\u05dd\3\2\2\2\u05dd"+
- "\u05de\3\2\2\2\u05de\u05e0\5\u015e\u00b0\2\u05df\u05e1\5\u00dep\2\u05e0"+
- "\u05df\3\2\2\2\u05e0\u05e1\3\2\2\2\u05e1\u0115\3\2\2\2\u05e2\u05e3\5\u00d2"+
- "j\2\u05e3\u05e4\7j\2\2\u05e4\u05e9\3\2\2\2\u05e5\u05e6\5\u00d0i\2\u05e6"+
- "\u05e7\7q\2\2\u05e7\u05e9\3\2\2\2\u05e8\u05e2\3\2\2\2\u05e8\u05e5\3\2"+
- "\2\2\u05e8\u05e9\3\2\2\2\u05e9\u05ea\3\2\2\2\u05ea\u05eb\7[\2\2\u05eb"+
- "\u05ec\5\u0092J\2\u05ec\u0117\3\2\2\2\u05ed\u05ee\7P\2\2\u05ee\u05ef\5"+
- "\u0092J\2\u05ef\u0119\3\2\2\2\u05f0\u05f3\5\u013e\u00a0\2\u05f1\u05f3"+
- "\7c\2\2\u05f2\u05f0\3\2\2\2\u05f2\u05f1\3\2\2\2\u05f3\u011b\3\2\2\2\u05f4"+
- "\u05f5\7h\2\2\u05f5\u05f6\5\u011e\u0090\2\u05f6\u05f7\7i\2\2\u05f7\u05f8"+
- "\5\u0120\u0091\2\u05f8\u011d\3\2\2\2\u05f9\u05fa\5\u0092J\2\u05fa\u011f"+
- "\3\2\2\2\u05fb\u05fc\5\u00b0Y\2\u05fc\u0121\3\2\2\2\u05fd\u05fe\7\u0085"+
- "\2\2\u05fe\u05ff\5\u00b0Y\2\u05ff\u0123\3\2\2\2\u0600\u0601\7h\2\2\u0601"+
- "\u0602\7i\2\2\u0602\u0603\5\u0120\u0091\2\u0603\u0125\3\2\2\2\u0604\u0605"+
- "\7Q\2\2\u0605\u0606\7h\2\2\u0606\u0607\5\u00b0Y\2\u0607\u0608\7i\2\2\u0608"+
- "\u0609\5\u0120\u0091\2\u0609\u0127\3\2\2\2\u060a\u0610\7S\2\2\u060b\u060c"+
- "\7S\2\2\u060c\u0610\7\u0087\2\2\u060d\u060e\7\u0087\2\2\u060e\u0610\7"+
- "S\2\2\u060f\u060a\3\2\2\2\u060f\u060b\3\2\2\2\u060f\u060d\3\2\2\2\u0610"+
- "\u0611\3\2\2\2\u0611\u0612\5\u0120\u0091\2\u0612\u0129\3\2\2\2\u0613\u0614"+
- "\7K\2\2\u0614\u0615\5\u012c\u0097\2\u0615\u012b\3\2\2\2\u0616\u0617\5"+
- "\u0130\u0099\2\u0617\u0618\5\u012e\u0098\2\u0618\u061b\3\2\2\2\u0619\u061b"+
- "\5\u0130\u0099\2\u061a\u0616\3\2\2\2\u061a\u0619\3\2\2\2\u061b\u012d\3"+
- "\2\2\2\u061c\u061f\5\u0130\u0099\2\u061d\u061f\5\u00b0Y\2\u061e\u061c"+
- "\3\2\2\2\u061e\u061d\3\2\2\2\u061f\u012f\3\2\2\2\u0620\u062c\7d\2\2\u0621"+
- "\u0626\5\u008aF\2\u0622\u0623\7k\2\2\u0623\u0625\5\u008aF\2\u0624\u0622"+
- "\3\2\2\2\u0625\u0628\3\2\2\2\u0626\u0624\3\2\2\2\u0626\u0627\3\2\2\2\u0627"+
- "\u062a\3\2\2\2\u0628\u0626\3\2\2\2\u0629\u062b\7k\2\2\u062a\u0629\3\2"+
- "\2\2\u062a\u062b\3\2\2\2\u062b\u062d\3\2\2\2\u062c\u0621\3\2\2\2\u062c"+
- "\u062d\3\2\2\2\u062d\u062e\3\2\2\2\u062e\u062f\7e\2\2\u062f\u0131\3\2"+
- "\2\2\u0630\u0631\5\u0134\u009b\2\u0631\u0632\7d\2\2\u0632\u0634\5\u0092"+
- "J\2\u0633\u0635\7k\2\2\u0634\u0633\3\2\2\2\u0634\u0635\3\2\2\2\u0635\u0636"+
- "\3\2\2\2\u0636\u0637\7e\2\2\u0637\u0133\3\2\2\2\u0638\u063e\5\u00b2Z\2"+
- "\u0639\u063a\7d\2\2\u063a\u063b\5\u0134\u009b\2\u063b\u063c\7e\2\2\u063c"+
- "\u063e\3\2\2\2\u063d\u0638\3\2\2\2\u063d\u0639\3\2\2\2\u063e\u0135\3\2"+
- "\2\2\u063f\u0646\5\u0138\u009d\2\u0640\u0646\5\u013c\u009f\2\u0641\u0642"+
- "\7d\2\2\u0642\u0643\5\u0092J\2\u0643\u0644\7e\2\2\u0644\u0646\3\2\2\2"+
- "\u0645\u063f\3\2\2\2\u0645\u0640\3\2\2\2\u0645\u0641\3\2\2\2\u0646\u0137"+
- "\3\2\2\2\u0647\u064b\5\u00a0Q\2\u0648\u064b\5\u0140\u00a1\2\u0649\u064b"+
- "\5\u00a4S\2\u064a\u0647\3\2\2\2\u064a\u0648\3\2\2\2\u064a\u0649\3\2\2"+
- "\2\u064b\u0139\3\2\2\2\u064c\u064d\t\23\2\2\u064d\u013b\3\2\2\2\u064e"+
- "\u064f\7c\2\2\u064f\u013d\3\2\2\2\u0650\u0651\7c\2\2\u0651\u0652\7n\2"+
- "\2\u0652\u0653\7c\2\2\u0653\u013f\3\2\2\2\u0654\u0655\5\u00b8]\2\u0655"+
- "\u0656\5\u0142\u00a2\2\u0656\u0141\3\2\2\2\u0657\u065c\7f\2\2\u0658\u065a"+
- "\5\u0144\u00a3\2\u0659\u065b\7k\2\2\u065a\u0659\3\2\2\2\u065a\u065b\3"+
- "\2\2\2\u065b\u065d\3\2\2\2\u065c\u0658\3\2\2\2\u065c\u065d\3\2\2\2\u065d"+
- "\u065e\3\2\2\2\u065e\u065f\7g\2\2\u065f\u0143\3\2\2\2\u0660\u0665\5\u0146"+
- "\u00a4\2\u0661\u0662\7k\2\2\u0662\u0664\5\u0146\u00a4\2\u0663\u0661\3"+
- "\2\2\2\u0664\u0667\3\2\2\2\u0665\u0663\3\2\2\2\u0665\u0666\3\2\2\2\u0666"+
- "\u0145\3\2\2\2\u0667\u0665\3\2\2\2\u0668\u0669\5\u0148\u00a5\2\u0669\u066a"+
- "\7m\2\2\u066a\u066c\3\2\2\2\u066b\u0668\3\2\2\2\u066b\u066c\3\2\2\2\u066c"+
- "\u066d\3\2\2\2\u066d\u066e\5\u014a\u00a6\2\u066e\u0147\3\2\2\2\u066f\u0672"+
- "\5\u0092J\2\u0670\u0672\5\u0142\u00a2\2\u0671\u066f\3\2\2\2\u0671\u0670"+
- "\3\2\2\2\u0672\u0149\3\2\2\2\u0673\u0676\5\u0092J\2\u0674\u0676\5\u0142"+
- "\u00a2\2\u0675\u0673\3\2\2\2\u0675\u0674\3\2\2\2\u0676\u014b\3\2\2\2\u0677"+
- "\u0678\7R\2\2\u0678\u067e\7f\2\2\u0679\u067a\5\u014e\u00a8\2\u067a\u067b"+
- "\5\u015e\u00b0\2\u067b\u067d\3\2\2\2\u067c\u0679\3\2\2\2\u067d\u0680\3"+
- "\2\2\2\u067e\u067c\3\2\2\2\u067e\u067f\3\2\2\2\u067f\u0681\3\2\2\2\u0680"+
- "\u067e\3\2\2\2\u0681\u0682\7g\2\2\u0682\u014d\3\2\2\2\u0683\u0684\5\u00d0"+
- "i\2\u0684\u0685\5\u00b0Y\2\u0685\u0688\3\2\2\2\u0686\u0688\5\u0152\u00aa"+
- "\2\u0687\u0683\3\2\2\2\u0687\u0686\3\2\2\2\u0688\u068a\3\2\2\2\u0689\u068b"+
- "\5\u0150\u00a9\2\u068a\u0689\3\2\2\2\u068a\u068b\3\2\2\2\u068b\u014f\3"+
- "\2\2\2\u068c\u068d\t\24\2\2\u068d\u0151\3\2\2\2\u068e\u0690\7\u0085\2"+
- "\2\u068f\u068e\3\2\2\2\u068f\u0690\3\2\2\2\u0690\u0691\3\2\2\2\u0691\u0692"+
- "\5\u011a\u008e\2\u0692\u0153\3\2\2\2\u0693\u0694\7h\2\2\u0694\u0695\5"+
- "\u0092J\2\u0695\u0696\7i\2\2\u0696\u0155\3\2\2\2\u0697\u0698\7n\2\2\u0698"+
- "\u0699\7d\2\2\u0699\u069a\5\u00b0Y\2\u069a\u069b\7e\2\2\u069b\u0157\3"+
- "\2\2\2\u069c\u06ab\7d\2\2\u069d\u06a4\5\u00d2j\2\u069e\u06a1\5\u0134\u009b"+
- "\2\u069f\u06a0\7k\2\2\u06a0\u06a2\5\u00d2j\2\u06a1\u069f\3\2\2\2\u06a1"+
- "\u06a2\3\2\2\2\u06a2\u06a4\3\2\2\2\u06a3\u069d\3\2\2\2\u06a3\u069e\3\2"+
- "\2\2\u06a4\u06a6\3\2\2\2\u06a5\u06a7\7r\2\2\u06a6\u06a5\3\2\2\2\u06a6"+
- "\u06a7\3\2\2\2\u06a7\u06a9\3\2\2\2\u06a8\u06aa\7k\2\2\u06a9\u06a8\3\2"+
- "\2\2\u06a9\u06aa\3\2\2\2\u06aa\u06ac\3\2\2\2\u06ab\u06a3\3\2\2\2\u06ab"+
- "\u06ac\3\2\2\2\u06ac\u06ad\3\2\2\2\u06ad\u06ae\7e\2\2\u06ae\u0159\3\2"+
- "\2\2\u06af\u06b0\5\u0134\u009b\2\u06b0\u06b1\7n\2\2\u06b1\u06b2\7c\2\2"+
- "\u06b2\u015b\3\2\2\2\u06b3\u06b4\5\u00b0Y\2\u06b4\u015d\3\2\2\2\u06b5"+
- "\u06ba\7l\2\2\u06b6\u06ba\7\2\2\3\u06b7\u06ba\7\u009d\2\2\u06b8\u06ba"+
- "\6\u00b0\24\2\u06b9\u06b5\3\2\2\2\u06b9\u06b6\3\2\2\2\u06b9\u06b7\3\2"+
- "\2\2\u06b9\u06b8\3\2\2\2\u06ba\u015f\3\2\2\2\u00b1\u016e\u0173\u017a\u0184"+
- "\u018a\u0190\u01a0\u01a4\u01ad\u01b9\u01bd\u01c3\u01cb\u01d5\u01e5\u01f3"+
- "\u01f7\u01fe\u0206\u020f\u022f\u0237\u024f\u0260\u026c\u0275\u0283\u0295"+
- "\u029c\u02a1\u02a6\u02b0\u02b3\u02b7\u02bb\u02c2\u02c5\u02cb\u02d0\u02d2"+
- "\u02d5\u02dc\u02e1\u02f4\u02fc\u0300\u0303\u0309\u030d\u0310\u031a\u0321"+
- "\u0328\u0334\u033a\u0341\u0346\u034c\u0358\u035e\u0362\u036a\u036e\u0374"+
- "\u0377\u037d\u0382\u0396\u03b9\u03bb\u03d2\u03da\u03e5\u03ec\u03f3\u03fd"+
- "\u040b\u0421\u0423\u042b\u042f\u0433\u0436\u043f\u0445\u044f\u0457\u045d"+
- "\u0466\u0471\u047c\u0480\u0482\u048d\u0496\u049a\u049d\u04a4\u04af\u04bb"+
- "\u04c5\u04c9\u04cd\u04d1\u04d8\u04e0\u04eb\u04ef\u04f3\u04ff\u0503\u0507"+
- "\u050c\u0513\u051a\u052e\u0532\u0536\u053a\u054a\u0550\u0552\u0556\u055a"+
- "\u055d\u0561\u0563\u0569\u0571\u0576\u0581\u0587\u058e\u0599\u059e\u05a2"+
- "\u05a7\u05ab\u05b3\u05bb\u05c0\u05c3\u05cb\u05d3\u05d8\u05dc\u05e0\u05e8"+
- "\u05f2\u060f\u061a\u061e\u0626\u062a\u062c\u0634\u063d\u0645\u064a\u065a"+
- "\u065c\u0665\u066b\u0671\u0675\u067e\u0687\u068a\u068f\u06a1\u06a3\u06a6"+
- "\u06a9\u06ab\u06b9";
+ "\u04b1\3\2\2\2\u04b1\u04b2\7k\2\2\u04b2\u00c5\3\2\2\2\u04b3\u04b4\5\u00d4"+
+ "k\2\u04b4\u04b5\7k\2\2\u04b5\u04ba\3\2\2\2\u04b6\u04b7\5\b\5\2\u04b7\u04b8"+
+ "\7r\2\2\u04b8\u04ba\3\2\2\2\u04b9\u04b3\3\2\2\2\u04b9\u04b6\3\2\2\2\u04b9"+
+ "\u04ba\3\2\2\2\u04ba\u04bb\3\2\2\2\u04bb\u04bc\7\\\2\2\u04bc\u04c1\5\u0092"+
+ "J\2\u04bd\u04bf\7I\2\2\u04be\u04c0\7d\2\2\u04bf\u04be\3\2\2\2\u04bf\u04c0"+
+ "\3\2\2\2\u04c0\u04c2\3\2\2\2\u04c1\u04bd\3\2\2\2\u04c1\u04c2\3\2\2\2\u04c2"+
+ "\u00c7\3\2\2\2\u04c3\u04c4\7W\2\2\u04c4\u04c5\7d\2\2\u04c5\u00c9\3\2\2"+
+ "\2\u04c6\u04c7\5\u0150\u00a9\2\u04c7\u00cb\3\2\2\2\u04c8\u04cc\5\u00ce"+
+ "h\2\u04c9\u04cc\5\u00d6l\2\u04ca\u04cc\5\u00dan\2\u04cb\u04c8\3\2\2\2"+
+ "\u04cb\u04c9\3\2\2\2\u04cb\u04ca\3\2\2\2\u04cc\u00cd\3\2\2\2\u04cd\u04d9"+
+ "\7Y\2\2\u04ce\u04da\5\u00d0i\2\u04cf\u04d5\7e\2\2\u04d0\u04d1\5\u00d0"+
+ "i\2\u04d1\u04d2\5\u015e\u00b0\2\u04d2\u04d4\3\2\2\2\u04d3\u04d0\3\2\2"+
+ "\2\u04d4\u04d7\3\2\2\2\u04d5\u04d3\3\2\2\2\u04d5\u04d6\3\2\2\2\u04d6\u04d8"+
+ "\3\2\2\2\u04d7\u04d5\3\2\2\2\u04d8\u04da\7f\2\2\u04d9\u04ce\3\2\2\2\u04d9"+
+ "\u04cf\3\2\2\2\u04da\u00cf\3\2\2\2\u04db\u04e1\5\u00d2j\2\u04dc\u04de"+
+ "\5\u00b0Y\2\u04dd\u04dc\3\2\2\2\u04dd\u04de\3\2\2\2\u04de\u04df\3\2\2"+
+ "\2\u04df\u04e0\7k\2\2\u04e0\u04e2\5\u00d4k\2\u04e1\u04dd\3\2\2\2\u04e1"+
+ "\u04e2\3\2\2\2\u04e2\u00d1\3\2\2\2\u04e3\u04e8\7d\2\2\u04e4\u04e5\7l\2"+
+ "\2\u04e5\u04e7\7d\2\2\u04e6\u04e4\3\2\2\2\u04e7\u04ea\3\2\2\2\u04e8\u04e6"+
+ "\3\2\2\2\u04e8\u04e9\3\2\2\2\u04e9\u00d3\3\2\2\2\u04ea\u04e8\3\2\2\2\u04eb"+
+ "\u04f0\5\u0092J\2\u04ec\u04ed\7l\2\2\u04ed\u04ef\5\u0092J\2\u04ee\u04ec"+
+ "\3\2\2\2\u04ef\u04f2\3\2\2\2\u04f0\u04ee\3\2\2\2\u04f0\u04f1\3\2\2\2\u04f1"+
+ "\u00d5\3\2\2\2\u04f2\u04f0\3\2\2\2\u04f3\u04ff\7]\2\2\u04f4\u0500\5\u00d8"+
+ "m\2\u04f5\u04fb\7e\2\2\u04f6\u04f7\5\u00d8m\2\u04f7\u04f8\5\u015e\u00b0"+
+ "\2\u04f8\u04fa\3\2\2\2\u04f9\u04f6\3\2\2\2\u04fa\u04fd\3\2\2\2\u04fb\u04f9"+
+ "\3\2\2\2\u04fb\u04fc\3\2\2\2\u04fc\u04fe\3\2\2\2\u04fd\u04fb\3\2\2\2\u04fe"+
+ "\u0500\7f\2\2\u04ff\u04f4\3\2\2\2\u04ff\u04f5\3\2\2\2\u0500\u00d7\3\2"+
+ "\2\2\u0501\u0503\7d\2\2\u0502\u0504\7k\2\2\u0503\u0502\3\2\2\2\u0503\u0504"+
+ "\3\2\2\2\u0504\u0505\3\2\2\2\u0505\u0506\5\u00b0Y\2\u0506\u00d9\3\2\2"+
+ "\2\u0507\u0513\7b\2\2\u0508\u0514\5\u0084C\2\u0509\u050f\7e\2\2\u050a"+
+ "\u050b\5\u0084C\2\u050b\u050c\5\u015e\u00b0\2\u050c\u050e\3\2\2\2\u050d"+
+ "\u050a\3\2\2\2\u050e\u0511\3\2\2\2\u050f\u050d\3\2\2\2\u050f\u0510\3\2"+
+ "\2\2\u0510\u0512\3\2\2\2\u0511\u050f\3\2\2\2\u0512\u0514\7f\2\2\u0513"+
+ "\u0508\3\2\2\2\u0513\u0509\3\2\2\2\u0514\u00db\3\2\2\2\u0515\u0517\7g"+
+ "\2\2\u0516\u0518\5\u00dep\2\u0517\u0516\3\2\2\2\u0517\u0518\3\2\2\2\u0518"+
+ "\u0519\3\2\2\2\u0519\u051a\7h\2\2\u051a\u00dd\3\2\2\2\u051b\u051d\5\u015e"+
+ "\u00b0\2\u051c\u051b\3\2\2\2\u051c\u051d\3\2\2\2\u051d\u051e\3\2\2\2\u051e"+
+ "\u051f\5\u0094K\2\u051f\u0520\5\u015e\u00b0\2\u0520\u0522\3\2\2\2\u0521"+
+ "\u051c\3\2\2\2\u0522\u0523\3\2\2\2\u0523\u0521\3\2\2\2\u0523\u0524\3\2"+
+ "\2\2\u0524\u00df\3\2\2\2\u0525\u052b\5\u00e4s\2\u0526\u052b\5\u00e6t\2"+
+ "\u0527\u052b\5\u00e8u\2\u0528\u052b\5\u00e2r\2\u0529\u052b\5\u0086D\2"+
+ "\u052a\u0525\3\2\2\2\u052a\u0526\3\2\2\2\u052a\u0527\3\2\2\2\u052a\u0528"+
+ "\3\2\2\2\u052a\u0529\3\2\2\2\u052b\u00e1\3\2\2\2\u052c\u052d\5\u0092J"+
+ "\2\u052d\u00e3\3\2\2\2\u052e\u052f\5\u0092J\2\u052f\u0530\7\u0088\2\2"+
+ "\u0530\u0531\5\u0092J\2\u0531\u00e5\3\2\2\2\u0532\u0533\5\u0092J\2\u0533"+
+ "\u0534\t\21\2\2\u0534\u00e7\3\2\2\2\u0535\u0536\5\u00d4k\2\u0536\u0537"+
+ "\5\u00c4c\2\u0537\u0538\5\u00d4k\2\u0538\u00e9\3\2\2\2\u0539\u053a\t\22"+
+ "\2\2\u053a\u00eb\3\2\2\2\u053b\u053c\7d\2\2\u053c\u053e\7n\2\2\u053d\u053f"+
+ "\5\u0094K\2\u053e\u053d\3\2\2\2\u053e\u053f\3\2\2\2\u053f\u00ed\3\2\2"+
+ "\2\u0540\u0542\7a\2\2\u0541\u0543\5\u00d4k\2\u0542\u0541\3\2\2\2\u0542"+
+ "\u0543\3\2\2\2\u0543\u00ef\3\2\2\2\u0544\u0546\7J\2\2\u0545\u0547\7d\2"+
+ "\2\u0546\u0545\3\2\2\2\u0546\u0547\3\2\2\2\u0547\u00f1\3\2\2\2\u0548\u054a"+
+ "\7^\2\2\u0549\u054b\7d\2\2\u054a\u0549\3\2\2\2\u054a\u054b\3\2\2\2\u054b"+
+ "\u00f3\3\2\2\2\u054c\u054d\7V\2\2\u054d\u054e\7d\2\2\u054e\u00f5\3\2\2"+
+ "\2\u054f\u0550\7Z\2\2\u0550\u00f7\3\2\2\2\u0551\u055a\7[\2\2\u0552\u055b"+
+ "\5\u0092J\2\u0553\u0554\5\u015e\u00b0\2\u0554\u0555\5\u0092J\2\u0555\u055b"+
+ "\3\2\2\2\u0556\u0557\5\u00e0q\2\u0557\u0558\5\u015e\u00b0\2\u0558\u0559"+
+ "\5\u0092J\2\u0559\u055b\3\2\2\2\u055a\u0552\3\2\2\2\u055a\u0553\3\2\2"+
+ "\2\u055a\u0556\3\2\2\2\u055b\u055c\3\2\2\2\u055c\u0562\5\u00dco\2\u055d"+
+ "\u0560\7U\2\2\u055e\u0561\5\u00f8}\2\u055f\u0561\5\u00dco\2\u0560\u055e"+
+ "\3\2\2\2\u0560\u055f\3\2\2\2\u0561\u0563\3\2\2\2\u0562\u055d\3\2\2\2\u0562"+
+ "\u0563\3\2\2\2\u0563\u00f9\3\2\2\2\u0564\u0567\5\u00fc\177\2\u0565\u0567"+
+ "\5\u0102\u0082\2\u0566\u0564\3\2\2\2\u0566\u0565\3\2\2\2\u0567\u00fb\3"+
+ "\2\2\2\u0568\u0573\7X\2\2\u0569\u056b\5\u0092J\2\u056a\u0569\3\2\2\2\u056a"+
+ "\u056b\3\2\2\2\u056b\u0574\3\2\2\2\u056c\u056e\5\u00e0q\2\u056d\u056c"+
+ "\3\2\2\2\u056d\u056e\3\2\2\2\u056e\u056f\3\2\2\2\u056f\u0571\5\u015e\u00b0"+
+ "\2\u0570\u0572\5\u0092J\2\u0571\u0570\3\2\2\2\u0571\u0572\3\2\2\2\u0572"+
+ "\u0574\3\2\2\2\u0573\u056a\3\2\2\2\u0573\u056d\3\2\2\2\u0574\u0575\3\2"+
+ "\2\2\u0575\u0579\7g\2\2\u0576\u0578\5\u00fe\u0080\2\u0577\u0576\3\2\2"+
+ "\2\u0578\u057b\3\2\2\2\u0579\u0577\3\2\2\2\u0579\u057a\3\2\2\2\u057a\u057c"+
+ "\3\2\2\2\u057b\u0579\3\2\2\2\u057c\u057d\7h\2\2\u057d\u00fd\3\2\2\2\u057e"+
+ "\u057f\5\u0100\u0081\2\u057f\u0581\7n\2\2\u0580\u0582\5\u00dep\2\u0581"+
+ "\u0580\3\2\2\2\u0581\u0582\3\2\2\2\u0582\u00ff\3\2\2\2\u0583\u0584\7O"+
+ "\2\2\u0584\u0587\5\u00d4k\2\u0585\u0587\7K\2\2\u0586\u0583\3\2\2\2\u0586"+
+ "\u0585\3\2\2\2\u0587\u0101\3\2\2\2\u0588\u0591\7X\2\2\u0589\u0592\5\u0104"+
+ "\u0083\2\u058a\u058b\5\u015e\u00b0\2\u058b\u058c\5\u0104\u0083\2\u058c"+
+ "\u0592\3\2\2\2\u058d\u058e\5\u00e0q\2\u058e\u058f\5\u015e\u00b0\2\u058f"+
+ "\u0590\5\u0104\u0083\2\u0590\u0592\3\2\2\2\u0591\u0589\3\2\2\2\u0591\u058a"+
+ "\3\2\2\2\u0591\u058d\3\2\2\2\u0592\u0593\3\2\2\2\u0593\u0597\7g\2\2\u0594"+
+ "\u0596\5\u0106\u0084\2\u0595\u0594\3\2\2\2\u0596\u0599\3\2\2\2\u0597\u0595"+
+ "\3\2\2\2\u0597\u0598\3\2\2\2\u0598\u059a\3\2\2\2\u0599\u0597\3\2\2\2\u059a"+
+ "\u059b\7h\2\2\u059b\u0103\3\2\2\2\u059c\u059d\7d\2\2\u059d\u059f\7r\2"+
+ "\2\u059e\u059c\3\2\2\2\u059e\u059f\3\2\2\2\u059f\u05a0\3\2\2\2\u05a0\u05a1"+
+ "\5\u00a2R\2\u05a1\u05a2\7o\2\2\u05a2\u05a3\7e\2\2\u05a3\u05a4\7]\2\2\u05a4"+
+ "\u05a5\7f\2\2\u05a5\u0105\3\2\2\2\u05a6\u05a7\5\u0108\u0085\2\u05a7\u05a9"+
+ "\7n\2\2\u05a8\u05aa\5\u00dep\2\u05a9\u05a8\3\2\2\2\u05a9\u05aa\3\2\2\2"+
+ "\u05aa\u0107\3\2\2\2\u05ab\u05ac\7O\2\2\u05ac\u05af\5\u010a\u0086\2\u05ad"+
+ "\u05af\7K\2\2\u05ae\u05ab\3\2\2\2\u05ae\u05ad\3\2\2\2\u05af\u0109\3\2"+
+ "\2\2\u05b0\u05b3\5\u00b0Y\2\u05b1\u05b3\7c\2\2\u05b2\u05b0\3\2\2\2\u05b2"+
+ "\u05b1\3\2\2\2\u05b3\u05bb\3\2\2\2\u05b4\u05b7\7l\2\2\u05b5\u05b8\5\u00b0"+
+ "Y\2\u05b6\u05b8\7c\2\2\u05b7\u05b5\3\2\2\2\u05b7\u05b6\3\2\2\2\u05b8\u05ba"+
+ "\3\2\2\2\u05b9\u05b4\3\2\2\2\u05ba\u05bd\3\2\2\2\u05bb\u05b9\3\2\2\2\u05bb"+
+ "\u05bc\3\2\2\2\u05bc\u010b\3\2\2\2\u05bd\u05bb\3\2\2\2\u05be\u05bf\7N"+
+ "\2\2\u05bf\u05c3\7g\2\2\u05c0\u05c2\5\u010e\u0088\2\u05c1\u05c0\3\2\2"+
+ "\2\u05c2\u05c5\3\2\2\2\u05c3\u05c1\3\2\2\2\u05c3\u05c4\3\2\2\2\u05c4\u05c6"+
+ "\3\2\2\2\u05c5\u05c3\3\2\2\2\u05c6\u05c7\7h\2\2\u05c7\u010d\3\2\2\2\u05c8"+
+ "\u05c9\5\u0110\u0089\2\u05c9\u05cb\7n\2\2\u05ca\u05cc\5\u00dep\2\u05cb"+
+ "\u05ca\3\2\2\2\u05cb\u05cc\3\2\2\2\u05cc\u010f\3\2\2\2\u05cd\u05d0\7O"+
+ "\2\2\u05ce\u05d1\5\u00e4s\2\u05cf\u05d1\5\u0112\u008a\2\u05d0\u05ce\3"+
+ "\2\2\2\u05d0\u05cf\3\2\2\2\u05d1\u05d4\3\2\2\2\u05d2\u05d4\7K\2\2\u05d3"+
+ "\u05cd\3\2\2\2\u05d3\u05d2\3\2\2\2\u05d4\u0111\3\2\2\2\u05d5\u05d6\5\u00d4"+
+ "k\2\u05d6\u05d7\7k\2\2\u05d7\u05dc\3\2\2\2\u05d8\u05d9\5\u00d2j\2\u05d9"+
+ "\u05da\7r\2\2\u05da\u05dc\3\2\2\2\u05db\u05d5\3\2\2\2\u05db\u05d8\3\2"+
+ "\2\2\u05db\u05dc\3\2\2\2\u05dc\u05dd\3\2\2\2\u05dd\u05de\5\u0092J\2\u05de"+
+ "\u0113\3\2\2\2\u05df\u05e3\7_\2\2\u05e0\u05e4\5\u0092J\2\u05e1\u05e4\5"+
+ "\u0116\u008c\2\u05e2\u05e4\5\u00c6d\2\u05e3\u05e0\3\2\2\2\u05e3\u05e1"+
+ "\3\2\2\2\u05e3\u05e2\3\2\2\2\u05e3\u05e4\3\2\2\2\u05e4\u05e5\3\2\2\2\u05e5"+
+ "\u05e6\5\u00dco\2\u05e6\u0115\3\2\2\2\u05e7\u05e9\5\u00e0q\2\u05e8\u05e7"+
+ "\3\2\2\2\u05e8\u05e9\3\2\2\2\u05e9\u05ea\3\2\2\2\u05ea\u05ec\5\u015e\u00b0"+
+ "\2\u05eb\u05ed\5\u0092J\2\u05ec\u05eb\3\2\2\2\u05ec\u05ed\3\2\2\2\u05ed"+
+ "\u05ee\3\2\2\2\u05ee\u05f0\5\u015e\u00b0\2\u05ef\u05f1\5\u00e0q\2\u05f0"+
+ "\u05ef\3\2\2\2\u05f0\u05f1\3\2\2\2\u05f1\u0117\3\2\2\2\u05f2\u05f3\7Q"+
+ "\2\2\u05f3\u05f4\5\u0092J\2\u05f4\u0119\3\2\2\2\u05f5\u05f8\5\u013e\u00a0"+
+ "\2\u05f6\u05f8\7d\2\2\u05f7\u05f5\3\2\2\2\u05f7\u05f6\3\2\2\2\u05f8\u011b"+
+ "\3\2\2\2\u05f9\u05fa\7i\2\2\u05fa\u05fb\5\u011e\u0090\2\u05fb\u05fc\7"+
+ "j\2\2\u05fc\u05fd\5\u0120\u0091\2\u05fd\u011d\3\2\2\2\u05fe\u05ff\5\u0092"+
+ "J\2\u05ff\u011f\3\2\2\2\u0600\u0601\5\u00b0Y\2\u0601\u0121\3\2\2\2\u0602"+
+ "\u0603\7\u0086\2\2\u0603\u0604\5\u00b0Y\2\u0604\u0123\3\2\2\2\u0605\u0606"+
+ "\7i\2\2\u0606\u0607\7j\2\2\u0607\u0608\5\u0120\u0091\2\u0608\u0125\3\2"+
+ "\2\2\u0609\u060a\7R\2\2\u060a\u060b\7i\2\2\u060b\u060c\5\u00b0Y\2\u060c"+
+ "\u060d\7j\2\2\u060d\u060e\5\u0120\u0091\2\u060e\u0127\3\2\2\2\u060f\u0615"+
+ "\7T\2\2\u0610\u0611\7T\2\2\u0611\u0615\7\u0088\2\2\u0612\u0613\7\u0088"+
+ "\2\2\u0613\u0615\7T\2\2\u0614\u060f\3\2\2\2\u0614\u0610\3\2\2\2\u0614"+
+ "\u0612\3\2\2\2\u0615\u0616\3\2\2\2\u0616\u0617\5\u0120\u0091\2\u0617\u0129"+
+ "\3\2\2\2\u0618\u0619\7L\2\2\u0619\u061a\5\u012c\u0097\2\u061a\u012b\3"+
+ "\2\2\2\u061b\u061c\5\u0130\u0099\2\u061c\u061d\5\u012e\u0098\2\u061d\u0620"+
+ "\3\2\2\2\u061e\u0620\5\u0130\u0099\2\u061f\u061b\3\2\2\2\u061f\u061e\3"+
+ "\2\2\2\u0620\u012d\3\2\2\2\u0621\u0624\5\u0130\u0099\2\u0622\u0624\5\u00b0"+
+ "Y\2\u0623\u0621\3\2\2\2\u0623\u0622\3\2\2\2\u0624\u012f\3\2\2\2\u0625"+
+ "\u0631\7e\2\2\u0626\u062b\5\u008aF\2\u0627\u0628\7l\2\2\u0628\u062a\5"+
+ "\u008aF\2\u0629\u0627\3\2\2\2\u062a\u062d\3\2\2\2\u062b\u0629\3\2\2\2"+
+ "\u062b\u062c\3\2\2\2\u062c\u062f\3\2\2\2\u062d\u062b\3\2\2\2\u062e\u0630"+
+ "\7l\2\2\u062f\u062e\3\2\2\2\u062f\u0630\3\2\2\2\u0630\u0632\3\2\2\2\u0631"+
+ "\u0626\3\2\2\2\u0631\u0632\3\2\2\2\u0632\u0633\3\2\2\2\u0633\u0634\7f"+
+ "\2\2\u0634\u0131\3\2\2\2\u0635\u0636\5\u0134\u009b\2\u0636\u0637\7e\2"+
+ "\2\u0637\u0639\5\u0092J\2\u0638\u063a\7l\2\2\u0639\u0638\3\2\2\2\u0639"+
+ "\u063a\3\2\2\2\u063a\u063b\3\2\2\2\u063b\u063c\7f\2\2\u063c\u0133\3\2"+
+ "\2\2\u063d\u0643\5\u00b2Z\2\u063e\u063f\7e\2\2\u063f\u0640\5\u0134\u009b"+
+ "\2\u0640\u0641\7f\2\2\u0641\u0643\3\2\2\2\u0642\u063d\3\2\2\2\u0642\u063e"+
+ "\3\2\2\2\u0643\u0135\3\2\2\2\u0644\u064b\5\u0138\u009d\2\u0645\u064b\5"+
+ "\u013c\u009f\2\u0646\u0647\7e\2\2\u0647\u0648\5\u0092J\2\u0648\u0649\7"+
+ "f\2\2\u0649\u064b\3\2\2\2\u064a\u0644\3\2\2\2\u064a\u0645\3\2\2\2\u064a"+
+ "\u0646\3\2\2\2\u064b\u0137\3\2\2\2\u064c\u0650\5\u00a0Q\2\u064d\u0650"+
+ "\5\u0140\u00a1\2\u064e\u0650\5\u00a4S\2\u064f\u064c\3\2\2\2\u064f\u064d"+
+ "\3\2\2\2\u064f\u064e\3\2\2\2\u0650\u0139\3\2\2\2\u0651\u0652\t\23\2\2"+
+ "\u0652\u013b\3\2\2\2\u0653\u0654\7d\2\2\u0654\u013d\3\2\2\2\u0655\u0656"+
+ "\7d\2\2\u0656\u0657\7o\2\2\u0657\u0658\7d\2\2\u0658\u013f\3\2\2\2\u0659"+
+ "\u065a\5\u00b8]\2\u065a\u065b\5\u0142\u00a2\2\u065b\u0141\3\2\2\2\u065c"+
+ "\u0661\7g\2\2\u065d\u065f\5\u0144\u00a3\2\u065e\u0660\7l\2\2\u065f\u065e"+
+ "\3\2\2\2\u065f\u0660\3\2\2\2\u0660\u0662\3\2\2\2\u0661\u065d\3\2\2\2\u0661"+
+ "\u0662\3\2\2\2\u0662\u0663\3\2\2\2\u0663\u0664\7h\2\2\u0664\u0143\3\2"+
+ "\2\2\u0665\u066a\5\u0146\u00a4\2\u0666\u0667\7l\2\2\u0667\u0669\5\u0146"+
+ "\u00a4\2\u0668\u0666\3\2\2\2\u0669\u066c\3\2\2\2\u066a\u0668\3\2\2\2\u066a"+
+ "\u066b\3\2\2\2\u066b\u0145\3\2\2\2\u066c\u066a\3\2\2\2\u066d\u066e\5\u0148"+
+ "\u00a5\2\u066e\u066f\7n\2\2\u066f\u0671\3\2\2\2\u0670\u066d\3\2\2\2\u0670"+
+ "\u0671\3\2\2\2\u0671\u0672\3\2\2\2\u0672\u0673\5\u014a\u00a6\2\u0673\u0147"+
+ "\3\2\2\2\u0674\u0677\5\u0092J\2\u0675\u0677\5\u0142\u00a2\2\u0676\u0674"+
+ "\3\2\2\2\u0676\u0675\3\2\2\2\u0677\u0149\3\2\2\2\u0678\u067b\5\u0092J"+
+ "\2\u0679\u067b\5\u0142\u00a2\2\u067a\u0678\3\2\2\2\u067a\u0679\3\2\2\2"+
+ "\u067b\u014b\3\2\2\2\u067c\u067d\7S\2\2\u067d\u0683\7g\2\2\u067e\u067f"+
+ "\5\u014e\u00a8\2\u067f\u0680\5\u015e\u00b0\2\u0680\u0682\3\2\2\2\u0681"+
+ "\u067e\3\2\2\2\u0682\u0685\3\2\2\2\u0683\u0681\3\2\2\2\u0683\u0684\3\2"+
+ "\2\2\u0684\u0686\3\2\2\2\u0685\u0683\3\2\2\2\u0686\u0687\7h\2\2\u0687"+
+ "\u014d\3\2\2\2\u0688\u0689\5\u00d2j\2\u0689\u068a\5\u00b0Y\2\u068a\u068d"+
+ "\3\2\2\2\u068b\u068d\5\u0152\u00aa\2\u068c\u0688\3\2\2\2\u068c\u068b\3"+
+ "\2\2\2\u068d\u068f\3\2\2\2\u068e\u0690\5\u0150\u00a9\2\u068f\u068e\3\2"+
+ "\2\2\u068f\u0690\3\2\2\2\u0690\u014f\3\2\2\2\u0691\u0692\t\24\2\2\u0692"+
+ "\u0151\3\2\2\2\u0693\u0695\7\u0086\2\2\u0694\u0693\3\2\2\2\u0694\u0695"+
+ "\3\2\2\2\u0695\u0696\3\2\2\2\u0696\u0697\5\u011a\u008e\2\u0697\u0153\3"+
+ "\2\2\2\u0698\u0699\7i\2\2\u0699\u069a\5\u0092J\2\u069a\u069b\7j\2\2\u069b"+
+ "\u0155\3\2\2\2\u069c\u069d\7o\2\2\u069d\u069e\7e\2\2\u069e\u069f\5\u00b0"+
+ "Y\2\u069f\u06a0\7f\2\2\u06a0\u0157\3\2\2\2\u06a1\u06b0\7e\2\2\u06a2\u06a9"+
+ "\5\u00d4k\2\u06a3\u06a6\5\u0134\u009b\2\u06a4\u06a5\7l\2\2\u06a5\u06a7"+
+ "\5\u00d4k\2\u06a6\u06a4\3\2\2\2\u06a6\u06a7\3\2\2\2\u06a7\u06a9\3\2\2"+
+ "\2\u06a8\u06a2\3\2\2\2\u06a8\u06a3\3\2\2\2\u06a9\u06ab\3\2\2\2\u06aa\u06ac"+
+ "\7s\2\2\u06ab\u06aa\3\2\2\2\u06ab\u06ac\3\2\2\2\u06ac\u06ae\3\2\2\2\u06ad"+
+ "\u06af\7l\2\2\u06ae\u06ad\3\2\2\2\u06ae\u06af\3\2\2\2\u06af\u06b1\3\2"+
+ "\2\2\u06b0\u06a8\3\2\2\2\u06b0\u06b1\3\2\2\2\u06b1\u06b2\3\2\2\2\u06b2"+
+ "\u06b3\7f\2\2\u06b3\u0159\3\2\2\2\u06b4\u06b5\5\u0134\u009b\2\u06b5\u06b6"+
+ "\7o\2\2\u06b6\u06b7\7d\2\2\u06b7\u015b\3\2\2\2\u06b8\u06b9\5\u00b0Y\2"+
+ "\u06b9\u015d\3\2\2\2\u06ba\u06bf\7m\2\2\u06bb\u06bf\7\2\2\3\u06bc\u06bf"+
+ "\7\u009e\2\2\u06bd\u06bf\6\u00b0\24\2\u06be\u06ba\3\2\2\2\u06be\u06bb"+
+ "\3\2\2\2\u06be\u06bc\3\2\2\2\u06be\u06bd\3\2\2\2\u06bf\u015f\3\2\2\2\u00b3"+
+ "\u016e\u0173\u017a\u0184\u018a\u0190\u01a0\u01a4\u01ad\u01b9\u01bd\u01c3"+
+ "\u01cb\u01d5\u01e5\u01f3\u01f7\u01fe\u0206\u020f\u022f\u0237\u024f\u0260"+
+ "\u026c\u0275\u0283\u0295\u029c\u02a1\u02a6\u02b0\u02b3\u02b7\u02bb\u02c2"+
+ "\u02c5\u02cb\u02d0\u02d2\u02d5\u02dc\u02e1\u02f4\u02fc\u0300\u0303\u0309"+
+ "\u030d\u0310\u031a\u0321\u0328\u0334\u033a\u0341\u0346\u034c\u0358\u035e"+
+ "\u0362\u036a\u036e\u0374\u0377\u037d\u0382\u0396\u03b9\u03bb\u03d2\u03da"+
+ "\u03e5\u03ec\u03f3\u03fd\u040b\u0421\u0423\u042b\u042f\u0433\u0436\u043f"+
+ "\u0445\u044f\u0457\u045d\u0466\u0471\u047c\u0480\u0482\u048d\u0496\u049a"+
+ "\u049d\u04a4\u04af\u04b9\u04bf\u04c1\u04cb\u04d5\u04d9\u04dd\u04e1\u04e8"+
+ "\u04f0\u04fb\u04ff\u0503\u050f\u0513\u0517\u051c\u0523\u052a\u053e\u0542"+
+ "\u0546\u054a\u055a\u0560\u0562\u0566\u056a\u056d\u0571\u0573\u0579\u0581"+
+ "\u0586\u0591\u0597\u059e\u05a9\u05ae\u05b2\u05b7\u05bb\u05c3\u05cb\u05d0"+
+ "\u05d3\u05db\u05e3\u05e8\u05ec\u05f0\u05f7\u0614\u061f\u0623\u062b\u062f"+
+ "\u0631\u0639\u0642\u064a\u064f\u065f\u0661\u066a\u0670\u0676\u067a\u0683"+
+ "\u068c\u068f\u0694\u06a6\u06a8\u06ab\u06ae\u06b0\u06be";
public static final ATN _ATN =
new ATNDeserializer().deserialize(_serializedATN.toCharArray());
static {
@@ -12885,4 +12910,4 @@ private boolean eos_sempred(EosContext _localctx, int predIndex) {
_decisionToDFA[i] = new DFA(_ATN.getDecisionState(i), i);
}
}
-}
\ No newline at end of file
+}
diff --git a/src/main/java/viper/gobra/frontend/GobraParserBaseVisitor.java b/src/main/java/viper/gobra/frontend/GobraParserBaseVisitor.java
index 212418151..17069a23c 100644
--- a/src/main/java/viper/gobra/frontend/GobraParserBaseVisitor.java
+++ b/src/main/java/viper/gobra/frontend/GobraParserBaseVisitor.java
@@ -1,4 +1,4 @@
-// Generated from /Users/joao/Code/gobraHome/gobra/src/main/antlr4/GobraParser.g4 by ANTLR 4.9.2
+// Generated from /main/antlr4/GobraParser.g4 by ANTLR 4.9.1
package viper.gobra.frontend;
import org.antlr.v4.runtime.tree.AbstractParseTreeVisitor;
@@ -900,6 +900,13 @@ public class GobraParserBaseVisitor extends AbstractParseTreeVisitor imple
* {@link #visitChildren} on {@code ctx}.
*/
@Override public T visitAssign_op(GobraParser.Assign_opContext ctx) { return visitChildren(ctx); }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation returns the result of calling
+ * {@link #visitChildren} on {@code ctx}.
+ */
+ @Override public T visitRangeClause(GobraParser.RangeClauseContext ctx) { return visitChildren(ctx); }
/**
* {@inheritDoc}
*
@@ -1180,13 +1187,6 @@ public class GobraParserBaseVisitor extends AbstractParseTreeVisitor imple
* {@link #visitChildren} on {@code ctx}.
*/
@Override public T visitForClause(GobraParser.ForClauseContext ctx) { return visitChildren(ctx); }
- /**
- * {@inheritDoc}
- *
- * The default implementation returns the result of calling
- * {@link #visitChildren} on {@code ctx}.
- */
- @Override public T visitRangeClause(GobraParser.RangeClauseContext ctx) { return visitChildren(ctx); }
/**
* {@inheritDoc}
*
@@ -1439,4 +1439,4 @@ public class GobraParserBaseVisitor extends AbstractParseTreeVisitor imple
* {@link #visitChildren} on {@code ctx}.
*/
@Override public T visitEos(GobraParser.EosContext ctx) { return visitChildren(ctx); }
-}
\ No newline at end of file
+}
diff --git a/src/main/java/viper/gobra/frontend/GobraParserVisitor.java b/src/main/java/viper/gobra/frontend/GobraParserVisitor.java
index 7d77b604a..20b91c3b6 100644
--- a/src/main/java/viper/gobra/frontend/GobraParserVisitor.java
+++ b/src/main/java/viper/gobra/frontend/GobraParserVisitor.java
@@ -1,4 +1,4 @@
-// Generated from /Users/joao/Code/gobraHome/gobra/src/main/antlr4/GobraParser.g4 by ANTLR 4.9.2
+// Generated from /main/antlr4/GobraParser.g4 by ANTLR 4.9.1
package viper.gobra.frontend;
import org.antlr.v4.runtime.tree.ParseTreeVisitor;
@@ -804,6 +804,12 @@ public interface GobraParserVisitor extends ParseTreeVisitor {
* @return the visitor result
*/
T visitAssign_op(GobraParser.Assign_opContext ctx);
+ /**
+ * Visit a parse tree produced by {@link GobraParser#rangeClause}.
+ * @param ctx the parse tree
+ * @return the visitor result
+ */
+ T visitRangeClause(GobraParser.RangeClauseContext ctx);
/**
* Visit a parse tree produced by {@link GobraParser#packageClause}.
* @param ctx the parse tree
@@ -1044,12 +1050,6 @@ public interface GobraParserVisitor extends ParseTreeVisitor {
* @return the visitor result
*/
T visitForClause(GobraParser.ForClauseContext ctx);
- /**
- * Visit a parse tree produced by {@link GobraParser#rangeClause}.
- * @param ctx the parse tree
- * @return the visitor result
- */
- T visitRangeClause(GobraParser.RangeClauseContext ctx);
/**
* Visit a parse tree produced by {@link GobraParser#goStmt}.
* @param ctx the parse tree
@@ -1266,4 +1266,4 @@ public interface GobraParserVisitor extends ParseTreeVisitor {
* @return the visitor result
*/
T visitEos(GobraParser.EosContext ctx);
-}
\ No newline at end of file
+}
diff --git a/src/main/scala/viper/gobra/ast/frontend/Ast.scala b/src/main/scala/viper/gobra/ast/frontend/Ast.scala
index ff4571cf5..bfa306d11 100644
--- a/src/main/scala/viper/gobra/ast/frontend/Ast.scala
+++ b/src/main/scala/viper/gobra/ast/frontend/Ast.scala
@@ -269,7 +269,7 @@ case class PForStmt(pre: Option[PSimpleStmt], cond: PExpression, post: Option[PS
case class PAssForRange(range: PRange, ass: Vector[PAssignee], spec: PLoopSpec, body: PBlock) extends PGeneralForStmt with PScope with PGhostifiableStatement
-case class PShortForRange(range: PRange, shorts: Vector[PIdnUnk], spec: PLoopSpec, body: PBlock) extends PGeneralForStmt with PScope with PGhostifiableStatement
+case class PShortForRange(range: PRange, shorts: Vector[PUnkLikeId], addressable: Vector[Boolean], spec: PLoopSpec, body: PBlock) extends PGeneralForStmt with PScope with PGhostifiableStatement
case class PGoStmt(exp: PExpression) extends PActualStatement
@@ -797,7 +797,7 @@ sealed trait PMisc extends PNode
sealed trait PActualMisc extends PMisc
-case class PRange(exp: PExpression) extends PActualMisc
+case class PRange(exp: PExpression, enumerated: PUnkLikeId) extends PActualMisc
sealed trait PParameter extends PMisc {
def typ: PType
diff --git a/src/main/scala/viper/gobra/ast/frontend/PrettyPrinter.scala b/src/main/scala/viper/gobra/ast/frontend/PrettyPrinter.scala
index d6e5074be..a87260f33 100644
--- a/src/main/scala/viper/gobra/ast/frontend/PrettyPrinter.scala
+++ b/src/main/scala/viper/gobra/ast/frontend/PrettyPrinter.scala
@@ -245,8 +245,8 @@ class DefaultPrettyPrinter extends PrettyPrinter with kiama.output.PrettyPrinter
})
case PAssForRange(range, ass, spec, body) =>
showSpec(spec) <> "for" <+> showExprList(ass) <+> "=" <+> showRange(range) <+> block(showStmt(body))
- case PShortForRange(range, shorts, spec, body) =>
- showSpec(spec) <> "for" <+> showIdList(shorts) <+> ":=" <+> showRange(range) <+> block(showStmt(body))
+ case PShortForRange(range, shorts, addressable, spec, body) =>
+ showSpec(spec) <> "for" <+> showList(shorts zip addressable){ case (l, a) => showAddressable(a, l) } <+> ":=" <+> showRange(range) <+> block(showStmt(body))
case PGoStmt(exp) => "go" <+> showExpr(exp)
case PSelectStmt(send, rec, aRec, sRec, dflt) =>
"select" <+> block(
@@ -324,7 +324,10 @@ class DefaultPrettyPrinter extends PrettyPrinter with kiama.output.PrettyPrinter
"case" <+> showIdList(shorts) <+> "=" <+> showExpr(recv) <> ":" <> showNestedStmtList(body.stmts)
}
- def showRange(n: PRange): Doc = "range" <+> showExpr(n.exp)
+ def showRange(n: PRange): Doc = n.enumerated match {
+ case _: PWildcard => "range" <+> showExpr(n.exp)
+ case _ => "range" <+> showExpr(n.exp) <+> "with" <+> showId(n.enumerated)
+ }
// expressions
diff --git a/src/main/scala/viper/gobra/frontend/Desugar.scala b/src/main/scala/viper/gobra/frontend/Desugar.scala
index 3316b2989..5ddf9653a 100644
--- a/src/main/scala/viper/gobra/frontend/Desugar.scala
+++ b/src/main/scala/viper/gobra/frontend/Desugar.scala
@@ -172,6 +172,8 @@ object Desugar {
private val nm = new NameManager
+ private val MapExhalePermDenom = 1000000
+
type Identity = (Meta, TypeInfo)
private def abstraction(id: PIdnNode, info: TypeInfo): Identity = {
@@ -970,6 +972,514 @@ object Desugar {
}
}
+ def leftOfAssignmentNoInit(idn: PIdnNode, info: TypeInfo)(t: in.Type): in.LocalVar = {
+ idn match {
+ case _: PWildcard => in.LocalVar(nm.fresh(idn, info), t)(meta(idn, info))
+
+ case _ =>
+ assignableVarD(ctx, info)(idn) match {
+ case Left(v) => v.asInstanceOf[in.LocalVar]
+ case Right(v) => violation(s"Expected an assignable variable, but got $v instead")
+ }
+ }
+ }
+
+ /**
+ * This case handles for loops with a range clause of the form:
+ *
+ *
+ * // i0 here is an int variable starting from 0 and used at the
+ * // encoded loop condition
+ * for i, j := range x with i0 {
+ * body
+ * }
+ *
+ * In the case where x is a slice or array the following code is produced. Note
+ * that everything is in a new block so it can shadow variables with the same
+ * name declared outside. This is also the go behaviour.
+ *
+ * c := x // save the value of the slice/array since changing it doesn't change the iteration
+ * length := len(x)
+ *
+ * if (length == 0) {
+ * havoc i
+ * assume i0 == i
+ * havoc j // [v]
+ * assert
+ * } else {
+ * var i int = 0
+ * var i0 int = 0 // since 'i' can change in the iteration we store the true index in i0
+ * var j T = c[0] // [v]
+ * invariant 0 <= i0 && i0 <= len(c)
+ * invariant i0 < len(c) ==> i0 == i && j == c[i0] // [v] just the j == c[i0] part
+ *
+ * for i0 < length {
+ *
+ * i0 += 1
+ * if i0 < len(c) { i = i0 ; j = c[i] /* [v] */ }
+ * }
+ * }
+ *
+ * In the case where the value variable 'j' is missing all the code annotated with [v]
+ * is omitted
+ */
+ def desugarArrSliceShortRange(n: PShortForRange, range: PRange, shorts: Vector[PUnkLikeId], spec: PLoopSpec, body: PBlock)(src: Source.Parser.Info): Writer[in.Stmt] = unit(block(for {
+ exp <- goE(range.exp)
+
+ (elemType, typ) = underlyingType(exp.typ) match {
+ case s: in.SliceT => (s.elems, s)
+ case a: in.ArrayT => (a.elems, a)
+ case _ => violation("Expected slice or array in for-range statement")
+ }
+
+ rangeExpSrc = meta(range.exp, info)
+ iSrc = meta(shorts(0), info)
+
+ hasValue = shorts.length > 1 && !(shorts(1).isInstanceOf[PWildcard])
+
+ jSrc = if (hasValue) meta(shorts(1), info) else src
+
+ c <- freshDeclaredExclusiveVar(exp.typ.withAddressability(Addressability.exclusiveVariable), n, info)(rangeExpSrc)
+ length <- freshDeclaredExclusiveVar(in.IntT(Addressability.exclusiveVariable), n, info)(rangeExpSrc)
+
+ i = leftOfAssignmentNoInit(shorts(0), info)(in.IntT(Addressability.exclusiveVariable))
+ _ <- declare(i)
+ j = if (hasValue) leftOfAssignmentNoInit(shorts(1), info)(elemType) else i
+
+ _ <- if (hasValue) declare(j) else unit(in.Seqn(Vector())(src))
+ i0 = leftOfAssignmentNoInit(range.enumerated, info)(in.IntT(Addressability.exclusiveVariable))
+ _ <- declare(i0)
+
+ (dTerPre, dTer) <- prelude(option(spec.terminationMeasure map terminationMeasureD(ctx, info)))
+ (dInvPre, dInv) <- prelude(sequence(spec.invariants map assertionD(ctx, info)))
+ addedInvariantsBefore = Vector(
+ in.ExprAssertion(in.And(
+ in.AtMostCmp(in.IntLit(0)(src), i0)(src),
+ in.AtMostCmp(i0, in.Length(c)(src))(src))(src))(src),
+ in.Implication(
+ in.LessCmp(i0, in.Length(c)(src))(src),
+ in.ExprAssertion(in.EqCmp(i0, i)(src))(src))(src)
+ )
+ indexValueSrc = meta(range.exp, info).createAnnotatedInfo(Source.NoPermissionToRangeExpressionAnnotation())
+ addedInvariantsAfter = (if (hasValue) Vector(
+ in.Implication(
+ in.LessCmp(i0, in.Length(c)(src))(src),
+ in.ExprAssertion(in.EqCmp(j, in.IndexedExp(c, i0, typ)(indexValueSrc))(indexValueSrc))(indexValueSrc))(indexValueSrc))
+ else
+ Vector())
+
+ dBody = blockD(ctx, info)(body)
+
+ // handle break and continue labels
+ continueLabelName = nm.continueLabel(n, info)
+ continueLoopLabelProxy = in.LabelProxy(continueLabelName)(src)
+ continueLoopLabel = in.Label(continueLoopLabelProxy)(src)
+
+ breakLabelName = nm.breakLabel(n, info)
+ breakLoopLabelProxy = in.LabelProxy(breakLabelName)(src)
+ _ <- declare(breakLoopLabelProxy)
+ breakLoopLabel = in.Label(breakLoopLabelProxy)(src)
+
+ enc = in.Seqn(Vector(
+ // c := x
+ singleAss(in.Assignee.Var(c), exp)(rangeExpSrc),
+ // length := len(c) to save for later since it can change
+ singleAss(in.Assignee.Var(length), in.Length(c)(src))(src),
+ in.If(
+ in.EqCmp(length, in.IntLit(0)(src))(src),
+ in.Seqn(Vector(
+ // assume i == i0
+ in.Assume(in.ExprAssertion(in.EqCmp(i, i0)(src))(src))(src)
+ ) ++
+ // assert
+ (spec.invariants zip dInv).map[in.Stmt]((x: (PExpression, in.Assertion)) => in.Assert(x._2)(meta(x._1, info).createAnnotatedInfo(Source.LoopInvariantNotEstablishedAnnotation))))(src),
+ in.Seqn(Vector(
+ // i = 0
+ in.Initialization(i)(src),
+ singleAss(in.Assignee.Var(i), in.IntLit(0)(src))(iSrc),
+ // i0 = 0
+ in.Initialization(i0)(src),
+ singleAss(in.Assignee.Var(i0), in.IntLit(0)(src))(src)) ++
+ // j = c[0]
+ (if (hasValue)
+ Vector(in.Initialization(j)(src), singleAss(in.Assignee.Var(j), in.IndexedExp(c, in.IntLit(0)(src), typ)(src))(jSrc))
+ else Vector()) ++
+ dInvPre ++ dTerPre ++ Vector(
+ in.While(
+ in.LessCmp(i0, length)(src),
+ addedInvariantsBefore ++ dInv ++ addedInvariantsAfter,
+ dTer,
+ in.Block(Vector(continueLoopLabelProxy),
+ Vector(
+ dBody,
+ continueLoopLabel,
+ //i0 += 1
+ singleAss(in.Assignee.Var(i0), in.Add(i0, in.IntLit(1)(src))(src))(src),
+ // if i0 < len(c) { i = i0; j = c[i] }
+ in.If(
+ in.LessCmp(i0, length)(src),
+ in.Seqn(Vector(singleAss(in.Assignee.Var(i), i0)(src)) ++
+ (if (hasValue) Vector(singleAss(in.Assignee.Var(j), in.IndexedExp(c, i, typ)(src))(src)) else Vector()))(src),
+ in.Seqn(Vector())(src))(src)
+ ) ++
+ dInvPre ++
+ dTerPre
+ )(src))(src), breakLoopLabel
+ )
+ )(src)
+ )(src)))(src)
+ } yield enc))
+
+ /**
+ * This case handles for loops with a range clause of the form:
+ *
+ *
+ * for i, j = range x with i0 {
+ * body
+ * }
+ *
+ * In the case where x is a slice or array the following code is produced. Note
+ * that everything is in a new block so it can shadow variables with the same
+ * name declared outside. This is also the go behaviour.
+ *
+ * c := x // save the value of the slice/array since changing it doesn't change the iteration
+ * length := len(c)
+ *
+ * if (length == 0) {
+ * havoc i
+ * assume i0 == i
+ * havoc j // [v]
+ * assert
+ * } else {
+ * var i int = 0
+ * var i0 int = 0 // since 'i' can change in the iteration we store the true index in i0
+ * var j T = c[0] // [v]
+ * invariant 0 <= i0 && i0 <= len(c)
+ * invariant i0 < len(c) ==> i0 == i && j == c[i0] // [v] just the j == c[i0] part
+ *
+ * for i0 < length {
+ *
+ * i0 += 1
+ * if i0 < len(c) { i = i0 ; j = c[i] /* [v] */ }
+ * }
+ * }
+ *
+ * In the case where the value variable 'j' is missing all the code annotated with [v]
+ * is omitted
+ */
+ def desugarArrSliceAssRange(n: PAssForRange, range: PRange, ass: Vector[PAssignee], spec: PLoopSpec, body: PBlock)(src: Source.Parser.Info): Writer[in.Stmt] = unit(block(for {
+ exp <- goE(range.exp)
+
+ (elemType, typ) = underlyingType(exp.typ) match {
+ case s: in.SliceT => (s.elems, s)
+ case a: in.ArrayT => (a.elems, a)
+ case _ => violation("Expected slice or array in for-range statement")
+ }
+
+ rangeExpSrc = meta(range.exp, info)
+
+ hasValue = ass.length > 1 && !(ass(1).isInstanceOf[PBlankIdentifier])
+
+ c <- freshDeclaredExclusiveVar(exp.typ.withAddressability(Addressability.exclusiveVariable), n, info)(rangeExpSrc)
+ length <- freshDeclaredExclusiveVar(in.IntT(Addressability.exclusiveVariable), n, info)(rangeExpSrc)
+
+ i <- goL(ass(0))
+ j <- if (hasValue) goL(ass(1)) else unit(in.Assignee.Var(c))
+
+ i0 = leftOfAssignmentNoInit(range.enumerated, info)(in.IntT(Addressability.exclusiveVariable))
+ _ <- declare(i0)
+
+ (dTerPre, dTer) <- prelude(option(spec.terminationMeasure map terminationMeasureD(ctx, info)))
+ (dInvPre, dInv) <- prelude(sequence(spec.invariants map assertionD(ctx, info)))
+ addedInvariantsBefore = Vector(
+ in.ExprAssertion(in.And(
+ in.AtMostCmp(in.IntLit(0)(src), i0)(src),
+ in.AtMostCmp(i0, in.Length(c)(src))(src))(src))(src)
+ )
+ indexValueSrc = meta(range.exp, info).createAnnotatedInfo(Source.NoPermissionToRangeExpressionAnnotation())
+ addedInvariantsAfter = (if (hasValue) Vector(
+ in.Implication(
+ in.LessCmp(i0, in.Length(c)(src))(src),
+ in.ExprAssertion(in.EqCmp(i0, i.op)(src))(src))(src),
+ in.Implication(
+ in.LessCmp(i0, in.Length(c)(src))(src),
+ in.ExprAssertion(in.EqCmp(j.op, in.IndexedExp(c, i0, typ)(indexValueSrc))(indexValueSrc))(indexValueSrc))(indexValueSrc))
+ else
+ Vector(
+ in.Implication(
+ in.LessCmp(i0, in.Length(c)(src))(src),
+ in.ExprAssertion(in.EqCmp(i0, i.op)(src))(src))(src)))
+
+ dBody = blockD(ctx, info)(body)
+
+ // handle break and continue labels
+ continueLabelName = nm.continueLabel(n, info)
+ continueLoopLabelProxy = in.LabelProxy(continueLabelName)(src)
+ continueLoopLabel = in.Label(continueLoopLabelProxy)(src)
+
+ breakLabelName = nm.breakLabel(n, info)
+ breakLoopLabelProxy = in.LabelProxy(breakLabelName)(src)
+ _ <- declare(breakLoopLabelProxy)
+ breakLoopLabel = in.Label(breakLoopLabelProxy)(src)
+
+ enc = in.Seqn(Vector(
+ // c := x
+ singleAss(in.Assignee.Var(c), exp)(rangeExpSrc),
+ // length := len(c) to save for later since it can change
+ singleAss(in.Assignee.Var(length), in.Length(c)(src))(src),
+ in.If(
+ in.EqCmp(length, in.IntLit(0)(src))(src),
+ in.Seqn(
+ // assert
+ (spec.invariants zip dInv).map[in.Stmt]((x: (PExpression, in.Assertion)) => in.Assert(x._2)(meta(x._1, info).createAnnotatedInfo(Source.LoopInvariantNotEstablishedAnnotation))))(src),
+ in.Seqn(Vector(
+ // c := x
+ singleAss(in.Assignee.Var(c), exp)(rangeExpSrc),
+ // i = 0
+ singleAss(i, in.IntLit(0)(src))(src),
+ // i0 = 0
+ singleAss(in.Assignee.Var(i0), in.IntLit(0)(src))(src)) ++
+ // j = c[0]
+ (if (hasValue)
+ Vector(singleAss(j, in.IndexedExp(c, in.IntLit(0)(src), typ)(src))(src))
+ else Vector()) ++
+ dInvPre ++ dTerPre ++ Vector(
+ in.While(
+ in.LessCmp(i0, length)(src),
+ addedInvariantsBefore ++ dInv ++ addedInvariantsAfter,
+ dTer,
+ in.Block(Vector(continueLoopLabelProxy),
+ Vector(
+ dBody,
+ continueLoopLabel,
+ //i0 += 1
+ singleAss(in.Assignee.Var(i0), in.Add(i0, in.IntLit(1)(src))(src))(src),
+ // if i0 < len(c) { i = i0; j = c[i] }
+ in.If(
+ in.LessCmp(i0, length)(src),
+ in.Seqn(Vector(singleAss(i, i0)(src)) ++
+ (if (hasValue) Vector(singleAss(j, in.IndexedExp(c, i.op, typ)(src))(src)) else Vector()))(src),
+ in.Seqn(Vector())(src))(src)
+ ) ++
+ dInvPre ++
+ dTerPre
+ )(src))(src), breakLoopLabel
+ )
+ )(src)
+ )(src)))(src)
+ } yield enc))
+
+ /**
+ * This case handles for loops with a range clause of a map expression of the form:
+ *
+ *
+ * // visited here is a set containing the already visited keys in the map
+ * for k, v := range x with visited {
+ * body
+ * }
+ *
+ * The following code is produced. Note
+ * that everything is in a new block so it can shadow variables with the same
+ * name declared outside. This is also the go behaviour.
+ *
+ * c := x
+ *
+ * if (|c| == 0) {
+ * var k : T1
+ * var v : T2 // [v]
+ * var visited : Set[T1]
+ * assert
+ * }
+ * else {
+ * var k : T1
+ * var v : T2 // [v]
+ * inhale k in domain(c)
+ * v := c[k] // [v]
+ * var visited : Set[T1] := Set()
+ * assert 0 / 1 < per // check if permission provided by user is valid
+ * while (|visited| < |domain(c)|)
+ * invariant |visited| < |domain(c)| ==> k in domain(x) && v == c[k] // [v]
+ * invariant |visited| <= |domain(c)|
+ * invariant visited subset domain(c)
+ *
+ * {
+ * var key : T1
+ * inhale key in domain(c) && !(key in visited)
+ * k := key
+ * v := x[k] // [v]
+ * exhale acc(x, 1/100000)
+ *
+ * inhale acc(x, 1/100000)
+ * visited := visited union Set(k)
+ *
+ * In the case where the value variable 'v' is missing all the code annotated with [v]
+ * is omitted
+ */
+ def desugarMapShortRange(n: PShortForRange, range: PRange, shorts: Vector[PUnkLikeId], spec: PLoopSpec, body: PBlock)(src: Source.Parser.Info): Writer[in.Stmt] = unit(block(for {
+ exp <- goE(range.exp)
+
+ c <- freshDeclaredExclusiveVar(exp.typ.withAddressability(Addressability.exclusiveVariable), n, info)(src)
+
+ (keyType, valType) = underlyingType(exp.typ) match {
+ case in.MapT(k, v, _) => (k.withAddressability(Addressability.exclusiveVariable), v.withAddressability(Addressability.exclusiveVariable))
+ case _ => violation("unexpected type of range expression")
+ }
+ visType = in.SetT(keyType, Addressability.exclusiveVariable)
+
+ domain = in.MapKeys(c, underlyingType(exp.typ))(src)
+
+ visited <- leftOfAssignmentD(range.enumerated, info)(in.SetT(keyType, Addressability.exclusiveVariable))
+
+ perm <- freshDeclaredExclusiveVar(in.PermissionT(Addressability.exclusiveVariable), n, info)(src)
+
+ initPerm = singleAss(in.Assignee.Var(perm), in.PermLit(1, MapExhalePermDenom)(src))(src)
+
+ exhSrc = meta(range.exp, info).createAnnotatedInfo(Source.InsufficientPermissionToRangeExpressionAnnotation())
+
+ // exhale acc(x, p)
+ exhalePerm = in.Exhale(in.Access(in.Accessible.ExprAccess(c), perm)(exhSrc))(exhSrc)
+ inhalePerm = in.Inhale(in.Access(in.Accessible.ExprAccess(c), perm)(exhSrc))(src)
+
+ hasValue = shorts.length > 1 && !(shorts(1).isInstanceOf[PWildcard])
+
+ (dTerPre, dTer) <- prelude(option(spec.terminationMeasure map terminationMeasureD(ctx, info)))
+ (dInvPre, dInv) <- prelude(sequence(spec.invariants map assertionD(ctx, info)))
+ indexValueSrc = meta(range.exp, info).createAnnotatedInfo(Source.NoPermissionToRangeExpressionAnnotation())
+ addedInvariants = Vector(
+ in.ExprAssertion(in.AtMostCmp(in.Length(visited.op)(src), in.Length(c)(src))(src))(src),
+ in.ExprAssertion(in.Subset(visited.op, domain)(src))(src))
+
+ dBody = blockD(ctx, info)(body)
+
+ // handle break and continue labels
+ continueLabelName = nm.continueLabel(n, info)
+ continueLoopLabelProxy = in.LabelProxy(continueLabelName)(src)
+ continueLoopLabel = in.Label(continueLoopLabelProxy)(src)
+
+ breakLabelName = nm.breakLabel(n, info)
+ breakLoopLabelProxy = in.LabelProxy(breakLabelName)(src)
+ _ <- declare(breakLoopLabelProxy)
+ breakLoopLabel = in.Label(breakLoopLabelProxy)(src)
+
+ visitedEqDomain = in.Assert(in.ExprAssertion(in.EqCmp(
+ in.SetMinus(visited.op, domain)(src),
+ in.SetLit(keyType, Vector.empty)(src)
+ )(src))(src))(src)
+
+ k = leftOfAssignmentNoInit(shorts(0), info)(keyType)
+ v = if (hasValue) leftOfAssignmentNoInit(shorts(1), info)(valType) else k
+
+ updateKeyVal = in.Seqn(Vector(
+ in.Inhale(in.ExprAssertion(in.And(
+ in.Contains(k, domain)(src),
+ in.Negation(in.Contains(k, visited.op)(src))(src))(src))(src))(src)
+ ) ++ (if (hasValue) Vector(in.Initialization(v)(src), singleAss(in.Assignee.Var(v), in.IndexedExp(c, k, underlyingType(exp.typ))(src))(src)) else Vector()))(src)
+
+ updateVisited = singleAss(visited, in.Union(visited.op, in.SetLit(keyType, Vector(k))(src))(src))(src)
+
+ enc = in.Seqn(Vector(
+ singleAss(in.Assignee.Var(c), exp)(src),
+ in.If(
+ in.EqCmp(in.Length(c)(src), in.IntLit(0)(src))(src),
+ in.Seqn(
+ // assert
+ (spec.invariants zip dInv).map[in.Stmt]((x: (PExpression, in.Assertion)) => in.Assert(x._2)(meta(x._1, info).createAnnotatedInfo(Source.LoopInvariantNotEstablishedAnnotation))))(src),
+ in.Seqn(
+ dInvPre ++ dTerPre ++ Vector(
+ initPerm,
+ in.While(
+ in.LessCmp(in.Length(visited.op)(src), in.Length(c)(src))(src),
+ dInv ++ addedInvariants, dTer, in.Block(Vector(continueLoopLabelProxy, k) ++ (if (hasValue) Vector(v) else Vector()),
+ Vector(exhalePerm, updateKeyVal, dBody, continueLoopLabel, inhalePerm, updateVisited) ++ dInvPre ++ dTerPre
+ )(src))(src), visitedEqDomain, breakLoopLabel
+ ))(src)
+ )(src)))(src)
+
+ } yield enc))
+
+ def desugarMapAssRange(n: PAssForRange, range: PRange, ass: Vector[PAssignee], spec: PLoopSpec, body: PBlock)(src: Source.Parser.Info): Writer[in.Stmt] = unit(block(for {
+ exp <- goE(range.exp)
+
+ (keyType, valType) = underlyingType(exp.typ) match {
+ case in.MapT(k, v, _) => (k.withAddressability(Addressability.exclusiveVariable), v.withAddressability(Addressability.exclusiveVariable))
+ case _ => violation("unexpected type of range expression")
+ }
+ visType = in.SetT(keyType, Addressability.exclusiveVariable)
+
+ c <- freshDeclaredExclusiveVar(exp.typ.withAddressability(Addressability.exclusiveVariable), n, info)(src)
+
+ domain = in.MapKeys(c, underlyingType(exp.typ))(src)
+
+ visited <- leftOfAssignmentD(range.enumerated, info)(in.SetT(keyType, Addressability.exclusiveVariable))
+
+ perm <- freshDeclaredExclusiveVar(in.PermissionT(Addressability.exclusiveVariable), n, info)(src)
+
+ initPerm = singleAss(in.Assignee.Var(perm), in.PermLit(1, MapExhalePermDenom)(src))(src)
+
+ exhSrc = meta(range.exp, info).createAnnotatedInfo(Source.InsufficientPermissionToRangeExpressionAnnotation())
+
+ // exhale acc(x, p)
+ exhalePerm = in.Exhale(in.Access(in.Accessible.ExprAccess(c), perm)(exhSrc))(exhSrc)
+ inhalePerm = in.Inhale(in.Access(in.Accessible.ExprAccess(c), perm)(exhSrc))(src)
+
+ hasValue = ass.length > 1 && !(ass(1).isInstanceOf[PBlankIdentifier])
+
+ (dTerPre, dTer) <- prelude(option(spec.terminationMeasure map terminationMeasureD(ctx, info)))
+ (dInvPre, dInv) <- prelude(sequence(spec.invariants map assertionD(ctx, info)))
+ indexValueSrc = meta(range.exp, info).createAnnotatedInfo(Source.NoPermissionToRangeExpressionAnnotation())
+ addedInvariants = Vector(
+ in.ExprAssertion(in.AtMostCmp(in.Length(visited.op)(src), in.Length(c)(src))(src))(src),
+ in.ExprAssertion(in.Subset(visited.op, domain)(src))(src))
+
+ dBody = blockD(ctx, info)(body)
+
+ // handle break and continue labels
+ continueLabelName = nm.continueLabel(n, info)
+ continueLoopLabelProxy = in.LabelProxy(continueLabelName)(src)
+ continueLoopLabel = in.Label(continueLoopLabelProxy)(src)
+
+ breakLabelName = nm.breakLabel(n, info)
+ breakLoopLabelProxy = in.LabelProxy(breakLabelName)(src)
+ _ <- declare(breakLoopLabelProxy)
+ breakLoopLabel = in.Label(breakLoopLabelProxy)(src)
+
+ visitedEqDomain = in.Assert(in.ExprAssertion(in.EqCmp(
+ in.SetMinus(visited.op, domain)(src),
+ in.SetLit(keyType, Vector.empty)(src)
+ )(src))(src))(src)
+
+ tempk = in.LocalVar(nm.fresh(n, info), keyType)(src)
+ k <- goL(ass(0))
+ v <- if (hasValue) goL(ass(1)) else unit(in.Assignee.Var(perm))
+
+ updateKeyVal = in.Seqn(Vector(
+ in.Inhale(in.ExprAssertion(in.And(
+ in.Contains(tempk, domain)(src),
+ in.Negation(in.Contains(tempk, visited.op)(src))(src))(src))(src))(src),
+ singleAss(k, tempk)(src)
+ ) ++ (if (hasValue) Vector(singleAss(v, in.IndexedExp(c, k.op, underlyingType(exp.typ))(src))(src)) else Vector()))(src)
+
+ updateVisited = singleAss(visited, in.Union(visited.op, in.SetLit(keyType, Vector(k.op))(src))(src))(src)
+
+ enc = in.Seqn(Vector(
+ singleAss(in.Assignee.Var(c), exp)(src),
+ in.If(
+ in.EqCmp(in.Length(c)(src), in.IntLit(0)(src))(src),
+ in.Seqn(
+ // assert
+ (spec.invariants zip dInv).map[in.Stmt]((x: (PExpression, in.Assertion)) => in.Assert(x._2)(meta(x._1, info).createAnnotatedInfo(Source.LoopInvariantNotEstablishedAnnotation))))(src),
+ in.Seqn(
+ dInvPre ++ dTerPre ++ Vector(
+ initPerm,
+ in.While(
+ in.LessCmp(in.Length(visited.op)(src), in.Length(c)(src))(src),
+ dInv ++ addedInvariants, dTer, in.Block(Vector(continueLoopLabelProxy, tempk),
+ Vector(exhalePerm, updateKeyVal, dBody, continueLoopLabel, inhalePerm, updateVisited) ++ dInvPre ++ dTerPre
+ )(src))(src), visitedEqDomain, breakLoopLabel
+ ))(src)
+ )(src)))(src)
+ } yield enc))
+
val result = stmt match {
case NoGhost(noGhost) => noGhost match {
case _: PEmptyStmt => unit(in.Seqn(Vector.empty)(src))
@@ -1312,328 +1822,19 @@ object Desugar {
case n@PBreak(label) => unit(in.Break(label.map(x => x.name), nm.fetchBreakLabel(n, info))(src))
- /**
- * This case handles for loops with a range clause of the form:
- *
- *
- * for i, j := range x {
- * body
- * }
- *
- * In the case where x is a slice or array the following code is produced. Note
- * that everything is in a new block so it can shadow variables with the same
- * name declared outside. This is also the go behaviour.
- *
- * var i int = 0
- * var i0 int = 0 // since 'i' can change in the iteration we store the true index in i0
- * var j elem(x) // [v] the type of the elements of x
- *
- * c := x // save the value of the slice/array since changing it doesn't change the iteration
- *
- * if (0 <= i && i < len(c)) { // [v]
- * j = c[i]
- * }
- *
- * invariant len(c) > 0 ==> 0 <= i0 && i0 <= len(c) // these invariants do not
- * invariant len(c) > 0 ==> i == i0 // require access to anything so they
- * invariant len(c) > 0 ==> 0 <= i && i <= len(c) // are added before the user invariants
- * 0) and j with f(j, len(c) > 0)>
- * invariant len(c) > 0 ==> (0 <= i && i < len(c) ==> j == c[i]) // [v]
- * for i < len(c) {
- *
- * i0 += 1
- * i = i0
- * if (0 <= i && i < len(c)) { // [v]
- * j = c[i]
- * }
- * }
- *
- * In the case where the value variable 'j' is missing all the code annotated with [v]
- * is omitted
- *
- * Function f is the identity function regarding its first argument with a precondition
- * stating that the second argument must be true.
- *
- * requires b
- * decreases _
- * pure func f(x: , b: bool) { x }
- *
- * It is needed because in the occation of empty slices or arrays, i and j should not exist.
- * Replacing them with the call to this function will cause its precondition to fail for
- * empty slices or arrays and thus produce the error which is then transformed to the
- * desirable one.
- */
- case n@PShortForRange(range, shorts, spec, body) =>
- // is a block as it introduces new variables
- unit(block(for {
- exp <- goE(range.exp)
- (elems, typ) = underlyingType(exp.typ) match {
- case slice : in.SliceT => (slice.elems, slice)
- case array : in.ArrayT => (array.elems, array)
- case _ : in.MapT => violation("Maps are not supported yet in range")
- case _ : in.StringT => violation("Strings are not supported yet in range")
- case t => violation(s"Range not applicable to type $t")
- }
+ case n@PShortForRange(range, shorts, _, spec, body) =>
+ underlyingType(info.typ(range.exp)) match {
+ case _: SliceT | _: ArrayT => desugarArrSliceShortRange(n, range, shorts, spec, body)(src)
+ case _: MapT => desugarMapShortRange(n, range, shorts, spec, body)(src)
+ case t => violation(s"Type $t not supported as a range expression")
+ }
- // index is the place where we store the indices of the range expression
- rangeSrc = meta(range, info)
- rangeExpSrc = meta(range.exp, info)
- indexSrc = meta(shorts(0), info)
-
- indexLeft <- leftOfAssignmentD(shorts(0), info)(in.IntT(Addressability.exclusiveVariable))
- copiedIndexVar <- freshDeclaredExclusiveVar(in.IntT(Addressability.exclusiveVariable), n, info)(rangeExpSrc)
- copyIndexAss = singleAss(in.Assignee.Var(copiedIndexVar), in.IntLit(0)(indexSrc))(rangeExpSrc)
- incrCopiedIndex = singleAss(in.Assignee.Var(copiedIndexVar), in.Add(copiedIndexVar, in.IntLit(1)(indexSrc))(indexSrc))(indexSrc)
-
- indexVar = in.Assignee.Var(indexLeft.op.asInstanceOf[in.AssignableVar])
- incrIndex = singleAss(indexVar, copiedIndexVar)(indexSrc)
- indexAss = singleAss(indexVar, in.IntLit(0)(rangeSrc))(indexSrc)
-
- // in go the range expression is only computed once before the iteration begins
- // we do that by storing it in copiedVar
- // this also ensures that the elements iterated through do not change
- // even if the range expression is modified in the loop body
- copiedVar <- freshDeclaredExclusiveVar(exp.typ, n, info)(rangeExpSrc)
- copyAss = singleAss(in.Assignee.Var(copiedVar), exp)(rangeExpSrc)
-
- // get the length of the expression
- length = in.Length(copiedVar)(rangeSrc)
- cond = in.LessCmp(indexLeft.op, length)(rangeSrc)
-
- // this invariant states that the index variable has the same value as the hidden index variable always
- copiedIndexEqualsIndexInv = in.Implication(
- in.LessCmp(in.IntLit(0)(indexSrc), length)(indexSrc),
- in.ExprAssertion(in.EqCmp(indexLeft.op, copiedIndexVar)(rangeSrc))(rangeSrc))(rangeSrc)
-
- // this invariant states that the hidden index stays within 0 and the length of the array/slice (both inclusive)
- copiedIndexBoundsInv = in.Implication(
- in.LessCmp(in.IntLit(0)(indexSrc), length)(indexSrc),
- in.ExprAssertion(in.And(
- in.AtMostCmp(in.IntLit(0)(rangeSrc), copiedIndexVar)(rangeSrc),
- in.AtMostCmp(copiedIndexVar, length)(rangeSrc))(rangeSrc))(rangeSrc))(rangeSrc)
-
- // this invariant states that the index is between 0 and the length of the array/slice (both inclusive)
- indexBoundsInv = in.Implication(
- in.LessCmp(in.IntLit(0)(indexSrc), length)(indexSrc),
- in.ExprAssertion(in.And(
- in.AtMostCmp(in.IntLit(0)(rangeSrc), indexLeft.op)(rangeSrc),
- in.AtMostCmp(indexLeft.op, length)(rangeSrc))(rangeSrc))(rangeSrc))(rangeSrc)
-
- (dTerPre, dTer) <- prelude(option(spec.terminationMeasure map terminationMeasureD(ctx, info)))
-
- dBody = blockD(ctx, info)(body)
-
- continueLabelName = nm.continueLabel(n, info)
- continueLoopLabelProxy = in.LabelProxy(continueLabelName)(src)
- continueLoopLabel = in.Label(continueLoopLabelProxy)(src)
-
- breakLabelName = nm.breakLabel(n, info)
- breakLoopLabelProxy = in.LabelProxy(breakLabelName)(src)
- _ <- declare(breakLoopLabelProxy)
- breakLoopLabel = in.Label(breakLoopLabelProxy)(src)
-
- wh = if (shorts.length == 2) {
- // in this case we know that the loop looks like this:
- // for i, j := range x { ...
- // until now we have only created the variable i since it is not mandatory for j to exist
- // if it does, we have to declare it and add the code that will update it in each iteration
- // which looks like this:
- // if (0 <= i && i < length(x)) { j = x[i] }
- // note that this will happen after we have incremented i
- val valueSrc = meta(shorts(1), info)
- val valueLeft = assignableVarD(ctx, info)(shorts(1)) match {
- case Left(n) => n
- case Right(n) => n
- }
- val valueVar = in.Assignee.Var(valueLeft.asInstanceOf[in.AssignableVar])
- val valueAss = singleAss(valueVar, in.IndexedExp(copiedVar, indexLeft.op, typ)(valueSrc))(valueSrc)
- val updateValue = in.If(in.And(cond, in.AtLeastCmp(indexLeft.op, in.IntLit(0)(valueSrc))(valueSrc))(valueSrc), valueAss, in.Seqn(Vector())(valueSrc))(valueSrc)
-
- val invCtx = ctx.copyWithExpD{
- case n@PNamedOperand(_@PIdnUse(name)) if name == shorts(0).name =>
- val invSrc = meta(info.enclosingInvariantNode(n), info).createAnnotatedInfo(Source.RangeVariableMightNotExistAnnotation(range.exp.toString()))
- Some(unit(conditionalId(indexLeft.op, in.LessCmp(in.IntLit(0)(invSrc), length)(invSrc), in.IntT(Addressability.exclusiveVariable))(invSrc)))
- case n@PNamedOperand(_@PIdnUse(name)) if name == shorts(1).name =>
- val invSrc = meta(info.enclosingInvariantNode(n), info).createAnnotatedInfo(Source.RangeVariableMightNotExistAnnotation(range.exp.toString()))
- Some(unit(conditionalId(valueLeft, in.LessCmp(in.IntLit(0)(invSrc), length)(invSrc), elems)(invSrc)))
- case _ => None
- }
- val (dInvPre, dInv) = prelude(sequence(spec.invariants map assertionD(invCtx, info))).res
- // we also need an invariant that states that
- // for index i and value j and range expression x
- // invariant len(c) > 0 ==> 0 <= i && i < len(x) ==> j == x[i]
- val indexValueSrc = meta(range, info).createAnnotatedInfo(Source.NoPermissionToRangeExpressionAnnotation())
- val indexValueEq = in.Implication(
- in.LessCmp(in.IntLit(0)(indexSrc), length)(indexSrc),
- in.Implication(
- in.And(
- in.AtMostCmp(in.IntLit(0)(indexSrc), indexLeft.op)(indexSrc),
- in.LessCmp(indexLeft.op, length)(indexSrc))(indexSrc),
- in.ExprAssertion(in.EqCmp(in.IndexedExp(copiedVar, indexLeft.op, typ)(rangeExpSrc), valueLeft)(rangeExpSrc))(rangeExpSrc)
- )(rangeSrc))(indexValueSrc)
- in.Block(
- Vector(valueLeft.asInstanceOf[in.LocalVar]),
- Vector(copyAss, indexAss, copyIndexAss, updateValue) ++ dInvPre ++ dTerPre ++ Vector(
- in.While(cond, Vector(copiedIndexBoundsInv, copiedIndexEqualsIndexInv, indexBoundsInv) ++ dInv ++ Vector(indexValueEq), dTer, in.Block(Vector(continueLoopLabelProxy),
- Vector(dBody, continueLoopLabel, incrCopiedIndex, incrIndex, updateValue) ++ dInvPre ++ dTerPre
- )(src))(src), breakLoopLabel
- )
- )(src)
- } else {
- // else we do not have a value variable and the while loop has only
- // the index in bounds invariant added
- // the loop in this case looks like this:
- // for i := range x { ...
- val invCtx = ctx.copyWithExpD{
- case n@PNamedOperand(_@PIdnUse(name)) if name == shorts(0).name =>
- val invSrc = meta(info.enclosingInvariantNode(n), info).createAnnotatedInfo(Source.RangeVariableMightNotExistAnnotation(range.exp.toString()))
- Some(unit(conditionalId(indexLeft.op, in.LessCmp(in.IntLit(0)(invSrc), length)(invSrc), in.IntT(Addressability.exclusiveVariable))(invSrc)))
- case _ => None
- }
- val (dInvPre, dInv) = prelude(sequence(spec.invariants map assertionD(invCtx, info))).res
- in.Seqn(
- Vector(copyAss, indexAss, copyIndexAss) ++ dInvPre ++ dTerPre ++ Vector(
- in.While(cond, Vector(copiedIndexBoundsInv, copiedIndexEqualsIndexInv, indexBoundsInv) ++ dInv, dTer, in.Block(Vector(continueLoopLabelProxy),
- Vector(dBody, continueLoopLabel, incrCopiedIndex, incrIndex) ++ dInvPre ++ dTerPre
- )(src))(src), breakLoopLabel
- )
- )(src)
- }
- } yield wh))
-
- /**
- * This case handles for loops with a range clause of the form:
- *
- *
- * for expIndex, expValue = range x {
- * body
- * }
- *
- * In the case where x is a slice or array the following code is produced.
- *
- * var i0 int = 0 // since 'expIndex' can change in the iteration we store the true index in i0
- *
- * c := x // save the value of the slice/array since changing it doesn't change the iteration
- *
- * if (len(c) > 0) {
- * expIndex = 0
- * }
- *
- * if (0 <= expIndex && expIndex < len(c)) { // [v]
- * expValue = c[expIndex]
- * }
- *
- * 0) and j with f(j, len(c) > 0)>
- * invariant len(c) > 0 ==> 0 <= i0 && i0 <= len(c) // these invariants might require access to something
- * invariant len(c) > 0 ==> expIndex == i0 // as expIndex can be an indexing operation for example
- * invariant len(c) > 0 ==> 0 <= expIndex && expIndex <= len(c) // so they are added after the user invariants
- * invariant len(c) > 0 ==> (0 <= expIndex && expIndex < len(c) ==> expValue == c[expIndex]) // [v]
- * for expIndex < len(c) {
- *
- * i0 += 1
- * expIndex = i0
- * if (0 <= expIndex && expIndex < len(c)) { // [v]
- * expValue = c[i]
- * }
- * }
- *
- * In the case where the value expression 'expValue' is missing all the code annotated with [v]
- * is omitted
- */
case n@PAssForRange(range, ass, spec, body) =>
- unit(block(for {
- exp <- goE(range.exp)
- typ = underlyingType(exp.typ) match {
- case slice : in.SliceT => slice
- case array : in.ArrayT => array
- case _ : in.MapT => violation("Maps are not supported yet in range")
- case _ : in.StringT => violation("Strings are not supported yet in range")
- case t => violation(s"Range not applicable to type $t")
- }
- indexLeft <- goL(ass(0))
- rangeSrc = meta(range, info)
- indexSrc = meta(ass(0), info)
- rangeExpSrc = meta(range.exp, info)
-
- copiedVar <- freshDeclaredExclusiveVar(exp.typ, n, info)(rangeExpSrc)
- copyAss = singleAss(in.Assignee.Var(copiedVar), exp)(rangeExpSrc)
- length = in.Length(copiedVar)(rangeSrc)
-
- copiedIndexVar <- freshDeclaredExclusiveVar(in.IntT(Addressability.exclusiveVariable), n, info)(rangeExpSrc)
- copyIndexAss = singleAss(in.Assignee.Var(copiedIndexVar), in.IntLit(0)(indexSrc))(rangeExpSrc)
- incrCopiedIndex = singleAss(in.Assignee.Var(copiedIndexVar), in.Add(copiedIndexVar, in.IntLit(1)(indexSrc))(indexSrc))(indexSrc)
-
- indexAss = in.If(in.LessCmp(in.IntLit(0)(indexSrc), length)(indexSrc), singleAss(indexLeft, in.IntLit(0)(rangeSrc))(indexSrc), in.Seqn(Vector())(indexSrc))(indexSrc)
- incrIndex = singleAss(indexLeft, copiedIndexVar)(indexSrc)
-
- cond = in.LessCmp(indexLeft.op, length)(rangeSrc)
-
- copiedIndexEqualsIndexInv = in.Implication(
- in.LessCmp(in.IntLit(0)(indexSrc), length)(indexSrc),
- in.ExprAssertion(in.EqCmp(indexLeft.op, copiedIndexVar)(rangeSrc))(rangeSrc))(rangeSrc)
-
- copiedIndexBoundsInv = in.Implication(
- in.LessCmp(in.IntLit(0)(indexSrc), length)(indexSrc),
- in.ExprAssertion(in.And(
- in.AtMostCmp(in.IntLit(0)(rangeSrc), copiedIndexVar)(rangeSrc),
- in.AtMostCmp(copiedIndexVar, length)(rangeSrc))(rangeSrc))(rangeSrc))(rangeSrc)
-
- indexBoundsInv = in.Implication(
- in.LessCmp(in.IntLit(0)(indexSrc), length)(indexSrc),
- in.ExprAssertion(in.And(
- in.AtMostCmp(in.IntLit(0)(rangeSrc), indexLeft.op)(rangeSrc),
- in.AtMostCmp(indexLeft.op, length)(rangeSrc))(rangeSrc))(rangeSrc))(rangeSrc)
-
- (dInvPre, dInv) <- prelude(sequence(spec.invariants map assertionD(ctx, info)))
- (dTerPre, dTer) <- prelude(option(spec.terminationMeasure map terminationMeasureD(ctx, info)))
-
- dBody = blockD(ctx, info)(body)
-
- continueLabelName = nm.continueLabel(n, info)
- continueLoopLabelProxy = in.LabelProxy(continueLabelName)(src)
- continueLoopLabel = in.Label(continueLoopLabelProxy)(src)
-
- breakLabelName = nm.breakLabel(n, info)
- breakLoopLabelProxy = in.LabelProxy(breakLabelName)(src)
- _ <- declare(breakLoopLabelProxy)
- breakLoopLabel = in.Label(breakLoopLabelProxy)(src)
-
- wh = if (ass.length == 2) {
- val valueLeft = goL(ass(1)).res
- val decls = ass(1) match {
- case _: PBlankIdentifier => Vector(valueLeft.asInstanceOf[in.Assignee.Var].op.asInstanceOf[in.LocalVar])
- case _ => Vector.empty
- }
- val valueSrc = meta(ass(1), info)
- val valueAss = singleAss(valueLeft, in.IndexedExp(copiedVar, indexLeft.op, typ)(valueSrc))(valueSrc)
- val updateValue = in.If(in.And(cond, in.AtLeastCmp(indexLeft.op, in.IntLit(0)(valueSrc))(valueSrc))(valueSrc), valueAss, in.Seqn(Vector())(valueSrc))(valueSrc)
-
- val indexValueEq = in.Implication(
- in.LessCmp(in.IntLit(0)(indexSrc), length)(indexSrc),
- in.Implication(
- in.And(
- in.AtMostCmp(in.IntLit(0)(indexSrc), indexLeft.op)(indexSrc),
- in.LessCmp(indexLeft.op, length)(indexSrc))(indexSrc),
- in.ExprAssertion(in.EqCmp(in.IndexedExp(copiedVar, indexLeft.op, typ)(rangeExpSrc), valueLeft.op)(rangeExpSrc))(rangeExpSrc)
- )(rangeSrc))(rangeSrc)
- in.Block(
- decls,
- Vector(copyAss, indexAss, copyIndexAss, updateValue) ++ dInvPre ++ dTerPre ++ Vector(
- in.While(cond, dInv ++ Vector(copiedIndexBoundsInv, copiedIndexEqualsIndexInv, indexBoundsInv, indexValueEq), dTer, in.Block(Vector(continueLoopLabelProxy),
- Vector(dBody, continueLoopLabel, incrCopiedIndex, incrIndex, updateValue) ++ dInvPre ++ dTerPre
- )(src))(src), breakLoopLabel
- )
- )(src)
- } else {
- in.Seqn(
- Vector(copyAss, indexAss, copyIndexAss) ++ dInvPre ++ dTerPre ++ Vector(
- in.While(cond, dInv ++ Vector(copiedIndexBoundsInv, copiedIndexEqualsIndexInv, indexBoundsInv), dTer, in.Block(Vector(continueLoopLabelProxy),
- Vector(dBody, continueLoopLabel, incrCopiedIndex, incrIndex) ++ dInvPre ++ dTerPre
- )(src))(src), breakLoopLabel
- )
- )(src)
- }
- } yield wh))
+ underlyingType(info.typ(range.exp)) match {
+ case _: SliceT | _: ArrayT => desugarArrSliceAssRange(n, range, ass, spec, body)(src)
+ case _: MapT => desugarMapAssRange(n, range, ass, spec, body)(src)
+ case t => violation(s"Type $t not supported as a range expression")
+ }
case _ => ???
}
@@ -3341,58 +3542,6 @@ object Desugar {
fPred
}
- /**
- * Holds types for which conditionalId functions have been declared for.
- * This way conditionalId functions do not get declared twice for the same
- * type.
- */
- private var hasConditionalIdForType : Set[in.Type] = Set.empty
-
- /**
- * If it doesn't exist it generates a function:
- *
- * function $conditionalId(value: , cond: Bool): Int
- * requires cond
- * {
- * value
- * }
- *
- * where type is the underlying type of param generalType
- *
- * @param valueVar
- * @param condVar
- * @param generalType
- * @param src
- * @return a call to the $conditionalId function with arguments valueVar and condVar
- */
- private def conditionalId(valueVar: in.Expr, condVar: in.Expr, generalType: in.Type)(src: Meta): in.PureFunctionCall = {
- val typ = underlyingType(generalType)
- val name = in.FunctionProxy("$" + s"conditionalId${Names.serializeType(typ)}")(Source.Parser.Internal)
- if (!hasConditionalIdForType(typ)) {
- hasConditionalIdForType += typ
- val value = in.Parameter.In("value", typ.withAddressability(Addressability.inParameter))(Source.Parser.Internal)
- val cond = in.Parameter.In("cond", in.BoolT(Addressability.inParameter))(Source.Parser.Internal)
- val res = in.Parameter.Out("res", typ.withAddressability(Addressability.outParameter))(Source.Parser.Internal)
- val args = Vector(value, cond)
- val results = Vector(res)
- val pres = Vector(in.ExprAssertion(cond)(Source.Parser.Internal))
- val posts = Vector[in.Assertion]()
- val terminationMeasures = Vector(in.WildcardMeasure(None)(Source.Parser.Internal))
- val body = Some(value)
- AdditionalMembers.addMember(
- in.PureFunction(
- name,
- args,
- results,
- pres,
- posts,
- terminationMeasures,
- body)(Source.Parser.Internal)
- )
- }
- in.PureFunctionCall(name, Vector(valueVar, condVar), in.IntT(Addressability.callResult))(src)
- }
-
/** Desugar the function literal and add it to the map. */
private def registerFunctionLit(ctx: FunctionContext, info: TypeInfo)(lit: PFunctionLit): Writer[in.Expr] = {
val fLit = if (lit.spec.isPure) pureFunctionLitD(ctx, info)(lit) else functionLitD(ctx)(lit)
diff --git a/src/main/scala/viper/gobra/frontend/ParseTreeTranslator.scala b/src/main/scala/viper/gobra/frontend/ParseTreeTranslator.scala
index 88c31a6ba..5745091ec 100644
--- a/src/main/scala/viper/gobra/frontend/ParseTreeTranslator.scala
+++ b/src/main/scala/viper/gobra/frontend/ParseTreeTranslator.scala
@@ -1821,18 +1821,25 @@ class ParseTreeTranslator(pom: PositionManager, source: Source, specOnly : Boole
val post = visitNodeOrNone[PSimpleStmt](ctx.forClause().postStmt)
PForStmt(pre, cond, post, spec, block).at(specCtx)
} else if (has(ctx.rangeClause())) {
- // for ? range
- val expr = visitNode[PExpression](ctx.rangeClause().expression())
- val range = PRange(expr).at(ctx.rangeClause())
+ // for ? range (with enumerated)?
+ val expr = visitNode[PExpression](ctx.rangeClause().expression()).at(ctx.rangeClause())
+ // enumerated will be used no matter what, so we just make it a wildcard if it is not
+ // present in the range clause
+ val enumerated = visitChildren(ctx.rangeClause()) match {
+ case Vector(_, _, "range", _, "with", i) if i.toString() == "_" => PWildcard().at(ctx.rangeClause().IDENTIFIER())
+ case Vector("range", _, "with", i) if i.toString() == "_" => PWildcard().at(ctx.rangeClause().IDENTIFIER())
+ case Vector(_, _, "range", _) | Vector("range", _) => PWildcard().at(ctx.rangeClause())
+ case _ => idnUnk.get(ctx.rangeClause().IDENTIFIER()).at(ctx.rangeClause.IDENTIFIER())
+ }
+ val range = PRange(expr, enumerated).at(ctx.rangeClause())
if (has(ctx.rangeClause().DECLARE_ASSIGN())) {
// :=
- // identifiers should include the blank identifier, but this is currently not supported by PShortForRange
- val goIdnUnkList(idList) = visitIdentifierList(ctx.rangeClause().identifierList())
- PShortForRange(range, idList, spec, block).at(specCtx)
+ val (idnUnkLikeList(vars), addressable) = visitMaybeAddressableIdentifierList(ctx.rangeClause().maybeAddressableIdentifierList())
+ PShortForRange(range, vars, addressable, spec, block).at(specCtx)
} else {
// =
val assignees = visitAssigneeList(ctx.rangeClause().expressionList()) match {
- case v : Vector[PAssignee] => v
+ case v : Vector[PAssignee] => if (v.length > 0 ) v else Vector(PBlankIdentifier().at(ctx.rangeClause()))
case _ => fail(ctx)
}
PAssForRange(range, assignees, spec, block).at(specCtx)
diff --git a/src/main/scala/viper/gobra/frontend/info/base/SymbolTable.scala b/src/main/scala/viper/gobra/frontend/info/base/SymbolTable.scala
index fc350c4c5..2b30e5e43 100644
--- a/src/main/scala/viper/gobra/frontend/info/base/SymbolTable.scala
+++ b/src/main/scala/viper/gobra/frontend/info/base/SymbolTable.scala
@@ -142,6 +142,11 @@ object SymbolTable extends Environments[Entity] {
override def rep: PNode = exp
}
+ case class RangeEnumerateVariable(exp: PRange, ghost: Boolean, context: ExternalTypeInfo) extends ActualVariable {
+ override def addressable: Boolean = false
+ override def rep: PNode = exp
+ }
+
sealed trait TypeEntity extends Regular
sealed trait ActualTypeEntity extends TypeEntity with ActualRegular {
diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/resolution/NameResolution.scala b/src/main/scala/viper/gobra/frontend/info/implementation/resolution/NameResolution.scala
index d2adce9ac..743cfd2b7 100644
--- a/src/main/scala/viper/gobra/frontend/info/implementation/resolution/NameResolution.scala
+++ b/src/main/scala/viper/gobra/frontend/info/implementation/resolution/NameResolution.scala
@@ -115,7 +115,7 @@ trait NameResolution {
case decl: PShortForRange =>
val idx = decl.shorts.zipWithIndex.find(_._1 == id).get._2
- RangeVariable(idx, decl.range, isGhost, addressable = false, this) // TODO: check if range variables are addressable in Go
+ RangeVariable(idx, decl.range, isGhost, addressable = decl.addressable(idx), this)
case decl: PSelectShortRecv =>
val idx = decl.shorts.zipWithIndex.find(_._1 == id).get._2
@@ -126,6 +126,8 @@ trait NameResolution {
case AssignMode.Multi => MultiLocalVariable(idx, decl.recv, isGhost, addressable = false, this)
case _ => UnknownEntity()
}
+ case decl: PRange =>
+ RangeEnumerateVariable(decl, isGhost, this)
case _ => violation("unexpected parent of unknown id")
}
diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/typing/IdTyping.scala b/src/main/scala/viper/gobra/frontend/info/implementation/typing/IdTyping.scala
index f09caf7fe..513c3eb89 100644
--- a/src/main/scala/viper/gobra/frontend/info/implementation/typing/IdTyping.scala
+++ b/src/main/scala/viper/gobra/frontend/info/implementation/typing/IdTyping.scala
@@ -128,6 +128,8 @@ trait IdTyping extends BaseTyping { this: TypeInfoImpl =>
}
})
+ case _:RangeEnumerateVariable => LocalMessages(noMessages)
+
case Field(PFieldDecl(_, typ), _, _) => unsafeMessage(! {
wellDefAndType.valid(typ)
})
@@ -231,6 +233,8 @@ trait IdTyping extends BaseTyping { this: TypeInfoImpl =>
case t => violation(s"expected tuple but got $t")
}
+ case RangeEnumerateVariable(range, _, context) => rangeEnumeratorType(underlyingType(context.typ(range.exp)))
+
case Field(PFieldDecl(_, typ), _, context) => context.symbType(typ)
case Embbed(PEmbeddedDecl(typ, _), _, context) => context.typ(typ)
@@ -269,7 +273,8 @@ trait IdTyping extends BaseTyping { this: TypeInfoImpl =>
def getBlankAssigneeTypeRange(n: PNode, left: Vector[PNode], range: PRange): Type = {
require(n.isInstanceOf[PIdnNode] || n.isInstanceOf[PBlankIdentifier])
val pos = left indexWhere (n eq _)
- exprType(range.exp) match {
+ violation(pos >= 0, "did not find expression corresponding to " + n)
+ underlyingType(exprType(range.exp)) match {
case ChannelT(elem, ChannelModus.Recv | ChannelModus.Bi) => elem
case _ => miscType(range).asInstanceOf[InternalSingleMulti].mul.ts(pos)
}
@@ -281,9 +286,18 @@ trait IdTyping extends BaseTyping { this: TypeInfoImpl =>
case PShortVarDecl(right, left, _) => getBlankAssigneeType(w, left, right)
case PVarDecl(typ, right, left, _) => typ.map(symbType).getOrElse(getBlankAssigneeType(w, left, right))
case PConstSpec(typ, right, left) => typ.map(symbType).getOrElse(getBlankAssigneeType(w, left, right))
+ case PShortForRange(range, shorts, _, _, _) => getBlankAssigneeTypeRange(w, shorts, range)
+ case PRange(exp, enumerated) => if (w eq enumerated) rangeEnumeratorType(underlyingType(exprType(exp)))
+ else violation("did not find expression corresponding to " + w)
case _ => ???
}
case _ => ???
}
}
+
+ def rangeEnumeratorType(typ: Type) : Type = typ match {
+ case _: SliceT | _: ArrayT => IntT(config.typeBounds.Int)
+ case MapT(key, _) => SetT(key)
+ case t => violation(s"type $t is not supported for range")
+ }
}
diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/typing/MiscTyping.scala b/src/main/scala/viper/gobra/frontend/info/implementation/typing/MiscTyping.scala
index 639b5d74a..059966248 100644
--- a/src/main/scala/viper/gobra/frontend/info/implementation/typing/MiscTyping.scala
+++ b/src/main/scala/viper/gobra/frontend/info/implementation/typing/MiscTyping.scala
@@ -24,9 +24,9 @@ trait MiscTyping extends BaseTyping { this: TypeInfoImpl =>
private[typing] def wellDefActualMisc(misc: PActualMisc): Messages = misc match {
- case n@PRange(exp) => isExpr(exp).out ++ (underlyingType(exprType(exp)) match {
- case _: ArrayT | PointerT(_: ArrayT) | _: SliceT | _: GhostSliceT |
- _: MapT | ChannelT(_, ChannelModus.Recv | ChannelModus.Bi) => noMessages
+ case n@PRange(exp, _) => isExpr(exp).out ++ (underlyingType(exprType(exp)) match {
+ case _: ArrayT | PointerT(_: ArrayT) | _: SliceT | _: GhostSliceT | _: MapT |
+ ChannelT(_, ChannelModus.Recv | ChannelModus.Bi) => noMessages
case t => message(n, s"type error: got $t but expected rangeable type")
})
@@ -50,7 +50,7 @@ trait MiscTyping extends BaseTyping { this: TypeInfoImpl =>
private[typing] def actualMiscType(misc: PActualMisc): Type = misc match {
- case PRange(exp) => underlyingType(exprType(exp)) match {
+ case PRange(exp, _) => underlyingType(exprType(exp)) match {
case ArrayT(_, elem) => InternalSingleMulti(IntT(config.typeBounds.Int), InternalTupleT(Vector(IntT(config.typeBounds.Int), elem)))
case PointerT(ArrayT(_, elem)) => InternalSingleMulti(IntT(config.typeBounds.Int), InternalTupleT(Vector(IntT(config.typeBounds.Int), elem)))
case SliceT(elem) => InternalSingleMulti(IntT(config.typeBounds.Int), InternalTupleT(Vector(IntT(config.typeBounds.Int), elem)))
diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/typing/StmtTyping.scala b/src/main/scala/viper/gobra/frontend/info/implementation/typing/StmtTyping.scala
index c008753a7..ad6c39039 100644
--- a/src/main/scala/viper/gobra/frontend/info/implementation/typing/StmtTyping.scala
+++ b/src/main/scala/viper/gobra/frontend/info/implementation/typing/StmtTyping.scala
@@ -8,7 +8,7 @@ package viper.gobra.frontend.info.implementation.typing
import org.bitbucket.inkytonik.kiama.util.Messaging.{Messages, error, noMessages}
import viper.gobra.ast.frontend._
-import viper.gobra.frontend.info.base.Type.{BooleanT, ChannelModus, ChannelT, FunctionT, InterfaceT, InternalTupleT, Type}
+import viper.gobra.frontend.info.base.Type.{BooleanT, ChannelModus, ChannelT, FunctionT, InterfaceT, InternalTupleT, Type, ArrayT, SliceT, MapT, SetT}
import viper.gobra.frontend.info.implementation.TypeInfoImpl
trait StmtTyping extends BaseTyping { this: TypeInfoImpl =>
@@ -101,11 +101,22 @@ trait StmtTyping extends BaseTyping { this: TypeInfoImpl =>
case n@PForStmt(_, cond, _, _, _) => isExpr(cond).out ++ comparableTypes.errors(exprType(cond), BooleanT)(n)
- case _@PShortForRange(range, shorts, _, _) =>
- multiAssignableTo.errors(Vector(miscType(range)), shorts map idType)(range)
+ case PShortForRange(range, shorts, _, _, _) =>
+ underlyingType(exprType(range.exp)) match {
+ case _ : ArrayT | _ : SliceT =>
+ multiAssignableTo.errors(Vector(miscType(range)), shorts map idType)(range) ++
+ assignableTo.errors(miscType(range), idType(range.enumerated))(range)
+ case MapT(key, _) => multiAssignableTo.errors(Vector(miscType(range)), shorts map idType)(range) ++
+ assignableTo.errors((SetT(key), idType(range.enumerated)))(range)
+ case t => error(range, s"range not supported for type $t")
+ }
- case _@PAssForRange(range, ass, _, _) =>
- multiAssignableTo.errors(Vector(miscType(range)), ass map exprType)(range)
+ case PAssForRange(range, ass, _, _) =>
+ underlyingType(exprType(range.exp)) match {
+ case _ : ArrayT | _ : SliceT | _ : MapT =>
+ multiAssignableTo.errors(Vector(miscType(range)), ass map exprType)(range)
+ case t => error(range, s"range not supported for type $t")
+ }
case n@PGoStmt(exp) => isExpr(exp).out ++ isExecutable.errors(exp)(n)
diff --git a/src/main/scala/viper/gobra/reporting/DefaultErrorBackTranslator.scala b/src/main/scala/viper/gobra/reporting/DefaultErrorBackTranslator.scala
index 57bed8f49..2cc79ddc3 100644
--- a/src/main/scala/viper/gobra/reporting/DefaultErrorBackTranslator.scala
+++ b/src/main/scala/viper/gobra/reporting/DefaultErrorBackTranslator.scala
@@ -6,7 +6,7 @@
package viper.gobra.reporting
-import viper.gobra.reporting.Source.{AutoImplProofAnnotation, CertainSource, CertainSynthesized, ImportPreNotEstablished, MainPreNotEstablished, OverflowCheckAnnotation, ReceiverNotNilCheckAnnotation, RangeVariableMightNotExistAnnotation}
+import viper.gobra.reporting.Source.{AutoImplProofAnnotation, CertainSource, CertainSynthesized, ImportPreNotEstablished, MainPreNotEstablished, OverflowCheckAnnotation, ReceiverNotNilCheckAnnotation, InsufficientPermissionToRangeExpressionAnnotation, LoopInvariantNotEstablishedAnnotation}
import viper.gobra.reporting.Source.Verifier./
import viper.silver
@@ -86,7 +86,6 @@ object DefaultErrorBackTranslator {
val transformVerificationErrorReason: VerificationErrorReason => VerificationErrorReason = {
case AssertionFalseError(info / OverflowCheckAnnotation) => OverflowErrorReason(info)
case AssertionFalseError(info / ReceiverNotNilCheckAnnotation) => InterfaceReceiverIsNilReason(info)
- case AssertionFalseError(info / RangeVariableMightNotExistAnnotation(_)) => AssertionFalseError(info)
case x => x
}
@@ -170,8 +169,6 @@ class DefaultErrorBackTranslator(
case _ / AutoImplProofAnnotation(subT, superT) =>
GeneratedImplementationProofError(subT, superT, x)
- case _ / RangeVariableMightNotExistAnnotation(rangeExpr) =>
- x.reasons.foldLeft(RangeVariableMightNotExistError(x.info)(rangeExpr): VerificationError){ case (err, reason) => err dueTo reason }
case _ / MainPreNotEstablished =>
x.reasons.foldLeft(MainPreconditionNotEstablished(x.info): VerificationError){
case (err, reason) => err dueTo reason
@@ -182,6 +179,12 @@ class DefaultErrorBackTranslator(
case (err, reason) => err dueTo reason
}
+ case _ / InsufficientPermissionToRangeExpressionAnnotation() =>
+ x.reasons.foldLeft(InsufficientPermissionToRangeExpressionError(x.info): VerificationError){ case (err, reason) => err dueTo reason }
+
+ case _ / LoopInvariantNotEstablishedAnnotation =>
+ x.reasons.foldLeft(LoopInvariantEstablishmentError(x.info): VerificationError) { case (err, reason) => err dueTo reason }
+
case _ => x
}
diff --git a/src/main/scala/viper/gobra/reporting/Source.scala b/src/main/scala/viper/gobra/reporting/Source.scala
index 269eae872..6204aa50d 100644
--- a/src/main/scala/viper/gobra/reporting/Source.scala
+++ b/src/main/scala/viper/gobra/reporting/Source.scala
@@ -29,8 +29,9 @@ object Source {
case object ReceiverNotNilCheckAnnotation extends Annotation
case object ImportPreNotEstablished extends Annotation
case object MainPreNotEstablished extends Annotation
+ case object LoopInvariantNotEstablishedAnnotation extends Annotation
case class NoPermissionToRangeExpressionAnnotation() extends Annotation
- case class RangeVariableMightNotExistAnnotation(rangeExpr: String) extends Annotation
+ case class InsufficientPermissionToRangeExpressionAnnotation() extends Annotation
case class AutoImplProofAnnotation(subT: String, superT: String) extends Annotation
object Parser {
diff --git a/src/main/scala/viper/gobra/reporting/VerifierError.scala b/src/main/scala/viper/gobra/reporting/VerifierError.scala
index 3e79d20dc..87bc18724 100644
--- a/src/main/scala/viper/gobra/reporting/VerifierError.scala
+++ b/src/main/scala/viper/gobra/reporting/VerifierError.scala
@@ -286,7 +286,12 @@ case class RangeVariableMightNotExistError(info: Source.Verifier.Info)(rangeExpr
case class NoPermissionToRangeExpressionError(info: Source.Verifier.Info) extends VerificationError {
override def localId: String = "no_permission_to_range_expression"
- override def localMessage: String = s"Might not have read permissions to range expression"
+ override def localMessage: String = s"Might not have read permission to range expression"
+}
+
+case class InsufficientPermissionToRangeExpressionError(info: Source.Verifier.Info) extends VerificationError {
+ override def localId: String = "insufficient_permission_to_range_expression"
+ override def localMessage: String = s"Range expression should be immutable inside the loop body"
}
case class MapMakePreconditionError(info: Source.Verifier.Info) extends VerificationError {
diff --git a/src/test/resources/regressions/features/loops/range-fail1.gobra b/src/test/resources/regressions/features/loops/range-fail1.gobra
index 1529584b4..6bc8e2c97 100644
--- a/src/test/resources/regressions/features/loops/range-fail1.gobra
+++ b/src/test/resources/regressions/features/loops/range-fail1.gobra
@@ -6,6 +6,6 @@ package pkg
func foo_arr() {
x := [4]uint{1, 2, 3, 4}
//:: ExpectedOutput(type_error)
- for i, j, k := range x {
+ for i, j, k := range x with i0 {
}
}
diff --git a/src/test/resources/regressions/features/loops/range-fail2.gobra b/src/test/resources/regressions/features/loops/range-fail2.gobra
index f202fa721..f215873b0 100644
--- a/src/test/resources/regressions/features/loops/range-fail2.gobra
+++ b/src/test/resources/regressions/features/loops/range-fail2.gobra
@@ -6,6 +6,6 @@ package pkg
func foo_arr() {
x := []uint{1, 2, 3, 4}
//:: ExpectedOutput(no_permission_to_range_expression)
- for i, j := range x {
+ for i, j := range x with i0 {
}
}
diff --git a/src/test/resources/regressions/features/loops/range-fail3.gobra b/src/test/resources/regressions/features/loops/range-fail3.gobra
index f2ea52d51..4a2aaf470 100644
--- a/src/test/resources/regressions/features/loops/range-fail3.gobra
+++ b/src/test/resources/regressions/features/loops/range-fail3.gobra
@@ -8,6 +8,6 @@ func foo_arr() {
var i int
var j int
//:: ExpectedOutput(type_error)
- for i, j = range x {
+ for i, j = range x with i0 {
}
}
diff --git a/src/test/resources/regressions/features/loops/range-fail4.gobra b/src/test/resources/regressions/features/loops/range-fail4.gobra
index 82becb70f..fe4f2a129 100644
--- a/src/test/resources/regressions/features/loops/range-fail4.gobra
+++ b/src/test/resources/regressions/features/loops/range-fail4.gobra
@@ -8,6 +8,6 @@ func foo_arr() {
var i uint
var j uint
//:: ExpectedOutput(type_error)
- for i, j = range x {
+ for i, j = range x with i0 {
}
}
diff --git a/src/test/resources/regressions/features/loops/range-fail5.gobra b/src/test/resources/regressions/features/loops/range-fail5.gobra
index 836095d32..d4e05c3fc 100644
--- a/src/test/resources/regressions/features/loops/range-fail5.gobra
+++ b/src/test/resources/regressions/features/loops/range-fail5.gobra
@@ -9,6 +9,6 @@ func foo_arr() {
var j uint
var k int
//:: ExpectedOutput(type_error)
- for i, j, k = range x {
+ for i, j, k = range x with i0 {
}
}
diff --git a/src/test/resources/regressions/features/loops/range-fail6.gobra b/src/test/resources/regressions/features/loops/range-fail6.gobra
index 3fdacf5b8..37b2b4f0a 100644
--- a/src/test/resources/regressions/features/loops/range-fail6.gobra
+++ b/src/test/resources/regressions/features/loops/range-fail6.gobra
@@ -6,6 +6,6 @@ package pkg
func foo_arr() {
x := 0
//:: ExpectedOutput(type_error)
- for i, j := range x {
+ for i, j := range x with i0 {
}
}
diff --git a/src/test/resources/regressions/features/loops/range-fail7.gobra b/src/test/resources/regressions/features/loops/range-fail7.gobra
index 02aaa778b..a3a1473c8 100644
--- a/src/test/resources/regressions/features/loops/range-fail7.gobra
+++ b/src/test/resources/regressions/features/loops/range-fail7.gobra
@@ -7,6 +7,6 @@ func foo() {
x := [0]int{}
//:: ExpectedOutput(invariant_establishment_error)
invariant false
- for i, j := range x {
+ for i, j := range x with i0 {
}
}
diff --git a/src/test/resources/regressions/features/loops/range-fail8.gobra b/src/test/resources/regressions/features/loops/range-fail8.gobra
index f71ffffaf..1decd510e 100644
--- a/src/test/resources/regressions/features/loops/range-fail8.gobra
+++ b/src/test/resources/regressions/features/loops/range-fail8.gobra
@@ -6,8 +6,8 @@ package pkg
func foo_arr() {
x := []uint{}
invariant acc(x)
- //:: ExpectedOutput(range_variable_might_not_exist:assertion_error)
+ //:: ExpectedOutput(invariant_establishment_error)
invariant i == 0
- for i, j := range x {
+ for i, j := range x with i0 {
}
}
diff --git a/src/test/resources/regressions/features/loops/range1.gobra b/src/test/resources/regressions/features/loops/range1.gobra
index fa290797b..24d426be5 100644
--- a/src/test/resources/regressions/features/loops/range1.gobra
+++ b/src/test/resources/regressions/features/loops/range1.gobra
@@ -12,9 +12,9 @@ func foo(x []uint) (max uint) {
max = x[0]
invariant acc(x)
invariant 0 <= i && i <= len(x)
- invariant forall k int :: 0 <= k && k < i ==> max >= x[k]
- decreases len(x) - i
- for i, j := range x {
+ invariant forall k int :: 0 <= k && k < i0 ==> max >= x[k]
+ decreases len(x) - i0
+ for i, j := range x with i0 {
if j > max {
max = j
}
@@ -25,8 +25,8 @@ func foo_arr() {
x := [4]uint{1, 2, 3, 4}
max := x[0]
invariant 0 <= i && i <= len(x)
- invariant forall k int :: 0 <= k && k < i ==> max >= x[k]
- for i, j := range x {
+ invariant forall k int :: 0 <= k && k < i0 ==> max >= x[k]
+ for i, j := range x with i0 {
if j > max {
max = j
}
@@ -45,10 +45,9 @@ func bar2() {
x := []int{1, 2, 3, 4, 5}
sum := 0
invariant acc(x)
- invariant 0 <= i && i <= len(x)
- invariant sum == i * (i - 1) / 2
- decreases len(x) - i
- for i := range x {
+ invariant sum == i0 * (i0 - 1) / 2
+ decreases len(x) - i0
+ for i := range x with i0 {
sum += i
}
assert sum == len(x) * (len(x) - 1) / 2
@@ -60,24 +59,24 @@ func foo2() {
for _, j := range x {
}
invariant acc(x)
- for i, _ := range x {
+ for i, _ := range x with i0 {
}
invariant acc(x)
for _, _ := range x {
}
invariant acc(x)
- for _ := range x {
+ for _ := range x with _ {
}
}
func foo3() {
x := [0]int{}
- for i, j := range x {
+ for i, j := range x with i0 {
}
y := []int{}
- for i, j := range x {
+ for i, j := range x with i0 {
}
- for i,j := range x {
+ for i, j := range x {
continue
break
}
diff --git a/src/test/resources/regressions/features/loops/range2.gobra b/src/test/resources/regressions/features/loops/range2.gobra
index b49f5b800..f81c0c52c 100644
--- a/src/test/resources/regressions/features/loops/range2.gobra
+++ b/src/test/resources/regressions/features/loops/range2.gobra
@@ -15,10 +15,9 @@ func foo() {
// this invariant is also automatically generated but
// only after the next one which causes the next one to fail
// in such a case, the user must provide it himself
- invariant 0 <= z[1] && z[1] <= len(x)
- invariant forall k int :: 0 <= k && k < z[1] ==> max >= x[k]
- decreases len(x) - z[1]
- for z[1], y[2] = range x {
+ invariant forall k int :: 0 <= k && k < i0 ==> max >= x[k]
+ decreases len(x) - i0
+ for z[1], y[2] = range x with i0 {
if y[2] > max {
max = y[2]
}
@@ -32,20 +31,20 @@ func foo2() {
var i uint
var j int
invariant acc(x)
- decreases len(x) - j
- for j, _ = range x {
+ decreases len(x) - i0
+ for j, _ = range x with i0 {
}
invariant acc(x)
- for _ = range x {
+ for _ = range x with _ {
}
invariant acc(x)
for _, i = range x {
}
invariant acc(x)
- for j = range x {
+ for j = range x with i0 {
}
invariant acc(x)
- for _ = range x {
+ for _ = range x with i0 {
continue
break
}
diff --git a/src/test/resources/regressions/features/loops/range3.gobra b/src/test/resources/regressions/features/loops/range3.gobra
new file mode 100644
index 000000000..39ea0e1e3
--- /dev/null
+++ b/src/test/resources/regressions/features/loops/range3.gobra
@@ -0,0 +1,29 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/publicdomain/zero/1.0/
+
+package pkg
+
+func foo() {
+ x := []int{1,2,3}
+ invariant acc(&info)
+ invariant acc(x)
+ for _, info@ := range x with i {
+ bar(&info)
+ }
+}
+
+func foo1() {
+ x := []int{1,2,3}
+ info@ := 0
+ invariant acc(&info)
+ invariant acc(x)
+ for _, info = range x with i {
+ bar(&info)
+ }
+}
+
+requires acc(i)
+ensures acc(i)
+func bar(i *int) {
+ *i = 3
+}
diff --git a/src/test/resources/regressions/features/loops/range_maps-fail1.gobra b/src/test/resources/regressions/features/loops/range_maps-fail1.gobra
new file mode 100644
index 000000000..0d8030366
--- /dev/null
+++ b/src/test/resources/regressions/features/loops/range_maps-fail1.gobra
@@ -0,0 +1,13 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/publicdomain/zero/1.0/
+
+package pkg
+
+func foo() {
+ x := map[uint]int{1:1, 2:3}
+ var i int
+ var j int
+ //:: ExpectedOutput(type_error)
+ for i, j = range x with i0 {
+ }
+}
diff --git a/src/test/resources/regressions/features/loops/range_maps1.gobra b/src/test/resources/regressions/features/loops/range_maps1.gobra
new file mode 100644
index 000000000..f065e5c1e
--- /dev/null
+++ b/src/test/resources/regressions/features/loops/range_maps1.gobra
@@ -0,0 +1,55 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/publicdomain/zero/1.0/
+
+package pkg
+
+
+requires acc(x)
+requires len(x) > 0
+ensures acc(x)
+ensures forall k uint :: k in domain(x) ==> max >= k
+decreases
+func foo(x map[uint]int) (max uint) {
+ max = 0
+ invariant acc(x)
+ invariant forall i uint :: i in visited ==> max >= i
+ decreases len(domain(x)) - len(visited)
+ for k, v := range x with visited {
+ if k > max {
+ max = k
+ }
+ }
+}
+
+decreases
+func bar() {
+ x := map[uint]int{1:1, 2:2, 3:3}
+ m := foo(x)
+ assert forall i uint :: i in domain(x) ==> m >= i
+}
+
+requires acc(x)
+requires len(x) > 0
+ensures acc(x)
+ensures forall k int :: k in domain(x) ==> max >= x[k]
+decreases
+func foo1(x map[int]uint) (max uint) {
+ max = 0
+ var k int
+ var v uint
+ invariant acc(x)
+ invariant forall i int :: i in visited ==> max >= x[i]
+ decreases len(domain(x)) - len(visited)
+ for k, v = range x with visited {
+ if v > max {
+ max = v
+ }
+ }
+}
+
+decreases
+func bar1() {
+ x := map[int]uint{1:1, 2:2, 3:3}
+ m := foo1(x)
+ assert forall i int :: i in domain(x) ==> m >= x[i]
+}
From 501565c49f0a5a6cbdd3c892034b6de0e3208654 Mon Sep 17 00:00:00 2001
From: viper-admin <59963956+viper-admin@users.noreply.github.com>
Date: Thu, 20 Oct 2022 17:10:10 +0200
Subject: [PATCH 021/296] Updates submodules (#552)
Co-authored-by: jcp19
---
viperserver | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/viperserver b/viperserver
index 2e4743769..346cc60f3 160000
--- a/viperserver
+++ b/viperserver
@@ -1 +1 @@
-Subproject commit 2e47437693fcdc32f8f18b7c923550c1143013d7
+Subproject commit 346cc60f30950ed5c75870fe7820d04670e0f940
From 28b312ad7fab86a06a68bc5f40f9547abd5219c7 Mon Sep 17 00:00:00 2001
From: Linard Arquint
Date: Tue, 11 Oct 2022 10:11:06 +0200
Subject: [PATCH 022/296] assumes termination measure for imported (pure)
methods & functions such that no proof obligations will be emitted
---
.../gobra/frontend/ParseTreeTranslator.scala | 20 ++++++++---
.../termination-import/foo/foo.gobra | 34 +++++++++++++++++++
.../termination/termination-import/main.gobra | 18 ++++++++++
3 files changed, 67 insertions(+), 5 deletions(-)
create mode 100644 src/test/resources/regressions/features/termination/termination-import/foo/foo.gobra
create mode 100644 src/test/resources/regressions/features/termination/termination-import/main.gobra
diff --git a/src/main/scala/viper/gobra/frontend/ParseTreeTranslator.scala b/src/main/scala/viper/gobra/frontend/ParseTreeTranslator.scala
index 5745091ec..635724cca 100644
--- a/src/main/scala/viper/gobra/frontend/ParseTreeTranslator.scala
+++ b/src/main/scala/viper/gobra/frontend/ParseTreeTranslator.scala
@@ -1858,14 +1858,24 @@ class ParseTreeTranslator(pom: PositionManager, source: Source, specOnly : Boole
* {@link #visitChildren} on {@code ctx}.
*/
override def visitTerminationMeasure(ctx: TerminationMeasureContext): PTerminationMeasure = {
+ // when parsing imported packages (`specOnly` will be true), we trust the annotations of imported members
+ // therefore, e.g. bodies of non-pure functions & methods will be ignored. However, the body of pure
+ // functions & methods is retained. To avoid that Viper will generate proof obligations for checking termination
+ // of imported pure functions & methods, we simply translate tuple termination measures into wildcard measures (for
+ // a given condition). Therefore, no proof obligations will be created for checking termination of imported members.
+ // This is technically not necessary for imported non-pure functions & methods because they are abstract
+ // anyway but we apply the same transformation for simplicity as we do not have to perform a case distinction on
+ // whether the termination measure is part of a pure or non-pure member.
val cond = visitNodeOrNone[PExpression](ctx.expression())
visitExpressionList(ctx.expressionList()) match {
case Vector(PBlankIdentifier()) => PWildcardMeasure(cond).at(ctx)
- case exprs if exprs.nonEmpty => PTupleTerminationMeasure(exprs, cond).at(ctx)
- case Vector() => PTupleTerminationMeasure(Vector.empty, cond).at(ctx.parent match {
- case s : SpecStatementContext => s.DEC()
- case l : LoopSpecContext => l.DEC()
- })
+ case exprs if exprs.nonEmpty => if (specOnly) PWildcardMeasure(cond).at(ctx) else PTupleTerminationMeasure(exprs, cond).at(ctx)
+ case Vector() =>
+ val parentCtx = ctx.parent match {
+ case s : SpecStatementContext => s.DEC()
+ case l : LoopSpecContext => l.DEC()
+ }
+ if (specOnly) PWildcardMeasure(cond).at(parentCtx) else PTupleTerminationMeasure(Vector.empty, cond).at(parentCtx)
case _ => unexpected(ctx)
}
}
diff --git a/src/test/resources/regressions/features/termination/termination-import/foo/foo.gobra b/src/test/resources/regressions/features/termination/termination-import/foo/foo.gobra
new file mode 100644
index 000000000..0f954ffbf
--- /dev/null
+++ b/src/test/resources/regressions/features/termination/termination-import/foo/foo.gobra
@@ -0,0 +1,34 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/publicdomain/zero/1.0/
+
+// all functions & methods in this package violate their termination annotations and thus fail to verify.
+// however, importing and calling these functions & methods in different packages is supposed to be fine because
+// we simply trust the annotations
+
+package foo
+
+type Foo struct{}
+
+decreases
+pure func pure_foo_function() bool {
+ //:: ExpectedOutput(function_termination_error)
+ return pure_foo_function()
+}
+
+decreases
+pure func (foo Foo) pure_foo_method() bool {
+ //:: ExpectedOutput(function_termination_error)
+ return foo.pure_foo_method()
+}
+
+decreases
+func foo_function() bool {
+ //:: ExpectedOutput(function_termination_error)
+ return foo_function()
+}
+
+decreases
+func (foo Foo) foo_method() bool {
+ //:: ExpectedOutput(function_termination_error)
+ return foo.foo_method()
+}
diff --git a/src/test/resources/regressions/features/termination/termination-import/main.gobra b/src/test/resources/regressions/features/termination/termination-import/main.gobra
new file mode 100644
index 000000000..d70c06812
--- /dev/null
+++ b/src/test/resources/regressions/features/termination/termination-import/main.gobra
@@ -0,0 +1,18 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/publicdomain/zero/1.0/
+
+// checks whether termination of imported members is assumed instead of re-checked
+
+package termination
+
+// ##(-I ./)
+import f "foo"
+
+decreases
+func test() {
+ foo := f.Foo{}
+ f.pure_foo_function()
+ foo.pure_foo_method()
+ f.foo_function()
+ foo.foo_method()
+}
From e07e52072c4bb342fdf04cb682ce7fe6d9083366 Mon Sep 17 00:00:00 2001
From: Linard Arquint
Date: Tue, 11 Oct 2022 14:03:41 +0200
Subject: [PATCH 023/296] fixes an unsoundness pointed out by Joao
---
.../gobra/frontend/ParseTreeTranslator.scala | 20 ++----
.../scala/viper/gobra/frontend/Parser.scala | 69 ++++++++++++++++++-
.../foo/foo.gobra | 28 ++++++++
.../termination-import-interface/main.gobra | 26 +++++++
.../foo/foo.gobra | 4 +-
.../main.gobra | 0
6 files changed, 128 insertions(+), 19 deletions(-)
create mode 100644 src/test/resources/regressions/features/termination/termination-import-interface/foo/foo.gobra
create mode 100644 src/test/resources/regressions/features/termination/termination-import-interface/main.gobra
rename src/test/resources/regressions/features/termination/{termination-import => termination-import-members}/foo/foo.gobra (87%)
rename src/test/resources/regressions/features/termination/{termination-import => termination-import-members}/main.gobra (100%)
diff --git a/src/main/scala/viper/gobra/frontend/ParseTreeTranslator.scala b/src/main/scala/viper/gobra/frontend/ParseTreeTranslator.scala
index 635724cca..5745091ec 100644
--- a/src/main/scala/viper/gobra/frontend/ParseTreeTranslator.scala
+++ b/src/main/scala/viper/gobra/frontend/ParseTreeTranslator.scala
@@ -1858,24 +1858,14 @@ class ParseTreeTranslator(pom: PositionManager, source: Source, specOnly : Boole
* {@link #visitChildren} on {@code ctx}.
*/
override def visitTerminationMeasure(ctx: TerminationMeasureContext): PTerminationMeasure = {
- // when parsing imported packages (`specOnly` will be true), we trust the annotations of imported members
- // therefore, e.g. bodies of non-pure functions & methods will be ignored. However, the body of pure
- // functions & methods is retained. To avoid that Viper will generate proof obligations for checking termination
- // of imported pure functions & methods, we simply translate tuple termination measures into wildcard measures (for
- // a given condition). Therefore, no proof obligations will be created for checking termination of imported members.
- // This is technically not necessary for imported non-pure functions & methods because they are abstract
- // anyway but we apply the same transformation for simplicity as we do not have to perform a case distinction on
- // whether the termination measure is part of a pure or non-pure member.
val cond = visitNodeOrNone[PExpression](ctx.expression())
visitExpressionList(ctx.expressionList()) match {
case Vector(PBlankIdentifier()) => PWildcardMeasure(cond).at(ctx)
- case exprs if exprs.nonEmpty => if (specOnly) PWildcardMeasure(cond).at(ctx) else PTupleTerminationMeasure(exprs, cond).at(ctx)
- case Vector() =>
- val parentCtx = ctx.parent match {
- case s : SpecStatementContext => s.DEC()
- case l : LoopSpecContext => l.DEC()
- }
- if (specOnly) PWildcardMeasure(cond).at(parentCtx) else PTupleTerminationMeasure(Vector.empty, cond).at(parentCtx)
+ case exprs if exprs.nonEmpty => PTupleTerminationMeasure(exprs, cond).at(ctx)
+ case Vector() => PTupleTerminationMeasure(Vector.empty, cond).at(ctx.parent match {
+ case s : SpecStatementContext => s.DEC()
+ case l : LoopSpecContext => l.DEC()
+ })
case _ => unexpected(ctx)
}
}
diff --git a/src/main/scala/viper/gobra/frontend/Parser.scala b/src/main/scala/viper/gobra/frontend/Parser.scala
index b02a7b327..697a2d401 100644
--- a/src/main/scala/viper/gobra/frontend/Parser.scala
+++ b/src/main/scala/viper/gobra/frontend/Parser.scala
@@ -50,7 +50,14 @@ object Parser {
})
for {
parseAst <- parseSources(sources, pkgInfo, specOnly)(config)
- postprocessedAst <- new ImportPostprocessor(parseAst.positions.positions).postprocess(parseAst)(config)
+ postprocessors = Seq(
+ new ImportPostprocessor(parseAst.positions.positions),
+ new TerminationMeasurePostprocessor(parseAst.positions.positions, specOnly),
+ )
+ postprocessedAst <- postprocessors.foldLeft[Either[Vector[VerifierError], PPackage]](Right(parseAst)) {
+ case (Right(ast), postprocessor) => postprocessor.postprocess(ast)(config)
+ case (e, _) => e
+ }
} yield postprocessedAst
}
@@ -214,8 +221,11 @@ object Parser {
}
+ trait Postprocessor extends PositionedRewriter {
+ def postprocess(pkg: PPackage)(config: Config): Either[Vector[VerifierError], PPackage]
+ }
- private class ImportPostprocessor(override val positions: Positions) extends PositionedRewriter {
+ private class ImportPostprocessor(override val positions: Positions) extends Postprocessor {
/**
* Replaces all PQualifiedWoQualifierImport by PQualifiedImport nodes
*/
@@ -266,7 +276,62 @@ object Parser {
}
}
+ private class TerminationMeasurePostprocessor(override val positions: Positions, specOnly: Boolean) extends Postprocessor {
+ /**
+ * if `specOnly` is set to true, this postprocessor replaces all tuple termination measures specified for functions
+ * or methods by wildcard termination measures while maintaining their condition (if any). Note that termination
+ * measures specified for interface methods remain untouched.
+ *
+ * // when parsing imported packages (`specOnly` will be true), we trust the annotations of imported members
+ // therefore, e.g. bodies of (non-pure) functions & methods will be ignored. However, the body of pure
+ // functions & methods is retained. To avoid that Viper will generate proof obligations for checking termination
+ // of pure functions & methods, we simply translate tuple termination measures into wildcard measures (for a given
+ // condition). Therefore, no proof obligations will be created for checking termination of imported members.
+ // This is technically not necessary for imported (non-pure) functions & methods because they are abstract
+ // anyway but for pure functions & methods the following transformation ensures that no proof obligations will
+ // be created by Viper:
+ */
+ def postprocess(pkg: PPackage)(config: Config): Either[Vector[VerifierError], PPackage] = {
+ if (specOnly) replaceTerminationMeasures(pkg) else Right(pkg)
+ }
+ private def replaceTerminationMeasures(pkg: PPackage): Either[Vector[VerifierError], PPackage] = {
+ def replace(spec: PFunctionSpec): PFunctionSpec = {
+ val replacedMeasures = spec.terminationMeasures.map {
+ case n@PTupleTerminationMeasure(_, cond) =>
+ val newMeasure = PWildcardMeasure(cond)
+ // copy positional information as the strategy only makes sure that positional information is correctly set
+ // for the resulting function or method declaration
+ pkg.positions.positions.dupPos(n, newMeasure)
+ newMeasure
+ case t => t
+ }
+ PFunctionSpec(spec.pres, spec.preserves, spec.posts, replacedMeasures, spec.isPure, spec.isTrusted)
+ }
+
+ val replaceTerminationMeasuresForFunctionsAndMethods: Strategy =
+ strategyWithName[Any]("replaceTerminationMeasuresForFunctionsAndMethods", {
+ // apply transformation only to the specification of function or method declaration (in particular, do not
+ // apply the transformation to method signatures in interface declarations)
+ case n: PFunctionDecl => Some(PFunctionDecl(n.id, n.args, n.result, replace(n.spec), n.body))
+ case n: PMethodDecl => Some(PMethodDecl(n.id, n.receiver, n.args, n.result, replace(n.spec), n.body))
+ case n: PMember => Some(n)
+ })
+
+ // apply strategy only to import nodes in each program
+ val updatedProgs = pkg.programs.map(prog => {
+ // apply the replaceTerminationMeasuresForFunctionsAndMethods to declarations until the strategy has succeeded
+ // (i.e. has reached PMember nodes) and stop then
+ val updatedDecls = rewrite(alltd(replaceTerminationMeasuresForFunctionsAndMethods))(prog.declarations)
+ val updatedProg = PProgram(prog.packageClause, prog.initPosts, prog.imports, updatedDecls)
+ pkg.positions.positions.dupPos(prog, updatedProg)
+ })
+ // create a new package node with the updated programs
+ val updatedPkg = PPackage(pkg.packageClause, updatedProgs, pkg.positions, pkg.info)
+ pkg.positions.positions.dupPos(pkg, updatedPkg)
+ Right(updatedPkg)
+ }
+ }
private class SyntaxAnalyzer[Rule <: ParserRuleContext, Node <: AnyRef](tokens: CommonTokenStream, source: Source, errors: ListBuffer[ParserError], pom: PositionManager, specOnly: Boolean = false) extends GobraParser(tokens){
diff --git a/src/test/resources/regressions/features/termination/termination-import-interface/foo/foo.gobra b/src/test/resources/regressions/features/termination/termination-import-interface/foo/foo.gobra
new file mode 100644
index 000000000..1c8c1e713
--- /dev/null
+++ b/src/test/resources/regressions/features/termination/termination-import-interface/foo/foo.gobra
@@ -0,0 +1,28 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/publicdomain/zero/1.0/
+
+package foo
+
+type Foo interface {
+ decreases
+ pure PureFn() bool
+
+ decreases
+ Fn() bool
+}
+
+type FooImpl struct{}
+
+//:: ExpectedOutput(generated_implementation_proof:pure_function_termination_error)
+pure func (foo FooImpl) PureFn() bool {
+ return true
+}
+
+//:: ExpectedOutput(generated_implementation_proof:function_termination_error)
+func (foo FooImpl) Fn() bool {
+ return true
+}
+
+func triggerSubtype() Foo {
+ return FooImpl{}
+}
diff --git a/src/test/resources/regressions/features/termination/termination-import-interface/main.gobra b/src/test/resources/regressions/features/termination/termination-import-interface/main.gobra
new file mode 100644
index 000000000..b7e877f65
--- /dev/null
+++ b/src/test/resources/regressions/features/termination/termination-import-interface/main.gobra
@@ -0,0 +1,26 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/publicdomain/zero/1.0/
+
+package main
+
+// this testcase checks whether the correct proof obligations are used for checking behavioral subtyping of an imported
+// interface that specifies termination measures for the interface members.
+
+// ##(-I ./)
+import f "foo"
+
+type FooImpl2 struct{}
+
+//:: ExpectedOutput(generated_implementation_proof:pure_function_termination_error)
+pure func (foo FooImpl2) PureFn() bool {
+ return true
+}
+
+//:: ExpectedOutput(generated_implementation_proof:function_termination_error)
+func (foo FooImpl2) Fn() bool {
+ return true
+}
+
+func triggerSubtype() f.Foo {
+ return FooImpl2{}
+}
diff --git a/src/test/resources/regressions/features/termination/termination-import/foo/foo.gobra b/src/test/resources/regressions/features/termination/termination-import-members/foo/foo.gobra
similarity index 87%
rename from src/test/resources/regressions/features/termination/termination-import/foo/foo.gobra
rename to src/test/resources/regressions/features/termination/termination-import-members/foo/foo.gobra
index 0f954ffbf..dd0a5bbdd 100644
--- a/src/test/resources/regressions/features/termination/termination-import/foo/foo.gobra
+++ b/src/test/resources/regressions/features/termination/termination-import-members/foo/foo.gobra
@@ -11,13 +11,13 @@ type Foo struct{}
decreases
pure func pure_foo_function() bool {
- //:: ExpectedOutput(function_termination_error)
+ //:: ExpectedOutput(pure_function_termination_error)
return pure_foo_function()
}
decreases
pure func (foo Foo) pure_foo_method() bool {
- //:: ExpectedOutput(function_termination_error)
+ //:: ExpectedOutput(pure_function_termination_error)
return foo.pure_foo_method()
}
diff --git a/src/test/resources/regressions/features/termination/termination-import/main.gobra b/src/test/resources/regressions/features/termination/termination-import-members/main.gobra
similarity index 100%
rename from src/test/resources/regressions/features/termination/termination-import/main.gobra
rename to src/test/resources/regressions/features/termination/termination-import-members/main.gobra
From dd41140a58faf83ee022e9d5866d4455bddd4f75 Mon Sep 17 00:00:00 2001
From: Linard Arquint
Date: Tue, 11 Oct 2022 17:16:10 +0200
Subject: [PATCH 024/296] implements suggestion by Joao
---
.../scala/viper/gobra/frontend/Parser.scala | 125 ++++++++++++++----
1 file changed, 100 insertions(+), 25 deletions(-)
diff --git a/src/main/scala/viper/gobra/frontend/Parser.scala b/src/main/scala/viper/gobra/frontend/Parser.scala
index 697a2d401..0a42dce47 100644
--- a/src/main/scala/viper/gobra/frontend/Parser.scala
+++ b/src/main/scala/viper/gobra/frontend/Parser.scala
@@ -22,6 +22,7 @@ import viper.silver.ast.SourcePosition
import scala.collection.mutable.ListBuffer
import java.security.MessageDigest
+import scala.annotation.tailrec
object Parser {
@@ -278,47 +279,119 @@ object Parser {
private class TerminationMeasurePostprocessor(override val positions: Positions, specOnly: Boolean) extends Postprocessor {
/**
- * if `specOnly` is set to true, this postprocessor replaces all tuple termination measures specified for functions
- * or methods by wildcard termination measures while maintaining their condition (if any). Note that termination
+ * if `specOnly` is set to true, this postprocessor replaces all tuple termination measures specified for pure functions
+ * or pure methods by wildcard termination measures while maintaining their condition (if any). Note that termination
* measures specified for interface methods remain untouched.
+ * Furthermore, pure functions and pure methods are made abstract by turning their bodies into an additional
+ * postcondition.
*
- * // when parsing imported packages (`specOnly` will be true), we trust the annotations of imported members
- // therefore, e.g. bodies of (non-pure) functions & methods will be ignored. However, the body of pure
- // functions & methods is retained. To avoid that Viper will generate proof obligations for checking termination
- // of pure functions & methods, we simply translate tuple termination measures into wildcard measures (for a given
- // condition). Therefore, no proof obligations will be created for checking termination of imported members.
- // This is technically not necessary for imported (non-pure) functions & methods because they are abstract
- // anyway but for pure functions & methods the following transformation ensures that no proof obligations will
- // be created by Viper:
+ * These steps ensure that imported pure functions and pure methods do not result in proof obligations as their
+ * postconditions and termination (in case a decreases measure has been provided) is simply assumed.
*/
def postprocess(pkg: PPackage)(config: Config): Either[Vector[VerifierError], PPackage] = {
if (specOnly) replaceTerminationMeasures(pkg) else Right(pkg)
}
private def replaceTerminationMeasures(pkg: PPackage): Either[Vector[VerifierError], PPackage] = {
- def replace(spec: PFunctionSpec): PFunctionSpec = {
- val replacedMeasures = spec.terminationMeasures.map {
- case n@PTupleTerminationMeasure(_, cond) =>
- val newMeasure = PWildcardMeasure(cond)
- // copy positional information as the strategy only makes sure that positional information is correctly set
- // for the resulting function or method declaration
- pkg.positions.positions.dupPos(n, newMeasure)
- newMeasure
- case t => t
- }
- PFunctionSpec(spec.pres, spec.preserves, spec.posts, replacedMeasures, spec.isPure, spec.isTrusted)
+ def createError(n: PNode, errorMsg: String): Vector[VerifierError] =
+ pkg.positions.translate(message(n, errorMsg), ParserError)
+
+ // unfortunately Kiama does not seem to offer a way to report errors while applying the strategy
+ // hence, we keep ourselves track of errors
+ var failedNodes: Vector[VerifierError] = Vector()
+
+ /**
+ * checks whether the body is either empty or consists of a single return statement and returns the corresponding expression
+ */
+ def getBodyExpr(body: Option[(PBodyParameterInfo, PBlock)]): Option[PExpression] = body match {
+ case Some((_, block)) =>
+ block.nonEmptyStmts match {
+ case Vector(PReturn(Vector(expr))) => Some(expr)
+ case _ =>
+ failedNodes = failedNodes ++ createError(block, s"the imported pure function's or method's body is expected to contain only a return statement")
+ None
+ }
+ case None => None
+ }
+
+ /**
+ * returns the name parameter if `param` is a named parameter or creates a new named parameter with the same type
+ */
+ @tailrec
+ def getNamedOutParam(param: PParameter): Option[PNamedParameter] = param match {
+ case p: PNamedParameter => Some(p)
+ case p @ PUnnamedParameter(t) =>
+ val idnDef = PIdnDef("res$") // '$' is appended to make it an invalid identifier and thus avoid the situation that an input parameter has already the same name
+ pkg.positions.positions.dupPos(p, idnDef)
+ val namedParam = PNamedParameter(idnDef, t)
+ pkg.positions.positions.dupPos(p, namedParam)
+ Some(namedParam)
+ case PExplicitGhostParameter(actual) => getNamedOutParam(actual)
+ }
+
+ /**
+ * checks that there is exactly a single parameter and turns into into a named parameter in case it isn't yet a
+ * named parameter
+ */
+ def getOutParam(result: PResult): Option[PNamedParameter] = result.outs match {
+ case Vector(out) => getNamedOutParam(out)
+ case _ =>
+ failedNodes = failedNodes ++ createError(result, s"the imported pure function or method does not have exactly one result argument")
+ None
+ }
+
+ /**
+ * performs the following operations:
+ * - makes the out parameter a named parameter if it's not the case yet
+ * - adds a postcondition stating that the named out parameter is equal to the body (the body can thus be dropped)
+ * - turns the decreases measures into wildcards while retaining the conditions under which they have been specified
+ * returns the modified result and spec
+ */
+ def turnBodyIntoPostcondition(result: PResult, spec: PFunctionSpec, body: Option[(PBodyParameterInfo, PBlock)]): Option[(PResult, PFunctionSpec)] = {
+ for {
+ body <- getBodyExpr(body)
+ outParam <- getOutParam(result)
+ modifiedResult = PResult(Vector(outParam))
+ _ = pkg.positions.positions.dupPos(result, modifiedResult)
+ outIdnUse = PIdnUse(outParam.id.name)
+ _ = pkg.positions.positions.dupPos(body, outIdnUse)
+ outOperand = PNamedOperand(outIdnUse)
+ _ = pkg.positions.positions.dupPos(body, outOperand)
+ additionalPostcondition = PEquals(outOperand, body)
+ _ = pkg.positions.positions.dupPos(body, additionalPostcondition)
+ // turning the body into a postcondition is not enough because Viper checks termination also for postconditions
+ // therefore, we turn termination measure tuples into wildcards to assume termination instead of checking it
+ modifiedTerminationMeasures = spec.terminationMeasures.map {
+ case n@PTupleTerminationMeasure(_, cond) =>
+ val newMeasure = PWildcardMeasure(cond)
+ pkg.positions.positions.dupPos(n, newMeasure)
+ newMeasure
+ case t => t
+ }
+ modifiedSpec = PFunctionSpec(spec.pres, spec.preserves, spec.posts :+ additionalPostcondition, modifiedTerminationMeasures, spec.isPure, spec.isTrusted)
+ _ = pkg.positions.positions.dupPos(spec, modifiedSpec)
+ } yield (modifiedResult, modifiedSpec)
}
val replaceTerminationMeasuresForFunctionsAndMethods: Strategy =
strategyWithName[Any]("replaceTerminationMeasuresForFunctionsAndMethods", {
// apply transformation only to the specification of function or method declaration (in particular, do not
// apply the transformation to method signatures in interface declarations)
- case n: PFunctionDecl => Some(PFunctionDecl(n.id, n.args, n.result, replace(n.spec), n.body))
- case n: PMethodDecl => Some(PMethodDecl(n.id, n.receiver, n.args, n.result, replace(n.spec), n.body))
+ case n: PFunctionDecl if n.spec.isPure =>
+ for {
+ (modifiedResult, modifiedSpec) <- turnBodyIntoPostcondition(n.result, n.spec, n.body)
+ modifiedDecl = PFunctionDecl(n.id, n.args, modifiedResult, modifiedSpec, None)
+ _ = pkg.positions.positions.dupPos(n, modifiedDecl)
+ } yield modifiedDecl
+ case n: PMethodDecl if n.spec.isPure =>
+ for {
+ (modifiedResult, modifiedSpec) <- turnBodyIntoPostcondition(n.result, n.spec, n.body)
+ modifiedDecl = PMethodDecl(n.id, n.receiver, n.args, modifiedResult, modifiedSpec, None)
+ _ = pkg.positions.positions.dupPos(n, modifiedDecl)
+ } yield modifiedDecl
case n: PMember => Some(n)
})
- // apply strategy only to import nodes in each program
val updatedProgs = pkg.programs.map(prog => {
// apply the replaceTerminationMeasuresForFunctionsAndMethods to declarations until the strategy has succeeded
// (i.e. has reached PMember nodes) and stop then
@@ -329,7 +402,9 @@ object Parser {
// create a new package node with the updated programs
val updatedPkg = PPackage(pkg.packageClause, updatedProgs, pkg.positions, pkg.info)
pkg.positions.positions.dupPos(pkg, updatedPkg)
- Right(updatedPkg)
+ // check whether an error has occurred
+ if (failedNodes.isEmpty) Right(updatedPkg)
+ else Left(failedNodes)
}
}
From 204d047ded1ff5c88ab4026334a6b5df593a20dd Mon Sep 17 00:00:00 2001
From: Linard Arquint
Date: Wed, 12 Oct 2022 09:26:18 +0200
Subject: [PATCH 025/296] simplifies code and uses ghost equality instead of
regular equality
---
.../scala/viper/gobra/frontend/Parser.scala | 60 ++++++++-----------
1 file changed, 25 insertions(+), 35 deletions(-)
diff --git a/src/main/scala/viper/gobra/frontend/Parser.scala b/src/main/scala/viper/gobra/frontend/Parser.scala
index 0a42dce47..562fe01bf 100644
--- a/src/main/scala/viper/gobra/frontend/Parser.scala
+++ b/src/main/scala/viper/gobra/frontend/Parser.scala
@@ -18,6 +18,7 @@ import org.antlr.v4.runtime.{CharStreams, CommonTokenStream, DefaultErrorStrateg
import org.antlr.v4.runtime.atn.PredictionMode
import org.antlr.v4.runtime.misc.ParseCancellationException
import viper.gobra.frontend.GobraParser.{ExprOnlyContext, ImportDeclContext, SourceFileContext, SpecMemberContext, StmtOnlyContext, TypeOnlyContext}
+import viper.gobra.util.Violation.violation
import viper.silver.ast.SourcePosition
import scala.collection.mutable.ListBuffer
@@ -223,6 +224,13 @@ object Parser {
trait Postprocessor extends PositionedRewriter {
+ /** this PositionedAstNode contains a subset of the utility functions found in ParseTreeTranslator.PositionedAstNode */
+ implicit class PositionedAstNode[N <: AnyRef](node: N) {
+ def at(other: PNode): N = {
+ positions.dupPos(other, node)
+ }
+ }
+
def postprocess(pkg: PPackage)(config: Config): Either[Vector[VerifierError], PPackage]
}
@@ -244,8 +252,7 @@ object Parser {
qualifierName <- PackageResolver.getQualifier(n)(config)
// create a new PIdnDef node and set its positions according to the old node (PositionedRewriter ensures that
// the same happens for the newly created PExplicitQualifiedImport)
- idnDef = PIdnDef(qualifierName)
- _ = pkg.positions.positions.dupPos(n, idnDef)
+ idnDef = PIdnDef(qualifierName).at(n)
} yield PExplicitQualifiedImport(idnDef, n.importPath, n.importPres)
// record errors:
qualifier.left.foreach(errorMsg => failedNodes = failedNodes ++ createError(n, errorMsg))
@@ -265,12 +272,10 @@ object Parser {
// note that the resolveImports strategy could be embedded in e.g. a logfail strategy to report a
// failed strategy application
val updatedImports = rewrite(topdown(attempt(resolveImports)))(prog.imports)
- val updatedProg = PProgram(prog.packageClause, prog.initPosts, updatedImports, prog.declarations)
- pkg.positions.positions.dupPos(prog, updatedProg)
+ PProgram(prog.packageClause, prog.initPosts, updatedImports, prog.declarations).at(prog)
})
// create a new package node with the updated programs
- val updatedPkg = PPackage(pkg.packageClause, updatedProgs, pkg.positions, pkg.info)
- pkg.positions.positions.dupPos(pkg, updatedPkg)
+ val updatedPkg = PPackage(pkg.packageClause, updatedProgs, pkg.positions, pkg.info).at(pkg)
// check whether an error has occurred
if (failedNodes.isEmpty) Right(updatedPkg)
else Left(failedNodes)
@@ -321,11 +326,8 @@ object Parser {
def getNamedOutParam(param: PParameter): Option[PNamedParameter] = param match {
case p: PNamedParameter => Some(p)
case p @ PUnnamedParameter(t) =>
- val idnDef = PIdnDef("res$") // '$' is appended to make it an invalid identifier and thus avoid the situation that an input parameter has already the same name
- pkg.positions.positions.dupPos(p, idnDef)
- val namedParam = PNamedParameter(idnDef, t)
- pkg.positions.positions.dupPos(p, namedParam)
- Some(namedParam)
+ val idnDef = PIdnDef("res$").at(p) // '$' is appended to make it an invalid identifier and thus avoid the situation that an input parameter has already the same name
+ Some(PNamedParameter(idnDef, t).at(p))
case PExplicitGhostParameter(actual) => getNamedOutParam(actual)
}
@@ -351,25 +353,19 @@ object Parser {
for {
body <- getBodyExpr(body)
outParam <- getOutParam(result)
- modifiedResult = PResult(Vector(outParam))
- _ = pkg.positions.positions.dupPos(result, modifiedResult)
- outIdnUse = PIdnUse(outParam.id.name)
- _ = pkg.positions.positions.dupPos(body, outIdnUse)
- outOperand = PNamedOperand(outIdnUse)
- _ = pkg.positions.positions.dupPos(body, outOperand)
- additionalPostcondition = PEquals(outOperand, body)
- _ = pkg.positions.positions.dupPos(body, additionalPostcondition)
+ modifiedResult = PResult(Vector(outParam)).at(result)
+ outIdnUse = PIdnUse(outParam.id.name).at(body)
+ outOperand = PNamedOperand(outIdnUse).at(body)
+ // we use ghost equals here to ensure that no additional checks are being added depending on the expression's type
+ // (e.g. that the returned interface is comparable)
+ additionalPostcondition = PGhostEquals(outOperand, body).at(body)
// turning the body into a postcondition is not enough because Viper checks termination also for postconditions
// therefore, we turn termination measure tuples into wildcards to assume termination instead of checking it
modifiedTerminationMeasures = spec.terminationMeasures.map {
- case n@PTupleTerminationMeasure(_, cond) =>
- val newMeasure = PWildcardMeasure(cond)
- pkg.positions.positions.dupPos(n, newMeasure)
- newMeasure
+ case n@PTupleTerminationMeasure(_, cond) => PWildcardMeasure(cond).at(n)
case t => t
}
- modifiedSpec = PFunctionSpec(spec.pres, spec.preserves, spec.posts :+ additionalPostcondition, modifiedTerminationMeasures, spec.isPure, spec.isTrusted)
- _ = pkg.positions.positions.dupPos(spec, modifiedSpec)
+ modifiedSpec = PFunctionSpec(spec.pres, spec.preserves, additionalPostcondition +: spec.posts, modifiedTerminationMeasures, spec.isPure, spec.isTrusted).at(spec)
} yield (modifiedResult, modifiedSpec)
}
@@ -380,15 +376,11 @@ object Parser {
case n: PFunctionDecl if n.spec.isPure =>
for {
(modifiedResult, modifiedSpec) <- turnBodyIntoPostcondition(n.result, n.spec, n.body)
- modifiedDecl = PFunctionDecl(n.id, n.args, modifiedResult, modifiedSpec, None)
- _ = pkg.positions.positions.dupPos(n, modifiedDecl)
- } yield modifiedDecl
+ } yield PFunctionDecl(n.id, n.args, modifiedResult, modifiedSpec, None).at(n)
case n: PMethodDecl if n.spec.isPure =>
for {
(modifiedResult, modifiedSpec) <- turnBodyIntoPostcondition(n.result, n.spec, n.body)
- modifiedDecl = PMethodDecl(n.id, n.receiver, n.args, modifiedResult, modifiedSpec, None)
- _ = pkg.positions.positions.dupPos(n, modifiedDecl)
- } yield modifiedDecl
+ } yield PMethodDecl(n.id, n.receiver, n.args, modifiedResult, modifiedSpec, None).at(n)
case n: PMember => Some(n)
})
@@ -396,12 +388,10 @@ object Parser {
// apply the replaceTerminationMeasuresForFunctionsAndMethods to declarations until the strategy has succeeded
// (i.e. has reached PMember nodes) and stop then
val updatedDecls = rewrite(alltd(replaceTerminationMeasuresForFunctionsAndMethods))(prog.declarations)
- val updatedProg = PProgram(prog.packageClause, prog.initPosts, prog.imports, updatedDecls)
- pkg.positions.positions.dupPos(prog, updatedProg)
+ PProgram(prog.packageClause, prog.initPosts, prog.imports, updatedDecls).at(prog)
})
// create a new package node with the updated programs
- val updatedPkg = PPackage(pkg.packageClause, updatedProgs, pkg.positions, pkg.info)
- pkg.positions.positions.dupPos(pkg, updatedPkg)
+ val updatedPkg = PPackage(pkg.packageClause, updatedProgs, pkg.positions, pkg.info).at(pkg)
// check whether an error has occurred
if (failedNodes.isEmpty) Right(updatedPkg)
else Left(failedNodes)
From bc32a786928d07ef8bb78e47fa0d0a6a56cafcdb Mon Sep 17 00:00:00 2001
From: Linard Arquint
Date: Wed, 12 Oct 2022 09:32:33 +0200
Subject: [PATCH 026/296] removes unused import
---
src/main/scala/viper/gobra/frontend/Parser.scala | 1 -
1 file changed, 1 deletion(-)
diff --git a/src/main/scala/viper/gobra/frontend/Parser.scala b/src/main/scala/viper/gobra/frontend/Parser.scala
index 562fe01bf..313bb15ac 100644
--- a/src/main/scala/viper/gobra/frontend/Parser.scala
+++ b/src/main/scala/viper/gobra/frontend/Parser.scala
@@ -18,7 +18,6 @@ import org.antlr.v4.runtime.{CharStreams, CommonTokenStream, DefaultErrorStrateg
import org.antlr.v4.runtime.atn.PredictionMode
import org.antlr.v4.runtime.misc.ParseCancellationException
import viper.gobra.frontend.GobraParser.{ExprOnlyContext, ImportDeclContext, SourceFileContext, SpecMemberContext, StmtOnlyContext, TypeOnlyContext}
-import viper.gobra.util.Violation.violation
import viper.silver.ast.SourcePosition
import scala.collection.mutable.ListBuffer
From a5a37636712e3f5905f65bd41133faef9588a3db Mon Sep 17 00:00:00 2001
From: Linard Arquint
Date: Mon, 17 Oct 2022 15:37:35 +0200
Subject: [PATCH 027/296] only change decreases measure to wildcard and leave
bodies of pure functions and methods untouched
---
.../scala/viper/gobra/frontend/Parser.scala | 100 +++---------------
1 file changed, 14 insertions(+), 86 deletions(-)
diff --git a/src/main/scala/viper/gobra/frontend/Parser.scala b/src/main/scala/viper/gobra/frontend/Parser.scala
index 313bb15ac..6fcefc649 100644
--- a/src/main/scala/viper/gobra/frontend/Parser.scala
+++ b/src/main/scala/viper/gobra/frontend/Parser.scala
@@ -22,7 +22,6 @@ import viper.silver.ast.SourcePosition
import scala.collection.mutable.ListBuffer
import java.security.MessageDigest
-import scala.annotation.tailrec
object Parser {
@@ -286,100 +285,32 @@ object Parser {
* if `specOnly` is set to true, this postprocessor replaces all tuple termination measures specified for pure functions
* or pure methods by wildcard termination measures while maintaining their condition (if any). Note that termination
* measures specified for interface methods remain untouched.
- * Furthermore, pure functions and pure methods are made abstract by turning their bodies into an additional
- * postcondition.
*
- * These steps ensure that imported pure functions and pure methods do not result in proof obligations as their
- * postconditions and termination (in case a decreases measure has been provided) is simply assumed.
+ * These steps ensure that termination of imported pure functions and pure methods is not checked again (in case
+ * a decreases measure has been provided) and instead gets simply assumed.
+ *
+ * Note that we do not transform the body of pure functions and pure methods (e.g. by turning the body into a
+ * postcondition) because this would result in a matching loop for recursive functions.
*/
def postprocess(pkg: PPackage)(config: Config): Either[Vector[VerifierError], PPackage] = {
if (specOnly) replaceTerminationMeasures(pkg) else Right(pkg)
}
private def replaceTerminationMeasures(pkg: PPackage): Either[Vector[VerifierError], PPackage] = {
- def createError(n: PNode, errorMsg: String): Vector[VerifierError] =
- pkg.positions.translate(message(n, errorMsg), ParserError)
-
- // unfortunately Kiama does not seem to offer a way to report errors while applying the strategy
- // hence, we keep ourselves track of errors
- var failedNodes: Vector[VerifierError] = Vector()
-
- /**
- * checks whether the body is either empty or consists of a single return statement and returns the corresponding expression
- */
- def getBodyExpr(body: Option[(PBodyParameterInfo, PBlock)]): Option[PExpression] = body match {
- case Some((_, block)) =>
- block.nonEmptyStmts match {
- case Vector(PReturn(Vector(expr))) => Some(expr)
- case _ =>
- failedNodes = failedNodes ++ createError(block, s"the imported pure function's or method's body is expected to contain only a return statement")
- None
- }
- case None => None
- }
-
- /**
- * returns the name parameter if `param` is a named parameter or creates a new named parameter with the same type
- */
- @tailrec
- def getNamedOutParam(param: PParameter): Option[PNamedParameter] = param match {
- case p: PNamedParameter => Some(p)
- case p @ PUnnamedParameter(t) =>
- val idnDef = PIdnDef("res$").at(p) // '$' is appended to make it an invalid identifier and thus avoid the situation that an input parameter has already the same name
- Some(PNamedParameter(idnDef, t).at(p))
- case PExplicitGhostParameter(actual) => getNamedOutParam(actual)
- }
-
- /**
- * checks that there is exactly a single parameter and turns into into a named parameter in case it isn't yet a
- * named parameter
- */
- def getOutParam(result: PResult): Option[PNamedParameter] = result.outs match {
- case Vector(out) => getNamedOutParam(out)
- case _ =>
- failedNodes = failedNodes ++ createError(result, s"the imported pure function or method does not have exactly one result argument")
- None
- }
-
- /**
- * performs the following operations:
- * - makes the out parameter a named parameter if it's not the case yet
- * - adds a postcondition stating that the named out parameter is equal to the body (the body can thus be dropped)
- * - turns the decreases measures into wildcards while retaining the conditions under which they have been specified
- * returns the modified result and spec
- */
- def turnBodyIntoPostcondition(result: PResult, spec: PFunctionSpec, body: Option[(PBodyParameterInfo, PBlock)]): Option[(PResult, PFunctionSpec)] = {
- for {
- body <- getBodyExpr(body)
- outParam <- getOutParam(result)
- modifiedResult = PResult(Vector(outParam)).at(result)
- outIdnUse = PIdnUse(outParam.id.name).at(body)
- outOperand = PNamedOperand(outIdnUse).at(body)
- // we use ghost equals here to ensure that no additional checks are being added depending on the expression's type
- // (e.g. that the returned interface is comparable)
- additionalPostcondition = PGhostEquals(outOperand, body).at(body)
- // turning the body into a postcondition is not enough because Viper checks termination also for postconditions
- // therefore, we turn termination measure tuples into wildcards to assume termination instead of checking it
- modifiedTerminationMeasures = spec.terminationMeasures.map {
- case n@PTupleTerminationMeasure(_, cond) => PWildcardMeasure(cond).at(n)
- case t => t
- }
- modifiedSpec = PFunctionSpec(spec.pres, spec.preserves, additionalPostcondition +: spec.posts, modifiedTerminationMeasures, spec.isPure, spec.isTrusted).at(spec)
- } yield (modifiedResult, modifiedSpec)
+ def replace(spec: PFunctionSpec): PFunctionSpec = {
+ val replacedMeasures = spec.terminationMeasures.map {
+ case n@PTupleTerminationMeasure(_, cond) => PWildcardMeasure(cond).at(n)
+ case t => t
+ }
+ PFunctionSpec(spec.pres, spec.preserves, spec.posts, replacedMeasures, spec.isPure, spec.isTrusted)
}
val replaceTerminationMeasuresForFunctionsAndMethods: Strategy =
strategyWithName[Any]("replaceTerminationMeasuresForFunctionsAndMethods", {
// apply transformation only to the specification of function or method declaration (in particular, do not
// apply the transformation to method signatures in interface declarations)
- case n: PFunctionDecl if n.spec.isPure =>
- for {
- (modifiedResult, modifiedSpec) <- turnBodyIntoPostcondition(n.result, n.spec, n.body)
- } yield PFunctionDecl(n.id, n.args, modifiedResult, modifiedSpec, None).at(n)
- case n: PMethodDecl if n.spec.isPure =>
- for {
- (modifiedResult, modifiedSpec) <- turnBodyIntoPostcondition(n.result, n.spec, n.body)
- } yield PMethodDecl(n.id, n.receiver, n.args, modifiedResult, modifiedSpec, None).at(n)
+ case n: PFunctionDecl => Some(PFunctionDecl(n.id, n.args, n.result, replace(n.spec), n.body))
+ case n: PMethodDecl => Some(PMethodDecl(n.id, n.receiver, n.args, n.result, replace(n.spec), n.body))
case n: PMember => Some(n)
})
@@ -390,10 +321,7 @@ object Parser {
PProgram(prog.packageClause, prog.initPosts, prog.imports, updatedDecls).at(prog)
})
// create a new package node with the updated programs
- val updatedPkg = PPackage(pkg.packageClause, updatedProgs, pkg.positions, pkg.info).at(pkg)
- // check whether an error has occurred
- if (failedNodes.isEmpty) Right(updatedPkg)
- else Left(failedNodes)
+ Right(PPackage(pkg.packageClause, updatedProgs, pkg.positions, pkg.info).at(pkg))
}
}
From 6bf3198cfed7ff959167abffcef9def7f9ba5d10 Mon Sep 17 00:00:00 2001
From: Linard Arquint
Date: Tue, 18 Oct 2022 09:28:23 +0200
Subject: [PATCH 028/296] makes sure not to swallow errors from silver plugins
and fixes the termination plugin's integration to emit the wellfounded order
domain if at least one decreases tuple occurs in the program
---
.../viper/gobra/translator/Translator.scala | 1 +
.../transformers/AssumeTransformer.scala | 5 +-
.../transformers/TerminationTransformer.scala | 63 +++++++++++++------
.../transformers/ViperTransformer.scala | 3 +-
4 files changed, 50 insertions(+), 22 deletions(-)
diff --git a/src/main/scala/viper/gobra/translator/Translator.scala b/src/main/scala/viper/gobra/translator/Translator.scala
index 8cb2a1fab..823862088 100644
--- a/src/main/scala/viper/gobra/translator/Translator.scala
+++ b/src/main/scala/viper/gobra/translator/Translator.scala
@@ -37,6 +37,7 @@ object Translator {
val transformedTask = transformers.foldLeft(task) {
case (t, transformer) => transformer.transform(t)
+ .fold(errs => Violation.violation(s"Applying transformer ${transformer.getClass.getSimpleName} resulted in errors: ${errs.toString}"), identity)
}
config.reporter report GeneratedViperMessage(config.taskName, config.packageInfoInputMap(pkgInfo).map(_.name), () => sortAst(transformedTask.program), () => transformedTask.backtrack)
diff --git a/src/main/scala/viper/gobra/translator/transformers/AssumeTransformer.scala b/src/main/scala/viper/gobra/translator/transformers/AssumeTransformer.scala
index 8ccfc97a0..2e5dee96a 100644
--- a/src/main/scala/viper/gobra/translator/transformers/AssumeTransformer.scala
+++ b/src/main/scala/viper/gobra/translator/transformers/AssumeTransformer.scala
@@ -7,10 +7,11 @@
package viper.gobra.translator.transformers
import viper.gobra.backend.BackendVerifier
import viper.silver.ast.utility.ImpureAssumeRewriter
+import viper.silver.verifier.AbstractError
import viper.silver.{ast => vpr}
class AssumeTransformer extends ViperTransformer {
- override def transform(task: BackendVerifier.Task): BackendVerifier.Task = {
+ override def transform(task: BackendVerifier.Task): Either[Seq[AbstractError], BackendVerifier.Task] = {
val progWithoutAssumes = {
val uncleanProg = ImpureAssumeRewriter.rewriteAssumes(task.program)
// FIXME: required due to inconvenient silver assume rewriter
@@ -21,6 +22,6 @@ class AssumeTransformer extends ViperTransformer {
uncleanProg.copy(domains = cleanedDomains)(uncleanProg.pos, uncleanProg.info, uncleanProg.errT)
}
- task.copy(program = progWithoutAssumes)
+ Right(task.copy(program = progWithoutAssumes))
}
}
diff --git a/src/main/scala/viper/gobra/translator/transformers/TerminationTransformer.scala b/src/main/scala/viper/gobra/translator/transformers/TerminationTransformer.scala
index 50465895c..c140dd988 100644
--- a/src/main/scala/viper/gobra/translator/transformers/TerminationTransformer.scala
+++ b/src/main/scala/viper/gobra/translator/transformers/TerminationTransformer.scala
@@ -7,25 +7,30 @@
package viper.gobra.translator.transformers
import java.nio.file.Path
import viper.gobra.backend.BackendVerifier
-import viper.gobra.util.Violation
import viper.silicon.Silicon
import viper.silver.{ast => vpr}
import viper.silver.frontend.{DefaultStates, ViperAstProvider}
+import viper.silver.plugin.SilverPlugin
import viper.silver.plugin.standard.predicateinstance.PredicateInstance.PredicateInstanceDomainName
import viper.silver.plugin.standard.termination.{DecreasesTuple, TerminationPlugin}
import viper.silver.reporter.{NoopReporter, Reporter}
import viper.silver.plugin.standard.predicateinstance.PredicateInstancePlugin
+import viper.silver.verifier.AbstractError
class TerminationTransformer extends ViperTransformer {
- override def transform(task: BackendVerifier.Task): BackendVerifier.Task = {
- (addDecreasesDomains _ andThen executeTerminationPlugin)(task)
+ override def transform(task: BackendVerifier.Task): Either[Seq[AbstractError], BackendVerifier.Task] = {
+ for {
+ progWithDecreasesDomains <- addDecreasesDomains(task)
+ transformedProg <- executeTerminationPlugin(progWithDecreasesDomains)
+ } yield transformedProg
}
- private def addDecreasesDomains(task: BackendVerifier.Task): BackendVerifier.Task = {
+ private def addDecreasesDomains(task: BackendVerifier.Task): Either[Seq[AbstractError], BackendVerifier.Task] = {
// constructs a separate Viper program (as a string) that should be parsed
// after parsing this separate Viper program, the resulting AST is combined with `task`
+ val declarationImport = "decreases/declaration.vpr"
val allImport = "decreases/all.vpr"
def type2Import(typ: vpr.Type): String = typ match {
case vpr.Bool => "decreases/bool.vpr"
@@ -39,31 +44,41 @@ class TerminationTransformer extends ViperTransformer {
case _ => allImport // fallback
}
- // find the types of all expressions used as decreases measues
+ // find the types of all expressions used as decreases measures
val measureTypes = task.program.deepCollect {
case DecreasesTuple(tupleExpressions, _) => tupleExpressions.map(_.typ)
- }.flatten.distinct
+ }
+ // does program contain any (possibly empty) decreases tuples?
+ val containsTerminationChecks: Boolean = measureTypes.nonEmpty
+ val distinctMeasureTypes = measureTypes.flatten.distinct
// map these types to the respective files that should be imported
- val imports = measureTypes
+ val importsForMeasureTypes = distinctMeasureTypes
.map(type2Import)
.distinct
+ // we need at least `declarationImport` if there is any tuple decreases measure. However, we do not need to import
+ // this file if we already import any other file with the domain for a particular type
+ val imports = if (importsForMeasureTypes.nonEmpty) importsForMeasureTypes
+ else if (containsTerminationChecks) Seq(declarationImport)
+ else Seq.empty
// if `allImport` is in the list of files that should be imported, we can ignore all others and instead only import
// `allImport`
val importsAll = imports.contains(allImport)
/** list of Viper standard imports that should be parsed */
val filteredImports = if (importsAll) Seq(allImport) else imports
val progWithImports = filteredImports.map(p => s"import <${p}>").mkString("\n")
- val vprProgram = parseVpr(progWithImports)
- combine(task, vprProgram)
+ for {
+ vprProgram <- parseVpr(progWithImports)
+ } yield combine(task, vprProgram)
}
- private def parseVpr(program: String): vpr.Program = {
+ private def parseVpr(program: String): Either[Seq[AbstractError], vpr.Program] = {
val frontend = new StringViperAstProvider(program)
frontend.execute()
- if (frontend.errors.nonEmpty) {
- Violation.violation(s"errors while parsing Viper program ${program}: ${frontend.errors}")
+ if (frontend.errors.isEmpty) {
+ Right(frontend.translationResult)
+ } else {
+ Left(frontend.errors)
}
- frontend.translationResult
}
private def combine(task: BackendVerifier.Task, other: vpr.Program): BackendVerifier.Task = {
@@ -79,12 +94,23 @@ class TerminationTransformer extends ViperTransformer {
task.copy(program = newProg)
}
- private def executeTerminationPlugin(task: BackendVerifier.Task): BackendVerifier.Task = {
- val plugin = new TerminationPlugin(null, null, null, null)
+ private def executeTerminationPlugin(task: BackendVerifier.Task): Either[Seq[AbstractError], BackendVerifier.Task] = {
+ def applyPlugin(plugin: SilverPlugin, prog : vpr.Program): Either[Seq[AbstractError], vpr.Program] = {
+ val transformedProgram = plugin.beforeVerify(prog)
+ if (plugin.errors.isEmpty) {
+ Right(transformedProgram)
+ } else {
+ Left(plugin.errors)
+ }
+ }
+
+ val terminationPlugin = new TerminationPlugin(null, null, null, null)
val predInstancePlugin = new PredicateInstancePlugin(null, null, null, null)
- val transformedProgram = plugin.beforeVerify(task.program)
- val programWithoutPredicateInstances = predInstancePlugin.beforeVerify(transformedProgram)
- task.copy(program = programWithoutPredicateInstances)
+
+ for {
+ transformedProgram <- applyPlugin(terminationPlugin, task.program)
+ programWithoutPredicateInstances <- applyPlugin(predInstancePlugin, transformedProgram)
+ } yield task.copy(program = programWithoutPredicateInstances)
}
/**
@@ -113,4 +139,3 @@ class TerminationTransformer extends ViperTransformer {
}
}
}
-
diff --git a/src/main/scala/viper/gobra/translator/transformers/ViperTransformer.scala b/src/main/scala/viper/gobra/translator/transformers/ViperTransformer.scala
index 28efd43bb..6ddeca0b9 100644
--- a/src/main/scala/viper/gobra/translator/transformers/ViperTransformer.scala
+++ b/src/main/scala/viper/gobra/translator/transformers/ViperTransformer.scala
@@ -7,11 +7,12 @@
package viper.gobra.translator.transformers
import viper.gobra.backend.BackendVerifier.Task
+import viper.silver.verifier.AbstractError
/**
* Trait for a Viper-to-Viper transformation. The Viper AST in the task as well as the associated backtracking
* information can be transformed by classes implementing this trait.
*/
trait ViperTransformer {
- def transform(task: Task): Task
+ def transform(task: Task): Either[Seq[AbstractError], Task]
}
From 8915a65d24f5dcb9d3d308e3ca3168c677bdcd85 Mon Sep 17 00:00:00 2001
From: Linard Arquint
Date: Mon, 24 Oct 2022 16:54:01 +0200
Subject: [PATCH 029/296] updates ViperServer to latest commit
---
project/build.properties | 2 +-
viperserver | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/project/build.properties b/project/build.properties
index 25792e1f1..11ca82dfc 100644
--- a/project/build.properties
+++ b/project/build.properties
@@ -1,4 +1,4 @@
# Any copyright is dedicated to the Public Domain.
# http://creativecommons.org/publicdomain/zero/1.0/
-sbt.version = 1.5.7
+sbt.version = 1.7.2
diff --git a/viperserver b/viperserver
index 346cc60f3..91fc8e378 160000
--- a/viperserver
+++ b/viperserver
@@ -1 +1 @@
-Subproject commit 346cc60f30950ed5c75870fe7820d04670e0f940
+Subproject commit 91fc8e3781a357d98ca6b2b9fb91037e9dff1fb2
From 916fd4367770ea12a8e837846912a88842b8b2fc Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jo=C3=A3o=20Pereira?=
Date: Mon, 31 Oct 2022 22:54:11 +0100
Subject: [PATCH 030/296] Fix issue 553 (#557)
* No heap dependent triggers
* Uncover yet another heap-dependent trigger
---
.../translator/encodings/StringEncoding.scala | 9 ++++----
.../encodings/typeless/BuiltInEncoding.scala | 22 ++++++++++---------
2 files changed, 17 insertions(+), 14 deletions(-)
diff --git a/src/main/scala/viper/gobra/translator/encodings/StringEncoding.scala b/src/main/scala/viper/gobra/translator/encodings/StringEncoding.scala
index f9f0bf2be..c5416a789 100644
--- a/src/main/scala/viper/gobra/translator/encodings/StringEncoding.scala
+++ b/src/main/scala/viper/gobra/translator/encodings/StringEncoding.scala
@@ -88,7 +88,7 @@ class StringEncoding extends LeafTypeEncoding {
* [ target = []byte(str) ] ->
* [
* var s []byte
- * inhale forall i Int :: 0 <= i && i < len(s) ==> acc(&s[i])
+ * inhale forall i Int :: { &s[i] } 0 <= i && i < len(s) ==> acc(&s[i])
* target = s
* ]
*/
@@ -108,7 +108,7 @@ class StringEncoding extends LeafTypeEncoding {
val qtfVar = in.BoundVar("i", in.IntT(Addressability.boundVariable))(conv.info)
val post = in.SepForall(
vars = Vector(qtfVar),
- triggers = Vector(in.Trigger(Vector(in.IndexedExp(slice, qtfVar, sliceT)(conv.info)))(conv.info)),
+ triggers = Vector(in.Trigger(Vector(in.Ref(in.IndexedExp(slice, qtfVar, sliceT)(conv.info))(conv.info)))(conv.info)),
body = in.Implication(
in.And(in.AtMostCmp(in.IntLit(BigInt(0))(conv.info), qtfVar)(conv.info), in.LessCmp(qtfVar, in.Length(slice)(conv.info))(conv.info))(conv.info),
in.Access(in.Accessible.Address(in.IndexedExp(slice, qtfVar, sliceT)(conv.info)), in.FullPerm(conv.info))(conv.info)
@@ -269,7 +269,7 @@ class StringEncoding extends LeafTypeEncoding {
}
/** Generates the function
- * requires forall i int :: 0 <= i && i < len(s) ==> acc(&s[i], _)
+ * requires forall i int :: { &s[i] } 0 <= i && i < len(s) ==> acc(&s[i], _)
* decreases _
* pure func byteSliceToStrFunc(s []byte) string
*/
@@ -281,9 +281,10 @@ class StringEncoding extends LeafTypeEncoding {
val param = in.Parameter.In("s", paramT)(info)
val res = in.Parameter.Out("res", in.StringT(Addressability.outParameter))(info)
val qtfVar = in.BoundVar("i", in.IntT(Addressability.boundVariable))(info)
+ val trigger = in.Trigger(Vector(in.Ref(in.IndexedExp(param, qtfVar, paramT)(info))(info)))(info)
val pre = in.SepForall(
vars = Vector(qtfVar),
- triggers = Vector(in.Trigger(Vector(in.IndexedExp(param, qtfVar, paramT)(info)))(info)),
+ triggers = Vector(trigger),
body = in.Implication(
in.And(in.AtMostCmp(in.IntLit(BigInt(0))(info), qtfVar)(info), in.LessCmp(qtfVar, in.Length(param)(info))(info))(info),
in.Access(in.Accessible.Address(in.IndexedExp(param, qtfVar, paramT)(info)), in.WildcardPerm(info))(info)
diff --git a/src/main/scala/viper/gobra/translator/encodings/typeless/BuiltInEncoding.scala b/src/main/scala/viper/gobra/translator/encodings/typeless/BuiltInEncoding.scala
index 5bef40ac0..c47efa18e 100644
--- a/src/main/scala/viper/gobra/translator/encodings/typeless/BuiltInEncoding.scala
+++ b/src/main/scala/viper/gobra/translator/encodings/typeless/BuiltInEncoding.scala
@@ -505,14 +505,14 @@ class BuiltInEncoding extends Encoding {
case (CopyFunctionTag, Vector(t1, t2, _)) =>
/**
* requires 0 < p
- * requires forall i int :: { dst[i] } (0 <= i && i < len(dst)) ==> acc(&dst[i], write)
- * requires forall i int :: { src[i] } (0 <= i && i < len(src)) ==> acc(&src[i], p)
+ * requires forall i int :: { &dst[i] } (0 <= i && i < len(dst)) ==> acc(&dst[i], write)
+ * requires forall i int :: { &src[i] } (0 <= i && i < len(src)) ==> acc(&src[i], p)
* ensures len(dst) <= len(src) ==> res == len(dst)
* ensures len(src) < len(dst) ==> res == len(src)
- * ensures forall i int :: { dst[i] } 0 <= i && i < len(dst) ==> acc(&dst[i], write)
- * ensures forall i int :: { src[i] } 0 <= i && i < len(src) ==> acc(&src[i], p)
- * ensures forall i int :: { dst[i] } (0 <= i && i < len(src) && i < len(dst)) ==> dst[i] == old(src[i])
- * ensures forall i int :: { dst[i] } (len(src) <= i && i < len(dst)) ==> dst[i] == old(dst[i])
+ * ensures forall i int :: { &dst[i] } 0 <= i && i < len(dst) ==> acc(&dst[i], write)
+ * ensures forall i int :: { &src[i] } 0 <= i && i < len(src) ==> acc(&src[i], p)
+ * ensures forall i int :: { &dst[i] } (0 <= i && i < len(src) && i < len(dst)) ==> dst[i] == old(src[i])
+ * ensures forall i int :: { &dst[i] } (len(src) <= i && i < len(dst)) ==> dst[i] == old(dst[i])
* func copy(dst, src []int, ghost p perm) (res int)
*/
@@ -542,14 +542,16 @@ class BuiltInEncoding extends Encoding {
// preconditions
val pPre = in.ExprAssertion(in.LessCmp(in.NoPerm(src), pParam)(src))(src)
val preDst = quantify(
- trigger = { i => Vector(in.Trigger(Vector(in.IndexedExp(dstParam, i, dstUnderlyingType)(src)))(src)) },
+ trigger = { i =>
+ Vector(in.Trigger(Vector(in.Ref(in.IndexedExp(dstParam, i, dstUnderlyingType)(src))(src)))(src))
+ },
range = { i => inRange(i, in.IntLit(0)(src), in.Length(dstParam)(src)) },
body = { i =>
in.Access(in.Accessible.Address(in.IndexedExp(dstParam, i, dstUnderlyingType)(src)), in.FullPerm(src))(src)
}
)
val preSrc = quantify(
- trigger = { i => Vector(in.Trigger(Vector(in.IndexedExp(srcParam, i, srcUnderlyingType)(src)))(src)) },
+ trigger = { i => Vector(in.Trigger(Vector(in.Ref(in.IndexedExp(srcParam, i, srcUnderlyingType)(src))(src)))(src)) },
range = { i => inRange(i, in.IntLit(0)(src), in.Length(srcParam)(src)) },
body = { i => in.Access(in.Accessible.Address(in.IndexedExp(srcParam, i, srcUnderlyingType)(src)), pParam)(src) }
)
@@ -571,7 +573,7 @@ class BuiltInEncoding extends Encoding {
val postDst = preDst
val postSrc = preSrc
val postUpdate = quantify(
- trigger = { i => Vector(in.Trigger(Vector(in.IndexedExp(dstParam, i, dstUnderlyingType)(src)))(src)) },
+ trigger = { i => Vector(in.Trigger(Vector(in.Ref(in.IndexedExp(dstParam, i, dstUnderlyingType)(src))(src)))(src)) },
range = { i =>
in.And(
inRange(i, in.IntLit(0)(src), in.Length(srcParam)(src)),
@@ -588,7 +590,7 @@ class BuiltInEncoding extends Encoding {
}
)
val postSame = quantify(
- trigger = { i => Vector(in.Trigger(Vector(in.IndexedExp(dstParam, i, dstUnderlyingType)(src)))(src)) },
+ trigger = { i => Vector(in.Trigger(Vector(in.Ref(in.IndexedExp(dstParam, i, dstUnderlyingType)(src))(src)))(src)) },
range = { i => inRange(i, in.Length(srcParam)(src), in.Length(dstParam)(src)) },
body = { i =>
in.ExprAssertion(
From 79ec25d3e9fcf8752242fd9afff8611454f7c8b2 Mon Sep 17 00:00:00 2001
From: Linard Arquint
Date: Mon, 31 Oct 2022 16:25:17 +0100
Subject: [PATCH 031/296] adds option to BaseConfig to skip verification
---
src/main/scala/viper/gobra/frontend/Config.scala | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/src/main/scala/viper/gobra/frontend/Config.scala b/src/main/scala/viper/gobra/frontend/Config.scala
index 98d79d8ca..3fb3f7c4d 100644
--- a/src/main/scala/viper/gobra/frontend/Config.scala
+++ b/src/main/scala/viper/gobra/frontend/Config.scala
@@ -43,6 +43,7 @@ object ConfigDefaults {
lazy val DefaultLogLevel: Level = LoggerDefaults.DefaultLevel
lazy val DefaultCacheFile: Option[File] = None
lazy val DefaultParseOnly: Boolean = false
+ lazy val DefaultStopAfterEncoding: Boolean = false
lazy val DefaultCheckOverflows: Boolean = false
lazy val DefaultCheckConsistency: Boolean = false
lazy val DefaultShouldChop: Boolean = false
@@ -191,6 +192,7 @@ case class BaseConfig(gobraDirectory: Path = ConfigDefaults.DefaultGobraDirector
logLevel: Level = ConfigDefaults.DefaultLogLevel,
cacheFile: Option[Path] = ConfigDefaults.DefaultCacheFile.map(_.toPath),
shouldParseOnly: Boolean = ConfigDefaults.DefaultParseOnly,
+ stopAfterEncoding: Boolean = ConfigDefaults.DefaultStopAfterEncoding,
checkOverflows: Boolean = ConfigDefaults.DefaultCheckOverflows,
checkConsistency: Boolean = ConfigDefaults.DefaultCheckConsistency,
int32bit: Boolean = ConfigDefaults.DefaultInt32bit,
@@ -205,7 +207,7 @@ case class BaseConfig(gobraDirectory: Path = ConfigDefaults.DefaultGobraDirector
def shouldTypeCheck: Boolean = !shouldParseOnly
def shouldDesugar: Boolean = shouldTypeCheck
def shouldViperEncode: Boolean = shouldDesugar
- def shouldVerify: Boolean = shouldViperEncode
+ def shouldVerify: Boolean = shouldViperEncode && !stopAfterEncoding
def shouldChop: Boolean = choppingUpperBound > 1 || isolated.exists(_.nonEmpty)
lazy val isolated: Option[Vector[SourcePosition]] = {
val positions = isolate.flatMap{ case (path, idxs) => idxs.map(idx => SourcePosition(path, idx, 0)) }
From df6aa4bac80e2802c449b4ce2a774579b881e7a9 Mon Sep 17 00:00:00 2001
From: viper-admin <59963956+viper-admin@users.noreply.github.com>
Date: Tue, 1 Nov 2022 23:13:34 +0100
Subject: [PATCH 032/296] Updates submodules (#561)
Co-authored-by: jcp19
---
viperserver | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/viperserver b/viperserver
index 91fc8e378..31d57cdcc 160000
--- a/viperserver
+++ b/viperserver
@@ -1 +1 @@
-Subproject commit 91fc8e3781a357d98ca6b2b9fb91037e9dff1fb2
+Subproject commit 31d57cdcc638bb9a77d16b59a821144ea4a33f08
From e23c8c991ef7676a8c6d5576fe2a1aaaa9808f15 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jo=C3=A3o=20Pereira?=
Date: Thu, 3 Nov 2022 11:11:04 +0100
Subject: [PATCH 033/296] Disable problematic tests (#563)
* disable tests
* disable tests
---
.../regressions/examples/evaluation/dense_sparse_matrix.gobra | 2 ++
.../resources/regressions/examples/evaluation/heapsort.gobra | 2 ++
.../regressions/examples/evaluation/impl_errors/heapsort.gobra | 2 ++
.../evaluation/impl_errors/parallel_search_replace.gobra | 2 ++
.../regressions/examples/evaluation/spec_errors/heapsort.gobra | 2 ++
5 files changed, 10 insertions(+)
diff --git a/src/test/resources/regressions/examples/evaluation/dense_sparse_matrix.gobra b/src/test/resources/regressions/examples/evaluation/dense_sparse_matrix.gobra
index 5e1935a23..f4ae82b14 100644
--- a/src/test/resources/regressions/examples/evaluation/dense_sparse_matrix.gobra
+++ b/src/test/resources/regressions/examples/evaluation/dense_sparse_matrix.gobra
@@ -1,6 +1,8 @@
// Any copyright is dedicated to the Public Domain.
// http://creativecommons.org/publicdomain/zero/1.0/
+//:: IgnoreFile(/gobra/issue/234/)
+
// ported verified operations on dense and sparse matrices from Viper
package main
diff --git a/src/test/resources/regressions/examples/evaluation/heapsort.gobra b/src/test/resources/regressions/examples/evaluation/heapsort.gobra
index c0ea31dbf..d46cba6bf 100644
--- a/src/test/resources/regressions/examples/evaluation/heapsort.gobra
+++ b/src/test/resources/regressions/examples/evaluation/heapsort.gobra
@@ -1,6 +1,8 @@
// Any copyright is dedicated to the Public Domain.
// http://creativecommons.org/publicdomain/zero/1.0/
+//:: IgnoreFile(/gobra/issue/234/)
+
package pkg
pure func parent (i int) int {
diff --git a/src/test/resources/regressions/examples/evaluation/impl_errors/heapsort.gobra b/src/test/resources/regressions/examples/evaluation/impl_errors/heapsort.gobra
index 135436677..8173a10b6 100644
--- a/src/test/resources/regressions/examples/evaluation/impl_errors/heapsort.gobra
+++ b/src/test/resources/regressions/examples/evaluation/impl_errors/heapsort.gobra
@@ -1,6 +1,8 @@
// Any copyright is dedicated to the Public Domain.
// http://creativecommons.org/publicdomain/zero/1.0/
+//:: IgnoreFile(/gobra/issue/234/)
+
package pkg
pure func parent (i int) int {
diff --git a/src/test/resources/regressions/examples/evaluation/impl_errors/parallel_search_replace.gobra b/src/test/resources/regressions/examples/evaluation/impl_errors/parallel_search_replace.gobra
index 6b6161d92..19e3048a1 100644
--- a/src/test/resources/regressions/examples/evaluation/impl_errors/parallel_search_replace.gobra
+++ b/src/test/resources/regressions/examples/evaluation/impl_errors/parallel_search_replace.gobra
@@ -1,6 +1,8 @@
// Any copyright is dedicated to the Public Domain.
// http://creativecommons.org/publicdomain/zero/1.0/
+//:: IgnoreFile(/gobra/issue/234/)
+
package pkg
import "sync"
diff --git a/src/test/resources/regressions/examples/evaluation/spec_errors/heapsort.gobra b/src/test/resources/regressions/examples/evaluation/spec_errors/heapsort.gobra
index 7020f54a7..b1bc1511f 100644
--- a/src/test/resources/regressions/examples/evaluation/spec_errors/heapsort.gobra
+++ b/src/test/resources/regressions/examples/evaluation/spec_errors/heapsort.gobra
@@ -1,6 +1,8 @@
// Any copyright is dedicated to the Public Domain.
// http://creativecommons.org/publicdomain/zero/1.0/
+//:: IgnoreFile(/gobra/issue/234/)
+
package pkg
pure func parent (i int) int {
From fda2c1fc68cb014071a34ef6aa07b35fd7e5a562 Mon Sep 17 00:00:00 2001
From: viper-admin <59963956+viper-admin@users.noreply.github.com>
Date: Thu, 3 Nov 2022 13:41:57 +0100
Subject: [PATCH 034/296] Updates submodules (#562)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Co-authored-by: jcp19
Co-authored-by: JoĂ£o Pereira
---
viperserver | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/viperserver b/viperserver
index 31d57cdcc..431ec0d40 160000
--- a/viperserver
+++ b/viperserver
@@ -1 +1 @@
-Subproject commit 31d57cdcc638bb9a77d16b59a821144ea4a33f08
+Subproject commit 431ec0d40be4082c7e57456d0ebcae3fd327b7d2
From f565a0cc0e8ce98b5b529e5ed35abbcb8713f82f Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jo=C3=A3o=20Pereira?=
Date: Thu, 3 Nov 2022 16:59:49 +0100
Subject: [PATCH 035/296] Add distinction between shared and exclusive global
variables (#560)
* Start working on this
* Clean-up
* Adapt old tests
* Better comment
* Fix tests
* Fix all tests
* Add test case
* Add test cases
* Fix test
* Fix test
* Fix tests
* Fix bug with arrays
* feedback from Felix
* Undo error in test
---
.../scala/viper/gobra/frontend/Desugar.scala | 34 ++++++++++++++-----
.../frontend/info/base/SymbolTable.scala | 2 +-
.../property/Addressability.scala | 4 +--
.../property/Assignability.scala | 11 ++++++
.../resolution/NameResolution.scala | 6 ++--
.../info/implementation/typing/IdTyping.scala | 8 ++---
.../viper/gobra/theory/Addressability.scala | 2 +-
.../encodings/combinators/TypeEncoding.scala | 12 +++++--
.../defaults/DefaultGlobalVarEncoding.scala | 5 +--
.../globals/globals-disabled-fail01.gobra | 6 ++--
.../globals/globals-exclusive-simple01.gobra | 19 +++++++++++
.../globals-exclusive-type-fail01.gobra | 29 ++++++++++++++++
.../features/globals/globals-fail01.gobra | 4 +--
.../features/globals/globals-simple01.gobra | 6 ++--
.../globals/globals-type-fail01.gobra | 24 ++++++++++++-
.../features/globals/imports/path/path.go | 24 ++++++-------
.../same_package/import-fail01/bar/bar.gobra | 6 ++--
.../same_package/import-success/bar/bar.gobra | 6 ++--
.../shareProgramDecls/prog1.gobra | 2 +-
.../shareProgramDecls/prog2.gobra | 2 +-
20 files changed, 158 insertions(+), 54 deletions(-)
create mode 100644 src/test/resources/regressions/features/globals/globals-exclusive-simple01.gobra
create mode 100644 src/test/resources/regressions/features/globals/globals-exclusive-type-fail01.gobra
diff --git a/src/main/scala/viper/gobra/frontend/Desugar.scala b/src/main/scala/viper/gobra/frontend/Desugar.scala
index 5ddf9653a..20f342eb2 100644
--- a/src/main/scala/viper/gobra/frontend/Desugar.scala
+++ b/src/main/scala/viper/gobra/frontend/Desugar.scala
@@ -434,7 +434,8 @@ object Desugar {
val gvars = decl.left.map(info.regular) map {
case g: st.GlobalVariable => globalVarD(g)(src)
case w: st.Wildcard =>
- val typ = typeD(info.typ(w.decl), Addressability.globalVariable)(src)
+ // wildcards are considered exclusive as they cannot be referenced anywhere else
+ val typ = typeD(info.typ(w.decl), Addressability.wildcard)(src)
val scope = info.codeRoot(decl).asInstanceOf[PPackage]
freshGlobalVar(typ, scope, w.context)(src)
case e => Violation.violation(s"Expected a global variable or wildcard, but instead got $e")
@@ -443,7 +444,12 @@ object Desugar {
if (decl.right.isEmpty) {
// assign to all variables its default value:
val assignsToDefault =
- gvars.map{ v => singleAss(in.Assignee.Var(v), in.DfltVal(v.typ.withAddressability(Addressability.Exclusive))(src))(src) }
+ gvars.map{
+ case v if v.typ.addressability.isShared =>
+ singleAss(in.Assignee.Var(v), in.DfltVal(v.typ.withAddressability(Addressability.Exclusive))(src))(src)
+ case v =>
+ in.Assume(in.ExprAssertion(in.GhostEqCmp(v, in.DfltVal(v.typ)(src))(src))(src))(src)
+ }
in.GlobalVarDecl(gvars, assignsToDefault)(src)
} else if (decl.right.length == 1 && decl.right.length != decl.left.length) {
// multi-assign mode:
@@ -452,20 +458,29 @@ object Desugar {
case t: in.Tuple if t.args.length == gvars.length =>
in.Block(
decls = Vector(),
- stmts = gvars.zip(t.args).map{ case (l, r) => singleAss(in.Assignee.Var(l), r)(src) }
+ stmts = gvars.zip(t.args).map{
+ case (l, r) if l.typ.addressability.isShared => singleAss(in.Assignee.Var(l), r)(src)
+ case (l, r) => in.Assume(in.ExprAssertion(in.GhostEqCmp(l,r)(src))(src))(src)
+ }
)(src)
case c => violation(s"Expected this case to be unreachable, but found $c instead.")
})
in.GlobalVarDecl(gvars, Vector(assigns))(src)
} else {
// single-assign mode:
- val assigns = gvars.zip(exps).map{ case (l, wr) => block(for { r <- wr } yield singleAss(in.Assignee.Var(l), r)(src)) }
+ val assigns = gvars.zip(exps).map{
+ case (l, wr) if l.typ.addressability.isShared =>
+ block(for { r <- wr } yield singleAss(in.Assignee.Var(l), r)(src))
+ case (l, wr) =>
+ block(for { r <- wr } yield in.Assume(in.ExprAssertion(in.GhostEqCmp(l,r)(src))(src))(src))
+ }
in.GlobalVarDecl(gvars, assigns)(src)
}
}
def globalVarD(v: st.GlobalVariable)(src: Meta): in.GlobalVar = {
- val typ = typeD(v.context.typ(v.id), Addressability.globalVariable)(src)
+ val addr = if (v.addressable) Addressability.Shared else Addressability.Exclusive
+ val typ = typeD(v.context.typ(v.id), addr)(src)
val proxy = globalVarProxyD(v)
in.GlobalVar(proxy, typ)(src)
}
@@ -3468,9 +3483,13 @@ object Desugar {
postprocessing = Vector(),
seqn = in.MethodBodySeqn{
// init all global variables declared in the file (not all declarations in the package!)
- val initDeclaredGlobs: Vector[in.Initialization] = sortedGlobVarDecls.flatMap(_.left.map(gVar =>
+ val initDeclaredGlobs: Vector[in.Initialization] = sortedGlobVarDecls.flatMap(_.left).filter {
+ // do not initialize Exclusive variables to avoid unsoundnesses with the assumptions.
+ // TODO(another optimization) do not generate initialization code for variables with RHS.
+ _.typ.addressability.isShared
+ }.map{ gVar =>
in.Initialization(gVar)(gVar.info)
- ))
+ }
// execute the declaration statements for variables in order of declaration, while satisfying the
// dependency relation
/**
@@ -3695,7 +3714,6 @@ object Desugar {
}
def freshGlobalVar(typ: in.Type, scope: PPackage, ctx: ExternalTypeInfo)(info: Source.Parser.Info): in.GlobalVar = {
- require(typ.addressability == Addressability.globalVariable)
val name = nm.fresh(scope, ctx)
val uniqName = nm.global(name, ctx)
val proxy = in.GlobalVarProxy(name, uniqName)(meta(scope, ctx.getTypeInfo))
diff --git a/src/main/scala/viper/gobra/frontend/info/base/SymbolTable.scala b/src/main/scala/viper/gobra/frontend/info/base/SymbolTable.scala
index 2b30e5e43..52af9697f 100644
--- a/src/main/scala/viper/gobra/frontend/info/base/SymbolTable.scala
+++ b/src/main/scala/viper/gobra/frontend/info/base/SymbolTable.scala
@@ -110,13 +110,13 @@ object SymbolTable extends Environments[Entity] {
expOpt: Option[PExpression],
typOpt: Option[PType],
ghost: Boolean,
+ override val addressable: Boolean,
isSingleModeDecl: Boolean,
context: ExternalTypeInfo
) extends ActualVariable {
require(expOpt.isDefined || typOpt.isDefined)
require(0 <= idx && idx < decl.left.length)
override def rep: PNode = decl
- override def addressable: Boolean = true
def id: PDefLikeId = decl.left(idx)
}
diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/property/Addressability.scala b/src/main/scala/viper/gobra/frontend/info/implementation/property/Addressability.scala
index 288cac91e..62d755305 100644
--- a/src/main/scala/viper/gobra/frontend/info/implementation/property/Addressability.scala
+++ b/src/main/scala/viper/gobra/frontend/info/implementation/property/Addressability.scala
@@ -73,7 +73,7 @@ trait Addressability extends BaseProperty { this: TypeInfoImpl =>
case Some(_: ap.ReceivedMethod | _: ap.MethodExpr | _: ap.ReceivedPredicate | _: ap.PredicateExpr ) => AddrMod.rValue
case Some(_: ap.NamedType | _: ap.BuiltInType | _: ap.Function | _: ap.Predicate | _: ap.DomainFunction) => AddrMod.rValue
case Some(_: ap.ImplicitlyReceivedInterfaceMethod | _: ap.ImplicitlyReceivedInterfacePredicate) => AddrMod.rValue
- case Some(_: ap.GlobalVariable) => AddrMod.globalVariable
+ case Some(g: ap.GlobalVariable) => if (g.symb.addressable) AddrMod.Shared else AddrMod.Exclusive
case p => Violation.violation(s"Unexpected dot resolve, got $p")
}
case _: PLiteral => AddrMod.literal
@@ -126,7 +126,7 @@ trait Addressability extends BaseProperty { this: TypeInfoImpl =>
private lazy val addressableVarAttr: PIdnNode => AddrMod =
attr[PIdnNode, AddrMod] { n => regular(n) match {
- case _: GlobalVariable => AddrMod.globalVariable
+ case g: GlobalVariable => if (g.addressable) AddrMod.sharedVariable else AddrMod.exclusiveVariable
case v: Variable => if (v.addressable) AddrMod.sharedVariable else AddrMod.exclusiveVariable
case _: Constant => AddrMod.constant
case _: Wildcard => AddrMod.defaultValue
diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/property/Assignability.scala b/src/main/scala/viper/gobra/frontend/info/implementation/property/Assignability.scala
index aa38e0f22..dd67bfa57 100644
--- a/src/main/scala/viper/gobra/frontend/info/implementation/property/Assignability.scala
+++ b/src/main/scala/viper/gobra/frontend/info/implementation/property/Assignability.scala
@@ -7,6 +7,7 @@
package viper.gobra.frontend.info.implementation.property
import viper.gobra.ast.frontend._
+import viper.gobra.ast.frontend.{AstPattern => ap}
import viper.gobra.frontend.info.base.Type._
import viper.gobra.frontend.info.implementation.TypeInfoImpl
import viper.gobra.util.TypeBounds.BoundedIntegerKind
@@ -107,6 +108,7 @@ trait Assignability extends BaseProperty { this: TypeInfoImpl =>
}
lazy val assignable: Property[PExpression] = createBinaryProperty("assignable") {
+ case e if !isMutable(e) => false
case PIndexedExp(b, _) => underlyingType(exprType(b)) match {
case _: ArrayT => assignable(b)
case _: SliceT | _: GhostSliceT => assignable(b)
@@ -302,4 +304,13 @@ trait Assignability extends BaseProperty { this: TypeInfoImpl =>
case (_, i) => BigInt(i)
}
}
+
+ private def isMutable: Property[PExpression] = createBinaryProperty("mutable") { e =>
+ resolve(e) match {
+ case Some(g: ap.GlobalVariable) => g.symb.addressable
+ case Some(i: ap.IndexedExp) => isMutable(i.base)
+ case Some(f: ap.FieldSelection) => isMutable(f.base)
+ case _ => true
+ }
+ }
}
diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/resolution/NameResolution.scala b/src/main/scala/viper/gobra/frontend/info/implementation/resolution/NameResolution.scala
index 743cfd2b7..54f3f8460 100644
--- a/src/main/scala/viper/gobra/frontend/info/implementation/resolution/NameResolution.scala
+++ b/src/main/scala/viper/gobra/frontend/info/implementation/resolution/NameResolution.scala
@@ -47,9 +47,9 @@ trait NameResolution {
case decl: PVarDecl if isGlobalVarDeclaration(decl) =>
val idx = decl.left.zipWithIndex.find(_._1 == id).get._2
StrictAssignMode(decl.left.size, decl.right.size) match {
- case AssignMode.Single => GlobalVariable(decl, idx, Some(decl.right(idx)), decl.typ, isGhost, isSingleModeDecl = true, this)
- case AssignMode.Multi => GlobalVariable(decl, idx, decl.right.headOption, decl.typ, isGhost, isSingleModeDecl = false, this)
- case _ if decl.right.isEmpty => GlobalVariable(decl, idx, None, decl.typ, isGhost, isSingleModeDecl = true, this)
+ case AssignMode.Single => GlobalVariable(decl, idx, Some(decl.right(idx)), decl.typ, isGhost, decl.addressable(idx), isSingleModeDecl = true, this)
+ case AssignMode.Multi => GlobalVariable(decl, idx, decl.right.headOption, decl.typ, isGhost, decl.addressable(idx), isSingleModeDecl = false, this)
+ case _ if decl.right.isEmpty => GlobalVariable(decl, idx, None, decl.typ, isGhost, decl.addressable(idx), isSingleModeDecl = true, this)
case _ => UnknownEntity()
}
case decl: PVarDecl =>
diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/typing/IdTyping.scala b/src/main/scala/viper/gobra/frontend/info/implementation/typing/IdTyping.scala
index 513c3eb89..ce5a456b9 100644
--- a/src/main/scala/viper/gobra/frontend/info/implementation/typing/IdTyping.scala
+++ b/src/main/scala/viper/gobra/frontend/info/implementation/typing/IdTyping.scala
@@ -72,12 +72,12 @@ trait IdTyping extends BaseTyping { this: TypeInfoImpl =>
})
})
- case GlobalVariable(_, _, expOpt, typOpt, _, isSingleModeDecl, _) if isSingleModeDecl => unsafeMessage(! {
+ case GlobalVariable(_, _, expOpt, typOpt, _, _, isSingleModeDecl, _) if isSingleModeDecl => unsafeMessage(! {
typOpt.exists(wellDefAndType.valid) ||
expOpt.exists(e => wellDefAndExpr.valid(e) && Single.unapply(exprType(e)).nonEmpty)
})
- case GlobalVariable(_, idx, expOpt, _, _, _, _) =>
+ case GlobalVariable(_, idx, expOpt, _, _, _, _, _) =>
// in this case, mv must occur in a declaration in AssignMode.Multi
unsafeMessage(! {
expOpt.forall{ exp => wellDefAndExpr.valid(exp) &&
@@ -185,13 +185,13 @@ trait IdTyping extends BaseTyping { this: TypeInfoImpl =>
case t => violation(s"expected tuple but got $t")
}
- case GlobalVariable(_, _, expOpt, typOpt, _, isSingleModeDecl, context) if isSingleModeDecl => typOpt.map(context.symbType)
+ case GlobalVariable(_, _, expOpt, typOpt, _, _, isSingleModeDecl, context) if isSingleModeDecl => typOpt.map(context.symbType)
.getOrElse(context.typ(expOpt.get) match {
case Single(t) => t
case t => violation(s"expected single Type but got $t")
})
- case GlobalVariable(_, idx, expOpt, typOpt, _, _, context) => typOpt.map(context.symbType)
+ case GlobalVariable(_, idx, expOpt, typOpt, _, _, _, context) => typOpt.map(context.symbType)
// in this case, mv must occur in a declaration in AssignMode.Multi
.getOrElse(context.typ(expOpt.get) match {
case Assign(InternalTupleT(ts)) if idx < ts.size => ts(idx)
diff --git a/src/main/scala/viper/gobra/theory/Addressability.scala b/src/main/scala/viper/gobra/theory/Addressability.scala
index 6aac1e48f..ad1458317 100644
--- a/src/main/scala/viper/gobra/theory/Addressability.scala
+++ b/src/main/scala/viper/gobra/theory/Addressability.scala
@@ -93,7 +93,7 @@ object Addressability {
val boundVariable: Addressability = rValue
val constant: Addressability = rValue
- val globalVariable: Addressability = sharedVariable
+ val wildcard: Addressability = rValue
val dereference: Addressability = pointerBase
def fieldLookup(receiver: Addressability): Addressability = field(receiver)
diff --git a/src/main/scala/viper/gobra/translator/encodings/combinators/TypeEncoding.scala b/src/main/scala/viper/gobra/translator/encodings/combinators/TypeEncoding.scala
index 32ecd72d1..9e09922b2 100644
--- a/src/main/scala/viper/gobra/translator/encodings/combinators/TypeEncoding.scala
+++ b/src/main/scala/viper/gobra/translator/encodings/combinators/TypeEncoding.scala
@@ -195,12 +195,20 @@ trait TypeEncoding extends Generator {
* To avoid conflicts with other encodings, an encoding for type T should be defined at:
* (1) exclusive operations on T, which includes literals and default values
* (2) shared expression of type T
- * The default implements exclusive variables and constants with [[variable]] and [[globalVar]], respectively.
- * Furthermore, the default implements [T(e: T)] -> [e]
+ * The default implements exclusive local variables and constants with [[variable]] and [[Fixpoint::get]], respectively.
+ * Furthermore, the default implements global exclusive variables and conversions as [T(e: T)] -> [e].
*/
def expression(ctx: Context): in.Expr ==> CodeWriter[vpr.Exp] = {
case v: in.GlobalConst if typ(ctx) isDefinedAt v.typ => unit(ctx.fixpoint.get(v)(ctx))
case (v: in.BodyVar) :: t / Exclusive if typ(ctx).isDefinedAt(t) => unit(variable(ctx)(v).localVar)
+ case (v: in.GlobalVar) :: t / Exclusive if typ(ctx).isDefinedAt(t) =>
+ val (pos, info, errT) = v.vprMeta
+ val typ = ctx.typ(v.typ)
+ val vprExpr = vpr.FuncApp(
+ funcname = v.name.uniqueName,
+ args = Seq.empty
+ )(pos, info, typ, errT)
+ unit(vprExpr)
case in.Conversion(t2, expr :: t) if typ(ctx).isDefinedAt(t) && typ(ctx).isDefinedAt(t2) => ctx.expression(expr)
}
diff --git a/src/main/scala/viper/gobra/translator/encodings/defaults/DefaultGlobalVarEncoding.scala b/src/main/scala/viper/gobra/translator/encodings/defaults/DefaultGlobalVarEncoding.scala
index 80e13ef89..213f5a48a 100644
--- a/src/main/scala/viper/gobra/translator/encodings/defaults/DefaultGlobalVarEncoding.scala
+++ b/src/main/scala/viper/gobra/translator/encodings/defaults/DefaultGlobalVarEncoding.scala
@@ -8,12 +8,10 @@ package viper.gobra.translator.encodings.defaults
import org.bitbucket.inkytonik.kiama.==>
import viper.gobra.ast.{internal => in}
-import viper.gobra.theory.Addressability
import viper.gobra.translator.context.Context
import viper.gobra.translator.encodings.combinators.Encoding
import viper.gobra.translator.util.ViperWriter.MemberLevel.unit
import viper.gobra.translator.util.ViperWriter.MemberWriter
-import viper.gobra.util.Violation
import viper.silver.{ast => vpr}
import viper.silver.plugin.standard.termination
@@ -28,13 +26,12 @@ class DefaultGlobalVarEncoding extends Encoding {
* global variable declarations are encoded as pure functions that return a pointer
* to the variable.
* [ var x T = exp ] ->
- * function x(): [ T@ ]
+ * function x(): [ T ]
*/
val termMeasure = synthesized(termination.DecreasesWildcard(None))("This function is assumed to terminate")
unit(
decl.left map { l =>
val (pos, info, errTrafo) = l.vprMeta
- Violation.violation(l.typ.addressability == Addressability.Shared, "Expected type with Shared addressability")
val typ = ctx.typ(l.typ)
vpr.Function(
name = l.name.uniqueName,
diff --git a/src/test/resources/regressions/features/globals/globals-disabled-fail01.gobra b/src/test/resources/regressions/features/globals/globals-disabled-fail01.gobra
index ffb0e916f..109b84b02 100644
--- a/src/test/resources/regressions/features/globals/globals-disabled-fail01.gobra
+++ b/src/test/resources/regressions/features/globals/globals-disabled-fail01.gobra
@@ -25,13 +25,13 @@ import (
//:: ExpectedOutput(type_error)
-var A int = 0
+var A@ int = 0
//:: ExpectedOutput(type_error)
-var B, C = f()
+var B@, C@ = f()
//:: ExpectedOutput(type_error)
var _ = g()
//:: ExpectedOutput(type_error)
-var D struct{}
+var D@ struct{}
decreases
func f() (int, bool)
diff --git a/src/test/resources/regressions/features/globals/globals-exclusive-simple01.gobra b/src/test/resources/regressions/features/globals/globals-exclusive-simple01.gobra
new file mode 100644
index 000000000..74ae352ec
--- /dev/null
+++ b/src/test/resources/regressions/features/globals/globals-exclusive-simple01.gobra
@@ -0,0 +1,19 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/publicdomain/zero/1.0/
+
+package test
+
+var f@ int = 1
+var g int = test()
+
+func init() {
+ assert g == 1
+ //:: ExpectedOutput(assert_error)
+ assert false
+}
+
+ensures res == 1
+decreases
+func test() (res int) {
+ return 1
+}
\ No newline at end of file
diff --git a/src/test/resources/regressions/features/globals/globals-exclusive-type-fail01.gobra b/src/test/resources/regressions/features/globals/globals-exclusive-type-fail01.gobra
new file mode 100644
index 000000000..346659b76
--- /dev/null
+++ b/src/test/resources/regressions/features/globals/globals-exclusive-type-fail01.gobra
@@ -0,0 +1,29 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/publicdomain/zero/1.0/
+
+package pkg
+
+var A int = 0
+var B [3]int
+
+func test1() {
+ // A cannot be assigned to, it is exclusive.
+ //:: ExpectedOutput(type_error)
+ A = 1
+}
+
+func test2() {
+ // Cannot take the address of an exclusive global variable.
+ //:: ExpectedOutput(type_error)
+ assert acc(&A)
+}
+
+func test3() {
+ //:: ExpectedOutput(type_error)
+ assert acc(&B[0])
+}
+
+func test4() {
+ //:: ExpectedOutput(type_error)
+ B[0] = 1
+}
\ No newline at end of file
diff --git a/src/test/resources/regressions/features/globals/globals-fail01.gobra b/src/test/resources/regressions/features/globals/globals-fail01.gobra
index 5ff7195fa..77300045b 100644
--- a/src/test/resources/regressions/features/globals/globals-fail01.gobra
+++ b/src/test/resources/regressions/features/globals/globals-fail01.gobra
@@ -5,10 +5,10 @@ package pkg
import "fmt"
-var A = 1
+var A@ = 1
// Code executed during initialization must terminate
//:: ExpectedOutput(function_termination_error)
-var _, B = f()
+var _, B@ = f()
func f() (int, bool)
diff --git a/src/test/resources/regressions/features/globals/globals-simple01.gobra b/src/test/resources/regressions/features/globals/globals-simple01.gobra
index d398783dd..bf84ca8f3 100644
--- a/src/test/resources/regressions/features/globals/globals-simple01.gobra
+++ b/src/test/resources/regressions/features/globals/globals-simple01.gobra
@@ -15,10 +15,10 @@ import (
"sync"
)
-var A int = 0
-var B, C = f()
+var A@ int = 0
+var B@, C@ = f()
var _ = g()
-var D struct{}
+var D@ struct{}
decreases
func f() (int, bool)
diff --git a/src/test/resources/regressions/features/globals/globals-type-fail01.gobra b/src/test/resources/regressions/features/globals/globals-type-fail01.gobra
index 0be875794..36532691a 100644
--- a/src/test/resources/regressions/features/globals/globals-type-fail01.gobra
+++ b/src/test/resources/regressions/features/globals/globals-type-fail01.gobra
@@ -7,4 +7,26 @@ package pkg
//:: ExpectedOutput(type_error)
var B, C, _ = f()
-func f() (int, bool)
\ No newline at end of file
+func f() (int, bool)
+
+type T struct {
+ f int
+}
+
+var x *T = &T{}
+
+// This is currently more restrictive than it needs to be but we
+// expect to support this in the future.
+func test1() {
+ // Rejected because x is not mutable, even though it does not need to be
+ // in this case.
+ //:: ExpectedOutput(type_error)
+ x.f = 2
+}
+
+var y T = T{}
+
+func test2() {
+ //:: ExpectedOutput(type_error)
+ y.f = 2
+}
\ No newline at end of file
diff --git a/src/test/resources/regressions/features/globals/imports/path/path.go b/src/test/resources/regressions/features/globals/imports/path/path.go
index 72a907149..fefae5a70 100644
--- a/src/test/resources/regressions/features/globals/imports/path/path.go
+++ b/src/test/resources/regressions/features/globals/imports/path/path.go
@@ -1,8 +1,8 @@
// Any copyright is dedicated to the Public Domain.
// http://creativecommons.org/publicdomain/zero/1.0/
-//@ initEnsures PackageMem()
-//@ initEnsures forall t Type :: 0 <= t && t < MaxType ==> !Registered(t)
+// @ initEnsures PackageMem()
+// @ initEnsures forall t Type :: 0 <= t && t < MaxType ==> !Registered(t)
package path
/*@
@@ -12,8 +12,8 @@ ghost const MaxType = 256
var (
// the original code uses an array of length 256,
// but arrays of custom types are not yet supported
- registeredPaths []Metadata
- strictDecoding bool = true
+ registeredPaths/*@@@*/ []Metadata
+ strictDecoding/*@@@*/ bool = true
)
type Type uint8
@@ -59,14 +59,14 @@ func init() {
// RegisterPath registers a new path type globally.
// The type passed in must be unique, or a runtime panic will occur.
-//@ requires 0 <= pathMeta.Typ && pathMeta.Typ < MaxType
-//@ requires PackageMem()
-//@ requires !Registered(pathMeta.Typ)
-//@ ensures PackageMem()
-//@ ensures forall t Type :: 0 <= t && t < MaxType ==>
-//@ t != pathMeta.Typ ==> old(Registered(t)) == Registered(t)
-//@ ensures Registered(pathMeta.Typ)
-//@ decreases
+// @ requires 0 <= pathMeta.Typ && pathMeta.Typ < MaxType
+// @ requires PackageMem()
+// @ requires !Registered(pathMeta.Typ)
+// @ ensures PackageMem()
+// @ ensures forall t Type :: 0 <= t && t < MaxType ==>
+// @ t != pathMeta.Typ ==> old(Registered(t)) == Registered(t)
+// @ ensures Registered(pathMeta.Typ)
+// @ decreases
func RegisterPath(pathMeta Metadata) {
//@ unfold PackageMem()
pm := registeredPaths[pathMeta.Typ]
diff --git a/src/test/resources/same_package/import-fail01/bar/bar.gobra b/src/test/resources/same_package/import-fail01/bar/bar.gobra
index 3e38424a6..52da3e684 100644
--- a/src/test/resources/same_package/import-fail01/bar/bar.gobra
+++ b/src/test/resources/same_package/import-fail01/bar/bar.gobra
@@ -4,6 +4,6 @@
initEnsures acc(&A) && acc(&B) && acc(&C)
package bar
-var A int = 1
-var B int = 2
-var C int = 3
+var A@ int = 1
+var B@ int = 2
+var C@ int = 3
diff --git a/src/test/resources/same_package/import-success/bar/bar.gobra b/src/test/resources/same_package/import-success/bar/bar.gobra
index 3e38424a6..52da3e684 100644
--- a/src/test/resources/same_package/import-success/bar/bar.gobra
+++ b/src/test/resources/same_package/import-success/bar/bar.gobra
@@ -4,6 +4,6 @@
initEnsures acc(&A) && acc(&B) && acc(&C)
package bar
-var A int = 1
-var B int = 2
-var C int = 3
+var A@ int = 1
+var B@ int = 2
+var C@ int = 3
diff --git a/src/test/resources/same_package/shareProgramDecls/prog1.gobra b/src/test/resources/same_package/shareProgramDecls/prog1.gobra
index 775b5791c..517f0c8d9 100644
--- a/src/test/resources/same_package/shareProgramDecls/prog1.gobra
+++ b/src/test/resources/same_package/shareProgramDecls/prog1.gobra
@@ -3,7 +3,7 @@
package main
-var A = 1
+var A@ = 1
func init() {
// the initialization of variables declared in one file cannot access
diff --git a/src/test/resources/same_package/shareProgramDecls/prog2.gobra b/src/test/resources/same_package/shareProgramDecls/prog2.gobra
index 4e2109038..c9288d11f 100644
--- a/src/test/resources/same_package/shareProgramDecls/prog2.gobra
+++ b/src/test/resources/same_package/shareProgramDecls/prog2.gobra
@@ -3,4 +3,4 @@
package main
-var B = 2
\ No newline at end of file
+var B@ = 2
\ No newline at end of file
From 23aa003468cbf11171a062a5b1037ac732b174a9 Mon Sep 17 00:00:00 2001
From: viper-admin <59963956+viper-admin@users.noreply.github.com>
Date: Fri, 4 Nov 2022 13:06:13 +0100
Subject: [PATCH 036/296] Updates submodules (#564)
Co-authored-by: jcp19
---
viperserver | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/viperserver b/viperserver
index 431ec0d40..192cb84f6 160000
--- a/viperserver
+++ b/viperserver
@@ -1 +1 @@
-Subproject commit 431ec0d40be4082c7e57456d0ebcae3fd327b7d2
+Subproject commit 192cb84f69f926cc8cbbf74500afcb58271a18f9
From 72df4aedba64c89b47ed907e97cf8a8ecbb473cd Mon Sep 17 00:00:00 2001
From: viper-admin <59963956+viper-admin@users.noreply.github.com>
Date: Tue, 8 Nov 2022 13:31:08 +0100
Subject: [PATCH 037/296] Updates submodules (#566)
Co-authored-by: jcp19
---
viperserver | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/viperserver b/viperserver
index 192cb84f6..bbc7ecaf1 160000
--- a/viperserver
+++ b/viperserver
@@ -1 +1 @@
-Subproject commit 192cb84f69f926cc8cbbf74500afcb58271a18f9
+Subproject commit bbc7ecaf1265d171c287e21062ed7477eccc575f
From 3b24c4413bd47e4dcf2670f765f9c5f973ebee50 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jo=C3=A3o=20Pereira?=
Date: Tue, 8 Nov 2022 19:42:34 +0100
Subject: [PATCH 038/296] Simplify encoding of `NewSliceLit` (#567)
* Dirty test
* Clean-up
---
.../gobra/translator/context/Context.scala | 2 ++
.../encodings/combinators/TypeEncoding.scala | 21 +++++++++++++++++++
.../encodings/slices/SliceEncoding.scala | 10 +++++----
3 files changed, 29 insertions(+), 4 deletions(-)
diff --git a/src/main/scala/viper/gobra/translator/context/Context.scala b/src/main/scala/viper/gobra/translator/context/Context.scala
index 202c7d710..259598ebb 100644
--- a/src/main/scala/viper/gobra/translator/context/Context.scala
+++ b/src/main/scala/viper/gobra/translator/context/Context.scala
@@ -77,6 +77,8 @@ trait Context {
def initialization(x: in.Location): CodeWriter[vpr.Stmt] = typeEncoding.initialization(this)(x)
+ def allocation(x: in.Location): CodeWriter[vpr.Stmt] = typeEncoding.allocate(this)(x)
+
def assignment(x: in.Assignee, rhs: in.Expr)(src: in.Node): CodeWriter[vpr.Stmt] = typeEncoding.assignment(this)(x, rhs, src)
def equal(lhs: in.Expr, rhs: in.Expr)(src: in.Node): CodeWriter[vpr.Exp] = typeEncoding.equal(this)(lhs, rhs, src)
diff --git a/src/main/scala/viper/gobra/translator/encodings/combinators/TypeEncoding.scala b/src/main/scala/viper/gobra/translator/encodings/combinators/TypeEncoding.scala
index 9e09922b2..a64938693 100644
--- a/src/main/scala/viper/gobra/translator/encodings/combinators/TypeEncoding.scala
+++ b/src/main/scala/viper/gobra/translator/encodings/combinators/TypeEncoding.scala
@@ -125,6 +125,27 @@ trait TypeEncoding extends Generator {
} yield vpr.Inhale(vpr.And(footprint, vpr.And(eq1, vpr.Not(eq2)(pos, info, errT))(pos, info, errT))(pos, info, errT))(pos, info, errT)
}
+ /**
+ * Returns the allocation code for a declared location with the scope of a body.
+ * The initialization code has to guarantee that all permissions for the declared variables are owned afterwards
+ *
+ * The default implements:
+ * Allocate[loc: T°] -> EmptyStmt
+ * Allocate[loc: T@] -> inhale Footprint[loc]; assume [&loc != nil(*T)]
+ */
+ def allocate(ctx: Context): in.Location ==> CodeWriter[vpr.Stmt] = {
+ case loc :: t / Exclusive if typ(ctx).isDefinedAt(t) =>
+ val (pos, info, errT) = loc.vprMeta
+ unit(vpr.Seqn(Seq(), Seq())(pos, info, errT))
+
+ case loc :: t / Shared if typ(ctx).isDefinedAt(t) =>
+ val (pos, info, errT) = loc.vprMeta
+ for {
+ footprint <- addressFootprint(ctx)(loc, in.FullPerm(loc.info))
+ eq <- ctx.equal(in.Ref(loc)(loc.info), in.NilLit(in.PointerT(t, Exclusive))(loc.info))(loc)
+ } yield vpr.Inhale(vpr.And(footprint, vpr.Not(eq)(pos, info, errT))(pos, info, errT))(pos, info, errT)
+ }
+
/**
* Encodes an assignment.
* The first and second argument is the left-hand side and right-hand side, respectively.
diff --git a/src/main/scala/viper/gobra/translator/encodings/slices/SliceEncoding.scala b/src/main/scala/viper/gobra/translator/encodings/slices/SliceEncoding.scala
index 1f4e3e8cf..9d3b8c4b0 100644
--- a/src/main/scala/viper/gobra/translator/encodings/slices/SliceEncoding.scala
+++ b/src/main/scala/viper/gobra/translator/encodings/slices/SliceEncoding.scala
@@ -193,23 +193,25 @@ class SliceEncoding(arrayEmb : SharedArrayEmbedding) extends LeafTypeEncoding {
)
case lit: in.NewSliceLit =>
+ val (pos, info, errT) = lit.vprMeta
val litA = lit.asArrayLit
val tmp = in.LocalVar(ctx.freshNames.next(), litA.typ.withAddressability(Addressability.pointerBase))(lit.info)
val tmpT = ctx.variable(tmp)
val underlyingTyp = underlyingType(lit.typ)(ctx)
for {
- initT <- ctx.initialization(tmp)
- assignT <- ctx.assignment(in.Assignee.Var(tmp), litA)(lit)
_ <- local(tmpT)
+ initT <- ctx.allocation(tmp)
_ <- write(initT)
- _ <- write(assignT)
+ eq <- ctx.equal(tmp, litA)(lit)
+ inhale = vpr.Inhale(eq)(pos, info, errT)
+ _ <- write(inhale)
ass <- ctx.assignment(
in.Assignee.Var(lit.target),
in.Slice(tmp, in.IntLit(0)(lit.info), in.IntLit(litA.length)(lit.info), None, underlyingTyp)(lit.info)
)(lit)
} yield ass
+ }
}
- }
/**
* Obtains permission to all cells of a slice
From 04e5c2b57d2d32549ba7ae88ff6e29bff9c788ec Mon Sep 17 00:00:00 2001
From: Felix Wolf <60103963+Felalolf@users.noreply.github.com>
Date: Tue, 8 Nov 2022 19:43:22 +0100
Subject: [PATCH 039/296] made field names more specific (#568)
---
.../gobra/translator/library/fields/FieldsImpl.scala | 9 +++++----
1 file changed, 5 insertions(+), 4 deletions(-)
diff --git a/src/main/scala/viper/gobra/translator/library/fields/FieldsImpl.scala b/src/main/scala/viper/gobra/translator/library/fields/FieldsImpl.scala
index 90dc5d328..50e922263 100644
--- a/src/main/scala/viper/gobra/translator/library/fields/FieldsImpl.scala
+++ b/src/main/scala/viper/gobra/translator/library/fields/FieldsImpl.scala
@@ -16,13 +16,14 @@ class FieldsImpl extends Fields {
override def finalize(addMemberFn: vpr.Member => Unit): Unit = _fieldGenerator.finalize(addMemberFn)
- private val _fieldGenerator: PrimitiveGenerator.PrimitiveGenerator[vpr.Type, vpr.Field] =
+ private val _fieldGenerator: PrimitiveGenerator.PrimitiveGenerator[(String, vpr.Type), vpr.Field] =
PrimitiveGenerator.simpleGenerator(
- (t: vpr.Type) => {
- val f = vpr.Field(name = Names.pointerField(t), typ = t)(vpr.NoPosition, vpr.NoInfo, vpr.NoTrafos)
+ (st: (String, vpr.Type)) => {
+ val f = vpr.Field(name = st._1, typ = st._2)(vpr.NoPosition, vpr.NoInfo, vpr.NoTrafos)
(f, Vector(f))
}
)
- override def field(t: in.Type)(ctx: Context): vpr.Field = _fieldGenerator(ctx.typ(t))
+ override def field(t: in.Type)(ctx: Context): vpr.Field =
+ _fieldGenerator(Names.serializeType(t), ctx.typ(t))
}
From 00f3661fcb6542d4ef9c760964647a75c35ae541 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jo=C3=A3o=20Pereira?=
Date: Thu, 10 Nov 2022 18:42:55 +0100
Subject: [PATCH 040/296] Optimize map encoding (#570)
* Experiment
* Backup
* Backup
* Apply suggestions from code review
Co-authored-by: Felix Wolf <60103963+Felalolf@users.noreply.github.com>
Co-authored-by: Felix Wolf <60103963+Felalolf@users.noreply.github.com>
---
.../encodings/maps/MapEncoding.scala | 133 +++++++-----------
1 file changed, 47 insertions(+), 86 deletions(-)
diff --git a/src/main/scala/viper/gobra/translator/encodings/maps/MapEncoding.scala b/src/main/scala/viper/gobra/translator/encodings/maps/MapEncoding.scala
index 23463eb21..f8e9116ca 100644
--- a/src/main/scala/viper/gobra/translator/encodings/maps/MapEncoding.scala
+++ b/src/main/scala/viper/gobra/translator/encodings/maps/MapEncoding.scala
@@ -16,6 +16,7 @@ import viper.gobra.translator.Names
import viper.gobra.translator.encodings.combinators.LeafTypeEncoding
import viper.gobra.translator.encodings.maps.MapEncoding.{checkKeyComparability, comparabilityErrorT, repeatedKeyErrorT}
import viper.gobra.translator.context.Context
+import viper.gobra.translator.util.PrimitiveGenerator
import viper.gobra.translator.util.ViperWriter.CodeLevel._
import viper.gobra.translator.util.ViperWriter.CodeWriter
import viper.gobra.util.Violation
@@ -38,21 +39,16 @@ import viper.silver.{ast => vpr}
class MapEncoding extends LeafTypeEncoding {
import viper.gobra.translator.util.TypePatterns._
- private val domainName: String = Names.mapsDomain
-
/**
* Translates a type into a Viper type.
* Both Exclusive and Shared maps are encoded as vpr.Ref because nil is an admissible value for maps
*/
- override def typ(ctx : Context) : in.Type ==> vpr.Type = {
+ override def typ(ctx: Context): in.Type ==> vpr.Type = {
case ctx.Map(_, _) / Exclusive => mapType
case ctx.Map(_, _) / Shared => vpr.Ref
}
- private lazy val mapType: vpr.Type = {
- isUsed = true
- vpr.Ref
- }
+ private val mapType: vpr.Type = vpr.Ref
/**
* Encodes expressions as values that do not occupy some identifiable location in memory.
@@ -63,8 +59,9 @@ class MapEncoding extends LeafTypeEncoding {
* R[ keySet(e: map[K]V) ] -> [e] == null? 0 : MapDomain(getCorrespondingMap(e))
* R[ valueSet(e: map[K]V) ] -> [e] == null? 0 : MapRange(getCorrespondingMap(e))
*/
- override def expression(ctx : Context) : in.Expr ==> CodeWriter[vpr.Exp] = {
+ override def expression(ctx: Context): in.Expr ==> CodeWriter[vpr.Exp] = {
def goE(x: in.Expr): CodeWriter[vpr.Exp] = ctx.expression(x)
+
def goT(t: in.Type): vpr.Type = ctx.typ(t)
default(super.expression(ctx)) {
@@ -72,7 +69,7 @@ class MapEncoding extends LeafTypeEncoding {
case (exp: in.NilLit) :: ctx.Map(_, _) / Exclusive => unit(withSrc(vpr.NullLit(), exp))
- case l@ in.Length(exp :: ctx.Map(keys, values)) =>
+ case l@in.Length(exp :: ctx.Map(keys, values)) =>
val (pos, info, errT) = l.vprMeta
// Encodes
// [ len(m) ] -> [ m ] == null? 0 : | getCorrespondingMap([m]) |
@@ -86,9 +83,9 @@ class MapEncoding extends LeafTypeEncoding {
)(pos, info, errT)
} yield res
- case l@in.IndexedExp(_ :: ctx.Map(_, _), _, _) => for { (res, _) <- goMapLookup(l)(ctx) } yield res
+ case l@in.IndexedExp(_ :: ctx.Map(_, _), _, _) => for {(res, _) <- goMapLookup(l)(ctx)} yield res
- case k@ in.MapKeys(mapExp :: ctx.Map(keys, values), _) =>
+ case k@in.MapKeys(mapExp :: ctx.Map(keys, values), _) =>
for {
vprMap <- goE(mapExp)
correspondingMap <- getCorrespondingMap(mapExp, keys, values)(ctx)
@@ -100,7 +97,7 @@ class MapEncoding extends LeafTypeEncoding {
), k)
} yield res
- case v@ in.MapValues(mapExp:: ctx.Map(keys, values), _) =>
+ case v@in.MapValues(mapExp :: ctx.Map(keys, values), _) =>
for {
vprMap <- goE(mapExp)
correspondingMap <- getCorrespondingMap(mapExp, keys, values)(ctx)
@@ -165,13 +162,13 @@ class MapEncoding extends LeafTypeEncoding {
_ <- local(mapVarVpr)
correspondingMap <- getCorrespondingMap(mapVar, keys, values)(ctx)
- _ <- write(vpr.NewStmt(mapVarVpr.localVar, Seq(underlyingMapField))(pos, info, errT))
+ _ <- write(vpr.NewStmt(mapVarVpr.localVar, Seq(underlyingMapField(ctx)(keys, values)))(pos, info, errT))
_ <- write(vpr.Inhale(vpr.EqCmp(correspondingMap, vpr.EmptyMap(goT(keys), goT(values))(pos, info, errT))(pos, info, errT))(pos, info, errT))
ass <- ctx.assignment(in.Assignee.Var(target), mapVar)(makeStmt)
} yield ass
)
- case l@ in.SafeMapLookup(resTarget, successTarget, indexedExp@ in.IndexedExp(_, _, _)) =>
+ case l@in.SafeMapLookup(resTarget, successTarget, indexedExp@in.IndexedExp(_, _, _)) =>
val (pos, info, errT) = l.vprMeta
val res = in.LocalVar(ctx.freshNames.next(), indexedExp.typ.withAddressability(Addressability.Exclusive))(l.info)
val vprRes = ctx.variable(res)
@@ -194,7 +191,7 @@ class MapEncoding extends LeafTypeEncoding {
okAss <- ctx.assignment(in.Assignee.Var(successTarget), ok)(l)
} yield okAss
- )
+ )
case lit: in.NewMapLit =>
val (pos, info, errT) = lit.vprMeta
@@ -229,7 +226,7 @@ class MapEncoding extends LeafTypeEncoding {
_ <- write(
vpr.Inhale(
vpr.FieldAccessPredicate(
- vpr.FieldAccess(vRes.localVar, underlyingMapField)(pos, info, errT),
+ vpr.FieldAccess(vRes.localVar, underlyingMapField(ctx)(lit.keys, lit.values))(pos, info, errT),
vpr.FullPerm()(pos, info, errT))(pos, info, errT))(pos, info, errT))
// inhale getCorrespondingMap(res) == underlyingMap; recall that underlyingMap == ExplicitMap(mapletList)
_ <- write(vpr.Inhale(vpr.EqCmp(underlyingMap, correspondingMap)(pos, info, errT))(pos, info, errT))
@@ -248,42 +245,23 @@ class MapEncoding extends LeafTypeEncoding {
/**
* Encodes an assignment.
* [ mapExp[idx] = newVal ] ->
- * var res: Ref
* var m: Map[ [k], [v] ]
- * m = getCorrespondingMap(mapExp)
- * inhale getMap(res) == m[ [idx] = [newVal] ]
- * m.underlyingField = res
+ * m = [mapExp].underlyingMapField
+ * [mapExp].underlyingMapField := m[ [idx] = [newVal] ]
*/
override def assignment(ctx: Context): (in.Assignee, in.Expr, in.Node) ==> CodeWriter[vpr.Stmt] = {
- def goT(t: in.Type): vpr.Type = ctx.typ(t)
- default(super.assignment(ctx)){
+ default(super.assignment(ctx)) {
case (in.Assignee(in.IndexedExp(m :: ctx.Map(keys, values), idx, _)), rhs, src) =>
val (pos, info, errT) = src.vprMeta
- val res = in.LocalVar(ctx.freshNames.next(), in.IntT(Exclusive))(m.info)
- val vRes = ctx.variable(res)
seqn(
for {
isCompKey <- MapEncoding.checkKeyComparability(idx)(ctx)
_ <- assert(isCompKey, comparabilityErrorT) // key must be comparable
-
vRhs <- ctx.expression(rhs)
- vM <- ctx.expression(m)
vIdx <- ctx.expression(idx)
- _ <- local(vRes)
-
correspondingMapM <- getCorrespondingMap(m, keys, values)(ctx)
-
- // cannot be replaced by `getCorrespondingMap(vRes, goT(k), goT(v)`, there is no field access to the underlyingMapField
- correspondingMapRes = vpr.DomainFuncApp(
- func = getMapFunc,
- args = Seq(vRes.localVar),
- typVarMap = Map(keyParam -> goT(keys), valueParam -> goT(values))
- )(pos, info, errT)
-
- inhale = vpr.Inhale(vpr.EqCmp(correspondingMapRes, vpr.MapUpdate(correspondingMapM, vIdx, vRhs)(pos, info, errT))(pos, info, errT))(pos, info, errT)
- _ <- write(inhale)
- } yield vpr.FieldAssign(vpr.FieldAccess(vM, underlyingMapField)(pos, info, errT), vRes.localVar)(pos, info, errT)
+ } yield vpr.FieldAssign(correspondingMapM, vpr.MapUpdate(correspondingMapM, vIdx, vRhs)(pos, info, errT))(pos, info, errT)
)
}
}
@@ -296,69 +274,28 @@ class MapEncoding extends LeafTypeEncoding {
def goE(x: in.Expr): CodeWriter[vpr.Exp] = ctx.expression(x)
default(super.assertion(ctx)) {
- case n@ in.Access(in.Accessible.ExprAccess(exp :: ctx.Map(_, _)), perm) =>
+ case n@in.Access(in.Accessible.ExprAccess(exp :: ctx.Map(keys, values)), perm) =>
val (pos, info, errT) = n.vprMeta
for {
vE <- goE(exp)
vP <- goE(perm)
- } yield vpr.FieldAccessPredicate(vpr.FieldAccess(vE, underlyingMapField)(pos, info, errT), vP)(pos, info, errT)
+ } yield vpr.FieldAccessPredicate(vpr.FieldAccess(vE, underlyingMapField(ctx)(keys, values))(pos, info, errT), vP)(pos, info, errT)
}
}
override def finalize(addMemberFn: vpr.Member => Unit): Unit = {
- if (isUsed) {
- addMemberFn(genDomain())
- addMemberFn(underlyingMapField)
- }
+ underlyingMapFieldGenerator.finalize(addMemberFn)
}
- private var isUsed: Boolean = false
-
- private val keyParam = vpr.TypeVar("K")
- private val valueParam = vpr.TypeVar("V")
-
/**
- * Generates
- * domain GobraMap[K,V] {
- * function getMap(addr: Int): Map[K,V]
- * }
+ * Builds the expression `[exp].underlyingMapField`
*/
- private def genDomain(): vpr.Domain = {
- vpr.Domain(
- name = domainName,
- functions = Seq(getMapFunc),
- axioms = Seq(),
- typVars = Seq(keyParam, valueParam)
- )()
- }
-
- private val getMapFuncName: String = "getMap"
- private val getMapFunc: vpr.DomainFunc = vpr.DomainFunc(
- name = getMapFuncName,
- formalArgs = Seq(vpr.LocalVarDecl("id", vpr.Int)()),
- typ = vpr.MapType(keyParam, valueParam),
- )(domainName = domainName)
-
- /**
- * Field of the corresponding map id
- */
- private val underlyingMapFieldName: String = "underlyingMapField"
- private def underlyingMapField: vpr.Field = vpr.Field(underlyingMapFieldName, vpr.Int)()
-
- /**
- * Builds the expression `getMap([exp].underlyingMapField)`
- */
- private def getCorrespondingMap(exp: in.Expr, keys: in.Type, values: in.Type)(ctx: Context): CodeWriter[vpr.Exp] = {
+ private def getCorrespondingMap(exp: in.Expr, keys: in.Type, values: in.Type)(ctx: Context): CodeWriter[vpr.FieldAccess] = {
def goE(x: in.Expr): CodeWriter[vpr.Exp] = ctx.expression(x)
- def goT(t: in.Type): vpr.Type = ctx.typ(t)
for {
vExp <- goE(exp)
- res = withSrc(vpr.DomainFuncApp(
- func = getMapFunc,
- args = Seq(withSrc(vpr.FieldAccess(vExp, underlyingMapField), exp)),
- typVarMap = Map(keyParam -> goT(keys), valueParam -> goT(values))
- ), exp)
+ res = withSrc(vpr.FieldAccess(vExp, underlyingMapField(ctx)(keys, values)), exp)
} yield res
}
@@ -394,6 +331,30 @@ class MapEncoding extends LeafTypeEncoding {
case _ => Violation.violation(s"unexpected case reached")
}
}
+
+ private def internalMemberName(prefix: String, k: in.Type, v: in.Type): String = {
+ val kN = Names.serializeType(k)
+ val vN = Names.serializeType(v)
+ s"$prefix$$$kN$$$vN"
+ }
+
+ /**
+ * Field of the corresponding map type
+ */
+ private val underlyingMapFieldPrefix: String = "underlyingMapField"
+ private def underlyingMapField(ctx: Context)(k: in.Type, v: in.Type): vpr.Field = {
+ val name = internalMemberName(underlyingMapFieldPrefix, k, v)
+ val vprK = ctx.typ(k)
+ val vprV = ctx.typ(v)
+ underlyingMapFieldGenerator(name, vprK, vprV)
+ }
+
+ private val underlyingMapFieldGenerator: PrimitiveGenerator.PrimitiveGenerator[(String, vpr.Type, vpr.Type), vpr.Field] =
+ PrimitiveGenerator.simpleGenerator {
+ case (name: String, k: vpr.Type, v: vpr.Type) =>
+ val f = vpr.Field(name = name, typ = vpr.MapType(k, v))()
+ (f, Vector(f))
+ }
}
object MapEncoding {
From 715345a947bb90e1ce47217ccf2c528beff66439 Mon Sep 17 00:00:00 2001
From: "Felix A. Wolf"
Date: Thu, 10 Nov 2022 23:58:56 +0100
Subject: [PATCH 041/296] safety commit
---
.../scala/viper/gobra/ast/frontend/Ast.scala | 34 ++
.../viper/gobra/ast/frontend/AstPattern.scala | 2 +
.../gobra/ast/frontend/PrettyPrinter.scala | 30 ++
.../gobra/ast/internal/PrettyPrinter.scala | 34 ++
.../viper/gobra/ast/internal/Program.scala | 54 ++
.../ast/internal/theory/Comparability.scala | 2 +
.../gobra/ast/internal/theory/TypeHead.scala | 8 +
.../transform/OverflowChecksTransform.scala | 2 +-
.../frontend/info/base/SymbolTable.scala | 29 ++
.../viper/gobra/frontend/info/base/Type.scala | 7 +-
.../property/Addressability.scala | 3 +-
.../property/Assignability.scala | 26 +
.../property/TypeIdentity.scala | 2 +
.../implementation/property/TypeMerging.scala | 4 +-
.../resolution/AdvancedMemberSet.scala | 2 +
.../resolution/AmbiguityResolution.scala | 2 +
.../resolution/MemberResolution.scala | 270 ++++++----
.../resolution/NameResolution.scala | 215 ++++----
.../implementation/typing/ExprTyping.scala | 16 +-
.../info/implementation/typing/IdTyping.scala | 6 +
.../implementation/typing/TypeTyping.scala | 6 +
.../typing/ghost/GhostExprTyping.scala | 22 +-
.../typing/ghost/GhostIdTyping.scala | 34 +-
.../typing/ghost/GhostMiscTyping.scala | 66 ++-
.../typing/ghost/GhostStmtTyping.scala | 4 +
.../typing/ghost/GhostTypeTyping.scala | 2 +
.../viper/gobra/reporting/VerifierError.scala | 5 +
.../scala/viper/gobra/translator/Names.scala | 6 +
.../encodings/adts/AdtEncoding.scala | 469 ++++++++++++++++++
.../interfaces/TypeComponentImpl.scala | 2 +
.../gobra/translator/util/TypePatterns.scala | 14 +
31 files changed, 1171 insertions(+), 207 deletions(-)
create mode 100644 src/main/scala/viper/gobra/translator/encodings/adts/AdtEncoding.scala
diff --git a/src/main/scala/viper/gobra/ast/frontend/Ast.scala b/src/main/scala/viper/gobra/ast/frontend/Ast.scala
index bfa306d11..c5b207027 100644
--- a/src/main/scala/viper/gobra/ast/frontend/Ast.scala
+++ b/src/main/scala/viper/gobra/ast/frontend/Ast.scala
@@ -949,6 +949,35 @@ case class PPackageWand(wand: PMagicWand, proofScript: Option[PBlock]) extends P
case class PApplyWand(wand: PMagicWand) extends PGhostStatement
+case class PMatchStatement(exp: PExpression, clauses: Vector[PMatchStmtCase], strict: Boolean = true) extends PGhostStatement
+
+case class PMatchStmtCase(pattern: PMatchPattern, stmt: Vector[PStatement], default: Boolean = false) extends PGhostMisc with PScope
+
+case class PMatchExp(exp: PExpression, clauses: Vector[PMatchExpClause]) extends PGhostExpression {
+ val caseClauses: Vector[PMatchExpCase] = clauses collect {case c: PMatchExpCase => c}
+ val defaultClauses: Vector[PMatchExpDefault] = clauses collect {case c: PMatchExpDefault => c}
+ val hasDefault: Boolean = defaultClauses.length == 1
+ val hasNoDefault: Boolean = defaultClauses.isEmpty
+}
+
+sealed trait PMatchExpClause extends PGhostMisc with PScope {
+ def exp: PExpression
+}
+
+case class PMatchExpCase(pattern: PMatchPattern, exp: PExpression) extends PMatchExpClause
+
+case class PMatchExpDefault(exp: PExpression) extends PMatchExpClause
+
+sealed trait PMatchPattern extends PGhostMisc
+
+case class PMatchValue(lit: PExpression) extends PMatchPattern
+
+case class PMatchBindVar(idn: PIdnDef) extends PMatchPattern
+
+case class PMatchAdt(clause: PType, fields: Vector[PMatchPattern]) extends PMatchPattern
+
+case class PMatchWildcard() extends PMatchPattern
+
/**
* Ghost Expressions and Assertions
*/
@@ -1200,6 +1229,11 @@ case class PMathematicalMapType(keys: PType, values: PType) extends PGhostLitera
/** The type of option types. */
case class POptionType(elem : PType) extends PGhostLiteralType
+/** The type of ADT types */
+case class PAdtType(clauses: Vector[PAdtClause]) extends PGhostLiteralType with PUnorderedScope
+
+case class PAdtClause(id: PIdnDef, args: Vector[PFieldDecls]) extends PGhostMisc with PUnorderedScope
+
case class PGhostSliceType(elem: PType) extends PGhostLiteralType
case class PDomainType(funcs: Vector[PDomainFunction], axioms: Vector[PDomainAxiom]) extends PGhostLiteralType with PUnorderedScope
diff --git a/src/main/scala/viper/gobra/ast/frontend/AstPattern.scala b/src/main/scala/viper/gobra/ast/frontend/AstPattern.scala
index 31704ffb5..dfb5b5d7d 100644
--- a/src/main/scala/viper/gobra/ast/frontend/AstPattern.scala
+++ b/src/main/scala/viper/gobra/ast/frontend/AstPattern.scala
@@ -22,6 +22,7 @@ object AstPattern {
case class NamedType(id: PIdnUse, symb: st.ActualTypeEntity) extends Type with Symbolic
case class PointerType(base: PType) extends Type
+ case class QualifiedAdtType(base: PType, symb: st.AdtClause) extends Type with Symbolic // TODO: rename
case class BuiltInType(id: PIdnUse, symb: st.BuiltInType) extends Type with Symbolic
@@ -32,6 +33,7 @@ object AstPattern {
case class GlobalVariable(id: PIdnUse, symb: st.GlobalVariable) extends Expr with Symbolic
case class Deref(base: PExpression) extends Expr
case class FieldSelection(base: PExpression, id: PIdnUse, path: Vector[MemberPath], symb: st.StructMember) extends Expr with Symbolic
+ case class AdtField(base: PExpression, id: PIdnUse, symb: st.AdtMember) extends Expr with Symbolic // TODO: maybe rename
case class Conversion(typ: PType, arg: PExpression) extends Expr
sealed trait FunctionLikeCall extends Expr {
diff --git a/src/main/scala/viper/gobra/ast/frontend/PrettyPrinter.scala b/src/main/scala/viper/gobra/ast/frontend/PrettyPrinter.scala
index a87260f33..05a005354 100644
--- a/src/main/scala/viper/gobra/ast/frontend/PrettyPrinter.scala
+++ b/src/main/scala/viper/gobra/ast/frontend/PrettyPrinter.scala
@@ -276,6 +276,8 @@ class DefaultPrettyPrinter extends PrettyPrinter with kiama.output.PrettyPrinter
case PFold(exp) => "fold" <+> showExpr(exp)
case PPackageWand(wand, blockOpt) => "package" <+> showExpr(wand) <+> opt(blockOpt)(showStmt)
case PApplyWand(wand) => "apply" <+> showExpr(wand)
+ case PMatchStatement(exp, clauses, _) => "match" <+>
+ showExpr(exp) <+> block(ssep(clauses map showMatchClauseStatement, line))
case PClosureImplProof(impl, PBlock(stmts)) => "proof" <+> showExpr(impl) <> block(showStmtList(stmts))
}
}
@@ -329,6 +331,20 @@ class DefaultPrettyPrinter extends PrettyPrinter with kiama.output.PrettyPrinter
case _ => "range" <+> showExpr(n.exp) <+> "with" <+> showId(n.enumerated)
}
+ def showMatchClauseStatement(n: PMatchStmtCase): Doc = "case" <+> showMatchPattern(n.pattern) <> ":" <+> nest(line <> ssep(n.stmt map showStmt, line))
+
+ def showMatchPattern(exp: PMatchPattern): Doc = exp match {
+ case PMatchWildcard() => "_"
+ case PMatchBindVar(idn) => showId(idn)
+ case PMatchAdt(clause, fields) => showType(clause) <> "{" <> ssep(fields map showMatchPattern, ", ") <> "}"
+ case PMatchValue(lit) => "`" <> showExpr(lit) <> "`"
+ }
+
+ def showMatchExpClause(c: PMatchExpClause): Doc = c match {
+ case PMatchExpDefault(_) => "default:"
+ case PMatchExpCase(pattern, _) => "case" <+> showMatchPattern(pattern) <> ":"
+ }
+
// expressions
def showExprOrType(expr: PExpressionOrType): Doc = expr match {
@@ -503,6 +519,9 @@ class DefaultPrettyPrinter extends PrettyPrinter with kiama.output.PrettyPrinter
case POptionSome(e) => "some" <> parens(showExpr(e))
case POptionGet(e) => "get" <> parens(showExpr(e))
+ case PMatchExp(exp, clauses) => "match" <+> showExpr(exp) <+> block(
+ ssep(clauses map { c => showMatchExpClause(c) <+> showExpr(c.exp) }, line))
+
case expr : PGhostCollectionExp => expr match {
case PIn(left, right) => showSubExpr(expr, left) <+> "in" <+> showSubExpr(expr, right)
case PMultiplicity(left, right) => showSubExpr(expr, left) <+> "#" <+> showSubExpr(expr, right)
@@ -620,6 +639,7 @@ class DefaultPrettyPrinter extends PrettyPrinter with kiama.output.PrettyPrinter
"domain" <+> block(
ssep((funcs ++ axioms) map showMisc, line)
)
+ case PAdtType(clauses) => "adt" <> block(ssep(clauses map showMisc, line))
}
def showStructClause(c: PStructClause): Doc = c match {
@@ -683,6 +703,16 @@ class DefaultPrettyPrinter extends PrettyPrinter with kiama.output.PrettyPrinter
opt(mip.body)(b => space <> showBodyParameterInfoWithBlock(b._1, b._2))
case ipa: PImplementationProofPredicateAlias =>
"pred" <+> showId(ipa.left) <+> ":=" <+> showExprOrType(ipa.right)
+ case PAdtClause(id, args) =>
+ showId(id) <+> block(
+ ssep(args map (decl => {
+ val fields = decl.fields
+ showIdList(fields map (_.id)) <+> showType(fields.head.typ)
+ }), line))
+ case clause: PMatchStmtCase => showMatchClauseStatement(clause)
+ case expr: PMatchPattern => showMatchPattern(expr)
+ case c: PMatchExpDefault => showMatchExpClause(c)
+ case c: PMatchExpCase => showMatchExpClause(c)
}
}
diff --git a/src/main/scala/viper/gobra/ast/internal/PrettyPrinter.scala b/src/main/scala/viper/gobra/ast/internal/PrettyPrinter.scala
index 94aa4225a..e31b21de3 100644
--- a/src/main/scala/viper/gobra/ast/internal/PrettyPrinter.scala
+++ b/src/main/scala/viper/gobra/ast/internal/PrettyPrinter.scala
@@ -132,6 +132,7 @@ class DefaultPrettyPrinter extends PrettyPrinter with kiama.output.PrettyPrinter
case n: GlobalConstDecl => showGlobalConstDecl(n)
case n: GlobalVarDecl => showGlobalVarDecl(n)
case n: BuiltInMember => showBuiltInMember(n)
+ case n: AdtDefinition => showAdtDefinition(n)
})
def showTerminationMeasure(measure: TerminationMeasure): Doc = {
@@ -237,6 +238,14 @@ class DefaultPrettyPrinter extends PrettyPrinter with kiama.output.PrettyPrinter
case DomainAxiom(expr) => "axiom" <+> block(showExpr(expr))
})
+ def showAdtDefinition(n: AdtDefinition): Doc = updatePositionStore(n) <> (
+ n.name <+> block(ssep(n.clauses map showAdtClause, line))
+ )
+
+ def showAdtClause(clause: AdtClause): Doc = updatePositionStore(clause) <> (clause match {
+ case AdtClause(name, args) => name.name <+> block(ssep(args map showField, line))
+ })
+
def showTypeDecl(t: DefinedT): Doc =
"type" <+> t.name <+> "..." <> line
@@ -332,6 +341,8 @@ class DefaultPrettyPrinter extends PrettyPrinter with kiama.output.PrettyPrinter
case Unfold(acc) => "unfold" <+> showAss(acc)
case PackageWand(wand, block) => "package" <+> showAss(wand) <+> opt(block)(showStmt)
case ApplyWand(wand) => "apply" <+> showAss(wand)
+ case PatternMatchStmt(exp, cases, _) => "match" <+>
+ showExpr(exp) <+> block(ssep(cases map showPatternMatchCaseStmt, line))
case Send(channel, msg, _, _, _) => showExpr(channel) <+> "<-" <+> showExpr(msg)
case SafeReceive(resTarget, successTarget, channel, _, _, _, _) =>
showVar(resTarget) <> "," <+> showVar(successTarget) <+> "=" <+> "<-" <+> showExpr(channel)
@@ -354,6 +365,7 @@ class DefaultPrettyPrinter extends PrettyPrinter with kiama.output.PrettyPrinter
case FPredicateProxy(name) => name
case MPredicateProxy(name, _) => name
case FunctionLitProxy(name) => name
+ case AdtClauseProxy(name, _) => name
case l: LabelProxy => l.name
})
@@ -398,6 +410,17 @@ class DefaultPrettyPrinter extends PrettyPrinter with kiama.output.PrettyPrinter
case Assignee.Index(e) => showExpr(e)
})
+ def showPatternMatchCaseStmt(c: PatternMatchCaseStmt): Doc = "case" <+> showMatchPattern(c.mExp) <> ":" <+> nest(showStmt(c.body))
+
+ def showPatternMatchCaseExp(c: PatternMatchCaseExp): Doc = "case" <+> showMatchPattern(c.mExp) <> ":" <+> showExpr(c.exp)
+
+ def showMatchPattern(expr: MatchPattern): Doc = expr match {
+ case MatchBindVar(name, _) => name
+ case MatchAdt(clause, expr) => clause.name <+> "{" <> ssep(expr map showMatchPattern, ",") <> "}"
+ case MatchValue(exp) => "`" <> showExpr(exp) <> "`"
+ case MatchWildcard() => "_"
+ }
+
// assertions
def showAss(a: Assertion): Doc = updatePositionStore(a) <> (a match {
case SepAnd(left, right) => showAss(left) <+> "&&" <+> showAss(right)
@@ -492,6 +515,11 @@ class DefaultPrettyPrinter extends PrettyPrinter with kiama.output.PrettyPrinter
case OptionSome(exp) => "some" <> parens(showExpr(exp))
case OptionGet(exp) => "get" <> parens(showExpr(exp))
+ case AdtDiscriminator(base, clause) => showExpr(base) <> "." <> showProxy(clause)
+ case AdtDestructor(base, field) => showExpr(base) <> "." <> showField(field)
+ case PatternMatchExp(exp, _, cases, default) => "match" <+> showExpr(exp) <+>
+ block(ssep(cases map showPatternMatchCaseExp, line) <> (if (default.isDefined) line <> "default:" <+> showExpr(default.get) else ""))
+
case Slice(exp, low, high, max, _) => {
val maxD = max.map(e => ":" <> showExpr(e)).getOrElse(emptyDoc)
showExpr(exp) <> brackets(showExpr(low) <> ":" <> showExpr(high) <> maxD)
@@ -591,6 +619,8 @@ class DefaultPrettyPrinter extends PrettyPrinter with kiama.output.PrettyPrinter
case lit@MathMapLit(_, _, entries) =>
val entriesDoc = showList(entries){ case (x,y) => showExpr(x) <> ":" <+> showExpr(y) }
showType(lit.typ) <+> braces(space <> entriesDoc <> (if (entries.nonEmpty) space else emptyDoc))
+
+ case AdtConstructorLit(typ, _, args) => showType(typ) <> braces(showExprList(args))
}
// variables
@@ -639,6 +669,8 @@ class DefaultPrettyPrinter extends PrettyPrinter with kiama.output.PrettyPrinter
case MultisetT(elem, _) => "mset" <> brackets(showType(elem))
case MathMapT(keys, values, _) => "dict" <> brackets(showType(keys)) <> showType(values)
case OptionT(elem, _) => "option" <> brackets(showType(elem))
+ case AdtT(name, _, _) => "adt" <> parens(name)
+ case AdtClauseT(name, adtT, _, _) => showType(adtT) <+> "::" <+> name
case SliceT(elem, _) => "[]" <> showType(elem)
case MapT(keys, values, _) => "map" <> brackets(showType(keys)) <> showType(values)
}
@@ -762,6 +794,8 @@ class ShortPrettyPrinter extends DefaultPrettyPrinter {
case Unfold(acc) => "unfold" <+> showAss(acc)
case PackageWand(wand, _) => "package" <+> showAss(wand)
case ApplyWand(wand) => "apply" <+> showAss(wand)
+ case PatternMatchStmt(exp, cases, strict) => (if (strict) "!" else "") <> "match" <+>
+ showExpr(exp) <+> block(ssep(cases map showPatternMatchCaseStmt, line))
case Send(channel, msg, _, _, _) => showExpr(channel) <+> "<-" <+> showExpr(msg)
case SafeReceive(resTarget, successTarget, channel, _, _, _, _) =>
showVar(resTarget) <> "," <+> showVar(successTarget) <+> "=" <+> "<-" <+> showExpr(channel)
diff --git a/src/main/scala/viper/gobra/ast/internal/Program.scala b/src/main/scala/viper/gobra/ast/internal/Program.scala
index 5ae635350..970a1e250 100644
--- a/src/main/scala/viper/gobra/ast/internal/Program.scala
+++ b/src/main/scala/viper/gobra/ast/internal/Program.scala
@@ -315,6 +315,9 @@ case class DomainFunc(
results: Parameter.Out
)(val info: Source.Parser.Info) extends Node
+case class AdtDefinition(name: String, clauses: Vector[AdtClause])(val info: Source.Parser.Info) extends Member
+case class AdtClause(name: AdtClauseProxy, args: Vector[Field])(val info: Source.Parser.Info) extends Node
+
sealed trait Stmt extends Node
/** This node serves as a target of encoding extensions. See [[viper.gobra.translator.encodings.combinators.TypeEncoding.Extension]]*/
@@ -464,6 +467,23 @@ case class SafeReceive(resTarget: LocalVar, successTarget: LocalVar, channel: Ex
*/
case class SafeMapLookup(resTarget: LocalVar, successTarget: LocalVar, mapLookup: IndexedExp)(val info: Source.Parser.Info) extends Stmt
+case class PatternMatchExp(exp: Expr, typ: Type, cases: Vector[PatternMatchCaseExp], default: Option[Expr])(val info: Source.Parser.Info) extends Expr
+
+case class PatternMatchCaseExp(mExp: MatchPattern, exp: Expr)(val info: Source.Parser.Info) extends Node
+
+case class PatternMatchStmt(exp: Expr, cases: Vector[PatternMatchCaseStmt], strict: Boolean)(val info: Source.Parser.Info) extends Stmt
+
+case class PatternMatchCaseStmt(mExp: MatchPattern, body: Stmt)(val info: Source.Parser.Info) extends Node
+
+sealed trait MatchPattern extends Node
+
+case class MatchValue(exp: Expr)(val info: Source.Parser.Info) extends MatchPattern
+
+case class MatchBindVar(name: String, typ: Type)(val info: Source.Parser.Info) extends MatchPattern
+
+case class MatchAdt(clause: AdtClauseT, expr: Vector[MatchPattern])(val info: Source.Parser.Info) extends MatchPattern
+
+case class MatchWildcard()(val info: Source.Parser.Info) extends MatchPattern
sealed trait Assertion extends Node
@@ -991,6 +1011,14 @@ case class StructUpdate(base: Expr, field: Field, newVal: Expr)(val info: Source
override val typ: Type = base.typ
}
+case class AdtDestructor(base: Expr, field: Field)(val info: Source.Parser.Info) extends Expr {
+ override def typ: Type = field.typ
+}
+
+case class AdtDiscriminator(base: Expr, clause: AdtClauseProxy)(val info: Source.Parser.Info) extends Expr {
+ override def typ: Type = BoolT(Addressability.literal)
+}
+
sealed trait BoolOperation extends Expr {
override val typ: Type = BoolT(Addressability.rValue)
}
@@ -1193,6 +1221,8 @@ case class NewMapLit(target: LocalVar, keys: Type, values: Type, entries: Seq[(E
val typ : Type = MapT(keys, values, Addressability.literal)
}
+case class AdtConstructorLit(typ: Type, clause: AdtClauseProxy, args: Vector[Expr])(val info: Source.Parser.Info) extends CompositeLit
+
sealed trait Declaration extends Node
/** Everything that is defined with the scope of a code block. */
@@ -1535,6 +1565,28 @@ case class DomainT(name: String, addressability: Addressability) extends PrettyT
DomainT(name, newAddressability)
}
+// TODO: check why `clauseToTag` is necessary
+case class AdtT(name: String, addressability: Addressability, clauseToTag: Map[String, BigInt]) extends Type with TopType {
+ override def equalsWithoutMod(t: Type): Boolean = t match {
+ case o: AdtT => name == o.name
+ case _ => false
+ }
+
+ override def withAddressability(newAddressability: Addressability): Type =
+ AdtT(name, newAddressability, clauseToTag)
+}
+
+case class AdtClauseT(name: String, adtT: AdtT, fields: Vector[Field], addressability: Addressability) extends Type {
+ /** Returns whether 'this' is equals to 't' without considering the addressability modifier of the types. */
+ override def equalsWithoutMod(t: Type): Boolean = t match {
+ case o: AdtClauseT => name == o.name && adtT == o.adtT
+ case _ => false
+ }
+
+ override def withAddressability(newAddressability: Addressability): Type =
+ AdtClauseT(name, adtT, fields, newAddressability)
+}
+
case class ChannelT(elem: Type, addressability: Addressability) extends PrettyType(s"chan $elem") {
override def equalsWithoutMod(t: Type): Boolean = t match {
case o: ChannelT => elem == o.elem
@@ -1569,6 +1621,8 @@ case class FunctionProxy(override val name: String)(val info: Source.Parser.Info
case class MethodProxy(name: String, uniqueName: String)(val info: Source.Parser.Info) extends MemberProxy with CallProxy
case class DomainFuncProxy(name: String, domainName: String)(val info: Source.Parser.Info) extends Proxy
+case class AdtClauseProxy(name: String, adtName: String)(val info: Source.Parser.Info) extends Proxy
+
case class FunctionLitProxy(override val name: String)(val info: Source.Parser.Info) extends FunctionMemberOrLitProxy
sealed trait PredicateProxy extends Proxy
diff --git a/src/main/scala/viper/gobra/ast/internal/theory/Comparability.scala b/src/main/scala/viper/gobra/ast/internal/theory/Comparability.scala
index 6c8d02db8..0ea896aa5 100644
--- a/src/main/scala/viper/gobra/ast/internal/theory/Comparability.scala
+++ b/src/main/scala/viper/gobra/ast/internal/theory/Comparability.scala
@@ -58,6 +58,8 @@ object Comparability {
case TypeHead.MathMapHD => Kind.Recursive
case TypeHead.OptionHD => Kind.Recursive
case _: TypeHead.TupleHD => Kind.Recursive
+ case _: TypeHead.AdtHD => Kind.Comparable
+ case _: TypeHead.AdtClauseHD => Kind.Comparable
case _: TypeHead.PredHD => Kind.Comparable
}
diff --git a/src/main/scala/viper/gobra/ast/internal/theory/TypeHead.scala b/src/main/scala/viper/gobra/ast/internal/theory/TypeHead.scala
index 921d218ab..27bae7961 100644
--- a/src/main/scala/viper/gobra/ast/internal/theory/TypeHead.scala
+++ b/src/main/scala/viper/gobra/ast/internal/theory/TypeHead.scala
@@ -43,6 +43,8 @@ object TypeHead {
case object MathMapHD extends TypeHead
case object OptionHD extends TypeHead
case class TupleHD(arity: Int) extends TypeHead
+ case class AdtHD(name: String) extends TypeHead
+ case class AdtClauseHD(name: String) extends TypeHead
case class PredHD(arity: Int) extends TypeHead
val emptyInterfaceHD: InterfaceHD = InterfaceHD(Names.emptyInterface)
@@ -81,6 +83,8 @@ object TypeHead {
case _: MathMapT => MathMapHD
case _: OptionT => OptionHD
case t: TupleT => TupleHD(t.ts.size)
+ case t: AdtT => AdtHD(t.name)
+ case t: AdtClauseT => AdtClauseHD(t.name)
case t: PredT => PredHD(t.args.size)
}
@@ -110,6 +114,8 @@ object TypeHead {
case t: MathMapT => Vector(t.keys, t.values)
case t: OptionT => Vector(t.t)
case t: TupleT => t.ts
+ case _: AdtT => Vector.empty
+ case _: AdtClauseT => Vector.empty
case t: PredT => t.args
}
@@ -184,6 +190,8 @@ object TypeHead {
case MathMapHD => 2
case OptionHD => 1
case t: TupleHD => t.arity
+ case _: AdtHD => 0
+ case _: AdtClauseHD => 0
case t: PredHD => t.arity
}
diff --git a/src/main/scala/viper/gobra/ast/internal/transform/OverflowChecksTransform.scala b/src/main/scala/viper/gobra/ast/internal/transform/OverflowChecksTransform.scala
index 83122b35b..883d861b6 100644
--- a/src/main/scala/viper/gobra/ast/internal/transform/OverflowChecksTransform.scala
+++ b/src/main/scala/viper/gobra/ast/internal/transform/OverflowChecksTransform.scala
@@ -137,7 +137,7 @@ object OverflowChecksTransform extends InternalTransform {
// explicitly matches remaining statements to detect non-exhaustive pattern matching if a new statement is added
case x@(_: Inhale | _: Exhale | _: Assert | _: Assume
| _: Return | _: Fold | _: Unfold | _: PredExprFold | _: PredExprUnfold | _: Outline
- | _: SafeTypeAssertion | _: SafeReceive | _: Label | _: Initialization ) => x
+ | _: SafeTypeAssertion | _: SafeReceive | _: Label | _: Initialization | _: PatternMatchStmt) => x
case _ => violation("Unexpected case reached.")
}
diff --git a/src/main/scala/viper/gobra/frontend/info/base/SymbolTable.scala b/src/main/scala/viper/gobra/frontend/info/base/SymbolTable.scala
index 52af9697f..d5b905bd9 100644
--- a/src/main/scala/viper/gobra/frontend/info/base/SymbolTable.scala
+++ b/src/main/scala/viper/gobra/frontend/info/base/SymbolTable.scala
@@ -255,6 +255,35 @@ object SymbolTable extends Environments[Entity] {
override val result: PResult = decl.result
}
+ case class MatchVariable(decl: PMatchBindVar, p: PNode, context: ExternalTypeInfo) extends GhostVariable {
+ override def rep: PNode = decl
+
+ override def addressable: Boolean = false
+ }
+
+ case class AdtClause(decl: PAdtClause, adtDecl: PAdtType, context: ExternalTypeInfo) extends GhostRegular {
+ override def rep: PNode = decl
+
+ def getName: String = decl.id.name
+
+ val fields: Vector[PFieldDecl] = decl.args.flatMap(f => f.fields)
+ }
+
+ sealed trait AdtMember extends GhostTypeMember {
+ def getName: String
+ }
+
+ case class AdtDestructor(decl: PFieldDecl, adtType: PAdtType, context: ExternalTypeInfo) extends AdtMember {
+ override def rep: PNode = decl
+
+ override def getName: String = decl.id.name
+ }
+
+ case class AdtDiscriminator(decl: PAdtClause, adtType: PAdtType, context: ExternalTypeInfo) extends AdtMember {
+ override def rep: PNode = decl
+
+ override def getName: String = s"is${decl.id.name}"
+ }
/**
* entities for built-in members
diff --git a/src/main/scala/viper/gobra/frontend/info/base/Type.scala b/src/main/scala/viper/gobra/frontend/info/base/Type.scala
index 671f7dc97..a467e5462 100644
--- a/src/main/scala/viper/gobra/frontend/info/base/Type.scala
+++ b/src/main/scala/viper/gobra/frontend/info/base/Type.scala
@@ -8,7 +8,7 @@ package viper.gobra.frontend.info.base
import org.bitbucket.inkytonik.kiama.==>
import org.bitbucket.inkytonik.kiama.util.Messaging.Messages
-import viper.gobra.ast.frontend.{PDomainType, PImport, PInterfaceType, PNode, PStructType, PTypeDecl}
+import viper.gobra.ast.frontend.{PAdtClause, PAdtType, PDomainType, PImport, PInterfaceType, PNode, PStructType, PTypeDecl}
import viper.gobra.frontend.info.ExternalTypeInfo
import viper.gobra.util.TypeBounds
@@ -56,6 +56,11 @@ object Type {
case class DomainT(decl: PDomainType, context: ExternalTypeInfo) extends PrettyType("domain{...}") with ContextualType
+ case class AdtT(decl: PAdtType, context: ExternalTypeInfo) extends Type
+
+ // TODO: rename `clauses` to `fields`
+ case class AdtClauseT(clauses: Map[String, Type], decl: PAdtClause, adtT: PAdtType, context: ExternalTypeInfo) extends Type
+
case class MapT(key: Type, elem: Type) extends PrettyType(s"map[$key]$elem")
case class PointerT(elem: Type) extends PrettyType(s"*$elem")
diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/property/Addressability.scala b/src/main/scala/viper/gobra/frontend/info/implementation/property/Addressability.scala
index 62d755305..30ade529b 100644
--- a/src/main/scala/viper/gobra/frontend/info/implementation/property/Addressability.scala
+++ b/src/main/scala/viper/gobra/frontend/info/implementation/property/Addressability.scala
@@ -70,7 +70,7 @@ trait Addressability extends BaseProperty { this: TypeInfoImpl =>
case n: PDot => resolve(n) match {
case Some(s: ap.FieldSelection) => AddrMod.fieldLookup(addressabilityMemberPath(addressability(s.base), s.path))
case Some(_: ap.Constant) => AddrMod.constant
- case Some(_: ap.ReceivedMethod | _: ap.MethodExpr | _: ap.ReceivedPredicate | _: ap.PredicateExpr ) => AddrMod.rValue
+ case Some(_: ap.ReceivedMethod | _: ap.MethodExpr | _: ap.ReceivedPredicate | _: ap.PredicateExpr | _: ap.AdtField) => AddrMod.rValue
case Some(_: ap.NamedType | _: ap.BuiltInType | _: ap.Function | _: ap.Predicate | _: ap.DomainFunction) => AddrMod.rValue
case Some(_: ap.ImplicitlyReceivedInterfaceMethod | _: ap.ImplicitlyReceivedInterfacePredicate) => AddrMod.rValue
case Some(g: ap.GlobalVariable) => if (g.symb.addressable) AddrMod.Shared else AddrMod.Exclusive
@@ -107,6 +107,7 @@ trait Addressability extends BaseProperty { this: TypeInfoImpl =>
_: PGhostCollectionExp | _: PRangeSequence | _: PUnion | _: PIntersection |
_: PSetMinus | _: PSubset | _: PMapKeys | _: PMapValues => AddrMod.rValue
case _: POptionNone | _: POptionSome | _: POptionGet => AddrMod.rValue
+ case _: PMatchExp => AddrMod.rValue
case _: PMake | _: PNew => AddrMod.make
case _: PUnpackSlice => AddrMod.rValue
}
diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/property/Assignability.scala b/src/main/scala/viper/gobra/frontend/info/implementation/property/Assignability.scala
index dd67bfa57..96436ab94 100644
--- a/src/main/scala/viper/gobra/frontend/info/implementation/property/Assignability.scala
+++ b/src/main/scala/viper/gobra/frontend/info/implementation/property/Assignability.scala
@@ -100,6 +100,7 @@ trait Assignability extends BaseProperty { this: TypeInfoImpl =>
case (MultisetT(l), MultisetT(r)) => assignableTo.result(l,r)
case (OptionT(l), OptionT(r)) => assignableTo.result(l, r)
case (IntT(_), PermissionT) => successProp
+ case (c: AdtClauseT, t: AdtT) if c.context == t.context && c.adtT == t.decl => successProp
// conservative choice
case _ => errorProp()
@@ -181,6 +182,31 @@ trait Assignability extends BaseProperty { this: TypeInfoImpl =>
failedProp("number of arguments does not match structure")
}
+ case a: AdtClauseT => // analogous to struct
+ if (elems.isEmpty) {
+ successProp
+ } else if (elems.exists(_.key.nonEmpty)) {
+ val tmap: Map[String, Type] = a.clauses
+
+ failedProp("for adt literals either all or none elements must be keyed",
+ !elems.forall(_.key.nonEmpty)) and
+ propForall(elems, createProperty[PKeyedElement] { e =>
+ e.key.map {
+ case PIdentifierKey(id) if tmap.contains(id.name) =>
+ compositeValAssignableTo.result(e.exp, tmap(id.name))
+
+ case v => failedProp(s"got $v but expected field name")
+ }.getOrElse(successProp)
+ })
+ } else if (elems.size == a.clauses.size) {
+ propForall(
+ elems.map(_.exp).zip(a.clauses.values),
+ compositeValAssignableTo
+ )
+ } else {
+ failedProp("number of arguments does not match adt constructor")
+ }
+
case ArrayT(len, t) =>
areAllKeysConstant(elems) and
areAllKeysDisjoint(elems) and
diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/property/TypeIdentity.scala b/src/main/scala/viper/gobra/frontend/info/implementation/property/TypeIdentity.scala
index 7210ac506..7cb06f7ae 100644
--- a/src/main/scala/viper/gobra/frontend/info/implementation/property/TypeIdentity.scala
+++ b/src/main/scala/viper/gobra/frontend/info/implementation/property/TypeIdentity.scala
@@ -66,6 +66,8 @@ trait TypeIdentity extends BaseProperty { this: TypeInfoImpl =>
case (VoidType, VoidType) => true
+ case (l: AdtT, r: AdtT) => l == r
+
case _ => false
}
diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/property/TypeMerging.scala b/src/main/scala/viper/gobra/frontend/info/implementation/property/TypeMerging.scala
index c6aa9d8b6..abeea0c05 100644
--- a/src/main/scala/viper/gobra/frontend/info/implementation/property/TypeMerging.scala
+++ b/src/main/scala/viper/gobra/frontend/info/implementation/property/TypeMerging.scala
@@ -6,7 +6,7 @@
package viper.gobra.frontend.info.implementation.property
-import viper.gobra.frontend.info.base.Type.{ArrayT, ChannelT, GhostSliceT, IntT, InternalSingleMulti, InternalTupleT, MapT, MultisetT, PermissionT, PointerT, SequenceT, SetT, Single, SliceT, Type}
+import viper.gobra.frontend.info.base.Type.{AdtClauseT, AdtT, ArrayT, ChannelT, GhostSliceT, IntT, InternalSingleMulti, InternalTupleT, MapT, MultisetT, PermissionT, PointerT, SequenceT, SetT, Single, SliceT, Type}
import viper.gobra.frontend.info.implementation.TypeInfoImpl
trait TypeMerging extends BaseProperty { this: TypeInfoImpl =>
@@ -44,6 +44,8 @@ trait TypeMerging extends BaseProperty { this: TypeInfoImpl =>
sin <- typeMerge(sin1, sin2)
multi <- typeMerge(multi1, multi2)
} yield InternalSingleMulti(sin, multi.asInstanceOf[InternalTupleT])
+ case (l: AdtClauseT, r: AdtClauseT)
+ if l.context == r.context && l.adtT == r.adtT => Some(AdtT(l.adtT, l.context))
case _ => None
}
diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/resolution/AdvancedMemberSet.scala b/src/main/scala/viper/gobra/frontend/info/implementation/resolution/AdvancedMemberSet.scala
index be7fe3724..a517bf33f 100644
--- a/src/main/scala/viper/gobra/frontend/info/implementation/resolution/AdvancedMemberSet.scala
+++ b/src/main/scala/viper/gobra/frontend/info/implementation/resolution/AdvancedMemberSet.scala
@@ -96,6 +96,8 @@ object AdvancedMemberSet {
case n: MPredicateSpec => n.decl.id.name
case Field(m, _, _) => m.id.name
case Embbed(m, _, _) => m.id.name
+ case t: AdtMember => t.getName
+ case t: AdtClause => t.getName
case ml: BuiltInMethodLike => ml.tag.identifier
}
diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/resolution/AmbiguityResolution.scala b/src/main/scala/viper/gobra/frontend/info/implementation/resolution/AmbiguityResolution.scala
index 62f4823ac..384718732 100644
--- a/src/main/scala/viper/gobra/frontend/info/implementation/resolution/AmbiguityResolution.scala
+++ b/src/main/scala/viper/gobra/frontend/info/implementation/resolution/AmbiguityResolution.scala
@@ -83,9 +83,11 @@ trait AmbiguityResolution { this: TypeInfoImpl =>
case (Left(base), Some((s: st.StructMember, path))) => Some(ap.FieldSelection(base, n.id, path, s))
case (Left(base), Some((s: st.Method, path))) => Some(ap.ReceivedMethod(base, n.id, path, s))
case (Left(base), Some((s: st.MPredicate, path))) => Some(ap.ReceivedPredicate(base, n.id, path, s))
+ case (Left(base), Some((s: st.AdtMember, _))) => Some(ap.AdtField(base, n.id, s))
case (Right(base), Some((s: st.Method, path))) => Some(ap.MethodExpr(base, n.id, path, s))
case (Right(base), Some((s: st.MPredicate, path))) => Some(ap.PredicateExpr(base, n.id, path, s))
+ case (Right(base), Some((s: st.AdtClause, _))) => Some(ap.QualifiedAdtType(base, s))
// imported members
case (Right(_), Some((s: st.ActualTypeEntity, _))) => Some(ap.NamedType(n.id, s))
diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/resolution/MemberResolution.scala b/src/main/scala/viper/gobra/frontend/info/implementation/resolution/MemberResolution.scala
index ae608f75d..ce05c169a 100644
--- a/src/main/scala/viper/gobra/frontend/info/implementation/resolution/MemberResolution.scala
+++ b/src/main/scala/viper/gobra/frontend/info/implementation/resolution/MemberResolution.scala
@@ -44,6 +44,81 @@ trait MemberResolution { this: TypeInfoImpl =>
override def createMPredSpec(spec: PMPredicateSig): MPredicateSpec =
defEntity(spec.id).asInstanceOf[MPredicateSpec]
+ // Struct Fields
+
+ private val fieldSuffix: Type => AdvancedMemberSet[StructMember] = {
+
+ def go(pastDeref: Boolean): Type => AdvancedMemberSet[StructMember] = attr[Type, AdvancedMemberSet[StructMember]] {
+
+ case DeclaredT(decl, context) => go(pastDeref)(context.symbType(decl.right)).surface
+ case PointerT(t) if !pastDeref => go(pastDeref = true)(t).ref
+
+ case s: StructT =>
+ val (es, fs) = (s.decl.embedded, s.decl.fields)
+ AdvancedMemberSet.init[StructMember](fs map s.context.createField) union AdvancedMemberSet.init(es map s.context.createEmbbed)
+
+ case _ => AdvancedMemberSet.empty
+ }
+
+ go(pastDeref = false)
+ }
+
+ val structMemberSet: Type => AdvancedMemberSet[StructMember] =
+ attr[Type, AdvancedMemberSet[StructMember]] {
+ case Single(t) => fieldSuffix(t) union pastPromotions(fieldSuffix)(t)
+ case _ => AdvancedMemberSet.empty
+ }
+
+ // ADT
+
+ /** Destructors and discriminator induced by adt clause */
+ private def adtClauseMemberSet(decl: PAdtClause, adtDecl: PAdtType, ctx: ExternalTypeInfo): AdvancedMemberSet[AdtMember] = {
+ val fields = decl.args.flatMap(_.fields).map(f => AdtDestructor(f, adtDecl, ctx))
+ val discriminator = AdtDiscriminator(decl, adtDecl, ctx)
+ AdvancedMemberSet.init[AdtMember](discriminator +: fields)
+ }
+
+ /**
+ * Destructors and discriminators induced by adt clauses of adt types.
+ * The implementation is the same as [[fieldSuffix]], except the case for ADTs.
+ **/
+ private val adtSuffix: Type => AdvancedMemberSet[AdtMember] = {
+
+ def go(pastDeref: Boolean): Type => AdvancedMemberSet[AdtMember] = attr[Type, AdvancedMemberSet[AdtMember]] {
+
+ case DeclaredT(decl, context) => go(pastDeref)(context.symbType(decl.right)).surface
+ case PointerT(t) if !pastDeref => go(pastDeref = true)(t).ref
+
+ case t: AdtT =>
+ val clauseMemberSets = t.decl.clauses.map(adtClauseMemberSet(_, t.decl, t.context))
+ AdvancedMemberSet.union(clauseMemberSets)
+
+ case t: AdtClauseT =>
+ val fields = t.decl.args.flatMap(_.fields).map(f => AdtDestructor(f, t.adtT, t.context))
+ val discriminator = AdtDiscriminator(t.decl, t.adtT, t.context)
+ AdvancedMemberSet.init[AdtMember](discriminator +: fields)
+
+ case _ => AdvancedMemberSet.empty
+ }
+
+ go(pastDeref = false)
+ }
+
+ val adtMemberSet: Type => AdvancedMemberSet[AdtMember] =
+ attr[Type, AdvancedMemberSet[AdtMember]] {
+ case Single(t) => adtSuffix(t) union pastPromotions(adtSuffix)(t)
+ case _ => AdvancedMemberSet.empty
+ }
+
+ val adtConstructorSet: Type => AdvancedMemberSet[AdtClause] =
+ attr[Type, AdvancedMemberSet[AdtClause]] {
+ case DeclaredT(decl, context) => adtConstructorSet(context.symbType(decl.right)).surface
+ case t: AdtT =>
+ AdvancedMemberSet.init[AdtClause](t.decl.clauses.map(c => AdtClause(c, t.decl, this)))
+ }
+
+ // Methods
+
private lazy val receiverMethodSetMap: Map[Type, AdvancedMemberSet[TypeMember]] = {
tree.root.declarations
.collect {
@@ -71,6 +146,8 @@ trait MemberResolution { this: TypeInfoImpl =>
receiverMethodSetMap.getOrElse(recv, AdvancedMemberSet.empty) union
builtInReceiverMethodSet(recv)
+ // Predicates
+
private lazy val receiverPredicateSetMap: Map[Type, AdvancedMemberSet[TypeMember]] = {
tree.root.declarations
.collect { case m: PMPredicateDecl => createMPredImpl(m) }
@@ -95,9 +172,13 @@ trait MemberResolution { this: TypeInfoImpl =>
receiverPredicateSetMap.getOrElse(recv, AdvancedMemberSet.empty) union
builtInReceiverPredicateSet(recv)
+ // Methods + Predicates
+
lazy val receiverSet: Type => AdvancedMemberSet[TypeMember] =
attr[Type, AdvancedMemberSet[TypeMember]] (t => receiverMethodSet(t) union receiverPredicateSet(t))
+ // Interfaces
+
lazy val interfaceMethodSet: InterfaceT => AdvancedMemberSet[TypeMember] =
attr[InterfaceT, AdvancedMemberSet[TypeMember]] {
case InterfaceT(PInterfaceType(es, methSpecs, predSpecs), ctxt) =>
@@ -114,6 +195,7 @@ trait MemberResolution { this: TypeInfoImpl =>
}
}
+ // Promotion
private def pastPromotions[M <: TypeMember](cont: Type => AdvancedMemberSet[M]): Type => AdvancedMemberSet[M] = {
@@ -136,33 +218,12 @@ trait MemberResolution { this: TypeInfoImpl =>
go(pastDeref = false)
}
- private val fieldSuffix: Type => AdvancedMemberSet[StructMember] = {
-
- def go(pastDeref: Boolean): Type => AdvancedMemberSet[StructMember] = attr[Type, AdvancedMemberSet[StructMember]] {
-
- case DeclaredT(decl, context) => go(pastDeref)(context.symbType(decl.right)).surface
- case PointerT(t) if !pastDeref => go(pastDeref = true)(t).ref
-
- case s: StructT =>
- val (es, fs) = (s.decl.embedded, s.decl.fields)
- AdvancedMemberSet.init[StructMember](fs map s.context.createField) union AdvancedMemberSet.init(es map s.context.createEmbbed)
-
- case _ => AdvancedMemberSet.empty
- }
-
- go(pastDeref = false)
- }
-
- val structMemberSet: Type => AdvancedMemberSet[StructMember] =
- attr[Type, AdvancedMemberSet[StructMember]] {
- case Single(t) => fieldSuffix(t) union pastPromotions(fieldSuffix)(t)
- case _ => AdvancedMemberSet.empty
- }
+ // Methodsets
private val pastPromotionsMethodSuffix: Type => AdvancedMemberSet[TypeMember] =
attr[Type, AdvancedMemberSet[TypeMember]] {
case t: InterfaceT => interfaceMethodSet(t)
- case pt@ PointerT(t) => receiverSet(pt) union receiverSet(t).ref
+ case pt@PointerT(t) => receiverSet(pt) union receiverSet(t).ref
case t => receiverSet(t) union receiverSet(PointerT(t)).deref
}
@@ -186,18 +247,35 @@ trait MemberResolution { this: TypeInfoImpl =>
case _ => AdvancedMemberSet.empty
}
+ /**
+ * Returns the memberset of type `t` within the specific context.
+ * The purpose of this method is that typecheckers of other packages access it to compute [[memberSet]].
+ **/
override def localMemberSet(t: Type): AdvancedMemberSet[TypeMember] = {
nonAddressableMethodSet(t)
}
+ /** Returns the memberset of type `t`. */
override def memberSet(t: Type): AdvancedMemberSet[TypeMember] = {
val context = getMethodReceiverContext(t)
context.localMemberSet(t)
}
+ // Lookups
+
def tryFieldLookup(t: Type, id: PIdnUse): Option[(StructMember, Vector[MemberPath])] =
structMemberSet(t).lookupWithPath(id.name)
+ def tryAdtMemberLookup(t: Type, id: PIdnUse): Option[(AdtMember, Vector[MemberPath])] =
+ adtMemberSet(t).lookupWithPath(id.name)
+
+ def tryAdtConstructorLookup(t: Type, id: PIdnUse): Option[(AdtClause, Vector[MemberPath])] =
+ adtConstructorSet(t).lookupWithPath(id.name)
+
+ /** Resolves `e`.`id`.
+ * @return _1: Methods accessible if e is addressable.
+ * _2: Methods accessible if e is not addressable.
+ **/
def tryMethodLikeLookup(e: PExpression, id: PIdnUse):
(Option[(TypeMember, Vector[MemberPath])], Option[(TypeMember, Vector[MemberPath])]) = {
// check whether e is well-defined:
@@ -213,6 +291,8 @@ trait MemberResolution { this: TypeInfoImpl =>
context.tryNonAddressableMethodLikeLookup(e, id)
}
+ def tryMethodLikeLookup(e: PType, id: PIdnUse): Option[(Entity, Vector[MemberPath])] = tryMethodLikeLookup(typeSymbType(e), id)
+
@tailrec
private def getMethodReceiverContext(t: Type): ExternalTypeInfo = {
Single.unapply(t) match {
@@ -222,69 +302,19 @@ trait MemberResolution { this: TypeInfoImpl =>
}
}
- def tryMethodLikeLookup(e: PType, id: PIdnUse): Option[(Entity, Vector[MemberPath])] = tryMethodLikeLookup(typeSymbType(e), id)
-
- def tryPackageLookup(importTarget: AbstractImport, id: PIdnUse, errNode: PNode): Option[(Entity, Vector[MemberPath])] = {
- val foreignPkgResult = for {
- typeChecker <- getTypeChecker(importTarget, errNode)
- entity = typeChecker.externalRegular(id)
- } yield entity
- foreignPkgResult.fold(
- msgs => Some((ErrorMsgEntity(msgs), Vector())),
- m => m.flatMap(m => Some((m, Vector())))
- )
- }
-
- private def parseAndTypeCheck(importTarget: AbstractImport): Either[Vector[VerifierError], ExternalTypeInfo] = {
- val pkgSources = PackageResolver.resolveSources(importTarget)(config)
- .getOrElse(Vector())
- .map(_.source)
- val res = for {
- nonEmptyPkgSources <- if (pkgSources.isEmpty)
- Left(Vector(NotFoundError(s"No source files for package '$importTarget' found")))
- else Right(pkgSources)
- parsedProgram <- Parser.parse(nonEmptyPkgSources, Source.getPackageInfo(nonEmptyPkgSources.head, config.projectRoot), specOnly = true)(config)
- // TODO maybe don't check whole file but only members that are actually used/imported
- // By parsing only declarations and their specification, there shouldn't be much left to type check anyways
- // Info.check would probably need some restructuring to type check only certain members
- info <- Info.check(parsedProgram, nonEmptyPkgSources, context)(config)
- } yield info
- res.fold(
- errs => context.addErrenousPackage(importTarget, errs)(config),
- info => context.addPackage(importTarget, info)(config)
- )
- res
- }
-
- def getTypeChecker(importTarget: AbstractImport, errNode: PNode): Either[Messages, ExternalTypeInfo] = {
- def createImportError(errs: Vector[VerifierError]): Messages = {
- // create an error message located at the import statement to indicate errors in the imported package
- // we distinguish between parse and type errors, cyclic imports, and packages whose source files could not be found
- val notFoundErr = errs.collectFirst { case e: NotFoundError => e }
- // alternativeErr is a function to compute the message only when needed
- val alternativeErr = () => context.getImportCycle(importTarget) match {
- case Some(cycle) => message(errNode, s"Package '$importTarget' is part of this import cycle: ${cycle.mkString("[", ", ", "]")}")
- case _ => message(errNode, s"Package '$importTarget' contains errors: $errs")
- }
- notFoundErr.map(e => message(errNode, e.message))
- .getOrElse(alternativeErr())
- }
-
- // check if package was already parsed, otherwise do parsing and type checking:
- val cachedInfo = context.getTypeInfo(importTarget)(config)
- cachedInfo.getOrElse(parseAndTypeCheck(importTarget)).left.map(createImportError)
- }
-
+ /** resolve `b`.`id` */
def tryDotLookup(b: PExpressionOrType, id: PIdnUse): Option[(Entity, Vector[MemberPath])] = {
exprOrType(b) match {
- case Left(expr) =>
+ case Left(expr) => // base is an expression
val (addr, nonAddr) = tryMethodLikeLookup(expr, id)
lazy val isGoEffAddressable = goEffAddressable(expr)
lazy val isEffAddressable = effAddressable(expr)
if (addr.isEmpty && nonAddr.isEmpty) {
// could not find the corresponding member
- tryFieldLookup(exprType(expr), id)
+ val rcvTyp = exprType(expr)
+ tryFieldLookup(rcvTyp, id) // try to resolve id as struct field
+ .orElse(tryAdtMemberLookup(rcvTyp, id)) // try to resolve id as adt field or discriminator
} else if (isEffAddressable && addr.nonEmpty) {
addr
} else if (!isEffAddressable && nonAddr.nonEmpty) {
@@ -301,12 +331,13 @@ trait MemberResolution { this: TypeInfoImpl =>
} else {
Violation.violation(s"unexpected case reached: $expr")
}
- case Right(typ) =>
- val methodLikeAttempt = tryMethodLikeLookup(typ, id)
- if (methodLikeAttempt.isDefined) methodLikeAttempt
- else typeSymbType(typ) match {
+ case Right(typ) => // base is a type
+ typeSymbType(typ) match {
case pkg: ImportT => tryPackageLookup(RegularImport(pkg.decl.importPath), id, pkg.decl)
- case _ => None
+ case t =>
+ tryMethodLikeLookup(t, id)
+ // Constructors are not part of membersets because they are not promoted
+ .orElse(tryAdtConstructorLookup(t, id))
}
}
}
@@ -344,6 +375,18 @@ trait MemberResolution { this: TypeInfoImpl =>
tryPackageLookup(BuiltInImport, id, id).map(_._1)
def tryUnqualifiedRegularPackageLookup(id: PIdnUse): Entity = {
+
+ def transitiveClosure[T](t: T, onestep: T => Vector[T]): Relation[T, T] = {
+ // fromOneStep creates a new relation in which all links from t to the root are contained in
+ val links = Relation.fromOneStep(t, onestep)
+ // create a new relation that consists of the image of links but only has t as its domain:
+ val relation = new Relation[T, T]
+ for (pair <- links.pairs) {
+ relation.put(t, pair._2)
+ }
+ relation
+ }
+
val transitiveParent = transitiveClosure(id, tree.parent(_))
val entities = for {
// get enclosing PProgram for this PIdnUse node
@@ -360,20 +403,57 @@ trait MemberResolution { this: TypeInfoImpl =>
}
}
- def transitiveClosure[T](t : T, onestep : T => Vector[T]): Relation[T, T] = {
- // fromOneStep creates a new relation in which all links from t to the root are contained in
- val links = Relation.fromOneStep(t, onestep)
- // create a new relation that consists of the image of links but only has t as its domain:
- val relation = new Relation[T, T]
- for (pair <- links.pairs) {
- relation.put(t, pair._2)
- }
- relation
- }
+ /** lookup `id` in package `importTarget`. `errNode` is used as offending node. */
+ def tryPackageLookup(importTarget: AbstractImport, id: PIdnUse, errNode: PNode): Option[(Entity, Vector[MemberPath])] = {
+ val foreignPkgResult = for {
+ typeChecker <- getTypeChecker(importTarget, errNode)
+ entity = typeChecker.externalRegular(id)
+ } yield entity
+ foreignPkgResult.fold(
+ msgs => Some((ErrorMsgEntity(msgs), Vector())),
+ m => m.flatMap(m => Some((m, Vector())))
+ )
+ }
- def findField(t: Type, id: PIdnUse): Option[StructMember] =
- structMemberSet(t).lookup(id.name)
+ // TODO: move this method to another file
+ def getTypeChecker(importTarget: AbstractImport, errNode: PNode): Either[Messages, ExternalTypeInfo] = {
+ def parseAndTypeCheck(importTarget: AbstractImport): Either[Vector[VerifierError], ExternalTypeInfo] = {
+ val pkgSources = PackageResolver.resolveSources(importTarget)(config)
+ .getOrElse(Vector())
+ .map(_.source)
+ val res = for {
+ nonEmptyPkgSources <- if (pkgSources.isEmpty)
+ Left(Vector(NotFoundError(s"No source files for package '$importTarget' found")))
+ else Right(pkgSources)
+ parsedProgram <- Parser.parse(nonEmptyPkgSources, Source.getPackageInfo(nonEmptyPkgSources.head, config.projectRoot), specOnly = true)(config)
+ // TODO maybe don't check whole file but only members that are actually used/imported
+ // By parsing only declarations and their specification, there shouldn't be much left to type check anyways
+ // Info.check would probably need some restructuring to type check only certain members
+ info <- Info.check(parsedProgram, nonEmptyPkgSources, context)(config)
+ } yield info
+ res.fold(
+ errs => context.addErrenousPackage(importTarget, errs)(config),
+ info => context.addPackage(importTarget, info)(config)
+ )
+ res
+ }
+ def createImportError(errs: Vector[VerifierError]): Messages = {
+ // create an error message located at the import statement to indicate errors in the imported package
+ // we distinguish between parse and type errors, cyclic imports, and packages whose source files could not be found
+ val notFoundErr = errs.collectFirst { case e: NotFoundError => e }
+ // alternativeErr is a function to compute the message only when needed
+ val alternativeErr = () => context.getImportCycle(importTarget) match {
+ case Some(cycle) => message(errNode, s"Package '$importTarget' is part of this import cycle: ${cycle.mkString("[", ", ", "]")}")
+ case _ => message(errNode, s"Package '$importTarget' contains errors: $errs")
+ }
+ notFoundErr.map(e => message(errNode, e.message))
+ .getOrElse(alternativeErr())
+ }
+ // check if package was already parsed, otherwise do parsing and type checking:
+ val cachedInfo = context.getTypeInfo(importTarget)(config)
+ cachedInfo.getOrElse(parseAndTypeCheck(importTarget)).left.map(createImportError)
+ }
}
diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/resolution/NameResolution.scala b/src/main/scala/viper/gobra/frontend/info/implementation/resolution/NameResolution.scala
index 54f3f8460..613989abc 100644
--- a/src/main/scala/viper/gobra/frontend/info/implementation/resolution/NameResolution.scala
+++ b/src/main/scala/viper/gobra/frontend/info/implementation/resolution/NameResolution.scala
@@ -11,7 +11,7 @@ import viper.gobra.frontend.PackageResolver.RegularImport
import viper.gobra.frontend.info.base.BuiltInMemberTag
import viper.gobra.frontend.info.base.BuiltInMemberTag.{BuiltInFPredicateTag, BuiltInFunctionTag, BuiltInMPredicateTag, BuiltInMethodTag, BuiltInTypeTag}
import viper.gobra.frontend.info.base.SymbolTable._
-import viper.gobra.frontend.info.base.Type.{InterfaceT, StructT}
+import viper.gobra.frontend.info.base.Type.{AdtClauseT, InterfaceT, StructT}
import viper.gobra.frontend.info.implementation.TypeInfoImpl
import viper.gobra.frontend.info.implementation.property.{AssignMode, StrictAssignMode}
import viper.gobra.util.Violation
@@ -92,6 +92,12 @@ trait NameResolution {
case tree.parent.pair(decl: PDomainFunction, domain: PDomainType) => DomainFunction(decl, domain, this)
+ case tree.parent.pair(decl: PAdtClause, adtDecl: PAdtType) => AdtClause(decl, adtDecl, this)
+
+ case tree.parent.pair(decl: PMatchBindVar, adt: PMatchAdt) => MatchVariable(decl, adt, this)
+ case tree.parent.pair(decl: PMatchBindVar, tree.parent.pair(_: PMatchStmtCase, matchE: PMatchStatement)) =>
+ MatchVariable(decl, matchE.exp, this)
+
case c => Violation.violation(s"This case should be unreachable, but got $c")
}
case c => Violation.violation(s"Only the root has no parent, but got $c")
@@ -183,6 +189,27 @@ trait NameResolution {
leave(out(scope))
}
+ private def addUnorderedDefToEnv(env: Environment)(n: PUnorderedScope): Environment = {
+ addToEnv(env)(definitionsForScope(n).filter(doesAddEntry))
+ }
+
+ private lazy val dependentDefenv: PUnorderedScope => Environment =
+ attr[PUnorderedScope, Environment] {
+ n: PUnorderedScope => addToEnv(rootenv())(definitionsForScope(n).filterNot(doesAddEntry))
+ }
+
+ private def addToEnv(env: Environment)(identifiers: Vector[PIdnDef]): Environment = {
+ identifiers.foldLeft(env) {
+ case (e, id) =>
+ defineIfNew(e, serialize(id), MultipleEntity(), defEntity(id))
+ }
+ }
+
+ private def isUnorderedDef(id: PIdnDef): Boolean = id match {
+ case tree.parent(tree.parent(c)) => enclosingScope(c).isInstanceOf[PUnorderedScope]
+ case c => Violation.violation(s"Only the root has no parent, but got $c")
+ }
+
/**
* Returns true iff the identifier declares an entity that is added to the symbol lookup table
*/
@@ -192,6 +219,28 @@ trait NameResolution {
case _ => true
}
+ /** returns usable definitions visible from within the unordered scope. */
+ private lazy val definitionsForScope: PUnorderedScope => Vector[PIdnDef] =
+ attr[PUnorderedScope, Vector[PIdnDef]] {
+ case n: PPackage => n.declarations flatMap packageLevelDefinitions
+
+ // imports do not belong to the root environment but are file/program specific (instead of package specific):
+ case n: PProgram => n.imports flatMap {
+ case PExplicitQualifiedImport(id: PIdnDef, _, _) => Vector(id)
+ case _ => Vector.empty
+ }
+
+ case n: PInterfaceType =>
+ n.methSpecs.map(_.id) ++ n.predSpecs.map(_.id)
+
+ // domain members are added at the package level
+ case _: PDomainType => Vector.empty
+
+ // They have visible definitions, but currently we do not have constructs that reference them
+ // from within the unordered scope. Therefore, we do not include them.
+ case _: PStructType | _: PAdtType | _: PAdtClause => Vector.empty
+ }
+
/**
* returns the (package-level) identifiers defined by a member
*/
@@ -218,62 +267,10 @@ trait NameResolution {
}
}
- private lazy val definitionsForScope: PUnorderedScope => Vector[PIdnDef] =
- attr[PUnorderedScope, Vector[PIdnDef]] {
- case n: PPackage => n.declarations flatMap packageLevelDefinitions
-
- // imports do not belong to the root environment but are file/program specific (instead of package specific):
- case n: PProgram => n.imports flatMap {
- case PExplicitQualifiedImport(id: PIdnDef, _, _) => Vector(id)
- case _ => Vector.empty
- }
-
- // note that the identifiers returned for PStructType will be filtered out before creating corresponding
- // symbol table entries
- case n: PStructType => n.clauses.flatMap { c =>
- def collectStructIds(clause: PActualStructClause): Vector[PIdnDef] = clause match {
- case d: PFieldDecls => d.fields map (_.id)
- case d: PEmbeddedDecl => Vector(d.id)
- }
-
- c match {
- case clause: PActualStructClause => collectStructIds(clause)
- case PExplicitGhostStructClause(clause) => collectStructIds(clause)
- }
- }
-
- case n: PInterfaceType =>
- n.methSpecs.map(_.id) ++ n.predSpecs.map(_.id)
-
- // domain members are added at the package level
- case _: PDomainType => Vector.empty
- }
-
- private def addUnorderedDefToEnv(env: Environment)(n: PUnorderedScope): Environment = {
- addToEnv(env)(definitionsForScope(n).filter(doesAddEntry))
- }
-
- private lazy val dependentDefenv: PUnorderedScope => Environment =
- attr[PUnorderedScope, Environment] {
- n: PUnorderedScope => addToEnv(rootenv())(definitionsForScope(n).filterNot(doesAddEntry))
- }
-
- private def addToEnv(env: Environment)(identifiers: Vector[PIdnDef]): Environment = {
- identifiers.foldLeft(env) {
- case (e, id) =>
- defineIfNew(e, serialize(id), MultipleEntity(), defEntity(id))
- }
- }
-
- private def isUnorderedDef(id: PIdnDef): Boolean = id match {
- case tree.parent(tree.parent(c)) => enclosingScope(c).isInstanceOf[PUnorderedScope]
- case c => Violation.violation(s"Only the root has no parent, but got $c")
- }
-
/** returns whether or not identified `id` is defined at node `n`. */
def isDefinedAt(id: PIdnNode, n: PNode): Boolean = isDefinedInScope(sequentialDefenv.in(n), serialize(id))
- def tryLookupAt(id: PIdnNode, n: PNode): Option[Entity] = tryLookup(sequentialDefenv.in(n), serialize(id))
+
/**
@@ -298,29 +295,44 @@ trait NameResolution {
attr[PIdnNode, Entity] {
case w@PWildcard() => Wildcard(w, this)
+ // Argument is the id of a dot expression.
case tree.parent.pair(id: PIdnUse, n: PDot) =>
tryDotLookup(n.base, id).map(_._1).getOrElse(UnknownEntity())
+ // Argument is an id definition that depends on some receiver type (e.g. method, mpredicate, field).
+ // These id definitions are not placed in the symbol table since they are not resolved without their receiver.
+ case tree.parent.pair(id: PIdnDef, _: PDependentDef) => defEntity(id)
+
+ // Argument is the name of a method in a method implementation proof.
+ // We define that the argument references the method of the super type.
case tree.parent.pair(id: PIdnUse, tree.parent.pair(_: PMethodImplementationProof, ip: PImplementationProof)) =>
- tryMethodLikeLookup(ip.superT, id).map(_._1).getOrElse(UnknownEntity()) // reference method of the super type
+ tryMethodLikeLookup(ip.superT, id).map(_._1).getOrElse(UnknownEntity()) // lookup method of the super type
+ // Argument is the name of a predicate in a predicate alias declaration of an implementation proof.
+ // We define that the argument references the predicate of the super type.
case tree.parent.pair(id: PIdnUse, tree.parent.pair(alias: PImplementationProofPredicateAlias, ip: PImplementationProof)) if alias.left == id =>
- tryMethodLikeLookup(ip.superT, id).map(_._1).getOrElse(UnknownEntity()) // reference predicate of the super type
-
- case tree.parent.pair(id: PIdnDef, _: PDependentDef) => defEntity(id) // PIdnDef that depend on a receiver or type are not placed in the symbol table
+ tryMethodLikeLookup(ip.superT, id).map(_._1).getOrElse(UnknownEntity()) // lookup predicate of the super type
+ // Argument is the key of a literal value.
case n@ tree.parent.pair(id: PIdnUse, tree.parent.pair(_: PIdentifierKey, tree.parent(lv: PLiteralValue))) =>
- val litType = expectedMiscType(lv)
- if (underlyingType(litType).isInstanceOf[StructT]) { // if the enclosing literal is a struct then id is a field
- findField(litType, id).getOrElse(UnknownEntity())
- } else symbTableLookup(n) // otherwise it is just a variable
+ underlyingType(expectedMiscType(lv)) match {
+ // if the enclosing literal is a struct then id is a field
+ case t: StructT => tryFieldLookup(t, id).map(_._1).getOrElse(UnknownEntity())
+ // if the enclosing literal is an adt clause then id is an adt field
+ case t: AdtClauseT => tryAdtMemberLookup(t, id).map(_._1).getOrElse(UnknownEntity())
+ // otherwise it is just a variable
+ case _ => symbTableLookup(n)
+ }
+ // Argument is the key of a closure spec instance.
case tree.parent.pair(id: PIdnUse, tree.parent.pair(_: PIdentifierKey, tree.parent(spec: PClosureSpecInstance))) =>
lookupFunctionMemberOrLit(spec.func).flatMap(func => lookupParamForClosureSpec(id, func)) match {
case Some(p: InParameter) => p
case _ => UnknownEntity() // only in-parameter names can be used as keys
}
+ // Argument is in an closure implementation proof.
+ // For now, this case should be the last case before the symbol table lookup.
case n: PIdnUse if tryEnclosingClosureImplementationProof(n).nonEmpty =>
val proof = tryEnclosingClosureImplementationProof(n).get
lookupFunctionMemberOrLit(proof.impl.spec.func).flatMap(func => lookupParamForClosureSpec(n, func)) match {
@@ -332,43 +344,6 @@ trait NameResolution {
case n => symbTableLookup(n)
}
- private def lookupParamForClosureSpec(id: PIdnUse, func: ActualDataEntity with WithArguments with WithResult): Option[ActualVariable] = {
- def namedParam(p: PParameter): Option[PNamedParameter] = p match {
- case p: PNamedParameter => Some(p)
- case PExplicitGhostParameter(p: PNamedParameter) => Some(p)
- case _ => None
- }
-
- // Within a spec implementation proof or closure instance, consider all arguments of the spec non-ghost and all results ghost.
- // This is to be as permissive as possible at this point, since all ghostness-related checks are done later on.
- val inParam = func.args.flatMap(namedParam)
- .find(_.id.name == id.name)
- .map(InParameter(_, ghost = false, addressable = false, func.context))
-
- inParam.orElse{
- func.result.outs.flatMap(namedParam)
- .find(_.id.name == id.name)
- .map(OutParameter(_, ghost = true, addressable = false, func.context))
- }
- }
-
- private def lookupFunctionMemberOrLit(name: PNameOrDot): Option[ActualDataEntity with WithArguments with WithResult] = name match {
- case PNamedOperand(id) => symbTableLookup(id) match {
- case f: Function => Some(f)
- case c: Closure => Some(c)
- case _ => None
- }
- case PDot(base: PNamedOperand, id) => symbTableLookup(base.id) match {
- case pkg: Import =>
- tryPackageLookup(RegularImport(pkg.decl.importPath), id, pkg.decl) match {
- case Some((f: Function, _)) => Some(f)
- case _ => None
- }
- case _ => None
- }
- case _ => None
- }
-
private def symbTableLookup(n: PIdnNode): Entity = {
type Level = PIdnNode => Option[Entity]
@@ -414,6 +389,11 @@ trait NameResolution {
levels.iterator.map(_(n)).find(_.isDefined).flatten.getOrElse(UnknownEntity())
}
+ /**
+ * Performs a lookup of `i` in the environment at `n`. Returns the associated entity or `None` if no entity has been found
+ */
+ def tryLookupAt(id: PIdnNode, n: PNode): Option[Entity] = tryLookup(sequentialDefenv.in(n), serialize(id))
+
/**
* Performs a lookup of `i` in environment `inv`. Returns the associated entity or `None` if no entity has been found
*/
@@ -423,4 +403,41 @@ trait NameResolution {
case e => Some(e)
}
}
+
+ private def lookupParamForClosureSpec(id: PIdnUse, func: ActualDataEntity with WithArguments with WithResult): Option[ActualVariable] = {
+ def namedParam(p: PParameter): Option[PNamedParameter] = p match {
+ case p: PNamedParameter => Some(p)
+ case PExplicitGhostParameter(p: PNamedParameter) => Some(p)
+ case _ => None
+ }
+
+ // Within a spec implementation proof or closure instance, consider all arguments of the spec non-ghost and all results ghost.
+ // This is to be as permissive as possible at this point, since all ghostness-related checks are done later on.
+ val inParam = func.args.flatMap(namedParam)
+ .find(_.id.name == id.name)
+ .map(InParameter(_, ghost = false, addressable = false, func.context))
+
+ inParam.orElse {
+ func.result.outs.flatMap(namedParam)
+ .find(_.id.name == id.name)
+ .map(OutParameter(_, ghost = true, addressable = false, func.context))
+ }
+ }
+
+ private def lookupFunctionMemberOrLit(name: PNameOrDot): Option[ActualDataEntity with WithArguments with WithResult] = name match {
+ case PNamedOperand(id) => symbTableLookup(id) match {
+ case f: Function => Some(f)
+ case c: Closure => Some(c)
+ case _ => None
+ }
+ case PDot(base: PNamedOperand, id) => symbTableLookup(base.id) match {
+ case pkg: Import =>
+ tryPackageLookup(RegularImport(pkg.decl.importPath), id, pkg.decl) match {
+ case Some((f: Function, _)) => Some(f)
+ case _ => None
+ }
+ case _ => None
+ }
+ case _ => None
+ }
}
diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ExprTyping.scala b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ExprTyping.scala
index 97f67d697..c3cdc500a 100644
--- a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ExprTyping.scala
+++ b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ExprTyping.scala
@@ -8,7 +8,7 @@ package viper.gobra.frontend.info.implementation.typing
import org.bitbucket.inkytonik.kiama.util.Messaging.{Messages, check, error, noMessages}
import viper.gobra.ast.frontend.{AstPattern => ap, _}
-import viper.gobra.frontend.info.base.SymbolTable.{GlobalVariable, SingleConstant}
+import viper.gobra.frontend.info.base.SymbolTable.{AdtDestructor, AdtDiscriminator, GlobalVariable, SingleConstant}
import viper.gobra.frontend.info.base.Type._
import viper.gobra.frontend.info.implementation.TypeInfoImpl
import viper.gobra.util.TypeBounds.{BoundedIntegerKind, UnboundedInteger}
@@ -67,6 +67,9 @@ trait ExprTyping extends BaseTyping { this: TypeInfoImpl =>
case Some(_: ap.BuiltInType) => noMessages
case Some(_: ap.Predicate) => noMessages
case Some(_: ap.DomainFunction) => noMessages
+ case Some(_: ap.QualifiedAdtType) => noMessages
+ case Some(_: ap.AdtField) => noMessages
+
// TODO: fully supporting packages results in further options: global variable
// built-in members
case Some(p: ap.BuiltInReceivedMethod) => memberType(p.symb) match {
@@ -86,7 +89,7 @@ trait ExprTyping extends BaseTyping { this: TypeInfoImpl =>
case t => error(n, s"expected an AbstractType for built-in mpredicate but got $t")
}
- case _ => error(n, s"expected field selection, method or predicate with a receiver, method expression, predicate expression, an imported member or a built-in member, but got $n")
+ case _ => error(n, s"expected field selection, method or predicate with a receiver, method expression, predicate expression, adt constructor or discriminator or destructor, an imported member or a built-in member, but got $n")
}
}
@@ -141,6 +144,15 @@ trait ExprTyping extends BaseTyping { this: TypeInfoImpl =>
case Some(p: ap.Predicate) => FunctionT(p.symb.args map p.symb.context.typ, AssertionT)
case Some(p: ap.DomainFunction) => FunctionT(p.symb.args map p.symb.context.typ, p.symb.context.typ(p.symb.result))
+ case Some(p: ap.QualifiedAdtType) =>
+ val fields = p.symb.fields.map(f => f.id.name -> p.symb.context.symbType(f.typ)).toMap
+ AdtClauseT(fields, p.symb.decl, p.symb.adtDecl, this)
+ case Some(p: ap.AdtField) =>
+ p.symb match {
+ case AdtDestructor(decl, _, context) => context.symbType(decl.typ)
+ case AdtDiscriminator(_, _, _) => BooleanT
+ }
+
// TODO: fully supporting packages results in further options: global variable
// built-in members
diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/typing/IdTyping.scala b/src/main/scala/viper/gobra/frontend/info/implementation/typing/IdTyping.scala
index ce5a456b9..0f1b234fd 100644
--- a/src/main/scala/viper/gobra/frontend/info/implementation/typing/IdTyping.scala
+++ b/src/main/scala/viper/gobra/frontend/info/implementation/typing/IdTyping.scala
@@ -154,6 +154,12 @@ trait IdTyping extends BaseTyping { this: TypeInfoImpl =>
case NamedType(decl, _, context) => DeclaredT(decl, context)
case TypeAlias(decl, _, context) => context.symbType(decl.right)
case Import(decl, _) => ImportT(decl)
+
+ // ADT clause is special since it is a type with a name that is not a named type
+ case a: AdtClause =>
+ val types = a.fields.map(f => f.id.name -> a.context.symbType(f.typ)).toMap
+ AdtClauseT(types, a.decl, a.adtDecl, this)
+
case BuiltInType(tag, _, _) => tag.typ
case _ => violation(s"expected type, but got $id")
}
diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/typing/TypeTyping.scala b/src/main/scala/viper/gobra/frontend/info/implementation/typing/TypeTyping.scala
index 3e3f49d84..5e3830aa8 100644
--- a/src/main/scala/viper/gobra/frontend/info/implementation/typing/TypeTyping.scala
+++ b/src/main/scala/viper/gobra/frontend/info/implementation/typing/TypeTyping.scala
@@ -152,6 +152,12 @@ trait TypeTyping extends BaseTyping { this: TypeInfoImpl =>
case n: PDot =>
resolve(n) match {
case Some(p: ap.NamedType) => DeclaredT(p.symb.decl, p.symb.context)
+
+ // ADT clause is special since it is a type with a name that is not a named type
+ case Some(p: ap.QualifiedAdtType) =>
+ val types = p.symb.fields.map(f => f.id.name -> p.symb.context.symbType(f.typ)).toMap
+ AdtClauseT(types, p.symb.decl, p.symb.adtDecl, p.symb.context)
+
case _ => violation(s"expected type, but got $n")
}
}
diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/GhostExprTyping.scala b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/GhostExprTyping.scala
index b14cfa2b0..0054d003b 100644
--- a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/GhostExprTyping.scala
+++ b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/GhostExprTyping.scala
@@ -8,7 +8,7 @@ package viper.gobra.frontend.info.implementation.typing.ghost
import org.bitbucket.inkytonik.kiama.util.Messaging.{Messages, error, noMessages}
import viper.gobra.ast.frontend._
-import viper.gobra.frontend.info.base.SymbolTable.{BuiltInFPredicate, BuiltInFunction, BuiltInMPredicate, BuiltInMethod, Closure, Constant, DomainFunction, Embbed, Field, Function, Label, Method, Predicate, Variable, WandLhsLabel}
+import viper.gobra.frontend.info.base.SymbolTable.{AdtMember, BuiltInFPredicate, BuiltInFunction, BuiltInMPredicate, BuiltInMethod, Closure, Constant, DomainFunction, Embbed, Field, Function, Label, Method, Predicate, Variable, WandLhsLabel}
import viper.gobra.frontend.info.base.Type.{ArrayT, AssertionT, BooleanT, GhostCollectionType, GhostUnorderedCollectionType, IntT, MultisetT, OptionT, PermissionT, SequenceT, SetT, Single, SortT, Type}
import viper.gobra.ast.frontend.{AstPattern => ap}
import viper.gobra.frontend.info.base.Type
@@ -122,10 +122,23 @@ trait GhostExprTyping extends BaseTyping { this: TypeInfoImpl =>
error(e, s"expected an option type, but got $t", !t.isInstanceOf[OptionT])
}
+ case m@PMatchExp(exp, clauses) =>
+ val types: Vector[Type] = clauses map { c => exprType(c.exp) }
+ val sameTypeE = error(exp, s"All clauses has to be of the same type but got $types", !types.foldLeft(true)({ case (acc, next) => acc && assignableTo(next, types.head) }))
+ val patternE = m.caseClauses.flatMap(c => c.pattern match {
+ case PMatchAdt(clause, _) => assignableTo.errors(symbType(clause), exprType(exp))(c)
+ case _ => comparableTypes.errors((miscType(c.pattern), exprType(exp)))(c)
+ })
+ val pureExpE = error(exp, "Expression has to be pure", !isPure(exp)(strong = false))
+ val pureClauses = clauses flatMap { c => error(c.exp, "Expressions of cases have to be pure", !isPure(c.exp)(strong = false)) }
+ val moreThanOneDfltE = error(m, "Match Expression can only have one default case", m.defaultClauses.length > 1)
+ sameTypeE ++ patternE ++ error(clauses, "Cases cannot be empty", clauses.isEmpty) ++ pureExpE ++ moreThanOneDfltE ++ pureClauses
+
case expr : PGhostCollectionExp => expr match {
case PIn(left, right) => isExpr(left).out ++ isExpr(right).out ++ {
underlyingType(exprType(right)) match {
case t : GhostCollectionType => ghostComparableTypes.errors(exprType(left), t.elem)(expr)
+ case _ : AdtT => noMessages
case t => error(right, s"expected a ghost collection, but got $t")
}
}
@@ -137,7 +150,7 @@ trait GhostExprTyping extends BaseTyping { this: TypeInfoImpl =>
}
}
- case PGhostCollectionUpdate(seq, clauses) => isExpr(seq).out ++ (exprType(seq) match {
+ case PGhostCollectionUpdate(seq, clauses) => isExpr(seq).out ++ (underlyingType(exprType(seq)) match {
case SequenceT(t) => clauses.flatMap(wellDefSeqUpdClause(t, _))
case MathMapT(k, v) => clauses.flatMap(wellDefMapUpdClause(k, v, _))
case t => error(seq, s"expected a sequence or mathematical map, but got $t")
@@ -241,6 +254,8 @@ trait GhostExprTyping extends BaseTyping { this: TypeInfoImpl =>
case t => violation(s"expected an option type, but got $t")
}
+ case m: PMatchExp => if (m.clauses.isEmpty) exprType(m.defaultClauses.head.exp) else exprType(m.caseClauses.head.exp)
+
case expr : PGhostCollectionExp => expr match {
// The result of integer ghost expressions is unbounded (UntypedConst)
case PMultiplicity(_, _) => IntT(config.typeBounds.UntypedConst)
@@ -443,6 +458,8 @@ trait GhostExprTyping extends BaseTyping { this: TypeInfoImpl =>
case POptionSome(e) => go(e)
case POptionGet(e) => go(e)
+ case PMatchExp(e, clauses) => go(e) && clauses.forall(c => go(c.exp))
+
case PSliceExp(base, low, high, cap) =>
go(base) && Seq(low, high, cap).flatten.forall(go)
@@ -481,6 +498,7 @@ trait GhostExprTyping extends BaseTyping { this: TypeInfoImpl =>
case m: BuiltInMethod => m.isPure
case _: Predicate | _: BuiltInFPredicate | _: BuiltInMPredicate => !strong
case _: DomainFunction => true
+ case _: AdtMember => true
case _ => false
}
}
diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/GhostIdTyping.scala b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/GhostIdTyping.scala
index d801e9c0f..5e2d996ac 100644
--- a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/GhostIdTyping.scala
+++ b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/GhostIdTyping.scala
@@ -7,9 +7,9 @@
package viper.gobra.frontend.info.implementation.typing.ghost
import org.bitbucket.inkytonik.kiama.util.Messaging.noMessages
-import viper.gobra.ast.frontend.PIdnNode
-import viper.gobra.frontend.info.base.SymbolTable.{BoundVariable, BuiltInFPredicate, BuiltInMPredicate, DomainFunction, GhostRegular, Predicate}
-import viper.gobra.frontend.info.base.Type.{AssertionT, FunctionT, Type}
+import viper.gobra.ast.frontend.{PExpression, PFieldDecl, PIdnNode, PMatchAdt}
+import viper.gobra.frontend.info.base.SymbolTable.{AdtClause, AdtDestructor, AdtDiscriminator, BoundVariable, BuiltInFPredicate, BuiltInMPredicate, DomainFunction, GhostRegular, MatchVariable, Predicate}
+import viper.gobra.frontend.info.base.Type.{AdtClauseT, AssertionT, FunctionT, Type}
import viper.gobra.frontend.info.implementation.TypeInfoImpl
import viper.gobra.util.Violation.violation
@@ -25,6 +25,12 @@ trait GhostIdTyping { this: TypeInfoImpl =>
case f: DomainFunction => unsafeMessage(! {
f.result.outs.size == 1 && f.args.forall(wellDefMisc.valid) && wellDefMisc.valid(f.result)
})
+ case c: AdtClause => unsafeMessage(! {
+ c.decl.args.forall(decls => decls.fields.forall { case PFieldDecl(_, typ) => wellDefAndType.valid(typ) })
+ })
+ case c: AdtDestructor => wellDefAndType(c.decl.typ)
+ case _: AdtDiscriminator => LocalMessages(noMessages)
+ case _: MatchVariable => LocalMessages(noMessages)
case _: BuiltInFPredicate | _: BuiltInMPredicate => LocalMessages(noMessages)
}
@@ -33,8 +39,28 @@ trait GhostIdTyping { this: TypeInfoImpl =>
case x: BoundVariable => typeSymbType(x.decl.typ)
case predicate: Predicate => FunctionT(predicate.args map predicate.context.typ, AssertionT)
case func: DomainFunction => FunctionT(func.args map func.context.typ, func.context.typ(func.result.outs.head))
+
+ case AdtClause(decl, adtDecl, context) =>
+ AdtClauseT(
+ decl.args.flatMap(_.fields).map(f => f.id.name -> context.symbType(f.typ)).toMap,
+ decl,
+ adtDecl,
+ context
+ )
+
+ case MatchVariable(decl, p, context) => p match {
+ case PMatchAdt(clause, fields) =>
+ val argTypeWithIndex = context.symbType(clause).asInstanceOf[AdtClauseT].decl.args.flatMap(_.fields).map(_.typ).zipWithIndex
+ val fieldsWithIndex = fields.zipWithIndex
+ val fieldIndex = fieldsWithIndex.iterator.find(e => e._1 == decl).get._2
+ context.symbType(argTypeWithIndex.iterator.find(e => e._2 == fieldIndex).get._1)
+
+ case e: PExpression => context.typ(e)
+ case _ => violation("untypeable")
+ }
+
case BuiltInFPredicate(tag, _, _) => typ(tag)
case BuiltInMPredicate(tag, _, _) => typ(tag)
- case _ => violation("untypable")
+ case _ => violation("untypeable")
}
}
diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/GhostMiscTyping.scala b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/GhostMiscTyping.scala
index 31c81c8b3..405163e20 100644
--- a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/GhostMiscTyping.scala
+++ b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/GhostMiscTyping.scala
@@ -10,7 +10,7 @@ import org.bitbucket.inkytonik.kiama.util.Messaging.{Messages, error, message, n
import viper.gobra.ast.frontend._
import viper.gobra.frontend.info.base.SymbolTable
import viper.gobra.frontend.info.base.SymbolTable.{BuiltInMPredicate, GhostTypeMember, MPredicateImpl, MPredicateSpec, MethodSpec}
-import viper.gobra.frontend.info.base.Type.{AssertionT, BooleanT, FunctionT, PredT, Type, UnknownType}
+import viper.gobra.frontend.info.base.Type.{AdtClauseT, AssertionT, BooleanT, FunctionT, PredT, Type, UnknownType}
import viper.gobra.frontend.info.implementation.TypeInfoImpl
import viper.gobra.frontend.info.implementation.typing.BaseTyping
import viper.gobra.ast.frontend.{AstPattern => ap}
@@ -49,6 +49,24 @@ trait GhostMiscTyping extends BaseTyping { this: TypeInfoImpl =>
error(f, s"Uninterpreted functions must have exactly one return argument", f.result.outs.size != 1) ++
nonVariadicArguments(f.args)
+ case _: PAdtClause => noMessages
+
+ case m: PMatchPattern => m match {
+ case PMatchAdt(clause, fields) => symbType(clause) match {
+ case t: AdtClauseT =>
+ val fieldTypes = fields map typ
+ val clauseFieldTypes = t.decl.args.flatMap(f => f.fields).map(f => symbType(f.typ))
+ fieldTypes.zip(clauseFieldTypes).flatMap(a => assignableTo.errors(a)(m))
+ case _ => violation("Pattern matching only works on ADT Literals")
+ }
+ case PMatchValue(lit) => isPureExpr(lit)
+ case _ => noMessages
+ }
+
+ case _: PMatchStmtCase => noMessages
+ case _: PMatchExpCase => noMessages
+ case _: PMatchExpDefault => noMessages
+
case n: PImplementationProofPredicateAlias =>
n match {
case tree.parent(ip: PImplementationProof) =>
@@ -168,6 +186,18 @@ trait GhostMiscTyping extends BaseTyping { this: TypeInfoImpl =>
case PFPredBase(id) => idType(id)
}
case _: PDomainAxiom | _: PDomainFunction => UnknownType
+
+ case _: PAdtClause => UnknownType
+ case exp: PMatchPattern => exp match {
+ case PMatchBindVar(idn) => idType(idn)
+ case PMatchAdt(clause, _) => symbType(clause)
+ case PMatchValue(lit) => typ(lit)
+ case w: PMatchWildcard => wildcardMatchType(w)
+ }
+ case _: PMatchStmtCase => UnknownType
+ case _: PMatchExpCase => UnknownType
+ case _: PMatchExpDefault => UnknownType
+
case _: PMethodImplementationProof => UnknownType
case _: PImplementationProofPredicateAlias => UnknownType
}
@@ -176,6 +206,8 @@ trait GhostMiscTyping extends BaseTyping { this: TypeInfoImpl =>
case MPredicateImpl(decl, ctx) => FunctionT(decl.args map ctx.typ, AssertionT)
case MPredicateSpec(decl, _, ctx) => FunctionT(decl.args map ctx.typ, AssertionT)
case _: SymbolTable.GhostStructMember => ???
+ case SymbolTable.AdtDestructor(decl, _, ctx) => ctx.symbType(decl.typ)
+ case _: SymbolTable.AdtDiscriminator => BooleanT
case BuiltInMPredicate(tag, _, _) => typ(tag)
}
@@ -249,4 +281,36 @@ trait GhostMiscTyping extends BaseTyping { this: TypeInfoImpl =>
case _ => noMessages
}
}
+
+ /** Returns the type matched by the wildcard `w`. */
+ private def wildcardMatchType(w: PMatchWildcard): Type = {
+ w match {
+ case tree.parent(p) => p match {
+ case PMatchAdt(c, fields) =>
+ val index = fields indexWhere { w eq _ }
+ val adtClauseT = underlyingType(typeSymbType(c)).asInstanceOf[AdtClauseT]
+ val field = adtClauseT.decl.args.flatMap(f => f.fields)(index)
+ typeSymbType(field.typ)
+
+ case p: PMatchExpCase => p match {
+ case tree.parent(pa) => pa match {
+ case PMatchExp(e, _) => exprType(e)
+ case _ => ???
+ }
+ case _ => ???
+ }
+
+ case p: PMatchStmtCase => p match {
+ case tree.parent(pa) => pa match {
+ case PMatchStatement(e, _, _) => exprType(e)
+ case _ => ???
+ }
+ case _ => ???
+ }
+ case _ => ???
+ }
+
+ case _ => ???
+ }
+ }
}
diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/GhostStmtTyping.scala b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/GhostStmtTyping.scala
index 013dcda8e..cceeb8f22 100644
--- a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/GhostStmtTyping.scala
+++ b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/GhostStmtTyping.scala
@@ -28,6 +28,10 @@ trait GhostStmtTyping extends BaseTyping { this: TypeInfoImpl =>
case n@PPackageWand(wand, optBlock) => assignableToSpec(wand) ++
error(n, "ghost error: expected ghostifiable statement", !optBlock.forall(_.isInstanceOf[PGhostifiableStatement]))
case PApplyWand(wand) => assignableToSpec(wand)
+ case PMatchStatement(exp, clauses, _) => clauses.flatMap(c => c.pattern match {
+ case PMatchAdt(clause, _) => assignableTo.errors(symbType(clause), exprType(exp))(c)
+ case _ => comparableTypes.errors((miscType(c.pattern), exprType(exp)))(c)
+ }) ++ isPureExpr(exp)
case p: PClosureImplProof => wellDefClosureImplProof(p)
}
diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/GhostTypeTyping.scala b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/GhostTypeTyping.scala
index cef39df87..1c09b2279 100644
--- a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/GhostTypeTyping.scala
+++ b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/GhostTypeTyping.scala
@@ -23,6 +23,7 @@ trait GhostTypeTyping extends BaseTyping { this : TypeInfoImpl =>
case n: PGhostSliceType => isType(n.elem).out
case _: PDomainType => noMessages
+ case _: PAdtType => noMessages
}
private[typing] def ghostTypeSymbType(typ : PGhostType) : Type = typ match {
@@ -33,5 +34,6 @@ trait GhostTypeTyping extends BaseTyping { this : TypeInfoImpl =>
case POptionType(elem) => OptionT(typeSymbType(elem))
case PGhostSliceType(elem) => GhostSliceT(typeSymbType(elem))
case t: PDomainType => DomainT(t, this)
+ case a: PAdtType => AdtT(a, this)
}
}
diff --git a/src/main/scala/viper/gobra/reporting/VerifierError.scala b/src/main/scala/viper/gobra/reporting/VerifierError.scala
index 87bc18724..858c2f2ae 100644
--- a/src/main/scala/viper/gobra/reporting/VerifierError.scala
+++ b/src/main/scala/viper/gobra/reporting/VerifierError.scala
@@ -279,6 +279,11 @@ case class ChannelMakePreconditionError(info: Source.Verifier.Info) extends Veri
override def localMessage: String = s"The provided length to ${info.origin.tag.trim} might be negative"
}
+case class MatchError(info: Source.Verifier.Info) extends VerificationError {
+ override def localId: String = "match_error"
+ override def localMessage: String = s"The patterns might not match the expression"
+}
+
case class RangeVariableMightNotExistError(info: Source.Verifier.Info)(rangeExpr: String) extends VerificationError {
override def localId: String = "range_variable_might_not_exist"
override def localMessage: String = s"Length of range expression '$rangeExpr' might be 0"
diff --git a/src/main/scala/viper/gobra/translator/Names.scala b/src/main/scala/viper/gobra/translator/Names.scala
index b253ebb3d..7d5b83cfc 100644
--- a/src/main/scala/viper/gobra/translator/Names.scala
+++ b/src/main/scala/viper/gobra/translator/Names.scala
@@ -166,6 +166,12 @@ object Names {
// domain
def dfltDomainValue(domainName: String): String = s"dflt$domainName"
+ // adt
+ def dfltAdtValue(adtName: String): String = s"adtDflt_$adtName"
+ def tagAdtFunction(adtName: String): String = s"adtTag_$adtName"
+ def destructorAdtName(adtName: String, argumentName: String) = s"get_${adtName}_$argumentName"
+ def constructorAdtName(adtName: String, clause: String) = s"${adtName}_$clause"
+
// unknown values
def unknownValuesDomain: String = "UnknownValueDomain"
def unknownValueFunc: String = "unknownValue"
diff --git a/src/main/scala/viper/gobra/translator/encodings/adts/AdtEncoding.scala b/src/main/scala/viper/gobra/translator/encodings/adts/AdtEncoding.scala
new file mode 100644
index 000000000..1c94c628c
--- /dev/null
+++ b/src/main/scala/viper/gobra/translator/encodings/adts/AdtEncoding.scala
@@ -0,0 +1,469 @@
+// This Source Code Form is subject to the terms of the Mozilla Public
+// License, v. 2.0. If a copy of the MPL was not distributed with this
+// file, You can obtain one at http://mozilla.org/MPL/2.0/.
+//
+// Copyright (c) 2011-2022 ETH Zurich.
+
+package viper.gobra.translator.encodings.adts
+
+import org.bitbucket.inkytonik.kiama.==>
+import viper.gobra.ast.{internal => in}
+import viper.gobra.reporting.BackTranslator.{ErrorTransformer, RichErrorMessage}
+import viper.gobra.reporting.{MatchError, Source}
+import viper.gobra.theory.Addressability.{Exclusive, Shared}
+import viper.gobra.translator.Names
+import viper.gobra.translator.context.Context
+import viper.gobra.translator.encodings.combinators.LeafTypeEncoding
+import viper.gobra.translator.util.ViperWriter.{CodeWriter, MemberWriter}
+import viper.silver.{ast => vpr}
+
+class AdtEncoding extends LeafTypeEncoding {
+
+ import viper.gobra.translator.util.TypePatterns._
+ import viper.gobra.translator.util.ViperWriter.CodeLevel._
+ import viper.gobra.translator.util.ViperWriter.{MemberLevel => ml}
+ import viper.silver.verifier.{errors => err}
+
+ override def typ(ctx: Context): in.Type ==> vpr.Type = {
+ case ctx.Adt(adt) / m =>
+ m match {
+ case Exclusive => adtType(adt.name)
+ case Shared => vpr.Ref
+ }
+ case ctx.AdtClause(t) / m =>
+ m match {
+ case Exclusive => adtType(t.adtT.name)
+ case Shared => vpr.Ref
+ }
+ }
+
+ private def adtType(adtName: String): vpr.DomainType = vpr.DomainType(adtName, Map.empty)(Seq.empty)
+
+ override def member(ctx: Context): in.Member ==> MemberWriter[Vector[vpr.Member]] = {
+ case adt: in.AdtDefinition =>
+ val adtName = adt.name
+ val (aPos, aInfo, aErrT) = adt.vprMeta
+
+ def localVarTDecl = vpr.LocalVarDecl("t", adtType(adtName))(_, _, _)
+
+ def localVarT = vpr.LocalVar("t", adtType(adtName))(_, _, _)
+
+ def tagF = getTag(adt.clauses)(_)
+
+ def destructorsClause(clause: in.AdtClause): Vector[vpr.DomainFunc] =
+ clause.args.map(a => {
+ val (argPos, argInfo, argErrT) = a.vprMeta
+ vpr.DomainFunc(
+ Names.destructorAdtName(adtName, a.name),
+ Seq(localVarTDecl(argPos, argInfo, argErrT)),
+ ctx.typ(a.typ)
+ )(argPos, argInfo, adtName, argErrT)
+ })
+
+
+ def clauseArgsAsLocalVarExp(c: in.AdtClause): Vector[vpr.LocalVar] = {
+ val (cPos, cInfo, cErrT) = c.vprMeta
+ c.args map { a =>
+ val typ = ctx.typ(a.typ)
+ val name = a.name
+ vpr.LocalVar(name, typ)(cPos, cInfo, cErrT)
+ }
+ }
+
+ def tagApp(arg: vpr.Exp) = {
+ vpr.DomainFuncApp(
+ Names.tagAdtFunction(adtName),
+ Seq(arg),
+ Map.empty
+ )(_, _, vpr.Int, adtName, _)
+ }
+
+ def deconstructorCall(field: String, arg: vpr.Exp, retTyp: vpr.Type) = {
+ vpr.DomainFuncApp(
+ Names.destructorAdtName(adtName, field),
+ Seq(arg),
+ Map.empty
+ )(_, _, retTyp, adtName, _)
+ }
+
+ val clauses = adt.clauses map { c =>
+ val (cPos, cInfo, cErrT) = c.vprMeta
+ val args = clauseArgsAsLocalVarDecl(c)(ctx)
+ vpr.DomainFunc(Names.constructorAdtName(adtName, c.name.name), args, adtType(adtName))(cPos, cInfo, adtName, cErrT)
+ }
+
+ val defaultFunc = vpr.DomainFunc(
+ Names.dfltAdtValue(adtName),
+ Seq.empty,
+ adtType(adtName)
+ )(aPos, aInfo, adtName, aErrT)
+
+ val tagFunc = vpr.DomainFunc(
+ Names.tagAdtFunction(adtName),
+ Seq(localVarTDecl(aPos, aInfo, aErrT)),
+ vpr.Int
+ )(aPos, aInfo, adtName, aErrT)
+
+ val destructors: Vector[vpr.DomainFunc] = adt.clauses.flatMap(destructorsClause)
+
+ val tagAxioms: Vector[vpr.AnonymousDomainAxiom] = adt.clauses.map(c => {
+ val (cPos, cInfo, cErrT) = c.vprMeta
+ val args: Seq[vpr.Exp] = clauseArgsAsLocalVarExp(c)
+ val triggerVars: Seq[vpr.LocalVarDecl] = clauseArgsAsLocalVarDecl(c)(ctx)
+ val construct = constructorCall(c, args)(cPos, cInfo, cErrT)
+ val trigger = vpr.Trigger(Seq(construct))(cPos, cInfo, cErrT)
+ val lhs: vpr.Exp = tagApp(construct)(cPos, cInfo, cErrT)
+ val clauseTag = vpr.IntLit(tagF(c))(cPos, cInfo, cErrT)
+
+ val destructors = c.args.map(a =>
+ deconstructorCall(a.name, construct, ctx.typ(a.typ))(cPos, cInfo, cErrT)
+ )
+
+ if (c.args.nonEmpty) {
+ val destructOverConstruct: vpr.Exp = (destructors.zip(args).map {
+ case (d, a) => vpr.EqCmp(
+ d, a
+ )(cPos, cInfo, cErrT): vpr.Exp
+ }: Seq[vpr.Exp]).reduceLeft {
+ (l: vpr.Exp, r: vpr.Exp) => vpr.And(l, r)(cPos, cInfo, cErrT): vpr.Exp
+ }
+
+ vpr.AnonymousDomainAxiom(vpr.Forall(triggerVars, Seq(trigger), vpr.And(
+ vpr.EqCmp(lhs, clauseTag)(cPos, cInfo, cErrT),
+ destructOverConstruct
+ )(cPos, cInfo, cErrT)
+ )(cPos, cInfo, cErrT))(cPos, cInfo, adtName, cErrT)
+ } else {
+ vpr.AnonymousDomainAxiom(vpr.EqCmp(lhs, clauseTag)(cPos, cInfo, cErrT))(cPos, cInfo, adtName, cErrT)
+ }
+ })
+
+ val destructorAxioms: Vector[vpr.AnonymousDomainAxiom] = adt.clauses.filter(c => c.args.nonEmpty).map(c => {
+ val (cPos, cInfo, cErrT) = c.vprMeta
+ val variable = localVarTDecl(cPos, cInfo, cErrT)
+ val localVar = localVarT(cPos, cInfo, cErrT)
+
+ val destructors = c.args.map(a =>
+ deconstructorCall(a.name, localVar, ctx.typ(a.typ))(cPos, cInfo, cErrT)
+ )
+
+ val trigger = destructors.map(d => vpr.Trigger(Seq(d))(cPos, cInfo, cErrT))
+ val clauseTag = vpr.IntLit(tagF(c))(cPos, cInfo, cErrT)
+ val triggerTagApp = tagApp(localVar)(cPos, cInfo, cErrT)
+ val implicationLhs = vpr.EqCmp(triggerTagApp, clauseTag)(aPos, aInfo, aErrT)
+ val implicationRhs = vpr.EqCmp(
+ localVar,
+ constructorCall(c, destructors)(cPos, cInfo, cErrT)
+ )(cPos, cInfo, cErrT)
+
+ val implication = vpr.Implies(implicationLhs, implicationRhs)(cPos, cInfo, cErrT)
+
+ vpr.AnonymousDomainAxiom(vpr.Forall(Seq(variable), trigger, implication)(cPos, cInfo, cErrT))(cPos,
+ cInfo, adtName, cErrT)
+ })
+
+ val exclusiveAxiom = {
+ val variableDecl = localVarTDecl(aPos, aInfo, aErrT)
+ val variable = localVarT(aPos, aInfo, aErrT)
+ val triggerExpression = tagApp(variable)(aPos, aInfo, aErrT)
+ val trigger = vpr.Trigger(Seq(triggerExpression))(aPos, aInfo, aErrT)
+
+ def destructors(clause: in.AdtClause) = clause.args map (a => {
+ val (argPos, argInfo, argErrT) = a.vprMeta
+ deconstructorCall(a.name, variable, ctx.typ(a.typ))(argPos, argInfo, argErrT)
+ })
+
+ val equalities = adt.clauses.map(c => {
+ val (cPos, cInfo, cErrT) = c.vprMeta
+ constructorCall(c, destructors(c))(cPos, cInfo, cErrT)
+ })
+ .map(c => {
+ vpr.EqCmp(variable, c)(c.pos, c.info, c.errT)
+ })
+ .foldLeft(vpr.FalseLit()(aPos, aInfo, aErrT): vpr.Exp)({ (acc, next) => vpr.Or(acc, next)(aPos, aInfo, aErrT): vpr.Exp })
+
+ vpr.AnonymousDomainAxiom(
+ vpr.Forall(Seq(variableDecl), Seq(trigger), equalities)(aPos, aInfo, aErrT)
+ )(aPos, aInfo, adtName, aErrT)
+ }
+
+ val axioms = (tagAxioms ++ destructorAxioms) :+ exclusiveAxiom
+ val funcs = (clauses ++ destructors) :+ defaultFunc :+ tagFunc
+
+ ml.unit(Vector(vpr.Domain(adtName, functions = funcs, axioms = axioms)(pos = aPos, info = aInfo, errT = aErrT)))
+ }
+
+ override def expression(ctx: Context): in.Expr ==> CodeWriter[vpr.Exp] = {
+
+ def defaultVal(e: in.DfltVal, a: in.AdtT) = {
+ val (pos, info, errT) = e.vprMeta
+ unit(
+ vpr.DomainFuncApp(
+ funcname = Names.dfltAdtValue(a.name),
+ Seq.empty,
+ Map.empty
+ )(pos, info, adtType(a.name), a.name, errT): vpr.Exp
+ )
+ }
+
+ default(super.expression(ctx)) {
+ case (e: in.DfltVal) :: ctx.Adt(a) / Exclusive => defaultVal(e, a)
+ case (e: in.DfltVal) :: ctx.AdtClause(a) / Exclusive => defaultVal(e, a.adtT)
+ case ac: in.AdtConstructorLit => adtConstructor(ac, ctx)
+ case ad: in.AdtDiscriminator => adtDiscriminator(ad, ctx)
+ case ad: in.AdtDestructor => adtDestructor(ad, ctx)
+ case p: in.PatternMatchExp => translatePatternMatchExp(ctx)(p)
+ // case c@in.Contains(_, _ :: ctx.Adt(_)) => translateContains(c)(ctx)
+ }
+ }
+
+ override def statement(ctx: Context): in.Stmt ==> CodeWriter[vpr.Stmt] = {
+ default(super.statement(ctx)) {
+ case p: in.PatternMatchStmt => translatePatternMatch(ctx)(p)
+ }
+ }
+
+ private def adtConstructor(ac: in.AdtConstructorLit, ctx: Context): Writer[vpr.Exp] = {
+ def goE(x: in.Expr): CodeWriter[vpr.Exp] = ctx.expression(x)
+
+ val (pos, info, errT) = ac.vprMeta
+ for {
+ args <- sequence(ac.args map goE)
+ } yield vpr.DomainFuncApp(
+ funcname = Names.constructorAdtName(ac.clause.adtName, ac.clause.name),
+ args,
+ Map.empty
+ )(pos, info, adtType(ac.clause.adtName), ac.clause.adtName, errT)
+ }
+
+ private def adtDiscriminator(ac: in.AdtDiscriminator, ctx: Context): Writer[vpr.Exp] = {
+ def goE(x: in.Expr): CodeWriter[vpr.Exp] = ctx.expression(x)
+
+ val adtType = underlyingType(ac.base.typ)(ctx).asInstanceOf[in.AdtT]
+ val (pos, info, errT) = ac.vprMeta
+ for {
+ value <- goE(ac.base)
+ } yield vpr.EqCmp(vpr.DomainFuncApp(
+ Names.tagAdtFunction(adtType.name),
+ Seq(value), Map.empty)(pos, info, vpr.Int, adtType.name, errT),
+ vpr.IntLit(adtType.clauseToTag(ac.clause.name))(pos, info, errT)
+ )(pos, info, errT)
+ }
+
+ private def adtDestructor(ac: in.AdtDestructor, ctx: Context): Writer[vpr.Exp] = {
+ def goE(x: in.Expr): CodeWriter[vpr.Exp] = ctx.expression(x)
+
+ val adtType = underlyingType(ac.base.typ)(ctx).asInstanceOf[in.AdtT]
+ val (pos, info, errT) = ac.vprMeta
+ for {
+ value <- goE(ac.base)
+ } yield vpr.DomainFuncApp(
+ Names.destructorAdtName(adtType.name, ac.field.name),
+ Seq(value), Map.empty)(pos, info, ctx.typ(ac.field.typ), adtType.name, errT)
+ }
+
+
+ private def getTag(clauses: Vector[in.AdtClause])(clause: in.AdtClause): BigInt = {
+ val sorted = clauses.sortBy(_.name.name)
+ BigInt(sorted.indexOf(clause))
+ }
+
+ private def constructorCall(clause: in.AdtClause, args: Seq[vpr.Exp])(pos: vpr.Position = vpr.NoPosition, info: vpr.Info = vpr.NoInfo, errT: vpr.ErrorTrafo = vpr.NoTrafos): vpr.DomainFuncApp = {
+ val adtName = clause.name.adtName
+ vpr.DomainFuncApp(
+ Names.constructorAdtName(adtName, clause.name.name),
+ args,
+ Map.empty
+ )(pos, info, adtType(adtName), adtName, errT)
+ }
+
+ private def clauseArgsAsLocalVarDecl(c: in.AdtClause)(ctx: Context): Vector[vpr.LocalVarDecl] = {
+ val (cPos, cInfo, cErrT) = c.vprMeta
+ c.args map { a =>
+ val typ = ctx.typ(a.typ)
+ val name = a.name
+ vpr.LocalVarDecl(name, typ)(cPos, cInfo, cErrT)
+ }
+ }
+
+ def declareIn(ctx: Context)(e: in.Expr, p: in.MatchPattern, z: vpr.Exp): CodeWriter[vpr.Exp] = {
+ val (pos, info, errT) = p.vprMeta
+
+ p match {
+ case in.MatchValue(_) | in.MatchWildcard() => unit(z)
+ case in.MatchBindVar(name, typ) =>
+ for {
+ eV <- ctx.expression(e)
+ } yield vpr.Let(
+ vpr.LocalVarDecl(name, ctx.typ(typ))(pos, info, errT),
+ eV,
+ z
+ )(pos, info, errT)
+ case in.MatchAdt(clause, expr) =>
+ val inDeconstructors = clause.fields.map(f => in.AdtDestructor(e, f)(e.info))
+ val zipWithPattern = inDeconstructors.zip(expr)
+ zipWithPattern.foldRight(unit(z))((des, acc) => for {
+ v <- acc
+ d <- declareIn(ctx)(des._1, des._2, v)
+ } yield d)
+ }
+ }
+
+ def translatePatternMatchExp(ctx: Context)(e: in.PatternMatchExp): CodeWriter[vpr.Exp] = {
+
+ def translateCases(cases: Vector[in.PatternMatchCaseExp], dflt: in.Expr): CodeWriter[vpr.Exp] = {
+
+ val (ePos, eInfo, eErrT) = if (cases.isEmpty) dflt.vprMeta else cases.head.vprMeta
+
+ if (cases.isEmpty) {
+ ctx.expression(dflt)
+ } else {
+ val c = cases.head
+ for {
+ check <- translateMatchPatternCheck(ctx)(e.exp, c.mExp)
+ body <- ctx.expression(c.exp)
+ decl <- declareIn(ctx)(e.exp, c.mExp, body)
+ el <- translateCases(cases.tail, dflt)
+ } yield vpr.CondExp(check, decl, el)(ePos, eInfo, eErrT)
+ }
+ }
+
+ if (e.default.isDefined) {
+ translateCases(e.cases, e.default.get)
+ } else {
+
+ val (pos, info, errT) = e.vprMeta
+
+ val allChecks = e.cases
+ .map(c => translateMatchPatternCheck(ctx)(e.exp, c.mExp))
+ .foldLeft(unit(vpr.FalseLit()() : vpr.Exp))((acc, next) =>
+ for {
+ a <- acc
+ n <- next
+ } yield vpr.Or(a,n)(pos, info, errT))
+
+
+ for {
+ dummy <- ctx.expression(in.DfltVal(e.typ)(e.info))
+ cond <- translateCases(e.cases, in.DfltVal(e.typ)(e.info))
+ checks <- allChecks
+ (checkFunc, errCheck) = ctx.condition.assert(checks, (info, _) => MatchError(info))
+ _ <- errorT(errCheck)
+ } yield vpr.CondExp(checkFunc, cond, dummy)(pos, info, errT)
+ }
+
+
+ }
+
+ def translateMatchPatternCheck(ctx: Context)(expr: in.Expr, pattern: in.MatchPattern): CodeWriter[vpr.Exp] = {
+ def goE(x: in.Expr): CodeWriter[vpr.Exp] = ctx.expression(x)
+ val (pos, info, errT) = pattern.vprMeta
+
+ def matchSimpleExp(exp: in.Expr): Writer[vpr.Exp] = for {
+ e1 <- goE(exp)
+ e2 <- goE(expr)
+ } yield vpr.EqCmp(e1, e2)(pos, info, errT)
+
+ val (mPos, mInfo, mErr) = pattern.vprMeta
+
+ pattern match {
+ case in.MatchValue(exp) => matchSimpleExp(exp)
+ case in.MatchBindVar(_, _) | in.MatchWildcard() => unit(vpr.TrueLit()(pos,info,errT))
+ case in.MatchAdt(clause, exp) =>
+ val tagFunction = Names.tagAdtFunction(clause.adtT.name)
+ val tag = vpr.IntLit(clause.adtT.clauseToTag(clause.name))(mPos, mInfo, mErr)
+ val inDeconstructors = clause.fields.map(f => in.AdtDestructor(expr, f)(pattern.info))
+ for {
+ e1 <- goE(expr)
+ tF = vpr.DomainFuncApp(tagFunction, Vector(e1), Map.empty)(mPos, mInfo, vpr.Int, clause.adtT.name, mErr)
+ checkTag = vpr.EqCmp(tF, tag)(mPos)
+ rec <- sequence(inDeconstructors.zip(exp) map {case (e, p) => translateMatchPatternCheck(ctx)(e,p)})
+ } yield rec.foldLeft(checkTag:vpr.Exp)({case (acc, next) => vpr.And(acc, next)(mPos, mInfo, mErr)})
+ }
+ }
+
+ def translateMatchPatternDeclarations(ctx: Context)(expr: in.Expr, pattern: in.MatchPattern): Option[CodeWriter[vpr.Seqn]] = {
+ val (mPos, mInfo, mErrT) = pattern.vprMeta
+ def goE(x: in.Expr): CodeWriter[vpr.Exp] = ctx.expression(x)
+ pattern match {
+ case in.MatchBindVar(name, typ) =>
+ val t = ctx.typ(typ)
+
+ val writer = for {
+ e <- goE(expr)
+ v = vpr.LocalVarDecl(name, t)(mPos, mInfo, mErrT)
+ a = vpr.LocalVarAssign(vpr.LocalVar(name, t)(mPos, mInfo, mErrT), e)(mPos, mInfo, mErrT)
+ } yield vpr.Seqn(Seq(a), Seq(v))(mPos, mInfo, mErrT)
+
+ Some(writer)
+
+ case in.MatchAdt(clause, exprs) =>
+ val inDeconstructors = clause.fields.map(f => in.AdtDestructor(expr, f)(pattern.info))
+ val recAss: Vector[CodeWriter[vpr.Seqn]] =
+ inDeconstructors.zip(exprs) map {case (e, p) => translateMatchPatternDeclarations(ctx)(e,p)} collect {case Some(s) => s}
+ val assignments: Vector[vpr.Seqn] = recAss map {a => a.res}
+ val reduced = assignments.foldLeft(vpr.Seqn(Seq(), Seq())(mPos, mInfo, mErrT))(
+ {case (l, r) => vpr.Seqn(l.ss ++ r .ss, l.scopedDecls ++ r.scopedDecls)(mPos, mInfo, mErrT)}
+ )
+ Some(unit(reduced))
+
+ case _ : in.MatchValue | _: in.MatchWildcard => None
+ }
+ }
+
+ def translatePatternMatch(ctx: Context)(s: in.PatternMatchStmt): CodeWriter[vpr.Stmt] = {
+ val expr = s.exp
+ val cases = s.cases
+
+ val (sPos, sInfo, sErrT) = s.vprMeta
+
+ val checkExVarDecl = vpr.LocalVarDecl(ctx.freshNames.next(), vpr.Bool)(sPos, sInfo, sErrT)
+ val checkExVar = checkExVarDecl.localVar
+ val initialExVar = unit(vpr.LocalVarAssign(checkExVar, vpr.FalseLit()(sPos, sInfo, sErrT))(sPos, sInfo, sErrT))
+ def exErr(ass: vpr.Stmt): ErrorTransformer = {
+ case e@err.AssertFailed(Source(info), _, _) if e causedBy ass => MatchError(info)
+ }
+
+ val assertWithError = for {
+ a <- unit(vpr.Assert(vpr.EqCmp(checkExVar, vpr.TrueLit()(sPos, sInfo, sErrT))(sPos, sInfo, sErrT))(sPos, sInfo, sErrT))
+ _ <- errorT(exErr(a))
+ } yield a
+
+ def setExVar(p: vpr.Position, i: vpr.Info, e: vpr.ErrorTrafo) =
+ unit(vpr.LocalVarAssign(checkExVar, vpr.TrueLit()(p,i,e))(p,i,e))
+
+ def translateCase(c: in.PatternMatchCaseStmt): CodeWriter[vpr.Stmt] = {
+ val (cPos, cInfo, cErrT) = c.vprMeta
+
+ val assignments = translateMatchPatternDeclarations(ctx)(expr, c.mExp)
+
+ val (ass: Seq[vpr.Stmt], decls: Seq[vpr.Declaration]) =
+ if (assignments.isDefined) {
+ val w = assignments.get.res
+ (w.ss, w.scopedDecls)
+ } else {
+ (Seq(), Seq())
+ }
+ for {
+ check <- translateMatchPatternCheck(ctx)(expr, c.mExp)
+ exVar <- setExVar(cPos, cInfo, cErrT)
+ body <- seqn(ctx.statement(c.body))
+ } yield vpr.If(vpr.And(check, vpr.Not(checkExVar)(cPos, cInfo, cErrT))(cPos, cInfo, cErrT),
+ vpr.Seqn(exVar +: (ass :+ body), decls)(cPos, cInfo, cErrT), vpr.Seqn(Seq(), Seq())(cPos, cInfo, cErrT))(cPos, cInfo, cErrT)
+ }
+
+ if (s.strict) {
+ for {
+ init <- initialExVar
+ cs <- sequence(cases map translateCase)
+ a <- assertWithError
+ } yield vpr.Seqn(init +: cs :+ a, Seq(checkExVarDecl))(sPos, sInfo, sErrT)
+ } else {
+ for {
+ init <- initialExVar
+ cs <- sequence(cases map translateCase)
+ } yield vpr.Seqn(init +: cs, Seq(checkExVarDecl))(sPos, sInfo, sErrT)
+ }
+ }
+
+}
diff --git a/src/main/scala/viper/gobra/translator/encodings/interfaces/TypeComponentImpl.scala b/src/main/scala/viper/gobra/translator/encodings/interfaces/TypeComponentImpl.scala
index 62c72be96..10fd1d691 100644
--- a/src/main/scala/viper/gobra/translator/encodings/interfaces/TypeComponentImpl.scala
+++ b/src/main/scala/viper/gobra/translator/encodings/interfaces/TypeComponentImpl.scala
@@ -53,6 +53,8 @@ class TypeComponentImpl extends TypeComponent {
case t: TypeHead.DefinedHD => t.name
case t: TypeHead.InterfaceHD => t.name
case t: TypeHead.DomainHD => t.name
+ case t: TypeHead.AdtHD => t.name
+ case t: TypeHead.AdtClauseHD => t.name
case t: TypeHead.IntHD =>
// For identical types a representative is picked
diff --git a/src/main/scala/viper/gobra/translator/util/TypePatterns.scala b/src/main/scala/viper/gobra/translator/util/TypePatterns.scala
index 9d1092c88..dec73f083 100644
--- a/src/main/scala/viper/gobra/translator/util/TypePatterns.scala
+++ b/src/main/scala/viper/gobra/translator/util/TypePatterns.scala
@@ -161,6 +161,20 @@ object TypePatterns {
}
}
+ object Adt {
+ def unapply(arg: in.Type): Option[in.AdtT] = underlyingType(arg)(ctx) match {
+ case t: in.AdtT => Some(t)
+ case _ => None
+ }
+ }
+
+ object AdtClause {
+ def unapply(arg: in.Type): Option[in.AdtClauseT] = underlyingType(arg)(ctx) match {
+ case t: in.AdtClauseT => Some(t)
+ case _ => None
+ }
+ }
+
object Pointer {
def unapply(arg: in.Type): Option[in.Type] = underlyingType(arg)(ctx) match {
case t : in.PointerT => Some(t.t)
From 4f32be90298949f640a96d5b629a86946d69291a Mon Sep 17 00:00:00 2001
From: "Felix A. Wolf"
Date: Fri, 11 Nov 2022 00:29:33 +0100
Subject: [PATCH 042/296] safety commit
---
.../viper/gobra/ast/internal/Program.scala | 1 +
.../scala/viper/gobra/frontend/Desugar.scala | 209 +++++++++++++++++-
.../context/DfltTranslatorConfig.scala | 3 +-
3 files changed, 210 insertions(+), 3 deletions(-)
diff --git a/src/main/scala/viper/gobra/ast/internal/Program.scala b/src/main/scala/viper/gobra/ast/internal/Program.scala
index 970a1e250..c9f58c9c2 100644
--- a/src/main/scala/viper/gobra/ast/internal/Program.scala
+++ b/src/main/scala/viper/gobra/ast/internal/Program.scala
@@ -1576,6 +1576,7 @@ case class AdtT(name: String, addressability: Addressability, clauseToTag: Map[S
AdtT(name, newAddressability, clauseToTag)
}
+// TODO: maybe remove this type as it is not necessary anymore
case class AdtClauseT(name: String, adtT: AdtT, fields: Vector[Field], addressability: Addressability) extends Type {
/** Returns whether 'this' is equals to 't' without considering the addressability modifier of the types. */
override def equalsWithoutMod(t: Type): Boolean = t match {
diff --git a/src/main/scala/viper/gobra/frontend/Desugar.scala b/src/main/scala/viper/gobra/frontend/Desugar.scala
index 20f342eb2..0aea2888c 100644
--- a/src/main/scala/viper/gobra/frontend/Desugar.scala
+++ b/src/main/scala/viper/gobra/frontend/Desugar.scala
@@ -214,6 +214,11 @@ object Desugar {
}
}
+ def adtClauseProxy(adtName: String, clause: PAdtClause, context: TypeInfo): in.AdtClauseProxy = {
+ val name = idName(clause.id, context)
+ in.AdtClauseProxy(name, adtName)(meta(clause, context))
+ }
+
def methodProxy(id: PIdnUse, context: TypeInfo): in.MethodProxy = {
val name = idName(id, context)
in.MethodProxy(id.name, name)(meta(id, context))
@@ -1981,6 +1986,29 @@ object Desugar {
} yield in.FieldRef(base, f)(src)
}
+ def adtSelectionD(ctx: FunctionContext, info: TypeInfo)(p: ap.AdtField)(src: Meta): Writer[in.Expr] = {
+ for {
+ base <- exprD(ctx, info)(p.base)
+ } yield p.symb match {
+ case st.AdtDestructor(decl, adtDecl, context) =>
+ val adtT: AdtT = context.symbType(adtDecl).asInstanceOf[AdtT]
+ in.AdtDestructor(base, in.Field(
+ nm.adtField(decl.id.name, adtT),
+ typeD(context.symbType(decl.typ), Addressability.mathDataStructureElement)(src),
+ ghost = true
+ )(src))(src)
+
+ case st.AdtDiscriminator(decl, adtDecl, context) =>
+ val adtT: AdtT = context.symbType(adtDecl).asInstanceOf[AdtT]
+ in.AdtDiscriminator(
+ base,
+ adtClauseProxy(nm.adt(adtT), decl, context.getTypeInfo)
+ )(src)
+
+ case _ => violation("Expected AdtDiscriminator or AdtDestructor")
+ }
+ }
+
def functionLikeCallD(ctx: FunctionContext, info: TypeInfo)(p: ap.FunctionLikeCall, expr: PInvoke)(src: Meta): Writer[in.Expr] = {
functionLikeCallDAux(ctx, info)(p, expr)(src) flatMap {
case Right(exp) => unit(exp)
@@ -2458,6 +2486,7 @@ object Desugar {
case n: PDot => info.resolve(n) match {
case Some(p: ap.FieldSelection) => fieldSelectionD(ctx, info)(p)(src)
+ case Some(p: ap.AdtField) => adtSelectionD(ctx, info)(p)(src)
case Some(p: ap.Constant) => unit[in.Expr](globalConstD(p.symb)(src))
case Some(p: ap.GlobalVariable) => unit[in.Expr](globalVarD(p.symb)(src))
case Some(_: ap.NamedType) =>
@@ -2922,6 +2951,7 @@ object Desugar {
case class Map(t : in.MapT) extends CompositeKind
case class MathematicalMap(t : in.MathMapT) extends CompositeKind
case class Struct(t: in.Type, st: in.StructT) extends CompositeKind
+ case class Adt(t: in.AdtClauseT) extends CompositeKind
}
def compositeTypeD(t : in.Type) : CompositeKind = underlyingType(t) match {
@@ -2933,6 +2963,7 @@ object Desugar {
case t: in.MultisetT => CompositeKind.Multiset(t)
case t: in.MapT => CompositeKind.Map(t)
case t: in.MathMapT => CompositeKind.MathematicalMap(t)
+ case t: in.AdtClauseT => CompositeKind.Adt(t)
case _ => Violation.violation(s"expected composite type but got $t")
}
@@ -2972,7 +3003,7 @@ object Desugar {
compositeTypeD(t) match {
- case CompositeKind.Struct(it, ist) => {
+ case CompositeKind.Struct(it, ist) =>
val fields = ist.fields
if (lit.elems.exists(_.key.isEmpty)) {
@@ -3014,7 +3045,45 @@ object Desugar {
args <- sequence(wArgs)
} yield in.StructLit(it, args)(src)
}
- }
+
+ case CompositeKind.Adt(t) =>
+ val fields = t.fields
+ val proxy = in.AdtClauseProxy(t.name, t.adtT.name)(src)
+
+ if (lit.elems.exists(_.key.isEmpty)) {
+ //All elements are unkeyed
+
+ val wArgs = fields.zip(lit.elems).map { case (f, PKeyedElement(_, exp)) => exp match {
+ case PExpCompositeVal(ev) => exprD(ctx, info)(ev)
+ case PLitCompositeVal(lv) => literalValD(ctx, info)(lv, f.typ)
+ }}
+
+ for {
+ args <- sequence(wArgs)
+ } yield in.AdtConstructorLit(t.adtT, proxy, args)(src)
+ } else {
+ val fMap = fields.map({ f => nm.inverse(f.name) -> f }).toMap
+
+ val vMap = lit.elems.map {
+ case PKeyedElement(Some(PIdentifierKey(key)), exp) =>
+ val f = fMap(key.name)
+ exp match {
+ case PExpCompositeVal(ev) => f -> exprD(ctx, info)(ev)
+ case PLitCompositeVal(lv) => f -> literalValD(ctx, info)(lv, f.typ)
+ }
+
+ case _ => Violation.violation("expected identifier as a key")
+ }.toMap
+
+ val wArgs = fields.map {
+ case f if vMap.isDefinedAt(f) => vMap(f)
+ case f => unit(in.DfltVal(f.typ)(src))
+ }
+
+ for {
+ args <- sequence(wArgs)
+ } yield in.AdtConstructorLit(t.adtT, proxy, args)(src)
+ }
case CompositeKind.Array(in.ArrayT(len, typ, addressability)) =>
Violation.violation(addressability == Addressability.literal, "Literals have to be exclusive")
@@ -3568,6 +3637,47 @@ object Desugar {
unit(fLit)
}
+ var registeredAdts: Set[String] = Set.empty
+
+ def fieldDeclAdtD(decl: PFieldDecl, context: ExternalTypeInfo, adt: AdtT)(src: Meta): in.Field = {
+ val fieldName = nm.adtField(decl.id.name, adt)
+ val typ = typeD(context.symbType(decl.typ), Addressability.mathDataStructureElement)(src)
+ in.Field(fieldName, typ, true)(src)
+ }
+
+ def registerAdt(t: Type.AdtT, aT: in.AdtT): Unit = {
+ if (!registeredAdts.contains(aT.name) && info == t.context.getTypeInfo) {
+ registeredAdts += aT.name
+
+ AdditionalMembers.addFinalizingComputation { () =>
+ val xInfo = t.context.getTypeInfo
+
+ val clauses = t.decl.clauses.map { c =>
+ val src = meta(c, xInfo)
+ val proxy = adtClauseProxy(aT.name, c, xInfo)
+ val fields = c.args.flatMap(_.fields).map(f => fieldDeclAdtD(f, t.context, t)(src))
+
+ in.AdtClause(proxy, fields)(src)
+ }
+
+ AdditionalMembers.addMember(
+ in.AdtDefinition(aT.name, clauses)(meta(t.decl, xInfo))
+ )
+ }
+ }
+ }
+
+ def getAdtClauseTagMap(t: Type.AdtT): Map[String, BigInt] = {
+ t.decl.clauses
+ .map(c => idName(c.id, t.context.getTypeInfo))
+ .sortBy(s => s)
+ .zipWithIndex
+ .map {
+ case (s, i) => s -> BigInt(i)
+ }
+ .toMap
+ }
+
def embeddedTypeD(t: PEmbeddedType, addrMod: Addressability)(src: Meta): in.Type = t match {
case PEmbeddedName(typ) => typeD(info.symbType(typ), addrMod)(src)
case PEmbeddedPointer(typ) =>
@@ -3604,6 +3714,21 @@ object Desugar {
val inFields: Vector[in.Field] = structD(t, addrMod)(src)
registerType(in.StructT(inFields, addrMod))
+ case t: Type.AdtT =>
+ val adtName = nm.adt(t)
+ val res = registerType(in.AdtT(adtName, addrMod, getAdtClauseTagMap(t)))
+ registerAdt(t, res)
+ res
+
+ case t: Type.AdtClauseT =>
+ val tAdt = Type.AdtT(t.adtT, t.context)
+ val adt: in.AdtT = in.AdtT(nm.adt(tAdt), addrMod, getAdtClauseTagMap(tAdt))
+ val fields: Vector[in.Field] = (t.clauses map { case (key: String, typ: Type) =>
+ in.Field(nm.adtField(key, tAdt), typeD(typ, Addressability.mathDataStructureElement)(src), true)(src)
+ }).toVector
+
+ in.AdtClauseT(idName(t.decl.id, t.context.getTypeInfo), adt, fields, addrMod)
+
case Type.PredT(args) => in.PredT(args.map(typeD(_, Addressability.rValue)(src)), Addressability.rValue)
case Type.FunctionT(args, result) =>
@@ -3657,6 +3782,7 @@ object Desugar {
case sc: st.SingleConstant => nm.global(id.name, sc.context)
case st.Embbed(_, _, _) | st.Field(_, _, _) => violation(s"expected that fields and embedded field are desugared by using embeddedDeclD resp. fieldDeclD but idName was called with $id")
case n: st.NamedType => nm.typ(id.name, n.context)
+ case a: st.AdtClause => nm.function(id.name, a.context)
case _ => ???
}
@@ -3907,10 +4033,56 @@ object Desugar {
}
case p: PClosureImplProof => closureImplProofD(ctx)(p)
case PExplicitGhostStatement(actual) => stmtD(ctx, info)(actual)
+
+ case PMatchStatement(exp, clauses, strict) => {
+ def goC(clause: PMatchStmtCase): Writer[in.PatternMatchCaseStmt] = {
+
+ val body = block(
+ for {
+ s <- sequence(clause.stmt map { s => seqn(stmtD(ctx, info)(s)) })
+ } yield in.Seqn(s)(src)
+ )
+
+ for {
+ eM <- matchPatternD(ctx, info)(clause.pattern)
+ } yield in.PatternMatchCaseStmt(eM, body)(src)
+
+ }
+
+ for {
+ e <- exprD(ctx, info)(exp)
+ c <- sequence(clauses map goC)
+ } yield in.PatternMatchStmt(e, c, strict)(src)
+ }
+
case _ => ???
}
}
+ def matchPatternD(ctx: FunctionContext, info: TypeInfo)(expr: PMatchPattern): Writer[in.MatchPattern] = {
+
+ def goM(m: PMatchPattern) = matchPatternD(ctx, info)(m)
+
+ val src = meta(expr, info)
+
+ expr match {
+ case PMatchValue(lit) => for {
+ e <- exprD(ctx, info)(lit)
+ } yield in.MatchValue(e)(src)
+
+ case PMatchBindVar(idn) =>
+ unit(in.MatchBindVar(idName(idn, info.getTypeInfo), typeD(info.typ(idn), Addressability.Exclusive)(src))(src))
+
+ case PMatchAdt(clause, fields) =>
+ val clauseType = typeD(info.symbType(clause), Addressability.Exclusive)(src)
+ for {
+ fieldsD <- sequence(fields map goM)
+ } yield in.MatchAdt(clauseType.asInstanceOf[in.AdtClauseT], fieldsD)(src)
+
+ case PMatchWildcard() => unit(in.MatchWildcard()(src))
+ }
+ }
+
/**
* Desugar a specification entailment proof (proof c implements spec{params} { BODY }), as follows:
* - Declare a fresh variable for all the arguments and results of spec.
@@ -4167,6 +4339,26 @@ object Desugar {
dop <- go(op)
} yield in.OptionGet(dop)(src)
+ case m@PMatchExp(exp, _) =>
+ val defaultD: Writer[Option[in.Expr]] = if (m.hasDefault) {
+ for {
+ e <- exprD(ctx, info)(m.defaultClauses.head.exp)
+ } yield Some(e)
+ } else {
+ unit(None)
+ }
+
+ def caseD(c: PMatchExpCase): Writer[in.PatternMatchCaseExp] = for {
+ p <- matchPatternD(ctx, info)(c.pattern)
+ e <- exprD(ctx, info)(c.exp)
+ } yield in.PatternMatchCaseExp(p, e)(src)
+
+ for {
+ e <- exprD(ctx, info)(exp)
+ cs <- sequence(m.caseClauses map caseD)
+ de <- defaultD
+ } yield in.PatternMatchExp(e, typ, cs, de)(src)
+
case PMapKeys(exp) => for {
e <- go(exp)
t = underlyingType(e.typ)
@@ -4540,6 +4732,8 @@ object Desugar {
private val MAIN_FUNC_OBLIGATIONS_PREFIX = "$CHECKMAIN"
private val INTERFACE_PREFIX = "Y"
private val DOMAIN_PREFIX = "D"
+ private val ADT_PREFIX = "ADT"
+ private val ADT_CLAUSE_PREFIX = "P"
private val LABEL_PREFIX = "L"
private val GLOBAL_PREFIX = "G"
private val BUILTIN_PREFIX = "B"
@@ -4716,6 +4910,17 @@ object Desugar {
s"$DOMAIN_PREFIX$$${topLevelName("")(hash, s.context)}"
}
+ def adt(a: AdtT): String = {
+ val pom = a.context.getTypeInfo.tree.originalRoot.positions
+ val start = pom.positions.getStart(a.decl).get
+ val finish = pom.positions.getFinish(a.decl).get
+ val pos = pom.translate(start, finish)
+ val adtName = pos.toString.replace(".", "$")
+ s"$ADT_PREFIX$$$adtName"
+ }
+
+ def adtField(n: String, s: AdtT): String = s"$ADT_CLAUSE_PREFIX$$${topLevelName("")(adt(s), s.context)}"
+
def label(n: String): String = n match {
case "#lhs" => "lhs"
case _ => s"${n}_$LABEL_PREFIX"
diff --git a/src/main/scala/viper/gobra/translator/context/DfltTranslatorConfig.scala b/src/main/scala/viper/gobra/translator/context/DfltTranslatorConfig.scala
index 910dcffcd..4361f570a 100644
--- a/src/main/scala/viper/gobra/translator/context/DfltTranslatorConfig.scala
+++ b/src/main/scala/viper/gobra/translator/context/DfltTranslatorConfig.scala
@@ -9,6 +9,7 @@ package viper.gobra.translator.context
import viper.gobra.ast.internal.GlobalVarDecl
import viper.gobra.ast.{internal => in}
import viper.gobra.translator.encodings._
+import viper.gobra.translator.encodings.adts.AdtEncoding
import viper.gobra.translator.encodings.arrays.ArrayEncoding
import viper.gobra.translator.encodings.channels.ChannelEncoding
import viper.gobra.translator.encodings.closures.ClosureEncoding
@@ -65,7 +66,7 @@ class DfltTranslatorConfig(
new SafeTypeEncodingCombiner(Vector(
new BoolEncoding, new IntEncoding, new PermissionEncoding,
new PointerEncoding, new StructEncoding, arrayEncoding, new ClosureEncoding, new InterfaceEncoding,
- new SequenceEncoding, new SetEncoding, new OptionEncoding, new DomainEncoding,
+ new SequenceEncoding, new SetEncoding, new OptionEncoding, new DomainEncoding, new AdtEncoding,
new SliceEncoding(arrayEncoding), new PredEncoding, new ChannelEncoding, new StringEncoding,
new MapEncoding, new MathematicalMapEncoding, new FloatEncoding,
new AssertionEncoding, new CallEncoding, new MemoryEncoding, new ControlEncoding,
From 800f1f9f3b91d32ceee205cc6c96a5fee4107e1f Mon Sep 17 00:00:00 2001
From: "Felix A. Wolf"
Date: Fri, 11 Nov 2022 12:09:53 +0100
Subject: [PATCH 043/296] safety commit
---
src/main/antlr4/GobraLexer.g4 | 1 +
src/main/antlr4/GobraParser.g4 | 6 +-
.../java/viper/gobra/frontend/GobraLexer.java | 1384 +++---
.../viper/gobra/frontend/GobraParser.java | 4141 +++++++++--------
.../frontend/GobraParserBaseVisitor.java | 18 +-
.../gobra/frontend/GobraParserVisitor.java | 16 +-
.../scala/viper/gobra/ast/frontend/Ast.scala | 2 +-
.../scala/viper/gobra/frontend/Desugar.scala | 2 +-
.../gobra/frontend/ParseTreeTranslator.scala | 16 +
.../resolution/MemberResolution.scala | 16 +-
.../encodings/adts/AdtEncoding.scala | 2 +-
11 files changed, 2912 insertions(+), 2692 deletions(-)
diff --git a/src/main/antlr4/GobraLexer.g4 b/src/main/antlr4/GobraLexer.g4
index db44fc749..313f215f0 100644
--- a/src/main/antlr4/GobraLexer.g4
+++ b/src/main/antlr4/GobraLexer.g4
@@ -66,6 +66,7 @@ SOME : 'some'-> mode(NLSEMI);
GET : 'get'-> mode(NLSEMI);
DOM : 'domain'-> mode(NLSEMI);
AXIOM : 'axiom'-> mode(NLSEMI);
+ADT : 'adt' -> mode(NLSEMI);
NONE : 'none' -> mode(NLSEMI);
PRED : 'pred';
TYPE_OF : 'typeOf'-> mode(NLSEMI);
diff --git a/src/main/antlr4/GobraParser.g4 b/src/main/antlr4/GobraParser.g4
index 5b1a4fe8d..ca107ed37 100644
--- a/src/main/antlr4/GobraParser.g4
+++ b/src/main/antlr4/GobraParser.g4
@@ -132,12 +132,16 @@ seqUpdClause: expression ASSIGN expression;
// Ghost Type Literals
-ghostTypeLit: sqType | ghostSliceType | domainType;
+ghostTypeLit: sqType | ghostSliceType | domainType | adtType;
domainType: DOM L_CURLY (domainClause eos)* R_CURLY;
domainClause: FUNC IDENTIFIER signature | AXIOM L_CURLY expression eos R_CURLY;
+adtType: ADT L_CURLY (adtClause eos)* R_CURLY;
+
+adtClause: IDENTIFIER L_CURLY (fieldDecl eos)* R_CURLY;
+
ghostSliceType: GHOST L_BRACKET R_BRACKET elementType;
sqType: (kind=(SEQ | SET | MSET | OPT) L_BRACKET type_ R_BRACKET)
diff --git a/src/main/java/viper/gobra/frontend/GobraLexer.java b/src/main/java/viper/gobra/frontend/GobraLexer.java
index 9f1810987..6d4d8220a 100644
--- a/src/main/java/viper/gobra/frontend/GobraLexer.java
+++ b/src/main/java/viper/gobra/frontend/GobraLexer.java
@@ -1,4 +1,4 @@
-// Generated from /main/antlr4/GobraLexer.g4 by ANTLR 4.9.1
+// Generated from src/main/antlr4/GobraLexer.g4 by ANTLR 4.9.2
package viper.gobra.frontend;
import org.antlr.v4.runtime.Lexer;
import org.antlr.v4.runtime.CharStream;
@@ -11,7 +11,7 @@
@SuppressWarnings({"all", "warnings", "unchecked", "unused", "cast"})
public class GobraLexer extends Lexer {
- static { RuntimeMetaData.checkVersion("4.9.1", RuntimeMetaData.VERSION); }
+ static { RuntimeMetaData.checkVersion("4.9.2", RuntimeMetaData.VERSION); }
protected static final DFA[] _decisionToDFA;
protected static final PredictionContextCache _sharedContextCache =
@@ -23,25 +23,26 @@ public class GobraLexer extends Lexer {
FOLD=23, UNFOLD=24, UNFOLDING=25, GHOST=26, IN=27, MULTI=28, SUBSET=29,
UNION=30, INTERSECTION=31, SETMINUS=32, IMPLIES=33, WAND=34, APPLY=35,
QMARK=36, L_PRED=37, R_PRED=38, SEQ=39, SET=40, MSET=41, DICT=42, OPT=43,
- LEN=44, NEW=45, MAKE=46, CAP=47, SOME=48, GET=49, DOM=50, AXIOM=51, NONE=52,
- PRED=53, TYPE_OF=54, IS_COMPARABLE=55, SHARE=56, ADDR_MOD=57, DOT_DOT=58,
- SHARED=59, EXCLUSIVE=60, PREDICATE=61, WRITEPERM=62, NOPERM=63, TRUSTED=64,
- OUTLINE=65, INIT_POST=66, IMPORT_PRE=67, PROOF=68, GHOST_EQUALS=69, GHOST_NOT_EQUALS=70,
- WITH=71, BREAK=72, DEFAULT=73, FUNC=74, INTERFACE=75, SELECT=76, CASE=77,
- DEFER=78, GO=79, MAP=80, STRUCT=81, CHAN=82, ELSE=83, GOTO=84, PACKAGE=85,
- SWITCH=86, CONST=87, FALLTHROUGH=88, IF=89, RANGE=90, TYPE=91, CONTINUE=92,
- FOR=93, IMPORT=94, RETURN=95, VAR=96, NIL_LIT=97, IDENTIFIER=98, L_PAREN=99,
- R_PAREN=100, L_CURLY=101, R_CURLY=102, L_BRACKET=103, R_BRACKET=104, ASSIGN=105,
- COMMA=106, SEMI=107, COLON=108, DOT=109, PLUS_PLUS=110, MINUS_MINUS=111,
- DECLARE_ASSIGN=112, ELLIPSIS=113, LOGICAL_OR=114, LOGICAL_AND=115, EQUALS=116,
- NOT_EQUALS=117, LESS=118, LESS_OR_EQUALS=119, GREATER=120, GREATER_OR_EQUALS=121,
- OR=122, DIV=123, MOD=124, LSHIFT=125, RSHIFT=126, BIT_CLEAR=127, EXCLAMATION=128,
- PLUS=129, MINUS=130, CARET=131, STAR=132, AMPERSAND=133, RECEIVE=134,
- DECIMAL_LIT=135, BINARY_LIT=136, OCTAL_LIT=137, HEX_LIT=138, HEX_FLOAT_LIT=139,
- IMAGINARY_LIT=140, RUNE_LIT=141, BYTE_VALUE=142, OCTAL_BYTE_VALUE=143,
- HEX_BYTE_VALUE=144, LITTLE_U_VALUE=145, BIG_U_VALUE=146, RAW_STRING_LIT=147,
- INTERPRETED_STRING_LIT=148, WS=149, COMMENT=150, TERMINATOR=151, LINE_COMMENT=152,
- WS_NLSEMI=153, COMMENT_NLSEMI=154, LINE_COMMENT_NLSEMI=155, EOS=156, OTHER=157;
+ LEN=44, NEW=45, MAKE=46, CAP=47, SOME=48, GET=49, DOM=50, AXIOM=51, ADT=52,
+ NONE=53, PRED=54, TYPE_OF=55, IS_COMPARABLE=56, SHARE=57, ADDR_MOD=58,
+ DOT_DOT=59, SHARED=60, EXCLUSIVE=61, PREDICATE=62, WRITEPERM=63, NOPERM=64,
+ TRUSTED=65, OUTLINE=66, INIT_POST=67, IMPORT_PRE=68, PROOF=69, GHOST_EQUALS=70,
+ GHOST_NOT_EQUALS=71, WITH=72, BREAK=73, DEFAULT=74, FUNC=75, INTERFACE=76,
+ SELECT=77, CASE=78, DEFER=79, GO=80, MAP=81, STRUCT=82, CHAN=83, ELSE=84,
+ GOTO=85, PACKAGE=86, SWITCH=87, CONST=88, FALLTHROUGH=89, IF=90, RANGE=91,
+ TYPE=92, CONTINUE=93, FOR=94, IMPORT=95, RETURN=96, VAR=97, NIL_LIT=98,
+ IDENTIFIER=99, L_PAREN=100, R_PAREN=101, L_CURLY=102, R_CURLY=103, L_BRACKET=104,
+ R_BRACKET=105, ASSIGN=106, COMMA=107, SEMI=108, COLON=109, DOT=110, PLUS_PLUS=111,
+ MINUS_MINUS=112, DECLARE_ASSIGN=113, ELLIPSIS=114, LOGICAL_OR=115, LOGICAL_AND=116,
+ EQUALS=117, NOT_EQUALS=118, LESS=119, LESS_OR_EQUALS=120, GREATER=121,
+ GREATER_OR_EQUALS=122, OR=123, DIV=124, MOD=125, LSHIFT=126, RSHIFT=127,
+ BIT_CLEAR=128, EXCLAMATION=129, PLUS=130, MINUS=131, CARET=132, STAR=133,
+ AMPERSAND=134, RECEIVE=135, DECIMAL_LIT=136, BINARY_LIT=137, OCTAL_LIT=138,
+ HEX_LIT=139, HEX_FLOAT_LIT=140, IMAGINARY_LIT=141, RUNE_LIT=142, BYTE_VALUE=143,
+ OCTAL_BYTE_VALUE=144, HEX_BYTE_VALUE=145, LITTLE_U_VALUE=146, BIG_U_VALUE=147,
+ RAW_STRING_LIT=148, INTERPRETED_STRING_LIT=149, WS=150, COMMENT=151, TERMINATOR=152,
+ LINE_COMMENT=153, WS_NLSEMI=154, COMMENT_NLSEMI=155, LINE_COMMENT_NLSEMI=156,
+ EOS=157, OTHER=158;
public static final int
NLSEMI=1;
public static String[] channelNames = {
@@ -60,8 +61,8 @@ private static String[] makeRuleNames() {
"UNFOLD", "UNFOLDING", "GHOST", "IN", "MULTI", "SUBSET", "UNION", "INTERSECTION",
"SETMINUS", "IMPLIES", "WAND", "APPLY", "QMARK", "L_PRED", "R_PRED",
"SEQ", "SET", "MSET", "DICT", "OPT", "LEN", "NEW", "MAKE", "CAP", "SOME",
- "GET", "DOM", "AXIOM", "NONE", "PRED", "TYPE_OF", "IS_COMPARABLE", "SHARE",
- "ADDR_MOD", "DOT_DOT", "SHARED", "EXCLUSIVE", "PREDICATE", "WRITEPERM",
+ "GET", "DOM", "AXIOM", "ADT", "NONE", "PRED", "TYPE_OF", "IS_COMPARABLE",
+ "SHARE", "ADDR_MOD", "DOT_DOT", "SHARED", "EXCLUSIVE", "PREDICATE", "WRITEPERM",
"NOPERM", "TRUSTED", "OUTLINE", "INIT_POST", "IMPORT_PRE", "PROOF", "GHOST_EQUALS",
"GHOST_NOT_EQUALS", "WITH", "BREAK", "DEFAULT", "FUNC", "INTERFACE",
"SELECT", "CASE", "DEFER", "GO", "MAP", "STRUCT", "CHAN", "ELSE", "GOTO",
@@ -93,8 +94,8 @@ private static String[] makeLiteralNames() {
"'ghost'", "'in'", "'#'", "'subset'", "'union'", "'intersection'", "'setminus'",
"'==>'", "'--*'", "'apply'", "'?'", "'!<'", "'!>'", "'seq'", "'set'",
"'mset'", "'dict'", "'option'", "'len'", "'new'", "'make'", "'cap'",
- "'some'", "'get'", "'domain'", "'axiom'", "'none'", "'pred'", "'typeOf'",
- "'isComparable'", "'share'", "'@'", "'..'", "'shared'", "'exclusive'",
+ "'some'", "'get'", "'domain'", "'axiom'", "'adt'", "'none'", "'pred'",
+ "'typeOf'", "'isComparable'", "'share'", "'@'", "'..'", "'shared'", "'exclusive'",
"'predicate'", "'writePerm'", "'noPerm'", "'trusted'", "'outline'", "'initEnsures'",
"'importRequires'", "'proof'", "'==='", "'!=='", "'with'", "'break'",
"'default'", "'func'", "'interface'", "'select'", "'case'", "'defer'",
@@ -116,8 +117,8 @@ private static String[] makeSymbolicNames() {
"UNFOLD", "UNFOLDING", "GHOST", "IN", "MULTI", "SUBSET", "UNION", "INTERSECTION",
"SETMINUS", "IMPLIES", "WAND", "APPLY", "QMARK", "L_PRED", "R_PRED",
"SEQ", "SET", "MSET", "DICT", "OPT", "LEN", "NEW", "MAKE", "CAP", "SOME",
- "GET", "DOM", "AXIOM", "NONE", "PRED", "TYPE_OF", "IS_COMPARABLE", "SHARE",
- "ADDR_MOD", "DOT_DOT", "SHARED", "EXCLUSIVE", "PREDICATE", "WRITEPERM",
+ "GET", "DOM", "AXIOM", "ADT", "NONE", "PRED", "TYPE_OF", "IS_COMPARABLE",
+ "SHARE", "ADDR_MOD", "DOT_DOT", "SHARED", "EXCLUSIVE", "PREDICATE", "WRITEPERM",
"NOPERM", "TRUSTED", "OUTLINE", "INIT_POST", "IMPORT_PRE", "PROOF", "GHOST_EQUALS",
"GHOST_NOT_EQUALS", "WITH", "BREAK", "DEFAULT", "FUNC", "INTERFACE",
"SELECT", "CASE", "DEFER", "GO", "MAP", "STRUCT", "CHAN", "ELSE", "GOTO",
@@ -213,7 +214,7 @@ private boolean DECIMAL_FLOAT_LIT_sempred(RuleContext _localctx, int predIndex)
}
public static final String _serializedATN =
- "\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\2\u009f\u05c3\b\1\b"+
+ "\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\2\u00a0\u05cb\b\1\b"+
"\1\4\2\t\2\4\3\t\3\4\4\t\4\4\5\t\5\4\6\t\6\4\7\t\7\4\b\t\b\4\t\t\t\4\n"+
"\t\n\4\13\t\13\4\f\t\f\4\r\t\r\4\16\t\16\4\17\t\17\4\20\t\20\4\21\t\21"+
"\4\22\t\22\4\23\t\23\4\24\t\24\4\25\t\25\4\26\t\26\4\27\t\27\4\30\t\30"+
@@ -236,668 +237,671 @@ private boolean DECIMAL_FLOAT_LIT_sempred(RuleContext _localctx, int predIndex)
"\t\u009b\4\u009c\t\u009c\4\u009d\t\u009d\4\u009e\t\u009e\4\u009f\t\u009f"+
"\4\u00a0\t\u00a0\4\u00a1\t\u00a1\4\u00a2\t\u00a2\4\u00a3\t\u00a3\4\u00a4"+
"\t\u00a4\4\u00a5\t\u00a5\4\u00a6\t\u00a6\4\u00a7\t\u00a7\4\u00a8\t\u00a8"+
- "\4\u00a9\t\u00a9\4\u00aa\t\u00aa\4\u00ab\t\u00ab\3\2\3\2\5\2\u015b\n\2"+
- "\3\2\3\2\3\3\3\3\3\3\3\3\5\3\u0163\n\3\3\3\5\3\u0166\n\3\3\3\5\3\u0169"+
- "\n\3\3\3\3\3\3\3\3\3\5\3\u016f\n\3\5\3\u0171\n\3\3\4\3\4\3\4\3\4\3\4\3"+
- "\4\3\4\3\5\3\5\3\5\3\5\3\5\3\5\3\5\3\5\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\7"+
- "\3\7\3\7\3\7\3\7\3\7\3\7\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\t\3\t\3\t\3\t\3"+
- "\t\3\t\3\t\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\13\3\13\3\13\3\13\3\13"+
- "\3\13\3\13\3\13\3\13\3\13\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\r\3\r\3\r"+
- "\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\16\3\16\3\16\3\16\3\16\3\16\3\16\3\16\3"+
- "\16\3\16\3\16\3\16\3\17\3\17\3\17\3\17\3\17\3\17\3\17\3\20\3\20\3\20\3"+
- "\20\3\20\3\20\3\20\3\20\3\20\3\20\3\20\3\21\3\21\3\21\3\22\3\22\3\22\3"+
- "\22\3\22\3\22\3\23\3\23\3\23\3\23\3\23\3\23\3\23\3\23\3\23\3\24\3\24\3"+
- "\24\3\24\3\24\3\25\3\25\3\25\3\25\3\25\3\25\3\25\3\26\3\26\3\26\3\26\3"+
- "\26\3\26\3\26\3\27\3\27\3\27\3\27\3\27\3\27\3\30\3\30\3\30\3\30\3\30\3"+
- "\31\3\31\3\31\3\31\3\31\3\31\3\31\3\32\3\32\3\32\3\32\3\32\3\32\3\32\3"+
- "\32\3\32\3\32\3\33\3\33\3\33\3\33\3\33\3\33\3\34\3\34\3\34\3\35\3\35\3"+
- "\36\3\36\3\36\3\36\3\36\3\36\3\36\3\37\3\37\3\37\3\37\3\37\3\37\3 \3 "+
- "\3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3!\3!\3!\3!\3!\3!\3!\3!\3!\3\"\3\"\3"+
- "\"\3\"\3#\3#\3#\3#\3$\3$\3$\3$\3$\3$\3%\3%\3&\3&\3&\3\'\3\'\3\'\3\'\3"+
- "\'\3(\3(\3(\3(\3(\3(\3)\3)\3)\3)\3)\3)\3*\3*\3*\3*\3*\3*\3*\3+\3+\3+\3"+
- "+\3+\3+\3+\3,\3,\3,\3,\3,\3,\3,\3,\3,\3-\3-\3-\3-\3-\3-\3.\3.\3.\3.\3"+
- ".\3.\3/\3/\3/\3/\3/\3/\3/\3\60\3\60\3\60\3\60\3\60\3\60\3\61\3\61\3\61"+
- "\3\61\3\61\3\61\3\61\3\62\3\62\3\62\3\62\3\62\3\62\3\63\3\63\3\63\3\63"+
- "\3\63\3\63\3\63\3\63\3\63\3\64\3\64\3\64\3\64\3\64\3\64\3\64\3\64\3\65"+
- "\3\65\3\65\3\65\3\65\3\65\3\65\3\66\3\66\3\66\3\66\3\66\3\67\3\67\3\67"+
- "\3\67\3\67\3\67\3\67\3\67\3\67\38\38\38\38\38\38\38\38\38\38\38\38\38"+
- "\38\38\39\39\39\39\39\39\3:\3:\3:\3:\3;\3;\3;\3<\3<\3<\3<\3<\3<\3<\3="+
- "\3=\3=\3=\3=\3=\3=\3=\3=\3=\3>\3>\3>\3>\3>\3>\3>\3>\3>\3>\3?\3?\3?\3?"+
- "\3?\3?\3?\3?\3?\3?\3?\3?\3@\3@\3@\3@\3@\3@\3@\3@\3@\3A\3A\3A\3A\3A\3A"+
- "\3A\3A\3A\3A\3B\3B\3B\3B\3B\3B\3B\3B\3C\3C\3C\3C\3C\3C\3C\3C\3C\3C\3C"+
- "\3C\3D\3D\3D\3D\3D\3D\3D\3D\3D\3D\3D\3D\3D\3D\3D\3E\3E\3E\3E\3E\3E\3F"+
- "\3F\3F\3F\3G\3G\3G\3G\3H\3H\3H\3H\3H\3I\3I\3I\3I\3I\3I\3I\3I\3J\3J\3J"+
- "\3J\3J\3J\3J\3J\3K\3K\3K\3K\3K\3L\3L\3L\3L\3L\3L\3L\3L\3L\3L\3M\3M\3M"+
- "\3M\3M\3M\3M\3N\3N\3N\3N\3N\3O\3O\3O\3O\3O\3O\3P\3P\3P\3Q\3Q\3Q\3Q\3R"+
- "\3R\3R\3R\3R\3R\3R\3S\3S\3S\3S\3S\3T\3T\3T\3T\3T\3U\3U\3U\3U\3U\3V\3V"+
- "\3V\3V\3V\3V\3V\3V\3W\3W\3W\3W\3W\3W\3W\3X\3X\3X\3X\3X\3X\3Y\3Y\3Y\3Y"+
- "\3Y\3Y\3Y\3Y\3Y\3Y\3Y\3Y\3Y\3Y\3Z\3Z\3Z\3[\3[\3[\3[\3[\3[\3\\\3\\\3\\"+
- "\3\\\3\\\3]\3]\3]\3]\3]\3]\3]\3]\3]\3]\3]\3^\3^\3^\3^\3_\3_\3_\3_\3_\3"+
- "_\3_\3`\3`\3`\3`\3`\3`\3`\3`\3`\3a\3a\3a\3a\3b\3b\3b\3b\3b\3b\3c\3c\3"+
- "c\7c\u040e\nc\fc\16c\u0411\13c\3c\3c\3d\3d\3e\3e\3e\3e\3f\3f\3g\3g\3g"+
- "\3g\3h\3h\3i\3i\3i\3i\3j\3j\3k\3k\3l\3l\3m\3m\3n\3n\3o\3o\3o\3o\3o\3p"+
- "\3p\3p\3p\3p\3q\3q\3q\3r\3r\3r\3r\3s\3s\3s\3t\3t\3t\3u\3u\3u\3v\3v\3v"+
- "\3w\3w\3x\3x\3x\3y\3y\3z\3z\3z\3{\3{\3|\3|\3}\3}\3~\3~\3~\3\177\3\177"+
- "\3\177\3\u0080\3\u0080\3\u0080\3\u0081\3\u0081\3\u0082\3\u0082\3\u0083"+
- "\3\u0083\3\u0084\3\u0084\3\u0085\3\u0085\3\u0086\3\u0086\3\u0087\3\u0087"+
- "\3\u0087\3\u0088\3\u0088\3\u0088\5\u0088\u0479\n\u0088\3\u0088\7\u0088"+
- "\u047c\n\u0088\f\u0088\16\u0088\u047f\13\u0088\5\u0088\u0481\n\u0088\3"+
- "\u0088\3\u0088\3\u0089\3\u0089\3\u0089\5\u0089\u0488\n\u0089\3\u0089\6"+
- "\u0089\u048b\n\u0089\r\u0089\16\u0089\u048c\3\u0089\3\u0089\3\u008a\3"+
- "\u008a\5\u008a\u0493\n\u008a\3\u008a\5\u008a\u0496\n\u008a\3\u008a\6\u008a"+
- "\u0499\n\u008a\r\u008a\16\u008a\u049a\3\u008a\3\u008a\3\u008b\3\u008b"+
- "\3\u008b\5\u008b\u04a2\n\u008b\3\u008b\6\u008b\u04a5\n\u008b\r\u008b\16"+
- "\u008b\u04a6\3\u008b\3\u008b\3\u008c\3\u008c\3\u008c\3\u008c\3\u008c\3"+
- "\u008d\5\u008d\u04b1\n\u008d\3\u008d\6\u008d\u04b4\n\u008d\r\u008d\16"+
- "\u008d\u04b5\3\u008d\3\u008d\5\u008d\u04ba\n\u008d\3\u008d\7\u008d\u04bd"+
- "\n\u008d\f\u008d\16\u008d\u04c0\13\u008d\5\u008d\u04c2\n\u008d\3\u008d"+
- "\3\u008d\3\u008d\5\u008d\u04c7\n\u008d\3\u008d\7\u008d\u04ca\n\u008d\f"+
- "\u008d\16\u008d\u04cd\13\u008d\5\u008d\u04cf\n\u008d\3\u008e\3\u008e\3"+
- "\u008e\3\u008e\3\u008f\3\u008f\3\u008f\3\u008f\3\u008f\5\u008f\u04da\n"+
- "\u008f\3\u008f\3\u008f\3\u008f\3\u008f\3\u0090\3\u0090\3\u0090\5\u0090"+
- "\u04e3\n\u0090\3\u0090\3\u0090\3\u0091\3\u0091\3\u0091\3\u0091\3\u0092"+
- "\3\u0092\5\u0092\u04ed\n\u0092\3\u0093\3\u0093\3\u0093\3\u0093\3\u0093"+
- "\3\u0094\3\u0094\3\u0094\3\u0094\3\u0094\3\u0095\3\u0095\3\u0095\3\u0095"+
- "\3\u0095\3\u0095\3\u0095\3\u0096\3\u0096\3\u0096\3\u0096\3\u0096\3\u0096"+
- "\3\u0096\3\u0096\3\u0096\3\u0096\3\u0096\3\u0097\3\u0097\7\u0097\u050d"+
- "\n\u0097\f\u0097\16\u0097\u0510\13\u0097\3\u0097\3\u0097\3\u0097\3\u0097"+
- "\3\u0098\3\u0098\3\u0098\7\u0098\u0519\n\u0098\f\u0098\16\u0098\u051c"+
- "\13\u0098\3\u0098\3\u0098\3\u0098\3\u0098\3\u0099\6\u0099\u0523\n\u0099"+
- "\r\u0099\16\u0099\u0524\3\u0099\3\u0099\3\u009a\3\u009a\3\u009a\3\u009a"+
- "\7\u009a\u052d\n\u009a\f\u009a\16\u009a\u0530\13\u009a\3\u009a\3\u009a"+
- "\3\u009a\3\u009a\3\u009a\3\u009b\6\u009b\u0538\n\u009b\r\u009b\16\u009b"+
- "\u0539\3\u009b\3\u009b\3\u009c\3\u009c\3\u009c\3\u009c\7\u009c\u0542\n"+
- "\u009c\f\u009c\16\u009c\u0545\13\u009c\3\u009c\3\u009c\3\u009d\3\u009d"+
- "\3\u009d\3\u009d\5\u009d\u054d\n\u009d\3\u009e\3\u009e\3\u009e\3\u009e"+
- "\3\u009e\3\u009e\3\u009e\3\u009e\3\u009e\3\u009e\3\u009e\3\u009e\3\u009e"+
- "\3\u009e\3\u009e\3\u009e\3\u009e\3\u009e\3\u009e\3\u009e\3\u009e\3\u009e"+
- "\3\u009e\3\u009e\3\u009e\3\u009e\5\u009e\u0569\n\u009e\3\u009f\3\u009f"+
- "\5\u009f\u056d\n\u009f\3\u009f\7\u009f\u0570\n\u009f\f\u009f\16\u009f"+
- "\u0573\13\u009f\3\u00a0\3\u00a0\3\u00a1\3\u00a1\3\u00a2\3\u00a2\3\u00a3"+
- "\3\u00a3\5\u00a3\u057d\n\u00a3\3\u00a3\3\u00a3\3\u00a4\3\u00a4\5\u00a4"+
- "\u0583\n\u00a4\3\u00a5\3\u00a5\3\u00a6\3\u00a6\3\u00a7\6\u00a7\u058a\n"+
- "\u00a7\r\u00a7\16\u00a7\u058b\3\u00a7\3\u00a7\3\u00a8\3\u00a8\3\u00a8"+
- "\3\u00a8\7\u00a8\u0594\n\u00a8\f\u00a8\16\u00a8\u0597\13\u00a8\3\u00a8"+
- "\3\u00a8\3\u00a8\3\u00a8\3\u00a8\3\u00a9\3\u00a9\3\u00a9\3\u00a9\7\u00a9"+
- "\u05a2\n\u00a9\f\u00a9\16\u00a9\u05a5\13\u00a9\3\u00a9\3\u00a9\3\u00aa"+
- "\6\u00aa\u05aa\n\u00aa\r\u00aa\16\u00aa\u05ab\3\u00aa\3\u00aa\3\u00aa"+
- "\3\u00aa\3\u00aa\7\u00aa\u05b3\n\u00aa\f\u00aa\16\u00aa\u05b6\13\u00aa"+
- "\3\u00aa\3\u00aa\3\u00aa\5\u00aa\u05bb\n\u00aa\3\u00aa\3\u00aa\3\u00ab"+
- "\3\u00ab\3\u00ab\3\u00ab\3\u00ab\5\u052e\u0595\u05b4\2\u00ac\4\3\6\4\b"+
- "\5\n\6\f\7\16\b\20\t\22\n\24\13\26\f\30\r\32\16\34\17\36\20 \21\"\22$"+
- "\23&\24(\25*\26,\27.\30\60\31\62\32\64\33\66\348\35:\36<\37> @!B\"D#F"+
- "$H%J&L\'N(P)R*T+V,X-Z.\\/^\60`\61b\62d\63f\64h\65j\66l\67n8p9r:t;v|?~@\u0080A\u0082B\u0084C\u0086D\u0088E\u008aF\u008cG\u008eH\u0090I"+
- "\u0092J\u0094K\u0096L\u0098M\u009aN\u009cO\u009eP\u00a0Q\u00a2R\u00a4"+
- "S\u00a6T\u00a8U\u00aaV\u00acW\u00aeX\u00b0Y\u00b2Z\u00b4[\u00b6\\\u00b8"+
- "]\u00ba^\u00bc_\u00be`\u00c0a\u00c2b\u00c4c\u00c6d\u00c8e\u00caf\u00cc"+
- "g\u00ceh\u00d0i\u00d2j\u00d4k\u00d6l\u00d8m\u00dan\u00dco\u00dep\u00e0"+
- "q\u00e2r\u00e4s\u00e6t\u00e8u\u00eav\u00ecw\u00eex\u00f0y\u00f2z\u00f4"+
- "{\u00f6|\u00f8}\u00fa~\u00fc\177\u00fe\u0080\u0100\u0081\u0102\u0082\u0104"+
- "\u0083\u0106\u0084\u0108\u0085\u010a\u0086\u010c\u0087\u010e\u0088\u0110"+
- "\u0089\u0112\u008a\u0114\u008b\u0116\u008c\u0118\u008d\u011a\2\u011c\2"+
- "\u011e\u008e\u0120\2\u0122\u008f\u0124\u0090\u0126\u0091\u0128\u0092\u012a"+
- "\u0093\u012c\u0094\u012e\u0095\u0130\u0096\u0132\u0097\u0134\u0098\u0136"+
- "\u0099\u0138\u009a\u013a\2\u013c\2\u013e\2\u0140\2\u0142\2\u0144\2\u0146"+
- "\2\u0148\2\u014a\2\u014c\2\u014e\u009b\u0150\u009c\u0152\u009d\u0154\u009e"+
- "\u0156\u009f\4\2\3\23\3\2\63;\3\2\62;\4\2DDdd\4\2QQqq\4\2ZZzz\4\2RRrr"+
- "\4\2--//\3\2bb\4\2$$^^\4\2\13\13\"\"\4\2\f\f\17\17\5\2\f\f\17\17))\13"+
- "\2$$))^^cdhhppttvvxx\3\2\629\5\2\62;CHch\3\2\62\63\4\2GGgg\49\2\62\2;"+
- "\2\u0662\2\u066b\2\u06f2\2\u06fb\2\u07c2\2\u07cb\2\u0968\2\u0971\2\u09e8"+
- "\2\u09f1\2\u0a68\2\u0a71\2\u0ae8\2\u0af1\2\u0b68\2\u0b71\2\u0be8\2\u0bf1"+
- "\2\u0c68\2\u0c71\2\u0ce8\2\u0cf1\2\u0d68\2\u0d71\2\u0de8\2\u0df1\2\u0e52"+
- "\2\u0e5b\2\u0ed2\2\u0edb\2\u0f22\2\u0f2b\2\u1042\2\u104b\2\u1092\2\u109b"+
- "\2\u17e2\2\u17eb\2\u1812\2\u181b\2\u1948\2\u1951\2\u19d2\2\u19db\2\u1a82"+
- "\2\u1a8b\2\u1a92\2\u1a9b\2\u1b52\2\u1b5b\2\u1bb2\2\u1bbb\2\u1c42\2\u1c4b"+
- "\2\u1c52\2\u1c5b\2\ua622\2\ua62b\2\ua8d2\2\ua8db\2\ua902\2\ua90b\2\ua9d2"+
- "\2\ua9db\2\ua9f2\2\ua9fb\2\uaa52\2\uaa5b\2\uabf2\2\uabfb\2\uff12\2\uff1b"+
- "\2\u04a2\3\u04ab\3\u1068\3\u1071\3\u10f2\3\u10fb\3\u1138\3\u1141\3\u11d2"+
- "\3\u11db\3\u12f2\3\u12fb\3\u1452\3\u145b\3\u14d2\3\u14db\3\u1652\3\u165b"+
- "\3\u16c2\3\u16cb\3\u1732\3\u173b\3\u18e2\3\u18eb\3\u1c52\3\u1c5b\3\u1d52"+
- "\3\u1d5b\3\u6a62\3\u6a6b\3\u6b52\3\u6b5b\3\ud7d0\3\ud801\3\ue952\3\ue95b"+
- "\3\u024b\2C\2\\\2c\2|\2\u00ac\2\u00ac\2\u00b7\2\u00b7\2\u00bc\2\u00bc"+
- "\2\u00c2\2\u00d8\2\u00da\2\u00f8\2\u00fa\2\u02c3\2\u02c8\2\u02d3\2\u02e2"+
- "\2\u02e6\2\u02ee\2\u02ee\2\u02f0\2\u02f0\2\u0372\2\u0376\2\u0378\2\u0379"+
- "\2\u037c\2\u037f\2\u0381\2\u0381\2\u0388\2\u0388\2\u038a\2\u038c\2\u038e"+
- "\2\u038e\2\u0390\2\u03a3\2\u03a5\2\u03f7\2\u03f9\2\u0483\2\u048c\2\u0531"+
- "\2\u0533\2\u0558\2\u055b\2\u055b\2\u0563\2\u0589\2\u05d2\2\u05ec\2\u05f2"+
- "\2\u05f4\2\u0622\2\u064c\2\u0670\2\u0671\2\u0673\2\u06d5\2\u06d7\2\u06d7"+
- "\2\u06e7\2\u06e8\2\u06f0\2\u06f1\2\u06fc\2\u06fe\2\u0701\2\u0701\2\u0712"+
- "\2\u0712\2\u0714\2\u0731\2\u074f\2\u07a7\2\u07b3\2\u07b3\2\u07cc\2\u07ec"+
- "\2\u07f6\2\u07f7\2\u07fc\2\u07fc\2\u0802\2\u0817\2\u081c\2\u081c\2\u0826"+
- "\2\u0826\2\u082a\2\u082a\2\u0842\2\u085a\2\u0862\2\u086c\2\u08a2\2\u08b6"+
- "\2\u08b8\2\u08bf\2\u0906\2\u093b\2\u093f\2\u093f\2\u0952\2\u0952\2\u095a"+
- "\2\u0963\2\u0973\2\u0982\2\u0987\2\u098e\2\u0991\2\u0992\2\u0995\2\u09aa"+
- "\2\u09ac\2\u09b2\2\u09b4\2\u09b4\2\u09b8\2\u09bb\2\u09bf\2\u09bf\2\u09d0"+
- "\2\u09d0\2\u09de\2\u09df\2\u09e1\2\u09e3\2\u09f2\2\u09f3\2\u09fe\2\u09fe"+
- "\2\u0a07\2\u0a0c\2\u0a11\2\u0a12\2\u0a15\2\u0a2a\2\u0a2c\2\u0a32\2\u0a34"+
- "\2\u0a35\2\u0a37\2\u0a38\2\u0a3a\2\u0a3b\2\u0a5b\2\u0a5e\2\u0a60\2\u0a60"+
- "\2\u0a74\2\u0a76\2\u0a87\2\u0a8f\2\u0a91\2\u0a93\2\u0a95\2\u0aaa\2\u0aac"+
- "\2\u0ab2\2\u0ab4\2\u0ab5\2\u0ab7\2\u0abb\2\u0abf\2\u0abf\2\u0ad2\2\u0ad2"+
- "\2\u0ae2\2\u0ae3\2\u0afb\2\u0afb\2\u0b07\2\u0b0e\2\u0b11\2\u0b12\2\u0b15"+
- "\2\u0b2a\2\u0b2c\2\u0b32\2\u0b34\2\u0b35\2\u0b37\2\u0b3b\2\u0b3f\2\u0b3f"+
- "\2\u0b5e\2\u0b5f\2\u0b61\2\u0b63\2\u0b73\2\u0b73\2\u0b85\2\u0b85\2\u0b87"+
- "\2\u0b8c\2\u0b90\2\u0b92\2\u0b94\2\u0b97\2\u0b9b\2\u0b9c\2\u0b9e\2\u0b9e"+
- "\2\u0ba0\2\u0ba1\2\u0ba5\2\u0ba6\2\u0baa\2\u0bac\2\u0bb0\2\u0bbb\2\u0bd2"+
- "\2\u0bd2\2\u0c07\2\u0c0e\2\u0c10\2\u0c12\2\u0c14\2\u0c2a\2\u0c2c\2\u0c3b"+
- "\2\u0c3f\2\u0c3f\2\u0c5a\2\u0c5c\2\u0c62\2\u0c63\2\u0c82\2\u0c82\2\u0c87"+
- "\2\u0c8e\2\u0c90\2\u0c92\2\u0c94\2\u0caa\2\u0cac\2\u0cb5\2\u0cb7\2\u0cbb"+
- "\2\u0cbf\2\u0cbf\2\u0ce0\2\u0ce0\2\u0ce2\2\u0ce3\2\u0cf3\2\u0cf4\2\u0d07"+
- "\2\u0d0e\2\u0d10\2\u0d12\2\u0d14\2\u0d3c\2\u0d3f\2\u0d3f\2\u0d50\2\u0d50"+
- "\2\u0d56\2\u0d58\2\u0d61\2\u0d63\2\u0d7c\2\u0d81\2\u0d87\2\u0d98\2\u0d9c"+
- "\2\u0db3\2\u0db5\2\u0dbd\2\u0dbf\2\u0dbf\2\u0dc2\2\u0dc8\2\u0e03\2\u0e32"+
- "\2\u0e34\2\u0e35\2\u0e42\2\u0e48\2\u0e83\2\u0e84\2\u0e86\2\u0e86\2\u0e89"+
- "\2\u0e8a\2\u0e8c\2\u0e8c\2\u0e8f\2\u0e8f\2\u0e96\2\u0e99\2\u0e9b\2\u0ea1"+
- "\2\u0ea3\2\u0ea5\2\u0ea7\2\u0ea7\2\u0ea9\2\u0ea9\2\u0eac\2\u0ead\2\u0eaf"+
- "\2\u0eb2\2\u0eb4\2\u0eb5\2\u0ebf\2\u0ebf\2\u0ec2\2\u0ec6\2\u0ec8\2\u0ec8"+
- "\2\u0ede\2\u0ee1\2\u0f02\2\u0f02\2\u0f42\2\u0f49\2\u0f4b\2\u0f6e\2\u0f8a"+
- "\2\u0f8e\2\u1002\2\u102c\2\u1041\2\u1041\2\u1052\2\u1057\2\u105c\2\u105f"+
- "\2\u1063\2\u1063\2\u1067\2\u1068\2\u1070\2\u1072\2\u1077\2\u1083\2\u1090"+
- "\2\u1090\2\u10a2\2\u10c7\2\u10c9\2\u10c9\2\u10cf\2\u10cf\2\u10d2\2\u10fc"+
- "\2\u10fe\2\u124a\2\u124c\2\u124f\2\u1252\2\u1258\2\u125a\2\u125a\2\u125c"+
- "\2\u125f\2\u1262\2\u128a\2\u128c\2\u128f\2\u1292\2\u12b2\2\u12b4\2\u12b7"+
- "\2\u12ba\2\u12c0\2\u12c2\2\u12c2\2\u12c4\2\u12c7\2\u12ca\2\u12d8\2\u12da"+
- "\2\u1312\2\u1314\2\u1317\2\u131a\2\u135c\2\u1382\2\u1391\2\u13a2\2\u13f7"+
- "\2\u13fa\2\u13ff\2\u1403\2\u166e\2\u1671\2\u1681\2\u1683\2\u169c\2\u16a2"+
- "\2\u16ec\2\u16f3\2\u16fa\2\u1702\2\u170e\2\u1710\2\u1713\2\u1722\2\u1733"+
- "\2\u1742\2\u1753\2\u1762\2\u176e\2\u1770\2\u1772\2\u1782\2\u17b5\2\u17d9"+
- "\2\u17d9\2\u17de\2\u17de\2\u1822\2\u1879\2\u1882\2\u1886\2\u1889\2\u18aa"+
- "\2\u18ac\2\u18ac\2\u18b2\2\u18f7\2\u1902\2\u1920\2\u1952\2\u196f\2\u1972"+
- "\2\u1976\2\u1982\2\u19ad\2\u19b2\2\u19cb\2\u1a02\2\u1a18\2\u1a22\2\u1a56"+
- "\2\u1aa9\2\u1aa9\2\u1b07\2\u1b35\2\u1b47\2\u1b4d\2\u1b85\2\u1ba2\2\u1bb0"+
- "\2\u1bb1\2\u1bbc\2\u1be7\2\u1c02\2\u1c25\2\u1c4f\2\u1c51\2\u1c5c\2\u1c7f"+
- "\2\u1c82\2\u1c8a\2\u1ceb\2\u1cee\2\u1cf0\2\u1cf3\2\u1cf7\2\u1cf8\2\u1d02"+
- "\2\u1dc1\2\u1e02\2\u1f17\2\u1f1a\2\u1f1f\2\u1f22\2\u1f47\2\u1f4a\2\u1f4f"+
- "\2\u1f52\2\u1f59\2\u1f5b\2\u1f5b\2\u1f5d\2\u1f5d\2\u1f5f\2\u1f5f\2\u1f61"+
- "\2\u1f7f\2\u1f82\2\u1fb6\2\u1fb8\2\u1fbe\2\u1fc0\2\u1fc0\2\u1fc4\2\u1fc6"+
- "\2\u1fc8\2\u1fce\2\u1fd2\2\u1fd5\2\u1fd8\2\u1fdd\2\u1fe2\2\u1fee\2\u1ff4"+
- "\2\u1ff6\2\u1ff8\2\u1ffe\2\u2073\2\u2073\2\u2081\2\u2081\2\u2092\2\u209e"+
- "\2\u2104\2\u2104\2\u2109\2\u2109\2\u210c\2\u2115\2\u2117\2\u2117\2\u211b"+
- "\2\u211f\2\u2126\2\u2126\2\u2128\2\u2128\2\u212a\2\u212a\2\u212c\2\u212f"+
- "\2\u2131\2\u213b\2\u213e\2\u2141\2\u2147\2\u214b\2\u2150\2\u2150\2\u2185"+
- "\2\u2186\2\u2c02\2\u2c30\2\u2c32\2\u2c60\2\u2c62\2\u2ce6\2\u2ced\2\u2cf0"+
- "\2\u2cf4\2\u2cf5\2\u2d02\2\u2d27\2\u2d29\2\u2d29\2\u2d2f\2\u2d2f\2\u2d32"+
- "\2\u2d69\2\u2d71\2\u2d71\2\u2d82\2\u2d98\2\u2da2\2\u2da8\2\u2daa\2\u2db0"+
- "\2\u2db2\2\u2db8\2\u2dba\2\u2dc0\2\u2dc2\2\u2dc8\2\u2dca\2\u2dd0\2\u2dd2"+
- "\2\u2dd8\2\u2dda\2\u2de0\2\u2e31\2\u2e31\2\u3007\2\u3008\2\u3033\2\u3037"+
- "\2\u303d\2\u303e\2\u3043\2\u3098\2\u309f\2\u30a1\2\u30a3\2\u30fc\2\u30fe"+
- "\2\u3101\2\u3107\2\u3130\2\u3133\2\u3190\2\u31a2\2\u31bc\2\u31f2\2\u3201"+
- "\2\u3402\2\u4db7\2\u4e02\2\u9fec\2\ua002\2\ua48e\2\ua4d2\2\ua4ff\2\ua502"+
- "\2\ua60e\2\ua612\2\ua621\2\ua62c\2\ua62d\2\ua642\2\ua670\2\ua681\2\ua69f"+
- "\2\ua6a2\2\ua6e7\2\ua719\2\ua721\2\ua724\2\ua78a\2\ua78d\2\ua7b0\2\ua7b2"+
- "\2\ua7b9\2\ua7f9\2\ua803\2\ua805\2\ua807\2\ua809\2\ua80c\2\ua80e\2\ua824"+
- "\2\ua842\2\ua875\2\ua884\2\ua8b5\2\ua8f4\2\ua8f9\2\ua8fd\2\ua8fd\2\ua8ff"+
- "\2\ua8ff\2\ua90c\2\ua927\2\ua932\2\ua948\2\ua962\2\ua97e\2\ua986\2\ua9b4"+
- "\2\ua9d1\2\ua9d1\2\ua9e2\2\ua9e6\2\ua9e8\2\ua9f1\2\ua9fc\2\uaa00\2\uaa02"+
- "\2\uaa2a\2\uaa42\2\uaa44\2\uaa46\2\uaa4d\2\uaa62\2\uaa78\2\uaa7c\2\uaa7c"+
- "\2\uaa80\2\uaab1\2\uaab3\2\uaab3\2\uaab7\2\uaab8\2\uaabb\2\uaabf\2\uaac2"+
- "\2\uaac2\2\uaac4\2\uaac4\2\uaadd\2\uaadf\2\uaae2\2\uaaec\2\uaaf4\2\uaaf6"+
- "\2\uab03\2\uab08\2\uab0b\2\uab10\2\uab13\2\uab18\2\uab22\2\uab28\2\uab2a"+
- "\2\uab30\2\uab32\2\uab5c\2\uab5e\2\uab67\2\uab72\2\uabe4\2\uac02\2\ud7a5"+
- "\2\ud7b2\2\ud7c8\2\ud7cd\2\ud7fd\2\uf902\2\ufa6f\2\ufa72\2\ufadb\2\ufb02"+
- "\2\ufb08\2\ufb15\2\ufb19\2\ufb1f\2\ufb1f\2\ufb21\2\ufb2a\2\ufb2c\2\ufb38"+
- "\2\ufb3a\2\ufb3e\2\ufb40\2\ufb40\2\ufb42\2\ufb43\2\ufb45\2\ufb46\2\ufb48"+
- "\2\ufbb3\2\ufbd5\2\ufd3f\2\ufd52\2\ufd91\2\ufd94\2\ufdc9\2\ufdf2\2\ufdfd"+
- "\2\ufe72\2\ufe76\2\ufe78\2\ufefe\2\uff23\2\uff3c\2\uff43\2\uff5c\2\uff68"+
- "\2\uffc0\2\uffc4\2\uffc9\2\uffcc\2\uffd1\2\uffd4\2\uffd9\2\uffdc\2\uffde"+
- "\2\2\3\r\3\17\3(\3*\3<\3>\3?\3A\3O\3R\3_\3\u0082\3\u00fc\3\u0282\3\u029e"+
- "\3\u02a2\3\u02d2\3\u0302\3\u0321\3\u032f\3\u0342\3\u0344\3\u034b\3\u0352"+
- "\3\u0377\3\u0382\3\u039f\3\u03a2\3\u03c5\3\u03ca\3\u03d1\3\u0402\3\u049f"+
- "\3\u04b2\3\u04d5\3\u04da\3\u04fd\3\u0502\3\u0529\3\u0532\3\u0565\3\u0602"+
- "\3\u0738\3\u0742\3\u0757\3\u0762\3\u0769\3\u0802\3\u0807\3\u080a\3\u080a"+
- "\3\u080c\3\u0837\3\u0839\3\u083a\3\u083e\3\u083e\3\u0841\3\u0857\3\u0862"+
- "\3\u0878\3\u0882\3\u08a0\3\u08e2\3\u08f4\3\u08f6\3\u08f7\3\u0902\3\u0917"+
- "\3\u0922\3\u093b\3\u0982\3\u09b9\3\u09c0\3\u09c1\3\u0a02\3\u0a02\3\u0a12"+
- "\3\u0a15\3\u0a17\3\u0a19\3\u0a1b\3\u0a35\3\u0a62\3\u0a7e\3\u0a82\3\u0a9e"+
- "\3\u0ac2\3\u0ac9\3\u0acb\3\u0ae6\3\u0b02\3\u0b37\3\u0b42\3\u0b57\3\u0b62"+
- "\3\u0b74\3\u0b82\3\u0b93\3\u0c02\3\u0c4a\3\u0c82\3\u0cb4\3\u0cc2\3\u0cf4"+
- "\3\u1005\3\u1039\3\u1085\3\u10b1\3\u10d2\3\u10ea\3\u1105\3\u1128\3\u1152"+
- "\3\u1174\3\u1178\3\u1178\3\u1185\3\u11b4\3\u11c3\3\u11c6\3\u11dc\3\u11dc"+
- "\3\u11de\3\u11de\3\u1202\3\u1213\3\u1215\3\u122d\3\u1282\3\u1288\3\u128a"+
- "\3\u128a\3\u128c\3\u128f\3\u1291\3\u129f\3\u12a1\3\u12aa\3\u12b2\3\u12e0"+
- "\3\u1307\3\u130e\3\u1311\3\u1312\3\u1315\3\u132a\3\u132c\3\u1332\3\u1334"+
- "\3\u1335\3\u1337\3\u133b\3\u133f\3\u133f\3\u1352\3\u1352\3\u135f\3\u1363"+
- "\3\u1402\3\u1436\3\u1449\3\u144c\3\u1482\3\u14b1\3\u14c6\3\u14c7\3\u14c9"+
- "\3\u14c9\3\u1582\3\u15b0\3\u15da\3\u15dd\3\u1602\3\u1631\3\u1646\3\u1646"+
- "\3\u1682\3\u16ac\3\u1702\3\u171b\3\u18a2\3\u18e1\3\u1901\3\u1901\3\u1a02"+
- "\3\u1a02\3\u1a0d\3\u1a34\3\u1a3c\3\u1a3c\3\u1a52\3\u1a52\3\u1a5e\3\u1a85"+
- "\3\u1a88\3\u1a8b\3\u1ac2\3\u1afa\3\u1c02\3\u1c0a\3\u1c0c\3\u1c30\3\u1c42"+
- "\3\u1c42\3\u1c74\3\u1c91\3\u1d02\3\u1d08\3\u1d0a\3\u1d0b\3\u1d0d\3\u1d32"+
- "\3\u1d48\3\u1d48\3\u2002\3\u239b\3\u2482\3\u2545\3\u3002\3\u3430\3\u4402"+
- "\3\u4648\3\u6802\3\u6a3a\3\u6a42\3\u6a60\3\u6ad2\3\u6aef\3\u6b02\3\u6b31"+
- "\3\u6b42\3\u6b45\3\u6b65\3\u6b79\3\u6b7f\3\u6b91\3\u6f02\3\u6f46\3\u6f52"+
- "\3\u6f52\3\u6f95\3\u6fa1\3\u6fe2\3\u6fe3\3\u7002\3\u87ee\3\u8802\3\u8af4"+
- "\3\ub002\3\ub120\3\ub172\3\ub2fd\3\ubc02\3\ubc6c\3\ubc72\3\ubc7e\3\ubc82"+
- "\3\ubc8a\3\ubc92\3\ubc9b\3\ud402\3\ud456\3\ud458\3\ud49e\3\ud4a0\3\ud4a1"+
- "\3\ud4a4\3\ud4a4\3\ud4a7\3\ud4a8\3\ud4ab\3\ud4ae\3\ud4b0\3\ud4bb\3\ud4bd"+
- "\3\ud4bd\3\ud4bf\3\ud4c5\3\ud4c7\3\ud507\3\ud509\3\ud50c\3\ud50f\3\ud516"+
- "\3\ud518\3\ud51e\3\ud520\3\ud53b\3\ud53d\3\ud540\3\ud542\3\ud546\3\ud548"+
- "\3\ud548\3\ud54c\3\ud552\3\ud554\3\ud6a7\3\ud6aa\3\ud6c2\3\ud6c4\3\ud6dc"+
- "\3\ud6de\3\ud6fc\3\ud6fe\3\ud716\3\ud718\3\ud736\3\ud738\3\ud750\3\ud752"+
- "\3\ud770\3\ud772\3\ud78a\3\ud78c\3\ud7aa\3\ud7ac\3\ud7c4\3\ud7c6\3\ud7cd"+
- "\3\ue802\3\ue8c6\3\ue902\3\ue945\3\uee02\3\uee05\3\uee07\3\uee21\3\uee23"+
- "\3\uee24\3\uee26\3\uee26\3\uee29\3\uee29\3\uee2b\3\uee34\3\uee36\3\uee39"+
- "\3\uee3b\3\uee3b\3\uee3d\3\uee3d\3\uee44\3\uee44\3\uee49\3\uee49\3\uee4b"+
- "\3\uee4b\3\uee4d\3\uee4d\3\uee4f\3\uee51\3\uee53\3\uee54\3\uee56\3\uee56"+
- "\3\uee59\3\uee59\3\uee5b\3\uee5b\3\uee5d\3\uee5d\3\uee5f\3\uee5f\3\uee61"+
- "\3\uee61\3\uee63\3\uee64\3\uee66\3\uee66\3\uee69\3\uee6c\3\uee6e\3\uee74"+
- "\3\uee76\3\uee79\3\uee7b\3\uee7e\3\uee80\3\uee80\3\uee82\3\uee8b\3\uee8d"+
- "\3\uee9d\3\ueea3\3\ueea5\3\ueea7\3\ueeab\3\ueead\3\ueebd\3\2\4\ua6d8\4"+
- "\ua702\4\ub736\4\ub742\4\ub81f\4\ub822\4\ucea3\4\uceb2\4\uebe2\4\uf802"+
- "\4\ufa1f\4\u05ee\2\4\3\2\2\2\2\6\3\2\2\2\2\b\3\2\2\2\2\n\3\2\2\2\2\f\3"+
- "\2\2\2\2\16\3\2\2\2\2\20\3\2\2\2\2\22\3\2\2\2\2\24\3\2\2\2\2\26\3\2\2"+
- "\2\2\30\3\2\2\2\2\32\3\2\2\2\2\34\3\2\2\2\2\36\3\2\2\2\2 \3\2\2\2\2\""+
- "\3\2\2\2\2$\3\2\2\2\2&\3\2\2\2\2(\3\2\2\2\2*\3\2\2\2\2,\3\2\2\2\2.\3\2"+
- "\2\2\2\60\3\2\2\2\2\62\3\2\2\2\2\64\3\2\2\2\2\66\3\2\2\2\28\3\2\2\2\2"+
- ":\3\2\2\2\2<\3\2\2\2\2>\3\2\2\2\2@\3\2\2\2\2B\3\2\2\2\2D\3\2\2\2\2F\3"+
- "\2\2\2\2H\3\2\2\2\2J\3\2\2\2\2L\3\2\2\2\2N\3\2\2\2\2P\3\2\2\2\2R\3\2\2"+
- "\2\2T\3\2\2\2\2V\3\2\2\2\2X\3\2\2\2\2Z\3\2\2\2\2\\\3\2\2\2\2^\3\2\2\2"+
- "\2`\3\2\2\2\2b\3\2\2\2\2d\3\2\2\2\2f\3\2\2\2\2h\3\2\2\2\2j\3\2\2\2\2l"+
- "\3\2\2\2\2n\3\2\2\2\2p\3\2\2\2\2r\3\2\2\2\2t\3\2\2\2\2v\3\2\2\2\2x\3\2"+
- "\2\2\2z\3\2\2\2\2|\3\2\2\2\2~\3\2\2\2\2\u0080\3\2\2\2\2\u0082\3\2\2\2"+
- "\2\u0084\3\2\2\2\2\u0086\3\2\2\2\2\u0088\3\2\2\2\2\u008a\3\2\2\2\2\u008c"+
- "\3\2\2\2\2\u008e\3\2\2\2\2\u0090\3\2\2\2\2\u0092\3\2\2\2\2\u0094\3\2\2"+
- "\2\2\u0096\3\2\2\2\2\u0098\3\2\2\2\2\u009a\3\2\2\2\2\u009c\3\2\2\2\2\u009e"+
- "\3\2\2\2\2\u00a0\3\2\2\2\2\u00a2\3\2\2\2\2\u00a4\3\2\2\2\2\u00a6\3\2\2"+
- "\2\2\u00a8\3\2\2\2\2\u00aa\3\2\2\2\2\u00ac\3\2\2\2\2\u00ae\3\2\2\2\2\u00b0"+
- "\3\2\2\2\2\u00b2\3\2\2\2\2\u00b4\3\2\2\2\2\u00b6\3\2\2\2\2\u00b8\3\2\2"+
- "\2\2\u00ba\3\2\2\2\2\u00bc\3\2\2\2\2\u00be\3\2\2\2\2\u00c0\3\2\2\2\2\u00c2"+
- "\3\2\2\2\2\u00c4\3\2\2\2\2\u00c6\3\2\2\2\2\u00c8\3\2\2\2\2\u00ca\3\2\2"+
- "\2\2\u00cc\3\2\2\2\2\u00ce\3\2\2\2\2\u00d0\3\2\2\2\2\u00d2\3\2\2\2\2\u00d4"+
- "\3\2\2\2\2\u00d6\3\2\2\2\2\u00d8\3\2\2\2\2\u00da\3\2\2\2\2\u00dc\3\2\2"+
- "\2\2\u00de\3\2\2\2\2\u00e0\3\2\2\2\2\u00e2\3\2\2\2\2\u00e4\3\2\2\2\2\u00e6"+
- "\3\2\2\2\2\u00e8\3\2\2\2\2\u00ea\3\2\2\2\2\u00ec\3\2\2\2\2\u00ee\3\2\2"+
- "\2\2\u00f0\3\2\2\2\2\u00f2\3\2\2\2\2\u00f4\3\2\2\2\2\u00f6\3\2\2\2\2\u00f8"+
- "\3\2\2\2\2\u00fa\3\2\2\2\2\u00fc\3\2\2\2\2\u00fe\3\2\2\2\2\u0100\3\2\2"+
- "\2\2\u0102\3\2\2\2\2\u0104\3\2\2\2\2\u0106\3\2\2\2\2\u0108\3\2\2\2\2\u010a"+
- "\3\2\2\2\2\u010c\3\2\2\2\2\u010e\3\2\2\2\2\u0110\3\2\2\2\2\u0112\3\2\2"+
- "\2\2\u0114\3\2\2\2\2\u0116\3\2\2\2\2\u0118\3\2\2\2\2\u011e\3\2\2\2\2\u0122"+
- "\3\2\2\2\2\u0124\3\2\2\2\2\u0126\3\2\2\2\2\u0128\3\2\2\2\2\u012a\3\2\2"+
- "\2\2\u012c\3\2\2\2\2\u012e\3\2\2\2\2\u0130\3\2\2\2\2\u0132\3\2\2\2\2\u0134"+
- "\3\2\2\2\2\u0136\3\2\2\2\2\u0138\3\2\2\2\3\u014e\3\2\2\2\3\u0150\3\2\2"+
- "\2\3\u0152\3\2\2\2\3\u0154\3\2\2\2\3\u0156\3\2\2\2\4\u015a\3\2\2\2\6\u0170"+
- "\3\2\2\2\b\u0172\3\2\2\2\n\u0179\3\2\2\2\f\u0181\3\2\2\2\16\u0188\3\2"+
- "\2\2\20\u018f\3\2\2\2\22\u0196\3\2\2\2\24\u019d\3\2\2\2\26\u01a6\3\2\2"+
- "\2\30\u01b0\3\2\2\2\32\u01b8\3\2\2\2\34\u01c2\3\2\2\2\36\u01ce\3\2\2\2"+
- " \u01d5\3\2\2\2\"\u01e0\3\2\2\2$\u01e3\3\2\2\2&\u01e9\3\2\2\2(\u01f2\3"+
- "\2\2\2*\u01f7\3\2\2\2,\u01fe\3\2\2\2.\u0205\3\2\2\2\60\u020b\3\2\2\2\62"+
- "\u0210\3\2\2\2\64\u0217\3\2\2\2\66\u0221\3\2\2\28\u0227\3\2\2\2:\u022a"+
- "\3\2\2\2<\u022c\3\2\2\2>\u0233\3\2\2\2@\u0239\3\2\2\2B\u0246\3\2\2\2D"+
- "\u024f\3\2\2\2F\u0253\3\2\2\2H\u0257\3\2\2\2J\u025d\3\2\2\2L\u025f\3\2"+
- "\2\2N\u0262\3\2\2\2P\u0267\3\2\2\2R\u026d\3\2\2\2T\u0273\3\2\2\2V\u027a"+
- "\3\2\2\2X\u0281\3\2\2\2Z\u028a\3\2\2\2\\\u0290\3\2\2\2^\u0296\3\2\2\2"+
- "`\u029d\3\2\2\2b\u02a3\3\2\2\2d\u02aa\3\2\2\2f\u02b0\3\2\2\2h\u02b9\3"+
- "\2\2\2j\u02c1\3\2\2\2l\u02c8\3\2\2\2n\u02cd\3\2\2\2p\u02d6\3\2\2\2r\u02e5"+
- "\3\2\2\2t\u02eb\3\2\2\2v\u02ef\3\2\2\2x\u02f2\3\2\2\2z\u02f9\3\2\2\2|"+
- "\u0303\3\2\2\2~\u030d\3\2\2\2\u0080\u0319\3\2\2\2\u0082\u0322\3\2\2\2"+
- "\u0084\u032c\3\2\2\2\u0086\u0334\3\2\2\2\u0088\u0340\3\2\2\2\u008a\u034f"+
- "\3\2\2\2\u008c\u0355\3\2\2\2\u008e\u0359\3\2\2\2\u0090\u035d\3\2\2\2\u0092"+
- "\u0362\3\2\2\2\u0094\u036a\3\2\2\2\u0096\u0372\3\2\2\2\u0098\u0377\3\2"+
- "\2\2\u009a\u0381\3\2\2\2\u009c\u0388\3\2\2\2\u009e\u038d\3\2\2\2\u00a0"+
- "\u0393\3\2\2\2\u00a2\u0396\3\2\2\2\u00a4\u039a\3\2\2\2\u00a6\u03a1\3\2"+
- "\2\2\u00a8\u03a6\3\2\2\2\u00aa\u03ab\3\2\2\2\u00ac\u03b0\3\2\2\2\u00ae"+
- "\u03b8\3\2\2\2\u00b0\u03bf\3\2\2\2\u00b2\u03c5\3\2\2\2\u00b4\u03d3\3\2"+
- "\2\2\u00b6\u03d6\3\2\2\2\u00b8\u03dc\3\2\2\2\u00ba\u03e1\3\2\2\2\u00bc"+
- "\u03ec\3\2\2\2\u00be\u03f0\3\2\2\2\u00c0\u03f7\3\2\2\2\u00c2\u0400\3\2"+
- "\2\2\u00c4\u0404\3\2\2\2\u00c6\u040a\3\2\2\2\u00c8\u0414\3\2\2\2\u00ca"+
- "\u0416\3\2\2\2\u00cc\u041a\3\2\2\2\u00ce\u041c\3\2\2\2\u00d0\u0420\3\2"+
- "\2\2\u00d2\u0422\3\2\2\2\u00d4\u0426\3\2\2\2\u00d6\u0428\3\2\2\2\u00d8"+
- "\u042a\3\2\2\2\u00da\u042c\3\2\2\2\u00dc\u042e\3\2\2\2\u00de\u0430\3\2"+
- "\2\2\u00e0\u0435\3\2\2\2\u00e2\u043a\3\2\2\2\u00e4\u043d\3\2\2\2\u00e6"+
- "\u0441\3\2\2\2\u00e8\u0444\3\2\2\2\u00ea\u0447\3\2\2\2\u00ec\u044a\3\2"+
- "\2\2\u00ee\u044d\3\2\2\2\u00f0\u044f\3\2\2\2\u00f2\u0452\3\2\2\2\u00f4"+
- "\u0454\3\2\2\2\u00f6\u0457\3\2\2\2\u00f8\u0459\3\2\2\2\u00fa\u045b\3\2"+
- "\2\2\u00fc\u045d\3\2\2\2\u00fe\u0460\3\2\2\2\u0100\u0463\3\2\2\2\u0102"+
- "\u0466\3\2\2\2\u0104\u0468\3\2\2\2\u0106\u046a\3\2\2\2\u0108\u046c\3\2"+
- "\2\2\u010a\u046e\3\2\2\2\u010c\u0470\3\2\2\2\u010e\u0472\3\2\2\2\u0110"+
- "\u0480\3\2\2\2\u0112\u0484\3\2\2\2\u0114\u0490\3\2\2\2\u0116\u049e\3\2"+
- "\2\2\u0118\u04aa\3\2\2\2\u011a\u04ce\3\2\2\2\u011c\u04d0\3\2\2\2\u011e"+
- "\u04d9\3\2\2\2\u0120\u04df\3\2\2\2\u0122\u04e6\3\2\2\2\u0124\u04ec\3\2"+
- "\2\2\u0126\u04ee\3\2\2\2\u0128\u04f3\3\2\2\2\u012a\u04f8\3\2\2\2\u012c"+
- "\u04ff\3\2\2\2\u012e\u050a\3\2\2\2\u0130\u0515\3\2\2\2\u0132\u0522\3\2"+
- "\2\2\u0134\u0528\3\2\2\2\u0136\u0537\3\2\2\2\u0138\u053d\3\2\2\2\u013a"+
- "\u054c\3\2\2\2\u013c\u054e\3\2\2\2\u013e\u056a\3\2\2\2\u0140\u0574\3\2"+
- "\2\2\u0142\u0576\3\2\2\2\u0144\u0578\3\2\2\2\u0146\u057a\3\2\2\2\u0148"+
- "\u0582\3\2\2\2\u014a\u0584\3\2\2\2\u014c\u0586\3\2\2\2\u014e\u0589\3\2"+
- "\2\2\u0150\u058f\3\2\2\2\u0152\u059d\3\2\2\2\u0154\u05ba\3\2\2\2\u0156"+
- "\u05be\3\2\2\2\u0158\u015b\5\6\3\2\u0159\u015b\5\u0118\u008c\2\u015a\u0158"+
- "\3\2\2\2\u015a\u0159\3\2\2\2\u015b\u015c\3\2\2\2\u015c\u015d\b\2\2\2\u015d"+
- "\5\3\2\2\2\u015e\u0168\5\u013e\u009f\2\u015f\u0160\7\60\2\2\u0160\u0162"+
- "\6\3\2\2\u0161\u0163\5\u013e\u009f\2\u0162\u0161\3\2\2\2\u0162\u0163\3"+
- "\2\2\2\u0163\u0165\3\2\2\2\u0164\u0166\5\u0146\u00a3\2\u0165\u0164\3\2"+
- "\2\2\u0165\u0166\3\2\2\2\u0166\u0169\3\2\2\2\u0167\u0169\5\u0146\u00a3"+
- "\2\u0168\u015f\3\2\2\2\u0168\u0167\3\2\2\2\u0169\u0171\3\2\2\2\u016a\u016b"+
- "\7\60\2\2\u016b\u016c\6\3\3\2\u016c\u016e\5\u013e\u009f\2\u016d\u016f"+
- "\5\u0146\u00a3\2\u016e\u016d\3\2\2\2\u016e\u016f\3\2\2\2\u016f\u0171\3"+
- "\2\2\2\u0170\u015e\3\2\2\2\u0170\u016a\3\2\2\2\u0171\7\3\2\2\2\u0172\u0173"+
- "\7v\2\2\u0173\u0174\7t\2\2\u0174\u0175\7w\2\2\u0175\u0176\7g\2\2\u0176"+
- "\u0177\3\2\2\2\u0177\u0178\b\4\2\2\u0178\t\3\2\2\2\u0179\u017a\7h\2\2"+
- "\u017a\u017b\7c\2\2\u017b\u017c\7n\2\2\u017c\u017d\7u\2\2\u017d\u017e"+
- "\7g\2\2\u017e\u017f\3\2\2\2\u017f\u0180\b\5\2\2\u0180\13\3\2\2\2\u0181"+
- "\u0182\7c\2\2\u0182\u0183\7u\2\2\u0183\u0184\7u\2\2\u0184\u0185\7g\2\2"+
- "\u0185\u0186\7t\2\2\u0186\u0187\7v\2\2\u0187\r\3\2\2\2\u0188\u0189\7c"+
- "\2\2\u0189\u018a\7u\2\2\u018a\u018b\7u\2\2\u018b\u018c\7w\2\2\u018c\u018d"+
- "\7o\2\2\u018d\u018e\7g\2\2\u018e\17\3\2\2\2\u018f\u0190\7k\2\2\u0190\u0191"+
- "\7p\2\2\u0191\u0192\7j\2\2\u0192\u0193\7c\2\2\u0193\u0194\7n\2\2\u0194"+
- "\u0195\7g\2\2\u0195\21\3\2\2\2\u0196\u0197\7g\2\2\u0197\u0198\7z\2\2\u0198"+
- "\u0199\7j\2\2\u0199\u019a\7c\2\2\u019a\u019b\7n\2\2\u019b\u019c\7g\2\2"+
- "\u019c\23\3\2\2\2\u019d\u019e\7t\2\2\u019e\u019f\7g\2\2\u019f\u01a0\7"+
- "s\2\2\u01a0\u01a1\7w\2\2\u01a1\u01a2\7k\2\2\u01a2\u01a3\7t\2\2\u01a3\u01a4"+
- "\7g\2\2\u01a4\u01a5\7u\2\2\u01a5\25\3\2\2\2\u01a6\u01a7\7r\2\2\u01a7\u01a8"+
- "\7t\2\2\u01a8\u01a9\7g\2\2\u01a9\u01aa\7u\2\2\u01aa\u01ab\7g\2\2\u01ab"+
- "\u01ac\7t\2\2\u01ac\u01ad\7x\2\2\u01ad\u01ae\7g\2\2\u01ae\u01af\7u\2\2"+
- "\u01af\27\3\2\2\2\u01b0\u01b1\7g\2\2\u01b1\u01b2\7p\2\2\u01b2\u01b3\7"+
- "u\2\2\u01b3\u01b4\7w\2\2\u01b4\u01b5\7t\2\2\u01b5\u01b6\7g\2\2\u01b6\u01b7"+
- "\7u\2\2\u01b7\31\3\2\2\2\u01b8\u01b9\7k\2\2\u01b9\u01ba\7p\2\2\u01ba\u01bb"+
- "\7x\2\2\u01bb\u01bc\7c\2\2\u01bc\u01bd\7t\2\2\u01bd\u01be\7k\2\2\u01be"+
- "\u01bf\7c\2\2\u01bf\u01c0\7p\2\2\u01c0\u01c1\7v\2\2\u01c1\33\3\2\2\2\u01c2"+
- "\u01c3\7f\2\2\u01c3\u01c4\7g\2\2\u01c4\u01c5\7e\2\2\u01c5\u01c6\7t\2\2"+
- "\u01c6\u01c7\7g\2\2\u01c7\u01c8\7c\2\2\u01c8\u01c9\7u\2\2\u01c9\u01ca"+
- "\7g\2\2\u01ca\u01cb\7u\2\2\u01cb\u01cc\3\2\2\2\u01cc\u01cd\b\16\2\2\u01cd"+
- "\35\3\2\2\2\u01ce\u01cf\7r\2\2\u01cf\u01d0\7w\2\2\u01d0\u01d1\7t\2\2\u01d1"+
- "\u01d2\7g\2\2\u01d2\u01d3\3\2\2\2\u01d3\u01d4\b\17\2\2\u01d4\37\3\2\2"+
- "\2\u01d5\u01d6\7k\2\2\u01d6\u01d7\7o\2\2\u01d7\u01d8\7r\2\2\u01d8\u01d9"+
- "\7n\2\2\u01d9\u01da\7g\2\2\u01da\u01db\7o\2\2\u01db\u01dc\7g\2\2\u01dc"+
- "\u01dd\7p\2\2\u01dd\u01de\7v\2\2\u01de\u01df\7u\2\2\u01df!\3\2\2\2\u01e0"+
- "\u01e1\7c\2\2\u01e1\u01e2\7u\2\2\u01e2#\3\2\2\2\u01e3\u01e4\7q\2\2\u01e4"+
- "\u01e5\7n\2\2\u01e5\u01e6\7f\2\2\u01e6\u01e7\3\2\2\2\u01e7\u01e8\b\22"+
- "\2\2\u01e8%\3\2\2\2\u01e9\u01ea\7d\2\2\u01ea\u01eb\7g\2\2\u01eb\u01ec"+
- "\7h\2\2\u01ec\u01ed\7q\2\2\u01ed\u01ee\7t\2\2\u01ee\u01ef\7g\2\2\u01ef"+
- "\u01f0\3\2\2\2\u01f0\u01f1\b\23\2\2\u01f1\'\3\2\2\2\u01f2\u01f3\7%\2\2"+
- "\u01f3\u01f4\7n\2\2\u01f4\u01f5\7j\2\2\u01f5\u01f6\7u\2\2\u01f6)\3\2\2"+
- "\2\u01f7\u01f8\7h\2\2\u01f8\u01f9\7q\2\2\u01f9\u01fa\7t\2\2\u01fa\u01fb"+
- "\7c\2\2\u01fb\u01fc\7n\2\2\u01fc\u01fd\7n\2\2\u01fd+\3\2\2\2\u01fe\u01ff"+
- "\7g\2\2\u01ff\u0200\7z\2\2\u0200\u0201\7k\2\2\u0201\u0202\7u\2\2\u0202"+
- "\u0203\7v\2\2\u0203\u0204\7u\2\2\u0204-\3\2\2\2\u0205\u0206\7c\2\2\u0206"+
- "\u0207\7e\2\2\u0207\u0208\7e\2\2\u0208\u0209\3\2\2\2\u0209\u020a\b\27"+
- "\2\2\u020a/\3\2\2\2\u020b\u020c\7h\2\2\u020c\u020d\7q\2\2\u020d\u020e"+
- "\7n\2\2\u020e\u020f\7f\2\2\u020f\61\3\2\2\2\u0210\u0211\7w\2\2\u0211\u0212"+
- "\7p\2\2\u0212\u0213\7h\2\2\u0213\u0214\7q\2\2\u0214\u0215\7n\2\2\u0215"+
- "\u0216\7f\2\2\u0216\63\3\2\2\2\u0217\u0218\7w\2\2\u0218\u0219\7p\2\2\u0219"+
- "\u021a\7h\2\2\u021a\u021b\7q\2\2\u021b\u021c\7n\2\2\u021c\u021d\7f\2\2"+
- "\u021d\u021e\7k\2\2\u021e\u021f\7p\2\2\u021f\u0220\7i\2\2\u0220\65\3\2"+
- "\2\2\u0221\u0222\7i\2\2\u0222\u0223\7j\2\2\u0223\u0224\7q\2\2\u0224\u0225"+
- "\7u\2\2\u0225\u0226\7v\2\2\u0226\67\3\2\2\2\u0227\u0228\7k\2\2\u0228\u0229"+
- "\7p\2\2\u02299\3\2\2\2\u022a\u022b\7%\2\2\u022b;\3\2\2\2\u022c\u022d\7"+
- "u\2\2\u022d\u022e\7w\2\2\u022e\u022f\7d\2\2\u022f\u0230\7u\2\2\u0230\u0231"+
- "\7g\2\2\u0231\u0232\7v\2\2\u0232=\3\2\2\2\u0233\u0234\7w\2\2\u0234\u0235"+
- "\7p\2\2\u0235\u0236\7k\2\2\u0236\u0237\7q\2\2\u0237\u0238\7p\2\2\u0238"+
- "?\3\2\2\2\u0239\u023a\7k\2\2\u023a\u023b\7p\2\2\u023b\u023c\7v\2\2\u023c"+
- "\u023d\7g\2\2\u023d\u023e\7t\2\2\u023e\u023f\7u\2\2\u023f\u0240\7g\2\2"+
- "\u0240\u0241\7e\2\2\u0241\u0242\7v\2\2\u0242\u0243\7k\2\2\u0243\u0244"+
- "\7q\2\2\u0244\u0245\7p\2\2\u0245A\3\2\2\2\u0246\u0247\7u\2\2\u0247\u0248"+
- "\7g\2\2\u0248\u0249\7v\2\2\u0249\u024a\7o\2\2\u024a\u024b\7k\2\2\u024b"+
- "\u024c\7p\2\2\u024c\u024d\7w\2\2\u024d\u024e\7u\2\2\u024eC\3\2\2\2\u024f"+
- "\u0250\7?\2\2\u0250\u0251\7?\2\2\u0251\u0252\7@\2\2\u0252E\3\2\2\2\u0253"+
- "\u0254\7/\2\2\u0254\u0255\7/\2\2\u0255\u0256\7,\2\2\u0256G\3\2\2\2\u0257"+
- "\u0258\7c\2\2\u0258\u0259\7r\2\2\u0259\u025a\7r\2\2\u025a\u025b\7n\2\2"+
- "\u025b\u025c\7{\2\2\u025cI\3\2\2\2\u025d\u025e\7A\2\2\u025eK\3\2\2\2\u025f"+
- "\u0260\7#\2\2\u0260\u0261\7>\2\2\u0261M\3\2\2\2\u0262\u0263\7#\2\2\u0263"+
- "\u0264\7@\2\2\u0264\u0265\3\2\2\2\u0265\u0266\b\'\2\2\u0266O\3\2\2\2\u0267"+
- "\u0268\7u\2\2\u0268\u0269\7g\2\2\u0269\u026a\7s\2\2\u026a\u026b\3\2\2"+
- "\2\u026b\u026c\b(\2\2\u026cQ\3\2\2\2\u026d\u026e\7u\2\2\u026e\u026f\7"+
- "g\2\2\u026f\u0270\7v\2\2\u0270\u0271\3\2\2\2\u0271\u0272\b)\2\2\u0272"+
- "S\3\2\2\2\u0273\u0274\7o\2\2\u0274\u0275\7u\2\2\u0275\u0276\7g\2\2\u0276"+
- "\u0277\7v\2\2\u0277\u0278\3\2\2\2\u0278\u0279\b*\2\2\u0279U\3\2\2\2\u027a"+
- "\u027b\7f\2\2\u027b\u027c\7k\2\2\u027c\u027d\7e\2\2\u027d\u027e\7v\2\2"+
- "\u027e\u027f\3\2\2\2\u027f\u0280\b+\2\2\u0280W\3\2\2\2\u0281\u0282\7q"+
- "\2\2\u0282\u0283\7r\2\2\u0283\u0284\7v\2\2\u0284\u0285\7k\2\2\u0285\u0286"+
- "\7q\2\2\u0286\u0287\7p\2\2\u0287\u0288\3\2\2\2\u0288\u0289\b,\2\2\u0289"+
- "Y\3\2\2\2\u028a\u028b\7n\2\2\u028b\u028c\7g\2\2\u028c\u028d\7p\2\2\u028d"+
- "\u028e\3\2\2\2\u028e\u028f\b-\2\2\u028f[\3\2\2\2\u0290\u0291\7p\2\2\u0291"+
- "\u0292\7g\2\2\u0292\u0293\7y\2\2\u0293\u0294\3\2\2\2\u0294\u0295\b.\2"+
- "\2\u0295]\3\2\2\2\u0296\u0297\7o\2\2\u0297\u0298\7c\2\2\u0298\u0299\7"+
- "m\2\2\u0299\u029a\7g\2\2\u029a\u029b\3\2\2\2\u029b\u029c\b/\2\2\u029c"+
- "_\3\2\2\2\u029d\u029e\7e\2\2\u029e\u029f\7c\2\2\u029f\u02a0\7r\2\2\u02a0"+
- "\u02a1\3\2\2\2\u02a1\u02a2\b\60\2\2\u02a2a\3\2\2\2\u02a3\u02a4\7u\2\2"+
- "\u02a4\u02a5\7q\2\2\u02a5\u02a6\7o\2\2\u02a6\u02a7\7g\2\2\u02a7\u02a8"+
- "\3\2\2\2\u02a8\u02a9\b\61\2\2\u02a9c\3\2\2\2\u02aa\u02ab\7i\2\2\u02ab"+
- "\u02ac\7g\2\2\u02ac\u02ad\7v\2\2\u02ad\u02ae\3\2\2\2\u02ae\u02af\b\62"+
- "\2\2\u02afe\3\2\2\2\u02b0\u02b1\7f\2\2\u02b1\u02b2\7q\2\2\u02b2\u02b3"+
- "\7o\2\2\u02b3\u02b4\7c\2\2\u02b4\u02b5\7k\2\2\u02b5\u02b6\7p\2\2\u02b6"+
- "\u02b7\3\2\2\2\u02b7\u02b8\b\63\2\2\u02b8g\3\2\2\2\u02b9\u02ba\7c\2\2"+
- "\u02ba\u02bb\7z\2\2\u02bb\u02bc\7k\2\2\u02bc\u02bd\7q\2\2\u02bd\u02be"+
- "\7o\2\2\u02be\u02bf\3\2\2\2\u02bf\u02c0\b\64\2\2\u02c0i\3\2\2\2\u02c1"+
- "\u02c2\7p\2\2\u02c2\u02c3\7q\2\2\u02c3\u02c4\7p\2\2\u02c4\u02c5\7g\2\2"+
- "\u02c5\u02c6\3\2\2\2\u02c6\u02c7\b\65\2\2\u02c7k\3\2\2\2\u02c8\u02c9\7"+
- "r\2\2\u02c9\u02ca\7t\2\2\u02ca\u02cb\7g\2\2\u02cb\u02cc\7f\2\2\u02ccm"+
- "\3\2\2\2\u02cd\u02ce\7v\2\2\u02ce\u02cf\7{\2\2\u02cf\u02d0\7r\2\2\u02d0"+
- "\u02d1\7g\2\2\u02d1\u02d2\7Q\2\2\u02d2\u02d3\7h\2\2\u02d3\u02d4\3\2\2"+
- "\2\u02d4\u02d5\b\67\2\2\u02d5o\3\2\2\2\u02d6\u02d7\7k\2\2\u02d7\u02d8"+
- "\7u\2\2\u02d8\u02d9\7E\2\2\u02d9\u02da\7q\2\2\u02da\u02db\7o\2\2\u02db"+
- "\u02dc\7r\2\2\u02dc\u02dd\7c\2\2\u02dd\u02de\7t\2\2\u02de\u02df\7c\2\2"+
- "\u02df\u02e0\7d\2\2\u02e0\u02e1\7n\2\2\u02e1\u02e2\7g\2\2\u02e2\u02e3"+
- "\3\2\2\2\u02e3\u02e4\b8\2\2\u02e4q\3\2\2\2\u02e5\u02e6\7u\2\2\u02e6\u02e7"+
- "\7j\2\2\u02e7\u02e8\7c\2\2\u02e8\u02e9\7t\2\2\u02e9\u02ea\7g\2\2\u02ea"+
- "s\3\2\2\2\u02eb\u02ec\7B\2\2\u02ec\u02ed\3\2\2\2\u02ed\u02ee\b:\2\2\u02ee"+
- "u\3\2\2\2\u02ef\u02f0\7\60\2\2\u02f0\u02f1\7\60\2\2\u02f1w\3\2\2\2\u02f2"+
- "\u02f3\7u\2\2\u02f3\u02f4\7j\2\2\u02f4\u02f5\7c\2\2\u02f5\u02f6\7t\2\2"+
- "\u02f6\u02f7\7g\2\2\u02f7\u02f8\7f\2\2\u02f8y\3\2\2\2\u02f9\u02fa\7g\2"+
- "\2\u02fa\u02fb\7z\2\2\u02fb\u02fc\7e\2\2\u02fc\u02fd\7n\2\2\u02fd\u02fe"+
- "\7w\2\2\u02fe\u02ff\7u\2\2\u02ff\u0300\7k\2\2\u0300\u0301\7x\2\2\u0301"+
- "\u0302\7g\2\2\u0302{\3\2\2\2\u0303\u0304\7r\2\2\u0304\u0305\7t\2\2\u0305"+
- "\u0306\7g\2\2\u0306\u0307\7f\2\2\u0307\u0308\7k\2\2\u0308\u0309\7e\2\2"+
- "\u0309\u030a\7c\2\2\u030a\u030b\7v\2\2\u030b\u030c\7g\2\2\u030c}\3\2\2"+
- "\2\u030d\u030e\7y\2\2\u030e\u030f\7t\2\2\u030f\u0310\7k\2\2\u0310\u0311"+
- "\7v\2\2\u0311\u0312\7g\2\2\u0312\u0313\7R\2\2\u0313\u0314\7g\2\2\u0314"+
- "\u0315\7t\2\2\u0315\u0316\7o\2\2\u0316\u0317\3\2\2\2\u0317\u0318\b?\2"+
- "\2\u0318\177\3\2\2\2\u0319\u031a\7p\2\2\u031a\u031b\7q\2\2\u031b\u031c"+
- "\7R\2\2\u031c\u031d\7g\2\2\u031d\u031e\7t\2\2\u031e\u031f\7o\2\2\u031f"+
- "\u0320\3\2\2\2\u0320\u0321\b@\2\2\u0321\u0081\3\2\2\2\u0322\u0323\7v\2"+
- "\2\u0323\u0324\7t\2\2\u0324\u0325\7w\2\2\u0325\u0326\7u\2\2\u0326\u0327"+
- "\7v\2\2\u0327\u0328\7g\2\2\u0328\u0329\7f\2\2\u0329\u032a\3\2\2\2\u032a"+
- "\u032b\bA\2\2\u032b\u0083\3\2\2\2\u032c\u032d\7q\2\2\u032d\u032e\7w\2"+
- "\2\u032e\u032f\7v\2\2\u032f\u0330\7n\2\2\u0330\u0331\7k\2\2\u0331\u0332"+
- "\7p\2\2\u0332\u0333\7g\2\2\u0333\u0085\3\2\2\2\u0334\u0335\7k\2\2\u0335"+
- "\u0336\7p\2\2\u0336\u0337\7k\2\2\u0337\u0338\7v\2\2\u0338\u0339\7G\2\2"+
- "\u0339\u033a\7p\2\2\u033a\u033b\7u\2\2\u033b\u033c\7w\2\2\u033c\u033d"+
- "\7t\2\2\u033d\u033e\7g\2\2\u033e\u033f\7u\2\2\u033f\u0087\3\2\2\2\u0340"+
- "\u0341\7k\2\2\u0341\u0342\7o\2\2\u0342\u0343\7r\2\2\u0343\u0344\7q\2\2"+
- "\u0344\u0345\7t\2\2\u0345\u0346\7v\2\2\u0346\u0347\7T\2\2\u0347\u0348"+
- "\7g\2\2\u0348\u0349\7s\2\2\u0349\u034a\7w\2\2\u034a\u034b\7k\2\2\u034b"+
- "\u034c\7t\2\2\u034c\u034d\7g\2\2\u034d\u034e\7u\2\2\u034e\u0089\3\2\2"+
- "\2\u034f\u0350\7r\2\2\u0350\u0351\7t\2\2\u0351\u0352\7q\2\2\u0352\u0353"+
- "\7q\2\2\u0353\u0354\7h\2\2\u0354\u008b\3\2\2\2\u0355\u0356\7?\2\2\u0356"+
- "\u0357\7?\2\2\u0357\u0358\7?\2\2\u0358\u008d\3\2\2\2\u0359\u035a\7#\2"+
- "\2\u035a\u035b\7?\2\2\u035b\u035c\7?\2\2\u035c\u008f\3\2\2\2\u035d\u035e"+
- "\7y\2\2\u035e\u035f\7k\2\2\u035f\u0360\7v\2\2\u0360\u0361\7j\2\2\u0361"+
- "\u0091\3\2\2\2\u0362\u0363\7d\2\2\u0363\u0364\7t\2\2\u0364\u0365\7g\2"+
- "\2\u0365\u0366\7c\2\2\u0366\u0367\7m\2\2\u0367\u0368\3\2\2\2\u0368\u0369"+
- "\bI\2\2\u0369\u0093\3\2\2\2\u036a\u036b\7f\2\2\u036b\u036c\7g\2\2\u036c"+
- "\u036d\7h\2\2\u036d\u036e\7c\2\2\u036e\u036f\7w\2\2\u036f\u0370\7n\2\2"+
- "\u0370\u0371\7v\2\2\u0371\u0095\3\2\2\2\u0372\u0373\7h\2\2\u0373\u0374"+
- "\7w\2\2\u0374\u0375\7p\2\2\u0375\u0376\7e\2\2\u0376\u0097\3\2\2\2\u0377"+
- "\u0378\7k\2\2\u0378\u0379\7p\2\2\u0379\u037a\7v\2\2\u037a\u037b\7g\2\2"+
- "\u037b\u037c\7t\2\2\u037c\u037d\7h\2\2\u037d\u037e\7c\2\2\u037e\u037f"+
- "\7e\2\2\u037f\u0380\7g\2\2\u0380\u0099\3\2\2\2\u0381\u0382\7u\2\2\u0382"+
- "\u0383\7g\2\2\u0383\u0384\7n\2\2\u0384\u0385\7g\2\2\u0385\u0386\7e\2\2"+
- "\u0386\u0387\7v\2\2\u0387\u009b\3\2\2\2\u0388\u0389\7e\2\2\u0389\u038a"+
- "\7c\2\2\u038a\u038b\7u\2\2\u038b\u038c\7g\2\2\u038c\u009d\3\2\2\2\u038d"+
- "\u038e\7f\2\2\u038e\u038f\7g\2\2\u038f\u0390\7h\2\2\u0390\u0391\7g\2\2"+
- "\u0391\u0392\7t\2\2\u0392\u009f\3\2\2\2\u0393\u0394\7i\2\2\u0394\u0395"+
- "\7q\2\2\u0395\u00a1\3\2\2\2\u0396\u0397\7o\2\2\u0397\u0398\7c\2\2\u0398"+
- "\u0399\7r\2\2\u0399\u00a3\3\2\2\2\u039a\u039b\7u\2\2\u039b\u039c\7v\2"+
- "\2\u039c\u039d\7t\2\2\u039d\u039e\7w\2\2\u039e\u039f\7e\2\2\u039f\u03a0"+
- "\7v\2\2\u03a0\u00a5\3\2\2\2\u03a1\u03a2\7e\2\2\u03a2\u03a3\7j\2\2\u03a3"+
- "\u03a4\7c\2\2\u03a4\u03a5\7p\2\2\u03a5\u00a7\3\2\2\2\u03a6\u03a7\7g\2"+
- "\2\u03a7\u03a8\7n\2\2\u03a8\u03a9\7u\2\2\u03a9\u03aa\7g\2\2\u03aa\u00a9"+
- "\3\2\2\2\u03ab\u03ac\7i\2\2\u03ac\u03ad\7q\2\2\u03ad\u03ae\7v\2\2\u03ae"+
- "\u03af\7q\2\2\u03af\u00ab\3\2\2\2\u03b0\u03b1\7r\2\2\u03b1\u03b2\7c\2"+
- "\2\u03b2\u03b3\7e\2\2\u03b3\u03b4\7m\2\2\u03b4\u03b5\7c\2\2\u03b5\u03b6"+
- "\7i\2\2\u03b6\u03b7\7g\2\2\u03b7\u00ad\3\2\2\2\u03b8\u03b9\7u\2\2\u03b9"+
- "\u03ba\7y\2\2\u03ba\u03bb\7k\2\2\u03bb\u03bc\7v\2\2\u03bc\u03bd\7e\2\2"+
- "\u03bd\u03be\7j\2\2\u03be\u00af\3\2\2\2\u03bf\u03c0\7e\2\2\u03c0\u03c1"+
- "\7q\2\2\u03c1\u03c2\7p\2\2\u03c2\u03c3\7u\2\2\u03c3\u03c4\7v\2\2\u03c4"+
- "\u00b1\3\2\2\2\u03c5\u03c6\7h\2\2\u03c6\u03c7\7c\2\2\u03c7\u03c8\7n\2"+
- "\2\u03c8\u03c9\7n\2\2\u03c9\u03ca\7v\2\2\u03ca\u03cb\7j\2\2\u03cb\u03cc"+
- "\7t\2\2\u03cc\u03cd\7q\2\2\u03cd\u03ce\7w\2\2\u03ce\u03cf\7i\2\2\u03cf"+
- "\u03d0\7j\2\2\u03d0\u03d1\3\2\2\2\u03d1\u03d2\bY\2\2\u03d2\u00b3\3\2\2"+
- "\2\u03d3\u03d4\7k\2\2\u03d4\u03d5\7h\2\2\u03d5\u00b5\3\2\2\2\u03d6\u03d7"+
- "\7t\2\2\u03d7\u03d8\7c\2\2\u03d8\u03d9\7p\2\2\u03d9\u03da\7i\2\2\u03da"+
- "\u03db\7g\2\2\u03db\u00b7\3\2\2\2\u03dc\u03dd\7v\2\2\u03dd\u03de\7{\2"+
- "\2\u03de\u03df\7r\2\2\u03df\u03e0\7g\2\2\u03e0\u00b9\3\2\2\2\u03e1\u03e2"+
- "\7e\2\2\u03e2\u03e3\7q\2\2\u03e3\u03e4\7p\2\2\u03e4\u03e5\7v\2\2\u03e5"+
- "\u03e6\7k\2\2\u03e6\u03e7\7p\2\2\u03e7\u03e8\7w\2\2\u03e8\u03e9\7g\2\2"+
- "\u03e9\u03ea\3\2\2\2\u03ea\u03eb\b]\2\2\u03eb\u00bb\3\2\2\2\u03ec\u03ed"+
- "\7h\2\2\u03ed\u03ee\7q\2\2\u03ee\u03ef\7t\2\2\u03ef\u00bd\3\2\2\2\u03f0"+
- "\u03f1\7k\2\2\u03f1\u03f2\7o\2\2\u03f2\u03f3\7r\2\2\u03f3\u03f4\7q\2\2"+
- "\u03f4\u03f5\7t\2\2\u03f5\u03f6\7v\2\2\u03f6\u00bf\3\2\2\2\u03f7\u03f8"+
- "\7t\2\2\u03f8\u03f9\7g\2\2\u03f9\u03fa\7v\2\2\u03fa\u03fb\7w\2\2\u03fb"+
- "\u03fc\7t\2\2\u03fc\u03fd\7p\2\2\u03fd\u03fe\3\2\2\2\u03fe\u03ff\b`\2"+
- "\2\u03ff\u00c1\3\2\2\2\u0400\u0401\7x\2\2\u0401\u0402\7c\2\2\u0402\u0403"+
- "\7t\2\2\u0403\u00c3\3\2\2\2\u0404\u0405\7p\2\2\u0405\u0406\7k\2\2\u0406"+
- "\u0407\7n\2\2\u0407\u0408\3\2\2\2\u0408\u0409\bb\2\2\u0409\u00c5\3\2\2"+
- "\2\u040a\u040f\5\u0148\u00a4\2\u040b\u040e\5\u0148\u00a4\2\u040c\u040e"+
- "\5\u014a\u00a5\2\u040d\u040b\3\2\2\2\u040d\u040c\3\2\2\2\u040e\u0411\3"+
- "\2\2\2\u040f\u040d\3\2\2\2\u040f\u0410\3\2\2\2\u0410\u0412\3\2\2\2\u0411"+
- "\u040f\3\2\2\2\u0412\u0413\bc\2\2\u0413\u00c7\3\2\2\2\u0414\u0415\7*\2"+
- "\2\u0415\u00c9\3\2\2\2\u0416\u0417\7+\2\2\u0417\u0418\3\2\2\2\u0418\u0419"+
- "\be\2\2\u0419\u00cb\3\2\2\2\u041a\u041b\7}\2\2\u041b\u00cd\3\2\2\2\u041c"+
- "\u041d\7\177\2\2\u041d\u041e\3\2\2\2\u041e\u041f\bg\2\2\u041f\u00cf\3"+
- "\2\2\2\u0420\u0421\7]\2\2\u0421\u00d1\3\2\2\2\u0422\u0423\7_\2\2\u0423"+
- "\u0424\3\2\2\2\u0424\u0425\bi\2\2\u0425\u00d3\3\2\2\2\u0426\u0427\7?\2"+
- "\2\u0427\u00d5\3\2\2\2\u0428\u0429\7.\2\2\u0429\u00d7\3\2\2\2\u042a\u042b"+
- "\7=\2\2\u042b\u00d9\3\2\2\2\u042c\u042d\7<\2\2\u042d\u00db\3\2\2\2\u042e"+
- "\u042f\7\60\2\2\u042f\u00dd\3\2\2\2\u0430\u0431\7-\2\2\u0431\u0432\7-"+
- "\2\2\u0432\u0433\3\2\2\2\u0433\u0434\bo\2\2\u0434\u00df\3\2\2\2\u0435"+
- "\u0436\7/\2\2\u0436\u0437\7/\2\2\u0437\u0438\3\2\2\2\u0438\u0439\bp\2"+
- "\2\u0439\u00e1\3\2\2\2\u043a\u043b\7<\2\2\u043b\u043c\7?\2\2\u043c\u00e3"+
- "\3\2\2\2\u043d\u043e\7\60\2\2\u043e\u043f\7\60\2\2\u043f\u0440\7\60\2"+
- "\2\u0440\u00e5\3\2\2\2\u0441\u0442\7~\2\2\u0442\u0443\7~\2\2\u0443\u00e7"+
- "\3\2\2\2\u0444\u0445\7(\2\2\u0445\u0446\7(\2\2\u0446\u00e9\3\2\2\2\u0447"+
- "\u0448\7?\2\2\u0448\u0449\7?\2\2\u0449\u00eb\3\2\2\2\u044a\u044b\7#\2"+
- "\2\u044b\u044c\7?\2\2\u044c\u00ed\3\2\2\2\u044d\u044e\7>\2\2\u044e\u00ef"+
- "\3\2\2\2\u044f\u0450\7>\2\2\u0450\u0451\7?\2\2\u0451\u00f1\3\2\2\2\u0452"+
- "\u0453\7@\2\2\u0453\u00f3\3\2\2\2\u0454\u0455\7@\2\2\u0455\u0456\7?\2"+
- "\2\u0456\u00f5\3\2\2\2\u0457\u0458\7~\2\2\u0458\u00f7\3\2\2\2\u0459\u045a"+
- "\7\61\2\2\u045a\u00f9\3\2\2\2\u045b\u045c\7\'\2\2\u045c\u00fb\3\2\2\2"+
- "\u045d\u045e\7>\2\2\u045e\u045f\7>\2\2\u045f\u00fd\3\2\2\2\u0460\u0461"+
- "\7@\2\2\u0461\u0462\7@\2\2\u0462\u00ff\3\2\2\2\u0463\u0464\7(\2\2\u0464"+
- "\u0465\7`\2\2\u0465\u0101\3\2\2\2\u0466\u0467\7#\2\2\u0467\u0103\3\2\2"+
- "\2\u0468\u0469\7-\2\2\u0469\u0105\3\2\2\2\u046a\u046b\7/\2\2\u046b\u0107"+
- "\3\2\2\2\u046c\u046d\7`\2\2\u046d\u0109\3\2\2\2\u046e\u046f\7,\2\2\u046f"+
- "\u010b\3\2\2\2\u0470\u0471\7(\2\2\u0471\u010d\3\2\2\2\u0472\u0473\7>\2"+
- "\2\u0473\u0474\7/\2\2\u0474\u010f\3\2\2\2\u0475\u0481\7\62\2\2\u0476\u047d"+
- "\t\2\2\2\u0477\u0479\7a\2\2\u0478\u0477\3\2\2\2\u0478\u0479\3\2\2\2\u0479"+
- "\u047a\3\2\2\2\u047a\u047c\t\3\2\2\u047b\u0478\3\2\2\2\u047c\u047f\3\2"+
- "\2\2\u047d\u047b\3\2\2\2\u047d\u047e\3\2\2\2\u047e\u0481\3\2\2\2\u047f"+
- "\u047d\3\2\2\2\u0480\u0475\3\2\2\2\u0480\u0476\3\2\2\2\u0481\u0482\3\2"+
- "\2\2\u0482\u0483\b\u0088\2\2\u0483\u0111\3\2\2\2\u0484\u0485\7\62\2\2"+
- "\u0485\u048a\t\4\2\2\u0486\u0488\7a\2\2\u0487\u0486\3\2\2\2\u0487\u0488"+
- "\3\2\2\2\u0488\u0489\3\2\2\2\u0489\u048b\5\u0144\u00a2\2\u048a\u0487\3"+
- "\2\2\2\u048b\u048c\3\2\2\2\u048c\u048a\3\2\2\2\u048c\u048d\3\2\2\2\u048d"+
- "\u048e\3\2\2\2\u048e\u048f\b\u0089\2\2\u048f\u0113\3\2\2\2\u0490\u0492"+
- "\7\62\2\2\u0491\u0493\t\5\2\2\u0492\u0491\3\2\2\2\u0492\u0493\3\2\2\2"+
- "\u0493\u0498\3\2\2\2\u0494\u0496\7a\2\2\u0495\u0494\3\2\2\2\u0495\u0496"+
- "\3\2\2\2\u0496\u0497\3\2\2\2\u0497\u0499\5\u0140\u00a0\2\u0498\u0495\3"+
- "\2\2\2\u0499\u049a\3\2\2\2\u049a\u0498\3\2\2\2\u049a\u049b\3\2\2\2\u049b"+
- "\u049c\3\2\2\2\u049c\u049d\b\u008a\2\2\u049d\u0115\3\2\2\2\u049e\u049f"+
- "\7\62\2\2\u049f\u04a4\t\6\2\2\u04a0\u04a2\7a\2\2\u04a1\u04a0\3\2\2\2\u04a1"+
- "\u04a2\3\2\2\2\u04a2\u04a3\3\2\2\2\u04a3\u04a5\5\u0142\u00a1\2\u04a4\u04a1"+
- "\3\2\2\2\u04a5\u04a6\3\2\2\2\u04a6\u04a4\3\2\2\2\u04a6\u04a7\3\2\2\2\u04a7"+
- "\u04a8\3\2\2\2\u04a8\u04a9\b\u008b\2\2\u04a9\u0117\3\2\2\2\u04aa\u04ab"+
- "\7\62\2\2\u04ab\u04ac\t\6\2\2\u04ac\u04ad\5\u011a\u008d\2\u04ad\u04ae"+
- "\5\u011c\u008e\2\u04ae\u0119\3\2\2\2\u04af\u04b1\7a\2\2\u04b0\u04af\3"+
- "\2\2\2\u04b0\u04b1\3\2\2\2\u04b1\u04b2\3\2\2\2\u04b2\u04b4\5\u0142\u00a1"+
- "\2\u04b3\u04b0\3\2\2\2\u04b4\u04b5\3\2\2\2\u04b5\u04b3\3\2\2\2\u04b5\u04b6"+
- "\3\2\2\2\u04b6\u04c1\3\2\2\2\u04b7\u04be\7\60\2\2\u04b8\u04ba\7a\2\2\u04b9"+
- "\u04b8\3\2\2\2\u04b9\u04ba\3\2\2\2\u04ba\u04bb\3\2\2\2\u04bb\u04bd\5\u0142"+
- "\u00a1\2\u04bc\u04b9\3\2\2\2\u04bd\u04c0\3\2\2\2\u04be\u04bc\3\2\2\2\u04be"+
- "\u04bf\3\2\2\2\u04bf\u04c2\3\2\2\2\u04c0\u04be\3\2\2\2\u04c1\u04b7\3\2"+
- "\2\2\u04c1\u04c2\3\2\2\2\u04c2\u04cf\3\2\2\2\u04c3\u04c4\7\60\2\2\u04c4"+
- "\u04cb\5\u0142\u00a1\2\u04c5\u04c7\7a\2\2\u04c6\u04c5\3\2\2\2\u04c6\u04c7"+
- "\3\2\2\2\u04c7\u04c8\3\2\2\2\u04c8\u04ca\5\u0142\u00a1\2\u04c9\u04c6\3"+
- "\2\2\2\u04ca\u04cd\3\2\2\2\u04cb\u04c9\3\2\2\2\u04cb\u04cc\3\2\2\2\u04cc"+
- "\u04cf\3\2\2\2\u04cd\u04cb\3\2\2\2\u04ce\u04b3\3\2\2\2\u04ce\u04c3\3\2"+
- "\2\2\u04cf\u011b\3\2\2\2\u04d0\u04d1\t\7\2\2\u04d1\u04d2\t\b\2\2\u04d2"+
- "\u04d3\5\u013e\u009f\2\u04d3\u011d\3\2\2\2\u04d4\u04da\5\u0110\u0088\2"+
- "\u04d5\u04da\5\u0112\u0089\2\u04d6\u04da\5\u0114\u008a\2\u04d7\u04da\5"+
- "\u0116\u008b\2\u04d8\u04da\5\4\2\2\u04d9\u04d4\3\2\2\2\u04d9\u04d5\3\2"+
- "\2\2\u04d9\u04d6\3\2\2\2\u04d9\u04d7\3\2\2\2\u04d9\u04d8\3\2\2\2\u04da"+
- "\u04db\3\2\2\2\u04db\u04dc\7k\2\2\u04dc\u04dd\3\2\2\2\u04dd\u04de\b\u008f"+
- "\2\2\u04de\u011f\3\2\2\2\u04df\u04e2\7)\2\2\u04e0\u04e3\5\u013a\u009d"+
- "\2\u04e1\u04e3\5\u0124\u0092\2\u04e2\u04e0\3\2\2\2\u04e2\u04e1\3\2\2\2"+
- "\u04e3\u04e4\3\2\2\2\u04e4\u04e5\7)\2\2\u04e5\u0121\3\2\2\2\u04e6\u04e7"+
- "\5\u0120\u0090\2\u04e7\u04e8\3\2\2\2\u04e8\u04e9\b\u0091\2\2\u04e9\u0123"+
- "\3\2\2\2\u04ea\u04ed\5\u0126\u0093\2\u04eb\u04ed\5\u0128\u0094\2\u04ec"+
- "\u04ea\3\2\2\2\u04ec\u04eb\3\2\2\2\u04ed\u0125\3\2\2\2\u04ee\u04ef\7^"+
- "\2\2\u04ef\u04f0\5\u0140\u00a0\2\u04f0\u04f1\5\u0140\u00a0\2\u04f1\u04f2"+
- "\5\u0140\u00a0\2\u04f2\u0127\3\2\2\2\u04f3\u04f4\7^\2\2\u04f4\u04f5\7"+
- "z\2\2\u04f5\u04f6\5\u0142\u00a1\2\u04f6\u04f7\5\u0142\u00a1\2\u04f7\u0129"+
- "\3\2\2\2\u04f8\u04f9\7^\2\2\u04f9\u04fa\7w\2\2\u04fa\u04fb\5\u0142\u00a1"+
- "\2\u04fb\u04fc\5\u0142\u00a1\2\u04fc\u04fd\5\u0142\u00a1\2\u04fd\u04fe"+
- "\5\u0142\u00a1\2\u04fe\u012b\3\2\2\2\u04ff\u0500\7^\2\2\u0500\u0501\7"+
- "W\2\2\u0501\u0502\5\u0142\u00a1\2\u0502\u0503\5\u0142\u00a1\2\u0503\u0504"+
- "\5\u0142\u00a1\2\u0504\u0505\5\u0142\u00a1\2\u0505\u0506\5\u0142\u00a1"+
- "\2\u0506\u0507\5\u0142\u00a1\2\u0507\u0508\5\u0142\u00a1\2\u0508\u0509"+
- "\5\u0142\u00a1\2\u0509\u012d\3\2\2\2\u050a\u050e\7b\2\2\u050b\u050d\n"+
- "\t\2\2\u050c\u050b\3\2\2\2\u050d\u0510\3\2\2\2\u050e\u050c\3\2\2\2\u050e"+
- "\u050f\3\2\2\2\u050f\u0511\3\2\2\2\u0510\u050e\3\2\2\2\u0511\u0512\7b"+
- "\2\2\u0512\u0513\3\2\2\2\u0513\u0514\b\u0097\2\2\u0514\u012f\3\2\2\2\u0515"+
- "\u051a\7$\2\2\u0516\u0519\n\n\2\2\u0517\u0519\5\u013c\u009e\2\u0518\u0516"+
- "\3\2\2\2\u0518\u0517\3\2\2\2\u0519\u051c\3\2\2\2\u051a\u0518\3\2\2\2\u051a"+
- "\u051b\3\2\2\2\u051b\u051d\3\2\2\2\u051c\u051a\3\2\2\2\u051d\u051e\7$"+
- "\2\2\u051e\u051f\3\2\2\2\u051f\u0520\b\u0098\2\2\u0520\u0131\3\2\2\2\u0521"+
- "\u0523\t\13\2\2\u0522\u0521\3\2\2\2\u0523\u0524\3\2\2\2\u0524\u0522\3"+
- "\2\2\2\u0524\u0525\3\2\2\2\u0525\u0526\3\2\2\2\u0526\u0527\b\u0099\3\2"+
- "\u0527\u0133\3\2\2\2\u0528\u0529\7\61\2\2\u0529\u052a\7,\2\2\u052a\u052e"+
- "\3\2\2\2\u052b\u052d\13\2\2\2\u052c\u052b\3\2\2\2\u052d\u0530\3\2\2\2"+
- "\u052e\u052f\3\2\2\2\u052e\u052c\3\2\2\2\u052f\u0531\3\2\2\2\u0530\u052e"+
- "\3\2\2\2\u0531\u0532\7,\2\2\u0532\u0533\7\61\2\2\u0533\u0534\3\2\2\2\u0534"+
- "\u0535\b\u009a\3\2\u0535\u0135\3\2\2\2\u0536\u0538\t\f\2\2\u0537\u0536"+
- "\3\2\2\2\u0538\u0539\3\2\2\2\u0539\u0537\3\2\2\2\u0539\u053a\3\2\2\2\u053a"+
- "\u053b\3\2\2\2\u053b\u053c\b\u009b\3\2\u053c\u0137\3\2\2\2\u053d\u053e"+
- "\7\61\2\2\u053e\u053f\7\61\2\2\u053f\u0543\3\2\2\2\u0540\u0542\n\f\2\2"+
- "\u0541\u0540\3\2\2\2\u0542\u0545\3\2\2\2\u0543\u0541\3\2\2\2\u0543\u0544"+
- "\3\2\2\2\u0544\u0546\3\2\2\2\u0545\u0543\3\2\2\2\u0546\u0547\b\u009c\3"+
- "\2\u0547\u0139\3\2\2\2\u0548\u054d\n\r\2\2\u0549\u054d\5\u012a\u0095\2"+
- "\u054a\u054d\5\u012c\u0096\2\u054b\u054d\5\u013c\u009e\2\u054c\u0548\3"+
- "\2\2\2\u054c\u0549\3\2\2\2\u054c\u054a\3\2\2\2\u054c\u054b\3\2\2\2\u054d"+
- "\u013b\3\2\2\2\u054e\u0568\7^\2\2\u054f\u0550\7w\2\2\u0550\u0551\5\u0142"+
- "\u00a1\2\u0551\u0552\5\u0142\u00a1\2\u0552\u0553\5\u0142\u00a1\2\u0553"+
- "\u0554\5\u0142\u00a1\2\u0554\u0569\3\2\2\2\u0555\u0556\7W\2\2\u0556\u0557"+
- "\5\u0142\u00a1\2\u0557\u0558\5\u0142\u00a1\2\u0558\u0559\5\u0142\u00a1"+
- "\2\u0559\u055a\5\u0142\u00a1\2\u055a\u055b\5\u0142\u00a1\2\u055b\u055c"+
- "\5\u0142\u00a1\2\u055c\u055d\5\u0142\u00a1\2\u055d\u055e\5\u0142\u00a1"+
- "\2\u055e\u0569\3\2\2\2\u055f\u0569\t\16\2\2\u0560\u0561\5\u0140\u00a0"+
- "\2\u0561\u0562\5\u0140\u00a0\2\u0562\u0563\5\u0140\u00a0\2\u0563\u0569"+
- "\3\2\2\2\u0564\u0565\7z\2\2\u0565\u0566\5\u0142\u00a1\2\u0566\u0567\5"+
- "\u0142\u00a1\2\u0567\u0569\3\2\2\2\u0568\u054f\3\2\2\2\u0568\u0555\3\2"+
- "\2\2\u0568\u055f\3\2\2\2\u0568\u0560\3\2\2\2\u0568\u0564\3\2\2\2\u0569"+
- "\u013d\3\2\2\2\u056a\u0571\t\3\2\2\u056b\u056d\7a\2\2\u056c\u056b\3\2"+
- "\2\2\u056c\u056d\3\2\2\2\u056d\u056e\3\2\2\2\u056e\u0570\t\3\2\2\u056f"+
- "\u056c\3\2\2\2\u0570\u0573\3\2\2\2\u0571\u056f\3\2\2\2\u0571\u0572\3\2"+
- "\2\2\u0572\u013f\3\2\2\2\u0573\u0571\3\2\2\2\u0574\u0575\t\17\2\2\u0575"+
- "\u0141\3\2\2\2\u0576\u0577\t\20\2\2\u0577\u0143\3\2\2\2\u0578\u0579\t"+
- "\21\2\2\u0579\u0145\3\2\2\2\u057a\u057c\t\22\2\2\u057b\u057d\t\b\2\2\u057c"+
- "\u057b\3\2\2\2\u057c\u057d\3\2\2\2\u057d\u057e\3\2\2\2\u057e\u057f\5\u013e"+
- "\u009f\2\u057f\u0147\3\2\2\2\u0580\u0583\5\u014c\u00a6\2\u0581\u0583\7"+
- "a\2\2\u0582\u0580\3\2\2\2\u0582\u0581\3\2\2\2\u0583\u0149\3\2\2\2\u0584"+
- "\u0585\t\23\2\2\u0585\u014b\3\2\2\2\u0586\u0587\t\24\2\2\u0587\u014d\3"+
- "\2\2\2\u0588\u058a\t\13\2\2\u0589\u0588\3\2\2\2\u058a\u058b\3\2\2\2\u058b"+
- "\u0589\3\2\2\2\u058b\u058c\3\2\2\2\u058c\u058d\3\2\2\2\u058d\u058e\b\u00a7"+
- "\3\2\u058e\u014f\3\2\2\2\u058f\u0590\7\61\2\2\u0590\u0591\7,\2\2\u0591"+
- "\u0595\3\2\2\2\u0592\u0594\n\f\2\2\u0593\u0592\3\2\2\2\u0594\u0597\3\2"+
- "\2\2\u0595\u0596\3\2\2\2\u0595\u0593\3\2\2\2\u0596\u0598\3\2\2\2\u0597"+
- "\u0595\3\2\2\2\u0598\u0599\7,\2\2\u0599\u059a\7\61\2\2\u059a\u059b\3\2"+
- "\2\2\u059b\u059c\b\u00a8\3\2\u059c\u0151\3\2\2\2\u059d\u059e\7\61\2\2"+
- "\u059e\u059f\7\61\2\2\u059f\u05a3\3\2\2\2\u05a0\u05a2\n\f\2\2\u05a1\u05a0"+
- "\3\2\2\2\u05a2\u05a5\3\2\2\2\u05a3\u05a1\3\2\2\2\u05a3\u05a4\3\2\2\2\u05a4"+
- "\u05a6\3\2\2\2\u05a5\u05a3\3\2\2\2\u05a6\u05a7\b\u00a9\3\2\u05a7\u0153"+
- "\3\2\2\2\u05a8\u05aa\t\f\2\2\u05a9\u05a8\3\2\2\2\u05aa\u05ab\3\2\2\2\u05ab"+
- "\u05a9\3\2\2\2\u05ab\u05ac\3\2\2\2\u05ac\u05bb\3\2\2\2\u05ad\u05bb\7="+
- "\2\2\u05ae\u05af\7\61\2\2\u05af\u05b0\7,\2\2\u05b0\u05b4\3\2\2\2\u05b1"+
- "\u05b3\13\2\2\2\u05b2\u05b1\3\2\2\2\u05b3\u05b6\3\2\2\2\u05b4\u05b5\3"+
- "\2\2\2\u05b4\u05b2\3\2\2\2\u05b5\u05b7\3\2\2\2\u05b6\u05b4\3\2\2\2\u05b7"+
- "\u05b8\7,\2\2\u05b8\u05bb\7\61\2\2\u05b9\u05bb\7\2\2\3\u05ba\u05a9\3\2"+
- "\2\2\u05ba\u05ad\3\2\2\2\u05ba\u05ae\3\2\2\2\u05ba\u05b9\3\2\2\2\u05bb"+
- "\u05bc\3\2\2\2\u05bc\u05bd\b\u00aa\4\2\u05bd\u0155\3\2\2\2\u05be\u05bf"+
- "\3\2\2\2\u05bf\u05c0\3\2\2\2\u05c0\u05c1\b\u00ab\4\2\u05c1\u05c2\b\u00ab"+
- "\3\2\u05c2\u0157\3\2\2\2\64\2\3\u015a\u0162\u0165\u0168\u016e\u0170\u040d"+
- "\u040f\u0478\u047d\u0480\u0487\u048c\u0492\u0495\u049a\u04a1\u04a6\u04b0"+
- "\u04b5\u04b9\u04be\u04c1\u04c6\u04cb\u04ce\u04d9\u04e2\u04ec\u050e\u0518"+
- "\u051a\u0524\u052e\u0539\u0543\u054c\u0568\u056c\u0571\u057c\u0582\u058b"+
- "\u0595\u05a3\u05ab\u05b4\u05ba\5\4\3\2\2\3\2\4\2\2";
+ "\4\u00a9\t\u00a9\4\u00aa\t\u00aa\4\u00ab\t\u00ab\4\u00ac\t\u00ac\3\2\3"+
+ "\2\5\2\u015d\n\2\3\2\3\2\3\3\3\3\3\3\3\3\5\3\u0165\n\3\3\3\5\3\u0168\n"+
+ "\3\3\3\5\3\u016b\n\3\3\3\3\3\3\3\3\3\5\3\u0171\n\3\5\3\u0173\n\3\3\4\3"+
+ "\4\3\4\3\4\3\4\3\4\3\4\3\5\3\5\3\5\3\5\3\5\3\5\3\5\3\5\3\6\3\6\3\6\3\6"+
+ "\3\6\3\6\3\6\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3"+
+ "\t\3\t\3\t\3\t\3\t\3\t\3\t\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\13\3"+
+ "\13\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3\f\3\f\3\f\3\f\3\f\3\f\3"+
+ "\f\3\f\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\16\3\16\3\16\3\16\3\16"+
+ "\3\16\3\16\3\16\3\16\3\16\3\16\3\16\3\17\3\17\3\17\3\17\3\17\3\17\3\17"+
+ "\3\20\3\20\3\20\3\20\3\20\3\20\3\20\3\20\3\20\3\20\3\20\3\21\3\21\3\21"+
+ "\3\22\3\22\3\22\3\22\3\22\3\22\3\23\3\23\3\23\3\23\3\23\3\23\3\23\3\23"+
+ "\3\23\3\24\3\24\3\24\3\24\3\24\3\25\3\25\3\25\3\25\3\25\3\25\3\25\3\26"+
+ "\3\26\3\26\3\26\3\26\3\26\3\26\3\27\3\27\3\27\3\27\3\27\3\27\3\30\3\30"+
+ "\3\30\3\30\3\30\3\31\3\31\3\31\3\31\3\31\3\31\3\31\3\32\3\32\3\32\3\32"+
+ "\3\32\3\32\3\32\3\32\3\32\3\32\3\33\3\33\3\33\3\33\3\33\3\33\3\34\3\34"+
+ "\3\34\3\35\3\35\3\36\3\36\3\36\3\36\3\36\3\36\3\36\3\37\3\37\3\37\3\37"+
+ "\3\37\3\37\3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3!\3!\3!\3!\3!\3!\3"+
+ "!\3!\3!\3\"\3\"\3\"\3\"\3#\3#\3#\3#\3$\3$\3$\3$\3$\3$\3%\3%\3&\3&\3&\3"+
+ "\'\3\'\3\'\3\'\3\'\3(\3(\3(\3(\3(\3(\3)\3)\3)\3)\3)\3)\3*\3*\3*\3*\3*"+
+ "\3*\3*\3+\3+\3+\3+\3+\3+\3+\3,\3,\3,\3,\3,\3,\3,\3,\3,\3-\3-\3-\3-\3-"+
+ "\3-\3.\3.\3.\3.\3.\3.\3/\3/\3/\3/\3/\3/\3/\3\60\3\60\3\60\3\60\3\60\3"+
+ "\60\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\62\3\62\3\62\3\62\3\62\3\62\3"+
+ "\63\3\63\3\63\3\63\3\63\3\63\3\63\3\63\3\63\3\64\3\64\3\64\3\64\3\64\3"+
+ "\64\3\64\3\64\3\65\3\65\3\65\3\65\3\65\3\65\3\66\3\66\3\66\3\66\3\66\3"+
+ "\66\3\66\3\67\3\67\3\67\3\67\3\67\38\38\38\38\38\38\38\38\38\39\39\39"+
+ "\39\39\39\39\39\39\39\39\39\39\39\39\3:\3:\3:\3:\3:\3:\3;\3;\3;\3;\3<"+
+ "\3<\3<\3=\3=\3=\3=\3=\3=\3=\3>\3>\3>\3>\3>\3>\3>\3>\3>\3>\3?\3?\3?\3?"+
+ "\3?\3?\3?\3?\3?\3?\3@\3@\3@\3@\3@\3@\3@\3@\3@\3@\3@\3@\3A\3A\3A\3A\3A"+
+ "\3A\3A\3A\3A\3B\3B\3B\3B\3B\3B\3B\3B\3B\3B\3C\3C\3C\3C\3C\3C\3C\3C\3D"+
+ "\3D\3D\3D\3D\3D\3D\3D\3D\3D\3D\3D\3E\3E\3E\3E\3E\3E\3E\3E\3E\3E\3E\3E"+
+ "\3E\3E\3E\3F\3F\3F\3F\3F\3F\3G\3G\3G\3G\3H\3H\3H\3H\3I\3I\3I\3I\3I\3J"+
+ "\3J\3J\3J\3J\3J\3J\3J\3K\3K\3K\3K\3K\3K\3K\3K\3L\3L\3L\3L\3L\3M\3M\3M"+
+ "\3M\3M\3M\3M\3M\3M\3M\3N\3N\3N\3N\3N\3N\3N\3O\3O\3O\3O\3O\3P\3P\3P\3P"+
+ "\3P\3P\3Q\3Q\3Q\3R\3R\3R\3R\3S\3S\3S\3S\3S\3S\3S\3T\3T\3T\3T\3T\3U\3U"+
+ "\3U\3U\3U\3V\3V\3V\3V\3V\3W\3W\3W\3W\3W\3W\3W\3W\3X\3X\3X\3X\3X\3X\3X"+
+ "\3Y\3Y\3Y\3Y\3Y\3Y\3Z\3Z\3Z\3Z\3Z\3Z\3Z\3Z\3Z\3Z\3Z\3Z\3Z\3Z\3[\3[\3["+
+ "\3\\\3\\\3\\\3\\\3\\\3\\\3]\3]\3]\3]\3]\3^\3^\3^\3^\3^\3^\3^\3^\3^\3^"+
+ "\3^\3_\3_\3_\3_\3`\3`\3`\3`\3`\3`\3`\3a\3a\3a\3a\3a\3a\3a\3a\3a\3b\3b"+
+ "\3b\3b\3c\3c\3c\3c\3c\3c\3d\3d\3d\7d\u0416\nd\fd\16d\u0419\13d\3d\3d\3"+
+ "e\3e\3f\3f\3f\3f\3g\3g\3h\3h\3h\3h\3i\3i\3j\3j\3j\3j\3k\3k\3l\3l\3m\3"+
+ "m\3n\3n\3o\3o\3p\3p\3p\3p\3p\3q\3q\3q\3q\3q\3r\3r\3r\3s\3s\3s\3s\3t\3"+
+ "t\3t\3u\3u\3u\3v\3v\3v\3w\3w\3w\3x\3x\3y\3y\3y\3z\3z\3{\3{\3{\3|\3|\3"+
+ "}\3}\3~\3~\3\177\3\177\3\177\3\u0080\3\u0080\3\u0080\3\u0081\3\u0081\3"+
+ "\u0081\3\u0082\3\u0082\3\u0083\3\u0083\3\u0084\3\u0084\3\u0085\3\u0085"+
+ "\3\u0086\3\u0086\3\u0087\3\u0087\3\u0088\3\u0088\3\u0088\3\u0089\3\u0089"+
+ "\3\u0089\5\u0089\u0481\n\u0089\3\u0089\7\u0089\u0484\n\u0089\f\u0089\16"+
+ "\u0089\u0487\13\u0089\5\u0089\u0489\n\u0089\3\u0089\3\u0089\3\u008a\3"+
+ "\u008a\3\u008a\5\u008a\u0490\n\u008a\3\u008a\6\u008a\u0493\n\u008a\r\u008a"+
+ "\16\u008a\u0494\3\u008a\3\u008a\3\u008b\3\u008b\5\u008b\u049b\n\u008b"+
+ "\3\u008b\5\u008b\u049e\n\u008b\3\u008b\6\u008b\u04a1\n\u008b\r\u008b\16"+
+ "\u008b\u04a2\3\u008b\3\u008b\3\u008c\3\u008c\3\u008c\5\u008c\u04aa\n\u008c"+
+ "\3\u008c\6\u008c\u04ad\n\u008c\r\u008c\16\u008c\u04ae\3\u008c\3\u008c"+
+ "\3\u008d\3\u008d\3\u008d\3\u008d\3\u008d\3\u008e\5\u008e\u04b9\n\u008e"+
+ "\3\u008e\6\u008e\u04bc\n\u008e\r\u008e\16\u008e\u04bd\3\u008e\3\u008e"+
+ "\5\u008e\u04c2\n\u008e\3\u008e\7\u008e\u04c5\n\u008e\f\u008e\16\u008e"+
+ "\u04c8\13\u008e\5\u008e\u04ca\n\u008e\3\u008e\3\u008e\3\u008e\5\u008e"+
+ "\u04cf\n\u008e\3\u008e\7\u008e\u04d2\n\u008e\f\u008e\16\u008e\u04d5\13"+
+ "\u008e\5\u008e\u04d7\n\u008e\3\u008f\3\u008f\3\u008f\3\u008f\3\u0090\3"+
+ "\u0090\3\u0090\3\u0090\3\u0090\5\u0090\u04e2\n\u0090\3\u0090\3\u0090\3"+
+ "\u0090\3\u0090\3\u0091\3\u0091\3\u0091\5\u0091\u04eb\n\u0091\3\u0091\3"+
+ "\u0091\3\u0092\3\u0092\3\u0092\3\u0092\3\u0093\3\u0093\5\u0093\u04f5\n"+
+ "\u0093\3\u0094\3\u0094\3\u0094\3\u0094\3\u0094\3\u0095\3\u0095\3\u0095"+
+ "\3\u0095\3\u0095\3\u0096\3\u0096\3\u0096\3\u0096\3\u0096\3\u0096\3\u0096"+
+ "\3\u0097\3\u0097\3\u0097\3\u0097\3\u0097\3\u0097\3\u0097\3\u0097\3\u0097"+
+ "\3\u0097\3\u0097\3\u0098\3\u0098\7\u0098\u0515\n\u0098\f\u0098\16\u0098"+
+ "\u0518\13\u0098\3\u0098\3\u0098\3\u0098\3\u0098\3\u0099\3\u0099\3\u0099"+
+ "\7\u0099\u0521\n\u0099\f\u0099\16\u0099\u0524\13\u0099\3\u0099\3\u0099"+
+ "\3\u0099\3\u0099\3\u009a\6\u009a\u052b\n\u009a\r\u009a\16\u009a\u052c"+
+ "\3\u009a\3\u009a\3\u009b\3\u009b\3\u009b\3\u009b\7\u009b\u0535\n\u009b"+
+ "\f\u009b\16\u009b\u0538\13\u009b\3\u009b\3\u009b\3\u009b\3\u009b\3\u009b"+
+ "\3\u009c\6\u009c\u0540\n\u009c\r\u009c\16\u009c\u0541\3\u009c\3\u009c"+
+ "\3\u009d\3\u009d\3\u009d\3\u009d\7\u009d\u054a\n\u009d\f\u009d\16\u009d"+
+ "\u054d\13\u009d\3\u009d\3\u009d\3\u009e\3\u009e\3\u009e\3\u009e\5\u009e"+
+ "\u0555\n\u009e\3\u009f\3\u009f\3\u009f\3\u009f\3\u009f\3\u009f\3\u009f"+
+ "\3\u009f\3\u009f\3\u009f\3\u009f\3\u009f\3\u009f\3\u009f\3\u009f\3\u009f"+
+ "\3\u009f\3\u009f\3\u009f\3\u009f\3\u009f\3\u009f\3\u009f\3\u009f\3\u009f"+
+ "\3\u009f\5\u009f\u0571\n\u009f\3\u00a0\3\u00a0\5\u00a0\u0575\n\u00a0\3"+
+ "\u00a0\7\u00a0\u0578\n\u00a0\f\u00a0\16\u00a0\u057b\13\u00a0\3\u00a1\3"+
+ "\u00a1\3\u00a2\3\u00a2\3\u00a3\3\u00a3\3\u00a4\3\u00a4\5\u00a4\u0585\n"+
+ "\u00a4\3\u00a4\3\u00a4\3\u00a5\3\u00a5\5\u00a5\u058b\n\u00a5\3\u00a6\3"+
+ "\u00a6\3\u00a7\3\u00a7\3\u00a8\6\u00a8\u0592\n\u00a8\r\u00a8\16\u00a8"+
+ "\u0593\3\u00a8\3\u00a8\3\u00a9\3\u00a9\3\u00a9\3\u00a9\7\u00a9\u059c\n"+
+ "\u00a9\f\u00a9\16\u00a9\u059f\13\u00a9\3\u00a9\3\u00a9\3\u00a9\3\u00a9"+
+ "\3\u00a9\3\u00aa\3\u00aa\3\u00aa\3\u00aa\7\u00aa\u05aa\n\u00aa\f\u00aa"+
+ "\16\u00aa\u05ad\13\u00aa\3\u00aa\3\u00aa\3\u00ab\6\u00ab\u05b2\n\u00ab"+
+ "\r\u00ab\16\u00ab\u05b3\3\u00ab\3\u00ab\3\u00ab\3\u00ab\3\u00ab\7\u00ab"+
+ "\u05bb\n\u00ab\f\u00ab\16\u00ab\u05be\13\u00ab\3\u00ab\3\u00ab\3\u00ab"+
+ "\5\u00ab\u05c3\n\u00ab\3\u00ab\3\u00ab\3\u00ac\3\u00ac\3\u00ac\3\u00ac"+
+ "\3\u00ac\5\u0536\u059d\u05bc\2\u00ad\4\3\6\4\b\5\n\6\f\7\16\b\20\t\22"+
+ "\n\24\13\26\f\30\r\32\16\34\17\36\20 \21\"\22$\23&\24(\25*\26,\27.\30"+
+ "\60\31\62\32\64\33\66\348\35:\36<\37> @!B\"D#F$H%J&L\'N(P)R*T+V,X-Z.\\"+
+ "/^\60`\61b\62d\63f\64h\65j\66l\67n8p9r:t;v|?~@\u0080A\u0082B\u0084"+
+ "C\u0086D\u0088E\u008aF\u008cG\u008eH\u0090I\u0092J\u0094K\u0096L\u0098"+
+ "M\u009aN\u009cO\u009eP\u00a0Q\u00a2R\u00a4S\u00a6T\u00a8U\u00aaV\u00ac"+
+ "W\u00aeX\u00b0Y\u00b2Z\u00b4[\u00b6\\\u00b8]\u00ba^\u00bc_\u00be`\u00c0"+
+ "a\u00c2b\u00c4c\u00c6d\u00c8e\u00caf\u00ccg\u00ceh\u00d0i\u00d2j\u00d4"+
+ "k\u00d6l\u00d8m\u00dan\u00dco\u00dep\u00e0q\u00e2r\u00e4s\u00e6t\u00e8"+
+ "u\u00eav\u00ecw\u00eex\u00f0y\u00f2z\u00f4{\u00f6|\u00f8}\u00fa~\u00fc"+
+ "\177\u00fe\u0080\u0100\u0081\u0102\u0082\u0104\u0083\u0106\u0084\u0108"+
+ "\u0085\u010a\u0086\u010c\u0087\u010e\u0088\u0110\u0089\u0112\u008a\u0114"+
+ "\u008b\u0116\u008c\u0118\u008d\u011a\u008e\u011c\2\u011e\2\u0120\u008f"+
+ "\u0122\2\u0124\u0090\u0126\u0091\u0128\u0092\u012a\u0093\u012c\u0094\u012e"+
+ "\u0095\u0130\u0096\u0132\u0097\u0134\u0098\u0136\u0099\u0138\u009a\u013a"+
+ "\u009b\u013c\2\u013e\2\u0140\2\u0142\2\u0144\2\u0146\2\u0148\2\u014a\2"+
+ "\u014c\2\u014e\2\u0150\u009c\u0152\u009d\u0154\u009e\u0156\u009f\u0158"+
+ "\u00a0\4\2\3\23\3\2\63;\3\2\62;\4\2DDdd\4\2QQqq\4\2ZZzz\4\2RRrr\4\2--"+
+ "//\3\2bb\4\2$$^^\4\2\13\13\"\"\4\2\f\f\17\17\5\2\f\f\17\17))\13\2$$))"+
+ "^^cdhhppttvvxx\3\2\629\5\2\62;CHch\3\2\62\63\4\2GGgg\49\2\62\2;\2\u0662"+
+ "\2\u066b\2\u06f2\2\u06fb\2\u07c2\2\u07cb\2\u0968\2\u0971\2\u09e8\2\u09f1"+
+ "\2\u0a68\2\u0a71\2\u0ae8\2\u0af1\2\u0b68\2\u0b71\2\u0be8\2\u0bf1\2\u0c68"+
+ "\2\u0c71\2\u0ce8\2\u0cf1\2\u0d68\2\u0d71\2\u0de8\2\u0df1\2\u0e52\2\u0e5b"+
+ "\2\u0ed2\2\u0edb\2\u0f22\2\u0f2b\2\u1042\2\u104b\2\u1092\2\u109b\2\u17e2"+
+ "\2\u17eb\2\u1812\2\u181b\2\u1948\2\u1951\2\u19d2\2\u19db\2\u1a82\2\u1a8b"+
+ "\2\u1a92\2\u1a9b\2\u1b52\2\u1b5b\2\u1bb2\2\u1bbb\2\u1c42\2\u1c4b\2\u1c52"+
+ "\2\u1c5b\2\ua622\2\ua62b\2\ua8d2\2\ua8db\2\ua902\2\ua90b\2\ua9d2\2\ua9db"+
+ "\2\ua9f2\2\ua9fb\2\uaa52\2\uaa5b\2\uabf2\2\uabfb\2\uff12\2\uff1b\2\u04a2"+
+ "\3\u04ab\3\u1068\3\u1071\3\u10f2\3\u10fb\3\u1138\3\u1141\3\u11d2\3\u11db"+
+ "\3\u12f2\3\u12fb\3\u1452\3\u145b\3\u14d2\3\u14db\3\u1652\3\u165b\3\u16c2"+
+ "\3\u16cb\3\u1732\3\u173b\3\u18e2\3\u18eb\3\u1c52\3\u1c5b\3\u1d52\3\u1d5b"+
+ "\3\u6a62\3\u6a6b\3\u6b52\3\u6b5b\3\ud7d0\3\ud801\3\ue952\3\ue95b\3\u024b"+
+ "\2C\2\\\2c\2|\2\u00ac\2\u00ac\2\u00b7\2\u00b7\2\u00bc\2\u00bc\2\u00c2"+
+ "\2\u00d8\2\u00da\2\u00f8\2\u00fa\2\u02c3\2\u02c8\2\u02d3\2\u02e2\2\u02e6"+
+ "\2\u02ee\2\u02ee\2\u02f0\2\u02f0\2\u0372\2\u0376\2\u0378\2\u0379\2\u037c"+
+ "\2\u037f\2\u0381\2\u0381\2\u0388\2\u0388\2\u038a\2\u038c\2\u038e\2\u038e"+
+ "\2\u0390\2\u03a3\2\u03a5\2\u03f7\2\u03f9\2\u0483\2\u048c\2\u0531\2\u0533"+
+ "\2\u0558\2\u055b\2\u055b\2\u0563\2\u0589\2\u05d2\2\u05ec\2\u05f2\2\u05f4"+
+ "\2\u0622\2\u064c\2\u0670\2\u0671\2\u0673\2\u06d5\2\u06d7\2\u06d7\2\u06e7"+
+ "\2\u06e8\2\u06f0\2\u06f1\2\u06fc\2\u06fe\2\u0701\2\u0701\2\u0712\2\u0712"+
+ "\2\u0714\2\u0731\2\u074f\2\u07a7\2\u07b3\2\u07b3\2\u07cc\2\u07ec\2\u07f6"+
+ "\2\u07f7\2\u07fc\2\u07fc\2\u0802\2\u0817\2\u081c\2\u081c\2\u0826\2\u0826"+
+ "\2\u082a\2\u082a\2\u0842\2\u085a\2\u0862\2\u086c\2\u08a2\2\u08b6\2\u08b8"+
+ "\2\u08bf\2\u0906\2\u093b\2\u093f\2\u093f\2\u0952\2\u0952\2\u095a\2\u0963"+
+ "\2\u0973\2\u0982\2\u0987\2\u098e\2\u0991\2\u0992\2\u0995\2\u09aa\2\u09ac"+
+ "\2\u09b2\2\u09b4\2\u09b4\2\u09b8\2\u09bb\2\u09bf\2\u09bf\2\u09d0\2\u09d0"+
+ "\2\u09de\2\u09df\2\u09e1\2\u09e3\2\u09f2\2\u09f3\2\u09fe\2\u09fe\2\u0a07"+
+ "\2\u0a0c\2\u0a11\2\u0a12\2\u0a15\2\u0a2a\2\u0a2c\2\u0a32\2\u0a34\2\u0a35"+
+ "\2\u0a37\2\u0a38\2\u0a3a\2\u0a3b\2\u0a5b\2\u0a5e\2\u0a60\2\u0a60\2\u0a74"+
+ "\2\u0a76\2\u0a87\2\u0a8f\2\u0a91\2\u0a93\2\u0a95\2\u0aaa\2\u0aac\2\u0ab2"+
+ "\2\u0ab4\2\u0ab5\2\u0ab7\2\u0abb\2\u0abf\2\u0abf\2\u0ad2\2\u0ad2\2\u0ae2"+
+ "\2\u0ae3\2\u0afb\2\u0afb\2\u0b07\2\u0b0e\2\u0b11\2\u0b12\2\u0b15\2\u0b2a"+
+ "\2\u0b2c\2\u0b32\2\u0b34\2\u0b35\2\u0b37\2\u0b3b\2\u0b3f\2\u0b3f\2\u0b5e"+
+ "\2\u0b5f\2\u0b61\2\u0b63\2\u0b73\2\u0b73\2\u0b85\2\u0b85\2\u0b87\2\u0b8c"+
+ "\2\u0b90\2\u0b92\2\u0b94\2\u0b97\2\u0b9b\2\u0b9c\2\u0b9e\2\u0b9e\2\u0ba0"+
+ "\2\u0ba1\2\u0ba5\2\u0ba6\2\u0baa\2\u0bac\2\u0bb0\2\u0bbb\2\u0bd2\2\u0bd2"+
+ "\2\u0c07\2\u0c0e\2\u0c10\2\u0c12\2\u0c14\2\u0c2a\2\u0c2c\2\u0c3b\2\u0c3f"+
+ "\2\u0c3f\2\u0c5a\2\u0c5c\2\u0c62\2\u0c63\2\u0c82\2\u0c82\2\u0c87\2\u0c8e"+
+ "\2\u0c90\2\u0c92\2\u0c94\2\u0caa\2\u0cac\2\u0cb5\2\u0cb7\2\u0cbb\2\u0cbf"+
+ "\2\u0cbf\2\u0ce0\2\u0ce0\2\u0ce2\2\u0ce3\2\u0cf3\2\u0cf4\2\u0d07\2\u0d0e"+
+ "\2\u0d10\2\u0d12\2\u0d14\2\u0d3c\2\u0d3f\2\u0d3f\2\u0d50\2\u0d50\2\u0d56"+
+ "\2\u0d58\2\u0d61\2\u0d63\2\u0d7c\2\u0d81\2\u0d87\2\u0d98\2\u0d9c\2\u0db3"+
+ "\2\u0db5\2\u0dbd\2\u0dbf\2\u0dbf\2\u0dc2\2\u0dc8\2\u0e03\2\u0e32\2\u0e34"+
+ "\2\u0e35\2\u0e42\2\u0e48\2\u0e83\2\u0e84\2\u0e86\2\u0e86\2\u0e89\2\u0e8a"+
+ "\2\u0e8c\2\u0e8c\2\u0e8f\2\u0e8f\2\u0e96\2\u0e99\2\u0e9b\2\u0ea1\2\u0ea3"+
+ "\2\u0ea5\2\u0ea7\2\u0ea7\2\u0ea9\2\u0ea9\2\u0eac\2\u0ead\2\u0eaf\2\u0eb2"+
+ "\2\u0eb4\2\u0eb5\2\u0ebf\2\u0ebf\2\u0ec2\2\u0ec6\2\u0ec8\2\u0ec8\2\u0ede"+
+ "\2\u0ee1\2\u0f02\2\u0f02\2\u0f42\2\u0f49\2\u0f4b\2\u0f6e\2\u0f8a\2\u0f8e"+
+ "\2\u1002\2\u102c\2\u1041\2\u1041\2\u1052\2\u1057\2\u105c\2\u105f\2\u1063"+
+ "\2\u1063\2\u1067\2\u1068\2\u1070\2\u1072\2\u1077\2\u1083\2\u1090\2\u1090"+
+ "\2\u10a2\2\u10c7\2\u10c9\2\u10c9\2\u10cf\2\u10cf\2\u10d2\2\u10fc\2\u10fe"+
+ "\2\u124a\2\u124c\2\u124f\2\u1252\2\u1258\2\u125a\2\u125a\2\u125c\2\u125f"+
+ "\2\u1262\2\u128a\2\u128c\2\u128f\2\u1292\2\u12b2\2\u12b4\2\u12b7\2\u12ba"+
+ "\2\u12c0\2\u12c2\2\u12c2\2\u12c4\2\u12c7\2\u12ca\2\u12d8\2\u12da\2\u1312"+
+ "\2\u1314\2\u1317\2\u131a\2\u135c\2\u1382\2\u1391\2\u13a2\2\u13f7\2\u13fa"+
+ "\2\u13ff\2\u1403\2\u166e\2\u1671\2\u1681\2\u1683\2\u169c\2\u16a2\2\u16ec"+
+ "\2\u16f3\2\u16fa\2\u1702\2\u170e\2\u1710\2\u1713\2\u1722\2\u1733\2\u1742"+
+ "\2\u1753\2\u1762\2\u176e\2\u1770\2\u1772\2\u1782\2\u17b5\2\u17d9\2\u17d9"+
+ "\2\u17de\2\u17de\2\u1822\2\u1879\2\u1882\2\u1886\2\u1889\2\u18aa\2\u18ac"+
+ "\2\u18ac\2\u18b2\2\u18f7\2\u1902\2\u1920\2\u1952\2\u196f\2\u1972\2\u1976"+
+ "\2\u1982\2\u19ad\2\u19b2\2\u19cb\2\u1a02\2\u1a18\2\u1a22\2\u1a56\2\u1aa9"+
+ "\2\u1aa9\2\u1b07\2\u1b35\2\u1b47\2\u1b4d\2\u1b85\2\u1ba2\2\u1bb0\2\u1bb1"+
+ "\2\u1bbc\2\u1be7\2\u1c02\2\u1c25\2\u1c4f\2\u1c51\2\u1c5c\2\u1c7f\2\u1c82"+
+ "\2\u1c8a\2\u1ceb\2\u1cee\2\u1cf0\2\u1cf3\2\u1cf7\2\u1cf8\2\u1d02\2\u1dc1"+
+ "\2\u1e02\2\u1f17\2\u1f1a\2\u1f1f\2\u1f22\2\u1f47\2\u1f4a\2\u1f4f\2\u1f52"+
+ "\2\u1f59\2\u1f5b\2\u1f5b\2\u1f5d\2\u1f5d\2\u1f5f\2\u1f5f\2\u1f61\2\u1f7f"+
+ "\2\u1f82\2\u1fb6\2\u1fb8\2\u1fbe\2\u1fc0\2\u1fc0\2\u1fc4\2\u1fc6\2\u1fc8"+
+ "\2\u1fce\2\u1fd2\2\u1fd5\2\u1fd8\2\u1fdd\2\u1fe2\2\u1fee\2\u1ff4\2\u1ff6"+
+ "\2\u1ff8\2\u1ffe\2\u2073\2\u2073\2\u2081\2\u2081\2\u2092\2\u209e\2\u2104"+
+ "\2\u2104\2\u2109\2\u2109\2\u210c\2\u2115\2\u2117\2\u2117\2\u211b\2\u211f"+
+ "\2\u2126\2\u2126\2\u2128\2\u2128\2\u212a\2\u212a\2\u212c\2\u212f\2\u2131"+
+ "\2\u213b\2\u213e\2\u2141\2\u2147\2\u214b\2\u2150\2\u2150\2\u2185\2\u2186"+
+ "\2\u2c02\2\u2c30\2\u2c32\2\u2c60\2\u2c62\2\u2ce6\2\u2ced\2\u2cf0\2\u2cf4"+
+ "\2\u2cf5\2\u2d02\2\u2d27\2\u2d29\2\u2d29\2\u2d2f\2\u2d2f\2\u2d32\2\u2d69"+
+ "\2\u2d71\2\u2d71\2\u2d82\2\u2d98\2\u2da2\2\u2da8\2\u2daa\2\u2db0\2\u2db2"+
+ "\2\u2db8\2\u2dba\2\u2dc0\2\u2dc2\2\u2dc8\2\u2dca\2\u2dd0\2\u2dd2\2\u2dd8"+
+ "\2\u2dda\2\u2de0\2\u2e31\2\u2e31\2\u3007\2\u3008\2\u3033\2\u3037\2\u303d"+
+ "\2\u303e\2\u3043\2\u3098\2\u309f\2\u30a1\2\u30a3\2\u30fc\2\u30fe\2\u3101"+
+ "\2\u3107\2\u3130\2\u3133\2\u3190\2\u31a2\2\u31bc\2\u31f2\2\u3201\2\u3402"+
+ "\2\u4db7\2\u4e02\2\u9fec\2\ua002\2\ua48e\2\ua4d2\2\ua4ff\2\ua502\2\ua60e"+
+ "\2\ua612\2\ua621\2\ua62c\2\ua62d\2\ua642\2\ua670\2\ua681\2\ua69f\2\ua6a2"+
+ "\2\ua6e7\2\ua719\2\ua721\2\ua724\2\ua78a\2\ua78d\2\ua7b0\2\ua7b2\2\ua7b9"+
+ "\2\ua7f9\2\ua803\2\ua805\2\ua807\2\ua809\2\ua80c\2\ua80e\2\ua824\2\ua842"+
+ "\2\ua875\2\ua884\2\ua8b5\2\ua8f4\2\ua8f9\2\ua8fd\2\ua8fd\2\ua8ff\2\ua8ff"+
+ "\2\ua90c\2\ua927\2\ua932\2\ua948\2\ua962\2\ua97e\2\ua986\2\ua9b4\2\ua9d1"+
+ "\2\ua9d1\2\ua9e2\2\ua9e6\2\ua9e8\2\ua9f1\2\ua9fc\2\uaa00\2\uaa02\2\uaa2a"+
+ "\2\uaa42\2\uaa44\2\uaa46\2\uaa4d\2\uaa62\2\uaa78\2\uaa7c\2\uaa7c\2\uaa80"+
+ "\2\uaab1\2\uaab3\2\uaab3\2\uaab7\2\uaab8\2\uaabb\2\uaabf\2\uaac2\2\uaac2"+
+ "\2\uaac4\2\uaac4\2\uaadd\2\uaadf\2\uaae2\2\uaaec\2\uaaf4\2\uaaf6\2\uab03"+
+ "\2\uab08\2\uab0b\2\uab10\2\uab13\2\uab18\2\uab22\2\uab28\2\uab2a\2\uab30"+
+ "\2\uab32\2\uab5c\2\uab5e\2\uab67\2\uab72\2\uabe4\2\uac02\2\ud7a5\2\ud7b2"+
+ "\2\ud7c8\2\ud7cd\2\ud7fd\2\uf902\2\ufa6f\2\ufa72\2\ufadb\2\ufb02\2\ufb08"+
+ "\2\ufb15\2\ufb19\2\ufb1f\2\ufb1f\2\ufb21\2\ufb2a\2\ufb2c\2\ufb38\2\ufb3a"+
+ "\2\ufb3e\2\ufb40\2\ufb40\2\ufb42\2\ufb43\2\ufb45\2\ufb46\2\ufb48\2\ufbb3"+
+ "\2\ufbd5\2\ufd3f\2\ufd52\2\ufd91\2\ufd94\2\ufdc9\2\ufdf2\2\ufdfd\2\ufe72"+
+ "\2\ufe76\2\ufe78\2\ufefe\2\uff23\2\uff3c\2\uff43\2\uff5c\2\uff68\2\uffc0"+
+ "\2\uffc4\2\uffc9\2\uffcc\2\uffd1\2\uffd4\2\uffd9\2\uffdc\2\uffde\2\2\3"+
+ "\r\3\17\3(\3*\3<\3>\3?\3A\3O\3R\3_\3\u0082\3\u00fc\3\u0282\3\u029e\3\u02a2"+
+ "\3\u02d2\3\u0302\3\u0321\3\u032f\3\u0342\3\u0344\3\u034b\3\u0352\3\u0377"+
+ "\3\u0382\3\u039f\3\u03a2\3\u03c5\3\u03ca\3\u03d1\3\u0402\3\u049f\3\u04b2"+
+ "\3\u04d5\3\u04da\3\u04fd\3\u0502\3\u0529\3\u0532\3\u0565\3\u0602\3\u0738"+
+ "\3\u0742\3\u0757\3\u0762\3\u0769\3\u0802\3\u0807\3\u080a\3\u080a\3\u080c"+
+ "\3\u0837\3\u0839\3\u083a\3\u083e\3\u083e\3\u0841\3\u0857\3\u0862\3\u0878"+
+ "\3\u0882\3\u08a0\3\u08e2\3\u08f4\3\u08f6\3\u08f7\3\u0902\3\u0917\3\u0922"+
+ "\3\u093b\3\u0982\3\u09b9\3\u09c0\3\u09c1\3\u0a02\3\u0a02\3\u0a12\3\u0a15"+
+ "\3\u0a17\3\u0a19\3\u0a1b\3\u0a35\3\u0a62\3\u0a7e\3\u0a82\3\u0a9e\3\u0ac2"+
+ "\3\u0ac9\3\u0acb\3\u0ae6\3\u0b02\3\u0b37\3\u0b42\3\u0b57\3\u0b62\3\u0b74"+
+ "\3\u0b82\3\u0b93\3\u0c02\3\u0c4a\3\u0c82\3\u0cb4\3\u0cc2\3\u0cf4\3\u1005"+
+ "\3\u1039\3\u1085\3\u10b1\3\u10d2\3\u10ea\3\u1105\3\u1128\3\u1152\3\u1174"+
+ "\3\u1178\3\u1178\3\u1185\3\u11b4\3\u11c3\3\u11c6\3\u11dc\3\u11dc\3\u11de"+
+ "\3\u11de\3\u1202\3\u1213\3\u1215\3\u122d\3\u1282\3\u1288\3\u128a\3\u128a"+
+ "\3\u128c\3\u128f\3\u1291\3\u129f\3\u12a1\3\u12aa\3\u12b2\3\u12e0\3\u1307"+
+ "\3\u130e\3\u1311\3\u1312\3\u1315\3\u132a\3\u132c\3\u1332\3\u1334\3\u1335"+
+ "\3\u1337\3\u133b\3\u133f\3\u133f\3\u1352\3\u1352\3\u135f\3\u1363\3\u1402"+
+ "\3\u1436\3\u1449\3\u144c\3\u1482\3\u14b1\3\u14c6\3\u14c7\3\u14c9\3\u14c9"+
+ "\3\u1582\3\u15b0\3\u15da\3\u15dd\3\u1602\3\u1631\3\u1646\3\u1646\3\u1682"+
+ "\3\u16ac\3\u1702\3\u171b\3\u18a2\3\u18e1\3\u1901\3\u1901\3\u1a02\3\u1a02"+
+ "\3\u1a0d\3\u1a34\3\u1a3c\3\u1a3c\3\u1a52\3\u1a52\3\u1a5e\3\u1a85\3\u1a88"+
+ "\3\u1a8b\3\u1ac2\3\u1afa\3\u1c02\3\u1c0a\3\u1c0c\3\u1c30\3\u1c42\3\u1c42"+
+ "\3\u1c74\3\u1c91\3\u1d02\3\u1d08\3\u1d0a\3\u1d0b\3\u1d0d\3\u1d32\3\u1d48"+
+ "\3\u1d48\3\u2002\3\u239b\3\u2482\3\u2545\3\u3002\3\u3430\3\u4402\3\u4648"+
+ "\3\u6802\3\u6a3a\3\u6a42\3\u6a60\3\u6ad2\3\u6aef\3\u6b02\3\u6b31\3\u6b42"+
+ "\3\u6b45\3\u6b65\3\u6b79\3\u6b7f\3\u6b91\3\u6f02\3\u6f46\3\u6f52\3\u6f52"+
+ "\3\u6f95\3\u6fa1\3\u6fe2\3\u6fe3\3\u7002\3\u87ee\3\u8802\3\u8af4\3\ub002"+
+ "\3\ub120\3\ub172\3\ub2fd\3\ubc02\3\ubc6c\3\ubc72\3\ubc7e\3\ubc82\3\ubc8a"+
+ "\3\ubc92\3\ubc9b\3\ud402\3\ud456\3\ud458\3\ud49e\3\ud4a0\3\ud4a1\3\ud4a4"+
+ "\3\ud4a4\3\ud4a7\3\ud4a8\3\ud4ab\3\ud4ae\3\ud4b0\3\ud4bb\3\ud4bd\3\ud4bd"+
+ "\3\ud4bf\3\ud4c5\3\ud4c7\3\ud507\3\ud509\3\ud50c\3\ud50f\3\ud516\3\ud518"+
+ "\3\ud51e\3\ud520\3\ud53b\3\ud53d\3\ud540\3\ud542\3\ud546\3\ud548\3\ud548"+
+ "\3\ud54c\3\ud552\3\ud554\3\ud6a7\3\ud6aa\3\ud6c2\3\ud6c4\3\ud6dc\3\ud6de"+
+ "\3\ud6fc\3\ud6fe\3\ud716\3\ud718\3\ud736\3\ud738\3\ud750\3\ud752\3\ud770"+
+ "\3\ud772\3\ud78a\3\ud78c\3\ud7aa\3\ud7ac\3\ud7c4\3\ud7c6\3\ud7cd\3\ue802"+
+ "\3\ue8c6\3\ue902\3\ue945\3\uee02\3\uee05\3\uee07\3\uee21\3\uee23\3\uee24"+
+ "\3\uee26\3\uee26\3\uee29\3\uee29\3\uee2b\3\uee34\3\uee36\3\uee39\3\uee3b"+
+ "\3\uee3b\3\uee3d\3\uee3d\3\uee44\3\uee44\3\uee49\3\uee49\3\uee4b\3\uee4b"+
+ "\3\uee4d\3\uee4d\3\uee4f\3\uee51\3\uee53\3\uee54\3\uee56\3\uee56\3\uee59"+
+ "\3\uee59\3\uee5b\3\uee5b\3\uee5d\3\uee5d\3\uee5f\3\uee5f\3\uee61\3\uee61"+
+ "\3\uee63\3\uee64\3\uee66\3\uee66\3\uee69\3\uee6c\3\uee6e\3\uee74\3\uee76"+
+ "\3\uee79\3\uee7b\3\uee7e\3\uee80\3\uee80\3\uee82\3\uee8b\3\uee8d\3\uee9d"+
+ "\3\ueea3\3\ueea5\3\ueea7\3\ueeab\3\ueead\3\ueebd\3\2\4\ua6d8\4\ua702\4"+
+ "\ub736\4\ub742\4\ub81f\4\ub822\4\ucea3\4\uceb2\4\uebe2\4\uf802\4\ufa1f"+
+ "\4\u05f6\2\4\3\2\2\2\2\6\3\2\2\2\2\b\3\2\2\2\2\n\3\2\2\2\2\f\3\2\2\2\2"+
+ "\16\3\2\2\2\2\20\3\2\2\2\2\22\3\2\2\2\2\24\3\2\2\2\2\26\3\2\2\2\2\30\3"+
+ "\2\2\2\2\32\3\2\2\2\2\34\3\2\2\2\2\36\3\2\2\2\2 \3\2\2\2\2\"\3\2\2\2\2"+
+ "$\3\2\2\2\2&\3\2\2\2\2(\3\2\2\2\2*\3\2\2\2\2,\3\2\2\2\2.\3\2\2\2\2\60"+
+ "\3\2\2\2\2\62\3\2\2\2\2\64\3\2\2\2\2\66\3\2\2\2\28\3\2\2\2\2:\3\2\2\2"+
+ "\2<\3\2\2\2\2>\3\2\2\2\2@\3\2\2\2\2B\3\2\2\2\2D\3\2\2\2\2F\3\2\2\2\2H"+
+ "\3\2\2\2\2J\3\2\2\2\2L\3\2\2\2\2N\3\2\2\2\2P\3\2\2\2\2R\3\2\2\2\2T\3\2"+
+ "\2\2\2V\3\2\2\2\2X\3\2\2\2\2Z\3\2\2\2\2\\\3\2\2\2\2^\3\2\2\2\2`\3\2\2"+
+ "\2\2b\3\2\2\2\2d\3\2\2\2\2f\3\2\2\2\2h\3\2\2\2\2j\3\2\2\2\2l\3\2\2\2\2"+
+ "n\3\2\2\2\2p\3\2\2\2\2r\3\2\2\2\2t\3\2\2\2\2v\3\2\2\2\2x\3\2\2\2\2z\3"+
+ "\2\2\2\2|\3\2\2\2\2~\3\2\2\2\2\u0080\3\2\2\2\2\u0082\3\2\2\2\2\u0084\3"+
+ "\2\2\2\2\u0086\3\2\2\2\2\u0088\3\2\2\2\2\u008a\3\2\2\2\2\u008c\3\2\2\2"+
+ "\2\u008e\3\2\2\2\2\u0090\3\2\2\2\2\u0092\3\2\2\2\2\u0094\3\2\2\2\2\u0096"+
+ "\3\2\2\2\2\u0098\3\2\2\2\2\u009a\3\2\2\2\2\u009c\3\2\2\2\2\u009e\3\2\2"+
+ "\2\2\u00a0\3\2\2\2\2\u00a2\3\2\2\2\2\u00a4\3\2\2\2\2\u00a6\3\2\2\2\2\u00a8"+
+ "\3\2\2\2\2\u00aa\3\2\2\2\2\u00ac\3\2\2\2\2\u00ae\3\2\2\2\2\u00b0\3\2\2"+
+ "\2\2\u00b2\3\2\2\2\2\u00b4\3\2\2\2\2\u00b6\3\2\2\2\2\u00b8\3\2\2\2\2\u00ba"+
+ "\3\2\2\2\2\u00bc\3\2\2\2\2\u00be\3\2\2\2\2\u00c0\3\2\2\2\2\u00c2\3\2\2"+
+ "\2\2\u00c4\3\2\2\2\2\u00c6\3\2\2\2\2\u00c8\3\2\2\2\2\u00ca\3\2\2\2\2\u00cc"+
+ "\3\2\2\2\2\u00ce\3\2\2\2\2\u00d0\3\2\2\2\2\u00d2\3\2\2\2\2\u00d4\3\2\2"+
+ "\2\2\u00d6\3\2\2\2\2\u00d8\3\2\2\2\2\u00da\3\2\2\2\2\u00dc\3\2\2\2\2\u00de"+
+ "\3\2\2\2\2\u00e0\3\2\2\2\2\u00e2\3\2\2\2\2\u00e4\3\2\2\2\2\u00e6\3\2\2"+
+ "\2\2\u00e8\3\2\2\2\2\u00ea\3\2\2\2\2\u00ec\3\2\2\2\2\u00ee\3\2\2\2\2\u00f0"+
+ "\3\2\2\2\2\u00f2\3\2\2\2\2\u00f4\3\2\2\2\2\u00f6\3\2\2\2\2\u00f8\3\2\2"+
+ "\2\2\u00fa\3\2\2\2\2\u00fc\3\2\2\2\2\u00fe\3\2\2\2\2\u0100\3\2\2\2\2\u0102"+
+ "\3\2\2\2\2\u0104\3\2\2\2\2\u0106\3\2\2\2\2\u0108\3\2\2\2\2\u010a\3\2\2"+
+ "\2\2\u010c\3\2\2\2\2\u010e\3\2\2\2\2\u0110\3\2\2\2\2\u0112\3\2\2\2\2\u0114"+
+ "\3\2\2\2\2\u0116\3\2\2\2\2\u0118\3\2\2\2\2\u011a\3\2\2\2\2\u0120\3\2\2"+
+ "\2\2\u0124\3\2\2\2\2\u0126\3\2\2\2\2\u0128\3\2\2\2\2\u012a\3\2\2\2\2\u012c"+
+ "\3\2\2\2\2\u012e\3\2\2\2\2\u0130\3\2\2\2\2\u0132\3\2\2\2\2\u0134\3\2\2"+
+ "\2\2\u0136\3\2\2\2\2\u0138\3\2\2\2\2\u013a\3\2\2\2\3\u0150\3\2\2\2\3\u0152"+
+ "\3\2\2\2\3\u0154\3\2\2\2\3\u0156\3\2\2\2\3\u0158\3\2\2\2\4\u015c\3\2\2"+
+ "\2\6\u0172\3\2\2\2\b\u0174\3\2\2\2\n\u017b\3\2\2\2\f\u0183\3\2\2\2\16"+
+ "\u018a\3\2\2\2\20\u0191\3\2\2\2\22\u0198\3\2\2\2\24\u019f\3\2\2\2\26\u01a8"+
+ "\3\2\2\2\30\u01b2\3\2\2\2\32\u01ba\3\2\2\2\34\u01c4\3\2\2\2\36\u01d0\3"+
+ "\2\2\2 \u01d7\3\2\2\2\"\u01e2\3\2\2\2$\u01e5\3\2\2\2&\u01eb\3\2\2\2(\u01f4"+
+ "\3\2\2\2*\u01f9\3\2\2\2,\u0200\3\2\2\2.\u0207\3\2\2\2\60\u020d\3\2\2\2"+
+ "\62\u0212\3\2\2\2\64\u0219\3\2\2\2\66\u0223\3\2\2\28\u0229\3\2\2\2:\u022c"+
+ "\3\2\2\2<\u022e\3\2\2\2>\u0235\3\2\2\2@\u023b\3\2\2\2B\u0248\3\2\2\2D"+
+ "\u0251\3\2\2\2F\u0255\3\2\2\2H\u0259\3\2\2\2J\u025f\3\2\2\2L\u0261\3\2"+
+ "\2\2N\u0264\3\2\2\2P\u0269\3\2\2\2R\u026f\3\2\2\2T\u0275\3\2\2\2V\u027c"+
+ "\3\2\2\2X\u0283\3\2\2\2Z\u028c\3\2\2\2\\\u0292\3\2\2\2^\u0298\3\2\2\2"+
+ "`\u029f\3\2\2\2b\u02a5\3\2\2\2d\u02ac\3\2\2\2f\u02b2\3\2\2\2h\u02bb\3"+
+ "\2\2\2j\u02c3\3\2\2\2l\u02c9\3\2\2\2n\u02d0\3\2\2\2p\u02d5\3\2\2\2r\u02de"+
+ "\3\2\2\2t\u02ed\3\2\2\2v\u02f3\3\2\2\2x\u02f7\3\2\2\2z\u02fa\3\2\2\2|"+
+ "\u0301\3\2\2\2~\u030b\3\2\2\2\u0080\u0315\3\2\2\2\u0082\u0321\3\2\2\2"+
+ "\u0084\u032a\3\2\2\2\u0086\u0334\3\2\2\2\u0088\u033c\3\2\2\2\u008a\u0348"+
+ "\3\2\2\2\u008c\u0357\3\2\2\2\u008e\u035d\3\2\2\2\u0090\u0361\3\2\2\2\u0092"+
+ "\u0365\3\2\2\2\u0094\u036a\3\2\2\2\u0096\u0372\3\2\2\2\u0098\u037a\3\2"+
+ "\2\2\u009a\u037f\3\2\2\2\u009c\u0389\3\2\2\2\u009e\u0390\3\2\2\2\u00a0"+
+ "\u0395\3\2\2\2\u00a2\u039b\3\2\2\2\u00a4\u039e\3\2\2\2\u00a6\u03a2\3\2"+
+ "\2\2\u00a8\u03a9\3\2\2\2\u00aa\u03ae\3\2\2\2\u00ac\u03b3\3\2\2\2\u00ae"+
+ "\u03b8\3\2\2\2\u00b0\u03c0\3\2\2\2\u00b2\u03c7\3\2\2\2\u00b4\u03cd\3\2"+
+ "\2\2\u00b6\u03db\3\2\2\2\u00b8\u03de\3\2\2\2\u00ba\u03e4\3\2\2\2\u00bc"+
+ "\u03e9\3\2\2\2\u00be\u03f4\3\2\2\2\u00c0\u03f8\3\2\2\2\u00c2\u03ff\3\2"+
+ "\2\2\u00c4\u0408\3\2\2\2\u00c6\u040c\3\2\2\2\u00c8\u0412\3\2\2\2\u00ca"+
+ "\u041c\3\2\2\2\u00cc\u041e\3\2\2\2\u00ce\u0422\3\2\2\2\u00d0\u0424\3\2"+
+ "\2\2\u00d2\u0428\3\2\2\2\u00d4\u042a\3\2\2\2\u00d6\u042e\3\2\2\2\u00d8"+
+ "\u0430\3\2\2\2\u00da\u0432\3\2\2\2\u00dc\u0434\3\2\2\2\u00de\u0436\3\2"+
+ "\2\2\u00e0\u0438\3\2\2\2\u00e2\u043d\3\2\2\2\u00e4\u0442\3\2\2\2\u00e6"+
+ "\u0445\3\2\2\2\u00e8\u0449\3\2\2\2\u00ea\u044c\3\2\2\2\u00ec\u044f\3\2"+
+ "\2\2\u00ee\u0452\3\2\2\2\u00f0\u0455\3\2\2\2\u00f2\u0457\3\2\2\2\u00f4"+
+ "\u045a\3\2\2\2\u00f6\u045c\3\2\2\2\u00f8\u045f\3\2\2\2\u00fa\u0461\3\2"+
+ "\2\2\u00fc\u0463\3\2\2\2\u00fe\u0465\3\2\2\2\u0100\u0468\3\2\2\2\u0102"+
+ "\u046b\3\2\2\2\u0104\u046e\3\2\2\2\u0106\u0470\3\2\2\2\u0108\u0472\3\2"+
+ "\2\2\u010a\u0474\3\2\2\2\u010c\u0476\3\2\2\2\u010e\u0478\3\2\2\2\u0110"+
+ "\u047a\3\2\2\2\u0112\u0488\3\2\2\2\u0114\u048c\3\2\2\2\u0116\u0498\3\2"+
+ "\2\2\u0118\u04a6\3\2\2\2\u011a\u04b2\3\2\2\2\u011c\u04d6\3\2\2\2\u011e"+
+ "\u04d8\3\2\2\2\u0120\u04e1\3\2\2\2\u0122\u04e7\3\2\2\2\u0124\u04ee\3\2"+
+ "\2\2\u0126\u04f4\3\2\2\2\u0128\u04f6\3\2\2\2\u012a\u04fb\3\2\2\2\u012c"+
+ "\u0500\3\2\2\2\u012e\u0507\3\2\2\2\u0130\u0512\3\2\2\2\u0132\u051d\3\2"+
+ "\2\2\u0134\u052a\3\2\2\2\u0136\u0530\3\2\2\2\u0138\u053f\3\2\2\2\u013a"+
+ "\u0545\3\2\2\2\u013c\u0554\3\2\2\2\u013e\u0556\3\2\2\2\u0140\u0572\3\2"+
+ "\2\2\u0142\u057c\3\2\2\2\u0144\u057e\3\2\2\2\u0146\u0580\3\2\2\2\u0148"+
+ "\u0582\3\2\2\2\u014a\u058a\3\2\2\2\u014c\u058c\3\2\2\2\u014e\u058e\3\2"+
+ "\2\2\u0150\u0591\3\2\2\2\u0152\u0597\3\2\2\2\u0154\u05a5\3\2\2\2\u0156"+
+ "\u05c2\3\2\2\2\u0158\u05c6\3\2\2\2\u015a\u015d\5\6\3\2\u015b\u015d\5\u011a"+
+ "\u008d\2\u015c\u015a\3\2\2\2\u015c\u015b\3\2\2\2\u015d\u015e\3\2\2\2\u015e"+
+ "\u015f\b\2\2\2\u015f\5\3\2\2\2\u0160\u016a\5\u0140\u00a0\2\u0161\u0162"+
+ "\7\60\2\2\u0162\u0164\6\3\2\2\u0163\u0165\5\u0140\u00a0\2\u0164\u0163"+
+ "\3\2\2\2\u0164\u0165\3\2\2\2\u0165\u0167\3\2\2\2\u0166\u0168\5\u0148\u00a4"+
+ "\2\u0167\u0166\3\2\2\2\u0167\u0168\3\2\2\2\u0168\u016b\3\2\2\2\u0169\u016b"+
+ "\5\u0148\u00a4\2\u016a\u0161\3\2\2\2\u016a\u0169\3\2\2\2\u016b\u0173\3"+
+ "\2\2\2\u016c\u016d\7\60\2\2\u016d\u016e\6\3\3\2\u016e\u0170\5\u0140\u00a0"+
+ "\2\u016f\u0171\5\u0148\u00a4\2\u0170\u016f\3\2\2\2\u0170\u0171\3\2\2\2"+
+ "\u0171\u0173\3\2\2\2\u0172\u0160\3\2\2\2\u0172\u016c\3\2\2\2\u0173\7\3"+
+ "\2\2\2\u0174\u0175\7v\2\2\u0175\u0176\7t\2\2\u0176\u0177\7w\2\2\u0177"+
+ "\u0178\7g\2\2\u0178\u0179\3\2\2\2\u0179\u017a\b\4\2\2\u017a\t\3\2\2\2"+
+ "\u017b\u017c\7h\2\2\u017c\u017d\7c\2\2\u017d\u017e\7n\2\2\u017e\u017f"+
+ "\7u\2\2\u017f\u0180\7g\2\2\u0180\u0181\3\2\2\2\u0181\u0182\b\5\2\2\u0182"+
+ "\13\3\2\2\2\u0183\u0184\7c\2\2\u0184\u0185\7u\2\2\u0185\u0186\7u\2\2\u0186"+
+ "\u0187\7g\2\2\u0187\u0188\7t\2\2\u0188\u0189\7v\2\2\u0189\r\3\2\2\2\u018a"+
+ "\u018b\7c\2\2\u018b\u018c\7u\2\2\u018c\u018d\7u\2\2\u018d\u018e\7w\2\2"+
+ "\u018e\u018f\7o\2\2\u018f\u0190\7g\2\2\u0190\17\3\2\2\2\u0191\u0192\7"+
+ "k\2\2\u0192\u0193\7p\2\2\u0193\u0194\7j\2\2\u0194\u0195\7c\2\2\u0195\u0196"+
+ "\7n\2\2\u0196\u0197\7g\2\2\u0197\21\3\2\2\2\u0198\u0199\7g\2\2\u0199\u019a"+
+ "\7z\2\2\u019a\u019b\7j\2\2\u019b\u019c\7c\2\2\u019c\u019d\7n\2\2\u019d"+
+ "\u019e\7g\2\2\u019e\23\3\2\2\2\u019f\u01a0\7t\2\2\u01a0\u01a1\7g\2\2\u01a1"+
+ "\u01a2\7s\2\2\u01a2\u01a3\7w\2\2\u01a3\u01a4\7k\2\2\u01a4\u01a5\7t\2\2"+
+ "\u01a5\u01a6\7g\2\2\u01a6\u01a7\7u\2\2\u01a7\25\3\2\2\2\u01a8\u01a9\7"+
+ "r\2\2\u01a9\u01aa\7t\2\2\u01aa\u01ab\7g\2\2\u01ab\u01ac\7u\2\2\u01ac\u01ad"+
+ "\7g\2\2\u01ad\u01ae\7t\2\2\u01ae\u01af\7x\2\2\u01af\u01b0\7g\2\2\u01b0"+
+ "\u01b1\7u\2\2\u01b1\27\3\2\2\2\u01b2\u01b3\7g\2\2\u01b3\u01b4\7p\2\2\u01b4"+
+ "\u01b5\7u\2\2\u01b5\u01b6\7w\2\2\u01b6\u01b7\7t\2\2\u01b7\u01b8\7g\2\2"+
+ "\u01b8\u01b9\7u\2\2\u01b9\31\3\2\2\2\u01ba\u01bb\7k\2\2\u01bb\u01bc\7"+
+ "p\2\2\u01bc\u01bd\7x\2\2\u01bd\u01be\7c\2\2\u01be\u01bf\7t\2\2\u01bf\u01c0"+
+ "\7k\2\2\u01c0\u01c1\7c\2\2\u01c1\u01c2\7p\2\2\u01c2\u01c3\7v\2\2\u01c3"+
+ "\33\3\2\2\2\u01c4\u01c5\7f\2\2\u01c5\u01c6\7g\2\2\u01c6\u01c7\7e\2\2\u01c7"+
+ "\u01c8\7t\2\2\u01c8\u01c9\7g\2\2\u01c9\u01ca\7c\2\2\u01ca\u01cb\7u\2\2"+
+ "\u01cb\u01cc\7g\2\2\u01cc\u01cd\7u\2\2\u01cd\u01ce\3\2\2\2\u01ce\u01cf"+
+ "\b\16\2\2\u01cf\35\3\2\2\2\u01d0\u01d1\7r\2\2\u01d1\u01d2\7w\2\2\u01d2"+
+ "\u01d3\7t\2\2\u01d3\u01d4\7g\2\2\u01d4\u01d5\3\2\2\2\u01d5\u01d6\b\17"+
+ "\2\2\u01d6\37\3\2\2\2\u01d7\u01d8\7k\2\2\u01d8\u01d9\7o\2\2\u01d9\u01da"+
+ "\7r\2\2\u01da\u01db\7n\2\2\u01db\u01dc\7g\2\2\u01dc\u01dd\7o\2\2\u01dd"+
+ "\u01de\7g\2\2\u01de\u01df\7p\2\2\u01df\u01e0\7v\2\2\u01e0\u01e1\7u\2\2"+
+ "\u01e1!\3\2\2\2\u01e2\u01e3\7c\2\2\u01e3\u01e4\7u\2\2\u01e4#\3\2\2\2\u01e5"+
+ "\u01e6\7q\2\2\u01e6\u01e7\7n\2\2\u01e7\u01e8\7f\2\2\u01e8\u01e9\3\2\2"+
+ "\2\u01e9\u01ea\b\22\2\2\u01ea%\3\2\2\2\u01eb\u01ec\7d\2\2\u01ec\u01ed"+
+ "\7g\2\2\u01ed\u01ee\7h\2\2\u01ee\u01ef\7q\2\2\u01ef\u01f0\7t\2\2\u01f0"+
+ "\u01f1\7g\2\2\u01f1\u01f2\3\2\2\2\u01f2\u01f3\b\23\2\2\u01f3\'\3\2\2\2"+
+ "\u01f4\u01f5\7%\2\2\u01f5\u01f6\7n\2\2\u01f6\u01f7\7j\2\2\u01f7\u01f8"+
+ "\7u\2\2\u01f8)\3\2\2\2\u01f9\u01fa\7h\2\2\u01fa\u01fb\7q\2\2\u01fb\u01fc"+
+ "\7t\2\2\u01fc\u01fd\7c\2\2\u01fd\u01fe\7n\2\2\u01fe\u01ff\7n\2\2\u01ff"+
+ "+\3\2\2\2\u0200\u0201\7g\2\2\u0201\u0202\7z\2\2\u0202\u0203\7k\2\2\u0203"+
+ "\u0204\7u\2\2\u0204\u0205\7v\2\2\u0205\u0206\7u\2\2\u0206-\3\2\2\2\u0207"+
+ "\u0208\7c\2\2\u0208\u0209\7e\2\2\u0209\u020a\7e\2\2\u020a\u020b\3\2\2"+
+ "\2\u020b\u020c\b\27\2\2\u020c/\3\2\2\2\u020d\u020e\7h\2\2\u020e\u020f"+
+ "\7q\2\2\u020f\u0210\7n\2\2\u0210\u0211\7f\2\2\u0211\61\3\2\2\2\u0212\u0213"+
+ "\7w\2\2\u0213\u0214\7p\2\2\u0214\u0215\7h\2\2\u0215\u0216\7q\2\2\u0216"+
+ "\u0217\7n\2\2\u0217\u0218\7f\2\2\u0218\63\3\2\2\2\u0219\u021a\7w\2\2\u021a"+
+ "\u021b\7p\2\2\u021b\u021c\7h\2\2\u021c\u021d\7q\2\2\u021d\u021e\7n\2\2"+
+ "\u021e\u021f\7f\2\2\u021f\u0220\7k\2\2\u0220\u0221\7p\2\2\u0221\u0222"+
+ "\7i\2\2\u0222\65\3\2\2\2\u0223\u0224\7i\2\2\u0224\u0225\7j\2\2\u0225\u0226"+
+ "\7q\2\2\u0226\u0227\7u\2\2\u0227\u0228\7v\2\2\u0228\67\3\2\2\2\u0229\u022a"+
+ "\7k\2\2\u022a\u022b\7p\2\2\u022b9\3\2\2\2\u022c\u022d\7%\2\2\u022d;\3"+
+ "\2\2\2\u022e\u022f\7u\2\2\u022f\u0230\7w\2\2\u0230\u0231\7d\2\2\u0231"+
+ "\u0232\7u\2\2\u0232\u0233\7g\2\2\u0233\u0234\7v\2\2\u0234=\3\2\2\2\u0235"+
+ "\u0236\7w\2\2\u0236\u0237\7p\2\2\u0237\u0238\7k\2\2\u0238\u0239\7q\2\2"+
+ "\u0239\u023a\7p\2\2\u023a?\3\2\2\2\u023b\u023c\7k\2\2\u023c\u023d\7p\2"+
+ "\2\u023d\u023e\7v\2\2\u023e\u023f\7g\2\2\u023f\u0240\7t\2\2\u0240\u0241"+
+ "\7u\2\2\u0241\u0242\7g\2\2\u0242\u0243\7e\2\2\u0243\u0244\7v\2\2\u0244"+
+ "\u0245\7k\2\2\u0245\u0246\7q\2\2\u0246\u0247\7p\2\2\u0247A\3\2\2\2\u0248"+
+ "\u0249\7u\2\2\u0249\u024a\7g\2\2\u024a\u024b\7v\2\2\u024b\u024c\7o\2\2"+
+ "\u024c\u024d\7k\2\2\u024d\u024e\7p\2\2\u024e\u024f\7w\2\2\u024f\u0250"+
+ "\7u\2\2\u0250C\3\2\2\2\u0251\u0252\7?\2\2\u0252\u0253\7?\2\2\u0253\u0254"+
+ "\7@\2\2\u0254E\3\2\2\2\u0255\u0256\7/\2\2\u0256\u0257\7/\2\2\u0257\u0258"+
+ "\7,\2\2\u0258G\3\2\2\2\u0259\u025a\7c\2\2\u025a\u025b\7r\2\2\u025b\u025c"+
+ "\7r\2\2\u025c\u025d\7n\2\2\u025d\u025e\7{\2\2\u025eI\3\2\2\2\u025f\u0260"+
+ "\7A\2\2\u0260K\3\2\2\2\u0261\u0262\7#\2\2\u0262\u0263\7>\2\2\u0263M\3"+
+ "\2\2\2\u0264\u0265\7#\2\2\u0265\u0266\7@\2\2\u0266\u0267\3\2\2\2\u0267"+
+ "\u0268\b\'\2\2\u0268O\3\2\2\2\u0269\u026a\7u\2\2\u026a\u026b\7g\2\2\u026b"+
+ "\u026c\7s\2\2\u026c\u026d\3\2\2\2\u026d\u026e\b(\2\2\u026eQ\3\2\2\2\u026f"+
+ "\u0270\7u\2\2\u0270\u0271\7g\2\2\u0271\u0272\7v\2\2\u0272\u0273\3\2\2"+
+ "\2\u0273\u0274\b)\2\2\u0274S\3\2\2\2\u0275\u0276\7o\2\2\u0276\u0277\7"+
+ "u\2\2\u0277\u0278\7g\2\2\u0278\u0279\7v\2\2\u0279\u027a\3\2\2\2\u027a"+
+ "\u027b\b*\2\2\u027bU\3\2\2\2\u027c\u027d\7f\2\2\u027d\u027e\7k\2\2\u027e"+
+ "\u027f\7e\2\2\u027f\u0280\7v\2\2\u0280\u0281\3\2\2\2\u0281\u0282\b+\2"+
+ "\2\u0282W\3\2\2\2\u0283\u0284\7q\2\2\u0284\u0285\7r\2\2\u0285\u0286\7"+
+ "v\2\2\u0286\u0287\7k\2\2\u0287\u0288\7q\2\2\u0288\u0289\7p\2\2\u0289\u028a"+
+ "\3\2\2\2\u028a\u028b\b,\2\2\u028bY\3\2\2\2\u028c\u028d\7n\2\2\u028d\u028e"+
+ "\7g\2\2\u028e\u028f\7p\2\2\u028f\u0290\3\2\2\2\u0290\u0291\b-\2\2\u0291"+
+ "[\3\2\2\2\u0292\u0293\7p\2\2\u0293\u0294\7g\2\2\u0294\u0295\7y\2\2\u0295"+
+ "\u0296\3\2\2\2\u0296\u0297\b.\2\2\u0297]\3\2\2\2\u0298\u0299\7o\2\2\u0299"+
+ "\u029a\7c\2\2\u029a\u029b\7m\2\2\u029b\u029c\7g\2\2\u029c\u029d\3\2\2"+
+ "\2\u029d\u029e\b/\2\2\u029e_\3\2\2\2\u029f\u02a0\7e\2\2\u02a0\u02a1\7"+
+ "c\2\2\u02a1\u02a2\7r\2\2\u02a2\u02a3\3\2\2\2\u02a3\u02a4\b\60\2\2\u02a4"+
+ "a\3\2\2\2\u02a5\u02a6\7u\2\2\u02a6\u02a7\7q\2\2\u02a7\u02a8\7o\2\2\u02a8"+
+ "\u02a9\7g\2\2\u02a9\u02aa\3\2\2\2\u02aa\u02ab\b\61\2\2\u02abc\3\2\2\2"+
+ "\u02ac\u02ad\7i\2\2\u02ad\u02ae\7g\2\2\u02ae\u02af\7v\2\2\u02af\u02b0"+
+ "\3\2\2\2\u02b0\u02b1\b\62\2\2\u02b1e\3\2\2\2\u02b2\u02b3\7f\2\2\u02b3"+
+ "\u02b4\7q\2\2\u02b4\u02b5\7o\2\2\u02b5\u02b6\7c\2\2\u02b6\u02b7\7k\2\2"+
+ "\u02b7\u02b8\7p\2\2\u02b8\u02b9\3\2\2\2\u02b9\u02ba\b\63\2\2\u02bag\3"+
+ "\2\2\2\u02bb\u02bc\7c\2\2\u02bc\u02bd\7z\2\2\u02bd\u02be\7k\2\2\u02be"+
+ "\u02bf\7q\2\2\u02bf\u02c0\7o\2\2\u02c0\u02c1\3\2\2\2\u02c1\u02c2\b\64"+
+ "\2\2\u02c2i\3\2\2\2\u02c3\u02c4\7c\2\2\u02c4\u02c5\7f\2\2\u02c5\u02c6"+
+ "\7v\2\2\u02c6\u02c7\3\2\2\2\u02c7\u02c8\b\65\2\2\u02c8k\3\2\2\2\u02c9"+
+ "\u02ca\7p\2\2\u02ca\u02cb\7q\2\2\u02cb\u02cc\7p\2\2\u02cc\u02cd\7g\2\2"+
+ "\u02cd\u02ce\3\2\2\2\u02ce\u02cf\b\66\2\2\u02cfm\3\2\2\2\u02d0\u02d1\7"+
+ "r\2\2\u02d1\u02d2\7t\2\2\u02d2\u02d3\7g\2\2\u02d3\u02d4\7f\2\2\u02d4o"+
+ "\3\2\2\2\u02d5\u02d6\7v\2\2\u02d6\u02d7\7{\2\2\u02d7\u02d8\7r\2\2\u02d8"+
+ "\u02d9\7g\2\2\u02d9\u02da\7Q\2\2\u02da\u02db\7h\2\2\u02db\u02dc\3\2\2"+
+ "\2\u02dc\u02dd\b8\2\2\u02ddq\3\2\2\2\u02de\u02df\7k\2\2\u02df\u02e0\7"+
+ "u\2\2\u02e0\u02e1\7E\2\2\u02e1\u02e2\7q\2\2\u02e2\u02e3\7o\2\2\u02e3\u02e4"+
+ "\7r\2\2\u02e4\u02e5\7c\2\2\u02e5\u02e6\7t\2\2\u02e6\u02e7\7c\2\2\u02e7"+
+ "\u02e8\7d\2\2\u02e8\u02e9\7n\2\2\u02e9\u02ea\7g\2\2\u02ea\u02eb\3\2\2"+
+ "\2\u02eb\u02ec\b9\2\2\u02ecs\3\2\2\2\u02ed\u02ee\7u\2\2\u02ee\u02ef\7"+
+ "j\2\2\u02ef\u02f0\7c\2\2\u02f0\u02f1\7t\2\2\u02f1\u02f2\7g\2\2\u02f2u"+
+ "\3\2\2\2\u02f3\u02f4\7B\2\2\u02f4\u02f5\3\2\2\2\u02f5\u02f6\b;\2\2\u02f6"+
+ "w\3\2\2\2\u02f7\u02f8\7\60\2\2\u02f8\u02f9\7\60\2\2\u02f9y\3\2\2\2\u02fa"+
+ "\u02fb\7u\2\2\u02fb\u02fc\7j\2\2\u02fc\u02fd\7c\2\2\u02fd\u02fe\7t\2\2"+
+ "\u02fe\u02ff\7g\2\2\u02ff\u0300\7f\2\2\u0300{\3\2\2\2\u0301\u0302\7g\2"+
+ "\2\u0302\u0303\7z\2\2\u0303\u0304\7e\2\2\u0304\u0305\7n\2\2\u0305\u0306"+
+ "\7w\2\2\u0306\u0307\7u\2\2\u0307\u0308\7k\2\2\u0308\u0309\7x\2\2\u0309"+
+ "\u030a\7g\2\2\u030a}\3\2\2\2\u030b\u030c\7r\2\2\u030c\u030d\7t\2\2\u030d"+
+ "\u030e\7g\2\2\u030e\u030f\7f\2\2\u030f\u0310\7k\2\2\u0310\u0311\7e\2\2"+
+ "\u0311\u0312\7c\2\2\u0312\u0313\7v\2\2\u0313\u0314\7g\2\2\u0314\177\3"+
+ "\2\2\2\u0315\u0316\7y\2\2\u0316\u0317\7t\2\2\u0317\u0318\7k\2\2\u0318"+
+ "\u0319\7v\2\2\u0319\u031a\7g\2\2\u031a\u031b\7R\2\2\u031b\u031c\7g\2\2"+
+ "\u031c\u031d\7t\2\2\u031d\u031e\7o\2\2\u031e\u031f\3\2\2\2\u031f\u0320"+
+ "\b@\2\2\u0320\u0081\3\2\2\2\u0321\u0322\7p\2\2\u0322\u0323\7q\2\2\u0323"+
+ "\u0324\7R\2\2\u0324\u0325\7g\2\2\u0325\u0326\7t\2\2\u0326\u0327\7o\2\2"+
+ "\u0327\u0328\3\2\2\2\u0328\u0329\bA\2\2\u0329\u0083\3\2\2\2\u032a\u032b"+
+ "\7v\2\2\u032b\u032c\7t\2\2\u032c\u032d\7w\2\2\u032d\u032e\7u\2\2\u032e"+
+ "\u032f\7v\2\2\u032f\u0330\7g\2\2\u0330\u0331\7f\2\2\u0331\u0332\3\2\2"+
+ "\2\u0332\u0333\bB\2\2\u0333\u0085\3\2\2\2\u0334\u0335\7q\2\2\u0335\u0336"+
+ "\7w\2\2\u0336\u0337\7v\2\2\u0337\u0338\7n\2\2\u0338\u0339\7k\2\2\u0339"+
+ "\u033a\7p\2\2\u033a\u033b\7g\2\2\u033b\u0087\3\2\2\2\u033c\u033d\7k\2"+
+ "\2\u033d\u033e\7p\2\2\u033e\u033f\7k\2\2\u033f\u0340\7v\2\2\u0340\u0341"+
+ "\7G\2\2\u0341\u0342\7p\2\2\u0342\u0343\7u\2\2\u0343\u0344\7w\2\2\u0344"+
+ "\u0345\7t\2\2\u0345\u0346\7g\2\2\u0346\u0347\7u\2\2\u0347\u0089\3\2\2"+
+ "\2\u0348\u0349\7k\2\2\u0349\u034a\7o\2\2\u034a\u034b\7r\2\2\u034b\u034c"+
+ "\7q\2\2\u034c\u034d\7t\2\2\u034d\u034e\7v\2\2\u034e\u034f\7T\2\2\u034f"+
+ "\u0350\7g\2\2\u0350\u0351\7s\2\2\u0351\u0352\7w\2\2\u0352\u0353\7k\2\2"+
+ "\u0353\u0354\7t\2\2\u0354\u0355\7g\2\2\u0355\u0356\7u\2\2\u0356\u008b"+
+ "\3\2\2\2\u0357\u0358\7r\2\2\u0358\u0359\7t\2\2\u0359\u035a\7q\2\2\u035a"+
+ "\u035b\7q\2\2\u035b\u035c\7h\2\2\u035c\u008d\3\2\2\2\u035d\u035e\7?\2"+
+ "\2\u035e\u035f\7?\2\2\u035f\u0360\7?\2\2\u0360\u008f\3\2\2\2\u0361\u0362"+
+ "\7#\2\2\u0362\u0363\7?\2\2\u0363\u0364\7?\2\2\u0364\u0091\3\2\2\2\u0365"+
+ "\u0366\7y\2\2\u0366\u0367\7k\2\2\u0367\u0368\7v\2\2\u0368\u0369\7j\2\2"+
+ "\u0369\u0093\3\2\2\2\u036a\u036b\7d\2\2\u036b\u036c\7t\2\2\u036c\u036d"+
+ "\7g\2\2\u036d\u036e\7c\2\2\u036e\u036f\7m\2\2\u036f\u0370\3\2\2\2\u0370"+
+ "\u0371\bJ\2\2\u0371\u0095\3\2\2\2\u0372\u0373\7f\2\2\u0373\u0374\7g\2"+
+ "\2\u0374\u0375\7h\2\2\u0375\u0376\7c\2\2\u0376\u0377\7w\2\2\u0377\u0378"+
+ "\7n\2\2\u0378\u0379\7v\2\2\u0379\u0097\3\2\2\2\u037a\u037b\7h\2\2\u037b"+
+ "\u037c\7w\2\2\u037c\u037d\7p\2\2\u037d\u037e\7e\2\2\u037e\u0099\3\2\2"+
+ "\2\u037f\u0380\7k\2\2\u0380\u0381\7p\2\2\u0381\u0382\7v\2\2\u0382\u0383"+
+ "\7g\2\2\u0383\u0384\7t\2\2\u0384\u0385\7h\2\2\u0385\u0386\7c\2\2\u0386"+
+ "\u0387\7e\2\2\u0387\u0388\7g\2\2\u0388\u009b\3\2\2\2\u0389\u038a\7u\2"+
+ "\2\u038a\u038b\7g\2\2\u038b\u038c\7n\2\2\u038c\u038d\7g\2\2\u038d\u038e"+
+ "\7e\2\2\u038e\u038f\7v\2\2\u038f\u009d\3\2\2\2\u0390\u0391\7e\2\2\u0391"+
+ "\u0392\7c\2\2\u0392\u0393\7u\2\2\u0393\u0394\7g\2\2\u0394\u009f\3\2\2"+
+ "\2\u0395\u0396\7f\2\2\u0396\u0397\7g\2\2\u0397\u0398\7h\2\2\u0398\u0399"+
+ "\7g\2\2\u0399\u039a\7t\2\2\u039a\u00a1\3\2\2\2\u039b\u039c\7i\2\2\u039c"+
+ "\u039d\7q\2\2\u039d\u00a3\3\2\2\2\u039e\u039f\7o\2\2\u039f\u03a0\7c\2"+
+ "\2\u03a0\u03a1\7r\2\2\u03a1\u00a5\3\2\2\2\u03a2\u03a3\7u\2\2\u03a3\u03a4"+
+ "\7v\2\2\u03a4\u03a5\7t\2\2\u03a5\u03a6\7w\2\2\u03a6\u03a7\7e\2\2\u03a7"+
+ "\u03a8\7v\2\2\u03a8\u00a7\3\2\2\2\u03a9\u03aa\7e\2\2\u03aa\u03ab\7j\2"+
+ "\2\u03ab\u03ac\7c\2\2\u03ac\u03ad\7p\2\2\u03ad\u00a9\3\2\2\2\u03ae\u03af"+
+ "\7g\2\2\u03af\u03b0\7n\2\2\u03b0\u03b1\7u\2\2\u03b1\u03b2\7g\2\2\u03b2"+
+ "\u00ab\3\2\2\2\u03b3\u03b4\7i\2\2\u03b4\u03b5\7q\2\2\u03b5\u03b6\7v\2"+
+ "\2\u03b6\u03b7\7q\2\2\u03b7\u00ad\3\2\2\2\u03b8\u03b9\7r\2\2\u03b9\u03ba"+
+ "\7c\2\2\u03ba\u03bb\7e\2\2\u03bb\u03bc\7m\2\2\u03bc\u03bd\7c\2\2\u03bd"+
+ "\u03be\7i\2\2\u03be\u03bf\7g\2\2\u03bf\u00af\3\2\2\2\u03c0\u03c1\7u\2"+
+ "\2\u03c1\u03c2\7y\2\2\u03c2\u03c3\7k\2\2\u03c3\u03c4\7v\2\2\u03c4\u03c5"+
+ "\7e\2\2\u03c5\u03c6\7j\2\2\u03c6\u00b1\3\2\2\2\u03c7\u03c8\7e\2\2\u03c8"+
+ "\u03c9\7q\2\2\u03c9\u03ca\7p\2\2\u03ca\u03cb\7u\2\2\u03cb\u03cc\7v\2\2"+
+ "\u03cc\u00b3\3\2\2\2\u03cd\u03ce\7h\2\2\u03ce\u03cf\7c\2\2\u03cf\u03d0"+
+ "\7n\2\2\u03d0\u03d1\7n\2\2\u03d1\u03d2\7v\2\2\u03d2\u03d3\7j\2\2\u03d3"+
+ "\u03d4\7t\2\2\u03d4\u03d5\7q\2\2\u03d5\u03d6\7w\2\2\u03d6\u03d7\7i\2\2"+
+ "\u03d7\u03d8\7j\2\2\u03d8\u03d9\3\2\2\2\u03d9\u03da\bZ\2\2\u03da\u00b5"+
+ "\3\2\2\2\u03db\u03dc\7k\2\2\u03dc\u03dd\7h\2\2\u03dd\u00b7\3\2\2\2\u03de"+
+ "\u03df\7t\2\2\u03df\u03e0\7c\2\2\u03e0\u03e1\7p\2\2\u03e1\u03e2\7i\2\2"+
+ "\u03e2\u03e3\7g\2\2\u03e3\u00b9\3\2\2\2\u03e4\u03e5\7v\2\2\u03e5\u03e6"+
+ "\7{\2\2\u03e6\u03e7\7r\2\2\u03e7\u03e8\7g\2\2\u03e8\u00bb\3\2\2\2\u03e9"+
+ "\u03ea\7e\2\2\u03ea\u03eb\7q\2\2\u03eb\u03ec\7p\2\2\u03ec\u03ed\7v\2\2"+
+ "\u03ed\u03ee\7k\2\2\u03ee\u03ef\7p\2\2\u03ef\u03f0\7w\2\2\u03f0\u03f1"+
+ "\7g\2\2\u03f1\u03f2\3\2\2\2\u03f2\u03f3\b^\2\2\u03f3\u00bd\3\2\2\2\u03f4"+
+ "\u03f5\7h\2\2\u03f5\u03f6\7q\2\2\u03f6\u03f7\7t\2\2\u03f7\u00bf\3\2\2"+
+ "\2\u03f8\u03f9\7k\2\2\u03f9\u03fa\7o\2\2\u03fa\u03fb\7r\2\2\u03fb\u03fc"+
+ "\7q\2\2\u03fc\u03fd\7t\2\2\u03fd\u03fe\7v\2\2\u03fe\u00c1\3\2\2\2\u03ff"+
+ "\u0400\7t\2\2\u0400\u0401\7g\2\2\u0401\u0402\7v\2\2\u0402\u0403\7w\2\2"+
+ "\u0403\u0404\7t\2\2\u0404\u0405\7p\2\2\u0405\u0406\3\2\2\2\u0406\u0407"+
+ "\ba\2\2\u0407\u00c3\3\2\2\2\u0408\u0409\7x\2\2\u0409\u040a\7c\2\2\u040a"+
+ "\u040b\7t\2\2\u040b\u00c5\3\2\2\2\u040c\u040d\7p\2\2\u040d\u040e\7k\2"+
+ "\2\u040e\u040f\7n\2\2\u040f\u0410\3\2\2\2\u0410\u0411\bc\2\2\u0411\u00c7"+
+ "\3\2\2\2\u0412\u0417\5\u014a\u00a5\2\u0413\u0416\5\u014a\u00a5\2\u0414"+
+ "\u0416\5\u014c\u00a6\2\u0415\u0413\3\2\2\2\u0415\u0414\3\2\2\2\u0416\u0419"+
+ "\3\2\2\2\u0417\u0415\3\2\2\2\u0417\u0418\3\2\2\2\u0418\u041a\3\2\2\2\u0419"+
+ "\u0417\3\2\2\2\u041a\u041b\bd\2\2\u041b\u00c9\3\2\2\2\u041c\u041d\7*\2"+
+ "\2\u041d\u00cb\3\2\2\2\u041e\u041f\7+\2\2\u041f\u0420\3\2\2\2\u0420\u0421"+
+ "\bf\2\2\u0421\u00cd\3\2\2\2\u0422\u0423\7}\2\2\u0423\u00cf\3\2\2\2\u0424"+
+ "\u0425\7\177\2\2\u0425\u0426\3\2\2\2\u0426\u0427\bh\2\2\u0427\u00d1\3"+
+ "\2\2\2\u0428\u0429\7]\2\2\u0429\u00d3\3\2\2\2\u042a\u042b\7_\2\2\u042b"+
+ "\u042c\3\2\2\2\u042c\u042d\bj\2\2\u042d\u00d5\3\2\2\2\u042e\u042f\7?\2"+
+ "\2\u042f\u00d7\3\2\2\2\u0430\u0431\7.\2\2\u0431\u00d9\3\2\2\2\u0432\u0433"+
+ "\7=\2\2\u0433\u00db\3\2\2\2\u0434\u0435\7<\2\2\u0435\u00dd\3\2\2\2\u0436"+
+ "\u0437\7\60\2\2\u0437\u00df\3\2\2\2\u0438\u0439\7-\2\2\u0439\u043a\7-"+
+ "\2\2\u043a\u043b\3\2\2\2\u043b\u043c\bp\2\2\u043c\u00e1\3\2\2\2\u043d"+
+ "\u043e\7/\2\2\u043e\u043f\7/\2\2\u043f\u0440\3\2\2\2\u0440\u0441\bq\2"+
+ "\2\u0441\u00e3\3\2\2\2\u0442\u0443\7<\2\2\u0443\u0444\7?\2\2\u0444\u00e5"+
+ "\3\2\2\2\u0445\u0446\7\60\2\2\u0446\u0447\7\60\2\2\u0447\u0448\7\60\2"+
+ "\2\u0448\u00e7\3\2\2\2\u0449\u044a\7~\2\2\u044a\u044b\7~\2\2\u044b\u00e9"+
+ "\3\2\2\2\u044c\u044d\7(\2\2\u044d\u044e\7(\2\2\u044e\u00eb\3\2\2\2\u044f"+
+ "\u0450\7?\2\2\u0450\u0451\7?\2\2\u0451\u00ed\3\2\2\2\u0452\u0453\7#\2"+
+ "\2\u0453\u0454\7?\2\2\u0454\u00ef\3\2\2\2\u0455\u0456\7>\2\2\u0456\u00f1"+
+ "\3\2\2\2\u0457\u0458\7>\2\2\u0458\u0459\7?\2\2\u0459\u00f3\3\2\2\2\u045a"+
+ "\u045b\7@\2\2\u045b\u00f5\3\2\2\2\u045c\u045d\7@\2\2\u045d\u045e\7?\2"+
+ "\2\u045e\u00f7\3\2\2\2\u045f\u0460\7~\2\2\u0460\u00f9\3\2\2\2\u0461\u0462"+
+ "\7\61\2\2\u0462\u00fb\3\2\2\2\u0463\u0464\7\'\2\2\u0464\u00fd\3\2\2\2"+
+ "\u0465\u0466\7>\2\2\u0466\u0467\7>\2\2\u0467\u00ff\3\2\2\2\u0468\u0469"+
+ "\7@\2\2\u0469\u046a\7@\2\2\u046a\u0101\3\2\2\2\u046b\u046c\7(\2\2\u046c"+
+ "\u046d\7`\2\2\u046d\u0103\3\2\2\2\u046e\u046f\7#\2\2\u046f\u0105\3\2\2"+
+ "\2\u0470\u0471\7-\2\2\u0471\u0107\3\2\2\2\u0472\u0473\7/\2\2\u0473\u0109"+
+ "\3\2\2\2\u0474\u0475\7`\2\2\u0475\u010b\3\2\2\2\u0476\u0477\7,\2\2\u0477"+
+ "\u010d\3\2\2\2\u0478\u0479\7(\2\2\u0479\u010f\3\2\2\2\u047a\u047b\7>\2"+
+ "\2\u047b\u047c\7/\2\2\u047c\u0111\3\2\2\2\u047d\u0489\7\62\2\2\u047e\u0485"+
+ "\t\2\2\2\u047f\u0481\7a\2\2\u0480\u047f\3\2\2\2\u0480\u0481\3\2\2\2\u0481"+
+ "\u0482\3\2\2\2\u0482\u0484\t\3\2\2\u0483\u0480\3\2\2\2\u0484\u0487\3\2"+
+ "\2\2\u0485\u0483\3\2\2\2\u0485\u0486\3\2\2\2\u0486\u0489\3\2\2\2\u0487"+
+ "\u0485\3\2\2\2\u0488\u047d\3\2\2\2\u0488\u047e\3\2\2\2\u0489\u048a\3\2"+
+ "\2\2\u048a\u048b\b\u0089\2\2\u048b\u0113\3\2\2\2\u048c\u048d\7\62\2\2"+
+ "\u048d\u0492\t\4\2\2\u048e\u0490\7a\2\2\u048f\u048e\3\2\2\2\u048f\u0490"+
+ "\3\2\2\2\u0490\u0491\3\2\2\2\u0491\u0493\5\u0146\u00a3\2\u0492\u048f\3"+
+ "\2\2\2\u0493\u0494\3\2\2\2\u0494\u0492\3\2\2\2\u0494\u0495\3\2\2\2\u0495"+
+ "\u0496\3\2\2\2\u0496\u0497\b\u008a\2\2\u0497\u0115\3\2\2\2\u0498\u049a"+
+ "\7\62\2\2\u0499\u049b\t\5\2\2\u049a\u0499\3\2\2\2\u049a\u049b\3\2\2\2"+
+ "\u049b\u04a0\3\2\2\2\u049c\u049e\7a\2\2\u049d\u049c\3\2\2\2\u049d\u049e"+
+ "\3\2\2\2\u049e\u049f\3\2\2\2\u049f\u04a1\5\u0142\u00a1\2\u04a0\u049d\3"+
+ "\2\2\2\u04a1\u04a2\3\2\2\2\u04a2\u04a0\3\2\2\2\u04a2\u04a3\3\2\2\2\u04a3"+
+ "\u04a4\3\2\2\2\u04a4\u04a5\b\u008b\2\2\u04a5\u0117\3\2\2\2\u04a6\u04a7"+
+ "\7\62\2\2\u04a7\u04ac\t\6\2\2\u04a8\u04aa\7a\2\2\u04a9\u04a8\3\2\2\2\u04a9"+
+ "\u04aa\3\2\2\2\u04aa\u04ab\3\2\2\2\u04ab\u04ad\5\u0144\u00a2\2\u04ac\u04a9"+
+ "\3\2\2\2\u04ad\u04ae\3\2\2\2\u04ae\u04ac\3\2\2\2\u04ae\u04af\3\2\2\2\u04af"+
+ "\u04b0\3\2\2\2\u04b0\u04b1\b\u008c\2\2\u04b1\u0119\3\2\2\2\u04b2\u04b3"+
+ "\7\62\2\2\u04b3\u04b4\t\6\2\2\u04b4\u04b5\5\u011c\u008e\2\u04b5\u04b6"+
+ "\5\u011e\u008f\2\u04b6\u011b\3\2\2\2\u04b7\u04b9\7a\2\2\u04b8\u04b7\3"+
+ "\2\2\2\u04b8\u04b9\3\2\2\2\u04b9\u04ba\3\2\2\2\u04ba\u04bc\5\u0144\u00a2"+
+ "\2\u04bb\u04b8\3\2\2\2\u04bc\u04bd\3\2\2\2\u04bd\u04bb\3\2\2\2\u04bd\u04be"+
+ "\3\2\2\2\u04be\u04c9\3\2\2\2\u04bf\u04c6\7\60\2\2\u04c0\u04c2\7a\2\2\u04c1"+
+ "\u04c0\3\2\2\2\u04c1\u04c2\3\2\2\2\u04c2\u04c3\3\2\2\2\u04c3\u04c5\5\u0144"+
+ "\u00a2\2\u04c4\u04c1\3\2\2\2\u04c5\u04c8\3\2\2\2\u04c6\u04c4\3\2\2\2\u04c6"+
+ "\u04c7\3\2\2\2\u04c7\u04ca\3\2\2\2\u04c8\u04c6\3\2\2\2\u04c9\u04bf\3\2"+
+ "\2\2\u04c9\u04ca\3\2\2\2\u04ca\u04d7\3\2\2\2\u04cb\u04cc\7\60\2\2\u04cc"+
+ "\u04d3\5\u0144\u00a2\2\u04cd\u04cf\7a\2\2\u04ce\u04cd\3\2\2\2\u04ce\u04cf"+
+ "\3\2\2\2\u04cf\u04d0\3\2\2\2\u04d0\u04d2\5\u0144\u00a2\2\u04d1\u04ce\3"+
+ "\2\2\2\u04d2\u04d5\3\2\2\2\u04d3\u04d1\3\2\2\2\u04d3\u04d4\3\2\2\2\u04d4"+
+ "\u04d7\3\2\2\2\u04d5\u04d3\3\2\2\2\u04d6\u04bb\3\2\2\2\u04d6\u04cb\3\2"+
+ "\2\2\u04d7\u011d\3\2\2\2\u04d8\u04d9\t\7\2\2\u04d9\u04da\t\b\2\2\u04da"+
+ "\u04db\5\u0140\u00a0\2\u04db\u011f\3\2\2\2\u04dc\u04e2\5\u0112\u0089\2"+
+ "\u04dd\u04e2\5\u0114\u008a\2\u04de\u04e2\5\u0116\u008b\2\u04df\u04e2\5"+
+ "\u0118\u008c\2\u04e0\u04e2\5\4\2\2\u04e1\u04dc\3\2\2\2\u04e1\u04dd\3\2"+
+ "\2\2\u04e1\u04de\3\2\2\2\u04e1\u04df\3\2\2\2\u04e1\u04e0\3\2\2\2\u04e2"+
+ "\u04e3\3\2\2\2\u04e3\u04e4\7k\2\2\u04e4\u04e5\3\2\2\2\u04e5\u04e6\b\u0090"+
+ "\2\2\u04e6\u0121\3\2\2\2\u04e7\u04ea\7)\2\2\u04e8\u04eb\5\u013c\u009e"+
+ "\2\u04e9\u04eb\5\u0126\u0093\2\u04ea\u04e8\3\2\2\2\u04ea\u04e9\3\2\2\2"+
+ "\u04eb\u04ec\3\2\2\2\u04ec\u04ed\7)\2\2\u04ed\u0123\3\2\2\2\u04ee\u04ef"+
+ "\5\u0122\u0091\2\u04ef\u04f0\3\2\2\2\u04f0\u04f1\b\u0092\2\2\u04f1\u0125"+
+ "\3\2\2\2\u04f2\u04f5\5\u0128\u0094\2\u04f3\u04f5\5\u012a\u0095\2\u04f4"+
+ "\u04f2\3\2\2\2\u04f4\u04f3\3\2\2\2\u04f5\u0127\3\2\2\2\u04f6\u04f7\7^"+
+ "\2\2\u04f7\u04f8\5\u0142\u00a1\2\u04f8\u04f9\5\u0142\u00a1\2\u04f9\u04fa"+
+ "\5\u0142\u00a1\2\u04fa\u0129\3\2\2\2\u04fb\u04fc\7^\2\2\u04fc\u04fd\7"+
+ "z\2\2\u04fd\u04fe\5\u0144\u00a2\2\u04fe\u04ff\5\u0144\u00a2\2\u04ff\u012b"+
+ "\3\2\2\2\u0500\u0501\7^\2\2\u0501\u0502\7w\2\2\u0502\u0503\5\u0144\u00a2"+
+ "\2\u0503\u0504\5\u0144\u00a2\2\u0504\u0505\5\u0144\u00a2\2\u0505\u0506"+
+ "\5\u0144\u00a2\2\u0506\u012d\3\2\2\2\u0507\u0508\7^\2\2\u0508\u0509\7"+
+ "W\2\2\u0509\u050a\5\u0144\u00a2\2\u050a\u050b\5\u0144\u00a2\2\u050b\u050c"+
+ "\5\u0144\u00a2\2\u050c\u050d\5\u0144\u00a2\2\u050d\u050e\5\u0144\u00a2"+
+ "\2\u050e\u050f\5\u0144\u00a2\2\u050f\u0510\5\u0144\u00a2\2\u0510\u0511"+
+ "\5\u0144\u00a2\2\u0511\u012f\3\2\2\2\u0512\u0516\7b\2\2\u0513\u0515\n"+
+ "\t\2\2\u0514\u0513\3\2\2\2\u0515\u0518\3\2\2\2\u0516\u0514\3\2\2\2\u0516"+
+ "\u0517\3\2\2\2\u0517\u0519\3\2\2\2\u0518\u0516\3\2\2\2\u0519\u051a\7b"+
+ "\2\2\u051a\u051b\3\2\2\2\u051b\u051c\b\u0098\2\2\u051c\u0131\3\2\2\2\u051d"+
+ "\u0522\7$\2\2\u051e\u0521\n\n\2\2\u051f\u0521\5\u013e\u009f\2\u0520\u051e"+
+ "\3\2\2\2\u0520\u051f\3\2\2\2\u0521\u0524\3\2\2\2\u0522\u0520\3\2\2\2\u0522"+
+ "\u0523\3\2\2\2\u0523\u0525\3\2\2\2\u0524\u0522\3\2\2\2\u0525\u0526\7$"+
+ "\2\2\u0526\u0527\3\2\2\2\u0527\u0528\b\u0099\2\2\u0528\u0133\3\2\2\2\u0529"+
+ "\u052b\t\13\2\2\u052a\u0529\3\2\2\2\u052b\u052c\3\2\2\2\u052c\u052a\3"+
+ "\2\2\2\u052c\u052d\3\2\2\2\u052d\u052e\3\2\2\2\u052e\u052f\b\u009a\3\2"+
+ "\u052f\u0135\3\2\2\2\u0530\u0531\7\61\2\2\u0531\u0532\7,\2\2\u0532\u0536"+
+ "\3\2\2\2\u0533\u0535\13\2\2\2\u0534\u0533\3\2\2\2\u0535\u0538\3\2\2\2"+
+ "\u0536\u0537\3\2\2\2\u0536\u0534\3\2\2\2\u0537\u0539\3\2\2\2\u0538\u0536"+
+ "\3\2\2\2\u0539\u053a\7,\2\2\u053a\u053b\7\61\2\2\u053b\u053c\3\2\2\2\u053c"+
+ "\u053d\b\u009b\3\2\u053d\u0137\3\2\2\2\u053e\u0540\t\f\2\2\u053f\u053e"+
+ "\3\2\2\2\u0540\u0541\3\2\2\2\u0541\u053f\3\2\2\2\u0541\u0542\3\2\2\2\u0542"+
+ "\u0543\3\2\2\2\u0543\u0544\b\u009c\3\2\u0544\u0139\3\2\2\2\u0545\u0546"+
+ "\7\61\2\2\u0546\u0547\7\61\2\2\u0547\u054b\3\2\2\2\u0548\u054a\n\f\2\2"+
+ "\u0549\u0548\3\2\2\2\u054a\u054d\3\2\2\2\u054b\u0549\3\2\2\2\u054b\u054c"+
+ "\3\2\2\2\u054c\u054e\3\2\2\2\u054d\u054b\3\2\2\2\u054e\u054f\b\u009d\3"+
+ "\2\u054f\u013b\3\2\2\2\u0550\u0555\n\r\2\2\u0551\u0555\5\u012c\u0096\2"+
+ "\u0552\u0555\5\u012e\u0097\2\u0553\u0555\5\u013e\u009f\2\u0554\u0550\3"+
+ "\2\2\2\u0554\u0551\3\2\2\2\u0554\u0552\3\2\2\2\u0554\u0553\3\2\2\2\u0555"+
+ "\u013d\3\2\2\2\u0556\u0570\7^\2\2\u0557\u0558\7w\2\2\u0558\u0559\5\u0144"+
+ "\u00a2\2\u0559\u055a\5\u0144\u00a2\2\u055a\u055b\5\u0144\u00a2\2\u055b"+
+ "\u055c\5\u0144\u00a2\2\u055c\u0571\3\2\2\2\u055d\u055e\7W\2\2\u055e\u055f"+
+ "\5\u0144\u00a2\2\u055f\u0560\5\u0144\u00a2\2\u0560\u0561\5\u0144\u00a2"+
+ "\2\u0561\u0562\5\u0144\u00a2\2\u0562\u0563\5\u0144\u00a2\2\u0563\u0564"+
+ "\5\u0144\u00a2\2\u0564\u0565\5\u0144\u00a2\2\u0565\u0566\5\u0144\u00a2"+
+ "\2\u0566\u0571\3\2\2\2\u0567\u0571\t\16\2\2\u0568\u0569\5\u0142\u00a1"+
+ "\2\u0569\u056a\5\u0142\u00a1\2\u056a\u056b\5\u0142\u00a1\2\u056b\u0571"+
+ "\3\2\2\2\u056c\u056d\7z\2\2\u056d\u056e\5\u0144\u00a2\2\u056e\u056f\5"+
+ "\u0144\u00a2\2\u056f\u0571\3\2\2\2\u0570\u0557\3\2\2\2\u0570\u055d\3\2"+
+ "\2\2\u0570\u0567\3\2\2\2\u0570\u0568\3\2\2\2\u0570\u056c\3\2\2\2\u0571"+
+ "\u013f\3\2\2\2\u0572\u0579\t\3\2\2\u0573\u0575\7a\2\2\u0574\u0573\3\2"+
+ "\2\2\u0574\u0575\3\2\2\2\u0575\u0576\3\2\2\2\u0576\u0578\t\3\2\2\u0577"+
+ "\u0574\3\2\2\2\u0578\u057b\3\2\2\2\u0579\u0577\3\2\2\2\u0579\u057a\3\2"+
+ "\2\2\u057a\u0141\3\2\2\2\u057b\u0579\3\2\2\2\u057c\u057d\t\17\2\2\u057d"+
+ "\u0143\3\2\2\2\u057e\u057f\t\20\2\2\u057f\u0145\3\2\2\2\u0580\u0581\t"+
+ "\21\2\2\u0581\u0147\3\2\2\2\u0582\u0584\t\22\2\2\u0583\u0585\t\b\2\2\u0584"+
+ "\u0583\3\2\2\2\u0584\u0585\3\2\2\2\u0585\u0586\3\2\2\2\u0586\u0587\5\u0140"+
+ "\u00a0\2\u0587\u0149\3\2\2\2\u0588\u058b\5\u014e\u00a7\2\u0589\u058b\7"+
+ "a\2\2\u058a\u0588\3\2\2\2\u058a\u0589\3\2\2\2\u058b\u014b\3\2\2\2\u058c"+
+ "\u058d\t\23\2\2\u058d\u014d\3\2\2\2\u058e\u058f\t\24\2\2\u058f\u014f\3"+
+ "\2\2\2\u0590\u0592\t\13\2\2\u0591\u0590\3\2\2\2\u0592\u0593\3\2\2\2\u0593"+
+ "\u0591\3\2\2\2\u0593\u0594\3\2\2\2\u0594\u0595\3\2\2\2\u0595\u0596\b\u00a8"+
+ "\3\2\u0596\u0151\3\2\2\2\u0597\u0598\7\61\2\2\u0598\u0599\7,\2\2\u0599"+
+ "\u059d\3\2\2\2\u059a\u059c\n\f\2\2\u059b\u059a\3\2\2\2\u059c\u059f\3\2"+
+ "\2\2\u059d\u059e\3\2\2\2\u059d\u059b\3\2\2\2\u059e\u05a0\3\2\2\2\u059f"+
+ "\u059d\3\2\2\2\u05a0\u05a1\7,\2\2\u05a1\u05a2\7\61\2\2\u05a2\u05a3\3\2"+
+ "\2\2\u05a3\u05a4\b\u00a9\3\2\u05a4\u0153\3\2\2\2\u05a5\u05a6\7\61\2\2"+
+ "\u05a6\u05a7\7\61\2\2\u05a7\u05ab\3\2\2\2\u05a8\u05aa\n\f\2\2\u05a9\u05a8"+
+ "\3\2\2\2\u05aa\u05ad\3\2\2\2\u05ab\u05a9\3\2\2\2\u05ab\u05ac\3\2\2\2\u05ac"+
+ "\u05ae\3\2\2\2\u05ad\u05ab\3\2\2\2\u05ae\u05af\b\u00aa\3\2\u05af\u0155"+
+ "\3\2\2\2\u05b0\u05b2\t\f\2\2\u05b1\u05b0\3\2\2\2\u05b2\u05b3\3\2\2\2\u05b3"+
+ "\u05b1\3\2\2\2\u05b3\u05b4\3\2\2\2\u05b4\u05c3\3\2\2\2\u05b5\u05c3\7="+
+ "\2\2\u05b6\u05b7\7\61\2\2\u05b7\u05b8\7,\2\2\u05b8\u05bc\3\2\2\2\u05b9"+
+ "\u05bb\13\2\2\2\u05ba\u05b9\3\2\2\2\u05bb\u05be\3\2\2\2\u05bc\u05bd\3"+
+ "\2\2\2\u05bc\u05ba\3\2\2\2\u05bd\u05bf\3\2\2\2\u05be\u05bc\3\2\2\2\u05bf"+
+ "\u05c0\7,\2\2\u05c0\u05c3\7\61\2\2\u05c1\u05c3\7\2\2\3\u05c2\u05b1\3\2"+
+ "\2\2\u05c2\u05b5\3\2\2\2\u05c2\u05b6\3\2\2\2\u05c2\u05c1\3\2\2\2\u05c3"+
+ "\u05c4\3\2\2\2\u05c4\u05c5\b\u00ab\4\2\u05c5\u0157\3\2\2\2\u05c6\u05c7"+
+ "\3\2\2\2\u05c7\u05c8\3\2\2\2\u05c8\u05c9\b\u00ac\4\2\u05c9\u05ca\b\u00ac"+
+ "\3\2\u05ca\u0159\3\2\2\2\64\2\3\u015c\u0164\u0167\u016a\u0170\u0172\u0415"+
+ "\u0417\u0480\u0485\u0488\u048f\u0494\u049a\u049d\u04a2\u04a9\u04ae\u04b8"+
+ "\u04bd\u04c1\u04c6\u04c9\u04ce\u04d3\u04d6\u04e1\u04ea\u04f4\u0516\u0520"+
+ "\u0522\u052c\u0536\u0541\u054b\u0554\u0570\u0574\u0579\u0584\u058a\u0593"+
+ "\u059d\u05ab\u05b3\u05bc\u05c2\5\4\3\2\2\3\2\4\2\2";
public static final ATN _ATN =
new ATNDeserializer().deserialize(_serializedATN.toCharArray());
static {
diff --git a/src/main/java/viper/gobra/frontend/GobraParser.java b/src/main/java/viper/gobra/frontend/GobraParser.java
index 045338bf7..cfa628934 100644
--- a/src/main/java/viper/gobra/frontend/GobraParser.java
+++ b/src/main/java/viper/gobra/frontend/GobraParser.java
@@ -1,4 +1,4 @@
-// Generated from /main/antlr4/GobraParser.g4 by ANTLR 4.9.1
+// Generated from src/main/antlr4/GobraParser.g4 by ANTLR 4.9.2
package viper.gobra.frontend;
import org.antlr.v4.runtime.atn.*;
import org.antlr.v4.runtime.dfa.DFA;
@@ -11,7 +11,7 @@
@SuppressWarnings({"all", "warnings", "unchecked", "unused", "cast"})
public class GobraParser extends GobraParserBase {
- static { RuntimeMetaData.checkVersion("4.9.1", RuntimeMetaData.VERSION); }
+ static { RuntimeMetaData.checkVersion("4.9.2", RuntimeMetaData.VERSION); }
protected static final DFA[] _decisionToDFA;
protected static final PredictionContextCache _sharedContextCache =
@@ -23,25 +23,26 @@ public class GobraParser extends GobraParserBase {
FOLD=23, UNFOLD=24, UNFOLDING=25, GHOST=26, IN=27, MULTI=28, SUBSET=29,
UNION=30, INTERSECTION=31, SETMINUS=32, IMPLIES=33, WAND=34, APPLY=35,
QMARK=36, L_PRED=37, R_PRED=38, SEQ=39, SET=40, MSET=41, DICT=42, OPT=43,
- LEN=44, NEW=45, MAKE=46, CAP=47, SOME=48, GET=49, DOM=50, AXIOM=51, NONE=52,
- PRED=53, TYPE_OF=54, IS_COMPARABLE=55, SHARE=56, ADDR_MOD=57, DOT_DOT=58,
- SHARED=59, EXCLUSIVE=60, PREDICATE=61, WRITEPERM=62, NOPERM=63, TRUSTED=64,
- OUTLINE=65, INIT_POST=66, IMPORT_PRE=67, PROOF=68, GHOST_EQUALS=69, GHOST_NOT_EQUALS=70,
- WITH=71, BREAK=72, DEFAULT=73, FUNC=74, INTERFACE=75, SELECT=76, CASE=77,
- DEFER=78, GO=79, MAP=80, STRUCT=81, CHAN=82, ELSE=83, GOTO=84, PACKAGE=85,
- SWITCH=86, CONST=87, FALLTHROUGH=88, IF=89, RANGE=90, TYPE=91, CONTINUE=92,
- FOR=93, IMPORT=94, RETURN=95, VAR=96, NIL_LIT=97, IDENTIFIER=98, L_PAREN=99,
- R_PAREN=100, L_CURLY=101, R_CURLY=102, L_BRACKET=103, R_BRACKET=104, ASSIGN=105,
- COMMA=106, SEMI=107, COLON=108, DOT=109, PLUS_PLUS=110, MINUS_MINUS=111,
- DECLARE_ASSIGN=112, ELLIPSIS=113, LOGICAL_OR=114, LOGICAL_AND=115, EQUALS=116,
- NOT_EQUALS=117, LESS=118, LESS_OR_EQUALS=119, GREATER=120, GREATER_OR_EQUALS=121,
- OR=122, DIV=123, MOD=124, LSHIFT=125, RSHIFT=126, BIT_CLEAR=127, EXCLAMATION=128,
- PLUS=129, MINUS=130, CARET=131, STAR=132, AMPERSAND=133, RECEIVE=134,
- DECIMAL_LIT=135, BINARY_LIT=136, OCTAL_LIT=137, HEX_LIT=138, HEX_FLOAT_LIT=139,
- IMAGINARY_LIT=140, RUNE_LIT=141, BYTE_VALUE=142, OCTAL_BYTE_VALUE=143,
- HEX_BYTE_VALUE=144, LITTLE_U_VALUE=145, BIG_U_VALUE=146, RAW_STRING_LIT=147,
- INTERPRETED_STRING_LIT=148, WS=149, COMMENT=150, TERMINATOR=151, LINE_COMMENT=152,
- WS_NLSEMI=153, COMMENT_NLSEMI=154, LINE_COMMENT_NLSEMI=155, EOS=156, OTHER=157;
+ LEN=44, NEW=45, MAKE=46, CAP=47, SOME=48, GET=49, DOM=50, AXIOM=51, ADT=52,
+ NONE=53, PRED=54, TYPE_OF=55, IS_COMPARABLE=56, SHARE=57, ADDR_MOD=58,
+ DOT_DOT=59, SHARED=60, EXCLUSIVE=61, PREDICATE=62, WRITEPERM=63, NOPERM=64,
+ TRUSTED=65, OUTLINE=66, INIT_POST=67, IMPORT_PRE=68, PROOF=69, GHOST_EQUALS=70,
+ GHOST_NOT_EQUALS=71, WITH=72, BREAK=73, DEFAULT=74, FUNC=75, INTERFACE=76,
+ SELECT=77, CASE=78, DEFER=79, GO=80, MAP=81, STRUCT=82, CHAN=83, ELSE=84,
+ GOTO=85, PACKAGE=86, SWITCH=87, CONST=88, FALLTHROUGH=89, IF=90, RANGE=91,
+ TYPE=92, CONTINUE=93, FOR=94, IMPORT=95, RETURN=96, VAR=97, NIL_LIT=98,
+ IDENTIFIER=99, L_PAREN=100, R_PAREN=101, L_CURLY=102, R_CURLY=103, L_BRACKET=104,
+ R_BRACKET=105, ASSIGN=106, COMMA=107, SEMI=108, COLON=109, DOT=110, PLUS_PLUS=111,
+ MINUS_MINUS=112, DECLARE_ASSIGN=113, ELLIPSIS=114, LOGICAL_OR=115, LOGICAL_AND=116,
+ EQUALS=117, NOT_EQUALS=118, LESS=119, LESS_OR_EQUALS=120, GREATER=121,
+ GREATER_OR_EQUALS=122, OR=123, DIV=124, MOD=125, LSHIFT=126, RSHIFT=127,
+ BIT_CLEAR=128, EXCLAMATION=129, PLUS=130, MINUS=131, CARET=132, STAR=133,
+ AMPERSAND=134, RECEIVE=135, DECIMAL_LIT=136, BINARY_LIT=137, OCTAL_LIT=138,
+ HEX_LIT=139, HEX_FLOAT_LIT=140, IMAGINARY_LIT=141, RUNE_LIT=142, BYTE_VALUE=143,
+ OCTAL_BYTE_VALUE=144, HEX_BYTE_VALUE=145, LITTLE_U_VALUE=146, BIG_U_VALUE=147,
+ RAW_STRING_LIT=148, INTERPRETED_STRING_LIT=149, WS=150, COMMENT=151, TERMINATOR=152,
+ LINE_COMMENT=153, WS_NLSEMI=154, COMMENT_NLSEMI=155, LINE_COMMENT_NLSEMI=156,
+ EOS=157, OTHER=158;
public static final int
RULE_exprOnly = 0, RULE_stmtOnly = 1, RULE_typeOnly = 2, RULE_maybeAddressableIdentifierList = 3,
RULE_maybeAddressableIdentifier = 4, RULE_sourceFile = 5, RULE_initPost = 6,
@@ -54,45 +55,45 @@ public class GobraParser extends GobraParserBase {
RULE_oldLabelUse = 28, RULE_labelUse = 29, RULE_before = 30, RULE_isComparable = 31,
RULE_typeOf = 32, RULE_access = 33, RULE_range = 34, RULE_seqUpdExp = 35,
RULE_seqUpdClause = 36, RULE_ghostTypeLit = 37, RULE_domainType = 38,
- RULE_domainClause = 39, RULE_ghostSliceType = 40, RULE_sqType = 41, RULE_specification = 42,
- RULE_specStatement = 43, RULE_terminationMeasure = 44, RULE_assertion = 45,
- RULE_blockWithBodyParameterInfo = 46, RULE_closureSpecInstance = 47, RULE_closureSpecParams = 48,
- RULE_closureSpecParam = 49, RULE_closureImplProofStmt = 50, RULE_implementationProof = 51,
- RULE_methodImplementationProof = 52, RULE_nonLocalReceiver = 53, RULE_selection = 54,
- RULE_implementationProofPredicateAlias = 55, RULE_make = 56, RULE_new_ = 57,
- RULE_specMember = 58, RULE_functionDecl = 59, RULE_methodDecl = 60, RULE_explicitGhostMember = 61,
- RULE_fpredicateDecl = 62, RULE_predicateBody = 63, RULE_mpredicateDecl = 64,
- RULE_varSpec = 65, RULE_shortVarDecl = 66, RULE_receiver = 67, RULE_parameterDecl = 68,
- RULE_actualParameterDecl = 69, RULE_ghostParameterDecl = 70, RULE_parameterType = 71,
- RULE_expression = 72, RULE_statement = 73, RULE_applyStmt = 74, RULE_packageStmt = 75,
- RULE_specForStmt = 76, RULE_loopSpec = 77, RULE_deferStmt = 78, RULE_basicLit = 79,
- RULE_primaryExpr = 80, RULE_functionLit = 81, RULE_closureDecl = 82, RULE_predConstructArgs = 83,
- RULE_interfaceType = 84, RULE_predicateSpec = 85, RULE_methodSpec = 86,
- RULE_type_ = 87, RULE_typeLit = 88, RULE_predType = 89, RULE_predTypeParams = 90,
- RULE_literalType = 91, RULE_implicitArray = 92, RULE_slice_ = 93, RULE_low = 94,
- RULE_high = 95, RULE_cap = 96, RULE_assign_op = 97, RULE_rangeClause = 98,
- RULE_packageClause = 99, RULE_importPath = 100, RULE_declaration = 101,
- RULE_constDecl = 102, RULE_constSpec = 103, RULE_identifierList = 104,
- RULE_expressionList = 105, RULE_typeDecl = 106, RULE_typeSpec = 107, RULE_varDecl = 108,
- RULE_block = 109, RULE_statementList = 110, RULE_simpleStmt = 111, RULE_expressionStmt = 112,
- RULE_sendStmt = 113, RULE_incDecStmt = 114, RULE_assignment = 115, RULE_emptyStmt = 116,
- RULE_labeledStmt = 117, RULE_returnStmt = 118, RULE_breakStmt = 119, RULE_continueStmt = 120,
- RULE_gotoStmt = 121, RULE_fallthroughStmt = 122, RULE_ifStmt = 123, RULE_switchStmt = 124,
- RULE_exprSwitchStmt = 125, RULE_exprCaseClause = 126, RULE_exprSwitchCase = 127,
- RULE_typeSwitchStmt = 128, RULE_typeSwitchGuard = 129, RULE_typeCaseClause = 130,
- RULE_typeSwitchCase = 131, RULE_typeList = 132, RULE_selectStmt = 133,
- RULE_commClause = 134, RULE_commCase = 135, RULE_recvStmt = 136, RULE_forStmt = 137,
- RULE_forClause = 138, RULE_goStmt = 139, RULE_typeName = 140, RULE_arrayType = 141,
- RULE_arrayLength = 142, RULE_elementType = 143, RULE_pointerType = 144,
- RULE_sliceType = 145, RULE_mapType = 146, RULE_channelType = 147, RULE_functionType = 148,
- RULE_signature = 149, RULE_result = 150, RULE_parameters = 151, RULE_conversion = 152,
- RULE_nonNamedType = 153, RULE_operand = 154, RULE_literal = 155, RULE_integer = 156,
- RULE_operandName = 157, RULE_qualifiedIdent = 158, RULE_compositeLit = 159,
- RULE_literalValue = 160, RULE_elementList = 161, RULE_keyedElement = 162,
- RULE_key = 163, RULE_element = 164, RULE_structType = 165, RULE_fieldDecl = 166,
- RULE_string_ = 167, RULE_embeddedField = 168, RULE_index = 169, RULE_typeAssertion = 170,
- RULE_arguments = 171, RULE_methodExpr = 172, RULE_receiverType = 173,
- RULE_eos = 174;
+ RULE_domainClause = 39, RULE_adtType = 40, RULE_adtClause = 41, RULE_ghostSliceType = 42,
+ RULE_sqType = 43, RULE_specification = 44, RULE_specStatement = 45, RULE_terminationMeasure = 46,
+ RULE_assertion = 47, RULE_blockWithBodyParameterInfo = 48, RULE_closureSpecInstance = 49,
+ RULE_closureSpecParams = 50, RULE_closureSpecParam = 51, RULE_closureImplProofStmt = 52,
+ RULE_implementationProof = 53, RULE_methodImplementationProof = 54, RULE_nonLocalReceiver = 55,
+ RULE_selection = 56, RULE_implementationProofPredicateAlias = 57, RULE_make = 58,
+ RULE_new_ = 59, RULE_specMember = 60, RULE_functionDecl = 61, RULE_methodDecl = 62,
+ RULE_explicitGhostMember = 63, RULE_fpredicateDecl = 64, RULE_predicateBody = 65,
+ RULE_mpredicateDecl = 66, RULE_varSpec = 67, RULE_shortVarDecl = 68, RULE_receiver = 69,
+ RULE_parameterDecl = 70, RULE_actualParameterDecl = 71, RULE_ghostParameterDecl = 72,
+ RULE_parameterType = 73, RULE_expression = 74, RULE_statement = 75, RULE_applyStmt = 76,
+ RULE_packageStmt = 77, RULE_specForStmt = 78, RULE_loopSpec = 79, RULE_deferStmt = 80,
+ RULE_basicLit = 81, RULE_primaryExpr = 82, RULE_functionLit = 83, RULE_closureDecl = 84,
+ RULE_predConstructArgs = 85, RULE_interfaceType = 86, RULE_predicateSpec = 87,
+ RULE_methodSpec = 88, RULE_type_ = 89, RULE_typeLit = 90, RULE_predType = 91,
+ RULE_predTypeParams = 92, RULE_literalType = 93, RULE_implicitArray = 94,
+ RULE_slice_ = 95, RULE_low = 96, RULE_high = 97, RULE_cap = 98, RULE_assign_op = 99,
+ RULE_rangeClause = 100, RULE_packageClause = 101, RULE_importPath = 102,
+ RULE_declaration = 103, RULE_constDecl = 104, RULE_constSpec = 105, RULE_identifierList = 106,
+ RULE_expressionList = 107, RULE_typeDecl = 108, RULE_typeSpec = 109, RULE_varDecl = 110,
+ RULE_block = 111, RULE_statementList = 112, RULE_simpleStmt = 113, RULE_expressionStmt = 114,
+ RULE_sendStmt = 115, RULE_incDecStmt = 116, RULE_assignment = 117, RULE_emptyStmt = 118,
+ RULE_labeledStmt = 119, RULE_returnStmt = 120, RULE_breakStmt = 121, RULE_continueStmt = 122,
+ RULE_gotoStmt = 123, RULE_fallthroughStmt = 124, RULE_ifStmt = 125, RULE_switchStmt = 126,
+ RULE_exprSwitchStmt = 127, RULE_exprCaseClause = 128, RULE_exprSwitchCase = 129,
+ RULE_typeSwitchStmt = 130, RULE_typeSwitchGuard = 131, RULE_typeCaseClause = 132,
+ RULE_typeSwitchCase = 133, RULE_typeList = 134, RULE_selectStmt = 135,
+ RULE_commClause = 136, RULE_commCase = 137, RULE_recvStmt = 138, RULE_forStmt = 139,
+ RULE_forClause = 140, RULE_goStmt = 141, RULE_typeName = 142, RULE_arrayType = 143,
+ RULE_arrayLength = 144, RULE_elementType = 145, RULE_pointerType = 146,
+ RULE_sliceType = 147, RULE_mapType = 148, RULE_channelType = 149, RULE_functionType = 150,
+ RULE_signature = 151, RULE_result = 152, RULE_parameters = 153, RULE_conversion = 154,
+ RULE_nonNamedType = 155, RULE_operand = 156, RULE_literal = 157, RULE_integer = 158,
+ RULE_operandName = 159, RULE_qualifiedIdent = 160, RULE_compositeLit = 161,
+ RULE_literalValue = 162, RULE_elementList = 163, RULE_keyedElement = 164,
+ RULE_key = 165, RULE_element = 166, RULE_structType = 167, RULE_fieldDecl = 168,
+ RULE_string_ = 169, RULE_embeddedField = 170, RULE_index = 171, RULE_typeAssertion = 172,
+ RULE_arguments = 173, RULE_methodExpr = 174, RULE_receiverType = 175,
+ RULE_eos = 176;
private static String[] makeRuleNames() {
return new String[] {
"exprOnly", "stmtOnly", "typeOnly", "maybeAddressableIdentifierList",
@@ -103,33 +104,34 @@ private static String[] makeRuleNames() {
"predicateAccess", "optionSome", "optionNone", "optionGet", "sConversion",
"old", "oldLabelUse", "labelUse", "before", "isComparable", "typeOf",
"access", "range", "seqUpdExp", "seqUpdClause", "ghostTypeLit", "domainType",
- "domainClause", "ghostSliceType", "sqType", "specification", "specStatement",
- "terminationMeasure", "assertion", "blockWithBodyParameterInfo", "closureSpecInstance",
- "closureSpecParams", "closureSpecParam", "closureImplProofStmt", "implementationProof",
- "methodImplementationProof", "nonLocalReceiver", "selection", "implementationProofPredicateAlias",
- "make", "new_", "specMember", "functionDecl", "methodDecl", "explicitGhostMember",
- "fpredicateDecl", "predicateBody", "mpredicateDecl", "varSpec", "shortVarDecl",
- "receiver", "parameterDecl", "actualParameterDecl", "ghostParameterDecl",
- "parameterType", "expression", "statement", "applyStmt", "packageStmt",
- "specForStmt", "loopSpec", "deferStmt", "basicLit", "primaryExpr", "functionLit",
- "closureDecl", "predConstructArgs", "interfaceType", "predicateSpec",
- "methodSpec", "type_", "typeLit", "predType", "predTypeParams", "literalType",
- "implicitArray", "slice_", "low", "high", "cap", "assign_op", "rangeClause",
- "packageClause", "importPath", "declaration", "constDecl", "constSpec",
- "identifierList", "expressionList", "typeDecl", "typeSpec", "varDecl",
- "block", "statementList", "simpleStmt", "expressionStmt", "sendStmt",
- "incDecStmt", "assignment", "emptyStmt", "labeledStmt", "returnStmt",
- "breakStmt", "continueStmt", "gotoStmt", "fallthroughStmt", "ifStmt",
- "switchStmt", "exprSwitchStmt", "exprCaseClause", "exprSwitchCase", "typeSwitchStmt",
- "typeSwitchGuard", "typeCaseClause", "typeSwitchCase", "typeList", "selectStmt",
- "commClause", "commCase", "recvStmt", "forStmt", "forClause", "goStmt",
- "typeName", "arrayType", "arrayLength", "elementType", "pointerType",
- "sliceType", "mapType", "channelType", "functionType", "signature", "result",
- "parameters", "conversion", "nonNamedType", "operand", "literal", "integer",
- "operandName", "qualifiedIdent", "compositeLit", "literalValue", "elementList",
- "keyedElement", "key", "element", "structType", "fieldDecl", "string_",
- "embeddedField", "index", "typeAssertion", "arguments", "methodExpr",
- "receiverType", "eos"
+ "domainClause", "adtType", "adtClause", "ghostSliceType", "sqType", "specification",
+ "specStatement", "terminationMeasure", "assertion", "blockWithBodyParameterInfo",
+ "closureSpecInstance", "closureSpecParams", "closureSpecParam", "closureImplProofStmt",
+ "implementationProof", "methodImplementationProof", "nonLocalReceiver",
+ "selection", "implementationProofPredicateAlias", "make", "new_", "specMember",
+ "functionDecl", "methodDecl", "explicitGhostMember", "fpredicateDecl",
+ "predicateBody", "mpredicateDecl", "varSpec", "shortVarDecl", "receiver",
+ "parameterDecl", "actualParameterDecl", "ghostParameterDecl", "parameterType",
+ "expression", "statement", "applyStmt", "packageStmt", "specForStmt",
+ "loopSpec", "deferStmt", "basicLit", "primaryExpr", "functionLit", "closureDecl",
+ "predConstructArgs", "interfaceType", "predicateSpec", "methodSpec",
+ "type_", "typeLit", "predType", "predTypeParams", "literalType", "implicitArray",
+ "slice_", "low", "high", "cap", "assign_op", "rangeClause", "packageClause",
+ "importPath", "declaration", "constDecl", "constSpec", "identifierList",
+ "expressionList", "typeDecl", "typeSpec", "varDecl", "block", "statementList",
+ "simpleStmt", "expressionStmt", "sendStmt", "incDecStmt", "assignment",
+ "emptyStmt", "labeledStmt", "returnStmt", "breakStmt", "continueStmt",
+ "gotoStmt", "fallthroughStmt", "ifStmt", "switchStmt", "exprSwitchStmt",
+ "exprCaseClause", "exprSwitchCase", "typeSwitchStmt", "typeSwitchGuard",
+ "typeCaseClause", "typeSwitchCase", "typeList", "selectStmt", "commClause",
+ "commCase", "recvStmt", "forStmt", "forClause", "goStmt", "typeName",
+ "arrayType", "arrayLength", "elementType", "pointerType", "sliceType",
+ "mapType", "channelType", "functionType", "signature", "result", "parameters",
+ "conversion", "nonNamedType", "operand", "literal", "integer", "operandName",
+ "qualifiedIdent", "compositeLit", "literalValue", "elementList", "keyedElement",
+ "key", "element", "structType", "fieldDecl", "string_", "embeddedField",
+ "index", "typeAssertion", "arguments", "methodExpr", "receiverType",
+ "eos"
};
}
public static final String[] ruleNames = makeRuleNames();
@@ -143,8 +145,8 @@ private static String[] makeLiteralNames() {
"'ghost'", "'in'", "'#'", "'subset'", "'union'", "'intersection'", "'setminus'",
"'==>'", "'--*'", "'apply'", "'?'", "'!<'", "'!>'", "'seq'", "'set'",
"'mset'", "'dict'", "'option'", "'len'", "'new'", "'make'", "'cap'",
- "'some'", "'get'", "'domain'", "'axiom'", "'none'", "'pred'", "'typeOf'",
- "'isComparable'", "'share'", "'@'", "'..'", "'shared'", "'exclusive'",
+ "'some'", "'get'", "'domain'", "'axiom'", "'adt'", "'none'", "'pred'",
+ "'typeOf'", "'isComparable'", "'share'", "'@'", "'..'", "'shared'", "'exclusive'",
"'predicate'", "'writePerm'", "'noPerm'", "'trusted'", "'outline'", "'initEnsures'",
"'importRequires'", "'proof'", "'==='", "'!=='", "'with'", "'break'",
"'default'", "'func'", "'interface'", "'select'", "'case'", "'defer'",
@@ -166,8 +168,8 @@ private static String[] makeSymbolicNames() {
"UNFOLD", "UNFOLDING", "GHOST", "IN", "MULTI", "SUBSET", "UNION", "INTERSECTION",
"SETMINUS", "IMPLIES", "WAND", "APPLY", "QMARK", "L_PRED", "R_PRED",
"SEQ", "SET", "MSET", "DICT", "OPT", "LEN", "NEW", "MAKE", "CAP", "SOME",
- "GET", "DOM", "AXIOM", "NONE", "PRED", "TYPE_OF", "IS_COMPARABLE", "SHARE",
- "ADDR_MOD", "DOT_DOT", "SHARED", "EXCLUSIVE", "PREDICATE", "WRITEPERM",
+ "GET", "DOM", "AXIOM", "ADT", "NONE", "PRED", "TYPE_OF", "IS_COMPARABLE",
+ "SHARE", "ADDR_MOD", "DOT_DOT", "SHARED", "EXCLUSIVE", "PREDICATE", "WRITEPERM",
"NOPERM", "TRUSTED", "OUTLINE", "INIT_POST", "IMPORT_PRE", "PROOF", "GHOST_EQUALS",
"GHOST_NOT_EQUALS", "WITH", "BREAK", "DEFAULT", "FUNC", "INTERFACE",
"SELECT", "CASE", "DEFER", "GO", "MAP", "STRUCT", "CHAN", "ELSE", "GOTO",
@@ -260,9 +262,9 @@ public final ExprOnlyContext exprOnly() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(350);
+ setState(354);
expression(0);
- setState(351);
+ setState(355);
match(EOF);
}
}
@@ -299,9 +301,9 @@ public final StmtOnlyContext stmtOnly() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(353);
+ setState(357);
statement();
- setState(354);
+ setState(358);
match(EOF);
}
}
@@ -338,9 +340,9 @@ public final TypeOnlyContext typeOnly() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(356);
+ setState(360);
type_();
- setState(357);
+ setState(361);
match(EOF);
}
}
@@ -384,21 +386,21 @@ public final MaybeAddressableIdentifierListContext maybeAddressableIdentifierLis
try {
enterOuterAlt(_localctx, 1);
{
- setState(359);
+ setState(363);
maybeAddressableIdentifier();
- setState(364);
+ setState(368);
_errHandler.sync(this);
_la = _input.LA(1);
while (_la==COMMA) {
{
{
- setState(360);
+ setState(364);
match(COMMA);
- setState(361);
+ setState(365);
maybeAddressableIdentifier();
}
}
- setState(366);
+ setState(370);
_errHandler.sync(this);
_la = _input.LA(1);
}
@@ -436,14 +438,14 @@ public final MaybeAddressableIdentifierContext maybeAddressableIdentifier() thro
try {
enterOuterAlt(_localctx, 1);
{
- setState(367);
+ setState(371);
match(IDENTIFIER);
- setState(369);
+ setState(373);
_errHandler.sync(this);
_la = _input.LA(1);
if (_la==ADDR_MOD) {
{
- setState(368);
+ setState(372);
match(ADDR_MOD);
}
}
@@ -520,79 +522,79 @@ public final SourceFileContext sourceFile() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(376);
+ setState(380);
_errHandler.sync(this);
_la = _input.LA(1);
while (_la==INIT_POST) {
{
{
- setState(371);
+ setState(375);
initPost();
- setState(372);
+ setState(376);
eos();
}
}
- setState(378);
+ setState(382);
_errHandler.sync(this);
_la = _input.LA(1);
}
- setState(379);
+ setState(383);
packageClause();
- setState(380);
+ setState(384);
eos();
- setState(386);
+ setState(390);
_errHandler.sync(this);
_la = _input.LA(1);
while (_la==IMPORT_PRE || _la==IMPORT) {
{
{
- setState(381);
+ setState(385);
importDecl();
- setState(382);
+ setState(386);
eos();
}
}
- setState(388);
+ setState(392);
_errHandler.sync(this);
_la = _input.LA(1);
}
- setState(398);
+ setState(402);
_errHandler.sync(this);
_la = _input.LA(1);
- while (((((_la - 9)) & ~0x3f) == 0 && ((1L << (_la - 9)) & ((1L << (PRE - 9)) | (1L << (PRESERVES - 9)) | (1L << (POST - 9)) | (1L << (DEC - 9)) | (1L << (PURE - 9)) | (1L << (GHOST - 9)) | (1L << (SEQ - 9)) | (1L << (SET - 9)) | (1L << (MSET - 9)) | (1L << (DICT - 9)) | (1L << (OPT - 9)) | (1L << (DOM - 9)) | (1L << (PRED - 9)) | (1L << (TRUSTED - 9)))) != 0) || ((((_la - 74)) & ~0x3f) == 0 && ((1L << (_la - 74)) & ((1L << (FUNC - 74)) | (1L << (INTERFACE - 74)) | (1L << (MAP - 74)) | (1L << (STRUCT - 74)) | (1L << (CHAN - 74)) | (1L << (CONST - 74)) | (1L << (TYPE - 74)) | (1L << (VAR - 74)) | (1L << (IDENTIFIER - 74)) | (1L << (L_PAREN - 74)) | (1L << (L_BRACKET - 74)) | (1L << (STAR - 74)) | (1L << (RECEIVE - 74)))) != 0)) {
+ while (((((_la - 9)) & ~0x3f) == 0 && ((1L << (_la - 9)) & ((1L << (PRE - 9)) | (1L << (PRESERVES - 9)) | (1L << (POST - 9)) | (1L << (DEC - 9)) | (1L << (PURE - 9)) | (1L << (GHOST - 9)) | (1L << (SEQ - 9)) | (1L << (SET - 9)) | (1L << (MSET - 9)) | (1L << (DICT - 9)) | (1L << (OPT - 9)) | (1L << (DOM - 9)) | (1L << (ADT - 9)) | (1L << (PRED - 9)) | (1L << (TRUSTED - 9)))) != 0) || ((((_la - 75)) & ~0x3f) == 0 && ((1L << (_la - 75)) & ((1L << (FUNC - 75)) | (1L << (INTERFACE - 75)) | (1L << (MAP - 75)) | (1L << (STRUCT - 75)) | (1L << (CHAN - 75)) | (1L << (CONST - 75)) | (1L << (TYPE - 75)) | (1L << (VAR - 75)) | (1L << (IDENTIFIER - 75)) | (1L << (L_PAREN - 75)) | (1L << (L_BRACKET - 75)) | (1L << (STAR - 75)) | (1L << (RECEIVE - 75)))) != 0)) {
{
{
- setState(392);
+ setState(396);
_errHandler.sync(this);
switch ( getInterpreter().adaptivePredict(_input,4,_ctx) ) {
case 1:
{
- setState(389);
+ setState(393);
specMember();
}
break;
case 2:
{
- setState(390);
+ setState(394);
declaration();
}
break;
case 3:
{
- setState(391);
+ setState(395);
ghostMember();
}
break;
}
- setState(394);
+ setState(398);
eos();
}
}
- setState(400);
+ setState(404);
_errHandler.sync(this);
_la = _input.LA(1);
}
- setState(401);
+ setState(405);
match(EOF);
}
}
@@ -629,9 +631,9 @@ public final InitPostContext initPost() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(403);
+ setState(407);
match(INIT_POST);
- setState(404);
+ setState(408);
expression(0);
}
}
@@ -668,9 +670,9 @@ public final ImportPreContext importPre() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(406);
+ setState(410);
match(IMPORT_PRE);
- setState(407);
+ setState(411);
expression(0);
}
}
@@ -722,28 +724,28 @@ public final ImportSpecContext importSpec() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(414);
+ setState(418);
_errHandler.sync(this);
_la = _input.LA(1);
while (_la==IMPORT_PRE) {
{
{
- setState(409);
+ setState(413);
importPre();
- setState(410);
+ setState(414);
eos();
}
}
- setState(416);
+ setState(420);
_errHandler.sync(this);
_la = _input.LA(1);
}
- setState(418);
+ setState(422);
_errHandler.sync(this);
_la = _input.LA(1);
if (_la==IDENTIFIER || _la==DOT) {
{
- setState(417);
+ setState(421);
((ImportSpecContext)_localctx).alias = _input.LT(1);
_la = _input.LA(1);
if ( !(_la==IDENTIFIER || _la==DOT) ) {
@@ -757,7 +759,7 @@ public final ImportSpecContext importSpec() throws RecognitionException {
}
}
- setState(420);
+ setState(424);
importPath();
}
}
@@ -812,56 +814,56 @@ public final ImportDeclContext importDecl() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(427);
+ setState(431);
_errHandler.sync(this);
_la = _input.LA(1);
while (_la==IMPORT_PRE) {
{
{
- setState(422);
+ setState(426);
importPre();
- setState(423);
+ setState(427);
eos();
}
}
- setState(429);
+ setState(433);
_errHandler.sync(this);
_la = _input.LA(1);
}
- setState(443);
+ setState(447);
_errHandler.sync(this);
switch ( getInterpreter().adaptivePredict(_input,10,_ctx) ) {
case 1:
{
- setState(430);
+ setState(434);
match(IMPORT);
- setState(431);
+ setState(435);
importSpec();
}
break;
case 2:
{
- setState(432);
+ setState(436);
match(IMPORT);
- setState(433);
+ setState(437);
match(L_PAREN);
- setState(439);
+ setState(443);
_errHandler.sync(this);
_la = _input.LA(1);
- while (((((_la - 67)) & ~0x3f) == 0 && ((1L << (_la - 67)) & ((1L << (IMPORT_PRE - 67)) | (1L << (IDENTIFIER - 67)) | (1L << (DOT - 67)))) != 0) || _la==RAW_STRING_LIT || _la==INTERPRETED_STRING_LIT) {
+ while (((((_la - 68)) & ~0x3f) == 0 && ((1L << (_la - 68)) & ((1L << (IMPORT_PRE - 68)) | (1L << (IDENTIFIER - 68)) | (1L << (DOT - 68)))) != 0) || _la==RAW_STRING_LIT || _la==INTERPRETED_STRING_LIT) {
{
{
- setState(434);
+ setState(438);
importSpec();
- setState(435);
+ setState(439);
eos();
}
}
- setState(441);
+ setState(445);
_errHandler.sync(this);
_la = _input.LA(1);
}
- setState(442);
+ setState(446);
match(R_PAREN);
}
break;
@@ -907,34 +909,34 @@ public final GhostMemberContext ghostMember() throws RecognitionException {
GhostMemberContext _localctx = new GhostMemberContext(_ctx, getState());
enterRule(_localctx, 20, RULE_ghostMember);
try {
- setState(449);
+ setState(453);
_errHandler.sync(this);
switch ( getInterpreter().adaptivePredict(_input,11,_ctx) ) {
case 1:
enterOuterAlt(_localctx, 1);
{
- setState(445);
+ setState(449);
implementationProof();
}
break;
case 2:
enterOuterAlt(_localctx, 2);
{
- setState(446);
+ setState(450);
fpredicateDecl();
}
break;
case 3:
enterOuterAlt(_localctx, 3);
{
- setState(447);
+ setState(451);
mpredicateDecl();
}
break;
case 4:
enterOuterAlt(_localctx, 4);
{
- setState(448);
+ setState(452);
explicitGhostMember();
}
break;
@@ -1010,16 +1012,16 @@ public final GhostStatementContext ghostStatement() throws RecognitionException
enterRule(_localctx, 22, RULE_ghostStatement);
int _la;
try {
- setState(457);
+ setState(461);
_errHandler.sync(this);
switch (_input.LA(1)) {
case GHOST:
_localctx = new ExplicitGhostStatementContext(_localctx);
enterOuterAlt(_localctx, 1);
{
- setState(451);
+ setState(455);
match(GHOST);
- setState(452);
+ setState(456);
statement();
}
break;
@@ -1028,7 +1030,7 @@ public final GhostStatementContext ghostStatement() throws RecognitionException
_localctx = new FoldStatementContext(_localctx);
enterOuterAlt(_localctx, 2);
{
- setState(453);
+ setState(457);
((FoldStatementContext)_localctx).fold_stmt = _input.LT(1);
_la = _input.LA(1);
if ( !(_la==FOLD || _la==UNFOLD) ) {
@@ -1039,7 +1041,7 @@ public final GhostStatementContext ghostStatement() throws RecognitionException
_errHandler.reportMatch(this);
consume();
}
- setState(454);
+ setState(458);
predicateAccess();
}
break;
@@ -1050,7 +1052,7 @@ public final GhostStatementContext ghostStatement() throws RecognitionException
_localctx = new ProofStatementContext(_localctx);
enterOuterAlt(_localctx, 3);
{
- setState(455);
+ setState(459);
((ProofStatementContext)_localctx).kind = _input.LT(1);
_la = _input.LA(1);
if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << ASSERT) | (1L << ASSUME) | (1L << INHALE) | (1L << EXHALE))) != 0)) ) {
@@ -1061,7 +1063,7 @@ public final GhostStatementContext ghostStatement() throws RecognitionException
_errHandler.reportMatch(this);
consume();
}
- setState(456);
+ setState(460);
expression(0);
}
break;
@@ -1101,7 +1103,7 @@ public final AuxiliaryStatementContext auxiliaryStatement() throws RecognitionEx
try {
enterOuterAlt(_localctx, 1);
{
- setState(459);
+ setState(463);
statementWithSpec();
}
}
@@ -1141,10 +1143,10 @@ public final StatementWithSpecContext statementWithSpec() throws RecognitionExce
try {
enterOuterAlt(_localctx, 1);
{
- setState(461);
+ setState(465);
((StatementWithSpecContext)_localctx).specification = specification();
{
- setState(462);
+ setState(466);
outlineStatement(((StatementWithSpecContext)_localctx).specification.trusted, ((StatementWithSpecContext)_localctx).specification.pure);
}
}
@@ -1189,21 +1191,21 @@ public final OutlineStatementContext outlineStatement(boolean trusted,boolean pu
try {
enterOuterAlt(_localctx, 1);
{
- setState(464);
+ setState(468);
match(OUTLINE);
- setState(465);
+ setState(469);
match(L_PAREN);
- setState(467);
+ setState(471);
_errHandler.sync(this);
switch ( getInterpreter().adaptivePredict(_input,13,_ctx) ) {
case 1:
{
- setState(466);
+ setState(470);
statementList();
}
break;
}
- setState(469);
+ setState(473);
match(R_PAREN);
}
}
@@ -1270,90 +1272,90 @@ public final GhostPrimaryExprContext ghostPrimaryExpr() throws RecognitionExcept
GhostPrimaryExprContext _localctx = new GhostPrimaryExprContext(_ctx, getState());
enterRule(_localctx, 30, RULE_ghostPrimaryExpr);
try {
- setState(483);
+ setState(487);
_errHandler.sync(this);
switch ( getInterpreter().adaptivePredict(_input,14,_ctx) ) {
case 1:
enterOuterAlt(_localctx, 1);
{
- setState(471);
+ setState(475);
range();
}
break;
case 2:
enterOuterAlt(_localctx, 2);
{
- setState(472);
+ setState(476);
access();
}
break;
case 3:
enterOuterAlt(_localctx, 3);
{
- setState(473);
+ setState(477);
typeOf();
}
break;
case 4:
enterOuterAlt(_localctx, 4);
{
- setState(474);
+ setState(478);
typeExpr();
}
break;
case 5:
enterOuterAlt(_localctx, 5);
{
- setState(475);
+ setState(479);
isComparable();
}
break;
case 6:
enterOuterAlt(_localctx, 6);
{
- setState(476);
+ setState(480);
old();
}
break;
case 7:
enterOuterAlt(_localctx, 7);
{
- setState(477);
+ setState(481);
before();
}
break;
case 8:
enterOuterAlt(_localctx, 8);
{
- setState(478);
+ setState(482);
sConversion();
}
break;
case 9:
enterOuterAlt(_localctx, 9);
{
- setState(479);
+ setState(483);
optionNone();
}
break;
case 10:
enterOuterAlt(_localctx, 10);
{
- setState(480);
+ setState(484);
optionSome();
}
break;
case 11:
enterOuterAlt(_localctx, 11);
{
- setState(481);
+ setState(485);
optionGet();
}
break;
case 12:
enterOuterAlt(_localctx, 12);
{
- setState(482);
+ setState(486);
permission();
}
break;
@@ -1391,7 +1393,7 @@ public final PermissionContext permission() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(485);
+ setState(489);
_la = _input.LA(1);
if ( !(_la==WRITEPERM || _la==NOPERM) ) {
_errHandler.recoverInline(this);
@@ -1438,13 +1440,13 @@ public final TypeExprContext typeExpr() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(487);
+ setState(491);
match(TYPE);
- setState(488);
+ setState(492);
match(L_BRACKET);
- setState(489);
+ setState(493);
type_();
- setState(490);
+ setState(494);
match(R_BRACKET);
}
}
@@ -1489,32 +1491,32 @@ public final BoundVariablesContext boundVariables() throws RecognitionException
int _alt;
enterOuterAlt(_localctx, 1);
{
- setState(492);
+ setState(496);
boundVariableDecl();
- setState(497);
+ setState(501);
_errHandler.sync(this);
_alt = getInterpreter().adaptivePredict(_input,15,_ctx);
while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) {
if ( _alt==1 ) {
{
{
- setState(493);
+ setState(497);
match(COMMA);
- setState(494);
+ setState(498);
boundVariableDecl();
}
}
}
- setState(499);
+ setState(503);
_errHandler.sync(this);
_alt = getInterpreter().adaptivePredict(_input,15,_ctx);
}
- setState(501);
+ setState(505);
_errHandler.sync(this);
_la = _input.LA(1);
if (_la==COMMA) {
{
- setState(500);
+ setState(504);
match(COMMA);
}
}
@@ -1562,25 +1564,25 @@ public final BoundVariableDeclContext boundVariableDecl() throws RecognitionExce
try {
enterOuterAlt(_localctx, 1);
{
- setState(503);
+ setState(507);
match(IDENTIFIER);
- setState(508);
+ setState(512);
_errHandler.sync(this);
_la = _input.LA(1);
while (_la==COMMA) {
{
{
- setState(504);
+ setState(508);
match(COMMA);
- setState(505);
+ setState(509);
match(IDENTIFIER);
}
}
- setState(510);
+ setState(514);
_errHandler.sync(this);
_la = _input.LA(1);
}
- setState(511);
+ setState(515);
elementType();
}
}
@@ -1620,17 +1622,17 @@ public final TriggersContext triggers() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(516);
+ setState(520);
_errHandler.sync(this);
_la = _input.LA(1);
while (_la==L_CURLY) {
{
{
- setState(513);
+ setState(517);
trigger();
}
}
- setState(518);
+ setState(522);
_errHandler.sync(this);
_la = _input.LA(1);
}
@@ -1678,27 +1680,27 @@ public final TriggerContext trigger() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(519);
+ setState(523);
match(L_CURLY);
- setState(520);
+ setState(524);
expression(0);
- setState(525);
+ setState(529);
_errHandler.sync(this);
_la = _input.LA(1);
while (_la==COMMA) {
{
{
- setState(521);
+ setState(525);
match(COMMA);
- setState(522);
+ setState(526);
expression(0);
}
}
- setState(527);
+ setState(531);
_errHandler.sync(this);
_la = _input.LA(1);
}
- setState(528);
+ setState(532);
match(R_CURLY);
}
}
@@ -1734,7 +1736,7 @@ public final PredicateAccessContext predicateAccess() throws RecognitionExceptio
try {
enterOuterAlt(_localctx, 1);
{
- setState(530);
+ setState(534);
primaryExpr(0);
}
}
@@ -1773,13 +1775,13 @@ public final OptionSomeContext optionSome() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(532);
+ setState(536);
match(SOME);
- setState(533);
+ setState(537);
match(L_PAREN);
- setState(534);
+ setState(538);
expression(0);
- setState(535);
+ setState(539);
match(R_PAREN);
}
}
@@ -1818,13 +1820,13 @@ public final OptionNoneContext optionNone() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(537);
+ setState(541);
match(NONE);
- setState(538);
+ setState(542);
match(L_BRACKET);
- setState(539);
+ setState(543);
type_();
- setState(540);
+ setState(544);
match(R_BRACKET);
}
}
@@ -1863,13 +1865,13 @@ public final OptionGetContext optionGet() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(542);
+ setState(546);
match(GET);
- setState(543);
+ setState(547);
match(L_PAREN);
- setState(544);
+ setState(548);
expression(0);
- setState(545);
+ setState(549);
match(R_PAREN);
}
}
@@ -1912,7 +1914,7 @@ public final SConversionContext sConversion() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(547);
+ setState(551);
((SConversionContext)_localctx).kind = _input.LT(1);
_la = _input.LA(1);
if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << SEQ) | (1L << SET) | (1L << MSET))) != 0)) ) {
@@ -1923,11 +1925,11 @@ public final SConversionContext sConversion() throws RecognitionException {
_errHandler.reportMatch(this);
consume();
}
- setState(548);
+ setState(552);
match(L_PAREN);
- setState(549);
+ setState(553);
expression(0);
- setState(550);
+ setState(554);
match(R_PAREN);
}
}
@@ -1972,27 +1974,27 @@ public final OldContext old() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(552);
+ setState(556);
match(OLD);
- setState(557);
+ setState(561);
_errHandler.sync(this);
_la = _input.LA(1);
if (_la==L_BRACKET) {
{
- setState(553);
+ setState(557);
match(L_BRACKET);
- setState(554);
+ setState(558);
oldLabelUse();
- setState(555);
+ setState(559);
match(R_BRACKET);
}
}
- setState(559);
+ setState(563);
match(L_PAREN);
- setState(560);
+ setState(564);
expression(0);
- setState(561);
+ setState(565);
match(R_PAREN);
}
}
@@ -2027,20 +2029,20 @@ public final OldLabelUseContext oldLabelUse() throws RecognitionException {
OldLabelUseContext _localctx = new OldLabelUseContext(_ctx, getState());
enterRule(_localctx, 56, RULE_oldLabelUse);
try {
- setState(565);
+ setState(569);
_errHandler.sync(this);
switch (_input.LA(1)) {
case IDENTIFIER:
enterOuterAlt(_localctx, 1);
{
- setState(563);
+ setState(567);
labelUse();
}
break;
case LHS:
enterOuterAlt(_localctx, 2);
{
- setState(564);
+ setState(568);
match(LHS);
}
break;
@@ -2078,7 +2080,7 @@ public final LabelUseContext labelUse() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(567);
+ setState(571);
match(IDENTIFIER);
}
}
@@ -2117,13 +2119,13 @@ public final BeforeContext before() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(569);
+ setState(573);
match(BEFORE);
- setState(570);
+ setState(574);
match(L_PAREN);
- setState(571);
+ setState(575);
expression(0);
- setState(572);
+ setState(576);
match(R_PAREN);
}
}
@@ -2162,13 +2164,13 @@ public final IsComparableContext isComparable() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(574);
+ setState(578);
match(IS_COMPARABLE);
- setState(575);
+ setState(579);
match(L_PAREN);
- setState(576);
+ setState(580);
expression(0);
- setState(577);
+ setState(581);
match(R_PAREN);
}
}
@@ -2207,13 +2209,13 @@ public final TypeOfContext typeOf() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(579);
+ setState(583);
match(TYPE_OF);
- setState(580);
+ setState(584);
match(L_PAREN);
- setState(581);
+ setState(585);
expression(0);
- setState(582);
+ setState(586);
match(R_PAREN);
}
}
@@ -2257,25 +2259,25 @@ public final AccessContext access() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(584);
+ setState(588);
match(ACCESS);
- setState(585);
+ setState(589);
match(L_PAREN);
- setState(586);
+ setState(590);
expression(0);
- setState(589);
+ setState(593);
_errHandler.sync(this);
_la = _input.LA(1);
if (_la==COMMA) {
{
- setState(587);
+ setState(591);
match(COMMA);
- setState(588);
+ setState(592);
expression(0);
}
}
- setState(591);
+ setState(595);
match(R_PAREN);
}
}
@@ -2322,7 +2324,7 @@ public final RangeContext range() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(593);
+ setState(597);
((RangeContext)_localctx).kind = _input.LT(1);
_la = _input.LA(1);
if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << SEQ) | (1L << SET) | (1L << MSET))) != 0)) ) {
@@ -2333,15 +2335,15 @@ public final RangeContext range() throws RecognitionException {
_errHandler.reportMatch(this);
consume();
}
- setState(594);
+ setState(598);
match(L_BRACKET);
- setState(595);
+ setState(599);
expression(0);
- setState(596);
+ setState(600);
match(DOT_DOT);
- setState(597);
+ setState(601);
expression(0);
- setState(598);
+ setState(602);
match(R_BRACKET);
}
}
@@ -2387,29 +2389,29 @@ public final SeqUpdExpContext seqUpdExp() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(600);
+ setState(604);
match(L_BRACKET);
{
- setState(601);
+ setState(605);
seqUpdClause();
- setState(606);
+ setState(610);
_errHandler.sync(this);
_la = _input.LA(1);
while (_la==COMMA) {
{
{
- setState(602);
+ setState(606);
match(COMMA);
- setState(603);
+ setState(607);
seqUpdClause();
}
}
- setState(608);
+ setState(612);
_errHandler.sync(this);
_la = _input.LA(1);
}
}
- setState(609);
+ setState(613);
match(R_BRACKET);
}
}
@@ -2449,11 +2451,11 @@ public final SeqUpdClauseContext seqUpdClause() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(611);
+ setState(615);
expression(0);
- setState(612);
+ setState(616);
match(ASSIGN);
- setState(613);
+ setState(617);
expression(0);
}
}
@@ -2478,6 +2480,9 @@ public GhostSliceTypeContext ghostSliceType() {
public DomainTypeContext domainType() {
return getRuleContext(DomainTypeContext.class,0);
}
+ public AdtTypeContext adtType() {
+ return getRuleContext(AdtTypeContext.class,0);
+ }
public GhostTypeLitContext(ParserRuleContext parent, int invokingState) {
super(parent, invokingState);
}
@@ -2493,7 +2498,7 @@ public final GhostTypeLitContext ghostTypeLit() throws RecognitionException {
GhostTypeLitContext _localctx = new GhostTypeLitContext(_ctx, getState());
enterRule(_localctx, 74, RULE_ghostTypeLit);
try {
- setState(618);
+ setState(623);
_errHandler.sync(this);
switch (_input.LA(1)) {
case SEQ:
@@ -2503,24 +2508,31 @@ public final GhostTypeLitContext ghostTypeLit() throws RecognitionException {
case OPT:
enterOuterAlt(_localctx, 1);
{
- setState(615);
+ setState(619);
sqType();
}
break;
case GHOST:
enterOuterAlt(_localctx, 2);
{
- setState(616);
+ setState(620);
ghostSliceType();
}
break;
case DOM:
enterOuterAlt(_localctx, 3);
{
- setState(617);
+ setState(621);
domainType();
}
break;
+ case ADT:
+ enterOuterAlt(_localctx, 4);
+ {
+ setState(622);
+ adtType();
+ }
+ break;
default:
throw new NoViableAltException(this);
}
@@ -2570,27 +2582,27 @@ public final DomainTypeContext domainType() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(620);
+ setState(625);
match(DOM);
- setState(621);
+ setState(626);
match(L_CURLY);
- setState(627);
+ setState(632);
_errHandler.sync(this);
_la = _input.LA(1);
while (_la==AXIOM || _la==FUNC) {
{
{
- setState(622);
+ setState(627);
domainClause();
- setState(623);
+ setState(628);
eos();
}
}
- setState(629);
+ setState(634);
_errHandler.sync(this);
_la = _input.LA(1);
}
- setState(630);
+ setState(635);
match(R_CURLY);
}
}
@@ -2635,32 +2647,32 @@ public final DomainClauseContext domainClause() throws RecognitionException {
DomainClauseContext _localctx = new DomainClauseContext(_ctx, getState());
enterRule(_localctx, 78, RULE_domainClause);
try {
- setState(641);
+ setState(646);
_errHandler.sync(this);
switch (_input.LA(1)) {
case FUNC:
enterOuterAlt(_localctx, 1);
{
- setState(632);
+ setState(637);
match(FUNC);
- setState(633);
+ setState(638);
match(IDENTIFIER);
- setState(634);
+ setState(639);
signature();
}
break;
case AXIOM:
enterOuterAlt(_localctx, 2);
{
- setState(635);
+ setState(640);
match(AXIOM);
- setState(636);
+ setState(641);
match(L_CURLY);
- setState(637);
+ setState(642);
expression(0);
- setState(638);
+ setState(643);
eos();
- setState(639);
+ setState(644);
match(R_CURLY);
}
break;
@@ -2679,6 +2691,144 @@ public final DomainClauseContext domainClause() throws RecognitionException {
return _localctx;
}
+ public static class AdtTypeContext extends ParserRuleContext {
+ public TerminalNode ADT() { return getToken(GobraParser.ADT, 0); }
+ public TerminalNode L_CURLY() { return getToken(GobraParser.L_CURLY, 0); }
+ public TerminalNode R_CURLY() { return getToken(GobraParser.R_CURLY, 0); }
+ public List adtClause() {
+ return getRuleContexts(AdtClauseContext.class);
+ }
+ public AdtClauseContext adtClause(int i) {
+ return getRuleContext(AdtClauseContext.class,i);
+ }
+ public List eos() {
+ return getRuleContexts(EosContext.class);
+ }
+ public EosContext eos(int i) {
+ return getRuleContext(EosContext.class,i);
+ }
+ public AdtTypeContext(ParserRuleContext parent, int invokingState) {
+ super(parent, invokingState);
+ }
+ @Override public int getRuleIndex() { return RULE_adtType; }
+ @Override
+ public T accept(ParseTreeVisitor extends T> visitor) {
+ if ( visitor instanceof GobraParserVisitor ) return ((GobraParserVisitor extends T>)visitor).visitAdtType(this);
+ else return visitor.visitChildren(this);
+ }
+ }
+
+ public final AdtTypeContext adtType() throws RecognitionException {
+ AdtTypeContext _localctx = new AdtTypeContext(_ctx, getState());
+ enterRule(_localctx, 80, RULE_adtType);
+ int _la;
+ try {
+ enterOuterAlt(_localctx, 1);
+ {
+ setState(648);
+ match(ADT);
+ setState(649);
+ match(L_CURLY);
+ setState(655);
+ _errHandler.sync(this);
+ _la = _input.LA(1);
+ while (_la==IDENTIFIER) {
+ {
+ {
+ setState(650);
+ adtClause();
+ setState(651);
+ eos();
+ }
+ }
+ setState(657);
+ _errHandler.sync(this);
+ _la = _input.LA(1);
+ }
+ setState(658);
+ match(R_CURLY);
+ }
+ }
+ catch (RecognitionException re) {
+ _localctx.exception = re;
+ _errHandler.reportError(this, re);
+ _errHandler.recover(this, re);
+ }
+ finally {
+ exitRule();
+ }
+ return _localctx;
+ }
+
+ public static class AdtClauseContext extends ParserRuleContext {
+ public TerminalNode IDENTIFIER() { return getToken(GobraParser.IDENTIFIER, 0); }
+ public TerminalNode L_CURLY() { return getToken(GobraParser.L_CURLY, 0); }
+ public TerminalNode R_CURLY() { return getToken(GobraParser.R_CURLY, 0); }
+ public List fieldDecl() {
+ return getRuleContexts(FieldDeclContext.class);
+ }
+ public FieldDeclContext fieldDecl(int i) {
+ return getRuleContext(FieldDeclContext.class,i);
+ }
+ public List eos() {
+ return getRuleContexts(EosContext.class);
+ }
+ public EosContext eos(int i) {
+ return getRuleContext(EosContext.class,i);
+ }
+ public AdtClauseContext(ParserRuleContext parent, int invokingState) {
+ super(parent, invokingState);
+ }
+ @Override public int getRuleIndex() { return RULE_adtClause; }
+ @Override
+ public T accept(ParseTreeVisitor extends T> visitor) {
+ if ( visitor instanceof GobraParserVisitor ) return ((GobraParserVisitor extends T>)visitor).visitAdtClause(this);
+ else return visitor.visitChildren(this);
+ }
+ }
+
+ public final AdtClauseContext adtClause() throws RecognitionException {
+ AdtClauseContext _localctx = new AdtClauseContext(_ctx, getState());
+ enterRule(_localctx, 82, RULE_adtClause);
+ int _la;
+ try {
+ enterOuterAlt(_localctx, 1);
+ {
+ setState(660);
+ match(IDENTIFIER);
+ setState(661);
+ match(L_CURLY);
+ setState(667);
+ _errHandler.sync(this);
+ _la = _input.LA(1);
+ while (_la==IDENTIFIER || _la==STAR) {
+ {
+ {
+ setState(662);
+ fieldDecl();
+ setState(663);
+ eos();
+ }
+ }
+ setState(669);
+ _errHandler.sync(this);
+ _la = _input.LA(1);
+ }
+ setState(670);
+ match(R_CURLY);
+ }
+ }
+ catch (RecognitionException re) {
+ _localctx.exception = re;
+ _errHandler.reportError(this, re);
+ _errHandler.recover(this, re);
+ }
+ finally {
+ exitRule();
+ }
+ return _localctx;
+ }
+
public static class GhostSliceTypeContext extends ParserRuleContext {
public TerminalNode GHOST() { return getToken(GobraParser.GHOST, 0); }
public TerminalNode L_BRACKET() { return getToken(GobraParser.L_BRACKET, 0); }
@@ -2699,17 +2849,17 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final GhostSliceTypeContext ghostSliceType() throws RecognitionException {
GhostSliceTypeContext _localctx = new GhostSliceTypeContext(_ctx, getState());
- enterRule(_localctx, 80, RULE_ghostSliceType);
+ enterRule(_localctx, 84, RULE_ghostSliceType);
try {
enterOuterAlt(_localctx, 1);
{
- setState(643);
+ setState(672);
match(GHOST);
- setState(644);
+ setState(673);
match(L_BRACKET);
- setState(645);
+ setState(674);
match(R_BRACKET);
- setState(646);
+ setState(675);
elementType();
}
}
@@ -2752,10 +2902,10 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final SqTypeContext sqType() throws RecognitionException {
SqTypeContext _localctx = new SqTypeContext(_ctx, getState());
- enterRule(_localctx, 82, RULE_sqType);
+ enterRule(_localctx, 86, RULE_sqType);
int _la;
try {
- setState(659);
+ setState(688);
_errHandler.sync(this);
switch (_input.LA(1)) {
case SEQ:
@@ -2765,7 +2915,7 @@ public final SqTypeContext sqType() throws RecognitionException {
enterOuterAlt(_localctx, 1);
{
{
- setState(648);
+ setState(677);
((SqTypeContext)_localctx).kind = _input.LT(1);
_la = _input.LA(1);
if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << OPT))) != 0)) ) {
@@ -2776,11 +2926,11 @@ public final SqTypeContext sqType() throws RecognitionException {
_errHandler.reportMatch(this);
consume();
}
- setState(649);
+ setState(678);
match(L_BRACKET);
- setState(650);
+ setState(679);
type_();
- setState(651);
+ setState(680);
match(R_BRACKET);
}
}
@@ -2788,15 +2938,15 @@ public final SqTypeContext sqType() throws RecognitionException {
case DICT:
enterOuterAlt(_localctx, 2);
{
- setState(653);
+ setState(682);
((SqTypeContext)_localctx).kind = match(DICT);
- setState(654);
+ setState(683);
match(L_BRACKET);
- setState(655);
+ setState(684);
type_();
- setState(656);
+ setState(685);
match(R_BRACKET);
- setState(657);
+ setState(686);
type_();
}
break;
@@ -2851,20 +3001,20 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final SpecificationContext specification() throws RecognitionException {
SpecificationContext _localctx = new SpecificationContext(_ctx, getState());
- enterRule(_localctx, 84, RULE_specification);
+ enterRule(_localctx, 88, RULE_specification);
int _la;
try {
int _alt;
enterOuterAlt(_localctx, 1);
{
- setState(671);
+ setState(700);
_errHandler.sync(this);
- _alt = getInterpreter().adaptivePredict(_input,29,_ctx);
+ _alt = getInterpreter().adaptivePredict(_input,31,_ctx);
while ( _alt!=1 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) {
if ( _alt==1+1 ) {
{
{
- setState(666);
+ setState(695);
_errHandler.sync(this);
switch (_input.LA(1)) {
case PRE:
@@ -2872,20 +3022,20 @@ public final SpecificationContext specification() throws RecognitionException {
case POST:
case DEC:
{
- setState(661);
+ setState(690);
specStatement();
}
break;
case PURE:
{
- setState(662);
+ setState(691);
match(PURE);
((SpecificationContext)_localctx).pure = true;
}
break;
case TRUSTED:
{
- setState(664);
+ setState(693);
match(TRUSTED);
((SpecificationContext)_localctx).trusted = true;
}
@@ -2893,21 +3043,21 @@ public final SpecificationContext specification() throws RecognitionException {
default:
throw new NoViableAltException(this);
}
- setState(668);
+ setState(697);
eos();
}
}
}
- setState(673);
+ setState(702);
_errHandler.sync(this);
- _alt = getInterpreter().adaptivePredict(_input,29,_ctx);
+ _alt = getInterpreter().adaptivePredict(_input,31,_ctx);
}
- setState(676);
+ setState(705);
_errHandler.sync(this);
_la = _input.LA(1);
if (_la==PURE) {
{
- setState(674);
+ setState(703);
match(PURE);
((SpecificationContext)_localctx).pure = true;
}
@@ -2951,44 +3101,44 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final SpecStatementContext specStatement() throws RecognitionException {
SpecStatementContext _localctx = new SpecStatementContext(_ctx, getState());
- enterRule(_localctx, 86, RULE_specStatement);
+ enterRule(_localctx, 90, RULE_specStatement);
try {
- setState(686);
+ setState(715);
_errHandler.sync(this);
switch (_input.LA(1)) {
case PRE:
enterOuterAlt(_localctx, 1);
{
- setState(678);
+ setState(707);
((SpecStatementContext)_localctx).kind = match(PRE);
- setState(679);
+ setState(708);
assertion();
}
break;
case PRESERVES:
enterOuterAlt(_localctx, 2);
{
- setState(680);
+ setState(709);
((SpecStatementContext)_localctx).kind = match(PRESERVES);
- setState(681);
+ setState(710);
assertion();
}
break;
case POST:
enterOuterAlt(_localctx, 3);
{
- setState(682);
+ setState(711);
((SpecStatementContext)_localctx).kind = match(POST);
- setState(683);
+ setState(712);
assertion();
}
break;
case DEC:
enterOuterAlt(_localctx, 4);
{
- setState(684);
+ setState(713);
((SpecStatementContext)_localctx).kind = match(DEC);
- setState(685);
+ setState(714);
terminationMeasure();
}
break;
@@ -3028,28 +3178,28 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final TerminationMeasureContext terminationMeasure() throws RecognitionException {
TerminationMeasureContext _localctx = new TerminationMeasureContext(_ctx, getState());
- enterRule(_localctx, 88, RULE_terminationMeasure);
+ enterRule(_localctx, 92, RULE_terminationMeasure);
try {
enterOuterAlt(_localctx, 1);
{
- setState(689);
+ setState(718);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,32,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,34,_ctx) ) {
case 1:
{
- setState(688);
+ setState(717);
expressionList();
}
break;
}
- setState(693);
+ setState(722);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,33,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,35,_ctx) ) {
case 1:
{
- setState(691);
+ setState(720);
match(IF);
- setState(692);
+ setState(721);
expression(0);
}
break;
@@ -3084,11 +3234,11 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final AssertionContext assertion() throws RecognitionException {
AssertionContext _localctx = new AssertionContext(_ctx, getState());
- enterRule(_localctx, 90, RULE_assertion);
+ enterRule(_localctx, 94, RULE_assertion);
try {
- setState(697);
+ setState(726);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,34,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,36,_ctx) ) {
case 1:
enterOuterAlt(_localctx, 1);
{
@@ -3097,7 +3247,7 @@ public final AssertionContext assertion() throws RecognitionException {
case 2:
enterOuterAlt(_localctx, 2);
{
- setState(696);
+ setState(725);
expression(0);
}
break;
@@ -3140,37 +3290,37 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final BlockWithBodyParameterInfoContext blockWithBodyParameterInfo() throws RecognitionException {
BlockWithBodyParameterInfoContext _localctx = new BlockWithBodyParameterInfoContext(_ctx, getState());
- enterRule(_localctx, 92, RULE_blockWithBodyParameterInfo);
+ enterRule(_localctx, 96, RULE_blockWithBodyParameterInfo);
try {
enterOuterAlt(_localctx, 1);
{
- setState(699);
+ setState(728);
match(L_CURLY);
- setState(704);
+ setState(733);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,35,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,37,_ctx) ) {
case 1:
{
- setState(700);
+ setState(729);
match(SHARE);
- setState(701);
+ setState(730);
identifierList();
- setState(702);
+ setState(731);
eos();
}
break;
}
- setState(707);
+ setState(736);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,36,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,38,_ctx) ) {
case 1:
{
- setState(706);
+ setState(735);
statementList();
}
break;
}
- setState(709);
+ setState(738);
match(R_CURLY);
}
}
@@ -3209,47 +3359,47 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final ClosureSpecInstanceContext closureSpecInstance() throws RecognitionException {
ClosureSpecInstanceContext _localctx = new ClosureSpecInstanceContext(_ctx, getState());
- enterRule(_localctx, 94, RULE_closureSpecInstance);
+ enterRule(_localctx, 98, RULE_closureSpecInstance);
int _la;
try {
enterOuterAlt(_localctx, 1);
{
- setState(713);
+ setState(742);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,37,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,39,_ctx) ) {
case 1:
{
- setState(711);
+ setState(740);
qualifiedIdent();
}
break;
case 2:
{
- setState(712);
+ setState(741);
match(IDENTIFIER);
}
break;
}
- setState(723);
+ setState(752);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,40,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,42,_ctx) ) {
case 1:
{
- setState(715);
+ setState(744);
match(L_CURLY);
- setState(720);
+ setState(749);
_errHandler.sync(this);
_la = _input.LA(1);
- if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FLOAT_LIT) | (1L << TRUE) | (1L << FALSE) | (1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << OLD) | (1L << BEFORE) | (1L << FORALL) | (1L << EXISTS) | (1L << ACCESS) | (1L << UNFOLDING) | (1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << LEN) | (1L << NEW) | (1L << MAKE) | (1L << CAP) | (1L << SOME) | (1L << GET) | (1L << DOM) | (1L << NONE) | (1L << PRED) | (1L << TYPE_OF) | (1L << IS_COMPARABLE) | (1L << WRITEPERM) | (1L << NOPERM))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (TRUSTED - 64)) | (1L << (FUNC - 64)) | (1L << (INTERFACE - 64)) | (1L << (MAP - 64)) | (1L << (STRUCT - 64)) | (1L << (CHAN - 64)) | (1L << (RANGE - 64)) | (1L << (TYPE - 64)) | (1L << (NIL_LIT - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (L_PAREN - 64)) | (1L << (L_BRACKET - 64)))) != 0) || ((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & ((1L << (EXCLAMATION - 128)) | (1L << (PLUS - 128)) | (1L << (MINUS - 128)) | (1L << (CARET - 128)) | (1L << (STAR - 128)) | (1L << (AMPERSAND - 128)) | (1L << (RECEIVE - 128)) | (1L << (DECIMAL_LIT - 128)) | (1L << (BINARY_LIT - 128)) | (1L << (OCTAL_LIT - 128)) | (1L << (HEX_LIT - 128)) | (1L << (IMAGINARY_LIT - 128)) | (1L << (RUNE_LIT - 128)) | (1L << (RAW_STRING_LIT - 128)) | (1L << (INTERPRETED_STRING_LIT - 128)))) != 0)) {
+ if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FLOAT_LIT) | (1L << TRUE) | (1L << FALSE) | (1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << OLD) | (1L << BEFORE) | (1L << FORALL) | (1L << EXISTS) | (1L << ACCESS) | (1L << UNFOLDING) | (1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << LEN) | (1L << NEW) | (1L << MAKE) | (1L << CAP) | (1L << SOME) | (1L << GET) | (1L << DOM) | (1L << ADT) | (1L << NONE) | (1L << PRED) | (1L << TYPE_OF) | (1L << IS_COMPARABLE) | (1L << WRITEPERM))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (NOPERM - 64)) | (1L << (TRUSTED - 64)) | (1L << (FUNC - 64)) | (1L << (INTERFACE - 64)) | (1L << (MAP - 64)) | (1L << (STRUCT - 64)) | (1L << (CHAN - 64)) | (1L << (RANGE - 64)) | (1L << (TYPE - 64)) | (1L << (NIL_LIT - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (L_PAREN - 64)) | (1L << (L_BRACKET - 64)))) != 0) || ((((_la - 129)) & ~0x3f) == 0 && ((1L << (_la - 129)) & ((1L << (EXCLAMATION - 129)) | (1L << (PLUS - 129)) | (1L << (MINUS - 129)) | (1L << (CARET - 129)) | (1L << (STAR - 129)) | (1L << (AMPERSAND - 129)) | (1L << (RECEIVE - 129)) | (1L << (DECIMAL_LIT - 129)) | (1L << (BINARY_LIT - 129)) | (1L << (OCTAL_LIT - 129)) | (1L << (HEX_LIT - 129)) | (1L << (IMAGINARY_LIT - 129)) | (1L << (RUNE_LIT - 129)) | (1L << (RAW_STRING_LIT - 129)) | (1L << (INTERPRETED_STRING_LIT - 129)))) != 0)) {
{
- setState(716);
+ setState(745);
closureSpecParams();
- setState(718);
+ setState(747);
_errHandler.sync(this);
_la = _input.LA(1);
if (_la==COMMA) {
{
- setState(717);
+ setState(746);
match(COMMA);
}
}
@@ -3257,7 +3407,7 @@ public final ClosureSpecInstanceContext closureSpecInstance() throws Recognition
}
}
- setState(722);
+ setState(751);
match(R_CURLY);
}
break;
@@ -3299,30 +3449,30 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final ClosureSpecParamsContext closureSpecParams() throws RecognitionException {
ClosureSpecParamsContext _localctx = new ClosureSpecParamsContext(_ctx, getState());
- enterRule(_localctx, 96, RULE_closureSpecParams);
+ enterRule(_localctx, 100, RULE_closureSpecParams);
try {
int _alt;
enterOuterAlt(_localctx, 1);
{
- setState(725);
+ setState(754);
closureSpecParam();
- setState(730);
+ setState(759);
_errHandler.sync(this);
- _alt = getInterpreter().adaptivePredict(_input,41,_ctx);
+ _alt = getInterpreter().adaptivePredict(_input,43,_ctx);
while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) {
if ( _alt==1 ) {
{
{
- setState(726);
+ setState(755);
match(COMMA);
- setState(727);
+ setState(756);
closureSpecParam();
}
}
}
- setState(732);
+ setState(761);
_errHandler.sync(this);
- _alt = getInterpreter().adaptivePredict(_input,41,_ctx);
+ _alt = getInterpreter().adaptivePredict(_input,43,_ctx);
}
}
}
@@ -3356,23 +3506,23 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final ClosureSpecParamContext closureSpecParam() throws RecognitionException {
ClosureSpecParamContext _localctx = new ClosureSpecParamContext(_ctx, getState());
- enterRule(_localctx, 98, RULE_closureSpecParam);
+ enterRule(_localctx, 102, RULE_closureSpecParam);
try {
enterOuterAlt(_localctx, 1);
{
- setState(735);
+ setState(764);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,42,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,44,_ctx) ) {
case 1:
{
- setState(733);
+ setState(762);
match(IDENTIFIER);
- setState(734);
+ setState(763);
match(COLON);
}
break;
}
- setState(737);
+ setState(766);
expression(0);
}
}
@@ -3412,19 +3562,19 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final ClosureImplProofStmtContext closureImplProofStmt() throws RecognitionException {
ClosureImplProofStmtContext _localctx = new ClosureImplProofStmtContext(_ctx, getState());
- enterRule(_localctx, 100, RULE_closureImplProofStmt);
+ enterRule(_localctx, 104, RULE_closureImplProofStmt);
try {
enterOuterAlt(_localctx, 1);
{
- setState(739);
+ setState(768);
match(PROOF);
- setState(740);
+ setState(769);
expression(0);
- setState(741);
+ setState(770);
match(IMPL);
- setState(742);
+ setState(771);
closureSpecInstance();
- setState(743);
+ setState(772);
block();
}
}
@@ -3480,57 +3630,57 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final ImplementationProofContext implementationProof() throws RecognitionException {
ImplementationProofContext _localctx = new ImplementationProofContext(_ctx, getState());
- enterRule(_localctx, 102, RULE_implementationProof);
+ enterRule(_localctx, 106, RULE_implementationProof);
int _la;
try {
enterOuterAlt(_localctx, 1);
{
- setState(745);
+ setState(774);
type_();
- setState(746);
+ setState(775);
match(IMPL);
- setState(747);
+ setState(776);
type_();
- setState(766);
+ setState(795);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,45,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,47,_ctx) ) {
case 1:
{
- setState(748);
+ setState(777);
match(L_CURLY);
- setState(754);
+ setState(783);
_errHandler.sync(this);
_la = _input.LA(1);
while (_la==PRED) {
{
{
- setState(749);
+ setState(778);
implementationProofPredicateAlias();
- setState(750);
+ setState(779);
eos();
}
}
- setState(756);
+ setState(785);
_errHandler.sync(this);
_la = _input.LA(1);
}
- setState(762);
+ setState(791);
_errHandler.sync(this);
_la = _input.LA(1);
while (_la==PURE || _la==L_PAREN) {
{
{
- setState(757);
+ setState(786);
methodImplementationProof();
- setState(758);
+ setState(787);
eos();
}
}
- setState(764);
+ setState(793);
_errHandler.sync(this);
_la = _input.LA(1);
}
- setState(765);
+ setState(794);
match(R_CURLY);
}
break;
@@ -3573,33 +3723,33 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final MethodImplementationProofContext methodImplementationProof() throws RecognitionException {
MethodImplementationProofContext _localctx = new MethodImplementationProofContext(_ctx, getState());
- enterRule(_localctx, 104, RULE_methodImplementationProof);
+ enterRule(_localctx, 108, RULE_methodImplementationProof);
int _la;
try {
enterOuterAlt(_localctx, 1);
{
- setState(769);
+ setState(798);
_errHandler.sync(this);
_la = _input.LA(1);
if (_la==PURE) {
{
- setState(768);
+ setState(797);
match(PURE);
}
}
- setState(771);
+ setState(800);
nonLocalReceiver();
- setState(772);
+ setState(801);
match(IDENTIFIER);
- setState(773);
+ setState(802);
signature();
- setState(775);
+ setState(804);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,47,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,49,_ctx) ) {
case 1:
{
- setState(774);
+ setState(803);
block();
}
break;
@@ -3638,36 +3788,36 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final NonLocalReceiverContext nonLocalReceiver() throws RecognitionException {
NonLocalReceiverContext _localctx = new NonLocalReceiverContext(_ctx, getState());
- enterRule(_localctx, 106, RULE_nonLocalReceiver);
+ enterRule(_localctx, 110, RULE_nonLocalReceiver);
int _la;
try {
enterOuterAlt(_localctx, 1);
{
- setState(777);
+ setState(806);
match(L_PAREN);
- setState(779);
+ setState(808);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,48,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,50,_ctx) ) {
case 1:
{
- setState(778);
+ setState(807);
match(IDENTIFIER);
}
break;
}
- setState(782);
+ setState(811);
_errHandler.sync(this);
_la = _input.LA(1);
if (_la==STAR) {
{
- setState(781);
+ setState(810);
match(STAR);
}
}
- setState(784);
+ setState(813);
typeName();
- setState(785);
+ setState(814);
match(R_PAREN);
}
}
@@ -3704,26 +3854,26 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final SelectionContext selection() throws RecognitionException {
SelectionContext _localctx = new SelectionContext(_ctx, getState());
- enterRule(_localctx, 108, RULE_selection);
+ enterRule(_localctx, 112, RULE_selection);
try {
- setState(792);
+ setState(821);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,50,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,52,_ctx) ) {
case 1:
enterOuterAlt(_localctx, 1);
{
- setState(787);
+ setState(816);
primaryExpr(0);
}
break;
case 2:
enterOuterAlt(_localctx, 2);
{
- setState(788);
+ setState(817);
type_();
- setState(789);
+ setState(818);
match(DOT);
- setState(790);
+ setState(819);
match(IDENTIFIER);
}
break;
@@ -3763,28 +3913,28 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final ImplementationProofPredicateAliasContext implementationProofPredicateAlias() throws RecognitionException {
ImplementationProofPredicateAliasContext _localctx = new ImplementationProofPredicateAliasContext(_ctx, getState());
- enterRule(_localctx, 110, RULE_implementationProofPredicateAlias);
+ enterRule(_localctx, 114, RULE_implementationProofPredicateAlias);
try {
enterOuterAlt(_localctx, 1);
{
- setState(794);
+ setState(823);
match(PRED);
- setState(795);
+ setState(824);
match(IDENTIFIER);
- setState(796);
+ setState(825);
match(DECLARE_ASSIGN);
- setState(799);
+ setState(828);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,51,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,53,_ctx) ) {
case 1:
{
- setState(797);
+ setState(826);
selection();
}
break;
case 2:
{
- setState(798);
+ setState(827);
operandName();
}
break;
@@ -3826,30 +3976,30 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final MakeContext make() throws RecognitionException {
MakeContext _localctx = new MakeContext(_ctx, getState());
- enterRule(_localctx, 112, RULE_make);
+ enterRule(_localctx, 116, RULE_make);
int _la;
try {
enterOuterAlt(_localctx, 1);
{
- setState(801);
+ setState(830);
match(MAKE);
- setState(802);
+ setState(831);
match(L_PAREN);
- setState(803);
+ setState(832);
type_();
- setState(806);
+ setState(835);
_errHandler.sync(this);
_la = _input.LA(1);
if (_la==COMMA) {
{
- setState(804);
+ setState(833);
match(COMMA);
- setState(805);
+ setState(834);
expressionList();
}
}
- setState(808);
+ setState(837);
match(R_PAREN);
}
}
@@ -3884,17 +4034,17 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final New_Context new_() throws RecognitionException {
New_Context _localctx = new New_Context(_ctx, getState());
- enterRule(_localctx, 114, RULE_new_);
+ enterRule(_localctx, 118, RULE_new_);
try {
enterOuterAlt(_localctx, 1);
{
- setState(810);
+ setState(839);
match(NEW);
- setState(811);
+ setState(840);
match(L_PAREN);
- setState(812);
+ setState(841);
type_();
- setState(813);
+ setState(842);
match(R_PAREN);
}
}
@@ -3933,24 +4083,24 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final SpecMemberContext specMember() throws RecognitionException {
SpecMemberContext _localctx = new SpecMemberContext(_ctx, getState());
- enterRule(_localctx, 116, RULE_specMember);
+ enterRule(_localctx, 120, RULE_specMember);
try {
enterOuterAlt(_localctx, 1);
{
- setState(815);
+ setState(844);
((SpecMemberContext)_localctx).specification = specification();
- setState(818);
+ setState(847);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,53,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,55,_ctx) ) {
case 1:
{
- setState(816);
+ setState(845);
functionDecl(((SpecMemberContext)_localctx).specification.trusted, ((SpecMemberContext)_localctx).specification.pure);
}
break;
case 2:
{
- setState(817);
+ setState(846);
methodDecl(((SpecMemberContext)_localctx).specification.trusted, ((SpecMemberContext)_localctx).specification.pure);
}
break;
@@ -3995,23 +4145,23 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final FunctionDeclContext functionDecl(boolean trusted,boolean pure) throws RecognitionException {
FunctionDeclContext _localctx = new FunctionDeclContext(_ctx, getState(), trusted, pure);
- enterRule(_localctx, 118, RULE_functionDecl);
+ enterRule(_localctx, 122, RULE_functionDecl);
try {
enterOuterAlt(_localctx, 1);
{
- setState(820);
+ setState(849);
match(FUNC);
- setState(821);
+ setState(850);
match(IDENTIFIER);
{
- setState(822);
+ setState(851);
signature();
- setState(824);
+ setState(853);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,54,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,56,_ctx) ) {
case 1:
{
- setState(823);
+ setState(852);
blockWithBodyParameterInfo();
}
break;
@@ -4060,25 +4210,25 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final MethodDeclContext methodDecl(boolean trusted,boolean pure) throws RecognitionException {
MethodDeclContext _localctx = new MethodDeclContext(_ctx, getState(), trusted, pure);
- enterRule(_localctx, 120, RULE_methodDecl);
+ enterRule(_localctx, 124, RULE_methodDecl);
try {
enterOuterAlt(_localctx, 1);
{
- setState(826);
+ setState(855);
match(FUNC);
- setState(827);
+ setState(856);
receiver();
- setState(828);
+ setState(857);
match(IDENTIFIER);
{
- setState(829);
+ setState(858);
signature();
- setState(831);
+ setState(860);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,55,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,57,_ctx) ) {
case 1:
{
- setState(830);
+ setState(859);
blockWithBodyParameterInfo();
}
break;
@@ -4118,13 +4268,13 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final ExplicitGhostMemberContext explicitGhostMember() throws RecognitionException {
ExplicitGhostMemberContext _localctx = new ExplicitGhostMemberContext(_ctx, getState());
- enterRule(_localctx, 122, RULE_explicitGhostMember);
+ enterRule(_localctx, 126, RULE_explicitGhostMember);
try {
enterOuterAlt(_localctx, 1);
{
- setState(833);
+ setState(862);
match(GHOST);
- setState(836);
+ setState(865);
_errHandler.sync(this);
switch (_input.LA(1)) {
case PRE:
@@ -4135,7 +4285,7 @@ public final ExplicitGhostMemberContext explicitGhostMember() throws Recognition
case TRUSTED:
case FUNC:
{
- setState(834);
+ setState(863);
specMember();
}
break;
@@ -4143,7 +4293,7 @@ public final ExplicitGhostMemberContext explicitGhostMember() throws Recognition
case TYPE:
case VAR:
{
- setState(835);
+ setState(864);
declaration();
}
break;
@@ -4185,22 +4335,22 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final FpredicateDeclContext fpredicateDecl() throws RecognitionException {
FpredicateDeclContext _localctx = new FpredicateDeclContext(_ctx, getState());
- enterRule(_localctx, 124, RULE_fpredicateDecl);
+ enterRule(_localctx, 128, RULE_fpredicateDecl);
try {
enterOuterAlt(_localctx, 1);
{
- setState(838);
+ setState(867);
match(PRED);
- setState(839);
+ setState(868);
match(IDENTIFIER);
- setState(840);
+ setState(869);
parameters();
- setState(842);
+ setState(871);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,57,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,59,_ctx) ) {
case 1:
{
- setState(841);
+ setState(870);
predicateBody();
}
break;
@@ -4240,17 +4390,17 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final PredicateBodyContext predicateBody() throws RecognitionException {
PredicateBodyContext _localctx = new PredicateBodyContext(_ctx, getState());
- enterRule(_localctx, 126, RULE_predicateBody);
+ enterRule(_localctx, 130, RULE_predicateBody);
try {
enterOuterAlt(_localctx, 1);
{
- setState(844);
+ setState(873);
match(L_CURLY);
- setState(845);
+ setState(874);
expression(0);
- setState(846);
+ setState(875);
eos();
- setState(847);
+ setState(876);
match(R_CURLY);
}
}
@@ -4290,24 +4440,24 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final MpredicateDeclContext mpredicateDecl() throws RecognitionException {
MpredicateDeclContext _localctx = new MpredicateDeclContext(_ctx, getState());
- enterRule(_localctx, 128, RULE_mpredicateDecl);
+ enterRule(_localctx, 132, RULE_mpredicateDecl);
try {
enterOuterAlt(_localctx, 1);
{
- setState(849);
+ setState(878);
match(PRED);
- setState(850);
+ setState(879);
receiver();
- setState(851);
+ setState(880);
match(IDENTIFIER);
- setState(852);
+ setState(881);
parameters();
- setState(854);
+ setState(883);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,58,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,60,_ctx) ) {
case 1:
{
- setState(853);
+ setState(882);
predicateBody();
}
break;
@@ -4349,13 +4499,13 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final VarSpecContext varSpec() throws RecognitionException {
VarSpecContext _localctx = new VarSpecContext(_ctx, getState());
- enterRule(_localctx, 130, RULE_varSpec);
+ enterRule(_localctx, 134, RULE_varSpec);
try {
enterOuterAlt(_localctx, 1);
{
- setState(856);
+ setState(885);
maybeAddressableIdentifierList();
- setState(864);
+ setState(893);
_errHandler.sync(this);
switch (_input.LA(1)) {
case GHOST:
@@ -4365,6 +4515,7 @@ public final VarSpecContext varSpec() throws RecognitionException {
case DICT:
case OPT:
case DOM:
+ case ADT:
case PRED:
case FUNC:
case INTERFACE:
@@ -4377,16 +4528,16 @@ public final VarSpecContext varSpec() throws RecognitionException {
case STAR:
case RECEIVE:
{
- setState(857);
+ setState(886);
type_();
- setState(860);
+ setState(889);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,59,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,61,_ctx) ) {
case 1:
{
- setState(858);
+ setState(887);
match(ASSIGN);
- setState(859);
+ setState(888);
expressionList();
}
break;
@@ -4395,9 +4546,9 @@ public final VarSpecContext varSpec() throws RecognitionException {
break;
case ASSIGN:
{
- setState(862);
+ setState(891);
match(ASSIGN);
- setState(863);
+ setState(892);
expressionList();
}
break;
@@ -4438,15 +4589,15 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final ShortVarDeclContext shortVarDecl() throws RecognitionException {
ShortVarDeclContext _localctx = new ShortVarDeclContext(_ctx, getState());
- enterRule(_localctx, 132, RULE_shortVarDecl);
+ enterRule(_localctx, 136, RULE_shortVarDecl);
try {
enterOuterAlt(_localctx, 1);
{
- setState(866);
+ setState(895);
maybeAddressableIdentifierList();
- setState(867);
+ setState(896);
match(DECLARE_ASSIGN);
- setState(868);
+ setState(897);
expressionList();
}
}
@@ -4484,36 +4635,36 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final ReceiverContext receiver() throws RecognitionException {
ReceiverContext _localctx = new ReceiverContext(_ctx, getState());
- enterRule(_localctx, 134, RULE_receiver);
+ enterRule(_localctx, 138, RULE_receiver);
int _la;
try {
enterOuterAlt(_localctx, 1);
{
- setState(870);
+ setState(899);
match(L_PAREN);
- setState(872);
+ setState(901);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,61,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,63,_ctx) ) {
case 1:
{
- setState(871);
+ setState(900);
maybeAddressableIdentifier();
}
break;
}
- setState(874);
+ setState(903);
type_();
- setState(876);
+ setState(905);
_errHandler.sync(this);
_la = _input.LA(1);
if (_la==COMMA) {
{
- setState(875);
+ setState(904);
match(COMMA);
}
}
- setState(878);
+ setState(907);
match(R_PAREN);
}
}
@@ -4548,22 +4699,22 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final ParameterDeclContext parameterDecl() throws RecognitionException {
ParameterDeclContext _localctx = new ParameterDeclContext(_ctx, getState());
- enterRule(_localctx, 136, RULE_parameterDecl);
+ enterRule(_localctx, 140, RULE_parameterDecl);
try {
- setState(882);
+ setState(911);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,63,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,65,_ctx) ) {
case 1:
enterOuterAlt(_localctx, 1);
{
- setState(880);
+ setState(909);
actualParameterDecl();
}
break;
case 2:
enterOuterAlt(_localctx, 2);
{
- setState(881);
+ setState(910);
ghostParameterDecl();
}
break;
@@ -4600,21 +4751,21 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final ActualParameterDeclContext actualParameterDecl() throws RecognitionException {
ActualParameterDeclContext _localctx = new ActualParameterDeclContext(_ctx, getState());
- enterRule(_localctx, 138, RULE_actualParameterDecl);
+ enterRule(_localctx, 142, RULE_actualParameterDecl);
try {
enterOuterAlt(_localctx, 1);
{
- setState(885);
+ setState(914);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,64,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,66,_ctx) ) {
case 1:
{
- setState(884);
+ setState(913);
identifierList();
}
break;
}
- setState(887);
+ setState(916);
parameterType();
}
}
@@ -4650,23 +4801,23 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final GhostParameterDeclContext ghostParameterDecl() throws RecognitionException {
GhostParameterDeclContext _localctx = new GhostParameterDeclContext(_ctx, getState());
- enterRule(_localctx, 140, RULE_ghostParameterDecl);
+ enterRule(_localctx, 144, RULE_ghostParameterDecl);
try {
enterOuterAlt(_localctx, 1);
{
- setState(889);
+ setState(918);
match(GHOST);
- setState(891);
+ setState(920);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,65,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,67,_ctx) ) {
case 1:
{
- setState(890);
+ setState(919);
identifierList();
}
break;
}
- setState(893);
+ setState(922);
parameterType();
}
}
@@ -4699,22 +4850,22 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final ParameterTypeContext parameterType() throws RecognitionException {
ParameterTypeContext _localctx = new ParameterTypeContext(_ctx, getState());
- enterRule(_localctx, 142, RULE_parameterType);
+ enterRule(_localctx, 146, RULE_parameterType);
int _la;
try {
enterOuterAlt(_localctx, 1);
{
- setState(896);
+ setState(925);
_errHandler.sync(this);
_la = _input.LA(1);
if (_la==ELLIPSIS) {
{
- setState(895);
+ setState(924);
match(ELLIPSIS);
}
}
- setState(898);
+ setState(927);
type_();
}
}
@@ -4997,26 +5148,26 @@ private ExpressionContext expression(int _p) throws RecognitionException {
int _parentState = getState();
ExpressionContext _localctx = new ExpressionContext(_ctx, _parentState);
ExpressionContext _prevctx = _localctx;
- int _startState = 144;
- enterRecursionRule(_localctx, 144, RULE_expression, _p);
+ int _startState = 148;
+ enterRecursionRule(_localctx, 148, RULE_expression, _p);
int _la;
try {
int _alt;
enterOuterAlt(_localctx, 1);
{
- setState(916);
+ setState(945);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,67,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,69,_ctx) ) {
case 1:
{
_localctx = new UnaryExprContext(_localctx);
_ctx = _localctx;
_prevctx = _localctx;
- setState(901);
+ setState(930);
((UnaryExprContext)_localctx).unary_op = _input.LT(1);
_la = _input.LA(1);
- if ( !(((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & ((1L << (EXCLAMATION - 128)) | (1L << (PLUS - 128)) | (1L << (MINUS - 128)) | (1L << (CARET - 128)) | (1L << (STAR - 128)) | (1L << (AMPERSAND - 128)) | (1L << (RECEIVE - 128)))) != 0)) ) {
+ if ( !(((((_la - 129)) & ~0x3f) == 0 && ((1L << (_la - 129)) & ((1L << (EXCLAMATION - 129)) | (1L << (PLUS - 129)) | (1L << (MINUS - 129)) | (1L << (CARET - 129)) | (1L << (STAR - 129)) | (1L << (AMPERSAND - 129)) | (1L << (RECEIVE - 129)))) != 0)) ) {
((UnaryExprContext)_localctx).unary_op = (Token)_errHandler.recoverInline(this);
}
else {
@@ -5024,7 +5175,7 @@ private ExpressionContext expression(int _p) throws RecognitionException {
_errHandler.reportMatch(this);
consume();
}
- setState(902);
+ setState(931);
expression(14);
}
break;
@@ -5033,7 +5184,7 @@ private ExpressionContext expression(int _p) throws RecognitionException {
_localctx = new PrimaryExpr_Context(_localctx);
_ctx = _localctx;
_prevctx = _localctx;
- setState(903);
+ setState(932);
primaryExpr(0);
}
break;
@@ -5042,13 +5193,13 @@ private ExpressionContext expression(int _p) throws RecognitionException {
_localctx = new UnfoldingContext(_localctx);
_ctx = _localctx;
_prevctx = _localctx;
- setState(904);
+ setState(933);
match(UNFOLDING);
- setState(905);
+ setState(934);
predicateAccess();
- setState(906);
+ setState(935);
match(IN);
- setState(907);
+ setState(936);
expression(2);
}
break;
@@ -5057,7 +5208,7 @@ private ExpressionContext expression(int _p) throws RecognitionException {
_localctx = new QuantificationContext(_localctx);
_ctx = _localctx;
_prevctx = _localctx;
- setState(909);
+ setState(938);
_la = _input.LA(1);
if ( !(_la==FORALL || _la==EXISTS) ) {
_errHandler.recoverInline(this);
@@ -5067,41 +5218,41 @@ private ExpressionContext expression(int _p) throws RecognitionException {
_errHandler.reportMatch(this);
consume();
}
- setState(910);
+ setState(939);
boundVariables();
- setState(911);
+ setState(940);
match(COLON);
- setState(912);
+ setState(941);
match(COLON);
- setState(913);
+ setState(942);
triggers();
- setState(914);
+ setState(943);
expression(1);
}
break;
}
_ctx.stop = _input.LT(-1);
- setState(953);
+ setState(982);
_errHandler.sync(this);
- _alt = getInterpreter().adaptivePredict(_input,69,_ctx);
+ _alt = getInterpreter().adaptivePredict(_input,71,_ctx);
while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) {
if ( _alt==1 ) {
if ( _parseListeners!=null ) triggerExitRuleEvent();
_prevctx = _localctx;
{
- setState(951);
+ setState(980);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,68,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,70,_ctx) ) {
case 1:
{
_localctx = new MulExprContext(new ExpressionContext(_parentctx, _parentState));
pushNewRecursionContext(_localctx, _startState, RULE_expression);
- setState(918);
+ setState(947);
if (!(precpred(_ctx, 12))) throw new FailedPredicateException(this, "precpred(_ctx, 12)");
- setState(919);
+ setState(948);
((MulExprContext)_localctx).mul_op = _input.LT(1);
_la = _input.LA(1);
- if ( !(((((_la - 123)) & ~0x3f) == 0 && ((1L << (_la - 123)) & ((1L << (DIV - 123)) | (1L << (MOD - 123)) | (1L << (LSHIFT - 123)) | (1L << (RSHIFT - 123)) | (1L << (BIT_CLEAR - 123)) | (1L << (STAR - 123)) | (1L << (AMPERSAND - 123)))) != 0)) ) {
+ if ( !(((((_la - 124)) & ~0x3f) == 0 && ((1L << (_la - 124)) & ((1L << (DIV - 124)) | (1L << (MOD - 124)) | (1L << (LSHIFT - 124)) | (1L << (RSHIFT - 124)) | (1L << (BIT_CLEAR - 124)) | (1L << (STAR - 124)) | (1L << (AMPERSAND - 124)))) != 0)) ) {
((MulExprContext)_localctx).mul_op = (Token)_errHandler.recoverInline(this);
}
else {
@@ -5109,7 +5260,7 @@ private ExpressionContext expression(int _p) throws RecognitionException {
_errHandler.reportMatch(this);
consume();
}
- setState(920);
+ setState(949);
expression(13);
}
break;
@@ -5117,12 +5268,12 @@ private ExpressionContext expression(int _p) throws RecognitionException {
{
_localctx = new AddExprContext(new ExpressionContext(_parentctx, _parentState));
pushNewRecursionContext(_localctx, _startState, RULE_expression);
- setState(921);
+ setState(950);
if (!(precpred(_ctx, 11))) throw new FailedPredicateException(this, "precpred(_ctx, 11)");
- setState(922);
+ setState(951);
((AddExprContext)_localctx).add_op = _input.LT(1);
_la = _input.LA(1);
- if ( !(_la==WAND || ((((_la - 110)) & ~0x3f) == 0 && ((1L << (_la - 110)) & ((1L << (PLUS_PLUS - 110)) | (1L << (OR - 110)) | (1L << (PLUS - 110)) | (1L << (MINUS - 110)) | (1L << (CARET - 110)))) != 0)) ) {
+ if ( !(_la==WAND || ((((_la - 111)) & ~0x3f) == 0 && ((1L << (_la - 111)) & ((1L << (PLUS_PLUS - 111)) | (1L << (OR - 111)) | (1L << (PLUS - 111)) | (1L << (MINUS - 111)) | (1L << (CARET - 111)))) != 0)) ) {
((AddExprContext)_localctx).add_op = (Token)_errHandler.recoverInline(this);
}
else {
@@ -5130,7 +5281,7 @@ private ExpressionContext expression(int _p) throws RecognitionException {
_errHandler.reportMatch(this);
consume();
}
- setState(923);
+ setState(952);
expression(12);
}
break;
@@ -5138,9 +5289,9 @@ private ExpressionContext expression(int _p) throws RecognitionException {
{
_localctx = new P42ExprContext(new ExpressionContext(_parentctx, _parentState));
pushNewRecursionContext(_localctx, _startState, RULE_expression);
- setState(924);
+ setState(953);
if (!(precpred(_ctx, 10))) throw new FailedPredicateException(this, "precpred(_ctx, 10)");
- setState(925);
+ setState(954);
((P42ExprContext)_localctx).p42_op = _input.LT(1);
_la = _input.LA(1);
if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << UNION) | (1L << INTERSECTION) | (1L << SETMINUS))) != 0)) ) {
@@ -5151,7 +5302,7 @@ private ExpressionContext expression(int _p) throws RecognitionException {
_errHandler.reportMatch(this);
consume();
}
- setState(926);
+ setState(955);
expression(11);
}
break;
@@ -5159,9 +5310,9 @@ private ExpressionContext expression(int _p) throws RecognitionException {
{
_localctx = new P41ExprContext(new ExpressionContext(_parentctx, _parentState));
pushNewRecursionContext(_localctx, _startState, RULE_expression);
- setState(927);
+ setState(956);
if (!(precpred(_ctx, 9))) throw new FailedPredicateException(this, "precpred(_ctx, 9)");
- setState(928);
+ setState(957);
((P41ExprContext)_localctx).p41_op = _input.LT(1);
_la = _input.LA(1);
if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << IN) | (1L << MULTI) | (1L << SUBSET))) != 0)) ) {
@@ -5172,7 +5323,7 @@ private ExpressionContext expression(int _p) throws RecognitionException {
_errHandler.reportMatch(this);
consume();
}
- setState(929);
+ setState(958);
expression(10);
}
break;
@@ -5180,12 +5331,12 @@ private ExpressionContext expression(int _p) throws RecognitionException {
{
_localctx = new RelExprContext(new ExpressionContext(_parentctx, _parentState));
pushNewRecursionContext(_localctx, _startState, RULE_expression);
- setState(930);
+ setState(959);
if (!(precpred(_ctx, 8))) throw new FailedPredicateException(this, "precpred(_ctx, 8)");
- setState(931);
+ setState(960);
((RelExprContext)_localctx).rel_op = _input.LT(1);
_la = _input.LA(1);
- if ( !(((((_la - 69)) & ~0x3f) == 0 && ((1L << (_la - 69)) & ((1L << (GHOST_EQUALS - 69)) | (1L << (GHOST_NOT_EQUALS - 69)) | (1L << (EQUALS - 69)) | (1L << (NOT_EQUALS - 69)) | (1L << (LESS - 69)) | (1L << (LESS_OR_EQUALS - 69)) | (1L << (GREATER - 69)) | (1L << (GREATER_OR_EQUALS - 69)))) != 0)) ) {
+ if ( !(((((_la - 70)) & ~0x3f) == 0 && ((1L << (_la - 70)) & ((1L << (GHOST_EQUALS - 70)) | (1L << (GHOST_NOT_EQUALS - 70)) | (1L << (EQUALS - 70)) | (1L << (NOT_EQUALS - 70)) | (1L << (LESS - 70)) | (1L << (LESS_OR_EQUALS - 70)) | (1L << (GREATER - 70)) | (1L << (GREATER_OR_EQUALS - 70)))) != 0)) ) {
((RelExprContext)_localctx).rel_op = (Token)_errHandler.recoverInline(this);
}
else {
@@ -5193,7 +5344,7 @@ private ExpressionContext expression(int _p) throws RecognitionException {
_errHandler.reportMatch(this);
consume();
}
- setState(932);
+ setState(961);
expression(9);
}
break;
@@ -5201,11 +5352,11 @@ private ExpressionContext expression(int _p) throws RecognitionException {
{
_localctx = new AndExprContext(new ExpressionContext(_parentctx, _parentState));
pushNewRecursionContext(_localctx, _startState, RULE_expression);
- setState(933);
+ setState(962);
if (!(precpred(_ctx, 6))) throw new FailedPredicateException(this, "precpred(_ctx, 6)");
- setState(934);
+ setState(963);
match(LOGICAL_AND);
- setState(935);
+ setState(964);
expression(7);
}
break;
@@ -5213,11 +5364,11 @@ private ExpressionContext expression(int _p) throws RecognitionException {
{
_localctx = new OrExprContext(new ExpressionContext(_parentctx, _parentState));
pushNewRecursionContext(_localctx, _startState, RULE_expression);
- setState(936);
+ setState(965);
if (!(precpred(_ctx, 5))) throw new FailedPredicateException(this, "precpred(_ctx, 5)");
- setState(937);
+ setState(966);
match(LOGICAL_OR);
- setState(938);
+ setState(967);
expression(6);
}
break;
@@ -5225,11 +5376,11 @@ private ExpressionContext expression(int _p) throws RecognitionException {
{
_localctx = new ImplicationContext(new ExpressionContext(_parentctx, _parentState));
pushNewRecursionContext(_localctx, _startState, RULE_expression);
- setState(939);
+ setState(968);
if (!(precpred(_ctx, 4))) throw new FailedPredicateException(this, "precpred(_ctx, 4)");
- setState(940);
+ setState(969);
match(IMPLIES);
- setState(941);
+ setState(970);
expression(4);
}
break;
@@ -5237,15 +5388,15 @@ private ExpressionContext expression(int _p) throws RecognitionException {
{
_localctx = new TernaryExprContext(new ExpressionContext(_parentctx, _parentState));
pushNewRecursionContext(_localctx, _startState, RULE_expression);
- setState(942);
+ setState(971);
if (!(precpred(_ctx, 3))) throw new FailedPredicateException(this, "precpred(_ctx, 3)");
- setState(943);
+ setState(972);
match(QMARK);
- setState(944);
+ setState(973);
expression(0);
- setState(945);
+ setState(974);
match(COLON);
- setState(946);
+ setState(975);
expression(3);
}
break;
@@ -5253,20 +5404,20 @@ private ExpressionContext expression(int _p) throws RecognitionException {
{
_localctx = new ClosureImplSpecExprContext(new ExpressionContext(_parentctx, _parentState));
pushNewRecursionContext(_localctx, _startState, RULE_expression);
- setState(948);
+ setState(977);
if (!(precpred(_ctx, 7))) throw new FailedPredicateException(this, "precpred(_ctx, 7)");
- setState(949);
+ setState(978);
match(IMPL);
- setState(950);
+ setState(979);
closureSpecInstance();
}
break;
}
}
}
- setState(955);
+ setState(984);
_errHandler.sync(this);
- _alt = getInterpreter().adaptivePredict(_input,69,_ctx);
+ _alt = getInterpreter().adaptivePredict(_input,71,_ctx);
}
}
}
@@ -5355,148 +5506,148 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final StatementContext statement() throws RecognitionException {
StatementContext _localctx = new StatementContext(_ctx, getState());
- enterRule(_localctx, 146, RULE_statement);
+ enterRule(_localctx, 150, RULE_statement);
try {
- setState(976);
+ setState(1005);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,70,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,72,_ctx) ) {
case 1:
enterOuterAlt(_localctx, 1);
{
- setState(956);
+ setState(985);
ghostStatement();
}
break;
case 2:
enterOuterAlt(_localctx, 2);
{
- setState(957);
+ setState(986);
auxiliaryStatement();
}
break;
case 3:
enterOuterAlt(_localctx, 3);
{
- setState(958);
+ setState(987);
packageStmt();
}
break;
case 4:
enterOuterAlt(_localctx, 4);
{
- setState(959);
+ setState(988);
applyStmt();
}
break;
case 5:
enterOuterAlt(_localctx, 5);
{
- setState(960);
+ setState(989);
declaration();
}
break;
case 6:
enterOuterAlt(_localctx, 6);
{
- setState(961);
+ setState(990);
labeledStmt();
}
break;
case 7:
enterOuterAlt(_localctx, 7);
{
- setState(962);
+ setState(991);
simpleStmt();
}
break;
case 8:
enterOuterAlt(_localctx, 8);
{
- setState(963);
+ setState(992);
goStmt();
}
break;
case 9:
enterOuterAlt(_localctx, 9);
{
- setState(964);
+ setState(993);
returnStmt();
}
break;
case 10:
enterOuterAlt(_localctx, 10);
{
- setState(965);
+ setState(994);
breakStmt();
}
break;
case 11:
enterOuterAlt(_localctx, 11);
{
- setState(966);
+ setState(995);
continueStmt();
}
break;
case 12:
enterOuterAlt(_localctx, 12);
{
- setState(967);
+ setState(996);
gotoStmt();
}
break;
case 13:
enterOuterAlt(_localctx, 13);
{
- setState(968);
+ setState(997);
fallthroughStmt();
}
break;
case 14:
enterOuterAlt(_localctx, 14);
{
- setState(969);
+ setState(998);
block();
}
break;
case 15:
enterOuterAlt(_localctx, 15);
{
- setState(970);
+ setState(999);
ifStmt();
}
break;
case 16:
enterOuterAlt(_localctx, 16);
{
- setState(971);
+ setState(1000);
switchStmt();
}
break;
case 17:
enterOuterAlt(_localctx, 17);
{
- setState(972);
+ setState(1001);
selectStmt();
}
break;
case 18:
enterOuterAlt(_localctx, 18);
{
- setState(973);
+ setState(1002);
specForStmt();
}
break;
case 19:
enterOuterAlt(_localctx, 19);
{
- setState(974);
+ setState(1003);
deferStmt();
}
break;
case 20:
enterOuterAlt(_localctx, 20);
{
- setState(975);
+ setState(1004);
closureImplProofStmt();
}
break;
@@ -5531,13 +5682,13 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final ApplyStmtContext applyStmt() throws RecognitionException {
ApplyStmtContext _localctx = new ApplyStmtContext(_ctx, getState());
- enterRule(_localctx, 148, RULE_applyStmt);
+ enterRule(_localctx, 152, RULE_applyStmt);
try {
enterOuterAlt(_localctx, 1);
{
- setState(978);
+ setState(1007);
match(APPLY);
- setState(979);
+ setState(1008);
expression(0);
}
}
@@ -5573,20 +5724,20 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final PackageStmtContext packageStmt() throws RecognitionException {
PackageStmtContext _localctx = new PackageStmtContext(_ctx, getState());
- enterRule(_localctx, 150, RULE_packageStmt);
+ enterRule(_localctx, 154, RULE_packageStmt);
try {
enterOuterAlt(_localctx, 1);
{
- setState(981);
+ setState(1010);
match(PACKAGE);
- setState(982);
+ setState(1011);
expression(0);
- setState(984);
+ setState(1013);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,71,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,73,_ctx) ) {
case 1:
{
- setState(983);
+ setState(1012);
block();
}
break;
@@ -5624,13 +5775,13 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final SpecForStmtContext specForStmt() throws RecognitionException {
SpecForStmtContext _localctx = new SpecForStmtContext(_ctx, getState());
- enterRule(_localctx, 152, RULE_specForStmt);
+ enterRule(_localctx, 156, RULE_specForStmt);
try {
enterOuterAlt(_localctx, 1);
{
- setState(986);
+ setState(1015);
loopSpec();
- setState(987);
+ setState(1016);
forStmt();
}
}
@@ -5679,39 +5830,39 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final LoopSpecContext loopSpec() throws RecognitionException {
LoopSpecContext _localctx = new LoopSpecContext(_ctx, getState());
- enterRule(_localctx, 154, RULE_loopSpec);
+ enterRule(_localctx, 158, RULE_loopSpec);
int _la;
try {
enterOuterAlt(_localctx, 1);
{
- setState(995);
+ setState(1024);
_errHandler.sync(this);
_la = _input.LA(1);
while (_la==INV) {
{
{
- setState(989);
+ setState(1018);
match(INV);
- setState(990);
+ setState(1019);
expression(0);
- setState(991);
+ setState(1020);
eos();
}
}
- setState(997);
+ setState(1026);
_errHandler.sync(this);
_la = _input.LA(1);
}
- setState(1002);
+ setState(1031);
_errHandler.sync(this);
_la = _input.LA(1);
if (_la==DEC) {
{
- setState(998);
+ setState(1027);
match(DEC);
- setState(999);
+ setState(1028);
terminationMeasure();
- setState(1000);
+ setState(1029);
eos();
}
}
@@ -5753,27 +5904,27 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final DeferStmtContext deferStmt() throws RecognitionException {
DeferStmtContext _localctx = new DeferStmtContext(_ctx, getState());
- enterRule(_localctx, 156, RULE_deferStmt);
+ enterRule(_localctx, 160, RULE_deferStmt);
int _la;
try {
- setState(1009);
+ setState(1038);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,74,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,76,_ctx) ) {
case 1:
enterOuterAlt(_localctx, 1);
{
- setState(1004);
+ setState(1033);
match(DEFER);
- setState(1005);
+ setState(1034);
expression(0);
}
break;
case 2:
enterOuterAlt(_localctx, 2);
{
- setState(1006);
+ setState(1035);
match(DEFER);
- setState(1007);
+ setState(1036);
((DeferStmtContext)_localctx).fold_stmt = _input.LT(1);
_la = _input.LA(1);
if ( !(_la==FOLD || _la==UNFOLD) ) {
@@ -5784,7 +5935,7 @@ public final DeferStmtContext deferStmt() throws RecognitionException {
_errHandler.reportMatch(this);
consume();
}
- setState(1008);
+ setState(1037);
predicateAccess();
}
break;
@@ -5827,64 +5978,64 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final BasicLitContext basicLit() throws RecognitionException {
BasicLitContext _localctx = new BasicLitContext(_ctx, getState());
- enterRule(_localctx, 158, RULE_basicLit);
+ enterRule(_localctx, 162, RULE_basicLit);
try {
- setState(1019);
+ setState(1048);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,75,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,77,_ctx) ) {
case 1:
enterOuterAlt(_localctx, 1);
{
- setState(1011);
+ setState(1040);
match(TRUE);
}
break;
case 2:
enterOuterAlt(_localctx, 2);
{
- setState(1012);
+ setState(1041);
match(FALSE);
}
break;
case 3:
enterOuterAlt(_localctx, 3);
{
- setState(1013);
+ setState(1042);
match(NIL_LIT);
}
break;
case 4:
enterOuterAlt(_localctx, 4);
{
- setState(1014);
+ setState(1043);
integer();
}
break;
case 5:
enterOuterAlt(_localctx, 5);
{
- setState(1015);
+ setState(1044);
string_();
}
break;
case 6:
enterOuterAlt(_localctx, 6);
{
- setState(1016);
+ setState(1045);
match(FLOAT_LIT);
}
break;
case 7:
enterOuterAlt(_localctx, 7);
{
- setState(1017);
+ setState(1046);
match(IMAGINARY_LIT);
}
break;
case 8:
enterOuterAlt(_localctx, 8);
{
- setState(1018);
+ setState(1047);
match(RUNE_LIT);
}
break;
@@ -6121,23 +6272,23 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException {
int _parentState = getState();
PrimaryExprContext _localctx = new PrimaryExprContext(_ctx, _parentState);
PrimaryExprContext _prevctx = _localctx;
- int _startState = 160;
- enterRecursionRule(_localctx, 160, RULE_primaryExpr, _p);
+ int _startState = 164;
+ enterRecursionRule(_localctx, 164, RULE_primaryExpr, _p);
int _la;
try {
int _alt;
enterOuterAlt(_localctx, 1);
{
- setState(1033);
+ setState(1062);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,76,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,78,_ctx) ) {
case 1:
{
_localctx = new OperandPrimaryExprContext(_localctx);
_ctx = _localctx;
_prevctx = _localctx;
- setState(1022);
+ setState(1051);
operand();
}
break;
@@ -6146,7 +6297,7 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException {
_localctx = new ConversionPrimaryExprContext(_localctx);
_ctx = _localctx;
_prevctx = _localctx;
- setState(1023);
+ setState(1052);
conversion();
}
break;
@@ -6155,7 +6306,7 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException {
_localctx = new MethodPrimaryExprContext(_localctx);
_ctx = _localctx;
_prevctx = _localctx;
- setState(1024);
+ setState(1053);
methodExpr();
}
break;
@@ -6164,7 +6315,7 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException {
_localctx = new GhostPrimaryExpr_Context(_localctx);
_ctx = _localctx;
_prevctx = _localctx;
- setState(1025);
+ setState(1054);
ghostPrimaryExpr();
}
break;
@@ -6173,7 +6324,7 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException {
_localctx = new NewExprContext(_localctx);
_ctx = _localctx;
_prevctx = _localctx;
- setState(1026);
+ setState(1055);
new_();
}
break;
@@ -6182,7 +6333,7 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException {
_localctx = new MakeExprContext(_localctx);
_ctx = _localctx;
_prevctx = _localctx;
- setState(1027);
+ setState(1056);
make();
}
break;
@@ -6191,7 +6342,7 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException {
_localctx = new BuiltInCallExprContext(_localctx);
_ctx = _localctx;
_prevctx = _localctx;
- setState(1028);
+ setState(1057);
((BuiltInCallExprContext)_localctx).call_op = _input.LT(1);
_la = _input.LA(1);
if ( !(((((_la - 44)) & ~0x3f) == 0 && ((1L << (_la - 44)) & ((1L << (LEN - 44)) | (1L << (CAP - 44)) | (1L << (DOM - 44)) | (1L << (RANGE - 44)))) != 0)) ) {
@@ -6202,36 +6353,36 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException {
_errHandler.reportMatch(this);
consume();
}
- setState(1029);
+ setState(1058);
match(L_PAREN);
- setState(1030);
+ setState(1059);
expression(0);
- setState(1031);
+ setState(1060);
match(R_PAREN);
}
break;
}
_ctx.stop = _input.LT(-1);
- setState(1057);
+ setState(1086);
_errHandler.sync(this);
- _alt = getInterpreter().adaptivePredict(_input,78,_ctx);
+ _alt = getInterpreter().adaptivePredict(_input,80,_ctx);
while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) {
if ( _alt==1 ) {
if ( _parseListeners!=null ) triggerExitRuleEvent();
_prevctx = _localctx;
{
- setState(1055);
+ setState(1084);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,77,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,79,_ctx) ) {
case 1:
{
_localctx = new SelectorPrimaryExprContext(new PrimaryExprContext(_parentctx, _parentState));
pushNewRecursionContext(_localctx, _startState, RULE_primaryExpr);
- setState(1035);
+ setState(1064);
if (!(precpred(_ctx, 9))) throw new FailedPredicateException(this, "precpred(_ctx, 9)");
- setState(1036);
+ setState(1065);
match(DOT);
- setState(1037);
+ setState(1066);
match(IDENTIFIER);
}
break;
@@ -6239,9 +6390,9 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException {
{
_localctx = new IndexPrimaryExprContext(new PrimaryExprContext(_parentctx, _parentState));
pushNewRecursionContext(_localctx, _startState, RULE_primaryExpr);
- setState(1038);
+ setState(1067);
if (!(precpred(_ctx, 8))) throw new FailedPredicateException(this, "precpred(_ctx, 8)");
- setState(1039);
+ setState(1068);
index();
}
break;
@@ -6249,9 +6400,9 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException {
{
_localctx = new SlicePrimaryExprContext(new PrimaryExprContext(_parentctx, _parentState));
pushNewRecursionContext(_localctx, _startState, RULE_primaryExpr);
- setState(1040);
+ setState(1069);
if (!(precpred(_ctx, 7))) throw new FailedPredicateException(this, "precpred(_ctx, 7)");
- setState(1041);
+ setState(1070);
slice_();
}
break;
@@ -6259,9 +6410,9 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException {
{
_localctx = new SeqUpdPrimaryExprContext(new PrimaryExprContext(_parentctx, _parentState));
pushNewRecursionContext(_localctx, _startState, RULE_primaryExpr);
- setState(1042);
+ setState(1071);
if (!(precpred(_ctx, 6))) throw new FailedPredicateException(this, "precpred(_ctx, 6)");
- setState(1043);
+ setState(1072);
seqUpdExp();
}
break;
@@ -6269,9 +6420,9 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException {
{
_localctx = new TypeAssertionPrimaryExprContext(new PrimaryExprContext(_parentctx, _parentState));
pushNewRecursionContext(_localctx, _startState, RULE_primaryExpr);
- setState(1044);
+ setState(1073);
if (!(precpred(_ctx, 5))) throw new FailedPredicateException(this, "precpred(_ctx, 5)");
- setState(1045);
+ setState(1074);
typeAssertion();
}
break;
@@ -6279,9 +6430,9 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException {
{
_localctx = new InvokePrimaryExprContext(new PrimaryExprContext(_parentctx, _parentState));
pushNewRecursionContext(_localctx, _startState, RULE_primaryExpr);
- setState(1046);
+ setState(1075);
if (!(precpred(_ctx, 4))) throw new FailedPredicateException(this, "precpred(_ctx, 4)");
- setState(1047);
+ setState(1076);
arguments();
}
break;
@@ -6289,13 +6440,13 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException {
{
_localctx = new InvokePrimaryExprWithSpecContext(new PrimaryExprContext(_parentctx, _parentState));
pushNewRecursionContext(_localctx, _startState, RULE_primaryExpr);
- setState(1048);
+ setState(1077);
if (!(precpred(_ctx, 3))) throw new FailedPredicateException(this, "precpred(_ctx, 3)");
- setState(1049);
+ setState(1078);
arguments();
- setState(1050);
+ setState(1079);
match(AS);
- setState(1051);
+ setState(1080);
closureSpecInstance();
}
break;
@@ -6303,18 +6454,18 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException {
{
_localctx = new PredConstrPrimaryExprContext(new PrimaryExprContext(_parentctx, _parentState));
pushNewRecursionContext(_localctx, _startState, RULE_primaryExpr);
- setState(1053);
+ setState(1082);
if (!(precpred(_ctx, 2))) throw new FailedPredicateException(this, "precpred(_ctx, 2)");
- setState(1054);
+ setState(1083);
predConstructArgs();
}
break;
}
}
}
- setState(1059);
+ setState(1088);
_errHandler.sync(this);
- _alt = getInterpreter().adaptivePredict(_input,78,_ctx);
+ _alt = getInterpreter().adaptivePredict(_input,80,_ctx);
}
}
}
@@ -6350,13 +6501,13 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final FunctionLitContext functionLit() throws RecognitionException {
FunctionLitContext _localctx = new FunctionLitContext(_ctx, getState());
- enterRule(_localctx, 162, RULE_functionLit);
+ enterRule(_localctx, 166, RULE_functionLit);
try {
enterOuterAlt(_localctx, 1);
{
- setState(1060);
+ setState(1089);
((FunctionLitContext)_localctx).specification = specification();
- setState(1061);
+ setState(1090);
closureDecl(((FunctionLitContext)_localctx).specification.trusted, ((FunctionLitContext)_localctx).specification.pure);
}
}
@@ -6398,32 +6549,32 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final ClosureDeclContext closureDecl(boolean trusted,boolean pure) throws RecognitionException {
ClosureDeclContext _localctx = new ClosureDeclContext(_ctx, getState(), trusted, pure);
- enterRule(_localctx, 164, RULE_closureDecl);
+ enterRule(_localctx, 168, RULE_closureDecl);
int _la;
try {
enterOuterAlt(_localctx, 1);
{
- setState(1063);
+ setState(1092);
match(FUNC);
- setState(1065);
+ setState(1094);
_errHandler.sync(this);
_la = _input.LA(1);
if (_la==IDENTIFIER) {
{
- setState(1064);
+ setState(1093);
match(IDENTIFIER);
}
}
{
- setState(1067);
+ setState(1096);
signature();
- setState(1069);
+ setState(1098);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,80,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,82,_ctx) ) {
case 1:
{
- setState(1068);
+ setState(1097);
blockWithBodyParameterInfo();
}
break;
@@ -6462,34 +6613,34 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final PredConstructArgsContext predConstructArgs() throws RecognitionException {
PredConstructArgsContext _localctx = new PredConstructArgsContext(_ctx, getState());
- enterRule(_localctx, 166, RULE_predConstructArgs);
+ enterRule(_localctx, 170, RULE_predConstructArgs);
int _la;
try {
enterOuterAlt(_localctx, 1);
{
- setState(1071);
+ setState(1100);
match(L_PRED);
- setState(1073);
+ setState(1102);
_errHandler.sync(this);
_la = _input.LA(1);
- if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FLOAT_LIT) | (1L << TRUE) | (1L << FALSE) | (1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << OLD) | (1L << BEFORE) | (1L << FORALL) | (1L << EXISTS) | (1L << ACCESS) | (1L << UNFOLDING) | (1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << LEN) | (1L << NEW) | (1L << MAKE) | (1L << CAP) | (1L << SOME) | (1L << GET) | (1L << DOM) | (1L << NONE) | (1L << PRED) | (1L << TYPE_OF) | (1L << IS_COMPARABLE) | (1L << WRITEPERM) | (1L << NOPERM))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (TRUSTED - 64)) | (1L << (FUNC - 64)) | (1L << (INTERFACE - 64)) | (1L << (MAP - 64)) | (1L << (STRUCT - 64)) | (1L << (CHAN - 64)) | (1L << (RANGE - 64)) | (1L << (TYPE - 64)) | (1L << (NIL_LIT - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (L_PAREN - 64)) | (1L << (L_BRACKET - 64)))) != 0) || ((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & ((1L << (EXCLAMATION - 128)) | (1L << (PLUS - 128)) | (1L << (MINUS - 128)) | (1L << (CARET - 128)) | (1L << (STAR - 128)) | (1L << (AMPERSAND - 128)) | (1L << (RECEIVE - 128)) | (1L << (DECIMAL_LIT - 128)) | (1L << (BINARY_LIT - 128)) | (1L << (OCTAL_LIT - 128)) | (1L << (HEX_LIT - 128)) | (1L << (IMAGINARY_LIT - 128)) | (1L << (RUNE_LIT - 128)) | (1L << (RAW_STRING_LIT - 128)) | (1L << (INTERPRETED_STRING_LIT - 128)))) != 0)) {
+ if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FLOAT_LIT) | (1L << TRUE) | (1L << FALSE) | (1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << OLD) | (1L << BEFORE) | (1L << FORALL) | (1L << EXISTS) | (1L << ACCESS) | (1L << UNFOLDING) | (1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << LEN) | (1L << NEW) | (1L << MAKE) | (1L << CAP) | (1L << SOME) | (1L << GET) | (1L << DOM) | (1L << ADT) | (1L << NONE) | (1L << PRED) | (1L << TYPE_OF) | (1L << IS_COMPARABLE) | (1L << WRITEPERM))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (NOPERM - 64)) | (1L << (TRUSTED - 64)) | (1L << (FUNC - 64)) | (1L << (INTERFACE - 64)) | (1L << (MAP - 64)) | (1L << (STRUCT - 64)) | (1L << (CHAN - 64)) | (1L << (RANGE - 64)) | (1L << (TYPE - 64)) | (1L << (NIL_LIT - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (L_PAREN - 64)) | (1L << (L_BRACKET - 64)))) != 0) || ((((_la - 129)) & ~0x3f) == 0 && ((1L << (_la - 129)) & ((1L << (EXCLAMATION - 129)) | (1L << (PLUS - 129)) | (1L << (MINUS - 129)) | (1L << (CARET - 129)) | (1L << (STAR - 129)) | (1L << (AMPERSAND - 129)) | (1L << (RECEIVE - 129)) | (1L << (DECIMAL_LIT - 129)) | (1L << (BINARY_LIT - 129)) | (1L << (OCTAL_LIT - 129)) | (1L << (HEX_LIT - 129)) | (1L << (IMAGINARY_LIT - 129)) | (1L << (RUNE_LIT - 129)) | (1L << (RAW_STRING_LIT - 129)) | (1L << (INTERPRETED_STRING_LIT - 129)))) != 0)) {
{
- setState(1072);
+ setState(1101);
expressionList();
}
}
- setState(1076);
+ setState(1105);
_errHandler.sync(this);
_la = _input.LA(1);
if (_la==COMMA) {
{
- setState(1075);
+ setState(1104);
match(COMMA);
}
}
- setState(1078);
+ setState(1107);
match(R_PRED);
}
}
@@ -6545,52 +6696,52 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final InterfaceTypeContext interfaceType() throws RecognitionException {
InterfaceTypeContext _localctx = new InterfaceTypeContext(_ctx, getState());
- enterRule(_localctx, 168, RULE_interfaceType);
+ enterRule(_localctx, 172, RULE_interfaceType);
int _la;
try {
enterOuterAlt(_localctx, 1);
{
- setState(1080);
+ setState(1109);
match(INTERFACE);
- setState(1081);
+ setState(1110);
match(L_CURLY);
- setState(1091);
+ setState(1120);
_errHandler.sync(this);
_la = _input.LA(1);
while ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << GHOST) | (1L << PRED))) != 0) || _la==TRUSTED || _la==IDENTIFIER) {
{
{
- setState(1085);
+ setState(1114);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,83,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,85,_ctx) ) {
case 1:
{
- setState(1082);
+ setState(1111);
methodSpec();
}
break;
case 2:
{
- setState(1083);
+ setState(1112);
typeName();
}
break;
case 3:
{
- setState(1084);
+ setState(1113);
predicateSpec();
}
break;
}
- setState(1087);
+ setState(1116);
eos();
}
}
- setState(1093);
+ setState(1122);
_errHandler.sync(this);
_la = _input.LA(1);
}
- setState(1094);
+ setState(1123);
match(R_CURLY);
}
}
@@ -6624,15 +6775,15 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final PredicateSpecContext predicateSpec() throws RecognitionException {
PredicateSpecContext _localctx = new PredicateSpecContext(_ctx, getState());
- enterRule(_localctx, 170, RULE_predicateSpec);
+ enterRule(_localctx, 174, RULE_predicateSpec);
try {
enterOuterAlt(_localctx, 1);
{
- setState(1096);
+ setState(1125);
match(PRED);
- setState(1097);
+ setState(1126);
match(IDENTIFIER);
- setState(1098);
+ setState(1127);
parameters();
}
}
@@ -6672,53 +6823,53 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final MethodSpecContext methodSpec() throws RecognitionException {
MethodSpecContext _localctx = new MethodSpecContext(_ctx, getState());
- enterRule(_localctx, 172, RULE_methodSpec);
+ enterRule(_localctx, 176, RULE_methodSpec);
int _la;
try {
- setState(1115);
+ setState(1144);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,87,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,89,_ctx) ) {
case 1:
enterOuterAlt(_localctx, 1);
{
- setState(1101);
+ setState(1130);
_errHandler.sync(this);
_la = _input.LA(1);
if (_la==GHOST) {
{
- setState(1100);
+ setState(1129);
match(GHOST);
}
}
- setState(1103);
+ setState(1132);
specification();
- setState(1104);
+ setState(1133);
match(IDENTIFIER);
- setState(1105);
+ setState(1134);
parameters();
- setState(1106);
+ setState(1135);
result();
}
break;
case 2:
enterOuterAlt(_localctx, 2);
{
- setState(1109);
+ setState(1138);
_errHandler.sync(this);
_la = _input.LA(1);
if (_la==GHOST) {
{
- setState(1108);
+ setState(1137);
match(GHOST);
}
}
- setState(1111);
+ setState(1140);
specification();
- setState(1112);
+ setState(1141);
match(IDENTIFIER);
- setState(1113);
+ setState(1142);
parameters();
}
break;
@@ -6763,15 +6914,15 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final Type_Context type_() throws RecognitionException {
Type_Context _localctx = new Type_Context(_ctx, getState());
- enterRule(_localctx, 174, RULE_type_);
+ enterRule(_localctx, 178, RULE_type_);
try {
- setState(1124);
+ setState(1153);
_errHandler.sync(this);
switch (_input.LA(1)) {
case IDENTIFIER:
enterOuterAlt(_localctx, 1);
{
- setState(1117);
+ setState(1146);
typeName();
}
break;
@@ -6786,7 +6937,7 @@ public final Type_Context type_() throws RecognitionException {
case RECEIVE:
enterOuterAlt(_localctx, 2);
{
- setState(1118);
+ setState(1147);
typeLit();
}
break;
@@ -6797,20 +6948,21 @@ public final Type_Context type_() throws RecognitionException {
case DICT:
case OPT:
case DOM:
+ case ADT:
enterOuterAlt(_localctx, 3);
{
- setState(1119);
+ setState(1148);
ghostTypeLit();
}
break;
case L_PAREN:
enterOuterAlt(_localctx, 4);
{
- setState(1120);
+ setState(1149);
match(L_PAREN);
- setState(1121);
+ setState(1150);
type_();
- setState(1122);
+ setState(1151);
match(R_PAREN);
}
break;
@@ -6870,71 +7022,71 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final TypeLitContext typeLit() throws RecognitionException {
TypeLitContext _localctx = new TypeLitContext(_ctx, getState());
- enterRule(_localctx, 176, RULE_typeLit);
+ enterRule(_localctx, 180, RULE_typeLit);
try {
- setState(1135);
+ setState(1164);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,89,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,91,_ctx) ) {
case 1:
enterOuterAlt(_localctx, 1);
{
- setState(1126);
+ setState(1155);
arrayType();
}
break;
case 2:
enterOuterAlt(_localctx, 2);
{
- setState(1127);
+ setState(1156);
structType();
}
break;
case 3:
enterOuterAlt(_localctx, 3);
{
- setState(1128);
+ setState(1157);
pointerType();
}
break;
case 4:
enterOuterAlt(_localctx, 4);
{
- setState(1129);
+ setState(1158);
functionType();
}
break;
case 5:
enterOuterAlt(_localctx, 5);
{
- setState(1130);
+ setState(1159);
interfaceType();
}
break;
case 6:
enterOuterAlt(_localctx, 6);
{
- setState(1131);
+ setState(1160);
sliceType();
}
break;
case 7:
enterOuterAlt(_localctx, 7);
{
- setState(1132);
+ setState(1161);
mapType();
}
break;
case 8:
enterOuterAlt(_localctx, 8);
{
- setState(1133);
+ setState(1162);
channelType();
}
break;
case 9:
enterOuterAlt(_localctx, 9);
{
- setState(1134);
+ setState(1163);
predType();
}
break;
@@ -6969,13 +7121,13 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final PredTypeContext predType() throws RecognitionException {
PredTypeContext _localctx = new PredTypeContext(_ctx, getState());
- enterRule(_localctx, 178, RULE_predType);
+ enterRule(_localctx, 182, RULE_predType);
try {
enterOuterAlt(_localctx, 1);
{
- setState(1137);
+ setState(1166);
match(PRED);
- setState(1138);
+ setState(1167);
predTypeParams();
}
}
@@ -7016,45 +7168,45 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final PredTypeParamsContext predTypeParams() throws RecognitionException {
PredTypeParamsContext _localctx = new PredTypeParamsContext(_ctx, getState());
- enterRule(_localctx, 180, RULE_predTypeParams);
+ enterRule(_localctx, 184, RULE_predTypeParams);
int _la;
try {
int _alt;
enterOuterAlt(_localctx, 1);
{
- setState(1140);
+ setState(1169);
match(L_PAREN);
- setState(1152);
+ setState(1181);
_errHandler.sync(this);
_la = _input.LA(1);
- if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << DOM) | (1L << PRED))) != 0) || ((((_la - 74)) & ~0x3f) == 0 && ((1L << (_la - 74)) & ((1L << (FUNC - 74)) | (1L << (INTERFACE - 74)) | (1L << (MAP - 74)) | (1L << (STRUCT - 74)) | (1L << (CHAN - 74)) | (1L << (IDENTIFIER - 74)) | (1L << (L_PAREN - 74)) | (1L << (L_BRACKET - 74)) | (1L << (STAR - 74)) | (1L << (RECEIVE - 74)))) != 0)) {
+ if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << DOM) | (1L << ADT) | (1L << PRED))) != 0) || ((((_la - 75)) & ~0x3f) == 0 && ((1L << (_la - 75)) & ((1L << (FUNC - 75)) | (1L << (INTERFACE - 75)) | (1L << (MAP - 75)) | (1L << (STRUCT - 75)) | (1L << (CHAN - 75)) | (1L << (IDENTIFIER - 75)) | (1L << (L_PAREN - 75)) | (1L << (L_BRACKET - 75)) | (1L << (STAR - 75)) | (1L << (RECEIVE - 75)))) != 0)) {
{
- setState(1141);
+ setState(1170);
type_();
- setState(1146);
+ setState(1175);
_errHandler.sync(this);
- _alt = getInterpreter().adaptivePredict(_input,90,_ctx);
+ _alt = getInterpreter().adaptivePredict(_input,92,_ctx);
while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) {
if ( _alt==1 ) {
{
{
- setState(1142);
+ setState(1171);
match(COMMA);
- setState(1143);
+ setState(1172);
type_();
}
}
}
- setState(1148);
+ setState(1177);
_errHandler.sync(this);
- _alt = getInterpreter().adaptivePredict(_input,90,_ctx);
+ _alt = getInterpreter().adaptivePredict(_input,92,_ctx);
}
- setState(1150);
+ setState(1179);
_errHandler.sync(this);
_la = _input.LA(1);
if (_la==COMMA) {
{
- setState(1149);
+ setState(1178);
match(COMMA);
}
}
@@ -7062,7 +7214,7 @@ public final PredTypeParamsContext predTypeParams() throws RecognitionException
}
}
- setState(1154);
+ setState(1183);
match(R_PAREN);
}
}
@@ -7112,57 +7264,57 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final LiteralTypeContext literalType() throws RecognitionException {
LiteralTypeContext _localctx = new LiteralTypeContext(_ctx, getState());
- enterRule(_localctx, 182, RULE_literalType);
+ enterRule(_localctx, 186, RULE_literalType);
try {
- setState(1163);
+ setState(1192);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,93,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,95,_ctx) ) {
case 1:
enterOuterAlt(_localctx, 1);
{
- setState(1156);
+ setState(1185);
structType();
}
break;
case 2:
enterOuterAlt(_localctx, 2);
{
- setState(1157);
+ setState(1186);
arrayType();
}
break;
case 3:
enterOuterAlt(_localctx, 3);
{
- setState(1158);
+ setState(1187);
implicitArray();
}
break;
case 4:
enterOuterAlt(_localctx, 4);
{
- setState(1159);
+ setState(1188);
sliceType();
}
break;
case 5:
enterOuterAlt(_localctx, 5);
{
- setState(1160);
+ setState(1189);
mapType();
}
break;
case 6:
enterOuterAlt(_localctx, 6);
{
- setState(1161);
+ setState(1190);
ghostTypeLit();
}
break;
case 7:
enterOuterAlt(_localctx, 7);
{
- setState(1162);
+ setState(1191);
typeName();
}
break;
@@ -7199,17 +7351,17 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final ImplicitArrayContext implicitArray() throws RecognitionException {
ImplicitArrayContext _localctx = new ImplicitArrayContext(_ctx, getState());
- enterRule(_localctx, 184, RULE_implicitArray);
+ enterRule(_localctx, 188, RULE_implicitArray);
try {
enterOuterAlt(_localctx, 1);
{
- setState(1165);
+ setState(1194);
match(L_BRACKET);
- setState(1166);
+ setState(1195);
match(ELLIPSIS);
- setState(1167);
+ setState(1196);
match(R_BRACKET);
- setState(1168);
+ setState(1197);
elementType();
}
}
@@ -7253,36 +7405,36 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final Slice_Context slice_() throws RecognitionException {
Slice_Context _localctx = new Slice_Context(_ctx, getState());
- enterRule(_localctx, 186, RULE_slice_);
+ enterRule(_localctx, 190, RULE_slice_);
int _la;
try {
enterOuterAlt(_localctx, 1);
{
- setState(1170);
+ setState(1199);
match(L_BRACKET);
- setState(1186);
+ setState(1215);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,97,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,99,_ctx) ) {
case 1:
{
- setState(1172);
+ setState(1201);
_errHandler.sync(this);
_la = _input.LA(1);
- if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FLOAT_LIT) | (1L << TRUE) | (1L << FALSE) | (1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << OLD) | (1L << BEFORE) | (1L << FORALL) | (1L << EXISTS) | (1L << ACCESS) | (1L << UNFOLDING) | (1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << LEN) | (1L << NEW) | (1L << MAKE) | (1L << CAP) | (1L << SOME) | (1L << GET) | (1L << DOM) | (1L << NONE) | (1L << PRED) | (1L << TYPE_OF) | (1L << IS_COMPARABLE) | (1L << WRITEPERM) | (1L << NOPERM))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (TRUSTED - 64)) | (1L << (FUNC - 64)) | (1L << (INTERFACE - 64)) | (1L << (MAP - 64)) | (1L << (STRUCT - 64)) | (1L << (CHAN - 64)) | (1L << (RANGE - 64)) | (1L << (TYPE - 64)) | (1L << (NIL_LIT - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (L_PAREN - 64)) | (1L << (L_BRACKET - 64)))) != 0) || ((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & ((1L << (EXCLAMATION - 128)) | (1L << (PLUS - 128)) | (1L << (MINUS - 128)) | (1L << (CARET - 128)) | (1L << (STAR - 128)) | (1L << (AMPERSAND - 128)) | (1L << (RECEIVE - 128)) | (1L << (DECIMAL_LIT - 128)) | (1L << (BINARY_LIT - 128)) | (1L << (OCTAL_LIT - 128)) | (1L << (HEX_LIT - 128)) | (1L << (IMAGINARY_LIT - 128)) | (1L << (RUNE_LIT - 128)) | (1L << (RAW_STRING_LIT - 128)) | (1L << (INTERPRETED_STRING_LIT - 128)))) != 0)) {
+ if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FLOAT_LIT) | (1L << TRUE) | (1L << FALSE) | (1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << OLD) | (1L << BEFORE) | (1L << FORALL) | (1L << EXISTS) | (1L << ACCESS) | (1L << UNFOLDING) | (1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << LEN) | (1L << NEW) | (1L << MAKE) | (1L << CAP) | (1L << SOME) | (1L << GET) | (1L << DOM) | (1L << ADT) | (1L << NONE) | (1L << PRED) | (1L << TYPE_OF) | (1L << IS_COMPARABLE) | (1L << WRITEPERM))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (NOPERM - 64)) | (1L << (TRUSTED - 64)) | (1L << (FUNC - 64)) | (1L << (INTERFACE - 64)) | (1L << (MAP - 64)) | (1L << (STRUCT - 64)) | (1L << (CHAN - 64)) | (1L << (RANGE - 64)) | (1L << (TYPE - 64)) | (1L << (NIL_LIT - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (L_PAREN - 64)) | (1L << (L_BRACKET - 64)))) != 0) || ((((_la - 129)) & ~0x3f) == 0 && ((1L << (_la - 129)) & ((1L << (EXCLAMATION - 129)) | (1L << (PLUS - 129)) | (1L << (MINUS - 129)) | (1L << (CARET - 129)) | (1L << (STAR - 129)) | (1L << (AMPERSAND - 129)) | (1L << (RECEIVE - 129)) | (1L << (DECIMAL_LIT - 129)) | (1L << (BINARY_LIT - 129)) | (1L << (OCTAL_LIT - 129)) | (1L << (HEX_LIT - 129)) | (1L << (IMAGINARY_LIT - 129)) | (1L << (RUNE_LIT - 129)) | (1L << (RAW_STRING_LIT - 129)) | (1L << (INTERPRETED_STRING_LIT - 129)))) != 0)) {
{
- setState(1171);
+ setState(1200);
low();
}
}
- setState(1174);
+ setState(1203);
match(COLON);
- setState(1176);
+ setState(1205);
_errHandler.sync(this);
_la = _input.LA(1);
- if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FLOAT_LIT) | (1L << TRUE) | (1L << FALSE) | (1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << OLD) | (1L << BEFORE) | (1L << FORALL) | (1L << EXISTS) | (1L << ACCESS) | (1L << UNFOLDING) | (1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << LEN) | (1L << NEW) | (1L << MAKE) | (1L << CAP) | (1L << SOME) | (1L << GET) | (1L << DOM) | (1L << NONE) | (1L << PRED) | (1L << TYPE_OF) | (1L << IS_COMPARABLE) | (1L << WRITEPERM) | (1L << NOPERM))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (TRUSTED - 64)) | (1L << (FUNC - 64)) | (1L << (INTERFACE - 64)) | (1L << (MAP - 64)) | (1L << (STRUCT - 64)) | (1L << (CHAN - 64)) | (1L << (RANGE - 64)) | (1L << (TYPE - 64)) | (1L << (NIL_LIT - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (L_PAREN - 64)) | (1L << (L_BRACKET - 64)))) != 0) || ((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & ((1L << (EXCLAMATION - 128)) | (1L << (PLUS - 128)) | (1L << (MINUS - 128)) | (1L << (CARET - 128)) | (1L << (STAR - 128)) | (1L << (AMPERSAND - 128)) | (1L << (RECEIVE - 128)) | (1L << (DECIMAL_LIT - 128)) | (1L << (BINARY_LIT - 128)) | (1L << (OCTAL_LIT - 128)) | (1L << (HEX_LIT - 128)) | (1L << (IMAGINARY_LIT - 128)) | (1L << (RUNE_LIT - 128)) | (1L << (RAW_STRING_LIT - 128)) | (1L << (INTERPRETED_STRING_LIT - 128)))) != 0)) {
+ if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FLOAT_LIT) | (1L << TRUE) | (1L << FALSE) | (1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << OLD) | (1L << BEFORE) | (1L << FORALL) | (1L << EXISTS) | (1L << ACCESS) | (1L << UNFOLDING) | (1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << LEN) | (1L << NEW) | (1L << MAKE) | (1L << CAP) | (1L << SOME) | (1L << GET) | (1L << DOM) | (1L << ADT) | (1L << NONE) | (1L << PRED) | (1L << TYPE_OF) | (1L << IS_COMPARABLE) | (1L << WRITEPERM))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (NOPERM - 64)) | (1L << (TRUSTED - 64)) | (1L << (FUNC - 64)) | (1L << (INTERFACE - 64)) | (1L << (MAP - 64)) | (1L << (STRUCT - 64)) | (1L << (CHAN - 64)) | (1L << (RANGE - 64)) | (1L << (TYPE - 64)) | (1L << (NIL_LIT - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (L_PAREN - 64)) | (1L << (L_BRACKET - 64)))) != 0) || ((((_la - 129)) & ~0x3f) == 0 && ((1L << (_la - 129)) & ((1L << (EXCLAMATION - 129)) | (1L << (PLUS - 129)) | (1L << (MINUS - 129)) | (1L << (CARET - 129)) | (1L << (STAR - 129)) | (1L << (AMPERSAND - 129)) | (1L << (RECEIVE - 129)) | (1L << (DECIMAL_LIT - 129)) | (1L << (BINARY_LIT - 129)) | (1L << (OCTAL_LIT - 129)) | (1L << (HEX_LIT - 129)) | (1L << (IMAGINARY_LIT - 129)) | (1L << (RUNE_LIT - 129)) | (1L << (RAW_STRING_LIT - 129)) | (1L << (INTERPRETED_STRING_LIT - 129)))) != 0)) {
{
- setState(1175);
+ setState(1204);
high();
}
}
@@ -7291,28 +7443,28 @@ public final Slice_Context slice_() throws RecognitionException {
break;
case 2:
{
- setState(1179);
+ setState(1208);
_errHandler.sync(this);
_la = _input.LA(1);
- if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FLOAT_LIT) | (1L << TRUE) | (1L << FALSE) | (1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << OLD) | (1L << BEFORE) | (1L << FORALL) | (1L << EXISTS) | (1L << ACCESS) | (1L << UNFOLDING) | (1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << LEN) | (1L << NEW) | (1L << MAKE) | (1L << CAP) | (1L << SOME) | (1L << GET) | (1L << DOM) | (1L << NONE) | (1L << PRED) | (1L << TYPE_OF) | (1L << IS_COMPARABLE) | (1L << WRITEPERM) | (1L << NOPERM))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (TRUSTED - 64)) | (1L << (FUNC - 64)) | (1L << (INTERFACE - 64)) | (1L << (MAP - 64)) | (1L << (STRUCT - 64)) | (1L << (CHAN - 64)) | (1L << (RANGE - 64)) | (1L << (TYPE - 64)) | (1L << (NIL_LIT - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (L_PAREN - 64)) | (1L << (L_BRACKET - 64)))) != 0) || ((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & ((1L << (EXCLAMATION - 128)) | (1L << (PLUS - 128)) | (1L << (MINUS - 128)) | (1L << (CARET - 128)) | (1L << (STAR - 128)) | (1L << (AMPERSAND - 128)) | (1L << (RECEIVE - 128)) | (1L << (DECIMAL_LIT - 128)) | (1L << (BINARY_LIT - 128)) | (1L << (OCTAL_LIT - 128)) | (1L << (HEX_LIT - 128)) | (1L << (IMAGINARY_LIT - 128)) | (1L << (RUNE_LIT - 128)) | (1L << (RAW_STRING_LIT - 128)) | (1L << (INTERPRETED_STRING_LIT - 128)))) != 0)) {
+ if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FLOAT_LIT) | (1L << TRUE) | (1L << FALSE) | (1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << OLD) | (1L << BEFORE) | (1L << FORALL) | (1L << EXISTS) | (1L << ACCESS) | (1L << UNFOLDING) | (1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << LEN) | (1L << NEW) | (1L << MAKE) | (1L << CAP) | (1L << SOME) | (1L << GET) | (1L << DOM) | (1L << ADT) | (1L << NONE) | (1L << PRED) | (1L << TYPE_OF) | (1L << IS_COMPARABLE) | (1L << WRITEPERM))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (NOPERM - 64)) | (1L << (TRUSTED - 64)) | (1L << (FUNC - 64)) | (1L << (INTERFACE - 64)) | (1L << (MAP - 64)) | (1L << (STRUCT - 64)) | (1L << (CHAN - 64)) | (1L << (RANGE - 64)) | (1L << (TYPE - 64)) | (1L << (NIL_LIT - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (L_PAREN - 64)) | (1L << (L_BRACKET - 64)))) != 0) || ((((_la - 129)) & ~0x3f) == 0 && ((1L << (_la - 129)) & ((1L << (EXCLAMATION - 129)) | (1L << (PLUS - 129)) | (1L << (MINUS - 129)) | (1L << (CARET - 129)) | (1L << (STAR - 129)) | (1L << (AMPERSAND - 129)) | (1L << (RECEIVE - 129)) | (1L << (DECIMAL_LIT - 129)) | (1L << (BINARY_LIT - 129)) | (1L << (OCTAL_LIT - 129)) | (1L << (HEX_LIT - 129)) | (1L << (IMAGINARY_LIT - 129)) | (1L << (RUNE_LIT - 129)) | (1L << (RAW_STRING_LIT - 129)) | (1L << (INTERPRETED_STRING_LIT - 129)))) != 0)) {
{
- setState(1178);
+ setState(1207);
low();
}
}
- setState(1181);
+ setState(1210);
match(COLON);
- setState(1182);
+ setState(1211);
high();
- setState(1183);
+ setState(1212);
match(COLON);
- setState(1184);
+ setState(1213);
cap();
}
break;
}
- setState(1188);
+ setState(1217);
match(R_BRACKET);
}
}
@@ -7344,11 +7496,11 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final LowContext low() throws RecognitionException {
LowContext _localctx = new LowContext(_ctx, getState());
- enterRule(_localctx, 188, RULE_low);
+ enterRule(_localctx, 192, RULE_low);
try {
enterOuterAlt(_localctx, 1);
{
- setState(1190);
+ setState(1219);
expression(0);
}
}
@@ -7380,11 +7532,11 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final HighContext high() throws RecognitionException {
HighContext _localctx = new HighContext(_ctx, getState());
- enterRule(_localctx, 190, RULE_high);
+ enterRule(_localctx, 194, RULE_high);
try {
enterOuterAlt(_localctx, 1);
{
- setState(1192);
+ setState(1221);
expression(0);
}
}
@@ -7416,11 +7568,11 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final CapContext cap() throws RecognitionException {
CapContext _localctx = new CapContext(_ctx, getState());
- enterRule(_localctx, 192, RULE_cap);
+ enterRule(_localctx, 196, RULE_cap);
try {
enterOuterAlt(_localctx, 1);
{
- setState(1194);
+ setState(1223);
expression(0);
}
}
@@ -7462,20 +7614,20 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final Assign_opContext assign_op() throws RecognitionException {
Assign_opContext _localctx = new Assign_opContext(_ctx, getState());
- enterRule(_localctx, 194, RULE_assign_op);
+ enterRule(_localctx, 198, RULE_assign_op);
int _la;
try {
enterOuterAlt(_localctx, 1);
{
- setState(1197);
+ setState(1226);
_errHandler.sync(this);
_la = _input.LA(1);
- if (((((_la - 122)) & ~0x3f) == 0 && ((1L << (_la - 122)) & ((1L << (OR - 122)) | (1L << (DIV - 122)) | (1L << (MOD - 122)) | (1L << (LSHIFT - 122)) | (1L << (RSHIFT - 122)) | (1L << (BIT_CLEAR - 122)) | (1L << (PLUS - 122)) | (1L << (MINUS - 122)) | (1L << (CARET - 122)) | (1L << (STAR - 122)) | (1L << (AMPERSAND - 122)))) != 0)) {
+ if (((((_la - 123)) & ~0x3f) == 0 && ((1L << (_la - 123)) & ((1L << (OR - 123)) | (1L << (DIV - 123)) | (1L << (MOD - 123)) | (1L << (LSHIFT - 123)) | (1L << (RSHIFT - 123)) | (1L << (BIT_CLEAR - 123)) | (1L << (PLUS - 123)) | (1L << (MINUS - 123)) | (1L << (CARET - 123)) | (1L << (STAR - 123)) | (1L << (AMPERSAND - 123)))) != 0)) {
{
- setState(1196);
+ setState(1225);
((Assign_opContext)_localctx).ass_op = _input.LT(1);
_la = _input.LA(1);
- if ( !(((((_la - 122)) & ~0x3f) == 0 && ((1L << (_la - 122)) & ((1L << (OR - 122)) | (1L << (DIV - 122)) | (1L << (MOD - 122)) | (1L << (LSHIFT - 122)) | (1L << (RSHIFT - 122)) | (1L << (BIT_CLEAR - 122)) | (1L << (PLUS - 122)) | (1L << (MINUS - 122)) | (1L << (CARET - 122)) | (1L << (STAR - 122)) | (1L << (AMPERSAND - 122)))) != 0)) ) {
+ if ( !(((((_la - 123)) & ~0x3f) == 0 && ((1L << (_la - 123)) & ((1L << (OR - 123)) | (1L << (DIV - 123)) | (1L << (MOD - 123)) | (1L << (LSHIFT - 123)) | (1L << (RSHIFT - 123)) | (1L << (BIT_CLEAR - 123)) | (1L << (PLUS - 123)) | (1L << (MINUS - 123)) | (1L << (CARET - 123)) | (1L << (STAR - 123)) | (1L << (AMPERSAND - 123)))) != 0)) ) {
((Assign_opContext)_localctx).ass_op = (Token)_errHandler.recoverInline(this);
}
else {
@@ -7486,7 +7638,7 @@ public final Assign_opContext assign_op() throws RecognitionException {
}
}
- setState(1199);
+ setState(1228);
match(ASSIGN);
}
}
@@ -7529,48 +7681,48 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final RangeClauseContext rangeClause() throws RecognitionException {
RangeClauseContext _localctx = new RangeClauseContext(_ctx, getState());
- enterRule(_localctx, 196, RULE_rangeClause);
+ enterRule(_localctx, 200, RULE_rangeClause);
int _la;
try {
enterOuterAlt(_localctx, 1);
{
- setState(1207);
+ setState(1236);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,99,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,101,_ctx) ) {
case 1:
{
- setState(1201);
+ setState(1230);
expressionList();
- setState(1202);
+ setState(1231);
match(ASSIGN);
}
break;
case 2:
{
- setState(1204);
+ setState(1233);
maybeAddressableIdentifierList();
- setState(1205);
+ setState(1234);
match(DECLARE_ASSIGN);
}
break;
}
- setState(1209);
+ setState(1238);
match(RANGE);
- setState(1210);
+ setState(1239);
expression(0);
- setState(1215);
+ setState(1244);
_errHandler.sync(this);
_la = _input.LA(1);
if (_la==WITH) {
{
- setState(1211);
+ setState(1240);
match(WITH);
- setState(1213);
+ setState(1242);
_errHandler.sync(this);
_la = _input.LA(1);
if (_la==IDENTIFIER) {
{
- setState(1212);
+ setState(1241);
match(IDENTIFIER);
}
}
@@ -7608,13 +7760,13 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final PackageClauseContext packageClause() throws RecognitionException {
PackageClauseContext _localctx = new PackageClauseContext(_ctx, getState());
- enterRule(_localctx, 198, RULE_packageClause);
+ enterRule(_localctx, 202, RULE_packageClause);
try {
enterOuterAlt(_localctx, 1);
{
- setState(1217);
+ setState(1246);
match(PACKAGE);
- setState(1218);
+ setState(1247);
((PackageClauseContext)_localctx).packageName = match(IDENTIFIER);
}
}
@@ -7646,11 +7798,11 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final ImportPathContext importPath() throws RecognitionException {
ImportPathContext _localctx = new ImportPathContext(_ctx, getState());
- enterRule(_localctx, 200, RULE_importPath);
+ enterRule(_localctx, 204, RULE_importPath);
try {
enterOuterAlt(_localctx, 1);
{
- setState(1220);
+ setState(1249);
string_();
}
}
@@ -7688,29 +7840,29 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final DeclarationContext declaration() throws RecognitionException {
DeclarationContext _localctx = new DeclarationContext(_ctx, getState());
- enterRule(_localctx, 202, RULE_declaration);
+ enterRule(_localctx, 206, RULE_declaration);
try {
- setState(1225);
+ setState(1254);
_errHandler.sync(this);
switch (_input.LA(1)) {
case CONST:
enterOuterAlt(_localctx, 1);
{
- setState(1222);
+ setState(1251);
constDecl();
}
break;
case TYPE:
enterOuterAlt(_localctx, 2);
{
- setState(1223);
+ setState(1252);
typeDecl();
}
break;
case VAR:
enterOuterAlt(_localctx, 3);
{
- setState(1224);
+ setState(1253);
varDecl();
}
break;
@@ -7758,43 +7910,43 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final ConstDeclContext constDecl() throws RecognitionException {
ConstDeclContext _localctx = new ConstDeclContext(_ctx, getState());
- enterRule(_localctx, 204, RULE_constDecl);
+ enterRule(_localctx, 208, RULE_constDecl);
int _la;
try {
enterOuterAlt(_localctx, 1);
{
- setState(1227);
+ setState(1256);
match(CONST);
- setState(1239);
+ setState(1268);
_errHandler.sync(this);
switch (_input.LA(1)) {
case IDENTIFIER:
{
- setState(1228);
+ setState(1257);
constSpec();
}
break;
case L_PAREN:
{
- setState(1229);
+ setState(1258);
match(L_PAREN);
- setState(1235);
+ setState(1264);
_errHandler.sync(this);
_la = _input.LA(1);
while (_la==IDENTIFIER) {
{
{
- setState(1230);
+ setState(1259);
constSpec();
- setState(1231);
+ setState(1260);
eos();
}
}
- setState(1237);
+ setState(1266);
_errHandler.sync(this);
_la = _input.LA(1);
}
- setState(1238);
+ setState(1267);
match(R_PAREN);
}
break;
@@ -7838,31 +7990,31 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final ConstSpecContext constSpec() throws RecognitionException {
ConstSpecContext _localctx = new ConstSpecContext(_ctx, getState());
- enterRule(_localctx, 206, RULE_constSpec);
+ enterRule(_localctx, 210, RULE_constSpec);
int _la;
try {
enterOuterAlt(_localctx, 1);
{
- setState(1241);
+ setState(1270);
identifierList();
- setState(1247);
+ setState(1276);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,106,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,108,_ctx) ) {
case 1:
{
- setState(1243);
+ setState(1272);
_errHandler.sync(this);
_la = _input.LA(1);
- if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << DOM) | (1L << PRED))) != 0) || ((((_la - 74)) & ~0x3f) == 0 && ((1L << (_la - 74)) & ((1L << (FUNC - 74)) | (1L << (INTERFACE - 74)) | (1L << (MAP - 74)) | (1L << (STRUCT - 74)) | (1L << (CHAN - 74)) | (1L << (IDENTIFIER - 74)) | (1L << (L_PAREN - 74)) | (1L << (L_BRACKET - 74)) | (1L << (STAR - 74)) | (1L << (RECEIVE - 74)))) != 0)) {
+ if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << DOM) | (1L << ADT) | (1L << PRED))) != 0) || ((((_la - 75)) & ~0x3f) == 0 && ((1L << (_la - 75)) & ((1L << (FUNC - 75)) | (1L << (INTERFACE - 75)) | (1L << (MAP - 75)) | (1L << (STRUCT - 75)) | (1L << (CHAN - 75)) | (1L << (IDENTIFIER - 75)) | (1L << (L_PAREN - 75)) | (1L << (L_BRACKET - 75)) | (1L << (STAR - 75)) | (1L << (RECEIVE - 75)))) != 0)) {
{
- setState(1242);
+ setState(1271);
type_();
}
}
- setState(1245);
+ setState(1274);
match(ASSIGN);
- setState(1246);
+ setState(1275);
expressionList();
}
break;
@@ -7902,30 +8054,30 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final IdentifierListContext identifierList() throws RecognitionException {
IdentifierListContext _localctx = new IdentifierListContext(_ctx, getState());
- enterRule(_localctx, 208, RULE_identifierList);
+ enterRule(_localctx, 212, RULE_identifierList);
try {
int _alt;
enterOuterAlt(_localctx, 1);
{
- setState(1249);
+ setState(1278);
match(IDENTIFIER);
- setState(1254);
+ setState(1283);
_errHandler.sync(this);
- _alt = getInterpreter().adaptivePredict(_input,107,_ctx);
+ _alt = getInterpreter().adaptivePredict(_input,109,_ctx);
while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) {
if ( _alt==1 ) {
{
{
- setState(1250);
+ setState(1279);
match(COMMA);
- setState(1251);
+ setState(1280);
match(IDENTIFIER);
}
}
}
- setState(1256);
+ setState(1285);
_errHandler.sync(this);
- _alt = getInterpreter().adaptivePredict(_input,107,_ctx);
+ _alt = getInterpreter().adaptivePredict(_input,109,_ctx);
}
}
}
@@ -7964,30 +8116,30 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final ExpressionListContext expressionList() throws RecognitionException {
ExpressionListContext _localctx = new ExpressionListContext(_ctx, getState());
- enterRule(_localctx, 210, RULE_expressionList);
+ enterRule(_localctx, 214, RULE_expressionList);
try {
int _alt;
enterOuterAlt(_localctx, 1);
{
- setState(1257);
+ setState(1286);
expression(0);
- setState(1262);
+ setState(1291);
_errHandler.sync(this);
- _alt = getInterpreter().adaptivePredict(_input,108,_ctx);
+ _alt = getInterpreter().adaptivePredict(_input,110,_ctx);
while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) {
if ( _alt==1 ) {
{
{
- setState(1258);
+ setState(1287);
match(COMMA);
- setState(1259);
+ setState(1288);
expression(0);
}
}
}
- setState(1264);
+ setState(1293);
_errHandler.sync(this);
- _alt = getInterpreter().adaptivePredict(_input,108,_ctx);
+ _alt = getInterpreter().adaptivePredict(_input,110,_ctx);
}
}
}
@@ -8031,43 +8183,43 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final TypeDeclContext typeDecl() throws RecognitionException {
TypeDeclContext _localctx = new TypeDeclContext(_ctx, getState());
- enterRule(_localctx, 212, RULE_typeDecl);
+ enterRule(_localctx, 216, RULE_typeDecl);
int _la;
try {
enterOuterAlt(_localctx, 1);
{
- setState(1265);
+ setState(1294);
match(TYPE);
- setState(1277);
+ setState(1306);
_errHandler.sync(this);
switch (_input.LA(1)) {
case IDENTIFIER:
{
- setState(1266);
+ setState(1295);
typeSpec();
}
break;
case L_PAREN:
{
- setState(1267);
+ setState(1296);
match(L_PAREN);
- setState(1273);
+ setState(1302);
_errHandler.sync(this);
_la = _input.LA(1);
while (_la==IDENTIFIER) {
{
{
- setState(1268);
+ setState(1297);
typeSpec();
- setState(1269);
+ setState(1298);
eos();
}
}
- setState(1275);
+ setState(1304);
_errHandler.sync(this);
_la = _input.LA(1);
}
- setState(1276);
+ setState(1305);
match(R_PAREN);
}
break;
@@ -8106,24 +8258,24 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final TypeSpecContext typeSpec() throws RecognitionException {
TypeSpecContext _localctx = new TypeSpecContext(_ctx, getState());
- enterRule(_localctx, 214, RULE_typeSpec);
+ enterRule(_localctx, 218, RULE_typeSpec);
int _la;
try {
enterOuterAlt(_localctx, 1);
{
- setState(1279);
+ setState(1308);
match(IDENTIFIER);
- setState(1281);
+ setState(1310);
_errHandler.sync(this);
_la = _input.LA(1);
if (_la==ASSIGN) {
{
- setState(1280);
+ setState(1309);
match(ASSIGN);
}
}
- setState(1283);
+ setState(1312);
type_();
}
}
@@ -8167,43 +8319,43 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final VarDeclContext varDecl() throws RecognitionException {
VarDeclContext _localctx = new VarDeclContext(_ctx, getState());
- enterRule(_localctx, 216, RULE_varDecl);
+ enterRule(_localctx, 220, RULE_varDecl);
int _la;
try {
enterOuterAlt(_localctx, 1);
{
- setState(1285);
+ setState(1314);
match(VAR);
- setState(1297);
+ setState(1326);
_errHandler.sync(this);
switch (_input.LA(1)) {
case IDENTIFIER:
{
- setState(1286);
+ setState(1315);
varSpec();
}
break;
case L_PAREN:
{
- setState(1287);
+ setState(1316);
match(L_PAREN);
- setState(1293);
+ setState(1322);
_errHandler.sync(this);
_la = _input.LA(1);
while (_la==IDENTIFIER) {
{
{
- setState(1288);
+ setState(1317);
varSpec();
- setState(1289);
+ setState(1318);
eos();
}
}
- setState(1295);
+ setState(1324);
_errHandler.sync(this);
_la = _input.LA(1);
}
- setState(1296);
+ setState(1325);
match(R_PAREN);
}
break;
@@ -8242,23 +8394,23 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final BlockContext block() throws RecognitionException {
BlockContext _localctx = new BlockContext(_ctx, getState());
- enterRule(_localctx, 218, RULE_block);
+ enterRule(_localctx, 222, RULE_block);
try {
enterOuterAlt(_localctx, 1);
{
- setState(1299);
+ setState(1328);
match(L_CURLY);
- setState(1301);
+ setState(1330);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,114,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,116,_ctx) ) {
case 1:
{
- setState(1300);
+ setState(1329);
statementList();
}
break;
}
- setState(1303);
+ setState(1332);
match(R_CURLY);
}
}
@@ -8299,12 +8451,12 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final StatementListContext statementList() throws RecognitionException {
StatementListContext _localctx = new StatementListContext(_ctx, getState());
- enterRule(_localctx, 220, RULE_statementList);
+ enterRule(_localctx, 224, RULE_statementList);
try {
int _alt;
enterOuterAlt(_localctx, 1);
{
- setState(1311);
+ setState(1340);
_errHandler.sync(this);
_alt = 1;
do {
@@ -8312,19 +8464,19 @@ public final StatementListContext statementList() throws RecognitionException {
case 1:
{
{
- setState(1306);
+ setState(1335);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,115,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,117,_ctx) ) {
case 1:
{
- setState(1305);
+ setState(1334);
eos();
}
break;
}
- setState(1308);
+ setState(1337);
statement();
- setState(1309);
+ setState(1338);
eos();
}
}
@@ -8332,9 +8484,9 @@ public final StatementListContext statementList() throws RecognitionException {
default:
throw new NoViableAltException(this);
}
- setState(1313);
+ setState(1342);
_errHandler.sync(this);
- _alt = getInterpreter().adaptivePredict(_input,116,_ctx);
+ _alt = getInterpreter().adaptivePredict(_input,118,_ctx);
} while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER );
}
}
@@ -8378,43 +8530,43 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final SimpleStmtContext simpleStmt() throws RecognitionException {
SimpleStmtContext _localctx = new SimpleStmtContext(_ctx, getState());
- enterRule(_localctx, 222, RULE_simpleStmt);
+ enterRule(_localctx, 226, RULE_simpleStmt);
try {
- setState(1320);
+ setState(1349);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,117,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,119,_ctx) ) {
case 1:
enterOuterAlt(_localctx, 1);
{
- setState(1315);
+ setState(1344);
sendStmt();
}
break;
case 2:
enterOuterAlt(_localctx, 2);
{
- setState(1316);
+ setState(1345);
incDecStmt();
}
break;
case 3:
enterOuterAlt(_localctx, 3);
{
- setState(1317);
+ setState(1346);
assignment();
}
break;
case 4:
enterOuterAlt(_localctx, 4);
{
- setState(1318);
+ setState(1347);
expressionStmt();
}
break;
case 5:
enterOuterAlt(_localctx, 5);
{
- setState(1319);
+ setState(1348);
shortVarDecl();
}
break;
@@ -8448,11 +8600,11 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final ExpressionStmtContext expressionStmt() throws RecognitionException {
ExpressionStmtContext _localctx = new ExpressionStmtContext(_ctx, getState());
- enterRule(_localctx, 224, RULE_expressionStmt);
+ enterRule(_localctx, 228, RULE_expressionStmt);
try {
enterOuterAlt(_localctx, 1);
{
- setState(1322);
+ setState(1351);
expression(0);
}
}
@@ -8489,15 +8641,15 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final SendStmtContext sendStmt() throws RecognitionException {
SendStmtContext _localctx = new SendStmtContext(_ctx, getState());
- enterRule(_localctx, 226, RULE_sendStmt);
+ enterRule(_localctx, 230, RULE_sendStmt);
try {
enterOuterAlt(_localctx, 1);
{
- setState(1324);
+ setState(1353);
((SendStmtContext)_localctx).channel = expression(0);
- setState(1325);
+ setState(1354);
match(RECEIVE);
- setState(1326);
+ setState(1355);
expression(0);
}
}
@@ -8531,14 +8683,14 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final IncDecStmtContext incDecStmt() throws RecognitionException {
IncDecStmtContext _localctx = new IncDecStmtContext(_ctx, getState());
- enterRule(_localctx, 228, RULE_incDecStmt);
+ enterRule(_localctx, 232, RULE_incDecStmt);
int _la;
try {
enterOuterAlt(_localctx, 1);
{
- setState(1328);
+ setState(1357);
expression(0);
- setState(1329);
+ setState(1358);
_la = _input.LA(1);
if ( !(_la==PLUS_PLUS || _la==MINUS_MINUS) ) {
_errHandler.recoverInline(this);
@@ -8584,15 +8736,15 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final AssignmentContext assignment() throws RecognitionException {
AssignmentContext _localctx = new AssignmentContext(_ctx, getState());
- enterRule(_localctx, 230, RULE_assignment);
+ enterRule(_localctx, 234, RULE_assignment);
try {
enterOuterAlt(_localctx, 1);
{
- setState(1331);
+ setState(1360);
expressionList();
- setState(1332);
+ setState(1361);
assign_op();
- setState(1333);
+ setState(1362);
expressionList();
}
}
@@ -8623,12 +8775,12 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final EmptyStmtContext emptyStmt() throws RecognitionException {
EmptyStmtContext _localctx = new EmptyStmtContext(_ctx, getState());
- enterRule(_localctx, 232, RULE_emptyStmt);
+ enterRule(_localctx, 236, RULE_emptyStmt);
int _la;
try {
enterOuterAlt(_localctx, 1);
{
- setState(1335);
+ setState(1364);
_la = _input.LA(1);
if ( !(_la==SEMI || _la==EOS) ) {
_errHandler.recoverInline(this);
@@ -8670,20 +8822,20 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final LabeledStmtContext labeledStmt() throws RecognitionException {
LabeledStmtContext _localctx = new LabeledStmtContext(_ctx, getState());
- enterRule(_localctx, 234, RULE_labeledStmt);
+ enterRule(_localctx, 238, RULE_labeledStmt);
try {
enterOuterAlt(_localctx, 1);
{
- setState(1337);
+ setState(1366);
match(IDENTIFIER);
- setState(1338);
+ setState(1367);
match(COLON);
- setState(1340);
+ setState(1369);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,118,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,120,_ctx) ) {
case 1:
{
- setState(1339);
+ setState(1368);
statement();
}
break;
@@ -8719,18 +8871,18 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final ReturnStmtContext returnStmt() throws RecognitionException {
ReturnStmtContext _localctx = new ReturnStmtContext(_ctx, getState());
- enterRule(_localctx, 236, RULE_returnStmt);
+ enterRule(_localctx, 240, RULE_returnStmt);
try {
enterOuterAlt(_localctx, 1);
{
- setState(1342);
+ setState(1371);
match(RETURN);
- setState(1344);
+ setState(1373);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,119,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,121,_ctx) ) {
case 1:
{
- setState(1343);
+ setState(1372);
expressionList();
}
break;
@@ -8764,18 +8916,18 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final BreakStmtContext breakStmt() throws RecognitionException {
BreakStmtContext _localctx = new BreakStmtContext(_ctx, getState());
- enterRule(_localctx, 238, RULE_breakStmt);
+ enterRule(_localctx, 242, RULE_breakStmt);
try {
enterOuterAlt(_localctx, 1);
{
- setState(1346);
+ setState(1375);
match(BREAK);
- setState(1348);
+ setState(1377);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,120,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,122,_ctx) ) {
case 1:
{
- setState(1347);
+ setState(1376);
match(IDENTIFIER);
}
break;
@@ -8809,18 +8961,18 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final ContinueStmtContext continueStmt() throws RecognitionException {
ContinueStmtContext _localctx = new ContinueStmtContext(_ctx, getState());
- enterRule(_localctx, 240, RULE_continueStmt);
+ enterRule(_localctx, 244, RULE_continueStmt);
try {
enterOuterAlt(_localctx, 1);
{
- setState(1350);
+ setState(1379);
match(CONTINUE);
- setState(1352);
+ setState(1381);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,121,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,123,_ctx) ) {
case 1:
{
- setState(1351);
+ setState(1380);
match(IDENTIFIER);
}
break;
@@ -8854,13 +9006,13 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final GotoStmtContext gotoStmt() throws RecognitionException {
GotoStmtContext _localctx = new GotoStmtContext(_ctx, getState());
- enterRule(_localctx, 242, RULE_gotoStmt);
+ enterRule(_localctx, 246, RULE_gotoStmt);
try {
enterOuterAlt(_localctx, 1);
{
- setState(1354);
+ setState(1383);
match(GOTO);
- setState(1355);
+ setState(1384);
match(IDENTIFIER);
}
}
@@ -8890,11 +9042,11 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final FallthroughStmtContext fallthroughStmt() throws RecognitionException {
FallthroughStmtContext _localctx = new FallthroughStmtContext(_ctx, getState());
- enterRule(_localctx, 244, RULE_fallthroughStmt);
+ enterRule(_localctx, 248, RULE_fallthroughStmt);
try {
enterOuterAlt(_localctx, 1);
{
- setState(1357);
+ setState(1386);
match(FALLTHROUGH);
}
}
@@ -8943,61 +9095,61 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final IfStmtContext ifStmt() throws RecognitionException {
IfStmtContext _localctx = new IfStmtContext(_ctx, getState());
- enterRule(_localctx, 246, RULE_ifStmt);
+ enterRule(_localctx, 250, RULE_ifStmt);
try {
enterOuterAlt(_localctx, 1);
{
- setState(1359);
+ setState(1388);
match(IF);
- setState(1368);
+ setState(1397);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,122,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,124,_ctx) ) {
case 1:
{
- setState(1360);
+ setState(1389);
expression(0);
}
break;
case 2:
{
- setState(1361);
+ setState(1390);
eos();
- setState(1362);
+ setState(1391);
expression(0);
}
break;
case 3:
{
- setState(1364);
+ setState(1393);
simpleStmt();
- setState(1365);
+ setState(1394);
eos();
- setState(1366);
+ setState(1395);
expression(0);
}
break;
}
- setState(1370);
+ setState(1399);
block();
- setState(1376);
+ setState(1405);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,124,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,126,_ctx) ) {
case 1:
{
- setState(1371);
+ setState(1400);
match(ELSE);
- setState(1374);
+ setState(1403);
_errHandler.sync(this);
switch (_input.LA(1)) {
case IF:
{
- setState(1372);
+ setState(1401);
ifStmt();
}
break;
case L_CURLY:
{
- setState(1373);
+ setState(1402);
block();
}
break;
@@ -9040,22 +9192,22 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final SwitchStmtContext switchStmt() throws RecognitionException {
SwitchStmtContext _localctx = new SwitchStmtContext(_ctx, getState());
- enterRule(_localctx, 248, RULE_switchStmt);
+ enterRule(_localctx, 252, RULE_switchStmt);
try {
- setState(1380);
+ setState(1409);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,125,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,127,_ctx) ) {
case 1:
enterOuterAlt(_localctx, 1);
{
- setState(1378);
+ setState(1407);
exprSwitchStmt();
}
break;
case 2:
enterOuterAlt(_localctx, 2);
{
- setState(1379);
+ setState(1408);
typeSwitchStmt();
}
break;
@@ -9104,24 +9256,24 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final ExprSwitchStmtContext exprSwitchStmt() throws RecognitionException {
ExprSwitchStmtContext _localctx = new ExprSwitchStmtContext(_ctx, getState());
- enterRule(_localctx, 250, RULE_exprSwitchStmt);
+ enterRule(_localctx, 254, RULE_exprSwitchStmt);
int _la;
try {
enterOuterAlt(_localctx, 1);
{
- setState(1382);
+ setState(1411);
match(SWITCH);
- setState(1393);
+ setState(1422);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,129,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,131,_ctx) ) {
case 1:
{
- setState(1384);
+ setState(1413);
_errHandler.sync(this);
_la = _input.LA(1);
- if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FLOAT_LIT) | (1L << TRUE) | (1L << FALSE) | (1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << OLD) | (1L << BEFORE) | (1L << FORALL) | (1L << EXISTS) | (1L << ACCESS) | (1L << UNFOLDING) | (1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << LEN) | (1L << NEW) | (1L << MAKE) | (1L << CAP) | (1L << SOME) | (1L << GET) | (1L << DOM) | (1L << NONE) | (1L << PRED) | (1L << TYPE_OF) | (1L << IS_COMPARABLE) | (1L << WRITEPERM) | (1L << NOPERM))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (TRUSTED - 64)) | (1L << (FUNC - 64)) | (1L << (INTERFACE - 64)) | (1L << (MAP - 64)) | (1L << (STRUCT - 64)) | (1L << (CHAN - 64)) | (1L << (RANGE - 64)) | (1L << (TYPE - 64)) | (1L << (NIL_LIT - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (L_PAREN - 64)) | (1L << (L_BRACKET - 64)))) != 0) || ((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & ((1L << (EXCLAMATION - 128)) | (1L << (PLUS - 128)) | (1L << (MINUS - 128)) | (1L << (CARET - 128)) | (1L << (STAR - 128)) | (1L << (AMPERSAND - 128)) | (1L << (RECEIVE - 128)) | (1L << (DECIMAL_LIT - 128)) | (1L << (BINARY_LIT - 128)) | (1L << (OCTAL_LIT - 128)) | (1L << (HEX_LIT - 128)) | (1L << (IMAGINARY_LIT - 128)) | (1L << (RUNE_LIT - 128)) | (1L << (RAW_STRING_LIT - 128)) | (1L << (INTERPRETED_STRING_LIT - 128)))) != 0)) {
+ if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FLOAT_LIT) | (1L << TRUE) | (1L << FALSE) | (1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << OLD) | (1L << BEFORE) | (1L << FORALL) | (1L << EXISTS) | (1L << ACCESS) | (1L << UNFOLDING) | (1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << LEN) | (1L << NEW) | (1L << MAKE) | (1L << CAP) | (1L << SOME) | (1L << GET) | (1L << DOM) | (1L << ADT) | (1L << NONE) | (1L << PRED) | (1L << TYPE_OF) | (1L << IS_COMPARABLE) | (1L << WRITEPERM))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (NOPERM - 64)) | (1L << (TRUSTED - 64)) | (1L << (FUNC - 64)) | (1L << (INTERFACE - 64)) | (1L << (MAP - 64)) | (1L << (STRUCT - 64)) | (1L << (CHAN - 64)) | (1L << (RANGE - 64)) | (1L << (TYPE - 64)) | (1L << (NIL_LIT - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (L_PAREN - 64)) | (1L << (L_BRACKET - 64)))) != 0) || ((((_la - 129)) & ~0x3f) == 0 && ((1L << (_la - 129)) & ((1L << (EXCLAMATION - 129)) | (1L << (PLUS - 129)) | (1L << (MINUS - 129)) | (1L << (CARET - 129)) | (1L << (STAR - 129)) | (1L << (AMPERSAND - 129)) | (1L << (RECEIVE - 129)) | (1L << (DECIMAL_LIT - 129)) | (1L << (BINARY_LIT - 129)) | (1L << (OCTAL_LIT - 129)) | (1L << (HEX_LIT - 129)) | (1L << (IMAGINARY_LIT - 129)) | (1L << (RUNE_LIT - 129)) | (1L << (RAW_STRING_LIT - 129)) | (1L << (INTERPRETED_STRING_LIT - 129)))) != 0)) {
{
- setState(1383);
+ setState(1412);
expression(0);
}
}
@@ -9130,24 +9282,24 @@ public final ExprSwitchStmtContext exprSwitchStmt() throws RecognitionException
break;
case 2:
{
- setState(1387);
+ setState(1416);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,127,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,129,_ctx) ) {
case 1:
{
- setState(1386);
+ setState(1415);
simpleStmt();
}
break;
}
- setState(1389);
+ setState(1418);
eos();
- setState(1391);
+ setState(1420);
_errHandler.sync(this);
_la = _input.LA(1);
- if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FLOAT_LIT) | (1L << TRUE) | (1L << FALSE) | (1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << OLD) | (1L << BEFORE) | (1L << FORALL) | (1L << EXISTS) | (1L << ACCESS) | (1L << UNFOLDING) | (1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << LEN) | (1L << NEW) | (1L << MAKE) | (1L << CAP) | (1L << SOME) | (1L << GET) | (1L << DOM) | (1L << NONE) | (1L << PRED) | (1L << TYPE_OF) | (1L << IS_COMPARABLE) | (1L << WRITEPERM) | (1L << NOPERM))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (TRUSTED - 64)) | (1L << (FUNC - 64)) | (1L << (INTERFACE - 64)) | (1L << (MAP - 64)) | (1L << (STRUCT - 64)) | (1L << (CHAN - 64)) | (1L << (RANGE - 64)) | (1L << (TYPE - 64)) | (1L << (NIL_LIT - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (L_PAREN - 64)) | (1L << (L_BRACKET - 64)))) != 0) || ((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & ((1L << (EXCLAMATION - 128)) | (1L << (PLUS - 128)) | (1L << (MINUS - 128)) | (1L << (CARET - 128)) | (1L << (STAR - 128)) | (1L << (AMPERSAND - 128)) | (1L << (RECEIVE - 128)) | (1L << (DECIMAL_LIT - 128)) | (1L << (BINARY_LIT - 128)) | (1L << (OCTAL_LIT - 128)) | (1L << (HEX_LIT - 128)) | (1L << (IMAGINARY_LIT - 128)) | (1L << (RUNE_LIT - 128)) | (1L << (RAW_STRING_LIT - 128)) | (1L << (INTERPRETED_STRING_LIT - 128)))) != 0)) {
+ if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FLOAT_LIT) | (1L << TRUE) | (1L << FALSE) | (1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << OLD) | (1L << BEFORE) | (1L << FORALL) | (1L << EXISTS) | (1L << ACCESS) | (1L << UNFOLDING) | (1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << LEN) | (1L << NEW) | (1L << MAKE) | (1L << CAP) | (1L << SOME) | (1L << GET) | (1L << DOM) | (1L << ADT) | (1L << NONE) | (1L << PRED) | (1L << TYPE_OF) | (1L << IS_COMPARABLE) | (1L << WRITEPERM))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (NOPERM - 64)) | (1L << (TRUSTED - 64)) | (1L << (FUNC - 64)) | (1L << (INTERFACE - 64)) | (1L << (MAP - 64)) | (1L << (STRUCT - 64)) | (1L << (CHAN - 64)) | (1L << (RANGE - 64)) | (1L << (TYPE - 64)) | (1L << (NIL_LIT - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (L_PAREN - 64)) | (1L << (L_BRACKET - 64)))) != 0) || ((((_la - 129)) & ~0x3f) == 0 && ((1L << (_la - 129)) & ((1L << (EXCLAMATION - 129)) | (1L << (PLUS - 129)) | (1L << (MINUS - 129)) | (1L << (CARET - 129)) | (1L << (STAR - 129)) | (1L << (AMPERSAND - 129)) | (1L << (RECEIVE - 129)) | (1L << (DECIMAL_LIT - 129)) | (1L << (BINARY_LIT - 129)) | (1L << (OCTAL_LIT - 129)) | (1L << (HEX_LIT - 129)) | (1L << (IMAGINARY_LIT - 129)) | (1L << (RUNE_LIT - 129)) | (1L << (RAW_STRING_LIT - 129)) | (1L << (INTERPRETED_STRING_LIT - 129)))) != 0)) {
{
- setState(1390);
+ setState(1419);
expression(0);
}
}
@@ -9155,23 +9307,23 @@ public final ExprSwitchStmtContext exprSwitchStmt() throws RecognitionException
}
break;
}
- setState(1395);
+ setState(1424);
match(L_CURLY);
- setState(1399);
+ setState(1428);
_errHandler.sync(this);
_la = _input.LA(1);
while (_la==DEFAULT || _la==CASE) {
{
{
- setState(1396);
+ setState(1425);
exprCaseClause();
}
}
- setState(1401);
+ setState(1430);
_errHandler.sync(this);
_la = _input.LA(1);
}
- setState(1402);
+ setState(1431);
match(R_CURLY);
}
}
@@ -9207,20 +9359,20 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final ExprCaseClauseContext exprCaseClause() throws RecognitionException {
ExprCaseClauseContext _localctx = new ExprCaseClauseContext(_ctx, getState());
- enterRule(_localctx, 252, RULE_exprCaseClause);
+ enterRule(_localctx, 256, RULE_exprCaseClause);
try {
enterOuterAlt(_localctx, 1);
{
- setState(1404);
+ setState(1433);
exprSwitchCase();
- setState(1405);
+ setState(1434);
match(COLON);
- setState(1407);
+ setState(1436);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,131,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,133,_ctx) ) {
case 1:
{
- setState(1406);
+ setState(1435);
statementList();
}
break;
@@ -9257,24 +9409,24 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final ExprSwitchCaseContext exprSwitchCase() throws RecognitionException {
ExprSwitchCaseContext _localctx = new ExprSwitchCaseContext(_ctx, getState());
- enterRule(_localctx, 254, RULE_exprSwitchCase);
+ enterRule(_localctx, 258, RULE_exprSwitchCase);
try {
- setState(1412);
+ setState(1441);
_errHandler.sync(this);
switch (_input.LA(1)) {
case CASE:
enterOuterAlt(_localctx, 1);
{
- setState(1409);
+ setState(1438);
match(CASE);
- setState(1410);
+ setState(1439);
expressionList();
}
break;
case DEFAULT:
enterOuterAlt(_localctx, 2);
{
- setState(1411);
+ setState(1440);
match(DEFAULT);
}
break;
@@ -9325,58 +9477,58 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final TypeSwitchStmtContext typeSwitchStmt() throws RecognitionException {
TypeSwitchStmtContext _localctx = new TypeSwitchStmtContext(_ctx, getState());
- enterRule(_localctx, 256, RULE_typeSwitchStmt);
+ enterRule(_localctx, 260, RULE_typeSwitchStmt);
int _la;
try {
enterOuterAlt(_localctx, 1);
{
- setState(1414);
+ setState(1443);
match(SWITCH);
- setState(1423);
+ setState(1452);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,133,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,135,_ctx) ) {
case 1:
{
- setState(1415);
+ setState(1444);
typeSwitchGuard();
}
break;
case 2:
{
- setState(1416);
+ setState(1445);
eos();
- setState(1417);
+ setState(1446);
typeSwitchGuard();
}
break;
case 3:
{
- setState(1419);
+ setState(1448);
simpleStmt();
- setState(1420);
+ setState(1449);
eos();
- setState(1421);
+ setState(1450);
typeSwitchGuard();
}
break;
}
- setState(1425);
+ setState(1454);
match(L_CURLY);
- setState(1429);
+ setState(1458);
_errHandler.sync(this);
_la = _input.LA(1);
while (_la==DEFAULT || _la==CASE) {
{
{
- setState(1426);
+ setState(1455);
typeCaseClause();
}
}
- setState(1431);
+ setState(1460);
_errHandler.sync(this);
_la = _input.LA(1);
}
- setState(1432);
+ setState(1461);
match(R_CURLY);
}
}
@@ -9414,31 +9566,31 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final TypeSwitchGuardContext typeSwitchGuard() throws RecognitionException {
TypeSwitchGuardContext _localctx = new TypeSwitchGuardContext(_ctx, getState());
- enterRule(_localctx, 258, RULE_typeSwitchGuard);
+ enterRule(_localctx, 262, RULE_typeSwitchGuard);
try {
enterOuterAlt(_localctx, 1);
{
- setState(1436);
+ setState(1465);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,135,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,137,_ctx) ) {
case 1:
{
- setState(1434);
+ setState(1463);
match(IDENTIFIER);
- setState(1435);
+ setState(1464);
match(DECLARE_ASSIGN);
}
break;
}
- setState(1438);
+ setState(1467);
primaryExpr(0);
- setState(1439);
+ setState(1468);
match(DOT);
- setState(1440);
+ setState(1469);
match(L_PAREN);
- setState(1441);
+ setState(1470);
match(TYPE);
- setState(1442);
+ setState(1471);
match(R_PAREN);
}
}
@@ -9474,20 +9626,20 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final TypeCaseClauseContext typeCaseClause() throws RecognitionException {
TypeCaseClauseContext _localctx = new TypeCaseClauseContext(_ctx, getState());
- enterRule(_localctx, 260, RULE_typeCaseClause);
+ enterRule(_localctx, 264, RULE_typeCaseClause);
try {
enterOuterAlt(_localctx, 1);
{
- setState(1444);
+ setState(1473);
typeSwitchCase();
- setState(1445);
+ setState(1474);
match(COLON);
- setState(1447);
+ setState(1476);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,136,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,138,_ctx) ) {
case 1:
{
- setState(1446);
+ setState(1475);
statementList();
}
break;
@@ -9524,24 +9676,24 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final TypeSwitchCaseContext typeSwitchCase() throws RecognitionException {
TypeSwitchCaseContext _localctx = new TypeSwitchCaseContext(_ctx, getState());
- enterRule(_localctx, 262, RULE_typeSwitchCase);
+ enterRule(_localctx, 266, RULE_typeSwitchCase);
try {
- setState(1452);
+ setState(1481);
_errHandler.sync(this);
switch (_input.LA(1)) {
case CASE:
enterOuterAlt(_localctx, 1);
{
- setState(1449);
+ setState(1478);
match(CASE);
- setState(1450);
+ setState(1479);
typeList();
}
break;
case DEFAULT:
enterOuterAlt(_localctx, 2);
{
- setState(1451);
+ setState(1480);
match(DEFAULT);
}
break;
@@ -9588,12 +9740,12 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final TypeListContext typeList() throws RecognitionException {
TypeListContext _localctx = new TypeListContext(_ctx, getState());
- enterRule(_localctx, 264, RULE_typeList);
+ enterRule(_localctx, 268, RULE_typeList);
int _la;
try {
enterOuterAlt(_localctx, 1);
{
- setState(1456);
+ setState(1485);
_errHandler.sync(this);
switch (_input.LA(1)) {
case GHOST:
@@ -9603,6 +9755,7 @@ public final TypeListContext typeList() throws RecognitionException {
case DICT:
case OPT:
case DOM:
+ case ADT:
case PRED:
case FUNC:
case INTERFACE:
@@ -9615,28 +9768,28 @@ public final TypeListContext typeList() throws RecognitionException {
case STAR:
case RECEIVE:
{
- setState(1454);
+ setState(1483);
type_();
}
break;
case NIL_LIT:
{
- setState(1455);
+ setState(1484);
match(NIL_LIT);
}
break;
default:
throw new NoViableAltException(this);
}
- setState(1465);
+ setState(1494);
_errHandler.sync(this);
_la = _input.LA(1);
while (_la==COMMA) {
{
{
- setState(1458);
+ setState(1487);
match(COMMA);
- setState(1461);
+ setState(1490);
_errHandler.sync(this);
switch (_input.LA(1)) {
case GHOST:
@@ -9646,6 +9799,7 @@ public final TypeListContext typeList() throws RecognitionException {
case DICT:
case OPT:
case DOM:
+ case ADT:
case PRED:
case FUNC:
case INTERFACE:
@@ -9658,13 +9812,13 @@ public final TypeListContext typeList() throws RecognitionException {
case STAR:
case RECEIVE:
{
- setState(1459);
+ setState(1488);
type_();
}
break;
case NIL_LIT:
{
- setState(1460);
+ setState(1489);
match(NIL_LIT);
}
break;
@@ -9673,7 +9827,7 @@ public final TypeListContext typeList() throws RecognitionException {
}
}
}
- setState(1467);
+ setState(1496);
_errHandler.sync(this);
_la = _input.LA(1);
}
@@ -9713,30 +9867,30 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final SelectStmtContext selectStmt() throws RecognitionException {
SelectStmtContext _localctx = new SelectStmtContext(_ctx, getState());
- enterRule(_localctx, 266, RULE_selectStmt);
+ enterRule(_localctx, 270, RULE_selectStmt);
int _la;
try {
enterOuterAlt(_localctx, 1);
{
- setState(1468);
+ setState(1497);
match(SELECT);
- setState(1469);
+ setState(1498);
match(L_CURLY);
- setState(1473);
+ setState(1502);
_errHandler.sync(this);
_la = _input.LA(1);
while (_la==DEFAULT || _la==CASE) {
{
{
- setState(1470);
+ setState(1499);
commClause();
}
}
- setState(1475);
+ setState(1504);
_errHandler.sync(this);
_la = _input.LA(1);
}
- setState(1476);
+ setState(1505);
match(R_CURLY);
}
}
@@ -9772,20 +9926,20 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final CommClauseContext commClause() throws RecognitionException {
CommClauseContext _localctx = new CommClauseContext(_ctx, getState());
- enterRule(_localctx, 268, RULE_commClause);
+ enterRule(_localctx, 272, RULE_commClause);
try {
enterOuterAlt(_localctx, 1);
{
- setState(1478);
+ setState(1507);
commCase();
- setState(1479);
+ setState(1508);
match(COLON);
- setState(1481);
+ setState(1510);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,142,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,144,_ctx) ) {
case 1:
{
- setState(1480);
+ setState(1509);
statementList();
}
break;
@@ -9825,28 +9979,28 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final CommCaseContext commCase() throws RecognitionException {
CommCaseContext _localctx = new CommCaseContext(_ctx, getState());
- enterRule(_localctx, 270, RULE_commCase);
+ enterRule(_localctx, 274, RULE_commCase);
try {
- setState(1489);
+ setState(1518);
_errHandler.sync(this);
switch (_input.LA(1)) {
case CASE:
enterOuterAlt(_localctx, 1);
{
- setState(1483);
+ setState(1512);
match(CASE);
- setState(1486);
+ setState(1515);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,143,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,145,_ctx) ) {
case 1:
{
- setState(1484);
+ setState(1513);
sendStmt();
}
break;
case 2:
{
- setState(1485);
+ setState(1514);
recvStmt();
}
break;
@@ -9856,7 +10010,7 @@ public final CommCaseContext commCase() throws RecognitionException {
case DEFAULT:
enterOuterAlt(_localctx, 2);
{
- setState(1488);
+ setState(1517);
match(DEFAULT);
}
break;
@@ -9901,31 +10055,31 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final RecvStmtContext recvStmt() throws RecognitionException {
RecvStmtContext _localctx = new RecvStmtContext(_ctx, getState());
- enterRule(_localctx, 272, RULE_recvStmt);
+ enterRule(_localctx, 276, RULE_recvStmt);
try {
enterOuterAlt(_localctx, 1);
{
- setState(1497);
+ setState(1526);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,145,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,147,_ctx) ) {
case 1:
{
- setState(1491);
+ setState(1520);
expressionList();
- setState(1492);
+ setState(1521);
match(ASSIGN);
}
break;
case 2:
{
- setState(1494);
+ setState(1523);
identifierList();
- setState(1495);
+ setState(1524);
match(DECLARE_ASSIGN);
}
break;
}
- setState(1499);
+ setState(1528);
((RecvStmtContext)_localctx).recvExpr = expression(0);
}
}
@@ -9967,35 +10121,35 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final ForStmtContext forStmt() throws RecognitionException {
ForStmtContext _localctx = new ForStmtContext(_ctx, getState());
- enterRule(_localctx, 274, RULE_forStmt);
+ enterRule(_localctx, 278, RULE_forStmt);
try {
enterOuterAlt(_localctx, 1);
{
- setState(1501);
+ setState(1530);
match(FOR);
- setState(1505);
+ setState(1534);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,146,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,148,_ctx) ) {
case 1:
{
- setState(1502);
+ setState(1531);
expression(0);
}
break;
case 2:
{
- setState(1503);
+ setState(1532);
forClause();
}
break;
case 3:
{
- setState(1504);
+ setState(1533);
rangeClause();
}
break;
}
- setState(1507);
+ setState(1536);
block();
}
}
@@ -10041,41 +10195,41 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final ForClauseContext forClause() throws RecognitionException {
ForClauseContext _localctx = new ForClauseContext(_ctx, getState());
- enterRule(_localctx, 276, RULE_forClause);
+ enterRule(_localctx, 280, RULE_forClause);
int _la;
try {
enterOuterAlt(_localctx, 1);
{
- setState(1510);
+ setState(1539);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,147,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,149,_ctx) ) {
case 1:
{
- setState(1509);
+ setState(1538);
((ForClauseContext)_localctx).initStmt = simpleStmt();
}
break;
}
- setState(1512);
+ setState(1541);
eos();
- setState(1514);
+ setState(1543);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,148,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,150,_ctx) ) {
case 1:
{
- setState(1513);
+ setState(1542);
expression(0);
}
break;
}
- setState(1516);
+ setState(1545);
eos();
- setState(1518);
+ setState(1547);
_errHandler.sync(this);
_la = _input.LA(1);
- if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FLOAT_LIT) | (1L << TRUE) | (1L << FALSE) | (1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << OLD) | (1L << BEFORE) | (1L << FORALL) | (1L << EXISTS) | (1L << ACCESS) | (1L << UNFOLDING) | (1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << LEN) | (1L << NEW) | (1L << MAKE) | (1L << CAP) | (1L << SOME) | (1L << GET) | (1L << DOM) | (1L << NONE) | (1L << PRED) | (1L << TYPE_OF) | (1L << IS_COMPARABLE) | (1L << WRITEPERM) | (1L << NOPERM))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (TRUSTED - 64)) | (1L << (FUNC - 64)) | (1L << (INTERFACE - 64)) | (1L << (MAP - 64)) | (1L << (STRUCT - 64)) | (1L << (CHAN - 64)) | (1L << (RANGE - 64)) | (1L << (TYPE - 64)) | (1L << (NIL_LIT - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (L_PAREN - 64)) | (1L << (L_BRACKET - 64)))) != 0) || ((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & ((1L << (EXCLAMATION - 128)) | (1L << (PLUS - 128)) | (1L << (MINUS - 128)) | (1L << (CARET - 128)) | (1L << (STAR - 128)) | (1L << (AMPERSAND - 128)) | (1L << (RECEIVE - 128)) | (1L << (DECIMAL_LIT - 128)) | (1L << (BINARY_LIT - 128)) | (1L << (OCTAL_LIT - 128)) | (1L << (HEX_LIT - 128)) | (1L << (IMAGINARY_LIT - 128)) | (1L << (RUNE_LIT - 128)) | (1L << (RAW_STRING_LIT - 128)) | (1L << (INTERPRETED_STRING_LIT - 128)))) != 0)) {
+ if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FLOAT_LIT) | (1L << TRUE) | (1L << FALSE) | (1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << OLD) | (1L << BEFORE) | (1L << FORALL) | (1L << EXISTS) | (1L << ACCESS) | (1L << UNFOLDING) | (1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << LEN) | (1L << NEW) | (1L << MAKE) | (1L << CAP) | (1L << SOME) | (1L << GET) | (1L << DOM) | (1L << ADT) | (1L << NONE) | (1L << PRED) | (1L << TYPE_OF) | (1L << IS_COMPARABLE) | (1L << WRITEPERM))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (NOPERM - 64)) | (1L << (TRUSTED - 64)) | (1L << (FUNC - 64)) | (1L << (INTERFACE - 64)) | (1L << (MAP - 64)) | (1L << (STRUCT - 64)) | (1L << (CHAN - 64)) | (1L << (RANGE - 64)) | (1L << (TYPE - 64)) | (1L << (NIL_LIT - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (L_PAREN - 64)) | (1L << (L_BRACKET - 64)))) != 0) || ((((_la - 129)) & ~0x3f) == 0 && ((1L << (_la - 129)) & ((1L << (EXCLAMATION - 129)) | (1L << (PLUS - 129)) | (1L << (MINUS - 129)) | (1L << (CARET - 129)) | (1L << (STAR - 129)) | (1L << (AMPERSAND - 129)) | (1L << (RECEIVE - 129)) | (1L << (DECIMAL_LIT - 129)) | (1L << (BINARY_LIT - 129)) | (1L << (OCTAL_LIT - 129)) | (1L << (HEX_LIT - 129)) | (1L << (IMAGINARY_LIT - 129)) | (1L << (RUNE_LIT - 129)) | (1L << (RAW_STRING_LIT - 129)) | (1L << (INTERPRETED_STRING_LIT - 129)))) != 0)) {
{
- setState(1517);
+ setState(1546);
((ForClauseContext)_localctx).postStmt = simpleStmt();
}
}
@@ -10111,13 +10265,13 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final GoStmtContext goStmt() throws RecognitionException {
GoStmtContext _localctx = new GoStmtContext(_ctx, getState());
- enterRule(_localctx, 278, RULE_goStmt);
+ enterRule(_localctx, 282, RULE_goStmt);
try {
enterOuterAlt(_localctx, 1);
{
- setState(1520);
+ setState(1549);
match(GO);
- setState(1521);
+ setState(1550);
expression(0);
}
}
@@ -10150,22 +10304,22 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final TypeNameContext typeName() throws RecognitionException {
TypeNameContext _localctx = new TypeNameContext(_ctx, getState());
- enterRule(_localctx, 280, RULE_typeName);
+ enterRule(_localctx, 284, RULE_typeName);
try {
- setState(1525);
+ setState(1554);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,150,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,152,_ctx) ) {
case 1:
enterOuterAlt(_localctx, 1);
{
- setState(1523);
+ setState(1552);
qualifiedIdent();
}
break;
case 2:
enterOuterAlt(_localctx, 2);
{
- setState(1524);
+ setState(1553);
match(IDENTIFIER);
}
break;
@@ -10204,17 +10358,17 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final ArrayTypeContext arrayType() throws RecognitionException {
ArrayTypeContext _localctx = new ArrayTypeContext(_ctx, getState());
- enterRule(_localctx, 282, RULE_arrayType);
+ enterRule(_localctx, 286, RULE_arrayType);
try {
enterOuterAlt(_localctx, 1);
{
- setState(1527);
+ setState(1556);
match(L_BRACKET);
- setState(1528);
+ setState(1557);
arrayLength();
- setState(1529);
+ setState(1558);
match(R_BRACKET);
- setState(1530);
+ setState(1559);
elementType();
}
}
@@ -10246,11 +10400,11 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final ArrayLengthContext arrayLength() throws RecognitionException {
ArrayLengthContext _localctx = new ArrayLengthContext(_ctx, getState());
- enterRule(_localctx, 284, RULE_arrayLength);
+ enterRule(_localctx, 288, RULE_arrayLength);
try {
enterOuterAlt(_localctx, 1);
{
- setState(1532);
+ setState(1561);
expression(0);
}
}
@@ -10282,11 +10436,11 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final ElementTypeContext elementType() throws RecognitionException {
ElementTypeContext _localctx = new ElementTypeContext(_ctx, getState());
- enterRule(_localctx, 286, RULE_elementType);
+ enterRule(_localctx, 290, RULE_elementType);
try {
enterOuterAlt(_localctx, 1);
{
- setState(1534);
+ setState(1563);
type_();
}
}
@@ -10319,13 +10473,13 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final PointerTypeContext pointerType() throws RecognitionException {
PointerTypeContext _localctx = new PointerTypeContext(_ctx, getState());
- enterRule(_localctx, 288, RULE_pointerType);
+ enterRule(_localctx, 292, RULE_pointerType);
try {
enterOuterAlt(_localctx, 1);
{
- setState(1536);
+ setState(1565);
match(STAR);
- setState(1537);
+ setState(1566);
type_();
}
}
@@ -10359,15 +10513,15 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final SliceTypeContext sliceType() throws RecognitionException {
SliceTypeContext _localctx = new SliceTypeContext(_ctx, getState());
- enterRule(_localctx, 290, RULE_sliceType);
+ enterRule(_localctx, 294, RULE_sliceType);
try {
enterOuterAlt(_localctx, 1);
{
- setState(1539);
+ setState(1568);
match(L_BRACKET);
- setState(1540);
+ setState(1569);
match(R_BRACKET);
- setState(1541);
+ setState(1570);
elementType();
}
}
@@ -10405,19 +10559,19 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final MapTypeContext mapType() throws RecognitionException {
MapTypeContext _localctx = new MapTypeContext(_ctx, getState());
- enterRule(_localctx, 292, RULE_mapType);
+ enterRule(_localctx, 296, RULE_mapType);
try {
enterOuterAlt(_localctx, 1);
{
- setState(1543);
+ setState(1572);
match(MAP);
- setState(1544);
+ setState(1573);
match(L_BRACKET);
- setState(1545);
+ setState(1574);
type_();
- setState(1546);
+ setState(1575);
match(R_BRACKET);
- setState(1547);
+ setState(1576);
elementType();
}
}
@@ -10451,37 +10605,37 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final ChannelTypeContext channelType() throws RecognitionException {
ChannelTypeContext _localctx = new ChannelTypeContext(_ctx, getState());
- enterRule(_localctx, 294, RULE_channelType);
+ enterRule(_localctx, 298, RULE_channelType);
try {
enterOuterAlt(_localctx, 1);
{
- setState(1554);
+ setState(1583);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,151,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,153,_ctx) ) {
case 1:
{
- setState(1549);
+ setState(1578);
match(CHAN);
}
break;
case 2:
{
- setState(1550);
+ setState(1579);
match(CHAN);
- setState(1551);
+ setState(1580);
match(RECEIVE);
}
break;
case 3:
{
- setState(1552);
+ setState(1581);
match(RECEIVE);
- setState(1553);
+ setState(1582);
match(CHAN);
}
break;
}
- setState(1556);
+ setState(1585);
elementType();
}
}
@@ -10514,13 +10668,13 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final FunctionTypeContext functionType() throws RecognitionException {
FunctionTypeContext _localctx = new FunctionTypeContext(_ctx, getState());
- enterRule(_localctx, 296, RULE_functionType);
+ enterRule(_localctx, 300, RULE_functionType);
try {
enterOuterAlt(_localctx, 1);
{
- setState(1558);
+ setState(1587);
match(FUNC);
- setState(1559);
+ setState(1588);
signature();
}
}
@@ -10555,24 +10709,24 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final SignatureContext signature() throws RecognitionException {
SignatureContext _localctx = new SignatureContext(_ctx, getState());
- enterRule(_localctx, 298, RULE_signature);
+ enterRule(_localctx, 302, RULE_signature);
try {
- setState(1565);
+ setState(1594);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,152,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,154,_ctx) ) {
case 1:
enterOuterAlt(_localctx, 1);
{
- setState(1561);
+ setState(1590);
parameters();
- setState(1562);
+ setState(1591);
result();
}
break;
case 2:
enterOuterAlt(_localctx, 2);
{
- setState(1564);
+ setState(1593);
parameters();
}
break;
@@ -10609,22 +10763,22 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final ResultContext result() throws RecognitionException {
ResultContext _localctx = new ResultContext(_ctx, getState());
- enterRule(_localctx, 300, RULE_result);
+ enterRule(_localctx, 304, RULE_result);
try {
- setState(1569);
+ setState(1598);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,153,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,155,_ctx) ) {
case 1:
enterOuterAlt(_localctx, 1);
{
- setState(1567);
+ setState(1596);
parameters();
}
break;
case 2:
enterOuterAlt(_localctx, 2);
{
- setState(1568);
+ setState(1597);
type_();
}
break;
@@ -10667,45 +10821,45 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final ParametersContext parameters() throws RecognitionException {
ParametersContext _localctx = new ParametersContext(_ctx, getState());
- enterRule(_localctx, 302, RULE_parameters);
+ enterRule(_localctx, 306, RULE_parameters);
int _la;
try {
int _alt;
enterOuterAlt(_localctx, 1);
{
- setState(1571);
+ setState(1600);
match(L_PAREN);
- setState(1583);
+ setState(1612);
_errHandler.sync(this);
_la = _input.LA(1);
- if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << DOM) | (1L << PRED))) != 0) || ((((_la - 74)) & ~0x3f) == 0 && ((1L << (_la - 74)) & ((1L << (FUNC - 74)) | (1L << (INTERFACE - 74)) | (1L << (MAP - 74)) | (1L << (STRUCT - 74)) | (1L << (CHAN - 74)) | (1L << (IDENTIFIER - 74)) | (1L << (L_PAREN - 74)) | (1L << (L_BRACKET - 74)) | (1L << (ELLIPSIS - 74)) | (1L << (STAR - 74)) | (1L << (RECEIVE - 74)))) != 0)) {
+ if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << DOM) | (1L << ADT) | (1L << PRED))) != 0) || ((((_la - 75)) & ~0x3f) == 0 && ((1L << (_la - 75)) & ((1L << (FUNC - 75)) | (1L << (INTERFACE - 75)) | (1L << (MAP - 75)) | (1L << (STRUCT - 75)) | (1L << (CHAN - 75)) | (1L << (IDENTIFIER - 75)) | (1L << (L_PAREN - 75)) | (1L << (L_BRACKET - 75)) | (1L << (ELLIPSIS - 75)) | (1L << (STAR - 75)) | (1L << (RECEIVE - 75)))) != 0)) {
{
- setState(1572);
+ setState(1601);
parameterDecl();
- setState(1577);
+ setState(1606);
_errHandler.sync(this);
- _alt = getInterpreter().adaptivePredict(_input,154,_ctx);
+ _alt = getInterpreter().adaptivePredict(_input,156,_ctx);
while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) {
if ( _alt==1 ) {
{
{
- setState(1573);
+ setState(1602);
match(COMMA);
- setState(1574);
+ setState(1603);
parameterDecl();
}
}
}
- setState(1579);
+ setState(1608);
_errHandler.sync(this);
- _alt = getInterpreter().adaptivePredict(_input,154,_ctx);
+ _alt = getInterpreter().adaptivePredict(_input,156,_ctx);
}
- setState(1581);
+ setState(1610);
_errHandler.sync(this);
_la = _input.LA(1);
if (_la==COMMA) {
{
- setState(1580);
+ setState(1609);
match(COMMA);
}
}
@@ -10713,7 +10867,7 @@ public final ParametersContext parameters() throws RecognitionException {
}
}
- setState(1585);
+ setState(1614);
match(R_PAREN);
}
}
@@ -10751,28 +10905,28 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final ConversionContext conversion() throws RecognitionException {
ConversionContext _localctx = new ConversionContext(_ctx, getState());
- enterRule(_localctx, 304, RULE_conversion);
+ enterRule(_localctx, 308, RULE_conversion);
int _la;
try {
enterOuterAlt(_localctx, 1);
{
- setState(1587);
+ setState(1616);
nonNamedType();
- setState(1588);
+ setState(1617);
match(L_PAREN);
- setState(1589);
+ setState(1618);
expression(0);
- setState(1591);
+ setState(1620);
_errHandler.sync(this);
_la = _input.LA(1);
if (_la==COMMA) {
{
- setState(1590);
+ setState(1619);
match(COMMA);
}
}
- setState(1593);
+ setState(1622);
match(R_PAREN);
}
}
@@ -10809,9 +10963,9 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final NonNamedTypeContext nonNamedType() throws RecognitionException {
NonNamedTypeContext _localctx = new NonNamedTypeContext(_ctx, getState());
- enterRule(_localctx, 306, RULE_nonNamedType);
+ enterRule(_localctx, 310, RULE_nonNamedType);
try {
- setState(1600);
+ setState(1629);
_errHandler.sync(this);
switch (_input.LA(1)) {
case PRED:
@@ -10825,18 +10979,18 @@ public final NonNamedTypeContext nonNamedType() throws RecognitionException {
case RECEIVE:
enterOuterAlt(_localctx, 1);
{
- setState(1595);
+ setState(1624);
typeLit();
}
break;
case L_PAREN:
enterOuterAlt(_localctx, 2);
{
- setState(1596);
+ setState(1625);
match(L_PAREN);
- setState(1597);
+ setState(1626);
nonNamedType();
- setState(1598);
+ setState(1627);
match(R_PAREN);
}
break;
@@ -10880,33 +11034,33 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final OperandContext operand() throws RecognitionException {
OperandContext _localctx = new OperandContext(_ctx, getState());
- enterRule(_localctx, 308, RULE_operand);
+ enterRule(_localctx, 312, RULE_operand);
try {
- setState(1608);
+ setState(1637);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,159,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,161,_ctx) ) {
case 1:
enterOuterAlt(_localctx, 1);
{
- setState(1602);
+ setState(1631);
literal();
}
break;
case 2:
enterOuterAlt(_localctx, 2);
{
- setState(1603);
+ setState(1632);
operandName();
}
break;
case 3:
enterOuterAlt(_localctx, 3);
{
- setState(1604);
+ setState(1633);
match(L_PAREN);
- setState(1605);
+ setState(1634);
expression(0);
- setState(1606);
+ setState(1635);
match(R_PAREN);
}
break;
@@ -10946,9 +11100,9 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final LiteralContext literal() throws RecognitionException {
LiteralContext _localctx = new LiteralContext(_ctx, getState());
- enterRule(_localctx, 310, RULE_literal);
+ enterRule(_localctx, 314, RULE_literal);
try {
- setState(1613);
+ setState(1642);
_errHandler.sync(this);
switch (_input.LA(1)) {
case FLOAT_LIT:
@@ -10965,7 +11119,7 @@ public final LiteralContext literal() throws RecognitionException {
case INTERPRETED_STRING_LIT:
enterOuterAlt(_localctx, 1);
{
- setState(1610);
+ setState(1639);
basicLit();
}
break;
@@ -10976,13 +11130,14 @@ public final LiteralContext literal() throws RecognitionException {
case DICT:
case OPT:
case DOM:
+ case ADT:
case MAP:
case STRUCT:
case IDENTIFIER:
case L_BRACKET:
enterOuterAlt(_localctx, 2);
{
- setState(1611);
+ setState(1640);
compositeLit();
}
break;
@@ -10995,7 +11150,7 @@ public final LiteralContext literal() throws RecognitionException {
case FUNC:
enterOuterAlt(_localctx, 3);
{
- setState(1612);
+ setState(1641);
functionLit();
}
break;
@@ -11034,14 +11189,14 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final IntegerContext integer() throws RecognitionException {
IntegerContext _localctx = new IntegerContext(_ctx, getState());
- enterRule(_localctx, 312, RULE_integer);
+ enterRule(_localctx, 316, RULE_integer);
int _la;
try {
enterOuterAlt(_localctx, 1);
{
- setState(1615);
+ setState(1644);
_la = _input.LA(1);
- if ( !(((((_la - 135)) & ~0x3f) == 0 && ((1L << (_la - 135)) & ((1L << (DECIMAL_LIT - 135)) | (1L << (BINARY_LIT - 135)) | (1L << (OCTAL_LIT - 135)) | (1L << (HEX_LIT - 135)) | (1L << (IMAGINARY_LIT - 135)) | (1L << (RUNE_LIT - 135)))) != 0)) ) {
+ if ( !(((((_la - 136)) & ~0x3f) == 0 && ((1L << (_la - 136)) & ((1L << (DECIMAL_LIT - 136)) | (1L << (BINARY_LIT - 136)) | (1L << (OCTAL_LIT - 136)) | (1L << (HEX_LIT - 136)) | (1L << (IMAGINARY_LIT - 136)) | (1L << (RUNE_LIT - 136)))) != 0)) ) {
_errHandler.recoverInline(this);
}
else {
@@ -11077,11 +11232,11 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final OperandNameContext operandName() throws RecognitionException {
OperandNameContext _localctx = new OperandNameContext(_ctx, getState());
- enterRule(_localctx, 314, RULE_operandName);
+ enterRule(_localctx, 318, RULE_operandName);
try {
enterOuterAlt(_localctx, 1);
{
- setState(1617);
+ setState(1646);
match(IDENTIFIER);
}
}
@@ -11115,15 +11270,15 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final QualifiedIdentContext qualifiedIdent() throws RecognitionException {
QualifiedIdentContext _localctx = new QualifiedIdentContext(_ctx, getState());
- enterRule(_localctx, 316, RULE_qualifiedIdent);
+ enterRule(_localctx, 320, RULE_qualifiedIdent);
try {
enterOuterAlt(_localctx, 1);
{
- setState(1619);
+ setState(1648);
match(IDENTIFIER);
- setState(1620);
+ setState(1649);
match(DOT);
- setState(1621);
+ setState(1650);
match(IDENTIFIER);
}
}
@@ -11158,13 +11313,13 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final CompositeLitContext compositeLit() throws RecognitionException {
CompositeLitContext _localctx = new CompositeLitContext(_ctx, getState());
- enterRule(_localctx, 318, RULE_compositeLit);
+ enterRule(_localctx, 322, RULE_compositeLit);
try {
enterOuterAlt(_localctx, 1);
{
- setState(1623);
+ setState(1652);
literalType();
- setState(1624);
+ setState(1653);
literalValue();
}
}
@@ -11199,26 +11354,26 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final LiteralValueContext literalValue() throws RecognitionException {
LiteralValueContext _localctx = new LiteralValueContext(_ctx, getState());
- enterRule(_localctx, 320, RULE_literalValue);
+ enterRule(_localctx, 324, RULE_literalValue);
int _la;
try {
enterOuterAlt(_localctx, 1);
{
- setState(1626);
+ setState(1655);
match(L_CURLY);
- setState(1631);
+ setState(1660);
_errHandler.sync(this);
_la = _input.LA(1);
- if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FLOAT_LIT) | (1L << TRUE) | (1L << FALSE) | (1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << OLD) | (1L << BEFORE) | (1L << FORALL) | (1L << EXISTS) | (1L << ACCESS) | (1L << UNFOLDING) | (1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << LEN) | (1L << NEW) | (1L << MAKE) | (1L << CAP) | (1L << SOME) | (1L << GET) | (1L << DOM) | (1L << NONE) | (1L << PRED) | (1L << TYPE_OF) | (1L << IS_COMPARABLE) | (1L << WRITEPERM) | (1L << NOPERM))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (TRUSTED - 64)) | (1L << (FUNC - 64)) | (1L << (INTERFACE - 64)) | (1L << (MAP - 64)) | (1L << (STRUCT - 64)) | (1L << (CHAN - 64)) | (1L << (RANGE - 64)) | (1L << (TYPE - 64)) | (1L << (NIL_LIT - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (L_PAREN - 64)) | (1L << (L_CURLY - 64)) | (1L << (L_BRACKET - 64)))) != 0) || ((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & ((1L << (EXCLAMATION - 128)) | (1L << (PLUS - 128)) | (1L << (MINUS - 128)) | (1L << (CARET - 128)) | (1L << (STAR - 128)) | (1L << (AMPERSAND - 128)) | (1L << (RECEIVE - 128)) | (1L << (DECIMAL_LIT - 128)) | (1L << (BINARY_LIT - 128)) | (1L << (OCTAL_LIT - 128)) | (1L << (HEX_LIT - 128)) | (1L << (IMAGINARY_LIT - 128)) | (1L << (RUNE_LIT - 128)) | (1L << (RAW_STRING_LIT - 128)) | (1L << (INTERPRETED_STRING_LIT - 128)))) != 0)) {
+ if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FLOAT_LIT) | (1L << TRUE) | (1L << FALSE) | (1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << OLD) | (1L << BEFORE) | (1L << FORALL) | (1L << EXISTS) | (1L << ACCESS) | (1L << UNFOLDING) | (1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << LEN) | (1L << NEW) | (1L << MAKE) | (1L << CAP) | (1L << SOME) | (1L << GET) | (1L << DOM) | (1L << ADT) | (1L << NONE) | (1L << PRED) | (1L << TYPE_OF) | (1L << IS_COMPARABLE) | (1L << WRITEPERM))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (NOPERM - 64)) | (1L << (TRUSTED - 64)) | (1L << (FUNC - 64)) | (1L << (INTERFACE - 64)) | (1L << (MAP - 64)) | (1L << (STRUCT - 64)) | (1L << (CHAN - 64)) | (1L << (RANGE - 64)) | (1L << (TYPE - 64)) | (1L << (NIL_LIT - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (L_PAREN - 64)) | (1L << (L_CURLY - 64)) | (1L << (L_BRACKET - 64)))) != 0) || ((((_la - 129)) & ~0x3f) == 0 && ((1L << (_la - 129)) & ((1L << (EXCLAMATION - 129)) | (1L << (PLUS - 129)) | (1L << (MINUS - 129)) | (1L << (CARET - 129)) | (1L << (STAR - 129)) | (1L << (AMPERSAND - 129)) | (1L << (RECEIVE - 129)) | (1L << (DECIMAL_LIT - 129)) | (1L << (BINARY_LIT - 129)) | (1L << (OCTAL_LIT - 129)) | (1L << (HEX_LIT - 129)) | (1L << (IMAGINARY_LIT - 129)) | (1L << (RUNE_LIT - 129)) | (1L << (RAW_STRING_LIT - 129)) | (1L << (INTERPRETED_STRING_LIT - 129)))) != 0)) {
{
- setState(1627);
+ setState(1656);
elementList();
- setState(1629);
+ setState(1658);
_errHandler.sync(this);
_la = _input.LA(1);
if (_la==COMMA) {
{
- setState(1628);
+ setState(1657);
match(COMMA);
}
}
@@ -11226,7 +11381,7 @@ public final LiteralValueContext literalValue() throws RecognitionException {
}
}
- setState(1633);
+ setState(1662);
match(R_CURLY);
}
}
@@ -11265,30 +11420,30 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final ElementListContext elementList() throws RecognitionException {
ElementListContext _localctx = new ElementListContext(_ctx, getState());
- enterRule(_localctx, 322, RULE_elementList);
+ enterRule(_localctx, 326, RULE_elementList);
try {
int _alt;
enterOuterAlt(_localctx, 1);
{
- setState(1635);
+ setState(1664);
keyedElement();
- setState(1640);
+ setState(1669);
_errHandler.sync(this);
- _alt = getInterpreter().adaptivePredict(_input,163,_ctx);
+ _alt = getInterpreter().adaptivePredict(_input,165,_ctx);
while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) {
if ( _alt==1 ) {
{
{
- setState(1636);
+ setState(1665);
match(COMMA);
- setState(1637);
+ setState(1666);
keyedElement();
}
}
}
- setState(1642);
+ setState(1671);
_errHandler.sync(this);
- _alt = getInterpreter().adaptivePredict(_input,163,_ctx);
+ _alt = getInterpreter().adaptivePredict(_input,165,_ctx);
}
}
}
@@ -11324,23 +11479,23 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final KeyedElementContext keyedElement() throws RecognitionException {
KeyedElementContext _localctx = new KeyedElementContext(_ctx, getState());
- enterRule(_localctx, 324, RULE_keyedElement);
+ enterRule(_localctx, 328, RULE_keyedElement);
try {
enterOuterAlt(_localctx, 1);
{
- setState(1646);
+ setState(1675);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,164,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,166,_ctx) ) {
case 1:
{
- setState(1643);
+ setState(1672);
key();
- setState(1644);
+ setState(1673);
match(COLON);
}
break;
}
- setState(1648);
+ setState(1677);
element();
}
}
@@ -11375,9 +11530,9 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final KeyContext key() throws RecognitionException {
KeyContext _localctx = new KeyContext(_ctx, getState());
- enterRule(_localctx, 326, RULE_key);
+ enterRule(_localctx, 330, RULE_key);
try {
- setState(1652);
+ setState(1681);
_errHandler.sync(this);
switch (_input.LA(1)) {
case FLOAT_LIT:
@@ -11407,6 +11562,7 @@ public final KeyContext key() throws RecognitionException {
case SOME:
case GET:
case DOM:
+ case ADT:
case NONE:
case PRED:
case TYPE_OF:
@@ -11442,14 +11598,14 @@ public final KeyContext key() throws RecognitionException {
case INTERPRETED_STRING_LIT:
enterOuterAlt(_localctx, 1);
{
- setState(1650);
+ setState(1679);
expression(0);
}
break;
case L_CURLY:
enterOuterAlt(_localctx, 2);
{
- setState(1651);
+ setState(1680);
literalValue();
}
break;
@@ -11488,9 +11644,9 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final ElementContext element() throws RecognitionException {
ElementContext _localctx = new ElementContext(_ctx, getState());
- enterRule(_localctx, 328, RULE_element);
+ enterRule(_localctx, 332, RULE_element);
try {
- setState(1656);
+ setState(1685);
_errHandler.sync(this);
switch (_input.LA(1)) {
case FLOAT_LIT:
@@ -11520,6 +11676,7 @@ public final ElementContext element() throws RecognitionException {
case SOME:
case GET:
case DOM:
+ case ADT:
case NONE:
case PRED:
case TYPE_OF:
@@ -11555,14 +11712,14 @@ public final ElementContext element() throws RecognitionException {
case INTERPRETED_STRING_LIT:
enterOuterAlt(_localctx, 1);
{
- setState(1654);
+ setState(1683);
expression(0);
}
break;
case L_CURLY:
enterOuterAlt(_localctx, 2);
{
- setState(1655);
+ setState(1684);
literalValue();
}
break;
@@ -11610,32 +11767,32 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final StructTypeContext structType() throws RecognitionException {
StructTypeContext _localctx = new StructTypeContext(_ctx, getState());
- enterRule(_localctx, 330, RULE_structType);
+ enterRule(_localctx, 334, RULE_structType);
int _la;
try {
enterOuterAlt(_localctx, 1);
{
- setState(1658);
+ setState(1687);
match(STRUCT);
- setState(1659);
+ setState(1688);
match(L_CURLY);
- setState(1665);
+ setState(1694);
_errHandler.sync(this);
_la = _input.LA(1);
while (_la==IDENTIFIER || _la==STAR) {
{
{
- setState(1660);
+ setState(1689);
fieldDecl();
- setState(1661);
+ setState(1690);
eos();
}
}
- setState(1667);
+ setState(1696);
_errHandler.sync(this);
_la = _input.LA(1);
}
- setState(1668);
+ setState(1697);
match(R_CURLY);
}
}
@@ -11677,34 +11834,34 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final FieldDeclContext fieldDecl() throws RecognitionException {
FieldDeclContext _localctx = new FieldDeclContext(_ctx, getState());
- enterRule(_localctx, 332, RULE_fieldDecl);
+ enterRule(_localctx, 336, RULE_fieldDecl);
try {
enterOuterAlt(_localctx, 1);
{
- setState(1674);
+ setState(1703);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,168,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,170,_ctx) ) {
case 1:
{
- setState(1670);
+ setState(1699);
identifierList();
- setState(1671);
+ setState(1700);
type_();
}
break;
case 2:
{
- setState(1673);
+ setState(1702);
embeddedField();
}
break;
}
- setState(1677);
+ setState(1706);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,169,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,171,_ctx) ) {
case 1:
{
- setState(1676);
+ setState(1705);
((FieldDeclContext)_localctx).tag = string_();
}
break;
@@ -11738,12 +11895,12 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final String_Context string_() throws RecognitionException {
String_Context _localctx = new String_Context(_ctx, getState());
- enterRule(_localctx, 334, RULE_string_);
+ enterRule(_localctx, 338, RULE_string_);
int _la;
try {
enterOuterAlt(_localctx, 1);
{
- setState(1679);
+ setState(1708);
_la = _input.LA(1);
if ( !(_la==RAW_STRING_LIT || _la==INTERPRETED_STRING_LIT) ) {
_errHandler.recoverInline(this);
@@ -11784,22 +11941,22 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final EmbeddedFieldContext embeddedField() throws RecognitionException {
EmbeddedFieldContext _localctx = new EmbeddedFieldContext(_ctx, getState());
- enterRule(_localctx, 336, RULE_embeddedField);
+ enterRule(_localctx, 340, RULE_embeddedField);
int _la;
try {
enterOuterAlt(_localctx, 1);
{
- setState(1682);
+ setState(1711);
_errHandler.sync(this);
_la = _input.LA(1);
if (_la==STAR) {
{
- setState(1681);
+ setState(1710);
match(STAR);
}
}
- setState(1684);
+ setState(1713);
typeName();
}
}
@@ -11833,15 +11990,15 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final IndexContext index() throws RecognitionException {
IndexContext _localctx = new IndexContext(_ctx, getState());
- enterRule(_localctx, 338, RULE_index);
+ enterRule(_localctx, 342, RULE_index);
try {
enterOuterAlt(_localctx, 1);
{
- setState(1686);
+ setState(1715);
match(L_BRACKET);
- setState(1687);
+ setState(1716);
expression(0);
- setState(1688);
+ setState(1717);
match(R_BRACKET);
}
}
@@ -11876,17 +12033,17 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final TypeAssertionContext typeAssertion() throws RecognitionException {
TypeAssertionContext _localctx = new TypeAssertionContext(_ctx, getState());
- enterRule(_localctx, 340, RULE_typeAssertion);
+ enterRule(_localctx, 344, RULE_typeAssertion);
try {
enterOuterAlt(_localctx, 1);
{
- setState(1690);
+ setState(1719);
match(DOT);
- setState(1691);
+ setState(1720);
match(L_PAREN);
- setState(1692);
+ setState(1721);
type_();
- setState(1693);
+ setState(1722);
match(R_PAREN);
}
}
@@ -11928,39 +12085,39 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final ArgumentsContext arguments() throws RecognitionException {
ArgumentsContext _localctx = new ArgumentsContext(_ctx, getState());
- enterRule(_localctx, 342, RULE_arguments);
+ enterRule(_localctx, 346, RULE_arguments);
int _la;
try {
enterOuterAlt(_localctx, 1);
{
- setState(1695);
+ setState(1724);
match(L_PAREN);
- setState(1710);
+ setState(1739);
_errHandler.sync(this);
_la = _input.LA(1);
- if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FLOAT_LIT) | (1L << TRUE) | (1L << FALSE) | (1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << OLD) | (1L << BEFORE) | (1L << FORALL) | (1L << EXISTS) | (1L << ACCESS) | (1L << UNFOLDING) | (1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << LEN) | (1L << NEW) | (1L << MAKE) | (1L << CAP) | (1L << SOME) | (1L << GET) | (1L << DOM) | (1L << NONE) | (1L << PRED) | (1L << TYPE_OF) | (1L << IS_COMPARABLE) | (1L << WRITEPERM) | (1L << NOPERM))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (TRUSTED - 64)) | (1L << (FUNC - 64)) | (1L << (INTERFACE - 64)) | (1L << (MAP - 64)) | (1L << (STRUCT - 64)) | (1L << (CHAN - 64)) | (1L << (RANGE - 64)) | (1L << (TYPE - 64)) | (1L << (NIL_LIT - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (L_PAREN - 64)) | (1L << (L_BRACKET - 64)))) != 0) || ((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & ((1L << (EXCLAMATION - 128)) | (1L << (PLUS - 128)) | (1L << (MINUS - 128)) | (1L << (CARET - 128)) | (1L << (STAR - 128)) | (1L << (AMPERSAND - 128)) | (1L << (RECEIVE - 128)) | (1L << (DECIMAL_LIT - 128)) | (1L << (BINARY_LIT - 128)) | (1L << (OCTAL_LIT - 128)) | (1L << (HEX_LIT - 128)) | (1L << (IMAGINARY_LIT - 128)) | (1L << (RUNE_LIT - 128)) | (1L << (RAW_STRING_LIT - 128)) | (1L << (INTERPRETED_STRING_LIT - 128)))) != 0)) {
+ if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FLOAT_LIT) | (1L << TRUE) | (1L << FALSE) | (1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << OLD) | (1L << BEFORE) | (1L << FORALL) | (1L << EXISTS) | (1L << ACCESS) | (1L << UNFOLDING) | (1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << LEN) | (1L << NEW) | (1L << MAKE) | (1L << CAP) | (1L << SOME) | (1L << GET) | (1L << DOM) | (1L << ADT) | (1L << NONE) | (1L << PRED) | (1L << TYPE_OF) | (1L << IS_COMPARABLE) | (1L << WRITEPERM))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (NOPERM - 64)) | (1L << (TRUSTED - 64)) | (1L << (FUNC - 64)) | (1L << (INTERFACE - 64)) | (1L << (MAP - 64)) | (1L << (STRUCT - 64)) | (1L << (CHAN - 64)) | (1L << (RANGE - 64)) | (1L << (TYPE - 64)) | (1L << (NIL_LIT - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (L_PAREN - 64)) | (1L << (L_BRACKET - 64)))) != 0) || ((((_la - 129)) & ~0x3f) == 0 && ((1L << (_la - 129)) & ((1L << (EXCLAMATION - 129)) | (1L << (PLUS - 129)) | (1L << (MINUS - 129)) | (1L << (CARET - 129)) | (1L << (STAR - 129)) | (1L << (AMPERSAND - 129)) | (1L << (RECEIVE - 129)) | (1L << (DECIMAL_LIT - 129)) | (1L << (BINARY_LIT - 129)) | (1L << (OCTAL_LIT - 129)) | (1L << (HEX_LIT - 129)) | (1L << (IMAGINARY_LIT - 129)) | (1L << (RUNE_LIT - 129)) | (1L << (RAW_STRING_LIT - 129)) | (1L << (INTERPRETED_STRING_LIT - 129)))) != 0)) {
{
- setState(1702);
+ setState(1731);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,172,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,174,_ctx) ) {
case 1:
{
- setState(1696);
+ setState(1725);
expressionList();
}
break;
case 2:
{
- setState(1697);
+ setState(1726);
nonNamedType();
- setState(1700);
+ setState(1729);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,171,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,173,_ctx) ) {
case 1:
{
- setState(1698);
+ setState(1727);
match(COMMA);
- setState(1699);
+ setState(1728);
expressionList();
}
break;
@@ -11968,22 +12125,22 @@ public final ArgumentsContext arguments() throws RecognitionException {
}
break;
}
- setState(1705);
+ setState(1734);
_errHandler.sync(this);
_la = _input.LA(1);
if (_la==ELLIPSIS) {
{
- setState(1704);
+ setState(1733);
match(ELLIPSIS);
}
}
- setState(1708);
+ setState(1737);
_errHandler.sync(this);
_la = _input.LA(1);
if (_la==COMMA) {
{
- setState(1707);
+ setState(1736);
match(COMMA);
}
}
@@ -11991,7 +12148,7 @@ public final ArgumentsContext arguments() throws RecognitionException {
}
}
- setState(1712);
+ setState(1741);
match(R_PAREN);
}
}
@@ -12025,15 +12182,15 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final MethodExprContext methodExpr() throws RecognitionException {
MethodExprContext _localctx = new MethodExprContext(_ctx, getState());
- enterRule(_localctx, 344, RULE_methodExpr);
+ enterRule(_localctx, 348, RULE_methodExpr);
try {
enterOuterAlt(_localctx, 1);
{
- setState(1714);
+ setState(1743);
nonNamedType();
- setState(1715);
+ setState(1744);
match(DOT);
- setState(1716);
+ setState(1745);
match(IDENTIFIER);
}
}
@@ -12065,11 +12222,11 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final ReceiverTypeContext receiverType() throws RecognitionException {
ReceiverTypeContext _localctx = new ReceiverTypeContext(_ctx, getState());
- enterRule(_localctx, 346, RULE_receiverType);
+ enterRule(_localctx, 350, RULE_receiverType);
try {
enterOuterAlt(_localctx, 1);
{
- setState(1718);
+ setState(1747);
type_();
}
}
@@ -12101,36 +12258,36 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final EosContext eos() throws RecognitionException {
EosContext _localctx = new EosContext(_ctx, getState());
- enterRule(_localctx, 348, RULE_eos);
+ enterRule(_localctx, 352, RULE_eos);
try {
- setState(1724);
+ setState(1753);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,176,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,178,_ctx) ) {
case 1:
enterOuterAlt(_localctx, 1);
{
- setState(1720);
+ setState(1749);
match(SEMI);
}
break;
case 2:
enterOuterAlt(_localctx, 2);
{
- setState(1721);
+ setState(1750);
match(EOF);
}
break;
case 3:
enterOuterAlt(_localctx, 3);
{
- setState(1722);
+ setState(1751);
match(EOS);
}
break;
case 4:
enterOuterAlt(_localctx, 4);
{
- setState(1723);
+ setState(1752);
if (!(closingBracket())) throw new FailedPredicateException(this, "closingBracket()");
}
break;
@@ -12149,11 +12306,11 @@ public final EosContext eos() throws RecognitionException {
public boolean sempred(RuleContext _localctx, int ruleIndex, int predIndex) {
switch (ruleIndex) {
- case 72:
+ case 74:
return expression_sempred((ExpressionContext)_localctx, predIndex);
- case 80:
+ case 82:
return primaryExpr_sempred((PrimaryExprContext)_localctx, predIndex);
- case 174:
+ case 176:
return eos_sempred((EosContext)_localctx, predIndex);
}
return true;
@@ -12213,7 +12370,7 @@ private boolean eos_sempred(EosContext _localctx, int predIndex) {
}
public static final String _serializedATN =
- "\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\3\u009f\u06c1\4\2\t"+
+ "\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\3\u00a0\u06de\4\2\t"+
"\2\4\3\t\3\4\4\t\4\4\5\t\5\4\6\t\6\4\7\t\7\4\b\t\b\4\t\t\t\4\n\t\n\4\13"+
"\t\13\4\f\t\f\4\r\t\r\4\16\t\16\4\17\t\17\4\20\t\20\4\21\t\21\4\22\t\22"+
"\4\23\t\23\4\24\t\24\4\25\t\25\4\26\t\26\4\27\t\27\4\30\t\30\4\31\t\31"+
@@ -12237,117 +12394,120 @@ private boolean eos_sempred(EosContext _localctx, int predIndex) {
"\t\u00a0\4\u00a1\t\u00a1\4\u00a2\t\u00a2\4\u00a3\t\u00a3\4\u00a4\t\u00a4"+
"\4\u00a5\t\u00a5\4\u00a6\t\u00a6\4\u00a7\t\u00a7\4\u00a8\t\u00a8\4\u00a9"+
"\t\u00a9\4\u00aa\t\u00aa\4\u00ab\t\u00ab\4\u00ac\t\u00ac\4\u00ad\t\u00ad"+
- "\4\u00ae\t\u00ae\4\u00af\t\u00af\4\u00b0\t\u00b0\3\2\3\2\3\2\3\3\3\3\3"+
- "\3\3\4\3\4\3\4\3\5\3\5\3\5\7\5\u016d\n\5\f\5\16\5\u0170\13\5\3\6\3\6\5"+
- "\6\u0174\n\6\3\7\3\7\3\7\7\7\u0179\n\7\f\7\16\7\u017c\13\7\3\7\3\7\3\7"+
- "\3\7\3\7\7\7\u0183\n\7\f\7\16\7\u0186\13\7\3\7\3\7\3\7\5\7\u018b\n\7\3"+
- "\7\3\7\7\7\u018f\n\7\f\7\16\7\u0192\13\7\3\7\3\7\3\b\3\b\3\b\3\t\3\t\3"+
- "\t\3\n\3\n\3\n\7\n\u019f\n\n\f\n\16\n\u01a2\13\n\3\n\5\n\u01a5\n\n\3\n"+
- "\3\n\3\13\3\13\3\13\7\13\u01ac\n\13\f\13\16\13\u01af\13\13\3\13\3\13\3"+
- "\13\3\13\3\13\3\13\3\13\7\13\u01b8\n\13\f\13\16\13\u01bb\13\13\3\13\5"+
- "\13\u01be\n\13\3\f\3\f\3\f\3\f\5\f\u01c4\n\f\3\r\3\r\3\r\3\r\3\r\3\r\5"+
- "\r\u01cc\n\r\3\16\3\16\3\17\3\17\3\17\3\20\3\20\3\20\5\20\u01d6\n\20\3"+
- "\20\3\20\3\21\3\21\3\21\3\21\3\21\3\21\3\21\3\21\3\21\3\21\3\21\3\21\5"+
- "\21\u01e6\n\21\3\22\3\22\3\23\3\23\3\23\3\23\3\23\3\24\3\24\3\24\7\24"+
- "\u01f2\n\24\f\24\16\24\u01f5\13\24\3\24\5\24\u01f8\n\24\3\25\3\25\3\25"+
- "\7\25\u01fd\n\25\f\25\16\25\u0200\13\25\3\25\3\25\3\26\7\26\u0205\n\26"+
- "\f\26\16\26\u0208\13\26\3\27\3\27\3\27\3\27\7\27\u020e\n\27\f\27\16\27"+
- "\u0211\13\27\3\27\3\27\3\30\3\30\3\31\3\31\3\31\3\31\3\31\3\32\3\32\3"+
- "\32\3\32\3\32\3\33\3\33\3\33\3\33\3\33\3\34\3\34\3\34\3\34\3\34\3\35\3"+
- "\35\3\35\3\35\3\35\5\35\u0230\n\35\3\35\3\35\3\35\3\35\3\36\3\36\5\36"+
- "\u0238\n\36\3\37\3\37\3 \3 \3 \3 \3 \3!\3!\3!\3!\3!\3\"\3\"\3\"\3\"\3"+
- "\"\3#\3#\3#\3#\3#\5#\u0250\n#\3#\3#\3$\3$\3$\3$\3$\3$\3$\3%\3%\3%\3%\7"+
- "%\u025f\n%\f%\16%\u0262\13%\3%\3%\3&\3&\3&\3&\3\'\3\'\3\'\5\'\u026d\n"+
- "\'\3(\3(\3(\3(\3(\7(\u0274\n(\f(\16(\u0277\13(\3(\3(\3)\3)\3)\3)\3)\3"+
- ")\3)\3)\3)\5)\u0284\n)\3*\3*\3*\3*\3*\3+\3+\3+\3+\3+\3+\3+\3+\3+\3+\3"+
- "+\5+\u0296\n+\3,\3,\3,\3,\3,\5,\u029d\n,\3,\7,\u02a0\n,\f,\16,\u02a3\13"+
- ",\3,\3,\5,\u02a7\n,\3-\3-\3-\3-\3-\3-\3-\3-\5-\u02b1\n-\3.\5.\u02b4\n"+
- ".\3.\3.\5.\u02b8\n.\3/\3/\5/\u02bc\n/\3\60\3\60\3\60\3\60\3\60\5\60\u02c3"+
- "\n\60\3\60\5\60\u02c6\n\60\3\60\3\60\3\61\3\61\5\61\u02cc\n\61\3\61\3"+
- "\61\3\61\5\61\u02d1\n\61\5\61\u02d3\n\61\3\61\5\61\u02d6\n\61\3\62\3\62"+
- "\3\62\7\62\u02db\n\62\f\62\16\62\u02de\13\62\3\63\3\63\5\63\u02e2\n\63"+
- "\3\63\3\63\3\64\3\64\3\64\3\64\3\64\3\64\3\65\3\65\3\65\3\65\3\65\3\65"+
- "\3\65\7\65\u02f3\n\65\f\65\16\65\u02f6\13\65\3\65\3\65\3\65\7\65\u02fb"+
- "\n\65\f\65\16\65\u02fe\13\65\3\65\5\65\u0301\n\65\3\66\5\66\u0304\n\66"+
- "\3\66\3\66\3\66\3\66\5\66\u030a\n\66\3\67\3\67\5\67\u030e\n\67\3\67\5"+
- "\67\u0311\n\67\3\67\3\67\3\67\38\38\38\38\38\58\u031b\n8\39\39\39\39\3"+
- "9\59\u0322\n9\3:\3:\3:\3:\3:\5:\u0329\n:\3:\3:\3;\3;\3;\3;\3;\3<\3<\3"+
- "<\5<\u0335\n<\3=\3=\3=\3=\5=\u033b\n=\3>\3>\3>\3>\3>\5>\u0342\n>\3?\3"+
- "?\3?\5?\u0347\n?\3@\3@\3@\3@\5@\u034d\n@\3A\3A\3A\3A\3A\3B\3B\3B\3B\3"+
- "B\5B\u0359\nB\3C\3C\3C\3C\5C\u035f\nC\3C\3C\5C\u0363\nC\3D\3D\3D\3D\3"+
- "E\3E\5E\u036b\nE\3E\3E\5E\u036f\nE\3E\3E\3F\3F\5F\u0375\nF\3G\5G\u0378"+
- "\nG\3G\3G\3H\3H\5H\u037e\nH\3H\3H\3I\5I\u0383\nI\3I\3I\3J\3J\3J\3J\3J"+
- "\3J\3J\3J\3J\3J\3J\3J\3J\3J\3J\3J\5J\u0397\nJ\3J\3J\3J\3J\3J\3J\3J\3J"+
- "\3J\3J\3J\3J\3J\3J\3J\3J\3J\3J\3J\3J\3J\3J\3J\3J\3J\3J\3J\3J\3J\3J\3J"+
- "\3J\3J\7J\u03ba\nJ\fJ\16J\u03bd\13J\3K\3K\3K\3K\3K\3K\3K\3K\3K\3K\3K\3"+
- "K\3K\3K\3K\3K\3K\3K\3K\3K\5K\u03d3\nK\3L\3L\3L\3M\3M\3M\5M\u03db\nM\3"+
- "N\3N\3N\3O\3O\3O\3O\7O\u03e4\nO\fO\16O\u03e7\13O\3O\3O\3O\3O\5O\u03ed"+
- "\nO\3P\3P\3P\3P\3P\5P\u03f4\nP\3Q\3Q\3Q\3Q\3Q\3Q\3Q\3Q\5Q\u03fe\nQ\3R"+
- "\3R\3R\3R\3R\3R\3R\3R\3R\3R\3R\3R\5R\u040c\nR\3R\3R\3R\3R\3R\3R\3R\3R"+
- "\3R\3R\3R\3R\3R\3R\3R\3R\3R\3R\3R\3R\7R\u0422\nR\fR\16R\u0425\13R\3S\3"+
- "S\3S\3T\3T\5T\u042c\nT\3T\3T\5T\u0430\nT\3U\3U\5U\u0434\nU\3U\5U\u0437"+
- "\nU\3U\3U\3V\3V\3V\3V\3V\5V\u0440\nV\3V\3V\7V\u0444\nV\fV\16V\u0447\13"+
- "V\3V\3V\3W\3W\3W\3W\3X\5X\u0450\nX\3X\3X\3X\3X\3X\3X\5X\u0458\nX\3X\3"+
- "X\3X\3X\5X\u045e\nX\3Y\3Y\3Y\3Y\3Y\3Y\3Y\5Y\u0467\nY\3Z\3Z\3Z\3Z\3Z\3"+
- "Z\3Z\3Z\3Z\5Z\u0472\nZ\3[\3[\3[\3\\\3\\\3\\\3\\\7\\\u047b\n\\\f\\\16\\"+
- "\u047e\13\\\3\\\5\\\u0481\n\\\5\\\u0483\n\\\3\\\3\\\3]\3]\3]\3]\3]\3]"+
- "\3]\5]\u048e\n]\3^\3^\3^\3^\3^\3_\3_\5_\u0497\n_\3_\3_\5_\u049b\n_\3_"+
- "\5_\u049e\n_\3_\3_\3_\3_\3_\5_\u04a5\n_\3_\3_\3`\3`\3a\3a\3b\3b\3c\5c"+
- "\u04b0\nc\3c\3c\3d\3d\3d\3d\3d\3d\5d\u04ba\nd\3d\3d\3d\3d\5d\u04c0\nd"+
- "\5d\u04c2\nd\3e\3e\3e\3f\3f\3g\3g\3g\5g\u04cc\ng\3h\3h\3h\3h\3h\3h\7h"+
- "\u04d4\nh\fh\16h\u04d7\13h\3h\5h\u04da\nh\3i\3i\5i\u04de\ni\3i\3i\5i\u04e2"+
- "\ni\3j\3j\3j\7j\u04e7\nj\fj\16j\u04ea\13j\3k\3k\3k\7k\u04ef\nk\fk\16k"+
- "\u04f2\13k\3l\3l\3l\3l\3l\3l\7l\u04fa\nl\fl\16l\u04fd\13l\3l\5l\u0500"+
- "\nl\3m\3m\5m\u0504\nm\3m\3m\3n\3n\3n\3n\3n\3n\7n\u050e\nn\fn\16n\u0511"+
- "\13n\3n\5n\u0514\nn\3o\3o\5o\u0518\no\3o\3o\3p\5p\u051d\np\3p\3p\3p\6"+
- "p\u0522\np\rp\16p\u0523\3q\3q\3q\3q\3q\5q\u052b\nq\3r\3r\3s\3s\3s\3s\3"+
- "t\3t\3t\3u\3u\3u\3u\3v\3v\3w\3w\3w\5w\u053f\nw\3x\3x\5x\u0543\nx\3y\3"+
- "y\5y\u0547\ny\3z\3z\5z\u054b\nz\3{\3{\3{\3|\3|\3}\3}\3}\3}\3}\3}\3}\3"+
- "}\3}\5}\u055b\n}\3}\3}\3}\3}\5}\u0561\n}\5}\u0563\n}\3~\3~\5~\u0567\n"+
- "~\3\177\3\177\5\177\u056b\n\177\3\177\5\177\u056e\n\177\3\177\3\177\5"+
- "\177\u0572\n\177\5\177\u0574\n\177\3\177\3\177\7\177\u0578\n\177\f\177"+
- "\16\177\u057b\13\177\3\177\3\177\3\u0080\3\u0080\3\u0080\5\u0080\u0582"+
- "\n\u0080\3\u0081\3\u0081\3\u0081\5\u0081\u0587\n\u0081\3\u0082\3\u0082"+
- "\3\u0082\3\u0082\3\u0082\3\u0082\3\u0082\3\u0082\3\u0082\5\u0082\u0592"+
- "\n\u0082\3\u0082\3\u0082\7\u0082\u0596\n\u0082\f\u0082\16\u0082\u0599"+
- "\13\u0082\3\u0082\3\u0082\3\u0083\3\u0083\5\u0083\u059f\n\u0083\3\u0083"+
- "\3\u0083\3\u0083\3\u0083\3\u0083\3\u0083\3\u0084\3\u0084\3\u0084\5\u0084"+
- "\u05aa\n\u0084\3\u0085\3\u0085\3\u0085\5\u0085\u05af\n\u0085\3\u0086\3"+
- "\u0086\5\u0086\u05b3\n\u0086\3\u0086\3\u0086\3\u0086\5\u0086\u05b8\n\u0086"+
- "\7\u0086\u05ba\n\u0086\f\u0086\16\u0086\u05bd\13\u0086\3\u0087\3\u0087"+
- "\3\u0087\7\u0087\u05c2\n\u0087\f\u0087\16\u0087\u05c5\13\u0087\3\u0087"+
- "\3\u0087\3\u0088\3\u0088\3\u0088\5\u0088\u05cc\n\u0088\3\u0089\3\u0089"+
- "\3\u0089\5\u0089\u05d1\n\u0089\3\u0089\5\u0089\u05d4\n\u0089\3\u008a\3"+
- "\u008a\3\u008a\3\u008a\3\u008a\3\u008a\5\u008a\u05dc\n\u008a\3\u008a\3"+
- "\u008a\3\u008b\3\u008b\3\u008b\3\u008b\5\u008b\u05e4\n\u008b\3\u008b\3"+
- "\u008b\3\u008c\5\u008c\u05e9\n\u008c\3\u008c\3\u008c\5\u008c\u05ed\n\u008c"+
- "\3\u008c\3\u008c\5\u008c\u05f1\n\u008c\3\u008d\3\u008d\3\u008d\3\u008e"+
- "\3\u008e\5\u008e\u05f8\n\u008e\3\u008f\3\u008f\3\u008f\3\u008f\3\u008f"+
- "\3\u0090\3\u0090\3\u0091\3\u0091\3\u0092\3\u0092\3\u0092\3\u0093\3\u0093"+
- "\3\u0093\3\u0093\3\u0094\3\u0094\3\u0094\3\u0094\3\u0094\3\u0094\3\u0095"+
- "\3\u0095\3\u0095\3\u0095\3\u0095\5\u0095\u0615\n\u0095\3\u0095\3\u0095"+
- "\3\u0096\3\u0096\3\u0096\3\u0097\3\u0097\3\u0097\3\u0097\5\u0097\u0620"+
- "\n\u0097\3\u0098\3\u0098\5\u0098\u0624\n\u0098\3\u0099\3\u0099\3\u0099"+
- "\3\u0099\7\u0099\u062a\n\u0099\f\u0099\16\u0099\u062d\13\u0099\3\u0099"+
- "\5\u0099\u0630\n\u0099\5\u0099\u0632\n\u0099\3\u0099\3\u0099\3\u009a\3"+
- "\u009a\3\u009a\3\u009a\5\u009a\u063a\n\u009a\3\u009a\3\u009a\3\u009b\3"+
- "\u009b\3\u009b\3\u009b\3\u009b\5\u009b\u0643\n\u009b\3\u009c\3\u009c\3"+
- "\u009c\3\u009c\3\u009c\3\u009c\5\u009c\u064b\n\u009c\3\u009d\3\u009d\3"+
- "\u009d\5\u009d\u0650\n\u009d\3\u009e\3\u009e\3\u009f\3\u009f\3\u00a0\3"+
- "\u00a0\3\u00a0\3\u00a0\3\u00a1\3\u00a1\3\u00a1\3\u00a2\3\u00a2\3\u00a2"+
- "\5\u00a2\u0660\n\u00a2\5\u00a2\u0662\n\u00a2\3\u00a2\3\u00a2\3\u00a3\3"+
- "\u00a3\3\u00a3\7\u00a3\u0669\n\u00a3\f\u00a3\16\u00a3\u066c\13\u00a3\3"+
- "\u00a4\3\u00a4\3\u00a4\5\u00a4\u0671\n\u00a4\3\u00a4\3\u00a4\3\u00a5\3"+
- "\u00a5\5\u00a5\u0677\n\u00a5\3\u00a6\3\u00a6\5\u00a6\u067b\n\u00a6\3\u00a7"+
- "\3\u00a7\3\u00a7\3\u00a7\3\u00a7\7\u00a7\u0682\n\u00a7\f\u00a7\16\u00a7"+
- "\u0685\13\u00a7\3\u00a7\3\u00a7\3\u00a8\3\u00a8\3\u00a8\3\u00a8\5\u00a8"+
- "\u068d\n\u00a8\3\u00a8\5\u00a8\u0690\n\u00a8\3\u00a9\3\u00a9\3\u00aa\5"+
- "\u00aa\u0695\n\u00aa\3\u00aa\3\u00aa\3\u00ab\3\u00ab\3\u00ab\3\u00ab\3"+
- "\u00ac\3\u00ac\3\u00ac\3\u00ac\3\u00ac\3\u00ad\3\u00ad\3\u00ad\3\u00ad"+
- "\3\u00ad\5\u00ad\u06a7\n\u00ad\5\u00ad\u06a9\n\u00ad\3\u00ad\5\u00ad\u06ac"+
- "\n\u00ad\3\u00ad\5\u00ad\u06af\n\u00ad\5\u00ad\u06b1\n\u00ad\3\u00ad\3"+
- "\u00ad\3\u00ae\3\u00ae\3\u00ae\3\u00ae\3\u00af\3\u00af\3\u00b0\3\u00b0"+
- "\3\u00b0\3\u00b0\5\u00b0\u06bf\n\u00b0\3\u00b0\3\u02a1\4\u0092\u00a2\u00b1"+
+ "\4\u00ae\t\u00ae\4\u00af\t\u00af\4\u00b0\t\u00b0\4\u00b1\t\u00b1\4\u00b2"+
+ "\t\u00b2\3\2\3\2\3\2\3\3\3\3\3\3\3\4\3\4\3\4\3\5\3\5\3\5\7\5\u0171\n\5"+
+ "\f\5\16\5\u0174\13\5\3\6\3\6\5\6\u0178\n\6\3\7\3\7\3\7\7\7\u017d\n\7\f"+
+ "\7\16\7\u0180\13\7\3\7\3\7\3\7\3\7\3\7\7\7\u0187\n\7\f\7\16\7\u018a\13"+
+ "\7\3\7\3\7\3\7\5\7\u018f\n\7\3\7\3\7\7\7\u0193\n\7\f\7\16\7\u0196\13\7"+
+ "\3\7\3\7\3\b\3\b\3\b\3\t\3\t\3\t\3\n\3\n\3\n\7\n\u01a3\n\n\f\n\16\n\u01a6"+
+ "\13\n\3\n\5\n\u01a9\n\n\3\n\3\n\3\13\3\13\3\13\7\13\u01b0\n\13\f\13\16"+
+ "\13\u01b3\13\13\3\13\3\13\3\13\3\13\3\13\3\13\3\13\7\13\u01bc\n\13\f\13"+
+ "\16\13\u01bf\13\13\3\13\5\13\u01c2\n\13\3\f\3\f\3\f\3\f\5\f\u01c8\n\f"+
+ "\3\r\3\r\3\r\3\r\3\r\3\r\5\r\u01d0\n\r\3\16\3\16\3\17\3\17\3\17\3\20\3"+
+ "\20\3\20\5\20\u01da\n\20\3\20\3\20\3\21\3\21\3\21\3\21\3\21\3\21\3\21"+
+ "\3\21\3\21\3\21\3\21\3\21\5\21\u01ea\n\21\3\22\3\22\3\23\3\23\3\23\3\23"+
+ "\3\23\3\24\3\24\3\24\7\24\u01f6\n\24\f\24\16\24\u01f9\13\24\3\24\5\24"+
+ "\u01fc\n\24\3\25\3\25\3\25\7\25\u0201\n\25\f\25\16\25\u0204\13\25\3\25"+
+ "\3\25\3\26\7\26\u0209\n\26\f\26\16\26\u020c\13\26\3\27\3\27\3\27\3\27"+
+ "\7\27\u0212\n\27\f\27\16\27\u0215\13\27\3\27\3\27\3\30\3\30\3\31\3\31"+
+ "\3\31\3\31\3\31\3\32\3\32\3\32\3\32\3\32\3\33\3\33\3\33\3\33\3\33\3\34"+
+ "\3\34\3\34\3\34\3\34\3\35\3\35\3\35\3\35\3\35\5\35\u0234\n\35\3\35\3\35"+
+ "\3\35\3\35\3\36\3\36\5\36\u023c\n\36\3\37\3\37\3 \3 \3 \3 \3 \3!\3!\3"+
+ "!\3!\3!\3\"\3\"\3\"\3\"\3\"\3#\3#\3#\3#\3#\5#\u0254\n#\3#\3#\3$\3$\3$"+
+ "\3$\3$\3$\3$\3%\3%\3%\3%\7%\u0263\n%\f%\16%\u0266\13%\3%\3%\3&\3&\3&\3"+
+ "&\3\'\3\'\3\'\3\'\5\'\u0272\n\'\3(\3(\3(\3(\3(\7(\u0279\n(\f(\16(\u027c"+
+ "\13(\3(\3(\3)\3)\3)\3)\3)\3)\3)\3)\3)\5)\u0289\n)\3*\3*\3*\3*\3*\7*\u0290"+
+ "\n*\f*\16*\u0293\13*\3*\3*\3+\3+\3+\3+\3+\7+\u029c\n+\f+\16+\u029f\13"+
+ "+\3+\3+\3,\3,\3,\3,\3,\3-\3-\3-\3-\3-\3-\3-\3-\3-\3-\3-\5-\u02b3\n-\3"+
+ ".\3.\3.\3.\3.\5.\u02ba\n.\3.\7.\u02bd\n.\f.\16.\u02c0\13.\3.\3.\5.\u02c4"+
+ "\n.\3/\3/\3/\3/\3/\3/\3/\3/\5/\u02ce\n/\3\60\5\60\u02d1\n\60\3\60\3\60"+
+ "\5\60\u02d5\n\60\3\61\3\61\5\61\u02d9\n\61\3\62\3\62\3\62\3\62\3\62\5"+
+ "\62\u02e0\n\62\3\62\5\62\u02e3\n\62\3\62\3\62\3\63\3\63\5\63\u02e9\n\63"+
+ "\3\63\3\63\3\63\5\63\u02ee\n\63\5\63\u02f0\n\63\3\63\5\63\u02f3\n\63\3"+
+ "\64\3\64\3\64\7\64\u02f8\n\64\f\64\16\64\u02fb\13\64\3\65\3\65\5\65\u02ff"+
+ "\n\65\3\65\3\65\3\66\3\66\3\66\3\66\3\66\3\66\3\67\3\67\3\67\3\67\3\67"+
+ "\3\67\3\67\7\67\u0310\n\67\f\67\16\67\u0313\13\67\3\67\3\67\3\67\7\67"+
+ "\u0318\n\67\f\67\16\67\u031b\13\67\3\67\5\67\u031e\n\67\38\58\u0321\n"+
+ "8\38\38\38\38\58\u0327\n8\39\39\59\u032b\n9\39\59\u032e\n9\39\39\39\3"+
+ ":\3:\3:\3:\3:\5:\u0338\n:\3;\3;\3;\3;\3;\5;\u033f\n;\3<\3<\3<\3<\3<\5"+
+ "<\u0346\n<\3<\3<\3=\3=\3=\3=\3=\3>\3>\3>\5>\u0352\n>\3?\3?\3?\3?\5?\u0358"+
+ "\n?\3@\3@\3@\3@\3@\5@\u035f\n@\3A\3A\3A\5A\u0364\nA\3B\3B\3B\3B\5B\u036a"+
+ "\nB\3C\3C\3C\3C\3C\3D\3D\3D\3D\3D\5D\u0376\nD\3E\3E\3E\3E\5E\u037c\nE"+
+ "\3E\3E\5E\u0380\nE\3F\3F\3F\3F\3G\3G\5G\u0388\nG\3G\3G\5G\u038c\nG\3G"+
+ "\3G\3H\3H\5H\u0392\nH\3I\5I\u0395\nI\3I\3I\3J\3J\5J\u039b\nJ\3J\3J\3K"+
+ "\5K\u03a0\nK\3K\3K\3L\3L\3L\3L\3L\3L\3L\3L\3L\3L\3L\3L\3L\3L\3L\3L\5L"+
+ "\u03b4\nL\3L\3L\3L\3L\3L\3L\3L\3L\3L\3L\3L\3L\3L\3L\3L\3L\3L\3L\3L\3L"+
+ "\3L\3L\3L\3L\3L\3L\3L\3L\3L\3L\3L\3L\3L\7L\u03d7\nL\fL\16L\u03da\13L\3"+
+ "M\3M\3M\3M\3M\3M\3M\3M\3M\3M\3M\3M\3M\3M\3M\3M\3M\3M\3M\3M\5M\u03f0\n"+
+ "M\3N\3N\3N\3O\3O\3O\5O\u03f8\nO\3P\3P\3P\3Q\3Q\3Q\3Q\7Q\u0401\nQ\fQ\16"+
+ "Q\u0404\13Q\3Q\3Q\3Q\3Q\5Q\u040a\nQ\3R\3R\3R\3R\3R\5R\u0411\nR\3S\3S\3"+
+ "S\3S\3S\3S\3S\3S\5S\u041b\nS\3T\3T\3T\3T\3T\3T\3T\3T\3T\3T\3T\3T\5T\u0429"+
+ "\nT\3T\3T\3T\3T\3T\3T\3T\3T\3T\3T\3T\3T\3T\3T\3T\3T\3T\3T\3T\3T\7T\u043f"+
+ "\nT\fT\16T\u0442\13T\3U\3U\3U\3V\3V\5V\u0449\nV\3V\3V\5V\u044d\nV\3W\3"+
+ "W\5W\u0451\nW\3W\5W\u0454\nW\3W\3W\3X\3X\3X\3X\3X\5X\u045d\nX\3X\3X\7"+
+ "X\u0461\nX\fX\16X\u0464\13X\3X\3X\3Y\3Y\3Y\3Y\3Z\5Z\u046d\nZ\3Z\3Z\3Z"+
+ "\3Z\3Z\3Z\5Z\u0475\nZ\3Z\3Z\3Z\3Z\5Z\u047b\nZ\3[\3[\3[\3[\3[\3[\3[\5["+
+ "\u0484\n[\3\\\3\\\3\\\3\\\3\\\3\\\3\\\3\\\3\\\5\\\u048f\n\\\3]\3]\3]\3"+
+ "^\3^\3^\3^\7^\u0498\n^\f^\16^\u049b\13^\3^\5^\u049e\n^\5^\u04a0\n^\3^"+
+ "\3^\3_\3_\3_\3_\3_\3_\3_\5_\u04ab\n_\3`\3`\3`\3`\3`\3a\3a\5a\u04b4\na"+
+ "\3a\3a\5a\u04b8\na\3a\5a\u04bb\na\3a\3a\3a\3a\3a\5a\u04c2\na\3a\3a\3b"+
+ "\3b\3c\3c\3d\3d\3e\5e\u04cd\ne\3e\3e\3f\3f\3f\3f\3f\3f\5f\u04d7\nf\3f"+
+ "\3f\3f\3f\5f\u04dd\nf\5f\u04df\nf\3g\3g\3g\3h\3h\3i\3i\3i\5i\u04e9\ni"+
+ "\3j\3j\3j\3j\3j\3j\7j\u04f1\nj\fj\16j\u04f4\13j\3j\5j\u04f7\nj\3k\3k\5"+
+ "k\u04fb\nk\3k\3k\5k\u04ff\nk\3l\3l\3l\7l\u0504\nl\fl\16l\u0507\13l\3m"+
+ "\3m\3m\7m\u050c\nm\fm\16m\u050f\13m\3n\3n\3n\3n\3n\3n\7n\u0517\nn\fn\16"+
+ "n\u051a\13n\3n\5n\u051d\nn\3o\3o\5o\u0521\no\3o\3o\3p\3p\3p\3p\3p\3p\7"+
+ "p\u052b\np\fp\16p\u052e\13p\3p\5p\u0531\np\3q\3q\5q\u0535\nq\3q\3q\3r"+
+ "\5r\u053a\nr\3r\3r\3r\6r\u053f\nr\rr\16r\u0540\3s\3s\3s\3s\3s\5s\u0548"+
+ "\ns\3t\3t\3u\3u\3u\3u\3v\3v\3v\3w\3w\3w\3w\3x\3x\3y\3y\3y\5y\u055c\ny"+
+ "\3z\3z\5z\u0560\nz\3{\3{\5{\u0564\n{\3|\3|\5|\u0568\n|\3}\3}\3}\3~\3~"+
+ "\3\177\3\177\3\177\3\177\3\177\3\177\3\177\3\177\3\177\5\177\u0578\n\177"+
+ "\3\177\3\177\3\177\3\177\5\177\u057e\n\177\5\177\u0580\n\177\3\u0080\3"+
+ "\u0080\5\u0080\u0584\n\u0080\3\u0081\3\u0081\5\u0081\u0588\n\u0081\3\u0081"+
+ "\5\u0081\u058b\n\u0081\3\u0081\3\u0081\5\u0081\u058f\n\u0081\5\u0081\u0591"+
+ "\n\u0081\3\u0081\3\u0081\7\u0081\u0595\n\u0081\f\u0081\16\u0081\u0598"+
+ "\13\u0081\3\u0081\3\u0081\3\u0082\3\u0082\3\u0082\5\u0082\u059f\n\u0082"+
+ "\3\u0083\3\u0083\3\u0083\5\u0083\u05a4\n\u0083\3\u0084\3\u0084\3\u0084"+
+ "\3\u0084\3\u0084\3\u0084\3\u0084\3\u0084\3\u0084\5\u0084\u05af\n\u0084"+
+ "\3\u0084\3\u0084\7\u0084\u05b3\n\u0084\f\u0084\16\u0084\u05b6\13\u0084"+
+ "\3\u0084\3\u0084\3\u0085\3\u0085\5\u0085\u05bc\n\u0085\3\u0085\3\u0085"+
+ "\3\u0085\3\u0085\3\u0085\3\u0085\3\u0086\3\u0086\3\u0086\5\u0086\u05c7"+
+ "\n\u0086\3\u0087\3\u0087\3\u0087\5\u0087\u05cc\n\u0087\3\u0088\3\u0088"+
+ "\5\u0088\u05d0\n\u0088\3\u0088\3\u0088\3\u0088\5\u0088\u05d5\n\u0088\7"+
+ "\u0088\u05d7\n\u0088\f\u0088\16\u0088\u05da\13\u0088\3\u0089\3\u0089\3"+
+ "\u0089\7\u0089\u05df\n\u0089\f\u0089\16\u0089\u05e2\13\u0089\3\u0089\3"+
+ "\u0089\3\u008a\3\u008a\3\u008a\5\u008a\u05e9\n\u008a\3\u008b\3\u008b\3"+
+ "\u008b\5\u008b\u05ee\n\u008b\3\u008b\5\u008b\u05f1\n\u008b\3\u008c\3\u008c"+
+ "\3\u008c\3\u008c\3\u008c\3\u008c\5\u008c\u05f9\n\u008c\3\u008c\3\u008c"+
+ "\3\u008d\3\u008d\3\u008d\3\u008d\5\u008d\u0601\n\u008d\3\u008d\3\u008d"+
+ "\3\u008e\5\u008e\u0606\n\u008e\3\u008e\3\u008e\5\u008e\u060a\n\u008e\3"+
+ "\u008e\3\u008e\5\u008e\u060e\n\u008e\3\u008f\3\u008f\3\u008f\3\u0090\3"+
+ "\u0090\5\u0090\u0615\n\u0090\3\u0091\3\u0091\3\u0091\3\u0091\3\u0091\3"+
+ "\u0092\3\u0092\3\u0093\3\u0093\3\u0094\3\u0094\3\u0094\3\u0095\3\u0095"+
+ "\3\u0095\3\u0095\3\u0096\3\u0096\3\u0096\3\u0096\3\u0096\3\u0096\3\u0097"+
+ "\3\u0097\3\u0097\3\u0097\3\u0097\5\u0097\u0632\n\u0097\3\u0097\3\u0097"+
+ "\3\u0098\3\u0098\3\u0098\3\u0099\3\u0099\3\u0099\3\u0099\5\u0099\u063d"+
+ "\n\u0099\3\u009a\3\u009a\5\u009a\u0641\n\u009a\3\u009b\3\u009b\3\u009b"+
+ "\3\u009b\7\u009b\u0647\n\u009b\f\u009b\16\u009b\u064a\13\u009b\3\u009b"+
+ "\5\u009b\u064d\n\u009b\5\u009b\u064f\n\u009b\3\u009b\3\u009b\3\u009c\3"+
+ "\u009c\3\u009c\3\u009c\5\u009c\u0657\n\u009c\3\u009c\3\u009c\3\u009d\3"+
+ "\u009d\3\u009d\3\u009d\3\u009d\5\u009d\u0660\n\u009d\3\u009e\3\u009e\3"+
+ "\u009e\3\u009e\3\u009e\3\u009e\5\u009e\u0668\n\u009e\3\u009f\3\u009f\3"+
+ "\u009f\5\u009f\u066d\n\u009f\3\u00a0\3\u00a0\3\u00a1\3\u00a1\3\u00a2\3"+
+ "\u00a2\3\u00a2\3\u00a2\3\u00a3\3\u00a3\3\u00a3\3\u00a4\3\u00a4\3\u00a4"+
+ "\5\u00a4\u067d\n\u00a4\5\u00a4\u067f\n\u00a4\3\u00a4\3\u00a4\3\u00a5\3"+
+ "\u00a5\3\u00a5\7\u00a5\u0686\n\u00a5\f\u00a5\16\u00a5\u0689\13\u00a5\3"+
+ "\u00a6\3\u00a6\3\u00a6\5\u00a6\u068e\n\u00a6\3\u00a6\3\u00a6\3\u00a7\3"+
+ "\u00a7\5\u00a7\u0694\n\u00a7\3\u00a8\3\u00a8\5\u00a8\u0698\n\u00a8\3\u00a9"+
+ "\3\u00a9\3\u00a9\3\u00a9\3\u00a9\7\u00a9\u069f\n\u00a9\f\u00a9\16\u00a9"+
+ "\u06a2\13\u00a9\3\u00a9\3\u00a9\3\u00aa\3\u00aa\3\u00aa\3\u00aa\5\u00aa"+
+ "\u06aa\n\u00aa\3\u00aa\5\u00aa\u06ad\n\u00aa\3\u00ab\3\u00ab\3\u00ac\5"+
+ "\u00ac\u06b2\n\u00ac\3\u00ac\3\u00ac\3\u00ad\3\u00ad\3\u00ad\3\u00ad\3"+
+ "\u00ae\3\u00ae\3\u00ae\3\u00ae\3\u00ae\3\u00af\3\u00af\3\u00af\3\u00af"+
+ "\3\u00af\5\u00af\u06c4\n\u00af\5\u00af\u06c6\n\u00af\3\u00af\5\u00af\u06c9"+
+ "\n\u00af\3\u00af\5\u00af\u06cc\n\u00af\5\u00af\u06ce\n\u00af\3\u00af\3"+
+ "\u00af\3\u00b0\3\u00b0\3\u00b0\3\u00b0\3\u00b1\3\u00b1\3\u00b2\3\u00b2"+
+ "\3\u00b2\3\u00b2\5\u00b2\u06dc\n\u00b2\3\u00b2\3\u02be\4\u0096\u00a6\u00b3"+
"\2\4\6\b\n\f\16\20\22\24\26\30\32\34\36 \"$&(*,.\60\62\64\668:<>@BDFH"+
"JLNPRTVXZ\\^`bdfhjlnprtvxz|~\u0080\u0082\u0084\u0086\u0088\u008a\u008c"+
"\u008e\u0090\u0092\u0094\u0096\u0098\u009a\u009c\u009e\u00a0\u00a2\u00a4"+
@@ -12358,550 +12518,559 @@ private boolean eos_sempred(EosContext _localctx, int predIndex) {
"\u0106\u0108\u010a\u010c\u010e\u0110\u0112\u0114\u0116\u0118\u011a\u011c"+
"\u011e\u0120\u0122\u0124\u0126\u0128\u012a\u012c\u012e\u0130\u0132\u0134"+
"\u0136\u0138\u013a\u013c\u013e\u0140\u0142\u0144\u0146\u0148\u014a\u014c"+
- "\u014e\u0150\u0152\u0154\u0156\u0158\u015a\u015c\u015e\2\25\4\2ddoo\3"+
- "\2\31\32\3\2\7\n\3\2@A\3\2)+\4\2)+--\3\2\u0082\u0088\3\2\26\27\4\2}\u0081"+
- "\u0086\u0087\6\2$$pp||\u0083\u0085\3\2 \"\3\2\35\37\4\2GHv{\6\2..\61\61"+
- "\64\64\\\\\4\2|\u0081\u0083\u0087\3\2pq\4\2mm\u009e\u009e\4\2\u0089\u008c"+
- "\u008e\u008f\3\2\u0095\u0096\2\u071f\2\u0160\3\2\2\2\4\u0163\3\2\2\2\6"+
- "\u0166\3\2\2\2\b\u0169\3\2\2\2\n\u0171\3\2\2\2\f\u017a\3\2\2\2\16\u0195"+
- "\3\2\2\2\20\u0198\3\2\2\2\22\u01a0\3\2\2\2\24\u01ad\3\2\2\2\26\u01c3\3"+
- "\2\2\2\30\u01cb\3\2\2\2\32\u01cd\3\2\2\2\34\u01cf\3\2\2\2\36\u01d2\3\2"+
- "\2\2 \u01e5\3\2\2\2\"\u01e7\3\2\2\2$\u01e9\3\2\2\2&\u01ee\3\2\2\2(\u01f9"+
- "\3\2\2\2*\u0206\3\2\2\2,\u0209\3\2\2\2.\u0214\3\2\2\2\60\u0216\3\2\2\2"+
- "\62\u021b\3\2\2\2\64\u0220\3\2\2\2\66\u0225\3\2\2\28\u022a\3\2\2\2:\u0237"+
- "\3\2\2\2<\u0239\3\2\2\2>\u023b\3\2\2\2@\u0240\3\2\2\2B\u0245\3\2\2\2D"+
- "\u024a\3\2\2\2F\u0253\3\2\2\2H\u025a\3\2\2\2J\u0265\3\2\2\2L\u026c\3\2"+
- "\2\2N\u026e\3\2\2\2P\u0283\3\2\2\2R\u0285\3\2\2\2T\u0295\3\2\2\2V\u02a1"+
- "\3\2\2\2X\u02b0\3\2\2\2Z\u02b3\3\2\2\2\\\u02bb\3\2\2\2^\u02bd\3\2\2\2"+
- "`\u02cb\3\2\2\2b\u02d7\3\2\2\2d\u02e1\3\2\2\2f\u02e5\3\2\2\2h\u02eb\3"+
- "\2\2\2j\u0303\3\2\2\2l\u030b\3\2\2\2n\u031a\3\2\2\2p\u031c\3\2\2\2r\u0323"+
- "\3\2\2\2t\u032c\3\2\2\2v\u0331\3\2\2\2x\u0336\3\2\2\2z\u033c\3\2\2\2|"+
- "\u0343\3\2\2\2~\u0348\3\2\2\2\u0080\u034e\3\2\2\2\u0082\u0353\3\2\2\2"+
- "\u0084\u035a\3\2\2\2\u0086\u0364\3\2\2\2\u0088\u0368\3\2\2\2\u008a\u0374"+
- "\3\2\2\2\u008c\u0377\3\2\2\2\u008e\u037b\3\2\2\2\u0090\u0382\3\2\2\2\u0092"+
- "\u0396\3\2\2\2\u0094\u03d2\3\2\2\2\u0096\u03d4\3\2\2\2\u0098\u03d7\3\2"+
- "\2\2\u009a\u03dc\3\2\2\2\u009c\u03e5\3\2\2\2\u009e\u03f3\3\2\2\2\u00a0"+
- "\u03fd\3\2\2\2\u00a2\u040b\3\2\2\2\u00a4\u0426\3\2\2\2\u00a6\u0429\3\2"+
- "\2\2\u00a8\u0431\3\2\2\2\u00aa\u043a\3\2\2\2\u00ac\u044a\3\2\2\2\u00ae"+
- "\u045d\3\2\2\2\u00b0\u0466\3\2\2\2\u00b2\u0471\3\2\2\2\u00b4\u0473\3\2"+
- "\2\2\u00b6\u0476\3\2\2\2\u00b8\u048d\3\2\2\2\u00ba\u048f\3\2\2\2\u00bc"+
- "\u0494\3\2\2\2\u00be\u04a8\3\2\2\2\u00c0\u04aa\3\2\2\2\u00c2\u04ac\3\2"+
- "\2\2\u00c4\u04af\3\2\2\2\u00c6\u04b9\3\2\2\2\u00c8\u04c3\3\2\2\2\u00ca"+
- "\u04c6\3\2\2\2\u00cc\u04cb\3\2\2\2\u00ce\u04cd\3\2\2\2\u00d0\u04db\3\2"+
- "\2\2\u00d2\u04e3\3\2\2\2\u00d4\u04eb\3\2\2\2\u00d6\u04f3\3\2\2\2\u00d8"+
- "\u0501\3\2\2\2\u00da\u0507\3\2\2\2\u00dc\u0515\3\2\2\2\u00de\u0521\3\2"+
- "\2\2\u00e0\u052a\3\2\2\2\u00e2\u052c\3\2\2\2\u00e4\u052e\3\2\2\2\u00e6"+
- "\u0532\3\2\2\2\u00e8\u0535\3\2\2\2\u00ea\u0539\3\2\2\2\u00ec\u053b\3\2"+
- "\2\2\u00ee\u0540\3\2\2\2\u00f0\u0544\3\2\2\2\u00f2\u0548\3\2\2\2\u00f4"+
- "\u054c\3\2\2\2\u00f6\u054f\3\2\2\2\u00f8\u0551\3\2\2\2\u00fa\u0566\3\2"+
- "\2\2\u00fc\u0568\3\2\2\2\u00fe\u057e\3\2\2\2\u0100\u0586\3\2\2\2\u0102"+
- "\u0588\3\2\2\2\u0104\u059e\3\2\2\2\u0106\u05a6\3\2\2\2\u0108\u05ae\3\2"+
- "\2\2\u010a\u05b2\3\2\2\2\u010c\u05be\3\2\2\2\u010e\u05c8\3\2\2\2\u0110"+
- "\u05d3\3\2\2\2\u0112\u05db\3\2\2\2\u0114\u05df\3\2\2\2\u0116\u05e8\3\2"+
- "\2\2\u0118\u05f2\3\2\2\2\u011a\u05f7\3\2\2\2\u011c\u05f9\3\2\2\2\u011e"+
- "\u05fe\3\2\2\2\u0120\u0600\3\2\2\2\u0122\u0602\3\2\2\2\u0124\u0605\3\2"+
- "\2\2\u0126\u0609\3\2\2\2\u0128\u0614\3\2\2\2\u012a\u0618\3\2\2\2\u012c"+
- "\u061f\3\2\2\2\u012e\u0623\3\2\2\2\u0130\u0625\3\2\2\2\u0132\u0635\3\2"+
- "\2\2\u0134\u0642\3\2\2\2\u0136\u064a\3\2\2\2\u0138\u064f\3\2\2\2\u013a"+
- "\u0651\3\2\2\2\u013c\u0653\3\2\2\2\u013e\u0655\3\2\2\2\u0140\u0659\3\2"+
- "\2\2\u0142\u065c\3\2\2\2\u0144\u0665\3\2\2\2\u0146\u0670\3\2\2\2\u0148"+
- "\u0676\3\2\2\2\u014a\u067a\3\2\2\2\u014c\u067c\3\2\2\2\u014e\u068c\3\2"+
- "\2\2\u0150\u0691\3\2\2\2\u0152\u0694\3\2\2\2\u0154\u0698\3\2\2\2\u0156"+
- "\u069c\3\2\2\2\u0158\u06a1\3\2\2\2\u015a\u06b4\3\2\2\2\u015c\u06b8\3\2"+
- "\2\2\u015e\u06be\3\2\2\2\u0160\u0161\5\u0092J\2\u0161\u0162\7\2\2\3\u0162"+
- "\3\3\2\2\2\u0163\u0164\5\u0094K\2\u0164\u0165\7\2\2\3\u0165\5\3\2\2\2"+
- "\u0166\u0167\5\u00b0Y\2\u0167\u0168\7\2\2\3\u0168\7\3\2\2\2\u0169\u016e"+
- "\5\n\6\2\u016a\u016b\7l\2\2\u016b\u016d\5\n\6\2\u016c\u016a\3\2\2\2\u016d"+
- "\u0170\3\2\2\2\u016e\u016c\3\2\2\2\u016e\u016f\3\2\2\2\u016f\t\3\2\2\2"+
- "\u0170\u016e\3\2\2\2\u0171\u0173\7d\2\2\u0172\u0174\7;\2\2\u0173\u0172"+
- "\3\2\2\2\u0173\u0174\3\2\2\2\u0174\13\3\2\2\2\u0175\u0176\5\16\b\2\u0176"+
- "\u0177\5\u015e\u00b0\2\u0177\u0179\3\2\2\2\u0178\u0175\3\2\2\2\u0179\u017c"+
- "\3\2\2\2\u017a\u0178\3\2\2\2\u017a\u017b\3\2\2\2\u017b\u017d\3\2\2\2\u017c"+
- "\u017a\3\2\2\2\u017d\u017e\5\u00c8e\2\u017e\u0184\5\u015e\u00b0\2\u017f"+
- "\u0180\5\24\13\2\u0180\u0181\5\u015e\u00b0\2\u0181\u0183\3\2\2\2\u0182"+
- "\u017f\3\2\2\2\u0183\u0186\3\2\2\2\u0184\u0182\3\2\2\2\u0184\u0185\3\2"+
- "\2\2\u0185\u0190\3\2\2\2\u0186\u0184\3\2\2\2\u0187\u018b\5v<\2\u0188\u018b"+
- "\5\u00ccg\2\u0189\u018b\5\26\f\2\u018a\u0187\3\2\2\2\u018a\u0188\3\2\2"+
- "\2\u018a\u0189\3\2\2\2\u018b\u018c\3\2\2\2\u018c\u018d\5\u015e\u00b0\2"+
- "\u018d\u018f\3\2\2\2\u018e\u018a\3\2\2\2\u018f\u0192\3\2\2\2\u0190\u018e"+
- "\3\2\2\2\u0190\u0191\3\2\2\2\u0191\u0193\3\2\2\2\u0192\u0190\3\2\2\2\u0193"+
- "\u0194\7\2\2\3\u0194\r\3\2\2\2\u0195\u0196\7D\2\2\u0196\u0197\5\u0092"+
- "J\2\u0197\17\3\2\2\2\u0198\u0199\7E\2\2\u0199\u019a\5\u0092J\2\u019a\21"+
- "\3\2\2\2\u019b\u019c\5\20\t\2\u019c\u019d\5\u015e\u00b0\2\u019d\u019f"+
- "\3\2\2\2\u019e\u019b\3\2\2\2\u019f\u01a2\3\2\2\2\u01a0\u019e\3\2\2\2\u01a0"+
- "\u01a1\3\2\2\2\u01a1\u01a4\3\2\2\2\u01a2\u01a0\3\2\2\2\u01a3\u01a5\t\2"+
- "\2\2\u01a4\u01a3\3\2\2\2\u01a4\u01a5\3\2\2\2\u01a5\u01a6\3\2\2\2\u01a6"+
- "\u01a7\5\u00caf\2\u01a7\23\3\2\2\2\u01a8\u01a9\5\20\t\2\u01a9\u01aa\5"+
- "\u015e\u00b0\2\u01aa\u01ac\3\2\2\2\u01ab\u01a8\3\2\2\2\u01ac\u01af\3\2"+
- "\2\2\u01ad\u01ab\3\2\2\2\u01ad\u01ae\3\2\2\2\u01ae\u01bd\3\2\2\2\u01af"+
- "\u01ad\3\2\2\2\u01b0\u01b1\7`\2\2\u01b1\u01be\5\22\n\2\u01b2\u01b3\7`"+
- "\2\2\u01b3\u01b9\7e\2\2\u01b4\u01b5\5\22\n\2\u01b5\u01b6\5\u015e\u00b0"+
- "\2\u01b6\u01b8\3\2\2\2\u01b7\u01b4\3\2\2\2\u01b8\u01bb\3\2\2\2\u01b9\u01b7"+
- "\3\2\2\2\u01b9\u01ba\3\2\2\2\u01ba\u01bc\3\2\2\2\u01bb\u01b9\3\2\2\2\u01bc"+
- "\u01be\7f\2\2\u01bd\u01b0\3\2\2\2\u01bd\u01b2\3\2\2\2\u01be\25\3\2\2\2"+
- "\u01bf\u01c4\5h\65\2\u01c0\u01c4\5~@\2\u01c1\u01c4\5\u0082B\2\u01c2\u01c4"+
- "\5|?\2\u01c3\u01bf\3\2\2\2\u01c3\u01c0\3\2\2\2\u01c3\u01c1\3\2\2\2\u01c3"+
- "\u01c2\3\2\2\2\u01c4\27\3\2\2\2\u01c5\u01c6\7\34\2\2\u01c6\u01cc\5\u0094"+
- "K\2\u01c7\u01c8\t\3\2\2\u01c8\u01cc\5.\30\2\u01c9\u01ca\t\4\2\2\u01ca"+
- "\u01cc\5\u0092J\2\u01cb\u01c5\3\2\2\2\u01cb\u01c7\3\2\2\2\u01cb\u01c9"+
- "\3\2\2\2\u01cc\31\3\2\2\2\u01cd\u01ce\5\34\17\2\u01ce\33\3\2\2\2\u01cf"+
- "\u01d0\5V,\2\u01d0\u01d1\5\36\20\2\u01d1\35\3\2\2\2\u01d2\u01d3\7C\2\2"+
- "\u01d3\u01d5\7e\2\2\u01d4\u01d6\5\u00dep\2\u01d5\u01d4\3\2\2\2\u01d5\u01d6"+
- "\3\2\2\2\u01d6\u01d7\3\2\2\2\u01d7\u01d8\7f\2\2\u01d8\37\3\2\2\2\u01d9"+
- "\u01e6\5F$\2\u01da\u01e6\5D#\2\u01db\u01e6\5B\"\2\u01dc\u01e6\5$\23\2"+
- "\u01dd\u01e6\5@!\2\u01de\u01e6\58\35\2\u01df\u01e6\5> \2\u01e0\u01e6\5"+
- "\66\34\2\u01e1\u01e6\5\62\32\2\u01e2\u01e6\5\60\31\2\u01e3\u01e6\5\64"+
- "\33\2\u01e4\u01e6\5\"\22\2\u01e5\u01d9\3\2\2\2\u01e5\u01da\3\2\2\2\u01e5"+
- "\u01db\3\2\2\2\u01e5\u01dc\3\2\2\2\u01e5\u01dd\3\2\2\2\u01e5\u01de\3\2"+
- "\2\2\u01e5\u01df\3\2\2\2\u01e5\u01e0\3\2\2\2\u01e5\u01e1\3\2\2\2\u01e5"+
- "\u01e2\3\2\2\2\u01e5\u01e3\3\2\2\2\u01e5\u01e4\3\2\2\2\u01e6!\3\2\2\2"+
- "\u01e7\u01e8\t\5\2\2\u01e8#\3\2\2\2\u01e9\u01ea\7]\2\2\u01ea\u01eb\7i"+
- "\2\2\u01eb\u01ec\5\u00b0Y\2\u01ec\u01ed\7j\2\2\u01ed%\3\2\2\2\u01ee\u01f3"+
- "\5(\25\2\u01ef\u01f0\7l\2\2\u01f0\u01f2\5(\25\2\u01f1\u01ef\3\2\2\2\u01f2"+
- "\u01f5\3\2\2\2\u01f3\u01f1\3\2\2\2\u01f3\u01f4\3\2\2\2\u01f4\u01f7\3\2"+
- "\2\2\u01f5\u01f3\3\2\2\2\u01f6\u01f8\7l\2\2\u01f7\u01f6\3\2\2\2\u01f7"+
- "\u01f8\3\2\2\2\u01f8\'\3\2\2\2\u01f9\u01fe\7d\2\2\u01fa\u01fb\7l\2\2\u01fb"+
- "\u01fd\7d\2\2\u01fc\u01fa\3\2\2\2\u01fd\u0200\3\2\2\2\u01fe\u01fc\3\2"+
- "\2\2\u01fe\u01ff\3\2\2\2\u01ff\u0201\3\2\2\2\u0200\u01fe\3\2\2\2\u0201"+
- "\u0202\5\u0120\u0091\2\u0202)\3\2\2\2\u0203\u0205\5,\27\2\u0204\u0203"+
- "\3\2\2\2\u0205\u0208\3\2\2\2\u0206\u0204\3\2\2\2\u0206\u0207\3\2\2\2\u0207"+
- "+\3\2\2\2\u0208\u0206\3\2\2\2\u0209\u020a\7g\2\2\u020a\u020f\5\u0092J"+
- "\2\u020b\u020c\7l\2\2\u020c\u020e\5\u0092J\2\u020d\u020b\3\2\2\2\u020e"+
- "\u0211\3\2\2\2\u020f\u020d\3\2\2\2\u020f\u0210\3\2\2\2\u0210\u0212\3\2"+
- "\2\2\u0211\u020f\3\2\2\2\u0212\u0213\7h\2\2\u0213-\3\2\2\2\u0214\u0215"+
- "\5\u00a2R\2\u0215/\3\2\2\2\u0216\u0217\7\62\2\2\u0217\u0218\7e\2\2\u0218"+
- "\u0219\5\u0092J\2\u0219\u021a\7f\2\2\u021a\61\3\2\2\2\u021b\u021c\7\66"+
- "\2\2\u021c\u021d\7i\2\2\u021d\u021e\5\u00b0Y\2\u021e\u021f\7j\2\2\u021f"+
- "\63\3\2\2\2\u0220\u0221\7\63\2\2\u0221\u0222\7e\2\2\u0222\u0223\5\u0092"+
- "J\2\u0223\u0224\7f\2\2\u0224\65\3\2\2\2\u0225\u0226\t\6\2\2\u0226\u0227"+
- "\7e\2\2\u0227\u0228\5\u0092J\2\u0228\u0229\7f\2\2\u0229\67\3\2\2\2\u022a"+
- "\u022f\7\23\2\2\u022b\u022c\7i\2\2\u022c\u022d\5:\36\2\u022d\u022e\7j"+
- "\2\2\u022e\u0230\3\2\2\2\u022f\u022b\3\2\2\2\u022f\u0230\3\2\2\2\u0230"+
- "\u0231\3\2\2\2\u0231\u0232\7e\2\2\u0232\u0233\5\u0092J\2\u0233\u0234\7"+
- "f\2\2\u02349\3\2\2\2\u0235\u0238\5<\37\2\u0236\u0238\7\25\2\2\u0237\u0235"+
- "\3\2\2\2\u0237\u0236\3\2\2\2\u0238;\3\2\2\2\u0239\u023a\7d\2\2\u023a="+
- "\3\2\2\2\u023b\u023c\7\24\2\2\u023c\u023d\7e\2\2\u023d\u023e\5\u0092J"+
- "\2\u023e\u023f\7f\2\2\u023f?\3\2\2\2\u0240\u0241\79\2\2\u0241\u0242\7"+
- "e\2\2\u0242\u0243\5\u0092J\2\u0243\u0244\7f\2\2\u0244A\3\2\2\2\u0245\u0246"+
- "\78\2\2\u0246\u0247\7e\2\2\u0247\u0248\5\u0092J\2\u0248\u0249\7f\2\2\u0249"+
- "C\3\2\2\2\u024a\u024b\7\30\2\2\u024b\u024c\7e\2\2\u024c\u024f\5\u0092"+
- "J\2\u024d\u024e\7l\2\2\u024e\u0250\5\u0092J\2\u024f\u024d\3\2\2\2\u024f"+
- "\u0250\3\2\2\2\u0250\u0251\3\2\2\2\u0251\u0252\7f\2\2\u0252E\3\2\2\2\u0253"+
- "\u0254\t\6\2\2\u0254\u0255\7i\2\2\u0255\u0256\5\u0092J\2\u0256\u0257\7"+
- "<\2\2\u0257\u0258\5\u0092J\2\u0258\u0259\7j\2\2\u0259G\3\2\2\2\u025a\u025b"+
- "\7i\2\2\u025b\u0260\5J&\2\u025c\u025d\7l\2\2\u025d\u025f\5J&\2\u025e\u025c"+
- "\3\2\2\2\u025f\u0262\3\2\2\2\u0260\u025e\3\2\2\2\u0260\u0261\3\2\2\2\u0261"+
- "\u0263\3\2\2\2\u0262\u0260\3\2\2\2\u0263\u0264\7j\2\2\u0264I\3\2\2\2\u0265"+
- "\u0266\5\u0092J\2\u0266\u0267\7k\2\2\u0267\u0268\5\u0092J\2\u0268K\3\2"+
- "\2\2\u0269\u026d\5T+\2\u026a\u026d\5R*\2\u026b\u026d\5N(\2\u026c\u0269"+
- "\3\2\2\2\u026c\u026a\3\2\2\2\u026c\u026b\3\2\2\2\u026dM\3\2\2\2\u026e"+
- "\u026f\7\64\2\2\u026f\u0275\7g\2\2\u0270\u0271\5P)\2\u0271\u0272\5\u015e"+
- "\u00b0\2\u0272\u0274\3\2\2\2\u0273\u0270\3\2\2\2\u0274\u0277\3\2\2\2\u0275"+
- "\u0273\3\2\2\2\u0275\u0276\3\2\2\2\u0276\u0278\3\2\2\2\u0277\u0275\3\2"+
- "\2\2\u0278\u0279\7h\2\2\u0279O\3\2\2\2\u027a\u027b\7L\2\2\u027b\u027c"+
- "\7d\2\2\u027c\u0284\5\u012c\u0097\2\u027d\u027e\7\65\2\2\u027e\u027f\7"+
- "g\2\2\u027f\u0280\5\u0092J\2\u0280\u0281\5\u015e\u00b0\2\u0281\u0282\7"+
- "h\2\2\u0282\u0284\3\2\2\2\u0283\u027a\3\2\2\2\u0283\u027d\3\2\2\2\u0284"+
- "Q\3\2\2\2\u0285\u0286\7\34\2\2\u0286\u0287\7i\2\2\u0287\u0288\7j\2\2\u0288"+
- "\u0289\5\u0120\u0091\2\u0289S\3\2\2\2\u028a\u028b\t\7\2\2\u028b\u028c"+
- "\7i\2\2\u028c\u028d\5\u00b0Y\2\u028d\u028e\7j\2\2\u028e\u0296\3\2\2\2"+
- "\u028f\u0290\7,\2\2\u0290\u0291\7i\2\2\u0291\u0292\5\u00b0Y\2\u0292\u0293"+
- "\7j\2\2\u0293\u0294\5\u00b0Y\2\u0294\u0296\3\2\2\2\u0295\u028a\3\2\2\2"+
- "\u0295\u028f\3\2\2\2\u0296U\3\2\2\2\u0297\u029d\5X-\2\u0298\u0299\7\20"+
- "\2\2\u0299\u029d\b,\1\2\u029a\u029b\7B\2\2\u029b\u029d\b,\1\2\u029c\u0297"+
- "\3\2\2\2\u029c\u0298\3\2\2\2\u029c\u029a\3\2\2\2\u029d\u029e\3\2\2\2\u029e"+
- "\u02a0\5\u015e\u00b0\2\u029f\u029c\3\2\2\2\u02a0\u02a3\3\2\2\2\u02a1\u02a2"+
- "\3\2\2\2\u02a1\u029f\3\2\2\2\u02a2\u02a6\3\2\2\2\u02a3\u02a1\3\2\2\2\u02a4"+
- "\u02a5\7\20\2\2\u02a5\u02a7\b,\1\2\u02a6\u02a4\3\2\2\2\u02a6\u02a7\3\2"+
- "\2\2\u02a7W\3\2\2\2\u02a8\u02a9\7\13\2\2\u02a9\u02b1\5\\/\2\u02aa\u02ab"+
- "\7\f\2\2\u02ab\u02b1\5\\/\2\u02ac\u02ad\7\r\2\2\u02ad\u02b1\5\\/\2\u02ae"+
- "\u02af\7\17\2\2\u02af\u02b1\5Z.\2\u02b0\u02a8\3\2\2\2\u02b0\u02aa\3\2"+
- "\2\2\u02b0\u02ac\3\2\2\2\u02b0\u02ae\3\2\2\2\u02b1Y\3\2\2\2\u02b2\u02b4"+
- "\5\u00d4k\2\u02b3\u02b2\3\2\2\2\u02b3\u02b4\3\2\2\2\u02b4\u02b7\3\2\2"+
- "\2\u02b5\u02b6\7[\2\2\u02b6\u02b8\5\u0092J\2\u02b7\u02b5\3\2\2\2\u02b7"+
- "\u02b8\3\2\2\2\u02b8[\3\2\2\2\u02b9\u02bc\3\2\2\2\u02ba\u02bc\5\u0092"+
- "J\2\u02bb\u02b9\3\2\2\2\u02bb\u02ba\3\2\2\2\u02bc]\3\2\2\2\u02bd\u02c2"+
- "\7g\2\2\u02be\u02bf\7:\2\2\u02bf\u02c0\5\u00d2j\2\u02c0\u02c1\5\u015e"+
- "\u00b0\2\u02c1\u02c3\3\2\2\2\u02c2\u02be\3\2\2\2\u02c2\u02c3\3\2\2\2\u02c3"+
- "\u02c5\3\2\2\2\u02c4\u02c6\5\u00dep\2\u02c5\u02c4\3\2\2\2\u02c5\u02c6"+
- "\3\2\2\2\u02c6\u02c7\3\2\2\2\u02c7\u02c8\7h\2\2\u02c8_\3\2\2\2\u02c9\u02cc"+
- "\5\u013e\u00a0\2\u02ca\u02cc\7d\2\2\u02cb\u02c9\3\2\2\2\u02cb\u02ca\3"+
- "\2\2\2\u02cc\u02d5\3\2\2\2\u02cd\u02d2\7g\2\2\u02ce\u02d0\5b\62\2\u02cf"+
- "\u02d1\7l\2\2\u02d0\u02cf\3\2\2\2\u02d0\u02d1\3\2\2\2\u02d1\u02d3\3\2"+
- "\2\2\u02d2\u02ce\3\2\2\2\u02d2\u02d3\3\2\2\2\u02d3\u02d4\3\2\2\2\u02d4"+
- "\u02d6\7h\2\2\u02d5\u02cd\3\2\2\2\u02d5\u02d6\3\2\2\2\u02d6a\3\2\2\2\u02d7"+
- "\u02dc\5d\63\2\u02d8\u02d9\7l\2\2\u02d9\u02db\5d\63\2\u02da\u02d8\3\2"+
- "\2\2\u02db\u02de\3\2\2\2\u02dc\u02da\3\2\2\2\u02dc\u02dd\3\2\2\2\u02dd"+
- "c\3\2\2\2\u02de\u02dc\3\2\2\2\u02df\u02e0\7d\2\2\u02e0\u02e2\7n\2\2\u02e1"+
- "\u02df\3\2\2\2\u02e1\u02e2\3\2\2\2\u02e2\u02e3\3\2\2\2\u02e3\u02e4\5\u0092"+
- "J\2\u02e4e\3\2\2\2\u02e5\u02e6\7F\2\2\u02e6\u02e7\5\u0092J\2\u02e7\u02e8"+
- "\7\21\2\2\u02e8\u02e9\5`\61\2\u02e9\u02ea\5\u00dco\2\u02eag\3\2\2\2\u02eb"+
- "\u02ec\5\u00b0Y\2\u02ec\u02ed\7\21\2\2\u02ed\u0300\5\u00b0Y\2\u02ee\u02f4"+
- "\7g\2\2\u02ef\u02f0\5p9\2\u02f0\u02f1\5\u015e\u00b0\2\u02f1\u02f3\3\2"+
- "\2\2\u02f2\u02ef\3\2\2\2\u02f3\u02f6\3\2\2\2\u02f4\u02f2\3\2\2\2\u02f4"+
- "\u02f5\3\2\2\2\u02f5\u02fc\3\2\2\2\u02f6\u02f4\3\2\2\2\u02f7\u02f8\5j"+
- "\66\2\u02f8\u02f9\5\u015e\u00b0\2\u02f9\u02fb\3\2\2\2\u02fa\u02f7\3\2"+
- "\2\2\u02fb\u02fe\3\2\2\2\u02fc\u02fa\3\2\2\2\u02fc\u02fd\3\2\2\2\u02fd"+
- "\u02ff\3\2\2\2\u02fe\u02fc\3\2\2\2\u02ff\u0301\7h\2\2\u0300\u02ee\3\2"+
- "\2\2\u0300\u0301\3\2\2\2\u0301i\3\2\2\2\u0302\u0304\7\20\2\2\u0303\u0302"+
- "\3\2\2\2\u0303\u0304\3\2\2\2\u0304\u0305\3\2\2\2\u0305\u0306\5l\67\2\u0306"+
- "\u0307\7d\2\2\u0307\u0309\5\u012c\u0097\2\u0308\u030a\5\u00dco\2\u0309"+
- "\u0308\3\2\2\2\u0309\u030a\3\2\2\2\u030ak\3\2\2\2\u030b\u030d\7e\2\2\u030c"+
- "\u030e\7d\2\2\u030d\u030c\3\2\2\2\u030d\u030e\3\2\2\2\u030e\u0310\3\2"+
- "\2\2\u030f\u0311\7\u0086\2\2\u0310\u030f\3\2\2\2\u0310\u0311\3\2\2\2\u0311"+
- "\u0312\3\2\2\2\u0312\u0313\5\u011a\u008e\2\u0313\u0314\7f\2\2\u0314m\3"+
- "\2\2\2\u0315\u031b\5\u00a2R\2\u0316\u0317\5\u00b0Y\2\u0317\u0318\7o\2"+
- "\2\u0318\u0319\7d\2\2\u0319\u031b\3\2\2\2\u031a\u0315\3\2\2\2\u031a\u0316"+
- "\3\2\2\2\u031bo\3\2\2\2\u031c\u031d\7\67\2\2\u031d\u031e\7d\2\2\u031e"+
- "\u0321\7r\2\2\u031f\u0322\5n8\2\u0320\u0322\5\u013c\u009f\2\u0321\u031f"+
- "\3\2\2\2\u0321\u0320\3\2\2\2\u0322q\3\2\2\2\u0323\u0324\7\60\2\2\u0324"+
- "\u0325\7e\2\2\u0325\u0328\5\u00b0Y\2\u0326\u0327\7l\2\2\u0327\u0329\5"+
- "\u00d4k\2\u0328\u0326\3\2\2\2\u0328\u0329\3\2\2\2\u0329\u032a\3\2\2\2"+
- "\u032a\u032b\7f\2\2\u032bs\3\2\2\2\u032c\u032d\7/\2\2\u032d\u032e\7e\2"+
- "\2\u032e\u032f\5\u00b0Y\2\u032f\u0330\7f\2\2\u0330u\3\2\2\2\u0331\u0334"+
- "\5V,\2\u0332\u0335\5x=\2\u0333\u0335\5z>\2\u0334\u0332\3\2\2\2\u0334\u0333"+
- "\3\2\2\2\u0335w\3\2\2\2\u0336\u0337\7L\2\2\u0337\u0338\7d\2\2\u0338\u033a"+
- "\5\u012c\u0097\2\u0339\u033b\5^\60\2\u033a\u0339\3\2\2\2\u033a\u033b\3"+
- "\2\2\2\u033by\3\2\2\2\u033c\u033d\7L\2\2\u033d\u033e\5\u0088E\2\u033e"+
- "\u033f\7d\2\2\u033f\u0341\5\u012c\u0097\2\u0340\u0342\5^\60\2\u0341\u0340"+
- "\3\2\2\2\u0341\u0342\3\2\2\2\u0342{\3\2\2\2\u0343\u0346\7\34\2\2\u0344"+
- "\u0347\5v<\2\u0345\u0347\5\u00ccg\2\u0346\u0344\3\2\2\2\u0346\u0345\3"+
- "\2\2\2\u0347}\3\2\2\2\u0348\u0349\7\67\2\2\u0349\u034a\7d\2\2\u034a\u034c"+
- "\5\u0130\u0099\2\u034b\u034d\5\u0080A\2\u034c\u034b\3\2\2\2\u034c\u034d"+
- "\3\2\2\2\u034d\177\3\2\2\2\u034e\u034f\7g\2\2\u034f\u0350\5\u0092J\2\u0350"+
- "\u0351\5\u015e\u00b0\2\u0351\u0352\7h\2\2\u0352\u0081\3\2\2\2\u0353\u0354"+
- "\7\67\2\2\u0354\u0355\5\u0088E\2\u0355\u0356\7d\2\2\u0356\u0358\5\u0130"+
- "\u0099\2\u0357\u0359\5\u0080A\2\u0358\u0357\3\2\2\2\u0358\u0359\3\2\2"+
- "\2\u0359\u0083\3\2\2\2\u035a\u0362\5\b\5\2\u035b\u035e\5\u00b0Y\2\u035c"+
- "\u035d\7k\2\2\u035d\u035f\5\u00d4k\2\u035e\u035c\3\2\2\2\u035e\u035f\3"+
- "\2\2\2\u035f\u0363\3\2\2\2\u0360\u0361\7k\2\2\u0361\u0363\5\u00d4k\2\u0362"+
- "\u035b\3\2\2\2\u0362\u0360\3\2\2\2\u0363\u0085\3\2\2\2\u0364\u0365\5\b"+
- "\5\2\u0365\u0366\7r\2\2\u0366\u0367\5\u00d4k\2\u0367\u0087\3\2\2\2\u0368"+
- "\u036a\7e\2\2\u0369\u036b\5\n\6\2\u036a\u0369\3\2\2\2\u036a\u036b\3\2"+
- "\2\2\u036b\u036c\3\2\2\2\u036c\u036e\5\u00b0Y\2\u036d\u036f\7l\2\2\u036e"+
- "\u036d\3\2\2\2\u036e\u036f\3\2\2\2\u036f\u0370\3\2\2\2\u0370\u0371\7f"+
- "\2\2\u0371\u0089\3\2\2\2\u0372\u0375\5\u008cG\2\u0373\u0375\5\u008eH\2"+
- "\u0374\u0372\3\2\2\2\u0374\u0373\3\2\2\2\u0375\u008b\3\2\2\2\u0376\u0378"+
- "\5\u00d2j\2\u0377\u0376\3\2\2\2\u0377\u0378\3\2\2\2\u0378\u0379\3\2\2"+
- "\2\u0379\u037a\5\u0090I\2\u037a\u008d\3\2\2\2\u037b\u037d\7\34\2\2\u037c"+
- "\u037e\5\u00d2j\2\u037d\u037c\3\2\2\2\u037d\u037e\3\2\2\2\u037e\u037f"+
- "\3\2\2\2\u037f\u0380\5\u0090I\2\u0380\u008f\3\2\2\2\u0381\u0383\7s\2\2"+
- "\u0382\u0381\3\2\2\2\u0382\u0383\3\2\2\2\u0383\u0384\3\2\2\2\u0384\u0385"+
- "\5\u00b0Y\2\u0385\u0091\3\2\2\2\u0386\u0387\bJ\1\2\u0387\u0388\t\b\2\2"+
- "\u0388\u0397\5\u0092J\20\u0389\u0397\5\u00a2R\2\u038a\u038b\7\33\2\2\u038b"+
- "\u038c\5.\30\2\u038c\u038d\7\35\2\2\u038d\u038e\5\u0092J\4\u038e\u0397"+
- "\3\2\2\2\u038f\u0390\t\t\2\2\u0390\u0391\5&\24\2\u0391\u0392\7n\2\2\u0392"+
- "\u0393\7n\2\2\u0393\u0394\5*\26\2\u0394\u0395\5\u0092J\3\u0395\u0397\3"+
- "\2\2\2\u0396\u0386\3\2\2\2\u0396\u0389\3\2\2\2\u0396\u038a\3\2\2\2\u0396"+
- "\u038f\3\2\2\2\u0397\u03bb\3\2\2\2\u0398\u0399\f\16\2\2\u0399\u039a\t"+
- "\n\2\2\u039a\u03ba\5\u0092J\17\u039b\u039c\f\r\2\2\u039c\u039d\t\13\2"+
- "\2\u039d\u03ba\5\u0092J\16\u039e\u039f\f\f\2\2\u039f\u03a0\t\f\2\2\u03a0"+
- "\u03ba\5\u0092J\r\u03a1\u03a2\f\13\2\2\u03a2\u03a3\t\r\2\2\u03a3\u03ba"+
- "\5\u0092J\f\u03a4\u03a5\f\n\2\2\u03a5\u03a6\t\16\2\2\u03a6\u03ba\5\u0092"+
- "J\13\u03a7\u03a8\f\b\2\2\u03a8\u03a9\7u\2\2\u03a9\u03ba\5\u0092J\t\u03aa"+
- "\u03ab\f\7\2\2\u03ab\u03ac\7t\2\2\u03ac\u03ba\5\u0092J\b\u03ad\u03ae\f"+
- "\6\2\2\u03ae\u03af\7#\2\2\u03af\u03ba\5\u0092J\6\u03b0\u03b1\f\5\2\2\u03b1"+
- "\u03b2\7&\2\2\u03b2\u03b3\5\u0092J\2\u03b3\u03b4\7n\2\2\u03b4\u03b5\5"+
- "\u0092J\5\u03b5\u03ba\3\2\2\2\u03b6\u03b7\f\t\2\2\u03b7\u03b8\7\21\2\2"+
- "\u03b8\u03ba\5`\61\2\u03b9\u0398\3\2\2\2\u03b9\u039b\3\2\2\2\u03b9\u039e"+
- "\3\2\2\2\u03b9\u03a1\3\2\2\2\u03b9\u03a4\3\2\2\2\u03b9\u03a7\3\2\2\2\u03b9"+
- "\u03aa\3\2\2\2\u03b9\u03ad\3\2\2\2\u03b9\u03b0\3\2\2\2\u03b9\u03b6\3\2"+
- "\2\2\u03ba\u03bd\3\2\2\2\u03bb\u03b9\3\2\2\2\u03bb\u03bc\3\2\2\2\u03bc"+
- "\u0093\3\2\2\2\u03bd\u03bb\3\2\2\2\u03be\u03d3\5\30\r\2\u03bf\u03d3\5"+
- "\32\16\2\u03c0\u03d3\5\u0098M\2\u03c1\u03d3\5\u0096L\2\u03c2\u03d3\5\u00cc"+
- "g\2\u03c3\u03d3\5\u00ecw\2\u03c4\u03d3\5\u00e0q\2\u03c5\u03d3\5\u0118"+
- "\u008d\2\u03c6\u03d3\5\u00eex\2\u03c7\u03d3\5\u00f0y\2\u03c8\u03d3\5\u00f2"+
- "z\2\u03c9\u03d3\5\u00f4{\2\u03ca\u03d3\5\u00f6|\2\u03cb\u03d3\5\u00dc"+
- "o\2\u03cc\u03d3\5\u00f8}\2\u03cd\u03d3\5\u00fa~\2\u03ce\u03d3\5\u010c"+
- "\u0087\2\u03cf\u03d3\5\u009aN\2\u03d0\u03d3\5\u009eP\2\u03d1\u03d3\5f"+
- "\64\2\u03d2\u03be\3\2\2\2\u03d2\u03bf\3\2\2\2\u03d2\u03c0\3\2\2\2\u03d2"+
- "\u03c1\3\2\2\2\u03d2\u03c2\3\2\2\2\u03d2\u03c3\3\2\2\2\u03d2\u03c4\3\2"+
- "\2\2\u03d2\u03c5\3\2\2\2\u03d2\u03c6\3\2\2\2\u03d2\u03c7\3\2\2\2\u03d2"+
- "\u03c8\3\2\2\2\u03d2\u03c9\3\2\2\2\u03d2\u03ca\3\2\2\2\u03d2\u03cb\3\2"+
- "\2\2\u03d2\u03cc\3\2\2\2\u03d2\u03cd\3\2\2\2\u03d2\u03ce\3\2\2\2\u03d2"+
- "\u03cf\3\2\2\2\u03d2\u03d0\3\2\2\2\u03d2\u03d1\3\2\2\2\u03d3\u0095\3\2"+
- "\2\2\u03d4\u03d5\7%\2\2\u03d5\u03d6\5\u0092J\2\u03d6\u0097\3\2\2\2\u03d7"+
- "\u03d8\7W\2\2\u03d8\u03da\5\u0092J\2\u03d9\u03db\5\u00dco\2\u03da\u03d9"+
- "\3\2\2\2\u03da\u03db\3\2\2\2\u03db\u0099\3\2\2\2\u03dc\u03dd\5\u009cO"+
- "\2\u03dd\u03de\5\u0114\u008b\2\u03de\u009b\3\2\2\2\u03df\u03e0\7\16\2"+
- "\2\u03e0\u03e1\5\u0092J\2\u03e1\u03e2\5\u015e\u00b0\2\u03e2\u03e4\3\2"+
- "\2\2\u03e3\u03df\3\2\2\2\u03e4\u03e7\3\2\2\2\u03e5\u03e3\3\2\2\2\u03e5"+
- "\u03e6\3\2\2\2\u03e6\u03ec\3\2\2\2\u03e7\u03e5\3\2\2\2\u03e8\u03e9\7\17"+
- "\2\2\u03e9\u03ea\5Z.\2\u03ea\u03eb\5\u015e\u00b0\2\u03eb\u03ed\3\2\2\2"+
- "\u03ec\u03e8\3\2\2\2\u03ec\u03ed\3\2\2\2\u03ed\u009d\3\2\2\2\u03ee\u03ef"+
- "\7P\2\2\u03ef\u03f4\5\u0092J\2\u03f0\u03f1\7P\2\2\u03f1\u03f2\t\3\2\2"+
- "\u03f2\u03f4\5.\30\2\u03f3\u03ee\3\2\2\2\u03f3\u03f0\3\2\2\2\u03f4\u009f"+
- "\3\2\2\2\u03f5\u03fe\7\5\2\2\u03f6\u03fe\7\6\2\2\u03f7\u03fe\7c\2\2\u03f8"+
- "\u03fe\5\u013a\u009e\2\u03f9\u03fe\5\u0150\u00a9\2\u03fa\u03fe\7\3\2\2"+
- "\u03fb\u03fe\7\u008e\2\2\u03fc\u03fe\7\u008f\2\2\u03fd\u03f5\3\2\2\2\u03fd"+
- "\u03f6\3\2\2\2\u03fd\u03f7\3\2\2\2\u03fd\u03f8\3\2\2\2\u03fd\u03f9\3\2"+
- "\2\2\u03fd\u03fa\3\2\2\2\u03fd\u03fb\3\2\2\2\u03fd\u03fc\3\2\2\2\u03fe"+
- "\u00a1\3\2\2\2\u03ff\u0400\bR\1\2\u0400\u040c\5\u0136\u009c\2\u0401\u040c"+
- "\5\u0132\u009a\2\u0402\u040c\5\u015a\u00ae\2\u0403\u040c\5 \21\2\u0404"+
- "\u040c\5t;\2\u0405\u040c\5r:\2\u0406\u0407\t\17\2\2\u0407\u0408\7e\2\2"+
- "\u0408\u0409\5\u0092J\2\u0409\u040a\7f\2\2\u040a\u040c\3\2\2\2\u040b\u03ff"+
- "\3\2\2\2\u040b\u0401\3\2\2\2\u040b\u0402\3\2\2\2\u040b\u0403\3\2\2\2\u040b"+
- "\u0404\3\2\2\2\u040b\u0405\3\2\2\2\u040b\u0406\3\2\2\2\u040c\u0423\3\2"+
- "\2\2\u040d\u040e\f\13\2\2\u040e\u040f\7o\2\2\u040f\u0422\7d\2\2\u0410"+
- "\u0411\f\n\2\2\u0411\u0422\5\u0154\u00ab\2\u0412\u0413\f\t\2\2\u0413\u0422"+
- "\5\u00bc_\2\u0414\u0415\f\b\2\2\u0415\u0422\5H%\2\u0416\u0417\f\7\2\2"+
- "\u0417\u0422\5\u0156\u00ac\2\u0418\u0419\f\6\2\2\u0419\u0422\5\u0158\u00ad"+
- "\2\u041a\u041b\f\5\2\2\u041b\u041c\5\u0158\u00ad\2\u041c\u041d\7\22\2"+
- "\2\u041d\u041e\5`\61\2\u041e\u0422\3\2\2\2\u041f\u0420\f\4\2\2\u0420\u0422"+
- "\5\u00a8U\2\u0421\u040d\3\2\2\2\u0421\u0410\3\2\2\2\u0421\u0412\3\2\2"+
- "\2\u0421\u0414\3\2\2\2\u0421\u0416\3\2\2\2\u0421\u0418\3\2\2\2\u0421\u041a"+
- "\3\2\2\2\u0421\u041f\3\2\2\2\u0422\u0425\3\2\2\2\u0423\u0421\3\2\2\2\u0423"+
- "\u0424\3\2\2\2\u0424\u00a3\3\2\2\2\u0425\u0423\3\2\2\2\u0426\u0427\5V"+
- ",\2\u0427\u0428\5\u00a6T\2\u0428\u00a5\3\2\2\2\u0429\u042b\7L\2\2\u042a"+
- "\u042c\7d\2\2\u042b\u042a\3\2\2\2\u042b\u042c\3\2\2\2\u042c\u042d\3\2"+
- "\2\2\u042d\u042f\5\u012c\u0097\2\u042e\u0430\5^\60\2\u042f\u042e\3\2\2"+
- "\2\u042f\u0430\3\2\2\2\u0430\u00a7\3\2\2\2\u0431\u0433\7\'\2\2\u0432\u0434"+
- "\5\u00d4k\2\u0433\u0432\3\2\2\2\u0433\u0434\3\2\2\2\u0434\u0436\3\2\2"+
- "\2\u0435\u0437\7l\2\2\u0436\u0435\3\2\2\2\u0436\u0437\3\2\2\2\u0437\u0438"+
- "\3\2\2\2\u0438\u0439\7(\2\2\u0439\u00a9\3\2\2\2\u043a\u043b\7M\2\2\u043b"+
- "\u0445\7g\2\2\u043c\u0440\5\u00aeX\2\u043d\u0440\5\u011a\u008e\2\u043e"+
- "\u0440\5\u00acW\2\u043f\u043c\3\2\2\2\u043f\u043d\3\2\2\2\u043f\u043e"+
- "\3\2\2\2\u0440\u0441\3\2\2\2\u0441\u0442\5\u015e\u00b0\2\u0442\u0444\3"+
- "\2\2\2\u0443\u043f\3\2\2\2\u0444\u0447\3\2\2\2\u0445\u0443\3\2\2\2\u0445"+
- "\u0446\3\2\2\2\u0446\u0448\3\2\2\2\u0447\u0445\3\2\2\2\u0448\u0449\7h"+
- "\2\2\u0449\u00ab\3\2\2\2\u044a\u044b\7\67\2\2\u044b\u044c\7d\2\2\u044c"+
- "\u044d\5\u0130\u0099\2\u044d\u00ad\3\2\2\2\u044e\u0450\7\34\2\2\u044f"+
- "\u044e\3\2\2\2\u044f\u0450\3\2\2\2\u0450\u0451\3\2\2\2\u0451\u0452\5V"+
- ",\2\u0452\u0453\7d\2\2\u0453\u0454\5\u0130\u0099\2\u0454\u0455\5\u012e"+
- "\u0098\2\u0455\u045e\3\2\2\2\u0456\u0458\7\34\2\2\u0457\u0456\3\2\2\2"+
- "\u0457\u0458\3\2\2\2\u0458\u0459\3\2\2\2\u0459\u045a\5V,\2\u045a\u045b"+
- "\7d\2\2\u045b\u045c\5\u0130\u0099\2\u045c\u045e\3\2\2\2\u045d\u044f\3"+
- "\2\2\2\u045d\u0457\3\2\2\2\u045e\u00af\3\2\2\2\u045f\u0467\5\u011a\u008e"+
- "\2\u0460\u0467\5\u00b2Z\2\u0461\u0467\5L\'\2\u0462\u0463\7e\2\2\u0463"+
- "\u0464\5\u00b0Y\2\u0464\u0465\7f\2\2\u0465\u0467\3\2\2\2\u0466\u045f\3"+
- "\2\2\2\u0466\u0460\3\2\2\2\u0466\u0461\3\2\2\2\u0466\u0462\3\2\2\2\u0467"+
- "\u00b1\3\2\2\2\u0468\u0472\5\u011c\u008f\2\u0469\u0472\5\u014c\u00a7\2"+
- "\u046a\u0472\5\u0122\u0092\2\u046b\u0472\5\u012a\u0096\2\u046c\u0472\5"+
- "\u00aaV\2\u046d\u0472\5\u0124\u0093\2\u046e\u0472\5\u0126\u0094\2\u046f"+
- "\u0472\5\u0128\u0095\2\u0470\u0472\5\u00b4[\2\u0471\u0468\3\2\2\2\u0471"+
- "\u0469\3\2\2\2\u0471\u046a\3\2\2\2\u0471\u046b\3\2\2\2\u0471\u046c\3\2"+
- "\2\2\u0471\u046d\3\2\2\2\u0471\u046e\3\2\2\2\u0471\u046f\3\2\2\2\u0471"+
- "\u0470\3\2\2\2\u0472\u00b3\3\2\2\2\u0473\u0474\7\67\2\2\u0474\u0475\5"+
- "\u00b6\\\2\u0475\u00b5\3\2\2\2\u0476\u0482\7e\2\2\u0477\u047c\5\u00b0"+
- "Y\2\u0478\u0479\7l\2\2\u0479\u047b\5\u00b0Y\2\u047a\u0478\3\2\2\2\u047b"+
- "\u047e\3\2\2\2\u047c\u047a\3\2\2\2\u047c\u047d\3\2\2\2\u047d\u0480\3\2"+
- "\2\2\u047e\u047c\3\2\2\2\u047f\u0481\7l\2\2\u0480\u047f\3\2\2\2\u0480"+
- "\u0481\3\2\2\2\u0481\u0483\3\2\2\2\u0482\u0477\3\2\2\2\u0482\u0483\3\2"+
- "\2\2\u0483\u0484\3\2\2\2\u0484\u0485\7f\2\2\u0485\u00b7\3\2\2\2\u0486"+
- "\u048e\5\u014c\u00a7\2\u0487\u048e\5\u011c\u008f\2\u0488\u048e\5\u00ba"+
- "^\2\u0489\u048e\5\u0124\u0093\2\u048a\u048e\5\u0126\u0094\2\u048b\u048e"+
- "\5L\'\2\u048c\u048e\5\u011a\u008e\2\u048d\u0486\3\2\2\2\u048d\u0487\3"+
- "\2\2\2\u048d\u0488\3\2\2\2\u048d\u0489\3\2\2\2\u048d\u048a\3\2\2\2\u048d"+
- "\u048b\3\2\2\2\u048d\u048c\3\2\2\2\u048e\u00b9\3\2\2\2\u048f\u0490\7i"+
- "\2\2\u0490\u0491\7s\2\2\u0491\u0492\7j\2\2\u0492\u0493\5\u0120\u0091\2"+
- "\u0493\u00bb\3\2\2\2\u0494\u04a4\7i\2\2\u0495\u0497\5\u00be`\2\u0496\u0495"+
- "\3\2\2\2\u0496\u0497\3\2\2\2\u0497\u0498\3\2\2\2\u0498\u049a\7n\2\2\u0499"+
- "\u049b\5\u00c0a\2\u049a\u0499\3\2\2\2\u049a\u049b\3\2\2\2\u049b\u04a5"+
- "\3\2\2\2\u049c\u049e\5\u00be`\2\u049d\u049c\3\2\2\2\u049d\u049e\3\2\2"+
- "\2\u049e\u049f\3\2\2\2\u049f\u04a0\7n\2\2\u04a0\u04a1\5\u00c0a\2\u04a1"+
- "\u04a2\7n\2\2\u04a2\u04a3\5\u00c2b\2\u04a3\u04a5\3\2\2\2\u04a4\u0496\3"+
- "\2\2\2\u04a4\u049d\3\2\2\2\u04a5\u04a6\3\2\2\2\u04a6\u04a7\7j\2\2\u04a7"+
- "\u00bd\3\2\2\2\u04a8\u04a9\5\u0092J\2\u04a9\u00bf\3\2\2\2\u04aa\u04ab"+
- "\5\u0092J\2\u04ab\u00c1\3\2\2\2\u04ac\u04ad\5\u0092J\2\u04ad\u00c3\3\2"+
- "\2\2\u04ae\u04b0\t\20\2\2\u04af\u04ae\3\2\2\2\u04af\u04b0\3\2\2\2\u04b0"+
- "\u04b1\3\2\2\2\u04b1\u04b2\7k\2\2\u04b2\u00c5\3\2\2\2\u04b3\u04b4\5\u00d4"+
- "k\2\u04b4\u04b5\7k\2\2\u04b5\u04ba\3\2\2\2\u04b6\u04b7\5\b\5\2\u04b7\u04b8"+
- "\7r\2\2\u04b8\u04ba\3\2\2\2\u04b9\u04b3\3\2\2\2\u04b9\u04b6\3\2\2\2\u04b9"+
- "\u04ba\3\2\2\2\u04ba\u04bb\3\2\2\2\u04bb\u04bc\7\\\2\2\u04bc\u04c1\5\u0092"+
- "J\2\u04bd\u04bf\7I\2\2\u04be\u04c0\7d\2\2\u04bf\u04be\3\2\2\2\u04bf\u04c0"+
- "\3\2\2\2\u04c0\u04c2\3\2\2\2\u04c1\u04bd\3\2\2\2\u04c1\u04c2\3\2\2\2\u04c2"+
- "\u00c7\3\2\2\2\u04c3\u04c4\7W\2\2\u04c4\u04c5\7d\2\2\u04c5\u00c9\3\2\2"+
- "\2\u04c6\u04c7\5\u0150\u00a9\2\u04c7\u00cb\3\2\2\2\u04c8\u04cc\5\u00ce"+
- "h\2\u04c9\u04cc\5\u00d6l\2\u04ca\u04cc\5\u00dan\2\u04cb\u04c8\3\2\2\2"+
- "\u04cb\u04c9\3\2\2\2\u04cb\u04ca\3\2\2\2\u04cc\u00cd\3\2\2\2\u04cd\u04d9"+
- "\7Y\2\2\u04ce\u04da\5\u00d0i\2\u04cf\u04d5\7e\2\2\u04d0\u04d1\5\u00d0"+
- "i\2\u04d1\u04d2\5\u015e\u00b0\2\u04d2\u04d4\3\2\2\2\u04d3\u04d0\3\2\2"+
- "\2\u04d4\u04d7\3\2\2\2\u04d5\u04d3\3\2\2\2\u04d5\u04d6\3\2\2\2\u04d6\u04d8"+
- "\3\2\2\2\u04d7\u04d5\3\2\2\2\u04d8\u04da\7f\2\2\u04d9\u04ce\3\2\2\2\u04d9"+
- "\u04cf\3\2\2\2\u04da\u00cf\3\2\2\2\u04db\u04e1\5\u00d2j\2\u04dc\u04de"+
- "\5\u00b0Y\2\u04dd\u04dc\3\2\2\2\u04dd\u04de\3\2\2\2\u04de\u04df\3\2\2"+
- "\2\u04df\u04e0\7k\2\2\u04e0\u04e2\5\u00d4k\2\u04e1\u04dd\3\2\2\2\u04e1"+
- "\u04e2\3\2\2\2\u04e2\u00d1\3\2\2\2\u04e3\u04e8\7d\2\2\u04e4\u04e5\7l\2"+
- "\2\u04e5\u04e7\7d\2\2\u04e6\u04e4\3\2\2\2\u04e7\u04ea\3\2\2\2\u04e8\u04e6"+
- "\3\2\2\2\u04e8\u04e9\3\2\2\2\u04e9\u00d3\3\2\2\2\u04ea\u04e8\3\2\2\2\u04eb"+
- "\u04f0\5\u0092J\2\u04ec\u04ed\7l\2\2\u04ed\u04ef\5\u0092J\2\u04ee\u04ec"+
- "\3\2\2\2\u04ef\u04f2\3\2\2\2\u04f0\u04ee\3\2\2\2\u04f0\u04f1\3\2\2\2\u04f1"+
- "\u00d5\3\2\2\2\u04f2\u04f0\3\2\2\2\u04f3\u04ff\7]\2\2\u04f4\u0500\5\u00d8"+
- "m\2\u04f5\u04fb\7e\2\2\u04f6\u04f7\5\u00d8m\2\u04f7\u04f8\5\u015e\u00b0"+
- "\2\u04f8\u04fa\3\2\2\2\u04f9\u04f6\3\2\2\2\u04fa\u04fd\3\2\2\2\u04fb\u04f9"+
- "\3\2\2\2\u04fb\u04fc\3\2\2\2\u04fc\u04fe\3\2\2\2\u04fd\u04fb\3\2\2\2\u04fe"+
- "\u0500\7f\2\2\u04ff\u04f4\3\2\2\2\u04ff\u04f5\3\2\2\2\u0500\u00d7\3\2"+
- "\2\2\u0501\u0503\7d\2\2\u0502\u0504\7k\2\2\u0503\u0502\3\2\2\2\u0503\u0504"+
- "\3\2\2\2\u0504\u0505\3\2\2\2\u0505\u0506\5\u00b0Y\2\u0506\u00d9\3\2\2"+
- "\2\u0507\u0513\7b\2\2\u0508\u0514\5\u0084C\2\u0509\u050f\7e\2\2\u050a"+
- "\u050b\5\u0084C\2\u050b\u050c\5\u015e\u00b0\2\u050c\u050e\3\2\2\2\u050d"+
- "\u050a\3\2\2\2\u050e\u0511\3\2\2\2\u050f\u050d\3\2\2\2\u050f\u0510\3\2"+
- "\2\2\u0510\u0512\3\2\2\2\u0511\u050f\3\2\2\2\u0512\u0514\7f\2\2\u0513"+
- "\u0508\3\2\2\2\u0513\u0509\3\2\2\2\u0514\u00db\3\2\2\2\u0515\u0517\7g"+
- "\2\2\u0516\u0518\5\u00dep\2\u0517\u0516\3\2\2\2\u0517\u0518\3\2\2\2\u0518"+
- "\u0519\3\2\2\2\u0519\u051a\7h\2\2\u051a\u00dd\3\2\2\2\u051b\u051d\5\u015e"+
- "\u00b0\2\u051c\u051b\3\2\2\2\u051c\u051d\3\2\2\2\u051d\u051e\3\2\2\2\u051e"+
- "\u051f\5\u0094K\2\u051f\u0520\5\u015e\u00b0\2\u0520\u0522\3\2\2\2\u0521"+
- "\u051c\3\2\2\2\u0522\u0523\3\2\2\2\u0523\u0521\3\2\2\2\u0523\u0524\3\2"+
- "\2\2\u0524\u00df\3\2\2\2\u0525\u052b\5\u00e4s\2\u0526\u052b\5\u00e6t\2"+
- "\u0527\u052b\5\u00e8u\2\u0528\u052b\5\u00e2r\2\u0529\u052b\5\u0086D\2"+
- "\u052a\u0525\3\2\2\2\u052a\u0526\3\2\2\2\u052a\u0527\3\2\2\2\u052a\u0528"+
- "\3\2\2\2\u052a\u0529\3\2\2\2\u052b\u00e1\3\2\2\2\u052c\u052d\5\u0092J"+
- "\2\u052d\u00e3\3\2\2\2\u052e\u052f\5\u0092J\2\u052f\u0530\7\u0088\2\2"+
- "\u0530\u0531\5\u0092J\2\u0531\u00e5\3\2\2\2\u0532\u0533\5\u0092J\2\u0533"+
- "\u0534\t\21\2\2\u0534\u00e7\3\2\2\2\u0535\u0536\5\u00d4k\2\u0536\u0537"+
- "\5\u00c4c\2\u0537\u0538\5\u00d4k\2\u0538\u00e9\3\2\2\2\u0539\u053a\t\22"+
- "\2\2\u053a\u00eb\3\2\2\2\u053b\u053c\7d\2\2\u053c\u053e\7n\2\2\u053d\u053f"+
- "\5\u0094K\2\u053e\u053d\3\2\2\2\u053e\u053f\3\2\2\2\u053f\u00ed\3\2\2"+
- "\2\u0540\u0542\7a\2\2\u0541\u0543\5\u00d4k\2\u0542\u0541\3\2\2\2\u0542"+
- "\u0543\3\2\2\2\u0543\u00ef\3\2\2\2\u0544\u0546\7J\2\2\u0545\u0547\7d\2"+
- "\2\u0546\u0545\3\2\2\2\u0546\u0547\3\2\2\2\u0547\u00f1\3\2\2\2\u0548\u054a"+
- "\7^\2\2\u0549\u054b\7d\2\2\u054a\u0549\3\2\2\2\u054a\u054b\3\2\2\2\u054b"+
- "\u00f3\3\2\2\2\u054c\u054d\7V\2\2\u054d\u054e\7d\2\2\u054e\u00f5\3\2\2"+
- "\2\u054f\u0550\7Z\2\2\u0550\u00f7\3\2\2\2\u0551\u055a\7[\2\2\u0552\u055b"+
- "\5\u0092J\2\u0553\u0554\5\u015e\u00b0\2\u0554\u0555\5\u0092J\2\u0555\u055b"+
- "\3\2\2\2\u0556\u0557\5\u00e0q\2\u0557\u0558\5\u015e\u00b0\2\u0558\u0559"+
- "\5\u0092J\2\u0559\u055b\3\2\2\2\u055a\u0552\3\2\2\2\u055a\u0553\3\2\2"+
- "\2\u055a\u0556\3\2\2\2\u055b\u055c\3\2\2\2\u055c\u0562\5\u00dco\2\u055d"+
- "\u0560\7U\2\2\u055e\u0561\5\u00f8}\2\u055f\u0561\5\u00dco\2\u0560\u055e"+
- "\3\2\2\2\u0560\u055f\3\2\2\2\u0561\u0563\3\2\2\2\u0562\u055d\3\2\2\2\u0562"+
- "\u0563\3\2\2\2\u0563\u00f9\3\2\2\2\u0564\u0567\5\u00fc\177\2\u0565\u0567"+
- "\5\u0102\u0082\2\u0566\u0564\3\2\2\2\u0566\u0565\3\2\2\2\u0567\u00fb\3"+
- "\2\2\2\u0568\u0573\7X\2\2\u0569\u056b\5\u0092J\2\u056a\u0569\3\2\2\2\u056a"+
- "\u056b\3\2\2\2\u056b\u0574\3\2\2\2\u056c\u056e\5\u00e0q\2\u056d\u056c"+
- "\3\2\2\2\u056d\u056e\3\2\2\2\u056e\u056f\3\2\2\2\u056f\u0571\5\u015e\u00b0"+
- "\2\u0570\u0572\5\u0092J\2\u0571\u0570\3\2\2\2\u0571\u0572\3\2\2\2\u0572"+
- "\u0574\3\2\2\2\u0573\u056a\3\2\2\2\u0573\u056d\3\2\2\2\u0574\u0575\3\2"+
- "\2\2\u0575\u0579\7g\2\2\u0576\u0578\5\u00fe\u0080\2\u0577\u0576\3\2\2"+
- "\2\u0578\u057b\3\2\2\2\u0579\u0577\3\2\2\2\u0579\u057a\3\2\2\2\u057a\u057c"+
- "\3\2\2\2\u057b\u0579\3\2\2\2\u057c\u057d\7h\2\2\u057d\u00fd\3\2\2\2\u057e"+
- "\u057f\5\u0100\u0081\2\u057f\u0581\7n\2\2\u0580\u0582\5\u00dep\2\u0581"+
- "\u0580\3\2\2\2\u0581\u0582\3\2\2\2\u0582\u00ff\3\2\2\2\u0583\u0584\7O"+
- "\2\2\u0584\u0587\5\u00d4k\2\u0585\u0587\7K\2\2\u0586\u0583\3\2\2\2\u0586"+
- "\u0585\3\2\2\2\u0587\u0101\3\2\2\2\u0588\u0591\7X\2\2\u0589\u0592\5\u0104"+
- "\u0083\2\u058a\u058b\5\u015e\u00b0\2\u058b\u058c\5\u0104\u0083\2\u058c"+
- "\u0592\3\2\2\2\u058d\u058e\5\u00e0q\2\u058e\u058f\5\u015e\u00b0\2\u058f"+
- "\u0590\5\u0104\u0083\2\u0590\u0592\3\2\2\2\u0591\u0589\3\2\2\2\u0591\u058a"+
- "\3\2\2\2\u0591\u058d\3\2\2\2\u0592\u0593\3\2\2\2\u0593\u0597\7g\2\2\u0594"+
- "\u0596\5\u0106\u0084\2\u0595\u0594\3\2\2\2\u0596\u0599\3\2\2\2\u0597\u0595"+
- "\3\2\2\2\u0597\u0598\3\2\2\2\u0598\u059a\3\2\2\2\u0599\u0597\3\2\2\2\u059a"+
- "\u059b\7h\2\2\u059b\u0103\3\2\2\2\u059c\u059d\7d\2\2\u059d\u059f\7r\2"+
- "\2\u059e\u059c\3\2\2\2\u059e\u059f\3\2\2\2\u059f\u05a0\3\2\2\2\u05a0\u05a1"+
- "\5\u00a2R\2\u05a1\u05a2\7o\2\2\u05a2\u05a3\7e\2\2\u05a3\u05a4\7]\2\2\u05a4"+
- "\u05a5\7f\2\2\u05a5\u0105\3\2\2\2\u05a6\u05a7\5\u0108\u0085\2\u05a7\u05a9"+
- "\7n\2\2\u05a8\u05aa\5\u00dep\2\u05a9\u05a8\3\2\2\2\u05a9\u05aa\3\2\2\2"+
- "\u05aa\u0107\3\2\2\2\u05ab\u05ac\7O\2\2\u05ac\u05af\5\u010a\u0086\2\u05ad"+
- "\u05af\7K\2\2\u05ae\u05ab\3\2\2\2\u05ae\u05ad\3\2\2\2\u05af\u0109\3\2"+
- "\2\2\u05b0\u05b3\5\u00b0Y\2\u05b1\u05b3\7c\2\2\u05b2\u05b0\3\2\2\2\u05b2"+
- "\u05b1\3\2\2\2\u05b3\u05bb\3\2\2\2\u05b4\u05b7\7l\2\2\u05b5\u05b8\5\u00b0"+
- "Y\2\u05b6\u05b8\7c\2\2\u05b7\u05b5\3\2\2\2\u05b7\u05b6\3\2\2\2\u05b8\u05ba"+
- "\3\2\2\2\u05b9\u05b4\3\2\2\2\u05ba\u05bd\3\2\2\2\u05bb\u05b9\3\2\2\2\u05bb"+
- "\u05bc\3\2\2\2\u05bc\u010b\3\2\2\2\u05bd\u05bb\3\2\2\2\u05be\u05bf\7N"+
- "\2\2\u05bf\u05c3\7g\2\2\u05c0\u05c2\5\u010e\u0088\2\u05c1\u05c0\3\2\2"+
- "\2\u05c2\u05c5\3\2\2\2\u05c3\u05c1\3\2\2\2\u05c3\u05c4\3\2\2\2\u05c4\u05c6"+
- "\3\2\2\2\u05c5\u05c3\3\2\2\2\u05c6\u05c7\7h\2\2\u05c7\u010d\3\2\2\2\u05c8"+
- "\u05c9\5\u0110\u0089\2\u05c9\u05cb\7n\2\2\u05ca\u05cc\5\u00dep\2\u05cb"+
- "\u05ca\3\2\2\2\u05cb\u05cc\3\2\2\2\u05cc\u010f\3\2\2\2\u05cd\u05d0\7O"+
- "\2\2\u05ce\u05d1\5\u00e4s\2\u05cf\u05d1\5\u0112\u008a\2\u05d0\u05ce\3"+
- "\2\2\2\u05d0\u05cf\3\2\2\2\u05d1\u05d4\3\2\2\2\u05d2\u05d4\7K\2\2\u05d3"+
- "\u05cd\3\2\2\2\u05d3\u05d2\3\2\2\2\u05d4\u0111\3\2\2\2\u05d5\u05d6\5\u00d4"+
- "k\2\u05d6\u05d7\7k\2\2\u05d7\u05dc\3\2\2\2\u05d8\u05d9\5\u00d2j\2\u05d9"+
- "\u05da\7r\2\2\u05da\u05dc\3\2\2\2\u05db\u05d5\3\2\2\2\u05db\u05d8\3\2"+
- "\2\2\u05db\u05dc\3\2\2\2\u05dc\u05dd\3\2\2\2\u05dd\u05de\5\u0092J\2\u05de"+
- "\u0113\3\2\2\2\u05df\u05e3\7_\2\2\u05e0\u05e4\5\u0092J\2\u05e1\u05e4\5"+
- "\u0116\u008c\2\u05e2\u05e4\5\u00c6d\2\u05e3\u05e0\3\2\2\2\u05e3\u05e1"+
- "\3\2\2\2\u05e3\u05e2\3\2\2\2\u05e3\u05e4\3\2\2\2\u05e4\u05e5\3\2\2\2\u05e5"+
- "\u05e6\5\u00dco\2\u05e6\u0115\3\2\2\2\u05e7\u05e9\5\u00e0q\2\u05e8\u05e7"+
- "\3\2\2\2\u05e8\u05e9\3\2\2\2\u05e9\u05ea\3\2\2\2\u05ea\u05ec\5\u015e\u00b0"+
- "\2\u05eb\u05ed\5\u0092J\2\u05ec\u05eb\3\2\2\2\u05ec\u05ed\3\2\2\2\u05ed"+
- "\u05ee\3\2\2\2\u05ee\u05f0\5\u015e\u00b0\2\u05ef\u05f1\5\u00e0q\2\u05f0"+
- "\u05ef\3\2\2\2\u05f0\u05f1\3\2\2\2\u05f1\u0117\3\2\2\2\u05f2\u05f3\7Q"+
- "\2\2\u05f3\u05f4\5\u0092J\2\u05f4\u0119\3\2\2\2\u05f5\u05f8\5\u013e\u00a0"+
- "\2\u05f6\u05f8\7d\2\2\u05f7\u05f5\3\2\2\2\u05f7\u05f6\3\2\2\2\u05f8\u011b"+
- "\3\2\2\2\u05f9\u05fa\7i\2\2\u05fa\u05fb\5\u011e\u0090\2\u05fb\u05fc\7"+
- "j\2\2\u05fc\u05fd\5\u0120\u0091\2\u05fd\u011d\3\2\2\2\u05fe\u05ff\5\u0092"+
- "J\2\u05ff\u011f\3\2\2\2\u0600\u0601\5\u00b0Y\2\u0601\u0121\3\2\2\2\u0602"+
- "\u0603\7\u0086\2\2\u0603\u0604\5\u00b0Y\2\u0604\u0123\3\2\2\2\u0605\u0606"+
- "\7i\2\2\u0606\u0607\7j\2\2\u0607\u0608\5\u0120\u0091\2\u0608\u0125\3\2"+
- "\2\2\u0609\u060a\7R\2\2\u060a\u060b\7i\2\2\u060b\u060c\5\u00b0Y\2\u060c"+
- "\u060d\7j\2\2\u060d\u060e\5\u0120\u0091\2\u060e\u0127\3\2\2\2\u060f\u0615"+
- "\7T\2\2\u0610\u0611\7T\2\2\u0611\u0615\7\u0088\2\2\u0612\u0613\7\u0088"+
- "\2\2\u0613\u0615\7T\2\2\u0614\u060f\3\2\2\2\u0614\u0610\3\2\2\2\u0614"+
- "\u0612\3\2\2\2\u0615\u0616\3\2\2\2\u0616\u0617\5\u0120\u0091\2\u0617\u0129"+
- "\3\2\2\2\u0618\u0619\7L\2\2\u0619\u061a\5\u012c\u0097\2\u061a\u012b\3"+
- "\2\2\2\u061b\u061c\5\u0130\u0099\2\u061c\u061d\5\u012e\u0098\2\u061d\u0620"+
- "\3\2\2\2\u061e\u0620\5\u0130\u0099\2\u061f\u061b\3\2\2\2\u061f\u061e\3"+
- "\2\2\2\u0620\u012d\3\2\2\2\u0621\u0624\5\u0130\u0099\2\u0622\u0624\5\u00b0"+
- "Y\2\u0623\u0621\3\2\2\2\u0623\u0622\3\2\2\2\u0624\u012f\3\2\2\2\u0625"+
- "\u0631\7e\2\2\u0626\u062b\5\u008aF\2\u0627\u0628\7l\2\2\u0628\u062a\5"+
- "\u008aF\2\u0629\u0627\3\2\2\2\u062a\u062d\3\2\2\2\u062b\u0629\3\2\2\2"+
- "\u062b\u062c\3\2\2\2\u062c\u062f\3\2\2\2\u062d\u062b\3\2\2\2\u062e\u0630"+
- "\7l\2\2\u062f\u062e\3\2\2\2\u062f\u0630\3\2\2\2\u0630\u0632\3\2\2\2\u0631"+
- "\u0626\3\2\2\2\u0631\u0632\3\2\2\2\u0632\u0633\3\2\2\2\u0633\u0634\7f"+
- "\2\2\u0634\u0131\3\2\2\2\u0635\u0636\5\u0134\u009b\2\u0636\u0637\7e\2"+
- "\2\u0637\u0639\5\u0092J\2\u0638\u063a\7l\2\2\u0639\u0638\3\2\2\2\u0639"+
- "\u063a\3\2\2\2\u063a\u063b\3\2\2\2\u063b\u063c\7f\2\2\u063c\u0133\3\2"+
- "\2\2\u063d\u0643\5\u00b2Z\2\u063e\u063f\7e\2\2\u063f\u0640\5\u0134\u009b"+
- "\2\u0640\u0641\7f\2\2\u0641\u0643\3\2\2\2\u0642\u063d\3\2\2\2\u0642\u063e"+
- "\3\2\2\2\u0643\u0135\3\2\2\2\u0644\u064b\5\u0138\u009d\2\u0645\u064b\5"+
- "\u013c\u009f\2\u0646\u0647\7e\2\2\u0647\u0648\5\u0092J\2\u0648\u0649\7"+
- "f\2\2\u0649\u064b\3\2\2\2\u064a\u0644\3\2\2\2\u064a\u0645\3\2\2\2\u064a"+
- "\u0646\3\2\2\2\u064b\u0137\3\2\2\2\u064c\u0650\5\u00a0Q\2\u064d\u0650"+
- "\5\u0140\u00a1\2\u064e\u0650\5\u00a4S\2\u064f\u064c\3\2\2\2\u064f\u064d"+
- "\3\2\2\2\u064f\u064e\3\2\2\2\u0650\u0139\3\2\2\2\u0651\u0652\t\23\2\2"+
- "\u0652\u013b\3\2\2\2\u0653\u0654\7d\2\2\u0654\u013d\3\2\2\2\u0655\u0656"+
- "\7d\2\2\u0656\u0657\7o\2\2\u0657\u0658\7d\2\2\u0658\u013f\3\2\2\2\u0659"+
- "\u065a\5\u00b8]\2\u065a\u065b\5\u0142\u00a2\2\u065b\u0141\3\2\2\2\u065c"+
- "\u0661\7g\2\2\u065d\u065f\5\u0144\u00a3\2\u065e\u0660\7l\2\2\u065f\u065e"+
- "\3\2\2\2\u065f\u0660\3\2\2\2\u0660\u0662\3\2\2\2\u0661\u065d\3\2\2\2\u0661"+
- "\u0662\3\2\2\2\u0662\u0663\3\2\2\2\u0663\u0664\7h\2\2\u0664\u0143\3\2"+
- "\2\2\u0665\u066a\5\u0146\u00a4\2\u0666\u0667\7l\2\2\u0667\u0669\5\u0146"+
- "\u00a4\2\u0668\u0666\3\2\2\2\u0669\u066c\3\2\2\2\u066a\u0668\3\2\2\2\u066a"+
- "\u066b\3\2\2\2\u066b\u0145\3\2\2\2\u066c\u066a\3\2\2\2\u066d\u066e\5\u0148"+
- "\u00a5\2\u066e\u066f\7n\2\2\u066f\u0671\3\2\2\2\u0670\u066d\3\2\2\2\u0670"+
- "\u0671\3\2\2\2\u0671\u0672\3\2\2\2\u0672\u0673\5\u014a\u00a6\2\u0673\u0147"+
- "\3\2\2\2\u0674\u0677\5\u0092J\2\u0675\u0677\5\u0142\u00a2\2\u0676\u0674"+
- "\3\2\2\2\u0676\u0675\3\2\2\2\u0677\u0149\3\2\2\2\u0678\u067b\5\u0092J"+
- "\2\u0679\u067b\5\u0142\u00a2\2\u067a\u0678\3\2\2\2\u067a\u0679\3\2\2\2"+
- "\u067b\u014b\3\2\2\2\u067c\u067d\7S\2\2\u067d\u0683\7g\2\2\u067e\u067f"+
- "\5\u014e\u00a8\2\u067f\u0680\5\u015e\u00b0\2\u0680\u0682\3\2\2\2\u0681"+
- "\u067e\3\2\2\2\u0682\u0685\3\2\2\2\u0683\u0681\3\2\2\2\u0683\u0684\3\2"+
- "\2\2\u0684\u0686\3\2\2\2\u0685\u0683\3\2\2\2\u0686\u0687\7h\2\2\u0687"+
- "\u014d\3\2\2\2\u0688\u0689\5\u00d2j\2\u0689\u068a\5\u00b0Y\2\u068a\u068d"+
- "\3\2\2\2\u068b\u068d\5\u0152\u00aa\2\u068c\u0688\3\2\2\2\u068c\u068b\3"+
- "\2\2\2\u068d\u068f\3\2\2\2\u068e\u0690\5\u0150\u00a9\2\u068f\u068e\3\2"+
- "\2\2\u068f\u0690\3\2\2\2\u0690\u014f\3\2\2\2\u0691\u0692\t\24\2\2\u0692"+
- "\u0151\3\2\2\2\u0693\u0695\7\u0086\2\2\u0694\u0693\3\2\2\2\u0694\u0695"+
- "\3\2\2\2\u0695\u0696\3\2\2\2\u0696\u0697\5\u011a\u008e\2\u0697\u0153\3"+
- "\2\2\2\u0698\u0699\7i\2\2\u0699\u069a\5\u0092J\2\u069a\u069b\7j\2\2\u069b"+
- "\u0155\3\2\2\2\u069c\u069d\7o\2\2\u069d\u069e\7e\2\2\u069e\u069f\5\u00b0"+
- "Y\2\u069f\u06a0\7f\2\2\u06a0\u0157\3\2\2\2\u06a1\u06b0\7e\2\2\u06a2\u06a9"+
- "\5\u00d4k\2\u06a3\u06a6\5\u0134\u009b\2\u06a4\u06a5\7l\2\2\u06a5\u06a7"+
- "\5\u00d4k\2\u06a6\u06a4\3\2\2\2\u06a6\u06a7\3\2\2\2\u06a7\u06a9\3\2\2"+
- "\2\u06a8\u06a2\3\2\2\2\u06a8\u06a3\3\2\2\2\u06a9\u06ab\3\2\2\2\u06aa\u06ac"+
- "\7s\2\2\u06ab\u06aa\3\2\2\2\u06ab\u06ac\3\2\2\2\u06ac\u06ae\3\2\2\2\u06ad"+
- "\u06af\7l\2\2\u06ae\u06ad\3\2\2\2\u06ae\u06af\3\2\2\2\u06af\u06b1\3\2"+
- "\2\2\u06b0\u06a8\3\2\2\2\u06b0\u06b1\3\2\2\2\u06b1\u06b2\3\2\2\2\u06b2"+
- "\u06b3\7f\2\2\u06b3\u0159\3\2\2\2\u06b4\u06b5\5\u0134\u009b\2\u06b5\u06b6"+
- "\7o\2\2\u06b6\u06b7\7d\2\2\u06b7\u015b\3\2\2\2\u06b8\u06b9\5\u00b0Y\2"+
- "\u06b9\u015d\3\2\2\2\u06ba\u06bf\7m\2\2\u06bb\u06bf\7\2\2\3\u06bc\u06bf"+
- "\7\u009e\2\2\u06bd\u06bf\6\u00b0\24\2\u06be\u06ba\3\2\2\2\u06be\u06bb"+
- "\3\2\2\2\u06be\u06bc\3\2\2\2\u06be\u06bd\3\2\2\2\u06bf\u015f\3\2\2\2\u00b3"+
- "\u016e\u0173\u017a\u0184\u018a\u0190\u01a0\u01a4\u01ad\u01b9\u01bd\u01c3"+
- "\u01cb\u01d5\u01e5\u01f3\u01f7\u01fe\u0206\u020f\u022f\u0237\u024f\u0260"+
- "\u026c\u0275\u0283\u0295\u029c\u02a1\u02a6\u02b0\u02b3\u02b7\u02bb\u02c2"+
- "\u02c5\u02cb\u02d0\u02d2\u02d5\u02dc\u02e1\u02f4\u02fc\u0300\u0303\u0309"+
- "\u030d\u0310\u031a\u0321\u0328\u0334\u033a\u0341\u0346\u034c\u0358\u035e"+
- "\u0362\u036a\u036e\u0374\u0377\u037d\u0382\u0396\u03b9\u03bb\u03d2\u03da"+
- "\u03e5\u03ec\u03f3\u03fd\u040b\u0421\u0423\u042b\u042f\u0433\u0436\u043f"+
- "\u0445\u044f\u0457\u045d\u0466\u0471\u047c\u0480\u0482\u048d\u0496\u049a"+
- "\u049d\u04a4\u04af\u04b9\u04bf\u04c1\u04cb\u04d5\u04d9\u04dd\u04e1\u04e8"+
- "\u04f0\u04fb\u04ff\u0503\u050f\u0513\u0517\u051c\u0523\u052a\u053e\u0542"+
- "\u0546\u054a\u055a\u0560\u0562\u0566\u056a\u056d\u0571\u0573\u0579\u0581"+
- "\u0586\u0591\u0597\u059e\u05a9\u05ae\u05b2\u05b7\u05bb\u05c3\u05cb\u05d0"+
- "\u05d3\u05db\u05e3\u05e8\u05ec\u05f0\u05f7\u0614\u061f\u0623\u062b\u062f"+
- "\u0631\u0639\u0642\u064a\u064f\u065f\u0661\u066a\u0670\u0676\u067a\u0683"+
- "\u068c\u068f\u0694\u06a6\u06a8\u06ab\u06ae\u06b0\u06be";
+ "\u014e\u0150\u0152\u0154\u0156\u0158\u015a\u015c\u015e\u0160\u0162\2\25"+
+ "\4\2eepp\3\2\31\32\3\2\7\n\3\2AB\3\2)+\4\2)+--\3\2\u0083\u0089\3\2\26"+
+ "\27\4\2~\u0082\u0087\u0088\6\2$$qq}}\u0084\u0086\3\2 \"\3\2\35\37\4\2"+
+ "HIw|\6\2..\61\61\64\64]]\4\2}\u0082\u0084\u0088\3\2qr\4\2nn\u009f\u009f"+
+ "\4\2\u008a\u008d\u008f\u0090\3\2\u0096\u0097\2\u073d\2\u0164\3\2\2\2\4"+
+ "\u0167\3\2\2\2\6\u016a\3\2\2\2\b\u016d\3\2\2\2\n\u0175\3\2\2\2\f\u017e"+
+ "\3\2\2\2\16\u0199\3\2\2\2\20\u019c\3\2\2\2\22\u01a4\3\2\2\2\24\u01b1\3"+
+ "\2\2\2\26\u01c7\3\2\2\2\30\u01cf\3\2\2\2\32\u01d1\3\2\2\2\34\u01d3\3\2"+
+ "\2\2\36\u01d6\3\2\2\2 \u01e9\3\2\2\2\"\u01eb\3\2\2\2$\u01ed\3\2\2\2&\u01f2"+
+ "\3\2\2\2(\u01fd\3\2\2\2*\u020a\3\2\2\2,\u020d\3\2\2\2.\u0218\3\2\2\2\60"+
+ "\u021a\3\2\2\2\62\u021f\3\2\2\2\64\u0224\3\2\2\2\66\u0229\3\2\2\28\u022e"+
+ "\3\2\2\2:\u023b\3\2\2\2<\u023d\3\2\2\2>\u023f\3\2\2\2@\u0244\3\2\2\2B"+
+ "\u0249\3\2\2\2D\u024e\3\2\2\2F\u0257\3\2\2\2H\u025e\3\2\2\2J\u0269\3\2"+
+ "\2\2L\u0271\3\2\2\2N\u0273\3\2\2\2P\u0288\3\2\2\2R\u028a\3\2\2\2T\u0296"+
+ "\3\2\2\2V\u02a2\3\2\2\2X\u02b2\3\2\2\2Z\u02be\3\2\2\2\\\u02cd\3\2\2\2"+
+ "^\u02d0\3\2\2\2`\u02d8\3\2\2\2b\u02da\3\2\2\2d\u02e8\3\2\2\2f\u02f4\3"+
+ "\2\2\2h\u02fe\3\2\2\2j\u0302\3\2\2\2l\u0308\3\2\2\2n\u0320\3\2\2\2p\u0328"+
+ "\3\2\2\2r\u0337\3\2\2\2t\u0339\3\2\2\2v\u0340\3\2\2\2x\u0349\3\2\2\2z"+
+ "\u034e\3\2\2\2|\u0353\3\2\2\2~\u0359\3\2\2\2\u0080\u0360\3\2\2\2\u0082"+
+ "\u0365\3\2\2\2\u0084\u036b\3\2\2\2\u0086\u0370\3\2\2\2\u0088\u0377\3\2"+
+ "\2\2\u008a\u0381\3\2\2\2\u008c\u0385\3\2\2\2\u008e\u0391\3\2\2\2\u0090"+
+ "\u0394\3\2\2\2\u0092\u0398\3\2\2\2\u0094\u039f\3\2\2\2\u0096\u03b3\3\2"+
+ "\2\2\u0098\u03ef\3\2\2\2\u009a\u03f1\3\2\2\2\u009c\u03f4\3\2\2\2\u009e"+
+ "\u03f9\3\2\2\2\u00a0\u0402\3\2\2\2\u00a2\u0410\3\2\2\2\u00a4\u041a\3\2"+
+ "\2\2\u00a6\u0428\3\2\2\2\u00a8\u0443\3\2\2\2\u00aa\u0446\3\2\2\2\u00ac"+
+ "\u044e\3\2\2\2\u00ae\u0457\3\2\2\2\u00b0\u0467\3\2\2\2\u00b2\u047a\3\2"+
+ "\2\2\u00b4\u0483\3\2\2\2\u00b6\u048e\3\2\2\2\u00b8\u0490\3\2\2\2\u00ba"+
+ "\u0493\3\2\2\2\u00bc\u04aa\3\2\2\2\u00be\u04ac\3\2\2\2\u00c0\u04b1\3\2"+
+ "\2\2\u00c2\u04c5\3\2\2\2\u00c4\u04c7\3\2\2\2\u00c6\u04c9\3\2\2\2\u00c8"+
+ "\u04cc\3\2\2\2\u00ca\u04d6\3\2\2\2\u00cc\u04e0\3\2\2\2\u00ce\u04e3\3\2"+
+ "\2\2\u00d0\u04e8\3\2\2\2\u00d2\u04ea\3\2\2\2\u00d4\u04f8\3\2\2\2\u00d6"+
+ "\u0500\3\2\2\2\u00d8\u0508\3\2\2\2\u00da\u0510\3\2\2\2\u00dc\u051e\3\2"+
+ "\2\2\u00de\u0524\3\2\2\2\u00e0\u0532\3\2\2\2\u00e2\u053e\3\2\2\2\u00e4"+
+ "\u0547\3\2\2\2\u00e6\u0549\3\2\2\2\u00e8\u054b\3\2\2\2\u00ea\u054f\3\2"+
+ "\2\2\u00ec\u0552\3\2\2\2\u00ee\u0556\3\2\2\2\u00f0\u0558\3\2\2\2\u00f2"+
+ "\u055d\3\2\2\2\u00f4\u0561\3\2\2\2\u00f6\u0565\3\2\2\2\u00f8\u0569\3\2"+
+ "\2\2\u00fa\u056c\3\2\2\2\u00fc\u056e\3\2\2\2\u00fe\u0583\3\2\2\2\u0100"+
+ "\u0585\3\2\2\2\u0102\u059b\3\2\2\2\u0104\u05a3\3\2\2\2\u0106\u05a5\3\2"+
+ "\2\2\u0108\u05bb\3\2\2\2\u010a\u05c3\3\2\2\2\u010c\u05cb\3\2\2\2\u010e"+
+ "\u05cf\3\2\2\2\u0110\u05db\3\2\2\2\u0112\u05e5\3\2\2\2\u0114\u05f0\3\2"+
+ "\2\2\u0116\u05f8\3\2\2\2\u0118\u05fc\3\2\2\2\u011a\u0605\3\2\2\2\u011c"+
+ "\u060f\3\2\2\2\u011e\u0614\3\2\2\2\u0120\u0616\3\2\2\2\u0122\u061b\3\2"+
+ "\2\2\u0124\u061d\3\2\2\2\u0126\u061f\3\2\2\2\u0128\u0622\3\2\2\2\u012a"+
+ "\u0626\3\2\2\2\u012c\u0631\3\2\2\2\u012e\u0635\3\2\2\2\u0130\u063c\3\2"+
+ "\2\2\u0132\u0640\3\2\2\2\u0134\u0642\3\2\2\2\u0136\u0652\3\2\2\2\u0138"+
+ "\u065f\3\2\2\2\u013a\u0667\3\2\2\2\u013c\u066c\3\2\2\2\u013e\u066e\3\2"+
+ "\2\2\u0140\u0670\3\2\2\2\u0142\u0672\3\2\2\2\u0144\u0676\3\2\2\2\u0146"+
+ "\u0679\3\2\2\2\u0148\u0682\3\2\2\2\u014a\u068d\3\2\2\2\u014c\u0693\3\2"+
+ "\2\2\u014e\u0697\3\2\2\2\u0150\u0699\3\2\2\2\u0152\u06a9\3\2\2\2\u0154"+
+ "\u06ae\3\2\2\2\u0156\u06b1\3\2\2\2\u0158\u06b5\3\2\2\2\u015a\u06b9\3\2"+
+ "\2\2\u015c\u06be\3\2\2\2\u015e\u06d1\3\2\2\2\u0160\u06d5\3\2\2\2\u0162"+
+ "\u06db\3\2\2\2\u0164\u0165\5\u0096L\2\u0165\u0166\7\2\2\3\u0166\3\3\2"+
+ "\2\2\u0167\u0168\5\u0098M\2\u0168\u0169\7\2\2\3\u0169\5\3\2\2\2\u016a"+
+ "\u016b\5\u00b4[\2\u016b\u016c\7\2\2\3\u016c\7\3\2\2\2\u016d\u0172\5\n"+
+ "\6\2\u016e\u016f\7m\2\2\u016f\u0171\5\n\6\2\u0170\u016e\3\2\2\2\u0171"+
+ "\u0174\3\2\2\2\u0172\u0170\3\2\2\2\u0172\u0173\3\2\2\2\u0173\t\3\2\2\2"+
+ "\u0174\u0172\3\2\2\2\u0175\u0177\7e\2\2\u0176\u0178\7<\2\2\u0177\u0176"+
+ "\3\2\2\2\u0177\u0178\3\2\2\2\u0178\13\3\2\2\2\u0179\u017a\5\16\b\2\u017a"+
+ "\u017b\5\u0162\u00b2\2\u017b\u017d\3\2\2\2\u017c\u0179\3\2\2\2\u017d\u0180"+
+ "\3\2\2\2\u017e\u017c\3\2\2\2\u017e\u017f\3\2\2\2\u017f\u0181\3\2\2\2\u0180"+
+ "\u017e\3\2\2\2\u0181\u0182\5\u00ccg\2\u0182\u0188\5\u0162\u00b2\2\u0183"+
+ "\u0184\5\24\13\2\u0184\u0185\5\u0162\u00b2\2\u0185\u0187\3\2\2\2\u0186"+
+ "\u0183\3\2\2\2\u0187\u018a\3\2\2\2\u0188\u0186\3\2\2\2\u0188\u0189\3\2"+
+ "\2\2\u0189\u0194\3\2\2\2\u018a\u0188\3\2\2\2\u018b\u018f\5z>\2\u018c\u018f"+
+ "\5\u00d0i\2\u018d\u018f\5\26\f\2\u018e\u018b\3\2\2\2\u018e\u018c\3\2\2"+
+ "\2\u018e\u018d\3\2\2\2\u018f\u0190\3\2\2\2\u0190\u0191\5\u0162\u00b2\2"+
+ "\u0191\u0193\3\2\2\2\u0192\u018e\3\2\2\2\u0193\u0196\3\2\2\2\u0194\u0192"+
+ "\3\2\2\2\u0194\u0195\3\2\2\2\u0195\u0197\3\2\2\2\u0196\u0194\3\2\2\2\u0197"+
+ "\u0198\7\2\2\3\u0198\r\3\2\2\2\u0199\u019a\7E\2\2\u019a\u019b\5\u0096"+
+ "L\2\u019b\17\3\2\2\2\u019c\u019d\7F\2\2\u019d\u019e\5\u0096L\2\u019e\21"+
+ "\3\2\2\2\u019f\u01a0\5\20\t\2\u01a0\u01a1\5\u0162\u00b2\2\u01a1\u01a3"+
+ "\3\2\2\2\u01a2\u019f\3\2\2\2\u01a3\u01a6\3\2\2\2\u01a4\u01a2\3\2\2\2\u01a4"+
+ "\u01a5\3\2\2\2\u01a5\u01a8\3\2\2\2\u01a6\u01a4\3\2\2\2\u01a7\u01a9\t\2"+
+ "\2\2\u01a8\u01a7\3\2\2\2\u01a8\u01a9\3\2\2\2\u01a9\u01aa\3\2\2\2\u01aa"+
+ "\u01ab\5\u00ceh\2\u01ab\23\3\2\2\2\u01ac\u01ad\5\20\t\2\u01ad\u01ae\5"+
+ "\u0162\u00b2\2\u01ae\u01b0\3\2\2\2\u01af\u01ac\3\2\2\2\u01b0\u01b3\3\2"+
+ "\2\2\u01b1\u01af\3\2\2\2\u01b1\u01b2\3\2\2\2\u01b2\u01c1\3\2\2\2\u01b3"+
+ "\u01b1\3\2\2\2\u01b4\u01b5\7a\2\2\u01b5\u01c2\5\22\n\2\u01b6\u01b7\7a"+
+ "\2\2\u01b7\u01bd\7f\2\2\u01b8\u01b9\5\22\n\2\u01b9\u01ba\5\u0162\u00b2"+
+ "\2\u01ba\u01bc\3\2\2\2\u01bb\u01b8\3\2\2\2\u01bc\u01bf\3\2\2\2\u01bd\u01bb"+
+ "\3\2\2\2\u01bd\u01be\3\2\2\2\u01be\u01c0\3\2\2\2\u01bf\u01bd\3\2\2\2\u01c0"+
+ "\u01c2\7g\2\2\u01c1\u01b4\3\2\2\2\u01c1\u01b6\3\2\2\2\u01c2\25\3\2\2\2"+
+ "\u01c3\u01c8\5l\67\2\u01c4\u01c8\5\u0082B\2\u01c5\u01c8\5\u0086D\2\u01c6"+
+ "\u01c8\5\u0080A\2\u01c7\u01c3\3\2\2\2\u01c7\u01c4\3\2\2\2\u01c7\u01c5"+
+ "\3\2\2\2\u01c7\u01c6\3\2\2\2\u01c8\27\3\2\2\2\u01c9\u01ca\7\34\2\2\u01ca"+
+ "\u01d0\5\u0098M\2\u01cb\u01cc\t\3\2\2\u01cc\u01d0\5.\30\2\u01cd\u01ce"+
+ "\t\4\2\2\u01ce\u01d0\5\u0096L\2\u01cf\u01c9\3\2\2\2\u01cf\u01cb\3\2\2"+
+ "\2\u01cf\u01cd\3\2\2\2\u01d0\31\3\2\2\2\u01d1\u01d2\5\34\17\2\u01d2\33"+
+ "\3\2\2\2\u01d3\u01d4\5Z.\2\u01d4\u01d5\5\36\20\2\u01d5\35\3\2\2\2\u01d6"+
+ "\u01d7\7D\2\2\u01d7\u01d9\7f\2\2\u01d8\u01da\5\u00e2r\2\u01d9\u01d8\3"+
+ "\2\2\2\u01d9\u01da\3\2\2\2\u01da\u01db\3\2\2\2\u01db\u01dc\7g\2\2\u01dc"+
+ "\37\3\2\2\2\u01dd\u01ea\5F$\2\u01de\u01ea\5D#\2\u01df\u01ea\5B\"\2\u01e0"+
+ "\u01ea\5$\23\2\u01e1\u01ea\5@!\2\u01e2\u01ea\58\35\2\u01e3\u01ea\5> \2"+
+ "\u01e4\u01ea\5\66\34\2\u01e5\u01ea\5\62\32\2\u01e6\u01ea\5\60\31\2\u01e7"+
+ "\u01ea\5\64\33\2\u01e8\u01ea\5\"\22\2\u01e9\u01dd\3\2\2\2\u01e9\u01de"+
+ "\3\2\2\2\u01e9\u01df\3\2\2\2\u01e9\u01e0\3\2\2\2\u01e9\u01e1\3\2\2\2\u01e9"+
+ "\u01e2\3\2\2\2\u01e9\u01e3\3\2\2\2\u01e9\u01e4\3\2\2\2\u01e9\u01e5\3\2"+
+ "\2\2\u01e9\u01e6\3\2\2\2\u01e9\u01e7\3\2\2\2\u01e9\u01e8\3\2\2\2\u01ea"+
+ "!\3\2\2\2\u01eb\u01ec\t\5\2\2\u01ec#\3\2\2\2\u01ed\u01ee\7^\2\2\u01ee"+
+ "\u01ef\7j\2\2\u01ef\u01f0\5\u00b4[\2\u01f0\u01f1\7k\2\2\u01f1%\3\2\2\2"+
+ "\u01f2\u01f7\5(\25\2\u01f3\u01f4\7m\2\2\u01f4\u01f6\5(\25\2\u01f5\u01f3"+
+ "\3\2\2\2\u01f6\u01f9\3\2\2\2\u01f7\u01f5\3\2\2\2\u01f7\u01f8\3\2\2\2\u01f8"+
+ "\u01fb\3\2\2\2\u01f9\u01f7\3\2\2\2\u01fa\u01fc\7m\2\2\u01fb\u01fa\3\2"+
+ "\2\2\u01fb\u01fc\3\2\2\2\u01fc\'\3\2\2\2\u01fd\u0202\7e\2\2\u01fe\u01ff"+
+ "\7m\2\2\u01ff\u0201\7e\2\2\u0200\u01fe\3\2\2\2\u0201\u0204\3\2\2\2\u0202"+
+ "\u0200\3\2\2\2\u0202\u0203\3\2\2\2\u0203\u0205\3\2\2\2\u0204\u0202\3\2"+
+ "\2\2\u0205\u0206\5\u0124\u0093\2\u0206)\3\2\2\2\u0207\u0209\5,\27\2\u0208"+
+ "\u0207\3\2\2\2\u0209\u020c\3\2\2\2\u020a\u0208\3\2\2\2\u020a\u020b\3\2"+
+ "\2\2\u020b+\3\2\2\2\u020c\u020a\3\2\2\2\u020d\u020e\7h\2\2\u020e\u0213"+
+ "\5\u0096L\2\u020f\u0210\7m\2\2\u0210\u0212\5\u0096L\2\u0211\u020f\3\2"+
+ "\2\2\u0212\u0215\3\2\2\2\u0213\u0211\3\2\2\2\u0213\u0214\3\2\2\2\u0214"+
+ "\u0216\3\2\2\2\u0215\u0213\3\2\2\2\u0216\u0217\7i\2\2\u0217-\3\2\2\2\u0218"+
+ "\u0219\5\u00a6T\2\u0219/\3\2\2\2\u021a\u021b\7\62\2\2\u021b\u021c\7f\2"+
+ "\2\u021c\u021d\5\u0096L\2\u021d\u021e\7g\2\2\u021e\61\3\2\2\2\u021f\u0220"+
+ "\7\67\2\2\u0220\u0221\7j\2\2\u0221\u0222\5\u00b4[\2\u0222\u0223\7k\2\2"+
+ "\u0223\63\3\2\2\2\u0224\u0225\7\63\2\2\u0225\u0226\7f\2\2\u0226\u0227"+
+ "\5\u0096L\2\u0227\u0228\7g\2\2\u0228\65\3\2\2\2\u0229\u022a\t\6\2\2\u022a"+
+ "\u022b\7f\2\2\u022b\u022c\5\u0096L\2\u022c\u022d\7g\2\2\u022d\67\3\2\2"+
+ "\2\u022e\u0233\7\23\2\2\u022f\u0230\7j\2\2\u0230\u0231\5:\36\2\u0231\u0232"+
+ "\7k\2\2\u0232\u0234\3\2\2\2\u0233\u022f\3\2\2\2\u0233\u0234\3\2\2\2\u0234"+
+ "\u0235\3\2\2\2\u0235\u0236\7f\2\2\u0236\u0237\5\u0096L\2\u0237\u0238\7"+
+ "g\2\2\u02389\3\2\2\2\u0239\u023c\5<\37\2\u023a\u023c\7\25\2\2\u023b\u0239"+
+ "\3\2\2\2\u023b\u023a\3\2\2\2\u023c;\3\2\2\2\u023d\u023e\7e\2\2\u023e="+
+ "\3\2\2\2\u023f\u0240\7\24\2\2\u0240\u0241\7f\2\2\u0241\u0242\5\u0096L"+
+ "\2\u0242\u0243\7g\2\2\u0243?\3\2\2\2\u0244\u0245\7:\2\2\u0245\u0246\7"+
+ "f\2\2\u0246\u0247\5\u0096L\2\u0247\u0248\7g\2\2\u0248A\3\2\2\2\u0249\u024a"+
+ "\79\2\2\u024a\u024b\7f\2\2\u024b\u024c\5\u0096L\2\u024c\u024d\7g\2\2\u024d"+
+ "C\3\2\2\2\u024e\u024f\7\30\2\2\u024f\u0250\7f\2\2\u0250\u0253\5\u0096"+
+ "L\2\u0251\u0252\7m\2\2\u0252\u0254\5\u0096L\2\u0253\u0251\3\2\2\2\u0253"+
+ "\u0254\3\2\2\2\u0254\u0255\3\2\2\2\u0255\u0256\7g\2\2\u0256E\3\2\2\2\u0257"+
+ "\u0258\t\6\2\2\u0258\u0259\7j\2\2\u0259\u025a\5\u0096L\2\u025a\u025b\7"+
+ "=\2\2\u025b\u025c\5\u0096L\2\u025c\u025d\7k\2\2\u025dG\3\2\2\2\u025e\u025f"+
+ "\7j\2\2\u025f\u0264\5J&\2\u0260\u0261\7m\2\2\u0261\u0263\5J&\2\u0262\u0260"+
+ "\3\2\2\2\u0263\u0266\3\2\2\2\u0264\u0262\3\2\2\2\u0264\u0265\3\2\2\2\u0265"+
+ "\u0267\3\2\2\2\u0266\u0264\3\2\2\2\u0267\u0268\7k\2\2\u0268I\3\2\2\2\u0269"+
+ "\u026a\5\u0096L\2\u026a\u026b\7l\2\2\u026b\u026c\5\u0096L\2\u026cK\3\2"+
+ "\2\2\u026d\u0272\5X-\2\u026e\u0272\5V,\2\u026f\u0272\5N(\2\u0270\u0272"+
+ "\5R*\2\u0271\u026d\3\2\2\2\u0271\u026e\3\2\2\2\u0271\u026f\3\2\2\2\u0271"+
+ "\u0270\3\2\2\2\u0272M\3\2\2\2\u0273\u0274\7\64\2\2\u0274\u027a\7h\2\2"+
+ "\u0275\u0276\5P)\2\u0276\u0277\5\u0162\u00b2\2\u0277\u0279\3\2\2\2\u0278"+
+ "\u0275\3\2\2\2\u0279\u027c\3\2\2\2\u027a\u0278\3\2\2\2\u027a\u027b\3\2"+
+ "\2\2\u027b\u027d\3\2\2\2\u027c\u027a\3\2\2\2\u027d\u027e\7i\2\2\u027e"+
+ "O\3\2\2\2\u027f\u0280\7M\2\2\u0280\u0281\7e\2\2\u0281\u0289\5\u0130\u0099"+
+ "\2\u0282\u0283\7\65\2\2\u0283\u0284\7h\2\2\u0284\u0285\5\u0096L\2\u0285"+
+ "\u0286\5\u0162\u00b2\2\u0286\u0287\7i\2\2\u0287\u0289\3\2\2\2\u0288\u027f"+
+ "\3\2\2\2\u0288\u0282\3\2\2\2\u0289Q\3\2\2\2\u028a\u028b\7\66\2\2\u028b"+
+ "\u0291\7h\2\2\u028c\u028d\5T+\2\u028d\u028e\5\u0162\u00b2\2\u028e\u0290"+
+ "\3\2\2\2\u028f\u028c\3\2\2\2\u0290\u0293\3\2\2\2\u0291\u028f\3\2\2\2\u0291"+
+ "\u0292\3\2\2\2\u0292\u0294\3\2\2\2\u0293\u0291\3\2\2\2\u0294\u0295\7i"+
+ "\2\2\u0295S\3\2\2\2\u0296\u0297\7e\2\2\u0297\u029d\7h\2\2\u0298\u0299"+
+ "\5\u0152\u00aa\2\u0299\u029a\5\u0162\u00b2\2\u029a\u029c\3\2\2\2\u029b"+
+ "\u0298\3\2\2\2\u029c\u029f\3\2\2\2\u029d\u029b\3\2\2\2\u029d\u029e\3\2"+
+ "\2\2\u029e\u02a0\3\2\2\2\u029f\u029d\3\2\2\2\u02a0\u02a1\7i\2\2\u02a1"+
+ "U\3\2\2\2\u02a2\u02a3\7\34\2\2\u02a3\u02a4\7j\2\2\u02a4\u02a5\7k\2\2\u02a5"+
+ "\u02a6\5\u0124\u0093\2\u02a6W\3\2\2\2\u02a7\u02a8\t\7\2\2\u02a8\u02a9"+
+ "\7j\2\2\u02a9\u02aa\5\u00b4[\2\u02aa\u02ab\7k\2\2\u02ab\u02b3\3\2\2\2"+
+ "\u02ac\u02ad\7,\2\2\u02ad\u02ae\7j\2\2\u02ae\u02af\5\u00b4[\2\u02af\u02b0"+
+ "\7k\2\2\u02b0\u02b1\5\u00b4[\2\u02b1\u02b3\3\2\2\2\u02b2\u02a7\3\2\2\2"+
+ "\u02b2\u02ac\3\2\2\2\u02b3Y\3\2\2\2\u02b4\u02ba\5\\/\2\u02b5\u02b6\7\20"+
+ "\2\2\u02b6\u02ba\b.\1\2\u02b7\u02b8\7C\2\2\u02b8\u02ba\b.\1\2\u02b9\u02b4"+
+ "\3\2\2\2\u02b9\u02b5\3\2\2\2\u02b9\u02b7\3\2\2\2\u02ba\u02bb\3\2\2\2\u02bb"+
+ "\u02bd\5\u0162\u00b2\2\u02bc\u02b9\3\2\2\2\u02bd\u02c0\3\2\2\2\u02be\u02bf"+
+ "\3\2\2\2\u02be\u02bc\3\2\2\2\u02bf\u02c3\3\2\2\2\u02c0\u02be\3\2\2\2\u02c1"+
+ "\u02c2\7\20\2\2\u02c2\u02c4\b.\1\2\u02c3\u02c1\3\2\2\2\u02c3\u02c4\3\2"+
+ "\2\2\u02c4[\3\2\2\2\u02c5\u02c6\7\13\2\2\u02c6\u02ce\5`\61\2\u02c7\u02c8"+
+ "\7\f\2\2\u02c8\u02ce\5`\61\2\u02c9\u02ca\7\r\2\2\u02ca\u02ce\5`\61\2\u02cb"+
+ "\u02cc\7\17\2\2\u02cc\u02ce\5^\60\2\u02cd\u02c5\3\2\2\2\u02cd\u02c7\3"+
+ "\2\2\2\u02cd\u02c9\3\2\2\2\u02cd\u02cb\3\2\2\2\u02ce]\3\2\2\2\u02cf\u02d1"+
+ "\5\u00d8m\2\u02d0\u02cf\3\2\2\2\u02d0\u02d1\3\2\2\2\u02d1\u02d4\3\2\2"+
+ "\2\u02d2\u02d3\7\\\2\2\u02d3\u02d5\5\u0096L\2\u02d4\u02d2\3\2\2\2\u02d4"+
+ "\u02d5\3\2\2\2\u02d5_\3\2\2\2\u02d6\u02d9\3\2\2\2\u02d7\u02d9\5\u0096"+
+ "L\2\u02d8\u02d6\3\2\2\2\u02d8\u02d7\3\2\2\2\u02d9a\3\2\2\2\u02da\u02df"+
+ "\7h\2\2\u02db\u02dc\7;\2\2\u02dc\u02dd\5\u00d6l\2\u02dd\u02de\5\u0162"+
+ "\u00b2\2\u02de\u02e0\3\2\2\2\u02df\u02db\3\2\2\2\u02df\u02e0\3\2\2\2\u02e0"+
+ "\u02e2\3\2\2\2\u02e1\u02e3\5\u00e2r\2\u02e2\u02e1\3\2\2\2\u02e2\u02e3"+
+ "\3\2\2\2\u02e3\u02e4\3\2\2\2\u02e4\u02e5\7i\2\2\u02e5c\3\2\2\2\u02e6\u02e9"+
+ "\5\u0142\u00a2\2\u02e7\u02e9\7e\2\2\u02e8\u02e6\3\2\2\2\u02e8\u02e7\3"+
+ "\2\2\2\u02e9\u02f2\3\2\2\2\u02ea\u02ef\7h\2\2\u02eb\u02ed\5f\64\2\u02ec"+
+ "\u02ee\7m\2\2\u02ed\u02ec\3\2\2\2\u02ed\u02ee\3\2\2\2\u02ee\u02f0\3\2"+
+ "\2\2\u02ef\u02eb\3\2\2\2\u02ef\u02f0\3\2\2\2\u02f0\u02f1\3\2\2\2\u02f1"+
+ "\u02f3\7i\2\2\u02f2\u02ea\3\2\2\2\u02f2\u02f3\3\2\2\2\u02f3e\3\2\2\2\u02f4"+
+ "\u02f9\5h\65\2\u02f5\u02f6\7m\2\2\u02f6\u02f8\5h\65\2\u02f7\u02f5\3\2"+
+ "\2\2\u02f8\u02fb\3\2\2\2\u02f9\u02f7\3\2\2\2\u02f9\u02fa\3\2\2\2\u02fa"+
+ "g\3\2\2\2\u02fb\u02f9\3\2\2\2\u02fc\u02fd\7e\2\2\u02fd\u02ff\7o\2\2\u02fe"+
+ "\u02fc\3\2\2\2\u02fe\u02ff\3\2\2\2\u02ff\u0300\3\2\2\2\u0300\u0301\5\u0096"+
+ "L\2\u0301i\3\2\2\2\u0302\u0303\7G\2\2\u0303\u0304\5\u0096L\2\u0304\u0305"+
+ "\7\21\2\2\u0305\u0306\5d\63\2\u0306\u0307\5\u00e0q\2\u0307k\3\2\2\2\u0308"+
+ "\u0309\5\u00b4[\2\u0309\u030a\7\21\2\2\u030a\u031d\5\u00b4[\2\u030b\u0311"+
+ "\7h\2\2\u030c\u030d\5t;\2\u030d\u030e\5\u0162\u00b2\2\u030e\u0310\3\2"+
+ "\2\2\u030f\u030c\3\2\2\2\u0310\u0313\3\2\2\2\u0311\u030f\3\2\2\2\u0311"+
+ "\u0312\3\2\2\2\u0312\u0319\3\2\2\2\u0313\u0311\3\2\2\2\u0314\u0315\5n"+
+ "8\2\u0315\u0316\5\u0162\u00b2\2\u0316\u0318\3\2\2\2\u0317\u0314\3\2\2"+
+ "\2\u0318\u031b\3\2\2\2\u0319\u0317\3\2\2\2\u0319\u031a\3\2\2\2\u031a\u031c"+
+ "\3\2\2\2\u031b\u0319\3\2\2\2\u031c\u031e\7i\2\2\u031d\u030b\3\2\2\2\u031d"+
+ "\u031e\3\2\2\2\u031em\3\2\2\2\u031f\u0321\7\20\2\2\u0320\u031f\3\2\2\2"+
+ "\u0320\u0321\3\2\2\2\u0321\u0322\3\2\2\2\u0322\u0323\5p9\2\u0323\u0324"+
+ "\7e\2\2\u0324\u0326\5\u0130\u0099\2\u0325\u0327\5\u00e0q\2\u0326\u0325"+
+ "\3\2\2\2\u0326\u0327\3\2\2\2\u0327o\3\2\2\2\u0328\u032a\7f\2\2\u0329\u032b"+
+ "\7e\2\2\u032a\u0329\3\2\2\2\u032a\u032b\3\2\2\2\u032b\u032d\3\2\2\2\u032c"+
+ "\u032e\7\u0087\2\2\u032d\u032c\3\2\2\2\u032d\u032e\3\2\2\2\u032e\u032f"+
+ "\3\2\2\2\u032f\u0330\5\u011e\u0090\2\u0330\u0331\7g\2\2\u0331q\3\2\2\2"+
+ "\u0332\u0338\5\u00a6T\2\u0333\u0334\5\u00b4[\2\u0334\u0335\7p\2\2\u0335"+
+ "\u0336\7e\2\2\u0336\u0338\3\2\2\2\u0337\u0332\3\2\2\2\u0337\u0333\3\2"+
+ "\2\2\u0338s\3\2\2\2\u0339\u033a\78\2\2\u033a\u033b\7e\2\2\u033b\u033e"+
+ "\7s\2\2\u033c\u033f\5r:\2\u033d\u033f\5\u0140\u00a1\2\u033e\u033c\3\2"+
+ "\2\2\u033e\u033d\3\2\2\2\u033fu\3\2\2\2\u0340\u0341\7\60\2\2\u0341\u0342"+
+ "\7f\2\2\u0342\u0345\5\u00b4[\2\u0343\u0344\7m\2\2\u0344\u0346\5\u00d8"+
+ "m\2\u0345\u0343\3\2\2\2\u0345\u0346\3\2\2\2\u0346\u0347\3\2\2\2\u0347"+
+ "\u0348\7g\2\2\u0348w\3\2\2\2\u0349\u034a\7/\2\2\u034a\u034b\7f\2\2\u034b"+
+ "\u034c\5\u00b4[\2\u034c\u034d\7g\2\2\u034dy\3\2\2\2\u034e\u0351\5Z.\2"+
+ "\u034f\u0352\5|?\2\u0350\u0352\5~@\2\u0351\u034f\3\2\2\2\u0351\u0350\3"+
+ "\2\2\2\u0352{\3\2\2\2\u0353\u0354\7M\2\2\u0354\u0355\7e\2\2\u0355\u0357"+
+ "\5\u0130\u0099\2\u0356\u0358\5b\62\2\u0357\u0356\3\2\2\2\u0357\u0358\3"+
+ "\2\2\2\u0358}\3\2\2\2\u0359\u035a\7M\2\2\u035a\u035b\5\u008cG\2\u035b"+
+ "\u035c\7e\2\2\u035c\u035e\5\u0130\u0099\2\u035d\u035f\5b\62\2\u035e\u035d"+
+ "\3\2\2\2\u035e\u035f\3\2\2\2\u035f\177\3\2\2\2\u0360\u0363\7\34\2\2\u0361"+
+ "\u0364\5z>\2\u0362\u0364\5\u00d0i\2\u0363\u0361\3\2\2\2\u0363\u0362\3"+
+ "\2\2\2\u0364\u0081\3\2\2\2\u0365\u0366\78\2\2\u0366\u0367\7e\2\2\u0367"+
+ "\u0369\5\u0134\u009b\2\u0368\u036a\5\u0084C\2\u0369\u0368\3\2\2\2\u0369"+
+ "\u036a\3\2\2\2\u036a\u0083\3\2\2\2\u036b\u036c\7h\2\2\u036c\u036d\5\u0096"+
+ "L\2\u036d\u036e\5\u0162\u00b2\2\u036e\u036f\7i\2\2\u036f\u0085\3\2\2\2"+
+ "\u0370\u0371\78\2\2\u0371\u0372\5\u008cG\2\u0372\u0373\7e\2\2\u0373\u0375"+
+ "\5\u0134\u009b\2\u0374\u0376\5\u0084C\2\u0375\u0374\3\2\2\2\u0375\u0376"+
+ "\3\2\2\2\u0376\u0087\3\2\2\2\u0377\u037f\5\b\5\2\u0378\u037b\5\u00b4["+
+ "\2\u0379\u037a\7l\2\2\u037a\u037c\5\u00d8m\2\u037b\u0379\3\2\2\2\u037b"+
+ "\u037c\3\2\2\2\u037c\u0380\3\2\2\2\u037d\u037e\7l\2\2\u037e\u0380\5\u00d8"+
+ "m\2\u037f\u0378\3\2\2\2\u037f\u037d\3\2\2\2\u0380\u0089\3\2\2\2\u0381"+
+ "\u0382\5\b\5\2\u0382\u0383\7s\2\2\u0383\u0384\5\u00d8m\2\u0384\u008b\3"+
+ "\2\2\2\u0385\u0387\7f\2\2\u0386\u0388\5\n\6\2\u0387\u0386\3\2\2\2\u0387"+
+ "\u0388\3\2\2\2\u0388\u0389\3\2\2\2\u0389\u038b\5\u00b4[\2\u038a\u038c"+
+ "\7m\2\2\u038b\u038a\3\2\2\2\u038b\u038c\3\2\2\2\u038c\u038d\3\2\2\2\u038d"+
+ "\u038e\7g\2\2\u038e\u008d\3\2\2\2\u038f\u0392\5\u0090I\2\u0390\u0392\5"+
+ "\u0092J\2\u0391\u038f\3\2\2\2\u0391\u0390\3\2\2\2\u0392\u008f\3\2\2\2"+
+ "\u0393\u0395\5\u00d6l\2\u0394\u0393\3\2\2\2\u0394\u0395\3\2\2\2\u0395"+
+ "\u0396\3\2\2\2\u0396\u0397\5\u0094K\2\u0397\u0091\3\2\2\2\u0398\u039a"+
+ "\7\34\2\2\u0399\u039b\5\u00d6l\2\u039a\u0399\3\2\2\2\u039a\u039b\3\2\2"+
+ "\2\u039b\u039c\3\2\2\2\u039c\u039d\5\u0094K\2\u039d\u0093\3\2\2\2\u039e"+
+ "\u03a0\7t\2\2\u039f\u039e\3\2\2\2\u039f\u03a0\3\2\2\2\u03a0\u03a1\3\2"+
+ "\2\2\u03a1\u03a2\5\u00b4[\2\u03a2\u0095\3\2\2\2\u03a3\u03a4\bL\1\2\u03a4"+
+ "\u03a5\t\b\2\2\u03a5\u03b4\5\u0096L\20\u03a6\u03b4\5\u00a6T\2\u03a7\u03a8"+
+ "\7\33\2\2\u03a8\u03a9\5.\30\2\u03a9\u03aa\7\35\2\2\u03aa\u03ab\5\u0096"+
+ "L\4\u03ab\u03b4\3\2\2\2\u03ac\u03ad\t\t\2\2\u03ad\u03ae\5&\24\2\u03ae"+
+ "\u03af\7o\2\2\u03af\u03b0\7o\2\2\u03b0\u03b1\5*\26\2\u03b1\u03b2\5\u0096"+
+ "L\3\u03b2\u03b4\3\2\2\2\u03b3\u03a3\3\2\2\2\u03b3\u03a6\3\2\2\2\u03b3"+
+ "\u03a7\3\2\2\2\u03b3\u03ac\3\2\2\2\u03b4\u03d8\3\2\2\2\u03b5\u03b6\f\16"+
+ "\2\2\u03b6\u03b7\t\n\2\2\u03b7\u03d7\5\u0096L\17\u03b8\u03b9\f\r\2\2\u03b9"+
+ "\u03ba\t\13\2\2\u03ba\u03d7\5\u0096L\16\u03bb\u03bc\f\f\2\2\u03bc\u03bd"+
+ "\t\f\2\2\u03bd\u03d7\5\u0096L\r\u03be\u03bf\f\13\2\2\u03bf\u03c0\t\r\2"+
+ "\2\u03c0\u03d7\5\u0096L\f\u03c1\u03c2\f\n\2\2\u03c2\u03c3\t\16\2\2\u03c3"+
+ "\u03d7\5\u0096L\13\u03c4\u03c5\f\b\2\2\u03c5\u03c6\7v\2\2\u03c6\u03d7"+
+ "\5\u0096L\t\u03c7\u03c8\f\7\2\2\u03c8\u03c9\7u\2\2\u03c9\u03d7\5\u0096"+
+ "L\b\u03ca\u03cb\f\6\2\2\u03cb\u03cc\7#\2\2\u03cc\u03d7\5\u0096L\6\u03cd"+
+ "\u03ce\f\5\2\2\u03ce\u03cf\7&\2\2\u03cf\u03d0\5\u0096L\2\u03d0\u03d1\7"+
+ "o\2\2\u03d1\u03d2\5\u0096L\5\u03d2\u03d7\3\2\2\2\u03d3\u03d4\f\t\2\2\u03d4"+
+ "\u03d5\7\21\2\2\u03d5\u03d7\5d\63\2\u03d6\u03b5\3\2\2\2\u03d6\u03b8\3"+
+ "\2\2\2\u03d6\u03bb\3\2\2\2\u03d6\u03be\3\2\2\2\u03d6\u03c1\3\2\2\2\u03d6"+
+ "\u03c4\3\2\2\2\u03d6\u03c7\3\2\2\2\u03d6\u03ca\3\2\2\2\u03d6\u03cd\3\2"+
+ "\2\2\u03d6\u03d3\3\2\2\2\u03d7\u03da\3\2\2\2\u03d8\u03d6\3\2\2\2\u03d8"+
+ "\u03d9\3\2\2\2\u03d9\u0097\3\2\2\2\u03da\u03d8\3\2\2\2\u03db\u03f0\5\30"+
+ "\r\2\u03dc\u03f0\5\32\16\2\u03dd\u03f0\5\u009cO\2\u03de\u03f0\5\u009a"+
+ "N\2\u03df\u03f0\5\u00d0i\2\u03e0\u03f0\5\u00f0y\2\u03e1\u03f0\5\u00e4"+
+ "s\2\u03e2\u03f0\5\u011c\u008f\2\u03e3\u03f0\5\u00f2z\2\u03e4\u03f0\5\u00f4"+
+ "{\2\u03e5\u03f0\5\u00f6|\2\u03e6\u03f0\5\u00f8}\2\u03e7\u03f0\5\u00fa"+
+ "~\2\u03e8\u03f0\5\u00e0q\2\u03e9\u03f0\5\u00fc\177\2\u03ea\u03f0\5\u00fe"+
+ "\u0080\2\u03eb\u03f0\5\u0110\u0089\2\u03ec\u03f0\5\u009eP\2\u03ed\u03f0"+
+ "\5\u00a2R\2\u03ee\u03f0\5j\66\2\u03ef\u03db\3\2\2\2\u03ef\u03dc\3\2\2"+
+ "\2\u03ef\u03dd\3\2\2\2\u03ef\u03de\3\2\2\2\u03ef\u03df\3\2\2\2\u03ef\u03e0"+
+ "\3\2\2\2\u03ef\u03e1\3\2\2\2\u03ef\u03e2\3\2\2\2\u03ef\u03e3\3\2\2\2\u03ef"+
+ "\u03e4\3\2\2\2\u03ef\u03e5\3\2\2\2\u03ef\u03e6\3\2\2\2\u03ef\u03e7\3\2"+
+ "\2\2\u03ef\u03e8\3\2\2\2\u03ef\u03e9\3\2\2\2\u03ef\u03ea\3\2\2\2\u03ef"+
+ "\u03eb\3\2\2\2\u03ef\u03ec\3\2\2\2\u03ef\u03ed\3\2\2\2\u03ef\u03ee\3\2"+
+ "\2\2\u03f0\u0099\3\2\2\2\u03f1\u03f2\7%\2\2\u03f2\u03f3\5\u0096L\2\u03f3"+
+ "\u009b\3\2\2\2\u03f4\u03f5\7X\2\2\u03f5\u03f7\5\u0096L\2\u03f6\u03f8\5"+
+ "\u00e0q\2\u03f7\u03f6\3\2\2\2\u03f7\u03f8\3\2\2\2\u03f8\u009d\3\2\2\2"+
+ "\u03f9\u03fa\5\u00a0Q\2\u03fa\u03fb\5\u0118\u008d\2\u03fb\u009f\3\2\2"+
+ "\2\u03fc\u03fd\7\16\2\2\u03fd\u03fe\5\u0096L\2\u03fe\u03ff\5\u0162\u00b2"+
+ "\2\u03ff\u0401\3\2\2\2\u0400\u03fc\3\2\2\2\u0401\u0404\3\2\2\2\u0402\u0400"+
+ "\3\2\2\2\u0402\u0403\3\2\2\2\u0403\u0409\3\2\2\2\u0404\u0402\3\2\2\2\u0405"+
+ "\u0406\7\17\2\2\u0406\u0407\5^\60\2\u0407\u0408\5\u0162\u00b2\2\u0408"+
+ "\u040a\3\2\2\2\u0409\u0405\3\2\2\2\u0409\u040a\3\2\2\2\u040a\u00a1\3\2"+
+ "\2\2\u040b\u040c\7Q\2\2\u040c\u0411\5\u0096L\2\u040d\u040e\7Q\2\2\u040e"+
+ "\u040f\t\3\2\2\u040f\u0411\5.\30\2\u0410\u040b\3\2\2\2\u0410\u040d\3\2"+
+ "\2\2\u0411\u00a3\3\2\2\2\u0412\u041b\7\5\2\2\u0413\u041b\7\6\2\2\u0414"+
+ "\u041b\7d\2\2\u0415\u041b\5\u013e\u00a0\2\u0416\u041b\5\u0154\u00ab\2"+
+ "\u0417\u041b\7\3\2\2\u0418\u041b\7\u008f\2\2\u0419\u041b\7\u0090\2\2\u041a"+
+ "\u0412\3\2\2\2\u041a\u0413\3\2\2\2\u041a\u0414\3\2\2\2\u041a\u0415\3\2"+
+ "\2\2\u041a\u0416\3\2\2\2\u041a\u0417\3\2\2\2\u041a\u0418\3\2\2\2\u041a"+
+ "\u0419\3\2\2\2\u041b\u00a5\3\2\2\2\u041c\u041d\bT\1\2\u041d\u0429\5\u013a"+
+ "\u009e\2\u041e\u0429\5\u0136\u009c\2\u041f\u0429\5\u015e\u00b0\2\u0420"+
+ "\u0429\5 \21\2\u0421\u0429\5x=\2\u0422\u0429\5v<\2\u0423\u0424\t\17\2"+
+ "\2\u0424\u0425\7f\2\2\u0425\u0426\5\u0096L\2\u0426\u0427\7g\2\2\u0427"+
+ "\u0429\3\2\2\2\u0428\u041c\3\2\2\2\u0428\u041e\3\2\2\2\u0428\u041f\3\2"+
+ "\2\2\u0428\u0420\3\2\2\2\u0428\u0421\3\2\2\2\u0428\u0422\3\2\2\2\u0428"+
+ "\u0423\3\2\2\2\u0429\u0440\3\2\2\2\u042a\u042b\f\13\2\2\u042b\u042c\7"+
+ "p\2\2\u042c\u043f\7e\2\2\u042d\u042e\f\n\2\2\u042e\u043f\5\u0158\u00ad"+
+ "\2\u042f\u0430\f\t\2\2\u0430\u043f\5\u00c0a\2\u0431\u0432\f\b\2\2\u0432"+
+ "\u043f\5H%\2\u0433\u0434\f\7\2\2\u0434\u043f\5\u015a\u00ae\2\u0435\u0436"+
+ "\f\6\2\2\u0436\u043f\5\u015c\u00af\2\u0437\u0438\f\5\2\2\u0438\u0439\5"+
+ "\u015c\u00af\2\u0439\u043a\7\22\2\2\u043a\u043b\5d\63\2\u043b\u043f\3"+
+ "\2\2\2\u043c\u043d\f\4\2\2\u043d\u043f\5\u00acW\2\u043e\u042a\3\2\2\2"+
+ "\u043e\u042d\3\2\2\2\u043e\u042f\3\2\2\2\u043e\u0431\3\2\2\2\u043e\u0433"+
+ "\3\2\2\2\u043e\u0435\3\2\2\2\u043e\u0437\3\2\2\2\u043e\u043c\3\2\2\2\u043f"+
+ "\u0442\3\2\2\2\u0440\u043e\3\2\2\2\u0440\u0441\3\2\2\2\u0441\u00a7\3\2"+
+ "\2\2\u0442\u0440\3\2\2\2\u0443\u0444\5Z.\2\u0444\u0445\5\u00aaV\2\u0445"+
+ "\u00a9\3\2\2\2\u0446\u0448\7M\2\2\u0447\u0449\7e\2\2\u0448\u0447\3\2\2"+
+ "\2\u0448\u0449\3\2\2\2\u0449\u044a\3\2\2\2\u044a\u044c\5\u0130\u0099\2"+
+ "\u044b\u044d\5b\62\2\u044c\u044b\3\2\2\2\u044c\u044d\3\2\2\2\u044d\u00ab"+
+ "\3\2\2\2\u044e\u0450\7\'\2\2\u044f\u0451\5\u00d8m\2\u0450\u044f\3\2\2"+
+ "\2\u0450\u0451\3\2\2\2\u0451\u0453\3\2\2\2\u0452\u0454\7m\2\2\u0453\u0452"+
+ "\3\2\2\2\u0453\u0454\3\2\2\2\u0454\u0455\3\2\2\2\u0455\u0456\7(\2\2\u0456"+
+ "\u00ad\3\2\2\2\u0457\u0458\7N\2\2\u0458\u0462\7h\2\2\u0459\u045d\5\u00b2"+
+ "Z\2\u045a\u045d\5\u011e\u0090\2\u045b\u045d\5\u00b0Y\2\u045c\u0459\3\2"+
+ "\2\2\u045c\u045a\3\2\2\2\u045c\u045b\3\2\2\2\u045d\u045e\3\2\2\2\u045e"+
+ "\u045f\5\u0162\u00b2\2\u045f\u0461\3\2\2\2\u0460\u045c\3\2\2\2\u0461\u0464"+
+ "\3\2\2\2\u0462\u0460\3\2\2\2\u0462\u0463\3\2\2\2\u0463\u0465\3\2\2\2\u0464"+
+ "\u0462\3\2\2\2\u0465\u0466\7i\2\2\u0466\u00af\3\2\2\2\u0467\u0468\78\2"+
+ "\2\u0468\u0469\7e\2\2\u0469\u046a\5\u0134\u009b\2\u046a\u00b1\3\2\2\2"+
+ "\u046b\u046d\7\34\2\2\u046c\u046b\3\2\2\2\u046c\u046d\3\2\2\2\u046d\u046e"+
+ "\3\2\2\2\u046e\u046f\5Z.\2\u046f\u0470\7e\2\2\u0470\u0471\5\u0134\u009b"+
+ "\2\u0471\u0472\5\u0132\u009a\2\u0472\u047b\3\2\2\2\u0473\u0475\7\34\2"+
+ "\2\u0474\u0473\3\2\2\2\u0474\u0475\3\2\2\2\u0475\u0476\3\2\2\2\u0476\u0477"+
+ "\5Z.\2\u0477\u0478\7e\2\2\u0478\u0479\5\u0134\u009b\2\u0479\u047b\3\2"+
+ "\2\2\u047a\u046c\3\2\2\2\u047a\u0474\3\2\2\2\u047b\u00b3\3\2\2\2\u047c"+
+ "\u0484\5\u011e\u0090\2\u047d\u0484\5\u00b6\\\2\u047e\u0484\5L\'\2\u047f"+
+ "\u0480\7f\2\2\u0480\u0481\5\u00b4[\2\u0481\u0482\7g\2\2\u0482\u0484\3"+
+ "\2\2\2\u0483\u047c\3\2\2\2\u0483\u047d\3\2\2\2\u0483\u047e\3\2\2\2\u0483"+
+ "\u047f\3\2\2\2\u0484\u00b5\3\2\2\2\u0485\u048f\5\u0120\u0091\2\u0486\u048f"+
+ "\5\u0150\u00a9\2\u0487\u048f\5\u0126\u0094\2\u0488\u048f\5\u012e\u0098"+
+ "\2\u0489\u048f\5\u00aeX\2\u048a\u048f\5\u0128\u0095\2\u048b\u048f\5\u012a"+
+ "\u0096\2\u048c\u048f\5\u012c\u0097\2\u048d\u048f\5\u00b8]\2\u048e\u0485"+
+ "\3\2\2\2\u048e\u0486\3\2\2\2\u048e\u0487\3\2\2\2\u048e\u0488\3\2\2\2\u048e"+
+ "\u0489\3\2\2\2\u048e\u048a\3\2\2\2\u048e\u048b\3\2\2\2\u048e\u048c\3\2"+
+ "\2\2\u048e\u048d\3\2\2\2\u048f\u00b7\3\2\2\2\u0490\u0491\78\2\2\u0491"+
+ "\u0492\5\u00ba^\2\u0492\u00b9\3\2\2\2\u0493\u049f\7f\2\2\u0494\u0499\5"+
+ "\u00b4[\2\u0495\u0496\7m\2\2\u0496\u0498\5\u00b4[\2\u0497\u0495\3\2\2"+
+ "\2\u0498\u049b\3\2\2\2\u0499\u0497\3\2\2\2\u0499\u049a\3\2\2\2\u049a\u049d"+
+ "\3\2\2\2\u049b\u0499\3\2\2\2\u049c\u049e\7m\2\2\u049d\u049c\3\2\2\2\u049d"+
+ "\u049e\3\2\2\2\u049e\u04a0\3\2\2\2\u049f\u0494\3\2\2\2\u049f\u04a0\3\2"+
+ "\2\2\u04a0\u04a1\3\2\2\2\u04a1\u04a2\7g\2\2\u04a2\u00bb\3\2\2\2\u04a3"+
+ "\u04ab\5\u0150\u00a9\2\u04a4\u04ab\5\u0120\u0091\2\u04a5\u04ab\5\u00be"+
+ "`\2\u04a6\u04ab\5\u0128\u0095\2\u04a7\u04ab\5\u012a\u0096\2\u04a8\u04ab"+
+ "\5L\'\2\u04a9\u04ab\5\u011e\u0090\2\u04aa\u04a3\3\2\2\2\u04aa\u04a4\3"+
+ "\2\2\2\u04aa\u04a5\3\2\2\2\u04aa\u04a6\3\2\2\2\u04aa\u04a7\3\2\2\2\u04aa"+
+ "\u04a8\3\2\2\2\u04aa\u04a9\3\2\2\2\u04ab\u00bd\3\2\2\2\u04ac\u04ad\7j"+
+ "\2\2\u04ad\u04ae\7t\2\2\u04ae\u04af\7k\2\2\u04af\u04b0\5\u0124\u0093\2"+
+ "\u04b0\u00bf\3\2\2\2\u04b1\u04c1\7j\2\2\u04b2\u04b4\5\u00c2b\2\u04b3\u04b2"+
+ "\3\2\2\2\u04b3\u04b4\3\2\2\2\u04b4\u04b5\3\2\2\2\u04b5\u04b7\7o\2\2\u04b6"+
+ "\u04b8\5\u00c4c\2\u04b7\u04b6\3\2\2\2\u04b7\u04b8\3\2\2\2\u04b8\u04c2"+
+ "\3\2\2\2\u04b9\u04bb\5\u00c2b\2\u04ba\u04b9\3\2\2\2\u04ba\u04bb\3\2\2"+
+ "\2\u04bb\u04bc\3\2\2\2\u04bc\u04bd\7o\2\2\u04bd\u04be\5\u00c4c\2\u04be"+
+ "\u04bf\7o\2\2\u04bf\u04c0\5\u00c6d\2\u04c0\u04c2\3\2\2\2\u04c1\u04b3\3"+
+ "\2\2\2\u04c1\u04ba\3\2\2\2\u04c2\u04c3\3\2\2\2\u04c3\u04c4\7k\2\2\u04c4"+
+ "\u00c1\3\2\2\2\u04c5\u04c6\5\u0096L\2\u04c6\u00c3\3\2\2\2\u04c7\u04c8"+
+ "\5\u0096L\2\u04c8\u00c5\3\2\2\2\u04c9\u04ca\5\u0096L\2\u04ca\u00c7\3\2"+
+ "\2\2\u04cb\u04cd\t\20\2\2\u04cc\u04cb\3\2\2\2\u04cc\u04cd\3\2\2\2\u04cd"+
+ "\u04ce\3\2\2\2\u04ce\u04cf\7l\2\2\u04cf\u00c9\3\2\2\2\u04d0\u04d1\5\u00d8"+
+ "m\2\u04d1\u04d2\7l\2\2\u04d2\u04d7\3\2\2\2\u04d3\u04d4\5\b\5\2\u04d4\u04d5"+
+ "\7s\2\2\u04d5\u04d7\3\2\2\2\u04d6\u04d0\3\2\2\2\u04d6\u04d3\3\2\2\2\u04d6"+
+ "\u04d7\3\2\2\2\u04d7\u04d8\3\2\2\2\u04d8\u04d9\7]\2\2\u04d9\u04de\5\u0096"+
+ "L\2\u04da\u04dc\7J\2\2\u04db\u04dd\7e\2\2\u04dc\u04db\3\2\2\2\u04dc\u04dd"+
+ "\3\2\2\2\u04dd\u04df\3\2\2\2\u04de\u04da\3\2\2\2\u04de\u04df\3\2\2\2\u04df"+
+ "\u00cb\3\2\2\2\u04e0\u04e1\7X\2\2\u04e1\u04e2\7e\2\2\u04e2\u00cd\3\2\2"+
+ "\2\u04e3\u04e4\5\u0154\u00ab\2\u04e4\u00cf\3\2\2\2\u04e5\u04e9\5\u00d2"+
+ "j\2\u04e6\u04e9\5\u00dan\2\u04e7\u04e9\5\u00dep\2\u04e8\u04e5\3\2\2\2"+
+ "\u04e8\u04e6\3\2\2\2\u04e8\u04e7\3\2\2\2\u04e9\u00d1\3\2\2\2\u04ea\u04f6"+
+ "\7Z\2\2\u04eb\u04f7\5\u00d4k\2\u04ec\u04f2\7f\2\2\u04ed\u04ee\5\u00d4"+
+ "k\2\u04ee\u04ef\5\u0162\u00b2\2\u04ef\u04f1\3\2\2\2\u04f0\u04ed\3\2\2"+
+ "\2\u04f1\u04f4\3\2\2\2\u04f2\u04f0\3\2\2\2\u04f2\u04f3\3\2\2\2\u04f3\u04f5"+
+ "\3\2\2\2\u04f4\u04f2\3\2\2\2\u04f5\u04f7\7g\2\2\u04f6\u04eb\3\2\2\2\u04f6"+
+ "\u04ec\3\2\2\2\u04f7\u00d3\3\2\2\2\u04f8\u04fe\5\u00d6l\2\u04f9\u04fb"+
+ "\5\u00b4[\2\u04fa\u04f9\3\2\2\2\u04fa\u04fb\3\2\2\2\u04fb\u04fc\3\2\2"+
+ "\2\u04fc\u04fd\7l\2\2\u04fd\u04ff\5\u00d8m\2\u04fe\u04fa\3\2\2\2\u04fe"+
+ "\u04ff\3\2\2\2\u04ff\u00d5\3\2\2\2\u0500\u0505\7e\2\2\u0501\u0502\7m\2"+
+ "\2\u0502\u0504\7e\2\2\u0503\u0501\3\2\2\2\u0504\u0507\3\2\2\2\u0505\u0503"+
+ "\3\2\2\2\u0505\u0506\3\2\2\2\u0506\u00d7\3\2\2\2\u0507\u0505\3\2\2\2\u0508"+
+ "\u050d\5\u0096L\2\u0509\u050a\7m\2\2\u050a\u050c\5\u0096L\2\u050b\u0509"+
+ "\3\2\2\2\u050c\u050f\3\2\2\2\u050d\u050b\3\2\2\2\u050d\u050e\3\2\2\2\u050e"+
+ "\u00d9\3\2\2\2\u050f\u050d\3\2\2\2\u0510\u051c\7^\2\2\u0511\u051d\5\u00dc"+
+ "o\2\u0512\u0518\7f\2\2\u0513\u0514\5\u00dco\2\u0514\u0515\5\u0162\u00b2"+
+ "\2\u0515\u0517\3\2\2\2\u0516\u0513\3\2\2\2\u0517\u051a\3\2\2\2\u0518\u0516"+
+ "\3\2\2\2\u0518\u0519\3\2\2\2\u0519\u051b\3\2\2\2\u051a\u0518\3\2\2\2\u051b"+
+ "\u051d\7g\2\2\u051c\u0511\3\2\2\2\u051c\u0512\3\2\2\2\u051d\u00db\3\2"+
+ "\2\2\u051e\u0520\7e\2\2\u051f\u0521\7l\2\2\u0520\u051f\3\2\2\2\u0520\u0521"+
+ "\3\2\2\2\u0521\u0522\3\2\2\2\u0522\u0523\5\u00b4[\2\u0523\u00dd\3\2\2"+
+ "\2\u0524\u0530\7c\2\2\u0525\u0531\5\u0088E\2\u0526\u052c\7f\2\2\u0527"+
+ "\u0528\5\u0088E\2\u0528\u0529\5\u0162\u00b2\2\u0529\u052b\3\2\2\2\u052a"+
+ "\u0527\3\2\2\2\u052b\u052e\3\2\2\2\u052c\u052a\3\2\2\2\u052c\u052d\3\2"+
+ "\2\2\u052d\u052f\3\2\2\2\u052e\u052c\3\2\2\2\u052f\u0531\7g\2\2\u0530"+
+ "\u0525\3\2\2\2\u0530\u0526\3\2\2\2\u0531\u00df\3\2\2\2\u0532\u0534\7h"+
+ "\2\2\u0533\u0535\5\u00e2r\2\u0534\u0533\3\2\2\2\u0534\u0535\3\2\2\2\u0535"+
+ "\u0536\3\2\2\2\u0536\u0537\7i\2\2\u0537\u00e1\3\2\2\2\u0538\u053a\5\u0162"+
+ "\u00b2\2\u0539\u0538\3\2\2\2\u0539\u053a\3\2\2\2\u053a\u053b\3\2\2\2\u053b"+
+ "\u053c\5\u0098M\2\u053c\u053d\5\u0162\u00b2\2\u053d\u053f\3\2\2\2\u053e"+
+ "\u0539\3\2\2\2\u053f\u0540\3\2\2\2\u0540\u053e\3\2\2\2\u0540\u0541\3\2"+
+ "\2\2\u0541\u00e3\3\2\2\2\u0542\u0548\5\u00e8u\2\u0543\u0548\5\u00eav\2"+
+ "\u0544\u0548\5\u00ecw\2\u0545\u0548\5\u00e6t\2\u0546\u0548\5\u008aF\2"+
+ "\u0547\u0542\3\2\2\2\u0547\u0543\3\2\2\2\u0547\u0544\3\2\2\2\u0547\u0545"+
+ "\3\2\2\2\u0547\u0546\3\2\2\2\u0548\u00e5\3\2\2\2\u0549\u054a\5\u0096L"+
+ "\2\u054a\u00e7\3\2\2\2\u054b\u054c\5\u0096L\2\u054c\u054d\7\u0089\2\2"+
+ "\u054d\u054e\5\u0096L\2\u054e\u00e9\3\2\2\2\u054f\u0550\5\u0096L\2\u0550"+
+ "\u0551\t\21\2\2\u0551\u00eb\3\2\2\2\u0552\u0553\5\u00d8m\2\u0553\u0554"+
+ "\5\u00c8e\2\u0554\u0555\5\u00d8m\2\u0555\u00ed\3\2\2\2\u0556\u0557\t\22"+
+ "\2\2\u0557\u00ef\3\2\2\2\u0558\u0559\7e\2\2\u0559\u055b\7o\2\2\u055a\u055c"+
+ "\5\u0098M\2\u055b\u055a\3\2\2\2\u055b\u055c\3\2\2\2\u055c\u00f1\3\2\2"+
+ "\2\u055d\u055f\7b\2\2\u055e\u0560\5\u00d8m\2\u055f\u055e\3\2\2\2\u055f"+
+ "\u0560\3\2\2\2\u0560\u00f3\3\2\2\2\u0561\u0563\7K\2\2\u0562\u0564\7e\2"+
+ "\2\u0563\u0562\3\2\2\2\u0563\u0564\3\2\2\2\u0564\u00f5\3\2\2\2\u0565\u0567"+
+ "\7_\2\2\u0566\u0568\7e\2\2\u0567\u0566\3\2\2\2\u0567\u0568\3\2\2\2\u0568"+
+ "\u00f7\3\2\2\2\u0569\u056a\7W\2\2\u056a\u056b\7e\2\2\u056b\u00f9\3\2\2"+
+ "\2\u056c\u056d\7[\2\2\u056d\u00fb\3\2\2\2\u056e\u0577\7\\\2\2\u056f\u0578"+
+ "\5\u0096L\2\u0570\u0571\5\u0162\u00b2\2\u0571\u0572\5\u0096L\2\u0572\u0578"+
+ "\3\2\2\2\u0573\u0574\5\u00e4s\2\u0574\u0575\5\u0162\u00b2\2\u0575\u0576"+
+ "\5\u0096L\2\u0576\u0578\3\2\2\2\u0577\u056f\3\2\2\2\u0577\u0570\3\2\2"+
+ "\2\u0577\u0573\3\2\2\2\u0578\u0579\3\2\2\2\u0579\u057f\5\u00e0q\2\u057a"+
+ "\u057d\7V\2\2\u057b\u057e\5\u00fc\177\2\u057c\u057e\5\u00e0q\2\u057d\u057b"+
+ "\3\2\2\2\u057d\u057c\3\2\2\2\u057e\u0580\3\2\2\2\u057f\u057a\3\2\2\2\u057f"+
+ "\u0580\3\2\2\2\u0580\u00fd\3\2\2\2\u0581\u0584\5\u0100\u0081\2\u0582\u0584"+
+ "\5\u0106\u0084\2\u0583\u0581\3\2\2\2\u0583\u0582\3\2\2\2\u0584\u00ff\3"+
+ "\2\2\2\u0585\u0590\7Y\2\2\u0586\u0588\5\u0096L\2\u0587\u0586\3\2\2\2\u0587"+
+ "\u0588\3\2\2\2\u0588\u0591\3\2\2\2\u0589\u058b\5\u00e4s\2\u058a\u0589"+
+ "\3\2\2\2\u058a\u058b\3\2\2\2\u058b\u058c\3\2\2\2\u058c\u058e\5\u0162\u00b2"+
+ "\2\u058d\u058f\5\u0096L\2\u058e\u058d\3\2\2\2\u058e\u058f\3\2\2\2\u058f"+
+ "\u0591\3\2\2\2\u0590\u0587\3\2\2\2\u0590\u058a\3\2\2\2\u0591\u0592\3\2"+
+ "\2\2\u0592\u0596\7h\2\2\u0593\u0595\5\u0102\u0082\2\u0594\u0593\3\2\2"+
+ "\2\u0595\u0598\3\2\2\2\u0596\u0594\3\2\2\2\u0596\u0597\3\2\2\2\u0597\u0599"+
+ "\3\2\2\2\u0598\u0596\3\2\2\2\u0599\u059a\7i\2\2\u059a\u0101\3\2\2\2\u059b"+
+ "\u059c\5\u0104\u0083\2\u059c\u059e\7o\2\2\u059d\u059f\5\u00e2r\2\u059e"+
+ "\u059d\3\2\2\2\u059e\u059f\3\2\2\2\u059f\u0103\3\2\2\2\u05a0\u05a1\7P"+
+ "\2\2\u05a1\u05a4\5\u00d8m\2\u05a2\u05a4\7L\2\2\u05a3\u05a0\3\2\2\2\u05a3"+
+ "\u05a2\3\2\2\2\u05a4\u0105\3\2\2\2\u05a5\u05ae\7Y\2\2\u05a6\u05af\5\u0108"+
+ "\u0085\2\u05a7\u05a8\5\u0162\u00b2\2\u05a8\u05a9\5\u0108\u0085\2\u05a9"+
+ "\u05af\3\2\2\2\u05aa\u05ab\5\u00e4s\2\u05ab\u05ac\5\u0162\u00b2\2\u05ac"+
+ "\u05ad\5\u0108\u0085\2\u05ad\u05af\3\2\2\2\u05ae\u05a6\3\2\2\2\u05ae\u05a7"+
+ "\3\2\2\2\u05ae\u05aa\3\2\2\2\u05af\u05b0\3\2\2\2\u05b0\u05b4\7h\2\2\u05b1"+
+ "\u05b3\5\u010a\u0086\2\u05b2\u05b1\3\2\2\2\u05b3\u05b6\3\2\2\2\u05b4\u05b2"+
+ "\3\2\2\2\u05b4\u05b5\3\2\2\2\u05b5\u05b7\3\2\2\2\u05b6\u05b4\3\2\2\2\u05b7"+
+ "\u05b8\7i\2\2\u05b8\u0107\3\2\2\2\u05b9\u05ba\7e\2\2\u05ba\u05bc\7s\2"+
+ "\2\u05bb\u05b9\3\2\2\2\u05bb\u05bc\3\2\2\2\u05bc\u05bd\3\2\2\2\u05bd\u05be"+
+ "\5\u00a6T\2\u05be\u05bf\7p\2\2\u05bf\u05c0\7f\2\2\u05c0\u05c1\7^\2\2\u05c1"+
+ "\u05c2\7g\2\2\u05c2\u0109\3\2\2\2\u05c3\u05c4\5\u010c\u0087\2\u05c4\u05c6"+
+ "\7o\2\2\u05c5\u05c7\5\u00e2r\2\u05c6\u05c5\3\2\2\2\u05c6\u05c7\3\2\2\2"+
+ "\u05c7\u010b\3\2\2\2\u05c8\u05c9\7P\2\2\u05c9\u05cc\5\u010e\u0088\2\u05ca"+
+ "\u05cc\7L\2\2\u05cb\u05c8\3\2\2\2\u05cb\u05ca\3\2\2\2\u05cc\u010d\3\2"+
+ "\2\2\u05cd\u05d0\5\u00b4[\2\u05ce\u05d0\7d\2\2\u05cf\u05cd\3\2\2\2\u05cf"+
+ "\u05ce\3\2\2\2\u05d0\u05d8\3\2\2\2\u05d1\u05d4\7m\2\2\u05d2\u05d5\5\u00b4"+
+ "[\2\u05d3\u05d5\7d\2\2\u05d4\u05d2\3\2\2\2\u05d4\u05d3\3\2\2\2\u05d5\u05d7"+
+ "\3\2\2\2\u05d6\u05d1\3\2\2\2\u05d7\u05da\3\2\2\2\u05d8\u05d6\3\2\2\2\u05d8"+
+ "\u05d9\3\2\2\2\u05d9\u010f\3\2\2\2\u05da\u05d8\3\2\2\2\u05db\u05dc\7O"+
+ "\2\2\u05dc\u05e0\7h\2\2\u05dd\u05df\5\u0112\u008a\2\u05de\u05dd\3\2\2"+
+ "\2\u05df\u05e2\3\2\2\2\u05e0\u05de\3\2\2\2\u05e0\u05e1\3\2\2\2\u05e1\u05e3"+
+ "\3\2\2\2\u05e2\u05e0\3\2\2\2\u05e3\u05e4\7i\2\2\u05e4\u0111\3\2\2\2\u05e5"+
+ "\u05e6\5\u0114\u008b\2\u05e6\u05e8\7o\2\2\u05e7\u05e9\5\u00e2r\2\u05e8"+
+ "\u05e7\3\2\2\2\u05e8\u05e9\3\2\2\2\u05e9\u0113\3\2\2\2\u05ea\u05ed\7P"+
+ "\2\2\u05eb\u05ee\5\u00e8u\2\u05ec\u05ee\5\u0116\u008c\2\u05ed\u05eb\3"+
+ "\2\2\2\u05ed\u05ec\3\2\2\2\u05ee\u05f1\3\2\2\2\u05ef\u05f1\7L\2\2\u05f0"+
+ "\u05ea\3\2\2\2\u05f0\u05ef\3\2\2\2\u05f1\u0115\3\2\2\2\u05f2\u05f3\5\u00d8"+
+ "m\2\u05f3\u05f4\7l\2\2\u05f4\u05f9\3\2\2\2\u05f5\u05f6\5\u00d6l\2\u05f6"+
+ "\u05f7\7s\2\2\u05f7\u05f9\3\2\2\2\u05f8\u05f2\3\2\2\2\u05f8\u05f5\3\2"+
+ "\2\2\u05f8\u05f9\3\2\2\2\u05f9\u05fa\3\2\2\2\u05fa\u05fb\5\u0096L\2\u05fb"+
+ "\u0117\3\2\2\2\u05fc\u0600\7`\2\2\u05fd\u0601\5\u0096L\2\u05fe\u0601\5"+
+ "\u011a\u008e\2\u05ff\u0601\5\u00caf\2\u0600\u05fd\3\2\2\2\u0600\u05fe"+
+ "\3\2\2\2\u0600\u05ff\3\2\2\2\u0600\u0601\3\2\2\2\u0601\u0602\3\2\2\2\u0602"+
+ "\u0603\5\u00e0q\2\u0603\u0119\3\2\2\2\u0604\u0606\5\u00e4s\2\u0605\u0604"+
+ "\3\2\2\2\u0605\u0606\3\2\2\2\u0606\u0607\3\2\2\2\u0607\u0609\5\u0162\u00b2"+
+ "\2\u0608\u060a\5\u0096L\2\u0609\u0608\3\2\2\2\u0609\u060a\3\2\2\2\u060a"+
+ "\u060b\3\2\2\2\u060b\u060d\5\u0162\u00b2\2\u060c\u060e\5\u00e4s\2\u060d"+
+ "\u060c\3\2\2\2\u060d\u060e\3\2\2\2\u060e\u011b\3\2\2\2\u060f\u0610\7R"+
+ "\2\2\u0610\u0611\5\u0096L\2\u0611\u011d\3\2\2\2\u0612\u0615\5\u0142\u00a2"+
+ "\2\u0613\u0615\7e\2\2\u0614\u0612\3\2\2\2\u0614\u0613\3\2\2\2\u0615\u011f"+
+ "\3\2\2\2\u0616\u0617\7j\2\2\u0617\u0618\5\u0122\u0092\2\u0618\u0619\7"+
+ "k\2\2\u0619\u061a\5\u0124\u0093\2\u061a\u0121\3\2\2\2\u061b\u061c\5\u0096"+
+ "L\2\u061c\u0123\3\2\2\2\u061d\u061e\5\u00b4[\2\u061e\u0125\3\2\2\2\u061f"+
+ "\u0620\7\u0087\2\2\u0620\u0621\5\u00b4[\2\u0621\u0127\3\2\2\2\u0622\u0623"+
+ "\7j\2\2\u0623\u0624\7k\2\2\u0624\u0625\5\u0124\u0093\2\u0625\u0129\3\2"+
+ "\2\2\u0626\u0627\7S\2\2\u0627\u0628\7j\2\2\u0628\u0629\5\u00b4[\2\u0629"+
+ "\u062a\7k\2\2\u062a\u062b\5\u0124\u0093\2\u062b\u012b\3\2\2\2\u062c\u0632"+
+ "\7U\2\2\u062d\u062e\7U\2\2\u062e\u0632\7\u0089\2\2\u062f\u0630\7\u0089"+
+ "\2\2\u0630\u0632\7U\2\2\u0631\u062c\3\2\2\2\u0631\u062d\3\2\2\2\u0631"+
+ "\u062f\3\2\2\2\u0632\u0633\3\2\2\2\u0633\u0634\5\u0124\u0093\2\u0634\u012d"+
+ "\3\2\2\2\u0635\u0636\7M\2\2\u0636\u0637\5\u0130\u0099\2\u0637\u012f\3"+
+ "\2\2\2\u0638\u0639\5\u0134\u009b\2\u0639\u063a\5\u0132\u009a\2\u063a\u063d"+
+ "\3\2\2\2\u063b\u063d\5\u0134\u009b\2\u063c\u0638\3\2\2\2\u063c\u063b\3"+
+ "\2\2\2\u063d\u0131\3\2\2\2\u063e\u0641\5\u0134\u009b\2\u063f\u0641\5\u00b4"+
+ "[\2\u0640\u063e\3\2\2\2\u0640\u063f\3\2\2\2\u0641\u0133\3\2\2\2\u0642"+
+ "\u064e\7f\2\2\u0643\u0648\5\u008eH\2\u0644\u0645\7m\2\2\u0645\u0647\5"+
+ "\u008eH\2\u0646\u0644\3\2\2\2\u0647\u064a\3\2\2\2\u0648\u0646\3\2\2\2"+
+ "\u0648\u0649\3\2\2\2\u0649\u064c\3\2\2\2\u064a\u0648\3\2\2\2\u064b\u064d"+
+ "\7m\2\2\u064c\u064b\3\2\2\2\u064c\u064d\3\2\2\2\u064d\u064f\3\2\2\2\u064e"+
+ "\u0643\3\2\2\2\u064e\u064f\3\2\2\2\u064f\u0650\3\2\2\2\u0650\u0651\7g"+
+ "\2\2\u0651\u0135\3\2\2\2\u0652\u0653\5\u0138\u009d\2\u0653\u0654\7f\2"+
+ "\2\u0654\u0656\5\u0096L\2\u0655\u0657\7m\2\2\u0656\u0655\3\2\2\2\u0656"+
+ "\u0657\3\2\2\2\u0657\u0658\3\2\2\2\u0658\u0659\7g\2\2\u0659\u0137\3\2"+
+ "\2\2\u065a\u0660\5\u00b6\\\2\u065b\u065c\7f\2\2\u065c\u065d\5\u0138\u009d"+
+ "\2\u065d\u065e\7g\2\2\u065e\u0660\3\2\2\2\u065f\u065a\3\2\2\2\u065f\u065b"+
+ "\3\2\2\2\u0660\u0139\3\2\2\2\u0661\u0668\5\u013c\u009f\2\u0662\u0668\5"+
+ "\u0140\u00a1\2\u0663\u0664\7f\2\2\u0664\u0665\5\u0096L\2\u0665\u0666\7"+
+ "g\2\2\u0666\u0668\3\2\2\2\u0667\u0661\3\2\2\2\u0667\u0662\3\2\2\2\u0667"+
+ "\u0663\3\2\2\2\u0668\u013b\3\2\2\2\u0669\u066d\5\u00a4S\2\u066a\u066d"+
+ "\5\u0144\u00a3\2\u066b\u066d\5\u00a8U\2\u066c\u0669\3\2\2\2\u066c\u066a"+
+ "\3\2\2\2\u066c\u066b\3\2\2\2\u066d\u013d\3\2\2\2\u066e\u066f\t\23\2\2"+
+ "\u066f\u013f\3\2\2\2\u0670\u0671\7e\2\2\u0671\u0141\3\2\2\2\u0672\u0673"+
+ "\7e\2\2\u0673\u0674\7p\2\2\u0674\u0675\7e\2\2\u0675\u0143\3\2\2\2\u0676"+
+ "\u0677\5\u00bc_\2\u0677\u0678\5\u0146\u00a4\2\u0678\u0145\3\2\2\2\u0679"+
+ "\u067e\7h\2\2\u067a\u067c\5\u0148\u00a5\2\u067b\u067d\7m\2\2\u067c\u067b"+
+ "\3\2\2\2\u067c\u067d\3\2\2\2\u067d\u067f\3\2\2\2\u067e\u067a\3\2\2\2\u067e"+
+ "\u067f\3\2\2\2\u067f\u0680\3\2\2\2\u0680\u0681\7i\2\2\u0681\u0147\3\2"+
+ "\2\2\u0682\u0687\5\u014a\u00a6\2\u0683\u0684\7m\2\2\u0684\u0686\5\u014a"+
+ "\u00a6\2\u0685\u0683\3\2\2\2\u0686\u0689\3\2\2\2\u0687\u0685\3\2\2\2\u0687"+
+ "\u0688\3\2\2\2\u0688\u0149\3\2\2\2\u0689\u0687\3\2\2\2\u068a\u068b\5\u014c"+
+ "\u00a7\2\u068b\u068c\7o\2\2\u068c\u068e\3\2\2\2\u068d\u068a\3\2\2\2\u068d"+
+ "\u068e\3\2\2\2\u068e\u068f\3\2\2\2\u068f\u0690\5\u014e\u00a8\2\u0690\u014b"+
+ "\3\2\2\2\u0691\u0694\5\u0096L\2\u0692\u0694\5\u0146\u00a4\2\u0693\u0691"+
+ "\3\2\2\2\u0693\u0692\3\2\2\2\u0694\u014d\3\2\2\2\u0695\u0698\5\u0096L"+
+ "\2\u0696\u0698\5\u0146\u00a4\2\u0697\u0695\3\2\2\2\u0697\u0696\3\2\2\2"+
+ "\u0698\u014f\3\2\2\2\u0699\u069a\7T\2\2\u069a\u06a0\7h\2\2\u069b\u069c"+
+ "\5\u0152\u00aa\2\u069c\u069d\5\u0162\u00b2\2\u069d\u069f\3\2\2\2\u069e"+
+ "\u069b\3\2\2\2\u069f\u06a2\3\2\2\2\u06a0\u069e\3\2\2\2\u06a0\u06a1\3\2"+
+ "\2\2\u06a1\u06a3\3\2\2\2\u06a2\u06a0\3\2\2\2\u06a3\u06a4\7i\2\2\u06a4"+
+ "\u0151\3\2\2\2\u06a5\u06a6\5\u00d6l\2\u06a6\u06a7\5\u00b4[\2\u06a7\u06aa"+
+ "\3\2\2\2\u06a8\u06aa\5\u0156\u00ac\2\u06a9\u06a5\3\2\2\2\u06a9\u06a8\3"+
+ "\2\2\2\u06aa\u06ac\3\2\2\2\u06ab\u06ad\5\u0154\u00ab\2\u06ac\u06ab\3\2"+
+ "\2\2\u06ac\u06ad\3\2\2\2\u06ad\u0153\3\2\2\2\u06ae\u06af\t\24\2\2\u06af"+
+ "\u0155\3\2\2\2\u06b0\u06b2\7\u0087\2\2\u06b1\u06b0\3\2\2\2\u06b1\u06b2"+
+ "\3\2\2\2\u06b2\u06b3\3\2\2\2\u06b3\u06b4\5\u011e\u0090\2\u06b4\u0157\3"+
+ "\2\2\2\u06b5\u06b6\7j\2\2\u06b6\u06b7\5\u0096L\2\u06b7\u06b8\7k\2\2\u06b8"+
+ "\u0159\3\2\2\2\u06b9\u06ba\7p\2\2\u06ba\u06bb\7f\2\2\u06bb\u06bc\5\u00b4"+
+ "[\2\u06bc\u06bd\7g\2\2\u06bd\u015b\3\2\2\2\u06be\u06cd\7f\2\2\u06bf\u06c6"+
+ "\5\u00d8m\2\u06c0\u06c3\5\u0138\u009d\2\u06c1\u06c2\7m\2\2\u06c2\u06c4"+
+ "\5\u00d8m\2\u06c3\u06c1\3\2\2\2\u06c3\u06c4\3\2\2\2\u06c4\u06c6\3\2\2"+
+ "\2\u06c5\u06bf\3\2\2\2\u06c5\u06c0\3\2\2\2\u06c6\u06c8\3\2\2\2\u06c7\u06c9"+
+ "\7t\2\2\u06c8\u06c7\3\2\2\2\u06c8\u06c9\3\2\2\2\u06c9\u06cb\3\2\2\2\u06ca"+
+ "\u06cc\7m\2\2\u06cb\u06ca\3\2\2\2\u06cb\u06cc\3\2\2\2\u06cc\u06ce\3\2"+
+ "\2\2\u06cd\u06c5\3\2\2\2\u06cd\u06ce\3\2\2\2\u06ce\u06cf\3\2\2\2\u06cf"+
+ "\u06d0\7g\2\2\u06d0\u015d\3\2\2\2\u06d1\u06d2\5\u0138\u009d\2\u06d2\u06d3"+
+ "\7p\2\2\u06d3\u06d4\7e\2\2\u06d4\u015f\3\2\2\2\u06d5\u06d6\5\u00b4[\2"+
+ "\u06d6\u0161\3\2\2\2\u06d7\u06dc\7n\2\2\u06d8\u06dc\7\2\2\3\u06d9\u06dc"+
+ "\7\u009f\2\2\u06da\u06dc\6\u00b2\24\2\u06db\u06d7\3\2\2\2\u06db\u06d8"+
+ "\3\2\2\2\u06db\u06d9\3\2\2\2\u06db\u06da\3\2\2\2\u06dc\u0163\3\2\2\2\u00b5"+
+ "\u0172\u0177\u017e\u0188\u018e\u0194\u01a4\u01a8\u01b1\u01bd\u01c1\u01c7"+
+ "\u01cf\u01d9\u01e9\u01f7\u01fb\u0202\u020a\u0213\u0233\u023b\u0253\u0264"+
+ "\u0271\u027a\u0288\u0291\u029d\u02b2\u02b9\u02be\u02c3\u02cd\u02d0\u02d4"+
+ "\u02d8\u02df\u02e2\u02e8\u02ed\u02ef\u02f2\u02f9\u02fe\u0311\u0319\u031d"+
+ "\u0320\u0326\u032a\u032d\u0337\u033e\u0345\u0351\u0357\u035e\u0363\u0369"+
+ "\u0375\u037b\u037f\u0387\u038b\u0391\u0394\u039a\u039f\u03b3\u03d6\u03d8"+
+ "\u03ef\u03f7\u0402\u0409\u0410\u041a\u0428\u043e\u0440\u0448\u044c\u0450"+
+ "\u0453\u045c\u0462\u046c\u0474\u047a\u0483\u048e\u0499\u049d\u049f\u04aa"+
+ "\u04b3\u04b7\u04ba\u04c1\u04cc\u04d6\u04dc\u04de\u04e8\u04f2\u04f6\u04fa"+
+ "\u04fe\u0505\u050d\u0518\u051c\u0520\u052c\u0530\u0534\u0539\u0540\u0547"+
+ "\u055b\u055f\u0563\u0567\u0577\u057d\u057f\u0583\u0587\u058a\u058e\u0590"+
+ "\u0596\u059e\u05a3\u05ae\u05b4\u05bb\u05c6\u05cb\u05cf\u05d4\u05d8\u05e0"+
+ "\u05e8\u05ed\u05f0\u05f8\u0600\u0605\u0609\u060d\u0614\u0631\u063c\u0640"+
+ "\u0648\u064c\u064e\u0656\u065f\u0667\u066c\u067c\u067e\u0687\u068d\u0693"+
+ "\u0697\u06a0\u06a9\u06ac\u06b1\u06c3\u06c5\u06c8\u06cb\u06cd\u06db";
public static final ATN _ATN =
new ATNDeserializer().deserialize(_serializedATN.toCharArray());
static {
@@ -12910,4 +13079,4 @@ private boolean eos_sempred(EosContext _localctx, int predIndex) {
_decisionToDFA[i] = new DFA(_ATN.getDecisionState(i), i);
}
}
-}
+}
\ No newline at end of file
diff --git a/src/main/java/viper/gobra/frontend/GobraParserBaseVisitor.java b/src/main/java/viper/gobra/frontend/GobraParserBaseVisitor.java
index 17069a23c..4214a5448 100644
--- a/src/main/java/viper/gobra/frontend/GobraParserBaseVisitor.java
+++ b/src/main/java/viper/gobra/frontend/GobraParserBaseVisitor.java
@@ -1,4 +1,4 @@
-// Generated from /main/antlr4/GobraParser.g4 by ANTLR 4.9.1
+// Generated from src/main/antlr4/GobraParser.g4 by ANTLR 4.9.2
package viper.gobra.frontend;
import org.antlr.v4.runtime.tree.AbstractParseTreeVisitor;
@@ -305,6 +305,20 @@ public class GobraParserBaseVisitor extends AbstractParseTreeVisitor imple
* {@link #visitChildren} on {@code ctx}.
*/
@Override public T visitDomainClause(GobraParser.DomainClauseContext ctx) { return visitChildren(ctx); }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation returns the result of calling
+ * {@link #visitChildren} on {@code ctx}.
+ */
+ @Override public T visitAdtType(GobraParser.AdtTypeContext ctx) { return visitChildren(ctx); }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation returns the result of calling
+ * {@link #visitChildren} on {@code ctx}.
+ */
+ @Override public T visitAdtClause(GobraParser.AdtClauseContext ctx) { return visitChildren(ctx); }
/**
* {@inheritDoc}
*
@@ -1439,4 +1453,4 @@ public class GobraParserBaseVisitor extends AbstractParseTreeVisitor imple
* {@link #visitChildren} on {@code ctx}.
*/
@Override public T visitEos(GobraParser.EosContext ctx) { return visitChildren(ctx); }
-}
+}
\ No newline at end of file
diff --git a/src/main/java/viper/gobra/frontend/GobraParserVisitor.java b/src/main/java/viper/gobra/frontend/GobraParserVisitor.java
index 20b91c3b6..e5db4b55a 100644
--- a/src/main/java/viper/gobra/frontend/GobraParserVisitor.java
+++ b/src/main/java/viper/gobra/frontend/GobraParserVisitor.java
@@ -1,4 +1,4 @@
-// Generated from /main/antlr4/GobraParser.g4 by ANTLR 4.9.1
+// Generated from src/main/antlr4/GobraParser.g4 by ANTLR 4.9.2
package viper.gobra.frontend;
import org.antlr.v4.runtime.tree.ParseTreeVisitor;
@@ -265,6 +265,18 @@ public interface GobraParserVisitor extends ParseTreeVisitor {
* @return the visitor result
*/
T visitDomainClause(GobraParser.DomainClauseContext ctx);
+ /**
+ * Visit a parse tree produced by {@link GobraParser#adtType}.
+ * @param ctx the parse tree
+ * @return the visitor result
+ */
+ T visitAdtType(GobraParser.AdtTypeContext ctx);
+ /**
+ * Visit a parse tree produced by {@link GobraParser#adtClause}.
+ * @param ctx the parse tree
+ * @return the visitor result
+ */
+ T visitAdtClause(GobraParser.AdtClauseContext ctx);
/**
* Visit a parse tree produced by {@link GobraParser#ghostSliceType}.
* @param ctx the parse tree
@@ -1266,4 +1278,4 @@ public interface GobraParserVisitor extends ParseTreeVisitor {
* @return the visitor result
*/
T visitEos(GobraParser.EosContext ctx);
-}
+}
\ No newline at end of file
diff --git a/src/main/scala/viper/gobra/ast/frontend/Ast.scala b/src/main/scala/viper/gobra/ast/frontend/Ast.scala
index c5b207027..c6092cf83 100644
--- a/src/main/scala/viper/gobra/ast/frontend/Ast.scala
+++ b/src/main/scala/viper/gobra/ast/frontend/Ast.scala
@@ -1232,7 +1232,7 @@ case class POptionType(elem : PType) extends PGhostLiteralType
/** The type of ADT types */
case class PAdtType(clauses: Vector[PAdtClause]) extends PGhostLiteralType with PUnorderedScope
-case class PAdtClause(id: PIdnDef, args: Vector[PFieldDecls]) extends PGhostMisc with PUnorderedScope
+case class PAdtClause(id: PIdnDef, args: Vector[PFieldDecls]) extends PGhostMisc with PUnorderedScope with PDependentDef
case class PGhostSliceType(elem: PType) extends PGhostLiteralType
diff --git a/src/main/scala/viper/gobra/frontend/Desugar.scala b/src/main/scala/viper/gobra/frontend/Desugar.scala
index 0aea2888c..d05a91ce3 100644
--- a/src/main/scala/viper/gobra/frontend/Desugar.scala
+++ b/src/main/scala/viper/gobra/frontend/Desugar.scala
@@ -4919,7 +4919,7 @@ object Desugar {
s"$ADT_PREFIX$$$adtName"
}
- def adtField(n: String, s: AdtT): String = s"$ADT_CLAUSE_PREFIX$$${topLevelName("")(adt(s), s.context)}"
+ def adtField(n: String, s: AdtT): String = topLevelName(s"$ADT_CLAUSE_PREFIX$$${adt(s)}")(n, s.context)
def label(n: String): String = n match {
case "#lhs" => "lhs"
diff --git a/src/main/scala/viper/gobra/frontend/ParseTreeTranslator.scala b/src/main/scala/viper/gobra/frontend/ParseTreeTranslator.scala
index 5745091ec..0d44beed1 100644
--- a/src/main/scala/viper/gobra/frontend/ParseTreeTranslator.scala
+++ b/src/main/scala/viper/gobra/frontend/ParseTreeTranslator.scala
@@ -521,6 +521,22 @@ class ParseTreeTranslator(pom: PositionManager, source: Source, specOnly : Boole
}
}
+ override def visitAdtType(ctx: AdtTypeContext): PAdtType = {
+ val clauses = ctx.adtClause().asScala.toVector.map(visitAdtClause)
+ PAdtType(clauses).at(ctx)
+ }
+
+ override def visitAdtClause(ctx: AdtClauseContext): PAdtClause = {
+ val id = idnDef.unapply(ctx.IDENTIFIER())
+ val fieldClauses = ctx.fieldDecl().asScala.toVector.map(visitFieldDecl)
+ val args = fieldClauses.collect{ case x: PFieldDecls => x }
+
+ // embedded fields and ghost struct clauses are not supported.
+ if (id.isEmpty || args.size != fieldClauses.size) fail(ctx)
+
+ PAdtClause(id.get, args).at(ctx)
+ }
+
/**
* {@inheritDoc }
*
diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/resolution/MemberResolution.scala b/src/main/scala/viper/gobra/frontend/info/implementation/resolution/MemberResolution.scala
index ce05c169a..4a11336de 100644
--- a/src/main/scala/viper/gobra/frontend/info/implementation/resolution/MemberResolution.scala
+++ b/src/main/scala/viper/gobra/frontend/info/implementation/resolution/MemberResolution.scala
@@ -110,11 +110,11 @@ trait MemberResolution { this: TypeInfoImpl =>
case _ => AdvancedMemberSet.empty
}
- val adtConstructorSet: Type => AdvancedMemberSet[AdtClause] =
- attr[Type, AdvancedMemberSet[AdtClause]] {
- case DeclaredT(decl, context) => adtConstructorSet(context.symbType(decl.right)).surface
- case t: AdtT =>
- AdvancedMemberSet.init[AdtClause](t.decl.clauses.map(c => AdtClause(c, t.decl, this)))
+ val adtConstructorSet: Type => Set[AdtClause] =
+ attr[Type, Set[AdtClause]] {
+ case DeclaredT(decl, context) => adtConstructorSet(context.symbType(decl.right))
+ case t: AdtT => t.decl.clauses.map(c => AdtClause(c, t.decl, this)).toSet
+ case _ => Set.empty
}
// Methods
@@ -269,8 +269,8 @@ trait MemberResolution { this: TypeInfoImpl =>
def tryAdtMemberLookup(t: Type, id: PIdnUse): Option[(AdtMember, Vector[MemberPath])] =
adtMemberSet(t).lookupWithPath(id.name)
- def tryAdtConstructorLookup(t: Type, id: PIdnUse): Option[(AdtClause, Vector[MemberPath])] =
- adtConstructorSet(t).lookupWithPath(id.name)
+ def tryAdtConstructorLookup(t: Type, id: PIdnUse): Option[AdtClause] =
+ adtConstructorSet(t).find(_.getName == id.name)
/** Resolves `e`.`id`.
* @return _1: Methods accessible if e is addressable.
@@ -337,7 +337,7 @@ trait MemberResolution { this: TypeInfoImpl =>
case t =>
tryMethodLikeLookup(t, id)
// Constructors are not part of membersets because they are not promoted
- .orElse(tryAdtConstructorLookup(t, id))
+ .orElse(tryAdtConstructorLookup(t, id).map((_, Vector.empty)))
}
}
}
diff --git a/src/main/scala/viper/gobra/translator/encodings/adts/AdtEncoding.scala b/src/main/scala/viper/gobra/translator/encodings/adts/AdtEncoding.scala
index 1c94c628c..451d56ab3 100644
--- a/src/main/scala/viper/gobra/translator/encodings/adts/AdtEncoding.scala
+++ b/src/main/scala/viper/gobra/translator/encodings/adts/AdtEncoding.scala
@@ -268,7 +268,7 @@ class AdtEncoding extends LeafTypeEncoding {
BigInt(sorted.indexOf(clause))
}
- private def constructorCall(clause: in.AdtClause, args: Seq[vpr.Exp])(pos: vpr.Position = vpr.NoPosition, info: vpr.Info = vpr.NoInfo, errT: vpr.ErrorTrafo = vpr.NoTrafos): vpr.DomainFuncApp = {
+ private def constructorCall(clause: in.AdtClause, args: Seq[vpr.Exp])(pos: vpr.Position, info: vpr.Info, errT: vpr.ErrorTrafo): vpr.DomainFuncApp = {
val adtName = clause.name.adtName
vpr.DomainFuncApp(
Names.constructorAdtName(adtName, clause.name.name),
From 90b56ec249695e037b0db386fa7814bf7035b4a3 Mon Sep 17 00:00:00 2001
From: "Felix A. Wolf"
Date: Fri, 11 Nov 2022 19:47:08 +0100
Subject: [PATCH 044/296] safety commit
---
src/main/scala/viper/gobra/ast/frontend/Ast.scala | 2 +-
.../viper/gobra/ast/frontend/AstPattern.scala | 2 +-
src/main/scala/viper/gobra/frontend/Desugar.scala | 10 +++-------
.../implementation/property/Assignability.scala | 4 +---
.../implementation/property/TypeIdentity.scala | 4 +++-
.../implementation/property/UnderlyingType.scala | 4 ++++
.../resolution/AmbiguityResolution.scala | 2 +-
.../resolution/MemberResolution.scala | 15 +--------------
.../resolution/NameResolution.scala | 3 ++-
.../info/implementation/typing/ExprTyping.scala | 4 ++--
.../info/implementation/typing/TypeTyping.scala | 2 +-
11 files changed, 20 insertions(+), 32 deletions(-)
diff --git a/src/main/scala/viper/gobra/ast/frontend/Ast.scala b/src/main/scala/viper/gobra/ast/frontend/Ast.scala
index c6092cf83..c5b207027 100644
--- a/src/main/scala/viper/gobra/ast/frontend/Ast.scala
+++ b/src/main/scala/viper/gobra/ast/frontend/Ast.scala
@@ -1232,7 +1232,7 @@ case class POptionType(elem : PType) extends PGhostLiteralType
/** The type of ADT types */
case class PAdtType(clauses: Vector[PAdtClause]) extends PGhostLiteralType with PUnorderedScope
-case class PAdtClause(id: PIdnDef, args: Vector[PFieldDecls]) extends PGhostMisc with PUnorderedScope with PDependentDef
+case class PAdtClause(id: PIdnDef, args: Vector[PFieldDecls]) extends PGhostMisc with PUnorderedScope
case class PGhostSliceType(elem: PType) extends PGhostLiteralType
diff --git a/src/main/scala/viper/gobra/ast/frontend/AstPattern.scala b/src/main/scala/viper/gobra/ast/frontend/AstPattern.scala
index dfb5b5d7d..9f962b41d 100644
--- a/src/main/scala/viper/gobra/ast/frontend/AstPattern.scala
+++ b/src/main/scala/viper/gobra/ast/frontend/AstPattern.scala
@@ -22,7 +22,7 @@ object AstPattern {
case class NamedType(id: PIdnUse, symb: st.ActualTypeEntity) extends Type with Symbolic
case class PointerType(base: PType) extends Type
- case class QualifiedAdtType(base: PType, symb: st.AdtClause) extends Type with Symbolic // TODO: rename
+ case class AdtClause(id: PIdnUse, symb: st.AdtClause) extends Type with Symbolic
case class BuiltInType(id: PIdnUse, symb: st.BuiltInType) extends Type with Symbolic
diff --git a/src/main/scala/viper/gobra/frontend/Desugar.scala b/src/main/scala/viper/gobra/frontend/Desugar.scala
index d05a91ce3..e5f1e3ed5 100644
--- a/src/main/scala/viper/gobra/frontend/Desugar.scala
+++ b/src/main/scala/viper/gobra/frontend/Desugar.scala
@@ -4733,7 +4733,6 @@ object Desugar {
private val INTERFACE_PREFIX = "Y"
private val DOMAIN_PREFIX = "D"
private val ADT_PREFIX = "ADT"
- private val ADT_CLAUSE_PREFIX = "P"
private val LABEL_PREFIX = "L"
private val GLOBAL_PREFIX = "G"
private val BUILTIN_PREFIX = "B"
@@ -4912,14 +4911,11 @@ object Desugar {
def adt(a: AdtT): String = {
val pom = a.context.getTypeInfo.tree.originalRoot.positions
- val start = pom.positions.getStart(a.decl).get
- val finish = pom.positions.getFinish(a.decl).get
- val pos = pom.translate(start, finish)
- val adtName = pos.toString.replace(".", "$")
- s"$ADT_PREFIX$$$adtName"
+ val hash = srcTextName(pom, a.decl.clauses)
+ s"$ADT_PREFIX$$${topLevelName("")(hash, a.context)}"
}
- def adtField(n: String, s: AdtT): String = topLevelName(s"$ADT_CLAUSE_PREFIX$$${adt(s)}")(n, s.context)
+ def adtField(n: String, s: AdtT): String = s"${adt(s)}$$$n"
def label(n: String): String = n match {
case "#lhs" => "lhs"
diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/property/Assignability.scala b/src/main/scala/viper/gobra/frontend/info/implementation/property/Assignability.scala
index 96436ab94..ac88a2ddd 100644
--- a/src/main/scala/viper/gobra/frontend/info/implementation/property/Assignability.scala
+++ b/src/main/scala/viper/gobra/frontend/info/implementation/property/Assignability.scala
@@ -93,14 +93,12 @@ trait Assignability extends BaseProperty { this: TypeInfoImpl =>
// for ghost types
case (BooleanT, AssertionT) => successProp
- case (SortT, SortT) => successProp
- case (PermissionT, PermissionT) => successProp
case (SequenceT(l), SequenceT(r)) => assignableTo.result(l,r) // implies that Sequences are covariant
case (SetT(l), SetT(r)) => assignableTo.result(l,r)
case (MultisetT(l), MultisetT(r)) => assignableTo.result(l,r)
case (OptionT(l), OptionT(r)) => assignableTo.result(l, r)
case (IntT(_), PermissionT) => successProp
- case (c: AdtClauseT, t: AdtT) if c.context == t.context && c.adtT == t.decl => successProp
+ case (c: AdtClauseT, UnderlyingType(t: AdtT)) if c.context == t.context && c.adtT == t.decl => successProp
// conservative choice
case _ => errorProp()
diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/property/TypeIdentity.scala b/src/main/scala/viper/gobra/frontend/info/implementation/property/TypeIdentity.scala
index 7cb06f7ae..416c2bec8 100644
--- a/src/main/scala/viper/gobra/frontend/info/implementation/property/TypeIdentity.scala
+++ b/src/main/scala/viper/gobra/frontend/info/implementation/property/TypeIdentity.scala
@@ -38,6 +38,8 @@ trait TypeIdentity extends BaseProperty { this: TypeInfoImpl =>
case (MathMapT(k1, v1), MathMapT(k2, v2)) => identicalTypes(k1, k2) && identicalTypes(v1, v2)
case (OptionT(l), OptionT(r)) => identicalTypes(l, r)
case (l: DomainT, r: DomainT) => l == r
+ case (l: AdtT, r: AdtT) => l == r
+ case (l: AdtClauseT, r: AdtClauseT) => l == r
case (StructT(clausesL, _, contextL), StructT(clausesR, _, contextR)) =>
contextL == contextR && clausesL.size == clausesR.size && clausesL.zip(clausesR).forall {
@@ -66,7 +68,7 @@ trait TypeIdentity extends BaseProperty { this: TypeInfoImpl =>
case (VoidType, VoidType) => true
- case (l: AdtT, r: AdtT) => l == r
+
case _ => false
}
diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/property/UnderlyingType.scala b/src/main/scala/viper/gobra/frontend/info/implementation/property/UnderlyingType.scala
index f33c17f8b..d9c47981b 100644
--- a/src/main/scala/viper/gobra/frontend/info/implementation/property/UnderlyingType.scala
+++ b/src/main/scala/viper/gobra/frontend/info/implementation/property/UnderlyingType.scala
@@ -15,6 +15,10 @@ import viper.gobra.frontend.info.implementation.TypeInfoImpl
trait UnderlyingType { this: TypeInfoImpl =>
+ object UnderlyingType {
+ def unapply(t: Type): Option[Type] = Some(underlyingType(t))
+ }
+
lazy val underlyingType: Type => Type =
attr[Type, Type] {
case Single(DeclaredT(t: PTypeDecl, context: ExternalTypeInfo)) => underlyingType(context.symbType(t.right))
diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/resolution/AmbiguityResolution.scala b/src/main/scala/viper/gobra/frontend/info/implementation/resolution/AmbiguityResolution.scala
index 384718732..64b51d831 100644
--- a/src/main/scala/viper/gobra/frontend/info/implementation/resolution/AmbiguityResolution.scala
+++ b/src/main/scala/viper/gobra/frontend/info/implementation/resolution/AmbiguityResolution.scala
@@ -87,7 +87,6 @@ trait AmbiguityResolution { this: TypeInfoImpl =>
case (Right(base), Some((s: st.Method, path))) => Some(ap.MethodExpr(base, n.id, path, s))
case (Right(base), Some((s: st.MPredicate, path))) => Some(ap.PredicateExpr(base, n.id, path, s))
- case (Right(base), Some((s: st.AdtClause, _))) => Some(ap.QualifiedAdtType(base, s))
// imported members
case (Right(_), Some((s: st.ActualTypeEntity, _))) => Some(ap.NamedType(n.id, s))
@@ -96,6 +95,7 @@ trait AmbiguityResolution { this: TypeInfoImpl =>
case (Right(_), Some((s: st.Function, _))) => Some(ap.Function(n.id, s))
case (Right(_), Some((s: st.FPredicate, _))) => Some(ap.Predicate(n.id, s))
case (Right(_), Some((s: st.DomainFunction, _))) => Some(ap.DomainFunction(n.id, s))
+ case (Right(_), Some((s: st.AdtClause, _))) => Some(ap.AdtClause(n.id, s))
// built-in members
case (Left(base), Some((s: st.BuiltInMethod, path))) => Some(ap.BuiltInReceivedMethod(base, n.id, path, s))
diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/resolution/MemberResolution.scala b/src/main/scala/viper/gobra/frontend/info/implementation/resolution/MemberResolution.scala
index 4a11336de..896553697 100644
--- a/src/main/scala/viper/gobra/frontend/info/implementation/resolution/MemberResolution.scala
+++ b/src/main/scala/viper/gobra/frontend/info/implementation/resolution/MemberResolution.scala
@@ -110,13 +110,6 @@ trait MemberResolution { this: TypeInfoImpl =>
case _ => AdvancedMemberSet.empty
}
- val adtConstructorSet: Type => Set[AdtClause] =
- attr[Type, Set[AdtClause]] {
- case DeclaredT(decl, context) => adtConstructorSet(context.symbType(decl.right))
- case t: AdtT => t.decl.clauses.map(c => AdtClause(c, t.decl, this)).toSet
- case _ => Set.empty
- }
-
// Methods
private lazy val receiverMethodSetMap: Map[Type, AdvancedMemberSet[TypeMember]] = {
@@ -269,9 +262,6 @@ trait MemberResolution { this: TypeInfoImpl =>
def tryAdtMemberLookup(t: Type, id: PIdnUse): Option[(AdtMember, Vector[MemberPath])] =
adtMemberSet(t).lookupWithPath(id.name)
- def tryAdtConstructorLookup(t: Type, id: PIdnUse): Option[AdtClause] =
- adtConstructorSet(t).find(_.getName == id.name)
-
/** Resolves `e`.`id`.
* @return _1: Methods accessible if e is addressable.
* _2: Methods accessible if e is not addressable.
@@ -334,10 +324,7 @@ trait MemberResolution { this: TypeInfoImpl =>
case Right(typ) => // base is a type
typeSymbType(typ) match {
case pkg: ImportT => tryPackageLookup(RegularImport(pkg.decl.importPath), id, pkg.decl)
- case t =>
- tryMethodLikeLookup(t, id)
- // Constructors are not part of membersets because they are not promoted
- .orElse(tryAdtConstructorLookup(t, id).map((_, Vector.empty)))
+ case t => tryMethodLikeLookup(t, id)
}
}
}
diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/resolution/NameResolution.scala b/src/main/scala/viper/gobra/frontend/info/implementation/resolution/NameResolution.scala
index 613989abc..877cbfcb4 100644
--- a/src/main/scala/viper/gobra/frontend/info/implementation/resolution/NameResolution.scala
+++ b/src/main/scala/viper/gobra/frontend/info/implementation/resolution/NameResolution.scala
@@ -248,7 +248,8 @@ trait NameResolution {
private def packageLevelDefinitions(m: PMember): Vector[PIdnDef] = {
/* Returns identifier definitions with a package scope occurring in a type. */
def leakingIdentifier(t: PType): Vector[PIdnDef] = t match {
- case t: PDomainType => t.funcs.map(_.id)
+ case t: PDomainType => t.funcs.map(_.id) // domain functions
+ case t: PAdtType => t.clauses.map(_.id) // adt constructors
case _ => Vector.empty
}
diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ExprTyping.scala b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ExprTyping.scala
index c3cdc500a..09e357103 100644
--- a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ExprTyping.scala
+++ b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ExprTyping.scala
@@ -67,7 +67,7 @@ trait ExprTyping extends BaseTyping { this: TypeInfoImpl =>
case Some(_: ap.BuiltInType) => noMessages
case Some(_: ap.Predicate) => noMessages
case Some(_: ap.DomainFunction) => noMessages
- case Some(_: ap.QualifiedAdtType) => noMessages
+ case Some(_: ap.AdtClause) => noMessages
case Some(_: ap.AdtField) => noMessages
// TODO: fully supporting packages results in further options: global variable
@@ -144,7 +144,7 @@ trait ExprTyping extends BaseTyping { this: TypeInfoImpl =>
case Some(p: ap.Predicate) => FunctionT(p.symb.args map p.symb.context.typ, AssertionT)
case Some(p: ap.DomainFunction) => FunctionT(p.symb.args map p.symb.context.typ, p.symb.context.typ(p.symb.result))
- case Some(p: ap.QualifiedAdtType) =>
+ case Some(p: ap.AdtClause) =>
val fields = p.symb.fields.map(f => f.id.name -> p.symb.context.symbType(f.typ)).toMap
AdtClauseT(fields, p.symb.decl, p.symb.adtDecl, this)
case Some(p: ap.AdtField) =>
diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/typing/TypeTyping.scala b/src/main/scala/viper/gobra/frontend/info/implementation/typing/TypeTyping.scala
index 5e3830aa8..15f131f3c 100644
--- a/src/main/scala/viper/gobra/frontend/info/implementation/typing/TypeTyping.scala
+++ b/src/main/scala/viper/gobra/frontend/info/implementation/typing/TypeTyping.scala
@@ -154,7 +154,7 @@ trait TypeTyping extends BaseTyping { this: TypeInfoImpl =>
case Some(p: ap.NamedType) => DeclaredT(p.symb.decl, p.symb.context)
// ADT clause is special since it is a type with a name that is not a named type
- case Some(p: ap.QualifiedAdtType) =>
+ case Some(p: ap.AdtClause) =>
val types = p.symb.fields.map(f => f.id.name -> p.symb.context.symbType(f.typ)).toMap
AdtClauseT(types, p.symb.decl, p.symb.adtDecl, p.symb.context)
From 94c24bae040f6d4b86dd42b473bc025bd4cc2d0e Mon Sep 17 00:00:00 2001
From: "Felix A. Wolf"
Date: Sun, 13 Nov 2022 16:00:54 +0100
Subject: [PATCH 045/296] safety commit
---
.../gobra/ast/internal/PrettyPrinter.scala | 29 +-
.../viper/gobra/ast/internal/Program.scala | 9 +-
.../scala/viper/gobra/frontend/Desugar.scala | 8 +-
.../resolution/AdvancedMemberSet.scala | 1 -
.../scala/viper/gobra/translator/Names.scala | 7 +-
.../encodings/adts/AdtEncoding.scala | 434 ++++++++++--------
.../gobra/translator/util/ViperUtil.scala | 11 +-
7 files changed, 267 insertions(+), 232 deletions(-)
diff --git a/src/main/scala/viper/gobra/ast/internal/PrettyPrinter.scala b/src/main/scala/viper/gobra/ast/internal/PrettyPrinter.scala
index e31b21de3..fdd1bf978 100644
--- a/src/main/scala/viper/gobra/ast/internal/PrettyPrinter.scala
+++ b/src/main/scala/viper/gobra/ast/internal/PrettyPrinter.scala
@@ -646,38 +646,11 @@ class DefaultPrettyPrinter extends PrettyPrinter with kiama.output.PrettyPrinter
// types
def showType(typ : Type) : Doc = typ match {
- case BoolT(_) => "bool"
- case IntT(_, kind) => kind.name
- case StringT(_) => "string"
- case Float32T(_) => "float32"
- case Float64T(_) => "float64"
- case VoidT => "void"
- case FunctionT(args, res, _) => "func" <> parens(showTypeList(args)) <> parens(showTypeList(res))
- case PermissionT(_) => "perm"
- case DefinedT(name, _) => name
- case PointerT(t, _) => "*" <> showType(t)
- case TupleT(ts, _) => parens(showTypeList(ts))
- case PredT(args, _) => "pred" <> parens(showTypeList(args))
- case struct: StructT => emptyDoc <> block(hcat(struct.fields map showField))
- case i: InterfaceT => "interface" <> parens("name is " <> i.name)
- case _: DomainT => "domain" <> parens("...")
- case ChannelT(elem, _) => "chan" <+> showType(elem)
- case SortT => "sort"
- case array : ArrayT => brackets(array.length.toString) <> showType(array.elems)
- case SequenceT(elem, _) => "seq" <> brackets(showType(elem))
- case SetT(elem, _) => "set" <> brackets(showType(elem))
- case MultisetT(elem, _) => "mset" <> brackets(showType(elem))
case MathMapT(keys, values, _) => "dict" <> brackets(showType(keys)) <> showType(values)
- case OptionT(elem, _) => "option" <> brackets(showType(elem))
- case AdtT(name, _, _) => "adt" <> parens(name)
- case AdtClauseT(name, adtT, _, _) => showType(adtT) <+> "::" <+> name
- case SliceT(elem, _) => "[]" <> showType(elem)
case MapT(keys, values, _) => "map" <> brackets(showType(keys)) <> showType(values)
+ case t: PrettyType => t.toString
}
- private def showTypeList[T <: Type](list: Vector[T]): Doc =
- showList(list)(showType)
-
def showList[T](list: Seq[T])(f: T => Doc): Doc = ssep(list map f, comma <> space)
def showMap[K, V](map : Map[K, V])(f : K => Doc, g : V => Doc) : Doc =
diff --git a/src/main/scala/viper/gobra/ast/internal/Program.scala b/src/main/scala/viper/gobra/ast/internal/Program.scala
index c9f58c9c2..706072dcf 100644
--- a/src/main/scala/viper/gobra/ast/internal/Program.scala
+++ b/src/main/scala/viper/gobra/ast/internal/Program.scala
@@ -1565,20 +1565,17 @@ case class DomainT(name: String, addressability: Addressability) extends PrettyT
DomainT(name, newAddressability)
}
-// TODO: check why `clauseToTag` is necessary
-case class AdtT(name: String, addressability: Addressability, clauseToTag: Map[String, BigInt]) extends Type with TopType {
+case class AdtT(name: String, addressability: Addressability) extends PrettyType(s"adt{ name is $name }") with TopType {
override def equalsWithoutMod(t: Type): Boolean = t match {
case o: AdtT => name == o.name
case _ => false
}
override def withAddressability(newAddressability: Addressability): Type =
- AdtT(name, newAddressability, clauseToTag)
+ AdtT(name, newAddressability)
}
-// TODO: maybe remove this type as it is not necessary anymore
-case class AdtClauseT(name: String, adtT: AdtT, fields: Vector[Field], addressability: Addressability) extends Type {
- /** Returns whether 'this' is equals to 't' without considering the addressability modifier of the types. */
+case class AdtClauseT(name: String, adtT: AdtT, fields: Vector[Field], addressability: Addressability) extends PrettyType(fields.mkString(s"$name{", ", ", "}")) {
override def equalsWithoutMod(t: Type): Boolean = t match {
case o: AdtClauseT => name == o.name && adtT == o.adtT
case _ => false
diff --git a/src/main/scala/viper/gobra/frontend/Desugar.scala b/src/main/scala/viper/gobra/frontend/Desugar.scala
index e5f1e3ed5..1f87bd5f5 100644
--- a/src/main/scala/viper/gobra/frontend/Desugar.scala
+++ b/src/main/scala/viper/gobra/frontend/Desugar.scala
@@ -3716,17 +3716,16 @@ object Desugar {
case t: Type.AdtT =>
val adtName = nm.adt(t)
- val res = registerType(in.AdtT(adtName, addrMod, getAdtClauseTagMap(t)))
+ val res = registerType(in.AdtT(adtName, addrMod))
registerAdt(t, res)
res
case t: Type.AdtClauseT =>
val tAdt = Type.AdtT(t.adtT, t.context)
- val adt: in.AdtT = in.AdtT(nm.adt(tAdt), addrMod, getAdtClauseTagMap(tAdt))
+ val adt: in.AdtT = in.AdtT(nm.adt(tAdt), addrMod)
val fields: Vector[in.Field] = (t.clauses map { case (key: String, typ: Type) =>
in.Field(nm.adtField(key, tAdt), typeD(typ, Addressability.mathDataStructureElement)(src), true)(src)
}).toVector
-
in.AdtClauseT(idName(t.decl.id, t.context.getTypeInfo), adt, fields, addrMod)
case Type.PredT(args) => in.PredT(args.map(typeD(_, Addressability.rValue)(src)), Addressability.rValue)
@@ -4915,7 +4914,8 @@ object Desugar {
s"$ADT_PREFIX$$${topLevelName("")(hash, a.context)}"
}
- def adtField(n: String, s: AdtT): String = s"${adt(s)}$$$n"
+ /** can be inversed with [[inverse]] */
+ def adtField(n: String, @unused s: AdtT): String = s"$n$FIELD_PREFIX"
def label(n: String): String = n match {
case "#lhs" => "lhs"
diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/resolution/AdvancedMemberSet.scala b/src/main/scala/viper/gobra/frontend/info/implementation/resolution/AdvancedMemberSet.scala
index a517bf33f..b05b5b470 100644
--- a/src/main/scala/viper/gobra/frontend/info/implementation/resolution/AdvancedMemberSet.scala
+++ b/src/main/scala/viper/gobra/frontend/info/implementation/resolution/AdvancedMemberSet.scala
@@ -97,7 +97,6 @@ object AdvancedMemberSet {
case Field(m, _, _) => m.id.name
case Embbed(m, _, _) => m.id.name
case t: AdtMember => t.getName
- case t: AdtClause => t.getName
case ml: BuiltInMethodLike => ml.tag.identifier
}
diff --git a/src/main/scala/viper/gobra/translator/Names.scala b/src/main/scala/viper/gobra/translator/Names.scala
index 7d5b83cfc..8befa7395 100644
--- a/src/main/scala/viper/gobra/translator/Names.scala
+++ b/src/main/scala/viper/gobra/translator/Names.scala
@@ -167,10 +167,11 @@ object Names {
def dfltDomainValue(domainName: String): String = s"dflt$domainName"
// adt
- def dfltAdtValue(adtName: String): String = s"adtDflt_$adtName"
- def tagAdtFunction(adtName: String): String = s"adtTag_$adtName"
- def destructorAdtName(adtName: String, argumentName: String) = s"get_${adtName}_$argumentName"
+ def dfltAdtValue(adtName: String): String = s"${adtName}_dflt"
+ def tagAdtFunction(adtName: String): String = s"${adtName}_tag"
+ def destructorAdtName(adtName: String, argumentName: String) = s"${adtName}_$argumentName"
def constructorAdtName(adtName: String, clause: String) = s"${adtName}_$clause"
+ def adtClauseTagFunction(adtName: String, clause: String): String = s"${adtName}_${clause}_tag"
// unknown values
def unknownValuesDomain: String = "UnknownValueDomain"
diff --git a/src/main/scala/viper/gobra/translator/encodings/adts/AdtEncoding.scala b/src/main/scala/viper/gobra/translator/encodings/adts/AdtEncoding.scala
index 451d56ab3..71ca07a13 100644
--- a/src/main/scala/viper/gobra/translator/encodings/adts/AdtEncoding.scala
+++ b/src/main/scala/viper/gobra/translator/encodings/adts/AdtEncoding.scala
@@ -15,6 +15,7 @@ import viper.gobra.translator.Names
import viper.gobra.translator.context.Context
import viper.gobra.translator.encodings.combinators.LeafTypeEncoding
import viper.gobra.translator.util.ViperWriter.{CodeWriter, MemberWriter}
+import viper.gobra.util.Violation.violation
import viper.silver.{ast => vpr}
class AdtEncoding extends LeafTypeEncoding {
@@ -23,6 +24,7 @@ class AdtEncoding extends LeafTypeEncoding {
import viper.gobra.translator.util.ViperWriter.CodeLevel._
import viper.gobra.translator.util.ViperWriter.{MemberLevel => ml}
import viper.silver.verifier.{errors => err}
+ import viper.gobra.translator.util.{ViperUtil => vu}
override def typ(ctx: Context): in.Type ==> vpr.Type = {
case ctx.Adt(adt) / m =>
@@ -39,179 +41,229 @@ class AdtEncoding extends LeafTypeEncoding {
private def adtType(adtName: String): vpr.DomainType = vpr.DomainType(adtName, Map.empty)(Seq.empty)
+ /**
+ * [type X adt{ clause1{F11, ...}; ...; clauseN{FN1, ...} }] ->
+ *
+ * domain X {
+ *
+ * // constructors
+ * X_clause1(Type(F11), ...): X
+ * ...
+ *
+ * // destructors
+ * X_F11(X): Type(F11)
+ * ...
+ *
+ * // default
+ * X_default(): X
+ *
+ * // tags
+ * X_tag(X): Int
+ * unique X_clause1_tag(): Int
+ * ...
+ *
+ * axiom {
+ * forall f11: F11, ... :: { X_clause1(f11, ...) }
+ * X_tag(X_clause1(f11, ...)) == X_clause1_tag() && X_F11(X_clause1(f11, ...)) )) == f11 && ...
+ * ...
+ * }
+ *
+ * axiom {
+ * forall t: X :: {X_clause1_f11(t)}...{X_clause1_f1N(t)}
+ * X_tag(t) == X_clause1_tag() ==> t == X_clause1(X_clause1_f11(t), ...)
+ * ...
+ * }
+ *
+ * axiom {
+ * forall t: X :: {X_tag(t)} t == X_clause1(X_clause1_f11(t), ...) || t == ...
+ * }
+ *
+ * }
+ */
override def member(ctx: Context): in.Member ==> MemberWriter[Vector[vpr.Member]] = {
case adt: in.AdtDefinition =>
- val adtName = adt.name
val (aPos, aInfo, aErrT) = adt.vprMeta
+ val adtName = adt.name // X
+ val adtT = adtType(adtName)
- def localVarTDecl = vpr.LocalVarDecl("t", adtType(adtName))(_, _, _)
+ def adtDecl(pos: vpr.Position, info: vpr.Info, errT: vpr.ErrorTrafo): vpr.LocalVarDecl =
+ vpr.LocalVarDecl("t", adtT)(pos, info, errT)
- def localVarT = vpr.LocalVar("t", adtType(adtName))(_, _, _)
-
- def tagF = getTag(adt.clauses)(_)
-
- def destructorsClause(clause: in.AdtClause): Vector[vpr.DomainFunc] =
- clause.args.map(a => {
- val (argPos, argInfo, argErrT) = a.vprMeta
- vpr.DomainFunc(
- Names.destructorAdtName(adtName, a.name),
- Seq(localVarTDecl(argPos, argInfo, argErrT)),
- ctx.typ(a.typ)
- )(argPos, argInfo, adtName, argErrT)
- })
-
-
- def clauseArgsAsLocalVarExp(c: in.AdtClause): Vector[vpr.LocalVar] = {
- val (cPos, cInfo, cErrT) = c.vprMeta
- c.args map { a =>
- val typ = ctx.typ(a.typ)
- val name = a.name
- vpr.LocalVar(name, typ)(cPos, cInfo, cErrT)
- }
- }
-
- def tagApp(arg: vpr.Exp) = {
- vpr.DomainFuncApp(
- Names.tagAdtFunction(adtName),
- Seq(arg),
- Map.empty
- )(_, _, vpr.Int, adtName, _)
+ def fieldDecls(clause: in.AdtClause): Vector[vpr.LocalVarDecl] = {
+ val (cPos, cInfo, cErrT) = clause.vprMeta
+ clause.args map { field => vpr.LocalVarDecl(field.name, ctx.typ(field.typ))(cPos, cInfo, cErrT) }
}
- def deconstructorCall(field: String, arg: vpr.Exp, retTyp: vpr.Type) = {
- vpr.DomainFuncApp(
- Names.destructorAdtName(adtName, field),
- Seq(arg),
- Map.empty
- )(_, _, retTyp, adtName, _)
+ // constructors
+ val constructors = adt.clauses map { clause =>
+ val (cPos, cInfo, cErrT) = clause.vprMeta
+ vpr.DomainFunc(
+ Names.constructorAdtName(adtName, clause.name.name),
+ fieldDecls(clause),
+ adtT,
+ )(cPos, cInfo, adtName, cErrT)
}
- val clauses = adt.clauses map { c =>
- val (cPos, cInfo, cErrT) = c.vprMeta
- val args = clauseArgsAsLocalVarDecl(c)(ctx)
- vpr.DomainFunc(Names.constructorAdtName(adtName, c.name.name), args, adtType(adtName))(cPos, cInfo, adtName, cErrT)
+ // destructors
+ val destructors = adt.clauses flatMap { clause =>
+ clause.args.map { field =>
+ val (fieldPos, fieldInfo, fieldErrT) = field.vprMeta
+ vpr.DomainFunc(
+ Names.destructorAdtName(adtName, field.name),
+ Seq(adtDecl(fieldPos, fieldInfo, fieldErrT)),
+ ctx.typ(field.typ)
+ )(fieldPos, fieldInfo, adtName, fieldErrT)
+ }
}
+ // default
val defaultFunc = vpr.DomainFunc(
Names.dfltAdtValue(adtName),
Seq.empty,
- adtType(adtName)
+ adtT,
)(aPos, aInfo, adtName, aErrT)
+ // tag
val tagFunc = vpr.DomainFunc(
Names.tagAdtFunction(adtName),
- Seq(localVarTDecl(aPos, aInfo, aErrT)),
+ Seq(adtDecl(aPos, aInfo, aErrT)),
vpr.Int
)(aPos, aInfo, adtName, aErrT)
- val destructors: Vector[vpr.DomainFunc] = adt.clauses.flatMap(destructorsClause)
+ val clauseTags = adt.clauses map { clause =>
+ val (cPos, cInfo, cErrT) = clause.vprMeta
+ vpr.DomainFunc(
+ Names.adtClauseTagFunction(adtName, clause.name.name),
+ Seq.empty,
+ vpr.Int,
+ unique = true,
+ )(cPos, cInfo, adtName, cErrT)
+ }
+
- val tagAxioms: Vector[vpr.AnonymousDomainAxiom] = adt.clauses.map(c => {
- val (cPos, cInfo, cErrT) = c.vprMeta
- val args: Seq[vpr.Exp] = clauseArgsAsLocalVarExp(c)
- val triggerVars: Seq[vpr.LocalVarDecl] = clauseArgsAsLocalVarDecl(c)(ctx)
- val construct = constructorCall(c, args)(cPos, cInfo, cErrT)
- val trigger = vpr.Trigger(Seq(construct))(cPos, cInfo, cErrT)
- val lhs: vpr.Exp = tagApp(construct)(cPos, cInfo, cErrT)
- val clauseTag = vpr.IntLit(tagF(c))(cPos, cInfo, cErrT)
+ // axioms
- val destructors = c.args.map(a =>
- deconstructorCall(a.name, construct, ctx.typ(a.typ))(cPos, cInfo, cErrT)
+ // forall fi1: Fi1, ... :: { X_clausei(fi1, ...) }
+ // X_tag(X_clausei(fi1, ...)) == X_clausei_tag() && X_Fi1(X_clausei(fi1, ...)) )) == fi1 && ...
+ val constructorAxioms: Vector[vpr.AnonymousDomainAxiom] = adt.clauses.map(clause => {
+ val (cPos, cInfo, cErrT) = clause.vprMeta
+ val clauseFieldDecls = fieldDecls(clause)
+ val args = clauseFieldDecls.map(_.localVar)
+ val clauseName = clause.name.name
+
+ val construct = constructor(clauseName, adtName, args)(cPos, cInfo, cErrT)
+ val trigger = vpr.Trigger(Seq(construct))(cPos, cInfo, cErrT)
+ val discriminatorOverConstructor = discriminator(clauseName, adtName, construct)(cPos, cInfo, cErrT)
+ val destructorsOverConstructor = clause.args.map( field =>
+ destructor(field.name, adtName, construct, ctx.typ(field.typ))(cPos, cInfo, cErrT)
)
- if (c.args.nonEmpty) {
- val destructOverConstruct: vpr.Exp = (destructors.zip(args).map {
- case (d, a) => vpr.EqCmp(
- d, a
- )(cPos, cInfo, cErrT): vpr.Exp
- }: Seq[vpr.Exp]).reduceLeft {
- (l: vpr.Exp, r: vpr.Exp) => vpr.And(l, r)(cPos, cInfo, cErrT): vpr.Exp
+ if (clause.args.nonEmpty) {
+ val destructorEqArg = (destructorsOverConstructor zip args) map {
+ case (destructApp, arg) => vpr.EqCmp(destructApp, arg)(cPos, cInfo, cErrT)
}
- vpr.AnonymousDomainAxiom(vpr.Forall(triggerVars, Seq(trigger), vpr.And(
- vpr.EqCmp(lhs, clauseTag)(cPos, cInfo, cErrT),
- destructOverConstruct
- )(cPos, cInfo, cErrT)
- )(cPos, cInfo, cErrT))(cPos, cInfo, adtName, cErrT)
+ vpr.AnonymousDomainAxiom(
+ vpr.Forall(
+ clauseFieldDecls,
+ Seq(trigger),
+ vu.bigAnd(discriminatorOverConstructor +: destructorEqArg)(cPos, cInfo, cErrT)
+ )(cPos, cInfo, cErrT)
+ )(cPos, cInfo, adtName, cErrT)
} else {
- vpr.AnonymousDomainAxiom(vpr.EqCmp(lhs, clauseTag)(cPos, cInfo, cErrT))(cPos, cInfo, adtName, cErrT)
+ vpr.AnonymousDomainAxiom(discriminatorOverConstructor)(cPos, cInfo, adtName, cErrT)
}
})
- val destructorAxioms: Vector[vpr.AnonymousDomainAxiom] = adt.clauses.filter(c => c.args.nonEmpty).map(c => {
- val (cPos, cInfo, cErrT) = c.vprMeta
- val variable = localVarTDecl(cPos, cInfo, cErrT)
- val localVar = localVarT(cPos, cInfo, cErrT)
-
- val destructors = c.args.map(a =>
- deconstructorCall(a.name, localVar, ctx.typ(a.typ))(cPos, cInfo, cErrT)
+ // forall t: X :: {X_clausei_fi1(t)}...{X_clausei_fiN(t)}
+ // X_tag(t) == X_clausei_tag() ==> t == X_clausei(X_clausei_fi1(t), ...)
+ val destructorAxioms: Vector[vpr.AnonymousDomainAxiom] = adt.clauses.filter(c => c.args.nonEmpty).map(clause => {
+ val (cPos, cInfo, cErrT) = clause.vprMeta
+ val clauseName = clause.name.name
+ val variableDecl = adtDecl(cPos, cInfo, cErrT)
+ val variable = variableDecl.localVar
+ val destructorsOverVar = clause.args.map(field =>
+ destructor(field.name, adtName, variable, ctx.typ(field.typ))(cPos, cInfo, cErrT)
)
- val trigger = destructors.map(d => vpr.Trigger(Seq(d))(cPos, cInfo, cErrT))
- val clauseTag = vpr.IntLit(tagF(c))(cPos, cInfo, cErrT)
- val triggerTagApp = tagApp(localVar)(cPos, cInfo, cErrT)
- val implicationLhs = vpr.EqCmp(triggerTagApp, clauseTag)(aPos, aInfo, aErrT)
- val implicationRhs = vpr.EqCmp(
- localVar,
- constructorCall(c, destructors)(cPos, cInfo, cErrT)
- )(cPos, cInfo, cErrT)
-
- val implication = vpr.Implies(implicationLhs, implicationRhs)(cPos, cInfo, cErrT)
-
- vpr.AnonymousDomainAxiom(vpr.Forall(Seq(variable), trigger, implication)(cPos, cInfo, cErrT))(cPos,
- cInfo, adtName, cErrT)
+ vpr.AnonymousDomainAxiom(
+ vpr.Forall(
+ Seq(variableDecl),
+ destructorsOverVar.map(d => vpr.Trigger(Seq(d))(cPos, cInfo, cErrT)),
+ vpr.Implies(
+ discriminator(clauseName, adtName, variable)(cPos, cInfo, cErrT),
+ vpr.EqCmp(
+ variable,
+ constructor(clauseName, adtName, destructorsOverVar)(cPos, cInfo, cErrT)
+ )(cPos, cInfo, cErrT),
+ )(cPos, cInfo, cErrT),
+ )(cPos, cInfo, cErrT)
+ )(cPos, cInfo, adtName, cErrT)
})
+ // forall t: X :: {X_tag(t)} t == X_clause1(X_clause1_f11(t), ...) || t == ...
val exclusiveAxiom = {
- val variableDecl = localVarTDecl(aPos, aInfo, aErrT)
- val variable = localVarT(aPos, aInfo, aErrT)
- val triggerExpression = tagApp(variable)(aPos, aInfo, aErrT)
- val trigger = vpr.Trigger(Seq(triggerExpression))(aPos, aInfo, aErrT)
+ val variableDecl = adtDecl(aPos, aInfo, aErrT)
+ val variable = variableDecl.localVar
- def destructors(clause: in.AdtClause) = clause.args map (a => {
- val (argPos, argInfo, argErrT) = a.vprMeta
- deconstructorCall(a.name, variable, ctx.typ(a.typ))(argPos, argInfo, argErrT)
- })
+ val triggerExpression = tag(adtName, variable)(aPos, aInfo, aErrT)
+ val trigger = vpr.Trigger(Seq(triggerExpression))(aPos, aInfo, aErrT)
- val equalities = adt.clauses.map(c => {
- val (cPos, cInfo, cErrT) = c.vprMeta
- constructorCall(c, destructors(c))(cPos, cInfo, cErrT)
- })
- .map(c => {
- vpr.EqCmp(variable, c)(c.pos, c.info, c.errT)
- })
- .foldLeft(vpr.FalseLit()(aPos, aInfo, aErrT): vpr.Exp)({ (acc, next) => vpr.Or(acc, next)(aPos, aInfo, aErrT): vpr.Exp })
+ val equalities = adt.clauses.map{clause =>
+ val (cPos, cInfo, cErrT) = clause.vprMeta
+ val clauseName = clause.name.name
+ vpr.EqCmp(
+ variable,
+ constructor(
+ clauseName,
+ adtName,
+ clause.args map { field =>
+ val (argPos, argInfo, argErrT) = field.vprMeta
+ destructor(field.name, adtName, variable, ctx.typ(field.typ))(argPos, argInfo, argErrT)
+ }
+ )(cPos, cInfo, cErrT)
+ )(cPos, cInfo, cErrT)
+ }
vpr.AnonymousDomainAxiom(
- vpr.Forall(Seq(variableDecl), Seq(trigger), equalities)(aPos, aInfo, aErrT)
+ vpr.Forall(Seq(variableDecl), Seq(trigger), vu.bigOr(equalities)(aPos, aInfo, aErrT))(aPos, aInfo, aErrT)
)(aPos, aInfo, adtName, aErrT)
}
-
- val axioms = (tagAxioms ++ destructorAxioms) :+ exclusiveAxiom
- val funcs = (clauses ++ destructors) :+ defaultFunc :+ tagFunc
-
- ml.unit(Vector(vpr.Domain(adtName, functions = funcs, axioms = axioms)(pos = aPos, info = aInfo, errT = aErrT)))
+ ml.unit(Vector(vpr.Domain(
+ adtName,
+ functions = (defaultFunc +: tagFunc +: clauseTags) ++ constructors ++ destructors,
+ axioms = (exclusiveAxiom +: constructorAxioms) ++ destructorAxioms
+ )(pos = aPos, info = aInfo, errT = aErrT)))
}
+ /**
+ * [ dflt(adt{N}) ] -> N_default()
+ * [ C{args}: adt{N} ] -> N_C([args])
+ * [ (e: adt{N}).isC ] -> N_tag([e]) == N_C_tag()
+ * [ (e: adt{N}).f ] -> N_f([e])
+ */
override def expression(ctx: Context): in.Expr ==> CodeWriter[vpr.Exp] = {
- def defaultVal(e: in.DfltVal, a: in.AdtT) = {
- val (pos, info, errT) = e.vprMeta
- unit(
- vpr.DomainFuncApp(
- funcname = Names.dfltAdtValue(a.name),
- Seq.empty,
- Map.empty
- )(pos, info, adtType(a.name), a.name, errT): vpr.Exp
- )
- }
-
default(super.expression(ctx)) {
- case (e: in.DfltVal) :: ctx.Adt(a) / Exclusive => defaultVal(e, a)
- case (e: in.DfltVal) :: ctx.AdtClause(a) / Exclusive => defaultVal(e, a.adtT)
- case ac: in.AdtConstructorLit => adtConstructor(ac, ctx)
- case ad: in.AdtDiscriminator => adtDiscriminator(ad, ctx)
- case ad: in.AdtDestructor => adtDestructor(ad, ctx)
+ case (e: in.DfltVal) :: ctx.Adt(a) / Exclusive => unit(withSrc(defaultVal(a.name), e))
+ case (e: in.DfltVal) :: ctx.AdtClause(a) / Exclusive => unit(withSrc(defaultVal(a.adtT.name), e))
+
+ case ac: in.AdtConstructorLit =>
+ for {
+ args <- sequence(ac.args map ctx.expression)
+ } yield withSrc(constructor(ac.clause.name, ac.clause.adtName, args), ac)
+
+ case ad: in.AdtDiscriminator =>
+ for {
+ value <- ctx.expression(ad.base)
+ } yield withSrc(discriminator(ad.clause.name, ad.clause.adtName, value), ad)
+
+ case ad: in.AdtDestructor =>
+ val adtType = underlyingAdtType(ad.base.typ)(ctx)
+ for {
+ value <- ctx.expression(ad.base)
+ } yield withSrc(destructor(ad.field.name, adtType.name, value, ctx.typ(ad.field.typ)), ad)
+
case p: in.PatternMatchExp => translatePatternMatchExp(ctx)(p)
// case c@in.Contains(_, _ :: ctx.Adt(_)) => translateContains(c)(ctx)
}
@@ -223,68 +275,7 @@ class AdtEncoding extends LeafTypeEncoding {
}
}
- private def adtConstructor(ac: in.AdtConstructorLit, ctx: Context): Writer[vpr.Exp] = {
- def goE(x: in.Expr): CodeWriter[vpr.Exp] = ctx.expression(x)
-
- val (pos, info, errT) = ac.vprMeta
- for {
- args <- sequence(ac.args map goE)
- } yield vpr.DomainFuncApp(
- funcname = Names.constructorAdtName(ac.clause.adtName, ac.clause.name),
- args,
- Map.empty
- )(pos, info, adtType(ac.clause.adtName), ac.clause.adtName, errT)
- }
-
- private def adtDiscriminator(ac: in.AdtDiscriminator, ctx: Context): Writer[vpr.Exp] = {
- def goE(x: in.Expr): CodeWriter[vpr.Exp] = ctx.expression(x)
-
- val adtType = underlyingType(ac.base.typ)(ctx).asInstanceOf[in.AdtT]
- val (pos, info, errT) = ac.vprMeta
- for {
- value <- goE(ac.base)
- } yield vpr.EqCmp(vpr.DomainFuncApp(
- Names.tagAdtFunction(adtType.name),
- Seq(value), Map.empty)(pos, info, vpr.Int, adtType.name, errT),
- vpr.IntLit(adtType.clauseToTag(ac.clause.name))(pos, info, errT)
- )(pos, info, errT)
- }
-
- private def adtDestructor(ac: in.AdtDestructor, ctx: Context): Writer[vpr.Exp] = {
- def goE(x: in.Expr): CodeWriter[vpr.Exp] = ctx.expression(x)
-
- val adtType = underlyingType(ac.base.typ)(ctx).asInstanceOf[in.AdtT]
- val (pos, info, errT) = ac.vprMeta
- for {
- value <- goE(ac.base)
- } yield vpr.DomainFuncApp(
- Names.destructorAdtName(adtType.name, ac.field.name),
- Seq(value), Map.empty)(pos, info, ctx.typ(ac.field.typ), adtType.name, errT)
- }
-
-
- private def getTag(clauses: Vector[in.AdtClause])(clause: in.AdtClause): BigInt = {
- val sorted = clauses.sortBy(_.name.name)
- BigInt(sorted.indexOf(clause))
- }
-
- private def constructorCall(clause: in.AdtClause, args: Seq[vpr.Exp])(pos: vpr.Position, info: vpr.Info, errT: vpr.ErrorTrafo): vpr.DomainFuncApp = {
- val adtName = clause.name.adtName
- vpr.DomainFuncApp(
- Names.constructorAdtName(adtName, clause.name.name),
- args,
- Map.empty
- )(pos, info, adtType(adtName), adtName, errT)
- }
-
- private def clauseArgsAsLocalVarDecl(c: in.AdtClause)(ctx: Context): Vector[vpr.LocalVarDecl] = {
- val (cPos, cInfo, cErrT) = c.vprMeta
- c.args map { a =>
- val typ = ctx.typ(a.typ)
- val name = a.name
- vpr.LocalVarDecl(name, typ)(cPos, cInfo, cErrT)
- }
- }
+ // pattern matching
def declareIn(ctx: Context)(e: in.Expr, p: in.MatchPattern, z: vpr.Exp): CodeWriter[vpr.Exp] = {
val (pos, info, errT) = p.vprMeta
@@ -371,7 +362,7 @@ class AdtEncoding extends LeafTypeEncoding {
case in.MatchBindVar(_, _) | in.MatchWildcard() => unit(vpr.TrueLit()(pos,info,errT))
case in.MatchAdt(clause, exp) =>
val tagFunction = Names.tagAdtFunction(clause.adtT.name)
- val tag = vpr.IntLit(clause.adtT.clauseToTag(clause.name))(mPos, mInfo, mErr)
+ val tag = vpr.IntLit(???)(mPos, mInfo, mErr)
val inDeconstructors = clause.fields.map(f => in.AdtDestructor(expr, f)(pattern.info))
for {
e1 <- goE(expr)
@@ -466,4 +457,69 @@ class AdtEncoding extends LeafTypeEncoding {
}
}
+
+ // constructor, destructor, discriminator, tag, default
+
+ /** adtName_clauseName(args) */
+ private def constructor(clauseName: String, adtName: String, args: Vector[vpr.Exp])(pos: vpr.Position, info: vpr.Info, errT: vpr.ErrorTrafo): vpr.Exp = {
+ vpr.DomainFuncApp(
+ funcname = Names.constructorAdtName(adtName, clauseName),
+ args,
+ Map.empty
+ )(pos, info, adtType(adtName), adtName, errT)
+ }
+
+ /** adtName_fieldName(arg) */
+ private def destructor(fieldName: String, adtName: String, arg: vpr.Exp, fieldType: vpr.Type)(pos: vpr.Position, info: vpr.Info, errT: vpr.ErrorTrafo): vpr.Exp = {
+ vpr.DomainFuncApp(
+ funcname = Names.destructorAdtName(adtName, fieldName),
+ Seq(arg),
+ Map.empty,
+ )(pos, info, fieldType, adtName, errT)
+ }
+
+ /** adtName_tag(arg) == adtName_clauseName_tag() */
+ private def discriminator(clauseName: String, adtName: String, arg: vpr.Exp)(pos: vpr.Position, info: vpr.Info, errT: vpr.ErrorTrafo): vpr.Exp = {
+ vpr.EqCmp(
+ tag(adtName, arg)(pos, info, errT),
+ clauseTag(clauseName, adtName)(pos, info, errT),
+ )(pos, info, errT)
+ }
+
+ /** adtName_tag(arg) */
+ private def tag(adtName: String, arg: vpr.Exp)(pos: vpr.Position, info: vpr.Info, errT: vpr.ErrorTrafo): vpr.Exp = {
+ vpr.DomainFuncApp(
+ funcname = Names.tagAdtFunction(adtName),
+ Seq(arg),
+ Map.empty,
+ )(pos, info, vpr.Int, adtName, errT)
+ }
+
+ /** adtName_clauseName_tag() */
+ private def clauseTag(clauseName: String, adtName: String)(pos: vpr.Position, info: vpr.Info, errT: vpr.ErrorTrafo): vpr.Exp = {
+ vpr.DomainFuncApp(
+ funcname = Names.adtClauseTagFunction(adtName, clauseName),
+ Seq.empty,
+ Map.empty
+ )(pos, info, vpr.Int, adtName, errT)
+ }
+
+ /** adtName_default() */
+ def defaultVal(adtName: String)(pos: vpr.Position, info: vpr.Info, errT: vpr.ErrorTrafo): vpr.Exp = {
+ vpr.DomainFuncApp(
+ funcname = Names.dfltAdtValue(adtName),
+ Seq.empty,
+ Map.empty
+ )(pos, info, adtType(adtName), adtName, errT)
+ }
+
+ // auxiliary functions
+
+ private def underlyingAdtType(t: in.Type)(ctx: Context): in.AdtT = {
+ underlyingType(t)(ctx) match {
+ case t: in.AdtT => t
+ case t: in.AdtClauseT => t.adtT
+ case t => violation(s"expected adt type, but got $t")
+ }
+ }
}
diff --git a/src/main/scala/viper/gobra/translator/util/ViperUtil.scala b/src/main/scala/viper/gobra/translator/util/ViperUtil.scala
index 447f891e3..169911348 100644
--- a/src/main/scala/viper/gobra/translator/util/ViperUtil.scala
+++ b/src/main/scala/viper/gobra/translator/util/ViperUtil.scala
@@ -30,11 +30,20 @@ object ViperUtil {
it.headOption match {
case Some(hd) =>
val tl = it.tail
- tl.foldLeft[Exp](hd){ case (accum, elem) => And(accum, elem)(pos, info, errT) }
+ tl.foldLeft[Exp](hd) { case (accum, elem) => And(accum, elem)(pos, info, errT) }
case None => TrueLit()(pos, info, errT)
}
}
+ def bigOr(it: Iterable[Exp])(pos: Position, info: Info, errT: ErrorTrafo): Exp = {
+ it.headOption match {
+ case Some(hd) =>
+ val tl = it.tail
+ tl.foldLeft[Exp](hd) { case (accum, elem) => Or(accum, elem)(pos, info, errT) }
+ case None => FalseLit()(pos, info, errT)
+ }
+ }
+
def seqn(ss: Vector[Stmt])(pos: Position, info: Info, errT: ErrorTrafo): Seqn = Seqn(ss, Vector.empty)(pos, info, errT)
def nop(pos: Position, info: Info, errT: ErrorTrafo): Seqn = Seqn(Vector.empty, Vector.empty)(pos, info, errT)
From dbfa14bc43efe0c8a10bf1aa1b1ef6b30cb7906b Mon Sep 17 00:00:00 2001
From: "Felix A. Wolf"
Date: Sun, 13 Nov 2022 18:20:38 +0100
Subject: [PATCH 046/296] safety commit
---
.../encodings/adts/AdtEncoding.scala | 280 +++++++++---------
1 file changed, 140 insertions(+), 140 deletions(-)
diff --git a/src/main/scala/viper/gobra/translator/encodings/adts/AdtEncoding.scala b/src/main/scala/viper/gobra/translator/encodings/adts/AdtEncoding.scala
index 71ca07a13..910259799 100644
--- a/src/main/scala/viper/gobra/translator/encodings/adts/AdtEncoding.scala
+++ b/src/main/scala/viper/gobra/translator/encodings/adts/AdtEncoding.scala
@@ -8,8 +8,7 @@ package viper.gobra.translator.encodings.adts
import org.bitbucket.inkytonik.kiama.==>
import viper.gobra.ast.{internal => in}
-import viper.gobra.reporting.BackTranslator.{ErrorTransformer, RichErrorMessage}
-import viper.gobra.reporting.{MatchError, Source}
+import viper.gobra.reporting.MatchError
import viper.gobra.theory.Addressability.{Exclusive, Shared}
import viper.gobra.translator.Names
import viper.gobra.translator.context.Context
@@ -23,7 +22,6 @@ class AdtEncoding extends LeafTypeEncoding {
import viper.gobra.translator.util.TypePatterns._
import viper.gobra.translator.util.ViperWriter.CodeLevel._
import viper.gobra.translator.util.ViperWriter.{MemberLevel => ml}
- import viper.silver.verifier.{errors => err}
import viper.gobra.translator.util.{ViperUtil => vu}
override def typ(ctx: Context): in.Type ==> vpr.Type = {
@@ -264,196 +262,198 @@ class AdtEncoding extends LeafTypeEncoding {
value <- ctx.expression(ad.base)
} yield withSrc(destructor(ad.field.name, adtType.name, value, ctx.typ(ad.field.typ)), ad)
- case p: in.PatternMatchExp => translatePatternMatchExp(ctx)(p)
- // case c@in.Contains(_, _ :: ctx.Adt(_)) => translateContains(c)(ctx)
+ case p: in.PatternMatchExp => translatePatternMatchExp(p)(ctx)
}
}
override def statement(ctx: Context): in.Stmt ==> CodeWriter[vpr.Stmt] = {
default(super.statement(ctx)) {
- case p: in.PatternMatchStmt => translatePatternMatch(ctx)(p)
+ case p: in.PatternMatchStmt => translatePatternMatch(p)(ctx)
}
}
// pattern matching
- def declareIn(ctx: Context)(e: in.Expr, p: in.MatchPattern, z: vpr.Exp): CodeWriter[vpr.Exp] = {
- val (pos, info, errT) = p.vprMeta
+ /**
+ * [e match { case p1: s1; ... }] ->
+ * var b: Bool = false
+ *
+ * if Check(p1,e && !b) {
+ * b := true
+ * Assign(p1,e)
+ * [s1]
+ * }
+ *
+ * ...
+ *
+ * // if strict is true
+ * assert b
+ *
+ */
+ def translatePatternMatch(s: in.PatternMatchStmt)(ctx: Context): CodeWriter[vpr.Stmt] = {
+ val (sPos, sInfo, sErrT) = s.vprMeta
- p match {
- case in.MatchValue(_) | in.MatchWildcard() => unit(z)
- case in.MatchBindVar(name, typ) =>
- for {
- eV <- ctx.expression(e)
- } yield vpr.Let(
- vpr.LocalVarDecl(name, ctx.typ(typ))(pos, info, errT),
- eV,
- z
- )(pos, info, errT)
- case in.MatchAdt(clause, expr) =>
- val inDeconstructors = clause.fields.map(f => in.AdtDestructor(e, f)(e.info))
- val zipWithPattern = inDeconstructors.zip(expr)
- zipWithPattern.foldRight(unit(z))((des, acc) => for {
- v <- acc
- d <- declareIn(ctx)(des._1, des._2, v)
- } yield d)
+ // var b: Bool
+ val checkExVarDecl = vpr.LocalVarDecl(ctx.freshNames.next(), vpr.Bool)(sPos, sInfo, sErrT)
+ val checkExVar = checkExVarDecl.localVar
+
+ // b := false
+ val initialExVar = unit(vpr.LocalVarAssign(checkExVar, vpr.FalseLit()(sPos, sInfo, sErrT))(sPos, sInfo, sErrT))
+
+ // b := true
+ def setExVar(p: vpr.Position, i: vpr.Info, e: vpr.ErrorTrafo): Writer[vpr.LocalVarAssign] =
+ unit(vpr.LocalVarAssign(checkExVar, vpr.TrueLit()(p, i, e))(p, i, e))
+
+ def translateCase(c: in.PatternMatchCaseStmt): CodeWriter[vpr.Stmt] = {
+ val (cPos, cInfo, cErrT) = c.vprMeta
+ for {
+ check <- translateMatchPatternCheck(s.exp, c.mExp)(ctx)
+ setExVarV <- setExVar(cPos, cInfo, cErrT)
+ ass <- translateMatchPatternDeclarations(s.exp, c.mExp)(ctx)
+ body <- seqn(ctx.statement(c.body))
+ } yield vpr.If(
+ vpr.And(check, vpr.Not(checkExVar)(cPos, cInfo, cErrT))(cPos, cInfo, cErrT), // Check(pi, e) && !b
+ vpr.Seqn(Seq(setExVarV, ass, body), Seq.empty)(cPos, cInfo, cErrT), // b := true; Assign(pi, e); [si]
+ vpr.Seqn(Seq(), Seq())(cPos, cInfo, cErrT) // empty else
+ )(cPos, cInfo, cErrT)
}
+
+ for {
+ init <- initialExVar
+ cs <- sequence(s.cases map translateCase)
+ _ <- if (s.strict) {
+ assert(vpr.EqCmp(checkExVar, vpr.TrueLit()(sPos, sInfo, sErrT))(sPos, sInfo, sErrT), (info, _) => MatchError(info))
+ } else unit(())
+ } yield vpr.Seqn(init +: cs, Seq(checkExVarDecl))(sPos, sInfo, sErrT)
}
- def translatePatternMatchExp(ctx: Context)(e: in.PatternMatchExp): CodeWriter[vpr.Exp] = {
+ /**
+ * [e match { case1 p1: e1; ...; caseN pN: eN }] ->
+ * asserting Check(p1, e) || ... || Check(pN, e) in Match(case1 p1: e1; ...; caseN pN: eN; default: dflt(T), e)
+ * [e match { case1 p1: e1; ...; caseN pN: eN; default: e_ }] ->
+ * Match(case1 p1: e1; ...; caseN pN: eN; default: e_, e)
+ *
+ * Match(default: e_, e) -> e_
+ * Match(case1 p1: e1; ...; caseN pN: eN; default: e_, e) ->
+ * Check(p1, e) ? AssignIn(p1, e, [e1]) : Match(case p2: e2; ...; caseN pN: eN; default: e_, e)
+ *
+ */
+ def translatePatternMatchExp(e: in.PatternMatchExp)(ctx: Context): CodeWriter[vpr.Exp] = {
def translateCases(cases: Vector[in.PatternMatchCaseExp], dflt: in.Expr): CodeWriter[vpr.Exp] = {
-
val (ePos, eInfo, eErrT) = if (cases.isEmpty) dflt.vprMeta else cases.head.vprMeta
-
- if (cases.isEmpty) {
- ctx.expression(dflt)
- } else {
- val c = cases.head
- for {
- check <- translateMatchPatternCheck(ctx)(e.exp, c.mExp)
- body <- ctx.expression(c.exp)
- decl <- declareIn(ctx)(e.exp, c.mExp, body)
- el <- translateCases(cases.tail, dflt)
- } yield vpr.CondExp(check, decl, el)(ePos, eInfo, eErrT)
+ cases match {
+ case c +: cs =>
+ for {
+ check <- translateMatchPatternCheck(e.exp, c.mExp)(ctx)
+ body <- ctx.expression(c.exp)
+ decl <- declareIn(e.exp, c.mExp, body)(ctx)
+ el <- translateCases(cs, dflt)
+ } yield vpr.CondExp(check, decl, el)(ePos, eInfo, eErrT)
+ case _ => ctx.expression(dflt)
}
}
if (e.default.isDefined) {
translateCases(e.cases, e.default.get)
} else {
-
val (pos, info, errT) = e.vprMeta
- val allChecks = e.cases
- .map(c => translateMatchPatternCheck(ctx)(e.exp, c.mExp))
- .foldLeft(unit(vpr.FalseLit()() : vpr.Exp))((acc, next) =>
- for {
- a <- acc
- n <- next
- } yield vpr.Or(a,n)(pos, info, errT))
-
+ val checkExpressionMatchesOnePattern =
+ sequence(e.cases.map(c => translateMatchPatternCheck(e.exp, c.mExp)(ctx))).map(vu.bigOr(_)(pos, info, errT))
for {
- dummy <- ctx.expression(in.DfltVal(e.typ)(e.info))
- cond <- translateCases(e.cases, in.DfltVal(e.typ)(e.info))
- checks <- allChecks
- (checkFunc, errCheck) = ctx.condition.assert(checks, (info, _) => MatchError(info))
- _ <- errorT(errCheck)
- } yield vpr.CondExp(checkFunc, cond, dummy)(pos, info, errT)
+ matching <- translateCases(e.cases, in.DfltVal(e.typ)(e.info))
+ checks <- checkExpressionMatchesOnePattern
+ checkedMatching <- assert(checks, matching, (info, _) => MatchError(info))(ctx)
+ } yield checkedMatching
}
-
-
}
- def translateMatchPatternCheck(ctx: Context)(expr: in.Expr, pattern: in.MatchPattern): CodeWriter[vpr.Exp] = {
- def goE(x: in.Expr): CodeWriter[vpr.Exp] = ctx.expression(x)
+ /**
+ * Encodes the check whether `expr` matches pattern
+ *
+ * Check(_, e) -> true
+ * Check(x, e) -> true
+ * Check(`v`, e) -> [v] == [e]
+ * Check(C{f1: p1, ...}, e) -> [e.isC] && Check(p1, e.f1) && ...
+ *
+ */
+ def translateMatchPatternCheck(expr: in.Expr, pattern: in.MatchPattern)(ctx: Context): CodeWriter[vpr.Exp] = {
val (pos, info, errT) = pattern.vprMeta
- def matchSimpleExp(exp: in.Expr): Writer[vpr.Exp] = for {
- e1 <- goE(exp)
- e2 <- goE(expr)
- } yield vpr.EqCmp(e1, e2)(pos, info, errT)
+ pattern match {
+ case _: in.MatchBindVar | _: in.MatchWildcard =>
+ unit(vpr.TrueLit()(pos,info,errT))
- val (mPos, mInfo, mErr) = pattern.vprMeta
+ case in.MatchValue(exp) =>
+ for {
+ e1 <- ctx.expression(exp)
+ e2 <- ctx.expression(expr)
+ } yield vpr.EqCmp(e1, e2)(pos, info, errT)
- pattern match {
- case in.MatchValue(exp) => matchSimpleExp(exp)
- case in.MatchBindVar(_, _) | in.MatchWildcard() => unit(vpr.TrueLit()(pos,info,errT))
- case in.MatchAdt(clause, exp) =>
- val tagFunction = Names.tagAdtFunction(clause.adtT.name)
- val tag = vpr.IntLit(???)(mPos, mInfo, mErr)
- val inDeconstructors = clause.fields.map(f => in.AdtDestructor(expr, f)(pattern.info))
+ case in.MatchAdt(clause, patternArgs) =>
+ val destructorOverExp = clause.fields.map(f => in.AdtDestructor(expr, f)(expr.info))
for {
- e1 <- goE(expr)
- tF = vpr.DomainFuncApp(tagFunction, Vector(e1), Map.empty)(mPos, mInfo, vpr.Int, clause.adtT.name, mErr)
- checkTag = vpr.EqCmp(tF, tag)(mPos)
- rec <- sequence(inDeconstructors.zip(exp) map {case (e, p) => translateMatchPatternCheck(ctx)(e,p)})
- } yield rec.foldLeft(checkTag:vpr.Exp)({case (acc, next) => vpr.And(acc, next)(mPos, mInfo, mErr)})
+ eV <- ctx.expression(expr)
+ discr = discriminator(clause.name, clause.adtT.name, eV)(pos, info, errT)
+ rec <- sequence((destructorOverExp zip patternArgs) map { case (e, p) => translateMatchPatternCheck(e,p)(ctx)} )
+ } yield vu.bigAnd(discr +: rec)(pos, info, errT)
}
}
- def translateMatchPatternDeclarations(ctx: Context)(expr: in.Expr, pattern: in.MatchPattern): Option[CodeWriter[vpr.Seqn]] = {
+ /**
+ * Assign(_, e) -> nop
+ * Assign(`v`, e) -> nop
+ * Assign(x, e) -> var x = [e]
+ * Assign(C{f1: p1, ...}, e) -> Assign(p1, e.f1); Assign(p2, e.f2); ...
+ *
+ */
+ def translateMatchPatternDeclarations(expr: in.Expr, pattern: in.MatchPattern)(ctx: Context): CodeWriter[vpr.Seqn] = {
val (mPos, mInfo, mErrT) = pattern.vprMeta
- def goE(x: in.Expr): CodeWriter[vpr.Exp] = ctx.expression(x)
+
pattern match {
+ case _ : in.MatchValue | _: in.MatchWildcard => unit(vu.nop(mPos, mInfo, mErrT))
+
case in.MatchBindVar(name, typ) =>
val t = ctx.typ(typ)
-
- val writer = for {
- e <- goE(expr)
+ for {
+ e <- ctx.expression(expr)
v = vpr.LocalVarDecl(name, t)(mPos, mInfo, mErrT)
a = vpr.LocalVarAssign(vpr.LocalVar(name, t)(mPos, mInfo, mErrT), e)(mPos, mInfo, mErrT)
} yield vpr.Seqn(Seq(a), Seq(v))(mPos, mInfo, mErrT)
- Some(writer)
case in.MatchAdt(clause, exprs) =>
- val inDeconstructors = clause.fields.map(f => in.AdtDestructor(expr, f)(pattern.info))
- val recAss: Vector[CodeWriter[vpr.Seqn]] =
- inDeconstructors.zip(exprs) map {case (e, p) => translateMatchPatternDeclarations(ctx)(e,p)} collect {case Some(s) => s}
- val assignments: Vector[vpr.Seqn] = recAss map {a => a.res}
- val reduced = assignments.foldLeft(vpr.Seqn(Seq(), Seq())(mPos, mInfo, mErrT))(
- {case (l, r) => vpr.Seqn(l.ss ++ r .ss, l.scopedDecls ++ r.scopedDecls)(mPos, mInfo, mErrT)}
- )
- Some(unit(reduced))
-
- case _ : in.MatchValue | _: in.MatchWildcard => None
+ val destructorOverExp = clause.fields.map(f => in.AdtDestructor(expr, f)(pattern.info))
+ val recAss = (destructorOverExp zip exprs) map { case (e, p) => translateMatchPatternDeclarations(e,p)(ctx) }
+ sequence(recAss).map(vpr.Seqn(_, Seq.empty)(mPos, mInfo, mErrT))
}
}
- def translatePatternMatch(ctx: Context)(s: in.PatternMatchStmt): CodeWriter[vpr.Stmt] = {
- val expr = s.exp
- val cases = s.cases
-
- val (sPos, sInfo, sErrT) = s.vprMeta
-
- val checkExVarDecl = vpr.LocalVarDecl(ctx.freshNames.next(), vpr.Bool)(sPos, sInfo, sErrT)
- val checkExVar = checkExVarDecl.localVar
- val initialExVar = unit(vpr.LocalVarAssign(checkExVar, vpr.FalseLit()(sPos, sInfo, sErrT))(sPos, sInfo, sErrT))
- def exErr(ass: vpr.Stmt): ErrorTransformer = {
- case e@err.AssertFailed(Source(info), _, _) if e causedBy ass => MatchError(info)
- }
-
- val assertWithError = for {
- a <- unit(vpr.Assert(vpr.EqCmp(checkExVar, vpr.TrueLit()(sPos, sInfo, sErrT))(sPos, sInfo, sErrT))(sPos, sInfo, sErrT))
- _ <- errorT(exErr(a))
- } yield a
-
- def setExVar(p: vpr.Position, i: vpr.Info, e: vpr.ErrorTrafo) =
- unit(vpr.LocalVarAssign(checkExVar, vpr.TrueLit()(p,i,e))(p,i,e))
-
- def translateCase(c: in.PatternMatchCaseStmt): CodeWriter[vpr.Stmt] = {
- val (cPos, cInfo, cErrT) = c.vprMeta
-
- val assignments = translateMatchPatternDeclarations(ctx)(expr, c.mExp)
+ /**
+ * AssignIn(_, e, z) -> z
+ * AssignIn(`v`, e, z) -> z
+ * AssignIn(x, e, z) -> let x == ([e]) in z
+ * AssignIn(C{f1: p1, ...}, e, z) -> AssignIn(p1, e.f1, AssignIn(p2, e.f2, ...z))
+ *
+ */
+ def declareIn(e: in.Expr, p: in.MatchPattern, z: vpr.Exp)(ctx: Context): CodeWriter[vpr.Exp] = {
+ val (pos, info, errT) = p.vprMeta
- val (ass: Seq[vpr.Stmt], decls: Seq[vpr.Declaration]) =
- if (assignments.isDefined) {
- val w = assignments.get.res
- (w.ss, w.scopedDecls)
- } else {
- (Seq(), Seq())
- }
- for {
- check <- translateMatchPatternCheck(ctx)(expr, c.mExp)
- exVar <- setExVar(cPos, cInfo, cErrT)
- body <- seqn(ctx.statement(c.body))
- } yield vpr.If(vpr.And(check, vpr.Not(checkExVar)(cPos, cInfo, cErrT))(cPos, cInfo, cErrT),
- vpr.Seqn(exVar +: (ass :+ body), decls)(cPos, cInfo, cErrT), vpr.Seqn(Seq(), Seq())(cPos, cInfo, cErrT))(cPos, cInfo, cErrT)
- }
+ p match {
+ case _: in.MatchValue | _: in.MatchWildcard => unit(z)
+ case in.MatchBindVar(name, typ) =>
+ for {
+ eV <- ctx.expression(e)
+ } yield vpr.Let(vpr.LocalVarDecl(name, ctx.typ(typ))(pos, info, errT), eV, z)(pos, info, errT)
- if (s.strict) {
- for {
- init <- initialExVar
- cs <- sequence(cases map translateCase)
- a <- assertWithError
- } yield vpr.Seqn(init +: cs :+ a, Seq(checkExVarDecl))(sPos, sInfo, sErrT)
- } else {
- for {
- init <- initialExVar
- cs <- sequence(cases map translateCase)
- } yield vpr.Seqn(init +: cs, Seq(checkExVarDecl))(sPos, sInfo, sErrT)
+ case in.MatchAdt(clause, expr) =>
+ val destructorOverExp = clause.fields.map(f => in.AdtDestructor(e, f)(e.info))
+ (destructorOverExp zip expr).foldRight(unit(z))((des, acc) => for {
+ v <- acc
+ d <- declareIn(des._1, des._2, v)(ctx)
+ } yield d)
}
}
From 0d001df14a2b3d6a0c0772ad796adad2acb8edc4 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jo=C3=A3o=20Pereira?=
Date: Sun, 13 Nov 2022 21:48:51 +0100
Subject: [PATCH 047/296] Add bug witness
---
src/test/resources/regressions/issues/000573.go | 12 ++++++++++++
1 file changed, 12 insertions(+)
create mode 100644 src/test/resources/regressions/issues/000573.go
diff --git a/src/test/resources/regressions/issues/000573.go b/src/test/resources/regressions/issues/000573.go
new file mode 100644
index 000000000..b86e0ec12
--- /dev/null
+++ b/src/test/resources/regressions/issues/000573.go
@@ -0,0 +1,12 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/publicdomain/zero/1.0/
+
+package main
+
+type X int
+
+func (s X) f() {
+ x := func /*@ g @*/ () {
+ return
+ }
+}
From d33ce23acd9659e0f43608d2a128f00ac9e1c7ba Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jo=C3=A3o=20Pereira?=
Date: Sun, 13 Nov 2022 21:49:43 +0100
Subject: [PATCH 048/296] Add fix
---
src/main/scala/viper/gobra/ast/frontend/Ast.scala | 8 ++++++--
src/main/scala/viper/gobra/frontend/Desugar.scala | 10 +++++-----
.../viper/gobra/frontend/ParseTreeTranslator.scala | 2 --
.../viper/gobra/frontend/info/ExternalTypeInfo.scala | 5 ++++-
.../frontend/info/implementation/TypeInfoImpl.scala | 2 ++
.../info/implementation/resolution/Enclosing.scala | 6 ++++++
.../scala/viper/gobra/reporting/StatsCollector.scala | 2 +-
7 files changed, 24 insertions(+), 11 deletions(-)
diff --git a/src/main/scala/viper/gobra/ast/frontend/Ast.scala b/src/main/scala/viper/gobra/ast/frontend/Ast.scala
index bfa306d11..16e284c23 100644
--- a/src/main/scala/viper/gobra/ast/frontend/Ast.scala
+++ b/src/main/scala/viper/gobra/ast/frontend/Ast.scala
@@ -162,13 +162,17 @@ sealed trait PFunctionOrClosureDecl extends PScope {
def body: Option[(PBodyParameterInfo, PBlock)]
}
+sealed trait PFunctionOrMethodDecl extends PNode with PScope {
+ def id: PIdnDef
+}
+
case class PFunctionDecl(
id: PIdnDef,
args: Vector[PParameter],
result: PResult,
spec: PFunctionSpec,
body: Option[(PBodyParameterInfo, PBlock)]
- ) extends PFunctionOrClosureDecl with PActualMember with PCodeRootWithResult with PWithBody with PGhostifiableMember
+ ) extends PFunctionOrClosureDecl with PActualMember with PCodeRootWithResult with PWithBody with PGhostifiableMember with PFunctionOrMethodDecl
case class PMethodDecl(
id: PIdnDef,
@@ -177,7 +181,7 @@ case class PMethodDecl(
result: PResult,
spec: PFunctionSpec,
body: Option[(PBodyParameterInfo, PBlock)]
- ) extends PActualMember with PDependentDef with PScope with PCodeRootWithResult with PWithBody with PGhostifiableMember
+ ) extends PActualMember with PDependentDef with PScope with PCodeRootWithResult with PWithBody with PGhostifiableMember with PFunctionOrMethodDecl
sealed trait PTypeDecl extends PActualMember with PActualStatement with PGhostifiableStatement with PGhostifiableMember with PDeclaration {
diff --git a/src/main/scala/viper/gobra/frontend/Desugar.scala b/src/main/scala/viper/gobra/frontend/Desugar.scala
index 20f342eb2..019164565 100644
--- a/src/main/scala/viper/gobra/frontend/Desugar.scala
+++ b/src/main/scala/viper/gobra/frontend/Desugar.scala
@@ -246,7 +246,7 @@ object Desugar {
def functionLitProxyD(lit: PFunctionLit, context: TypeInfo): in.FunctionLitProxy = {
// If the literal is nameless, generate a unique name
- val name = if (lit.id.isEmpty) nm.anonFuncLit(context.enclosingFunction(lit).get, context) else idName(lit.id.get, context)
+ val name = if (lit.id.isEmpty) nm.anonFuncLit(context.enclosingFunctionOrMethod(lit).get, context) else idName(lit.id.get, context)
val info = if (lit.id.isEmpty) meta(lit, context) else meta(lit.id.get, context)
in.FunctionLitProxy(name)(info)
}
@@ -3653,7 +3653,7 @@ object Desugar {
case _: st.GlobalVariable => nm.global(id.name, v.context)
case _ => nm.variable(id.name, context.scope(id), v.context)
}
- case c: st.Closure => nm.funcLit(id.name, context.enclosingFunction(id).get, c.context)
+ case c: st.Closure => nm.funcLit(id.name, context.enclosingFunctionOrMethod(id).get, c.context)
case sc: st.SingleConstant => nm.global(id.name, sc.context)
case st.Embbed(_, _, _) | st.Field(_, _, _) => violation(s"expected that fields and embedded field are desugared by using embeddedDeclD resp. fieldDeclD but idName was called with $id")
case n: st.NamedType => nm.typ(id.name, n.context)
@@ -4582,7 +4582,7 @@ object Desugar {
s"${n}_$postfix${scopeMap(s)}" // deterministic
}
- private def nameWithEnclosingFunction(postfix: String)(n: String, enclosing: PFunctionDecl, context: ExternalTypeInfo): String = {
+ private def nameWithEnclosingFunction(postfix: String)(n: String, enclosing: PFunctionOrMethodDecl, context: ExternalTypeInfo): String = {
maybeRegister(enclosing, context)
s"${n}_${enclosing.id.name}_${context.pkgInfo.viperId}_$postfix${scopeMap(enclosing)}" // deterministic
}
@@ -4608,8 +4608,8 @@ object Desugar {
def mainFuncProofObligation(context: ExternalTypeInfo): String =
topLevelName(MAIN_FUNC_OBLIGATIONS_PREFIX)(Constants.MAIN_FUNC_NAME, context)
def variable(n: String, s: PScope, context: ExternalTypeInfo): String = name(VARIABLE_PREFIX)(n, s, context)
- def funcLit(n: String, enclosing: PFunctionDecl, context: ExternalTypeInfo): String = nameWithEnclosingFunction(FUNCTION_PREFIX)(n, enclosing, context)
- def anonFuncLit(enclosing: PFunctionDecl, context: ExternalTypeInfo): String = nameWithEnclosingFunction(FUNCTION_PREFIX)("func", enclosing, context) ++ s"_${fresh(enclosing, context)}"
+ def funcLit(n: String, enclosing: PFunctionOrMethodDecl, context: ExternalTypeInfo): String = nameWithEnclosingFunction(FUNCTION_PREFIX)(n, enclosing, context)
+ def anonFuncLit(enclosing: PFunctionOrMethodDecl, context: ExternalTypeInfo): String = nameWithEnclosingFunction(FUNCTION_PREFIX)("func", enclosing, context) ++ s"_${fresh(enclosing, context)}"
def global (n: String, context: ExternalTypeInfo): String = topLevelName(GLOBAL_PREFIX)(n, context)
def typ (n: String, context: ExternalTypeInfo): String = topLevelName(TYPE_PREFIX)(n, context)
def field (n: String, @unused s: StructT): String = s"$n$FIELD_PREFIX" // Field names must preserve their equality from the Go level
diff --git a/src/main/scala/viper/gobra/frontend/ParseTreeTranslator.scala b/src/main/scala/viper/gobra/frontend/ParseTreeTranslator.scala
index 5745091ec..8280614eb 100644
--- a/src/main/scala/viper/gobra/frontend/ParseTreeTranslator.scala
+++ b/src/main/scala/viper/gobra/frontend/ParseTreeTranslator.scala
@@ -135,8 +135,6 @@ class ParseTreeTranslator(pom: PositionManager, source: Source, specOnly : Boole
// They generate a unique PIdnNode whose name starts with "_" to not overlap any other identifiers
private val goIdnDef = PIdnNodeEx(PIdnDef, term => Some(uniqueWildcard(PIdnDef, term).at(term)))
private val goIdnDefList = PIdnNodeListEx(goIdnDef)
- private val goIdnUnk = PIdnNodeEx(PIdnUnk, term => Some(uniqueWildcard(PIdnUnk, term).at(term)))
- private val goIdnUnkList = PIdnNodeListEx(goIdnUnk)
def uniqueWildcard[N](constructor : String => N, term : TerminalNode) : N = constructor("_"+term.getSymbol.getTokenIndex)
//endregion
diff --git a/src/main/scala/viper/gobra/frontend/info/ExternalTypeInfo.scala b/src/main/scala/viper/gobra/frontend/info/ExternalTypeInfo.scala
index 3150dfaa1..57dc3c174 100644
--- a/src/main/scala/viper/gobra/frontend/info/ExternalTypeInfo.scala
+++ b/src/main/scala/viper/gobra/frontend/info/ExternalTypeInfo.scala
@@ -6,7 +6,7 @@
package viper.gobra.frontend.info
-import viper.gobra.ast.frontend.{PCodeRoot, PEmbeddedDecl, PExpression, PFieldDecl, PGeneralForStmt, PFunctionDecl, PIdnNode, PIdnUse, PKeyedElement, PLabelUse, PMPredicateDecl, PMPredicateSig, PMember, PMethodDecl, PMethodSig, PMisc, PNode, PParameter, PPkgDef, PScope, PType}
+import viper.gobra.ast.frontend.{PCodeRoot, PEmbeddedDecl, PExpression, PFieldDecl, PFunctionDecl, PFunctionOrMethodDecl, PGeneralForStmt, PIdnNode, PIdnUse, PKeyedElement, PLabelUse, PMPredicateDecl, PMPredicateSig, PMember, PMethodDecl, PMethodSig, PMisc, PNode, PParameter, PPkgDef, PScope, PType}
import viper.gobra.frontend.PackageInfo
import viper.gobra.frontend.info.base.BuiltInMemberTag.BuiltInMemberTag
import viper.gobra.frontend.info.base.Type.{AbstractType, InterfaceT, StructT, Type}
@@ -104,6 +104,9 @@ trait ExternalTypeInfo {
/** if it exists, it returns the function that contains n */
def enclosingFunction(n: PNode): Option[PFunctionDecl]
+ /** if it exists, it returns the function or method that contains n */
+ def enclosingFunctionOrMethod(n: PNode): Option[PFunctionOrMethodDecl]
+
/** if it exists, it returns the for loop node that contains 'n' with label 'label' */
def enclosingLabeledLoopNode(label: PLabelUse, n: PNode) : Option[PGeneralForStmt]
diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/TypeInfoImpl.scala b/src/main/scala/viper/gobra/frontend/info/implementation/TypeInfoImpl.scala
index d0ee22ccb..cc1a2863f 100644
--- a/src/main/scala/viper/gobra/frontend/info/implementation/TypeInfoImpl.scala
+++ b/src/main/scala/viper/gobra/frontend/info/implementation/TypeInfoImpl.scala
@@ -87,6 +87,8 @@ class TypeInfoImpl(final val tree: Info.GoTree, final val context: Info.Context,
override def enclosingFunction(n: PNode): Option[PFunctionDecl] = tryEnclosingFunction(n)
+ override def enclosingFunctionOrMethod(n: PNode): Option[PFunctionOrMethodDecl] = tryEnclosingFunctionOrMethod(n)
+
override def enclosingLabeledLoopNode(label: PLabelUse, n: PNode) : Option[PGeneralForStmt] = enclosingLabeledLoop(label, n).toOption
override def enclosingLoopNode(n: PNode) : Option[PGeneralForStmt] = enclosingLoopUntilOutline(n).toOption
diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/resolution/Enclosing.scala b/src/main/scala/viper/gobra/frontend/info/implementation/resolution/Enclosing.scala
index a6ab5bb46..46a2ea28a 100644
--- a/src/main/scala/viper/gobra/frontend/info/implementation/resolution/Enclosing.scala
+++ b/src/main/scala/viper/gobra/frontend/info/implementation/resolution/Enclosing.scala
@@ -72,6 +72,12 @@ trait Enclosing { this: TypeInfoImpl =>
lazy val tryEnclosingFunction: PNode => Option[PFunctionDecl] =
down[Option[PFunctionDecl]](None) { case m: PFunctionDecl => Some(m) }
+ lazy val tryEnclosingFunctionOrMethod: PNode => Option[PFunctionOrMethodDecl] =
+ down[Option[PFunctionOrMethodDecl]](None) {
+ case f: PFunctionDecl => Some(f)
+ case m: PMethodDecl => Some(m)
+ }
+
lazy val tryEnclosingClosureImplementationProof: PNode => Option[PClosureImplProof] =
down[Option[PClosureImplProof]](None) { case m: PClosureImplProof => Some(m) }
diff --git a/src/main/scala/viper/gobra/reporting/StatsCollector.scala b/src/main/scala/viper/gobra/reporting/StatsCollector.scala
index 887acae3b..c35fa4493 100644
--- a/src/main/scala/viper/gobra/reporting/StatsCollector.scala
+++ b/src/main/scala/viper/gobra/reporting/StatsCollector.scala
@@ -374,7 +374,7 @@ case class StatsCollector(reporter: GobraReporter) extends GobraReporter {
isImported = isImported,
isBuiltIn = isBuiltIn)
// Consider the enclosing function, for closure declarations
- case p: PClosureDecl => getMemberInformation(nodeTypeInfo.enclosingFunction(p).get, typeInfo, viperMember)
+ case p: PClosureDecl => getMemberInformation(nodeTypeInfo.enclosingFunctionOrMethod(p).get, typeInfo, viperMember)
// Fallback to the node's code root if we can't match the node
case p: PNode => getMemberInformation(nodeTypeInfo.codeRoot(p), typeInfo, viperMember)
}
From a2f10daaa650ff195fbc2824d04fb47acdd2da28 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jo=C3=A3o=20Pereira?=
Date: Sun, 13 Nov 2022 22:06:35 +0100
Subject: [PATCH 049/296] Linard's suggestion
---
.../frontend/info/implementation/resolution/Enclosing.scala | 5 +----
1 file changed, 1 insertion(+), 4 deletions(-)
diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/resolution/Enclosing.scala b/src/main/scala/viper/gobra/frontend/info/implementation/resolution/Enclosing.scala
index 46a2ea28a..c961885c2 100644
--- a/src/main/scala/viper/gobra/frontend/info/implementation/resolution/Enclosing.scala
+++ b/src/main/scala/viper/gobra/frontend/info/implementation/resolution/Enclosing.scala
@@ -73,10 +73,7 @@ trait Enclosing { this: TypeInfoImpl =>
down[Option[PFunctionDecl]](None) { case m: PFunctionDecl => Some(m) }
lazy val tryEnclosingFunctionOrMethod: PNode => Option[PFunctionOrMethodDecl] =
- down[Option[PFunctionOrMethodDecl]](None) {
- case f: PFunctionDecl => Some(f)
- case m: PMethodDecl => Some(m)
- }
+ down[Option[PFunctionOrMethodDecl]](None) { case f: PFunctionOrMethodDecl => Some(f) }
lazy val tryEnclosingClosureImplementationProof: PNode => Option[PClosureImplProof] =
down[Option[PClosureImplProof]](None) { case m: PClosureImplProof => Some(m) }
From a69b6cf0d0c3202ca489b9acd64ba721d14406f3 Mon Sep 17 00:00:00 2001
From: Dionysios Spiliopoulos <32896454+Dspil@users.noreply.github.com>
Date: Tue, 15 Nov 2022 15:19:31 +0100
Subject: [PATCH 050/296] reduce the exhale permissions from maps in range
(#575)
---
src/main/scala/viper/gobra/frontend/Desugar.scala | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/main/scala/viper/gobra/frontend/Desugar.scala b/src/main/scala/viper/gobra/frontend/Desugar.scala
index 019164565..0c0b590f2 100644
--- a/src/main/scala/viper/gobra/frontend/Desugar.scala
+++ b/src/main/scala/viper/gobra/frontend/Desugar.scala
@@ -172,7 +172,7 @@ object Desugar {
private val nm = new NameManager
- private val MapExhalePermDenom = 1000000
+ private val MapExhalePermDenom = 200000000
type Identity = (Meta, TypeInfo)
From 364277d6c114abf12e25e1ebe0bb570baa04c14e Mon Sep 17 00:00:00 2001
From: "Felix A. Wolf"
Date: Tue, 15 Nov 2022 23:22:54 +0100
Subject: [PATCH 051/296] safety commit
---
src/main/antlr4/GobraLexer.g4 | 1 +
src/main/antlr4/GobraParser.g4 | 20 +-
.../java/viper/gobra/frontend/GobraLexer.java | 1402 ++---
.../viper/gobra/frontend/GobraParser.java | 4675 +++++++++--------
.../frontend/GobraParserBaseVisitor.java | 70 +
.../gobra/frontend/GobraParserVisitor.java | 64 +
.../scala/viper/gobra/ast/frontend/Ast.scala | 1 -
.../gobra/frontend/ParseTreeTranslator.scala | 68 +-
.../encodings/adts/AdtEncoding.scala | 12 +-
9 files changed, 3531 insertions(+), 2782 deletions(-)
diff --git a/src/main/antlr4/GobraLexer.g4 b/src/main/antlr4/GobraLexer.g4
index 313f215f0..03c45f0cb 100644
--- a/src/main/antlr4/GobraLexer.g4
+++ b/src/main/antlr4/GobraLexer.g4
@@ -67,6 +67,7 @@ GET : 'get'-> mode(NLSEMI);
DOM : 'domain'-> mode(NLSEMI);
AXIOM : 'axiom'-> mode(NLSEMI);
ADT : 'adt' -> mode(NLSEMI);
+MATCH : 'match' -> mode(NLSEMI);
NONE : 'none' -> mode(NLSEMI);
PRED : 'pred';
TYPE_OF : 'typeOf'-> mode(NLSEMI);
diff --git a/src/main/antlr4/GobraParser.g4 b/src/main/antlr4/GobraParser.g4
index ca107ed37..1bc5a6d73 100644
--- a/src/main/antlr4/GobraParser.g4
+++ b/src/main/antlr4/GobraParser.g4
@@ -58,6 +58,7 @@ ghostStatement:
GHOST statement #explicitGhostStatement
| fold_stmt=(FOLD | UNFOLD) predicateAccess #foldStatement
| kind=(ASSUME | ASSERT | INHALE | EXHALE) expression #proofStatement
+ | matchStmt #matchStmt_
;
// Auxiliary statements
@@ -81,7 +82,9 @@ ghostPrimaryExpr: range
| before
| sConversion
| optionNone | optionSome | optionGet
- | permission;
+ | permission
+ | matchExpr
+ ;
permission: WRITEPERM | NOPERM;
@@ -125,6 +128,9 @@ access: ACCESS L_PAREN expression (COMMA expression)? R_PAREN;
range: kind=(SEQ | SET | MSET) L_BRACKET expression DOT_DOT expression R_BRACKET;
+matchExpr: MATCH expression L_CURLY matchExprClause* R_CURLY;
+matchExprClause: matchCase COLON expression;
+
// Added directly to primaryExpr
seqUpdExp: L_BRACKET (seqUpdClause (COMMA seqUpdClause)*) R_BRACKET;
@@ -165,6 +171,18 @@ assertion:
| expression
;
+matchStmt: MATCH expression L_CURLY matchStmtClause* R_CURLY;
+matchStmtClause: matchCase COLON statementList?;
+
+matchCase: CASE matchPattern | DEFAULT;
+matchPattern
+ : QMARK IDENTIFIER #matchPatternBind
+ | literalType L_CURLY (matchPatternList COMMA?)? R_CURLY #matchPatternComposite
+ | expression #matchPatternValue
+ ;
+
+matchPatternList: matchPattern (COMMA matchPattern)*;
+
blockWithBodyParameterInfo: L_CURLY (SHARE identifierList eos)? statementList? R_CURLY;
// Closures
diff --git a/src/main/java/viper/gobra/frontend/GobraLexer.java b/src/main/java/viper/gobra/frontend/GobraLexer.java
index 6d4d8220a..de38da7fc 100644
--- a/src/main/java/viper/gobra/frontend/GobraLexer.java
+++ b/src/main/java/viper/gobra/frontend/GobraLexer.java
@@ -24,25 +24,25 @@ public class GobraLexer extends Lexer {
UNION=30, INTERSECTION=31, SETMINUS=32, IMPLIES=33, WAND=34, APPLY=35,
QMARK=36, L_PRED=37, R_PRED=38, SEQ=39, SET=40, MSET=41, DICT=42, OPT=43,
LEN=44, NEW=45, MAKE=46, CAP=47, SOME=48, GET=49, DOM=50, AXIOM=51, ADT=52,
- NONE=53, PRED=54, TYPE_OF=55, IS_COMPARABLE=56, SHARE=57, ADDR_MOD=58,
- DOT_DOT=59, SHARED=60, EXCLUSIVE=61, PREDICATE=62, WRITEPERM=63, NOPERM=64,
- TRUSTED=65, OUTLINE=66, INIT_POST=67, IMPORT_PRE=68, PROOF=69, GHOST_EQUALS=70,
- GHOST_NOT_EQUALS=71, WITH=72, BREAK=73, DEFAULT=74, FUNC=75, INTERFACE=76,
- SELECT=77, CASE=78, DEFER=79, GO=80, MAP=81, STRUCT=82, CHAN=83, ELSE=84,
- GOTO=85, PACKAGE=86, SWITCH=87, CONST=88, FALLTHROUGH=89, IF=90, RANGE=91,
- TYPE=92, CONTINUE=93, FOR=94, IMPORT=95, RETURN=96, VAR=97, NIL_LIT=98,
- IDENTIFIER=99, L_PAREN=100, R_PAREN=101, L_CURLY=102, R_CURLY=103, L_BRACKET=104,
- R_BRACKET=105, ASSIGN=106, COMMA=107, SEMI=108, COLON=109, DOT=110, PLUS_PLUS=111,
- MINUS_MINUS=112, DECLARE_ASSIGN=113, ELLIPSIS=114, LOGICAL_OR=115, LOGICAL_AND=116,
- EQUALS=117, NOT_EQUALS=118, LESS=119, LESS_OR_EQUALS=120, GREATER=121,
- GREATER_OR_EQUALS=122, OR=123, DIV=124, MOD=125, LSHIFT=126, RSHIFT=127,
- BIT_CLEAR=128, EXCLAMATION=129, PLUS=130, MINUS=131, CARET=132, STAR=133,
- AMPERSAND=134, RECEIVE=135, DECIMAL_LIT=136, BINARY_LIT=137, OCTAL_LIT=138,
- HEX_LIT=139, HEX_FLOAT_LIT=140, IMAGINARY_LIT=141, RUNE_LIT=142, BYTE_VALUE=143,
- OCTAL_BYTE_VALUE=144, HEX_BYTE_VALUE=145, LITTLE_U_VALUE=146, BIG_U_VALUE=147,
- RAW_STRING_LIT=148, INTERPRETED_STRING_LIT=149, WS=150, COMMENT=151, TERMINATOR=152,
- LINE_COMMENT=153, WS_NLSEMI=154, COMMENT_NLSEMI=155, LINE_COMMENT_NLSEMI=156,
- EOS=157, OTHER=158;
+ MATCH=53, NONE=54, PRED=55, TYPE_OF=56, IS_COMPARABLE=57, SHARE=58, ADDR_MOD=59,
+ DOT_DOT=60, SHARED=61, EXCLUSIVE=62, PREDICATE=63, WRITEPERM=64, NOPERM=65,
+ TRUSTED=66, OUTLINE=67, INIT_POST=68, IMPORT_PRE=69, PROOF=70, GHOST_EQUALS=71,
+ GHOST_NOT_EQUALS=72, WITH=73, BREAK=74, DEFAULT=75, FUNC=76, INTERFACE=77,
+ SELECT=78, CASE=79, DEFER=80, GO=81, MAP=82, STRUCT=83, CHAN=84, ELSE=85,
+ GOTO=86, PACKAGE=87, SWITCH=88, CONST=89, FALLTHROUGH=90, IF=91, RANGE=92,
+ TYPE=93, CONTINUE=94, FOR=95, IMPORT=96, RETURN=97, VAR=98, NIL_LIT=99,
+ IDENTIFIER=100, L_PAREN=101, R_PAREN=102, L_CURLY=103, R_CURLY=104, L_BRACKET=105,
+ R_BRACKET=106, ASSIGN=107, COMMA=108, SEMI=109, COLON=110, DOT=111, PLUS_PLUS=112,
+ MINUS_MINUS=113, DECLARE_ASSIGN=114, ELLIPSIS=115, LOGICAL_OR=116, LOGICAL_AND=117,
+ EQUALS=118, NOT_EQUALS=119, LESS=120, LESS_OR_EQUALS=121, GREATER=122,
+ GREATER_OR_EQUALS=123, OR=124, DIV=125, MOD=126, LSHIFT=127, RSHIFT=128,
+ BIT_CLEAR=129, EXCLAMATION=130, PLUS=131, MINUS=132, CARET=133, STAR=134,
+ AMPERSAND=135, RECEIVE=136, DECIMAL_LIT=137, BINARY_LIT=138, OCTAL_LIT=139,
+ HEX_LIT=140, HEX_FLOAT_LIT=141, IMAGINARY_LIT=142, RUNE_LIT=143, BYTE_VALUE=144,
+ OCTAL_BYTE_VALUE=145, HEX_BYTE_VALUE=146, LITTLE_U_VALUE=147, BIG_U_VALUE=148,
+ RAW_STRING_LIT=149, INTERPRETED_STRING_LIT=150, WS=151, COMMENT=152, TERMINATOR=153,
+ LINE_COMMENT=154, WS_NLSEMI=155, COMMENT_NLSEMI=156, LINE_COMMENT_NLSEMI=157,
+ EOS=158, OTHER=159;
public static final int
NLSEMI=1;
public static String[] channelNames = {
@@ -61,7 +61,7 @@ private static String[] makeRuleNames() {
"UNFOLD", "UNFOLDING", "GHOST", "IN", "MULTI", "SUBSET", "UNION", "INTERSECTION",
"SETMINUS", "IMPLIES", "WAND", "APPLY", "QMARK", "L_PRED", "R_PRED",
"SEQ", "SET", "MSET", "DICT", "OPT", "LEN", "NEW", "MAKE", "CAP", "SOME",
- "GET", "DOM", "AXIOM", "ADT", "NONE", "PRED", "TYPE_OF", "IS_COMPARABLE",
+ "GET", "DOM", "AXIOM", "ADT", "MATCH", "NONE", "PRED", "TYPE_OF", "IS_COMPARABLE",
"SHARE", "ADDR_MOD", "DOT_DOT", "SHARED", "EXCLUSIVE", "PREDICATE", "WRITEPERM",
"NOPERM", "TRUSTED", "OUTLINE", "INIT_POST", "IMPORT_PRE", "PROOF", "GHOST_EQUALS",
"GHOST_NOT_EQUALS", "WITH", "BREAK", "DEFAULT", "FUNC", "INTERFACE",
@@ -94,18 +94,18 @@ private static String[] makeLiteralNames() {
"'ghost'", "'in'", "'#'", "'subset'", "'union'", "'intersection'", "'setminus'",
"'==>'", "'--*'", "'apply'", "'?'", "'!<'", "'!>'", "'seq'", "'set'",
"'mset'", "'dict'", "'option'", "'len'", "'new'", "'make'", "'cap'",
- "'some'", "'get'", "'domain'", "'axiom'", "'adt'", "'none'", "'pred'",
- "'typeOf'", "'isComparable'", "'share'", "'@'", "'..'", "'shared'", "'exclusive'",
- "'predicate'", "'writePerm'", "'noPerm'", "'trusted'", "'outline'", "'initEnsures'",
- "'importRequires'", "'proof'", "'==='", "'!=='", "'with'", "'break'",
- "'default'", "'func'", "'interface'", "'select'", "'case'", "'defer'",
- "'go'", "'map'", "'struct'", "'chan'", "'else'", "'goto'", "'package'",
- "'switch'", "'const'", "'fallthrough'", "'if'", "'range'", "'type'",
- "'continue'", "'for'", "'import'", "'return'", "'var'", "'nil'", null,
- "'('", "')'", "'{'", "'}'", "'['", "']'", "'='", "','", "';'", "':'",
- "'.'", "'++'", "'--'", "':='", "'...'", "'||'", "'&&'", "'=='", "'!='",
- "'<'", "'<='", "'>'", "'>='", "'|'", "'/'", "'%'", "'<<'", "'>>'", "'&^'",
- "'!'", "'+'", "'-'", "'^'", "'*'", "'&'", "'<-'"
+ "'some'", "'get'", "'domain'", "'axiom'", "'adt'", "'match'", "'none'",
+ "'pred'", "'typeOf'", "'isComparable'", "'share'", "'@'", "'..'", "'shared'",
+ "'exclusive'", "'predicate'", "'writePerm'", "'noPerm'", "'trusted'",
+ "'outline'", "'initEnsures'", "'importRequires'", "'proof'", "'==='",
+ "'!=='", "'with'", "'break'", "'default'", "'func'", "'interface'", "'select'",
+ "'case'", "'defer'", "'go'", "'map'", "'struct'", "'chan'", "'else'",
+ "'goto'", "'package'", "'switch'", "'const'", "'fallthrough'", "'if'",
+ "'range'", "'type'", "'continue'", "'for'", "'import'", "'return'", "'var'",
+ "'nil'", null, "'('", "')'", "'{'", "'}'", "'['", "']'", "'='", "','",
+ "';'", "':'", "'.'", "'++'", "'--'", "':='", "'...'", "'||'", "'&&'",
+ "'=='", "'!='", "'<'", "'<='", "'>'", "'>='", "'|'", "'/'", "'%'", "'<<'",
+ "'>>'", "'&^'", "'!'", "'+'", "'-'", "'^'", "'*'", "'&'", "'<-'"
};
}
private static final String[] _LITERAL_NAMES = makeLiteralNames();
@@ -117,7 +117,7 @@ private static String[] makeSymbolicNames() {
"UNFOLD", "UNFOLDING", "GHOST", "IN", "MULTI", "SUBSET", "UNION", "INTERSECTION",
"SETMINUS", "IMPLIES", "WAND", "APPLY", "QMARK", "L_PRED", "R_PRED",
"SEQ", "SET", "MSET", "DICT", "OPT", "LEN", "NEW", "MAKE", "CAP", "SOME",
- "GET", "DOM", "AXIOM", "ADT", "NONE", "PRED", "TYPE_OF", "IS_COMPARABLE",
+ "GET", "DOM", "AXIOM", "ADT", "MATCH", "NONE", "PRED", "TYPE_OF", "IS_COMPARABLE",
"SHARE", "ADDR_MOD", "DOT_DOT", "SHARED", "EXCLUSIVE", "PREDICATE", "WRITEPERM",
"NOPERM", "TRUSTED", "OUTLINE", "INIT_POST", "IMPORT_PRE", "PROOF", "GHOST_EQUALS",
"GHOST_NOT_EQUALS", "WITH", "BREAK", "DEFAULT", "FUNC", "INTERFACE",
@@ -214,7 +214,7 @@ private boolean DECIMAL_FLOAT_LIT_sempred(RuleContext _localctx, int predIndex)
}
public static final String _serializedATN =
- "\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\2\u00a0\u05cb\b\1\b"+
+ "\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\2\u00a1\u05d5\b\1\b"+
"\1\4\2\t\2\4\3\t\3\4\4\t\4\4\5\t\5\4\6\t\6\4\7\t\7\4\b\t\b\4\t\t\t\4\n"+
"\t\n\4\13\t\13\4\f\t\f\4\r\t\r\4\16\t\16\4\17\t\17\4\20\t\20\4\21\t\21"+
"\4\22\t\22\4\23\t\23\4\24\t\24\4\25\t\25\4\26\t\26\4\27\t\27\4\30\t\30"+
@@ -237,671 +237,675 @@ private boolean DECIMAL_FLOAT_LIT_sempred(RuleContext _localctx, int predIndex)
"\t\u009b\4\u009c\t\u009c\4\u009d\t\u009d\4\u009e\t\u009e\4\u009f\t\u009f"+
"\4\u00a0\t\u00a0\4\u00a1\t\u00a1\4\u00a2\t\u00a2\4\u00a3\t\u00a3\4\u00a4"+
"\t\u00a4\4\u00a5\t\u00a5\4\u00a6\t\u00a6\4\u00a7\t\u00a7\4\u00a8\t\u00a8"+
- "\4\u00a9\t\u00a9\4\u00aa\t\u00aa\4\u00ab\t\u00ab\4\u00ac\t\u00ac\3\2\3"+
- "\2\5\2\u015d\n\2\3\2\3\2\3\3\3\3\3\3\3\3\5\3\u0165\n\3\3\3\5\3\u0168\n"+
- "\3\3\3\5\3\u016b\n\3\3\3\3\3\3\3\3\3\5\3\u0171\n\3\5\3\u0173\n\3\3\4\3"+
- "\4\3\4\3\4\3\4\3\4\3\4\3\5\3\5\3\5\3\5\3\5\3\5\3\5\3\5\3\6\3\6\3\6\3\6"+
- "\3\6\3\6\3\6\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3"+
- "\t\3\t\3\t\3\t\3\t\3\t\3\t\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\13\3"+
- "\13\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3\f\3\f\3\f\3\f\3\f\3\f\3"+
- "\f\3\f\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\16\3\16\3\16\3\16\3\16"+
- "\3\16\3\16\3\16\3\16\3\16\3\16\3\16\3\17\3\17\3\17\3\17\3\17\3\17\3\17"+
- "\3\20\3\20\3\20\3\20\3\20\3\20\3\20\3\20\3\20\3\20\3\20\3\21\3\21\3\21"+
- "\3\22\3\22\3\22\3\22\3\22\3\22\3\23\3\23\3\23\3\23\3\23\3\23\3\23\3\23"+
- "\3\23\3\24\3\24\3\24\3\24\3\24\3\25\3\25\3\25\3\25\3\25\3\25\3\25\3\26"+
- "\3\26\3\26\3\26\3\26\3\26\3\26\3\27\3\27\3\27\3\27\3\27\3\27\3\30\3\30"+
- "\3\30\3\30\3\30\3\31\3\31\3\31\3\31\3\31\3\31\3\31\3\32\3\32\3\32\3\32"+
- "\3\32\3\32\3\32\3\32\3\32\3\32\3\33\3\33\3\33\3\33\3\33\3\33\3\34\3\34"+
- "\3\34\3\35\3\35\3\36\3\36\3\36\3\36\3\36\3\36\3\36\3\37\3\37\3\37\3\37"+
- "\3\37\3\37\3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3!\3!\3!\3!\3!\3!\3"+
- "!\3!\3!\3\"\3\"\3\"\3\"\3#\3#\3#\3#\3$\3$\3$\3$\3$\3$\3%\3%\3&\3&\3&\3"+
- "\'\3\'\3\'\3\'\3\'\3(\3(\3(\3(\3(\3(\3)\3)\3)\3)\3)\3)\3*\3*\3*\3*\3*"+
- "\3*\3*\3+\3+\3+\3+\3+\3+\3+\3,\3,\3,\3,\3,\3,\3,\3,\3,\3-\3-\3-\3-\3-"+
- "\3-\3.\3.\3.\3.\3.\3.\3/\3/\3/\3/\3/\3/\3/\3\60\3\60\3\60\3\60\3\60\3"+
- "\60\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\62\3\62\3\62\3\62\3\62\3\62\3"+
- "\63\3\63\3\63\3\63\3\63\3\63\3\63\3\63\3\63\3\64\3\64\3\64\3\64\3\64\3"+
- "\64\3\64\3\64\3\65\3\65\3\65\3\65\3\65\3\65\3\66\3\66\3\66\3\66\3\66\3"+
- "\66\3\66\3\67\3\67\3\67\3\67\3\67\38\38\38\38\38\38\38\38\38\39\39\39"+
- "\39\39\39\39\39\39\39\39\39\39\39\39\3:\3:\3:\3:\3:\3:\3;\3;\3;\3;\3<"+
- "\3<\3<\3=\3=\3=\3=\3=\3=\3=\3>\3>\3>\3>\3>\3>\3>\3>\3>\3>\3?\3?\3?\3?"+
- "\3?\3?\3?\3?\3?\3?\3@\3@\3@\3@\3@\3@\3@\3@\3@\3@\3@\3@\3A\3A\3A\3A\3A"+
- "\3A\3A\3A\3A\3B\3B\3B\3B\3B\3B\3B\3B\3B\3B\3C\3C\3C\3C\3C\3C\3C\3C\3D"+
- "\3D\3D\3D\3D\3D\3D\3D\3D\3D\3D\3D\3E\3E\3E\3E\3E\3E\3E\3E\3E\3E\3E\3E"+
- "\3E\3E\3E\3F\3F\3F\3F\3F\3F\3G\3G\3G\3G\3H\3H\3H\3H\3I\3I\3I\3I\3I\3J"+
- "\3J\3J\3J\3J\3J\3J\3J\3K\3K\3K\3K\3K\3K\3K\3K\3L\3L\3L\3L\3L\3M\3M\3M"+
- "\3M\3M\3M\3M\3M\3M\3M\3N\3N\3N\3N\3N\3N\3N\3O\3O\3O\3O\3O\3P\3P\3P\3P"+
- "\3P\3P\3Q\3Q\3Q\3R\3R\3R\3R\3S\3S\3S\3S\3S\3S\3S\3T\3T\3T\3T\3T\3U\3U"+
- "\3U\3U\3U\3V\3V\3V\3V\3V\3W\3W\3W\3W\3W\3W\3W\3W\3X\3X\3X\3X\3X\3X\3X"+
- "\3Y\3Y\3Y\3Y\3Y\3Y\3Z\3Z\3Z\3Z\3Z\3Z\3Z\3Z\3Z\3Z\3Z\3Z\3Z\3Z\3[\3[\3["+
- "\3\\\3\\\3\\\3\\\3\\\3\\\3]\3]\3]\3]\3]\3^\3^\3^\3^\3^\3^\3^\3^\3^\3^"+
- "\3^\3_\3_\3_\3_\3`\3`\3`\3`\3`\3`\3`\3a\3a\3a\3a\3a\3a\3a\3a\3a\3b\3b"+
- "\3b\3b\3c\3c\3c\3c\3c\3c\3d\3d\3d\7d\u0416\nd\fd\16d\u0419\13d\3d\3d\3"+
- "e\3e\3f\3f\3f\3f\3g\3g\3h\3h\3h\3h\3i\3i\3j\3j\3j\3j\3k\3k\3l\3l\3m\3"+
- "m\3n\3n\3o\3o\3p\3p\3p\3p\3p\3q\3q\3q\3q\3q\3r\3r\3r\3s\3s\3s\3s\3t\3"+
- "t\3t\3u\3u\3u\3v\3v\3v\3w\3w\3w\3x\3x\3y\3y\3y\3z\3z\3{\3{\3{\3|\3|\3"+
- "}\3}\3~\3~\3\177\3\177\3\177\3\u0080\3\u0080\3\u0080\3\u0081\3\u0081\3"+
- "\u0081\3\u0082\3\u0082\3\u0083\3\u0083\3\u0084\3\u0084\3\u0085\3\u0085"+
- "\3\u0086\3\u0086\3\u0087\3\u0087\3\u0088\3\u0088\3\u0088\3\u0089\3\u0089"+
- "\3\u0089\5\u0089\u0481\n\u0089\3\u0089\7\u0089\u0484\n\u0089\f\u0089\16"+
- "\u0089\u0487\13\u0089\5\u0089\u0489\n\u0089\3\u0089\3\u0089\3\u008a\3"+
- "\u008a\3\u008a\5\u008a\u0490\n\u008a\3\u008a\6\u008a\u0493\n\u008a\r\u008a"+
- "\16\u008a\u0494\3\u008a\3\u008a\3\u008b\3\u008b\5\u008b\u049b\n\u008b"+
- "\3\u008b\5\u008b\u049e\n\u008b\3\u008b\6\u008b\u04a1\n\u008b\r\u008b\16"+
- "\u008b\u04a2\3\u008b\3\u008b\3\u008c\3\u008c\3\u008c\5\u008c\u04aa\n\u008c"+
- "\3\u008c\6\u008c\u04ad\n\u008c\r\u008c\16\u008c\u04ae\3\u008c\3\u008c"+
- "\3\u008d\3\u008d\3\u008d\3\u008d\3\u008d\3\u008e\5\u008e\u04b9\n\u008e"+
- "\3\u008e\6\u008e\u04bc\n\u008e\r\u008e\16\u008e\u04bd\3\u008e\3\u008e"+
- "\5\u008e\u04c2\n\u008e\3\u008e\7\u008e\u04c5\n\u008e\f\u008e\16\u008e"+
- "\u04c8\13\u008e\5\u008e\u04ca\n\u008e\3\u008e\3\u008e\3\u008e\5\u008e"+
- "\u04cf\n\u008e\3\u008e\7\u008e\u04d2\n\u008e\f\u008e\16\u008e\u04d5\13"+
- "\u008e\5\u008e\u04d7\n\u008e\3\u008f\3\u008f\3\u008f\3\u008f\3\u0090\3"+
- "\u0090\3\u0090\3\u0090\3\u0090\5\u0090\u04e2\n\u0090\3\u0090\3\u0090\3"+
- "\u0090\3\u0090\3\u0091\3\u0091\3\u0091\5\u0091\u04eb\n\u0091\3\u0091\3"+
- "\u0091\3\u0092\3\u0092\3\u0092\3\u0092\3\u0093\3\u0093\5\u0093\u04f5\n"+
- "\u0093\3\u0094\3\u0094\3\u0094\3\u0094\3\u0094\3\u0095\3\u0095\3\u0095"+
- "\3\u0095\3\u0095\3\u0096\3\u0096\3\u0096\3\u0096\3\u0096\3\u0096\3\u0096"+
- "\3\u0097\3\u0097\3\u0097\3\u0097\3\u0097\3\u0097\3\u0097\3\u0097\3\u0097"+
- "\3\u0097\3\u0097\3\u0098\3\u0098\7\u0098\u0515\n\u0098\f\u0098\16\u0098"+
- "\u0518\13\u0098\3\u0098\3\u0098\3\u0098\3\u0098\3\u0099\3\u0099\3\u0099"+
- "\7\u0099\u0521\n\u0099\f\u0099\16\u0099\u0524\13\u0099\3\u0099\3\u0099"+
- "\3\u0099\3\u0099\3\u009a\6\u009a\u052b\n\u009a\r\u009a\16\u009a\u052c"+
- "\3\u009a\3\u009a\3\u009b\3\u009b\3\u009b\3\u009b\7\u009b\u0535\n\u009b"+
- "\f\u009b\16\u009b\u0538\13\u009b\3\u009b\3\u009b\3\u009b\3\u009b\3\u009b"+
- "\3\u009c\6\u009c\u0540\n\u009c\r\u009c\16\u009c\u0541\3\u009c\3\u009c"+
- "\3\u009d\3\u009d\3\u009d\3\u009d\7\u009d\u054a\n\u009d\f\u009d\16\u009d"+
- "\u054d\13\u009d\3\u009d\3\u009d\3\u009e\3\u009e\3\u009e\3\u009e\5\u009e"+
- "\u0555\n\u009e\3\u009f\3\u009f\3\u009f\3\u009f\3\u009f\3\u009f\3\u009f"+
- "\3\u009f\3\u009f\3\u009f\3\u009f\3\u009f\3\u009f\3\u009f\3\u009f\3\u009f"+
- "\3\u009f\3\u009f\3\u009f\3\u009f\3\u009f\3\u009f\3\u009f\3\u009f\3\u009f"+
- "\3\u009f\5\u009f\u0571\n\u009f\3\u00a0\3\u00a0\5\u00a0\u0575\n\u00a0\3"+
- "\u00a0\7\u00a0\u0578\n\u00a0\f\u00a0\16\u00a0\u057b\13\u00a0\3\u00a1\3"+
- "\u00a1\3\u00a2\3\u00a2\3\u00a3\3\u00a3\3\u00a4\3\u00a4\5\u00a4\u0585\n"+
- "\u00a4\3\u00a4\3\u00a4\3\u00a5\3\u00a5\5\u00a5\u058b\n\u00a5\3\u00a6\3"+
- "\u00a6\3\u00a7\3\u00a7\3\u00a8\6\u00a8\u0592\n\u00a8\r\u00a8\16\u00a8"+
- "\u0593\3\u00a8\3\u00a8\3\u00a9\3\u00a9\3\u00a9\3\u00a9\7\u00a9\u059c\n"+
- "\u00a9\f\u00a9\16\u00a9\u059f\13\u00a9\3\u00a9\3\u00a9\3\u00a9\3\u00a9"+
- "\3\u00a9\3\u00aa\3\u00aa\3\u00aa\3\u00aa\7\u00aa\u05aa\n\u00aa\f\u00aa"+
- "\16\u00aa\u05ad\13\u00aa\3\u00aa\3\u00aa\3\u00ab\6\u00ab\u05b2\n\u00ab"+
- "\r\u00ab\16\u00ab\u05b3\3\u00ab\3\u00ab\3\u00ab\3\u00ab\3\u00ab\7\u00ab"+
- "\u05bb\n\u00ab\f\u00ab\16\u00ab\u05be\13\u00ab\3\u00ab\3\u00ab\3\u00ab"+
- "\5\u00ab\u05c3\n\u00ab\3\u00ab\3\u00ab\3\u00ac\3\u00ac\3\u00ac\3\u00ac"+
- "\3\u00ac\5\u0536\u059d\u05bc\2\u00ad\4\3\6\4\b\5\n\6\f\7\16\b\20\t\22"+
- "\n\24\13\26\f\30\r\32\16\34\17\36\20 \21\"\22$\23&\24(\25*\26,\27.\30"+
- "\60\31\62\32\64\33\66\348\35:\36<\37> @!B\"D#F$H%J&L\'N(P)R*T+V,X-Z.\\"+
- "/^\60`\61b\62d\63f\64h\65j\66l\67n8p9r:t;v|?~@\u0080A\u0082B\u0084"+
- "C\u0086D\u0088E\u008aF\u008cG\u008eH\u0090I\u0092J\u0094K\u0096L\u0098"+
- "M\u009aN\u009cO\u009eP\u00a0Q\u00a2R\u00a4S\u00a6T\u00a8U\u00aaV\u00ac"+
- "W\u00aeX\u00b0Y\u00b2Z\u00b4[\u00b6\\\u00b8]\u00ba^\u00bc_\u00be`\u00c0"+
- "a\u00c2b\u00c4c\u00c6d\u00c8e\u00caf\u00ccg\u00ceh\u00d0i\u00d2j\u00d4"+
- "k\u00d6l\u00d8m\u00dan\u00dco\u00dep\u00e0q\u00e2r\u00e4s\u00e6t\u00e8"+
- "u\u00eav\u00ecw\u00eex\u00f0y\u00f2z\u00f4{\u00f6|\u00f8}\u00fa~\u00fc"+
- "\177\u00fe\u0080\u0100\u0081\u0102\u0082\u0104\u0083\u0106\u0084\u0108"+
- "\u0085\u010a\u0086\u010c\u0087\u010e\u0088\u0110\u0089\u0112\u008a\u0114"+
- "\u008b\u0116\u008c\u0118\u008d\u011a\u008e\u011c\2\u011e\2\u0120\u008f"+
- "\u0122\2\u0124\u0090\u0126\u0091\u0128\u0092\u012a\u0093\u012c\u0094\u012e"+
- "\u0095\u0130\u0096\u0132\u0097\u0134\u0098\u0136\u0099\u0138\u009a\u013a"+
- "\u009b\u013c\2\u013e\2\u0140\2\u0142\2\u0144\2\u0146\2\u0148\2\u014a\2"+
- "\u014c\2\u014e\2\u0150\u009c\u0152\u009d\u0154\u009e\u0156\u009f\u0158"+
- "\u00a0\4\2\3\23\3\2\63;\3\2\62;\4\2DDdd\4\2QQqq\4\2ZZzz\4\2RRrr\4\2--"+
- "//\3\2bb\4\2$$^^\4\2\13\13\"\"\4\2\f\f\17\17\5\2\f\f\17\17))\13\2$$))"+
- "^^cdhhppttvvxx\3\2\629\5\2\62;CHch\3\2\62\63\4\2GGgg\49\2\62\2;\2\u0662"+
- "\2\u066b\2\u06f2\2\u06fb\2\u07c2\2\u07cb\2\u0968\2\u0971\2\u09e8\2\u09f1"+
- "\2\u0a68\2\u0a71\2\u0ae8\2\u0af1\2\u0b68\2\u0b71\2\u0be8\2\u0bf1\2\u0c68"+
- "\2\u0c71\2\u0ce8\2\u0cf1\2\u0d68\2\u0d71\2\u0de8\2\u0df1\2\u0e52\2\u0e5b"+
- "\2\u0ed2\2\u0edb\2\u0f22\2\u0f2b\2\u1042\2\u104b\2\u1092\2\u109b\2\u17e2"+
- "\2\u17eb\2\u1812\2\u181b\2\u1948\2\u1951\2\u19d2\2\u19db\2\u1a82\2\u1a8b"+
- "\2\u1a92\2\u1a9b\2\u1b52\2\u1b5b\2\u1bb2\2\u1bbb\2\u1c42\2\u1c4b\2\u1c52"+
- "\2\u1c5b\2\ua622\2\ua62b\2\ua8d2\2\ua8db\2\ua902\2\ua90b\2\ua9d2\2\ua9db"+
- "\2\ua9f2\2\ua9fb\2\uaa52\2\uaa5b\2\uabf2\2\uabfb\2\uff12\2\uff1b\2\u04a2"+
- "\3\u04ab\3\u1068\3\u1071\3\u10f2\3\u10fb\3\u1138\3\u1141\3\u11d2\3\u11db"+
- "\3\u12f2\3\u12fb\3\u1452\3\u145b\3\u14d2\3\u14db\3\u1652\3\u165b\3\u16c2"+
- "\3\u16cb\3\u1732\3\u173b\3\u18e2\3\u18eb\3\u1c52\3\u1c5b\3\u1d52\3\u1d5b"+
- "\3\u6a62\3\u6a6b\3\u6b52\3\u6b5b\3\ud7d0\3\ud801\3\ue952\3\ue95b\3\u024b"+
- "\2C\2\\\2c\2|\2\u00ac\2\u00ac\2\u00b7\2\u00b7\2\u00bc\2\u00bc\2\u00c2"+
- "\2\u00d8\2\u00da\2\u00f8\2\u00fa\2\u02c3\2\u02c8\2\u02d3\2\u02e2\2\u02e6"+
- "\2\u02ee\2\u02ee\2\u02f0\2\u02f0\2\u0372\2\u0376\2\u0378\2\u0379\2\u037c"+
- "\2\u037f\2\u0381\2\u0381\2\u0388\2\u0388\2\u038a\2\u038c\2\u038e\2\u038e"+
- "\2\u0390\2\u03a3\2\u03a5\2\u03f7\2\u03f9\2\u0483\2\u048c\2\u0531\2\u0533"+
- "\2\u0558\2\u055b\2\u055b\2\u0563\2\u0589\2\u05d2\2\u05ec\2\u05f2\2\u05f4"+
- "\2\u0622\2\u064c\2\u0670\2\u0671\2\u0673\2\u06d5\2\u06d7\2\u06d7\2\u06e7"+
- "\2\u06e8\2\u06f0\2\u06f1\2\u06fc\2\u06fe\2\u0701\2\u0701\2\u0712\2\u0712"+
- "\2\u0714\2\u0731\2\u074f\2\u07a7\2\u07b3\2\u07b3\2\u07cc\2\u07ec\2\u07f6"+
- "\2\u07f7\2\u07fc\2\u07fc\2\u0802\2\u0817\2\u081c\2\u081c\2\u0826\2\u0826"+
- "\2\u082a\2\u082a\2\u0842\2\u085a\2\u0862\2\u086c\2\u08a2\2\u08b6\2\u08b8"+
- "\2\u08bf\2\u0906\2\u093b\2\u093f\2\u093f\2\u0952\2\u0952\2\u095a\2\u0963"+
- "\2\u0973\2\u0982\2\u0987\2\u098e\2\u0991\2\u0992\2\u0995\2\u09aa\2\u09ac"+
- "\2\u09b2\2\u09b4\2\u09b4\2\u09b8\2\u09bb\2\u09bf\2\u09bf\2\u09d0\2\u09d0"+
- "\2\u09de\2\u09df\2\u09e1\2\u09e3\2\u09f2\2\u09f3\2\u09fe\2\u09fe\2\u0a07"+
- "\2\u0a0c\2\u0a11\2\u0a12\2\u0a15\2\u0a2a\2\u0a2c\2\u0a32\2\u0a34\2\u0a35"+
- "\2\u0a37\2\u0a38\2\u0a3a\2\u0a3b\2\u0a5b\2\u0a5e\2\u0a60\2\u0a60\2\u0a74"+
- "\2\u0a76\2\u0a87\2\u0a8f\2\u0a91\2\u0a93\2\u0a95\2\u0aaa\2\u0aac\2\u0ab2"+
- "\2\u0ab4\2\u0ab5\2\u0ab7\2\u0abb\2\u0abf\2\u0abf\2\u0ad2\2\u0ad2\2\u0ae2"+
- "\2\u0ae3\2\u0afb\2\u0afb\2\u0b07\2\u0b0e\2\u0b11\2\u0b12\2\u0b15\2\u0b2a"+
- "\2\u0b2c\2\u0b32\2\u0b34\2\u0b35\2\u0b37\2\u0b3b\2\u0b3f\2\u0b3f\2\u0b5e"+
- "\2\u0b5f\2\u0b61\2\u0b63\2\u0b73\2\u0b73\2\u0b85\2\u0b85\2\u0b87\2\u0b8c"+
- "\2\u0b90\2\u0b92\2\u0b94\2\u0b97\2\u0b9b\2\u0b9c\2\u0b9e\2\u0b9e\2\u0ba0"+
- "\2\u0ba1\2\u0ba5\2\u0ba6\2\u0baa\2\u0bac\2\u0bb0\2\u0bbb\2\u0bd2\2\u0bd2"+
- "\2\u0c07\2\u0c0e\2\u0c10\2\u0c12\2\u0c14\2\u0c2a\2\u0c2c\2\u0c3b\2\u0c3f"+
- "\2\u0c3f\2\u0c5a\2\u0c5c\2\u0c62\2\u0c63\2\u0c82\2\u0c82\2\u0c87\2\u0c8e"+
- "\2\u0c90\2\u0c92\2\u0c94\2\u0caa\2\u0cac\2\u0cb5\2\u0cb7\2\u0cbb\2\u0cbf"+
- "\2\u0cbf\2\u0ce0\2\u0ce0\2\u0ce2\2\u0ce3\2\u0cf3\2\u0cf4\2\u0d07\2\u0d0e"+
- "\2\u0d10\2\u0d12\2\u0d14\2\u0d3c\2\u0d3f\2\u0d3f\2\u0d50\2\u0d50\2\u0d56"+
- "\2\u0d58\2\u0d61\2\u0d63\2\u0d7c\2\u0d81\2\u0d87\2\u0d98\2\u0d9c\2\u0db3"+
- "\2\u0db5\2\u0dbd\2\u0dbf\2\u0dbf\2\u0dc2\2\u0dc8\2\u0e03\2\u0e32\2\u0e34"+
- "\2\u0e35\2\u0e42\2\u0e48\2\u0e83\2\u0e84\2\u0e86\2\u0e86\2\u0e89\2\u0e8a"+
- "\2\u0e8c\2\u0e8c\2\u0e8f\2\u0e8f\2\u0e96\2\u0e99\2\u0e9b\2\u0ea1\2\u0ea3"+
- "\2\u0ea5\2\u0ea7\2\u0ea7\2\u0ea9\2\u0ea9\2\u0eac\2\u0ead\2\u0eaf\2\u0eb2"+
- "\2\u0eb4\2\u0eb5\2\u0ebf\2\u0ebf\2\u0ec2\2\u0ec6\2\u0ec8\2\u0ec8\2\u0ede"+
- "\2\u0ee1\2\u0f02\2\u0f02\2\u0f42\2\u0f49\2\u0f4b\2\u0f6e\2\u0f8a\2\u0f8e"+
- "\2\u1002\2\u102c\2\u1041\2\u1041\2\u1052\2\u1057\2\u105c\2\u105f\2\u1063"+
- "\2\u1063\2\u1067\2\u1068\2\u1070\2\u1072\2\u1077\2\u1083\2\u1090\2\u1090"+
- "\2\u10a2\2\u10c7\2\u10c9\2\u10c9\2\u10cf\2\u10cf\2\u10d2\2\u10fc\2\u10fe"+
- "\2\u124a\2\u124c\2\u124f\2\u1252\2\u1258\2\u125a\2\u125a\2\u125c\2\u125f"+
- "\2\u1262\2\u128a\2\u128c\2\u128f\2\u1292\2\u12b2\2\u12b4\2\u12b7\2\u12ba"+
- "\2\u12c0\2\u12c2\2\u12c2\2\u12c4\2\u12c7\2\u12ca\2\u12d8\2\u12da\2\u1312"+
- "\2\u1314\2\u1317\2\u131a\2\u135c\2\u1382\2\u1391\2\u13a2\2\u13f7\2\u13fa"+
- "\2\u13ff\2\u1403\2\u166e\2\u1671\2\u1681\2\u1683\2\u169c\2\u16a2\2\u16ec"+
- "\2\u16f3\2\u16fa\2\u1702\2\u170e\2\u1710\2\u1713\2\u1722\2\u1733\2\u1742"+
- "\2\u1753\2\u1762\2\u176e\2\u1770\2\u1772\2\u1782\2\u17b5\2\u17d9\2\u17d9"+
- "\2\u17de\2\u17de\2\u1822\2\u1879\2\u1882\2\u1886\2\u1889\2\u18aa\2\u18ac"+
- "\2\u18ac\2\u18b2\2\u18f7\2\u1902\2\u1920\2\u1952\2\u196f\2\u1972\2\u1976"+
- "\2\u1982\2\u19ad\2\u19b2\2\u19cb\2\u1a02\2\u1a18\2\u1a22\2\u1a56\2\u1aa9"+
- "\2\u1aa9\2\u1b07\2\u1b35\2\u1b47\2\u1b4d\2\u1b85\2\u1ba2\2\u1bb0\2\u1bb1"+
- "\2\u1bbc\2\u1be7\2\u1c02\2\u1c25\2\u1c4f\2\u1c51\2\u1c5c\2\u1c7f\2\u1c82"+
- "\2\u1c8a\2\u1ceb\2\u1cee\2\u1cf0\2\u1cf3\2\u1cf7\2\u1cf8\2\u1d02\2\u1dc1"+
- "\2\u1e02\2\u1f17\2\u1f1a\2\u1f1f\2\u1f22\2\u1f47\2\u1f4a\2\u1f4f\2\u1f52"+
- "\2\u1f59\2\u1f5b\2\u1f5b\2\u1f5d\2\u1f5d\2\u1f5f\2\u1f5f\2\u1f61\2\u1f7f"+
- "\2\u1f82\2\u1fb6\2\u1fb8\2\u1fbe\2\u1fc0\2\u1fc0\2\u1fc4\2\u1fc6\2\u1fc8"+
- "\2\u1fce\2\u1fd2\2\u1fd5\2\u1fd8\2\u1fdd\2\u1fe2\2\u1fee\2\u1ff4\2\u1ff6"+
- "\2\u1ff8\2\u1ffe\2\u2073\2\u2073\2\u2081\2\u2081\2\u2092\2\u209e\2\u2104"+
- "\2\u2104\2\u2109\2\u2109\2\u210c\2\u2115\2\u2117\2\u2117\2\u211b\2\u211f"+
- "\2\u2126\2\u2126\2\u2128\2\u2128\2\u212a\2\u212a\2\u212c\2\u212f\2\u2131"+
- "\2\u213b\2\u213e\2\u2141\2\u2147\2\u214b\2\u2150\2\u2150\2\u2185\2\u2186"+
- "\2\u2c02\2\u2c30\2\u2c32\2\u2c60\2\u2c62\2\u2ce6\2\u2ced\2\u2cf0\2\u2cf4"+
- "\2\u2cf5\2\u2d02\2\u2d27\2\u2d29\2\u2d29\2\u2d2f\2\u2d2f\2\u2d32\2\u2d69"+
- "\2\u2d71\2\u2d71\2\u2d82\2\u2d98\2\u2da2\2\u2da8\2\u2daa\2\u2db0\2\u2db2"+
- "\2\u2db8\2\u2dba\2\u2dc0\2\u2dc2\2\u2dc8\2\u2dca\2\u2dd0\2\u2dd2\2\u2dd8"+
- "\2\u2dda\2\u2de0\2\u2e31\2\u2e31\2\u3007\2\u3008\2\u3033\2\u3037\2\u303d"+
- "\2\u303e\2\u3043\2\u3098\2\u309f\2\u30a1\2\u30a3\2\u30fc\2\u30fe\2\u3101"+
- "\2\u3107\2\u3130\2\u3133\2\u3190\2\u31a2\2\u31bc\2\u31f2\2\u3201\2\u3402"+
- "\2\u4db7\2\u4e02\2\u9fec\2\ua002\2\ua48e\2\ua4d2\2\ua4ff\2\ua502\2\ua60e"+
- "\2\ua612\2\ua621\2\ua62c\2\ua62d\2\ua642\2\ua670\2\ua681\2\ua69f\2\ua6a2"+
- "\2\ua6e7\2\ua719\2\ua721\2\ua724\2\ua78a\2\ua78d\2\ua7b0\2\ua7b2\2\ua7b9"+
- "\2\ua7f9\2\ua803\2\ua805\2\ua807\2\ua809\2\ua80c\2\ua80e\2\ua824\2\ua842"+
- "\2\ua875\2\ua884\2\ua8b5\2\ua8f4\2\ua8f9\2\ua8fd\2\ua8fd\2\ua8ff\2\ua8ff"+
- "\2\ua90c\2\ua927\2\ua932\2\ua948\2\ua962\2\ua97e\2\ua986\2\ua9b4\2\ua9d1"+
- "\2\ua9d1\2\ua9e2\2\ua9e6\2\ua9e8\2\ua9f1\2\ua9fc\2\uaa00\2\uaa02\2\uaa2a"+
- "\2\uaa42\2\uaa44\2\uaa46\2\uaa4d\2\uaa62\2\uaa78\2\uaa7c\2\uaa7c\2\uaa80"+
- "\2\uaab1\2\uaab3\2\uaab3\2\uaab7\2\uaab8\2\uaabb\2\uaabf\2\uaac2\2\uaac2"+
- "\2\uaac4\2\uaac4\2\uaadd\2\uaadf\2\uaae2\2\uaaec\2\uaaf4\2\uaaf6\2\uab03"+
- "\2\uab08\2\uab0b\2\uab10\2\uab13\2\uab18\2\uab22\2\uab28\2\uab2a\2\uab30"+
- "\2\uab32\2\uab5c\2\uab5e\2\uab67\2\uab72\2\uabe4\2\uac02\2\ud7a5\2\ud7b2"+
- "\2\ud7c8\2\ud7cd\2\ud7fd\2\uf902\2\ufa6f\2\ufa72\2\ufadb\2\ufb02\2\ufb08"+
- "\2\ufb15\2\ufb19\2\ufb1f\2\ufb1f\2\ufb21\2\ufb2a\2\ufb2c\2\ufb38\2\ufb3a"+
- "\2\ufb3e\2\ufb40\2\ufb40\2\ufb42\2\ufb43\2\ufb45\2\ufb46\2\ufb48\2\ufbb3"+
- "\2\ufbd5\2\ufd3f\2\ufd52\2\ufd91\2\ufd94\2\ufdc9\2\ufdf2\2\ufdfd\2\ufe72"+
- "\2\ufe76\2\ufe78\2\ufefe\2\uff23\2\uff3c\2\uff43\2\uff5c\2\uff68\2\uffc0"+
- "\2\uffc4\2\uffc9\2\uffcc\2\uffd1\2\uffd4\2\uffd9\2\uffdc\2\uffde\2\2\3"+
- "\r\3\17\3(\3*\3<\3>\3?\3A\3O\3R\3_\3\u0082\3\u00fc\3\u0282\3\u029e\3\u02a2"+
- "\3\u02d2\3\u0302\3\u0321\3\u032f\3\u0342\3\u0344\3\u034b\3\u0352\3\u0377"+
- "\3\u0382\3\u039f\3\u03a2\3\u03c5\3\u03ca\3\u03d1\3\u0402\3\u049f\3\u04b2"+
- "\3\u04d5\3\u04da\3\u04fd\3\u0502\3\u0529\3\u0532\3\u0565\3\u0602\3\u0738"+
- "\3\u0742\3\u0757\3\u0762\3\u0769\3\u0802\3\u0807\3\u080a\3\u080a\3\u080c"+
- "\3\u0837\3\u0839\3\u083a\3\u083e\3\u083e\3\u0841\3\u0857\3\u0862\3\u0878"+
- "\3\u0882\3\u08a0\3\u08e2\3\u08f4\3\u08f6\3\u08f7\3\u0902\3\u0917\3\u0922"+
- "\3\u093b\3\u0982\3\u09b9\3\u09c0\3\u09c1\3\u0a02\3\u0a02\3\u0a12\3\u0a15"+
- "\3\u0a17\3\u0a19\3\u0a1b\3\u0a35\3\u0a62\3\u0a7e\3\u0a82\3\u0a9e\3\u0ac2"+
- "\3\u0ac9\3\u0acb\3\u0ae6\3\u0b02\3\u0b37\3\u0b42\3\u0b57\3\u0b62\3\u0b74"+
- "\3\u0b82\3\u0b93\3\u0c02\3\u0c4a\3\u0c82\3\u0cb4\3\u0cc2\3\u0cf4\3\u1005"+
- "\3\u1039\3\u1085\3\u10b1\3\u10d2\3\u10ea\3\u1105\3\u1128\3\u1152\3\u1174"+
- "\3\u1178\3\u1178\3\u1185\3\u11b4\3\u11c3\3\u11c6\3\u11dc\3\u11dc\3\u11de"+
- "\3\u11de\3\u1202\3\u1213\3\u1215\3\u122d\3\u1282\3\u1288\3\u128a\3\u128a"+
- "\3\u128c\3\u128f\3\u1291\3\u129f\3\u12a1\3\u12aa\3\u12b2\3\u12e0\3\u1307"+
- "\3\u130e\3\u1311\3\u1312\3\u1315\3\u132a\3\u132c\3\u1332\3\u1334\3\u1335"+
- "\3\u1337\3\u133b\3\u133f\3\u133f\3\u1352\3\u1352\3\u135f\3\u1363\3\u1402"+
- "\3\u1436\3\u1449\3\u144c\3\u1482\3\u14b1\3\u14c6\3\u14c7\3\u14c9\3\u14c9"+
- "\3\u1582\3\u15b0\3\u15da\3\u15dd\3\u1602\3\u1631\3\u1646\3\u1646\3\u1682"+
- "\3\u16ac\3\u1702\3\u171b\3\u18a2\3\u18e1\3\u1901\3\u1901\3\u1a02\3\u1a02"+
- "\3\u1a0d\3\u1a34\3\u1a3c\3\u1a3c\3\u1a52\3\u1a52\3\u1a5e\3\u1a85\3\u1a88"+
- "\3\u1a8b\3\u1ac2\3\u1afa\3\u1c02\3\u1c0a\3\u1c0c\3\u1c30\3\u1c42\3\u1c42"+
- "\3\u1c74\3\u1c91\3\u1d02\3\u1d08\3\u1d0a\3\u1d0b\3\u1d0d\3\u1d32\3\u1d48"+
- "\3\u1d48\3\u2002\3\u239b\3\u2482\3\u2545\3\u3002\3\u3430\3\u4402\3\u4648"+
- "\3\u6802\3\u6a3a\3\u6a42\3\u6a60\3\u6ad2\3\u6aef\3\u6b02\3\u6b31\3\u6b42"+
- "\3\u6b45\3\u6b65\3\u6b79\3\u6b7f\3\u6b91\3\u6f02\3\u6f46\3\u6f52\3\u6f52"+
- "\3\u6f95\3\u6fa1\3\u6fe2\3\u6fe3\3\u7002\3\u87ee\3\u8802\3\u8af4\3\ub002"+
- "\3\ub120\3\ub172\3\ub2fd\3\ubc02\3\ubc6c\3\ubc72\3\ubc7e\3\ubc82\3\ubc8a"+
- "\3\ubc92\3\ubc9b\3\ud402\3\ud456\3\ud458\3\ud49e\3\ud4a0\3\ud4a1\3\ud4a4"+
- "\3\ud4a4\3\ud4a7\3\ud4a8\3\ud4ab\3\ud4ae\3\ud4b0\3\ud4bb\3\ud4bd\3\ud4bd"+
- "\3\ud4bf\3\ud4c5\3\ud4c7\3\ud507\3\ud509\3\ud50c\3\ud50f\3\ud516\3\ud518"+
- "\3\ud51e\3\ud520\3\ud53b\3\ud53d\3\ud540\3\ud542\3\ud546\3\ud548\3\ud548"+
- "\3\ud54c\3\ud552\3\ud554\3\ud6a7\3\ud6aa\3\ud6c2\3\ud6c4\3\ud6dc\3\ud6de"+
- "\3\ud6fc\3\ud6fe\3\ud716\3\ud718\3\ud736\3\ud738\3\ud750\3\ud752\3\ud770"+
- "\3\ud772\3\ud78a\3\ud78c\3\ud7aa\3\ud7ac\3\ud7c4\3\ud7c6\3\ud7cd\3\ue802"+
- "\3\ue8c6\3\ue902\3\ue945\3\uee02\3\uee05\3\uee07\3\uee21\3\uee23\3\uee24"+
- "\3\uee26\3\uee26\3\uee29\3\uee29\3\uee2b\3\uee34\3\uee36\3\uee39\3\uee3b"+
- "\3\uee3b\3\uee3d\3\uee3d\3\uee44\3\uee44\3\uee49\3\uee49\3\uee4b\3\uee4b"+
- "\3\uee4d\3\uee4d\3\uee4f\3\uee51\3\uee53\3\uee54\3\uee56\3\uee56\3\uee59"+
- "\3\uee59\3\uee5b\3\uee5b\3\uee5d\3\uee5d\3\uee5f\3\uee5f\3\uee61\3\uee61"+
- "\3\uee63\3\uee64\3\uee66\3\uee66\3\uee69\3\uee6c\3\uee6e\3\uee74\3\uee76"+
- "\3\uee79\3\uee7b\3\uee7e\3\uee80\3\uee80\3\uee82\3\uee8b\3\uee8d\3\uee9d"+
- "\3\ueea3\3\ueea5\3\ueea7\3\ueeab\3\ueead\3\ueebd\3\2\4\ua6d8\4\ua702\4"+
- "\ub736\4\ub742\4\ub81f\4\ub822\4\ucea3\4\uceb2\4\uebe2\4\uf802\4\ufa1f"+
- "\4\u05f6\2\4\3\2\2\2\2\6\3\2\2\2\2\b\3\2\2\2\2\n\3\2\2\2\2\f\3\2\2\2\2"+
- "\16\3\2\2\2\2\20\3\2\2\2\2\22\3\2\2\2\2\24\3\2\2\2\2\26\3\2\2\2\2\30\3"+
- "\2\2\2\2\32\3\2\2\2\2\34\3\2\2\2\2\36\3\2\2\2\2 \3\2\2\2\2\"\3\2\2\2\2"+
- "$\3\2\2\2\2&\3\2\2\2\2(\3\2\2\2\2*\3\2\2\2\2,\3\2\2\2\2.\3\2\2\2\2\60"+
- "\3\2\2\2\2\62\3\2\2\2\2\64\3\2\2\2\2\66\3\2\2\2\28\3\2\2\2\2:\3\2\2\2"+
- "\2<\3\2\2\2\2>\3\2\2\2\2@\3\2\2\2\2B\3\2\2\2\2D\3\2\2\2\2F\3\2\2\2\2H"+
- "\3\2\2\2\2J\3\2\2\2\2L\3\2\2\2\2N\3\2\2\2\2P\3\2\2\2\2R\3\2\2\2\2T\3\2"+
- "\2\2\2V\3\2\2\2\2X\3\2\2\2\2Z\3\2\2\2\2\\\3\2\2\2\2^\3\2\2\2\2`\3\2\2"+
- "\2\2b\3\2\2\2\2d\3\2\2\2\2f\3\2\2\2\2h\3\2\2\2\2j\3\2\2\2\2l\3\2\2\2\2"+
- "n\3\2\2\2\2p\3\2\2\2\2r\3\2\2\2\2t\3\2\2\2\2v\3\2\2\2\2x\3\2\2\2\2z\3"+
- "\2\2\2\2|\3\2\2\2\2~\3\2\2\2\2\u0080\3\2\2\2\2\u0082\3\2\2\2\2\u0084\3"+
- "\2\2\2\2\u0086\3\2\2\2\2\u0088\3\2\2\2\2\u008a\3\2\2\2\2\u008c\3\2\2\2"+
- "\2\u008e\3\2\2\2\2\u0090\3\2\2\2\2\u0092\3\2\2\2\2\u0094\3\2\2\2\2\u0096"+
- "\3\2\2\2\2\u0098\3\2\2\2\2\u009a\3\2\2\2\2\u009c\3\2\2\2\2\u009e\3\2\2"+
- "\2\2\u00a0\3\2\2\2\2\u00a2\3\2\2\2\2\u00a4\3\2\2\2\2\u00a6\3\2\2\2\2\u00a8"+
- "\3\2\2\2\2\u00aa\3\2\2\2\2\u00ac\3\2\2\2\2\u00ae\3\2\2\2\2\u00b0\3\2\2"+
- "\2\2\u00b2\3\2\2\2\2\u00b4\3\2\2\2\2\u00b6\3\2\2\2\2\u00b8\3\2\2\2\2\u00ba"+
- "\3\2\2\2\2\u00bc\3\2\2\2\2\u00be\3\2\2\2\2\u00c0\3\2\2\2\2\u00c2\3\2\2"+
- "\2\2\u00c4\3\2\2\2\2\u00c6\3\2\2\2\2\u00c8\3\2\2\2\2\u00ca\3\2\2\2\2\u00cc"+
- "\3\2\2\2\2\u00ce\3\2\2\2\2\u00d0\3\2\2\2\2\u00d2\3\2\2\2\2\u00d4\3\2\2"+
- "\2\2\u00d6\3\2\2\2\2\u00d8\3\2\2\2\2\u00da\3\2\2\2\2\u00dc\3\2\2\2\2\u00de"+
- "\3\2\2\2\2\u00e0\3\2\2\2\2\u00e2\3\2\2\2\2\u00e4\3\2\2\2\2\u00e6\3\2\2"+
- "\2\2\u00e8\3\2\2\2\2\u00ea\3\2\2\2\2\u00ec\3\2\2\2\2\u00ee\3\2\2\2\2\u00f0"+
- "\3\2\2\2\2\u00f2\3\2\2\2\2\u00f4\3\2\2\2\2\u00f6\3\2\2\2\2\u00f8\3\2\2"+
- "\2\2\u00fa\3\2\2\2\2\u00fc\3\2\2\2\2\u00fe\3\2\2\2\2\u0100\3\2\2\2\2\u0102"+
- "\3\2\2\2\2\u0104\3\2\2\2\2\u0106\3\2\2\2\2\u0108\3\2\2\2\2\u010a\3\2\2"+
- "\2\2\u010c\3\2\2\2\2\u010e\3\2\2\2\2\u0110\3\2\2\2\2\u0112\3\2\2\2\2\u0114"+
- "\3\2\2\2\2\u0116\3\2\2\2\2\u0118\3\2\2\2\2\u011a\3\2\2\2\2\u0120\3\2\2"+
- "\2\2\u0124\3\2\2\2\2\u0126\3\2\2\2\2\u0128\3\2\2\2\2\u012a\3\2\2\2\2\u012c"+
- "\3\2\2\2\2\u012e\3\2\2\2\2\u0130\3\2\2\2\2\u0132\3\2\2\2\2\u0134\3\2\2"+
- "\2\2\u0136\3\2\2\2\2\u0138\3\2\2\2\2\u013a\3\2\2\2\3\u0150\3\2\2\2\3\u0152"+
- "\3\2\2\2\3\u0154\3\2\2\2\3\u0156\3\2\2\2\3\u0158\3\2\2\2\4\u015c\3\2\2"+
- "\2\6\u0172\3\2\2\2\b\u0174\3\2\2\2\n\u017b\3\2\2\2\f\u0183\3\2\2\2\16"+
- "\u018a\3\2\2\2\20\u0191\3\2\2\2\22\u0198\3\2\2\2\24\u019f\3\2\2\2\26\u01a8"+
- "\3\2\2\2\30\u01b2\3\2\2\2\32\u01ba\3\2\2\2\34\u01c4\3\2\2\2\36\u01d0\3"+
- "\2\2\2 \u01d7\3\2\2\2\"\u01e2\3\2\2\2$\u01e5\3\2\2\2&\u01eb\3\2\2\2(\u01f4"+
- "\3\2\2\2*\u01f9\3\2\2\2,\u0200\3\2\2\2.\u0207\3\2\2\2\60\u020d\3\2\2\2"+
- "\62\u0212\3\2\2\2\64\u0219\3\2\2\2\66\u0223\3\2\2\28\u0229\3\2\2\2:\u022c"+
- "\3\2\2\2<\u022e\3\2\2\2>\u0235\3\2\2\2@\u023b\3\2\2\2B\u0248\3\2\2\2D"+
- "\u0251\3\2\2\2F\u0255\3\2\2\2H\u0259\3\2\2\2J\u025f\3\2\2\2L\u0261\3\2"+
- "\2\2N\u0264\3\2\2\2P\u0269\3\2\2\2R\u026f\3\2\2\2T\u0275\3\2\2\2V\u027c"+
- "\3\2\2\2X\u0283\3\2\2\2Z\u028c\3\2\2\2\\\u0292\3\2\2\2^\u0298\3\2\2\2"+
- "`\u029f\3\2\2\2b\u02a5\3\2\2\2d\u02ac\3\2\2\2f\u02b2\3\2\2\2h\u02bb\3"+
- "\2\2\2j\u02c3\3\2\2\2l\u02c9\3\2\2\2n\u02d0\3\2\2\2p\u02d5\3\2\2\2r\u02de"+
- "\3\2\2\2t\u02ed\3\2\2\2v\u02f3\3\2\2\2x\u02f7\3\2\2\2z\u02fa\3\2\2\2|"+
- "\u0301\3\2\2\2~\u030b\3\2\2\2\u0080\u0315\3\2\2\2\u0082\u0321\3\2\2\2"+
- "\u0084\u032a\3\2\2\2\u0086\u0334\3\2\2\2\u0088\u033c\3\2\2\2\u008a\u0348"+
- "\3\2\2\2\u008c\u0357\3\2\2\2\u008e\u035d\3\2\2\2\u0090\u0361\3\2\2\2\u0092"+
- "\u0365\3\2\2\2\u0094\u036a\3\2\2\2\u0096\u0372\3\2\2\2\u0098\u037a\3\2"+
- "\2\2\u009a\u037f\3\2\2\2\u009c\u0389\3\2\2\2\u009e\u0390\3\2\2\2\u00a0"+
- "\u0395\3\2\2\2\u00a2\u039b\3\2\2\2\u00a4\u039e\3\2\2\2\u00a6\u03a2\3\2"+
- "\2\2\u00a8\u03a9\3\2\2\2\u00aa\u03ae\3\2\2\2\u00ac\u03b3\3\2\2\2\u00ae"+
- "\u03b8\3\2\2\2\u00b0\u03c0\3\2\2\2\u00b2\u03c7\3\2\2\2\u00b4\u03cd\3\2"+
- "\2\2\u00b6\u03db\3\2\2\2\u00b8\u03de\3\2\2\2\u00ba\u03e4\3\2\2\2\u00bc"+
- "\u03e9\3\2\2\2\u00be\u03f4\3\2\2\2\u00c0\u03f8\3\2\2\2\u00c2\u03ff\3\2"+
- "\2\2\u00c4\u0408\3\2\2\2\u00c6\u040c\3\2\2\2\u00c8\u0412\3\2\2\2\u00ca"+
- "\u041c\3\2\2\2\u00cc\u041e\3\2\2\2\u00ce\u0422\3\2\2\2\u00d0\u0424\3\2"+
- "\2\2\u00d2\u0428\3\2\2\2\u00d4\u042a\3\2\2\2\u00d6\u042e\3\2\2\2\u00d8"+
- "\u0430\3\2\2\2\u00da\u0432\3\2\2\2\u00dc\u0434\3\2\2\2\u00de\u0436\3\2"+
- "\2\2\u00e0\u0438\3\2\2\2\u00e2\u043d\3\2\2\2\u00e4\u0442\3\2\2\2\u00e6"+
- "\u0445\3\2\2\2\u00e8\u0449\3\2\2\2\u00ea\u044c\3\2\2\2\u00ec\u044f\3\2"+
- "\2\2\u00ee\u0452\3\2\2\2\u00f0\u0455\3\2\2\2\u00f2\u0457\3\2\2\2\u00f4"+
- "\u045a\3\2\2\2\u00f6\u045c\3\2\2\2\u00f8\u045f\3\2\2\2\u00fa\u0461\3\2"+
- "\2\2\u00fc\u0463\3\2\2\2\u00fe\u0465\3\2\2\2\u0100\u0468\3\2\2\2\u0102"+
- "\u046b\3\2\2\2\u0104\u046e\3\2\2\2\u0106\u0470\3\2\2\2\u0108\u0472\3\2"+
- "\2\2\u010a\u0474\3\2\2\2\u010c\u0476\3\2\2\2\u010e\u0478\3\2\2\2\u0110"+
- "\u047a\3\2\2\2\u0112\u0488\3\2\2\2\u0114\u048c\3\2\2\2\u0116\u0498\3\2"+
- "\2\2\u0118\u04a6\3\2\2\2\u011a\u04b2\3\2\2\2\u011c\u04d6\3\2\2\2\u011e"+
- "\u04d8\3\2\2\2\u0120\u04e1\3\2\2\2\u0122\u04e7\3\2\2\2\u0124\u04ee\3\2"+
- "\2\2\u0126\u04f4\3\2\2\2\u0128\u04f6\3\2\2\2\u012a\u04fb\3\2\2\2\u012c"+
- "\u0500\3\2\2\2\u012e\u0507\3\2\2\2\u0130\u0512\3\2\2\2\u0132\u051d\3\2"+
- "\2\2\u0134\u052a\3\2\2\2\u0136\u0530\3\2\2\2\u0138\u053f\3\2\2\2\u013a"+
- "\u0545\3\2\2\2\u013c\u0554\3\2\2\2\u013e\u0556\3\2\2\2\u0140\u0572\3\2"+
- "\2\2\u0142\u057c\3\2\2\2\u0144\u057e\3\2\2\2\u0146\u0580\3\2\2\2\u0148"+
- "\u0582\3\2\2\2\u014a\u058a\3\2\2\2\u014c\u058c\3\2\2\2\u014e\u058e\3\2"+
- "\2\2\u0150\u0591\3\2\2\2\u0152\u0597\3\2\2\2\u0154\u05a5\3\2\2\2\u0156"+
- "\u05c2\3\2\2\2\u0158\u05c6\3\2\2\2\u015a\u015d\5\6\3\2\u015b\u015d\5\u011a"+
- "\u008d\2\u015c\u015a\3\2\2\2\u015c\u015b\3\2\2\2\u015d\u015e\3\2\2\2\u015e"+
- "\u015f\b\2\2\2\u015f\5\3\2\2\2\u0160\u016a\5\u0140\u00a0\2\u0161\u0162"+
- "\7\60\2\2\u0162\u0164\6\3\2\2\u0163\u0165\5\u0140\u00a0\2\u0164\u0163"+
- "\3\2\2\2\u0164\u0165\3\2\2\2\u0165\u0167\3\2\2\2\u0166\u0168\5\u0148\u00a4"+
- "\2\u0167\u0166\3\2\2\2\u0167\u0168\3\2\2\2\u0168\u016b\3\2\2\2\u0169\u016b"+
- "\5\u0148\u00a4\2\u016a\u0161\3\2\2\2\u016a\u0169\3\2\2\2\u016b\u0173\3"+
- "\2\2\2\u016c\u016d\7\60\2\2\u016d\u016e\6\3\3\2\u016e\u0170\5\u0140\u00a0"+
- "\2\u016f\u0171\5\u0148\u00a4\2\u0170\u016f\3\2\2\2\u0170\u0171\3\2\2\2"+
- "\u0171\u0173\3\2\2\2\u0172\u0160\3\2\2\2\u0172\u016c\3\2\2\2\u0173\7\3"+
- "\2\2\2\u0174\u0175\7v\2\2\u0175\u0176\7t\2\2\u0176\u0177\7w\2\2\u0177"+
- "\u0178\7g\2\2\u0178\u0179\3\2\2\2\u0179\u017a\b\4\2\2\u017a\t\3\2\2\2"+
- "\u017b\u017c\7h\2\2\u017c\u017d\7c\2\2\u017d\u017e\7n\2\2\u017e\u017f"+
- "\7u\2\2\u017f\u0180\7g\2\2\u0180\u0181\3\2\2\2\u0181\u0182\b\5\2\2\u0182"+
- "\13\3\2\2\2\u0183\u0184\7c\2\2\u0184\u0185\7u\2\2\u0185\u0186\7u\2\2\u0186"+
- "\u0187\7g\2\2\u0187\u0188\7t\2\2\u0188\u0189\7v\2\2\u0189\r\3\2\2\2\u018a"+
- "\u018b\7c\2\2\u018b\u018c\7u\2\2\u018c\u018d\7u\2\2\u018d\u018e\7w\2\2"+
- "\u018e\u018f\7o\2\2\u018f\u0190\7g\2\2\u0190\17\3\2\2\2\u0191\u0192\7"+
- "k\2\2\u0192\u0193\7p\2\2\u0193\u0194\7j\2\2\u0194\u0195\7c\2\2\u0195\u0196"+
- "\7n\2\2\u0196\u0197\7g\2\2\u0197\21\3\2\2\2\u0198\u0199\7g\2\2\u0199\u019a"+
- "\7z\2\2\u019a\u019b\7j\2\2\u019b\u019c\7c\2\2\u019c\u019d\7n\2\2\u019d"+
- "\u019e\7g\2\2\u019e\23\3\2\2\2\u019f\u01a0\7t\2\2\u01a0\u01a1\7g\2\2\u01a1"+
- "\u01a2\7s\2\2\u01a2\u01a3\7w\2\2\u01a3\u01a4\7k\2\2\u01a4\u01a5\7t\2\2"+
- "\u01a5\u01a6\7g\2\2\u01a6\u01a7\7u\2\2\u01a7\25\3\2\2\2\u01a8\u01a9\7"+
- "r\2\2\u01a9\u01aa\7t\2\2\u01aa\u01ab\7g\2\2\u01ab\u01ac\7u\2\2\u01ac\u01ad"+
- "\7g\2\2\u01ad\u01ae\7t\2\2\u01ae\u01af\7x\2\2\u01af\u01b0\7g\2\2\u01b0"+
- "\u01b1\7u\2\2\u01b1\27\3\2\2\2\u01b2\u01b3\7g\2\2\u01b3\u01b4\7p\2\2\u01b4"+
- "\u01b5\7u\2\2\u01b5\u01b6\7w\2\2\u01b6\u01b7\7t\2\2\u01b7\u01b8\7g\2\2"+
- "\u01b8\u01b9\7u\2\2\u01b9\31\3\2\2\2\u01ba\u01bb\7k\2\2\u01bb\u01bc\7"+
- "p\2\2\u01bc\u01bd\7x\2\2\u01bd\u01be\7c\2\2\u01be\u01bf\7t\2\2\u01bf\u01c0"+
- "\7k\2\2\u01c0\u01c1\7c\2\2\u01c1\u01c2\7p\2\2\u01c2\u01c3\7v\2\2\u01c3"+
- "\33\3\2\2\2\u01c4\u01c5\7f\2\2\u01c5\u01c6\7g\2\2\u01c6\u01c7\7e\2\2\u01c7"+
- "\u01c8\7t\2\2\u01c8\u01c9\7g\2\2\u01c9\u01ca\7c\2\2\u01ca\u01cb\7u\2\2"+
- "\u01cb\u01cc\7g\2\2\u01cc\u01cd\7u\2\2\u01cd\u01ce\3\2\2\2\u01ce\u01cf"+
- "\b\16\2\2\u01cf\35\3\2\2\2\u01d0\u01d1\7r\2\2\u01d1\u01d2\7w\2\2\u01d2"+
- "\u01d3\7t\2\2\u01d3\u01d4\7g\2\2\u01d4\u01d5\3\2\2\2\u01d5\u01d6\b\17"+
- "\2\2\u01d6\37\3\2\2\2\u01d7\u01d8\7k\2\2\u01d8\u01d9\7o\2\2\u01d9\u01da"+
- "\7r\2\2\u01da\u01db\7n\2\2\u01db\u01dc\7g\2\2\u01dc\u01dd\7o\2\2\u01dd"+
- "\u01de\7g\2\2\u01de\u01df\7p\2\2\u01df\u01e0\7v\2\2\u01e0\u01e1\7u\2\2"+
- "\u01e1!\3\2\2\2\u01e2\u01e3\7c\2\2\u01e3\u01e4\7u\2\2\u01e4#\3\2\2\2\u01e5"+
- "\u01e6\7q\2\2\u01e6\u01e7\7n\2\2\u01e7\u01e8\7f\2\2\u01e8\u01e9\3\2\2"+
- "\2\u01e9\u01ea\b\22\2\2\u01ea%\3\2\2\2\u01eb\u01ec\7d\2\2\u01ec\u01ed"+
- "\7g\2\2\u01ed\u01ee\7h\2\2\u01ee\u01ef\7q\2\2\u01ef\u01f0\7t\2\2\u01f0"+
- "\u01f1\7g\2\2\u01f1\u01f2\3\2\2\2\u01f2\u01f3\b\23\2\2\u01f3\'\3\2\2\2"+
- "\u01f4\u01f5\7%\2\2\u01f5\u01f6\7n\2\2\u01f6\u01f7\7j\2\2\u01f7\u01f8"+
- "\7u\2\2\u01f8)\3\2\2\2\u01f9\u01fa\7h\2\2\u01fa\u01fb\7q\2\2\u01fb\u01fc"+
- "\7t\2\2\u01fc\u01fd\7c\2\2\u01fd\u01fe\7n\2\2\u01fe\u01ff\7n\2\2\u01ff"+
- "+\3\2\2\2\u0200\u0201\7g\2\2\u0201\u0202\7z\2\2\u0202\u0203\7k\2\2\u0203"+
- "\u0204\7u\2\2\u0204\u0205\7v\2\2\u0205\u0206\7u\2\2\u0206-\3\2\2\2\u0207"+
- "\u0208\7c\2\2\u0208\u0209\7e\2\2\u0209\u020a\7e\2\2\u020a\u020b\3\2\2"+
- "\2\u020b\u020c\b\27\2\2\u020c/\3\2\2\2\u020d\u020e\7h\2\2\u020e\u020f"+
- "\7q\2\2\u020f\u0210\7n\2\2\u0210\u0211\7f\2\2\u0211\61\3\2\2\2\u0212\u0213"+
- "\7w\2\2\u0213\u0214\7p\2\2\u0214\u0215\7h\2\2\u0215\u0216\7q\2\2\u0216"+
- "\u0217\7n\2\2\u0217\u0218\7f\2\2\u0218\63\3\2\2\2\u0219\u021a\7w\2\2\u021a"+
- "\u021b\7p\2\2\u021b\u021c\7h\2\2\u021c\u021d\7q\2\2\u021d\u021e\7n\2\2"+
- "\u021e\u021f\7f\2\2\u021f\u0220\7k\2\2\u0220\u0221\7p\2\2\u0221\u0222"+
- "\7i\2\2\u0222\65\3\2\2\2\u0223\u0224\7i\2\2\u0224\u0225\7j\2\2\u0225\u0226"+
- "\7q\2\2\u0226\u0227\7u\2\2\u0227\u0228\7v\2\2\u0228\67\3\2\2\2\u0229\u022a"+
- "\7k\2\2\u022a\u022b\7p\2\2\u022b9\3\2\2\2\u022c\u022d\7%\2\2\u022d;\3"+
- "\2\2\2\u022e\u022f\7u\2\2\u022f\u0230\7w\2\2\u0230\u0231\7d\2\2\u0231"+
- "\u0232\7u\2\2\u0232\u0233\7g\2\2\u0233\u0234\7v\2\2\u0234=\3\2\2\2\u0235"+
- "\u0236\7w\2\2\u0236\u0237\7p\2\2\u0237\u0238\7k\2\2\u0238\u0239\7q\2\2"+
- "\u0239\u023a\7p\2\2\u023a?\3\2\2\2\u023b\u023c\7k\2\2\u023c\u023d\7p\2"+
- "\2\u023d\u023e\7v\2\2\u023e\u023f\7g\2\2\u023f\u0240\7t\2\2\u0240\u0241"+
- "\7u\2\2\u0241\u0242\7g\2\2\u0242\u0243\7e\2\2\u0243\u0244\7v\2\2\u0244"+
- "\u0245\7k\2\2\u0245\u0246\7q\2\2\u0246\u0247\7p\2\2\u0247A\3\2\2\2\u0248"+
- "\u0249\7u\2\2\u0249\u024a\7g\2\2\u024a\u024b\7v\2\2\u024b\u024c\7o\2\2"+
- "\u024c\u024d\7k\2\2\u024d\u024e\7p\2\2\u024e\u024f\7w\2\2\u024f\u0250"+
- "\7u\2\2\u0250C\3\2\2\2\u0251\u0252\7?\2\2\u0252\u0253\7?\2\2\u0253\u0254"+
- "\7@\2\2\u0254E\3\2\2\2\u0255\u0256\7/\2\2\u0256\u0257\7/\2\2\u0257\u0258"+
- "\7,\2\2\u0258G\3\2\2\2\u0259\u025a\7c\2\2\u025a\u025b\7r\2\2\u025b\u025c"+
- "\7r\2\2\u025c\u025d\7n\2\2\u025d\u025e\7{\2\2\u025eI\3\2\2\2\u025f\u0260"+
- "\7A\2\2\u0260K\3\2\2\2\u0261\u0262\7#\2\2\u0262\u0263\7>\2\2\u0263M\3"+
- "\2\2\2\u0264\u0265\7#\2\2\u0265\u0266\7@\2\2\u0266\u0267\3\2\2\2\u0267"+
- "\u0268\b\'\2\2\u0268O\3\2\2\2\u0269\u026a\7u\2\2\u026a\u026b\7g\2\2\u026b"+
- "\u026c\7s\2\2\u026c\u026d\3\2\2\2\u026d\u026e\b(\2\2\u026eQ\3\2\2\2\u026f"+
- "\u0270\7u\2\2\u0270\u0271\7g\2\2\u0271\u0272\7v\2\2\u0272\u0273\3\2\2"+
- "\2\u0273\u0274\b)\2\2\u0274S\3\2\2\2\u0275\u0276\7o\2\2\u0276\u0277\7"+
- "u\2\2\u0277\u0278\7g\2\2\u0278\u0279\7v\2\2\u0279\u027a\3\2\2\2\u027a"+
- "\u027b\b*\2\2\u027bU\3\2\2\2\u027c\u027d\7f\2\2\u027d\u027e\7k\2\2\u027e"+
- "\u027f\7e\2\2\u027f\u0280\7v\2\2\u0280\u0281\3\2\2\2\u0281\u0282\b+\2"+
- "\2\u0282W\3\2\2\2\u0283\u0284\7q\2\2\u0284\u0285\7r\2\2\u0285\u0286\7"+
- "v\2\2\u0286\u0287\7k\2\2\u0287\u0288\7q\2\2\u0288\u0289\7p\2\2\u0289\u028a"+
- "\3\2\2\2\u028a\u028b\b,\2\2\u028bY\3\2\2\2\u028c\u028d\7n\2\2\u028d\u028e"+
- "\7g\2\2\u028e\u028f\7p\2\2\u028f\u0290\3\2\2\2\u0290\u0291\b-\2\2\u0291"+
- "[\3\2\2\2\u0292\u0293\7p\2\2\u0293\u0294\7g\2\2\u0294\u0295\7y\2\2\u0295"+
- "\u0296\3\2\2\2\u0296\u0297\b.\2\2\u0297]\3\2\2\2\u0298\u0299\7o\2\2\u0299"+
- "\u029a\7c\2\2\u029a\u029b\7m\2\2\u029b\u029c\7g\2\2\u029c\u029d\3\2\2"+
- "\2\u029d\u029e\b/\2\2\u029e_\3\2\2\2\u029f\u02a0\7e\2\2\u02a0\u02a1\7"+
- "c\2\2\u02a1\u02a2\7r\2\2\u02a2\u02a3\3\2\2\2\u02a3\u02a4\b\60\2\2\u02a4"+
- "a\3\2\2\2\u02a5\u02a6\7u\2\2\u02a6\u02a7\7q\2\2\u02a7\u02a8\7o\2\2\u02a8"+
- "\u02a9\7g\2\2\u02a9\u02aa\3\2\2\2\u02aa\u02ab\b\61\2\2\u02abc\3\2\2\2"+
- "\u02ac\u02ad\7i\2\2\u02ad\u02ae\7g\2\2\u02ae\u02af\7v\2\2\u02af\u02b0"+
- "\3\2\2\2\u02b0\u02b1\b\62\2\2\u02b1e\3\2\2\2\u02b2\u02b3\7f\2\2\u02b3"+
- "\u02b4\7q\2\2\u02b4\u02b5\7o\2\2\u02b5\u02b6\7c\2\2\u02b6\u02b7\7k\2\2"+
- "\u02b7\u02b8\7p\2\2\u02b8\u02b9\3\2\2\2\u02b9\u02ba\b\63\2\2\u02bag\3"+
- "\2\2\2\u02bb\u02bc\7c\2\2\u02bc\u02bd\7z\2\2\u02bd\u02be\7k\2\2\u02be"+
- "\u02bf\7q\2\2\u02bf\u02c0\7o\2\2\u02c0\u02c1\3\2\2\2\u02c1\u02c2\b\64"+
- "\2\2\u02c2i\3\2\2\2\u02c3\u02c4\7c\2\2\u02c4\u02c5\7f\2\2\u02c5\u02c6"+
- "\7v\2\2\u02c6\u02c7\3\2\2\2\u02c7\u02c8\b\65\2\2\u02c8k\3\2\2\2\u02c9"+
- "\u02ca\7p\2\2\u02ca\u02cb\7q\2\2\u02cb\u02cc\7p\2\2\u02cc\u02cd\7g\2\2"+
- "\u02cd\u02ce\3\2\2\2\u02ce\u02cf\b\66\2\2\u02cfm\3\2\2\2\u02d0\u02d1\7"+
- "r\2\2\u02d1\u02d2\7t\2\2\u02d2\u02d3\7g\2\2\u02d3\u02d4\7f\2\2\u02d4o"+
- "\3\2\2\2\u02d5\u02d6\7v\2\2\u02d6\u02d7\7{\2\2\u02d7\u02d8\7r\2\2\u02d8"+
- "\u02d9\7g\2\2\u02d9\u02da\7Q\2\2\u02da\u02db\7h\2\2\u02db\u02dc\3\2\2"+
- "\2\u02dc\u02dd\b8\2\2\u02ddq\3\2\2\2\u02de\u02df\7k\2\2\u02df\u02e0\7"+
- "u\2\2\u02e0\u02e1\7E\2\2\u02e1\u02e2\7q\2\2\u02e2\u02e3\7o\2\2\u02e3\u02e4"+
- "\7r\2\2\u02e4\u02e5\7c\2\2\u02e5\u02e6\7t\2\2\u02e6\u02e7\7c\2\2\u02e7"+
- "\u02e8\7d\2\2\u02e8\u02e9\7n\2\2\u02e9\u02ea\7g\2\2\u02ea\u02eb\3\2\2"+
- "\2\u02eb\u02ec\b9\2\2\u02ecs\3\2\2\2\u02ed\u02ee\7u\2\2\u02ee\u02ef\7"+
- "j\2\2\u02ef\u02f0\7c\2\2\u02f0\u02f1\7t\2\2\u02f1\u02f2\7g\2\2\u02f2u"+
- "\3\2\2\2\u02f3\u02f4\7B\2\2\u02f4\u02f5\3\2\2\2\u02f5\u02f6\b;\2\2\u02f6"+
- "w\3\2\2\2\u02f7\u02f8\7\60\2\2\u02f8\u02f9\7\60\2\2\u02f9y\3\2\2\2\u02fa"+
- "\u02fb\7u\2\2\u02fb\u02fc\7j\2\2\u02fc\u02fd\7c\2\2\u02fd\u02fe\7t\2\2"+
- "\u02fe\u02ff\7g\2\2\u02ff\u0300\7f\2\2\u0300{\3\2\2\2\u0301\u0302\7g\2"+
- "\2\u0302\u0303\7z\2\2\u0303\u0304\7e\2\2\u0304\u0305\7n\2\2\u0305\u0306"+
- "\7w\2\2\u0306\u0307\7u\2\2\u0307\u0308\7k\2\2\u0308\u0309\7x\2\2\u0309"+
- "\u030a\7g\2\2\u030a}\3\2\2\2\u030b\u030c\7r\2\2\u030c\u030d\7t\2\2\u030d"+
- "\u030e\7g\2\2\u030e\u030f\7f\2\2\u030f\u0310\7k\2\2\u0310\u0311\7e\2\2"+
- "\u0311\u0312\7c\2\2\u0312\u0313\7v\2\2\u0313\u0314\7g\2\2\u0314\177\3"+
- "\2\2\2\u0315\u0316\7y\2\2\u0316\u0317\7t\2\2\u0317\u0318\7k\2\2\u0318"+
- "\u0319\7v\2\2\u0319\u031a\7g\2\2\u031a\u031b\7R\2\2\u031b\u031c\7g\2\2"+
- "\u031c\u031d\7t\2\2\u031d\u031e\7o\2\2\u031e\u031f\3\2\2\2\u031f\u0320"+
- "\b@\2\2\u0320\u0081\3\2\2\2\u0321\u0322\7p\2\2\u0322\u0323\7q\2\2\u0323"+
- "\u0324\7R\2\2\u0324\u0325\7g\2\2\u0325\u0326\7t\2\2\u0326\u0327\7o\2\2"+
- "\u0327\u0328\3\2\2\2\u0328\u0329\bA\2\2\u0329\u0083\3\2\2\2\u032a\u032b"+
- "\7v\2\2\u032b\u032c\7t\2\2\u032c\u032d\7w\2\2\u032d\u032e\7u\2\2\u032e"+
- "\u032f\7v\2\2\u032f\u0330\7g\2\2\u0330\u0331\7f\2\2\u0331\u0332\3\2\2"+
- "\2\u0332\u0333\bB\2\2\u0333\u0085\3\2\2\2\u0334\u0335\7q\2\2\u0335\u0336"+
- "\7w\2\2\u0336\u0337\7v\2\2\u0337\u0338\7n\2\2\u0338\u0339\7k\2\2\u0339"+
- "\u033a\7p\2\2\u033a\u033b\7g\2\2\u033b\u0087\3\2\2\2\u033c\u033d\7k\2"+
- "\2\u033d\u033e\7p\2\2\u033e\u033f\7k\2\2\u033f\u0340\7v\2\2\u0340\u0341"+
- "\7G\2\2\u0341\u0342\7p\2\2\u0342\u0343\7u\2\2\u0343\u0344\7w\2\2\u0344"+
- "\u0345\7t\2\2\u0345\u0346\7g\2\2\u0346\u0347\7u\2\2\u0347\u0089\3\2\2"+
- "\2\u0348\u0349\7k\2\2\u0349\u034a\7o\2\2\u034a\u034b\7r\2\2\u034b\u034c"+
- "\7q\2\2\u034c\u034d\7t\2\2\u034d\u034e\7v\2\2\u034e\u034f\7T\2\2\u034f"+
- "\u0350\7g\2\2\u0350\u0351\7s\2\2\u0351\u0352\7w\2\2\u0352\u0353\7k\2\2"+
- "\u0353\u0354\7t\2\2\u0354\u0355\7g\2\2\u0355\u0356\7u\2\2\u0356\u008b"+
- "\3\2\2\2\u0357\u0358\7r\2\2\u0358\u0359\7t\2\2\u0359\u035a\7q\2\2\u035a"+
- "\u035b\7q\2\2\u035b\u035c\7h\2\2\u035c\u008d\3\2\2\2\u035d\u035e\7?\2"+
- "\2\u035e\u035f\7?\2\2\u035f\u0360\7?\2\2\u0360\u008f\3\2\2\2\u0361\u0362"+
- "\7#\2\2\u0362\u0363\7?\2\2\u0363\u0364\7?\2\2\u0364\u0091\3\2\2\2\u0365"+
- "\u0366\7y\2\2\u0366\u0367\7k\2\2\u0367\u0368\7v\2\2\u0368\u0369\7j\2\2"+
- "\u0369\u0093\3\2\2\2\u036a\u036b\7d\2\2\u036b\u036c\7t\2\2\u036c\u036d"+
- "\7g\2\2\u036d\u036e\7c\2\2\u036e\u036f\7m\2\2\u036f\u0370\3\2\2\2\u0370"+
- "\u0371\bJ\2\2\u0371\u0095\3\2\2\2\u0372\u0373\7f\2\2\u0373\u0374\7g\2"+
- "\2\u0374\u0375\7h\2\2\u0375\u0376\7c\2\2\u0376\u0377\7w\2\2\u0377\u0378"+
- "\7n\2\2\u0378\u0379\7v\2\2\u0379\u0097\3\2\2\2\u037a\u037b\7h\2\2\u037b"+
- "\u037c\7w\2\2\u037c\u037d\7p\2\2\u037d\u037e\7e\2\2\u037e\u0099\3\2\2"+
- "\2\u037f\u0380\7k\2\2\u0380\u0381\7p\2\2\u0381\u0382\7v\2\2\u0382\u0383"+
- "\7g\2\2\u0383\u0384\7t\2\2\u0384\u0385\7h\2\2\u0385\u0386\7c\2\2\u0386"+
- "\u0387\7e\2\2\u0387\u0388\7g\2\2\u0388\u009b\3\2\2\2\u0389\u038a\7u\2"+
- "\2\u038a\u038b\7g\2\2\u038b\u038c\7n\2\2\u038c\u038d\7g\2\2\u038d\u038e"+
- "\7e\2\2\u038e\u038f\7v\2\2\u038f\u009d\3\2\2\2\u0390\u0391\7e\2\2\u0391"+
- "\u0392\7c\2\2\u0392\u0393\7u\2\2\u0393\u0394\7g\2\2\u0394\u009f\3\2\2"+
- "\2\u0395\u0396\7f\2\2\u0396\u0397\7g\2\2\u0397\u0398\7h\2\2\u0398\u0399"+
- "\7g\2\2\u0399\u039a\7t\2\2\u039a\u00a1\3\2\2\2\u039b\u039c\7i\2\2\u039c"+
- "\u039d\7q\2\2\u039d\u00a3\3\2\2\2\u039e\u039f\7o\2\2\u039f\u03a0\7c\2"+
- "\2\u03a0\u03a1\7r\2\2\u03a1\u00a5\3\2\2\2\u03a2\u03a3\7u\2\2\u03a3\u03a4"+
- "\7v\2\2\u03a4\u03a5\7t\2\2\u03a5\u03a6\7w\2\2\u03a6\u03a7\7e\2\2\u03a7"+
- "\u03a8\7v\2\2\u03a8\u00a7\3\2\2\2\u03a9\u03aa\7e\2\2\u03aa\u03ab\7j\2"+
- "\2\u03ab\u03ac\7c\2\2\u03ac\u03ad\7p\2\2\u03ad\u00a9\3\2\2\2\u03ae\u03af"+
- "\7g\2\2\u03af\u03b0\7n\2\2\u03b0\u03b1\7u\2\2\u03b1\u03b2\7g\2\2\u03b2"+
- "\u00ab\3\2\2\2\u03b3\u03b4\7i\2\2\u03b4\u03b5\7q\2\2\u03b5\u03b6\7v\2"+
- "\2\u03b6\u03b7\7q\2\2\u03b7\u00ad\3\2\2\2\u03b8\u03b9\7r\2\2\u03b9\u03ba"+
- "\7c\2\2\u03ba\u03bb\7e\2\2\u03bb\u03bc\7m\2\2\u03bc\u03bd\7c\2\2\u03bd"+
- "\u03be\7i\2\2\u03be\u03bf\7g\2\2\u03bf\u00af\3\2\2\2\u03c0\u03c1\7u\2"+
- "\2\u03c1\u03c2\7y\2\2\u03c2\u03c3\7k\2\2\u03c3\u03c4\7v\2\2\u03c4\u03c5"+
- "\7e\2\2\u03c5\u03c6\7j\2\2\u03c6\u00b1\3\2\2\2\u03c7\u03c8\7e\2\2\u03c8"+
- "\u03c9\7q\2\2\u03c9\u03ca\7p\2\2\u03ca\u03cb\7u\2\2\u03cb\u03cc\7v\2\2"+
- "\u03cc\u00b3\3\2\2\2\u03cd\u03ce\7h\2\2\u03ce\u03cf\7c\2\2\u03cf\u03d0"+
- "\7n\2\2\u03d0\u03d1\7n\2\2\u03d1\u03d2\7v\2\2\u03d2\u03d3\7j\2\2\u03d3"+
- "\u03d4\7t\2\2\u03d4\u03d5\7q\2\2\u03d5\u03d6\7w\2\2\u03d6\u03d7\7i\2\2"+
- "\u03d7\u03d8\7j\2\2\u03d8\u03d9\3\2\2\2\u03d9\u03da\bZ\2\2\u03da\u00b5"+
- "\3\2\2\2\u03db\u03dc\7k\2\2\u03dc\u03dd\7h\2\2\u03dd\u00b7\3\2\2\2\u03de"+
- "\u03df\7t\2\2\u03df\u03e0\7c\2\2\u03e0\u03e1\7p\2\2\u03e1\u03e2\7i\2\2"+
- "\u03e2\u03e3\7g\2\2\u03e3\u00b9\3\2\2\2\u03e4\u03e5\7v\2\2\u03e5\u03e6"+
- "\7{\2\2\u03e6\u03e7\7r\2\2\u03e7\u03e8\7g\2\2\u03e8\u00bb\3\2\2\2\u03e9"+
- "\u03ea\7e\2\2\u03ea\u03eb\7q\2\2\u03eb\u03ec\7p\2\2\u03ec\u03ed\7v\2\2"+
- "\u03ed\u03ee\7k\2\2\u03ee\u03ef\7p\2\2\u03ef\u03f0\7w\2\2\u03f0\u03f1"+
- "\7g\2\2\u03f1\u03f2\3\2\2\2\u03f2\u03f3\b^\2\2\u03f3\u00bd\3\2\2\2\u03f4"+
- "\u03f5\7h\2\2\u03f5\u03f6\7q\2\2\u03f6\u03f7\7t\2\2\u03f7\u00bf\3\2\2"+
- "\2\u03f8\u03f9\7k\2\2\u03f9\u03fa\7o\2\2\u03fa\u03fb\7r\2\2\u03fb\u03fc"+
- "\7q\2\2\u03fc\u03fd\7t\2\2\u03fd\u03fe\7v\2\2\u03fe\u00c1\3\2\2\2\u03ff"+
- "\u0400\7t\2\2\u0400\u0401\7g\2\2\u0401\u0402\7v\2\2\u0402\u0403\7w\2\2"+
- "\u0403\u0404\7t\2\2\u0404\u0405\7p\2\2\u0405\u0406\3\2\2\2\u0406\u0407"+
- "\ba\2\2\u0407\u00c3\3\2\2\2\u0408\u0409\7x\2\2\u0409\u040a\7c\2\2\u040a"+
- "\u040b\7t\2\2\u040b\u00c5\3\2\2\2\u040c\u040d\7p\2\2\u040d\u040e\7k\2"+
- "\2\u040e\u040f\7n\2\2\u040f\u0410\3\2\2\2\u0410\u0411\bc\2\2\u0411\u00c7"+
- "\3\2\2\2\u0412\u0417\5\u014a\u00a5\2\u0413\u0416\5\u014a\u00a5\2\u0414"+
- "\u0416\5\u014c\u00a6\2\u0415\u0413\3\2\2\2\u0415\u0414\3\2\2\2\u0416\u0419"+
- "\3\2\2\2\u0417\u0415\3\2\2\2\u0417\u0418\3\2\2\2\u0418\u041a\3\2\2\2\u0419"+
- "\u0417\3\2\2\2\u041a\u041b\bd\2\2\u041b\u00c9\3\2\2\2\u041c\u041d\7*\2"+
- "\2\u041d\u00cb\3\2\2\2\u041e\u041f\7+\2\2\u041f\u0420\3\2\2\2\u0420\u0421"+
- "\bf\2\2\u0421\u00cd\3\2\2\2\u0422\u0423\7}\2\2\u0423\u00cf\3\2\2\2\u0424"+
- "\u0425\7\177\2\2\u0425\u0426\3\2\2\2\u0426\u0427\bh\2\2\u0427\u00d1\3"+
- "\2\2\2\u0428\u0429\7]\2\2\u0429\u00d3\3\2\2\2\u042a\u042b\7_\2\2\u042b"+
- "\u042c\3\2\2\2\u042c\u042d\bj\2\2\u042d\u00d5\3\2\2\2\u042e\u042f\7?\2"+
- "\2\u042f\u00d7\3\2\2\2\u0430\u0431\7.\2\2\u0431\u00d9\3\2\2\2\u0432\u0433"+
- "\7=\2\2\u0433\u00db\3\2\2\2\u0434\u0435\7<\2\2\u0435\u00dd\3\2\2\2\u0436"+
- "\u0437\7\60\2\2\u0437\u00df\3\2\2\2\u0438\u0439\7-\2\2\u0439\u043a\7-"+
- "\2\2\u043a\u043b\3\2\2\2\u043b\u043c\bp\2\2\u043c\u00e1\3\2\2\2\u043d"+
- "\u043e\7/\2\2\u043e\u043f\7/\2\2\u043f\u0440\3\2\2\2\u0440\u0441\bq\2"+
- "\2\u0441\u00e3\3\2\2\2\u0442\u0443\7<\2\2\u0443\u0444\7?\2\2\u0444\u00e5"+
- "\3\2\2\2\u0445\u0446\7\60\2\2\u0446\u0447\7\60\2\2\u0447\u0448\7\60\2"+
- "\2\u0448\u00e7\3\2\2\2\u0449\u044a\7~\2\2\u044a\u044b\7~\2\2\u044b\u00e9"+
- "\3\2\2\2\u044c\u044d\7(\2\2\u044d\u044e\7(\2\2\u044e\u00eb\3\2\2\2\u044f"+
- "\u0450\7?\2\2\u0450\u0451\7?\2\2\u0451\u00ed\3\2\2\2\u0452\u0453\7#\2"+
- "\2\u0453\u0454\7?\2\2\u0454\u00ef\3\2\2\2\u0455\u0456\7>\2\2\u0456\u00f1"+
- "\3\2\2\2\u0457\u0458\7>\2\2\u0458\u0459\7?\2\2\u0459\u00f3\3\2\2\2\u045a"+
- "\u045b\7@\2\2\u045b\u00f5\3\2\2\2\u045c\u045d\7@\2\2\u045d\u045e\7?\2"+
- "\2\u045e\u00f7\3\2\2\2\u045f\u0460\7~\2\2\u0460\u00f9\3\2\2\2\u0461\u0462"+
- "\7\61\2\2\u0462\u00fb\3\2\2\2\u0463\u0464\7\'\2\2\u0464\u00fd\3\2\2\2"+
- "\u0465\u0466\7>\2\2\u0466\u0467\7>\2\2\u0467\u00ff\3\2\2\2\u0468\u0469"+
- "\7@\2\2\u0469\u046a\7@\2\2\u046a\u0101\3\2\2\2\u046b\u046c\7(\2\2\u046c"+
- "\u046d\7`\2\2\u046d\u0103\3\2\2\2\u046e\u046f\7#\2\2\u046f\u0105\3\2\2"+
- "\2\u0470\u0471\7-\2\2\u0471\u0107\3\2\2\2\u0472\u0473\7/\2\2\u0473\u0109"+
- "\3\2\2\2\u0474\u0475\7`\2\2\u0475\u010b\3\2\2\2\u0476\u0477\7,\2\2\u0477"+
- "\u010d\3\2\2\2\u0478\u0479\7(\2\2\u0479\u010f\3\2\2\2\u047a\u047b\7>\2"+
- "\2\u047b\u047c\7/\2\2\u047c\u0111\3\2\2\2\u047d\u0489\7\62\2\2\u047e\u0485"+
- "\t\2\2\2\u047f\u0481\7a\2\2\u0480\u047f\3\2\2\2\u0480\u0481\3\2\2\2\u0481"+
- "\u0482\3\2\2\2\u0482\u0484\t\3\2\2\u0483\u0480\3\2\2\2\u0484\u0487\3\2"+
- "\2\2\u0485\u0483\3\2\2\2\u0485\u0486\3\2\2\2\u0486\u0489\3\2\2\2\u0487"+
- "\u0485\3\2\2\2\u0488\u047d\3\2\2\2\u0488\u047e\3\2\2\2\u0489\u048a\3\2"+
- "\2\2\u048a\u048b\b\u0089\2\2\u048b\u0113\3\2\2\2\u048c\u048d\7\62\2\2"+
- "\u048d\u0492\t\4\2\2\u048e\u0490\7a\2\2\u048f\u048e\3\2\2\2\u048f\u0490"+
- "\3\2\2\2\u0490\u0491\3\2\2\2\u0491\u0493\5\u0146\u00a3\2\u0492\u048f\3"+
- "\2\2\2\u0493\u0494\3\2\2\2\u0494\u0492\3\2\2\2\u0494\u0495\3\2\2\2\u0495"+
- "\u0496\3\2\2\2\u0496\u0497\b\u008a\2\2\u0497\u0115\3\2\2\2\u0498\u049a"+
- "\7\62\2\2\u0499\u049b\t\5\2\2\u049a\u0499\3\2\2\2\u049a\u049b\3\2\2\2"+
- "\u049b\u04a0\3\2\2\2\u049c\u049e\7a\2\2\u049d\u049c\3\2\2\2\u049d\u049e"+
- "\3\2\2\2\u049e\u049f\3\2\2\2\u049f\u04a1\5\u0142\u00a1\2\u04a0\u049d\3"+
- "\2\2\2\u04a1\u04a2\3\2\2\2\u04a2\u04a0\3\2\2\2\u04a2\u04a3\3\2\2\2\u04a3"+
- "\u04a4\3\2\2\2\u04a4\u04a5\b\u008b\2\2\u04a5\u0117\3\2\2\2\u04a6\u04a7"+
- "\7\62\2\2\u04a7\u04ac\t\6\2\2\u04a8\u04aa\7a\2\2\u04a9\u04a8\3\2\2\2\u04a9"+
- "\u04aa\3\2\2\2\u04aa\u04ab\3\2\2\2\u04ab\u04ad\5\u0144\u00a2\2\u04ac\u04a9"+
- "\3\2\2\2\u04ad\u04ae\3\2\2\2\u04ae\u04ac\3\2\2\2\u04ae\u04af\3\2\2\2\u04af"+
- "\u04b0\3\2\2\2\u04b0\u04b1\b\u008c\2\2\u04b1\u0119\3\2\2\2\u04b2\u04b3"+
- "\7\62\2\2\u04b3\u04b4\t\6\2\2\u04b4\u04b5\5\u011c\u008e\2\u04b5\u04b6"+
- "\5\u011e\u008f\2\u04b6\u011b\3\2\2\2\u04b7\u04b9\7a\2\2\u04b8\u04b7\3"+
- "\2\2\2\u04b8\u04b9\3\2\2\2\u04b9\u04ba\3\2\2\2\u04ba\u04bc\5\u0144\u00a2"+
- "\2\u04bb\u04b8\3\2\2\2\u04bc\u04bd\3\2\2\2\u04bd\u04bb\3\2\2\2\u04bd\u04be"+
- "\3\2\2\2\u04be\u04c9\3\2\2\2\u04bf\u04c6\7\60\2\2\u04c0\u04c2\7a\2\2\u04c1"+
- "\u04c0\3\2\2\2\u04c1\u04c2\3\2\2\2\u04c2\u04c3\3\2\2\2\u04c3\u04c5\5\u0144"+
- "\u00a2\2\u04c4\u04c1\3\2\2\2\u04c5\u04c8\3\2\2\2\u04c6\u04c4\3\2\2\2\u04c6"+
- "\u04c7\3\2\2\2\u04c7\u04ca\3\2\2\2\u04c8\u04c6\3\2\2\2\u04c9\u04bf\3\2"+
- "\2\2\u04c9\u04ca\3\2\2\2\u04ca\u04d7\3\2\2\2\u04cb\u04cc\7\60\2\2\u04cc"+
- "\u04d3\5\u0144\u00a2\2\u04cd\u04cf\7a\2\2\u04ce\u04cd\3\2\2\2\u04ce\u04cf"+
- "\3\2\2\2\u04cf\u04d0\3\2\2\2\u04d0\u04d2\5\u0144\u00a2\2\u04d1\u04ce\3"+
- "\2\2\2\u04d2\u04d5\3\2\2\2\u04d3\u04d1\3\2\2\2\u04d3\u04d4\3\2\2\2\u04d4"+
- "\u04d7\3\2\2\2\u04d5\u04d3\3\2\2\2\u04d6\u04bb\3\2\2\2\u04d6\u04cb\3\2"+
- "\2\2\u04d7\u011d\3\2\2\2\u04d8\u04d9\t\7\2\2\u04d9\u04da\t\b\2\2\u04da"+
- "\u04db\5\u0140\u00a0\2\u04db\u011f\3\2\2\2\u04dc\u04e2\5\u0112\u0089\2"+
- "\u04dd\u04e2\5\u0114\u008a\2\u04de\u04e2\5\u0116\u008b\2\u04df\u04e2\5"+
- "\u0118\u008c\2\u04e0\u04e2\5\4\2\2\u04e1\u04dc\3\2\2\2\u04e1\u04dd\3\2"+
- "\2\2\u04e1\u04de\3\2\2\2\u04e1\u04df\3\2\2\2\u04e1\u04e0\3\2\2\2\u04e2"+
- "\u04e3\3\2\2\2\u04e3\u04e4\7k\2\2\u04e4\u04e5\3\2\2\2\u04e5\u04e6\b\u0090"+
- "\2\2\u04e6\u0121\3\2\2\2\u04e7\u04ea\7)\2\2\u04e8\u04eb\5\u013c\u009e"+
- "\2\u04e9\u04eb\5\u0126\u0093\2\u04ea\u04e8\3\2\2\2\u04ea\u04e9\3\2\2\2"+
- "\u04eb\u04ec\3\2\2\2\u04ec\u04ed\7)\2\2\u04ed\u0123\3\2\2\2\u04ee\u04ef"+
- "\5\u0122\u0091\2\u04ef\u04f0\3\2\2\2\u04f0\u04f1\b\u0092\2\2\u04f1\u0125"+
- "\3\2\2\2\u04f2\u04f5\5\u0128\u0094\2\u04f3\u04f5\5\u012a\u0095\2\u04f4"+
- "\u04f2\3\2\2\2\u04f4\u04f3\3\2\2\2\u04f5\u0127\3\2\2\2\u04f6\u04f7\7^"+
- "\2\2\u04f7\u04f8\5\u0142\u00a1\2\u04f8\u04f9\5\u0142\u00a1\2\u04f9\u04fa"+
- "\5\u0142\u00a1\2\u04fa\u0129\3\2\2\2\u04fb\u04fc\7^\2\2\u04fc\u04fd\7"+
- "z\2\2\u04fd\u04fe\5\u0144\u00a2\2\u04fe\u04ff\5\u0144\u00a2\2\u04ff\u012b"+
- "\3\2\2\2\u0500\u0501\7^\2\2\u0501\u0502\7w\2\2\u0502\u0503\5\u0144\u00a2"+
- "\2\u0503\u0504\5\u0144\u00a2\2\u0504\u0505\5\u0144\u00a2\2\u0505\u0506"+
- "\5\u0144\u00a2\2\u0506\u012d\3\2\2\2\u0507\u0508\7^\2\2\u0508\u0509\7"+
- "W\2\2\u0509\u050a\5\u0144\u00a2\2\u050a\u050b\5\u0144\u00a2\2\u050b\u050c"+
- "\5\u0144\u00a2\2\u050c\u050d\5\u0144\u00a2\2\u050d\u050e\5\u0144\u00a2"+
- "\2\u050e\u050f\5\u0144\u00a2\2\u050f\u0510\5\u0144\u00a2\2\u0510\u0511"+
- "\5\u0144\u00a2\2\u0511\u012f\3\2\2\2\u0512\u0516\7b\2\2\u0513\u0515\n"+
- "\t\2\2\u0514\u0513\3\2\2\2\u0515\u0518\3\2\2\2\u0516\u0514\3\2\2\2\u0516"+
- "\u0517\3\2\2\2\u0517\u0519\3\2\2\2\u0518\u0516\3\2\2\2\u0519\u051a\7b"+
- "\2\2\u051a\u051b\3\2\2\2\u051b\u051c\b\u0098\2\2\u051c\u0131\3\2\2\2\u051d"+
- "\u0522\7$\2\2\u051e\u0521\n\n\2\2\u051f\u0521\5\u013e\u009f\2\u0520\u051e"+
- "\3\2\2\2\u0520\u051f\3\2\2\2\u0521\u0524\3\2\2\2\u0522\u0520\3\2\2\2\u0522"+
- "\u0523\3\2\2\2\u0523\u0525\3\2\2\2\u0524\u0522\3\2\2\2\u0525\u0526\7$"+
- "\2\2\u0526\u0527\3\2\2\2\u0527\u0528\b\u0099\2\2\u0528\u0133\3\2\2\2\u0529"+
- "\u052b\t\13\2\2\u052a\u0529\3\2\2\2\u052b\u052c\3\2\2\2\u052c\u052a\3"+
- "\2\2\2\u052c\u052d\3\2\2\2\u052d\u052e\3\2\2\2\u052e\u052f\b\u009a\3\2"+
- "\u052f\u0135\3\2\2\2\u0530\u0531\7\61\2\2\u0531\u0532\7,\2\2\u0532\u0536"+
- "\3\2\2\2\u0533\u0535\13\2\2\2\u0534\u0533\3\2\2\2\u0535\u0538\3\2\2\2"+
- "\u0536\u0537\3\2\2\2\u0536\u0534\3\2\2\2\u0537\u0539\3\2\2\2\u0538\u0536"+
- "\3\2\2\2\u0539\u053a\7,\2\2\u053a\u053b\7\61\2\2\u053b\u053c\3\2\2\2\u053c"+
- "\u053d\b\u009b\3\2\u053d\u0137\3\2\2\2\u053e\u0540\t\f\2\2\u053f\u053e"+
- "\3\2\2\2\u0540\u0541\3\2\2\2\u0541\u053f\3\2\2\2\u0541\u0542\3\2\2\2\u0542"+
- "\u0543\3\2\2\2\u0543\u0544\b\u009c\3\2\u0544\u0139\3\2\2\2\u0545\u0546"+
- "\7\61\2\2\u0546\u0547\7\61\2\2\u0547\u054b\3\2\2\2\u0548\u054a\n\f\2\2"+
- "\u0549\u0548\3\2\2\2\u054a\u054d\3\2\2\2\u054b\u0549\3\2\2\2\u054b\u054c"+
- "\3\2\2\2\u054c\u054e\3\2\2\2\u054d\u054b\3\2\2\2\u054e\u054f\b\u009d\3"+
- "\2\u054f\u013b\3\2\2\2\u0550\u0555\n\r\2\2\u0551\u0555\5\u012c\u0096\2"+
- "\u0552\u0555\5\u012e\u0097\2\u0553\u0555\5\u013e\u009f\2\u0554\u0550\3"+
- "\2\2\2\u0554\u0551\3\2\2\2\u0554\u0552\3\2\2\2\u0554\u0553\3\2\2\2\u0555"+
- "\u013d\3\2\2\2\u0556\u0570\7^\2\2\u0557\u0558\7w\2\2\u0558\u0559\5\u0144"+
- "\u00a2\2\u0559\u055a\5\u0144\u00a2\2\u055a\u055b\5\u0144\u00a2\2\u055b"+
- "\u055c\5\u0144\u00a2\2\u055c\u0571\3\2\2\2\u055d\u055e\7W\2\2\u055e\u055f"+
- "\5\u0144\u00a2\2\u055f\u0560\5\u0144\u00a2\2\u0560\u0561\5\u0144\u00a2"+
- "\2\u0561\u0562\5\u0144\u00a2\2\u0562\u0563\5\u0144\u00a2\2\u0563\u0564"+
- "\5\u0144\u00a2\2\u0564\u0565\5\u0144\u00a2\2\u0565\u0566\5\u0144\u00a2"+
- "\2\u0566\u0571\3\2\2\2\u0567\u0571\t\16\2\2\u0568\u0569\5\u0142\u00a1"+
- "\2\u0569\u056a\5\u0142\u00a1\2\u056a\u056b\5\u0142\u00a1\2\u056b\u0571"+
- "\3\2\2\2\u056c\u056d\7z\2\2\u056d\u056e\5\u0144\u00a2\2\u056e\u056f\5"+
- "\u0144\u00a2\2\u056f\u0571\3\2\2\2\u0570\u0557\3\2\2\2\u0570\u055d\3\2"+
- "\2\2\u0570\u0567\3\2\2\2\u0570\u0568\3\2\2\2\u0570\u056c\3\2\2\2\u0571"+
- "\u013f\3\2\2\2\u0572\u0579\t\3\2\2\u0573\u0575\7a\2\2\u0574\u0573\3\2"+
- "\2\2\u0574\u0575\3\2\2\2\u0575\u0576\3\2\2\2\u0576\u0578\t\3\2\2\u0577"+
- "\u0574\3\2\2\2\u0578\u057b\3\2\2\2\u0579\u0577\3\2\2\2\u0579\u057a\3\2"+
- "\2\2\u057a\u0141\3\2\2\2\u057b\u0579\3\2\2\2\u057c\u057d\t\17\2\2\u057d"+
- "\u0143\3\2\2\2\u057e\u057f\t\20\2\2\u057f\u0145\3\2\2\2\u0580\u0581\t"+
- "\21\2\2\u0581\u0147\3\2\2\2\u0582\u0584\t\22\2\2\u0583\u0585\t\b\2\2\u0584"+
- "\u0583\3\2\2\2\u0584\u0585\3\2\2\2\u0585\u0586\3\2\2\2\u0586\u0587\5\u0140"+
- "\u00a0\2\u0587\u0149\3\2\2\2\u0588\u058b\5\u014e\u00a7\2\u0589\u058b\7"+
- "a\2\2\u058a\u0588\3\2\2\2\u058a\u0589\3\2\2\2\u058b\u014b\3\2\2\2\u058c"+
- "\u058d\t\23\2\2\u058d\u014d\3\2\2\2\u058e\u058f\t\24\2\2\u058f\u014f\3"+
- "\2\2\2\u0590\u0592\t\13\2\2\u0591\u0590\3\2\2\2\u0592\u0593\3\2\2\2\u0593"+
- "\u0591\3\2\2\2\u0593\u0594\3\2\2\2\u0594\u0595\3\2\2\2\u0595\u0596\b\u00a8"+
- "\3\2\u0596\u0151\3\2\2\2\u0597\u0598\7\61\2\2\u0598\u0599\7,\2\2\u0599"+
- "\u059d\3\2\2\2\u059a\u059c\n\f\2\2\u059b\u059a\3\2\2\2\u059c\u059f\3\2"+
- "\2\2\u059d\u059e\3\2\2\2\u059d\u059b\3\2\2\2\u059e\u05a0\3\2\2\2\u059f"+
- "\u059d\3\2\2\2\u05a0\u05a1\7,\2\2\u05a1\u05a2\7\61\2\2\u05a2\u05a3\3\2"+
- "\2\2\u05a3\u05a4\b\u00a9\3\2\u05a4\u0153\3\2\2\2\u05a5\u05a6\7\61\2\2"+
- "\u05a6\u05a7\7\61\2\2\u05a7\u05ab\3\2\2\2\u05a8\u05aa\n\f\2\2\u05a9\u05a8"+
- "\3\2\2\2\u05aa\u05ad\3\2\2\2\u05ab\u05a9\3\2\2\2\u05ab\u05ac\3\2\2\2\u05ac"+
- "\u05ae\3\2\2\2\u05ad\u05ab\3\2\2\2\u05ae\u05af\b\u00aa\3\2\u05af\u0155"+
- "\3\2\2\2\u05b0\u05b2\t\f\2\2\u05b1\u05b0\3\2\2\2\u05b2\u05b3\3\2\2\2\u05b3"+
- "\u05b1\3\2\2\2\u05b3\u05b4\3\2\2\2\u05b4\u05c3\3\2\2\2\u05b5\u05c3\7="+
- "\2\2\u05b6\u05b7\7\61\2\2\u05b7\u05b8\7,\2\2\u05b8\u05bc\3\2\2\2\u05b9"+
- "\u05bb\13\2\2\2\u05ba\u05b9\3\2\2\2\u05bb\u05be\3\2\2\2\u05bc\u05bd\3"+
- "\2\2\2\u05bc\u05ba\3\2\2\2\u05bd\u05bf\3\2\2\2\u05be\u05bc\3\2\2\2\u05bf"+
- "\u05c0\7,\2\2\u05c0\u05c3\7\61\2\2\u05c1\u05c3\7\2\2\3\u05c2\u05b1\3\2"+
- "\2\2\u05c2\u05b5\3\2\2\2\u05c2\u05b6\3\2\2\2\u05c2\u05c1\3\2\2\2\u05c3"+
- "\u05c4\3\2\2\2\u05c4\u05c5\b\u00ab\4\2\u05c5\u0157\3\2\2\2\u05c6\u05c7"+
- "\3\2\2\2\u05c7\u05c8\3\2\2\2\u05c8\u05c9\b\u00ac\4\2\u05c9\u05ca\b\u00ac"+
- "\3\2\u05ca\u0159\3\2\2\2\64\2\3\u015c\u0164\u0167\u016a\u0170\u0172\u0415"+
- "\u0417\u0480\u0485\u0488\u048f\u0494\u049a\u049d\u04a2\u04a9\u04ae\u04b8"+
- "\u04bd\u04c1\u04c6\u04c9\u04ce\u04d3\u04d6\u04e1\u04ea\u04f4\u0516\u0520"+
- "\u0522\u052c\u0536\u0541\u054b\u0554\u0570\u0574\u0579\u0584\u058a\u0593"+
- "\u059d\u05ab\u05b3\u05bc\u05c2\5\4\3\2\2\3\2\4\2\2";
+ "\4\u00a9\t\u00a9\4\u00aa\t\u00aa\4\u00ab\t\u00ab\4\u00ac\t\u00ac\4\u00ad"+
+ "\t\u00ad\3\2\3\2\5\2\u015f\n\2\3\2\3\2\3\3\3\3\3\3\3\3\5\3\u0167\n\3\3"+
+ "\3\5\3\u016a\n\3\3\3\5\3\u016d\n\3\3\3\3\3\3\3\3\3\5\3\u0173\n\3\5\3\u0175"+
+ "\n\3\3\4\3\4\3\4\3\4\3\4\3\4\3\4\3\5\3\5\3\5\3\5\3\5\3\5\3\5\3\5\3\6\3"+
+ "\6\3\6\3\6\3\6\3\6\3\6\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\b\3\b\3\b\3\b\3\b"+
+ "\3\b\3\b\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3"+
+ "\n\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3\f\3\f\3\f\3\f\3"+
+ "\f\3\f\3\f\3\f\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\16\3\16\3\16"+
+ "\3\16\3\16\3\16\3\16\3\16\3\16\3\16\3\16\3\16\3\17\3\17\3\17\3\17\3\17"+
+ "\3\17\3\17\3\20\3\20\3\20\3\20\3\20\3\20\3\20\3\20\3\20\3\20\3\20\3\21"+
+ "\3\21\3\21\3\22\3\22\3\22\3\22\3\22\3\22\3\23\3\23\3\23\3\23\3\23\3\23"+
+ "\3\23\3\23\3\23\3\24\3\24\3\24\3\24\3\24\3\25\3\25\3\25\3\25\3\25\3\25"+
+ "\3\25\3\26\3\26\3\26\3\26\3\26\3\26\3\26\3\27\3\27\3\27\3\27\3\27\3\27"+
+ "\3\30\3\30\3\30\3\30\3\30\3\31\3\31\3\31\3\31\3\31\3\31\3\31\3\32\3\32"+
+ "\3\32\3\32\3\32\3\32\3\32\3\32\3\32\3\32\3\33\3\33\3\33\3\33\3\33\3\33"+
+ "\3\34\3\34\3\34\3\35\3\35\3\36\3\36\3\36\3\36\3\36\3\36\3\36\3\37\3\37"+
+ "\3\37\3\37\3\37\3\37\3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3!\3!\3!\3"+
+ "!\3!\3!\3!\3!\3!\3\"\3\"\3\"\3\"\3#\3#\3#\3#\3$\3$\3$\3$\3$\3$\3%\3%\3"+
+ "&\3&\3&\3\'\3\'\3\'\3\'\3\'\3(\3(\3(\3(\3(\3(\3)\3)\3)\3)\3)\3)\3*\3*"+
+ "\3*\3*\3*\3*\3*\3+\3+\3+\3+\3+\3+\3+\3,\3,\3,\3,\3,\3,\3,\3,\3,\3-\3-"+
+ "\3-\3-\3-\3-\3.\3.\3.\3.\3.\3.\3/\3/\3/\3/\3/\3/\3/\3\60\3\60\3\60\3\60"+
+ "\3\60\3\60\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\62\3\62\3\62\3\62\3\62"+
+ "\3\62\3\63\3\63\3\63\3\63\3\63\3\63\3\63\3\63\3\63\3\64\3\64\3\64\3\64"+
+ "\3\64\3\64\3\64\3\64\3\65\3\65\3\65\3\65\3\65\3\65\3\66\3\66\3\66\3\66"+
+ "\3\66\3\66\3\66\3\66\3\67\3\67\3\67\3\67\3\67\3\67\3\67\38\38\38\38\3"+
+ "8\39\39\39\39\39\39\39\39\39\3:\3:\3:\3:\3:\3:\3:\3:\3:\3:\3:\3:\3:\3"+
+ ":\3:\3;\3;\3;\3;\3;\3;\3<\3<\3<\3<\3=\3=\3=\3>\3>\3>\3>\3>\3>\3>\3?\3"+
+ "?\3?\3?\3?\3?\3?\3?\3?\3?\3@\3@\3@\3@\3@\3@\3@\3@\3@\3@\3A\3A\3A\3A\3"+
+ "A\3A\3A\3A\3A\3A\3A\3A\3B\3B\3B\3B\3B\3B\3B\3B\3B\3C\3C\3C\3C\3C\3C\3"+
+ "C\3C\3C\3C\3D\3D\3D\3D\3D\3D\3D\3D\3E\3E\3E\3E\3E\3E\3E\3E\3E\3E\3E\3"+
+ "E\3F\3F\3F\3F\3F\3F\3F\3F\3F\3F\3F\3F\3F\3F\3F\3G\3G\3G\3G\3G\3G\3H\3"+
+ "H\3H\3H\3I\3I\3I\3I\3J\3J\3J\3J\3J\3K\3K\3K\3K\3K\3K\3K\3K\3L\3L\3L\3"+
+ "L\3L\3L\3L\3L\3M\3M\3M\3M\3M\3N\3N\3N\3N\3N\3N\3N\3N\3N\3N\3O\3O\3O\3"+
+ "O\3O\3O\3O\3P\3P\3P\3P\3P\3Q\3Q\3Q\3Q\3Q\3Q\3R\3R\3R\3S\3S\3S\3S\3T\3"+
+ "T\3T\3T\3T\3T\3T\3U\3U\3U\3U\3U\3V\3V\3V\3V\3V\3W\3W\3W\3W\3W\3X\3X\3"+
+ "X\3X\3X\3X\3X\3X\3Y\3Y\3Y\3Y\3Y\3Y\3Y\3Z\3Z\3Z\3Z\3Z\3Z\3[\3[\3[\3[\3"+
+ "[\3[\3[\3[\3[\3[\3[\3[\3[\3[\3\\\3\\\3\\\3]\3]\3]\3]\3]\3]\3^\3^\3^\3"+
+ "^\3^\3_\3_\3_\3_\3_\3_\3_\3_\3_\3_\3_\3`\3`\3`\3`\3a\3a\3a\3a\3a\3a\3"+
+ "a\3b\3b\3b\3b\3b\3b\3b\3b\3b\3c\3c\3c\3c\3d\3d\3d\3d\3d\3d\3e\3e\3e\7"+
+ "e\u0420\ne\fe\16e\u0423\13e\3e\3e\3f\3f\3g\3g\3g\3g\3h\3h\3i\3i\3i\3i"+
+ "\3j\3j\3k\3k\3k\3k\3l\3l\3m\3m\3n\3n\3o\3o\3p\3p\3q\3q\3q\3q\3q\3r\3r"+
+ "\3r\3r\3r\3s\3s\3s\3t\3t\3t\3t\3u\3u\3u\3v\3v\3v\3w\3w\3w\3x\3x\3x\3y"+
+ "\3y\3z\3z\3z\3{\3{\3|\3|\3|\3}\3}\3~\3~\3\177\3\177\3\u0080\3\u0080\3"+
+ "\u0080\3\u0081\3\u0081\3\u0081\3\u0082\3\u0082\3\u0082\3\u0083\3\u0083"+
+ "\3\u0084\3\u0084\3\u0085\3\u0085\3\u0086\3\u0086\3\u0087\3\u0087\3\u0088"+
+ "\3\u0088\3\u0089\3\u0089\3\u0089\3\u008a\3\u008a\3\u008a\5\u008a\u048b"+
+ "\n\u008a\3\u008a\7\u008a\u048e\n\u008a\f\u008a\16\u008a\u0491\13\u008a"+
+ "\5\u008a\u0493\n\u008a\3\u008a\3\u008a\3\u008b\3\u008b\3\u008b\5\u008b"+
+ "\u049a\n\u008b\3\u008b\6\u008b\u049d\n\u008b\r\u008b\16\u008b\u049e\3"+
+ "\u008b\3\u008b\3\u008c\3\u008c\5\u008c\u04a5\n\u008c\3\u008c\5\u008c\u04a8"+
+ "\n\u008c\3\u008c\6\u008c\u04ab\n\u008c\r\u008c\16\u008c\u04ac\3\u008c"+
+ "\3\u008c\3\u008d\3\u008d\3\u008d\5\u008d\u04b4\n\u008d\3\u008d\6\u008d"+
+ "\u04b7\n\u008d\r\u008d\16\u008d\u04b8\3\u008d\3\u008d\3\u008e\3\u008e"+
+ "\3\u008e\3\u008e\3\u008e\3\u008f\5\u008f\u04c3\n\u008f\3\u008f\6\u008f"+
+ "\u04c6\n\u008f\r\u008f\16\u008f\u04c7\3\u008f\3\u008f\5\u008f\u04cc\n"+
+ "\u008f\3\u008f\7\u008f\u04cf\n\u008f\f\u008f\16\u008f\u04d2\13\u008f\5"+
+ "\u008f\u04d4\n\u008f\3\u008f\3\u008f\3\u008f\5\u008f\u04d9\n\u008f\3\u008f"+
+ "\7\u008f\u04dc\n\u008f\f\u008f\16\u008f\u04df\13\u008f\5\u008f\u04e1\n"+
+ "\u008f\3\u0090\3\u0090\3\u0090\3\u0090\3\u0091\3\u0091\3\u0091\3\u0091"+
+ "\3\u0091\5\u0091\u04ec\n\u0091\3\u0091\3\u0091\3\u0091\3\u0091\3\u0092"+
+ "\3\u0092\3\u0092\5\u0092\u04f5\n\u0092\3\u0092\3\u0092\3\u0093\3\u0093"+
+ "\3\u0093\3\u0093\3\u0094\3\u0094\5\u0094\u04ff\n\u0094\3\u0095\3\u0095"+
+ "\3\u0095\3\u0095\3\u0095\3\u0096\3\u0096\3\u0096\3\u0096\3\u0096\3\u0097"+
+ "\3\u0097\3\u0097\3\u0097\3\u0097\3\u0097\3\u0097\3\u0098\3\u0098\3\u0098"+
+ "\3\u0098\3\u0098\3\u0098\3\u0098\3\u0098\3\u0098\3\u0098\3\u0098\3\u0099"+
+ "\3\u0099\7\u0099\u051f\n\u0099\f\u0099\16\u0099\u0522\13\u0099\3\u0099"+
+ "\3\u0099\3\u0099\3\u0099\3\u009a\3\u009a\3\u009a\7\u009a\u052b\n\u009a"+
+ "\f\u009a\16\u009a\u052e\13\u009a\3\u009a\3\u009a\3\u009a\3\u009a\3\u009b"+
+ "\6\u009b\u0535\n\u009b\r\u009b\16\u009b\u0536\3\u009b\3\u009b\3\u009c"+
+ "\3\u009c\3\u009c\3\u009c\7\u009c\u053f\n\u009c\f\u009c\16\u009c\u0542"+
+ "\13\u009c\3\u009c\3\u009c\3\u009c\3\u009c\3\u009c\3\u009d\6\u009d\u054a"+
+ "\n\u009d\r\u009d\16\u009d\u054b\3\u009d\3\u009d\3\u009e\3\u009e\3\u009e"+
+ "\3\u009e\7\u009e\u0554\n\u009e\f\u009e\16\u009e\u0557\13\u009e\3\u009e"+
+ "\3\u009e\3\u009f\3\u009f\3\u009f\3\u009f\5\u009f\u055f\n\u009f\3\u00a0"+
+ "\3\u00a0\3\u00a0\3\u00a0\3\u00a0\3\u00a0\3\u00a0\3\u00a0\3\u00a0\3\u00a0"+
+ "\3\u00a0\3\u00a0\3\u00a0\3\u00a0\3\u00a0\3\u00a0\3\u00a0\3\u00a0\3\u00a0"+
+ "\3\u00a0\3\u00a0\3\u00a0\3\u00a0\3\u00a0\3\u00a0\3\u00a0\5\u00a0\u057b"+
+ "\n\u00a0\3\u00a1\3\u00a1\5\u00a1\u057f\n\u00a1\3\u00a1\7\u00a1\u0582\n"+
+ "\u00a1\f\u00a1\16\u00a1\u0585\13\u00a1\3\u00a2\3\u00a2\3\u00a3\3\u00a3"+
+ "\3\u00a4\3\u00a4\3\u00a5\3\u00a5\5\u00a5\u058f\n\u00a5\3\u00a5\3\u00a5"+
+ "\3\u00a6\3\u00a6\5\u00a6\u0595\n\u00a6\3\u00a7\3\u00a7\3\u00a8\3\u00a8"+
+ "\3\u00a9\6\u00a9\u059c\n\u00a9\r\u00a9\16\u00a9\u059d\3\u00a9\3\u00a9"+
+ "\3\u00aa\3\u00aa\3\u00aa\3\u00aa\7\u00aa\u05a6\n\u00aa\f\u00aa\16\u00aa"+
+ "\u05a9\13\u00aa\3\u00aa\3\u00aa\3\u00aa\3\u00aa\3\u00aa\3\u00ab\3\u00ab"+
+ "\3\u00ab\3\u00ab\7\u00ab\u05b4\n\u00ab\f\u00ab\16\u00ab\u05b7\13\u00ab"+
+ "\3\u00ab\3\u00ab\3\u00ac\6\u00ac\u05bc\n\u00ac\r\u00ac\16\u00ac\u05bd"+
+ "\3\u00ac\3\u00ac\3\u00ac\3\u00ac\3\u00ac\7\u00ac\u05c5\n\u00ac\f\u00ac"+
+ "\16\u00ac\u05c8\13\u00ac\3\u00ac\3\u00ac\3\u00ac\5\u00ac\u05cd\n\u00ac"+
+ "\3\u00ac\3\u00ac\3\u00ad\3\u00ad\3\u00ad\3\u00ad\3\u00ad\5\u0540\u05a7"+
+ "\u05c6\2\u00ae\4\3\6\4\b\5\n\6\f\7\16\b\20\t\22\n\24\13\26\f\30\r\32\16"+
+ "\34\17\36\20 \21\"\22$\23&\24(\25*\26,\27.\30\60\31\62\32\64\33\66\34"+
+ "8\35:\36<\37> @!B\"D#F$H%J&L\'N(P)R*T+V,X-Z.\\/^\60`\61b\62d\63f\64h\65"+
+ "j\66l\67n8p9r:t;v|?~@\u0080A\u0082B\u0084C\u0086D\u0088E\u008aF\u008c"+
+ "G\u008eH\u0090I\u0092J\u0094K\u0096L\u0098M\u009aN\u009cO\u009eP\u00a0"+
+ "Q\u00a2R\u00a4S\u00a6T\u00a8U\u00aaV\u00acW\u00aeX\u00b0Y\u00b2Z\u00b4"+
+ "[\u00b6\\\u00b8]\u00ba^\u00bc_\u00be`\u00c0a\u00c2b\u00c4c\u00c6d\u00c8"+
+ "e\u00caf\u00ccg\u00ceh\u00d0i\u00d2j\u00d4k\u00d6l\u00d8m\u00dan\u00dc"+
+ "o\u00dep\u00e0q\u00e2r\u00e4s\u00e6t\u00e8u\u00eav\u00ecw\u00eex\u00f0"+
+ "y\u00f2z\u00f4{\u00f6|\u00f8}\u00fa~\u00fc\177\u00fe\u0080\u0100\u0081"+
+ "\u0102\u0082\u0104\u0083\u0106\u0084\u0108\u0085\u010a\u0086\u010c\u0087"+
+ "\u010e\u0088\u0110\u0089\u0112\u008a\u0114\u008b\u0116\u008c\u0118\u008d"+
+ "\u011a\u008e\u011c\u008f\u011e\2\u0120\2\u0122\u0090\u0124\2\u0126\u0091"+
+ "\u0128\u0092\u012a\u0093\u012c\u0094\u012e\u0095\u0130\u0096\u0132\u0097"+
+ "\u0134\u0098\u0136\u0099\u0138\u009a\u013a\u009b\u013c\u009c\u013e\2\u0140"+
+ "\2\u0142\2\u0144\2\u0146\2\u0148\2\u014a\2\u014c\2\u014e\2\u0150\2\u0152"+
+ "\u009d\u0154\u009e\u0156\u009f\u0158\u00a0\u015a\u00a1\4\2\3\23\3\2\63"+
+ ";\3\2\62;\4\2DDdd\4\2QQqq\4\2ZZzz\4\2RRrr\4\2--//\3\2bb\4\2$$^^\4\2\13"+
+ "\13\"\"\4\2\f\f\17\17\5\2\f\f\17\17))\13\2$$))^^cdhhppttvvxx\3\2\629\5"+
+ "\2\62;CHch\3\2\62\63\4\2GGgg\49\2\62\2;\2\u0662\2\u066b\2\u06f2\2\u06fb"+
+ "\2\u07c2\2\u07cb\2\u0968\2\u0971\2\u09e8\2\u09f1\2\u0a68\2\u0a71\2\u0ae8"+
+ "\2\u0af1\2\u0b68\2\u0b71\2\u0be8\2\u0bf1\2\u0c68\2\u0c71\2\u0ce8\2\u0cf1"+
+ "\2\u0d68\2\u0d71\2\u0de8\2\u0df1\2\u0e52\2\u0e5b\2\u0ed2\2\u0edb\2\u0f22"+
+ "\2\u0f2b\2\u1042\2\u104b\2\u1092\2\u109b\2\u17e2\2\u17eb\2\u1812\2\u181b"+
+ "\2\u1948\2\u1951\2\u19d2\2\u19db\2\u1a82\2\u1a8b\2\u1a92\2\u1a9b\2\u1b52"+
+ "\2\u1b5b\2\u1bb2\2\u1bbb\2\u1c42\2\u1c4b\2\u1c52\2\u1c5b\2\ua622\2\ua62b"+
+ "\2\ua8d2\2\ua8db\2\ua902\2\ua90b\2\ua9d2\2\ua9db\2\ua9f2\2\ua9fb\2\uaa52"+
+ "\2\uaa5b\2\uabf2\2\uabfb\2\uff12\2\uff1b\2\u04a2\3\u04ab\3\u1068\3\u1071"+
+ "\3\u10f2\3\u10fb\3\u1138\3\u1141\3\u11d2\3\u11db\3\u12f2\3\u12fb\3\u1452"+
+ "\3\u145b\3\u14d2\3\u14db\3\u1652\3\u165b\3\u16c2\3\u16cb\3\u1732\3\u173b"+
+ "\3\u18e2\3\u18eb\3\u1c52\3\u1c5b\3\u1d52\3\u1d5b\3\u6a62\3\u6a6b\3\u6b52"+
+ "\3\u6b5b\3\ud7d0\3\ud801\3\ue952\3\ue95b\3\u024b\2C\2\\\2c\2|\2\u00ac"+
+ "\2\u00ac\2\u00b7\2\u00b7\2\u00bc\2\u00bc\2\u00c2\2\u00d8\2\u00da\2\u00f8"+
+ "\2\u00fa\2\u02c3\2\u02c8\2\u02d3\2\u02e2\2\u02e6\2\u02ee\2\u02ee\2\u02f0"+
+ "\2\u02f0\2\u0372\2\u0376\2\u0378\2\u0379\2\u037c\2\u037f\2\u0381\2\u0381"+
+ "\2\u0388\2\u0388\2\u038a\2\u038c\2\u038e\2\u038e\2\u0390\2\u03a3\2\u03a5"+
+ "\2\u03f7\2\u03f9\2\u0483\2\u048c\2\u0531\2\u0533\2\u0558\2\u055b\2\u055b"+
+ "\2\u0563\2\u0589\2\u05d2\2\u05ec\2\u05f2\2\u05f4\2\u0622\2\u064c\2\u0670"+
+ "\2\u0671\2\u0673\2\u06d5\2\u06d7\2\u06d7\2\u06e7\2\u06e8\2\u06f0\2\u06f1"+
+ "\2\u06fc\2\u06fe\2\u0701\2\u0701\2\u0712\2\u0712\2\u0714\2\u0731\2\u074f"+
+ "\2\u07a7\2\u07b3\2\u07b3\2\u07cc\2\u07ec\2\u07f6\2\u07f7\2\u07fc\2\u07fc"+
+ "\2\u0802\2\u0817\2\u081c\2\u081c\2\u0826\2\u0826\2\u082a\2\u082a\2\u0842"+
+ "\2\u085a\2\u0862\2\u086c\2\u08a2\2\u08b6\2\u08b8\2\u08bf\2\u0906\2\u093b"+
+ "\2\u093f\2\u093f\2\u0952\2\u0952\2\u095a\2\u0963\2\u0973\2\u0982\2\u0987"+
+ "\2\u098e\2\u0991\2\u0992\2\u0995\2\u09aa\2\u09ac\2\u09b2\2\u09b4\2\u09b4"+
+ "\2\u09b8\2\u09bb\2\u09bf\2\u09bf\2\u09d0\2\u09d0\2\u09de\2\u09df\2\u09e1"+
+ "\2\u09e3\2\u09f2\2\u09f3\2\u09fe\2\u09fe\2\u0a07\2\u0a0c\2\u0a11\2\u0a12"+
+ "\2\u0a15\2\u0a2a\2\u0a2c\2\u0a32\2\u0a34\2\u0a35\2\u0a37\2\u0a38\2\u0a3a"+
+ "\2\u0a3b\2\u0a5b\2\u0a5e\2\u0a60\2\u0a60\2\u0a74\2\u0a76\2\u0a87\2\u0a8f"+
+ "\2\u0a91\2\u0a93\2\u0a95\2\u0aaa\2\u0aac\2\u0ab2\2\u0ab4\2\u0ab5\2\u0ab7"+
+ "\2\u0abb\2\u0abf\2\u0abf\2\u0ad2\2\u0ad2\2\u0ae2\2\u0ae3\2\u0afb\2\u0afb"+
+ "\2\u0b07\2\u0b0e\2\u0b11\2\u0b12\2\u0b15\2\u0b2a\2\u0b2c\2\u0b32\2\u0b34"+
+ "\2\u0b35\2\u0b37\2\u0b3b\2\u0b3f\2\u0b3f\2\u0b5e\2\u0b5f\2\u0b61\2\u0b63"+
+ "\2\u0b73\2\u0b73\2\u0b85\2\u0b85\2\u0b87\2\u0b8c\2\u0b90\2\u0b92\2\u0b94"+
+ "\2\u0b97\2\u0b9b\2\u0b9c\2\u0b9e\2\u0b9e\2\u0ba0\2\u0ba1\2\u0ba5\2\u0ba6"+
+ "\2\u0baa\2\u0bac\2\u0bb0\2\u0bbb\2\u0bd2\2\u0bd2\2\u0c07\2\u0c0e\2\u0c10"+
+ "\2\u0c12\2\u0c14\2\u0c2a\2\u0c2c\2\u0c3b\2\u0c3f\2\u0c3f\2\u0c5a\2\u0c5c"+
+ "\2\u0c62\2\u0c63\2\u0c82\2\u0c82\2\u0c87\2\u0c8e\2\u0c90\2\u0c92\2\u0c94"+
+ "\2\u0caa\2\u0cac\2\u0cb5\2\u0cb7\2\u0cbb\2\u0cbf\2\u0cbf\2\u0ce0\2\u0ce0"+
+ "\2\u0ce2\2\u0ce3\2\u0cf3\2\u0cf4\2\u0d07\2\u0d0e\2\u0d10\2\u0d12\2\u0d14"+
+ "\2\u0d3c\2\u0d3f\2\u0d3f\2\u0d50\2\u0d50\2\u0d56\2\u0d58\2\u0d61\2\u0d63"+
+ "\2\u0d7c\2\u0d81\2\u0d87\2\u0d98\2\u0d9c\2\u0db3\2\u0db5\2\u0dbd\2\u0dbf"+
+ "\2\u0dbf\2\u0dc2\2\u0dc8\2\u0e03\2\u0e32\2\u0e34\2\u0e35\2\u0e42\2\u0e48"+
+ "\2\u0e83\2\u0e84\2\u0e86\2\u0e86\2\u0e89\2\u0e8a\2\u0e8c\2\u0e8c\2\u0e8f"+
+ "\2\u0e8f\2\u0e96\2\u0e99\2\u0e9b\2\u0ea1\2\u0ea3\2\u0ea5\2\u0ea7\2\u0ea7"+
+ "\2\u0ea9\2\u0ea9\2\u0eac\2\u0ead\2\u0eaf\2\u0eb2\2\u0eb4\2\u0eb5\2\u0ebf"+
+ "\2\u0ebf\2\u0ec2\2\u0ec6\2\u0ec8\2\u0ec8\2\u0ede\2\u0ee1\2\u0f02\2\u0f02"+
+ "\2\u0f42\2\u0f49\2\u0f4b\2\u0f6e\2\u0f8a\2\u0f8e\2\u1002\2\u102c\2\u1041"+
+ "\2\u1041\2\u1052\2\u1057\2\u105c\2\u105f\2\u1063\2\u1063\2\u1067\2\u1068"+
+ "\2\u1070\2\u1072\2\u1077\2\u1083\2\u1090\2\u1090\2\u10a2\2\u10c7\2\u10c9"+
+ "\2\u10c9\2\u10cf\2\u10cf\2\u10d2\2\u10fc\2\u10fe\2\u124a\2\u124c\2\u124f"+
+ "\2\u1252\2\u1258\2\u125a\2\u125a\2\u125c\2\u125f\2\u1262\2\u128a\2\u128c"+
+ "\2\u128f\2\u1292\2\u12b2\2\u12b4\2\u12b7\2\u12ba\2\u12c0\2\u12c2\2\u12c2"+
+ "\2\u12c4\2\u12c7\2\u12ca\2\u12d8\2\u12da\2\u1312\2\u1314\2\u1317\2\u131a"+
+ "\2\u135c\2\u1382\2\u1391\2\u13a2\2\u13f7\2\u13fa\2\u13ff\2\u1403\2\u166e"+
+ "\2\u1671\2\u1681\2\u1683\2\u169c\2\u16a2\2\u16ec\2\u16f3\2\u16fa\2\u1702"+
+ "\2\u170e\2\u1710\2\u1713\2\u1722\2\u1733\2\u1742\2\u1753\2\u1762\2\u176e"+
+ "\2\u1770\2\u1772\2\u1782\2\u17b5\2\u17d9\2\u17d9\2\u17de\2\u17de\2\u1822"+
+ "\2\u1879\2\u1882\2\u1886\2\u1889\2\u18aa\2\u18ac\2\u18ac\2\u18b2\2\u18f7"+
+ "\2\u1902\2\u1920\2\u1952\2\u196f\2\u1972\2\u1976\2\u1982\2\u19ad\2\u19b2"+
+ "\2\u19cb\2\u1a02\2\u1a18\2\u1a22\2\u1a56\2\u1aa9\2\u1aa9\2\u1b07\2\u1b35"+
+ "\2\u1b47\2\u1b4d\2\u1b85\2\u1ba2\2\u1bb0\2\u1bb1\2\u1bbc\2\u1be7\2\u1c02"+
+ "\2\u1c25\2\u1c4f\2\u1c51\2\u1c5c\2\u1c7f\2\u1c82\2\u1c8a\2\u1ceb\2\u1cee"+
+ "\2\u1cf0\2\u1cf3\2\u1cf7\2\u1cf8\2\u1d02\2\u1dc1\2\u1e02\2\u1f17\2\u1f1a"+
+ "\2\u1f1f\2\u1f22\2\u1f47\2\u1f4a\2\u1f4f\2\u1f52\2\u1f59\2\u1f5b\2\u1f5b"+
+ "\2\u1f5d\2\u1f5d\2\u1f5f\2\u1f5f\2\u1f61\2\u1f7f\2\u1f82\2\u1fb6\2\u1fb8"+
+ "\2\u1fbe\2\u1fc0\2\u1fc0\2\u1fc4\2\u1fc6\2\u1fc8\2\u1fce\2\u1fd2\2\u1fd5"+
+ "\2\u1fd8\2\u1fdd\2\u1fe2\2\u1fee\2\u1ff4\2\u1ff6\2\u1ff8\2\u1ffe\2\u2073"+
+ "\2\u2073\2\u2081\2\u2081\2\u2092\2\u209e\2\u2104\2\u2104\2\u2109\2\u2109"+
+ "\2\u210c\2\u2115\2\u2117\2\u2117\2\u211b\2\u211f\2\u2126\2\u2126\2\u2128"+
+ "\2\u2128\2\u212a\2\u212a\2\u212c\2\u212f\2\u2131\2\u213b\2\u213e\2\u2141"+
+ "\2\u2147\2\u214b\2\u2150\2\u2150\2\u2185\2\u2186\2\u2c02\2\u2c30\2\u2c32"+
+ "\2\u2c60\2\u2c62\2\u2ce6\2\u2ced\2\u2cf0\2\u2cf4\2\u2cf5\2\u2d02\2\u2d27"+
+ "\2\u2d29\2\u2d29\2\u2d2f\2\u2d2f\2\u2d32\2\u2d69\2\u2d71\2\u2d71\2\u2d82"+
+ "\2\u2d98\2\u2da2\2\u2da8\2\u2daa\2\u2db0\2\u2db2\2\u2db8\2\u2dba\2\u2dc0"+
+ "\2\u2dc2\2\u2dc8\2\u2dca\2\u2dd0\2\u2dd2\2\u2dd8\2\u2dda\2\u2de0\2\u2e31"+
+ "\2\u2e31\2\u3007\2\u3008\2\u3033\2\u3037\2\u303d\2\u303e\2\u3043\2\u3098"+
+ "\2\u309f\2\u30a1\2\u30a3\2\u30fc\2\u30fe\2\u3101\2\u3107\2\u3130\2\u3133"+
+ "\2\u3190\2\u31a2\2\u31bc\2\u31f2\2\u3201\2\u3402\2\u4db7\2\u4e02\2\u9fec"+
+ "\2\ua002\2\ua48e\2\ua4d2\2\ua4ff\2\ua502\2\ua60e\2\ua612\2\ua621\2\ua62c"+
+ "\2\ua62d\2\ua642\2\ua670\2\ua681\2\ua69f\2\ua6a2\2\ua6e7\2\ua719\2\ua721"+
+ "\2\ua724\2\ua78a\2\ua78d\2\ua7b0\2\ua7b2\2\ua7b9\2\ua7f9\2\ua803\2\ua805"+
+ "\2\ua807\2\ua809\2\ua80c\2\ua80e\2\ua824\2\ua842\2\ua875\2\ua884\2\ua8b5"+
+ "\2\ua8f4\2\ua8f9\2\ua8fd\2\ua8fd\2\ua8ff\2\ua8ff\2\ua90c\2\ua927\2\ua932"+
+ "\2\ua948\2\ua962\2\ua97e\2\ua986\2\ua9b4\2\ua9d1\2\ua9d1\2\ua9e2\2\ua9e6"+
+ "\2\ua9e8\2\ua9f1\2\ua9fc\2\uaa00\2\uaa02\2\uaa2a\2\uaa42\2\uaa44\2\uaa46"+
+ "\2\uaa4d\2\uaa62\2\uaa78\2\uaa7c\2\uaa7c\2\uaa80\2\uaab1\2\uaab3\2\uaab3"+
+ "\2\uaab7\2\uaab8\2\uaabb\2\uaabf\2\uaac2\2\uaac2\2\uaac4\2\uaac4\2\uaadd"+
+ "\2\uaadf\2\uaae2\2\uaaec\2\uaaf4\2\uaaf6\2\uab03\2\uab08\2\uab0b\2\uab10"+
+ "\2\uab13\2\uab18\2\uab22\2\uab28\2\uab2a\2\uab30\2\uab32\2\uab5c\2\uab5e"+
+ "\2\uab67\2\uab72\2\uabe4\2\uac02\2\ud7a5\2\ud7b2\2\ud7c8\2\ud7cd\2\ud7fd"+
+ "\2\uf902\2\ufa6f\2\ufa72\2\ufadb\2\ufb02\2\ufb08\2\ufb15\2\ufb19\2\ufb1f"+
+ "\2\ufb1f\2\ufb21\2\ufb2a\2\ufb2c\2\ufb38\2\ufb3a\2\ufb3e\2\ufb40\2\ufb40"+
+ "\2\ufb42\2\ufb43\2\ufb45\2\ufb46\2\ufb48\2\ufbb3\2\ufbd5\2\ufd3f\2\ufd52"+
+ "\2\ufd91\2\ufd94\2\ufdc9\2\ufdf2\2\ufdfd\2\ufe72\2\ufe76\2\ufe78\2\ufefe"+
+ "\2\uff23\2\uff3c\2\uff43\2\uff5c\2\uff68\2\uffc0\2\uffc4\2\uffc9\2\uffcc"+
+ "\2\uffd1\2\uffd4\2\uffd9\2\uffdc\2\uffde\2\2\3\r\3\17\3(\3*\3<\3>\3?\3"+
+ "A\3O\3R\3_\3\u0082\3\u00fc\3\u0282\3\u029e\3\u02a2\3\u02d2\3\u0302\3\u0321"+
+ "\3\u032f\3\u0342\3\u0344\3\u034b\3\u0352\3\u0377\3\u0382\3\u039f\3\u03a2"+
+ "\3\u03c5\3\u03ca\3\u03d1\3\u0402\3\u049f\3\u04b2\3\u04d5\3\u04da\3\u04fd"+
+ "\3\u0502\3\u0529\3\u0532\3\u0565\3\u0602\3\u0738\3\u0742\3\u0757\3\u0762"+
+ "\3\u0769\3\u0802\3\u0807\3\u080a\3\u080a\3\u080c\3\u0837\3\u0839\3\u083a"+
+ "\3\u083e\3\u083e\3\u0841\3\u0857\3\u0862\3\u0878\3\u0882\3\u08a0\3\u08e2"+
+ "\3\u08f4\3\u08f6\3\u08f7\3\u0902\3\u0917\3\u0922\3\u093b\3\u0982\3\u09b9"+
+ "\3\u09c0\3\u09c1\3\u0a02\3\u0a02\3\u0a12\3\u0a15\3\u0a17\3\u0a19\3\u0a1b"+
+ "\3\u0a35\3\u0a62\3\u0a7e\3\u0a82\3\u0a9e\3\u0ac2\3\u0ac9\3\u0acb\3\u0ae6"+
+ "\3\u0b02\3\u0b37\3\u0b42\3\u0b57\3\u0b62\3\u0b74\3\u0b82\3\u0b93\3\u0c02"+
+ "\3\u0c4a\3\u0c82\3\u0cb4\3\u0cc2\3\u0cf4\3\u1005\3\u1039\3\u1085\3\u10b1"+
+ "\3\u10d2\3\u10ea\3\u1105\3\u1128\3\u1152\3\u1174\3\u1178\3\u1178\3\u1185"+
+ "\3\u11b4\3\u11c3\3\u11c6\3\u11dc\3\u11dc\3\u11de\3\u11de\3\u1202\3\u1213"+
+ "\3\u1215\3\u122d\3\u1282\3\u1288\3\u128a\3\u128a\3\u128c\3\u128f\3\u1291"+
+ "\3\u129f\3\u12a1\3\u12aa\3\u12b2\3\u12e0\3\u1307\3\u130e\3\u1311\3\u1312"+
+ "\3\u1315\3\u132a\3\u132c\3\u1332\3\u1334\3\u1335\3\u1337\3\u133b\3\u133f"+
+ "\3\u133f\3\u1352\3\u1352\3\u135f\3\u1363\3\u1402\3\u1436\3\u1449\3\u144c"+
+ "\3\u1482\3\u14b1\3\u14c6\3\u14c7\3\u14c9\3\u14c9\3\u1582\3\u15b0\3\u15da"+
+ "\3\u15dd\3\u1602\3\u1631\3\u1646\3\u1646\3\u1682\3\u16ac\3\u1702\3\u171b"+
+ "\3\u18a2\3\u18e1\3\u1901\3\u1901\3\u1a02\3\u1a02\3\u1a0d\3\u1a34\3\u1a3c"+
+ "\3\u1a3c\3\u1a52\3\u1a52\3\u1a5e\3\u1a85\3\u1a88\3\u1a8b\3\u1ac2\3\u1afa"+
+ "\3\u1c02\3\u1c0a\3\u1c0c\3\u1c30\3\u1c42\3\u1c42\3\u1c74\3\u1c91\3\u1d02"+
+ "\3\u1d08\3\u1d0a\3\u1d0b\3\u1d0d\3\u1d32\3\u1d48\3\u1d48\3\u2002\3\u239b"+
+ "\3\u2482\3\u2545\3\u3002\3\u3430\3\u4402\3\u4648\3\u6802\3\u6a3a\3\u6a42"+
+ "\3\u6a60\3\u6ad2\3\u6aef\3\u6b02\3\u6b31\3\u6b42\3\u6b45\3\u6b65\3\u6b79"+
+ "\3\u6b7f\3\u6b91\3\u6f02\3\u6f46\3\u6f52\3\u6f52\3\u6f95\3\u6fa1\3\u6fe2"+
+ "\3\u6fe3\3\u7002\3\u87ee\3\u8802\3\u8af4\3\ub002\3\ub120\3\ub172\3\ub2fd"+
+ "\3\ubc02\3\ubc6c\3\ubc72\3\ubc7e\3\ubc82\3\ubc8a\3\ubc92\3\ubc9b\3\ud402"+
+ "\3\ud456\3\ud458\3\ud49e\3\ud4a0\3\ud4a1\3\ud4a4\3\ud4a4\3\ud4a7\3\ud4a8"+
+ "\3\ud4ab\3\ud4ae\3\ud4b0\3\ud4bb\3\ud4bd\3\ud4bd\3\ud4bf\3\ud4c5\3\ud4c7"+
+ "\3\ud507\3\ud509\3\ud50c\3\ud50f\3\ud516\3\ud518\3\ud51e\3\ud520\3\ud53b"+
+ "\3\ud53d\3\ud540\3\ud542\3\ud546\3\ud548\3\ud548\3\ud54c\3\ud552\3\ud554"+
+ "\3\ud6a7\3\ud6aa\3\ud6c2\3\ud6c4\3\ud6dc\3\ud6de\3\ud6fc\3\ud6fe\3\ud716"+
+ "\3\ud718\3\ud736\3\ud738\3\ud750\3\ud752\3\ud770\3\ud772\3\ud78a\3\ud78c"+
+ "\3\ud7aa\3\ud7ac\3\ud7c4\3\ud7c6\3\ud7cd\3\ue802\3\ue8c6\3\ue902\3\ue945"+
+ "\3\uee02\3\uee05\3\uee07\3\uee21\3\uee23\3\uee24\3\uee26\3\uee26\3\uee29"+
+ "\3\uee29\3\uee2b\3\uee34\3\uee36\3\uee39\3\uee3b\3\uee3b\3\uee3d\3\uee3d"+
+ "\3\uee44\3\uee44\3\uee49\3\uee49\3\uee4b\3\uee4b\3\uee4d\3\uee4d\3\uee4f"+
+ "\3\uee51\3\uee53\3\uee54\3\uee56\3\uee56\3\uee59\3\uee59\3\uee5b\3\uee5b"+
+ "\3\uee5d\3\uee5d\3\uee5f\3\uee5f\3\uee61\3\uee61\3\uee63\3\uee64\3\uee66"+
+ "\3\uee66\3\uee69\3\uee6c\3\uee6e\3\uee74\3\uee76\3\uee79\3\uee7b\3\uee7e"+
+ "\3\uee80\3\uee80\3\uee82\3\uee8b\3\uee8d\3\uee9d\3\ueea3\3\ueea5\3\ueea7"+
+ "\3\ueeab\3\ueead\3\ueebd\3\2\4\ua6d8\4\ua702\4\ub736\4\ub742\4\ub81f\4"+
+ "\ub822\4\ucea3\4\uceb2\4\uebe2\4\uf802\4\ufa1f\4\u0600\2\4\3\2\2\2\2\6"+
+ "\3\2\2\2\2\b\3\2\2\2\2\n\3\2\2\2\2\f\3\2\2\2\2\16\3\2\2\2\2\20\3\2\2\2"+
+ "\2\22\3\2\2\2\2\24\3\2\2\2\2\26\3\2\2\2\2\30\3\2\2\2\2\32\3\2\2\2\2\34"+
+ "\3\2\2\2\2\36\3\2\2\2\2 \3\2\2\2\2\"\3\2\2\2\2$\3\2\2\2\2&\3\2\2\2\2("+
+ "\3\2\2\2\2*\3\2\2\2\2,\3\2\2\2\2.\3\2\2\2\2\60\3\2\2\2\2\62\3\2\2\2\2"+
+ "\64\3\2\2\2\2\66\3\2\2\2\28\3\2\2\2\2:\3\2\2\2\2<\3\2\2\2\2>\3\2\2\2\2"+
+ "@\3\2\2\2\2B\3\2\2\2\2D\3\2\2\2\2F\3\2\2\2\2H\3\2\2\2\2J\3\2\2\2\2L\3"+
+ "\2\2\2\2N\3\2\2\2\2P\3\2\2\2\2R\3\2\2\2\2T\3\2\2\2\2V\3\2\2\2\2X\3\2\2"+
+ "\2\2Z\3\2\2\2\2\\\3\2\2\2\2^\3\2\2\2\2`\3\2\2\2\2b\3\2\2\2\2d\3\2\2\2"+
+ "\2f\3\2\2\2\2h\3\2\2\2\2j\3\2\2\2\2l\3\2\2\2\2n\3\2\2\2\2p\3\2\2\2\2r"+
+ "\3\2\2\2\2t\3\2\2\2\2v\3\2\2\2\2x\3\2\2\2\2z\3\2\2\2\2|\3\2\2\2\2~\3\2"+
+ "\2\2\2\u0080\3\2\2\2\2\u0082\3\2\2\2\2\u0084\3\2\2\2\2\u0086\3\2\2\2\2"+
+ "\u0088\3\2\2\2\2\u008a\3\2\2\2\2\u008c\3\2\2\2\2\u008e\3\2\2\2\2\u0090"+
+ "\3\2\2\2\2\u0092\3\2\2\2\2\u0094\3\2\2\2\2\u0096\3\2\2\2\2\u0098\3\2\2"+
+ "\2\2\u009a\3\2\2\2\2\u009c\3\2\2\2\2\u009e\3\2\2\2\2\u00a0\3\2\2\2\2\u00a2"+
+ "\3\2\2\2\2\u00a4\3\2\2\2\2\u00a6\3\2\2\2\2\u00a8\3\2\2\2\2\u00aa\3\2\2"+
+ "\2\2\u00ac\3\2\2\2\2\u00ae\3\2\2\2\2\u00b0\3\2\2\2\2\u00b2\3\2\2\2\2\u00b4"+
+ "\3\2\2\2\2\u00b6\3\2\2\2\2\u00b8\3\2\2\2\2\u00ba\3\2\2\2\2\u00bc\3\2\2"+
+ "\2\2\u00be\3\2\2\2\2\u00c0\3\2\2\2\2\u00c2\3\2\2\2\2\u00c4\3\2\2\2\2\u00c6"+
+ "\3\2\2\2\2\u00c8\3\2\2\2\2\u00ca\3\2\2\2\2\u00cc\3\2\2\2\2\u00ce\3\2\2"+
+ "\2\2\u00d0\3\2\2\2\2\u00d2\3\2\2\2\2\u00d4\3\2\2\2\2\u00d6\3\2\2\2\2\u00d8"+
+ "\3\2\2\2\2\u00da\3\2\2\2\2\u00dc\3\2\2\2\2\u00de\3\2\2\2\2\u00e0\3\2\2"+
+ "\2\2\u00e2\3\2\2\2\2\u00e4\3\2\2\2\2\u00e6\3\2\2\2\2\u00e8\3\2\2\2\2\u00ea"+
+ "\3\2\2\2\2\u00ec\3\2\2\2\2\u00ee\3\2\2\2\2\u00f0\3\2\2\2\2\u00f2\3\2\2"+
+ "\2\2\u00f4\3\2\2\2\2\u00f6\3\2\2\2\2\u00f8\3\2\2\2\2\u00fa\3\2\2\2\2\u00fc"+
+ "\3\2\2\2\2\u00fe\3\2\2\2\2\u0100\3\2\2\2\2\u0102\3\2\2\2\2\u0104\3\2\2"+
+ "\2\2\u0106\3\2\2\2\2\u0108\3\2\2\2\2\u010a\3\2\2\2\2\u010c\3\2\2\2\2\u010e"+
+ "\3\2\2\2\2\u0110\3\2\2\2\2\u0112\3\2\2\2\2\u0114\3\2\2\2\2\u0116\3\2\2"+
+ "\2\2\u0118\3\2\2\2\2\u011a\3\2\2\2\2\u011c\3\2\2\2\2\u0122\3\2\2\2\2\u0126"+
+ "\3\2\2\2\2\u0128\3\2\2\2\2\u012a\3\2\2\2\2\u012c\3\2\2\2\2\u012e\3\2\2"+
+ "\2\2\u0130\3\2\2\2\2\u0132\3\2\2\2\2\u0134\3\2\2\2\2\u0136\3\2\2\2\2\u0138"+
+ "\3\2\2\2\2\u013a\3\2\2\2\2\u013c\3\2\2\2\3\u0152\3\2\2\2\3\u0154\3\2\2"+
+ "\2\3\u0156\3\2\2\2\3\u0158\3\2\2\2\3\u015a\3\2\2\2\4\u015e\3\2\2\2\6\u0174"+
+ "\3\2\2\2\b\u0176\3\2\2\2\n\u017d\3\2\2\2\f\u0185\3\2\2\2\16\u018c\3\2"+
+ "\2\2\20\u0193\3\2\2\2\22\u019a\3\2\2\2\24\u01a1\3\2\2\2\26\u01aa\3\2\2"+
+ "\2\30\u01b4\3\2\2\2\32\u01bc\3\2\2\2\34\u01c6\3\2\2\2\36\u01d2\3\2\2\2"+
+ " \u01d9\3\2\2\2\"\u01e4\3\2\2\2$\u01e7\3\2\2\2&\u01ed\3\2\2\2(\u01f6\3"+
+ "\2\2\2*\u01fb\3\2\2\2,\u0202\3\2\2\2.\u0209\3\2\2\2\60\u020f\3\2\2\2\62"+
+ "\u0214\3\2\2\2\64\u021b\3\2\2\2\66\u0225\3\2\2\28\u022b\3\2\2\2:\u022e"+
+ "\3\2\2\2<\u0230\3\2\2\2>\u0237\3\2\2\2@\u023d\3\2\2\2B\u024a\3\2\2\2D"+
+ "\u0253\3\2\2\2F\u0257\3\2\2\2H\u025b\3\2\2\2J\u0261\3\2\2\2L\u0263\3\2"+
+ "\2\2N\u0266\3\2\2\2P\u026b\3\2\2\2R\u0271\3\2\2\2T\u0277\3\2\2\2V\u027e"+
+ "\3\2\2\2X\u0285\3\2\2\2Z\u028e\3\2\2\2\\\u0294\3\2\2\2^\u029a\3\2\2\2"+
+ "`\u02a1\3\2\2\2b\u02a7\3\2\2\2d\u02ae\3\2\2\2f\u02b4\3\2\2\2h\u02bd\3"+
+ "\2\2\2j\u02c5\3\2\2\2l\u02cb\3\2\2\2n\u02d3\3\2\2\2p\u02da\3\2\2\2r\u02df"+
+ "\3\2\2\2t\u02e8\3\2\2\2v\u02f7\3\2\2\2x\u02fd\3\2\2\2z\u0301\3\2\2\2|"+
+ "\u0304\3\2\2\2~\u030b\3\2\2\2\u0080\u0315\3\2\2\2\u0082\u031f\3\2\2\2"+
+ "\u0084\u032b\3\2\2\2\u0086\u0334\3\2\2\2\u0088\u033e\3\2\2\2\u008a\u0346"+
+ "\3\2\2\2\u008c\u0352\3\2\2\2\u008e\u0361\3\2\2\2\u0090\u0367\3\2\2\2\u0092"+
+ "\u036b\3\2\2\2\u0094\u036f\3\2\2\2\u0096\u0374\3\2\2\2\u0098\u037c\3\2"+
+ "\2\2\u009a\u0384\3\2\2\2\u009c\u0389\3\2\2\2\u009e\u0393\3\2\2\2\u00a0"+
+ "\u039a\3\2\2\2\u00a2\u039f\3\2\2\2\u00a4\u03a5\3\2\2\2\u00a6\u03a8\3\2"+
+ "\2\2\u00a8\u03ac\3\2\2\2\u00aa\u03b3\3\2\2\2\u00ac\u03b8\3\2\2\2\u00ae"+
+ "\u03bd\3\2\2\2\u00b0\u03c2\3\2\2\2\u00b2\u03ca\3\2\2\2\u00b4\u03d1\3\2"+
+ "\2\2\u00b6\u03d7\3\2\2\2\u00b8\u03e5\3\2\2\2\u00ba\u03e8\3\2\2\2\u00bc"+
+ "\u03ee\3\2\2\2\u00be\u03f3\3\2\2\2\u00c0\u03fe\3\2\2\2\u00c2\u0402\3\2"+
+ "\2\2\u00c4\u0409\3\2\2\2\u00c6\u0412\3\2\2\2\u00c8\u0416\3\2\2\2\u00ca"+
+ "\u041c\3\2\2\2\u00cc\u0426\3\2\2\2\u00ce\u0428\3\2\2\2\u00d0\u042c\3\2"+
+ "\2\2\u00d2\u042e\3\2\2\2\u00d4\u0432\3\2\2\2\u00d6\u0434\3\2\2\2\u00d8"+
+ "\u0438\3\2\2\2\u00da\u043a\3\2\2\2\u00dc\u043c\3\2\2\2\u00de\u043e\3\2"+
+ "\2\2\u00e0\u0440\3\2\2\2\u00e2\u0442\3\2\2\2\u00e4\u0447\3\2\2\2\u00e6"+
+ "\u044c\3\2\2\2\u00e8\u044f\3\2\2\2\u00ea\u0453\3\2\2\2\u00ec\u0456\3\2"+
+ "\2\2\u00ee\u0459\3\2\2\2\u00f0\u045c\3\2\2\2\u00f2\u045f\3\2\2\2\u00f4"+
+ "\u0461\3\2\2\2\u00f6\u0464\3\2\2\2\u00f8\u0466\3\2\2\2\u00fa\u0469\3\2"+
+ "\2\2\u00fc\u046b\3\2\2\2\u00fe\u046d\3\2\2\2\u0100\u046f\3\2\2\2\u0102"+
+ "\u0472\3\2\2\2\u0104\u0475\3\2\2\2\u0106\u0478\3\2\2\2\u0108\u047a\3\2"+
+ "\2\2\u010a\u047c\3\2\2\2\u010c\u047e\3\2\2\2\u010e\u0480\3\2\2\2\u0110"+
+ "\u0482\3\2\2\2\u0112\u0484\3\2\2\2\u0114\u0492\3\2\2\2\u0116\u0496\3\2"+
+ "\2\2\u0118\u04a2\3\2\2\2\u011a\u04b0\3\2\2\2\u011c\u04bc\3\2\2\2\u011e"+
+ "\u04e0\3\2\2\2\u0120\u04e2\3\2\2\2\u0122\u04eb\3\2\2\2\u0124\u04f1\3\2"+
+ "\2\2\u0126\u04f8\3\2\2\2\u0128\u04fe\3\2\2\2\u012a\u0500\3\2\2\2\u012c"+
+ "\u0505\3\2\2\2\u012e\u050a\3\2\2\2\u0130\u0511\3\2\2\2\u0132\u051c\3\2"+
+ "\2\2\u0134\u0527\3\2\2\2\u0136\u0534\3\2\2\2\u0138\u053a\3\2\2\2\u013a"+
+ "\u0549\3\2\2\2\u013c\u054f\3\2\2\2\u013e\u055e\3\2\2\2\u0140\u0560\3\2"+
+ "\2\2\u0142\u057c\3\2\2\2\u0144\u0586\3\2\2\2\u0146\u0588\3\2\2\2\u0148"+
+ "\u058a\3\2\2\2\u014a\u058c\3\2\2\2\u014c\u0594\3\2\2\2\u014e\u0596\3\2"+
+ "\2\2\u0150\u0598\3\2\2\2\u0152\u059b\3\2\2\2\u0154\u05a1\3\2\2\2\u0156"+
+ "\u05af\3\2\2\2\u0158\u05cc\3\2\2\2\u015a\u05d0\3\2\2\2\u015c\u015f\5\6"+
+ "\3\2\u015d\u015f\5\u011c\u008e\2\u015e\u015c\3\2\2\2\u015e\u015d\3\2\2"+
+ "\2\u015f\u0160\3\2\2\2\u0160\u0161\b\2\2\2\u0161\5\3\2\2\2\u0162\u016c"+
+ "\5\u0142\u00a1\2\u0163\u0164\7\60\2\2\u0164\u0166\6\3\2\2\u0165\u0167"+
+ "\5\u0142\u00a1\2\u0166\u0165\3\2\2\2\u0166\u0167\3\2\2\2\u0167\u0169\3"+
+ "\2\2\2\u0168\u016a\5\u014a\u00a5\2\u0169\u0168\3\2\2\2\u0169\u016a\3\2"+
+ "\2\2\u016a\u016d\3\2\2\2\u016b\u016d\5\u014a\u00a5\2\u016c\u0163\3\2\2"+
+ "\2\u016c\u016b\3\2\2\2\u016d\u0175\3\2\2\2\u016e\u016f\7\60\2\2\u016f"+
+ "\u0170\6\3\3\2\u0170\u0172\5\u0142\u00a1\2\u0171\u0173\5\u014a\u00a5\2"+
+ "\u0172\u0171\3\2\2\2\u0172\u0173\3\2\2\2\u0173\u0175\3\2\2\2\u0174\u0162"+
+ "\3\2\2\2\u0174\u016e\3\2\2\2\u0175\7\3\2\2\2\u0176\u0177\7v\2\2\u0177"+
+ "\u0178\7t\2\2\u0178\u0179\7w\2\2\u0179\u017a\7g\2\2\u017a\u017b\3\2\2"+
+ "\2\u017b\u017c\b\4\2\2\u017c\t\3\2\2\2\u017d\u017e\7h\2\2\u017e\u017f"+
+ "\7c\2\2\u017f\u0180\7n\2\2\u0180\u0181\7u\2\2\u0181\u0182\7g\2\2\u0182"+
+ "\u0183\3\2\2\2\u0183\u0184\b\5\2\2\u0184\13\3\2\2\2\u0185\u0186\7c\2\2"+
+ "\u0186\u0187\7u\2\2\u0187\u0188\7u\2\2\u0188\u0189\7g\2\2\u0189\u018a"+
+ "\7t\2\2\u018a\u018b\7v\2\2\u018b\r\3\2\2\2\u018c\u018d\7c\2\2\u018d\u018e"+
+ "\7u\2\2\u018e\u018f\7u\2\2\u018f\u0190\7w\2\2\u0190\u0191\7o\2\2\u0191"+
+ "\u0192\7g\2\2\u0192\17\3\2\2\2\u0193\u0194\7k\2\2\u0194\u0195\7p\2\2\u0195"+
+ "\u0196\7j\2\2\u0196\u0197\7c\2\2\u0197\u0198\7n\2\2\u0198\u0199\7g\2\2"+
+ "\u0199\21\3\2\2\2\u019a\u019b\7g\2\2\u019b\u019c\7z\2\2\u019c\u019d\7"+
+ "j\2\2\u019d\u019e\7c\2\2\u019e\u019f\7n\2\2\u019f\u01a0\7g\2\2\u01a0\23"+
+ "\3\2\2\2\u01a1\u01a2\7t\2\2\u01a2\u01a3\7g\2\2\u01a3\u01a4\7s\2\2\u01a4"+
+ "\u01a5\7w\2\2\u01a5\u01a6\7k\2\2\u01a6\u01a7\7t\2\2\u01a7\u01a8\7g\2\2"+
+ "\u01a8\u01a9\7u\2\2\u01a9\25\3\2\2\2\u01aa\u01ab\7r\2\2\u01ab\u01ac\7"+
+ "t\2\2\u01ac\u01ad\7g\2\2\u01ad\u01ae\7u\2\2\u01ae\u01af\7g\2\2\u01af\u01b0"+
+ "\7t\2\2\u01b0\u01b1\7x\2\2\u01b1\u01b2\7g\2\2\u01b2\u01b3\7u\2\2\u01b3"+
+ "\27\3\2\2\2\u01b4\u01b5\7g\2\2\u01b5\u01b6\7p\2\2\u01b6\u01b7\7u\2\2\u01b7"+
+ "\u01b8\7w\2\2\u01b8\u01b9\7t\2\2\u01b9\u01ba\7g\2\2\u01ba\u01bb\7u\2\2"+
+ "\u01bb\31\3\2\2\2\u01bc\u01bd\7k\2\2\u01bd\u01be\7p\2\2\u01be\u01bf\7"+
+ "x\2\2\u01bf\u01c0\7c\2\2\u01c0\u01c1\7t\2\2\u01c1\u01c2\7k\2\2\u01c2\u01c3"+
+ "\7c\2\2\u01c3\u01c4\7p\2\2\u01c4\u01c5\7v\2\2\u01c5\33\3\2\2\2\u01c6\u01c7"+
+ "\7f\2\2\u01c7\u01c8\7g\2\2\u01c8\u01c9\7e\2\2\u01c9\u01ca\7t\2\2\u01ca"+
+ "\u01cb\7g\2\2\u01cb\u01cc\7c\2\2\u01cc\u01cd\7u\2\2\u01cd\u01ce\7g\2\2"+
+ "\u01ce\u01cf\7u\2\2\u01cf\u01d0\3\2\2\2\u01d0\u01d1\b\16\2\2\u01d1\35"+
+ "\3\2\2\2\u01d2\u01d3\7r\2\2\u01d3\u01d4\7w\2\2\u01d4\u01d5\7t\2\2\u01d5"+
+ "\u01d6\7g\2\2\u01d6\u01d7\3\2\2\2\u01d7\u01d8\b\17\2\2\u01d8\37\3\2\2"+
+ "\2\u01d9\u01da\7k\2\2\u01da\u01db\7o\2\2\u01db\u01dc\7r\2\2\u01dc\u01dd"+
+ "\7n\2\2\u01dd\u01de\7g\2\2\u01de\u01df\7o\2\2\u01df\u01e0\7g\2\2\u01e0"+
+ "\u01e1\7p\2\2\u01e1\u01e2\7v\2\2\u01e2\u01e3\7u\2\2\u01e3!\3\2\2\2\u01e4"+
+ "\u01e5\7c\2\2\u01e5\u01e6\7u\2\2\u01e6#\3\2\2\2\u01e7\u01e8\7q\2\2\u01e8"+
+ "\u01e9\7n\2\2\u01e9\u01ea\7f\2\2\u01ea\u01eb\3\2\2\2\u01eb\u01ec\b\22"+
+ "\2\2\u01ec%\3\2\2\2\u01ed\u01ee\7d\2\2\u01ee\u01ef\7g\2\2\u01ef\u01f0"+
+ "\7h\2\2\u01f0\u01f1\7q\2\2\u01f1\u01f2\7t\2\2\u01f2\u01f3\7g\2\2\u01f3"+
+ "\u01f4\3\2\2\2\u01f4\u01f5\b\23\2\2\u01f5\'\3\2\2\2\u01f6\u01f7\7%\2\2"+
+ "\u01f7\u01f8\7n\2\2\u01f8\u01f9\7j\2\2\u01f9\u01fa\7u\2\2\u01fa)\3\2\2"+
+ "\2\u01fb\u01fc\7h\2\2\u01fc\u01fd\7q\2\2\u01fd\u01fe\7t\2\2\u01fe\u01ff"+
+ "\7c\2\2\u01ff\u0200\7n\2\2\u0200\u0201\7n\2\2\u0201+\3\2\2\2\u0202\u0203"+
+ "\7g\2\2\u0203\u0204\7z\2\2\u0204\u0205\7k\2\2\u0205\u0206\7u\2\2\u0206"+
+ "\u0207\7v\2\2\u0207\u0208\7u\2\2\u0208-\3\2\2\2\u0209\u020a\7c\2\2\u020a"+
+ "\u020b\7e\2\2\u020b\u020c\7e\2\2\u020c\u020d\3\2\2\2\u020d\u020e\b\27"+
+ "\2\2\u020e/\3\2\2\2\u020f\u0210\7h\2\2\u0210\u0211\7q\2\2\u0211\u0212"+
+ "\7n\2\2\u0212\u0213\7f\2\2\u0213\61\3\2\2\2\u0214\u0215\7w\2\2\u0215\u0216"+
+ "\7p\2\2\u0216\u0217\7h\2\2\u0217\u0218\7q\2\2\u0218\u0219\7n\2\2\u0219"+
+ "\u021a\7f\2\2\u021a\63\3\2\2\2\u021b\u021c\7w\2\2\u021c\u021d\7p\2\2\u021d"+
+ "\u021e\7h\2\2\u021e\u021f\7q\2\2\u021f\u0220\7n\2\2\u0220\u0221\7f\2\2"+
+ "\u0221\u0222\7k\2\2\u0222\u0223\7p\2\2\u0223\u0224\7i\2\2\u0224\65\3\2"+
+ "\2\2\u0225\u0226\7i\2\2\u0226\u0227\7j\2\2\u0227\u0228\7q\2\2\u0228\u0229"+
+ "\7u\2\2\u0229\u022a\7v\2\2\u022a\67\3\2\2\2\u022b\u022c\7k\2\2\u022c\u022d"+
+ "\7p\2\2\u022d9\3\2\2\2\u022e\u022f\7%\2\2\u022f;\3\2\2\2\u0230\u0231\7"+
+ "u\2\2\u0231\u0232\7w\2\2\u0232\u0233\7d\2\2\u0233\u0234\7u\2\2\u0234\u0235"+
+ "\7g\2\2\u0235\u0236\7v\2\2\u0236=\3\2\2\2\u0237\u0238\7w\2\2\u0238\u0239"+
+ "\7p\2\2\u0239\u023a\7k\2\2\u023a\u023b\7q\2\2\u023b\u023c\7p\2\2\u023c"+
+ "?\3\2\2\2\u023d\u023e\7k\2\2\u023e\u023f\7p\2\2\u023f\u0240\7v\2\2\u0240"+
+ "\u0241\7g\2\2\u0241\u0242\7t\2\2\u0242\u0243\7u\2\2\u0243\u0244\7g\2\2"+
+ "\u0244\u0245\7e\2\2\u0245\u0246\7v\2\2\u0246\u0247\7k\2\2\u0247\u0248"+
+ "\7q\2\2\u0248\u0249\7p\2\2\u0249A\3\2\2\2\u024a\u024b\7u\2\2\u024b\u024c"+
+ "\7g\2\2\u024c\u024d\7v\2\2\u024d\u024e\7o\2\2\u024e\u024f\7k\2\2\u024f"+
+ "\u0250\7p\2\2\u0250\u0251\7w\2\2\u0251\u0252\7u\2\2\u0252C\3\2\2\2\u0253"+
+ "\u0254\7?\2\2\u0254\u0255\7?\2\2\u0255\u0256\7@\2\2\u0256E\3\2\2\2\u0257"+
+ "\u0258\7/\2\2\u0258\u0259\7/\2\2\u0259\u025a\7,\2\2\u025aG\3\2\2\2\u025b"+
+ "\u025c\7c\2\2\u025c\u025d\7r\2\2\u025d\u025e\7r\2\2\u025e\u025f\7n\2\2"+
+ "\u025f\u0260\7{\2\2\u0260I\3\2\2\2\u0261\u0262\7A\2\2\u0262K\3\2\2\2\u0263"+
+ "\u0264\7#\2\2\u0264\u0265\7>\2\2\u0265M\3\2\2\2\u0266\u0267\7#\2\2\u0267"+
+ "\u0268\7@\2\2\u0268\u0269\3\2\2\2\u0269\u026a\b\'\2\2\u026aO\3\2\2\2\u026b"+
+ "\u026c\7u\2\2\u026c\u026d\7g\2\2\u026d\u026e\7s\2\2\u026e\u026f\3\2\2"+
+ "\2\u026f\u0270\b(\2\2\u0270Q\3\2\2\2\u0271\u0272\7u\2\2\u0272\u0273\7"+
+ "g\2\2\u0273\u0274\7v\2\2\u0274\u0275\3\2\2\2\u0275\u0276\b)\2\2\u0276"+
+ "S\3\2\2\2\u0277\u0278\7o\2\2\u0278\u0279\7u\2\2\u0279\u027a\7g\2\2\u027a"+
+ "\u027b\7v\2\2\u027b\u027c\3\2\2\2\u027c\u027d\b*\2\2\u027dU\3\2\2\2\u027e"+
+ "\u027f\7f\2\2\u027f\u0280\7k\2\2\u0280\u0281\7e\2\2\u0281\u0282\7v\2\2"+
+ "\u0282\u0283\3\2\2\2\u0283\u0284\b+\2\2\u0284W\3\2\2\2\u0285\u0286\7q"+
+ "\2\2\u0286\u0287\7r\2\2\u0287\u0288\7v\2\2\u0288\u0289\7k\2\2\u0289\u028a"+
+ "\7q\2\2\u028a\u028b\7p\2\2\u028b\u028c\3\2\2\2\u028c\u028d\b,\2\2\u028d"+
+ "Y\3\2\2\2\u028e\u028f\7n\2\2\u028f\u0290\7g\2\2\u0290\u0291\7p\2\2\u0291"+
+ "\u0292\3\2\2\2\u0292\u0293\b-\2\2\u0293[\3\2\2\2\u0294\u0295\7p\2\2\u0295"+
+ "\u0296\7g\2\2\u0296\u0297\7y\2\2\u0297\u0298\3\2\2\2\u0298\u0299\b.\2"+
+ "\2\u0299]\3\2\2\2\u029a\u029b\7o\2\2\u029b\u029c\7c\2\2\u029c\u029d\7"+
+ "m\2\2\u029d\u029e\7g\2\2\u029e\u029f\3\2\2\2\u029f\u02a0\b/\2\2\u02a0"+
+ "_\3\2\2\2\u02a1\u02a2\7e\2\2\u02a2\u02a3\7c\2\2\u02a3\u02a4\7r\2\2\u02a4"+
+ "\u02a5\3\2\2\2\u02a5\u02a6\b\60\2\2\u02a6a\3\2\2\2\u02a7\u02a8\7u\2\2"+
+ "\u02a8\u02a9\7q\2\2\u02a9\u02aa\7o\2\2\u02aa\u02ab\7g\2\2\u02ab\u02ac"+
+ "\3\2\2\2\u02ac\u02ad\b\61\2\2\u02adc\3\2\2\2\u02ae\u02af\7i\2\2\u02af"+
+ "\u02b0\7g\2\2\u02b0\u02b1\7v\2\2\u02b1\u02b2\3\2\2\2\u02b2\u02b3\b\62"+
+ "\2\2\u02b3e\3\2\2\2\u02b4\u02b5\7f\2\2\u02b5\u02b6\7q\2\2\u02b6\u02b7"+
+ "\7o\2\2\u02b7\u02b8\7c\2\2\u02b8\u02b9\7k\2\2\u02b9\u02ba\7p\2\2\u02ba"+
+ "\u02bb\3\2\2\2\u02bb\u02bc\b\63\2\2\u02bcg\3\2\2\2\u02bd\u02be\7c\2\2"+
+ "\u02be\u02bf\7z\2\2\u02bf\u02c0\7k\2\2\u02c0\u02c1\7q\2\2\u02c1\u02c2"+
+ "\7o\2\2\u02c2\u02c3\3\2\2\2\u02c3\u02c4\b\64\2\2\u02c4i\3\2\2\2\u02c5"+
+ "\u02c6\7c\2\2\u02c6\u02c7\7f\2\2\u02c7\u02c8\7v\2\2\u02c8\u02c9\3\2\2"+
+ "\2\u02c9\u02ca\b\65\2\2\u02cak\3\2\2\2\u02cb\u02cc\7o\2\2\u02cc\u02cd"+
+ "\7c\2\2\u02cd\u02ce\7v\2\2\u02ce\u02cf\7e\2\2\u02cf\u02d0\7j\2\2\u02d0"+
+ "\u02d1\3\2\2\2\u02d1\u02d2\b\66\2\2\u02d2m\3\2\2\2\u02d3\u02d4\7p\2\2"+
+ "\u02d4\u02d5\7q\2\2\u02d5\u02d6\7p\2\2\u02d6\u02d7\7g\2\2\u02d7\u02d8"+
+ "\3\2\2\2\u02d8\u02d9\b\67\2\2\u02d9o\3\2\2\2\u02da\u02db\7r\2\2\u02db"+
+ "\u02dc\7t\2\2\u02dc\u02dd\7g\2\2\u02dd\u02de\7f\2\2\u02deq\3\2\2\2\u02df"+
+ "\u02e0\7v\2\2\u02e0\u02e1\7{\2\2\u02e1\u02e2\7r\2\2\u02e2\u02e3\7g\2\2"+
+ "\u02e3\u02e4\7Q\2\2\u02e4\u02e5\7h\2\2\u02e5\u02e6\3\2\2\2\u02e6\u02e7"+
+ "\b9\2\2\u02e7s\3\2\2\2\u02e8\u02e9\7k\2\2\u02e9\u02ea\7u\2\2\u02ea\u02eb"+
+ "\7E\2\2\u02eb\u02ec\7q\2\2\u02ec\u02ed\7o\2\2\u02ed\u02ee\7r\2\2\u02ee"+
+ "\u02ef\7c\2\2\u02ef\u02f0\7t\2\2\u02f0\u02f1\7c\2\2\u02f1\u02f2\7d\2\2"+
+ "\u02f2\u02f3\7n\2\2\u02f3\u02f4\7g\2\2\u02f4\u02f5\3\2\2\2\u02f5\u02f6"+
+ "\b:\2\2\u02f6u\3\2\2\2\u02f7\u02f8\7u\2\2\u02f8\u02f9\7j\2\2\u02f9\u02fa"+
+ "\7c\2\2\u02fa\u02fb\7t\2\2\u02fb\u02fc\7g\2\2\u02fcw\3\2\2\2\u02fd\u02fe"+
+ "\7B\2\2\u02fe\u02ff\3\2\2\2\u02ff\u0300\b<\2\2\u0300y\3\2\2\2\u0301\u0302"+
+ "\7\60\2\2\u0302\u0303\7\60\2\2\u0303{\3\2\2\2\u0304\u0305\7u\2\2\u0305"+
+ "\u0306\7j\2\2\u0306\u0307\7c\2\2\u0307\u0308\7t\2\2\u0308\u0309\7g\2\2"+
+ "\u0309\u030a\7f\2\2\u030a}\3\2\2\2\u030b\u030c\7g\2\2\u030c\u030d\7z\2"+
+ "\2\u030d\u030e\7e\2\2\u030e\u030f\7n\2\2\u030f\u0310\7w\2\2\u0310\u0311"+
+ "\7u\2\2\u0311\u0312\7k\2\2\u0312\u0313\7x\2\2\u0313\u0314\7g\2\2\u0314"+
+ "\177\3\2\2\2\u0315\u0316\7r\2\2\u0316\u0317\7t\2\2\u0317\u0318\7g\2\2"+
+ "\u0318\u0319\7f\2\2\u0319\u031a\7k\2\2\u031a\u031b\7e\2\2\u031b\u031c"+
+ "\7c\2\2\u031c\u031d\7v\2\2\u031d\u031e\7g\2\2\u031e\u0081\3\2\2\2\u031f"+
+ "\u0320\7y\2\2\u0320\u0321\7t\2\2\u0321\u0322\7k\2\2\u0322\u0323\7v\2\2"+
+ "\u0323\u0324\7g\2\2\u0324\u0325\7R\2\2\u0325\u0326\7g\2\2\u0326\u0327"+
+ "\7t\2\2\u0327\u0328\7o\2\2\u0328\u0329\3\2\2\2\u0329\u032a\bA\2\2\u032a"+
+ "\u0083\3\2\2\2\u032b\u032c\7p\2\2\u032c\u032d\7q\2\2\u032d\u032e\7R\2"+
+ "\2\u032e\u032f\7g\2\2\u032f\u0330\7t\2\2\u0330\u0331\7o\2\2\u0331\u0332"+
+ "\3\2\2\2\u0332\u0333\bB\2\2\u0333\u0085\3\2\2\2\u0334\u0335\7v\2\2\u0335"+
+ "\u0336\7t\2\2\u0336\u0337\7w\2\2\u0337\u0338\7u\2\2\u0338\u0339\7v\2\2"+
+ "\u0339\u033a\7g\2\2\u033a\u033b\7f\2\2\u033b\u033c\3\2\2\2\u033c\u033d"+
+ "\bC\2\2\u033d\u0087\3\2\2\2\u033e\u033f\7q\2\2\u033f\u0340\7w\2\2\u0340"+
+ "\u0341\7v\2\2\u0341\u0342\7n\2\2\u0342\u0343\7k\2\2\u0343\u0344\7p\2\2"+
+ "\u0344\u0345\7g\2\2\u0345\u0089\3\2\2\2\u0346\u0347\7k\2\2\u0347\u0348"+
+ "\7p\2\2\u0348\u0349\7k\2\2\u0349\u034a\7v\2\2\u034a\u034b\7G\2\2\u034b"+
+ "\u034c\7p\2\2\u034c\u034d\7u\2\2\u034d\u034e\7w\2\2\u034e\u034f\7t\2\2"+
+ "\u034f\u0350\7g\2\2\u0350\u0351\7u\2\2\u0351\u008b\3\2\2\2\u0352\u0353"+
+ "\7k\2\2\u0353\u0354\7o\2\2\u0354\u0355\7r\2\2\u0355\u0356\7q\2\2\u0356"+
+ "\u0357\7t\2\2\u0357\u0358\7v\2\2\u0358\u0359\7T\2\2\u0359\u035a\7g\2\2"+
+ "\u035a\u035b\7s\2\2\u035b\u035c\7w\2\2\u035c\u035d\7k\2\2\u035d\u035e"+
+ "\7t\2\2\u035e\u035f\7g\2\2\u035f\u0360\7u\2\2\u0360\u008d\3\2\2\2\u0361"+
+ "\u0362\7r\2\2\u0362\u0363\7t\2\2\u0363\u0364\7q\2\2\u0364\u0365\7q\2\2"+
+ "\u0365\u0366\7h\2\2\u0366\u008f\3\2\2\2\u0367\u0368\7?\2\2\u0368\u0369"+
+ "\7?\2\2\u0369\u036a\7?\2\2\u036a\u0091\3\2\2\2\u036b\u036c\7#\2\2\u036c"+
+ "\u036d\7?\2\2\u036d\u036e\7?\2\2\u036e\u0093\3\2\2\2\u036f\u0370\7y\2"+
+ "\2\u0370\u0371\7k\2\2\u0371\u0372\7v\2\2\u0372\u0373\7j\2\2\u0373\u0095"+
+ "\3\2\2\2\u0374\u0375\7d\2\2\u0375\u0376\7t\2\2\u0376\u0377\7g\2\2\u0377"+
+ "\u0378\7c\2\2\u0378\u0379\7m\2\2\u0379\u037a\3\2\2\2\u037a\u037b\bK\2"+
+ "\2\u037b\u0097\3\2\2\2\u037c\u037d\7f\2\2\u037d\u037e\7g\2\2\u037e\u037f"+
+ "\7h\2\2\u037f\u0380\7c\2\2\u0380\u0381\7w\2\2\u0381\u0382\7n\2\2\u0382"+
+ "\u0383\7v\2\2\u0383\u0099\3\2\2\2\u0384\u0385\7h\2\2\u0385\u0386\7w\2"+
+ "\2\u0386\u0387\7p\2\2\u0387\u0388\7e\2\2\u0388\u009b\3\2\2\2\u0389\u038a"+
+ "\7k\2\2\u038a\u038b\7p\2\2\u038b\u038c\7v\2\2\u038c\u038d\7g\2\2\u038d"+
+ "\u038e\7t\2\2\u038e\u038f\7h\2\2\u038f\u0390\7c\2\2\u0390\u0391\7e\2\2"+
+ "\u0391\u0392\7g\2\2\u0392\u009d\3\2\2\2\u0393\u0394\7u\2\2\u0394\u0395"+
+ "\7g\2\2\u0395\u0396\7n\2\2\u0396\u0397\7g\2\2\u0397\u0398\7e\2\2\u0398"+
+ "\u0399\7v\2\2\u0399\u009f\3\2\2\2\u039a\u039b\7e\2\2\u039b\u039c\7c\2"+
+ "\2\u039c\u039d\7u\2\2\u039d\u039e\7g\2\2\u039e\u00a1\3\2\2\2\u039f\u03a0"+
+ "\7f\2\2\u03a0\u03a1\7g\2\2\u03a1\u03a2\7h\2\2\u03a2\u03a3\7g\2\2\u03a3"+
+ "\u03a4\7t\2\2\u03a4\u00a3\3\2\2\2\u03a5\u03a6\7i\2\2\u03a6\u03a7\7q\2"+
+ "\2\u03a7\u00a5\3\2\2\2\u03a8\u03a9\7o\2\2\u03a9\u03aa\7c\2\2\u03aa\u03ab"+
+ "\7r\2\2\u03ab\u00a7\3\2\2\2\u03ac\u03ad\7u\2\2\u03ad\u03ae\7v\2\2\u03ae"+
+ "\u03af\7t\2\2\u03af\u03b0\7w\2\2\u03b0\u03b1\7e\2\2\u03b1\u03b2\7v\2\2"+
+ "\u03b2\u00a9\3\2\2\2\u03b3\u03b4\7e\2\2\u03b4\u03b5\7j\2\2\u03b5\u03b6"+
+ "\7c\2\2\u03b6\u03b7\7p\2\2\u03b7\u00ab\3\2\2\2\u03b8\u03b9\7g\2\2\u03b9"+
+ "\u03ba\7n\2\2\u03ba\u03bb\7u\2\2\u03bb\u03bc\7g\2\2\u03bc\u00ad\3\2\2"+
+ "\2\u03bd\u03be\7i\2\2\u03be\u03bf\7q\2\2\u03bf\u03c0\7v\2\2\u03c0\u03c1"+
+ "\7q\2\2\u03c1\u00af\3\2\2\2\u03c2\u03c3\7r\2\2\u03c3\u03c4\7c\2\2\u03c4"+
+ "\u03c5\7e\2\2\u03c5\u03c6\7m\2\2\u03c6\u03c7\7c\2\2\u03c7\u03c8\7i\2\2"+
+ "\u03c8\u03c9\7g\2\2\u03c9\u00b1\3\2\2\2\u03ca\u03cb\7u\2\2\u03cb\u03cc"+
+ "\7y\2\2\u03cc\u03cd\7k\2\2\u03cd\u03ce\7v\2\2\u03ce\u03cf\7e\2\2\u03cf"+
+ "\u03d0\7j\2\2\u03d0\u00b3\3\2\2\2\u03d1\u03d2\7e\2\2\u03d2\u03d3\7q\2"+
+ "\2\u03d3\u03d4\7p\2\2\u03d4\u03d5\7u\2\2\u03d5\u03d6\7v\2\2\u03d6\u00b5"+
+ "\3\2\2\2\u03d7\u03d8\7h\2\2\u03d8\u03d9\7c\2\2\u03d9\u03da\7n\2\2\u03da"+
+ "\u03db\7n\2\2\u03db\u03dc\7v\2\2\u03dc\u03dd\7j\2\2\u03dd\u03de\7t\2\2"+
+ "\u03de\u03df\7q\2\2\u03df\u03e0\7w\2\2\u03e0\u03e1\7i\2\2\u03e1\u03e2"+
+ "\7j\2\2\u03e2\u03e3\3\2\2\2\u03e3\u03e4\b[\2\2\u03e4\u00b7\3\2\2\2\u03e5"+
+ "\u03e6\7k\2\2\u03e6\u03e7\7h\2\2\u03e7\u00b9\3\2\2\2\u03e8\u03e9\7t\2"+
+ "\2\u03e9\u03ea\7c\2\2\u03ea\u03eb\7p\2\2\u03eb\u03ec\7i\2\2\u03ec\u03ed"+
+ "\7g\2\2\u03ed\u00bb\3\2\2\2\u03ee\u03ef\7v\2\2\u03ef\u03f0\7{\2\2\u03f0"+
+ "\u03f1\7r\2\2\u03f1\u03f2\7g\2\2\u03f2\u00bd\3\2\2\2\u03f3\u03f4\7e\2"+
+ "\2\u03f4\u03f5\7q\2\2\u03f5\u03f6\7p\2\2\u03f6\u03f7\7v\2\2\u03f7\u03f8"+
+ "\7k\2\2\u03f8\u03f9\7p\2\2\u03f9\u03fa\7w\2\2\u03fa\u03fb\7g\2\2\u03fb"+
+ "\u03fc\3\2\2\2\u03fc\u03fd\b_\2\2\u03fd\u00bf\3\2\2\2\u03fe\u03ff\7h\2"+
+ "\2\u03ff\u0400\7q\2\2\u0400\u0401\7t\2\2\u0401\u00c1\3\2\2\2\u0402\u0403"+
+ "\7k\2\2\u0403\u0404\7o\2\2\u0404\u0405\7r\2\2\u0405\u0406\7q\2\2\u0406"+
+ "\u0407\7t\2\2\u0407\u0408\7v\2\2\u0408\u00c3\3\2\2\2\u0409\u040a\7t\2"+
+ "\2\u040a\u040b\7g\2\2\u040b\u040c\7v\2\2\u040c\u040d\7w\2\2\u040d\u040e"+
+ "\7t\2\2\u040e\u040f\7p\2\2\u040f\u0410\3\2\2\2\u0410\u0411\bb\2\2\u0411"+
+ "\u00c5\3\2\2\2\u0412\u0413\7x\2\2\u0413\u0414\7c\2\2\u0414\u0415\7t\2"+
+ "\2\u0415\u00c7\3\2\2\2\u0416\u0417\7p\2\2\u0417\u0418\7k\2\2\u0418\u0419"+
+ "\7n\2\2\u0419\u041a\3\2\2\2\u041a\u041b\bd\2\2\u041b\u00c9\3\2\2\2\u041c"+
+ "\u0421\5\u014c\u00a6\2\u041d\u0420\5\u014c\u00a6\2\u041e\u0420\5\u014e"+
+ "\u00a7\2\u041f\u041d\3\2\2\2\u041f\u041e\3\2\2\2\u0420\u0423\3\2\2\2\u0421"+
+ "\u041f\3\2\2\2\u0421\u0422\3\2\2\2\u0422\u0424\3\2\2\2\u0423\u0421\3\2"+
+ "\2\2\u0424\u0425\be\2\2\u0425\u00cb\3\2\2\2\u0426\u0427\7*\2\2\u0427\u00cd"+
+ "\3\2\2\2\u0428\u0429\7+\2\2\u0429\u042a\3\2\2\2\u042a\u042b\bg\2\2\u042b"+
+ "\u00cf\3\2\2\2\u042c\u042d\7}\2\2\u042d\u00d1\3\2\2\2\u042e\u042f\7\177"+
+ "\2\2\u042f\u0430\3\2\2\2\u0430\u0431\bi\2\2\u0431\u00d3\3\2\2\2\u0432"+
+ "\u0433\7]\2\2\u0433\u00d5\3\2\2\2\u0434\u0435\7_\2\2\u0435\u0436\3\2\2"+
+ "\2\u0436\u0437\bk\2\2\u0437\u00d7\3\2\2\2\u0438\u0439\7?\2\2\u0439\u00d9"+
+ "\3\2\2\2\u043a\u043b\7.\2\2\u043b\u00db\3\2\2\2\u043c\u043d\7=\2\2\u043d"+
+ "\u00dd\3\2\2\2\u043e\u043f\7<\2\2\u043f\u00df\3\2\2\2\u0440\u0441\7\60"+
+ "\2\2\u0441\u00e1\3\2\2\2\u0442\u0443\7-\2\2\u0443\u0444\7-\2\2\u0444\u0445"+
+ "\3\2\2\2\u0445\u0446\bq\2\2\u0446\u00e3\3\2\2\2\u0447\u0448\7/\2\2\u0448"+
+ "\u0449\7/\2\2\u0449\u044a\3\2\2\2\u044a\u044b\br\2\2\u044b\u00e5\3\2\2"+
+ "\2\u044c\u044d\7<\2\2\u044d\u044e\7?\2\2\u044e\u00e7\3\2\2\2\u044f\u0450"+
+ "\7\60\2\2\u0450\u0451\7\60\2\2\u0451\u0452\7\60\2\2\u0452\u00e9\3\2\2"+
+ "\2\u0453\u0454\7~\2\2\u0454\u0455\7~\2\2\u0455\u00eb\3\2\2\2\u0456\u0457"+
+ "\7(\2\2\u0457\u0458\7(\2\2\u0458\u00ed\3\2\2\2\u0459\u045a\7?\2\2\u045a"+
+ "\u045b\7?\2\2\u045b\u00ef\3\2\2\2\u045c\u045d\7#\2\2\u045d\u045e\7?\2"+
+ "\2\u045e\u00f1\3\2\2\2\u045f\u0460\7>\2\2\u0460\u00f3\3\2\2\2\u0461\u0462"+
+ "\7>\2\2\u0462\u0463\7?\2\2\u0463\u00f5\3\2\2\2\u0464\u0465\7@\2\2\u0465"+
+ "\u00f7\3\2\2\2\u0466\u0467\7@\2\2\u0467\u0468\7?\2\2\u0468\u00f9\3\2\2"+
+ "\2\u0469\u046a\7~\2\2\u046a\u00fb\3\2\2\2\u046b\u046c\7\61\2\2\u046c\u00fd"+
+ "\3\2\2\2\u046d\u046e\7\'\2\2\u046e\u00ff\3\2\2\2\u046f\u0470\7>\2\2\u0470"+
+ "\u0471\7>\2\2\u0471\u0101\3\2\2\2\u0472\u0473\7@\2\2\u0473\u0474\7@\2"+
+ "\2\u0474\u0103\3\2\2\2\u0475\u0476\7(\2\2\u0476\u0477\7`\2\2\u0477\u0105"+
+ "\3\2\2\2\u0478\u0479\7#\2\2\u0479\u0107\3\2\2\2\u047a\u047b\7-\2\2\u047b"+
+ "\u0109\3\2\2\2\u047c\u047d\7/\2\2\u047d\u010b\3\2\2\2\u047e\u047f\7`\2"+
+ "\2\u047f\u010d\3\2\2\2\u0480\u0481\7,\2\2\u0481\u010f\3\2\2\2\u0482\u0483"+
+ "\7(\2\2\u0483\u0111\3\2\2\2\u0484\u0485\7>\2\2\u0485\u0486\7/\2\2\u0486"+
+ "\u0113\3\2\2\2\u0487\u0493\7\62\2\2\u0488\u048f\t\2\2\2\u0489\u048b\7"+
+ "a\2\2\u048a\u0489\3\2\2\2\u048a\u048b\3\2\2\2\u048b\u048c\3\2\2\2\u048c"+
+ "\u048e\t\3\2\2\u048d\u048a\3\2\2\2\u048e\u0491\3\2\2\2\u048f\u048d\3\2"+
+ "\2\2\u048f\u0490\3\2\2\2\u0490\u0493\3\2\2\2\u0491\u048f\3\2\2\2\u0492"+
+ "\u0487\3\2\2\2\u0492\u0488\3\2\2\2\u0493\u0494\3\2\2\2\u0494\u0495\b\u008a"+
+ "\2\2\u0495\u0115\3\2\2\2\u0496\u0497\7\62\2\2\u0497\u049c\t\4\2\2\u0498"+
+ "\u049a\7a\2\2\u0499\u0498\3\2\2\2\u0499\u049a\3\2\2\2\u049a\u049b\3\2"+
+ "\2\2\u049b\u049d\5\u0148\u00a4\2\u049c\u0499\3\2\2\2\u049d\u049e\3\2\2"+
+ "\2\u049e\u049c\3\2\2\2\u049e\u049f\3\2\2\2\u049f\u04a0\3\2\2\2\u04a0\u04a1"+
+ "\b\u008b\2\2\u04a1\u0117\3\2\2\2\u04a2\u04a4\7\62\2\2\u04a3\u04a5\t\5"+
+ "\2\2\u04a4\u04a3\3\2\2\2\u04a4\u04a5\3\2\2\2\u04a5\u04aa\3\2\2\2\u04a6"+
+ "\u04a8\7a\2\2\u04a7\u04a6\3\2\2\2\u04a7\u04a8\3\2\2\2\u04a8\u04a9\3\2"+
+ "\2\2\u04a9\u04ab\5\u0144\u00a2\2\u04aa\u04a7\3\2\2\2\u04ab\u04ac\3\2\2"+
+ "\2\u04ac\u04aa\3\2\2\2\u04ac\u04ad\3\2\2\2\u04ad\u04ae\3\2\2\2\u04ae\u04af"+
+ "\b\u008c\2\2\u04af\u0119\3\2\2\2\u04b0\u04b1\7\62\2\2\u04b1\u04b6\t\6"+
+ "\2\2\u04b2\u04b4\7a\2\2\u04b3\u04b2\3\2\2\2\u04b3\u04b4\3\2\2\2\u04b4"+
+ "\u04b5\3\2\2\2\u04b5\u04b7\5\u0146\u00a3\2\u04b6\u04b3\3\2\2\2\u04b7\u04b8"+
+ "\3\2\2\2\u04b8\u04b6\3\2\2\2\u04b8\u04b9\3\2\2\2\u04b9\u04ba\3\2\2\2\u04ba"+
+ "\u04bb\b\u008d\2\2\u04bb\u011b\3\2\2\2\u04bc\u04bd\7\62\2\2\u04bd\u04be"+
+ "\t\6\2\2\u04be\u04bf\5\u011e\u008f\2\u04bf\u04c0\5\u0120\u0090\2\u04c0"+
+ "\u011d\3\2\2\2\u04c1\u04c3\7a\2\2\u04c2\u04c1\3\2\2\2\u04c2\u04c3\3\2"+
+ "\2\2\u04c3\u04c4\3\2\2\2\u04c4\u04c6\5\u0146\u00a3\2\u04c5\u04c2\3\2\2"+
+ "\2\u04c6\u04c7\3\2\2\2\u04c7\u04c5\3\2\2\2\u04c7\u04c8\3\2\2\2\u04c8\u04d3"+
+ "\3\2\2\2\u04c9\u04d0\7\60\2\2\u04ca\u04cc\7a\2\2\u04cb\u04ca\3\2\2\2\u04cb"+
+ "\u04cc\3\2\2\2\u04cc\u04cd\3\2\2\2\u04cd\u04cf\5\u0146\u00a3\2\u04ce\u04cb"+
+ "\3\2\2\2\u04cf\u04d2\3\2\2\2\u04d0\u04ce\3\2\2\2\u04d0\u04d1\3\2\2\2\u04d1"+
+ "\u04d4\3\2\2\2\u04d2\u04d0\3\2\2\2\u04d3\u04c9\3\2\2\2\u04d3\u04d4\3\2"+
+ "\2\2\u04d4\u04e1\3\2\2\2\u04d5\u04d6\7\60\2\2\u04d6\u04dd\5\u0146\u00a3"+
+ "\2\u04d7\u04d9\7a\2\2\u04d8\u04d7\3\2\2\2\u04d8\u04d9\3\2\2\2\u04d9\u04da"+
+ "\3\2\2\2\u04da\u04dc\5\u0146\u00a3\2\u04db\u04d8\3\2\2\2\u04dc\u04df\3"+
+ "\2\2\2\u04dd\u04db\3\2\2\2\u04dd\u04de\3\2\2\2\u04de\u04e1\3\2\2\2\u04df"+
+ "\u04dd\3\2\2\2\u04e0\u04c5\3\2\2\2\u04e0\u04d5\3\2\2\2\u04e1\u011f\3\2"+
+ "\2\2\u04e2\u04e3\t\7\2\2\u04e3\u04e4\t\b\2\2\u04e4\u04e5\5\u0142\u00a1"+
+ "\2\u04e5\u0121\3\2\2\2\u04e6\u04ec\5\u0114\u008a\2\u04e7\u04ec\5\u0116"+
+ "\u008b\2\u04e8\u04ec\5\u0118\u008c\2\u04e9\u04ec\5\u011a\u008d\2\u04ea"+
+ "\u04ec\5\4\2\2\u04eb\u04e6\3\2\2\2\u04eb\u04e7\3\2\2\2\u04eb\u04e8\3\2"+
+ "\2\2\u04eb\u04e9\3\2\2\2\u04eb\u04ea\3\2\2\2\u04ec\u04ed\3\2\2\2\u04ed"+
+ "\u04ee\7k\2\2\u04ee\u04ef\3\2\2\2\u04ef\u04f0\b\u0091\2\2\u04f0\u0123"+
+ "\3\2\2\2\u04f1\u04f4\7)\2\2\u04f2\u04f5\5\u013e\u009f\2\u04f3\u04f5\5"+
+ "\u0128\u0094\2\u04f4\u04f2\3\2\2\2\u04f4\u04f3\3\2\2\2\u04f5\u04f6\3\2"+
+ "\2\2\u04f6\u04f7\7)\2\2\u04f7\u0125\3\2\2\2\u04f8\u04f9\5\u0124\u0092"+
+ "\2\u04f9\u04fa\3\2\2\2\u04fa\u04fb\b\u0093\2\2\u04fb\u0127\3\2\2\2\u04fc"+
+ "\u04ff\5\u012a\u0095\2\u04fd\u04ff\5\u012c\u0096\2\u04fe\u04fc\3\2\2\2"+
+ "\u04fe\u04fd\3\2\2\2\u04ff\u0129\3\2\2\2\u0500\u0501\7^\2\2\u0501\u0502"+
+ "\5\u0144\u00a2\2\u0502\u0503\5\u0144\u00a2\2\u0503\u0504\5\u0144\u00a2"+
+ "\2\u0504\u012b\3\2\2\2\u0505\u0506\7^\2\2\u0506\u0507\7z\2\2\u0507\u0508"+
+ "\5\u0146\u00a3\2\u0508\u0509\5\u0146\u00a3\2\u0509\u012d\3\2\2\2\u050a"+
+ "\u050b\7^\2\2\u050b\u050c\7w\2\2\u050c\u050d\5\u0146\u00a3\2\u050d\u050e"+
+ "\5\u0146\u00a3\2\u050e\u050f\5\u0146\u00a3\2\u050f\u0510\5\u0146\u00a3"+
+ "\2\u0510\u012f\3\2\2\2\u0511\u0512\7^\2\2\u0512\u0513\7W\2\2\u0513\u0514"+
+ "\5\u0146\u00a3\2\u0514\u0515\5\u0146\u00a3\2\u0515\u0516\5\u0146\u00a3"+
+ "\2\u0516\u0517\5\u0146\u00a3\2\u0517\u0518\5\u0146\u00a3\2\u0518\u0519"+
+ "\5\u0146\u00a3\2\u0519\u051a\5\u0146\u00a3\2\u051a\u051b\5\u0146\u00a3"+
+ "\2\u051b\u0131\3\2\2\2\u051c\u0520\7b\2\2\u051d\u051f\n\t\2\2\u051e\u051d"+
+ "\3\2\2\2\u051f\u0522\3\2\2\2\u0520\u051e\3\2\2\2\u0520\u0521\3\2\2\2\u0521"+
+ "\u0523\3\2\2\2\u0522\u0520\3\2\2\2\u0523\u0524\7b\2\2\u0524\u0525\3\2"+
+ "\2\2\u0525\u0526\b\u0099\2\2\u0526\u0133\3\2\2\2\u0527\u052c\7$\2\2\u0528"+
+ "\u052b\n\n\2\2\u0529\u052b\5\u0140\u00a0\2\u052a\u0528\3\2\2\2\u052a\u0529"+
+ "\3\2\2\2\u052b\u052e\3\2\2\2\u052c\u052a\3\2\2\2\u052c\u052d\3\2\2\2\u052d"+
+ "\u052f\3\2\2\2\u052e\u052c\3\2\2\2\u052f\u0530\7$\2\2\u0530\u0531\3\2"+
+ "\2\2\u0531\u0532\b\u009a\2\2\u0532\u0135\3\2\2\2\u0533\u0535\t\13\2\2"+
+ "\u0534\u0533\3\2\2\2\u0535\u0536\3\2\2\2\u0536\u0534\3\2\2\2\u0536\u0537"+
+ "\3\2\2\2\u0537\u0538\3\2\2\2\u0538\u0539\b\u009b\3\2\u0539\u0137\3\2\2"+
+ "\2\u053a\u053b\7\61\2\2\u053b\u053c\7,\2\2\u053c\u0540\3\2\2\2\u053d\u053f"+
+ "\13\2\2\2\u053e\u053d\3\2\2\2\u053f\u0542\3\2\2\2\u0540\u0541\3\2\2\2"+
+ "\u0540\u053e\3\2\2\2\u0541\u0543\3\2\2\2\u0542\u0540\3\2\2\2\u0543\u0544"+
+ "\7,\2\2\u0544\u0545\7\61\2\2\u0545\u0546\3\2\2\2\u0546\u0547\b\u009c\3"+
+ "\2\u0547\u0139\3\2\2\2\u0548\u054a\t\f\2\2\u0549\u0548\3\2\2\2\u054a\u054b"+
+ "\3\2\2\2\u054b\u0549\3\2\2\2\u054b\u054c\3\2\2\2\u054c\u054d\3\2\2\2\u054d"+
+ "\u054e\b\u009d\3\2\u054e\u013b\3\2\2\2\u054f\u0550\7\61\2\2\u0550\u0551"+
+ "\7\61\2\2\u0551\u0555\3\2\2\2\u0552\u0554\n\f\2\2\u0553\u0552\3\2\2\2"+
+ "\u0554\u0557\3\2\2\2\u0555\u0553\3\2\2\2\u0555\u0556\3\2\2\2\u0556\u0558"+
+ "\3\2\2\2\u0557\u0555\3\2\2\2\u0558\u0559\b\u009e\3\2\u0559\u013d\3\2\2"+
+ "\2\u055a\u055f\n\r\2\2\u055b\u055f\5\u012e\u0097\2\u055c\u055f\5\u0130"+
+ "\u0098\2\u055d\u055f\5\u0140\u00a0\2\u055e\u055a\3\2\2\2\u055e\u055b\3"+
+ "\2\2\2\u055e\u055c\3\2\2\2\u055e\u055d\3\2\2\2\u055f\u013f\3\2\2\2\u0560"+
+ "\u057a\7^\2\2\u0561\u0562\7w\2\2\u0562\u0563\5\u0146\u00a3\2\u0563\u0564"+
+ "\5\u0146\u00a3\2\u0564\u0565\5\u0146\u00a3\2\u0565\u0566\5\u0146\u00a3"+
+ "\2\u0566\u057b\3\2\2\2\u0567\u0568\7W\2\2\u0568\u0569\5\u0146\u00a3\2"+
+ "\u0569\u056a\5\u0146\u00a3\2\u056a\u056b\5\u0146\u00a3\2\u056b\u056c\5"+
+ "\u0146\u00a3\2\u056c\u056d\5\u0146\u00a3\2\u056d\u056e\5\u0146\u00a3\2"+
+ "\u056e\u056f\5\u0146\u00a3\2\u056f\u0570\5\u0146\u00a3\2\u0570\u057b\3"+
+ "\2\2\2\u0571\u057b\t\16\2\2\u0572\u0573\5\u0144\u00a2\2\u0573\u0574\5"+
+ "\u0144\u00a2\2\u0574\u0575\5\u0144\u00a2\2\u0575\u057b\3\2\2\2\u0576\u0577"+
+ "\7z\2\2\u0577\u0578\5\u0146\u00a3\2\u0578\u0579\5\u0146\u00a3\2\u0579"+
+ "\u057b\3\2\2\2\u057a\u0561\3\2\2\2\u057a\u0567\3\2\2\2\u057a\u0571\3\2"+
+ "\2\2\u057a\u0572\3\2\2\2\u057a\u0576\3\2\2\2\u057b\u0141\3\2\2\2\u057c"+
+ "\u0583\t\3\2\2\u057d\u057f\7a\2\2\u057e\u057d\3\2\2\2\u057e\u057f\3\2"+
+ "\2\2\u057f\u0580\3\2\2\2\u0580\u0582\t\3\2\2\u0581\u057e\3\2\2\2\u0582"+
+ "\u0585\3\2\2\2\u0583\u0581\3\2\2\2\u0583\u0584\3\2\2\2\u0584\u0143\3\2"+
+ "\2\2\u0585\u0583\3\2\2\2\u0586\u0587\t\17\2\2\u0587\u0145\3\2\2\2\u0588"+
+ "\u0589\t\20\2\2\u0589\u0147\3\2\2\2\u058a\u058b\t\21\2\2\u058b\u0149\3"+
+ "\2\2\2\u058c\u058e\t\22\2\2\u058d\u058f\t\b\2\2\u058e\u058d\3\2\2\2\u058e"+
+ "\u058f\3\2\2\2\u058f\u0590\3\2\2\2\u0590\u0591\5\u0142\u00a1\2\u0591\u014b"+
+ "\3\2\2\2\u0592\u0595\5\u0150\u00a8\2\u0593\u0595\7a\2\2\u0594\u0592\3"+
+ "\2\2\2\u0594\u0593\3\2\2\2\u0595\u014d\3\2\2\2\u0596\u0597\t\23\2\2\u0597"+
+ "\u014f\3\2\2\2\u0598\u0599\t\24\2\2\u0599\u0151\3\2\2\2\u059a\u059c\t"+
+ "\13\2\2\u059b\u059a\3\2\2\2\u059c\u059d\3\2\2\2\u059d\u059b\3\2\2\2\u059d"+
+ "\u059e\3\2\2\2\u059e\u059f\3\2\2\2\u059f\u05a0\b\u00a9\3\2\u05a0\u0153"+
+ "\3\2\2\2\u05a1\u05a2\7\61\2\2\u05a2\u05a3\7,\2\2\u05a3\u05a7\3\2\2\2\u05a4"+
+ "\u05a6\n\f\2\2\u05a5\u05a4\3\2\2\2\u05a6\u05a9\3\2\2\2\u05a7\u05a8\3\2"+
+ "\2\2\u05a7\u05a5\3\2\2\2\u05a8\u05aa\3\2\2\2\u05a9\u05a7\3\2\2\2\u05aa"+
+ "\u05ab\7,\2\2\u05ab\u05ac\7\61\2\2\u05ac\u05ad\3\2\2\2\u05ad\u05ae\b\u00aa"+
+ "\3\2\u05ae\u0155\3\2\2\2\u05af\u05b0\7\61\2\2\u05b0\u05b1\7\61\2\2\u05b1"+
+ "\u05b5\3\2\2\2\u05b2\u05b4\n\f\2\2\u05b3\u05b2\3\2\2\2\u05b4\u05b7\3\2"+
+ "\2\2\u05b5\u05b3\3\2\2\2\u05b5\u05b6\3\2\2\2\u05b6\u05b8\3\2\2\2\u05b7"+
+ "\u05b5\3\2\2\2\u05b8\u05b9\b\u00ab\3\2\u05b9\u0157\3\2\2\2\u05ba\u05bc"+
+ "\t\f\2\2\u05bb\u05ba\3\2\2\2\u05bc\u05bd\3\2\2\2\u05bd\u05bb\3\2\2\2\u05bd"+
+ "\u05be\3\2\2\2\u05be\u05cd\3\2\2\2\u05bf\u05cd\7=\2\2\u05c0\u05c1\7\61"+
+ "\2\2\u05c1\u05c2\7,\2\2\u05c2\u05c6\3\2\2\2\u05c3\u05c5\13\2\2\2\u05c4"+
+ "\u05c3\3\2\2\2\u05c5\u05c8\3\2\2\2\u05c6\u05c7\3\2\2\2\u05c6\u05c4\3\2"+
+ "\2\2\u05c7\u05c9\3\2\2\2\u05c8\u05c6\3\2\2\2\u05c9\u05ca\7,\2\2\u05ca"+
+ "\u05cd\7\61\2\2\u05cb\u05cd\7\2\2\3\u05cc\u05bb\3\2\2\2\u05cc\u05bf\3"+
+ "\2\2\2\u05cc\u05c0\3\2\2\2\u05cc\u05cb\3\2\2\2\u05cd\u05ce\3\2\2\2\u05ce"+
+ "\u05cf\b\u00ac\4\2\u05cf\u0159\3\2\2\2\u05d0\u05d1\3\2\2\2\u05d1\u05d2"+
+ "\3\2\2\2\u05d2\u05d3\b\u00ad\4\2\u05d3\u05d4\b\u00ad\3\2\u05d4\u015b\3"+
+ "\2\2\2\64\2\3\u015e\u0166\u0169\u016c\u0172\u0174\u041f\u0421\u048a\u048f"+
+ "\u0492\u0499\u049e\u04a4\u04a7\u04ac\u04b3\u04b8\u04c2\u04c7\u04cb\u04d0"+
+ "\u04d3\u04d8\u04dd\u04e0\u04eb\u04f4\u04fe\u0520\u052a\u052c\u0536\u0540"+
+ "\u054b\u0555\u055e\u057a\u057e\u0583\u058e\u0594\u059d\u05a7\u05b5\u05bd"+
+ "\u05c6\u05cc\5\4\3\2\2\3\2\4\2\2";
public static final ATN _ATN =
new ATNDeserializer().deserialize(_serializedATN.toCharArray());
static {
diff --git a/src/main/java/viper/gobra/frontend/GobraParser.java b/src/main/java/viper/gobra/frontend/GobraParser.java
index cfa628934..30c539f37 100644
--- a/src/main/java/viper/gobra/frontend/GobraParser.java
+++ b/src/main/java/viper/gobra/frontend/GobraParser.java
@@ -24,25 +24,25 @@ public class GobraParser extends GobraParserBase {
UNION=30, INTERSECTION=31, SETMINUS=32, IMPLIES=33, WAND=34, APPLY=35,
QMARK=36, L_PRED=37, R_PRED=38, SEQ=39, SET=40, MSET=41, DICT=42, OPT=43,
LEN=44, NEW=45, MAKE=46, CAP=47, SOME=48, GET=49, DOM=50, AXIOM=51, ADT=52,
- NONE=53, PRED=54, TYPE_OF=55, IS_COMPARABLE=56, SHARE=57, ADDR_MOD=58,
- DOT_DOT=59, SHARED=60, EXCLUSIVE=61, PREDICATE=62, WRITEPERM=63, NOPERM=64,
- TRUSTED=65, OUTLINE=66, INIT_POST=67, IMPORT_PRE=68, PROOF=69, GHOST_EQUALS=70,
- GHOST_NOT_EQUALS=71, WITH=72, BREAK=73, DEFAULT=74, FUNC=75, INTERFACE=76,
- SELECT=77, CASE=78, DEFER=79, GO=80, MAP=81, STRUCT=82, CHAN=83, ELSE=84,
- GOTO=85, PACKAGE=86, SWITCH=87, CONST=88, FALLTHROUGH=89, IF=90, RANGE=91,
- TYPE=92, CONTINUE=93, FOR=94, IMPORT=95, RETURN=96, VAR=97, NIL_LIT=98,
- IDENTIFIER=99, L_PAREN=100, R_PAREN=101, L_CURLY=102, R_CURLY=103, L_BRACKET=104,
- R_BRACKET=105, ASSIGN=106, COMMA=107, SEMI=108, COLON=109, DOT=110, PLUS_PLUS=111,
- MINUS_MINUS=112, DECLARE_ASSIGN=113, ELLIPSIS=114, LOGICAL_OR=115, LOGICAL_AND=116,
- EQUALS=117, NOT_EQUALS=118, LESS=119, LESS_OR_EQUALS=120, GREATER=121,
- GREATER_OR_EQUALS=122, OR=123, DIV=124, MOD=125, LSHIFT=126, RSHIFT=127,
- BIT_CLEAR=128, EXCLAMATION=129, PLUS=130, MINUS=131, CARET=132, STAR=133,
- AMPERSAND=134, RECEIVE=135, DECIMAL_LIT=136, BINARY_LIT=137, OCTAL_LIT=138,
- HEX_LIT=139, HEX_FLOAT_LIT=140, IMAGINARY_LIT=141, RUNE_LIT=142, BYTE_VALUE=143,
- OCTAL_BYTE_VALUE=144, HEX_BYTE_VALUE=145, LITTLE_U_VALUE=146, BIG_U_VALUE=147,
- RAW_STRING_LIT=148, INTERPRETED_STRING_LIT=149, WS=150, COMMENT=151, TERMINATOR=152,
- LINE_COMMENT=153, WS_NLSEMI=154, COMMENT_NLSEMI=155, LINE_COMMENT_NLSEMI=156,
- EOS=157, OTHER=158;
+ MATCH=53, NONE=54, PRED=55, TYPE_OF=56, IS_COMPARABLE=57, SHARE=58, ADDR_MOD=59,
+ DOT_DOT=60, SHARED=61, EXCLUSIVE=62, PREDICATE=63, WRITEPERM=64, NOPERM=65,
+ TRUSTED=66, OUTLINE=67, INIT_POST=68, IMPORT_PRE=69, PROOF=70, GHOST_EQUALS=71,
+ GHOST_NOT_EQUALS=72, WITH=73, BREAK=74, DEFAULT=75, FUNC=76, INTERFACE=77,
+ SELECT=78, CASE=79, DEFER=80, GO=81, MAP=82, STRUCT=83, CHAN=84, ELSE=85,
+ GOTO=86, PACKAGE=87, SWITCH=88, CONST=89, FALLTHROUGH=90, IF=91, RANGE=92,
+ TYPE=93, CONTINUE=94, FOR=95, IMPORT=96, RETURN=97, VAR=98, NIL_LIT=99,
+ IDENTIFIER=100, L_PAREN=101, R_PAREN=102, L_CURLY=103, R_CURLY=104, L_BRACKET=105,
+ R_BRACKET=106, ASSIGN=107, COMMA=108, SEMI=109, COLON=110, DOT=111, PLUS_PLUS=112,
+ MINUS_MINUS=113, DECLARE_ASSIGN=114, ELLIPSIS=115, LOGICAL_OR=116, LOGICAL_AND=117,
+ EQUALS=118, NOT_EQUALS=119, LESS=120, LESS_OR_EQUALS=121, GREATER=122,
+ GREATER_OR_EQUALS=123, OR=124, DIV=125, MOD=126, LSHIFT=127, RSHIFT=128,
+ BIT_CLEAR=129, EXCLAMATION=130, PLUS=131, MINUS=132, CARET=133, STAR=134,
+ AMPERSAND=135, RECEIVE=136, DECIMAL_LIT=137, BINARY_LIT=138, OCTAL_LIT=139,
+ HEX_LIT=140, HEX_FLOAT_LIT=141, IMAGINARY_LIT=142, RUNE_LIT=143, BYTE_VALUE=144,
+ OCTAL_BYTE_VALUE=145, HEX_BYTE_VALUE=146, LITTLE_U_VALUE=147, BIG_U_VALUE=148,
+ RAW_STRING_LIT=149, INTERPRETED_STRING_LIT=150, WS=151, COMMENT=152, TERMINATOR=153,
+ LINE_COMMENT=154, WS_NLSEMI=155, COMMENT_NLSEMI=156, LINE_COMMENT_NLSEMI=157,
+ EOS=158, OTHER=159;
public static final int
RULE_exprOnly = 0, RULE_stmtOnly = 1, RULE_typeOnly = 2, RULE_maybeAddressableIdentifierList = 3,
RULE_maybeAddressableIdentifier = 4, RULE_sourceFile = 5, RULE_initPost = 6,
@@ -53,47 +53,50 @@ public class GobraParser extends GobraParserBase {
RULE_triggers = 20, RULE_trigger = 21, RULE_predicateAccess = 22, RULE_optionSome = 23,
RULE_optionNone = 24, RULE_optionGet = 25, RULE_sConversion = 26, RULE_old = 27,
RULE_oldLabelUse = 28, RULE_labelUse = 29, RULE_before = 30, RULE_isComparable = 31,
- RULE_typeOf = 32, RULE_access = 33, RULE_range = 34, RULE_seqUpdExp = 35,
- RULE_seqUpdClause = 36, RULE_ghostTypeLit = 37, RULE_domainType = 38,
- RULE_domainClause = 39, RULE_adtType = 40, RULE_adtClause = 41, RULE_ghostSliceType = 42,
- RULE_sqType = 43, RULE_specification = 44, RULE_specStatement = 45, RULE_terminationMeasure = 46,
- RULE_assertion = 47, RULE_blockWithBodyParameterInfo = 48, RULE_closureSpecInstance = 49,
- RULE_closureSpecParams = 50, RULE_closureSpecParam = 51, RULE_closureImplProofStmt = 52,
- RULE_implementationProof = 53, RULE_methodImplementationProof = 54, RULE_nonLocalReceiver = 55,
- RULE_selection = 56, RULE_implementationProofPredicateAlias = 57, RULE_make = 58,
- RULE_new_ = 59, RULE_specMember = 60, RULE_functionDecl = 61, RULE_methodDecl = 62,
- RULE_explicitGhostMember = 63, RULE_fpredicateDecl = 64, RULE_predicateBody = 65,
- RULE_mpredicateDecl = 66, RULE_varSpec = 67, RULE_shortVarDecl = 68, RULE_receiver = 69,
- RULE_parameterDecl = 70, RULE_actualParameterDecl = 71, RULE_ghostParameterDecl = 72,
- RULE_parameterType = 73, RULE_expression = 74, RULE_statement = 75, RULE_applyStmt = 76,
- RULE_packageStmt = 77, RULE_specForStmt = 78, RULE_loopSpec = 79, RULE_deferStmt = 80,
- RULE_basicLit = 81, RULE_primaryExpr = 82, RULE_functionLit = 83, RULE_closureDecl = 84,
- RULE_predConstructArgs = 85, RULE_interfaceType = 86, RULE_predicateSpec = 87,
- RULE_methodSpec = 88, RULE_type_ = 89, RULE_typeLit = 90, RULE_predType = 91,
- RULE_predTypeParams = 92, RULE_literalType = 93, RULE_implicitArray = 94,
- RULE_slice_ = 95, RULE_low = 96, RULE_high = 97, RULE_cap = 98, RULE_assign_op = 99,
- RULE_rangeClause = 100, RULE_packageClause = 101, RULE_importPath = 102,
- RULE_declaration = 103, RULE_constDecl = 104, RULE_constSpec = 105, RULE_identifierList = 106,
- RULE_expressionList = 107, RULE_typeDecl = 108, RULE_typeSpec = 109, RULE_varDecl = 110,
- RULE_block = 111, RULE_statementList = 112, RULE_simpleStmt = 113, RULE_expressionStmt = 114,
- RULE_sendStmt = 115, RULE_incDecStmt = 116, RULE_assignment = 117, RULE_emptyStmt = 118,
- RULE_labeledStmt = 119, RULE_returnStmt = 120, RULE_breakStmt = 121, RULE_continueStmt = 122,
- RULE_gotoStmt = 123, RULE_fallthroughStmt = 124, RULE_ifStmt = 125, RULE_switchStmt = 126,
- RULE_exprSwitchStmt = 127, RULE_exprCaseClause = 128, RULE_exprSwitchCase = 129,
- RULE_typeSwitchStmt = 130, RULE_typeSwitchGuard = 131, RULE_typeCaseClause = 132,
- RULE_typeSwitchCase = 133, RULE_typeList = 134, RULE_selectStmt = 135,
- RULE_commClause = 136, RULE_commCase = 137, RULE_recvStmt = 138, RULE_forStmt = 139,
- RULE_forClause = 140, RULE_goStmt = 141, RULE_typeName = 142, RULE_arrayType = 143,
- RULE_arrayLength = 144, RULE_elementType = 145, RULE_pointerType = 146,
- RULE_sliceType = 147, RULE_mapType = 148, RULE_channelType = 149, RULE_functionType = 150,
- RULE_signature = 151, RULE_result = 152, RULE_parameters = 153, RULE_conversion = 154,
- RULE_nonNamedType = 155, RULE_operand = 156, RULE_literal = 157, RULE_integer = 158,
- RULE_operandName = 159, RULE_qualifiedIdent = 160, RULE_compositeLit = 161,
- RULE_literalValue = 162, RULE_elementList = 163, RULE_keyedElement = 164,
- RULE_key = 165, RULE_element = 166, RULE_structType = 167, RULE_fieldDecl = 168,
- RULE_string_ = 169, RULE_embeddedField = 170, RULE_index = 171, RULE_typeAssertion = 172,
- RULE_arguments = 173, RULE_methodExpr = 174, RULE_receiverType = 175,
- RULE_eos = 176;
+ RULE_typeOf = 32, RULE_access = 33, RULE_range = 34, RULE_matchExpr = 35,
+ RULE_matchExprClause = 36, RULE_seqUpdExp = 37, RULE_seqUpdClause = 38,
+ RULE_ghostTypeLit = 39, RULE_domainType = 40, RULE_domainClause = 41,
+ RULE_adtType = 42, RULE_adtClause = 43, RULE_ghostSliceType = 44, RULE_sqType = 45,
+ RULE_specification = 46, RULE_specStatement = 47, RULE_terminationMeasure = 48,
+ RULE_assertion = 49, RULE_matchStmt = 50, RULE_matchStmtClause = 51, RULE_matchCase = 52,
+ RULE_matchPattern = 53, RULE_matchPatternList = 54, RULE_blockWithBodyParameterInfo = 55,
+ RULE_closureSpecInstance = 56, RULE_closureSpecParams = 57, RULE_closureSpecParam = 58,
+ RULE_closureImplProofStmt = 59, RULE_implementationProof = 60, RULE_methodImplementationProof = 61,
+ RULE_nonLocalReceiver = 62, RULE_selection = 63, RULE_implementationProofPredicateAlias = 64,
+ RULE_make = 65, RULE_new_ = 66, RULE_specMember = 67, RULE_functionDecl = 68,
+ RULE_methodDecl = 69, RULE_explicitGhostMember = 70, RULE_fpredicateDecl = 71,
+ RULE_predicateBody = 72, RULE_mpredicateDecl = 73, RULE_varSpec = 74,
+ RULE_shortVarDecl = 75, RULE_receiver = 76, RULE_parameterDecl = 77, RULE_actualParameterDecl = 78,
+ RULE_ghostParameterDecl = 79, RULE_parameterType = 80, RULE_expression = 81,
+ RULE_statement = 82, RULE_applyStmt = 83, RULE_packageStmt = 84, RULE_specForStmt = 85,
+ RULE_loopSpec = 86, RULE_deferStmt = 87, RULE_basicLit = 88, RULE_primaryExpr = 89,
+ RULE_functionLit = 90, RULE_closureDecl = 91, RULE_predConstructArgs = 92,
+ RULE_interfaceType = 93, RULE_predicateSpec = 94, RULE_methodSpec = 95,
+ RULE_type_ = 96, RULE_typeLit = 97, RULE_predType = 98, RULE_predTypeParams = 99,
+ RULE_literalType = 100, RULE_implicitArray = 101, RULE_slice_ = 102, RULE_low = 103,
+ RULE_high = 104, RULE_cap = 105, RULE_assign_op = 106, RULE_rangeClause = 107,
+ RULE_packageClause = 108, RULE_importPath = 109, RULE_declaration = 110,
+ RULE_constDecl = 111, RULE_constSpec = 112, RULE_identifierList = 113,
+ RULE_expressionList = 114, RULE_typeDecl = 115, RULE_typeSpec = 116, RULE_varDecl = 117,
+ RULE_block = 118, RULE_statementList = 119, RULE_simpleStmt = 120, RULE_expressionStmt = 121,
+ RULE_sendStmt = 122, RULE_incDecStmt = 123, RULE_assignment = 124, RULE_emptyStmt = 125,
+ RULE_labeledStmt = 126, RULE_returnStmt = 127, RULE_breakStmt = 128, RULE_continueStmt = 129,
+ RULE_gotoStmt = 130, RULE_fallthroughStmt = 131, RULE_ifStmt = 132, RULE_switchStmt = 133,
+ RULE_exprSwitchStmt = 134, RULE_exprCaseClause = 135, RULE_exprSwitchCase = 136,
+ RULE_typeSwitchStmt = 137, RULE_typeSwitchGuard = 138, RULE_typeCaseClause = 139,
+ RULE_typeSwitchCase = 140, RULE_typeList = 141, RULE_selectStmt = 142,
+ RULE_commClause = 143, RULE_commCase = 144, RULE_recvStmt = 145, RULE_forStmt = 146,
+ RULE_forClause = 147, RULE_goStmt = 148, RULE_typeName = 149, RULE_arrayType = 150,
+ RULE_arrayLength = 151, RULE_elementType = 152, RULE_pointerType = 153,
+ RULE_sliceType = 154, RULE_mapType = 155, RULE_channelType = 156, RULE_functionType = 157,
+ RULE_signature = 158, RULE_result = 159, RULE_parameters = 160, RULE_conversion = 161,
+ RULE_nonNamedType = 162, RULE_operand = 163, RULE_literal = 164, RULE_integer = 165,
+ RULE_operandName = 166, RULE_qualifiedIdent = 167, RULE_compositeLit = 168,
+ RULE_literalValue = 169, RULE_elementList = 170, RULE_keyedElement = 171,
+ RULE_key = 172, RULE_element = 173, RULE_structType = 174, RULE_fieldDecl = 175,
+ RULE_string_ = 176, RULE_embeddedField = 177, RULE_index = 178, RULE_typeAssertion = 179,
+ RULE_arguments = 180, RULE_methodExpr = 181, RULE_receiverType = 182,
+ RULE_eos = 183;
private static String[] makeRuleNames() {
return new String[] {
"exprOnly", "stmtOnly", "typeOnly", "maybeAddressableIdentifierList",
@@ -103,35 +106,36 @@ private static String[] makeRuleNames() {
"typeExpr", "boundVariables", "boundVariableDecl", "triggers", "trigger",
"predicateAccess", "optionSome", "optionNone", "optionGet", "sConversion",
"old", "oldLabelUse", "labelUse", "before", "isComparable", "typeOf",
- "access", "range", "seqUpdExp", "seqUpdClause", "ghostTypeLit", "domainType",
- "domainClause", "adtType", "adtClause", "ghostSliceType", "sqType", "specification",
- "specStatement", "terminationMeasure", "assertion", "blockWithBodyParameterInfo",
- "closureSpecInstance", "closureSpecParams", "closureSpecParam", "closureImplProofStmt",
- "implementationProof", "methodImplementationProof", "nonLocalReceiver",
- "selection", "implementationProofPredicateAlias", "make", "new_", "specMember",
- "functionDecl", "methodDecl", "explicitGhostMember", "fpredicateDecl",
- "predicateBody", "mpredicateDecl", "varSpec", "shortVarDecl", "receiver",
- "parameterDecl", "actualParameterDecl", "ghostParameterDecl", "parameterType",
- "expression", "statement", "applyStmt", "packageStmt", "specForStmt",
- "loopSpec", "deferStmt", "basicLit", "primaryExpr", "functionLit", "closureDecl",
- "predConstructArgs", "interfaceType", "predicateSpec", "methodSpec",
- "type_", "typeLit", "predType", "predTypeParams", "literalType", "implicitArray",
- "slice_", "low", "high", "cap", "assign_op", "rangeClause", "packageClause",
- "importPath", "declaration", "constDecl", "constSpec", "identifierList",
- "expressionList", "typeDecl", "typeSpec", "varDecl", "block", "statementList",
- "simpleStmt", "expressionStmt", "sendStmt", "incDecStmt", "assignment",
- "emptyStmt", "labeledStmt", "returnStmt", "breakStmt", "continueStmt",
- "gotoStmt", "fallthroughStmt", "ifStmt", "switchStmt", "exprSwitchStmt",
- "exprCaseClause", "exprSwitchCase", "typeSwitchStmt", "typeSwitchGuard",
- "typeCaseClause", "typeSwitchCase", "typeList", "selectStmt", "commClause",
- "commCase", "recvStmt", "forStmt", "forClause", "goStmt", "typeName",
- "arrayType", "arrayLength", "elementType", "pointerType", "sliceType",
- "mapType", "channelType", "functionType", "signature", "result", "parameters",
- "conversion", "nonNamedType", "operand", "literal", "integer", "operandName",
- "qualifiedIdent", "compositeLit", "literalValue", "elementList", "keyedElement",
- "key", "element", "structType", "fieldDecl", "string_", "embeddedField",
- "index", "typeAssertion", "arguments", "methodExpr", "receiverType",
- "eos"
+ "access", "range", "matchExpr", "matchExprClause", "seqUpdExp", "seqUpdClause",
+ "ghostTypeLit", "domainType", "domainClause", "adtType", "adtClause",
+ "ghostSliceType", "sqType", "specification", "specStatement", "terminationMeasure",
+ "assertion", "matchStmt", "matchStmtClause", "matchCase", "matchPattern",
+ "matchPatternList", "blockWithBodyParameterInfo", "closureSpecInstance",
+ "closureSpecParams", "closureSpecParam", "closureImplProofStmt", "implementationProof",
+ "methodImplementationProof", "nonLocalReceiver", "selection", "implementationProofPredicateAlias",
+ "make", "new_", "specMember", "functionDecl", "methodDecl", "explicitGhostMember",
+ "fpredicateDecl", "predicateBody", "mpredicateDecl", "varSpec", "shortVarDecl",
+ "receiver", "parameterDecl", "actualParameterDecl", "ghostParameterDecl",
+ "parameterType", "expression", "statement", "applyStmt", "packageStmt",
+ "specForStmt", "loopSpec", "deferStmt", "basicLit", "primaryExpr", "functionLit",
+ "closureDecl", "predConstructArgs", "interfaceType", "predicateSpec",
+ "methodSpec", "type_", "typeLit", "predType", "predTypeParams", "literalType",
+ "implicitArray", "slice_", "low", "high", "cap", "assign_op", "rangeClause",
+ "packageClause", "importPath", "declaration", "constDecl", "constSpec",
+ "identifierList", "expressionList", "typeDecl", "typeSpec", "varDecl",
+ "block", "statementList", "simpleStmt", "expressionStmt", "sendStmt",
+ "incDecStmt", "assignment", "emptyStmt", "labeledStmt", "returnStmt",
+ "breakStmt", "continueStmt", "gotoStmt", "fallthroughStmt", "ifStmt",
+ "switchStmt", "exprSwitchStmt", "exprCaseClause", "exprSwitchCase", "typeSwitchStmt",
+ "typeSwitchGuard", "typeCaseClause", "typeSwitchCase", "typeList", "selectStmt",
+ "commClause", "commCase", "recvStmt", "forStmt", "forClause", "goStmt",
+ "typeName", "arrayType", "arrayLength", "elementType", "pointerType",
+ "sliceType", "mapType", "channelType", "functionType", "signature", "result",
+ "parameters", "conversion", "nonNamedType", "operand", "literal", "integer",
+ "operandName", "qualifiedIdent", "compositeLit", "literalValue", "elementList",
+ "keyedElement", "key", "element", "structType", "fieldDecl", "string_",
+ "embeddedField", "index", "typeAssertion", "arguments", "methodExpr",
+ "receiverType", "eos"
};
}
public static final String[] ruleNames = makeRuleNames();
@@ -145,18 +149,18 @@ private static String[] makeLiteralNames() {
"'ghost'", "'in'", "'#'", "'subset'", "'union'", "'intersection'", "'setminus'",
"'==>'", "'--*'", "'apply'", "'?'", "'!<'", "'!>'", "'seq'", "'set'",
"'mset'", "'dict'", "'option'", "'len'", "'new'", "'make'", "'cap'",
- "'some'", "'get'", "'domain'", "'axiom'", "'adt'", "'none'", "'pred'",
- "'typeOf'", "'isComparable'", "'share'", "'@'", "'..'", "'shared'", "'exclusive'",
- "'predicate'", "'writePerm'", "'noPerm'", "'trusted'", "'outline'", "'initEnsures'",
- "'importRequires'", "'proof'", "'==='", "'!=='", "'with'", "'break'",
- "'default'", "'func'", "'interface'", "'select'", "'case'", "'defer'",
- "'go'", "'map'", "'struct'", "'chan'", "'else'", "'goto'", "'package'",
- "'switch'", "'const'", "'fallthrough'", "'if'", "'range'", "'type'",
- "'continue'", "'for'", "'import'", "'return'", "'var'", "'nil'", null,
- "'('", "')'", "'{'", "'}'", "'['", "']'", "'='", "','", "';'", "':'",
- "'.'", "'++'", "'--'", "':='", "'...'", "'||'", "'&&'", "'=='", "'!='",
- "'<'", "'<='", "'>'", "'>='", "'|'", "'/'", "'%'", "'<<'", "'>>'", "'&^'",
- "'!'", "'+'", "'-'", "'^'", "'*'", "'&'", "'<-'"
+ "'some'", "'get'", "'domain'", "'axiom'", "'adt'", "'match'", "'none'",
+ "'pred'", "'typeOf'", "'isComparable'", "'share'", "'@'", "'..'", "'shared'",
+ "'exclusive'", "'predicate'", "'writePerm'", "'noPerm'", "'trusted'",
+ "'outline'", "'initEnsures'", "'importRequires'", "'proof'", "'==='",
+ "'!=='", "'with'", "'break'", "'default'", "'func'", "'interface'", "'select'",
+ "'case'", "'defer'", "'go'", "'map'", "'struct'", "'chan'", "'else'",
+ "'goto'", "'package'", "'switch'", "'const'", "'fallthrough'", "'if'",
+ "'range'", "'type'", "'continue'", "'for'", "'import'", "'return'", "'var'",
+ "'nil'", null, "'('", "')'", "'{'", "'}'", "'['", "']'", "'='", "','",
+ "';'", "':'", "'.'", "'++'", "'--'", "':='", "'...'", "'||'", "'&&'",
+ "'=='", "'!='", "'<'", "'<='", "'>'", "'>='", "'|'", "'/'", "'%'", "'<<'",
+ "'>>'", "'&^'", "'!'", "'+'", "'-'", "'^'", "'*'", "'&'", "'<-'"
};
}
private static final String[] _LITERAL_NAMES = makeLiteralNames();
@@ -168,7 +172,7 @@ private static String[] makeSymbolicNames() {
"UNFOLD", "UNFOLDING", "GHOST", "IN", "MULTI", "SUBSET", "UNION", "INTERSECTION",
"SETMINUS", "IMPLIES", "WAND", "APPLY", "QMARK", "L_PRED", "R_PRED",
"SEQ", "SET", "MSET", "DICT", "OPT", "LEN", "NEW", "MAKE", "CAP", "SOME",
- "GET", "DOM", "AXIOM", "ADT", "NONE", "PRED", "TYPE_OF", "IS_COMPARABLE",
+ "GET", "DOM", "AXIOM", "ADT", "MATCH", "NONE", "PRED", "TYPE_OF", "IS_COMPARABLE",
"SHARE", "ADDR_MOD", "DOT_DOT", "SHARED", "EXCLUSIVE", "PREDICATE", "WRITEPERM",
"NOPERM", "TRUSTED", "OUTLINE", "INIT_POST", "IMPORT_PRE", "PROOF", "GHOST_EQUALS",
"GHOST_NOT_EQUALS", "WITH", "BREAK", "DEFAULT", "FUNC", "INTERFACE",
@@ -262,9 +266,9 @@ public final ExprOnlyContext exprOnly() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(354);
+ setState(368);
expression(0);
- setState(355);
+ setState(369);
match(EOF);
}
}
@@ -301,9 +305,9 @@ public final StmtOnlyContext stmtOnly() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(357);
+ setState(371);
statement();
- setState(358);
+ setState(372);
match(EOF);
}
}
@@ -340,9 +344,9 @@ public final TypeOnlyContext typeOnly() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(360);
+ setState(374);
type_();
- setState(361);
+ setState(375);
match(EOF);
}
}
@@ -386,21 +390,21 @@ public final MaybeAddressableIdentifierListContext maybeAddressableIdentifierLis
try {
enterOuterAlt(_localctx, 1);
{
- setState(363);
+ setState(377);
maybeAddressableIdentifier();
- setState(368);
+ setState(382);
_errHandler.sync(this);
_la = _input.LA(1);
while (_la==COMMA) {
{
{
- setState(364);
+ setState(378);
match(COMMA);
- setState(365);
+ setState(379);
maybeAddressableIdentifier();
}
}
- setState(370);
+ setState(384);
_errHandler.sync(this);
_la = _input.LA(1);
}
@@ -438,14 +442,14 @@ public final MaybeAddressableIdentifierContext maybeAddressableIdentifier() thro
try {
enterOuterAlt(_localctx, 1);
{
- setState(371);
+ setState(385);
match(IDENTIFIER);
- setState(373);
+ setState(387);
_errHandler.sync(this);
_la = _input.LA(1);
if (_la==ADDR_MOD) {
{
- setState(372);
+ setState(386);
match(ADDR_MOD);
}
}
@@ -522,79 +526,79 @@ public final SourceFileContext sourceFile() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(380);
+ setState(394);
_errHandler.sync(this);
_la = _input.LA(1);
while (_la==INIT_POST) {
{
{
- setState(375);
+ setState(389);
initPost();
- setState(376);
+ setState(390);
eos();
}
}
- setState(382);
+ setState(396);
_errHandler.sync(this);
_la = _input.LA(1);
}
- setState(383);
+ setState(397);
packageClause();
- setState(384);
+ setState(398);
eos();
- setState(390);
+ setState(404);
_errHandler.sync(this);
_la = _input.LA(1);
while (_la==IMPORT_PRE || _la==IMPORT) {
{
{
- setState(385);
+ setState(399);
importDecl();
- setState(386);
+ setState(400);
eos();
}
}
- setState(392);
+ setState(406);
_errHandler.sync(this);
_la = _input.LA(1);
}
- setState(402);
+ setState(416);
_errHandler.sync(this);
_la = _input.LA(1);
- while (((((_la - 9)) & ~0x3f) == 0 && ((1L << (_la - 9)) & ((1L << (PRE - 9)) | (1L << (PRESERVES - 9)) | (1L << (POST - 9)) | (1L << (DEC - 9)) | (1L << (PURE - 9)) | (1L << (GHOST - 9)) | (1L << (SEQ - 9)) | (1L << (SET - 9)) | (1L << (MSET - 9)) | (1L << (DICT - 9)) | (1L << (OPT - 9)) | (1L << (DOM - 9)) | (1L << (ADT - 9)) | (1L << (PRED - 9)) | (1L << (TRUSTED - 9)))) != 0) || ((((_la - 75)) & ~0x3f) == 0 && ((1L << (_la - 75)) & ((1L << (FUNC - 75)) | (1L << (INTERFACE - 75)) | (1L << (MAP - 75)) | (1L << (STRUCT - 75)) | (1L << (CHAN - 75)) | (1L << (CONST - 75)) | (1L << (TYPE - 75)) | (1L << (VAR - 75)) | (1L << (IDENTIFIER - 75)) | (1L << (L_PAREN - 75)) | (1L << (L_BRACKET - 75)) | (1L << (STAR - 75)) | (1L << (RECEIVE - 75)))) != 0)) {
+ while (((((_la - 9)) & ~0x3f) == 0 && ((1L << (_la - 9)) & ((1L << (PRE - 9)) | (1L << (PRESERVES - 9)) | (1L << (POST - 9)) | (1L << (DEC - 9)) | (1L << (PURE - 9)) | (1L << (GHOST - 9)) | (1L << (SEQ - 9)) | (1L << (SET - 9)) | (1L << (MSET - 9)) | (1L << (DICT - 9)) | (1L << (OPT - 9)) | (1L << (DOM - 9)) | (1L << (ADT - 9)) | (1L << (PRED - 9)) | (1L << (TRUSTED - 9)))) != 0) || ((((_la - 76)) & ~0x3f) == 0 && ((1L << (_la - 76)) & ((1L << (FUNC - 76)) | (1L << (INTERFACE - 76)) | (1L << (MAP - 76)) | (1L << (STRUCT - 76)) | (1L << (CHAN - 76)) | (1L << (CONST - 76)) | (1L << (TYPE - 76)) | (1L << (VAR - 76)) | (1L << (IDENTIFIER - 76)) | (1L << (L_PAREN - 76)) | (1L << (L_BRACKET - 76)) | (1L << (STAR - 76)) | (1L << (RECEIVE - 76)))) != 0)) {
{
{
- setState(396);
+ setState(410);
_errHandler.sync(this);
switch ( getInterpreter().adaptivePredict(_input,4,_ctx) ) {
case 1:
{
- setState(393);
+ setState(407);
specMember();
}
break;
case 2:
{
- setState(394);
+ setState(408);
declaration();
}
break;
case 3:
{
- setState(395);
+ setState(409);
ghostMember();
}
break;
}
- setState(398);
+ setState(412);
eos();
}
}
- setState(404);
+ setState(418);
_errHandler.sync(this);
_la = _input.LA(1);
}
- setState(405);
+ setState(419);
match(EOF);
}
}
@@ -631,9 +635,9 @@ public final InitPostContext initPost() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(407);
+ setState(421);
match(INIT_POST);
- setState(408);
+ setState(422);
expression(0);
}
}
@@ -670,9 +674,9 @@ public final ImportPreContext importPre() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(410);
+ setState(424);
match(IMPORT_PRE);
- setState(411);
+ setState(425);
expression(0);
}
}
@@ -724,28 +728,28 @@ public final ImportSpecContext importSpec() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(418);
+ setState(432);
_errHandler.sync(this);
_la = _input.LA(1);
while (_la==IMPORT_PRE) {
{
{
- setState(413);
+ setState(427);
importPre();
- setState(414);
+ setState(428);
eos();
}
}
- setState(420);
+ setState(434);
_errHandler.sync(this);
_la = _input.LA(1);
}
- setState(422);
+ setState(436);
_errHandler.sync(this);
_la = _input.LA(1);
if (_la==IDENTIFIER || _la==DOT) {
{
- setState(421);
+ setState(435);
((ImportSpecContext)_localctx).alias = _input.LT(1);
_la = _input.LA(1);
if ( !(_la==IDENTIFIER || _la==DOT) ) {
@@ -759,7 +763,7 @@ public final ImportSpecContext importSpec() throws RecognitionException {
}
}
- setState(424);
+ setState(438);
importPath();
}
}
@@ -814,56 +818,56 @@ public final ImportDeclContext importDecl() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(431);
+ setState(445);
_errHandler.sync(this);
_la = _input.LA(1);
while (_la==IMPORT_PRE) {
{
{
- setState(426);
+ setState(440);
importPre();
- setState(427);
+ setState(441);
eos();
}
}
- setState(433);
+ setState(447);
_errHandler.sync(this);
_la = _input.LA(1);
}
- setState(447);
+ setState(461);
_errHandler.sync(this);
switch ( getInterpreter().adaptivePredict(_input,10,_ctx) ) {
case 1:
{
- setState(434);
+ setState(448);
match(IMPORT);
- setState(435);
+ setState(449);
importSpec();
}
break;
case 2:
{
- setState(436);
+ setState(450);
match(IMPORT);
- setState(437);
+ setState(451);
match(L_PAREN);
- setState(443);
+ setState(457);
_errHandler.sync(this);
_la = _input.LA(1);
- while (((((_la - 68)) & ~0x3f) == 0 && ((1L << (_la - 68)) & ((1L << (IMPORT_PRE - 68)) | (1L << (IDENTIFIER - 68)) | (1L << (DOT - 68)))) != 0) || _la==RAW_STRING_LIT || _la==INTERPRETED_STRING_LIT) {
+ while (((((_la - 69)) & ~0x3f) == 0 && ((1L << (_la - 69)) & ((1L << (IMPORT_PRE - 69)) | (1L << (IDENTIFIER - 69)) | (1L << (DOT - 69)))) != 0) || _la==RAW_STRING_LIT || _la==INTERPRETED_STRING_LIT) {
{
{
- setState(438);
+ setState(452);
importSpec();
- setState(439);
+ setState(453);
eos();
}
}
- setState(445);
+ setState(459);
_errHandler.sync(this);
_la = _input.LA(1);
}
- setState(446);
+ setState(460);
match(R_PAREN);
}
break;
@@ -909,34 +913,34 @@ public final GhostMemberContext ghostMember() throws RecognitionException {
GhostMemberContext _localctx = new GhostMemberContext(_ctx, getState());
enterRule(_localctx, 20, RULE_ghostMember);
try {
- setState(453);
+ setState(467);
_errHandler.sync(this);
switch ( getInterpreter().adaptivePredict(_input,11,_ctx) ) {
case 1:
enterOuterAlt(_localctx, 1);
{
- setState(449);
+ setState(463);
implementationProof();
}
break;
case 2:
enterOuterAlt(_localctx, 2);
{
- setState(450);
+ setState(464);
fpredicateDecl();
}
break;
case 3:
enterOuterAlt(_localctx, 3);
{
- setState(451);
+ setState(465);
mpredicateDecl();
}
break;
case 4:
enterOuterAlt(_localctx, 4);
{
- setState(452);
+ setState(466);
explicitGhostMember();
}
break;
@@ -980,6 +984,17 @@ public T accept(ParseTreeVisitor extends T> visitor) {
else return visitor.visitChildren(this);
}
}
+ public static class MatchStmt_Context extends GhostStatementContext {
+ public MatchStmtContext matchStmt() {
+ return getRuleContext(MatchStmtContext.class,0);
+ }
+ public MatchStmt_Context(GhostStatementContext ctx) { copyFrom(ctx); }
+ @Override
+ public T accept(ParseTreeVisitor extends T> visitor) {
+ if ( visitor instanceof GobraParserVisitor ) return ((GobraParserVisitor extends T>)visitor).visitMatchStmt_(this);
+ else return visitor.visitChildren(this);
+ }
+ }
public static class ExplicitGhostStatementContext extends GhostStatementContext {
public TerminalNode GHOST() { return getToken(GobraParser.GHOST, 0); }
public StatementContext statement() {
@@ -1012,16 +1027,16 @@ public final GhostStatementContext ghostStatement() throws RecognitionException
enterRule(_localctx, 22, RULE_ghostStatement);
int _la;
try {
- setState(461);
+ setState(476);
_errHandler.sync(this);
switch (_input.LA(1)) {
case GHOST:
_localctx = new ExplicitGhostStatementContext(_localctx);
enterOuterAlt(_localctx, 1);
{
- setState(455);
+ setState(469);
match(GHOST);
- setState(456);
+ setState(470);
statement();
}
break;
@@ -1030,7 +1045,7 @@ public final GhostStatementContext ghostStatement() throws RecognitionException
_localctx = new FoldStatementContext(_localctx);
enterOuterAlt(_localctx, 2);
{
- setState(457);
+ setState(471);
((FoldStatementContext)_localctx).fold_stmt = _input.LT(1);
_la = _input.LA(1);
if ( !(_la==FOLD || _la==UNFOLD) ) {
@@ -1041,7 +1056,7 @@ public final GhostStatementContext ghostStatement() throws RecognitionException
_errHandler.reportMatch(this);
consume();
}
- setState(458);
+ setState(472);
predicateAccess();
}
break;
@@ -1052,7 +1067,7 @@ public final GhostStatementContext ghostStatement() throws RecognitionException
_localctx = new ProofStatementContext(_localctx);
enterOuterAlt(_localctx, 3);
{
- setState(459);
+ setState(473);
((ProofStatementContext)_localctx).kind = _input.LT(1);
_la = _input.LA(1);
if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << ASSERT) | (1L << ASSUME) | (1L << INHALE) | (1L << EXHALE))) != 0)) ) {
@@ -1063,10 +1078,18 @@ public final GhostStatementContext ghostStatement() throws RecognitionException
_errHandler.reportMatch(this);
consume();
}
- setState(460);
+ setState(474);
expression(0);
}
break;
+ case MATCH:
+ _localctx = new MatchStmt_Context(_localctx);
+ enterOuterAlt(_localctx, 4);
+ {
+ setState(475);
+ matchStmt();
+ }
+ break;
default:
throw new NoViableAltException(this);
}
@@ -1103,7 +1126,7 @@ public final AuxiliaryStatementContext auxiliaryStatement() throws RecognitionEx
try {
enterOuterAlt(_localctx, 1);
{
- setState(463);
+ setState(478);
statementWithSpec();
}
}
@@ -1143,10 +1166,10 @@ public final StatementWithSpecContext statementWithSpec() throws RecognitionExce
try {
enterOuterAlt(_localctx, 1);
{
- setState(465);
+ setState(480);
((StatementWithSpecContext)_localctx).specification = specification();
{
- setState(466);
+ setState(481);
outlineStatement(((StatementWithSpecContext)_localctx).specification.trusted, ((StatementWithSpecContext)_localctx).specification.pure);
}
}
@@ -1191,21 +1214,21 @@ public final OutlineStatementContext outlineStatement(boolean trusted,boolean pu
try {
enterOuterAlt(_localctx, 1);
{
- setState(468);
+ setState(483);
match(OUTLINE);
- setState(469);
+ setState(484);
match(L_PAREN);
- setState(471);
+ setState(486);
_errHandler.sync(this);
switch ( getInterpreter().adaptivePredict(_input,13,_ctx) ) {
case 1:
{
- setState(470);
+ setState(485);
statementList();
}
break;
}
- setState(473);
+ setState(488);
match(R_PAREN);
}
}
@@ -1257,6 +1280,9 @@ public OptionGetContext optionGet() {
public PermissionContext permission() {
return getRuleContext(PermissionContext.class,0);
}
+ public MatchExprContext matchExpr() {
+ return getRuleContext(MatchExprContext.class,0);
+ }
public GhostPrimaryExprContext(ParserRuleContext parent, int invokingState) {
super(parent, invokingState);
}
@@ -1272,93 +1298,100 @@ public final GhostPrimaryExprContext ghostPrimaryExpr() throws RecognitionExcept
GhostPrimaryExprContext _localctx = new GhostPrimaryExprContext(_ctx, getState());
enterRule(_localctx, 30, RULE_ghostPrimaryExpr);
try {
- setState(487);
+ setState(503);
_errHandler.sync(this);
switch ( getInterpreter().adaptivePredict(_input,14,_ctx) ) {
case 1:
enterOuterAlt(_localctx, 1);
{
- setState(475);
+ setState(490);
range();
}
break;
case 2:
enterOuterAlt(_localctx, 2);
{
- setState(476);
+ setState(491);
access();
}
break;
case 3:
enterOuterAlt(_localctx, 3);
{
- setState(477);
+ setState(492);
typeOf();
}
break;
case 4:
enterOuterAlt(_localctx, 4);
{
- setState(478);
+ setState(493);
typeExpr();
}
break;
case 5:
enterOuterAlt(_localctx, 5);
{
- setState(479);
+ setState(494);
isComparable();
}
break;
case 6:
enterOuterAlt(_localctx, 6);
{
- setState(480);
+ setState(495);
old();
}
break;
case 7:
enterOuterAlt(_localctx, 7);
{
- setState(481);
+ setState(496);
before();
}
break;
case 8:
enterOuterAlt(_localctx, 8);
{
- setState(482);
+ setState(497);
sConversion();
}
break;
case 9:
enterOuterAlt(_localctx, 9);
{
- setState(483);
+ setState(498);
optionNone();
}
break;
case 10:
enterOuterAlt(_localctx, 10);
{
- setState(484);
+ setState(499);
optionSome();
}
break;
case 11:
enterOuterAlt(_localctx, 11);
{
- setState(485);
+ setState(500);
optionGet();
}
break;
case 12:
enterOuterAlt(_localctx, 12);
{
- setState(486);
+ setState(501);
permission();
}
break;
+ case 13:
+ enterOuterAlt(_localctx, 13);
+ {
+ setState(502);
+ matchExpr();
+ }
+ break;
}
}
catch (RecognitionException re) {
@@ -1393,7 +1426,7 @@ public final PermissionContext permission() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(489);
+ setState(505);
_la = _input.LA(1);
if ( !(_la==WRITEPERM || _la==NOPERM) ) {
_errHandler.recoverInline(this);
@@ -1440,13 +1473,13 @@ public final TypeExprContext typeExpr() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(491);
+ setState(507);
match(TYPE);
- setState(492);
+ setState(508);
match(L_BRACKET);
- setState(493);
+ setState(509);
type_();
- setState(494);
+ setState(510);
match(R_BRACKET);
}
}
@@ -1491,32 +1524,32 @@ public final BoundVariablesContext boundVariables() throws RecognitionException
int _alt;
enterOuterAlt(_localctx, 1);
{
- setState(496);
+ setState(512);
boundVariableDecl();
- setState(501);
+ setState(517);
_errHandler.sync(this);
_alt = getInterpreter().adaptivePredict(_input,15,_ctx);
while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) {
if ( _alt==1 ) {
{
{
- setState(497);
+ setState(513);
match(COMMA);
- setState(498);
+ setState(514);
boundVariableDecl();
}
}
}
- setState(503);
+ setState(519);
_errHandler.sync(this);
_alt = getInterpreter().adaptivePredict(_input,15,_ctx);
}
- setState(505);
+ setState(521);
_errHandler.sync(this);
_la = _input.LA(1);
if (_la==COMMA) {
{
- setState(504);
+ setState(520);
match(COMMA);
}
}
@@ -1564,25 +1597,25 @@ public final BoundVariableDeclContext boundVariableDecl() throws RecognitionExce
try {
enterOuterAlt(_localctx, 1);
{
- setState(507);
+ setState(523);
match(IDENTIFIER);
- setState(512);
+ setState(528);
_errHandler.sync(this);
_la = _input.LA(1);
while (_la==COMMA) {
{
{
- setState(508);
+ setState(524);
match(COMMA);
- setState(509);
+ setState(525);
match(IDENTIFIER);
}
}
- setState(514);
+ setState(530);
_errHandler.sync(this);
_la = _input.LA(1);
}
- setState(515);
+ setState(531);
elementType();
}
}
@@ -1622,17 +1655,17 @@ public final TriggersContext triggers() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(520);
+ setState(536);
_errHandler.sync(this);
_la = _input.LA(1);
while (_la==L_CURLY) {
{
{
- setState(517);
+ setState(533);
trigger();
}
}
- setState(522);
+ setState(538);
_errHandler.sync(this);
_la = _input.LA(1);
}
@@ -1680,27 +1713,27 @@ public final TriggerContext trigger() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(523);
+ setState(539);
match(L_CURLY);
- setState(524);
+ setState(540);
expression(0);
- setState(529);
+ setState(545);
_errHandler.sync(this);
_la = _input.LA(1);
while (_la==COMMA) {
{
{
- setState(525);
+ setState(541);
match(COMMA);
- setState(526);
+ setState(542);
expression(0);
}
}
- setState(531);
+ setState(547);
_errHandler.sync(this);
_la = _input.LA(1);
}
- setState(532);
+ setState(548);
match(R_CURLY);
}
}
@@ -1736,7 +1769,7 @@ public final PredicateAccessContext predicateAccess() throws RecognitionExceptio
try {
enterOuterAlt(_localctx, 1);
{
- setState(534);
+ setState(550);
primaryExpr(0);
}
}
@@ -1775,13 +1808,13 @@ public final OptionSomeContext optionSome() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(536);
+ setState(552);
match(SOME);
- setState(537);
+ setState(553);
match(L_PAREN);
- setState(538);
+ setState(554);
expression(0);
- setState(539);
+ setState(555);
match(R_PAREN);
}
}
@@ -1820,13 +1853,13 @@ public final OptionNoneContext optionNone() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(541);
+ setState(557);
match(NONE);
- setState(542);
+ setState(558);
match(L_BRACKET);
- setState(543);
+ setState(559);
type_();
- setState(544);
+ setState(560);
match(R_BRACKET);
}
}
@@ -1865,13 +1898,13 @@ public final OptionGetContext optionGet() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(546);
+ setState(562);
match(GET);
- setState(547);
+ setState(563);
match(L_PAREN);
- setState(548);
+ setState(564);
expression(0);
- setState(549);
+ setState(565);
match(R_PAREN);
}
}
@@ -1914,7 +1947,7 @@ public final SConversionContext sConversion() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(551);
+ setState(567);
((SConversionContext)_localctx).kind = _input.LT(1);
_la = _input.LA(1);
if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << SEQ) | (1L << SET) | (1L << MSET))) != 0)) ) {
@@ -1925,11 +1958,11 @@ public final SConversionContext sConversion() throws RecognitionException {
_errHandler.reportMatch(this);
consume();
}
- setState(552);
+ setState(568);
match(L_PAREN);
- setState(553);
+ setState(569);
expression(0);
- setState(554);
+ setState(570);
match(R_PAREN);
}
}
@@ -1974,27 +2007,27 @@ public final OldContext old() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(556);
+ setState(572);
match(OLD);
- setState(561);
+ setState(577);
_errHandler.sync(this);
_la = _input.LA(1);
if (_la==L_BRACKET) {
{
- setState(557);
+ setState(573);
match(L_BRACKET);
- setState(558);
+ setState(574);
oldLabelUse();
- setState(559);
+ setState(575);
match(R_BRACKET);
}
}
- setState(563);
+ setState(579);
match(L_PAREN);
- setState(564);
+ setState(580);
expression(0);
- setState(565);
+ setState(581);
match(R_PAREN);
}
}
@@ -2029,20 +2062,20 @@ public final OldLabelUseContext oldLabelUse() throws RecognitionException {
OldLabelUseContext _localctx = new OldLabelUseContext(_ctx, getState());
enterRule(_localctx, 56, RULE_oldLabelUse);
try {
- setState(569);
+ setState(585);
_errHandler.sync(this);
switch (_input.LA(1)) {
case IDENTIFIER:
enterOuterAlt(_localctx, 1);
{
- setState(567);
+ setState(583);
labelUse();
}
break;
case LHS:
enterOuterAlt(_localctx, 2);
{
- setState(568);
+ setState(584);
match(LHS);
}
break;
@@ -2080,7 +2113,7 @@ public final LabelUseContext labelUse() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(571);
+ setState(587);
match(IDENTIFIER);
}
}
@@ -2119,13 +2152,13 @@ public final BeforeContext before() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(573);
+ setState(589);
match(BEFORE);
- setState(574);
+ setState(590);
match(L_PAREN);
- setState(575);
+ setState(591);
expression(0);
- setState(576);
+ setState(592);
match(R_PAREN);
}
}
@@ -2164,13 +2197,13 @@ public final IsComparableContext isComparable() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(578);
+ setState(594);
match(IS_COMPARABLE);
- setState(579);
+ setState(595);
match(L_PAREN);
- setState(580);
+ setState(596);
expression(0);
- setState(581);
+ setState(597);
match(R_PAREN);
}
}
@@ -2209,13 +2242,13 @@ public final TypeOfContext typeOf() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(583);
+ setState(599);
match(TYPE_OF);
- setState(584);
+ setState(600);
match(L_PAREN);
- setState(585);
+ setState(601);
expression(0);
- setState(586);
+ setState(602);
match(R_PAREN);
}
}
@@ -2259,25 +2292,25 @@ public final AccessContext access() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(588);
+ setState(604);
match(ACCESS);
- setState(589);
+ setState(605);
match(L_PAREN);
- setState(590);
+ setState(606);
expression(0);
- setState(593);
+ setState(609);
_errHandler.sync(this);
_la = _input.LA(1);
if (_la==COMMA) {
{
- setState(591);
+ setState(607);
match(COMMA);
- setState(592);
+ setState(608);
expression(0);
}
}
- setState(595);
+ setState(611);
match(R_PAREN);
}
}
@@ -2324,7 +2357,7 @@ public final RangeContext range() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(597);
+ setState(613);
((RangeContext)_localctx).kind = _input.LT(1);
_la = _input.LA(1);
if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << SEQ) | (1L << SET) | (1L << MSET))) != 0)) ) {
@@ -2335,15 +2368,15 @@ public final RangeContext range() throws RecognitionException {
_errHandler.reportMatch(this);
consume();
}
- setState(598);
+ setState(614);
match(L_BRACKET);
- setState(599);
+ setState(615);
expression(0);
- setState(600);
+ setState(616);
match(DOT_DOT);
- setState(601);
+ setState(617);
expression(0);
- setState(602);
+ setState(618);
match(R_BRACKET);
}
}
@@ -2358,6 +2391,116 @@ public final RangeContext range() throws RecognitionException {
return _localctx;
}
+ public static class MatchExprContext extends ParserRuleContext {
+ public TerminalNode MATCH() { return getToken(GobraParser.MATCH, 0); }
+ public ExpressionContext expression() {
+ return getRuleContext(ExpressionContext.class,0);
+ }
+ public TerminalNode L_CURLY() { return getToken(GobraParser.L_CURLY, 0); }
+ public TerminalNode R_CURLY() { return getToken(GobraParser.R_CURLY, 0); }
+ public List matchExprClause() {
+ return getRuleContexts(MatchExprClauseContext.class);
+ }
+ public MatchExprClauseContext matchExprClause(int i) {
+ return getRuleContext(MatchExprClauseContext.class,i);
+ }
+ public MatchExprContext(ParserRuleContext parent, int invokingState) {
+ super(parent, invokingState);
+ }
+ @Override public int getRuleIndex() { return RULE_matchExpr; }
+ @Override
+ public T accept(ParseTreeVisitor extends T> visitor) {
+ if ( visitor instanceof GobraParserVisitor ) return ((GobraParserVisitor extends T>)visitor).visitMatchExpr(this);
+ else return visitor.visitChildren(this);
+ }
+ }
+
+ public final MatchExprContext matchExpr() throws RecognitionException {
+ MatchExprContext _localctx = new MatchExprContext(_ctx, getState());
+ enterRule(_localctx, 70, RULE_matchExpr);
+ int _la;
+ try {
+ enterOuterAlt(_localctx, 1);
+ {
+ setState(620);
+ match(MATCH);
+ setState(621);
+ expression(0);
+ setState(622);
+ match(L_CURLY);
+ setState(626);
+ _errHandler.sync(this);
+ _la = _input.LA(1);
+ while (_la==DEFAULT || _la==CASE) {
+ {
+ {
+ setState(623);
+ matchExprClause();
+ }
+ }
+ setState(628);
+ _errHandler.sync(this);
+ _la = _input.LA(1);
+ }
+ setState(629);
+ match(R_CURLY);
+ }
+ }
+ catch (RecognitionException re) {
+ _localctx.exception = re;
+ _errHandler.reportError(this, re);
+ _errHandler.recover(this, re);
+ }
+ finally {
+ exitRule();
+ }
+ return _localctx;
+ }
+
+ public static class MatchExprClauseContext extends ParserRuleContext {
+ public MatchCaseContext matchCase() {
+ return getRuleContext(MatchCaseContext.class,0);
+ }
+ public TerminalNode COLON() { return getToken(GobraParser.COLON, 0); }
+ public ExpressionContext expression() {
+ return getRuleContext(ExpressionContext.class,0);
+ }
+ public MatchExprClauseContext(ParserRuleContext parent, int invokingState) {
+ super(parent, invokingState);
+ }
+ @Override public int getRuleIndex() { return RULE_matchExprClause; }
+ @Override
+ public T accept(ParseTreeVisitor extends T> visitor) {
+ if ( visitor instanceof GobraParserVisitor ) return ((GobraParserVisitor extends T>)visitor).visitMatchExprClause(this);
+ else return visitor.visitChildren(this);
+ }
+ }
+
+ public final MatchExprClauseContext matchExprClause() throws RecognitionException {
+ MatchExprClauseContext _localctx = new MatchExprClauseContext(_ctx, getState());
+ enterRule(_localctx, 72, RULE_matchExprClause);
+ try {
+ enterOuterAlt(_localctx, 1);
+ {
+ setState(631);
+ matchCase();
+ setState(632);
+ match(COLON);
+ setState(633);
+ expression(0);
+ }
+ }
+ catch (RecognitionException re) {
+ _localctx.exception = re;
+ _errHandler.reportError(this, re);
+ _errHandler.recover(this, re);
+ }
+ finally {
+ exitRule();
+ }
+ return _localctx;
+ }
+
public static class SeqUpdExpContext extends ParserRuleContext {
public TerminalNode L_BRACKET() { return getToken(GobraParser.L_BRACKET, 0); }
public TerminalNode R_BRACKET() { return getToken(GobraParser.R_BRACKET, 0); }
@@ -2384,34 +2527,34 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final SeqUpdExpContext seqUpdExp() throws RecognitionException {
SeqUpdExpContext _localctx = new SeqUpdExpContext(_ctx, getState());
- enterRule(_localctx, 70, RULE_seqUpdExp);
+ enterRule(_localctx, 74, RULE_seqUpdExp);
int _la;
try {
enterOuterAlt(_localctx, 1);
{
- setState(604);
+ setState(635);
match(L_BRACKET);
{
- setState(605);
+ setState(636);
seqUpdClause();
- setState(610);
+ setState(641);
_errHandler.sync(this);
_la = _input.LA(1);
while (_la==COMMA) {
{
{
- setState(606);
+ setState(637);
match(COMMA);
- setState(607);
+ setState(638);
seqUpdClause();
}
}
- setState(612);
+ setState(643);
_errHandler.sync(this);
_la = _input.LA(1);
}
}
- setState(613);
+ setState(644);
match(R_BRACKET);
}
}
@@ -2447,15 +2590,15 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final SeqUpdClauseContext seqUpdClause() throws RecognitionException {
SeqUpdClauseContext _localctx = new SeqUpdClauseContext(_ctx, getState());
- enterRule(_localctx, 72, RULE_seqUpdClause);
+ enterRule(_localctx, 76, RULE_seqUpdClause);
try {
enterOuterAlt(_localctx, 1);
{
- setState(615);
+ setState(646);
expression(0);
- setState(616);
+ setState(647);
match(ASSIGN);
- setState(617);
+ setState(648);
expression(0);
}
}
@@ -2496,9 +2639,9 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final GhostTypeLitContext ghostTypeLit() throws RecognitionException {
GhostTypeLitContext _localctx = new GhostTypeLitContext(_ctx, getState());
- enterRule(_localctx, 74, RULE_ghostTypeLit);
+ enterRule(_localctx, 78, RULE_ghostTypeLit);
try {
- setState(623);
+ setState(654);
_errHandler.sync(this);
switch (_input.LA(1)) {
case SEQ:
@@ -2508,28 +2651,28 @@ public final GhostTypeLitContext ghostTypeLit() throws RecognitionException {
case OPT:
enterOuterAlt(_localctx, 1);
{
- setState(619);
+ setState(650);
sqType();
}
break;
case GHOST:
enterOuterAlt(_localctx, 2);
{
- setState(620);
+ setState(651);
ghostSliceType();
}
break;
case DOM:
enterOuterAlt(_localctx, 3);
{
- setState(621);
+ setState(652);
domainType();
}
break;
case ADT:
enterOuterAlt(_localctx, 4);
{
- setState(622);
+ setState(653);
adtType();
}
break;
@@ -2577,32 +2720,32 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final DomainTypeContext domainType() throws RecognitionException {
DomainTypeContext _localctx = new DomainTypeContext(_ctx, getState());
- enterRule(_localctx, 76, RULE_domainType);
+ enterRule(_localctx, 80, RULE_domainType);
int _la;
try {
enterOuterAlt(_localctx, 1);
{
- setState(625);
+ setState(656);
match(DOM);
- setState(626);
+ setState(657);
match(L_CURLY);
- setState(632);
+ setState(663);
_errHandler.sync(this);
_la = _input.LA(1);
while (_la==AXIOM || _la==FUNC) {
{
{
- setState(627);
+ setState(658);
domainClause();
- setState(628);
+ setState(659);
eos();
}
}
- setState(634);
+ setState(665);
_errHandler.sync(this);
_la = _input.LA(1);
}
- setState(635);
+ setState(666);
match(R_CURLY);
}
}
@@ -2645,34 +2788,34 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final DomainClauseContext domainClause() throws RecognitionException {
DomainClauseContext _localctx = new DomainClauseContext(_ctx, getState());
- enterRule(_localctx, 78, RULE_domainClause);
+ enterRule(_localctx, 82, RULE_domainClause);
try {
- setState(646);
+ setState(677);
_errHandler.sync(this);
switch (_input.LA(1)) {
case FUNC:
enterOuterAlt(_localctx, 1);
{
- setState(637);
+ setState(668);
match(FUNC);
- setState(638);
+ setState(669);
match(IDENTIFIER);
- setState(639);
+ setState(670);
signature();
}
break;
case AXIOM:
enterOuterAlt(_localctx, 2);
{
- setState(640);
+ setState(671);
match(AXIOM);
- setState(641);
+ setState(672);
match(L_CURLY);
- setState(642);
+ setState(673);
expression(0);
- setState(643);
+ setState(674);
eos();
- setState(644);
+ setState(675);
match(R_CURLY);
}
break;
@@ -2720,32 +2863,32 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final AdtTypeContext adtType() throws RecognitionException {
AdtTypeContext _localctx = new AdtTypeContext(_ctx, getState());
- enterRule(_localctx, 80, RULE_adtType);
+ enterRule(_localctx, 84, RULE_adtType);
int _la;
try {
enterOuterAlt(_localctx, 1);
{
- setState(648);
+ setState(679);
match(ADT);
- setState(649);
+ setState(680);
match(L_CURLY);
- setState(655);
+ setState(686);
_errHandler.sync(this);
_la = _input.LA(1);
while (_la==IDENTIFIER) {
{
{
- setState(650);
+ setState(681);
adtClause();
- setState(651);
+ setState(682);
eos();
}
}
- setState(657);
+ setState(688);
_errHandler.sync(this);
_la = _input.LA(1);
}
- setState(658);
+ setState(689);
match(R_CURLY);
}
}
@@ -2789,32 +2932,32 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final AdtClauseContext adtClause() throws RecognitionException {
AdtClauseContext _localctx = new AdtClauseContext(_ctx, getState());
- enterRule(_localctx, 82, RULE_adtClause);
+ enterRule(_localctx, 86, RULE_adtClause);
int _la;
try {
enterOuterAlt(_localctx, 1);
{
- setState(660);
+ setState(691);
match(IDENTIFIER);
- setState(661);
+ setState(692);
match(L_CURLY);
- setState(667);
+ setState(698);
_errHandler.sync(this);
_la = _input.LA(1);
while (_la==IDENTIFIER || _la==STAR) {
{
{
- setState(662);
+ setState(693);
fieldDecl();
- setState(663);
+ setState(694);
eos();
}
}
- setState(669);
+ setState(700);
_errHandler.sync(this);
_la = _input.LA(1);
}
- setState(670);
+ setState(701);
match(R_CURLY);
}
}
@@ -2849,17 +2992,17 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final GhostSliceTypeContext ghostSliceType() throws RecognitionException {
GhostSliceTypeContext _localctx = new GhostSliceTypeContext(_ctx, getState());
- enterRule(_localctx, 84, RULE_ghostSliceType);
+ enterRule(_localctx, 88, RULE_ghostSliceType);
try {
enterOuterAlt(_localctx, 1);
{
- setState(672);
+ setState(703);
match(GHOST);
- setState(673);
+ setState(704);
match(L_BRACKET);
- setState(674);
+ setState(705);
match(R_BRACKET);
- setState(675);
+ setState(706);
elementType();
}
}
@@ -2902,10 +3045,10 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final SqTypeContext sqType() throws RecognitionException {
SqTypeContext _localctx = new SqTypeContext(_ctx, getState());
- enterRule(_localctx, 86, RULE_sqType);
+ enterRule(_localctx, 90, RULE_sqType);
int _la;
try {
- setState(688);
+ setState(719);
_errHandler.sync(this);
switch (_input.LA(1)) {
case SEQ:
@@ -2915,7 +3058,7 @@ public final SqTypeContext sqType() throws RecognitionException {
enterOuterAlt(_localctx, 1);
{
{
- setState(677);
+ setState(708);
((SqTypeContext)_localctx).kind = _input.LT(1);
_la = _input.LA(1);
if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << OPT))) != 0)) ) {
@@ -2926,11 +3069,11 @@ public final SqTypeContext sqType() throws RecognitionException {
_errHandler.reportMatch(this);
consume();
}
- setState(678);
+ setState(709);
match(L_BRACKET);
- setState(679);
+ setState(710);
type_();
- setState(680);
+ setState(711);
match(R_BRACKET);
}
}
@@ -2938,15 +3081,15 @@ public final SqTypeContext sqType() throws RecognitionException {
case DICT:
enterOuterAlt(_localctx, 2);
{
- setState(682);
+ setState(713);
((SqTypeContext)_localctx).kind = match(DICT);
- setState(683);
+ setState(714);
match(L_BRACKET);
- setState(684);
+ setState(715);
type_();
- setState(685);
+ setState(716);
match(R_BRACKET);
- setState(686);
+ setState(717);
type_();
}
break;
@@ -3001,20 +3144,20 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final SpecificationContext specification() throws RecognitionException {
SpecificationContext _localctx = new SpecificationContext(_ctx, getState());
- enterRule(_localctx, 88, RULE_specification);
+ enterRule(_localctx, 92, RULE_specification);
int _la;
try {
int _alt;
enterOuterAlt(_localctx, 1);
{
- setState(700);
+ setState(731);
_errHandler.sync(this);
- _alt = getInterpreter().adaptivePredict(_input,31,_ctx);
+ _alt = getInterpreter().adaptivePredict(_input,32,_ctx);
while ( _alt!=1 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) {
if ( _alt==1+1 ) {
{
{
- setState(695);
+ setState(726);
_errHandler.sync(this);
switch (_input.LA(1)) {
case PRE:
@@ -3022,20 +3165,20 @@ public final SpecificationContext specification() throws RecognitionException {
case POST:
case DEC:
{
- setState(690);
+ setState(721);
specStatement();
}
break;
case PURE:
{
- setState(691);
+ setState(722);
match(PURE);
((SpecificationContext)_localctx).pure = true;
}
break;
case TRUSTED:
{
- setState(693);
+ setState(724);
match(TRUSTED);
((SpecificationContext)_localctx).trusted = true;
}
@@ -3043,21 +3186,21 @@ public final SpecificationContext specification() throws RecognitionException {
default:
throw new NoViableAltException(this);
}
- setState(697);
+ setState(728);
eos();
}
}
}
- setState(702);
+ setState(733);
_errHandler.sync(this);
- _alt = getInterpreter().adaptivePredict(_input,31,_ctx);
+ _alt = getInterpreter().adaptivePredict(_input,32,_ctx);
}
- setState(705);
+ setState(736);
_errHandler.sync(this);
_la = _input.LA(1);
if (_la==PURE) {
{
- setState(703);
+ setState(734);
match(PURE);
((SpecificationContext)_localctx).pure = true;
}
@@ -3101,44 +3244,44 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final SpecStatementContext specStatement() throws RecognitionException {
SpecStatementContext _localctx = new SpecStatementContext(_ctx, getState());
- enterRule(_localctx, 90, RULE_specStatement);
+ enterRule(_localctx, 94, RULE_specStatement);
try {
- setState(715);
+ setState(746);
_errHandler.sync(this);
switch (_input.LA(1)) {
case PRE:
enterOuterAlt(_localctx, 1);
{
- setState(707);
+ setState(738);
((SpecStatementContext)_localctx).kind = match(PRE);
- setState(708);
+ setState(739);
assertion();
}
break;
case PRESERVES:
enterOuterAlt(_localctx, 2);
{
- setState(709);
+ setState(740);
((SpecStatementContext)_localctx).kind = match(PRESERVES);
- setState(710);
+ setState(741);
assertion();
}
break;
case POST:
enterOuterAlt(_localctx, 3);
{
- setState(711);
+ setState(742);
((SpecStatementContext)_localctx).kind = match(POST);
- setState(712);
+ setState(743);
assertion();
}
break;
case DEC:
enterOuterAlt(_localctx, 4);
{
- setState(713);
+ setState(744);
((SpecStatementContext)_localctx).kind = match(DEC);
- setState(714);
+ setState(745);
terminationMeasure();
}
break;
@@ -3165,46 +3308,387 @@ public ExpressionListContext expressionList() {
public ExpressionContext expression() {
return getRuleContext(ExpressionContext.class,0);
}
- public TerminationMeasureContext(ParserRuleContext parent, int invokingState) {
- super(parent, invokingState);
+ public TerminationMeasureContext(ParserRuleContext parent, int invokingState) {
+ super(parent, invokingState);
+ }
+ @Override public int getRuleIndex() { return RULE_terminationMeasure; }
+ @Override
+ public T accept(ParseTreeVisitor extends T> visitor) {
+ if ( visitor instanceof GobraParserVisitor ) return ((GobraParserVisitor extends T>)visitor).visitTerminationMeasure(this);
+ else return visitor.visitChildren(this);
+ }
+ }
+
+ public final TerminationMeasureContext terminationMeasure() throws RecognitionException {
+ TerminationMeasureContext _localctx = new TerminationMeasureContext(_ctx, getState());
+ enterRule(_localctx, 96, RULE_terminationMeasure);
+ try {
+ enterOuterAlt(_localctx, 1);
+ {
+ setState(749);
+ _errHandler.sync(this);
+ switch ( getInterpreter().adaptivePredict(_input,35,_ctx) ) {
+ case 1:
+ {
+ setState(748);
+ expressionList();
+ }
+ break;
+ }
+ setState(753);
+ _errHandler.sync(this);
+ switch ( getInterpreter().adaptivePredict(_input,36,_ctx) ) {
+ case 1:
+ {
+ setState(751);
+ match(IF);
+ setState(752);
+ expression(0);
+ }
+ break;
+ }
+ }
+ }
+ catch (RecognitionException re) {
+ _localctx.exception = re;
+ _errHandler.reportError(this, re);
+ _errHandler.recover(this, re);
+ }
+ finally {
+ exitRule();
+ }
+ return _localctx;
+ }
+
+ public static class AssertionContext extends ParserRuleContext {
+ public ExpressionContext expression() {
+ return getRuleContext(ExpressionContext.class,0);
+ }
+ public AssertionContext(ParserRuleContext parent, int invokingState) {
+ super(parent, invokingState);
+ }
+ @Override public int getRuleIndex() { return RULE_assertion; }
+ @Override
+ public T accept(ParseTreeVisitor extends T> visitor) {
+ if ( visitor instanceof GobraParserVisitor ) return ((GobraParserVisitor extends T>)visitor).visitAssertion(this);
+ else return visitor.visitChildren(this);
+ }
+ }
+
+ public final AssertionContext assertion() throws RecognitionException {
+ AssertionContext _localctx = new AssertionContext(_ctx, getState());
+ enterRule(_localctx, 98, RULE_assertion);
+ try {
+ setState(757);
+ _errHandler.sync(this);
+ switch ( getInterpreter().adaptivePredict(_input,37,_ctx) ) {
+ case 1:
+ enterOuterAlt(_localctx, 1);
+ {
+ }
+ break;
+ case 2:
+ enterOuterAlt(_localctx, 2);
+ {
+ setState(756);
+ expression(0);
+ }
+ break;
+ }
+ }
+ catch (RecognitionException re) {
+ _localctx.exception = re;
+ _errHandler.reportError(this, re);
+ _errHandler.recover(this, re);
+ }
+ finally {
+ exitRule();
+ }
+ return _localctx;
+ }
+
+ public static class MatchStmtContext extends ParserRuleContext {
+ public TerminalNode MATCH() { return getToken(GobraParser.MATCH, 0); }
+ public ExpressionContext expression() {
+ return getRuleContext(ExpressionContext.class,0);
+ }
+ public TerminalNode L_CURLY() { return getToken(GobraParser.L_CURLY, 0); }
+ public TerminalNode R_CURLY() { return getToken(GobraParser.R_CURLY, 0); }
+ public List matchStmtClause() {
+ return getRuleContexts(MatchStmtClauseContext.class);
+ }
+ public MatchStmtClauseContext matchStmtClause(int i) {
+ return getRuleContext(MatchStmtClauseContext.class,i);
+ }
+ public MatchStmtContext(ParserRuleContext parent, int invokingState) {
+ super(parent, invokingState);
+ }
+ @Override public int getRuleIndex() { return RULE_matchStmt; }
+ @Override
+ public T accept(ParseTreeVisitor extends T> visitor) {
+ if ( visitor instanceof GobraParserVisitor ) return ((GobraParserVisitor extends T>)visitor).visitMatchStmt(this);
+ else return visitor.visitChildren(this);
+ }
+ }
+
+ public final MatchStmtContext matchStmt() throws RecognitionException {
+ MatchStmtContext _localctx = new MatchStmtContext(_ctx, getState());
+ enterRule(_localctx, 100, RULE_matchStmt);
+ int _la;
+ try {
+ enterOuterAlt(_localctx, 1);
+ {
+ setState(759);
+ match(MATCH);
+ setState(760);
+ expression(0);
+ setState(761);
+ match(L_CURLY);
+ setState(765);
+ _errHandler.sync(this);
+ _la = _input.LA(1);
+ while (_la==DEFAULT || _la==CASE) {
+ {
+ {
+ setState(762);
+ matchStmtClause();
+ }
+ }
+ setState(767);
+ _errHandler.sync(this);
+ _la = _input.LA(1);
+ }
+ setState(768);
+ match(R_CURLY);
+ }
+ }
+ catch (RecognitionException re) {
+ _localctx.exception = re;
+ _errHandler.reportError(this, re);
+ _errHandler.recover(this, re);
+ }
+ finally {
+ exitRule();
+ }
+ return _localctx;
+ }
+
+ public static class MatchStmtClauseContext extends ParserRuleContext {
+ public MatchCaseContext matchCase() {
+ return getRuleContext(MatchCaseContext.class,0);
+ }
+ public TerminalNode COLON() { return getToken(GobraParser.COLON, 0); }
+ public StatementListContext statementList() {
+ return getRuleContext(StatementListContext.class,0);
+ }
+ public MatchStmtClauseContext(ParserRuleContext parent, int invokingState) {
+ super(parent, invokingState);
+ }
+ @Override public int getRuleIndex() { return RULE_matchStmtClause; }
+ @Override
+ public T accept(ParseTreeVisitor extends T> visitor) {
+ if ( visitor instanceof GobraParserVisitor ) return ((GobraParserVisitor extends T>)visitor).visitMatchStmtClause(this);
+ else return visitor.visitChildren(this);
+ }
+ }
+
+ public final MatchStmtClauseContext matchStmtClause() throws RecognitionException {
+ MatchStmtClauseContext _localctx = new MatchStmtClauseContext(_ctx, getState());
+ enterRule(_localctx, 102, RULE_matchStmtClause);
+ try {
+ enterOuterAlt(_localctx, 1);
+ {
+ setState(770);
+ matchCase();
+ setState(771);
+ match(COLON);
+ setState(773);
+ _errHandler.sync(this);
+ switch ( getInterpreter().adaptivePredict(_input,39,_ctx) ) {
+ case 1:
+ {
+ setState(772);
+ statementList();
+ }
+ break;
+ }
+ }
+ }
+ catch (RecognitionException re) {
+ _localctx.exception = re;
+ _errHandler.reportError(this, re);
+ _errHandler.recover(this, re);
+ }
+ finally {
+ exitRule();
+ }
+ return _localctx;
+ }
+
+ public static class MatchCaseContext extends ParserRuleContext {
+ public TerminalNode CASE() { return getToken(GobraParser.CASE, 0); }
+ public MatchPatternContext matchPattern() {
+ return getRuleContext(MatchPatternContext.class,0);
+ }
+ public TerminalNode DEFAULT() { return getToken(GobraParser.DEFAULT, 0); }
+ public MatchCaseContext(ParserRuleContext parent, int invokingState) {
+ super(parent, invokingState);
+ }
+ @Override public int getRuleIndex() { return RULE_matchCase; }
+ @Override
+ public T accept(ParseTreeVisitor extends T> visitor) {
+ if ( visitor instanceof GobraParserVisitor ) return ((GobraParserVisitor extends T>)visitor).visitMatchCase(this);
+ else return visitor.visitChildren(this);
+ }
+ }
+
+ public final MatchCaseContext matchCase() throws RecognitionException {
+ MatchCaseContext _localctx = new MatchCaseContext(_ctx, getState());
+ enterRule(_localctx, 104, RULE_matchCase);
+ try {
+ setState(778);
+ _errHandler.sync(this);
+ switch (_input.LA(1)) {
+ case CASE:
+ enterOuterAlt(_localctx, 1);
+ {
+ setState(775);
+ match(CASE);
+ setState(776);
+ matchPattern();
+ }
+ break;
+ case DEFAULT:
+ enterOuterAlt(_localctx, 2);
+ {
+ setState(777);
+ match(DEFAULT);
+ }
+ break;
+ default:
+ throw new NoViableAltException(this);
+ }
+ }
+ catch (RecognitionException re) {
+ _localctx.exception = re;
+ _errHandler.reportError(this, re);
+ _errHandler.recover(this, re);
+ }
+ finally {
+ exitRule();
+ }
+ return _localctx;
+ }
+
+ public static class MatchPatternContext extends ParserRuleContext {
+ public MatchPatternContext(ParserRuleContext parent, int invokingState) {
+ super(parent, invokingState);
+ }
+ @Override public int getRuleIndex() { return RULE_matchPattern; }
+
+ public MatchPatternContext() { }
+ public void copyFrom(MatchPatternContext ctx) {
+ super.copyFrom(ctx);
+ }
+ }
+ public static class MatchPatternValueContext extends MatchPatternContext {
+ public ExpressionContext expression() {
+ return getRuleContext(ExpressionContext.class,0);
+ }
+ public MatchPatternValueContext(MatchPatternContext ctx) { copyFrom(ctx); }
+ @Override
+ public T accept(ParseTreeVisitor extends T> visitor) {
+ if ( visitor instanceof GobraParserVisitor ) return ((GobraParserVisitor extends T>)visitor).visitMatchPatternValue(this);
+ else return visitor.visitChildren(this);
+ }
+ }
+ public static class MatchPatternCompositeContext extends MatchPatternContext {
+ public LiteralTypeContext literalType() {
+ return getRuleContext(LiteralTypeContext.class,0);
+ }
+ public TerminalNode L_CURLY() { return getToken(GobraParser.L_CURLY, 0); }
+ public TerminalNode R_CURLY() { return getToken(GobraParser.R_CURLY, 0); }
+ public MatchPatternListContext matchPatternList() {
+ return getRuleContext(MatchPatternListContext.class,0);
}
- @Override public int getRuleIndex() { return RULE_terminationMeasure; }
+ public TerminalNode COMMA() { return getToken(GobraParser.COMMA, 0); }
+ public MatchPatternCompositeContext(MatchPatternContext ctx) { copyFrom(ctx); }
@Override
public T accept(ParseTreeVisitor extends T> visitor) {
- if ( visitor instanceof GobraParserVisitor ) return ((GobraParserVisitor extends T>)visitor).visitTerminationMeasure(this);
+ if ( visitor instanceof GobraParserVisitor ) return ((GobraParserVisitor extends T>)visitor).visitMatchPatternComposite(this);
+ else return visitor.visitChildren(this);
+ }
+ }
+ public static class MatchPatternBindContext extends MatchPatternContext {
+ public TerminalNode QMARK() { return getToken(GobraParser.QMARK, 0); }
+ public TerminalNode IDENTIFIER() { return getToken(GobraParser.IDENTIFIER, 0); }
+ public MatchPatternBindContext(MatchPatternContext ctx) { copyFrom(ctx); }
+ @Override
+ public T accept(ParseTreeVisitor extends T> visitor) {
+ if ( visitor instanceof GobraParserVisitor ) return ((GobraParserVisitor extends T>)visitor).visitMatchPatternBind(this);
else return visitor.visitChildren(this);
}
}
- public final TerminationMeasureContext terminationMeasure() throws RecognitionException {
- TerminationMeasureContext _localctx = new TerminationMeasureContext(_ctx, getState());
- enterRule(_localctx, 92, RULE_terminationMeasure);
+ public final MatchPatternContext matchPattern() throws RecognitionException {
+ MatchPatternContext _localctx = new MatchPatternContext(_ctx, getState());
+ enterRule(_localctx, 106, RULE_matchPattern);
+ int _la;
try {
- enterOuterAlt(_localctx, 1);
- {
- setState(718);
+ setState(793);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,34,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,43,_ctx) ) {
case 1:
+ _localctx = new MatchPatternBindContext(_localctx);
+ enterOuterAlt(_localctx, 1);
{
- setState(717);
- expressionList();
+ setState(780);
+ match(QMARK);
+ setState(781);
+ match(IDENTIFIER);
}
break;
- }
- setState(722);
- _errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,35,_ctx) ) {
- case 1:
+ case 2:
+ _localctx = new MatchPatternCompositeContext(_localctx);
+ enterOuterAlt(_localctx, 2);
{
- setState(720);
- match(IF);
- setState(721);
+ setState(782);
+ literalType();
+ setState(783);
+ match(L_CURLY);
+ setState(788);
+ _errHandler.sync(this);
+ _la = _input.LA(1);
+ if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FLOAT_LIT) | (1L << TRUE) | (1L << FALSE) | (1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << OLD) | (1L << BEFORE) | (1L << FORALL) | (1L << EXISTS) | (1L << ACCESS) | (1L << UNFOLDING) | (1L << GHOST) | (1L << QMARK) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << LEN) | (1L << NEW) | (1L << MAKE) | (1L << CAP) | (1L << SOME) | (1L << GET) | (1L << DOM) | (1L << ADT) | (1L << MATCH) | (1L << NONE) | (1L << PRED) | (1L << TYPE_OF) | (1L << IS_COMPARABLE))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (WRITEPERM - 64)) | (1L << (NOPERM - 64)) | (1L << (TRUSTED - 64)) | (1L << (FUNC - 64)) | (1L << (INTERFACE - 64)) | (1L << (MAP - 64)) | (1L << (STRUCT - 64)) | (1L << (CHAN - 64)) | (1L << (RANGE - 64)) | (1L << (TYPE - 64)) | (1L << (NIL_LIT - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (L_PAREN - 64)) | (1L << (L_BRACKET - 64)))) != 0) || ((((_la - 130)) & ~0x3f) == 0 && ((1L << (_la - 130)) & ((1L << (EXCLAMATION - 130)) | (1L << (PLUS - 130)) | (1L << (MINUS - 130)) | (1L << (CARET - 130)) | (1L << (STAR - 130)) | (1L << (AMPERSAND - 130)) | (1L << (RECEIVE - 130)) | (1L << (DECIMAL_LIT - 130)) | (1L << (BINARY_LIT - 130)) | (1L << (OCTAL_LIT - 130)) | (1L << (HEX_LIT - 130)) | (1L << (IMAGINARY_LIT - 130)) | (1L << (RUNE_LIT - 130)) | (1L << (RAW_STRING_LIT - 130)) | (1L << (INTERPRETED_STRING_LIT - 130)))) != 0)) {
+ {
+ setState(784);
+ matchPatternList();
+ setState(786);
+ _errHandler.sync(this);
+ _la = _input.LA(1);
+ if (_la==COMMA) {
+ {
+ setState(785);
+ match(COMMA);
+ }
+ }
+
+ }
+ }
+
+ setState(790);
+ match(R_CURLY);
+ }
+ break;
+ case 3:
+ _localctx = new MatchPatternValueContext(_localctx);
+ enterOuterAlt(_localctx, 3);
+ {
+ setState(792);
expression(0);
}
break;
}
- }
}
catch (RecognitionException re) {
_localctx.exception = re;
@@ -3217,40 +3701,55 @@ public final TerminationMeasureContext terminationMeasure() throws RecognitionEx
return _localctx;
}
- public static class AssertionContext extends ParserRuleContext {
- public ExpressionContext expression() {
- return getRuleContext(ExpressionContext.class,0);
+ public static class MatchPatternListContext extends ParserRuleContext {
+ public List matchPattern() {
+ return getRuleContexts(MatchPatternContext.class);
}
- public AssertionContext(ParserRuleContext parent, int invokingState) {
+ public MatchPatternContext matchPattern(int i) {
+ return getRuleContext(MatchPatternContext.class,i);
+ }
+ public List COMMA() { return getTokens(GobraParser.COMMA); }
+ public TerminalNode COMMA(int i) {
+ return getToken(GobraParser.COMMA, i);
+ }
+ public MatchPatternListContext(ParserRuleContext parent, int invokingState) {
super(parent, invokingState);
}
- @Override public int getRuleIndex() { return RULE_assertion; }
+ @Override public int getRuleIndex() { return RULE_matchPatternList; }
@Override
public T accept(ParseTreeVisitor extends T> visitor) {
- if ( visitor instanceof GobraParserVisitor ) return ((GobraParserVisitor extends T>)visitor).visitAssertion(this);
+ if ( visitor instanceof GobraParserVisitor ) return ((GobraParserVisitor extends T>)visitor).visitMatchPatternList(this);
else return visitor.visitChildren(this);
}
}
- public final AssertionContext assertion() throws RecognitionException {
- AssertionContext _localctx = new AssertionContext(_ctx, getState());
- enterRule(_localctx, 94, RULE_assertion);
+ public final MatchPatternListContext matchPatternList() throws RecognitionException {
+ MatchPatternListContext _localctx = new MatchPatternListContext(_ctx, getState());
+ enterRule(_localctx, 108, RULE_matchPatternList);
try {
- setState(726);
+ int _alt;
+ enterOuterAlt(_localctx, 1);
+ {
+ setState(795);
+ matchPattern();
+ setState(800);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,36,_ctx) ) {
- case 1:
- enterOuterAlt(_localctx, 1);
- {
- }
- break;
- case 2:
- enterOuterAlt(_localctx, 2);
- {
- setState(725);
- expression(0);
+ _alt = getInterpreter().adaptivePredict(_input,44,_ctx);
+ while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) {
+ if ( _alt==1 ) {
+ {
+ {
+ setState(796);
+ match(COMMA);
+ setState(797);
+ matchPattern();
+ }
+ }
}
- break;
+ setState(802);
+ _errHandler.sync(this);
+ _alt = getInterpreter().adaptivePredict(_input,44,_ctx);
+ }
}
}
catch (RecognitionException re) {
@@ -3290,37 +3789,37 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final BlockWithBodyParameterInfoContext blockWithBodyParameterInfo() throws RecognitionException {
BlockWithBodyParameterInfoContext _localctx = new BlockWithBodyParameterInfoContext(_ctx, getState());
- enterRule(_localctx, 96, RULE_blockWithBodyParameterInfo);
+ enterRule(_localctx, 110, RULE_blockWithBodyParameterInfo);
try {
enterOuterAlt(_localctx, 1);
{
- setState(728);
+ setState(803);
match(L_CURLY);
- setState(733);
+ setState(808);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,37,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,45,_ctx) ) {
case 1:
{
- setState(729);
+ setState(804);
match(SHARE);
- setState(730);
+ setState(805);
identifierList();
- setState(731);
+ setState(806);
eos();
}
break;
}
- setState(736);
+ setState(811);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,38,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,46,_ctx) ) {
case 1:
{
- setState(735);
+ setState(810);
statementList();
}
break;
}
- setState(738);
+ setState(813);
match(R_CURLY);
}
}
@@ -3359,47 +3858,47 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final ClosureSpecInstanceContext closureSpecInstance() throws RecognitionException {
ClosureSpecInstanceContext _localctx = new ClosureSpecInstanceContext(_ctx, getState());
- enterRule(_localctx, 98, RULE_closureSpecInstance);
+ enterRule(_localctx, 112, RULE_closureSpecInstance);
int _la;
try {
enterOuterAlt(_localctx, 1);
{
- setState(742);
+ setState(817);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,39,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,47,_ctx) ) {
case 1:
{
- setState(740);
+ setState(815);
qualifiedIdent();
}
break;
case 2:
{
- setState(741);
+ setState(816);
match(IDENTIFIER);
}
break;
}
- setState(752);
+ setState(827);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,42,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,50,_ctx) ) {
case 1:
{
- setState(744);
+ setState(819);
match(L_CURLY);
- setState(749);
+ setState(824);
_errHandler.sync(this);
_la = _input.LA(1);
- if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FLOAT_LIT) | (1L << TRUE) | (1L << FALSE) | (1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << OLD) | (1L << BEFORE) | (1L << FORALL) | (1L << EXISTS) | (1L << ACCESS) | (1L << UNFOLDING) | (1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << LEN) | (1L << NEW) | (1L << MAKE) | (1L << CAP) | (1L << SOME) | (1L << GET) | (1L << DOM) | (1L << ADT) | (1L << NONE) | (1L << PRED) | (1L << TYPE_OF) | (1L << IS_COMPARABLE) | (1L << WRITEPERM))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (NOPERM - 64)) | (1L << (TRUSTED - 64)) | (1L << (FUNC - 64)) | (1L << (INTERFACE - 64)) | (1L << (MAP - 64)) | (1L << (STRUCT - 64)) | (1L << (CHAN - 64)) | (1L << (RANGE - 64)) | (1L << (TYPE - 64)) | (1L << (NIL_LIT - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (L_PAREN - 64)) | (1L << (L_BRACKET - 64)))) != 0) || ((((_la - 129)) & ~0x3f) == 0 && ((1L << (_la - 129)) & ((1L << (EXCLAMATION - 129)) | (1L << (PLUS - 129)) | (1L << (MINUS - 129)) | (1L << (CARET - 129)) | (1L << (STAR - 129)) | (1L << (AMPERSAND - 129)) | (1L << (RECEIVE - 129)) | (1L << (DECIMAL_LIT - 129)) | (1L << (BINARY_LIT - 129)) | (1L << (OCTAL_LIT - 129)) | (1L << (HEX_LIT - 129)) | (1L << (IMAGINARY_LIT - 129)) | (1L << (RUNE_LIT - 129)) | (1L << (RAW_STRING_LIT - 129)) | (1L << (INTERPRETED_STRING_LIT - 129)))) != 0)) {
+ if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FLOAT_LIT) | (1L << TRUE) | (1L << FALSE) | (1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << OLD) | (1L << BEFORE) | (1L << FORALL) | (1L << EXISTS) | (1L << ACCESS) | (1L << UNFOLDING) | (1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << LEN) | (1L << NEW) | (1L << MAKE) | (1L << CAP) | (1L << SOME) | (1L << GET) | (1L << DOM) | (1L << ADT) | (1L << MATCH) | (1L << NONE) | (1L << PRED) | (1L << TYPE_OF) | (1L << IS_COMPARABLE))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (WRITEPERM - 64)) | (1L << (NOPERM - 64)) | (1L << (TRUSTED - 64)) | (1L << (FUNC - 64)) | (1L << (INTERFACE - 64)) | (1L << (MAP - 64)) | (1L << (STRUCT - 64)) | (1L << (CHAN - 64)) | (1L << (RANGE - 64)) | (1L << (TYPE - 64)) | (1L << (NIL_LIT - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (L_PAREN - 64)) | (1L << (L_BRACKET - 64)))) != 0) || ((((_la - 130)) & ~0x3f) == 0 && ((1L << (_la - 130)) & ((1L << (EXCLAMATION - 130)) | (1L << (PLUS - 130)) | (1L << (MINUS - 130)) | (1L << (CARET - 130)) | (1L << (STAR - 130)) | (1L << (AMPERSAND - 130)) | (1L << (RECEIVE - 130)) | (1L << (DECIMAL_LIT - 130)) | (1L << (BINARY_LIT - 130)) | (1L << (OCTAL_LIT - 130)) | (1L << (HEX_LIT - 130)) | (1L << (IMAGINARY_LIT - 130)) | (1L << (RUNE_LIT - 130)) | (1L << (RAW_STRING_LIT - 130)) | (1L << (INTERPRETED_STRING_LIT - 130)))) != 0)) {
{
- setState(745);
+ setState(820);
closureSpecParams();
- setState(747);
+ setState(822);
_errHandler.sync(this);
_la = _input.LA(1);
if (_la==COMMA) {
{
- setState(746);
+ setState(821);
match(COMMA);
}
}
@@ -3407,7 +3906,7 @@ public final ClosureSpecInstanceContext closureSpecInstance() throws Recognition
}
}
- setState(751);
+ setState(826);
match(R_CURLY);
}
break;
@@ -3449,30 +3948,30 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final ClosureSpecParamsContext closureSpecParams() throws RecognitionException {
ClosureSpecParamsContext _localctx = new ClosureSpecParamsContext(_ctx, getState());
- enterRule(_localctx, 100, RULE_closureSpecParams);
+ enterRule(_localctx, 114, RULE_closureSpecParams);
try {
int _alt;
enterOuterAlt(_localctx, 1);
{
- setState(754);
+ setState(829);
closureSpecParam();
- setState(759);
+ setState(834);
_errHandler.sync(this);
- _alt = getInterpreter().adaptivePredict(_input,43,_ctx);
+ _alt = getInterpreter().adaptivePredict(_input,51,_ctx);
while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) {
if ( _alt==1 ) {
{
{
- setState(755);
+ setState(830);
match(COMMA);
- setState(756);
+ setState(831);
closureSpecParam();
}
}
}
- setState(761);
+ setState(836);
_errHandler.sync(this);
- _alt = getInterpreter().adaptivePredict(_input,43,_ctx);
+ _alt = getInterpreter().adaptivePredict(_input,51,_ctx);
}
}
}
@@ -3506,23 +4005,23 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final ClosureSpecParamContext closureSpecParam() throws RecognitionException {
ClosureSpecParamContext _localctx = new ClosureSpecParamContext(_ctx, getState());
- enterRule(_localctx, 102, RULE_closureSpecParam);
+ enterRule(_localctx, 116, RULE_closureSpecParam);
try {
enterOuterAlt(_localctx, 1);
{
- setState(764);
+ setState(839);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,44,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,52,_ctx) ) {
case 1:
{
- setState(762);
+ setState(837);
match(IDENTIFIER);
- setState(763);
+ setState(838);
match(COLON);
}
break;
}
- setState(766);
+ setState(841);
expression(0);
}
}
@@ -3562,19 +4061,19 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final ClosureImplProofStmtContext closureImplProofStmt() throws RecognitionException {
ClosureImplProofStmtContext _localctx = new ClosureImplProofStmtContext(_ctx, getState());
- enterRule(_localctx, 104, RULE_closureImplProofStmt);
+ enterRule(_localctx, 118, RULE_closureImplProofStmt);
try {
enterOuterAlt(_localctx, 1);
{
- setState(768);
+ setState(843);
match(PROOF);
- setState(769);
+ setState(844);
expression(0);
- setState(770);
+ setState(845);
match(IMPL);
- setState(771);
+ setState(846);
closureSpecInstance();
- setState(772);
+ setState(847);
block();
}
}
@@ -3630,57 +4129,57 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final ImplementationProofContext implementationProof() throws RecognitionException {
ImplementationProofContext _localctx = new ImplementationProofContext(_ctx, getState());
- enterRule(_localctx, 106, RULE_implementationProof);
+ enterRule(_localctx, 120, RULE_implementationProof);
int _la;
try {
enterOuterAlt(_localctx, 1);
{
- setState(774);
+ setState(849);
type_();
- setState(775);
+ setState(850);
match(IMPL);
- setState(776);
+ setState(851);
type_();
- setState(795);
+ setState(870);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,47,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,55,_ctx) ) {
case 1:
{
- setState(777);
+ setState(852);
match(L_CURLY);
- setState(783);
+ setState(858);
_errHandler.sync(this);
_la = _input.LA(1);
while (_la==PRED) {
{
{
- setState(778);
+ setState(853);
implementationProofPredicateAlias();
- setState(779);
+ setState(854);
eos();
}
}
- setState(785);
+ setState(860);
_errHandler.sync(this);
_la = _input.LA(1);
}
- setState(791);
+ setState(866);
_errHandler.sync(this);
_la = _input.LA(1);
while (_la==PURE || _la==L_PAREN) {
{
{
- setState(786);
+ setState(861);
methodImplementationProof();
- setState(787);
+ setState(862);
eos();
}
}
- setState(793);
+ setState(868);
_errHandler.sync(this);
_la = _input.LA(1);
}
- setState(794);
+ setState(869);
match(R_CURLY);
}
break;
@@ -3723,33 +4222,33 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final MethodImplementationProofContext methodImplementationProof() throws RecognitionException {
MethodImplementationProofContext _localctx = new MethodImplementationProofContext(_ctx, getState());
- enterRule(_localctx, 108, RULE_methodImplementationProof);
+ enterRule(_localctx, 122, RULE_methodImplementationProof);
int _la;
try {
enterOuterAlt(_localctx, 1);
{
- setState(798);
+ setState(873);
_errHandler.sync(this);
_la = _input.LA(1);
if (_la==PURE) {
{
- setState(797);
+ setState(872);
match(PURE);
}
}
- setState(800);
+ setState(875);
nonLocalReceiver();
- setState(801);
+ setState(876);
match(IDENTIFIER);
- setState(802);
+ setState(877);
signature();
- setState(804);
+ setState(879);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,49,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,57,_ctx) ) {
case 1:
{
- setState(803);
+ setState(878);
block();
}
break;
@@ -3788,36 +4287,36 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final NonLocalReceiverContext nonLocalReceiver() throws RecognitionException {
NonLocalReceiverContext _localctx = new NonLocalReceiverContext(_ctx, getState());
- enterRule(_localctx, 110, RULE_nonLocalReceiver);
+ enterRule(_localctx, 124, RULE_nonLocalReceiver);
int _la;
try {
enterOuterAlt(_localctx, 1);
{
- setState(806);
+ setState(881);
match(L_PAREN);
- setState(808);
+ setState(883);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,50,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,58,_ctx) ) {
case 1:
{
- setState(807);
+ setState(882);
match(IDENTIFIER);
}
break;
}
- setState(811);
+ setState(886);
_errHandler.sync(this);
_la = _input.LA(1);
if (_la==STAR) {
{
- setState(810);
+ setState(885);
match(STAR);
}
}
- setState(813);
+ setState(888);
typeName();
- setState(814);
+ setState(889);
match(R_PAREN);
}
}
@@ -3854,26 +4353,26 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final SelectionContext selection() throws RecognitionException {
SelectionContext _localctx = new SelectionContext(_ctx, getState());
- enterRule(_localctx, 112, RULE_selection);
+ enterRule(_localctx, 126, RULE_selection);
try {
- setState(821);
+ setState(896);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,52,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,60,_ctx) ) {
case 1:
enterOuterAlt(_localctx, 1);
{
- setState(816);
+ setState(891);
primaryExpr(0);
}
break;
case 2:
enterOuterAlt(_localctx, 2);
{
- setState(817);
+ setState(892);
type_();
- setState(818);
+ setState(893);
match(DOT);
- setState(819);
+ setState(894);
match(IDENTIFIER);
}
break;
@@ -3913,28 +4412,28 @@ public