From 656ba6e84a18b91e8a70fefdc49a19eadee30bec Mon Sep 17 00:00:00 2001 From: Yanju Chen Date: Mon, 4 Mar 2024 19:08:10 -0800 Subject: [PATCH] support more grammar and basic cli --- .github/workflows/dev.yml | 40 +- README.md | 1 + pyproject.toml | 11 +- tests/scripts/dep.py | 1 + vanguard/aleo/common.py | 21 +- vanguard/aleo/grammar/instructions.py | 77 +- vanguard/aleo/grammar/misc.py | 2 + vanguard/aleo/graphs.py | 4 + vanguard/aleo/parser/AleoParser.g4 | 2 +- vanguard/aleo/parser/AleoParser.interp | 2 +- vanguard/aleo/parser/AleoParser.py | 1346 ++++++++++++------------ vanguard/aleo/run.py | 46 + 12 files changed, 839 insertions(+), 714 deletions(-) create mode 100644 vanguard/aleo/run.py diff --git a/.github/workflows/dev.yml b/.github/workflows/dev.yml index d9a22b5..82d76c0 100644 --- a/.github/workflows/dev.yml +++ b/.github/workflows/dev.yml @@ -2,9 +2,9 @@ name: Dev CI on: push: - branches: [ "main", "dev" ] + branches: [ "main", "yanju/dev" ] pull_request: - branches: [ "main", "dev" ] + branches: [ "main", "yanju/dev" ] workflow_dispatch: jobs: @@ -17,11 +17,7 @@ jobs: python-version: '3.12' - name: install dependencies run: | - pip install networkx[default] - pip install beautifulsoup4 - pip install pandas - pip install antlr4-tools - pip install antlr4-python3-runtime==4.13.1 + pip install . antlr4 -v 4.13.1 - name: test hello.py run: python tests/scripts/hello.py @@ -37,11 +33,7 @@ jobs: python-version: '3.12' - name: install dependencies run: | - pip install networkx[default] - pip install beautifulsoup4 - pip install pandas - pip install antlr4-tools - pip install antlr4-python3-runtime==4.13.1 + pip install . antlr4 -v 4.13.1 - name: test parsing.py run: PYTHONPATH="./" python ./tests/scripts/parsing.py @@ -55,11 +47,7 @@ jobs: python-version: '3.12' - name: install dependencies run: | - pip install networkx[default] - pip install beautifulsoup4 - pip install pandas - pip install antlr4-tools - pip install antlr4-python3-runtime==4.13.1 + pip install . antlr4 -v 4.13.1 - name: test divz run: PYTHONPATH="./" python ./tests/scripts/test-divz.py @@ -73,11 +61,7 @@ jobs: python-version: '3.12' - name: install dependencies run: | - pip install networkx[default] - pip install beautifulsoup4 - pip install pandas - pip install antlr4-tools - pip install antlr4-python3-runtime==4.13.1 + pip install . antlr4 -v 4.13.1 - name: test infoleak run: PYTHONPATH="./" python ./tests/scripts/test-infoleak.py @@ -91,11 +75,7 @@ jobs: python-version: '3.12' - name: install dependencies run: | - pip install networkx[default] - pip install beautifulsoup4 - pip install pandas - pip install antlr4-tools - pip install antlr4-python3-runtime==4.13.1 + pip install . antlr4 -v 4.13.1 - name: test rtcnst run: PYTHONPATH="./" python ./tests/scripts/test-rtcnst.py @@ -109,11 +89,7 @@ jobs: python-version: '3.12' - name: install dependencies run: | - pip install networkx[default] - pip install beautifulsoup4 - pip install pandas - pip install antlr4-tools - pip install antlr4-python3-runtime==4.13.1 + pip install . antlr4 -v 4.13.1 - name: test unused run: PYTHONPATH="./" python ./tests/scripts/test-unused.py \ No newline at end of file diff --git a/README.md b/README.md index f803b49..6d23f62 100644 --- a/README.md +++ b/README.md @@ -13,6 +13,7 @@ The following libraries are required for running (different components of) the t - `pip install antlr4-tools` - [Beautiful Soup](https://www.crummy.com/software/BeautifulSoup/) (4.12.2+) for crawling benchmarks from public explorers in test suite - [pandas](https://pandas.pydata.org/) (2.1.4+) for data analysis in test suite + - [tabulate](https://github.com/astanin/python-tabulate) (0.9.0+) for result table rendering - Leo (**7ac50d8**) for compiling and running all benchmarks enclosed - The tools is tested under this version, but newer version of Lao may also work. diff --git a/pyproject.toml b/pyproject.toml index bb7ea75..f85fa3a 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "vanguard" -version = "0.0.2" +version = "0.0.3" authors = [ { name="Yanju Chen", email="yanju@veridise.com" }, ] @@ -18,8 +18,13 @@ dependencies = [ "beautifulsoup4>=4.12.2", "antlr4-python3-runtime==4.13.1", "pandas>=2.1.4", + "tabulate>=0.9.0", "antlr4-tools", ] -[project.urls] -"Homepage" = "https://veridise.com/" \ No newline at end of file +[build-system] +requires = ["setuptools>=61.0"] +build-backend = "setuptools.build_meta" + +[project.scripts] +vanguard-aleo = "vanguard.aleo.run:run" \ No newline at end of file diff --git a/tests/scripts/dep.py b/tests/scripts/dep.py index f5cc78e..a4899fd 100644 --- a/tests/scripts/dep.py +++ b/tests/scripts/dep.py @@ -2,6 +2,7 @@ import bs4 import pandas import antlr4 +import tabulate if __name__ == "__main__": print("Hello World!") \ No newline at end of file diff --git a/vanguard/aleo/common.py b/vanguard/aleo/common.py index 4b7f7ff..dcb1826 100644 --- a/vanguard/aleo/common.py +++ b/vanguard/aleo/common.py @@ -1,4 +1,3 @@ -from io import StringIO from pathlib import Path from typing import List, Union @@ -33,3 +32,23 @@ def aleo2json(path: Union[str, Path]): parser = AleoParser(stream) tree = parser.start() return Trees.toJsonTree(tree, None, parser) + +def detect(build_path: Union[str, Path], pid: str=None, fids: List=None, detector: str=None, **kwargs): + # pid (default: main program of environment) - program id + # fids (default: all functions of selected program) - list of function ids + # detector (default: infoleak) - detector to use + + # NOTE: for clarity, only one detector can be used in each call + + from .grammar import AleoEnvironment + from . import detectors as dlib + + env = AleoEnvironment(build_path) + _detector = getattr(dlib, "detector_infoleak") if detector is None else getattr(dlib, f"detector_{detector}") + + prog = env.main if pid is None else env.programs[pid] + funcs = list(prog.functions.values()) if fids is None else [prog.functions[p] for p in fids] + + # start detection + ret = [ (str(prog.id), str(fn.id)) + _detector(env, prog.id, fn.id, **kwargs) for fn in funcs ] + return ret diff --git a/vanguard/aleo/grammar/instructions.py b/vanguard/aleo/grammar/instructions.py index e581de7..52ece8c 100644 --- a/vanguard/aleo/grammar/instructions.py +++ b/vanguard/aleo/grammar/instructions.py @@ -14,6 +14,12 @@ def from_json(node): return AleoSet.from_json(node[1]) case ["command", ["random", *_]]: return AleoRandom.from_json(node[1]) + case ["command", ["contains", *_]]: + return AleoContains.from_json(node[1]) + case ["command", ["get", *_]]: + return AleoGet.from_json(node[1]) + case ["command", ["get_or_use", *_]]: + return AleoGetOrUse.from_json(node[1]) case _: raise NotImplementedError(f"Unsupported json component, got: {node}") @@ -52,7 +58,7 @@ class AleoRandom(AleoCommand): @staticmethod def from_json(node): match node: - case ["random", ["random_op", "rand", ".", "chacha"], *operands, "into", regacc, "as", type, ";"]: + case ["random", ["random_op", *_], *operands, "into", regacc, "as", type, ";"]: _operands = [AleoOperand.from_json(p) for p in operands] _regacc = AleoRegisterAccess.from_json(regacc) _type = None @@ -80,6 +86,73 @@ def __init__(self, operands, regacc, type, **kwargs): def __str__(self): _operands = " ".join([str(p) for p in self.operands]) return f"random.chacha {_operands} into {self.regacc} as {self.type};" + +class AleoContains(AleoCommand): + + @staticmethod + def from_json(node): + match node: + case ["contains", "contains", id, "[", operand, "]", "into", regacc, ";"]: + _id = AleoIdentifier.from_json(id) + _operand = AleoOperand.from_json(operand) + _regacc = AleoRegisterAccess.from_json(regacc) + return AleoContains(_id, _operand, _regacc) + case _: + raise NotImplementedError(f"Unsupported json component, got: {node}") + + def __init__(self, id, operand, regacc, **kwargs): + super().__init__(**kwargs) + self.id = id + self.operand = operand + self.regacc = regacc + + def __str__(self): + return f"contains {self.id}[{self.operand}] into {self.regacc};" + +class AleoGet(AleoCommand): + + @staticmethod + def from_json(node): + match node: + case ["get", "get", id, "[", operand, "]", "into", regacc, ";"]: + _id = AleoIdentifier.from_json(id) + _operand = AleoOperand.from_json(operand) + _regacc = AleoRegisterAccess.from_json(regacc) + return AleoGet(_id, _operand, _regacc) + case _: + raise NotImplementedError(f"Unsupported json component, got: {node}") + + def __init__(self, id, operand, regacc, **kwargs): + super().__init__(**kwargs) + self.id = id + self.operand = operand + self.regacc = regacc + + def __str__(self): + return f"get {self.id} [{self.operand}] into {self.regacc};" + +class AleoGetOrUse(AleoCommand): + + @staticmethod + def from_json(node): + match node: + case ["get_or_use", ["get_or_use_op", *_], id, "[", operand, "]", default, "into", regacc, ";"]: + _id = AleoIdentifier.from_json(id) + _operand = AleoOperand.from_json(operand) + _default = AleoOperand.from_json(default) + _regacc = AleoRegisterAccess.from_json(regacc) + return AleoGetOrUse(_id, _operand, _default, _regacc) + case _: + raise NotImplementedError(f"Unsupported json component, got: {node}") + + def __init__(self, id, operand, default, regacc): + self.id = id + self.operand = operand + self.default = default + self.regacc = regacc + + def __str__(self): + return f"get.or_use {self.id}[{self.operand}] {self.default} into {self.regacc};" class AleoInstruction(AleoCommand): @@ -378,4 +451,4 @@ def __init__(self, op, operand, regacc, type, **kwargs): self.type = type def __str__(self): - return f"{self.op} {self.operand} into {self.regacc} as {self.type}" \ No newline at end of file + return f"{self.op} {self.operand} into {self.regacc} as {self.type}" diff --git a/vanguard/aleo/grammar/misc.py b/vanguard/aleo/grammar/misc.py index 438630d..26b8e07 100644 --- a/vanguard/aleo/grammar/misc.py +++ b/vanguard/aleo/grammar/misc.py @@ -269,6 +269,8 @@ def from_json(node): return AleoLiteral.from_json(node[1]) case ["operand", ["register_access", *_]]: return AleoRegisterAccess.from_json(node[1]) + case ["operand", ["program_id", *_]]: + return AleoProgramId.from_json(node[1]) case _: raise NotImplementedError(f"Unsupported json component, got: {node}") diff --git a/vanguard/aleo/graphs.py b/vanguard/aleo/graphs.py index 83f8f09..4c0d906 100644 --- a/vanguard/aleo/graphs.py +++ b/vanguard/aleo/graphs.py @@ -66,6 +66,10 @@ def get_dfg_edges(env: AleoEnvironment, pid: str, fid: str, hash=True, call=Fals # only consider non-literal edges.append((p, inst.regacc)) + case AleoAssert(): + # no data flow + pass + case _: raise NotImplementedError(f"Unsupported instruction, got: {inst}, type: {type(inst)}") diff --git a/vanguard/aleo/parser/AleoParser.g4 b/vanguard/aleo/parser/AleoParser.g4 index 16d073f..76fa5b6 100644 --- a/vanguard/aleo/parser/AleoParser.g4 +++ b/vanguard/aleo/parser/AleoParser.g4 @@ -19,7 +19,7 @@ closure_output : OUTPUT operand AS register_type SC ; function : FUNCTION identifier CL function_input* instruction* function_output* finalize? ; function_input : INPUT register AS value_type SC ; function_output : OUTPUT operand AS value_type SC ; -finalize : FINALIZE identifier CL finalize_input* command+ ; +finalize : FINALIZE identifier CL finalize_input* command* ; finalize_input : INPUT register AS finalize_type SC ; // instructions diff --git a/vanguard/aleo/parser/AleoParser.interp b/vanguard/aleo/parser/AleoParser.interp index 41366a6..e4c9235 100644 --- a/vanguard/aleo/parser/AleoParser.interp +++ b/vanguard/aleo/parser/AleoParser.interp @@ -345,4 +345,4 @@ identifier atn: -[4, 1, 119, 895, 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, 2, 70, 7, 70, 2, 71, 7, 71, 2, 72, 7, 72, 2, 73, 7, 73, 2, 74, 7, 74, 2, 75, 7, 75, 2, 76, 7, 76, 2, 77, 7, 77, 2, 78, 7, 78, 2, 79, 7, 79, 2, 80, 7, 80, 2, 81, 7, 81, 2, 82, 7, 82, 2, 83, 7, 83, 2, 84, 7, 84, 2, 85, 7, 85, 2, 86, 7, 86, 2, 87, 7, 87, 2, 88, 7, 88, 2, 89, 7, 89, 2, 90, 7, 90, 2, 91, 7, 91, 2, 92, 7, 92, 2, 93, 7, 93, 2, 94, 7, 94, 2, 95, 7, 95, 2, 96, 7, 96, 2, 97, 7, 97, 2, 98, 7, 98, 1, 0, 1, 0, 1, 1, 5, 1, 202, 8, 1, 10, 1, 12, 1, 205, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 4, 1, 215, 8, 1, 11, 1, 12, 1, 216, 1, 2, 1, 2, 1, 2, 1, 2, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 6, 1, 6, 1, 6, 1, 6, 4, 6, 243, 8, 6, 11, 6, 12, 6, 244, 1, 7, 1, 7, 1, 7, 1, 7, 5, 7, 251, 8, 7, 10, 7, 12, 7, 254, 9, 7, 1, 8, 1, 8, 1, 8, 1, 8, 5, 8, 260, 8, 8, 10, 8, 12, 8, 263, 9, 8, 1, 8, 4, 8, 266, 8, 8, 11, 8, 12, 8, 267, 1, 8, 5, 8, 271, 8, 8, 10, 8, 12, 8, 274, 9, 8, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 11, 1, 11, 1, 11, 1, 11, 5, 11, 292, 8, 11, 10, 11, 12, 11, 295, 9, 11, 1, 11, 5, 11, 298, 8, 11, 10, 11, 12, 11, 301, 9, 11, 1, 11, 5, 11, 304, 8, 11, 10, 11, 12, 11, 307, 9, 11, 1, 11, 3, 11, 310, 8, 11, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 14, 1, 14, 1, 14, 1, 14, 5, 14, 328, 8, 14, 10, 14, 12, 14, 331, 9, 14, 1, 14, 4, 14, 334, 8, 14, 11, 14, 12, 14, 335, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 3, 16, 354, 8, 16, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 22, 1, 22, 5, 22, 402, 8, 22, 10, 22, 12, 22, 405, 9, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 3, 22, 414, 8, 22, 1, 22, 1, 22, 1, 23, 1, 23, 1, 23, 1, 23, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 25, 1, 25, 1, 25, 1, 25, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 3, 26, 444, 8, 26, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 3, 32, 488, 8, 32, 1, 32, 1, 32, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 3, 33, 502, 8, 33, 1, 33, 1, 33, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 3, 34, 517, 8, 34, 1, 34, 1, 34, 1, 35, 1, 35, 3, 35, 523, 8, 35, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 37, 1, 37, 4, 37, 535, 8, 37, 11, 37, 12, 37, 536, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 38, 1, 38, 1, 38, 3, 38, 548, 8, 38, 1, 38, 5, 38, 551, 8, 38, 10, 38, 12, 38, 554, 9, 38, 1, 38, 1, 38, 4, 38, 558, 8, 38, 11, 38, 12, 38, 559, 3, 38, 562, 8, 38, 1, 38, 1, 38, 1, 39, 1, 39, 1, 39, 5, 39, 569, 8, 39, 10, 39, 12, 39, 572, 9, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 40, 1, 40, 1, 40, 1, 40, 3, 40, 582, 8, 40, 1, 41, 3, 41, 585, 8, 41, 1, 41, 1, 41, 1, 41, 1, 42, 3, 42, 591, 8, 42, 1, 42, 1, 42, 1, 42, 1, 43, 1, 43, 3, 43, 598, 8, 43, 1, 44, 3, 44, 601, 8, 44, 1, 44, 1, 44, 1, 44, 1, 45, 3, 45, 607, 8, 45, 1, 45, 1, 45, 1, 45, 1, 46, 3, 46, 613, 8, 46, 1, 46, 1, 46, 1, 46, 1, 47, 1, 47, 1, 47, 1, 47, 3, 47, 622, 8, 47, 1, 48, 1, 48, 1, 49, 1, 49, 1, 50, 1, 50, 1, 51, 1, 51, 1, 52, 1, 52, 1, 53, 1, 53, 3, 53, 636, 8, 53, 1, 54, 1, 54, 1, 55, 1, 55, 1, 56, 1, 56, 1, 57, 1, 57, 1, 57, 1, 57, 3, 57, 648, 8, 57, 1, 58, 1, 58, 1, 59, 1, 59, 1, 60, 1, 60, 1, 61, 1, 61, 1, 61, 1, 61, 3, 61, 660, 8, 61, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 63, 1, 63, 1, 63, 3, 63, 671, 8, 63, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 3, 64, 682, 8, 64, 1, 65, 1, 65, 1, 65, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 3, 66, 693, 8, 66, 1, 67, 1, 67, 1, 67, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 3, 68, 705, 8, 68, 1, 69, 1, 69, 1, 69, 1, 70, 1, 70, 1, 70, 1, 70, 1, 71, 1, 71, 1, 72, 1, 72, 1, 73, 1, 73, 1, 74, 1, 74, 5, 74, 722, 8, 74, 10, 74, 12, 74, 725, 9, 74, 1, 75, 1, 75, 3, 75, 729, 8, 75, 1, 76, 1, 76, 1, 76, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 3, 77, 741, 8, 77, 1, 78, 1, 78, 1, 78, 1, 78, 3, 78, 747, 8, 78, 1, 79, 1, 79, 1, 79, 1, 79, 1, 79, 1, 79, 1, 79, 1, 79, 1, 79, 3, 79, 758, 8, 79, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 82, 1, 82, 1, 82, 1, 82, 1, 83, 1, 83, 1, 83, 3, 83, 777, 8, 83, 1, 84, 1, 84, 1, 84, 1, 84, 1, 85, 1, 85, 1, 85, 3, 85, 786, 8, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 3, 85, 794, 8, 85, 1, 86, 1, 86, 1, 86, 3, 86, 799, 8, 86, 1, 86, 1, 86, 1, 86, 3, 86, 804, 8, 86, 1, 86, 1, 86, 1, 86, 3, 86, 809, 8, 86, 1, 86, 1, 86, 1, 86, 3, 86, 814, 8, 86, 1, 86, 1, 86, 1, 86, 3, 86, 819, 8, 86, 1, 86, 1, 86, 1, 86, 3, 86, 824, 8, 86, 1, 86, 1, 86, 1, 86, 3, 86, 829, 8, 86, 1, 86, 1, 86, 1, 86, 3, 86, 834, 8, 86, 1, 86, 1, 86, 1, 86, 1, 86, 1, 86, 1, 86, 1, 86, 1, 86, 1, 86, 1, 86, 3, 86, 846, 8, 86, 1, 87, 1, 87, 1, 87, 1, 87, 1, 88, 1, 88, 1, 88, 1, 88, 1, 89, 1, 89, 1, 89, 1, 89, 1, 90, 1, 90, 1, 90, 1, 90, 1, 91, 1, 91, 1, 91, 1, 91, 1, 92, 1, 92, 1, 92, 3, 92, 871, 8, 92, 1, 93, 1, 93, 1, 93, 1, 93, 1, 94, 1, 94, 1, 94, 1, 94, 1, 95, 1, 95, 1, 95, 1, 95, 1, 96, 1, 96, 1, 96, 1, 96, 3, 96, 889, 8, 96, 1, 97, 1, 97, 1, 98, 1, 98, 1, 98, 0, 0, 99, 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, 140, 142, 144, 146, 148, 150, 152, 154, 156, 158, 160, 162, 164, 166, 168, 170, 172, 174, 176, 178, 180, 182, 184, 186, 188, 190, 192, 194, 196, 0, 9, 1, 0, 103, 104, 1, 0, 12, 16, 1, 0, 20, 21, 1, 0, 25, 26, 1, 0, 68, 69, 1, 0, 74, 79, 1, 0, 74, 88, 1, 0, 80, 82, 2, 0, 9, 113, 115, 116, 922, 0, 198, 1, 0, 0, 0, 2, 203, 1, 0, 0, 0, 4, 218, 1, 0, 0, 0, 6, 222, 1, 0, 0, 0, 8, 228, 1, 0, 0, 0, 10, 233, 1, 0, 0, 0, 12, 238, 1, 0, 0, 0, 14, 246, 1, 0, 0, 0, 16, 255, 1, 0, 0, 0, 18, 275, 1, 0, 0, 0, 20, 281, 1, 0, 0, 0, 22, 287, 1, 0, 0, 0, 24, 311, 1, 0, 0, 0, 26, 317, 1, 0, 0, 0, 28, 323, 1, 0, 0, 0, 30, 337, 1, 0, 0, 0, 32, 353, 1, 0, 0, 0, 34, 355, 1, 0, 0, 0, 36, 364, 1, 0, 0, 0, 38, 373, 1, 0, 0, 0, 40, 383, 1, 0, 0, 0, 42, 392, 1, 0, 0, 0, 44, 399, 1, 0, 0, 0, 46, 417, 1, 0, 0, 0, 48, 421, 1, 0, 0, 0, 50, 428, 1, 0, 0, 0, 52, 443, 1, 0, 0, 0, 54, 445, 1, 0, 0, 0, 56, 451, 1, 0, 0, 0, 58, 458, 1, 0, 0, 0, 60, 466, 1, 0, 0, 0, 62, 473, 1, 0, 0, 0, 64, 478, 1, 0, 0, 0, 66, 491, 1, 0, 0, 0, 68, 505, 1, 0, 0, 0, 70, 522, 1, 0, 0, 0, 72, 524, 1, 0, 0, 0, 74, 532, 1, 0, 0, 0, 76, 544, 1, 0, 0, 0, 78, 565, 1, 0, 0, 0, 80, 581, 1, 0, 0, 0, 82, 584, 1, 0, 0, 0, 84, 590, 1, 0, 0, 0, 86, 597, 1, 0, 0, 0, 88, 600, 1, 0, 0, 0, 90, 606, 1, 0, 0, 0, 92, 612, 1, 0, 0, 0, 94, 621, 1, 0, 0, 0, 96, 623, 1, 0, 0, 0, 98, 625, 1, 0, 0, 0, 100, 627, 1, 0, 0, 0, 102, 629, 1, 0, 0, 0, 104, 631, 1, 0, 0, 0, 106, 635, 1, 0, 0, 0, 108, 637, 1, 0, 0, 0, 110, 639, 1, 0, 0, 0, 112, 641, 1, 0, 0, 0, 114, 647, 1, 0, 0, 0, 116, 649, 1, 0, 0, 0, 118, 651, 1, 0, 0, 0, 120, 653, 1, 0, 0, 0, 122, 659, 1, 0, 0, 0, 124, 661, 1, 0, 0, 0, 126, 670, 1, 0, 0, 0, 128, 681, 1, 0, 0, 0, 130, 683, 1, 0, 0, 0, 132, 692, 1, 0, 0, 0, 134, 694, 1, 0, 0, 0, 136, 704, 1, 0, 0, 0, 138, 706, 1, 0, 0, 0, 140, 709, 1, 0, 0, 0, 142, 713, 1, 0, 0, 0, 144, 715, 1, 0, 0, 0, 146, 717, 1, 0, 0, 0, 148, 719, 1, 0, 0, 0, 150, 728, 1, 0, 0, 0, 152, 730, 1, 0, 0, 0, 154, 740, 1, 0, 0, 0, 156, 746, 1, 0, 0, 0, 158, 757, 1, 0, 0, 0, 160, 759, 1, 0, 0, 0, 162, 764, 1, 0, 0, 0, 164, 769, 1, 0, 0, 0, 166, 776, 1, 0, 0, 0, 168, 778, 1, 0, 0, 0, 170, 793, 1, 0, 0, 0, 172, 845, 1, 0, 0, 0, 174, 847, 1, 0, 0, 0, 176, 851, 1, 0, 0, 0, 178, 855, 1, 0, 0, 0, 180, 859, 1, 0, 0, 0, 182, 863, 1, 0, 0, 0, 184, 867, 1, 0, 0, 0, 186, 872, 1, 0, 0, 0, 188, 876, 1, 0, 0, 0, 190, 880, 1, 0, 0, 0, 192, 888, 1, 0, 0, 0, 194, 890, 1, 0, 0, 0, 196, 892, 1, 0, 0, 0, 198, 199, 3, 2, 1, 0, 199, 1, 1, 0, 0, 0, 200, 202, 3, 4, 2, 0, 201, 200, 1, 0, 0, 0, 202, 205, 1, 0, 0, 0, 203, 201, 1, 0, 0, 0, 203, 204, 1, 0, 0, 0, 204, 206, 1, 0, 0, 0, 205, 203, 1, 0, 0, 0, 206, 207, 5, 92, 0, 0, 207, 208, 3, 140, 70, 0, 208, 214, 5, 5, 0, 0, 209, 215, 3, 6, 3, 0, 210, 215, 3, 12, 6, 0, 211, 215, 3, 14, 7, 0, 212, 215, 3, 16, 8, 0, 213, 215, 3, 22, 11, 0, 214, 209, 1, 0, 0, 0, 214, 210, 1, 0, 0, 0, 214, 211, 1, 0, 0, 0, 214, 212, 1, 0, 0, 0, 214, 213, 1, 0, 0, 0, 215, 216, 1, 0, 0, 0, 216, 214, 1, 0, 0, 0, 216, 217, 1, 0, 0, 0, 217, 3, 1, 0, 0, 0, 218, 219, 5, 93, 0, 0, 219, 220, 3, 140, 70, 0, 220, 221, 5, 5, 0, 0, 221, 5, 1, 0, 0, 0, 222, 223, 5, 94, 0, 0, 223, 224, 3, 196, 98, 0, 224, 225, 5, 7, 0, 0, 225, 226, 3, 8, 4, 0, 226, 227, 3, 10, 5, 0, 227, 7, 1, 0, 0, 0, 228, 229, 5, 95, 0, 0, 229, 230, 5, 9, 0, 0, 230, 231, 3, 130, 65, 0, 231, 232, 5, 5, 0, 0, 232, 9, 1, 0, 0, 0, 233, 234, 5, 96, 0, 0, 234, 235, 5, 9, 0, 0, 235, 236, 3, 130, 65, 0, 236, 237, 5, 5, 0, 0, 237, 11, 1, 0, 0, 0, 238, 239, 5, 97, 0, 0, 239, 240, 3, 196, 98, 0, 240, 242, 5, 7, 0, 0, 241, 243, 3, 160, 80, 0, 242, 241, 1, 0, 0, 0, 243, 244, 1, 0, 0, 0, 244, 242, 1, 0, 0, 0, 244, 245, 1, 0, 0, 0, 245, 13, 1, 0, 0, 0, 246, 247, 5, 16, 0, 0, 247, 248, 3, 196, 98, 0, 248, 252, 5, 7, 0, 0, 249, 251, 3, 162, 81, 0, 250, 249, 1, 0, 0, 0, 251, 254, 1, 0, 0, 0, 252, 250, 1, 0, 0, 0, 252, 253, 1, 0, 0, 0, 253, 15, 1, 0, 0, 0, 254, 252, 1, 0, 0, 0, 255, 256, 5, 98, 0, 0, 256, 257, 3, 196, 98, 0, 257, 261, 5, 7, 0, 0, 258, 260, 3, 18, 9, 0, 259, 258, 1, 0, 0, 0, 260, 263, 1, 0, 0, 0, 261, 259, 1, 0, 0, 0, 261, 262, 1, 0, 0, 0, 262, 265, 1, 0, 0, 0, 263, 261, 1, 0, 0, 0, 264, 266, 3, 52, 26, 0, 265, 264, 1, 0, 0, 0, 266, 267, 1, 0, 0, 0, 267, 265, 1, 0, 0, 0, 267, 268, 1, 0, 0, 0, 268, 272, 1, 0, 0, 0, 269, 271, 3, 20, 10, 0, 270, 269, 1, 0, 0, 0, 271, 274, 1, 0, 0, 0, 272, 270, 1, 0, 0, 0, 272, 273, 1, 0, 0, 0, 273, 17, 1, 0, 0, 0, 274, 272, 1, 0, 0, 0, 275, 276, 5, 99, 0, 0, 276, 277, 3, 146, 73, 0, 277, 278, 5, 9, 0, 0, 278, 279, 3, 136, 68, 0, 279, 280, 5, 5, 0, 0, 280, 19, 1, 0, 0, 0, 281, 282, 5, 100, 0, 0, 282, 283, 3, 156, 78, 0, 283, 284, 5, 9, 0, 0, 284, 285, 3, 136, 68, 0, 285, 286, 5, 5, 0, 0, 286, 21, 1, 0, 0, 0, 287, 288, 5, 101, 0, 0, 288, 289, 3, 196, 98, 0, 289, 293, 5, 7, 0, 0, 290, 292, 3, 24, 12, 0, 291, 290, 1, 0, 0, 0, 292, 295, 1, 0, 0, 0, 293, 291, 1, 0, 0, 0, 293, 294, 1, 0, 0, 0, 294, 299, 1, 0, 0, 0, 295, 293, 1, 0, 0, 0, 296, 298, 3, 52, 26, 0, 297, 296, 1, 0, 0, 0, 298, 301, 1, 0, 0, 0, 299, 297, 1, 0, 0, 0, 299, 300, 1, 0, 0, 0, 300, 305, 1, 0, 0, 0, 301, 299, 1, 0, 0, 0, 302, 304, 3, 26, 13, 0, 303, 302, 1, 0, 0, 0, 304, 307, 1, 0, 0, 0, 305, 303, 1, 0, 0, 0, 305, 306, 1, 0, 0, 0, 306, 309, 1, 0, 0, 0, 307, 305, 1, 0, 0, 0, 308, 310, 3, 28, 14, 0, 309, 308, 1, 0, 0, 0, 309, 310, 1, 0, 0, 0, 310, 23, 1, 0, 0, 0, 311, 312, 5, 99, 0, 0, 312, 313, 3, 146, 73, 0, 313, 314, 5, 9, 0, 0, 314, 315, 3, 128, 64, 0, 315, 316, 5, 5, 0, 0, 316, 25, 1, 0, 0, 0, 317, 318, 5, 100, 0, 0, 318, 319, 3, 156, 78, 0, 319, 320, 5, 9, 0, 0, 320, 321, 3, 128, 64, 0, 321, 322, 5, 5, 0, 0, 322, 27, 1, 0, 0, 0, 323, 324, 5, 102, 0, 0, 324, 325, 3, 196, 98, 0, 325, 329, 5, 7, 0, 0, 326, 328, 3, 30, 15, 0, 327, 326, 1, 0, 0, 0, 328, 331, 1, 0, 0, 0, 329, 327, 1, 0, 0, 0, 329, 330, 1, 0, 0, 0, 330, 333, 1, 0, 0, 0, 331, 329, 1, 0, 0, 0, 332, 334, 3, 32, 16, 0, 333, 332, 1, 0, 0, 0, 334, 335, 1, 0, 0, 0, 335, 333, 1, 0, 0, 0, 335, 336, 1, 0, 0, 0, 336, 29, 1, 0, 0, 0, 337, 338, 5, 99, 0, 0, 338, 339, 3, 146, 73, 0, 339, 340, 5, 9, 0, 0, 340, 341, 3, 132, 66, 0, 341, 342, 5, 5, 0, 0, 342, 31, 1, 0, 0, 0, 343, 354, 3, 34, 17, 0, 344, 354, 3, 36, 18, 0, 345, 354, 3, 38, 19, 0, 346, 354, 3, 40, 20, 0, 347, 354, 3, 42, 21, 0, 348, 354, 3, 44, 22, 0, 349, 354, 3, 46, 23, 0, 350, 354, 3, 48, 24, 0, 351, 354, 3, 50, 25, 0, 352, 354, 3, 52, 26, 0, 353, 343, 1, 0, 0, 0, 353, 344, 1, 0, 0, 0, 353, 345, 1, 0, 0, 0, 353, 346, 1, 0, 0, 0, 353, 347, 1, 0, 0, 0, 353, 348, 1, 0, 0, 0, 353, 349, 1, 0, 0, 0, 353, 350, 1, 0, 0, 0, 353, 351, 1, 0, 0, 0, 353, 352, 1, 0, 0, 0, 354, 33, 1, 0, 0, 0, 355, 356, 5, 27, 0, 0, 356, 357, 3, 196, 98, 0, 357, 358, 5, 3, 0, 0, 358, 359, 3, 156, 78, 0, 359, 360, 5, 4, 0, 0, 360, 361, 5, 10, 0, 0, 361, 362, 3, 148, 74, 0, 362, 363, 5, 5, 0, 0, 363, 35, 1, 0, 0, 0, 364, 365, 5, 28, 0, 0, 365, 366, 3, 196, 98, 0, 366, 367, 5, 3, 0, 0, 367, 368, 3, 156, 78, 0, 368, 369, 5, 4, 0, 0, 369, 370, 5, 10, 0, 0, 370, 371, 3, 148, 74, 0, 371, 372, 5, 5, 0, 0, 372, 37, 1, 0, 0, 0, 373, 374, 3, 190, 95, 0, 374, 375, 3, 196, 98, 0, 375, 376, 5, 3, 0, 0, 376, 377, 3, 156, 78, 0, 377, 378, 5, 4, 0, 0, 378, 379, 3, 156, 78, 0, 379, 380, 5, 10, 0, 0, 380, 381, 3, 148, 74, 0, 381, 382, 5, 5, 0, 0, 382, 39, 1, 0, 0, 0, 383, 384, 5, 30, 0, 0, 384, 385, 3, 156, 78, 0, 385, 386, 5, 10, 0, 0, 386, 387, 3, 196, 98, 0, 387, 388, 5, 3, 0, 0, 388, 389, 3, 156, 78, 0, 389, 390, 5, 4, 0, 0, 390, 391, 5, 5, 0, 0, 391, 41, 1, 0, 0, 0, 392, 393, 5, 31, 0, 0, 393, 394, 3, 196, 98, 0, 394, 395, 5, 3, 0, 0, 395, 396, 3, 156, 78, 0, 396, 397, 5, 4, 0, 0, 397, 398, 5, 5, 0, 0, 398, 43, 1, 0, 0, 0, 399, 403, 3, 188, 94, 0, 400, 402, 3, 156, 78, 0, 401, 400, 1, 0, 0, 0, 402, 405, 1, 0, 0, 0, 403, 401, 1, 0, 0, 0, 403, 404, 1, 0, 0, 0, 404, 406, 1, 0, 0, 0, 405, 403, 1, 0, 0, 0, 406, 407, 5, 10, 0, 0, 407, 408, 3, 148, 74, 0, 408, 413, 5, 9, 0, 0, 409, 414, 3, 114, 57, 0, 410, 414, 3, 116, 58, 0, 411, 414, 3, 120, 60, 0, 412, 414, 3, 118, 59, 0, 413, 409, 1, 0, 0, 0, 413, 410, 1, 0, 0, 0, 413, 411, 1, 0, 0, 0, 413, 412, 1, 0, 0, 0, 414, 415, 1, 0, 0, 0, 415, 416, 5, 5, 0, 0, 416, 45, 1, 0, 0, 0, 417, 418, 5, 34, 0, 0, 418, 419, 3, 194, 97, 0, 419, 420, 5, 5, 0, 0, 420, 47, 1, 0, 0, 0, 421, 422, 3, 186, 93, 0, 422, 423, 3, 156, 78, 0, 423, 424, 3, 156, 78, 0, 424, 425, 5, 11, 0, 0, 425, 426, 3, 194, 97, 0, 426, 427, 5, 5, 0, 0, 427, 49, 1, 0, 0, 0, 428, 429, 5, 35, 0, 0, 429, 430, 3, 148, 74, 0, 430, 431, 5, 5, 0, 0, 431, 51, 1, 0, 0, 0, 432, 444, 3, 54, 27, 0, 433, 444, 3, 56, 28, 0, 434, 444, 3, 58, 29, 0, 435, 444, 3, 60, 30, 0, 436, 444, 3, 62, 31, 0, 437, 444, 3, 64, 32, 0, 438, 444, 3, 70, 35, 0, 439, 444, 3, 72, 36, 0, 440, 444, 3, 74, 37, 0, 441, 444, 3, 76, 38, 0, 442, 444, 3, 78, 39, 0, 443, 432, 1, 0, 0, 0, 443, 433, 1, 0, 0, 0, 443, 434, 1, 0, 0, 0, 443, 435, 1, 0, 0, 0, 443, 436, 1, 0, 0, 0, 443, 437, 1, 0, 0, 0, 443, 438, 1, 0, 0, 0, 443, 439, 1, 0, 0, 0, 443, 440, 1, 0, 0, 0, 443, 441, 1, 0, 0, 0, 443, 442, 1, 0, 0, 0, 444, 53, 1, 0, 0, 0, 445, 446, 3, 170, 85, 0, 446, 447, 3, 156, 78, 0, 447, 448, 5, 10, 0, 0, 448, 449, 3, 148, 74, 0, 449, 450, 5, 5, 0, 0, 450, 55, 1, 0, 0, 0, 451, 452, 3, 172, 86, 0, 452, 453, 3, 156, 78, 0, 453, 454, 3, 156, 78, 0, 454, 455, 5, 10, 0, 0, 455, 456, 3, 148, 74, 0, 456, 457, 5, 5, 0, 0, 457, 57, 1, 0, 0, 0, 458, 459, 5, 36, 0, 0, 459, 460, 3, 156, 78, 0, 460, 461, 3, 156, 78, 0, 461, 462, 3, 156, 78, 0, 462, 463, 5, 10, 0, 0, 463, 464, 3, 148, 74, 0, 464, 465, 5, 5, 0, 0, 465, 59, 1, 0, 0, 0, 466, 467, 3, 174, 87, 0, 467, 468, 3, 156, 78, 0, 468, 469, 3, 156, 78, 0, 469, 470, 5, 10, 0, 0, 470, 471, 3, 148, 74, 0, 471, 472, 5, 5, 0, 0, 472, 61, 1, 0, 0, 0, 473, 474, 3, 176, 88, 0, 474, 475, 3, 156, 78, 0, 475, 476, 3, 156, 78, 0, 476, 477, 5, 5, 0, 0, 477, 63, 1, 0, 0, 0, 478, 479, 3, 178, 89, 0, 479, 480, 3, 156, 78, 0, 480, 481, 3, 156, 78, 0, 481, 482, 5, 10, 0, 0, 482, 483, 3, 148, 74, 0, 483, 487, 5, 9, 0, 0, 484, 488, 3, 116, 58, 0, 485, 488, 3, 108, 54, 0, 486, 488, 3, 110, 55, 0, 487, 484, 1, 0, 0, 0, 487, 485, 1, 0, 0, 0, 487, 486, 1, 0, 0, 0, 488, 489, 1, 0, 0, 0, 489, 490, 5, 5, 0, 0, 490, 65, 1, 0, 0, 0, 491, 492, 3, 180, 90, 0, 492, 493, 3, 156, 78, 0, 493, 494, 5, 10, 0, 0, 494, 495, 3, 148, 74, 0, 495, 501, 5, 9, 0, 0, 496, 502, 3, 114, 57, 0, 497, 502, 3, 116, 58, 0, 498, 502, 3, 120, 60, 0, 499, 502, 3, 124, 62, 0, 500, 502, 3, 196, 98, 0, 501, 496, 1, 0, 0, 0, 501, 497, 1, 0, 0, 0, 501, 498, 1, 0, 0, 0, 501, 499, 1, 0, 0, 0, 501, 500, 1, 0, 0, 0, 502, 503, 1, 0, 0, 0, 503, 504, 5, 5, 0, 0, 504, 67, 1, 0, 0, 0, 505, 506, 3, 182, 91, 0, 506, 507, 3, 156, 78, 0, 507, 508, 3, 156, 78, 0, 508, 509, 5, 10, 0, 0, 509, 510, 3, 148, 74, 0, 510, 516, 5, 9, 0, 0, 511, 517, 3, 114, 57, 0, 512, 517, 3, 116, 58, 0, 513, 517, 3, 120, 60, 0, 514, 517, 3, 124, 62, 0, 515, 517, 3, 196, 98, 0, 516, 511, 1, 0, 0, 0, 516, 512, 1, 0, 0, 0, 516, 513, 1, 0, 0, 0, 516, 514, 1, 0, 0, 0, 516, 515, 1, 0, 0, 0, 517, 518, 1, 0, 0, 0, 518, 519, 5, 5, 0, 0, 519, 69, 1, 0, 0, 0, 520, 523, 3, 66, 33, 0, 521, 523, 3, 68, 34, 0, 522, 520, 1, 0, 0, 0, 522, 521, 1, 0, 0, 0, 523, 71, 1, 0, 0, 0, 524, 525, 3, 192, 96, 0, 525, 526, 3, 156, 78, 0, 526, 527, 3, 156, 78, 0, 527, 528, 3, 156, 78, 0, 528, 529, 5, 10, 0, 0, 529, 530, 3, 148, 74, 0, 530, 531, 5, 5, 0, 0, 531, 73, 1, 0, 0, 0, 532, 534, 3, 184, 92, 0, 533, 535, 3, 156, 78, 0, 534, 533, 1, 0, 0, 0, 535, 536, 1, 0, 0, 0, 536, 534, 1, 0, 0, 0, 536, 537, 1, 0, 0, 0, 537, 538, 1, 0, 0, 0, 538, 539, 5, 10, 0, 0, 539, 540, 3, 148, 74, 0, 540, 541, 5, 9, 0, 0, 541, 542, 3, 166, 83, 0, 542, 543, 5, 5, 0, 0, 543, 75, 1, 0, 0, 0, 544, 547, 5, 40, 0, 0, 545, 548, 3, 164, 82, 0, 546, 548, 3, 196, 98, 0, 547, 545, 1, 0, 0, 0, 547, 546, 1, 0, 0, 0, 548, 552, 1, 0, 0, 0, 549, 551, 3, 156, 78, 0, 550, 549, 1, 0, 0, 0, 551, 554, 1, 0, 0, 0, 552, 550, 1, 0, 0, 0, 552, 553, 1, 0, 0, 0, 553, 561, 1, 0, 0, 0, 554, 552, 1, 0, 0, 0, 555, 557, 5, 10, 0, 0, 556, 558, 3, 148, 74, 0, 557, 556, 1, 0, 0, 0, 558, 559, 1, 0, 0, 0, 559, 557, 1, 0, 0, 0, 559, 560, 1, 0, 0, 0, 560, 562, 1, 0, 0, 0, 561, 555, 1, 0, 0, 0, 561, 562, 1, 0, 0, 0, 562, 563, 1, 0, 0, 0, 563, 564, 5, 5, 0, 0, 564, 77, 1, 0, 0, 0, 565, 566, 5, 41, 0, 0, 566, 570, 3, 196, 98, 0, 567, 569, 3, 156, 78, 0, 568, 567, 1, 0, 0, 0, 569, 572, 1, 0, 0, 0, 570, 568, 1, 0, 0, 0, 570, 571, 1, 0, 0, 0, 571, 573, 1, 0, 0, 0, 572, 570, 1, 0, 0, 0, 573, 574, 5, 10, 0, 0, 574, 575, 3, 148, 74, 0, 575, 576, 5, 5, 0, 0, 576, 79, 1, 0, 0, 0, 577, 582, 3, 94, 47, 0, 578, 582, 3, 96, 48, 0, 579, 582, 3, 98, 49, 0, 580, 582, 3, 100, 50, 0, 581, 577, 1, 0, 0, 0, 581, 578, 1, 0, 0, 0, 581, 579, 1, 0, 0, 0, 581, 580, 1, 0, 0, 0, 582, 81, 1, 0, 0, 0, 583, 585, 5, 8, 0, 0, 584, 583, 1, 0, 0, 0, 584, 585, 1, 0, 0, 0, 585, 586, 1, 0, 0, 0, 586, 587, 5, 114, 0, 0, 587, 588, 3, 104, 52, 0, 588, 83, 1, 0, 0, 0, 589, 591, 5, 8, 0, 0, 590, 589, 1, 0, 0, 0, 590, 591, 1, 0, 0, 0, 591, 592, 1, 0, 0, 0, 592, 593, 5, 114, 0, 0, 593, 594, 3, 102, 51, 0, 594, 85, 1, 0, 0, 0, 595, 598, 3, 82, 41, 0, 596, 598, 3, 84, 42, 0, 597, 595, 1, 0, 0, 0, 597, 596, 1, 0, 0, 0, 598, 87, 1, 0, 0, 0, 599, 601, 5, 8, 0, 0, 600, 599, 1, 0, 0, 0, 600, 601, 1, 0, 0, 0, 601, 602, 1, 0, 0, 0, 602, 603, 5, 114, 0, 0, 603, 604, 3, 108, 54, 0, 604, 89, 1, 0, 0, 0, 605, 607, 5, 8, 0, 0, 606, 605, 1, 0, 0, 0, 606, 607, 1, 0, 0, 0, 607, 608, 1, 0, 0, 0, 608, 609, 5, 114, 0, 0, 609, 610, 3, 110, 55, 0, 610, 91, 1, 0, 0, 0, 611, 613, 5, 8, 0, 0, 612, 611, 1, 0, 0, 0, 612, 613, 1, 0, 0, 0, 613, 614, 1, 0, 0, 0, 614, 615, 5, 114, 0, 0, 615, 616, 3, 112, 56, 0, 616, 93, 1, 0, 0, 0, 617, 622, 3, 86, 43, 0, 618, 622, 3, 88, 44, 0, 619, 622, 3, 90, 45, 0, 620, 622, 3, 92, 46, 0, 621, 617, 1, 0, 0, 0, 621, 618, 1, 0, 0, 0, 621, 619, 1, 0, 0, 0, 621, 620, 1, 0, 0, 0, 622, 95, 1, 0, 0, 0, 623, 624, 5, 112, 0, 0, 624, 97, 1, 0, 0, 0, 625, 626, 5, 113, 0, 0, 626, 99, 1, 0, 0, 0, 627, 628, 7, 0, 0, 0, 628, 101, 1, 0, 0, 0, 629, 630, 5, 105, 0, 0, 630, 103, 1, 0, 0, 0, 631, 632, 5, 106, 0, 0, 632, 105, 1, 0, 0, 0, 633, 636, 3, 102, 51, 0, 634, 636, 3, 104, 52, 0, 635, 633, 1, 0, 0, 0, 635, 634, 1, 0, 0, 0, 636, 107, 1, 0, 0, 0, 637, 638, 5, 107, 0, 0, 638, 109, 1, 0, 0, 0, 639, 640, 5, 17, 0, 0, 640, 111, 1, 0, 0, 0, 641, 642, 5, 108, 0, 0, 642, 113, 1, 0, 0, 0, 643, 648, 3, 106, 53, 0, 644, 648, 3, 108, 54, 0, 645, 648, 3, 110, 55, 0, 646, 648, 3, 112, 56, 0, 647, 643, 1, 0, 0, 0, 647, 644, 1, 0, 0, 0, 647, 645, 1, 0, 0, 0, 647, 646, 1, 0, 0, 0, 648, 115, 1, 0, 0, 0, 649, 650, 5, 109, 0, 0, 650, 117, 1, 0, 0, 0, 651, 652, 5, 110, 0, 0, 652, 119, 1, 0, 0, 0, 653, 654, 5, 111, 0, 0, 654, 121, 1, 0, 0, 0, 655, 660, 3, 114, 57, 0, 656, 660, 3, 116, 58, 0, 657, 660, 3, 120, 60, 0, 658, 660, 3, 118, 59, 0, 659, 655, 1, 0, 0, 0, 659, 656, 1, 0, 0, 0, 659, 657, 1, 0, 0, 0, 659, 658, 1, 0, 0, 0, 660, 123, 1, 0, 0, 0, 661, 662, 5, 3, 0, 0, 662, 663, 3, 126, 63, 0, 663, 664, 5, 5, 0, 0, 664, 665, 3, 84, 42, 0, 665, 666, 5, 4, 0, 0, 666, 125, 1, 0, 0, 0, 667, 671, 3, 122, 61, 0, 668, 671, 3, 124, 62, 0, 669, 671, 3, 196, 98, 0, 670, 667, 1, 0, 0, 0, 670, 668, 1, 0, 0, 0, 670, 669, 1, 0, 0, 0, 671, 127, 1, 0, 0, 0, 672, 673, 3, 126, 63, 0, 673, 674, 3, 138, 69, 0, 674, 682, 1, 0, 0, 0, 675, 676, 3, 196, 98, 0, 676, 677, 3, 138, 69, 0, 677, 682, 1, 0, 0, 0, 678, 679, 3, 164, 82, 0, 679, 680, 3, 138, 69, 0, 680, 682, 1, 0, 0, 0, 681, 672, 1, 0, 0, 0, 681, 675, 1, 0, 0, 0, 681, 678, 1, 0, 0, 0, 682, 129, 1, 0, 0, 0, 683, 684, 3, 126, 63, 0, 684, 685, 3, 138, 69, 0, 685, 131, 1, 0, 0, 0, 686, 687, 3, 126, 63, 0, 687, 688, 3, 138, 69, 0, 688, 693, 1, 0, 0, 0, 689, 690, 3, 164, 82, 0, 690, 691, 3, 138, 69, 0, 691, 693, 1, 0, 0, 0, 692, 686, 1, 0, 0, 0, 692, 689, 1, 0, 0, 0, 693, 133, 1, 0, 0, 0, 694, 695, 3, 126, 63, 0, 695, 696, 3, 138, 69, 0, 696, 135, 1, 0, 0, 0, 697, 698, 3, 164, 82, 0, 698, 699, 3, 138, 69, 0, 699, 705, 1, 0, 0, 0, 700, 701, 3, 196, 98, 0, 701, 702, 3, 138, 69, 0, 702, 705, 1, 0, 0, 0, 703, 705, 3, 126, 63, 0, 704, 697, 1, 0, 0, 0, 704, 700, 1, 0, 0, 0, 704, 703, 1, 0, 0, 0, 705, 137, 1, 0, 0, 0, 706, 707, 5, 1, 0, 0, 707, 708, 7, 1, 0, 0, 708, 139, 1, 0, 0, 0, 709, 710, 3, 142, 71, 0, 710, 711, 5, 1, 0, 0, 711, 712, 3, 144, 72, 0, 712, 141, 1, 0, 0, 0, 713, 714, 3, 196, 98, 0, 714, 143, 1, 0, 0, 0, 715, 716, 3, 196, 98, 0, 716, 145, 1, 0, 0, 0, 717, 718, 5, 115, 0, 0, 718, 147, 1, 0, 0, 0, 719, 723, 3, 146, 73, 0, 720, 722, 3, 150, 75, 0, 721, 720, 1, 0, 0, 0, 722, 725, 1, 0, 0, 0, 723, 721, 1, 0, 0, 0, 723, 724, 1, 0, 0, 0, 724, 149, 1, 0, 0, 0, 725, 723, 1, 0, 0, 0, 726, 729, 3, 152, 76, 0, 727, 729, 3, 154, 77, 0, 728, 726, 1, 0, 0, 0, 728, 727, 1, 0, 0, 0, 729, 151, 1, 0, 0, 0, 730, 731, 5, 1, 0, 0, 731, 732, 3, 196, 98, 0, 732, 153, 1, 0, 0, 0, 733, 734, 5, 3, 0, 0, 734, 735, 3, 84, 42, 0, 735, 736, 5, 4, 0, 0, 736, 741, 1, 0, 0, 0, 737, 738, 5, 3, 0, 0, 738, 739, 5, 114, 0, 0, 739, 741, 5, 4, 0, 0, 740, 733, 1, 0, 0, 0, 740, 737, 1, 0, 0, 0, 741, 155, 1, 0, 0, 0, 742, 747, 3, 80, 40, 0, 743, 747, 3, 148, 74, 0, 744, 747, 3, 140, 70, 0, 745, 747, 3, 158, 79, 0, 746, 742, 1, 0, 0, 0, 746, 743, 1, 0, 0, 0, 746, 744, 1, 0, 0, 0, 746, 745, 1, 0, 0, 0, 747, 157, 1, 0, 0, 0, 748, 749, 5, 17, 0, 0, 749, 750, 5, 6, 0, 0, 750, 758, 5, 18, 0, 0, 751, 752, 5, 19, 0, 0, 752, 753, 5, 1, 0, 0, 753, 758, 7, 2, 0, 0, 754, 755, 5, 22, 0, 0, 755, 756, 5, 1, 0, 0, 756, 758, 5, 23, 0, 0, 757, 748, 1, 0, 0, 0, 757, 751, 1, 0, 0, 0, 757, 754, 1, 0, 0, 0, 758, 159, 1, 0, 0, 0, 759, 760, 3, 196, 98, 0, 760, 761, 5, 9, 0, 0, 761, 762, 3, 126, 63, 0, 762, 763, 5, 5, 0, 0, 763, 161, 1, 0, 0, 0, 764, 765, 3, 196, 98, 0, 765, 766, 5, 9, 0, 0, 766, 767, 3, 134, 67, 0, 767, 768, 5, 5, 0, 0, 768, 163, 1, 0, 0, 0, 769, 770, 3, 140, 70, 0, 770, 771, 5, 2, 0, 0, 771, 772, 3, 196, 98, 0, 772, 165, 1, 0, 0, 0, 773, 777, 3, 136, 68, 0, 774, 777, 3, 164, 82, 0, 775, 777, 3, 168, 84, 0, 776, 773, 1, 0, 0, 0, 776, 774, 1, 0, 0, 0, 776, 775, 1, 0, 0, 0, 777, 167, 1, 0, 0, 0, 778, 779, 5, 17, 0, 0, 779, 780, 5, 1, 0, 0, 780, 781, 7, 3, 0, 0, 781, 169, 1, 0, 0, 0, 782, 785, 5, 42, 0, 0, 783, 784, 5, 1, 0, 0, 784, 786, 5, 24, 0, 0, 785, 783, 1, 0, 0, 0, 785, 786, 1, 0, 0, 0, 786, 794, 1, 0, 0, 0, 787, 794, 5, 43, 0, 0, 788, 794, 5, 44, 0, 0, 789, 794, 5, 45, 0, 0, 790, 794, 5, 46, 0, 0, 791, 794, 5, 47, 0, 0, 792, 794, 5, 48, 0, 0, 793, 782, 1, 0, 0, 0, 793, 787, 1, 0, 0, 0, 793, 788, 1, 0, 0, 0, 793, 789, 1, 0, 0, 0, 793, 790, 1, 0, 0, 0, 793, 791, 1, 0, 0, 0, 793, 792, 1, 0, 0, 0, 794, 171, 1, 0, 0, 0, 795, 798, 5, 49, 0, 0, 796, 797, 5, 1, 0, 0, 797, 799, 5, 24, 0, 0, 798, 796, 1, 0, 0, 0, 798, 799, 1, 0, 0, 0, 799, 846, 1, 0, 0, 0, 800, 803, 5, 50, 0, 0, 801, 802, 5, 1, 0, 0, 802, 804, 5, 24, 0, 0, 803, 801, 1, 0, 0, 0, 803, 804, 1, 0, 0, 0, 804, 846, 1, 0, 0, 0, 805, 808, 5, 51, 0, 0, 806, 807, 5, 1, 0, 0, 807, 809, 5, 24, 0, 0, 808, 806, 1, 0, 0, 0, 808, 809, 1, 0, 0, 0, 809, 846, 1, 0, 0, 0, 810, 813, 5, 52, 0, 0, 811, 812, 5, 1, 0, 0, 812, 814, 5, 24, 0, 0, 813, 811, 1, 0, 0, 0, 813, 814, 1, 0, 0, 0, 814, 846, 1, 0, 0, 0, 815, 818, 5, 53, 0, 0, 816, 817, 5, 1, 0, 0, 817, 819, 5, 24, 0, 0, 818, 816, 1, 0, 0, 0, 818, 819, 1, 0, 0, 0, 819, 846, 1, 0, 0, 0, 820, 823, 5, 54, 0, 0, 821, 822, 5, 1, 0, 0, 822, 824, 5, 24, 0, 0, 823, 821, 1, 0, 0, 0, 823, 824, 1, 0, 0, 0, 824, 846, 1, 0, 0, 0, 825, 828, 5, 55, 0, 0, 826, 827, 5, 1, 0, 0, 827, 829, 5, 24, 0, 0, 828, 826, 1, 0, 0, 0, 828, 829, 1, 0, 0, 0, 829, 846, 1, 0, 0, 0, 830, 833, 5, 56, 0, 0, 831, 832, 5, 1, 0, 0, 832, 834, 5, 24, 0, 0, 833, 831, 1, 0, 0, 0, 833, 834, 1, 0, 0, 0, 834, 846, 1, 0, 0, 0, 835, 846, 5, 57, 0, 0, 836, 846, 5, 58, 0, 0, 837, 846, 5, 59, 0, 0, 838, 846, 5, 60, 0, 0, 839, 846, 5, 61, 0, 0, 840, 846, 5, 62, 0, 0, 841, 846, 5, 63, 0, 0, 842, 846, 5, 64, 0, 0, 843, 846, 5, 65, 0, 0, 844, 846, 5, 66, 0, 0, 845, 795, 1, 0, 0, 0, 845, 800, 1, 0, 0, 0, 845, 805, 1, 0, 0, 0, 845, 810, 1, 0, 0, 0, 845, 815, 1, 0, 0, 0, 845, 820, 1, 0, 0, 0, 845, 825, 1, 0, 0, 0, 845, 830, 1, 0, 0, 0, 845, 835, 1, 0, 0, 0, 845, 836, 1, 0, 0, 0, 845, 837, 1, 0, 0, 0, 845, 838, 1, 0, 0, 0, 845, 839, 1, 0, 0, 0, 845, 840, 1, 0, 0, 0, 845, 841, 1, 0, 0, 0, 845, 842, 1, 0, 0, 0, 845, 843, 1, 0, 0, 0, 845, 844, 1, 0, 0, 0, 846, 173, 1, 0, 0, 0, 847, 848, 5, 67, 0, 0, 848, 849, 5, 1, 0, 0, 849, 850, 7, 4, 0, 0, 850, 175, 1, 0, 0, 0, 851, 852, 5, 70, 0, 0, 852, 853, 5, 1, 0, 0, 853, 854, 7, 4, 0, 0, 854, 177, 1, 0, 0, 0, 855, 856, 5, 71, 0, 0, 856, 857, 5, 1, 0, 0, 857, 858, 7, 5, 0, 0, 858, 179, 1, 0, 0, 0, 859, 860, 5, 72, 0, 0, 860, 861, 5, 1, 0, 0, 861, 862, 7, 6, 0, 0, 862, 181, 1, 0, 0, 0, 863, 864, 5, 73, 0, 0, 864, 865, 5, 1, 0, 0, 865, 866, 7, 7, 0, 0, 866, 183, 1, 0, 0, 0, 867, 870, 5, 89, 0, 0, 868, 869, 5, 1, 0, 0, 869, 871, 5, 90, 0, 0, 870, 868, 1, 0, 0, 0, 870, 871, 1, 0, 0, 0, 871, 185, 1, 0, 0, 0, 872, 873, 5, 91, 0, 0, 873, 874, 5, 1, 0, 0, 874, 875, 7, 4, 0, 0, 875, 187, 1, 0, 0, 0, 876, 877, 5, 32, 0, 0, 877, 878, 5, 1, 0, 0, 878, 879, 5, 33, 0, 0, 879, 189, 1, 0, 0, 0, 880, 881, 5, 28, 0, 0, 881, 882, 5, 1, 0, 0, 882, 883, 5, 29, 0, 0, 883, 191, 1, 0, 0, 0, 884, 885, 5, 37, 0, 0, 885, 886, 5, 1, 0, 0, 886, 889, 5, 38, 0, 0, 887, 889, 5, 39, 0, 0, 888, 884, 1, 0, 0, 0, 888, 887, 1, 0, 0, 0, 889, 193, 1, 0, 0, 0, 890, 891, 5, 116, 0, 0, 891, 195, 1, 0, 0, 0, 892, 893, 7, 8, 0, 0, 893, 197, 1, 0, 0, 0, 62, 203, 214, 216, 244, 252, 261, 267, 272, 293, 299, 305, 309, 329, 335, 353, 403, 413, 443, 487, 501, 516, 522, 536, 547, 552, 559, 561, 570, 581, 584, 590, 597, 600, 606, 612, 621, 635, 647, 659, 670, 681, 692, 704, 723, 728, 740, 746, 757, 776, 785, 793, 798, 803, 808, 813, 818, 823, 828, 833, 845, 870, 888] \ No newline at end of file +[4, 1, 119, 896, 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, 2, 70, 7, 70, 2, 71, 7, 71, 2, 72, 7, 72, 2, 73, 7, 73, 2, 74, 7, 74, 2, 75, 7, 75, 2, 76, 7, 76, 2, 77, 7, 77, 2, 78, 7, 78, 2, 79, 7, 79, 2, 80, 7, 80, 2, 81, 7, 81, 2, 82, 7, 82, 2, 83, 7, 83, 2, 84, 7, 84, 2, 85, 7, 85, 2, 86, 7, 86, 2, 87, 7, 87, 2, 88, 7, 88, 2, 89, 7, 89, 2, 90, 7, 90, 2, 91, 7, 91, 2, 92, 7, 92, 2, 93, 7, 93, 2, 94, 7, 94, 2, 95, 7, 95, 2, 96, 7, 96, 2, 97, 7, 97, 2, 98, 7, 98, 1, 0, 1, 0, 1, 1, 5, 1, 202, 8, 1, 10, 1, 12, 1, 205, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 4, 1, 215, 8, 1, 11, 1, 12, 1, 216, 1, 2, 1, 2, 1, 2, 1, 2, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 6, 1, 6, 1, 6, 1, 6, 4, 6, 243, 8, 6, 11, 6, 12, 6, 244, 1, 7, 1, 7, 1, 7, 1, 7, 5, 7, 251, 8, 7, 10, 7, 12, 7, 254, 9, 7, 1, 8, 1, 8, 1, 8, 1, 8, 5, 8, 260, 8, 8, 10, 8, 12, 8, 263, 9, 8, 1, 8, 4, 8, 266, 8, 8, 11, 8, 12, 8, 267, 1, 8, 5, 8, 271, 8, 8, 10, 8, 12, 8, 274, 9, 8, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 11, 1, 11, 1, 11, 1, 11, 5, 11, 292, 8, 11, 10, 11, 12, 11, 295, 9, 11, 1, 11, 5, 11, 298, 8, 11, 10, 11, 12, 11, 301, 9, 11, 1, 11, 5, 11, 304, 8, 11, 10, 11, 12, 11, 307, 9, 11, 1, 11, 3, 11, 310, 8, 11, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 14, 1, 14, 1, 14, 1, 14, 5, 14, 328, 8, 14, 10, 14, 12, 14, 331, 9, 14, 1, 14, 5, 14, 334, 8, 14, 10, 14, 12, 14, 337, 9, 14, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 3, 16, 355, 8, 16, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 22, 1, 22, 5, 22, 403, 8, 22, 10, 22, 12, 22, 406, 9, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 3, 22, 415, 8, 22, 1, 22, 1, 22, 1, 23, 1, 23, 1, 23, 1, 23, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 25, 1, 25, 1, 25, 1, 25, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 3, 26, 445, 8, 26, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 3, 32, 489, 8, 32, 1, 32, 1, 32, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 3, 33, 503, 8, 33, 1, 33, 1, 33, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 3, 34, 518, 8, 34, 1, 34, 1, 34, 1, 35, 1, 35, 3, 35, 524, 8, 35, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 37, 1, 37, 4, 37, 536, 8, 37, 11, 37, 12, 37, 537, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 38, 1, 38, 1, 38, 3, 38, 549, 8, 38, 1, 38, 5, 38, 552, 8, 38, 10, 38, 12, 38, 555, 9, 38, 1, 38, 1, 38, 4, 38, 559, 8, 38, 11, 38, 12, 38, 560, 3, 38, 563, 8, 38, 1, 38, 1, 38, 1, 39, 1, 39, 1, 39, 5, 39, 570, 8, 39, 10, 39, 12, 39, 573, 9, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 40, 1, 40, 1, 40, 1, 40, 3, 40, 583, 8, 40, 1, 41, 3, 41, 586, 8, 41, 1, 41, 1, 41, 1, 41, 1, 42, 3, 42, 592, 8, 42, 1, 42, 1, 42, 1, 42, 1, 43, 1, 43, 3, 43, 599, 8, 43, 1, 44, 3, 44, 602, 8, 44, 1, 44, 1, 44, 1, 44, 1, 45, 3, 45, 608, 8, 45, 1, 45, 1, 45, 1, 45, 1, 46, 3, 46, 614, 8, 46, 1, 46, 1, 46, 1, 46, 1, 47, 1, 47, 1, 47, 1, 47, 3, 47, 623, 8, 47, 1, 48, 1, 48, 1, 49, 1, 49, 1, 50, 1, 50, 1, 51, 1, 51, 1, 52, 1, 52, 1, 53, 1, 53, 3, 53, 637, 8, 53, 1, 54, 1, 54, 1, 55, 1, 55, 1, 56, 1, 56, 1, 57, 1, 57, 1, 57, 1, 57, 3, 57, 649, 8, 57, 1, 58, 1, 58, 1, 59, 1, 59, 1, 60, 1, 60, 1, 61, 1, 61, 1, 61, 1, 61, 3, 61, 661, 8, 61, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 63, 1, 63, 1, 63, 3, 63, 672, 8, 63, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 3, 64, 683, 8, 64, 1, 65, 1, 65, 1, 65, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 3, 66, 694, 8, 66, 1, 67, 1, 67, 1, 67, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 3, 68, 706, 8, 68, 1, 69, 1, 69, 1, 69, 1, 70, 1, 70, 1, 70, 1, 70, 1, 71, 1, 71, 1, 72, 1, 72, 1, 73, 1, 73, 1, 74, 1, 74, 5, 74, 723, 8, 74, 10, 74, 12, 74, 726, 9, 74, 1, 75, 1, 75, 3, 75, 730, 8, 75, 1, 76, 1, 76, 1, 76, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 3, 77, 742, 8, 77, 1, 78, 1, 78, 1, 78, 1, 78, 3, 78, 748, 8, 78, 1, 79, 1, 79, 1, 79, 1, 79, 1, 79, 1, 79, 1, 79, 1, 79, 1, 79, 3, 79, 759, 8, 79, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 82, 1, 82, 1, 82, 1, 82, 1, 83, 1, 83, 1, 83, 3, 83, 778, 8, 83, 1, 84, 1, 84, 1, 84, 1, 84, 1, 85, 1, 85, 1, 85, 3, 85, 787, 8, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 3, 85, 795, 8, 85, 1, 86, 1, 86, 1, 86, 3, 86, 800, 8, 86, 1, 86, 1, 86, 1, 86, 3, 86, 805, 8, 86, 1, 86, 1, 86, 1, 86, 3, 86, 810, 8, 86, 1, 86, 1, 86, 1, 86, 3, 86, 815, 8, 86, 1, 86, 1, 86, 1, 86, 3, 86, 820, 8, 86, 1, 86, 1, 86, 1, 86, 3, 86, 825, 8, 86, 1, 86, 1, 86, 1, 86, 3, 86, 830, 8, 86, 1, 86, 1, 86, 1, 86, 3, 86, 835, 8, 86, 1, 86, 1, 86, 1, 86, 1, 86, 1, 86, 1, 86, 1, 86, 1, 86, 1, 86, 1, 86, 3, 86, 847, 8, 86, 1, 87, 1, 87, 1, 87, 1, 87, 1, 88, 1, 88, 1, 88, 1, 88, 1, 89, 1, 89, 1, 89, 1, 89, 1, 90, 1, 90, 1, 90, 1, 90, 1, 91, 1, 91, 1, 91, 1, 91, 1, 92, 1, 92, 1, 92, 3, 92, 872, 8, 92, 1, 93, 1, 93, 1, 93, 1, 93, 1, 94, 1, 94, 1, 94, 1, 94, 1, 95, 1, 95, 1, 95, 1, 95, 1, 96, 1, 96, 1, 96, 1, 96, 3, 96, 890, 8, 96, 1, 97, 1, 97, 1, 98, 1, 98, 1, 98, 0, 0, 99, 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, 140, 142, 144, 146, 148, 150, 152, 154, 156, 158, 160, 162, 164, 166, 168, 170, 172, 174, 176, 178, 180, 182, 184, 186, 188, 190, 192, 194, 196, 0, 9, 1, 0, 103, 104, 1, 0, 12, 16, 1, 0, 20, 21, 1, 0, 25, 26, 1, 0, 68, 69, 1, 0, 74, 79, 1, 0, 74, 88, 1, 0, 80, 82, 2, 0, 9, 113, 115, 116, 923, 0, 198, 1, 0, 0, 0, 2, 203, 1, 0, 0, 0, 4, 218, 1, 0, 0, 0, 6, 222, 1, 0, 0, 0, 8, 228, 1, 0, 0, 0, 10, 233, 1, 0, 0, 0, 12, 238, 1, 0, 0, 0, 14, 246, 1, 0, 0, 0, 16, 255, 1, 0, 0, 0, 18, 275, 1, 0, 0, 0, 20, 281, 1, 0, 0, 0, 22, 287, 1, 0, 0, 0, 24, 311, 1, 0, 0, 0, 26, 317, 1, 0, 0, 0, 28, 323, 1, 0, 0, 0, 30, 338, 1, 0, 0, 0, 32, 354, 1, 0, 0, 0, 34, 356, 1, 0, 0, 0, 36, 365, 1, 0, 0, 0, 38, 374, 1, 0, 0, 0, 40, 384, 1, 0, 0, 0, 42, 393, 1, 0, 0, 0, 44, 400, 1, 0, 0, 0, 46, 418, 1, 0, 0, 0, 48, 422, 1, 0, 0, 0, 50, 429, 1, 0, 0, 0, 52, 444, 1, 0, 0, 0, 54, 446, 1, 0, 0, 0, 56, 452, 1, 0, 0, 0, 58, 459, 1, 0, 0, 0, 60, 467, 1, 0, 0, 0, 62, 474, 1, 0, 0, 0, 64, 479, 1, 0, 0, 0, 66, 492, 1, 0, 0, 0, 68, 506, 1, 0, 0, 0, 70, 523, 1, 0, 0, 0, 72, 525, 1, 0, 0, 0, 74, 533, 1, 0, 0, 0, 76, 545, 1, 0, 0, 0, 78, 566, 1, 0, 0, 0, 80, 582, 1, 0, 0, 0, 82, 585, 1, 0, 0, 0, 84, 591, 1, 0, 0, 0, 86, 598, 1, 0, 0, 0, 88, 601, 1, 0, 0, 0, 90, 607, 1, 0, 0, 0, 92, 613, 1, 0, 0, 0, 94, 622, 1, 0, 0, 0, 96, 624, 1, 0, 0, 0, 98, 626, 1, 0, 0, 0, 100, 628, 1, 0, 0, 0, 102, 630, 1, 0, 0, 0, 104, 632, 1, 0, 0, 0, 106, 636, 1, 0, 0, 0, 108, 638, 1, 0, 0, 0, 110, 640, 1, 0, 0, 0, 112, 642, 1, 0, 0, 0, 114, 648, 1, 0, 0, 0, 116, 650, 1, 0, 0, 0, 118, 652, 1, 0, 0, 0, 120, 654, 1, 0, 0, 0, 122, 660, 1, 0, 0, 0, 124, 662, 1, 0, 0, 0, 126, 671, 1, 0, 0, 0, 128, 682, 1, 0, 0, 0, 130, 684, 1, 0, 0, 0, 132, 693, 1, 0, 0, 0, 134, 695, 1, 0, 0, 0, 136, 705, 1, 0, 0, 0, 138, 707, 1, 0, 0, 0, 140, 710, 1, 0, 0, 0, 142, 714, 1, 0, 0, 0, 144, 716, 1, 0, 0, 0, 146, 718, 1, 0, 0, 0, 148, 720, 1, 0, 0, 0, 150, 729, 1, 0, 0, 0, 152, 731, 1, 0, 0, 0, 154, 741, 1, 0, 0, 0, 156, 747, 1, 0, 0, 0, 158, 758, 1, 0, 0, 0, 160, 760, 1, 0, 0, 0, 162, 765, 1, 0, 0, 0, 164, 770, 1, 0, 0, 0, 166, 777, 1, 0, 0, 0, 168, 779, 1, 0, 0, 0, 170, 794, 1, 0, 0, 0, 172, 846, 1, 0, 0, 0, 174, 848, 1, 0, 0, 0, 176, 852, 1, 0, 0, 0, 178, 856, 1, 0, 0, 0, 180, 860, 1, 0, 0, 0, 182, 864, 1, 0, 0, 0, 184, 868, 1, 0, 0, 0, 186, 873, 1, 0, 0, 0, 188, 877, 1, 0, 0, 0, 190, 881, 1, 0, 0, 0, 192, 889, 1, 0, 0, 0, 194, 891, 1, 0, 0, 0, 196, 893, 1, 0, 0, 0, 198, 199, 3, 2, 1, 0, 199, 1, 1, 0, 0, 0, 200, 202, 3, 4, 2, 0, 201, 200, 1, 0, 0, 0, 202, 205, 1, 0, 0, 0, 203, 201, 1, 0, 0, 0, 203, 204, 1, 0, 0, 0, 204, 206, 1, 0, 0, 0, 205, 203, 1, 0, 0, 0, 206, 207, 5, 92, 0, 0, 207, 208, 3, 140, 70, 0, 208, 214, 5, 5, 0, 0, 209, 215, 3, 6, 3, 0, 210, 215, 3, 12, 6, 0, 211, 215, 3, 14, 7, 0, 212, 215, 3, 16, 8, 0, 213, 215, 3, 22, 11, 0, 214, 209, 1, 0, 0, 0, 214, 210, 1, 0, 0, 0, 214, 211, 1, 0, 0, 0, 214, 212, 1, 0, 0, 0, 214, 213, 1, 0, 0, 0, 215, 216, 1, 0, 0, 0, 216, 214, 1, 0, 0, 0, 216, 217, 1, 0, 0, 0, 217, 3, 1, 0, 0, 0, 218, 219, 5, 93, 0, 0, 219, 220, 3, 140, 70, 0, 220, 221, 5, 5, 0, 0, 221, 5, 1, 0, 0, 0, 222, 223, 5, 94, 0, 0, 223, 224, 3, 196, 98, 0, 224, 225, 5, 7, 0, 0, 225, 226, 3, 8, 4, 0, 226, 227, 3, 10, 5, 0, 227, 7, 1, 0, 0, 0, 228, 229, 5, 95, 0, 0, 229, 230, 5, 9, 0, 0, 230, 231, 3, 130, 65, 0, 231, 232, 5, 5, 0, 0, 232, 9, 1, 0, 0, 0, 233, 234, 5, 96, 0, 0, 234, 235, 5, 9, 0, 0, 235, 236, 3, 130, 65, 0, 236, 237, 5, 5, 0, 0, 237, 11, 1, 0, 0, 0, 238, 239, 5, 97, 0, 0, 239, 240, 3, 196, 98, 0, 240, 242, 5, 7, 0, 0, 241, 243, 3, 160, 80, 0, 242, 241, 1, 0, 0, 0, 243, 244, 1, 0, 0, 0, 244, 242, 1, 0, 0, 0, 244, 245, 1, 0, 0, 0, 245, 13, 1, 0, 0, 0, 246, 247, 5, 16, 0, 0, 247, 248, 3, 196, 98, 0, 248, 252, 5, 7, 0, 0, 249, 251, 3, 162, 81, 0, 250, 249, 1, 0, 0, 0, 251, 254, 1, 0, 0, 0, 252, 250, 1, 0, 0, 0, 252, 253, 1, 0, 0, 0, 253, 15, 1, 0, 0, 0, 254, 252, 1, 0, 0, 0, 255, 256, 5, 98, 0, 0, 256, 257, 3, 196, 98, 0, 257, 261, 5, 7, 0, 0, 258, 260, 3, 18, 9, 0, 259, 258, 1, 0, 0, 0, 260, 263, 1, 0, 0, 0, 261, 259, 1, 0, 0, 0, 261, 262, 1, 0, 0, 0, 262, 265, 1, 0, 0, 0, 263, 261, 1, 0, 0, 0, 264, 266, 3, 52, 26, 0, 265, 264, 1, 0, 0, 0, 266, 267, 1, 0, 0, 0, 267, 265, 1, 0, 0, 0, 267, 268, 1, 0, 0, 0, 268, 272, 1, 0, 0, 0, 269, 271, 3, 20, 10, 0, 270, 269, 1, 0, 0, 0, 271, 274, 1, 0, 0, 0, 272, 270, 1, 0, 0, 0, 272, 273, 1, 0, 0, 0, 273, 17, 1, 0, 0, 0, 274, 272, 1, 0, 0, 0, 275, 276, 5, 99, 0, 0, 276, 277, 3, 146, 73, 0, 277, 278, 5, 9, 0, 0, 278, 279, 3, 136, 68, 0, 279, 280, 5, 5, 0, 0, 280, 19, 1, 0, 0, 0, 281, 282, 5, 100, 0, 0, 282, 283, 3, 156, 78, 0, 283, 284, 5, 9, 0, 0, 284, 285, 3, 136, 68, 0, 285, 286, 5, 5, 0, 0, 286, 21, 1, 0, 0, 0, 287, 288, 5, 101, 0, 0, 288, 289, 3, 196, 98, 0, 289, 293, 5, 7, 0, 0, 290, 292, 3, 24, 12, 0, 291, 290, 1, 0, 0, 0, 292, 295, 1, 0, 0, 0, 293, 291, 1, 0, 0, 0, 293, 294, 1, 0, 0, 0, 294, 299, 1, 0, 0, 0, 295, 293, 1, 0, 0, 0, 296, 298, 3, 52, 26, 0, 297, 296, 1, 0, 0, 0, 298, 301, 1, 0, 0, 0, 299, 297, 1, 0, 0, 0, 299, 300, 1, 0, 0, 0, 300, 305, 1, 0, 0, 0, 301, 299, 1, 0, 0, 0, 302, 304, 3, 26, 13, 0, 303, 302, 1, 0, 0, 0, 304, 307, 1, 0, 0, 0, 305, 303, 1, 0, 0, 0, 305, 306, 1, 0, 0, 0, 306, 309, 1, 0, 0, 0, 307, 305, 1, 0, 0, 0, 308, 310, 3, 28, 14, 0, 309, 308, 1, 0, 0, 0, 309, 310, 1, 0, 0, 0, 310, 23, 1, 0, 0, 0, 311, 312, 5, 99, 0, 0, 312, 313, 3, 146, 73, 0, 313, 314, 5, 9, 0, 0, 314, 315, 3, 128, 64, 0, 315, 316, 5, 5, 0, 0, 316, 25, 1, 0, 0, 0, 317, 318, 5, 100, 0, 0, 318, 319, 3, 156, 78, 0, 319, 320, 5, 9, 0, 0, 320, 321, 3, 128, 64, 0, 321, 322, 5, 5, 0, 0, 322, 27, 1, 0, 0, 0, 323, 324, 5, 102, 0, 0, 324, 325, 3, 196, 98, 0, 325, 329, 5, 7, 0, 0, 326, 328, 3, 30, 15, 0, 327, 326, 1, 0, 0, 0, 328, 331, 1, 0, 0, 0, 329, 327, 1, 0, 0, 0, 329, 330, 1, 0, 0, 0, 330, 335, 1, 0, 0, 0, 331, 329, 1, 0, 0, 0, 332, 334, 3, 32, 16, 0, 333, 332, 1, 0, 0, 0, 334, 337, 1, 0, 0, 0, 335, 333, 1, 0, 0, 0, 335, 336, 1, 0, 0, 0, 336, 29, 1, 0, 0, 0, 337, 335, 1, 0, 0, 0, 338, 339, 5, 99, 0, 0, 339, 340, 3, 146, 73, 0, 340, 341, 5, 9, 0, 0, 341, 342, 3, 132, 66, 0, 342, 343, 5, 5, 0, 0, 343, 31, 1, 0, 0, 0, 344, 355, 3, 34, 17, 0, 345, 355, 3, 36, 18, 0, 346, 355, 3, 38, 19, 0, 347, 355, 3, 40, 20, 0, 348, 355, 3, 42, 21, 0, 349, 355, 3, 44, 22, 0, 350, 355, 3, 46, 23, 0, 351, 355, 3, 48, 24, 0, 352, 355, 3, 50, 25, 0, 353, 355, 3, 52, 26, 0, 354, 344, 1, 0, 0, 0, 354, 345, 1, 0, 0, 0, 354, 346, 1, 0, 0, 0, 354, 347, 1, 0, 0, 0, 354, 348, 1, 0, 0, 0, 354, 349, 1, 0, 0, 0, 354, 350, 1, 0, 0, 0, 354, 351, 1, 0, 0, 0, 354, 352, 1, 0, 0, 0, 354, 353, 1, 0, 0, 0, 355, 33, 1, 0, 0, 0, 356, 357, 5, 27, 0, 0, 357, 358, 3, 196, 98, 0, 358, 359, 5, 3, 0, 0, 359, 360, 3, 156, 78, 0, 360, 361, 5, 4, 0, 0, 361, 362, 5, 10, 0, 0, 362, 363, 3, 148, 74, 0, 363, 364, 5, 5, 0, 0, 364, 35, 1, 0, 0, 0, 365, 366, 5, 28, 0, 0, 366, 367, 3, 196, 98, 0, 367, 368, 5, 3, 0, 0, 368, 369, 3, 156, 78, 0, 369, 370, 5, 4, 0, 0, 370, 371, 5, 10, 0, 0, 371, 372, 3, 148, 74, 0, 372, 373, 5, 5, 0, 0, 373, 37, 1, 0, 0, 0, 374, 375, 3, 190, 95, 0, 375, 376, 3, 196, 98, 0, 376, 377, 5, 3, 0, 0, 377, 378, 3, 156, 78, 0, 378, 379, 5, 4, 0, 0, 379, 380, 3, 156, 78, 0, 380, 381, 5, 10, 0, 0, 381, 382, 3, 148, 74, 0, 382, 383, 5, 5, 0, 0, 383, 39, 1, 0, 0, 0, 384, 385, 5, 30, 0, 0, 385, 386, 3, 156, 78, 0, 386, 387, 5, 10, 0, 0, 387, 388, 3, 196, 98, 0, 388, 389, 5, 3, 0, 0, 389, 390, 3, 156, 78, 0, 390, 391, 5, 4, 0, 0, 391, 392, 5, 5, 0, 0, 392, 41, 1, 0, 0, 0, 393, 394, 5, 31, 0, 0, 394, 395, 3, 196, 98, 0, 395, 396, 5, 3, 0, 0, 396, 397, 3, 156, 78, 0, 397, 398, 5, 4, 0, 0, 398, 399, 5, 5, 0, 0, 399, 43, 1, 0, 0, 0, 400, 404, 3, 188, 94, 0, 401, 403, 3, 156, 78, 0, 402, 401, 1, 0, 0, 0, 403, 406, 1, 0, 0, 0, 404, 402, 1, 0, 0, 0, 404, 405, 1, 0, 0, 0, 405, 407, 1, 0, 0, 0, 406, 404, 1, 0, 0, 0, 407, 408, 5, 10, 0, 0, 408, 409, 3, 148, 74, 0, 409, 414, 5, 9, 0, 0, 410, 415, 3, 114, 57, 0, 411, 415, 3, 116, 58, 0, 412, 415, 3, 120, 60, 0, 413, 415, 3, 118, 59, 0, 414, 410, 1, 0, 0, 0, 414, 411, 1, 0, 0, 0, 414, 412, 1, 0, 0, 0, 414, 413, 1, 0, 0, 0, 415, 416, 1, 0, 0, 0, 416, 417, 5, 5, 0, 0, 417, 45, 1, 0, 0, 0, 418, 419, 5, 34, 0, 0, 419, 420, 3, 194, 97, 0, 420, 421, 5, 5, 0, 0, 421, 47, 1, 0, 0, 0, 422, 423, 3, 186, 93, 0, 423, 424, 3, 156, 78, 0, 424, 425, 3, 156, 78, 0, 425, 426, 5, 11, 0, 0, 426, 427, 3, 194, 97, 0, 427, 428, 5, 5, 0, 0, 428, 49, 1, 0, 0, 0, 429, 430, 5, 35, 0, 0, 430, 431, 3, 148, 74, 0, 431, 432, 5, 5, 0, 0, 432, 51, 1, 0, 0, 0, 433, 445, 3, 54, 27, 0, 434, 445, 3, 56, 28, 0, 435, 445, 3, 58, 29, 0, 436, 445, 3, 60, 30, 0, 437, 445, 3, 62, 31, 0, 438, 445, 3, 64, 32, 0, 439, 445, 3, 70, 35, 0, 440, 445, 3, 72, 36, 0, 441, 445, 3, 74, 37, 0, 442, 445, 3, 76, 38, 0, 443, 445, 3, 78, 39, 0, 444, 433, 1, 0, 0, 0, 444, 434, 1, 0, 0, 0, 444, 435, 1, 0, 0, 0, 444, 436, 1, 0, 0, 0, 444, 437, 1, 0, 0, 0, 444, 438, 1, 0, 0, 0, 444, 439, 1, 0, 0, 0, 444, 440, 1, 0, 0, 0, 444, 441, 1, 0, 0, 0, 444, 442, 1, 0, 0, 0, 444, 443, 1, 0, 0, 0, 445, 53, 1, 0, 0, 0, 446, 447, 3, 170, 85, 0, 447, 448, 3, 156, 78, 0, 448, 449, 5, 10, 0, 0, 449, 450, 3, 148, 74, 0, 450, 451, 5, 5, 0, 0, 451, 55, 1, 0, 0, 0, 452, 453, 3, 172, 86, 0, 453, 454, 3, 156, 78, 0, 454, 455, 3, 156, 78, 0, 455, 456, 5, 10, 0, 0, 456, 457, 3, 148, 74, 0, 457, 458, 5, 5, 0, 0, 458, 57, 1, 0, 0, 0, 459, 460, 5, 36, 0, 0, 460, 461, 3, 156, 78, 0, 461, 462, 3, 156, 78, 0, 462, 463, 3, 156, 78, 0, 463, 464, 5, 10, 0, 0, 464, 465, 3, 148, 74, 0, 465, 466, 5, 5, 0, 0, 466, 59, 1, 0, 0, 0, 467, 468, 3, 174, 87, 0, 468, 469, 3, 156, 78, 0, 469, 470, 3, 156, 78, 0, 470, 471, 5, 10, 0, 0, 471, 472, 3, 148, 74, 0, 472, 473, 5, 5, 0, 0, 473, 61, 1, 0, 0, 0, 474, 475, 3, 176, 88, 0, 475, 476, 3, 156, 78, 0, 476, 477, 3, 156, 78, 0, 477, 478, 5, 5, 0, 0, 478, 63, 1, 0, 0, 0, 479, 480, 3, 178, 89, 0, 480, 481, 3, 156, 78, 0, 481, 482, 3, 156, 78, 0, 482, 483, 5, 10, 0, 0, 483, 484, 3, 148, 74, 0, 484, 488, 5, 9, 0, 0, 485, 489, 3, 116, 58, 0, 486, 489, 3, 108, 54, 0, 487, 489, 3, 110, 55, 0, 488, 485, 1, 0, 0, 0, 488, 486, 1, 0, 0, 0, 488, 487, 1, 0, 0, 0, 489, 490, 1, 0, 0, 0, 490, 491, 5, 5, 0, 0, 491, 65, 1, 0, 0, 0, 492, 493, 3, 180, 90, 0, 493, 494, 3, 156, 78, 0, 494, 495, 5, 10, 0, 0, 495, 496, 3, 148, 74, 0, 496, 502, 5, 9, 0, 0, 497, 503, 3, 114, 57, 0, 498, 503, 3, 116, 58, 0, 499, 503, 3, 120, 60, 0, 500, 503, 3, 124, 62, 0, 501, 503, 3, 196, 98, 0, 502, 497, 1, 0, 0, 0, 502, 498, 1, 0, 0, 0, 502, 499, 1, 0, 0, 0, 502, 500, 1, 0, 0, 0, 502, 501, 1, 0, 0, 0, 503, 504, 1, 0, 0, 0, 504, 505, 5, 5, 0, 0, 505, 67, 1, 0, 0, 0, 506, 507, 3, 182, 91, 0, 507, 508, 3, 156, 78, 0, 508, 509, 3, 156, 78, 0, 509, 510, 5, 10, 0, 0, 510, 511, 3, 148, 74, 0, 511, 517, 5, 9, 0, 0, 512, 518, 3, 114, 57, 0, 513, 518, 3, 116, 58, 0, 514, 518, 3, 120, 60, 0, 515, 518, 3, 124, 62, 0, 516, 518, 3, 196, 98, 0, 517, 512, 1, 0, 0, 0, 517, 513, 1, 0, 0, 0, 517, 514, 1, 0, 0, 0, 517, 515, 1, 0, 0, 0, 517, 516, 1, 0, 0, 0, 518, 519, 1, 0, 0, 0, 519, 520, 5, 5, 0, 0, 520, 69, 1, 0, 0, 0, 521, 524, 3, 66, 33, 0, 522, 524, 3, 68, 34, 0, 523, 521, 1, 0, 0, 0, 523, 522, 1, 0, 0, 0, 524, 71, 1, 0, 0, 0, 525, 526, 3, 192, 96, 0, 526, 527, 3, 156, 78, 0, 527, 528, 3, 156, 78, 0, 528, 529, 3, 156, 78, 0, 529, 530, 5, 10, 0, 0, 530, 531, 3, 148, 74, 0, 531, 532, 5, 5, 0, 0, 532, 73, 1, 0, 0, 0, 533, 535, 3, 184, 92, 0, 534, 536, 3, 156, 78, 0, 535, 534, 1, 0, 0, 0, 536, 537, 1, 0, 0, 0, 537, 535, 1, 0, 0, 0, 537, 538, 1, 0, 0, 0, 538, 539, 1, 0, 0, 0, 539, 540, 5, 10, 0, 0, 540, 541, 3, 148, 74, 0, 541, 542, 5, 9, 0, 0, 542, 543, 3, 166, 83, 0, 543, 544, 5, 5, 0, 0, 544, 75, 1, 0, 0, 0, 545, 548, 5, 40, 0, 0, 546, 549, 3, 164, 82, 0, 547, 549, 3, 196, 98, 0, 548, 546, 1, 0, 0, 0, 548, 547, 1, 0, 0, 0, 549, 553, 1, 0, 0, 0, 550, 552, 3, 156, 78, 0, 551, 550, 1, 0, 0, 0, 552, 555, 1, 0, 0, 0, 553, 551, 1, 0, 0, 0, 553, 554, 1, 0, 0, 0, 554, 562, 1, 0, 0, 0, 555, 553, 1, 0, 0, 0, 556, 558, 5, 10, 0, 0, 557, 559, 3, 148, 74, 0, 558, 557, 1, 0, 0, 0, 559, 560, 1, 0, 0, 0, 560, 558, 1, 0, 0, 0, 560, 561, 1, 0, 0, 0, 561, 563, 1, 0, 0, 0, 562, 556, 1, 0, 0, 0, 562, 563, 1, 0, 0, 0, 563, 564, 1, 0, 0, 0, 564, 565, 5, 5, 0, 0, 565, 77, 1, 0, 0, 0, 566, 567, 5, 41, 0, 0, 567, 571, 3, 196, 98, 0, 568, 570, 3, 156, 78, 0, 569, 568, 1, 0, 0, 0, 570, 573, 1, 0, 0, 0, 571, 569, 1, 0, 0, 0, 571, 572, 1, 0, 0, 0, 572, 574, 1, 0, 0, 0, 573, 571, 1, 0, 0, 0, 574, 575, 5, 10, 0, 0, 575, 576, 3, 148, 74, 0, 576, 577, 5, 5, 0, 0, 577, 79, 1, 0, 0, 0, 578, 583, 3, 94, 47, 0, 579, 583, 3, 96, 48, 0, 580, 583, 3, 98, 49, 0, 581, 583, 3, 100, 50, 0, 582, 578, 1, 0, 0, 0, 582, 579, 1, 0, 0, 0, 582, 580, 1, 0, 0, 0, 582, 581, 1, 0, 0, 0, 583, 81, 1, 0, 0, 0, 584, 586, 5, 8, 0, 0, 585, 584, 1, 0, 0, 0, 585, 586, 1, 0, 0, 0, 586, 587, 1, 0, 0, 0, 587, 588, 5, 114, 0, 0, 588, 589, 3, 104, 52, 0, 589, 83, 1, 0, 0, 0, 590, 592, 5, 8, 0, 0, 591, 590, 1, 0, 0, 0, 591, 592, 1, 0, 0, 0, 592, 593, 1, 0, 0, 0, 593, 594, 5, 114, 0, 0, 594, 595, 3, 102, 51, 0, 595, 85, 1, 0, 0, 0, 596, 599, 3, 82, 41, 0, 597, 599, 3, 84, 42, 0, 598, 596, 1, 0, 0, 0, 598, 597, 1, 0, 0, 0, 599, 87, 1, 0, 0, 0, 600, 602, 5, 8, 0, 0, 601, 600, 1, 0, 0, 0, 601, 602, 1, 0, 0, 0, 602, 603, 1, 0, 0, 0, 603, 604, 5, 114, 0, 0, 604, 605, 3, 108, 54, 0, 605, 89, 1, 0, 0, 0, 606, 608, 5, 8, 0, 0, 607, 606, 1, 0, 0, 0, 607, 608, 1, 0, 0, 0, 608, 609, 1, 0, 0, 0, 609, 610, 5, 114, 0, 0, 610, 611, 3, 110, 55, 0, 611, 91, 1, 0, 0, 0, 612, 614, 5, 8, 0, 0, 613, 612, 1, 0, 0, 0, 613, 614, 1, 0, 0, 0, 614, 615, 1, 0, 0, 0, 615, 616, 5, 114, 0, 0, 616, 617, 3, 112, 56, 0, 617, 93, 1, 0, 0, 0, 618, 623, 3, 86, 43, 0, 619, 623, 3, 88, 44, 0, 620, 623, 3, 90, 45, 0, 621, 623, 3, 92, 46, 0, 622, 618, 1, 0, 0, 0, 622, 619, 1, 0, 0, 0, 622, 620, 1, 0, 0, 0, 622, 621, 1, 0, 0, 0, 623, 95, 1, 0, 0, 0, 624, 625, 5, 112, 0, 0, 625, 97, 1, 0, 0, 0, 626, 627, 5, 113, 0, 0, 627, 99, 1, 0, 0, 0, 628, 629, 7, 0, 0, 0, 629, 101, 1, 0, 0, 0, 630, 631, 5, 105, 0, 0, 631, 103, 1, 0, 0, 0, 632, 633, 5, 106, 0, 0, 633, 105, 1, 0, 0, 0, 634, 637, 3, 102, 51, 0, 635, 637, 3, 104, 52, 0, 636, 634, 1, 0, 0, 0, 636, 635, 1, 0, 0, 0, 637, 107, 1, 0, 0, 0, 638, 639, 5, 107, 0, 0, 639, 109, 1, 0, 0, 0, 640, 641, 5, 17, 0, 0, 641, 111, 1, 0, 0, 0, 642, 643, 5, 108, 0, 0, 643, 113, 1, 0, 0, 0, 644, 649, 3, 106, 53, 0, 645, 649, 3, 108, 54, 0, 646, 649, 3, 110, 55, 0, 647, 649, 3, 112, 56, 0, 648, 644, 1, 0, 0, 0, 648, 645, 1, 0, 0, 0, 648, 646, 1, 0, 0, 0, 648, 647, 1, 0, 0, 0, 649, 115, 1, 0, 0, 0, 650, 651, 5, 109, 0, 0, 651, 117, 1, 0, 0, 0, 652, 653, 5, 110, 0, 0, 653, 119, 1, 0, 0, 0, 654, 655, 5, 111, 0, 0, 655, 121, 1, 0, 0, 0, 656, 661, 3, 114, 57, 0, 657, 661, 3, 116, 58, 0, 658, 661, 3, 120, 60, 0, 659, 661, 3, 118, 59, 0, 660, 656, 1, 0, 0, 0, 660, 657, 1, 0, 0, 0, 660, 658, 1, 0, 0, 0, 660, 659, 1, 0, 0, 0, 661, 123, 1, 0, 0, 0, 662, 663, 5, 3, 0, 0, 663, 664, 3, 126, 63, 0, 664, 665, 5, 5, 0, 0, 665, 666, 3, 84, 42, 0, 666, 667, 5, 4, 0, 0, 667, 125, 1, 0, 0, 0, 668, 672, 3, 122, 61, 0, 669, 672, 3, 124, 62, 0, 670, 672, 3, 196, 98, 0, 671, 668, 1, 0, 0, 0, 671, 669, 1, 0, 0, 0, 671, 670, 1, 0, 0, 0, 672, 127, 1, 0, 0, 0, 673, 674, 3, 126, 63, 0, 674, 675, 3, 138, 69, 0, 675, 683, 1, 0, 0, 0, 676, 677, 3, 196, 98, 0, 677, 678, 3, 138, 69, 0, 678, 683, 1, 0, 0, 0, 679, 680, 3, 164, 82, 0, 680, 681, 3, 138, 69, 0, 681, 683, 1, 0, 0, 0, 682, 673, 1, 0, 0, 0, 682, 676, 1, 0, 0, 0, 682, 679, 1, 0, 0, 0, 683, 129, 1, 0, 0, 0, 684, 685, 3, 126, 63, 0, 685, 686, 3, 138, 69, 0, 686, 131, 1, 0, 0, 0, 687, 688, 3, 126, 63, 0, 688, 689, 3, 138, 69, 0, 689, 694, 1, 0, 0, 0, 690, 691, 3, 164, 82, 0, 691, 692, 3, 138, 69, 0, 692, 694, 1, 0, 0, 0, 693, 687, 1, 0, 0, 0, 693, 690, 1, 0, 0, 0, 694, 133, 1, 0, 0, 0, 695, 696, 3, 126, 63, 0, 696, 697, 3, 138, 69, 0, 697, 135, 1, 0, 0, 0, 698, 699, 3, 164, 82, 0, 699, 700, 3, 138, 69, 0, 700, 706, 1, 0, 0, 0, 701, 702, 3, 196, 98, 0, 702, 703, 3, 138, 69, 0, 703, 706, 1, 0, 0, 0, 704, 706, 3, 126, 63, 0, 705, 698, 1, 0, 0, 0, 705, 701, 1, 0, 0, 0, 705, 704, 1, 0, 0, 0, 706, 137, 1, 0, 0, 0, 707, 708, 5, 1, 0, 0, 708, 709, 7, 1, 0, 0, 709, 139, 1, 0, 0, 0, 710, 711, 3, 142, 71, 0, 711, 712, 5, 1, 0, 0, 712, 713, 3, 144, 72, 0, 713, 141, 1, 0, 0, 0, 714, 715, 3, 196, 98, 0, 715, 143, 1, 0, 0, 0, 716, 717, 3, 196, 98, 0, 717, 145, 1, 0, 0, 0, 718, 719, 5, 115, 0, 0, 719, 147, 1, 0, 0, 0, 720, 724, 3, 146, 73, 0, 721, 723, 3, 150, 75, 0, 722, 721, 1, 0, 0, 0, 723, 726, 1, 0, 0, 0, 724, 722, 1, 0, 0, 0, 724, 725, 1, 0, 0, 0, 725, 149, 1, 0, 0, 0, 726, 724, 1, 0, 0, 0, 727, 730, 3, 152, 76, 0, 728, 730, 3, 154, 77, 0, 729, 727, 1, 0, 0, 0, 729, 728, 1, 0, 0, 0, 730, 151, 1, 0, 0, 0, 731, 732, 5, 1, 0, 0, 732, 733, 3, 196, 98, 0, 733, 153, 1, 0, 0, 0, 734, 735, 5, 3, 0, 0, 735, 736, 3, 84, 42, 0, 736, 737, 5, 4, 0, 0, 737, 742, 1, 0, 0, 0, 738, 739, 5, 3, 0, 0, 739, 740, 5, 114, 0, 0, 740, 742, 5, 4, 0, 0, 741, 734, 1, 0, 0, 0, 741, 738, 1, 0, 0, 0, 742, 155, 1, 0, 0, 0, 743, 748, 3, 80, 40, 0, 744, 748, 3, 148, 74, 0, 745, 748, 3, 140, 70, 0, 746, 748, 3, 158, 79, 0, 747, 743, 1, 0, 0, 0, 747, 744, 1, 0, 0, 0, 747, 745, 1, 0, 0, 0, 747, 746, 1, 0, 0, 0, 748, 157, 1, 0, 0, 0, 749, 750, 5, 17, 0, 0, 750, 751, 5, 6, 0, 0, 751, 759, 5, 18, 0, 0, 752, 753, 5, 19, 0, 0, 753, 754, 5, 1, 0, 0, 754, 759, 7, 2, 0, 0, 755, 756, 5, 22, 0, 0, 756, 757, 5, 1, 0, 0, 757, 759, 5, 23, 0, 0, 758, 749, 1, 0, 0, 0, 758, 752, 1, 0, 0, 0, 758, 755, 1, 0, 0, 0, 759, 159, 1, 0, 0, 0, 760, 761, 3, 196, 98, 0, 761, 762, 5, 9, 0, 0, 762, 763, 3, 126, 63, 0, 763, 764, 5, 5, 0, 0, 764, 161, 1, 0, 0, 0, 765, 766, 3, 196, 98, 0, 766, 767, 5, 9, 0, 0, 767, 768, 3, 134, 67, 0, 768, 769, 5, 5, 0, 0, 769, 163, 1, 0, 0, 0, 770, 771, 3, 140, 70, 0, 771, 772, 5, 2, 0, 0, 772, 773, 3, 196, 98, 0, 773, 165, 1, 0, 0, 0, 774, 778, 3, 136, 68, 0, 775, 778, 3, 164, 82, 0, 776, 778, 3, 168, 84, 0, 777, 774, 1, 0, 0, 0, 777, 775, 1, 0, 0, 0, 777, 776, 1, 0, 0, 0, 778, 167, 1, 0, 0, 0, 779, 780, 5, 17, 0, 0, 780, 781, 5, 1, 0, 0, 781, 782, 7, 3, 0, 0, 782, 169, 1, 0, 0, 0, 783, 786, 5, 42, 0, 0, 784, 785, 5, 1, 0, 0, 785, 787, 5, 24, 0, 0, 786, 784, 1, 0, 0, 0, 786, 787, 1, 0, 0, 0, 787, 795, 1, 0, 0, 0, 788, 795, 5, 43, 0, 0, 789, 795, 5, 44, 0, 0, 790, 795, 5, 45, 0, 0, 791, 795, 5, 46, 0, 0, 792, 795, 5, 47, 0, 0, 793, 795, 5, 48, 0, 0, 794, 783, 1, 0, 0, 0, 794, 788, 1, 0, 0, 0, 794, 789, 1, 0, 0, 0, 794, 790, 1, 0, 0, 0, 794, 791, 1, 0, 0, 0, 794, 792, 1, 0, 0, 0, 794, 793, 1, 0, 0, 0, 795, 171, 1, 0, 0, 0, 796, 799, 5, 49, 0, 0, 797, 798, 5, 1, 0, 0, 798, 800, 5, 24, 0, 0, 799, 797, 1, 0, 0, 0, 799, 800, 1, 0, 0, 0, 800, 847, 1, 0, 0, 0, 801, 804, 5, 50, 0, 0, 802, 803, 5, 1, 0, 0, 803, 805, 5, 24, 0, 0, 804, 802, 1, 0, 0, 0, 804, 805, 1, 0, 0, 0, 805, 847, 1, 0, 0, 0, 806, 809, 5, 51, 0, 0, 807, 808, 5, 1, 0, 0, 808, 810, 5, 24, 0, 0, 809, 807, 1, 0, 0, 0, 809, 810, 1, 0, 0, 0, 810, 847, 1, 0, 0, 0, 811, 814, 5, 52, 0, 0, 812, 813, 5, 1, 0, 0, 813, 815, 5, 24, 0, 0, 814, 812, 1, 0, 0, 0, 814, 815, 1, 0, 0, 0, 815, 847, 1, 0, 0, 0, 816, 819, 5, 53, 0, 0, 817, 818, 5, 1, 0, 0, 818, 820, 5, 24, 0, 0, 819, 817, 1, 0, 0, 0, 819, 820, 1, 0, 0, 0, 820, 847, 1, 0, 0, 0, 821, 824, 5, 54, 0, 0, 822, 823, 5, 1, 0, 0, 823, 825, 5, 24, 0, 0, 824, 822, 1, 0, 0, 0, 824, 825, 1, 0, 0, 0, 825, 847, 1, 0, 0, 0, 826, 829, 5, 55, 0, 0, 827, 828, 5, 1, 0, 0, 828, 830, 5, 24, 0, 0, 829, 827, 1, 0, 0, 0, 829, 830, 1, 0, 0, 0, 830, 847, 1, 0, 0, 0, 831, 834, 5, 56, 0, 0, 832, 833, 5, 1, 0, 0, 833, 835, 5, 24, 0, 0, 834, 832, 1, 0, 0, 0, 834, 835, 1, 0, 0, 0, 835, 847, 1, 0, 0, 0, 836, 847, 5, 57, 0, 0, 837, 847, 5, 58, 0, 0, 838, 847, 5, 59, 0, 0, 839, 847, 5, 60, 0, 0, 840, 847, 5, 61, 0, 0, 841, 847, 5, 62, 0, 0, 842, 847, 5, 63, 0, 0, 843, 847, 5, 64, 0, 0, 844, 847, 5, 65, 0, 0, 845, 847, 5, 66, 0, 0, 846, 796, 1, 0, 0, 0, 846, 801, 1, 0, 0, 0, 846, 806, 1, 0, 0, 0, 846, 811, 1, 0, 0, 0, 846, 816, 1, 0, 0, 0, 846, 821, 1, 0, 0, 0, 846, 826, 1, 0, 0, 0, 846, 831, 1, 0, 0, 0, 846, 836, 1, 0, 0, 0, 846, 837, 1, 0, 0, 0, 846, 838, 1, 0, 0, 0, 846, 839, 1, 0, 0, 0, 846, 840, 1, 0, 0, 0, 846, 841, 1, 0, 0, 0, 846, 842, 1, 0, 0, 0, 846, 843, 1, 0, 0, 0, 846, 844, 1, 0, 0, 0, 846, 845, 1, 0, 0, 0, 847, 173, 1, 0, 0, 0, 848, 849, 5, 67, 0, 0, 849, 850, 5, 1, 0, 0, 850, 851, 7, 4, 0, 0, 851, 175, 1, 0, 0, 0, 852, 853, 5, 70, 0, 0, 853, 854, 5, 1, 0, 0, 854, 855, 7, 4, 0, 0, 855, 177, 1, 0, 0, 0, 856, 857, 5, 71, 0, 0, 857, 858, 5, 1, 0, 0, 858, 859, 7, 5, 0, 0, 859, 179, 1, 0, 0, 0, 860, 861, 5, 72, 0, 0, 861, 862, 5, 1, 0, 0, 862, 863, 7, 6, 0, 0, 863, 181, 1, 0, 0, 0, 864, 865, 5, 73, 0, 0, 865, 866, 5, 1, 0, 0, 866, 867, 7, 7, 0, 0, 867, 183, 1, 0, 0, 0, 868, 871, 5, 89, 0, 0, 869, 870, 5, 1, 0, 0, 870, 872, 5, 90, 0, 0, 871, 869, 1, 0, 0, 0, 871, 872, 1, 0, 0, 0, 872, 185, 1, 0, 0, 0, 873, 874, 5, 91, 0, 0, 874, 875, 5, 1, 0, 0, 875, 876, 7, 4, 0, 0, 876, 187, 1, 0, 0, 0, 877, 878, 5, 32, 0, 0, 878, 879, 5, 1, 0, 0, 879, 880, 5, 33, 0, 0, 880, 189, 1, 0, 0, 0, 881, 882, 5, 28, 0, 0, 882, 883, 5, 1, 0, 0, 883, 884, 5, 29, 0, 0, 884, 191, 1, 0, 0, 0, 885, 886, 5, 37, 0, 0, 886, 887, 5, 1, 0, 0, 887, 890, 5, 38, 0, 0, 888, 890, 5, 39, 0, 0, 889, 885, 1, 0, 0, 0, 889, 888, 1, 0, 0, 0, 890, 193, 1, 0, 0, 0, 891, 892, 5, 116, 0, 0, 892, 195, 1, 0, 0, 0, 893, 894, 7, 8, 0, 0, 894, 197, 1, 0, 0, 0, 62, 203, 214, 216, 244, 252, 261, 267, 272, 293, 299, 305, 309, 329, 335, 354, 404, 414, 444, 488, 502, 517, 523, 537, 548, 553, 560, 562, 571, 582, 585, 591, 598, 601, 607, 613, 622, 636, 648, 660, 671, 682, 693, 705, 724, 729, 741, 747, 758, 777, 786, 794, 799, 804, 809, 814, 819, 824, 829, 834, 846, 871, 889] \ No newline at end of file diff --git a/vanguard/aleo/parser/AleoParser.py b/vanguard/aleo/parser/AleoParser.py index db5aae9..1d7122d 100644 --- a/vanguard/aleo/parser/AleoParser.py +++ b/vanguard/aleo/parser/AleoParser.py @@ -10,7 +10,7 @@ def serializedATN(): return [ - 4,1,119,895,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, + 4,1,119,896,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, @@ -36,53 +36,53 @@ def serializedATN(): 10,11,12,11,301,9,11,1,11,5,11,304,8,11,10,11,12,11,307,9,11,1,11, 3,11,310,8,11,1,12,1,12,1,12,1,12,1,12,1,12,1,13,1,13,1,13,1,13, 1,13,1,13,1,14,1,14,1,14,1,14,5,14,328,8,14,10,14,12,14,331,9,14, - 1,14,4,14,334,8,14,11,14,12,14,335,1,15,1,15,1,15,1,15,1,15,1,15, - 1,16,1,16,1,16,1,16,1,16,1,16,1,16,1,16,1,16,1,16,3,16,354,8,16, - 1,17,1,17,1,17,1,17,1,17,1,17,1,17,1,17,1,17,1,18,1,18,1,18,1,18, - 1,18,1,18,1,18,1,18,1,18,1,19,1,19,1,19,1,19,1,19,1,19,1,19,1,19, - 1,19,1,19,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,21,1,21, - 1,21,1,21,1,21,1,21,1,21,1,22,1,22,5,22,402,8,22,10,22,12,22,405, - 9,22,1,22,1,22,1,22,1,22,1,22,1,22,1,22,3,22,414,8,22,1,22,1,22, - 1,23,1,23,1,23,1,23,1,24,1,24,1,24,1,24,1,24,1,24,1,24,1,25,1,25, - 1,25,1,25,1,26,1,26,1,26,1,26,1,26,1,26,1,26,1,26,1,26,1,26,1,26, - 3,26,444,8,26,1,27,1,27,1,27,1,27,1,27,1,27,1,28,1,28,1,28,1,28, - 1,28,1,28,1,28,1,29,1,29,1,29,1,29,1,29,1,29,1,29,1,29,1,30,1,30, - 1,30,1,30,1,30,1,30,1,30,1,31,1,31,1,31,1,31,1,31,1,32,1,32,1,32, - 1,32,1,32,1,32,1,32,1,32,1,32,3,32,488,8,32,1,32,1,32,1,33,1,33, - 1,33,1,33,1,33,1,33,1,33,1,33,1,33,1,33,3,33,502,8,33,1,33,1,33, - 1,34,1,34,1,34,1,34,1,34,1,34,1,34,1,34,1,34,1,34,1,34,3,34,517, - 8,34,1,34,1,34,1,35,1,35,3,35,523,8,35,1,36,1,36,1,36,1,36,1,36, - 1,36,1,36,1,36,1,37,1,37,4,37,535,8,37,11,37,12,37,536,1,37,1,37, - 1,37,1,37,1,37,1,37,1,38,1,38,1,38,3,38,548,8,38,1,38,5,38,551,8, - 38,10,38,12,38,554,9,38,1,38,1,38,4,38,558,8,38,11,38,12,38,559, - 3,38,562,8,38,1,38,1,38,1,39,1,39,1,39,5,39,569,8,39,10,39,12,39, - 572,9,39,1,39,1,39,1,39,1,39,1,40,1,40,1,40,1,40,3,40,582,8,40,1, - 41,3,41,585,8,41,1,41,1,41,1,41,1,42,3,42,591,8,42,1,42,1,42,1,42, - 1,43,1,43,3,43,598,8,43,1,44,3,44,601,8,44,1,44,1,44,1,44,1,45,3, - 45,607,8,45,1,45,1,45,1,45,1,46,3,46,613,8,46,1,46,1,46,1,46,1,47, - 1,47,1,47,1,47,3,47,622,8,47,1,48,1,48,1,49,1,49,1,50,1,50,1,51, - 1,51,1,52,1,52,1,53,1,53,3,53,636,8,53,1,54,1,54,1,55,1,55,1,56, - 1,56,1,57,1,57,1,57,1,57,3,57,648,8,57,1,58,1,58,1,59,1,59,1,60, - 1,60,1,61,1,61,1,61,1,61,3,61,660,8,61,1,62,1,62,1,62,1,62,1,62, - 1,62,1,63,1,63,1,63,3,63,671,8,63,1,64,1,64,1,64,1,64,1,64,1,64, - 1,64,1,64,1,64,3,64,682,8,64,1,65,1,65,1,65,1,66,1,66,1,66,1,66, - 1,66,1,66,3,66,693,8,66,1,67,1,67,1,67,1,68,1,68,1,68,1,68,1,68, - 1,68,1,68,3,68,705,8,68,1,69,1,69,1,69,1,70,1,70,1,70,1,70,1,71, - 1,71,1,72,1,72,1,73,1,73,1,74,1,74,5,74,722,8,74,10,74,12,74,725, - 9,74,1,75,1,75,3,75,729,8,75,1,76,1,76,1,76,1,77,1,77,1,77,1,77, - 1,77,1,77,1,77,3,77,741,8,77,1,78,1,78,1,78,1,78,3,78,747,8,78,1, - 79,1,79,1,79,1,79,1,79,1,79,1,79,1,79,1,79,3,79,758,8,79,1,80,1, + 1,14,5,14,334,8,14,10,14,12,14,337,9,14,1,15,1,15,1,15,1,15,1,15, + 1,15,1,16,1,16,1,16,1,16,1,16,1,16,1,16,1,16,1,16,1,16,3,16,355, + 8,16,1,17,1,17,1,17,1,17,1,17,1,17,1,17,1,17,1,17,1,18,1,18,1,18, + 1,18,1,18,1,18,1,18,1,18,1,18,1,19,1,19,1,19,1,19,1,19,1,19,1,19, + 1,19,1,19,1,19,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,21, + 1,21,1,21,1,21,1,21,1,21,1,21,1,22,1,22,5,22,403,8,22,10,22,12,22, + 406,9,22,1,22,1,22,1,22,1,22,1,22,1,22,1,22,3,22,415,8,22,1,22,1, + 22,1,23,1,23,1,23,1,23,1,24,1,24,1,24,1,24,1,24,1,24,1,24,1,25,1, + 25,1,25,1,25,1,26,1,26,1,26,1,26,1,26,1,26,1,26,1,26,1,26,1,26,1, + 26,3,26,445,8,26,1,27,1,27,1,27,1,27,1,27,1,27,1,28,1,28,1,28,1, + 28,1,28,1,28,1,28,1,29,1,29,1,29,1,29,1,29,1,29,1,29,1,29,1,30,1, + 30,1,30,1,30,1,30,1,30,1,30,1,31,1,31,1,31,1,31,1,31,1,32,1,32,1, + 32,1,32,1,32,1,32,1,32,1,32,1,32,3,32,489,8,32,1,32,1,32,1,33,1, + 33,1,33,1,33,1,33,1,33,1,33,1,33,1,33,1,33,3,33,503,8,33,1,33,1, + 33,1,34,1,34,1,34,1,34,1,34,1,34,1,34,1,34,1,34,1,34,1,34,3,34,518, + 8,34,1,34,1,34,1,35,1,35,3,35,524,8,35,1,36,1,36,1,36,1,36,1,36, + 1,36,1,36,1,36,1,37,1,37,4,37,536,8,37,11,37,12,37,537,1,37,1,37, + 1,37,1,37,1,37,1,37,1,38,1,38,1,38,3,38,549,8,38,1,38,5,38,552,8, + 38,10,38,12,38,555,9,38,1,38,1,38,4,38,559,8,38,11,38,12,38,560, + 3,38,563,8,38,1,38,1,38,1,39,1,39,1,39,5,39,570,8,39,10,39,12,39, + 573,9,39,1,39,1,39,1,39,1,39,1,40,1,40,1,40,1,40,3,40,583,8,40,1, + 41,3,41,586,8,41,1,41,1,41,1,41,1,42,3,42,592,8,42,1,42,1,42,1,42, + 1,43,1,43,3,43,599,8,43,1,44,3,44,602,8,44,1,44,1,44,1,44,1,45,3, + 45,608,8,45,1,45,1,45,1,45,1,46,3,46,614,8,46,1,46,1,46,1,46,1,47, + 1,47,1,47,1,47,3,47,623,8,47,1,48,1,48,1,49,1,49,1,50,1,50,1,51, + 1,51,1,52,1,52,1,53,1,53,3,53,637,8,53,1,54,1,54,1,55,1,55,1,56, + 1,56,1,57,1,57,1,57,1,57,3,57,649,8,57,1,58,1,58,1,59,1,59,1,60, + 1,60,1,61,1,61,1,61,1,61,3,61,661,8,61,1,62,1,62,1,62,1,62,1,62, + 1,62,1,63,1,63,1,63,3,63,672,8,63,1,64,1,64,1,64,1,64,1,64,1,64, + 1,64,1,64,1,64,3,64,683,8,64,1,65,1,65,1,65,1,66,1,66,1,66,1,66, + 1,66,1,66,3,66,694,8,66,1,67,1,67,1,67,1,68,1,68,1,68,1,68,1,68, + 1,68,1,68,3,68,706,8,68,1,69,1,69,1,69,1,70,1,70,1,70,1,70,1,71, + 1,71,1,72,1,72,1,73,1,73,1,74,1,74,5,74,723,8,74,10,74,12,74,726, + 9,74,1,75,1,75,3,75,730,8,75,1,76,1,76,1,76,1,77,1,77,1,77,1,77, + 1,77,1,77,1,77,3,77,742,8,77,1,78,1,78,1,78,1,78,3,78,748,8,78,1, + 79,1,79,1,79,1,79,1,79,1,79,1,79,1,79,1,79,3,79,759,8,79,1,80,1, 80,1,80,1,80,1,80,1,81,1,81,1,81,1,81,1,81,1,82,1,82,1,82,1,82,1, - 83,1,83,1,83,3,83,777,8,83,1,84,1,84,1,84,1,84,1,85,1,85,1,85,3, - 85,786,8,85,1,85,1,85,1,85,1,85,1,85,1,85,3,85,794,8,85,1,86,1,86, - 1,86,3,86,799,8,86,1,86,1,86,1,86,3,86,804,8,86,1,86,1,86,1,86,3, - 86,809,8,86,1,86,1,86,1,86,3,86,814,8,86,1,86,1,86,1,86,3,86,819, - 8,86,1,86,1,86,1,86,3,86,824,8,86,1,86,1,86,1,86,3,86,829,8,86,1, - 86,1,86,1,86,3,86,834,8,86,1,86,1,86,1,86,1,86,1,86,1,86,1,86,1, - 86,1,86,1,86,3,86,846,8,86,1,87,1,87,1,87,1,87,1,88,1,88,1,88,1, + 83,1,83,1,83,3,83,778,8,83,1,84,1,84,1,84,1,84,1,85,1,85,1,85,3, + 85,787,8,85,1,85,1,85,1,85,1,85,1,85,1,85,3,85,795,8,85,1,86,1,86, + 1,86,3,86,800,8,86,1,86,1,86,1,86,3,86,805,8,86,1,86,1,86,1,86,3, + 86,810,8,86,1,86,1,86,1,86,3,86,815,8,86,1,86,1,86,1,86,3,86,820, + 8,86,1,86,1,86,1,86,3,86,825,8,86,1,86,1,86,1,86,3,86,830,8,86,1, + 86,1,86,1,86,3,86,835,8,86,1,86,1,86,1,86,1,86,1,86,1,86,1,86,1, + 86,1,86,1,86,3,86,847,8,86,1,87,1,87,1,87,1,87,1,88,1,88,1,88,1, 88,1,89,1,89,1,89,1,89,1,90,1,90,1,90,1,90,1,91,1,91,1,91,1,91,1, - 92,1,92,1,92,3,92,871,8,92,1,93,1,93,1,93,1,93,1,94,1,94,1,94,1, - 94,1,95,1,95,1,95,1,95,1,96,1,96,1,96,1,96,3,96,889,8,96,1,97,1, + 92,1,92,1,92,3,92,872,8,92,1,93,1,93,1,93,1,93,1,94,1,94,1,94,1, + 94,1,95,1,95,1,95,1,95,1,96,1,96,1,96,1,96,3,96,890,8,96,1,97,1, 97,1,98,1,98,1,98,0,0,99,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, @@ -90,30 +90,30 @@ def serializedATN(): 146,148,150,152,154,156,158,160,162,164,166,168,170,172,174,176, 178,180,182,184,186,188,190,192,194,196,0,9,1,0,103,104,1,0,12,16, 1,0,20,21,1,0,25,26,1,0,68,69,1,0,74,79,1,0,74,88,1,0,80,82,2,0, - 9,113,115,116,922,0,198,1,0,0,0,2,203,1,0,0,0,4,218,1,0,0,0,6,222, + 9,113,115,116,923,0,198,1,0,0,0,2,203,1,0,0,0,4,218,1,0,0,0,6,222, 1,0,0,0,8,228,1,0,0,0,10,233,1,0,0,0,12,238,1,0,0,0,14,246,1,0,0, 0,16,255,1,0,0,0,18,275,1,0,0,0,20,281,1,0,0,0,22,287,1,0,0,0,24, - 311,1,0,0,0,26,317,1,0,0,0,28,323,1,0,0,0,30,337,1,0,0,0,32,353, - 1,0,0,0,34,355,1,0,0,0,36,364,1,0,0,0,38,373,1,0,0,0,40,383,1,0, - 0,0,42,392,1,0,0,0,44,399,1,0,0,0,46,417,1,0,0,0,48,421,1,0,0,0, - 50,428,1,0,0,0,52,443,1,0,0,0,54,445,1,0,0,0,56,451,1,0,0,0,58,458, - 1,0,0,0,60,466,1,0,0,0,62,473,1,0,0,0,64,478,1,0,0,0,66,491,1,0, - 0,0,68,505,1,0,0,0,70,522,1,0,0,0,72,524,1,0,0,0,74,532,1,0,0,0, - 76,544,1,0,0,0,78,565,1,0,0,0,80,581,1,0,0,0,82,584,1,0,0,0,84,590, - 1,0,0,0,86,597,1,0,0,0,88,600,1,0,0,0,90,606,1,0,0,0,92,612,1,0, - 0,0,94,621,1,0,0,0,96,623,1,0,0,0,98,625,1,0,0,0,100,627,1,0,0,0, - 102,629,1,0,0,0,104,631,1,0,0,0,106,635,1,0,0,0,108,637,1,0,0,0, - 110,639,1,0,0,0,112,641,1,0,0,0,114,647,1,0,0,0,116,649,1,0,0,0, - 118,651,1,0,0,0,120,653,1,0,0,0,122,659,1,0,0,0,124,661,1,0,0,0, - 126,670,1,0,0,0,128,681,1,0,0,0,130,683,1,0,0,0,132,692,1,0,0,0, - 134,694,1,0,0,0,136,704,1,0,0,0,138,706,1,0,0,0,140,709,1,0,0,0, - 142,713,1,0,0,0,144,715,1,0,0,0,146,717,1,0,0,0,148,719,1,0,0,0, - 150,728,1,0,0,0,152,730,1,0,0,0,154,740,1,0,0,0,156,746,1,0,0,0, - 158,757,1,0,0,0,160,759,1,0,0,0,162,764,1,0,0,0,164,769,1,0,0,0, - 166,776,1,0,0,0,168,778,1,0,0,0,170,793,1,0,0,0,172,845,1,0,0,0, - 174,847,1,0,0,0,176,851,1,0,0,0,178,855,1,0,0,0,180,859,1,0,0,0, - 182,863,1,0,0,0,184,867,1,0,0,0,186,872,1,0,0,0,188,876,1,0,0,0, - 190,880,1,0,0,0,192,888,1,0,0,0,194,890,1,0,0,0,196,892,1,0,0,0, + 311,1,0,0,0,26,317,1,0,0,0,28,323,1,0,0,0,30,338,1,0,0,0,32,354, + 1,0,0,0,34,356,1,0,0,0,36,365,1,0,0,0,38,374,1,0,0,0,40,384,1,0, + 0,0,42,393,1,0,0,0,44,400,1,0,0,0,46,418,1,0,0,0,48,422,1,0,0,0, + 50,429,1,0,0,0,52,444,1,0,0,0,54,446,1,0,0,0,56,452,1,0,0,0,58,459, + 1,0,0,0,60,467,1,0,0,0,62,474,1,0,0,0,64,479,1,0,0,0,66,492,1,0, + 0,0,68,506,1,0,0,0,70,523,1,0,0,0,72,525,1,0,0,0,74,533,1,0,0,0, + 76,545,1,0,0,0,78,566,1,0,0,0,80,582,1,0,0,0,82,585,1,0,0,0,84,591, + 1,0,0,0,86,598,1,0,0,0,88,601,1,0,0,0,90,607,1,0,0,0,92,613,1,0, + 0,0,94,622,1,0,0,0,96,624,1,0,0,0,98,626,1,0,0,0,100,628,1,0,0,0, + 102,630,1,0,0,0,104,632,1,0,0,0,106,636,1,0,0,0,108,638,1,0,0,0, + 110,640,1,0,0,0,112,642,1,0,0,0,114,648,1,0,0,0,116,650,1,0,0,0, + 118,652,1,0,0,0,120,654,1,0,0,0,122,660,1,0,0,0,124,662,1,0,0,0, + 126,671,1,0,0,0,128,682,1,0,0,0,130,684,1,0,0,0,132,693,1,0,0,0, + 134,695,1,0,0,0,136,705,1,0,0,0,138,707,1,0,0,0,140,710,1,0,0,0, + 142,714,1,0,0,0,144,716,1,0,0,0,146,718,1,0,0,0,148,720,1,0,0,0, + 150,729,1,0,0,0,152,731,1,0,0,0,154,741,1,0,0,0,156,747,1,0,0,0, + 158,758,1,0,0,0,160,760,1,0,0,0,162,765,1,0,0,0,164,770,1,0,0,0, + 166,777,1,0,0,0,168,779,1,0,0,0,170,794,1,0,0,0,172,846,1,0,0,0, + 174,848,1,0,0,0,176,852,1,0,0,0,178,856,1,0,0,0,180,860,1,0,0,0, + 182,864,1,0,0,0,184,868,1,0,0,0,186,873,1,0,0,0,188,877,1,0,0,0, + 190,881,1,0,0,0,192,889,1,0,0,0,194,891,1,0,0,0,196,893,1,0,0,0, 198,199,3,2,1,0,199,1,1,0,0,0,200,202,3,4,2,0,201,200,1,0,0,0,202, 205,1,0,0,0,203,201,1,0,0,0,203,204,1,0,0,0,204,206,1,0,0,0,205, 203,1,0,0,0,206,207,5,92,0,0,207,208,3,140,70,0,208,214,5,5,0,0, @@ -151,187 +151,187 @@ def serializedATN(): 5,100,0,0,318,319,3,156,78,0,319,320,5,9,0,0,320,321,3,128,64,0, 321,322,5,5,0,0,322,27,1,0,0,0,323,324,5,102,0,0,324,325,3,196,98, 0,325,329,5,7,0,0,326,328,3,30,15,0,327,326,1,0,0,0,328,331,1,0, - 0,0,329,327,1,0,0,0,329,330,1,0,0,0,330,333,1,0,0,0,331,329,1,0, - 0,0,332,334,3,32,16,0,333,332,1,0,0,0,334,335,1,0,0,0,335,333,1, - 0,0,0,335,336,1,0,0,0,336,29,1,0,0,0,337,338,5,99,0,0,338,339,3, - 146,73,0,339,340,5,9,0,0,340,341,3,132,66,0,341,342,5,5,0,0,342, - 31,1,0,0,0,343,354,3,34,17,0,344,354,3,36,18,0,345,354,3,38,19,0, - 346,354,3,40,20,0,347,354,3,42,21,0,348,354,3,44,22,0,349,354,3, - 46,23,0,350,354,3,48,24,0,351,354,3,50,25,0,352,354,3,52,26,0,353, - 343,1,0,0,0,353,344,1,0,0,0,353,345,1,0,0,0,353,346,1,0,0,0,353, - 347,1,0,0,0,353,348,1,0,0,0,353,349,1,0,0,0,353,350,1,0,0,0,353, - 351,1,0,0,0,353,352,1,0,0,0,354,33,1,0,0,0,355,356,5,27,0,0,356, - 357,3,196,98,0,357,358,5,3,0,0,358,359,3,156,78,0,359,360,5,4,0, - 0,360,361,5,10,0,0,361,362,3,148,74,0,362,363,5,5,0,0,363,35,1,0, - 0,0,364,365,5,28,0,0,365,366,3,196,98,0,366,367,5,3,0,0,367,368, - 3,156,78,0,368,369,5,4,0,0,369,370,5,10,0,0,370,371,3,148,74,0,371, - 372,5,5,0,0,372,37,1,0,0,0,373,374,3,190,95,0,374,375,3,196,98,0, - 375,376,5,3,0,0,376,377,3,156,78,0,377,378,5,4,0,0,378,379,3,156, - 78,0,379,380,5,10,0,0,380,381,3,148,74,0,381,382,5,5,0,0,382,39, - 1,0,0,0,383,384,5,30,0,0,384,385,3,156,78,0,385,386,5,10,0,0,386, - 387,3,196,98,0,387,388,5,3,0,0,388,389,3,156,78,0,389,390,5,4,0, - 0,390,391,5,5,0,0,391,41,1,0,0,0,392,393,5,31,0,0,393,394,3,196, - 98,0,394,395,5,3,0,0,395,396,3,156,78,0,396,397,5,4,0,0,397,398, - 5,5,0,0,398,43,1,0,0,0,399,403,3,188,94,0,400,402,3,156,78,0,401, - 400,1,0,0,0,402,405,1,0,0,0,403,401,1,0,0,0,403,404,1,0,0,0,404, - 406,1,0,0,0,405,403,1,0,0,0,406,407,5,10,0,0,407,408,3,148,74,0, - 408,413,5,9,0,0,409,414,3,114,57,0,410,414,3,116,58,0,411,414,3, - 120,60,0,412,414,3,118,59,0,413,409,1,0,0,0,413,410,1,0,0,0,413, - 411,1,0,0,0,413,412,1,0,0,0,414,415,1,0,0,0,415,416,5,5,0,0,416, - 45,1,0,0,0,417,418,5,34,0,0,418,419,3,194,97,0,419,420,5,5,0,0,420, - 47,1,0,0,0,421,422,3,186,93,0,422,423,3,156,78,0,423,424,3,156,78, - 0,424,425,5,11,0,0,425,426,3,194,97,0,426,427,5,5,0,0,427,49,1,0, - 0,0,428,429,5,35,0,0,429,430,3,148,74,0,430,431,5,5,0,0,431,51,1, - 0,0,0,432,444,3,54,27,0,433,444,3,56,28,0,434,444,3,58,29,0,435, - 444,3,60,30,0,436,444,3,62,31,0,437,444,3,64,32,0,438,444,3,70,35, - 0,439,444,3,72,36,0,440,444,3,74,37,0,441,444,3,76,38,0,442,444, - 3,78,39,0,443,432,1,0,0,0,443,433,1,0,0,0,443,434,1,0,0,0,443,435, - 1,0,0,0,443,436,1,0,0,0,443,437,1,0,0,0,443,438,1,0,0,0,443,439, - 1,0,0,0,443,440,1,0,0,0,443,441,1,0,0,0,443,442,1,0,0,0,444,53,1, - 0,0,0,445,446,3,170,85,0,446,447,3,156,78,0,447,448,5,10,0,0,448, - 449,3,148,74,0,449,450,5,5,0,0,450,55,1,0,0,0,451,452,3,172,86,0, - 452,453,3,156,78,0,453,454,3,156,78,0,454,455,5,10,0,0,455,456,3, - 148,74,0,456,457,5,5,0,0,457,57,1,0,0,0,458,459,5,36,0,0,459,460, - 3,156,78,0,460,461,3,156,78,0,461,462,3,156,78,0,462,463,5,10,0, - 0,463,464,3,148,74,0,464,465,5,5,0,0,465,59,1,0,0,0,466,467,3,174, - 87,0,467,468,3,156,78,0,468,469,3,156,78,0,469,470,5,10,0,0,470, - 471,3,148,74,0,471,472,5,5,0,0,472,61,1,0,0,0,473,474,3,176,88,0, - 474,475,3,156,78,0,475,476,3,156,78,0,476,477,5,5,0,0,477,63,1,0, - 0,0,478,479,3,178,89,0,479,480,3,156,78,0,480,481,3,156,78,0,481, - 482,5,10,0,0,482,483,3,148,74,0,483,487,5,9,0,0,484,488,3,116,58, - 0,485,488,3,108,54,0,486,488,3,110,55,0,487,484,1,0,0,0,487,485, - 1,0,0,0,487,486,1,0,0,0,488,489,1,0,0,0,489,490,5,5,0,0,490,65,1, - 0,0,0,491,492,3,180,90,0,492,493,3,156,78,0,493,494,5,10,0,0,494, - 495,3,148,74,0,495,501,5,9,0,0,496,502,3,114,57,0,497,502,3,116, - 58,0,498,502,3,120,60,0,499,502,3,124,62,0,500,502,3,196,98,0,501, - 496,1,0,0,0,501,497,1,0,0,0,501,498,1,0,0,0,501,499,1,0,0,0,501, - 500,1,0,0,0,502,503,1,0,0,0,503,504,5,5,0,0,504,67,1,0,0,0,505,506, - 3,182,91,0,506,507,3,156,78,0,507,508,3,156,78,0,508,509,5,10,0, - 0,509,510,3,148,74,0,510,516,5,9,0,0,511,517,3,114,57,0,512,517, - 3,116,58,0,513,517,3,120,60,0,514,517,3,124,62,0,515,517,3,196,98, - 0,516,511,1,0,0,0,516,512,1,0,0,0,516,513,1,0,0,0,516,514,1,0,0, - 0,516,515,1,0,0,0,517,518,1,0,0,0,518,519,5,5,0,0,519,69,1,0,0,0, - 520,523,3,66,33,0,521,523,3,68,34,0,522,520,1,0,0,0,522,521,1,0, - 0,0,523,71,1,0,0,0,524,525,3,192,96,0,525,526,3,156,78,0,526,527, - 3,156,78,0,527,528,3,156,78,0,528,529,5,10,0,0,529,530,3,148,74, - 0,530,531,5,5,0,0,531,73,1,0,0,0,532,534,3,184,92,0,533,535,3,156, - 78,0,534,533,1,0,0,0,535,536,1,0,0,0,536,534,1,0,0,0,536,537,1,0, - 0,0,537,538,1,0,0,0,538,539,5,10,0,0,539,540,3,148,74,0,540,541, - 5,9,0,0,541,542,3,166,83,0,542,543,5,5,0,0,543,75,1,0,0,0,544,547, - 5,40,0,0,545,548,3,164,82,0,546,548,3,196,98,0,547,545,1,0,0,0,547, - 546,1,0,0,0,548,552,1,0,0,0,549,551,3,156,78,0,550,549,1,0,0,0,551, - 554,1,0,0,0,552,550,1,0,0,0,552,553,1,0,0,0,553,561,1,0,0,0,554, - 552,1,0,0,0,555,557,5,10,0,0,556,558,3,148,74,0,557,556,1,0,0,0, - 558,559,1,0,0,0,559,557,1,0,0,0,559,560,1,0,0,0,560,562,1,0,0,0, - 561,555,1,0,0,0,561,562,1,0,0,0,562,563,1,0,0,0,563,564,5,5,0,0, - 564,77,1,0,0,0,565,566,5,41,0,0,566,570,3,196,98,0,567,569,3,156, - 78,0,568,567,1,0,0,0,569,572,1,0,0,0,570,568,1,0,0,0,570,571,1,0, - 0,0,571,573,1,0,0,0,572,570,1,0,0,0,573,574,5,10,0,0,574,575,3,148, - 74,0,575,576,5,5,0,0,576,79,1,0,0,0,577,582,3,94,47,0,578,582,3, - 96,48,0,579,582,3,98,49,0,580,582,3,100,50,0,581,577,1,0,0,0,581, - 578,1,0,0,0,581,579,1,0,0,0,581,580,1,0,0,0,582,81,1,0,0,0,583,585, - 5,8,0,0,584,583,1,0,0,0,584,585,1,0,0,0,585,586,1,0,0,0,586,587, - 5,114,0,0,587,588,3,104,52,0,588,83,1,0,0,0,589,591,5,8,0,0,590, - 589,1,0,0,0,590,591,1,0,0,0,591,592,1,0,0,0,592,593,5,114,0,0,593, - 594,3,102,51,0,594,85,1,0,0,0,595,598,3,82,41,0,596,598,3,84,42, - 0,597,595,1,0,0,0,597,596,1,0,0,0,598,87,1,0,0,0,599,601,5,8,0,0, - 600,599,1,0,0,0,600,601,1,0,0,0,601,602,1,0,0,0,602,603,5,114,0, - 0,603,604,3,108,54,0,604,89,1,0,0,0,605,607,5,8,0,0,606,605,1,0, - 0,0,606,607,1,0,0,0,607,608,1,0,0,0,608,609,5,114,0,0,609,610,3, - 110,55,0,610,91,1,0,0,0,611,613,5,8,0,0,612,611,1,0,0,0,612,613, - 1,0,0,0,613,614,1,0,0,0,614,615,5,114,0,0,615,616,3,112,56,0,616, - 93,1,0,0,0,617,622,3,86,43,0,618,622,3,88,44,0,619,622,3,90,45,0, - 620,622,3,92,46,0,621,617,1,0,0,0,621,618,1,0,0,0,621,619,1,0,0, - 0,621,620,1,0,0,0,622,95,1,0,0,0,623,624,5,112,0,0,624,97,1,0,0, - 0,625,626,5,113,0,0,626,99,1,0,0,0,627,628,7,0,0,0,628,101,1,0,0, - 0,629,630,5,105,0,0,630,103,1,0,0,0,631,632,5,106,0,0,632,105,1, - 0,0,0,633,636,3,102,51,0,634,636,3,104,52,0,635,633,1,0,0,0,635, - 634,1,0,0,0,636,107,1,0,0,0,637,638,5,107,0,0,638,109,1,0,0,0,639, - 640,5,17,0,0,640,111,1,0,0,0,641,642,5,108,0,0,642,113,1,0,0,0,643, - 648,3,106,53,0,644,648,3,108,54,0,645,648,3,110,55,0,646,648,3,112, - 56,0,647,643,1,0,0,0,647,644,1,0,0,0,647,645,1,0,0,0,647,646,1,0, - 0,0,648,115,1,0,0,0,649,650,5,109,0,0,650,117,1,0,0,0,651,652,5, - 110,0,0,652,119,1,0,0,0,653,654,5,111,0,0,654,121,1,0,0,0,655,660, - 3,114,57,0,656,660,3,116,58,0,657,660,3,120,60,0,658,660,3,118,59, - 0,659,655,1,0,0,0,659,656,1,0,0,0,659,657,1,0,0,0,659,658,1,0,0, - 0,660,123,1,0,0,0,661,662,5,3,0,0,662,663,3,126,63,0,663,664,5,5, - 0,0,664,665,3,84,42,0,665,666,5,4,0,0,666,125,1,0,0,0,667,671,3, - 122,61,0,668,671,3,124,62,0,669,671,3,196,98,0,670,667,1,0,0,0,670, - 668,1,0,0,0,670,669,1,0,0,0,671,127,1,0,0,0,672,673,3,126,63,0,673, - 674,3,138,69,0,674,682,1,0,0,0,675,676,3,196,98,0,676,677,3,138, - 69,0,677,682,1,0,0,0,678,679,3,164,82,0,679,680,3,138,69,0,680,682, - 1,0,0,0,681,672,1,0,0,0,681,675,1,0,0,0,681,678,1,0,0,0,682,129, - 1,0,0,0,683,684,3,126,63,0,684,685,3,138,69,0,685,131,1,0,0,0,686, - 687,3,126,63,0,687,688,3,138,69,0,688,693,1,0,0,0,689,690,3,164, - 82,0,690,691,3,138,69,0,691,693,1,0,0,0,692,686,1,0,0,0,692,689, - 1,0,0,0,693,133,1,0,0,0,694,695,3,126,63,0,695,696,3,138,69,0,696, - 135,1,0,0,0,697,698,3,164,82,0,698,699,3,138,69,0,699,705,1,0,0, - 0,700,701,3,196,98,0,701,702,3,138,69,0,702,705,1,0,0,0,703,705, - 3,126,63,0,704,697,1,0,0,0,704,700,1,0,0,0,704,703,1,0,0,0,705,137, - 1,0,0,0,706,707,5,1,0,0,707,708,7,1,0,0,708,139,1,0,0,0,709,710, - 3,142,71,0,710,711,5,1,0,0,711,712,3,144,72,0,712,141,1,0,0,0,713, - 714,3,196,98,0,714,143,1,0,0,0,715,716,3,196,98,0,716,145,1,0,0, - 0,717,718,5,115,0,0,718,147,1,0,0,0,719,723,3,146,73,0,720,722,3, - 150,75,0,721,720,1,0,0,0,722,725,1,0,0,0,723,721,1,0,0,0,723,724, - 1,0,0,0,724,149,1,0,0,0,725,723,1,0,0,0,726,729,3,152,76,0,727,729, - 3,154,77,0,728,726,1,0,0,0,728,727,1,0,0,0,729,151,1,0,0,0,730,731, - 5,1,0,0,731,732,3,196,98,0,732,153,1,0,0,0,733,734,5,3,0,0,734,735, - 3,84,42,0,735,736,5,4,0,0,736,741,1,0,0,0,737,738,5,3,0,0,738,739, - 5,114,0,0,739,741,5,4,0,0,740,733,1,0,0,0,740,737,1,0,0,0,741,155, - 1,0,0,0,742,747,3,80,40,0,743,747,3,148,74,0,744,747,3,140,70,0, - 745,747,3,158,79,0,746,742,1,0,0,0,746,743,1,0,0,0,746,744,1,0,0, - 0,746,745,1,0,0,0,747,157,1,0,0,0,748,749,5,17,0,0,749,750,5,6,0, - 0,750,758,5,18,0,0,751,752,5,19,0,0,752,753,5,1,0,0,753,758,7,2, - 0,0,754,755,5,22,0,0,755,756,5,1,0,0,756,758,5,23,0,0,757,748,1, - 0,0,0,757,751,1,0,0,0,757,754,1,0,0,0,758,159,1,0,0,0,759,760,3, - 196,98,0,760,761,5,9,0,0,761,762,3,126,63,0,762,763,5,5,0,0,763, - 161,1,0,0,0,764,765,3,196,98,0,765,766,5,9,0,0,766,767,3,134,67, - 0,767,768,5,5,0,0,768,163,1,0,0,0,769,770,3,140,70,0,770,771,5,2, - 0,0,771,772,3,196,98,0,772,165,1,0,0,0,773,777,3,136,68,0,774,777, - 3,164,82,0,775,777,3,168,84,0,776,773,1,0,0,0,776,774,1,0,0,0,776, - 775,1,0,0,0,777,167,1,0,0,0,778,779,5,17,0,0,779,780,5,1,0,0,780, - 781,7,3,0,0,781,169,1,0,0,0,782,785,5,42,0,0,783,784,5,1,0,0,784, - 786,5,24,0,0,785,783,1,0,0,0,785,786,1,0,0,0,786,794,1,0,0,0,787, - 794,5,43,0,0,788,794,5,44,0,0,789,794,5,45,0,0,790,794,5,46,0,0, - 791,794,5,47,0,0,792,794,5,48,0,0,793,782,1,0,0,0,793,787,1,0,0, - 0,793,788,1,0,0,0,793,789,1,0,0,0,793,790,1,0,0,0,793,791,1,0,0, - 0,793,792,1,0,0,0,794,171,1,0,0,0,795,798,5,49,0,0,796,797,5,1,0, - 0,797,799,5,24,0,0,798,796,1,0,0,0,798,799,1,0,0,0,799,846,1,0,0, - 0,800,803,5,50,0,0,801,802,5,1,0,0,802,804,5,24,0,0,803,801,1,0, - 0,0,803,804,1,0,0,0,804,846,1,0,0,0,805,808,5,51,0,0,806,807,5,1, - 0,0,807,809,5,24,0,0,808,806,1,0,0,0,808,809,1,0,0,0,809,846,1,0, - 0,0,810,813,5,52,0,0,811,812,5,1,0,0,812,814,5,24,0,0,813,811,1, - 0,0,0,813,814,1,0,0,0,814,846,1,0,0,0,815,818,5,53,0,0,816,817,5, - 1,0,0,817,819,5,24,0,0,818,816,1,0,0,0,818,819,1,0,0,0,819,846,1, - 0,0,0,820,823,5,54,0,0,821,822,5,1,0,0,822,824,5,24,0,0,823,821, - 1,0,0,0,823,824,1,0,0,0,824,846,1,0,0,0,825,828,5,55,0,0,826,827, - 5,1,0,0,827,829,5,24,0,0,828,826,1,0,0,0,828,829,1,0,0,0,829,846, - 1,0,0,0,830,833,5,56,0,0,831,832,5,1,0,0,832,834,5,24,0,0,833,831, - 1,0,0,0,833,834,1,0,0,0,834,846,1,0,0,0,835,846,5,57,0,0,836,846, - 5,58,0,0,837,846,5,59,0,0,838,846,5,60,0,0,839,846,5,61,0,0,840, - 846,5,62,0,0,841,846,5,63,0,0,842,846,5,64,0,0,843,846,5,65,0,0, - 844,846,5,66,0,0,845,795,1,0,0,0,845,800,1,0,0,0,845,805,1,0,0,0, - 845,810,1,0,0,0,845,815,1,0,0,0,845,820,1,0,0,0,845,825,1,0,0,0, - 845,830,1,0,0,0,845,835,1,0,0,0,845,836,1,0,0,0,845,837,1,0,0,0, - 845,838,1,0,0,0,845,839,1,0,0,0,845,840,1,0,0,0,845,841,1,0,0,0, - 845,842,1,0,0,0,845,843,1,0,0,0,845,844,1,0,0,0,846,173,1,0,0,0, - 847,848,5,67,0,0,848,849,5,1,0,0,849,850,7,4,0,0,850,175,1,0,0,0, - 851,852,5,70,0,0,852,853,5,1,0,0,853,854,7,4,0,0,854,177,1,0,0,0, - 855,856,5,71,0,0,856,857,5,1,0,0,857,858,7,5,0,0,858,179,1,0,0,0, - 859,860,5,72,0,0,860,861,5,1,0,0,861,862,7,6,0,0,862,181,1,0,0,0, - 863,864,5,73,0,0,864,865,5,1,0,0,865,866,7,7,0,0,866,183,1,0,0,0, - 867,870,5,89,0,0,868,869,5,1,0,0,869,871,5,90,0,0,870,868,1,0,0, - 0,870,871,1,0,0,0,871,185,1,0,0,0,872,873,5,91,0,0,873,874,5,1,0, - 0,874,875,7,4,0,0,875,187,1,0,0,0,876,877,5,32,0,0,877,878,5,1,0, - 0,878,879,5,33,0,0,879,189,1,0,0,0,880,881,5,28,0,0,881,882,5,1, - 0,0,882,883,5,29,0,0,883,191,1,0,0,0,884,885,5,37,0,0,885,886,5, - 1,0,0,886,889,5,38,0,0,887,889,5,39,0,0,888,884,1,0,0,0,888,887, - 1,0,0,0,889,193,1,0,0,0,890,891,5,116,0,0,891,195,1,0,0,0,892,893, - 7,8,0,0,893,197,1,0,0,0,62,203,214,216,244,252,261,267,272,293,299, - 305,309,329,335,353,403,413,443,487,501,516,522,536,547,552,559, - 561,570,581,584,590,597,600,606,612,621,635,647,659,670,681,692, - 704,723,728,740,746,757,776,785,793,798,803,808,813,818,823,828, - 833,845,870,888 + 0,0,329,327,1,0,0,0,329,330,1,0,0,0,330,335,1,0,0,0,331,329,1,0, + 0,0,332,334,3,32,16,0,333,332,1,0,0,0,334,337,1,0,0,0,335,333,1, + 0,0,0,335,336,1,0,0,0,336,29,1,0,0,0,337,335,1,0,0,0,338,339,5,99, + 0,0,339,340,3,146,73,0,340,341,5,9,0,0,341,342,3,132,66,0,342,343, + 5,5,0,0,343,31,1,0,0,0,344,355,3,34,17,0,345,355,3,36,18,0,346,355, + 3,38,19,0,347,355,3,40,20,0,348,355,3,42,21,0,349,355,3,44,22,0, + 350,355,3,46,23,0,351,355,3,48,24,0,352,355,3,50,25,0,353,355,3, + 52,26,0,354,344,1,0,0,0,354,345,1,0,0,0,354,346,1,0,0,0,354,347, + 1,0,0,0,354,348,1,0,0,0,354,349,1,0,0,0,354,350,1,0,0,0,354,351, + 1,0,0,0,354,352,1,0,0,0,354,353,1,0,0,0,355,33,1,0,0,0,356,357,5, + 27,0,0,357,358,3,196,98,0,358,359,5,3,0,0,359,360,3,156,78,0,360, + 361,5,4,0,0,361,362,5,10,0,0,362,363,3,148,74,0,363,364,5,5,0,0, + 364,35,1,0,0,0,365,366,5,28,0,0,366,367,3,196,98,0,367,368,5,3,0, + 0,368,369,3,156,78,0,369,370,5,4,0,0,370,371,5,10,0,0,371,372,3, + 148,74,0,372,373,5,5,0,0,373,37,1,0,0,0,374,375,3,190,95,0,375,376, + 3,196,98,0,376,377,5,3,0,0,377,378,3,156,78,0,378,379,5,4,0,0,379, + 380,3,156,78,0,380,381,5,10,0,0,381,382,3,148,74,0,382,383,5,5,0, + 0,383,39,1,0,0,0,384,385,5,30,0,0,385,386,3,156,78,0,386,387,5,10, + 0,0,387,388,3,196,98,0,388,389,5,3,0,0,389,390,3,156,78,0,390,391, + 5,4,0,0,391,392,5,5,0,0,392,41,1,0,0,0,393,394,5,31,0,0,394,395, + 3,196,98,0,395,396,5,3,0,0,396,397,3,156,78,0,397,398,5,4,0,0,398, + 399,5,5,0,0,399,43,1,0,0,0,400,404,3,188,94,0,401,403,3,156,78,0, + 402,401,1,0,0,0,403,406,1,0,0,0,404,402,1,0,0,0,404,405,1,0,0,0, + 405,407,1,0,0,0,406,404,1,0,0,0,407,408,5,10,0,0,408,409,3,148,74, + 0,409,414,5,9,0,0,410,415,3,114,57,0,411,415,3,116,58,0,412,415, + 3,120,60,0,413,415,3,118,59,0,414,410,1,0,0,0,414,411,1,0,0,0,414, + 412,1,0,0,0,414,413,1,0,0,0,415,416,1,0,0,0,416,417,5,5,0,0,417, + 45,1,0,0,0,418,419,5,34,0,0,419,420,3,194,97,0,420,421,5,5,0,0,421, + 47,1,0,0,0,422,423,3,186,93,0,423,424,3,156,78,0,424,425,3,156,78, + 0,425,426,5,11,0,0,426,427,3,194,97,0,427,428,5,5,0,0,428,49,1,0, + 0,0,429,430,5,35,0,0,430,431,3,148,74,0,431,432,5,5,0,0,432,51,1, + 0,0,0,433,445,3,54,27,0,434,445,3,56,28,0,435,445,3,58,29,0,436, + 445,3,60,30,0,437,445,3,62,31,0,438,445,3,64,32,0,439,445,3,70,35, + 0,440,445,3,72,36,0,441,445,3,74,37,0,442,445,3,76,38,0,443,445, + 3,78,39,0,444,433,1,0,0,0,444,434,1,0,0,0,444,435,1,0,0,0,444,436, + 1,0,0,0,444,437,1,0,0,0,444,438,1,0,0,0,444,439,1,0,0,0,444,440, + 1,0,0,0,444,441,1,0,0,0,444,442,1,0,0,0,444,443,1,0,0,0,445,53,1, + 0,0,0,446,447,3,170,85,0,447,448,3,156,78,0,448,449,5,10,0,0,449, + 450,3,148,74,0,450,451,5,5,0,0,451,55,1,0,0,0,452,453,3,172,86,0, + 453,454,3,156,78,0,454,455,3,156,78,0,455,456,5,10,0,0,456,457,3, + 148,74,0,457,458,5,5,0,0,458,57,1,0,0,0,459,460,5,36,0,0,460,461, + 3,156,78,0,461,462,3,156,78,0,462,463,3,156,78,0,463,464,5,10,0, + 0,464,465,3,148,74,0,465,466,5,5,0,0,466,59,1,0,0,0,467,468,3,174, + 87,0,468,469,3,156,78,0,469,470,3,156,78,0,470,471,5,10,0,0,471, + 472,3,148,74,0,472,473,5,5,0,0,473,61,1,0,0,0,474,475,3,176,88,0, + 475,476,3,156,78,0,476,477,3,156,78,0,477,478,5,5,0,0,478,63,1,0, + 0,0,479,480,3,178,89,0,480,481,3,156,78,0,481,482,3,156,78,0,482, + 483,5,10,0,0,483,484,3,148,74,0,484,488,5,9,0,0,485,489,3,116,58, + 0,486,489,3,108,54,0,487,489,3,110,55,0,488,485,1,0,0,0,488,486, + 1,0,0,0,488,487,1,0,0,0,489,490,1,0,0,0,490,491,5,5,0,0,491,65,1, + 0,0,0,492,493,3,180,90,0,493,494,3,156,78,0,494,495,5,10,0,0,495, + 496,3,148,74,0,496,502,5,9,0,0,497,503,3,114,57,0,498,503,3,116, + 58,0,499,503,3,120,60,0,500,503,3,124,62,0,501,503,3,196,98,0,502, + 497,1,0,0,0,502,498,1,0,0,0,502,499,1,0,0,0,502,500,1,0,0,0,502, + 501,1,0,0,0,503,504,1,0,0,0,504,505,5,5,0,0,505,67,1,0,0,0,506,507, + 3,182,91,0,507,508,3,156,78,0,508,509,3,156,78,0,509,510,5,10,0, + 0,510,511,3,148,74,0,511,517,5,9,0,0,512,518,3,114,57,0,513,518, + 3,116,58,0,514,518,3,120,60,0,515,518,3,124,62,0,516,518,3,196,98, + 0,517,512,1,0,0,0,517,513,1,0,0,0,517,514,1,0,0,0,517,515,1,0,0, + 0,517,516,1,0,0,0,518,519,1,0,0,0,519,520,5,5,0,0,520,69,1,0,0,0, + 521,524,3,66,33,0,522,524,3,68,34,0,523,521,1,0,0,0,523,522,1,0, + 0,0,524,71,1,0,0,0,525,526,3,192,96,0,526,527,3,156,78,0,527,528, + 3,156,78,0,528,529,3,156,78,0,529,530,5,10,0,0,530,531,3,148,74, + 0,531,532,5,5,0,0,532,73,1,0,0,0,533,535,3,184,92,0,534,536,3,156, + 78,0,535,534,1,0,0,0,536,537,1,0,0,0,537,535,1,0,0,0,537,538,1,0, + 0,0,538,539,1,0,0,0,539,540,5,10,0,0,540,541,3,148,74,0,541,542, + 5,9,0,0,542,543,3,166,83,0,543,544,5,5,0,0,544,75,1,0,0,0,545,548, + 5,40,0,0,546,549,3,164,82,0,547,549,3,196,98,0,548,546,1,0,0,0,548, + 547,1,0,0,0,549,553,1,0,0,0,550,552,3,156,78,0,551,550,1,0,0,0,552, + 555,1,0,0,0,553,551,1,0,0,0,553,554,1,0,0,0,554,562,1,0,0,0,555, + 553,1,0,0,0,556,558,5,10,0,0,557,559,3,148,74,0,558,557,1,0,0,0, + 559,560,1,0,0,0,560,558,1,0,0,0,560,561,1,0,0,0,561,563,1,0,0,0, + 562,556,1,0,0,0,562,563,1,0,0,0,563,564,1,0,0,0,564,565,5,5,0,0, + 565,77,1,0,0,0,566,567,5,41,0,0,567,571,3,196,98,0,568,570,3,156, + 78,0,569,568,1,0,0,0,570,573,1,0,0,0,571,569,1,0,0,0,571,572,1,0, + 0,0,572,574,1,0,0,0,573,571,1,0,0,0,574,575,5,10,0,0,575,576,3,148, + 74,0,576,577,5,5,0,0,577,79,1,0,0,0,578,583,3,94,47,0,579,583,3, + 96,48,0,580,583,3,98,49,0,581,583,3,100,50,0,582,578,1,0,0,0,582, + 579,1,0,0,0,582,580,1,0,0,0,582,581,1,0,0,0,583,81,1,0,0,0,584,586, + 5,8,0,0,585,584,1,0,0,0,585,586,1,0,0,0,586,587,1,0,0,0,587,588, + 5,114,0,0,588,589,3,104,52,0,589,83,1,0,0,0,590,592,5,8,0,0,591, + 590,1,0,0,0,591,592,1,0,0,0,592,593,1,0,0,0,593,594,5,114,0,0,594, + 595,3,102,51,0,595,85,1,0,0,0,596,599,3,82,41,0,597,599,3,84,42, + 0,598,596,1,0,0,0,598,597,1,0,0,0,599,87,1,0,0,0,600,602,5,8,0,0, + 601,600,1,0,0,0,601,602,1,0,0,0,602,603,1,0,0,0,603,604,5,114,0, + 0,604,605,3,108,54,0,605,89,1,0,0,0,606,608,5,8,0,0,607,606,1,0, + 0,0,607,608,1,0,0,0,608,609,1,0,0,0,609,610,5,114,0,0,610,611,3, + 110,55,0,611,91,1,0,0,0,612,614,5,8,0,0,613,612,1,0,0,0,613,614, + 1,0,0,0,614,615,1,0,0,0,615,616,5,114,0,0,616,617,3,112,56,0,617, + 93,1,0,0,0,618,623,3,86,43,0,619,623,3,88,44,0,620,623,3,90,45,0, + 621,623,3,92,46,0,622,618,1,0,0,0,622,619,1,0,0,0,622,620,1,0,0, + 0,622,621,1,0,0,0,623,95,1,0,0,0,624,625,5,112,0,0,625,97,1,0,0, + 0,626,627,5,113,0,0,627,99,1,0,0,0,628,629,7,0,0,0,629,101,1,0,0, + 0,630,631,5,105,0,0,631,103,1,0,0,0,632,633,5,106,0,0,633,105,1, + 0,0,0,634,637,3,102,51,0,635,637,3,104,52,0,636,634,1,0,0,0,636, + 635,1,0,0,0,637,107,1,0,0,0,638,639,5,107,0,0,639,109,1,0,0,0,640, + 641,5,17,0,0,641,111,1,0,0,0,642,643,5,108,0,0,643,113,1,0,0,0,644, + 649,3,106,53,0,645,649,3,108,54,0,646,649,3,110,55,0,647,649,3,112, + 56,0,648,644,1,0,0,0,648,645,1,0,0,0,648,646,1,0,0,0,648,647,1,0, + 0,0,649,115,1,0,0,0,650,651,5,109,0,0,651,117,1,0,0,0,652,653,5, + 110,0,0,653,119,1,0,0,0,654,655,5,111,0,0,655,121,1,0,0,0,656,661, + 3,114,57,0,657,661,3,116,58,0,658,661,3,120,60,0,659,661,3,118,59, + 0,660,656,1,0,0,0,660,657,1,0,0,0,660,658,1,0,0,0,660,659,1,0,0, + 0,661,123,1,0,0,0,662,663,5,3,0,0,663,664,3,126,63,0,664,665,5,5, + 0,0,665,666,3,84,42,0,666,667,5,4,0,0,667,125,1,0,0,0,668,672,3, + 122,61,0,669,672,3,124,62,0,670,672,3,196,98,0,671,668,1,0,0,0,671, + 669,1,0,0,0,671,670,1,0,0,0,672,127,1,0,0,0,673,674,3,126,63,0,674, + 675,3,138,69,0,675,683,1,0,0,0,676,677,3,196,98,0,677,678,3,138, + 69,0,678,683,1,0,0,0,679,680,3,164,82,0,680,681,3,138,69,0,681,683, + 1,0,0,0,682,673,1,0,0,0,682,676,1,0,0,0,682,679,1,0,0,0,683,129, + 1,0,0,0,684,685,3,126,63,0,685,686,3,138,69,0,686,131,1,0,0,0,687, + 688,3,126,63,0,688,689,3,138,69,0,689,694,1,0,0,0,690,691,3,164, + 82,0,691,692,3,138,69,0,692,694,1,0,0,0,693,687,1,0,0,0,693,690, + 1,0,0,0,694,133,1,0,0,0,695,696,3,126,63,0,696,697,3,138,69,0,697, + 135,1,0,0,0,698,699,3,164,82,0,699,700,3,138,69,0,700,706,1,0,0, + 0,701,702,3,196,98,0,702,703,3,138,69,0,703,706,1,0,0,0,704,706, + 3,126,63,0,705,698,1,0,0,0,705,701,1,0,0,0,705,704,1,0,0,0,706,137, + 1,0,0,0,707,708,5,1,0,0,708,709,7,1,0,0,709,139,1,0,0,0,710,711, + 3,142,71,0,711,712,5,1,0,0,712,713,3,144,72,0,713,141,1,0,0,0,714, + 715,3,196,98,0,715,143,1,0,0,0,716,717,3,196,98,0,717,145,1,0,0, + 0,718,719,5,115,0,0,719,147,1,0,0,0,720,724,3,146,73,0,721,723,3, + 150,75,0,722,721,1,0,0,0,723,726,1,0,0,0,724,722,1,0,0,0,724,725, + 1,0,0,0,725,149,1,0,0,0,726,724,1,0,0,0,727,730,3,152,76,0,728,730, + 3,154,77,0,729,727,1,0,0,0,729,728,1,0,0,0,730,151,1,0,0,0,731,732, + 5,1,0,0,732,733,3,196,98,0,733,153,1,0,0,0,734,735,5,3,0,0,735,736, + 3,84,42,0,736,737,5,4,0,0,737,742,1,0,0,0,738,739,5,3,0,0,739,740, + 5,114,0,0,740,742,5,4,0,0,741,734,1,0,0,0,741,738,1,0,0,0,742,155, + 1,0,0,0,743,748,3,80,40,0,744,748,3,148,74,0,745,748,3,140,70,0, + 746,748,3,158,79,0,747,743,1,0,0,0,747,744,1,0,0,0,747,745,1,0,0, + 0,747,746,1,0,0,0,748,157,1,0,0,0,749,750,5,17,0,0,750,751,5,6,0, + 0,751,759,5,18,0,0,752,753,5,19,0,0,753,754,5,1,0,0,754,759,7,2, + 0,0,755,756,5,22,0,0,756,757,5,1,0,0,757,759,5,23,0,0,758,749,1, + 0,0,0,758,752,1,0,0,0,758,755,1,0,0,0,759,159,1,0,0,0,760,761,3, + 196,98,0,761,762,5,9,0,0,762,763,3,126,63,0,763,764,5,5,0,0,764, + 161,1,0,0,0,765,766,3,196,98,0,766,767,5,9,0,0,767,768,3,134,67, + 0,768,769,5,5,0,0,769,163,1,0,0,0,770,771,3,140,70,0,771,772,5,2, + 0,0,772,773,3,196,98,0,773,165,1,0,0,0,774,778,3,136,68,0,775,778, + 3,164,82,0,776,778,3,168,84,0,777,774,1,0,0,0,777,775,1,0,0,0,777, + 776,1,0,0,0,778,167,1,0,0,0,779,780,5,17,0,0,780,781,5,1,0,0,781, + 782,7,3,0,0,782,169,1,0,0,0,783,786,5,42,0,0,784,785,5,1,0,0,785, + 787,5,24,0,0,786,784,1,0,0,0,786,787,1,0,0,0,787,795,1,0,0,0,788, + 795,5,43,0,0,789,795,5,44,0,0,790,795,5,45,0,0,791,795,5,46,0,0, + 792,795,5,47,0,0,793,795,5,48,0,0,794,783,1,0,0,0,794,788,1,0,0, + 0,794,789,1,0,0,0,794,790,1,0,0,0,794,791,1,0,0,0,794,792,1,0,0, + 0,794,793,1,0,0,0,795,171,1,0,0,0,796,799,5,49,0,0,797,798,5,1,0, + 0,798,800,5,24,0,0,799,797,1,0,0,0,799,800,1,0,0,0,800,847,1,0,0, + 0,801,804,5,50,0,0,802,803,5,1,0,0,803,805,5,24,0,0,804,802,1,0, + 0,0,804,805,1,0,0,0,805,847,1,0,0,0,806,809,5,51,0,0,807,808,5,1, + 0,0,808,810,5,24,0,0,809,807,1,0,0,0,809,810,1,0,0,0,810,847,1,0, + 0,0,811,814,5,52,0,0,812,813,5,1,0,0,813,815,5,24,0,0,814,812,1, + 0,0,0,814,815,1,0,0,0,815,847,1,0,0,0,816,819,5,53,0,0,817,818,5, + 1,0,0,818,820,5,24,0,0,819,817,1,0,0,0,819,820,1,0,0,0,820,847,1, + 0,0,0,821,824,5,54,0,0,822,823,5,1,0,0,823,825,5,24,0,0,824,822, + 1,0,0,0,824,825,1,0,0,0,825,847,1,0,0,0,826,829,5,55,0,0,827,828, + 5,1,0,0,828,830,5,24,0,0,829,827,1,0,0,0,829,830,1,0,0,0,830,847, + 1,0,0,0,831,834,5,56,0,0,832,833,5,1,0,0,833,835,5,24,0,0,834,832, + 1,0,0,0,834,835,1,0,0,0,835,847,1,0,0,0,836,847,5,57,0,0,837,847, + 5,58,0,0,838,847,5,59,0,0,839,847,5,60,0,0,840,847,5,61,0,0,841, + 847,5,62,0,0,842,847,5,63,0,0,843,847,5,64,0,0,844,847,5,65,0,0, + 845,847,5,66,0,0,846,796,1,0,0,0,846,801,1,0,0,0,846,806,1,0,0,0, + 846,811,1,0,0,0,846,816,1,0,0,0,846,821,1,0,0,0,846,826,1,0,0,0, + 846,831,1,0,0,0,846,836,1,0,0,0,846,837,1,0,0,0,846,838,1,0,0,0, + 846,839,1,0,0,0,846,840,1,0,0,0,846,841,1,0,0,0,846,842,1,0,0,0, + 846,843,1,0,0,0,846,844,1,0,0,0,846,845,1,0,0,0,847,173,1,0,0,0, + 848,849,5,67,0,0,849,850,5,1,0,0,850,851,7,4,0,0,851,175,1,0,0,0, + 852,853,5,70,0,0,853,854,5,1,0,0,854,855,7,4,0,0,855,177,1,0,0,0, + 856,857,5,71,0,0,857,858,5,1,0,0,858,859,7,5,0,0,859,179,1,0,0,0, + 860,861,5,72,0,0,861,862,5,1,0,0,862,863,7,6,0,0,863,181,1,0,0,0, + 864,865,5,73,0,0,865,866,5,1,0,0,866,867,7,7,0,0,867,183,1,0,0,0, + 868,871,5,89,0,0,869,870,5,1,0,0,870,872,5,90,0,0,871,869,1,0,0, + 0,871,872,1,0,0,0,872,185,1,0,0,0,873,874,5,91,0,0,874,875,5,1,0, + 0,875,876,7,4,0,0,876,187,1,0,0,0,877,878,5,32,0,0,878,879,5,1,0, + 0,879,880,5,33,0,0,880,189,1,0,0,0,881,882,5,28,0,0,882,883,5,1, + 0,0,883,884,5,29,0,0,884,191,1,0,0,0,885,886,5,37,0,0,886,887,5, + 1,0,0,887,890,5,38,0,0,888,890,5,39,0,0,889,885,1,0,0,0,889,888, + 1,0,0,0,890,193,1,0,0,0,891,892,5,116,0,0,892,195,1,0,0,0,893,894, + 7,8,0,0,894,197,1,0,0,0,62,203,214,216,244,252,261,267,272,293,299, + 305,309,329,335,354,404,414,444,488,502,517,523,537,548,553,560, + 562,571,582,585,591,598,601,607,613,622,636,648,660,671,682,693, + 705,724,729,741,747,758,777,786,794,799,804,809,814,819,824,829, + 834,846,871,889 ] class AleoParser ( Parser ): @@ -1741,17 +1741,15 @@ def finalize(self): self._errHandler.sync(self) _la = self._input.LA(1) - self.state = 333 + self.state = 335 self._errHandler.sync(self) _la = self._input.LA(1) - while True: + while (((_la) & ~0x3f) == 0 and ((1 << _la) & -284138930176) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & 167773135) != 0): self.state = 332 self.command() - self.state = 335 + self.state = 337 self._errHandler.sync(self) _la = self._input.LA(1) - if not ((((_la) & ~0x3f) == 0 and ((1 << _la) & -284138930176) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & 167773135) != 0)): - break except RecognitionException as re: localctx.exception = re @@ -1806,15 +1804,15 @@ def finalize_input(self): self.enterRule(localctx, 30, self.RULE_finalize_input) try: self.enterOuterAlt(localctx, 1) - self.state = 337 - self.match(AleoParser.INPUT) self.state = 338 - self.register() + self.match(AleoParser.INPUT) self.state = 339 - self.match(AleoParser.AS) + self.register() self.state = 340 - self.finalize_type() + self.match(AleoParser.AS) self.state = 341 + self.finalize_type() + self.state = 342 self.match(AleoParser.SC) except RecognitionException as re: localctx.exception = re @@ -1891,66 +1889,66 @@ def command(self): localctx = AleoParser.CommandContext(self, self._ctx, self.state) self.enterRule(localctx, 32, self.RULE_command) try: - self.state = 353 + self.state = 354 self._errHandler.sync(self) la_ = self._interp.adaptivePredict(self._input,14,self._ctx) if la_ == 1: self.enterOuterAlt(localctx, 1) - self.state = 343 + self.state = 344 self.contains() pass elif la_ == 2: self.enterOuterAlt(localctx, 2) - self.state = 344 + self.state = 345 self.get() pass elif la_ == 3: self.enterOuterAlt(localctx, 3) - self.state = 345 + self.state = 346 self.get_or_use() pass elif la_ == 4: self.enterOuterAlt(localctx, 4) - self.state = 346 + self.state = 347 self.set_() pass elif la_ == 5: self.enterOuterAlt(localctx, 5) - self.state = 347 + self.state = 348 self.remove() pass elif la_ == 6: self.enterOuterAlt(localctx, 6) - self.state = 348 + self.state = 349 self.random() pass elif la_ == 7: self.enterOuterAlt(localctx, 7) - self.state = 349 + self.state = 350 self.position() pass elif la_ == 8: self.enterOuterAlt(localctx, 8) - self.state = 350 + self.state = 351 self.branch() pass elif la_ == 9: self.enterOuterAlt(localctx, 9) - self.state = 351 + self.state = 352 self.xawait() pass elif la_ == 10: self.enterOuterAlt(localctx, 10) - self.state = 352 + self.state = 353 self.instruction() pass @@ -2018,21 +2016,21 @@ def contains(self): self.enterRule(localctx, 34, self.RULE_contains) try: self.enterOuterAlt(localctx, 1) - self.state = 355 - self.match(AleoParser.CONTAINS) self.state = 356 - self.identifier() + self.match(AleoParser.CONTAINS) self.state = 357 - self.match(AleoParser.LB) + self.identifier() self.state = 358 - self.operand() + self.match(AleoParser.LB) self.state = 359 - self.match(AleoParser.RB) + self.operand() self.state = 360 - self.match(AleoParser.INTO) + self.match(AleoParser.RB) self.state = 361 - self.register_access() + self.match(AleoParser.INTO) self.state = 362 + self.register_access() + self.state = 363 self.match(AleoParser.SC) except RecognitionException as re: localctx.exception = re @@ -2097,21 +2095,21 @@ def get(self): self.enterRule(localctx, 36, self.RULE_get) try: self.enterOuterAlt(localctx, 1) - self.state = 364 - self.match(AleoParser.GET) self.state = 365 - self.identifier() + self.match(AleoParser.GET) self.state = 366 - self.match(AleoParser.LB) + self.identifier() self.state = 367 - self.operand() + self.match(AleoParser.LB) self.state = 368 - self.match(AleoParser.RB) + self.operand() self.state = 369 - self.match(AleoParser.INTO) + self.match(AleoParser.RB) self.state = 370 - self.register_access() + self.match(AleoParser.INTO) self.state = 371 + self.register_access() + self.state = 372 self.match(AleoParser.SC) except RecognitionException as re: localctx.exception = re @@ -2180,23 +2178,23 @@ def get_or_use(self): self.enterRule(localctx, 38, self.RULE_get_or_use) try: self.enterOuterAlt(localctx, 1) - self.state = 373 - self.get_or_use_op() self.state = 374 - self.identifier() + self.get_or_use_op() self.state = 375 - self.match(AleoParser.LB) + self.identifier() self.state = 376 - self.operand() + self.match(AleoParser.LB) self.state = 377 - self.match(AleoParser.RB) - self.state = 378 self.operand() + self.state = 378 + self.match(AleoParser.RB) self.state = 379 - self.match(AleoParser.INTO) + self.operand() self.state = 380 - self.register_access() + self.match(AleoParser.INTO) self.state = 381 + self.register_access() + self.state = 382 self.match(AleoParser.SC) except RecognitionException as re: localctx.exception = re @@ -2260,21 +2258,21 @@ def set_(self): self.enterRule(localctx, 40, self.RULE_set) try: self.enterOuterAlt(localctx, 1) - self.state = 383 - self.match(AleoParser.SET) self.state = 384 - self.operand() + self.match(AleoParser.SET) self.state = 385 - self.match(AleoParser.INTO) + self.operand() self.state = 386 - self.identifier() + self.match(AleoParser.INTO) self.state = 387 - self.match(AleoParser.LB) + self.identifier() self.state = 388 - self.operand() + self.match(AleoParser.LB) self.state = 389 - self.match(AleoParser.RB) + self.operand() self.state = 390 + self.match(AleoParser.RB) + self.state = 391 self.match(AleoParser.SC) except RecognitionException as re: localctx.exception = re @@ -2332,17 +2330,17 @@ def remove(self): self.enterRule(localctx, 42, self.RULE_remove) try: self.enterOuterAlt(localctx, 1) - self.state = 392 - self.match(AleoParser.REMOVE) self.state = 393 - self.identifier() + self.match(AleoParser.REMOVE) self.state = 394 - self.match(AleoParser.LB) + self.identifier() self.state = 395 - self.operand() + self.match(AleoParser.LB) self.state = 396 - self.match(AleoParser.RB) + self.operand() self.state = 397 + self.match(AleoParser.RB) + self.state = 398 self.match(AleoParser.SC) except RecognitionException as re: localctx.exception = re @@ -2420,48 +2418,48 @@ def random(self): self.enterRule(localctx, 44, self.RULE_random) try: self.enterOuterAlt(localctx, 1) - self.state = 399 + self.state = 400 self.random_op() - self.state = 403 + self.state = 404 self._errHandler.sync(self) _alt = self._interp.adaptivePredict(self._input,15,self._ctx) while _alt!=2 and _alt!=ATN.INVALID_ALT_NUMBER: if _alt==1: - self.state = 400 + self.state = 401 self.operand() - self.state = 405 + self.state = 406 self._errHandler.sync(self) _alt = self._interp.adaptivePredict(self._input,15,self._ctx) - self.state = 406 - self.match(AleoParser.INTO) self.state = 407 - self.register_access() + self.match(AleoParser.INTO) self.state = 408 + self.register_access() + self.state = 409 self.match(AleoParser.AS) - self.state = 413 + self.state = 414 self._errHandler.sync(self) token = self._input.LA(1) if token in [17, 105, 106, 107, 108]: - self.state = 409 + self.state = 410 self.arithmetic_type() pass elif token in [109]: - self.state = 410 + self.state = 411 self.address_type() pass elif token in [111]: - self.state = 411 + self.state = 412 self.signature_type() pass elif token in [110]: - self.state = 412 + self.state = 413 self.boolean_type() pass else: raise NoViableAltException(self) - self.state = 415 + self.state = 416 self.match(AleoParser.SC) except RecognitionException as re: localctx.exception = re @@ -2509,11 +2507,11 @@ def position(self): self.enterRule(localctx, 46, self.RULE_position) try: self.enterOuterAlt(localctx, 1) - self.state = 417 - self.match(AleoParser.POSITION) self.state = 418 - self.label() + self.match(AleoParser.POSITION) self.state = 419 + self.label() + self.state = 420 self.match(AleoParser.SC) except RecognitionException as re: localctx.exception = re @@ -2572,17 +2570,17 @@ def branch(self): self.enterRule(localctx, 48, self.RULE_branch) try: self.enterOuterAlt(localctx, 1) - self.state = 421 - self.branch_op() self.state = 422 - self.operand() + self.branch_op() self.state = 423 self.operand() self.state = 424 - self.match(AleoParser.TO) + self.operand() self.state = 425 - self.label() + self.match(AleoParser.TO) self.state = 426 + self.label() + self.state = 427 self.match(AleoParser.SC) except RecognitionException as re: localctx.exception = re @@ -2630,11 +2628,11 @@ def xawait(self): self.enterRule(localctx, 50, self.RULE_xawait) try: self.enterOuterAlt(localctx, 1) - self.state = 428 - self.match(AleoParser.AWAIT) self.state = 429 - self.register_access() + self.match(AleoParser.AWAIT) self.state = 430 + self.register_access() + self.state = 431 self.match(AleoParser.SC) except RecognitionException as re: localctx.exception = re @@ -2715,62 +2713,62 @@ def instruction(self): localctx = AleoParser.InstructionContext(self, self._ctx, self.state) self.enterRule(localctx, 52, self.RULE_instruction) try: - self.state = 443 + self.state = 444 self._errHandler.sync(self) token = self._input.LA(1) if token in [42, 43, 44, 45, 46, 47, 48]: self.enterOuterAlt(localctx, 1) - self.state = 432 + self.state = 433 self.unary() pass elif token in [49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66]: self.enterOuterAlt(localctx, 2) - self.state = 433 + self.state = 434 self.binary() pass elif token in [36]: self.enterOuterAlt(localctx, 3) - self.state = 434 + self.state = 435 self.ternary() pass elif token in [67]: self.enterOuterAlt(localctx, 4) - self.state = 435 + self.state = 436 self.is_() pass elif token in [70]: self.enterOuterAlt(localctx, 5) - self.state = 436 + self.state = 437 self.assert_() pass elif token in [71]: self.enterOuterAlt(localctx, 6) - self.state = 437 + self.state = 438 self.commit() pass elif token in [72, 73]: self.enterOuterAlt(localctx, 7) - self.state = 438 + self.state = 439 self.hash_() pass elif token in [37, 39]: self.enterOuterAlt(localctx, 8) - self.state = 439 + self.state = 440 self.sign_verify() pass elif token in [89]: self.enterOuterAlt(localctx, 9) - self.state = 440 + self.state = 441 self.cast() pass elif token in [40]: self.enterOuterAlt(localctx, 10) - self.state = 441 + self.state = 442 self.call() pass elif token in [41]: self.enterOuterAlt(localctx, 11) - self.state = 442 + self.state = 443 self.xasync() pass else: @@ -2830,15 +2828,15 @@ def unary(self): self.enterRule(localctx, 54, self.RULE_unary) try: self.enterOuterAlt(localctx, 1) - self.state = 445 - self.unary_op() self.state = 446 - self.operand() + self.unary_op() self.state = 447 - self.match(AleoParser.INTO) + self.operand() self.state = 448 - self.register_access() + self.match(AleoParser.INTO) self.state = 449 + self.register_access() + self.state = 450 self.match(AleoParser.SC) except RecognitionException as re: localctx.exception = re @@ -2897,17 +2895,17 @@ def binary(self): self.enterRule(localctx, 56, self.RULE_binary) try: self.enterOuterAlt(localctx, 1) - self.state = 451 - self.binary_op() self.state = 452 - self.operand() + self.binary_op() self.state = 453 self.operand() self.state = 454 - self.match(AleoParser.INTO) + self.operand() self.state = 455 - self.register_access() + self.match(AleoParser.INTO) self.state = 456 + self.register_access() + self.state = 457 self.match(AleoParser.SC) except RecognitionException as re: localctx.exception = re @@ -2965,19 +2963,19 @@ def ternary(self): self.enterRule(localctx, 58, self.RULE_ternary) try: self.enterOuterAlt(localctx, 1) - self.state = 458 - self.match(AleoParser.TERNARY) self.state = 459 - self.operand() + self.match(AleoParser.TERNARY) self.state = 460 self.operand() self.state = 461 self.operand() self.state = 462 - self.match(AleoParser.INTO) + self.operand() self.state = 463 - self.register_access() + self.match(AleoParser.INTO) self.state = 464 + self.register_access() + self.state = 465 self.match(AleoParser.SC) except RecognitionException as re: localctx.exception = re @@ -3036,17 +3034,17 @@ def is_(self): self.enterRule(localctx, 60, self.RULE_is) try: self.enterOuterAlt(localctx, 1) - self.state = 466 - self.is_op() self.state = 467 - self.operand() + self.is_op() self.state = 468 self.operand() self.state = 469 - self.match(AleoParser.INTO) + self.operand() self.state = 470 - self.register_access() + self.match(AleoParser.INTO) self.state = 471 + self.register_access() + self.state = 472 self.match(AleoParser.SC) except RecognitionException as re: localctx.exception = re @@ -3098,13 +3096,13 @@ def assert_(self): self.enterRule(localctx, 62, self.RULE_assert) try: self.enterOuterAlt(localctx, 1) - self.state = 473 - self.assert_op() self.state = 474 - self.operand() + self.assert_op() self.state = 475 self.operand() self.state = 476 + self.operand() + self.state = 477 self.match(AleoParser.SC) except RecognitionException as re: localctx.exception = re @@ -3178,37 +3176,37 @@ def commit(self): self.enterRule(localctx, 64, self.RULE_commit) try: self.enterOuterAlt(localctx, 1) - self.state = 478 - self.commit_op() self.state = 479 - self.operand() + self.commit_op() self.state = 480 self.operand() self.state = 481 - self.match(AleoParser.INTO) + self.operand() self.state = 482 - self.register_access() + self.match(AleoParser.INTO) self.state = 483 + self.register_access() + self.state = 484 self.match(AleoParser.AS) - self.state = 487 + self.state = 488 self._errHandler.sync(self) token = self._input.LA(1) if token in [109]: - self.state = 484 + self.state = 485 self.address_type() pass elif token in [107]: - self.state = 485 + self.state = 486 self.field_type() pass elif token in [17]: - self.state = 486 + self.state = 487 self.group_type() pass else: raise NoViableAltException(self) - self.state = 489 + self.state = 490 self.match(AleoParser.SC) except RecognitionException as re: localctx.exception = re @@ -3287,46 +3285,46 @@ def hash1(self): self.enterRule(localctx, 66, self.RULE_hash1) try: self.enterOuterAlt(localctx, 1) - self.state = 491 - self.hash1_op() self.state = 492 - self.operand() + self.hash1_op() self.state = 493 - self.match(AleoParser.INTO) + self.operand() self.state = 494 - self.register_access() + self.match(AleoParser.INTO) self.state = 495 + self.register_access() + self.state = 496 self.match(AleoParser.AS) - self.state = 501 + self.state = 502 self._errHandler.sync(self) la_ = self._interp.adaptivePredict(self._input,19,self._ctx) if la_ == 1: - self.state = 496 + self.state = 497 self.arithmetic_type() pass elif la_ == 2: - self.state = 497 + self.state = 498 self.address_type() pass elif la_ == 3: - self.state = 498 + self.state = 499 self.signature_type() pass elif la_ == 4: - self.state = 499 + self.state = 500 self.array_type() pass elif la_ == 5: - self.state = 500 + self.state = 501 self.identifier() pass - self.state = 503 + self.state = 504 self.match(AleoParser.SC) except RecognitionException as re: localctx.exception = re @@ -3408,48 +3406,48 @@ def hash2(self): self.enterRule(localctx, 68, self.RULE_hash2) try: self.enterOuterAlt(localctx, 1) - self.state = 505 - self.hash2_op() self.state = 506 - self.operand() + self.hash2_op() self.state = 507 self.operand() self.state = 508 - self.match(AleoParser.INTO) + self.operand() self.state = 509 - self.register_access() + self.match(AleoParser.INTO) self.state = 510 + self.register_access() + self.state = 511 self.match(AleoParser.AS) - self.state = 516 + self.state = 517 self._errHandler.sync(self) la_ = self._interp.adaptivePredict(self._input,20,self._ctx) if la_ == 1: - self.state = 511 + self.state = 512 self.arithmetic_type() pass elif la_ == 2: - self.state = 512 + self.state = 513 self.address_type() pass elif la_ == 3: - self.state = 513 + self.state = 514 self.signature_type() pass elif la_ == 4: - self.state = 514 + self.state = 515 self.array_type() pass elif la_ == 5: - self.state = 515 + self.state = 516 self.identifier() pass - self.state = 518 + self.state = 519 self.match(AleoParser.SC) except RecognitionException as re: localctx.exception = re @@ -3494,17 +3492,17 @@ def hash_(self): localctx = AleoParser.HashContext(self, self._ctx, self.state) self.enterRule(localctx, 70, self.RULE_hash) try: - self.state = 522 + self.state = 523 self._errHandler.sync(self) token = self._input.LA(1) if token in [72]: self.enterOuterAlt(localctx, 1) - self.state = 520 + self.state = 521 self.hash1() pass elif token in [73]: self.enterOuterAlt(localctx, 2) - self.state = 521 + self.state = 522 self.hash2() pass else: @@ -3567,19 +3565,19 @@ def sign_verify(self): self.enterRule(localctx, 72, self.RULE_sign_verify) try: self.enterOuterAlt(localctx, 1) - self.state = 524 - self.sign_verify_op() self.state = 525 - self.operand() + self.sign_verify_op() self.state = 526 self.operand() self.state = 527 self.operand() self.state = 528 - self.match(AleoParser.INTO) + self.operand() self.state = 529 - self.register_access() + self.match(AleoParser.INTO) self.state = 530 + self.register_access() + self.state = 531 self.match(AleoParser.SC) except RecognitionException as re: localctx.exception = re @@ -3645,31 +3643,31 @@ def cast(self): self.enterRule(localctx, 74, self.RULE_cast) try: self.enterOuterAlt(localctx, 1) - self.state = 532 + self.state = 533 self.cast_op() - self.state = 534 + self.state = 535 self._errHandler.sync(self) _alt = 1 while _alt!=2 and _alt!=ATN.INVALID_ALT_NUMBER: if _alt == 1: - self.state = 533 + self.state = 534 self.operand() else: raise NoViableAltException(self) - self.state = 536 + self.state = 537 self._errHandler.sync(self) _alt = self._interp.adaptivePredict(self._input,22,self._ctx) - self.state = 538 - self.match(AleoParser.INTO) self.state = 539 - self.register_access() + self.match(AleoParser.INTO) self.state = 540 - self.match(AleoParser.AS) + self.register_access() self.state = 541 - self.cast_destination() + self.match(AleoParser.AS) self.state = 542 + self.cast_destination() + self.state = 543 self.match(AleoParser.SC) except RecognitionException as re: localctx.exception = re @@ -3739,46 +3737,46 @@ def call(self): self._la = 0 # Token type try: self.enterOuterAlt(localctx, 1) - self.state = 544 + self.state = 545 self.match(AleoParser.CALL) - self.state = 547 + self.state = 548 self._errHandler.sync(self) la_ = self._interp.adaptivePredict(self._input,23,self._ctx) if la_ == 1: - self.state = 545 + self.state = 546 self.locator() pass elif la_ == 2: - self.state = 546 + self.state = 547 self.identifier() pass - self.state = 552 + self.state = 553 self._errHandler.sync(self) _alt = self._interp.adaptivePredict(self._input,24,self._ctx) while _alt!=2 and _alt!=ATN.INVALID_ALT_NUMBER: if _alt==1: - self.state = 549 + self.state = 550 self.operand() - self.state = 554 + self.state = 555 self._errHandler.sync(self) _alt = self._interp.adaptivePredict(self._input,24,self._ctx) - self.state = 561 + self.state = 562 self._errHandler.sync(self) _la = self._input.LA(1) if _la==10: - self.state = 555 + self.state = 556 self.match(AleoParser.INTO) - self.state = 557 + self.state = 558 self._errHandler.sync(self) _la = self._input.LA(1) while True: - self.state = 556 + self.state = 557 self.register_access() - self.state = 559 + self.state = 560 self._errHandler.sync(self) _la = self._input.LA(1) if not (_la==115): @@ -3786,7 +3784,7 @@ def call(self): - self.state = 563 + self.state = 564 self.match(AleoParser.SC) except RecognitionException as re: localctx.exception = re @@ -3848,26 +3846,26 @@ def xasync(self): self.enterRule(localctx, 78, self.RULE_xasync) try: self.enterOuterAlt(localctx, 1) - self.state = 565 - self.match(AleoParser.ASYNC) self.state = 566 + self.match(AleoParser.ASYNC) + self.state = 567 self.identifier() - self.state = 570 + self.state = 571 self._errHandler.sync(self) _alt = self._interp.adaptivePredict(self._input,27,self._ctx) while _alt!=2 and _alt!=ATN.INVALID_ALT_NUMBER: if _alt==1: - self.state = 567 + self.state = 568 self.operand() - self.state = 572 + self.state = 573 self._errHandler.sync(self) _alt = self._interp.adaptivePredict(self._input,27,self._ctx) - self.state = 573 - self.match(AleoParser.INTO) self.state = 574 - self.register_access() + self.match(AleoParser.INTO) self.state = 575 + self.register_access() + self.state = 576 self.match(AleoParser.SC) except RecognitionException as re: localctx.exception = re @@ -3920,27 +3918,27 @@ def literal(self): localctx = AleoParser.LiteralContext(self, self._ctx, self.state) self.enterRule(localctx, 80, self.RULE_literal) try: - self.state = 581 + self.state = 582 self._errHandler.sync(self) token = self._input.LA(1) if token in [8, 114]: self.enterOuterAlt(localctx, 1) - self.state = 577 + self.state = 578 self.arithmetic_literal() pass elif token in [112]: self.enterOuterAlt(localctx, 2) - self.state = 578 + self.state = 579 self.address_literal() pass elif token in [113]: self.enterOuterAlt(localctx, 3) - self.state = 579 + self.state = 580 self.signature_literal() pass elif token in [103, 104]: self.enterOuterAlt(localctx, 4) - self.state = 580 + self.state = 581 self.boolean_literal() pass else: @@ -3993,17 +3991,17 @@ def signed_literal(self): self._la = 0 # Token type try: self.enterOuterAlt(localctx, 1) - self.state = 584 + self.state = 585 self._errHandler.sync(self) _la = self._input.LA(1) if _la==8: - self.state = 583 + self.state = 584 self.match(AleoParser.DS) - self.state = 586 - self.match(AleoParser.DIGITS) self.state = 587 + self.match(AleoParser.DIGITS) + self.state = 588 self.signed_type() except RecognitionException as re: localctx.exception = re @@ -4052,17 +4050,17 @@ def unsigned_literal(self): self._la = 0 # Token type try: self.enterOuterAlt(localctx, 1) - self.state = 590 + self.state = 591 self._errHandler.sync(self) _la = self._input.LA(1) if _la==8: - self.state = 589 + self.state = 590 self.match(AleoParser.DS) - self.state = 592 - self.match(AleoParser.DIGITS) self.state = 593 + self.match(AleoParser.DIGITS) + self.state = 594 self.unsigned_type() except RecognitionException as re: localctx.exception = re @@ -4107,18 +4105,18 @@ def integer_literal(self): localctx = AleoParser.Integer_literalContext(self, self._ctx, self.state) self.enterRule(localctx, 86, self.RULE_integer_literal) try: - self.state = 597 + self.state = 598 self._errHandler.sync(self) la_ = self._interp.adaptivePredict(self._input,31,self._ctx) if la_ == 1: self.enterOuterAlt(localctx, 1) - self.state = 595 + self.state = 596 self.signed_literal() pass elif la_ == 2: self.enterOuterAlt(localctx, 2) - self.state = 596 + self.state = 597 self.unsigned_literal() pass @@ -4170,17 +4168,17 @@ def field_literal(self): self._la = 0 # Token type try: self.enterOuterAlt(localctx, 1) - self.state = 600 + self.state = 601 self._errHandler.sync(self) _la = self._input.LA(1) if _la==8: - self.state = 599 + self.state = 600 self.match(AleoParser.DS) - self.state = 602 - self.match(AleoParser.DIGITS) self.state = 603 + self.match(AleoParser.DIGITS) + self.state = 604 self.field_type() except RecognitionException as re: localctx.exception = re @@ -4229,17 +4227,17 @@ def group_literal(self): self._la = 0 # Token type try: self.enterOuterAlt(localctx, 1) - self.state = 606 + self.state = 607 self._errHandler.sync(self) _la = self._input.LA(1) if _la==8: - self.state = 605 + self.state = 606 self.match(AleoParser.DS) - self.state = 608 - self.match(AleoParser.DIGITS) self.state = 609 + self.match(AleoParser.DIGITS) + self.state = 610 self.group_type() except RecognitionException as re: localctx.exception = re @@ -4288,17 +4286,17 @@ def scalar_literal(self): self._la = 0 # Token type try: self.enterOuterAlt(localctx, 1) - self.state = 612 + self.state = 613 self._errHandler.sync(self) _la = self._input.LA(1) if _la==8: - self.state = 611 + self.state = 612 self.match(AleoParser.DS) - self.state = 614 - self.match(AleoParser.DIGITS) self.state = 615 + self.match(AleoParser.DIGITS) + self.state = 616 self.scalar_type() except RecognitionException as re: localctx.exception = re @@ -4351,30 +4349,30 @@ def arithmetic_literal(self): localctx = AleoParser.Arithmetic_literalContext(self, self._ctx, self.state) self.enterRule(localctx, 94, self.RULE_arithmetic_literal) try: - self.state = 621 + self.state = 622 self._errHandler.sync(self) la_ = self._interp.adaptivePredict(self._input,35,self._ctx) if la_ == 1: self.enterOuterAlt(localctx, 1) - self.state = 617 + self.state = 618 self.integer_literal() pass elif la_ == 2: self.enterOuterAlt(localctx, 2) - self.state = 618 + self.state = 619 self.field_literal() pass elif la_ == 3: self.enterOuterAlt(localctx, 3) - self.state = 619 + self.state = 620 self.group_literal() pass elif la_ == 4: self.enterOuterAlt(localctx, 4) - self.state = 620 + self.state = 621 self.scalar_literal() pass @@ -4418,7 +4416,7 @@ def address_literal(self): self.enterRule(localctx, 96, self.RULE_address_literal) try: self.enterOuterAlt(localctx, 1) - self.state = 623 + self.state = 624 self.match(AleoParser.ADDRESS_LITERAL) except RecognitionException as re: localctx.exception = re @@ -4459,7 +4457,7 @@ def signature_literal(self): self.enterRule(localctx, 98, self.RULE_signature_literal) try: self.enterOuterAlt(localctx, 1) - self.state = 625 + self.state = 626 self.match(AleoParser.SIGNATURE_LITERAL) except RecognitionException as re: localctx.exception = re @@ -4504,7 +4502,7 @@ def boolean_literal(self): self._la = 0 # Token type try: self.enterOuterAlt(localctx, 1) - self.state = 627 + self.state = 628 _la = self._input.LA(1) if not(_la==103 or _la==104): self._errHandler.recoverInline(self) @@ -4550,7 +4548,7 @@ def unsigned_type(self): self.enterRule(localctx, 102, self.RULE_unsigned_type) try: self.enterOuterAlt(localctx, 1) - self.state = 629 + self.state = 630 self.match(AleoParser.UNSIGNED_TYPE) except RecognitionException as re: localctx.exception = re @@ -4591,7 +4589,7 @@ def signed_type(self): self.enterRule(localctx, 104, self.RULE_signed_type) try: self.enterOuterAlt(localctx, 1) - self.state = 631 + self.state = 632 self.match(AleoParser.SIGNED_TYPE) except RecognitionException as re: localctx.exception = re @@ -4636,17 +4634,17 @@ def integer_type(self): localctx = AleoParser.Integer_typeContext(self, self._ctx, self.state) self.enterRule(localctx, 106, self.RULE_integer_type) try: - self.state = 635 + self.state = 636 self._errHandler.sync(self) token = self._input.LA(1) if token in [105]: self.enterOuterAlt(localctx, 1) - self.state = 633 + self.state = 634 self.unsigned_type() pass elif token in [106]: self.enterOuterAlt(localctx, 2) - self.state = 634 + self.state = 635 self.signed_type() pass else: @@ -4691,7 +4689,7 @@ def field_type(self): self.enterRule(localctx, 108, self.RULE_field_type) try: self.enterOuterAlt(localctx, 1) - self.state = 637 + self.state = 638 self.match(AleoParser.FIELD) except RecognitionException as re: localctx.exception = re @@ -4732,7 +4730,7 @@ def group_type(self): self.enterRule(localctx, 110, self.RULE_group_type) try: self.enterOuterAlt(localctx, 1) - self.state = 639 + self.state = 640 self.match(AleoParser.GROUP) except RecognitionException as re: localctx.exception = re @@ -4773,7 +4771,7 @@ def scalar_type(self): self.enterRule(localctx, 112, self.RULE_scalar_type) try: self.enterOuterAlt(localctx, 1) - self.state = 641 + self.state = 642 self.match(AleoParser.SCALAR) except RecognitionException as re: localctx.exception = re @@ -4826,27 +4824,27 @@ def arithmetic_type(self): localctx = AleoParser.Arithmetic_typeContext(self, self._ctx, self.state) self.enterRule(localctx, 114, self.RULE_arithmetic_type) try: - self.state = 647 + self.state = 648 self._errHandler.sync(self) token = self._input.LA(1) if token in [105, 106]: self.enterOuterAlt(localctx, 1) - self.state = 643 + self.state = 644 self.integer_type() pass elif token in [107]: self.enterOuterAlt(localctx, 2) - self.state = 644 + self.state = 645 self.field_type() pass elif token in [17]: self.enterOuterAlt(localctx, 3) - self.state = 645 + self.state = 646 self.group_type() pass elif token in [108]: self.enterOuterAlt(localctx, 4) - self.state = 646 + self.state = 647 self.scalar_type() pass else: @@ -4891,7 +4889,7 @@ def address_type(self): self.enterRule(localctx, 116, self.RULE_address_type) try: self.enterOuterAlt(localctx, 1) - self.state = 649 + self.state = 650 self.match(AleoParser.ADDRESS) except RecognitionException as re: localctx.exception = re @@ -4932,7 +4930,7 @@ def boolean_type(self): self.enterRule(localctx, 118, self.RULE_boolean_type) try: self.enterOuterAlt(localctx, 1) - self.state = 651 + self.state = 652 self.match(AleoParser.BOOLEAN) except RecognitionException as re: localctx.exception = re @@ -4973,7 +4971,7 @@ def signature_type(self): self.enterRule(localctx, 120, self.RULE_signature_type) try: self.enterOuterAlt(localctx, 1) - self.state = 653 + self.state = 654 self.match(AleoParser.SIGNATURE) except RecognitionException as re: localctx.exception = re @@ -5026,27 +5024,27 @@ def literal_type(self): localctx = AleoParser.Literal_typeContext(self, self._ctx, self.state) self.enterRule(localctx, 122, self.RULE_literal_type) try: - self.state = 659 + self.state = 660 self._errHandler.sync(self) token = self._input.LA(1) if token in [17, 105, 106, 107, 108]: self.enterOuterAlt(localctx, 1) - self.state = 655 + self.state = 656 self.arithmetic_type() pass elif token in [109]: self.enterOuterAlt(localctx, 2) - self.state = 656 + self.state = 657 self.address_type() pass elif token in [111]: self.enterOuterAlt(localctx, 3) - self.state = 657 + self.state = 658 self.signature_type() pass elif token in [110]: self.enterOuterAlt(localctx, 4) - self.state = 658 + self.state = 659 self.boolean_type() pass else: @@ -5105,15 +5103,15 @@ def array_type(self): self.enterRule(localctx, 124, self.RULE_array_type) try: self.enterOuterAlt(localctx, 1) - self.state = 661 - self.match(AleoParser.LB) self.state = 662 - self.plaintext_type() + self.match(AleoParser.LB) self.state = 663 - self.match(AleoParser.SC) + self.plaintext_type() self.state = 664 - self.unsigned_literal() + self.match(AleoParser.SC) self.state = 665 + self.unsigned_literal() + self.state = 666 self.match(AleoParser.RB) except RecognitionException as re: localctx.exception = re @@ -5162,24 +5160,24 @@ def plaintext_type(self): localctx = AleoParser.Plaintext_typeContext(self, self._ctx, self.state) self.enterRule(localctx, 126, self.RULE_plaintext_type) try: - self.state = 670 + self.state = 671 self._errHandler.sync(self) la_ = self._interp.adaptivePredict(self._input,39,self._ctx) if la_ == 1: self.enterOuterAlt(localctx, 1) - self.state = 667 + self.state = 668 self.literal_type() pass elif la_ == 2: self.enterOuterAlt(localctx, 2) - self.state = 668 + self.state = 669 self.array_type() pass elif la_ == 3: self.enterOuterAlt(localctx, 3) - self.state = 669 + self.state = 670 self.identifier() pass @@ -5235,30 +5233,30 @@ def value_type(self): localctx = AleoParser.Value_typeContext(self, self._ctx, self.state) self.enterRule(localctx, 128, self.RULE_value_type) try: - self.state = 681 + self.state = 682 self._errHandler.sync(self) la_ = self._interp.adaptivePredict(self._input,40,self._ctx) if la_ == 1: self.enterOuterAlt(localctx, 1) - self.state = 672 - self.plaintext_type() self.state = 673 + self.plaintext_type() + self.state = 674 self.modifier() pass elif la_ == 2: self.enterOuterAlt(localctx, 2) - self.state = 675 - self.identifier() self.state = 676 + self.identifier() + self.state = 677 self.modifier() pass elif la_ == 3: self.enterOuterAlt(localctx, 3) - self.state = 678 - self.locator() self.state = 679 + self.locator() + self.state = 680 self.modifier() pass @@ -5307,9 +5305,9 @@ def mapping_type(self): self.enterRule(localctx, 130, self.RULE_mapping_type) try: self.enterOuterAlt(localctx, 1) - self.state = 683 - self.plaintext_type() self.state = 684 + self.plaintext_type() + self.state = 685 self.modifier() except RecognitionException as re: localctx.exception = re @@ -5358,22 +5356,22 @@ def finalize_type(self): localctx = AleoParser.Finalize_typeContext(self, self._ctx, self.state) self.enterRule(localctx, 132, self.RULE_finalize_type) try: - self.state = 692 + self.state = 693 self._errHandler.sync(self) la_ = self._interp.adaptivePredict(self._input,41,self._ctx) if la_ == 1: self.enterOuterAlt(localctx, 1) - self.state = 686 - self.plaintext_type() self.state = 687 + self.plaintext_type() + self.state = 688 self.modifier() pass elif la_ == 2: self.enterOuterAlt(localctx, 2) - self.state = 689 - self.locator() self.state = 690 + self.locator() + self.state = 691 self.modifier() pass @@ -5422,9 +5420,9 @@ def entry_type(self): self.enterRule(localctx, 134, self.RULE_entry_type) try: self.enterOuterAlt(localctx, 1) - self.state = 694 - self.plaintext_type() self.state = 695 + self.plaintext_type() + self.state = 696 self.modifier() except RecognitionException as re: localctx.exception = re @@ -5477,28 +5475,28 @@ def register_type(self): localctx = AleoParser.Register_typeContext(self, self._ctx, self.state) self.enterRule(localctx, 136, self.RULE_register_type) try: - self.state = 704 + self.state = 705 self._errHandler.sync(self) la_ = self._interp.adaptivePredict(self._input,42,self._ctx) if la_ == 1: self.enterOuterAlt(localctx, 1) - self.state = 697 - self.locator() self.state = 698 + self.locator() + self.state = 699 self.modifier() pass elif la_ == 2: self.enterOuterAlt(localctx, 2) - self.state = 700 - self.identifier() self.state = 701 + self.identifier() + self.state = 702 self.modifier() pass elif la_ == 3: self.enterOuterAlt(localctx, 3) - self.state = 703 + self.state = 704 self.plaintext_type() pass @@ -5558,9 +5556,9 @@ def modifier(self): self._la = 0 # Token type try: self.enterOuterAlt(localctx, 1) - self.state = 706 - self.match(AleoParser.DOT) self.state = 707 + self.match(AleoParser.DOT) + self.state = 708 _la = self._input.LA(1) if not((((_la) & ~0x3f) == 0 and ((1 << _la) & 126976) != 0)): self._errHandler.recoverInline(self) @@ -5614,11 +5612,11 @@ def program_id(self): self.enterRule(localctx, 140, self.RULE_program_id) try: self.enterOuterAlt(localctx, 1) - self.state = 709 - self.program_name() self.state = 710 - self.match(AleoParser.DOT) + self.program_name() self.state = 711 + self.match(AleoParser.DOT) + self.state = 712 self.program_domain() except RecognitionException as re: localctx.exception = re @@ -5660,7 +5658,7 @@ def program_name(self): self.enterRule(localctx, 142, self.RULE_program_name) try: self.enterOuterAlt(localctx, 1) - self.state = 713 + self.state = 714 self.identifier() except RecognitionException as re: localctx.exception = re @@ -5702,7 +5700,7 @@ def program_domain(self): self.enterRule(localctx, 144, self.RULE_program_domain) try: self.enterOuterAlt(localctx, 1) - self.state = 715 + self.state = 716 self.identifier() except RecognitionException as re: localctx.exception = re @@ -5743,7 +5741,7 @@ def register(self): self.enterRule(localctx, 146, self.RULE_register) try: self.enterOuterAlt(localctx, 1) - self.state = 717 + self.state = 718 self.match(AleoParser.REGISTER) except RecognitionException as re: localctx.exception = re @@ -5793,15 +5791,15 @@ def register_access(self): self._la = 0 # Token type try: self.enterOuterAlt(localctx, 1) - self.state = 719 + self.state = 720 self.register() - self.state = 723 + self.state = 724 self._errHandler.sync(self) _la = self._input.LA(1) while _la==1 or _la==3: - self.state = 720 + self.state = 721 self.register_accessor() - self.state = 725 + self.state = 726 self._errHandler.sync(self) _la = self._input.LA(1) @@ -5848,17 +5846,17 @@ def register_accessor(self): localctx = AleoParser.Register_accessorContext(self, self._ctx, self.state) self.enterRule(localctx, 150, self.RULE_register_accessor) try: - self.state = 728 + self.state = 729 self._errHandler.sync(self) token = self._input.LA(1) if token in [1]: self.enterOuterAlt(localctx, 1) - self.state = 726 + self.state = 727 self.access_by_field() pass elif token in [3]: self.enterOuterAlt(localctx, 2) - self.state = 727 + self.state = 728 self.access_by_index() pass else: @@ -5907,9 +5905,9 @@ def access_by_field(self): self.enterRule(localctx, 152, self.RULE_access_by_field) try: self.enterOuterAlt(localctx, 1) - self.state = 730 - self.match(AleoParser.DOT) self.state = 731 + self.match(AleoParser.DOT) + self.state = 732 self.identifier() except RecognitionException as re: localctx.exception = re @@ -5959,26 +5957,26 @@ def access_by_index(self): localctx = AleoParser.Access_by_indexContext(self, self._ctx, self.state) self.enterRule(localctx, 154, self.RULE_access_by_index) try: - self.state = 740 + self.state = 741 self._errHandler.sync(self) la_ = self._interp.adaptivePredict(self._input,45,self._ctx) if la_ == 1: self.enterOuterAlt(localctx, 1) - self.state = 733 - self.match(AleoParser.LB) self.state = 734 - self.unsigned_literal() + self.match(AleoParser.LB) self.state = 735 + self.unsigned_literal() + self.state = 736 self.match(AleoParser.RB) pass elif la_ == 2: self.enterOuterAlt(localctx, 2) - self.state = 737 - self.match(AleoParser.LB) self.state = 738 - self.match(AleoParser.DIGITS) + self.match(AleoParser.LB) self.state = 739 + self.match(AleoParser.DIGITS) + self.state = 740 self.match(AleoParser.RB) pass @@ -6034,30 +6032,30 @@ def operand(self): localctx = AleoParser.OperandContext(self, self._ctx, self.state) self.enterRule(localctx, 156, self.RULE_operand) try: - self.state = 746 + self.state = 747 self._errHandler.sync(self) la_ = self._interp.adaptivePredict(self._input,46,self._ctx) if la_ == 1: self.enterOuterAlt(localctx, 1) - self.state = 742 + self.state = 743 self.literal() pass elif la_ == 2: self.enterOuterAlt(localctx, 2) - self.state = 743 + self.state = 744 self.register_access() pass elif la_ == 3: self.enterOuterAlt(localctx, 3) - self.state = 744 + self.state = 745 self.program_id() pass elif la_ == 4: self.enterOuterAlt(localctx, 4) - self.state = 745 + self.state = 746 self.operand_preset() pass @@ -6125,25 +6123,25 @@ def operand_preset(self): self.enterRule(localctx, 158, self.RULE_operand_preset) self._la = 0 # Token type try: - self.state = 757 + self.state = 758 self._errHandler.sync(self) token = self._input.LA(1) if token in [17]: self.enterOuterAlt(localctx, 1) - self.state = 748 - self.match(AleoParser.GROUP) self.state = 749 - self.match(AleoParser.CC) + self.match(AleoParser.GROUP) self.state = 750 + self.match(AleoParser.CC) + self.state = 751 self.match(AleoParser.GEN) pass elif token in [19]: self.enterOuterAlt(localctx, 2) - self.state = 751 - self.match(AleoParser.SELF) self.state = 752 - self.match(AleoParser.DOT) + self.match(AleoParser.SELF) self.state = 753 + self.match(AleoParser.DOT) + self.state = 754 _la = self._input.LA(1) if not(_la==20 or _la==21): self._errHandler.recoverInline(self) @@ -6153,11 +6151,11 @@ def operand_preset(self): pass elif token in [22]: self.enterOuterAlt(localctx, 3) - self.state = 754 - self.match(AleoParser.BLOCK) self.state = 755 - self.match(AleoParser.DOT) + self.match(AleoParser.BLOCK) self.state = 756 + self.match(AleoParser.DOT) + self.state = 757 self.match(AleoParser.HEIGHT) pass else: @@ -6213,13 +6211,13 @@ def tuple_(self): self.enterRule(localctx, 160, self.RULE_tuple) try: self.enterOuterAlt(localctx, 1) - self.state = 759 - self.identifier() self.state = 760 - self.match(AleoParser.AS) + self.identifier() self.state = 761 - self.plaintext_type() + self.match(AleoParser.AS) self.state = 762 + self.plaintext_type() + self.state = 763 self.match(AleoParser.SC) except RecognitionException as re: localctx.exception = re @@ -6271,13 +6269,13 @@ def entry(self): self.enterRule(localctx, 162, self.RULE_entry) try: self.enterOuterAlt(localctx, 1) - self.state = 764 - self.identifier() self.state = 765 - self.match(AleoParser.AS) + self.identifier() self.state = 766 - self.entry_type() + self.match(AleoParser.AS) self.state = 767 + self.entry_type() + self.state = 768 self.match(AleoParser.SC) except RecognitionException as re: localctx.exception = re @@ -6326,11 +6324,11 @@ def locator(self): self.enterRule(localctx, 164, self.RULE_locator) try: self.enterOuterAlt(localctx, 1) - self.state = 769 - self.program_id() self.state = 770 - self.match(AleoParser.SLASH) + self.program_id() self.state = 771 + self.match(AleoParser.SLASH) + self.state = 772 self.identifier() except RecognitionException as re: localctx.exception = re @@ -6379,24 +6377,24 @@ def cast_destination(self): localctx = AleoParser.Cast_destinationContext(self, self._ctx, self.state) self.enterRule(localctx, 166, self.RULE_cast_destination) try: - self.state = 776 + self.state = 777 self._errHandler.sync(self) la_ = self._interp.adaptivePredict(self._input,48,self._ctx) if la_ == 1: self.enterOuterAlt(localctx, 1) - self.state = 773 + self.state = 774 self.register_type() pass elif la_ == 2: self.enterOuterAlt(localctx, 2) - self.state = 774 + self.state = 775 self.locator() pass elif la_ == 3: self.enterOuterAlt(localctx, 3) - self.state = 775 + self.state = 776 self.destination_group() pass @@ -6450,11 +6448,11 @@ def destination_group(self): self._la = 0 # Token type try: self.enterOuterAlt(localctx, 1) - self.state = 778 - self.match(AleoParser.GROUP) self.state = 779 - self.match(AleoParser.DOT) + self.match(AleoParser.GROUP) self.state = 780 + self.match(AleoParser.DOT) + self.state = 781 _la = self._input.LA(1) if not(_la==25 or _la==26): self._errHandler.recoverInline(self) @@ -6524,52 +6522,52 @@ def unary_op(self): self.enterRule(localctx, 170, self.RULE_unary_op) self._la = 0 # Token type try: - self.state = 793 + self.state = 794 self._errHandler.sync(self) token = self._input.LA(1) if token in [42]: self.enterOuterAlt(localctx, 1) - self.state = 782 + self.state = 783 self.match(AleoParser.ABS) - self.state = 785 + self.state = 786 self._errHandler.sync(self) _la = self._input.LA(1) if _la==1: - self.state = 783 - self.match(AleoParser.DOT) self.state = 784 + self.match(AleoParser.DOT) + self.state = 785 self.match(AleoParser.W) pass elif token in [43]: self.enterOuterAlt(localctx, 2) - self.state = 787 + self.state = 788 self.match(AleoParser.DOUBLE) pass elif token in [44]: self.enterOuterAlt(localctx, 3) - self.state = 788 + self.state = 789 self.match(AleoParser.INV) pass elif token in [45]: self.enterOuterAlt(localctx, 4) - self.state = 789 + self.state = 790 self.match(AleoParser.NEG) pass elif token in [46]: self.enterOuterAlt(localctx, 5) - self.state = 790 + self.state = 791 self.match(AleoParser.NOT) pass elif token in [47]: self.enterOuterAlt(localctx, 6) - self.state = 791 + self.state = 792 self.match(AleoParser.SQUARE) pass elif token in [48]: self.enterOuterAlt(localctx, 7) - self.state = 792 + self.state = 793 self.match(AleoParser.SQRT) pass else: @@ -6671,177 +6669,177 @@ def binary_op(self): self.enterRule(localctx, 172, self.RULE_binary_op) self._la = 0 # Token type try: - self.state = 845 + self.state = 846 self._errHandler.sync(self) token = self._input.LA(1) if token in [49]: self.enterOuterAlt(localctx, 1) - self.state = 795 + self.state = 796 self.match(AleoParser.ADD) - self.state = 798 + self.state = 799 self._errHandler.sync(self) _la = self._input.LA(1) if _la==1: - self.state = 796 - self.match(AleoParser.DOT) self.state = 797 + self.match(AleoParser.DOT) + self.state = 798 self.match(AleoParser.W) pass elif token in [50]: self.enterOuterAlt(localctx, 2) - self.state = 800 + self.state = 801 self.match(AleoParser.SUB) - self.state = 803 + self.state = 804 self._errHandler.sync(self) _la = self._input.LA(1) if _la==1: - self.state = 801 - self.match(AleoParser.DOT) self.state = 802 + self.match(AleoParser.DOT) + self.state = 803 self.match(AleoParser.W) pass elif token in [51]: self.enterOuterAlt(localctx, 3) - self.state = 805 + self.state = 806 self.match(AleoParser.MUL) - self.state = 808 + self.state = 809 self._errHandler.sync(self) _la = self._input.LA(1) if _la==1: - self.state = 806 - self.match(AleoParser.DOT) self.state = 807 + self.match(AleoParser.DOT) + self.state = 808 self.match(AleoParser.W) pass elif token in [52]: self.enterOuterAlt(localctx, 4) - self.state = 810 + self.state = 811 self.match(AleoParser.DIV) - self.state = 813 + self.state = 814 self._errHandler.sync(self) _la = self._input.LA(1) if _la==1: - self.state = 811 - self.match(AleoParser.DOT) self.state = 812 + self.match(AleoParser.DOT) + self.state = 813 self.match(AleoParser.W) pass elif token in [53]: self.enterOuterAlt(localctx, 5) - self.state = 815 + self.state = 816 self.match(AleoParser.REM) - self.state = 818 + self.state = 819 self._errHandler.sync(self) _la = self._input.LA(1) if _la==1: - self.state = 816 - self.match(AleoParser.DOT) self.state = 817 + self.match(AleoParser.DOT) + self.state = 818 self.match(AleoParser.W) pass elif token in [54]: self.enterOuterAlt(localctx, 6) - self.state = 820 + self.state = 821 self.match(AleoParser.POW) - self.state = 823 + self.state = 824 self._errHandler.sync(self) _la = self._input.LA(1) if _la==1: - self.state = 821 - self.match(AleoParser.DOT) self.state = 822 + self.match(AleoParser.DOT) + self.state = 823 self.match(AleoParser.W) pass elif token in [55]: self.enterOuterAlt(localctx, 7) - self.state = 825 + self.state = 826 self.match(AleoParser.SHL) - self.state = 828 + self.state = 829 self._errHandler.sync(self) _la = self._input.LA(1) if _la==1: - self.state = 826 - self.match(AleoParser.DOT) self.state = 827 + self.match(AleoParser.DOT) + self.state = 828 self.match(AleoParser.W) pass elif token in [56]: self.enterOuterAlt(localctx, 8) - self.state = 830 + self.state = 831 self.match(AleoParser.SHR) - self.state = 833 + self.state = 834 self._errHandler.sync(self) _la = self._input.LA(1) if _la==1: - self.state = 831 - self.match(AleoParser.DOT) self.state = 832 + self.match(AleoParser.DOT) + self.state = 833 self.match(AleoParser.W) pass elif token in [57]: self.enterOuterAlt(localctx, 9) - self.state = 835 + self.state = 836 self.match(AleoParser.MOD) pass elif token in [58]: self.enterOuterAlt(localctx, 10) - self.state = 836 + self.state = 837 self.match(AleoParser.AND) pass elif token in [59]: self.enterOuterAlt(localctx, 11) - self.state = 837 + self.state = 838 self.match(AleoParser.OR) pass elif token in [60]: self.enterOuterAlt(localctx, 12) - self.state = 838 + self.state = 839 self.match(AleoParser.XOR) pass elif token in [61]: self.enterOuterAlt(localctx, 13) - self.state = 839 + self.state = 840 self.match(AleoParser.NAND) pass elif token in [62]: self.enterOuterAlt(localctx, 14) - self.state = 840 + self.state = 841 self.match(AleoParser.NOR) pass elif token in [63]: self.enterOuterAlt(localctx, 15) - self.state = 841 + self.state = 842 self.match(AleoParser.GT) pass elif token in [64]: self.enterOuterAlt(localctx, 16) - self.state = 842 + self.state = 843 self.match(AleoParser.GTE) pass elif token in [65]: self.enterOuterAlt(localctx, 17) - self.state = 843 + self.state = 844 self.match(AleoParser.LT) pass elif token in [66]: self.enterOuterAlt(localctx, 18) - self.state = 844 + self.state = 845 self.match(AleoParser.LTE) pass else: @@ -6896,11 +6894,11 @@ def is_op(self): self._la = 0 # Token type try: self.enterOuterAlt(localctx, 1) - self.state = 847 - self.match(AleoParser.IS) self.state = 848 - self.match(AleoParser.DOT) + self.match(AleoParser.IS) self.state = 849 + self.match(AleoParser.DOT) + self.state = 850 _la = self._input.LA(1) if not(_la==68 or _la==69): self._errHandler.recoverInline(self) @@ -6956,11 +6954,11 @@ def assert_op(self): self._la = 0 # Token type try: self.enterOuterAlt(localctx, 1) - self.state = 851 - self.match(AleoParser.ASSERT) self.state = 852 - self.match(AleoParser.DOT) + self.match(AleoParser.ASSERT) self.state = 853 + self.match(AleoParser.DOT) + self.state = 854 _la = self._input.LA(1) if not(_la==68 or _la==69): self._errHandler.recoverInline(self) @@ -7028,11 +7026,11 @@ def commit_op(self): self._la = 0 # Token type try: self.enterOuterAlt(localctx, 1) - self.state = 855 - self.match(AleoParser.COMMIT) self.state = 856 - self.match(AleoParser.DOT) + self.match(AleoParser.COMMIT) self.state = 857 + self.match(AleoParser.DOT) + self.state = 858 _la = self._input.LA(1) if not(((((_la - 74)) & ~0x3f) == 0 and ((1 << (_la - 74)) & 63) != 0)): self._errHandler.recoverInline(self) @@ -7127,11 +7125,11 @@ def hash1_op(self): self._la = 0 # Token type try: self.enterOuterAlt(localctx, 1) - self.state = 859 - self.match(AleoParser.HASH) self.state = 860 - self.match(AleoParser.DOT) + self.match(AleoParser.HASH) self.state = 861 + self.match(AleoParser.DOT) + self.state = 862 _la = self._input.LA(1) if not(((((_la - 74)) & ~0x3f) == 0 and ((1 << (_la - 74)) & 32767) != 0)): self._errHandler.recoverInline(self) @@ -7190,11 +7188,11 @@ def hash2_op(self): self._la = 0 # Token type try: self.enterOuterAlt(localctx, 1) - self.state = 863 - self.match(AleoParser.HASH_MANY) self.state = 864 - self.match(AleoParser.DOT) + self.match(AleoParser.HASH_MANY) self.state = 865 + self.match(AleoParser.DOT) + self.state = 866 _la = self._input.LA(1) if not(((((_la - 80)) & ~0x3f) == 0 and ((1 << (_la - 80)) & 7) != 0)): self._errHandler.recoverInline(self) @@ -7247,15 +7245,15 @@ def cast_op(self): self._la = 0 # Token type try: self.enterOuterAlt(localctx, 1) - self.state = 867 + self.state = 868 self.match(AleoParser.CAST) - self.state = 870 + self.state = 871 self._errHandler.sync(self) _la = self._input.LA(1) if _la==1: - self.state = 868 - self.match(AleoParser.DOT) self.state = 869 + self.match(AleoParser.DOT) + self.state = 870 self.match(AleoParser.LOSSY) @@ -7308,11 +7306,11 @@ def branch_op(self): self._la = 0 # Token type try: self.enterOuterAlt(localctx, 1) - self.state = 872 - self.match(AleoParser.BRANCH) self.state = 873 - self.match(AleoParser.DOT) + self.match(AleoParser.BRANCH) self.state = 874 + self.match(AleoParser.DOT) + self.state = 875 _la = self._input.LA(1) if not(_la==68 or _la==69): self._errHandler.recoverInline(self) @@ -7364,11 +7362,11 @@ def random_op(self): self.enterRule(localctx, 188, self.RULE_random_op) try: self.enterOuterAlt(localctx, 1) - self.state = 876 - self.match(AleoParser.RAND) self.state = 877 - self.match(AleoParser.DOT) + self.match(AleoParser.RAND) self.state = 878 + self.match(AleoParser.DOT) + self.state = 879 self.match(AleoParser.CHACHA) except RecognitionException as re: localctx.exception = re @@ -7415,11 +7413,11 @@ def get_or_use_op(self): self.enterRule(localctx, 190, self.RULE_get_or_use_op) try: self.enterOuterAlt(localctx, 1) - self.state = 880 - self.match(AleoParser.GET) self.state = 881 - self.match(AleoParser.DOT) + self.match(AleoParser.GET) self.state = 882 + self.match(AleoParser.DOT) + self.state = 883 self.match(AleoParser.OR_USE) except RecognitionException as re: localctx.exception = re @@ -7468,21 +7466,21 @@ def sign_verify_op(self): localctx = AleoParser.Sign_verify_opContext(self, self._ctx, self.state) self.enterRule(localctx, 192, self.RULE_sign_verify_op) try: - self.state = 888 + self.state = 889 self._errHandler.sync(self) token = self._input.LA(1) if token in [37]: self.enterOuterAlt(localctx, 1) - self.state = 884 - self.match(AleoParser.SIGN) self.state = 885 - self.match(AleoParser.DOT) + self.match(AleoParser.SIGN) self.state = 886 + self.match(AleoParser.DOT) + self.state = 887 self.match(AleoParser.VERIFY) pass elif token in [39]: self.enterOuterAlt(localctx, 2) - self.state = 887 + self.state = 888 self.match(AleoParser.SIGN_VERIFY) pass else: @@ -7527,7 +7525,7 @@ def label(self): self.enterRule(localctx, 194, self.RULE_label) try: self.enterOuterAlt(localctx, 1) - self.state = 890 + self.state = 891 self.match(AleoParser.IDENTIFIER) except RecognitionException as re: localctx.exception = re @@ -7887,7 +7885,7 @@ def identifier(self): self._la = 0 # Token type try: self.enterOuterAlt(localctx, 1) - self.state = 892 + self.state = 893 _la = self._input.LA(1) if not((((_la) & ~0x3f) == 0 and ((1 << _la) & -512) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & 7881299347898367) != 0)): self._errHandler.recoverInline(self) diff --git a/vanguard/aleo/run.py b/vanguard/aleo/run.py new file mode 100644 index 0000000..f5e7c98 --- /dev/null +++ b/vanguard/aleo/run.py @@ -0,0 +1,46 @@ +#!/usr/bin/env python +# NOTE: this is project script and shall not be called directly + +import argparse + +from tabulate import tabulate + +from .common import detect +from . import detectors as dlib + +def run(): + # get all available detectors + dlib_choices = [ p.replace("detector_", "") for p in dir(dlib) if p.startswith("detector_") ] + + # parse + ap = argparse.ArgumentParser() + ap.add_argument("-b", "--build", default="./", type=str, help="project build path, default: ./") + ap.add_argument("-p", "--pid", default=None, type=str, help="program id, default: ") + ap.add_argument("-f", "--fids", default=None, type=str, help="function ids (separated by comma, no space), default: ") + ap.add_argument("-d", "--detector", default="infoleak", type=str, choices=dlib_choices, help="detector to use, default: infoleak") + ap.add_argument("-v", "--verbose", action="store_true", help="whether or not to return extra info, default: False") + args = ap.parse_args() + + # process + _build = args.build + _pid = args.pid + _fids = args.fids if args.fids is None else args.fids.split(",") + _detector = args.detector + + # call + ret = detect(_build, pid=_pid, fids=_fids, detector=_detector, readable=True) + + # format and print + # compute indentation + headers = ["id", "program", "function", "detector", "result", "info"] + + sret = [ + (p[0], p[1], _detector, "unsafe" if p[2] else "safe", p[3]) if args.verbose else\ + (p[0], p[1], _detector, "unsafe" if p[2] else "safe") + for p in ret + ] + + print(tabulate(sret, headers=headers, showindex=True, tablefmt="github")) + +if __name__ == "__main__": + run() \ No newline at end of file