diff --git a/.github/workflows/check_copyright.yml b/.github/workflows/check_copyright.yml index 9ed4c485..4906aecc 100644 --- a/.github/workflows/check_copyright.yml +++ b/.github/workflows/check_copyright.yml @@ -6,7 +6,7 @@ jobs: copyright_header_check: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v6 - name: Check license & copyright headers uses: viperproject/check-license-header@v2 with: diff --git a/.github/workflows/check_copyright_config.json b/.github/workflows/check_copyright_config.json index 0c6a9d3c..3207b684 100644 --- a/.github/workflows/check_copyright_config.json +++ b/.github/workflows/check_copyright_config.json @@ -6,7 +6,10 @@ ], "exclude": [ "docs/**", - "**/*.ini" + "**/*.ini", + "src/oqd_core/frontend/**", + "src/grammar/**", + "**/__init__.py" ], "license": ".github/workflows/copyright.txt" } diff --git a/.github/workflows/check_mkdocs_build.yml b/.github/workflows/check_mkdocs_build.yml index 116f6d49..dbec5f2c 100644 --- a/.github/workflows/check_mkdocs_build.yml +++ b/.github/workflows/check_mkdocs_build.yml @@ -6,7 +6,7 @@ jobs: deploy: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v6 - uses: actions/setup-python@v5 with: python-version: 3.x @@ -18,7 +18,7 @@ jobs: restore-keys: | mkdocs-material- - name: Install uv - uses: astral-sh/setup-uv@v4 + uses: astral-sh/setup-uv@v6 # - run: cp -r examples/ docs/examples/ - run: uv pip install .[docs] --system - run: mkdocs build \ No newline at end of file diff --git a/.github/workflows/pytest.yml b/.github/workflows/pytest.yml index 8657d06f..8725c355 100644 --- a/.github/workflows/pytest.yml +++ b/.github/workflows/pytest.yml @@ -2,9 +2,9 @@ name: CI - Pytest on: push: - branches: ["main"] + branches: ["main", "v1.0"] pull_request: - branches: ["main"] + branches: ["main", "v1.0"] workflow_dispatch: permissions: @@ -13,10 +13,8 @@ permissions: jobs: test: strategy: - fail-fast: false matrix: python-version: - - "3.10" - "3.11" - "3.12" - "3.13" @@ -26,13 +24,13 @@ jobs: - windows-latest arch: - x64 - name: Test ${{ matrix.version }} on ${{ matrix.os }} (${{ matrix.arch }}) + name: Python ${{ matrix.python-version }} - ${{ matrix.os }} - ${{ matrix.arch }} - ${{ github.event_name }} runs-on: ${{ matrix.os }} steps: - name: Checkout repo - uses: actions/checkout@v4 + uses: actions/checkout@v6 - name: Install uv and set the python version - uses: astral-sh/setup-uv@v5 + uses: astral-sh/setup-uv@v7 with: enable-cache: true python-version: ${{ matrix.python-version }} @@ -41,4 +39,4 @@ jobs: uv sync --extra tests - name: Run tests run: | - uv run pytest tests -v + uv run pytest tests/test_frontend -v diff --git a/examples/analog/test.analog b/examples/analog/test.analog index 377593fe..44c2af52 100644 --- a/examples/analog/test.analog +++ b/examples/analog/test.analog @@ -1,93 +1,93 @@ // assignments -r = qreg(2); -s = qmode(3); -q0 = r[0]; -q1 = r[1]; -targets = [q0, q1]; +r = qreg(2) +s = qmode(3) +q0 = r[0] +q1 = r[1] +targets = [q0, q1] // math -pi = 3.14159; -tau = 2 * pi; -omega = #omega; -phase = #t * omega + #phi; -neg = -1; -cubed = 2^3; -sine = sin(0.5); -cosed = cos(phase); -cplx = 1.0 + 1j * 0.5; +pi = 3.14159 +tau = 2 * pi +omega = #omega +phase = #t * omega + #phi +neg = -1 +cubed = 2^3 +sine = sin(0.5) +cosed = cos(phase) +cplx = 1.0 + 1j * 0.5 // Operators -X = %X; -Y = %Y; -Z = %Z; -I = %I; -C = %C; -A = %A; -J = %J; -H_single = 0.5 * %X + 0.5 * %Z; -H_pair = (%X %@ %I) %+ (%I %@ %X); -H_rabi = (0.5 * #t) * (%X %@ %I) %+ 0.5 * (%I %@ %Y); +X = %X +Y = %Y +Z = %Z +I = %I +C = %C +A = %A +J = %J +H_single = 0.5 * %X + 0.5 * %Z +H_pair = (%X %@ %I) %+ (%I %@ %X) +H_rabi = (0.5 * #t) * (%X %@ %I) %+ 0.5 * (%I %@ %Y) //control flow -x = 1; +x = 1 if (x > 0){ - initialize(r); + initialize(r) } if (x == 1) { - evolve(H_single, 1.0, r); + evolve(H_single, 1.0, r) } -else { evolve(H_pair, 0.5, r); } -n = 3; +else { evolve(H_pair, 0.5, r) } +n = 3 while (n > 0){ - evolve(H_rabi, 0.1, targets); - n = n - 1; + evolve(H_rabi, 0.1, targets) + n = n - 1 } while (true) { if (x == 1) { - break; + break } } // nested if else -a = 5; -b = 3; +a = 5 +b = 3 if (a > b) { if (b > 0) { - initialize(targets); + initialize(targets) } else { - measure(r); + measure(r) } } -initialize(r); +initialize(r) // evolve(hamiltonian, duration, target) -evolve(H_single, 2.0, r); -evolve(H_pair, 1.0, targets); -evolve(%X * 0.5, pi, q0); +evolve(H_single, 2.0, r) +evolve(H_pair, 1.0, targets) +evolve(%X * 0.5, pi, q0) -measure(r); -measurement = measure(q0); +measure(r) +measurement = measure(q0) // Bool expressions -flag = 1; +flag = 1 if (flag != 0) { - x = 0; + x = 0 } if (x <= 1) { - x = 1; + x = 1 } if (x >= 0) { - x = 0; + x = 0 } -a = true; +a = true if (a) { - b = 5; + b = 5 } diff --git a/examples/analog/test.ast b/examples/analog/test.ast index 0cb43fb9..2d62f54c 100644 --- a/examples/analog/test.ast +++ b/examples/analog/test.ast @@ -626,6 +626,17 @@ "name": "r" } }, + { + "class_": "Declaration", + "name": "measurement", + "value": { + "class_": "Measure", + "targets": { + "class_": "Access", + "name": "q0" + } + } + }, { "class_": "Declaration", "name": "flag", diff --git a/examples/analog/test.ipynb b/examples/analog/test.ipynb index 2e017f1c..e4db5684 100644 --- a/examples/analog/test.ipynb +++ b/examples/analog/test.ipynb @@ -39,88 +39,78 @@ "name": "stdout", "output_type": "stream", "text": [ - "r = qreg(2);\n", - "s = qmode(3);\n", - "q0 = r[0];\n", - "q1 = r[1];\n", - "targets = [q0, q1];\n", - "pi = 3.14159;\n", - "tau = 2 * pi;\n", - "omega = #omega;\n", - "phase = #t * omega + #phi;\n", - "neg = -1;\n", - "cubed = 2 ^ 3;\n", - "sine = sin(0.5);\n", - "cosed = cos(phase);\n", - "cplx = 1.0 + 1j * 0.5;\n", - "X = %X;\n", - "Y = %Y;\n", - "Z = %Z;\n", - "I = %I;\n", - "C = %C;\n", - "A = %A;\n", - "J = %J;\n", - "H_single = 0.5 * %X + 0.5 * %Z;\n", - "H_pair = %X %@ %I %+ %I %@ %X;\n", - "H_rabi = 0.5 * #t * %X %@ %I %+ 0.5 * %I %@ %Y;\n", - "x = 1;\n", + "r = qreg(2)\n", + "s = qmode(3)\n", + "q0 = r[0]\n", + "q1 = r[1]\n", + "targets = [q0, q1]\n", + "pi = 3.14159\n", + "tau = 2 * pi\n", + "omega = #omega\n", + "phase = #t * omega + #phi\n", + "neg = -1\n", + "cubed = 2 ^ 3\n", + "sine = sin(0.5)\n", + "cosed = cos(phase)\n", + "cplx = 1.0 + 1j * 0.5\n", + "X = %X\n", + "Y = %Y\n", + "Z = %Z\n", + "I = %I\n", + "C = %C\n", + "A = %A\n", + "J = %J\n", + "H_single = 0.5 * %X + 0.5 * %Z\n", + "H_pair = %X %@ %I %+ %I %@ %X\n", + "H_rabi = 0.5 * #t * %X %@ %I %+ 0.5 * %I %@ %Y\n", + "x = 1\n", "if (x > 0) {\n", - "initialize(r);\n", - "\n", - "};\n", + "initialize(r)\n", + "}\n", "if (x == 1) {\n", - "evolve(H_single, 1.0, r);\n", - "\n", + "evolve(H_single, 1.0, r)\n", "} else {\n", - "evolve(H_pair, 0.5, r);\n", - "\n", - "};\n", - "n = 3;\n", + "evolve(H_pair, 0.5, r)\n", + "}\n", + "n = 3\n", "while (n > 0) {\n", - "evolve(H_rabi, 0.1, targets);\n", - "n = n - 1;\n", - "};\n", + "evolve(H_rabi, 0.1, targets)\n", + "n = n - 1\n", + "}\n", "while (true) {\n", "if (x == 1) {\n", - "break;\n", - "\n", - "};\n", - "};\n", - "a = 5;\n", - "b = 3;\n", + "break\n", + "}\n", + "}\n", + "a = 5\n", + "b = 3\n", "if (a > b) {\n", "if (b > 0) {\n", - "initialize(targets);\n", - "\n", + "initialize(targets)\n", "} else {\n", - "measure(r);\n", - "\n", - "};\n", - "\n", - "};\n", - "initialize(r);\n", - "evolve(H_single, 2.0, r);\n", - "evolve(H_pair, 1.0, targets);\n", - "evolve(%X * 0.5, pi, q0);\n", - "measure(r);\n", - "flag = 1;\n", + "measure(r)\n", + "}\n", + "}\n", + "initialize(r)\n", + "evolve(H_single, 2.0, r)\n", + "evolve(H_pair, 1.0, targets)\n", + "evolve(%X * 0.5, pi, q0)\n", + "measure(r)\n", + "measurement = measure(q0)\n", + "flag = 1\n", "if (flag != 0) {\n", - "x = 0;\n", - "\n", - "};\n", + "x = 0\n", + "}\n", "if (x <= 1) {\n", - "x = 1;\n", - "\n", - "};\n", + "x = 1\n", + "}\n", "if (x >= 0) {\n", - "x = 0;\n", - "\n", - "};\n", - "a = true;\n", + "x = 0\n", + "}\n", + "a = true\n", "if (a) {\n", - "b = 5;\n", - "\n", - "};\n", + "b = 5\n", + "}\n", "\n" ] } diff --git a/examples/atomic/test.ast b/examples/atomic/test.ast index afa9b97f..dd956af3 100644 --- a/examples/atomic/test.ast +++ b/examples/atomic/test.ast @@ -289,6 +289,52 @@ "value": false } }, + { + "class_": "Pulse", + "duration": { + "class_": "Access", + "name": "t_gate" + }, + "target": { + "class_": "Extract", + "access": { + "class_": "Access", + "name": "r" + }, + "index": 0 + }, + "beam": { + "class_": "Access", + "name": "beam_mw" + }, + "measured": { + "class_": "Bool", + "value": false + } + }, + { + "class_": "Pulse", + "duration": { + "class_": "MathNum", + "value": 3e-6 + }, + "target": { + "class_": "Extract", + "access": { + "class_": "Access", + "name": "r" + }, + "index": 1 + }, + "beam": { + "class_": "Access", + "name": "beam_det" + }, + "measured": { + "class_": "Bool", + "value": true + } + }, { "class_": "ParallelProtocol", "pulses": [ diff --git a/examples/atomic/test.atomic b/examples/atomic/test.atomic index a2738054..fea6e52a 100644 --- a/examples/atomic/test.atomic +++ b/examples/atomic/test.atomic @@ -1,49 +1,52 @@ // atomic targets -ions = ionreg(2); -q0 = ions[0]; -q1 = ions[1]; -targets = [q0, q1]; +ions = ionreg(2) +q0 = ions[0] +q1 = ions[1] +targets = [q0, q1] // math / symbols -pi = 3.14159; -omega = #omega; -phi = #phi; -t_gate = 10e-6; -flag = true; -n = 3; +pi = 3.14159 +omega = #omega +phi = #phi +t_gate = 10e-6 +flag = true +n = 3 // beam(frequency, rabi, phase, polarization, wavevector) -beam_mw = beam(2.0 * pi * 1e6, omega, phi, [1.0, 0.0, 0.0], [0.0, 0.0, 1.0]); -beam_det = beam(2.0 * pi * 2e6, 0.25, 0.0, [0.0, 1.0, 0.0], [0.0, 0.0, 1.0]); +beam_mw = beam(2.0 * pi * 1e6, omega, phi, [1.0, 0.0, 0.0], [0.0, 0.0, 1.0]) +beam_det = beam(2.0 * pi * 2e6, 0.25, 0.0, [0.0, 1.0, 0.0], [0.0, 0.0, 1.0]) // pulse(beam, duration, target, measured) -pulse(beam_mw, t_gate, q0); // measured defaults to false -pulse(beam_det, 3e-6, q1, true); // explicit measured=true -pulse(beam_mw, 2e-6, targets, false); // explicit measured=false +pulse(beam_mw, t_gate, q0) // measured defaults to false +pulse(beam_det, 3e-6, q1, true) // explicit measured=true +pulse(beam_mw, 2e-6, targets, false) // explicit measured=false + +pulse(beam_mw, t_gate, r[0]) // measured defaults to false +pulse(beam_det, 3e-6, r[1], true) // parallel block parallel { - pulse(beam_mw, 5e-6, q0); - pulse(beam_det, 5e-6, q1); + pulse(beam_mw, 5e-6, q0) + pulse(beam_det, 5e-6, q1) } // control flow if (flag) { - pulse(beam_mw, 2e-6, targets); + pulse(beam_mw, 2e-6, targets) } else { - pulse(beam_det, 2e-5, targets, true); + pulse(beam_det, 2e-5, targets, true) } while (n > 0) { parallel { - pulse(beam_mw, 1e-6, targets); + pulse(beam_mw, 1e-6, targets) } - n = n - 1; + n = n - 1 if (n == 1) { - continue; + continue } if (n == 0) { - break; + break } } \ No newline at end of file diff --git a/examples/atomic/test.ipynb b/examples/atomic/test.ipynb index 99f08a3d..41f105cf 100644 --- a/examples/atomic/test.ipynb +++ b/examples/atomic/test.ipynb @@ -72,47 +72,41 @@ "name": "stdout", "output_type": "stream", "text": [ - "ions = ionreg(2);\n", - "q0 = ions[0];\n", - "q1 = ions[1];\n", - "targets = [q0, q1];\n", - "pi = 3.14159;\n", - "omega = #omega;\n", - "phi = #phi;\n", - "t_gate = 1e-05;\n", - "flag = true;\n", - "n = 3;\n", - "beam_mw = beam(2.0 * pi * 1000000.0, omega, phi, [1.0, 0.0, 0.0], [0.0, 0.0, 1.0]);\n", - "beam_det = beam(2.0 * pi * 2000000.0, 0.25, 0.0, [0.0, 1.0, 0.0], [0.0, 0.0, 1.0]);\n", - "pulse(beam_mw, t_gate, q0, false);\n", - "pulse(beam_det, 3e-06, q1, true);\n", - "pulse(beam_mw, 2e-06, targets, false);\n", + "ions = ionreg(2)\n", + "q0 = ions[0]\n", + "q1 = ions[1]\n", + "targets = [q0, q1]\n", + "pi = 3.14159\n", + "omega = #omega\n", + "phi = #phi\n", + "t_gate = 1e-05\n", + "flag = true\n", + "n = 3\n", + "beam_mw = beam(2.0 * pi * 1000000.0, omega, phi, [1.0, 0.0, 0.0], [0.0, 0.0, 1.0])\n", + "beam_det = beam(2.0 * pi * 2000000.0, 0.25, 0.0, [0.0, 1.0, 0.0], [0.0, 0.0, 1.0])\n", + "pulse(beam_mw, t_gate, q0, false)\n", + "pulse(beam_det, 3e-06, q1, true)\n", + "pulse(beam_mw, 2e-06, targets, false)\n", "parallel {\n", - "pulse(beam_mw, 5e-06, q0, false);\n", - "pulse(beam_det, 5e-06, q1, false);\n", - "\n", - "};\n", + "pulse(beam_mw, 5e-06, q0, false)\n", + "pulse(beam_det, 5e-06, q1, false)\n", + "}\n", "if (flag) {\n", - "pulse(beam_mw, 2e-06, targets, false);\n", - "\n", + "pulse(beam_mw, 2e-06, targets, false)\n", "} else {\n", - "pulse(beam_det, 2e-05, targets, true);\n", - "\n", - "};\n", + "pulse(beam_det, 2e-05, targets, true)\n", + "}\n", "while (n > 0) {\n", "parallel {\n", - "pulse(beam_mw, 1e-06, targets, false);\n", - "\n", - "};\n", - "n = n - 1;\n", + "pulse(beam_mw, 1e-06, targets, false)\n", + "}\n", + "n = n - 1\n", "if (n == 1) {\n", - "continue;\n", - "\n", - "};\n", + "continue\n", + "}\n", "if (n == 0) {\n", - "break;\n", - "\n", - "};\n", + "break\n", + "}\n", "}\n", "\n" ] diff --git a/pyproject.toml b/pyproject.toml index b7f52b46..8a318dca 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -42,6 +42,7 @@ dependencies = [ "antlr4-tools>=0.2.2", "antlr4-python3-runtime>=4.13.2", "typer>=0.24.1", + "pytest>=8.4.2", ] [project.optional-dependencies] @@ -64,10 +65,15 @@ exclude = [ "src/oqd_core/frontend/analog/AnalogParser.py", "src/oqd_core/frontend/analog/AnalogParserListener.py", "src/oqd_core/frontend/analog/AnalogParserVisitor.py", - "src/oqd_core/frontend/analog/AtomicLexer.py", - "src/oqd_core/frontend/analog/AtomicParser.py", - "src/oqd_core/frontend/analog/AtomicParserListener.py", - "src/oqd_core/frontend/analog/AtomicParserVisitor.py", + "src/oqd_core/frontend/atomic/AtomicLexer.py", + "src/oqd_core/frontend/atomic/AtomicParser.py", + "src/oqd_core/frontend/atomic/AtomicParserListener.py", + "src/oqd_core/frontend/atomic/AtomicParserVisitor.py", + "src/oqd_core/compiler/*", + "tests/test_analog/*", + "tests/test_atomic/*", + "tests/test_math/*", + "tests/test_serialization.py", ] [tool.ruff.lint] diff --git a/src/grammar/analog/AnalogLexer.g4 b/src/grammar/analog/AnalogLexer.g4 index e9a5c9f8..6b8313fa 100644 --- a/src/grammar/analog/AnalogLexer.g4 +++ b/src/grammar/analog/AnalogLexer.g4 @@ -3,7 +3,7 @@ lexer grammar AnalogLexer; /** ================================================================================= */ WHITESPACE: [ \t]+ -> channel(HIDDEN); -EOL: (';' [\r\n]* | [\r\n]+); +EOL: ([\r\n]+) | COMMENT; NEWLINE: [\r\n]+ -> channel(HIDDEN); COMMENT: '//' ~[\n\r]* NEWLINE -> skip; diff --git a/src/grammar/analog/README.md b/src/grammar/analog/README.md index 0ce79109..69590d1e 100644 --- a/src/grammar/analog/README.md +++ b/src/grammar/analog/README.md @@ -18,19 +18,3 @@ antlr4 -Dlanguage=Python3 -visitor -listener -o ../../oqd_core/frontend/analog A antlr4 -Dlanguage=Python3 -visitor -listener -o ../../oqd_core/frontend/analog AnalogParser.g4 ``` -## Run the example - -The example code is in `examples/analog/test.analog`. This file contains the expected syntax of the Parser. -Navigate to the project root directory: -```bash -cd ../../.. -``` - -Run the Typer app: -```bash -# Run example -python3 -m oqd_core.frontend.analog.output -i examples/analog/test.analog -o examples/analog/test.ast -``` - -This example generates the Analog Circuit AST in `examples/analog/test.ast`. - diff --git a/src/grammar/atomic/AtomicLexer.g4 b/src/grammar/atomic/AtomicLexer.g4 index 387792ac..727a42fb 100644 --- a/src/grammar/atomic/AtomicLexer.g4 +++ b/src/grammar/atomic/AtomicLexer.g4 @@ -3,7 +3,7 @@ lexer grammar AtomicLexer; /** ================================================================================= */ WHITESPACE: [ \t]+ -> channel(HIDDEN); -EOL: (';' [\r\n]* | [\r\n]+); +EOL: ([\r\n]+ | COMMENT); NEWLINE: [\r\n]+ -> channel(HIDDEN); COMMENT: '//' ~[\n\r]* NEWLINE -> skip; diff --git a/src/grammar/atomic/AtomicParser.g4 b/src/grammar/atomic/AtomicParser.g4 index 9108967b..a0f03945 100644 --- a/src/grammar/atomic/AtomicParser.g4 +++ b/src/grammar/atomic/AtomicParser.g4 @@ -88,7 +88,7 @@ comparators // Math -math_terminal: INT | FLOAT | MATH_VAR | IMAG | access | pexpr | fexpr | atomic_list; +math_terminal: INT | FLOAT | MATH_VAR | IMAG | access | pexpr | fexpr | atomic_list | atomic_list_extract; func_names: ABS | SIN | COS | TAN | EXP | LOG | SINH | COSH | TANH | ATAN | ACOS | ASIN | ATANH | ASINH | ACOSH | ATAN2 diff --git a/src/grammar/atomic/README.md b/src/grammar/atomic/README.md index af5f4f5f..df6ad6ed 100644 --- a/src/grammar/atomic/README.md +++ b/src/grammar/atomic/README.md @@ -17,20 +17,3 @@ cd src/grammar/atomic antlr4 -Dlanguage=Python3 -visitor -listener -o ../../oqd_core/frontend/atomic AtomicLexer.g4 antlr4 -Dlanguage=Python3 -visitor -listener -o ../../oqd_core/frontend/atomic AtomicParser.g4 ``` - -## Run the example - -The example code is in `examples/atomic/test.atomic`. This file contains the expected syntax of the Parser. -Navigate to the project root directory: -```bash -cd ../../.. -``` - -Run the Typer app: -```bash -# Run example -python3 -m oqd_core.frontend.atomic.output -i examples/atomic/test.atomic -o examples/atomic/test.ast -``` - -This example generates the Atomic Circuit AST in `examples/atomic/test.ast`. - diff --git a/src/oqd_core/frontend/analog/AnalogLexer.interp b/src/oqd_core/frontend/analog/AnalogLexer.interp index bc708d38..9232ab8a 100644 --- a/src/oqd_core/frontend/analog/AnalogLexer.interp +++ b/src/oqd_core/frontend/analog/AnalogLexer.interp @@ -263,4 +263,4 @@ mode names: DEFAULT_MODE atn: -[4, 0, 81, 576, 6, -1, 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, 1, 0, 4, 0, 177, 8, 0, 11, 0, 12, 0, 178, 1, 0, 1, 0, 1, 1, 1, 1, 5, 1, 185, 8, 1, 10, 1, 12, 1, 188, 9, 1, 1, 1, 4, 1, 191, 8, 1, 11, 1, 12, 1, 192, 3, 1, 195, 8, 1, 1, 2, 4, 2, 198, 8, 2, 11, 2, 12, 2, 199, 1, 2, 1, 2, 1, 3, 1, 3, 1, 3, 1, 3, 5, 3, 208, 8, 3, 10, 3, 12, 3, 211, 9, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 7, 1, 7, 1, 7, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 11, 1, 11, 1, 11, 1, 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, 13, 1, 13, 1, 13, 1, 14, 1, 14, 1, 14, 1, 14, 1, 15, 1, 15, 1, 15, 1, 16, 1, 16, 1, 16, 1, 17, 1, 17, 1, 17, 1, 18, 1, 18, 1, 18, 1, 18, 1, 19, 1, 19, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 24, 1, 24, 1, 25, 1, 25, 1, 26, 1, 26, 1, 27, 1, 27, 1, 28, 1, 28, 1, 29, 1, 29, 1, 30, 1, 30, 1, 31, 1, 31, 1, 32, 1, 32, 1, 33, 1, 33, 1, 34, 1, 34, 1, 35, 1, 35, 1, 36, 1, 36, 1, 37, 1, 37, 1, 38, 1, 38, 1, 39, 1, 39, 1, 39, 1, 40, 1, 40, 1, 40, 1, 41, 1, 41, 1, 42, 1, 42, 1, 42, 1, 43, 1, 43, 1, 44, 1, 44, 1, 44, 1, 45, 1, 45, 1, 45, 1, 46, 1, 46, 1, 46, 1, 47, 1, 47, 1, 47, 1, 48, 1, 48, 1, 48, 1, 49, 1, 49, 1, 50, 1, 50, 1, 51, 1, 51, 3, 51, 386, 8, 51, 1, 52, 4, 52, 389, 8, 52, 11, 52, 12, 52, 390, 1, 53, 1, 53, 1, 53, 3, 53, 396, 8, 53, 3, 53, 398, 8, 53, 1, 54, 3, 54, 401, 8, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 3, 54, 408, 8, 54, 1, 54, 3, 54, 411, 8, 54, 1, 54, 1, 54, 1, 54, 3, 54, 416, 8, 54, 1, 54, 1, 54, 1, 54, 3, 54, 421, 8, 54, 1, 54, 3, 54, 424, 8, 54, 1, 54, 1, 54, 1, 54, 1, 54, 3, 54, 430, 8, 54, 1, 54, 1, 54, 3, 54, 434, 8, 54, 1, 55, 1, 55, 1, 55, 1, 56, 1, 56, 1, 56, 1, 57, 1, 57, 1, 57, 1, 57, 1, 58, 1, 58, 1, 58, 1, 58, 1, 59, 1, 59, 1, 59, 1, 59, 1, 60, 1, 60, 1, 60, 1, 60, 1, 61, 1, 61, 1, 61, 1, 61, 1, 62, 1, 62, 1, 62, 1, 62, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 77, 1, 77, 1, 77, 1, 78, 1, 78, 1, 78, 1, 79, 1, 79, 1, 79, 1, 80, 1, 80, 1, 80, 1, 81, 1, 81, 1, 81, 1, 82, 1, 82, 1, 82, 1, 83, 1, 83, 1, 83, 1, 84, 1, 84, 1, 85, 1, 85, 1, 86, 1, 86, 5, 86, 572, 8, 86, 10, 86, 12, 86, 575, 9, 86, 0, 0, 87, 1, 1, 3, 2, 5, 3, 7, 4, 9, 5, 11, 6, 13, 7, 15, 8, 17, 9, 19, 10, 21, 11, 23, 12, 25, 13, 27, 14, 29, 15, 31, 16, 33, 17, 35, 18, 37, 19, 39, 20, 41, 21, 43, 22, 45, 23, 47, 24, 49, 25, 51, 26, 53, 27, 55, 28, 57, 29, 59, 30, 61, 31, 63, 32, 65, 33, 67, 34, 69, 35, 71, 36, 73, 37, 75, 38, 77, 39, 79, 40, 81, 41, 83, 42, 85, 43, 87, 44, 89, 45, 91, 46, 93, 47, 95, 48, 97, 49, 99, 0, 101, 0, 103, 0, 105, 0, 107, 50, 109, 51, 111, 52, 113, 53, 115, 54, 117, 55, 119, 56, 121, 57, 123, 58, 125, 59, 127, 60, 129, 61, 131, 62, 133, 63, 135, 64, 137, 65, 139, 66, 141, 67, 143, 68, 145, 69, 147, 70, 149, 71, 151, 72, 153, 73, 155, 74, 157, 75, 159, 76, 161, 77, 163, 78, 165, 79, 167, 80, 169, 0, 171, 0, 173, 81, 1, 0, 6, 2, 0, 9, 9, 32, 32, 2, 0, 10, 10, 13, 13, 1, 0, 49, 57, 2, 0, 69, 69, 101, 101, 3, 0, 65, 90, 95, 95, 97, 122, 4, 0, 48, 57, 65, 90, 95, 95, 97, 122, 592, 0, 1, 1, 0, 0, 0, 0, 3, 1, 0, 0, 0, 0, 5, 1, 0, 0, 0, 0, 7, 1, 0, 0, 0, 0, 9, 1, 0, 0, 0, 0, 11, 1, 0, 0, 0, 0, 13, 1, 0, 0, 0, 0, 15, 1, 0, 0, 0, 0, 17, 1, 0, 0, 0, 0, 19, 1, 0, 0, 0, 0, 21, 1, 0, 0, 0, 0, 23, 1, 0, 0, 0, 0, 25, 1, 0, 0, 0, 0, 27, 1, 0, 0, 0, 0, 29, 1, 0, 0, 0, 0, 31, 1, 0, 0, 0, 0, 33, 1, 0, 0, 0, 0, 35, 1, 0, 0, 0, 0, 37, 1, 0, 0, 0, 0, 39, 1, 0, 0, 0, 0, 41, 1, 0, 0, 0, 0, 43, 1, 0, 0, 0, 0, 45, 1, 0, 0, 0, 0, 47, 1, 0, 0, 0, 0, 49, 1, 0, 0, 0, 0, 51, 1, 0, 0, 0, 0, 53, 1, 0, 0, 0, 0, 55, 1, 0, 0, 0, 0, 57, 1, 0, 0, 0, 0, 59, 1, 0, 0, 0, 0, 61, 1, 0, 0, 0, 0, 63, 1, 0, 0, 0, 0, 65, 1, 0, 0, 0, 0, 67, 1, 0, 0, 0, 0, 69, 1, 0, 0, 0, 0, 71, 1, 0, 0, 0, 0, 73, 1, 0, 0, 0, 0, 75, 1, 0, 0, 0, 0, 77, 1, 0, 0, 0, 0, 79, 1, 0, 0, 0, 0, 81, 1, 0, 0, 0, 0, 83, 1, 0, 0, 0, 0, 85, 1, 0, 0, 0, 0, 87, 1, 0, 0, 0, 0, 89, 1, 0, 0, 0, 0, 91, 1, 0, 0, 0, 0, 93, 1, 0, 0, 0, 0, 95, 1, 0, 0, 0, 0, 97, 1, 0, 0, 0, 0, 107, 1, 0, 0, 0, 0, 109, 1, 0, 0, 0, 0, 111, 1, 0, 0, 0, 0, 113, 1, 0, 0, 0, 0, 115, 1, 0, 0, 0, 0, 117, 1, 0, 0, 0, 0, 119, 1, 0, 0, 0, 0, 121, 1, 0, 0, 0, 0, 123, 1, 0, 0, 0, 0, 125, 1, 0, 0, 0, 0, 127, 1, 0, 0, 0, 0, 129, 1, 0, 0, 0, 0, 131, 1, 0, 0, 0, 0, 133, 1, 0, 0, 0, 0, 135, 1, 0, 0, 0, 0, 137, 1, 0, 0, 0, 0, 139, 1, 0, 0, 0, 0, 141, 1, 0, 0, 0, 0, 143, 1, 0, 0, 0, 0, 145, 1, 0, 0, 0, 0, 147, 1, 0, 0, 0, 0, 149, 1, 0, 0, 0, 0, 151, 1, 0, 0, 0, 0, 153, 1, 0, 0, 0, 0, 155, 1, 0, 0, 0, 0, 157, 1, 0, 0, 0, 0, 159, 1, 0, 0, 0, 0, 161, 1, 0, 0, 0, 0, 163, 1, 0, 0, 0, 0, 165, 1, 0, 0, 0, 0, 167, 1, 0, 0, 0, 0, 173, 1, 0, 0, 0, 1, 176, 1, 0, 0, 0, 3, 194, 1, 0, 0, 0, 5, 197, 1, 0, 0, 0, 7, 203, 1, 0, 0, 0, 9, 216, 1, 0, 0, 0, 11, 223, 1, 0, 0, 0, 13, 231, 1, 0, 0, 0, 15, 242, 1, 0, 0, 0, 17, 245, 1, 0, 0, 0, 19, 250, 1, 0, 0, 0, 21, 256, 1, 0, 0, 0, 23, 261, 1, 0, 0, 0, 25, 265, 1, 0, 0, 0, 27, 271, 1, 0, 0, 0, 29, 280, 1, 0, 0, 0, 31, 284, 1, 0, 0, 0, 33, 287, 1, 0, 0, 0, 35, 290, 1, 0, 0, 0, 37, 293, 1, 0, 0, 0, 39, 297, 1, 0, 0, 0, 41, 299, 1, 0, 0, 0, 43, 304, 1, 0, 0, 0, 45, 310, 1, 0, 0, 0, 47, 315, 1, 0, 0, 0, 49, 321, 1, 0, 0, 0, 51, 323, 1, 0, 0, 0, 53, 325, 1, 0, 0, 0, 55, 327, 1, 0, 0, 0, 57, 329, 1, 0, 0, 0, 59, 331, 1, 0, 0, 0, 61, 333, 1, 0, 0, 0, 63, 335, 1, 0, 0, 0, 65, 337, 1, 0, 0, 0, 67, 339, 1, 0, 0, 0, 69, 341, 1, 0, 0, 0, 71, 343, 1, 0, 0, 0, 73, 345, 1, 0, 0, 0, 75, 347, 1, 0, 0, 0, 77, 349, 1, 0, 0, 0, 79, 351, 1, 0, 0, 0, 81, 354, 1, 0, 0, 0, 83, 357, 1, 0, 0, 0, 85, 359, 1, 0, 0, 0, 87, 362, 1, 0, 0, 0, 89, 364, 1, 0, 0, 0, 91, 367, 1, 0, 0, 0, 93, 370, 1, 0, 0, 0, 95, 373, 1, 0, 0, 0, 97, 376, 1, 0, 0, 0, 99, 379, 1, 0, 0, 0, 101, 381, 1, 0, 0, 0, 103, 385, 1, 0, 0, 0, 105, 388, 1, 0, 0, 0, 107, 397, 1, 0, 0, 0, 109, 433, 1, 0, 0, 0, 111, 435, 1, 0, 0, 0, 113, 438, 1, 0, 0, 0, 115, 441, 1, 0, 0, 0, 117, 445, 1, 0, 0, 0, 119, 449, 1, 0, 0, 0, 121, 453, 1, 0, 0, 0, 123, 457, 1, 0, 0, 0, 125, 461, 1, 0, 0, 0, 127, 465, 1, 0, 0, 0, 129, 470, 1, 0, 0, 0, 131, 475, 1, 0, 0, 0, 133, 480, 1, 0, 0, 0, 135, 485, 1, 0, 0, 0, 137, 490, 1, 0, 0, 0, 139, 495, 1, 0, 0, 0, 141, 501, 1, 0, 0, 0, 143, 507, 1, 0, 0, 0, 145, 513, 1, 0, 0, 0, 147, 523, 1, 0, 0, 0, 149, 528, 1, 0, 0, 0, 151, 533, 1, 0, 0, 0, 153, 538, 1, 0, 0, 0, 155, 544, 1, 0, 0, 0, 157, 547, 1, 0, 0, 0, 159, 550, 1, 0, 0, 0, 161, 553, 1, 0, 0, 0, 163, 556, 1, 0, 0, 0, 165, 559, 1, 0, 0, 0, 167, 562, 1, 0, 0, 0, 169, 565, 1, 0, 0, 0, 171, 567, 1, 0, 0, 0, 173, 569, 1, 0, 0, 0, 175, 177, 7, 0, 0, 0, 176, 175, 1, 0, 0, 0, 177, 178, 1, 0, 0, 0, 178, 176, 1, 0, 0, 0, 178, 179, 1, 0, 0, 0, 179, 180, 1, 0, 0, 0, 180, 181, 6, 0, 0, 0, 181, 2, 1, 0, 0, 0, 182, 186, 5, 59, 0, 0, 183, 185, 7, 1, 0, 0, 184, 183, 1, 0, 0, 0, 185, 188, 1, 0, 0, 0, 186, 184, 1, 0, 0, 0, 186, 187, 1, 0, 0, 0, 187, 195, 1, 0, 0, 0, 188, 186, 1, 0, 0, 0, 189, 191, 7, 1, 0, 0, 190, 189, 1, 0, 0, 0, 191, 192, 1, 0, 0, 0, 192, 190, 1, 0, 0, 0, 192, 193, 1, 0, 0, 0, 193, 195, 1, 0, 0, 0, 194, 182, 1, 0, 0, 0, 194, 190, 1, 0, 0, 0, 195, 4, 1, 0, 0, 0, 196, 198, 7, 1, 0, 0, 197, 196, 1, 0, 0, 0, 198, 199, 1, 0, 0, 0, 199, 197, 1, 0, 0, 0, 199, 200, 1, 0, 0, 0, 200, 201, 1, 0, 0, 0, 201, 202, 6, 2, 0, 0, 202, 6, 1, 0, 0, 0, 203, 204, 5, 47, 0, 0, 204, 205, 5, 47, 0, 0, 205, 209, 1, 0, 0, 0, 206, 208, 8, 1, 0, 0, 207, 206, 1, 0, 0, 0, 208, 211, 1, 0, 0, 0, 209, 207, 1, 0, 0, 0, 209, 210, 1, 0, 0, 0, 210, 212, 1, 0, 0, 0, 211, 209, 1, 0, 0, 0, 212, 213, 3, 5, 2, 0, 213, 214, 1, 0, 0, 0, 214, 215, 6, 3, 1, 0, 215, 8, 1, 0, 0, 0, 216, 217, 5, 101, 0, 0, 217, 218, 5, 118, 0, 0, 218, 219, 5, 111, 0, 0, 219, 220, 5, 108, 0, 0, 220, 221, 5, 118, 0, 0, 221, 222, 5, 101, 0, 0, 222, 10, 1, 0, 0, 0, 223, 224, 5, 109, 0, 0, 224, 225, 5, 101, 0, 0, 225, 226, 5, 97, 0, 0, 226, 227, 5, 115, 0, 0, 227, 228, 5, 117, 0, 0, 228, 229, 5, 114, 0, 0, 229, 230, 5, 101, 0, 0, 230, 12, 1, 0, 0, 0, 231, 232, 5, 105, 0, 0, 232, 233, 5, 110, 0, 0, 233, 234, 5, 105, 0, 0, 234, 235, 5, 116, 0, 0, 235, 236, 5, 105, 0, 0, 236, 237, 5, 97, 0, 0, 237, 238, 5, 108, 0, 0, 238, 239, 5, 105, 0, 0, 239, 240, 5, 122, 0, 0, 240, 241, 5, 101, 0, 0, 241, 14, 1, 0, 0, 0, 242, 243, 5, 105, 0, 0, 243, 244, 5, 102, 0, 0, 244, 16, 1, 0, 0, 0, 245, 246, 5, 101, 0, 0, 246, 247, 5, 108, 0, 0, 247, 248, 5, 115, 0, 0, 248, 249, 5, 101, 0, 0, 249, 18, 1, 0, 0, 0, 250, 251, 5, 119, 0, 0, 251, 252, 5, 104, 0, 0, 252, 253, 5, 105, 0, 0, 253, 254, 5, 108, 0, 0, 254, 255, 5, 101, 0, 0, 255, 20, 1, 0, 0, 0, 256, 257, 5, 119, 0, 0, 257, 258, 5, 105, 0, 0, 258, 259, 5, 116, 0, 0, 259, 260, 5, 104, 0, 0, 260, 22, 1, 0, 0, 0, 261, 262, 5, 102, 0, 0, 262, 263, 5, 111, 0, 0, 263, 264, 5, 114, 0, 0, 264, 24, 1, 0, 0, 0, 265, 266, 5, 98, 0, 0, 266, 267, 5, 114, 0, 0, 267, 268, 5, 101, 0, 0, 268, 269, 5, 97, 0, 0, 269, 270, 5, 107, 0, 0, 270, 26, 1, 0, 0, 0, 271, 272, 5, 99, 0, 0, 272, 273, 5, 111, 0, 0, 273, 274, 5, 110, 0, 0, 274, 275, 5, 116, 0, 0, 275, 276, 5, 105, 0, 0, 276, 277, 5, 110, 0, 0, 277, 278, 5, 117, 0, 0, 278, 279, 5, 101, 0, 0, 279, 28, 1, 0, 0, 0, 280, 281, 5, 97, 0, 0, 281, 282, 5, 110, 0, 0, 282, 283, 5, 100, 0, 0, 283, 30, 1, 0, 0, 0, 284, 285, 5, 38, 0, 0, 285, 286, 5, 38, 0, 0, 286, 32, 1, 0, 0, 0, 287, 288, 5, 111, 0, 0, 288, 289, 5, 114, 0, 0, 289, 34, 1, 0, 0, 0, 290, 291, 5, 124, 0, 0, 291, 292, 5, 124, 0, 0, 292, 36, 1, 0, 0, 0, 293, 294, 5, 110, 0, 0, 294, 295, 5, 111, 0, 0, 295, 296, 5, 116, 0, 0, 296, 38, 1, 0, 0, 0, 297, 298, 5, 33, 0, 0, 298, 40, 1, 0, 0, 0, 299, 300, 5, 116, 0, 0, 300, 301, 5, 114, 0, 0, 301, 302, 5, 117, 0, 0, 302, 303, 5, 101, 0, 0, 303, 42, 1, 0, 0, 0, 304, 305, 5, 102, 0, 0, 305, 306, 5, 97, 0, 0, 306, 307, 5, 108, 0, 0, 307, 308, 5, 115, 0, 0, 308, 309, 5, 101, 0, 0, 309, 44, 1, 0, 0, 0, 310, 311, 5, 113, 0, 0, 311, 312, 5, 114, 0, 0, 312, 313, 5, 101, 0, 0, 313, 314, 5, 103, 0, 0, 314, 46, 1, 0, 0, 0, 315, 316, 5, 113, 0, 0, 316, 317, 5, 109, 0, 0, 317, 318, 5, 111, 0, 0, 318, 319, 5, 100, 0, 0, 319, 320, 5, 101, 0, 0, 320, 48, 1, 0, 0, 0, 321, 322, 5, 58, 0, 0, 322, 50, 1, 0, 0, 0, 323, 324, 5, 59, 0, 0, 324, 52, 1, 0, 0, 0, 325, 326, 5, 44, 0, 0, 326, 54, 1, 0, 0, 0, 327, 328, 5, 40, 0, 0, 328, 56, 1, 0, 0, 0, 329, 330, 5, 41, 0, 0, 330, 58, 1, 0, 0, 0, 331, 332, 5, 91, 0, 0, 332, 60, 1, 0, 0, 0, 333, 334, 5, 93, 0, 0, 334, 62, 1, 0, 0, 0, 335, 336, 5, 123, 0, 0, 336, 64, 1, 0, 0, 0, 337, 338, 5, 125, 0, 0, 338, 66, 1, 0, 0, 0, 339, 340, 5, 42, 0, 0, 340, 68, 1, 0, 0, 0, 341, 342, 5, 47, 0, 0, 342, 70, 1, 0, 0, 0, 343, 344, 5, 43, 0, 0, 344, 72, 1, 0, 0, 0, 345, 346, 5, 45, 0, 0, 346, 74, 1, 0, 0, 0, 347, 348, 5, 94, 0, 0, 348, 76, 1, 0, 0, 0, 349, 350, 5, 61, 0, 0, 350, 78, 1, 0, 0, 0, 351, 352, 5, 61, 0, 0, 352, 353, 5, 61, 0, 0, 353, 80, 1, 0, 0, 0, 354, 355, 5, 33, 0, 0, 355, 356, 5, 61, 0, 0, 356, 82, 1, 0, 0, 0, 357, 358, 5, 60, 0, 0, 358, 84, 1, 0, 0, 0, 359, 360, 5, 60, 0, 0, 360, 361, 5, 61, 0, 0, 361, 86, 1, 0, 0, 0, 362, 363, 5, 62, 0, 0, 363, 88, 1, 0, 0, 0, 364, 365, 5, 62, 0, 0, 365, 366, 5, 61, 0, 0, 366, 90, 1, 0, 0, 0, 367, 368, 5, 37, 0, 0, 368, 369, 5, 64, 0, 0, 369, 92, 1, 0, 0, 0, 370, 371, 5, 37, 0, 0, 371, 372, 5, 43, 0, 0, 372, 94, 1, 0, 0, 0, 373, 374, 5, 37, 0, 0, 374, 375, 5, 42, 0, 0, 375, 96, 1, 0, 0, 0, 376, 377, 5, 37, 0, 0, 377, 378, 5, 45, 0, 0, 378, 98, 1, 0, 0, 0, 379, 380, 7, 2, 0, 0, 380, 100, 1, 0, 0, 0, 381, 382, 5, 48, 0, 0, 382, 102, 1, 0, 0, 0, 383, 386, 3, 101, 50, 0, 384, 386, 3, 99, 49, 0, 385, 383, 1, 0, 0, 0, 385, 384, 1, 0, 0, 0, 386, 104, 1, 0, 0, 0, 387, 389, 3, 103, 51, 0, 388, 387, 1, 0, 0, 0, 389, 390, 1, 0, 0, 0, 390, 388, 1, 0, 0, 0, 390, 391, 1, 0, 0, 0, 391, 106, 1, 0, 0, 0, 392, 398, 3, 101, 50, 0, 393, 395, 3, 99, 49, 0, 394, 396, 3, 105, 52, 0, 395, 394, 1, 0, 0, 0, 395, 396, 1, 0, 0, 0, 396, 398, 1, 0, 0, 0, 397, 392, 1, 0, 0, 0, 397, 393, 1, 0, 0, 0, 398, 108, 1, 0, 0, 0, 399, 401, 3, 107, 53, 0, 400, 399, 1, 0, 0, 0, 400, 401, 1, 0, 0, 0, 401, 402, 1, 0, 0, 0, 402, 403, 5, 46, 0, 0, 403, 410, 3, 105, 52, 0, 404, 407, 7, 3, 0, 0, 405, 408, 3, 71, 35, 0, 406, 408, 3, 73, 36, 0, 407, 405, 1, 0, 0, 0, 407, 406, 1, 0, 0, 0, 407, 408, 1, 0, 0, 0, 408, 409, 1, 0, 0, 0, 409, 411, 3, 107, 53, 0, 410, 404, 1, 0, 0, 0, 410, 411, 1, 0, 0, 0, 411, 434, 1, 0, 0, 0, 412, 413, 3, 107, 53, 0, 413, 415, 5, 46, 0, 0, 414, 416, 3, 105, 52, 0, 415, 414, 1, 0, 0, 0, 415, 416, 1, 0, 0, 0, 416, 423, 1, 0, 0, 0, 417, 420, 7, 3, 0, 0, 418, 421, 3, 71, 35, 0, 419, 421, 3, 73, 36, 0, 420, 418, 1, 0, 0, 0, 420, 419, 1, 0, 0, 0, 420, 421, 1, 0, 0, 0, 421, 422, 1, 0, 0, 0, 422, 424, 3, 107, 53, 0, 423, 417, 1, 0, 0, 0, 423, 424, 1, 0, 0, 0, 424, 434, 1, 0, 0, 0, 425, 426, 3, 107, 53, 0, 426, 429, 7, 3, 0, 0, 427, 430, 3, 71, 35, 0, 428, 430, 3, 73, 36, 0, 429, 427, 1, 0, 0, 0, 429, 428, 1, 0, 0, 0, 429, 430, 1, 0, 0, 0, 430, 431, 1, 0, 0, 0, 431, 432, 3, 107, 53, 0, 432, 434, 1, 0, 0, 0, 433, 400, 1, 0, 0, 0, 433, 412, 1, 0, 0, 0, 433, 425, 1, 0, 0, 0, 434, 110, 1, 0, 0, 0, 435, 436, 5, 35, 0, 0, 436, 437, 3, 173, 86, 0, 437, 112, 1, 0, 0, 0, 438, 439, 5, 49, 0, 0, 439, 440, 5, 106, 0, 0, 440, 114, 1, 0, 0, 0, 441, 442, 5, 97, 0, 0, 442, 443, 5, 98, 0, 0, 443, 444, 5, 115, 0, 0, 444, 116, 1, 0, 0, 0, 445, 446, 5, 115, 0, 0, 446, 447, 5, 105, 0, 0, 447, 448, 5, 110, 0, 0, 448, 118, 1, 0, 0, 0, 449, 450, 5, 99, 0, 0, 450, 451, 5, 111, 0, 0, 451, 452, 5, 115, 0, 0, 452, 120, 1, 0, 0, 0, 453, 454, 5, 116, 0, 0, 454, 455, 5, 97, 0, 0, 455, 456, 5, 110, 0, 0, 456, 122, 1, 0, 0, 0, 457, 458, 5, 101, 0, 0, 458, 459, 5, 120, 0, 0, 459, 460, 5, 112, 0, 0, 460, 124, 1, 0, 0, 0, 461, 462, 5, 108, 0, 0, 462, 463, 5, 111, 0, 0, 463, 464, 5, 103, 0, 0, 464, 126, 1, 0, 0, 0, 465, 466, 5, 115, 0, 0, 466, 467, 5, 105, 0, 0, 467, 468, 5, 110, 0, 0, 468, 469, 5, 104, 0, 0, 469, 128, 1, 0, 0, 0, 470, 471, 5, 99, 0, 0, 471, 472, 5, 111, 0, 0, 472, 473, 5, 115, 0, 0, 473, 474, 5, 104, 0, 0, 474, 130, 1, 0, 0, 0, 475, 476, 5, 116, 0, 0, 476, 477, 5, 97, 0, 0, 477, 478, 5, 110, 0, 0, 478, 479, 5, 104, 0, 0, 479, 132, 1, 0, 0, 0, 480, 481, 5, 97, 0, 0, 481, 482, 5, 116, 0, 0, 482, 483, 5, 97, 0, 0, 483, 484, 5, 110, 0, 0, 484, 134, 1, 0, 0, 0, 485, 486, 5, 97, 0, 0, 486, 487, 5, 99, 0, 0, 487, 488, 5, 111, 0, 0, 488, 489, 5, 115, 0, 0, 489, 136, 1, 0, 0, 0, 490, 491, 5, 97, 0, 0, 491, 492, 5, 115, 0, 0, 492, 493, 5, 105, 0, 0, 493, 494, 5, 110, 0, 0, 494, 138, 1, 0, 0, 0, 495, 496, 5, 97, 0, 0, 496, 497, 5, 116, 0, 0, 497, 498, 5, 97, 0, 0, 498, 499, 5, 110, 0, 0, 499, 500, 5, 104, 0, 0, 500, 140, 1, 0, 0, 0, 501, 502, 5, 97, 0, 0, 502, 503, 5, 115, 0, 0, 503, 504, 5, 105, 0, 0, 504, 505, 5, 110, 0, 0, 505, 506, 5, 104, 0, 0, 506, 142, 1, 0, 0, 0, 507, 508, 5, 97, 0, 0, 508, 509, 5, 99, 0, 0, 509, 510, 5, 111, 0, 0, 510, 511, 5, 115, 0, 0, 511, 512, 5, 104, 0, 0, 512, 144, 1, 0, 0, 0, 513, 514, 5, 104, 0, 0, 514, 515, 5, 101, 0, 0, 515, 516, 5, 97, 0, 0, 516, 517, 5, 118, 0, 0, 517, 518, 5, 105, 0, 0, 518, 519, 5, 115, 0, 0, 519, 520, 5, 105, 0, 0, 520, 521, 5, 100, 0, 0, 521, 522, 5, 101, 0, 0, 522, 146, 1, 0, 0, 0, 523, 524, 5, 99, 0, 0, 524, 525, 5, 111, 0, 0, 525, 526, 5, 110, 0, 0, 526, 527, 5, 106, 0, 0, 527, 148, 1, 0, 0, 0, 528, 529, 5, 114, 0, 0, 529, 530, 5, 101, 0, 0, 530, 531, 5, 97, 0, 0, 531, 532, 5, 108, 0, 0, 532, 150, 1, 0, 0, 0, 533, 534, 5, 105, 0, 0, 534, 535, 5, 109, 0, 0, 535, 536, 5, 97, 0, 0, 536, 537, 5, 103, 0, 0, 537, 152, 1, 0, 0, 0, 538, 539, 5, 97, 0, 0, 539, 540, 5, 116, 0, 0, 540, 541, 5, 97, 0, 0, 541, 542, 5, 110, 0, 0, 542, 543, 5, 50, 0, 0, 543, 154, 1, 0, 0, 0, 544, 545, 5, 37, 0, 0, 545, 546, 5, 73, 0, 0, 546, 156, 1, 0, 0, 0, 547, 548, 5, 37, 0, 0, 548, 549, 5, 88, 0, 0, 549, 158, 1, 0, 0, 0, 550, 551, 5, 37, 0, 0, 551, 552, 5, 89, 0, 0, 552, 160, 1, 0, 0, 0, 553, 554, 5, 37, 0, 0, 554, 555, 5, 90, 0, 0, 555, 162, 1, 0, 0, 0, 556, 557, 5, 37, 0, 0, 557, 558, 5, 67, 0, 0, 558, 164, 1, 0, 0, 0, 559, 560, 5, 37, 0, 0, 560, 561, 5, 65, 0, 0, 561, 166, 1, 0, 0, 0, 562, 563, 5, 37, 0, 0, 563, 564, 5, 74, 0, 0, 564, 168, 1, 0, 0, 0, 565, 566, 7, 4, 0, 0, 566, 170, 1, 0, 0, 0, 567, 568, 7, 5, 0, 0, 568, 172, 1, 0, 0, 0, 569, 573, 3, 169, 84, 0, 570, 572, 3, 171, 85, 0, 571, 570, 1, 0, 0, 0, 572, 575, 1, 0, 0, 0, 573, 571, 1, 0, 0, 0, 573, 574, 1, 0, 0, 0, 574, 174, 1, 0, 0, 0, 575, 573, 1, 0, 0, 0, 20, 0, 178, 186, 192, 194, 199, 209, 385, 390, 395, 397, 400, 407, 410, 415, 420, 423, 429, 433, 573, 2, 0, 1, 0, 6, 0, 0] \ No newline at end of file +[4, 0, 81, 570, 6, -1, 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, 1, 0, 4, 0, 177, 8, 0, 11, 0, 12, 0, 178, 1, 0, 1, 0, 1, 1, 4, 1, 184, 8, 1, 11, 1, 12, 1, 185, 1, 1, 3, 1, 189, 8, 1, 1, 2, 4, 2, 192, 8, 2, 11, 2, 12, 2, 193, 1, 2, 1, 2, 1, 3, 1, 3, 1, 3, 1, 3, 5, 3, 202, 8, 3, 10, 3, 12, 3, 205, 9, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 7, 1, 7, 1, 7, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 11, 1, 11, 1, 11, 1, 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, 13, 1, 13, 1, 13, 1, 14, 1, 14, 1, 14, 1, 14, 1, 15, 1, 15, 1, 15, 1, 16, 1, 16, 1, 16, 1, 17, 1, 17, 1, 17, 1, 18, 1, 18, 1, 18, 1, 18, 1, 19, 1, 19, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 24, 1, 24, 1, 25, 1, 25, 1, 26, 1, 26, 1, 27, 1, 27, 1, 28, 1, 28, 1, 29, 1, 29, 1, 30, 1, 30, 1, 31, 1, 31, 1, 32, 1, 32, 1, 33, 1, 33, 1, 34, 1, 34, 1, 35, 1, 35, 1, 36, 1, 36, 1, 37, 1, 37, 1, 38, 1, 38, 1, 39, 1, 39, 1, 39, 1, 40, 1, 40, 1, 40, 1, 41, 1, 41, 1, 42, 1, 42, 1, 42, 1, 43, 1, 43, 1, 44, 1, 44, 1, 44, 1, 45, 1, 45, 1, 45, 1, 46, 1, 46, 1, 46, 1, 47, 1, 47, 1, 47, 1, 48, 1, 48, 1, 48, 1, 49, 1, 49, 1, 50, 1, 50, 1, 51, 1, 51, 3, 51, 380, 8, 51, 1, 52, 4, 52, 383, 8, 52, 11, 52, 12, 52, 384, 1, 53, 1, 53, 1, 53, 3, 53, 390, 8, 53, 3, 53, 392, 8, 53, 1, 54, 3, 54, 395, 8, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 3, 54, 402, 8, 54, 1, 54, 3, 54, 405, 8, 54, 1, 54, 1, 54, 1, 54, 3, 54, 410, 8, 54, 1, 54, 1, 54, 1, 54, 3, 54, 415, 8, 54, 1, 54, 3, 54, 418, 8, 54, 1, 54, 1, 54, 1, 54, 1, 54, 3, 54, 424, 8, 54, 1, 54, 1, 54, 3, 54, 428, 8, 54, 1, 55, 1, 55, 1, 55, 1, 56, 1, 56, 1, 56, 1, 57, 1, 57, 1, 57, 1, 57, 1, 58, 1, 58, 1, 58, 1, 58, 1, 59, 1, 59, 1, 59, 1, 59, 1, 60, 1, 60, 1, 60, 1, 60, 1, 61, 1, 61, 1, 61, 1, 61, 1, 62, 1, 62, 1, 62, 1, 62, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 77, 1, 77, 1, 77, 1, 78, 1, 78, 1, 78, 1, 79, 1, 79, 1, 79, 1, 80, 1, 80, 1, 80, 1, 81, 1, 81, 1, 81, 1, 82, 1, 82, 1, 82, 1, 83, 1, 83, 1, 83, 1, 84, 1, 84, 1, 85, 1, 85, 1, 86, 1, 86, 5, 86, 566, 8, 86, 10, 86, 12, 86, 569, 9, 86, 0, 0, 87, 1, 1, 3, 2, 5, 3, 7, 4, 9, 5, 11, 6, 13, 7, 15, 8, 17, 9, 19, 10, 21, 11, 23, 12, 25, 13, 27, 14, 29, 15, 31, 16, 33, 17, 35, 18, 37, 19, 39, 20, 41, 21, 43, 22, 45, 23, 47, 24, 49, 25, 51, 26, 53, 27, 55, 28, 57, 29, 59, 30, 61, 31, 63, 32, 65, 33, 67, 34, 69, 35, 71, 36, 73, 37, 75, 38, 77, 39, 79, 40, 81, 41, 83, 42, 85, 43, 87, 44, 89, 45, 91, 46, 93, 47, 95, 48, 97, 49, 99, 0, 101, 0, 103, 0, 105, 0, 107, 50, 109, 51, 111, 52, 113, 53, 115, 54, 117, 55, 119, 56, 121, 57, 123, 58, 125, 59, 127, 60, 129, 61, 131, 62, 133, 63, 135, 64, 137, 65, 139, 66, 141, 67, 143, 68, 145, 69, 147, 70, 149, 71, 151, 72, 153, 73, 155, 74, 157, 75, 159, 76, 161, 77, 163, 78, 165, 79, 167, 80, 169, 0, 171, 0, 173, 81, 1, 0, 6, 2, 0, 9, 9, 32, 32, 2, 0, 10, 10, 13, 13, 1, 0, 49, 57, 2, 0, 69, 69, 101, 101, 3, 0, 65, 90, 95, 95, 97, 122, 4, 0, 48, 57, 65, 90, 95, 95, 97, 122, 585, 0, 1, 1, 0, 0, 0, 0, 3, 1, 0, 0, 0, 0, 5, 1, 0, 0, 0, 0, 7, 1, 0, 0, 0, 0, 9, 1, 0, 0, 0, 0, 11, 1, 0, 0, 0, 0, 13, 1, 0, 0, 0, 0, 15, 1, 0, 0, 0, 0, 17, 1, 0, 0, 0, 0, 19, 1, 0, 0, 0, 0, 21, 1, 0, 0, 0, 0, 23, 1, 0, 0, 0, 0, 25, 1, 0, 0, 0, 0, 27, 1, 0, 0, 0, 0, 29, 1, 0, 0, 0, 0, 31, 1, 0, 0, 0, 0, 33, 1, 0, 0, 0, 0, 35, 1, 0, 0, 0, 0, 37, 1, 0, 0, 0, 0, 39, 1, 0, 0, 0, 0, 41, 1, 0, 0, 0, 0, 43, 1, 0, 0, 0, 0, 45, 1, 0, 0, 0, 0, 47, 1, 0, 0, 0, 0, 49, 1, 0, 0, 0, 0, 51, 1, 0, 0, 0, 0, 53, 1, 0, 0, 0, 0, 55, 1, 0, 0, 0, 0, 57, 1, 0, 0, 0, 0, 59, 1, 0, 0, 0, 0, 61, 1, 0, 0, 0, 0, 63, 1, 0, 0, 0, 0, 65, 1, 0, 0, 0, 0, 67, 1, 0, 0, 0, 0, 69, 1, 0, 0, 0, 0, 71, 1, 0, 0, 0, 0, 73, 1, 0, 0, 0, 0, 75, 1, 0, 0, 0, 0, 77, 1, 0, 0, 0, 0, 79, 1, 0, 0, 0, 0, 81, 1, 0, 0, 0, 0, 83, 1, 0, 0, 0, 0, 85, 1, 0, 0, 0, 0, 87, 1, 0, 0, 0, 0, 89, 1, 0, 0, 0, 0, 91, 1, 0, 0, 0, 0, 93, 1, 0, 0, 0, 0, 95, 1, 0, 0, 0, 0, 97, 1, 0, 0, 0, 0, 107, 1, 0, 0, 0, 0, 109, 1, 0, 0, 0, 0, 111, 1, 0, 0, 0, 0, 113, 1, 0, 0, 0, 0, 115, 1, 0, 0, 0, 0, 117, 1, 0, 0, 0, 0, 119, 1, 0, 0, 0, 0, 121, 1, 0, 0, 0, 0, 123, 1, 0, 0, 0, 0, 125, 1, 0, 0, 0, 0, 127, 1, 0, 0, 0, 0, 129, 1, 0, 0, 0, 0, 131, 1, 0, 0, 0, 0, 133, 1, 0, 0, 0, 0, 135, 1, 0, 0, 0, 0, 137, 1, 0, 0, 0, 0, 139, 1, 0, 0, 0, 0, 141, 1, 0, 0, 0, 0, 143, 1, 0, 0, 0, 0, 145, 1, 0, 0, 0, 0, 147, 1, 0, 0, 0, 0, 149, 1, 0, 0, 0, 0, 151, 1, 0, 0, 0, 0, 153, 1, 0, 0, 0, 0, 155, 1, 0, 0, 0, 0, 157, 1, 0, 0, 0, 0, 159, 1, 0, 0, 0, 0, 161, 1, 0, 0, 0, 0, 163, 1, 0, 0, 0, 0, 165, 1, 0, 0, 0, 0, 167, 1, 0, 0, 0, 0, 173, 1, 0, 0, 0, 1, 176, 1, 0, 0, 0, 3, 188, 1, 0, 0, 0, 5, 191, 1, 0, 0, 0, 7, 197, 1, 0, 0, 0, 9, 210, 1, 0, 0, 0, 11, 217, 1, 0, 0, 0, 13, 225, 1, 0, 0, 0, 15, 236, 1, 0, 0, 0, 17, 239, 1, 0, 0, 0, 19, 244, 1, 0, 0, 0, 21, 250, 1, 0, 0, 0, 23, 255, 1, 0, 0, 0, 25, 259, 1, 0, 0, 0, 27, 265, 1, 0, 0, 0, 29, 274, 1, 0, 0, 0, 31, 278, 1, 0, 0, 0, 33, 281, 1, 0, 0, 0, 35, 284, 1, 0, 0, 0, 37, 287, 1, 0, 0, 0, 39, 291, 1, 0, 0, 0, 41, 293, 1, 0, 0, 0, 43, 298, 1, 0, 0, 0, 45, 304, 1, 0, 0, 0, 47, 309, 1, 0, 0, 0, 49, 315, 1, 0, 0, 0, 51, 317, 1, 0, 0, 0, 53, 319, 1, 0, 0, 0, 55, 321, 1, 0, 0, 0, 57, 323, 1, 0, 0, 0, 59, 325, 1, 0, 0, 0, 61, 327, 1, 0, 0, 0, 63, 329, 1, 0, 0, 0, 65, 331, 1, 0, 0, 0, 67, 333, 1, 0, 0, 0, 69, 335, 1, 0, 0, 0, 71, 337, 1, 0, 0, 0, 73, 339, 1, 0, 0, 0, 75, 341, 1, 0, 0, 0, 77, 343, 1, 0, 0, 0, 79, 345, 1, 0, 0, 0, 81, 348, 1, 0, 0, 0, 83, 351, 1, 0, 0, 0, 85, 353, 1, 0, 0, 0, 87, 356, 1, 0, 0, 0, 89, 358, 1, 0, 0, 0, 91, 361, 1, 0, 0, 0, 93, 364, 1, 0, 0, 0, 95, 367, 1, 0, 0, 0, 97, 370, 1, 0, 0, 0, 99, 373, 1, 0, 0, 0, 101, 375, 1, 0, 0, 0, 103, 379, 1, 0, 0, 0, 105, 382, 1, 0, 0, 0, 107, 391, 1, 0, 0, 0, 109, 427, 1, 0, 0, 0, 111, 429, 1, 0, 0, 0, 113, 432, 1, 0, 0, 0, 115, 435, 1, 0, 0, 0, 117, 439, 1, 0, 0, 0, 119, 443, 1, 0, 0, 0, 121, 447, 1, 0, 0, 0, 123, 451, 1, 0, 0, 0, 125, 455, 1, 0, 0, 0, 127, 459, 1, 0, 0, 0, 129, 464, 1, 0, 0, 0, 131, 469, 1, 0, 0, 0, 133, 474, 1, 0, 0, 0, 135, 479, 1, 0, 0, 0, 137, 484, 1, 0, 0, 0, 139, 489, 1, 0, 0, 0, 141, 495, 1, 0, 0, 0, 143, 501, 1, 0, 0, 0, 145, 507, 1, 0, 0, 0, 147, 517, 1, 0, 0, 0, 149, 522, 1, 0, 0, 0, 151, 527, 1, 0, 0, 0, 153, 532, 1, 0, 0, 0, 155, 538, 1, 0, 0, 0, 157, 541, 1, 0, 0, 0, 159, 544, 1, 0, 0, 0, 161, 547, 1, 0, 0, 0, 163, 550, 1, 0, 0, 0, 165, 553, 1, 0, 0, 0, 167, 556, 1, 0, 0, 0, 169, 559, 1, 0, 0, 0, 171, 561, 1, 0, 0, 0, 173, 563, 1, 0, 0, 0, 175, 177, 7, 0, 0, 0, 176, 175, 1, 0, 0, 0, 177, 178, 1, 0, 0, 0, 178, 176, 1, 0, 0, 0, 178, 179, 1, 0, 0, 0, 179, 180, 1, 0, 0, 0, 180, 181, 6, 0, 0, 0, 181, 2, 1, 0, 0, 0, 182, 184, 7, 1, 0, 0, 183, 182, 1, 0, 0, 0, 184, 185, 1, 0, 0, 0, 185, 183, 1, 0, 0, 0, 185, 186, 1, 0, 0, 0, 186, 189, 1, 0, 0, 0, 187, 189, 3, 7, 3, 0, 188, 183, 1, 0, 0, 0, 188, 187, 1, 0, 0, 0, 189, 4, 1, 0, 0, 0, 190, 192, 7, 1, 0, 0, 191, 190, 1, 0, 0, 0, 192, 193, 1, 0, 0, 0, 193, 191, 1, 0, 0, 0, 193, 194, 1, 0, 0, 0, 194, 195, 1, 0, 0, 0, 195, 196, 6, 2, 0, 0, 196, 6, 1, 0, 0, 0, 197, 198, 5, 47, 0, 0, 198, 199, 5, 47, 0, 0, 199, 203, 1, 0, 0, 0, 200, 202, 8, 1, 0, 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, 3, 5, 2, 0, 207, 208, 1, 0, 0, 0, 208, 209, 6, 3, 1, 0, 209, 8, 1, 0, 0, 0, 210, 211, 5, 101, 0, 0, 211, 212, 5, 118, 0, 0, 212, 213, 5, 111, 0, 0, 213, 214, 5, 108, 0, 0, 214, 215, 5, 118, 0, 0, 215, 216, 5, 101, 0, 0, 216, 10, 1, 0, 0, 0, 217, 218, 5, 109, 0, 0, 218, 219, 5, 101, 0, 0, 219, 220, 5, 97, 0, 0, 220, 221, 5, 115, 0, 0, 221, 222, 5, 117, 0, 0, 222, 223, 5, 114, 0, 0, 223, 224, 5, 101, 0, 0, 224, 12, 1, 0, 0, 0, 225, 226, 5, 105, 0, 0, 226, 227, 5, 110, 0, 0, 227, 228, 5, 105, 0, 0, 228, 229, 5, 116, 0, 0, 229, 230, 5, 105, 0, 0, 230, 231, 5, 97, 0, 0, 231, 232, 5, 108, 0, 0, 232, 233, 5, 105, 0, 0, 233, 234, 5, 122, 0, 0, 234, 235, 5, 101, 0, 0, 235, 14, 1, 0, 0, 0, 236, 237, 5, 105, 0, 0, 237, 238, 5, 102, 0, 0, 238, 16, 1, 0, 0, 0, 239, 240, 5, 101, 0, 0, 240, 241, 5, 108, 0, 0, 241, 242, 5, 115, 0, 0, 242, 243, 5, 101, 0, 0, 243, 18, 1, 0, 0, 0, 244, 245, 5, 119, 0, 0, 245, 246, 5, 104, 0, 0, 246, 247, 5, 105, 0, 0, 247, 248, 5, 108, 0, 0, 248, 249, 5, 101, 0, 0, 249, 20, 1, 0, 0, 0, 250, 251, 5, 119, 0, 0, 251, 252, 5, 105, 0, 0, 252, 253, 5, 116, 0, 0, 253, 254, 5, 104, 0, 0, 254, 22, 1, 0, 0, 0, 255, 256, 5, 102, 0, 0, 256, 257, 5, 111, 0, 0, 257, 258, 5, 114, 0, 0, 258, 24, 1, 0, 0, 0, 259, 260, 5, 98, 0, 0, 260, 261, 5, 114, 0, 0, 261, 262, 5, 101, 0, 0, 262, 263, 5, 97, 0, 0, 263, 264, 5, 107, 0, 0, 264, 26, 1, 0, 0, 0, 265, 266, 5, 99, 0, 0, 266, 267, 5, 111, 0, 0, 267, 268, 5, 110, 0, 0, 268, 269, 5, 116, 0, 0, 269, 270, 5, 105, 0, 0, 270, 271, 5, 110, 0, 0, 271, 272, 5, 117, 0, 0, 272, 273, 5, 101, 0, 0, 273, 28, 1, 0, 0, 0, 274, 275, 5, 97, 0, 0, 275, 276, 5, 110, 0, 0, 276, 277, 5, 100, 0, 0, 277, 30, 1, 0, 0, 0, 278, 279, 5, 38, 0, 0, 279, 280, 5, 38, 0, 0, 280, 32, 1, 0, 0, 0, 281, 282, 5, 111, 0, 0, 282, 283, 5, 114, 0, 0, 283, 34, 1, 0, 0, 0, 284, 285, 5, 124, 0, 0, 285, 286, 5, 124, 0, 0, 286, 36, 1, 0, 0, 0, 287, 288, 5, 110, 0, 0, 288, 289, 5, 111, 0, 0, 289, 290, 5, 116, 0, 0, 290, 38, 1, 0, 0, 0, 291, 292, 5, 33, 0, 0, 292, 40, 1, 0, 0, 0, 293, 294, 5, 116, 0, 0, 294, 295, 5, 114, 0, 0, 295, 296, 5, 117, 0, 0, 296, 297, 5, 101, 0, 0, 297, 42, 1, 0, 0, 0, 298, 299, 5, 102, 0, 0, 299, 300, 5, 97, 0, 0, 300, 301, 5, 108, 0, 0, 301, 302, 5, 115, 0, 0, 302, 303, 5, 101, 0, 0, 303, 44, 1, 0, 0, 0, 304, 305, 5, 113, 0, 0, 305, 306, 5, 114, 0, 0, 306, 307, 5, 101, 0, 0, 307, 308, 5, 103, 0, 0, 308, 46, 1, 0, 0, 0, 309, 310, 5, 113, 0, 0, 310, 311, 5, 109, 0, 0, 311, 312, 5, 111, 0, 0, 312, 313, 5, 100, 0, 0, 313, 314, 5, 101, 0, 0, 314, 48, 1, 0, 0, 0, 315, 316, 5, 58, 0, 0, 316, 50, 1, 0, 0, 0, 317, 318, 5, 59, 0, 0, 318, 52, 1, 0, 0, 0, 319, 320, 5, 44, 0, 0, 320, 54, 1, 0, 0, 0, 321, 322, 5, 40, 0, 0, 322, 56, 1, 0, 0, 0, 323, 324, 5, 41, 0, 0, 324, 58, 1, 0, 0, 0, 325, 326, 5, 91, 0, 0, 326, 60, 1, 0, 0, 0, 327, 328, 5, 93, 0, 0, 328, 62, 1, 0, 0, 0, 329, 330, 5, 123, 0, 0, 330, 64, 1, 0, 0, 0, 331, 332, 5, 125, 0, 0, 332, 66, 1, 0, 0, 0, 333, 334, 5, 42, 0, 0, 334, 68, 1, 0, 0, 0, 335, 336, 5, 47, 0, 0, 336, 70, 1, 0, 0, 0, 337, 338, 5, 43, 0, 0, 338, 72, 1, 0, 0, 0, 339, 340, 5, 45, 0, 0, 340, 74, 1, 0, 0, 0, 341, 342, 5, 94, 0, 0, 342, 76, 1, 0, 0, 0, 343, 344, 5, 61, 0, 0, 344, 78, 1, 0, 0, 0, 345, 346, 5, 61, 0, 0, 346, 347, 5, 61, 0, 0, 347, 80, 1, 0, 0, 0, 348, 349, 5, 33, 0, 0, 349, 350, 5, 61, 0, 0, 350, 82, 1, 0, 0, 0, 351, 352, 5, 60, 0, 0, 352, 84, 1, 0, 0, 0, 353, 354, 5, 60, 0, 0, 354, 355, 5, 61, 0, 0, 355, 86, 1, 0, 0, 0, 356, 357, 5, 62, 0, 0, 357, 88, 1, 0, 0, 0, 358, 359, 5, 62, 0, 0, 359, 360, 5, 61, 0, 0, 360, 90, 1, 0, 0, 0, 361, 362, 5, 37, 0, 0, 362, 363, 5, 64, 0, 0, 363, 92, 1, 0, 0, 0, 364, 365, 5, 37, 0, 0, 365, 366, 5, 43, 0, 0, 366, 94, 1, 0, 0, 0, 367, 368, 5, 37, 0, 0, 368, 369, 5, 42, 0, 0, 369, 96, 1, 0, 0, 0, 370, 371, 5, 37, 0, 0, 371, 372, 5, 45, 0, 0, 372, 98, 1, 0, 0, 0, 373, 374, 7, 2, 0, 0, 374, 100, 1, 0, 0, 0, 375, 376, 5, 48, 0, 0, 376, 102, 1, 0, 0, 0, 377, 380, 3, 101, 50, 0, 378, 380, 3, 99, 49, 0, 379, 377, 1, 0, 0, 0, 379, 378, 1, 0, 0, 0, 380, 104, 1, 0, 0, 0, 381, 383, 3, 103, 51, 0, 382, 381, 1, 0, 0, 0, 383, 384, 1, 0, 0, 0, 384, 382, 1, 0, 0, 0, 384, 385, 1, 0, 0, 0, 385, 106, 1, 0, 0, 0, 386, 392, 3, 101, 50, 0, 387, 389, 3, 99, 49, 0, 388, 390, 3, 105, 52, 0, 389, 388, 1, 0, 0, 0, 389, 390, 1, 0, 0, 0, 390, 392, 1, 0, 0, 0, 391, 386, 1, 0, 0, 0, 391, 387, 1, 0, 0, 0, 392, 108, 1, 0, 0, 0, 393, 395, 3, 107, 53, 0, 394, 393, 1, 0, 0, 0, 394, 395, 1, 0, 0, 0, 395, 396, 1, 0, 0, 0, 396, 397, 5, 46, 0, 0, 397, 404, 3, 105, 52, 0, 398, 401, 7, 3, 0, 0, 399, 402, 3, 71, 35, 0, 400, 402, 3, 73, 36, 0, 401, 399, 1, 0, 0, 0, 401, 400, 1, 0, 0, 0, 401, 402, 1, 0, 0, 0, 402, 403, 1, 0, 0, 0, 403, 405, 3, 107, 53, 0, 404, 398, 1, 0, 0, 0, 404, 405, 1, 0, 0, 0, 405, 428, 1, 0, 0, 0, 406, 407, 3, 107, 53, 0, 407, 409, 5, 46, 0, 0, 408, 410, 3, 105, 52, 0, 409, 408, 1, 0, 0, 0, 409, 410, 1, 0, 0, 0, 410, 417, 1, 0, 0, 0, 411, 414, 7, 3, 0, 0, 412, 415, 3, 71, 35, 0, 413, 415, 3, 73, 36, 0, 414, 412, 1, 0, 0, 0, 414, 413, 1, 0, 0, 0, 414, 415, 1, 0, 0, 0, 415, 416, 1, 0, 0, 0, 416, 418, 3, 107, 53, 0, 417, 411, 1, 0, 0, 0, 417, 418, 1, 0, 0, 0, 418, 428, 1, 0, 0, 0, 419, 420, 3, 107, 53, 0, 420, 423, 7, 3, 0, 0, 421, 424, 3, 71, 35, 0, 422, 424, 3, 73, 36, 0, 423, 421, 1, 0, 0, 0, 423, 422, 1, 0, 0, 0, 423, 424, 1, 0, 0, 0, 424, 425, 1, 0, 0, 0, 425, 426, 3, 107, 53, 0, 426, 428, 1, 0, 0, 0, 427, 394, 1, 0, 0, 0, 427, 406, 1, 0, 0, 0, 427, 419, 1, 0, 0, 0, 428, 110, 1, 0, 0, 0, 429, 430, 5, 35, 0, 0, 430, 431, 3, 173, 86, 0, 431, 112, 1, 0, 0, 0, 432, 433, 5, 49, 0, 0, 433, 434, 5, 106, 0, 0, 434, 114, 1, 0, 0, 0, 435, 436, 5, 97, 0, 0, 436, 437, 5, 98, 0, 0, 437, 438, 5, 115, 0, 0, 438, 116, 1, 0, 0, 0, 439, 440, 5, 115, 0, 0, 440, 441, 5, 105, 0, 0, 441, 442, 5, 110, 0, 0, 442, 118, 1, 0, 0, 0, 443, 444, 5, 99, 0, 0, 444, 445, 5, 111, 0, 0, 445, 446, 5, 115, 0, 0, 446, 120, 1, 0, 0, 0, 447, 448, 5, 116, 0, 0, 448, 449, 5, 97, 0, 0, 449, 450, 5, 110, 0, 0, 450, 122, 1, 0, 0, 0, 451, 452, 5, 101, 0, 0, 452, 453, 5, 120, 0, 0, 453, 454, 5, 112, 0, 0, 454, 124, 1, 0, 0, 0, 455, 456, 5, 108, 0, 0, 456, 457, 5, 111, 0, 0, 457, 458, 5, 103, 0, 0, 458, 126, 1, 0, 0, 0, 459, 460, 5, 115, 0, 0, 460, 461, 5, 105, 0, 0, 461, 462, 5, 110, 0, 0, 462, 463, 5, 104, 0, 0, 463, 128, 1, 0, 0, 0, 464, 465, 5, 99, 0, 0, 465, 466, 5, 111, 0, 0, 466, 467, 5, 115, 0, 0, 467, 468, 5, 104, 0, 0, 468, 130, 1, 0, 0, 0, 469, 470, 5, 116, 0, 0, 470, 471, 5, 97, 0, 0, 471, 472, 5, 110, 0, 0, 472, 473, 5, 104, 0, 0, 473, 132, 1, 0, 0, 0, 474, 475, 5, 97, 0, 0, 475, 476, 5, 116, 0, 0, 476, 477, 5, 97, 0, 0, 477, 478, 5, 110, 0, 0, 478, 134, 1, 0, 0, 0, 479, 480, 5, 97, 0, 0, 480, 481, 5, 99, 0, 0, 481, 482, 5, 111, 0, 0, 482, 483, 5, 115, 0, 0, 483, 136, 1, 0, 0, 0, 484, 485, 5, 97, 0, 0, 485, 486, 5, 115, 0, 0, 486, 487, 5, 105, 0, 0, 487, 488, 5, 110, 0, 0, 488, 138, 1, 0, 0, 0, 489, 490, 5, 97, 0, 0, 490, 491, 5, 116, 0, 0, 491, 492, 5, 97, 0, 0, 492, 493, 5, 110, 0, 0, 493, 494, 5, 104, 0, 0, 494, 140, 1, 0, 0, 0, 495, 496, 5, 97, 0, 0, 496, 497, 5, 115, 0, 0, 497, 498, 5, 105, 0, 0, 498, 499, 5, 110, 0, 0, 499, 500, 5, 104, 0, 0, 500, 142, 1, 0, 0, 0, 501, 502, 5, 97, 0, 0, 502, 503, 5, 99, 0, 0, 503, 504, 5, 111, 0, 0, 504, 505, 5, 115, 0, 0, 505, 506, 5, 104, 0, 0, 506, 144, 1, 0, 0, 0, 507, 508, 5, 104, 0, 0, 508, 509, 5, 101, 0, 0, 509, 510, 5, 97, 0, 0, 510, 511, 5, 118, 0, 0, 511, 512, 5, 105, 0, 0, 512, 513, 5, 115, 0, 0, 513, 514, 5, 105, 0, 0, 514, 515, 5, 100, 0, 0, 515, 516, 5, 101, 0, 0, 516, 146, 1, 0, 0, 0, 517, 518, 5, 99, 0, 0, 518, 519, 5, 111, 0, 0, 519, 520, 5, 110, 0, 0, 520, 521, 5, 106, 0, 0, 521, 148, 1, 0, 0, 0, 522, 523, 5, 114, 0, 0, 523, 524, 5, 101, 0, 0, 524, 525, 5, 97, 0, 0, 525, 526, 5, 108, 0, 0, 526, 150, 1, 0, 0, 0, 527, 528, 5, 105, 0, 0, 528, 529, 5, 109, 0, 0, 529, 530, 5, 97, 0, 0, 530, 531, 5, 103, 0, 0, 531, 152, 1, 0, 0, 0, 532, 533, 5, 97, 0, 0, 533, 534, 5, 116, 0, 0, 534, 535, 5, 97, 0, 0, 535, 536, 5, 110, 0, 0, 536, 537, 5, 50, 0, 0, 537, 154, 1, 0, 0, 0, 538, 539, 5, 37, 0, 0, 539, 540, 5, 73, 0, 0, 540, 156, 1, 0, 0, 0, 541, 542, 5, 37, 0, 0, 542, 543, 5, 88, 0, 0, 543, 158, 1, 0, 0, 0, 544, 545, 5, 37, 0, 0, 545, 546, 5, 89, 0, 0, 546, 160, 1, 0, 0, 0, 547, 548, 5, 37, 0, 0, 548, 549, 5, 90, 0, 0, 549, 162, 1, 0, 0, 0, 550, 551, 5, 37, 0, 0, 551, 552, 5, 67, 0, 0, 552, 164, 1, 0, 0, 0, 553, 554, 5, 37, 0, 0, 554, 555, 5, 65, 0, 0, 555, 166, 1, 0, 0, 0, 556, 557, 5, 37, 0, 0, 557, 558, 5, 74, 0, 0, 558, 168, 1, 0, 0, 0, 559, 560, 7, 4, 0, 0, 560, 170, 1, 0, 0, 0, 561, 562, 7, 5, 0, 0, 562, 172, 1, 0, 0, 0, 563, 567, 3, 169, 84, 0, 564, 566, 3, 171, 85, 0, 565, 564, 1, 0, 0, 0, 566, 569, 1, 0, 0, 0, 567, 565, 1, 0, 0, 0, 567, 568, 1, 0, 0, 0, 568, 174, 1, 0, 0, 0, 569, 567, 1, 0, 0, 0, 19, 0, 178, 185, 188, 193, 203, 379, 384, 389, 391, 394, 401, 404, 409, 414, 417, 423, 427, 567, 2, 0, 1, 0, 6, 0, 0] \ No newline at end of file diff --git a/src/oqd_core/frontend/analog/AnalogLexer.py b/src/oqd_core/frontend/analog/AnalogLexer.py index 1ef4c2d0..8c706954 100644 --- a/src/oqd_core/frontend/analog/AnalogLexer.py +++ b/src/oqd_core/frontend/analog/AnalogLexer.py @@ -10,7 +10,7 @@ def serializedATN(): return [ - 4,0,81,576,6,-1,2,0,7,0,2,1,7,1,2,2,7,2,2,3,7,3,2,4,7,4,2,5,7,5, + 4,0,81,570,6,-1,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, @@ -24,197 +24,194 @@ def serializedATN(): 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,1,0,4,0,177,8,0,11,0,12,0,178,1,0,1,0,1,1, - 1,1,5,1,185,8,1,10,1,12,1,188,9,1,1,1,4,1,191,8,1,11,1,12,1,192, - 3,1,195,8,1,1,2,4,2,198,8,2,11,2,12,2,199,1,2,1,2,1,3,1,3,1,3,1, - 3,5,3,208,8,3,10,3,12,3,211,9,3,1,3,1,3,1,3,1,3,1,4,1,4,1,4,1,4, - 1,4,1,4,1,4,1,5,1,5,1,5,1,5,1,5,1,5,1,5,1,5,1,6,1,6,1,6,1,6,1,6, - 1,6,1,6,1,6,1,6,1,6,1,6,1,7,1,7,1,7,1,8,1,8,1,8,1,8,1,8,1,9,1,9, - 1,9,1,9,1,9,1,9,1,10,1,10,1,10,1,10,1,10,1,11,1,11,1,11,1,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,13,1,13, - 1,13,1,14,1,14,1,14,1,14,1,15,1,15,1,15,1,16,1,16,1,16,1,17,1,17, - 1,17,1,18,1,18,1,18,1,18,1,19,1,19,1,20,1,20,1,20,1,20,1,20,1,21, - 1,21,1,21,1,21,1,21,1,21,1,22,1,22,1,22,1,22,1,22,1,23,1,23,1,23, - 1,23,1,23,1,23,1,24,1,24,1,25,1,25,1,26,1,26,1,27,1,27,1,28,1,28, - 1,29,1,29,1,30,1,30,1,31,1,31,1,32,1,32,1,33,1,33,1,34,1,34,1,35, - 1,35,1,36,1,36,1,37,1,37,1,38,1,38,1,39,1,39,1,39,1,40,1,40,1,40, - 1,41,1,41,1,42,1,42,1,42,1,43,1,43,1,44,1,44,1,44,1,45,1,45,1,45, - 1,46,1,46,1,46,1,47,1,47,1,47,1,48,1,48,1,48,1,49,1,49,1,50,1,50, - 1,51,1,51,3,51,386,8,51,1,52,4,52,389,8,52,11,52,12,52,390,1,53, - 1,53,1,53,3,53,396,8,53,3,53,398,8,53,1,54,3,54,401,8,54,1,54,1, - 54,1,54,1,54,1,54,3,54,408,8,54,1,54,3,54,411,8,54,1,54,1,54,1,54, - 3,54,416,8,54,1,54,1,54,1,54,3,54,421,8,54,1,54,3,54,424,8,54,1, - 54,1,54,1,54,1,54,3,54,430,8,54,1,54,1,54,3,54,434,8,54,1,55,1,55, - 1,55,1,56,1,56,1,56,1,57,1,57,1,57,1,57,1,58,1,58,1,58,1,58,1,59, - 1,59,1,59,1,59,1,60,1,60,1,60,1,60,1,61,1,61,1,61,1,61,1,62,1,62, - 1,62,1,62,1,63,1,63,1,63,1,63,1,63,1,64,1,64,1,64,1,64,1,64,1,65, - 1,65,1,65,1,65,1,65,1,66,1,66,1,66,1,66,1,66,1,67,1,67,1,67,1,67, - 1,67,1,68,1,68,1,68,1,68,1,68,1,69,1,69,1,69,1,69,1,69,1,69,1,70, - 1,70,1,70,1,70,1,70,1,70,1,71,1,71,1,71,1,71,1,71,1,71,1,72,1,72, - 1,72,1,72,1,72,1,72,1,72,1,72,1,72,1,72,1,73,1,73,1,73,1,73,1,73, - 1,74,1,74,1,74,1,74,1,74,1,75,1,75,1,75,1,75,1,75,1,76,1,76,1,76, - 1,76,1,76,1,76,1,77,1,77,1,77,1,78,1,78,1,78,1,79,1,79,1,79,1,80, - 1,80,1,80,1,81,1,81,1,81,1,82,1,82,1,82,1,83,1,83,1,83,1,84,1,84, - 1,85,1,85,1,86,1,86,5,86,572,8,86,10,86,12,86,575,9,86,0,0,87,1, - 1,3,2,5,3,7,4,9,5,11,6,13,7,15,8,17,9,19,10,21,11,23,12,25,13,27, - 14,29,15,31,16,33,17,35,18,37,19,39,20,41,21,43,22,45,23,47,24,49, - 25,51,26,53,27,55,28,57,29,59,30,61,31,63,32,65,33,67,34,69,35,71, - 36,73,37,75,38,77,39,79,40,81,41,83,42,85,43,87,44,89,45,91,46,93, - 47,95,48,97,49,99,0,101,0,103,0,105,0,107,50,109,51,111,52,113,53, - 115,54,117,55,119,56,121,57,123,58,125,59,127,60,129,61,131,62,133, - 63,135,64,137,65,139,66,141,67,143,68,145,69,147,70,149,71,151,72, - 153,73,155,74,157,75,159,76,161,77,163,78,165,79,167,80,169,0,171, - 0,173,81,1,0,6,2,0,9,9,32,32,2,0,10,10,13,13,1,0,49,57,2,0,69,69, - 101,101,3,0,65,90,95,95,97,122,4,0,48,57,65,90,95,95,97,122,592, - 0,1,1,0,0,0,0,3,1,0,0,0,0,5,1,0,0,0,0,7,1,0,0,0,0,9,1,0,0,0,0,11, - 1,0,0,0,0,13,1,0,0,0,0,15,1,0,0,0,0,17,1,0,0,0,0,19,1,0,0,0,0,21, - 1,0,0,0,0,23,1,0,0,0,0,25,1,0,0,0,0,27,1,0,0,0,0,29,1,0,0,0,0,31, - 1,0,0,0,0,33,1,0,0,0,0,35,1,0,0,0,0,37,1,0,0,0,0,39,1,0,0,0,0,41, - 1,0,0,0,0,43,1,0,0,0,0,45,1,0,0,0,0,47,1,0,0,0,0,49,1,0,0,0,0,51, - 1,0,0,0,0,53,1,0,0,0,0,55,1,0,0,0,0,57,1,0,0,0,0,59,1,0,0,0,0,61, - 1,0,0,0,0,63,1,0,0,0,0,65,1,0,0,0,0,67,1,0,0,0,0,69,1,0,0,0,0,71, - 1,0,0,0,0,73,1,0,0,0,0,75,1,0,0,0,0,77,1,0,0,0,0,79,1,0,0,0,0,81, - 1,0,0,0,0,83,1,0,0,0,0,85,1,0,0,0,0,87,1,0,0,0,0,89,1,0,0,0,0,91, - 1,0,0,0,0,93,1,0,0,0,0,95,1,0,0,0,0,97,1,0,0,0,0,107,1,0,0,0,0,109, - 1,0,0,0,0,111,1,0,0,0,0,113,1,0,0,0,0,115,1,0,0,0,0,117,1,0,0,0, - 0,119,1,0,0,0,0,121,1,0,0,0,0,123,1,0,0,0,0,125,1,0,0,0,0,127,1, - 0,0,0,0,129,1,0,0,0,0,131,1,0,0,0,0,133,1,0,0,0,0,135,1,0,0,0,0, - 137,1,0,0,0,0,139,1,0,0,0,0,141,1,0,0,0,0,143,1,0,0,0,0,145,1,0, - 0,0,0,147,1,0,0,0,0,149,1,0,0,0,0,151,1,0,0,0,0,153,1,0,0,0,0,155, - 1,0,0,0,0,157,1,0,0,0,0,159,1,0,0,0,0,161,1,0,0,0,0,163,1,0,0,0, - 0,165,1,0,0,0,0,167,1,0,0,0,0,173,1,0,0,0,1,176,1,0,0,0,3,194,1, - 0,0,0,5,197,1,0,0,0,7,203,1,0,0,0,9,216,1,0,0,0,11,223,1,0,0,0,13, - 231,1,0,0,0,15,242,1,0,0,0,17,245,1,0,0,0,19,250,1,0,0,0,21,256, - 1,0,0,0,23,261,1,0,0,0,25,265,1,0,0,0,27,271,1,0,0,0,29,280,1,0, - 0,0,31,284,1,0,0,0,33,287,1,0,0,0,35,290,1,0,0,0,37,293,1,0,0,0, - 39,297,1,0,0,0,41,299,1,0,0,0,43,304,1,0,0,0,45,310,1,0,0,0,47,315, - 1,0,0,0,49,321,1,0,0,0,51,323,1,0,0,0,53,325,1,0,0,0,55,327,1,0, - 0,0,57,329,1,0,0,0,59,331,1,0,0,0,61,333,1,0,0,0,63,335,1,0,0,0, - 65,337,1,0,0,0,67,339,1,0,0,0,69,341,1,0,0,0,71,343,1,0,0,0,73,345, - 1,0,0,0,75,347,1,0,0,0,77,349,1,0,0,0,79,351,1,0,0,0,81,354,1,0, - 0,0,83,357,1,0,0,0,85,359,1,0,0,0,87,362,1,0,0,0,89,364,1,0,0,0, - 91,367,1,0,0,0,93,370,1,0,0,0,95,373,1,0,0,0,97,376,1,0,0,0,99,379, - 1,0,0,0,101,381,1,0,0,0,103,385,1,0,0,0,105,388,1,0,0,0,107,397, - 1,0,0,0,109,433,1,0,0,0,111,435,1,0,0,0,113,438,1,0,0,0,115,441, - 1,0,0,0,117,445,1,0,0,0,119,449,1,0,0,0,121,453,1,0,0,0,123,457, - 1,0,0,0,125,461,1,0,0,0,127,465,1,0,0,0,129,470,1,0,0,0,131,475, - 1,0,0,0,133,480,1,0,0,0,135,485,1,0,0,0,137,490,1,0,0,0,139,495, - 1,0,0,0,141,501,1,0,0,0,143,507,1,0,0,0,145,513,1,0,0,0,147,523, - 1,0,0,0,149,528,1,0,0,0,151,533,1,0,0,0,153,538,1,0,0,0,155,544, - 1,0,0,0,157,547,1,0,0,0,159,550,1,0,0,0,161,553,1,0,0,0,163,556, - 1,0,0,0,165,559,1,0,0,0,167,562,1,0,0,0,169,565,1,0,0,0,171,567, - 1,0,0,0,173,569,1,0,0,0,175,177,7,0,0,0,176,175,1,0,0,0,177,178, - 1,0,0,0,178,176,1,0,0,0,178,179,1,0,0,0,179,180,1,0,0,0,180,181, - 6,0,0,0,181,2,1,0,0,0,182,186,5,59,0,0,183,185,7,1,0,0,184,183,1, - 0,0,0,185,188,1,0,0,0,186,184,1,0,0,0,186,187,1,0,0,0,187,195,1, - 0,0,0,188,186,1,0,0,0,189,191,7,1,0,0,190,189,1,0,0,0,191,192,1, - 0,0,0,192,190,1,0,0,0,192,193,1,0,0,0,193,195,1,0,0,0,194,182,1, - 0,0,0,194,190,1,0,0,0,195,4,1,0,0,0,196,198,7,1,0,0,197,196,1,0, - 0,0,198,199,1,0,0,0,199,197,1,0,0,0,199,200,1,0,0,0,200,201,1,0, - 0,0,201,202,6,2,0,0,202,6,1,0,0,0,203,204,5,47,0,0,204,205,5,47, - 0,0,205,209,1,0,0,0,206,208,8,1,0,0,207,206,1,0,0,0,208,211,1,0, - 0,0,209,207,1,0,0,0,209,210,1,0,0,0,210,212,1,0,0,0,211,209,1,0, - 0,0,212,213,3,5,2,0,213,214,1,0,0,0,214,215,6,3,1,0,215,8,1,0,0, - 0,216,217,5,101,0,0,217,218,5,118,0,0,218,219,5,111,0,0,219,220, - 5,108,0,0,220,221,5,118,0,0,221,222,5,101,0,0,222,10,1,0,0,0,223, - 224,5,109,0,0,224,225,5,101,0,0,225,226,5,97,0,0,226,227,5,115,0, - 0,227,228,5,117,0,0,228,229,5,114,0,0,229,230,5,101,0,0,230,12,1, - 0,0,0,231,232,5,105,0,0,232,233,5,110,0,0,233,234,5,105,0,0,234, - 235,5,116,0,0,235,236,5,105,0,0,236,237,5,97,0,0,237,238,5,108,0, - 0,238,239,5,105,0,0,239,240,5,122,0,0,240,241,5,101,0,0,241,14,1, - 0,0,0,242,243,5,105,0,0,243,244,5,102,0,0,244,16,1,0,0,0,245,246, - 5,101,0,0,246,247,5,108,0,0,247,248,5,115,0,0,248,249,5,101,0,0, - 249,18,1,0,0,0,250,251,5,119,0,0,251,252,5,104,0,0,252,253,5,105, - 0,0,253,254,5,108,0,0,254,255,5,101,0,0,255,20,1,0,0,0,256,257,5, - 119,0,0,257,258,5,105,0,0,258,259,5,116,0,0,259,260,5,104,0,0,260, - 22,1,0,0,0,261,262,5,102,0,0,262,263,5,111,0,0,263,264,5,114,0,0, - 264,24,1,0,0,0,265,266,5,98,0,0,266,267,5,114,0,0,267,268,5,101, - 0,0,268,269,5,97,0,0,269,270,5,107,0,0,270,26,1,0,0,0,271,272,5, - 99,0,0,272,273,5,111,0,0,273,274,5,110,0,0,274,275,5,116,0,0,275, - 276,5,105,0,0,276,277,5,110,0,0,277,278,5,117,0,0,278,279,5,101, - 0,0,279,28,1,0,0,0,280,281,5,97,0,0,281,282,5,110,0,0,282,283,5, - 100,0,0,283,30,1,0,0,0,284,285,5,38,0,0,285,286,5,38,0,0,286,32, - 1,0,0,0,287,288,5,111,0,0,288,289,5,114,0,0,289,34,1,0,0,0,290,291, - 5,124,0,0,291,292,5,124,0,0,292,36,1,0,0,0,293,294,5,110,0,0,294, - 295,5,111,0,0,295,296,5,116,0,0,296,38,1,0,0,0,297,298,5,33,0,0, - 298,40,1,0,0,0,299,300,5,116,0,0,300,301,5,114,0,0,301,302,5,117, - 0,0,302,303,5,101,0,0,303,42,1,0,0,0,304,305,5,102,0,0,305,306,5, - 97,0,0,306,307,5,108,0,0,307,308,5,115,0,0,308,309,5,101,0,0,309, - 44,1,0,0,0,310,311,5,113,0,0,311,312,5,114,0,0,312,313,5,101,0,0, - 313,314,5,103,0,0,314,46,1,0,0,0,315,316,5,113,0,0,316,317,5,109, - 0,0,317,318,5,111,0,0,318,319,5,100,0,0,319,320,5,101,0,0,320,48, - 1,0,0,0,321,322,5,58,0,0,322,50,1,0,0,0,323,324,5,59,0,0,324,52, - 1,0,0,0,325,326,5,44,0,0,326,54,1,0,0,0,327,328,5,40,0,0,328,56, - 1,0,0,0,329,330,5,41,0,0,330,58,1,0,0,0,331,332,5,91,0,0,332,60, - 1,0,0,0,333,334,5,93,0,0,334,62,1,0,0,0,335,336,5,123,0,0,336,64, - 1,0,0,0,337,338,5,125,0,0,338,66,1,0,0,0,339,340,5,42,0,0,340,68, - 1,0,0,0,341,342,5,47,0,0,342,70,1,0,0,0,343,344,5,43,0,0,344,72, - 1,0,0,0,345,346,5,45,0,0,346,74,1,0,0,0,347,348,5,94,0,0,348,76, - 1,0,0,0,349,350,5,61,0,0,350,78,1,0,0,0,351,352,5,61,0,0,352,353, - 5,61,0,0,353,80,1,0,0,0,354,355,5,33,0,0,355,356,5,61,0,0,356,82, - 1,0,0,0,357,358,5,60,0,0,358,84,1,0,0,0,359,360,5,60,0,0,360,361, - 5,61,0,0,361,86,1,0,0,0,362,363,5,62,0,0,363,88,1,0,0,0,364,365, - 5,62,0,0,365,366,5,61,0,0,366,90,1,0,0,0,367,368,5,37,0,0,368,369, - 5,64,0,0,369,92,1,0,0,0,370,371,5,37,0,0,371,372,5,43,0,0,372,94, - 1,0,0,0,373,374,5,37,0,0,374,375,5,42,0,0,375,96,1,0,0,0,376,377, - 5,37,0,0,377,378,5,45,0,0,378,98,1,0,0,0,379,380,7,2,0,0,380,100, - 1,0,0,0,381,382,5,48,0,0,382,102,1,0,0,0,383,386,3,101,50,0,384, - 386,3,99,49,0,385,383,1,0,0,0,385,384,1,0,0,0,386,104,1,0,0,0,387, - 389,3,103,51,0,388,387,1,0,0,0,389,390,1,0,0,0,390,388,1,0,0,0,390, - 391,1,0,0,0,391,106,1,0,0,0,392,398,3,101,50,0,393,395,3,99,49,0, - 394,396,3,105,52,0,395,394,1,0,0,0,395,396,1,0,0,0,396,398,1,0,0, - 0,397,392,1,0,0,0,397,393,1,0,0,0,398,108,1,0,0,0,399,401,3,107, - 53,0,400,399,1,0,0,0,400,401,1,0,0,0,401,402,1,0,0,0,402,403,5,46, - 0,0,403,410,3,105,52,0,404,407,7,3,0,0,405,408,3,71,35,0,406,408, - 3,73,36,0,407,405,1,0,0,0,407,406,1,0,0,0,407,408,1,0,0,0,408,409, - 1,0,0,0,409,411,3,107,53,0,410,404,1,0,0,0,410,411,1,0,0,0,411,434, - 1,0,0,0,412,413,3,107,53,0,413,415,5,46,0,0,414,416,3,105,52,0,415, - 414,1,0,0,0,415,416,1,0,0,0,416,423,1,0,0,0,417,420,7,3,0,0,418, - 421,3,71,35,0,419,421,3,73,36,0,420,418,1,0,0,0,420,419,1,0,0,0, - 420,421,1,0,0,0,421,422,1,0,0,0,422,424,3,107,53,0,423,417,1,0,0, - 0,423,424,1,0,0,0,424,434,1,0,0,0,425,426,3,107,53,0,426,429,7,3, - 0,0,427,430,3,71,35,0,428,430,3,73,36,0,429,427,1,0,0,0,429,428, - 1,0,0,0,429,430,1,0,0,0,430,431,1,0,0,0,431,432,3,107,53,0,432,434, - 1,0,0,0,433,400,1,0,0,0,433,412,1,0,0,0,433,425,1,0,0,0,434,110, - 1,0,0,0,435,436,5,35,0,0,436,437,3,173,86,0,437,112,1,0,0,0,438, - 439,5,49,0,0,439,440,5,106,0,0,440,114,1,0,0,0,441,442,5,97,0,0, - 442,443,5,98,0,0,443,444,5,115,0,0,444,116,1,0,0,0,445,446,5,115, - 0,0,446,447,5,105,0,0,447,448,5,110,0,0,448,118,1,0,0,0,449,450, - 5,99,0,0,450,451,5,111,0,0,451,452,5,115,0,0,452,120,1,0,0,0,453, - 454,5,116,0,0,454,455,5,97,0,0,455,456,5,110,0,0,456,122,1,0,0,0, - 457,458,5,101,0,0,458,459,5,120,0,0,459,460,5,112,0,0,460,124,1, - 0,0,0,461,462,5,108,0,0,462,463,5,111,0,0,463,464,5,103,0,0,464, - 126,1,0,0,0,465,466,5,115,0,0,466,467,5,105,0,0,467,468,5,110,0, - 0,468,469,5,104,0,0,469,128,1,0,0,0,470,471,5,99,0,0,471,472,5,111, - 0,0,472,473,5,115,0,0,473,474,5,104,0,0,474,130,1,0,0,0,475,476, - 5,116,0,0,476,477,5,97,0,0,477,478,5,110,0,0,478,479,5,104,0,0,479, - 132,1,0,0,0,480,481,5,97,0,0,481,482,5,116,0,0,482,483,5,97,0,0, - 483,484,5,110,0,0,484,134,1,0,0,0,485,486,5,97,0,0,486,487,5,99, - 0,0,487,488,5,111,0,0,488,489,5,115,0,0,489,136,1,0,0,0,490,491, - 5,97,0,0,491,492,5,115,0,0,492,493,5,105,0,0,493,494,5,110,0,0,494, - 138,1,0,0,0,495,496,5,97,0,0,496,497,5,116,0,0,497,498,5,97,0,0, - 498,499,5,110,0,0,499,500,5,104,0,0,500,140,1,0,0,0,501,502,5,97, - 0,0,502,503,5,115,0,0,503,504,5,105,0,0,504,505,5,110,0,0,505,506, - 5,104,0,0,506,142,1,0,0,0,507,508,5,97,0,0,508,509,5,99,0,0,509, - 510,5,111,0,0,510,511,5,115,0,0,511,512,5,104,0,0,512,144,1,0,0, - 0,513,514,5,104,0,0,514,515,5,101,0,0,515,516,5,97,0,0,516,517,5, - 118,0,0,517,518,5,105,0,0,518,519,5,115,0,0,519,520,5,105,0,0,520, - 521,5,100,0,0,521,522,5,101,0,0,522,146,1,0,0,0,523,524,5,99,0,0, - 524,525,5,111,0,0,525,526,5,110,0,0,526,527,5,106,0,0,527,148,1, - 0,0,0,528,529,5,114,0,0,529,530,5,101,0,0,530,531,5,97,0,0,531,532, - 5,108,0,0,532,150,1,0,0,0,533,534,5,105,0,0,534,535,5,109,0,0,535, - 536,5,97,0,0,536,537,5,103,0,0,537,152,1,0,0,0,538,539,5,97,0,0, - 539,540,5,116,0,0,540,541,5,97,0,0,541,542,5,110,0,0,542,543,5,50, - 0,0,543,154,1,0,0,0,544,545,5,37,0,0,545,546,5,73,0,0,546,156,1, - 0,0,0,547,548,5,37,0,0,548,549,5,88,0,0,549,158,1,0,0,0,550,551, - 5,37,0,0,551,552,5,89,0,0,552,160,1,0,0,0,553,554,5,37,0,0,554,555, - 5,90,0,0,555,162,1,0,0,0,556,557,5,37,0,0,557,558,5,67,0,0,558,164, - 1,0,0,0,559,560,5,37,0,0,560,561,5,65,0,0,561,166,1,0,0,0,562,563, - 5,37,0,0,563,564,5,74,0,0,564,168,1,0,0,0,565,566,7,4,0,0,566,170, - 1,0,0,0,567,568,7,5,0,0,568,172,1,0,0,0,569,573,3,169,84,0,570,572, - 3,171,85,0,571,570,1,0,0,0,572,575,1,0,0,0,573,571,1,0,0,0,573,574, - 1,0,0,0,574,174,1,0,0,0,575,573,1,0,0,0,20,0,178,186,192,194,199, - 209,385,390,395,397,400,407,410,415,420,423,429,433,573,2,0,1,0, - 6,0,0 + 4,1,184,8,1,11,1,12,1,185,1,1,3,1,189,8,1,1,2,4,2,192,8,2,11,2,12, + 2,193,1,2,1,2,1,3,1,3,1,3,1,3,5,3,202,8,3,10,3,12,3,205,9,3,1,3, + 1,3,1,3,1,3,1,4,1,4,1,4,1,4,1,4,1,4,1,4,1,5,1,5,1,5,1,5,1,5,1,5, + 1,5,1,5,1,6,1,6,1,6,1,6,1,6,1,6,1,6,1,6,1,6,1,6,1,6,1,7,1,7,1,7, + 1,8,1,8,1,8,1,8,1,8,1,9,1,9,1,9,1,9,1,9,1,9,1,10,1,10,1,10,1,10, + 1,10,1,11,1,11,1,11,1,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,13,1,13,1,13,1,14,1,14,1,14,1,14,1,15,1,15, + 1,15,1,16,1,16,1,16,1,17,1,17,1,17,1,18,1,18,1,18,1,18,1,19,1,19, + 1,20,1,20,1,20,1,20,1,20,1,21,1,21,1,21,1,21,1,21,1,21,1,22,1,22, + 1,22,1,22,1,22,1,23,1,23,1,23,1,23,1,23,1,23,1,24,1,24,1,25,1,25, + 1,26,1,26,1,27,1,27,1,28,1,28,1,29,1,29,1,30,1,30,1,31,1,31,1,32, + 1,32,1,33,1,33,1,34,1,34,1,35,1,35,1,36,1,36,1,37,1,37,1,38,1,38, + 1,39,1,39,1,39,1,40,1,40,1,40,1,41,1,41,1,42,1,42,1,42,1,43,1,43, + 1,44,1,44,1,44,1,45,1,45,1,45,1,46,1,46,1,46,1,47,1,47,1,47,1,48, + 1,48,1,48,1,49,1,49,1,50,1,50,1,51,1,51,3,51,380,8,51,1,52,4,52, + 383,8,52,11,52,12,52,384,1,53,1,53,1,53,3,53,390,8,53,3,53,392,8, + 53,1,54,3,54,395,8,54,1,54,1,54,1,54,1,54,1,54,3,54,402,8,54,1,54, + 3,54,405,8,54,1,54,1,54,1,54,3,54,410,8,54,1,54,1,54,1,54,3,54,415, + 8,54,1,54,3,54,418,8,54,1,54,1,54,1,54,1,54,3,54,424,8,54,1,54,1, + 54,3,54,428,8,54,1,55,1,55,1,55,1,56,1,56,1,56,1,57,1,57,1,57,1, + 57,1,58,1,58,1,58,1,58,1,59,1,59,1,59,1,59,1,60,1,60,1,60,1,60,1, + 61,1,61,1,61,1,61,1,62,1,62,1,62,1,62,1,63,1,63,1,63,1,63,1,63,1, + 64,1,64,1,64,1,64,1,64,1,65,1,65,1,65,1,65,1,65,1,66,1,66,1,66,1, + 66,1,66,1,67,1,67,1,67,1,67,1,67,1,68,1,68,1,68,1,68,1,68,1,69,1, + 69,1,69,1,69,1,69,1,69,1,70,1,70,1,70,1,70,1,70,1,70,1,71,1,71,1, + 71,1,71,1,71,1,71,1,72,1,72,1,72,1,72,1,72,1,72,1,72,1,72,1,72,1, + 72,1,73,1,73,1,73,1,73,1,73,1,74,1,74,1,74,1,74,1,74,1,75,1,75,1, + 75,1,75,1,75,1,76,1,76,1,76,1,76,1,76,1,76,1,77,1,77,1,77,1,78,1, + 78,1,78,1,79,1,79,1,79,1,80,1,80,1,80,1,81,1,81,1,81,1,82,1,82,1, + 82,1,83,1,83,1,83,1,84,1,84,1,85,1,85,1,86,1,86,5,86,566,8,86,10, + 86,12,86,569,9,86,0,0,87,1,1,3,2,5,3,7,4,9,5,11,6,13,7,15,8,17,9, + 19,10,21,11,23,12,25,13,27,14,29,15,31,16,33,17,35,18,37,19,39,20, + 41,21,43,22,45,23,47,24,49,25,51,26,53,27,55,28,57,29,59,30,61,31, + 63,32,65,33,67,34,69,35,71,36,73,37,75,38,77,39,79,40,81,41,83,42, + 85,43,87,44,89,45,91,46,93,47,95,48,97,49,99,0,101,0,103,0,105,0, + 107,50,109,51,111,52,113,53,115,54,117,55,119,56,121,57,123,58,125, + 59,127,60,129,61,131,62,133,63,135,64,137,65,139,66,141,67,143,68, + 145,69,147,70,149,71,151,72,153,73,155,74,157,75,159,76,161,77,163, + 78,165,79,167,80,169,0,171,0,173,81,1,0,6,2,0,9,9,32,32,2,0,10,10, + 13,13,1,0,49,57,2,0,69,69,101,101,3,0,65,90,95,95,97,122,4,0,48, + 57,65,90,95,95,97,122,585,0,1,1,0,0,0,0,3,1,0,0,0,0,5,1,0,0,0,0, + 7,1,0,0,0,0,9,1,0,0,0,0,11,1,0,0,0,0,13,1,0,0,0,0,15,1,0,0,0,0,17, + 1,0,0,0,0,19,1,0,0,0,0,21,1,0,0,0,0,23,1,0,0,0,0,25,1,0,0,0,0,27, + 1,0,0,0,0,29,1,0,0,0,0,31,1,0,0,0,0,33,1,0,0,0,0,35,1,0,0,0,0,37, + 1,0,0,0,0,39,1,0,0,0,0,41,1,0,0,0,0,43,1,0,0,0,0,45,1,0,0,0,0,47, + 1,0,0,0,0,49,1,0,0,0,0,51,1,0,0,0,0,53,1,0,0,0,0,55,1,0,0,0,0,57, + 1,0,0,0,0,59,1,0,0,0,0,61,1,0,0,0,0,63,1,0,0,0,0,65,1,0,0,0,0,67, + 1,0,0,0,0,69,1,0,0,0,0,71,1,0,0,0,0,73,1,0,0,0,0,75,1,0,0,0,0,77, + 1,0,0,0,0,79,1,0,0,0,0,81,1,0,0,0,0,83,1,0,0,0,0,85,1,0,0,0,0,87, + 1,0,0,0,0,89,1,0,0,0,0,91,1,0,0,0,0,93,1,0,0,0,0,95,1,0,0,0,0,97, + 1,0,0,0,0,107,1,0,0,0,0,109,1,0,0,0,0,111,1,0,0,0,0,113,1,0,0,0, + 0,115,1,0,0,0,0,117,1,0,0,0,0,119,1,0,0,0,0,121,1,0,0,0,0,123,1, + 0,0,0,0,125,1,0,0,0,0,127,1,0,0,0,0,129,1,0,0,0,0,131,1,0,0,0,0, + 133,1,0,0,0,0,135,1,0,0,0,0,137,1,0,0,0,0,139,1,0,0,0,0,141,1,0, + 0,0,0,143,1,0,0,0,0,145,1,0,0,0,0,147,1,0,0,0,0,149,1,0,0,0,0,151, + 1,0,0,0,0,153,1,0,0,0,0,155,1,0,0,0,0,157,1,0,0,0,0,159,1,0,0,0, + 0,161,1,0,0,0,0,163,1,0,0,0,0,165,1,0,0,0,0,167,1,0,0,0,0,173,1, + 0,0,0,1,176,1,0,0,0,3,188,1,0,0,0,5,191,1,0,0,0,7,197,1,0,0,0,9, + 210,1,0,0,0,11,217,1,0,0,0,13,225,1,0,0,0,15,236,1,0,0,0,17,239, + 1,0,0,0,19,244,1,0,0,0,21,250,1,0,0,0,23,255,1,0,0,0,25,259,1,0, + 0,0,27,265,1,0,0,0,29,274,1,0,0,0,31,278,1,0,0,0,33,281,1,0,0,0, + 35,284,1,0,0,0,37,287,1,0,0,0,39,291,1,0,0,0,41,293,1,0,0,0,43,298, + 1,0,0,0,45,304,1,0,0,0,47,309,1,0,0,0,49,315,1,0,0,0,51,317,1,0, + 0,0,53,319,1,0,0,0,55,321,1,0,0,0,57,323,1,0,0,0,59,325,1,0,0,0, + 61,327,1,0,0,0,63,329,1,0,0,0,65,331,1,0,0,0,67,333,1,0,0,0,69,335, + 1,0,0,0,71,337,1,0,0,0,73,339,1,0,0,0,75,341,1,0,0,0,77,343,1,0, + 0,0,79,345,1,0,0,0,81,348,1,0,0,0,83,351,1,0,0,0,85,353,1,0,0,0, + 87,356,1,0,0,0,89,358,1,0,0,0,91,361,1,0,0,0,93,364,1,0,0,0,95,367, + 1,0,0,0,97,370,1,0,0,0,99,373,1,0,0,0,101,375,1,0,0,0,103,379,1, + 0,0,0,105,382,1,0,0,0,107,391,1,0,0,0,109,427,1,0,0,0,111,429,1, + 0,0,0,113,432,1,0,0,0,115,435,1,0,0,0,117,439,1,0,0,0,119,443,1, + 0,0,0,121,447,1,0,0,0,123,451,1,0,0,0,125,455,1,0,0,0,127,459,1, + 0,0,0,129,464,1,0,0,0,131,469,1,0,0,0,133,474,1,0,0,0,135,479,1, + 0,0,0,137,484,1,0,0,0,139,489,1,0,0,0,141,495,1,0,0,0,143,501,1, + 0,0,0,145,507,1,0,0,0,147,517,1,0,0,0,149,522,1,0,0,0,151,527,1, + 0,0,0,153,532,1,0,0,0,155,538,1,0,0,0,157,541,1,0,0,0,159,544,1, + 0,0,0,161,547,1,0,0,0,163,550,1,0,0,0,165,553,1,0,0,0,167,556,1, + 0,0,0,169,559,1,0,0,0,171,561,1,0,0,0,173,563,1,0,0,0,175,177,7, + 0,0,0,176,175,1,0,0,0,177,178,1,0,0,0,178,176,1,0,0,0,178,179,1, + 0,0,0,179,180,1,0,0,0,180,181,6,0,0,0,181,2,1,0,0,0,182,184,7,1, + 0,0,183,182,1,0,0,0,184,185,1,0,0,0,185,183,1,0,0,0,185,186,1,0, + 0,0,186,189,1,0,0,0,187,189,3,7,3,0,188,183,1,0,0,0,188,187,1,0, + 0,0,189,4,1,0,0,0,190,192,7,1,0,0,191,190,1,0,0,0,192,193,1,0,0, + 0,193,191,1,0,0,0,193,194,1,0,0,0,194,195,1,0,0,0,195,196,6,2,0, + 0,196,6,1,0,0,0,197,198,5,47,0,0,198,199,5,47,0,0,199,203,1,0,0, + 0,200,202,8,1,0,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,3,5,2, + 0,207,208,1,0,0,0,208,209,6,3,1,0,209,8,1,0,0,0,210,211,5,101,0, + 0,211,212,5,118,0,0,212,213,5,111,0,0,213,214,5,108,0,0,214,215, + 5,118,0,0,215,216,5,101,0,0,216,10,1,0,0,0,217,218,5,109,0,0,218, + 219,5,101,0,0,219,220,5,97,0,0,220,221,5,115,0,0,221,222,5,117,0, + 0,222,223,5,114,0,0,223,224,5,101,0,0,224,12,1,0,0,0,225,226,5,105, + 0,0,226,227,5,110,0,0,227,228,5,105,0,0,228,229,5,116,0,0,229,230, + 5,105,0,0,230,231,5,97,0,0,231,232,5,108,0,0,232,233,5,105,0,0,233, + 234,5,122,0,0,234,235,5,101,0,0,235,14,1,0,0,0,236,237,5,105,0,0, + 237,238,5,102,0,0,238,16,1,0,0,0,239,240,5,101,0,0,240,241,5,108, + 0,0,241,242,5,115,0,0,242,243,5,101,0,0,243,18,1,0,0,0,244,245,5, + 119,0,0,245,246,5,104,0,0,246,247,5,105,0,0,247,248,5,108,0,0,248, + 249,5,101,0,0,249,20,1,0,0,0,250,251,5,119,0,0,251,252,5,105,0,0, + 252,253,5,116,0,0,253,254,5,104,0,0,254,22,1,0,0,0,255,256,5,102, + 0,0,256,257,5,111,0,0,257,258,5,114,0,0,258,24,1,0,0,0,259,260,5, + 98,0,0,260,261,5,114,0,0,261,262,5,101,0,0,262,263,5,97,0,0,263, + 264,5,107,0,0,264,26,1,0,0,0,265,266,5,99,0,0,266,267,5,111,0,0, + 267,268,5,110,0,0,268,269,5,116,0,0,269,270,5,105,0,0,270,271,5, + 110,0,0,271,272,5,117,0,0,272,273,5,101,0,0,273,28,1,0,0,0,274,275, + 5,97,0,0,275,276,5,110,0,0,276,277,5,100,0,0,277,30,1,0,0,0,278, + 279,5,38,0,0,279,280,5,38,0,0,280,32,1,0,0,0,281,282,5,111,0,0,282, + 283,5,114,0,0,283,34,1,0,0,0,284,285,5,124,0,0,285,286,5,124,0,0, + 286,36,1,0,0,0,287,288,5,110,0,0,288,289,5,111,0,0,289,290,5,116, + 0,0,290,38,1,0,0,0,291,292,5,33,0,0,292,40,1,0,0,0,293,294,5,116, + 0,0,294,295,5,114,0,0,295,296,5,117,0,0,296,297,5,101,0,0,297,42, + 1,0,0,0,298,299,5,102,0,0,299,300,5,97,0,0,300,301,5,108,0,0,301, + 302,5,115,0,0,302,303,5,101,0,0,303,44,1,0,0,0,304,305,5,113,0,0, + 305,306,5,114,0,0,306,307,5,101,0,0,307,308,5,103,0,0,308,46,1,0, + 0,0,309,310,5,113,0,0,310,311,5,109,0,0,311,312,5,111,0,0,312,313, + 5,100,0,0,313,314,5,101,0,0,314,48,1,0,0,0,315,316,5,58,0,0,316, + 50,1,0,0,0,317,318,5,59,0,0,318,52,1,0,0,0,319,320,5,44,0,0,320, + 54,1,0,0,0,321,322,5,40,0,0,322,56,1,0,0,0,323,324,5,41,0,0,324, + 58,1,0,0,0,325,326,5,91,0,0,326,60,1,0,0,0,327,328,5,93,0,0,328, + 62,1,0,0,0,329,330,5,123,0,0,330,64,1,0,0,0,331,332,5,125,0,0,332, + 66,1,0,0,0,333,334,5,42,0,0,334,68,1,0,0,0,335,336,5,47,0,0,336, + 70,1,0,0,0,337,338,5,43,0,0,338,72,1,0,0,0,339,340,5,45,0,0,340, + 74,1,0,0,0,341,342,5,94,0,0,342,76,1,0,0,0,343,344,5,61,0,0,344, + 78,1,0,0,0,345,346,5,61,0,0,346,347,5,61,0,0,347,80,1,0,0,0,348, + 349,5,33,0,0,349,350,5,61,0,0,350,82,1,0,0,0,351,352,5,60,0,0,352, + 84,1,0,0,0,353,354,5,60,0,0,354,355,5,61,0,0,355,86,1,0,0,0,356, + 357,5,62,0,0,357,88,1,0,0,0,358,359,5,62,0,0,359,360,5,61,0,0,360, + 90,1,0,0,0,361,362,5,37,0,0,362,363,5,64,0,0,363,92,1,0,0,0,364, + 365,5,37,0,0,365,366,5,43,0,0,366,94,1,0,0,0,367,368,5,37,0,0,368, + 369,5,42,0,0,369,96,1,0,0,0,370,371,5,37,0,0,371,372,5,45,0,0,372, + 98,1,0,0,0,373,374,7,2,0,0,374,100,1,0,0,0,375,376,5,48,0,0,376, + 102,1,0,0,0,377,380,3,101,50,0,378,380,3,99,49,0,379,377,1,0,0,0, + 379,378,1,0,0,0,380,104,1,0,0,0,381,383,3,103,51,0,382,381,1,0,0, + 0,383,384,1,0,0,0,384,382,1,0,0,0,384,385,1,0,0,0,385,106,1,0,0, + 0,386,392,3,101,50,0,387,389,3,99,49,0,388,390,3,105,52,0,389,388, + 1,0,0,0,389,390,1,0,0,0,390,392,1,0,0,0,391,386,1,0,0,0,391,387, + 1,0,0,0,392,108,1,0,0,0,393,395,3,107,53,0,394,393,1,0,0,0,394,395, + 1,0,0,0,395,396,1,0,0,0,396,397,5,46,0,0,397,404,3,105,52,0,398, + 401,7,3,0,0,399,402,3,71,35,0,400,402,3,73,36,0,401,399,1,0,0,0, + 401,400,1,0,0,0,401,402,1,0,0,0,402,403,1,0,0,0,403,405,3,107,53, + 0,404,398,1,0,0,0,404,405,1,0,0,0,405,428,1,0,0,0,406,407,3,107, + 53,0,407,409,5,46,0,0,408,410,3,105,52,0,409,408,1,0,0,0,409,410, + 1,0,0,0,410,417,1,0,0,0,411,414,7,3,0,0,412,415,3,71,35,0,413,415, + 3,73,36,0,414,412,1,0,0,0,414,413,1,0,0,0,414,415,1,0,0,0,415,416, + 1,0,0,0,416,418,3,107,53,0,417,411,1,0,0,0,417,418,1,0,0,0,418,428, + 1,0,0,0,419,420,3,107,53,0,420,423,7,3,0,0,421,424,3,71,35,0,422, + 424,3,73,36,0,423,421,1,0,0,0,423,422,1,0,0,0,423,424,1,0,0,0,424, + 425,1,0,0,0,425,426,3,107,53,0,426,428,1,0,0,0,427,394,1,0,0,0,427, + 406,1,0,0,0,427,419,1,0,0,0,428,110,1,0,0,0,429,430,5,35,0,0,430, + 431,3,173,86,0,431,112,1,0,0,0,432,433,5,49,0,0,433,434,5,106,0, + 0,434,114,1,0,0,0,435,436,5,97,0,0,436,437,5,98,0,0,437,438,5,115, + 0,0,438,116,1,0,0,0,439,440,5,115,0,0,440,441,5,105,0,0,441,442, + 5,110,0,0,442,118,1,0,0,0,443,444,5,99,0,0,444,445,5,111,0,0,445, + 446,5,115,0,0,446,120,1,0,0,0,447,448,5,116,0,0,448,449,5,97,0,0, + 449,450,5,110,0,0,450,122,1,0,0,0,451,452,5,101,0,0,452,453,5,120, + 0,0,453,454,5,112,0,0,454,124,1,0,0,0,455,456,5,108,0,0,456,457, + 5,111,0,0,457,458,5,103,0,0,458,126,1,0,0,0,459,460,5,115,0,0,460, + 461,5,105,0,0,461,462,5,110,0,0,462,463,5,104,0,0,463,128,1,0,0, + 0,464,465,5,99,0,0,465,466,5,111,0,0,466,467,5,115,0,0,467,468,5, + 104,0,0,468,130,1,0,0,0,469,470,5,116,0,0,470,471,5,97,0,0,471,472, + 5,110,0,0,472,473,5,104,0,0,473,132,1,0,0,0,474,475,5,97,0,0,475, + 476,5,116,0,0,476,477,5,97,0,0,477,478,5,110,0,0,478,134,1,0,0,0, + 479,480,5,97,0,0,480,481,5,99,0,0,481,482,5,111,0,0,482,483,5,115, + 0,0,483,136,1,0,0,0,484,485,5,97,0,0,485,486,5,115,0,0,486,487,5, + 105,0,0,487,488,5,110,0,0,488,138,1,0,0,0,489,490,5,97,0,0,490,491, + 5,116,0,0,491,492,5,97,0,0,492,493,5,110,0,0,493,494,5,104,0,0,494, + 140,1,0,0,0,495,496,5,97,0,0,496,497,5,115,0,0,497,498,5,105,0,0, + 498,499,5,110,0,0,499,500,5,104,0,0,500,142,1,0,0,0,501,502,5,97, + 0,0,502,503,5,99,0,0,503,504,5,111,0,0,504,505,5,115,0,0,505,506, + 5,104,0,0,506,144,1,0,0,0,507,508,5,104,0,0,508,509,5,101,0,0,509, + 510,5,97,0,0,510,511,5,118,0,0,511,512,5,105,0,0,512,513,5,115,0, + 0,513,514,5,105,0,0,514,515,5,100,0,0,515,516,5,101,0,0,516,146, + 1,0,0,0,517,518,5,99,0,0,518,519,5,111,0,0,519,520,5,110,0,0,520, + 521,5,106,0,0,521,148,1,0,0,0,522,523,5,114,0,0,523,524,5,101,0, + 0,524,525,5,97,0,0,525,526,5,108,0,0,526,150,1,0,0,0,527,528,5,105, + 0,0,528,529,5,109,0,0,529,530,5,97,0,0,530,531,5,103,0,0,531,152, + 1,0,0,0,532,533,5,97,0,0,533,534,5,116,0,0,534,535,5,97,0,0,535, + 536,5,110,0,0,536,537,5,50,0,0,537,154,1,0,0,0,538,539,5,37,0,0, + 539,540,5,73,0,0,540,156,1,0,0,0,541,542,5,37,0,0,542,543,5,88,0, + 0,543,158,1,0,0,0,544,545,5,37,0,0,545,546,5,89,0,0,546,160,1,0, + 0,0,547,548,5,37,0,0,548,549,5,90,0,0,549,162,1,0,0,0,550,551,5, + 37,0,0,551,552,5,67,0,0,552,164,1,0,0,0,553,554,5,37,0,0,554,555, + 5,65,0,0,555,166,1,0,0,0,556,557,5,37,0,0,557,558,5,74,0,0,558,168, + 1,0,0,0,559,560,7,4,0,0,560,170,1,0,0,0,561,562,7,5,0,0,562,172, + 1,0,0,0,563,567,3,169,84,0,564,566,3,171,85,0,565,564,1,0,0,0,566, + 569,1,0,0,0,567,565,1,0,0,0,567,568,1,0,0,0,568,174,1,0,0,0,569, + 567,1,0,0,0,19,0,178,185,188,193,203,379,384,389,391,394,401,404, + 409,414,417,423,427,567,2,0,1,0,6,0,0 ] class AnalogLexer(Lexer): diff --git a/src/oqd_core/frontend/analog/README.md b/src/oqd_core/frontend/analog/README.md deleted file mode 100644 index a374446c..00000000 --- a/src/oqd_core/frontend/analog/README.md +++ /dev/null @@ -1,28 +0,0 @@ -# Frontend for Analog Interface - -Make sure you're in the virtual environment, and sync your requirements. - -```bash -uv sync -source .venv/bin/activate -``` - -# Convert .analog into the AST -The example code is in `examples/analog/test.analog`. This file contains the expected syntax of the Parser. - -Run the Typer app: -```bash -# Run example -python3 -m oqd_core.frontend.analog.output -i examples/analog/test.analog -o examples/analog/test.ast -``` - -This example generates the Analog Circuit AST in `examples/analog/test.ast`. - -# Deserialize JSON AST into .analog code - -Run the Typer app with the deserialize option: -```bash -# Run example -python3 -m oqd_core.frontend.analog.output -d -i examples/analog/test.ast -o examples/analog/test.out -``` -This example generates the Analog language code in `examples/analog/test.out`. \ No newline at end of file diff --git a/src/oqd_core/frontend/analog/output.py b/src/oqd_core/frontend/analog/output.py deleted file mode 100755 index ba31b539..00000000 --- a/src/oqd_core/frontend/analog/output.py +++ /dev/null @@ -1,42 +0,0 @@ -# Copyright 2024-2025 Open Quantum Design - -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at - -# http://www.apache.org/licenses/LICENSE-2.0 - -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -from pathlib import Path - -import typer - -from .AnalogCircuitAST import parse_analog - -######################################################################################## - -app = typer.Typer() - - -@app.command() -def main( - input_file: Path = typer.Option(None, "-i", "--input", help="Input file"), - output_file: Path = typer.Option(None, "-o", "--output", help="Output file"), -): - with open(input_file, encoding="utf-8") as f: - source = f.read() - - circuit = parse_analog(source) - tree = circuit.model_dump_json(indent=2, serialize_as_any=True) - - with open(output_file, "w") as f: - f.write(tree) - - -if __name__ == "__main__": - app() diff --git a/src/oqd_core/frontend/analog/serialize.py b/src/oqd_core/frontend/analog/serialize.py index c551d7a5..1083dc6e 100644 --- a/src/oqd_core/frontend/analog/serialize.py +++ b/src/oqd_core/frontend/analog/serialize.py @@ -1,6 +1,6 @@ # Copyright 2024-2025 Open Quantum Design -# Licensed under the Apache License, Version 2.0 (the "License"); +# Licensed under the Apache License, Version 2.0 (the "License") # you may not use this file except in compliance with the License. # You may obtain a copy of the License at @@ -14,6 +14,8 @@ from __future__ import annotations +import re + from oqd_compiler_infrastructure import ConversionRule, Post from oqd_core.interface.analog import ( @@ -76,7 +78,7 @@ def generic_map(self, model, operands): def map_AnalogCircuit(self, model: AnalogCircuit, operands): statements = operands["statements"] - return ";\n".join(statements) + ";\n" + return "\n".join(statements) + "\n" ## Statements ## @@ -84,14 +86,14 @@ def map_Declaration(self, model: Declaration, operands): return f"{operands['name']} = {operands['value']}" def map_While(self, model: While, operands): - body = ";\n".join(operands["body"]) + ";\n" + body = "\n".join(operands["body"]) + "\n" return f"while ({operands['condition']}) {{\n{body}}}" def map_IfElse(self, model: IfElse, operands): - then_branch = ";\n".join(operands["then_branch"]) + ";\n" + then_branch = "\n".join(operands["then_branch"]) else_branch = operands["else_branch"] if else_branch: - else_branch = ";\n".join(else_branch) + ";\n" + else_branch = "\n".join(else_branch) return f"if ({operands['condition']}) {{\n{then_branch}\n}} else {{\n{else_branch}\n}}" return f"if ({operands['condition']}) {{\n{then_branch}\n}}" @@ -138,6 +140,8 @@ def map_MathNum(self, model: MathNum, operands): value = str(int(model.value)) if isinstance(model.value, (int, float)): value = str(model.value) + if 'e' in value: + value = re.sub(r'e([+-]?)0+(\d)', r'e\1\2', value) return value def map_MathImag(self, model: MathImag, operands): diff --git a/src/oqd_core/frontend/atomic/AtomicCircuitAST.py b/src/oqd_core/frontend/atomic/AtomicCircuitAST.py index 17929389..20e348ea 100644 --- a/src/oqd_core/frontend/atomic/AtomicCircuitAST.py +++ b/src/oqd_core/frontend/atomic/AtomicCircuitAST.py @@ -270,6 +270,8 @@ def visitMath_terminal(self, ctx: AtomicParser.Math_terminalContext): return self.visit(ctx.fexpr()) if ctx.atomic_list() is not None: return self.visit(ctx.atomic_list()) + if ctx.atomic_list_extract() is not None: + return self.visit(ctx.atomic_list_extract()) raise ValueError("Empty math_terminal") ## Arithmetic Expressions ## diff --git a/src/oqd_core/frontend/atomic/AtomicLexer.interp b/src/oqd_core/frontend/atomic/AtomicLexer.interp index f7d7cdaf..a44538a6 100644 --- a/src/oqd_core/frontend/atomic/AtomicLexer.interp +++ b/src/oqd_core/frontend/atomic/AtomicLexer.interp @@ -227,4 +227,4 @@ mode names: DEFAULT_MODE atn: -[4, 0, 69, 509, 6, -1, 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, 1, 0, 4, 0, 153, 8, 0, 11, 0, 12, 0, 154, 1, 0, 1, 0, 1, 1, 1, 1, 5, 1, 161, 8, 1, 10, 1, 12, 1, 164, 9, 1, 1, 1, 4, 1, 167, 8, 1, 11, 1, 12, 1, 168, 3, 1, 171, 8, 1, 1, 2, 4, 2, 174, 8, 2, 11, 2, 12, 2, 175, 1, 2, 1, 2, 1, 3, 1, 3, 1, 3, 1, 3, 5, 3, 184, 8, 3, 10, 3, 12, 3, 187, 9, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 5, 1, 5, 1, 5, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 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, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 15, 1, 15, 1, 15, 1, 15, 1, 16, 1, 16, 1, 16, 1, 17, 1, 17, 1, 17, 1, 18, 1, 18, 1, 18, 1, 19, 1, 19, 1, 19, 1, 19, 1, 20, 1, 20, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 23, 1, 23, 1, 24, 1, 24, 1, 25, 1, 25, 1, 26, 1, 26, 1, 27, 1, 27, 1, 28, 1, 28, 1, 29, 1, 29, 1, 30, 1, 30, 1, 31, 1, 31, 1, 32, 1, 32, 1, 33, 1, 33, 1, 34, 1, 34, 1, 35, 1, 35, 1, 36, 1, 36, 1, 37, 1, 37, 1, 38, 1, 38, 1, 38, 1, 39, 1, 39, 1, 39, 1, 40, 1, 40, 1, 41, 1, 41, 1, 41, 1, 42, 1, 42, 1, 43, 1, 43, 1, 43, 1, 44, 1, 44, 1, 45, 1, 45, 1, 46, 1, 46, 3, 46, 340, 8, 46, 1, 47, 4, 47, 343, 8, 47, 11, 47, 12, 47, 344, 1, 48, 1, 48, 1, 48, 3, 48, 350, 8, 48, 3, 48, 352, 8, 48, 1, 49, 3, 49, 355, 8, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 3, 49, 362, 8, 49, 1, 49, 3, 49, 365, 8, 49, 1, 49, 1, 49, 1, 49, 3, 49, 370, 8, 49, 1, 49, 1, 49, 1, 49, 3, 49, 375, 8, 49, 1, 49, 3, 49, 378, 8, 49, 1, 49, 1, 49, 1, 49, 1, 49, 3, 49, 384, 8, 49, 1, 49, 1, 49, 3, 49, 388, 8, 49, 1, 50, 1, 50, 1, 50, 1, 51, 1, 51, 1, 51, 1, 52, 1, 52, 1, 52, 1, 52, 1, 53, 1, 53, 1, 53, 1, 53, 1, 54, 1, 54, 1, 54, 1, 54, 1, 55, 1, 55, 1, 55, 1, 55, 1, 56, 1, 56, 1, 56, 1, 56, 1, 57, 1, 57, 1, 57, 1, 57, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 72, 1, 72, 1, 73, 1, 73, 1, 74, 1, 74, 5, 74, 505, 8, 74, 10, 74, 12, 74, 508, 9, 74, 0, 0, 75, 1, 1, 3, 2, 5, 3, 7, 4, 9, 5, 11, 6, 13, 7, 15, 8, 17, 9, 19, 10, 21, 11, 23, 12, 25, 13, 27, 14, 29, 15, 31, 16, 33, 17, 35, 18, 37, 19, 39, 20, 41, 21, 43, 22, 45, 23, 47, 24, 49, 25, 51, 26, 53, 27, 55, 28, 57, 29, 59, 30, 61, 31, 63, 32, 65, 33, 67, 34, 69, 35, 71, 36, 73, 37, 75, 38, 77, 39, 79, 40, 81, 41, 83, 42, 85, 43, 87, 44, 89, 0, 91, 0, 93, 0, 95, 0, 97, 45, 99, 46, 101, 47, 103, 48, 105, 49, 107, 50, 109, 51, 111, 52, 113, 53, 115, 54, 117, 55, 119, 56, 121, 57, 123, 58, 125, 59, 127, 60, 129, 61, 131, 62, 133, 63, 135, 64, 137, 65, 139, 66, 141, 67, 143, 68, 145, 0, 147, 0, 149, 69, 1, 0, 6, 2, 0, 9, 9, 32, 32, 2, 0, 10, 10, 13, 13, 1, 0, 49, 57, 2, 0, 69, 69, 101, 101, 3, 0, 65, 90, 95, 95, 97, 122, 4, 0, 48, 57, 65, 90, 95, 95, 97, 122, 525, 0, 1, 1, 0, 0, 0, 0, 3, 1, 0, 0, 0, 0, 5, 1, 0, 0, 0, 0, 7, 1, 0, 0, 0, 0, 9, 1, 0, 0, 0, 0, 11, 1, 0, 0, 0, 0, 13, 1, 0, 0, 0, 0, 15, 1, 0, 0, 0, 0, 17, 1, 0, 0, 0, 0, 19, 1, 0, 0, 0, 0, 21, 1, 0, 0, 0, 0, 23, 1, 0, 0, 0, 0, 25, 1, 0, 0, 0, 0, 27, 1, 0, 0, 0, 0, 29, 1, 0, 0, 0, 0, 31, 1, 0, 0, 0, 0, 33, 1, 0, 0, 0, 0, 35, 1, 0, 0, 0, 0, 37, 1, 0, 0, 0, 0, 39, 1, 0, 0, 0, 0, 41, 1, 0, 0, 0, 0, 43, 1, 0, 0, 0, 0, 45, 1, 0, 0, 0, 0, 47, 1, 0, 0, 0, 0, 49, 1, 0, 0, 0, 0, 51, 1, 0, 0, 0, 0, 53, 1, 0, 0, 0, 0, 55, 1, 0, 0, 0, 0, 57, 1, 0, 0, 0, 0, 59, 1, 0, 0, 0, 0, 61, 1, 0, 0, 0, 0, 63, 1, 0, 0, 0, 0, 65, 1, 0, 0, 0, 0, 67, 1, 0, 0, 0, 0, 69, 1, 0, 0, 0, 0, 71, 1, 0, 0, 0, 0, 73, 1, 0, 0, 0, 0, 75, 1, 0, 0, 0, 0, 77, 1, 0, 0, 0, 0, 79, 1, 0, 0, 0, 0, 81, 1, 0, 0, 0, 0, 83, 1, 0, 0, 0, 0, 85, 1, 0, 0, 0, 0, 87, 1, 0, 0, 0, 0, 97, 1, 0, 0, 0, 0, 99, 1, 0, 0, 0, 0, 101, 1, 0, 0, 0, 0, 103, 1, 0, 0, 0, 0, 105, 1, 0, 0, 0, 0, 107, 1, 0, 0, 0, 0, 109, 1, 0, 0, 0, 0, 111, 1, 0, 0, 0, 0, 113, 1, 0, 0, 0, 0, 115, 1, 0, 0, 0, 0, 117, 1, 0, 0, 0, 0, 119, 1, 0, 0, 0, 0, 121, 1, 0, 0, 0, 0, 123, 1, 0, 0, 0, 0, 125, 1, 0, 0, 0, 0, 127, 1, 0, 0, 0, 0, 129, 1, 0, 0, 0, 0, 131, 1, 0, 0, 0, 0, 133, 1, 0, 0, 0, 0, 135, 1, 0, 0, 0, 0, 137, 1, 0, 0, 0, 0, 139, 1, 0, 0, 0, 0, 141, 1, 0, 0, 0, 0, 143, 1, 0, 0, 0, 0, 149, 1, 0, 0, 0, 1, 152, 1, 0, 0, 0, 3, 170, 1, 0, 0, 0, 5, 173, 1, 0, 0, 0, 7, 179, 1, 0, 0, 0, 9, 192, 1, 0, 0, 0, 11, 201, 1, 0, 0, 0, 13, 204, 1, 0, 0, 0, 15, 209, 1, 0, 0, 0, 17, 215, 1, 0, 0, 0, 19, 220, 1, 0, 0, 0, 21, 224, 1, 0, 0, 0, 23, 230, 1, 0, 0, 0, 25, 239, 1, 0, 0, 0, 27, 246, 1, 0, 0, 0, 29, 251, 1, 0, 0, 0, 31, 257, 1, 0, 0, 0, 33, 261, 1, 0, 0, 0, 35, 264, 1, 0, 0, 0, 37, 267, 1, 0, 0, 0, 39, 270, 1, 0, 0, 0, 41, 274, 1, 0, 0, 0, 43, 276, 1, 0, 0, 0, 45, 281, 1, 0, 0, 0, 47, 287, 1, 0, 0, 0, 49, 289, 1, 0, 0, 0, 51, 291, 1, 0, 0, 0, 53, 293, 1, 0, 0, 0, 55, 295, 1, 0, 0, 0, 57, 297, 1, 0, 0, 0, 59, 299, 1, 0, 0, 0, 61, 301, 1, 0, 0, 0, 63, 303, 1, 0, 0, 0, 65, 305, 1, 0, 0, 0, 67, 307, 1, 0, 0, 0, 69, 309, 1, 0, 0, 0, 71, 311, 1, 0, 0, 0, 73, 313, 1, 0, 0, 0, 75, 315, 1, 0, 0, 0, 77, 317, 1, 0, 0, 0, 79, 320, 1, 0, 0, 0, 81, 323, 1, 0, 0, 0, 83, 325, 1, 0, 0, 0, 85, 328, 1, 0, 0, 0, 87, 330, 1, 0, 0, 0, 89, 333, 1, 0, 0, 0, 91, 335, 1, 0, 0, 0, 93, 339, 1, 0, 0, 0, 95, 342, 1, 0, 0, 0, 97, 351, 1, 0, 0, 0, 99, 387, 1, 0, 0, 0, 101, 389, 1, 0, 0, 0, 103, 392, 1, 0, 0, 0, 105, 395, 1, 0, 0, 0, 107, 399, 1, 0, 0, 0, 109, 403, 1, 0, 0, 0, 111, 407, 1, 0, 0, 0, 113, 411, 1, 0, 0, 0, 115, 415, 1, 0, 0, 0, 117, 419, 1, 0, 0, 0, 119, 424, 1, 0, 0, 0, 121, 429, 1, 0, 0, 0, 123, 434, 1, 0, 0, 0, 125, 439, 1, 0, 0, 0, 127, 444, 1, 0, 0, 0, 129, 449, 1, 0, 0, 0, 131, 455, 1, 0, 0, 0, 133, 461, 1, 0, 0, 0, 135, 467, 1, 0, 0, 0, 137, 477, 1, 0, 0, 0, 139, 482, 1, 0, 0, 0, 141, 487, 1, 0, 0, 0, 143, 492, 1, 0, 0, 0, 145, 498, 1, 0, 0, 0, 147, 500, 1, 0, 0, 0, 149, 502, 1, 0, 0, 0, 151, 153, 7, 0, 0, 0, 152, 151, 1, 0, 0, 0, 153, 154, 1, 0, 0, 0, 154, 152, 1, 0, 0, 0, 154, 155, 1, 0, 0, 0, 155, 156, 1, 0, 0, 0, 156, 157, 6, 0, 0, 0, 157, 2, 1, 0, 0, 0, 158, 162, 5, 59, 0, 0, 159, 161, 7, 1, 0, 0, 160, 159, 1, 0, 0, 0, 161, 164, 1, 0, 0, 0, 162, 160, 1, 0, 0, 0, 162, 163, 1, 0, 0, 0, 163, 171, 1, 0, 0, 0, 164, 162, 1, 0, 0, 0, 165, 167, 7, 1, 0, 0, 166, 165, 1, 0, 0, 0, 167, 168, 1, 0, 0, 0, 168, 166, 1, 0, 0, 0, 168, 169, 1, 0, 0, 0, 169, 171, 1, 0, 0, 0, 170, 158, 1, 0, 0, 0, 170, 166, 1, 0, 0, 0, 171, 4, 1, 0, 0, 0, 172, 174, 7, 1, 0, 0, 173, 172, 1, 0, 0, 0, 174, 175, 1, 0, 0, 0, 175, 173, 1, 0, 0, 0, 175, 176, 1, 0, 0, 0, 176, 177, 1, 0, 0, 0, 177, 178, 6, 2, 0, 0, 178, 6, 1, 0, 0, 0, 179, 180, 5, 47, 0, 0, 180, 181, 5, 47, 0, 0, 181, 185, 1, 0, 0, 0, 182, 184, 8, 1, 0, 0, 183, 182, 1, 0, 0, 0, 184, 187, 1, 0, 0, 0, 185, 183, 1, 0, 0, 0, 185, 186, 1, 0, 0, 0, 186, 188, 1, 0, 0, 0, 187, 185, 1, 0, 0, 0, 188, 189, 3, 5, 2, 0, 189, 190, 1, 0, 0, 0, 190, 191, 6, 3, 1, 0, 191, 8, 1, 0, 0, 0, 192, 193, 5, 112, 0, 0, 193, 194, 5, 97, 0, 0, 194, 195, 5, 114, 0, 0, 195, 196, 5, 97, 0, 0, 196, 197, 5, 108, 0, 0, 197, 198, 5, 108, 0, 0, 198, 199, 5, 101, 0, 0, 199, 200, 5, 108, 0, 0, 200, 10, 1, 0, 0, 0, 201, 202, 5, 105, 0, 0, 202, 203, 5, 102, 0, 0, 203, 12, 1, 0, 0, 0, 204, 205, 5, 101, 0, 0, 205, 206, 5, 108, 0, 0, 206, 207, 5, 115, 0, 0, 207, 208, 5, 101, 0, 0, 208, 14, 1, 0, 0, 0, 209, 210, 5, 119, 0, 0, 210, 211, 5, 104, 0, 0, 211, 212, 5, 105, 0, 0, 212, 213, 5, 108, 0, 0, 213, 214, 5, 101, 0, 0, 214, 16, 1, 0, 0, 0, 215, 216, 5, 119, 0, 0, 216, 217, 5, 105, 0, 0, 217, 218, 5, 116, 0, 0, 218, 219, 5, 104, 0, 0, 219, 18, 1, 0, 0, 0, 220, 221, 5, 102, 0, 0, 221, 222, 5, 111, 0, 0, 222, 223, 5, 114, 0, 0, 223, 20, 1, 0, 0, 0, 224, 225, 5, 98, 0, 0, 225, 226, 5, 114, 0, 0, 226, 227, 5, 101, 0, 0, 227, 228, 5, 97, 0, 0, 228, 229, 5, 107, 0, 0, 229, 22, 1, 0, 0, 0, 230, 231, 5, 99, 0, 0, 231, 232, 5, 111, 0, 0, 232, 233, 5, 110, 0, 0, 233, 234, 5, 116, 0, 0, 234, 235, 5, 105, 0, 0, 235, 236, 5, 110, 0, 0, 236, 237, 5, 117, 0, 0, 237, 238, 5, 101, 0, 0, 238, 24, 1, 0, 0, 0, 239, 240, 5, 105, 0, 0, 240, 241, 5, 111, 0, 0, 241, 242, 5, 110, 0, 0, 242, 243, 5, 114, 0, 0, 243, 244, 5, 101, 0, 0, 244, 245, 5, 103, 0, 0, 245, 26, 1, 0, 0, 0, 246, 247, 5, 98, 0, 0, 247, 248, 5, 101, 0, 0, 248, 249, 5, 97, 0, 0, 249, 250, 5, 109, 0, 0, 250, 28, 1, 0, 0, 0, 251, 252, 5, 112, 0, 0, 252, 253, 5, 117, 0, 0, 253, 254, 5, 108, 0, 0, 254, 255, 5, 115, 0, 0, 255, 256, 5, 101, 0, 0, 256, 30, 1, 0, 0, 0, 257, 258, 5, 97, 0, 0, 258, 259, 5, 110, 0, 0, 259, 260, 5, 100, 0, 0, 260, 32, 1, 0, 0, 0, 261, 262, 5, 38, 0, 0, 262, 263, 5, 38, 0, 0, 263, 34, 1, 0, 0, 0, 264, 265, 5, 111, 0, 0, 265, 266, 5, 114, 0, 0, 266, 36, 1, 0, 0, 0, 267, 268, 5, 124, 0, 0, 268, 269, 5, 124, 0, 0, 269, 38, 1, 0, 0, 0, 270, 271, 5, 110, 0, 0, 271, 272, 5, 111, 0, 0, 272, 273, 5, 116, 0, 0, 273, 40, 1, 0, 0, 0, 274, 275, 5, 33, 0, 0, 275, 42, 1, 0, 0, 0, 276, 277, 5, 116, 0, 0, 277, 278, 5, 114, 0, 0, 278, 279, 5, 117, 0, 0, 279, 280, 5, 101, 0, 0, 280, 44, 1, 0, 0, 0, 281, 282, 5, 102, 0, 0, 282, 283, 5, 97, 0, 0, 283, 284, 5, 108, 0, 0, 284, 285, 5, 115, 0, 0, 285, 286, 5, 101, 0, 0, 286, 46, 1, 0, 0, 0, 287, 288, 5, 58, 0, 0, 288, 48, 1, 0, 0, 0, 289, 290, 5, 59, 0, 0, 290, 50, 1, 0, 0, 0, 291, 292, 5, 44, 0, 0, 292, 52, 1, 0, 0, 0, 293, 294, 5, 40, 0, 0, 294, 54, 1, 0, 0, 0, 295, 296, 5, 41, 0, 0, 296, 56, 1, 0, 0, 0, 297, 298, 5, 91, 0, 0, 298, 58, 1, 0, 0, 0, 299, 300, 5, 93, 0, 0, 300, 60, 1, 0, 0, 0, 301, 302, 5, 123, 0, 0, 302, 62, 1, 0, 0, 0, 303, 304, 5, 125, 0, 0, 304, 64, 1, 0, 0, 0, 305, 306, 5, 42, 0, 0, 306, 66, 1, 0, 0, 0, 307, 308, 5, 47, 0, 0, 308, 68, 1, 0, 0, 0, 309, 310, 5, 43, 0, 0, 310, 70, 1, 0, 0, 0, 311, 312, 5, 45, 0, 0, 312, 72, 1, 0, 0, 0, 313, 314, 5, 94, 0, 0, 314, 74, 1, 0, 0, 0, 315, 316, 5, 61, 0, 0, 316, 76, 1, 0, 0, 0, 317, 318, 5, 61, 0, 0, 318, 319, 5, 61, 0, 0, 319, 78, 1, 0, 0, 0, 320, 321, 5, 33, 0, 0, 321, 322, 5, 61, 0, 0, 322, 80, 1, 0, 0, 0, 323, 324, 5, 60, 0, 0, 324, 82, 1, 0, 0, 0, 325, 326, 5, 60, 0, 0, 326, 327, 5, 61, 0, 0, 327, 84, 1, 0, 0, 0, 328, 329, 5, 62, 0, 0, 329, 86, 1, 0, 0, 0, 330, 331, 5, 62, 0, 0, 331, 332, 5, 61, 0, 0, 332, 88, 1, 0, 0, 0, 333, 334, 7, 2, 0, 0, 334, 90, 1, 0, 0, 0, 335, 336, 5, 48, 0, 0, 336, 92, 1, 0, 0, 0, 337, 340, 3, 91, 45, 0, 338, 340, 3, 89, 44, 0, 339, 337, 1, 0, 0, 0, 339, 338, 1, 0, 0, 0, 340, 94, 1, 0, 0, 0, 341, 343, 3, 93, 46, 0, 342, 341, 1, 0, 0, 0, 343, 344, 1, 0, 0, 0, 344, 342, 1, 0, 0, 0, 344, 345, 1, 0, 0, 0, 345, 96, 1, 0, 0, 0, 346, 352, 3, 91, 45, 0, 347, 349, 3, 89, 44, 0, 348, 350, 3, 95, 47, 0, 349, 348, 1, 0, 0, 0, 349, 350, 1, 0, 0, 0, 350, 352, 1, 0, 0, 0, 351, 346, 1, 0, 0, 0, 351, 347, 1, 0, 0, 0, 352, 98, 1, 0, 0, 0, 353, 355, 3, 97, 48, 0, 354, 353, 1, 0, 0, 0, 354, 355, 1, 0, 0, 0, 355, 356, 1, 0, 0, 0, 356, 357, 5, 46, 0, 0, 357, 364, 3, 95, 47, 0, 358, 361, 7, 3, 0, 0, 359, 362, 3, 69, 34, 0, 360, 362, 3, 71, 35, 0, 361, 359, 1, 0, 0, 0, 361, 360, 1, 0, 0, 0, 361, 362, 1, 0, 0, 0, 362, 363, 1, 0, 0, 0, 363, 365, 3, 97, 48, 0, 364, 358, 1, 0, 0, 0, 364, 365, 1, 0, 0, 0, 365, 388, 1, 0, 0, 0, 366, 367, 3, 97, 48, 0, 367, 369, 5, 46, 0, 0, 368, 370, 3, 95, 47, 0, 369, 368, 1, 0, 0, 0, 369, 370, 1, 0, 0, 0, 370, 377, 1, 0, 0, 0, 371, 374, 7, 3, 0, 0, 372, 375, 3, 69, 34, 0, 373, 375, 3, 71, 35, 0, 374, 372, 1, 0, 0, 0, 374, 373, 1, 0, 0, 0, 374, 375, 1, 0, 0, 0, 375, 376, 1, 0, 0, 0, 376, 378, 3, 97, 48, 0, 377, 371, 1, 0, 0, 0, 377, 378, 1, 0, 0, 0, 378, 388, 1, 0, 0, 0, 379, 380, 3, 97, 48, 0, 380, 383, 7, 3, 0, 0, 381, 384, 3, 69, 34, 0, 382, 384, 3, 71, 35, 0, 383, 381, 1, 0, 0, 0, 383, 382, 1, 0, 0, 0, 383, 384, 1, 0, 0, 0, 384, 385, 1, 0, 0, 0, 385, 386, 3, 97, 48, 0, 386, 388, 1, 0, 0, 0, 387, 354, 1, 0, 0, 0, 387, 366, 1, 0, 0, 0, 387, 379, 1, 0, 0, 0, 388, 100, 1, 0, 0, 0, 389, 390, 5, 35, 0, 0, 390, 391, 3, 149, 74, 0, 391, 102, 1, 0, 0, 0, 392, 393, 5, 49, 0, 0, 393, 394, 5, 106, 0, 0, 394, 104, 1, 0, 0, 0, 395, 396, 5, 97, 0, 0, 396, 397, 5, 98, 0, 0, 397, 398, 5, 115, 0, 0, 398, 106, 1, 0, 0, 0, 399, 400, 5, 115, 0, 0, 400, 401, 5, 105, 0, 0, 401, 402, 5, 110, 0, 0, 402, 108, 1, 0, 0, 0, 403, 404, 5, 99, 0, 0, 404, 405, 5, 111, 0, 0, 405, 406, 5, 115, 0, 0, 406, 110, 1, 0, 0, 0, 407, 408, 5, 116, 0, 0, 408, 409, 5, 97, 0, 0, 409, 410, 5, 110, 0, 0, 410, 112, 1, 0, 0, 0, 411, 412, 5, 101, 0, 0, 412, 413, 5, 120, 0, 0, 413, 414, 5, 112, 0, 0, 414, 114, 1, 0, 0, 0, 415, 416, 5, 108, 0, 0, 416, 417, 5, 111, 0, 0, 417, 418, 5, 103, 0, 0, 418, 116, 1, 0, 0, 0, 419, 420, 5, 115, 0, 0, 420, 421, 5, 105, 0, 0, 421, 422, 5, 110, 0, 0, 422, 423, 5, 104, 0, 0, 423, 118, 1, 0, 0, 0, 424, 425, 5, 99, 0, 0, 425, 426, 5, 111, 0, 0, 426, 427, 5, 115, 0, 0, 427, 428, 5, 104, 0, 0, 428, 120, 1, 0, 0, 0, 429, 430, 5, 116, 0, 0, 430, 431, 5, 97, 0, 0, 431, 432, 5, 110, 0, 0, 432, 433, 5, 104, 0, 0, 433, 122, 1, 0, 0, 0, 434, 435, 5, 97, 0, 0, 435, 436, 5, 116, 0, 0, 436, 437, 5, 97, 0, 0, 437, 438, 5, 110, 0, 0, 438, 124, 1, 0, 0, 0, 439, 440, 5, 97, 0, 0, 440, 441, 5, 99, 0, 0, 441, 442, 5, 111, 0, 0, 442, 443, 5, 115, 0, 0, 443, 126, 1, 0, 0, 0, 444, 445, 5, 97, 0, 0, 445, 446, 5, 115, 0, 0, 446, 447, 5, 105, 0, 0, 447, 448, 5, 110, 0, 0, 448, 128, 1, 0, 0, 0, 449, 450, 5, 97, 0, 0, 450, 451, 5, 116, 0, 0, 451, 452, 5, 97, 0, 0, 452, 453, 5, 110, 0, 0, 453, 454, 5, 104, 0, 0, 454, 130, 1, 0, 0, 0, 455, 456, 5, 97, 0, 0, 456, 457, 5, 115, 0, 0, 457, 458, 5, 105, 0, 0, 458, 459, 5, 110, 0, 0, 459, 460, 5, 104, 0, 0, 460, 132, 1, 0, 0, 0, 461, 462, 5, 97, 0, 0, 462, 463, 5, 99, 0, 0, 463, 464, 5, 111, 0, 0, 464, 465, 5, 115, 0, 0, 465, 466, 5, 104, 0, 0, 466, 134, 1, 0, 0, 0, 467, 468, 5, 104, 0, 0, 468, 469, 5, 101, 0, 0, 469, 470, 5, 97, 0, 0, 470, 471, 5, 118, 0, 0, 471, 472, 5, 105, 0, 0, 472, 473, 5, 115, 0, 0, 473, 474, 5, 105, 0, 0, 474, 475, 5, 100, 0, 0, 475, 476, 5, 101, 0, 0, 476, 136, 1, 0, 0, 0, 477, 478, 5, 99, 0, 0, 478, 479, 5, 111, 0, 0, 479, 480, 5, 110, 0, 0, 480, 481, 5, 106, 0, 0, 481, 138, 1, 0, 0, 0, 482, 483, 5, 114, 0, 0, 483, 484, 5, 101, 0, 0, 484, 485, 5, 97, 0, 0, 485, 486, 5, 108, 0, 0, 486, 140, 1, 0, 0, 0, 487, 488, 5, 105, 0, 0, 488, 489, 5, 109, 0, 0, 489, 490, 5, 97, 0, 0, 490, 491, 5, 103, 0, 0, 491, 142, 1, 0, 0, 0, 492, 493, 5, 97, 0, 0, 493, 494, 5, 116, 0, 0, 494, 495, 5, 97, 0, 0, 495, 496, 5, 110, 0, 0, 496, 497, 5, 50, 0, 0, 497, 144, 1, 0, 0, 0, 498, 499, 7, 4, 0, 0, 499, 146, 1, 0, 0, 0, 500, 501, 7, 5, 0, 0, 501, 148, 1, 0, 0, 0, 502, 506, 3, 145, 72, 0, 503, 505, 3, 147, 73, 0, 504, 503, 1, 0, 0, 0, 505, 508, 1, 0, 0, 0, 506, 504, 1, 0, 0, 0, 506, 507, 1, 0, 0, 0, 507, 150, 1, 0, 0, 0, 508, 506, 1, 0, 0, 0, 20, 0, 154, 162, 168, 170, 175, 185, 339, 344, 349, 351, 354, 361, 364, 369, 374, 377, 383, 387, 506, 2, 0, 1, 0, 6, 0, 0] \ No newline at end of file +[4, 0, 69, 503, 6, -1, 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, 1, 0, 4, 0, 153, 8, 0, 11, 0, 12, 0, 154, 1, 0, 1, 0, 1, 1, 4, 1, 160, 8, 1, 11, 1, 12, 1, 161, 1, 1, 3, 1, 165, 8, 1, 1, 2, 4, 2, 168, 8, 2, 11, 2, 12, 2, 169, 1, 2, 1, 2, 1, 3, 1, 3, 1, 3, 1, 3, 5, 3, 178, 8, 3, 10, 3, 12, 3, 181, 9, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 5, 1, 5, 1, 5, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 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, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 15, 1, 15, 1, 15, 1, 15, 1, 16, 1, 16, 1, 16, 1, 17, 1, 17, 1, 17, 1, 18, 1, 18, 1, 18, 1, 19, 1, 19, 1, 19, 1, 19, 1, 20, 1, 20, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 23, 1, 23, 1, 24, 1, 24, 1, 25, 1, 25, 1, 26, 1, 26, 1, 27, 1, 27, 1, 28, 1, 28, 1, 29, 1, 29, 1, 30, 1, 30, 1, 31, 1, 31, 1, 32, 1, 32, 1, 33, 1, 33, 1, 34, 1, 34, 1, 35, 1, 35, 1, 36, 1, 36, 1, 37, 1, 37, 1, 38, 1, 38, 1, 38, 1, 39, 1, 39, 1, 39, 1, 40, 1, 40, 1, 41, 1, 41, 1, 41, 1, 42, 1, 42, 1, 43, 1, 43, 1, 43, 1, 44, 1, 44, 1, 45, 1, 45, 1, 46, 1, 46, 3, 46, 334, 8, 46, 1, 47, 4, 47, 337, 8, 47, 11, 47, 12, 47, 338, 1, 48, 1, 48, 1, 48, 3, 48, 344, 8, 48, 3, 48, 346, 8, 48, 1, 49, 3, 49, 349, 8, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 3, 49, 356, 8, 49, 1, 49, 3, 49, 359, 8, 49, 1, 49, 1, 49, 1, 49, 3, 49, 364, 8, 49, 1, 49, 1, 49, 1, 49, 3, 49, 369, 8, 49, 1, 49, 3, 49, 372, 8, 49, 1, 49, 1, 49, 1, 49, 1, 49, 3, 49, 378, 8, 49, 1, 49, 1, 49, 3, 49, 382, 8, 49, 1, 50, 1, 50, 1, 50, 1, 51, 1, 51, 1, 51, 1, 52, 1, 52, 1, 52, 1, 52, 1, 53, 1, 53, 1, 53, 1, 53, 1, 54, 1, 54, 1, 54, 1, 54, 1, 55, 1, 55, 1, 55, 1, 55, 1, 56, 1, 56, 1, 56, 1, 56, 1, 57, 1, 57, 1, 57, 1, 57, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 72, 1, 72, 1, 73, 1, 73, 1, 74, 1, 74, 5, 74, 499, 8, 74, 10, 74, 12, 74, 502, 9, 74, 0, 0, 75, 1, 1, 3, 2, 5, 3, 7, 4, 9, 5, 11, 6, 13, 7, 15, 8, 17, 9, 19, 10, 21, 11, 23, 12, 25, 13, 27, 14, 29, 15, 31, 16, 33, 17, 35, 18, 37, 19, 39, 20, 41, 21, 43, 22, 45, 23, 47, 24, 49, 25, 51, 26, 53, 27, 55, 28, 57, 29, 59, 30, 61, 31, 63, 32, 65, 33, 67, 34, 69, 35, 71, 36, 73, 37, 75, 38, 77, 39, 79, 40, 81, 41, 83, 42, 85, 43, 87, 44, 89, 0, 91, 0, 93, 0, 95, 0, 97, 45, 99, 46, 101, 47, 103, 48, 105, 49, 107, 50, 109, 51, 111, 52, 113, 53, 115, 54, 117, 55, 119, 56, 121, 57, 123, 58, 125, 59, 127, 60, 129, 61, 131, 62, 133, 63, 135, 64, 137, 65, 139, 66, 141, 67, 143, 68, 145, 0, 147, 0, 149, 69, 1, 0, 6, 2, 0, 9, 9, 32, 32, 2, 0, 10, 10, 13, 13, 1, 0, 49, 57, 2, 0, 69, 69, 101, 101, 3, 0, 65, 90, 95, 95, 97, 122, 4, 0, 48, 57, 65, 90, 95, 95, 97, 122, 518, 0, 1, 1, 0, 0, 0, 0, 3, 1, 0, 0, 0, 0, 5, 1, 0, 0, 0, 0, 7, 1, 0, 0, 0, 0, 9, 1, 0, 0, 0, 0, 11, 1, 0, 0, 0, 0, 13, 1, 0, 0, 0, 0, 15, 1, 0, 0, 0, 0, 17, 1, 0, 0, 0, 0, 19, 1, 0, 0, 0, 0, 21, 1, 0, 0, 0, 0, 23, 1, 0, 0, 0, 0, 25, 1, 0, 0, 0, 0, 27, 1, 0, 0, 0, 0, 29, 1, 0, 0, 0, 0, 31, 1, 0, 0, 0, 0, 33, 1, 0, 0, 0, 0, 35, 1, 0, 0, 0, 0, 37, 1, 0, 0, 0, 0, 39, 1, 0, 0, 0, 0, 41, 1, 0, 0, 0, 0, 43, 1, 0, 0, 0, 0, 45, 1, 0, 0, 0, 0, 47, 1, 0, 0, 0, 0, 49, 1, 0, 0, 0, 0, 51, 1, 0, 0, 0, 0, 53, 1, 0, 0, 0, 0, 55, 1, 0, 0, 0, 0, 57, 1, 0, 0, 0, 0, 59, 1, 0, 0, 0, 0, 61, 1, 0, 0, 0, 0, 63, 1, 0, 0, 0, 0, 65, 1, 0, 0, 0, 0, 67, 1, 0, 0, 0, 0, 69, 1, 0, 0, 0, 0, 71, 1, 0, 0, 0, 0, 73, 1, 0, 0, 0, 0, 75, 1, 0, 0, 0, 0, 77, 1, 0, 0, 0, 0, 79, 1, 0, 0, 0, 0, 81, 1, 0, 0, 0, 0, 83, 1, 0, 0, 0, 0, 85, 1, 0, 0, 0, 0, 87, 1, 0, 0, 0, 0, 97, 1, 0, 0, 0, 0, 99, 1, 0, 0, 0, 0, 101, 1, 0, 0, 0, 0, 103, 1, 0, 0, 0, 0, 105, 1, 0, 0, 0, 0, 107, 1, 0, 0, 0, 0, 109, 1, 0, 0, 0, 0, 111, 1, 0, 0, 0, 0, 113, 1, 0, 0, 0, 0, 115, 1, 0, 0, 0, 0, 117, 1, 0, 0, 0, 0, 119, 1, 0, 0, 0, 0, 121, 1, 0, 0, 0, 0, 123, 1, 0, 0, 0, 0, 125, 1, 0, 0, 0, 0, 127, 1, 0, 0, 0, 0, 129, 1, 0, 0, 0, 0, 131, 1, 0, 0, 0, 0, 133, 1, 0, 0, 0, 0, 135, 1, 0, 0, 0, 0, 137, 1, 0, 0, 0, 0, 139, 1, 0, 0, 0, 0, 141, 1, 0, 0, 0, 0, 143, 1, 0, 0, 0, 0, 149, 1, 0, 0, 0, 1, 152, 1, 0, 0, 0, 3, 164, 1, 0, 0, 0, 5, 167, 1, 0, 0, 0, 7, 173, 1, 0, 0, 0, 9, 186, 1, 0, 0, 0, 11, 195, 1, 0, 0, 0, 13, 198, 1, 0, 0, 0, 15, 203, 1, 0, 0, 0, 17, 209, 1, 0, 0, 0, 19, 214, 1, 0, 0, 0, 21, 218, 1, 0, 0, 0, 23, 224, 1, 0, 0, 0, 25, 233, 1, 0, 0, 0, 27, 240, 1, 0, 0, 0, 29, 245, 1, 0, 0, 0, 31, 251, 1, 0, 0, 0, 33, 255, 1, 0, 0, 0, 35, 258, 1, 0, 0, 0, 37, 261, 1, 0, 0, 0, 39, 264, 1, 0, 0, 0, 41, 268, 1, 0, 0, 0, 43, 270, 1, 0, 0, 0, 45, 275, 1, 0, 0, 0, 47, 281, 1, 0, 0, 0, 49, 283, 1, 0, 0, 0, 51, 285, 1, 0, 0, 0, 53, 287, 1, 0, 0, 0, 55, 289, 1, 0, 0, 0, 57, 291, 1, 0, 0, 0, 59, 293, 1, 0, 0, 0, 61, 295, 1, 0, 0, 0, 63, 297, 1, 0, 0, 0, 65, 299, 1, 0, 0, 0, 67, 301, 1, 0, 0, 0, 69, 303, 1, 0, 0, 0, 71, 305, 1, 0, 0, 0, 73, 307, 1, 0, 0, 0, 75, 309, 1, 0, 0, 0, 77, 311, 1, 0, 0, 0, 79, 314, 1, 0, 0, 0, 81, 317, 1, 0, 0, 0, 83, 319, 1, 0, 0, 0, 85, 322, 1, 0, 0, 0, 87, 324, 1, 0, 0, 0, 89, 327, 1, 0, 0, 0, 91, 329, 1, 0, 0, 0, 93, 333, 1, 0, 0, 0, 95, 336, 1, 0, 0, 0, 97, 345, 1, 0, 0, 0, 99, 381, 1, 0, 0, 0, 101, 383, 1, 0, 0, 0, 103, 386, 1, 0, 0, 0, 105, 389, 1, 0, 0, 0, 107, 393, 1, 0, 0, 0, 109, 397, 1, 0, 0, 0, 111, 401, 1, 0, 0, 0, 113, 405, 1, 0, 0, 0, 115, 409, 1, 0, 0, 0, 117, 413, 1, 0, 0, 0, 119, 418, 1, 0, 0, 0, 121, 423, 1, 0, 0, 0, 123, 428, 1, 0, 0, 0, 125, 433, 1, 0, 0, 0, 127, 438, 1, 0, 0, 0, 129, 443, 1, 0, 0, 0, 131, 449, 1, 0, 0, 0, 133, 455, 1, 0, 0, 0, 135, 461, 1, 0, 0, 0, 137, 471, 1, 0, 0, 0, 139, 476, 1, 0, 0, 0, 141, 481, 1, 0, 0, 0, 143, 486, 1, 0, 0, 0, 145, 492, 1, 0, 0, 0, 147, 494, 1, 0, 0, 0, 149, 496, 1, 0, 0, 0, 151, 153, 7, 0, 0, 0, 152, 151, 1, 0, 0, 0, 153, 154, 1, 0, 0, 0, 154, 152, 1, 0, 0, 0, 154, 155, 1, 0, 0, 0, 155, 156, 1, 0, 0, 0, 156, 157, 6, 0, 0, 0, 157, 2, 1, 0, 0, 0, 158, 160, 7, 1, 0, 0, 159, 158, 1, 0, 0, 0, 160, 161, 1, 0, 0, 0, 161, 159, 1, 0, 0, 0, 161, 162, 1, 0, 0, 0, 162, 165, 1, 0, 0, 0, 163, 165, 3, 7, 3, 0, 164, 159, 1, 0, 0, 0, 164, 163, 1, 0, 0, 0, 165, 4, 1, 0, 0, 0, 166, 168, 7, 1, 0, 0, 167, 166, 1, 0, 0, 0, 168, 169, 1, 0, 0, 0, 169, 167, 1, 0, 0, 0, 169, 170, 1, 0, 0, 0, 170, 171, 1, 0, 0, 0, 171, 172, 6, 2, 0, 0, 172, 6, 1, 0, 0, 0, 173, 174, 5, 47, 0, 0, 174, 175, 5, 47, 0, 0, 175, 179, 1, 0, 0, 0, 176, 178, 8, 1, 0, 0, 177, 176, 1, 0, 0, 0, 178, 181, 1, 0, 0, 0, 179, 177, 1, 0, 0, 0, 179, 180, 1, 0, 0, 0, 180, 182, 1, 0, 0, 0, 181, 179, 1, 0, 0, 0, 182, 183, 3, 5, 2, 0, 183, 184, 1, 0, 0, 0, 184, 185, 6, 3, 1, 0, 185, 8, 1, 0, 0, 0, 186, 187, 5, 112, 0, 0, 187, 188, 5, 97, 0, 0, 188, 189, 5, 114, 0, 0, 189, 190, 5, 97, 0, 0, 190, 191, 5, 108, 0, 0, 191, 192, 5, 108, 0, 0, 192, 193, 5, 101, 0, 0, 193, 194, 5, 108, 0, 0, 194, 10, 1, 0, 0, 0, 195, 196, 5, 105, 0, 0, 196, 197, 5, 102, 0, 0, 197, 12, 1, 0, 0, 0, 198, 199, 5, 101, 0, 0, 199, 200, 5, 108, 0, 0, 200, 201, 5, 115, 0, 0, 201, 202, 5, 101, 0, 0, 202, 14, 1, 0, 0, 0, 203, 204, 5, 119, 0, 0, 204, 205, 5, 104, 0, 0, 205, 206, 5, 105, 0, 0, 206, 207, 5, 108, 0, 0, 207, 208, 5, 101, 0, 0, 208, 16, 1, 0, 0, 0, 209, 210, 5, 119, 0, 0, 210, 211, 5, 105, 0, 0, 211, 212, 5, 116, 0, 0, 212, 213, 5, 104, 0, 0, 213, 18, 1, 0, 0, 0, 214, 215, 5, 102, 0, 0, 215, 216, 5, 111, 0, 0, 216, 217, 5, 114, 0, 0, 217, 20, 1, 0, 0, 0, 218, 219, 5, 98, 0, 0, 219, 220, 5, 114, 0, 0, 220, 221, 5, 101, 0, 0, 221, 222, 5, 97, 0, 0, 222, 223, 5, 107, 0, 0, 223, 22, 1, 0, 0, 0, 224, 225, 5, 99, 0, 0, 225, 226, 5, 111, 0, 0, 226, 227, 5, 110, 0, 0, 227, 228, 5, 116, 0, 0, 228, 229, 5, 105, 0, 0, 229, 230, 5, 110, 0, 0, 230, 231, 5, 117, 0, 0, 231, 232, 5, 101, 0, 0, 232, 24, 1, 0, 0, 0, 233, 234, 5, 105, 0, 0, 234, 235, 5, 111, 0, 0, 235, 236, 5, 110, 0, 0, 236, 237, 5, 114, 0, 0, 237, 238, 5, 101, 0, 0, 238, 239, 5, 103, 0, 0, 239, 26, 1, 0, 0, 0, 240, 241, 5, 98, 0, 0, 241, 242, 5, 101, 0, 0, 242, 243, 5, 97, 0, 0, 243, 244, 5, 109, 0, 0, 244, 28, 1, 0, 0, 0, 245, 246, 5, 112, 0, 0, 246, 247, 5, 117, 0, 0, 247, 248, 5, 108, 0, 0, 248, 249, 5, 115, 0, 0, 249, 250, 5, 101, 0, 0, 250, 30, 1, 0, 0, 0, 251, 252, 5, 97, 0, 0, 252, 253, 5, 110, 0, 0, 253, 254, 5, 100, 0, 0, 254, 32, 1, 0, 0, 0, 255, 256, 5, 38, 0, 0, 256, 257, 5, 38, 0, 0, 257, 34, 1, 0, 0, 0, 258, 259, 5, 111, 0, 0, 259, 260, 5, 114, 0, 0, 260, 36, 1, 0, 0, 0, 261, 262, 5, 124, 0, 0, 262, 263, 5, 124, 0, 0, 263, 38, 1, 0, 0, 0, 264, 265, 5, 110, 0, 0, 265, 266, 5, 111, 0, 0, 266, 267, 5, 116, 0, 0, 267, 40, 1, 0, 0, 0, 268, 269, 5, 33, 0, 0, 269, 42, 1, 0, 0, 0, 270, 271, 5, 116, 0, 0, 271, 272, 5, 114, 0, 0, 272, 273, 5, 117, 0, 0, 273, 274, 5, 101, 0, 0, 274, 44, 1, 0, 0, 0, 275, 276, 5, 102, 0, 0, 276, 277, 5, 97, 0, 0, 277, 278, 5, 108, 0, 0, 278, 279, 5, 115, 0, 0, 279, 280, 5, 101, 0, 0, 280, 46, 1, 0, 0, 0, 281, 282, 5, 58, 0, 0, 282, 48, 1, 0, 0, 0, 283, 284, 5, 59, 0, 0, 284, 50, 1, 0, 0, 0, 285, 286, 5, 44, 0, 0, 286, 52, 1, 0, 0, 0, 287, 288, 5, 40, 0, 0, 288, 54, 1, 0, 0, 0, 289, 290, 5, 41, 0, 0, 290, 56, 1, 0, 0, 0, 291, 292, 5, 91, 0, 0, 292, 58, 1, 0, 0, 0, 293, 294, 5, 93, 0, 0, 294, 60, 1, 0, 0, 0, 295, 296, 5, 123, 0, 0, 296, 62, 1, 0, 0, 0, 297, 298, 5, 125, 0, 0, 298, 64, 1, 0, 0, 0, 299, 300, 5, 42, 0, 0, 300, 66, 1, 0, 0, 0, 301, 302, 5, 47, 0, 0, 302, 68, 1, 0, 0, 0, 303, 304, 5, 43, 0, 0, 304, 70, 1, 0, 0, 0, 305, 306, 5, 45, 0, 0, 306, 72, 1, 0, 0, 0, 307, 308, 5, 94, 0, 0, 308, 74, 1, 0, 0, 0, 309, 310, 5, 61, 0, 0, 310, 76, 1, 0, 0, 0, 311, 312, 5, 61, 0, 0, 312, 313, 5, 61, 0, 0, 313, 78, 1, 0, 0, 0, 314, 315, 5, 33, 0, 0, 315, 316, 5, 61, 0, 0, 316, 80, 1, 0, 0, 0, 317, 318, 5, 60, 0, 0, 318, 82, 1, 0, 0, 0, 319, 320, 5, 60, 0, 0, 320, 321, 5, 61, 0, 0, 321, 84, 1, 0, 0, 0, 322, 323, 5, 62, 0, 0, 323, 86, 1, 0, 0, 0, 324, 325, 5, 62, 0, 0, 325, 326, 5, 61, 0, 0, 326, 88, 1, 0, 0, 0, 327, 328, 7, 2, 0, 0, 328, 90, 1, 0, 0, 0, 329, 330, 5, 48, 0, 0, 330, 92, 1, 0, 0, 0, 331, 334, 3, 91, 45, 0, 332, 334, 3, 89, 44, 0, 333, 331, 1, 0, 0, 0, 333, 332, 1, 0, 0, 0, 334, 94, 1, 0, 0, 0, 335, 337, 3, 93, 46, 0, 336, 335, 1, 0, 0, 0, 337, 338, 1, 0, 0, 0, 338, 336, 1, 0, 0, 0, 338, 339, 1, 0, 0, 0, 339, 96, 1, 0, 0, 0, 340, 346, 3, 91, 45, 0, 341, 343, 3, 89, 44, 0, 342, 344, 3, 95, 47, 0, 343, 342, 1, 0, 0, 0, 343, 344, 1, 0, 0, 0, 344, 346, 1, 0, 0, 0, 345, 340, 1, 0, 0, 0, 345, 341, 1, 0, 0, 0, 346, 98, 1, 0, 0, 0, 347, 349, 3, 97, 48, 0, 348, 347, 1, 0, 0, 0, 348, 349, 1, 0, 0, 0, 349, 350, 1, 0, 0, 0, 350, 351, 5, 46, 0, 0, 351, 358, 3, 95, 47, 0, 352, 355, 7, 3, 0, 0, 353, 356, 3, 69, 34, 0, 354, 356, 3, 71, 35, 0, 355, 353, 1, 0, 0, 0, 355, 354, 1, 0, 0, 0, 355, 356, 1, 0, 0, 0, 356, 357, 1, 0, 0, 0, 357, 359, 3, 97, 48, 0, 358, 352, 1, 0, 0, 0, 358, 359, 1, 0, 0, 0, 359, 382, 1, 0, 0, 0, 360, 361, 3, 97, 48, 0, 361, 363, 5, 46, 0, 0, 362, 364, 3, 95, 47, 0, 363, 362, 1, 0, 0, 0, 363, 364, 1, 0, 0, 0, 364, 371, 1, 0, 0, 0, 365, 368, 7, 3, 0, 0, 366, 369, 3, 69, 34, 0, 367, 369, 3, 71, 35, 0, 368, 366, 1, 0, 0, 0, 368, 367, 1, 0, 0, 0, 368, 369, 1, 0, 0, 0, 369, 370, 1, 0, 0, 0, 370, 372, 3, 97, 48, 0, 371, 365, 1, 0, 0, 0, 371, 372, 1, 0, 0, 0, 372, 382, 1, 0, 0, 0, 373, 374, 3, 97, 48, 0, 374, 377, 7, 3, 0, 0, 375, 378, 3, 69, 34, 0, 376, 378, 3, 71, 35, 0, 377, 375, 1, 0, 0, 0, 377, 376, 1, 0, 0, 0, 377, 378, 1, 0, 0, 0, 378, 379, 1, 0, 0, 0, 379, 380, 3, 97, 48, 0, 380, 382, 1, 0, 0, 0, 381, 348, 1, 0, 0, 0, 381, 360, 1, 0, 0, 0, 381, 373, 1, 0, 0, 0, 382, 100, 1, 0, 0, 0, 383, 384, 5, 35, 0, 0, 384, 385, 3, 149, 74, 0, 385, 102, 1, 0, 0, 0, 386, 387, 5, 49, 0, 0, 387, 388, 5, 106, 0, 0, 388, 104, 1, 0, 0, 0, 389, 390, 5, 97, 0, 0, 390, 391, 5, 98, 0, 0, 391, 392, 5, 115, 0, 0, 392, 106, 1, 0, 0, 0, 393, 394, 5, 115, 0, 0, 394, 395, 5, 105, 0, 0, 395, 396, 5, 110, 0, 0, 396, 108, 1, 0, 0, 0, 397, 398, 5, 99, 0, 0, 398, 399, 5, 111, 0, 0, 399, 400, 5, 115, 0, 0, 400, 110, 1, 0, 0, 0, 401, 402, 5, 116, 0, 0, 402, 403, 5, 97, 0, 0, 403, 404, 5, 110, 0, 0, 404, 112, 1, 0, 0, 0, 405, 406, 5, 101, 0, 0, 406, 407, 5, 120, 0, 0, 407, 408, 5, 112, 0, 0, 408, 114, 1, 0, 0, 0, 409, 410, 5, 108, 0, 0, 410, 411, 5, 111, 0, 0, 411, 412, 5, 103, 0, 0, 412, 116, 1, 0, 0, 0, 413, 414, 5, 115, 0, 0, 414, 415, 5, 105, 0, 0, 415, 416, 5, 110, 0, 0, 416, 417, 5, 104, 0, 0, 417, 118, 1, 0, 0, 0, 418, 419, 5, 99, 0, 0, 419, 420, 5, 111, 0, 0, 420, 421, 5, 115, 0, 0, 421, 422, 5, 104, 0, 0, 422, 120, 1, 0, 0, 0, 423, 424, 5, 116, 0, 0, 424, 425, 5, 97, 0, 0, 425, 426, 5, 110, 0, 0, 426, 427, 5, 104, 0, 0, 427, 122, 1, 0, 0, 0, 428, 429, 5, 97, 0, 0, 429, 430, 5, 116, 0, 0, 430, 431, 5, 97, 0, 0, 431, 432, 5, 110, 0, 0, 432, 124, 1, 0, 0, 0, 433, 434, 5, 97, 0, 0, 434, 435, 5, 99, 0, 0, 435, 436, 5, 111, 0, 0, 436, 437, 5, 115, 0, 0, 437, 126, 1, 0, 0, 0, 438, 439, 5, 97, 0, 0, 439, 440, 5, 115, 0, 0, 440, 441, 5, 105, 0, 0, 441, 442, 5, 110, 0, 0, 442, 128, 1, 0, 0, 0, 443, 444, 5, 97, 0, 0, 444, 445, 5, 116, 0, 0, 445, 446, 5, 97, 0, 0, 446, 447, 5, 110, 0, 0, 447, 448, 5, 104, 0, 0, 448, 130, 1, 0, 0, 0, 449, 450, 5, 97, 0, 0, 450, 451, 5, 115, 0, 0, 451, 452, 5, 105, 0, 0, 452, 453, 5, 110, 0, 0, 453, 454, 5, 104, 0, 0, 454, 132, 1, 0, 0, 0, 455, 456, 5, 97, 0, 0, 456, 457, 5, 99, 0, 0, 457, 458, 5, 111, 0, 0, 458, 459, 5, 115, 0, 0, 459, 460, 5, 104, 0, 0, 460, 134, 1, 0, 0, 0, 461, 462, 5, 104, 0, 0, 462, 463, 5, 101, 0, 0, 463, 464, 5, 97, 0, 0, 464, 465, 5, 118, 0, 0, 465, 466, 5, 105, 0, 0, 466, 467, 5, 115, 0, 0, 467, 468, 5, 105, 0, 0, 468, 469, 5, 100, 0, 0, 469, 470, 5, 101, 0, 0, 470, 136, 1, 0, 0, 0, 471, 472, 5, 99, 0, 0, 472, 473, 5, 111, 0, 0, 473, 474, 5, 110, 0, 0, 474, 475, 5, 106, 0, 0, 475, 138, 1, 0, 0, 0, 476, 477, 5, 114, 0, 0, 477, 478, 5, 101, 0, 0, 478, 479, 5, 97, 0, 0, 479, 480, 5, 108, 0, 0, 480, 140, 1, 0, 0, 0, 481, 482, 5, 105, 0, 0, 482, 483, 5, 109, 0, 0, 483, 484, 5, 97, 0, 0, 484, 485, 5, 103, 0, 0, 485, 142, 1, 0, 0, 0, 486, 487, 5, 97, 0, 0, 487, 488, 5, 116, 0, 0, 488, 489, 5, 97, 0, 0, 489, 490, 5, 110, 0, 0, 490, 491, 5, 50, 0, 0, 491, 144, 1, 0, 0, 0, 492, 493, 7, 4, 0, 0, 493, 146, 1, 0, 0, 0, 494, 495, 7, 5, 0, 0, 495, 148, 1, 0, 0, 0, 496, 500, 3, 145, 72, 0, 497, 499, 3, 147, 73, 0, 498, 497, 1, 0, 0, 0, 499, 502, 1, 0, 0, 0, 500, 498, 1, 0, 0, 0, 500, 501, 1, 0, 0, 0, 501, 150, 1, 0, 0, 0, 502, 500, 1, 0, 0, 0, 19, 0, 154, 161, 164, 169, 179, 333, 338, 343, 345, 348, 355, 358, 363, 368, 371, 377, 381, 500, 2, 0, 1, 0, 6, 0, 0] \ No newline at end of file diff --git a/src/oqd_core/frontend/atomic/AtomicLexer.py b/src/oqd_core/frontend/atomic/AtomicLexer.py index 541b6c16..83a94ab3 100644 --- a/src/oqd_core/frontend/atomic/AtomicLexer.py +++ b/src/oqd_core/frontend/atomic/AtomicLexer.py @@ -10,7 +10,7 @@ def serializedATN(): return [ - 4,0,69,509,6,-1,2,0,7,0,2,1,7,1,2,2,7,2,2,3,7,3,2,4,7,4,2,5,7,5, + 4,0,69,503,6,-1,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, @@ -22,175 +22,173 @@ def serializedATN(): 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,1,0,4,0,153,8,0,11,0,12,0,154,1, - 0,1,0,1,1,1,1,5,1,161,8,1,10,1,12,1,164,9,1,1,1,4,1,167,8,1,11,1, - 12,1,168,3,1,171,8,1,1,2,4,2,174,8,2,11,2,12,2,175,1,2,1,2,1,3,1, - 3,1,3,1,3,5,3,184,8,3,10,3,12,3,187,9,3,1,3,1,3,1,3,1,3,1,4,1,4, - 1,4,1,4,1,4,1,4,1,4,1,4,1,4,1,5,1,5,1,5,1,6,1,6,1,6,1,6,1,6,1,7, - 1,7,1,7,1,7,1,7,1,7,1,8,1,8,1,8,1,8,1,8,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,1,11,1,11,1,11,1,11,1,11, - 1,12,1,12,1,12,1,12,1,12,1,12,1,12,1,13,1,13,1,13,1,13,1,13,1,14, - 1,14,1,14,1,14,1,14,1,14,1,15,1,15,1,15,1,15,1,16,1,16,1,16,1,17, - 1,17,1,17,1,18,1,18,1,18,1,19,1,19,1,19,1,19,1,20,1,20,1,21,1,21, - 1,21,1,21,1,21,1,22,1,22,1,22,1,22,1,22,1,22,1,23,1,23,1,24,1,24, - 1,25,1,25,1,26,1,26,1,27,1,27,1,28,1,28,1,29,1,29,1,30,1,30,1,31, - 1,31,1,32,1,32,1,33,1,33,1,34,1,34,1,35,1,35,1,36,1,36,1,37,1,37, - 1,38,1,38,1,38,1,39,1,39,1,39,1,40,1,40,1,41,1,41,1,41,1,42,1,42, - 1,43,1,43,1,43,1,44,1,44,1,45,1,45,1,46,1,46,3,46,340,8,46,1,47, - 4,47,343,8,47,11,47,12,47,344,1,48,1,48,1,48,3,48,350,8,48,3,48, - 352,8,48,1,49,3,49,355,8,49,1,49,1,49,1,49,1,49,1,49,3,49,362,8, - 49,1,49,3,49,365,8,49,1,49,1,49,1,49,3,49,370,8,49,1,49,1,49,1,49, - 3,49,375,8,49,1,49,3,49,378,8,49,1,49,1,49,1,49,1,49,3,49,384,8, - 49,1,49,1,49,3,49,388,8,49,1,50,1,50,1,50,1,51,1,51,1,51,1,52,1, - 52,1,52,1,52,1,53,1,53,1,53,1,53,1,54,1,54,1,54,1,54,1,55,1,55,1, - 55,1,55,1,56,1,56,1,56,1,56,1,57,1,57,1,57,1,57,1,58,1,58,1,58,1, - 58,1,58,1,59,1,59,1,59,1,59,1,59,1,60,1,60,1,60,1,60,1,60,1,61,1, - 61,1,61,1,61,1,61,1,62,1,62,1,62,1,62,1,62,1,63,1,63,1,63,1,63,1, - 63,1,64,1,64,1,64,1,64,1,64,1,64,1,65,1,65,1,65,1,65,1,65,1,65,1, - 66,1,66,1,66,1,66,1,66,1,66,1,67,1,67,1,67,1,67,1,67,1,67,1,67,1, - 67,1,67,1,67,1,68,1,68,1,68,1,68,1,68,1,69,1,69,1,69,1,69,1,69,1, - 70,1,70,1,70,1,70,1,70,1,71,1,71,1,71,1,71,1,71,1,71,1,72,1,72,1, - 73,1,73,1,74,1,74,5,74,505,8,74,10,74,12,74,508,9,74,0,0,75,1,1, - 3,2,5,3,7,4,9,5,11,6,13,7,15,8,17,9,19,10,21,11,23,12,25,13,27,14, - 29,15,31,16,33,17,35,18,37,19,39,20,41,21,43,22,45,23,47,24,49,25, - 51,26,53,27,55,28,57,29,59,30,61,31,63,32,65,33,67,34,69,35,71,36, - 73,37,75,38,77,39,79,40,81,41,83,42,85,43,87,44,89,0,91,0,93,0,95, - 0,97,45,99,46,101,47,103,48,105,49,107,50,109,51,111,52,113,53,115, - 54,117,55,119,56,121,57,123,58,125,59,127,60,129,61,131,62,133,63, - 135,64,137,65,139,66,141,67,143,68,145,0,147,0,149,69,1,0,6,2,0, - 9,9,32,32,2,0,10,10,13,13,1,0,49,57,2,0,69,69,101,101,3,0,65,90, - 95,95,97,122,4,0,48,57,65,90,95,95,97,122,525,0,1,1,0,0,0,0,3,1, - 0,0,0,0,5,1,0,0,0,0,7,1,0,0,0,0,9,1,0,0,0,0,11,1,0,0,0,0,13,1,0, - 0,0,0,15,1,0,0,0,0,17,1,0,0,0,0,19,1,0,0,0,0,21,1,0,0,0,0,23,1,0, - 0,0,0,25,1,0,0,0,0,27,1,0,0,0,0,29,1,0,0,0,0,31,1,0,0,0,0,33,1,0, - 0,0,0,35,1,0,0,0,0,37,1,0,0,0,0,39,1,0,0,0,0,41,1,0,0,0,0,43,1,0, - 0,0,0,45,1,0,0,0,0,47,1,0,0,0,0,49,1,0,0,0,0,51,1,0,0,0,0,53,1,0, - 0,0,0,55,1,0,0,0,0,57,1,0,0,0,0,59,1,0,0,0,0,61,1,0,0,0,0,63,1,0, - 0,0,0,65,1,0,0,0,0,67,1,0,0,0,0,69,1,0,0,0,0,71,1,0,0,0,0,73,1,0, - 0,0,0,75,1,0,0,0,0,77,1,0,0,0,0,79,1,0,0,0,0,81,1,0,0,0,0,83,1,0, - 0,0,0,85,1,0,0,0,0,87,1,0,0,0,0,97,1,0,0,0,0,99,1,0,0,0,0,101,1, - 0,0,0,0,103,1,0,0,0,0,105,1,0,0,0,0,107,1,0,0,0,0,109,1,0,0,0,0, - 111,1,0,0,0,0,113,1,0,0,0,0,115,1,0,0,0,0,117,1,0,0,0,0,119,1,0, - 0,0,0,121,1,0,0,0,0,123,1,0,0,0,0,125,1,0,0,0,0,127,1,0,0,0,0,129, - 1,0,0,0,0,131,1,0,0,0,0,133,1,0,0,0,0,135,1,0,0,0,0,137,1,0,0,0, - 0,139,1,0,0,0,0,141,1,0,0,0,0,143,1,0,0,0,0,149,1,0,0,0,1,152,1, - 0,0,0,3,170,1,0,0,0,5,173,1,0,0,0,7,179,1,0,0,0,9,192,1,0,0,0,11, - 201,1,0,0,0,13,204,1,0,0,0,15,209,1,0,0,0,17,215,1,0,0,0,19,220, - 1,0,0,0,21,224,1,0,0,0,23,230,1,0,0,0,25,239,1,0,0,0,27,246,1,0, - 0,0,29,251,1,0,0,0,31,257,1,0,0,0,33,261,1,0,0,0,35,264,1,0,0,0, - 37,267,1,0,0,0,39,270,1,0,0,0,41,274,1,0,0,0,43,276,1,0,0,0,45,281, - 1,0,0,0,47,287,1,0,0,0,49,289,1,0,0,0,51,291,1,0,0,0,53,293,1,0, - 0,0,55,295,1,0,0,0,57,297,1,0,0,0,59,299,1,0,0,0,61,301,1,0,0,0, - 63,303,1,0,0,0,65,305,1,0,0,0,67,307,1,0,0,0,69,309,1,0,0,0,71,311, - 1,0,0,0,73,313,1,0,0,0,75,315,1,0,0,0,77,317,1,0,0,0,79,320,1,0, - 0,0,81,323,1,0,0,0,83,325,1,0,0,0,85,328,1,0,0,0,87,330,1,0,0,0, - 89,333,1,0,0,0,91,335,1,0,0,0,93,339,1,0,0,0,95,342,1,0,0,0,97,351, - 1,0,0,0,99,387,1,0,0,0,101,389,1,0,0,0,103,392,1,0,0,0,105,395,1, - 0,0,0,107,399,1,0,0,0,109,403,1,0,0,0,111,407,1,0,0,0,113,411,1, - 0,0,0,115,415,1,0,0,0,117,419,1,0,0,0,119,424,1,0,0,0,121,429,1, - 0,0,0,123,434,1,0,0,0,125,439,1,0,0,0,127,444,1,0,0,0,129,449,1, - 0,0,0,131,455,1,0,0,0,133,461,1,0,0,0,135,467,1,0,0,0,137,477,1, - 0,0,0,139,482,1,0,0,0,141,487,1,0,0,0,143,492,1,0,0,0,145,498,1, - 0,0,0,147,500,1,0,0,0,149,502,1,0,0,0,151,153,7,0,0,0,152,151,1, - 0,0,0,153,154,1,0,0,0,154,152,1,0,0,0,154,155,1,0,0,0,155,156,1, - 0,0,0,156,157,6,0,0,0,157,2,1,0,0,0,158,162,5,59,0,0,159,161,7,1, - 0,0,160,159,1,0,0,0,161,164,1,0,0,0,162,160,1,0,0,0,162,163,1,0, - 0,0,163,171,1,0,0,0,164,162,1,0,0,0,165,167,7,1,0,0,166,165,1,0, - 0,0,167,168,1,0,0,0,168,166,1,0,0,0,168,169,1,0,0,0,169,171,1,0, - 0,0,170,158,1,0,0,0,170,166,1,0,0,0,171,4,1,0,0,0,172,174,7,1,0, - 0,173,172,1,0,0,0,174,175,1,0,0,0,175,173,1,0,0,0,175,176,1,0,0, - 0,176,177,1,0,0,0,177,178,6,2,0,0,178,6,1,0,0,0,179,180,5,47,0,0, - 180,181,5,47,0,0,181,185,1,0,0,0,182,184,8,1,0,0,183,182,1,0,0,0, - 184,187,1,0,0,0,185,183,1,0,0,0,185,186,1,0,0,0,186,188,1,0,0,0, - 187,185,1,0,0,0,188,189,3,5,2,0,189,190,1,0,0,0,190,191,6,3,1,0, - 191,8,1,0,0,0,192,193,5,112,0,0,193,194,5,97,0,0,194,195,5,114,0, - 0,195,196,5,97,0,0,196,197,5,108,0,0,197,198,5,108,0,0,198,199,5, - 101,0,0,199,200,5,108,0,0,200,10,1,0,0,0,201,202,5,105,0,0,202,203, - 5,102,0,0,203,12,1,0,0,0,204,205,5,101,0,0,205,206,5,108,0,0,206, - 207,5,115,0,0,207,208,5,101,0,0,208,14,1,0,0,0,209,210,5,119,0,0, - 210,211,5,104,0,0,211,212,5,105,0,0,212,213,5,108,0,0,213,214,5, - 101,0,0,214,16,1,0,0,0,215,216,5,119,0,0,216,217,5,105,0,0,217,218, - 5,116,0,0,218,219,5,104,0,0,219,18,1,0,0,0,220,221,5,102,0,0,221, - 222,5,111,0,0,222,223,5,114,0,0,223,20,1,0,0,0,224,225,5,98,0,0, - 225,226,5,114,0,0,226,227,5,101,0,0,227,228,5,97,0,0,228,229,5,107, - 0,0,229,22,1,0,0,0,230,231,5,99,0,0,231,232,5,111,0,0,232,233,5, - 110,0,0,233,234,5,116,0,0,234,235,5,105,0,0,235,236,5,110,0,0,236, - 237,5,117,0,0,237,238,5,101,0,0,238,24,1,0,0,0,239,240,5,105,0,0, - 240,241,5,111,0,0,241,242,5,110,0,0,242,243,5,114,0,0,243,244,5, - 101,0,0,244,245,5,103,0,0,245,26,1,0,0,0,246,247,5,98,0,0,247,248, - 5,101,0,0,248,249,5,97,0,0,249,250,5,109,0,0,250,28,1,0,0,0,251, - 252,5,112,0,0,252,253,5,117,0,0,253,254,5,108,0,0,254,255,5,115, - 0,0,255,256,5,101,0,0,256,30,1,0,0,0,257,258,5,97,0,0,258,259,5, - 110,0,0,259,260,5,100,0,0,260,32,1,0,0,0,261,262,5,38,0,0,262,263, - 5,38,0,0,263,34,1,0,0,0,264,265,5,111,0,0,265,266,5,114,0,0,266, - 36,1,0,0,0,267,268,5,124,0,0,268,269,5,124,0,0,269,38,1,0,0,0,270, - 271,5,110,0,0,271,272,5,111,0,0,272,273,5,116,0,0,273,40,1,0,0,0, - 274,275,5,33,0,0,275,42,1,0,0,0,276,277,5,116,0,0,277,278,5,114, - 0,0,278,279,5,117,0,0,279,280,5,101,0,0,280,44,1,0,0,0,281,282,5, - 102,0,0,282,283,5,97,0,0,283,284,5,108,0,0,284,285,5,115,0,0,285, - 286,5,101,0,0,286,46,1,0,0,0,287,288,5,58,0,0,288,48,1,0,0,0,289, - 290,5,59,0,0,290,50,1,0,0,0,291,292,5,44,0,0,292,52,1,0,0,0,293, - 294,5,40,0,0,294,54,1,0,0,0,295,296,5,41,0,0,296,56,1,0,0,0,297, - 298,5,91,0,0,298,58,1,0,0,0,299,300,5,93,0,0,300,60,1,0,0,0,301, - 302,5,123,0,0,302,62,1,0,0,0,303,304,5,125,0,0,304,64,1,0,0,0,305, - 306,5,42,0,0,306,66,1,0,0,0,307,308,5,47,0,0,308,68,1,0,0,0,309, - 310,5,43,0,0,310,70,1,0,0,0,311,312,5,45,0,0,312,72,1,0,0,0,313, - 314,5,94,0,0,314,74,1,0,0,0,315,316,5,61,0,0,316,76,1,0,0,0,317, - 318,5,61,0,0,318,319,5,61,0,0,319,78,1,0,0,0,320,321,5,33,0,0,321, - 322,5,61,0,0,322,80,1,0,0,0,323,324,5,60,0,0,324,82,1,0,0,0,325, - 326,5,60,0,0,326,327,5,61,0,0,327,84,1,0,0,0,328,329,5,62,0,0,329, - 86,1,0,0,0,330,331,5,62,0,0,331,332,5,61,0,0,332,88,1,0,0,0,333, - 334,7,2,0,0,334,90,1,0,0,0,335,336,5,48,0,0,336,92,1,0,0,0,337,340, - 3,91,45,0,338,340,3,89,44,0,339,337,1,0,0,0,339,338,1,0,0,0,340, - 94,1,0,0,0,341,343,3,93,46,0,342,341,1,0,0,0,343,344,1,0,0,0,344, - 342,1,0,0,0,344,345,1,0,0,0,345,96,1,0,0,0,346,352,3,91,45,0,347, - 349,3,89,44,0,348,350,3,95,47,0,349,348,1,0,0,0,349,350,1,0,0,0, - 350,352,1,0,0,0,351,346,1,0,0,0,351,347,1,0,0,0,352,98,1,0,0,0,353, - 355,3,97,48,0,354,353,1,0,0,0,354,355,1,0,0,0,355,356,1,0,0,0,356, - 357,5,46,0,0,357,364,3,95,47,0,358,361,7,3,0,0,359,362,3,69,34,0, - 360,362,3,71,35,0,361,359,1,0,0,0,361,360,1,0,0,0,361,362,1,0,0, - 0,362,363,1,0,0,0,363,365,3,97,48,0,364,358,1,0,0,0,364,365,1,0, - 0,0,365,388,1,0,0,0,366,367,3,97,48,0,367,369,5,46,0,0,368,370,3, - 95,47,0,369,368,1,0,0,0,369,370,1,0,0,0,370,377,1,0,0,0,371,374, - 7,3,0,0,372,375,3,69,34,0,373,375,3,71,35,0,374,372,1,0,0,0,374, - 373,1,0,0,0,374,375,1,0,0,0,375,376,1,0,0,0,376,378,3,97,48,0,377, - 371,1,0,0,0,377,378,1,0,0,0,378,388,1,0,0,0,379,380,3,97,48,0,380, - 383,7,3,0,0,381,384,3,69,34,0,382,384,3,71,35,0,383,381,1,0,0,0, - 383,382,1,0,0,0,383,384,1,0,0,0,384,385,1,0,0,0,385,386,3,97,48, - 0,386,388,1,0,0,0,387,354,1,0,0,0,387,366,1,0,0,0,387,379,1,0,0, - 0,388,100,1,0,0,0,389,390,5,35,0,0,390,391,3,149,74,0,391,102,1, - 0,0,0,392,393,5,49,0,0,393,394,5,106,0,0,394,104,1,0,0,0,395,396, - 5,97,0,0,396,397,5,98,0,0,397,398,5,115,0,0,398,106,1,0,0,0,399, - 400,5,115,0,0,400,401,5,105,0,0,401,402,5,110,0,0,402,108,1,0,0, - 0,403,404,5,99,0,0,404,405,5,111,0,0,405,406,5,115,0,0,406,110,1, - 0,0,0,407,408,5,116,0,0,408,409,5,97,0,0,409,410,5,110,0,0,410,112, - 1,0,0,0,411,412,5,101,0,0,412,413,5,120,0,0,413,414,5,112,0,0,414, - 114,1,0,0,0,415,416,5,108,0,0,416,417,5,111,0,0,417,418,5,103,0, - 0,418,116,1,0,0,0,419,420,5,115,0,0,420,421,5,105,0,0,421,422,5, - 110,0,0,422,423,5,104,0,0,423,118,1,0,0,0,424,425,5,99,0,0,425,426, - 5,111,0,0,426,427,5,115,0,0,427,428,5,104,0,0,428,120,1,0,0,0,429, - 430,5,116,0,0,430,431,5,97,0,0,431,432,5,110,0,0,432,433,5,104,0, - 0,433,122,1,0,0,0,434,435,5,97,0,0,435,436,5,116,0,0,436,437,5,97, - 0,0,437,438,5,110,0,0,438,124,1,0,0,0,439,440,5,97,0,0,440,441,5, - 99,0,0,441,442,5,111,0,0,442,443,5,115,0,0,443,126,1,0,0,0,444,445, - 5,97,0,0,445,446,5,115,0,0,446,447,5,105,0,0,447,448,5,110,0,0,448, - 128,1,0,0,0,449,450,5,97,0,0,450,451,5,116,0,0,451,452,5,97,0,0, - 452,453,5,110,0,0,453,454,5,104,0,0,454,130,1,0,0,0,455,456,5,97, - 0,0,456,457,5,115,0,0,457,458,5,105,0,0,458,459,5,110,0,0,459,460, - 5,104,0,0,460,132,1,0,0,0,461,462,5,97,0,0,462,463,5,99,0,0,463, - 464,5,111,0,0,464,465,5,115,0,0,465,466,5,104,0,0,466,134,1,0,0, - 0,467,468,5,104,0,0,468,469,5,101,0,0,469,470,5,97,0,0,470,471,5, - 118,0,0,471,472,5,105,0,0,472,473,5,115,0,0,473,474,5,105,0,0,474, - 475,5,100,0,0,475,476,5,101,0,0,476,136,1,0,0,0,477,478,5,99,0,0, - 478,479,5,111,0,0,479,480,5,110,0,0,480,481,5,106,0,0,481,138,1, - 0,0,0,482,483,5,114,0,0,483,484,5,101,0,0,484,485,5,97,0,0,485,486, - 5,108,0,0,486,140,1,0,0,0,487,488,5,105,0,0,488,489,5,109,0,0,489, - 490,5,97,0,0,490,491,5,103,0,0,491,142,1,0,0,0,492,493,5,97,0,0, - 493,494,5,116,0,0,494,495,5,97,0,0,495,496,5,110,0,0,496,497,5,50, - 0,0,497,144,1,0,0,0,498,499,7,4,0,0,499,146,1,0,0,0,500,501,7,5, - 0,0,501,148,1,0,0,0,502,506,3,145,72,0,503,505,3,147,73,0,504,503, - 1,0,0,0,505,508,1,0,0,0,506,504,1,0,0,0,506,507,1,0,0,0,507,150, - 1,0,0,0,508,506,1,0,0,0,20,0,154,162,168,170,175,185,339,344,349, - 351,354,361,364,369,374,377,383,387,506,2,0,1,0,6,0,0 + 0,1,0,1,1,4,1,160,8,1,11,1,12,1,161,1,1,3,1,165,8,1,1,2,4,2,168, + 8,2,11,2,12,2,169,1,2,1,2,1,3,1,3,1,3,1,3,5,3,178,8,3,10,3,12,3, + 181,9,3,1,3,1,3,1,3,1,3,1,4,1,4,1,4,1,4,1,4,1,4,1,4,1,4,1,4,1,5, + 1,5,1,5,1,6,1,6,1,6,1,6,1,6,1,7,1,7,1,7,1,7,1,7,1,7,1,8,1,8,1,8, + 1,8,1,8,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,1,11,1,11,1,11,1,11,1,11,1,12,1,12,1,12,1,12,1,12,1,12, + 1,12,1,13,1,13,1,13,1,13,1,13,1,14,1,14,1,14,1,14,1,14,1,14,1,15, + 1,15,1,15,1,15,1,16,1,16,1,16,1,17,1,17,1,17,1,18,1,18,1,18,1,19, + 1,19,1,19,1,19,1,20,1,20,1,21,1,21,1,21,1,21,1,21,1,22,1,22,1,22, + 1,22,1,22,1,22,1,23,1,23,1,24,1,24,1,25,1,25,1,26,1,26,1,27,1,27, + 1,28,1,28,1,29,1,29,1,30,1,30,1,31,1,31,1,32,1,32,1,33,1,33,1,34, + 1,34,1,35,1,35,1,36,1,36,1,37,1,37,1,38,1,38,1,38,1,39,1,39,1,39, + 1,40,1,40,1,41,1,41,1,41,1,42,1,42,1,43,1,43,1,43,1,44,1,44,1,45, + 1,45,1,46,1,46,3,46,334,8,46,1,47,4,47,337,8,47,11,47,12,47,338, + 1,48,1,48,1,48,3,48,344,8,48,3,48,346,8,48,1,49,3,49,349,8,49,1, + 49,1,49,1,49,1,49,1,49,3,49,356,8,49,1,49,3,49,359,8,49,1,49,1,49, + 1,49,3,49,364,8,49,1,49,1,49,1,49,3,49,369,8,49,1,49,3,49,372,8, + 49,1,49,1,49,1,49,1,49,3,49,378,8,49,1,49,1,49,3,49,382,8,49,1,50, + 1,50,1,50,1,51,1,51,1,51,1,52,1,52,1,52,1,52,1,53,1,53,1,53,1,53, + 1,54,1,54,1,54,1,54,1,55,1,55,1,55,1,55,1,56,1,56,1,56,1,56,1,57, + 1,57,1,57,1,57,1,58,1,58,1,58,1,58,1,58,1,59,1,59,1,59,1,59,1,59, + 1,60,1,60,1,60,1,60,1,60,1,61,1,61,1,61,1,61,1,61,1,62,1,62,1,62, + 1,62,1,62,1,63,1,63,1,63,1,63,1,63,1,64,1,64,1,64,1,64,1,64,1,64, + 1,65,1,65,1,65,1,65,1,65,1,65,1,66,1,66,1,66,1,66,1,66,1,66,1,67, + 1,67,1,67,1,67,1,67,1,67,1,67,1,67,1,67,1,67,1,68,1,68,1,68,1,68, + 1,68,1,69,1,69,1,69,1,69,1,69,1,70,1,70,1,70,1,70,1,70,1,71,1,71, + 1,71,1,71,1,71,1,71,1,72,1,72,1,73,1,73,1,74,1,74,5,74,499,8,74, + 10,74,12,74,502,9,74,0,0,75,1,1,3,2,5,3,7,4,9,5,11,6,13,7,15,8,17, + 9,19,10,21,11,23,12,25,13,27,14,29,15,31,16,33,17,35,18,37,19,39, + 20,41,21,43,22,45,23,47,24,49,25,51,26,53,27,55,28,57,29,59,30,61, + 31,63,32,65,33,67,34,69,35,71,36,73,37,75,38,77,39,79,40,81,41,83, + 42,85,43,87,44,89,0,91,0,93,0,95,0,97,45,99,46,101,47,103,48,105, + 49,107,50,109,51,111,52,113,53,115,54,117,55,119,56,121,57,123,58, + 125,59,127,60,129,61,131,62,133,63,135,64,137,65,139,66,141,67,143, + 68,145,0,147,0,149,69,1,0,6,2,0,9,9,32,32,2,0,10,10,13,13,1,0,49, + 57,2,0,69,69,101,101,3,0,65,90,95,95,97,122,4,0,48,57,65,90,95,95, + 97,122,518,0,1,1,0,0,0,0,3,1,0,0,0,0,5,1,0,0,0,0,7,1,0,0,0,0,9,1, + 0,0,0,0,11,1,0,0,0,0,13,1,0,0,0,0,15,1,0,0,0,0,17,1,0,0,0,0,19,1, + 0,0,0,0,21,1,0,0,0,0,23,1,0,0,0,0,25,1,0,0,0,0,27,1,0,0,0,0,29,1, + 0,0,0,0,31,1,0,0,0,0,33,1,0,0,0,0,35,1,0,0,0,0,37,1,0,0,0,0,39,1, + 0,0,0,0,41,1,0,0,0,0,43,1,0,0,0,0,45,1,0,0,0,0,47,1,0,0,0,0,49,1, + 0,0,0,0,51,1,0,0,0,0,53,1,0,0,0,0,55,1,0,0,0,0,57,1,0,0,0,0,59,1, + 0,0,0,0,61,1,0,0,0,0,63,1,0,0,0,0,65,1,0,0,0,0,67,1,0,0,0,0,69,1, + 0,0,0,0,71,1,0,0,0,0,73,1,0,0,0,0,75,1,0,0,0,0,77,1,0,0,0,0,79,1, + 0,0,0,0,81,1,0,0,0,0,83,1,0,0,0,0,85,1,0,0,0,0,87,1,0,0,0,0,97,1, + 0,0,0,0,99,1,0,0,0,0,101,1,0,0,0,0,103,1,0,0,0,0,105,1,0,0,0,0,107, + 1,0,0,0,0,109,1,0,0,0,0,111,1,0,0,0,0,113,1,0,0,0,0,115,1,0,0,0, + 0,117,1,0,0,0,0,119,1,0,0,0,0,121,1,0,0,0,0,123,1,0,0,0,0,125,1, + 0,0,0,0,127,1,0,0,0,0,129,1,0,0,0,0,131,1,0,0,0,0,133,1,0,0,0,0, + 135,1,0,0,0,0,137,1,0,0,0,0,139,1,0,0,0,0,141,1,0,0,0,0,143,1,0, + 0,0,0,149,1,0,0,0,1,152,1,0,0,0,3,164,1,0,0,0,5,167,1,0,0,0,7,173, + 1,0,0,0,9,186,1,0,0,0,11,195,1,0,0,0,13,198,1,0,0,0,15,203,1,0,0, + 0,17,209,1,0,0,0,19,214,1,0,0,0,21,218,1,0,0,0,23,224,1,0,0,0,25, + 233,1,0,0,0,27,240,1,0,0,0,29,245,1,0,0,0,31,251,1,0,0,0,33,255, + 1,0,0,0,35,258,1,0,0,0,37,261,1,0,0,0,39,264,1,0,0,0,41,268,1,0, + 0,0,43,270,1,0,0,0,45,275,1,0,0,0,47,281,1,0,0,0,49,283,1,0,0,0, + 51,285,1,0,0,0,53,287,1,0,0,0,55,289,1,0,0,0,57,291,1,0,0,0,59,293, + 1,0,0,0,61,295,1,0,0,0,63,297,1,0,0,0,65,299,1,0,0,0,67,301,1,0, + 0,0,69,303,1,0,0,0,71,305,1,0,0,0,73,307,1,0,0,0,75,309,1,0,0,0, + 77,311,1,0,0,0,79,314,1,0,0,0,81,317,1,0,0,0,83,319,1,0,0,0,85,322, + 1,0,0,0,87,324,1,0,0,0,89,327,1,0,0,0,91,329,1,0,0,0,93,333,1,0, + 0,0,95,336,1,0,0,0,97,345,1,0,0,0,99,381,1,0,0,0,101,383,1,0,0,0, + 103,386,1,0,0,0,105,389,1,0,0,0,107,393,1,0,0,0,109,397,1,0,0,0, + 111,401,1,0,0,0,113,405,1,0,0,0,115,409,1,0,0,0,117,413,1,0,0,0, + 119,418,1,0,0,0,121,423,1,0,0,0,123,428,1,0,0,0,125,433,1,0,0,0, + 127,438,1,0,0,0,129,443,1,0,0,0,131,449,1,0,0,0,133,455,1,0,0,0, + 135,461,1,0,0,0,137,471,1,0,0,0,139,476,1,0,0,0,141,481,1,0,0,0, + 143,486,1,0,0,0,145,492,1,0,0,0,147,494,1,0,0,0,149,496,1,0,0,0, + 151,153,7,0,0,0,152,151,1,0,0,0,153,154,1,0,0,0,154,152,1,0,0,0, + 154,155,1,0,0,0,155,156,1,0,0,0,156,157,6,0,0,0,157,2,1,0,0,0,158, + 160,7,1,0,0,159,158,1,0,0,0,160,161,1,0,0,0,161,159,1,0,0,0,161, + 162,1,0,0,0,162,165,1,0,0,0,163,165,3,7,3,0,164,159,1,0,0,0,164, + 163,1,0,0,0,165,4,1,0,0,0,166,168,7,1,0,0,167,166,1,0,0,0,168,169, + 1,0,0,0,169,167,1,0,0,0,169,170,1,0,0,0,170,171,1,0,0,0,171,172, + 6,2,0,0,172,6,1,0,0,0,173,174,5,47,0,0,174,175,5,47,0,0,175,179, + 1,0,0,0,176,178,8,1,0,0,177,176,1,0,0,0,178,181,1,0,0,0,179,177, + 1,0,0,0,179,180,1,0,0,0,180,182,1,0,0,0,181,179,1,0,0,0,182,183, + 3,5,2,0,183,184,1,0,0,0,184,185,6,3,1,0,185,8,1,0,0,0,186,187,5, + 112,0,0,187,188,5,97,0,0,188,189,5,114,0,0,189,190,5,97,0,0,190, + 191,5,108,0,0,191,192,5,108,0,0,192,193,5,101,0,0,193,194,5,108, + 0,0,194,10,1,0,0,0,195,196,5,105,0,0,196,197,5,102,0,0,197,12,1, + 0,0,0,198,199,5,101,0,0,199,200,5,108,0,0,200,201,5,115,0,0,201, + 202,5,101,0,0,202,14,1,0,0,0,203,204,5,119,0,0,204,205,5,104,0,0, + 205,206,5,105,0,0,206,207,5,108,0,0,207,208,5,101,0,0,208,16,1,0, + 0,0,209,210,5,119,0,0,210,211,5,105,0,0,211,212,5,116,0,0,212,213, + 5,104,0,0,213,18,1,0,0,0,214,215,5,102,0,0,215,216,5,111,0,0,216, + 217,5,114,0,0,217,20,1,0,0,0,218,219,5,98,0,0,219,220,5,114,0,0, + 220,221,5,101,0,0,221,222,5,97,0,0,222,223,5,107,0,0,223,22,1,0, + 0,0,224,225,5,99,0,0,225,226,5,111,0,0,226,227,5,110,0,0,227,228, + 5,116,0,0,228,229,5,105,0,0,229,230,5,110,0,0,230,231,5,117,0,0, + 231,232,5,101,0,0,232,24,1,0,0,0,233,234,5,105,0,0,234,235,5,111, + 0,0,235,236,5,110,0,0,236,237,5,114,0,0,237,238,5,101,0,0,238,239, + 5,103,0,0,239,26,1,0,0,0,240,241,5,98,0,0,241,242,5,101,0,0,242, + 243,5,97,0,0,243,244,5,109,0,0,244,28,1,0,0,0,245,246,5,112,0,0, + 246,247,5,117,0,0,247,248,5,108,0,0,248,249,5,115,0,0,249,250,5, + 101,0,0,250,30,1,0,0,0,251,252,5,97,0,0,252,253,5,110,0,0,253,254, + 5,100,0,0,254,32,1,0,0,0,255,256,5,38,0,0,256,257,5,38,0,0,257,34, + 1,0,0,0,258,259,5,111,0,0,259,260,5,114,0,0,260,36,1,0,0,0,261,262, + 5,124,0,0,262,263,5,124,0,0,263,38,1,0,0,0,264,265,5,110,0,0,265, + 266,5,111,0,0,266,267,5,116,0,0,267,40,1,0,0,0,268,269,5,33,0,0, + 269,42,1,0,0,0,270,271,5,116,0,0,271,272,5,114,0,0,272,273,5,117, + 0,0,273,274,5,101,0,0,274,44,1,0,0,0,275,276,5,102,0,0,276,277,5, + 97,0,0,277,278,5,108,0,0,278,279,5,115,0,0,279,280,5,101,0,0,280, + 46,1,0,0,0,281,282,5,58,0,0,282,48,1,0,0,0,283,284,5,59,0,0,284, + 50,1,0,0,0,285,286,5,44,0,0,286,52,1,0,0,0,287,288,5,40,0,0,288, + 54,1,0,0,0,289,290,5,41,0,0,290,56,1,0,0,0,291,292,5,91,0,0,292, + 58,1,0,0,0,293,294,5,93,0,0,294,60,1,0,0,0,295,296,5,123,0,0,296, + 62,1,0,0,0,297,298,5,125,0,0,298,64,1,0,0,0,299,300,5,42,0,0,300, + 66,1,0,0,0,301,302,5,47,0,0,302,68,1,0,0,0,303,304,5,43,0,0,304, + 70,1,0,0,0,305,306,5,45,0,0,306,72,1,0,0,0,307,308,5,94,0,0,308, + 74,1,0,0,0,309,310,5,61,0,0,310,76,1,0,0,0,311,312,5,61,0,0,312, + 313,5,61,0,0,313,78,1,0,0,0,314,315,5,33,0,0,315,316,5,61,0,0,316, + 80,1,0,0,0,317,318,5,60,0,0,318,82,1,0,0,0,319,320,5,60,0,0,320, + 321,5,61,0,0,321,84,1,0,0,0,322,323,5,62,0,0,323,86,1,0,0,0,324, + 325,5,62,0,0,325,326,5,61,0,0,326,88,1,0,0,0,327,328,7,2,0,0,328, + 90,1,0,0,0,329,330,5,48,0,0,330,92,1,0,0,0,331,334,3,91,45,0,332, + 334,3,89,44,0,333,331,1,0,0,0,333,332,1,0,0,0,334,94,1,0,0,0,335, + 337,3,93,46,0,336,335,1,0,0,0,337,338,1,0,0,0,338,336,1,0,0,0,338, + 339,1,0,0,0,339,96,1,0,0,0,340,346,3,91,45,0,341,343,3,89,44,0,342, + 344,3,95,47,0,343,342,1,0,0,0,343,344,1,0,0,0,344,346,1,0,0,0,345, + 340,1,0,0,0,345,341,1,0,0,0,346,98,1,0,0,0,347,349,3,97,48,0,348, + 347,1,0,0,0,348,349,1,0,0,0,349,350,1,0,0,0,350,351,5,46,0,0,351, + 358,3,95,47,0,352,355,7,3,0,0,353,356,3,69,34,0,354,356,3,71,35, + 0,355,353,1,0,0,0,355,354,1,0,0,0,355,356,1,0,0,0,356,357,1,0,0, + 0,357,359,3,97,48,0,358,352,1,0,0,0,358,359,1,0,0,0,359,382,1,0, + 0,0,360,361,3,97,48,0,361,363,5,46,0,0,362,364,3,95,47,0,363,362, + 1,0,0,0,363,364,1,0,0,0,364,371,1,0,0,0,365,368,7,3,0,0,366,369, + 3,69,34,0,367,369,3,71,35,0,368,366,1,0,0,0,368,367,1,0,0,0,368, + 369,1,0,0,0,369,370,1,0,0,0,370,372,3,97,48,0,371,365,1,0,0,0,371, + 372,1,0,0,0,372,382,1,0,0,0,373,374,3,97,48,0,374,377,7,3,0,0,375, + 378,3,69,34,0,376,378,3,71,35,0,377,375,1,0,0,0,377,376,1,0,0,0, + 377,378,1,0,0,0,378,379,1,0,0,0,379,380,3,97,48,0,380,382,1,0,0, + 0,381,348,1,0,0,0,381,360,1,0,0,0,381,373,1,0,0,0,382,100,1,0,0, + 0,383,384,5,35,0,0,384,385,3,149,74,0,385,102,1,0,0,0,386,387,5, + 49,0,0,387,388,5,106,0,0,388,104,1,0,0,0,389,390,5,97,0,0,390,391, + 5,98,0,0,391,392,5,115,0,0,392,106,1,0,0,0,393,394,5,115,0,0,394, + 395,5,105,0,0,395,396,5,110,0,0,396,108,1,0,0,0,397,398,5,99,0,0, + 398,399,5,111,0,0,399,400,5,115,0,0,400,110,1,0,0,0,401,402,5,116, + 0,0,402,403,5,97,0,0,403,404,5,110,0,0,404,112,1,0,0,0,405,406,5, + 101,0,0,406,407,5,120,0,0,407,408,5,112,0,0,408,114,1,0,0,0,409, + 410,5,108,0,0,410,411,5,111,0,0,411,412,5,103,0,0,412,116,1,0,0, + 0,413,414,5,115,0,0,414,415,5,105,0,0,415,416,5,110,0,0,416,417, + 5,104,0,0,417,118,1,0,0,0,418,419,5,99,0,0,419,420,5,111,0,0,420, + 421,5,115,0,0,421,422,5,104,0,0,422,120,1,0,0,0,423,424,5,116,0, + 0,424,425,5,97,0,0,425,426,5,110,0,0,426,427,5,104,0,0,427,122,1, + 0,0,0,428,429,5,97,0,0,429,430,5,116,0,0,430,431,5,97,0,0,431,432, + 5,110,0,0,432,124,1,0,0,0,433,434,5,97,0,0,434,435,5,99,0,0,435, + 436,5,111,0,0,436,437,5,115,0,0,437,126,1,0,0,0,438,439,5,97,0,0, + 439,440,5,115,0,0,440,441,5,105,0,0,441,442,5,110,0,0,442,128,1, + 0,0,0,443,444,5,97,0,0,444,445,5,116,0,0,445,446,5,97,0,0,446,447, + 5,110,0,0,447,448,5,104,0,0,448,130,1,0,0,0,449,450,5,97,0,0,450, + 451,5,115,0,0,451,452,5,105,0,0,452,453,5,110,0,0,453,454,5,104, + 0,0,454,132,1,0,0,0,455,456,5,97,0,0,456,457,5,99,0,0,457,458,5, + 111,0,0,458,459,5,115,0,0,459,460,5,104,0,0,460,134,1,0,0,0,461, + 462,5,104,0,0,462,463,5,101,0,0,463,464,5,97,0,0,464,465,5,118,0, + 0,465,466,5,105,0,0,466,467,5,115,0,0,467,468,5,105,0,0,468,469, + 5,100,0,0,469,470,5,101,0,0,470,136,1,0,0,0,471,472,5,99,0,0,472, + 473,5,111,0,0,473,474,5,110,0,0,474,475,5,106,0,0,475,138,1,0,0, + 0,476,477,5,114,0,0,477,478,5,101,0,0,478,479,5,97,0,0,479,480,5, + 108,0,0,480,140,1,0,0,0,481,482,5,105,0,0,482,483,5,109,0,0,483, + 484,5,97,0,0,484,485,5,103,0,0,485,142,1,0,0,0,486,487,5,97,0,0, + 487,488,5,116,0,0,488,489,5,97,0,0,489,490,5,110,0,0,490,491,5,50, + 0,0,491,144,1,0,0,0,492,493,7,4,0,0,493,146,1,0,0,0,494,495,7,5, + 0,0,495,148,1,0,0,0,496,500,3,145,72,0,497,499,3,147,73,0,498,497, + 1,0,0,0,499,502,1,0,0,0,500,498,1,0,0,0,500,501,1,0,0,0,501,150, + 1,0,0,0,502,500,1,0,0,0,19,0,154,161,164,169,179,333,338,343,345, + 348,355,358,363,368,371,377,381,500,2,0,1,0,6,0,0 ] class AtomicLexer(Lexer): diff --git a/src/oqd_core/frontend/atomic/AtomicParser.interp b/src/oqd_core/frontend/atomic/AtomicParser.interp index 653fc194..0f73c28c 100644 --- a/src/oqd_core/frontend/atomic/AtomicParser.interp +++ b/src/oqd_core/frontend/atomic/AtomicParser.interp @@ -182,4 +182,4 @@ eexpr atn: -[4, 1, 69, 303, 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, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 83, 8, 1, 1, 2, 1, 2, 1, 2, 1, 2, 5, 2, 89, 8, 2, 10, 2, 12, 2, 92, 9, 2, 1, 2, 3, 2, 95, 8, 2, 1, 3, 1, 3, 1, 3, 3, 3, 100, 8, 3, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 4, 4, 107, 8, 4, 11, 4, 12, 4, 108, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 3, 4, 122, 8, 4, 1, 4, 1, 4, 1, 4, 3, 4, 127, 8, 4, 1, 4, 1, 4, 5, 4, 131, 8, 4, 10, 4, 12, 4, 134, 9, 4, 1, 5, 1, 5, 1, 6, 1, 6, 3, 6, 140, 8, 6, 1, 6, 1, 6, 5, 6, 144, 8, 6, 10, 6, 12, 6, 147, 9, 6, 1, 6, 1, 6, 1, 7, 1, 7, 1, 7, 1, 7, 1, 8, 1, 8, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 10, 1, 10, 1, 11, 1, 11, 1, 12, 1, 12, 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, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 3, 13, 190, 8, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 3, 13, 197, 8, 13, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 16, 1, 16, 1, 17, 1, 17, 1, 18, 1, 18, 1, 19, 1, 19, 1, 20, 1, 20, 1, 21, 1, 21, 1, 22, 1, 22, 1, 23, 1, 23, 1, 24, 1, 24, 1, 25, 1, 25, 1, 26, 1, 26, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 3, 27, 237, 8, 27, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 3, 28, 247, 8, 28, 1, 29, 1, 29, 1, 30, 1, 30, 1, 30, 1, 30, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 5, 31, 260, 8, 31, 10, 31, 12, 31, 263, 9, 31, 3, 31, 265, 8, 31, 1, 31, 1, 31, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 5, 32, 275, 8, 32, 10, 32, 12, 32, 278, 9, 32, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 5, 33, 286, 8, 33, 10, 33, 12, 33, 289, 9, 33, 1, 34, 1, 34, 1, 34, 3, 34, 294, 8, 34, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 3, 35, 301, 8, 35, 1, 35, 0, 3, 8, 64, 66, 36, 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, 0, 7, 1, 0, 16, 17, 1, 0, 18, 19, 1, 0, 20, 21, 1, 0, 22, 23, 2, 0, 14, 15, 49, 68, 1, 0, 35, 36, 1, 0, 33, 34, 308, 0, 72, 1, 0, 0, 0, 2, 82, 1, 0, 0, 0, 4, 90, 1, 0, 0, 0, 6, 99, 1, 0, 0, 0, 8, 121, 1, 0, 0, 0, 10, 135, 1, 0, 0, 0, 12, 137, 1, 0, 0, 0, 14, 150, 1, 0, 0, 0, 16, 154, 1, 0, 0, 0, 18, 156, 1, 0, 0, 0, 20, 161, 1, 0, 0, 0, 22, 163, 1, 0, 0, 0, 24, 165, 1, 0, 0, 0, 26, 196, 1, 0, 0, 0, 28, 198, 1, 0, 0, 0, 30, 203, 1, 0, 0, 0, 32, 208, 1, 0, 0, 0, 34, 210, 1, 0, 0, 0, 36, 212, 1, 0, 0, 0, 38, 214, 1, 0, 0, 0, 40, 216, 1, 0, 0, 0, 42, 218, 1, 0, 0, 0, 44, 220, 1, 0, 0, 0, 46, 222, 1, 0, 0, 0, 48, 224, 1, 0, 0, 0, 50, 226, 1, 0, 0, 0, 52, 228, 1, 0, 0, 0, 54, 236, 1, 0, 0, 0, 56, 246, 1, 0, 0, 0, 58, 248, 1, 0, 0, 0, 60, 250, 1, 0, 0, 0, 62, 254, 1, 0, 0, 0, 64, 268, 1, 0, 0, 0, 66, 279, 1, 0, 0, 0, 68, 293, 1, 0, 0, 0, 70, 300, 1, 0, 0, 0, 72, 73, 3, 4, 2, 0, 73, 74, 5, 0, 0, 1, 74, 1, 1, 0, 0, 0, 75, 83, 3, 14, 7, 0, 76, 83, 3, 30, 15, 0, 77, 83, 3, 24, 12, 0, 78, 83, 3, 26, 13, 0, 79, 83, 3, 20, 10, 0, 80, 83, 3, 22, 11, 0, 81, 83, 3, 8, 4, 0, 82, 75, 1, 0, 0, 0, 82, 76, 1, 0, 0, 0, 82, 77, 1, 0, 0, 0, 82, 78, 1, 0, 0, 0, 82, 79, 1, 0, 0, 0, 82, 80, 1, 0, 0, 0, 82, 81, 1, 0, 0, 0, 83, 3, 1, 0, 0, 0, 84, 85, 3, 2, 1, 0, 85, 86, 5, 2, 0, 0, 86, 89, 1, 0, 0, 0, 87, 89, 5, 2, 0, 0, 88, 84, 1, 0, 0, 0, 88, 87, 1, 0, 0, 0, 89, 92, 1, 0, 0, 0, 90, 88, 1, 0, 0, 0, 90, 91, 1, 0, 0, 0, 91, 94, 1, 0, 0, 0, 92, 90, 1, 0, 0, 0, 93, 95, 3, 2, 1, 0, 94, 93, 1, 0, 0, 0, 94, 95, 1, 0, 0, 0, 95, 5, 1, 0, 0, 0, 96, 100, 3, 28, 14, 0, 97, 100, 3, 56, 28, 0, 98, 100, 3, 52, 26, 0, 99, 96, 1, 0, 0, 0, 99, 97, 1, 0, 0, 0, 99, 98, 1, 0, 0, 0, 100, 7, 1, 0, 0, 0, 101, 102, 6, 4, -1, 0, 102, 106, 3, 64, 32, 0, 103, 104, 3, 54, 27, 0, 104, 105, 3, 64, 32, 0, 105, 107, 1, 0, 0, 0, 106, 103, 1, 0, 0, 0, 107, 108, 1, 0, 0, 0, 108, 106, 1, 0, 0, 0, 108, 109, 1, 0, 0, 0, 109, 122, 1, 0, 0, 0, 110, 111, 3, 38, 19, 0, 111, 112, 3, 8, 4, 6, 112, 122, 1, 0, 0, 0, 113, 114, 5, 27, 0, 0, 114, 115, 3, 8, 4, 0, 115, 116, 5, 28, 0, 0, 116, 122, 1, 0, 0, 0, 117, 122, 3, 18, 9, 0, 118, 122, 3, 12, 6, 0, 119, 122, 3, 6, 3, 0, 120, 122, 3, 64, 32, 0, 121, 101, 1, 0, 0, 0, 121, 110, 1, 0, 0, 0, 121, 113, 1, 0, 0, 0, 121, 117, 1, 0, 0, 0, 121, 118, 1, 0, 0, 0, 121, 119, 1, 0, 0, 0, 121, 120, 1, 0, 0, 0, 122, 132, 1, 0, 0, 0, 123, 126, 10, 7, 0, 0, 124, 127, 3, 34, 17, 0, 125, 127, 3, 36, 18, 0, 126, 124, 1, 0, 0, 0, 126, 125, 1, 0, 0, 0, 127, 128, 1, 0, 0, 0, 128, 129, 3, 8, 4, 8, 129, 131, 1, 0, 0, 0, 130, 123, 1, 0, 0, 0, 131, 134, 1, 0, 0, 0, 132, 130, 1, 0, 0, 0, 132, 133, 1, 0, 0, 0, 133, 9, 1, 0, 0, 0, 134, 132, 1, 0, 0, 0, 135, 136, 3, 8, 4, 0, 136, 11, 1, 0, 0, 0, 137, 139, 5, 29, 0, 0, 138, 140, 3, 8, 4, 0, 139, 138, 1, 0, 0, 0, 139, 140, 1, 0, 0, 0, 140, 145, 1, 0, 0, 0, 141, 142, 5, 26, 0, 0, 142, 144, 3, 8, 4, 0, 143, 141, 1, 0, 0, 0, 144, 147, 1, 0, 0, 0, 145, 143, 1, 0, 0, 0, 145, 146, 1, 0, 0, 0, 146, 148, 1, 0, 0, 0, 147, 145, 1, 0, 0, 0, 148, 149, 5, 30, 0, 0, 149, 13, 1, 0, 0, 0, 150, 151, 5, 69, 0, 0, 151, 152, 5, 38, 0, 0, 152, 153, 3, 8, 4, 0, 153, 15, 1, 0, 0, 0, 154, 155, 5, 69, 0, 0, 155, 17, 1, 0, 0, 0, 156, 157, 3, 16, 8, 0, 157, 158, 5, 29, 0, 0, 158, 159, 5, 45, 0, 0, 159, 160, 5, 30, 0, 0, 160, 19, 1, 0, 0, 0, 161, 162, 5, 11, 0, 0, 162, 21, 1, 0, 0, 0, 163, 164, 5, 12, 0, 0, 164, 23, 1, 0, 0, 0, 165, 166, 5, 8, 0, 0, 166, 167, 5, 27, 0, 0, 167, 168, 3, 10, 5, 0, 168, 169, 5, 28, 0, 0, 169, 170, 5, 31, 0, 0, 170, 171, 3, 4, 2, 0, 171, 172, 5, 32, 0, 0, 172, 25, 1, 0, 0, 0, 173, 174, 5, 6, 0, 0, 174, 175, 5, 27, 0, 0, 175, 176, 3, 10, 5, 0, 176, 177, 5, 28, 0, 0, 177, 178, 5, 31, 0, 0, 178, 179, 3, 4, 2, 0, 179, 180, 5, 32, 0, 0, 180, 197, 1, 0, 0, 0, 181, 182, 5, 6, 0, 0, 182, 183, 5, 27, 0, 0, 183, 184, 3, 10, 5, 0, 184, 185, 5, 28, 0, 0, 185, 186, 5, 31, 0, 0, 186, 187, 3, 4, 2, 0, 187, 189, 5, 32, 0, 0, 188, 190, 5, 2, 0, 0, 189, 188, 1, 0, 0, 0, 189, 190, 1, 0, 0, 0, 190, 191, 1, 0, 0, 0, 191, 192, 5, 7, 0, 0, 192, 193, 5, 31, 0, 0, 193, 194, 3, 4, 2, 0, 194, 195, 5, 32, 0, 0, 195, 197, 1, 0, 0, 0, 196, 173, 1, 0, 0, 0, 196, 181, 1, 0, 0, 0, 197, 27, 1, 0, 0, 0, 198, 199, 5, 13, 0, 0, 199, 200, 5, 27, 0, 0, 200, 201, 5, 45, 0, 0, 201, 202, 5, 28, 0, 0, 202, 29, 1, 0, 0, 0, 203, 204, 5, 5, 0, 0, 204, 205, 5, 31, 0, 0, 205, 206, 3, 4, 2, 0, 206, 207, 5, 32, 0, 0, 207, 31, 1, 0, 0, 0, 208, 209, 3, 8, 4, 0, 209, 33, 1, 0, 0, 0, 210, 211, 7, 0, 0, 0, 211, 35, 1, 0, 0, 0, 212, 213, 7, 1, 0, 0, 213, 37, 1, 0, 0, 0, 214, 215, 7, 2, 0, 0, 215, 39, 1, 0, 0, 0, 216, 217, 5, 39, 0, 0, 217, 41, 1, 0, 0, 0, 218, 219, 5, 40, 0, 0, 219, 43, 1, 0, 0, 0, 220, 221, 5, 41, 0, 0, 221, 45, 1, 0, 0, 0, 222, 223, 5, 42, 0, 0, 223, 47, 1, 0, 0, 0, 224, 225, 5, 43, 0, 0, 225, 49, 1, 0, 0, 0, 226, 227, 5, 44, 0, 0, 227, 51, 1, 0, 0, 0, 228, 229, 7, 3, 0, 0, 229, 53, 1, 0, 0, 0, 230, 237, 3, 40, 20, 0, 231, 237, 3, 42, 21, 0, 232, 237, 3, 44, 22, 0, 233, 237, 3, 46, 23, 0, 234, 237, 3, 48, 24, 0, 235, 237, 3, 50, 25, 0, 236, 230, 1, 0, 0, 0, 236, 231, 1, 0, 0, 0, 236, 232, 1, 0, 0, 0, 236, 233, 1, 0, 0, 0, 236, 234, 1, 0, 0, 0, 236, 235, 1, 0, 0, 0, 237, 55, 1, 0, 0, 0, 238, 247, 5, 45, 0, 0, 239, 247, 5, 46, 0, 0, 240, 247, 5, 47, 0, 0, 241, 247, 5, 48, 0, 0, 242, 247, 3, 16, 8, 0, 243, 247, 3, 60, 30, 0, 244, 247, 3, 62, 31, 0, 245, 247, 3, 12, 6, 0, 246, 238, 1, 0, 0, 0, 246, 239, 1, 0, 0, 0, 246, 240, 1, 0, 0, 0, 246, 241, 1, 0, 0, 0, 246, 242, 1, 0, 0, 0, 246, 243, 1, 0, 0, 0, 246, 244, 1, 0, 0, 0, 246, 245, 1, 0, 0, 0, 247, 57, 1, 0, 0, 0, 248, 249, 7, 4, 0, 0, 249, 59, 1, 0, 0, 0, 250, 251, 5, 27, 0, 0, 251, 252, 3, 64, 32, 0, 252, 253, 5, 28, 0, 0, 253, 61, 1, 0, 0, 0, 254, 255, 3, 58, 29, 0, 255, 264, 5, 27, 0, 0, 256, 261, 3, 64, 32, 0, 257, 258, 5, 26, 0, 0, 258, 260, 3, 64, 32, 0, 259, 257, 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, 256, 1, 0, 0, 0, 264, 265, 1, 0, 0, 0, 265, 266, 1, 0, 0, 0, 266, 267, 5, 28, 0, 0, 267, 63, 1, 0, 0, 0, 268, 269, 6, 32, -1, 0, 269, 270, 3, 66, 33, 0, 270, 276, 1, 0, 0, 0, 271, 272, 10, 1, 0, 0, 272, 273, 7, 5, 0, 0, 273, 275, 3, 66, 33, 0, 274, 271, 1, 0, 0, 0, 275, 278, 1, 0, 0, 0, 276, 274, 1, 0, 0, 0, 276, 277, 1, 0, 0, 0, 277, 65, 1, 0, 0, 0, 278, 276, 1, 0, 0, 0, 279, 280, 6, 33, -1, 0, 280, 281, 3, 68, 34, 0, 281, 287, 1, 0, 0, 0, 282, 283, 10, 1, 0, 0, 283, 284, 7, 6, 0, 0, 284, 286, 3, 68, 34, 0, 285, 282, 1, 0, 0, 0, 286, 289, 1, 0, 0, 0, 287, 285, 1, 0, 0, 0, 287, 288, 1, 0, 0, 0, 288, 67, 1, 0, 0, 0, 289, 287, 1, 0, 0, 0, 290, 294, 3, 70, 35, 0, 291, 292, 7, 5, 0, 0, 292, 294, 3, 70, 35, 0, 293, 290, 1, 0, 0, 0, 293, 291, 1, 0, 0, 0, 294, 69, 1, 0, 0, 0, 295, 301, 3, 6, 3, 0, 296, 297, 3, 6, 3, 0, 297, 298, 5, 37, 0, 0, 298, 299, 3, 68, 34, 0, 299, 301, 1, 0, 0, 0, 300, 295, 1, 0, 0, 0, 300, 296, 1, 0, 0, 0, 301, 71, 1, 0, 0, 0, 21, 82, 88, 90, 94, 99, 108, 121, 126, 132, 139, 145, 189, 196, 236, 246, 261, 264, 276, 287, 293, 300] \ No newline at end of file +[4, 1, 69, 304, 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, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 83, 8, 1, 1, 2, 1, 2, 1, 2, 1, 2, 5, 2, 89, 8, 2, 10, 2, 12, 2, 92, 9, 2, 1, 2, 3, 2, 95, 8, 2, 1, 3, 1, 3, 1, 3, 3, 3, 100, 8, 3, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 4, 4, 107, 8, 4, 11, 4, 12, 4, 108, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 3, 4, 122, 8, 4, 1, 4, 1, 4, 1, 4, 3, 4, 127, 8, 4, 1, 4, 1, 4, 5, 4, 131, 8, 4, 10, 4, 12, 4, 134, 9, 4, 1, 5, 1, 5, 1, 6, 1, 6, 3, 6, 140, 8, 6, 1, 6, 1, 6, 5, 6, 144, 8, 6, 10, 6, 12, 6, 147, 9, 6, 1, 6, 1, 6, 1, 7, 1, 7, 1, 7, 1, 7, 1, 8, 1, 8, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 10, 1, 10, 1, 11, 1, 11, 1, 12, 1, 12, 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, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 3, 13, 190, 8, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 3, 13, 197, 8, 13, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 16, 1, 16, 1, 17, 1, 17, 1, 18, 1, 18, 1, 19, 1, 19, 1, 20, 1, 20, 1, 21, 1, 21, 1, 22, 1, 22, 1, 23, 1, 23, 1, 24, 1, 24, 1, 25, 1, 25, 1, 26, 1, 26, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 3, 27, 237, 8, 27, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 3, 28, 248, 8, 28, 1, 29, 1, 29, 1, 30, 1, 30, 1, 30, 1, 30, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 5, 31, 261, 8, 31, 10, 31, 12, 31, 264, 9, 31, 3, 31, 266, 8, 31, 1, 31, 1, 31, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 5, 32, 276, 8, 32, 10, 32, 12, 32, 279, 9, 32, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 5, 33, 287, 8, 33, 10, 33, 12, 33, 290, 9, 33, 1, 34, 1, 34, 1, 34, 3, 34, 295, 8, 34, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 3, 35, 302, 8, 35, 1, 35, 0, 3, 8, 64, 66, 36, 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, 0, 7, 1, 0, 16, 17, 1, 0, 18, 19, 1, 0, 20, 21, 1, 0, 22, 23, 2, 0, 14, 15, 49, 68, 1, 0, 35, 36, 1, 0, 33, 34, 310, 0, 72, 1, 0, 0, 0, 2, 82, 1, 0, 0, 0, 4, 90, 1, 0, 0, 0, 6, 99, 1, 0, 0, 0, 8, 121, 1, 0, 0, 0, 10, 135, 1, 0, 0, 0, 12, 137, 1, 0, 0, 0, 14, 150, 1, 0, 0, 0, 16, 154, 1, 0, 0, 0, 18, 156, 1, 0, 0, 0, 20, 161, 1, 0, 0, 0, 22, 163, 1, 0, 0, 0, 24, 165, 1, 0, 0, 0, 26, 196, 1, 0, 0, 0, 28, 198, 1, 0, 0, 0, 30, 203, 1, 0, 0, 0, 32, 208, 1, 0, 0, 0, 34, 210, 1, 0, 0, 0, 36, 212, 1, 0, 0, 0, 38, 214, 1, 0, 0, 0, 40, 216, 1, 0, 0, 0, 42, 218, 1, 0, 0, 0, 44, 220, 1, 0, 0, 0, 46, 222, 1, 0, 0, 0, 48, 224, 1, 0, 0, 0, 50, 226, 1, 0, 0, 0, 52, 228, 1, 0, 0, 0, 54, 236, 1, 0, 0, 0, 56, 247, 1, 0, 0, 0, 58, 249, 1, 0, 0, 0, 60, 251, 1, 0, 0, 0, 62, 255, 1, 0, 0, 0, 64, 269, 1, 0, 0, 0, 66, 280, 1, 0, 0, 0, 68, 294, 1, 0, 0, 0, 70, 301, 1, 0, 0, 0, 72, 73, 3, 4, 2, 0, 73, 74, 5, 0, 0, 1, 74, 1, 1, 0, 0, 0, 75, 83, 3, 14, 7, 0, 76, 83, 3, 30, 15, 0, 77, 83, 3, 24, 12, 0, 78, 83, 3, 26, 13, 0, 79, 83, 3, 20, 10, 0, 80, 83, 3, 22, 11, 0, 81, 83, 3, 8, 4, 0, 82, 75, 1, 0, 0, 0, 82, 76, 1, 0, 0, 0, 82, 77, 1, 0, 0, 0, 82, 78, 1, 0, 0, 0, 82, 79, 1, 0, 0, 0, 82, 80, 1, 0, 0, 0, 82, 81, 1, 0, 0, 0, 83, 3, 1, 0, 0, 0, 84, 85, 3, 2, 1, 0, 85, 86, 5, 2, 0, 0, 86, 89, 1, 0, 0, 0, 87, 89, 5, 2, 0, 0, 88, 84, 1, 0, 0, 0, 88, 87, 1, 0, 0, 0, 89, 92, 1, 0, 0, 0, 90, 88, 1, 0, 0, 0, 90, 91, 1, 0, 0, 0, 91, 94, 1, 0, 0, 0, 92, 90, 1, 0, 0, 0, 93, 95, 3, 2, 1, 0, 94, 93, 1, 0, 0, 0, 94, 95, 1, 0, 0, 0, 95, 5, 1, 0, 0, 0, 96, 100, 3, 28, 14, 0, 97, 100, 3, 56, 28, 0, 98, 100, 3, 52, 26, 0, 99, 96, 1, 0, 0, 0, 99, 97, 1, 0, 0, 0, 99, 98, 1, 0, 0, 0, 100, 7, 1, 0, 0, 0, 101, 102, 6, 4, -1, 0, 102, 106, 3, 64, 32, 0, 103, 104, 3, 54, 27, 0, 104, 105, 3, 64, 32, 0, 105, 107, 1, 0, 0, 0, 106, 103, 1, 0, 0, 0, 107, 108, 1, 0, 0, 0, 108, 106, 1, 0, 0, 0, 108, 109, 1, 0, 0, 0, 109, 122, 1, 0, 0, 0, 110, 111, 3, 38, 19, 0, 111, 112, 3, 8, 4, 6, 112, 122, 1, 0, 0, 0, 113, 114, 5, 27, 0, 0, 114, 115, 3, 8, 4, 0, 115, 116, 5, 28, 0, 0, 116, 122, 1, 0, 0, 0, 117, 122, 3, 18, 9, 0, 118, 122, 3, 12, 6, 0, 119, 122, 3, 6, 3, 0, 120, 122, 3, 64, 32, 0, 121, 101, 1, 0, 0, 0, 121, 110, 1, 0, 0, 0, 121, 113, 1, 0, 0, 0, 121, 117, 1, 0, 0, 0, 121, 118, 1, 0, 0, 0, 121, 119, 1, 0, 0, 0, 121, 120, 1, 0, 0, 0, 122, 132, 1, 0, 0, 0, 123, 126, 10, 7, 0, 0, 124, 127, 3, 34, 17, 0, 125, 127, 3, 36, 18, 0, 126, 124, 1, 0, 0, 0, 126, 125, 1, 0, 0, 0, 127, 128, 1, 0, 0, 0, 128, 129, 3, 8, 4, 8, 129, 131, 1, 0, 0, 0, 130, 123, 1, 0, 0, 0, 131, 134, 1, 0, 0, 0, 132, 130, 1, 0, 0, 0, 132, 133, 1, 0, 0, 0, 133, 9, 1, 0, 0, 0, 134, 132, 1, 0, 0, 0, 135, 136, 3, 8, 4, 0, 136, 11, 1, 0, 0, 0, 137, 139, 5, 29, 0, 0, 138, 140, 3, 8, 4, 0, 139, 138, 1, 0, 0, 0, 139, 140, 1, 0, 0, 0, 140, 145, 1, 0, 0, 0, 141, 142, 5, 26, 0, 0, 142, 144, 3, 8, 4, 0, 143, 141, 1, 0, 0, 0, 144, 147, 1, 0, 0, 0, 145, 143, 1, 0, 0, 0, 145, 146, 1, 0, 0, 0, 146, 148, 1, 0, 0, 0, 147, 145, 1, 0, 0, 0, 148, 149, 5, 30, 0, 0, 149, 13, 1, 0, 0, 0, 150, 151, 5, 69, 0, 0, 151, 152, 5, 38, 0, 0, 152, 153, 3, 8, 4, 0, 153, 15, 1, 0, 0, 0, 154, 155, 5, 69, 0, 0, 155, 17, 1, 0, 0, 0, 156, 157, 3, 16, 8, 0, 157, 158, 5, 29, 0, 0, 158, 159, 5, 45, 0, 0, 159, 160, 5, 30, 0, 0, 160, 19, 1, 0, 0, 0, 161, 162, 5, 11, 0, 0, 162, 21, 1, 0, 0, 0, 163, 164, 5, 12, 0, 0, 164, 23, 1, 0, 0, 0, 165, 166, 5, 8, 0, 0, 166, 167, 5, 27, 0, 0, 167, 168, 3, 10, 5, 0, 168, 169, 5, 28, 0, 0, 169, 170, 5, 31, 0, 0, 170, 171, 3, 4, 2, 0, 171, 172, 5, 32, 0, 0, 172, 25, 1, 0, 0, 0, 173, 174, 5, 6, 0, 0, 174, 175, 5, 27, 0, 0, 175, 176, 3, 10, 5, 0, 176, 177, 5, 28, 0, 0, 177, 178, 5, 31, 0, 0, 178, 179, 3, 4, 2, 0, 179, 180, 5, 32, 0, 0, 180, 197, 1, 0, 0, 0, 181, 182, 5, 6, 0, 0, 182, 183, 5, 27, 0, 0, 183, 184, 3, 10, 5, 0, 184, 185, 5, 28, 0, 0, 185, 186, 5, 31, 0, 0, 186, 187, 3, 4, 2, 0, 187, 189, 5, 32, 0, 0, 188, 190, 5, 2, 0, 0, 189, 188, 1, 0, 0, 0, 189, 190, 1, 0, 0, 0, 190, 191, 1, 0, 0, 0, 191, 192, 5, 7, 0, 0, 192, 193, 5, 31, 0, 0, 193, 194, 3, 4, 2, 0, 194, 195, 5, 32, 0, 0, 195, 197, 1, 0, 0, 0, 196, 173, 1, 0, 0, 0, 196, 181, 1, 0, 0, 0, 197, 27, 1, 0, 0, 0, 198, 199, 5, 13, 0, 0, 199, 200, 5, 27, 0, 0, 200, 201, 5, 45, 0, 0, 201, 202, 5, 28, 0, 0, 202, 29, 1, 0, 0, 0, 203, 204, 5, 5, 0, 0, 204, 205, 5, 31, 0, 0, 205, 206, 3, 4, 2, 0, 206, 207, 5, 32, 0, 0, 207, 31, 1, 0, 0, 0, 208, 209, 3, 8, 4, 0, 209, 33, 1, 0, 0, 0, 210, 211, 7, 0, 0, 0, 211, 35, 1, 0, 0, 0, 212, 213, 7, 1, 0, 0, 213, 37, 1, 0, 0, 0, 214, 215, 7, 2, 0, 0, 215, 39, 1, 0, 0, 0, 216, 217, 5, 39, 0, 0, 217, 41, 1, 0, 0, 0, 218, 219, 5, 40, 0, 0, 219, 43, 1, 0, 0, 0, 220, 221, 5, 41, 0, 0, 221, 45, 1, 0, 0, 0, 222, 223, 5, 42, 0, 0, 223, 47, 1, 0, 0, 0, 224, 225, 5, 43, 0, 0, 225, 49, 1, 0, 0, 0, 226, 227, 5, 44, 0, 0, 227, 51, 1, 0, 0, 0, 228, 229, 7, 3, 0, 0, 229, 53, 1, 0, 0, 0, 230, 237, 3, 40, 20, 0, 231, 237, 3, 42, 21, 0, 232, 237, 3, 44, 22, 0, 233, 237, 3, 46, 23, 0, 234, 237, 3, 48, 24, 0, 235, 237, 3, 50, 25, 0, 236, 230, 1, 0, 0, 0, 236, 231, 1, 0, 0, 0, 236, 232, 1, 0, 0, 0, 236, 233, 1, 0, 0, 0, 236, 234, 1, 0, 0, 0, 236, 235, 1, 0, 0, 0, 237, 55, 1, 0, 0, 0, 238, 248, 5, 45, 0, 0, 239, 248, 5, 46, 0, 0, 240, 248, 5, 47, 0, 0, 241, 248, 5, 48, 0, 0, 242, 248, 3, 16, 8, 0, 243, 248, 3, 60, 30, 0, 244, 248, 3, 62, 31, 0, 245, 248, 3, 12, 6, 0, 246, 248, 3, 18, 9, 0, 247, 238, 1, 0, 0, 0, 247, 239, 1, 0, 0, 0, 247, 240, 1, 0, 0, 0, 247, 241, 1, 0, 0, 0, 247, 242, 1, 0, 0, 0, 247, 243, 1, 0, 0, 0, 247, 244, 1, 0, 0, 0, 247, 245, 1, 0, 0, 0, 247, 246, 1, 0, 0, 0, 248, 57, 1, 0, 0, 0, 249, 250, 7, 4, 0, 0, 250, 59, 1, 0, 0, 0, 251, 252, 5, 27, 0, 0, 252, 253, 3, 64, 32, 0, 253, 254, 5, 28, 0, 0, 254, 61, 1, 0, 0, 0, 255, 256, 3, 58, 29, 0, 256, 265, 5, 27, 0, 0, 257, 262, 3, 64, 32, 0, 258, 259, 5, 26, 0, 0, 259, 261, 3, 64, 32, 0, 260, 258, 1, 0, 0, 0, 261, 264, 1, 0, 0, 0, 262, 260, 1, 0, 0, 0, 262, 263, 1, 0, 0, 0, 263, 266, 1, 0, 0, 0, 264, 262, 1, 0, 0, 0, 265, 257, 1, 0, 0, 0, 265, 266, 1, 0, 0, 0, 266, 267, 1, 0, 0, 0, 267, 268, 5, 28, 0, 0, 268, 63, 1, 0, 0, 0, 269, 270, 6, 32, -1, 0, 270, 271, 3, 66, 33, 0, 271, 277, 1, 0, 0, 0, 272, 273, 10, 1, 0, 0, 273, 274, 7, 5, 0, 0, 274, 276, 3, 66, 33, 0, 275, 272, 1, 0, 0, 0, 276, 279, 1, 0, 0, 0, 277, 275, 1, 0, 0, 0, 277, 278, 1, 0, 0, 0, 278, 65, 1, 0, 0, 0, 279, 277, 1, 0, 0, 0, 280, 281, 6, 33, -1, 0, 281, 282, 3, 68, 34, 0, 282, 288, 1, 0, 0, 0, 283, 284, 10, 1, 0, 0, 284, 285, 7, 6, 0, 0, 285, 287, 3, 68, 34, 0, 286, 283, 1, 0, 0, 0, 287, 290, 1, 0, 0, 0, 288, 286, 1, 0, 0, 0, 288, 289, 1, 0, 0, 0, 289, 67, 1, 0, 0, 0, 290, 288, 1, 0, 0, 0, 291, 295, 3, 70, 35, 0, 292, 293, 7, 5, 0, 0, 293, 295, 3, 70, 35, 0, 294, 291, 1, 0, 0, 0, 294, 292, 1, 0, 0, 0, 295, 69, 1, 0, 0, 0, 296, 302, 3, 6, 3, 0, 297, 298, 3, 6, 3, 0, 298, 299, 5, 37, 0, 0, 299, 300, 3, 68, 34, 0, 300, 302, 1, 0, 0, 0, 301, 296, 1, 0, 0, 0, 301, 297, 1, 0, 0, 0, 302, 71, 1, 0, 0, 0, 21, 82, 88, 90, 94, 99, 108, 121, 126, 132, 139, 145, 189, 196, 236, 247, 262, 265, 277, 288, 294, 301] \ No newline at end of file diff --git a/src/oqd_core/frontend/atomic/AtomicParser.py b/src/oqd_core/frontend/atomic/AtomicParser.py index e657e348..af9ea602 100644 --- a/src/oqd_core/frontend/atomic/AtomicParser.py +++ b/src/oqd_core/frontend/atomic/AtomicParser.py @@ -10,7 +10,7 @@ def serializedATN(): return [ - 4,1,69,303,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, + 4,1,69,304,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, @@ -28,38 +28,38 @@ def serializedATN(): 1,14,1,14,1,15,1,15,1,15,1,15,1,15,1,16,1,16,1,17,1,17,1,18,1,18, 1,19,1,19,1,20,1,20,1,21,1,21,1,22,1,22,1,23,1,23,1,24,1,24,1,25, 1,25,1,26,1,26,1,27,1,27,1,27,1,27,1,27,1,27,3,27,237,8,27,1,28, - 1,28,1,28,1,28,1,28,1,28,1,28,1,28,3,28,247,8,28,1,29,1,29,1,30, - 1,30,1,30,1,30,1,31,1,31,1,31,1,31,1,31,5,31,260,8,31,10,31,12,31, - 263,9,31,3,31,265,8,31,1,31,1,31,1,32,1,32,1,32,1,32,1,32,1,32,5, - 32,275,8,32,10,32,12,32,278,9,32,1,33,1,33,1,33,1,33,1,33,1,33,5, - 33,286,8,33,10,33,12,33,289,9,33,1,34,1,34,1,34,3,34,294,8,34,1, - 35,1,35,1,35,1,35,1,35,3,35,301,8,35,1,35,0,3,8,64,66,36,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,0,7,1,0,16,17,1,0,18,19,1,0,20,21, - 1,0,22,23,2,0,14,15,49,68,1,0,35,36,1,0,33,34,308,0,72,1,0,0,0,2, - 82,1,0,0,0,4,90,1,0,0,0,6,99,1,0,0,0,8,121,1,0,0,0,10,135,1,0,0, - 0,12,137,1,0,0,0,14,150,1,0,0,0,16,154,1,0,0,0,18,156,1,0,0,0,20, - 161,1,0,0,0,22,163,1,0,0,0,24,165,1,0,0,0,26,196,1,0,0,0,28,198, - 1,0,0,0,30,203,1,0,0,0,32,208,1,0,0,0,34,210,1,0,0,0,36,212,1,0, - 0,0,38,214,1,0,0,0,40,216,1,0,0,0,42,218,1,0,0,0,44,220,1,0,0,0, - 46,222,1,0,0,0,48,224,1,0,0,0,50,226,1,0,0,0,52,228,1,0,0,0,54,236, - 1,0,0,0,56,246,1,0,0,0,58,248,1,0,0,0,60,250,1,0,0,0,62,254,1,0, - 0,0,64,268,1,0,0,0,66,279,1,0,0,0,68,293,1,0,0,0,70,300,1,0,0,0, - 72,73,3,4,2,0,73,74,5,0,0,1,74,1,1,0,0,0,75,83,3,14,7,0,76,83,3, - 30,15,0,77,83,3,24,12,0,78,83,3,26,13,0,79,83,3,20,10,0,80,83,3, - 22,11,0,81,83,3,8,4,0,82,75,1,0,0,0,82,76,1,0,0,0,82,77,1,0,0,0, - 82,78,1,0,0,0,82,79,1,0,0,0,82,80,1,0,0,0,82,81,1,0,0,0,83,3,1,0, - 0,0,84,85,3,2,1,0,85,86,5,2,0,0,86,89,1,0,0,0,87,89,5,2,0,0,88,84, - 1,0,0,0,88,87,1,0,0,0,89,92,1,0,0,0,90,88,1,0,0,0,90,91,1,0,0,0, - 91,94,1,0,0,0,92,90,1,0,0,0,93,95,3,2,1,0,94,93,1,0,0,0,94,95,1, - 0,0,0,95,5,1,0,0,0,96,100,3,28,14,0,97,100,3,56,28,0,98,100,3,52, - 26,0,99,96,1,0,0,0,99,97,1,0,0,0,99,98,1,0,0,0,100,7,1,0,0,0,101, - 102,6,4,-1,0,102,106,3,64,32,0,103,104,3,54,27,0,104,105,3,64,32, - 0,105,107,1,0,0,0,106,103,1,0,0,0,107,108,1,0,0,0,108,106,1,0,0, - 0,108,109,1,0,0,0,109,122,1,0,0,0,110,111,3,38,19,0,111,112,3,8, - 4,6,112,122,1,0,0,0,113,114,5,27,0,0,114,115,3,8,4,0,115,116,5,28, - 0,0,116,122,1,0,0,0,117,122,3,18,9,0,118,122,3,12,6,0,119,122,3, - 6,3,0,120,122,3,64,32,0,121,101,1,0,0,0,121,110,1,0,0,0,121,113, + 1,28,1,28,1,28,1,28,1,28,1,28,1,28,1,28,3,28,248,8,28,1,29,1,29, + 1,30,1,30,1,30,1,30,1,31,1,31,1,31,1,31,1,31,5,31,261,8,31,10,31, + 12,31,264,9,31,3,31,266,8,31,1,31,1,31,1,32,1,32,1,32,1,32,1,32, + 1,32,5,32,276,8,32,10,32,12,32,279,9,32,1,33,1,33,1,33,1,33,1,33, + 1,33,5,33,287,8,33,10,33,12,33,290,9,33,1,34,1,34,1,34,3,34,295, + 8,34,1,35,1,35,1,35,1,35,1,35,3,35,302,8,35,1,35,0,3,8,64,66,36, + 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,0,7,1,0,16,17,1,0,18,19,1, + 0,20,21,1,0,22,23,2,0,14,15,49,68,1,0,35,36,1,0,33,34,310,0,72,1, + 0,0,0,2,82,1,0,0,0,4,90,1,0,0,0,6,99,1,0,0,0,8,121,1,0,0,0,10,135, + 1,0,0,0,12,137,1,0,0,0,14,150,1,0,0,0,16,154,1,0,0,0,18,156,1,0, + 0,0,20,161,1,0,0,0,22,163,1,0,0,0,24,165,1,0,0,0,26,196,1,0,0,0, + 28,198,1,0,0,0,30,203,1,0,0,0,32,208,1,0,0,0,34,210,1,0,0,0,36,212, + 1,0,0,0,38,214,1,0,0,0,40,216,1,0,0,0,42,218,1,0,0,0,44,220,1,0, + 0,0,46,222,1,0,0,0,48,224,1,0,0,0,50,226,1,0,0,0,52,228,1,0,0,0, + 54,236,1,0,0,0,56,247,1,0,0,0,58,249,1,0,0,0,60,251,1,0,0,0,62,255, + 1,0,0,0,64,269,1,0,0,0,66,280,1,0,0,0,68,294,1,0,0,0,70,301,1,0, + 0,0,72,73,3,4,2,0,73,74,5,0,0,1,74,1,1,0,0,0,75,83,3,14,7,0,76,83, + 3,30,15,0,77,83,3,24,12,0,78,83,3,26,13,0,79,83,3,20,10,0,80,83, + 3,22,11,0,81,83,3,8,4,0,82,75,1,0,0,0,82,76,1,0,0,0,82,77,1,0,0, + 0,82,78,1,0,0,0,82,79,1,0,0,0,82,80,1,0,0,0,82,81,1,0,0,0,83,3,1, + 0,0,0,84,85,3,2,1,0,85,86,5,2,0,0,86,89,1,0,0,0,87,89,5,2,0,0,88, + 84,1,0,0,0,88,87,1,0,0,0,89,92,1,0,0,0,90,88,1,0,0,0,90,91,1,0,0, + 0,91,94,1,0,0,0,92,90,1,0,0,0,93,95,3,2,1,0,94,93,1,0,0,0,94,95, + 1,0,0,0,95,5,1,0,0,0,96,100,3,28,14,0,97,100,3,56,28,0,98,100,3, + 52,26,0,99,96,1,0,0,0,99,97,1,0,0,0,99,98,1,0,0,0,100,7,1,0,0,0, + 101,102,6,4,-1,0,102,106,3,64,32,0,103,104,3,54,27,0,104,105,3,64, + 32,0,105,107,1,0,0,0,106,103,1,0,0,0,107,108,1,0,0,0,108,106,1,0, + 0,0,108,109,1,0,0,0,109,122,1,0,0,0,110,111,3,38,19,0,111,112,3, + 8,4,6,112,122,1,0,0,0,113,114,5,27,0,0,114,115,3,8,4,0,115,116,5, + 28,0,0,116,122,1,0,0,0,117,122,3,18,9,0,118,122,3,12,6,0,119,122, + 3,6,3,0,120,122,3,64,32,0,121,101,1,0,0,0,121,110,1,0,0,0,121,113, 1,0,0,0,121,117,1,0,0,0,121,118,1,0,0,0,121,119,1,0,0,0,121,120, 1,0,0,0,122,132,1,0,0,0,123,126,10,7,0,0,124,127,3,34,17,0,125,127, 3,36,18,0,126,124,1,0,0,0,126,125,1,0,0,0,127,128,1,0,0,0,128,129, @@ -92,28 +92,29 @@ def serializedATN(): 0,0,228,229,7,3,0,0,229,53,1,0,0,0,230,237,3,40,20,0,231,237,3,42, 21,0,232,237,3,44,22,0,233,237,3,46,23,0,234,237,3,48,24,0,235,237, 3,50,25,0,236,230,1,0,0,0,236,231,1,0,0,0,236,232,1,0,0,0,236,233, - 1,0,0,0,236,234,1,0,0,0,236,235,1,0,0,0,237,55,1,0,0,0,238,247,5, - 45,0,0,239,247,5,46,0,0,240,247,5,47,0,0,241,247,5,48,0,0,242,247, - 3,16,8,0,243,247,3,60,30,0,244,247,3,62,31,0,245,247,3,12,6,0,246, - 238,1,0,0,0,246,239,1,0,0,0,246,240,1,0,0,0,246,241,1,0,0,0,246, - 242,1,0,0,0,246,243,1,0,0,0,246,244,1,0,0,0,246,245,1,0,0,0,247, - 57,1,0,0,0,248,249,7,4,0,0,249,59,1,0,0,0,250,251,5,27,0,0,251,252, - 3,64,32,0,252,253,5,28,0,0,253,61,1,0,0,0,254,255,3,58,29,0,255, - 264,5,27,0,0,256,261,3,64,32,0,257,258,5,26,0,0,258,260,3,64,32, - 0,259,257,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,256,1,0,0,0,264,265,1,0,0, - 0,265,266,1,0,0,0,266,267,5,28,0,0,267,63,1,0,0,0,268,269,6,32,-1, - 0,269,270,3,66,33,0,270,276,1,0,0,0,271,272,10,1,0,0,272,273,7,5, - 0,0,273,275,3,66,33,0,274,271,1,0,0,0,275,278,1,0,0,0,276,274,1, - 0,0,0,276,277,1,0,0,0,277,65,1,0,0,0,278,276,1,0,0,0,279,280,6,33, - -1,0,280,281,3,68,34,0,281,287,1,0,0,0,282,283,10,1,0,0,283,284, - 7,6,0,0,284,286,3,68,34,0,285,282,1,0,0,0,286,289,1,0,0,0,287,285, - 1,0,0,0,287,288,1,0,0,0,288,67,1,0,0,0,289,287,1,0,0,0,290,294,3, - 70,35,0,291,292,7,5,0,0,292,294,3,70,35,0,293,290,1,0,0,0,293,291, - 1,0,0,0,294,69,1,0,0,0,295,301,3,6,3,0,296,297,3,6,3,0,297,298,5, - 37,0,0,298,299,3,68,34,0,299,301,1,0,0,0,300,295,1,0,0,0,300,296, - 1,0,0,0,301,71,1,0,0,0,21,82,88,90,94,99,108,121,126,132,139,145, - 189,196,236,246,261,264,276,287,293,300 + 1,0,0,0,236,234,1,0,0,0,236,235,1,0,0,0,237,55,1,0,0,0,238,248,5, + 45,0,0,239,248,5,46,0,0,240,248,5,47,0,0,241,248,5,48,0,0,242,248, + 3,16,8,0,243,248,3,60,30,0,244,248,3,62,31,0,245,248,3,12,6,0,246, + 248,3,18,9,0,247,238,1,0,0,0,247,239,1,0,0,0,247,240,1,0,0,0,247, + 241,1,0,0,0,247,242,1,0,0,0,247,243,1,0,0,0,247,244,1,0,0,0,247, + 245,1,0,0,0,247,246,1,0,0,0,248,57,1,0,0,0,249,250,7,4,0,0,250,59, + 1,0,0,0,251,252,5,27,0,0,252,253,3,64,32,0,253,254,5,28,0,0,254, + 61,1,0,0,0,255,256,3,58,29,0,256,265,5,27,0,0,257,262,3,64,32,0, + 258,259,5,26,0,0,259,261,3,64,32,0,260,258,1,0,0,0,261,264,1,0,0, + 0,262,260,1,0,0,0,262,263,1,0,0,0,263,266,1,0,0,0,264,262,1,0,0, + 0,265,257,1,0,0,0,265,266,1,0,0,0,266,267,1,0,0,0,267,268,5,28,0, + 0,268,63,1,0,0,0,269,270,6,32,-1,0,270,271,3,66,33,0,271,277,1,0, + 0,0,272,273,10,1,0,0,273,274,7,5,0,0,274,276,3,66,33,0,275,272,1, + 0,0,0,276,279,1,0,0,0,277,275,1,0,0,0,277,278,1,0,0,0,278,65,1,0, + 0,0,279,277,1,0,0,0,280,281,6,33,-1,0,281,282,3,68,34,0,282,288, + 1,0,0,0,283,284,10,1,0,0,284,285,7,6,0,0,285,287,3,68,34,0,286,283, + 1,0,0,0,287,290,1,0,0,0,288,286,1,0,0,0,288,289,1,0,0,0,289,67,1, + 0,0,0,290,288,1,0,0,0,291,295,3,70,35,0,292,293,7,5,0,0,293,295, + 3,70,35,0,294,291,1,0,0,0,294,292,1,0,0,0,295,69,1,0,0,0,296,302, + 3,6,3,0,297,298,3,6,3,0,298,299,5,37,0,0,299,300,3,68,34,0,300,302, + 1,0,0,0,301,296,1,0,0,0,301,297,1,0,0,0,302,71,1,0,0,0,21,82,88, + 90,94,99,108,121,126,132,139,145,189,196,236,247,262,265,277,288, + 294,301 ] class AtomicParser ( Parser ): @@ -2226,6 +2227,10 @@ def atomic_list(self): return self.getTypedRuleContext(AtomicParser.Atomic_listContext,0) + def atomic_list_extract(self): + return self.getTypedRuleContext(AtomicParser.Atomic_list_extractContext,0) + + def getRuleIndex(self): return AtomicParser.RULE_math_terminal @@ -2251,51 +2256,63 @@ def math_terminal(self): localctx = AtomicParser.Math_terminalContext(self, self._ctx, self.state) self.enterRule(localctx, 56, self.RULE_math_terminal) try: - self.state = 246 + self.state = 247 self._errHandler.sync(self) - token = self._input.LA(1) - if token in [45]: + la_ = self._interp.adaptivePredict(self._input,14,self._ctx) + if la_ == 1: self.enterOuterAlt(localctx, 1) self.state = 238 self.match(AtomicParser.INT) pass - elif token in [46]: + + elif la_ == 2: self.enterOuterAlt(localctx, 2) self.state = 239 self.match(AtomicParser.FLOAT) pass - elif token in [47]: + + elif la_ == 3: self.enterOuterAlt(localctx, 3) self.state = 240 self.match(AtomicParser.MATH_VAR) pass - elif token in [48]: + + elif la_ == 4: self.enterOuterAlt(localctx, 4) self.state = 241 self.match(AtomicParser.IMAG) pass - elif token in [69]: + + elif la_ == 5: self.enterOuterAlt(localctx, 5) self.state = 242 self.access() pass - elif token in [27]: + + elif la_ == 6: self.enterOuterAlt(localctx, 6) self.state = 243 self.pexpr() pass - elif token in [14, 15, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68]: + + elif la_ == 7: self.enterOuterAlt(localctx, 7) self.state = 244 self.fexpr() pass - elif token in [29]: + + elif la_ == 8: self.enterOuterAlt(localctx, 8) self.state = 245 self.atomic_list() pass - else: - raise NoViableAltException(self) + + elif la_ == 9: + self.enterOuterAlt(localctx, 9) + self.state = 246 + self.atomic_list_extract() + pass + except RecognitionException as re: localctx.exception = re @@ -2406,7 +2423,7 @@ def func_names(self): self._la = 0 # Token type try: self.enterOuterAlt(localctx, 1) - self.state = 248 + self.state = 249 _la = self._input.LA(1) if not(((((_la - 14)) & ~0x3f) == 0 and ((1 << (_la - 14)) & 36028762659225603) != 0)): self._errHandler.recoverInline(self) @@ -2465,11 +2482,11 @@ def pexpr(self): self.enterRule(localctx, 60, self.RULE_pexpr) try: self.enterOuterAlt(localctx, 1) - self.state = 250 - self.match(AtomicParser.LBRACKET) self.state = 251 - self.aexpr(0) + self.match(AtomicParser.LBRACKET) self.state = 252 + self.aexpr(0) + self.state = 253 self.match(AtomicParser.RBRACKET) except RecognitionException as re: localctx.exception = re @@ -2537,31 +2554,31 @@ def fexpr(self): self._la = 0 # Token type try: self.enterOuterAlt(localctx, 1) - self.state = 254 - self.func_names() self.state = 255 + self.func_names() + self.state = 256 self.match(AtomicParser.LBRACKET) - self.state = 264 + self.state = 265 self._errHandler.sync(self) _la = self._input.LA(1) if ((((_la - 13)) & ~0x3f) == 0 and ((1 << (_la - 13)) & 144115183793554951) != 0): - self.state = 256 + self.state = 257 self.aexpr(0) - self.state = 261 + self.state = 262 self._errHandler.sync(self) _la = self._input.LA(1) while _la==26: - self.state = 257 - self.match(AtomicParser.COMMA) self.state = 258 + self.match(AtomicParser.COMMA) + self.state = 259 self.aexpr(0) - self.state = 263 + self.state = 264 self._errHandler.sync(self) _la = self._input.LA(1) - self.state = 266 + self.state = 267 self.match(AtomicParser.RBRACKET) except RecognitionException as re: localctx.exception = re @@ -2622,10 +2639,10 @@ def aexpr(self, _p:int=0): self._la = 0 # Token type try: self.enterOuterAlt(localctx, 1) - self.state = 269 + self.state = 270 self.mexpr(0) self._ctx.stop = self._input.LT(-1) - self.state = 276 + self.state = 277 self._errHandler.sync(self) _alt = self._interp.adaptivePredict(self._input,17,self._ctx) while _alt!=2 and _alt!=ATN.INVALID_ALT_NUMBER: @@ -2635,20 +2652,20 @@ def aexpr(self, _p:int=0): _prevctx = localctx localctx = AtomicParser.AexprContext(self, _parentctx, _parentState) self.pushNewRecursionContext(localctx, _startState, self.RULE_aexpr) - self.state = 271 + self.state = 272 if not self.precpred(self._ctx, 1): from antlr4.error.Errors import FailedPredicateException raise FailedPredicateException(self, "self.precpred(self._ctx, 1)") - self.state = 272 + self.state = 273 _la = self._input.LA(1) if not(_la==35 or _la==36): self._errHandler.recoverInline(self) else: self._errHandler.reportMatch(self) self.consume() - self.state = 273 + self.state = 274 self.mexpr(0) - self.state = 278 + self.state = 279 self._errHandler.sync(self) _alt = self._interp.adaptivePredict(self._input,17,self._ctx) @@ -2711,10 +2728,10 @@ def mexpr(self, _p:int=0): self._la = 0 # Token type try: self.enterOuterAlt(localctx, 1) - self.state = 280 + self.state = 281 self.uexpr() self._ctx.stop = self._input.LT(-1) - self.state = 287 + self.state = 288 self._errHandler.sync(self) _alt = self._interp.adaptivePredict(self._input,18,self._ctx) while _alt!=2 and _alt!=ATN.INVALID_ALT_NUMBER: @@ -2724,20 +2741,20 @@ def mexpr(self, _p:int=0): _prevctx = localctx localctx = AtomicParser.MexprContext(self, _parentctx, _parentState) self.pushNewRecursionContext(localctx, _startState, self.RULE_mexpr) - self.state = 282 + self.state = 283 if not self.precpred(self._ctx, 1): from antlr4.error.Errors import FailedPredicateException raise FailedPredicateException(self, "self.precpred(self._ctx, 1)") - self.state = 283 + self.state = 284 _la = self._input.LA(1) if not(_la==33 or _la==34): self._errHandler.recoverInline(self) else: self._errHandler.reportMatch(self) self.consume() - self.state = 284 + self.state = 285 self.uexpr() - self.state = 289 + self.state = 290 self._errHandler.sync(self) _alt = self._interp.adaptivePredict(self._input,18,self._ctx) @@ -2793,24 +2810,24 @@ def uexpr(self): self.enterRule(localctx, 68, self.RULE_uexpr) self._la = 0 # Token type try: - self.state = 293 + self.state = 294 self._errHandler.sync(self) token = self._input.LA(1) if token in [13, 14, 15, 22, 23, 27, 29, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69]: self.enterOuterAlt(localctx, 1) - self.state = 290 + self.state = 291 self.eexpr() pass elif token in [35, 36]: self.enterOuterAlt(localctx, 2) - self.state = 291 + self.state = 292 _la = self._input.LA(1) if not(_la==35 or _la==36): self._errHandler.recoverInline(self) else: self._errHandler.reportMatch(self) self.consume() - self.state = 292 + self.state = 293 self.eexpr() pass else: @@ -2868,22 +2885,22 @@ def eexpr(self): localctx = AtomicParser.EexprContext(self, self._ctx, self.state) self.enterRule(localctx, 70, self.RULE_eexpr) try: - self.state = 300 + self.state = 301 self._errHandler.sync(self) la_ = self._interp.adaptivePredict(self._input,20,self._ctx) if la_ == 1: self.enterOuterAlt(localctx, 1) - self.state = 295 + self.state = 296 self.terminal() pass elif la_ == 2: self.enterOuterAlt(localctx, 2) - self.state = 296 - self.terminal() self.state = 297 - self.match(AtomicParser.POWER) + self.terminal() self.state = 298 + self.match(AtomicParser.POWER) + self.state = 299 self.uexpr() pass diff --git a/src/oqd_core/frontend/atomic/README.md b/src/oqd_core/frontend/atomic/README.md deleted file mode 100644 index ed354a2c..00000000 --- a/src/oqd_core/frontend/atomic/README.md +++ /dev/null @@ -1,28 +0,0 @@ -# Frontend for Atomic Interface - -Make sure you're in the virtual environment, and sync your requirements. - -```bash -uv sync -source .venv/bin/activate -``` - -# Convert .atomic into the AST -The example code is in `examples/atomic/test.atomic`. This file contains the expected syntax of the Parser. - -Run the Typer app: -```bash -# Run example -python3 -m oqd_core.frontend.atomic.output -i examples/atomic/test.atomic -o examples/atomic/test.ast -``` - -This example generates the Atomic Circuit AST in `examples/atomic/test.ast`. - -# Deserialize JSON AST into .atomic code - -Run the Typer app with the deserialize option: -```bash -# Run example -python3 -m oqd_core.frontend.atomic.output -d -i examples/atomic/test.ast -o examples/atomic/test.out -``` -This example generates the Atomic language code in `examples/atomic/test.out`. \ No newline at end of file diff --git a/src/oqd_core/frontend/atomic/output.py b/src/oqd_core/frontend/atomic/output.py deleted file mode 100644 index bc0062f5..00000000 --- a/src/oqd_core/frontend/atomic/output.py +++ /dev/null @@ -1,42 +0,0 @@ -# Copyright 2024-2025 Open Quantum Design - -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at - -# http://www.apache.org/licenses/LICENSE-2.0 - -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -from pathlib import Path - -import typer - -from .AtomicCircuitAST import parse_atomic - -######################################################################################## - -app = typer.Typer() - - -@app.command() -def main( - input_file: Path = typer.Option(None, "-i", "--input", help="Input file"), - output_file: Path = typer.Option(None, "-o", "--output", help="Output file"), -): - with open(input_file, encoding="utf-8") as f: - source = f.read() - - circuit = parse_atomic(source) - tree = circuit.model_dump_json(indent=2, serialize_as_any=True) - - with open(output_file, "w") as f: - f.write(tree) - - -if __name__ == "__main__": - app() diff --git a/src/oqd_core/frontend/atomic/serialize.py b/src/oqd_core/frontend/atomic/serialize.py index 96beba11..89746285 100644 --- a/src/oqd_core/frontend/atomic/serialize.py +++ b/src/oqd_core/frontend/atomic/serialize.py @@ -1,6 +1,6 @@ # Copyright 2024-2025 Open Quantum Design -# Licensed under the Apache License, Version 2.0 (the "License"); +# Licensed under the Apache License, Version 2.0 (the "License") # you may not use this file except in compliance with the License. # You may obtain a copy of the License at @@ -14,6 +14,8 @@ from __future__ import annotations +import re + from oqd_compiler_infrastructure import ConversionRule, Post from oqd_core.interface.atomic import ( @@ -66,27 +68,27 @@ def generic_map(self, model, operands): def map_AtomicCircuit(self, model: AtomicCircuit, operands): statements = operands["statements"] - return ";\n".join(statements) + "\n" + return "\n".join(statements) + "\n" ## Statements ## def map_ParallelProtocol(self, model: ParallelProtocol, operands): pulses = operands["pulses"] - body = ";\n".join(pulses) + ";\n" + body = "\n".join(pulses) return f"parallel {{\n{body}\n}}" def map_Declaration(self, model: Declaration, operands): return f"{operands['name']} = {operands['value']}" def map_While(self, model: While, operands): - body = ";\n".join(operands["body"]) + ";\n" - return f"while ({operands['condition']}) {{\n{body}}}" + body = "\n".join(operands["body"]) + return f"while ({operands['condition']}) {{\n{body}\n}}" def map_IfElse(self, model: IfElse, operands): - then_branch = ";\n".join(operands["then_branch"]) + ";\n" + then_branch = "\n".join(operands["then_branch"]) else_branch = operands["else_branch"] if else_branch: - else_branch = ";\n".join(else_branch) + ";\n" + else_branch = "\n".join(else_branch) return f"if ({operands['condition']}) {{\n{then_branch}\n}} else {{\n{else_branch}\n}}" return f"if ({operands['condition']}) {{\n{then_branch}\n}}" @@ -136,6 +138,8 @@ def map_MathNum(self, model: MathNum, operands): value = str(int(model.value)) if isinstance(model.value, (int, float)): value = str(model.value) + if 'e' in value: + value = re.sub(r'e([+-]?)0+(\d)', r'e\1\2', value) return value def map_MathImag(self, model: MathImag, operands): diff --git a/src/oqd_core/interface/analog/__init__.py b/src/oqd_core/interface/analog/__init__.py index 8431f93d..aa46a8ef 100644 --- a/src/oqd_core/interface/analog/__init__.py +++ b/src/oqd_core/interface/analog/__init__.py @@ -19,7 +19,6 @@ AnalogExpr, AnalogExprSubtypes, AnalogList, - Terminal, Bool, BoolAnd, BoolEq, @@ -56,6 +55,7 @@ PauliY, PauliZ, QuantumRegister, + Terminal, ) from oqd_core.interface.analog.statement import ( Break, diff --git a/src/oqd_core/interface/analog/utils.py b/src/oqd_core/interface/analog/utils.py deleted file mode 100644 index ec0efc53..00000000 --- a/src/oqd_core/interface/analog/utils.py +++ /dev/null @@ -1,84 +0,0 @@ -# ######################################################################################## - - -# class _AST_to_MathExpr(ConversionRule): -# def generic_map(self, model: Any, operands): -# raise TypeError - -# def map_Module(self, model: ast.Module, operands): -# if len(model.body) == 1: -# return self(model.body[0]) -# raise TypeError - -# def map_Expr(self, model: ast.Expr, operands): -# return self(model.value) - -# def map_Constant(self, model: ast.Constant, operands): -# return MathExpr.cast(model.value) - -# def map_Name(self, model: ast.Name, operands): -# return MathVar(name=model.id) - -# def map_BinOp(self, model: ast.BinOp, operands): -# if isinstance(model.op, ast.Add): -# return MathAdd(expr1=self(model.left), expr2=self(model.right)) -# if isinstance(model.op, ast.Sub): -# return MathSub(expr1=self(model.left), expr2=self(model.right)) -# if isinstance(model.op, ast.Mult): -# return MathMul(expr1=self(model.left), expr2=self(model.right)) -# if isinstance(model.op, ast.Div): -# return MathDiv(expr1=self(model.left), expr2=self(model.right)) -# if isinstance(model.op, ast.Pow): -# return MathPow(expr1=self(model.left), expr2=self(model.right)) -# raise TypeError - -# def map_UnaryOp(self, model: ast.UnaryOp, operands): -# if isinstance(model.op, ast.USub): -# return -self(model.operand) -# if isinstance(model.op, ast.UAdd): -# return self(model.operand) -# raise TypeError - -# def map_Call(self, model: ast.Call, operands): -# return MathFunc( -# func=model.func.id, -# expr=[self(arg) for arg in model.args], -# ) - - -# def MathStr(*, string): -# return _AST_to_MathExpr()(ast.parse(string)) - -######################################################################################## - - -# class _MathExprIsConstant(RewriteRule): -# def map_MathExpr(self, model): -# if getattr(self, "isconstant", None) is None: -# self.isconstant = True - -# def map_MathVar(self, model): -# self.isconstant = False - -# def map_Access(self, model): -# self.isconstant = False - - -# def _isconstant(model): -# constant_analysis = _MathExprIsConstant() - -# Post(constant_analysis)(model) - -# if constant_analysis.isconstant: -# return model - -# raise ValueError("MathExpr is not a constant") - - -# ConstantMathExpr = Annotated[ -# CastMathExpr, -# AfterValidator(_isconstant), -# ] -# """ -# Annotated type for constant MathExpr -# """ diff --git a/src/oqd_core/interface/atomic/__init__.py b/src/oqd_core/interface/atomic/__init__.py index 3585e81a..44203849 100644 --- a/src/oqd_core/interface/atomic/__init__.py +++ b/src/oqd_core/interface/atomic/__init__.py @@ -13,48 +13,48 @@ # limitations under the License. from .circuit import AtomicCircuit -from .species import Ba133IIBuilder, IonBuilder, Yb171IIBuilder -from .statement import ( - ParallelProtocol, - While, - IfElse, - Break, - Continue, - Declaration, -) from .expr import ( - Pulse, + Access, AtomicExpr, AtomicExprSubtypes, AtomicList, - Extract, - Terminal, + Beam, Bool, + BoolAnd, + BoolEq, + BoolExpr, + BoolGreaterThan, + BoolGreaterThanEq, + BoolLessThan, + BoolLessThanEq, + BoolNot, + BoolNotEq, + BoolOr, + Extract, IonRegister, - Beam, - Access, + MathAdd, + MathBinaryOp, + MathDiv, MathExpr, - MathTerminal, - MathNum, - MathVar, - MathImag, MathFunc, - MathBinaryOp, - MathAdd, - MathSub, + MathImag, MathMul, - MathDiv, + MathNum, MathPow, - BoolAnd, - BoolOr, - BoolNot, - BoolEq, - BoolNotEq, - BoolLessThan, - BoolLessThanEq, - BoolGreaterThan, - BoolGreaterThanEq, - BoolExpr, + MathSub, + MathTerminal, + MathVar, + Pulse, + Terminal, +) +from .species import Ba133IIBuilder, IonBuilder, Yb171IIBuilder +from .statement import ( + Break, + Continue, + Declaration, + IfElse, + ParallelProtocol, + While, ) __all__ = [ diff --git a/src/oqd_core/interface/atomic/circuit.py b/src/oqd_core/interface/atomic/circuit.py index 4e1fb441..a35271cd 100644 --- a/src/oqd_core/interface/atomic/circuit.py +++ b/src/oqd_core/interface/atomic/circuit.py @@ -13,9 +13,12 @@ # limitations under the License. from typing import List + from oqd_compiler_infrastructure import TypeReflectBaseModel -from .statement import Statement, ParallelProtocol -from .expr import Pulse, Beam + +from .expr import Beam, Pulse +from .statement import ParallelProtocol, Statement + ######################################################################################## __all__ = [ diff --git a/src/oqd_core/interface/atomic/expr.py b/src/oqd_core/interface/atomic/expr.py index 3c38663c..1106d057 100644 --- a/src/oqd_core/interface/atomic/expr.py +++ b/src/oqd_core/interface/atomic/expr.py @@ -13,7 +13,9 @@ # limitations under the License. from __future__ import annotations + from typing import Annotated, Any, List, Literal, Union + import numpy as np from oqd_compiler_infrastructure import TypeReflectBaseModel from pydantic import ( diff --git a/src/oqd_core/interface/atomic/species.py b/src/oqd_core/interface/atomic/species.py index 2e2e095a..158730f8 100644 --- a/src/oqd_core/interface/atomic/species.py +++ b/src/oqd_core/interface/atomic/species.py @@ -13,16 +13,23 @@ # limitations under the License. from abc import ABC, abstractmethod +from typing import Annotated, List, Literal, Union import numpy as np -from oqd_compiler_infrastructure import Post, Pre, PrettyPrint, RewriteRule, TypeReflectBaseModel -from scipy.constants import physical_constants -from typing import Union, List, Annotated, Literal +from oqd_compiler_infrastructure import ( + Post, + Pre, + PrettyPrint, + RewriteRule, + TypeReflectBaseModel, +) from pydantic import ( AfterValidator, NonNegativeFloat, NonNegativeInt, ) +from scipy.constants import physical_constants + ######################################################################################## def is_halfint(v: float) -> bool: diff --git a/src/oqd_core/interface/atomic/statement.py b/src/oqd_core/interface/atomic/statement.py index 83b371aa..534e6609 100644 --- a/src/oqd_core/interface/atomic/statement.py +++ b/src/oqd_core/interface/atomic/statement.py @@ -13,16 +13,17 @@ # limitations under the License. from __future__ import annotations -from typing import List, Union, Annotated + +from typing import Annotated, List, Union from oqd_compiler_infrastructure import TypeReflectBaseModel from pydantic import Discriminator, Tag + from .expr import AtomicExprSubtypes, Identifier ######################################################################################## __all__ = [ - "Pulse", "Declaration", "ParallelProtocol", "IfElse", diff --git a/tests/test_frontend/test_frontend_analog.py b/tests/test_frontend/test_frontend_analog.py new file mode 100644 index 00000000..c3215542 --- /dev/null +++ b/tests/test_frontend/test_frontend_analog.py @@ -0,0 +1,411 @@ +# Copyright 2024-2025 Open Quantum Design + +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import pytest + +from oqd_core.frontend.analog.AnalogCircuitAST import parse_analog +from oqd_core.frontend.analog.serialize import serialize_analog +from oqd_core.interface.analog import ( + Access, + AnalogCircuit, + AnalogList, + Bool, + BoolAnd, + BoolEq, + BoolGreaterThan, + BoolGreaterThanEq, + BoolLessThan, + BoolLessThanEq, + BoolNot, + BoolNotEq, + BoolOr, + Break, + Continue, + Declaration, + Evolve, + Extract, + IfElse, + Initialize, + MathAdd, + MathDiv, + MathFunc, + MathImag, + MathMul, + MathNum, + MathPow, + MathSub, + MathVar, + Measure, + ModeRegister, + QuantumRegister, + While, +) +from oqd_core.interface.analog.expr import ( + Annihilation, + Creation, + Identity, + OperatorAdd, + OperatorKron, + OperatorMul, + OperatorSub, + PauliI, + PauliX, + PauliY, + PauliZ, +) + +######################################################################################## + +def test_program(): + circuit = parse_analog("") + assert isinstance(circuit, AnalogCircuit) + assert circuit.statements == [] + + +## Declarations ## + +class TestAnalogDeclarations: + + def test_int(self): + circuit = parse_analog("x = 1") + assert len(circuit.statements) == 1 + decl = circuit.statements[0] + assert isinstance(decl, Declaration) + assert decl.name == "x" + assert decl.value == MathNum(value=1) + + def test_float(self): + circuit = parse_analog("pi = 3.14") + decl = circuit.statements[0] + assert isinstance(decl, Declaration) + assert decl.name == "pi" + assert decl.value == MathNum(value=3.14) + + def test_math_var(self): + circuit = parse_analog("omega = #omega") + decl = circuit.statements[0] + assert decl.value == MathVar(name="#omega") + + def test_imag(self): + circuit = parse_analog("z = 1j") + decl = circuit.statements[0] + assert decl.value == MathImag() + + def test_quantum_register(self): + circuit = parse_analog("r = qreg(2)") + decl = circuit.statements[0] + assert decl.value == QuantumRegister(size=2) + + def test_mode_register(self): + circuit = parse_analog("s = qmode(3)") + decl = circuit.statements[0] + assert decl.value == ModeRegister(size=3) + + def test_list(self): + circuit = parse_analog("list = [1, 2, 3]") + decl = circuit.statements[0] + assert isinstance(decl.value, AnalogList) + assert decl.value.values == [MathNum(value=1), MathNum(value=2), MathNum(value=3)] + + def test_list_extract(self): + circuit = parse_analog("r = qreg(2)\nq0 = r[0]") + decl = circuit.statements[1] + assert isinstance(decl.value, Extract) + assert decl.value.access == Access(name="r") + assert decl.value.index == 0 + +## Math Expressions ## + +class TestAnalogMathExpressions: + + def test_addition(self): + circuit = parse_analog("x = 1 + 2") + decl = circuit.statements[0] + assert decl.value == MathAdd(expr1=MathNum(value=1), expr2=MathNum(value=2)) + + def test_subtraction(self): + circuit = parse_analog("x = 5 - 3") + decl = circuit.statements[0] + assert decl.value == MathSub(expr1=MathNum(value=5), expr2=MathNum(value=3)) + + def test_multiplication(self): + circuit = parse_analog("x = 2 * 3") + decl = circuit.statements[0] + assert decl.value == MathMul(expr1=MathNum(value=2), expr2=MathNum(value=3)) + + def test_division(self): + circuit = parse_analog("x = 6 / 2") + decl = circuit.statements[0] + assert decl.value == MathDiv(expr1=MathNum(value=6), expr2=MathNum(value=2)) + + def test_power(self): + circuit = parse_analog("x = 2^3") + decl = circuit.statements[0] + assert decl.value == MathPow(expr1=MathNum(value=2), expr2=MathNum(value=3)) + + def test_negation(self): + circuit = parse_analog("x = -1") + decl = circuit.statements[0] + assert decl.value == MathMul(expr1=MathNum(value=-1), expr2=MathNum(value=1)) + + def test_nested_expression(self): + circuit = parse_analog("x = 2 * 3 + 1") + decl = circuit.statements[0] + expected = MathAdd( + expr1=MathMul(expr1=MathNum(value=2), expr2=MathNum(value=3)), + expr2=MathNum(value=1), + ) + assert decl.value == expected + + def test_paranthesis_expression(self): + circuit = parse_analog("x = 2 * (3 + 1)") + decl = circuit.statements[0] + expected = MathMul( + expr1=MathNum(value=2), + expr2=MathAdd(expr1=MathNum(value=3), expr2=MathNum(value=1)), + ) + assert decl.value == expected + + @pytest.mark.parametrize( + "func_name", + ["sin", "cos", "tan", "exp", "log", "abs", "sinh", "cosh", "tanh", + "atan", "acos", "asin", "atanh", "asinh", "acosh", "conj", + "heaviside", "real", "imag"], + ) + def test_unary_math_function(self, func_name): + circuit = parse_analog(f"x = {func_name}(1)") + decl = circuit.statements[0] + assert isinstance(decl.value, MathFunc) + assert decl.value.func == func_name + assert decl.value.expr == MathNum(value=1) + + def test_atan2(self): + circuit = parse_analog("x = atan2(1, 2)") + decl = circuit.statements[0] + assert isinstance(decl.value, MathFunc) + assert decl.value.func == "atan2" + assert decl.value.expr == [MathNum(value=1), MathNum(value=2)] + + +## Bool Expressions ## + +class TestAnalogBool: + def test_true(self): + circuit = parse_analog("x = true") + assert circuit.statements[0].value == Bool(value=True) + + def test_false(self): + circuit = parse_analog("x = false") + assert circuit.statements[0].value == Bool(value=False) + + @pytest.mark.parametrize( + "op, cls", + [("==", BoolEq), ("!=", BoolNotEq), ("<=", BoolLessThanEq), ("<", BoolLessThan), + ("and", BoolAnd), ("&&", BoolAnd), ("or", BoolOr), ("||", BoolOr), + (">=", BoolGreaterThanEq), (">", BoolGreaterThan)], + ) + def test_comparison(self, op, cls): + circuit = parse_analog(f"x = 1 {op} 2") + decl = circuit.statements[0] + assert isinstance(decl, Declaration) + assert isinstance(decl.value, cls) + + @pytest.mark.parametrize("op, cls", [("not", BoolNot), ("!", BoolNot),]) + def test_not(self, op, cls): + circuit = parse_analog(f"a = true \n x = {op} a") + decl = circuit.statements[1] + assert isinstance(decl, Declaration) + assert isinstance(decl.value, cls) + + +## Analog Operators ## + +class TestAnalogOperators: + def test_pauli_x(self): + circuit = parse_analog("op = %X") + assert circuit.statements[0].value == PauliX() + + def test_pauli_y(self): + circuit = parse_analog("op = %Y") + assert circuit.statements[0].value == PauliY() + + def test_pauli_z(self): + circuit = parse_analog("op = %Z") + assert circuit.statements[0].value == PauliZ() + + def test_pauli_i(self): + circuit = parse_analog("op = %I") + assert circuit.statements[0].value == PauliI() + + def test_creation(self): + circuit = parse_analog("op = %C") + assert circuit.statements[0].value == Creation() + + def test_annihilation(self): + circuit = parse_analog("op = %A") + assert circuit.statements[0].value == Annihilation() + + def test_identity(self): + circuit = parse_analog("op = %J") + assert circuit.statements[0].value == Identity() + + def test_operator_add(self): + circuit = parse_analog("op = %X %+ %Y") + assert circuit.statements[0].value == OperatorAdd(op1=PauliX(), op2=PauliY()) + + def test_operator_sub(self): + circuit = parse_analog("op = %X %- %Y") + assert circuit.statements[0].value == OperatorSub(op1=PauliX(), op2=PauliY()) + + def test_operator_mul(self): + circuit = parse_analog("op = %X %* %Y") + assert circuit.statements[0].value == OperatorMul(op1=PauliX(), op2=PauliY()) + + def test_operator_kron(self): + circuit = parse_analog("op = %X %@ %Y") + assert circuit.statements[0].value == OperatorKron(op1=PauliX(), op2=PauliY()) + + +## Statements ## + +class TestAnalogStatements: + @pytest.fixture + def register(self): + return "r = qreg(2)\n" + + def test_initialize(self, register): + circuit = parse_analog(register + "initialize(r)") + statement = circuit.statements[1] + assert isinstance(statement, Initialize) + assert statement.targets == Access(name="r") + + def test_measure(self, register): + circuit = parse_analog(register + "measure(r)") + statement = circuit.statements[1] + assert isinstance(statement, Measure) + assert statement.targets == Access(name="r") + + def test_evolve(self, register): + circuit = parse_analog(register + "evolve(%X, 1.0, r)") + statement = circuit.statements[1] + assert isinstance(statement, Evolve) + assert statement.hamiltonian == PauliX() + assert statement.duration == MathNum(value=1.0) + assert statement.targets == Access(name="r") + + def test_multiple_statements(self, register): + program = "\n".join([ + register, + "initialize(r)", + "evolve(%X, 1.0, r)", + "measure(r)", + ]) + circuit = parse_analog(program) + assert len(circuit.statements) == 4 + assert isinstance(circuit.statements[0], Declaration) + assert isinstance(circuit.statements[1], Initialize) + assert isinstance(circuit.statements[2], Evolve) + assert isinstance(circuit.statements[3], Measure) + + +## Control Flow Statements ## + +class TestAnalogControlFlow: + + def test_if(self): + program = "x = 1\n if (x > 0) {\n y = 2\n}" + circuit = parse_analog(program) + ifelse = circuit.statements[1] + assert isinstance(ifelse, IfElse) + assert isinstance(ifelse.condition, BoolGreaterThan) + assert len(ifelse.then_branch) == 1 + assert ifelse.else_branch == [] + + def test_if_else(self): + program = "x = 1\n if (x > 0) {\n y = 2\n} \n else {\n y = 3\n}" + circuit = parse_analog(program) + ifelse = circuit.statements[1] + assert isinstance(ifelse, IfElse) + assert isinstance(ifelse.condition, BoolGreaterThan) + assert len(ifelse.then_branch) == 1 + assert len(ifelse.else_branch) == 1 + + def test_while_statement(self): + program = "n = 3\nwhile (n > 0) {\n n = n - 1\n}" + circuit = parse_analog(program) + while_statement = circuit.statements[1] + assert isinstance(while_statement, While) + assert isinstance(while_statement.condition, BoolGreaterThan) + assert len(while_statement.body) == 1 + + def test_break_loop(self): + program = "while (true) {\n break\n}" + circuit = parse_analog(program) + while_statement = circuit.statements[0] + assert isinstance(while_statement.body[0], Break) + + def test_continue_loop(self): + program = "while (true) {\n continue\n}" + circuit = parse_analog(program) + while_statement = circuit.statements[0] + assert isinstance(while_statement.body[0], Continue) + + def test_break_outside_loop(self): + with pytest.raises(SyntaxError, match="break outside of loop"): + parse_analog("break") + + def test_continue_outside_loop(self): + with pytest.raises(SyntaxError, match="continue outside of loop"): + parse_analog("continue") + + def test_nested_control_flow(self): + program = "while(true) {\n if (a == b) {x = 0} \n if (x == 0) { break}\n}" + circuit = parse_analog(program) + while_statement = circuit.statements[0] + assert isinstance(while_statement, While) + assert isinstance(while_statement.condition, Bool) + ifelse = while_statement.body[0] + assert isinstance(ifelse, IfElse) + assert isinstance(ifelse.condition, BoolEq) + assert isinstance(ifelse.then_branch[0], Declaration) + ifelse = while_statement.body[1] + assert isinstance(ifelse, IfElse) + assert isinstance(ifelse.condition, BoolEq) + assert isinstance(ifelse.then_branch[0], Break) + + + +## Serialization ## + + +class TestAnalogSerialize: + + @pytest.mark.parametrize( + "program", + ["r = qreg(2)", + "list = [1, 2, 3]", + "initialize(r)", + "evolve(%X, 1.0, r)", + "measure(r)", + "x = 1\n if (x > 0) {\n y = 2\n}" + "x = 1\n if (x > 0) {\n y = 2\n} \n else {\n y = 3\n}", + "while(true) {\n if (a == b) {x = 0} \n if (x == 0) { break}\n}", + ], + ) + def test_analog_serialize(self, program): + circuit = parse_analog(program) + assert isinstance(circuit, AnalogCircuit) + serialized = serialize_analog(circuit) + deserialized_circuit = parse_analog(serialized) + assert circuit == deserialized_circuit diff --git a/tests/test_frontend/test_frontend_atomic.py b/tests/test_frontend/test_frontend_atomic.py new file mode 100644 index 00000000..1a3277ec --- /dev/null +++ b/tests/test_frontend/test_frontend_atomic.py @@ -0,0 +1,364 @@ +# Copyright 2024-2025 Open Quantum Design + +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import pytest + +from oqd_core.frontend.atomic.AtomicCircuitAST import parse_atomic +from oqd_core.frontend.atomic.serialize import serialize_atomic +from oqd_core.interface.atomic import ( + Access, + AtomicCircuit, + AtomicList, + Beam, + Bool, + BoolAnd, + BoolEq, + BoolGreaterThan, + BoolGreaterThanEq, + BoolLessThan, + BoolLessThanEq, + BoolNot, + BoolNotEq, + BoolOr, + Break, + Continue, + Declaration, + Extract, + IfElse, + IonRegister, + MathAdd, + MathDiv, + MathFunc, + MathImag, + MathMul, + MathNum, + MathPow, + MathSub, + MathVar, + ParallelProtocol, + Pulse, + While, +) + +######################################################################################## + +def test_program(): + circuit = parse_atomic("") + assert isinstance(circuit, AtomicCircuit) + assert circuit.statements == [] + + +## Declarations ## + +class TestAtomicDeclarations: + + def test_int(self): + circuit = parse_atomic("x = 1") + assert len(circuit.statements) == 1 + decl = circuit.statements[0] + assert isinstance(decl, Declaration) + assert decl.name == "x" + assert decl.value == MathNum(value=1) + + def test_float(self): + circuit = parse_atomic("pi = 3.14") + decl = circuit.statements[0] + assert isinstance(decl, Declaration) + assert decl.name == "pi" + assert decl.value == MathNum(value=3.14) + + def test_math_var(self): + circuit = parse_atomic("omega = #omega") + decl = circuit.statements[0] + assert decl.value == MathVar(name="#omega") + + def test_imag(self): + circuit = parse_atomic("z = 1j") + decl = circuit.statements[0] + assert decl.value == MathImag() + + def test_ion_register(self): + circuit = parse_atomic("r = ionreg(2)") + decl = circuit.statements[0] + assert decl.value == IonRegister(size=2) + + def test_list(self): + circuit = parse_atomic("list = [1, 2, 3]") + decl = circuit.statements[0] + assert isinstance(decl.value, AtomicList) + assert decl.value.values == [MathNum(value=1), MathNum(value=2), MathNum(value=3)] + + def test_list_extract(self): + circuit = parse_atomic("r = ionreg(2)\n ion = r[0]") + decl = circuit.statements[1] + assert isinstance(decl.value, Extract) + assert decl.value.access == Access(name="r") + assert decl.value.index == 0 + + +## Math Expressions ## + +class TestAtomicMathExpressions: + + def test_addition(self): + circuit = parse_atomic("x = 1 + 2") + decl = circuit.statements[0] + assert decl.value == MathAdd(expr1=MathNum(value=1), expr2=MathNum(value=2)) + + def test_subtraction(self): + circuit = parse_atomic("x = 5 - 3") + decl = circuit.statements[0] + assert decl.value == MathSub(expr1=MathNum(value=5), expr2=MathNum(value=3)) + + def test_multiplication(self): + circuit = parse_atomic("x = 2 * 3") + decl = circuit.statements[0] + assert decl.value == MathMul(expr1=MathNum(value=2), expr2=MathNum(value=3)) + + def test_division(self): + circuit = parse_atomic("x = 6 / 2") + decl = circuit.statements[0] + assert decl.value == MathDiv(expr1=MathNum(value=6), expr2=MathNum(value=2)) + + def test_power(self): + circuit = parse_atomic("x = 2^3") + decl = circuit.statements[0] + assert decl.value == MathPow(expr1=MathNum(value=2), expr2=MathNum(value=3)) + + def test_negation(self): + circuit = parse_atomic("x = -1") + decl = circuit.statements[0] + assert decl.value == MathMul(expr1=MathNum(value=-1), expr2=MathNum(value=1)) + + def test_nested_expression(self): + circuit = parse_atomic("x = 2 * 3 + 1") + decl = circuit.statements[0] + expected = MathAdd( + expr1=MathMul(expr1=MathNum(value=2), expr2=MathNum(value=3)), + expr2=MathNum(value=1), + ) + assert decl.value == expected + + def test_paranthesis_expression(self): + circuit = parse_atomic("x = 2 * (3 + 1)") + decl = circuit.statements[0] + expected = MathMul( + expr1=MathNum(value=2), + expr2=MathAdd(expr1=MathNum(value=3), expr2=MathNum(value=1)), + ) + assert decl.value == expected + + @pytest.mark.parametrize( + "func_name", + ["sin", "cos", "tan", "exp", "log", "abs", "sinh", "cosh", "tanh", + "atan", "acos", "asin", "atanh", "asinh", "acosh", "conj", + "heaviside", "real", "imag"], + ) + def test_unary_math_function(self, func_name): + circuit = parse_atomic(f"x = {func_name}(1)") + decl = circuit.statements[0] + assert isinstance(decl.value, MathFunc) + assert decl.value.func == func_name + assert decl.value.expr == MathNum(value=1) + + def test_atan2(self): + circuit = parse_atomic("x = atan2(1, 2)") + decl = circuit.statements[0] + assert isinstance(decl.value, MathFunc) + assert decl.value.func == "atan2" + assert decl.value.expr == [MathNum(value=1), MathNum(value=2)] + + +## Bool Expressions ## + +class TestAtomicBool: + def test_true(self): + circuit = parse_atomic("x = true") + assert circuit.statements[0].value == Bool(value=True) + + def test_false(self): + circuit = parse_atomic("x = false") + assert circuit.statements[0].value == Bool(value=False) + + @pytest.mark.parametrize( + "op, cls", + [("==", BoolEq), ("!=", BoolNotEq), ("<=", BoolLessThanEq), ("<", BoolLessThan), + ("and", BoolAnd), ("&&", BoolAnd), ("or", BoolOr), ("||", BoolOr), + (">=", BoolGreaterThanEq), (">", BoolGreaterThan)], + ) + def test_comparison(self, op, cls): + circuit = parse_atomic(f"x = 1 {op} 2") + decl = circuit.statements[0] + assert isinstance(decl, Declaration) + assert isinstance(decl.value, cls) + + @pytest.mark.parametrize("op, cls", [("not", BoolNot), ("!", BoolNot),]) + def test_not(self, op, cls): + circuit = parse_atomic(f"a = true \n x = {op} a") + decl = circuit.statements[1] + assert isinstance(decl, Declaration) + assert isinstance(decl.value, cls) + + +## Statements ## + +class TestAtomicStatements: + @pytest.fixture + def register(self): + return "r = ionreg(2)\n" + + @pytest.fixture + def beam(self): + return "beam_mw = beam(2e6, 0.25, 0.0, [0.0, 1.0, 0.0], [0.0, 0.0, 1.0])\n" + + def test_beam(self, register): + circuit = parse_atomic(register + "beam(2e6, 0.25, 0.0, [0.0, 1.0, 0.0], [0.0, 0.0, 1.0])\n") + statement = circuit.statements[1] + assert isinstance(statement, Beam) + assert statement.frequency == MathNum(value=2e6) + assert statement.rabi == MathNum(value=0.25) + assert statement.phase == MathNum(value=0.0) + assert statement.polarization == AtomicList(values=[0.0, 1.0, 0.0]) + assert statement.wavevector == AtomicList(values=[0.0, 0.0, 1.0]) + + + def test_pulse(self, register, beam): + circuit = parse_atomic(register + beam + "pulse(beam_mw, 1e-5, r, true)") + statement = circuit.statements[2] + assert isinstance(statement, Pulse) + assert statement.beam == Access(name="beam_mw") + assert statement.duration == MathNum(value=1e-5) + assert statement.target == Access(name="r") + assert statement.measured == Bool(value=True) + + def test_pulse_not_measured(self, register, beam): + circuit = parse_atomic(register + beam + "pulse(beam_mw, 1e-5, r)") + statement = circuit.statements[2] + assert isinstance(statement, Pulse) + assert statement.beam == Access(name="beam_mw") + assert statement.duration == MathNum(value=1e-5) + assert statement.target == Access(name="r") + assert statement.measured == Bool(value=False) + + def test_parallel(self, register, beam): + circuit = parse_atomic(register + beam + "parallel {\n pulse(beam_mw, 5e-6, r[0])\n pulse(beam_mw, 5e-6, r[1])}") + statement = circuit.statements[2] + assert isinstance(statement, ParallelProtocol) + pulse1 = statement.pulses[0] + assert isinstance(pulse1, Pulse) + pulse2 = statement.pulses[1] + assert isinstance(pulse2, Pulse) + + + +## Control Flow Statements ## + +class TestAtomicControlFlow: + + def test_if(self): + program = "x = 1\n if (x > 0) {\n y = 2\n}" + circuit = parse_atomic(program) + ifelse = circuit.statements[1] + assert isinstance(ifelse, IfElse) + assert isinstance(ifelse.condition, BoolGreaterThan) + assert len(ifelse.then_branch) == 1 + assert ifelse.else_branch == [] + + def test_if_else(self): + program = "x = 1\n if (x > 0) {\n y = 2\n} \n else {\n y = 3\n}" + circuit = parse_atomic(program) + ifelse = circuit.statements[1] + assert isinstance(ifelse, IfElse) + assert isinstance(ifelse.condition, BoolGreaterThan) + assert len(ifelse.then_branch) == 1 + assert len(ifelse.else_branch) == 1 + + def test_while_statement(self): + program = "n = 3\nwhile (n > 0) {\n n = n - 1\n}" + circuit = parse_atomic(program) + while_statement = circuit.statements[1] + assert isinstance(while_statement, While) + assert isinstance(while_statement.condition, BoolGreaterThan) + assert len(while_statement.body) == 1 + + def test_break_loop(self): + program = "while (true) {\n break\n}" + circuit = parse_atomic(program) + while_statement = circuit.statements[0] + assert isinstance(while_statement.body[0], Break) + + def test_continue_loop(self): + program = "while (true) {\n continue\n}" + circuit = parse_atomic(program) + while_statement = circuit.statements[0] + assert isinstance(while_statement.body[0], Continue) + + def test_break_outside_loop(self): + with pytest.raises(SyntaxError, match="break outside of loop"): + parse_atomic("break") + + def test_continue_outside_loop(self): + with pytest.raises(SyntaxError, match="continue outside of loop"): + parse_atomic("continue") + + def test_nested_control_flow(self): + program = "while(true) {\n if (a == b) {x = 0} \n if (x == 0) { break}\n}" + circuit = parse_atomic(program) + while_statement = circuit.statements[0] + assert isinstance(while_statement, While) + assert isinstance(while_statement.condition, Bool) + ifelse = while_statement.body[0] + assert isinstance(ifelse, IfElse) + assert isinstance(ifelse.condition, BoolEq) + assert isinstance(ifelse.then_branch[0], Declaration) + ifelse = while_statement.body[1] + assert isinstance(ifelse, IfElse) + assert isinstance(ifelse.condition, BoolEq) + assert isinstance(ifelse.then_branch[0], Break) + + + +## Serialization ## + +def test_atomic_serialize(): + program = "while(true) {\n if (a == b) {x = 0} \n if (x == 0) { break}\n}" + circuit = parse_atomic(program) + assert isinstance(circuit, AtomicCircuit) + serialized = serialize_atomic(circuit) + assert isinstance(serialized, str) + + +class TestAtomicSerialize: + + @pytest.mark.parametrize( + "program", + ["r = ionreg(2)", + "list = [1, 2, 3]", + "beam_mw = beam(2e6, 0.25, 0.0, [0.0, 1.0, 0.0], [0.0, 0.0, 1.0])\n", + "pulse(beam_mw, 1e-5, r, true)", + "parallel {\n pulse(beam_mw, 5e-6, r[0])\n pulse(beam_mw, 5e-6, r[1])}", + "x = 1\n if (x > 0) {\n y = 2\n}", + "x = 1\n if (x > 0) {\n y = 2\n} \n else {\n y = 3\n}", + "n = 3\nwhile (n > 0) {\n n = n - 1\n}", + "while(true) {\n if (a == b) {x = 0} \n if (x == 0) { break}\n}", + ], + ) + def test_atomic_serialize(self, program): + circuit = parse_atomic(program) + assert isinstance(circuit, AtomicCircuit) + serialized = serialize_atomic(circuit) + deserialized_circuit = parse_atomic(serialized) + assert circuit == deserialized_circuit + +