diff --git a/.gitignore b/.gitignore index 540daf81..4926fb92 100644 --- a/.gitignore +++ b/.gitignore @@ -74,9 +74,6 @@ instance/ # Sphinx documentation docs/_build/ -# Own test results -tests/test-marker.txt - # PyBuilder .pybuilder/ target/ @@ -176,3 +173,8 @@ gen/* *.o utils/lextab.py utils/yacctab.py + +# Test result markers +tests/test-marker.txt +evaluation/test-evaluation.txt +evaluation/experiments/test-experiments.txt diff --git a/Makefile b/Makefile index 79175a8a..c173bff6 100644 --- a/Makefile +++ b/Makefile @@ -164,11 +164,45 @@ clean-docs: ## Tests TESTS = tests -TEST_SOURCES = $(wildcard $(TESTS)/*.py $(TESTS)/resources/*) +TEST_SOURCES = $(wildcard $(TESTS)/*.py $(TESTS)/resources/* $(TESTS)/docs/*.fan) +TEST_MARKER = $(TESTS)/test-marker.txt -.PHONY: test tests -test tests: - $(PYTEST) +.PHONY: test tests run-tests +test tests $(TEST_MARKER): $(PYTHON_SOURCES) $(TEST_SOURCES) + $(PYTEST) + echo 'Success' > $(TEST_MARKER) + +run-tests: $(TEST_MARKER) + +## Evaluation +EVALUATION = evaluation +EVALUATION_SOURCES = $(wildcard $(EVALUATION)/*.py $(EVALUATION)/*/*.py $(EVALUATION)/*/*/*.py $(EVALUATION)/*/*/*.fan $(EVALUATION)/*/*/*.txt) +EVALUATION_MARKER = $(EVALUATION)/test-evaluation.txt + +# python -m evaluation.vs_isla.run_evaluation +.PHONY: evaluation evaluate +evaluation evaluate $(EVALUATION_MARKER): $(PYTHON_SOURCES) $(EVALUATION_SOURCES) + $(PYTHON) -m evaluation.vs_isla.run_evaluation 1 + echo 'Success' > $(EVALUATION_MARKER) + +run-evaluation: $(EVALUATION_MARKER) + +## Experiments +EXPERIMENTS = $(EVALUATION)/experiments +EXPERIMENTS_SOURCES = $(wildcard $(EXPERIMENTS)/*/*.py $(EXPERIMENTS)/*/*.fan) +EXPERIMENTS_MARKER = $(EXPERIMENTS)/test-experiments.txt + +.PHONY: experiment experiments +experiment experiments $(EXPERIMENTS_MARKER): $(PYTHON_SOURCES) $(EXPERIMENTS_SOURCES) + $(PYTHON) -m evaluation.experiments.run_experiments + echo 'Success' > $(EXPERIMENTS_MARKER) + +run-experiments: $(EXPERIMENTS_MARKER) + +## All +.PHONY: run-all +run-all: $(TEST_MARKER) $(EVALUATION_MARKER) $(EXPERIMENTS_MARKER) + @echo 'All tests passed.' ## Installation .PHONY: install install-test install-tests @@ -185,10 +219,3 @@ install-test install-tests: uninstall: $(PIP) uninstall fandango-fuzzer -y -# python -m evaluation.vs_isla.run_evaluation -.PHONY: evaluation evaluate experiment experiments -evaluate evaluation: - $(PYTHON) -m evaluation.vs_isla.run_evaluation 1 - -experiment experiments: - $(PYTHON) -m evaluation.experiments.run_experiments \ No newline at end of file diff --git a/docs/Bits.md b/docs/Bits.md index 2126c18f..1bb204c6 100644 --- a/docs/Bits.md +++ b/docs/Bits.md @@ -62,64 +62,52 @@ assert _exit_code == 0 The combination of `--format=bits` and `--start-symbol` is particularly useful to debug bit fields. ``` -Internally, Fandango treats the individual flags as if they were strings - that is, `"\x00"` for zero bits and `"\x01"` for nonzero bits. -Hence, we can also apply _constraints_ to the individual flags: +Internally, Fandango treats individual flags as integers, too. +Hence, we can also apply _constraints_ to the individual flags. +For instance, we can profit from the fact that Python treats `0` as False and `1` as True: ```shell -$ fandango fuzz --format=bits -f bits.fan -n 10 -c ' == "\x01" and == "\x00"' +$ fandango fuzz --format=bits -f bits.fan -n 10 -c ' and ' ``` ```{code-cell} :tags: ["remove-input"] -!fandango fuzz --format=bits -f bits.fan -n 10 -c ' == "\x01" and == "\x00"' --validate +!fandango fuzz --format=bits -f bits.fan -n 10 -c ' and ' --validate assert _exit_code == 0 ``` -This alternative, using `chr()` to generate a single byte out of the specified integer might be more readable: +Fandango strictly follows a "left-to-right" order - that is, the order in which bits and bytes are specified in the grammar, the most significant bit is stored first. -```shell -$ fandango fuzz --format=bits -f bits.fan -n 1 -c ' == chr(1) and == chr(0)' -``` - -```{code-cell} -:tags: ["remove-input"] -!fandango fuzz --format=bits -f bits.fan -n 1 -c ' == chr(1) and == chr(0)' --validate -assert _exit_code == 0 -``` - -We can also easily set the value of the entire `format_flag` field using a constraint: +Hence, we can also easily set the value of the entire `brightness` field using a constraint: ```shell -$ fandango fuzz --format=bits -f bits.fan -n 1 -c ' == chr(0b11110000)' +$ fandango fuzz --format=bits -f bits.fan -n 1 -c ' == 0b1111' ``` ```{code-cell} :tags: ["remove-input"] -!fandango fuzz --format=bits -f bits.fan -n 1 -c ' == chr(0b11110000)' --validate +!fandango fuzz --format=bits -f bits.fan -n 1 -c ' == 0b1111' --validate assert _exit_code == 0 ``` -Since Fandango strictly follows a "left-to-right" order - that is, the order in which bits and bytes are specified in the grammar, the most significant bit is stored first. -Thus, the order of bits in the `chr()` argument is identical to the order of bits in the produced output. - ```{note} Fandango always strictly follows a "left-to-right" order - that is, the order in which bits and bytes are specified in the grammar. ``` -To convert a bit into a numerical value, applying the Python `ord()` function comes in handy. -Note that its argument (the symbol) must be converted into a string first: +Of course, we can also give the number in decimal format: ```shell -$ fandango fuzz --format=bits -f bits.fan -n 1 -c 'ord(str()) > 10' +$ fandango fuzz --format=bits -f bits.fan -n 1 -c ' == 15' ``` +% TODO: This does not work with :-( ```{code-cell} :tags: ["remove-input"] -!fandango fuzz --format=bits -f bits.fan -n 10 -c 'ord(str()) > 10' --validate +!fandango fuzz --format=bits -f bits.fan -n 10 -c ' == 15' --validate --population-size=20 assert _exit_code == 0 ``` -Note how the last four bits (the `` field) always represent a number greater than ten. +Note how the last four bits (the `` field) are always set to `1111` - the number 15. ```{warning} When implementing a format, be sure to follow its conventions regarding @@ -140,7 +128,7 @@ $ echo -n '\xf0' | fandango parse -f bits.fan -o - --format=bits ```{code-cell} :tags: ["remove-input"] -!echo -n '\xf0' | fandango parse -f bits.fan -o - --format=bits +!echo -n '\xf0' | fandango parse -f bits.fan -o - --format=bits --validate assert _exit_code == 0 ``` @@ -174,7 +162,7 @@ $ echo -n '\xf0' | fandango parse -f bits.fan -o - --format=grammar ```{code-cell} :tags: ["remove-input"] -!echo -n '\xf0' | fandango parse -f bits.fan -o - --format=grammar +!echo -n '\xf0' | fandango parse -f bits.fan -o - --format=grammar --validate assert _exit_code == 0 ``` diff --git a/docs/gif89a.fan b/docs/gif89a.fan index d9c58720..a99be041 100644 --- a/docs/gif89a.fan +++ b/docs/gif89a.fan @@ -1,8 +1,8 @@ include('gif.fan') -where .. == "GIF" -where .. == "89a" +where .. == b"GIF" +where .. == b"89a" ::= ::= diff --git a/evaluation/experiments/pixels/pixels.fan b/evaluation/experiments/pixels/pixels.fan index 37b938f8..a4be75a6 100644 --- a/evaluation/experiments/pixels/pixels.fan +++ b/evaluation/experiments/pixels/pixels.fan @@ -1,15 +1,14 @@ - ::= ; - ::= ; - ::= ; - ::= ; - ::= * ; - ::= ; - ::= ; - ::= ; - ::= "0" | "1" ; - -int() == int() * int() * 3; - - - -int() != 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000; \ No newline at end of file + ::= + ::= + ::= + ::= + ::= * + ::= + ::= + ::= br"[\x00-\xff]" + +def uint16(tree): + b = tree.to_bytes() + return b[1] * 256 + b[0] + +where len() == uint16() * uint16() * 3 diff --git a/language/FandangoLexer.g4 b/language/FandangoLexer.g4 index 0dfc41b2..eb7bd2ad 100644 --- a/language/FandangoLexer.g4 +++ b/language/FandangoLexer.g4 @@ -18,7 +18,7 @@ INTEGER: DECIMAL_INTEGER | OCT_INTEGER | HEX_INTEGER | BIN_INTEGER; PYTHON_START: '' {self.python_start()}; PYTHON_END : '' {self.python_end()}; -NONTERMINAL: '<' ID_CONTINUE+ '>'; +NONTERMINAL: '<' NAME '>'; // python keywords AND : 'and'; diff --git a/src/fandango/cli/__init__.py b/src/fandango/cli/__init__.py index cd52f2ac..9568e325 100644 --- a/src/fandango/cli/__init__.py +++ b/src/fandango/cli/__init__.py @@ -261,9 +261,9 @@ def get_parser(in_command_line=True): ) file_parser.add_argument( "--format", - choices=["string", "bits", "tree", "repr", "grammar", "none"], + choices=["string", "bits", "tree", "grammar", "value", "repr", "none"], default="string", - help="produce output(s) as string (default), as a bit string, as a derivation tree, in internal representation, as a grammar, or none", + help="produce output(s) as string (default), as a bit string, as a derivation tree, as a grammar, as a Python value, in internal representation, or none", ) file_parser.add_argument( "--file-mode", @@ -682,6 +682,8 @@ def convert(s: str) -> str | bytes: return convert(tree.to_bits()) if args.format == "grammar": return convert(tree.to_grammar()) + if args.format == "value": + return convert(tree.to_value()) if args.format == "none": return convert("") @@ -939,7 +941,12 @@ def fuzz_command(args): # Ensure that every generated file can be parsed # and returns the same string as the original - temp_dir = tempfile.TemporaryDirectory(delete=False) + try: + temp_dir = tempfile.TemporaryDirectory(delete=False) + except TypeError: + # Python 3.11 does not know the `delete` argument + temp_dir = tempfile.TemporaryDirectory() + args.directory = temp_dir.name args.format = "string" output_population(population, args, file_mode=file_mode, output_on_stdout=False) @@ -1281,6 +1288,8 @@ def _complete(text, state): last_status = run(command, args) except SystemExit: pass + except KeyboardInterrupt: + pass return last_status diff --git a/src/fandango/constraints/base.py b/src/fandango/constraints/base.py index 9b0b7728..83b7f420 100644 --- a/src/fandango/constraints/base.py +++ b/src/fandango/constraints/base.py @@ -18,7 +18,7 @@ from fandango.language.search import NonTerminalSearch from fandango.language.symbol import NonTerminal from fandango.language.tree import DerivationTree -from fandango.logger import print_exception +from fandango.logger import print_exception, LOGGER class Value(GeneticBase): @@ -73,9 +73,10 @@ def fitness( trees.append(node) try: # Evaluate the expression - values.append( - eval(self.expression, self.global_variables, local_variables) + result = self.eval( + self.expression, self.global_variables, local_variables ) + values.append(result) except Exception as e: e.add_note(f"Evaluation failed: {self.expression}") print_exception(e) @@ -151,6 +152,25 @@ def get_symbols(self): """ return self.searches.values() + def eval(self, expression: str, global_variables, local_variables): + """ + Evaluate the tree in the context of local and global variables. + """ + # LOGGER.debug(f"Evaluating {expression}") + # for name, value in local_variables.items(): + # if isinstance(value, DerivationTree): + # value = value.value() + # LOGGER.debug(f" {name} = {value!r}") + + result = eval(expression, global_variables, local_variables) + + # res = result + # if isinstance(res, DerivationTree): + # res = res.value() + # LOGGER.debug(f"Result = {res!r}") + + return result + class ExpressionConstraint(Constraint): """ @@ -196,11 +216,13 @@ def fitness( {name: container.evaluate() for name, container in combination} ) try: - result = eval(self.expression, self.global_variables, local_variables) - if result is None: - # fitness is perfect and return - # TODO this should not be here. It breaks Python's None semantics - return ConstraintFitness(1, 1, True) + result = self.eval( + self.expression, self.global_variables, local_variables + ) + # Commented this out for now, as `None` is a valid result + # of functions such as `re.match()` -- AZ + # if result is None: + # return ConstraintFitness(1, 1, True) if result: solved += 1 else: @@ -271,7 +293,7 @@ def __init__(self, operator: Comparison, left: str, right: str, *args, **kwargs) self.operator = operator self.left = left self.right = right - self.types_checked = None + self.types_checked = False def fitness( self, tree: DerivationTree, scope: Optional[Dict[str, DerivationTree]] = None @@ -301,31 +323,22 @@ def fitness( ) # Evaluate the left and right side of the comparison try: - left = eval(self.left, self.global_variables, local_variables) + left = self.eval(self.left, self.global_variables, local_variables) except Exception as e: e.add_note("Evaluation failed: " + self.left) print_exception(e) continue - # Evaluate the left and right side of the comparison + try: - right = eval(self.right, self.global_variables, local_variables) + right = self.eval(self.right, self.global_variables, local_variables) except Exception as e: e.add_note("Evaluation failed: " + self.right) print_exception(e) continue - try: - # TODO: please remove this check. It breaks Python's functionality, e.g., for comparing floats and ints - # TODO: Just because the types are different doesn't mean they can't be compared - if self.types_checked is None: - if not type(left) == type(right): - raise TypeError( - f"In constraint {self}, left and right side of comparison don't evaluate to the same type" - ) - else: - self.types_checked = True - except Exception as e: - self.types_checked = False + if not hasattr(self, "types_checked") or not self.types_checked: + self.check_type_compatibility(left, right) + self.types_checked = True # Initialize the suggestions suggestions = [] @@ -429,6 +442,27 @@ def fitness( self.cache[tree_hash] = fitness return fitness + def check_type_compatibility(self, left: Any, right: Any): + """ + Check the types of `left` and `right` are compatible in a comparison + """ + if isinstance(left, DerivationTree): + left = left.value() + if isinstance(right, DerivationTree): + right = right.value() + + if type(left) == type(right): + return + if isinstance(left, (bool, int, float)) and isinstance( + right, (bool, int, float) + ): + return + + LOGGER.warning( + f"{self}: {self.operator.value!r}: Cannot compare {type(left).__name__!r} and {type(right).__name__!r}" + ) + return + def __repr__(self): representation = f"{self.left} {self.operator.value} {self.right}" for identifier in self.searches: @@ -756,7 +790,9 @@ def __repr__(self): return f"(exists {repr(self.bound)} in {repr(self.search)}: {repr(self.statement)})" def __str__(self): - return f"(exists {str(self.bound)} in {str(self.search)}: {str(self.statement)})" + return ( + f"(exists {str(self.bound)} in {str(self.search)}: {str(self.statement)})" + ) def accept(self, visitor: "ConstraintVisitor"): """ @@ -847,7 +883,9 @@ def __repr__(self): return f"(forall {repr(self.bound)} in {repr(self.search)}: {repr(self.statement)})" def __str__(self): - return f"(forall {str(self.bound)} in {str(self.search)}: {str(self.statement)})" + return ( + f"(forall {str(self.bound)} in {str(self.search)}: {str(self.statement)})" + ) def accept(self, visitor: "ConstraintVisitor"): """ diff --git a/src/fandango/evolution/algorithm.py b/src/fandango/evolution/algorithm.py index dfc924ad..d41fb159 100644 --- a/src/fandango/evolution/algorithm.py +++ b/src/fandango/evolution/algorithm.py @@ -158,9 +158,15 @@ def fix_individual(self, individual: DerivationTree) -> DerivationTree: for operator, value, side in failing_tree.suggestions: from fandango.constraints.fitness import Comparison, ComparisonSide - if operator == Comparison.EQUAL and side == ComparisonSide.LEFT: + # LOGGER.debug(f"Parsing {value} into {failing_tree.tree.symbol.symbol!s}") + + if ( + operator == Comparison.EQUAL + and side == ComparisonSide.LEFT + and isinstance(value, (str, bytes, DerivationTree)) + ): suggested_tree = self.grammar.parse( - str(value), start=failing_tree.tree.symbol.symbol + value, start=failing_tree.tree.symbol.symbol ) if suggested_tree is None: continue diff --git a/src/fandango/evolution/population.py b/src/fandango/evolution/population.py index 087affd9..cb1c855b 100644 --- a/src/fandango/evolution/population.py +++ b/src/fandango/evolution/population.py @@ -84,8 +84,9 @@ def fix_individual( for failing_tree in failing_trees: for operator, value, side in failing_tree.suggestions: if operator == Comparison.EQUAL and side == ComparisonSide.LEFT: + # LOGGER.debug(f"Parsing {value} into {failing_tree.tree.symbol.symbol!s}") suggested_tree = self.grammar.parse( - str(value), start=failing_tree.tree.symbol.symbol + value, start=failing_tree.tree.symbol.symbol ) if suggested_tree is None: continue diff --git a/src/fandango/language/convert.py b/src/fandango/language/convert.py index 8fac618e..36b0b572 100644 --- a/src/fandango/language/convert.py +++ b/src/fandango/language/convert.py @@ -798,9 +798,14 @@ def visitStrings(self, ctx: FandangoParser.StringsContext): raise UnsupportedOperation( f"{ctx.getText()!r}: f-strings are currently not supported" ) - string = "" + string = None for child in ctx.string(): - string += Terminal.clean(child.STRING().getText()) + text = Terminal.clean(child.STRING().getText()) + if string is None: + string = text + else: + string += text + return ast.Constant(value=string), [], {} def visitTuple(self, ctx: FandangoParser.TupleContext): diff --git a/src/fandango/language/grammar.py b/src/fandango/language/grammar.py index 59b5d2f0..3e6094bb 100644 --- a/src/fandango/language/grammar.py +++ b/src/fandango/language/grammar.py @@ -281,8 +281,8 @@ def fuzz(self, grammar: "Grammar", max_nodes: int = 100) -> List[DerivationTree] if self.symbol.is_regex: if isinstance(self.symbol.symbol, bytes): # Exrex can't do bytes, so we decode to str and back - instance = exrex.getone(self.symbol.symbol.decode('iso-8859-1')) - return [DerivationTree(Terminal(instance.encode('iso-8859-1')))] + instance = exrex.getone(self.symbol.symbol.decode("iso-8859-1")) + return [DerivationTree(Terminal(instance.encode("iso-8859-1")))] instance = exrex.getone(self.symbol.symbol) return [DerivationTree(Terminal(instance))] @@ -757,7 +757,7 @@ def scan_bytes( # LOGGER.debug(f"Matched byte(s) {state.dot!r} at position {w:#06x} ({w}) (len = {match_length}) {word[w:w + match_length]!r}") next_state = state.next() next_state.children.append( - DerivationTree(Terminal(word[w:w + match_length])) + DerivationTree(Terminal(word[w : w + match_length])) ) table[k + match_length].add(next_state) # LOGGER.debug(f"Next state: {next_state} at column {k + match_length}") @@ -795,7 +795,7 @@ def scan_regex( # LOGGER.debug(f"Matched regex {state.dot!r} at position {w:#06x} ({w}) (len = {match_length}) {word[w:w+match_length]!r}") next_state = state.next() next_state.children.append( - DerivationTree(Terminal(word[w:w+match_length])) + DerivationTree(Terminal(word[w : w + match_length])) ) table[k + match_length].add(next_state) # LOGGER.debug(f"Next state: {next_state} at column {k + match_length}") @@ -821,7 +821,8 @@ def complete( if use_implicit and state.nonterminal in self._implicit_rules: s.children.append( DerivationTree( - NonTerminal(state.nonterminal.symbol), state.children + NonTerminal(state.nonterminal.symbol), + state.children, ) ) else: @@ -863,8 +864,7 @@ def _parse_forest( for state in table[k]: # True iff We have processed all characters # (or some bits of the last character) - at_end = (w >= len(word) - or (bit_count > 0 and w == len(word) - 1)) + at_end = w >= len(word) or (bit_count > 0 and w == len(word) - 1) if at_end: if allow_incomplete: @@ -915,11 +915,9 @@ def _parse_forest( # LOGGER.debug(f"Checking byte(s) {state} at position {w:#06x} ({w}) {word[w:]!r}") if state.dot.is_regex: - match = self.scan_regex(state, word, - table, k, w) + match = self.scan_regex(state, word, table, k, w) else: - match = self.scan_bytes(state, word, - table, k, w) + match = self.scan_bytes(state, word, table, k, w) # LOGGER.debug(f"Scanned {scanned} byte(s) at position {w:#06x} ({w}); bit_count = {bit_count}") if bit_count >= 0: @@ -933,7 +931,7 @@ def _parse_forest( def parse_forest( self, - word: str | bytes, + word: str | bytes | DerivationTree, start: str | NonTerminal = "", *, allow_incomplete: bool = False, @@ -941,7 +939,12 @@ def parse_forest( """ Yield multiple parse alternatives, using a cache. """ + if isinstance(word, DerivationTree): + word = word.value() # type: ignore + if isinstance(word, int): + word = str(word) assert isinstance(word, str) or isinstance(word, bytes) + if isinstance(start, str): start = NonTerminal(start) assert isinstance(start, NonTerminal) @@ -969,14 +972,22 @@ def parse_forest( # Cache entire forest self._cache[cache_key] = forest - def parse_incomplete(self, word: str, start: str | NonTerminal = ""): + def parse_incomplete( + self, + word: str | bytes | DerivationTree, + start: str | NonTerminal = "", + ): """ Yield multiple parse alternatives, even for incomplete inputs """ return self.parse_forest(word, start, allow_incomplete=True) - def parse(self, word: str, start: str | NonTerminal = ""): + def parse( + self, + word: str | bytes | DerivationTree, + start: str | NonTerminal = "", + ): """ Return the first parse alternative, or `None` if no parse is possible @@ -1059,14 +1070,14 @@ def update(self, grammar: "Grammar" | Dict[NonTerminal, Node], prime=True): def parse( self, - word: str | bytes, + word: str | bytes | DerivationTree, start: str | NonTerminal = "", ): return self._parser.parse(word, start) def parse_forest( self, - word: str | bytes, + word: str | bytes | DerivationTree, start: str | NonTerminal = "", allow_incomplete: bool = False, ): @@ -1074,7 +1085,7 @@ def parse_forest( def parse_incomplete( self, - word: str, + word: str | bytes | DerivationTree, start: str | NonTerminal = "", ): return self._parser.parse_incomplete(word, start) @@ -1125,7 +1136,6 @@ def get_repr_for_rule(self, symbol: str | NonTerminal): f"{' := ' + self.generators[symbol] if symbol in self.generators else ''}" ) - @staticmethod def dummy(): return Grammar({}) diff --git a/src/fandango/language/parse.py b/src/fandango/language/parse.py index 2e23cd19..84b5352f 100644 --- a/src/fandango/language/parse.py +++ b/src/fandango/language/parse.py @@ -424,7 +424,16 @@ def parse( def check_grammar_consistency( - grammar, /, given_used_symbols=set(), start_symbol="" + grammar, *, given_used_symbols=set(), start_symbol="" +): + check_grammar_definitions( + grammar, given_used_symbols=given_used_symbols, start_symbol=start_symbol + ) + check_grammar_types(grammar, start_symbol=start_symbol) + + +def check_grammar_definitions( + grammar, *, given_used_symbols=set(), start_symbol="" ): if not grammar: return @@ -447,8 +456,14 @@ def check_grammar_consistency( def collect_used_symbols(tree): if tree.node_type == NodeType.NON_TERMINAL: used_symbols.add(str(tree.symbol)) - if tree.node_type == NodeType.REPETITION: + elif ( + tree.node_type == NodeType.REPETITION + or tree.node_type == NodeType.STAR + or tree.node_type == NodeType.PLUS + or tree.node_type == NodeType.OPTION + ): collect_used_symbols(tree.node) + for child in tree.children(): collect_used_symbols(child) @@ -470,9 +485,122 @@ def collect_used_symbols(tree): if undefined_symbols: first_undefined_symbol = undefined_symbols.pop() error = NameError(f"Undefined symbol {first_undefined_symbol!s} in grammar") + if undefined_symbols: + error.add_note( + f"Other undefined symbols: {', '.join(str(symbol) for symbol in undefined_symbols)}" + ) raise error +def check_grammar_types(grammar, *, start_symbol=""): + if not grammar: + return + + LOGGER.debug("Checking types") + + symbol_types = {} + + def compatible(tp1, tp2): + if tp1 in ["int", "bytes"] and tp2 in ["int", "bytes"]: + return True + return tp1 == tp2 + + def get_type(tree, rule_symbol) -> tuple[Optional[str], int, int, int]: + # LOGGER.debug(f"Checking type of {tree!s} in {rule_symbol!s} ({tree.node_type!s})") + nonlocal symbol_types, grammar + + if tree.node_type == NodeType.TERMINAL: + tp = type(tree.symbol.symbol).__name__ + # LOGGER.debug(f"Type of {tree.symbol.symbol!r} is {tp!r}") + bits = 1 if isinstance(tree.symbol.symbol, int) else 0 + return tp, bits, bits, 0 + + elif ( + tree.node_type == NodeType.REPETITION + or tree.node_type == NodeType.STAR + or tree.node_type == NodeType.PLUS + or tree.node_type == NodeType.OPTION + ): + tp, min_bits, max_bits, step = get_type(tree.node, rule_symbol) + # if min_bits % 8 != 0 and tree.min == 0: + # raise ValueError(f"{rule_symbol!s}: Bits cannot be optional") + + step = min(min_bits, max_bits) + return tp, tree.min * min_bits, tree.max * max_bits, step + + elif tree.node_type == NodeType.NON_TERMINAL: + if tree.symbol in symbol_types: + return symbol_types[tree.symbol] + + symbol_types[tree.symbol] = (None, 0, 0, 0) + symbol_tree = grammar.rules[tree.symbol] + tp, min_bits, max_bits, step = get_type(symbol_tree, str(tree.symbol)) + symbol_types[tree.symbol] = tp, min_bits, max_bits, step + # LOGGER.debug(f"Type of {tree.symbol!s} is {tp!r} with {min_bits}..{max_bits} bits") + return tp, min_bits, max_bits, step + + elif ( + tree.node_type == NodeType.CONCATENATION + or tree.node_type == NodeType.ALTERNATIVE + ): + common_tp = None + tp_child = None + min_bits = max_bits = step = None + for child in tree.children(): + tp, min_child_bits, max_child_bits, child_step = get_type( + child, rule_symbol + ) + if min_bits is None: + min_bits = min_child_bits + max_bits = max_child_bits + step = child_step + elif tree.node_type == NodeType.CONCATENATION: + min_bits += min_child_bits + max_bits += max_child_bits + step += child_step + else: # NodeType.ALTERNATIVE + min_bits = min(min_bits, min_child_bits) + max_bits = max(max_bits, max_child_bits) + step += min(step, child_step) + if tp is None: + continue + if common_tp is None: + common_tp = tp + tp_child = child + continue + if not compatible(tp, common_tp): + if tree.node_type == NodeType.CONCATENATION: + LOGGER.warning( + f"{rule_symbol!s}: Concatenating {common_tp!r} ({tp_child!s}) and {tp!r} ({child!s})" + ) + else: + LOGGER.warning( + f"{rule_symbol!s}: Type can be {common_tp!r} ({tp_child!s}) or {tp!r} ({child!s})" + ) + common_tp = tp + + # LOGGER.debug(f"Type of {rule_symbol!s} is {common_tp!r} with {min_bits}..{max_bits} bits") + return common_tp, min_bits, max_bits, step + + raise ValueError("Unknown node type") + + start_tree = grammar.rules[NonTerminal(start_symbol)] + _, min_start_bits, max_start_bits, start_step = get_type( + start_tree, str(start_symbol) + ) + if start_step > 0 and any( + bits % 8 != 0 for bits in range(min_start_bits, max_start_bits + 1, start_step) + ): + if min_start_bits != max_start_bits: + LOGGER.warning( + f"{start_symbol!s}: Number of bits ({min_start_bits}..{max_start_bits}) may not be a multiple of eight" + ) + else: + LOGGER.warning( + f"{start_symbol!s}: Number of bits ({min_start_bits}) is not a multiple of eight" + ) + + def check_constraints_existence(grammar, constraints): LOGGER.debug("Checking constraints") @@ -506,7 +634,9 @@ def check_constraints_existence(grammar, constraints): closest = closest_match(first_missing_symbol, defined_symbols) if len(missing) > 1: - missing_symbols = ", ".join(["<" + str(symbol) + ">" for symbol in missing]) + missing_symbols = ", ".join( + ["<" + str(symbol) + ">" for symbol in missing] + ) error = NameError( f"{constraint}: undefined symbols {missing_symbols}. Did you mean {closest!s}?" ) @@ -525,7 +655,9 @@ def check_constraints_existence(grammar, constraints): # This handles [...]. as ... # We could also interpret the actual [...] contents here, # but slices and chains could make this hard -- AZ - recurse = f"<{parent!s}>[" in str(value) or f"..<{symbol!s}>" in str(value) + recurse = f"<{parent!s}>[" in str(value) or f"..<{symbol!s}>" in str( + value + ) if not check_constraints_existence_children( grammar, parent, symbol, recurse, indirect_child ): diff --git a/src/fandango/language/parser/FandangoLexer.interp b/src/fandango/language/parser/FandangoLexer.interp index 9e37c83c..c53c4f38 100644 --- a/src/fandango/language/parser/FandangoLexer.interp +++ b/src/fandango/language/parser/FandangoLexer.interp @@ -389,4 +389,4 @@ mode names: DEFAULT_MODE atn: -[4, 0, 116, 1032, 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, 2, 87, 7, 87, 2, 88, 7, 88, 2, 89, 7, 89, 2, 90, 7, 90, 2, 91, 7, 91, 2, 92, 7, 92, 2, 93, 7, 93, 2, 94, 7, 94, 2, 95, 7, 95, 2, 96, 7, 96, 2, 97, 7, 97, 2, 98, 7, 98, 2, 99, 7, 99, 2, 100, 7, 100, 2, 101, 7, 101, 2, 102, 7, 102, 2, 103, 7, 103, 2, 104, 7, 104, 2, 105, 7, 105, 2, 106, 7, 106, 2, 107, 7, 107, 2, 108, 7, 108, 2, 109, 7, 109, 2, 110, 7, 110, 2, 111, 7, 111, 2, 112, 7, 112, 2, 113, 7, 113, 2, 114, 7, 114, 2, 115, 7, 115, 2, 116, 7, 116, 2, 117, 7, 117, 2, 118, 7, 118, 2, 119, 7, 119, 2, 120, 7, 120, 2, 121, 7, 121, 2, 122, 7, 122, 2, 123, 7, 123, 2, 124, 7, 124, 2, 125, 7, 125, 2, 126, 7, 126, 2, 127, 7, 127, 2, 128, 7, 128, 2, 129, 7, 129, 2, 130, 7, 130, 2, 131, 7, 131, 2, 132, 7, 132, 2, 133, 7, 133, 2, 134, 7, 134, 2, 135, 7, 135, 2, 136, 7, 136, 2, 137, 7, 137, 2, 138, 7, 138, 2, 139, 7, 139, 2, 140, 7, 140, 2, 141, 7, 141, 2, 142, 7, 142, 1, 0, 1, 0, 3, 0, 290, 8, 0, 1, 1, 1, 1, 1, 1, 3, 1, 295, 8, 1, 1, 2, 1, 2, 1, 2, 1, 2, 3, 2, 301, 8, 2, 1, 3, 1, 3, 1, 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, 5, 1, 5, 4, 5, 320, 8, 5, 11, 5, 12, 5, 321, 1, 5, 1, 5, 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, 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, 10, 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, 13, 1, 13, 1, 13, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 16, 1, 16, 1, 16, 1, 16, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 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, 23, 1, 23, 1, 23, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 27, 1, 27, 1, 27, 1, 28, 1, 28, 1, 28, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 33, 1, 33, 1, 33, 1, 33, 1, 34, 1, 34, 1, 34, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 41, 1, 41, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 49, 1, 49, 5, 49, 590, 8, 49, 10, 49, 12, 49, 593, 9, 49, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 3, 50, 600, 8, 50, 1, 50, 1, 50, 3, 50, 604, 8, 50, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 3, 51, 611, 8, 51, 1, 51, 1, 51, 3, 51, 615, 8, 51, 1, 52, 1, 52, 5, 52, 619, 8, 52, 10, 52, 12, 52, 622, 9, 52, 1, 52, 4, 52, 625, 8, 52, 11, 52, 12, 52, 626, 3, 52, 629, 8, 52, 1, 53, 1, 53, 1, 53, 4, 53, 634, 8, 53, 11, 53, 12, 53, 635, 1, 54, 1, 54, 1, 54, 4, 54, 641, 8, 54, 11, 54, 12, 54, 642, 1, 55, 1, 55, 1, 55, 4, 55, 648, 8, 55, 11, 55, 12, 55, 649, 1, 56, 1, 56, 3, 56, 654, 8, 56, 1, 57, 1, 57, 3, 57, 658, 8, 57, 1, 57, 1, 57, 1, 58, 1, 58, 1, 58, 1, 58, 1, 59, 1, 59, 1, 60, 1, 60, 1, 61, 1, 61, 1, 62, 1, 62, 1, 62, 1, 63, 1, 63, 1, 63, 1, 63, 1, 64, 1, 64, 1, 65, 1, 65, 1, 65, 1, 66, 1, 66, 1, 66, 1, 67, 1, 67, 1, 68, 1, 68, 1, 69, 1, 69, 1, 70, 1, 70, 1, 70, 1, 71, 1, 71, 1, 72, 1, 72, 1, 72, 1, 73, 1, 73, 1, 73, 1, 74, 1, 74, 1, 75, 1, 75, 1, 76, 1, 76, 1, 77, 1, 77, 1, 77, 1, 78, 1, 78, 1, 78, 1, 79, 1, 79, 1, 80, 1, 80, 1, 81, 1, 81, 1, 82, 1, 82, 1, 83, 1, 83, 1, 83, 1, 84, 1, 84, 1, 85, 1, 85, 1, 85, 1, 86, 1, 86, 1, 86, 1, 87, 1, 87, 1, 88, 1, 88, 1, 89, 1, 89, 1, 89, 1, 90, 1, 90, 1, 90, 1, 91, 1, 91, 1, 91, 1, 92, 1, 92, 1, 92, 1, 93, 1, 93, 1, 93, 1, 94, 1, 94, 1, 95, 1, 95, 1, 95, 1, 96, 1, 96, 1, 96, 1, 97, 1, 97, 1, 97, 1, 98, 1, 98, 1, 98, 1, 99, 1, 99, 1, 99, 1, 100, 1, 100, 1, 100, 1, 101, 1, 101, 1, 101, 1, 102, 1, 102, 1, 102, 1, 103, 1, 103, 1, 103, 1, 104, 1, 104, 1, 104, 1, 105, 1, 105, 1, 105, 1, 105, 1, 106, 1, 106, 1, 106, 1, 106, 1, 107, 1, 107, 1, 107, 1, 107, 1, 108, 1, 108, 1, 108, 1, 108, 1, 109, 1, 109, 1, 109, 1, 110, 1, 110, 1, 111, 3, 111, 808, 8, 111, 1, 111, 1, 111, 3, 111, 812, 8, 111, 1, 111, 3, 111, 815, 8, 111, 1, 111, 1, 111, 1, 112, 1, 112, 1, 112, 3, 112, 822, 8, 112, 1, 112, 1, 112, 1, 113, 1, 113, 1, 114, 1, 114, 1, 114, 5, 114, 831, 8, 114, 10, 114, 12, 114, 834, 9, 114, 1, 114, 1, 114, 1, 114, 1, 114, 5, 114, 840, 8, 114, 10, 114, 12, 114, 843, 9, 114, 1, 114, 3, 114, 846, 8, 114, 1, 115, 1, 115, 1, 115, 1, 115, 1, 115, 5, 115, 853, 8, 115, 10, 115, 12, 115, 856, 9, 115, 1, 115, 1, 115, 1, 115, 1, 115, 1, 115, 1, 115, 1, 115, 1, 115, 5, 115, 866, 8, 115, 10, 115, 12, 115, 869, 9, 115, 1, 115, 1, 115, 1, 115, 3, 115, 874, 8, 115, 1, 116, 1, 116, 3, 116, 878, 8, 116, 1, 117, 1, 117, 1, 118, 1, 118, 1, 118, 1, 118, 3, 118, 886, 8, 118, 1, 119, 1, 119, 1, 120, 1, 120, 1, 121, 1, 121, 1, 122, 1, 122, 1, 123, 1, 123, 1, 124, 3, 124, 899, 8, 124, 1, 124, 1, 124, 1, 124, 1, 124, 3, 124, 905, 8, 124, 1, 125, 1, 125, 3, 125, 909, 8, 125, 1, 125, 1, 125, 1, 126, 4, 126, 914, 8, 126, 11, 126, 12, 126, 915, 1, 127, 1, 127, 4, 127, 920, 8, 127, 11, 127, 12, 127, 921, 1, 128, 1, 128, 3, 128, 926, 8, 128, 1, 128, 4, 128, 929, 8, 128, 11, 128, 12, 128, 930, 1, 129, 1, 129, 1, 129, 5, 129, 936, 8, 129, 10, 129, 12, 129, 939, 9, 129, 1, 129, 1, 129, 1, 129, 1, 129, 5, 129, 945, 8, 129, 10, 129, 12, 129, 948, 9, 129, 1, 129, 3, 129, 951, 8, 129, 1, 130, 1, 130, 1, 130, 1, 130, 1, 130, 5, 130, 958, 8, 130, 10, 130, 12, 130, 961, 9, 130, 1, 130, 1, 130, 1, 130, 1, 130, 1, 130, 1, 130, 1, 130, 1, 130, 5, 130, 971, 8, 130, 10, 130, 12, 130, 974, 9, 130, 1, 130, 1, 130, 1, 130, 3, 130, 979, 8, 130, 1, 131, 1, 131, 3, 131, 983, 8, 131, 1, 132, 3, 132, 986, 8, 132, 1, 133, 3, 133, 989, 8, 133, 1, 134, 3, 134, 992, 8, 134, 1, 135, 1, 135, 1, 135, 1, 136, 4, 136, 998, 8, 136, 11, 136, 12, 136, 999, 1, 137, 1, 137, 5, 137, 1004, 8, 137, 10, 137, 12, 137, 1007, 9, 137, 1, 138, 1, 138, 3, 138, 1011, 8, 138, 1, 138, 3, 138, 1014, 8, 138, 1, 138, 1, 138, 3, 138, 1018, 8, 138, 1, 139, 1, 139, 1, 140, 1, 140, 1, 141, 1, 141, 3, 141, 1026, 8, 141, 1, 142, 1, 142, 1, 142, 3, 142, 1031, 8, 142, 4, 854, 867, 959, 972, 0, 143, 1, 3, 3, 4, 5, 5, 7, 6, 9, 7, 11, 8, 13, 9, 15, 10, 17, 11, 19, 12, 21, 13, 23, 14, 25, 15, 27, 16, 29, 17, 31, 18, 33, 19, 35, 20, 37, 21, 39, 22, 41, 23, 43, 24, 45, 25, 47, 26, 49, 27, 51, 28, 53, 29, 55, 30, 57, 31, 59, 32, 61, 33, 63, 34, 65, 35, 67, 36, 69, 37, 71, 38, 73, 39, 75, 40, 77, 41, 79, 42, 81, 43, 83, 44, 85, 45, 87, 46, 89, 47, 91, 48, 93, 49, 95, 50, 97, 51, 99, 52, 101, 53, 103, 54, 105, 55, 107, 56, 109, 57, 111, 58, 113, 59, 115, 60, 117, 61, 119, 62, 121, 63, 123, 64, 125, 65, 127, 66, 129, 67, 131, 68, 133, 69, 135, 70, 137, 71, 139, 72, 141, 73, 143, 74, 145, 75, 147, 76, 149, 77, 151, 78, 153, 79, 155, 80, 157, 81, 159, 82, 161, 83, 163, 84, 165, 85, 167, 86, 169, 87, 171, 88, 173, 89, 175, 90, 177, 91, 179, 92, 181, 93, 183, 94, 185, 95, 187, 96, 189, 97, 191, 98, 193, 99, 195, 100, 197, 101, 199, 102, 201, 103, 203, 104, 205, 105, 207, 106, 209, 107, 211, 108, 213, 109, 215, 110, 217, 111, 219, 112, 221, 113, 223, 114, 225, 115, 227, 116, 229, 0, 231, 0, 233, 0, 235, 0, 237, 0, 239, 0, 241, 0, 243, 0, 245, 0, 247, 0, 249, 0, 251, 0, 253, 0, 255, 0, 257, 0, 259, 0, 261, 0, 263, 0, 265, 0, 267, 0, 269, 0, 271, 0, 273, 0, 275, 0, 277, 0, 279, 0, 281, 0, 283, 0, 285, 0, 1, 0, 27, 6, 0, 70, 70, 82, 82, 85, 85, 102, 102, 114, 114, 117, 117, 2, 0, 70, 70, 102, 102, 2, 0, 82, 82, 114, 114, 2, 0, 66, 66, 98, 98, 2, 0, 79, 79, 111, 111, 2, 0, 88, 88, 120, 120, 2, 0, 74, 74, 106, 106, 4, 0, 10, 10, 12, 13, 39, 39, 92, 92, 4, 0, 10, 10, 12, 13, 34, 34, 92, 92, 1, 0, 92, 92, 1, 0, 49, 57, 1, 0, 48, 57, 1, 0, 48, 55, 3, 0, 48, 57, 65, 70, 97, 102, 1, 0, 48, 49, 2, 0, 69, 69, 101, 101, 2, 0, 43, 43, 45, 45, 5, 0, 0, 9, 11, 12, 14, 38, 40, 91, 93, 127, 5, 0, 0, 9, 11, 12, 14, 33, 35, 91, 93, 127, 2, 0, 0, 91, 93, 127, 1, 0, 0, 127, 2, 0, 9, 9, 32, 32, 2, 0, 10, 10, 12, 13, 4, 0, 6277, 6278, 8472, 8472, 8494, 8494, 12443, 12444, 4, 0, 183, 183, 903, 903, 4969, 4977, 6618, 6618, 663, 0, 65, 90, 95, 95, 97, 122, 170, 170, 181, 181, 186, 186, 192, 214, 216, 246, 248, 705, 710, 721, 736, 740, 748, 748, 750, 750, 880, 884, 886, 887, 890, 893, 895, 895, 902, 902, 904, 906, 908, 908, 910, 929, 931, 1013, 1015, 1153, 1162, 1327, 1329, 1366, 1369, 1369, 1376, 1416, 1488, 1514, 1519, 1522, 1568, 1610, 1646, 1647, 1649, 1747, 1749, 1749, 1765, 1766, 1774, 1775, 1786, 1788, 1791, 1791, 1808, 1808, 1810, 1839, 1869, 1957, 1969, 1969, 1994, 2026, 2036, 2037, 2042, 2042, 2048, 2069, 2074, 2074, 2084, 2084, 2088, 2088, 2112, 2136, 2144, 2154, 2160, 2183, 2185, 2190, 2208, 2249, 2308, 2361, 2365, 2365, 2384, 2384, 2392, 2401, 2417, 2432, 2437, 2444, 2447, 2448, 2451, 2472, 2474, 2480, 2482, 2482, 2486, 2489, 2493, 2493, 2510, 2510, 2524, 2525, 2527, 2529, 2544, 2545, 2556, 2556, 2565, 2570, 2575, 2576, 2579, 2600, 2602, 2608, 2610, 2611, 2613, 2614, 2616, 2617, 2649, 2652, 2654, 2654, 2674, 2676, 2693, 2701, 2703, 2705, 2707, 2728, 2730, 2736, 2738, 2739, 2741, 2745, 2749, 2749, 2768, 2768, 2784, 2785, 2809, 2809, 2821, 2828, 2831, 2832, 2835, 2856, 2858, 2864, 2866, 2867, 2869, 2873, 2877, 2877, 2908, 2909, 2911, 2913, 2929, 2929, 2947, 2947, 2949, 2954, 2958, 2960, 2962, 2965, 2969, 2970, 2972, 2972, 2974, 2975, 2979, 2980, 2984, 2986, 2990, 3001, 3024, 3024, 3077, 3084, 3086, 3088, 3090, 3112, 3114, 3129, 3133, 3133, 3160, 3162, 3165, 3165, 3168, 3169, 3200, 3200, 3205, 3212, 3214, 3216, 3218, 3240, 3242, 3251, 3253, 3257, 3261, 3261, 3293, 3294, 3296, 3297, 3313, 3314, 3332, 3340, 3342, 3344, 3346, 3386, 3389, 3389, 3406, 3406, 3412, 3414, 3423, 3425, 3450, 3455, 3461, 3478, 3482, 3505, 3507, 3515, 3517, 3517, 3520, 3526, 3585, 3632, 3634, 3635, 3648, 3654, 3713, 3714, 3716, 3716, 3718, 3722, 3724, 3747, 3749, 3749, 3751, 3760, 3762, 3763, 3773, 3773, 3776, 3780, 3782, 3782, 3804, 3807, 3840, 3840, 3904, 3911, 3913, 3948, 3976, 3980, 4096, 4138, 4159, 4159, 4176, 4181, 4186, 4189, 4193, 4193, 4197, 4198, 4206, 4208, 4213, 4225, 4238, 4238, 4256, 4293, 4295, 4295, 4301, 4301, 4304, 4346, 4348, 4680, 4682, 4685, 4688, 4694, 4696, 4696, 4698, 4701, 4704, 4744, 4746, 4749, 4752, 4784, 4786, 4789, 4792, 4798, 4800, 4800, 4802, 4805, 4808, 4822, 4824, 4880, 4882, 4885, 4888, 4954, 4992, 5007, 5024, 5109, 5112, 5117, 5121, 5740, 5743, 5759, 5761, 5786, 5792, 5866, 5870, 5880, 5888, 5905, 5919, 5937, 5952, 5969, 5984, 5996, 5998, 6000, 6016, 6067, 6103, 6103, 6108, 6108, 6176, 6264, 6272, 6276, 6279, 6312, 6314, 6314, 6320, 6389, 6400, 6430, 6480, 6509, 6512, 6516, 6528, 6571, 6576, 6601, 6656, 6678, 6688, 6740, 6823, 6823, 6917, 6963, 6981, 6988, 7043, 7072, 7086, 7087, 7098, 7141, 7168, 7203, 7245, 7247, 7258, 7293, 7296, 7304, 7312, 7354, 7357, 7359, 7401, 7404, 7406, 7411, 7413, 7414, 7418, 7418, 7424, 7615, 7680, 7957, 7960, 7965, 7968, 8005, 8008, 8013, 8016, 8023, 8025, 8025, 8027, 8027, 8029, 8029, 8031, 8061, 8064, 8116, 8118, 8124, 8126, 8126, 8130, 8132, 8134, 8140, 8144, 8147, 8150, 8155, 8160, 8172, 8178, 8180, 8182, 8188, 8305, 8305, 8319, 8319, 8336, 8348, 8450, 8450, 8455, 8455, 8458, 8467, 8469, 8469, 8473, 8477, 8484, 8484, 8486, 8486, 8488, 8488, 8490, 8493, 8495, 8505, 8508, 8511, 8517, 8521, 8526, 8526, 8544, 8584, 11264, 11492, 11499, 11502, 11506, 11507, 11520, 11557, 11559, 11559, 11565, 11565, 11568, 11623, 11631, 11631, 11648, 11670, 11680, 11686, 11688, 11694, 11696, 11702, 11704, 11710, 11712, 11718, 11720, 11726, 11728, 11734, 11736, 11742, 11823, 11823, 12293, 12295, 12321, 12329, 12337, 12341, 12344, 12348, 12353, 12438, 12445, 12447, 12449, 12538, 12540, 12543, 12549, 12591, 12593, 12686, 12704, 12735, 12784, 12799, 13312, 19903, 19968, 42124, 42192, 42237, 42240, 42508, 42512, 42527, 42538, 42539, 42560, 42606, 42623, 42653, 42656, 42735, 42775, 42783, 42786, 42888, 42891, 42954, 42960, 42961, 42963, 42963, 42965, 42969, 42994, 43009, 43011, 43013, 43015, 43018, 43020, 43042, 43072, 43123, 43138, 43187, 43250, 43255, 43259, 43259, 43261, 43262, 43274, 43301, 43312, 43334, 43360, 43388, 43396, 43442, 43471, 43471, 43488, 43492, 43494, 43503, 43514, 43518, 43520, 43560, 43584, 43586, 43588, 43595, 43616, 43638, 43642, 43642, 43646, 43695, 43697, 43697, 43701, 43702, 43705, 43709, 43712, 43712, 43714, 43714, 43739, 43741, 43744, 43754, 43762, 43764, 43777, 43782, 43785, 43790, 43793, 43798, 43808, 43814, 43816, 43822, 43824, 43866, 43868, 43881, 43888, 44002, 44032, 55203, 55216, 55238, 55243, 55291, 63744, 64109, 64112, 64217, 64256, 64262, 64275, 64279, 64285, 64285, 64287, 64296, 64298, 64310, 64312, 64316, 64318, 64318, 64320, 64321, 64323, 64324, 64326, 64433, 64467, 64829, 64848, 64911, 64914, 64967, 65008, 65019, 65136, 65140, 65142, 65276, 65313, 65338, 65345, 65370, 65382, 65470, 65474, 65479, 65482, 65487, 65490, 65495, 65498, 65500, 65536, 65547, 65549, 65574, 65576, 65594, 65596, 65597, 65599, 65613, 65616, 65629, 65664, 65786, 65856, 65908, 66176, 66204, 66208, 66256, 66304, 66335, 66349, 66378, 66384, 66421, 66432, 66461, 66464, 66499, 66504, 66511, 66513, 66517, 66560, 66717, 66736, 66771, 66776, 66811, 66816, 66855, 66864, 66915, 66928, 66938, 66940, 66954, 66956, 66962, 66964, 66965, 66967, 66977, 66979, 66993, 66995, 67001, 67003, 67004, 67072, 67382, 67392, 67413, 67424, 67431, 67456, 67461, 67463, 67504, 67506, 67514, 67584, 67589, 67592, 67592, 67594, 67637, 67639, 67640, 67644, 67644, 67647, 67669, 67680, 67702, 67712, 67742, 67808, 67826, 67828, 67829, 67840, 67861, 67872, 67897, 67968, 68023, 68030, 68031, 68096, 68096, 68112, 68115, 68117, 68119, 68121, 68149, 68192, 68220, 68224, 68252, 68288, 68295, 68297, 68324, 68352, 68405, 68416, 68437, 68448, 68466, 68480, 68497, 68608, 68680, 68736, 68786, 68800, 68850, 68864, 68899, 69248, 69289, 69296, 69297, 69376, 69404, 69415, 69415, 69424, 69445, 69488, 69505, 69552, 69572, 69600, 69622, 69635, 69687, 69745, 69746, 69749, 69749, 69763, 69807, 69840, 69864, 69891, 69926, 69956, 69956, 69959, 69959, 69968, 70002, 70006, 70006, 70019, 70066, 70081, 70084, 70106, 70106, 70108, 70108, 70144, 70161, 70163, 70187, 70207, 70208, 70272, 70278, 70280, 70280, 70282, 70285, 70287, 70301, 70303, 70312, 70320, 70366, 70405, 70412, 70415, 70416, 70419, 70440, 70442, 70448, 70450, 70451, 70453, 70457, 70461, 70461, 70480, 70480, 70493, 70497, 70656, 70708, 70727, 70730, 70751, 70753, 70784, 70831, 70852, 70853, 70855, 70855, 71040, 71086, 71128, 71131, 71168, 71215, 71236, 71236, 71296, 71338, 71352, 71352, 71424, 71450, 71488, 71494, 71680, 71723, 71840, 71903, 71935, 71942, 71945, 71945, 71948, 71955, 71957, 71958, 71960, 71983, 71999, 71999, 72001, 72001, 72096, 72103, 72106, 72144, 72161, 72161, 72163, 72163, 72192, 72192, 72203, 72242, 72250, 72250, 72272, 72272, 72284, 72329, 72349, 72349, 72368, 72440, 72704, 72712, 72714, 72750, 72768, 72768, 72818, 72847, 72960, 72966, 72968, 72969, 72971, 73008, 73030, 73030, 73056, 73061, 73063, 73064, 73066, 73097, 73112, 73112, 73440, 73458, 73474, 73474, 73476, 73488, 73490, 73523, 73648, 73648, 73728, 74649, 74752, 74862, 74880, 75075, 77712, 77808, 77824, 78895, 78913, 78918, 82944, 83526, 92160, 92728, 92736, 92766, 92784, 92862, 92880, 92909, 92928, 92975, 92992, 92995, 93027, 93047, 93053, 93071, 93760, 93823, 93952, 94026, 94032, 94032, 94099, 94111, 94176, 94177, 94179, 94179, 94208, 100343, 100352, 101589, 101632, 101640, 110576, 110579, 110581, 110587, 110589, 110590, 110592, 110882, 110898, 110898, 110928, 110930, 110933, 110933, 110948, 110951, 110960, 111355, 113664, 113770, 113776, 113788, 113792, 113800, 113808, 113817, 119808, 119892, 119894, 119964, 119966, 119967, 119970, 119970, 119973, 119974, 119977, 119980, 119982, 119993, 119995, 119995, 119997, 120003, 120005, 120069, 120071, 120074, 120077, 120084, 120086, 120092, 120094, 120121, 120123, 120126, 120128, 120132, 120134, 120134, 120138, 120144, 120146, 120485, 120488, 120512, 120514, 120538, 120540, 120570, 120572, 120596, 120598, 120628, 120630, 120654, 120656, 120686, 120688, 120712, 120714, 120744, 120746, 120770, 120772, 120779, 122624, 122654, 122661, 122666, 122928, 122989, 123136, 123180, 123191, 123197, 123214, 123214, 123536, 123565, 123584, 123627, 124112, 124139, 124896, 124902, 124904, 124907, 124909, 124910, 124912, 124926, 124928, 125124, 125184, 125251, 125259, 125259, 126464, 126467, 126469, 126495, 126497, 126498, 126500, 126500, 126503, 126503, 126505, 126514, 126516, 126519, 126521, 126521, 126523, 126523, 126530, 126530, 126535, 126535, 126537, 126537, 126539, 126539, 126541, 126543, 126545, 126546, 126548, 126548, 126551, 126551, 126553, 126553, 126555, 126555, 126557, 126557, 126559, 126559, 126561, 126562, 126564, 126564, 126567, 126570, 126572, 126578, 126580, 126583, 126585, 126588, 126590, 126590, 126592, 126601, 126603, 126619, 126625, 126627, 126629, 126633, 126635, 126651, 131072, 173791, 173824, 177977, 177984, 178205, 178208, 183969, 183984, 191456, 194560, 195101, 196608, 201546, 201552, 205743, 372, 0, 48, 57, 95, 95, 768, 879, 1155, 1159, 1425, 1469, 1471, 1471, 1473, 1474, 1476, 1477, 1479, 1479, 1552, 1562, 1611, 1641, 1648, 1648, 1750, 1756, 1759, 1764, 1767, 1768, 1770, 1773, 1776, 1785, 1809, 1809, 1840, 1866, 1958, 1968, 1984, 1993, 2027, 2035, 2045, 2045, 2070, 2073, 2075, 2083, 2085, 2087, 2089, 2093, 2137, 2139, 2200, 2207, 2250, 2273, 2275, 2307, 2362, 2364, 2366, 2383, 2385, 2391, 2402, 2403, 2406, 2415, 2433, 2435, 2492, 2492, 2494, 2500, 2503, 2504, 2507, 2509, 2519, 2519, 2530, 2531, 2534, 2543, 2558, 2558, 2561, 2563, 2620, 2620, 2622, 2626, 2631, 2632, 2635, 2637, 2641, 2641, 2662, 2673, 2677, 2677, 2689, 2691, 2748, 2748, 2750, 2757, 2759, 2761, 2763, 2765, 2786, 2787, 2790, 2799, 2810, 2815, 2817, 2819, 2876, 2876, 2878, 2884, 2887, 2888, 2891, 2893, 2901, 2903, 2914, 2915, 2918, 2927, 2946, 2946, 3006, 3010, 3014, 3016, 3018, 3021, 3031, 3031, 3046, 3055, 3072, 3076, 3132, 3132, 3134, 3140, 3142, 3144, 3146, 3149, 3157, 3158, 3170, 3171, 3174, 3183, 3201, 3203, 3260, 3260, 3262, 3268, 3270, 3272, 3274, 3277, 3285, 3286, 3298, 3299, 3302, 3311, 3315, 3315, 3328, 3331, 3387, 3388, 3390, 3396, 3398, 3400, 3402, 3405, 3415, 3415, 3426, 3427, 3430, 3439, 3457, 3459, 3530, 3530, 3535, 3540, 3542, 3542, 3544, 3551, 3558, 3567, 3570, 3571, 3633, 3633, 3636, 3642, 3655, 3662, 3664, 3673, 3761, 3761, 3764, 3772, 3784, 3790, 3792, 3801, 3864, 3865, 3872, 3881, 3893, 3893, 3895, 3895, 3897, 3897, 3902, 3903, 3953, 3972, 3974, 3975, 3981, 3991, 3993, 4028, 4038, 4038, 4139, 4158, 4160, 4169, 4182, 4185, 4190, 4192, 4194, 4196, 4199, 4205, 4209, 4212, 4226, 4237, 4239, 4253, 4957, 4959, 5906, 5909, 5938, 5940, 5970, 5971, 6002, 6003, 6068, 6099, 6109, 6109, 6112, 6121, 6155, 6157, 6159, 6169, 6277, 6278, 6313, 6313, 6432, 6443, 6448, 6459, 6470, 6479, 6608, 6617, 6679, 6683, 6741, 6750, 6752, 6780, 6783, 6793, 6800, 6809, 6832, 6845, 6847, 6862, 6912, 6916, 6964, 6980, 6992, 7001, 7019, 7027, 7040, 7042, 7073, 7085, 7088, 7097, 7142, 7155, 7204, 7223, 7232, 7241, 7248, 7257, 7376, 7378, 7380, 7400, 7405, 7405, 7412, 7412, 7415, 7417, 7616, 7679, 8255, 8256, 8276, 8276, 8400, 8412, 8417, 8417, 8421, 8432, 11503, 11505, 11647, 11647, 11744, 11775, 12330, 12335, 12441, 12442, 42528, 42537, 42607, 42607, 42612, 42621, 42654, 42655, 42736, 42737, 43010, 43010, 43014, 43014, 43019, 43019, 43043, 43047, 43052, 43052, 43136, 43137, 43188, 43205, 43216, 43225, 43232, 43249, 43263, 43273, 43302, 43309, 43335, 43347, 43392, 43395, 43443, 43456, 43472, 43481, 43493, 43493, 43504, 43513, 43561, 43574, 43587, 43587, 43596, 43597, 43600, 43609, 43643, 43645, 43696, 43696, 43698, 43700, 43703, 43704, 43710, 43711, 43713, 43713, 43755, 43759, 43765, 43766, 44003, 44010, 44012, 44013, 44016, 44025, 64286, 64286, 65024, 65039, 65056, 65071, 65075, 65076, 65101, 65103, 65296, 65305, 65343, 65343, 66045, 66045, 66272, 66272, 66422, 66426, 66720, 66729, 68097, 68099, 68101, 68102, 68108, 68111, 68152, 68154, 68159, 68159, 68325, 68326, 68900, 68903, 68912, 68921, 69291, 69292, 69373, 69375, 69446, 69456, 69506, 69509, 69632, 69634, 69688, 69702, 69734, 69744, 69747, 69748, 69759, 69762, 69808, 69818, 69826, 69826, 69872, 69881, 69888, 69890, 69927, 69940, 69942, 69951, 69957, 69958, 70003, 70003, 70016, 70018, 70067, 70080, 70089, 70092, 70094, 70105, 70188, 70199, 70206, 70206, 70209, 70209, 70367, 70378, 70384, 70393, 70400, 70403, 70459, 70460, 70462, 70468, 70471, 70472, 70475, 70477, 70487, 70487, 70498, 70499, 70502, 70508, 70512, 70516, 70709, 70726, 70736, 70745, 70750, 70750, 70832, 70851, 70864, 70873, 71087, 71093, 71096, 71104, 71132, 71133, 71216, 71232, 71248, 71257, 71339, 71351, 71360, 71369, 71453, 71467, 71472, 71481, 71724, 71738, 71904, 71913, 71984, 71989, 71991, 71992, 71995, 71998, 72000, 72000, 72002, 72003, 72016, 72025, 72145, 72151, 72154, 72160, 72164, 72164, 72193, 72202, 72243, 72249, 72251, 72254, 72263, 72263, 72273, 72283, 72330, 72345, 72751, 72758, 72760, 72767, 72784, 72793, 72850, 72871, 72873, 72886, 73009, 73014, 73018, 73018, 73020, 73021, 73023, 73029, 73031, 73031, 73040, 73049, 73098, 73102, 73104, 73105, 73107, 73111, 73120, 73129, 73459, 73462, 73472, 73473, 73475, 73475, 73524, 73530, 73534, 73538, 73552, 73561, 78912, 78912, 78919, 78933, 92768, 92777, 92864, 92873, 92912, 92916, 92976, 92982, 93008, 93017, 94031, 94031, 94033, 94087, 94095, 94098, 94180, 94180, 94192, 94193, 113821, 113822, 118528, 118573, 118576, 118598, 119141, 119145, 119149, 119154, 119163, 119170, 119173, 119179, 119210, 119213, 119362, 119364, 120782, 120831, 121344, 121398, 121403, 121452, 121461, 121461, 121476, 121476, 121499, 121503, 121505, 121519, 122880, 122886, 122888, 122904, 122907, 122913, 122915, 122916, 122918, 122922, 123023, 123023, 123184, 123190, 123200, 123209, 123566, 123566, 123628, 123641, 124140, 124153, 125136, 125142, 125252, 125258, 125264, 125273, 130032, 130041, 917760, 917999, 1064, 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, 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, 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, 169, 1, 0, 0, 0, 0, 171, 1, 0, 0, 0, 0, 173, 1, 0, 0, 0, 0, 175, 1, 0, 0, 0, 0, 177, 1, 0, 0, 0, 0, 179, 1, 0, 0, 0, 0, 181, 1, 0, 0, 0, 0, 183, 1, 0, 0, 0, 0, 185, 1, 0, 0, 0, 0, 187, 1, 0, 0, 0, 0, 189, 1, 0, 0, 0, 0, 191, 1, 0, 0, 0, 0, 193, 1, 0, 0, 0, 0, 195, 1, 0, 0, 0, 0, 197, 1, 0, 0, 0, 0, 199, 1, 0, 0, 0, 0, 201, 1, 0, 0, 0, 0, 203, 1, 0, 0, 0, 0, 205, 1, 0, 0, 0, 0, 207, 1, 0, 0, 0, 0, 209, 1, 0, 0, 0, 0, 211, 1, 0, 0, 0, 0, 213, 1, 0, 0, 0, 0, 215, 1, 0, 0, 0, 0, 217, 1, 0, 0, 0, 0, 219, 1, 0, 0, 0, 0, 221, 1, 0, 0, 0, 0, 223, 1, 0, 0, 0, 0, 225, 1, 0, 0, 0, 0, 227, 1, 0, 0, 0, 1, 289, 1, 0, 0, 0, 3, 294, 1, 0, 0, 0, 5, 300, 1, 0, 0, 0, 7, 302, 1, 0, 0, 0, 9, 309, 1, 0, 0, 0, 11, 317, 1, 0, 0, 0, 13, 325, 1, 0, 0, 0, 15, 329, 1, 0, 0, 0, 17, 332, 1, 0, 0, 0, 19, 339, 1, 0, 0, 0, 21, 345, 1, 0, 0, 0, 23, 351, 1, 0, 0, 0, 25, 357, 1, 0, 0, 0, 27, 364, 1, 0, 0, 0, 29, 372, 1, 0, 0, 0, 31, 381, 1, 0, 0, 0, 33, 387, 1, 0, 0, 0, 35, 391, 1, 0, 0, 0, 37, 398, 1, 0, 0, 0, 39, 405, 1, 0, 0, 0, 41, 414, 1, 0, 0, 0, 43, 420, 1, 0, 0, 0, 45, 430, 1, 0, 0, 0, 47, 436, 1, 0, 0, 0, 49, 441, 1, 0, 0, 0, 51, 448, 1, 0, 0, 0, 53, 453, 1, 0, 0, 0, 55, 460, 1, 0, 0, 0, 57, 463, 1, 0, 0, 0, 59, 466, 1, 0, 0, 0, 61, 473, 1, 0, 0, 0, 63, 481, 1, 0, 0, 0, 65, 486, 1, 0, 0, 0, 67, 495, 1, 0, 0, 0, 69, 499, 1, 0, 0, 0, 71, 502, 1, 0, 0, 0, 73, 507, 1, 0, 0, 0, 75, 513, 1, 0, 0, 0, 77, 520, 1, 0, 0, 0, 79, 525, 1, 0, 0, 0, 81, 531, 1, 0, 0, 0, 83, 536, 1, 0, 0, 0, 85, 538, 1, 0, 0, 0, 87, 546, 1, 0, 0, 0, 89, 552, 1, 0, 0, 0, 91, 559, 1, 0, 0, 0, 93, 565, 1, 0, 0, 0, 95, 572, 1, 0, 0, 0, 97, 579, 1, 0, 0, 0, 99, 587, 1, 0, 0, 0, 101, 599, 1, 0, 0, 0, 103, 610, 1, 0, 0, 0, 105, 628, 1, 0, 0, 0, 107, 630, 1, 0, 0, 0, 109, 637, 1, 0, 0, 0, 111, 644, 1, 0, 0, 0, 113, 653, 1, 0, 0, 0, 115, 657, 1, 0, 0, 0, 117, 661, 1, 0, 0, 0, 119, 665, 1, 0, 0, 0, 121, 667, 1, 0, 0, 0, 123, 669, 1, 0, 0, 0, 125, 671, 1, 0, 0, 0, 127, 674, 1, 0, 0, 0, 129, 678, 1, 0, 0, 0, 131, 680, 1, 0, 0, 0, 133, 683, 1, 0, 0, 0, 135, 686, 1, 0, 0, 0, 137, 688, 1, 0, 0, 0, 139, 690, 1, 0, 0, 0, 141, 692, 1, 0, 0, 0, 143, 695, 1, 0, 0, 0, 145, 697, 1, 0, 0, 0, 147, 700, 1, 0, 0, 0, 149, 703, 1, 0, 0, 0, 151, 705, 1, 0, 0, 0, 153, 707, 1, 0, 0, 0, 155, 709, 1, 0, 0, 0, 157, 712, 1, 0, 0, 0, 159, 715, 1, 0, 0, 0, 161, 717, 1, 0, 0, 0, 163, 719, 1, 0, 0, 0, 165, 721, 1, 0, 0, 0, 167, 723, 1, 0, 0, 0, 169, 726, 1, 0, 0, 0, 171, 728, 1, 0, 0, 0, 173, 731, 1, 0, 0, 0, 175, 734, 1, 0, 0, 0, 177, 736, 1, 0, 0, 0, 179, 738, 1, 0, 0, 0, 181, 741, 1, 0, 0, 0, 183, 744, 1, 0, 0, 0, 185, 747, 1, 0, 0, 0, 187, 750, 1, 0, 0, 0, 189, 753, 1, 0, 0, 0, 191, 755, 1, 0, 0, 0, 193, 758, 1, 0, 0, 0, 195, 761, 1, 0, 0, 0, 197, 764, 1, 0, 0, 0, 199, 767, 1, 0, 0, 0, 201, 770, 1, 0, 0, 0, 203, 773, 1, 0, 0, 0, 205, 776, 1, 0, 0, 0, 207, 779, 1, 0, 0, 0, 209, 782, 1, 0, 0, 0, 211, 785, 1, 0, 0, 0, 213, 789, 1, 0, 0, 0, 215, 793, 1, 0, 0, 0, 217, 797, 1, 0, 0, 0, 219, 801, 1, 0, 0, 0, 221, 804, 1, 0, 0, 0, 223, 811, 1, 0, 0, 0, 225, 821, 1, 0, 0, 0, 227, 825, 1, 0, 0, 0, 229, 845, 1, 0, 0, 0, 231, 873, 1, 0, 0, 0, 233, 877, 1, 0, 0, 0, 235, 879, 1, 0, 0, 0, 237, 885, 1, 0, 0, 0, 239, 887, 1, 0, 0, 0, 241, 889, 1, 0, 0, 0, 243, 891, 1, 0, 0, 0, 245, 893, 1, 0, 0, 0, 247, 895, 1, 0, 0, 0, 249, 904, 1, 0, 0, 0, 251, 908, 1, 0, 0, 0, 253, 913, 1, 0, 0, 0, 255, 917, 1, 0, 0, 0, 257, 923, 1, 0, 0, 0, 259, 950, 1, 0, 0, 0, 261, 978, 1, 0, 0, 0, 263, 982, 1, 0, 0, 0, 265, 985, 1, 0, 0, 0, 267, 988, 1, 0, 0, 0, 269, 991, 1, 0, 0, 0, 271, 993, 1, 0, 0, 0, 273, 997, 1, 0, 0, 0, 275, 1001, 1, 0, 0, 0, 277, 1008, 1, 0, 0, 0, 279, 1019, 1, 0, 0, 0, 281, 1021, 1, 0, 0, 0, 283, 1025, 1, 0, 0, 0, 285, 1030, 1, 0, 0, 0, 287, 290, 3, 101, 50, 0, 288, 290, 3, 103, 51, 0, 289, 287, 1, 0, 0, 0, 289, 288, 1, 0, 0, 0, 290, 2, 1, 0, 0, 0, 291, 295, 3, 5, 2, 0, 292, 295, 3, 113, 56, 0, 293, 295, 3, 115, 57, 0, 294, 291, 1, 0, 0, 0, 294, 292, 1, 0, 0, 0, 294, 293, 1, 0, 0, 0, 295, 4, 1, 0, 0, 0, 296, 301, 3, 105, 52, 0, 297, 301, 3, 107, 53, 0, 298, 301, 3, 109, 54, 0, 299, 301, 3, 111, 55, 0, 300, 296, 1, 0, 0, 0, 300, 297, 1, 0, 0, 0, 300, 298, 1, 0, 0, 0, 300, 299, 1, 0, 0, 0, 301, 6, 1, 0, 0, 0, 302, 303, 5, 60, 0, 0, 303, 304, 5, 112, 0, 0, 304, 305, 5, 121, 0, 0, 305, 306, 5, 62, 0, 0, 306, 307, 1, 0, 0, 0, 307, 308, 6, 3, 0, 0, 308, 8, 1, 0, 0, 0, 309, 310, 5, 60, 0, 0, 310, 311, 5, 47, 0, 0, 311, 312, 5, 112, 0, 0, 312, 313, 5, 121, 0, 0, 313, 314, 5, 62, 0, 0, 314, 315, 1, 0, 0, 0, 315, 316, 6, 4, 1, 0, 316, 10, 1, 0, 0, 0, 317, 319, 5, 60, 0, 0, 318, 320, 3, 285, 142, 0, 319, 318, 1, 0, 0, 0, 320, 321, 1, 0, 0, 0, 321, 319, 1, 0, 0, 0, 321, 322, 1, 0, 0, 0, 322, 323, 1, 0, 0, 0, 323, 324, 5, 62, 0, 0, 324, 12, 1, 0, 0, 0, 325, 326, 5, 97, 0, 0, 326, 327, 5, 110, 0, 0, 327, 328, 5, 100, 0, 0, 328, 14, 1, 0, 0, 0, 329, 330, 5, 97, 0, 0, 330, 331, 5, 115, 0, 0, 331, 16, 1, 0, 0, 0, 332, 333, 5, 97, 0, 0, 333, 334, 5, 115, 0, 0, 334, 335, 5, 115, 0, 0, 335, 336, 5, 101, 0, 0, 336, 337, 5, 114, 0, 0, 337, 338, 5, 116, 0, 0, 338, 18, 1, 0, 0, 0, 339, 340, 5, 97, 0, 0, 340, 341, 5, 115, 0, 0, 341, 342, 5, 121, 0, 0, 342, 343, 5, 110, 0, 0, 343, 344, 5, 99, 0, 0, 344, 20, 1, 0, 0, 0, 345, 346, 5, 97, 0, 0, 346, 347, 5, 119, 0, 0, 347, 348, 5, 97, 0, 0, 348, 349, 5, 105, 0, 0, 349, 350, 5, 116, 0, 0, 350, 22, 1, 0, 0, 0, 351, 352, 5, 98, 0, 0, 352, 353, 5, 114, 0, 0, 353, 354, 5, 101, 0, 0, 354, 355, 5, 97, 0, 0, 355, 356, 5, 107, 0, 0, 356, 24, 1, 0, 0, 0, 357, 358, 5, 99, 0, 0, 358, 359, 5, 97, 0, 0, 359, 360, 5, 115, 0, 0, 360, 361, 5, 101, 0, 0, 361, 362, 1, 0, 0, 0, 362, 363, 6, 12, 2, 0, 363, 26, 1, 0, 0, 0, 364, 365, 5, 99, 0, 0, 365, 366, 5, 108, 0, 0, 366, 367, 5, 97, 0, 0, 367, 368, 5, 115, 0, 0, 368, 369, 5, 115, 0, 0, 369, 370, 1, 0, 0, 0, 370, 371, 6, 13, 3, 0, 371, 28, 1, 0, 0, 0, 372, 373, 5, 99, 0, 0, 373, 374, 5, 111, 0, 0, 374, 375, 5, 110, 0, 0, 375, 376, 5, 116, 0, 0, 376, 377, 5, 105, 0, 0, 377, 378, 5, 110, 0, 0, 378, 379, 5, 117, 0, 0, 379, 380, 5, 101, 0, 0, 380, 30, 1, 0, 0, 0, 381, 382, 5, 100, 0, 0, 382, 383, 5, 101, 0, 0, 383, 384, 5, 102, 0, 0, 384, 385, 1, 0, 0, 0, 385, 386, 6, 15, 4, 0, 386, 32, 1, 0, 0, 0, 387, 388, 5, 100, 0, 0, 388, 389, 5, 101, 0, 0, 389, 390, 5, 108, 0, 0, 390, 34, 1, 0, 0, 0, 391, 392, 5, 101, 0, 0, 392, 393, 5, 108, 0, 0, 393, 394, 5, 105, 0, 0, 394, 395, 5, 102, 0, 0, 395, 396, 1, 0, 0, 0, 396, 397, 6, 17, 5, 0, 397, 36, 1, 0, 0, 0, 398, 399, 5, 101, 0, 0, 399, 400, 5, 108, 0, 0, 400, 401, 5, 115, 0, 0, 401, 402, 5, 101, 0, 0, 402, 403, 1, 0, 0, 0, 403, 404, 6, 18, 6, 0, 404, 38, 1, 0, 0, 0, 405, 406, 5, 101, 0, 0, 406, 407, 5, 120, 0, 0, 407, 408, 5, 99, 0, 0, 408, 409, 5, 101, 0, 0, 409, 410, 5, 112, 0, 0, 410, 411, 5, 116, 0, 0, 411, 412, 1, 0, 0, 0, 412, 413, 6, 19, 7, 0, 413, 40, 1, 0, 0, 0, 414, 415, 5, 70, 0, 0, 415, 416, 5, 97, 0, 0, 416, 417, 5, 108, 0, 0, 417, 418, 5, 115, 0, 0, 418, 419, 5, 101, 0, 0, 419, 42, 1, 0, 0, 0, 420, 421, 5, 102, 0, 0, 421, 422, 5, 105, 0, 0, 422, 423, 5, 110, 0, 0, 423, 424, 5, 97, 0, 0, 424, 425, 5, 108, 0, 0, 425, 426, 5, 108, 0, 0, 426, 427, 5, 121, 0, 0, 427, 428, 1, 0, 0, 0, 428, 429, 6, 21, 8, 0, 429, 44, 1, 0, 0, 0, 430, 431, 5, 102, 0, 0, 431, 432, 5, 111, 0, 0, 432, 433, 5, 114, 0, 0, 433, 434, 1, 0, 0, 0, 434, 435, 6, 22, 9, 0, 435, 46, 1, 0, 0, 0, 436, 437, 5, 102, 0, 0, 437, 438, 5, 114, 0, 0, 438, 439, 5, 111, 0, 0, 439, 440, 5, 109, 0, 0, 440, 48, 1, 0, 0, 0, 441, 442, 5, 103, 0, 0, 442, 443, 5, 108, 0, 0, 443, 444, 5, 111, 0, 0, 444, 445, 5, 98, 0, 0, 445, 446, 5, 97, 0, 0, 446, 447, 5, 108, 0, 0, 447, 50, 1, 0, 0, 0, 448, 449, 5, 105, 0, 0, 449, 450, 5, 102, 0, 0, 450, 451, 1, 0, 0, 0, 451, 452, 6, 25, 10, 0, 452, 52, 1, 0, 0, 0, 453, 454, 5, 105, 0, 0, 454, 455, 5, 109, 0, 0, 455, 456, 5, 112, 0, 0, 456, 457, 5, 111, 0, 0, 457, 458, 5, 114, 0, 0, 458, 459, 5, 116, 0, 0, 459, 54, 1, 0, 0, 0, 460, 461, 5, 105, 0, 0, 461, 462, 5, 110, 0, 0, 462, 56, 1, 0, 0, 0, 463, 464, 5, 105, 0, 0, 464, 465, 5, 115, 0, 0, 465, 58, 1, 0, 0, 0, 466, 467, 5, 108, 0, 0, 467, 468, 5, 97, 0, 0, 468, 469, 5, 109, 0, 0, 469, 470, 5, 98, 0, 0, 470, 471, 5, 100, 0, 0, 471, 472, 5, 97, 0, 0, 472, 60, 1, 0, 0, 0, 473, 474, 5, 109, 0, 0, 474, 475, 5, 97, 0, 0, 475, 476, 5, 116, 0, 0, 476, 477, 5, 99, 0, 0, 477, 478, 5, 104, 0, 0, 478, 479, 1, 0, 0, 0, 479, 480, 6, 30, 11, 0, 480, 62, 1, 0, 0, 0, 481, 482, 5, 78, 0, 0, 482, 483, 5, 111, 0, 0, 483, 484, 5, 110, 0, 0, 484, 485, 5, 101, 0, 0, 485, 64, 1, 0, 0, 0, 486, 487, 5, 110, 0, 0, 487, 488, 5, 111, 0, 0, 488, 489, 5, 110, 0, 0, 489, 490, 5, 108, 0, 0, 490, 491, 5, 111, 0, 0, 491, 492, 5, 99, 0, 0, 492, 493, 5, 97, 0, 0, 493, 494, 5, 108, 0, 0, 494, 66, 1, 0, 0, 0, 495, 496, 5, 110, 0, 0, 496, 497, 5, 111, 0, 0, 497, 498, 5, 116, 0, 0, 498, 68, 1, 0, 0, 0, 499, 500, 5, 111, 0, 0, 500, 501, 5, 114, 0, 0, 501, 70, 1, 0, 0, 0, 502, 503, 5, 112, 0, 0, 503, 504, 5, 97, 0, 0, 504, 505, 5, 115, 0, 0, 505, 506, 5, 115, 0, 0, 506, 72, 1, 0, 0, 0, 507, 508, 5, 114, 0, 0, 508, 509, 5, 97, 0, 0, 509, 510, 5, 105, 0, 0, 510, 511, 5, 115, 0, 0, 511, 512, 5, 101, 0, 0, 512, 74, 1, 0, 0, 0, 513, 514, 5, 114, 0, 0, 514, 515, 5, 101, 0, 0, 515, 516, 5, 116, 0, 0, 516, 517, 5, 117, 0, 0, 517, 518, 5, 114, 0, 0, 518, 519, 5, 110, 0, 0, 519, 76, 1, 0, 0, 0, 520, 521, 5, 84, 0, 0, 521, 522, 5, 114, 0, 0, 522, 523, 5, 117, 0, 0, 523, 524, 5, 101, 0, 0, 524, 78, 1, 0, 0, 0, 525, 526, 5, 116, 0, 0, 526, 527, 5, 114, 0, 0, 527, 528, 5, 121, 0, 0, 528, 529, 1, 0, 0, 0, 529, 530, 6, 39, 12, 0, 530, 80, 1, 0, 0, 0, 531, 532, 5, 116, 0, 0, 532, 533, 5, 121, 0, 0, 533, 534, 5, 112, 0, 0, 534, 535, 5, 101, 0, 0, 535, 82, 1, 0, 0, 0, 536, 537, 5, 95, 0, 0, 537, 84, 1, 0, 0, 0, 538, 539, 5, 119, 0, 0, 539, 540, 5, 104, 0, 0, 540, 541, 5, 105, 0, 0, 541, 542, 5, 108, 0, 0, 542, 543, 5, 101, 0, 0, 543, 544, 1, 0, 0, 0, 544, 545, 6, 42, 13, 0, 545, 86, 1, 0, 0, 0, 546, 547, 5, 119, 0, 0, 547, 548, 5, 104, 0, 0, 548, 549, 5, 101, 0, 0, 549, 550, 5, 114, 0, 0, 550, 551, 5, 101, 0, 0, 551, 88, 1, 0, 0, 0, 552, 553, 5, 119, 0, 0, 553, 554, 5, 105, 0, 0, 554, 555, 5, 116, 0, 0, 555, 556, 5, 104, 0, 0, 556, 557, 1, 0, 0, 0, 557, 558, 6, 44, 14, 0, 558, 90, 1, 0, 0, 0, 559, 560, 5, 121, 0, 0, 560, 561, 5, 105, 0, 0, 561, 562, 5, 101, 0, 0, 562, 563, 5, 108, 0, 0, 563, 564, 5, 100, 0, 0, 564, 92, 1, 0, 0, 0, 565, 566, 5, 102, 0, 0, 566, 567, 5, 111, 0, 0, 567, 568, 5, 114, 0, 0, 568, 569, 5, 97, 0, 0, 569, 570, 5, 108, 0, 0, 570, 571, 5, 108, 0, 0, 571, 94, 1, 0, 0, 0, 572, 573, 5, 101, 0, 0, 573, 574, 5, 120, 0, 0, 574, 575, 5, 105, 0, 0, 575, 576, 5, 115, 0, 0, 576, 577, 5, 116, 0, 0, 577, 578, 5, 115, 0, 0, 578, 96, 1, 0, 0, 0, 579, 580, 5, 102, 0, 0, 580, 581, 5, 105, 0, 0, 581, 582, 5, 116, 0, 0, 582, 583, 5, 110, 0, 0, 583, 584, 5, 101, 0, 0, 584, 585, 5, 115, 0, 0, 585, 586, 5, 115, 0, 0, 586, 98, 1, 0, 0, 0, 587, 591, 3, 283, 141, 0, 588, 590, 3, 285, 142, 0, 589, 588, 1, 0, 0, 0, 590, 593, 1, 0, 0, 0, 591, 589, 1, 0, 0, 0, 591, 592, 1, 0, 0, 0, 592, 100, 1, 0, 0, 0, 593, 591, 1, 0, 0, 0, 594, 600, 7, 0, 0, 0, 595, 596, 7, 1, 0, 0, 596, 600, 7, 2, 0, 0, 597, 598, 7, 2, 0, 0, 598, 600, 7, 1, 0, 0, 599, 594, 1, 0, 0, 0, 599, 595, 1, 0, 0, 0, 599, 597, 1, 0, 0, 0, 599, 600, 1, 0, 0, 0, 600, 603, 1, 0, 0, 0, 601, 604, 3, 229, 114, 0, 602, 604, 3, 231, 115, 0, 603, 601, 1, 0, 0, 0, 603, 602, 1, 0, 0, 0, 604, 102, 1, 0, 0, 0, 605, 611, 7, 3, 0, 0, 606, 607, 7, 3, 0, 0, 607, 611, 7, 2, 0, 0, 608, 609, 7, 2, 0, 0, 609, 611, 7, 3, 0, 0, 610, 605, 1, 0, 0, 0, 610, 606, 1, 0, 0, 0, 610, 608, 1, 0, 0, 0, 611, 614, 1, 0, 0, 0, 612, 615, 3, 259, 129, 0, 613, 615, 3, 261, 130, 0, 614, 612, 1, 0, 0, 0, 614, 613, 1, 0, 0, 0, 615, 104, 1, 0, 0, 0, 616, 620, 3, 239, 119, 0, 617, 619, 3, 241, 120, 0, 618, 617, 1, 0, 0, 0, 619, 622, 1, 0, 0, 0, 620, 618, 1, 0, 0, 0, 620, 621, 1, 0, 0, 0, 621, 629, 1, 0, 0, 0, 622, 620, 1, 0, 0, 0, 623, 625, 5, 48, 0, 0, 624, 623, 1, 0, 0, 0, 625, 626, 1, 0, 0, 0, 626, 624, 1, 0, 0, 0, 626, 627, 1, 0, 0, 0, 627, 629, 1, 0, 0, 0, 628, 616, 1, 0, 0, 0, 628, 624, 1, 0, 0, 0, 629, 106, 1, 0, 0, 0, 630, 631, 5, 48, 0, 0, 631, 633, 7, 4, 0, 0, 632, 634, 3, 243, 121, 0, 633, 632, 1, 0, 0, 0, 634, 635, 1, 0, 0, 0, 635, 633, 1, 0, 0, 0, 635, 636, 1, 0, 0, 0, 636, 108, 1, 0, 0, 0, 637, 638, 5, 48, 0, 0, 638, 640, 7, 5, 0, 0, 639, 641, 3, 245, 122, 0, 640, 639, 1, 0, 0, 0, 641, 642, 1, 0, 0, 0, 642, 640, 1, 0, 0, 0, 642, 643, 1, 0, 0, 0, 643, 110, 1, 0, 0, 0, 644, 645, 5, 48, 0, 0, 645, 647, 7, 3, 0, 0, 646, 648, 3, 247, 123, 0, 647, 646, 1, 0, 0, 0, 648, 649, 1, 0, 0, 0, 649, 647, 1, 0, 0, 0, 649, 650, 1, 0, 0, 0, 650, 112, 1, 0, 0, 0, 651, 654, 3, 249, 124, 0, 652, 654, 3, 251, 125, 0, 653, 651, 1, 0, 0, 0, 653, 652, 1, 0, 0, 0, 654, 114, 1, 0, 0, 0, 655, 658, 3, 113, 56, 0, 656, 658, 3, 253, 126, 0, 657, 655, 1, 0, 0, 0, 657, 656, 1, 0, 0, 0, 658, 659, 1, 0, 0, 0, 659, 660, 7, 6, 0, 0, 660, 116, 1, 0, 0, 0, 661, 662, 5, 58, 0, 0, 662, 663, 5, 58, 0, 0, 663, 664, 5, 61, 0, 0, 664, 118, 1, 0, 0, 0, 665, 666, 5, 63, 0, 0, 666, 120, 1, 0, 0, 0, 667, 668, 5, 92, 0, 0, 668, 122, 1, 0, 0, 0, 669, 670, 5, 46, 0, 0, 670, 124, 1, 0, 0, 0, 671, 672, 5, 46, 0, 0, 672, 673, 5, 46, 0, 0, 673, 126, 1, 0, 0, 0, 674, 675, 5, 46, 0, 0, 675, 676, 5, 46, 0, 0, 676, 677, 5, 46, 0, 0, 677, 128, 1, 0, 0, 0, 678, 679, 5, 42, 0, 0, 679, 130, 1, 0, 0, 0, 680, 681, 5, 40, 0, 0, 681, 682, 6, 65, 15, 0, 682, 132, 1, 0, 0, 0, 683, 684, 5, 41, 0, 0, 684, 685, 6, 66, 16, 0, 685, 134, 1, 0, 0, 0, 686, 687, 5, 44, 0, 0, 687, 136, 1, 0, 0, 0, 688, 689, 5, 58, 0, 0, 689, 138, 1, 0, 0, 0, 690, 691, 5, 59, 0, 0, 691, 140, 1, 0, 0, 0, 692, 693, 5, 42, 0, 0, 693, 694, 5, 42, 0, 0, 694, 142, 1, 0, 0, 0, 695, 696, 5, 61, 0, 0, 696, 144, 1, 0, 0, 0, 697, 698, 5, 91, 0, 0, 698, 699, 6, 72, 17, 0, 699, 146, 1, 0, 0, 0, 700, 701, 5, 93, 0, 0, 701, 702, 6, 73, 18, 0, 702, 148, 1, 0, 0, 0, 703, 704, 5, 124, 0, 0, 704, 150, 1, 0, 0, 0, 705, 706, 5, 94, 0, 0, 706, 152, 1, 0, 0, 0, 707, 708, 5, 38, 0, 0, 708, 154, 1, 0, 0, 0, 709, 710, 5, 60, 0, 0, 710, 711, 5, 60, 0, 0, 711, 156, 1, 0, 0, 0, 712, 713, 5, 62, 0, 0, 713, 714, 5, 62, 0, 0, 714, 158, 1, 0, 0, 0, 715, 716, 5, 43, 0, 0, 716, 160, 1, 0, 0, 0, 717, 718, 5, 45, 0, 0, 718, 162, 1, 0, 0, 0, 719, 720, 5, 47, 0, 0, 720, 164, 1, 0, 0, 0, 721, 722, 5, 37, 0, 0, 722, 166, 1, 0, 0, 0, 723, 724, 5, 47, 0, 0, 724, 725, 5, 47, 0, 0, 725, 168, 1, 0, 0, 0, 726, 727, 5, 126, 0, 0, 727, 170, 1, 0, 0, 0, 728, 729, 5, 123, 0, 0, 729, 730, 6, 85, 19, 0, 730, 172, 1, 0, 0, 0, 731, 732, 5, 125, 0, 0, 732, 733, 6, 86, 20, 0, 733, 174, 1, 0, 0, 0, 734, 735, 5, 60, 0, 0, 735, 176, 1, 0, 0, 0, 736, 737, 5, 62, 0, 0, 737, 178, 1, 0, 0, 0, 738, 739, 5, 61, 0, 0, 739, 740, 5, 61, 0, 0, 740, 180, 1, 0, 0, 0, 741, 742, 5, 62, 0, 0, 742, 743, 5, 61, 0, 0, 743, 182, 1, 0, 0, 0, 744, 745, 5, 60, 0, 0, 745, 746, 5, 61, 0, 0, 746, 184, 1, 0, 0, 0, 747, 748, 5, 60, 0, 0, 748, 749, 5, 62, 0, 0, 749, 186, 1, 0, 0, 0, 750, 751, 5, 33, 0, 0, 751, 752, 5, 61, 0, 0, 752, 188, 1, 0, 0, 0, 753, 754, 5, 64, 0, 0, 754, 190, 1, 0, 0, 0, 755, 756, 5, 45, 0, 0, 756, 757, 5, 62, 0, 0, 757, 192, 1, 0, 0, 0, 758, 759, 5, 43, 0, 0, 759, 760, 5, 61, 0, 0, 760, 194, 1, 0, 0, 0, 761, 762, 5, 45, 0, 0, 762, 763, 5, 61, 0, 0, 763, 196, 1, 0, 0, 0, 764, 765, 5, 42, 0, 0, 765, 766, 5, 61, 0, 0, 766, 198, 1, 0, 0, 0, 767, 768, 5, 64, 0, 0, 768, 769, 5, 61, 0, 0, 769, 200, 1, 0, 0, 0, 770, 771, 5, 47, 0, 0, 771, 772, 5, 61, 0, 0, 772, 202, 1, 0, 0, 0, 773, 774, 5, 37, 0, 0, 774, 775, 5, 61, 0, 0, 775, 204, 1, 0, 0, 0, 776, 777, 5, 38, 0, 0, 777, 778, 5, 61, 0, 0, 778, 206, 1, 0, 0, 0, 779, 780, 5, 124, 0, 0, 780, 781, 5, 61, 0, 0, 781, 208, 1, 0, 0, 0, 782, 783, 5, 94, 0, 0, 783, 784, 5, 61, 0, 0, 784, 210, 1, 0, 0, 0, 785, 786, 5, 60, 0, 0, 786, 787, 5, 60, 0, 0, 787, 788, 5, 61, 0, 0, 788, 212, 1, 0, 0, 0, 789, 790, 5, 62, 0, 0, 790, 791, 5, 62, 0, 0, 791, 792, 5, 61, 0, 0, 792, 214, 1, 0, 0, 0, 793, 794, 5, 42, 0, 0, 794, 795, 5, 42, 0, 0, 795, 796, 5, 61, 0, 0, 796, 216, 1, 0, 0, 0, 797, 798, 5, 47, 0, 0, 798, 799, 5, 47, 0, 0, 799, 800, 5, 61, 0, 0, 800, 218, 1, 0, 0, 0, 801, 802, 5, 58, 0, 0, 802, 803, 5, 61, 0, 0, 803, 220, 1, 0, 0, 0, 804, 805, 5, 33, 0, 0, 805, 222, 1, 0, 0, 0, 806, 808, 5, 13, 0, 0, 807, 806, 1, 0, 0, 0, 807, 808, 1, 0, 0, 0, 808, 809, 1, 0, 0, 0, 809, 812, 5, 10, 0, 0, 810, 812, 2, 12, 13, 0, 811, 807, 1, 0, 0, 0, 811, 810, 1, 0, 0, 0, 812, 814, 1, 0, 0, 0, 813, 815, 3, 273, 136, 0, 814, 813, 1, 0, 0, 0, 814, 815, 1, 0, 0, 0, 815, 816, 1, 0, 0, 0, 816, 817, 6, 111, 21, 0, 817, 224, 1, 0, 0, 0, 818, 822, 3, 273, 136, 0, 819, 822, 3, 275, 137, 0, 820, 822, 3, 277, 138, 0, 821, 818, 1, 0, 0, 0, 821, 819, 1, 0, 0, 0, 821, 820, 1, 0, 0, 0, 822, 823, 1, 0, 0, 0, 823, 824, 6, 112, 22, 0, 824, 226, 1, 0, 0, 0, 825, 826, 9, 0, 0, 0, 826, 228, 1, 0, 0, 0, 827, 832, 5, 39, 0, 0, 828, 831, 3, 237, 118, 0, 829, 831, 8, 7, 0, 0, 830, 828, 1, 0, 0, 0, 830, 829, 1, 0, 0, 0, 831, 834, 1, 0, 0, 0, 832, 830, 1, 0, 0, 0, 832, 833, 1, 0, 0, 0, 833, 835, 1, 0, 0, 0, 834, 832, 1, 0, 0, 0, 835, 846, 5, 39, 0, 0, 836, 841, 5, 34, 0, 0, 837, 840, 3, 237, 118, 0, 838, 840, 8, 8, 0, 0, 839, 837, 1, 0, 0, 0, 839, 838, 1, 0, 0, 0, 840, 843, 1, 0, 0, 0, 841, 839, 1, 0, 0, 0, 841, 842, 1, 0, 0, 0, 842, 844, 1, 0, 0, 0, 843, 841, 1, 0, 0, 0, 844, 846, 5, 34, 0, 0, 845, 827, 1, 0, 0, 0, 845, 836, 1, 0, 0, 0, 846, 230, 1, 0, 0, 0, 847, 848, 5, 39, 0, 0, 848, 849, 5, 39, 0, 0, 849, 850, 5, 39, 0, 0, 850, 854, 1, 0, 0, 0, 851, 853, 3, 233, 116, 0, 852, 851, 1, 0, 0, 0, 853, 856, 1, 0, 0, 0, 854, 855, 1, 0, 0, 0, 854, 852, 1, 0, 0, 0, 855, 857, 1, 0, 0, 0, 856, 854, 1, 0, 0, 0, 857, 858, 5, 39, 0, 0, 858, 859, 5, 39, 0, 0, 859, 874, 5, 39, 0, 0, 860, 861, 5, 34, 0, 0, 861, 862, 5, 34, 0, 0, 862, 863, 5, 34, 0, 0, 863, 867, 1, 0, 0, 0, 864, 866, 3, 233, 116, 0, 865, 864, 1, 0, 0, 0, 866, 869, 1, 0, 0, 0, 867, 868, 1, 0, 0, 0, 867, 865, 1, 0, 0, 0, 868, 870, 1, 0, 0, 0, 869, 867, 1, 0, 0, 0, 870, 871, 5, 34, 0, 0, 871, 872, 5, 34, 0, 0, 872, 874, 5, 34, 0, 0, 873, 847, 1, 0, 0, 0, 873, 860, 1, 0, 0, 0, 874, 232, 1, 0, 0, 0, 875, 878, 3, 235, 117, 0, 876, 878, 3, 237, 118, 0, 877, 875, 1, 0, 0, 0, 877, 876, 1, 0, 0, 0, 878, 234, 1, 0, 0, 0, 879, 880, 8, 9, 0, 0, 880, 236, 1, 0, 0, 0, 881, 882, 5, 92, 0, 0, 882, 886, 9, 0, 0, 0, 883, 884, 5, 92, 0, 0, 884, 886, 3, 223, 111, 0, 885, 881, 1, 0, 0, 0, 885, 883, 1, 0, 0, 0, 886, 238, 1, 0, 0, 0, 887, 888, 7, 10, 0, 0, 888, 240, 1, 0, 0, 0, 889, 890, 7, 11, 0, 0, 890, 242, 1, 0, 0, 0, 891, 892, 7, 12, 0, 0, 892, 244, 1, 0, 0, 0, 893, 894, 7, 13, 0, 0, 894, 246, 1, 0, 0, 0, 895, 896, 7, 14, 0, 0, 896, 248, 1, 0, 0, 0, 897, 899, 3, 253, 126, 0, 898, 897, 1, 0, 0, 0, 898, 899, 1, 0, 0, 0, 899, 900, 1, 0, 0, 0, 900, 905, 3, 255, 127, 0, 901, 902, 3, 253, 126, 0, 902, 903, 5, 46, 0, 0, 903, 905, 1, 0, 0, 0, 904, 898, 1, 0, 0, 0, 904, 901, 1, 0, 0, 0, 905, 250, 1, 0, 0, 0, 906, 909, 3, 253, 126, 0, 907, 909, 3, 249, 124, 0, 908, 906, 1, 0, 0, 0, 908, 907, 1, 0, 0, 0, 909, 910, 1, 0, 0, 0, 910, 911, 3, 257, 128, 0, 911, 252, 1, 0, 0, 0, 912, 914, 3, 241, 120, 0, 913, 912, 1, 0, 0, 0, 914, 915, 1, 0, 0, 0, 915, 913, 1, 0, 0, 0, 915, 916, 1, 0, 0, 0, 916, 254, 1, 0, 0, 0, 917, 919, 5, 46, 0, 0, 918, 920, 3, 241, 120, 0, 919, 918, 1, 0, 0, 0, 920, 921, 1, 0, 0, 0, 921, 919, 1, 0, 0, 0, 921, 922, 1, 0, 0, 0, 922, 256, 1, 0, 0, 0, 923, 925, 7, 15, 0, 0, 924, 926, 7, 16, 0, 0, 925, 924, 1, 0, 0, 0, 925, 926, 1, 0, 0, 0, 926, 928, 1, 0, 0, 0, 927, 929, 3, 241, 120, 0, 928, 927, 1, 0, 0, 0, 929, 930, 1, 0, 0, 0, 930, 928, 1, 0, 0, 0, 930, 931, 1, 0, 0, 0, 931, 258, 1, 0, 0, 0, 932, 937, 5, 39, 0, 0, 933, 936, 3, 265, 132, 0, 934, 936, 3, 271, 135, 0, 935, 933, 1, 0, 0, 0, 935, 934, 1, 0, 0, 0, 936, 939, 1, 0, 0, 0, 937, 935, 1, 0, 0, 0, 937, 938, 1, 0, 0, 0, 938, 940, 1, 0, 0, 0, 939, 937, 1, 0, 0, 0, 940, 951, 5, 39, 0, 0, 941, 946, 5, 34, 0, 0, 942, 945, 3, 267, 133, 0, 943, 945, 3, 271, 135, 0, 944, 942, 1, 0, 0, 0, 944, 943, 1, 0, 0, 0, 945, 948, 1, 0, 0, 0, 946, 944, 1, 0, 0, 0, 946, 947, 1, 0, 0, 0, 947, 949, 1, 0, 0, 0, 948, 946, 1, 0, 0, 0, 949, 951, 5, 34, 0, 0, 950, 932, 1, 0, 0, 0, 950, 941, 1, 0, 0, 0, 951, 260, 1, 0, 0, 0, 952, 953, 5, 39, 0, 0, 953, 954, 5, 39, 0, 0, 954, 955, 5, 39, 0, 0, 955, 959, 1, 0, 0, 0, 956, 958, 3, 263, 131, 0, 957, 956, 1, 0, 0, 0, 958, 961, 1, 0, 0, 0, 959, 960, 1, 0, 0, 0, 959, 957, 1, 0, 0, 0, 960, 962, 1, 0, 0, 0, 961, 959, 1, 0, 0, 0, 962, 963, 5, 39, 0, 0, 963, 964, 5, 39, 0, 0, 964, 979, 5, 39, 0, 0, 965, 966, 5, 34, 0, 0, 966, 967, 5, 34, 0, 0, 967, 968, 5, 34, 0, 0, 968, 972, 1, 0, 0, 0, 969, 971, 3, 263, 131, 0, 970, 969, 1, 0, 0, 0, 971, 974, 1, 0, 0, 0, 972, 973, 1, 0, 0, 0, 972, 970, 1, 0, 0, 0, 973, 975, 1, 0, 0, 0, 974, 972, 1, 0, 0, 0, 975, 976, 5, 34, 0, 0, 976, 977, 5, 34, 0, 0, 977, 979, 5, 34, 0, 0, 978, 952, 1, 0, 0, 0, 978, 965, 1, 0, 0, 0, 979, 262, 1, 0, 0, 0, 980, 983, 3, 269, 134, 0, 981, 983, 3, 271, 135, 0, 982, 980, 1, 0, 0, 0, 982, 981, 1, 0, 0, 0, 983, 264, 1, 0, 0, 0, 984, 986, 7, 17, 0, 0, 985, 984, 1, 0, 0, 0, 986, 266, 1, 0, 0, 0, 987, 989, 7, 18, 0, 0, 988, 987, 1, 0, 0, 0, 989, 268, 1, 0, 0, 0, 990, 992, 7, 19, 0, 0, 991, 990, 1, 0, 0, 0, 992, 270, 1, 0, 0, 0, 993, 994, 5, 92, 0, 0, 994, 995, 7, 20, 0, 0, 995, 272, 1, 0, 0, 0, 996, 998, 7, 21, 0, 0, 997, 996, 1, 0, 0, 0, 998, 999, 1, 0, 0, 0, 999, 997, 1, 0, 0, 0, 999, 1000, 1, 0, 0, 0, 1000, 274, 1, 0, 0, 0, 1001, 1005, 5, 35, 0, 0, 1002, 1004, 8, 22, 0, 0, 1003, 1002, 1, 0, 0, 0, 1004, 1007, 1, 0, 0, 0, 1005, 1003, 1, 0, 0, 0, 1005, 1006, 1, 0, 0, 0, 1006, 276, 1, 0, 0, 0, 1007, 1005, 1, 0, 0, 0, 1008, 1010, 5, 92, 0, 0, 1009, 1011, 3, 273, 136, 0, 1010, 1009, 1, 0, 0, 0, 1010, 1011, 1, 0, 0, 0, 1011, 1017, 1, 0, 0, 0, 1012, 1014, 5, 13, 0, 0, 1013, 1012, 1, 0, 0, 0, 1013, 1014, 1, 0, 0, 0, 1014, 1015, 1, 0, 0, 0, 1015, 1018, 5, 10, 0, 0, 1016, 1018, 2, 12, 13, 0, 1017, 1013, 1, 0, 0, 0, 1017, 1016, 1, 0, 0, 0, 1018, 278, 1, 0, 0, 0, 1019, 1020, 7, 23, 0, 0, 1020, 280, 1, 0, 0, 0, 1021, 1022, 7, 24, 0, 0, 1022, 282, 1, 0, 0, 0, 1023, 1026, 7, 25, 0, 0, 1024, 1026, 3, 279, 139, 0, 1025, 1023, 1, 0, 0, 0, 1025, 1024, 1, 0, 0, 0, 1026, 284, 1, 0, 0, 0, 1027, 1031, 3, 283, 141, 0, 1028, 1031, 7, 26, 0, 0, 1029, 1031, 3, 281, 140, 0, 1030, 1027, 1, 0, 0, 0, 1030, 1028, 1, 0, 0, 0, 1030, 1029, 1, 0, 0, 0, 1031, 286, 1, 0, 0, 0, 58, 0, 289, 294, 300, 321, 591, 599, 603, 610, 614, 620, 626, 628, 635, 642, 649, 653, 657, 807, 811, 814, 821, 830, 832, 839, 841, 845, 854, 867, 873, 877, 885, 898, 904, 908, 915, 921, 925, 930, 935, 937, 944, 946, 950, 959, 972, 978, 982, 985, 988, 991, 999, 1005, 1010, 1013, 1017, 1025, 1030, 23, 1, 3, 0, 1, 4, 1, 1, 12, 2, 1, 13, 3, 1, 15, 4, 1, 17, 5, 1, 18, 6, 1, 19, 7, 1, 21, 8, 1, 22, 9, 1, 25, 10, 1, 30, 11, 1, 39, 12, 1, 42, 13, 1, 44, 14, 1, 65, 15, 1, 66, 16, 1, 72, 17, 1, 73, 18, 1, 85, 19, 1, 86, 20, 1, 111, 21, 0, 1, 0] \ No newline at end of file +[4, 0, 116, 1028, 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, 2, 87, 7, 87, 2, 88, 7, 88, 2, 89, 7, 89, 2, 90, 7, 90, 2, 91, 7, 91, 2, 92, 7, 92, 2, 93, 7, 93, 2, 94, 7, 94, 2, 95, 7, 95, 2, 96, 7, 96, 2, 97, 7, 97, 2, 98, 7, 98, 2, 99, 7, 99, 2, 100, 7, 100, 2, 101, 7, 101, 2, 102, 7, 102, 2, 103, 7, 103, 2, 104, 7, 104, 2, 105, 7, 105, 2, 106, 7, 106, 2, 107, 7, 107, 2, 108, 7, 108, 2, 109, 7, 109, 2, 110, 7, 110, 2, 111, 7, 111, 2, 112, 7, 112, 2, 113, 7, 113, 2, 114, 7, 114, 2, 115, 7, 115, 2, 116, 7, 116, 2, 117, 7, 117, 2, 118, 7, 118, 2, 119, 7, 119, 2, 120, 7, 120, 2, 121, 7, 121, 2, 122, 7, 122, 2, 123, 7, 123, 2, 124, 7, 124, 2, 125, 7, 125, 2, 126, 7, 126, 2, 127, 7, 127, 2, 128, 7, 128, 2, 129, 7, 129, 2, 130, 7, 130, 2, 131, 7, 131, 2, 132, 7, 132, 2, 133, 7, 133, 2, 134, 7, 134, 2, 135, 7, 135, 2, 136, 7, 136, 2, 137, 7, 137, 2, 138, 7, 138, 2, 139, 7, 139, 2, 140, 7, 140, 2, 141, 7, 141, 2, 142, 7, 142, 1, 0, 1, 0, 3, 0, 290, 8, 0, 1, 1, 1, 1, 1, 1, 3, 1, 295, 8, 1, 1, 2, 1, 2, 1, 2, 1, 2, 3, 2, 301, 8, 2, 1, 3, 1, 3, 1, 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, 5, 1, 5, 1, 5, 1, 5, 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, 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, 10, 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, 13, 1, 13, 1, 13, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 16, 1, 16, 1, 16, 1, 16, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 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, 23, 1, 23, 1, 23, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 27, 1, 27, 1, 27, 1, 28, 1, 28, 1, 28, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 33, 1, 33, 1, 33, 1, 33, 1, 34, 1, 34, 1, 34, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 41, 1, 41, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 49, 1, 49, 5, 49, 586, 8, 49, 10, 49, 12, 49, 589, 9, 49, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 3, 50, 596, 8, 50, 1, 50, 1, 50, 3, 50, 600, 8, 50, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 3, 51, 607, 8, 51, 1, 51, 1, 51, 3, 51, 611, 8, 51, 1, 52, 1, 52, 5, 52, 615, 8, 52, 10, 52, 12, 52, 618, 9, 52, 1, 52, 4, 52, 621, 8, 52, 11, 52, 12, 52, 622, 3, 52, 625, 8, 52, 1, 53, 1, 53, 1, 53, 4, 53, 630, 8, 53, 11, 53, 12, 53, 631, 1, 54, 1, 54, 1, 54, 4, 54, 637, 8, 54, 11, 54, 12, 54, 638, 1, 55, 1, 55, 1, 55, 4, 55, 644, 8, 55, 11, 55, 12, 55, 645, 1, 56, 1, 56, 3, 56, 650, 8, 56, 1, 57, 1, 57, 3, 57, 654, 8, 57, 1, 57, 1, 57, 1, 58, 1, 58, 1, 58, 1, 58, 1, 59, 1, 59, 1, 60, 1, 60, 1, 61, 1, 61, 1, 62, 1, 62, 1, 62, 1, 63, 1, 63, 1, 63, 1, 63, 1, 64, 1, 64, 1, 65, 1, 65, 1, 65, 1, 66, 1, 66, 1, 66, 1, 67, 1, 67, 1, 68, 1, 68, 1, 69, 1, 69, 1, 70, 1, 70, 1, 70, 1, 71, 1, 71, 1, 72, 1, 72, 1, 72, 1, 73, 1, 73, 1, 73, 1, 74, 1, 74, 1, 75, 1, 75, 1, 76, 1, 76, 1, 77, 1, 77, 1, 77, 1, 78, 1, 78, 1, 78, 1, 79, 1, 79, 1, 80, 1, 80, 1, 81, 1, 81, 1, 82, 1, 82, 1, 83, 1, 83, 1, 83, 1, 84, 1, 84, 1, 85, 1, 85, 1, 85, 1, 86, 1, 86, 1, 86, 1, 87, 1, 87, 1, 88, 1, 88, 1, 89, 1, 89, 1, 89, 1, 90, 1, 90, 1, 90, 1, 91, 1, 91, 1, 91, 1, 92, 1, 92, 1, 92, 1, 93, 1, 93, 1, 93, 1, 94, 1, 94, 1, 95, 1, 95, 1, 95, 1, 96, 1, 96, 1, 96, 1, 97, 1, 97, 1, 97, 1, 98, 1, 98, 1, 98, 1, 99, 1, 99, 1, 99, 1, 100, 1, 100, 1, 100, 1, 101, 1, 101, 1, 101, 1, 102, 1, 102, 1, 102, 1, 103, 1, 103, 1, 103, 1, 104, 1, 104, 1, 104, 1, 105, 1, 105, 1, 105, 1, 105, 1, 106, 1, 106, 1, 106, 1, 106, 1, 107, 1, 107, 1, 107, 1, 107, 1, 108, 1, 108, 1, 108, 1, 108, 1, 109, 1, 109, 1, 109, 1, 110, 1, 110, 1, 111, 3, 111, 804, 8, 111, 1, 111, 1, 111, 3, 111, 808, 8, 111, 1, 111, 3, 111, 811, 8, 111, 1, 111, 1, 111, 1, 112, 1, 112, 1, 112, 3, 112, 818, 8, 112, 1, 112, 1, 112, 1, 113, 1, 113, 1, 114, 1, 114, 1, 114, 5, 114, 827, 8, 114, 10, 114, 12, 114, 830, 9, 114, 1, 114, 1, 114, 1, 114, 1, 114, 5, 114, 836, 8, 114, 10, 114, 12, 114, 839, 9, 114, 1, 114, 3, 114, 842, 8, 114, 1, 115, 1, 115, 1, 115, 1, 115, 1, 115, 5, 115, 849, 8, 115, 10, 115, 12, 115, 852, 9, 115, 1, 115, 1, 115, 1, 115, 1, 115, 1, 115, 1, 115, 1, 115, 1, 115, 5, 115, 862, 8, 115, 10, 115, 12, 115, 865, 9, 115, 1, 115, 1, 115, 1, 115, 3, 115, 870, 8, 115, 1, 116, 1, 116, 3, 116, 874, 8, 116, 1, 117, 1, 117, 1, 118, 1, 118, 1, 118, 1, 118, 3, 118, 882, 8, 118, 1, 119, 1, 119, 1, 120, 1, 120, 1, 121, 1, 121, 1, 122, 1, 122, 1, 123, 1, 123, 1, 124, 3, 124, 895, 8, 124, 1, 124, 1, 124, 1, 124, 1, 124, 3, 124, 901, 8, 124, 1, 125, 1, 125, 3, 125, 905, 8, 125, 1, 125, 1, 125, 1, 126, 4, 126, 910, 8, 126, 11, 126, 12, 126, 911, 1, 127, 1, 127, 4, 127, 916, 8, 127, 11, 127, 12, 127, 917, 1, 128, 1, 128, 3, 128, 922, 8, 128, 1, 128, 4, 128, 925, 8, 128, 11, 128, 12, 128, 926, 1, 129, 1, 129, 1, 129, 5, 129, 932, 8, 129, 10, 129, 12, 129, 935, 9, 129, 1, 129, 1, 129, 1, 129, 1, 129, 5, 129, 941, 8, 129, 10, 129, 12, 129, 944, 9, 129, 1, 129, 3, 129, 947, 8, 129, 1, 130, 1, 130, 1, 130, 1, 130, 1, 130, 5, 130, 954, 8, 130, 10, 130, 12, 130, 957, 9, 130, 1, 130, 1, 130, 1, 130, 1, 130, 1, 130, 1, 130, 1, 130, 1, 130, 5, 130, 967, 8, 130, 10, 130, 12, 130, 970, 9, 130, 1, 130, 1, 130, 1, 130, 3, 130, 975, 8, 130, 1, 131, 1, 131, 3, 131, 979, 8, 131, 1, 132, 3, 132, 982, 8, 132, 1, 133, 3, 133, 985, 8, 133, 1, 134, 3, 134, 988, 8, 134, 1, 135, 1, 135, 1, 135, 1, 136, 4, 136, 994, 8, 136, 11, 136, 12, 136, 995, 1, 137, 1, 137, 5, 137, 1000, 8, 137, 10, 137, 12, 137, 1003, 9, 137, 1, 138, 1, 138, 3, 138, 1007, 8, 138, 1, 138, 3, 138, 1010, 8, 138, 1, 138, 1, 138, 3, 138, 1014, 8, 138, 1, 139, 1, 139, 1, 140, 1, 140, 1, 141, 1, 141, 3, 141, 1022, 8, 141, 1, 142, 1, 142, 1, 142, 3, 142, 1027, 8, 142, 4, 850, 863, 955, 968, 0, 143, 1, 3, 3, 4, 5, 5, 7, 6, 9, 7, 11, 8, 13, 9, 15, 10, 17, 11, 19, 12, 21, 13, 23, 14, 25, 15, 27, 16, 29, 17, 31, 18, 33, 19, 35, 20, 37, 21, 39, 22, 41, 23, 43, 24, 45, 25, 47, 26, 49, 27, 51, 28, 53, 29, 55, 30, 57, 31, 59, 32, 61, 33, 63, 34, 65, 35, 67, 36, 69, 37, 71, 38, 73, 39, 75, 40, 77, 41, 79, 42, 81, 43, 83, 44, 85, 45, 87, 46, 89, 47, 91, 48, 93, 49, 95, 50, 97, 51, 99, 52, 101, 53, 103, 54, 105, 55, 107, 56, 109, 57, 111, 58, 113, 59, 115, 60, 117, 61, 119, 62, 121, 63, 123, 64, 125, 65, 127, 66, 129, 67, 131, 68, 133, 69, 135, 70, 137, 71, 139, 72, 141, 73, 143, 74, 145, 75, 147, 76, 149, 77, 151, 78, 153, 79, 155, 80, 157, 81, 159, 82, 161, 83, 163, 84, 165, 85, 167, 86, 169, 87, 171, 88, 173, 89, 175, 90, 177, 91, 179, 92, 181, 93, 183, 94, 185, 95, 187, 96, 189, 97, 191, 98, 193, 99, 195, 100, 197, 101, 199, 102, 201, 103, 203, 104, 205, 105, 207, 106, 209, 107, 211, 108, 213, 109, 215, 110, 217, 111, 219, 112, 221, 113, 223, 114, 225, 115, 227, 116, 229, 0, 231, 0, 233, 0, 235, 0, 237, 0, 239, 0, 241, 0, 243, 0, 245, 0, 247, 0, 249, 0, 251, 0, 253, 0, 255, 0, 257, 0, 259, 0, 261, 0, 263, 0, 265, 0, 267, 0, 269, 0, 271, 0, 273, 0, 275, 0, 277, 0, 279, 0, 281, 0, 283, 0, 285, 0, 1, 0, 27, 6, 0, 70, 70, 82, 82, 85, 85, 102, 102, 114, 114, 117, 117, 2, 0, 70, 70, 102, 102, 2, 0, 82, 82, 114, 114, 2, 0, 66, 66, 98, 98, 2, 0, 79, 79, 111, 111, 2, 0, 88, 88, 120, 120, 2, 0, 74, 74, 106, 106, 4, 0, 10, 10, 12, 13, 39, 39, 92, 92, 4, 0, 10, 10, 12, 13, 34, 34, 92, 92, 1, 0, 92, 92, 1, 0, 49, 57, 1, 0, 48, 57, 1, 0, 48, 55, 3, 0, 48, 57, 65, 70, 97, 102, 1, 0, 48, 49, 2, 0, 69, 69, 101, 101, 2, 0, 43, 43, 45, 45, 5, 0, 0, 9, 11, 12, 14, 38, 40, 91, 93, 127, 5, 0, 0, 9, 11, 12, 14, 33, 35, 91, 93, 127, 2, 0, 0, 91, 93, 127, 1, 0, 0, 127, 2, 0, 9, 9, 32, 32, 2, 0, 10, 10, 12, 13, 4, 0, 6277, 6278, 8472, 8472, 8494, 8494, 12443, 12444, 4, 0, 183, 183, 903, 903, 4969, 4977, 6618, 6618, 663, 0, 65, 90, 95, 95, 97, 122, 170, 170, 181, 181, 186, 186, 192, 214, 216, 246, 248, 705, 710, 721, 736, 740, 748, 748, 750, 750, 880, 884, 886, 887, 890, 893, 895, 895, 902, 902, 904, 906, 908, 908, 910, 929, 931, 1013, 1015, 1153, 1162, 1327, 1329, 1366, 1369, 1369, 1376, 1416, 1488, 1514, 1519, 1522, 1568, 1610, 1646, 1647, 1649, 1747, 1749, 1749, 1765, 1766, 1774, 1775, 1786, 1788, 1791, 1791, 1808, 1808, 1810, 1839, 1869, 1957, 1969, 1969, 1994, 2026, 2036, 2037, 2042, 2042, 2048, 2069, 2074, 2074, 2084, 2084, 2088, 2088, 2112, 2136, 2144, 2154, 2160, 2183, 2185, 2190, 2208, 2249, 2308, 2361, 2365, 2365, 2384, 2384, 2392, 2401, 2417, 2432, 2437, 2444, 2447, 2448, 2451, 2472, 2474, 2480, 2482, 2482, 2486, 2489, 2493, 2493, 2510, 2510, 2524, 2525, 2527, 2529, 2544, 2545, 2556, 2556, 2565, 2570, 2575, 2576, 2579, 2600, 2602, 2608, 2610, 2611, 2613, 2614, 2616, 2617, 2649, 2652, 2654, 2654, 2674, 2676, 2693, 2701, 2703, 2705, 2707, 2728, 2730, 2736, 2738, 2739, 2741, 2745, 2749, 2749, 2768, 2768, 2784, 2785, 2809, 2809, 2821, 2828, 2831, 2832, 2835, 2856, 2858, 2864, 2866, 2867, 2869, 2873, 2877, 2877, 2908, 2909, 2911, 2913, 2929, 2929, 2947, 2947, 2949, 2954, 2958, 2960, 2962, 2965, 2969, 2970, 2972, 2972, 2974, 2975, 2979, 2980, 2984, 2986, 2990, 3001, 3024, 3024, 3077, 3084, 3086, 3088, 3090, 3112, 3114, 3129, 3133, 3133, 3160, 3162, 3165, 3165, 3168, 3169, 3200, 3200, 3205, 3212, 3214, 3216, 3218, 3240, 3242, 3251, 3253, 3257, 3261, 3261, 3293, 3294, 3296, 3297, 3313, 3314, 3332, 3340, 3342, 3344, 3346, 3386, 3389, 3389, 3406, 3406, 3412, 3414, 3423, 3425, 3450, 3455, 3461, 3478, 3482, 3505, 3507, 3515, 3517, 3517, 3520, 3526, 3585, 3632, 3634, 3635, 3648, 3654, 3713, 3714, 3716, 3716, 3718, 3722, 3724, 3747, 3749, 3749, 3751, 3760, 3762, 3763, 3773, 3773, 3776, 3780, 3782, 3782, 3804, 3807, 3840, 3840, 3904, 3911, 3913, 3948, 3976, 3980, 4096, 4138, 4159, 4159, 4176, 4181, 4186, 4189, 4193, 4193, 4197, 4198, 4206, 4208, 4213, 4225, 4238, 4238, 4256, 4293, 4295, 4295, 4301, 4301, 4304, 4346, 4348, 4680, 4682, 4685, 4688, 4694, 4696, 4696, 4698, 4701, 4704, 4744, 4746, 4749, 4752, 4784, 4786, 4789, 4792, 4798, 4800, 4800, 4802, 4805, 4808, 4822, 4824, 4880, 4882, 4885, 4888, 4954, 4992, 5007, 5024, 5109, 5112, 5117, 5121, 5740, 5743, 5759, 5761, 5786, 5792, 5866, 5870, 5880, 5888, 5905, 5919, 5937, 5952, 5969, 5984, 5996, 5998, 6000, 6016, 6067, 6103, 6103, 6108, 6108, 6176, 6264, 6272, 6276, 6279, 6312, 6314, 6314, 6320, 6389, 6400, 6430, 6480, 6509, 6512, 6516, 6528, 6571, 6576, 6601, 6656, 6678, 6688, 6740, 6823, 6823, 6917, 6963, 6981, 6988, 7043, 7072, 7086, 7087, 7098, 7141, 7168, 7203, 7245, 7247, 7258, 7293, 7296, 7304, 7312, 7354, 7357, 7359, 7401, 7404, 7406, 7411, 7413, 7414, 7418, 7418, 7424, 7615, 7680, 7957, 7960, 7965, 7968, 8005, 8008, 8013, 8016, 8023, 8025, 8025, 8027, 8027, 8029, 8029, 8031, 8061, 8064, 8116, 8118, 8124, 8126, 8126, 8130, 8132, 8134, 8140, 8144, 8147, 8150, 8155, 8160, 8172, 8178, 8180, 8182, 8188, 8305, 8305, 8319, 8319, 8336, 8348, 8450, 8450, 8455, 8455, 8458, 8467, 8469, 8469, 8473, 8477, 8484, 8484, 8486, 8486, 8488, 8488, 8490, 8493, 8495, 8505, 8508, 8511, 8517, 8521, 8526, 8526, 8544, 8584, 11264, 11492, 11499, 11502, 11506, 11507, 11520, 11557, 11559, 11559, 11565, 11565, 11568, 11623, 11631, 11631, 11648, 11670, 11680, 11686, 11688, 11694, 11696, 11702, 11704, 11710, 11712, 11718, 11720, 11726, 11728, 11734, 11736, 11742, 11823, 11823, 12293, 12295, 12321, 12329, 12337, 12341, 12344, 12348, 12353, 12438, 12445, 12447, 12449, 12538, 12540, 12543, 12549, 12591, 12593, 12686, 12704, 12735, 12784, 12799, 13312, 19903, 19968, 42124, 42192, 42237, 42240, 42508, 42512, 42527, 42538, 42539, 42560, 42606, 42623, 42653, 42656, 42735, 42775, 42783, 42786, 42888, 42891, 42954, 42960, 42961, 42963, 42963, 42965, 42969, 42994, 43009, 43011, 43013, 43015, 43018, 43020, 43042, 43072, 43123, 43138, 43187, 43250, 43255, 43259, 43259, 43261, 43262, 43274, 43301, 43312, 43334, 43360, 43388, 43396, 43442, 43471, 43471, 43488, 43492, 43494, 43503, 43514, 43518, 43520, 43560, 43584, 43586, 43588, 43595, 43616, 43638, 43642, 43642, 43646, 43695, 43697, 43697, 43701, 43702, 43705, 43709, 43712, 43712, 43714, 43714, 43739, 43741, 43744, 43754, 43762, 43764, 43777, 43782, 43785, 43790, 43793, 43798, 43808, 43814, 43816, 43822, 43824, 43866, 43868, 43881, 43888, 44002, 44032, 55203, 55216, 55238, 55243, 55291, 63744, 64109, 64112, 64217, 64256, 64262, 64275, 64279, 64285, 64285, 64287, 64296, 64298, 64310, 64312, 64316, 64318, 64318, 64320, 64321, 64323, 64324, 64326, 64433, 64467, 64829, 64848, 64911, 64914, 64967, 65008, 65019, 65136, 65140, 65142, 65276, 65313, 65338, 65345, 65370, 65382, 65470, 65474, 65479, 65482, 65487, 65490, 65495, 65498, 65500, 65536, 65547, 65549, 65574, 65576, 65594, 65596, 65597, 65599, 65613, 65616, 65629, 65664, 65786, 65856, 65908, 66176, 66204, 66208, 66256, 66304, 66335, 66349, 66378, 66384, 66421, 66432, 66461, 66464, 66499, 66504, 66511, 66513, 66517, 66560, 66717, 66736, 66771, 66776, 66811, 66816, 66855, 66864, 66915, 66928, 66938, 66940, 66954, 66956, 66962, 66964, 66965, 66967, 66977, 66979, 66993, 66995, 67001, 67003, 67004, 67072, 67382, 67392, 67413, 67424, 67431, 67456, 67461, 67463, 67504, 67506, 67514, 67584, 67589, 67592, 67592, 67594, 67637, 67639, 67640, 67644, 67644, 67647, 67669, 67680, 67702, 67712, 67742, 67808, 67826, 67828, 67829, 67840, 67861, 67872, 67897, 67968, 68023, 68030, 68031, 68096, 68096, 68112, 68115, 68117, 68119, 68121, 68149, 68192, 68220, 68224, 68252, 68288, 68295, 68297, 68324, 68352, 68405, 68416, 68437, 68448, 68466, 68480, 68497, 68608, 68680, 68736, 68786, 68800, 68850, 68864, 68899, 69248, 69289, 69296, 69297, 69376, 69404, 69415, 69415, 69424, 69445, 69488, 69505, 69552, 69572, 69600, 69622, 69635, 69687, 69745, 69746, 69749, 69749, 69763, 69807, 69840, 69864, 69891, 69926, 69956, 69956, 69959, 69959, 69968, 70002, 70006, 70006, 70019, 70066, 70081, 70084, 70106, 70106, 70108, 70108, 70144, 70161, 70163, 70187, 70207, 70208, 70272, 70278, 70280, 70280, 70282, 70285, 70287, 70301, 70303, 70312, 70320, 70366, 70405, 70412, 70415, 70416, 70419, 70440, 70442, 70448, 70450, 70451, 70453, 70457, 70461, 70461, 70480, 70480, 70493, 70497, 70656, 70708, 70727, 70730, 70751, 70753, 70784, 70831, 70852, 70853, 70855, 70855, 71040, 71086, 71128, 71131, 71168, 71215, 71236, 71236, 71296, 71338, 71352, 71352, 71424, 71450, 71488, 71494, 71680, 71723, 71840, 71903, 71935, 71942, 71945, 71945, 71948, 71955, 71957, 71958, 71960, 71983, 71999, 71999, 72001, 72001, 72096, 72103, 72106, 72144, 72161, 72161, 72163, 72163, 72192, 72192, 72203, 72242, 72250, 72250, 72272, 72272, 72284, 72329, 72349, 72349, 72368, 72440, 72704, 72712, 72714, 72750, 72768, 72768, 72818, 72847, 72960, 72966, 72968, 72969, 72971, 73008, 73030, 73030, 73056, 73061, 73063, 73064, 73066, 73097, 73112, 73112, 73440, 73458, 73474, 73474, 73476, 73488, 73490, 73523, 73648, 73648, 73728, 74649, 74752, 74862, 74880, 75075, 77712, 77808, 77824, 78895, 78913, 78918, 82944, 83526, 92160, 92728, 92736, 92766, 92784, 92862, 92880, 92909, 92928, 92975, 92992, 92995, 93027, 93047, 93053, 93071, 93760, 93823, 93952, 94026, 94032, 94032, 94099, 94111, 94176, 94177, 94179, 94179, 94208, 100343, 100352, 101589, 101632, 101640, 110576, 110579, 110581, 110587, 110589, 110590, 110592, 110882, 110898, 110898, 110928, 110930, 110933, 110933, 110948, 110951, 110960, 111355, 113664, 113770, 113776, 113788, 113792, 113800, 113808, 113817, 119808, 119892, 119894, 119964, 119966, 119967, 119970, 119970, 119973, 119974, 119977, 119980, 119982, 119993, 119995, 119995, 119997, 120003, 120005, 120069, 120071, 120074, 120077, 120084, 120086, 120092, 120094, 120121, 120123, 120126, 120128, 120132, 120134, 120134, 120138, 120144, 120146, 120485, 120488, 120512, 120514, 120538, 120540, 120570, 120572, 120596, 120598, 120628, 120630, 120654, 120656, 120686, 120688, 120712, 120714, 120744, 120746, 120770, 120772, 120779, 122624, 122654, 122661, 122666, 122928, 122989, 123136, 123180, 123191, 123197, 123214, 123214, 123536, 123565, 123584, 123627, 124112, 124139, 124896, 124902, 124904, 124907, 124909, 124910, 124912, 124926, 124928, 125124, 125184, 125251, 125259, 125259, 126464, 126467, 126469, 126495, 126497, 126498, 126500, 126500, 126503, 126503, 126505, 126514, 126516, 126519, 126521, 126521, 126523, 126523, 126530, 126530, 126535, 126535, 126537, 126537, 126539, 126539, 126541, 126543, 126545, 126546, 126548, 126548, 126551, 126551, 126553, 126553, 126555, 126555, 126557, 126557, 126559, 126559, 126561, 126562, 126564, 126564, 126567, 126570, 126572, 126578, 126580, 126583, 126585, 126588, 126590, 126590, 126592, 126601, 126603, 126619, 126625, 126627, 126629, 126633, 126635, 126651, 131072, 173791, 173824, 177977, 177984, 178205, 178208, 183969, 183984, 191456, 194560, 195101, 196608, 201546, 201552, 205743, 372, 0, 48, 57, 95, 95, 768, 879, 1155, 1159, 1425, 1469, 1471, 1471, 1473, 1474, 1476, 1477, 1479, 1479, 1552, 1562, 1611, 1641, 1648, 1648, 1750, 1756, 1759, 1764, 1767, 1768, 1770, 1773, 1776, 1785, 1809, 1809, 1840, 1866, 1958, 1968, 1984, 1993, 2027, 2035, 2045, 2045, 2070, 2073, 2075, 2083, 2085, 2087, 2089, 2093, 2137, 2139, 2200, 2207, 2250, 2273, 2275, 2307, 2362, 2364, 2366, 2383, 2385, 2391, 2402, 2403, 2406, 2415, 2433, 2435, 2492, 2492, 2494, 2500, 2503, 2504, 2507, 2509, 2519, 2519, 2530, 2531, 2534, 2543, 2558, 2558, 2561, 2563, 2620, 2620, 2622, 2626, 2631, 2632, 2635, 2637, 2641, 2641, 2662, 2673, 2677, 2677, 2689, 2691, 2748, 2748, 2750, 2757, 2759, 2761, 2763, 2765, 2786, 2787, 2790, 2799, 2810, 2815, 2817, 2819, 2876, 2876, 2878, 2884, 2887, 2888, 2891, 2893, 2901, 2903, 2914, 2915, 2918, 2927, 2946, 2946, 3006, 3010, 3014, 3016, 3018, 3021, 3031, 3031, 3046, 3055, 3072, 3076, 3132, 3132, 3134, 3140, 3142, 3144, 3146, 3149, 3157, 3158, 3170, 3171, 3174, 3183, 3201, 3203, 3260, 3260, 3262, 3268, 3270, 3272, 3274, 3277, 3285, 3286, 3298, 3299, 3302, 3311, 3315, 3315, 3328, 3331, 3387, 3388, 3390, 3396, 3398, 3400, 3402, 3405, 3415, 3415, 3426, 3427, 3430, 3439, 3457, 3459, 3530, 3530, 3535, 3540, 3542, 3542, 3544, 3551, 3558, 3567, 3570, 3571, 3633, 3633, 3636, 3642, 3655, 3662, 3664, 3673, 3761, 3761, 3764, 3772, 3784, 3790, 3792, 3801, 3864, 3865, 3872, 3881, 3893, 3893, 3895, 3895, 3897, 3897, 3902, 3903, 3953, 3972, 3974, 3975, 3981, 3991, 3993, 4028, 4038, 4038, 4139, 4158, 4160, 4169, 4182, 4185, 4190, 4192, 4194, 4196, 4199, 4205, 4209, 4212, 4226, 4237, 4239, 4253, 4957, 4959, 5906, 5909, 5938, 5940, 5970, 5971, 6002, 6003, 6068, 6099, 6109, 6109, 6112, 6121, 6155, 6157, 6159, 6169, 6277, 6278, 6313, 6313, 6432, 6443, 6448, 6459, 6470, 6479, 6608, 6617, 6679, 6683, 6741, 6750, 6752, 6780, 6783, 6793, 6800, 6809, 6832, 6845, 6847, 6862, 6912, 6916, 6964, 6980, 6992, 7001, 7019, 7027, 7040, 7042, 7073, 7085, 7088, 7097, 7142, 7155, 7204, 7223, 7232, 7241, 7248, 7257, 7376, 7378, 7380, 7400, 7405, 7405, 7412, 7412, 7415, 7417, 7616, 7679, 8255, 8256, 8276, 8276, 8400, 8412, 8417, 8417, 8421, 8432, 11503, 11505, 11647, 11647, 11744, 11775, 12330, 12335, 12441, 12442, 42528, 42537, 42607, 42607, 42612, 42621, 42654, 42655, 42736, 42737, 43010, 43010, 43014, 43014, 43019, 43019, 43043, 43047, 43052, 43052, 43136, 43137, 43188, 43205, 43216, 43225, 43232, 43249, 43263, 43273, 43302, 43309, 43335, 43347, 43392, 43395, 43443, 43456, 43472, 43481, 43493, 43493, 43504, 43513, 43561, 43574, 43587, 43587, 43596, 43597, 43600, 43609, 43643, 43645, 43696, 43696, 43698, 43700, 43703, 43704, 43710, 43711, 43713, 43713, 43755, 43759, 43765, 43766, 44003, 44010, 44012, 44013, 44016, 44025, 64286, 64286, 65024, 65039, 65056, 65071, 65075, 65076, 65101, 65103, 65296, 65305, 65343, 65343, 66045, 66045, 66272, 66272, 66422, 66426, 66720, 66729, 68097, 68099, 68101, 68102, 68108, 68111, 68152, 68154, 68159, 68159, 68325, 68326, 68900, 68903, 68912, 68921, 69291, 69292, 69373, 69375, 69446, 69456, 69506, 69509, 69632, 69634, 69688, 69702, 69734, 69744, 69747, 69748, 69759, 69762, 69808, 69818, 69826, 69826, 69872, 69881, 69888, 69890, 69927, 69940, 69942, 69951, 69957, 69958, 70003, 70003, 70016, 70018, 70067, 70080, 70089, 70092, 70094, 70105, 70188, 70199, 70206, 70206, 70209, 70209, 70367, 70378, 70384, 70393, 70400, 70403, 70459, 70460, 70462, 70468, 70471, 70472, 70475, 70477, 70487, 70487, 70498, 70499, 70502, 70508, 70512, 70516, 70709, 70726, 70736, 70745, 70750, 70750, 70832, 70851, 70864, 70873, 71087, 71093, 71096, 71104, 71132, 71133, 71216, 71232, 71248, 71257, 71339, 71351, 71360, 71369, 71453, 71467, 71472, 71481, 71724, 71738, 71904, 71913, 71984, 71989, 71991, 71992, 71995, 71998, 72000, 72000, 72002, 72003, 72016, 72025, 72145, 72151, 72154, 72160, 72164, 72164, 72193, 72202, 72243, 72249, 72251, 72254, 72263, 72263, 72273, 72283, 72330, 72345, 72751, 72758, 72760, 72767, 72784, 72793, 72850, 72871, 72873, 72886, 73009, 73014, 73018, 73018, 73020, 73021, 73023, 73029, 73031, 73031, 73040, 73049, 73098, 73102, 73104, 73105, 73107, 73111, 73120, 73129, 73459, 73462, 73472, 73473, 73475, 73475, 73524, 73530, 73534, 73538, 73552, 73561, 78912, 78912, 78919, 78933, 92768, 92777, 92864, 92873, 92912, 92916, 92976, 92982, 93008, 93017, 94031, 94031, 94033, 94087, 94095, 94098, 94180, 94180, 94192, 94193, 113821, 113822, 118528, 118573, 118576, 118598, 119141, 119145, 119149, 119154, 119163, 119170, 119173, 119179, 119210, 119213, 119362, 119364, 120782, 120831, 121344, 121398, 121403, 121452, 121461, 121461, 121476, 121476, 121499, 121503, 121505, 121519, 122880, 122886, 122888, 122904, 122907, 122913, 122915, 122916, 122918, 122922, 123023, 123023, 123184, 123190, 123200, 123209, 123566, 123566, 123628, 123641, 124140, 124153, 125136, 125142, 125252, 125258, 125264, 125273, 130032, 130041, 917760, 917999, 1059, 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, 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, 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, 169, 1, 0, 0, 0, 0, 171, 1, 0, 0, 0, 0, 173, 1, 0, 0, 0, 0, 175, 1, 0, 0, 0, 0, 177, 1, 0, 0, 0, 0, 179, 1, 0, 0, 0, 0, 181, 1, 0, 0, 0, 0, 183, 1, 0, 0, 0, 0, 185, 1, 0, 0, 0, 0, 187, 1, 0, 0, 0, 0, 189, 1, 0, 0, 0, 0, 191, 1, 0, 0, 0, 0, 193, 1, 0, 0, 0, 0, 195, 1, 0, 0, 0, 0, 197, 1, 0, 0, 0, 0, 199, 1, 0, 0, 0, 0, 201, 1, 0, 0, 0, 0, 203, 1, 0, 0, 0, 0, 205, 1, 0, 0, 0, 0, 207, 1, 0, 0, 0, 0, 209, 1, 0, 0, 0, 0, 211, 1, 0, 0, 0, 0, 213, 1, 0, 0, 0, 0, 215, 1, 0, 0, 0, 0, 217, 1, 0, 0, 0, 0, 219, 1, 0, 0, 0, 0, 221, 1, 0, 0, 0, 0, 223, 1, 0, 0, 0, 0, 225, 1, 0, 0, 0, 0, 227, 1, 0, 0, 0, 1, 289, 1, 0, 0, 0, 3, 294, 1, 0, 0, 0, 5, 300, 1, 0, 0, 0, 7, 302, 1, 0, 0, 0, 9, 309, 1, 0, 0, 0, 11, 317, 1, 0, 0, 0, 13, 321, 1, 0, 0, 0, 15, 325, 1, 0, 0, 0, 17, 328, 1, 0, 0, 0, 19, 335, 1, 0, 0, 0, 21, 341, 1, 0, 0, 0, 23, 347, 1, 0, 0, 0, 25, 353, 1, 0, 0, 0, 27, 360, 1, 0, 0, 0, 29, 368, 1, 0, 0, 0, 31, 377, 1, 0, 0, 0, 33, 383, 1, 0, 0, 0, 35, 387, 1, 0, 0, 0, 37, 394, 1, 0, 0, 0, 39, 401, 1, 0, 0, 0, 41, 410, 1, 0, 0, 0, 43, 416, 1, 0, 0, 0, 45, 426, 1, 0, 0, 0, 47, 432, 1, 0, 0, 0, 49, 437, 1, 0, 0, 0, 51, 444, 1, 0, 0, 0, 53, 449, 1, 0, 0, 0, 55, 456, 1, 0, 0, 0, 57, 459, 1, 0, 0, 0, 59, 462, 1, 0, 0, 0, 61, 469, 1, 0, 0, 0, 63, 477, 1, 0, 0, 0, 65, 482, 1, 0, 0, 0, 67, 491, 1, 0, 0, 0, 69, 495, 1, 0, 0, 0, 71, 498, 1, 0, 0, 0, 73, 503, 1, 0, 0, 0, 75, 509, 1, 0, 0, 0, 77, 516, 1, 0, 0, 0, 79, 521, 1, 0, 0, 0, 81, 527, 1, 0, 0, 0, 83, 532, 1, 0, 0, 0, 85, 534, 1, 0, 0, 0, 87, 542, 1, 0, 0, 0, 89, 548, 1, 0, 0, 0, 91, 555, 1, 0, 0, 0, 93, 561, 1, 0, 0, 0, 95, 568, 1, 0, 0, 0, 97, 575, 1, 0, 0, 0, 99, 583, 1, 0, 0, 0, 101, 595, 1, 0, 0, 0, 103, 606, 1, 0, 0, 0, 105, 624, 1, 0, 0, 0, 107, 626, 1, 0, 0, 0, 109, 633, 1, 0, 0, 0, 111, 640, 1, 0, 0, 0, 113, 649, 1, 0, 0, 0, 115, 653, 1, 0, 0, 0, 117, 657, 1, 0, 0, 0, 119, 661, 1, 0, 0, 0, 121, 663, 1, 0, 0, 0, 123, 665, 1, 0, 0, 0, 125, 667, 1, 0, 0, 0, 127, 670, 1, 0, 0, 0, 129, 674, 1, 0, 0, 0, 131, 676, 1, 0, 0, 0, 133, 679, 1, 0, 0, 0, 135, 682, 1, 0, 0, 0, 137, 684, 1, 0, 0, 0, 139, 686, 1, 0, 0, 0, 141, 688, 1, 0, 0, 0, 143, 691, 1, 0, 0, 0, 145, 693, 1, 0, 0, 0, 147, 696, 1, 0, 0, 0, 149, 699, 1, 0, 0, 0, 151, 701, 1, 0, 0, 0, 153, 703, 1, 0, 0, 0, 155, 705, 1, 0, 0, 0, 157, 708, 1, 0, 0, 0, 159, 711, 1, 0, 0, 0, 161, 713, 1, 0, 0, 0, 163, 715, 1, 0, 0, 0, 165, 717, 1, 0, 0, 0, 167, 719, 1, 0, 0, 0, 169, 722, 1, 0, 0, 0, 171, 724, 1, 0, 0, 0, 173, 727, 1, 0, 0, 0, 175, 730, 1, 0, 0, 0, 177, 732, 1, 0, 0, 0, 179, 734, 1, 0, 0, 0, 181, 737, 1, 0, 0, 0, 183, 740, 1, 0, 0, 0, 185, 743, 1, 0, 0, 0, 187, 746, 1, 0, 0, 0, 189, 749, 1, 0, 0, 0, 191, 751, 1, 0, 0, 0, 193, 754, 1, 0, 0, 0, 195, 757, 1, 0, 0, 0, 197, 760, 1, 0, 0, 0, 199, 763, 1, 0, 0, 0, 201, 766, 1, 0, 0, 0, 203, 769, 1, 0, 0, 0, 205, 772, 1, 0, 0, 0, 207, 775, 1, 0, 0, 0, 209, 778, 1, 0, 0, 0, 211, 781, 1, 0, 0, 0, 213, 785, 1, 0, 0, 0, 215, 789, 1, 0, 0, 0, 217, 793, 1, 0, 0, 0, 219, 797, 1, 0, 0, 0, 221, 800, 1, 0, 0, 0, 223, 807, 1, 0, 0, 0, 225, 817, 1, 0, 0, 0, 227, 821, 1, 0, 0, 0, 229, 841, 1, 0, 0, 0, 231, 869, 1, 0, 0, 0, 233, 873, 1, 0, 0, 0, 235, 875, 1, 0, 0, 0, 237, 881, 1, 0, 0, 0, 239, 883, 1, 0, 0, 0, 241, 885, 1, 0, 0, 0, 243, 887, 1, 0, 0, 0, 245, 889, 1, 0, 0, 0, 247, 891, 1, 0, 0, 0, 249, 900, 1, 0, 0, 0, 251, 904, 1, 0, 0, 0, 253, 909, 1, 0, 0, 0, 255, 913, 1, 0, 0, 0, 257, 919, 1, 0, 0, 0, 259, 946, 1, 0, 0, 0, 261, 974, 1, 0, 0, 0, 263, 978, 1, 0, 0, 0, 265, 981, 1, 0, 0, 0, 267, 984, 1, 0, 0, 0, 269, 987, 1, 0, 0, 0, 271, 989, 1, 0, 0, 0, 273, 993, 1, 0, 0, 0, 275, 997, 1, 0, 0, 0, 277, 1004, 1, 0, 0, 0, 279, 1015, 1, 0, 0, 0, 281, 1017, 1, 0, 0, 0, 283, 1021, 1, 0, 0, 0, 285, 1026, 1, 0, 0, 0, 287, 290, 3, 101, 50, 0, 288, 290, 3, 103, 51, 0, 289, 287, 1, 0, 0, 0, 289, 288, 1, 0, 0, 0, 290, 2, 1, 0, 0, 0, 291, 295, 3, 5, 2, 0, 292, 295, 3, 113, 56, 0, 293, 295, 3, 115, 57, 0, 294, 291, 1, 0, 0, 0, 294, 292, 1, 0, 0, 0, 294, 293, 1, 0, 0, 0, 295, 4, 1, 0, 0, 0, 296, 301, 3, 105, 52, 0, 297, 301, 3, 107, 53, 0, 298, 301, 3, 109, 54, 0, 299, 301, 3, 111, 55, 0, 300, 296, 1, 0, 0, 0, 300, 297, 1, 0, 0, 0, 300, 298, 1, 0, 0, 0, 300, 299, 1, 0, 0, 0, 301, 6, 1, 0, 0, 0, 302, 303, 5, 60, 0, 0, 303, 304, 5, 112, 0, 0, 304, 305, 5, 121, 0, 0, 305, 306, 5, 62, 0, 0, 306, 307, 1, 0, 0, 0, 307, 308, 6, 3, 0, 0, 308, 8, 1, 0, 0, 0, 309, 310, 5, 60, 0, 0, 310, 311, 5, 47, 0, 0, 311, 312, 5, 112, 0, 0, 312, 313, 5, 121, 0, 0, 313, 314, 5, 62, 0, 0, 314, 315, 1, 0, 0, 0, 315, 316, 6, 4, 1, 0, 316, 10, 1, 0, 0, 0, 317, 318, 5, 60, 0, 0, 318, 319, 3, 99, 49, 0, 319, 320, 5, 62, 0, 0, 320, 12, 1, 0, 0, 0, 321, 322, 5, 97, 0, 0, 322, 323, 5, 110, 0, 0, 323, 324, 5, 100, 0, 0, 324, 14, 1, 0, 0, 0, 325, 326, 5, 97, 0, 0, 326, 327, 5, 115, 0, 0, 327, 16, 1, 0, 0, 0, 328, 329, 5, 97, 0, 0, 329, 330, 5, 115, 0, 0, 330, 331, 5, 115, 0, 0, 331, 332, 5, 101, 0, 0, 332, 333, 5, 114, 0, 0, 333, 334, 5, 116, 0, 0, 334, 18, 1, 0, 0, 0, 335, 336, 5, 97, 0, 0, 336, 337, 5, 115, 0, 0, 337, 338, 5, 121, 0, 0, 338, 339, 5, 110, 0, 0, 339, 340, 5, 99, 0, 0, 340, 20, 1, 0, 0, 0, 341, 342, 5, 97, 0, 0, 342, 343, 5, 119, 0, 0, 343, 344, 5, 97, 0, 0, 344, 345, 5, 105, 0, 0, 345, 346, 5, 116, 0, 0, 346, 22, 1, 0, 0, 0, 347, 348, 5, 98, 0, 0, 348, 349, 5, 114, 0, 0, 349, 350, 5, 101, 0, 0, 350, 351, 5, 97, 0, 0, 351, 352, 5, 107, 0, 0, 352, 24, 1, 0, 0, 0, 353, 354, 5, 99, 0, 0, 354, 355, 5, 97, 0, 0, 355, 356, 5, 115, 0, 0, 356, 357, 5, 101, 0, 0, 357, 358, 1, 0, 0, 0, 358, 359, 6, 12, 2, 0, 359, 26, 1, 0, 0, 0, 360, 361, 5, 99, 0, 0, 361, 362, 5, 108, 0, 0, 362, 363, 5, 97, 0, 0, 363, 364, 5, 115, 0, 0, 364, 365, 5, 115, 0, 0, 365, 366, 1, 0, 0, 0, 366, 367, 6, 13, 3, 0, 367, 28, 1, 0, 0, 0, 368, 369, 5, 99, 0, 0, 369, 370, 5, 111, 0, 0, 370, 371, 5, 110, 0, 0, 371, 372, 5, 116, 0, 0, 372, 373, 5, 105, 0, 0, 373, 374, 5, 110, 0, 0, 374, 375, 5, 117, 0, 0, 375, 376, 5, 101, 0, 0, 376, 30, 1, 0, 0, 0, 377, 378, 5, 100, 0, 0, 378, 379, 5, 101, 0, 0, 379, 380, 5, 102, 0, 0, 380, 381, 1, 0, 0, 0, 381, 382, 6, 15, 4, 0, 382, 32, 1, 0, 0, 0, 383, 384, 5, 100, 0, 0, 384, 385, 5, 101, 0, 0, 385, 386, 5, 108, 0, 0, 386, 34, 1, 0, 0, 0, 387, 388, 5, 101, 0, 0, 388, 389, 5, 108, 0, 0, 389, 390, 5, 105, 0, 0, 390, 391, 5, 102, 0, 0, 391, 392, 1, 0, 0, 0, 392, 393, 6, 17, 5, 0, 393, 36, 1, 0, 0, 0, 394, 395, 5, 101, 0, 0, 395, 396, 5, 108, 0, 0, 396, 397, 5, 115, 0, 0, 397, 398, 5, 101, 0, 0, 398, 399, 1, 0, 0, 0, 399, 400, 6, 18, 6, 0, 400, 38, 1, 0, 0, 0, 401, 402, 5, 101, 0, 0, 402, 403, 5, 120, 0, 0, 403, 404, 5, 99, 0, 0, 404, 405, 5, 101, 0, 0, 405, 406, 5, 112, 0, 0, 406, 407, 5, 116, 0, 0, 407, 408, 1, 0, 0, 0, 408, 409, 6, 19, 7, 0, 409, 40, 1, 0, 0, 0, 410, 411, 5, 70, 0, 0, 411, 412, 5, 97, 0, 0, 412, 413, 5, 108, 0, 0, 413, 414, 5, 115, 0, 0, 414, 415, 5, 101, 0, 0, 415, 42, 1, 0, 0, 0, 416, 417, 5, 102, 0, 0, 417, 418, 5, 105, 0, 0, 418, 419, 5, 110, 0, 0, 419, 420, 5, 97, 0, 0, 420, 421, 5, 108, 0, 0, 421, 422, 5, 108, 0, 0, 422, 423, 5, 121, 0, 0, 423, 424, 1, 0, 0, 0, 424, 425, 6, 21, 8, 0, 425, 44, 1, 0, 0, 0, 426, 427, 5, 102, 0, 0, 427, 428, 5, 111, 0, 0, 428, 429, 5, 114, 0, 0, 429, 430, 1, 0, 0, 0, 430, 431, 6, 22, 9, 0, 431, 46, 1, 0, 0, 0, 432, 433, 5, 102, 0, 0, 433, 434, 5, 114, 0, 0, 434, 435, 5, 111, 0, 0, 435, 436, 5, 109, 0, 0, 436, 48, 1, 0, 0, 0, 437, 438, 5, 103, 0, 0, 438, 439, 5, 108, 0, 0, 439, 440, 5, 111, 0, 0, 440, 441, 5, 98, 0, 0, 441, 442, 5, 97, 0, 0, 442, 443, 5, 108, 0, 0, 443, 50, 1, 0, 0, 0, 444, 445, 5, 105, 0, 0, 445, 446, 5, 102, 0, 0, 446, 447, 1, 0, 0, 0, 447, 448, 6, 25, 10, 0, 448, 52, 1, 0, 0, 0, 449, 450, 5, 105, 0, 0, 450, 451, 5, 109, 0, 0, 451, 452, 5, 112, 0, 0, 452, 453, 5, 111, 0, 0, 453, 454, 5, 114, 0, 0, 454, 455, 5, 116, 0, 0, 455, 54, 1, 0, 0, 0, 456, 457, 5, 105, 0, 0, 457, 458, 5, 110, 0, 0, 458, 56, 1, 0, 0, 0, 459, 460, 5, 105, 0, 0, 460, 461, 5, 115, 0, 0, 461, 58, 1, 0, 0, 0, 462, 463, 5, 108, 0, 0, 463, 464, 5, 97, 0, 0, 464, 465, 5, 109, 0, 0, 465, 466, 5, 98, 0, 0, 466, 467, 5, 100, 0, 0, 467, 468, 5, 97, 0, 0, 468, 60, 1, 0, 0, 0, 469, 470, 5, 109, 0, 0, 470, 471, 5, 97, 0, 0, 471, 472, 5, 116, 0, 0, 472, 473, 5, 99, 0, 0, 473, 474, 5, 104, 0, 0, 474, 475, 1, 0, 0, 0, 475, 476, 6, 30, 11, 0, 476, 62, 1, 0, 0, 0, 477, 478, 5, 78, 0, 0, 478, 479, 5, 111, 0, 0, 479, 480, 5, 110, 0, 0, 480, 481, 5, 101, 0, 0, 481, 64, 1, 0, 0, 0, 482, 483, 5, 110, 0, 0, 483, 484, 5, 111, 0, 0, 484, 485, 5, 110, 0, 0, 485, 486, 5, 108, 0, 0, 486, 487, 5, 111, 0, 0, 487, 488, 5, 99, 0, 0, 488, 489, 5, 97, 0, 0, 489, 490, 5, 108, 0, 0, 490, 66, 1, 0, 0, 0, 491, 492, 5, 110, 0, 0, 492, 493, 5, 111, 0, 0, 493, 494, 5, 116, 0, 0, 494, 68, 1, 0, 0, 0, 495, 496, 5, 111, 0, 0, 496, 497, 5, 114, 0, 0, 497, 70, 1, 0, 0, 0, 498, 499, 5, 112, 0, 0, 499, 500, 5, 97, 0, 0, 500, 501, 5, 115, 0, 0, 501, 502, 5, 115, 0, 0, 502, 72, 1, 0, 0, 0, 503, 504, 5, 114, 0, 0, 504, 505, 5, 97, 0, 0, 505, 506, 5, 105, 0, 0, 506, 507, 5, 115, 0, 0, 507, 508, 5, 101, 0, 0, 508, 74, 1, 0, 0, 0, 509, 510, 5, 114, 0, 0, 510, 511, 5, 101, 0, 0, 511, 512, 5, 116, 0, 0, 512, 513, 5, 117, 0, 0, 513, 514, 5, 114, 0, 0, 514, 515, 5, 110, 0, 0, 515, 76, 1, 0, 0, 0, 516, 517, 5, 84, 0, 0, 517, 518, 5, 114, 0, 0, 518, 519, 5, 117, 0, 0, 519, 520, 5, 101, 0, 0, 520, 78, 1, 0, 0, 0, 521, 522, 5, 116, 0, 0, 522, 523, 5, 114, 0, 0, 523, 524, 5, 121, 0, 0, 524, 525, 1, 0, 0, 0, 525, 526, 6, 39, 12, 0, 526, 80, 1, 0, 0, 0, 527, 528, 5, 116, 0, 0, 528, 529, 5, 121, 0, 0, 529, 530, 5, 112, 0, 0, 530, 531, 5, 101, 0, 0, 531, 82, 1, 0, 0, 0, 532, 533, 5, 95, 0, 0, 533, 84, 1, 0, 0, 0, 534, 535, 5, 119, 0, 0, 535, 536, 5, 104, 0, 0, 536, 537, 5, 105, 0, 0, 537, 538, 5, 108, 0, 0, 538, 539, 5, 101, 0, 0, 539, 540, 1, 0, 0, 0, 540, 541, 6, 42, 13, 0, 541, 86, 1, 0, 0, 0, 542, 543, 5, 119, 0, 0, 543, 544, 5, 104, 0, 0, 544, 545, 5, 101, 0, 0, 545, 546, 5, 114, 0, 0, 546, 547, 5, 101, 0, 0, 547, 88, 1, 0, 0, 0, 548, 549, 5, 119, 0, 0, 549, 550, 5, 105, 0, 0, 550, 551, 5, 116, 0, 0, 551, 552, 5, 104, 0, 0, 552, 553, 1, 0, 0, 0, 553, 554, 6, 44, 14, 0, 554, 90, 1, 0, 0, 0, 555, 556, 5, 121, 0, 0, 556, 557, 5, 105, 0, 0, 557, 558, 5, 101, 0, 0, 558, 559, 5, 108, 0, 0, 559, 560, 5, 100, 0, 0, 560, 92, 1, 0, 0, 0, 561, 562, 5, 102, 0, 0, 562, 563, 5, 111, 0, 0, 563, 564, 5, 114, 0, 0, 564, 565, 5, 97, 0, 0, 565, 566, 5, 108, 0, 0, 566, 567, 5, 108, 0, 0, 567, 94, 1, 0, 0, 0, 568, 569, 5, 101, 0, 0, 569, 570, 5, 120, 0, 0, 570, 571, 5, 105, 0, 0, 571, 572, 5, 115, 0, 0, 572, 573, 5, 116, 0, 0, 573, 574, 5, 115, 0, 0, 574, 96, 1, 0, 0, 0, 575, 576, 5, 102, 0, 0, 576, 577, 5, 105, 0, 0, 577, 578, 5, 116, 0, 0, 578, 579, 5, 110, 0, 0, 579, 580, 5, 101, 0, 0, 580, 581, 5, 115, 0, 0, 581, 582, 5, 115, 0, 0, 582, 98, 1, 0, 0, 0, 583, 587, 3, 283, 141, 0, 584, 586, 3, 285, 142, 0, 585, 584, 1, 0, 0, 0, 586, 589, 1, 0, 0, 0, 587, 585, 1, 0, 0, 0, 587, 588, 1, 0, 0, 0, 588, 100, 1, 0, 0, 0, 589, 587, 1, 0, 0, 0, 590, 596, 7, 0, 0, 0, 591, 592, 7, 1, 0, 0, 592, 596, 7, 2, 0, 0, 593, 594, 7, 2, 0, 0, 594, 596, 7, 1, 0, 0, 595, 590, 1, 0, 0, 0, 595, 591, 1, 0, 0, 0, 595, 593, 1, 0, 0, 0, 595, 596, 1, 0, 0, 0, 596, 599, 1, 0, 0, 0, 597, 600, 3, 229, 114, 0, 598, 600, 3, 231, 115, 0, 599, 597, 1, 0, 0, 0, 599, 598, 1, 0, 0, 0, 600, 102, 1, 0, 0, 0, 601, 607, 7, 3, 0, 0, 602, 603, 7, 3, 0, 0, 603, 607, 7, 2, 0, 0, 604, 605, 7, 2, 0, 0, 605, 607, 7, 3, 0, 0, 606, 601, 1, 0, 0, 0, 606, 602, 1, 0, 0, 0, 606, 604, 1, 0, 0, 0, 607, 610, 1, 0, 0, 0, 608, 611, 3, 259, 129, 0, 609, 611, 3, 261, 130, 0, 610, 608, 1, 0, 0, 0, 610, 609, 1, 0, 0, 0, 611, 104, 1, 0, 0, 0, 612, 616, 3, 239, 119, 0, 613, 615, 3, 241, 120, 0, 614, 613, 1, 0, 0, 0, 615, 618, 1, 0, 0, 0, 616, 614, 1, 0, 0, 0, 616, 617, 1, 0, 0, 0, 617, 625, 1, 0, 0, 0, 618, 616, 1, 0, 0, 0, 619, 621, 5, 48, 0, 0, 620, 619, 1, 0, 0, 0, 621, 622, 1, 0, 0, 0, 622, 620, 1, 0, 0, 0, 622, 623, 1, 0, 0, 0, 623, 625, 1, 0, 0, 0, 624, 612, 1, 0, 0, 0, 624, 620, 1, 0, 0, 0, 625, 106, 1, 0, 0, 0, 626, 627, 5, 48, 0, 0, 627, 629, 7, 4, 0, 0, 628, 630, 3, 243, 121, 0, 629, 628, 1, 0, 0, 0, 630, 631, 1, 0, 0, 0, 631, 629, 1, 0, 0, 0, 631, 632, 1, 0, 0, 0, 632, 108, 1, 0, 0, 0, 633, 634, 5, 48, 0, 0, 634, 636, 7, 5, 0, 0, 635, 637, 3, 245, 122, 0, 636, 635, 1, 0, 0, 0, 637, 638, 1, 0, 0, 0, 638, 636, 1, 0, 0, 0, 638, 639, 1, 0, 0, 0, 639, 110, 1, 0, 0, 0, 640, 641, 5, 48, 0, 0, 641, 643, 7, 3, 0, 0, 642, 644, 3, 247, 123, 0, 643, 642, 1, 0, 0, 0, 644, 645, 1, 0, 0, 0, 645, 643, 1, 0, 0, 0, 645, 646, 1, 0, 0, 0, 646, 112, 1, 0, 0, 0, 647, 650, 3, 249, 124, 0, 648, 650, 3, 251, 125, 0, 649, 647, 1, 0, 0, 0, 649, 648, 1, 0, 0, 0, 650, 114, 1, 0, 0, 0, 651, 654, 3, 113, 56, 0, 652, 654, 3, 253, 126, 0, 653, 651, 1, 0, 0, 0, 653, 652, 1, 0, 0, 0, 654, 655, 1, 0, 0, 0, 655, 656, 7, 6, 0, 0, 656, 116, 1, 0, 0, 0, 657, 658, 5, 58, 0, 0, 658, 659, 5, 58, 0, 0, 659, 660, 5, 61, 0, 0, 660, 118, 1, 0, 0, 0, 661, 662, 5, 63, 0, 0, 662, 120, 1, 0, 0, 0, 663, 664, 5, 92, 0, 0, 664, 122, 1, 0, 0, 0, 665, 666, 5, 46, 0, 0, 666, 124, 1, 0, 0, 0, 667, 668, 5, 46, 0, 0, 668, 669, 5, 46, 0, 0, 669, 126, 1, 0, 0, 0, 670, 671, 5, 46, 0, 0, 671, 672, 5, 46, 0, 0, 672, 673, 5, 46, 0, 0, 673, 128, 1, 0, 0, 0, 674, 675, 5, 42, 0, 0, 675, 130, 1, 0, 0, 0, 676, 677, 5, 40, 0, 0, 677, 678, 6, 65, 15, 0, 678, 132, 1, 0, 0, 0, 679, 680, 5, 41, 0, 0, 680, 681, 6, 66, 16, 0, 681, 134, 1, 0, 0, 0, 682, 683, 5, 44, 0, 0, 683, 136, 1, 0, 0, 0, 684, 685, 5, 58, 0, 0, 685, 138, 1, 0, 0, 0, 686, 687, 5, 59, 0, 0, 687, 140, 1, 0, 0, 0, 688, 689, 5, 42, 0, 0, 689, 690, 5, 42, 0, 0, 690, 142, 1, 0, 0, 0, 691, 692, 5, 61, 0, 0, 692, 144, 1, 0, 0, 0, 693, 694, 5, 91, 0, 0, 694, 695, 6, 72, 17, 0, 695, 146, 1, 0, 0, 0, 696, 697, 5, 93, 0, 0, 697, 698, 6, 73, 18, 0, 698, 148, 1, 0, 0, 0, 699, 700, 5, 124, 0, 0, 700, 150, 1, 0, 0, 0, 701, 702, 5, 94, 0, 0, 702, 152, 1, 0, 0, 0, 703, 704, 5, 38, 0, 0, 704, 154, 1, 0, 0, 0, 705, 706, 5, 60, 0, 0, 706, 707, 5, 60, 0, 0, 707, 156, 1, 0, 0, 0, 708, 709, 5, 62, 0, 0, 709, 710, 5, 62, 0, 0, 710, 158, 1, 0, 0, 0, 711, 712, 5, 43, 0, 0, 712, 160, 1, 0, 0, 0, 713, 714, 5, 45, 0, 0, 714, 162, 1, 0, 0, 0, 715, 716, 5, 47, 0, 0, 716, 164, 1, 0, 0, 0, 717, 718, 5, 37, 0, 0, 718, 166, 1, 0, 0, 0, 719, 720, 5, 47, 0, 0, 720, 721, 5, 47, 0, 0, 721, 168, 1, 0, 0, 0, 722, 723, 5, 126, 0, 0, 723, 170, 1, 0, 0, 0, 724, 725, 5, 123, 0, 0, 725, 726, 6, 85, 19, 0, 726, 172, 1, 0, 0, 0, 727, 728, 5, 125, 0, 0, 728, 729, 6, 86, 20, 0, 729, 174, 1, 0, 0, 0, 730, 731, 5, 60, 0, 0, 731, 176, 1, 0, 0, 0, 732, 733, 5, 62, 0, 0, 733, 178, 1, 0, 0, 0, 734, 735, 5, 61, 0, 0, 735, 736, 5, 61, 0, 0, 736, 180, 1, 0, 0, 0, 737, 738, 5, 62, 0, 0, 738, 739, 5, 61, 0, 0, 739, 182, 1, 0, 0, 0, 740, 741, 5, 60, 0, 0, 741, 742, 5, 61, 0, 0, 742, 184, 1, 0, 0, 0, 743, 744, 5, 60, 0, 0, 744, 745, 5, 62, 0, 0, 745, 186, 1, 0, 0, 0, 746, 747, 5, 33, 0, 0, 747, 748, 5, 61, 0, 0, 748, 188, 1, 0, 0, 0, 749, 750, 5, 64, 0, 0, 750, 190, 1, 0, 0, 0, 751, 752, 5, 45, 0, 0, 752, 753, 5, 62, 0, 0, 753, 192, 1, 0, 0, 0, 754, 755, 5, 43, 0, 0, 755, 756, 5, 61, 0, 0, 756, 194, 1, 0, 0, 0, 757, 758, 5, 45, 0, 0, 758, 759, 5, 61, 0, 0, 759, 196, 1, 0, 0, 0, 760, 761, 5, 42, 0, 0, 761, 762, 5, 61, 0, 0, 762, 198, 1, 0, 0, 0, 763, 764, 5, 64, 0, 0, 764, 765, 5, 61, 0, 0, 765, 200, 1, 0, 0, 0, 766, 767, 5, 47, 0, 0, 767, 768, 5, 61, 0, 0, 768, 202, 1, 0, 0, 0, 769, 770, 5, 37, 0, 0, 770, 771, 5, 61, 0, 0, 771, 204, 1, 0, 0, 0, 772, 773, 5, 38, 0, 0, 773, 774, 5, 61, 0, 0, 774, 206, 1, 0, 0, 0, 775, 776, 5, 124, 0, 0, 776, 777, 5, 61, 0, 0, 777, 208, 1, 0, 0, 0, 778, 779, 5, 94, 0, 0, 779, 780, 5, 61, 0, 0, 780, 210, 1, 0, 0, 0, 781, 782, 5, 60, 0, 0, 782, 783, 5, 60, 0, 0, 783, 784, 5, 61, 0, 0, 784, 212, 1, 0, 0, 0, 785, 786, 5, 62, 0, 0, 786, 787, 5, 62, 0, 0, 787, 788, 5, 61, 0, 0, 788, 214, 1, 0, 0, 0, 789, 790, 5, 42, 0, 0, 790, 791, 5, 42, 0, 0, 791, 792, 5, 61, 0, 0, 792, 216, 1, 0, 0, 0, 793, 794, 5, 47, 0, 0, 794, 795, 5, 47, 0, 0, 795, 796, 5, 61, 0, 0, 796, 218, 1, 0, 0, 0, 797, 798, 5, 58, 0, 0, 798, 799, 5, 61, 0, 0, 799, 220, 1, 0, 0, 0, 800, 801, 5, 33, 0, 0, 801, 222, 1, 0, 0, 0, 802, 804, 5, 13, 0, 0, 803, 802, 1, 0, 0, 0, 803, 804, 1, 0, 0, 0, 804, 805, 1, 0, 0, 0, 805, 808, 5, 10, 0, 0, 806, 808, 2, 12, 13, 0, 807, 803, 1, 0, 0, 0, 807, 806, 1, 0, 0, 0, 808, 810, 1, 0, 0, 0, 809, 811, 3, 273, 136, 0, 810, 809, 1, 0, 0, 0, 810, 811, 1, 0, 0, 0, 811, 812, 1, 0, 0, 0, 812, 813, 6, 111, 21, 0, 813, 224, 1, 0, 0, 0, 814, 818, 3, 273, 136, 0, 815, 818, 3, 275, 137, 0, 816, 818, 3, 277, 138, 0, 817, 814, 1, 0, 0, 0, 817, 815, 1, 0, 0, 0, 817, 816, 1, 0, 0, 0, 818, 819, 1, 0, 0, 0, 819, 820, 6, 112, 22, 0, 820, 226, 1, 0, 0, 0, 821, 822, 9, 0, 0, 0, 822, 228, 1, 0, 0, 0, 823, 828, 5, 39, 0, 0, 824, 827, 3, 237, 118, 0, 825, 827, 8, 7, 0, 0, 826, 824, 1, 0, 0, 0, 826, 825, 1, 0, 0, 0, 827, 830, 1, 0, 0, 0, 828, 826, 1, 0, 0, 0, 828, 829, 1, 0, 0, 0, 829, 831, 1, 0, 0, 0, 830, 828, 1, 0, 0, 0, 831, 842, 5, 39, 0, 0, 832, 837, 5, 34, 0, 0, 833, 836, 3, 237, 118, 0, 834, 836, 8, 8, 0, 0, 835, 833, 1, 0, 0, 0, 835, 834, 1, 0, 0, 0, 836, 839, 1, 0, 0, 0, 837, 835, 1, 0, 0, 0, 837, 838, 1, 0, 0, 0, 838, 840, 1, 0, 0, 0, 839, 837, 1, 0, 0, 0, 840, 842, 5, 34, 0, 0, 841, 823, 1, 0, 0, 0, 841, 832, 1, 0, 0, 0, 842, 230, 1, 0, 0, 0, 843, 844, 5, 39, 0, 0, 844, 845, 5, 39, 0, 0, 845, 846, 5, 39, 0, 0, 846, 850, 1, 0, 0, 0, 847, 849, 3, 233, 116, 0, 848, 847, 1, 0, 0, 0, 849, 852, 1, 0, 0, 0, 850, 851, 1, 0, 0, 0, 850, 848, 1, 0, 0, 0, 851, 853, 1, 0, 0, 0, 852, 850, 1, 0, 0, 0, 853, 854, 5, 39, 0, 0, 854, 855, 5, 39, 0, 0, 855, 870, 5, 39, 0, 0, 856, 857, 5, 34, 0, 0, 857, 858, 5, 34, 0, 0, 858, 859, 5, 34, 0, 0, 859, 863, 1, 0, 0, 0, 860, 862, 3, 233, 116, 0, 861, 860, 1, 0, 0, 0, 862, 865, 1, 0, 0, 0, 863, 864, 1, 0, 0, 0, 863, 861, 1, 0, 0, 0, 864, 866, 1, 0, 0, 0, 865, 863, 1, 0, 0, 0, 866, 867, 5, 34, 0, 0, 867, 868, 5, 34, 0, 0, 868, 870, 5, 34, 0, 0, 869, 843, 1, 0, 0, 0, 869, 856, 1, 0, 0, 0, 870, 232, 1, 0, 0, 0, 871, 874, 3, 235, 117, 0, 872, 874, 3, 237, 118, 0, 873, 871, 1, 0, 0, 0, 873, 872, 1, 0, 0, 0, 874, 234, 1, 0, 0, 0, 875, 876, 8, 9, 0, 0, 876, 236, 1, 0, 0, 0, 877, 878, 5, 92, 0, 0, 878, 882, 9, 0, 0, 0, 879, 880, 5, 92, 0, 0, 880, 882, 3, 223, 111, 0, 881, 877, 1, 0, 0, 0, 881, 879, 1, 0, 0, 0, 882, 238, 1, 0, 0, 0, 883, 884, 7, 10, 0, 0, 884, 240, 1, 0, 0, 0, 885, 886, 7, 11, 0, 0, 886, 242, 1, 0, 0, 0, 887, 888, 7, 12, 0, 0, 888, 244, 1, 0, 0, 0, 889, 890, 7, 13, 0, 0, 890, 246, 1, 0, 0, 0, 891, 892, 7, 14, 0, 0, 892, 248, 1, 0, 0, 0, 893, 895, 3, 253, 126, 0, 894, 893, 1, 0, 0, 0, 894, 895, 1, 0, 0, 0, 895, 896, 1, 0, 0, 0, 896, 901, 3, 255, 127, 0, 897, 898, 3, 253, 126, 0, 898, 899, 5, 46, 0, 0, 899, 901, 1, 0, 0, 0, 900, 894, 1, 0, 0, 0, 900, 897, 1, 0, 0, 0, 901, 250, 1, 0, 0, 0, 902, 905, 3, 253, 126, 0, 903, 905, 3, 249, 124, 0, 904, 902, 1, 0, 0, 0, 904, 903, 1, 0, 0, 0, 905, 906, 1, 0, 0, 0, 906, 907, 3, 257, 128, 0, 907, 252, 1, 0, 0, 0, 908, 910, 3, 241, 120, 0, 909, 908, 1, 0, 0, 0, 910, 911, 1, 0, 0, 0, 911, 909, 1, 0, 0, 0, 911, 912, 1, 0, 0, 0, 912, 254, 1, 0, 0, 0, 913, 915, 5, 46, 0, 0, 914, 916, 3, 241, 120, 0, 915, 914, 1, 0, 0, 0, 916, 917, 1, 0, 0, 0, 917, 915, 1, 0, 0, 0, 917, 918, 1, 0, 0, 0, 918, 256, 1, 0, 0, 0, 919, 921, 7, 15, 0, 0, 920, 922, 7, 16, 0, 0, 921, 920, 1, 0, 0, 0, 921, 922, 1, 0, 0, 0, 922, 924, 1, 0, 0, 0, 923, 925, 3, 241, 120, 0, 924, 923, 1, 0, 0, 0, 925, 926, 1, 0, 0, 0, 926, 924, 1, 0, 0, 0, 926, 927, 1, 0, 0, 0, 927, 258, 1, 0, 0, 0, 928, 933, 5, 39, 0, 0, 929, 932, 3, 265, 132, 0, 930, 932, 3, 271, 135, 0, 931, 929, 1, 0, 0, 0, 931, 930, 1, 0, 0, 0, 932, 935, 1, 0, 0, 0, 933, 931, 1, 0, 0, 0, 933, 934, 1, 0, 0, 0, 934, 936, 1, 0, 0, 0, 935, 933, 1, 0, 0, 0, 936, 947, 5, 39, 0, 0, 937, 942, 5, 34, 0, 0, 938, 941, 3, 267, 133, 0, 939, 941, 3, 271, 135, 0, 940, 938, 1, 0, 0, 0, 940, 939, 1, 0, 0, 0, 941, 944, 1, 0, 0, 0, 942, 940, 1, 0, 0, 0, 942, 943, 1, 0, 0, 0, 943, 945, 1, 0, 0, 0, 944, 942, 1, 0, 0, 0, 945, 947, 5, 34, 0, 0, 946, 928, 1, 0, 0, 0, 946, 937, 1, 0, 0, 0, 947, 260, 1, 0, 0, 0, 948, 949, 5, 39, 0, 0, 949, 950, 5, 39, 0, 0, 950, 951, 5, 39, 0, 0, 951, 955, 1, 0, 0, 0, 952, 954, 3, 263, 131, 0, 953, 952, 1, 0, 0, 0, 954, 957, 1, 0, 0, 0, 955, 956, 1, 0, 0, 0, 955, 953, 1, 0, 0, 0, 956, 958, 1, 0, 0, 0, 957, 955, 1, 0, 0, 0, 958, 959, 5, 39, 0, 0, 959, 960, 5, 39, 0, 0, 960, 975, 5, 39, 0, 0, 961, 962, 5, 34, 0, 0, 962, 963, 5, 34, 0, 0, 963, 964, 5, 34, 0, 0, 964, 968, 1, 0, 0, 0, 965, 967, 3, 263, 131, 0, 966, 965, 1, 0, 0, 0, 967, 970, 1, 0, 0, 0, 968, 969, 1, 0, 0, 0, 968, 966, 1, 0, 0, 0, 969, 971, 1, 0, 0, 0, 970, 968, 1, 0, 0, 0, 971, 972, 5, 34, 0, 0, 972, 973, 5, 34, 0, 0, 973, 975, 5, 34, 0, 0, 974, 948, 1, 0, 0, 0, 974, 961, 1, 0, 0, 0, 975, 262, 1, 0, 0, 0, 976, 979, 3, 269, 134, 0, 977, 979, 3, 271, 135, 0, 978, 976, 1, 0, 0, 0, 978, 977, 1, 0, 0, 0, 979, 264, 1, 0, 0, 0, 980, 982, 7, 17, 0, 0, 981, 980, 1, 0, 0, 0, 982, 266, 1, 0, 0, 0, 983, 985, 7, 18, 0, 0, 984, 983, 1, 0, 0, 0, 985, 268, 1, 0, 0, 0, 986, 988, 7, 19, 0, 0, 987, 986, 1, 0, 0, 0, 988, 270, 1, 0, 0, 0, 989, 990, 5, 92, 0, 0, 990, 991, 7, 20, 0, 0, 991, 272, 1, 0, 0, 0, 992, 994, 7, 21, 0, 0, 993, 992, 1, 0, 0, 0, 994, 995, 1, 0, 0, 0, 995, 993, 1, 0, 0, 0, 995, 996, 1, 0, 0, 0, 996, 274, 1, 0, 0, 0, 997, 1001, 5, 35, 0, 0, 998, 1000, 8, 22, 0, 0, 999, 998, 1, 0, 0, 0, 1000, 1003, 1, 0, 0, 0, 1001, 999, 1, 0, 0, 0, 1001, 1002, 1, 0, 0, 0, 1002, 276, 1, 0, 0, 0, 1003, 1001, 1, 0, 0, 0, 1004, 1006, 5, 92, 0, 0, 1005, 1007, 3, 273, 136, 0, 1006, 1005, 1, 0, 0, 0, 1006, 1007, 1, 0, 0, 0, 1007, 1013, 1, 0, 0, 0, 1008, 1010, 5, 13, 0, 0, 1009, 1008, 1, 0, 0, 0, 1009, 1010, 1, 0, 0, 0, 1010, 1011, 1, 0, 0, 0, 1011, 1014, 5, 10, 0, 0, 1012, 1014, 2, 12, 13, 0, 1013, 1009, 1, 0, 0, 0, 1013, 1012, 1, 0, 0, 0, 1014, 278, 1, 0, 0, 0, 1015, 1016, 7, 23, 0, 0, 1016, 280, 1, 0, 0, 0, 1017, 1018, 7, 24, 0, 0, 1018, 282, 1, 0, 0, 0, 1019, 1022, 7, 25, 0, 0, 1020, 1022, 3, 279, 139, 0, 1021, 1019, 1, 0, 0, 0, 1021, 1020, 1, 0, 0, 0, 1022, 284, 1, 0, 0, 0, 1023, 1027, 3, 283, 141, 0, 1024, 1027, 7, 26, 0, 0, 1025, 1027, 3, 281, 140, 0, 1026, 1023, 1, 0, 0, 0, 1026, 1024, 1, 0, 0, 0, 1026, 1025, 1, 0, 0, 0, 1027, 286, 1, 0, 0, 0, 57, 0, 289, 294, 300, 587, 595, 599, 606, 610, 616, 622, 624, 631, 638, 645, 649, 653, 803, 807, 810, 817, 826, 828, 835, 837, 841, 850, 863, 869, 873, 881, 894, 900, 904, 911, 917, 921, 926, 931, 933, 940, 942, 946, 955, 968, 974, 978, 981, 984, 987, 995, 1001, 1006, 1009, 1013, 1021, 1026, 23, 1, 3, 0, 1, 4, 1, 1, 12, 2, 1, 13, 3, 1, 15, 4, 1, 17, 5, 1, 18, 6, 1, 19, 7, 1, 21, 8, 1, 22, 9, 1, 25, 10, 1, 30, 11, 1, 39, 12, 1, 42, 13, 1, 44, 14, 1, 65, 15, 1, 66, 16, 1, 72, 17, 1, 73, 18, 1, 85, 19, 1, 86, 20, 1, 111, 21, 0, 1, 0] \ No newline at end of file diff --git a/src/fandango/language/parser/FandangoLexer.py b/src/fandango/language/parser/FandangoLexer.py index ac019ddf..4ae9b16f 100644 --- a/src/fandango/language/parser/FandangoLexer.py +++ b/src/fandango/language/parser/FandangoLexer.py @@ -20,7 +20,7 @@ def serializedATN(): 4, 0, 116, - 1032, + 1028, 6, -1, 2, @@ -662,16 +662,6 @@ def serializedATN(): 5, 1, 5, - 4, - 5, - 320, - 8, - 5, - 11, - 5, - 12, - 5, - 321, 1, 5, 1, @@ -1206,14 +1196,14 @@ def serializedATN(): 49, 5, 49, - 590, + 586, 8, 49, 10, 49, 12, 49, - 593, + 589, 9, 49, 1, @@ -1228,7 +1218,7 @@ def serializedATN(): 50, 3, 50, - 600, + 596, 8, 50, 1, @@ -1237,7 +1227,7 @@ def serializedATN(): 50, 3, 50, - 604, + 600, 8, 50, 1, @@ -1252,7 +1242,7 @@ def serializedATN(): 51, 3, 51, - 611, + 607, 8, 51, 1, @@ -1261,7 +1251,7 @@ def serializedATN(): 51, 3, 51, - 615, + 611, 8, 51, 1, @@ -1270,31 +1260,31 @@ def serializedATN(): 52, 5, 52, - 619, + 615, 8, 52, 10, 52, 12, 52, - 622, + 618, 9, 52, 1, 52, 4, 52, - 625, + 621, 8, 52, 11, 52, 12, 52, - 626, + 622, 3, 52, - 629, + 625, 8, 52, 1, @@ -1305,14 +1295,14 @@ def serializedATN(): 53, 4, 53, - 634, + 630, 8, 53, 11, 53, 12, 53, - 635, + 631, 1, 54, 1, @@ -1321,14 +1311,14 @@ def serializedATN(): 54, 4, 54, - 641, + 637, 8, 54, 11, 54, 12, 54, - 642, + 638, 1, 55, 1, @@ -1337,21 +1327,21 @@ def serializedATN(): 55, 4, 55, - 648, + 644, 8, 55, 11, 55, 12, 55, - 649, + 645, 1, 56, 1, 56, 3, 56, - 654, + 650, 8, 56, 1, @@ -1360,7 +1350,7 @@ def serializedATN(): 57, 3, 57, - 658, + 654, 8, 57, 1, @@ -1661,7 +1651,7 @@ def serializedATN(): 111, 3, 111, - 808, + 804, 8, 111, 1, @@ -1670,14 +1660,14 @@ def serializedATN(): 111, 3, 111, - 812, + 808, 8, 111, 1, 111, 3, 111, - 815, + 811, 8, 111, 1, @@ -1692,7 +1682,7 @@ def serializedATN(): 112, 3, 112, - 822, + 818, 8, 112, 1, @@ -1711,14 +1701,14 @@ def serializedATN(): 114, 5, 114, - 831, + 827, 8, 114, 10, 114, 12, 114, - 834, + 830, 9, 114, 1, @@ -1731,21 +1721,21 @@ def serializedATN(): 114, 5, 114, - 840, + 836, 8, 114, 10, 114, 12, 114, - 843, + 839, 9, 114, 1, 114, 3, 114, - 846, + 842, 8, 114, 1, @@ -1760,14 +1750,14 @@ def serializedATN(): 115, 5, 115, - 853, + 849, 8, 115, 10, 115, 12, 115, - 856, + 852, 9, 115, 1, @@ -1788,14 +1778,14 @@ def serializedATN(): 115, 5, 115, - 866, + 862, 8, 115, 10, 115, 12, 115, - 869, + 865, 9, 115, 1, @@ -1806,7 +1796,7 @@ def serializedATN(): 115, 3, 115, - 874, + 870, 8, 115, 1, @@ -1815,7 +1805,7 @@ def serializedATN(): 116, 3, 116, - 878, + 874, 8, 116, 1, @@ -1832,7 +1822,7 @@ def serializedATN(): 118, 3, 118, - 886, + 882, 8, 118, 1, @@ -1859,7 +1849,7 @@ def serializedATN(): 124, 3, 124, - 899, + 895, 8, 124, 1, @@ -1872,7 +1862,7 @@ def serializedATN(): 124, 3, 124, - 905, + 901, 8, 124, 1, @@ -1881,7 +1871,7 @@ def serializedATN(): 125, 3, 125, - 909, + 905, 8, 125, 1, @@ -1892,49 +1882,49 @@ def serializedATN(): 126, 4, 126, - 914, + 910, 8, 126, 11, 126, 12, 126, - 915, + 911, 1, 127, 1, 127, 4, 127, - 920, + 916, 8, 127, 11, 127, 12, 127, - 921, + 917, 1, 128, 1, 128, 3, 128, - 926, + 922, 8, 128, 1, 128, 4, 128, - 929, + 925, 8, 128, 11, 128, 12, 128, - 930, + 926, 1, 129, 1, @@ -1943,14 +1933,14 @@ def serializedATN(): 129, 5, 129, - 936, + 932, 8, 129, 10, 129, 12, 129, - 939, + 935, 9, 129, 1, @@ -1963,21 +1953,21 @@ def serializedATN(): 129, 5, 129, - 945, + 941, 8, 129, 10, 129, 12, 129, - 948, + 944, 9, 129, 1, 129, 3, 129, - 951, + 947, 8, 129, 1, @@ -1992,14 +1982,14 @@ def serializedATN(): 130, 5, 130, - 958, + 954, 8, 130, 10, 130, 12, 130, - 961, + 957, 9, 130, 1, @@ -2020,14 +2010,14 @@ def serializedATN(): 130, 5, 130, - 971, + 967, 8, 130, 10, 130, 12, 130, - 974, + 970, 9, 130, 1, @@ -2038,7 +2028,7 @@ def serializedATN(): 130, 3, 130, - 979, + 975, 8, 130, 1, @@ -2047,28 +2037,28 @@ def serializedATN(): 131, 3, 131, - 983, + 979, 8, 131, 1, 132, 3, 132, - 986, + 982, 8, 132, 1, 133, 3, 133, - 989, + 985, 8, 133, 1, 134, 3, 134, - 992, + 988, 8, 134, 1, @@ -2081,28 +2071,28 @@ def serializedATN(): 136, 4, 136, - 998, + 994, 8, 136, 11, 136, 12, 136, - 999, + 995, 1, 137, 1, 137, 5, 137, - 1004, + 1000, 8, 137, 10, 137, 12, 137, - 1007, + 1003, 9, 137, 1, @@ -2111,14 +2101,14 @@ def serializedATN(): 138, 3, 138, - 1011, + 1007, 8, 138, 1, 138, 3, 138, - 1014, + 1010, 8, 138, 1, @@ -2127,7 +2117,7 @@ def serializedATN(): 138, 3, 138, - 1018, + 1014, 8, 138, 1, @@ -2144,7 +2134,7 @@ def serializedATN(): 141, 3, 141, - 1026, + 1022, 8, 141, 1, @@ -2155,14 +2145,14 @@ def serializedATN(): 142, 3, 142, - 1031, + 1027, 8, 142, 4, - 854, - 867, - 959, - 972, + 850, + 863, + 955, + 968, 0, 143, 1, @@ -4704,7 +4694,7 @@ def serializedATN(): 130041, 917760, 917999, - 1064, + 1059, 0, 1, 1, @@ -5426,823 +5416,823 @@ def serializedATN(): 0, 0, 13, - 325, + 321, 1, 0, 0, 0, 15, - 329, + 325, 1, 0, 0, 0, 17, - 332, + 328, 1, 0, 0, 0, 19, - 339, + 335, 1, 0, 0, 0, 21, - 345, + 341, 1, 0, 0, 0, 23, - 351, + 347, 1, 0, 0, 0, 25, - 357, + 353, 1, 0, 0, 0, 27, - 364, + 360, 1, 0, 0, 0, 29, - 372, + 368, 1, 0, 0, 0, 31, - 381, + 377, 1, 0, 0, 0, 33, - 387, + 383, 1, 0, 0, 0, 35, - 391, + 387, 1, 0, 0, 0, 37, - 398, + 394, 1, 0, 0, 0, 39, - 405, + 401, 1, 0, 0, 0, 41, - 414, + 410, 1, 0, 0, 0, 43, - 420, + 416, 1, 0, 0, 0, 45, - 430, + 426, 1, 0, 0, 0, 47, - 436, + 432, 1, 0, 0, 0, 49, - 441, + 437, 1, 0, 0, 0, 51, - 448, + 444, 1, 0, 0, 0, 53, - 453, + 449, 1, 0, 0, 0, 55, - 460, + 456, 1, 0, 0, 0, 57, - 463, + 459, 1, 0, 0, 0, 59, - 466, + 462, 1, 0, 0, 0, 61, - 473, + 469, 1, 0, 0, 0, 63, - 481, + 477, 1, 0, 0, 0, 65, - 486, + 482, 1, 0, 0, 0, 67, - 495, + 491, 1, 0, 0, 0, 69, - 499, + 495, 1, 0, 0, 0, 71, - 502, + 498, 1, 0, 0, 0, 73, - 507, + 503, 1, 0, 0, 0, 75, - 513, + 509, 1, 0, 0, 0, 77, - 520, + 516, 1, 0, 0, 0, 79, - 525, + 521, 1, 0, 0, 0, 81, - 531, + 527, 1, 0, 0, 0, 83, - 536, + 532, 1, 0, 0, 0, 85, - 538, + 534, 1, 0, 0, 0, 87, - 546, + 542, 1, 0, 0, 0, 89, - 552, + 548, 1, 0, 0, 0, 91, - 559, + 555, 1, 0, 0, 0, 93, - 565, + 561, 1, 0, 0, 0, 95, - 572, + 568, 1, 0, 0, 0, 97, - 579, + 575, 1, 0, 0, 0, 99, - 587, + 583, 1, 0, 0, 0, 101, - 599, + 595, 1, 0, 0, 0, 103, - 610, + 606, 1, 0, 0, 0, 105, - 628, + 624, 1, 0, 0, 0, 107, - 630, + 626, 1, 0, 0, 0, 109, - 637, + 633, 1, 0, 0, 0, 111, - 644, + 640, 1, 0, 0, 0, 113, - 653, + 649, 1, 0, 0, 0, 115, - 657, + 653, 1, 0, 0, 0, 117, - 661, + 657, 1, 0, 0, 0, 119, - 665, + 661, 1, 0, 0, 0, 121, - 667, + 663, 1, 0, 0, 0, 123, - 669, + 665, 1, 0, 0, 0, 125, - 671, + 667, 1, 0, 0, 0, 127, - 674, + 670, 1, 0, 0, 0, 129, - 678, + 674, 1, 0, 0, 0, 131, - 680, + 676, 1, 0, 0, 0, 133, - 683, + 679, 1, 0, 0, 0, 135, - 686, + 682, 1, 0, 0, 0, 137, - 688, + 684, 1, 0, 0, 0, 139, - 690, + 686, 1, 0, 0, 0, 141, - 692, + 688, 1, 0, 0, 0, 143, - 695, + 691, 1, 0, 0, 0, 145, - 697, + 693, 1, 0, 0, 0, 147, - 700, + 696, 1, 0, 0, 0, 149, - 703, + 699, 1, 0, 0, 0, 151, - 705, + 701, 1, 0, 0, 0, 153, - 707, + 703, 1, 0, 0, 0, 155, - 709, + 705, 1, 0, 0, 0, 157, - 712, + 708, 1, 0, 0, 0, 159, - 715, + 711, 1, 0, 0, 0, 161, - 717, + 713, 1, 0, 0, 0, 163, - 719, + 715, 1, 0, 0, 0, 165, - 721, + 717, 1, 0, 0, 0, 167, - 723, + 719, 1, 0, 0, 0, 169, - 726, + 722, 1, 0, 0, 0, 171, - 728, + 724, 1, 0, 0, 0, 173, - 731, + 727, 1, 0, 0, 0, 175, - 734, + 730, 1, 0, 0, 0, 177, - 736, + 732, 1, 0, 0, 0, 179, - 738, + 734, 1, 0, 0, 0, 181, - 741, + 737, 1, 0, 0, 0, 183, - 744, + 740, 1, 0, 0, 0, 185, - 747, + 743, 1, 0, 0, 0, 187, - 750, + 746, 1, 0, 0, 0, 189, - 753, + 749, 1, 0, 0, 0, 191, - 755, + 751, 1, 0, 0, 0, 193, - 758, + 754, 1, 0, 0, 0, 195, - 761, + 757, 1, 0, 0, 0, 197, - 764, + 760, 1, 0, 0, 0, 199, - 767, + 763, 1, 0, 0, 0, 201, - 770, + 766, 1, 0, 0, 0, 203, - 773, + 769, 1, 0, 0, 0, 205, - 776, + 772, 1, 0, 0, 0, 207, - 779, + 775, 1, 0, 0, 0, 209, - 782, + 778, 1, 0, 0, 0, 211, - 785, + 781, 1, 0, 0, 0, 213, - 789, + 785, 1, 0, 0, 0, 215, - 793, + 789, 1, 0, 0, 0, 217, - 797, + 793, 1, 0, 0, 0, 219, - 801, + 797, 1, 0, 0, 0, 221, - 804, + 800, 1, 0, 0, 0, 223, - 811, + 807, 1, 0, 0, 0, 225, - 821, + 817, 1, 0, 0, 0, 227, - 825, + 821, 1, 0, 0, 0, 229, - 845, + 841, 1, 0, 0, 0, 231, - 873, + 869, 1, 0, 0, 0, 233, - 877, + 873, 1, 0, 0, 0, 235, - 879, + 875, 1, 0, 0, 0, 237, - 885, + 881, 1, 0, 0, 0, 239, - 887, + 883, 1, 0, 0, 0, 241, - 889, + 885, 1, 0, 0, 0, 243, - 891, + 887, 1, 0, 0, 0, 245, - 893, + 889, 1, 0, 0, 0, 247, - 895, + 891, 1, 0, 0, 0, 249, - 904, + 900, 1, 0, 0, 0, 251, - 908, + 904, 1, 0, 0, 0, 253, - 913, + 909, 1, 0, 0, 0, 255, - 917, + 913, 1, 0, 0, 0, 257, - 923, + 919, 1, 0, 0, 0, 259, - 950, + 946, 1, 0, 0, 0, 261, - 978, + 974, 1, 0, 0, 0, 263, - 982, + 978, 1, 0, 0, 0, 265, - 985, + 981, 1, 0, 0, 0, 267, - 988, + 984, 1, 0, 0, 0, 269, - 991, + 987, 1, 0, 0, 0, 271, - 993, + 989, 1, 0, 0, 0, 273, - 997, + 993, 1, 0, 0, 0, 275, - 1001, + 997, 1, 0, 0, 0, 277, - 1008, + 1004, 1, 0, 0, 0, 279, - 1019, + 1015, 1, 0, 0, 0, 281, - 1021, + 1017, 1, 0, 0, 0, 283, - 1025, + 1021, 1, 0, 0, 0, 285, - 1030, + 1026, 1, 0, 0, @@ -6464,55 +6454,49 @@ def serializedATN(): 0, 0, 317, - 319, + 318, 5, 60, 0, 0, 318, - 320, + 319, 3, - 285, - 142, + 99, + 49, 0, 319, - 318, - 1, - 0, - 0, - 0, 320, - 321, - 1, - 0, + 5, + 62, 0, 0, - 321, - 319, + 320, + 12, 1, 0, 0, 0, 321, 322, - 1, - 0, + 5, + 97, 0, 0, 322, 323, - 1, - 0, + 5, + 110, 0, 0, 323, 324, 5, - 62, + 100, 0, 0, 324, - 12, + 14, 1, 0, 0, @@ -6526,25 +6510,25 @@ def serializedATN(): 326, 327, 5, - 110, + 115, 0, 0, 327, - 328, - 5, - 100, + 16, + 1, 0, 0, - 328, - 14, - 1, 0, + 328, + 329, + 5, + 97, 0, 0, 329, 330, 5, - 97, + 115, 0, 0, 330, @@ -6554,141 +6538,141 @@ def serializedATN(): 0, 0, 331, - 16, - 1, - 0, + 332, + 5, + 101, 0, 0, 332, 333, 5, - 97, + 114, 0, 0, 333, 334, 5, - 115, + 116, 0, 0, 334, - 335, - 5, - 115, + 18, + 1, + 0, 0, 0, 335, 336, 5, - 101, + 97, 0, 0, 336, 337, 5, - 114, + 115, 0, 0, 337, 338, 5, - 116, + 121, 0, 0, 338, - 18, - 1, - 0, + 339, + 5, + 110, 0, 0, 339, 340, 5, - 97, + 99, 0, 0, 340, - 341, - 5, - 115, + 20, + 1, + 0, 0, 0, 341, 342, 5, - 121, + 97, 0, 0, 342, 343, 5, - 110, + 119, 0, 0, 343, 344, 5, - 99, + 97, 0, 0, 344, - 20, - 1, - 0, + 345, + 5, + 105, 0, 0, 345, 346, 5, - 97, + 116, 0, 0, 346, - 347, - 5, - 119, + 22, + 1, + 0, 0, 0, 347, 348, 5, - 97, + 98, 0, 0, 348, 349, 5, - 105, + 114, 0, 0, 349, 350, 5, - 116, + 101, 0, 0, 350, - 22, - 1, - 0, + 351, + 5, + 97, 0, 0, 351, 352, 5, - 98, + 107, 0, 0, 352, - 353, - 5, - 114, + 24, + 1, + 0, 0, 0, 353, 354, 5, - 101, + 99, 0, 0, 354, @@ -6700,2665 +6684,2665 @@ def serializedATN(): 355, 356, 5, - 107, + 115, 0, 0, 356, - 24, - 1, - 0, - 0, - 0, 357, - 358, - 5, - 99, - 0, - 0, - 358, - 359, - 5, - 97, - 0, - 0, - 359, - 360, - 5, - 115, - 0, - 0, - 360, - 361, 5, 101, 0, 0, - 361, - 362, + 357, + 358, 1, 0, 0, 0, - 362, - 363, + 358, + 359, 6, 12, 2, 0, - 363, + 359, 26, 1, 0, 0, 0, - 364, - 365, + 360, + 361, 5, 99, 0, 0, - 365, - 366, + 361, + 362, 5, 108, 0, 0, - 366, - 367, + 362, + 363, 5, 97, 0, 0, - 367, - 368, + 363, + 364, 5, 115, 0, 0, - 368, - 369, + 364, + 365, 5, 115, 0, 0, - 369, - 370, + 365, + 366, 1, 0, 0, 0, - 370, - 371, + 366, + 367, 6, 13, 3, 0, - 371, + 367, 28, 1, 0, 0, 0, - 372, - 373, + 368, + 369, 5, 99, 0, 0, - 373, - 374, + 369, + 370, 5, 111, 0, 0, - 374, - 375, + 370, + 371, 5, 110, 0, 0, - 375, - 376, + 371, + 372, 5, 116, 0, 0, - 376, - 377, + 372, + 373, 5, 105, 0, 0, - 377, - 378, + 373, + 374, 5, 110, 0, 0, - 378, - 379, + 374, + 375, 5, 117, 0, 0, - 379, - 380, + 375, + 376, 5, 101, 0, 0, - 380, + 376, 30, 1, 0, 0, 0, - 381, - 382, + 377, + 378, 5, 100, 0, 0, - 382, - 383, + 378, + 379, 5, 101, 0, 0, - 383, - 384, + 379, + 380, 5, 102, 0, 0, - 384, - 385, + 380, + 381, 1, 0, 0, 0, - 385, - 386, + 381, + 382, 6, 15, 4, 0, - 386, + 382, 32, 1, 0, 0, 0, - 387, - 388, + 383, + 384, 5, 100, 0, 0, - 388, - 389, + 384, + 385, 5, 101, 0, 0, - 389, - 390, + 385, + 386, 5, 108, 0, 0, - 390, + 386, 34, 1, 0, 0, 0, - 391, - 392, + 387, + 388, 5, 101, 0, 0, - 392, - 393, + 388, + 389, 5, 108, 0, 0, - 393, - 394, + 389, + 390, 5, 105, 0, 0, - 394, - 395, + 390, + 391, 5, 102, 0, 0, - 395, - 396, + 391, + 392, 1, 0, 0, 0, - 396, - 397, + 392, + 393, 6, 17, 5, 0, - 397, + 393, 36, 1, 0, 0, 0, - 398, - 399, + 394, + 395, 5, 101, 0, 0, - 399, - 400, + 395, + 396, 5, 108, 0, 0, - 400, - 401, + 396, + 397, 5, 115, 0, 0, - 401, - 402, + 397, + 398, 5, 101, 0, 0, - 402, - 403, + 398, + 399, 1, 0, 0, 0, - 403, - 404, + 399, + 400, 6, 18, 6, 0, - 404, + 400, 38, 1, 0, 0, 0, - 405, - 406, + 401, + 402, 5, 101, 0, 0, - 406, - 407, + 402, + 403, 5, 120, 0, 0, - 407, - 408, + 403, + 404, 5, 99, 0, 0, - 408, - 409, + 404, + 405, 5, 101, 0, 0, - 409, - 410, + 405, + 406, 5, 112, 0, 0, - 410, - 411, + 406, + 407, 5, 116, 0, 0, - 411, - 412, + 407, + 408, 1, 0, 0, 0, - 412, - 413, + 408, + 409, 6, 19, 7, 0, - 413, + 409, 40, 1, 0, 0, 0, - 414, - 415, + 410, + 411, 5, 70, 0, 0, - 415, - 416, + 411, + 412, 5, 97, 0, 0, - 416, - 417, + 412, + 413, 5, 108, 0, 0, - 417, - 418, + 413, + 414, 5, 115, 0, 0, - 418, - 419, + 414, + 415, 5, 101, 0, 0, - 419, + 415, 42, 1, 0, 0, 0, - 420, - 421, + 416, + 417, 5, 102, 0, 0, - 421, - 422, + 417, + 418, 5, 105, 0, 0, - 422, - 423, + 418, + 419, 5, 110, 0, 0, - 423, - 424, + 419, + 420, 5, 97, 0, 0, - 424, - 425, + 420, + 421, 5, 108, 0, 0, - 425, - 426, + 421, + 422, 5, 108, 0, 0, - 426, - 427, + 422, + 423, 5, 121, 0, 0, - 427, - 428, + 423, + 424, 1, 0, 0, 0, - 428, - 429, + 424, + 425, 6, 21, 8, 0, - 429, + 425, 44, 1, 0, 0, 0, - 430, - 431, + 426, + 427, 5, 102, 0, 0, - 431, - 432, + 427, + 428, 5, 111, 0, 0, - 432, - 433, + 428, + 429, 5, 114, 0, 0, - 433, - 434, + 429, + 430, 1, 0, 0, 0, - 434, - 435, + 430, + 431, 6, 22, 9, 0, - 435, + 431, 46, 1, 0, 0, 0, - 436, - 437, + 432, + 433, 5, 102, 0, 0, - 437, - 438, + 433, + 434, 5, 114, 0, 0, - 438, - 439, + 434, + 435, 5, 111, 0, 0, - 439, - 440, + 435, + 436, 5, 109, 0, 0, - 440, + 436, 48, 1, 0, 0, 0, - 441, - 442, + 437, + 438, 5, 103, 0, 0, - 442, - 443, + 438, + 439, 5, 108, 0, 0, - 443, - 444, + 439, + 440, 5, 111, 0, 0, - 444, - 445, + 440, + 441, 5, 98, 0, 0, - 445, - 446, + 441, + 442, 5, 97, 0, 0, - 446, - 447, + 442, + 443, 5, 108, 0, 0, - 447, + 443, 50, 1, 0, 0, 0, - 448, - 449, + 444, + 445, 5, 105, 0, 0, - 449, - 450, + 445, + 446, 5, 102, 0, 0, - 450, - 451, + 446, + 447, 1, 0, 0, 0, - 451, - 452, + 447, + 448, 6, 25, 10, 0, - 452, + 448, 52, 1, 0, 0, 0, - 453, - 454, + 449, + 450, 5, 105, 0, 0, - 454, - 455, + 450, + 451, 5, 109, 0, 0, - 455, - 456, + 451, + 452, 5, 112, 0, 0, - 456, - 457, + 452, + 453, 5, 111, 0, 0, - 457, - 458, + 453, + 454, 5, 114, 0, 0, - 458, - 459, + 454, + 455, 5, 116, 0, 0, - 459, + 455, 54, 1, 0, 0, 0, - 460, - 461, + 456, + 457, 5, 105, 0, 0, - 461, - 462, + 457, + 458, 5, 110, 0, 0, - 462, + 458, 56, 1, 0, 0, 0, - 463, - 464, + 459, + 460, 5, 105, 0, 0, - 464, - 465, + 460, + 461, 5, 115, 0, 0, - 465, + 461, 58, 1, 0, 0, 0, - 466, - 467, + 462, + 463, 5, 108, 0, 0, - 467, - 468, + 463, + 464, 5, 97, 0, 0, - 468, - 469, + 464, + 465, 5, 109, 0, 0, - 469, - 470, + 465, + 466, 5, 98, 0, 0, - 470, - 471, + 466, + 467, 5, 100, 0, 0, - 471, - 472, + 467, + 468, 5, 97, 0, 0, - 472, + 468, 60, 1, 0, 0, 0, - 473, - 474, + 469, + 470, 5, 109, 0, 0, - 474, - 475, + 470, + 471, 5, 97, 0, 0, - 475, - 476, + 471, + 472, 5, 116, 0, 0, - 476, - 477, + 472, + 473, 5, 99, 0, 0, - 477, - 478, + 473, + 474, 5, 104, 0, 0, - 478, - 479, + 474, + 475, 1, 0, 0, 0, - 479, - 480, + 475, + 476, 6, 30, 11, 0, - 480, + 476, 62, 1, 0, 0, 0, - 481, - 482, + 477, + 478, 5, 78, 0, 0, - 482, - 483, + 478, + 479, 5, 111, 0, 0, - 483, - 484, + 479, + 480, 5, 110, 0, 0, - 484, - 485, + 480, + 481, 5, 101, 0, 0, - 485, + 481, 64, 1, 0, 0, 0, - 486, - 487, + 482, + 483, 5, 110, 0, 0, - 487, - 488, + 483, + 484, 5, 111, 0, 0, - 488, - 489, + 484, + 485, 5, 110, 0, 0, - 489, - 490, + 485, + 486, 5, 108, 0, 0, - 490, - 491, + 486, + 487, 5, 111, 0, 0, - 491, - 492, + 487, + 488, 5, 99, 0, 0, - 492, - 493, + 488, + 489, 5, 97, 0, 0, - 493, - 494, + 489, + 490, 5, 108, 0, 0, - 494, + 490, 66, 1, 0, 0, 0, - 495, - 496, + 491, + 492, 5, 110, 0, 0, - 496, - 497, + 492, + 493, 5, 111, 0, 0, - 497, - 498, + 493, + 494, 5, 116, 0, 0, - 498, + 494, 68, 1, 0, 0, 0, - 499, - 500, + 495, + 496, 5, 111, 0, 0, - 500, - 501, + 496, + 497, 5, 114, 0, 0, - 501, + 497, 70, 1, 0, 0, 0, - 502, - 503, + 498, + 499, 5, 112, 0, 0, - 503, - 504, + 499, + 500, 5, 97, 0, 0, - 504, - 505, + 500, + 501, 5, 115, 0, 0, - 505, - 506, + 501, + 502, 5, 115, 0, 0, - 506, + 502, 72, 1, 0, 0, 0, - 507, - 508, + 503, + 504, 5, 114, 0, 0, - 508, - 509, + 504, + 505, 5, 97, 0, 0, - 509, - 510, + 505, + 506, 5, 105, 0, 0, - 510, - 511, + 506, + 507, 5, 115, 0, 0, - 511, - 512, + 507, + 508, 5, 101, 0, 0, - 512, + 508, 74, 1, 0, 0, 0, - 513, - 514, + 509, + 510, 5, 114, 0, 0, - 514, - 515, + 510, + 511, 5, 101, 0, 0, - 515, - 516, + 511, + 512, 5, 116, 0, 0, - 516, - 517, + 512, + 513, 5, 117, 0, 0, - 517, - 518, + 513, + 514, 5, 114, 0, 0, - 518, - 519, + 514, + 515, 5, 110, 0, 0, - 519, + 515, 76, 1, 0, 0, 0, - 520, - 521, + 516, + 517, 5, 84, 0, 0, - 521, - 522, + 517, + 518, 5, 114, 0, 0, - 522, - 523, + 518, + 519, 5, 117, 0, 0, - 523, - 524, + 519, + 520, 5, 101, 0, 0, - 524, + 520, 78, 1, 0, 0, 0, - 525, - 526, + 521, + 522, 5, 116, 0, 0, - 526, - 527, + 522, + 523, 5, 114, 0, 0, - 527, - 528, + 523, + 524, 5, 121, 0, 0, - 528, - 529, + 524, + 525, 1, 0, 0, 0, - 529, - 530, + 525, + 526, 6, 39, 12, 0, - 530, + 526, 80, 1, 0, 0, 0, - 531, - 532, + 527, + 528, 5, 116, 0, 0, - 532, - 533, + 528, + 529, 5, 121, 0, 0, - 533, - 534, + 529, + 530, 5, 112, 0, 0, - 534, - 535, + 530, + 531, 5, 101, 0, 0, - 535, + 531, 82, 1, 0, 0, 0, - 536, - 537, + 532, + 533, 5, 95, 0, 0, - 537, + 533, 84, 1, 0, 0, 0, - 538, - 539, + 534, + 535, 5, 119, 0, 0, - 539, - 540, + 535, + 536, 5, 104, 0, 0, - 540, - 541, + 536, + 537, 5, 105, 0, 0, - 541, - 542, + 537, + 538, 5, 108, 0, 0, - 542, - 543, + 538, + 539, 5, 101, 0, 0, - 543, - 544, + 539, + 540, 1, 0, 0, 0, - 544, - 545, + 540, + 541, 6, 42, 13, 0, - 545, + 541, 86, 1, 0, 0, 0, - 546, - 547, + 542, + 543, 5, 119, 0, 0, - 547, - 548, + 543, + 544, 5, 104, 0, 0, - 548, - 549, + 544, + 545, 5, 101, 0, 0, - 549, - 550, + 545, + 546, 5, 114, 0, 0, - 550, - 551, + 546, + 547, 5, 101, 0, 0, - 551, + 547, 88, 1, 0, 0, 0, - 552, - 553, + 548, + 549, 5, 119, 0, 0, - 553, - 554, + 549, + 550, 5, 105, 0, 0, - 554, - 555, + 550, + 551, 5, 116, 0, 0, - 555, - 556, + 551, + 552, 5, 104, 0, 0, - 556, - 557, + 552, + 553, 1, 0, 0, 0, - 557, - 558, + 553, + 554, 6, 44, 14, 0, - 558, + 554, 90, 1, 0, 0, 0, - 559, - 560, + 555, + 556, 5, 121, 0, 0, - 560, - 561, + 556, + 557, 5, 105, 0, 0, - 561, - 562, + 557, + 558, 5, 101, 0, 0, - 562, - 563, + 558, + 559, 5, 108, 0, 0, - 563, - 564, + 559, + 560, 5, 100, 0, 0, - 564, + 560, 92, 1, 0, 0, 0, - 565, - 566, + 561, + 562, 5, 102, 0, 0, - 566, - 567, + 562, + 563, 5, 111, 0, 0, - 567, - 568, + 563, + 564, 5, 114, 0, 0, - 568, - 569, + 564, + 565, 5, 97, 0, 0, - 569, - 570, + 565, + 566, 5, 108, 0, 0, - 570, - 571, + 566, + 567, 5, 108, 0, 0, - 571, + 567, 94, 1, 0, 0, 0, - 572, - 573, + 568, + 569, 5, 101, 0, 0, - 573, - 574, + 569, + 570, 5, 120, 0, 0, - 574, - 575, + 570, + 571, 5, 105, 0, 0, - 575, - 576, + 571, + 572, 5, 115, 0, 0, - 576, - 577, + 572, + 573, 5, 116, 0, 0, - 577, - 578, + 573, + 574, 5, 115, 0, 0, - 578, + 574, 96, 1, 0, 0, 0, - 579, - 580, + 575, + 576, 5, 102, 0, 0, - 580, - 581, + 576, + 577, 5, 105, 0, 0, - 581, - 582, + 577, + 578, 5, 116, 0, 0, - 582, - 583, + 578, + 579, 5, 110, 0, 0, - 583, - 584, + 579, + 580, 5, 101, 0, 0, - 584, - 585, + 580, + 581, 5, 115, 0, 0, - 585, - 586, + 581, + 582, 5, 115, 0, 0, - 586, + 582, 98, 1, 0, 0, 0, + 583, 587, - 591, 3, 283, 141, 0, - 588, - 590, + 584, + 586, 3, 285, 142, 0, - 589, - 588, + 585, + 584, 1, 0, 0, 0, - 590, - 593, + 586, + 589, 1, 0, 0, 0, - 591, - 589, + 587, + 585, 1, 0, 0, 0, - 591, - 592, + 587, + 588, 1, 0, 0, 0, - 592, + 588, 100, 1, 0, 0, 0, - 593, - 591, + 589, + 587, 1, 0, 0, 0, - 594, - 600, + 590, + 596, 7, 0, 0, 0, - 595, - 596, + 591, + 592, 7, 1, 0, 0, + 592, 596, - 600, 7, 2, 0, 0, - 597, - 598, + 593, + 594, 7, 2, 0, 0, - 598, - 600, + 594, + 596, 7, 1, 0, 0, - 599, - 594, + 595, + 590, 1, 0, 0, 0, - 599, 595, + 591, 1, 0, 0, 0, - 599, - 597, + 595, + 593, 1, 0, 0, 0, - 599, - 600, + 595, + 596, 1, 0, 0, 0, - 600, - 603, + 596, + 599, 1, 0, 0, 0, - 601, - 604, + 597, + 600, 3, 229, 114, 0, - 602, - 604, + 598, + 600, 3, 231, 115, 0, - 603, - 601, + 599, + 597, 1, 0, 0, 0, - 603, - 602, + 599, + 598, 1, 0, 0, 0, - 604, + 600, 102, 1, 0, 0, 0, - 605, - 611, + 601, + 607, 7, 3, 0, 0, - 606, - 607, + 602, + 603, 7, 3, 0, 0, + 603, 607, - 611, 7, 2, 0, 0, - 608, - 609, + 604, + 605, 7, 2, 0, 0, - 609, - 611, + 605, + 607, 7, 3, 0, 0, - 610, - 605, + 606, + 601, 1, 0, 0, 0, - 610, 606, + 602, 1, 0, 0, 0, - 610, - 608, + 606, + 604, 1, 0, 0, 0, - 611, - 614, + 607, + 610, 1, 0, 0, 0, - 612, - 615, + 608, + 611, 3, 259, 129, 0, - 613, - 615, + 609, + 611, 3, 261, 130, 0, - 614, - 612, - 1, + 610, + 608, + 1, 0, 0, 0, - 614, - 613, + 610, + 609, 1, 0, 0, 0, - 615, + 611, 104, 1, 0, 0, 0, + 612, 616, - 620, 3, 239, 119, 0, - 617, - 619, + 613, + 615, 3, 241, 120, 0, - 618, - 617, + 614, + 613, 1, 0, 0, 0, - 619, - 622, + 615, + 618, 1, 0, 0, 0, - 620, - 618, + 616, + 614, 1, 0, 0, 0, - 620, - 621, + 616, + 617, 1, 0, 0, 0, - 621, - 629, + 617, + 625, 1, 0, 0, 0, - 622, - 620, + 618, + 616, 1, 0, 0, 0, - 623, - 625, + 619, + 621, 5, 48, 0, 0, - 624, - 623, + 620, + 619, 1, 0, 0, 0, - 625, - 626, + 621, + 622, 1, 0, 0, 0, - 626, - 624, + 622, + 620, 1, 0, 0, 0, - 626, - 627, + 622, + 623, 1, 0, 0, 0, - 627, - 629, + 623, + 625, 1, 0, 0, 0, - 628, - 616, + 624, + 612, 1, 0, 0, 0, - 628, 624, + 620, 1, 0, 0, 0, - 629, + 625, 106, 1, 0, 0, 0, - 630, - 631, + 626, + 627, 5, 48, 0, 0, - 631, - 633, + 627, + 629, 7, 4, 0, 0, - 632, - 634, + 628, + 630, 3, 243, 121, 0, - 633, - 632, + 629, + 628, 1, 0, 0, 0, - 634, - 635, + 630, + 631, 1, 0, 0, 0, - 635, - 633, + 631, + 629, 1, 0, 0, 0, - 635, - 636, + 631, + 632, 1, 0, 0, 0, - 636, + 632, 108, 1, 0, 0, 0, - 637, - 638, + 633, + 634, 5, 48, 0, 0, - 638, - 640, + 634, + 636, 7, 5, 0, 0, - 639, - 641, + 635, + 637, 3, 245, 122, 0, - 640, - 639, + 636, + 635, 1, 0, 0, 0, - 641, - 642, + 637, + 638, 1, 0, 0, 0, - 642, - 640, + 638, + 636, 1, 0, 0, 0, - 642, - 643, + 638, + 639, 1, 0, 0, 0, - 643, + 639, 110, 1, 0, 0, 0, - 644, - 645, + 640, + 641, 5, 48, 0, 0, - 645, - 647, + 641, + 643, 7, 3, 0, 0, - 646, - 648, + 642, + 644, 3, 247, 123, 0, - 647, - 646, + 643, + 642, 1, 0, 0, 0, - 648, - 649, + 644, + 645, 1, 0, 0, 0, - 649, - 647, + 645, + 643, 1, 0, 0, 0, - 649, - 650, + 645, + 646, 1, 0, 0, 0, - 650, + 646, 112, 1, 0, 0, 0, - 651, - 654, + 647, + 650, 3, 249, 124, 0, - 652, - 654, + 648, + 650, 3, 251, 125, 0, - 653, - 651, + 649, + 647, 1, 0, 0, 0, - 653, - 652, + 649, + 648, 1, 0, 0, 0, - 654, + 650, 114, 1, 0, 0, 0, - 655, - 658, + 651, + 654, 3, 113, 56, 0, - 656, - 658, + 652, + 654, 3, 253, 126, 0, - 657, - 655, + 653, + 651, 1, 0, 0, 0, - 657, - 656, + 653, + 652, 1, 0, 0, 0, - 658, - 659, + 654, + 655, 1, 0, 0, 0, - 659, - 660, + 655, + 656, 7, 6, 0, 0, - 660, + 656, 116, 1, 0, 0, 0, - 661, - 662, + 657, + 658, 5, 58, 0, 0, - 662, - 663, + 658, + 659, 5, 58, 0, 0, - 663, - 664, + 659, + 660, 5, 61, 0, 0, - 664, + 660, 118, 1, 0, 0, 0, - 665, - 666, + 661, + 662, 5, 63, 0, 0, - 666, + 662, 120, 1, 0, 0, 0, - 667, - 668, + 663, + 664, 5, 92, 0, 0, - 668, + 664, 122, 1, 0, 0, 0, - 669, - 670, + 665, + 666, 5, 46, 0, 0, - 670, + 666, 124, 1, 0, 0, 0, - 671, - 672, + 667, + 668, 5, 46, 0, 0, - 672, - 673, + 668, + 669, 5, 46, 0, 0, - 673, + 669, 126, 1, 0, 0, 0, - 674, - 675, + 670, + 671, 5, 46, 0, 0, - 675, - 676, + 671, + 672, 5, 46, 0, 0, - 676, - 677, + 672, + 673, 5, 46, 0, 0, - 677, + 673, 128, 1, 0, 0, 0, - 678, - 679, + 674, + 675, 5, 42, 0, 0, - 679, + 675, 130, 1, 0, 0, 0, - 680, - 681, + 676, + 677, 5, 40, 0, 0, - 681, - 682, + 677, + 678, 6, 65, 15, 0, - 682, + 678, 132, 1, 0, 0, 0, - 683, - 684, + 679, + 680, 5, 41, 0, 0, - 684, - 685, + 680, + 681, 6, 66, 16, 0, - 685, + 681, 134, 1, 0, 0, 0, - 686, - 687, + 682, + 683, 5, 44, 0, 0, - 687, + 683, 136, 1, 0, 0, 0, - 688, - 689, + 684, + 685, 5, 58, 0, 0, - 689, + 685, 138, 1, 0, 0, 0, - 690, - 691, + 686, + 687, 5, 59, 0, 0, - 691, + 687, 140, 1, 0, 0, 0, - 692, - 693, + 688, + 689, 5, 42, 0, 0, - 693, - 694, + 689, + 690, 5, 42, 0, 0, - 694, + 690, 142, 1, 0, 0, 0, - 695, - 696, + 691, + 692, 5, 61, 0, 0, - 696, + 692, 144, 1, 0, 0, 0, - 697, - 698, + 693, + 694, 5, 91, 0, 0, - 698, - 699, + 694, + 695, 6, 72, 17, 0, - 699, + 695, 146, 1, 0, 0, 0, - 700, - 701, + 696, + 697, 5, 93, 0, 0, - 701, - 702, + 697, + 698, 6, 73, 18, 0, - 702, + 698, 148, 1, 0, 0, 0, - 703, - 704, + 699, + 700, 5, 124, 0, 0, - 704, + 700, 150, 1, 0, 0, 0, - 705, - 706, + 701, + 702, 5, 94, 0, 0, - 706, + 702, 152, 1, 0, 0, 0, - 707, - 708, + 703, + 704, 5, 38, 0, 0, - 708, + 704, 154, 1, 0, 0, 0, - 709, - 710, + 705, + 706, 5, 60, 0, 0, - 710, - 711, + 706, + 707, 5, 60, 0, 0, - 711, + 707, 156, 1, 0, 0, 0, - 712, - 713, + 708, + 709, 5, 62, 0, 0, - 713, - 714, + 709, + 710, 5, 62, 0, 0, - 714, + 710, 158, 1, 0, 0, 0, - 715, - 716, + 711, + 712, 5, 43, 0, 0, - 716, + 712, 160, 1, 0, 0, 0, - 717, - 718, + 713, + 714, 5, 45, 0, 0, - 718, + 714, 162, 1, 0, 0, 0, - 719, - 720, + 715, + 716, 5, 47, 0, 0, - 720, + 716, 164, 1, 0, 0, 0, - 721, - 722, + 717, + 718, 5, 37, 0, 0, - 722, + 718, 166, 1, 0, 0, 0, - 723, - 724, + 719, + 720, 5, 47, 0, 0, - 724, - 725, + 720, + 721, 5, 47, 0, 0, - 725, + 721, 168, 1, 0, 0, 0, - 726, - 727, + 722, + 723, 5, 126, 0, 0, - 727, + 723, 170, 1, 0, 0, 0, - 728, - 729, + 724, + 725, 5, 123, 0, 0, - 729, - 730, + 725, + 726, 6, 85, 19, 0, - 730, + 726, 172, 1, 0, 0, 0, - 731, - 732, + 727, + 728, 5, 125, 0, 0, - 732, - 733, + 728, + 729, 6, 86, 20, 0, - 733, + 729, 174, 1, 0, 0, 0, - 734, - 735, + 730, + 731, 5, 60, 0, 0, - 735, + 731, 176, 1, 0, 0, 0, - 736, - 737, + 732, + 733, 5, 62, 0, 0, - 737, + 733, 178, 1, 0, 0, 0, - 738, - 739, + 734, + 735, 5, 61, 0, 0, - 739, - 740, + 735, + 736, 5, 61, 0, 0, - 740, + 736, 180, 1, 0, 0, 0, - 741, - 742, + 737, + 738, 5, 62, 0, 0, - 742, - 743, + 738, + 739, 5, 61, 0, 0, - 743, + 739, 182, 1, 0, 0, 0, - 744, - 745, + 740, + 741, 5, 60, 0, 0, - 745, - 746, + 741, + 742, 5, 61, 0, 0, - 746, + 742, 184, 1, 0, 0, 0, - 747, - 748, + 743, + 744, 5, 60, 0, 0, - 748, - 749, + 744, + 745, 5, 62, 0, 0, - 749, + 745, 186, 1, 0, 0, 0, - 750, - 751, + 746, + 747, 5, 33, 0, 0, - 751, - 752, + 747, + 748, 5, 61, 0, 0, - 752, + 748, 188, 1, 0, 0, 0, - 753, - 754, + 749, + 750, 5, 64, 0, 0, - 754, + 750, 190, 1, 0, 0, 0, - 755, - 756, + 751, + 752, 5, 45, 0, 0, - 756, - 757, + 752, + 753, 5, 62, 0, 0, - 757, + 753, 192, 1, 0, 0, 0, - 758, - 759, + 754, + 755, 5, 43, 0, 0, - 759, - 760, + 755, + 756, 5, 61, 0, 0, - 760, + 756, 194, 1, 0, 0, 0, - 761, - 762, + 757, + 758, 5, 45, 0, 0, - 762, - 763, + 758, + 759, 5, 61, 0, 0, - 763, + 759, 196, 1, 0, 0, 0, - 764, - 765, + 760, + 761, 5, 42, 0, 0, - 765, - 766, + 761, + 762, 5, 61, 0, 0, - 766, + 762, 198, 1, 0, 0, 0, - 767, - 768, + 763, + 764, 5, 64, 0, 0, - 768, - 769, + 764, + 765, 5, 61, 0, 0, - 769, + 765, 200, 1, 0, 0, 0, - 770, - 771, + 766, + 767, 5, 47, 0, 0, - 771, - 772, + 767, + 768, 5, 61, 0, 0, - 772, + 768, 202, 1, 0, 0, 0, - 773, - 774, + 769, + 770, 5, 37, 0, 0, - 774, - 775, + 770, + 771, 5, 61, 0, 0, - 775, + 771, 204, 1, 0, 0, 0, - 776, - 777, + 772, + 773, 5, 38, 0, 0, - 777, - 778, + 773, + 774, 5, 61, 0, 0, - 778, + 774, 206, 1, 0, 0, 0, - 779, - 780, + 775, + 776, 5, 124, 0, 0, - 780, - 781, + 776, + 777, 5, 61, 0, 0, - 781, + 777, 208, 1, 0, 0, 0, + 778, + 779, + 5, + 94, + 0, + 0, + 779, + 780, + 5, + 61, + 0, + 0, + 780, + 210, + 1, + 0, + 0, + 0, + 781, + 782, + 5, + 60, + 0, + 0, 782, 783, 5, - 94, + 60, 0, 0, 783, @@ -9368,7 +9352,7 @@ def serializedATN(): 0, 0, 784, - 210, + 212, 1, 0, 0, @@ -9376,13 +9360,13 @@ def serializedATN(): 785, 786, 5, - 60, + 62, 0, 0, 786, 787, 5, - 60, + 62, 0, 0, 787, @@ -9392,7 +9376,7 @@ def serializedATN(): 0, 0, 788, - 212, + 214, 1, 0, 0, @@ -9400,13 +9384,13 @@ def serializedATN(): 789, 790, 5, - 62, + 42, 0, 0, 790, 791, 5, - 62, + 42, 0, 0, 791, @@ -9416,7 +9400,7 @@ def serializedATN(): 0, 0, 792, - 214, + 216, 1, 0, 0, @@ -9424,13 +9408,13 @@ def serializedATN(): 793, 794, 5, - 42, + 47, 0, 0, 794, 795, 5, - 42, + 47, 0, 0, 795, @@ -9440,7 +9424,7 @@ def serializedATN(): 0, 0, 796, - 216, + 218, 1, 0, 0, @@ -9448,1706 +9432,1681 @@ def serializedATN(): 797, 798, 5, - 47, + 58, 0, 0, 798, 799, 5, - 47, - 0, - 0, - 799, - 800, - 5, - 61, - 0, - 0, - 800, - 218, - 1, - 0, - 0, - 0, - 801, - 802, - 5, - 58, - 0, - 0, - 802, - 803, - 5, 61, 0, 0, - 803, + 799, 220, 1, 0, 0, 0, - 804, - 805, + 800, + 801, 5, 33, 0, 0, - 805, + 801, 222, 1, 0, 0, 0, - 806, - 808, + 802, + 804, 5, 13, 0, 0, - 807, - 806, + 803, + 802, 1, 0, 0, 0, - 807, - 808, + 803, + 804, 1, 0, 0, 0, - 808, - 809, + 804, + 805, 1, 0, 0, 0, - 809, - 812, + 805, + 808, 5, 10, 0, 0, - 810, - 812, + 806, + 808, 2, 12, 13, 0, - 811, 807, + 803, 1, 0, 0, 0, - 811, - 810, + 807, + 806, 1, 0, 0, 0, - 812, - 814, + 808, + 810, 1, 0, 0, 0, - 813, - 815, + 809, + 811, 3, 273, 136, 0, - 814, - 813, + 810, + 809, 1, 0, 0, 0, - 814, - 815, + 810, + 811, 1, 0, 0, 0, - 815, - 816, + 811, + 812, 1, 0, 0, 0, - 816, - 817, + 812, + 813, 6, 111, 21, 0, - 817, + 813, 224, 1, 0, 0, 0, + 814, 818, - 822, 3, 273, 136, 0, - 819, - 822, + 815, + 818, 3, 275, 137, 0, - 820, - 822, + 816, + 818, 3, 277, 138, 0, - 821, - 818, + 817, + 814, 1, 0, 0, 0, - 821, - 819, + 817, + 815, 1, 0, 0, 0, - 821, - 820, + 817, + 816, 1, 0, 0, 0, - 822, - 823, + 818, + 819, 1, 0, 0, 0, - 823, - 824, + 819, + 820, 6, 112, 22, 0, - 824, + 820, 226, 1, 0, 0, 0, - 825, - 826, - 9, + 821, + 822, + 9, 0, 0, 0, - 826, + 822, 228, 1, 0, 0, 0, - 827, - 832, + 823, + 828, 5, 39, 0, 0, - 828, - 831, + 824, + 827, 3, 237, 118, 0, - 829, - 831, + 825, + 827, 8, 7, 0, 0, - 830, - 828, + 826, + 824, 1, 0, 0, 0, - 830, - 829, + 826, + 825, 1, 0, 0, 0, - 831, - 834, + 827, + 830, 1, 0, 0, 0, - 832, - 830, + 828, + 826, 1, 0, 0, 0, - 832, - 833, + 828, + 829, 1, 0, 0, 0, - 833, - 835, + 829, + 831, 1, 0, 0, 0, - 834, - 832, + 830, + 828, 1, 0, 0, 0, - 835, - 846, + 831, + 842, 5, 39, 0, 0, - 836, - 841, + 832, + 837, 5, 34, 0, 0, - 837, - 840, + 833, + 836, 3, 237, 118, 0, - 838, - 840, + 834, + 836, 8, 8, 0, 0, - 839, - 837, + 835, + 833, 1, 0, 0, 0, - 839, - 838, + 835, + 834, 1, 0, 0, 0, - 840, - 843, + 836, + 839, 1, 0, 0, 0, - 841, - 839, + 837, + 835, 1, 0, 0, 0, - 841, - 842, + 837, + 838, 1, 0, 0, 0, - 842, - 844, + 838, + 840, 1, 0, 0, 0, - 843, - 841, + 839, + 837, 1, 0, 0, 0, - 844, - 846, + 840, + 842, 5, 34, 0, 0, - 845, - 827, + 841, + 823, 1, 0, 0, 0, - 845, - 836, + 841, + 832, 1, 0, 0, 0, - 846, + 842, 230, 1, 0, 0, 0, - 847, - 848, + 843, + 844, 5, 39, 0, 0, - 848, - 849, + 844, + 845, 5, 39, 0, 0, - 849, - 850, + 845, + 846, 5, 39, 0, 0, + 846, 850, - 854, 1, 0, 0, 0, - 851, - 853, + 847, + 849, 3, 233, 116, 0, - 852, - 851, + 848, + 847, 1, 0, 0, 0, - 853, - 856, + 849, + 852, 1, 0, 0, 0, - 854, - 855, + 850, + 851, 1, 0, 0, 0, - 854, - 852, + 850, + 848, 1, 0, 0, 0, - 855, - 857, + 851, + 853, 1, 0, 0, 0, - 856, - 854, + 852, + 850, 1, 0, 0, 0, - 857, - 858, + 853, + 854, 5, 39, 0, 0, - 858, - 859, + 854, + 855, 5, 39, 0, 0, - 859, - 874, + 855, + 870, 5, 39, 0, 0, - 860, - 861, + 856, + 857, 5, 34, 0, 0, - 861, - 862, + 857, + 858, 5, 34, 0, 0, - 862, - 863, + 858, + 859, 5, 34, 0, 0, + 859, 863, - 867, 1, 0, 0, 0, - 864, - 866, + 860, + 862, 3, 233, 116, 0, - 865, - 864, + 861, + 860, 1, 0, 0, 0, - 866, - 869, + 862, + 865, 1, 0, 0, 0, - 867, - 868, + 863, + 864, 1, 0, 0, 0, - 867, - 865, + 863, + 861, 1, 0, 0, 0, - 868, - 870, + 864, + 866, 1, 0, 0, 0, - 869, - 867, + 865, + 863, 1, 0, 0, 0, - 870, - 871, + 866, + 867, 5, 34, 0, 0, - 871, - 872, + 867, + 868, 5, 34, 0, 0, - 872, - 874, + 868, + 870, 5, 34, 0, 0, - 873, - 847, + 869, + 843, 1, 0, 0, 0, - 873, - 860, + 869, + 856, 1, 0, 0, 0, - 874, + 870, 232, 1, 0, 0, 0, - 875, - 878, + 871, + 874, 3, 235, 117, 0, - 876, - 878, + 872, + 874, 3, 237, 118, 0, - 877, - 875, + 873, + 871, 1, 0, 0, 0, - 877, - 876, + 873, + 872, 1, 0, 0, 0, - 878, + 874, 234, 1, 0, 0, 0, - 879, - 880, + 875, + 876, 8, 9, 0, 0, - 880, + 876, 236, 1, 0, 0, 0, - 881, - 882, + 877, + 878, 5, 92, 0, 0, + 878, 882, - 886, 9, 0, 0, 0, - 883, - 884, + 879, + 880, 5, 92, 0, 0, - 884, - 886, + 880, + 882, 3, 223, 111, 0, - 885, 881, + 877, 1, 0, 0, 0, - 885, - 883, + 881, + 879, 1, 0, 0, 0, - 886, + 882, 238, 1, 0, 0, 0, - 887, - 888, + 883, + 884, 7, 10, 0, 0, - 888, + 884, 240, 1, 0, 0, 0, - 889, - 890, + 885, + 886, 7, 11, 0, 0, - 890, + 886, 242, 1, 0, 0, 0, - 891, - 892, + 887, + 888, 7, 12, 0, 0, - 892, + 888, 244, 1, 0, 0, 0, - 893, - 894, + 889, + 890, 7, 13, 0, 0, - 894, + 890, 246, 1, 0, 0, 0, - 895, - 896, + 891, + 892, 7, 14, 0, 0, - 896, + 892, 248, 1, 0, 0, 0, - 897, - 899, + 893, + 895, 3, 253, 126, 0, - 898, - 897, + 894, + 893, 1, 0, 0, 0, - 898, - 899, + 894, + 895, 1, 0, 0, 0, - 899, - 900, + 895, + 896, 1, 0, 0, 0, - 900, - 905, + 896, + 901, 3, 255, 127, 0, - 901, - 902, + 897, + 898, 3, 253, 126, 0, - 902, - 903, + 898, + 899, 5, 46, 0, 0, - 903, - 905, + 899, + 901, 1, 0, 0, 0, - 904, - 898, + 900, + 894, 1, 0, 0, 0, - 904, - 901, + 900, + 897, 1, 0, 0, 0, - 905, + 901, 250, 1, 0, 0, 0, - 906, - 909, + 902, + 905, 3, 253, 126, 0, - 907, - 909, + 903, + 905, 3, 249, 124, 0, - 908, - 906, + 904, + 902, 1, 0, 0, 0, - 908, - 907, + 904, + 903, 1, 0, 0, 0, - 909, - 910, + 905, + 906, 1, 0, 0, 0, - 910, - 911, + 906, + 907, 3, 257, 128, 0, - 911, + 907, 252, 1, 0, 0, 0, - 912, - 914, + 908, + 910, 3, 241, 120, 0, - 913, - 912, + 909, + 908, 1, 0, 0, 0, - 914, - 915, + 910, + 911, 1, 0, 0, 0, - 915, - 913, + 911, + 909, 1, 0, 0, 0, - 915, - 916, + 911, + 912, 1, 0, 0, 0, - 916, + 912, 254, 1, 0, 0, 0, - 917, - 919, + 913, + 915, 5, 46, 0, 0, - 918, - 920, + 914, + 916, 3, 241, 120, 0, - 919, - 918, + 915, + 914, 1, 0, 0, 0, - 920, - 921, + 916, + 917, 1, 0, 0, 0, - 921, - 919, + 917, + 915, 1, 0, 0, 0, - 921, - 922, + 917, + 918, 1, 0, 0, 0, - 922, + 918, 256, 1, 0, 0, 0, - 923, - 925, + 919, + 921, 7, 15, 0, 0, - 924, - 926, + 920, + 922, 7, 16, 0, 0, - 925, - 924, + 921, + 920, 1, 0, 0, 0, - 925, - 926, + 921, + 922, 1, 0, 0, 0, - 926, - 928, + 922, + 924, 1, 0, 0, 0, - 927, - 929, + 923, + 925, 3, 241, 120, 0, - 928, - 927, + 924, + 923, 1, 0, 0, 0, - 929, - 930, + 925, + 926, 1, 0, 0, 0, - 930, - 928, + 926, + 924, 1, 0, 0, 0, - 930, - 931, + 926, + 927, 1, 0, 0, 0, - 931, + 927, 258, 1, 0, 0, 0, - 932, - 937, + 928, + 933, 5, 39, 0, 0, - 933, - 936, + 929, + 932, 3, 265, 132, 0, - 934, - 936, + 930, + 932, 3, 271, 135, 0, - 935, - 933, + 931, + 929, 1, 0, 0, 0, - 935, - 934, + 931, + 930, 1, 0, 0, 0, - 936, - 939, + 932, + 935, 1, 0, 0, 0, - 937, - 935, + 933, + 931, 1, 0, 0, 0, - 937, - 938, + 933, + 934, 1, 0, 0, 0, - 938, - 940, + 934, + 936, 1, 0, 0, 0, - 939, - 937, + 935, + 933, 1, 0, 0, 0, - 940, - 951, + 936, + 947, 5, 39, 0, 0, - 941, - 946, + 937, + 942, 5, 34, 0, 0, - 942, - 945, + 938, + 941, 3, 267, 133, 0, - 943, - 945, + 939, + 941, 3, 271, 135, 0, - 944, - 942, + 940, + 938, 1, 0, 0, 0, - 944, - 943, + 940, + 939, 1, 0, 0, 0, - 945, - 948, + 941, + 944, 1, 0, 0, 0, - 946, - 944, + 942, + 940, 1, 0, 0, 0, - 946, - 947, + 942, + 943, 1, 0, 0, 0, - 947, - 949, + 943, + 945, 1, 0, 0, 0, - 948, - 946, + 944, + 942, 1, 0, 0, 0, - 949, - 951, + 945, + 947, 5, 34, 0, 0, - 950, - 932, + 946, + 928, 1, 0, 0, 0, - 950, - 941, + 946, + 937, 1, 0, 0, 0, - 951, + 947, 260, 1, 0, 0, 0, - 952, - 953, + 948, + 949, 5, 39, 0, 0, - 953, - 954, + 949, + 950, 5, 39, 0, 0, - 954, - 955, + 950, + 951, 5, 39, 0, 0, + 951, 955, - 959, 1, 0, 0, 0, - 956, - 958, + 952, + 954, 3, 263, 131, 0, - 957, - 956, + 953, + 952, 1, 0, 0, 0, - 958, - 961, + 954, + 957, 1, 0, 0, 0, - 959, - 960, + 955, + 956, 1, 0, 0, 0, - 959, - 957, + 955, + 953, 1, 0, 0, 0, - 960, - 962, + 956, + 958, 1, 0, 0, 0, - 961, - 959, + 957, + 955, 1, 0, 0, 0, - 962, - 963, + 958, + 959, 5, 39, 0, 0, - 963, - 964, + 959, + 960, 5, 39, 0, 0, - 964, - 979, + 960, + 975, 5, 39, 0, 0, - 965, - 966, + 961, + 962, 5, 34, 0, 0, - 966, - 967, + 962, + 963, 5, 34, 0, 0, - 967, - 968, + 963, + 964, 5, 34, 0, 0, + 964, 968, - 972, 1, 0, 0, 0, - 969, - 971, + 965, + 967, 3, 263, 131, 0, - 970, - 969, + 966, + 965, 1, 0, 0, 0, - 971, - 974, + 967, + 970, 1, 0, 0, 0, - 972, - 973, + 968, + 969, 1, 0, 0, 0, - 972, - 970, + 968, + 966, 1, 0, 0, 0, - 973, - 975, + 969, + 971, 1, 0, 0, 0, - 974, - 972, + 970, + 968, 1, 0, 0, 0, - 975, - 976, + 971, + 972, 5, 34, 0, 0, - 976, - 977, + 972, + 973, 5, 34, 0, 0, - 977, - 979, + 973, + 975, 5, 34, 0, 0, - 978, - 952, + 974, + 948, 1, 0, 0, 0, - 978, - 965, + 974, + 961, 1, 0, 0, 0, - 979, + 975, 262, 1, 0, 0, 0, - 980, - 983, + 976, + 979, 3, 269, 134, 0, - 981, - 983, + 977, + 979, 3, 271, 135, 0, - 982, - 980, + 978, + 976, 1, 0, 0, 0, - 982, - 981, + 978, + 977, 1, 0, 0, 0, - 983, + 979, 264, 1, 0, 0, 0, - 984, - 986, + 980, + 982, 7, 17, 0, 0, - 985, - 984, + 981, + 980, 1, 0, 0, 0, - 986, + 982, 266, 1, 0, 0, 0, - 987, - 989, + 983, + 985, 7, 18, 0, 0, - 988, - 987, + 984, + 983, 1, 0, 0, 0, - 989, + 985, 268, 1, 0, 0, 0, - 990, - 992, + 986, + 988, 7, 19, 0, 0, - 991, - 990, + 987, + 986, 1, 0, 0, 0, - 992, + 988, 270, 1, 0, 0, 0, - 993, - 994, + 989, + 990, 5, 92, 0, 0, - 994, - 995, + 990, + 991, 7, 20, 0, 0, - 995, + 991, 272, 1, 0, 0, 0, - 996, - 998, + 992, + 994, 7, 21, 0, 0, - 997, - 996, + 993, + 992, 1, 0, 0, 0, - 998, - 999, + 994, + 995, 1, 0, 0, 0, - 999, - 997, + 995, + 993, 1, 0, 0, 0, - 999, - 1000, + 995, + 996, 1, 0, 0, 0, - 1000, + 996, 274, 1, 0, 0, 0, + 997, 1001, - 1005, 5, 35, 0, 0, - 1002, - 1004, + 998, + 1000, 8, 22, 0, 0, - 1003, - 1002, + 999, + 998, 1, 0, 0, 0, - 1004, - 1007, + 1000, + 1003, 1, 0, 0, 0, - 1005, - 1003, + 1001, + 999, 1, 0, 0, 0, - 1005, - 1006, + 1001, + 1002, 1, 0, 0, 0, - 1006, + 1002, 276, 1, 0, 0, 0, - 1007, - 1005, + 1003, + 1001, 1, 0, 0, 0, - 1008, - 1010, + 1004, + 1006, 5, 92, 0, 0, - 1009, - 1011, + 1005, + 1007, 3, 273, 136, 0, - 1010, - 1009, + 1006, + 1005, 1, 0, 0, 0, - 1010, - 1011, + 1006, + 1007, 1, 0, 0, 0, - 1011, - 1017, + 1007, + 1013, 1, 0, 0, 0, - 1012, - 1014, + 1008, + 1010, 5, 13, 0, 0, - 1013, - 1012, + 1009, + 1008, 1, 0, 0, 0, - 1013, - 1014, + 1009, + 1010, 1, 0, 0, 0, - 1014, - 1015, + 1010, + 1011, 1, 0, 0, 0, - 1015, - 1018, + 1011, + 1014, 5, 10, 0, 0, - 1016, - 1018, + 1012, + 1014, 2, 12, 13, 0, - 1017, 1013, + 1009, 1, 0, 0, 0, - 1017, - 1016, + 1013, + 1012, 1, 0, 0, 0, - 1018, + 1014, 278, 1, 0, 0, 0, - 1019, - 1020, + 1015, + 1016, 7, 23, 0, 0, - 1020, + 1016, 280, 1, 0, 0, 0, - 1021, - 1022, + 1017, + 1018, 7, 24, 0, 0, - 1022, + 1018, 282, 1, 0, 0, 0, - 1023, - 1026, + 1019, + 1022, 7, 25, 0, 0, - 1024, - 1026, + 1020, + 1022, 3, 279, 139, 0, - 1025, - 1023, + 1021, + 1019, 1, 0, 0, 0, - 1025, - 1024, + 1021, + 1020, 1, 0, 0, 0, - 1026, + 1022, 284, 1, 0, 0, 0, + 1023, 1027, - 1031, 3, 283, 141, 0, - 1028, - 1031, + 1024, + 1027, 7, 26, 0, 0, - 1029, - 1031, + 1025, + 1027, 3, 281, 140, 0, - 1030, - 1027, + 1026, + 1023, 1, 0, 0, 0, - 1030, - 1028, + 1026, + 1024, 1, 0, 0, 0, - 1030, - 1029, + 1026, + 1025, 1, 0, 0, 0, - 1031, + 1027, 286, 1, 0, 0, 0, - 58, + 57, 0, 289, 294, 300, - 321, - 591, + 587, + 595, 599, - 603, + 606, 610, - 614, - 620, - 626, - 628, - 635, - 642, + 616, + 622, + 624, + 631, + 638, + 645, 649, 653, - 657, + 803, 807, - 811, - 814, - 821, - 830, - 832, - 839, + 810, + 817, + 826, + 828, + 835, + 837, 841, - 845, - 854, - 867, + 850, + 863, + 869, 873, - 877, - 885, - 898, + 881, + 894, + 900, 904, - 908, - 915, + 911, + 917, 921, - 925, - 930, - 935, - 937, - 944, + 926, + 931, + 933, + 940, + 942, 946, - 950, - 959, - 972, + 955, + 968, + 974, 978, - 982, - 985, - 988, - 991, - 999, - 1005, - 1010, + 981, + 984, + 987, + 995, + 1001, + 1006, + 1009, 1013, - 1017, - 1025, - 1030, + 1021, + 1026, 23, 1, 3, diff --git a/src/fandango/language/search.py b/src/fandango/language/search.py index 797d0830..87d3ed86 100644 --- a/src/fandango/language/search.py +++ b/src/fandango/language/search.py @@ -8,6 +8,7 @@ from fandango.language.symbol import NonTerminal from fandango.language.tree import DerivationTree +from fandango.logger import LOGGER class Container(abc.ABC): @@ -60,6 +61,12 @@ def evaluate(self): """ return self.tree + def __repr__(self): + return "Tree(" + repr(self.tree.value()) + ")" + + def __str__(self): + return str(self.tree) + class Length(Container): """ @@ -87,6 +94,12 @@ def evaluate(self): """ return len(self.trees) + def __repr__(self): + return "Length([" + ", ".join(repr(tree.value()) for tree in self.trees) + "])" + + def __str__(self): + return repr(self) + class NonTerminalSearch(abc.ABC): """ @@ -168,7 +181,7 @@ def find( tree: DerivationTree, scope: Optional[Dict[NonTerminal, List[DerivationTree]]] = None, ) -> List[Container]: - return [ + ret = [ Length( sum( [ @@ -179,13 +192,15 @@ def find( ) ) ] + # LOGGER.debug(f"LengthSearch({self}).find({tree.value()!r}) = {ret}") + return ret def find_direct( self, tree: DerivationTree, scope: Optional[Dict[NonTerminal, List[DerivationTree]]] = None, ) -> List[Container]: - return [ + ret = [ Length( sum( [ @@ -196,6 +211,8 @@ def find_direct( ) ) ] + # LOGGER.debug(f"LengthSearch({self}).find_direct({tree.value()!r}) = {ret}") + return ret def __repr__(self): return f"|{repr(self.value)}|" @@ -225,8 +242,12 @@ def find( scope: Optional[Dict[NonTerminal, List[DerivationTree]]] = None, ) -> List[Container]: if scope and self.symbol in scope: - return [Tree(scope[self.symbol])] - return list(map(Tree, tree.find_all_trees(self.symbol))) + ret = [Tree(scope[self.symbol])] + else: + ret = list(map(Tree, tree.find_all_trees(self.symbol))) + + # LOGGER.debug(f"RuleSearch({self}).find({tree.value()!r}) = {ret}") + return ret def find_direct( self, @@ -234,8 +255,12 @@ def find_direct( scope: Optional[Dict[NonTerminal, List[DerivationTree]]] = None, ) -> List[Container]: if scope and self.symbol in scope: - return [Tree(scope[self.symbol])] - return list(map(Tree, tree.find_direct_trees(self.symbol))) + ret = [Tree(scope[self.symbol])] + else: + ret = list(map(Tree, tree.find_direct_trees(self.symbol))) + + # LOGGER.debug(f"RuleSearch({self}).find_direct({tree.value()!r}) = {ret}") + return ret def __repr__(self): return repr(self.symbol) @@ -272,6 +297,7 @@ def find( for base in bases: for t in base.get_trees(): targets.extend(self.attribute.find_direct(t, scope=scope)) + # LOGGER.debug(f"AttributeSearch({self}).find({tree.value()!r}) = {targets}") return targets def find_direct( @@ -284,6 +310,7 @@ def find_direct( for base in bases: for t in base.get_trees(): targets.extend(self.attribute.find_direct(t, scope=scope)) + # LOGGER.debug(f"AttributeSearch({self}).find_direct({tree.value()!r}) = {targets}") return targets def __repr__(self): @@ -321,6 +348,8 @@ def find( for base in bases: for t in base.get_trees(): targets.extend(self.attribute.find(t, scope=scope)) + + # LOGGER.debug(f"DescendantAttributeSearch({self}).find({tree.value()!r}) = {targets}") return targets def find_direct( @@ -333,6 +362,8 @@ def find_direct( for base in bases: for t in base.get_trees(): targets.extend(self.attribute.find(t, scope=scope)) + + # LOGGER.debug(f"DescendantAttributeSearch({self}).find_direct({tree.value()!r}) = {targets}") return targets def __repr__(self): @@ -365,7 +396,7 @@ def find( scope: Optional[Dict[NonTerminal, List[DerivationTree]]] = None, ) -> List[Container]: bases = self.base.find(tree, scope=scope) - return list( + ret = list( map( Tree, sum( @@ -379,13 +410,16 @@ def find( ) ) + # LOGGER.debug(f"ItemSearch({self}).find({tree.value()!r}) = {ret}") + return ret + def find_direct( self, tree: DerivationTree, scope: Optional[Dict[NonTerminal, List[DerivationTree]]] = None, ) -> List[Container]: bases = self.base.find_direct(tree, scope=scope) - return list( + ret = list( map( Tree, sum( @@ -398,6 +432,8 @@ def find_direct( ), ) ) + # LOGGER.debug(f"ItemSearch({self}).find_direct({tree.value()!r}) = {ret}") + return ret def __repr__(self): slice_reprs = [] @@ -433,7 +469,6 @@ def __str__(self): slice_strs.append(str(slice_)) return f"{str(self.base)}[{', '.join(slice_strs)}]" - def get_access_points(self): return self.base.get_access_points() @@ -484,14 +519,18 @@ def find( tree: DerivationTree, scope: Optional[Dict[NonTerminal, List[DerivationTree]]] = None, ) -> List[Container]: - return self._find(self.base.find(tree, scope=scope)) + ret = self._find(self.base.find(tree, scope=scope)) + # LOGGER.debug(f"SelectiveSearch({self}).find({tree.value()!r}) = {ret}") + return ret def find_direct( self, tree: DerivationTree, scope: Optional[Dict[NonTerminal, List[DerivationTree]]] = None, ) -> List[Container]: - return self._find(self.base.find_direct(tree, scope=scope)) + ret = self._find(self.base.find_direct(tree, scope=scope)) + # LOGGER.debug(f"SelectiveSearch({self}).find_direct({tree.value()!r}) = {ret}") + return ret def __repr__(self): slice_reprs = [] diff --git a/src/fandango/language/stdlib.py b/src/fandango/language/stdlib.py index e9cf01fa..58301edc 100755 --- a/src/fandango/language/stdlib.py +++ b/src/fandango/language/stdlib.py @@ -51,8 +51,12 @@ def make_comment(comment: str) -> str: stdlib += make_header("Printable characters") # printable = make_def("printable", string.printable) -printable = make_rule("printable", - ["r'[0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!\\x22#$%&\\x27()*+,-./:;<=>?@[\\]^_`{|}~ \\t\\n\\r\\x0b\\x0c]'"]) +printable = make_rule( + "printable", + [ + "r'[0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!\\x22#$%&\\x27()*+,-./:;<=>?@[\\]^_`{|}~ \\t\\n\\r\\x0b\\x0c]'" + ], +) # printable += make_def("whitespace", string.whitespace) printable += make_rule("whitespace", [r"r'[ \t\n\r\x0b\x0c]'"]) @@ -76,8 +80,9 @@ def make_comment(comment: str) -> str: printable += make_rule("ascii_uppercase_letter", ["r'[A-Z]'"]) # printable += make_def("punctuation", string.punctuation) -printable += make_rule("punctuation", - ["r'[!\\x22#$%&\\x27()*+,-./:;<=>?@[\\]^_`{|}~]'"]) +printable += make_rule( + "punctuation", ["r'[!\\x22#$%&\\x27()*+,-./:;<=>?@[\\]^_`{|}~]'"] +) # printable += make_def("alphanum", string.ascii_letters + string.digits) printable += make_rule("alphanum", ["r'[a-zA-Z0-9]'"]) @@ -148,15 +153,14 @@ def make_comment(comment: str) -> str: stdlib += make_header("UTF-8 characters, read and processed as bytes") - utf8 = make_rule("utf8_char1", [r"rb'[\x00-\x7f]'"]) utf8 += make_rule("utf8_continuation_byte", [r"rb'[\x80-\xbf]'"]) utf8 += make_rule("utf8_char2", [r"rb'[\xc2-\xdf]' "]) utf8 += make_rule("utf8_char3", [r"rb'[\xe0-\xef]' {2}"]) utf8 += make_rule("utf8_char4", [r"rb'[\xf0-\xf5]' {3}"]) -utf8 += make_rule("utf8_char", - ["", "", - "", ""]) # UTF-8 character +utf8 += make_rule( + "utf8_char", ["", "", "", ""] +) # UTF-8 character stdlib += utf8 diff --git a/src/fandango/language/symbol.py b/src/fandango/language/symbol.py index 9db587f4..98b0c150 100644 --- a/src/fandango/language/symbol.py +++ b/src/fandango/language/symbol.py @@ -85,14 +85,14 @@ def string_prefix(symbol: str) -> str: @staticmethod def clean(symbol: str) -> str | bytes | int: # Not sure whether any of these are necessary, as we eval() anyway - if len(symbol) >= 2: - if symbol[0] == symbol[-1] == "'" or symbol[0] == symbol[-1] == '"': - return eval(symbol) - elif len(symbol) >= 3: - if symbol[0] == "b" and ( - symbol[1] == symbol[-1] == "'" or symbol[1] == symbol[-1] == '"' - ): - return eval(symbol) + # if len(symbol) >= 2: + # if symbol[0] == symbol[-1] == "'" or symbol[0] == symbol[-1] == '"': + # return eval(symbol) + # elif len(symbol) >= 3: + # if symbol[0] == "b" and ( + # symbol[1] == symbol[-1] == "'" or symbol[1] == symbol[-1] == '"' + # ): + # return eval(symbol) return eval(symbol) # also handles bits "0" and "1" @staticmethod @@ -120,8 +120,9 @@ def check(self, word: str | int) -> tuple[bool, int]: assert isinstance(word, bytes) word = word.decode("iso-8859-1") - assert ((isinstance(symbol, str) and isinstance(word, str)) - or (isinstance(symbol, bytes) and isinstance(word, bytes))) + assert (isinstance(symbol, str) and isinstance(word, str)) or ( + isinstance(symbol, bytes) and isinstance(word, bytes) + ) if self.is_regex: match = re.match(symbol, word) @@ -136,7 +137,6 @@ def check(self, word: str | int) -> tuple[bool, int]: # LOGGER.debug(f"No match") return False, 0 - def check_all(self, word: str | int) -> bool: return word == self.symbol @@ -144,7 +144,7 @@ def _repr(self): if self.is_regex: if isinstance(self.symbol, bytes): symbol = repr(self.symbol) - symbol = symbol.replace(r'\\', '\\') + symbol = symbol.replace(r"\\", "\\") return "r" + symbol if "'" not in self.symbol: diff --git a/src/fandango/language/tree.py b/src/fandango/language/tree.py index 12d0ed2e..5008e305 100644 --- a/src/fandango/language/tree.py +++ b/src/fandango/language/tree.py @@ -19,9 +19,9 @@ def __init__( parent: Optional["DerivationTree"] = None, ): self.hash_cache = None - self._parent = parent - self.symbol = symbol - self._children = [] + self._parent: Optional["DerivationTree"] = parent + self.symbol: Symbol = symbol + self._children: list["DerivationTree"] = [] self._size = 1 self.set_children(children or []) @@ -219,12 +219,6 @@ def to_string(self) -> str: """ Convert the derivation tree to a string. """ - # Turn off warning for now; too many false alarms -- AZ - # if self.contains_bits() or self.contains_bytes(): - # LOGGER.warning( - # "Converting a derivation tree with binary elements into a string" - # ) - try: return self.to_bytes(encoding="utf-8").decode("utf-8") except UnicodeDecodeError: @@ -287,7 +281,7 @@ def to_repr(self, indent=0, start_indent=0) -> str: s += ")" return s - def to_grammar(self, include_position=True) -> str: + def to_grammar(self, include_position=True, include_value=True) -> str: """ Output the derivation tree as (specialized) grammar """ @@ -299,10 +293,10 @@ def _to_grammar(node, indent=0, start_indent=0) -> str: Output the derivation tree as (specialized) grammar """ assert isinstance(node.symbol.symbol, str) - nonlocal bit_count, byte_count, include_position + nonlocal bit_count, byte_count, include_position, include_value s = " " * start_indent + f"{node.symbol.symbol} ::=" - have_nonterminal = False + terminal_symbols = 0 position = f" # Position {byte_count:#06x} ({byte_count})" max_bit_count = bit_count - 1 @@ -312,7 +306,7 @@ def _to_grammar(node, indent=0, start_indent=0) -> str: s += f" {child.symbol.symbol}" else: s += " " + repr(child.symbol.symbol) - have_nonterminal = True + terminal_symbols += 1 if isinstance(child.symbol.symbol, int): if bit_count < 0: @@ -326,7 +320,9 @@ def _to_grammar(node, indent=0, start_indent=0) -> str: byte_count += len(child.symbol.symbol) bit_count = -1 - if include_position and have_nonterminal: + have_position = False + if include_position and terminal_symbols > 0: + have_position = True s += position if bit_count >= 0: if max_bit_count != bit_count: @@ -334,6 +330,10 @@ def _to_grammar(node, indent=0, start_indent=0) -> str: else: s += f", bit {bit_count}" + if include_value and len(node._children) >= 2: + s += " # " if not have_position else "; " + s += node.to_value() + for child in node._children: if child.symbol.is_non_terminal: s += "\n" + _to_grammar(child, indent + 1, start_indent=indent + 1) @@ -344,49 +344,41 @@ def _to_grammar(node, indent=0, start_indent=0) -> str: def __repr__(self): return self.to_repr() - def __contains__(self, other: Union["DerivationTree", Any]) -> bool: - if isinstance(other, DerivationTree): - return other in self._children - return other in str(self) - - def __iter__(self): - return iter(self._children) - def to_int(self, *args, **kwargs): try: - return int(self.__str__(), *args, **kwargs) + return int(self.value(), *args, **kwargs) except ValueError: return None def to_float(self): try: - return float(self.__str__()) + return float(self.value()) except ValueError: return None def to_complex(self, *args, **kwargs): try: - return complex(self.__str__(), *args, **kwargs) + return complex(self.value(), *args, **kwargs) except ValueError: return None def is_int(self, *args, **kwargs): try: - int(self.__str__(), *args, **kwargs) + int(self.value(), *args, **kwargs) except ValueError: return False return True def is_float(self): try: - float(self.__str__()) + float(self.value()) except ValueError: return False return True def is_complex(self, *args, **kwargs): try: - complex(self.__str__(), *args, **kwargs) + complex(self.value(), *args, **kwargs) except ValueError: return False return True @@ -394,34 +386,6 @@ def is_complex(self, *args, **kwargs): def is_num(self): return self.is_float() - def __eq__(self, other): - if isinstance(other, DerivationTree): - return self.__tree__() == other.__tree__() - return str(self) == other - - def __le__(self, other): - if isinstance(other, DerivationTree): - return str(self) <= str(other) - return str(self) <= other - - def __lt__(self, other): - if isinstance(other, DerivationTree): - return str(self) < str(other) - return str(self) < other - - def __ge__(self, other): - if isinstance(other, DerivationTree): - return str(self) >= str(other) - return str(self) >= other - - def __gt__(self, other): - if isinstance(other, DerivationTree): - return str(self) > str(other) - return str(self) > other - - def __ne__(self, other): - return not self.__eq__(other) - def replace(self, tree_to_replace, new_subtree): """ Replace the subtree rooted at the given node with the new subtree. @@ -482,14 +446,228 @@ def get_index(self, target): except ValueError: return -1 + ## General purpose converters + def _value(self) -> tuple[int | str | bytes | None, int]: + """ + Convert the derivation tree into a standard Python value. + Returns the value and the number of bits used. + """ + if self.symbol.is_terminal: + if isinstance(self.symbol.symbol, int): + return self.symbol.symbol, 1 + else: + return self.symbol.symbol, 0 + + bits = 0 + aggregate = None + for child in self._children: + value, child_bits = child._value() + + if aggregate is None: + aggregate = value + bits = child_bits + + elif isinstance(aggregate, str): + if isinstance(value, str): + aggregate += value + elif isinstance(value, bytes): + aggregate = aggregate.encode("utf-8") + value + elif isinstance(value, int): + aggregate = aggregate + chr(value) + bits = 0 + else: + raise ValueError(f"Cannot compute {aggregate!r} + {value!r}") + + elif isinstance(aggregate, bytes): + if isinstance(value, str): + aggregate += value.encode("utf-8") + elif isinstance(value, bytes): + aggregate += value + elif isinstance(value, int): + aggregate = aggregate + value.to_bytes() + bits = 0 + else: + raise ValueError(f"Cannot compute {aggregate!r} + {value!r}") + + elif isinstance(aggregate, int): + if isinstance(value, str): + aggregate = aggregate.to_bytes() + value.encode("utf-8") + bits = 0 + elif isinstance(value, bytes): + aggregate = aggregate.to_bytes() + value + bits = 0 + elif isinstance(value, int): + aggregate = (aggregate << child_bits) + value + bits += child_bits + else: + raise ValueError(f"Cannot compute {aggregate!r} + {value!r}") + + # LOGGER.debug(f"value(): {' '.join(repr(child.value()) for child in self._children)} = {aggregate!r} ({bits} bits)") + + return aggregate, bits + + def value(self) -> int | str | bytes | None: + aggregate, bits = self._value() + return aggregate + + def to_value(self) -> str: + value = self.value() + if isinstance(value, int): + return "0b" + format(value, "b") + f" ({value})" + return repr(self.value()) + + ## Comparison operations + def __eq__(self, other): + if isinstance(other, DerivationTree): + return self.__tree__() == other.__tree__() + return self.value() == other + + def __le__(self, other): + if isinstance(other, DerivationTree): + return self.value() <= other.value() + return self.value() <= other + + def __lt__(self, other): + if isinstance(other, DerivationTree): + return self.value() < other.value() + return self.value() < other + + def __ge__(self, other): + if isinstance(other, DerivationTree): + return self.value() >= other.value() + return self.value() >= other + + def __gt__(self, other): + if isinstance(other, DerivationTree): + return self.value() > other.value() + return self.value() > other + + def __ne__(self, other): + return not self.__eq__(other) + + ## Boolean operations + def __bool__(self): + return bool(self.value()) + + ## Arithmetic operators + def __add__(self, other): + return self.value() + other + + def __sub__(self, other): + return self.value() - other + + def __mul__(self, other): + return self.value() * other + + def __matmul__(self, other): + return self.value() @ other + + def __truediv__(self, other): + return self.value() / other + + def __floordiv__(self, other): + return self.value() // other + + def __mod__(self, other): + return self.value() % other + + def __divmod__(self, other): + return divmod(self.value(), other) + + def __pow__(self, other, modulo=None): + return pow(self.value(), other, modulo) + + def __radd__(self, other): + return other + self.value() + + def __rsub__(self, other): + return other - self.value() + + def __rmul__(self, other): + return other * self.value() + + def __rmatmul__(self, other): + return other @ self.value() + + def __rtruediv__(self, other): + return other / self.value() + + def __rfloordiv__(self, other): + return other // self.value() + + def __rmod__(self, other): + return other % self.value() + + def __rdivmod__(self, other): + return divmod(other, self.value()) + + def __rpow__(self, other, modulo=None): + return pow(other, self.value(), modulo) + + ## Bit operators + def __lshift__(self, other): + return self.value() << other + + def __rshift__(self, other): + return self.value() >> other + + def __and__(self, other): + return self.value() & other + + def __xor__(self, other): + return self.value() ^ other + + def __or__(self, other): + return self.value() | other + + def __rlshift__(self, other): + return other << self.value() + + def __rrshift__(self, other): + return other >> self.value() + + def __rand__(self, other): + return other & self.value() + + def __rxor__(self, other): + return other ^ self.value() + + def __ror__(self, other): + return other | self.value() + + # Unary operators + def __neg__(self): + return -self.value() + + def __pos__(self): + return +self.value() + + def __abs__(self): + return abs(self.value()) + + def __invert__(self): + return ~self.value() + + ## Iterators + def __contains__(self, other: Union["DerivationTree", Any]) -> bool: + if isinstance(other, DerivationTree): + return other in self._children + return other in self.value() + + def __iter__(self): + return iter(self._children) + + ## Everything else def __getattr__(self, name): """ - Catch-all: All other attributes and methods apply to the string representation + Catch-all: All other attributes and methods apply to the representation of the respective type (str, bytes, int). """ - if name in str.__dict__: + value = self.value() + tp = type(value) + if name in tp.__dict__: def fn(*args, **kwargs): - return str.__dict__[name](str(self), *args, **kwargs) + return tp.__dict__[name](value, *args, **kwargs) return fn diff --git a/tests/resources/rgb.fan b/tests/resources/rgb.fan index a6513f4c..444491cd 100644 --- a/tests/resources/rgb.fan +++ b/tests/resources/rgb.fan @@ -1,10 +1,10 @@ ::= ::= * ::= - ::= 'r' + ::= b'r' ::= - ::= 'b' - ::= ";" + ::= b'b' + ::= b";" ::= 1 | 0 ::= 1 | 0 diff --git a/tests/resources/twodigits.fan b/tests/resources/twodigits.fan new file mode 100644 index 00000000..c329d654 --- /dev/null +++ b/tests/resources/twodigits.fan @@ -0,0 +1,2 @@ + ::= + ::= "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" \ No newline at end of file diff --git a/tests/test_slices.py b/tests/test_slices.py new file mode 100644 index 00000000..1f3a6e4b --- /dev/null +++ b/tests/test_slices.py @@ -0,0 +1,103 @@ +#!/usr/bin/env pytest + +import os +import shlex +import shutil +import subprocess +import unittest + +from fandango.cli import get_parser + + +class test_slices(unittest.TestCase): + + def run_command(self, command): + proc = subprocess.Popen( + command, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE, + ) + out, err = proc.communicate() + return out.decode(), err.decode(), proc.returncode + + def test_startswith(self): + command = shlex.split( + """fandango fuzz -f tests/resources/twodigits.fan -n 1 -c '.startswith("6")' --format=none --validate --random-seed 426912 --population-size 10""" + ) + out, err, code = self.run_command(command) + self.assertEqual("", err) + self.assertEqual("", out) + self.assertEqual(0, code) + + def test_slice_0(self): + command = shlex.split( + """fandango fuzz -f tests/resources/twodigits.fan -n 1 -c '[0] == "6"' --format=none --validate --random-seed 426912 --population-size 10""" + ) + out, err, code = self.run_command(command) + self.assertEqual("", err) + self.assertEqual("", out) + self.assertEqual(0, code) + + def test_slice_0plus(self): + command = shlex.split( + """fandango fuzz -f tests/resources/twodigits.fan -n 1 -c '[0:][0] == "6"' --format=none --validate --random-seed 426912 --population-size 10""" + ) + out, err, code = self.run_command(command) + self.assertEqual("", err) + self.assertEqual("", out) + self.assertEqual(0, code) + + def test_slice_1plus(self): + command = shlex.split( + """fandango fuzz -f tests/resources/twodigits.fan -n 1 -c '[1:][0] == "6"' --format=none --validate --random-seed 426912 --population-size 10""" + ) + out, err, code = self.run_command(command) + self.assertEqual("", err) + self.assertEqual("", out) + self.assertEqual(0, code) + + def test_slice_str0plus1(self): + command = shlex.split( + """fandango fuzz -f tests/resources/twodigits.fan -n 1 -c 'str()[0:1] == "6"' --format=none --validate --random-seed 426912 --population-size 10""" + ) + out, err, code = self.run_command(command) + self.assertEqual("", err) + self.assertEqual("", out) + self.assertEqual(0, code) + + def test_slice_plus1(self): + command = shlex.split( + """fandango fuzz -f tests/resources/twodigits.fan -n 1 -c '[:1][0] == "6"' --format=none --validate --random-seed 426912 --population-size 10""" + ) + out, err, code = self.run_command(command) + self.assertEqual("", err) + self.assertEqual("", out) + self.assertEqual(0, code) + + def test_slice_plus(self): + command = shlex.split( + """fandango fuzz -f tests/resources/twodigits.fan -n 1 -c '[:][0] == "6"' --format=none --validate --random-seed 426912 --population-size 10""" + ) + out, err, code = self.run_command(command) + self.assertEqual("", err) + self.assertEqual("", out) + self.assertEqual(0, code) + + def test_slice_str0(self): + command = shlex.split( + """fandango fuzz -f tests/resources/twodigits.fan -n 1 -c 'str()[0] == "6"' --format=none --validate --random-seed 426912 --population-size 10""" + ) + out, err, code = self.run_command(command) + self.assertEqual("", err) + self.assertEqual("", out) + self.assertEqual(0, code) + + def test_slice_paren(self): + command = shlex.split( + """fandango fuzz -f tests/resources/twodigits.fan -n 1 -c '()[0] == "6"' --format=none --validate --random-seed 426912 --population-size 10""" + ) + out, err, code = self.run_command(command) + self.assertEqual("", err) + self.assertEqual("", out) + self.assertEqual(0, code) +