simple-graph-query 2.5.2 → 2.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -48439,6 +48439,7 @@ Object.defineProperty(exports, "__esModule", ({ value: true }));
48439
48439
  exports.NameNotFoundError = exports.ForgeExprEvaluator = exports.SUPPORTED_BUILTINS = void 0;
48440
48440
  exports.areTupleArraysEqual = areTupleArraysEqual;
48441
48441
  const AbstractParseTreeVisitor_1 = __webpack_require__(/*! antlr4ts/tree/AbstractParseTreeVisitor */ "./node_modules/antlr4ts/tree/AbstractParseTreeVisitor.js");
48442
+ const utils_1 = __webpack_require__(/*! ./forge-antlr/utils */ "./src/forge-antlr/utils.ts");
48442
48443
  const lodash_1 = __webpack_require__(/*! lodash */ "./node_modules/lodash/lodash.js");
48443
48444
  const ForgeExprFreeVariableFinder_1 = __webpack_require__(/*! ./ForgeExprFreeVariableFinder */ "./src/ForgeExprFreeVariableFinder.ts");
48444
48445
  const NumericConstraintOptimizer_1 = __webpack_require__(/*! ./NumericConstraintOptimizer */ "./src/NumericConstraintOptimizer.ts");
@@ -48590,7 +48591,8 @@ function bitwidthWraparound(value, bitwidth) {
48590
48591
  // list as we support more
48591
48592
  const SUPPORTED_BINARY_BUILTINS = ["add", "subtract", "multiply", "divide", "remainder"];
48592
48593
  const SUPPORTED_UNARY_BUILTINS = ["abs", "sign"];
48593
- exports.SUPPORTED_BUILTINS = SUPPORTED_BINARY_BUILTINS.concat(SUPPORTED_UNARY_BUILTINS);
48594
+ const SUPPORTED_SET_BUILTINS = ["min", "max"];
48595
+ exports.SUPPORTED_BUILTINS = SUPPORTED_BINARY_BUILTINS.concat(SUPPORTED_UNARY_BUILTINS, SUPPORTED_SET_BUILTINS);
48594
48596
  /**
48595
48597
  * A recursive evaluator for Forge expressions.
48596
48598
  * This visitor walks the parse tree and prints the type of operation encountered.
@@ -49748,6 +49750,9 @@ class ForgeExprEvaluator extends AbstractParseTreeVisitor_1.AbstractParseTreeVis
49748
49750
  else if (SUPPORTED_UNARY_BUILTINS.includes(beforeBracesExpr)) {
49749
49751
  return this.evaluateUnaryOperation(beforeBracesExpr, insideBracesExprs);
49750
49752
  }
49753
+ else if (SUPPORTED_SET_BUILTINS.includes(beforeBracesExpr)) {
49754
+ return this.evaluateSetOperation(beforeBracesExpr, insideBracesExprs);
49755
+ }
49751
49756
  }
49752
49757
  // Box join: <expr-a>[<expr-b>] == <expr-b> . <expr-a>
49753
49758
  return this.dotJoin(insideBracesExprs, beforeBracesExpr);
@@ -49922,13 +49927,13 @@ class ForgeExprEvaluator extends AbstractParseTreeVisitor_1.AbstractParseTreeVis
49922
49927
  if (ctx.COMMA_TOK()) {
49923
49928
  // there is a comma, so we need to get the value from the head of the list
49924
49929
  // and then move onto the tail after that
49925
- const headValue = ctx.name().text;
49930
+ const headValue = (0, utils_1.getIdentifierName)(ctx.name());
49926
49931
  const tailValues = this.getNameListValues(ctx.nameList());
49927
49932
  return [headValue, ...tailValues];
49928
49933
  }
49929
49934
  else {
49930
49935
  // there is no comma so there is just a single name that we need to deal with here
49931
- return [ctx.name().text];
49936
+ return [(0, utils_1.getIdentifierName)(ctx.name())];
49932
49937
  }
49933
49938
  }
49934
49939
  // helper function to get the values each var is bound to in a single quantDecl
@@ -50177,7 +50182,7 @@ class ForgeExprEvaluator extends AbstractParseTreeVisitor_1.AbstractParseTreeVis
50177
50182
  visitName(ctx) {
50178
50183
  // console.log('visiting name:', ctx.text);
50179
50184
  // if `true` or `false`, return the corresponding value
50180
- const identifier = ctx.IDENTIFIER_TOK().text;
50185
+ const identifier = (0, utils_1.getIdentifierName)(ctx);
50181
50186
  if (identifier === "true") {
50182
50187
  return true;
50183
50188
  }
@@ -50391,6 +50396,47 @@ class ForgeExprEvaluator extends AbstractParseTreeVisitor_1.AbstractParseTreeVis
50391
50396
  throw new Error(`Unsupported operation: ${operation}`);
50392
50397
  }
50393
50398
  }
50399
+ evaluateSetOperation(operation, args) {
50400
+ // min and max operate on a set of integers and return the min/max value
50401
+ // The argument should be a set (tuple array of arity 1) of numbers
50402
+ let numbers = [];
50403
+ if (isSingleValue(args)) {
50404
+ if (isNumber(args)) {
50405
+ numbers = [args];
50406
+ }
50407
+ else {
50408
+ throw new Error(`Expected a set of numbers for ${operation}`);
50409
+ }
50410
+ }
50411
+ else if (isTupleArray(args)) {
50412
+ // Extract numbers from the tuple array
50413
+ for (const tuple of args) {
50414
+ if (tuple.length !== 1) {
50415
+ throw new Error(`${operation} expects a set of arity 1 (single column)`);
50416
+ }
50417
+ const value = tuple[0];
50418
+ if (!isNumber(value)) {
50419
+ throw new Error(`${operation} expects all elements to be numbers, got: ${typeof value}`);
50420
+ }
50421
+ numbers.push(value);
50422
+ }
50423
+ }
50424
+ else {
50425
+ throw new Error(`Expected a set of numbers for ${operation}`);
50426
+ }
50427
+ if (numbers.length === 0) {
50428
+ throw new Error(`${operation} requires a non-empty set`);
50429
+ }
50430
+ if (operation === "min") {
50431
+ return Math.min(...numbers);
50432
+ }
50433
+ else if (operation === "max") {
50434
+ return Math.max(...numbers);
50435
+ }
50436
+ else {
50437
+ throw new Error(`Unsupported set operation: ${operation}`);
50438
+ }
50439
+ }
50394
50440
  }
50395
50441
  exports.ForgeExprEvaluator = ForgeExprEvaluator;
50396
50442
  // Custom error for undefined names
@@ -50416,6 +50462,7 @@ exports.NameNotFoundError = NameNotFoundError;
50416
50462
  Object.defineProperty(exports, "__esModule", ({ value: true }));
50417
50463
  exports.ForgeExprFreeVariableFinder = void 0;
50418
50464
  const AbstractParseTreeVisitor_1 = __webpack_require__(/*! antlr4ts/tree/AbstractParseTreeVisitor */ "./node_modules/antlr4ts/tree/AbstractParseTreeVisitor.js");
50465
+ const utils_1 = __webpack_require__(/*! ./forge-antlr/utils */ "./src/forge-antlr/utils.ts");
50419
50466
  const ForgeExprEvaluator_1 = __webpack_require__(/*! ./ForgeExprEvaluator */ "./src/ForgeExprEvaluator.ts");
50420
50467
  // define helper function on the FreeVariables type
50421
50468
  function getAllFreeVariables(freeVariables) {
@@ -50487,14 +50534,14 @@ class ForgeExprFreeVariableFinder extends AbstractParseTreeVisitor_1.AbstractPar
50487
50534
  if (ctx.COMMA_TOK()) {
50488
50535
  // there is a comma, so we need to get the value from the head of the list
50489
50536
  // and then move onto the tail after that
50490
- const headValue = ctx.name().text;
50537
+ const headValue = (0, utils_1.getIdentifierName)(ctx.name());
50491
50538
  const tailValues = this.getNameListValues(ctx.nameList());
50492
50539
  tailValues.add(headValue);
50493
50540
  return tailValues;
50494
50541
  }
50495
50542
  else {
50496
50543
  // there is no comma so there is just a single name that we need to deal with here
50497
- return new Set([ctx.name().text]);
50544
+ return new Set([(0, utils_1.getIdentifierName)(ctx.name())]);
50498
50545
  }
50499
50546
  }
50500
50547
  // helper function to get the names of each var in a quantDecl
@@ -50717,7 +50764,7 @@ class ForgeExprFreeVariableFinder extends AbstractParseTreeVisitor_1.AbstractPar
50717
50764
  return this.addCtxToFreeVariableMap(ctx, result);
50718
50765
  }
50719
50766
  visitName(ctx) {
50720
- const identifier = ctx.IDENTIFIER_TOK().text;
50767
+ const identifier = (0, utils_1.getIdentifierName)(ctx);
50721
50768
  if (identifier === "true" || identifier === "false") {
50722
50769
  // these aren't free variables
50723
50770
  return this.defaultResult();
@@ -50754,6 +50801,963 @@ class ForgeExprFreeVariableFinder extends AbstractParseTreeVisitor_1.AbstractPar
50754
50801
  exports.ForgeExprFreeVariableFinder = ForgeExprFreeVariableFinder;
50755
50802
 
50756
50803
 
50804
+ /***/ }),
50805
+
50806
+ /***/ "./src/ForgeExprStaticAnalyzer.ts":
50807
+ /*!****************************************!*\
50808
+ !*** ./src/ForgeExprStaticAnalyzer.ts ***!
50809
+ \****************************************/
50810
+ /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
50811
+
50812
+ "use strict";
50813
+
50814
+ Object.defineProperty(exports, "__esModule", ({ value: true }));
50815
+ exports.ForgeExprStaticAnalyzer = void 0;
50816
+ const AbstractParseTreeVisitor_1 = __webpack_require__(/*! antlr4ts/tree/AbstractParseTreeVisitor */ "./node_modules/antlr4ts/tree/AbstractParseTreeVisitor.js");
50817
+ const ForgeParser_1 = __webpack_require__(/*! ./forge-antlr/ForgeParser */ "./src/forge-antlr/ForgeParser.ts");
50818
+ const utils_1 = __webpack_require__(/*! ./forge-antlr/utils */ "./src/forge-antlr/utils.ts");
50819
+ const UNKNOWN = { kind: "unknown" };
50820
+ // Helper that wraps the schema with O(1) lookups and lattice queries.
50821
+ class SchemaInfo {
50822
+ constructor(schema) {
50823
+ this.typesById = new Map(schema.getTypes().map((t) => [t.id, t]));
50824
+ this.relationsByName = new Map(schema.getRelations().map((r) => [r.name, r]));
50825
+ }
50826
+ getType(id) { return this.typesById.get(id); }
50827
+ getRelation(name) { return this.relationsByName.get(name); }
50828
+ // A ⊆ B when B is in A's lineage. `IType.types` is the lineage in ascending
50829
+ // order, conventionally starting with the type itself.
50830
+ isSubtypeOf(a, b) {
50831
+ if (a === b)
50832
+ return true;
50833
+ const t = this.typesById.get(a);
50834
+ if (!t)
50835
+ return false;
50836
+ return t.types.includes(b);
50837
+ }
50838
+ // Closed-world disjointness: A and B are disjoint iff no type in the
50839
+ // schema has both A and B in its lineage (i.e., no common subtype exists).
50840
+ // Sound only when the caller treats the supplied schema as complete.
50841
+ areDisjoint(a, b) {
50842
+ if (a === b)
50843
+ return false;
50844
+ for (const t of this.typesById.values()) {
50845
+ if (t.types.includes(a) && t.types.includes(b))
50846
+ return false;
50847
+ }
50848
+ return true;
50849
+ }
50850
+ }
50851
+ // ANTLR's .text concatenates child tokens without whitespace, which gives us
50852
+ // a usable canonical form for "syntactically the same subexpression".
50853
+ function sameSubtree(a, b) {
50854
+ if (!a || !b)
50855
+ return false;
50856
+ return a.text === b.text;
50857
+ }
50858
+ // True iff `ctx` is structurally a difference whose subtrahend (anywhere in a
50859
+ // left-associated minus chain) matches `targetText`. Strips parens and
50860
+ // pass-through wrappers. Examples that match for target="X":
50861
+ // X - X (Y - X) (Y - Z - X) ((Y - X) - Z)
50862
+ function subtractsTarget(ctx, targetText) {
50863
+ if (!ctx)
50864
+ return false;
50865
+ let cur = ctx;
50866
+ while (cur.childCount === 1)
50867
+ cur = cur.getChild(0);
50868
+ if (cur instanceof ForgeParser_1.Expr18Context && cur.LEFT_PAREN_TOK()) {
50869
+ return subtractsTarget(cur.expr(), targetText);
50870
+ }
50871
+ if (cur instanceof ForgeParser_1.Expr8Context && cur.MINUS_TOK()) {
50872
+ if (cur.expr10().text === targetText)
50873
+ return true;
50874
+ // Chain: `A - B - target` parses left-assoc as `((A - B) - target)`;
50875
+ // recurse on the left to catch deeper occurrences.
50876
+ return subtractsTarget(cur.expr8(), targetText);
50877
+ }
50878
+ return false;
50879
+ }
50880
+ // True iff `ctx` is structurally an intersection involving `targetText`
50881
+ // (so `ctx ⊆ target`). Walks through parens, pass-throughs, and chains of `&`.
50882
+ function intersectionInvolves(ctx, targetText) {
50883
+ if (!ctx)
50884
+ return false;
50885
+ let cur = ctx;
50886
+ while (cur.childCount === 1)
50887
+ cur = cur.getChild(0);
50888
+ if (cur instanceof ForgeParser_1.Expr18Context && cur.LEFT_PAREN_TOK()) {
50889
+ return intersectionInvolves(cur.expr(), targetText);
50890
+ }
50891
+ if (cur instanceof ForgeParser_1.Expr11Context && cur.AMP_TOK()) {
50892
+ if (cur.expr11().text === targetText)
50893
+ return true;
50894
+ if (cur.expr12().text === targetText)
50895
+ return true;
50896
+ return (intersectionInvolves(cur.expr11(), targetText) ||
50897
+ intersectionInvolves(cur.expr12(), targetText));
50898
+ }
50899
+ return false;
50900
+ }
50901
+ // True iff `ctx` is structurally a union containing `targetText`
50902
+ // (so `target ⊆ ctx`). Walks through parens, pass-throughs, and chains of `+`.
50903
+ function unionContains(ctx, targetText) {
50904
+ if (!ctx)
50905
+ return false;
50906
+ let cur = ctx;
50907
+ while (cur.childCount === 1)
50908
+ cur = cur.getChild(0);
50909
+ if (cur instanceof ForgeParser_1.Expr18Context && cur.LEFT_PAREN_TOK()) {
50910
+ return unionContains(cur.expr(), targetText);
50911
+ }
50912
+ if (cur instanceof ForgeParser_1.Expr8Context && cur.PLUS_TOK()) {
50913
+ if (cur.expr8().text === targetText)
50914
+ return true;
50915
+ if (cur.expr10().text === targetText)
50916
+ return true;
50917
+ return (unionContains(cur.expr8(), targetText) ||
50918
+ unionContains(cur.expr10(), targetText));
50919
+ }
50920
+ return false;
50921
+ }
50922
+ // Strip wrapping parens / pass-through expr layers to reveal an inner NEG_TOK
50923
+ // at the expr5 level. Returns the operand-text if `ctx` is structurally `not E`,
50924
+ // else undefined.
50925
+ function negationOperandText(ctx) {
50926
+ if (!ctx)
50927
+ return undefined;
50928
+ let cur = ctx;
50929
+ while (cur.childCount === 1) {
50930
+ cur = cur.getChild(0);
50931
+ }
50932
+ if (cur instanceof ForgeParser_1.Expr5Context && cur.NEG_TOK()) {
50933
+ const inner = cur.expr5();
50934
+ return inner ? inner.text : undefined;
50935
+ }
50936
+ if (cur instanceof ForgeParser_1.Expr18Context && cur.LEFT_PAREN_TOK()) {
50937
+ return negationOperandText(cur.expr());
50938
+ }
50939
+ return undefined;
50940
+ }
50941
+ class ForgeExprStaticAnalyzer extends AbstractParseTreeVisitor_1.AbstractParseTreeVisitor {
50942
+ constructor(schema) {
50943
+ super();
50944
+ if (schema)
50945
+ this.schema = new SchemaInfo(schema);
50946
+ }
50947
+ // Walk a nameList (`a, b, c`) and accumulate identifiers into `out`.
50948
+ collectNamesFromList(ctx, out) {
50949
+ out.add((0, utils_1.getIdentifierName)(ctx.name()));
50950
+ const tail = ctx.nameList();
50951
+ if (tail)
50952
+ this.collectNamesFromList(tail, out);
50953
+ }
50954
+ // Walk a quantDeclList (`a : S, b : T`) and accumulate all bound identifiers.
50955
+ collectBoundNames(ctx, out) {
50956
+ this.collectNamesFromList(ctx.quantDecl().nameList(), out);
50957
+ const tail = ctx.quantDeclList();
50958
+ if (tail)
50959
+ this.collectBoundNames(tail, out);
50960
+ }
50961
+ // Policy: when a schema is provided, type and relation names are reserved —
50962
+ // they may only refer to the schema entity. Returns an ill-typed Abstract if
50963
+ // any candidate name collides; undefined otherwise.
50964
+ illTypedIfBindsReservedName(names) {
50965
+ if (!this.schema)
50966
+ return undefined;
50967
+ for (const name of names) {
50968
+ if (this.schema.getType(name) || this.schema.getRelation(name)) {
50969
+ return {
50970
+ kind: "ill-typed",
50971
+ reason: `cannot bind variable named '${name}': it is a reserved schema ` +
50972
+ `${this.schema.getType(name) ? "type" : "relation"} name`,
50973
+ };
50974
+ }
50975
+ }
50976
+ return undefined;
50977
+ }
50978
+ // Public entry: convert internal lattice value to a verdict + reason.
50979
+ analyze(ctx) {
50980
+ const v = this.visit(ctx);
50981
+ if (v.kind === "bool") {
50982
+ return v.value
50983
+ ? { status: "tautology", reason: "expression folds to literal true" }
50984
+ : { status: "unsat", reason: "expression folds to literal false" };
50985
+ }
50986
+ if (v.kind === "empty") {
50987
+ return { status: "empty", reason: "expression is provably the empty set" };
50988
+ }
50989
+ if (v.kind === "ill-typed") {
50990
+ return { status: "ill-typed", reason: v.reason };
50991
+ }
50992
+ return { status: "unknown" };
50993
+ }
50994
+ // Arity of an Abstract when known; -1 means "not determinable".
50995
+ static arityOf(v) {
50996
+ if (v.kind === "typed")
50997
+ return v.arity;
50998
+ if (v.kind === "bool" || v.kind === "num")
50999
+ return 1; // singleton sets
51000
+ if (v.kind === "empty")
51001
+ return -1; // empty has no committed arity
51002
+ return -1;
51003
+ }
51004
+ defaultResult() {
51005
+ return UNKNOWN;
51006
+ }
51007
+ // Return the first ill-typed value among the args, or undefined. Used by
51008
+ // every operator handler to surface a statically malformed sub-expression
51009
+ // before any fold (including short-circuits like `false AND ?` and `true OR
51010
+ // ?`) could mask it.
51011
+ static bailIfIllTyped(...vals) {
51012
+ for (const v of vals) {
51013
+ if (v.kind === "ill-typed")
51014
+ return v;
51015
+ }
51016
+ return undefined;
51017
+ }
51018
+ // Prefer the more specific child result when aggregating across siblings.
51019
+ // For pass-through expr layers there's exactly one meaningful child; for
51020
+ // wrapper nodes like `( expr )` the terminals contribute UNKNOWN and the
51021
+ // real value comes from the single non-terminal child. Ill-typed always
51022
+ // wins — if any subtree is statically malformed, the parent is too.
51023
+ aggregateResult(aggregate, nextResult) {
51024
+ if (aggregate.kind === "ill-typed")
51025
+ return aggregate;
51026
+ if (nextResult.kind === "ill-typed")
51027
+ return nextResult;
51028
+ if (aggregate.kind === "unknown")
51029
+ return nextResult;
51030
+ return aggregate;
51031
+ }
51032
+ // Let/bind introduce data-dependent bindings; we don't fold through them.
51033
+ // Quantifiers we *do* fold in the cases where the verdict is independent of
51034
+ // the binding: an empty quantified domain, or a body that's a literal.
51035
+ visitExpr(ctx) {
51036
+ if (ctx.LET_TOK() || ctx.BIND_TOK())
51037
+ return UNKNOWN;
51038
+ const quant = ctx.quant();
51039
+ if (quant)
51040
+ return this.foldQuantifier(ctx, quant);
51041
+ return this.visitChildren(ctx);
51042
+ }
51043
+ foldQuantifier(ctx, quant) {
51044
+ const blockOrBar = ctx.blockOrBar();
51045
+ if (!blockOrBar)
51046
+ return UNKNOWN;
51047
+ // Reserved-name check at the binder: under a schema, type/relation names
51048
+ // cannot be reused as quantified variables.
51049
+ const declListTop = ctx.quantDeclList();
51050
+ if (declListTop) {
51051
+ const boundHere = new Set();
51052
+ this.collectBoundNames(declListTop, boundHere);
51053
+ const reservedError = this.illTypedIfBindsReservedName(boundHere);
51054
+ if (reservedError)
51055
+ return reservedError;
51056
+ }
51057
+ // Determine if any quantified domain is statically empty.
51058
+ let domainEmpty = false;
51059
+ let declList = ctx.quantDeclList();
51060
+ while (declList) {
51061
+ const setExpr = declList.quantDecl().expr();
51062
+ const v = this.visit(setExpr);
51063
+ if (v.kind === "ill-typed")
51064
+ return v;
51065
+ if (v.kind === "empty") {
51066
+ domainEmpty = true;
51067
+ break;
51068
+ }
51069
+ const next = declList.quantDeclList();
51070
+ if (!next)
51071
+ break;
51072
+ declList = next;
51073
+ }
51074
+ // Body analysis (only attempt the `| expr` form; blocks are conjunctions
51075
+ // and would need the binding to be meaningful).
51076
+ let body = UNKNOWN;
51077
+ if (blockOrBar.BAR_TOK() && blockOrBar.expr()) {
51078
+ body = this.visit(blockOrBar.expr());
51079
+ }
51080
+ const mult = quant.mult();
51081
+ const isAll = quant.ALL_TOK() !== undefined;
51082
+ const isNo = quant.NO_TOK() !== undefined;
51083
+ const isSome = mult?.SOME_TOK() !== undefined;
51084
+ const isOne = mult?.ONE_TOK() !== undefined;
51085
+ const isTwo = mult?.TWO_TOK() !== undefined;
51086
+ const isLone = mult?.LONE_TOK() !== undefined;
51087
+ if (domainEmpty) {
51088
+ // ∀ over empty is vacuously true; ∃ over empty is false.
51089
+ if (isAll || isNo || isLone)
51090
+ return { kind: "bool", value: true };
51091
+ if (isSome || isOne || isTwo)
51092
+ return { kind: "bool", value: false };
51093
+ }
51094
+ if (body.kind === "bool") {
51095
+ if (!body.value) {
51096
+ // body always false: no x satisfies, regardless of domain
51097
+ if (isNo || isLone)
51098
+ return { kind: "bool", value: true };
51099
+ if (isSome || isOne || isTwo)
51100
+ return { kind: "bool", value: false };
51101
+ // all x | false → data-dependent (vacuous if domain empty, else false)
51102
+ }
51103
+ else {
51104
+ // body always true: every x satisfies
51105
+ if (isAll)
51106
+ return { kind: "bool", value: true };
51107
+ // some/one/no etc. depend on domain size — data-dependent
51108
+ }
51109
+ }
51110
+ return UNKNOWN;
51111
+ }
51112
+ // A block { e1; e2; ...; en } is a conjunction of its expressions.
51113
+ visitBlock(ctx) {
51114
+ let result = { kind: "bool", value: true };
51115
+ for (const e of ctx.expr()) {
51116
+ const v = this.visit(e);
51117
+ if (v.kind === "ill-typed")
51118
+ return v; // ill-typed wins
51119
+ if (v.kind === "bool" && !v.value)
51120
+ return v; // any false → false
51121
+ if (v.kind !== "bool")
51122
+ result = UNKNOWN; // forget the running true
51123
+ }
51124
+ return result;
51125
+ }
51126
+ visitExpr1(ctx) {
51127
+ if (ctx.OR_TOK()) {
51128
+ const leftCtx = ctx.expr1();
51129
+ const rightCtx = ctx.expr1_5();
51130
+ const l = this.visit(leftCtx);
51131
+ const r = this.visit(rightCtx);
51132
+ const bail = ForgeExprStaticAnalyzer.bailIfIllTyped(l, r);
51133
+ if (bail)
51134
+ return bail;
51135
+ // X or X → X
51136
+ if (sameSubtree(leftCtx, rightCtx))
51137
+ return l;
51138
+ if (l.kind === "bool" && l.value)
51139
+ return l;
51140
+ if (r.kind === "bool" && r.value)
51141
+ return r;
51142
+ if (l.kind === "bool" && r.kind === "bool") {
51143
+ return { kind: "bool", value: l.value || r.value };
51144
+ }
51145
+ // X or not X / not X or X → true (classical tautology)
51146
+ const lNeg = negationOperandText(leftCtx);
51147
+ const rNeg = negationOperandText(rightCtx);
51148
+ if (lNeg !== undefined && lNeg === rightCtx.text)
51149
+ return { kind: "bool", value: true };
51150
+ if (rNeg !== undefined && rNeg === leftCtx.text)
51151
+ return { kind: "bool", value: true };
51152
+ return UNKNOWN;
51153
+ }
51154
+ return this.visitChildren(ctx);
51155
+ }
51156
+ visitExpr1_5(ctx) {
51157
+ if (ctx.XOR_TOK()) {
51158
+ const leftCtx = ctx.expr1_5();
51159
+ const rightCtx = ctx.expr2();
51160
+ const l = this.visit(leftCtx);
51161
+ const r = this.visit(rightCtx);
51162
+ const bail = ForgeExprStaticAnalyzer.bailIfIllTyped(l, r);
51163
+ if (bail)
51164
+ return bail;
51165
+ // X xor X → false
51166
+ if (sameSubtree(leftCtx, rightCtx))
51167
+ return { kind: "bool", value: false };
51168
+ if (l.kind === "bool" && r.kind === "bool") {
51169
+ return { kind: "bool", value: l.value !== r.value };
51170
+ }
51171
+ return UNKNOWN;
51172
+ }
51173
+ return this.visitChildren(ctx);
51174
+ }
51175
+ visitExpr2(ctx) {
51176
+ if (ctx.IFF_TOK()) {
51177
+ const leftCtx = ctx.expr2();
51178
+ const rightCtx = ctx.expr3();
51179
+ const l = this.visit(leftCtx);
51180
+ const r = this.visit(rightCtx);
51181
+ const bail = ForgeExprStaticAnalyzer.bailIfIllTyped(l, r);
51182
+ if (bail)
51183
+ return bail;
51184
+ // X iff X → true
51185
+ if (sameSubtree(leftCtx, rightCtx))
51186
+ return { kind: "bool", value: true };
51187
+ // X iff not X / not X iff X → false
51188
+ const lNeg = negationOperandText(leftCtx);
51189
+ const rNeg = negationOperandText(rightCtx);
51190
+ if (lNeg !== undefined && lNeg === rightCtx.text)
51191
+ return { kind: "bool", value: false };
51192
+ if (rNeg !== undefined && rNeg === leftCtx.text)
51193
+ return { kind: "bool", value: false };
51194
+ if (l.kind === "bool" && r.kind === "bool") {
51195
+ return { kind: "bool", value: l.value === r.value };
51196
+ }
51197
+ return UNKNOWN;
51198
+ }
51199
+ return this.visitChildren(ctx);
51200
+ }
51201
+ visitExpr3(ctx) {
51202
+ if (ctx.IMP_TOK()) {
51203
+ const ant = this.visit(ctx.expr4());
51204
+ const exprs3 = ctx.expr3();
51205
+ // Implication or implication-with-else. Visit all branches up front so
51206
+ // an ill-typed sub-expression is reported even when a short-circuit
51207
+ // (false antecedent, etc.) would otherwise fold the verdict.
51208
+ if (ctx.ELSE_TOK()) {
51209
+ const thenBranch = this.visit(exprs3[0]);
51210
+ const elseBranch = this.visit(exprs3[1]);
51211
+ const bail = ForgeExprStaticAnalyzer.bailIfIllTyped(ant, thenBranch, elseBranch);
51212
+ if (bail)
51213
+ return bail;
51214
+ if (ant.kind === "bool")
51215
+ return ant.value ? thenBranch : elseBranch;
51216
+ return UNKNOWN;
51217
+ }
51218
+ const conseqCtx = exprs3[0];
51219
+ const con = this.visit(conseqCtx);
51220
+ const bail = ForgeExprStaticAnalyzer.bailIfIllTyped(ant, con);
51221
+ if (bail)
51222
+ return bail;
51223
+ // antecedent false → vacuously true
51224
+ if (ant.kind === "bool" && !ant.value)
51225
+ return { kind: "bool", value: true };
51226
+ // true => X ≡ X
51227
+ if (ant.kind === "bool" && ant.value)
51228
+ return con;
51229
+ // _ => true ≡ true
51230
+ if (con.kind === "bool" && con.value)
51231
+ return con;
51232
+ return UNKNOWN;
51233
+ }
51234
+ return this.visitChildren(ctx);
51235
+ }
51236
+ visitExpr4(ctx) {
51237
+ if (ctx.AND_TOK()) {
51238
+ const leftCtx = ctx.expr4();
51239
+ const rightCtx = ctx.expr4_5();
51240
+ const l = this.visit(leftCtx);
51241
+ const r = this.visit(rightCtx);
51242
+ const bail = ForgeExprStaticAnalyzer.bailIfIllTyped(l, r);
51243
+ if (bail)
51244
+ return bail;
51245
+ // X and X → X
51246
+ if (sameSubtree(leftCtx, rightCtx))
51247
+ return l;
51248
+ if (l.kind === "bool" && !l.value)
51249
+ return l;
51250
+ if (r.kind === "bool" && !r.value)
51251
+ return r;
51252
+ if (l.kind === "bool" && r.kind === "bool") {
51253
+ return { kind: "bool", value: l.value && r.value };
51254
+ }
51255
+ // X and not X / not X and X → false
51256
+ const lNeg = negationOperandText(leftCtx);
51257
+ const rNeg = negationOperandText(rightCtx);
51258
+ if (lNeg !== undefined && lNeg === rightCtx.text)
51259
+ return { kind: "bool", value: false };
51260
+ if (rNeg !== undefined && rNeg === leftCtx.text)
51261
+ return { kind: "bool", value: false };
51262
+ return UNKNOWN;
51263
+ }
51264
+ return this.visitChildren(ctx);
51265
+ }
51266
+ visitExpr5(ctx) {
51267
+ if (ctx.NEG_TOK()) {
51268
+ const inner = this.visit(ctx.expr5());
51269
+ if (inner.kind === "ill-typed")
51270
+ return inner;
51271
+ if (inner.kind === "bool")
51272
+ return { kind: "bool", value: !inner.value };
51273
+ return UNKNOWN;
51274
+ }
51275
+ // Temporal operators are not implemented; bail out conservatively.
51276
+ if (ctx.ALWAYS_TOK() ||
51277
+ ctx.EVENTUALLY_TOK() ||
51278
+ ctx.AFTER_TOK() ||
51279
+ ctx.BEFORE_TOK() ||
51280
+ ctx.ONCE_TOK() ||
51281
+ ctx.HISTORICALLY_TOK()) {
51282
+ return UNKNOWN;
51283
+ }
51284
+ return this.visitChildren(ctx);
51285
+ }
51286
+ visitExpr6(ctx) {
51287
+ const op = ctx.compareOp();
51288
+ if (!op)
51289
+ return this.visitChildren(ctx);
51290
+ const leftCtx = ctx.expr6();
51291
+ const rightCtx = ctx.expr7();
51292
+ const l = this.visit(leftCtx);
51293
+ const r = this.visit(rightCtx);
51294
+ const bail = ForgeExprStaticAnalyzer.bailIfIllTyped(l, r);
51295
+ if (bail)
51296
+ return bail;
51297
+ const negate = ctx.NEG_TOK() !== undefined;
51298
+ const opText = op.text;
51299
+ // `ni` is non-membership (the codebase's evaluator implements it as
51300
+ // !(in)). We fold it by computing the corresponding `in` verdict and
51301
+ // letting `finalize` invert. This keeps the static verdict in agreement
51302
+ // with runtime semantics for expressions like `X ni X` (false) and
51303
+ // `none ni 1` (true).
51304
+ const isNi = opText === "ni";
51305
+ const opForLogic = isNi ? "in" : opText;
51306
+ const finalize = (value) => {
51307
+ let v = value;
51308
+ if (isNi)
51309
+ v = !v;
51310
+ if (negate)
51311
+ v = !v;
51312
+ return { kind: "bool", value: v };
51313
+ };
51314
+ // Same-subtree shortcuts hold regardless of unknown values.
51315
+ if (sameSubtree(leftCtx, rightCtx)) {
51316
+ switch (opForLogic) {
51317
+ case "=":
51318
+ case "<=":
51319
+ case ">=":
51320
+ case "in":
51321
+ return finalize(true);
51322
+ case "<":
51323
+ case ">":
51324
+ return finalize(false);
51325
+ }
51326
+ }
51327
+ // Numeric literal folding.
51328
+ if (l.kind === "num" && r.kind === "num") {
51329
+ switch (opForLogic) {
51330
+ case "=":
51331
+ return finalize(l.value === r.value);
51332
+ case "<":
51333
+ return finalize(l.value < r.value);
51334
+ case ">":
51335
+ return finalize(l.value > r.value);
51336
+ case "<=":
51337
+ return finalize(l.value <= r.value);
51338
+ case ">=":
51339
+ return finalize(l.value >= r.value);
51340
+ }
51341
+ }
51342
+ // Boolean literal equality.
51343
+ if (l.kind === "bool" && r.kind === "bool" && opForLogic === "=") {
51344
+ return finalize(l.value === r.value);
51345
+ }
51346
+ // Empty / singleton comparisons.
51347
+ const lIsKnownSingleton = l.kind === "num" || l.kind === "bool";
51348
+ const rIsKnownSingleton = r.kind === "num" || r.kind === "bool";
51349
+ if (opForLogic === "=") {
51350
+ if (l.kind === "empty" && r.kind === "empty")
51351
+ return finalize(true);
51352
+ if (l.kind === "empty" && rIsKnownSingleton)
51353
+ return finalize(false);
51354
+ if (lIsKnownSingleton && r.kind === "empty")
51355
+ return finalize(false);
51356
+ }
51357
+ if (opForLogic === "in") {
51358
+ // empty set is a subset of every set
51359
+ if (l.kind === "empty")
51360
+ return finalize(true);
51361
+ // a non-empty singleton cannot be contained in the empty set
51362
+ if (lIsKnownSingleton && r.kind === "empty")
51363
+ return finalize(false);
51364
+ }
51365
+ // Arity mismatch on arity-sensitive comparisons → ill-typed.
51366
+ if (opText === "=" || opText === "in" || opText === "ni") {
51367
+ const la = ForgeExprStaticAnalyzer.arityOf(l);
51368
+ const ra = ForgeExprStaticAnalyzer.arityOf(r);
51369
+ if (la > 0 && ra > 0 && la !== ra) {
51370
+ return {
51371
+ kind: "ill-typed",
51372
+ reason: `arity mismatch in '${opText}': left has arity ${la}, right has arity ${ra}`,
51373
+ };
51374
+ }
51375
+ }
51376
+ // Schema-driven: subtype tautologies for `in` (and `ni` via finalize
51377
+ // inversion when A ⊆ B → A in B is true → A ni B is false). We
51378
+ // deliberately do NOT positively fold `ni` from the lattice — concluding
51379
+ // "not (A ⊆ B)" requires disjointness reasoning we don't perform here.
51380
+ if (this.schema && l.kind === "typed" && r.kind === "typed") {
51381
+ const lCols = l.columnTypes;
51382
+ const rCols = r.columnTypes;
51383
+ if (lCols && rCols && lCols.length === rCols.length) {
51384
+ const colWiseSubtype = lCols.every((lc, i) => this.schema.isSubtypeOf(lc, rCols[i]));
51385
+ if (opForLogic === "in" && colWiseSubtype)
51386
+ return finalize(true);
51387
+ }
51388
+ }
51389
+ return UNKNOWN;
51390
+ }
51391
+ visitExpr7(ctx) {
51392
+ const inner = this.visit(ctx.expr8());
51393
+ if (inner.kind === "ill-typed")
51394
+ return inner;
51395
+ if (ctx.SET_TOK())
51396
+ return inner;
51397
+ if (inner.kind === "empty") {
51398
+ if (ctx.NO_TOK())
51399
+ return { kind: "bool", value: true };
51400
+ if (ctx.LONE_TOK())
51401
+ return { kind: "bool", value: true };
51402
+ if (ctx.SOME_TOK())
51403
+ return { kind: "bool", value: false };
51404
+ if (ctx.ONE_TOK())
51405
+ return { kind: "bool", value: false };
51406
+ if (ctx.TWO_TOK())
51407
+ return { kind: "bool", value: false };
51408
+ }
51409
+ // If we can't say anything specific about the multiplicity, the whole
51410
+ // expression is still a boolean — but its value is unknown.
51411
+ if (ctx.NO_TOK() ||
51412
+ ctx.LONE_TOK() ||
51413
+ ctx.SOME_TOK() ||
51414
+ ctx.ONE_TOK() ||
51415
+ ctx.TWO_TOK()) {
51416
+ return UNKNOWN;
51417
+ }
51418
+ return inner;
51419
+ }
51420
+ visitExpr8(ctx) {
51421
+ if (ctx.MINUS_TOK()) {
51422
+ const leftCtx = ctx.expr8();
51423
+ const rightCtx = ctx.expr10();
51424
+ const l = this.visit(leftCtx);
51425
+ const r = this.visit(rightCtx);
51426
+ const bail = ForgeExprStaticAnalyzer.bailIfIllTyped(l, r);
51427
+ if (bail)
51428
+ return bail;
51429
+ // X - X → empty (set difference) or 0 (numeric)
51430
+ if (sameSubtree(leftCtx, rightCtx)) {
51431
+ if (l.kind === "num")
51432
+ return { kind: "num", value: 0 };
51433
+ return { kind: "empty" };
51434
+ }
51435
+ // Numeric folding for literal subtraction.
51436
+ if (l.kind === "num" && r.kind === "num") {
51437
+ return { kind: "num", value: l.value - r.value };
51438
+ }
51439
+ // empty - X → empty; X - empty → X
51440
+ if (l.kind === "empty")
51441
+ return { kind: "empty" };
51442
+ if (r.kind === "empty")
51443
+ return l;
51444
+ // Subset patterns: L ⊆ R ⇒ L - R = empty.
51445
+ // (R & ?) - R or (? & R) - R (intersection is a subset)
51446
+ if (intersectionInvolves(leftCtx, rightCtx.text))
51447
+ return { kind: "empty" };
51448
+ // L - (L + ?) or L - (? + L) (L is a subset of the union)
51449
+ if (unionContains(rightCtx, leftCtx.text))
51450
+ return { kind: "empty" };
51451
+ // Arity mismatch is a static type error.
51452
+ const lArity = ForgeExprStaticAnalyzer.arityOf(l);
51453
+ const rArity = ForgeExprStaticAnalyzer.arityOf(r);
51454
+ if (lArity > 0 && rArity > 0 && lArity !== rArity) {
51455
+ return {
51456
+ kind: "ill-typed",
51457
+ reason: `arity mismatch in '-': left has arity ${lArity}, right has arity ${rArity}`,
51458
+ };
51459
+ }
51460
+ return UNKNOWN;
51461
+ }
51462
+ if (ctx.PLUS_TOK()) {
51463
+ const l = this.visit(ctx.expr8());
51464
+ const r = this.visit(ctx.expr10());
51465
+ const bail = ForgeExprStaticAnalyzer.bailIfIllTyped(l, r);
51466
+ if (bail)
51467
+ return bail;
51468
+ // Numeric literal addition.
51469
+ if (l.kind === "num" && r.kind === "num") {
51470
+ return { kind: "num", value: l.value + r.value };
51471
+ }
51472
+ // Empty is the identity of set union: X + none ≡ X, none + X ≡ X.
51473
+ if (l.kind === "empty" && r.kind === "empty")
51474
+ return { kind: "empty" };
51475
+ if (l.kind === "empty")
51476
+ return r;
51477
+ if (r.kind === "empty")
51478
+ return l;
51479
+ // Arity mismatch is a static type error.
51480
+ const lArity = ForgeExprStaticAnalyzer.arityOf(l);
51481
+ const rArity = ForgeExprStaticAnalyzer.arityOf(r);
51482
+ if (lArity > 0 && rArity > 0 && lArity !== rArity) {
51483
+ return {
51484
+ kind: "ill-typed",
51485
+ reason: `arity mismatch in '+': left has arity ${lArity}, right has arity ${rArity}`,
51486
+ };
51487
+ }
51488
+ if (lArity > 0 && rArity > 0) {
51489
+ return { kind: "typed", arity: lArity };
51490
+ }
51491
+ return UNKNOWN;
51492
+ }
51493
+ return this.visitChildren(ctx);
51494
+ }
51495
+ visitExpr9(ctx) {
51496
+ if (ctx.CARD_TOK()) {
51497
+ const inner = this.visit(ctx.expr9());
51498
+ if (inner.kind === "ill-typed")
51499
+ return inner;
51500
+ if (inner.kind === "empty")
51501
+ return { kind: "num", value: 0 };
51502
+ return UNKNOWN;
51503
+ }
51504
+ return this.visitChildren(ctx);
51505
+ }
51506
+ visitExpr12(ctx) {
51507
+ if (ctx.arrowOp()) {
51508
+ // Cartesian product: if either side is empty, the product is empty.
51509
+ const l = this.visit(ctx.expr12());
51510
+ const r = this.visit(ctx.expr13());
51511
+ const bail = ForgeExprStaticAnalyzer.bailIfIllTyped(l, r);
51512
+ if (bail)
51513
+ return bail;
51514
+ if (l.kind === "empty" || r.kind === "empty")
51515
+ return { kind: "empty" };
51516
+ // Propagate combined arity / column types.
51517
+ if (l.kind === "typed" && r.kind === "typed") {
51518
+ const cols = l.columnTypes && r.columnTypes
51519
+ ? [...l.columnTypes, ...r.columnTypes]
51520
+ : undefined;
51521
+ return { kind: "typed", arity: l.arity + r.arity, columnTypes: cols };
51522
+ }
51523
+ const la = ForgeExprStaticAnalyzer.arityOf(l);
51524
+ const ra = ForgeExprStaticAnalyzer.arityOf(r);
51525
+ if (la > 0 && ra > 0)
51526
+ return { kind: "typed", arity: la + ra };
51527
+ return UNKNOWN;
51528
+ }
51529
+ return this.visitChildren(ctx);
51530
+ }
51531
+ visitExpr11(ctx) {
51532
+ if (ctx.AMP_TOK()) {
51533
+ const leftCtx = ctx.expr11();
51534
+ const rightCtx = ctx.expr12();
51535
+ const l = this.visit(leftCtx);
51536
+ const r = this.visit(rightCtx);
51537
+ const bail = ForgeExprStaticAnalyzer.bailIfIllTyped(l, r);
51538
+ if (bail)
51539
+ return bail;
51540
+ // X & X → X (preserve "empty" if we know it; otherwise unknown).
51541
+ if (sameSubtree(leftCtx, rightCtx))
51542
+ return l;
51543
+ // empty & anything → empty
51544
+ if (l.kind === "empty" || r.kind === "empty")
51545
+ return { kind: "empty" };
51546
+ // Distinct numeric singletons are disjoint sets.
51547
+ if (l.kind === "num" && r.kind === "num" && l.value !== r.value) {
51548
+ return { kind: "empty" };
51549
+ }
51550
+ // X & (... - X) → empty (subtrahend strips X out).
51551
+ if (subtractsTarget(rightCtx, leftCtx.text))
51552
+ return { kind: "empty" };
51553
+ if (subtractsTarget(leftCtx, rightCtx.text))
51554
+ return { kind: "empty" };
51555
+ // Arity mismatch → ill-typed.
51556
+ const la = ForgeExprStaticAnalyzer.arityOf(l);
51557
+ const ra = ForgeExprStaticAnalyzer.arityOf(r);
51558
+ if (la > 0 && ra > 0 && la !== ra) {
51559
+ return {
51560
+ kind: "ill-typed",
51561
+ reason: `arity mismatch in '&': left has arity ${la}, right has arity ${ra}`,
51562
+ };
51563
+ }
51564
+ // Schema-driven column-wise disjointness.
51565
+ if (this.schema && l.kind === "typed" && r.kind === "typed" && l.columnTypes && r.columnTypes) {
51566
+ if (l.columnTypes.length === r.columnTypes.length) {
51567
+ const anyDisjoint = l.columnTypes.some((lc, i) => this.schema.areDisjoint(lc, r.columnTypes[i]));
51568
+ if (anyDisjoint)
51569
+ return { kind: "empty" };
51570
+ }
51571
+ }
51572
+ return UNKNOWN;
51573
+ }
51574
+ return this.visitChildren(ctx);
51575
+ }
51576
+ visitExpr14(ctx) {
51577
+ if (ctx.LEFT_SQUARE_TOK()) {
51578
+ // Box join f[a, b, ...] ≡ ...b.a.f
51579
+ const fn = this.visit(ctx.expr14());
51580
+ if (fn.kind === "ill-typed")
51581
+ return fn;
51582
+ if (fn.kind === "empty")
51583
+ return { kind: "empty" };
51584
+ // walk the comma-separated argument list
51585
+ let list = ctx.exprList();
51586
+ while (list) {
51587
+ const arg = this.visit(list.expr());
51588
+ if (arg.kind === "ill-typed")
51589
+ return arg;
51590
+ if (arg.kind === "empty")
51591
+ return { kind: "empty" };
51592
+ list = list.exprList();
51593
+ }
51594
+ return UNKNOWN;
51595
+ }
51596
+ return this.visitChildren(ctx);
51597
+ }
51598
+ visitExpr15(ctx) {
51599
+ if (ctx.DOT_TOK()) {
51600
+ const l = this.visit(ctx.expr15());
51601
+ const r = this.visit(ctx.expr16());
51602
+ const bail = ForgeExprStaticAnalyzer.bailIfIllTyped(l, r);
51603
+ if (bail)
51604
+ return bail;
51605
+ if (l.kind === "empty" || r.kind === "empty")
51606
+ return { kind: "empty" };
51607
+ // Joining two singletons / unary expressions yields arity 0 — ill-typed.
51608
+ const la = ForgeExprStaticAnalyzer.arityOf(l);
51609
+ const ra = ForgeExprStaticAnalyzer.arityOf(r);
51610
+ if (la === 1 && ra === 1) {
51611
+ return {
51612
+ kind: "ill-typed",
51613
+ reason: "dot join of two unary expressions produces arity 0",
51614
+ };
51615
+ }
51616
+ // Schema-aware column-type check on the join boundary.
51617
+ if (this.schema &&
51618
+ l.kind === "typed" && r.kind === "typed" &&
51619
+ l.columnTypes && r.columnTypes &&
51620
+ l.columnTypes.length > 0 && r.columnTypes.length > 0) {
51621
+ const leftLast = l.columnTypes[l.columnTypes.length - 1];
51622
+ const rightFirst = r.columnTypes[0];
51623
+ if (this.schema.areDisjoint(leftLast, rightFirst)) {
51624
+ return { kind: "empty" };
51625
+ }
51626
+ // Propagate typed-ness through the join when possible.
51627
+ const newCols = [
51628
+ ...l.columnTypes.slice(0, -1),
51629
+ ...r.columnTypes.slice(1),
51630
+ ];
51631
+ if (newCols.length > 0) {
51632
+ return { kind: "typed", arity: newCols.length, columnTypes: newCols };
51633
+ }
51634
+ }
51635
+ // Otherwise propagate arity if we have it on both sides.
51636
+ if (la > 0 && ra > 0) {
51637
+ return { kind: "typed", arity: la + ra - 2 };
51638
+ }
51639
+ return UNKNOWN;
51640
+ }
51641
+ // name LEFT_SQUARE_TOK exprList RIGHT_SQUARE_TOK is a named pred call —
51642
+ // body unknown, so we can't fold even if args are empty.
51643
+ if (ctx.LEFT_SQUARE_TOK())
51644
+ return UNKNOWN;
51645
+ return this.visitChildren(ctx);
51646
+ }
51647
+ visitExpr17(ctx) {
51648
+ if (ctx.TILDE_TOK() || ctx.EXP_TOK()) {
51649
+ // transpose ~X and transitive closure ^X both preserve emptiness
51650
+ const inner = this.visit(ctx.expr17());
51651
+ if (inner.kind === "ill-typed")
51652
+ return inner;
51653
+ if (inner.kind === "empty")
51654
+ return { kind: "empty" };
51655
+ return UNKNOWN;
51656
+ }
51657
+ if (ctx.STAR_TOK()) {
51658
+ // reflexive transitive closure *X = iden ∪ ^X — *none = iden, which is
51659
+ // generally non-empty, so we cannot conclude empty here.
51660
+ return UNKNOWN;
51661
+ }
51662
+ if (ctx.GET_LABEL_TOK() ||
51663
+ ctx.GET_LABEL_STR_TOK() ||
51664
+ ctx.GET_LABEL_BOOL_TOK() ||
51665
+ ctx.GET_LABEL_NUM_TOK()) {
51666
+ // Label lookups depend on per-atom labels in the data instance.
51667
+ return UNKNOWN;
51668
+ }
51669
+ return this.visitChildren(ctx);
51670
+ }
51671
+ visitExpr18(ctx) {
51672
+ if (ctx.LEFT_PAREN_TOK()) {
51673
+ return this.visit(ctx.expr());
51674
+ }
51675
+ if (ctx.const()) {
51676
+ const c = ctx.const();
51677
+ if (c.NONE_TOK())
51678
+ return { kind: "empty" };
51679
+ if (c.number()) {
51680
+ const n = Number(c.number().text);
51681
+ const value = c.MINUS_TOK() ? -n : n;
51682
+ return { kind: "num", value };
51683
+ }
51684
+ // iden, univ are data-dependent
51685
+ return UNKNOWN;
51686
+ }
51687
+ if (ctx.qualName()) {
51688
+ // qualName resolves to either INT_TOK / SUM_TOK (data-dependent) or a
51689
+ // plain name — descend so visitName can fold `true` / `false`.
51690
+ return this.visit(ctx.qualName());
51691
+ }
51692
+ if (ctx.LEFT_CURLY_TOK()) {
51693
+ // Set comprehension `{x : S | body}` is empty if any quantified set is
51694
+ // empty, or if the body is statically false. We also enforce the
51695
+ // reserved-name policy here: under a schema, type/relation names cannot
51696
+ // be reused as binder variables.
51697
+ const declList = ctx.quantDeclList();
51698
+ const boundHere = new Set();
51699
+ if (declList) {
51700
+ let cur = declList;
51701
+ // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
51702
+ while (cur) {
51703
+ const setExpr = cur.quantDecl().expr();
51704
+ const v = this.visit(setExpr);
51705
+ if (v.kind === "empty")
51706
+ return { kind: "empty" };
51707
+ if (v.kind === "ill-typed")
51708
+ return v;
51709
+ this.collectNamesFromList(cur.quantDecl().nameList(), boundHere);
51710
+ const next = cur.quantDeclList();
51711
+ if (!next)
51712
+ break;
51713
+ cur = next;
51714
+ }
51715
+ }
51716
+ const reservedError = this.illTypedIfBindsReservedName(boundHere);
51717
+ if (reservedError)
51718
+ return reservedError;
51719
+ const blockOrBar = ctx.blockOrBar();
51720
+ if (blockOrBar && blockOrBar.BAR_TOK() && blockOrBar.expr()) {
51721
+ const body = this.visit(blockOrBar.expr());
51722
+ if (body.kind === "ill-typed")
51723
+ return body;
51724
+ if (body.kind === "bool" && !body.value)
51725
+ return { kind: "empty" };
51726
+ }
51727
+ return UNKNOWN;
51728
+ }
51729
+ if (ctx.block()) {
51730
+ return this.visit(ctx.block());
51731
+ }
51732
+ // sexpr, AT_TOK, BACKQUOTE_TOK, THIS_TOK — unsupported.
51733
+ return UNKNOWN;
51734
+ }
51735
+ // `true` / `false` are parsed as names rather than `const` literals — the
51736
+ // evaluator handles them in visitName, so we do the same. When a schema is
51737
+ // available, type and relation names resolve to `typed` with arity and
51738
+ // column types from the schema.
51739
+ visitName(ctx) {
51740
+ const id = (0, utils_1.getIdentifierName)(ctx);
51741
+ if (id === "true")
51742
+ return { kind: "bool", value: true };
51743
+ if (id === "false")
51744
+ return { kind: "bool", value: false };
51745
+ if (this.schema) {
51746
+ const t = this.schema.getType(id);
51747
+ if (t)
51748
+ return { kind: "typed", arity: 1, columnTypes: [t.id] };
51749
+ const r = this.schema.getRelation(id);
51750
+ if (r) {
51751
+ const cols = r.types;
51752
+ return { kind: "typed", arity: cols.length, columnTypes: cols };
51753
+ }
51754
+ }
51755
+ return UNKNOWN;
51756
+ }
51757
+ }
51758
+ exports.ForgeExprStaticAnalyzer = ForgeExprStaticAnalyzer;
51759
+
51760
+
50757
51761
  /***/ }),
50758
51762
 
50759
51763
  /***/ "./src/NumericConstraintOptimizer.ts":
@@ -51743,12 +52747,13 @@ ForgeLexer.OPTION_TOK = 104;
51743
52747
  ForgeLexer.COMMA_TOK = 105;
51744
52748
  ForgeLexer.SLASH_TOK = 106;
51745
52749
  ForgeLexer.NUM_CONST_TOK = 107;
51746
- ForgeLexer.IDENTIFIER_TOK = 108;
51747
- ForgeLexer.WS = 109;
51748
- ForgeLexer.CCOMMENT = 110;
51749
- ForgeLexer.COMMENT = 111;
51750
- ForgeLexer.MULTCOMMENT = 112;
51751
- ForgeLexer.LANG_DECL = 113;
52750
+ ForgeLexer.QUOTED_IDENTIFIER_TOK = 108;
52751
+ ForgeLexer.IDENTIFIER_TOK = 109;
52752
+ ForgeLexer.WS = 110;
52753
+ ForgeLexer.CCOMMENT = 111;
52754
+ ForgeLexer.COMMENT = 112;
52755
+ ForgeLexer.MULTCOMMENT = 113;
52756
+ ForgeLexer.LANG_DECL = 114;
51752
52757
  // tslint:disable:no-trailing-whitespace
51753
52758
  ForgeLexer.channelNames = [
51754
52759
  "DEFAULT_TOKEN_CHANNEL", "HIDDEN",
@@ -51776,8 +52781,8 @@ ForgeLexer.ruleNames = [
51776
52781
  "SEXPR_TOK", "INST_TOK", "EVAL_TOK", "EXAMPLE_TOK", "ARROW_TOK", "GET_LABEL_TOK",
51777
52782
  "GET_LABEL_STR_TOK", "GET_LABEL_BOOL_TOK", "GET_LABEL_NUM_TOK", "EQ_TOK",
51778
52783
  "LT_TOK", "GT_TOK", "LEQ_TOK", "GEQ_TOK", "NI_TOK", "NO_TOK", "SUM_TOK",
51779
- "INT_TOK", "OPTION_TOK", "COMMA_TOK", "SLASH_TOK", "NUM_CONST_TOK", "IDENTIFIER_TOK",
51780
- "WS", "CCOMMENT", "COMMENT", "MULTCOMMENT", "LANG_DECL",
52784
+ "INT_TOK", "OPTION_TOK", "COMMA_TOK", "SLASH_TOK", "NUM_CONST_TOK", "QUOTED_IDENTIFIER_TOK",
52785
+ "IDENTIFIER_TOK", "WS", "CCOMMENT", "COMMENT", "MULTCOMMENT", "LANG_DECL",
51781
52786
  ];
51782
52787
  ForgeLexer._LITERAL_NAMES = [
51783
52788
  undefined, "'open'", "'['", "']'", "'as'", undefined, "'var'", "'abstract'",
@@ -51815,12 +52820,12 @@ ForgeLexer._SYMBOLIC_NAMES = [
51815
52820
  "SEXPR_TOK", "INST_TOK", "EVAL_TOK", "EXAMPLE_TOK", "ARROW_TOK", "GET_LABEL_TOK",
51816
52821
  "GET_LABEL_STR_TOK", "GET_LABEL_BOOL_TOK", "GET_LABEL_NUM_TOK", "EQ_TOK",
51817
52822
  "LT_TOK", "GT_TOK", "LEQ_TOK", "GEQ_TOK", "NI_TOK", "NO_TOK", "SUM_TOK",
51818
- "INT_TOK", "OPTION_TOK", "COMMA_TOK", "SLASH_TOK", "NUM_CONST_TOK", "IDENTIFIER_TOK",
51819
- "WS", "CCOMMENT", "COMMENT", "MULTCOMMENT", "LANG_DECL",
52823
+ "INT_TOK", "OPTION_TOK", "COMMA_TOK", "SLASH_TOK", "NUM_CONST_TOK", "QUOTED_IDENTIFIER_TOK",
52824
+ "IDENTIFIER_TOK", "WS", "CCOMMENT", "COMMENT", "MULTCOMMENT", "LANG_DECL",
51820
52825
  ];
51821
52826
  ForgeLexer.VOCABULARY = new VocabularyImpl_1.VocabularyImpl(ForgeLexer._LITERAL_NAMES, ForgeLexer._SYMBOLIC_NAMES, []);
51822
52827
  ForgeLexer._serializedATNSegments = 2;
51823
- ForgeLexer._serializedATNSegment0 = "\x03\uC91D\uCABA\u058D\uAFBA\u4F53\u0607\uEA8B\uC241\x02s\u034B\b\x01" +
52828
+ ForgeLexer._serializedATNSegment0 = "\x03\uC91D\uCABA\u058D\uAFBA\u4F53\u0607\uEA8B\uC241\x02t\u0357\b\x01" +
51824
52829
  "\x04\x02\t\x02\x04\x03\t\x03\x04\x04\t\x04\x04\x05\t\x05\x04\x06\t\x06" +
51825
52830
  "\x04\x07\t\x07\x04\b\t\b\x04\t\t\t\x04\n\t\n\x04\v\t\v\x04\f\t\f\x04\r" +
51826
52831
  "\t\r\x04\x0E\t\x0E\x04\x0F\t\x0F\x04\x10\t\x10\x04\x11\t\x11\x04\x12\t" +
@@ -51836,56 +52841,57 @@ ForgeLexer._serializedATNSegment0 = "\x03\uC91D\uCABA\u058D\uAFBA\u4F53\u0607\uE
51836
52841
  "X\tX\x04Y\tY\x04Z\tZ\x04[\t[\x04\\\t\\\x04]\t]\x04^\t^\x04_\t_\x04`\t" +
51837
52842
  "`\x04a\ta\x04b\tb\x04c\tc\x04d\td\x04e\te\x04f\tf\x04g\tg\x04h\th\x04" +
51838
52843
  "i\ti\x04j\tj\x04k\tk\x04l\tl\x04m\tm\x04n\tn\x04o\to\x04p\tp\x04q\tq\x04" +
51839
- "r\tr\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x03\x03\x03\x03\x04\x03" +
51840
- "\x04\x03\x05\x03\x05\x03\x05\x03\x06\x03\x06\x03\x06\x03\x06\x07\x06\xF6" +
51841
- "\n\x06\f\x06\x0E\x06\xF9\v\x06\x03\x06\x03\x06\x03\x07\x03\x07\x03\x07" +
51842
- "\x03\x07\x03\b\x03\b\x03\b\x03\b\x03\b\x03\b\x03\b\x03\b\x03\b\x03\t\x03" +
51843
- "\t\x03\t\x03\t\x03\n\x03\n\x03\v\x03\v\x03\f\x03\f\x03\f\x03\f\x03\f\x03" +
51844
- "\f\x03\f\x03\f\x03\r\x03\r\x03\r\x03\x0E\x03\x0E\x03\x0F\x03\x0F\x03\x0F" +
51845
- "\x03\x0F\x03\x0F\x03\x10\x03\x10\x03\x10\x03\x10\x03\x10\x03\x11\x03\x11" +
51846
- "\x03\x11\x03\x11\x03\x12\x03\x12\x03\x12\x03\x12\x03\x13\x03\x13\x03\x13" +
51847
- "\x03\x13\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x15\x03\x15\x03\x15" +
51848
- "\x03\x15\x03\x15\x03\x15\x03\x16\x03\x16\x03\x16\x03\x16\x03\x16\x03\x17" +
51849
- "\x03\x17\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x19\x03\x19" +
51850
- "\x03\x19\x03\x19\x03\x19\x03\x1A\x03\x1A\x03\x1B\x03\x1B\x03\x1B\x03\x1B" +
51851
- "\x03\x1C\x03\x1C\x03\x1D\x03\x1D\x03\x1E\x03\x1E\x03\x1E\x03\x1E\x03\x1E" +
51852
- "\x03\x1E\x03\x1E\x03\x1F\x03\x1F\x03\x1F\x03\x1F\x03 \x03 \x03 \x03 \x03" +
51853
- " \x03 \x03!\x03!\x03!\x03!\x03\"\x03\"\x03\"\x03\"\x03#\x03#\x03#\x03" +
51854
- "#\x03#\x03#\x03#\x03#\x03$\x03$\x03$\x03$\x03$\x03%\x03%\x03%\x03%\x03" +
51855
- "%\x03&\x03&\x03&\x03&\x03&\x03\'\x03\'\x03(\x03(\x03(\x03)\x03)\x03)\x03" +
51856
- ")\x03*\x03*\x03*\x03*\x03*\x03*\x03+\x03+\x03+\x03+\x03+\x03+\x03+\x03" +
51857
- "+\x03,\x03,\x03,\x03,\x03,\x03,\x03,\x03,\x03,\x03,\x03,\x03,\x03-\x03" +
51858
- "-\x03-\x03-\x03-\x03-\x03-\x03-\x03.\x03.\x03.\x03.\x03.\x03/\x03/\x03" +
51859
- "/\x03/\x03/\x03/\x03/\x030\x030\x030\x030\x030\x030\x031\x031\x032\x03" +
51860
- "2\x032\x032\x033\x033\x033\x033\x033\x033\x033\x033\x033\x033\x033\x03" +
51861
- "4\x034\x034\x034\x034\x034\x034\x034\x034\x034\x035\x035\x035\x035\x03" +
51862
- "5\x035\x035\x035\x035\x035\x035\x036\x036\x036\x036\x036\x036\x036\x03" +
51863
- "6\x036\x036\x036\x036\x036\x037\x037\x037\x037\x037\x038\x038\x038\x03" +
51864
- "8\x039\x039\x039\x039\x039\x03:\x03:\x03:\x03:\x05:\u020E\n:\x03;\x03" +
51865
- ";\x03;\x03;\x03<\x03<\x03<\x03<\x03<\x03<\x05<\u021A\n<\x03=\x03=\x03" +
51866
- "=\x03=\x03=\x03=\x03=\x03=\x03=\x05=\u0225\n=\x03>\x03>\x03>\x03>\x03" +
51867
- ">\x03?\x03?\x03?\x03?\x03?\x05?\u0231\n?\x03@\x03@\x03@\x03@\x03@\x03" +
51868
- "@\x03A\x03A\x03A\x03A\x03A\x03A\x03A\x03A\x03B\x03B\x03B\x03B\x03B\x03" +
51869
- "B\x03C\x03C\x03C\x03C\x03C\x03C\x03C\x03C\x03C\x03C\x03D\x03D\x03D\x03" +
51870
- "D\x05D\u0255\nD\x03E\x03E\x03E\x03E\x03E\x03E\x03E\x03F\x03F\x03F\x03" +
51871
- "F\x03F\x03F\x03F\x03F\x03F\x03F\x03F\x03G\x03G\x03G\x03G\x03G\x03G\x03" +
51872
- "H\x03H\x03H\x03H\x03H\x03H\x03H\x03I\x03I\x03I\x03I\x03I\x03J\x03J\x03" +
51873
- "J\x03J\x03J\x03J\x03J\x03J\x03J\x03J\x03J\x03J\x03J\x03K\x03K\x03L\x03" +
51874
- "L\x03L\x03M\x03M\x03N\x03N\x03N\x03O\x03O\x03O\x03P\x03P\x03Q\x03Q\x03" +
51875
- "R\x03R\x03S\x03S\x03T\x03T\x03U\x03U\x03V\x03V\x03V\x03V\x03V\x03W\x03" +
51876
- "W\x03W\x03W\x03W\x03W\x03X\x03X\x03X\x03X\x03X\x03Y\x03Y\x03Y\x03Y\x03" +
51877
- "Y\x03Z\x03Z\x03Z\x03Z\x03Z\x03Z\x03Z\x03Z\x03[\x03[\x03[\x03\\\x03\\\x03" +
51878
- "\\\x03]\x03]\x03]\x03]\x03]\x03]\x03^\x03^\x03^\x03^\x03^\x03^\x03^\x03" +
51879
- "_\x03_\x03_\x03_\x03_\x03_\x03`\x03`\x03a\x03a\x03b\x03b\x03c\x03c\x03" +
51880
- "c\x03c\x05c\u02E1\nc\x03d\x03d\x03d\x03e\x03e\x03e\x03f\x03f\x03f\x03" +
51881
- "g\x03g\x03g\x03g\x03h\x03h\x03h\x03h\x03i\x03i\x03i\x03i\x03i\x03i\x03" +
51882
- "i\x03j\x03j\x03k\x03k\x03l\x06l\u0300\nl\rl\x0El\u0301\x03l\x03l\x06l" +
51883
- "\u0306\nl\rl\x0El\u0307\x05l\u030A\nl\x03m\x03m\x07m\u030E\nm\fm\x0Em" +
51884
- "\u0311\vm\x03n\x06n\u0314\nn\rn\x0En\u0315\x03n\x03n\x03o\x03o\x03o\x03" +
51885
- "o\x07o\u031E\no\fo\x0Eo\u0321\vo\x03o\x03o\x03p\x03p\x03p\x03p\x07p\u0329" +
51886
- "\np\fp\x0Ep\u032C\vp\x03p\x03p\x03q\x03q\x03q\x03q\x07q\u0334\nq\fq\x0E" +
51887
- "q\u0337\vq\x03q\x03q\x03q\x03q\x03q\x03r\x03r\x03r\x03r\x03r\x03r\x03" +
51888
- "r\x07r\u0345\nr\fr\x0Er\u0348\vr\x03r\x03r\x03\u0335\x02\x02s\x03\x02" +
52844
+ "r\tr\x04s\ts\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x03\x03\x03\x03" +
52845
+ "\x04\x03\x04\x03\x05\x03\x05\x03\x05\x03\x06\x03\x06\x03\x06\x03\x06\x07" +
52846
+ "\x06\xF8\n\x06\f\x06\x0E\x06\xFB\v\x06\x03\x06\x03\x06\x03\x07\x03\x07" +
52847
+ "\x03\x07\x03\x07\x03\b\x03\b\x03\b\x03\b\x03\b\x03\b\x03\b\x03\b\x03\b" +
52848
+ "\x03\t\x03\t\x03\t\x03\t\x03\n\x03\n\x03\v\x03\v\x03\f\x03\f\x03\f\x03" +
52849
+ "\f\x03\f\x03\f\x03\f\x03\f\x03\r\x03\r\x03\r\x03\x0E\x03\x0E\x03\x0F\x03" +
52850
+ "\x0F\x03\x0F\x03\x0F\x03\x0F\x03\x10\x03\x10\x03\x10\x03\x10\x03\x10\x03" +
52851
+ "\x11\x03\x11\x03\x11\x03\x11\x03\x12\x03\x12\x03\x12\x03\x12\x03\x13\x03" +
52852
+ "\x13\x03\x13\x03\x13\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x15\x03" +
52853
+ "\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x16\x03\x16\x03\x16\x03\x16\x03" +
52854
+ "\x16\x03\x17\x03\x17\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03" +
52855
+ "\x19\x03\x19\x03\x19\x03\x19\x03\x19\x03\x1A\x03\x1A\x03\x1B\x03\x1B\x03" +
52856
+ "\x1B\x03\x1B\x03\x1C\x03\x1C\x03\x1D\x03\x1D\x03\x1E\x03\x1E\x03\x1E\x03" +
52857
+ "\x1E\x03\x1E\x03\x1E\x03\x1E\x03\x1F\x03\x1F\x03\x1F\x03\x1F\x03 \x03" +
52858
+ " \x03 \x03 \x03 \x03 \x03!\x03!\x03!\x03!\x03\"\x03\"\x03\"\x03\"\x03" +
52859
+ "#\x03#\x03#\x03#\x03#\x03#\x03#\x03#\x03$\x03$\x03$\x03$\x03$\x03%\x03" +
52860
+ "%\x03%\x03%\x03%\x03&\x03&\x03&\x03&\x03&\x03\'\x03\'\x03(\x03(\x03(\x03" +
52861
+ ")\x03)\x03)\x03)\x03*\x03*\x03*\x03*\x03*\x03*\x03+\x03+\x03+\x03+\x03" +
52862
+ "+\x03+\x03+\x03+\x03,\x03,\x03,\x03,\x03,\x03,\x03,\x03,\x03,\x03,\x03" +
52863
+ ",\x03,\x03-\x03-\x03-\x03-\x03-\x03-\x03-\x03-\x03.\x03.\x03.\x03.\x03" +
52864
+ ".\x03/\x03/\x03/\x03/\x03/\x03/\x03/\x030\x030\x030\x030\x030\x030\x03" +
52865
+ "1\x031\x032\x032\x032\x032\x033\x033\x033\x033\x033\x033\x033\x033\x03" +
52866
+ "3\x033\x033\x034\x034\x034\x034\x034\x034\x034\x034\x034\x034\x035\x03" +
52867
+ "5\x035\x035\x035\x035\x035\x035\x035\x035\x035\x036\x036\x036\x036\x03" +
52868
+ "6\x036\x036\x036\x036\x036\x036\x036\x036\x037\x037\x037\x037\x037\x03" +
52869
+ "8\x038\x038\x038\x039\x039\x039\x039\x039\x03:\x03:\x03:\x03:\x05:\u0210" +
52870
+ "\n:\x03;\x03;\x03;\x03;\x03<\x03<\x03<\x03<\x03<\x03<\x05<\u021C\n<\x03" +
52871
+ "=\x03=\x03=\x03=\x03=\x03=\x03=\x03=\x03=\x05=\u0227\n=\x03>\x03>\x03" +
52872
+ ">\x03>\x03>\x03?\x03?\x03?\x03?\x03?\x05?\u0233\n?\x03@\x03@\x03@\x03" +
52873
+ "@\x03@\x03@\x03A\x03A\x03A\x03A\x03A\x03A\x03A\x03A\x03B\x03B\x03B\x03" +
52874
+ "B\x03B\x03B\x03C\x03C\x03C\x03C\x03C\x03C\x03C\x03C\x03C\x03C\x03D\x03" +
52875
+ "D\x03D\x03D\x05D\u0257\nD\x03E\x03E\x03E\x03E\x03E\x03E\x03E\x03F\x03" +
52876
+ "F\x03F\x03F\x03F\x03F\x03F\x03F\x03F\x03F\x03F\x03G\x03G\x03G\x03G\x03" +
52877
+ "G\x03G\x03H\x03H\x03H\x03H\x03H\x03H\x03H\x03I\x03I\x03I\x03I\x03I\x03" +
52878
+ "J\x03J\x03J\x03J\x03J\x03J\x03J\x03J\x03J\x03J\x03J\x03J\x03J\x03K\x03" +
52879
+ "K\x03L\x03L\x03L\x03M\x03M\x03N\x03N\x03N\x03O\x03O\x03O\x03P\x03P\x03" +
52880
+ "Q\x03Q\x03R\x03R\x03S\x03S\x03T\x03T\x03U\x03U\x03V\x03V\x03V\x03V\x03" +
52881
+ "V\x03W\x03W\x03W\x03W\x03W\x03W\x03X\x03X\x03X\x03X\x03X\x03Y\x03Y\x03" +
52882
+ "Y\x03Y\x03Y\x03Z\x03Z\x03Z\x03Z\x03Z\x03Z\x03Z\x03Z\x03[\x03[\x03[\x03" +
52883
+ "\\\x03\\\x03\\\x03]\x03]\x03]\x03]\x03]\x03]\x03^\x03^\x03^\x03^\x03^" +
52884
+ "\x03^\x03^\x03_\x03_\x03_\x03_\x03_\x03_\x03`\x03`\x03a\x03a\x03b\x03" +
52885
+ "b\x03c\x03c\x03c\x03c\x05c\u02E3\nc\x03d\x03d\x03d\x03e\x03e\x03e\x03" +
52886
+ "f\x03f\x03f\x03g\x03g\x03g\x03g\x03h\x03h\x03h\x03h\x03i\x03i\x03i\x03" +
52887
+ "i\x03i\x03i\x03i\x03j\x03j\x03k\x03k\x03l\x06l\u0302\nl\rl\x0El\u0303" +
52888
+ "\x03l\x03l\x06l\u0308\nl\rl\x0El\u0309\x05l\u030C\nl\x03m\x03m\x03m\x03" +
52889
+ "m\x06m\u0312\nm\rm\x0Em\u0313\x03m\x03m\x03n\x03n\x07n\u031A\nn\fn\x0E" +
52890
+ "n\u031D\vn\x03o\x06o\u0320\no\ro\x0Eo\u0321\x03o\x03o\x03p\x03p\x03p\x03" +
52891
+ "p\x07p\u032A\np\fp\x0Ep\u032D\vp\x03p\x03p\x03q\x03q\x03q\x03q\x07q\u0335" +
52892
+ "\nq\fq\x0Eq\u0338\vq\x03q\x03q\x03r\x03r\x03r\x03r\x07r\u0340\nr\fr\x0E" +
52893
+ "r\u0343\vr\x03r\x03r\x03r\x03r\x03r\x03s\x03s\x03s\x03s\x03s\x03s\x03" +
52894
+ "s\x07s\u0351\ns\fs\x0Es\u0354\vs\x03s\x03s\x03\u0341\x02\x02t\x03\x02" +
51889
52895
  "\x03\x05\x02\x04\x07\x02\x05\t\x02\x06\v\x02\x07\r\x02\b\x0F\x02\t\x11" +
51890
52896
  "\x02\n\x13\x02\v\x15\x02\f\x17\x02\r\x19\x02\x0E\x1B\x02\x0F\x1D\x02\x10" +
51891
52897
  "\x1F\x02\x11!\x02\x12#\x02\x13%\x02\x14\'\x02\x15)\x02\x16+\x02\x17-\x02" +
@@ -51899,311 +52905,316 @@ ForgeLexer._serializedATNSegment0 = "\x03\uC91D\uCABA\u058D\uAFBA\u4F53\u0607\uE
51899
52905
  "Z\xB3\x02[\xB5\x02\\\xB7\x02]\xB9\x02^\xBB\x02_\xBD\x02`\xBF\x02a\xC1" +
51900
52906
  "\x02b\xC3\x02c\xC5\x02d\xC7\x02e\xC9\x02f\xCB\x02g\xCD\x02h\xCF\x02i\xD1" +
51901
52907
  "\x02j\xD3\x02k\xD5\x02l\xD7\x02m\xD9\x02n\xDB\x02o\xDD\x02p\xDF\x02q\xE1" +
51902
- "\x02r\xE3\x02s\x03\x02\b\x04\x02$$^^\x03\x022;\x07\x02&&11C\\aac|\x07" +
51903
- "\x02&&1;C\\aac|\x05\x02\v\f\x0F\x0F\"\"\x04\x02\f\f\x0F\x0F\x02\u035B" +
51904
- "\x02\x03\x03\x02\x02\x02\x02\x05\x03\x02\x02\x02\x02\x07\x03\x02\x02\x02" +
51905
- "\x02\t\x03\x02\x02\x02\x02\v\x03\x02\x02\x02\x02\r\x03\x02\x02\x02\x02" +
51906
- "\x0F\x03\x02\x02\x02\x02\x11\x03\x02\x02\x02\x02\x13\x03\x02\x02\x02\x02" +
51907
- "\x15\x03\x02\x02\x02\x02\x17\x03\x02\x02\x02\x02\x19\x03\x02\x02\x02\x02" +
51908
- "\x1B\x03\x02\x02\x02\x02\x1D\x03\x02\x02\x02\x02\x1F\x03\x02\x02\x02\x02" +
51909
- "!\x03\x02\x02\x02\x02#\x03\x02\x02\x02\x02%\x03\x02\x02\x02\x02\'\x03" +
51910
- "\x02\x02\x02\x02)\x03\x02\x02\x02\x02+\x03\x02\x02\x02\x02-\x03\x02\x02" +
51911
- "\x02\x02/\x03\x02\x02\x02\x021\x03\x02\x02\x02\x023\x03\x02\x02\x02\x02" +
51912
- "5\x03\x02\x02\x02\x027\x03\x02\x02\x02\x029\x03\x02\x02\x02\x02;\x03\x02" +
51913
- "\x02\x02\x02=\x03\x02\x02\x02\x02?\x03\x02\x02\x02\x02A\x03\x02\x02\x02" +
51914
- "\x02C\x03\x02\x02\x02\x02E\x03\x02\x02\x02\x02G\x03\x02\x02\x02\x02I\x03" +
51915
- "\x02\x02\x02\x02K\x03\x02\x02\x02\x02M\x03\x02\x02\x02\x02O\x03\x02\x02" +
51916
- "\x02\x02Q\x03\x02\x02\x02\x02S\x03\x02\x02\x02\x02U\x03\x02\x02\x02\x02" +
51917
- "W\x03\x02\x02\x02\x02Y\x03\x02\x02\x02\x02[\x03\x02\x02\x02\x02]\x03\x02" +
51918
- "\x02\x02\x02_\x03\x02\x02\x02\x02a\x03\x02\x02\x02\x02c\x03\x02\x02\x02" +
51919
- "\x02e\x03\x02\x02\x02\x02g\x03\x02\x02\x02\x02i\x03\x02\x02\x02\x02k\x03" +
51920
- "\x02\x02\x02\x02m\x03\x02\x02\x02\x02o\x03\x02\x02\x02\x02q\x03\x02\x02" +
51921
- "\x02\x02s\x03\x02\x02\x02\x02u\x03\x02\x02\x02\x02w\x03\x02\x02\x02\x02" +
51922
- "y\x03\x02\x02\x02\x02{\x03\x02\x02\x02\x02}\x03\x02\x02\x02\x02\x7F\x03" +
51923
- "\x02\x02\x02\x02\x81\x03\x02\x02\x02\x02\x83\x03\x02\x02\x02\x02\x85\x03" +
51924
- "\x02\x02\x02\x02\x87\x03\x02\x02\x02\x02\x89\x03\x02\x02\x02\x02\x8B\x03" +
51925
- "\x02\x02\x02\x02\x8D\x03\x02\x02\x02\x02\x8F\x03\x02\x02\x02\x02\x91\x03" +
51926
- "\x02\x02\x02\x02\x93\x03\x02\x02\x02\x02\x95\x03\x02\x02\x02\x02\x97\x03" +
51927
- "\x02\x02\x02\x02\x99\x03\x02\x02\x02\x02\x9B\x03\x02\x02\x02\x02\x9D\x03" +
51928
- "\x02\x02\x02\x02\x9F\x03\x02\x02\x02\x02\xA1\x03\x02\x02\x02\x02\xA3\x03" +
51929
- "\x02\x02\x02\x02\xA5\x03\x02\x02\x02\x02\xA7\x03\x02\x02\x02\x02\xA9\x03" +
51930
- "\x02\x02\x02\x02\xAB\x03\x02\x02\x02\x02\xAD\x03\x02\x02\x02\x02\xAF\x03" +
51931
- "\x02\x02\x02\x02\xB1\x03\x02\x02\x02\x02\xB3\x03\x02\x02\x02\x02\xB5\x03" +
51932
- "\x02\x02\x02\x02\xB7\x03\x02\x02\x02\x02\xB9\x03\x02\x02\x02\x02\xBB\x03" +
51933
- "\x02\x02\x02\x02\xBD\x03\x02\x02\x02\x02\xBF\x03\x02\x02\x02\x02\xC1\x03" +
51934
- "\x02\x02\x02\x02\xC3\x03\x02\x02\x02\x02\xC5\x03\x02\x02\x02\x02\xC7\x03" +
51935
- "\x02\x02\x02\x02\xC9\x03\x02\x02\x02\x02\xCB\x03\x02\x02\x02\x02\xCD\x03" +
51936
- "\x02\x02\x02\x02\xCF\x03\x02\x02\x02\x02\xD1\x03\x02\x02\x02\x02\xD3\x03" +
51937
- "\x02\x02\x02\x02\xD5\x03\x02\x02\x02\x02\xD7\x03\x02\x02\x02\x02\xD9\x03" +
51938
- "\x02\x02\x02\x02\xDB\x03\x02\x02\x02\x02\xDD\x03\x02\x02\x02\x02\xDF\x03" +
51939
- "\x02\x02\x02\x02\xE1\x03\x02\x02\x02\x02\xE3\x03\x02\x02\x02\x03\xE5\x03" +
51940
- "\x02\x02\x02\x05\xEA\x03\x02\x02\x02\x07\xEC\x03\x02\x02\x02\t\xEE\x03" +
51941
- "\x02\x02\x02\v\xF1\x03\x02\x02\x02\r\xFC\x03\x02\x02\x02\x0F\u0100\x03" +
51942
- "\x02\x02\x02\x11\u0109\x03\x02\x02\x02\x13\u010D\x03\x02\x02\x02\x15\u010F" +
51943
- "\x03\x02\x02\x02\x17\u0111\x03\x02\x02\x02\x19\u0119\x03\x02\x02\x02\x1B" +
51944
- "\u011C\x03\x02\x02\x02\x1D\u011E\x03\x02\x02\x02\x1F\u0123\x03\x02\x02" +
51945
- "\x02!\u0128\x03\x02\x02\x02#\u012C\x03\x02\x02\x02%\u0130\x03\x02\x02" +
51946
- "\x02\'\u0134\x03\x02\x02\x02)\u0139\x03\x02\x02\x02+\u013F\x03\x02\x02" +
51947
- "\x02-\u0144\x03\x02\x02\x02/\u0146\x03\x02\x02\x021\u014C\x03\x02\x02" +
51948
- "\x023\u0151\x03\x02\x02\x025\u0153\x03\x02\x02\x027\u0157\x03\x02\x02" +
51949
- "\x029\u0159\x03\x02\x02\x02;\u015B\x03\x02\x02\x02=\u0162\x03\x02\x02" +
51950
- "\x02?\u0166\x03\x02\x02\x02A\u016C\x03\x02\x02\x02C\u0170\x03\x02\x02" +
51951
- "\x02E\u0174\x03\x02\x02\x02G\u017C\x03\x02\x02\x02I\u0181\x03\x02\x02" +
51952
- "\x02K\u0186\x03\x02\x02\x02M\u018B\x03\x02\x02\x02O\u018D\x03\x02\x02" +
51953
- "\x02Q\u0190\x03\x02\x02\x02S\u0194\x03\x02\x02\x02U\u019A\x03\x02\x02" +
51954
- "\x02W\u01A2\x03\x02\x02\x02Y\u01AE\x03\x02\x02\x02[\u01B6\x03\x02\x02" +
51955
- "\x02]\u01BB\x03\x02\x02\x02_\u01C2\x03\x02\x02\x02a\u01C8\x03\x02\x02" +
51956
- "\x02c\u01CA\x03\x02\x02\x02e\u01CE\x03\x02\x02\x02g\u01D9\x03\x02\x02" +
51957
- "\x02i\u01E3\x03\x02\x02\x02k\u01EE\x03\x02\x02\x02m\u01FB\x03\x02\x02" +
51958
- "\x02o\u0200\x03\x02\x02\x02q\u0204\x03\x02\x02\x02s\u020D\x03\x02\x02" +
51959
- "\x02u\u020F\x03\x02\x02\x02w\u0219\x03\x02\x02\x02y\u0224\x03\x02\x02" +
51960
- "\x02{\u0226\x03\x02\x02\x02}\u0230\x03\x02\x02\x02\x7F\u0232\x03\x02\x02" +
51961
- "\x02\x81\u0238\x03\x02\x02\x02\x83\u0240\x03\x02\x02\x02\x85\u0246\x03" +
51962
- "\x02\x02\x02\x87\u0254\x03\x02\x02\x02\x89\u0256\x03\x02\x02\x02\x8B\u025D" +
51963
- "\x03\x02\x02\x02\x8D\u0268\x03\x02\x02\x02\x8F\u026E\x03\x02\x02\x02\x91" +
51964
- "\u0275\x03\x02\x02\x02\x93\u027A\x03\x02\x02\x02\x95\u0287\x03\x02\x02" +
51965
- "\x02\x97\u0289\x03\x02\x02\x02\x99\u028C\x03\x02\x02\x02\x9B\u028E\x03" +
51966
- "\x02\x02\x02\x9D\u0291\x03\x02\x02\x02\x9F\u0294\x03\x02\x02\x02\xA1\u0296" +
51967
- "\x03\x02\x02\x02\xA3\u0298\x03\x02\x02\x02\xA5\u029A\x03\x02\x02\x02\xA7" +
51968
- "\u029C\x03\x02\x02\x02\xA9\u029E\x03\x02\x02\x02\xAB\u02A0\x03\x02\x02" +
51969
- "\x02\xAD\u02A5\x03\x02\x02\x02\xAF\u02AB\x03\x02\x02\x02\xB1\u02B0\x03" +
51970
- "\x02\x02\x02\xB3\u02B5\x03\x02\x02\x02\xB5\u02BD\x03\x02\x02\x02\xB7\u02C0" +
51971
- "\x03\x02\x02\x02\xB9\u02C3\x03\x02\x02\x02\xBB\u02C9\x03\x02\x02\x02\xBD" +
51972
- "\u02D0\x03\x02\x02\x02\xBF\u02D6\x03\x02\x02\x02\xC1\u02D8\x03\x02\x02" +
51973
- "\x02\xC3\u02DA\x03\x02\x02\x02\xC5\u02E0\x03\x02\x02\x02\xC7\u02E2\x03" +
51974
- "\x02\x02\x02\xC9\u02E5\x03\x02\x02\x02\xCB\u02E8\x03\x02\x02\x02\xCD\u02EB" +
51975
- "\x03\x02\x02\x02\xCF\u02EF\x03\x02\x02\x02\xD1\u02F3\x03\x02\x02\x02\xD3" +
51976
- "\u02FA\x03\x02\x02\x02\xD5\u02FC\x03\x02\x02\x02\xD7\u02FF\x03\x02\x02" +
51977
- "\x02\xD9\u030B\x03\x02\x02\x02\xDB\u0313\x03\x02\x02\x02\xDD\u0319\x03" +
51978
- "\x02\x02\x02\xDF\u0324\x03\x02\x02\x02\xE1\u032F\x03\x02\x02\x02\xE3\u033D" +
51979
- "\x03\x02\x02\x02\xE5\xE6\x07q\x02\x02\xE6\xE7\x07r\x02\x02\xE7\xE8\x07" +
51980
- "g\x02\x02\xE8\xE9\x07p\x02\x02\xE9\x04\x03\x02\x02\x02\xEA\xEB\x07]\x02" +
51981
- "\x02\xEB\x06\x03\x02\x02\x02\xEC\xED\x07_\x02\x02\xED\b\x03\x02\x02\x02" +
51982
- "\xEE\xEF\x07c\x02\x02\xEF\xF0\x07u\x02\x02\xF0\n\x03\x02\x02\x02\xF1\xF7" +
51983
- "\x07$\x02\x02\xF2\xF6\n\x02\x02\x02\xF3\xF4\x07^\x02\x02\xF4\xF6\v\x02" +
51984
- "\x02\x02\xF5\xF2\x03\x02\x02\x02\xF5\xF3\x03\x02\x02\x02\xF6\xF9\x03\x02" +
51985
- "\x02\x02\xF7\xF5\x03\x02\x02\x02\xF7\xF8\x03\x02\x02\x02\xF8\xFA\x03\x02" +
51986
- "\x02\x02\xF9\xF7\x03\x02\x02\x02\xFA\xFB\x07$\x02\x02\xFB\f\x03\x02\x02" +
51987
- "\x02\xFC\xFD\x07x\x02\x02\xFD\xFE\x07c\x02\x02\xFE\xFF\x07t\x02\x02\xFF" +
51988
- "\x0E\x03\x02\x02\x02\u0100\u0101\x07c\x02\x02\u0101\u0102\x07d\x02\x02" +
51989
- "\u0102\u0103\x07u\x02\x02\u0103\u0104\x07v\x02\x02\u0104\u0105\x07t\x02" +
51990
- "\x02\u0105\u0106\x07c\x02\x02\u0106\u0107\x07e\x02\x02\u0107\u0108\x07" +
51991
- "v\x02\x02\u0108\x10\x03\x02\x02\x02\u0109\u010A\x07u\x02\x02\u010A\u010B" +
51992
- "\x07k\x02\x02\u010B\u010C\x07i\x02\x02\u010C\x12\x03\x02\x02\x02\u010D" +
51993
- "\u010E\x07}\x02\x02\u010E\x14\x03\x02\x02\x02\u010F\u0110\x07\x7F\x02" +
51994
- "\x02\u0110\x16\x03\x02\x02\x02\u0111\u0112\x07g\x02\x02\u0112\u0113\x07" +
51995
- "z\x02\x02\u0113\u0114\x07v\x02\x02\u0114\u0115\x07g\x02\x02\u0115\u0116" +
51996
- "\x07p\x02\x02\u0116\u0117\x07f\x02\x02\u0117\u0118\x07u\x02\x02\u0118" +
51997
- "\x18\x03\x02\x02\x02\u0119\u011A\x07k\x02\x02\u011A\u011B\x07p\x02\x02" +
51998
- "\u011B\x1A\x03\x02\x02\x02\u011C\u011D\x07-\x02\x02\u011D\x1C\x03\x02" +
51999
- "\x02\x02\u011E\u011F\x07n\x02\x02\u011F\u0120\x07q\x02\x02\u0120\u0121" +
52000
- "\x07p\x02\x02\u0121\u0122\x07g\x02\x02\u0122\x1E\x03\x02\x02\x02\u0123" +
52001
- "\u0124\x07u\x02\x02\u0124\u0125\x07q\x02\x02\u0125\u0126\x07o\x02\x02" +
52002
- "\u0126\u0127\x07g\x02\x02\u0127 \x03\x02\x02\x02\u0128\u0129\x07q\x02" +
52003
- "\x02\u0129\u012A\x07p\x02\x02\u012A\u012B\x07g\x02\x02\u012B\"\x03\x02" +
52004
- "\x02\x02\u012C\u012D\x07v\x02\x02\u012D\u012E\x07y\x02\x02\u012E\u012F" +
52005
- "\x07q\x02\x02\u012F$\x03\x02\x02\x02\u0130\u0131\x07u\x02\x02\u0131\u0132" +
52006
- "\x07g\x02\x02\u0132\u0133\x07v\x02\x02\u0133&\x03\x02\x02\x02\u0134\u0135" +
52007
- "\x07h\x02\x02\u0135\u0136\x07w\x02\x02\u0136\u0137\x07p\x02\x02\u0137" +
52008
- "\u0138\x07e\x02\x02\u0138(\x03\x02\x02\x02\u0139\u013A\x07r\x02\x02\u013A" +
52009
- "\u013B\x07h\x02\x02\u013B\u013C\x07w\x02\x02\u013C\u013D\x07p\x02\x02" +
52010
- "\u013D\u013E\x07e\x02\x02\u013E*\x03\x02\x02\x02\u013F\u0140\x07f\x02" +
52011
- "\x02\u0140\u0141\x07k\x02\x02\u0141\u0142\x07u\x02\x02\u0142\u0143\x07" +
52012
- "l\x02\x02\u0143,\x03\x02\x02\x02\u0144\u0145\x07<\x02\x02\u0145.\x03\x02" +
52013
- "\x02\x02\u0146\u0147\x07y\x02\x02\u0147\u0148\x07j\x02\x02\u0148\u0149" +
52014
- "\x07g\x02\x02\u0149\u014A\x07c\x02\x02\u014A\u014B\x07v\x02\x02\u014B" +
52015
- "0\x03\x02\x02\x02\u014C\u014D\x07r\x02\x02\u014D\u014E\x07t\x02\x02\u014E" +
52016
- "\u014F\x07g\x02\x02\u014F\u0150\x07f\x02\x02\u01502\x03\x02\x02\x02\u0151" +
52017
- "\u0152\x070\x02\x02\u01524\x03\x02\x02\x02\u0153\u0154\x07h\x02\x02\u0154" +
52018
- "\u0155\x07w\x02\x02\u0155\u0156\x07p\x02\x02\u01566\x03\x02\x02\x02\u0157" +
52019
- "\u0158\x07*\x02\x02\u01588\x03\x02\x02\x02\u0159\u015A\x07+\x02\x02\u015A" +
52020
- ":\x03\x02\x02\x02\u015B\u015C\x07c\x02\x02\u015C\u015D\x07u\x02\x02\u015D" +
52021
- "\u015E\x07u\x02\x02\u015E\u015F\x07g\x02\x02\u015F\u0160\x07t\x02\x02" +
52022
- "\u0160\u0161\x07v\x02\x02\u0161<\x03\x02\x02\x02\u0162\u0163\x07t\x02" +
52023
- "\x02\u0163\u0164\x07w\x02\x02\u0164\u0165\x07p\x02\x02\u0165>\x03\x02" +
52024
- "\x02\x02\u0166\u0167\x07e\x02\x02\u0167\u0168\x07j\x02\x02\u0168\u0169" +
52025
- "\x07g\x02\x02\u0169\u016A\x07e\x02\x02\u016A\u016B\x07m\x02\x02\u016B" +
52026
- "@\x03\x02\x02\x02\u016C\u016D\x07h\x02\x02\u016D\u016E\x07q\x02\x02\u016E" +
52027
- "\u016F\x07t\x02\x02\u016FB\x03\x02\x02\x02\u0170\u0171\x07d\x02\x02\u0171" +
52028
- "\u0172\x07w\x02\x02\u0172\u0173\x07v\x02\x02\u0173D\x03\x02\x02\x02\u0174" +
52029
- "\u0175\x07g\x02\x02\u0175\u0176\x07z\x02\x02\u0176\u0177\x07c\x02\x02" +
52030
- "\u0177\u0178\x07e\x02\x02\u0178\u0179\x07v\x02\x02\u0179\u017A\x07n\x02" +
52031
- "\x02\u017A\u017B\x07{\x02\x02\u017BF\x03\x02\x02\x02\u017C\u017D\x07p" +
52032
- "\x02\x02\u017D\u017E\x07q\x02\x02\u017E\u017F\x07p\x02\x02\u017F\u0180" +
52033
- "\x07g\x02\x02\u0180H\x03\x02\x02\x02\u0181\u0182\x07w\x02\x02\u0182\u0183" +
52034
- "\x07p\x02\x02\u0183\u0184\x07k\x02\x02\u0184\u0185\x07x\x02\x02\u0185" +
52035
- "J\x03\x02\x02\x02\u0186\u0187\x07k\x02\x02\u0187\u0188\x07f\x02\x02\u0188" +
52036
- "\u0189\x07g\x02\x02\u0189\u018A\x07p\x02\x02\u018AL\x03\x02\x02\x02\u018B" +
52037
- "\u018C\x07/\x02\x02\u018CN\x03\x02\x02\x02\u018D\u018E\x07k\x02\x02\u018E" +
52038
- "\u018F\x07u\x02\x02\u018FP\x03\x02\x02\x02\u0190\u0191\x07u\x02\x02\u0191" +
52039
- "\u0192\x07c\x02\x02\u0192\u0193\x07v\x02\x02\u0193R\x03\x02\x02\x02\u0194" +
52040
- "\u0195\x07w\x02\x02\u0195\u0196\x07p\x02\x02\u0196\u0197\x07u\x02\x02" +
52041
- "\u0197\u0198\x07c\x02\x02\u0198\u0199\x07v\x02\x02\u0199T\x03\x02\x02" +
52042
- "\x02\u019A\u019B\x07v\x02\x02\u019B\u019C\x07j\x02\x02\u019C\u019D\x07" +
52043
- "g\x02\x02\u019D\u019E\x07q\x02\x02\u019E\u019F\x07t\x02\x02\u019F\u01A0" +
52044
- "\x07g\x02\x02\u01A0\u01A1\x07o\x02\x02\u01A1V\x03\x02\x02\x02\u01A2\u01A3" +
52045
- "\x07h\x02\x02\u01A3\u01A4\x07q\x02\x02\u01A4\u01A5\x07t\x02\x02\u01A5" +
52046
- "\u01A6\x07i\x02\x02\u01A6\u01A7\x07g\x02\x02\u01A7\u01A8\x07a\x02\x02" +
52047
- "\u01A8\u01A9\x07g\x02\x02\u01A9\u01AA\x07t\x02\x02\u01AA\u01AB\x07t\x02" +
52048
- "\x02\u01AB\u01AC\x07q\x02\x02\u01AC\u01AD\x07t\x02\x02\u01ADX\x03\x02" +
52049
- "\x02\x02\u01AE\u01AF\x07e\x02\x02\u01AF\u01B0\x07j\x02\x02\u01B0\u01B1" +
52050
- "\x07g\x02\x02\u01B1\u01B2\x07e\x02\x02\u01B2\u01B3\x07m\x02\x02\u01B3" +
52051
- "\u01B4\x07g\x02\x02\u01B4\u01B5\x07f\x02\x02\u01B5Z\x03\x02\x02\x02\u01B6" +
52052
- "\u01B7\x07v\x02\x02\u01B7\u01B8\x07g\x02\x02\u01B8\u01B9\x07u\x02\x02" +
52053
- "\u01B9\u01BA\x07v\x02\x02\u01BA\\\x03\x02\x02\x02\u01BB\u01BC\x07g\x02" +
52054
- "\x02\u01BC\u01BD\x07z\x02\x02\u01BD\u01BE\x07r\x02\x02\u01BE\u01BF\x07" +
52055
- "g\x02\x02\u01BF\u01C0\x07e\x02\x02\u01C0\u01C1\x07v\x02\x02\u01C1^\x03" +
52056
- "\x02\x02\x02\u01C2\u01C3\x07u\x02\x02\u01C3\u01C4\x07w\x02\x02\u01C4\u01C5" +
52057
- "\x07k\x02\x02\u01C5\u01C6\x07v\x02\x02\u01C6\u01C7\x07g\x02\x02\u01C7" +
52058
- "`\x03\x02\x02\x02\u01C8\u01C9\x07~\x02\x02\u01C9b\x03\x02\x02\x02\u01CA" +
52059
- "\u01CB\x07c\x02\x02\u01CB\u01CC\x07n\x02\x02\u01CC\u01CD\x07n\x02\x02" +
52060
- "\u01CDd\x03\x02\x02\x02\u01CE\u01CF\x07u\x02\x02\u01CF\u01D0\x07w\x02" +
52061
- "\x02\u01D0\u01D1\x07h\x02\x02\u01D1\u01D2\x07h\x02\x02\u01D2\u01D3\x07" +
52062
- "k\x02\x02\u01D3\u01D4\x07e\x02\x02\u01D4\u01D5\x07k\x02\x02\u01D5\u01D6" +
52063
- "\x07g\x02\x02\u01D6\u01D7\x07p\x02\x02\u01D7\u01D8\x07v\x02\x02\u01D8" +
52064
- "f\x03\x02\x02\x02\u01D9\u01DA\x07p\x02\x02\u01DA\u01DB\x07g\x02\x02\u01DB" +
52065
- "\u01DC\x07e\x02\x02\u01DC\u01DD\x07g\x02\x02\u01DD\u01DE\x07u\x02\x02" +
52066
- "\u01DE\u01DF\x07u\x02\x02\u01DF\u01E0\x07c\x02\x02\u01E0\u01E1\x07t\x02" +
52067
- "\x02\u01E1\u01E2\x07{";
52068
- ForgeLexer._serializedATNSegment1 = "\x02\x02\u01E2h\x03\x02\x02\x02\u01E3\u01E4\x07e\x02\x02\u01E4\u01E5\x07" +
52069
- "q\x02\x02\u01E5\u01E6\x07p\x02\x02\u01E6\u01E7\x07u\x02\x02\u01E7\u01E8" +
52070
- "\x07k\x02\x02\u01E8\u01E9\x07u\x02\x02\u01E9\u01EA\x07v\x02\x02\u01EA" +
52071
- "\u01EB\x07g\x02\x02\u01EB\u01EC\x07p\x02\x02\u01EC\u01ED\x07v\x02\x02" +
52072
- "\u01EDj\x03\x02\x02\x02\u01EE\u01EF\x07k\x02\x02\u01EF\u01F0\x07p\x02" +
52073
- "\x02\u01F0\u01F1\x07e\x02\x02\u01F1\u01F2\x07q\x02\x02\u01F2\u01F3\x07" +
52074
- "p\x02\x02\u01F3\u01F4\x07u\x02\x02\u01F4\u01F5\x07k\x02\x02\u01F5\u01F6" +
52075
- "\x07u\x02\x02\u01F6\u01F7\x07v\x02\x02\u01F7\u01F8\x07g\x02\x02\u01F8" +
52076
- "\u01F9\x07p\x02\x02\u01F9\u01FA\x07v\x02\x02\u01FAl\x03\x02\x02\x02\u01FB" +
52077
- "\u01FC\x07y\x02\x02\u01FC\u01FD\x07k\x02\x02\u01FD\u01FE\x07v\x02\x02" +
52078
- "\u01FE\u01FF\x07j\x02\x02\u01FFn\x03\x02\x02\x02\u0200\u0201\x07n\x02" +
52079
- "\x02\u0201\u0202\x07g\x02\x02\u0202\u0203\x07v\x02\x02\u0203p\x03\x02" +
52080
- "\x02\x02\u0204\u0205\x07d\x02\x02\u0205\u0206\x07k\x02\x02\u0206\u0207" +
52081
- "\x07p\x02\x02\u0207\u0208\x07f\x02\x02\u0208r\x03\x02\x02\x02\u0209\u020A" +
52082
- "\x07~\x02\x02\u020A\u020E\x07~\x02\x02\u020B\u020C\x07q\x02\x02\u020C" +
52083
- "\u020E\x07t\x02\x02\u020D\u0209\x03\x02\x02\x02\u020D\u020B\x03\x02\x02" +
52084
- "\x02\u020Et\x03\x02\x02\x02\u020F\u0210\x07z\x02\x02\u0210\u0211\x07q" +
52085
- "\x02\x02\u0211\u0212\x07t\x02\x02\u0212v\x03\x02\x02\x02\u0213\u0214\x07" +
52086
- ">\x02\x02\u0214\u0215\x07?\x02\x02\u0215\u021A\x07@\x02\x02\u0216\u0217" +
52087
- "\x07k\x02\x02\u0217\u0218\x07h\x02\x02\u0218\u021A\x07h\x02\x02\u0219" +
52088
- "\u0213\x03\x02\x02\x02\u0219\u0216\x03\x02\x02\x02\u021Ax\x03\x02\x02" +
52089
- "\x02\u021B\u021C\x07k\x02\x02\u021C\u021D\x07o\x02\x02\u021D\u021E\x07" +
52090
- "r\x02\x02\u021E\u021F\x07n\x02\x02\u021F\u0220\x07k\x02\x02\u0220\u0221" +
52091
- "\x07g\x02\x02\u0221\u0225\x07u\x02\x02\u0222\u0223\x07?\x02\x02\u0223" +
52092
- "\u0225\x07@\x02\x02\u0224\u021B\x03\x02\x02\x02\u0224\u0222\x03\x02\x02" +
52093
- "\x02\u0225z\x03\x02\x02\x02\u0226\u0227\x07g\x02\x02\u0227\u0228\x07n" +
52094
- "\x02\x02\u0228\u0229\x07u\x02\x02\u0229\u022A\x07g\x02\x02\u022A|\x03" +
52095
- "\x02\x02\x02\u022B\u022C\x07(\x02\x02\u022C\u0231\x07(\x02\x02\u022D\u022E" +
52096
- "\x07c\x02\x02\u022E\u022F\x07p\x02\x02\u022F\u0231\x07f\x02\x02\u0230" +
52097
- "\u022B\x03\x02\x02\x02\u0230\u022D\x03\x02\x02\x02\u0231~\x03\x02\x02" +
52098
- "\x02\u0232\u0233\x07w\x02\x02\u0233\u0234\x07p\x02\x02\u0234\u0235\x07" +
52099
- "v\x02\x02\u0235\u0236\x07k\x02\x02\u0236\u0237\x07n\x02\x02\u0237\x80" +
52100
- "\x03\x02\x02\x02\u0238\u0239\x07t\x02\x02\u0239\u023A\x07g\x02\x02\u023A" +
52101
- "\u023B\x07n\x02\x02\u023B\u023C\x07g\x02\x02\u023C\u023D\x07c\x02\x02" +
52102
- "\u023D\u023E\x07u\x02\x02\u023E\u023F\x07g\x02\x02\u023F\x82\x03\x02\x02" +
52103
- "\x02\u0240\u0241\x07u\x02\x02\u0241\u0242\x07k\x02\x02\u0242\u0243\x07" +
52104
- "p\x02\x02\u0243\u0244\x07e\x02\x02\u0244\u0245\x07g\x02\x02\u0245\x84" +
52105
- "\x03\x02\x02\x02\u0246\u0247\x07v\x02\x02\u0247\u0248\x07t\x02\x02\u0248" +
52106
- "\u0249\x07k\x02\x02\u0249\u024A\x07i\x02\x02\u024A\u024B\x07i\x02\x02" +
52107
- "\u024B\u024C\x07g\x02\x02\u024C\u024D\x07t\x02\x02\u024D\u024E\x07g\x02" +
52108
- "\x02\u024E\u024F\x07f\x02\x02\u024F\x86\x03\x02\x02\x02\u0250\u0255\x07" +
52109
- "#\x02\x02\u0251\u0252\x07p\x02\x02\u0252\u0253\x07q\x02\x02\u0253\u0255" +
52110
- "\x07v\x02\x02\u0254\u0250\x03\x02\x02\x02\u0254\u0251\x03\x02\x02\x02" +
52111
- "\u0255\x88\x03\x02\x02\x02\u0256\u0257\x07c\x02\x02\u0257\u0258\x07n\x02" +
52112
- "\x02\u0258\u0259\x07y\x02\x02\u0259\u025A\x07c\x02\x02\u025A\u025B\x07" +
52113
- "{\x02\x02\u025B\u025C\x07u\x02\x02\u025C\x8A\x03\x02\x02\x02\u025D\u025E" +
52114
- "\x07g\x02\x02\u025E\u025F\x07x\x02\x02\u025F\u0260\x07g\x02\x02\u0260" +
52115
- "\u0261\x07p\x02\x02\u0261\u0262\x07v\x02\x02\u0262\u0263\x07w\x02\x02" +
52116
- "\u0263\u0264\x07c\x02\x02\u0264\u0265\x07n\x02\x02\u0265\u0266\x07n\x02" +
52117
- "\x02\u0266\u0267\x07{\x02\x02\u0267\x8C\x03\x02\x02\x02\u0268\u0269\x07" +
52118
- "c\x02\x02\u0269\u026A\x07h\x02\x02\u026A\u026B\x07v\x02\x02\u026B\u026C" +
52119
- "\x07g\x02\x02\u026C\u026D\x07t\x02\x02\u026D\x8E\x03\x02\x02\x02\u026E" +
52120
- "\u026F\x07d\x02\x02\u026F\u0270\x07g\x02\x02\u0270\u0271\x07h\x02\x02" +
52121
- "\u0271\u0272\x07q\x02\x02\u0272\u0273\x07t\x02\x02\u0273\u0274\x07g\x02" +
52122
- "\x02\u0274\x90\x03\x02\x02\x02\u0275\u0276\x07q\x02\x02\u0276\u0277\x07" +
52123
- "p\x02\x02\u0277\u0278\x07e\x02\x02\u0278\u0279\x07g\x02\x02\u0279\x92" +
52124
- "\x03\x02\x02\x02\u027A\u027B\x07j\x02\x02\u027B\u027C\x07k\x02\x02\u027C" +
52125
- "\u027D\x07u\x02\x02\u027D\u027E\x07v\x02\x02\u027E\u027F\x07q\x02\x02" +
52126
- "\u027F\u0280\x07t\x02\x02\u0280\u0281\x07k\x02\x02\u0281\u0282\x07e\x02" +
52127
- "\x02\u0282\u0283\x07c\x02\x02\u0283\u0284\x07n\x02\x02\u0284\u0285\x07" +
52128
- "n\x02\x02\u0285\u0286\x07{\x02\x02\u0286\x94\x03\x02\x02\x02\u0287\u0288" +
52129
- "\x07%\x02\x02\u0288\x96\x03\x02\x02\x02\u0289\u028A\x07-\x02\x02\u028A" +
52130
- "\u028B\x07-\x02\x02\u028B\x98\x03\x02\x02\x02\u028C\u028D\x07(\x02\x02" +
52131
- "\u028D\x9A\x03\x02\x02\x02\u028E\u028F\x07>\x02\x02\u028F\u0290\x07<\x02" +
52132
- "\x02\u0290\x9C\x03\x02\x02\x02\u0291\u0292\x07<\x02\x02\u0292\u0293\x07" +
52133
- "@\x02\x02\u0293\x9E\x03\x02\x02\x02\u0294\u0295\x07)\x02\x02\u0295\xA0" +
52134
- "\x03\x02\x02\x02\u0296\u0297\x07\x80\x02\x02\u0297\xA2\x03\x02\x02\x02" +
52135
- "\u0298\u0299\x07`\x02\x02\u0299\xA4\x03\x02\x02\x02\u029A\u029B\x07,\x02" +
52136
- "\x02\u029B\xA6\x03\x02\x02\x02\u029C\u029D\x07B\x02\x02\u029D\xA8\x03" +
52137
- "\x02\x02\x02\u029E\u029F\x07b\x02\x02\u029F\xAA\x03\x02\x02\x02\u02A0" +
52138
- "\u02A1\x07v\x02\x02\u02A1\u02A2\x07j\x02\x02\u02A2\u02A3\x07k\x02\x02" +
52139
- "\u02A3\u02A4\x07u\x02\x02\u02A4\xAC\x03\x02\x02\x02\u02A5\u02A6\x07u\x02" +
52140
- "\x02\u02A6\u02A7\x07g\x02\x02\u02A7\u02A8\x07z\x02\x02\u02A8\u02A9\x07" +
52141
- "r\x02\x02\u02A9\u02AA\x07t\x02\x02\u02AA\xAE\x03\x02\x02\x02\u02AB\u02AC" +
52142
- "\x07k\x02\x02\u02AC\u02AD\x07p\x02\x02\u02AD\u02AE\x07u\x02\x02\u02AE" +
52143
- "\u02AF\x07v\x02\x02\u02AF\xB0\x03\x02\x02\x02\u02B0\u02B1\x07g\x02\x02" +
52144
- "\u02B1\u02B2\x07x\x02\x02\u02B2\u02B3\x07c\x02\x02\u02B3\u02B4\x07n\x02" +
52145
- "\x02\u02B4\xB2\x03\x02\x02\x02\u02B5\u02B6\x07g\x02\x02\u02B6\u02B7\x07" +
52146
- "z\x02\x02\u02B7\u02B8\x07c\x02\x02\u02B8\u02B9\x07o\x02\x02\u02B9\u02BA" +
52147
- "\x07r\x02\x02\u02BA\u02BB\x07n\x02\x02\u02BB\u02BC\x07g\x02\x02\u02BC" +
52148
- "\xB4\x03\x02\x02\x02\u02BD\u02BE\x07/\x02\x02\u02BE\u02BF\x07@\x02\x02" +
52149
- "\u02BF\xB6\x03\x02\x02\x02\u02C0\u02C1\x07B\x02\x02\u02C1\u02C2\x07<\x02" +
52150
- "\x02\u02C2\xB8\x03\x02\x02\x02\u02C3\u02C4\x07B\x02\x02\u02C4\u02C5\x07" +
52151
- "u\x02\x02\u02C5\u02C6\x07v\x02\x02\u02C6\u02C7\x07t\x02\x02\u02C7\u02C8" +
52152
- "\x07<\x02\x02\u02C8\xBA\x03\x02\x02\x02\u02C9\u02CA\x07B\x02\x02\u02CA" +
52153
- "\u02CB\x07d\x02\x02\u02CB\u02CC\x07q\x02\x02\u02CC\u02CD\x07q\x02\x02" +
52154
- "\u02CD\u02CE\x07n\x02\x02\u02CE\u02CF\x07<\x02\x02\u02CF\xBC\x03\x02\x02" +
52155
- "\x02\u02D0\u02D1\x07B\x02\x02\u02D1\u02D2\x07p\x02\x02\u02D2\u02D3\x07" +
52156
- "w\x02\x02\u02D3\u02D4\x07o\x02\x02\u02D4\u02D5\x07<\x02\x02\u02D5\xBE" +
52157
- "\x03\x02\x02\x02\u02D6\u02D7\x07?\x02\x02\u02D7\xC0\x03\x02\x02\x02\u02D8" +
52158
- "\u02D9\x07>\x02\x02\u02D9\xC2\x03\x02\x02\x02\u02DA\u02DB\x07@\x02\x02" +
52159
- "\u02DB\xC4\x03\x02\x02\x02\u02DC\u02DD\x07>\x02\x02\u02DD\u02E1\x07?\x02" +
52160
- "\x02\u02DE\u02DF\x07?\x02\x02\u02DF\u02E1\x07>\x02\x02\u02E0\u02DC\x03" +
52161
- "\x02\x02\x02\u02E0\u02DE\x03\x02\x02\x02\u02E1\xC6\x03\x02\x02\x02\u02E2" +
52162
- "\u02E3\x07@\x02\x02\u02E3\u02E4\x07?\x02\x02\u02E4\xC8\x03\x02\x02\x02" +
52163
- "\u02E5\u02E6\x07p\x02\x02\u02E6\u02E7\x07k\x02\x02\u02E7\xCA\x03\x02\x02" +
52164
- "\x02\u02E8\u02E9\x07p\x02\x02\u02E9\u02EA\x07q\x02\x02\u02EA\xCC\x03\x02" +
52165
- "\x02\x02\u02EB\u02EC\x07u\x02\x02\u02EC\u02ED\x07w\x02\x02\u02ED\u02EE" +
52166
- "\x07o\x02\x02\u02EE\xCE\x03\x02\x02\x02\u02EF\u02F0\x07K\x02\x02\u02F0" +
52167
- "\u02F1\x07p\x02\x02\u02F1\u02F2\x07v\x02\x02\u02F2\xD0\x03\x02\x02\x02" +
52168
- "\u02F3\u02F4\x07q\x02\x02\u02F4\u02F5\x07r\x02\x02\u02F5\u02F6\x07v\x02" +
52169
- "\x02\u02F6\u02F7\x07k\x02\x02\u02F7\u02F8\x07q\x02\x02\u02F8\u02F9\x07" +
52170
- "p\x02\x02\u02F9\xD2\x03\x02\x02\x02\u02FA\u02FB\x07.\x02\x02\u02FB\xD4" +
52171
- "\x03\x02\x02\x02\u02FC\u02FD\x071\x02\x02\u02FD\xD6\x03\x02\x02\x02\u02FE" +
52172
- "\u0300\t\x03\x02\x02\u02FF\u02FE\x03\x02\x02\x02\u0300\u0301\x03\x02\x02" +
52173
- "\x02\u0301\u02FF\x03\x02\x02\x02\u0301\u0302\x03\x02\x02\x02\u0302\u0309" +
52174
- "\x03\x02\x02\x02\u0303\u0305\x070\x02\x02\u0304\u0306\t\x03\x02\x02\u0305" +
52175
- "\u0304\x03\x02\x02\x02\u0306\u0307\x03\x02\x02\x02\u0307\u0305\x03\x02" +
52176
- "\x02\x02\u0307\u0308\x03\x02\x02\x02\u0308\u030A\x03\x02\x02\x02\u0309" +
52177
- "\u0303\x03\x02\x02\x02\u0309\u030A\x03\x02\x02\x02\u030A\xD8\x03\x02\x02" +
52178
- "\x02\u030B\u030F\t\x04\x02\x02\u030C\u030E\t\x05\x02\x02\u030D\u030C\x03" +
52179
- "\x02\x02\x02\u030E\u0311\x03\x02\x02\x02\u030F\u030D\x03\x02\x02\x02\u030F" +
52180
- "\u0310\x03\x02\x02\x02\u0310\xDA\x03\x02\x02\x02\u0311\u030F\x03\x02\x02" +
52181
- "\x02\u0312\u0314\t\x06\x02\x02\u0313\u0312\x03\x02\x02\x02\u0314\u0315" +
52182
- "\x03\x02\x02\x02\u0315\u0313\x03\x02\x02\x02\u0315\u0316\x03\x02\x02\x02" +
52183
- "\u0316\u0317\x03\x02\x02\x02\u0317\u0318\bn\x02\x02\u0318\xDC\x03\x02" +
52184
- "\x02\x02\u0319\u031A\x071\x02\x02\u031A\u031B\x071\x02\x02\u031B\u031F" +
52185
- "\x03\x02\x02\x02\u031C\u031E\n\x07\x02\x02\u031D\u031C\x03\x02\x02\x02" +
52186
- "\u031E\u0321\x03\x02\x02\x02\u031F\u031D\x03\x02\x02\x02\u031F\u0320\x03" +
52187
- "\x02\x02\x02\u0320\u0322\x03\x02\x02\x02\u0321\u031F\x03\x02\x02\x02\u0322" +
52188
- "\u0323\bo\x03\x02\u0323\xDE\x03\x02\x02\x02\u0324\u0325\x07/\x02\x02\u0325" +
52189
- "\u0326\x07/\x02\x02\u0326\u032A\x03\x02\x02\x02\u0327\u0329\n\x07\x02" +
52190
- "\x02\u0328\u0327\x03\x02\x02\x02\u0329\u032C\x03\x02\x02\x02\u032A\u0328" +
52191
- "\x03\x02\x02\x02\u032A\u032B\x03\x02\x02\x02\u032B\u032D\x03\x02\x02\x02" +
52192
- "\u032C\u032A\x03\x02\x02\x02\u032D\u032E\bp\x03\x02\u032E\xE0\x03\x02" +
52193
- "\x02\x02\u032F\u0330\x071\x02\x02\u0330\u0331\x07,\x02\x02\u0331\u0335" +
52194
- "\x03\x02\x02\x02\u0332\u0334\v\x02\x02\x02\u0333\u0332\x03\x02\x02\x02" +
52195
- "\u0334\u0337\x03\x02\x02\x02\u0335\u0336\x03\x02\x02\x02\u0335\u0333\x03" +
52196
- "\x02\x02\x02\u0336\u0338\x03\x02\x02\x02\u0337\u0335\x03\x02\x02\x02\u0338" +
52197
- "\u0339\x07,\x02\x02\u0339\u033A\x071\x02\x02\u033A\u033B\x03\x02\x02\x02" +
52198
- "\u033B\u033C\bq\x03\x02\u033C\xE2\x03\x02\x02\x02\u033D\u033E\x07%\x02" +
52199
- "\x02\u033E\u033F\x07n\x02\x02\u033F\u0340\x07c\x02\x02\u0340\u0341\x07" +
52200
- "p\x02\x02\u0341\u0342\x07i\x02\x02\u0342\u0346\x03\x02\x02\x02\u0343\u0345" +
52201
- "\n\x07\x02\x02\u0344\u0343\x03\x02\x02\x02\u0345\u0348\x03\x02\x02\x02" +
52202
- "\u0346\u0344\x03\x02\x02\x02\u0346\u0347\x03\x02\x02\x02\u0347\u0349\x03" +
52203
- "\x02\x02\x02\u0348\u0346\x03\x02\x02\x02\u0349\u034A\br\x03\x02\u034A" +
52204
- "\xE4\x03\x02\x02\x02\x14\x02\xF5\xF7\u020D\u0219\u0224\u0230\u0254\u02E0" +
52205
- "\u0301\u0307\u0309\u030F\u0315\u031F\u032A\u0335\u0346\x04\b\x02\x02\x02" +
52206
- "\x03\x02";
52908
+ "\x02r\xE3\x02s\xE5\x02t\x03\x02\t\x04\x02$$^^\x03\x022;\x04\x02^^bb\x07" +
52909
+ "\x02&&11C\\aac|\x07\x02&&1;C\\aac|\x05\x02\v\f\x0F\x0F\"\"\x04\x02\f\f" +
52910
+ "\x0F\x0F\x02\u0369\x02\x03\x03\x02\x02\x02\x02\x05\x03\x02\x02\x02\x02" +
52911
+ "\x07\x03\x02\x02\x02\x02\t\x03\x02\x02\x02\x02\v\x03\x02\x02\x02\x02\r" +
52912
+ "\x03\x02\x02\x02\x02\x0F\x03\x02\x02\x02\x02\x11\x03\x02\x02\x02\x02\x13" +
52913
+ "\x03\x02\x02\x02\x02\x15\x03\x02\x02\x02\x02\x17\x03\x02\x02\x02\x02\x19" +
52914
+ "\x03\x02\x02\x02\x02\x1B\x03\x02\x02\x02\x02\x1D\x03\x02\x02\x02\x02\x1F" +
52915
+ "\x03\x02\x02\x02\x02!\x03\x02\x02\x02\x02#\x03\x02\x02\x02\x02%\x03\x02" +
52916
+ "\x02\x02\x02\'\x03\x02\x02\x02\x02)\x03\x02\x02\x02\x02+\x03\x02\x02\x02" +
52917
+ "\x02-\x03\x02\x02\x02\x02/\x03\x02\x02\x02\x021\x03\x02\x02\x02\x023\x03" +
52918
+ "\x02\x02\x02\x025\x03\x02\x02\x02\x027\x03\x02\x02\x02\x029\x03\x02\x02" +
52919
+ "\x02\x02;\x03\x02\x02\x02\x02=\x03\x02\x02\x02\x02?\x03\x02\x02\x02\x02" +
52920
+ "A\x03\x02\x02\x02\x02C\x03\x02\x02\x02\x02E\x03\x02\x02\x02\x02G\x03\x02" +
52921
+ "\x02\x02\x02I\x03\x02\x02\x02\x02K\x03\x02\x02\x02\x02M\x03\x02\x02\x02" +
52922
+ "\x02O\x03\x02\x02\x02\x02Q\x03\x02\x02\x02\x02S\x03\x02\x02\x02\x02U\x03" +
52923
+ "\x02\x02\x02\x02W\x03\x02\x02\x02\x02Y\x03\x02\x02\x02\x02[\x03\x02\x02" +
52924
+ "\x02\x02]\x03\x02\x02\x02\x02_\x03\x02\x02\x02\x02a\x03\x02\x02\x02\x02" +
52925
+ "c\x03\x02\x02\x02\x02e\x03\x02\x02\x02\x02g\x03\x02\x02\x02\x02i\x03\x02" +
52926
+ "\x02\x02\x02k\x03\x02\x02\x02\x02m\x03\x02\x02\x02\x02o\x03\x02\x02\x02" +
52927
+ "\x02q\x03\x02\x02\x02\x02s\x03\x02\x02\x02\x02u\x03\x02\x02\x02\x02w\x03" +
52928
+ "\x02\x02\x02\x02y\x03\x02\x02\x02\x02{\x03\x02\x02\x02\x02}\x03\x02\x02" +
52929
+ "\x02\x02\x7F\x03\x02\x02\x02\x02\x81\x03\x02\x02\x02\x02\x83\x03\x02\x02" +
52930
+ "\x02\x02\x85\x03\x02\x02\x02\x02\x87\x03\x02\x02\x02\x02\x89\x03\x02\x02" +
52931
+ "\x02\x02\x8B\x03\x02\x02\x02\x02\x8D\x03\x02\x02\x02\x02\x8F\x03\x02\x02" +
52932
+ "\x02\x02\x91\x03\x02\x02\x02\x02\x93\x03\x02\x02\x02\x02\x95\x03\x02\x02" +
52933
+ "\x02\x02\x97\x03\x02\x02\x02\x02\x99\x03\x02\x02\x02\x02\x9B\x03\x02\x02" +
52934
+ "\x02\x02\x9D\x03\x02\x02\x02\x02\x9F\x03\x02\x02\x02\x02\xA1\x03\x02\x02" +
52935
+ "\x02\x02\xA3\x03\x02\x02\x02\x02\xA5\x03\x02\x02\x02\x02\xA7\x03\x02\x02" +
52936
+ "\x02\x02\xA9\x03\x02\x02\x02\x02\xAB\x03\x02\x02\x02\x02\xAD\x03\x02\x02" +
52937
+ "\x02\x02\xAF\x03\x02\x02\x02\x02\xB1\x03\x02\x02\x02\x02\xB3\x03\x02\x02" +
52938
+ "\x02\x02\xB5\x03\x02\x02\x02\x02\xB7\x03\x02\x02\x02\x02\xB9\x03\x02\x02" +
52939
+ "\x02\x02\xBB\x03\x02\x02\x02\x02\xBD\x03\x02\x02\x02\x02\xBF\x03\x02\x02" +
52940
+ "\x02\x02\xC1\x03\x02\x02\x02\x02\xC3\x03\x02\x02\x02\x02\xC5\x03\x02\x02" +
52941
+ "\x02\x02\xC7\x03\x02\x02\x02\x02\xC9\x03\x02\x02\x02\x02\xCB\x03\x02\x02" +
52942
+ "\x02\x02\xCD\x03\x02\x02\x02\x02\xCF\x03\x02\x02\x02\x02\xD1\x03\x02\x02" +
52943
+ "\x02\x02\xD3\x03\x02\x02\x02\x02\xD5\x03\x02\x02\x02\x02\xD7\x03\x02\x02" +
52944
+ "\x02\x02\xD9\x03\x02\x02\x02\x02\xDB\x03\x02\x02\x02\x02\xDD\x03\x02\x02" +
52945
+ "\x02\x02\xDF\x03\x02\x02\x02\x02\xE1\x03\x02\x02\x02\x02\xE3\x03\x02\x02" +
52946
+ "\x02\x02\xE5\x03\x02\x02\x02\x03\xE7\x03\x02\x02\x02\x05\xEC\x03\x02\x02" +
52947
+ "\x02\x07\xEE\x03\x02\x02\x02\t\xF0\x03\x02\x02\x02\v\xF3\x03\x02\x02\x02" +
52948
+ "\r\xFE\x03\x02\x02\x02\x0F\u0102\x03\x02\x02\x02\x11\u010B\x03\x02\x02" +
52949
+ "\x02\x13\u010F\x03\x02\x02\x02\x15\u0111\x03\x02\x02\x02\x17\u0113\x03" +
52950
+ "\x02\x02\x02\x19\u011B\x03\x02\x02\x02\x1B\u011E\x03\x02\x02\x02\x1D\u0120" +
52951
+ "\x03\x02\x02\x02\x1F\u0125\x03\x02\x02\x02!\u012A\x03\x02\x02\x02#\u012E" +
52952
+ "\x03\x02\x02\x02%\u0132\x03\x02\x02\x02\'\u0136\x03\x02\x02\x02)\u013B" +
52953
+ "\x03\x02\x02\x02+\u0141\x03\x02\x02\x02-\u0146\x03\x02\x02\x02/\u0148" +
52954
+ "\x03\x02\x02\x021\u014E\x03\x02\x02\x023\u0153\x03\x02\x02\x025\u0155" +
52955
+ "\x03\x02\x02\x027\u0159\x03\x02\x02\x029\u015B\x03\x02\x02\x02;\u015D" +
52956
+ "\x03\x02\x02\x02=\u0164\x03\x02\x02\x02?\u0168\x03\x02\x02\x02A\u016E" +
52957
+ "\x03\x02\x02\x02C\u0172\x03\x02\x02\x02E\u0176\x03\x02\x02\x02G\u017E" +
52958
+ "\x03\x02\x02\x02I\u0183\x03\x02\x02\x02K\u0188\x03\x02\x02\x02M\u018D" +
52959
+ "\x03\x02\x02\x02O\u018F\x03\x02\x02\x02Q\u0192\x03\x02\x02\x02S\u0196" +
52960
+ "\x03\x02\x02\x02U\u019C\x03\x02\x02\x02W\u01A4\x03\x02\x02\x02Y\u01B0" +
52961
+ "\x03\x02\x02\x02[\u01B8\x03\x02\x02\x02]\u01BD\x03\x02\x02\x02_\u01C4" +
52962
+ "\x03\x02\x02\x02a\u01CA\x03\x02\x02\x02c\u01CC\x03\x02\x02\x02e\u01D0" +
52963
+ "\x03\x02\x02\x02g\u01DB\x03\x02\x02\x02i\u01E5\x03\x02\x02\x02k\u01F0" +
52964
+ "\x03\x02\x02\x02m\u01FD\x03\x02\x02\x02o\u0202\x03\x02\x02\x02q\u0206" +
52965
+ "\x03\x02\x02\x02s\u020F\x03\x02\x02\x02u\u0211\x03\x02\x02\x02w\u021B" +
52966
+ "\x03\x02\x02\x02y\u0226\x03\x02\x02\x02{\u0228\x03\x02\x02\x02}\u0232" +
52967
+ "\x03\x02\x02\x02\x7F\u0234\x03\x02\x02\x02\x81\u023A\x03\x02\x02\x02\x83" +
52968
+ "\u0242\x03\x02\x02\x02\x85\u0248\x03\x02\x02\x02\x87\u0256\x03\x02\x02" +
52969
+ "\x02\x89\u0258\x03\x02\x02\x02\x8B\u025F\x03\x02\x02\x02\x8D\u026A\x03" +
52970
+ "\x02\x02\x02\x8F\u0270\x03\x02\x02\x02\x91\u0277\x03\x02\x02\x02\x93\u027C" +
52971
+ "\x03\x02\x02\x02\x95\u0289\x03\x02\x02\x02\x97\u028B\x03\x02\x02\x02\x99" +
52972
+ "\u028E\x03\x02\x02\x02\x9B\u0290\x03\x02\x02\x02\x9D\u0293\x03\x02\x02" +
52973
+ "\x02\x9F\u0296\x03\x02\x02\x02\xA1\u0298\x03\x02\x02\x02\xA3\u029A\x03" +
52974
+ "\x02\x02\x02\xA5\u029C\x03\x02\x02\x02\xA7\u029E\x03\x02\x02\x02\xA9\u02A0" +
52975
+ "\x03\x02\x02\x02\xAB\u02A2\x03\x02\x02\x02\xAD\u02A7\x03\x02\x02\x02\xAF" +
52976
+ "\u02AD\x03\x02\x02\x02\xB1\u02B2\x03\x02\x02\x02\xB3\u02B7\x03\x02\x02" +
52977
+ "\x02\xB5\u02BF\x03\x02\x02\x02\xB7\u02C2\x03\x02\x02\x02\xB9\u02C5\x03" +
52978
+ "\x02\x02\x02\xBB\u02CB\x03\x02\x02\x02\xBD\u02D2\x03\x02\x02\x02\xBF\u02D8" +
52979
+ "\x03\x02\x02\x02\xC1\u02DA\x03\x02\x02\x02\xC3\u02DC\x03\x02\x02\x02\xC5" +
52980
+ "\u02E2\x03\x02\x02\x02\xC7\u02E4\x03\x02\x02\x02\xC9\u02E7\x03\x02\x02" +
52981
+ "\x02\xCB\u02EA\x03\x02\x02\x02\xCD\u02ED\x03\x02\x02\x02\xCF\u02F1\x03" +
52982
+ "\x02\x02\x02\xD1\u02F5\x03\x02\x02\x02\xD3\u02FC\x03\x02\x02\x02\xD5\u02FE" +
52983
+ "\x03\x02\x02\x02\xD7\u0301\x03\x02\x02\x02\xD9\u030D\x03\x02\x02\x02\xDB" +
52984
+ "\u0317\x03\x02\x02\x02\xDD\u031F\x03\x02\x02\x02\xDF\u0325\x03\x02\x02" +
52985
+ "\x02\xE1\u0330\x03\x02\x02\x02\xE3\u033B\x03\x02\x02\x02\xE5\u0349\x03" +
52986
+ "\x02\x02\x02\xE7\xE8\x07q\x02\x02\xE8\xE9\x07r\x02\x02\xE9\xEA\x07g\x02" +
52987
+ "\x02\xEA\xEB\x07p\x02\x02\xEB\x04\x03\x02\x02\x02\xEC\xED\x07]\x02\x02" +
52988
+ "\xED\x06\x03\x02\x02\x02\xEE\xEF\x07_\x02\x02\xEF\b\x03\x02\x02\x02\xF0" +
52989
+ "\xF1\x07c\x02\x02\xF1\xF2\x07u\x02\x02\xF2\n\x03\x02\x02\x02\xF3\xF9\x07" +
52990
+ "$\x02\x02\xF4\xF8\n\x02\x02\x02\xF5\xF6\x07^\x02\x02\xF6\xF8\v\x02\x02" +
52991
+ "\x02\xF7\xF4\x03\x02\x02\x02\xF7\xF5\x03\x02\x02\x02\xF8\xFB\x03\x02\x02" +
52992
+ "\x02\xF9\xF7\x03\x02\x02\x02\xF9\xFA\x03\x02\x02\x02\xFA\xFC\x03\x02\x02" +
52993
+ "\x02\xFB\xF9\x03\x02\x02\x02\xFC\xFD\x07$\x02\x02\xFD\f\x03\x02\x02\x02" +
52994
+ "\xFE\xFF\x07x\x02\x02\xFF\u0100\x07c\x02\x02\u0100\u0101\x07t\x02\x02" +
52995
+ "\u0101\x0E\x03\x02\x02\x02\u0102\u0103\x07c\x02\x02\u0103\u0104\x07d\x02" +
52996
+ "\x02\u0104\u0105\x07u\x02\x02\u0105\u0106\x07v\x02\x02\u0106\u0107\x07" +
52997
+ "t\x02\x02\u0107\u0108\x07c\x02\x02\u0108\u0109\x07e\x02\x02\u0109\u010A" +
52998
+ "\x07v\x02\x02\u010A\x10\x03\x02\x02\x02\u010B\u010C\x07u\x02\x02\u010C" +
52999
+ "\u010D\x07k\x02\x02\u010D\u010E\x07i\x02\x02\u010E\x12\x03\x02\x02\x02" +
53000
+ "\u010F\u0110\x07}\x02\x02\u0110\x14\x03\x02\x02\x02\u0111\u0112\x07\x7F" +
53001
+ "\x02\x02\u0112\x16\x03\x02\x02\x02\u0113\u0114\x07g\x02\x02\u0114\u0115" +
53002
+ "\x07z\x02\x02\u0115\u0116\x07v\x02\x02\u0116\u0117\x07g\x02\x02\u0117" +
53003
+ "\u0118\x07p\x02\x02\u0118\u0119\x07f\x02\x02\u0119\u011A\x07u\x02\x02" +
53004
+ "\u011A\x18\x03\x02\x02\x02\u011B\u011C\x07k\x02\x02\u011C\u011D\x07p\x02" +
53005
+ "\x02\u011D\x1A\x03\x02\x02\x02\u011E\u011F\x07-\x02\x02\u011F\x1C\x03" +
53006
+ "\x02\x02\x02\u0120\u0121\x07n\x02\x02\u0121\u0122\x07q\x02\x02\u0122\u0123" +
53007
+ "\x07p\x02\x02\u0123\u0124\x07g\x02\x02\u0124\x1E\x03\x02\x02\x02\u0125" +
53008
+ "\u0126\x07u\x02\x02\u0126\u0127\x07q\x02\x02\u0127\u0128\x07o\x02\x02" +
53009
+ "\u0128\u0129\x07g\x02\x02\u0129 \x03\x02\x02\x02\u012A\u012B\x07q\x02" +
53010
+ "\x02\u012B\u012C\x07p\x02\x02\u012C\u012D\x07g\x02\x02\u012D\"\x03\x02" +
53011
+ "\x02\x02\u012E\u012F\x07v\x02\x02\u012F\u0130\x07y\x02\x02\u0130\u0131" +
53012
+ "\x07q\x02\x02\u0131$\x03\x02\x02\x02\u0132\u0133\x07u\x02\x02\u0133\u0134" +
53013
+ "\x07g\x02\x02\u0134\u0135\x07v\x02\x02\u0135&\x03\x02\x02\x02\u0136\u0137" +
53014
+ "\x07h\x02\x02\u0137\u0138\x07w\x02\x02\u0138\u0139\x07p\x02\x02\u0139" +
53015
+ "\u013A\x07e\x02\x02\u013A(\x03\x02\x02\x02\u013B\u013C\x07r\x02\x02\u013C" +
53016
+ "\u013D\x07h\x02\x02\u013D\u013E\x07w\x02\x02\u013E\u013F\x07p\x02\x02" +
53017
+ "\u013F\u0140\x07e\x02\x02\u0140*\x03\x02\x02\x02\u0141\u0142\x07f\x02" +
53018
+ "\x02\u0142\u0143\x07k\x02\x02\u0143\u0144\x07u\x02\x02\u0144\u0145\x07" +
53019
+ "l\x02\x02\u0145,\x03\x02\x02\x02\u0146\u0147\x07<\x02\x02\u0147.\x03\x02" +
53020
+ "\x02\x02\u0148\u0149\x07y\x02\x02\u0149\u014A\x07j\x02\x02\u014A\u014B" +
53021
+ "\x07g\x02\x02\u014B\u014C\x07c\x02\x02\u014C\u014D\x07v\x02\x02\u014D" +
53022
+ "0\x03\x02\x02\x02\u014E\u014F\x07r\x02\x02\u014F\u0150\x07t\x02\x02\u0150" +
53023
+ "\u0151\x07g\x02\x02\u0151\u0152\x07f\x02\x02\u01522\x03\x02\x02\x02\u0153" +
53024
+ "\u0154\x070\x02\x02\u01544\x03\x02\x02\x02\u0155\u0156\x07h\x02\x02\u0156" +
53025
+ "\u0157\x07w\x02\x02\u0157\u0158\x07p\x02\x02\u01586\x03\x02\x02\x02\u0159" +
53026
+ "\u015A\x07*\x02\x02\u015A8\x03\x02\x02\x02\u015B\u015C\x07+\x02\x02\u015C" +
53027
+ ":\x03\x02\x02\x02\u015D\u015E\x07c\x02\x02\u015E\u015F\x07u\x02\x02\u015F" +
53028
+ "\u0160\x07u\x02\x02\u0160\u0161\x07g\x02\x02\u0161\u0162\x07t\x02\x02" +
53029
+ "\u0162\u0163\x07v\x02\x02\u0163<\x03\x02\x02\x02\u0164\u0165\x07t\x02" +
53030
+ "\x02\u0165\u0166\x07w\x02\x02\u0166\u0167\x07p\x02\x02\u0167>\x03\x02" +
53031
+ "\x02\x02\u0168\u0169\x07e\x02\x02\u0169\u016A\x07j\x02\x02\u016A\u016B" +
53032
+ "\x07g\x02\x02\u016B\u016C\x07e\x02\x02\u016C\u016D\x07m\x02\x02\u016D" +
53033
+ "@\x03\x02\x02\x02\u016E\u016F\x07h\x02\x02\u016F\u0170\x07q\x02\x02\u0170" +
53034
+ "\u0171\x07t\x02\x02\u0171B\x03\x02\x02\x02\u0172\u0173\x07d\x02\x02\u0173" +
53035
+ "\u0174\x07w\x02\x02\u0174\u0175\x07v\x02\x02\u0175D\x03\x02\x02\x02\u0176" +
53036
+ "\u0177\x07g\x02\x02\u0177\u0178\x07z\x02\x02\u0178\u0179\x07c\x02\x02" +
53037
+ "\u0179\u017A\x07e\x02\x02\u017A\u017B\x07v\x02\x02\u017B\u017C\x07n\x02" +
53038
+ "\x02\u017C\u017D\x07{\x02\x02\u017DF\x03\x02\x02\x02\u017E\u017F\x07p" +
53039
+ "\x02\x02\u017F\u0180\x07q\x02\x02\u0180\u0181\x07p\x02\x02\u0181\u0182" +
53040
+ "\x07g\x02\x02\u0182H\x03\x02\x02\x02\u0183\u0184\x07w\x02\x02\u0184\u0185" +
53041
+ "\x07p\x02\x02\u0185\u0186\x07k\x02\x02\u0186\u0187\x07x\x02\x02\u0187" +
53042
+ "J\x03\x02\x02\x02\u0188\u0189\x07k\x02\x02\u0189\u018A\x07f\x02\x02\u018A" +
53043
+ "\u018B\x07g\x02\x02\u018B\u018C\x07p\x02\x02\u018CL\x03\x02\x02\x02\u018D" +
53044
+ "\u018E\x07/\x02\x02\u018EN\x03\x02\x02\x02\u018F\u0190\x07k\x02\x02\u0190" +
53045
+ "\u0191\x07u\x02\x02\u0191P\x03\x02\x02\x02\u0192\u0193\x07u\x02\x02\u0193" +
53046
+ "\u0194\x07c\x02\x02\u0194\u0195\x07v\x02\x02\u0195R\x03\x02\x02\x02\u0196" +
53047
+ "\u0197\x07w\x02\x02\u0197\u0198\x07p\x02\x02\u0198\u0199\x07u\x02\x02" +
53048
+ "\u0199\u019A\x07c\x02\x02\u019A\u019B\x07v\x02\x02\u019BT\x03\x02\x02" +
53049
+ "\x02\u019C\u019D\x07v\x02\x02\u019D\u019E\x07j\x02\x02\u019E\u019F\x07" +
53050
+ "g\x02\x02\u019F\u01A0\x07q\x02\x02\u01A0\u01A1\x07t\x02\x02\u01A1\u01A2" +
53051
+ "\x07g\x02\x02\u01A2\u01A3\x07o\x02\x02\u01A3V\x03\x02\x02\x02\u01A4\u01A5" +
53052
+ "\x07h\x02\x02\u01A5\u01A6\x07q\x02\x02\u01A6\u01A7\x07t\x02\x02\u01A7" +
53053
+ "\u01A8\x07i\x02\x02\u01A8\u01A9\x07g\x02\x02\u01A9\u01AA\x07a\x02\x02" +
53054
+ "\u01AA\u01AB\x07g\x02\x02\u01AB\u01AC\x07t\x02\x02\u01AC\u01AD\x07t\x02" +
53055
+ "\x02\u01AD\u01AE\x07q\x02\x02\u01AE\u01AF\x07t\x02\x02\u01AFX\x03\x02" +
53056
+ "\x02\x02\u01B0\u01B1\x07e\x02\x02\u01B1\u01B2\x07j\x02\x02\u01B2\u01B3" +
53057
+ "\x07g\x02\x02\u01B3\u01B4\x07e\x02\x02\u01B4\u01B5\x07m\x02\x02\u01B5" +
53058
+ "\u01B6\x07g\x02\x02\u01B6\u01B7\x07f\x02\x02\u01B7Z\x03\x02\x02\x02\u01B8" +
53059
+ "\u01B9\x07v\x02\x02\u01B9\u01BA\x07g\x02\x02\u01BA\u01BB\x07u\x02\x02" +
53060
+ "\u01BB\u01BC\x07v\x02\x02\u01BC\\\x03\x02\x02\x02\u01BD\u01BE\x07g\x02" +
53061
+ "\x02\u01BE\u01BF\x07z\x02\x02\u01BF\u01C0\x07r\x02\x02\u01C0\u01C1\x07" +
53062
+ "g\x02\x02\u01C1\u01C2\x07e\x02\x02\u01C2\u01C3\x07v\x02\x02\u01C3^\x03" +
53063
+ "\x02\x02\x02\u01C4\u01C5\x07u\x02\x02\u01C5\u01C6\x07w\x02\x02\u01C6\u01C7" +
53064
+ "\x07k\x02\x02\u01C7\u01C8\x07v\x02\x02\u01C8\u01C9\x07g\x02\x02\u01C9" +
53065
+ "`\x03\x02\x02\x02\u01CA\u01CB\x07~\x02\x02\u01CBb\x03\x02\x02\x02\u01CC" +
53066
+ "\u01CD\x07c\x02\x02\u01CD\u01CE\x07n\x02\x02\u01CE\u01CF\x07n\x02\x02" +
53067
+ "\u01CFd\x03\x02\x02\x02\u01D0\u01D1\x07u\x02\x02\u01D1\u01D2\x07w\x02" +
53068
+ "\x02\u01D2\u01D3\x07h\x02\x02\u01D3\u01D4\x07h\x02\x02\u01D4\u01D5\x07" +
53069
+ "k\x02\x02\u01D5\u01D6\x07e\x02\x02\u01D6\u01D7\x07k\x02\x02\u01D7\u01D8" +
53070
+ "\x07g\x02\x02\u01D8\u01D9\x07p\x02\x02\u01D9\u01DA\x07v\x02\x02\u01DA" +
53071
+ "f\x03\x02\x02\x02\u01DB\u01DC\x07p\x02";
53072
+ ForgeLexer._serializedATNSegment1 = "\x02\u01DC\u01DD\x07g\x02\x02\u01DD\u01DE\x07e\x02\x02\u01DE\u01DF\x07" +
53073
+ "g\x02\x02\u01DF\u01E0\x07u\x02\x02\u01E0\u01E1\x07u\x02\x02\u01E1\u01E2" +
53074
+ "\x07c\x02\x02\u01E2\u01E3\x07t\x02\x02\u01E3\u01E4\x07{\x02\x02\u01E4" +
53075
+ "h\x03\x02\x02\x02\u01E5\u01E6\x07e\x02\x02\u01E6\u01E7\x07q\x02\x02\u01E7" +
53076
+ "\u01E8\x07p\x02\x02\u01E8\u01E9\x07u\x02\x02\u01E9\u01EA\x07k\x02\x02" +
53077
+ "\u01EA\u01EB\x07u\x02\x02\u01EB\u01EC\x07v\x02\x02\u01EC\u01ED\x07g\x02" +
53078
+ "\x02\u01ED\u01EE\x07p\x02\x02\u01EE\u01EF\x07v\x02\x02\u01EFj\x03\x02" +
53079
+ "\x02\x02\u01F0\u01F1\x07k\x02\x02\u01F1\u01F2\x07p\x02\x02\u01F2\u01F3" +
53080
+ "\x07e\x02\x02\u01F3\u01F4\x07q\x02\x02\u01F4\u01F5\x07p\x02\x02\u01F5" +
53081
+ "\u01F6\x07u\x02\x02\u01F6\u01F7\x07k\x02\x02\u01F7\u01F8\x07u\x02\x02" +
53082
+ "\u01F8\u01F9\x07v\x02\x02\u01F9\u01FA\x07g\x02\x02\u01FA\u01FB\x07p\x02" +
53083
+ "\x02\u01FB\u01FC\x07v\x02\x02\u01FCl\x03\x02\x02\x02\u01FD\u01FE\x07y" +
53084
+ "\x02\x02\u01FE\u01FF\x07k\x02\x02\u01FF\u0200\x07v\x02\x02\u0200\u0201" +
53085
+ "\x07j\x02\x02\u0201n\x03\x02\x02\x02\u0202\u0203\x07n\x02\x02\u0203\u0204" +
53086
+ "\x07g\x02\x02\u0204\u0205\x07v\x02\x02\u0205p\x03\x02\x02\x02\u0206\u0207" +
53087
+ "\x07d\x02\x02\u0207\u0208\x07k\x02\x02\u0208\u0209\x07p\x02\x02\u0209" +
53088
+ "\u020A\x07f\x02\x02\u020Ar\x03\x02\x02\x02\u020B\u020C\x07~\x02\x02\u020C" +
53089
+ "\u0210\x07~\x02\x02\u020D\u020E\x07q\x02\x02\u020E\u0210\x07t\x02\x02" +
53090
+ "\u020F\u020B\x03\x02\x02\x02\u020F\u020D\x03\x02\x02\x02\u0210t\x03\x02" +
53091
+ "\x02\x02\u0211\u0212\x07z\x02\x02\u0212\u0213\x07q\x02\x02\u0213\u0214" +
53092
+ "\x07t\x02\x02\u0214v\x03\x02\x02\x02\u0215\u0216\x07>\x02\x02\u0216\u0217" +
53093
+ "\x07?\x02\x02\u0217\u021C\x07@\x02\x02\u0218\u0219\x07k\x02\x02\u0219" +
53094
+ "\u021A\x07h\x02\x02\u021A\u021C\x07h\x02\x02\u021B\u0215\x03\x02\x02\x02" +
53095
+ "\u021B\u0218\x03\x02\x02\x02\u021Cx\x03\x02\x02\x02\u021D\u021E\x07k\x02" +
53096
+ "\x02\u021E\u021F\x07o\x02\x02\u021F\u0220\x07r\x02\x02\u0220\u0221\x07" +
53097
+ "n\x02\x02\u0221\u0222\x07k\x02\x02\u0222\u0223\x07g\x02\x02\u0223\u0227" +
53098
+ "\x07u\x02\x02\u0224\u0225\x07?\x02\x02\u0225\u0227\x07@\x02\x02\u0226" +
53099
+ "\u021D\x03\x02\x02\x02\u0226\u0224\x03\x02\x02\x02\u0227z\x03\x02\x02" +
53100
+ "\x02\u0228\u0229\x07g\x02\x02\u0229\u022A\x07n\x02\x02\u022A\u022B\x07" +
53101
+ "u\x02\x02\u022B\u022C\x07g\x02\x02\u022C|\x03\x02\x02\x02\u022D\u022E" +
53102
+ "\x07(\x02\x02\u022E\u0233\x07(\x02\x02\u022F\u0230\x07c\x02\x02\u0230" +
53103
+ "\u0231\x07p\x02\x02\u0231\u0233\x07f\x02\x02\u0232\u022D\x03\x02\x02\x02" +
53104
+ "\u0232\u022F\x03\x02\x02\x02\u0233~\x03\x02\x02\x02\u0234\u0235\x07w\x02" +
53105
+ "\x02\u0235\u0236\x07p\x02\x02\u0236\u0237\x07v\x02\x02\u0237\u0238\x07" +
53106
+ "k\x02\x02\u0238\u0239\x07n\x02\x02\u0239\x80\x03\x02\x02\x02\u023A\u023B" +
53107
+ "\x07t\x02\x02\u023B\u023C\x07g\x02\x02\u023C\u023D\x07n\x02\x02\u023D" +
53108
+ "\u023E\x07g\x02\x02\u023E\u023F\x07c\x02\x02\u023F\u0240\x07u\x02\x02" +
53109
+ "\u0240\u0241\x07g\x02\x02\u0241\x82\x03\x02\x02\x02\u0242\u0243\x07u\x02" +
53110
+ "\x02\u0243\u0244\x07k\x02\x02\u0244\u0245\x07p\x02\x02\u0245\u0246\x07" +
53111
+ "e\x02\x02\u0246\u0247\x07g\x02\x02\u0247\x84\x03\x02\x02\x02\u0248\u0249" +
53112
+ "\x07v\x02\x02\u0249\u024A\x07t\x02\x02\u024A\u024B\x07k\x02\x02\u024B" +
53113
+ "\u024C\x07i\x02\x02\u024C\u024D\x07i\x02\x02\u024D\u024E\x07g\x02\x02" +
53114
+ "\u024E\u024F\x07t\x02\x02\u024F\u0250\x07g\x02\x02\u0250\u0251\x07f\x02" +
53115
+ "\x02\u0251\x86\x03\x02\x02\x02\u0252\u0257\x07#\x02\x02\u0253\u0254\x07" +
53116
+ "p\x02\x02\u0254\u0255\x07q\x02\x02\u0255\u0257\x07v\x02\x02\u0256\u0252" +
53117
+ "\x03\x02\x02\x02\u0256\u0253\x03\x02\x02\x02\u0257\x88\x03\x02\x02\x02" +
53118
+ "\u0258\u0259\x07c\x02\x02\u0259\u025A\x07n\x02\x02\u025A\u025B\x07y\x02" +
53119
+ "\x02\u025B\u025C\x07c\x02\x02\u025C\u025D\x07{\x02\x02\u025D\u025E\x07" +
53120
+ "u\x02\x02\u025E\x8A\x03\x02\x02\x02\u025F\u0260\x07g\x02\x02\u0260\u0261" +
53121
+ "\x07x\x02\x02\u0261\u0262\x07g\x02\x02\u0262\u0263\x07p\x02\x02\u0263" +
53122
+ "\u0264\x07v\x02\x02\u0264\u0265\x07w\x02\x02\u0265\u0266\x07c\x02\x02" +
53123
+ "\u0266\u0267\x07n\x02\x02\u0267\u0268\x07n\x02\x02\u0268\u0269\x07{\x02" +
53124
+ "\x02\u0269\x8C\x03\x02\x02\x02\u026A\u026B\x07c\x02\x02\u026B\u026C\x07" +
53125
+ "h\x02\x02\u026C\u026D\x07v\x02\x02\u026D\u026E\x07g\x02\x02\u026E\u026F" +
53126
+ "\x07t\x02\x02\u026F\x8E\x03\x02\x02\x02\u0270\u0271\x07d\x02\x02\u0271" +
53127
+ "\u0272\x07g\x02\x02\u0272\u0273\x07h\x02\x02\u0273\u0274\x07q\x02\x02" +
53128
+ "\u0274\u0275\x07t\x02\x02\u0275\u0276\x07g\x02\x02\u0276\x90\x03\x02\x02" +
53129
+ "\x02\u0277\u0278\x07q\x02\x02\u0278\u0279\x07p\x02\x02\u0279\u027A\x07" +
53130
+ "e\x02\x02\u027A\u027B\x07g\x02\x02\u027B\x92\x03\x02\x02\x02\u027C\u027D" +
53131
+ "\x07j\x02\x02\u027D\u027E\x07k\x02\x02\u027E\u027F\x07u\x02\x02\u027F" +
53132
+ "\u0280\x07v\x02\x02\u0280\u0281\x07q\x02\x02\u0281\u0282\x07t\x02\x02" +
53133
+ "\u0282\u0283\x07k\x02\x02\u0283\u0284\x07e\x02\x02\u0284\u0285\x07c\x02" +
53134
+ "\x02\u0285\u0286\x07n\x02\x02\u0286\u0287\x07n\x02\x02\u0287\u0288\x07" +
53135
+ "{\x02\x02\u0288\x94\x03\x02\x02\x02\u0289\u028A\x07%\x02\x02\u028A\x96" +
53136
+ "\x03\x02\x02\x02\u028B\u028C\x07-\x02\x02\u028C\u028D\x07-\x02\x02\u028D" +
53137
+ "\x98\x03\x02\x02\x02\u028E\u028F\x07(\x02\x02\u028F\x9A\x03\x02\x02\x02" +
53138
+ "\u0290\u0291\x07>\x02\x02\u0291\u0292\x07<\x02\x02\u0292\x9C\x03\x02\x02" +
53139
+ "\x02\u0293\u0294\x07<\x02\x02\u0294\u0295\x07@\x02\x02\u0295\x9E\x03\x02" +
53140
+ "\x02\x02\u0296\u0297\x07)\x02\x02\u0297\xA0\x03\x02\x02\x02\u0298\u0299" +
53141
+ "\x07\x80\x02\x02\u0299\xA2\x03\x02\x02\x02\u029A\u029B\x07`\x02\x02\u029B" +
53142
+ "\xA4\x03\x02\x02\x02\u029C\u029D\x07,\x02\x02\u029D\xA6\x03\x02\x02\x02" +
53143
+ "\u029E\u029F\x07B\x02\x02\u029F\xA8\x03\x02\x02\x02\u02A0\u02A1\x07b\x02" +
53144
+ "\x02\u02A1\xAA\x03\x02\x02\x02\u02A2\u02A3\x07v\x02\x02\u02A3\u02A4\x07" +
53145
+ "j\x02\x02\u02A4\u02A5\x07k\x02\x02\u02A5\u02A6\x07u\x02\x02\u02A6\xAC" +
53146
+ "\x03\x02\x02\x02\u02A7\u02A8\x07u\x02\x02\u02A8\u02A9\x07g\x02\x02\u02A9" +
53147
+ "\u02AA\x07z\x02\x02\u02AA\u02AB\x07r\x02\x02\u02AB\u02AC\x07t\x02\x02" +
53148
+ "\u02AC\xAE\x03\x02\x02\x02\u02AD\u02AE\x07k\x02\x02\u02AE\u02AF\x07p\x02" +
53149
+ "\x02\u02AF\u02B0\x07u\x02\x02\u02B0\u02B1\x07v\x02\x02\u02B1\xB0\x03\x02" +
53150
+ "\x02\x02\u02B2\u02B3\x07g\x02\x02\u02B3\u02B4\x07x\x02\x02\u02B4\u02B5" +
53151
+ "\x07c\x02\x02\u02B5\u02B6\x07n\x02\x02\u02B6\xB2\x03\x02\x02\x02\u02B7" +
53152
+ "\u02B8\x07g\x02\x02\u02B8\u02B9\x07z\x02\x02\u02B9\u02BA\x07c\x02\x02" +
53153
+ "\u02BA\u02BB\x07o\x02\x02\u02BB\u02BC\x07r\x02\x02\u02BC\u02BD\x07n\x02" +
53154
+ "\x02\u02BD\u02BE\x07g\x02\x02\u02BE\xB4\x03\x02\x02\x02\u02BF\u02C0\x07" +
53155
+ "/\x02\x02\u02C0\u02C1\x07@\x02\x02\u02C1\xB6\x03\x02\x02\x02\u02C2\u02C3" +
53156
+ "\x07B\x02\x02\u02C3\u02C4\x07<\x02\x02\u02C4\xB8\x03\x02\x02\x02\u02C5" +
53157
+ "\u02C6\x07B\x02\x02\u02C6\u02C7\x07u\x02\x02\u02C7\u02C8\x07v\x02\x02" +
53158
+ "\u02C8\u02C9\x07t\x02\x02\u02C9\u02CA\x07<\x02\x02\u02CA\xBA\x03\x02\x02" +
53159
+ "\x02\u02CB\u02CC\x07B\x02\x02\u02CC\u02CD\x07d\x02\x02\u02CD\u02CE\x07" +
53160
+ "q\x02\x02\u02CE\u02CF\x07q\x02\x02\u02CF\u02D0\x07n\x02\x02\u02D0\u02D1" +
53161
+ "\x07<\x02\x02\u02D1\xBC\x03\x02\x02\x02\u02D2\u02D3\x07B\x02\x02\u02D3" +
53162
+ "\u02D4\x07p\x02\x02\u02D4\u02D5\x07w\x02\x02\u02D5\u02D6\x07o\x02\x02" +
53163
+ "\u02D6\u02D7\x07<\x02\x02\u02D7\xBE\x03\x02\x02\x02\u02D8\u02D9\x07?\x02" +
53164
+ "\x02\u02D9\xC0\x03\x02\x02\x02\u02DA\u02DB\x07>\x02\x02\u02DB\xC2\x03" +
53165
+ "\x02\x02\x02\u02DC\u02DD\x07@\x02\x02\u02DD\xC4\x03\x02\x02\x02\u02DE" +
53166
+ "\u02DF\x07>\x02\x02\u02DF\u02E3\x07?\x02\x02\u02E0\u02E1\x07?\x02\x02" +
53167
+ "\u02E1\u02E3\x07>\x02\x02\u02E2\u02DE\x03\x02\x02\x02\u02E2\u02E0\x03" +
53168
+ "\x02\x02\x02\u02E3\xC6\x03\x02\x02\x02\u02E4\u02E5\x07@\x02\x02\u02E5" +
53169
+ "\u02E6\x07?\x02\x02\u02E6\xC8\x03\x02\x02\x02\u02E7\u02E8\x07p\x02\x02" +
53170
+ "\u02E8\u02E9\x07k\x02\x02\u02E9\xCA\x03\x02\x02\x02\u02EA\u02EB\x07p\x02" +
53171
+ "\x02\u02EB\u02EC\x07q\x02\x02\u02EC\xCC\x03\x02\x02\x02\u02ED\u02EE\x07" +
53172
+ "u\x02\x02\u02EE\u02EF\x07w\x02\x02\u02EF\u02F0\x07o\x02\x02\u02F0\xCE" +
53173
+ "\x03\x02\x02\x02\u02F1\u02F2\x07K\x02\x02\u02F2\u02F3\x07p\x02\x02\u02F3" +
53174
+ "\u02F4\x07v\x02\x02\u02F4\xD0\x03\x02\x02\x02\u02F5\u02F6\x07q\x02\x02" +
53175
+ "\u02F6\u02F7\x07r\x02\x02\u02F7\u02F8\x07v\x02\x02\u02F8\u02F9\x07k\x02" +
53176
+ "\x02\u02F9\u02FA\x07q\x02\x02\u02FA\u02FB\x07p\x02\x02\u02FB\xD2\x03\x02" +
53177
+ "\x02\x02\u02FC\u02FD\x07.\x02\x02\u02FD\xD4\x03\x02\x02\x02\u02FE\u02FF" +
53178
+ "\x071\x02\x02\u02FF\xD6\x03\x02\x02\x02\u0300\u0302\t\x03\x02\x02\u0301" +
53179
+ "\u0300\x03\x02\x02\x02\u0302\u0303\x03\x02\x02\x02\u0303\u0301\x03\x02" +
53180
+ "\x02\x02\u0303\u0304\x03\x02\x02\x02\u0304\u030B\x03\x02\x02\x02\u0305" +
53181
+ "\u0307\x070\x02\x02\u0306\u0308\t\x03\x02\x02\u0307\u0306\x03\x02\x02" +
53182
+ "\x02\u0308\u0309\x03\x02\x02\x02\u0309\u0307\x03\x02\x02\x02\u0309\u030A" +
53183
+ "\x03\x02\x02\x02\u030A\u030C\x03\x02\x02\x02\u030B\u0305\x03\x02\x02\x02" +
53184
+ "\u030B\u030C\x03\x02\x02\x02\u030C\xD8\x03\x02\x02\x02\u030D\u0311\x07" +
53185
+ "b\x02\x02\u030E\u0312\n\x04\x02\x02\u030F\u0310\x07^\x02\x02\u0310\u0312" +
53186
+ "\v\x02\x02\x02\u0311\u030E\x03\x02\x02\x02\u0311\u030F\x03\x02\x02\x02" +
53187
+ "\u0312\u0313\x03\x02\x02\x02\u0313\u0311\x03\x02\x02\x02\u0313\u0314\x03" +
53188
+ "\x02\x02\x02\u0314\u0315\x03\x02\x02\x02\u0315\u0316\x07b\x02\x02\u0316" +
53189
+ "\xDA\x03\x02\x02\x02\u0317\u031B\t\x05\x02\x02\u0318\u031A\t\x06\x02\x02" +
53190
+ "\u0319\u0318\x03\x02\x02\x02\u031A\u031D\x03\x02\x02\x02\u031B\u0319\x03" +
53191
+ "\x02\x02\x02\u031B\u031C\x03\x02\x02\x02\u031C\xDC\x03\x02\x02\x02\u031D" +
53192
+ "\u031B\x03\x02\x02\x02\u031E\u0320\t\x07\x02\x02\u031F\u031E\x03\x02\x02" +
53193
+ "\x02\u0320\u0321\x03\x02\x02\x02\u0321\u031F\x03\x02\x02\x02\u0321\u0322" +
53194
+ "\x03\x02\x02\x02\u0322\u0323\x03\x02\x02\x02\u0323\u0324\bo\x02\x02\u0324" +
53195
+ "\xDE\x03\x02\x02\x02\u0325\u0326\x071\x02\x02\u0326\u0327\x071\x02\x02" +
53196
+ "\u0327\u032B\x03\x02\x02\x02\u0328\u032A\n\b\x02\x02\u0329\u0328\x03\x02" +
53197
+ "\x02\x02\u032A\u032D\x03\x02\x02\x02\u032B\u0329\x03\x02\x02\x02\u032B" +
53198
+ "\u032C\x03\x02\x02\x02\u032C\u032E\x03\x02\x02\x02\u032D\u032B\x03\x02" +
53199
+ "\x02\x02\u032E\u032F\bp\x03\x02\u032F\xE0\x03\x02\x02\x02\u0330\u0331" +
53200
+ "\x07/\x02\x02\u0331\u0332\x07/\x02\x02\u0332\u0336\x03\x02\x02\x02\u0333" +
53201
+ "\u0335\n\b\x02\x02\u0334\u0333\x03\x02\x02\x02\u0335\u0338\x03\x02\x02" +
53202
+ "\x02\u0336\u0334\x03\x02\x02\x02\u0336\u0337\x03\x02\x02\x02\u0337\u0339" +
53203
+ "\x03\x02\x02\x02\u0338\u0336\x03\x02\x02\x02\u0339\u033A\bq\x03\x02\u033A" +
53204
+ "\xE2\x03\x02\x02\x02\u033B\u033C\x071\x02\x02\u033C\u033D\x07,\x02\x02" +
53205
+ "\u033D\u0341\x03\x02\x02\x02\u033E\u0340\v\x02\x02\x02\u033F\u033E\x03" +
53206
+ "\x02\x02\x02\u0340\u0343\x03\x02\x02\x02\u0341\u0342\x03\x02\x02\x02\u0341" +
53207
+ "\u033F\x03\x02\x02\x02\u0342\u0344\x03\x02\x02\x02\u0343\u0341\x03\x02" +
53208
+ "\x02\x02\u0344\u0345\x07,\x02\x02\u0345\u0346\x071\x02\x02\u0346\u0347" +
53209
+ "\x03\x02\x02\x02\u0347\u0348\br\x03\x02\u0348\xE4\x03\x02\x02\x02\u0349" +
53210
+ "\u034A\x07%\x02\x02\u034A\u034B\x07n\x02\x02\u034B\u034C\x07c\x02\x02" +
53211
+ "\u034C\u034D\x07p\x02\x02\u034D\u034E\x07i\x02\x02\u034E\u0352\x03\x02" +
53212
+ "\x02\x02\u034F\u0351\n\b\x02\x02\u0350\u034F\x03\x02\x02\x02\u0351\u0354" +
53213
+ "\x03\x02\x02\x02\u0352\u0350\x03\x02\x02\x02\u0352\u0353\x03\x02\x02\x02" +
53214
+ "\u0353\u0355\x03\x02\x02\x02\u0354\u0352\x03\x02\x02\x02\u0355\u0356\b" +
53215
+ "s\x03\x02\u0356\xE6\x03\x02\x02\x02\x16\x02\xF7\xF9\u020F\u021B\u0226" +
53216
+ "\u0232\u0256\u02E2\u0303\u0309\u030B\u0311\u0313\u031B\u0321\u032B\u0336" +
53217
+ "\u0341\u0352\x04\b\x02\x02\x02\x03\x02";
52207
53218
  ForgeLexer._serializedATN = Utils.join([
52208
53219
  ForgeLexer._serializedATNSegment0,
52209
53220
  ForgeLexer._serializedATNSegment1,
@@ -52222,6 +53233,7 @@ ForgeLexer._serializedATN = Utils.join([
52222
53233
 
52223
53234
  Object.defineProperty(exports, "__esModule", ({ value: true }));
52224
53235
  exports.ForgeListenerImpl = void 0;
53236
+ const utils_1 = __webpack_require__(/*! ./utils */ "./src/forge-antlr/utils.ts");
52225
53237
  const ForgeSyntaxConstructs_1 = __webpack_require__(/*! ./ForgeSyntaxConstructs */ "./src/forge-antlr/ForgeSyntaxConstructs.ts");
52226
53238
  /*
52227
53239
  We don't really need a whole AST right now right?
@@ -52330,7 +53342,7 @@ class ForgeListenerImpl {
52330
53342
  */
52331
53343
  exitPredDecl(ctx) {
52332
53344
  const { startLine, startColumn, endLine, endColumn } = getLocations(ctx);
52333
- const predName = ctx.name().text;
53345
+ const predName = (0, utils_1.getIdentifierName)(ctx.name());
52334
53346
  // We don't care about the pred type for now (wheat or not.) In fact, this should maybe be removed from FORGE.
52335
53347
  // There is also the PRED qualName that I don't know what to do with here.
52336
53348
  // Ideally, predArgs should look something like this.
@@ -52351,7 +53363,7 @@ class ForgeListenerImpl {
52351
53363
  */
52352
53364
  exitFunDecl(ctx) {
52353
53365
  const { startLine, startColumn, endLine, endColumn } = getLocations(ctx);
52354
- const funName = ctx.name().text;
53366
+ const funName = (0, utils_1.getIdentifierName)(ctx.name());
52355
53367
  let f = new Function(startLine, startColumn, endLine, endColumn, funName);
52356
53368
  this._functions.push(f);
52357
53369
  }
@@ -52361,7 +53373,8 @@ class ForgeListenerImpl {
52361
53373
  */
52362
53374
  exitTestDecl(ctx) {
52363
53375
  const { startLine, startColumn, endLine, endColumn } = getLocations(ctx);
52364
- const testName = ctx.name()?.IDENTIFIER_TOK().text || getRandomName();
53376
+ const nameCtx = ctx.name();
53377
+ const testName = nameCtx ? (0, utils_1.getIdentifierName)(nameCtx) : getRandomName();
52365
53378
  // IGNORE qualName (the alternative to block) for now, unsure what it is. TODO!!
52366
53379
  const testBlock = ctx.block();
52367
53380
  const testBody = testBlock ? getLocationOnlyBlock(testBlock) : undefined;
@@ -52407,7 +53420,7 @@ class ForgeListenerImpl {
52407
53420
  throw new Error("Property relation must be either necessary or sufficient.");
52408
53421
  }
52409
53422
  const expr = getLocationOnlyExpr(ctx.expr());
52410
- const predName = ctx.name().text;
53423
+ const predName = (0, utils_1.getIdentifierName)(ctx.name());
52411
53424
  const testScope = ctx.scope()?.toStringTree(); // This is not ideal, but will do for now.
52412
53425
  const testBounds = ctx.bounds()?.toStringTree(); // This is not ideal, but will do for now.
52413
53426
  const at = new ForgeSyntaxConstructs_1.AssertionTest(startLine, startColumn, endLine, endColumn, predName, expr, rel, testBounds, testScope);
@@ -52432,7 +53445,7 @@ class ForgeListenerImpl {
52432
53445
  }
52433
53446
  let predIndex = (rel === "sufficient") ? 0 : 1;
52434
53447
  let propIndex = (rel === "sufficient") ? 1 : 0;
52435
- const predName = ctx.name().text;
53448
+ const predName = (0, utils_1.getIdentifierName)(ctx.name());
52436
53449
  const expr = getLocationOnlyExpr(ctx.expr());
52437
53450
  let argsT = ctx.exprList();
52438
53451
  let predArgsBlock = (argsT) ? getLocationOnlyBlock(argsT) : undefined;
@@ -52459,7 +53472,7 @@ class ForgeListenerImpl {
52459
53472
  throw new Error("Consistency assertion relation must be either consistent or inconsistent.");
52460
53473
  }
52461
53474
  let consistent = (consistencyType === "consistent") ? true : false;
52462
- const predName = ctx.name().text;
53475
+ const predName = (0, utils_1.getIdentifierName)(ctx.name());
52463
53476
  const expr = getLocationOnlyExpr(ctx.expr());
52464
53477
  const testScope = ctx.scope()?.toStringTree(); // This is not ideal, but will do for now.
52465
53478
  const testBounds = ctx.bounds()?.toStringTree(); // This is not ideal, but will do for now.
@@ -52476,7 +53489,7 @@ class ForgeListenerImpl {
52476
53489
  */
52477
53490
  exitExampleDecl(ctx) {
52478
53491
  const { startLine, startColumn, endLine, endColumn } = getLocations(ctx);
52479
- const exampleName = ctx.name().text;
53492
+ const exampleName = (0, utils_1.getIdentifierName)(ctx.name());
52480
53493
  const testExpr = ctx.expr();
52481
53494
  const testExprBlock = getLocationOnlyBlock(testExpr);
52482
53495
  const bounds = ctx.bounds();
@@ -52504,7 +53517,7 @@ class ForgeListenerImpl {
52504
53517
  }
52505
53518
  // Start the collection from the given context
52506
53519
  collectNames(ctx);
52507
- return names.map(nameCtx => nameCtx.IDENTIFIER_TOK().text);
53520
+ return names.map(nameCtx => (0, utils_1.getIdentifierName)(nameCtx));
52508
53521
  }
52509
53522
  }
52510
53523
  exports.ForgeListenerImpl = ForgeListenerImpl;
@@ -52706,7 +53719,7 @@ class ForgeParser extends Parser_1.Parser {
52706
53719
  this.state = 197;
52707
53720
  this._errHandler.sync(this);
52708
53721
  _la = this._input.LA(1);
52709
- while ((((_la) & ~0x1F) === 0 && ((1 << _la) & ((1 << ForgeParser.VAR_TOK) | (1 << ForgeParser.ABSTRACT_TOK) | (1 << ForgeParser.SIG_TOK) | (1 << ForgeParser.LONE_TOK) | (1 << ForgeParser.SOME_TOK) | (1 << ForgeParser.ONE_TOK) | (1 << ForgeParser.TWO_TOK) | (1 << ForgeParser.PRED_TOK) | (1 << ForgeParser.FUN_TOK) | (1 << ForgeParser.ASSERT_TOK) | (1 << ForgeParser.RUN_TOK) | (1 << ForgeParser.CHECK_TOK))) !== 0) || _la === ForgeParser.TEST_TOK || _la === ForgeParser.EXPECT_TOK || ((((_la - 86)) & ~0x1F) === 0 && ((1 << (_la - 86)) & ((1 << (ForgeParser.SEXPR_TOK - 86)) | (1 << (ForgeParser.INST_TOK - 86)) | (1 << (ForgeParser.EXAMPLE_TOK - 86)) | (1 << (ForgeParser.OPTION_TOK - 86)) | (1 << (ForgeParser.IDENTIFIER_TOK - 86)))) !== 0)) {
53722
+ while ((((_la) & ~0x1F) === 0 && ((1 << _la) & ((1 << ForgeParser.VAR_TOK) | (1 << ForgeParser.ABSTRACT_TOK) | (1 << ForgeParser.SIG_TOK) | (1 << ForgeParser.LONE_TOK) | (1 << ForgeParser.SOME_TOK) | (1 << ForgeParser.ONE_TOK) | (1 << ForgeParser.TWO_TOK) | (1 << ForgeParser.PRED_TOK) | (1 << ForgeParser.FUN_TOK) | (1 << ForgeParser.ASSERT_TOK) | (1 << ForgeParser.RUN_TOK) | (1 << ForgeParser.CHECK_TOK))) !== 0) || _la === ForgeParser.TEST_TOK || _la === ForgeParser.EXPECT_TOK || ((((_la - 86)) & ~0x1F) === 0 && ((1 << (_la - 86)) & ((1 << (ForgeParser.SEXPR_TOK - 86)) | (1 << (ForgeParser.INST_TOK - 86)) | (1 << (ForgeParser.EXAMPLE_TOK - 86)) | (1 << (ForgeParser.OPTION_TOK - 86)) | (1 << (ForgeParser.QUOTED_IDENTIFIER_TOK - 86)) | (1 << (ForgeParser.IDENTIFIER_TOK - 86)))) !== 0)) {
52710
53723
  {
52711
53724
  {
52712
53725
  this.state = 194;
@@ -53031,7 +54044,7 @@ class ForgeParser extends Parser_1.Parser {
53031
54044
  this.state = 263;
53032
54045
  this._errHandler.sync(this);
53033
54046
  _la = this._input.LA(1);
53034
- if (_la === ForgeParser.VAR_TOK || _la === ForgeParser.IDENTIFIER_TOK) {
54047
+ if (_la === ForgeParser.VAR_TOK || _la === ForgeParser.QUOTED_IDENTIFIER_TOK || _la === ForgeParser.IDENTIFIER_TOK) {
53035
54048
  {
53036
54049
  this.state = 262;
53037
54050
  this.arrowDeclList();
@@ -53493,7 +54506,7 @@ class ForgeParser extends Parser_1.Parser {
53493
54506
  this.state = 339;
53494
54507
  this._errHandler.sync(this);
53495
54508
  _la = this._input.LA(1);
53496
- if (_la === ForgeParser.DISJ_TOK || _la === ForgeParser.IDENTIFIER_TOK) {
54509
+ if (_la === ForgeParser.DISJ_TOK || _la === ForgeParser.QUOTED_IDENTIFIER_TOK || _la === ForgeParser.IDENTIFIER_TOK) {
53497
54510
  {
53498
54511
  this.state = 338;
53499
54512
  this.paraDeclList();
@@ -53511,7 +54524,7 @@ class ForgeParser extends Parser_1.Parser {
53511
54524
  this.state = 344;
53512
54525
  this._errHandler.sync(this);
53513
54526
  _la = this._input.LA(1);
53514
- if (_la === ForgeParser.DISJ_TOK || _la === ForgeParser.IDENTIFIER_TOK) {
54527
+ if (_la === ForgeParser.DISJ_TOK || _la === ForgeParser.QUOTED_IDENTIFIER_TOK || _la === ForgeParser.IDENTIFIER_TOK) {
53515
54528
  {
53516
54529
  this.state = 343;
53517
54530
  this.paraDeclList();
@@ -53553,7 +54566,7 @@ class ForgeParser extends Parser_1.Parser {
53553
54566
  this.state = 351;
53554
54567
  this._errHandler.sync(this);
53555
54568
  _la = this._input.LA(1);
53556
- if (_la === ForgeParser.IDENTIFIER_TOK) {
54569
+ if (_la === ForgeParser.QUOTED_IDENTIFIER_TOK || _la === ForgeParser.IDENTIFIER_TOK) {
53557
54570
  {
53558
54571
  this.state = 350;
53559
54572
  this.name();
@@ -53589,7 +54602,7 @@ class ForgeParser extends Parser_1.Parser {
53589
54602
  this.state = 358;
53590
54603
  this._errHandler.sync(this);
53591
54604
  _la = this._input.LA(1);
53592
- if (_la === ForgeParser.IDENTIFIER_TOK) {
54605
+ if (_la === ForgeParser.QUOTED_IDENTIFIER_TOK || _la === ForgeParser.IDENTIFIER_TOK) {
53593
54606
  {
53594
54607
  this.state = 355;
53595
54608
  this.name();
@@ -53689,6 +54702,7 @@ class ForgeParser extends Parser_1.Parser {
53689
54702
  case ForgeParser.THIS_TOK:
53690
54703
  case ForgeParser.SUM_TOK:
53691
54704
  case ForgeParser.INT_TOK:
54705
+ case ForgeParser.QUOTED_IDENTIFIER_TOK:
53692
54706
  case ForgeParser.IDENTIFIER_TOK:
53693
54707
  {
53694
54708
  this.state = 377;
@@ -53778,7 +54792,7 @@ class ForgeParser extends Parser_1.Parser {
53778
54792
  this.state = 396;
53779
54793
  this._errHandler.sync(this);
53780
54794
  _la = this._input.LA(1);
53781
- if (_la === ForgeParser.IDENTIFIER_TOK) {
54795
+ if (_la === ForgeParser.QUOTED_IDENTIFIER_TOK || _la === ForgeParser.IDENTIFIER_TOK) {
53782
54796
  {
53783
54797
  this.state = 395;
53784
54798
  this.name();
@@ -53816,7 +54830,7 @@ class ForgeParser extends Parser_1.Parser {
53816
54830
  this.state = 404;
53817
54831
  this._errHandler.sync(this);
53818
54832
  _la = this._input.LA(1);
53819
- while (_la === ForgeParser.LEFT_CURLY_TOK || ((((_la - 85)) & ~0x1F) === 0 && ((1 << (_la - 85)) & ((1 << (ForgeParser.THIS_TOK - 85)) | (1 << (ForgeParser.SUM_TOK - 85)) | (1 << (ForgeParser.INT_TOK - 85)) | (1 << (ForgeParser.IDENTIFIER_TOK - 85)))) !== 0)) {
54833
+ while (_la === ForgeParser.LEFT_CURLY_TOK || ((((_la - 85)) & ~0x1F) === 0 && ((1 << (_la - 85)) & ((1 << (ForgeParser.THIS_TOK - 85)) | (1 << (ForgeParser.SUM_TOK - 85)) | (1 << (ForgeParser.INT_TOK - 85)) | (1 << (ForgeParser.QUOTED_IDENTIFIER_TOK - 85)) | (1 << (ForgeParser.IDENTIFIER_TOK - 85)))) !== 0)) {
53820
54834
  {
53821
54835
  {
53822
54836
  this.state = 401;
@@ -54490,6 +55504,7 @@ class ForgeParser extends Parser_1.Parser {
54490
55504
  case ForgeParser.SUM_TOK:
54491
55505
  case ForgeParser.INT_TOK:
54492
55506
  case ForgeParser.NUM_CONST_TOK:
55507
+ case ForgeParser.QUOTED_IDENTIFIER_TOK:
54493
55508
  case ForgeParser.IDENTIFIER_TOK:
54494
55509
  break;
54495
55510
  default:
@@ -54592,7 +55607,7 @@ class ForgeParser extends Parser_1.Parser {
54592
55607
  this.state = 536;
54593
55608
  this._errHandler.sync(this);
54594
55609
  _la = this._input.LA(1);
54595
- while (((((_la - 9)) & ~0x1F) === 0 && ((1 << (_la - 9)) & ((1 << (ForgeParser.LEFT_CURLY_TOK - 9)) | (1 << (ForgeParser.LONE_TOK - 9)) | (1 << (ForgeParser.SOME_TOK - 9)) | (1 << (ForgeParser.ONE_TOK - 9)) | (1 << (ForgeParser.TWO_TOK - 9)) | (1 << (ForgeParser.SET_TOK - 9)) | (1 << (ForgeParser.LEFT_PAREN_TOK - 9)) | (1 << (ForgeParser.NONE_TOK - 9)) | (1 << (ForgeParser.UNIV_TOK - 9)) | (1 << (ForgeParser.IDEN_TOK - 9)) | (1 << (ForgeParser.MINUS_TOK - 9)))) !== 0) || ((((_la - 49)) & ~0x1F) === 0 && ((1 << (_la - 49)) & ((1 << (ForgeParser.ALL_TOK - 49)) | (1 << (ForgeParser.LET_TOK - 49)) | (1 << (ForgeParser.BIND_TOK - 49)) | (1 << (ForgeParser.NEG_TOK - 49)) | (1 << (ForgeParser.ALWAYS_TOK - 49)) | (1 << (ForgeParser.EVENTUALLY_TOK - 49)) | (1 << (ForgeParser.AFTER_TOK - 49)) | (1 << (ForgeParser.BEFORE_TOK - 49)) | (1 << (ForgeParser.ONCE_TOK - 49)) | (1 << (ForgeParser.HISTORICALLY_TOK - 49)) | (1 << (ForgeParser.CARD_TOK - 49)) | (1 << (ForgeParser.TILDE_TOK - 49)))) !== 0) || ((((_la - 81)) & ~0x1F) === 0 && ((1 << (_la - 81)) & ((1 << (ForgeParser.EXP_TOK - 81)) | (1 << (ForgeParser.STAR_TOK - 81)) | (1 << (ForgeParser.AT_TOK - 81)) | (1 << (ForgeParser.BACKQUOTE_TOK - 81)) | (1 << (ForgeParser.THIS_TOK - 81)) | (1 << (ForgeParser.SEXPR_TOK - 81)) | (1 << (ForgeParser.GET_LABEL_TOK - 81)) | (1 << (ForgeParser.GET_LABEL_STR_TOK - 81)) | (1 << (ForgeParser.GET_LABEL_BOOL_TOK - 81)) | (1 << (ForgeParser.GET_LABEL_NUM_TOK - 81)) | (1 << (ForgeParser.NO_TOK - 81)) | (1 << (ForgeParser.SUM_TOK - 81)) | (1 << (ForgeParser.INT_TOK - 81)) | (1 << (ForgeParser.NUM_CONST_TOK - 81)) | (1 << (ForgeParser.IDENTIFIER_TOK - 81)))) !== 0)) {
55610
+ while (((((_la - 9)) & ~0x1F) === 0 && ((1 << (_la - 9)) & ((1 << (ForgeParser.LEFT_CURLY_TOK - 9)) | (1 << (ForgeParser.LONE_TOK - 9)) | (1 << (ForgeParser.SOME_TOK - 9)) | (1 << (ForgeParser.ONE_TOK - 9)) | (1 << (ForgeParser.TWO_TOK - 9)) | (1 << (ForgeParser.SET_TOK - 9)) | (1 << (ForgeParser.LEFT_PAREN_TOK - 9)) | (1 << (ForgeParser.NONE_TOK - 9)) | (1 << (ForgeParser.UNIV_TOK - 9)) | (1 << (ForgeParser.IDEN_TOK - 9)) | (1 << (ForgeParser.MINUS_TOK - 9)))) !== 0) || ((((_la - 49)) & ~0x1F) === 0 && ((1 << (_la - 49)) & ((1 << (ForgeParser.ALL_TOK - 49)) | (1 << (ForgeParser.LET_TOK - 49)) | (1 << (ForgeParser.BIND_TOK - 49)) | (1 << (ForgeParser.NEG_TOK - 49)) | (1 << (ForgeParser.ALWAYS_TOK - 49)) | (1 << (ForgeParser.EVENTUALLY_TOK - 49)) | (1 << (ForgeParser.AFTER_TOK - 49)) | (1 << (ForgeParser.BEFORE_TOK - 49)) | (1 << (ForgeParser.ONCE_TOK - 49)) | (1 << (ForgeParser.HISTORICALLY_TOK - 49)) | (1 << (ForgeParser.CARD_TOK - 49)) | (1 << (ForgeParser.TILDE_TOK - 49)))) !== 0) || ((((_la - 81)) & ~0x1F) === 0 && ((1 << (_la - 81)) & ((1 << (ForgeParser.EXP_TOK - 81)) | (1 << (ForgeParser.STAR_TOK - 81)) | (1 << (ForgeParser.AT_TOK - 81)) | (1 << (ForgeParser.BACKQUOTE_TOK - 81)) | (1 << (ForgeParser.THIS_TOK - 81)) | (1 << (ForgeParser.SEXPR_TOK - 81)) | (1 << (ForgeParser.GET_LABEL_TOK - 81)) | (1 << (ForgeParser.GET_LABEL_STR_TOK - 81)) | (1 << (ForgeParser.GET_LABEL_BOOL_TOK - 81)) | (1 << (ForgeParser.GET_LABEL_NUM_TOK - 81)) | (1 << (ForgeParser.NO_TOK - 81)) | (1 << (ForgeParser.SUM_TOK - 81)) | (1 << (ForgeParser.INT_TOK - 81)) | (1 << (ForgeParser.NUM_CONST_TOK - 81)) | (1 << (ForgeParser.QUOTED_IDENTIFIER_TOK - 81)) | (1 << (ForgeParser.IDENTIFIER_TOK - 81)))) !== 0)) {
54596
55611
  {
54597
55612
  {
54598
55613
  this.state = 533;
@@ -54734,6 +55749,7 @@ class ForgeParser extends Parser_1.Parser {
54734
55749
  this._errHandler.sync(this);
54735
55750
  switch (this._input.LA(1)) {
54736
55751
  case ForgeParser.THIS_TOK:
55752
+ case ForgeParser.QUOTED_IDENTIFIER_TOK:
54737
55753
  case ForgeParser.IDENTIFIER_TOK:
54738
55754
  this.enterOuterAlt(_localctx, 1);
54739
55755
  {
@@ -54821,6 +55837,7 @@ class ForgeParser extends Parser_1.Parser {
54821
55837
  case ForgeParser.THIS_TOK:
54822
55838
  case ForgeParser.SUM_TOK:
54823
55839
  case ForgeParser.INT_TOK:
55840
+ case ForgeParser.QUOTED_IDENTIFIER_TOK:
54824
55841
  case ForgeParser.IDENTIFIER_TOK:
54825
55842
  {
54826
55843
  this.state = 571;
@@ -54873,11 +55890,22 @@ class ForgeParser extends Parser_1.Parser {
54873
55890
  name() {
54874
55891
  let _localctx = new NameContext(this._ctx, this.state);
54875
55892
  this.enterRule(_localctx, 76, ForgeParser.RULE_name);
55893
+ let _la;
54876
55894
  try {
54877
55895
  this.enterOuterAlt(_localctx, 1);
54878
55896
  {
54879
55897
  this.state = 579;
54880
- this.match(ForgeParser.IDENTIFIER_TOK);
55898
+ _la = this._input.LA(1);
55899
+ if (!(_la === ForgeParser.QUOTED_IDENTIFIER_TOK || _la === ForgeParser.IDENTIFIER_TOK)) {
55900
+ this._errHandler.recoverInline(this);
55901
+ }
55902
+ else {
55903
+ if (this._input.LA(1) === Token_1.Token.EOF) {
55904
+ this.matchedEOF = true;
55905
+ }
55906
+ this._errHandler.reportMatch(this);
55907
+ this.consume();
55908
+ }
54881
55909
  }
54882
55910
  }
54883
55911
  catch (re) {
@@ -55740,6 +56768,7 @@ class ForgeParser extends Parser_1.Parser {
55740
56768
  case ForgeParser.SUM_TOK:
55741
56769
  case ForgeParser.INT_TOK:
55742
56770
  case ForgeParser.NUM_CONST_TOK:
56771
+ case ForgeParser.QUOTED_IDENTIFIER_TOK:
55743
56772
  case ForgeParser.IDENTIFIER_TOK:
55744
56773
  this.enterOuterAlt(_localctx, 1);
55745
56774
  {
@@ -55934,6 +56963,7 @@ class ForgeParser extends Parser_1.Parser {
55934
56963
  case ForgeParser.SUM_TOK:
55935
56964
  case ForgeParser.INT_TOK:
55936
56965
  case ForgeParser.NUM_CONST_TOK:
56966
+ case ForgeParser.QUOTED_IDENTIFIER_TOK:
55937
56967
  case ForgeParser.IDENTIFIER_TOK:
55938
56968
  this.enterOuterAlt(_localctx, 1);
55939
56969
  {
@@ -56088,6 +57118,7 @@ class ForgeParser extends Parser_1.Parser {
56088
57118
  case ForgeParser.SUM_TOK:
56089
57119
  case ForgeParser.INT_TOK:
56090
57120
  case ForgeParser.NUM_CONST_TOK:
57121
+ case ForgeParser.QUOTED_IDENTIFIER_TOK:
56091
57122
  case ForgeParser.IDENTIFIER_TOK:
56092
57123
  this.enterOuterAlt(_localctx, 1);
56093
57124
  {
@@ -56629,6 +57660,7 @@ class ForgeParser extends Parser_1.Parser {
56629
57660
  case ForgeParser.SUM_TOK:
56630
57661
  case ForgeParser.INT_TOK:
56631
57662
  case ForgeParser.NUM_CONST_TOK:
57663
+ case ForgeParser.QUOTED_IDENTIFIER_TOK:
56632
57664
  case ForgeParser.IDENTIFIER_TOK:
56633
57665
  this.enterOuterAlt(_localctx, 1);
56634
57666
  {
@@ -57127,7 +58159,7 @@ class ForgeParser extends Parser_1.Parser {
57127
58159
  this.state = 939;
57128
58160
  this._errHandler.sync(this);
57129
58161
  _la = this._input.LA(1);
57130
- while (_la === ForgeParser.MINUS_TOK || ((((_la - 74)) & ~0x1F) === 0 && ((1 << (_la - 74)) & ((1 << (ForgeParser.CARD_TOK - 74)) | (1 << (ForgeParser.BACKQUOTE_TOK - 74)) | (1 << (ForgeParser.THIS_TOK - 74)) | (1 << (ForgeParser.NO_TOK - 74)) | (1 << (ForgeParser.SUM_TOK - 74)) | (1 << (ForgeParser.INT_TOK - 74)))) !== 0) || _la === ForgeParser.NUM_CONST_TOK || _la === ForgeParser.IDENTIFIER_TOK) {
58162
+ while (_la === ForgeParser.MINUS_TOK || ((((_la - 74)) & ~0x1F) === 0 && ((1 << (_la - 74)) & ((1 << (ForgeParser.CARD_TOK - 74)) | (1 << (ForgeParser.BACKQUOTE_TOK - 74)) | (1 << (ForgeParser.THIS_TOK - 74)) | (1 << (ForgeParser.NO_TOK - 74)) | (1 << (ForgeParser.SUM_TOK - 74)) | (1 << (ForgeParser.INT_TOK - 74)))) !== 0) || ((((_la - 107)) & ~0x1F) === 0 && ((1 << (_la - 107)) & ((1 << (ForgeParser.NUM_CONST_TOK - 107)) | (1 << (ForgeParser.QUOTED_IDENTIFIER_TOK - 107)) | (1 << (ForgeParser.IDENTIFIER_TOK - 107)))) !== 0)) {
57131
58163
  {
57132
58164
  {
57133
58165
  this.state = 936;
@@ -57146,6 +58178,7 @@ class ForgeParser extends Parser_1.Parser {
57146
58178
  case ForgeParser.THIS_TOK:
57147
58179
  case ForgeParser.SUM_TOK:
57148
58180
  case ForgeParser.INT_TOK:
58181
+ case ForgeParser.QUOTED_IDENTIFIER_TOK:
57149
58182
  case ForgeParser.IDENTIFIER_TOK:
57150
58183
  this.enterOuterAlt(_localctx, 2);
57151
58184
  {
@@ -57306,6 +58339,7 @@ class ForgeParser extends Parser_1.Parser {
57306
58339
  case ForgeParser.THIS_TOK:
57307
58340
  case ForgeParser.SUM_TOK:
57308
58341
  case ForgeParser.INT_TOK:
58342
+ case ForgeParser.QUOTED_IDENTIFIER_TOK:
57309
58343
  case ForgeParser.IDENTIFIER_TOK:
57310
58344
  this.enterOuterAlt(_localctx, 2);
57311
58345
  {
@@ -57550,6 +58584,7 @@ class ForgeParser extends Parser_1.Parser {
57550
58584
  case ForgeParser.THIS_TOK:
57551
58585
  case ForgeParser.SUM_TOK:
57552
58586
  case ForgeParser.INT_TOK:
58587
+ case ForgeParser.QUOTED_IDENTIFIER_TOK:
57553
58588
  case ForgeParser.IDENTIFIER_TOK:
57554
58589
  this.enterOuterAlt(_localctx, 2);
57555
58590
  {
@@ -57842,12 +58877,13 @@ ForgeParser.OPTION_TOK = 104;
57842
58877
  ForgeParser.COMMA_TOK = 105;
57843
58878
  ForgeParser.SLASH_TOK = 106;
57844
58879
  ForgeParser.NUM_CONST_TOK = 107;
57845
- ForgeParser.IDENTIFIER_TOK = 108;
57846
- ForgeParser.WS = 109;
57847
- ForgeParser.CCOMMENT = 110;
57848
- ForgeParser.COMMENT = 111;
57849
- ForgeParser.MULTCOMMENT = 112;
57850
- ForgeParser.LANG_DECL = 113;
58880
+ ForgeParser.QUOTED_IDENTIFIER_TOK = 108;
58881
+ ForgeParser.IDENTIFIER_TOK = 109;
58882
+ ForgeParser.WS = 110;
58883
+ ForgeParser.CCOMMENT = 111;
58884
+ ForgeParser.COMMENT = 112;
58885
+ ForgeParser.MULTCOMMENT = 113;
58886
+ ForgeParser.LANG_DECL = 114;
57851
58887
  ForgeParser.RULE_predDecl = 0;
57852
58888
  ForgeParser.RULE_parseExpr = 1;
57853
58889
  ForgeParser.RULE_alloyModule = 2;
@@ -57986,12 +59022,12 @@ ForgeParser._SYMBOLIC_NAMES = [
57986
59022
  "SEXPR_TOK", "INST_TOK", "EVAL_TOK", "EXAMPLE_TOK", "ARROW_TOK", "GET_LABEL_TOK",
57987
59023
  "GET_LABEL_STR_TOK", "GET_LABEL_BOOL_TOK", "GET_LABEL_NUM_TOK", "EQ_TOK",
57988
59024
  "LT_TOK", "GT_TOK", "LEQ_TOK", "GEQ_TOK", "NI_TOK", "NO_TOK", "SUM_TOK",
57989
- "INT_TOK", "OPTION_TOK", "COMMA_TOK", "SLASH_TOK", "NUM_CONST_TOK", "IDENTIFIER_TOK",
57990
- "WS", "CCOMMENT", "COMMENT", "MULTCOMMENT", "LANG_DECL",
59025
+ "INT_TOK", "OPTION_TOK", "COMMA_TOK", "SLASH_TOK", "NUM_CONST_TOK", "QUOTED_IDENTIFIER_TOK",
59026
+ "IDENTIFIER_TOK", "WS", "CCOMMENT", "COMMENT", "MULTCOMMENT", "LANG_DECL",
57991
59027
  ];
57992
59028
  ForgeParser.VOCABULARY = new VocabularyImpl_1.VocabularyImpl(ForgeParser._LITERAL_NAMES, ForgeParser._SYMBOLIC_NAMES, []);
57993
59029
  ForgeParser._serializedATNSegments = 2;
57994
- ForgeParser._serializedATNSegment0 = "\x03\uC91D\uCABA\u058D\uAFBA\u4F53\u0607\uEA8B\uC241\x03s\u03FC\x04\x02" +
59030
+ ForgeParser._serializedATNSegment0 = "\x03\uC91D\uCABA\u058D\uAFBA\u4F53\u0607\uEA8B\uC241\x03t\u03FC\x04\x02" +
57995
59031
  "\t\x02\x04\x03\t\x03\x04\x04\t\x04\x04\x05\t\x05\x04\x06\t\x06\x04\x07" +
57996
59032
  "\t\x07\x04\b\t\b\x04\t\t\t\x04\n\t\n\x04\v\t\v\x04\f\t\f\x04\r\t\r\x04" +
57997
59033
  "\x0E\t\x0E\x04\x0F\t\x0F\x04\x10\t\x10\x04\x11\t\x11\x04\x12\t\x12\x04" +
@@ -58092,143 +59128,143 @@ ForgeParser._serializedATNSegment0 = "\x03\uC91D\uCABA\u058D\uAFBA\u4F53\u0607\u
58092
59128
  "^\x02`\x02b\x02d\x02f\x02h\x02j\x02l\x02n\x02p\x02r\x02t\x02v\x02x\x02" +
58093
59129
  "z\x02|\x02~\x02\x80\x02\x82\x02\x84\x02\x86\x02\x88\x02\x8A\x02\x8C\x02" +
58094
59130
  "\x8E\x02\x90\x02\x92\x02\x94\x02\x96\x02\x98\x02\x9A\x02\x9C\x02\x9E\x02" +
58095
- "\xA0\x02\xA2\x02\xA4\x02\xA6\x02\xA8\x02\xAA\x02\x02\x10\x03\x02\x10\x13" +
59131
+ "\xA0\x02\xA2\x02\xA4\x02\xA6\x02\xA8\x02\xAA\x02\x02\x11\x03\x02\x10\x13" +
58096
59132
  "\x04\x02\x10\x10\x12\x16\x05\x02\x10\x10\x12\x12\x14\x16\x03\x02 !\x03" +
58097
- "\x02*.\x04\x02*+--\x03\x0245\x03\x0267\x05\x02\x0E\x0E))af\x04\x02\x10" +
58098
- "\x14gg\x04\x02\x0F\x0F((\x03\x02OP\x04\x02RT]`\x04\x02\\\\kk\x02\u044E" +
58099
- "\x02\xAC\x03\x02\x02\x02\x04\xBB\x03\x02\x02\x02\x06\xD0\x03\x02\x02\x02" +
58100
- "\b\xE4\x03\x02\x02\x02\n\xF7\x03\x02\x02\x02\f\xFA\x03\x02\x02\x02\x0E" +
58101
- "\u011A\x03\x02\x02\x02\x10\u011C\x03\x02\x02\x02\x12\u011E\x03\x02\x02" +
58102
- "\x02\x14\u0120\x03\x02\x02\x02\x16\u0123\x03\x02\x02\x02\x18\u012D\x03" +
58103
- "\x02\x02\x02\x1A\u0137\x03\x02\x02\x02\x1C\u013E\x03\x02\x02\x02\x1E\u0140" +
58104
- "\x03\x02\x02\x02 \u015D\x03\x02\x02\x02\"\u015F\x03\x02\x02\x02$\u0168" +
58105
- "\x03\x02\x02\x02&\u0179\x03\x02\x02\x02(\u018A\x03\x02\x02\x02*\u0192" +
58106
- "\x03\x02\x02\x02,\u01A3\x03\x02\x02\x02.\u01A6\x03\x02\x02\x020\u01B2" +
58107
- "\x03\x02\x02\x022\u01B4\x03\x02\x02\x024\u01BF\x03\x02\x02\x026\u01D8" +
58108
- "\x03\x02\x02\x028\u01E5\x03\x02\x02\x02:\u01F2\x03\x02\x02\x02<\u0205" +
58109
- "\x03\x02\x02\x02>\u0209\x03\x02\x02\x02@\u0210\x03\x02\x02\x02B\u0212" +
58110
- "\x03\x02\x02\x02D\u0216\x03\x02\x02\x02F\u0222\x03\x02\x02\x02H\u0228" +
58111
- "\x03\x02\x02\x02J\u0239\x03\x02\x02\x02L\u023B\x03\x02\x02\x02N\u0245" +
58112
- "\x03\x02\x02\x02P\u024C\x03\x02\x02\x02R\u0253\x03\x02\x02\x02T\u025A" +
58113
- "\x03\x02\x02\x02V\u0261\x03\x02\x02\x02X\u0268\x03\x02\x02\x02Z\u026F" +
58114
- "\x03\x02\x02\x02\\\u0276\x03\x02\x02\x02^\u027D\x03\x02\x02\x02`\u028F" +
58115
- "\x03\x02\x02\x02b\u0291\x03\x02\x02\x02d\u029C\x03\x02\x02\x02f\u02A7" +
58116
- "\x03\x02\x02\x02h\u02BA\x03\x02\x02\x02j\u02BC\x03\x02\x02\x02l\u02D8" +
58117
- "\x03\x02\x02\x02n\u02E9\x03\x02\x02\x02p\u02EB\x03\x02\x02\x02r\u02FD" +
58118
- "\x03\x02\x02\x02t\u02FF\x03\x02\x02\x02v\u030D\x03\x02\x02\x02x\u030F" +
58119
- "\x03\x02\x02\x02z\u031A\x03\x02\x02\x02|\u0325\x03\x02\x02\x02~\u0331" +
58120
- "\x03\x02\x02\x02\x80\u033C\x03\x02\x02\x02\x82\u0350\x03\x02\x02\x02\x84" +
58121
- "\u035A\x03\x02\x02\x02\x86\u0367\x03\x02\x02\x02\x88\u037B\x03\x02\x02" +
58122
- "\x02\x8A\u0382\x03\x02\x02\x02\x8C\u0384\x03\x02\x02\x02\x8E\u0386\x03" +
58123
- "\x02\x02\x02\x90\u0388\x03\x02\x02\x02\x92\u038E\x03\x02\x02\x02\x94\u0390" +
58124
- "\x03\x02\x02\x02\x96\u0393\x03\x02\x02\x02\x98\u039A\x03\x02\x02\x02\x9A" +
58125
- "\u03A5\x03\x02\x02\x02\x9C\u03A7\x03\x02\x02\x02\x9E\u03B5\x03\x02\x02" +
58126
- "\x02\xA0\u03BC\x03\x02\x02\x02\xA2\u03C5\x03\x02\x02\x02\xA4\u03D1\x03" +
58127
- "\x02\x02\x02\xA6\u03D9\x03\x02\x02\x02\xA8\u03E9\x03\x02\x02\x02\xAA\u03F9" +
58128
- "\x03\x02\x02\x02\xAC\xAE\x07\x1A\x02\x02\xAD\xAF\x05\x1C\x0F\x02\xAE\xAD" +
58129
- "\x03\x02\x02\x02\xAE\xAF\x03\x02\x02\x02\xAF\xB3\x03\x02\x02\x02\xB0\xB1" +
58130
- "\x05J&\x02\xB1\xB2\x07\x1B\x02\x02\xB2\xB4\x03\x02\x02\x02\xB3\xB0\x03" +
58131
- "\x02\x02\x02\xB3\xB4\x03\x02\x02\x02\xB4\xB5\x03\x02\x02\x02\xB5\xB7\x05" +
58132
- "N(\x02\xB6\xB8\x05 \x11\x02\xB7\xB6\x03\x02\x02\x02\xB7\xB8\x03\x02\x02" +
58133
- "\x02\xB8\xB9\x03\x02\x02\x02\xB9\xBA\x05D#\x02\xBA\x03\x03\x02\x02\x02" +
58134
- "\xBB\xBC\x05`1\x02\xBC\xBD\x07\x02\x02\x03\xBD\x05\x03\x02\x02\x02\xBE" +
58135
- "\xC0\x05\b\x05\x02\xBF\xBE\x03\x02\x02\x02\xC0\xC3\x03\x02\x02\x02\xC1" +
58136
- "\xBF\x03\x02\x02\x02\xC1\xC2\x03\x02\x02\x02\xC2\xC7\x03\x02\x02\x02\xC3" +
58137
- "\xC1\x03\x02\x02\x02\xC4\xC6\x05\n\x06\x02\xC5\xC4\x03\x02\x02\x02\xC6" +
58138
- "\xC9\x03\x02\x02\x02\xC7\xC5\x03\x02\x02\x02\xC7\xC8\x03\x02\x02\x02\xC8" +
58139
- "\xD1\x03\x02\x02\x02\xC9\xC7\x03\x02\x02\x02\xCA\xCC\x05\x94K\x02\xCB" +
58140
- "\xCA\x03\x02\x02\x02\xCC\xCF\x03\x02\x02\x02\xCD\xCB\x03\x02\x02\x02\xCD" +
58141
- "\xCE\x03\x02\x02\x02\xCE\xD1\x03\x02\x02\x02\xCF\xCD\x03\x02\x02\x02\xD0" +
58142
- "\xC1\x03\x02\x02\x02\xD0\xCD\x03\x02\x02\x02\xD1\x07\x03\x02\x02\x02\xD2" +
58143
- "\xD3\x07\x03\x02\x02\xD3\xD8\x05J&\x02\xD4\xD5\x07\x04\x02\x02\xD5\xD6" +
58144
- "\x05R*\x02\xD6\xD7\x07\x05\x02\x02\xD7\xD9\x03\x02\x02\x02\xD8\xD4\x03" +
58145
- "\x02\x02\x02\xD8\xD9\x03\x02\x02\x02\xD9\xDC\x03\x02\x02\x02\xDA\xDB\x07" +
58146
- "\x06\x02\x02\xDB\xDD\x05N(\x02\xDC\xDA\x03\x02\x02\x02\xDC\xDD\x03\x02" +
58147
- "\x02\x02\xDD\xE5\x03\x02\x02\x02\xDE\xDF\x07\x03\x02\x02\xDF\xE2\x07\x07" +
58148
- "\x02\x02\xE0\xE1\x07\x06\x02\x02\xE1\xE3\x05N(\x02\xE2\xE0\x03\x02\x02" +
58149
- "\x02\xE2\xE3\x03\x02\x02\x02\xE3\xE5\x03\x02\x02\x02\xE4\xD2\x03\x02\x02" +
58150
- "\x02\xE4\xDE\x03\x02\x02\x02\xE5\t\x03\x02\x02\x02\xE6\xF8\x05\f\x07\x02" +
58151
- "\xE7\xF8\x05\x02\x02\x02\xE8\xF8\x05\x1E\x10\x02\xE9\xF8\x05\"\x12\x02" +
58152
- "\xEA\xF8\x05$\x13\x02\xEB\xF8\x05(\x15\x02\xEC\xF8\x05\x8CG\x02\xED\xF8" +
58153
- "\x05\x98M\x02\xEE\xF8\x05\x92J\x02\xEF\xF8\x05L\'\x02\xF0\xF8\x05\x90" +
58154
- "I\x02\xF1\xF8\x05\x96L\x02\xF2\xF8\x056\x1C\x02\xF3\xF8\x054\x1B\x02\xF4" +
58155
- "\xF8\x052\x1A\x02\xF5\xF8\x058\x1D\x02\xF6\xF8\x05:\x1E\x02\xF7\xE6\x03" +
58156
- "\x02\x02\x02\xF7\xE7\x03\x02\x02\x02\xF7\xE8\x03\x02\x02\x02\xF7\xE9\x03" +
58157
- "\x02\x02\x02\xF7\xEA\x03\x02\x02\x02\xF7\xEB\x03\x02\x02\x02\xF7\xEC\x03" +
58158
- "\x02\x02\x02\xF7\xED\x03\x02\x02\x02\xF7\xEE\x03\x02\x02\x02\xF7\xEF\x03" +
58159
- "\x02\x02\x02\xF7\xF0\x03\x02\x02\x02\xF7\xF1\x03\x02\x02\x02\xF7\xF2\x03" +
58160
- "\x02\x02\x02\xF7\xF3\x03\x02\x02\x02\xF7\xF4\x03\x02\x02\x02\xF7\xF5\x03" +
58161
- "\x02\x02\x02\xF7\xF6\x03\x02\x02\x02\xF8\v\x03\x02\x02\x02\xF9\xFB\x07" +
58162
- "\b\x02\x02\xFA\xF9\x03\x02\x02\x02\xFA\xFB\x03\x02\x02\x02\xFB\xFD\x03" +
58163
- "\x02\x02\x02\xFC\xFE\x07\t\x02\x02\xFD\xFC\x03\x02\x02\x02\xFD\xFE\x03" +
58164
- "\x02\x02\x02\xFE\u0100\x03\x02\x02\x02\xFF\u0101\x05\x10\t\x02\u0100\xFF" +
58165
- "\x03\x02\x02\x02\u0100\u0101\x03\x02\x02\x02\u0101\u0102\x03\x02\x02\x02" +
58166
- "\u0102\u0103\x07\n\x02\x02\u0103\u0105\x05P)\x02\u0104\u0106\x05\x0E\b" +
58167
- "\x02\u0105\u0104\x03\x02\x02\x02\u0105\u0106\x03\x02\x02\x02\u0106\u0107" +
58168
- "\x03\x02\x02\x02\u0107\u0109\x07\v\x02\x02\u0108\u010A\x05X-\x02\u0109" +
58169
- "\u0108\x03\x02\x02\x02\u0109\u010A\x03\x02\x02\x02\u010A\u010B\x03\x02" +
58170
- "\x02\x02\u010B\u010D\x07\f\x02\x02\u010C\u010E\x05D#\x02\u010D\u010C\x03" +
58171
- "\x02\x02\x02\u010D\u010E\x03\x02\x02\x02\u010E\r\x03\x02\x02\x02\u010F" +
58172
- "\u0110\x07\r\x02\x02\u0110\u011B\x05J&\x02\u0111\u0112\x07\x0E\x02\x02" +
58173
- "\u0112\u0117\x05J&\x02\u0113\u0114\x07\x0F\x02\x02\u0114\u0116\x05J&\x02" +
58174
- "\u0115\u0113\x03\x02\x02\x02\u0116\u0119\x03\x02\x02\x02\u0117\u0115\x03" +
58175
- "\x02\x02\x02\u0117\u0118\x03\x02\x02\x02\u0118\u011B\x03\x02\x02\x02\u0119" +
58176
- "\u0117\x03\x02\x02\x02\u011A\u010F\x03\x02\x02\x02\u011A\u0111\x03\x02" +
58177
- "\x02\x02\u011B\x0F\x03\x02\x02\x02\u011C\u011D\t\x02\x02\x02\u011D\x11" +
58178
- "\x03\x02\x02\x02\u011E\u011F\t\x03\x02\x02\u011F\x13\x03\x02\x02\x02\u0120" +
58179
- "\u0121\t\x04\x02\x02\u0121\x15\x03\x02\x02\x02\u0122\u0124\x07\x17\x02" +
58180
- "\x02\u0123\u0122\x03\x02\x02\x02\u0123\u0124\x03\x02\x02\x02\u0124\u0125" +
58181
- "\x03\x02\x02\x02\u0125\u0126\x05P)\x02\u0126\u0128\x07\x18\x02\x02\u0127" +
58182
- "\u0129\x05\x14\v\x02\u0128\u0127\x03\x02\x02\x02\u0128\u0129\x03\x02\x02" +
58183
- "\x02\u0129\u012A\x03\x02\x02\x02\u012A\u012B\x05`1\x02\u012B\x17\x03\x02" +
58184
- "\x02\x02\u012C\u012E\x07\x17\x02\x02\u012D\u012C\x03\x02\x02\x02\u012D" +
58185
- "\u012E\x03\x02\x02\x02\u012E\u012F\x03\x02\x02\x02\u012F\u0130\x05P)\x02" +
58186
- "\u0130\u0132\x07\x18\x02\x02\u0131\u0133\x07\x14\x02\x02\u0132\u0131\x03" +
58187
- "\x02\x02\x02\u0132\u0133\x03\x02\x02\x02\u0133\u0134\x03\x02\x02\x02\u0134" +
58188
- "\u0135\x05`1\x02\u0135\x19\x03\x02\x02\x02\u0136\u0138\x07\b\x02\x02\u0137" +
58189
- "\u0136\x03\x02\x02\x02\u0137\u0138\x03\x02\x02\x02\u0138\u0139\x03\x02" +
58190
- "\x02\x02\u0139\u013A\x05P)\x02\u013A\u013B\x07\x18\x02\x02\u013B\u013C" +
58191
- "\x05\x12\n\x02\u013C\u013D\x05\x8AF\x02\u013D\x1B\x03\x02\x02\x02\u013E" +
58192
- "\u013F\x07\x19\x02\x02\u013F\x1D\x03\x02\x02\x02\u0140\u0144\x07\x1C\x02" +
58193
- "\x02\u0141\u0142\x05J&\x02\u0142\u0143\x07\x1B\x02\x02\u0143\u0145\x03" +
58194
- "\x02\x02\x02\u0144\u0141\x03\x02\x02\x02\u0144\u0145\x03\x02\x02\x02\u0145" +
58195
- "\u0146\x03\x02\x02\x02\u0146\u0148\x05N(\x02\u0147\u0149\x05 \x11\x02" +
58196
- "\u0148\u0147\x03\x02\x02\x02\u0148\u0149\x03\x02\x02\x02\u0149\u014A\x03" +
58197
- "\x02\x02\x02\u014A\u014C\x07\x18\x02\x02\u014B\u014D\x05\x14\v\x02\u014C" +
58198
- "\u014B\x03\x02\x02\x02\u014C\u014D\x03\x02\x02\x02\u014D\u014E\x03\x02" +
58199
- "\x02\x02\u014E\u014F\x05`1\x02\u014F\u0150\x07\v\x02\x02\u0150\u0151\x05" +
58200
- "`1\x02\u0151\u0152\x07\f\x02\x02\u0152\x1F\x03\x02\x02\x02\u0153\u0155" +
58201
- "\x07\x1D\x02\x02\u0154\u0156\x05T+\x02\u0155\u0154\x03\x02\x02\x02\u0155" +
58202
- "\u0156\x03\x02\x02\x02\u0156\u0157\x03\x02\x02\x02\u0157\u015E\x07\x1E" +
58203
- "\x02\x02\u0158\u015A\x07\x04\x02\x02\u0159\u015B\x05T+\x02\u015A\u0159" +
58204
- "\x03\x02\x02\x02\u015A\u015B\x03\x02\x02\x02\u015B\u015C\x03\x02\x02\x02" +
58205
- "\u015C\u015E\x07\x05\x02\x02\u015D\u0153\x03\x02\x02\x02\u015D\u0158\x03" +
58206
- "\x02\x02\x02\u015E!\x03\x02\x02\x02\u015F\u0161\x07\x1F\x02\x02\u0160" +
58207
- "\u0162\x05N(\x02\u0161\u0160\x03\x02\x02\x02\u0161\u0162\x03\x02\x02\x02" +
58208
- "\u0162\u0163\x03\x02\x02\x02\u0163\u0164\x05D#\x02\u0164#\x03\x02\x02" +
58209
- "\x02\u0165\u0166\x05N(\x02\u0166\u0167\x07\x18\x02\x02\u0167\u0169\x03" +
58210
- "\x02\x02\x02\u0168\u0165\x03\x02\x02\x02\u0168\u0169\x03\x02\x02\x02\u0169" +
58211
- "\u016A\x03\x02\x02\x02\u016A\u016D\t\x05\x02\x02\u016B\u016E\x05J&\x02" +
58212
- "\u016C\u016E\x05D#\x02\u016D\u016B\x03\x02\x02\x02\u016D\u016C\x03\x02" +
58213
- "\x02\x02\u016D\u016E\x03\x02\x02\x02\u016E\u0170\x03\x02\x02\x02\u016F" +
58214
- "\u0171\x05,\x17\x02\u0170\u016F\x03\x02\x02\x02\u0170\u0171\x03\x02\x02" +
58215
- "\x02\u0171\u0174\x03\x02\x02\x02\u0172\u0173\x07\"\x02\x02\u0173\u0175" +
58216
- "\x05\x9EP\x02\u0174\u0172\x03\x02\x02\x02\u0174\u0175\x03\x02\x02\x02" +
58217
- "\u0175%\x03\x02\x02\x02\u0176\u0177\x05N(\x02\u0177\u0178\x07\x18\x02" +
58218
- "\x02\u0178\u017A\x03\x02\x02\x02\u0179\u0176\x03\x02\x02\x02\u0179\u017A" +
58219
- "\x03\x02\x02\x02\u017A\u017D\x03\x02\x02\x02\u017B\u017E\x05J&\x02\u017C" +
58220
- "\u017E\x05D#\x02\u017D\u017B\x03\x02\x02\x02\u017D\u017C\x03\x02\x02\x02" +
58221
- "\u017E\u0180\x03\x02\x02\x02\u017F\u0181\x05,\x17\x02\u0180\u017F\x03" +
58222
- "\x02\x02\x02\u0180\u0181\x03\x02\x02\x02\u0181\u0184\x03\x02\x02\x02\u0182" +
58223
- "\u0183\x07\"\x02\x02\u0183\u0185\x05\x9EP\x02\u0184\u0182\x03\x02\x02" +
58224
- "\x02\u0184\u0185\x03\x02\x02\x02\u0185\u0186\x03\x02\x02\x02\u0186\u0187" +
58225
- "\x07)\x02\x02\u0187\u0188\t\x06\x02\x02\u0188\'\x03\x02\x02\x02\u0189" +
58226
- "\u018B\x07/\x02\x02\u018A\u0189\x03\x02\x02\x02\u018A\u018B\x03\x02\x02" +
58227
- "\x02\u018B\u018C\x03\x02\x02\x02\u018C\u018E\x070\x02\x02\u018D\u018F" +
58228
- "\x05N(\x02\u018E\u018D\x03\x02\x02\x02\u018E\u018F\x03\x02\x02\x02\u018F" +
58229
- "\u0190\x03\x02\x02\x02\u0190\u0191\x05*\x16\x02\u0191)\x03\x02\x02\x02" +
58230
- "\u0192\u0196\x07\v\x02\x02\u0193\u0195\x05&\x14\x02\u0194\u0193\x03\x02" +
58231
- "\x02\x02\u0195\u0198\x03\x02\x02\x02\u0196\u0194\x03\x02\x02\x02\u0196" +
59133
+ "\x02*.\x04\x02*+--\x03\x0245\x03\x0267\x05\x02\x0E\x0E))af\x03\x02no\x04" +
59134
+ "\x02\x10\x14gg\x04\x02\x0F\x0F((\x03\x02OP\x04\x02RT]`\x04\x02\\\\kk\x02" +
59135
+ "\u044E\x02\xAC\x03\x02\x02\x02\x04\xBB\x03\x02\x02\x02\x06\xD0\x03\x02" +
59136
+ "\x02\x02\b\xE4\x03\x02\x02\x02\n\xF7\x03\x02\x02\x02\f\xFA\x03\x02\x02" +
59137
+ "\x02\x0E\u011A\x03\x02\x02\x02\x10\u011C\x03\x02\x02\x02\x12\u011E\x03" +
59138
+ "\x02\x02\x02\x14\u0120\x03\x02\x02\x02\x16\u0123\x03\x02\x02\x02\x18\u012D" +
59139
+ "\x03\x02\x02\x02\x1A\u0137\x03\x02\x02\x02\x1C\u013E\x03\x02\x02\x02\x1E" +
59140
+ "\u0140\x03\x02\x02\x02 \u015D\x03\x02\x02\x02\"\u015F\x03\x02\x02\x02" +
59141
+ "$\u0168\x03\x02\x02\x02&\u0179\x03\x02\x02\x02(\u018A\x03\x02\x02\x02" +
59142
+ "*\u0192\x03\x02\x02\x02,\u01A3\x03\x02\x02\x02.\u01A6\x03\x02\x02\x02" +
59143
+ "0\u01B2\x03\x02\x02\x022\u01B4\x03\x02\x02\x024\u01BF\x03\x02\x02\x02" +
59144
+ "6\u01D8\x03\x02\x02\x028\u01E5\x03\x02\x02\x02:\u01F2\x03\x02\x02\x02" +
59145
+ "<\u0205\x03\x02\x02\x02>\u0209\x03\x02\x02\x02@\u0210\x03\x02\x02\x02" +
59146
+ "B\u0212\x03\x02\x02\x02D\u0216\x03\x02\x02\x02F\u0222\x03\x02\x02\x02" +
59147
+ "H\u0228\x03\x02\x02\x02J\u0239\x03\x02\x02\x02L\u023B\x03\x02\x02\x02" +
59148
+ "N\u0245\x03\x02\x02\x02P\u024C\x03\x02\x02\x02R\u0253\x03\x02\x02\x02" +
59149
+ "T\u025A\x03\x02\x02\x02V\u0261\x03\x02\x02\x02X\u0268\x03\x02\x02\x02" +
59150
+ "Z\u026F\x03\x02\x02\x02\\\u0276\x03\x02\x02\x02^\u027D\x03\x02\x02\x02" +
59151
+ "`\u028F\x03\x02\x02\x02b\u0291\x03\x02\x02\x02d\u029C\x03\x02\x02\x02" +
59152
+ "f\u02A7\x03\x02\x02\x02h\u02BA\x03\x02\x02\x02j\u02BC\x03\x02\x02\x02" +
59153
+ "l\u02D8\x03\x02\x02\x02n\u02E9\x03\x02\x02\x02p\u02EB\x03\x02\x02\x02" +
59154
+ "r\u02FD\x03\x02\x02\x02t\u02FF\x03\x02\x02\x02v\u030D\x03\x02\x02\x02" +
59155
+ "x\u030F\x03\x02\x02\x02z\u031A\x03\x02\x02\x02|\u0325\x03\x02\x02\x02" +
59156
+ "~\u0331\x03\x02\x02\x02\x80\u033C\x03\x02\x02\x02\x82\u0350\x03\x02\x02" +
59157
+ "\x02\x84\u035A\x03\x02\x02\x02\x86\u0367\x03\x02\x02\x02\x88\u037B\x03" +
59158
+ "\x02\x02\x02\x8A\u0382\x03\x02\x02\x02\x8C\u0384\x03\x02\x02\x02\x8E\u0386" +
59159
+ "\x03\x02\x02\x02\x90\u0388\x03\x02\x02\x02\x92\u038E\x03\x02\x02\x02\x94" +
59160
+ "\u0390\x03\x02\x02\x02\x96\u0393\x03\x02\x02\x02\x98\u039A\x03\x02\x02" +
59161
+ "\x02\x9A\u03A5\x03\x02\x02\x02\x9C\u03A7\x03\x02\x02\x02\x9E\u03B5\x03" +
59162
+ "\x02\x02\x02\xA0\u03BC\x03\x02\x02\x02\xA2\u03C5\x03\x02\x02\x02\xA4\u03D1" +
59163
+ "\x03\x02\x02\x02\xA6\u03D9\x03\x02\x02\x02\xA8\u03E9\x03\x02\x02\x02\xAA" +
59164
+ "\u03F9\x03\x02\x02\x02\xAC\xAE\x07\x1A\x02\x02\xAD\xAF\x05\x1C\x0F\x02" +
59165
+ "\xAE\xAD\x03\x02\x02\x02\xAE\xAF\x03\x02\x02\x02\xAF\xB3\x03\x02\x02\x02" +
59166
+ "\xB0\xB1\x05J&\x02\xB1\xB2\x07\x1B\x02\x02\xB2\xB4\x03\x02\x02\x02\xB3" +
59167
+ "\xB0\x03\x02\x02\x02\xB3\xB4\x03\x02\x02\x02\xB4\xB5\x03\x02\x02\x02\xB5" +
59168
+ "\xB7\x05N(\x02\xB6\xB8\x05 \x11\x02\xB7\xB6\x03\x02\x02\x02\xB7\xB8\x03" +
59169
+ "\x02\x02\x02\xB8\xB9\x03\x02\x02\x02\xB9\xBA\x05D#\x02\xBA\x03\x03\x02" +
59170
+ "\x02\x02\xBB\xBC\x05`1\x02\xBC\xBD\x07\x02\x02\x03\xBD\x05\x03\x02\x02" +
59171
+ "\x02\xBE\xC0\x05\b\x05\x02\xBF\xBE\x03\x02\x02\x02\xC0\xC3\x03\x02\x02" +
59172
+ "\x02\xC1\xBF\x03\x02\x02\x02\xC1\xC2\x03\x02\x02\x02\xC2\xC7\x03\x02\x02" +
59173
+ "\x02\xC3\xC1\x03\x02\x02\x02\xC4\xC6\x05\n\x06\x02\xC5\xC4\x03\x02\x02" +
59174
+ "\x02\xC6\xC9\x03\x02\x02\x02\xC7\xC5\x03\x02\x02\x02\xC7\xC8\x03\x02\x02" +
59175
+ "\x02\xC8\xD1\x03\x02\x02\x02\xC9\xC7\x03\x02\x02\x02\xCA\xCC\x05\x94K" +
59176
+ "\x02\xCB\xCA\x03\x02\x02\x02\xCC\xCF\x03\x02\x02\x02\xCD\xCB\x03\x02\x02" +
59177
+ "\x02\xCD\xCE\x03\x02\x02\x02\xCE\xD1\x03\x02\x02\x02\xCF\xCD\x03\x02\x02" +
59178
+ "\x02\xD0\xC1\x03\x02\x02\x02\xD0\xCD\x03\x02\x02\x02\xD1\x07\x03\x02\x02" +
59179
+ "\x02\xD2\xD3\x07\x03\x02\x02\xD3\xD8\x05J&\x02\xD4\xD5\x07\x04\x02\x02" +
59180
+ "\xD5\xD6\x05R*\x02\xD6\xD7\x07\x05\x02\x02\xD7\xD9\x03\x02\x02\x02\xD8" +
59181
+ "\xD4\x03\x02\x02\x02\xD8\xD9\x03\x02\x02\x02\xD9\xDC\x03\x02\x02\x02\xDA" +
59182
+ "\xDB\x07\x06\x02\x02\xDB\xDD\x05N(\x02\xDC\xDA\x03\x02\x02\x02\xDC\xDD" +
59183
+ "\x03\x02\x02\x02\xDD\xE5\x03\x02\x02\x02\xDE\xDF\x07\x03\x02\x02\xDF\xE2" +
59184
+ "\x07\x07\x02\x02\xE0\xE1\x07\x06\x02\x02\xE1\xE3\x05N(\x02\xE2\xE0\x03" +
59185
+ "\x02\x02\x02\xE2\xE3\x03\x02\x02\x02\xE3\xE5\x03\x02\x02\x02\xE4\xD2\x03" +
59186
+ "\x02\x02\x02\xE4\xDE\x03\x02\x02\x02\xE5\t\x03\x02\x02\x02\xE6\xF8\x05" +
59187
+ "\f\x07\x02\xE7\xF8\x05\x02\x02\x02\xE8\xF8\x05\x1E\x10\x02\xE9\xF8\x05" +
59188
+ "\"\x12\x02\xEA\xF8\x05$\x13\x02\xEB\xF8\x05(\x15\x02\xEC\xF8\x05\x8CG" +
59189
+ "\x02\xED\xF8\x05\x98M\x02\xEE\xF8\x05\x92J\x02\xEF\xF8\x05L\'\x02\xF0" +
59190
+ "\xF8\x05\x90I\x02\xF1\xF8\x05\x96L\x02\xF2\xF8\x056\x1C\x02\xF3\xF8\x05" +
59191
+ "4\x1B\x02\xF4\xF8\x052\x1A\x02\xF5\xF8\x058\x1D\x02\xF6\xF8\x05:\x1E\x02" +
59192
+ "\xF7\xE6\x03\x02\x02\x02\xF7\xE7\x03\x02\x02\x02\xF7\xE8\x03\x02\x02\x02" +
59193
+ "\xF7\xE9\x03\x02\x02\x02\xF7\xEA\x03\x02\x02\x02\xF7\xEB\x03\x02\x02\x02" +
59194
+ "\xF7\xEC\x03\x02\x02\x02\xF7\xED\x03\x02\x02\x02\xF7\xEE\x03\x02\x02\x02" +
59195
+ "\xF7\xEF\x03\x02\x02\x02\xF7\xF0\x03\x02\x02\x02\xF7\xF1\x03\x02\x02\x02" +
59196
+ "\xF7\xF2\x03\x02\x02\x02\xF7\xF3\x03\x02\x02\x02\xF7\xF4\x03\x02\x02\x02" +
59197
+ "\xF7\xF5\x03\x02\x02\x02\xF7\xF6\x03\x02\x02\x02\xF8\v\x03\x02\x02\x02" +
59198
+ "\xF9\xFB\x07\b\x02\x02\xFA\xF9\x03\x02\x02\x02\xFA\xFB\x03\x02\x02\x02" +
59199
+ "\xFB\xFD\x03\x02\x02\x02\xFC\xFE\x07\t\x02\x02\xFD\xFC\x03\x02\x02\x02" +
59200
+ "\xFD\xFE\x03\x02\x02\x02\xFE\u0100\x03\x02\x02\x02\xFF\u0101\x05\x10\t" +
59201
+ "\x02\u0100\xFF\x03\x02\x02\x02\u0100\u0101\x03\x02\x02\x02\u0101\u0102" +
59202
+ "\x03\x02\x02\x02\u0102\u0103\x07\n\x02\x02\u0103\u0105\x05P)\x02\u0104" +
59203
+ "\u0106\x05\x0E\b\x02\u0105\u0104\x03\x02\x02\x02\u0105\u0106\x03\x02\x02" +
59204
+ "\x02\u0106\u0107\x03\x02\x02\x02\u0107\u0109\x07\v\x02\x02\u0108\u010A" +
59205
+ "\x05X-\x02\u0109\u0108\x03\x02\x02\x02\u0109\u010A\x03\x02\x02\x02\u010A" +
59206
+ "\u010B\x03\x02\x02\x02\u010B\u010D\x07\f\x02\x02\u010C\u010E\x05D#\x02" +
59207
+ "\u010D\u010C\x03\x02\x02\x02\u010D\u010E\x03\x02\x02\x02\u010E\r\x03\x02" +
59208
+ "\x02\x02\u010F\u0110\x07\r\x02\x02\u0110\u011B\x05J&\x02\u0111\u0112\x07" +
59209
+ "\x0E\x02\x02\u0112\u0117\x05J&\x02\u0113\u0114\x07\x0F\x02\x02\u0114\u0116" +
59210
+ "\x05J&\x02\u0115\u0113\x03\x02\x02\x02\u0116\u0119\x03\x02\x02\x02\u0117" +
59211
+ "\u0115\x03\x02\x02\x02\u0117\u0118\x03\x02\x02\x02\u0118\u011B\x03\x02" +
59212
+ "\x02\x02\u0119\u0117\x03\x02\x02\x02\u011A\u010F\x03\x02\x02\x02\u011A" +
59213
+ "\u0111\x03\x02\x02\x02\u011B\x0F\x03\x02\x02\x02\u011C\u011D\t\x02\x02" +
59214
+ "\x02\u011D\x11\x03\x02\x02\x02\u011E\u011F\t\x03\x02\x02\u011F\x13\x03" +
59215
+ "\x02\x02\x02\u0120\u0121\t\x04\x02\x02\u0121\x15\x03\x02\x02\x02\u0122" +
59216
+ "\u0124\x07\x17\x02\x02\u0123\u0122\x03\x02\x02\x02\u0123\u0124\x03\x02" +
59217
+ "\x02\x02\u0124\u0125\x03\x02\x02\x02\u0125\u0126\x05P)\x02\u0126\u0128" +
59218
+ "\x07\x18\x02\x02\u0127\u0129\x05\x14\v\x02\u0128\u0127\x03\x02\x02\x02" +
59219
+ "\u0128\u0129\x03\x02\x02\x02\u0129\u012A\x03\x02\x02\x02\u012A\u012B\x05" +
59220
+ "`1\x02\u012B\x17\x03\x02\x02\x02\u012C\u012E\x07\x17\x02\x02\u012D\u012C" +
59221
+ "\x03\x02\x02\x02\u012D\u012E\x03\x02\x02\x02\u012E\u012F\x03\x02\x02\x02" +
59222
+ "\u012F\u0130\x05P)\x02\u0130\u0132\x07\x18\x02\x02\u0131\u0133\x07\x14" +
59223
+ "\x02\x02\u0132\u0131\x03\x02\x02\x02\u0132\u0133\x03\x02\x02\x02\u0133" +
59224
+ "\u0134\x03\x02\x02\x02\u0134\u0135\x05`1\x02\u0135\x19\x03\x02\x02\x02" +
59225
+ "\u0136\u0138\x07\b\x02\x02\u0137\u0136\x03\x02\x02\x02\u0137\u0138\x03" +
59226
+ "\x02\x02\x02\u0138\u0139\x03\x02\x02\x02\u0139\u013A\x05P)\x02\u013A\u013B" +
59227
+ "\x07\x18\x02\x02\u013B\u013C\x05\x12\n\x02\u013C\u013D\x05\x8AF\x02\u013D" +
59228
+ "\x1B\x03\x02\x02\x02\u013E\u013F\x07\x19\x02\x02\u013F\x1D\x03\x02\x02" +
59229
+ "\x02\u0140\u0144\x07\x1C\x02\x02\u0141\u0142\x05J&\x02\u0142\u0143\x07" +
59230
+ "\x1B\x02\x02\u0143\u0145\x03\x02\x02\x02\u0144\u0141\x03\x02\x02\x02\u0144" +
59231
+ "\u0145\x03\x02\x02\x02\u0145\u0146\x03\x02\x02\x02\u0146\u0148\x05N(\x02" +
59232
+ "\u0147\u0149\x05 \x11\x02\u0148\u0147\x03\x02\x02\x02\u0148\u0149\x03" +
59233
+ "\x02\x02\x02\u0149\u014A\x03\x02\x02\x02\u014A\u014C\x07\x18\x02\x02\u014B" +
59234
+ "\u014D\x05\x14\v\x02\u014C\u014B\x03\x02\x02\x02\u014C\u014D\x03\x02\x02" +
59235
+ "\x02\u014D\u014E\x03\x02\x02\x02\u014E\u014F\x05`1\x02\u014F\u0150\x07" +
59236
+ "\v\x02\x02\u0150\u0151\x05`1\x02\u0151\u0152\x07\f\x02\x02\u0152\x1F\x03" +
59237
+ "\x02\x02\x02\u0153\u0155\x07\x1D\x02\x02\u0154\u0156\x05T+\x02\u0155\u0154" +
59238
+ "\x03\x02\x02\x02\u0155\u0156\x03\x02\x02\x02\u0156\u0157\x03\x02\x02\x02" +
59239
+ "\u0157\u015E\x07\x1E\x02\x02\u0158\u015A\x07\x04\x02\x02\u0159\u015B\x05" +
59240
+ "T+\x02\u015A\u0159\x03\x02\x02\x02\u015A\u015B\x03\x02\x02\x02\u015B\u015C" +
59241
+ "\x03\x02\x02\x02\u015C\u015E\x07\x05\x02\x02\u015D\u0153\x03\x02\x02\x02" +
59242
+ "\u015D\u0158\x03\x02\x02\x02\u015E!\x03\x02\x02\x02\u015F\u0161\x07\x1F" +
59243
+ "\x02\x02\u0160\u0162\x05N(\x02\u0161\u0160\x03\x02\x02\x02\u0161\u0162" +
59244
+ "\x03\x02\x02\x02\u0162\u0163\x03\x02\x02\x02\u0163\u0164\x05D#\x02\u0164" +
59245
+ "#\x03\x02\x02\x02\u0165\u0166\x05N(\x02\u0166\u0167\x07\x18\x02\x02\u0167" +
59246
+ "\u0169\x03\x02\x02\x02\u0168\u0165\x03\x02\x02\x02\u0168\u0169\x03\x02" +
59247
+ "\x02\x02\u0169\u016A\x03\x02\x02\x02\u016A\u016D\t\x05\x02\x02\u016B\u016E" +
59248
+ "\x05J&\x02\u016C\u016E\x05D#\x02\u016D\u016B\x03\x02\x02\x02\u016D\u016C" +
59249
+ "\x03\x02\x02\x02\u016D\u016E\x03\x02\x02\x02\u016E\u0170\x03\x02\x02\x02" +
59250
+ "\u016F\u0171\x05,\x17\x02\u0170\u016F\x03\x02\x02\x02\u0170\u0171\x03" +
59251
+ "\x02\x02\x02\u0171\u0174\x03\x02\x02\x02\u0172\u0173\x07\"\x02\x02\u0173" +
59252
+ "\u0175\x05\x9EP\x02\u0174\u0172\x03\x02\x02\x02\u0174\u0175\x03\x02\x02" +
59253
+ "\x02\u0175%\x03\x02\x02\x02\u0176\u0177\x05N(\x02\u0177\u0178\x07\x18" +
59254
+ "\x02\x02\u0178\u017A\x03\x02\x02\x02\u0179\u0176\x03\x02\x02\x02\u0179" +
59255
+ "\u017A\x03\x02\x02\x02\u017A\u017D\x03\x02\x02\x02\u017B\u017E\x05J&\x02" +
59256
+ "\u017C\u017E\x05D#\x02\u017D\u017B\x03\x02\x02\x02\u017D\u017C\x03\x02" +
59257
+ "\x02\x02\u017E\u0180\x03\x02\x02\x02\u017F\u0181\x05,\x17\x02\u0180\u017F" +
59258
+ "\x03\x02\x02\x02\u0180\u0181\x03\x02\x02\x02\u0181\u0184\x03\x02\x02\x02" +
59259
+ "\u0182\u0183\x07\"\x02\x02\u0183\u0185\x05\x9EP\x02\u0184\u0182\x03\x02" +
59260
+ "\x02\x02\u0184\u0185\x03\x02\x02\x02\u0185\u0186\x03\x02\x02\x02\u0186" +
59261
+ "\u0187\x07)\x02\x02\u0187\u0188\t\x06\x02\x02\u0188\'\x03\x02\x02\x02" +
59262
+ "\u0189\u018B\x07/\x02\x02\u018A\u0189\x03\x02\x02\x02\u018A\u018B\x03" +
59263
+ "\x02\x02\x02\u018B\u018C\x03\x02\x02\x02\u018C\u018E\x070\x02\x02\u018D" +
59264
+ "\u018F\x05N(\x02\u018E\u018D\x03\x02\x02\x02\u018E\u018F\x03\x02\x02\x02" +
59265
+ "\u018F\u0190\x03\x02\x02\x02\u0190\u0191\x05*\x16\x02\u0191)\x03\x02\x02" +
59266
+ "\x02\u0192\u0196\x07\v\x02\x02\u0193\u0195\x05&\x14\x02\u0194\u0193\x03" +
59267
+ "\x02\x02\x02\u0195\u0198\x03\x02\x02\x02\u0196\u0194\x03\x02\x02\x02\u0196" +
58232
59268
  "\u0197\x03\x02\x02\x02\u0197\u0199\x03\x02\x02\x02\u0198\u0196\x03\x02" +
58233
59269
  "\x02\x02\u0199\u019A\x07\f\x02\x02\u019A+\x03\x02\x02\x02\u019B\u019C" +
58234
59270
  "\x07\"\x02\x02\u019C\u019F\x05\x9CO\x02\u019D\u019E\x07#\x02\x02\u019E" +
@@ -58245,263 +59281,264 @@ ForgeParser._serializedATNSegment0 = "\x03\uC91D\uCABA\u058D\uAFBA\u4F53\u0607\u
58245
59281
  "\u01AF\x03\x02\x02\x02\u01B31\x03\x02\x02\x02\u01B4\u01B5\x07\x1F\x02" +
58246
59282
  "\x02\u01B5\u01B6\x05`1\x02\u01B6\u01B7\x07)\x02\x02\u01B7\u01B9\t\x07" +
58247
59283
  "\x02\x02\u01B8\u01BA\x05,\x17\x02\u01B9\u01B8\x03\x02\x02\x02\u01B9\u01BA" +
58248
- "\x03\x02\x02\x02\u01BA\u01BD\x03\x02\x02\x02\u01BB\u01BC";
58249
- ForgeParser._serializedATNSegment1 = "\x07\"\x02\x02\u01BC\u01BE\x05\x9EP\x02\u01BD\u01BB\x03\x02\x02\x02\u01BD" +
58250
- "\u01BE\x03\x02\x02\x02\u01BE3\x03\x02\x02\x02\u01BF\u01C0\x07\x1F\x02" +
58251
- "\x02\u01C0\u01C2\x073\x02\x02\u01C1\u01C3\x07\x17\x02\x02\u01C2\u01C1" +
58252
- "\x03\x02\x02\x02\u01C2\u01C3\x03\x02\x02\x02\u01C3\u01C4\x03\x02\x02\x02" +
58253
- "\u01C4\u01C5\x05V,\x02\u01C5\u01C6\x072\x02\x02\u01C6\u01C7\x05`1\x02" +
58254
- "\u01C7\u01C8\x07)\x02\x02\u01C8\u01C9\t\b\x02\x02\u01C9\u01CA\x07\"\x02" +
58255
- "\x02\u01CA\u01CF\x05N(\x02\u01CB\u01CC\x07\x04\x02\x02\u01CC\u01CD\x05" +
58256
- "^0\x02\u01CD\u01CE\x07\x05\x02\x02\u01CE\u01D0\x03\x02\x02\x02\u01CF\u01CB" +
58257
- "\x03\x02\x02\x02\u01CF\u01D0\x03\x02\x02\x02\u01D0\u01D2\x03\x02\x02\x02" +
58258
- "\u01D1\u01D3\x05,\x17\x02\u01D2\u01D1\x03\x02\x02\x02\u01D2\u01D3\x03" +
58259
- "\x02\x02\x02\u01D3\u01D6\x03\x02\x02\x02\u01D4\u01D5\x07\"\x02\x02\u01D5" +
58260
- "\u01D7\x05\x9EP\x02\u01D6\u01D4\x03\x02\x02\x02\u01D6\u01D7\x03\x02\x02" +
58261
- "\x02\u01D75\x03\x02\x02\x02\u01D8\u01D9\x07\x1F\x02\x02\u01D9\u01DA\x05" +
58262
- "`1\x02\u01DA\u01DB\x07)\x02\x02\u01DB\u01DC\t\b\x02\x02\u01DC\u01DD\x07" +
58263
- "\"\x02\x02\u01DD\u01DF\x05N(\x02\u01DE\u01E0\x05,\x17\x02\u01DF\u01DE" +
58264
- "\x03\x02\x02\x02\u01DF\u01E0\x03\x02\x02\x02\u01E0\u01E3\x03\x02\x02\x02" +
58265
- "\u01E1\u01E2\x07\"\x02\x02\u01E2\u01E4\x05\x9EP\x02\u01E3\u01E1\x03\x02" +
58266
- "\x02\x02\u01E3\u01E4\x03\x02\x02\x02\u01E47\x03\x02\x02\x02\u01E5\u01E6" +
58267
- "\x07\x1F\x02\x02\u01E6\u01E7\x05`1\x02\u01E7\u01E8\x07)\x02\x02\u01E8" +
58268
- "\u01E9\t\t\x02\x02\u01E9\u01EA\x078\x02\x02\u01EA\u01EC\x05N(\x02\u01EB" +
58269
- "\u01ED\x05,\x17\x02\u01EC\u01EB\x03\x02\x02\x02\u01EC\u01ED\x03\x02\x02" +
58270
- "\x02\u01ED\u01F0\x03\x02\x02\x02\u01EE\u01EF\x07\"\x02\x02\u01EF\u01F1" +
58271
- "\x05\x9EP\x02\u01F0\u01EE\x03\x02\x02\x02\u01F0\u01F1\x03\x02\x02\x02" +
58272
- "\u01F19\x03\x02\x02\x02\u01F2\u01F3\x07/\x02\x02\u01F3\u01F4\x071\x02" +
58273
- "\x02\u01F4\u01F5\x07\"\x02\x02\u01F5\u01F6\x05N(\x02\u01F6\u01FA\x07\v" +
58274
- "\x02\x02\u01F7\u01F9\x05<\x1F\x02\u01F8\u01F7\x03\x02\x02\x02\u01F9\u01FC" +
58275
- "\x03\x02\x02\x02\u01FA\u01F8\x03\x02\x02\x02\u01FA\u01FB\x03\x02\x02\x02" +
58276
- "\u01FB\u01FD\x03\x02\x02\x02\u01FC\u01FA\x03\x02\x02\x02\u01FD\u01FE\x07" +
58277
- "\f\x02\x02\u01FE;\x03\x02\x02\x02\u01FF\u0206\x05\x96L\x02\u0200\u0206" +
58278
- "\x05(\x15\x02\u0201\u0206\x054\x1B\x02\u0202\u0206\x056\x1C\x02\u0203" +
58279
- "\u0206\x052\x1A\x02\u0204\u0206\x058\x1D\x02\u0205\u01FF\x03\x02\x02\x02" +
58280
- "\u0205\u0200\x03\x02\x02\x02\u0205\u0201\x03\x02\x02\x02\u0205\u0202\x03" +
58281
- "\x02\x02\x02\u0205\u0203\x03\x02\x02\x02\u0205\u0204\x03\x02\x02\x02\u0206" +
58282
- "=\x03\x02\x02\x02\u0207\u020A\x05\x10\t\x02\u0208\u020A\x07\x14\x02\x02" +
58283
- "\u0209\u0207\x03\x02\x02\x02\u0209\u0208\x03\x02\x02\x02\u0209\u020A\x03" +
58284
- "\x02\x02\x02\u020A\u020B\x03\x02\x02\x02\u020B\u020E\x07\\\x02\x02\u020C" +
58285
- "\u020F\x05\x10\t\x02\u020D\u020F\x07\x14\x02\x02\u020E\u020C\x03\x02\x02" +
58286
- "\x02\u020E\u020D\x03\x02\x02\x02\u020E\u020F\x03\x02\x02\x02\u020F?\x03" +
58287
- "\x02\x02\x02\u0210\u0211\t\n\x02\x02\u0211A\x03\x02\x02\x02\u0212\u0213" +
58288
- "\x05N(\x02\u0213\u0214\x07a\x02\x02\u0214\u0215\x05`1\x02\u0215C\x03\x02" +
58289
- "\x02\x02\u0216\u021A\x07\v\x02\x02\u0217\u0219\x05`1\x02\u0218\u0217\x03" +
58290
- "\x02\x02\x02\u0219\u021C\x03\x02\x02\x02\u021A\u0218\x03\x02\x02\x02\u021A" +
58291
- "\u021B\x03\x02\x02\x02\u021B\u021D\x03\x02\x02\x02\u021C\u021A\x03\x02" +
58292
- "\x02\x02\u021D\u021E\x07\f\x02\x02\u021EE\x03\x02\x02\x02\u021F\u0223" +
58293
- "\x05D#\x02\u0220\u0221\x072\x02\x02\u0221\u0223\x05`1\x02\u0222\u021F" +
58294
- "\x03\x02\x02\x02\u0222\u0220\x03\x02\x02\x02\u0223G\x03\x02\x02\x02\u0224" +
58295
- "\u0229\x073\x02\x02\u0225\u0229\x07g\x02\x02\u0226\u0229\x07h\x02\x02" +
58296
- "\u0227\u0229\x05\x10\t\x02\u0228\u0224\x03\x02\x02\x02\u0228\u0225\x03" +
58297
- "\x02\x02\x02\u0228\u0226\x03\x02\x02\x02\u0228\u0227\x03\x02\x02\x02\u0229" +
58298
- "I\x03\x02\x02\x02\u022A\u022B\x07W\x02\x02\u022B\u022D\x07l\x02\x02\u022C" +
58299
- "\u022A\x03\x02\x02\x02\u022C\u022D\x03\x02\x02\x02\u022D\u0233\x03\x02" +
58300
- "\x02\x02\u022E\u022F\x05N(\x02\u022F\u0230\x07l\x02\x02\u0230\u0232\x03" +
58301
- "\x02\x02\x02\u0231\u022E\x03\x02\x02\x02\u0232\u0235\x03\x02\x02\x02\u0233" +
58302
- "\u0231\x03\x02\x02\x02\u0233\u0234\x03\x02\x02\x02\u0234\u0236\x03\x02" +
58303
- "\x02\x02\u0235\u0233\x03\x02\x02\x02\u0236\u023A\x05N(\x02\u0237\u023A" +
58304
- "\x07i\x02\x02\u0238\u023A\x07h\x02\x02\u0239\u022C\x03\x02\x02\x02\u0239" +
58305
- "\u0237\x03\x02\x02\x02\u0239\u0238\x03\x02\x02\x02\u023AK\x03\x02\x02" +
58306
- "\x02\u023B\u023C\x07j\x02\x02\u023C\u0243\x05J&\x02\u023D\u0244\x05J&" +
58307
- "\x02\u023E\u0244\x07\x07\x02\x02\u023F\u0241\x07(\x02\x02\u0240\u023F" +
58308
- "\x03\x02\x02\x02\u0240\u0241\x03\x02\x02\x02\u0241\u0242\x03\x02\x02\x02" +
58309
- "\u0242\u0244\x05\x9CO\x02\u0243\u023D\x03\x02\x02\x02\u0243\u023E\x03" +
58310
- "\x02\x02\x02\u0243\u0240\x03\x02\x02\x02\u0244M\x03\x02\x02\x02\u0245" +
58311
- "\u0246\x07n\x02\x02\u0246O\x03\x02\x02\x02\u0247\u024D\x05N(\x02\u0248" +
58312
- "\u0249\x05N(\x02\u0249\u024A\x07k\x02\x02\u024A\u024B\x05P)\x02\u024B" +
58313
- "\u024D\x03\x02\x02\x02\u024C\u0247\x03\x02\x02\x02\u024C\u0248\x03\x02" +
58314
- "\x02\x02\u024DQ\x03\x02\x02\x02\u024E\u0254\x05J&\x02\u024F\u0250\x05" +
58315
- "J&\x02\u0250\u0251\x07k\x02\x02\u0251\u0252\x05R*\x02\u0252\u0254\x03" +
58316
- "\x02\x02\x02\u0253\u024E\x03\x02\x02\x02\u0253\u024F\x03\x02\x02\x02\u0254" +
58317
- "S\x03\x02\x02\x02\u0255\u025B\x05\x16\f\x02\u0256\u0257\x05\x16\f\x02" +
58318
- "\u0257\u0258\x07k\x02\x02\u0258\u0259\x05T+\x02\u0259\u025B\x03\x02\x02" +
58319
- "\x02\u025A\u0255\x03\x02\x02\x02\u025A\u0256\x03\x02\x02\x02\u025BU\x03" +
58320
- "\x02\x02\x02\u025C\u0262\x05\x18\r\x02\u025D\u025E\x05\x18\r\x02\u025E" +
58321
- "\u025F\x07k\x02\x02\u025F\u0260\x05V,\x02\u0260\u0262\x03\x02\x02\x02" +
58322
- "\u0261\u025C\x03\x02\x02\x02\u0261\u025D\x03\x02\x02\x02\u0262W\x03\x02" +
58323
- "\x02\x02\u0263\u0269\x05\x1A\x0E\x02\u0264\u0265\x05\x1A\x0E\x02\u0265" +
58324
- "\u0266\x07k\x02\x02\u0266\u0267\x05X-\x02\u0267\u0269\x03\x02\x02\x02" +
58325
- "\u0268\u0263\x03\x02\x02\x02\u0268\u0264\x03\x02\x02\x02\u0269Y\x03\x02" +
58326
- "\x02\x02\u026A\u0270\x05B\"\x02\u026B\u026C\x05B\"\x02\u026C\u026D\x07" +
58327
- "k\x02\x02\u026D\u026E\x05Z.\x02\u026E\u0270\x03\x02\x02\x02\u026F\u026A" +
58328
- "\x03\x02\x02\x02\u026F\u026B\x03\x02\x02\x02\u0270[\x03\x02\x02\x02\u0271" +
58329
- "\u0277\x05.\x18\x02\u0272\u0273\x05.\x18\x02\u0273\u0274\x07k\x02\x02" +
58330
- "\u0274\u0275\x05\\/\x02\u0275\u0277\x03\x02\x02\x02\u0276\u0271\x03\x02" +
58331
- "\x02\x02\u0276\u0272\x03\x02\x02\x02\u0277]\x03\x02\x02\x02\u0278\u027E" +
58332
- "\x05`1\x02\u0279\u027A\x05`1\x02\u027A\u027B\x07k\x02\x02\u027B\u027C" +
58333
- "\x05^0\x02\u027C\u027E\x03\x02\x02\x02\u027D\u0278\x03\x02\x02\x02\u027D" +
58334
- "\u0279\x03\x02\x02\x02\u027E_\x03\x02\x02\x02\u027F\u0290\x05b2\x02\u0280" +
58335
- "\u0281\x079\x02\x02\u0281\u0282\x05Z.\x02\u0282\u0283\x05F$\x02\u0283" +
58336
- "\u0290\x03\x02\x02\x02\u0284\u0285\x07:\x02\x02\u0285\u0286\x05Z.\x02" +
58337
- "\u0286\u0287\x05F$\x02\u0287\u0290\x03\x02\x02\x02\u0288\u028A\x05H%\x02" +
58338
- "\u0289\u028B\x07\x17\x02\x02\u028A\u0289\x03\x02\x02\x02\u028A\u028B\x03" +
58339
- "\x02\x02\x02\u028B\u028C\x03\x02\x02\x02\u028C\u028D\x05V,\x02\u028D\u028E" +
58340
- "\x05F$\x02\u028E\u0290\x03\x02\x02\x02\u028F\u027F\x03\x02\x02\x02\u028F" +
58341
- "\u0280\x03\x02\x02\x02\u028F\u0284\x03\x02\x02\x02\u028F\u0288\x03\x02" +
58342
- "\x02\x02\u0290a\x03\x02\x02\x02\u0291\u0292\b2\x01\x02\u0292\u0293\x05" +
58343
- "d3\x02\u0293\u0299\x03\x02\x02\x02\u0294\u0295\f\x03\x02\x02\u0295\u0296" +
58344
- "\x07;\x02\x02\u0296\u0298\x05d3\x02\u0297\u0294\x03\x02\x02\x02\u0298" +
58345
- "\u029B\x03\x02\x02\x02\u0299\u0297\x03\x02\x02\x02\u0299\u029A\x03\x02" +
58346
- "\x02\x02\u029Ac\x03\x02\x02\x02\u029B\u0299\x03\x02\x02\x02\u029C\u029D" +
58347
- "\b3\x01\x02\u029D\u029E\x05f4\x02\u029E\u02A4\x03\x02\x02\x02\u029F\u02A0" +
58348
- "\f\x03\x02\x02\u02A0\u02A1\x07<\x02\x02\u02A1\u02A3\x05f4\x02\u02A2\u029F" +
58349
- "\x03\x02\x02\x02\u02A3\u02A6\x03\x02\x02\x02\u02A4\u02A2\x03\x02\x02\x02" +
58350
- "\u02A4\u02A5\x03\x02\x02\x02\u02A5e\x03\x02\x02\x02\u02A6\u02A4\x03\x02" +
58351
- "\x02\x02\u02A7\u02A8\b4\x01\x02\u02A8\u02A9\x05h5\x02\u02A9\u02AF\x03" +
58352
- "\x02\x02\x02\u02AA\u02AB\f\x03\x02\x02\u02AB\u02AC\x07=\x02\x02\u02AC" +
58353
- "\u02AE\x05h5\x02\u02AD\u02AA\x03\x02\x02\x02\u02AE\u02B1\x03\x02\x02\x02" +
58354
- "\u02AF\u02AD\x03\x02\x02\x02\u02AF\u02B0\x03\x02\x02\x02\u02B0g\x03\x02" +
58355
- "\x02\x02\u02B1\u02AF\x03\x02\x02\x02\u02B2\u02BB\x05j6\x02\u02B3\u02B4" +
58356
- "\x05j6\x02\u02B4\u02B5\x07>\x02\x02\u02B5\u02B8\x05h5\x02\u02B6\u02B7" +
58357
- "\x07?\x02\x02\u02B7\u02B9\x05h5\x02\u02B8\u02B6\x03\x02\x02\x02\u02B8" +
58358
- "\u02B9\x03\x02\x02\x02\u02B9\u02BB\x03\x02\x02\x02\u02BA\u02B2\x03\x02" +
58359
- "\x02\x02\u02BA\u02B3\x03\x02\x02\x02\u02BBi\x03\x02\x02\x02\u02BC\u02BD" +
58360
- "\b6\x01\x02\u02BD\u02BE\x05l7\x02\u02BE\u02C4\x03\x02\x02\x02\u02BF\u02C0" +
58361
- "\f\x03\x02\x02\u02C0\u02C1\x07@\x02\x02\u02C1\u02C3\x05l7\x02\u02C2\u02BF" +
58362
- "\x03\x02\x02\x02\u02C3\u02C6\x03\x02\x02\x02\u02C4\u02C2\x03\x02\x02\x02" +
58363
- "\u02C4\u02C5\x03\x02\x02\x02\u02C5k\x03\x02\x02\x02\u02C6\u02C4\x03\x02" +
58364
- "\x02\x02\u02C7\u02D9\x05n8\x02\u02C8\u02C9\x05n8\x02\u02C9\u02CA\x07A" +
58365
- "\x02\x02\u02CA\u02CB\x05n8\x02\u02CB\u02D9\x03\x02\x02\x02\u02CC\u02CD" +
58366
- "\x05n8\x02\u02CD\u02CE\x07B\x02\x02\u02CE\u02CF\x05n8\x02\u02CF\u02D9" +
58367
- "\x03\x02\x02\x02\u02D0\u02D1\x05n8\x02\u02D1\u02D2\x07C\x02\x02\u02D2" +
58368
- "\u02D3\x05n8\x02\u02D3\u02D9\x03\x02\x02\x02\u02D4\u02D5\x05n8\x02\u02D5" +
58369
- "\u02D6\x07D\x02\x02\u02D6\u02D7\x05n8\x02\u02D7\u02D9\x03\x02\x02\x02" +
58370
- "\u02D8\u02C7\x03\x02\x02\x02\u02D8\u02C8\x03\x02\x02\x02\u02D8\u02CC\x03" +
58371
- "\x02\x02\x02\u02D8\u02D0\x03\x02\x02\x02\u02D8\u02D4\x03\x02\x02\x02\u02D9" +
58372
- "m\x03\x02\x02\x02\u02DA\u02EA\x05p9\x02\u02DB\u02DC\x07E\x02\x02\u02DC" +
58373
- "\u02EA\x05n8\x02\u02DD\u02DE\x07F\x02\x02\u02DE\u02EA\x05n8\x02\u02DF" +
58374
- "\u02E0\x07G\x02\x02\u02E0\u02EA\x05n8\x02\u02E1\u02E2\x07H\x02\x02\u02E2" +
58375
- "\u02EA\x05n8\x02\u02E3\u02E4\x07I\x02\x02\u02E4\u02EA\x05n8\x02\u02E5" +
58376
- "\u02E6\x07J\x02\x02\u02E6\u02EA\x05n8\x02\u02E7\u02E8\x07K\x02\x02\u02E8" +
58377
- "\u02EA\x05n8\x02\u02E9\u02DA\x03\x02\x02\x02\u02E9\u02DB\x03\x02\x02\x02" +
58378
- "\u02E9\u02DD\x03\x02\x02\x02\u02E9\u02DF\x03\x02\x02\x02\u02E9\u02E1\x03" +
58379
- "\x02\x02\x02\u02E9\u02E3\x03\x02\x02\x02\u02E9\u02E5\x03\x02\x02\x02\u02E9" +
58380
- "\u02E7\x03\x02\x02\x02\u02EAo\x03\x02\x02\x02\u02EB\u02EC\b9\x01\x02\u02EC" +
58381
- "\u02ED\x05r:\x02\u02ED\u02F7\x03\x02\x02\x02\u02EE\u02F0\f\x03\x02\x02" +
58382
- "\u02EF\u02F1\x07E\x02\x02\u02F0\u02EF\x03\x02\x02\x02\u02F0\u02F1\x03" +
58383
- "\x02\x02\x02\u02F1\u02F2\x03\x02\x02\x02\u02F2\u02F3\x05@!\x02\u02F3\u02F4" +
58384
- "\x05r:\x02\u02F4\u02F6\x03\x02\x02\x02\u02F5\u02EE\x03\x02\x02\x02\u02F6" +
58385
- "\u02F9\x03\x02\x02\x02\u02F7\u02F5\x03\x02\x02\x02\u02F7\u02F8\x03\x02" +
58386
- "\x02\x02\u02F8q\x03\x02\x02\x02\u02F9\u02F7\x03\x02\x02\x02\u02FA\u02FE" +
58387
- "\x05t;\x02\u02FB\u02FC\t\v\x02\x02\u02FC\u02FE\x05t;\x02\u02FD\u02FA\x03" +
58388
- "\x02\x02\x02\u02FD\u02FB\x03\x02\x02\x02\u02FEs\x03\x02\x02\x02\u02FF" +
58389
- "\u0300\b;\x01\x02\u0300\u0301\x05v<\x02\u0301\u0307\x03\x02\x02\x02\u0302" +
58390
- "\u0303\f\x03\x02\x02\u0303\u0304\t\f\x02\x02\u0304\u0306\x05x=\x02\u0305" +
58391
- "\u0302\x03\x02\x02\x02\u0306\u0309\x03\x02\x02\x02\u0307\u0305\x03\x02" +
58392
- "\x02\x02\u0307\u0308\x03\x02\x02\x02\u0308u\x03\x02\x02\x02\u0309\u0307" +
58393
- "\x03\x02\x02\x02\u030A\u030E\x05x=\x02\u030B\u030C\x07L\x02\x02\u030C" +
58394
- "\u030E\x05v<\x02\u030D\u030A\x03\x02\x02\x02\u030D\u030B\x03\x02\x02\x02" +
58395
- "\u030Ew\x03\x02\x02\x02\u030F\u0310\b=\x01\x02\u0310\u0311\x05z>\x02\u0311" +
58396
- "\u0317\x03\x02\x02\x02\u0312\u0313\f\x03\x02\x02\u0313\u0314\x07M\x02" +
58397
- "\x02\u0314\u0316\x05z>\x02\u0315\u0312\x03\x02\x02\x02\u0316\u0319\x03" +
58398
- "\x02\x02\x02\u0317\u0315\x03\x02\x02\x02\u0317\u0318\x03\x02\x02\x02\u0318" +
58399
- "y\x03\x02\x02\x02\u0319\u0317\x03\x02\x02\x02\u031A\u031B\b>\x01\x02\u031B" +
58400
- "\u031C\x05|?\x02\u031C\u0322\x03\x02\x02\x02\u031D\u031E\f\x03\x02\x02" +
58401
- "\u031E\u031F\x07N\x02\x02\u031F\u0321\x05|?\x02\u0320\u031D\x03\x02\x02" +
58402
- "\x02\u0321\u0324\x03\x02\x02\x02\u0322\u0320\x03\x02\x02\x02\u0322\u0323" +
58403
- "\x03\x02\x02\x02\u0323{\x03\x02\x02\x02\u0324\u0322\x03\x02\x02\x02\u0325" +
58404
- "\u0326\b?\x01\x02\u0326\u0327\x05~@\x02\u0327\u032E\x03\x02\x02\x02\u0328" +
58405
- "\u0329\f\x03\x02\x02\u0329\u032A\x05> \x02\u032A\u032B\x05~@\x02\u032B" +
58406
- "\u032D\x03\x02\x02\x02\u032C\u0328\x03\x02\x02\x02\u032D\u0330\x03\x02" +
58407
- "\x02\x02\u032E\u032C\x03\x02\x02\x02\u032E\u032F\x03\x02\x02\x02\u032F" +
58408
- "}\x03\x02\x02\x02\u0330\u032E\x03\x02\x02\x02\u0331\u0332\b@\x01\x02\u0332" +
58409
- "\u0333\x05\x80A\x02\u0333\u0339\x03\x02\x02\x02\u0334\u0335\f\x03\x02" +
58410
- "\x02\u0335\u0336\t\r\x02\x02\u0336\u0338\x05\x80A\x02\u0337\u0334\x03" +
58411
- "\x02\x02\x02\u0338\u033B\x03\x02\x02\x02\u0339\u0337\x03\x02\x02\x02\u0339" +
58412
- "\u033A\x03\x02\x02\x02\u033A\x7F\x03\x02\x02\x02\u033B\u0339\x03\x02\x02" +
58413
- "\x02\u033C\u033D\bA\x01\x02\u033D\u033E\x05\x82B\x02\u033E\u0346\x03\x02" +
58414
- "\x02\x02\u033F\u0340\f\x03\x02\x02\u0340\u0341\x07\x04\x02\x02\u0341\u0342" +
58415
- "\x05^0\x02\u0342\u0343\x07\x05\x02\x02\u0343\u0345\x03\x02\x02\x02\u0344" +
58416
- "\u033F\x03\x02\x02\x02\u0345\u0348\x03\x02\x02\x02\u0346\u0344\x03\x02" +
58417
- "\x02\x02\u0346\u0347\x03\x02\x02\x02\u0347\x81\x03\x02\x02\x02\u0348\u0346" +
58418
- "\x03\x02\x02\x02\u0349\u034A\bB\x01\x02\u034A\u0351\x05\x84C\x02\u034B" +
58419
- "\u034C\x05N(\x02\u034C\u034D\x07\x04\x02\x02\u034D\u034E\x05^0\x02\u034E" +
58420
- "\u034F\x07\x05\x02\x02\u034F\u0351\x03\x02\x02\x02\u0350\u0349\x03\x02" +
58421
- "\x02\x02\u0350\u034B\x03\x02\x02\x02\u0351\u0357\x03\x02\x02\x02\u0352" +
58422
- "\u0353\f\x04\x02\x02\u0353\u0354\x07\x1B\x02\x02\u0354\u0356\x05\x84C" +
58423
- "\x02\u0355\u0352\x03\x02\x02\x02\u0356\u0359\x03\x02\x02\x02\u0357\u0355" +
58424
- "\x03\x02\x02\x02\u0357\u0358\x03\x02\x02\x02\u0358\x83\x03\x02\x02\x02" +
58425
- "\u0359\u0357\x03\x02\x02\x02\u035A\u035B\bC\x01\x02\u035B\u035C\x05\x86" +
58426
- "D\x02\u035C\u0361\x03\x02\x02\x02\u035D\u035E\f\x03\x02\x02\u035E\u0360" +
58427
- "\x07Q\x02\x02\u035F\u035D\x03\x02\x02\x02\u0360\u0363\x03\x02\x02\x02" +
58428
- "\u0361\u035F\x03\x02\x02\x02\u0361\u0362\x03\x02\x02\x02\u0362\x85\x03" +
58429
- "\x02\x02\x02\u0363\u0361\x03\x02\x02\x02\u0364\u0368\x05\x88E\x02\u0365" +
58430
- "\u0366\t\x0E\x02\x02\u0366\u0368\x05\x86D\x02\u0367\u0364\x03\x02\x02" +
58431
- "\x02\u0367\u0365\x03\x02\x02\x02\u0368\x87\x03\x02\x02\x02\u0369\u037C" +
58432
- "\x050\x19\x02\u036A\u037C\x05J&\x02\u036B\u036C\x07U\x02\x02\u036C\u037C" +
58433
- "\x05N(\x02\u036D\u036E\x07V\x02\x02\u036E\u037C\x05N(\x02\u036F\u037C" +
58434
- "\x07W\x02\x02\u0370\u0371\x07\v\x02\x02\u0371\u0372\x05V,\x02\u0372\u0373" +
58435
- "\x05F$\x02\u0373\u0374\x07\f\x02\x02\u0374\u037C\x03\x02\x02\x02\u0375" +
58436
- "\u0376\x07\x1D\x02\x02\u0376\u0377\x05`1\x02\u0377\u0378\x07\x1E\x02\x02" +
58437
- "\u0378\u037C\x03\x02\x02\x02\u0379\u037C\x05D#\x02\u037A\u037C\x05\x8E" +
58438
- "H\x02\u037B\u0369\x03\x02\x02\x02\u037B\u036A\x03\x02\x02\x02\u037B\u036B" +
58439
- "\x03\x02\x02\x02\u037B\u036D\x03\x02\x02\x02\u037B\u036F\x03\x02\x02\x02" +
58440
- "\u037B\u0370\x03\x02\x02\x02\u037B\u0375\x03\x02\x02\x02\u037B\u0379\x03" +
58441
- "\x02\x02\x02\u037B\u037A\x03\x02\x02\x02\u037C\x89\x03\x02\x02\x02\u037D" +
58442
- "\u0383\x05J&\x02\u037E\u037F\x05J&\x02\u037F\u0380\x07\\\x02\x02\u0380" +
58443
- "\u0381\x05\x8AF\x02\u0381\u0383\x03\x02\x02\x02\u0382\u037D\x03\x02\x02" +
58444
- "\x02\u0382\u037E\x03\x02\x02\x02\u0383\x8B\x03\x02\x02\x02\u0384\u0385" +
58445
- "\x05\x8EH\x02\u0385\x8D\x03\x02\x02\x02\u0386\u0387\x07X\x02\x02\u0387" +
58446
- "\x8F\x03\x02\x02\x02\u0388\u0389\x07Y\x02\x02\u0389\u038A\x05N(\x02\u038A" +
58447
- "\u038C\x05\x9EP\x02\u038B\u038D\x05,\x17\x02\u038C\u038B\x03\x02\x02\x02" +
58448
- "\u038C\u038D\x03\x02\x02\x02\u038D\x91\x03\x02\x02\x02\u038E\u038F\x05" +
58449
- "\x1A\x0E\x02\u038F\x93\x03\x02\x02\x02\u0390\u0391\x07Z\x02\x02\u0391" +
58450
- "\u0392\x05`1\x02\u0392\x95\x03\x02\x02\x02\u0393\u0394\x07[\x02\x02\u0394" +
58451
- "\u0395\x05N(\x02\u0395\u0396\x07)\x02\x02\u0396\u0397\x05`1\x02\u0397" +
58452
- "\u0398\x07\"\x02\x02\u0398\u0399\x05\x9EP\x02\u0399\x97\x03\x02\x02\x02" +
58453
- "\u039A\u039B\x05N(\x02\u039B\u039C\x07\x18\x02\x02\u039C\u039D\x05\x8A" +
58454
- "F\x02\u039D\u039E\x07a\x02\x02\u039E\u039F\x05`1\x02\u039F\x99\x03\x02" +
58455
- "\x02\x02\u03A0\u03A6\x05\x9CO\x02\u03A1\u03A2\x05\x9CO\x02\u03A2\u03A3" +
58456
- "\x07k\x02\x02\u03A3\u03A4\x05\x9AN\x02\u03A4\u03A6\x03\x02\x02\x02\u03A5" +
58457
- "\u03A0\x03\x02\x02\x02\u03A5\u03A1\x03\x02\x02\x02\u03A6\x9B\x03\x02\x02" +
58458
- "\x02\u03A7\u03A8\x07m\x02\x02\u03A8\x9D\x03\x02\x02\x02\u03A9\u03AD\x07" +
58459
- "\v\x02\x02\u03AA\u03AC\x05\xA2R\x02\u03AB\u03AA\x03\x02\x02\x02\u03AC" +
58460
- "\u03AF\x03\x02\x02\x02\u03AD\u03AB\x03\x02\x02\x02\u03AD\u03AE\x03\x02" +
58461
- "\x02\x02\u03AE\u03B0\x03\x02\x02\x02\u03AF\u03AD\x03\x02\x02\x02\u03B0" +
58462
- "\u03B6\x07\f\x02\x02\u03B1\u03B3\x07$\x02\x02\u03B2\u03B1\x03\x02\x02" +
58463
- "\x02\u03B2\u03B3\x03\x02\x02\x02\u03B3\u03B4\x03\x02\x02\x02\u03B4\u03B6" +
58464
- "\x05J&\x02\u03B5\u03A9\x03\x02\x02\x02\u03B5\u03B2\x03\x02\x02\x02\u03B6" +
58465
- "\x9F\x03\x02\x02\x02\u03B7\u03B8\x07V\x02\x02\u03B8\u03BD\x05N(\x02\u03B9" +
58466
- "\u03BD\x05\x9CO\x02\u03BA\u03BB\x07(\x02\x02\u03BB\u03BD\x05\x9CO\x02" +
58467
- "\u03BC\u03B7\x03\x02\x02\x02\u03BC\u03B9\x03\x02\x02\x02\u03BC\u03BA\x03" +
58468
- "\x02\x02\x02\u03BD\xA1\x03\x02\x02\x02\u03BE\u03BF\x05\xA4S\x02\u03BF" +
58469
- "\u03C0\x05@!\x02\u03C0\u03C1\x05\xA6T\x02\u03C1\u03C6\x03\x02\x02\x02" +
58470
- "\u03C2\u03C3\x07g\x02\x02\u03C3\u03C6\x05\xA4S\x02\u03C4\u03C6\x05J&\x02" +
58471
- "\u03C5\u03BE\x03\x02\x02\x02\u03C5\u03C2\x03\x02\x02\x02\u03C5\u03C4\x03" +
58472
- "\x02\x02\x02\u03C6\xA3\x03\x02\x02\x02\u03C7\u03C8\x07L\x02\x02\u03C8" +
58473
- "\u03D2\x05J&\x02\u03C9\u03D2\x05J&\x02\u03CA\u03CD\x05\xA0Q\x02\u03CB" +
58474
- "\u03CC\x07\x1B\x02\x02\u03CC\u03CE\x05J&\x02\u03CD\u03CB\x03\x02\x02\x02" +
58475
- "\u03CE\u03CF\x03\x02\x02\x02\u03CF\u03CD\x03\x02\x02\x02\u03CF\u03D0\x03" +
58476
- "\x02\x02\x02\u03D0\u03D2\x03\x02\x02\x02\u03D1\u03C7\x03\x02\x02\x02\u03D1" +
58477
- "\u03C9\x03\x02\x02\x02\u03D1\u03CA\x03\x02\x02\x02\u03D2\xA5\x03\x02\x02" +
58478
- "\x02\u03D3\u03D4\bT\x01\x02\u03D4\u03DA\x05\xA8U\x02\u03D5\u03D6\x07\x1D" +
58479
- "\x02\x02\u03D6\u03D7\x05\xA6T\x02\u03D7\u03D8\x07\x1E\x02\x02\u03D8\u03DA" +
58480
- "\x03\x02\x02\x02\u03D9\u03D3\x03\x02\x02\x02\u03D9\u03D5\x03\x02\x02\x02" +
58481
- "\u03DA\u03E0\x03\x02\x02\x02\u03DB\u03DC\f\x04\x02\x02\u03DC\u03DD\x07" +
58482
- "\x0F\x02\x02\u03DD\u03DF\x05\xA8U\x02\u03DE\u03DB\x03\x02\x02\x02\u03DF" +
58483
- "\u03E2\x03\x02\x02\x02\u03E0\u03DE\x03\x02\x02\x02\u03E0\u03E1\x03\x02" +
58484
- "\x02\x02\u03E1\xA7\x03\x02\x02\x02\u03E2\u03E0\x03\x02\x02\x02\u03E3\u03E4" +
58485
- "\bU\x01\x02\u03E4\u03E5\x07\x1D\x02\x02\u03E5\u03E6\x05\xA8U\x02\u03E6" +
58486
- "\u03E7\x07\x1E\x02\x02\u03E7\u03EA\x03\x02\x02\x02\u03E8\u03EA\x05\xAA" +
58487
- "V\x02\u03E9\u03E3\x03\x02\x02\x02\u03E9\u03E8\x03\x02\x02\x02\u03EA\u03F0" +
58488
- "\x03\x02\x02\x02\u03EB\u03EC\f\x04\x02\x02\u03EC\u03ED\t\x0F\x02\x02\u03ED" +
58489
- "\u03EF\x05\xAAV\x02\u03EE\u03EB\x03\x02\x02\x02\u03EF\u03F2\x03\x02\x02" +
58490
- "\x02\u03F0\u03EE\x03\x02\x02\x02\u03F0\u03F1\x03\x02\x02\x02\u03F1\xA9" +
58491
- "\x03\x02\x02\x02\u03F2\u03F0\x03\x02\x02\x02\u03F3\u03FA\x05\xA0Q\x02" +
58492
- "\u03F4\u03FA\x05J&\x02\u03F5\u03F6\x07\x1D\x02\x02\u03F6\u03F7\x05\xA6" +
58493
- "T\x02\u03F7\u03F8\x07\x1E\x02\x02\u03F8\u03FA\x03\x02\x02\x02\u03F9\u03F3" +
58494
- "\x03\x02\x02\x02\u03F9\u03F4\x03\x02\x02\x02\u03F9\u03F5\x03\x02\x02\x02" +
58495
- "\u03FA\xAB\x03\x02\x02\x02x\xAE\xB3\xB7\xC1\xC7\xCD\xD0\xD8\xDC\xE2\xE4" +
58496
- "\xF7\xFA\xFD\u0100\u0105\u0109\u010D\u0117\u011A\u0123\u0128\u012D\u0132" +
58497
- "\u0137\u0144\u0148\u014C\u0155\u015A\u015D\u0161\u0168\u016D\u0170\u0174" +
58498
- "\u0179\u017D\u0180\u0184\u018A\u018E\u0196\u019F\u01A3\u01A6\u01AF\u01B2" +
58499
- "\u01B9\u01BD\u01C2\u01CF\u01D2\u01D6\u01DF\u01E3\u01EC\u01F0\u01FA\u0205" +
58500
- "\u0209\u020E\u021A\u0222\u0228\u022C\u0233\u0239\u0240\u0243\u024C\u0253" +
58501
- "\u025A\u0261\u0268\u026F\u0276\u027D\u028A\u028F\u0299\u02A4\u02AF\u02B8" +
58502
- "\u02BA\u02C4\u02D8\u02E9\u02F0\u02F7\u02FD\u0307\u030D\u0317\u0322\u032E" +
58503
- "\u0339\u0346\u0350\u0357\u0361\u0367\u037B\u0382\u038C\u03A5\u03AD\u03B2" +
58504
- "\u03B5\u03BC\u03C5\u03CF\u03D1\u03D9\u03E0\u03E9\u03F0\u03F9";
59284
+ "\x03\x02\x02\x02\u01BA\u01BD\x03\x02";
59285
+ ForgeParser._serializedATNSegment1 = "\x02\x02\u01BB\u01BC\x07\"\x02\x02\u01BC\u01BE\x05\x9EP\x02\u01BD\u01BB" +
59286
+ "\x03\x02\x02\x02\u01BD\u01BE\x03\x02\x02\x02\u01BE3\x03\x02\x02\x02\u01BF" +
59287
+ "\u01C0\x07\x1F\x02\x02\u01C0\u01C2\x073\x02\x02\u01C1\u01C3\x07\x17\x02" +
59288
+ "\x02\u01C2\u01C1\x03\x02\x02\x02\u01C2\u01C3\x03\x02\x02\x02\u01C3\u01C4" +
59289
+ "\x03\x02\x02\x02\u01C4\u01C5\x05V,\x02\u01C5\u01C6\x072\x02\x02\u01C6" +
59290
+ "\u01C7\x05`1\x02\u01C7\u01C8\x07)\x02\x02\u01C8\u01C9\t\b\x02\x02\u01C9" +
59291
+ "\u01CA\x07\"\x02\x02\u01CA\u01CF\x05N(\x02\u01CB\u01CC\x07\x04\x02\x02" +
59292
+ "\u01CC\u01CD\x05^0\x02\u01CD\u01CE\x07\x05\x02\x02\u01CE\u01D0\x03\x02" +
59293
+ "\x02\x02\u01CF\u01CB\x03\x02\x02\x02\u01CF\u01D0\x03\x02\x02\x02\u01D0" +
59294
+ "\u01D2\x03\x02\x02\x02\u01D1\u01D3\x05,\x17\x02\u01D2\u01D1\x03\x02\x02" +
59295
+ "\x02\u01D2\u01D3\x03\x02\x02\x02\u01D3\u01D6\x03\x02\x02\x02\u01D4\u01D5" +
59296
+ "\x07\"\x02\x02\u01D5\u01D7\x05\x9EP\x02\u01D6\u01D4\x03\x02\x02\x02\u01D6" +
59297
+ "\u01D7\x03\x02\x02\x02\u01D75\x03\x02\x02\x02\u01D8\u01D9\x07\x1F\x02" +
59298
+ "\x02\u01D9\u01DA\x05`1\x02\u01DA\u01DB\x07)\x02\x02\u01DB\u01DC\t\b\x02" +
59299
+ "\x02\u01DC\u01DD\x07\"\x02\x02\u01DD\u01DF\x05N(\x02\u01DE\u01E0\x05," +
59300
+ "\x17\x02\u01DF\u01DE\x03\x02\x02\x02\u01DF\u01E0\x03\x02\x02\x02\u01E0" +
59301
+ "\u01E3\x03\x02\x02\x02\u01E1\u01E2\x07\"\x02\x02\u01E2\u01E4\x05\x9EP" +
59302
+ "\x02\u01E3\u01E1\x03\x02\x02\x02\u01E3\u01E4\x03\x02\x02\x02\u01E47\x03" +
59303
+ "\x02\x02\x02\u01E5\u01E6\x07\x1F\x02\x02\u01E6\u01E7\x05`1\x02\u01E7\u01E8" +
59304
+ "\x07)\x02\x02\u01E8\u01E9\t\t\x02\x02\u01E9\u01EA\x078\x02\x02\u01EA\u01EC" +
59305
+ "\x05N(\x02\u01EB\u01ED\x05,\x17\x02\u01EC\u01EB\x03\x02\x02\x02\u01EC" +
59306
+ "\u01ED\x03\x02\x02\x02\u01ED\u01F0\x03\x02\x02\x02\u01EE\u01EF\x07\"\x02" +
59307
+ "\x02\u01EF\u01F1\x05\x9EP\x02\u01F0\u01EE\x03\x02\x02\x02\u01F0\u01F1" +
59308
+ "\x03\x02\x02\x02\u01F19\x03\x02\x02\x02\u01F2\u01F3\x07/\x02\x02\u01F3" +
59309
+ "\u01F4\x071\x02\x02\u01F4\u01F5\x07\"\x02\x02\u01F5\u01F6\x05N(\x02\u01F6" +
59310
+ "\u01FA\x07\v\x02\x02\u01F7\u01F9\x05<\x1F\x02\u01F8\u01F7\x03\x02\x02" +
59311
+ "\x02\u01F9\u01FC\x03\x02\x02\x02\u01FA\u01F8\x03\x02\x02\x02\u01FA\u01FB" +
59312
+ "\x03\x02\x02\x02\u01FB\u01FD\x03\x02\x02\x02\u01FC\u01FA\x03\x02\x02\x02" +
59313
+ "\u01FD\u01FE\x07\f\x02\x02\u01FE;\x03\x02\x02\x02\u01FF\u0206\x05\x96" +
59314
+ "L\x02\u0200\u0206\x05(\x15\x02\u0201\u0206\x054\x1B\x02\u0202\u0206\x05" +
59315
+ "6\x1C\x02\u0203\u0206\x052\x1A\x02\u0204\u0206\x058\x1D\x02\u0205\u01FF" +
59316
+ "\x03\x02\x02\x02\u0205\u0200\x03\x02\x02\x02\u0205\u0201\x03\x02\x02\x02" +
59317
+ "\u0205\u0202\x03\x02\x02\x02\u0205\u0203\x03\x02\x02\x02\u0205\u0204\x03" +
59318
+ "\x02\x02\x02\u0206=\x03\x02\x02\x02\u0207\u020A\x05\x10\t\x02\u0208\u020A" +
59319
+ "\x07\x14\x02\x02\u0209\u0207\x03\x02\x02\x02\u0209\u0208\x03\x02\x02\x02" +
59320
+ "\u0209\u020A\x03\x02\x02\x02\u020A\u020B\x03\x02\x02\x02\u020B\u020E\x07" +
59321
+ "\\\x02\x02\u020C\u020F\x05\x10\t\x02\u020D\u020F\x07\x14\x02\x02\u020E" +
59322
+ "\u020C\x03\x02\x02\x02\u020E\u020D\x03\x02\x02\x02\u020E\u020F\x03\x02" +
59323
+ "\x02\x02\u020F?\x03\x02\x02\x02\u0210\u0211\t\n\x02\x02\u0211A\x03\x02" +
59324
+ "\x02\x02\u0212\u0213\x05N(\x02\u0213\u0214\x07a\x02\x02\u0214\u0215\x05" +
59325
+ "`1\x02\u0215C\x03\x02\x02\x02\u0216\u021A\x07\v\x02\x02\u0217\u0219\x05" +
59326
+ "`1\x02\u0218\u0217\x03\x02\x02\x02\u0219\u021C\x03\x02\x02\x02\u021A\u0218" +
59327
+ "\x03\x02\x02\x02\u021A\u021B\x03\x02\x02\x02\u021B\u021D\x03\x02\x02\x02" +
59328
+ "\u021C\u021A\x03\x02\x02\x02\u021D\u021E\x07\f\x02\x02\u021EE\x03\x02" +
59329
+ "\x02\x02\u021F\u0223\x05D#\x02\u0220\u0221\x072\x02\x02\u0221\u0223\x05" +
59330
+ "`1\x02\u0222\u021F\x03\x02\x02\x02\u0222\u0220\x03\x02\x02\x02\u0223G" +
59331
+ "\x03\x02\x02\x02\u0224\u0229\x073\x02\x02\u0225\u0229\x07g\x02\x02\u0226" +
59332
+ "\u0229\x07h\x02\x02\u0227\u0229\x05\x10\t\x02\u0228\u0224\x03\x02\x02" +
59333
+ "\x02\u0228\u0225\x03\x02\x02\x02\u0228\u0226\x03\x02\x02\x02\u0228\u0227" +
59334
+ "\x03\x02\x02\x02\u0229I\x03\x02\x02\x02\u022A\u022B\x07W\x02\x02\u022B" +
59335
+ "\u022D\x07l\x02\x02\u022C\u022A\x03\x02\x02\x02\u022C\u022D\x03\x02\x02" +
59336
+ "\x02\u022D\u0233\x03\x02\x02\x02\u022E\u022F\x05N(\x02\u022F\u0230\x07" +
59337
+ "l\x02\x02\u0230\u0232\x03\x02\x02\x02\u0231\u022E\x03\x02\x02\x02\u0232" +
59338
+ "\u0235\x03\x02\x02\x02\u0233\u0231\x03\x02\x02\x02\u0233\u0234\x03\x02" +
59339
+ "\x02\x02\u0234\u0236\x03\x02\x02\x02\u0235\u0233\x03\x02\x02\x02\u0236" +
59340
+ "\u023A\x05N(\x02\u0237\u023A\x07i\x02\x02\u0238\u023A\x07h\x02\x02\u0239" +
59341
+ "\u022C\x03\x02\x02\x02\u0239\u0237\x03\x02\x02\x02\u0239\u0238\x03\x02" +
59342
+ "\x02\x02\u023AK\x03\x02\x02\x02\u023B\u023C\x07j\x02\x02\u023C\u0243\x05" +
59343
+ "J&\x02\u023D\u0244\x05J&\x02\u023E\u0244\x07\x07\x02\x02\u023F\u0241\x07" +
59344
+ "(\x02\x02\u0240\u023F\x03\x02\x02\x02\u0240\u0241\x03\x02\x02\x02\u0241" +
59345
+ "\u0242\x03\x02\x02\x02\u0242\u0244\x05\x9CO\x02\u0243\u023D\x03\x02\x02" +
59346
+ "\x02\u0243\u023E\x03\x02\x02\x02\u0243\u0240\x03\x02\x02\x02\u0244M\x03" +
59347
+ "\x02\x02\x02\u0245\u0246\t\v\x02\x02\u0246O\x03\x02\x02\x02\u0247\u024D" +
59348
+ "\x05N(\x02\u0248\u0249\x05N(\x02\u0249\u024A\x07k\x02\x02\u024A\u024B" +
59349
+ "\x05P)\x02\u024B\u024D\x03\x02\x02\x02\u024C\u0247\x03\x02\x02\x02\u024C" +
59350
+ "\u0248\x03\x02\x02\x02\u024DQ\x03\x02\x02\x02\u024E\u0254\x05J&\x02\u024F" +
59351
+ "\u0250\x05J&\x02\u0250\u0251\x07k\x02\x02\u0251\u0252\x05R*\x02\u0252" +
59352
+ "\u0254\x03\x02\x02\x02\u0253\u024E\x03\x02\x02\x02\u0253\u024F\x03\x02" +
59353
+ "\x02\x02\u0254S\x03\x02\x02\x02\u0255\u025B\x05\x16\f\x02\u0256\u0257" +
59354
+ "\x05\x16\f\x02\u0257\u0258\x07k\x02\x02\u0258\u0259\x05T+\x02\u0259\u025B" +
59355
+ "\x03\x02\x02\x02\u025A\u0255\x03\x02\x02\x02\u025A\u0256\x03\x02\x02\x02" +
59356
+ "\u025BU\x03\x02\x02\x02\u025C\u0262\x05\x18\r\x02\u025D\u025E\x05\x18" +
59357
+ "\r\x02\u025E\u025F\x07k\x02\x02\u025F\u0260\x05V,\x02\u0260\u0262\x03" +
59358
+ "\x02\x02\x02\u0261\u025C\x03\x02\x02\x02\u0261\u025D\x03\x02\x02\x02\u0262" +
59359
+ "W\x03\x02\x02\x02\u0263\u0269\x05\x1A\x0E\x02\u0264\u0265\x05\x1A\x0E" +
59360
+ "\x02\u0265\u0266\x07k\x02\x02\u0266\u0267\x05X-\x02\u0267\u0269\x03\x02" +
59361
+ "\x02\x02\u0268\u0263\x03\x02\x02\x02\u0268\u0264\x03\x02\x02\x02\u0269" +
59362
+ "Y\x03\x02\x02\x02\u026A\u0270\x05B\"\x02\u026B\u026C\x05B\"\x02\u026C" +
59363
+ "\u026D\x07k\x02\x02\u026D\u026E\x05Z.\x02\u026E\u0270\x03\x02\x02\x02" +
59364
+ "\u026F\u026A\x03\x02\x02\x02\u026F\u026B\x03\x02\x02\x02\u0270[\x03\x02" +
59365
+ "\x02\x02\u0271\u0277\x05.\x18\x02\u0272\u0273\x05.\x18\x02\u0273\u0274" +
59366
+ "\x07k\x02\x02\u0274\u0275\x05\\/\x02\u0275\u0277\x03\x02\x02\x02\u0276" +
59367
+ "\u0271\x03\x02\x02\x02\u0276\u0272\x03\x02\x02\x02\u0277]\x03\x02\x02" +
59368
+ "\x02\u0278\u027E\x05`1\x02\u0279\u027A\x05`1\x02\u027A\u027B\x07k\x02" +
59369
+ "\x02\u027B\u027C\x05^0\x02\u027C\u027E\x03\x02\x02\x02\u027D\u0278\x03" +
59370
+ "\x02\x02\x02\u027D\u0279\x03\x02\x02\x02\u027E_\x03\x02\x02\x02\u027F" +
59371
+ "\u0290\x05b2\x02\u0280\u0281\x079\x02\x02\u0281\u0282\x05Z.\x02\u0282" +
59372
+ "\u0283\x05F$\x02\u0283\u0290\x03\x02\x02\x02\u0284\u0285\x07:\x02\x02" +
59373
+ "\u0285\u0286\x05Z.\x02\u0286\u0287\x05F$\x02\u0287\u0290\x03\x02\x02\x02" +
59374
+ "\u0288\u028A\x05H%\x02\u0289\u028B\x07\x17\x02\x02\u028A\u0289\x03\x02" +
59375
+ "\x02\x02\u028A\u028B\x03\x02\x02\x02\u028B\u028C\x03\x02\x02\x02\u028C" +
59376
+ "\u028D\x05V,\x02\u028D\u028E\x05F$\x02\u028E\u0290\x03\x02\x02\x02\u028F" +
59377
+ "\u027F\x03\x02\x02\x02\u028F\u0280\x03\x02\x02\x02\u028F\u0284\x03\x02" +
59378
+ "\x02\x02\u028F\u0288\x03\x02\x02\x02\u0290a\x03\x02\x02\x02\u0291\u0292" +
59379
+ "\b2\x01\x02\u0292\u0293\x05d3\x02\u0293\u0299\x03\x02\x02\x02\u0294\u0295" +
59380
+ "\f\x03\x02\x02\u0295\u0296\x07;\x02\x02\u0296\u0298\x05d3\x02\u0297\u0294" +
59381
+ "\x03\x02\x02\x02\u0298\u029B\x03\x02\x02\x02\u0299\u0297\x03\x02\x02\x02" +
59382
+ "\u0299\u029A\x03\x02\x02\x02\u029Ac\x03\x02\x02\x02\u029B\u0299\x03\x02" +
59383
+ "\x02\x02\u029C\u029D\b3\x01\x02\u029D\u029E\x05f4\x02\u029E\u02A4\x03" +
59384
+ "\x02\x02\x02\u029F\u02A0\f\x03\x02\x02\u02A0\u02A1\x07<\x02\x02\u02A1" +
59385
+ "\u02A3\x05f4\x02\u02A2\u029F\x03\x02\x02\x02\u02A3\u02A6\x03\x02\x02\x02" +
59386
+ "\u02A4\u02A2\x03\x02\x02\x02\u02A4\u02A5\x03\x02\x02\x02\u02A5e\x03\x02" +
59387
+ "\x02\x02\u02A6\u02A4\x03\x02\x02\x02\u02A7\u02A8\b4\x01\x02\u02A8\u02A9" +
59388
+ "\x05h5\x02\u02A9\u02AF\x03\x02\x02\x02\u02AA\u02AB\f\x03\x02\x02\u02AB" +
59389
+ "\u02AC\x07=\x02\x02\u02AC\u02AE\x05h5\x02\u02AD\u02AA\x03\x02\x02\x02" +
59390
+ "\u02AE\u02B1\x03\x02\x02\x02\u02AF\u02AD\x03\x02\x02\x02\u02AF\u02B0\x03" +
59391
+ "\x02\x02\x02\u02B0g\x03\x02\x02\x02\u02B1\u02AF\x03\x02\x02\x02\u02B2" +
59392
+ "\u02BB\x05j6\x02\u02B3\u02B4\x05j6\x02\u02B4\u02B5\x07>\x02\x02\u02B5" +
59393
+ "\u02B8\x05h5\x02\u02B6\u02B7\x07?\x02\x02\u02B7\u02B9\x05h5\x02\u02B8" +
59394
+ "\u02B6\x03\x02\x02\x02\u02B8\u02B9\x03\x02\x02\x02\u02B9\u02BB\x03\x02" +
59395
+ "\x02\x02\u02BA\u02B2\x03\x02\x02\x02\u02BA\u02B3\x03\x02\x02\x02\u02BB" +
59396
+ "i\x03\x02\x02\x02\u02BC\u02BD\b6\x01\x02\u02BD\u02BE\x05l7\x02\u02BE\u02C4" +
59397
+ "\x03\x02\x02\x02\u02BF\u02C0\f\x03\x02\x02\u02C0\u02C1\x07@\x02\x02\u02C1" +
59398
+ "\u02C3\x05l7\x02\u02C2\u02BF\x03\x02\x02\x02\u02C3\u02C6\x03\x02\x02\x02" +
59399
+ "\u02C4\u02C2\x03\x02\x02\x02\u02C4\u02C5\x03\x02\x02\x02\u02C5k\x03\x02" +
59400
+ "\x02\x02\u02C6\u02C4\x03\x02\x02\x02\u02C7\u02D9\x05n8\x02\u02C8\u02C9" +
59401
+ "\x05n8\x02\u02C9\u02CA\x07A\x02\x02\u02CA\u02CB\x05n8\x02\u02CB\u02D9" +
59402
+ "\x03\x02\x02\x02\u02CC\u02CD\x05n8\x02\u02CD\u02CE\x07B\x02\x02\u02CE" +
59403
+ "\u02CF\x05n8\x02\u02CF\u02D9\x03\x02\x02\x02\u02D0\u02D1\x05n8\x02\u02D1" +
59404
+ "\u02D2\x07C\x02\x02\u02D2\u02D3\x05n8\x02\u02D3\u02D9\x03\x02\x02\x02" +
59405
+ "\u02D4\u02D5\x05n8\x02\u02D5\u02D6\x07D\x02\x02\u02D6\u02D7\x05n8\x02" +
59406
+ "\u02D7\u02D9\x03\x02\x02\x02\u02D8\u02C7\x03\x02\x02\x02\u02D8\u02C8\x03" +
59407
+ "\x02\x02\x02\u02D8\u02CC\x03\x02\x02\x02\u02D8\u02D0\x03\x02\x02\x02\u02D8" +
59408
+ "\u02D4\x03\x02\x02\x02\u02D9m\x03\x02\x02\x02\u02DA\u02EA\x05p9\x02\u02DB" +
59409
+ "\u02DC\x07E\x02\x02\u02DC\u02EA\x05n8\x02\u02DD\u02DE\x07F\x02\x02\u02DE" +
59410
+ "\u02EA\x05n8\x02\u02DF\u02E0\x07G\x02\x02\u02E0\u02EA\x05n8\x02\u02E1" +
59411
+ "\u02E2\x07H\x02\x02\u02E2\u02EA\x05n8\x02\u02E3\u02E4\x07I\x02\x02\u02E4" +
59412
+ "\u02EA\x05n8\x02\u02E5\u02E6\x07J\x02\x02\u02E6\u02EA\x05n8\x02\u02E7" +
59413
+ "\u02E8\x07K\x02\x02\u02E8\u02EA\x05n8\x02\u02E9\u02DA\x03\x02\x02\x02" +
59414
+ "\u02E9\u02DB\x03\x02\x02\x02\u02E9\u02DD\x03\x02\x02\x02\u02E9\u02DF\x03" +
59415
+ "\x02\x02\x02\u02E9\u02E1\x03\x02\x02\x02\u02E9\u02E3\x03\x02\x02\x02\u02E9" +
59416
+ "\u02E5\x03\x02\x02\x02\u02E9\u02E7\x03\x02\x02\x02\u02EAo\x03\x02\x02" +
59417
+ "\x02\u02EB\u02EC\b9\x01\x02\u02EC\u02ED\x05r:\x02\u02ED\u02F7\x03\x02" +
59418
+ "\x02\x02\u02EE\u02F0\f\x03\x02\x02\u02EF\u02F1\x07E\x02\x02\u02F0\u02EF" +
59419
+ "\x03\x02\x02\x02\u02F0\u02F1\x03\x02\x02\x02\u02F1\u02F2\x03\x02\x02\x02" +
59420
+ "\u02F2\u02F3\x05@!\x02\u02F3\u02F4\x05r:\x02\u02F4\u02F6\x03\x02\x02\x02" +
59421
+ "\u02F5\u02EE\x03\x02\x02\x02\u02F6\u02F9\x03\x02\x02\x02\u02F7\u02F5\x03" +
59422
+ "\x02\x02\x02\u02F7\u02F8\x03\x02\x02\x02\u02F8q\x03\x02\x02\x02\u02F9" +
59423
+ "\u02F7\x03\x02\x02\x02\u02FA\u02FE\x05t;\x02\u02FB\u02FC\t\f\x02\x02\u02FC" +
59424
+ "\u02FE\x05t;\x02\u02FD\u02FA\x03\x02\x02\x02\u02FD\u02FB\x03\x02\x02\x02" +
59425
+ "\u02FEs\x03\x02\x02\x02\u02FF\u0300\b;\x01\x02\u0300\u0301\x05v<\x02\u0301" +
59426
+ "\u0307\x03\x02\x02\x02\u0302\u0303\f\x03\x02\x02\u0303\u0304\t\r\x02\x02" +
59427
+ "\u0304\u0306\x05x=\x02\u0305\u0302\x03\x02\x02\x02\u0306\u0309\x03\x02" +
59428
+ "\x02\x02\u0307\u0305\x03\x02\x02\x02\u0307\u0308\x03\x02\x02\x02\u0308" +
59429
+ "u\x03\x02\x02\x02\u0309\u0307\x03\x02\x02\x02\u030A\u030E\x05x=\x02\u030B" +
59430
+ "\u030C\x07L\x02\x02\u030C\u030E\x05v<\x02\u030D\u030A\x03\x02\x02\x02" +
59431
+ "\u030D\u030B\x03\x02\x02\x02\u030Ew\x03\x02\x02\x02\u030F\u0310\b=\x01" +
59432
+ "\x02\u0310\u0311\x05z>\x02\u0311\u0317\x03\x02\x02\x02\u0312\u0313\f\x03" +
59433
+ "\x02\x02\u0313\u0314\x07M\x02\x02\u0314\u0316\x05z>\x02\u0315\u0312\x03" +
59434
+ "\x02\x02\x02\u0316\u0319\x03\x02\x02\x02\u0317\u0315\x03\x02\x02\x02\u0317" +
59435
+ "\u0318\x03\x02\x02\x02\u0318y\x03\x02\x02\x02\u0319\u0317\x03\x02\x02" +
59436
+ "\x02\u031A\u031B\b>\x01\x02\u031B\u031C\x05|?\x02\u031C\u0322\x03\x02" +
59437
+ "\x02\x02\u031D\u031E\f\x03\x02\x02\u031E\u031F\x07N\x02\x02\u031F\u0321" +
59438
+ "\x05|?\x02\u0320\u031D\x03\x02\x02\x02\u0321\u0324\x03\x02\x02\x02\u0322" +
59439
+ "\u0320\x03\x02\x02\x02\u0322\u0323\x03\x02\x02\x02\u0323{\x03\x02\x02" +
59440
+ "\x02\u0324\u0322\x03\x02\x02\x02\u0325\u0326\b?\x01\x02\u0326\u0327\x05" +
59441
+ "~@\x02\u0327\u032E\x03\x02\x02\x02\u0328\u0329\f\x03\x02\x02\u0329\u032A" +
59442
+ "\x05> \x02\u032A\u032B\x05~@\x02\u032B\u032D\x03\x02\x02\x02\u032C\u0328" +
59443
+ "\x03\x02\x02\x02\u032D\u0330\x03\x02\x02\x02\u032E\u032C\x03\x02\x02\x02" +
59444
+ "\u032E\u032F\x03\x02\x02\x02\u032F}\x03\x02\x02\x02\u0330\u032E\x03\x02" +
59445
+ "\x02\x02\u0331\u0332\b@\x01\x02\u0332\u0333\x05\x80A\x02\u0333\u0339\x03" +
59446
+ "\x02\x02\x02\u0334\u0335\f\x03\x02\x02\u0335\u0336\t\x0E\x02\x02\u0336" +
59447
+ "\u0338\x05\x80A\x02\u0337\u0334\x03\x02\x02\x02\u0338\u033B\x03\x02\x02" +
59448
+ "\x02\u0339\u0337\x03\x02\x02\x02\u0339\u033A\x03\x02\x02\x02\u033A\x7F" +
59449
+ "\x03\x02\x02\x02\u033B\u0339\x03\x02\x02\x02\u033C\u033D\bA\x01\x02\u033D" +
59450
+ "\u033E\x05\x82B\x02\u033E\u0346\x03\x02\x02\x02\u033F\u0340\f\x03\x02" +
59451
+ "\x02\u0340\u0341\x07\x04\x02\x02\u0341\u0342\x05^0\x02\u0342\u0343\x07" +
59452
+ "\x05\x02\x02\u0343\u0345\x03\x02\x02\x02\u0344\u033F\x03\x02\x02\x02\u0345" +
59453
+ "\u0348\x03\x02\x02\x02\u0346\u0344\x03\x02\x02\x02\u0346\u0347\x03\x02" +
59454
+ "\x02\x02\u0347\x81\x03\x02\x02\x02\u0348\u0346\x03\x02\x02\x02\u0349\u034A" +
59455
+ "\bB\x01\x02\u034A\u0351\x05\x84C\x02\u034B\u034C\x05N(\x02\u034C\u034D" +
59456
+ "\x07\x04\x02\x02\u034D\u034E\x05^0\x02\u034E\u034F\x07\x05\x02\x02\u034F" +
59457
+ "\u0351\x03\x02\x02\x02\u0350\u0349\x03\x02\x02\x02\u0350\u034B\x03\x02" +
59458
+ "\x02\x02\u0351\u0357\x03\x02\x02\x02\u0352\u0353\f\x04\x02\x02\u0353\u0354" +
59459
+ "\x07\x1B\x02\x02\u0354\u0356\x05\x84C\x02\u0355\u0352\x03\x02\x02\x02" +
59460
+ "\u0356\u0359\x03\x02\x02\x02\u0357\u0355\x03\x02\x02\x02\u0357\u0358\x03" +
59461
+ "\x02\x02\x02\u0358\x83\x03\x02\x02\x02\u0359\u0357\x03\x02\x02\x02\u035A" +
59462
+ "\u035B\bC\x01\x02\u035B\u035C\x05\x86D\x02\u035C\u0361\x03\x02\x02\x02" +
59463
+ "\u035D\u035E\f\x03\x02\x02\u035E\u0360\x07Q\x02\x02\u035F\u035D\x03\x02" +
59464
+ "\x02\x02\u0360\u0363\x03\x02\x02\x02\u0361\u035F\x03\x02\x02\x02\u0361" +
59465
+ "\u0362\x03\x02\x02\x02\u0362\x85\x03\x02\x02\x02\u0363\u0361\x03\x02\x02" +
59466
+ "\x02\u0364\u0368\x05\x88E\x02\u0365\u0366\t\x0F\x02\x02\u0366\u0368\x05" +
59467
+ "\x86D\x02\u0367\u0364\x03\x02\x02\x02\u0367\u0365\x03\x02\x02\x02\u0368" +
59468
+ "\x87\x03\x02\x02\x02\u0369\u037C\x050\x19\x02\u036A\u037C\x05J&\x02\u036B" +
59469
+ "\u036C\x07U\x02\x02\u036C\u037C\x05N(\x02\u036D\u036E\x07V\x02\x02\u036E" +
59470
+ "\u037C\x05N(\x02\u036F\u037C\x07W\x02\x02\u0370\u0371\x07\v\x02\x02\u0371" +
59471
+ "\u0372\x05V,\x02\u0372\u0373\x05F$\x02\u0373\u0374\x07\f\x02\x02\u0374" +
59472
+ "\u037C\x03\x02\x02\x02\u0375\u0376\x07\x1D\x02\x02\u0376\u0377\x05`1\x02" +
59473
+ "\u0377\u0378\x07\x1E\x02\x02\u0378\u037C\x03\x02\x02\x02\u0379\u037C\x05" +
59474
+ "D#\x02\u037A\u037C\x05\x8EH\x02\u037B\u0369\x03\x02\x02\x02\u037B\u036A" +
59475
+ "\x03\x02\x02\x02\u037B\u036B\x03\x02\x02\x02\u037B\u036D\x03\x02\x02\x02" +
59476
+ "\u037B\u036F\x03\x02\x02\x02\u037B\u0370\x03\x02\x02\x02\u037B\u0375\x03" +
59477
+ "\x02\x02\x02\u037B\u0379\x03\x02\x02\x02\u037B\u037A\x03\x02\x02\x02\u037C" +
59478
+ "\x89\x03\x02\x02\x02\u037D\u0383\x05J&\x02\u037E\u037F\x05J&\x02\u037F" +
59479
+ "\u0380\x07\\\x02\x02\u0380\u0381\x05\x8AF\x02\u0381\u0383\x03\x02\x02" +
59480
+ "\x02\u0382\u037D\x03\x02\x02\x02\u0382\u037E\x03\x02\x02\x02\u0383\x8B" +
59481
+ "\x03\x02\x02\x02\u0384\u0385\x05\x8EH\x02\u0385\x8D\x03\x02\x02\x02\u0386" +
59482
+ "\u0387\x07X\x02\x02\u0387\x8F\x03\x02\x02\x02\u0388\u0389\x07Y\x02\x02" +
59483
+ "\u0389\u038A\x05N(\x02\u038A\u038C\x05\x9EP\x02\u038B\u038D\x05,\x17\x02" +
59484
+ "\u038C\u038B\x03\x02\x02\x02\u038C\u038D\x03\x02\x02\x02\u038D\x91\x03" +
59485
+ "\x02\x02\x02\u038E\u038F\x05\x1A\x0E\x02\u038F\x93\x03\x02\x02\x02\u0390" +
59486
+ "\u0391\x07Z\x02\x02\u0391\u0392\x05`1\x02\u0392\x95\x03\x02\x02\x02\u0393" +
59487
+ "\u0394\x07[\x02\x02\u0394\u0395\x05N(\x02\u0395\u0396\x07)\x02\x02\u0396" +
59488
+ "\u0397\x05`1\x02\u0397\u0398\x07\"\x02\x02\u0398\u0399\x05\x9EP\x02\u0399" +
59489
+ "\x97\x03\x02\x02\x02\u039A\u039B\x05N(\x02\u039B\u039C\x07\x18\x02\x02" +
59490
+ "\u039C\u039D\x05\x8AF\x02\u039D\u039E\x07a\x02\x02\u039E\u039F\x05`1\x02" +
59491
+ "\u039F\x99\x03\x02\x02\x02\u03A0\u03A6\x05\x9CO\x02\u03A1\u03A2\x05\x9C" +
59492
+ "O\x02\u03A2\u03A3\x07k\x02\x02\u03A3\u03A4\x05\x9AN\x02\u03A4\u03A6\x03" +
59493
+ "\x02\x02\x02\u03A5\u03A0\x03\x02\x02\x02\u03A5\u03A1\x03\x02\x02\x02\u03A6" +
59494
+ "\x9B\x03\x02\x02\x02\u03A7\u03A8\x07m\x02\x02\u03A8\x9D\x03\x02\x02\x02" +
59495
+ "\u03A9\u03AD\x07\v\x02\x02\u03AA\u03AC\x05\xA2R\x02\u03AB\u03AA\x03\x02" +
59496
+ "\x02\x02\u03AC\u03AF\x03\x02\x02\x02\u03AD\u03AB\x03\x02\x02\x02\u03AD" +
59497
+ "\u03AE\x03\x02\x02\x02\u03AE\u03B0\x03\x02\x02\x02\u03AF\u03AD\x03\x02" +
59498
+ "\x02\x02\u03B0\u03B6\x07\f\x02\x02\u03B1\u03B3\x07$\x02\x02\u03B2\u03B1" +
59499
+ "\x03\x02\x02\x02\u03B2\u03B3\x03\x02\x02\x02\u03B3\u03B4\x03\x02\x02\x02" +
59500
+ "\u03B4\u03B6\x05J&\x02\u03B5\u03A9\x03\x02\x02\x02\u03B5\u03B2\x03\x02" +
59501
+ "\x02\x02\u03B6\x9F\x03\x02\x02\x02\u03B7\u03B8\x07V\x02\x02\u03B8\u03BD" +
59502
+ "\x05N(\x02\u03B9\u03BD\x05\x9CO\x02\u03BA\u03BB\x07(\x02\x02\u03BB\u03BD" +
59503
+ "\x05\x9CO\x02\u03BC\u03B7\x03\x02\x02\x02\u03BC\u03B9\x03\x02\x02\x02" +
59504
+ "\u03BC\u03BA\x03\x02\x02\x02\u03BD\xA1\x03\x02\x02\x02\u03BE\u03BF\x05" +
59505
+ "\xA4S\x02\u03BF\u03C0\x05@!\x02\u03C0\u03C1\x05\xA6T\x02\u03C1\u03C6\x03" +
59506
+ "\x02\x02\x02\u03C2\u03C3\x07g\x02\x02\u03C3\u03C6\x05\xA4S\x02\u03C4\u03C6" +
59507
+ "\x05J&\x02\u03C5\u03BE\x03\x02\x02\x02\u03C5\u03C2\x03\x02\x02\x02\u03C5" +
59508
+ "\u03C4\x03\x02\x02\x02\u03C6\xA3\x03\x02\x02\x02\u03C7\u03C8\x07L\x02" +
59509
+ "\x02\u03C8\u03D2\x05J&\x02\u03C9\u03D2\x05J&\x02\u03CA\u03CD\x05\xA0Q" +
59510
+ "\x02\u03CB\u03CC\x07\x1B\x02\x02\u03CC\u03CE\x05J&\x02\u03CD\u03CB\x03" +
59511
+ "\x02\x02\x02\u03CE\u03CF\x03\x02\x02\x02\u03CF\u03CD\x03\x02\x02\x02\u03CF" +
59512
+ "\u03D0\x03\x02\x02\x02\u03D0\u03D2\x03\x02\x02\x02\u03D1\u03C7\x03\x02" +
59513
+ "\x02\x02\u03D1\u03C9\x03\x02\x02\x02\u03D1\u03CA\x03\x02\x02\x02\u03D2" +
59514
+ "\xA5\x03\x02\x02\x02\u03D3\u03D4\bT\x01\x02\u03D4\u03DA\x05\xA8U\x02\u03D5" +
59515
+ "\u03D6\x07\x1D\x02\x02\u03D6\u03D7\x05\xA6T\x02\u03D7\u03D8\x07\x1E\x02" +
59516
+ "\x02\u03D8\u03DA\x03\x02\x02\x02\u03D9\u03D3\x03\x02\x02\x02\u03D9\u03D5" +
59517
+ "\x03\x02\x02\x02\u03DA\u03E0\x03\x02\x02\x02\u03DB\u03DC\f\x04\x02\x02" +
59518
+ "\u03DC\u03DD\x07\x0F\x02\x02\u03DD\u03DF\x05\xA8U\x02\u03DE\u03DB\x03" +
59519
+ "\x02\x02\x02\u03DF\u03E2\x03\x02\x02\x02\u03E0\u03DE\x03\x02\x02\x02\u03E0" +
59520
+ "\u03E1\x03\x02\x02\x02\u03E1\xA7\x03\x02\x02\x02\u03E2\u03E0\x03\x02\x02" +
59521
+ "\x02\u03E3\u03E4\bU\x01\x02\u03E4\u03E5\x07\x1D\x02\x02\u03E5\u03E6\x05" +
59522
+ "\xA8U\x02\u03E6\u03E7\x07\x1E\x02\x02\u03E7\u03EA\x03\x02\x02\x02\u03E8" +
59523
+ "\u03EA\x05\xAAV\x02\u03E9\u03E3\x03\x02\x02\x02\u03E9\u03E8\x03\x02\x02" +
59524
+ "\x02\u03EA\u03F0\x03\x02\x02\x02\u03EB\u03EC\f\x04\x02\x02\u03EC\u03ED" +
59525
+ "\t\x10\x02\x02\u03ED\u03EF\x05\xAAV\x02\u03EE\u03EB\x03\x02\x02\x02\u03EF" +
59526
+ "\u03F2\x03\x02\x02\x02\u03F0\u03EE\x03\x02\x02\x02\u03F0\u03F1\x03\x02" +
59527
+ "\x02\x02\u03F1\xA9\x03\x02\x02\x02\u03F2\u03F0\x03\x02\x02\x02\u03F3\u03FA" +
59528
+ "\x05\xA0Q\x02\u03F4\u03FA\x05J&\x02\u03F5\u03F6\x07\x1D\x02\x02\u03F6" +
59529
+ "\u03F7\x05\xA6T\x02\u03F7\u03F8\x07\x1E\x02\x02\u03F8\u03FA\x03\x02\x02" +
59530
+ "\x02\u03F9\u03F3\x03\x02\x02\x02\u03F9\u03F4\x03\x02\x02\x02\u03F9\u03F5" +
59531
+ "\x03\x02\x02\x02\u03FA\xAB\x03\x02\x02\x02x\xAE\xB3\xB7\xC1\xC7\xCD\xD0" +
59532
+ "\xD8\xDC\xE2\xE4\xF7\xFA\xFD\u0100\u0105\u0109\u010D\u0117\u011A\u0123" +
59533
+ "\u0128\u012D\u0132\u0137\u0144\u0148\u014C\u0155\u015A\u015D\u0161\u0168" +
59534
+ "\u016D\u0170\u0174\u0179\u017D\u0180\u0184\u018A\u018E\u0196\u019F\u01A3" +
59535
+ "\u01A6\u01AF\u01B2\u01B9\u01BD\u01C2\u01CF\u01D2\u01D6\u01DF\u01E3\u01EC" +
59536
+ "\u01F0\u01FA\u0205\u0209\u020E\u021A\u0222\u0228\u022C\u0233\u0239\u0240" +
59537
+ "\u0243\u024C\u0253\u025A\u0261\u0268\u026F\u0276\u027D\u028A\u028F\u0299" +
59538
+ "\u02A4\u02AF\u02B8\u02BA\u02C4\u02D8\u02E9\u02F0\u02F7\u02FD\u0307\u030D" +
59539
+ "\u0317\u0322\u032E\u0339\u0346\u0350\u0357\u0361\u0367\u037B\u0382\u038C" +
59540
+ "\u03A5\u03AD\u03B2\u03B5\u03BC\u03C5\u03CF\u03D1\u03D9\u03E0\u03E9\u03F0" +
59541
+ "\u03F9";
58505
59542
  ForgeParser._serializedATN = Utils.join([
58506
59543
  ForgeParser._serializedATNSegment0,
58507
59544
  ForgeParser._serializedATNSegment1,
@@ -60139,7 +61176,8 @@ class OptionDeclContext extends ParserRuleContext_1.ParserRuleContext {
60139
61176
  }
60140
61177
  exports.OptionDeclContext = OptionDeclContext;
60141
61178
  class NameContext extends ParserRuleContext_1.ParserRuleContext {
60142
- IDENTIFIER_TOK() { return this.getToken(ForgeParser.IDENTIFIER_TOK, 0); }
61179
+ IDENTIFIER_TOK() { return this.tryGetToken(ForgeParser.IDENTIFIER_TOK, 0); }
61180
+ QUOTED_IDENTIFIER_TOK() { return this.tryGetToken(ForgeParser.QUOTED_IDENTIFIER_TOK, 0); }
60143
61181
  constructor(parent, invokingState) {
60144
61182
  super(parent, invokingState);
60145
61183
  }
@@ -62077,6 +63115,83 @@ class ConsistencyAssertionTest extends SyntaxNode {
62077
63115
  exports.ConsistencyAssertionTest = ConsistencyAssertionTest;
62078
63116
 
62079
63117
 
63118
+ /***/ }),
63119
+
63120
+ /***/ "./src/forge-antlr/utils.ts":
63121
+ /*!**********************************!*\
63122
+ !*** ./src/forge-antlr/utils.ts ***!
63123
+ \**********************************/
63124
+ /***/ ((__unused_webpack_module, exports) => {
63125
+
63126
+ "use strict";
63127
+
63128
+ Object.defineProperty(exports, "__esModule", ({ value: true }));
63129
+ exports.FORGE_RESERVED_KEYWORDS = void 0;
63130
+ exports.getIdentifierName = getIdentifierName;
63131
+ exports.quoteIfReserved = quoteIfReserved;
63132
+ /**
63133
+ * Extracts the identifier string from a NameContext.
63134
+ * Handles both regular identifiers and backtick-quoted identifiers (for reserved keywords).
63135
+ *
63136
+ * Examples:
63137
+ * - Regular: `myVar` -> "myVar"
63138
+ * - Quoted: `` `set` `` -> "set"
63139
+ * - Quoted with escape: `` `my\`name` `` -> "my`name"
63140
+ *
63141
+ * @param ctx The NameContext to extract the identifier from
63142
+ * @returns The identifier string with backticks and escapes processed
63143
+ */
63144
+ function getIdentifierName(ctx) {
63145
+ // Try regular identifier first
63146
+ const identifierToken = ctx.IDENTIFIER_TOK();
63147
+ if (identifierToken) {
63148
+ return identifierToken.text;
63149
+ }
63150
+ // Try quoted identifier
63151
+ const quotedToken = ctx.QUOTED_IDENTIFIER_TOK();
63152
+ if (quotedToken) {
63153
+ const text = quotedToken.text;
63154
+ // Strip surrounding backticks and unescape internal backslash sequences
63155
+ return text
63156
+ .slice(1, -1) // Remove surrounding backticks
63157
+ .replace(/\\(.)/g, '$1'); // Unescape: \` -> `, \\ -> \, etc.
63158
+ }
63159
+ // Fallback to text (shouldn't happen with valid grammar)
63160
+ return ctx.text;
63161
+ }
63162
+ /**
63163
+ * Quotes an identifier if it conflicts with a reserved keyword.
63164
+ * Use this when generating Forge expressions that might contain reserved words.
63165
+ *
63166
+ * @param identifier The identifier to potentially quote
63167
+ * @param reservedKeywords Set of reserved keywords to check against
63168
+ * @returns The identifier, quoted with backticks if necessary
63169
+ */
63170
+ function quoteIfReserved(identifier, reservedKeywords) {
63171
+ if (reservedKeywords.has(identifier)) {
63172
+ // Escape any backticks in the identifier and wrap in backticks
63173
+ return '`' + identifier.replace(/([`\\])/g, '\\$1') + '`';
63174
+ }
63175
+ return identifier;
63176
+ }
63177
+ /**
63178
+ * Set of all reserved keywords in Forge.
63179
+ * Use with quoteIfReserved() when generating Forge expressions.
63180
+ */
63181
+ exports.FORGE_RESERVED_KEYWORDS = new Set([
63182
+ 'open', 'as', 'var', 'abstract', 'sig', 'extends', 'in',
63183
+ 'lone', 'some', 'one', 'two', 'set', 'func', 'pfunc', 'disj',
63184
+ 'wheat', 'pred', 'fun', 'assert', 'run', 'check', 'for', 'but',
63185
+ 'exactly', 'none', 'univ', 'iden', 'is', 'sat', 'unsat', 'theorem',
63186
+ 'forge_error', 'checked', 'test', 'expect', 'suite', 'all',
63187
+ 'sufficient', 'necessary', 'consistent', 'inconsistent', 'with',
63188
+ 'let', 'bind', 'or', 'xor', 'iff', 'implies', 'else', 'and',
63189
+ 'until', 'release', 'since', 'triggered', 'not', 'always',
63190
+ 'eventually', 'after', 'before', 'once', 'historically', 'this',
63191
+ 'sexpr', 'inst', 'eval', 'example', 'ni', 'no', 'sum', 'Int', 'option'
63192
+ ]);
63193
+
63194
+
62080
63195
  /***/ }),
62081
63196
 
62082
63197
  /***/ "./src/index.ts":
@@ -62088,13 +63203,16 @@ exports.ConsistencyAssertionTest = ConsistencyAssertionTest;
62088
63203
  "use strict";
62089
63204
 
62090
63205
  Object.defineProperty(exports, "__esModule", ({ value: true }));
62091
- exports.SelectorSynthesisError = exports.synthesizeSelectorWithWhy = exports.synthesizeBinaryRelationWithWhy = exports.synthesizeBinaryRelation = exports.synthesizeSelector = exports.SimpleGraphQueryEvaluator = void 0;
63206
+ exports.FORGE_RESERVED_KEYWORDS = exports.quoteIfReserved = exports.getIdentifierName = exports.SelectorSynthesisError = exports.synthesizeSelectorWithWhy = exports.synthesizeBinaryRelationWithWhy = exports.synthesizeBinaryRelation = exports.synthesizeSelector = exports.ForgeExprStaticAnalyzer = exports.SimpleGraphQueryEvaluator = void 0;
63207
+ exports.analyzeForgeExpression = analyzeForgeExpression;
62092
63208
  const antlr4ts_1 = __webpack_require__(/*! antlr4ts */ "./node_modules/antlr4ts/index.js");
62093
63209
  const ForgeParser_1 = __webpack_require__(/*! ./forge-antlr/ForgeParser */ "./src/forge-antlr/ForgeParser.ts");
62094
63210
  const ForgeLexer_1 = __webpack_require__(/*! ./forge-antlr/ForgeLexer */ "./src/forge-antlr/ForgeLexer.ts");
62095
63211
  const ForgeListenerImpl_1 = __webpack_require__(/*! ./forge-antlr/ForgeListenerImpl */ "./src/forge-antlr/ForgeListenerImpl.ts");
62096
63212
  const ParseTreeWalker_1 = __webpack_require__(/*! antlr4ts/tree/ParseTreeWalker */ "./node_modules/antlr4ts/tree/ParseTreeWalker.js");
62097
63213
  const ForgeExprEvaluator_1 = __webpack_require__(/*! ./ForgeExprEvaluator */ "./src/ForgeExprEvaluator.ts");
63214
+ const ForgeExprStaticAnalyzer_1 = __webpack_require__(/*! ./ForgeExprStaticAnalyzer */ "./src/ForgeExprStaticAnalyzer.ts");
63215
+ Object.defineProperty(exports, "ForgeExprStaticAnalyzer", ({ enumerable: true, get: function () { return ForgeExprStaticAnalyzer_1.ForgeExprStaticAnalyzer; } }));
62098
63216
  const errorListener_1 = __webpack_require__(/*! ./errorListener */ "./src/errorListener.ts");
62099
63217
  function createForgeParser(input) {
62100
63218
  const inputStream = antlr4ts_1.CharStreams.fromString(input);
@@ -62106,14 +63224,56 @@ function createForgeParser(input) {
62106
63224
  parser.addErrorListener(new errorListener_1.ParseErrorListener());
62107
63225
  return parser;
62108
63226
  }
63227
+ /**
63228
+ * Evaluates Forge expressions against an `IDataInstance`.
63229
+ *
63230
+ * ## Caching contract (important for correctness)
63231
+ *
63232
+ * For performance, this class caches an inner evaluator (with its relation
63233
+ * index and subexpression cache) across `evaluateExpression` calls. The
63234
+ * cache is invalidated when the `datum` field is reassigned to a different
63235
+ * reference, but **not** when the underlying `IDataInstance` is mutated in
63236
+ * place (e.g. adding/removing atoms or tuples on the same object).
63237
+ *
63238
+ * If you mutate the underlying data in place, you **must** call
63239
+ * {@link invalidate} (or reassign `datum` to a new object) before the next
63240
+ * `evaluateExpression` call. Otherwise queries may return stale results.
63241
+ *
63242
+ * Recommended patterns:
63243
+ * - Treat `IDataInstance` as immutable; create a new instance on data
63244
+ * changes and construct a new `SimpleGraphQueryEvaluator` (or assign to
63245
+ * `.datum`).
63246
+ * - Or, if you mutate in place, call `invalidate()` after each mutation
63247
+ * batch.
63248
+ */
62109
63249
  class SimpleGraphQueryEvaluator {
62110
63250
  constructor(datum) {
62111
63251
  this.forgeListener = new ForgeListenerImpl_1.ForgeListenerImpl();
62112
63252
  this.walker = new ParseTreeWalker_1.ParseTreeWalker();
62113
63253
  // Cache for parsed expressions to avoid re-parsing the same expression
62114
63254
  this.parseTreeCache = new Map();
63255
+ // Cached inner evaluator. Reused across evaluateExpression calls so its
63256
+ // relation cache / relation index / subexpression cache survive between
63257
+ // calls. Invalidated when the `datum` reference changes, or explicitly
63258
+ // via `invalidate()`. NOT invalidated by in-place mutation of the
63259
+ // underlying IDataInstance -- callers must signal that themselves.
63260
+ this.cachedEvaluator = null;
63261
+ this.cachedEvaluatorDatum = null;
62115
63262
  this.datum = datum;
62116
63263
  }
63264
+ /**
63265
+ * Discard the cached inner evaluator (and its relation index /
63266
+ * subexpression cache). Call this after mutating the underlying
63267
+ * `IDataInstance` in place, so the next `evaluateExpression` sees the
63268
+ * updated data.
63269
+ *
63270
+ * Cheap: just nulls a couple of references. The caches rebuild lazily
63271
+ * on the next query.
63272
+ */
63273
+ invalidate() {
63274
+ this.cachedEvaluator = null;
63275
+ this.cachedEvaluatorDatum = null;
63276
+ }
62117
63277
  getExpressionParseTree(forgeExpr) {
62118
63278
  const parser = createForgeParser(forgeExpr);
62119
63279
  const tree = parser.parseExpr();
@@ -62144,13 +63304,27 @@ class SimpleGraphQueryEvaluator {
62144
63304
  };
62145
63305
  }
62146
63306
  }
62147
- const evaluator = new ForgeExprEvaluator_1.ForgeExprEvaluator(this.datum);
63307
+ // Reuse the inner evaluator across calls. Rebuild only when the datum
63308
+ // reference has changed (the contract: callers signal "data changed"
63309
+ // by swapping the datum reference, not by mutating it in place).
63310
+ if (this.cachedEvaluator === null || this.cachedEvaluatorDatum !== this.datum) {
63311
+ this.cachedEvaluator = new ForgeExprEvaluator_1.ForgeExprEvaluator(this.datum);
63312
+ this.cachedEvaluatorDatum = this.datum;
63313
+ }
63314
+ const evaluator = this.cachedEvaluator;
62148
63315
  try {
62149
63316
  let result = evaluator.visit(tree);
62150
63317
  // ensure we're visiting an ExprContext
62151
63318
  return result;
62152
63319
  }
62153
63320
  catch (error) {
63321
+ // The visit threw mid-traversal, so the evaluator's transient state
63322
+ // (environment stack) may be inconsistent. Discard the cached
63323
+ // evaluator so the next call rebuilds from a clean slate. The
63324
+ // relation cache will be rebuilt lazily on first use, which is the
63325
+ // same as the pre-change behavior.
63326
+ this.cachedEvaluator = null;
63327
+ this.cachedEvaluatorDatum = null;
62154
63328
  if (error instanceof ForgeExprEvaluator_1.NameNotFoundError) {
62155
63329
  // Return an empty EvalResult for undefined names
62156
63330
  let emptyResult = [];
@@ -62171,12 +63345,44 @@ class SimpleGraphQueryEvaluator {
62171
63345
  }
62172
63346
  }
62173
63347
  exports.SimpleGraphQueryEvaluator = SimpleGraphQueryEvaluator;
63348
+ /**
63349
+ * Run a static analysis on a Forge expression.
63350
+ *
63351
+ * Returns `unsat` when the expression provably reduces to `false`, `empty`
63352
+ * when it provably reduces to the empty set, `tautology` when it provably
63353
+ * reduces to `true`, `ill-typed` for static type errors (e.g. arity
63354
+ * mismatch), and `unknown` otherwise (including parse errors).
63355
+ *
63356
+ * When `schema` is provided, the analyzer also uses the type lattice and
63357
+ * relation declarations to detect type-disjoint intersections, subtype
63358
+ * tautologies in `in`, join column-type mismatches, and arity errors.
63359
+ * Disjointness uses a closed-world rule (A ∩ B = ∅ iff no type in the
63360
+ * lattice has both A and B in its lineage).
63361
+ */
63362
+ function analyzeForgeExpression(forgeExpr, schema) {
63363
+ try {
63364
+ const parser = createForgeParser(forgeExpr);
63365
+ const tree = parser.parseExpr();
63366
+ if (!tree || tree.childCount === 0) {
63367
+ return { status: "unknown" };
63368
+ }
63369
+ return new ForgeExprStaticAnalyzer_1.ForgeExprStaticAnalyzer(schema).analyze(tree);
63370
+ }
63371
+ catch {
63372
+ return { status: "unknown" };
63373
+ }
63374
+ }
62174
63375
  var SelectorSynthesizer_1 = __webpack_require__(/*! ./SelectorSynthesizer */ "./src/SelectorSynthesizer.ts");
62175
63376
  Object.defineProperty(exports, "synthesizeSelector", ({ enumerable: true, get: function () { return SelectorSynthesizer_1.synthesizeSelector; } }));
62176
63377
  Object.defineProperty(exports, "synthesizeBinaryRelation", ({ enumerable: true, get: function () { return SelectorSynthesizer_1.synthesizeBinaryRelation; } }));
62177
63378
  Object.defineProperty(exports, "synthesizeBinaryRelationWithWhy", ({ enumerable: true, get: function () { return SelectorSynthesizer_1.synthesizeBinaryRelationWithWhy; } }));
62178
63379
  Object.defineProperty(exports, "synthesizeSelectorWithWhy", ({ enumerable: true, get: function () { return SelectorSynthesizer_1.synthesizeSelectorWithWhy; } }));
62179
63380
  Object.defineProperty(exports, "SelectorSynthesisError", ({ enumerable: true, get: function () { return SelectorSynthesizer_1.SelectorSynthesisError; } }));
63381
+ // Utilities for handling reserved keyword identifiers
63382
+ var utils_1 = __webpack_require__(/*! ./forge-antlr/utils */ "./src/forge-antlr/utils.ts");
63383
+ Object.defineProperty(exports, "getIdentifierName", ({ enumerable: true, get: function () { return utils_1.getIdentifierName; } }));
63384
+ Object.defineProperty(exports, "quoteIfReserved", ({ enumerable: true, get: function () { return utils_1.quoteIfReserved; } }));
63385
+ Object.defineProperty(exports, "FORGE_RESERVED_KEYWORDS", ({ enumerable: true, get: function () { return utils_1.FORGE_RESERVED_KEYWORDS; } }));
62180
63386
 
62181
63387
 
62182
63388
  /***/ })