From 0f3d0a15f0c2818830a79473b9efa71ad466de9d Mon Sep 17 00:00:00 2001 From: Moritz Gmeiner Date: Sat, 3 Aug 2024 02:44:12 +0200 Subject: [PATCH] added lox test files --- lox.t/assignment/associativity.lox | 9 + lox.t/assignment/global.lox | 8 + lox.t/assignment/grouping.lox | 2 + lox.t/assignment/infix_operator.lox | 3 + lox.t/assignment/local.lox | 10 + lox.t/assignment/prefix_operator.lox | 2 + lox.t/assignment/syntax.lox | 5 + lox.t/assignment/to_this.lox | 7 + lox.t/assignment/undefined.lox | 1 + lox.t/benchmark/binary_trees.lox | 71 + lox.t/benchmark/equality.lox | 34 + lox.t/benchmark/fib.lox | 8 + lox.t/benchmark/instantiation.lox | 43 + lox.t/benchmark/invocation.lox | 73 + lox.t/benchmark/method_call.lox | 69 + lox.t/benchmark/properties.lox | 106 + lox.t/benchmark/string_equality.lox | 219 ++ lox.t/benchmark/trees.lox | 29 + lox.t/benchmark/zoo.lox | 31 + lox.t/benchmark/zoo_batch.lox | 36 + lox.t/block/empty.lox | 7 + lox.t/block/scope.lox | 8 + lox.t/bool/equality.lox | 23 + lox.t/bool/not.lox | 3 + lox.t/call/bool.lox | 1 + lox.t/call/nil.lox | 1 + lox.t/call/num.lox | 1 + lox.t/call/object.lox | 4 + lox.t/call/string.lox | 1 + lox.t/class/empty.lox | 3 + lox.t/class/inherit_self.lox | 1 + lox.t/class/inherited_method.lox | 22 + lox.t/class/local_inherit_other.lox | 8 + lox.t/class/local_inherit_self.lox | 4 + lox.t/class/local_reference_self.lox | 9 + lox.t/class/reference_self.lox | 7 + lox.t/closure/assign_to_closure.lox | 27 + lox.t/closure/assign_to_shadowed_later.lox | 13 + .../closure/close_over_function_parameter.lox | 11 + lox.t/closure/close_over_later_variable.lox | 15 + lox.t/closure/close_over_method_parameter.lox | 13 + lox.t/closure/closed_closure_in_function.lox | 11 + lox.t/closure/nested_closure.lox | 25 + lox.t/closure/open_closure_in_function.lox | 7 + .../reference_closure_multiple_times.lox | 14 + lox.t/closure/reuse_closure_slot.lox | 16 + lox.t/closure/shadow_closure_with_local.lox | 12 + lox.t/closure/unused_closure.lox | 13 + lox.t/closure/unused_later_closure.lox | 28 + lox.t/comments/line_at_eof.lox | 2 + lox.t/comments/only_line_comment.lox | 1 + lox.t/comments/only_line_comment_and_line.lox | 1 + lox.t/comments/unicode.lox | 9 + lox.t/constructor/arguments.lox | 11 + lox.t/constructor/call_init_early_return.lox | 11 + lox.t/constructor/call_init_explicitly.lox | 15 + lox.t/constructor/default.lox | 4 + lox.t/constructor/default_arguments.lox | 3 + lox.t/constructor/early_return.lox | 10 + lox.t/constructor/extra_arguments.lox | 8 + lox.t/constructor/init_not_method.lox | 12 + lox.t/constructor/missing_arguments.lox | 5 + .../constructor/return_in_nested_function.lox | 10 + lox.t/constructor/return_value.lox | 5 + lox.t/dune | 2 + lox.t/empty_file.lox | 0 lox.t/expressions/evaluate.lox | 4 + lox.t/expressions/parse.lox | 3 + lox.t/field/call_function_field.lox | 15 + lox.t/field/call_nonfunction_field.lox | 6 + lox.t/field/get_and_set_method.lox | 25 + lox.t/field/get_on_bool.lox | 1 + lox.t/field/get_on_class.lox | 2 + lox.t/field/get_on_function.lox | 3 + lox.t/field/get_on_nil.lox | 1 + lox.t/field/get_on_num.lox | 1 + lox.t/field/get_on_string.lox | 1 + lox.t/field/many.lox | 170 ++ lox.t/field/method.lox | 9 + lox.t/field/method_binds_this.lox | 19 + lox.t/field/on_instance.lox | 9 + lox.t/field/set_evaluation_order.lox | 2 + lox.t/field/set_on_bool.lox | 1 + lox.t/field/set_on_class.lox | 2 + lox.t/field/set_on_function.lox | 3 + lox.t/field/set_on_nil.lox | 1 + lox.t/field/set_on_num.lox | 1 + lox.t/field/set_on_string.lox | 1 + lox.t/field/undefined.lox | 4 + lox.t/for/class_in_body.lox | 2 + lox.t/for/closure_in_body.lox | 22 + lox.t/for/fun_in_body.lox | 2 + lox.t/for/return_closure.lox | 10 + lox.t/for/return_inside.lox | 9 + lox.t/for/scope.lox | 26 + lox.t/for/statement_condition.lox | 3 + lox.t/for/statement_increment.lox | 2 + lox.t/for/statement_initializer.lox | 3 + lox.t/for/syntax.lox | 50 + lox.t/for/var_in_body.lox | 2 + lox.t/function/body_must_be_block.lox | 3 + lox.t/function/empty_body.lox | 2 + lox.t/function/extra_arguments.lox | 6 + lox.t/function/local_mutual_recursion.lox | 13 + lox.t/function/local_recursion.lox | 8 + lox.t/function/missing_arguments.lox | 3 + .../function/missing_comma_in_parameters.lox | 3 + lox.t/function/mutual_recursion.lox | 12 + lox.t/function/nested_call_with_arguments.lox | 13 + lox.t/function/parameters.lox | 26 + lox.t/function/print.lox | 4 + lox.t/function/recursion.lox | 6 + lox.t/function/too_many_arguments.lox | 261 ++ lox.t/function/too_many_parameters.lox | 257 ++ lox.t/if/class_in_else.lox | 2 + lox.t/if/class_in_then.lox | 2 + lox.t/if/dangling_else.lox | 3 + lox.t/if/else.lox | 6 + lox.t/if/fun_in_else.lox | 2 + lox.t/if/fun_in_then.lox | 2 + lox.t/if/if.lox | 10 + lox.t/if/truth.lox | 8 + lox.t/if/var_in_else.lox | 2 + lox.t/if/var_in_then.lox | 2 + lox.t/inheritance/constructor.lox | 14 + lox.t/inheritance/inherit_from_function.lox | 3 + lox.t/inheritance/inherit_from_nil.lox | 2 + lox.t/inheritance/inherit_from_number.lox | 2 + lox.t/inheritance/inherit_methods.lox | 14 + .../inheritance/parenthesized_superclass.lox | 4 + .../set_fields_from_base_class.lox | 38 + lox.t/limit/loop_too_large.lox | 2351 +++++++++++++++++ lox.t/limit/no_reuse_constants.lox | 36 + lox.t/limit/stack_overflow.lox | 21 + lox.t/limit/too_many_constants.lox | 36 + lox.t/limit/too_many_locals.lox | 53 + lox.t/limit/too_many_upvalues.lox | 105 + lox.t/logical_operator/and.lox | 19 + lox.t/logical_operator/and_truth.lox | 8 + lox.t/logical_operator/or.lox | 19 + lox.t/logical_operator/or_truth.lox | 8 + lox.t/method/arity.lox | 22 + lox.t/method/empty_block.lox | 5 + lox.t/method/extra_arguments.lox | 8 + lox.t/method/missing_arguments.lox | 5 + lox.t/method/not_found.lox | 3 + lox.t/method/print_bound_method.lox | 5 + lox.t/method/refer_to_name.lox | 7 + lox.t/method/too_many_arguments.lox | 260 ++ lox.t/method/too_many_parameters.lox | 259 ++ lox.t/nil/literal.lox | 1 + lox.t/number/decimal_point_at_eof.lox | 2 + lox.t/number/leading_dot.lox | 2 + lox.t/number/literals.lox | 7 + lox.t/number/nan_equality.lox | 8 + lox.t/number/trailing_dot.lox | 2 + lox.t/operator/add.lox | 2 + lox.t/operator/add_bool_nil.lox | 1 + lox.t/operator/add_bool_num.lox | 1 + lox.t/operator/add_bool_string.lox | 1 + lox.t/operator/add_nil_nil.lox | 1 + lox.t/operator/add_num_nil.lox | 1 + lox.t/operator/add_string_nil.lox | 1 + lox.t/operator/comparison.lox | 25 + lox.t/operator/divide.lox | 2 + lox.t/operator/divide_nonnum_num.lox | 1 + lox.t/operator/divide_num_nonnum.lox | 1 + lox.t/operator/equals.lox | 14 + lox.t/operator/equals_class.lox | 13 + lox.t/operator/equals_method.lox | 13 + lox.t/operator/greater_nonnum_num.lox | 1 + lox.t/operator/greater_num_nonnum.lox | 1 + .../operator/greater_or_equal_nonnum_num.lox | 1 + .../operator/greater_or_equal_num_nonnum.lox | 1 + lox.t/operator/less_nonnum_num.lox | 1 + lox.t/operator/less_num_nonnum.lox | 1 + lox.t/operator/less_or_equal_nonnum_num.lox | 1 + lox.t/operator/less_or_equal_num_nonnum.lox | 1 + lox.t/operator/multiply.lox | 2 + lox.t/operator/multiply_nonnum_num.lox | 1 + lox.t/operator/multiply_num_nonnum.lox | 1 + lox.t/operator/negate.lox | 3 + lox.t/operator/negate_nonnum.lox | 1 + lox.t/operator/not.lox | 13 + lox.t/operator/not_class.lox | 3 + lox.t/operator/not_equals.lox | 14 + lox.t/operator/subtract.lox | 2 + lox.t/operator/subtract_nonnum_num.lox | 1 + lox.t/operator/subtract_num_nonnum.lox | 1 + lox.t/precedence.lox | 32 + lox.t/print/missing_argument.lox | 2 + lox.t/regression/394.lox | 5 + lox.t/regression/40.lox | 22 + lox.t/return/after_else.lox | 5 + lox.t/return/after_if.lox | 5 + lox.t/return/after_while.lox | 5 + lox.t/return/at_top_level.lox | 1 + lox.t/return/in_function.lox | 6 + lox.t/return/in_method.lox | 8 + lox.t/return/return_nil_if_no_value.lox | 6 + lox.t/run.t | 1082 ++++++++ lox.t/scanning/identifiers.lox | 12 + lox.t/scanning/keywords.lox | 18 + lox.t/scanning/numbers.lox | 12 + lox.t/scanning/punctuators.lox | 21 + lox.t/scanning/strings.lox | 6 + lox.t/scanning/whitespace.lox | 12 + lox.t/string/error_after_multiline.lox | 7 + lox.t/string/literals.lox | 5 + lox.t/string/multiline.lox | 7 + lox.t/string/unterminated.lox | 2 + lox.t/super/bound_method.lox | 19 + lox.t/super/call_other_method.lox | 16 + lox.t/super/call_same_method.lox | 16 + lox.t/super/closure.lox | 17 + lox.t/super/constructor.lox | 16 + lox.t/super/extra_arguments.lox | 14 + lox.t/super/indirectly_inherited.lox | 18 + lox.t/super/missing_arguments.lox | 13 + lox.t/super/no_superclass_bind.lox | 7 + lox.t/super/no_superclass_call.lox | 7 + lox.t/super/no_superclass_method.lox | 9 + lox.t/super/parenthesized.lox | 10 + lox.t/super/reassign_superclass.lox | 22 + lox.t/super/super_at_top_level.lox | 2 + .../super_in_closure_in_inherited_method.lox | 26 + lox.t/super/super_in_inherited_method.lox | 23 + lox.t/super/super_in_top_level_function.lox | 3 + lox.t/super/super_without_dot.lox | 8 + lox.t/super/super_without_name.lox | 7 + lox.t/super/this_in_superclass_method.lox | 16 + lox.t/this/closure.lox | 13 + lox.t/this/nested_class.lox | 20 + lox.t/this/nested_closure.lox | 19 + lox.t/this/this_at_top_level.lox | 1 + lox.t/this/this_in_method.lox | 6 + lox.t/this/this_in_top_level_function.lox | 3 + lox.t/unexpected_character.lox | 3 + lox.t/variable/collide_with_parameter.lox | 3 + lox.t/variable/duplicate_local.lox | 4 + lox.t/variable/duplicate_parameter.lox | 4 + lox.t/variable/early_bound.lox | 10 + lox.t/variable/in_middle_of_block.lox | 10 + lox.t/variable/in_nested_block.lox | 6 + lox.t/variable/local_from_method.lox | 9 + lox.t/variable/redeclare_global.lox | 3 + lox.t/variable/redefine_global.lox | 3 + .../scope_reuse_in_different_blocks.lox | 9 + lox.t/variable/shadow_and_local.lox | 8 + lox.t/variable/shadow_global.lox | 6 + lox.t/variable/shadow_local.lox | 8 + lox.t/variable/undefined_global.lox | 1 + lox.t/variable/undefined_local.lox | 3 + lox.t/variable/uninitialized.lox | 2 + lox.t/variable/unreached_undefined.lox | 5 + lox.t/variable/use_false_as_var.lox | 2 + lox.t/variable/use_global_in_initializer.lox | 3 + lox.t/variable/use_local_in_initializer.lox | 4 + lox.t/variable/use_nil_as_var.lox | 2 + lox.t/variable/use_this_as_var.lox | 2 + lox.t/while/class_in_body.lox | 2 + lox.t/while/closure_in_body.lox | 19 + lox.t/while/fun_in_body.lox | 2 + lox.t/while/return_closure.lox | 10 + lox.t/while/return_inside.lox | 9 + lox.t/while/syntax.lox | 21 + lox.t/while/var_in_body.lox | 2 + lox/test.lox | 3 - 268 files changed, 7497 insertions(+), 3 deletions(-) create mode 100644 lox.t/assignment/associativity.lox create mode 100644 lox.t/assignment/global.lox create mode 100644 lox.t/assignment/grouping.lox create mode 100644 lox.t/assignment/infix_operator.lox create mode 100644 lox.t/assignment/local.lox create mode 100644 lox.t/assignment/prefix_operator.lox create mode 100644 lox.t/assignment/syntax.lox create mode 100644 lox.t/assignment/to_this.lox create mode 100644 lox.t/assignment/undefined.lox create mode 100644 lox.t/benchmark/binary_trees.lox create mode 100644 lox.t/benchmark/equality.lox create mode 100644 lox.t/benchmark/fib.lox create mode 100644 lox.t/benchmark/instantiation.lox create mode 100644 lox.t/benchmark/invocation.lox create mode 100644 lox.t/benchmark/method_call.lox create mode 100644 lox.t/benchmark/properties.lox create mode 100644 lox.t/benchmark/string_equality.lox create mode 100644 lox.t/benchmark/trees.lox create mode 100644 lox.t/benchmark/zoo.lox create mode 100644 lox.t/benchmark/zoo_batch.lox create mode 100644 lox.t/block/empty.lox create mode 100644 lox.t/block/scope.lox create mode 100644 lox.t/bool/equality.lox create mode 100644 lox.t/bool/not.lox create mode 100644 lox.t/call/bool.lox create mode 100644 lox.t/call/nil.lox create mode 100644 lox.t/call/num.lox create mode 100644 lox.t/call/object.lox create mode 100644 lox.t/call/string.lox create mode 100644 lox.t/class/empty.lox create mode 100644 lox.t/class/inherit_self.lox create mode 100644 lox.t/class/inherited_method.lox create mode 100644 lox.t/class/local_inherit_other.lox create mode 100644 lox.t/class/local_inherit_self.lox create mode 100644 lox.t/class/local_reference_self.lox create mode 100644 lox.t/class/reference_self.lox create mode 100644 lox.t/closure/assign_to_closure.lox create mode 100644 lox.t/closure/assign_to_shadowed_later.lox create mode 100644 lox.t/closure/close_over_function_parameter.lox create mode 100644 lox.t/closure/close_over_later_variable.lox create mode 100644 lox.t/closure/close_over_method_parameter.lox create mode 100644 lox.t/closure/closed_closure_in_function.lox create mode 100644 lox.t/closure/nested_closure.lox create mode 100644 lox.t/closure/open_closure_in_function.lox create mode 100644 lox.t/closure/reference_closure_multiple_times.lox create mode 100644 lox.t/closure/reuse_closure_slot.lox create mode 100644 lox.t/closure/shadow_closure_with_local.lox create mode 100644 lox.t/closure/unused_closure.lox create mode 100644 lox.t/closure/unused_later_closure.lox create mode 100644 lox.t/comments/line_at_eof.lox create mode 100644 lox.t/comments/only_line_comment.lox create mode 100644 lox.t/comments/only_line_comment_and_line.lox create mode 100644 lox.t/comments/unicode.lox create mode 100644 lox.t/constructor/arguments.lox create mode 100644 lox.t/constructor/call_init_early_return.lox create mode 100644 lox.t/constructor/call_init_explicitly.lox create mode 100644 lox.t/constructor/default.lox create mode 100644 lox.t/constructor/default_arguments.lox create mode 100644 lox.t/constructor/early_return.lox create mode 100644 lox.t/constructor/extra_arguments.lox create mode 100644 lox.t/constructor/init_not_method.lox create mode 100644 lox.t/constructor/missing_arguments.lox create mode 100644 lox.t/constructor/return_in_nested_function.lox create mode 100644 lox.t/constructor/return_value.lox create mode 100644 lox.t/dune create mode 100644 lox.t/empty_file.lox create mode 100644 lox.t/expressions/evaluate.lox create mode 100644 lox.t/expressions/parse.lox create mode 100644 lox.t/field/call_function_field.lox create mode 100644 lox.t/field/call_nonfunction_field.lox create mode 100644 lox.t/field/get_and_set_method.lox create mode 100644 lox.t/field/get_on_bool.lox create mode 100644 lox.t/field/get_on_class.lox create mode 100644 lox.t/field/get_on_function.lox create mode 100644 lox.t/field/get_on_nil.lox create mode 100644 lox.t/field/get_on_num.lox create mode 100644 lox.t/field/get_on_string.lox create mode 100644 lox.t/field/many.lox create mode 100644 lox.t/field/method.lox create mode 100644 lox.t/field/method_binds_this.lox create mode 100644 lox.t/field/on_instance.lox create mode 100644 lox.t/field/set_evaluation_order.lox create mode 100644 lox.t/field/set_on_bool.lox create mode 100644 lox.t/field/set_on_class.lox create mode 100644 lox.t/field/set_on_function.lox create mode 100644 lox.t/field/set_on_nil.lox create mode 100644 lox.t/field/set_on_num.lox create mode 100644 lox.t/field/set_on_string.lox create mode 100644 lox.t/field/undefined.lox create mode 100644 lox.t/for/class_in_body.lox create mode 100644 lox.t/for/closure_in_body.lox create mode 100644 lox.t/for/fun_in_body.lox create mode 100644 lox.t/for/return_closure.lox create mode 100644 lox.t/for/return_inside.lox create mode 100644 lox.t/for/scope.lox create mode 100644 lox.t/for/statement_condition.lox create mode 100644 lox.t/for/statement_increment.lox create mode 100644 lox.t/for/statement_initializer.lox create mode 100644 lox.t/for/syntax.lox create mode 100644 lox.t/for/var_in_body.lox create mode 100644 lox.t/function/body_must_be_block.lox create mode 100644 lox.t/function/empty_body.lox create mode 100644 lox.t/function/extra_arguments.lox create mode 100644 lox.t/function/local_mutual_recursion.lox create mode 100644 lox.t/function/local_recursion.lox create mode 100644 lox.t/function/missing_arguments.lox create mode 100644 lox.t/function/missing_comma_in_parameters.lox create mode 100644 lox.t/function/mutual_recursion.lox create mode 100644 lox.t/function/nested_call_with_arguments.lox create mode 100644 lox.t/function/parameters.lox create mode 100644 lox.t/function/print.lox create mode 100644 lox.t/function/recursion.lox create mode 100644 lox.t/function/too_many_arguments.lox create mode 100644 lox.t/function/too_many_parameters.lox create mode 100644 lox.t/if/class_in_else.lox create mode 100644 lox.t/if/class_in_then.lox create mode 100644 lox.t/if/dangling_else.lox create mode 100644 lox.t/if/else.lox create mode 100644 lox.t/if/fun_in_else.lox create mode 100644 lox.t/if/fun_in_then.lox create mode 100644 lox.t/if/if.lox create mode 100644 lox.t/if/truth.lox create mode 100644 lox.t/if/var_in_else.lox create mode 100644 lox.t/if/var_in_then.lox create mode 100644 lox.t/inheritance/constructor.lox create mode 100644 lox.t/inheritance/inherit_from_function.lox create mode 100644 lox.t/inheritance/inherit_from_nil.lox create mode 100644 lox.t/inheritance/inherit_from_number.lox create mode 100644 lox.t/inheritance/inherit_methods.lox create mode 100644 lox.t/inheritance/parenthesized_superclass.lox create mode 100644 lox.t/inheritance/set_fields_from_base_class.lox create mode 100644 lox.t/limit/loop_too_large.lox create mode 100644 lox.t/limit/no_reuse_constants.lox create mode 100644 lox.t/limit/stack_overflow.lox create mode 100644 lox.t/limit/too_many_constants.lox create mode 100644 lox.t/limit/too_many_locals.lox create mode 100644 lox.t/limit/too_many_upvalues.lox create mode 100644 lox.t/logical_operator/and.lox create mode 100644 lox.t/logical_operator/and_truth.lox create mode 100644 lox.t/logical_operator/or.lox create mode 100644 lox.t/logical_operator/or_truth.lox create mode 100644 lox.t/method/arity.lox create mode 100644 lox.t/method/empty_block.lox create mode 100644 lox.t/method/extra_arguments.lox create mode 100644 lox.t/method/missing_arguments.lox create mode 100644 lox.t/method/not_found.lox create mode 100644 lox.t/method/print_bound_method.lox create mode 100644 lox.t/method/refer_to_name.lox create mode 100644 lox.t/method/too_many_arguments.lox create mode 100644 lox.t/method/too_many_parameters.lox create mode 100644 lox.t/nil/literal.lox create mode 100644 lox.t/number/decimal_point_at_eof.lox create mode 100644 lox.t/number/leading_dot.lox create mode 100644 lox.t/number/literals.lox create mode 100644 lox.t/number/nan_equality.lox create mode 100644 lox.t/number/trailing_dot.lox create mode 100644 lox.t/operator/add.lox create mode 100644 lox.t/operator/add_bool_nil.lox create mode 100644 lox.t/operator/add_bool_num.lox create mode 100644 lox.t/operator/add_bool_string.lox create mode 100644 lox.t/operator/add_nil_nil.lox create mode 100644 lox.t/operator/add_num_nil.lox create mode 100644 lox.t/operator/add_string_nil.lox create mode 100644 lox.t/operator/comparison.lox create mode 100644 lox.t/operator/divide.lox create mode 100644 lox.t/operator/divide_nonnum_num.lox create mode 100644 lox.t/operator/divide_num_nonnum.lox create mode 100644 lox.t/operator/equals.lox create mode 100644 lox.t/operator/equals_class.lox create mode 100644 lox.t/operator/equals_method.lox create mode 100644 lox.t/operator/greater_nonnum_num.lox create mode 100644 lox.t/operator/greater_num_nonnum.lox create mode 100644 lox.t/operator/greater_or_equal_nonnum_num.lox create mode 100644 lox.t/operator/greater_or_equal_num_nonnum.lox create mode 100644 lox.t/operator/less_nonnum_num.lox create mode 100644 lox.t/operator/less_num_nonnum.lox create mode 100644 lox.t/operator/less_or_equal_nonnum_num.lox create mode 100644 lox.t/operator/less_or_equal_num_nonnum.lox create mode 100644 lox.t/operator/multiply.lox create mode 100644 lox.t/operator/multiply_nonnum_num.lox create mode 100644 lox.t/operator/multiply_num_nonnum.lox create mode 100644 lox.t/operator/negate.lox create mode 100644 lox.t/operator/negate_nonnum.lox create mode 100644 lox.t/operator/not.lox create mode 100644 lox.t/operator/not_class.lox create mode 100644 lox.t/operator/not_equals.lox create mode 100644 lox.t/operator/subtract.lox create mode 100644 lox.t/operator/subtract_nonnum_num.lox create mode 100644 lox.t/operator/subtract_num_nonnum.lox create mode 100644 lox.t/precedence.lox create mode 100644 lox.t/print/missing_argument.lox create mode 100644 lox.t/regression/394.lox create mode 100644 lox.t/regression/40.lox create mode 100644 lox.t/return/after_else.lox create mode 100644 lox.t/return/after_if.lox create mode 100644 lox.t/return/after_while.lox create mode 100644 lox.t/return/at_top_level.lox create mode 100644 lox.t/return/in_function.lox create mode 100644 lox.t/return/in_method.lox create mode 100644 lox.t/return/return_nil_if_no_value.lox create mode 100644 lox.t/run.t create mode 100644 lox.t/scanning/identifiers.lox create mode 100644 lox.t/scanning/keywords.lox create mode 100644 lox.t/scanning/numbers.lox create mode 100644 lox.t/scanning/punctuators.lox create mode 100644 lox.t/scanning/strings.lox create mode 100644 lox.t/scanning/whitespace.lox create mode 100644 lox.t/string/error_after_multiline.lox create mode 100644 lox.t/string/literals.lox create mode 100644 lox.t/string/multiline.lox create mode 100644 lox.t/string/unterminated.lox create mode 100644 lox.t/super/bound_method.lox create mode 100644 lox.t/super/call_other_method.lox create mode 100644 lox.t/super/call_same_method.lox create mode 100644 lox.t/super/closure.lox create mode 100644 lox.t/super/constructor.lox create mode 100644 lox.t/super/extra_arguments.lox create mode 100644 lox.t/super/indirectly_inherited.lox create mode 100644 lox.t/super/missing_arguments.lox create mode 100644 lox.t/super/no_superclass_bind.lox create mode 100644 lox.t/super/no_superclass_call.lox create mode 100644 lox.t/super/no_superclass_method.lox create mode 100644 lox.t/super/parenthesized.lox create mode 100644 lox.t/super/reassign_superclass.lox create mode 100644 lox.t/super/super_at_top_level.lox create mode 100644 lox.t/super/super_in_closure_in_inherited_method.lox create mode 100644 lox.t/super/super_in_inherited_method.lox create mode 100644 lox.t/super/super_in_top_level_function.lox create mode 100644 lox.t/super/super_without_dot.lox create mode 100644 lox.t/super/super_without_name.lox create mode 100644 lox.t/super/this_in_superclass_method.lox create mode 100644 lox.t/this/closure.lox create mode 100644 lox.t/this/nested_class.lox create mode 100644 lox.t/this/nested_closure.lox create mode 100644 lox.t/this/this_at_top_level.lox create mode 100644 lox.t/this/this_in_method.lox create mode 100644 lox.t/this/this_in_top_level_function.lox create mode 100644 lox.t/unexpected_character.lox create mode 100644 lox.t/variable/collide_with_parameter.lox create mode 100644 lox.t/variable/duplicate_local.lox create mode 100644 lox.t/variable/duplicate_parameter.lox create mode 100644 lox.t/variable/early_bound.lox create mode 100644 lox.t/variable/in_middle_of_block.lox create mode 100644 lox.t/variable/in_nested_block.lox create mode 100644 lox.t/variable/local_from_method.lox create mode 100644 lox.t/variable/redeclare_global.lox create mode 100644 lox.t/variable/redefine_global.lox create mode 100644 lox.t/variable/scope_reuse_in_different_blocks.lox create mode 100644 lox.t/variable/shadow_and_local.lox create mode 100644 lox.t/variable/shadow_global.lox create mode 100644 lox.t/variable/shadow_local.lox create mode 100644 lox.t/variable/undefined_global.lox create mode 100644 lox.t/variable/undefined_local.lox create mode 100644 lox.t/variable/uninitialized.lox create mode 100644 lox.t/variable/unreached_undefined.lox create mode 100644 lox.t/variable/use_false_as_var.lox create mode 100644 lox.t/variable/use_global_in_initializer.lox create mode 100644 lox.t/variable/use_local_in_initializer.lox create mode 100644 lox.t/variable/use_nil_as_var.lox create mode 100644 lox.t/variable/use_this_as_var.lox create mode 100644 lox.t/while/class_in_body.lox create mode 100644 lox.t/while/closure_in_body.lox create mode 100644 lox.t/while/fun_in_body.lox create mode 100644 lox.t/while/return_closure.lox create mode 100644 lox.t/while/return_inside.lox create mode 100644 lox.t/while/syntax.lox create mode 100644 lox.t/while/var_in_body.lox delete mode 100644 lox/test.lox diff --git a/lox.t/assignment/associativity.lox b/lox.t/assignment/associativity.lox new file mode 100644 index 0000000..1b9d93e --- /dev/null +++ b/lox.t/assignment/associativity.lox @@ -0,0 +1,9 @@ +var a = "a"; +var b = "b"; +var c = "c"; + +// Assignment is right-associative. +a = b = c; +print a; // expect: c +print b; // expect: c +print c; // expect: c diff --git a/lox.t/assignment/global.lox b/lox.t/assignment/global.lox new file mode 100644 index 0000000..48fb485 --- /dev/null +++ b/lox.t/assignment/global.lox @@ -0,0 +1,8 @@ +var a = "before"; +print a; // expect: before + +a = "after"; +print a; // expect: after + +print a = "arg"; // expect: arg +print a; // expect: arg diff --git a/lox.t/assignment/grouping.lox b/lox.t/assignment/grouping.lox new file mode 100644 index 0000000..dc6e79f --- /dev/null +++ b/lox.t/assignment/grouping.lox @@ -0,0 +1,2 @@ +var a = "a"; +(a) = "value"; // Error at '=': Invalid assignment target. diff --git a/lox.t/assignment/infix_operator.lox b/lox.t/assignment/infix_operator.lox new file mode 100644 index 0000000..fa55c47 --- /dev/null +++ b/lox.t/assignment/infix_operator.lox @@ -0,0 +1,3 @@ +var a = "a"; +var b = "b"; +a + b = "value"; // Error at '=': Invalid assignment target. diff --git a/lox.t/assignment/local.lox b/lox.t/assignment/local.lox new file mode 100644 index 0000000..2aaaf6d --- /dev/null +++ b/lox.t/assignment/local.lox @@ -0,0 +1,10 @@ +{ + var a = "before"; + print a; // expect: before + + a = "after"; + print a; // expect: after + + print a = "arg"; // expect: arg + print a; // expect: arg +} diff --git a/lox.t/assignment/prefix_operator.lox b/lox.t/assignment/prefix_operator.lox new file mode 100644 index 0000000..fdd143c --- /dev/null +++ b/lox.t/assignment/prefix_operator.lox @@ -0,0 +1,2 @@ +var a = "a"; +!a = "value"; // Error at '=': Invalid assignment target. diff --git a/lox.t/assignment/syntax.lox b/lox.t/assignment/syntax.lox new file mode 100644 index 0000000..d688ac7 --- /dev/null +++ b/lox.t/assignment/syntax.lox @@ -0,0 +1,5 @@ +// Assignment on RHS of variable. +var a = "before"; +var c = a = "var"; +print a; // expect: var +print c; // expect: var diff --git a/lox.t/assignment/to_this.lox b/lox.t/assignment/to_this.lox new file mode 100644 index 0000000..c1e4a6b --- /dev/null +++ b/lox.t/assignment/to_this.lox @@ -0,0 +1,7 @@ +class Foo { + Foo() { + this = "value"; // Error at '=': Invalid assignment target. + } +} + +Foo(); diff --git a/lox.t/assignment/undefined.lox b/lox.t/assignment/undefined.lox new file mode 100644 index 0000000..4991be3 --- /dev/null +++ b/lox.t/assignment/undefined.lox @@ -0,0 +1 @@ +unknown = "what"; // expect runtime error: Undefined variable 'unknown'. diff --git a/lox.t/benchmark/binary_trees.lox b/lox.t/benchmark/binary_trees.lox new file mode 100644 index 0000000..10f161c --- /dev/null +++ b/lox.t/benchmark/binary_trees.lox @@ -0,0 +1,71 @@ +class Tree { + init(item, depth) { + this.item = item; + this.depth = depth; + if (depth > 0) { + var item2 = item + item; + depth = depth - 1; + this.left = Tree(item2 - 1, depth); + this.right = Tree(item2, depth); + } else { + this.left = nil; + this.right = nil; + } + } + + check() { + if (this.left == nil) { + return this.item; + } + + return this.item + this.left.check() - this.right.check(); + } +} + +var minDepth = 4; +var maxDepth = 14; +var stretchDepth = maxDepth + 1; + +var start = clock(); + +print "stretch tree of depth:"; +print stretchDepth; +print "check:"; +print Tree(0, stretchDepth).check(); + +var longLivedTree = Tree(0, maxDepth); + +// iterations = 2 ** maxDepth +var iterations = 1; +var d = 0; +while (d < maxDepth) { + iterations = iterations * 2; + d = d + 1; +} + +var depth = minDepth; +while (depth < stretchDepth) { + var check = 0; + var i = 1; + while (i <= iterations) { + check = check + Tree(i, depth).check() + Tree(-i, depth).check(); + i = i + 1; + } + + print "num trees:"; + print iterations * 2; + print "depth:"; + print depth; + print "check:"; + print check; + + iterations = iterations / 4; + depth = depth + 2; +} + +print "long lived tree of depth:"; +print maxDepth; +print "check:"; +print longLivedTree.check(); +print "elapsed:"; +print clock() - start; diff --git a/lox.t/benchmark/equality.lox b/lox.t/benchmark/equality.lox new file mode 100644 index 0000000..e40fcc2 --- /dev/null +++ b/lox.t/benchmark/equality.lox @@ -0,0 +1,34 @@ +var i = 0; + +var loopStart = clock(); + +while (i < 10000000) { + i = i + 1; + + 1; 1; 1; 2; 1; nil; 1; "str"; 1; true; + nil; nil; nil; 1; nil; "str"; nil; true; + true; true; true; 1; true; false; true; "str"; true; nil; + "str"; "str"; "str"; "stru"; "str"; 1; "str"; nil; "str"; true; +} + +var loopTime = clock() - loopStart; + +var start = clock(); + +i = 0; +while (i < 10000000) { + i = i + 1; + + 1 == 1; 1 == 2; 1 == nil; 1 == "str"; 1 == true; + nil == nil; nil == 1; nil == "str"; nil == true; + true == true; true == 1; true == false; true == "str"; true == nil; + "str" == "str"; "str" == "stru"; "str" == 1; "str" == nil; "str" == true; +} + +var elapsed = clock() - start; +print "loop"; +print loopTime; +print "elapsed"; +print elapsed; +print "equals"; +print elapsed - loopTime; diff --git a/lox.t/benchmark/fib.lox b/lox.t/benchmark/fib.lox new file mode 100644 index 0000000..94b7f96 --- /dev/null +++ b/lox.t/benchmark/fib.lox @@ -0,0 +1,8 @@ +fun fib(n) { + if (n < 2) return n; + return fib(n - 2) + fib(n - 1); +} + +var start = clock(); +print fib(35) == 9227465; +print clock() - start; diff --git a/lox.t/benchmark/instantiation.lox b/lox.t/benchmark/instantiation.lox new file mode 100644 index 0000000..5a63c1a --- /dev/null +++ b/lox.t/benchmark/instantiation.lox @@ -0,0 +1,43 @@ +// This benchmark stresses instance creation and initializer calling. + +class Foo { + init() {} +} + +var start = clock(); +var i = 0; +while (i < 500000) { + Foo(); + Foo(); + Foo(); + Foo(); + Foo(); + Foo(); + Foo(); + Foo(); + Foo(); + Foo(); + Foo(); + Foo(); + Foo(); + Foo(); + Foo(); + Foo(); + Foo(); + Foo(); + Foo(); + Foo(); + Foo(); + Foo(); + Foo(); + Foo(); + Foo(); + Foo(); + Foo(); + Foo(); + Foo(); + Foo(); + i = i + 1; +} + +print clock() - start; diff --git a/lox.t/benchmark/invocation.lox b/lox.t/benchmark/invocation.lox new file mode 100644 index 0000000..40b3b8a --- /dev/null +++ b/lox.t/benchmark/invocation.lox @@ -0,0 +1,73 @@ +// This benchmark stresses just method invocation. + +class Foo { + method0() {} + method1() {} + method2() {} + method3() {} + method4() {} + method5() {} + method6() {} + method7() {} + method8() {} + method9() {} + method10() {} + method11() {} + method12() {} + method13() {} + method14() {} + method15() {} + method16() {} + method17() {} + method18() {} + method19() {} + method20() {} + method21() {} + method22() {} + method23() {} + method24() {} + method25() {} + method26() {} + method27() {} + method28() {} + method29() {} +} + +var foo = Foo(); +var start = clock(); +var i = 0; +while (i < 500000) { + foo.method0(); + foo.method1(); + foo.method2(); + foo.method3(); + foo.method4(); + foo.method5(); + foo.method6(); + foo.method7(); + foo.method8(); + foo.method9(); + foo.method10(); + foo.method11(); + foo.method12(); + foo.method13(); + foo.method14(); + foo.method15(); + foo.method16(); + foo.method17(); + foo.method18(); + foo.method19(); + foo.method20(); + foo.method21(); + foo.method22(); + foo.method23(); + foo.method24(); + foo.method25(); + foo.method26(); + foo.method27(); + foo.method28(); + foo.method29(); + i = i + 1; +} + +print clock() - start; diff --git a/lox.t/benchmark/method_call.lox b/lox.t/benchmark/method_call.lox new file mode 100644 index 0000000..57cb0a9 --- /dev/null +++ b/lox.t/benchmark/method_call.lox @@ -0,0 +1,69 @@ +class Toggle { + init(startState) { + this.state = startState; + } + + value() { return this.state; } + + activate() { + this.state = !this.state; + return this; + } +} + +class NthToggle < Toggle { + init(startState, maxCounter) { + super.init(startState); + this.countMax = maxCounter; + this.count = 0; + } + + activate() { + this.count = this.count + 1; + if (this.count >= this.countMax) { + super.activate(); + this.count = 0; + } + + return this; + } +} + +var start = clock(); +var n = 100000; +var val = true; +var toggle = Toggle(val); + +for (var i = 0; i < n; i = i + 1) { + val = toggle.activate().value(); + val = toggle.activate().value(); + val = toggle.activate().value(); + val = toggle.activate().value(); + val = toggle.activate().value(); + val = toggle.activate().value(); + val = toggle.activate().value(); + val = toggle.activate().value(); + val = toggle.activate().value(); + val = toggle.activate().value(); +} + +print toggle.value(); + +val = true; +var ntoggle = NthToggle(val, 3); + +for (var i = 0; i < n; i = i + 1) { + val = ntoggle.activate().value(); + val = ntoggle.activate().value(); + val = ntoggle.activate().value(); + val = ntoggle.activate().value(); + val = ntoggle.activate().value(); + val = ntoggle.activate().value(); + val = ntoggle.activate().value(); + val = ntoggle.activate().value(); + val = ntoggle.activate().value(); + val = ntoggle.activate().value(); +} + +print ntoggle.value(); +print clock() - start; diff --git a/lox.t/benchmark/properties.lox b/lox.t/benchmark/properties.lox new file mode 100644 index 0000000..6131d5a --- /dev/null +++ b/lox.t/benchmark/properties.lox @@ -0,0 +1,106 @@ +// This benchmark stresses both field and method lookup. + +class Foo { + init() { + this.field0 = 1; + this.field1 = 1; + this.field2 = 1; + this.field3 = 1; + this.field4 = 1; + this.field5 = 1; + this.field6 = 1; + this.field7 = 1; + this.field8 = 1; + this.field9 = 1; + this.field10 = 1; + this.field11 = 1; + this.field12 = 1; + this.field13 = 1; + this.field14 = 1; + this.field15 = 1; + this.field16 = 1; + this.field17 = 1; + this.field18 = 1; + this.field19 = 1; + this.field20 = 1; + this.field21 = 1; + this.field22 = 1; + this.field23 = 1; + this.field24 = 1; + this.field25 = 1; + this.field26 = 1; + this.field27 = 1; + this.field28 = 1; + this.field29 = 1; + } + + method0() { return this.field0; } + method1() { return this.field1; } + method2() { return this.field2; } + method3() { return this.field3; } + method4() { return this.field4; } + method5() { return this.field5; } + method6() { return this.field6; } + method7() { return this.field7; } + method8() { return this.field8; } + method9() { return this.field9; } + method10() { return this.field10; } + method11() { return this.field11; } + method12() { return this.field12; } + method13() { return this.field13; } + method14() { return this.field14; } + method15() { return this.field15; } + method16() { return this.field16; } + method17() { return this.field17; } + method18() { return this.field18; } + method19() { return this.field19; } + method20() { return this.field20; } + method21() { return this.field21; } + method22() { return this.field22; } + method23() { return this.field23; } + method24() { return this.field24; } + method25() { return this.field25; } + method26() { return this.field26; } + method27() { return this.field27; } + method28() { return this.field28; } + method29() { return this.field29; } +} + +var foo = Foo(); +var start = clock(); +var i = 0; +while (i < 500000) { + foo.method0(); + foo.method1(); + foo.method2(); + foo.method3(); + foo.method4(); + foo.method5(); + foo.method6(); + foo.method7(); + foo.method8(); + foo.method9(); + foo.method10(); + foo.method11(); + foo.method12(); + foo.method13(); + foo.method14(); + foo.method15(); + foo.method16(); + foo.method17(); + foo.method18(); + foo.method19(); + foo.method20(); + foo.method21(); + foo.method22(); + foo.method23(); + foo.method24(); + foo.method25(); + foo.method26(); + foo.method27(); + foo.method28(); + foo.method29(); + i = i + 1; +} + +print clock() - start; diff --git a/lox.t/benchmark/string_equality.lox b/lox.t/benchmark/string_equality.lox new file mode 100644 index 0000000..738f38b --- /dev/null +++ b/lox.t/benchmark/string_equality.lox @@ -0,0 +1,219 @@ +var a1 = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa1"; +var a2 = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa2"; +var a3 = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa3"; +var a4 = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa4"; +var a5 = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa5"; +var a6 = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa6"; +var a7 = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa7"; +var a8 = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa8"; + +var i = 0; + +var loopStart = clock(); + +while (i < 100000) { + i = i + 1; + + a1; a1; a1; a2; a1; a3; a1; a4; a1; a5; a1; a6; a1; a7; a1; a8; + a2; a1; a2; a2; a2; a3; a2; a4; a2; a5; a2; a6; a2; a7; a2; a8; + a3; a1; a3; a2; a3; a3; a3; a4; a3; a5; a3; a6; a3; a7; a3; a8; + a4; a1; a4; a2; a4; a3; a4; a4; a4; a5; a4; a6; a4; a7; a4; a8; + a5; a1; a5; a2; a5; a3; a5; a4; a5; a5; a5; a6; a5; a7; a5; a8; + a6; a1; a6; a2; a6; a3; a6; a4; a6; a5; a6; a6; a6; a7; a6; a8; + a7; a1; a7; a2; a7; a3; a7; a4; a7; a5; a7; a6; a7; a7; a7; a8; + a8; a1; a8; a2; a8; a3; a8; a4; a8; a5; a8; a6; a8; a7; a8; a8; + + a1; a1; a1; a2; a1; a3; a1; a4; a1; a5; a1; a6; a1; a7; a1; a8; + a2; a1; a2; a2; a2; a3; a2; a4; a2; a5; a2; a6; a2; a7; a2; a8; + a3; a1; a3; a2; a3; a3; a3; a4; a3; a5; a3; a6; a3; a7; a3; a8; + a4; a1; a4; a2; a4; a3; a4; a4; a4; a5; a4; a6; a4; a7; a4; a8; + a5; a1; a5; a2; a5; a3; a5; a4; a5; a5; a5; a6; a5; a7; a5; a8; + a6; a1; a6; a2; a6; a3; a6; a4; a6; a5; a6; a6; a6; a7; a6; a8; + a7; a1; a7; a2; a7; a3; a7; a4; a7; a5; a7; a6; a7; a7; a7; a8; + a8; a1; a8; a2; a8; a3; a8; a4; a8; a5; a8; a6; a8; a7; a8; a8; + + a1; a1; a1; a2; a1; a3; a1; a4; a1; a5; a1; a6; a1; a7; a1; a8; + a2; a1; a2; a2; a2; a3; a2; a4; a2; a5; a2; a6; a2; a7; a2; a8; + a3; a1; a3; a2; a3; a3; a3; a4; a3; a5; a3; a6; a3; a7; a3; a8; + a4; a1; a4; a2; a4; a3; a4; a4; a4; a5; a4; a6; a4; a7; a4; a8; + a5; a1; a5; a2; a5; a3; a5; a4; a5; a5; a5; a6; a5; a7; a5; a8; + a6; a1; a6; a2; a6; a3; a6; a4; a6; a5; a6; a6; a6; a7; a6; a8; + a7; a1; a7; a2; a7; a3; a7; a4; a7; a5; a7; a6; a7; a7; a7; a8; + a8; a1; a8; a2; a8; a3; a8; a4; a8; a5; a8; a6; a8; a7; a8; a8; + + a1; a1; a1; a2; a1; a3; a1; a4; a1; a5; a1; a6; a1; a7; a1; a8; + a2; a1; a2; a2; a2; a3; a2; a4; a2; a5; a2; a6; a2; a7; a2; a8; + a3; a1; a3; a2; a3; a3; a3; a4; a3; a5; a3; a6; a3; a7; a3; a8; + a4; a1; a4; a2; a4; a3; a4; a4; a4; a5; a4; a6; a4; a7; a4; a8; + a5; a1; a5; a2; a5; a3; a5; a4; a5; a5; a5; a6; a5; a7; a5; a8; + a6; a1; a6; a2; a6; a3; a6; a4; a6; a5; a6; a6; a6; a7; a6; a8; + a7; a1; a7; a2; a7; a3; a7; a4; a7; a5; a7; a6; a7; a7; a7; a8; + a8; a1; a8; a2; a8; a3; a8; a4; a8; a5; a8; a6; a8; a7; a8; a8; + + a1; a1; a1; a2; a1; a3; a1; a4; a1; a5; a1; a6; a1; a7; a1; a8; + a2; a1; a2; a2; a2; a3; a2; a4; a2; a5; a2; a6; a2; a7; a2; a8; + a3; a1; a3; a2; a3; a3; a3; a4; a3; a5; a3; a6; a3; a7; a3; a8; + a4; a1; a4; a2; a4; a3; a4; a4; a4; a5; a4; a6; a4; a7; a4; a8; + a5; a1; a5; a2; a5; a3; a5; a4; a5; a5; a5; a6; a5; a7; a5; a8; + a6; a1; a6; a2; a6; a3; a6; a4; a6; a5; a6; a6; a6; a7; a6; a8; + a7; a1; a7; a2; a7; a3; a7; a4; a7; a5; a7; a6; a7; a7; a7; a8; + a8; a1; a8; a2; a8; a3; a8; a4; a8; a5; a8; a6; a8; a7; a8; a8; + + a1; a1; a1; a2; a1; a3; a1; a4; a1; a5; a1; a6; a1; a7; a1; a8; + a2; a1; a2; a2; a2; a3; a2; a4; a2; a5; a2; a6; a2; a7; a2; a8; + a3; a1; a3; a2; a3; a3; a3; a4; a3; a5; a3; a6; a3; a7; a3; a8; + a4; a1; a4; a2; a4; a3; a4; a4; a4; a5; a4; a6; a4; a7; a4; a8; + a5; a1; a5; a2; a5; a3; a5; a4; a5; a5; a5; a6; a5; a7; a5; a8; + a6; a1; a6; a2; a6; a3; a6; a4; a6; a5; a6; a6; a6; a7; a6; a8; + a7; a1; a7; a2; a7; a3; a7; a4; a7; a5; a7; a6; a7; a7; a7; a8; + a8; a1; a8; a2; a8; a3; a8; a4; a8; a5; a8; a6; a8; a7; a8; a8; + + a1; a1; a1; a2; a1; a3; a1; a4; a1; a5; a1; a6; a1; a7; a1; a8; + a2; a1; a2; a2; a2; a3; a2; a4; a2; a5; a2; a6; a2; a7; a2; a8; + a3; a1; a3; a2; a3; a3; a3; a4; a3; a5; a3; a6; a3; a7; a3; a8; + a4; a1; a4; a2; a4; a3; a4; a4; a4; a5; a4; a6; a4; a7; a4; a8; + a5; a1; a5; a2; a5; a3; a5; a4; a5; a5; a5; a6; a5; a7; a5; a8; + a6; a1; a6; a2; a6; a3; a6; a4; a6; a5; a6; a6; a6; a7; a6; a8; + a7; a1; a7; a2; a7; a3; a7; a4; a7; a5; a7; a6; a7; a7; a7; a8; + a8; a1; a8; a2; a8; a3; a8; a4; a8; a5; a8; a6; a8; a7; a8; a8; + + a1; a1; a1; a2; a1; a3; a1; a4; a1; a5; a1; a6; a1; a7; a1; a8; + a2; a1; a2; a2; a2; a3; a2; a4; a2; a5; a2; a6; a2; a7; a2; a8; + a3; a1; a3; a2; a3; a3; a3; a4; a3; a5; a3; a6; a3; a7; a3; a8; + a4; a1; a4; a2; a4; a3; a4; a4; a4; a5; a4; a6; a4; a7; a4; a8; + a5; a1; a5; a2; a5; a3; a5; a4; a5; a5; a5; a6; a5; a7; a5; a8; + a6; a1; a6; a2; a6; a3; a6; a4; a6; a5; a6; a6; a6; a7; a6; a8; + a7; a1; a7; a2; a7; a3; a7; a4; a7; a5; a7; a6; a7; a7; a7; a8; + a8; a1; a8; a2; a8; a3; a8; a4; a8; a5; a8; a6; a8; a7; a8; a8; + + a1; a1; a1; a2; a1; a3; a1; a4; a1; a5; a1; a6; a1; a7; a1; a8; + a2; a1; a2; a2; a2; a3; a2; a4; a2; a5; a2; a6; a2; a7; a2; a8; + a3; a1; a3; a2; a3; a3; a3; a4; a3; a5; a3; a6; a3; a7; a3; a8; + a4; a1; a4; a2; a4; a3; a4; a4; a4; a5; a4; a6; a4; a7; a4; a8; + a5; a1; a5; a2; a5; a3; a5; a4; a5; a5; a5; a6; a5; a7; a5; a8; + a6; a1; a6; a2; a6; a3; a6; a4; a6; a5; a6; a6; a6; a7; a6; a8; + a7; a1; a7; a2; a7; a3; a7; a4; a7; a5; a7; a6; a7; a7; a7; a8; + a8; a1; a8; a2; a8; a3; a8; a4; a8; a5; a8; a6; a8; a7; a8; a8; + + a1; a1; a1; a2; a1; a3; a1; a4; a1; a5; a1; a6; a1; a7; a1; a8; + a2; a1; a2; a2; a2; a3; a2; a4; a2; a5; a2; a6; a2; a7; a2; a8; + a3; a1; a3; a2; a3; a3; a3; a4; a3; a5; a3; a6; a3; a7; a3; a8; + a4; a1; a4; a2; a4; a3; a4; a4; a4; a5; a4; a6; a4; a7; a4; a8; + a5; a1; a5; a2; a5; a3; a5; a4; a5; a5; a5; a6; a5; a7; a5; a8; + a6; a1; a6; a2; a6; a3; a6; a4; a6; a5; a6; a6; a6; a7; a6; a8; + a7; a1; a7; a2; a7; a3; a7; a4; a7; a5; a7; a6; a7; a7; a7; a8; + a8; a1; a8; a2; a8; a3; a8; a4; a8; a5; a8; a6; a8; a7; a8; a8; +} + +var loopTime = clock() - loopStart; + +var start = clock(); + +i = 0; +while (i < 100000) { + i = i + 1; + + // 1 == 1; 1 == 2; 1 == nil; 1 == "str"; 1 == true; + // nil == nil; nil == 1; nil == "str"; nil == true; + // true == true; true == 1; true == false; true == "str"; true == nil; + // "str" == "str"; "str" == "stru"; "str" == 1; "str" == nil; "str" == true; + + a1 == a1; a1 == a2; a1 == a3; a1 == a4; a1 == a5; a1 == a6; a1 == a7; a1 == a8; + a2 == a1; a2 == a2; a2 == a3; a2 == a4; a2 == a5; a2 == a6; a2 == a7; a2 == a8; + a3 == a1; a3 == a2; a3 == a3; a3 == a4; a3 == a5; a3 == a6; a3 == a7; a3 == a8; + a4 == a1; a4 == a2; a4 == a3; a4 == a4; a4 == a5; a4 == a6; a4 == a7; a4 == a8; + a5 == a1; a5 == a2; a5 == a3; a5 == a4; a5 == a5; a5 == a6; a5 == a7; a5 == a8; + a6 == a1; a6 == a2; a6 == a3; a6 == a4; a6 == a5; a6 == a6; a6 == a7; a6 == a8; + a7 == a1; a7 == a2; a7 == a3; a7 == a4; a7 == a5; a7 == a6; a7 == a7; a7 == a8; + a8 == a1; a8 == a2; a8 == a3; a8 == a4; a8 == a5; a8 == a6; a8 == a7; a8 == a8; + + a1 == a1; a1 == a2; a1 == a3; a1 == a4; a1 == a5; a1 == a6; a1 == a7; a1 == a8; + a2 == a1; a2 == a2; a2 == a3; a2 == a4; a2 == a5; a2 == a6; a2 == a7; a2 == a8; + a3 == a1; a3 == a2; a3 == a3; a3 == a4; a3 == a5; a3 == a6; a3 == a7; a3 == a8; + a4 == a1; a4 == a2; a4 == a3; a4 == a4; a4 == a5; a4 == a6; a4 == a7; a4 == a8; + a5 == a1; a5 == a2; a5 == a3; a5 == a4; a5 == a5; a5 == a6; a5 == a7; a5 == a8; + a6 == a1; a6 == a2; a6 == a3; a6 == a4; a6 == a5; a6 == a6; a6 == a7; a6 == a8; + a7 == a1; a7 == a2; a7 == a3; a7 == a4; a7 == a5; a7 == a6; a7 == a7; a7 == a8; + a8 == a1; a8 == a2; a8 == a3; a8 == a4; a8 == a5; a8 == a6; a8 == a7; a8 == a8; + + a1 == a1; a1 == a2; a1 == a3; a1 == a4; a1 == a5; a1 == a6; a1 == a7; a1 == a8; + a2 == a1; a2 == a2; a2 == a3; a2 == a4; a2 == a5; a2 == a6; a2 == a7; a2 == a8; + a3 == a1; a3 == a2; a3 == a3; a3 == a4; a3 == a5; a3 == a6; a3 == a7; a3 == a8; + a4 == a1; a4 == a2; a4 == a3; a4 == a4; a4 == a5; a4 == a6; a4 == a7; a4 == a8; + a5 == a1; a5 == a2; a5 == a3; a5 == a4; a5 == a5; a5 == a6; a5 == a7; a5 == a8; + a6 == a1; a6 == a2; a6 == a3; a6 == a4; a6 == a5; a6 == a6; a6 == a7; a6 == a8; + a7 == a1; a7 == a2; a7 == a3; a7 == a4; a7 == a5; a7 == a6; a7 == a7; a7 == a8; + a8 == a1; a8 == a2; a8 == a3; a8 == a4; a8 == a5; a8 == a6; a8 == a7; a8 == a8; + + a1 == a1; a1 == a2; a1 == a3; a1 == a4; a1 == a5; a1 == a6; a1 == a7; a1 == a8; + a2 == a1; a2 == a2; a2 == a3; a2 == a4; a2 == a5; a2 == a6; a2 == a7; a2 == a8; + a3 == a1; a3 == a2; a3 == a3; a3 == a4; a3 == a5; a3 == a6; a3 == a7; a3 == a8; + a4 == a1; a4 == a2; a4 == a3; a4 == a4; a4 == a5; a4 == a6; a4 == a7; a4 == a8; + a5 == a1; a5 == a2; a5 == a3; a5 == a4; a5 == a5; a5 == a6; a5 == a7; a5 == a8; + a6 == a1; a6 == a2; a6 == a3; a6 == a4; a6 == a5; a6 == a6; a6 == a7; a6 == a8; + a7 == a1; a7 == a2; a7 == a3; a7 == a4; a7 == a5; a7 == a6; a7 == a7; a7 == a8; + a8 == a1; a8 == a2; a8 == a3; a8 == a4; a8 == a5; a8 == a6; a8 == a7; a8 == a8; + + a1 == a1; a1 == a2; a1 == a3; a1 == a4; a1 == a5; a1 == a6; a1 == a7; a1 == a8; + a2 == a1; a2 == a2; a2 == a3; a2 == a4; a2 == a5; a2 == a6; a2 == a7; a2 == a8; + a3 == a1; a3 == a2; a3 == a3; a3 == a4; a3 == a5; a3 == a6; a3 == a7; a3 == a8; + a4 == a1; a4 == a2; a4 == a3; a4 == a4; a4 == a5; a4 == a6; a4 == a7; a4 == a8; + a5 == a1; a5 == a2; a5 == a3; a5 == a4; a5 == a5; a5 == a6; a5 == a7; a5 == a8; + a6 == a1; a6 == a2; a6 == a3; a6 == a4; a6 == a5; a6 == a6; a6 == a7; a6 == a8; + a7 == a1; a7 == a2; a7 == a3; a7 == a4; a7 == a5; a7 == a6; a7 == a7; a7 == a8; + a8 == a1; a8 == a2; a8 == a3; a8 == a4; a8 == a5; a8 == a6; a8 == a7; a8 == a8; + + a1 == a1; a1 == a2; a1 == a3; a1 == a4; a1 == a5; a1 == a6; a1 == a7; a1 == a8; + a2 == a1; a2 == a2; a2 == a3; a2 == a4; a2 == a5; a2 == a6; a2 == a7; a2 == a8; + a3 == a1; a3 == a2; a3 == a3; a3 == a4; a3 == a5; a3 == a6; a3 == a7; a3 == a8; + a4 == a1; a4 == a2; a4 == a3; a4 == a4; a4 == a5; a4 == a6; a4 == a7; a4 == a8; + a5 == a1; a5 == a2; a5 == a3; a5 == a4; a5 == a5; a5 == a6; a5 == a7; a5 == a8; + a6 == a1; a6 == a2; a6 == a3; a6 == a4; a6 == a5; a6 == a6; a6 == a7; a6 == a8; + a7 == a1; a7 == a2; a7 == a3; a7 == a4; a7 == a5; a7 == a6; a7 == a7; a7 == a8; + a8 == a1; a8 == a2; a8 == a3; a8 == a4; a8 == a5; a8 == a6; a8 == a7; a8 == a8; + + a1 == a1; a1 == a2; a1 == a3; a1 == a4; a1 == a5; a1 == a6; a1 == a7; a1 == a8; + a2 == a1; a2 == a2; a2 == a3; a2 == a4; a2 == a5; a2 == a6; a2 == a7; a2 == a8; + a3 == a1; a3 == a2; a3 == a3; a3 == a4; a3 == a5; a3 == a6; a3 == a7; a3 == a8; + a4 == a1; a4 == a2; a4 == a3; a4 == a4; a4 == a5; a4 == a6; a4 == a7; a4 == a8; + a5 == a1; a5 == a2; a5 == a3; a5 == a4; a5 == a5; a5 == a6; a5 == a7; a5 == a8; + a6 == a1; a6 == a2; a6 == a3; a6 == a4; a6 == a5; a6 == a6; a6 == a7; a6 == a8; + a7 == a1; a7 == a2; a7 == a3; a7 == a4; a7 == a5; a7 == a6; a7 == a7; a7 == a8; + a8 == a1; a8 == a2; a8 == a3; a8 == a4; a8 == a5; a8 == a6; a8 == a7; a8 == a8; + + a1 == a1; a1 == a2; a1 == a3; a1 == a4; a1 == a5; a1 == a6; a1 == a7; a1 == a8; + a2 == a1; a2 == a2; a2 == a3; a2 == a4; a2 == a5; a2 == a6; a2 == a7; a2 == a8; + a3 == a1; a3 == a2; a3 == a3; a3 == a4; a3 == a5; a3 == a6; a3 == a7; a3 == a8; + a4 == a1; a4 == a2; a4 == a3; a4 == a4; a4 == a5; a4 == a6; a4 == a7; a4 == a8; + a5 == a1; a5 == a2; a5 == a3; a5 == a4; a5 == a5; a5 == a6; a5 == a7; a5 == a8; + a6 == a1; a6 == a2; a6 == a3; a6 == a4; a6 == a5; a6 == a6; a6 == a7; a6 == a8; + a7 == a1; a7 == a2; a7 == a3; a7 == a4; a7 == a5; a7 == a6; a7 == a7; a7 == a8; + a8 == a1; a8 == a2; a8 == a3; a8 == a4; a8 == a5; a8 == a6; a8 == a7; a8 == a8; + + a1 == a1; a1 == a2; a1 == a3; a1 == a4; a1 == a5; a1 == a6; a1 == a7; a1 == a8; + a2 == a1; a2 == a2; a2 == a3; a2 == a4; a2 == a5; a2 == a6; a2 == a7; a2 == a8; + a3 == a1; a3 == a2; a3 == a3; a3 == a4; a3 == a5; a3 == a6; a3 == a7; a3 == a8; + a4 == a1; a4 == a2; a4 == a3; a4 == a4; a4 == a5; a4 == a6; a4 == a7; a4 == a8; + a5 == a1; a5 == a2; a5 == a3; a5 == a4; a5 == a5; a5 == a6; a5 == a7; a5 == a8; + a6 == a1; a6 == a2; a6 == a3; a6 == a4; a6 == a5; a6 == a6; a6 == a7; a6 == a8; + a7 == a1; a7 == a2; a7 == a3; a7 == a4; a7 == a5; a7 == a6; a7 == a7; a7 == a8; + a8 == a1; a8 == a2; a8 == a3; a8 == a4; a8 == a5; a8 == a6; a8 == a7; a8 == a8; + + a1 == a1; a1 == a2; a1 == a3; a1 == a4; a1 == a5; a1 == a6; a1 == a7; a1 == a8; + a2 == a1; a2 == a2; a2 == a3; a2 == a4; a2 == a5; a2 == a6; a2 == a7; a2 == a8; + a3 == a1; a3 == a2; a3 == a3; a3 == a4; a3 == a5; a3 == a6; a3 == a7; a3 == a8; + a4 == a1; a4 == a2; a4 == a3; a4 == a4; a4 == a5; a4 == a6; a4 == a7; a4 == a8; + a5 == a1; a5 == a2; a5 == a3; a5 == a4; a5 == a5; a5 == a6; a5 == a7; a5 == a8; + a6 == a1; a6 == a2; a6 == a3; a6 == a4; a6 == a5; a6 == a6; a6 == a7; a6 == a8; + a7 == a1; a7 == a2; a7 == a3; a7 == a4; a7 == a5; a7 == a6; a7 == a7; a7 == a8; + a8 == a1; a8 == a2; a8 == a3; a8 == a4; a8 == a5; a8 == a6; a8 == a7; a8 == a8; + +} + +var elapsed = clock() - start; +print "loop"; +print loopTime; +print "elapsed"; +print elapsed; +print "equals"; +print elapsed - loopTime; diff --git a/lox.t/benchmark/trees.lox b/lox.t/benchmark/trees.lox new file mode 100644 index 0000000..797f184 --- /dev/null +++ b/lox.t/benchmark/trees.lox @@ -0,0 +1,29 @@ +class Tree { + init(depth) { + this.depth = depth; + if (depth > 0) { + this.a = Tree(depth - 1); + this.b = Tree(depth - 1); + this.c = Tree(depth - 1); + this.d = Tree(depth - 1); + this.e = Tree(depth - 1); + } + } + + walk() { + if (this.depth == 0) return 0; + return this.depth + + this.a.walk() + + this.b.walk() + + this.c.walk() + + this.d.walk() + + this.e.walk(); + } +} + +var tree = Tree(8); +var start = clock(); +for (var i = 0; i < 100; i = i + 1) { + if (tree.walk() != 122068) print "Error"; +} +print clock() - start; diff --git a/lox.t/benchmark/zoo.lox b/lox.t/benchmark/zoo.lox new file mode 100644 index 0000000..a713ed2 --- /dev/null +++ b/lox.t/benchmark/zoo.lox @@ -0,0 +1,31 @@ +class Zoo { + init() { + this.aarvark = 1; + this.baboon = 1; + this.cat = 1; + this.donkey = 1; + this.elephant = 1; + this.fox = 1; + } + ant() { return this.aarvark; } + banana() { return this.baboon; } + tuna() { return this.cat; } + hay() { return this.donkey; } + grass() { return this.elephant; } + mouse() { return this.fox; } +} + +var zoo = Zoo(); +var sum = 0; +var start = clock(); +while (sum < 10000000) { + sum = sum + zoo.ant() + + zoo.banana() + + zoo.tuna() + + zoo.hay() + + zoo.grass() + + zoo.mouse(); +} + +print sum; +print clock() - start; diff --git a/lox.t/benchmark/zoo_batch.lox b/lox.t/benchmark/zoo_batch.lox new file mode 100644 index 0000000..795d0ff --- /dev/null +++ b/lox.t/benchmark/zoo_batch.lox @@ -0,0 +1,36 @@ +class Zoo { + init() { + this.aarvark = 1; + this.baboon = 1; + this.cat = 1; + this.donkey = 1; + this.elephant = 1; + this.fox = 1; + } + ant() { return this.aarvark; } + banana() { return this.baboon; } + tuna() { return this.cat; } + hay() { return this.donkey; } + grass() { return this.elephant; } + mouse() { return this.fox; } +} + +var zoo = Zoo(); +var sum = 0; +var start = clock(); +var batch = 0; +while (clock() - start < 10) { + for (var i = 0; i < 10000; i = i + 1) { + sum = sum + zoo.ant() + + zoo.banana() + + zoo.tuna() + + zoo.hay() + + zoo.grass() + + zoo.mouse(); + } + batch = batch + 1; +} + +print sum; +print batch; +print clock() - start; diff --git a/lox.t/block/empty.lox b/lox.t/block/empty.lox new file mode 100644 index 0000000..982139a --- /dev/null +++ b/lox.t/block/empty.lox @@ -0,0 +1,7 @@ +{} // By itself. + +// In a statement. +if (true) {} +if (false) {} else {} + +print "ok"; // expect: ok diff --git a/lox.t/block/scope.lox b/lox.t/block/scope.lox new file mode 100644 index 0000000..2ece1a7 --- /dev/null +++ b/lox.t/block/scope.lox @@ -0,0 +1,8 @@ +var a = "outer"; + +{ + var a = "inner"; + print a; // expect: inner +} + +print a; // expect: outer diff --git a/lox.t/bool/equality.lox b/lox.t/bool/equality.lox new file mode 100644 index 0000000..2be86e2 --- /dev/null +++ b/lox.t/bool/equality.lox @@ -0,0 +1,23 @@ +print true == true; // expect: true +print true == false; // expect: false +print false == true; // expect: false +print false == false; // expect: true + +// Not equal to other types. +print true == 1; // expect: false +print false == 0; // expect: false +print true == "true"; // expect: false +print false == "false"; // expect: false +print false == ""; // expect: false + +print true != true; // expect: false +print true != false; // expect: true +print false != true; // expect: true +print false != false; // expect: false + +// Not equal to other types. +print true != 1; // expect: true +print false != 0; // expect: true +print true != "true"; // expect: true +print false != "false"; // expect: true +print false != ""; // expect: true diff --git a/lox.t/bool/not.lox b/lox.t/bool/not.lox new file mode 100644 index 0000000..2f55405 --- /dev/null +++ b/lox.t/bool/not.lox @@ -0,0 +1,3 @@ +print !true; // expect: false +print !false; // expect: true +print !!true; // expect: true diff --git a/lox.t/call/bool.lox b/lox.t/call/bool.lox new file mode 100644 index 0000000..859cd86 --- /dev/null +++ b/lox.t/call/bool.lox @@ -0,0 +1 @@ +true(); // expect runtime error: Can only call functions and classes. diff --git a/lox.t/call/nil.lox b/lox.t/call/nil.lox new file mode 100644 index 0000000..7fdf584 --- /dev/null +++ b/lox.t/call/nil.lox @@ -0,0 +1 @@ +nil(); // expect runtime error: Can only call functions and classes. diff --git a/lox.t/call/num.lox b/lox.t/call/num.lox new file mode 100644 index 0000000..1ed1b86 --- /dev/null +++ b/lox.t/call/num.lox @@ -0,0 +1 @@ +123(); // expect runtime error: Can only call functions and classes. diff --git a/lox.t/call/object.lox b/lox.t/call/object.lox new file mode 100644 index 0000000..dce58d9 --- /dev/null +++ b/lox.t/call/object.lox @@ -0,0 +1,4 @@ +class Foo {} + +var foo = Foo(); +foo(); // expect runtime error: Can only call functions and classes. diff --git a/lox.t/call/string.lox b/lox.t/call/string.lox new file mode 100644 index 0000000..91f62a0 --- /dev/null +++ b/lox.t/call/string.lox @@ -0,0 +1 @@ +"str"(); // expect runtime error: Can only call functions and classes. diff --git a/lox.t/class/empty.lox b/lox.t/class/empty.lox new file mode 100644 index 0000000..dc1b7c3 --- /dev/null +++ b/lox.t/class/empty.lox @@ -0,0 +1,3 @@ +class Foo {} + +print Foo; // expect: Foo diff --git a/lox.t/class/inherit_self.lox b/lox.t/class/inherit_self.lox new file mode 100644 index 0000000..8bb1dac --- /dev/null +++ b/lox.t/class/inherit_self.lox @@ -0,0 +1 @@ +class Foo < Foo {} // Error at 'Foo': A class can't inherit from itself. diff --git a/lox.t/class/inherited_method.lox b/lox.t/class/inherited_method.lox new file mode 100644 index 0000000..8b49b53 --- /dev/null +++ b/lox.t/class/inherited_method.lox @@ -0,0 +1,22 @@ +class Foo { + inFoo() { + print "in foo"; + } +} + +class Bar < Foo { + inBar() { + print "in bar"; + } +} + +class Baz < Bar { + inBaz() { + print "in baz"; + } +} + +var baz = Baz(); +baz.inFoo(); // expect: in foo +baz.inBar(); // expect: in bar +baz.inBaz(); // expect: in baz diff --git a/lox.t/class/local_inherit_other.lox b/lox.t/class/local_inherit_other.lox new file mode 100644 index 0000000..210cf98 --- /dev/null +++ b/lox.t/class/local_inherit_other.lox @@ -0,0 +1,8 @@ +class A {} + +fun f() { + class B < A {} + return B; +} + +print f(); // expect: B diff --git a/lox.t/class/local_inherit_self.lox b/lox.t/class/local_inherit_self.lox new file mode 100644 index 0000000..ffd0d4d --- /dev/null +++ b/lox.t/class/local_inherit_self.lox @@ -0,0 +1,4 @@ +{ + class Foo < Foo {} // Error at 'Foo': A class can't inherit from itself. +} +// [c line 5] Error at end: Expect '}' after block. diff --git a/lox.t/class/local_reference_self.lox b/lox.t/class/local_reference_self.lox new file mode 100644 index 0000000..009a3e8 --- /dev/null +++ b/lox.t/class/local_reference_self.lox @@ -0,0 +1,9 @@ +{ + class Foo { + returnSelf() { + return Foo; + } + } + + print Foo().returnSelf(); // expect: Foo +} diff --git a/lox.t/class/reference_self.lox b/lox.t/class/reference_self.lox new file mode 100644 index 0000000..65c1cc7 --- /dev/null +++ b/lox.t/class/reference_self.lox @@ -0,0 +1,7 @@ +class Foo { + returnSelf() { + return Foo; + } +} + +print Foo().returnSelf(); // expect: Foo diff --git a/lox.t/closure/assign_to_closure.lox b/lox.t/closure/assign_to_closure.lox new file mode 100644 index 0000000..7f38b77 --- /dev/null +++ b/lox.t/closure/assign_to_closure.lox @@ -0,0 +1,27 @@ +var f; +var g; + +{ + var local = "local"; + fun f_() { + print local; + local = "after f"; + print local; + } + f = f_; + + fun g_() { + print local; + local = "after g"; + print local; + } + g = g_; +} + +f(); +// expect: local +// expect: after f + +g(); +// expect: after f +// expect: after g diff --git a/lox.t/closure/assign_to_shadowed_later.lox b/lox.t/closure/assign_to_shadowed_later.lox new file mode 100644 index 0000000..5d22685 --- /dev/null +++ b/lox.t/closure/assign_to_shadowed_later.lox @@ -0,0 +1,13 @@ +var a = "global"; + +{ + fun assign() { + a = "assigned"; + } + + var a = "inner"; + assign(); + print a; // expect: inner +} + +print a; // expect: assigned diff --git a/lox.t/closure/close_over_function_parameter.lox b/lox.t/closure/close_over_function_parameter.lox new file mode 100644 index 0000000..7163bc7 --- /dev/null +++ b/lox.t/closure/close_over_function_parameter.lox @@ -0,0 +1,11 @@ +var f; + +fun foo(param) { + fun f_() { + print param; + } + f = f_; +} +foo("param"); + +f(); // expect: param diff --git a/lox.t/closure/close_over_later_variable.lox b/lox.t/closure/close_over_later_variable.lox new file mode 100644 index 0000000..16d92b8 --- /dev/null +++ b/lox.t/closure/close_over_later_variable.lox @@ -0,0 +1,15 @@ +// This is a regression test. There was a bug where if an upvalue for an +// earlier local (here "a") was captured *after* a later one ("b"), then it +// would crash because it walked to the end of the upvalue list (correct), but +// then didn't handle not finding the variable. + +fun f() { + var a = "a"; + var b = "b"; + fun g() { + print b; // expect: b + print a; // expect: a + } + g(); +} +f(); diff --git a/lox.t/closure/close_over_method_parameter.lox b/lox.t/closure/close_over_method_parameter.lox new file mode 100644 index 0000000..07c3798 --- /dev/null +++ b/lox.t/closure/close_over_method_parameter.lox @@ -0,0 +1,13 @@ +var f; + +class Foo { + method(param) { + fun f_() { + print param; + } + f = f_; + } +} + +Foo().method("param"); +f(); // expect: param diff --git a/lox.t/closure/closed_closure_in_function.lox b/lox.t/closure/closed_closure_in_function.lox new file mode 100644 index 0000000..e2e91b5 --- /dev/null +++ b/lox.t/closure/closed_closure_in_function.lox @@ -0,0 +1,11 @@ +var f; + +{ + var local = "local"; + fun f_() { + print local; + } + f = f_; +} + +f(); // expect: local diff --git a/lox.t/closure/nested_closure.lox b/lox.t/closure/nested_closure.lox new file mode 100644 index 0000000..46aabcd --- /dev/null +++ b/lox.t/closure/nested_closure.lox @@ -0,0 +1,25 @@ +var f; + +fun f1() { + var a = "a"; + fun f2() { + var b = "b"; + fun f3() { + var c = "c"; + fun f4() { + print a; + print b; + print c; + } + f = f4; + } + f3(); + } + f2(); +} +f1(); + +f(); +// expect: a +// expect: b +// expect: c diff --git a/lox.t/closure/open_closure_in_function.lox b/lox.t/closure/open_closure_in_function.lox new file mode 100644 index 0000000..ff85f2f --- /dev/null +++ b/lox.t/closure/open_closure_in_function.lox @@ -0,0 +1,7 @@ +{ + var local = "local"; + fun f() { + print local; // expect: local + } + f(); +} diff --git a/lox.t/closure/reference_closure_multiple_times.lox b/lox.t/closure/reference_closure_multiple_times.lox new file mode 100644 index 0000000..bc7c73c --- /dev/null +++ b/lox.t/closure/reference_closure_multiple_times.lox @@ -0,0 +1,14 @@ +var f; + +{ + var a = "a"; + fun f_() { + print a; + print a; + } + f = f_; +} + +f(); +// expect: a +// expect: a diff --git a/lox.t/closure/reuse_closure_slot.lox b/lox.t/closure/reuse_closure_slot.lox new file mode 100644 index 0000000..6086c6e --- /dev/null +++ b/lox.t/closure/reuse_closure_slot.lox @@ -0,0 +1,16 @@ +{ + var f; + + { + var a = "a"; + fun f_() { print a; } + f = f_; + } + + { + // Since a is out of scope, the local slot will be reused by b. Make sure + // that f still closes over a. + var b = "b"; + f(); // expect: a + } +} diff --git a/lox.t/closure/shadow_closure_with_local.lox b/lox.t/closure/shadow_closure_with_local.lox new file mode 100644 index 0000000..7f9164a --- /dev/null +++ b/lox.t/closure/shadow_closure_with_local.lox @@ -0,0 +1,12 @@ +{ + var foo = "closure"; + fun f() { + { + print foo; // expect: closure + var foo = "shadow"; + print foo; // expect: shadow + } + print foo; // expect: closure + } + f(); +} diff --git a/lox.t/closure/unused_closure.lox b/lox.t/closure/unused_closure.lox new file mode 100644 index 0000000..da7eff7 --- /dev/null +++ b/lox.t/closure/unused_closure.lox @@ -0,0 +1,13 @@ +// This is a regression test. There was a bug where the VM would try to close +// an upvalue even if the upvalue was never created because the codepath for +// the closure was not executed. + +{ + var a = "a"; + if (false) { + fun foo() { a; } + } +} + +// If we get here, we didn't segfault when a went out of scope. +print "ok"; // expect: ok diff --git a/lox.t/closure/unused_later_closure.lox b/lox.t/closure/unused_later_closure.lox new file mode 100644 index 0000000..524eb33 --- /dev/null +++ b/lox.t/closure/unused_later_closure.lox @@ -0,0 +1,28 @@ +// This is a regression test. When closing upvalues for discarded locals, it +// wouldn't make sure it discarded the upvalue for the correct stack slot. +// +// Here we create two locals that can be closed over, but only the first one +// actually is. When "b" goes out of scope, we need to make sure we don't +// prematurely close "a". +var closure; + +{ + var a = "a"; + + { + var b = "b"; + fun returnA() { + return a; + } + + closure = returnA; + + if (false) { + fun returnB() { + return b; + } + } + } + + print closure(); // expect: a +} diff --git a/lox.t/comments/line_at_eof.lox b/lox.t/comments/line_at_eof.lox new file mode 100644 index 0000000..924946d --- /dev/null +++ b/lox.t/comments/line_at_eof.lox @@ -0,0 +1,2 @@ +print "ok"; // expect: ok +// comment \ No newline at end of file diff --git a/lox.t/comments/only_line_comment.lox b/lox.t/comments/only_line_comment.lox new file mode 100644 index 0000000..e2c01e9 --- /dev/null +++ b/lox.t/comments/only_line_comment.lox @@ -0,0 +1 @@ +// comment \ No newline at end of file diff --git a/lox.t/comments/only_line_comment_and_line.lox b/lox.t/comments/only_line_comment_and_line.lox new file mode 100644 index 0000000..fef83a9 --- /dev/null +++ b/lox.t/comments/only_line_comment_and_line.lox @@ -0,0 +1 @@ +// comment diff --git a/lox.t/comments/unicode.lox b/lox.t/comments/unicode.lox new file mode 100644 index 0000000..be4f6fc --- /dev/null +++ b/lox.t/comments/unicode.lox @@ -0,0 +1,9 @@ +// Unicode characters are allowed in comments. +// +// Latin 1 Supplement: £§¶ÜÞ +// Latin Extended-A: ĐĦŋœ +// Latin Extended-B: ƂƢƩǁ +// Other stuff: ឃᢆ᯽₪ℜ↩⊗┺░ +// Emoji: ☃☺♣ + +print "ok"; // expect: ok diff --git a/lox.t/constructor/arguments.lox b/lox.t/constructor/arguments.lox new file mode 100644 index 0000000..36881e3 --- /dev/null +++ b/lox.t/constructor/arguments.lox @@ -0,0 +1,11 @@ +class Foo { + init(a, b) { + print "init"; // expect: init + this.a = a; + this.b = b; + } +} + +var foo = Foo(1, 2); +print foo.a; // expect: 1 +print foo.b; // expect: 2 diff --git a/lox.t/constructor/call_init_early_return.lox b/lox.t/constructor/call_init_early_return.lox new file mode 100644 index 0000000..c7c9524 --- /dev/null +++ b/lox.t/constructor/call_init_early_return.lox @@ -0,0 +1,11 @@ +class Foo { + init() { + print "init"; + return; + print "nope"; + } +} + +var foo = Foo(); // expect: init +print foo.init(); // expect: init +// expect: Foo instance diff --git a/lox.t/constructor/call_init_explicitly.lox b/lox.t/constructor/call_init_explicitly.lox new file mode 100644 index 0000000..b2deded --- /dev/null +++ b/lox.t/constructor/call_init_explicitly.lox @@ -0,0 +1,15 @@ +class Foo { + init(arg) { + print "Foo.init(" + arg + ")"; + this.field = "init"; + } +} + +var foo = Foo("one"); // expect: Foo.init(one) +foo.field = "field"; + +var foo2 = foo.init("two"); // expect: Foo.init(two) +print foo2; // expect: Foo instance + +// Make sure init() doesn't create a fresh instance. +print foo.field; // expect: init diff --git a/lox.t/constructor/default.lox b/lox.t/constructor/default.lox new file mode 100644 index 0000000..8b383b9 --- /dev/null +++ b/lox.t/constructor/default.lox @@ -0,0 +1,4 @@ +class Foo {} + +var foo = Foo(); +print foo; // expect: Foo instance diff --git a/lox.t/constructor/default_arguments.lox b/lox.t/constructor/default_arguments.lox new file mode 100644 index 0000000..21d073a --- /dev/null +++ b/lox.t/constructor/default_arguments.lox @@ -0,0 +1,3 @@ +class Foo {} + +var foo = Foo(1, 2, 3); // expect runtime error: Expected 0 arguments but got 3. diff --git a/lox.t/constructor/early_return.lox b/lox.t/constructor/early_return.lox new file mode 100644 index 0000000..4ee17ed --- /dev/null +++ b/lox.t/constructor/early_return.lox @@ -0,0 +1,10 @@ +class Foo { + init() { + print "init"; + return; + print "nope"; + } +} + +var foo = Foo(); // expect: init +print foo; // expect: Foo instance diff --git a/lox.t/constructor/extra_arguments.lox b/lox.t/constructor/extra_arguments.lox new file mode 100644 index 0000000..bee6ebc --- /dev/null +++ b/lox.t/constructor/extra_arguments.lox @@ -0,0 +1,8 @@ +class Foo { + init(a, b) { + this.a = a; + this.b = b; + } +} + +var foo = Foo(1, 2, 3, 4); // expect runtime error: Expected 2 arguments but got 4. \ No newline at end of file diff --git a/lox.t/constructor/init_not_method.lox b/lox.t/constructor/init_not_method.lox new file mode 100644 index 0000000..95730a8 --- /dev/null +++ b/lox.t/constructor/init_not_method.lox @@ -0,0 +1,12 @@ +class Foo { + init(arg) { + print "Foo.init(" + arg + ")"; + this.field = "init"; + } +} + +fun init() { + print "not initializer"; +} + +init(); // expect: not initializer diff --git a/lox.t/constructor/missing_arguments.lox b/lox.t/constructor/missing_arguments.lox new file mode 100644 index 0000000..cf26928 --- /dev/null +++ b/lox.t/constructor/missing_arguments.lox @@ -0,0 +1,5 @@ +class Foo { + init(a, b) {} +} + +var foo = Foo(1); // expect runtime error: Expected 2 arguments but got 1. diff --git a/lox.t/constructor/return_in_nested_function.lox b/lox.t/constructor/return_in_nested_function.lox new file mode 100644 index 0000000..8580f14 --- /dev/null +++ b/lox.t/constructor/return_in_nested_function.lox @@ -0,0 +1,10 @@ +class Foo { + init() { + fun init() { + return "bar"; + } + print init(); // expect: bar + } +} + +print Foo(); // expect: Foo instance diff --git a/lox.t/constructor/return_value.lox b/lox.t/constructor/return_value.lox new file mode 100644 index 0000000..115b450 --- /dev/null +++ b/lox.t/constructor/return_value.lox @@ -0,0 +1,5 @@ +class Foo { + init() { + return "result"; // Error at 'return': Can't return a value from an initializer. + } +} diff --git a/lox.t/dune b/lox.t/dune new file mode 100644 index 0000000..5f38dc6 --- /dev/null +++ b/lox.t/dune @@ -0,0 +1,2 @@ +(cram + (deps %{bin:mlox})) diff --git a/lox.t/empty_file.lox b/lox.t/empty_file.lox new file mode 100644 index 0000000..e69de29 diff --git a/lox.t/expressions/evaluate.lox b/lox.t/expressions/evaluate.lox new file mode 100644 index 0000000..a1d1895 --- /dev/null +++ b/lox.t/expressions/evaluate.lox @@ -0,0 +1,4 @@ +// Note: This is just for the expression evaluating chapter which evaluates an +// expression directly. +(5 - (3 - 1)) + -1 +// expect: 2 diff --git a/lox.t/expressions/parse.lox b/lox.t/expressions/parse.lox new file mode 100644 index 0000000..0a9e61b --- /dev/null +++ b/lox.t/expressions/parse.lox @@ -0,0 +1,3 @@ +// Note: This is just for the expression parsing chapter which prints the AST. +(5 - (3 - 1)) + -1 +// expect: (+ (group (- 5.0 (group (- 3.0 1.0)))) (- 1.0)) diff --git a/lox.t/field/call_function_field.lox b/lox.t/field/call_function_field.lox new file mode 100644 index 0000000..46464aa --- /dev/null +++ b/lox.t/field/call_function_field.lox @@ -0,0 +1,15 @@ +class Foo {} + +fun bar(a, b) { + print "bar"; + print a; + print b; +} + +var foo = Foo(); +foo.bar = bar; + +foo.bar(1, 2); +// expect: bar +// expect: 1 +// expect: 2 diff --git a/lox.t/field/call_nonfunction_field.lox b/lox.t/field/call_nonfunction_field.lox new file mode 100644 index 0000000..cf43899 --- /dev/null +++ b/lox.t/field/call_nonfunction_field.lox @@ -0,0 +1,6 @@ +class Foo {} + +var foo = Foo(); +foo.bar = "not fn"; + +foo.bar(); // expect runtime error: Can only call functions and classes. diff --git a/lox.t/field/get_and_set_method.lox b/lox.t/field/get_and_set_method.lox new file mode 100644 index 0000000..8846583 --- /dev/null +++ b/lox.t/field/get_and_set_method.lox @@ -0,0 +1,25 @@ +// Bound methods have identity equality. +class Foo { + method(a) { + print "method"; + print a; + } + other(a) { + print "other"; + print a; + } +} + +var foo = Foo(); +var method = foo.method; + +// Setting a property shadows the instance method. +foo.method = foo.other; +foo.method(1); +// expect: other +// expect: 1 + +// The old method handle still points to the original method. +method(2); +// expect: method +// expect: 2 diff --git a/lox.t/field/get_on_bool.lox b/lox.t/field/get_on_bool.lox new file mode 100644 index 0000000..d8e1793 --- /dev/null +++ b/lox.t/field/get_on_bool.lox @@ -0,0 +1 @@ +true.foo; // expect runtime error: Only instances have properties. diff --git a/lox.t/field/get_on_class.lox b/lox.t/field/get_on_class.lox new file mode 100644 index 0000000..068b6f9 --- /dev/null +++ b/lox.t/field/get_on_class.lox @@ -0,0 +1,2 @@ +class Foo {} +Foo.bar; // expect runtime error: Only instances have properties. diff --git a/lox.t/field/get_on_function.lox b/lox.t/field/get_on_function.lox new file mode 100644 index 0000000..87c3845 --- /dev/null +++ b/lox.t/field/get_on_function.lox @@ -0,0 +1,3 @@ +fun foo() {} + +foo.bar; // expect runtime error: Only instances have properties. diff --git a/lox.t/field/get_on_nil.lox b/lox.t/field/get_on_nil.lox new file mode 100644 index 0000000..829bb1a --- /dev/null +++ b/lox.t/field/get_on_nil.lox @@ -0,0 +1 @@ +nil.foo; // expect runtime error: Only instances have properties. diff --git a/lox.t/field/get_on_num.lox b/lox.t/field/get_on_num.lox new file mode 100644 index 0000000..287f422 --- /dev/null +++ b/lox.t/field/get_on_num.lox @@ -0,0 +1 @@ +123.foo; // expect runtime error: Only instances have properties. diff --git a/lox.t/field/get_on_string.lox b/lox.t/field/get_on_string.lox new file mode 100644 index 0000000..8a56dad --- /dev/null +++ b/lox.t/field/get_on_string.lox @@ -0,0 +1 @@ +"str".foo; // expect runtime error: Only instances have properties. diff --git a/lox.t/field/many.lox b/lox.t/field/many.lox new file mode 100644 index 0000000..4185904 --- /dev/null +++ b/lox.t/field/many.lox @@ -0,0 +1,170 @@ +class Foo {} + +var foo = Foo(); +fun setFields() { + foo.bilberry = "bilberry"; + foo.lime = "lime"; + foo.elderberry = "elderberry"; + foo.raspberry = "raspberry"; + foo.gooseberry = "gooseberry"; + foo.longan = "longan"; + foo.mandarine = "mandarine"; + foo.kiwifruit = "kiwifruit"; + foo.orange = "orange"; + foo.pomegranate = "pomegranate"; + foo.tomato = "tomato"; + foo.banana = "banana"; + foo.juniper = "juniper"; + foo.damson = "damson"; + foo.blackcurrant = "blackcurrant"; + foo.peach = "peach"; + foo.grape = "grape"; + foo.mango = "mango"; + foo.redcurrant = "redcurrant"; + foo.watermelon = "watermelon"; + foo.plumcot = "plumcot"; + foo.papaya = "papaya"; + foo.cloudberry = "cloudberry"; + foo.rambutan = "rambutan"; + foo.salak = "salak"; + foo.physalis = "physalis"; + foo.huckleberry = "huckleberry"; + foo.coconut = "coconut"; + foo.date = "date"; + foo.tamarind = "tamarind"; + foo.lychee = "lychee"; + foo.raisin = "raisin"; + foo.apple = "apple"; + foo.avocado = "avocado"; + foo.nectarine = "nectarine"; + foo.pomelo = "pomelo"; + foo.melon = "melon"; + foo.currant = "currant"; + foo.plum = "plum"; + foo.persimmon = "persimmon"; + foo.olive = "olive"; + foo.cranberry = "cranberry"; + foo.boysenberry = "boysenberry"; + foo.blackberry = "blackberry"; + foo.passionfruit = "passionfruit"; + foo.mulberry = "mulberry"; + foo.marionberry = "marionberry"; + foo.plantain = "plantain"; + foo.lemon = "lemon"; + foo.yuzu = "yuzu"; + foo.loquat = "loquat"; + foo.kumquat = "kumquat"; + foo.salmonberry = "salmonberry"; + foo.tangerine = "tangerine"; + foo.durian = "durian"; + foo.pear = "pear"; + foo.cantaloupe = "cantaloupe"; + foo.quince = "quince"; + foo.guava = "guava"; + foo.strawberry = "strawberry"; + foo.nance = "nance"; + foo.apricot = "apricot"; + foo.jambul = "jambul"; + foo.grapefruit = "grapefruit"; + foo.clementine = "clementine"; + foo.jujube = "jujube"; + foo.cherry = "cherry"; + foo.feijoa = "feijoa"; + foo.jackfruit = "jackfruit"; + foo.fig = "fig"; + foo.cherimoya = "cherimoya"; + foo.pineapple = "pineapple"; + foo.blueberry = "blueberry"; + foo.jabuticaba = "jabuticaba"; + foo.miracle = "miracle"; + foo.dragonfruit = "dragonfruit"; + foo.satsuma = "satsuma"; + foo.tamarillo = "tamarillo"; + foo.honeydew = "honeydew"; +} + +setFields(); + +fun printFields() { + print foo.apple; // expect: apple + print foo.apricot; // expect: apricot + print foo.avocado; // expect: avocado + print foo.banana; // expect: banana + print foo.bilberry; // expect: bilberry + print foo.blackberry; // expect: blackberry + print foo.blackcurrant; // expect: blackcurrant + print foo.blueberry; // expect: blueberry + print foo.boysenberry; // expect: boysenberry + print foo.cantaloupe; // expect: cantaloupe + print foo.cherimoya; // expect: cherimoya + print foo.cherry; // expect: cherry + print foo.clementine; // expect: clementine + print foo.cloudberry; // expect: cloudberry + print foo.coconut; // expect: coconut + print foo.cranberry; // expect: cranberry + print foo.currant; // expect: currant + print foo.damson; // expect: damson + print foo.date; // expect: date + print foo.dragonfruit; // expect: dragonfruit + print foo.durian; // expect: durian + print foo.elderberry; // expect: elderberry + print foo.feijoa; // expect: feijoa + print foo.fig; // expect: fig + print foo.gooseberry; // expect: gooseberry + print foo.grape; // expect: grape + print foo.grapefruit; // expect: grapefruit + print foo.guava; // expect: guava + print foo.honeydew; // expect: honeydew + print foo.huckleberry; // expect: huckleberry + print foo.jabuticaba; // expect: jabuticaba + print foo.jackfruit; // expect: jackfruit + print foo.jambul; // expect: jambul + print foo.jujube; // expect: jujube + print foo.juniper; // expect: juniper + print foo.kiwifruit; // expect: kiwifruit + print foo.kumquat; // expect: kumquat + print foo.lemon; // expect: lemon + print foo.lime; // expect: lime + print foo.longan; // expect: longan + print foo.loquat; // expect: loquat + print foo.lychee; // expect: lychee + print foo.mandarine; // expect: mandarine + print foo.mango; // expect: mango + print foo.marionberry; // expect: marionberry + print foo.melon; // expect: melon + print foo.miracle; // expect: miracle + print foo.mulberry; // expect: mulberry + print foo.nance; // expect: nance + print foo.nectarine; // expect: nectarine + print foo.olive; // expect: olive + print foo.orange; // expect: orange + print foo.papaya; // expect: papaya + print foo.passionfruit; // expect: passionfruit + print foo.peach; // expect: peach + print foo.pear; // expect: pear + print foo.persimmon; // expect: persimmon + print foo.physalis; // expect: physalis + print foo.pineapple; // expect: pineapple + print foo.plantain; // expect: plantain + print foo.plum; // expect: plum + print foo.plumcot; // expect: plumcot + print foo.pomegranate; // expect: pomegranate + print foo.pomelo; // expect: pomelo + print foo.quince; // expect: quince + print foo.raisin; // expect: raisin + print foo.rambutan; // expect: rambutan + print foo.raspberry; // expect: raspberry + print foo.redcurrant; // expect: redcurrant + print foo.salak; // expect: salak + print foo.salmonberry; // expect: salmonberry + print foo.satsuma; // expect: satsuma + print foo.strawberry; // expect: strawberry + print foo.tamarillo; // expect: tamarillo + print foo.tamarind; // expect: tamarind + print foo.tangerine; // expect: tangerine + print foo.tomato; // expect: tomato + print foo.watermelon; // expect: watermelon + print foo.yuzu; // expect: yuzu +} + +printFields(); diff --git a/lox.t/field/method.lox b/lox.t/field/method.lox new file mode 100644 index 0000000..8410dbd --- /dev/null +++ b/lox.t/field/method.lox @@ -0,0 +1,9 @@ +class Foo { + bar(arg) { + print arg; + } +} + +var bar = Foo().bar; +print "got method"; // expect: got method +bar("arg"); // expect: arg diff --git a/lox.t/field/method_binds_this.lox b/lox.t/field/method_binds_this.lox new file mode 100644 index 0000000..5a5b110 --- /dev/null +++ b/lox.t/field/method_binds_this.lox @@ -0,0 +1,19 @@ +class Foo { + sayName(a) { + print this.name; + print a; + } +} + +var foo1 = Foo(); +foo1.name = "foo1"; + +var foo2 = Foo(); +foo2.name = "foo2"; + +// Store the method reference on another object. +foo2.fn = foo1.sayName; +// Still retains original receiver. +foo2.fn(1); +// expect: foo1 +// expect: 1 diff --git a/lox.t/field/on_instance.lox b/lox.t/field/on_instance.lox new file mode 100644 index 0000000..b3c5511 --- /dev/null +++ b/lox.t/field/on_instance.lox @@ -0,0 +1,9 @@ +class Foo {} + +var foo = Foo(); + +print foo.bar = "bar value"; // expect: bar value +print foo.baz = "baz value"; // expect: baz value + +print foo.bar; // expect: bar value +print foo.baz; // expect: baz value diff --git a/lox.t/field/set_evaluation_order.lox b/lox.t/field/set_evaluation_order.lox new file mode 100644 index 0000000..f9edb00 --- /dev/null +++ b/lox.t/field/set_evaluation_order.lox @@ -0,0 +1,2 @@ +undefined1.bar // expect runtime error: Undefined variable 'undefined1'. + = undefined2; \ No newline at end of file diff --git a/lox.t/field/set_on_bool.lox b/lox.t/field/set_on_bool.lox new file mode 100644 index 0000000..eb9fb3a --- /dev/null +++ b/lox.t/field/set_on_bool.lox @@ -0,0 +1 @@ +true.foo = "value"; // expect runtime error: Only instances have fields. diff --git a/lox.t/field/set_on_class.lox b/lox.t/field/set_on_class.lox new file mode 100644 index 0000000..a7700ec --- /dev/null +++ b/lox.t/field/set_on_class.lox @@ -0,0 +1,2 @@ +class Foo {} +Foo.bar = "value"; // expect runtime error: Only instances have fields. diff --git a/lox.t/field/set_on_function.lox b/lox.t/field/set_on_function.lox new file mode 100644 index 0000000..d28c193 --- /dev/null +++ b/lox.t/field/set_on_function.lox @@ -0,0 +1,3 @@ +fun foo() {} + +foo.bar = "value"; // expect runtime error: Only instances have fields. diff --git a/lox.t/field/set_on_nil.lox b/lox.t/field/set_on_nil.lox new file mode 100644 index 0000000..560dded --- /dev/null +++ b/lox.t/field/set_on_nil.lox @@ -0,0 +1 @@ +nil.foo = "value"; // expect runtime error: Only instances have fields. diff --git a/lox.t/field/set_on_num.lox b/lox.t/field/set_on_num.lox new file mode 100644 index 0000000..cd66c9b --- /dev/null +++ b/lox.t/field/set_on_num.lox @@ -0,0 +1 @@ +123.foo = "value"; // expect runtime error: Only instances have fields. diff --git a/lox.t/field/set_on_string.lox b/lox.t/field/set_on_string.lox new file mode 100644 index 0000000..c0fdb3b --- /dev/null +++ b/lox.t/field/set_on_string.lox @@ -0,0 +1 @@ +"str".foo = "value"; // expect runtime error: Only instances have fields. diff --git a/lox.t/field/undefined.lox b/lox.t/field/undefined.lox new file mode 100644 index 0000000..b6b6297 --- /dev/null +++ b/lox.t/field/undefined.lox @@ -0,0 +1,4 @@ +class Foo {} +var foo = Foo(); + +foo.bar; // expect runtime error: Undefined property 'bar'. diff --git a/lox.t/for/class_in_body.lox b/lox.t/for/class_in_body.lox new file mode 100644 index 0000000..86e76b3 --- /dev/null +++ b/lox.t/for/class_in_body.lox @@ -0,0 +1,2 @@ +// [line 2] Error at 'class': Expect expression. +for (;;) class Foo {} diff --git a/lox.t/for/closure_in_body.lox b/lox.t/for/closure_in_body.lox new file mode 100644 index 0000000..01587e6 --- /dev/null +++ b/lox.t/for/closure_in_body.lox @@ -0,0 +1,22 @@ +var f1; +var f2; +var f3; + +for (var i = 1; i < 4; i = i + 1) { + var j = i; + fun f() { + print i; + print j; + } + + if (j == 1) f1 = f; + else if (j == 2) f2 = f; + else f3 = f; +} + +f1(); // expect: 4 + // expect: 1 +f2(); // expect: 4 + // expect: 2 +f3(); // expect: 4 + // expect: 3 diff --git a/lox.t/for/fun_in_body.lox b/lox.t/for/fun_in_body.lox new file mode 100644 index 0000000..fd5c5d0 --- /dev/null +++ b/lox.t/for/fun_in_body.lox @@ -0,0 +1,2 @@ +// [line 2] Error at 'fun': Expect expression. +for (;;) fun foo() {} diff --git a/lox.t/for/return_closure.lox b/lox.t/for/return_closure.lox new file mode 100644 index 0000000..e6eafc2 --- /dev/null +++ b/lox.t/for/return_closure.lox @@ -0,0 +1,10 @@ +fun f() { + for (;;) { + var i = "i"; + fun g() { print i; } + return g; + } +} + +var h = f(); +h(); // expect: i diff --git a/lox.t/for/return_inside.lox b/lox.t/for/return_inside.lox new file mode 100644 index 0000000..9ed886d --- /dev/null +++ b/lox.t/for/return_inside.lox @@ -0,0 +1,9 @@ +fun f() { + for (;;) { + var i = "i"; + return i; + } +} + +print f(); +// expect: i diff --git a/lox.t/for/scope.lox b/lox.t/for/scope.lox new file mode 100644 index 0000000..9f38925 --- /dev/null +++ b/lox.t/for/scope.lox @@ -0,0 +1,26 @@ +{ + var i = "before"; + + // New variable is in inner scope. + for (var i = 0; i < 1; i = i + 1) { + print i; // expect: 0 + + // Loop body is in second inner scope. + var i = -1; + print i; // expect: -1 + } +} + +{ + // New variable shadows outer variable. + for (var i = 0; i > 0; i = i + 1) {} + + // Goes out of scope after loop. + var i = "after"; + print i; // expect: after + + // Can reuse an existing variable. + for (i = 0; i < 1; i = i + 1) { + print i; // expect: 0 + } +} diff --git a/lox.t/for/statement_condition.lox b/lox.t/for/statement_condition.lox new file mode 100644 index 0000000..a068c2e --- /dev/null +++ b/lox.t/for/statement_condition.lox @@ -0,0 +1,3 @@ +// [line 3] Error at '{': Expect expression. +// [line 3] Error at ')': Expect ';' after expression. +for (var a = 1; {}; a = a + 1) {} diff --git a/lox.t/for/statement_increment.lox b/lox.t/for/statement_increment.lox new file mode 100644 index 0000000..4f47d1d --- /dev/null +++ b/lox.t/for/statement_increment.lox @@ -0,0 +1,2 @@ +// [line 2] Error at '{': Expect expression. +for (var a = 1; a < 2; {}) {} diff --git a/lox.t/for/statement_initializer.lox b/lox.t/for/statement_initializer.lox new file mode 100644 index 0000000..9618e21 --- /dev/null +++ b/lox.t/for/statement_initializer.lox @@ -0,0 +1,3 @@ +// [line 3] Error at '{': Expect expression. +// [line 3] Error at ')': Expect ';' after expression. +for ({}; a < 2; a = a + 1) {} diff --git a/lox.t/for/syntax.lox b/lox.t/for/syntax.lox new file mode 100644 index 0000000..91be593 --- /dev/null +++ b/lox.t/for/syntax.lox @@ -0,0 +1,50 @@ +// Single-expression body. +for (var c = 0; c < 3;) print c = c + 1; +// expect: 1 +// expect: 2 +// expect: 3 + +// Block body. +for (var a = 0; a < 3; a = a + 1) { + print a; +} +// expect: 0 +// expect: 1 +// expect: 2 + +// No clauses. +fun foo() { + for (;;) return "done"; +} +print foo(); // expect: done + +// No variable. +var i = 0; +for (; i < 2; i = i + 1) print i; +// expect: 0 +// expect: 1 + +// No condition. +fun bar() { + for (var i = 0;; i = i + 1) { + print i; + if (i >= 2) return; + } +} +bar(); +// expect: 0 +// expect: 1 +// expect: 2 + +// No increment. +for (var i = 0; i < 2;) { + print i; + i = i + 1; +} +// expect: 0 +// expect: 1 + +// Statement bodies. +for (; false;) if (true) 1; else 2; +for (; false;) while (true) 1; +for (; false;) for (;;) 1; diff --git a/lox.t/for/var_in_body.lox b/lox.t/for/var_in_body.lox new file mode 100644 index 0000000..66d2257 --- /dev/null +++ b/lox.t/for/var_in_body.lox @@ -0,0 +1,2 @@ +// [line 2] Error at 'var': Expect expression. +for (;;) var foo; diff --git a/lox.t/function/body_must_be_block.lox b/lox.t/function/body_must_be_block.lox new file mode 100644 index 0000000..57552bc --- /dev/null +++ b/lox.t/function/body_must_be_block.lox @@ -0,0 +1,3 @@ +// [line 3] Error at '123': Expect '{' before function body. +// [c line 4] Error at end: Expect '}' after block. +fun f() 123; diff --git a/lox.t/function/empty_body.lox b/lox.t/function/empty_body.lox new file mode 100644 index 0000000..7d732e1 --- /dev/null +++ b/lox.t/function/empty_body.lox @@ -0,0 +1,2 @@ +fun f() {} +print f(); // expect: nil diff --git a/lox.t/function/extra_arguments.lox b/lox.t/function/extra_arguments.lox new file mode 100644 index 0000000..350ac63 --- /dev/null +++ b/lox.t/function/extra_arguments.lox @@ -0,0 +1,6 @@ +fun f(a, b) { + print a; + print b; +} + +f(1, 2, 3, 4); // expect runtime error: Expected 2 arguments but got 4. diff --git a/lox.t/function/local_mutual_recursion.lox b/lox.t/function/local_mutual_recursion.lox new file mode 100644 index 0000000..2cd6c47 --- /dev/null +++ b/lox.t/function/local_mutual_recursion.lox @@ -0,0 +1,13 @@ +{ + fun isEven(n) { + if (n == 0) return true; + return isOdd(n - 1); // expect runtime error: Undefined variable 'isOdd'. + } + + fun isOdd(n) { + if (n == 0) return false; + return isEven(n - 1); + } + + isEven(4); +} \ No newline at end of file diff --git a/lox.t/function/local_recursion.lox b/lox.t/function/local_recursion.lox new file mode 100644 index 0000000..7b02898 --- /dev/null +++ b/lox.t/function/local_recursion.lox @@ -0,0 +1,8 @@ +{ + fun fib(n) { + if (n < 2) return n; + return fib(n - 1) + fib(n - 2); + } + + print fib(8); // expect: 21 +} diff --git a/lox.t/function/missing_arguments.lox b/lox.t/function/missing_arguments.lox new file mode 100644 index 0000000..2acee00 --- /dev/null +++ b/lox.t/function/missing_arguments.lox @@ -0,0 +1,3 @@ +fun f(a, b) {} + +f(1); // expect runtime error: Expected 2 arguments but got 1. diff --git a/lox.t/function/missing_comma_in_parameters.lox b/lox.t/function/missing_comma_in_parameters.lox new file mode 100644 index 0000000..eeb2d49 --- /dev/null +++ b/lox.t/function/missing_comma_in_parameters.lox @@ -0,0 +1,3 @@ +// [line 3] Error at 'c': Expect ')' after parameters. +// [c line 4] Error at end: Expect '}' after block. +fun foo(a, b c, d, e, f) {} diff --git a/lox.t/function/mutual_recursion.lox b/lox.t/function/mutual_recursion.lox new file mode 100644 index 0000000..a5ff5c4 --- /dev/null +++ b/lox.t/function/mutual_recursion.lox @@ -0,0 +1,12 @@ +fun isEven(n) { + if (n == 0) return true; + return isOdd(n - 1); +} + +fun isOdd(n) { + if (n == 0) return false; + return isEven(n - 1); +} + +print isEven(4); // expect: true +print isOdd(3); // expect: true diff --git a/lox.t/function/nested_call_with_arguments.lox b/lox.t/function/nested_call_with_arguments.lox new file mode 100644 index 0000000..efa607d --- /dev/null +++ b/lox.t/function/nested_call_with_arguments.lox @@ -0,0 +1,13 @@ +fun returnArg(arg) { + return arg; +} + +fun returnFunCallWithArg(func, arg) { + return returnArg(func)(arg); +} + +fun printArg(arg) { + print arg; +} + +returnFunCallWithArg(printArg, "hello world"); // expect: hello world diff --git a/lox.t/function/parameters.lox b/lox.t/function/parameters.lox new file mode 100644 index 0000000..8f5f2bd --- /dev/null +++ b/lox.t/function/parameters.lox @@ -0,0 +1,26 @@ +fun f0() { return 0; } +print f0(); // expect: 0 + +fun f1(a) { return a; } +print f1(1); // expect: 1 + +fun f2(a, b) { return a + b; } +print f2(1, 2); // expect: 3 + +fun f3(a, b, c) { return a + b + c; } +print f3(1, 2, 3); // expect: 6 + +fun f4(a, b, c, d) { return a + b + c + d; } +print f4(1, 2, 3, 4); // expect: 10 + +fun f5(a, b, c, d, e) { return a + b + c + d + e; } +print f5(1, 2, 3, 4, 5); // expect: 15 + +fun f6(a, b, c, d, e, f) { return a + b + c + d + e + f; } +print f6(1, 2, 3, 4, 5, 6); // expect: 21 + +fun f7(a, b, c, d, e, f, g) { return a + b + c + d + e + f + g; } +print f7(1, 2, 3, 4, 5, 6, 7); // expect: 28 + +fun f8(a, b, c, d, e, f, g, h) { return a + b + c + d + e + f + g + h; } +print f8(1, 2, 3, 4, 5, 6, 7, 8); // expect: 36 diff --git a/lox.t/function/print.lox b/lox.t/function/print.lox new file mode 100644 index 0000000..3ecd86a --- /dev/null +++ b/lox.t/function/print.lox @@ -0,0 +1,4 @@ +fun foo() {} +print foo; // expect: + +print clock; // expect: diff --git a/lox.t/function/recursion.lox b/lox.t/function/recursion.lox new file mode 100644 index 0000000..56d3fbb --- /dev/null +++ b/lox.t/function/recursion.lox @@ -0,0 +1,6 @@ +fun fib(n) { + if (n < 2) return n; + return fib(n - 1) + fib(n - 2); +} + +print fib(8); // expect: 21 diff --git a/lox.t/function/too_many_arguments.lox b/lox.t/function/too_many_arguments.lox new file mode 100644 index 0000000..9b21b86 --- /dev/null +++ b/lox.t/function/too_many_arguments.lox @@ -0,0 +1,261 @@ +fun foo() {} +{ + var a = 1; + foo( + a, // 1 + a, // 2 + a, // 3 + a, // 4 + a, // 5 + a, // 6 + a, // 7 + a, // 8 + a, // 9 + a, // 10 + a, // 11 + a, // 12 + a, // 13 + a, // 14 + a, // 15 + a, // 16 + a, // 17 + a, // 18 + a, // 19 + a, // 20 + a, // 21 + a, // 22 + a, // 23 + a, // 24 + a, // 25 + a, // 26 + a, // 27 + a, // 28 + a, // 29 + a, // 30 + a, // 31 + a, // 32 + a, // 33 + a, // 34 + a, // 35 + a, // 36 + a, // 37 + a, // 38 + a, // 39 + a, // 40 + a, // 41 + a, // 42 + a, // 43 + a, // 44 + a, // 45 + a, // 46 + a, // 47 + a, // 48 + a, // 49 + a, // 50 + a, // 51 + a, // 52 + a, // 53 + a, // 54 + a, // 55 + a, // 56 + a, // 57 + a, // 58 + a, // 59 + a, // 60 + a, // 61 + a, // 62 + a, // 63 + a, // 64 + a, // 65 + a, // 66 + a, // 67 + a, // 68 + a, // 69 + a, // 70 + a, // 71 + a, // 72 + a, // 73 + a, // 74 + a, // 75 + a, // 76 + a, // 77 + a, // 78 + a, // 79 + a, // 80 + a, // 81 + a, // 82 + a, // 83 + a, // 84 + a, // 85 + a, // 86 + a, // 87 + a, // 88 + a, // 89 + a, // 90 + a, // 91 + a, // 92 + a, // 93 + a, // 94 + a, // 95 + a, // 96 + a, // 97 + a, // 98 + a, // 99 + a, // 100 + a, // 101 + a, // 102 + a, // 103 + a, // 104 + a, // 105 + a, // 106 + a, // 107 + a, // 108 + a, // 109 + a, // 110 + a, // 111 + a, // 112 + a, // 113 + a, // 114 + a, // 115 + a, // 116 + a, // 117 + a, // 118 + a, // 119 + a, // 120 + a, // 121 + a, // 122 + a, // 123 + a, // 124 + a, // 125 + a, // 126 + a, // 127 + a, // 128 + a, // 129 + a, // 130 + a, // 131 + a, // 132 + a, // 133 + a, // 134 + a, // 135 + a, // 136 + a, // 137 + a, // 138 + a, // 139 + a, // 140 + a, // 141 + a, // 142 + a, // 143 + a, // 144 + a, // 145 + a, // 146 + a, // 147 + a, // 148 + a, // 149 + a, // 150 + a, // 151 + a, // 152 + a, // 153 + a, // 154 + a, // 155 + a, // 156 + a, // 157 + a, // 158 + a, // 159 + a, // 160 + a, // 161 + a, // 162 + a, // 163 + a, // 164 + a, // 165 + a, // 166 + a, // 167 + a, // 168 + a, // 169 + a, // 170 + a, // 171 + a, // 172 + a, // 173 + a, // 174 + a, // 175 + a, // 176 + a, // 177 + a, // 178 + a, // 179 + a, // 180 + a, // 181 + a, // 182 + a, // 183 + a, // 184 + a, // 185 + a, // 186 + a, // 187 + a, // 188 + a, // 189 + a, // 190 + a, // 191 + a, // 192 + a, // 193 + a, // 194 + a, // 195 + a, // 196 + a, // 197 + a, // 198 + a, // 199 + a, // 200 + a, // 201 + a, // 202 + a, // 203 + a, // 204 + a, // 205 + a, // 206 + a, // 207 + a, // 208 + a, // 209 + a, // 210 + a, // 211 + a, // 212 + a, // 213 + a, // 214 + a, // 215 + a, // 216 + a, // 217 + a, // 218 + a, // 219 + a, // 220 + a, // 221 + a, // 222 + a, // 223 + a, // 224 + a, // 225 + a, // 226 + a, // 227 + a, // 228 + a, // 229 + a, // 230 + a, // 231 + a, // 232 + a, // 233 + a, // 234 + a, // 235 + a, // 236 + a, // 237 + a, // 238 + a, // 239 + a, // 240 + a, // 241 + a, // 242 + a, // 243 + a, // 244 + a, // 245 + a, // 246 + a, // 247 + a, // 248 + a, // 249 + a, // 250 + a, // 251 + a, // 252 + a, // 253 + a, // 254 + a, // 255 + a); // Error at 'a': Can't have more than 255 arguments. +} diff --git a/lox.t/function/too_many_parameters.lox b/lox.t/function/too_many_parameters.lox new file mode 100644 index 0000000..869767b --- /dev/null +++ b/lox.t/function/too_many_parameters.lox @@ -0,0 +1,257 @@ +// 256 parameters. +fun f( + a1, + a2, + a3, + a4, + a5, + a6, + a7, + a8, + a9, + a10, + a11, + a12, + a13, + a14, + a15, + a16, + a17, + a18, + a19, + a20, + a21, + a22, + a23, + a24, + a25, + a26, + a27, + a28, + a29, + a30, + a31, + a32, + a33, + a34, + a35, + a36, + a37, + a38, + a39, + a40, + a41, + a42, + a43, + a44, + a45, + a46, + a47, + a48, + a49, + a50, + a51, + a52, + a53, + a54, + a55, + a56, + a57, + a58, + a59, + a60, + a61, + a62, + a63, + a64, + a65, + a66, + a67, + a68, + a69, + a70, + a71, + a72, + a73, + a74, + a75, + a76, + a77, + a78, + a79, + a80, + a81, + a82, + a83, + a84, + a85, + a86, + a87, + a88, + a89, + a90, + a91, + a92, + a93, + a94, + a95, + a96, + a97, + a98, + a99, + a100, + a101, + a102, + a103, + a104, + a105, + a106, + a107, + a108, + a109, + a110, + a111, + a112, + a113, + a114, + a115, + a116, + a117, + a118, + a119, + a120, + a121, + a122, + a123, + a124, + a125, + a126, + a127, + a128, + a129, + a130, + a131, + a132, + a133, + a134, + a135, + a136, + a137, + a138, + a139, + a140, + a141, + a142, + a143, + a144, + a145, + a146, + a147, + a148, + a149, + a150, + a151, + a152, + a153, + a154, + a155, + a156, + a157, + a158, + a159, + a160, + a161, + a162, + a163, + a164, + a165, + a166, + a167, + a168, + a169, + a170, + a171, + a172, + a173, + a174, + a175, + a176, + a177, + a178, + a179, + a180, + a181, + a182, + a183, + a184, + a185, + a186, + a187, + a188, + a189, + a190, + a191, + a192, + a193, + a194, + a195, + a196, + a197, + a198, + a199, + a200, + a201, + a202, + a203, + a204, + a205, + a206, + a207, + a208, + a209, + a210, + a211, + a212, + a213, + a214, + a215, + a216, + a217, + a218, + a219, + a220, + a221, + a222, + a223, + a224, + a225, + a226, + a227, + a228, + a229, + a230, + a231, + a232, + a233, + a234, + a235, + a236, + a237, + a238, + a239, + a240, + a241, + a242, + a243, + a244, + a245, + a246, + a247, + a248, + a249, + a250, + a251, + a252, + a253, + a254, + a255, a) {} // Error at 'a': Can't have more than 255 parameters. diff --git a/lox.t/if/class_in_else.lox b/lox.t/if/class_in_else.lox new file mode 100644 index 0000000..8308434 --- /dev/null +++ b/lox.t/if/class_in_else.lox @@ -0,0 +1,2 @@ +// [line 2] Error at 'class': Expect expression. +if (true) "ok"; else class Foo {} diff --git a/lox.t/if/class_in_then.lox b/lox.t/if/class_in_then.lox new file mode 100644 index 0000000..f59f471 --- /dev/null +++ b/lox.t/if/class_in_then.lox @@ -0,0 +1,2 @@ +// [line 2] Error at 'class': Expect expression. +if (true) class Foo {} diff --git a/lox.t/if/dangling_else.lox b/lox.t/if/dangling_else.lox new file mode 100644 index 0000000..05e99d6 --- /dev/null +++ b/lox.t/if/dangling_else.lox @@ -0,0 +1,3 @@ +// A dangling else binds to the right-most if. +if (true) if (false) print "bad"; else print "good"; // expect: good +if (false) if (true) print "bad"; else print "bad"; diff --git a/lox.t/if/else.lox b/lox.t/if/else.lox new file mode 100644 index 0000000..326e1c5 --- /dev/null +++ b/lox.t/if/else.lox @@ -0,0 +1,6 @@ +// Evaluate the 'else' expression if the condition is false. +if (true) print "good"; else print "bad"; // expect: good +if (false) print "bad"; else print "good"; // expect: good + +// Allow block body. +if (false) nil; else { print "block"; } // expect: block diff --git a/lox.t/if/fun_in_else.lox b/lox.t/if/fun_in_else.lox new file mode 100644 index 0000000..694d1e8 --- /dev/null +++ b/lox.t/if/fun_in_else.lox @@ -0,0 +1,2 @@ +// [line 2] Error at 'fun': Expect expression. +if (true) "ok"; else fun foo() {} diff --git a/lox.t/if/fun_in_then.lox b/lox.t/if/fun_in_then.lox new file mode 100644 index 0000000..75421d8 --- /dev/null +++ b/lox.t/if/fun_in_then.lox @@ -0,0 +1,2 @@ +// [line 2] Error at 'fun': Expect expression. +if (true) fun foo() {} diff --git a/lox.t/if/if.lox b/lox.t/if/if.lox new file mode 100644 index 0000000..7f46c98 --- /dev/null +++ b/lox.t/if/if.lox @@ -0,0 +1,10 @@ +// Evaluate the 'then' expression if the condition is true. +if (true) print "good"; // expect: good +if (false) print "bad"; + +// Allow block body. +if (true) { print "block"; } // expect: block + +// Assignment in if condition. +var a = false; +if (a = true) print a; // expect: true diff --git a/lox.t/if/truth.lox b/lox.t/if/truth.lox new file mode 100644 index 0000000..97d302a --- /dev/null +++ b/lox.t/if/truth.lox @@ -0,0 +1,8 @@ +// False and nil are false. +if (false) print "bad"; else print "false"; // expect: false +if (nil) print "bad"; else print "nil"; // expect: nil + +// Everything else is true. +if (true) print true; // expect: true +if (0) print 0; // expect: 0 +if ("") print "empty"; // expect: empty diff --git a/lox.t/if/var_in_else.lox b/lox.t/if/var_in_else.lox new file mode 100644 index 0000000..59cff3d --- /dev/null +++ b/lox.t/if/var_in_else.lox @@ -0,0 +1,2 @@ +// [line 2] Error at 'var': Expect expression. +if (true) "ok"; else var foo; diff --git a/lox.t/if/var_in_then.lox b/lox.t/if/var_in_then.lox new file mode 100644 index 0000000..a8b111b --- /dev/null +++ b/lox.t/if/var_in_then.lox @@ -0,0 +1,2 @@ +// [line 2] Error at 'var': Expect expression. +if (true) var foo; diff --git a/lox.t/inheritance/constructor.lox b/lox.t/inheritance/constructor.lox new file mode 100644 index 0000000..16df18d --- /dev/null +++ b/lox.t/inheritance/constructor.lox @@ -0,0 +1,14 @@ +class A { + init(param) { + this.field = param; + } + + test() { + print this.field; + } +} + +class B < A {} + +var b = B("value"); +b.test(); // expect: value diff --git a/lox.t/inheritance/inherit_from_function.lox b/lox.t/inheritance/inherit_from_function.lox new file mode 100644 index 0000000..0d3ce48 --- /dev/null +++ b/lox.t/inheritance/inherit_from_function.lox @@ -0,0 +1,3 @@ +fun foo() {} + +class Subclass < foo {} // expect runtime error: Superclass must be a class. diff --git a/lox.t/inheritance/inherit_from_nil.lox b/lox.t/inheritance/inherit_from_nil.lox new file mode 100644 index 0000000..72cf8ed --- /dev/null +++ b/lox.t/inheritance/inherit_from_nil.lox @@ -0,0 +1,2 @@ +var Nil = nil; +class Foo < Nil {} // expect runtime error: Superclass must be a class. diff --git a/lox.t/inheritance/inherit_from_number.lox b/lox.t/inheritance/inherit_from_number.lox new file mode 100644 index 0000000..ab1539a --- /dev/null +++ b/lox.t/inheritance/inherit_from_number.lox @@ -0,0 +1,2 @@ +var Number = 123; +class Foo < Number {} // expect runtime error: Superclass must be a class. diff --git a/lox.t/inheritance/inherit_methods.lox b/lox.t/inheritance/inherit_methods.lox new file mode 100644 index 0000000..e11ccc1 --- /dev/null +++ b/lox.t/inheritance/inherit_methods.lox @@ -0,0 +1,14 @@ +class Foo { + methodOnFoo() { print "foo"; } + override() { print "foo"; } +} + +class Bar < Foo { + methodOnBar() { print "bar"; } + override() { print "bar"; } +} + +var bar = Bar(); +bar.methodOnFoo(); // expect: foo +bar.methodOnBar(); // expect: bar +bar.override(); // expect: bar diff --git a/lox.t/inheritance/parenthesized_superclass.lox b/lox.t/inheritance/parenthesized_superclass.lox new file mode 100644 index 0000000..4b59836 --- /dev/null +++ b/lox.t/inheritance/parenthesized_superclass.lox @@ -0,0 +1,4 @@ +class Foo {} + +// [line 4] Error at '(': Expect superclass name. +class Bar < (Foo) {} diff --git a/lox.t/inheritance/set_fields_from_base_class.lox b/lox.t/inheritance/set_fields_from_base_class.lox new file mode 100644 index 0000000..de02bdd --- /dev/null +++ b/lox.t/inheritance/set_fields_from_base_class.lox @@ -0,0 +1,38 @@ +class Foo { + foo(a, b) { + this.field1 = a; + this.field2 = b; + } + + fooPrint() { + print this.field1; + print this.field2; + } +} + +class Bar < Foo { + bar(a, b) { + this.field1 = a; + this.field2 = b; + } + + barPrint() { + print this.field1; + print this.field2; + } +} + +var bar = Bar(); +bar.foo("foo 1", "foo 2"); +bar.fooPrint(); +// expect: foo 1 +// expect: foo 2 + +bar.bar("bar 1", "bar 2"); +bar.barPrint(); +// expect: bar 1 +// expect: bar 2 + +bar.fooPrint(); +// expect: bar 1 +// expect: bar 2 diff --git a/lox.t/limit/loop_too_large.lox b/lox.t/limit/loop_too_large.lox new file mode 100644 index 0000000..79d696c --- /dev/null +++ b/lox.t/limit/loop_too_large.lox @@ -0,0 +1,2351 @@ +var a = 0; +while (false) { + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + + + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + + + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + + + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + + + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + + + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + + + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + + + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; +} // Error at '}': Loop body too large. diff --git a/lox.t/limit/no_reuse_constants.lox b/lox.t/limit/no_reuse_constants.lox new file mode 100644 index 0000000..0742ac0 --- /dev/null +++ b/lox.t/limit/no_reuse_constants.lox @@ -0,0 +1,36 @@ +fun f() { + 0; 1; 2; 3; 4; 5; 6; 7; + 8; 9; 10; 11; 12; 13; 14; 15; + 16; 17; 18; 19; 20; 21; 22; 23; + 24; 25; 26; 27; 28; 29; 30; 31; + 32; 33; 34; 35; 36; 37; 38; 39; + 40; 41; 42; 43; 44; 45; 46; 47; + 48; 49; 50; 51; 52; 53; 54; 55; + 56; 57; 58; 59; 60; 61; 62; 63; + 64; 65; 66; 67; 68; 69; 70; 71; + 72; 73; 74; 75; 76; 77; 78; 79; + 80; 81; 82; 83; 84; 85; 86; 87; + 88; 89; 90; 91; 92; 93; 94; 95; + 96; 97; 98; 99; 100; 101; 102; 103; + 104; 105; 106; 107; 108; 109; 110; 111; + 112; 113; 114; 115; 116; 117; 118; 119; + 120; 121; 122; 123; 124; 125; 126; 127; + 128; 129; 130; 131; 132; 133; 134; 135; + 136; 137; 138; 139; 140; 141; 142; 143; + 144; 145; 146; 147; 148; 149; 150; 151; + 152; 153; 154; 155; 156; 157; 158; 159; + 160; 161; 162; 163; 164; 165; 166; 167; + 168; 169; 170; 171; 172; 173; 174; 175; + 176; 177; 178; 179; 180; 181; 182; 183; + 184; 185; 186; 187; 188; 189; 190; 191; + 192; 193; 194; 195; 196; 197; 198; 199; + 200; 201; 202; 203; 204; 205; 206; 207; + 208; 209; 210; 211; 212; 213; 214; 215; + 216; 217; 218; 219; 220; 221; 222; 223; + 224; 225; 226; 227; 228; 229; 230; 231; + 232; 233; 234; 235; 236; 237; 238; 239; + 240; 241; 242; 243; 244; 245; 246; 247; + 248; 249; 250; 251; 252; 253; 254; 255; + + 1; // Error at '1': Too many constants in one chunk. +} diff --git a/lox.t/limit/stack_overflow.lox b/lox.t/limit/stack_overflow.lox new file mode 100644 index 0000000..e98284b --- /dev/null +++ b/lox.t/limit/stack_overflow.lox @@ -0,0 +1,21 @@ +fun foo() { + var a1; + var a2; + var a3; + var a4; + var a5; + var a6; + var a7; + var a8; + var a9; + var a10; + var a11; + var a12; + var a13; + var a14; + var a15; + var a16; + foo(); // expect runtime error: Stack overflow. +} + +foo(); diff --git a/lox.t/limit/too_many_constants.lox b/lox.t/limit/too_many_constants.lox new file mode 100644 index 0000000..df73c80 --- /dev/null +++ b/lox.t/limit/too_many_constants.lox @@ -0,0 +1,36 @@ +fun f() { + 0; 1; 2; 3; 4; 5; 6; 7; + 8; 9; 10; 11; 12; 13; 14; 15; + 16; 17; 18; 19; 20; 21; 22; 23; + 24; 25; 26; 27; 28; 29; 30; 31; + 32; 33; 34; 35; 36; 37; 38; 39; + 40; 41; 42; 43; 44; 45; 46; 47; + 48; 49; 50; 51; 52; 53; 54; 55; + 56; 57; 58; 59; 60; 61; 62; 63; + 64; 65; 66; 67; 68; 69; 70; 71; + 72; 73; 74; 75; 76; 77; 78; 79; + 80; 81; 82; 83; 84; 85; 86; 87; + 88; 89; 90; 91; 92; 93; 94; 95; + 96; 97; 98; 99; 100; 101; 102; 103; + 104; 105; 106; 107; 108; 109; 110; 111; + 112; 113; 114; 115; 116; 117; 118; 119; + 120; 121; 122; 123; 124; 125; 126; 127; + 128; 129; 130; 131; 132; 133; 134; 135; + 136; 137; 138; 139; 140; 141; 142; 143; + 144; 145; 146; 147; 148; 149; 150; 151; + 152; 153; 154; 155; 156; 157; 158; 159; + 160; 161; 162; 163; 164; 165; 166; 167; + 168; 169; 170; 171; 172; 173; 174; 175; + 176; 177; 178; 179; 180; 181; 182; 183; + 184; 185; 186; 187; 188; 189; 190; 191; + 192; 193; 194; 195; 196; 197; 198; 199; + 200; 201; 202; 203; 204; 205; 206; 207; + 208; 209; 210; 211; 212; 213; 214; 215; + 216; 217; 218; 219; 220; 221; 222; 223; + 224; 225; 226; 227; 228; 229; 230; 231; + 232; 233; 234; 235; 236; 237; 238; 239; + 240; 241; 242; 243; 244; 245; 246; 247; + 248; 249; 250; 251; 252; 253; 254; 255; + + "oops"; // Error at '"oops"': Too many constants in one chunk. +} diff --git a/lox.t/limit/too_many_locals.lox b/lox.t/limit/too_many_locals.lox new file mode 100644 index 0000000..fdf5482 --- /dev/null +++ b/lox.t/limit/too_many_locals.lox @@ -0,0 +1,53 @@ +fun f() { + // var v00; First slot already taken. + + var v01; var v02; var v03; var v04; var v05; var v06; var v07; + var v08; var v09; var v0a; var v0b; var v0c; var v0d; var v0e; var v0f; + + var v10; var v11; var v12; var v13; var v14; var v15; var v16; var v17; + var v18; var v19; var v1a; var v1b; var v1c; var v1d; var v1e; var v1f; + + var v20; var v21; var v22; var v23; var v24; var v25; var v26; var v27; + var v28; var v29; var v2a; var v2b; var v2c; var v2d; var v2e; var v2f; + + var v30; var v31; var v32; var v33; var v34; var v35; var v36; var v37; + var v38; var v39; var v3a; var v3b; var v3c; var v3d; var v3e; var v3f; + + var v40; var v41; var v42; var v43; var v44; var v45; var v46; var v47; + var v48; var v49; var v4a; var v4b; var v4c; var v4d; var v4e; var v4f; + + var v50; var v51; var v52; var v53; var v54; var v55; var v56; var v57; + var v58; var v59; var v5a; var v5b; var v5c; var v5d; var v5e; var v5f; + + var v60; var v61; var v62; var v63; var v64; var v65; var v66; var v67; + var v68; var v69; var v6a; var v6b; var v6c; var v6d; var v6e; var v6f; + + var v70; var v71; var v72; var v73; var v74; var v75; var v76; var v77; + var v78; var v79; var v7a; var v7b; var v7c; var v7d; var v7e; var v7f; + + var v80; var v81; var v82; var v83; var v84; var v85; var v86; var v87; + var v88; var v89; var v8a; var v8b; var v8c; var v8d; var v8e; var v8f; + + var v90; var v91; var v92; var v93; var v94; var v95; var v96; var v97; + var v98; var v99; var v9a; var v9b; var v9c; var v9d; var v9e; var v9f; + + var va0; var va1; var va2; var va3; var va4; var va5; var va6; var va7; + var va8; var va9; var vaa; var vab; var vac; var vad; var vae; var vaf; + + var vb0; var vb1; var vb2; var vb3; var vb4; var vb5; var vb6; var vb7; + var vb8; var vb9; var vba; var vbb; var vbc; var vbd; var vbe; var vbf; + + var vc0; var vc1; var vc2; var vc3; var vc4; var vc5; var vc6; var vc7; + var vc8; var vc9; var vca; var vcb; var vcc; var vcd; var vce; var vcf; + + var vd0; var vd1; var vd2; var vd3; var vd4; var vd5; var vd6; var vd7; + var vd8; var vd9; var vda; var vdb; var vdc; var vdd; var vde; var vdf; + + var ve0; var ve1; var ve2; var ve3; var ve4; var ve5; var ve6; var ve7; + var ve8; var ve9; var vea; var veb; var vec; var ved; var vee; var vef; + + var vf0; var vf1; var vf2; var vf3; var vf4; var vf5; var vf6; var vf7; + var vf8; var vf9; var vfa; var vfb; var vfc; var vfd; var vfe; var vff; + + var oops; // Error at 'oops': Too many local variables in function. +} diff --git a/lox.t/limit/too_many_upvalues.lox b/lox.t/limit/too_many_upvalues.lox new file mode 100644 index 0000000..325448c --- /dev/null +++ b/lox.t/limit/too_many_upvalues.lox @@ -0,0 +1,105 @@ +fun f() { + var v00; var v01; var v02; var v03; var v04; var v05; var v06; var v07; + var v08; var v09; var v0a; var v0b; var v0c; var v0d; var v0e; var v0f; + + var v10; var v11; var v12; var v13; var v14; var v15; var v16; var v17; + var v18; var v19; var v1a; var v1b; var v1c; var v1d; var v1e; var v1f; + + var v20; var v21; var v22; var v23; var v24; var v25; var v26; var v27; + var v28; var v29; var v2a; var v2b; var v2c; var v2d; var v2e; var v2f; + + var v30; var v31; var v32; var v33; var v34; var v35; var v36; var v37; + var v38; var v39; var v3a; var v3b; var v3c; var v3d; var v3e; var v3f; + + var v40; var v41; var v42; var v43; var v44; var v45; var v46; var v47; + var v48; var v49; var v4a; var v4b; var v4c; var v4d; var v4e; var v4f; + + var v50; var v51; var v52; var v53; var v54; var v55; var v56; var v57; + var v58; var v59; var v5a; var v5b; var v5c; var v5d; var v5e; var v5f; + + var v60; var v61; var v62; var v63; var v64; var v65; var v66; var v67; + var v68; var v69; var v6a; var v6b; var v6c; var v6d; var v6e; var v6f; + + var v70; var v71; var v72; var v73; var v74; var v75; var v76; var v77; + var v78; var v79; var v7a; var v7b; var v7c; var v7d; var v7e; var v7f; + + fun g() { + var v80; var v81; var v82; var v83; var v84; var v85; var v86; var v87; + var v88; var v89; var v8a; var v8b; var v8c; var v8d; var v8e; var v8f; + + var v90; var v91; var v92; var v93; var v94; var v95; var v96; var v97; + var v98; var v99; var v9a; var v9b; var v9c; var v9d; var v9e; var v9f; + + var va0; var va1; var va2; var va3; var va4; var va5; var va6; var va7; + var va8; var va9; var vaa; var vab; var vac; var vad; var vae; var vaf; + + var vb0; var vb1; var vb2; var vb3; var vb4; var vb5; var vb6; var vb7; + var vb8; var vb9; var vba; var vbb; var vbc; var vbd; var vbe; var vbf; + + var vc0; var vc1; var vc2; var vc3; var vc4; var vc5; var vc6; var vc7; + var vc8; var vc9; var vca; var vcb; var vcc; var vcd; var vce; var vcf; + + var vd0; var vd1; var vd2; var vd3; var vd4; var vd5; var vd6; var vd7; + var vd8; var vd9; var vda; var vdb; var vdc; var vdd; var vde; var vdf; + + var ve0; var ve1; var ve2; var ve3; var ve4; var ve5; var ve6; var ve7; + var ve8; var ve9; var vea; var veb; var vec; var ved; var vee; var vef; + + var vf0; var vf1; var vf2; var vf3; var vf4; var vf5; var vf6; var vf7; + var vf8; var vf9; var vfa; var vfb; var vfc; var vfd; var vfe; var vff; + + var oops; + + fun h() { + v00; v01; v02; v03; v04; v05; v06; v07; + v08; v09; v0a; v0b; v0c; v0d; v0e; v0f; + + v10; v11; v12; v13; v14; v15; v16; v17; + v18; v19; v1a; v1b; v1c; v1d; v1e; v1f; + + v20; v21; v22; v23; v24; v25; v26; v27; + v28; v29; v2a; v2b; v2c; v2d; v2e; v2f; + + v30; v31; v32; v33; v34; v35; v36; v37; + v38; v39; v3a; v3b; v3c; v3d; v3e; v3f; + + v40; v41; v42; v43; v44; v45; v46; v47; + v48; v49; v4a; v4b; v4c; v4d; v4e; v4f; + + v50; v51; v52; v53; v54; v55; v56; v57; + v58; v59; v5a; v5b; v5c; v5d; v5e; v5f; + + v60; v61; v62; v63; v64; v65; v66; v67; + v68; v69; v6a; v6b; v6c; v6d; v6e; v6f; + + v70; v71; v72; v73; v74; v75; v76; v77; + v78; v79; v7a; v7b; v7c; v7d; v7e; v7f; + + v80; v81; v82; v83; v84; v85; v86; v87; + v88; v89; v8a; v8b; v8c; v8d; v8e; v8f; + + v90; v91; v92; v93; v94; v95; v96; v97; + v98; v99; v9a; v9b; v9c; v9d; v9e; v9f; + + va0; va1; va2; va3; va4; va5; va6; va7; + va8; va9; vaa; vab; vac; vad; vae; vaf; + + vb0; vb1; vb2; vb3; vb4; vb5; vb6; vb7; + vb8; vb9; vba; vbb; vbc; vbd; vbe; vbf; + + vc0; vc1; vc2; vc3; vc4; vc5; vc6; vc7; + vc8; vc9; vca; vcb; vcc; vcd; vce; vcf; + + vd0; vd1; vd2; vd3; vd4; vd5; vd6; vd7; + vd8; vd9; vda; vdb; vdc; vdd; vde; vdf; + + ve0; ve1; ve2; ve3; ve4; ve5; ve6; ve7; + ve8; ve9; vea; veb; vec; ved; vee; vef; + + vf0; vf1; vf2; vf3; vf4; vf5; vf6; vf7; + vf8; vf9; vfa; vfb; vfc; vfd; vfe; vff; + + oops; // Error at 'oops': Too many closure variables in function. + } + } +} diff --git a/lox.t/logical_operator/and.lox b/lox.t/logical_operator/and.lox new file mode 100644 index 0000000..9f2dc9a --- /dev/null +++ b/lox.t/logical_operator/and.lox @@ -0,0 +1,19 @@ +// Note: These tests implicitly depend on ints being truthy. + +// Return the first non-true argument. +print false and 1; // expect: false +print true and 1; // expect: 1 +print 1 and 2 and false; // expect: false + +// Return the last argument if all are true. +print 1 and true; // expect: true +print 1 and 2 and 3; // expect: 3 + +// Short-circuit at the first false argument. +var a = "before"; +var b = "before"; +(a = true) and + (b = false) and + (a = "bad"); +print a; // expect: true +print b; // expect: false diff --git a/lox.t/logical_operator/and_truth.lox b/lox.t/logical_operator/and_truth.lox new file mode 100644 index 0000000..dcb08cf --- /dev/null +++ b/lox.t/logical_operator/and_truth.lox @@ -0,0 +1,8 @@ +// False and nil are false. +print false and "bad"; // expect: false +print nil and "bad"; // expect: nil + +// Everything else is true. +print true and "ok"; // expect: ok +print 0 and "ok"; // expect: ok +print "" and "ok"; // expect: ok diff --git a/lox.t/logical_operator/or.lox b/lox.t/logical_operator/or.lox new file mode 100644 index 0000000..941eac4 --- /dev/null +++ b/lox.t/logical_operator/or.lox @@ -0,0 +1,19 @@ +// Note: These tests implicitly depend on ints being truthy. + +// Return the first true argument. +print 1 or true; // expect: 1 +print false or 1; // expect: 1 +print false or false or true; // expect: true + +// Return the last argument if all are false. +print false or false; // expect: false +print false or false or false; // expect: false + +// Short-circuit at the first true argument. +var a = "before"; +var b = "before"; +(a = false) or + (b = true) or + (a = "bad"); +print a; // expect: false +print b; // expect: true diff --git a/lox.t/logical_operator/or_truth.lox b/lox.t/logical_operator/or_truth.lox new file mode 100644 index 0000000..7ed1a8a --- /dev/null +++ b/lox.t/logical_operator/or_truth.lox @@ -0,0 +1,8 @@ +// False and nil are false. +print false or "ok"; // expect: ok +print nil or "ok"; // expect: ok + +// Everything else is true. +print true or "ok"; // expect: true +print 0 or "ok"; // expect: 0 +print "s" or "ok"; // expect: s diff --git a/lox.t/method/arity.lox b/lox.t/method/arity.lox new file mode 100644 index 0000000..594963e --- /dev/null +++ b/lox.t/method/arity.lox @@ -0,0 +1,22 @@ +class Foo { + method0() { return "no args"; } + method1(a) { return a; } + method2(a, b) { return a + b; } + method3(a, b, c) { return a + b + c; } + method4(a, b, c, d) { return a + b + c + d; } + method5(a, b, c, d, e) { return a + b + c + d + e; } + method6(a, b, c, d, e, f) { return a + b + c + d + e + f; } + method7(a, b, c, d, e, f, g) { return a + b + c + d + e + f + g; } + method8(a, b, c, d, e, f, g, h) { return a + b + c + d + e + f + g + h; } +} + +var foo = Foo(); +print foo.method0(); // expect: no args +print foo.method1(1); // expect: 1 +print foo.method2(1, 2); // expect: 3 +print foo.method3(1, 2, 3); // expect: 6 +print foo.method4(1, 2, 3, 4); // expect: 10 +print foo.method5(1, 2, 3, 4, 5); // expect: 15 +print foo.method6(1, 2, 3, 4, 5, 6); // expect: 21 +print foo.method7(1, 2, 3, 4, 5, 6, 7); // expect: 28 +print foo.method8(1, 2, 3, 4, 5, 6, 7, 8); // expect: 36 diff --git a/lox.t/method/empty_block.lox b/lox.t/method/empty_block.lox new file mode 100644 index 0000000..3825223 --- /dev/null +++ b/lox.t/method/empty_block.lox @@ -0,0 +1,5 @@ +class Foo { + bar() {} +} + +print Foo().bar(); // expect: nil diff --git a/lox.t/method/extra_arguments.lox b/lox.t/method/extra_arguments.lox new file mode 100644 index 0000000..76f3fab --- /dev/null +++ b/lox.t/method/extra_arguments.lox @@ -0,0 +1,8 @@ +class Foo { + method(a, b) { + print a; + print b; + } +} + +Foo().method(1, 2, 3, 4); // expect runtime error: Expected 2 arguments but got 4. diff --git a/lox.t/method/missing_arguments.lox b/lox.t/method/missing_arguments.lox new file mode 100644 index 0000000..734f455 --- /dev/null +++ b/lox.t/method/missing_arguments.lox @@ -0,0 +1,5 @@ +class Foo { + method(a, b) {} +} + +Foo().method(1); // expect runtime error: Expected 2 arguments but got 1. diff --git a/lox.t/method/not_found.lox b/lox.t/method/not_found.lox new file mode 100644 index 0000000..bbac99b --- /dev/null +++ b/lox.t/method/not_found.lox @@ -0,0 +1,3 @@ +class Foo {} + +Foo().unknown(); // expect runtime error: Undefined property 'unknown'. diff --git a/lox.t/method/print_bound_method.lox b/lox.t/method/print_bound_method.lox new file mode 100644 index 0000000..0ab5e72 --- /dev/null +++ b/lox.t/method/print_bound_method.lox @@ -0,0 +1,5 @@ +class Foo { + method() { } +} +var foo = Foo(); +print foo.method; // expect: diff --git a/lox.t/method/refer_to_name.lox b/lox.t/method/refer_to_name.lox new file mode 100644 index 0000000..df59d42 --- /dev/null +++ b/lox.t/method/refer_to_name.lox @@ -0,0 +1,7 @@ +class Foo { + method() { + print method; // expect runtime error: Undefined variable 'method'. + } +} + +Foo().method(); diff --git a/lox.t/method/too_many_arguments.lox b/lox.t/method/too_many_arguments.lox new file mode 100644 index 0000000..1777f72 --- /dev/null +++ b/lox.t/method/too_many_arguments.lox @@ -0,0 +1,260 @@ +{ + var a = 1; + true.method( + a, // 1 + a, // 2 + a, // 3 + a, // 4 + a, // 5 + a, // 6 + a, // 7 + a, // 8 + a, // 9 + a, // 10 + a, // 11 + a, // 12 + a, // 13 + a, // 14 + a, // 15 + a, // 16 + a, // 17 + a, // 18 + a, // 19 + a, // 20 + a, // 21 + a, // 22 + a, // 23 + a, // 24 + a, // 25 + a, // 26 + a, // 27 + a, // 28 + a, // 29 + a, // 30 + a, // 31 + a, // 32 + a, // 33 + a, // 34 + a, // 35 + a, // 36 + a, // 37 + a, // 38 + a, // 39 + a, // 40 + a, // 41 + a, // 42 + a, // 43 + a, // 44 + a, // 45 + a, // 46 + a, // 47 + a, // 48 + a, // 49 + a, // 50 + a, // 51 + a, // 52 + a, // 53 + a, // 54 + a, // 55 + a, // 56 + a, // 57 + a, // 58 + a, // 59 + a, // 60 + a, // 61 + a, // 62 + a, // 63 + a, // 64 + a, // 65 + a, // 66 + a, // 67 + a, // 68 + a, // 69 + a, // 70 + a, // 71 + a, // 72 + a, // 73 + a, // 74 + a, // 75 + a, // 76 + a, // 77 + a, // 78 + a, // 79 + a, // 80 + a, // 81 + a, // 82 + a, // 83 + a, // 84 + a, // 85 + a, // 86 + a, // 87 + a, // 88 + a, // 89 + a, // 90 + a, // 91 + a, // 92 + a, // 93 + a, // 94 + a, // 95 + a, // 96 + a, // 97 + a, // 98 + a, // 99 + a, // 100 + a, // 101 + a, // 102 + a, // 103 + a, // 104 + a, // 105 + a, // 106 + a, // 107 + a, // 108 + a, // 109 + a, // 110 + a, // 111 + a, // 112 + a, // 113 + a, // 114 + a, // 115 + a, // 116 + a, // 117 + a, // 118 + a, // 119 + a, // 120 + a, // 121 + a, // 122 + a, // 123 + a, // 124 + a, // 125 + a, // 126 + a, // 127 + a, // 128 + a, // 129 + a, // 130 + a, // 131 + a, // 132 + a, // 133 + a, // 134 + a, // 135 + a, // 136 + a, // 137 + a, // 138 + a, // 139 + a, // 140 + a, // 141 + a, // 142 + a, // 143 + a, // 144 + a, // 145 + a, // 146 + a, // 147 + a, // 148 + a, // 149 + a, // 150 + a, // 151 + a, // 152 + a, // 153 + a, // 154 + a, // 155 + a, // 156 + a, // 157 + a, // 158 + a, // 159 + a, // 160 + a, // 161 + a, // 162 + a, // 163 + a, // 164 + a, // 165 + a, // 166 + a, // 167 + a, // 168 + a, // 169 + a, // 170 + a, // 171 + a, // 172 + a, // 173 + a, // 174 + a, // 175 + a, // 176 + a, // 177 + a, // 178 + a, // 179 + a, // 180 + a, // 181 + a, // 182 + a, // 183 + a, // 184 + a, // 185 + a, // 186 + a, // 187 + a, // 188 + a, // 189 + a, // 190 + a, // 191 + a, // 192 + a, // 193 + a, // 194 + a, // 195 + a, // 196 + a, // 197 + a, // 198 + a, // 199 + a, // 200 + a, // 201 + a, // 202 + a, // 203 + a, // 204 + a, // 205 + a, // 206 + a, // 207 + a, // 208 + a, // 209 + a, // 210 + a, // 211 + a, // 212 + a, // 213 + a, // 214 + a, // 215 + a, // 216 + a, // 217 + a, // 218 + a, // 219 + a, // 220 + a, // 221 + a, // 222 + a, // 223 + a, // 224 + a, // 225 + a, // 226 + a, // 227 + a, // 228 + a, // 229 + a, // 230 + a, // 231 + a, // 232 + a, // 233 + a, // 234 + a, // 235 + a, // 236 + a, // 237 + a, // 238 + a, // 239 + a, // 240 + a, // 241 + a, // 242 + a, // 243 + a, // 244 + a, // 245 + a, // 246 + a, // 247 + a, // 248 + a, // 249 + a, // 250 + a, // 251 + a, // 252 + a, // 253 + a, // 254 + a, // 255 + a); // Error at 'a': Can't have more than 255 arguments. +} diff --git a/lox.t/method/too_many_parameters.lox b/lox.t/method/too_many_parameters.lox new file mode 100644 index 0000000..9e9b921 --- /dev/null +++ b/lox.t/method/too_many_parameters.lox @@ -0,0 +1,259 @@ +class Foo { + // 256 parameters. + method( + a1, + a2, + a3, + a4, + a5, + a6, + a7, + a8, + a9, + a10, + a11, + a12, + a13, + a14, + a15, + a16, + a17, + a18, + a19, + a20, + a21, + a22, + a23, + a24, + a25, + a26, + a27, + a28, + a29, + a30, + a31, + a32, + a33, + a34, + a35, + a36, + a37, + a38, + a39, + a40, + a41, + a42, + a43, + a44, + a45, + a46, + a47, + a48, + a49, + a50, + a51, + a52, + a53, + a54, + a55, + a56, + a57, + a58, + a59, + a60, + a61, + a62, + a63, + a64, + a65, + a66, + a67, + a68, + a69, + a70, + a71, + a72, + a73, + a74, + a75, + a76, + a77, + a78, + a79, + a80, + a81, + a82, + a83, + a84, + a85, + a86, + a87, + a88, + a89, + a90, + a91, + a92, + a93, + a94, + a95, + a96, + a97, + a98, + a99, + a100, + a101, + a102, + a103, + a104, + a105, + a106, + a107, + a108, + a109, + a110, + a111, + a112, + a113, + a114, + a115, + a116, + a117, + a118, + a119, + a120, + a121, + a122, + a123, + a124, + a125, + a126, + a127, + a128, + a129, + a130, + a131, + a132, + a133, + a134, + a135, + a136, + a137, + a138, + a139, + a140, + a141, + a142, + a143, + a144, + a145, + a146, + a147, + a148, + a149, + a150, + a151, + a152, + a153, + a154, + a155, + a156, + a157, + a158, + a159, + a160, + a161, + a162, + a163, + a164, + a165, + a166, + a167, + a168, + a169, + a170, + a171, + a172, + a173, + a174, + a175, + a176, + a177, + a178, + a179, + a180, + a181, + a182, + a183, + a184, + a185, + a186, + a187, + a188, + a189, + a190, + a191, + a192, + a193, + a194, + a195, + a196, + a197, + a198, + a199, + a200, + a201, + a202, + a203, + a204, + a205, + a206, + a207, + a208, + a209, + a210, + a211, + a212, + a213, + a214, + a215, + a216, + a217, + a218, + a219, + a220, + a221, + a222, + a223, + a224, + a225, + a226, + a227, + a228, + a229, + a230, + a231, + a232, + a233, + a234, + a235, + a236, + a237, + a238, + a239, + a240, + a241, + a242, + a243, + a244, + a245, + a246, + a247, + a248, + a249, + a250, + a251, + a252, + a253, + a254, + a255, a) {} // Error at 'a': Can't have more than 255 parameters. +} diff --git a/lox.t/nil/literal.lox b/lox.t/nil/literal.lox new file mode 100644 index 0000000..8546de9 --- /dev/null +++ b/lox.t/nil/literal.lox @@ -0,0 +1 @@ +print nil; // expect: nil diff --git a/lox.t/number/decimal_point_at_eof.lox b/lox.t/number/decimal_point_at_eof.lox new file mode 100644 index 0000000..9181925 --- /dev/null +++ b/lox.t/number/decimal_point_at_eof.lox @@ -0,0 +1,2 @@ +// [line 2] Error at end: Expect property name after '.'. +123. \ No newline at end of file diff --git a/lox.t/number/leading_dot.lox b/lox.t/number/leading_dot.lox new file mode 100644 index 0000000..93345a5 --- /dev/null +++ b/lox.t/number/leading_dot.lox @@ -0,0 +1,2 @@ +// [line 2] Error at '.': Expect expression. +.123; diff --git a/lox.t/number/literals.lox b/lox.t/number/literals.lox new file mode 100644 index 0000000..4fcdb4f --- /dev/null +++ b/lox.t/number/literals.lox @@ -0,0 +1,7 @@ +print 123; // expect: 123 +print 987654; // expect: 987654 +print 0; // expect: 0 +print -0; // expect: -0 + +print 123.456; // expect: 123.456 +print -0.001; // expect: -0.001 diff --git a/lox.t/number/nan_equality.lox b/lox.t/number/nan_equality.lox new file mode 100644 index 0000000..2807b65 --- /dev/null +++ b/lox.t/number/nan_equality.lox @@ -0,0 +1,8 @@ +var nan = 0/0; + +print nan == 0; // expect: false +print nan != 1; // expect: true + +// NaN is not equal to self. +print nan == nan; // expect: false +print nan != nan; // expect: true diff --git a/lox.t/number/trailing_dot.lox b/lox.t/number/trailing_dot.lox new file mode 100644 index 0000000..1af7dea --- /dev/null +++ b/lox.t/number/trailing_dot.lox @@ -0,0 +1,2 @@ +// [line 2] Error at ';': Expect property name after '.'. +123.; diff --git a/lox.t/operator/add.lox b/lox.t/operator/add.lox new file mode 100644 index 0000000..e28c5d4 --- /dev/null +++ b/lox.t/operator/add.lox @@ -0,0 +1,2 @@ +print 123 + 456; // expect: 579 +print "str" + "ing"; // expect: string diff --git a/lox.t/operator/add_bool_nil.lox b/lox.t/operator/add_bool_nil.lox new file mode 100644 index 0000000..6c4d7fd --- /dev/null +++ b/lox.t/operator/add_bool_nil.lox @@ -0,0 +1 @@ +true + nil; // expect runtime error: Operands must be two numbers or two strings. diff --git a/lox.t/operator/add_bool_num.lox b/lox.t/operator/add_bool_num.lox new file mode 100644 index 0000000..308245a --- /dev/null +++ b/lox.t/operator/add_bool_num.lox @@ -0,0 +1 @@ +true + 123; // expect runtime error: Operands must be two numbers or two strings. diff --git a/lox.t/operator/add_bool_string.lox b/lox.t/operator/add_bool_string.lox new file mode 100644 index 0000000..04739d5 --- /dev/null +++ b/lox.t/operator/add_bool_string.lox @@ -0,0 +1 @@ +true + "s"; // expect runtime error: Operands must be two numbers or two strings. diff --git a/lox.t/operator/add_nil_nil.lox b/lox.t/operator/add_nil_nil.lox new file mode 100644 index 0000000..b8371ab --- /dev/null +++ b/lox.t/operator/add_nil_nil.lox @@ -0,0 +1 @@ +nil + nil; // expect runtime error: Operands must be two numbers or two strings. diff --git a/lox.t/operator/add_num_nil.lox b/lox.t/operator/add_num_nil.lox new file mode 100644 index 0000000..1ce8fb7 --- /dev/null +++ b/lox.t/operator/add_num_nil.lox @@ -0,0 +1 @@ +1 + nil; // expect runtime error: Operands must be two numbers or two strings. diff --git a/lox.t/operator/add_string_nil.lox b/lox.t/operator/add_string_nil.lox new file mode 100644 index 0000000..5949630 --- /dev/null +++ b/lox.t/operator/add_string_nil.lox @@ -0,0 +1 @@ +"s" + nil; // expect runtime error: Operands must be two numbers or two strings. diff --git a/lox.t/operator/comparison.lox b/lox.t/operator/comparison.lox new file mode 100644 index 0000000..76e4e72 --- /dev/null +++ b/lox.t/operator/comparison.lox @@ -0,0 +1,25 @@ +print 1 < 2; // expect: true +print 2 < 2; // expect: false +print 2 < 1; // expect: false + +print 1 <= 2; // expect: true +print 2 <= 2; // expect: true +print 2 <= 1; // expect: false + +print 1 > 2; // expect: false +print 2 > 2; // expect: false +print 2 > 1; // expect: true + +print 1 >= 2; // expect: false +print 2 >= 2; // expect: true +print 2 >= 1; // expect: true + +// Zero and negative zero compare the same. +print 0 < -0; // expect: false +print -0 < 0; // expect: false +print 0 > -0; // expect: false +print -0 > 0; // expect: false +print 0 <= -0; // expect: true +print -0 <= 0; // expect: true +print 0 >= -0; // expect: true +print -0 >= 0; // expect: true diff --git a/lox.t/operator/divide.lox b/lox.t/operator/divide.lox new file mode 100644 index 0000000..771e93a --- /dev/null +++ b/lox.t/operator/divide.lox @@ -0,0 +1,2 @@ +print 8 / 2; // expect: 4 +print 12.34 / 12.34; // expect: 1 diff --git a/lox.t/operator/divide_nonnum_num.lox b/lox.t/operator/divide_nonnum_num.lox new file mode 100644 index 0000000..e406498 --- /dev/null +++ b/lox.t/operator/divide_nonnum_num.lox @@ -0,0 +1 @@ +"1" / 1; // expect runtime error: Operands must be numbers. diff --git a/lox.t/operator/divide_num_nonnum.lox b/lox.t/operator/divide_num_nonnum.lox new file mode 100644 index 0000000..9596cc6 --- /dev/null +++ b/lox.t/operator/divide_num_nonnum.lox @@ -0,0 +1 @@ +1 / "1"; // expect runtime error: Operands must be numbers. diff --git a/lox.t/operator/equals.lox b/lox.t/operator/equals.lox new file mode 100644 index 0000000..3497062 --- /dev/null +++ b/lox.t/operator/equals.lox @@ -0,0 +1,14 @@ +print nil == nil; // expect: true + +print true == true; // expect: true +print true == false; // expect: false + +print 1 == 1; // expect: true +print 1 == 2; // expect: false + +print "str" == "str"; // expect: true +print "str" == "ing"; // expect: false + +print nil == false; // expect: false +print false == 0; // expect: false +print 0 == "0"; // expect: false diff --git a/lox.t/operator/equals_class.lox b/lox.t/operator/equals_class.lox new file mode 100644 index 0000000..e8477c7 --- /dev/null +++ b/lox.t/operator/equals_class.lox @@ -0,0 +1,13 @@ +// Bound methods have identity equality. +class Foo {} +class Bar {} + +print Foo == Foo; // expect: true +print Foo == Bar; // expect: false +print Bar == Foo; // expect: false +print Bar == Bar; // expect: true + +print Foo == "Foo"; // expect: false +print Foo == nil; // expect: false +print Foo == 123; // expect: false +print Foo == true; // expect: false diff --git a/lox.t/operator/equals_method.lox b/lox.t/operator/equals_method.lox new file mode 100644 index 0000000..31a7f9e --- /dev/null +++ b/lox.t/operator/equals_method.lox @@ -0,0 +1,13 @@ +// Bound methods have identity equality. +class Foo { + method() {} +} + +var foo = Foo(); +var fooMethod = foo.method; + +// Same bound method. +print fooMethod == fooMethod; // expect: true + +// Different closurizations. +print foo.method == foo.method; // expect: false diff --git a/lox.t/operator/greater_nonnum_num.lox b/lox.t/operator/greater_nonnum_num.lox new file mode 100644 index 0000000..4746c03 --- /dev/null +++ b/lox.t/operator/greater_nonnum_num.lox @@ -0,0 +1 @@ +"1" > 1; // expect runtime error: Operands must be numbers. diff --git a/lox.t/operator/greater_num_nonnum.lox b/lox.t/operator/greater_num_nonnum.lox new file mode 100644 index 0000000..e06f67d --- /dev/null +++ b/lox.t/operator/greater_num_nonnum.lox @@ -0,0 +1 @@ +1 > "1"; // expect runtime error: Operands must be numbers. diff --git a/lox.t/operator/greater_or_equal_nonnum_num.lox b/lox.t/operator/greater_or_equal_nonnum_num.lox new file mode 100644 index 0000000..67994c6 --- /dev/null +++ b/lox.t/operator/greater_or_equal_nonnum_num.lox @@ -0,0 +1 @@ +"1" >= 1; // expect runtime error: Operands must be numbers. diff --git a/lox.t/operator/greater_or_equal_num_nonnum.lox b/lox.t/operator/greater_or_equal_num_nonnum.lox new file mode 100644 index 0000000..592eab4 --- /dev/null +++ b/lox.t/operator/greater_or_equal_num_nonnum.lox @@ -0,0 +1 @@ +1 >= "1"; // expect runtime error: Operands must be numbers. diff --git a/lox.t/operator/less_nonnum_num.lox b/lox.t/operator/less_nonnum_num.lox new file mode 100644 index 0000000..38a75db --- /dev/null +++ b/lox.t/operator/less_nonnum_num.lox @@ -0,0 +1 @@ +"1" < 1; // expect runtime error: Operands must be numbers. diff --git a/lox.t/operator/less_num_nonnum.lox b/lox.t/operator/less_num_nonnum.lox new file mode 100644 index 0000000..3abfe24 --- /dev/null +++ b/lox.t/operator/less_num_nonnum.lox @@ -0,0 +1 @@ +1 < "1"; // expect runtime error: Operands must be numbers. diff --git a/lox.t/operator/less_or_equal_nonnum_num.lox b/lox.t/operator/less_or_equal_nonnum_num.lox new file mode 100644 index 0000000..2bad506 --- /dev/null +++ b/lox.t/operator/less_or_equal_nonnum_num.lox @@ -0,0 +1 @@ +"1" <= 1; // expect runtime error: Operands must be numbers. diff --git a/lox.t/operator/less_or_equal_num_nonnum.lox b/lox.t/operator/less_or_equal_num_nonnum.lox new file mode 100644 index 0000000..c5daf7b --- /dev/null +++ b/lox.t/operator/less_or_equal_num_nonnum.lox @@ -0,0 +1 @@ +1 <= "1"; // expect runtime error: Operands must be numbers. diff --git a/lox.t/operator/multiply.lox b/lox.t/operator/multiply.lox new file mode 100644 index 0000000..ff459f3 --- /dev/null +++ b/lox.t/operator/multiply.lox @@ -0,0 +1,2 @@ +print 5 * 3; // expect: 15 +print 12.34 * 0.3; // expect: 3.702 diff --git a/lox.t/operator/multiply_nonnum_num.lox b/lox.t/operator/multiply_nonnum_num.lox new file mode 100644 index 0000000..fdeeb96 --- /dev/null +++ b/lox.t/operator/multiply_nonnum_num.lox @@ -0,0 +1 @@ +"1" * 1; // expect runtime error: Operands must be numbers. diff --git a/lox.t/operator/multiply_num_nonnum.lox b/lox.t/operator/multiply_num_nonnum.lox new file mode 100644 index 0000000..58fb3ae --- /dev/null +++ b/lox.t/operator/multiply_num_nonnum.lox @@ -0,0 +1 @@ +1 * "1"; // expect runtime error: Operands must be numbers. diff --git a/lox.t/operator/negate.lox b/lox.t/operator/negate.lox new file mode 100644 index 0000000..ea5d247 --- /dev/null +++ b/lox.t/operator/negate.lox @@ -0,0 +1,3 @@ +print -(3); // expect: -3 +print --(3); // expect: 3 +print ---(3); // expect: -3 diff --git a/lox.t/operator/negate_nonnum.lox b/lox.t/operator/negate_nonnum.lox new file mode 100644 index 0000000..e76792f --- /dev/null +++ b/lox.t/operator/negate_nonnum.lox @@ -0,0 +1 @@ +-"s"; // expect runtime error: Operand must be a number. diff --git a/lox.t/operator/not.lox b/lox.t/operator/not.lox new file mode 100644 index 0000000..869e06e --- /dev/null +++ b/lox.t/operator/not.lox @@ -0,0 +1,13 @@ +print !true; // expect: false +print !false; // expect: true +print !!true; // expect: true + +print !123; // expect: false +print !0; // expect: false + +print !nil; // expect: true + +print !""; // expect: false + +fun foo() {} +print !foo; // expect: false diff --git a/lox.t/operator/not_class.lox b/lox.t/operator/not_class.lox new file mode 100644 index 0000000..d76acec --- /dev/null +++ b/lox.t/operator/not_class.lox @@ -0,0 +1,3 @@ +class Bar {} +print !Bar; // expect: false +print !Bar(); // expect: false diff --git a/lox.t/operator/not_equals.lox b/lox.t/operator/not_equals.lox new file mode 100644 index 0000000..e0c24ea --- /dev/null +++ b/lox.t/operator/not_equals.lox @@ -0,0 +1,14 @@ +print nil != nil; // expect: false + +print true != true; // expect: false +print true != false; // expect: true + +print 1 != 1; // expect: false +print 1 != 2; // expect: true + +print "str" != "str"; // expect: false +print "str" != "ing"; // expect: true + +print nil != false; // expect: true +print false != 0; // expect: true +print 0 != "0"; // expect: true diff --git a/lox.t/operator/subtract.lox b/lox.t/operator/subtract.lox new file mode 100644 index 0000000..234bb8c --- /dev/null +++ b/lox.t/operator/subtract.lox @@ -0,0 +1,2 @@ +print 4 - 3; // expect: 1 +print 1.2 - 1.2; // expect: 0 diff --git a/lox.t/operator/subtract_nonnum_num.lox b/lox.t/operator/subtract_nonnum_num.lox new file mode 100644 index 0000000..2accd9f --- /dev/null +++ b/lox.t/operator/subtract_nonnum_num.lox @@ -0,0 +1 @@ +"1" - 1; // expect runtime error: Operands must be numbers. diff --git a/lox.t/operator/subtract_num_nonnum.lox b/lox.t/operator/subtract_num_nonnum.lox new file mode 100644 index 0000000..c7a4d68 --- /dev/null +++ b/lox.t/operator/subtract_num_nonnum.lox @@ -0,0 +1 @@ +1 - "1"; // expect runtime error: Operands must be numbers. diff --git a/lox.t/precedence.lox b/lox.t/precedence.lox new file mode 100644 index 0000000..f4d7a35 --- /dev/null +++ b/lox.t/precedence.lox @@ -0,0 +1,32 @@ +// * has higher precedence than +. +print 2 + 3 * 4; // expect: 14 + +// * has higher precedence than -. +print 20 - 3 * 4; // expect: 8 + +// / has higher precedence than +. +print 2 + 6 / 3; // expect: 4 + +// / has higher precedence than -. +print 2 - 6 / 3; // expect: 0 + +// < has higher precedence than ==. +print false == 2 < 1; // expect: true + +// > has higher precedence than ==. +print false == 1 > 2; // expect: true + +// <= has higher precedence than ==. +print false == 2 <= 1; // expect: true + +// >= has higher precedence than ==. +print false == 1 >= 2; // expect: true + +// 1 - 1 is not space-sensitive. +print 1 - 1; // expect: 0 +print 1 -1; // expect: 0 +print 1- 1; // expect: 0 +print 1-1; // expect: 0 + +// Using () for grouping. +print (2 * (6 - (2 + 2))); // expect: 4 diff --git a/lox.t/print/missing_argument.lox b/lox.t/print/missing_argument.lox new file mode 100644 index 0000000..78bf2c1 --- /dev/null +++ b/lox.t/print/missing_argument.lox @@ -0,0 +1,2 @@ +// [line 2] Error at ';': Expect expression. +print; diff --git a/lox.t/regression/394.lox b/lox.t/regression/394.lox new file mode 100644 index 0000000..77dd4fa --- /dev/null +++ b/lox.t/regression/394.lox @@ -0,0 +1,5 @@ +{ + class A {} + class B < A {} + print B; // expect: B +} diff --git a/lox.t/regression/40.lox b/lox.t/regression/40.lox new file mode 100644 index 0000000..37e0166 --- /dev/null +++ b/lox.t/regression/40.lox @@ -0,0 +1,22 @@ +fun caller(g) { + g(); + // g should be a function, not nil. + print g == nil; // expect: false +} + +fun callCaller() { + var capturedVar = "before"; + var a = "a"; + + fun f() { + // Commenting the next line out prevents the bug! + capturedVar = "after"; + + // Returning anything also fixes it, even nil: + //return nil; + } + + caller(f); +} + +callCaller(); diff --git a/lox.t/return/after_else.lox b/lox.t/return/after_else.lox new file mode 100644 index 0000000..115b112 --- /dev/null +++ b/lox.t/return/after_else.lox @@ -0,0 +1,5 @@ +fun f() { + if (false) "no"; else return "ok"; +} + +print f(); // expect: ok diff --git a/lox.t/return/after_if.lox b/lox.t/return/after_if.lox new file mode 100644 index 0000000..773ade6 --- /dev/null +++ b/lox.t/return/after_if.lox @@ -0,0 +1,5 @@ +fun f() { + if (true) return "ok"; +} + +print f(); // expect: ok diff --git a/lox.t/return/after_while.lox b/lox.t/return/after_while.lox new file mode 100644 index 0000000..1c8d715 --- /dev/null +++ b/lox.t/return/after_while.lox @@ -0,0 +1,5 @@ +fun f() { + while (true) return "ok"; +} + +print f(); // expect: ok diff --git a/lox.t/return/at_top_level.lox b/lox.t/return/at_top_level.lox new file mode 100644 index 0000000..22f39df --- /dev/null +++ b/lox.t/return/at_top_level.lox @@ -0,0 +1 @@ +return "wat"; // Error at 'return': Can't return from top-level code. diff --git a/lox.t/return/in_function.lox b/lox.t/return/in_function.lox new file mode 100644 index 0000000..2379c7d --- /dev/null +++ b/lox.t/return/in_function.lox @@ -0,0 +1,6 @@ +fun f() { + return "ok"; + print "bad"; +} + +print f(); // expect: ok diff --git a/lox.t/return/in_method.lox b/lox.t/return/in_method.lox new file mode 100644 index 0000000..13e6d28 --- /dev/null +++ b/lox.t/return/in_method.lox @@ -0,0 +1,8 @@ +class Foo { + method() { + return "ok"; + print "bad"; + } +} + +print Foo().method(); // expect: ok diff --git a/lox.t/return/return_nil_if_no_value.lox b/lox.t/return/return_nil_if_no_value.lox new file mode 100644 index 0000000..df88075 --- /dev/null +++ b/lox.t/return/return_nil_if_no_value.lox @@ -0,0 +1,6 @@ +fun f() { + return; + print "bad"; +} + +print f(); // expect: nil diff --git a/lox.t/run.t b/lox.t/run.t new file mode 100644 index 0000000..7044854 --- /dev/null +++ b/lox.t/run.t @@ -0,0 +1,1082 @@ +$ for lox_file in *.lox **/*.lox; do +> mlox $lox_file > /dev/null || echo $lox_file failed +> done +unexpected_character.lox failed +string/unterminated.lox failed + + + +file empty_file.lox + $ mlox empty_file.lox > /dev/null + + +file precedence.lox + $ mlox precedence.lox > /dev/null + + +file unexpected_character.lox + $ mlox unexpected_character.lox + found 1 LexerError: + LexerError at line 3, column 6: Unexpected character '|' + [1] + + +file assignment/associativity.lox + $ mlox assignment/associativity.lox > /dev/null + + +file assignment/global.lox + $ mlox assignment/global.lox > /dev/null + + +file assignment/grouping.lox + $ mlox assignment/grouping.lox > /dev/null + + +file assignment/infix_operator.lox + $ mlox assignment/infix_operator.lox > /dev/null + + +file assignment/local.lox + $ mlox assignment/local.lox > /dev/null + + +file assignment/prefix_operator.lox + $ mlox assignment/prefix_operator.lox > /dev/null + + +file assignment/syntax.lox + $ mlox assignment/syntax.lox > /dev/null + + +file assignment/to_this.lox + $ mlox assignment/to_this.lox > /dev/null + + +file assignment/undefined.lox + $ mlox assignment/undefined.lox > /dev/null + + +file benchmark/binary_trees.lox + $ mlox benchmark/binary_trees.lox > /dev/null + + +file benchmark/equality.lox + $ mlox benchmark/equality.lox > /dev/null + + +file benchmark/fib.lox + $ mlox benchmark/fib.lox > /dev/null + + +file benchmark/instantiation.lox + $ mlox benchmark/instantiation.lox > /dev/null + + +file benchmark/invocation.lox + $ mlox benchmark/invocation.lox > /dev/null + + +file benchmark/method_call.lox + $ mlox benchmark/method_call.lox > /dev/null + + +file benchmark/properties.lox + $ mlox benchmark/properties.lox > /dev/null + + +file benchmark/string_equality.lox + $ mlox benchmark/string_equality.lox > /dev/null + + +file benchmark/trees.lox + $ mlox benchmark/trees.lox > /dev/null + + +file benchmark/zoo.lox + $ mlox benchmark/zoo.lox > /dev/null + + +file benchmark/zoo_batch.lox + $ mlox benchmark/zoo_batch.lox > /dev/null + + +file block/empty.lox + $ mlox block/empty.lox > /dev/null + + +file block/scope.lox + $ mlox block/scope.lox > /dev/null + + +file bool/equality.lox + $ mlox bool/equality.lox > /dev/null + + +file bool/not.lox + $ mlox bool/not.lox > /dev/null + + +file call/bool.lox + $ mlox call/bool.lox > /dev/null + + +file call/nil.lox + $ mlox call/nil.lox > /dev/null + + +file call/num.lox + $ mlox call/num.lox > /dev/null + + +file call/object.lox + $ mlox call/object.lox > /dev/null + + +file call/string.lox + $ mlox call/string.lox > /dev/null + + +file class/empty.lox + $ mlox class/empty.lox > /dev/null + + +file class/inherit_self.lox + $ mlox class/inherit_self.lox > /dev/null + + +file class/inherited_method.lox + $ mlox class/inherited_method.lox > /dev/null + + +file class/local_inherit_other.lox + $ mlox class/local_inherit_other.lox > /dev/null + + +file class/local_inherit_self.lox + $ mlox class/local_inherit_self.lox > /dev/null + + +file class/local_reference_self.lox + $ mlox class/local_reference_self.lox > /dev/null + + +file class/reference_self.lox + $ mlox class/reference_self.lox > /dev/null + + +file closure/assign_to_closure.lox + $ mlox closure/assign_to_closure.lox > /dev/null + + +file closure/assign_to_shadowed_later.lox + $ mlox closure/assign_to_shadowed_later.lox > /dev/null + + +file closure/close_over_function_parameter.lox + $ mlox closure/close_over_function_parameter.lox > /dev/null + + +file closure/close_over_later_variable.lox + $ mlox closure/close_over_later_variable.lox > /dev/null + + +file closure/close_over_method_parameter.lox + $ mlox closure/close_over_method_parameter.lox > /dev/null + + +file closure/closed_closure_in_function.lox + $ mlox closure/closed_closure_in_function.lox > /dev/null + + +file closure/nested_closure.lox + $ mlox closure/nested_closure.lox > /dev/null + + +file closure/open_closure_in_function.lox + $ mlox closure/open_closure_in_function.lox > /dev/null + + +file closure/reference_closure_multiple_times.lox + $ mlox closure/reference_closure_multiple_times.lox > /dev/null + + +file closure/reuse_closure_slot.lox + $ mlox closure/reuse_closure_slot.lox > /dev/null + + +file closure/shadow_closure_with_local.lox + $ mlox closure/shadow_closure_with_local.lox > /dev/null + + +file closure/unused_closure.lox + $ mlox closure/unused_closure.lox > /dev/null + + +file closure/unused_later_closure.lox + $ mlox closure/unused_later_closure.lox > /dev/null + + +file comments/line_at_eof.lox + $ mlox comments/line_at_eof.lox > /dev/null + + +file comments/only_line_comment.lox + $ mlox comments/only_line_comment.lox > /dev/null + + +file comments/only_line_comment_and_line.lox + $ mlox comments/only_line_comment_and_line.lox > /dev/null + + +file comments/unicode.lox + $ mlox comments/unicode.lox > /dev/null + + +file constructor/arguments.lox + $ mlox constructor/arguments.lox > /dev/null + + +file constructor/call_init_early_return.lox + $ mlox constructor/call_init_early_return.lox > /dev/null + + +file constructor/call_init_explicitly.lox + $ mlox constructor/call_init_explicitly.lox > /dev/null + + +file constructor/default.lox + $ mlox constructor/default.lox > /dev/null + + +file constructor/default_arguments.lox + $ mlox constructor/default_arguments.lox > /dev/null + + +file constructor/early_return.lox + $ mlox constructor/early_return.lox > /dev/null + + +file constructor/extra_arguments.lox + $ mlox constructor/extra_arguments.lox > /dev/null + + +file constructor/init_not_method.lox + $ mlox constructor/init_not_method.lox > /dev/null + + +file constructor/missing_arguments.lox + $ mlox constructor/missing_arguments.lox > /dev/null + + +file constructor/return_in_nested_function.lox + $ mlox constructor/return_in_nested_function.lox > /dev/null + + +file constructor/return_value.lox + $ mlox constructor/return_value.lox > /dev/null + + +file empty_file.lox + $ mlox empty_file.lox > /dev/null + + +file expressions/evaluate.lox + $ mlox expressions/evaluate.lox > /dev/null + + +file expressions/parse.lox + $ mlox expressions/parse.lox > /dev/null + + +file field/call_function_field.lox + $ mlox field/call_function_field.lox > /dev/null + + +file field/call_nonfunction_field.lox + $ mlox field/call_nonfunction_field.lox > /dev/null + + +file field/get_and_set_method.lox + $ mlox field/get_and_set_method.lox > /dev/null + + +file field/get_on_bool.lox + $ mlox field/get_on_bool.lox > /dev/null + + +file field/get_on_class.lox + $ mlox field/get_on_class.lox > /dev/null + + +file field/get_on_function.lox + $ mlox field/get_on_function.lox > /dev/null + + +file field/get_on_nil.lox + $ mlox field/get_on_nil.lox > /dev/null + + +file field/get_on_num.lox + $ mlox field/get_on_num.lox > /dev/null + + +file field/get_on_string.lox + $ mlox field/get_on_string.lox > /dev/null + + +file field/many.lox + $ mlox field/many.lox > /dev/null + + +file field/method.lox + $ mlox field/method.lox > /dev/null + + +file field/method_binds_this.lox + $ mlox field/method_binds_this.lox > /dev/null + + +file field/on_instance.lox + $ mlox field/on_instance.lox > /dev/null + + +file field/set_evaluation_order.lox + $ mlox field/set_evaluation_order.lox > /dev/null + + +file field/set_on_bool.lox + $ mlox field/set_on_bool.lox > /dev/null + + +file field/set_on_class.lox + $ mlox field/set_on_class.lox > /dev/null + + +file field/set_on_function.lox + $ mlox field/set_on_function.lox > /dev/null + + +file field/set_on_nil.lox + $ mlox field/set_on_nil.lox > /dev/null + + +file field/set_on_num.lox + $ mlox field/set_on_num.lox > /dev/null + + +file field/set_on_string.lox + $ mlox field/set_on_string.lox > /dev/null + + +file field/undefined.lox + $ mlox field/undefined.lox > /dev/null + + +file for/class_in_body.lox + $ mlox for/class_in_body.lox > /dev/null + + +file for/closure_in_body.lox + $ mlox for/closure_in_body.lox > /dev/null + + +file for/fun_in_body.lox + $ mlox for/fun_in_body.lox > /dev/null + + +file for/return_closure.lox + $ mlox for/return_closure.lox > /dev/null + + +file for/return_inside.lox + $ mlox for/return_inside.lox > /dev/null + + +file for/scope.lox + $ mlox for/scope.lox > /dev/null + + +file for/statement_condition.lox + $ mlox for/statement_condition.lox > /dev/null + + +file for/statement_increment.lox + $ mlox for/statement_increment.lox > /dev/null + + +file for/statement_initializer.lox + $ mlox for/statement_initializer.lox > /dev/null + + +file for/syntax.lox + $ mlox for/syntax.lox > /dev/null + + +file for/var_in_body.lox + $ mlox for/var_in_body.lox > /dev/null + + +file function/body_must_be_block.lox + $ mlox function/body_must_be_block.lox > /dev/null + + +file function/empty_body.lox + $ mlox function/empty_body.lox > /dev/null + + +file function/extra_arguments.lox + $ mlox function/extra_arguments.lox > /dev/null + + +file function/local_mutual_recursion.lox + $ mlox function/local_mutual_recursion.lox > /dev/null + + +file function/local_recursion.lox + $ mlox function/local_recursion.lox > /dev/null + + +file function/missing_arguments.lox + $ mlox function/missing_arguments.lox > /dev/null + + +file function/missing_comma_in_parameters.lox + $ mlox function/missing_comma_in_parameters.lox > /dev/null + + +file function/mutual_recursion.lox + $ mlox function/mutual_recursion.lox > /dev/null + + +file function/nested_call_with_arguments.lox + $ mlox function/nested_call_with_arguments.lox > /dev/null + + +file function/parameters.lox + $ mlox function/parameters.lox > /dev/null + + +file function/print.lox + $ mlox function/print.lox > /dev/null + + +file function/recursion.lox + $ mlox function/recursion.lox > /dev/null + + +file function/too_many_arguments.lox + $ mlox function/too_many_arguments.lox > /dev/null + + +file function/too_many_parameters.lox + $ mlox function/too_many_parameters.lox > /dev/null + + +file if/class_in_else.lox + $ mlox if/class_in_else.lox > /dev/null + + +file if/class_in_then.lox + $ mlox if/class_in_then.lox > /dev/null + + +file if/dangling_else.lox + $ mlox if/dangling_else.lox > /dev/null + + +file if/else.lox + $ mlox if/else.lox > /dev/null + + +file if/fun_in_else.lox + $ mlox if/fun_in_else.lox > /dev/null + + +file if/fun_in_then.lox + $ mlox if/fun_in_then.lox > /dev/null + + +file if/if.lox + $ mlox if/if.lox > /dev/null + + +file if/truth.lox + $ mlox if/truth.lox > /dev/null + + +file if/var_in_else.lox + $ mlox if/var_in_else.lox > /dev/null + + +file if/var_in_then.lox + $ mlox if/var_in_then.lox > /dev/null + + +file inheritance/constructor.lox + $ mlox inheritance/constructor.lox > /dev/null + + +file inheritance/inherit_from_function.lox + $ mlox inheritance/inherit_from_function.lox > /dev/null + + +file inheritance/inherit_from_nil.lox + $ mlox inheritance/inherit_from_nil.lox > /dev/null + + +file inheritance/inherit_from_number.lox + $ mlox inheritance/inherit_from_number.lox > /dev/null + + +file inheritance/inherit_methods.lox + $ mlox inheritance/inherit_methods.lox > /dev/null + + +file inheritance/parenthesized_superclass.lox + $ mlox inheritance/parenthesized_superclass.lox > /dev/null + + +file inheritance/set_fields_from_base_class.lox + $ mlox inheritance/set_fields_from_base_class.lox > /dev/null + + +file limit/loop_too_large.lox + $ mlox limit/loop_too_large.lox > /dev/null + + +file limit/no_reuse_constants.lox + $ mlox limit/no_reuse_constants.lox > /dev/null + + +file limit/stack_overflow.lox + $ mlox limit/stack_overflow.lox > /dev/null + + +file limit/too_many_constants.lox + $ mlox limit/too_many_constants.lox > /dev/null + + +file limit/too_many_locals.lox + $ mlox limit/too_many_locals.lox > /dev/null + + +file limit/too_many_upvalues.lox + $ mlox limit/too_many_upvalues.lox > /dev/null + + +file logical_operator/and.lox + $ mlox logical_operator/and.lox > /dev/null + + +file logical_operator/and_truth.lox + $ mlox logical_operator/and_truth.lox > /dev/null + + +file logical_operator/or.lox + $ mlox logical_operator/or.lox > /dev/null + + +file logical_operator/or_truth.lox + $ mlox logical_operator/or_truth.lox > /dev/null + + +file method/arity.lox + $ mlox method/arity.lox > /dev/null + + +file method/empty_block.lox + $ mlox method/empty_block.lox > /dev/null + + +file method/extra_arguments.lox + $ mlox method/extra_arguments.lox > /dev/null + + +file method/missing_arguments.lox + $ mlox method/missing_arguments.lox > /dev/null + + +file method/not_found.lox + $ mlox method/not_found.lox > /dev/null + + +file method/print_bound_method.lox + $ mlox method/print_bound_method.lox > /dev/null + + +file method/refer_to_name.lox + $ mlox method/refer_to_name.lox > /dev/null + + +file method/too_many_arguments.lox + $ mlox method/too_many_arguments.lox > /dev/null + + +file method/too_many_parameters.lox + $ mlox method/too_many_parameters.lox > /dev/null + + +file nil/literal.lox + $ mlox nil/literal.lox > /dev/null + + +file number/decimal_point_at_eof.lox + $ mlox number/decimal_point_at_eof.lox > /dev/null + + +file number/leading_dot.lox + $ mlox number/leading_dot.lox > /dev/null + + +file number/literals.lox + $ mlox number/literals.lox > /dev/null + + +file number/nan_equality.lox + $ mlox number/nan_equality.lox > /dev/null + + +file number/trailing_dot.lox + $ mlox number/trailing_dot.lox > /dev/null + + +file operator/add.lox + $ mlox operator/add.lox > /dev/null + + +file operator/add_bool_nil.lox + $ mlox operator/add_bool_nil.lox > /dev/null + + +file operator/add_bool_num.lox + $ mlox operator/add_bool_num.lox > /dev/null + + +file operator/add_bool_string.lox + $ mlox operator/add_bool_string.lox > /dev/null + + +file operator/add_nil_nil.lox + $ mlox operator/add_nil_nil.lox > /dev/null + + +file operator/add_num_nil.lox + $ mlox operator/add_num_nil.lox > /dev/null + + +file operator/add_string_nil.lox + $ mlox operator/add_string_nil.lox > /dev/null + + +file operator/comparison.lox + $ mlox operator/comparison.lox > /dev/null + + +file operator/divide.lox + $ mlox operator/divide.lox > /dev/null + + +file operator/divide_nonnum_num.lox + $ mlox operator/divide_nonnum_num.lox > /dev/null + + +file operator/divide_num_nonnum.lox + $ mlox operator/divide_num_nonnum.lox > /dev/null + + +file operator/equals.lox + $ mlox operator/equals.lox > /dev/null + + +file operator/equals_class.lox + $ mlox operator/equals_class.lox > /dev/null + + +file operator/equals_method.lox + $ mlox operator/equals_method.lox > /dev/null + + +file operator/greater_nonnum_num.lox + $ mlox operator/greater_nonnum_num.lox > /dev/null + + +file operator/greater_num_nonnum.lox + $ mlox operator/greater_num_nonnum.lox > /dev/null + + +file operator/greater_or_equal_nonnum_num.lox + $ mlox operator/greater_or_equal_nonnum_num.lox > /dev/null + + +file operator/greater_or_equal_num_nonnum.lox + $ mlox operator/greater_or_equal_num_nonnum.lox > /dev/null + + +file operator/less_nonnum_num.lox + $ mlox operator/less_nonnum_num.lox > /dev/null + + +file operator/less_num_nonnum.lox + $ mlox operator/less_num_nonnum.lox > /dev/null + + +file operator/less_or_equal_nonnum_num.lox + $ mlox operator/less_or_equal_nonnum_num.lox > /dev/null + + +file operator/less_or_equal_num_nonnum.lox + $ mlox operator/less_or_equal_num_nonnum.lox > /dev/null + + +file operator/multiply.lox + $ mlox operator/multiply.lox > /dev/null + + +file operator/multiply_nonnum_num.lox + $ mlox operator/multiply_nonnum_num.lox > /dev/null + + +file operator/multiply_num_nonnum.lox + $ mlox operator/multiply_num_nonnum.lox > /dev/null + + +file operator/negate.lox + $ mlox operator/negate.lox > /dev/null + + +file operator/negate_nonnum.lox + $ mlox operator/negate_nonnum.lox > /dev/null + + +file operator/not.lox + $ mlox operator/not.lox > /dev/null + + +file operator/not_class.lox + $ mlox operator/not_class.lox > /dev/null + + +file operator/not_equals.lox + $ mlox operator/not_equals.lox > /dev/null + + +file operator/subtract.lox + $ mlox operator/subtract.lox > /dev/null + + +file operator/subtract_nonnum_num.lox + $ mlox operator/subtract_nonnum_num.lox > /dev/null + + +file operator/subtract_num_nonnum.lox + $ mlox operator/subtract_num_nonnum.lox > /dev/null + + +file precedence.lox + $ mlox precedence.lox > /dev/null + + +file print/missing_argument.lox + $ mlox print/missing_argument.lox > /dev/null + + +file regression/40.lox + $ mlox regression/40.lox > /dev/null + + +file regression/394.lox + $ mlox regression/394.lox > /dev/null + + +file return/after_else.lox + $ mlox return/after_else.lox > /dev/null + + +file return/after_if.lox + $ mlox return/after_if.lox > /dev/null + + +file return/after_while.lox + $ mlox return/after_while.lox > /dev/null + + +file return/at_top_level.lox + $ mlox return/at_top_level.lox > /dev/null + + +file return/in_function.lox + $ mlox return/in_function.lox > /dev/null + + +file return/in_method.lox + $ mlox return/in_method.lox > /dev/null + + +file return/return_nil_if_no_value.lox + $ mlox return/return_nil_if_no_value.lox > /dev/null + + +file scanning/identifiers.lox + $ mlox scanning/identifiers.lox > /dev/null + + +file scanning/keywords.lox + $ mlox scanning/keywords.lox > /dev/null + + +file scanning/numbers.lox + $ mlox scanning/numbers.lox > /dev/null + + +file scanning/punctuators.lox + $ mlox scanning/punctuators.lox > /dev/null + + +file scanning/strings.lox + $ mlox scanning/strings.lox > /dev/null + + +file scanning/whitespace.lox + $ mlox scanning/whitespace.lox > /dev/null + + +file string/error_after_multiline.lox + $ mlox string/error_after_multiline.lox > /dev/null + + +file string/literals.lox + $ mlox string/literals.lox > /dev/null + + +file string/multiline.lox + $ mlox string/multiline.lox > /dev/null + + +file string/unterminated.lox + $ mlox string/unterminated.lox + found 1 LexerError: + LexerError at line 2, column 0: Unterminated string literal + [1] + + +file super/bound_method.lox + $ mlox super/bound_method.lox > /dev/null + + +file super/call_other_method.lox + $ mlox super/call_other_method.lox > /dev/null + + +file super/call_same_method.lox + $ mlox super/call_same_method.lox > /dev/null + + +file super/closure.lox + $ mlox super/closure.lox > /dev/null + + +file super/constructor.lox + $ mlox super/constructor.lox > /dev/null + + +file super/extra_arguments.lox + $ mlox super/extra_arguments.lox > /dev/null + + +file super/indirectly_inherited.lox + $ mlox super/indirectly_inherited.lox > /dev/null + + +file super/missing_arguments.lox + $ mlox super/missing_arguments.lox > /dev/null + + +file super/no_superclass_bind.lox + $ mlox super/no_superclass_bind.lox > /dev/null + + +file super/no_superclass_call.lox + $ mlox super/no_superclass_call.lox > /dev/null + + +file super/no_superclass_method.lox + $ mlox super/no_superclass_method.lox > /dev/null + + +file super/parenthesized.lox + $ mlox super/parenthesized.lox > /dev/null + + +file super/reassign_superclass.lox + $ mlox super/reassign_superclass.lox > /dev/null + + +file super/super_at_top_level.lox + $ mlox super/super_at_top_level.lox > /dev/null + + +file super/super_in_closure_in_inherited_method.lox + $ mlox super/super_in_closure_in_inherited_method.lox > /dev/null + + +file super/super_in_inherited_method.lox + $ mlox super/super_in_inherited_method.lox > /dev/null + + +file super/super_in_top_level_function.lox + $ mlox super/super_in_top_level_function.lox > /dev/null + + +file super/super_without_dot.lox + $ mlox super/super_without_dot.lox > /dev/null + + +file super/super_without_name.lox + $ mlox super/super_without_name.lox > /dev/null + + +file super/this_in_superclass_method.lox + $ mlox super/this_in_superclass_method.lox > /dev/null + + +file this/closure.lox + $ mlox this/closure.lox > /dev/null + + +file this/nested_class.lox + $ mlox this/nested_class.lox > /dev/null + + +file this/nested_closure.lox + $ mlox this/nested_closure.lox > /dev/null + + +file this/this_at_top_level.lox + $ mlox this/this_at_top_level.lox > /dev/null + + +file this/this_in_method.lox + $ mlox this/this_in_method.lox > /dev/null + + +file this/this_in_top_level_function.lox + $ mlox this/this_in_top_level_function.lox > /dev/null + + +file variable/collide_with_parameter.lox + $ mlox variable/collide_with_parameter.lox > /dev/null + + +file variable/duplicate_local.lox + $ mlox variable/duplicate_local.lox > /dev/null + + +file variable/duplicate_parameter.lox + $ mlox variable/duplicate_parameter.lox > /dev/null + + +file variable/early_bound.lox + $ mlox variable/early_bound.lox > /dev/null + + +file variable/in_middle_of_block.lox + $ mlox variable/in_middle_of_block.lox > /dev/null + + +file variable/in_nested_block.lox + $ mlox variable/in_nested_block.lox > /dev/null + + +file variable/local_from_method.lox + $ mlox variable/local_from_method.lox > /dev/null + + +file variable/redeclare_global.lox + $ mlox variable/redeclare_global.lox > /dev/null + + +file variable/redefine_global.lox + $ mlox variable/redefine_global.lox > /dev/null + + +file variable/scope_reuse_in_different_blocks.lox + $ mlox variable/scope_reuse_in_different_blocks.lox > /dev/null + + +file variable/shadow_and_local.lox + $ mlox variable/shadow_and_local.lox > /dev/null + + +file variable/shadow_global.lox + $ mlox variable/shadow_global.lox > /dev/null + + +file variable/shadow_local.lox + $ mlox variable/shadow_local.lox > /dev/null + + +file variable/undefined_global.lox + $ mlox variable/undefined_global.lox > /dev/null + + +file variable/undefined_local.lox + $ mlox variable/undefined_local.lox > /dev/null + + +file variable/uninitialized.lox + $ mlox variable/uninitialized.lox > /dev/null + + +file variable/unreached_undefined.lox + $ mlox variable/unreached_undefined.lox > /dev/null + + +file variable/use_false_as_var.lox + $ mlox variable/use_false_as_var.lox > /dev/null + + +file variable/use_global_in_initializer.lox + $ mlox variable/use_global_in_initializer.lox > /dev/null + + +file variable/use_local_in_initializer.lox + $ mlox variable/use_local_in_initializer.lox > /dev/null + + +file variable/use_nil_as_var.lox + $ mlox variable/use_nil_as_var.lox > /dev/null + + +file variable/use_this_as_var.lox + $ mlox variable/use_this_as_var.lox > /dev/null + + +file while/class_in_body.lox + $ mlox while/class_in_body.lox > /dev/null + + +file while/closure_in_body.lox + $ mlox while/closure_in_body.lox > /dev/null + + +file while/fun_in_body.lox + $ mlox while/fun_in_body.lox > /dev/null + + +file while/return_closure.lox + $ mlox while/return_closure.lox > /dev/null + + +file while/return_inside.lox + $ mlox while/return_inside.lox > /dev/null + + +file while/syntax.lox + $ mlox while/syntax.lox > /dev/null + + +file while/var_in_body.lox + $ mlox while/var_in_body.lox > /dev/null + + diff --git a/lox.t/scanning/identifiers.lox b/lox.t/scanning/identifiers.lox new file mode 100644 index 0000000..ef8c098 --- /dev/null +++ b/lox.t/scanning/identifiers.lox @@ -0,0 +1,12 @@ +andy formless fo _ _123 _abc ab123 +abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890_ + +// expect: IDENTIFIER andy null +// expect: IDENTIFIER formless null +// expect: IDENTIFIER fo null +// expect: IDENTIFIER _ null +// expect: IDENTIFIER _123 null +// expect: IDENTIFIER _abc null +// expect: IDENTIFIER ab123 null +// expect: IDENTIFIER abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890_ null +// expect: EOF null diff --git a/lox.t/scanning/keywords.lox b/lox.t/scanning/keywords.lox new file mode 100644 index 0000000..e56d32e --- /dev/null +++ b/lox.t/scanning/keywords.lox @@ -0,0 +1,18 @@ +and class else false for fun if nil or return super this true var while + +// expect: AND and null +// expect: CLASS class null +// expect: ELSE else null +// expect: FALSE false null +// expect: FOR for null +// expect: FUN fun null +// expect: IF if null +// expect: NIL nil null +// expect: OR or null +// expect: RETURN return null +// expect: SUPER super null +// expect: THIS this null +// expect: TRUE true null +// expect: VAR var null +// expect: WHILE while null +// expect: EOF null diff --git a/lox.t/scanning/numbers.lox b/lox.t/scanning/numbers.lox new file mode 100644 index 0000000..185b5d0 --- /dev/null +++ b/lox.t/scanning/numbers.lox @@ -0,0 +1,12 @@ +123 +123.456 +.456 +123. + +// expect: NUMBER 123 123.0 +// expect: NUMBER 123.456 123.456 +// expect: DOT . null +// expect: NUMBER 456 456.0 +// expect: NUMBER 123 123.0 +// expect: DOT . null +// expect: EOF null diff --git a/lox.t/scanning/punctuators.lox b/lox.t/scanning/punctuators.lox new file mode 100644 index 0000000..824ec9a --- /dev/null +++ b/lox.t/scanning/punctuators.lox @@ -0,0 +1,21 @@ +(){};,+-*!===<=>=!=<>/. + +// expect: LEFT_PAREN ( null +// expect: RIGHT_PAREN ) null +// expect: LEFT_BRACE { null +// expect: RIGHT_BRACE } null +// expect: SEMICOLON ; null +// expect: COMMA , null +// expect: PLUS + null +// expect: MINUS - null +// expect: STAR * null +// expect: BANG_EQUAL != null +// expect: EQUAL_EQUAL == null +// expect: LESS_EQUAL <= null +// expect: GREATER_EQUAL >= null +// expect: BANG_EQUAL != null +// expect: LESS < null +// expect: GREATER > null +// expect: SLASH / null +// expect: DOT . null +// expect: EOF null diff --git a/lox.t/scanning/strings.lox b/lox.t/scanning/strings.lox new file mode 100644 index 0000000..55adfd1 --- /dev/null +++ b/lox.t/scanning/strings.lox @@ -0,0 +1,6 @@ +"" +"string" + +// expect: STRING "" +// expect: STRING "string" string +// expect: EOF null \ No newline at end of file diff --git a/lox.t/scanning/whitespace.lox b/lox.t/scanning/whitespace.lox new file mode 100644 index 0000000..27ac396 --- /dev/null +++ b/lox.t/scanning/whitespace.lox @@ -0,0 +1,12 @@ +space tabs newlines + + + + +end + +// expect: IDENTIFIER space null +// expect: IDENTIFIER tabs null +// expect: IDENTIFIER newlines null +// expect: IDENTIFIER end null +// expect: EOF null diff --git a/lox.t/string/error_after_multiline.lox b/lox.t/string/error_after_multiline.lox new file mode 100644 index 0000000..59bcbdf --- /dev/null +++ b/lox.t/string/error_after_multiline.lox @@ -0,0 +1,7 @@ +// Tests that we correctly track the line info across multiline strings. +var a = "1 +2 +3 +"; + +err; // // expect runtime error: Undefined variable 'err'. \ No newline at end of file diff --git a/lox.t/string/literals.lox b/lox.t/string/literals.lox new file mode 100644 index 0000000..986c6a7 --- /dev/null +++ b/lox.t/string/literals.lox @@ -0,0 +1,5 @@ +print "(" + "" + ")"; // expect: () +print "a string"; // expect: a string + +// Non-ASCII. +print "A~¶Þॐஃ"; // expect: A~¶Þॐஃ diff --git a/lox.t/string/multiline.lox b/lox.t/string/multiline.lox new file mode 100644 index 0000000..373232b --- /dev/null +++ b/lox.t/string/multiline.lox @@ -0,0 +1,7 @@ +var a = "1 +2 +3"; +print a; +// expect: 1 +// expect: 2 +// expect: 3 diff --git a/lox.t/string/unterminated.lox b/lox.t/string/unterminated.lox new file mode 100644 index 0000000..659625f --- /dev/null +++ b/lox.t/string/unterminated.lox @@ -0,0 +1,2 @@ +// [line 2] Error: Unterminated string. +"this string has no close quote diff --git a/lox.t/super/bound_method.lox b/lox.t/super/bound_method.lox new file mode 100644 index 0000000..42b60e3 --- /dev/null +++ b/lox.t/super/bound_method.lox @@ -0,0 +1,19 @@ +class A { + method(arg) { + print "A.method(" + arg + ")"; + } +} + +class B < A { + getClosure() { + return super.method; + } + + method(arg) { + print "B.method(" + arg + ")"; + } +} + + +var closure = B().getClosure(); +closure("arg"); // expect: A.method(arg) diff --git a/lox.t/super/call_other_method.lox b/lox.t/super/call_other_method.lox new file mode 100644 index 0000000..d37bfca --- /dev/null +++ b/lox.t/super/call_other_method.lox @@ -0,0 +1,16 @@ +class Base { + foo() { + print "Base.foo()"; + } +} + +class Derived < Base { + bar() { + print "Derived.bar()"; + super.foo(); + } +} + +Derived().bar(); +// expect: Derived.bar() +// expect: Base.foo() diff --git a/lox.t/super/call_same_method.lox b/lox.t/super/call_same_method.lox new file mode 100644 index 0000000..dcd3cc5 --- /dev/null +++ b/lox.t/super/call_same_method.lox @@ -0,0 +1,16 @@ +class Base { + foo() { + print "Base.foo()"; + } +} + +class Derived < Base { + foo() { + print "Derived.foo()"; + super.foo(); + } +} + +Derived().foo(); +// expect: Derived.foo() +// expect: Base.foo() diff --git a/lox.t/super/closure.lox b/lox.t/super/closure.lox new file mode 100644 index 0000000..6887afb --- /dev/null +++ b/lox.t/super/closure.lox @@ -0,0 +1,17 @@ +class Base { + toString() { return "Base"; } +} + +class Derived < Base { + getClosure() { + fun closure() { + return super.toString(); + } + return closure; + } + + toString() { return "Derived"; } +} + +var closure = Derived().getClosure(); +print closure(); // expect: Base diff --git a/lox.t/super/constructor.lox b/lox.t/super/constructor.lox new file mode 100644 index 0000000..eadacd8 --- /dev/null +++ b/lox.t/super/constructor.lox @@ -0,0 +1,16 @@ +class Base { + init(a, b) { + print "Base.init(" + a + ", " + b + ")"; + } +} + +class Derived < Base { + init() { + print "Derived.init()"; + super.init("a", "b"); + } +} + +Derived(); +// expect: Derived.init() +// expect: Base.init(a, b) diff --git a/lox.t/super/extra_arguments.lox b/lox.t/super/extra_arguments.lox new file mode 100644 index 0000000..b6b0735 --- /dev/null +++ b/lox.t/super/extra_arguments.lox @@ -0,0 +1,14 @@ +class Base { + foo(a, b) { + print "Base.foo(" + a + ", " + b + ")"; + } +} + +class Derived < Base { + foo() { + print "Derived.foo()"; // expect: Derived.foo() + super.foo("a", "b", "c", "d"); // expect runtime error: Expected 2 arguments but got 4. + } +} + +Derived().foo(); diff --git a/lox.t/super/indirectly_inherited.lox b/lox.t/super/indirectly_inherited.lox new file mode 100644 index 0000000..0a49e26 --- /dev/null +++ b/lox.t/super/indirectly_inherited.lox @@ -0,0 +1,18 @@ +class A { + foo() { + print "A.foo()"; + } +} + +class B < A {} + +class C < B { + foo() { + print "C.foo()"; + super.foo(); + } +} + +C().foo(); +// expect: C.foo() +// expect: A.foo() diff --git a/lox.t/super/missing_arguments.lox b/lox.t/super/missing_arguments.lox new file mode 100644 index 0000000..e055a6e --- /dev/null +++ b/lox.t/super/missing_arguments.lox @@ -0,0 +1,13 @@ +class Base { + foo(a, b) { + print "Base.foo(" + a + ", " + b + ")"; + } +} + +class Derived < Base { + foo() { + super.foo(1); // expect runtime error: Expected 2 arguments but got 1. + } +} + +Derived().foo(); diff --git a/lox.t/super/no_superclass_bind.lox b/lox.t/super/no_superclass_bind.lox new file mode 100644 index 0000000..bdb5fd6 --- /dev/null +++ b/lox.t/super/no_superclass_bind.lox @@ -0,0 +1,7 @@ +class Base { + foo() { + super.doesNotExist; // Error at 'super': Can't use 'super' in a class with no superclass. + } +} + +Base().foo(); diff --git a/lox.t/super/no_superclass_call.lox b/lox.t/super/no_superclass_call.lox new file mode 100644 index 0000000..d807e50 --- /dev/null +++ b/lox.t/super/no_superclass_call.lox @@ -0,0 +1,7 @@ +class Base { + foo() { + super.doesNotExist(1); // Error at 'super': Can't use 'super' in a class with no superclass. + } +} + +Base().foo(); diff --git a/lox.t/super/no_superclass_method.lox b/lox.t/super/no_superclass_method.lox new file mode 100644 index 0000000..89e6b17 --- /dev/null +++ b/lox.t/super/no_superclass_method.lox @@ -0,0 +1,9 @@ +class Base {} + +class Derived < Base { + foo() { + super.doesNotExist(1); // expect runtime error: Undefined property 'doesNotExist'. + } +} + +Derived().foo(); diff --git a/lox.t/super/parenthesized.lox b/lox.t/super/parenthesized.lox new file mode 100644 index 0000000..63fdc72 --- /dev/null +++ b/lox.t/super/parenthesized.lox @@ -0,0 +1,10 @@ +class A { + method() {} +} + +class B < A { + method() { + // [line 8] Error at ')': Expect '.' after 'super'. + (super).method(); + } +} diff --git a/lox.t/super/reassign_superclass.lox b/lox.t/super/reassign_superclass.lox new file mode 100644 index 0000000..cd918f8 --- /dev/null +++ b/lox.t/super/reassign_superclass.lox @@ -0,0 +1,22 @@ +class Base { + method() { + print "Base.method()"; + } +} + +class Derived < Base { + method() { + super.method(); + } +} + +class OtherBase { + method() { + print "OtherBase.method()"; + } +} + +var derived = Derived(); +derived.method(); // expect: Base.method() +Base = OtherBase; +derived.method(); // expect: Base.method() diff --git a/lox.t/super/super_at_top_level.lox b/lox.t/super/super_at_top_level.lox new file mode 100644 index 0000000..83c4213 --- /dev/null +++ b/lox.t/super/super_at_top_level.lox @@ -0,0 +1,2 @@ +super.foo("bar"); // Error at 'super': Can't use 'super' outside of a class. +super.foo; // Error at 'super': Can't use 'super' outside of a class. \ No newline at end of file diff --git a/lox.t/super/super_in_closure_in_inherited_method.lox b/lox.t/super/super_in_closure_in_inherited_method.lox new file mode 100644 index 0000000..c158895 --- /dev/null +++ b/lox.t/super/super_in_closure_in_inherited_method.lox @@ -0,0 +1,26 @@ +class A { + say() { + print "A"; + } +} + +class B < A { + getClosure() { + fun closure() { + super.say(); + } + return closure; + } + + say() { + print "B"; + } +} + +class C < B { + say() { + print "C"; + } +} + +C().getClosure()(); // expect: A diff --git a/lox.t/super/super_in_inherited_method.lox b/lox.t/super/super_in_inherited_method.lox new file mode 100644 index 0000000..a90e42a --- /dev/null +++ b/lox.t/super/super_in_inherited_method.lox @@ -0,0 +1,23 @@ +class A { + say() { + print "A"; + } +} + +class B < A { + test() { + super.say(); + } + + say() { + print "B"; + } +} + +class C < B { + say() { + print "C"; + } +} + +C().test(); // expect: A diff --git a/lox.t/super/super_in_top_level_function.lox b/lox.t/super/super_in_top_level_function.lox new file mode 100644 index 0000000..42997b1 --- /dev/null +++ b/lox.t/super/super_in_top_level_function.lox @@ -0,0 +1,3 @@ + super.bar(); // Error at 'super': Can't use 'super' outside of a class. +fun foo() { +} \ No newline at end of file diff --git a/lox.t/super/super_without_dot.lox b/lox.t/super/super_without_dot.lox new file mode 100644 index 0000000..3fe95a7 --- /dev/null +++ b/lox.t/super/super_without_dot.lox @@ -0,0 +1,8 @@ +class A {} + +class B < A { + method() { + // [line 6] Error at ';': Expect '.' after 'super'. + super; + } +} diff --git a/lox.t/super/super_without_name.lox b/lox.t/super/super_without_name.lox new file mode 100644 index 0000000..5917031 --- /dev/null +++ b/lox.t/super/super_without_name.lox @@ -0,0 +1,7 @@ +class A {} + +class B < A { + method() { + super.; // Error at ';': Expect superclass method name. + } +} diff --git a/lox.t/super/this_in_superclass_method.lox b/lox.t/super/this_in_superclass_method.lox new file mode 100644 index 0000000..57e58ab --- /dev/null +++ b/lox.t/super/this_in_superclass_method.lox @@ -0,0 +1,16 @@ +class Base { + init(a) { + this.a = a; + } +} + +class Derived < Base { + init(a, b) { + super.init(a); + this.b = b; + } +} + +var derived = Derived("a", "b"); +print derived.a; // expect: a +print derived.b; // expect: b diff --git a/lox.t/this/closure.lox b/lox.t/this/closure.lox new file mode 100644 index 0000000..b850963 --- /dev/null +++ b/lox.t/this/closure.lox @@ -0,0 +1,13 @@ +class Foo { + getClosure() { + fun closure() { + return this.toString(); + } + return closure; + } + + toString() { return "Foo"; } +} + +var closure = Foo().getClosure(); +print closure(); // expect: Foo diff --git a/lox.t/this/nested_class.lox b/lox.t/this/nested_class.lox new file mode 100644 index 0000000..588f101 --- /dev/null +++ b/lox.t/this/nested_class.lox @@ -0,0 +1,20 @@ +class Outer { + method() { + print this; // expect: Outer instance + + fun f() { + print this; // expect: Outer instance + + class Inner { + method() { + print this; // expect: Inner instance + } + } + + Inner().method(); + } + f(); + } +} + +Outer().method(); diff --git a/lox.t/this/nested_closure.lox b/lox.t/this/nested_closure.lox new file mode 100644 index 0000000..7c0f04f --- /dev/null +++ b/lox.t/this/nested_closure.lox @@ -0,0 +1,19 @@ +class Foo { + getClosure() { + fun f() { + fun g() { + fun h() { + return this.toString(); + } + return h; + } + return g; + } + return f; + } + + toString() { return "Foo"; } +} + +var closure = Foo().getClosure(); +print closure()()(); // expect: Foo diff --git a/lox.t/this/this_at_top_level.lox b/lox.t/this/this_at_top_level.lox new file mode 100644 index 0000000..918c806 --- /dev/null +++ b/lox.t/this/this_at_top_level.lox @@ -0,0 +1 @@ +this; // Error at 'this': Can't use 'this' outside of a class. diff --git a/lox.t/this/this_in_method.lox b/lox.t/this/this_in_method.lox new file mode 100644 index 0000000..e32dbba --- /dev/null +++ b/lox.t/this/this_in_method.lox @@ -0,0 +1,6 @@ +class Foo { + bar() { return this; } + baz() { return "baz"; } +} + +print Foo().bar().baz(); // expect: baz diff --git a/lox.t/this/this_in_top_level_function.lox b/lox.t/this/this_in_top_level_function.lox new file mode 100644 index 0000000..a564c43 --- /dev/null +++ b/lox.t/this/this_in_top_level_function.lox @@ -0,0 +1,3 @@ +fun foo() { + this; // Error at 'this': Can't use 'this' outside of a class. +} diff --git a/lox.t/unexpected_character.lox b/lox.t/unexpected_character.lox new file mode 100644 index 0000000..5e51396 --- /dev/null +++ b/lox.t/unexpected_character.lox @@ -0,0 +1,3 @@ +// [line 3] Error: Unexpected character. +// [java line 3] Error at 'b': Expect ')' after arguments. +foo(a | b); diff --git a/lox.t/variable/collide_with_parameter.lox b/lox.t/variable/collide_with_parameter.lox new file mode 100644 index 0000000..2c06bd1 --- /dev/null +++ b/lox.t/variable/collide_with_parameter.lox @@ -0,0 +1,3 @@ +fun foo(a) { + var a; // Error at 'a': Already a variable with this name in this scope. +} diff --git a/lox.t/variable/duplicate_local.lox b/lox.t/variable/duplicate_local.lox new file mode 100644 index 0000000..77cb951 --- /dev/null +++ b/lox.t/variable/duplicate_local.lox @@ -0,0 +1,4 @@ +{ + var a = "value"; + var a = "other"; // Error at 'a': Already a variable with this name in this scope. +} diff --git a/lox.t/variable/duplicate_parameter.lox b/lox.t/variable/duplicate_parameter.lox new file mode 100644 index 0000000..23c5049 --- /dev/null +++ b/lox.t/variable/duplicate_parameter.lox @@ -0,0 +1,4 @@ +fun foo(arg, + arg) { // Error at 'arg': Already a variable with this name in this scope. + "body"; +} diff --git a/lox.t/variable/early_bound.lox b/lox.t/variable/early_bound.lox new file mode 100644 index 0000000..4da3304 --- /dev/null +++ b/lox.t/variable/early_bound.lox @@ -0,0 +1,10 @@ +var a = "outer"; +{ + fun foo() { + print a; + } + + foo(); // expect: outer + var a = "inner"; + foo(); // expect: outer +} diff --git a/lox.t/variable/in_middle_of_block.lox b/lox.t/variable/in_middle_of_block.lox new file mode 100644 index 0000000..02a6ef7 --- /dev/null +++ b/lox.t/variable/in_middle_of_block.lox @@ -0,0 +1,10 @@ +{ + var a = "a"; + print a; // expect: a + var b = a + " b"; + print b; // expect: a b + var c = a + " c"; + print c; // expect: a c + var d = b + " d"; + print d; // expect: a b d +} diff --git a/lox.t/variable/in_nested_block.lox b/lox.t/variable/in_nested_block.lox new file mode 100644 index 0000000..5257fbe --- /dev/null +++ b/lox.t/variable/in_nested_block.lox @@ -0,0 +1,6 @@ +{ + var a = "outer"; + { + print a; // expect: outer + } +} \ No newline at end of file diff --git a/lox.t/variable/local_from_method.lox b/lox.t/variable/local_from_method.lox new file mode 100644 index 0000000..216ed54 --- /dev/null +++ b/lox.t/variable/local_from_method.lox @@ -0,0 +1,9 @@ +var foo = "variable"; + +class Foo { + method() { + print foo; + } +} + +Foo().method(); // expect: variable diff --git a/lox.t/variable/redeclare_global.lox b/lox.t/variable/redeclare_global.lox new file mode 100644 index 0000000..ed6cc2c --- /dev/null +++ b/lox.t/variable/redeclare_global.lox @@ -0,0 +1,3 @@ +var a = "1"; +var a; +print a; // expect: nil diff --git a/lox.t/variable/redefine_global.lox b/lox.t/variable/redefine_global.lox new file mode 100644 index 0000000..82d08c0 --- /dev/null +++ b/lox.t/variable/redefine_global.lox @@ -0,0 +1,3 @@ +var a = "1"; +var a = "2"; +print a; // expect: 2 diff --git a/lox.t/variable/scope_reuse_in_different_blocks.lox b/lox.t/variable/scope_reuse_in_different_blocks.lox new file mode 100644 index 0000000..e47932f --- /dev/null +++ b/lox.t/variable/scope_reuse_in_different_blocks.lox @@ -0,0 +1,9 @@ +{ + var a = "first"; + print a; // expect: first +} + +{ + var a = "second"; + print a; // expect: second +} diff --git a/lox.t/variable/shadow_and_local.lox b/lox.t/variable/shadow_and_local.lox new file mode 100644 index 0000000..6bbecbf --- /dev/null +++ b/lox.t/variable/shadow_and_local.lox @@ -0,0 +1,8 @@ +{ + var a = "outer"; + { + print a; // expect: outer + var a = "inner"; + print a; // expect: inner + } +} \ No newline at end of file diff --git a/lox.t/variable/shadow_global.lox b/lox.t/variable/shadow_global.lox new file mode 100644 index 0000000..fb7d68d --- /dev/null +++ b/lox.t/variable/shadow_global.lox @@ -0,0 +1,6 @@ +var a = "global"; +{ + var a = "shadow"; + print a; // expect: shadow +} +print a; // expect: global diff --git a/lox.t/variable/shadow_local.lox b/lox.t/variable/shadow_local.lox new file mode 100644 index 0000000..bdbfd10 --- /dev/null +++ b/lox.t/variable/shadow_local.lox @@ -0,0 +1,8 @@ +{ + var a = "local"; + { + var a = "shadow"; + print a; // expect: shadow + } + print a; // expect: local +} diff --git a/lox.t/variable/undefined_global.lox b/lox.t/variable/undefined_global.lox new file mode 100644 index 0000000..5ac89b8 --- /dev/null +++ b/lox.t/variable/undefined_global.lox @@ -0,0 +1 @@ +print notDefined; // expect runtime error: Undefined variable 'notDefined'. diff --git a/lox.t/variable/undefined_local.lox b/lox.t/variable/undefined_local.lox new file mode 100644 index 0000000..d196d59 --- /dev/null +++ b/lox.t/variable/undefined_local.lox @@ -0,0 +1,3 @@ +{ + print notDefined; // expect runtime error: Undefined variable 'notDefined'. +} diff --git a/lox.t/variable/uninitialized.lox b/lox.t/variable/uninitialized.lox new file mode 100644 index 0000000..4b174bb --- /dev/null +++ b/lox.t/variable/uninitialized.lox @@ -0,0 +1,2 @@ +var a; +print a; // expect: nil diff --git a/lox.t/variable/unreached_undefined.lox b/lox.t/variable/unreached_undefined.lox new file mode 100644 index 0000000..e7bf633 --- /dev/null +++ b/lox.t/variable/unreached_undefined.lox @@ -0,0 +1,5 @@ +if (false) { + print notDefined; +} + +print "ok"; // expect: ok diff --git a/lox.t/variable/use_false_as_var.lox b/lox.t/variable/use_false_as_var.lox new file mode 100644 index 0000000..206d51e --- /dev/null +++ b/lox.t/variable/use_false_as_var.lox @@ -0,0 +1,2 @@ +// [line 2] Error at 'false': Expect variable name. +var false = "value"; diff --git a/lox.t/variable/use_global_in_initializer.lox b/lox.t/variable/use_global_in_initializer.lox new file mode 100644 index 0000000..6e59cd5 --- /dev/null +++ b/lox.t/variable/use_global_in_initializer.lox @@ -0,0 +1,3 @@ +var a = "value"; +var a = a; +print a; // expect: value diff --git a/lox.t/variable/use_local_in_initializer.lox b/lox.t/variable/use_local_in_initializer.lox new file mode 100644 index 0000000..797a13c --- /dev/null +++ b/lox.t/variable/use_local_in_initializer.lox @@ -0,0 +1,4 @@ +var a = "outer"; +{ + var a = a; // Error at 'a': Can't read local variable in its own initializer. +} diff --git a/lox.t/variable/use_nil_as_var.lox b/lox.t/variable/use_nil_as_var.lox new file mode 100644 index 0000000..7624bce --- /dev/null +++ b/lox.t/variable/use_nil_as_var.lox @@ -0,0 +1,2 @@ +// [line 2] Error at 'nil': Expect variable name. +var nil = "value"; diff --git a/lox.t/variable/use_this_as_var.lox b/lox.t/variable/use_this_as_var.lox new file mode 100644 index 0000000..233a553 --- /dev/null +++ b/lox.t/variable/use_this_as_var.lox @@ -0,0 +1,2 @@ +// [line 2] Error at 'this': Expect variable name. +var this = "value"; diff --git a/lox.t/while/class_in_body.lox b/lox.t/while/class_in_body.lox new file mode 100644 index 0000000..c3cbe95 --- /dev/null +++ b/lox.t/while/class_in_body.lox @@ -0,0 +1,2 @@ +// [line 2] Error at 'class': Expect expression. +while (true) class Foo {} diff --git a/lox.t/while/closure_in_body.lox b/lox.t/while/closure_in_body.lox new file mode 100644 index 0000000..ebe00fa --- /dev/null +++ b/lox.t/while/closure_in_body.lox @@ -0,0 +1,19 @@ +var f1; +var f2; +var f3; + +var i = 1; +while (i < 4) { + var j = i; + fun f() { print j; } + + if (j == 1) f1 = f; + else if (j == 2) f2 = f; + else f3 = f; + + i = i + 1; +} + +f1(); // expect: 1 +f2(); // expect: 2 +f3(); // expect: 3 diff --git a/lox.t/while/fun_in_body.lox b/lox.t/while/fun_in_body.lox new file mode 100644 index 0000000..8a42a48 --- /dev/null +++ b/lox.t/while/fun_in_body.lox @@ -0,0 +1,2 @@ +// [line 2] Error at 'fun': Expect expression. +while (true) fun foo() {} diff --git a/lox.t/while/return_closure.lox b/lox.t/while/return_closure.lox new file mode 100644 index 0000000..fe2ee5a --- /dev/null +++ b/lox.t/while/return_closure.lox @@ -0,0 +1,10 @@ +fun f() { + while (true) { + var i = "i"; + fun g() { print i; } + return g; + } +} + +var h = f(); +h(); // expect: i diff --git a/lox.t/while/return_inside.lox b/lox.t/while/return_inside.lox new file mode 100644 index 0000000..11a7488 --- /dev/null +++ b/lox.t/while/return_inside.lox @@ -0,0 +1,9 @@ +fun f() { + while (true) { + var i = "i"; + return i; + } +} + +print f(); +// expect: i diff --git a/lox.t/while/syntax.lox b/lox.t/while/syntax.lox new file mode 100644 index 0000000..9f0fdeb --- /dev/null +++ b/lox.t/while/syntax.lox @@ -0,0 +1,21 @@ +// Single-expression body. +var c = 0; +while (c < 3) print c = c + 1; +// expect: 1 +// expect: 2 +// expect: 3 + +// Block body. +var a = 0; +while (a < 3) { + print a; + a = a + 1; +} +// expect: 0 +// expect: 1 +// expect: 2 + +// Statement bodies. +while (false) if (true) 1; else 2; +while (false) while (true) 1; +while (false) for (;;) 1; diff --git a/lox.t/while/var_in_body.lox b/lox.t/while/var_in_body.lox new file mode 100644 index 0000000..bafc2fd --- /dev/null +++ b/lox.t/while/var_in_body.lox @@ -0,0 +1,2 @@ +// [line 2] Error at 'var': Expect expression. +while (true) var foo; diff --git a/lox/test.lox b/lox/test.lox deleted file mode 100644 index 44ddf16..0000000 --- a/lox/test.lox +++ /dev/null @@ -1,3 +0,0 @@ -// test comment -"string" -{}(