diff --git a/.claude/skills/fizz-spec/SKILL.md b/.claude/skills/fizz-spec/SKILL.md index 895d817..9edb533 100644 --- a/.claude/skills/fizz-spec/SKILL.md +++ b/.claude/skills/fizz-spec/SKILL.md @@ -99,7 +99,7 @@ role Server: return self.data.get(key, None) action Write: - key = any self.pending_keys + key = oneof self.pending_keys self.data[key] = self.pending[key] ``` @@ -133,10 +133,16 @@ action Choose: ### Nondeterminism ```python -x = any [1, 2, 3] # pick any element -x = any range(10) # pick any integer 0..9 -x = any items # pick any element from collection -# Note: any on empty collection disables the action +x = oneof [1, 2, 3] # pick one element (nondeterministic) +x = oneof range(10) # pick one integer 0..9 +x = oneof items # pick one element from collection +# Note: oneof on empty collection disables the action + +oneof x in items: # for-each style: pick one x, execute body + process(x) + +# `any` is a deprecated alias for `oneof` (emits DeprecationWarning) +x = any items # old form — still works but deprecated ``` ### Assertions @@ -171,7 +177,7 @@ id = IDS.fresh() # Interchangeable pool (e.g., task content) TEXTS = symmetry.nominal(name="task", limit=3) -v = any TEXTS.choices() # grows naturally: 1 option first, then more +v = oneof TEXTS.choices() # grows naturally: 1 option first, then more # Symmetric roles (N! reduction for N instances) symmetric role Worker: @@ -229,8 +235,8 @@ Cross-role function calls can also be lost (message loss simulation) — model c 3. **Role Init ordering**: create globals before creating roles that depend on them 4. **`require` ≠ assertion**: `require x >= 0` disables action; use `always assertion` for invariants 5. **Lists break symmetry**: use `bag()` not `[]` to hold symmetric role instances -6. **`any` on empty**: disables the action (no `require len > 0` needed) -7. **`any` keyword vs Python `any()` function**: `x = any([cond for ...])` is a parse error — `any` is the nondeterministic choice keyword. For assignments use `all([...])` or `len([x for x in xs if cond]) > 0`. In guards, `require all([not cond for ...])` is the idiomatic form. +6. **`oneof`/`any` on empty**: disables the action (no `require len > 0` needed) +7. **`any` keyword vs Python `any()` function**: `x = any([cond for ...])` is a parse error — `any` is the deprecated nondeterministic choice keyword. Prefer `oneof` (no collision: `oneof` can't be an identifier). For boolean checks use `all([...])` or `len([x for x in xs if cond]) > 0`. 8. **Function calls**: can only call fizz functions from atomic context or inside roles; extract to variable before using in expressions 9. **`None` works**: use `== None`, not `is None` (no `is` operator) @@ -294,7 +300,7 @@ action Hire: employees.add(Employee()) action Fire: - target = any [e for e in employees if e.active] + target = oneof [e for e in employees if e.active] employees = bag([e for e in employees if e.__id__ != target.__id__]) ``` diff --git a/examples/references/05-01-any-statement/Choice.fizz b/examples/references/05-01-any-statement/Choice.fizz index 2632af1..951cd1a 100644 --- a/examples/references/05-01-any-statement/Choice.fizz +++ b/examples/references/05-01-any-statement/Choice.fizz @@ -14,7 +14,7 @@ atomic action ChooseOne: # Any picks one element nondeterministically # Model checker explores all possibilities - chosen = any options + chosen = oneof options # Creates branches for each option: chosen=1, chosen=2, chosen=3 diff --git a/examples/references/05-02-any-with-condition/Choice.fizz b/examples/references/05-02-any-with-condition/Choice.fizz index ae657f9..bb483bf 100644 --- a/examples/references/05-02-any-with-condition/Choice.fizz +++ b/examples/references/05-02-any-with-condition/Choice.fizz @@ -11,8 +11,8 @@ atomic action ChoosePair: require first == 0 or second == 0 # Choose two different values from options - first = any options - second = any options if second != first + first = oneof options + second = oneof options if second != first # Safety: first and second must be different (unless both 0) always assertion DifferentValues: diff --git a/examples/references/05-03-any-fairness/Choice.fizz b/examples/references/05-03-any-fairness/Choice.fizz index f1e9e13..60f8692 100644 --- a/examples/references/05-03-any-fairness/Choice.fizz +++ b/examples/references/05-03-any-fairness/Choice.fizz @@ -7,7 +7,7 @@ action Init: atomic fair action SelectValue: # Fair any ensures all indices eventually chosen - idx = fair any range(len(values)) + idx = fair oneof range(len(values)) values[idx] = True # Liveness: all values eventually become True diff --git a/examples/references/12-03-advanced-any-patterns/Patterns.fizz b/examples/references/12-03-advanced-any-patterns/Patterns.fizz index 0689407..340db28 100644 --- a/examples/references/12-03-advanced-any-patterns/Patterns.fizz +++ b/examples/references/12-03-advanced-any-patterns/Patterns.fizz @@ -11,23 +11,23 @@ action Init: atomic action ChooseDifferentPair: require first == 0 or second == 0 - first = any options + first = oneof options # Choose different value using condition - second = any options if second != first + second = oneof options if second != first # Combine fair any with range atomic fair action FairChoice: require fair_choice == 0 # Ensures all values eventually chosen - fair_choice = fair any options + fair_choice = fair oneof options # Can also combine fair any with filtering by using separate variables atomic fair action FairFilteredChoice: require len(options) > 0 # Fair choice from available options - idx = fair any range(len(options)) + idx = fair oneof range(len(options)) chosen = options[idx] # Safety: first and second are different diff --git a/examples/references/13-02-01-two-phase-commit/TwoPhaseCommit.fizz b/examples/references/13-02-01-two-phase-commit/TwoPhaseCommit.fizz index a1b50f1..5fe6279 100644 --- a/examples/references/13-02-01-two-phase-commit/TwoPhaseCommit.fizz +++ b/examples/references/13-02-01-two-phase-commit/TwoPhaseCommit.fizz @@ -12,7 +12,7 @@ role Participant: func placehold(): # Participant votes on transaction - vote = any ["accepted", "aborted"] + vote = oneof ["accepted", "aborted"] self.status = vote return self.status diff --git a/examples/references/13-03-01-consensus/Consensus.fizz b/examples/references/13-03-01-consensus/Consensus.fizz index 892f3ab..53bbbf4 100644 --- a/examples/references/13-03-01-consensus/Consensus.fizz +++ b/examples/references/13-03-01-consensus/Consensus.fizz @@ -14,14 +14,14 @@ atomic action Propose: require proposal_value == None # Nondeterministically choose value to propose - proposal_value = any [1, 2] + proposal_value = oneof [1, 2] atomic action Accept: require proposal_value != None require decided_value == None # Node accepts proposal - node = any ["node_0", "node_1", "node_2"] + node = oneof ["node_0", "node_1", "node_2"] require node not in acceptances acceptances.add(node) diff --git a/examples/references/13-05-02-idempotent-operations/Idempotent.fizz b/examples/references/13-05-02-idempotent-operations/Idempotent.fizz index 81d5dcf..19d6596 100644 --- a/examples/references/13-05-02-idempotent-operations/Idempotent.fizz +++ b/examples/references/13-05-02-idempotent-operations/Idempotent.fizz @@ -22,7 +22,7 @@ atomic action RetryRequest: require requests > 0 # Retry with existing request ID - request_id = any range(requests) + request_id = oneof range(requests) # Idempotent: no effect if already processed if request_id not in processed_ids: diff --git a/examples/references/16-01-symmetric-values/SymmetricValues.fizz b/examples/references/16-01-symmetric-values/SymmetricValues.fizz index 1b38ee6..82cd442 100644 --- a/examples/references/16-01-symmetric-values/SymmetricValues.fizz +++ b/examples/references/16-01-symmetric-values/SymmetricValues.fizz @@ -21,12 +21,12 @@ atomic action TurnOn: # Model checker explores all possible choices # With symmetric values: states where k0=ON,k1=OFF,k2=OFF # are equivalent to k1=ON,k0=OFF,k2=OFF - key = any KEYS + key = oneof KEYS if switches[key] == 'OFF': switches[key] = 'ON' atomic action TurnOff: - key = any KEYS + key = oneof KEYS if switches[key] == 'ON': switches[key] = 'OFF' diff --git a/examples/references/16-05-nominal-symmetry/NominalSymmetry.fizz b/examples/references/16-05-nominal-symmetry/NominalSymmetry.fizz index 2e0cf72..625fa4a 100644 --- a/examples/references/16-05-nominal-symmetry/NominalSymmetry.fizz +++ b/examples/references/16-05-nominal-symmetry/NominalSymmetry.fizz @@ -17,12 +17,12 @@ action Init: atomic action Put: # choices() returns existing IDs + one fresh ID (if under limit). # Use with `any` for nondeterministic selection. - id = any IDS.choices() + id = oneof IDS.choices() cache[id] = "data" atomic action Evict: - # `any` on an empty list disables the transition, so no guard needed. - id = any IDS.values() + # `oneof` on an empty list disables the transition, so no guard needed. + id = oneof IDS.values() if id in cache: cache.pop(id) diff --git a/examples/references/16-07-ordinal-segments/OrdinalSegments.fizz b/examples/references/16-07-ordinal-segments/OrdinalSegments.fizz index 4e10e3f..f104793 100644 --- a/examples/references/16-07-ordinal-segments/OrdinalSegments.fizz +++ b/examples/references/16-07-ordinal-segments/OrdinalSegments.fizz @@ -21,14 +21,14 @@ action Init: atomic action InsertAnywhere: # Get all gaps between existing timestamps gaps = TIMES.segments() - gap = any gaps + gap = oneof gaps t = gap.fresh() atomic action InsertBetween: # Insert strictly between t_start and t_end. # Ordinal gaps are always non-empty (the domain is dense). gaps = TIMES.segments(after=t_start, before=t_end) - gap = any gaps + gap = oneof gaps t = gap.fresh() # Guaranteed: t_start < t < t_end @@ -37,7 +37,7 @@ atomic action InsertBeforeEarliest: # (Inserting after max is just fresh(), but before min needs segments.) earliest = TIMES.min() gaps = TIMES.segments(before=earliest) - gap = any gaps + gap = oneof gaps t = gap.fresh() # Note: domain methods like values() cannot be called from assertions diff --git a/examples/references/16-10-rotational-symmetry/RotationalSymmetry.fizz b/examples/references/16-10-rotational-symmetry/RotationalSymmetry.fizz index 9140b40..684fe64 100644 --- a/examples/references/16-10-rotational-symmetry/RotationalSymmetry.fizz +++ b/examples/references/16-10-rotational-symmetry/RotationalSymmetry.fizz @@ -28,7 +28,7 @@ atomic action Place: atomic action Advance: require len(positions) > 0 - p = any positions + p = oneof positions next_p = p + 1 # wraps mod 5 if next_p not in positions: positions.remove(p) diff --git a/examples/references/16-12-materialize/Materialize.fizz b/examples/references/16-12-materialize/Materialize.fizz index d9ce997..f90d1f8 100644 --- a/examples/references/16-12-materialize/Materialize.fizz +++ b/examples/references/16-12-materialize/Materialize.fizz @@ -23,17 +23,17 @@ action Init: status[n] = "idle" atomic action Activate: - n = any NODES.values() + n = oneof NODES.values() require status[n] == "idle" status[n] = "active" atomic action Deactivate: - n = any NODES.values() + n = oneof NODES.values() require status[n] == "active" status[n] = "idle" atomic action PassToken: - n = any NODES.values() + n = oneof NODES.values() require status[n] == "active" next_n = n + 1 # wraps mod 4 status[n] = "idle" diff --git a/examples/references/99-01-checkpoints/Checkpoints.fizz b/examples/references/99-01-checkpoints/Checkpoints.fizz index ca35e6c..8225d9b 100644 --- a/examples/references/99-01-checkpoints/Checkpoints.fizz +++ b/examples/references/99-01-checkpoints/Checkpoints.fizz @@ -48,7 +48,7 @@ role Coordinator: # Checkpoints work in atomic actions too # They don't create yield points, just visualization markers `evaluating` - choice = any ["approve", "reject"] + choice = oneof ["approve", "reject"] `decision_made` self.decision = choice diff --git a/examples/references/GOTCHAS.md b/examples/references/GOTCHAS.md index c78be60..710cae1 100644 --- a/examples/references/GOTCHAS.md +++ b/examples/references/GOTCHAS.md @@ -216,11 +216,11 @@ reusable because new instances are interchangeable with old ones. **Symptom**: Parse error or unexpected behavior when using `any(...)` to check if at least one element in a collection satisfies a condition. -**Cause**: `any` is a FizzBee keyword for nondeterministic choice. The -parser tries to interpret `any` as the nondeterministic choice operator -first. When used in an assignment like `x = any([...])`, the parser sees -it as a nondeterministic choice over a list literal, not a function call, -causing a parse error or wrong semantics. +**Cause**: `any` is a FizzBee keyword for nondeterministic choice +(deprecated — prefer `oneof`). The parser tries to interpret `any` as the +nondeterministic choice operator first. When used in an assignment like +`x = any([...])`, the parser sees it as a nondeterministic choice over a +list literal, not a function call, causing a parse error or wrong semantics. In some contexts (e.g., directly inside `if` or `require`) the parser falls back to treating `any` as an identifier, so the Python `any()` @@ -255,6 +255,16 @@ if not any([x > 0 for x in items]): `len([...]) > 0` for assignments. For guards, `require all([not ...])` is the idiomatic FizzBee style anyway (see Performance Guide). +**Note**: The `oneof` keyword (preferred over `any` for nondeterministic +choice) does not have this collision — `oneof` cannot be used as an +identifier, so `oneof([...])` is always a parse error. Use `oneof` to +avoid the ambiguity entirely: + +```python +x = oneof items # preferred (no collision risk) +x = any items # deprecated (emits DeprecationWarning) +``` + --- ## 12. Function Calls Only from Atomic Context or Roles diff --git a/examples/references/LANGUAGE_REFERENCE.md b/examples/references/LANGUAGE_REFERENCE.md index 8255306..a0319a3 100644 --- a/examples/references/LANGUAGE_REFERENCE.md +++ b/examples/references/LANGUAGE_REFERENCE.md @@ -129,7 +129,7 @@ After the frontmatter (or at the start if no frontmatter), the FizzBee specifica - `return` - Return from function/action - `pass` - No-op (explicitly enables action) - `require` - Guard clause (disables action if false) -- `any` - Nondeterministic choice +- `oneof` - Nondeterministic choice (preferred; `any` is deprecated alias) - `` `checkpoint` `` - Visualization breakpoint (backtick syntax) ### State and Scope @@ -205,7 +205,7 @@ atomic fair action ProduceMessage: # Both modifiers - atomic, strongly fair atomic fair action SelectValue: - value = fair any options + value = fair oneof options ``` **Common mistake**: Using `fair atomic action` instead of `atomic fair action` (syntax error) @@ -296,7 +296,7 @@ action Example4: - Control flow: `if`, `elif`, `else`, `for`, `while` - Flow control: `break`, `continue`, `return` - Guards: `require` -- Non-determinism: `any` (but the assignment `x = any ...` does enable) +- Non-determinism: `oneof` / `any` (but the assignment `x = oneof ...` does enable) **Critical pitfall**: @@ -1051,14 +1051,14 @@ action Process: Nondeterministically chooses from a collection: ```python -# Choose any value -value = any [1, 2, 3, 4, 5] +# Choose one value +value = oneof [1, 2, 3, 4, 5] # Choose with condition -value = any [x for x in options if x != previous] +value = oneof [x for x in options if x != previous] # Choose from range -index = any range(10) +index = oneof range(10) ``` **Behavior**: Model checker explores all possible choices @@ -1068,52 +1068,59 @@ index = any range(10) ```python atomic action ProcessLargeValues: # If all values are <= 10, this action is disabled - x = any [1, 2, 3, 4, 5] if x > 10 + x = oneof [1, 2, 3, 4, 5] if x > 10 # This line never executes ``` **Use case**: Conditional action enabling based on available choices -### Fairness with Any +### Fairness with Oneof ```python # Fair choice (eventually tries all) fair action Choose: - value = fair any options + value = fair oneof options ``` ### Concise vs Block Form -`any` has two forms. **Prefer the concise form** — it keeps code flat and readable: +`oneof` has two forms. **Prefer the concise form** — it keeps code flat and readable: ```python # ✅ Concise form (preferred): assigns and continues -n = any nodes +n = oneof nodes require status[n] == "active" status[n] = "done" # Block form: runs indented block for chosen value -any n in nodes: +oneof n in nodes: require status[n] == "active" status[n] = "done" ``` Both are semantically equivalent. The block form is the older pattern; the concise form avoids unnecessary indentation. -### Any vs Oneof +### Oneof: Two Meanings + +`oneof` is used in two distinct but related ways: ```python -# Any: chooses a value -x = any [1, 2, 3] +# 1. Choose a value from a collection (∃ — existential) +x = oneof [1, 2, 3] # picks one value, assigns it -# Oneof: chooses a branch +# 2. Choose a branch to execute (∨ — disjunction) oneof: x = 1 x = 2 x = 3 ``` -**Difference**: `any` is an expression, `oneof` is a statement block +Both mean "nondeterministically pick one". The syntax makes the semantics clear: +- `x = oneof collection` → pick an element (existential choice) +- `oneof:` block → pick a branch (disjunctive choice) + +**Note**: `any` is a deprecated alias for the existential form (`x = oneof collection`). +It still works but emits a `DeprecationWarning`. Prefer `oneof`. --- @@ -1437,7 +1444,7 @@ action Init: switches[k] = 'OFF' atomic action TurnOn: - key = any KEYS + key = oneof KEYS switches[key] = 'ON' ``` @@ -1621,11 +1628,11 @@ action Init: cache = {} atomic action Put: - id = any IDS.choices() # existing IDs + one fresh + id = oneof IDS.choices() # existing IDs + one fresh cache[id] = "data" ``` -`fresh()` allocates the smallest unused ID (canonical form). `choices()` returns all active values plus one fresh value if the limit allows -- use with `any` for nondeterministic selection. `choose()` returns a deterministic default value (like TLA+'s CHOOSE) -- use it when you need an initial value, not for nondeterministic selection. +`fresh()` allocates the smallest unused ID (canonical form). `choices()` returns all active values plus one fresh value if the limit allows -- use with `oneof` for nondeterministic selection. `choose()` returns a deterministic default value (like TLA+'s CHOOSE) -- use it when you need an initial value, not for nondeterministic selection. **Reference**: [16-05-nominal-symmetry](16-05-nominal-symmetry/) @@ -1668,7 +1675,7 @@ atomic action InsertBetween: # segments(after=v, before=v) filters to gaps in range. # Ordinal gaps are always non-empty (the domain is dense). gaps = TIMES.segments(after=t_start, before=t_end) - gap = any gaps + gap = oneof gaps t = gap.fresh() # guaranteed: t_start < t < t_end ``` @@ -1737,7 +1744,7 @@ atomic action Place: positions.add(p) atomic action Advance: - p = any positions + p = oneof positions next_p = p + 1 # wraps: 4 + 1 = 0 on ring of 5 if next_p not in positions: positions.remove(p) @@ -1791,7 +1798,7 @@ Works with all symmetry types. For interval, values start at `start`: e.g., `sym #### Gotchas and Tips -1. **`fresh()` is deterministic, not nondeterministic.** It always returns the canonical next value. For nondeterministic choice, use `any domain.choices()` (nominal/rotational) or `any domain.values()`. +1. **`fresh()` is deterministic, not nondeterministic.** It always returns the canonical next value. For nondeterministic choice, use `oneof domain.choices()` (nominal/rotational) or `oneof domain.values()`. 2. **Domain methods cannot be called from assertions.** The symmetry context is only available during action execution. Store values in state variables and check those in assertions instead. @@ -1811,20 +1818,20 @@ Works with all symmetry types. For interval, values start at `start`: e.g., `sym | Use case | Method | Why | |:---|:---|:---| - | **Unique ID per entity** (UUID, primary key) | `id = DOMAIN.fresh()` | Deterministic, exactly one new value. No `any` needed. | - | **Pick from interchangeable pool** (text, color, category) | `v = any DOMAIN.choices()` | Explores existing values + one fresh. First call offers only 1 choice (the canonical fresh value), avoiding spurious branching. | - | **Fixed known set** (ring nodes, enum-like) | `materialize=True` + `any DOMAIN.values()` | All values exist upfront. `fresh()` is disallowed. | + | **Unique ID per entity** (UUID, primary key) | `id = DOMAIN.fresh()` | Deterministic, exactly one new value. No `oneof` needed. | + | **Pick from interchangeable pool** (text, color, category) | `v = oneof DOMAIN.choices()` | Explores existing values + one fresh. First call offers only 1 choice (the canonical fresh value), avoiding spurious branching. | + | **Fixed known set** (ring nodes, enum-like) | `materialize=True` + `oneof DOMAIN.values()` | All values exist upfront. `fresh()` is disallowed. | **Why prefer `choices()` over `materialize=True` + `values()` for pools?** With `materialize=True`, the first nondeterministic choice offers all N values even though they are all equivalent (symmetry would collapse them to one canonical state anyway). With `choices()` (default `materialize=False`), the first call offers just 1 fresh value — no unnecessary branching. Subsequent calls offer previously-used values plus one fresh, naturally growing the pool only as needed. The total number of unique states is the same, but `choices()` avoids redundant transitions. ```python # Recommended: dynamic pool with choices() TEXTS = symmetry.nominal(name="task", limit=3) - text = any TEXTS.choices() # 1st call: [task0]. 2nd call: [task0, task1]. etc. + text = oneof TEXTS.choices() # 1st call: [task0]. 2nd call: [task0, task1]. etc. # Also valid but creates unnecessary initial branching: TEXTS = symmetry.nominal(name="task", limit=3, materialize=True) - text = any TEXTS.values() # Always: [task0, task1, task2] + text = oneof TEXTS.values() # Always: [task0, task1, task2] ``` 8. **`require` is a guard, not an assertion.** `require cond` disables the transition when `cond` is false -- the action simply doesn't execute. It does **not** report a failure. To check properties, use `always assertion`. Prefer `require` over `if not cond: return` for enabling conditions -- they have the same effect but `require` is more concise and idiomatic. diff --git a/parser/BuildAstVisitor.py b/parser/BuildAstVisitor.py index c507f8b..2db5be0 100644 --- a/parser/BuildAstVisitor.py +++ b/parser/BuildAstVisitor.py @@ -1038,8 +1038,14 @@ def visitAny_stmt(self, ctx:FizzParser.Any_stmtContext): if (child.getSymbol().type == FizzParser.LINE_BREAK or child.getSymbol().type == FizzParser.COLON or child.getSymbol().type == FizzParser.INDENT + or child.getSymbol().type == FizzParser.ONEOF + or child.getSymbol().type == FizzParser.IN ): continue + if child.getSymbol().type == FizzParser.ANY: + import sys + print("DeprecationWarning: 'any VAR in COLLECTION:' is deprecated, use 'oneof VAR in COLLECTION:' instead", file=sys.stderr) + continue self.log_symbol(child) else: print("visitAny_stmt child (unknown) type",child.__class__.__name__, dir(child)) @@ -1090,8 +1096,14 @@ def visitAny_assign_stmt(self, ctx:FizzParser.Any_assign_stmtContext): continue if (child.getSymbol().type == FizzParser.LINE_BREAK or child.getSymbol().type == FizzParser.INDENT + or child.getSymbol().type == FizzParser.ASSIGN + or child.getSymbol().type == FizzParser.ONEOF ): continue + if child.getSymbol().type == FizzParser.ANY: + import sys + print("DeprecationWarning: 'VAR = any COLLECTION' is deprecated, use 'VAR = oneof COLLECTION' instead", file=sys.stderr) + continue self.log_symbol(child) else: print("visitAny_assign_stmt child (unknown) type",child.__class__.__name__, dir(child)) diff --git a/parser/FizzLexer.py b/parser/FizzLexer.py index e381084..3ea7225 100644 --- a/parser/FizzLexer.py +++ b/parser/FizzLexer.py @@ -1,4 +1,4 @@ -# Generated from FizzLexer.g4 by ANTLR 4.13.1 +# Generated from FizzLexer.g4 by ANTLR 4.13.2 from antlr4 import * from io import StringIO import sys @@ -693,7 +693,7 @@ class FizzLexer(PythonLexerBase): def __init__(self, input=None, output:TextIO = sys.stdout): super().__init__(input, output) - self.checkVersion("4.13.1") + self.checkVersion("4.13.2") self._interp = LexerATNSimulator(self, self.atn, self.decisionsToDFA, PredictionContextCache()) self._actions = None self._predicates = None diff --git a/parser/FizzParser.g4 b/parser/FizzParser.g4 index f9ddd04..f95d491 100644 --- a/parser/FizzParser.g4 +++ b/parser/FizzParser.g4 @@ -79,7 +79,7 @@ compound_stmt | decorator* (classdef | funcdef) # class_or_func_def_stmt | decorator* roledef # role_def_stmt - | fairness? ANY exprlist IN testlist COLON suite # any_stmt + | fairness? (ANY | ONEOF) exprlist IN testlist COLON suite # any_stmt | INIT COLON suite # init_stmt | INVARIANTS COLON invariants_suite # invariants_stmt | assertiondef # assertion_stmt @@ -213,7 +213,7 @@ simple_stmt // function calls of the simplest form like ret = fn(arg1,arg2) small_stmt : (NAME ASSIGN)? (NAME DOT)? NAME OPEN_PAREN arglist? CLOSE_PAREN # func_call_stmt // Fizz specific shortcut - | exprlist ASSIGN fairness? ANY testlist ((COLON | IF) test)? # any_assign_stmt + | exprlist ASSIGN fairness? (ANY | ONEOF) testlist ((COLON | IF) test)? # any_assign_stmt | REQUIRE test # require_stmt | testlist_star_expr assign_part? # expr_stmt | {self.CheckVersion(2)}? PRINT ( diff --git a/parser/FizzParser.interp b/parser/FizzParser.interp index 646447c..022c65b 100644 --- a/parser/FizzParser.interp +++ b/parser/FizzParser.interp @@ -320,4 +320,4 @@ comp_iter atn: -[4, 1, 121, 1166, 2, 0, 7, 0, 2, 1, 7, 1, 2, 2, 7, 2, 2, 3, 7, 3, 2, 4, 7, 4, 2, 5, 7, 5, 2, 6, 7, 6, 2, 7, 7, 7, 2, 8, 7, 8, 2, 9, 7, 9, 2, 10, 7, 10, 2, 11, 7, 11, 2, 12, 7, 12, 2, 13, 7, 13, 2, 14, 7, 14, 2, 15, 7, 15, 2, 16, 7, 16, 2, 17, 7, 17, 2, 18, 7, 18, 2, 19, 7, 19, 2, 20, 7, 20, 2, 21, 7, 21, 2, 22, 7, 22, 2, 23, 7, 23, 2, 24, 7, 24, 2, 25, 7, 25, 2, 26, 7, 26, 2, 27, 7, 27, 2, 28, 7, 28, 2, 29, 7, 29, 2, 30, 7, 30, 2, 31, 7, 31, 2, 32, 7, 32, 2, 33, 7, 33, 2, 34, 7, 34, 2, 35, 7, 35, 2, 36, 7, 36, 2, 37, 7, 37, 2, 38, 7, 38, 2, 39, 7, 39, 2, 40, 7, 40, 2, 41, 7, 41, 2, 42, 7, 42, 2, 43, 7, 43, 2, 44, 7, 44, 2, 45, 7, 45, 2, 46, 7, 46, 2, 47, 7, 47, 2, 48, 7, 48, 2, 49, 7, 49, 2, 50, 7, 50, 2, 51, 7, 51, 2, 52, 7, 52, 2, 53, 7, 53, 2, 54, 7, 54, 2, 55, 7, 55, 2, 56, 7, 56, 2, 57, 7, 57, 2, 58, 7, 58, 2, 59, 7, 59, 2, 60, 7, 60, 2, 61, 7, 61, 2, 62, 7, 62, 2, 63, 7, 63, 2, 64, 7, 64, 2, 65, 7, 65, 2, 66, 7, 66, 2, 67, 7, 67, 2, 68, 7, 68, 2, 69, 7, 69, 1, 0, 1, 0, 1, 0, 3, 0, 144, 8, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 153, 8, 1, 1, 2, 1, 2, 4, 2, 157, 8, 2, 11, 2, 12, 2, 158, 1, 3, 1, 3, 5, 3, 163, 8, 3, 10, 3, 12, 3, 166, 9, 3, 1, 4, 1, 4, 1, 4, 3, 4, 171, 8, 4, 1, 5, 1, 5, 3, 5, 175, 8, 5, 1, 5, 1, 5, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 5, 6, 184, 8, 6, 10, 6, 12, 6, 187, 9, 6, 1, 6, 3, 6, 190, 8, 6, 1, 6, 3, 6, 193, 8, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 3, 6, 201, 8, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 4, 6, 214, 8, 6, 11, 6, 12, 6, 215, 1, 6, 3, 6, 219, 8, 6, 1, 6, 3, 6, 222, 8, 6, 1, 6, 3, 6, 225, 8, 6, 1, 6, 3, 6, 228, 8, 6, 1, 6, 1, 6, 1, 6, 1, 6, 5, 6, 234, 8, 6, 10, 6, 12, 6, 237, 9, 6, 1, 6, 1, 6, 1, 6, 1, 6, 5, 6, 243, 8, 6, 10, 6, 12, 6, 246, 9, 6, 1, 6, 1, 6, 3, 6, 250, 8, 6, 1, 6, 5, 6, 253, 8, 6, 10, 6, 12, 6, 256, 9, 6, 1, 6, 1, 6, 3, 6, 260, 8, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 3, 6, 283, 8, 6, 1, 7, 1, 7, 1, 7, 1, 7, 4, 7, 289, 8, 7, 11, 7, 12, 7, 290, 1, 7, 1, 7, 3, 7, 295, 8, 7, 1, 8, 1, 8, 1, 8, 4, 8, 300, 8, 8, 11, 8, 12, 8, 301, 1, 8, 1, 8, 1, 9, 5, 9, 307, 8, 9, 10, 9, 12, 9, 310, 9, 9, 1, 9, 1, 9, 1, 9, 1, 10, 1, 10, 1, 10, 1, 10, 3, 10, 319, 8, 10, 1, 10, 3, 10, 322, 8, 10, 1, 10, 1, 10, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 12, 1, 12, 1, 12, 1, 12, 1, 13, 1, 13, 1, 13, 1, 13, 1, 14, 1, 14, 1, 14, 3, 14, 342, 8, 14, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 3, 15, 356, 8, 15, 3, 15, 358, 8, 15, 1, 15, 1, 15, 1, 15, 1, 16, 3, 16, 364, 8, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 4, 16, 372, 8, 16, 11, 16, 12, 16, 373, 1, 16, 1, 16, 1, 17, 1, 17, 1, 17, 1, 17, 3, 17, 382, 8, 17, 1, 17, 3, 17, 385, 8, 17, 1, 17, 1, 17, 1, 17, 1, 18, 3, 18, 391, 8, 18, 1, 18, 1, 18, 1, 18, 1, 18, 3, 18, 397, 8, 18, 1, 18, 1, 18, 1, 18, 3, 18, 402, 8, 18, 1, 18, 1, 18, 1, 18, 1, 19, 3, 19, 408, 8, 19, 1, 19, 3, 19, 411, 8, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 3, 20, 423, 8, 20, 1, 21, 3, 21, 426, 8, 21, 1, 21, 1, 21, 1, 21, 1, 21, 3, 21, 432, 8, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 3, 22, 444, 8, 22, 1, 22, 1, 22, 4, 22, 448, 8, 22, 11, 22, 12, 22, 449, 1, 22, 1, 22, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 3, 23, 460, 8, 23, 1, 23, 1, 23, 4, 23, 464, 8, 23, 11, 23, 12, 23, 465, 1, 23, 1, 23, 1, 24, 1, 24, 1, 24, 1, 24, 1, 25, 4, 25, 475, 8, 25, 11, 25, 12, 25, 476, 1, 25, 1, 25, 1, 25, 1, 25, 3, 25, 483, 8, 25, 1, 25, 3, 25, 486, 8, 25, 1, 25, 1, 25, 1, 25, 1, 26, 1, 26, 1, 26, 3, 26, 494, 8, 26, 1, 26, 1, 26, 1, 26, 3, 26, 499, 8, 26, 1, 26, 1, 26, 3, 26, 503, 8, 26, 1, 26, 3, 26, 506, 8, 26, 1, 26, 3, 26, 509, 8, 26, 1, 26, 1, 26, 3, 26, 513, 8, 26, 3, 26, 515, 8, 26, 1, 27, 1, 27, 1, 27, 1, 28, 1, 28, 1, 28, 1, 29, 1, 29, 1, 29, 5, 29, 526, 8, 29, 10, 29, 12, 29, 529, 9, 29, 1, 30, 1, 30, 1, 30, 3, 30, 534, 8, 30, 1, 30, 3, 30, 537, 8, 30, 1, 31, 1, 31, 1, 31, 3, 31, 542, 8, 31, 1, 32, 1, 32, 1, 32, 5, 32, 547, 8, 32, 10, 32, 12, 32, 550, 9, 32, 1, 32, 3, 32, 553, 8, 32, 1, 32, 1, 32, 1, 33, 1, 33, 3, 33, 559, 8, 33, 1, 33, 1, 33, 3, 33, 563, 8, 33, 1, 33, 1, 33, 1, 33, 3, 33, 568, 8, 33, 1, 33, 1, 33, 1, 33, 1, 33, 3, 33, 574, 8, 33, 1, 33, 1, 33, 1, 33, 1, 33, 3, 33, 580, 8, 33, 1, 33, 1, 33, 1, 33, 1, 33, 3, 33, 586, 8, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 5, 33, 593, 8, 33, 10, 33, 12, 33, 596, 9, 33, 1, 33, 3, 33, 599, 8, 33, 1, 33, 1, 33, 1, 33, 1, 33, 4, 33, 605, 8, 33, 11, 33, 12, 33, 606, 1, 33, 3, 33, 610, 8, 33, 3, 33, 612, 8, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 3, 33, 623, 8, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 3, 33, 631, 8, 33, 3, 33, 633, 8, 33, 3, 33, 635, 8, 33, 1, 33, 1, 33, 3, 33, 639, 8, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 5, 33, 646, 8, 33, 10, 33, 12, 33, 649, 9, 33, 1, 33, 1, 33, 4, 33, 653, 8, 33, 11, 33, 12, 33, 654, 3, 33, 657, 8, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 3, 33, 666, 8, 33, 1, 33, 1, 33, 1, 33, 1, 33, 5, 33, 672, 8, 33, 10, 33, 12, 33, 675, 9, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 3, 33, 684, 8, 33, 3, 33, 686, 8, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 3, 33, 694, 8, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 5, 33, 701, 8, 33, 10, 33, 12, 33, 704, 9, 33, 1, 33, 1, 33, 3, 33, 708, 8, 33, 1, 34, 1, 34, 3, 34, 712, 8, 34, 1, 34, 1, 34, 4, 34, 716, 8, 34, 11, 34, 12, 34, 717, 1, 34, 1, 34, 3, 34, 722, 8, 34, 1, 34, 3, 34, 725, 8, 34, 1, 35, 1, 35, 1, 35, 1, 36, 1, 36, 1, 36, 1, 36, 5, 36, 734, 8, 36, 10, 36, 12, 36, 737, 9, 36, 1, 36, 1, 36, 3, 36, 741, 8, 36, 1, 36, 3, 36, 744, 8, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 3, 36, 751, 8, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 3, 36, 758, 8, 36, 3, 36, 760, 8, 36, 1, 37, 1, 37, 1, 37, 5, 37, 765, 8, 37, 10, 37, 12, 37, 768, 9, 37, 1, 37, 3, 37, 771, 8, 37, 1, 38, 1, 38, 1, 38, 5, 38, 776, 8, 38, 10, 38, 12, 38, 779, 9, 38, 1, 38, 3, 38, 782, 8, 38, 1, 39, 1, 39, 1, 39, 3, 39, 787, 8, 39, 1, 40, 1, 40, 1, 40, 5, 40, 792, 8, 40, 10, 40, 12, 40, 795, 9, 40, 1, 41, 1, 41, 1, 41, 3, 41, 800, 8, 41, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 3, 42, 808, 8, 42, 1, 42, 1, 42, 3, 42, 812, 8, 42, 1, 42, 1, 42, 3, 42, 816, 8, 42, 1, 43, 1, 43, 1, 43, 3, 43, 821, 8, 43, 1, 43, 1, 43, 1, 43, 3, 43, 826, 8, 43, 1, 43, 1, 43, 3, 43, 830, 8, 43, 1, 43, 3, 43, 833, 8, 43, 1, 43, 3, 43, 836, 8, 43, 1, 43, 1, 43, 3, 43, 840, 8, 43, 3, 43, 842, 8, 43, 1, 44, 1, 44, 1, 44, 5, 44, 847, 8, 44, 10, 44, 12, 44, 850, 9, 44, 1, 45, 1, 45, 1, 45, 3, 45, 855, 8, 45, 1, 45, 3, 45, 858, 8, 45, 1, 46, 1, 46, 1, 46, 1, 47, 1, 47, 1, 47, 1, 48, 1, 48, 1, 48, 1, 48, 3, 48, 870, 8, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 5, 48, 878, 8, 48, 10, 48, 12, 48, 881, 9, 48, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 3, 49, 895, 8, 49, 1, 49, 1, 49, 1, 49, 3, 49, 900, 8, 49, 3, 49, 902, 8, 49, 1, 49, 5, 49, 905, 8, 49, 10, 49, 12, 49, 908, 9, 49, 1, 50, 1, 50, 3, 50, 912, 8, 50, 1, 50, 1, 50, 5, 50, 916, 8, 50, 10, 50, 12, 50, 919, 9, 50, 1, 50, 1, 50, 3, 50, 923, 8, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 5, 50, 946, 8, 50, 10, 50, 12, 50, 949, 9, 50, 1, 51, 1, 51, 1, 51, 3, 51, 954, 8, 51, 1, 51, 1, 51, 1, 51, 3, 51, 959, 8, 51, 1, 51, 1, 51, 1, 51, 3, 51, 964, 8, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 3, 51, 972, 8, 51, 1, 51, 1, 51, 1, 51, 4, 51, 977, 8, 51, 11, 51, 12, 51, 978, 3, 51, 981, 8, 51, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 3, 52, 989, 8, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 3, 52, 998, 8, 52, 5, 52, 1000, 8, 52, 10, 52, 12, 52, 1003, 9, 52, 1, 52, 3, 52, 1006, 8, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 3, 52, 1014, 8, 52, 1, 53, 1, 53, 3, 53, 1018, 8, 53, 1, 53, 1, 53, 1, 53, 1, 53, 3, 53, 1024, 8, 53, 5, 53, 1026, 8, 53, 10, 53, 12, 53, 1029, 9, 53, 1, 53, 3, 53, 1032, 8, 53, 3, 53, 1034, 8, 53, 1, 54, 1, 54, 1, 54, 5, 54, 1039, 8, 54, 10, 54, 12, 54, 1042, 9, 54, 1, 54, 3, 54, 1045, 8, 54, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 5, 55, 1053, 8, 55, 10, 55, 12, 55, 1056, 9, 55, 1, 56, 1, 56, 1, 57, 1, 57, 1, 57, 3, 57, 1063, 8, 57, 1, 58, 1, 58, 1, 59, 1, 59, 3, 59, 1069, 8, 59, 1, 60, 1, 60, 1, 60, 3, 60, 1074, 8, 60, 1, 61, 1, 61, 1, 61, 3, 61, 1079, 8, 61, 1, 61, 3, 61, 1082, 8, 61, 1, 62, 1, 62, 3, 62, 1086, 8, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 3, 62, 1093, 8, 62, 1, 63, 1, 63, 1, 63, 5, 63, 1098, 8, 63, 10, 63, 12, 63, 1101, 9, 63, 1, 63, 3, 63, 1104, 8, 63, 1, 64, 1, 64, 1, 64, 1, 64, 3, 64, 1110, 8, 64, 1, 64, 1, 64, 3, 64, 1114, 8, 64, 1, 65, 1, 65, 1, 65, 5, 65, 1119, 8, 65, 10, 65, 12, 65, 1122, 9, 65, 1, 65, 3, 65, 1125, 8, 65, 1, 66, 1, 66, 1, 66, 1, 66, 3, 66, 1131, 8, 66, 1, 66, 3, 66, 1134, 8, 66, 3, 66, 1136, 8, 66, 1, 66, 1, 66, 3, 66, 1140, 8, 66, 1, 66, 3, 66, 1143, 8, 66, 3, 66, 1145, 8, 66, 1, 67, 1, 67, 3, 67, 1149, 8, 67, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 3, 68, 1156, 8, 68, 1, 69, 1, 69, 1, 69, 1, 69, 3, 69, 1162, 8, 69, 3, 69, 1164, 8, 69, 1, 69, 0, 4, 96, 98, 100, 110, 70, 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64, 66, 68, 70, 72, 74, 76, 78, 80, 82, 84, 86, 88, 90, 92, 94, 96, 98, 100, 102, 104, 106, 108, 110, 112, 114, 116, 118, 120, 122, 124, 126, 128, 130, 132, 134, 136, 138, 0, 16, 1, 0, 41, 42, 1, 0, 41, 43, 1, 0, 41, 44, 1, 0, 57, 58, 1, 1, 3, 3, 2, 0, 46, 46, 57, 59, 2, 0, 13, 13, 66, 66, 1, 0, 62, 63, 1, 0, 90, 102, 2, 0, 75, 76, 80, 80, 3, 0, 64, 64, 77, 79, 88, 88, 1, 0, 75, 76, 1, 0, 73, 74, 3, 0, 39, 40, 45, 45, 117, 117, 1, 0, 105, 108, 2, 0, 64, 64, 68, 68, 1331, 0, 143, 1, 0, 0, 0, 2, 152, 1, 0, 0, 0, 4, 156, 1, 0, 0, 0, 6, 160, 1, 0, 0, 0, 8, 170, 1, 0, 0, 0, 10, 172, 1, 0, 0, 0, 12, 282, 1, 0, 0, 0, 14, 294, 1, 0, 0, 0, 16, 296, 1, 0, 0, 0, 18, 308, 1, 0, 0, 0, 20, 314, 1, 0, 0, 0, 22, 325, 1, 0, 0, 0, 24, 330, 1, 0, 0, 0, 26, 334, 1, 0, 0, 0, 28, 338, 1, 0, 0, 0, 30, 343, 1, 0, 0, 0, 32, 363, 1, 0, 0, 0, 34, 377, 1, 0, 0, 0, 36, 390, 1, 0, 0, 0, 38, 407, 1, 0, 0, 0, 40, 417, 1, 0, 0, 0, 42, 425, 1, 0, 0, 0, 44, 437, 1, 0, 0, 0, 46, 453, 1, 0, 0, 0, 48, 469, 1, 0, 0, 0, 50, 474, 1, 0, 0, 0, 52, 514, 1, 0, 0, 0, 54, 516, 1, 0, 0, 0, 56, 519, 1, 0, 0, 0, 58, 522, 1, 0, 0, 0, 60, 536, 1, 0, 0, 0, 62, 538, 1, 0, 0, 0, 64, 543, 1, 0, 0, 0, 66, 707, 1, 0, 0, 0, 68, 724, 1, 0, 0, 0, 70, 726, 1, 0, 0, 0, 72, 759, 1, 0, 0, 0, 74, 761, 1, 0, 0, 0, 76, 772, 1, 0, 0, 0, 78, 783, 1, 0, 0, 0, 80, 788, 1, 0, 0, 0, 82, 796, 1, 0, 0, 0, 84, 815, 1, 0, 0, 0, 86, 841, 1, 0, 0, 0, 88, 843, 1, 0, 0, 0, 90, 857, 1, 0, 0, 0, 92, 859, 1, 0, 0, 0, 94, 862, 1, 0, 0, 0, 96, 869, 1, 0, 0, 0, 98, 882, 1, 0, 0, 0, 100, 922, 1, 0, 0, 0, 102, 980, 1, 0, 0, 0, 104, 1013, 1, 0, 0, 0, 106, 1017, 1, 0, 0, 0, 108, 1035, 1, 0, 0, 0, 110, 1046, 1, 0, 0, 0, 112, 1057, 1, 0, 0, 0, 114, 1062, 1, 0, 0, 0, 116, 1064, 1, 0, 0, 0, 118, 1066, 1, 0, 0, 0, 120, 1073, 1, 0, 0, 0, 122, 1081, 1, 0, 0, 0, 124, 1092, 1, 0, 0, 0, 126, 1094, 1, 0, 0, 0, 128, 1113, 1, 0, 0, 0, 130, 1115, 1, 0, 0, 0, 132, 1144, 1, 0, 0, 0, 134, 1146, 1, 0, 0, 0, 136, 1150, 1, 0, 0, 0, 138, 1163, 1, 0, 0, 0, 140, 144, 3, 2, 1, 0, 141, 144, 3, 4, 2, 0, 142, 144, 3, 6, 3, 0, 143, 140, 1, 0, 0, 0, 143, 141, 1, 0, 0, 0, 143, 142, 1, 0, 0, 0, 143, 144, 1, 0, 0, 0, 144, 145, 1, 0, 0, 0, 145, 146, 5, 0, 0, 1, 146, 1, 1, 0, 0, 0, 147, 153, 5, 3, 0, 0, 148, 153, 3, 64, 32, 0, 149, 150, 3, 12, 6, 0, 150, 151, 5, 3, 0, 0, 151, 153, 1, 0, 0, 0, 152, 147, 1, 0, 0, 0, 152, 148, 1, 0, 0, 0, 152, 149, 1, 0, 0, 0, 153, 3, 1, 0, 0, 0, 154, 157, 5, 3, 0, 0, 155, 157, 3, 8, 4, 0, 156, 154, 1, 0, 0, 0, 156, 155, 1, 0, 0, 0, 157, 158, 1, 0, 0, 0, 158, 156, 1, 0, 0, 0, 158, 159, 1, 0, 0, 0, 159, 5, 1, 0, 0, 0, 160, 164, 3, 108, 54, 0, 161, 163, 5, 3, 0, 0, 162, 161, 1, 0, 0, 0, 163, 166, 1, 0, 0, 0, 164, 162, 1, 0, 0, 0, 164, 165, 1, 0, 0, 0, 165, 7, 1, 0, 0, 0, 166, 164, 1, 0, 0, 0, 167, 171, 3, 64, 32, 0, 168, 171, 3, 12, 6, 0, 169, 171, 3, 10, 5, 0, 170, 167, 1, 0, 0, 0, 170, 168, 1, 0, 0, 0, 170, 169, 1, 0, 0, 0, 171, 9, 1, 0, 0, 0, 172, 174, 5, 104, 0, 0, 173, 175, 5, 3, 0, 0, 174, 173, 1, 0, 0, 0, 174, 175, 1, 0, 0, 0, 175, 176, 1, 0, 0, 0, 176, 177, 3, 8, 4, 0, 177, 11, 1, 0, 0, 0, 178, 179, 5, 13, 0, 0, 179, 180, 3, 84, 42, 0, 180, 181, 5, 66, 0, 0, 181, 185, 3, 14, 7, 0, 182, 184, 3, 22, 11, 0, 183, 182, 1, 0, 0, 0, 184, 187, 1, 0, 0, 0, 185, 183, 1, 0, 0, 0, 185, 186, 1, 0, 0, 0, 186, 189, 1, 0, 0, 0, 187, 185, 1, 0, 0, 0, 188, 190, 3, 24, 12, 0, 189, 188, 1, 0, 0, 0, 189, 190, 1, 0, 0, 0, 190, 283, 1, 0, 0, 0, 191, 193, 7, 0, 0, 0, 192, 191, 1, 0, 0, 0, 192, 193, 1, 0, 0, 0, 193, 194, 1, 0, 0, 0, 194, 195, 5, 16, 0, 0, 195, 196, 3, 84, 42, 0, 196, 197, 5, 66, 0, 0, 197, 198, 3, 14, 7, 0, 198, 283, 1, 0, 0, 0, 199, 201, 7, 1, 0, 0, 200, 199, 1, 0, 0, 0, 200, 201, 1, 0, 0, 0, 201, 202, 1, 0, 0, 0, 202, 203, 5, 17, 0, 0, 203, 204, 3, 74, 37, 0, 204, 205, 5, 18, 0, 0, 205, 206, 3, 108, 54, 0, 206, 207, 5, 66, 0, 0, 207, 208, 3, 14, 7, 0, 208, 283, 1, 0, 0, 0, 209, 210, 5, 19, 0, 0, 210, 211, 5, 66, 0, 0, 211, 224, 3, 14, 7, 0, 212, 214, 3, 30, 15, 0, 213, 212, 1, 0, 0, 0, 214, 215, 1, 0, 0, 0, 215, 213, 1, 0, 0, 0, 215, 216, 1, 0, 0, 0, 216, 218, 1, 0, 0, 0, 217, 219, 3, 24, 12, 0, 218, 217, 1, 0, 0, 0, 218, 219, 1, 0, 0, 0, 219, 221, 1, 0, 0, 0, 220, 222, 3, 26, 13, 0, 221, 220, 1, 0, 0, 0, 221, 222, 1, 0, 0, 0, 222, 225, 1, 0, 0, 0, 223, 225, 3, 26, 13, 0, 224, 213, 1, 0, 0, 0, 224, 223, 1, 0, 0, 0, 225, 283, 1, 0, 0, 0, 226, 228, 5, 35, 0, 0, 227, 226, 1, 0, 0, 0, 227, 228, 1, 0, 0, 0, 228, 229, 1, 0, 0, 0, 229, 230, 5, 22, 0, 0, 230, 235, 3, 28, 14, 0, 231, 232, 5, 65, 0, 0, 232, 234, 3, 28, 14, 0, 233, 231, 1, 0, 0, 0, 234, 237, 1, 0, 0, 0, 235, 233, 1, 0, 0, 0, 235, 236, 1, 0, 0, 0, 236, 238, 1, 0, 0, 0, 237, 235, 1, 0, 0, 0, 238, 239, 5, 66, 0, 0, 239, 240, 3, 14, 7, 0, 240, 283, 1, 0, 0, 0, 241, 243, 3, 20, 10, 0, 242, 241, 1, 0, 0, 0, 243, 246, 1, 0, 0, 0, 244, 242, 1, 0, 0, 0, 244, 245, 1, 0, 0, 0, 245, 249, 1, 0, 0, 0, 246, 244, 1, 0, 0, 0, 247, 250, 3, 34, 17, 0, 248, 250, 3, 36, 18, 0, 249, 247, 1, 0, 0, 0, 249, 248, 1, 0, 0, 0, 250, 283, 1, 0, 0, 0, 251, 253, 3, 20, 10, 0, 252, 251, 1, 0, 0, 0, 253, 256, 1, 0, 0, 0, 254, 252, 1, 0, 0, 0, 254, 255, 1, 0, 0, 0, 255, 257, 1, 0, 0, 0, 256, 254, 1, 0, 0, 0, 257, 283, 3, 32, 16, 0, 258, 260, 3, 40, 20, 0, 259, 258, 1, 0, 0, 0, 259, 260, 1, 0, 0, 0, 260, 261, 1, 0, 0, 0, 261, 262, 5, 45, 0, 0, 262, 263, 3, 74, 37, 0, 263, 264, 5, 18, 0, 0, 264, 265, 3, 108, 54, 0, 265, 266, 5, 66, 0, 0, 266, 267, 3, 14, 7, 0, 267, 283, 1, 0, 0, 0, 268, 269, 5, 52, 0, 0, 269, 270, 5, 66, 0, 0, 270, 283, 3, 14, 7, 0, 271, 272, 5, 56, 0, 0, 272, 273, 5, 66, 0, 0, 273, 283, 3, 16, 8, 0, 274, 283, 3, 50, 25, 0, 275, 283, 3, 38, 19, 0, 276, 283, 3, 42, 21, 0, 277, 283, 3, 44, 22, 0, 278, 283, 3, 46, 23, 0, 279, 280, 7, 2, 0, 0, 280, 281, 5, 66, 0, 0, 281, 283, 3, 14, 7, 0, 282, 178, 1, 0, 0, 0, 282, 192, 1, 0, 0, 0, 282, 200, 1, 0, 0, 0, 282, 209, 1, 0, 0, 0, 282, 227, 1, 0, 0, 0, 282, 244, 1, 0, 0, 0, 282, 254, 1, 0, 0, 0, 282, 259, 1, 0, 0, 0, 282, 268, 1, 0, 0, 0, 282, 271, 1, 0, 0, 0, 282, 274, 1, 0, 0, 0, 282, 275, 1, 0, 0, 0, 282, 276, 1, 0, 0, 0, 282, 277, 1, 0, 0, 0, 282, 278, 1, 0, 0, 0, 282, 279, 1, 0, 0, 0, 283, 13, 1, 0, 0, 0, 284, 295, 3, 64, 32, 0, 285, 286, 5, 3, 0, 0, 286, 288, 5, 1, 0, 0, 287, 289, 3, 8, 4, 0, 288, 287, 1, 0, 0, 0, 289, 290, 1, 0, 0, 0, 290, 288, 1, 0, 0, 0, 290, 291, 1, 0, 0, 0, 291, 292, 1, 0, 0, 0, 292, 293, 5, 2, 0, 0, 293, 295, 1, 0, 0, 0, 294, 284, 1, 0, 0, 0, 294, 285, 1, 0, 0, 0, 295, 15, 1, 0, 0, 0, 296, 297, 5, 3, 0, 0, 297, 299, 5, 1, 0, 0, 298, 300, 3, 18, 9, 0, 299, 298, 1, 0, 0, 0, 300, 301, 1, 0, 0, 0, 301, 299, 1, 0, 0, 0, 301, 302, 1, 0, 0, 0, 302, 303, 1, 0, 0, 0, 303, 304, 5, 2, 0, 0, 304, 17, 1, 0, 0, 0, 305, 307, 7, 3, 0, 0, 306, 305, 1, 0, 0, 0, 307, 310, 1, 0, 0, 0, 308, 306, 1, 0, 0, 0, 308, 309, 1, 0, 0, 0, 309, 311, 1, 0, 0, 0, 310, 308, 1, 0, 0, 0, 311, 312, 3, 84, 42, 0, 312, 313, 7, 4, 0, 0, 313, 19, 1, 0, 0, 0, 314, 315, 5, 88, 0, 0, 315, 321, 3, 110, 55, 0, 316, 318, 5, 111, 0, 0, 317, 319, 3, 126, 63, 0, 318, 317, 1, 0, 0, 0, 318, 319, 1, 0, 0, 0, 319, 320, 1, 0, 0, 0, 320, 322, 5, 112, 0, 0, 321, 316, 1, 0, 0, 0, 321, 322, 1, 0, 0, 0, 322, 323, 1, 0, 0, 0, 323, 324, 5, 3, 0, 0, 324, 21, 1, 0, 0, 0, 325, 326, 5, 14, 0, 0, 326, 327, 3, 84, 42, 0, 327, 328, 5, 66, 0, 0, 328, 329, 3, 14, 7, 0, 329, 23, 1, 0, 0, 0, 330, 331, 5, 15, 0, 0, 331, 332, 5, 66, 0, 0, 332, 333, 3, 14, 7, 0, 333, 25, 1, 0, 0, 0, 334, 335, 5, 21, 0, 0, 335, 336, 5, 66, 0, 0, 336, 337, 3, 14, 7, 0, 337, 27, 1, 0, 0, 0, 338, 341, 3, 84, 42, 0, 339, 340, 5, 10, 0, 0, 340, 342, 3, 100, 50, 0, 341, 339, 1, 0, 0, 0, 341, 342, 1, 0, 0, 0, 342, 29, 1, 0, 0, 0, 343, 357, 5, 23, 0, 0, 344, 355, 3, 84, 42, 0, 345, 346, 4, 15, 0, 0, 346, 347, 5, 65, 0, 0, 347, 348, 3, 112, 56, 0, 348, 349, 6, 15, -1, 0, 349, 356, 1, 0, 0, 0, 350, 351, 4, 15, 1, 0, 351, 352, 5, 10, 0, 0, 352, 353, 3, 112, 56, 0, 353, 354, 6, 15, -1, 0, 354, 356, 1, 0, 0, 0, 355, 345, 1, 0, 0, 0, 355, 350, 1, 0, 0, 0, 355, 356, 1, 0, 0, 0, 356, 358, 1, 0, 0, 0, 357, 344, 1, 0, 0, 0, 357, 358, 1, 0, 0, 0, 358, 359, 1, 0, 0, 0, 359, 360, 5, 66, 0, 0, 360, 361, 3, 14, 7, 0, 361, 31, 1, 0, 0, 0, 362, 364, 5, 54, 0, 0, 363, 362, 1, 0, 0, 0, 363, 364, 1, 0, 0, 0, 364, 365, 1, 0, 0, 0, 365, 366, 5, 53, 0, 0, 366, 367, 3, 112, 56, 0, 367, 368, 5, 66, 0, 0, 368, 369, 5, 3, 0, 0, 369, 371, 5, 1, 0, 0, 370, 372, 3, 8, 4, 0, 371, 370, 1, 0, 0, 0, 372, 373, 1, 0, 0, 0, 373, 371, 1, 0, 0, 0, 373, 374, 1, 0, 0, 0, 374, 375, 1, 0, 0, 0, 375, 376, 5, 2, 0, 0, 376, 33, 1, 0, 0, 0, 377, 378, 5, 29, 0, 0, 378, 384, 3, 112, 56, 0, 379, 381, 5, 111, 0, 0, 380, 382, 3, 126, 63, 0, 381, 380, 1, 0, 0, 0, 381, 382, 1, 0, 0, 0, 382, 383, 1, 0, 0, 0, 383, 385, 5, 112, 0, 0, 384, 379, 1, 0, 0, 0, 384, 385, 1, 0, 0, 0, 385, 386, 1, 0, 0, 0, 386, 387, 5, 66, 0, 0, 387, 388, 3, 14, 7, 0, 388, 35, 1, 0, 0, 0, 389, 391, 5, 35, 0, 0, 390, 389, 1, 0, 0, 0, 390, 391, 1, 0, 0, 0, 391, 392, 1, 0, 0, 0, 392, 393, 5, 4, 0, 0, 393, 394, 3, 112, 56, 0, 394, 396, 5, 111, 0, 0, 395, 397, 3, 52, 26, 0, 396, 395, 1, 0, 0, 0, 396, 397, 1, 0, 0, 0, 397, 398, 1, 0, 0, 0, 398, 401, 5, 112, 0, 0, 399, 400, 5, 89, 0, 0, 400, 402, 3, 84, 42, 0, 401, 399, 1, 0, 0, 0, 401, 402, 1, 0, 0, 0, 402, 403, 1, 0, 0, 0, 403, 404, 5, 66, 0, 0, 404, 405, 3, 14, 7, 0, 405, 37, 1, 0, 0, 0, 406, 408, 7, 2, 0, 0, 407, 406, 1, 0, 0, 0, 407, 408, 1, 0, 0, 0, 408, 410, 1, 0, 0, 0, 409, 411, 3, 40, 20, 0, 410, 409, 1, 0, 0, 0, 410, 411, 1, 0, 0, 0, 411, 412, 1, 0, 0, 0, 412, 413, 5, 47, 0, 0, 413, 414, 3, 112, 56, 0, 414, 415, 5, 66, 0, 0, 415, 416, 3, 14, 7, 0, 416, 39, 1, 0, 0, 0, 417, 422, 5, 49, 0, 0, 418, 419, 5, 81, 0, 0, 419, 420, 3, 112, 56, 0, 420, 421, 5, 82, 0, 0, 421, 423, 1, 0, 0, 0, 422, 418, 1, 0, 0, 0, 422, 423, 1, 0, 0, 0, 423, 41, 1, 0, 0, 0, 424, 426, 7, 2, 0, 0, 425, 424, 1, 0, 0, 0, 425, 426, 1, 0, 0, 0, 426, 427, 1, 0, 0, 0, 427, 428, 5, 48, 0, 0, 428, 429, 3, 112, 56, 0, 429, 431, 5, 111, 0, 0, 430, 432, 3, 52, 26, 0, 431, 430, 1, 0, 0, 0, 431, 432, 1, 0, 0, 0, 432, 433, 1, 0, 0, 0, 433, 434, 5, 112, 0, 0, 434, 435, 5, 66, 0, 0, 435, 436, 3, 14, 7, 0, 436, 43, 1, 0, 0, 0, 437, 438, 5, 60, 0, 0, 438, 439, 5, 66, 0, 0, 439, 440, 5, 3, 0, 0, 440, 447, 5, 1, 0, 0, 441, 443, 3, 48, 24, 0, 442, 444, 5, 65, 0, 0, 443, 442, 1, 0, 0, 0, 443, 444, 1, 0, 0, 0, 444, 445, 1, 0, 0, 0, 445, 446, 5, 3, 0, 0, 446, 448, 1, 0, 0, 0, 447, 441, 1, 0, 0, 0, 448, 449, 1, 0, 0, 0, 449, 447, 1, 0, 0, 0, 449, 450, 1, 0, 0, 0, 450, 451, 1, 0, 0, 0, 451, 452, 5, 2, 0, 0, 452, 45, 1, 0, 0, 0, 453, 454, 5, 61, 0, 0, 454, 455, 5, 66, 0, 0, 455, 456, 5, 3, 0, 0, 456, 463, 5, 1, 0, 0, 457, 459, 3, 48, 24, 0, 458, 460, 5, 65, 0, 0, 459, 458, 1, 0, 0, 0, 459, 460, 1, 0, 0, 0, 460, 461, 1, 0, 0, 0, 461, 462, 5, 3, 0, 0, 462, 464, 1, 0, 0, 0, 463, 457, 1, 0, 0, 0, 464, 465, 1, 0, 0, 0, 465, 463, 1, 0, 0, 0, 465, 466, 1, 0, 0, 0, 466, 467, 1, 0, 0, 0, 467, 468, 5, 2, 0, 0, 468, 47, 1, 0, 0, 0, 469, 470, 3, 112, 56, 0, 470, 471, 5, 66, 0, 0, 471, 472, 3, 84, 42, 0, 472, 49, 1, 0, 0, 0, 473, 475, 7, 5, 0, 0, 474, 473, 1, 0, 0, 0, 475, 476, 1, 0, 0, 0, 476, 474, 1, 0, 0, 0, 476, 477, 1, 0, 0, 0, 477, 478, 1, 0, 0, 0, 478, 479, 5, 55, 0, 0, 479, 485, 3, 112, 56, 0, 480, 482, 5, 111, 0, 0, 481, 483, 3, 52, 26, 0, 482, 481, 1, 0, 0, 0, 482, 483, 1, 0, 0, 0, 483, 484, 1, 0, 0, 0, 484, 486, 5, 112, 0, 0, 485, 480, 1, 0, 0, 0, 485, 486, 1, 0, 0, 0, 486, 487, 1, 0, 0, 0, 487, 488, 5, 66, 0, 0, 488, 489, 3, 14, 7, 0, 489, 51, 1, 0, 0, 0, 490, 491, 3, 58, 29, 0, 491, 492, 5, 65, 0, 0, 492, 494, 1, 0, 0, 0, 493, 490, 1, 0, 0, 0, 493, 494, 1, 0, 0, 0, 494, 505, 1, 0, 0, 0, 495, 498, 3, 54, 27, 0, 496, 497, 5, 65, 0, 0, 497, 499, 3, 58, 29, 0, 498, 496, 1, 0, 0, 0, 498, 499, 1, 0, 0, 0, 499, 502, 1, 0, 0, 0, 500, 501, 5, 65, 0, 0, 501, 503, 3, 56, 28, 0, 502, 500, 1, 0, 0, 0, 502, 503, 1, 0, 0, 0, 503, 506, 1, 0, 0, 0, 504, 506, 3, 56, 28, 0, 505, 495, 1, 0, 0, 0, 505, 504, 1, 0, 0, 0, 506, 508, 1, 0, 0, 0, 507, 509, 5, 65, 0, 0, 508, 507, 1, 0, 0, 0, 508, 509, 1, 0, 0, 0, 509, 515, 1, 0, 0, 0, 510, 512, 3, 58, 29, 0, 511, 513, 5, 65, 0, 0, 512, 511, 1, 0, 0, 0, 512, 513, 1, 0, 0, 0, 513, 515, 1, 0, 0, 0, 514, 493, 1, 0, 0, 0, 514, 510, 1, 0, 0, 0, 515, 53, 1, 0, 0, 0, 516, 517, 5, 64, 0, 0, 517, 518, 3, 62, 31, 0, 518, 55, 1, 0, 0, 0, 519, 520, 5, 68, 0, 0, 520, 521, 3, 62, 31, 0, 521, 57, 1, 0, 0, 0, 522, 527, 3, 60, 30, 0, 523, 524, 5, 65, 0, 0, 524, 526, 3, 60, 30, 0, 525, 523, 1, 0, 0, 0, 526, 529, 1, 0, 0, 0, 527, 525, 1, 0, 0, 0, 527, 528, 1, 0, 0, 0, 528, 59, 1, 0, 0, 0, 529, 527, 1, 0, 0, 0, 530, 533, 3, 62, 31, 0, 531, 532, 5, 69, 0, 0, 532, 534, 3, 84, 42, 0, 533, 531, 1, 0, 0, 0, 533, 534, 1, 0, 0, 0, 534, 537, 1, 0, 0, 0, 535, 537, 5, 64, 0, 0, 536, 530, 1, 0, 0, 0, 536, 535, 1, 0, 0, 0, 537, 61, 1, 0, 0, 0, 538, 541, 3, 112, 56, 0, 539, 540, 5, 66, 0, 0, 540, 542, 3, 84, 42, 0, 541, 539, 1, 0, 0, 0, 541, 542, 1, 0, 0, 0, 542, 63, 1, 0, 0, 0, 543, 548, 3, 66, 33, 0, 544, 545, 5, 67, 0, 0, 545, 547, 3, 66, 33, 0, 546, 544, 1, 0, 0, 0, 547, 550, 1, 0, 0, 0, 548, 546, 1, 0, 0, 0, 548, 549, 1, 0, 0, 0, 549, 552, 1, 0, 0, 0, 550, 548, 1, 0, 0, 0, 551, 553, 5, 67, 0, 0, 552, 551, 1, 0, 0, 0, 552, 553, 1, 0, 0, 0, 553, 554, 1, 0, 0, 0, 554, 555, 7, 4, 0, 0, 555, 65, 1, 0, 0, 0, 556, 557, 5, 117, 0, 0, 557, 559, 5, 69, 0, 0, 558, 556, 1, 0, 0, 0, 558, 559, 1, 0, 0, 0, 559, 562, 1, 0, 0, 0, 560, 561, 5, 117, 0, 0, 561, 563, 5, 62, 0, 0, 562, 560, 1, 0, 0, 0, 562, 563, 1, 0, 0, 0, 563, 564, 1, 0, 0, 0, 564, 565, 5, 117, 0, 0, 565, 567, 5, 111, 0, 0, 566, 568, 3, 126, 63, 0, 567, 566, 1, 0, 0, 0, 567, 568, 1, 0, 0, 0, 568, 569, 1, 0, 0, 0, 569, 708, 5, 112, 0, 0, 570, 571, 3, 74, 37, 0, 571, 573, 5, 69, 0, 0, 572, 574, 3, 40, 20, 0, 573, 572, 1, 0, 0, 0, 573, 574, 1, 0, 0, 0, 574, 575, 1, 0, 0, 0, 575, 576, 5, 45, 0, 0, 576, 579, 3, 108, 54, 0, 577, 578, 7, 6, 0, 0, 578, 580, 3, 84, 42, 0, 579, 577, 1, 0, 0, 0, 579, 580, 1, 0, 0, 0, 580, 708, 1, 0, 0, 0, 581, 582, 5, 50, 0, 0, 582, 708, 3, 84, 42, 0, 583, 585, 3, 68, 34, 0, 584, 586, 3, 72, 36, 0, 585, 584, 1, 0, 0, 0, 585, 586, 1, 0, 0, 0, 586, 708, 1, 0, 0, 0, 587, 588, 4, 33, 2, 0, 588, 611, 5, 37, 0, 0, 589, 594, 3, 84, 42, 0, 590, 591, 5, 65, 0, 0, 591, 593, 3, 84, 42, 0, 592, 590, 1, 0, 0, 0, 593, 596, 1, 0, 0, 0, 594, 592, 1, 0, 0, 0, 594, 595, 1, 0, 0, 0, 595, 598, 1, 0, 0, 0, 596, 594, 1, 0, 0, 0, 597, 599, 5, 65, 0, 0, 598, 597, 1, 0, 0, 0, 598, 599, 1, 0, 0, 0, 599, 612, 1, 0, 0, 0, 600, 601, 5, 74, 0, 0, 601, 604, 3, 84, 42, 0, 602, 603, 5, 65, 0, 0, 603, 605, 3, 84, 42, 0, 604, 602, 1, 0, 0, 0, 605, 606, 1, 0, 0, 0, 606, 604, 1, 0, 0, 0, 606, 607, 1, 0, 0, 0, 607, 609, 1, 0, 0, 0, 608, 610, 5, 65, 0, 0, 609, 608, 1, 0, 0, 0, 609, 610, 1, 0, 0, 0, 610, 612, 1, 0, 0, 0, 611, 589, 1, 0, 0, 0, 611, 600, 1, 0, 0, 0, 612, 613, 1, 0, 0, 0, 613, 614, 6, 33, -1, 0, 614, 708, 1, 0, 0, 0, 615, 616, 5, 31, 0, 0, 616, 708, 3, 74, 37, 0, 617, 708, 5, 32, 0, 0, 618, 708, 5, 34, 0, 0, 619, 708, 5, 33, 0, 0, 620, 622, 5, 5, 0, 0, 621, 623, 3, 108, 54, 0, 622, 621, 1, 0, 0, 0, 622, 623, 1, 0, 0, 0, 623, 708, 1, 0, 0, 0, 624, 634, 5, 6, 0, 0, 625, 632, 3, 84, 42, 0, 626, 627, 5, 65, 0, 0, 627, 630, 3, 84, 42, 0, 628, 629, 5, 65, 0, 0, 629, 631, 3, 84, 42, 0, 630, 628, 1, 0, 0, 0, 630, 631, 1, 0, 0, 0, 631, 633, 1, 0, 0, 0, 632, 626, 1, 0, 0, 0, 632, 633, 1, 0, 0, 0, 633, 635, 1, 0, 0, 0, 634, 625, 1, 0, 0, 0, 634, 635, 1, 0, 0, 0, 635, 638, 1, 0, 0, 0, 636, 637, 5, 7, 0, 0, 637, 639, 3, 84, 42, 0, 638, 636, 1, 0, 0, 0, 638, 639, 1, 0, 0, 0, 639, 708, 1, 0, 0, 0, 640, 708, 3, 118, 59, 0, 641, 642, 5, 8, 0, 0, 642, 708, 3, 80, 40, 0, 643, 656, 5, 7, 0, 0, 644, 646, 7, 7, 0, 0, 645, 644, 1, 0, 0, 0, 646, 649, 1, 0, 0, 0, 647, 645, 1, 0, 0, 0, 647, 648, 1, 0, 0, 0, 648, 650, 1, 0, 0, 0, 649, 647, 1, 0, 0, 0, 650, 657, 3, 110, 55, 0, 651, 653, 7, 7, 0, 0, 652, 651, 1, 0, 0, 0, 653, 654, 1, 0, 0, 0, 654, 652, 1, 0, 0, 0, 654, 655, 1, 0, 0, 0, 655, 657, 1, 0, 0, 0, 656, 647, 1, 0, 0, 0, 656, 652, 1, 0, 0, 0, 657, 658, 1, 0, 0, 0, 658, 665, 5, 8, 0, 0, 659, 666, 5, 64, 0, 0, 660, 661, 5, 111, 0, 0, 661, 662, 3, 76, 38, 0, 662, 663, 5, 112, 0, 0, 663, 666, 1, 0, 0, 0, 664, 666, 3, 76, 38, 0, 665, 659, 1, 0, 0, 0, 665, 660, 1, 0, 0, 0, 665, 664, 1, 0, 0, 0, 666, 708, 1, 0, 0, 0, 667, 668, 5, 11, 0, 0, 668, 673, 3, 112, 56, 0, 669, 670, 5, 65, 0, 0, 670, 672, 3, 112, 56, 0, 671, 669, 1, 0, 0, 0, 672, 675, 1, 0, 0, 0, 673, 671, 1, 0, 0, 0, 673, 674, 1, 0, 0, 0, 674, 708, 1, 0, 0, 0, 675, 673, 1, 0, 0, 0, 676, 677, 4, 33, 3, 0, 677, 678, 5, 38, 0, 0, 678, 685, 3, 100, 50, 0, 679, 680, 5, 18, 0, 0, 680, 683, 3, 84, 42, 0, 681, 682, 5, 65, 0, 0, 682, 684, 3, 84, 42, 0, 683, 681, 1, 0, 0, 0, 683, 684, 1, 0, 0, 0, 684, 686, 1, 0, 0, 0, 685, 679, 1, 0, 0, 0, 685, 686, 1, 0, 0, 0, 686, 687, 1, 0, 0, 0, 687, 688, 6, 33, -1, 0, 688, 708, 1, 0, 0, 0, 689, 690, 5, 12, 0, 0, 690, 693, 3, 84, 42, 0, 691, 692, 5, 65, 0, 0, 692, 694, 3, 84, 42, 0, 693, 691, 1, 0, 0, 0, 693, 694, 1, 0, 0, 0, 694, 708, 1, 0, 0, 0, 695, 696, 4, 33, 4, 0, 696, 697, 5, 9, 0, 0, 697, 702, 3, 112, 56, 0, 698, 699, 5, 65, 0, 0, 699, 701, 3, 112, 56, 0, 700, 698, 1, 0, 0, 0, 701, 704, 1, 0, 0, 0, 702, 700, 1, 0, 0, 0, 702, 703, 1, 0, 0, 0, 703, 705, 1, 0, 0, 0, 704, 702, 1, 0, 0, 0, 705, 706, 6, 33, -1, 0, 706, 708, 1, 0, 0, 0, 707, 558, 1, 0, 0, 0, 707, 570, 1, 0, 0, 0, 707, 581, 1, 0, 0, 0, 707, 583, 1, 0, 0, 0, 707, 587, 1, 0, 0, 0, 707, 615, 1, 0, 0, 0, 707, 617, 1, 0, 0, 0, 707, 618, 1, 0, 0, 0, 707, 619, 1, 0, 0, 0, 707, 620, 1, 0, 0, 0, 707, 624, 1, 0, 0, 0, 707, 640, 1, 0, 0, 0, 707, 641, 1, 0, 0, 0, 707, 643, 1, 0, 0, 0, 707, 667, 1, 0, 0, 0, 707, 676, 1, 0, 0, 0, 707, 689, 1, 0, 0, 0, 707, 695, 1, 0, 0, 0, 708, 67, 1, 0, 0, 0, 709, 712, 3, 84, 42, 0, 710, 712, 3, 70, 35, 0, 711, 709, 1, 0, 0, 0, 711, 710, 1, 0, 0, 0, 712, 713, 1, 0, 0, 0, 713, 714, 5, 65, 0, 0, 714, 716, 1, 0, 0, 0, 715, 711, 1, 0, 0, 0, 716, 717, 1, 0, 0, 0, 717, 715, 1, 0, 0, 0, 717, 718, 1, 0, 0, 0, 718, 721, 1, 0, 0, 0, 719, 722, 3, 84, 42, 0, 720, 722, 3, 70, 35, 0, 721, 719, 1, 0, 0, 0, 721, 720, 1, 0, 0, 0, 721, 722, 1, 0, 0, 0, 722, 725, 1, 0, 0, 0, 723, 725, 3, 108, 54, 0, 724, 715, 1, 0, 0, 0, 724, 723, 1, 0, 0, 0, 725, 69, 1, 0, 0, 0, 726, 727, 5, 64, 0, 0, 727, 728, 3, 100, 50, 0, 728, 71, 1, 0, 0, 0, 729, 743, 5, 69, 0, 0, 730, 735, 3, 68, 34, 0, 731, 732, 5, 69, 0, 0, 732, 734, 3, 68, 34, 0, 733, 731, 1, 0, 0, 0, 734, 737, 1, 0, 0, 0, 735, 733, 1, 0, 0, 0, 735, 736, 1, 0, 0, 0, 736, 740, 1, 0, 0, 0, 737, 735, 1, 0, 0, 0, 738, 739, 5, 69, 0, 0, 739, 741, 3, 118, 59, 0, 740, 738, 1, 0, 0, 0, 740, 741, 1, 0, 0, 0, 741, 744, 1, 0, 0, 0, 742, 744, 3, 118, 59, 0, 743, 730, 1, 0, 0, 0, 743, 742, 1, 0, 0, 0, 744, 760, 1, 0, 0, 0, 745, 746, 4, 36, 5, 0, 746, 747, 5, 66, 0, 0, 747, 750, 3, 84, 42, 0, 748, 749, 5, 69, 0, 0, 749, 751, 3, 108, 54, 0, 750, 748, 1, 0, 0, 0, 750, 751, 1, 0, 0, 0, 751, 752, 1, 0, 0, 0, 752, 753, 6, 36, -1, 0, 753, 760, 1, 0, 0, 0, 754, 757, 7, 8, 0, 0, 755, 758, 3, 118, 59, 0, 756, 758, 3, 108, 54, 0, 757, 755, 1, 0, 0, 0, 757, 756, 1, 0, 0, 0, 758, 760, 1, 0, 0, 0, 759, 729, 1, 0, 0, 0, 759, 745, 1, 0, 0, 0, 759, 754, 1, 0, 0, 0, 760, 73, 1, 0, 0, 0, 761, 766, 3, 100, 50, 0, 762, 763, 5, 65, 0, 0, 763, 765, 3, 100, 50, 0, 764, 762, 1, 0, 0, 0, 765, 768, 1, 0, 0, 0, 766, 764, 1, 0, 0, 0, 766, 767, 1, 0, 0, 0, 767, 770, 1, 0, 0, 0, 768, 766, 1, 0, 0, 0, 769, 771, 5, 65, 0, 0, 770, 769, 1, 0, 0, 0, 770, 771, 1, 0, 0, 0, 771, 75, 1, 0, 0, 0, 772, 777, 3, 78, 39, 0, 773, 774, 5, 65, 0, 0, 774, 776, 3, 78, 39, 0, 775, 773, 1, 0, 0, 0, 776, 779, 1, 0, 0, 0, 777, 775, 1, 0, 0, 0, 777, 778, 1, 0, 0, 0, 778, 781, 1, 0, 0, 0, 779, 777, 1, 0, 0, 0, 780, 782, 5, 65, 0, 0, 781, 780, 1, 0, 0, 0, 781, 782, 1, 0, 0, 0, 782, 77, 1, 0, 0, 0, 783, 786, 3, 112, 56, 0, 784, 785, 5, 10, 0, 0, 785, 787, 3, 112, 56, 0, 786, 784, 1, 0, 0, 0, 786, 787, 1, 0, 0, 0, 787, 79, 1, 0, 0, 0, 788, 793, 3, 82, 41, 0, 789, 790, 5, 65, 0, 0, 790, 792, 3, 82, 41, 0, 791, 789, 1, 0, 0, 0, 792, 795, 1, 0, 0, 0, 793, 791, 1, 0, 0, 0, 793, 794, 1, 0, 0, 0, 794, 81, 1, 0, 0, 0, 795, 793, 1, 0, 0, 0, 796, 799, 3, 110, 55, 0, 797, 798, 5, 10, 0, 0, 798, 800, 3, 112, 56, 0, 799, 797, 1, 0, 0, 0, 799, 800, 1, 0, 0, 0, 800, 83, 1, 0, 0, 0, 801, 807, 3, 96, 48, 0, 802, 803, 5, 13, 0, 0, 803, 804, 3, 96, 48, 0, 804, 805, 5, 15, 0, 0, 805, 806, 3, 84, 42, 0, 806, 808, 1, 0, 0, 0, 807, 802, 1, 0, 0, 0, 807, 808, 1, 0, 0, 0, 808, 816, 1, 0, 0, 0, 809, 811, 5, 24, 0, 0, 810, 812, 3, 86, 43, 0, 811, 810, 1, 0, 0, 0, 811, 812, 1, 0, 0, 0, 812, 813, 1, 0, 0, 0, 813, 814, 5, 66, 0, 0, 814, 816, 3, 84, 42, 0, 815, 801, 1, 0, 0, 0, 815, 809, 1, 0, 0, 0, 816, 85, 1, 0, 0, 0, 817, 818, 3, 88, 44, 0, 818, 819, 5, 65, 0, 0, 819, 821, 1, 0, 0, 0, 820, 817, 1, 0, 0, 0, 820, 821, 1, 0, 0, 0, 821, 832, 1, 0, 0, 0, 822, 825, 3, 92, 46, 0, 823, 824, 5, 65, 0, 0, 824, 826, 3, 88, 44, 0, 825, 823, 1, 0, 0, 0, 825, 826, 1, 0, 0, 0, 826, 829, 1, 0, 0, 0, 827, 828, 5, 65, 0, 0, 828, 830, 3, 94, 47, 0, 829, 827, 1, 0, 0, 0, 829, 830, 1, 0, 0, 0, 830, 833, 1, 0, 0, 0, 831, 833, 3, 94, 47, 0, 832, 822, 1, 0, 0, 0, 832, 831, 1, 0, 0, 0, 833, 835, 1, 0, 0, 0, 834, 836, 5, 65, 0, 0, 835, 834, 1, 0, 0, 0, 835, 836, 1, 0, 0, 0, 836, 842, 1, 0, 0, 0, 837, 839, 3, 88, 44, 0, 838, 840, 5, 65, 0, 0, 839, 838, 1, 0, 0, 0, 839, 840, 1, 0, 0, 0, 840, 842, 1, 0, 0, 0, 841, 820, 1, 0, 0, 0, 841, 837, 1, 0, 0, 0, 842, 87, 1, 0, 0, 0, 843, 848, 3, 90, 45, 0, 844, 845, 5, 65, 0, 0, 845, 847, 3, 90, 45, 0, 846, 844, 1, 0, 0, 0, 847, 850, 1, 0, 0, 0, 848, 846, 1, 0, 0, 0, 848, 849, 1, 0, 0, 0, 849, 89, 1, 0, 0, 0, 850, 848, 1, 0, 0, 0, 851, 854, 3, 112, 56, 0, 852, 853, 5, 69, 0, 0, 853, 855, 3, 84, 42, 0, 854, 852, 1, 0, 0, 0, 854, 855, 1, 0, 0, 0, 855, 858, 1, 0, 0, 0, 856, 858, 5, 64, 0, 0, 857, 851, 1, 0, 0, 0, 857, 856, 1, 0, 0, 0, 858, 91, 1, 0, 0, 0, 859, 860, 5, 64, 0, 0, 860, 861, 3, 112, 56, 0, 861, 93, 1, 0, 0, 0, 862, 863, 5, 68, 0, 0, 863, 864, 3, 112, 56, 0, 864, 95, 1, 0, 0, 0, 865, 866, 6, 48, -1, 0, 866, 870, 3, 98, 49, 0, 867, 868, 5, 27, 0, 0, 868, 870, 3, 96, 48, 3, 869, 865, 1, 0, 0, 0, 869, 867, 1, 0, 0, 0, 870, 879, 1, 0, 0, 0, 871, 872, 10, 2, 0, 0, 872, 873, 5, 26, 0, 0, 873, 878, 3, 96, 48, 3, 874, 875, 10, 1, 0, 0, 875, 876, 5, 25, 0, 0, 876, 878, 3, 96, 48, 2, 877, 871, 1, 0, 0, 0, 877, 874, 1, 0, 0, 0, 878, 881, 1, 0, 0, 0, 879, 877, 1, 0, 0, 0, 879, 880, 1, 0, 0, 0, 880, 97, 1, 0, 0, 0, 881, 879, 1, 0, 0, 0, 882, 883, 6, 49, -1, 0, 883, 884, 3, 100, 50, 0, 884, 906, 1, 0, 0, 0, 885, 901, 10, 2, 0, 0, 886, 902, 5, 81, 0, 0, 887, 902, 5, 82, 0, 0, 888, 902, 5, 83, 0, 0, 889, 902, 5, 84, 0, 0, 890, 902, 5, 85, 0, 0, 891, 902, 5, 86, 0, 0, 892, 902, 5, 87, 0, 0, 893, 895, 5, 27, 0, 0, 894, 893, 1, 0, 0, 0, 894, 895, 1, 0, 0, 0, 895, 896, 1, 0, 0, 0, 896, 902, 5, 18, 0, 0, 897, 899, 5, 28, 0, 0, 898, 900, 5, 27, 0, 0, 899, 898, 1, 0, 0, 0, 899, 900, 1, 0, 0, 0, 900, 902, 1, 0, 0, 0, 901, 886, 1, 0, 0, 0, 901, 887, 1, 0, 0, 0, 901, 888, 1, 0, 0, 0, 901, 889, 1, 0, 0, 0, 901, 890, 1, 0, 0, 0, 901, 891, 1, 0, 0, 0, 901, 892, 1, 0, 0, 0, 901, 894, 1, 0, 0, 0, 901, 897, 1, 0, 0, 0, 902, 903, 1, 0, 0, 0, 903, 905, 3, 98, 49, 3, 904, 885, 1, 0, 0, 0, 905, 908, 1, 0, 0, 0, 906, 904, 1, 0, 0, 0, 906, 907, 1, 0, 0, 0, 907, 99, 1, 0, 0, 0, 908, 906, 1, 0, 0, 0, 909, 911, 6, 50, -1, 0, 910, 912, 5, 36, 0, 0, 911, 910, 1, 0, 0, 0, 911, 912, 1, 0, 0, 0, 912, 913, 1, 0, 0, 0, 913, 917, 3, 102, 51, 0, 914, 916, 3, 122, 61, 0, 915, 914, 1, 0, 0, 0, 916, 919, 1, 0, 0, 0, 917, 915, 1, 0, 0, 0, 917, 918, 1, 0, 0, 0, 918, 923, 1, 0, 0, 0, 919, 917, 1, 0, 0, 0, 920, 921, 7, 9, 0, 0, 921, 923, 3, 100, 50, 7, 922, 909, 1, 0, 0, 0, 922, 920, 1, 0, 0, 0, 923, 947, 1, 0, 0, 0, 924, 925, 10, 8, 0, 0, 925, 926, 5, 68, 0, 0, 926, 946, 3, 100, 50, 8, 927, 928, 10, 6, 0, 0, 928, 929, 7, 10, 0, 0, 929, 946, 3, 100, 50, 7, 930, 931, 10, 5, 0, 0, 931, 932, 7, 11, 0, 0, 932, 946, 3, 100, 50, 6, 933, 934, 10, 4, 0, 0, 934, 935, 7, 12, 0, 0, 935, 946, 3, 100, 50, 5, 936, 937, 10, 3, 0, 0, 937, 938, 5, 72, 0, 0, 938, 946, 3, 100, 50, 4, 939, 940, 10, 2, 0, 0, 940, 941, 5, 71, 0, 0, 941, 946, 3, 100, 50, 3, 942, 943, 10, 1, 0, 0, 943, 944, 5, 70, 0, 0, 944, 946, 3, 100, 50, 2, 945, 924, 1, 0, 0, 0, 945, 927, 1, 0, 0, 0, 945, 930, 1, 0, 0, 0, 945, 933, 1, 0, 0, 0, 945, 936, 1, 0, 0, 0, 945, 939, 1, 0, 0, 0, 945, 942, 1, 0, 0, 0, 946, 949, 1, 0, 0, 0, 947, 945, 1, 0, 0, 0, 947, 948, 1, 0, 0, 0, 948, 101, 1, 0, 0, 0, 949, 947, 1, 0, 0, 0, 950, 953, 5, 111, 0, 0, 951, 954, 3, 118, 59, 0, 952, 954, 3, 106, 53, 0, 953, 951, 1, 0, 0, 0, 953, 952, 1, 0, 0, 0, 953, 954, 1, 0, 0, 0, 954, 955, 1, 0, 0, 0, 955, 981, 5, 112, 0, 0, 956, 958, 5, 115, 0, 0, 957, 959, 3, 106, 53, 0, 958, 957, 1, 0, 0, 0, 958, 959, 1, 0, 0, 0, 959, 960, 1, 0, 0, 0, 960, 981, 5, 116, 0, 0, 961, 963, 5, 113, 0, 0, 962, 964, 3, 104, 52, 0, 963, 962, 1, 0, 0, 0, 963, 964, 1, 0, 0, 0, 964, 965, 1, 0, 0, 0, 965, 981, 5, 114, 0, 0, 966, 981, 5, 63, 0, 0, 967, 981, 3, 112, 56, 0, 968, 981, 5, 37, 0, 0, 969, 981, 5, 38, 0, 0, 970, 972, 5, 76, 0, 0, 971, 970, 1, 0, 0, 0, 971, 972, 1, 0, 0, 0, 972, 973, 1, 0, 0, 0, 973, 981, 3, 114, 57, 0, 974, 981, 5, 20, 0, 0, 975, 977, 5, 103, 0, 0, 976, 975, 1, 0, 0, 0, 977, 978, 1, 0, 0, 0, 978, 976, 1, 0, 0, 0, 978, 979, 1, 0, 0, 0, 979, 981, 1, 0, 0, 0, 980, 950, 1, 0, 0, 0, 980, 956, 1, 0, 0, 0, 980, 961, 1, 0, 0, 0, 980, 966, 1, 0, 0, 0, 980, 967, 1, 0, 0, 0, 980, 968, 1, 0, 0, 0, 980, 969, 1, 0, 0, 0, 980, 971, 1, 0, 0, 0, 980, 974, 1, 0, 0, 0, 980, 976, 1, 0, 0, 0, 981, 103, 1, 0, 0, 0, 982, 983, 3, 84, 42, 0, 983, 984, 5, 66, 0, 0, 984, 985, 3, 84, 42, 0, 985, 989, 1, 0, 0, 0, 986, 987, 5, 68, 0, 0, 987, 989, 3, 100, 50, 0, 988, 982, 1, 0, 0, 0, 988, 986, 1, 0, 0, 0, 989, 1001, 1, 0, 0, 0, 990, 997, 5, 65, 0, 0, 991, 992, 3, 84, 42, 0, 992, 993, 5, 66, 0, 0, 993, 994, 3, 84, 42, 0, 994, 998, 1, 0, 0, 0, 995, 996, 5, 68, 0, 0, 996, 998, 3, 100, 50, 0, 997, 991, 1, 0, 0, 0, 997, 995, 1, 0, 0, 0, 998, 1000, 1, 0, 0, 0, 999, 990, 1, 0, 0, 0, 1000, 1003, 1, 0, 0, 0, 1001, 999, 1, 0, 0, 0, 1001, 1002, 1, 0, 0, 0, 1002, 1005, 1, 0, 0, 0, 1003, 1001, 1, 0, 0, 0, 1004, 1006, 5, 65, 0, 0, 1005, 1004, 1, 0, 0, 0, 1005, 1006, 1, 0, 0, 0, 1006, 1014, 1, 0, 0, 0, 1007, 1008, 3, 84, 42, 0, 1008, 1009, 5, 66, 0, 0, 1009, 1010, 3, 84, 42, 0, 1010, 1011, 3, 136, 68, 0, 1011, 1014, 1, 0, 0, 0, 1012, 1014, 3, 106, 53, 0, 1013, 988, 1, 0, 0, 0, 1013, 1007, 1, 0, 0, 0, 1013, 1012, 1, 0, 0, 0, 1014, 105, 1, 0, 0, 0, 1015, 1018, 3, 84, 42, 0, 1016, 1018, 3, 70, 35, 0, 1017, 1015, 1, 0, 0, 0, 1017, 1016, 1, 0, 0, 0, 1018, 1033, 1, 0, 0, 0, 1019, 1034, 3, 136, 68, 0, 1020, 1023, 5, 65, 0, 0, 1021, 1024, 3, 84, 42, 0, 1022, 1024, 3, 70, 35, 0, 1023, 1021, 1, 0, 0, 0, 1023, 1022, 1, 0, 0, 0, 1024, 1026, 1, 0, 0, 0, 1025, 1020, 1, 0, 0, 0, 1026, 1029, 1, 0, 0, 0, 1027, 1025, 1, 0, 0, 0, 1027, 1028, 1, 0, 0, 0, 1028, 1031, 1, 0, 0, 0, 1029, 1027, 1, 0, 0, 0, 1030, 1032, 5, 65, 0, 0, 1031, 1030, 1, 0, 0, 0, 1031, 1032, 1, 0, 0, 0, 1032, 1034, 1, 0, 0, 0, 1033, 1019, 1, 0, 0, 0, 1033, 1027, 1, 0, 0, 0, 1034, 107, 1, 0, 0, 0, 1035, 1040, 3, 84, 42, 0, 1036, 1037, 5, 65, 0, 0, 1037, 1039, 3, 84, 42, 0, 1038, 1036, 1, 0, 0, 0, 1039, 1042, 1, 0, 0, 0, 1040, 1038, 1, 0, 0, 0, 1040, 1041, 1, 0, 0, 0, 1041, 1044, 1, 0, 0, 0, 1042, 1040, 1, 0, 0, 0, 1043, 1045, 5, 65, 0, 0, 1044, 1043, 1, 0, 0, 0, 1044, 1045, 1, 0, 0, 0, 1045, 109, 1, 0, 0, 0, 1046, 1047, 6, 55, -1, 0, 1047, 1048, 3, 112, 56, 0, 1048, 1054, 1, 0, 0, 0, 1049, 1050, 10, 2, 0, 0, 1050, 1051, 5, 62, 0, 0, 1051, 1053, 3, 112, 56, 0, 1052, 1049, 1, 0, 0, 0, 1053, 1056, 1, 0, 0, 0, 1054, 1052, 1, 0, 0, 0, 1054, 1055, 1, 0, 0, 0, 1055, 111, 1, 0, 0, 0, 1056, 1054, 1, 0, 0, 0, 1057, 1058, 7, 13, 0, 0, 1058, 113, 1, 0, 0, 0, 1059, 1063, 3, 116, 58, 0, 1060, 1063, 5, 109, 0, 0, 1061, 1063, 5, 110, 0, 0, 1062, 1059, 1, 0, 0, 0, 1062, 1060, 1, 0, 0, 0, 1062, 1061, 1, 0, 0, 0, 1063, 115, 1, 0, 0, 0, 1064, 1065, 7, 14, 0, 0, 1065, 117, 1, 0, 0, 0, 1066, 1068, 5, 30, 0, 0, 1067, 1069, 3, 120, 60, 0, 1068, 1067, 1, 0, 0, 0, 1068, 1069, 1, 0, 0, 0, 1069, 119, 1, 0, 0, 0, 1070, 1071, 5, 7, 0, 0, 1071, 1074, 3, 84, 42, 0, 1072, 1074, 3, 108, 54, 0, 1073, 1070, 1, 0, 0, 0, 1073, 1072, 1, 0, 0, 0, 1074, 121, 1, 0, 0, 0, 1075, 1076, 5, 62, 0, 0, 1076, 1078, 3, 112, 56, 0, 1077, 1079, 3, 124, 62, 0, 1078, 1077, 1, 0, 0, 0, 1078, 1079, 1, 0, 0, 0, 1079, 1082, 1, 0, 0, 0, 1080, 1082, 3, 124, 62, 0, 1081, 1075, 1, 0, 0, 0, 1081, 1080, 1, 0, 0, 0, 1082, 123, 1, 0, 0, 0, 1083, 1085, 5, 111, 0, 0, 1084, 1086, 3, 126, 63, 0, 1085, 1084, 1, 0, 0, 0, 1085, 1086, 1, 0, 0, 0, 1086, 1087, 1, 0, 0, 0, 1087, 1093, 5, 112, 0, 0, 1088, 1089, 5, 115, 0, 0, 1089, 1090, 3, 130, 65, 0, 1090, 1091, 5, 116, 0, 0, 1091, 1093, 1, 0, 0, 0, 1092, 1083, 1, 0, 0, 0, 1092, 1088, 1, 0, 0, 0, 1093, 125, 1, 0, 0, 0, 1094, 1099, 3, 128, 64, 0, 1095, 1096, 5, 65, 0, 0, 1096, 1098, 3, 128, 64, 0, 1097, 1095, 1, 0, 0, 0, 1098, 1101, 1, 0, 0, 0, 1099, 1097, 1, 0, 0, 0, 1099, 1100, 1, 0, 0, 0, 1100, 1103, 1, 0, 0, 0, 1101, 1099, 1, 0, 0, 0, 1102, 1104, 5, 65, 0, 0, 1103, 1102, 1, 0, 0, 0, 1103, 1104, 1, 0, 0, 0, 1104, 127, 1, 0, 0, 0, 1105, 1109, 3, 84, 42, 0, 1106, 1110, 3, 136, 68, 0, 1107, 1108, 5, 69, 0, 0, 1108, 1110, 3, 84, 42, 0, 1109, 1106, 1, 0, 0, 0, 1109, 1107, 1, 0, 0, 0, 1109, 1110, 1, 0, 0, 0, 1110, 1114, 1, 0, 0, 0, 1111, 1112, 7, 15, 0, 0, 1112, 1114, 3, 84, 42, 0, 1113, 1105, 1, 0, 0, 0, 1113, 1111, 1, 0, 0, 0, 1114, 129, 1, 0, 0, 0, 1115, 1120, 3, 132, 66, 0, 1116, 1117, 5, 65, 0, 0, 1117, 1119, 3, 132, 66, 0, 1118, 1116, 1, 0, 0, 0, 1119, 1122, 1, 0, 0, 0, 1120, 1118, 1, 0, 0, 0, 1120, 1121, 1, 0, 0, 0, 1121, 1124, 1, 0, 0, 0, 1122, 1120, 1, 0, 0, 0, 1123, 1125, 5, 65, 0, 0, 1124, 1123, 1, 0, 0, 0, 1124, 1125, 1, 0, 0, 0, 1125, 131, 1, 0, 0, 0, 1126, 1145, 5, 63, 0, 0, 1127, 1135, 3, 84, 42, 0, 1128, 1130, 5, 66, 0, 0, 1129, 1131, 3, 84, 42, 0, 1130, 1129, 1, 0, 0, 0, 1130, 1131, 1, 0, 0, 0, 1131, 1133, 1, 0, 0, 0, 1132, 1134, 3, 134, 67, 0, 1133, 1132, 1, 0, 0, 0, 1133, 1134, 1, 0, 0, 0, 1134, 1136, 1, 0, 0, 0, 1135, 1128, 1, 0, 0, 0, 1135, 1136, 1, 0, 0, 0, 1136, 1145, 1, 0, 0, 0, 1137, 1139, 5, 66, 0, 0, 1138, 1140, 3, 84, 42, 0, 1139, 1138, 1, 0, 0, 0, 1139, 1140, 1, 0, 0, 0, 1140, 1142, 1, 0, 0, 0, 1141, 1143, 3, 134, 67, 0, 1142, 1141, 1, 0, 0, 0, 1142, 1143, 1, 0, 0, 0, 1143, 1145, 1, 0, 0, 0, 1144, 1126, 1, 0, 0, 0, 1144, 1127, 1, 0, 0, 0, 1144, 1137, 1, 0, 0, 0, 1145, 133, 1, 0, 0, 0, 1146, 1148, 5, 66, 0, 0, 1147, 1149, 3, 84, 42, 0, 1148, 1147, 1, 0, 0, 0, 1148, 1149, 1, 0, 0, 0, 1149, 135, 1, 0, 0, 0, 1150, 1151, 5, 17, 0, 0, 1151, 1152, 3, 74, 37, 0, 1152, 1153, 5, 18, 0, 0, 1153, 1155, 3, 96, 48, 0, 1154, 1156, 3, 138, 69, 0, 1155, 1154, 1, 0, 0, 0, 1155, 1156, 1, 0, 0, 0, 1156, 137, 1, 0, 0, 0, 1157, 1164, 3, 136, 68, 0, 1158, 1159, 5, 13, 0, 0, 1159, 1161, 3, 84, 42, 0, 1160, 1162, 3, 138, 69, 0, 1161, 1160, 1, 0, 0, 0, 1161, 1162, 1, 0, 0, 0, 1162, 1164, 1, 0, 0, 0, 1163, 1157, 1, 0, 0, 0, 1163, 1158, 1, 0, 0, 0, 1164, 139, 1, 0, 0, 0, 173, 143, 152, 156, 158, 164, 170, 174, 185, 189, 192, 200, 215, 218, 221, 224, 227, 235, 244, 249, 254, 259, 282, 290, 294, 301, 308, 318, 321, 341, 355, 357, 363, 373, 381, 384, 390, 396, 401, 407, 410, 422, 425, 431, 443, 449, 459, 465, 476, 482, 485, 493, 498, 502, 505, 508, 512, 514, 527, 533, 536, 541, 548, 552, 558, 562, 567, 573, 579, 585, 594, 598, 606, 609, 611, 622, 630, 632, 634, 638, 647, 654, 656, 665, 673, 683, 685, 693, 702, 707, 711, 717, 721, 724, 735, 740, 743, 750, 757, 759, 766, 770, 777, 781, 786, 793, 799, 807, 811, 815, 820, 825, 829, 832, 835, 839, 841, 848, 854, 857, 869, 877, 879, 894, 899, 901, 906, 911, 917, 922, 945, 947, 953, 958, 963, 971, 978, 980, 988, 997, 1001, 1005, 1013, 1017, 1023, 1027, 1031, 1033, 1040, 1044, 1054, 1062, 1068, 1073, 1078, 1081, 1085, 1092, 1099, 1103, 1109, 1113, 1120, 1124, 1130, 1133, 1135, 1139, 1142, 1144, 1148, 1155, 1161, 1163] \ No newline at end of file +[4, 1, 121, 1166, 2, 0, 7, 0, 2, 1, 7, 1, 2, 2, 7, 2, 2, 3, 7, 3, 2, 4, 7, 4, 2, 5, 7, 5, 2, 6, 7, 6, 2, 7, 7, 7, 2, 8, 7, 8, 2, 9, 7, 9, 2, 10, 7, 10, 2, 11, 7, 11, 2, 12, 7, 12, 2, 13, 7, 13, 2, 14, 7, 14, 2, 15, 7, 15, 2, 16, 7, 16, 2, 17, 7, 17, 2, 18, 7, 18, 2, 19, 7, 19, 2, 20, 7, 20, 2, 21, 7, 21, 2, 22, 7, 22, 2, 23, 7, 23, 2, 24, 7, 24, 2, 25, 7, 25, 2, 26, 7, 26, 2, 27, 7, 27, 2, 28, 7, 28, 2, 29, 7, 29, 2, 30, 7, 30, 2, 31, 7, 31, 2, 32, 7, 32, 2, 33, 7, 33, 2, 34, 7, 34, 2, 35, 7, 35, 2, 36, 7, 36, 2, 37, 7, 37, 2, 38, 7, 38, 2, 39, 7, 39, 2, 40, 7, 40, 2, 41, 7, 41, 2, 42, 7, 42, 2, 43, 7, 43, 2, 44, 7, 44, 2, 45, 7, 45, 2, 46, 7, 46, 2, 47, 7, 47, 2, 48, 7, 48, 2, 49, 7, 49, 2, 50, 7, 50, 2, 51, 7, 51, 2, 52, 7, 52, 2, 53, 7, 53, 2, 54, 7, 54, 2, 55, 7, 55, 2, 56, 7, 56, 2, 57, 7, 57, 2, 58, 7, 58, 2, 59, 7, 59, 2, 60, 7, 60, 2, 61, 7, 61, 2, 62, 7, 62, 2, 63, 7, 63, 2, 64, 7, 64, 2, 65, 7, 65, 2, 66, 7, 66, 2, 67, 7, 67, 2, 68, 7, 68, 2, 69, 7, 69, 1, 0, 1, 0, 1, 0, 3, 0, 144, 8, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 153, 8, 1, 1, 2, 1, 2, 4, 2, 157, 8, 2, 11, 2, 12, 2, 158, 1, 3, 1, 3, 5, 3, 163, 8, 3, 10, 3, 12, 3, 166, 9, 3, 1, 4, 1, 4, 1, 4, 3, 4, 171, 8, 4, 1, 5, 1, 5, 3, 5, 175, 8, 5, 1, 5, 1, 5, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 5, 6, 184, 8, 6, 10, 6, 12, 6, 187, 9, 6, 1, 6, 3, 6, 190, 8, 6, 1, 6, 3, 6, 193, 8, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 3, 6, 201, 8, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 4, 6, 214, 8, 6, 11, 6, 12, 6, 215, 1, 6, 3, 6, 219, 8, 6, 1, 6, 3, 6, 222, 8, 6, 1, 6, 3, 6, 225, 8, 6, 1, 6, 3, 6, 228, 8, 6, 1, 6, 1, 6, 1, 6, 1, 6, 5, 6, 234, 8, 6, 10, 6, 12, 6, 237, 9, 6, 1, 6, 1, 6, 1, 6, 1, 6, 5, 6, 243, 8, 6, 10, 6, 12, 6, 246, 9, 6, 1, 6, 1, 6, 3, 6, 250, 8, 6, 1, 6, 5, 6, 253, 8, 6, 10, 6, 12, 6, 256, 9, 6, 1, 6, 1, 6, 3, 6, 260, 8, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 3, 6, 283, 8, 6, 1, 7, 1, 7, 1, 7, 1, 7, 4, 7, 289, 8, 7, 11, 7, 12, 7, 290, 1, 7, 1, 7, 3, 7, 295, 8, 7, 1, 8, 1, 8, 1, 8, 4, 8, 300, 8, 8, 11, 8, 12, 8, 301, 1, 8, 1, 8, 1, 9, 5, 9, 307, 8, 9, 10, 9, 12, 9, 310, 9, 9, 1, 9, 1, 9, 1, 9, 1, 10, 1, 10, 1, 10, 1, 10, 3, 10, 319, 8, 10, 1, 10, 3, 10, 322, 8, 10, 1, 10, 1, 10, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 12, 1, 12, 1, 12, 1, 12, 1, 13, 1, 13, 1, 13, 1, 13, 1, 14, 1, 14, 1, 14, 3, 14, 342, 8, 14, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 3, 15, 356, 8, 15, 3, 15, 358, 8, 15, 1, 15, 1, 15, 1, 15, 1, 16, 3, 16, 364, 8, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 4, 16, 372, 8, 16, 11, 16, 12, 16, 373, 1, 16, 1, 16, 1, 17, 1, 17, 1, 17, 1, 17, 3, 17, 382, 8, 17, 1, 17, 3, 17, 385, 8, 17, 1, 17, 1, 17, 1, 17, 1, 18, 3, 18, 391, 8, 18, 1, 18, 1, 18, 1, 18, 1, 18, 3, 18, 397, 8, 18, 1, 18, 1, 18, 1, 18, 3, 18, 402, 8, 18, 1, 18, 1, 18, 1, 18, 1, 19, 3, 19, 408, 8, 19, 1, 19, 3, 19, 411, 8, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 3, 20, 423, 8, 20, 1, 21, 3, 21, 426, 8, 21, 1, 21, 1, 21, 1, 21, 1, 21, 3, 21, 432, 8, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 3, 22, 444, 8, 22, 1, 22, 1, 22, 4, 22, 448, 8, 22, 11, 22, 12, 22, 449, 1, 22, 1, 22, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 3, 23, 460, 8, 23, 1, 23, 1, 23, 4, 23, 464, 8, 23, 11, 23, 12, 23, 465, 1, 23, 1, 23, 1, 24, 1, 24, 1, 24, 1, 24, 1, 25, 4, 25, 475, 8, 25, 11, 25, 12, 25, 476, 1, 25, 1, 25, 1, 25, 1, 25, 3, 25, 483, 8, 25, 1, 25, 3, 25, 486, 8, 25, 1, 25, 1, 25, 1, 25, 1, 26, 1, 26, 1, 26, 3, 26, 494, 8, 26, 1, 26, 1, 26, 1, 26, 3, 26, 499, 8, 26, 1, 26, 1, 26, 3, 26, 503, 8, 26, 1, 26, 3, 26, 506, 8, 26, 1, 26, 3, 26, 509, 8, 26, 1, 26, 1, 26, 3, 26, 513, 8, 26, 3, 26, 515, 8, 26, 1, 27, 1, 27, 1, 27, 1, 28, 1, 28, 1, 28, 1, 29, 1, 29, 1, 29, 5, 29, 526, 8, 29, 10, 29, 12, 29, 529, 9, 29, 1, 30, 1, 30, 1, 30, 3, 30, 534, 8, 30, 1, 30, 3, 30, 537, 8, 30, 1, 31, 1, 31, 1, 31, 3, 31, 542, 8, 31, 1, 32, 1, 32, 1, 32, 5, 32, 547, 8, 32, 10, 32, 12, 32, 550, 9, 32, 1, 32, 3, 32, 553, 8, 32, 1, 32, 1, 32, 1, 33, 1, 33, 3, 33, 559, 8, 33, 1, 33, 1, 33, 3, 33, 563, 8, 33, 1, 33, 1, 33, 1, 33, 3, 33, 568, 8, 33, 1, 33, 1, 33, 1, 33, 1, 33, 3, 33, 574, 8, 33, 1, 33, 1, 33, 1, 33, 1, 33, 3, 33, 580, 8, 33, 1, 33, 1, 33, 1, 33, 1, 33, 3, 33, 586, 8, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 5, 33, 593, 8, 33, 10, 33, 12, 33, 596, 9, 33, 1, 33, 3, 33, 599, 8, 33, 1, 33, 1, 33, 1, 33, 1, 33, 4, 33, 605, 8, 33, 11, 33, 12, 33, 606, 1, 33, 3, 33, 610, 8, 33, 3, 33, 612, 8, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 3, 33, 623, 8, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 3, 33, 631, 8, 33, 3, 33, 633, 8, 33, 3, 33, 635, 8, 33, 1, 33, 1, 33, 3, 33, 639, 8, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 5, 33, 646, 8, 33, 10, 33, 12, 33, 649, 9, 33, 1, 33, 1, 33, 4, 33, 653, 8, 33, 11, 33, 12, 33, 654, 3, 33, 657, 8, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 3, 33, 666, 8, 33, 1, 33, 1, 33, 1, 33, 1, 33, 5, 33, 672, 8, 33, 10, 33, 12, 33, 675, 9, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 3, 33, 684, 8, 33, 3, 33, 686, 8, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 3, 33, 694, 8, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 5, 33, 701, 8, 33, 10, 33, 12, 33, 704, 9, 33, 1, 33, 1, 33, 3, 33, 708, 8, 33, 1, 34, 1, 34, 3, 34, 712, 8, 34, 1, 34, 1, 34, 4, 34, 716, 8, 34, 11, 34, 12, 34, 717, 1, 34, 1, 34, 3, 34, 722, 8, 34, 1, 34, 3, 34, 725, 8, 34, 1, 35, 1, 35, 1, 35, 1, 36, 1, 36, 1, 36, 1, 36, 5, 36, 734, 8, 36, 10, 36, 12, 36, 737, 9, 36, 1, 36, 1, 36, 3, 36, 741, 8, 36, 1, 36, 3, 36, 744, 8, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 3, 36, 751, 8, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 3, 36, 758, 8, 36, 3, 36, 760, 8, 36, 1, 37, 1, 37, 1, 37, 5, 37, 765, 8, 37, 10, 37, 12, 37, 768, 9, 37, 1, 37, 3, 37, 771, 8, 37, 1, 38, 1, 38, 1, 38, 5, 38, 776, 8, 38, 10, 38, 12, 38, 779, 9, 38, 1, 38, 3, 38, 782, 8, 38, 1, 39, 1, 39, 1, 39, 3, 39, 787, 8, 39, 1, 40, 1, 40, 1, 40, 5, 40, 792, 8, 40, 10, 40, 12, 40, 795, 9, 40, 1, 41, 1, 41, 1, 41, 3, 41, 800, 8, 41, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 3, 42, 808, 8, 42, 1, 42, 1, 42, 3, 42, 812, 8, 42, 1, 42, 1, 42, 3, 42, 816, 8, 42, 1, 43, 1, 43, 1, 43, 3, 43, 821, 8, 43, 1, 43, 1, 43, 1, 43, 3, 43, 826, 8, 43, 1, 43, 1, 43, 3, 43, 830, 8, 43, 1, 43, 3, 43, 833, 8, 43, 1, 43, 3, 43, 836, 8, 43, 1, 43, 1, 43, 3, 43, 840, 8, 43, 3, 43, 842, 8, 43, 1, 44, 1, 44, 1, 44, 5, 44, 847, 8, 44, 10, 44, 12, 44, 850, 9, 44, 1, 45, 1, 45, 1, 45, 3, 45, 855, 8, 45, 1, 45, 3, 45, 858, 8, 45, 1, 46, 1, 46, 1, 46, 1, 47, 1, 47, 1, 47, 1, 48, 1, 48, 1, 48, 1, 48, 3, 48, 870, 8, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 5, 48, 878, 8, 48, 10, 48, 12, 48, 881, 9, 48, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 3, 49, 895, 8, 49, 1, 49, 1, 49, 1, 49, 3, 49, 900, 8, 49, 3, 49, 902, 8, 49, 1, 49, 5, 49, 905, 8, 49, 10, 49, 12, 49, 908, 9, 49, 1, 50, 1, 50, 3, 50, 912, 8, 50, 1, 50, 1, 50, 5, 50, 916, 8, 50, 10, 50, 12, 50, 919, 9, 50, 1, 50, 1, 50, 3, 50, 923, 8, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 5, 50, 946, 8, 50, 10, 50, 12, 50, 949, 9, 50, 1, 51, 1, 51, 1, 51, 3, 51, 954, 8, 51, 1, 51, 1, 51, 1, 51, 3, 51, 959, 8, 51, 1, 51, 1, 51, 1, 51, 3, 51, 964, 8, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 3, 51, 972, 8, 51, 1, 51, 1, 51, 1, 51, 4, 51, 977, 8, 51, 11, 51, 12, 51, 978, 3, 51, 981, 8, 51, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 3, 52, 989, 8, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 3, 52, 998, 8, 52, 5, 52, 1000, 8, 52, 10, 52, 12, 52, 1003, 9, 52, 1, 52, 3, 52, 1006, 8, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 3, 52, 1014, 8, 52, 1, 53, 1, 53, 3, 53, 1018, 8, 53, 1, 53, 1, 53, 1, 53, 1, 53, 3, 53, 1024, 8, 53, 5, 53, 1026, 8, 53, 10, 53, 12, 53, 1029, 9, 53, 1, 53, 3, 53, 1032, 8, 53, 3, 53, 1034, 8, 53, 1, 54, 1, 54, 1, 54, 5, 54, 1039, 8, 54, 10, 54, 12, 54, 1042, 9, 54, 1, 54, 3, 54, 1045, 8, 54, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 5, 55, 1053, 8, 55, 10, 55, 12, 55, 1056, 9, 55, 1, 56, 1, 56, 1, 57, 1, 57, 1, 57, 3, 57, 1063, 8, 57, 1, 58, 1, 58, 1, 59, 1, 59, 3, 59, 1069, 8, 59, 1, 60, 1, 60, 1, 60, 3, 60, 1074, 8, 60, 1, 61, 1, 61, 1, 61, 3, 61, 1079, 8, 61, 1, 61, 3, 61, 1082, 8, 61, 1, 62, 1, 62, 3, 62, 1086, 8, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 3, 62, 1093, 8, 62, 1, 63, 1, 63, 1, 63, 5, 63, 1098, 8, 63, 10, 63, 12, 63, 1101, 9, 63, 1, 63, 3, 63, 1104, 8, 63, 1, 64, 1, 64, 1, 64, 1, 64, 3, 64, 1110, 8, 64, 1, 64, 1, 64, 3, 64, 1114, 8, 64, 1, 65, 1, 65, 1, 65, 5, 65, 1119, 8, 65, 10, 65, 12, 65, 1122, 9, 65, 1, 65, 3, 65, 1125, 8, 65, 1, 66, 1, 66, 1, 66, 1, 66, 3, 66, 1131, 8, 66, 1, 66, 3, 66, 1134, 8, 66, 3, 66, 1136, 8, 66, 1, 66, 1, 66, 3, 66, 1140, 8, 66, 1, 66, 3, 66, 1143, 8, 66, 3, 66, 1145, 8, 66, 1, 67, 1, 67, 3, 67, 1149, 8, 67, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 3, 68, 1156, 8, 68, 1, 69, 1, 69, 1, 69, 1, 69, 3, 69, 1162, 8, 69, 3, 69, 1164, 8, 69, 1, 69, 0, 4, 96, 98, 100, 110, 70, 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64, 66, 68, 70, 72, 74, 76, 78, 80, 82, 84, 86, 88, 90, 92, 94, 96, 98, 100, 102, 104, 106, 108, 110, 112, 114, 116, 118, 120, 122, 124, 126, 128, 130, 132, 134, 136, 138, 0, 17, 1, 0, 41, 42, 1, 0, 41, 43, 1, 0, 44, 45, 1, 0, 41, 44, 1, 0, 57, 58, 1, 1, 3, 3, 2, 0, 46, 46, 57, 59, 2, 0, 13, 13, 66, 66, 1, 0, 62, 63, 1, 0, 90, 102, 2, 0, 75, 76, 80, 80, 3, 0, 64, 64, 77, 79, 88, 88, 1, 0, 75, 76, 1, 0, 73, 74, 3, 0, 39, 40, 45, 45, 117, 117, 1, 0, 105, 108, 2, 0, 64, 64, 68, 68, 1331, 0, 143, 1, 0, 0, 0, 2, 152, 1, 0, 0, 0, 4, 156, 1, 0, 0, 0, 6, 160, 1, 0, 0, 0, 8, 170, 1, 0, 0, 0, 10, 172, 1, 0, 0, 0, 12, 282, 1, 0, 0, 0, 14, 294, 1, 0, 0, 0, 16, 296, 1, 0, 0, 0, 18, 308, 1, 0, 0, 0, 20, 314, 1, 0, 0, 0, 22, 325, 1, 0, 0, 0, 24, 330, 1, 0, 0, 0, 26, 334, 1, 0, 0, 0, 28, 338, 1, 0, 0, 0, 30, 343, 1, 0, 0, 0, 32, 363, 1, 0, 0, 0, 34, 377, 1, 0, 0, 0, 36, 390, 1, 0, 0, 0, 38, 407, 1, 0, 0, 0, 40, 417, 1, 0, 0, 0, 42, 425, 1, 0, 0, 0, 44, 437, 1, 0, 0, 0, 46, 453, 1, 0, 0, 0, 48, 469, 1, 0, 0, 0, 50, 474, 1, 0, 0, 0, 52, 514, 1, 0, 0, 0, 54, 516, 1, 0, 0, 0, 56, 519, 1, 0, 0, 0, 58, 522, 1, 0, 0, 0, 60, 536, 1, 0, 0, 0, 62, 538, 1, 0, 0, 0, 64, 543, 1, 0, 0, 0, 66, 707, 1, 0, 0, 0, 68, 724, 1, 0, 0, 0, 70, 726, 1, 0, 0, 0, 72, 759, 1, 0, 0, 0, 74, 761, 1, 0, 0, 0, 76, 772, 1, 0, 0, 0, 78, 783, 1, 0, 0, 0, 80, 788, 1, 0, 0, 0, 82, 796, 1, 0, 0, 0, 84, 815, 1, 0, 0, 0, 86, 841, 1, 0, 0, 0, 88, 843, 1, 0, 0, 0, 90, 857, 1, 0, 0, 0, 92, 859, 1, 0, 0, 0, 94, 862, 1, 0, 0, 0, 96, 869, 1, 0, 0, 0, 98, 882, 1, 0, 0, 0, 100, 922, 1, 0, 0, 0, 102, 980, 1, 0, 0, 0, 104, 1013, 1, 0, 0, 0, 106, 1017, 1, 0, 0, 0, 108, 1035, 1, 0, 0, 0, 110, 1046, 1, 0, 0, 0, 112, 1057, 1, 0, 0, 0, 114, 1062, 1, 0, 0, 0, 116, 1064, 1, 0, 0, 0, 118, 1066, 1, 0, 0, 0, 120, 1073, 1, 0, 0, 0, 122, 1081, 1, 0, 0, 0, 124, 1092, 1, 0, 0, 0, 126, 1094, 1, 0, 0, 0, 128, 1113, 1, 0, 0, 0, 130, 1115, 1, 0, 0, 0, 132, 1144, 1, 0, 0, 0, 134, 1146, 1, 0, 0, 0, 136, 1150, 1, 0, 0, 0, 138, 1163, 1, 0, 0, 0, 140, 144, 3, 2, 1, 0, 141, 144, 3, 4, 2, 0, 142, 144, 3, 6, 3, 0, 143, 140, 1, 0, 0, 0, 143, 141, 1, 0, 0, 0, 143, 142, 1, 0, 0, 0, 143, 144, 1, 0, 0, 0, 144, 145, 1, 0, 0, 0, 145, 146, 5, 0, 0, 1, 146, 1, 1, 0, 0, 0, 147, 153, 5, 3, 0, 0, 148, 153, 3, 64, 32, 0, 149, 150, 3, 12, 6, 0, 150, 151, 5, 3, 0, 0, 151, 153, 1, 0, 0, 0, 152, 147, 1, 0, 0, 0, 152, 148, 1, 0, 0, 0, 152, 149, 1, 0, 0, 0, 153, 3, 1, 0, 0, 0, 154, 157, 5, 3, 0, 0, 155, 157, 3, 8, 4, 0, 156, 154, 1, 0, 0, 0, 156, 155, 1, 0, 0, 0, 157, 158, 1, 0, 0, 0, 158, 156, 1, 0, 0, 0, 158, 159, 1, 0, 0, 0, 159, 5, 1, 0, 0, 0, 160, 164, 3, 108, 54, 0, 161, 163, 5, 3, 0, 0, 162, 161, 1, 0, 0, 0, 163, 166, 1, 0, 0, 0, 164, 162, 1, 0, 0, 0, 164, 165, 1, 0, 0, 0, 165, 7, 1, 0, 0, 0, 166, 164, 1, 0, 0, 0, 167, 171, 3, 64, 32, 0, 168, 171, 3, 12, 6, 0, 169, 171, 3, 10, 5, 0, 170, 167, 1, 0, 0, 0, 170, 168, 1, 0, 0, 0, 170, 169, 1, 0, 0, 0, 171, 9, 1, 0, 0, 0, 172, 174, 5, 104, 0, 0, 173, 175, 5, 3, 0, 0, 174, 173, 1, 0, 0, 0, 174, 175, 1, 0, 0, 0, 175, 176, 1, 0, 0, 0, 176, 177, 3, 8, 4, 0, 177, 11, 1, 0, 0, 0, 178, 179, 5, 13, 0, 0, 179, 180, 3, 84, 42, 0, 180, 181, 5, 66, 0, 0, 181, 185, 3, 14, 7, 0, 182, 184, 3, 22, 11, 0, 183, 182, 1, 0, 0, 0, 184, 187, 1, 0, 0, 0, 185, 183, 1, 0, 0, 0, 185, 186, 1, 0, 0, 0, 186, 189, 1, 0, 0, 0, 187, 185, 1, 0, 0, 0, 188, 190, 3, 24, 12, 0, 189, 188, 1, 0, 0, 0, 189, 190, 1, 0, 0, 0, 190, 283, 1, 0, 0, 0, 191, 193, 7, 0, 0, 0, 192, 191, 1, 0, 0, 0, 192, 193, 1, 0, 0, 0, 193, 194, 1, 0, 0, 0, 194, 195, 5, 16, 0, 0, 195, 196, 3, 84, 42, 0, 196, 197, 5, 66, 0, 0, 197, 198, 3, 14, 7, 0, 198, 283, 1, 0, 0, 0, 199, 201, 7, 1, 0, 0, 200, 199, 1, 0, 0, 0, 200, 201, 1, 0, 0, 0, 201, 202, 1, 0, 0, 0, 202, 203, 5, 17, 0, 0, 203, 204, 3, 74, 37, 0, 204, 205, 5, 18, 0, 0, 205, 206, 3, 108, 54, 0, 206, 207, 5, 66, 0, 0, 207, 208, 3, 14, 7, 0, 208, 283, 1, 0, 0, 0, 209, 210, 5, 19, 0, 0, 210, 211, 5, 66, 0, 0, 211, 224, 3, 14, 7, 0, 212, 214, 3, 30, 15, 0, 213, 212, 1, 0, 0, 0, 214, 215, 1, 0, 0, 0, 215, 213, 1, 0, 0, 0, 215, 216, 1, 0, 0, 0, 216, 218, 1, 0, 0, 0, 217, 219, 3, 24, 12, 0, 218, 217, 1, 0, 0, 0, 218, 219, 1, 0, 0, 0, 219, 221, 1, 0, 0, 0, 220, 222, 3, 26, 13, 0, 221, 220, 1, 0, 0, 0, 221, 222, 1, 0, 0, 0, 222, 225, 1, 0, 0, 0, 223, 225, 3, 26, 13, 0, 224, 213, 1, 0, 0, 0, 224, 223, 1, 0, 0, 0, 225, 283, 1, 0, 0, 0, 226, 228, 5, 35, 0, 0, 227, 226, 1, 0, 0, 0, 227, 228, 1, 0, 0, 0, 228, 229, 1, 0, 0, 0, 229, 230, 5, 22, 0, 0, 230, 235, 3, 28, 14, 0, 231, 232, 5, 65, 0, 0, 232, 234, 3, 28, 14, 0, 233, 231, 1, 0, 0, 0, 234, 237, 1, 0, 0, 0, 235, 233, 1, 0, 0, 0, 235, 236, 1, 0, 0, 0, 236, 238, 1, 0, 0, 0, 237, 235, 1, 0, 0, 0, 238, 239, 5, 66, 0, 0, 239, 240, 3, 14, 7, 0, 240, 283, 1, 0, 0, 0, 241, 243, 3, 20, 10, 0, 242, 241, 1, 0, 0, 0, 243, 246, 1, 0, 0, 0, 244, 242, 1, 0, 0, 0, 244, 245, 1, 0, 0, 0, 245, 249, 1, 0, 0, 0, 246, 244, 1, 0, 0, 0, 247, 250, 3, 34, 17, 0, 248, 250, 3, 36, 18, 0, 249, 247, 1, 0, 0, 0, 249, 248, 1, 0, 0, 0, 250, 283, 1, 0, 0, 0, 251, 253, 3, 20, 10, 0, 252, 251, 1, 0, 0, 0, 253, 256, 1, 0, 0, 0, 254, 252, 1, 0, 0, 0, 254, 255, 1, 0, 0, 0, 255, 257, 1, 0, 0, 0, 256, 254, 1, 0, 0, 0, 257, 283, 3, 32, 16, 0, 258, 260, 3, 40, 20, 0, 259, 258, 1, 0, 0, 0, 259, 260, 1, 0, 0, 0, 260, 261, 1, 0, 0, 0, 261, 262, 7, 2, 0, 0, 262, 263, 3, 74, 37, 0, 263, 264, 5, 18, 0, 0, 264, 265, 3, 108, 54, 0, 265, 266, 5, 66, 0, 0, 266, 267, 3, 14, 7, 0, 267, 283, 1, 0, 0, 0, 268, 269, 5, 52, 0, 0, 269, 270, 5, 66, 0, 0, 270, 283, 3, 14, 7, 0, 271, 272, 5, 56, 0, 0, 272, 273, 5, 66, 0, 0, 273, 283, 3, 16, 8, 0, 274, 283, 3, 50, 25, 0, 275, 283, 3, 38, 19, 0, 276, 283, 3, 42, 21, 0, 277, 283, 3, 44, 22, 0, 278, 283, 3, 46, 23, 0, 279, 280, 7, 3, 0, 0, 280, 281, 5, 66, 0, 0, 281, 283, 3, 14, 7, 0, 282, 178, 1, 0, 0, 0, 282, 192, 1, 0, 0, 0, 282, 200, 1, 0, 0, 0, 282, 209, 1, 0, 0, 0, 282, 227, 1, 0, 0, 0, 282, 244, 1, 0, 0, 0, 282, 254, 1, 0, 0, 0, 282, 259, 1, 0, 0, 0, 282, 268, 1, 0, 0, 0, 282, 271, 1, 0, 0, 0, 282, 274, 1, 0, 0, 0, 282, 275, 1, 0, 0, 0, 282, 276, 1, 0, 0, 0, 282, 277, 1, 0, 0, 0, 282, 278, 1, 0, 0, 0, 282, 279, 1, 0, 0, 0, 283, 13, 1, 0, 0, 0, 284, 295, 3, 64, 32, 0, 285, 286, 5, 3, 0, 0, 286, 288, 5, 1, 0, 0, 287, 289, 3, 8, 4, 0, 288, 287, 1, 0, 0, 0, 289, 290, 1, 0, 0, 0, 290, 288, 1, 0, 0, 0, 290, 291, 1, 0, 0, 0, 291, 292, 1, 0, 0, 0, 292, 293, 5, 2, 0, 0, 293, 295, 1, 0, 0, 0, 294, 284, 1, 0, 0, 0, 294, 285, 1, 0, 0, 0, 295, 15, 1, 0, 0, 0, 296, 297, 5, 3, 0, 0, 297, 299, 5, 1, 0, 0, 298, 300, 3, 18, 9, 0, 299, 298, 1, 0, 0, 0, 300, 301, 1, 0, 0, 0, 301, 299, 1, 0, 0, 0, 301, 302, 1, 0, 0, 0, 302, 303, 1, 0, 0, 0, 303, 304, 5, 2, 0, 0, 304, 17, 1, 0, 0, 0, 305, 307, 7, 4, 0, 0, 306, 305, 1, 0, 0, 0, 307, 310, 1, 0, 0, 0, 308, 306, 1, 0, 0, 0, 308, 309, 1, 0, 0, 0, 309, 311, 1, 0, 0, 0, 310, 308, 1, 0, 0, 0, 311, 312, 3, 84, 42, 0, 312, 313, 7, 5, 0, 0, 313, 19, 1, 0, 0, 0, 314, 315, 5, 88, 0, 0, 315, 321, 3, 110, 55, 0, 316, 318, 5, 111, 0, 0, 317, 319, 3, 126, 63, 0, 318, 317, 1, 0, 0, 0, 318, 319, 1, 0, 0, 0, 319, 320, 1, 0, 0, 0, 320, 322, 5, 112, 0, 0, 321, 316, 1, 0, 0, 0, 321, 322, 1, 0, 0, 0, 322, 323, 1, 0, 0, 0, 323, 324, 5, 3, 0, 0, 324, 21, 1, 0, 0, 0, 325, 326, 5, 14, 0, 0, 326, 327, 3, 84, 42, 0, 327, 328, 5, 66, 0, 0, 328, 329, 3, 14, 7, 0, 329, 23, 1, 0, 0, 0, 330, 331, 5, 15, 0, 0, 331, 332, 5, 66, 0, 0, 332, 333, 3, 14, 7, 0, 333, 25, 1, 0, 0, 0, 334, 335, 5, 21, 0, 0, 335, 336, 5, 66, 0, 0, 336, 337, 3, 14, 7, 0, 337, 27, 1, 0, 0, 0, 338, 341, 3, 84, 42, 0, 339, 340, 5, 10, 0, 0, 340, 342, 3, 100, 50, 0, 341, 339, 1, 0, 0, 0, 341, 342, 1, 0, 0, 0, 342, 29, 1, 0, 0, 0, 343, 357, 5, 23, 0, 0, 344, 355, 3, 84, 42, 0, 345, 346, 4, 15, 0, 0, 346, 347, 5, 65, 0, 0, 347, 348, 3, 112, 56, 0, 348, 349, 6, 15, -1, 0, 349, 356, 1, 0, 0, 0, 350, 351, 4, 15, 1, 0, 351, 352, 5, 10, 0, 0, 352, 353, 3, 112, 56, 0, 353, 354, 6, 15, -1, 0, 354, 356, 1, 0, 0, 0, 355, 345, 1, 0, 0, 0, 355, 350, 1, 0, 0, 0, 355, 356, 1, 0, 0, 0, 356, 358, 1, 0, 0, 0, 357, 344, 1, 0, 0, 0, 357, 358, 1, 0, 0, 0, 358, 359, 1, 0, 0, 0, 359, 360, 5, 66, 0, 0, 360, 361, 3, 14, 7, 0, 361, 31, 1, 0, 0, 0, 362, 364, 5, 54, 0, 0, 363, 362, 1, 0, 0, 0, 363, 364, 1, 0, 0, 0, 364, 365, 1, 0, 0, 0, 365, 366, 5, 53, 0, 0, 366, 367, 3, 112, 56, 0, 367, 368, 5, 66, 0, 0, 368, 369, 5, 3, 0, 0, 369, 371, 5, 1, 0, 0, 370, 372, 3, 8, 4, 0, 371, 370, 1, 0, 0, 0, 372, 373, 1, 0, 0, 0, 373, 371, 1, 0, 0, 0, 373, 374, 1, 0, 0, 0, 374, 375, 1, 0, 0, 0, 375, 376, 5, 2, 0, 0, 376, 33, 1, 0, 0, 0, 377, 378, 5, 29, 0, 0, 378, 384, 3, 112, 56, 0, 379, 381, 5, 111, 0, 0, 380, 382, 3, 126, 63, 0, 381, 380, 1, 0, 0, 0, 381, 382, 1, 0, 0, 0, 382, 383, 1, 0, 0, 0, 383, 385, 5, 112, 0, 0, 384, 379, 1, 0, 0, 0, 384, 385, 1, 0, 0, 0, 385, 386, 1, 0, 0, 0, 386, 387, 5, 66, 0, 0, 387, 388, 3, 14, 7, 0, 388, 35, 1, 0, 0, 0, 389, 391, 5, 35, 0, 0, 390, 389, 1, 0, 0, 0, 390, 391, 1, 0, 0, 0, 391, 392, 1, 0, 0, 0, 392, 393, 5, 4, 0, 0, 393, 394, 3, 112, 56, 0, 394, 396, 5, 111, 0, 0, 395, 397, 3, 52, 26, 0, 396, 395, 1, 0, 0, 0, 396, 397, 1, 0, 0, 0, 397, 398, 1, 0, 0, 0, 398, 401, 5, 112, 0, 0, 399, 400, 5, 89, 0, 0, 400, 402, 3, 84, 42, 0, 401, 399, 1, 0, 0, 0, 401, 402, 1, 0, 0, 0, 402, 403, 1, 0, 0, 0, 403, 404, 5, 66, 0, 0, 404, 405, 3, 14, 7, 0, 405, 37, 1, 0, 0, 0, 406, 408, 7, 3, 0, 0, 407, 406, 1, 0, 0, 0, 407, 408, 1, 0, 0, 0, 408, 410, 1, 0, 0, 0, 409, 411, 3, 40, 20, 0, 410, 409, 1, 0, 0, 0, 410, 411, 1, 0, 0, 0, 411, 412, 1, 0, 0, 0, 412, 413, 5, 47, 0, 0, 413, 414, 3, 112, 56, 0, 414, 415, 5, 66, 0, 0, 415, 416, 3, 14, 7, 0, 416, 39, 1, 0, 0, 0, 417, 422, 5, 49, 0, 0, 418, 419, 5, 81, 0, 0, 419, 420, 3, 112, 56, 0, 420, 421, 5, 82, 0, 0, 421, 423, 1, 0, 0, 0, 422, 418, 1, 0, 0, 0, 422, 423, 1, 0, 0, 0, 423, 41, 1, 0, 0, 0, 424, 426, 7, 3, 0, 0, 425, 424, 1, 0, 0, 0, 425, 426, 1, 0, 0, 0, 426, 427, 1, 0, 0, 0, 427, 428, 5, 48, 0, 0, 428, 429, 3, 112, 56, 0, 429, 431, 5, 111, 0, 0, 430, 432, 3, 52, 26, 0, 431, 430, 1, 0, 0, 0, 431, 432, 1, 0, 0, 0, 432, 433, 1, 0, 0, 0, 433, 434, 5, 112, 0, 0, 434, 435, 5, 66, 0, 0, 435, 436, 3, 14, 7, 0, 436, 43, 1, 0, 0, 0, 437, 438, 5, 60, 0, 0, 438, 439, 5, 66, 0, 0, 439, 440, 5, 3, 0, 0, 440, 447, 5, 1, 0, 0, 441, 443, 3, 48, 24, 0, 442, 444, 5, 65, 0, 0, 443, 442, 1, 0, 0, 0, 443, 444, 1, 0, 0, 0, 444, 445, 1, 0, 0, 0, 445, 446, 5, 3, 0, 0, 446, 448, 1, 0, 0, 0, 447, 441, 1, 0, 0, 0, 448, 449, 1, 0, 0, 0, 449, 447, 1, 0, 0, 0, 449, 450, 1, 0, 0, 0, 450, 451, 1, 0, 0, 0, 451, 452, 5, 2, 0, 0, 452, 45, 1, 0, 0, 0, 453, 454, 5, 61, 0, 0, 454, 455, 5, 66, 0, 0, 455, 456, 5, 3, 0, 0, 456, 463, 5, 1, 0, 0, 457, 459, 3, 48, 24, 0, 458, 460, 5, 65, 0, 0, 459, 458, 1, 0, 0, 0, 459, 460, 1, 0, 0, 0, 460, 461, 1, 0, 0, 0, 461, 462, 5, 3, 0, 0, 462, 464, 1, 0, 0, 0, 463, 457, 1, 0, 0, 0, 464, 465, 1, 0, 0, 0, 465, 463, 1, 0, 0, 0, 465, 466, 1, 0, 0, 0, 466, 467, 1, 0, 0, 0, 467, 468, 5, 2, 0, 0, 468, 47, 1, 0, 0, 0, 469, 470, 3, 112, 56, 0, 470, 471, 5, 66, 0, 0, 471, 472, 3, 84, 42, 0, 472, 49, 1, 0, 0, 0, 473, 475, 7, 6, 0, 0, 474, 473, 1, 0, 0, 0, 475, 476, 1, 0, 0, 0, 476, 474, 1, 0, 0, 0, 476, 477, 1, 0, 0, 0, 477, 478, 1, 0, 0, 0, 478, 479, 5, 55, 0, 0, 479, 485, 3, 112, 56, 0, 480, 482, 5, 111, 0, 0, 481, 483, 3, 52, 26, 0, 482, 481, 1, 0, 0, 0, 482, 483, 1, 0, 0, 0, 483, 484, 1, 0, 0, 0, 484, 486, 5, 112, 0, 0, 485, 480, 1, 0, 0, 0, 485, 486, 1, 0, 0, 0, 486, 487, 1, 0, 0, 0, 487, 488, 5, 66, 0, 0, 488, 489, 3, 14, 7, 0, 489, 51, 1, 0, 0, 0, 490, 491, 3, 58, 29, 0, 491, 492, 5, 65, 0, 0, 492, 494, 1, 0, 0, 0, 493, 490, 1, 0, 0, 0, 493, 494, 1, 0, 0, 0, 494, 505, 1, 0, 0, 0, 495, 498, 3, 54, 27, 0, 496, 497, 5, 65, 0, 0, 497, 499, 3, 58, 29, 0, 498, 496, 1, 0, 0, 0, 498, 499, 1, 0, 0, 0, 499, 502, 1, 0, 0, 0, 500, 501, 5, 65, 0, 0, 501, 503, 3, 56, 28, 0, 502, 500, 1, 0, 0, 0, 502, 503, 1, 0, 0, 0, 503, 506, 1, 0, 0, 0, 504, 506, 3, 56, 28, 0, 505, 495, 1, 0, 0, 0, 505, 504, 1, 0, 0, 0, 506, 508, 1, 0, 0, 0, 507, 509, 5, 65, 0, 0, 508, 507, 1, 0, 0, 0, 508, 509, 1, 0, 0, 0, 509, 515, 1, 0, 0, 0, 510, 512, 3, 58, 29, 0, 511, 513, 5, 65, 0, 0, 512, 511, 1, 0, 0, 0, 512, 513, 1, 0, 0, 0, 513, 515, 1, 0, 0, 0, 514, 493, 1, 0, 0, 0, 514, 510, 1, 0, 0, 0, 515, 53, 1, 0, 0, 0, 516, 517, 5, 64, 0, 0, 517, 518, 3, 62, 31, 0, 518, 55, 1, 0, 0, 0, 519, 520, 5, 68, 0, 0, 520, 521, 3, 62, 31, 0, 521, 57, 1, 0, 0, 0, 522, 527, 3, 60, 30, 0, 523, 524, 5, 65, 0, 0, 524, 526, 3, 60, 30, 0, 525, 523, 1, 0, 0, 0, 526, 529, 1, 0, 0, 0, 527, 525, 1, 0, 0, 0, 527, 528, 1, 0, 0, 0, 528, 59, 1, 0, 0, 0, 529, 527, 1, 0, 0, 0, 530, 533, 3, 62, 31, 0, 531, 532, 5, 69, 0, 0, 532, 534, 3, 84, 42, 0, 533, 531, 1, 0, 0, 0, 533, 534, 1, 0, 0, 0, 534, 537, 1, 0, 0, 0, 535, 537, 5, 64, 0, 0, 536, 530, 1, 0, 0, 0, 536, 535, 1, 0, 0, 0, 537, 61, 1, 0, 0, 0, 538, 541, 3, 112, 56, 0, 539, 540, 5, 66, 0, 0, 540, 542, 3, 84, 42, 0, 541, 539, 1, 0, 0, 0, 541, 542, 1, 0, 0, 0, 542, 63, 1, 0, 0, 0, 543, 548, 3, 66, 33, 0, 544, 545, 5, 67, 0, 0, 545, 547, 3, 66, 33, 0, 546, 544, 1, 0, 0, 0, 547, 550, 1, 0, 0, 0, 548, 546, 1, 0, 0, 0, 548, 549, 1, 0, 0, 0, 549, 552, 1, 0, 0, 0, 550, 548, 1, 0, 0, 0, 551, 553, 5, 67, 0, 0, 552, 551, 1, 0, 0, 0, 552, 553, 1, 0, 0, 0, 553, 554, 1, 0, 0, 0, 554, 555, 7, 5, 0, 0, 555, 65, 1, 0, 0, 0, 556, 557, 5, 117, 0, 0, 557, 559, 5, 69, 0, 0, 558, 556, 1, 0, 0, 0, 558, 559, 1, 0, 0, 0, 559, 562, 1, 0, 0, 0, 560, 561, 5, 117, 0, 0, 561, 563, 5, 62, 0, 0, 562, 560, 1, 0, 0, 0, 562, 563, 1, 0, 0, 0, 563, 564, 1, 0, 0, 0, 564, 565, 5, 117, 0, 0, 565, 567, 5, 111, 0, 0, 566, 568, 3, 126, 63, 0, 567, 566, 1, 0, 0, 0, 567, 568, 1, 0, 0, 0, 568, 569, 1, 0, 0, 0, 569, 708, 5, 112, 0, 0, 570, 571, 3, 74, 37, 0, 571, 573, 5, 69, 0, 0, 572, 574, 3, 40, 20, 0, 573, 572, 1, 0, 0, 0, 573, 574, 1, 0, 0, 0, 574, 575, 1, 0, 0, 0, 575, 576, 7, 2, 0, 0, 576, 579, 3, 108, 54, 0, 577, 578, 7, 7, 0, 0, 578, 580, 3, 84, 42, 0, 579, 577, 1, 0, 0, 0, 579, 580, 1, 0, 0, 0, 580, 708, 1, 0, 0, 0, 581, 582, 5, 50, 0, 0, 582, 708, 3, 84, 42, 0, 583, 585, 3, 68, 34, 0, 584, 586, 3, 72, 36, 0, 585, 584, 1, 0, 0, 0, 585, 586, 1, 0, 0, 0, 586, 708, 1, 0, 0, 0, 587, 588, 4, 33, 2, 0, 588, 611, 5, 37, 0, 0, 589, 594, 3, 84, 42, 0, 590, 591, 5, 65, 0, 0, 591, 593, 3, 84, 42, 0, 592, 590, 1, 0, 0, 0, 593, 596, 1, 0, 0, 0, 594, 592, 1, 0, 0, 0, 594, 595, 1, 0, 0, 0, 595, 598, 1, 0, 0, 0, 596, 594, 1, 0, 0, 0, 597, 599, 5, 65, 0, 0, 598, 597, 1, 0, 0, 0, 598, 599, 1, 0, 0, 0, 599, 612, 1, 0, 0, 0, 600, 601, 5, 74, 0, 0, 601, 604, 3, 84, 42, 0, 602, 603, 5, 65, 0, 0, 603, 605, 3, 84, 42, 0, 604, 602, 1, 0, 0, 0, 605, 606, 1, 0, 0, 0, 606, 604, 1, 0, 0, 0, 606, 607, 1, 0, 0, 0, 607, 609, 1, 0, 0, 0, 608, 610, 5, 65, 0, 0, 609, 608, 1, 0, 0, 0, 609, 610, 1, 0, 0, 0, 610, 612, 1, 0, 0, 0, 611, 589, 1, 0, 0, 0, 611, 600, 1, 0, 0, 0, 612, 613, 1, 0, 0, 0, 613, 614, 6, 33, -1, 0, 614, 708, 1, 0, 0, 0, 615, 616, 5, 31, 0, 0, 616, 708, 3, 74, 37, 0, 617, 708, 5, 32, 0, 0, 618, 708, 5, 34, 0, 0, 619, 708, 5, 33, 0, 0, 620, 622, 5, 5, 0, 0, 621, 623, 3, 108, 54, 0, 622, 621, 1, 0, 0, 0, 622, 623, 1, 0, 0, 0, 623, 708, 1, 0, 0, 0, 624, 634, 5, 6, 0, 0, 625, 632, 3, 84, 42, 0, 626, 627, 5, 65, 0, 0, 627, 630, 3, 84, 42, 0, 628, 629, 5, 65, 0, 0, 629, 631, 3, 84, 42, 0, 630, 628, 1, 0, 0, 0, 630, 631, 1, 0, 0, 0, 631, 633, 1, 0, 0, 0, 632, 626, 1, 0, 0, 0, 632, 633, 1, 0, 0, 0, 633, 635, 1, 0, 0, 0, 634, 625, 1, 0, 0, 0, 634, 635, 1, 0, 0, 0, 635, 638, 1, 0, 0, 0, 636, 637, 5, 7, 0, 0, 637, 639, 3, 84, 42, 0, 638, 636, 1, 0, 0, 0, 638, 639, 1, 0, 0, 0, 639, 708, 1, 0, 0, 0, 640, 708, 3, 118, 59, 0, 641, 642, 5, 8, 0, 0, 642, 708, 3, 80, 40, 0, 643, 656, 5, 7, 0, 0, 644, 646, 7, 8, 0, 0, 645, 644, 1, 0, 0, 0, 646, 649, 1, 0, 0, 0, 647, 645, 1, 0, 0, 0, 647, 648, 1, 0, 0, 0, 648, 650, 1, 0, 0, 0, 649, 647, 1, 0, 0, 0, 650, 657, 3, 110, 55, 0, 651, 653, 7, 8, 0, 0, 652, 651, 1, 0, 0, 0, 653, 654, 1, 0, 0, 0, 654, 652, 1, 0, 0, 0, 654, 655, 1, 0, 0, 0, 655, 657, 1, 0, 0, 0, 656, 647, 1, 0, 0, 0, 656, 652, 1, 0, 0, 0, 657, 658, 1, 0, 0, 0, 658, 665, 5, 8, 0, 0, 659, 666, 5, 64, 0, 0, 660, 661, 5, 111, 0, 0, 661, 662, 3, 76, 38, 0, 662, 663, 5, 112, 0, 0, 663, 666, 1, 0, 0, 0, 664, 666, 3, 76, 38, 0, 665, 659, 1, 0, 0, 0, 665, 660, 1, 0, 0, 0, 665, 664, 1, 0, 0, 0, 666, 708, 1, 0, 0, 0, 667, 668, 5, 11, 0, 0, 668, 673, 3, 112, 56, 0, 669, 670, 5, 65, 0, 0, 670, 672, 3, 112, 56, 0, 671, 669, 1, 0, 0, 0, 672, 675, 1, 0, 0, 0, 673, 671, 1, 0, 0, 0, 673, 674, 1, 0, 0, 0, 674, 708, 1, 0, 0, 0, 675, 673, 1, 0, 0, 0, 676, 677, 4, 33, 3, 0, 677, 678, 5, 38, 0, 0, 678, 685, 3, 100, 50, 0, 679, 680, 5, 18, 0, 0, 680, 683, 3, 84, 42, 0, 681, 682, 5, 65, 0, 0, 682, 684, 3, 84, 42, 0, 683, 681, 1, 0, 0, 0, 683, 684, 1, 0, 0, 0, 684, 686, 1, 0, 0, 0, 685, 679, 1, 0, 0, 0, 685, 686, 1, 0, 0, 0, 686, 687, 1, 0, 0, 0, 687, 688, 6, 33, -1, 0, 688, 708, 1, 0, 0, 0, 689, 690, 5, 12, 0, 0, 690, 693, 3, 84, 42, 0, 691, 692, 5, 65, 0, 0, 692, 694, 3, 84, 42, 0, 693, 691, 1, 0, 0, 0, 693, 694, 1, 0, 0, 0, 694, 708, 1, 0, 0, 0, 695, 696, 4, 33, 4, 0, 696, 697, 5, 9, 0, 0, 697, 702, 3, 112, 56, 0, 698, 699, 5, 65, 0, 0, 699, 701, 3, 112, 56, 0, 700, 698, 1, 0, 0, 0, 701, 704, 1, 0, 0, 0, 702, 700, 1, 0, 0, 0, 702, 703, 1, 0, 0, 0, 703, 705, 1, 0, 0, 0, 704, 702, 1, 0, 0, 0, 705, 706, 6, 33, -1, 0, 706, 708, 1, 0, 0, 0, 707, 558, 1, 0, 0, 0, 707, 570, 1, 0, 0, 0, 707, 581, 1, 0, 0, 0, 707, 583, 1, 0, 0, 0, 707, 587, 1, 0, 0, 0, 707, 615, 1, 0, 0, 0, 707, 617, 1, 0, 0, 0, 707, 618, 1, 0, 0, 0, 707, 619, 1, 0, 0, 0, 707, 620, 1, 0, 0, 0, 707, 624, 1, 0, 0, 0, 707, 640, 1, 0, 0, 0, 707, 641, 1, 0, 0, 0, 707, 643, 1, 0, 0, 0, 707, 667, 1, 0, 0, 0, 707, 676, 1, 0, 0, 0, 707, 689, 1, 0, 0, 0, 707, 695, 1, 0, 0, 0, 708, 67, 1, 0, 0, 0, 709, 712, 3, 84, 42, 0, 710, 712, 3, 70, 35, 0, 711, 709, 1, 0, 0, 0, 711, 710, 1, 0, 0, 0, 712, 713, 1, 0, 0, 0, 713, 714, 5, 65, 0, 0, 714, 716, 1, 0, 0, 0, 715, 711, 1, 0, 0, 0, 716, 717, 1, 0, 0, 0, 717, 715, 1, 0, 0, 0, 717, 718, 1, 0, 0, 0, 718, 721, 1, 0, 0, 0, 719, 722, 3, 84, 42, 0, 720, 722, 3, 70, 35, 0, 721, 719, 1, 0, 0, 0, 721, 720, 1, 0, 0, 0, 721, 722, 1, 0, 0, 0, 722, 725, 1, 0, 0, 0, 723, 725, 3, 108, 54, 0, 724, 715, 1, 0, 0, 0, 724, 723, 1, 0, 0, 0, 725, 69, 1, 0, 0, 0, 726, 727, 5, 64, 0, 0, 727, 728, 3, 100, 50, 0, 728, 71, 1, 0, 0, 0, 729, 743, 5, 69, 0, 0, 730, 735, 3, 68, 34, 0, 731, 732, 5, 69, 0, 0, 732, 734, 3, 68, 34, 0, 733, 731, 1, 0, 0, 0, 734, 737, 1, 0, 0, 0, 735, 733, 1, 0, 0, 0, 735, 736, 1, 0, 0, 0, 736, 740, 1, 0, 0, 0, 737, 735, 1, 0, 0, 0, 738, 739, 5, 69, 0, 0, 739, 741, 3, 118, 59, 0, 740, 738, 1, 0, 0, 0, 740, 741, 1, 0, 0, 0, 741, 744, 1, 0, 0, 0, 742, 744, 3, 118, 59, 0, 743, 730, 1, 0, 0, 0, 743, 742, 1, 0, 0, 0, 744, 760, 1, 0, 0, 0, 745, 746, 4, 36, 5, 0, 746, 747, 5, 66, 0, 0, 747, 750, 3, 84, 42, 0, 748, 749, 5, 69, 0, 0, 749, 751, 3, 108, 54, 0, 750, 748, 1, 0, 0, 0, 750, 751, 1, 0, 0, 0, 751, 752, 1, 0, 0, 0, 752, 753, 6, 36, -1, 0, 753, 760, 1, 0, 0, 0, 754, 757, 7, 9, 0, 0, 755, 758, 3, 118, 59, 0, 756, 758, 3, 108, 54, 0, 757, 755, 1, 0, 0, 0, 757, 756, 1, 0, 0, 0, 758, 760, 1, 0, 0, 0, 759, 729, 1, 0, 0, 0, 759, 745, 1, 0, 0, 0, 759, 754, 1, 0, 0, 0, 760, 73, 1, 0, 0, 0, 761, 766, 3, 100, 50, 0, 762, 763, 5, 65, 0, 0, 763, 765, 3, 100, 50, 0, 764, 762, 1, 0, 0, 0, 765, 768, 1, 0, 0, 0, 766, 764, 1, 0, 0, 0, 766, 767, 1, 0, 0, 0, 767, 770, 1, 0, 0, 0, 768, 766, 1, 0, 0, 0, 769, 771, 5, 65, 0, 0, 770, 769, 1, 0, 0, 0, 770, 771, 1, 0, 0, 0, 771, 75, 1, 0, 0, 0, 772, 777, 3, 78, 39, 0, 773, 774, 5, 65, 0, 0, 774, 776, 3, 78, 39, 0, 775, 773, 1, 0, 0, 0, 776, 779, 1, 0, 0, 0, 777, 775, 1, 0, 0, 0, 777, 778, 1, 0, 0, 0, 778, 781, 1, 0, 0, 0, 779, 777, 1, 0, 0, 0, 780, 782, 5, 65, 0, 0, 781, 780, 1, 0, 0, 0, 781, 782, 1, 0, 0, 0, 782, 77, 1, 0, 0, 0, 783, 786, 3, 112, 56, 0, 784, 785, 5, 10, 0, 0, 785, 787, 3, 112, 56, 0, 786, 784, 1, 0, 0, 0, 786, 787, 1, 0, 0, 0, 787, 79, 1, 0, 0, 0, 788, 793, 3, 82, 41, 0, 789, 790, 5, 65, 0, 0, 790, 792, 3, 82, 41, 0, 791, 789, 1, 0, 0, 0, 792, 795, 1, 0, 0, 0, 793, 791, 1, 0, 0, 0, 793, 794, 1, 0, 0, 0, 794, 81, 1, 0, 0, 0, 795, 793, 1, 0, 0, 0, 796, 799, 3, 110, 55, 0, 797, 798, 5, 10, 0, 0, 798, 800, 3, 112, 56, 0, 799, 797, 1, 0, 0, 0, 799, 800, 1, 0, 0, 0, 800, 83, 1, 0, 0, 0, 801, 807, 3, 96, 48, 0, 802, 803, 5, 13, 0, 0, 803, 804, 3, 96, 48, 0, 804, 805, 5, 15, 0, 0, 805, 806, 3, 84, 42, 0, 806, 808, 1, 0, 0, 0, 807, 802, 1, 0, 0, 0, 807, 808, 1, 0, 0, 0, 808, 816, 1, 0, 0, 0, 809, 811, 5, 24, 0, 0, 810, 812, 3, 86, 43, 0, 811, 810, 1, 0, 0, 0, 811, 812, 1, 0, 0, 0, 812, 813, 1, 0, 0, 0, 813, 814, 5, 66, 0, 0, 814, 816, 3, 84, 42, 0, 815, 801, 1, 0, 0, 0, 815, 809, 1, 0, 0, 0, 816, 85, 1, 0, 0, 0, 817, 818, 3, 88, 44, 0, 818, 819, 5, 65, 0, 0, 819, 821, 1, 0, 0, 0, 820, 817, 1, 0, 0, 0, 820, 821, 1, 0, 0, 0, 821, 832, 1, 0, 0, 0, 822, 825, 3, 92, 46, 0, 823, 824, 5, 65, 0, 0, 824, 826, 3, 88, 44, 0, 825, 823, 1, 0, 0, 0, 825, 826, 1, 0, 0, 0, 826, 829, 1, 0, 0, 0, 827, 828, 5, 65, 0, 0, 828, 830, 3, 94, 47, 0, 829, 827, 1, 0, 0, 0, 829, 830, 1, 0, 0, 0, 830, 833, 1, 0, 0, 0, 831, 833, 3, 94, 47, 0, 832, 822, 1, 0, 0, 0, 832, 831, 1, 0, 0, 0, 833, 835, 1, 0, 0, 0, 834, 836, 5, 65, 0, 0, 835, 834, 1, 0, 0, 0, 835, 836, 1, 0, 0, 0, 836, 842, 1, 0, 0, 0, 837, 839, 3, 88, 44, 0, 838, 840, 5, 65, 0, 0, 839, 838, 1, 0, 0, 0, 839, 840, 1, 0, 0, 0, 840, 842, 1, 0, 0, 0, 841, 820, 1, 0, 0, 0, 841, 837, 1, 0, 0, 0, 842, 87, 1, 0, 0, 0, 843, 848, 3, 90, 45, 0, 844, 845, 5, 65, 0, 0, 845, 847, 3, 90, 45, 0, 846, 844, 1, 0, 0, 0, 847, 850, 1, 0, 0, 0, 848, 846, 1, 0, 0, 0, 848, 849, 1, 0, 0, 0, 849, 89, 1, 0, 0, 0, 850, 848, 1, 0, 0, 0, 851, 854, 3, 112, 56, 0, 852, 853, 5, 69, 0, 0, 853, 855, 3, 84, 42, 0, 854, 852, 1, 0, 0, 0, 854, 855, 1, 0, 0, 0, 855, 858, 1, 0, 0, 0, 856, 858, 5, 64, 0, 0, 857, 851, 1, 0, 0, 0, 857, 856, 1, 0, 0, 0, 858, 91, 1, 0, 0, 0, 859, 860, 5, 64, 0, 0, 860, 861, 3, 112, 56, 0, 861, 93, 1, 0, 0, 0, 862, 863, 5, 68, 0, 0, 863, 864, 3, 112, 56, 0, 864, 95, 1, 0, 0, 0, 865, 866, 6, 48, -1, 0, 866, 870, 3, 98, 49, 0, 867, 868, 5, 27, 0, 0, 868, 870, 3, 96, 48, 3, 869, 865, 1, 0, 0, 0, 869, 867, 1, 0, 0, 0, 870, 879, 1, 0, 0, 0, 871, 872, 10, 2, 0, 0, 872, 873, 5, 26, 0, 0, 873, 878, 3, 96, 48, 3, 874, 875, 10, 1, 0, 0, 875, 876, 5, 25, 0, 0, 876, 878, 3, 96, 48, 2, 877, 871, 1, 0, 0, 0, 877, 874, 1, 0, 0, 0, 878, 881, 1, 0, 0, 0, 879, 877, 1, 0, 0, 0, 879, 880, 1, 0, 0, 0, 880, 97, 1, 0, 0, 0, 881, 879, 1, 0, 0, 0, 882, 883, 6, 49, -1, 0, 883, 884, 3, 100, 50, 0, 884, 906, 1, 0, 0, 0, 885, 901, 10, 2, 0, 0, 886, 902, 5, 81, 0, 0, 887, 902, 5, 82, 0, 0, 888, 902, 5, 83, 0, 0, 889, 902, 5, 84, 0, 0, 890, 902, 5, 85, 0, 0, 891, 902, 5, 86, 0, 0, 892, 902, 5, 87, 0, 0, 893, 895, 5, 27, 0, 0, 894, 893, 1, 0, 0, 0, 894, 895, 1, 0, 0, 0, 895, 896, 1, 0, 0, 0, 896, 902, 5, 18, 0, 0, 897, 899, 5, 28, 0, 0, 898, 900, 5, 27, 0, 0, 899, 898, 1, 0, 0, 0, 899, 900, 1, 0, 0, 0, 900, 902, 1, 0, 0, 0, 901, 886, 1, 0, 0, 0, 901, 887, 1, 0, 0, 0, 901, 888, 1, 0, 0, 0, 901, 889, 1, 0, 0, 0, 901, 890, 1, 0, 0, 0, 901, 891, 1, 0, 0, 0, 901, 892, 1, 0, 0, 0, 901, 894, 1, 0, 0, 0, 901, 897, 1, 0, 0, 0, 902, 903, 1, 0, 0, 0, 903, 905, 3, 98, 49, 3, 904, 885, 1, 0, 0, 0, 905, 908, 1, 0, 0, 0, 906, 904, 1, 0, 0, 0, 906, 907, 1, 0, 0, 0, 907, 99, 1, 0, 0, 0, 908, 906, 1, 0, 0, 0, 909, 911, 6, 50, -1, 0, 910, 912, 5, 36, 0, 0, 911, 910, 1, 0, 0, 0, 911, 912, 1, 0, 0, 0, 912, 913, 1, 0, 0, 0, 913, 917, 3, 102, 51, 0, 914, 916, 3, 122, 61, 0, 915, 914, 1, 0, 0, 0, 916, 919, 1, 0, 0, 0, 917, 915, 1, 0, 0, 0, 917, 918, 1, 0, 0, 0, 918, 923, 1, 0, 0, 0, 919, 917, 1, 0, 0, 0, 920, 921, 7, 10, 0, 0, 921, 923, 3, 100, 50, 7, 922, 909, 1, 0, 0, 0, 922, 920, 1, 0, 0, 0, 923, 947, 1, 0, 0, 0, 924, 925, 10, 8, 0, 0, 925, 926, 5, 68, 0, 0, 926, 946, 3, 100, 50, 8, 927, 928, 10, 6, 0, 0, 928, 929, 7, 11, 0, 0, 929, 946, 3, 100, 50, 7, 930, 931, 10, 5, 0, 0, 931, 932, 7, 12, 0, 0, 932, 946, 3, 100, 50, 6, 933, 934, 10, 4, 0, 0, 934, 935, 7, 13, 0, 0, 935, 946, 3, 100, 50, 5, 936, 937, 10, 3, 0, 0, 937, 938, 5, 72, 0, 0, 938, 946, 3, 100, 50, 4, 939, 940, 10, 2, 0, 0, 940, 941, 5, 71, 0, 0, 941, 946, 3, 100, 50, 3, 942, 943, 10, 1, 0, 0, 943, 944, 5, 70, 0, 0, 944, 946, 3, 100, 50, 2, 945, 924, 1, 0, 0, 0, 945, 927, 1, 0, 0, 0, 945, 930, 1, 0, 0, 0, 945, 933, 1, 0, 0, 0, 945, 936, 1, 0, 0, 0, 945, 939, 1, 0, 0, 0, 945, 942, 1, 0, 0, 0, 946, 949, 1, 0, 0, 0, 947, 945, 1, 0, 0, 0, 947, 948, 1, 0, 0, 0, 948, 101, 1, 0, 0, 0, 949, 947, 1, 0, 0, 0, 950, 953, 5, 111, 0, 0, 951, 954, 3, 118, 59, 0, 952, 954, 3, 106, 53, 0, 953, 951, 1, 0, 0, 0, 953, 952, 1, 0, 0, 0, 953, 954, 1, 0, 0, 0, 954, 955, 1, 0, 0, 0, 955, 981, 5, 112, 0, 0, 956, 958, 5, 115, 0, 0, 957, 959, 3, 106, 53, 0, 958, 957, 1, 0, 0, 0, 958, 959, 1, 0, 0, 0, 959, 960, 1, 0, 0, 0, 960, 981, 5, 116, 0, 0, 961, 963, 5, 113, 0, 0, 962, 964, 3, 104, 52, 0, 963, 962, 1, 0, 0, 0, 963, 964, 1, 0, 0, 0, 964, 965, 1, 0, 0, 0, 965, 981, 5, 114, 0, 0, 966, 981, 5, 63, 0, 0, 967, 981, 3, 112, 56, 0, 968, 981, 5, 37, 0, 0, 969, 981, 5, 38, 0, 0, 970, 972, 5, 76, 0, 0, 971, 970, 1, 0, 0, 0, 971, 972, 1, 0, 0, 0, 972, 973, 1, 0, 0, 0, 973, 981, 3, 114, 57, 0, 974, 981, 5, 20, 0, 0, 975, 977, 5, 103, 0, 0, 976, 975, 1, 0, 0, 0, 977, 978, 1, 0, 0, 0, 978, 976, 1, 0, 0, 0, 978, 979, 1, 0, 0, 0, 979, 981, 1, 0, 0, 0, 980, 950, 1, 0, 0, 0, 980, 956, 1, 0, 0, 0, 980, 961, 1, 0, 0, 0, 980, 966, 1, 0, 0, 0, 980, 967, 1, 0, 0, 0, 980, 968, 1, 0, 0, 0, 980, 969, 1, 0, 0, 0, 980, 971, 1, 0, 0, 0, 980, 974, 1, 0, 0, 0, 980, 976, 1, 0, 0, 0, 981, 103, 1, 0, 0, 0, 982, 983, 3, 84, 42, 0, 983, 984, 5, 66, 0, 0, 984, 985, 3, 84, 42, 0, 985, 989, 1, 0, 0, 0, 986, 987, 5, 68, 0, 0, 987, 989, 3, 100, 50, 0, 988, 982, 1, 0, 0, 0, 988, 986, 1, 0, 0, 0, 989, 1001, 1, 0, 0, 0, 990, 997, 5, 65, 0, 0, 991, 992, 3, 84, 42, 0, 992, 993, 5, 66, 0, 0, 993, 994, 3, 84, 42, 0, 994, 998, 1, 0, 0, 0, 995, 996, 5, 68, 0, 0, 996, 998, 3, 100, 50, 0, 997, 991, 1, 0, 0, 0, 997, 995, 1, 0, 0, 0, 998, 1000, 1, 0, 0, 0, 999, 990, 1, 0, 0, 0, 1000, 1003, 1, 0, 0, 0, 1001, 999, 1, 0, 0, 0, 1001, 1002, 1, 0, 0, 0, 1002, 1005, 1, 0, 0, 0, 1003, 1001, 1, 0, 0, 0, 1004, 1006, 5, 65, 0, 0, 1005, 1004, 1, 0, 0, 0, 1005, 1006, 1, 0, 0, 0, 1006, 1014, 1, 0, 0, 0, 1007, 1008, 3, 84, 42, 0, 1008, 1009, 5, 66, 0, 0, 1009, 1010, 3, 84, 42, 0, 1010, 1011, 3, 136, 68, 0, 1011, 1014, 1, 0, 0, 0, 1012, 1014, 3, 106, 53, 0, 1013, 988, 1, 0, 0, 0, 1013, 1007, 1, 0, 0, 0, 1013, 1012, 1, 0, 0, 0, 1014, 105, 1, 0, 0, 0, 1015, 1018, 3, 84, 42, 0, 1016, 1018, 3, 70, 35, 0, 1017, 1015, 1, 0, 0, 0, 1017, 1016, 1, 0, 0, 0, 1018, 1033, 1, 0, 0, 0, 1019, 1034, 3, 136, 68, 0, 1020, 1023, 5, 65, 0, 0, 1021, 1024, 3, 84, 42, 0, 1022, 1024, 3, 70, 35, 0, 1023, 1021, 1, 0, 0, 0, 1023, 1022, 1, 0, 0, 0, 1024, 1026, 1, 0, 0, 0, 1025, 1020, 1, 0, 0, 0, 1026, 1029, 1, 0, 0, 0, 1027, 1025, 1, 0, 0, 0, 1027, 1028, 1, 0, 0, 0, 1028, 1031, 1, 0, 0, 0, 1029, 1027, 1, 0, 0, 0, 1030, 1032, 5, 65, 0, 0, 1031, 1030, 1, 0, 0, 0, 1031, 1032, 1, 0, 0, 0, 1032, 1034, 1, 0, 0, 0, 1033, 1019, 1, 0, 0, 0, 1033, 1027, 1, 0, 0, 0, 1034, 107, 1, 0, 0, 0, 1035, 1040, 3, 84, 42, 0, 1036, 1037, 5, 65, 0, 0, 1037, 1039, 3, 84, 42, 0, 1038, 1036, 1, 0, 0, 0, 1039, 1042, 1, 0, 0, 0, 1040, 1038, 1, 0, 0, 0, 1040, 1041, 1, 0, 0, 0, 1041, 1044, 1, 0, 0, 0, 1042, 1040, 1, 0, 0, 0, 1043, 1045, 5, 65, 0, 0, 1044, 1043, 1, 0, 0, 0, 1044, 1045, 1, 0, 0, 0, 1045, 109, 1, 0, 0, 0, 1046, 1047, 6, 55, -1, 0, 1047, 1048, 3, 112, 56, 0, 1048, 1054, 1, 0, 0, 0, 1049, 1050, 10, 2, 0, 0, 1050, 1051, 5, 62, 0, 0, 1051, 1053, 3, 112, 56, 0, 1052, 1049, 1, 0, 0, 0, 1053, 1056, 1, 0, 0, 0, 1054, 1052, 1, 0, 0, 0, 1054, 1055, 1, 0, 0, 0, 1055, 111, 1, 0, 0, 0, 1056, 1054, 1, 0, 0, 0, 1057, 1058, 7, 14, 0, 0, 1058, 113, 1, 0, 0, 0, 1059, 1063, 3, 116, 58, 0, 1060, 1063, 5, 109, 0, 0, 1061, 1063, 5, 110, 0, 0, 1062, 1059, 1, 0, 0, 0, 1062, 1060, 1, 0, 0, 0, 1062, 1061, 1, 0, 0, 0, 1063, 115, 1, 0, 0, 0, 1064, 1065, 7, 15, 0, 0, 1065, 117, 1, 0, 0, 0, 1066, 1068, 5, 30, 0, 0, 1067, 1069, 3, 120, 60, 0, 1068, 1067, 1, 0, 0, 0, 1068, 1069, 1, 0, 0, 0, 1069, 119, 1, 0, 0, 0, 1070, 1071, 5, 7, 0, 0, 1071, 1074, 3, 84, 42, 0, 1072, 1074, 3, 108, 54, 0, 1073, 1070, 1, 0, 0, 0, 1073, 1072, 1, 0, 0, 0, 1074, 121, 1, 0, 0, 0, 1075, 1076, 5, 62, 0, 0, 1076, 1078, 3, 112, 56, 0, 1077, 1079, 3, 124, 62, 0, 1078, 1077, 1, 0, 0, 0, 1078, 1079, 1, 0, 0, 0, 1079, 1082, 1, 0, 0, 0, 1080, 1082, 3, 124, 62, 0, 1081, 1075, 1, 0, 0, 0, 1081, 1080, 1, 0, 0, 0, 1082, 123, 1, 0, 0, 0, 1083, 1085, 5, 111, 0, 0, 1084, 1086, 3, 126, 63, 0, 1085, 1084, 1, 0, 0, 0, 1085, 1086, 1, 0, 0, 0, 1086, 1087, 1, 0, 0, 0, 1087, 1093, 5, 112, 0, 0, 1088, 1089, 5, 115, 0, 0, 1089, 1090, 3, 130, 65, 0, 1090, 1091, 5, 116, 0, 0, 1091, 1093, 1, 0, 0, 0, 1092, 1083, 1, 0, 0, 0, 1092, 1088, 1, 0, 0, 0, 1093, 125, 1, 0, 0, 0, 1094, 1099, 3, 128, 64, 0, 1095, 1096, 5, 65, 0, 0, 1096, 1098, 3, 128, 64, 0, 1097, 1095, 1, 0, 0, 0, 1098, 1101, 1, 0, 0, 0, 1099, 1097, 1, 0, 0, 0, 1099, 1100, 1, 0, 0, 0, 1100, 1103, 1, 0, 0, 0, 1101, 1099, 1, 0, 0, 0, 1102, 1104, 5, 65, 0, 0, 1103, 1102, 1, 0, 0, 0, 1103, 1104, 1, 0, 0, 0, 1104, 127, 1, 0, 0, 0, 1105, 1109, 3, 84, 42, 0, 1106, 1110, 3, 136, 68, 0, 1107, 1108, 5, 69, 0, 0, 1108, 1110, 3, 84, 42, 0, 1109, 1106, 1, 0, 0, 0, 1109, 1107, 1, 0, 0, 0, 1109, 1110, 1, 0, 0, 0, 1110, 1114, 1, 0, 0, 0, 1111, 1112, 7, 16, 0, 0, 1112, 1114, 3, 84, 42, 0, 1113, 1105, 1, 0, 0, 0, 1113, 1111, 1, 0, 0, 0, 1114, 129, 1, 0, 0, 0, 1115, 1120, 3, 132, 66, 0, 1116, 1117, 5, 65, 0, 0, 1117, 1119, 3, 132, 66, 0, 1118, 1116, 1, 0, 0, 0, 1119, 1122, 1, 0, 0, 0, 1120, 1118, 1, 0, 0, 0, 1120, 1121, 1, 0, 0, 0, 1121, 1124, 1, 0, 0, 0, 1122, 1120, 1, 0, 0, 0, 1123, 1125, 5, 65, 0, 0, 1124, 1123, 1, 0, 0, 0, 1124, 1125, 1, 0, 0, 0, 1125, 131, 1, 0, 0, 0, 1126, 1145, 5, 63, 0, 0, 1127, 1135, 3, 84, 42, 0, 1128, 1130, 5, 66, 0, 0, 1129, 1131, 3, 84, 42, 0, 1130, 1129, 1, 0, 0, 0, 1130, 1131, 1, 0, 0, 0, 1131, 1133, 1, 0, 0, 0, 1132, 1134, 3, 134, 67, 0, 1133, 1132, 1, 0, 0, 0, 1133, 1134, 1, 0, 0, 0, 1134, 1136, 1, 0, 0, 0, 1135, 1128, 1, 0, 0, 0, 1135, 1136, 1, 0, 0, 0, 1136, 1145, 1, 0, 0, 0, 1137, 1139, 5, 66, 0, 0, 1138, 1140, 3, 84, 42, 0, 1139, 1138, 1, 0, 0, 0, 1139, 1140, 1, 0, 0, 0, 1140, 1142, 1, 0, 0, 0, 1141, 1143, 3, 134, 67, 0, 1142, 1141, 1, 0, 0, 0, 1142, 1143, 1, 0, 0, 0, 1143, 1145, 1, 0, 0, 0, 1144, 1126, 1, 0, 0, 0, 1144, 1127, 1, 0, 0, 0, 1144, 1137, 1, 0, 0, 0, 1145, 133, 1, 0, 0, 0, 1146, 1148, 5, 66, 0, 0, 1147, 1149, 3, 84, 42, 0, 1148, 1147, 1, 0, 0, 0, 1148, 1149, 1, 0, 0, 0, 1149, 135, 1, 0, 0, 0, 1150, 1151, 5, 17, 0, 0, 1151, 1152, 3, 74, 37, 0, 1152, 1153, 5, 18, 0, 0, 1153, 1155, 3, 96, 48, 0, 1154, 1156, 3, 138, 69, 0, 1155, 1154, 1, 0, 0, 0, 1155, 1156, 1, 0, 0, 0, 1156, 137, 1, 0, 0, 0, 1157, 1164, 3, 136, 68, 0, 1158, 1159, 5, 13, 0, 0, 1159, 1161, 3, 84, 42, 0, 1160, 1162, 3, 138, 69, 0, 1161, 1160, 1, 0, 0, 0, 1161, 1162, 1, 0, 0, 0, 1162, 1164, 1, 0, 0, 0, 1163, 1157, 1, 0, 0, 0, 1163, 1158, 1, 0, 0, 0, 1164, 139, 1, 0, 0, 0, 173, 143, 152, 156, 158, 164, 170, 174, 185, 189, 192, 200, 215, 218, 221, 224, 227, 235, 244, 249, 254, 259, 282, 290, 294, 301, 308, 318, 321, 341, 355, 357, 363, 373, 381, 384, 390, 396, 401, 407, 410, 422, 425, 431, 443, 449, 459, 465, 476, 482, 485, 493, 498, 502, 505, 508, 512, 514, 527, 533, 536, 541, 548, 552, 558, 562, 567, 573, 579, 585, 594, 598, 606, 609, 611, 622, 630, 632, 634, 638, 647, 654, 656, 665, 673, 683, 685, 693, 702, 707, 711, 717, 721, 724, 735, 740, 743, 750, 757, 759, 766, 770, 777, 781, 786, 793, 799, 807, 811, 815, 820, 825, 829, 832, 835, 839, 841, 848, 854, 857, 869, 877, 879, 894, 899, 901, 906, 911, 917, 922, 945, 947, 953, 958, 963, 971, 978, 980, 988, 997, 1001, 1005, 1013, 1017, 1023, 1027, 1031, 1033, 1040, 1044, 1054, 1062, 1068, 1073, 1078, 1081, 1085, 1092, 1099, 1103, 1109, 1113, 1120, 1124, 1130, 1133, 1135, 1139, 1142, 1144, 1148, 1155, 1161, 1163] \ No newline at end of file diff --git a/parser/FizzParser.py b/parser/FizzParser.py index b8a34c5..2ca83e0 100644 --- a/parser/FizzParser.py +++ b/parser/FizzParser.py @@ -1,4 +1,4 @@ -# Generated from FizzParser.g4 by ANTLR 4.13.1 +# Generated from FizzParser.g4 by ANTLR 4.13.2 # encoding: utf-8 from antlr4 import * from io import StringIO @@ -120,129 +120,129 @@ def serializedATN(): 0,2,4,6,8,10,12,14,16,18,20,22,24,26,28,30,32,34,36,38,40,42,44, 46,48,50,52,54,56,58,60,62,64,66,68,70,72,74,76,78,80,82,84,86,88, 90,92,94,96,98,100,102,104,106,108,110,112,114,116,118,120,122,124, - 126,128,130,132,134,136,138,0,16,1,0,41,42,1,0,41,43,1,0,41,44,1, - 0,57,58,1,1,3,3,2,0,46,46,57,59,2,0,13,13,66,66,1,0,62,63,1,0,90, - 102,2,0,75,76,80,80,3,0,64,64,77,79,88,88,1,0,75,76,1,0,73,74,3, - 0,39,40,45,45,117,117,1,0,105,108,2,0,64,64,68,68,1331,0,143,1,0, - 0,0,2,152,1,0,0,0,4,156,1,0,0,0,6,160,1,0,0,0,8,170,1,0,0,0,10,172, - 1,0,0,0,12,282,1,0,0,0,14,294,1,0,0,0,16,296,1,0,0,0,18,308,1,0, - 0,0,20,314,1,0,0,0,22,325,1,0,0,0,24,330,1,0,0,0,26,334,1,0,0,0, - 28,338,1,0,0,0,30,343,1,0,0,0,32,363,1,0,0,0,34,377,1,0,0,0,36,390, - 1,0,0,0,38,407,1,0,0,0,40,417,1,0,0,0,42,425,1,0,0,0,44,437,1,0, - 0,0,46,453,1,0,0,0,48,469,1,0,0,0,50,474,1,0,0,0,52,514,1,0,0,0, - 54,516,1,0,0,0,56,519,1,0,0,0,58,522,1,0,0,0,60,536,1,0,0,0,62,538, - 1,0,0,0,64,543,1,0,0,0,66,707,1,0,0,0,68,724,1,0,0,0,70,726,1,0, - 0,0,72,759,1,0,0,0,74,761,1,0,0,0,76,772,1,0,0,0,78,783,1,0,0,0, - 80,788,1,0,0,0,82,796,1,0,0,0,84,815,1,0,0,0,86,841,1,0,0,0,88,843, - 1,0,0,0,90,857,1,0,0,0,92,859,1,0,0,0,94,862,1,0,0,0,96,869,1,0, - 0,0,98,882,1,0,0,0,100,922,1,0,0,0,102,980,1,0,0,0,104,1013,1,0, - 0,0,106,1017,1,0,0,0,108,1035,1,0,0,0,110,1046,1,0,0,0,112,1057, - 1,0,0,0,114,1062,1,0,0,0,116,1064,1,0,0,0,118,1066,1,0,0,0,120,1073, - 1,0,0,0,122,1081,1,0,0,0,124,1092,1,0,0,0,126,1094,1,0,0,0,128,1113, - 1,0,0,0,130,1115,1,0,0,0,132,1144,1,0,0,0,134,1146,1,0,0,0,136,1150, - 1,0,0,0,138,1163,1,0,0,0,140,144,3,2,1,0,141,144,3,4,2,0,142,144, - 3,6,3,0,143,140,1,0,0,0,143,141,1,0,0,0,143,142,1,0,0,0,143,144, - 1,0,0,0,144,145,1,0,0,0,145,146,5,0,0,1,146,1,1,0,0,0,147,153,5, - 3,0,0,148,153,3,64,32,0,149,150,3,12,6,0,150,151,5,3,0,0,151,153, - 1,0,0,0,152,147,1,0,0,0,152,148,1,0,0,0,152,149,1,0,0,0,153,3,1, - 0,0,0,154,157,5,3,0,0,155,157,3,8,4,0,156,154,1,0,0,0,156,155,1, - 0,0,0,157,158,1,0,0,0,158,156,1,0,0,0,158,159,1,0,0,0,159,5,1,0, - 0,0,160,164,3,108,54,0,161,163,5,3,0,0,162,161,1,0,0,0,163,166,1, - 0,0,0,164,162,1,0,0,0,164,165,1,0,0,0,165,7,1,0,0,0,166,164,1,0, - 0,0,167,171,3,64,32,0,168,171,3,12,6,0,169,171,3,10,5,0,170,167, - 1,0,0,0,170,168,1,0,0,0,170,169,1,0,0,0,171,9,1,0,0,0,172,174,5, - 104,0,0,173,175,5,3,0,0,174,173,1,0,0,0,174,175,1,0,0,0,175,176, - 1,0,0,0,176,177,3,8,4,0,177,11,1,0,0,0,178,179,5,13,0,0,179,180, - 3,84,42,0,180,181,5,66,0,0,181,185,3,14,7,0,182,184,3,22,11,0,183, - 182,1,0,0,0,184,187,1,0,0,0,185,183,1,0,0,0,185,186,1,0,0,0,186, - 189,1,0,0,0,187,185,1,0,0,0,188,190,3,24,12,0,189,188,1,0,0,0,189, - 190,1,0,0,0,190,283,1,0,0,0,191,193,7,0,0,0,192,191,1,0,0,0,192, - 193,1,0,0,0,193,194,1,0,0,0,194,195,5,16,0,0,195,196,3,84,42,0,196, - 197,5,66,0,0,197,198,3,14,7,0,198,283,1,0,0,0,199,201,7,1,0,0,200, - 199,1,0,0,0,200,201,1,0,0,0,201,202,1,0,0,0,202,203,5,17,0,0,203, - 204,3,74,37,0,204,205,5,18,0,0,205,206,3,108,54,0,206,207,5,66,0, - 0,207,208,3,14,7,0,208,283,1,0,0,0,209,210,5,19,0,0,210,211,5,66, - 0,0,211,224,3,14,7,0,212,214,3,30,15,0,213,212,1,0,0,0,214,215,1, - 0,0,0,215,213,1,0,0,0,215,216,1,0,0,0,216,218,1,0,0,0,217,219,3, - 24,12,0,218,217,1,0,0,0,218,219,1,0,0,0,219,221,1,0,0,0,220,222, - 3,26,13,0,221,220,1,0,0,0,221,222,1,0,0,0,222,225,1,0,0,0,223,225, - 3,26,13,0,224,213,1,0,0,0,224,223,1,0,0,0,225,283,1,0,0,0,226,228, - 5,35,0,0,227,226,1,0,0,0,227,228,1,0,0,0,228,229,1,0,0,0,229,230, - 5,22,0,0,230,235,3,28,14,0,231,232,5,65,0,0,232,234,3,28,14,0,233, - 231,1,0,0,0,234,237,1,0,0,0,235,233,1,0,0,0,235,236,1,0,0,0,236, - 238,1,0,0,0,237,235,1,0,0,0,238,239,5,66,0,0,239,240,3,14,7,0,240, - 283,1,0,0,0,241,243,3,20,10,0,242,241,1,0,0,0,243,246,1,0,0,0,244, - 242,1,0,0,0,244,245,1,0,0,0,245,249,1,0,0,0,246,244,1,0,0,0,247, - 250,3,34,17,0,248,250,3,36,18,0,249,247,1,0,0,0,249,248,1,0,0,0, - 250,283,1,0,0,0,251,253,3,20,10,0,252,251,1,0,0,0,253,256,1,0,0, - 0,254,252,1,0,0,0,254,255,1,0,0,0,255,257,1,0,0,0,256,254,1,0,0, - 0,257,283,3,32,16,0,258,260,3,40,20,0,259,258,1,0,0,0,259,260,1, - 0,0,0,260,261,1,0,0,0,261,262,5,45,0,0,262,263,3,74,37,0,263,264, - 5,18,0,0,264,265,3,108,54,0,265,266,5,66,0,0,266,267,3,14,7,0,267, - 283,1,0,0,0,268,269,5,52,0,0,269,270,5,66,0,0,270,283,3,14,7,0,271, - 272,5,56,0,0,272,273,5,66,0,0,273,283,3,16,8,0,274,283,3,50,25,0, - 275,283,3,38,19,0,276,283,3,42,21,0,277,283,3,44,22,0,278,283,3, - 46,23,0,279,280,7,2,0,0,280,281,5,66,0,0,281,283,3,14,7,0,282,178, - 1,0,0,0,282,192,1,0,0,0,282,200,1,0,0,0,282,209,1,0,0,0,282,227, - 1,0,0,0,282,244,1,0,0,0,282,254,1,0,0,0,282,259,1,0,0,0,282,268, - 1,0,0,0,282,271,1,0,0,0,282,274,1,0,0,0,282,275,1,0,0,0,282,276, - 1,0,0,0,282,277,1,0,0,0,282,278,1,0,0,0,282,279,1,0,0,0,283,13,1, - 0,0,0,284,295,3,64,32,0,285,286,5,3,0,0,286,288,5,1,0,0,287,289, - 3,8,4,0,288,287,1,0,0,0,289,290,1,0,0,0,290,288,1,0,0,0,290,291, - 1,0,0,0,291,292,1,0,0,0,292,293,5,2,0,0,293,295,1,0,0,0,294,284, - 1,0,0,0,294,285,1,0,0,0,295,15,1,0,0,0,296,297,5,3,0,0,297,299,5, - 1,0,0,298,300,3,18,9,0,299,298,1,0,0,0,300,301,1,0,0,0,301,299,1, - 0,0,0,301,302,1,0,0,0,302,303,1,0,0,0,303,304,5,2,0,0,304,17,1,0, - 0,0,305,307,7,3,0,0,306,305,1,0,0,0,307,310,1,0,0,0,308,306,1,0, - 0,0,308,309,1,0,0,0,309,311,1,0,0,0,310,308,1,0,0,0,311,312,3,84, - 42,0,312,313,7,4,0,0,313,19,1,0,0,0,314,315,5,88,0,0,315,321,3,110, - 55,0,316,318,5,111,0,0,317,319,3,126,63,0,318,317,1,0,0,0,318,319, - 1,0,0,0,319,320,1,0,0,0,320,322,5,112,0,0,321,316,1,0,0,0,321,322, - 1,0,0,0,322,323,1,0,0,0,323,324,5,3,0,0,324,21,1,0,0,0,325,326,5, - 14,0,0,326,327,3,84,42,0,327,328,5,66,0,0,328,329,3,14,7,0,329,23, - 1,0,0,0,330,331,5,15,0,0,331,332,5,66,0,0,332,333,3,14,7,0,333,25, - 1,0,0,0,334,335,5,21,0,0,335,336,5,66,0,0,336,337,3,14,7,0,337,27, - 1,0,0,0,338,341,3,84,42,0,339,340,5,10,0,0,340,342,3,100,50,0,341, - 339,1,0,0,0,341,342,1,0,0,0,342,29,1,0,0,0,343,357,5,23,0,0,344, - 355,3,84,42,0,345,346,4,15,0,0,346,347,5,65,0,0,347,348,3,112,56, - 0,348,349,6,15,-1,0,349,356,1,0,0,0,350,351,4,15,1,0,351,352,5,10, - 0,0,352,353,3,112,56,0,353,354,6,15,-1,0,354,356,1,0,0,0,355,345, - 1,0,0,0,355,350,1,0,0,0,355,356,1,0,0,0,356,358,1,0,0,0,357,344, - 1,0,0,0,357,358,1,0,0,0,358,359,1,0,0,0,359,360,5,66,0,0,360,361, - 3,14,7,0,361,31,1,0,0,0,362,364,5,54,0,0,363,362,1,0,0,0,363,364, - 1,0,0,0,364,365,1,0,0,0,365,366,5,53,0,0,366,367,3,112,56,0,367, - 368,5,66,0,0,368,369,5,3,0,0,369,371,5,1,0,0,370,372,3,8,4,0,371, - 370,1,0,0,0,372,373,1,0,0,0,373,371,1,0,0,0,373,374,1,0,0,0,374, - 375,1,0,0,0,375,376,5,2,0,0,376,33,1,0,0,0,377,378,5,29,0,0,378, - 384,3,112,56,0,379,381,5,111,0,0,380,382,3,126,63,0,381,380,1,0, - 0,0,381,382,1,0,0,0,382,383,1,0,0,0,383,385,5,112,0,0,384,379,1, - 0,0,0,384,385,1,0,0,0,385,386,1,0,0,0,386,387,5,66,0,0,387,388,3, - 14,7,0,388,35,1,0,0,0,389,391,5,35,0,0,390,389,1,0,0,0,390,391,1, - 0,0,0,391,392,1,0,0,0,392,393,5,4,0,0,393,394,3,112,56,0,394,396, - 5,111,0,0,395,397,3,52,26,0,396,395,1,0,0,0,396,397,1,0,0,0,397, - 398,1,0,0,0,398,401,5,112,0,0,399,400,5,89,0,0,400,402,3,84,42,0, - 401,399,1,0,0,0,401,402,1,0,0,0,402,403,1,0,0,0,403,404,5,66,0,0, - 404,405,3,14,7,0,405,37,1,0,0,0,406,408,7,2,0,0,407,406,1,0,0,0, - 407,408,1,0,0,0,408,410,1,0,0,0,409,411,3,40,20,0,410,409,1,0,0, - 0,410,411,1,0,0,0,411,412,1,0,0,0,412,413,5,47,0,0,413,414,3,112, - 56,0,414,415,5,66,0,0,415,416,3,14,7,0,416,39,1,0,0,0,417,422,5, - 49,0,0,418,419,5,81,0,0,419,420,3,112,56,0,420,421,5,82,0,0,421, - 423,1,0,0,0,422,418,1,0,0,0,422,423,1,0,0,0,423,41,1,0,0,0,424,426, - 7,2,0,0,425,424,1,0,0,0,425,426,1,0,0,0,426,427,1,0,0,0,427,428, - 5,48,0,0,428,429,3,112,56,0,429,431,5,111,0,0,430,432,3,52,26,0, - 431,430,1,0,0,0,431,432,1,0,0,0,432,433,1,0,0,0,433,434,5,112,0, - 0,434,435,5,66,0,0,435,436,3,14,7,0,436,43,1,0,0,0,437,438,5,60, - 0,0,438,439,5,66,0,0,439,440,5,3,0,0,440,447,5,1,0,0,441,443,3,48, - 24,0,442,444,5,65,0,0,443,442,1,0,0,0,443,444,1,0,0,0,444,445,1, - 0,0,0,445,446,5,3,0,0,446,448,1,0,0,0,447,441,1,0,0,0,448,449,1, - 0,0,0,449,447,1,0,0,0,449,450,1,0,0,0,450,451,1,0,0,0,451,452,5, - 2,0,0,452,45,1,0,0,0,453,454,5,61,0,0,454,455,5,66,0,0,455,456,5, - 3,0,0,456,463,5,1,0,0,457,459,3,48,24,0,458,460,5,65,0,0,459,458, + 126,128,130,132,134,136,138,0,17,1,0,41,42,1,0,41,43,1,0,44,45,1, + 0,41,44,1,0,57,58,1,1,3,3,2,0,46,46,57,59,2,0,13,13,66,66,1,0,62, + 63,1,0,90,102,2,0,75,76,80,80,3,0,64,64,77,79,88,88,1,0,75,76,1, + 0,73,74,3,0,39,40,45,45,117,117,1,0,105,108,2,0,64,64,68,68,1331, + 0,143,1,0,0,0,2,152,1,0,0,0,4,156,1,0,0,0,6,160,1,0,0,0,8,170,1, + 0,0,0,10,172,1,0,0,0,12,282,1,0,0,0,14,294,1,0,0,0,16,296,1,0,0, + 0,18,308,1,0,0,0,20,314,1,0,0,0,22,325,1,0,0,0,24,330,1,0,0,0,26, + 334,1,0,0,0,28,338,1,0,0,0,30,343,1,0,0,0,32,363,1,0,0,0,34,377, + 1,0,0,0,36,390,1,0,0,0,38,407,1,0,0,0,40,417,1,0,0,0,42,425,1,0, + 0,0,44,437,1,0,0,0,46,453,1,0,0,0,48,469,1,0,0,0,50,474,1,0,0,0, + 52,514,1,0,0,0,54,516,1,0,0,0,56,519,1,0,0,0,58,522,1,0,0,0,60,536, + 1,0,0,0,62,538,1,0,0,0,64,543,1,0,0,0,66,707,1,0,0,0,68,724,1,0, + 0,0,70,726,1,0,0,0,72,759,1,0,0,0,74,761,1,0,0,0,76,772,1,0,0,0, + 78,783,1,0,0,0,80,788,1,0,0,0,82,796,1,0,0,0,84,815,1,0,0,0,86,841, + 1,0,0,0,88,843,1,0,0,0,90,857,1,0,0,0,92,859,1,0,0,0,94,862,1,0, + 0,0,96,869,1,0,0,0,98,882,1,0,0,0,100,922,1,0,0,0,102,980,1,0,0, + 0,104,1013,1,0,0,0,106,1017,1,0,0,0,108,1035,1,0,0,0,110,1046,1, + 0,0,0,112,1057,1,0,0,0,114,1062,1,0,0,0,116,1064,1,0,0,0,118,1066, + 1,0,0,0,120,1073,1,0,0,0,122,1081,1,0,0,0,124,1092,1,0,0,0,126,1094, + 1,0,0,0,128,1113,1,0,0,0,130,1115,1,0,0,0,132,1144,1,0,0,0,134,1146, + 1,0,0,0,136,1150,1,0,0,0,138,1163,1,0,0,0,140,144,3,2,1,0,141,144, + 3,4,2,0,142,144,3,6,3,0,143,140,1,0,0,0,143,141,1,0,0,0,143,142, + 1,0,0,0,143,144,1,0,0,0,144,145,1,0,0,0,145,146,5,0,0,1,146,1,1, + 0,0,0,147,153,5,3,0,0,148,153,3,64,32,0,149,150,3,12,6,0,150,151, + 5,3,0,0,151,153,1,0,0,0,152,147,1,0,0,0,152,148,1,0,0,0,152,149, + 1,0,0,0,153,3,1,0,0,0,154,157,5,3,0,0,155,157,3,8,4,0,156,154,1, + 0,0,0,156,155,1,0,0,0,157,158,1,0,0,0,158,156,1,0,0,0,158,159,1, + 0,0,0,159,5,1,0,0,0,160,164,3,108,54,0,161,163,5,3,0,0,162,161,1, + 0,0,0,163,166,1,0,0,0,164,162,1,0,0,0,164,165,1,0,0,0,165,7,1,0, + 0,0,166,164,1,0,0,0,167,171,3,64,32,0,168,171,3,12,6,0,169,171,3, + 10,5,0,170,167,1,0,0,0,170,168,1,0,0,0,170,169,1,0,0,0,171,9,1,0, + 0,0,172,174,5,104,0,0,173,175,5,3,0,0,174,173,1,0,0,0,174,175,1, + 0,0,0,175,176,1,0,0,0,176,177,3,8,4,0,177,11,1,0,0,0,178,179,5,13, + 0,0,179,180,3,84,42,0,180,181,5,66,0,0,181,185,3,14,7,0,182,184, + 3,22,11,0,183,182,1,0,0,0,184,187,1,0,0,0,185,183,1,0,0,0,185,186, + 1,0,0,0,186,189,1,0,0,0,187,185,1,0,0,0,188,190,3,24,12,0,189,188, + 1,0,0,0,189,190,1,0,0,0,190,283,1,0,0,0,191,193,7,0,0,0,192,191, + 1,0,0,0,192,193,1,0,0,0,193,194,1,0,0,0,194,195,5,16,0,0,195,196, + 3,84,42,0,196,197,5,66,0,0,197,198,3,14,7,0,198,283,1,0,0,0,199, + 201,7,1,0,0,200,199,1,0,0,0,200,201,1,0,0,0,201,202,1,0,0,0,202, + 203,5,17,0,0,203,204,3,74,37,0,204,205,5,18,0,0,205,206,3,108,54, + 0,206,207,5,66,0,0,207,208,3,14,7,0,208,283,1,0,0,0,209,210,5,19, + 0,0,210,211,5,66,0,0,211,224,3,14,7,0,212,214,3,30,15,0,213,212, + 1,0,0,0,214,215,1,0,0,0,215,213,1,0,0,0,215,216,1,0,0,0,216,218, + 1,0,0,0,217,219,3,24,12,0,218,217,1,0,0,0,218,219,1,0,0,0,219,221, + 1,0,0,0,220,222,3,26,13,0,221,220,1,0,0,0,221,222,1,0,0,0,222,225, + 1,0,0,0,223,225,3,26,13,0,224,213,1,0,0,0,224,223,1,0,0,0,225,283, + 1,0,0,0,226,228,5,35,0,0,227,226,1,0,0,0,227,228,1,0,0,0,228,229, + 1,0,0,0,229,230,5,22,0,0,230,235,3,28,14,0,231,232,5,65,0,0,232, + 234,3,28,14,0,233,231,1,0,0,0,234,237,1,0,0,0,235,233,1,0,0,0,235, + 236,1,0,0,0,236,238,1,0,0,0,237,235,1,0,0,0,238,239,5,66,0,0,239, + 240,3,14,7,0,240,283,1,0,0,0,241,243,3,20,10,0,242,241,1,0,0,0,243, + 246,1,0,0,0,244,242,1,0,0,0,244,245,1,0,0,0,245,249,1,0,0,0,246, + 244,1,0,0,0,247,250,3,34,17,0,248,250,3,36,18,0,249,247,1,0,0,0, + 249,248,1,0,0,0,250,283,1,0,0,0,251,253,3,20,10,0,252,251,1,0,0, + 0,253,256,1,0,0,0,254,252,1,0,0,0,254,255,1,0,0,0,255,257,1,0,0, + 0,256,254,1,0,0,0,257,283,3,32,16,0,258,260,3,40,20,0,259,258,1, + 0,0,0,259,260,1,0,0,0,260,261,1,0,0,0,261,262,7,2,0,0,262,263,3, + 74,37,0,263,264,5,18,0,0,264,265,3,108,54,0,265,266,5,66,0,0,266, + 267,3,14,7,0,267,283,1,0,0,0,268,269,5,52,0,0,269,270,5,66,0,0,270, + 283,3,14,7,0,271,272,5,56,0,0,272,273,5,66,0,0,273,283,3,16,8,0, + 274,283,3,50,25,0,275,283,3,38,19,0,276,283,3,42,21,0,277,283,3, + 44,22,0,278,283,3,46,23,0,279,280,7,3,0,0,280,281,5,66,0,0,281,283, + 3,14,7,0,282,178,1,0,0,0,282,192,1,0,0,0,282,200,1,0,0,0,282,209, + 1,0,0,0,282,227,1,0,0,0,282,244,1,0,0,0,282,254,1,0,0,0,282,259, + 1,0,0,0,282,268,1,0,0,0,282,271,1,0,0,0,282,274,1,0,0,0,282,275, + 1,0,0,0,282,276,1,0,0,0,282,277,1,0,0,0,282,278,1,0,0,0,282,279, + 1,0,0,0,283,13,1,0,0,0,284,295,3,64,32,0,285,286,5,3,0,0,286,288, + 5,1,0,0,287,289,3,8,4,0,288,287,1,0,0,0,289,290,1,0,0,0,290,288, + 1,0,0,0,290,291,1,0,0,0,291,292,1,0,0,0,292,293,5,2,0,0,293,295, + 1,0,0,0,294,284,1,0,0,0,294,285,1,0,0,0,295,15,1,0,0,0,296,297,5, + 3,0,0,297,299,5,1,0,0,298,300,3,18,9,0,299,298,1,0,0,0,300,301,1, + 0,0,0,301,299,1,0,0,0,301,302,1,0,0,0,302,303,1,0,0,0,303,304,5, + 2,0,0,304,17,1,0,0,0,305,307,7,4,0,0,306,305,1,0,0,0,307,310,1,0, + 0,0,308,306,1,0,0,0,308,309,1,0,0,0,309,311,1,0,0,0,310,308,1,0, + 0,0,311,312,3,84,42,0,312,313,7,5,0,0,313,19,1,0,0,0,314,315,5,88, + 0,0,315,321,3,110,55,0,316,318,5,111,0,0,317,319,3,126,63,0,318, + 317,1,0,0,0,318,319,1,0,0,0,319,320,1,0,0,0,320,322,5,112,0,0,321, + 316,1,0,0,0,321,322,1,0,0,0,322,323,1,0,0,0,323,324,5,3,0,0,324, + 21,1,0,0,0,325,326,5,14,0,0,326,327,3,84,42,0,327,328,5,66,0,0,328, + 329,3,14,7,0,329,23,1,0,0,0,330,331,5,15,0,0,331,332,5,66,0,0,332, + 333,3,14,7,0,333,25,1,0,0,0,334,335,5,21,0,0,335,336,5,66,0,0,336, + 337,3,14,7,0,337,27,1,0,0,0,338,341,3,84,42,0,339,340,5,10,0,0,340, + 342,3,100,50,0,341,339,1,0,0,0,341,342,1,0,0,0,342,29,1,0,0,0,343, + 357,5,23,0,0,344,355,3,84,42,0,345,346,4,15,0,0,346,347,5,65,0,0, + 347,348,3,112,56,0,348,349,6,15,-1,0,349,356,1,0,0,0,350,351,4,15, + 1,0,351,352,5,10,0,0,352,353,3,112,56,0,353,354,6,15,-1,0,354,356, + 1,0,0,0,355,345,1,0,0,0,355,350,1,0,0,0,355,356,1,0,0,0,356,358, + 1,0,0,0,357,344,1,0,0,0,357,358,1,0,0,0,358,359,1,0,0,0,359,360, + 5,66,0,0,360,361,3,14,7,0,361,31,1,0,0,0,362,364,5,54,0,0,363,362, + 1,0,0,0,363,364,1,0,0,0,364,365,1,0,0,0,365,366,5,53,0,0,366,367, + 3,112,56,0,367,368,5,66,0,0,368,369,5,3,0,0,369,371,5,1,0,0,370, + 372,3,8,4,0,371,370,1,0,0,0,372,373,1,0,0,0,373,371,1,0,0,0,373, + 374,1,0,0,0,374,375,1,0,0,0,375,376,5,2,0,0,376,33,1,0,0,0,377,378, + 5,29,0,0,378,384,3,112,56,0,379,381,5,111,0,0,380,382,3,126,63,0, + 381,380,1,0,0,0,381,382,1,0,0,0,382,383,1,0,0,0,383,385,5,112,0, + 0,384,379,1,0,0,0,384,385,1,0,0,0,385,386,1,0,0,0,386,387,5,66,0, + 0,387,388,3,14,7,0,388,35,1,0,0,0,389,391,5,35,0,0,390,389,1,0,0, + 0,390,391,1,0,0,0,391,392,1,0,0,0,392,393,5,4,0,0,393,394,3,112, + 56,0,394,396,5,111,0,0,395,397,3,52,26,0,396,395,1,0,0,0,396,397, + 1,0,0,0,397,398,1,0,0,0,398,401,5,112,0,0,399,400,5,89,0,0,400,402, + 3,84,42,0,401,399,1,0,0,0,401,402,1,0,0,0,402,403,1,0,0,0,403,404, + 5,66,0,0,404,405,3,14,7,0,405,37,1,0,0,0,406,408,7,3,0,0,407,406, + 1,0,0,0,407,408,1,0,0,0,408,410,1,0,0,0,409,411,3,40,20,0,410,409, + 1,0,0,0,410,411,1,0,0,0,411,412,1,0,0,0,412,413,5,47,0,0,413,414, + 3,112,56,0,414,415,5,66,0,0,415,416,3,14,7,0,416,39,1,0,0,0,417, + 422,5,49,0,0,418,419,5,81,0,0,419,420,3,112,56,0,420,421,5,82,0, + 0,421,423,1,0,0,0,422,418,1,0,0,0,422,423,1,0,0,0,423,41,1,0,0,0, + 424,426,7,3,0,0,425,424,1,0,0,0,425,426,1,0,0,0,426,427,1,0,0,0, + 427,428,5,48,0,0,428,429,3,112,56,0,429,431,5,111,0,0,430,432,3, + 52,26,0,431,430,1,0,0,0,431,432,1,0,0,0,432,433,1,0,0,0,433,434, + 5,112,0,0,434,435,5,66,0,0,435,436,3,14,7,0,436,43,1,0,0,0,437,438, + 5,60,0,0,438,439,5,66,0,0,439,440,5,3,0,0,440,447,5,1,0,0,441,443, + 3,48,24,0,442,444,5,65,0,0,443,442,1,0,0,0,443,444,1,0,0,0,444,445, + 1,0,0,0,445,446,5,3,0,0,446,448,1,0,0,0,447,441,1,0,0,0,448,449, + 1,0,0,0,449,447,1,0,0,0,449,450,1,0,0,0,450,451,1,0,0,0,451,452, + 5,2,0,0,452,45,1,0,0,0,453,454,5,61,0,0,454,455,5,66,0,0,455,456, + 5,3,0,0,456,463,5,1,0,0,457,459,3,48,24,0,458,460,5,65,0,0,459,458, 1,0,0,0,459,460,1,0,0,0,460,461,1,0,0,0,461,462,5,3,0,0,462,464, 1,0,0,0,463,457,1,0,0,0,464,465,1,0,0,0,465,463,1,0,0,0,465,466, 1,0,0,0,466,467,1,0,0,0,467,468,5,2,0,0,468,47,1,0,0,0,469,470,3, 112,56,0,470,471,5,66,0,0,471,472,3,84,42,0,472,49,1,0,0,0,473,475, - 7,5,0,0,474,473,1,0,0,0,475,476,1,0,0,0,476,474,1,0,0,0,476,477, + 7,6,0,0,474,473,1,0,0,0,475,476,1,0,0,0,476,474,1,0,0,0,476,477, 1,0,0,0,477,478,1,0,0,0,478,479,5,55,0,0,479,485,3,112,56,0,480, 482,5,111,0,0,481,483,3,52,26,0,482,481,1,0,0,0,482,483,1,0,0,0, 483,484,1,0,0,0,484,486,5,112,0,0,485,480,1,0,0,0,485,486,1,0,0, @@ -266,14 +266,14 @@ def serializedATN(): 63,1,0,0,0,543,548,3,66,33,0,544,545,5,67,0,0,545,547,3,66,33,0, 546,544,1,0,0,0,547,550,1,0,0,0,548,546,1,0,0,0,548,549,1,0,0,0, 549,552,1,0,0,0,550,548,1,0,0,0,551,553,5,67,0,0,552,551,1,0,0,0, - 552,553,1,0,0,0,553,554,1,0,0,0,554,555,7,4,0,0,555,65,1,0,0,0,556, + 552,553,1,0,0,0,553,554,1,0,0,0,554,555,7,5,0,0,555,65,1,0,0,0,556, 557,5,117,0,0,557,559,5,69,0,0,558,556,1,0,0,0,558,559,1,0,0,0,559, 562,1,0,0,0,560,561,5,117,0,0,561,563,5,62,0,0,562,560,1,0,0,0,562, 563,1,0,0,0,563,564,1,0,0,0,564,565,5,117,0,0,565,567,5,111,0,0, 566,568,3,126,63,0,567,566,1,0,0,0,567,568,1,0,0,0,568,569,1,0,0, 0,569,708,5,112,0,0,570,571,3,74,37,0,571,573,5,69,0,0,572,574,3, 40,20,0,573,572,1,0,0,0,573,574,1,0,0,0,574,575,1,0,0,0,575,576, - 5,45,0,0,576,579,3,108,54,0,577,578,7,6,0,0,578,580,3,84,42,0,579, + 7,2,0,0,576,579,3,108,54,0,577,578,7,7,0,0,578,580,3,84,42,0,579, 577,1,0,0,0,579,580,1,0,0,0,580,708,1,0,0,0,581,582,5,50,0,0,582, 708,3,84,42,0,583,585,3,68,34,0,584,586,3,72,36,0,585,584,1,0,0, 0,585,586,1,0,0,0,586,708,1,0,0,0,587,588,4,33,2,0,588,611,5,37, @@ -293,9 +293,9 @@ def serializedATN(): 1,0,0,0,632,633,1,0,0,0,633,635,1,0,0,0,634,625,1,0,0,0,634,635, 1,0,0,0,635,638,1,0,0,0,636,637,5,7,0,0,637,639,3,84,42,0,638,636, 1,0,0,0,638,639,1,0,0,0,639,708,1,0,0,0,640,708,3,118,59,0,641,642, - 5,8,0,0,642,708,3,80,40,0,643,656,5,7,0,0,644,646,7,7,0,0,645,644, + 5,8,0,0,642,708,3,80,40,0,643,656,5,7,0,0,644,646,7,8,0,0,645,644, 1,0,0,0,646,649,1,0,0,0,647,645,1,0,0,0,647,648,1,0,0,0,648,650, - 1,0,0,0,649,647,1,0,0,0,650,657,3,110,55,0,651,653,7,7,0,0,652,651, + 1,0,0,0,649,647,1,0,0,0,650,657,3,110,55,0,651,653,7,8,0,0,652,651, 1,0,0,0,653,654,1,0,0,0,654,652,1,0,0,0,654,655,1,0,0,0,655,657, 1,0,0,0,656,647,1,0,0,0,656,652,1,0,0,0,657,658,1,0,0,0,658,665, 5,8,0,0,659,666,5,64,0,0,660,661,5,111,0,0,661,662,3,76,38,0,662, @@ -331,7 +331,7 @@ def serializedATN(): 1,0,0,0,744,760,1,0,0,0,745,746,4,36,5,0,746,747,5,66,0,0,747,750, 3,84,42,0,748,749,5,69,0,0,749,751,3,108,54,0,750,748,1,0,0,0,750, 751,1,0,0,0,751,752,1,0,0,0,752,753,6,36,-1,0,753,760,1,0,0,0,754, - 757,7,8,0,0,755,758,3,118,59,0,756,758,3,108,54,0,757,755,1,0,0, + 757,7,9,0,0,755,758,3,118,59,0,756,758,3,108,54,0,757,755,1,0,0, 0,757,756,1,0,0,0,758,760,1,0,0,0,759,729,1,0,0,0,759,745,1,0,0, 0,759,754,1,0,0,0,760,73,1,0,0,0,761,766,3,100,50,0,762,763,5,65, 0,0,763,765,3,100,50,0,764,762,1,0,0,0,765,768,1,0,0,0,766,764,1, @@ -383,43 +383,43 @@ def serializedATN(): -1,0,910,912,5,36,0,0,911,910,1,0,0,0,911,912,1,0,0,0,912,913,1, 0,0,0,913,917,3,102,51,0,914,916,3,122,61,0,915,914,1,0,0,0,916, 919,1,0,0,0,917,915,1,0,0,0,917,918,1,0,0,0,918,923,1,0,0,0,919, - 917,1,0,0,0,920,921,7,9,0,0,921,923,3,100,50,7,922,909,1,0,0,0,922, - 920,1,0,0,0,923,947,1,0,0,0,924,925,10,8,0,0,925,926,5,68,0,0,926, - 946,3,100,50,8,927,928,10,6,0,0,928,929,7,10,0,0,929,946,3,100,50, - 7,930,931,10,5,0,0,931,932,7,11,0,0,932,946,3,100,50,6,933,934,10, - 4,0,0,934,935,7,12,0,0,935,946,3,100,50,5,936,937,10,3,0,0,937,938, - 5,72,0,0,938,946,3,100,50,4,939,940,10,2,0,0,940,941,5,71,0,0,941, - 946,3,100,50,3,942,943,10,1,0,0,943,944,5,70,0,0,944,946,3,100,50, - 2,945,924,1,0,0,0,945,927,1,0,0,0,945,930,1,0,0,0,945,933,1,0,0, - 0,945,936,1,0,0,0,945,939,1,0,0,0,945,942,1,0,0,0,946,949,1,0,0, - 0,947,945,1,0,0,0,947,948,1,0,0,0,948,101,1,0,0,0,949,947,1,0,0, - 0,950,953,5,111,0,0,951,954,3,118,59,0,952,954,3,106,53,0,953,951, - 1,0,0,0,953,952,1,0,0,0,953,954,1,0,0,0,954,955,1,0,0,0,955,981, - 5,112,0,0,956,958,5,115,0,0,957,959,3,106,53,0,958,957,1,0,0,0,958, - 959,1,0,0,0,959,960,1,0,0,0,960,981,5,116,0,0,961,963,5,113,0,0, - 962,964,3,104,52,0,963,962,1,0,0,0,963,964,1,0,0,0,964,965,1,0,0, - 0,965,981,5,114,0,0,966,981,5,63,0,0,967,981,3,112,56,0,968,981, - 5,37,0,0,969,981,5,38,0,0,970,972,5,76,0,0,971,970,1,0,0,0,971,972, - 1,0,0,0,972,973,1,0,0,0,973,981,3,114,57,0,974,981,5,20,0,0,975, - 977,5,103,0,0,976,975,1,0,0,0,977,978,1,0,0,0,978,976,1,0,0,0,978, - 979,1,0,0,0,979,981,1,0,0,0,980,950,1,0,0,0,980,956,1,0,0,0,980, - 961,1,0,0,0,980,966,1,0,0,0,980,967,1,0,0,0,980,968,1,0,0,0,980, - 969,1,0,0,0,980,971,1,0,0,0,980,974,1,0,0,0,980,976,1,0,0,0,981, - 103,1,0,0,0,982,983,3,84,42,0,983,984,5,66,0,0,984,985,3,84,42,0, - 985,989,1,0,0,0,986,987,5,68,0,0,987,989,3,100,50,0,988,982,1,0, - 0,0,988,986,1,0,0,0,989,1001,1,0,0,0,990,997,5,65,0,0,991,992,3, - 84,42,0,992,993,5,66,0,0,993,994,3,84,42,0,994,998,1,0,0,0,995,996, - 5,68,0,0,996,998,3,100,50,0,997,991,1,0,0,0,997,995,1,0,0,0,998, - 1000,1,0,0,0,999,990,1,0,0,0,1000,1003,1,0,0,0,1001,999,1,0,0,0, - 1001,1002,1,0,0,0,1002,1005,1,0,0,0,1003,1001,1,0,0,0,1004,1006, - 5,65,0,0,1005,1004,1,0,0,0,1005,1006,1,0,0,0,1006,1014,1,0,0,0,1007, - 1008,3,84,42,0,1008,1009,5,66,0,0,1009,1010,3,84,42,0,1010,1011, - 3,136,68,0,1011,1014,1,0,0,0,1012,1014,3,106,53,0,1013,988,1,0,0, - 0,1013,1007,1,0,0,0,1013,1012,1,0,0,0,1014,105,1,0,0,0,1015,1018, - 3,84,42,0,1016,1018,3,70,35,0,1017,1015,1,0,0,0,1017,1016,1,0,0, - 0,1018,1033,1,0,0,0,1019,1034,3,136,68,0,1020,1023,5,65,0,0,1021, - 1024,3,84,42,0,1022,1024,3,70,35,0,1023,1021,1,0,0,0,1023,1022,1, - 0,0,0,1024,1026,1,0,0,0,1025,1020,1,0,0,0,1026,1029,1,0,0,0,1027, + 917,1,0,0,0,920,921,7,10,0,0,921,923,3,100,50,7,922,909,1,0,0,0, + 922,920,1,0,0,0,923,947,1,0,0,0,924,925,10,8,0,0,925,926,5,68,0, + 0,926,946,3,100,50,8,927,928,10,6,0,0,928,929,7,11,0,0,929,946,3, + 100,50,7,930,931,10,5,0,0,931,932,7,12,0,0,932,946,3,100,50,6,933, + 934,10,4,0,0,934,935,7,13,0,0,935,946,3,100,50,5,936,937,10,3,0, + 0,937,938,5,72,0,0,938,946,3,100,50,4,939,940,10,2,0,0,940,941,5, + 71,0,0,941,946,3,100,50,3,942,943,10,1,0,0,943,944,5,70,0,0,944, + 946,3,100,50,2,945,924,1,0,0,0,945,927,1,0,0,0,945,930,1,0,0,0,945, + 933,1,0,0,0,945,936,1,0,0,0,945,939,1,0,0,0,945,942,1,0,0,0,946, + 949,1,0,0,0,947,945,1,0,0,0,947,948,1,0,0,0,948,101,1,0,0,0,949, + 947,1,0,0,0,950,953,5,111,0,0,951,954,3,118,59,0,952,954,3,106,53, + 0,953,951,1,0,0,0,953,952,1,0,0,0,953,954,1,0,0,0,954,955,1,0,0, + 0,955,981,5,112,0,0,956,958,5,115,0,0,957,959,3,106,53,0,958,957, + 1,0,0,0,958,959,1,0,0,0,959,960,1,0,0,0,960,981,5,116,0,0,961,963, + 5,113,0,0,962,964,3,104,52,0,963,962,1,0,0,0,963,964,1,0,0,0,964, + 965,1,0,0,0,965,981,5,114,0,0,966,981,5,63,0,0,967,981,3,112,56, + 0,968,981,5,37,0,0,969,981,5,38,0,0,970,972,5,76,0,0,971,970,1,0, + 0,0,971,972,1,0,0,0,972,973,1,0,0,0,973,981,3,114,57,0,974,981,5, + 20,0,0,975,977,5,103,0,0,976,975,1,0,0,0,977,978,1,0,0,0,978,976, + 1,0,0,0,978,979,1,0,0,0,979,981,1,0,0,0,980,950,1,0,0,0,980,956, + 1,0,0,0,980,961,1,0,0,0,980,966,1,0,0,0,980,967,1,0,0,0,980,968, + 1,0,0,0,980,969,1,0,0,0,980,971,1,0,0,0,980,974,1,0,0,0,980,976, + 1,0,0,0,981,103,1,0,0,0,982,983,3,84,42,0,983,984,5,66,0,0,984,985, + 3,84,42,0,985,989,1,0,0,0,986,987,5,68,0,0,987,989,3,100,50,0,988, + 982,1,0,0,0,988,986,1,0,0,0,989,1001,1,0,0,0,990,997,5,65,0,0,991, + 992,3,84,42,0,992,993,5,66,0,0,993,994,3,84,42,0,994,998,1,0,0,0, + 995,996,5,68,0,0,996,998,3,100,50,0,997,991,1,0,0,0,997,995,1,0, + 0,0,998,1000,1,0,0,0,999,990,1,0,0,0,1000,1003,1,0,0,0,1001,999, + 1,0,0,0,1001,1002,1,0,0,0,1002,1005,1,0,0,0,1003,1001,1,0,0,0,1004, + 1006,5,65,0,0,1005,1004,1,0,0,0,1005,1006,1,0,0,0,1006,1014,1,0, + 0,0,1007,1008,3,84,42,0,1008,1009,5,66,0,0,1009,1010,3,84,42,0,1010, + 1011,3,136,68,0,1011,1014,1,0,0,0,1012,1014,3,106,53,0,1013,988, + 1,0,0,0,1013,1007,1,0,0,0,1013,1012,1,0,0,0,1014,105,1,0,0,0,1015, + 1018,3,84,42,0,1016,1018,3,70,35,0,1017,1015,1,0,0,0,1017,1016,1, + 0,0,0,1018,1033,1,0,0,0,1019,1034,3,136,68,0,1020,1023,5,65,0,0, + 1021,1024,3,84,42,0,1022,1024,3,70,35,0,1023,1021,1,0,0,0,1023,1022, + 1,0,0,0,1024,1026,1,0,0,0,1025,1020,1,0,0,0,1026,1029,1,0,0,0,1027, 1025,1,0,0,0,1027,1028,1,0,0,0,1028,1031,1,0,0,0,1029,1027,1,0,0, 0,1030,1032,5,65,0,0,1031,1030,1,0,0,0,1031,1032,1,0,0,0,1032,1034, 1,0,0,0,1033,1019,1,0,0,0,1033,1027,1,0,0,0,1034,107,1,0,0,0,1035, @@ -430,9 +430,9 @@ def serializedATN(): 1048,3,112,56,0,1048,1054,1,0,0,0,1049,1050,10,2,0,0,1050,1051,5, 62,0,0,1051,1053,3,112,56,0,1052,1049,1,0,0,0,1053,1056,1,0,0,0, 1054,1052,1,0,0,0,1054,1055,1,0,0,0,1055,111,1,0,0,0,1056,1054,1, - 0,0,0,1057,1058,7,13,0,0,1058,113,1,0,0,0,1059,1063,3,116,58,0,1060, + 0,0,0,1057,1058,7,14,0,0,1058,113,1,0,0,0,1059,1063,3,116,58,0,1060, 1063,5,109,0,0,1061,1063,5,110,0,0,1062,1059,1,0,0,0,1062,1060,1, - 0,0,0,1062,1061,1,0,0,0,1063,115,1,0,0,0,1064,1065,7,14,0,0,1065, + 0,0,0,1062,1061,1,0,0,0,1063,115,1,0,0,0,1064,1065,7,15,0,0,1065, 117,1,0,0,0,1066,1068,5,30,0,0,1067,1069,3,120,60,0,1068,1067,1, 0,0,0,1068,1069,1,0,0,0,1069,119,1,0,0,0,1070,1071,5,7,0,0,1071, 1074,3,84,42,0,1072,1074,3,108,54,0,1073,1070,1,0,0,0,1073,1072, @@ -449,7 +449,7 @@ def serializedATN(): 1,0,0,0,1103,1104,1,0,0,0,1104,127,1,0,0,0,1105,1109,3,84,42,0,1106, 1110,3,136,68,0,1107,1108,5,69,0,0,1108,1110,3,84,42,0,1109,1106, 1,0,0,0,1109,1107,1,0,0,0,1109,1110,1,0,0,0,1110,1114,1,0,0,0,1111, - 1112,7,15,0,0,1112,1114,3,84,42,0,1113,1105,1,0,0,0,1113,1111,1, + 1112,7,16,0,0,1112,1114,3,84,42,0,1113,1105,1,0,0,0,1113,1111,1, 0,0,0,1114,129,1,0,0,0,1115,1120,3,132,66,0,1116,1117,5,65,0,0,1117, 1119,3,132,66,0,1118,1116,1,0,0,0,1119,1122,1,0,0,0,1120,1118,1, 0,0,0,1120,1121,1,0,0,0,1121,1124,1,0,0,0,1122,1120,1,0,0,0,1123, @@ -753,7 +753,7 @@ class FizzParser ( PythonParserBase ): def __init__(self, input:TokenStream, output:TextIO = sys.stdout): super().__init__(input, output) - self.checkVersion("4.13.1") + self.checkVersion("4.13.2") self._interp = ParserATNSimulator(self, self.atn, self.decisionsToDFA, self.sharedContextCache) self._predicates = None @@ -1463,8 +1463,6 @@ def __init__(self, parser, ctx:ParserRuleContext): # actually a FizzParser.Compo super().__init__(parser) self.copyFrom(ctx) - def ANY(self): - return self.getToken(FizzParser.ANY, 0) def exprlist(self): return self.getTypedRuleContext(FizzParser.ExprlistContext,0) @@ -1478,6 +1476,10 @@ def COLON(self): def suite(self): return self.getTypedRuleContext(FizzParser.SuiteContext,0) + def ANY(self): + return self.getToken(FizzParser.ANY, 0) + def ONEOF(self): + return self.getToken(FizzParser.ONEOF, 0) def fairness(self): return self.getTypedRuleContext(FizzParser.FairnessContext,0) @@ -1981,7 +1983,12 @@ def compound_stmt(self): self.state = 261 - self.match(FizzParser.ANY) + _la = self._input.LA(1) + if not(_la==44 or _la==45): + self._errHandler.recoverInline(self) + else: + self._errHandler.reportMatch(self) + self.consume() self.state = 262 self.exprlist() self.state = 263 @@ -4779,11 +4786,13 @@ def exprlist(self): def ASSIGN(self): return self.getToken(FizzParser.ASSIGN, 0) - def ANY(self): - return self.getToken(FizzParser.ANY, 0) def testlist(self): return self.getTypedRuleContext(FizzParser.TestlistContext,0) + def ANY(self): + return self.getToken(FizzParser.ANY, 0) + def ONEOF(self): + return self.getToken(FizzParser.ONEOF, 0) def fairness(self): return self.getTypedRuleContext(FizzParser.FairnessContext,0) @@ -4990,7 +4999,12 @@ def small_stmt(self): self.state = 575 - self.match(FizzParser.ANY) + _la = self._input.LA(1) + if not(_la==44 or _la==45): + self._errHandler.recoverInline(self) + else: + self._errHandler.reportMatch(self) + self.consume() self.state = 576 self.testlist() self.state = 579 diff --git a/parser/FizzParserListener.py b/parser/FizzParserListener.py index 28859d1..1f27f22 100644 --- a/parser/FizzParserListener.py +++ b/parser/FizzParserListener.py @@ -1,4 +1,4 @@ -# Generated from FizzParser.g4 by ANTLR 4.13.1 +# Generated from FizzParser.g4 by ANTLR 4.13.2 from antlr4 import * if "." in __name__: from .FizzParser import FizzParser diff --git a/parser/FizzParserVisitor.py b/parser/FizzParserVisitor.py index 1408970..d84aa5e 100644 --- a/parser/FizzParserVisitor.py +++ b/parser/FizzParserVisitor.py @@ -1,4 +1,4 @@ -# Generated from FizzParser.g4 by ANTLR 4.13.1 +# Generated from FizzParser.g4 by ANTLR 4.13.2 from antlr4 import * if "." in __name__: from .FizzParser import FizzParser