From e5885e9ae2db52c6a2f73edf2c651510984917f9 Mon Sep 17 00:00:00 2001 From: hydroper Date: Wed, 8 May 2024 12:42:29 +0000 Subject: [PATCH] Automated report --- .github/workflows/demo.yml | 41 - .gitignore | 1 - Cargo.lock | 639 -- Cargo.toml | 8 - LICENSE | 202 - README.md | 19 - as3/promise/AggregateError.as | 10 - as3/promise/Promise.as | 354 -- as3/promise/PromiseHandler.as | 16 - crates/parser/Cargo.toml | 34 - crates/parser/README.md | 3 - crates/parser/compilation_unit.rs | 8 - crates/parser/compilation_unit/comment.rs | 59 - .../compilation_unit/compilation_unit.rs | 245 - crates/parser/compilation_unit/location.rs | 176 - crates/parser/diagnostics.rs | 6 - crates/parser/diagnostics/diagnostic_kind.rs | 77 - crates/parser/diagnostics/diagnostics.rs | 175 - .../diagnostics_english_resources.rs | 76 - crates/parser/lib.rs | 11 - crates/parser/ns.rs | 8 - crates/parser/operator.rs | 6 - crates/parser/operator/operator.rs | 127 - crates/parser/operator/operator_precedence.rs | 77 - crates/parser/parser.rs | 23 - crates/parser/parser/character_validator.rs | 147 - crates/parser/parser/context.rs | 174 - crates/parser/parser/css_parser.rs | 847 --- crates/parser/parser/css_tokenizer.rs | 434 -- crates/parser/parser/parser.rs | 5428 ----------------- crates/parser/parser/parser_error.rs | 20 - crates/parser/parser/reserved_word.rs | 110 - crates/parser/parser/token.rs | 470 -- crates/parser/parser/tokenizer.rs | 1305 ---- crates/parser/tree.rs | 165 - crates/parser/tree/array_literal.rs | 18 - crates/parser/tree/asdoc.rs | 52 - crates/parser/tree/assignment_expression.rs | 14 - crates/parser/tree/attributes.rs | 170 - crates/parser/tree/binary_expression.rs | 10 - crates/parser/tree/block.rs | 9 - crates/parser/tree/boolean_literal.rs | 8 - crates/parser/tree/break_statement.rs | 8 - crates/parser/tree/call_expression.rs | 9 - crates/parser/tree/class_definition.rs | 14 - .../parser/tree/computed_member_expression.rs | 12 - crates/parser/tree/conditional_expression.rs | 10 - crates/parser/tree/configuration_directive.rs | 33 - crates/parser/tree/continue_statement.rs | 8 - crates/parser/tree/css.rs | 471 -- .../tree/default_xml_namespace_statement.rs | 8 - crates/parser/tree/descendants_expression.rs | 9 - crates/parser/tree/destructuring.rs | 9 - crates/parser/tree/directive.rs | 82 - .../parser/tree/directive_injection_node.rs | 9 - crates/parser/tree/do_statement.rs | 10 - crates/parser/tree/empty_statement.rs | 7 - crates/parser/tree/enum_definition.rs | 13 - crates/parser/tree/expression.rs | 276 - crates/parser/tree/expression_statement.rs | 8 - .../tree/expression_with_type_arguments.rs | 10 - crates/parser/tree/filter_expression.rs | 10 - crates/parser/tree/for_statement.rs | 32 - crates/parser/tree/function_definition.rs | 111 - crates/parser/tree/function_expression.rs | 9 - crates/parser/tree/if_statement.rs | 10 - crates/parser/tree/import_directive.rs | 27 - crates/parser/tree/import_meta.rs | 8 - crates/parser/tree/include_directive.rs | 12 - crates/parser/tree/interface_definition.rs | 13 - crates/parser/tree/invalidated_node.rs | 8 - crates/parser/tree/labeled_statement.rs | 9 - crates/parser/tree/member_expression.rs | 9 - crates/parser/tree/mxml.rs | 217 - crates/parser/tree/namespace_definition.rs | 11 - crates/parser/tree/new_expression.rs | 9 - .../tree/normal_configuration_directive.rs | 13 - crates/parser/tree/null_literal.rs | 7 - crates/parser/tree/numeric_literal.rs | 157 - crates/parser/tree/object_initializer.rs | 63 - .../tree/optional_chaining_expression.rs | 21 - .../parser/tree/package_concat_directive.rs | 10 - crates/parser/tree/package_definition.rs | 10 - crates/parser/tree/paren_expression.rs | 8 - crates/parser/tree/program.rs | 9 - crates/parser/tree/qualified_identifier.rs | 49 - crates/parser/tree/regexp_literal.rs | 9 - .../tree/reserved_namespace_expression.rs | 41 - crates/parser/tree/return_statement.rs | 8 - crates/parser/tree/sequence_expression.rs | 10 - crates/parser/tree/string_literal.rs | 8 - crates/parser/tree/super_expression.rs | 18 - crates/parser/tree/super_statement.rs | 8 - crates/parser/tree/switch_statement.rs | 46 - crates/parser/tree/this_literal.rs | 7 - crates/parser/tree/throw_statement.rs | 8 - crates/parser/tree/tree_semantics.rs | 230 - crates/parser/tree/try_statement.rs | 23 - crates/parser/tree/type_definition.rs | 11 - crates/parser/tree/type_expression.rs | 56 - crates/parser/tree/type_parameter.rs | 9 - crates/parser/tree/unary_expression.rs | 9 - crates/parser/tree/use_namespace_directive.rs | 8 - crates/parser/tree/variable_definition.rs | 36 - crates/parser/tree/vector_literal.rs | 9 - crates/parser/tree/while_statement.rs | 9 - crates/parser/tree/with_statement.rs | 9 - crates/parser/tree/xml_expression.rs | 57 - crates/parser/util.rs | 36 - crates/parser/util/arena.rs | 19 - crates/parser/util/character_reader.rs | 138 - crates/parser/util/css.rs | 163 - crates/parser/util/escaping.rs | 11 - crates/parser_test/Cargo.toml | 23 - crates/parser_test/main.rs | 62 - demo/Cargo.toml | 18 - demo/dist/as3_parser_demo.d.ts | 40 + demo/dist/as3_parser_demo.js | 199 + demo/dist/as3_parser_demo_bg.wasm | Bin 0 -> 2513395 bytes demo/dist/as3_parser_demo_bg.wasm.d.ts | 8 + demo/src/lib.rs | 58 - examples/asdoc/.gitignore | 1 - examples/asdoc/Cargo.toml | 11 - examples/asdoc/Example.as | 10 - examples/asdoc/example.rs | 61 - tests/parser/ASDoc.as | 24 - tests/parser/ASDoc.diag | 0 tests/parser/ASDoc.tree | 235 - tests/parser/Attributes.as | 17 - tests/parser/Attributes.diag | 0 tests/parser/Attributes.tree | 293 - tests/parser/Configuration.as | 21 - tests/parser/Configuration.diag | 0 tests/parser/Configuration.tree | 386 -- tests/parser/E4X.as | 18 - tests/parser/E4X.diag | 0 tests/parser/E4X.tree | 324 - tests/parser/MXML1.diag | 0 tests/parser/MXML1.mxml | 16 - tests/parser/MXML1.tree | 215 - tests/parser/MXML2.diag | 0 tests/parser/MXML2.mxml | 4 - tests/parser/MXML2.tree | 38 - tests/parser/Misc.as | 19 - tests/parser/Misc.diag | 0 tests/parser/Misc.tree | 341 -- tests/parser/Qualifier.as | 9 - tests/parser/Qualifier.diag | 0 tests/parser/Qualifier.tree | 351 -- tests/parser/README.md | 17 - tests/parser/Super.as | 12 - tests/parser/Super.diag | 1 - tests/parser/Super.tree | 215 - tests/parser/css/mediaQuery.css | 5 - tests/parser/css/mediaQuery.diag | 0 tests/parser/css/mediaQuery.tree | 92 - tests/parser/css/selectors.css | 9 - tests/parser/css/selectors.diag | 0 tests/parser/css/selectors.tree | 200 - 159 files changed, 247 insertions(+), 17732 deletions(-) delete mode 100644 .github/workflows/demo.yml delete mode 100644 .gitignore delete mode 100644 Cargo.lock delete mode 100644 Cargo.toml delete mode 100644 LICENSE delete mode 100644 README.md delete mode 100644 as3/promise/AggregateError.as delete mode 100644 as3/promise/Promise.as delete mode 100644 as3/promise/PromiseHandler.as delete mode 100644 crates/parser/Cargo.toml delete mode 100644 crates/parser/README.md delete mode 100644 crates/parser/compilation_unit.rs delete mode 100644 crates/parser/compilation_unit/comment.rs delete mode 100644 crates/parser/compilation_unit/compilation_unit.rs delete mode 100644 crates/parser/compilation_unit/location.rs delete mode 100644 crates/parser/diagnostics.rs delete mode 100644 crates/parser/diagnostics/diagnostic_kind.rs delete mode 100644 crates/parser/diagnostics/diagnostics.rs delete mode 100644 crates/parser/diagnostics/diagnostics_english_resources.rs delete mode 100644 crates/parser/lib.rs delete mode 100644 crates/parser/ns.rs delete mode 100644 crates/parser/operator.rs delete mode 100644 crates/parser/operator/operator.rs delete mode 100644 crates/parser/operator/operator_precedence.rs delete mode 100644 crates/parser/parser.rs delete mode 100644 crates/parser/parser/character_validator.rs delete mode 100644 crates/parser/parser/context.rs delete mode 100644 crates/parser/parser/css_parser.rs delete mode 100644 crates/parser/parser/css_tokenizer.rs delete mode 100644 crates/parser/parser/parser.rs delete mode 100644 crates/parser/parser/parser_error.rs delete mode 100644 crates/parser/parser/reserved_word.rs delete mode 100644 crates/parser/parser/token.rs delete mode 100644 crates/parser/parser/tokenizer.rs delete mode 100644 crates/parser/tree.rs delete mode 100644 crates/parser/tree/array_literal.rs delete mode 100644 crates/parser/tree/asdoc.rs delete mode 100644 crates/parser/tree/assignment_expression.rs delete mode 100644 crates/parser/tree/attributes.rs delete mode 100644 crates/parser/tree/binary_expression.rs delete mode 100644 crates/parser/tree/block.rs delete mode 100644 crates/parser/tree/boolean_literal.rs delete mode 100644 crates/parser/tree/break_statement.rs delete mode 100644 crates/parser/tree/call_expression.rs delete mode 100644 crates/parser/tree/class_definition.rs delete mode 100644 crates/parser/tree/computed_member_expression.rs delete mode 100644 crates/parser/tree/conditional_expression.rs delete mode 100644 crates/parser/tree/configuration_directive.rs delete mode 100644 crates/parser/tree/continue_statement.rs delete mode 100644 crates/parser/tree/css.rs delete mode 100644 crates/parser/tree/default_xml_namespace_statement.rs delete mode 100644 crates/parser/tree/descendants_expression.rs delete mode 100644 crates/parser/tree/destructuring.rs delete mode 100644 crates/parser/tree/directive.rs delete mode 100644 crates/parser/tree/directive_injection_node.rs delete mode 100644 crates/parser/tree/do_statement.rs delete mode 100644 crates/parser/tree/empty_statement.rs delete mode 100644 crates/parser/tree/enum_definition.rs delete mode 100644 crates/parser/tree/expression.rs delete mode 100644 crates/parser/tree/expression_statement.rs delete mode 100644 crates/parser/tree/expression_with_type_arguments.rs delete mode 100644 crates/parser/tree/filter_expression.rs delete mode 100644 crates/parser/tree/for_statement.rs delete mode 100644 crates/parser/tree/function_definition.rs delete mode 100644 crates/parser/tree/function_expression.rs delete mode 100644 crates/parser/tree/if_statement.rs delete mode 100644 crates/parser/tree/import_directive.rs delete mode 100644 crates/parser/tree/import_meta.rs delete mode 100644 crates/parser/tree/include_directive.rs delete mode 100644 crates/parser/tree/interface_definition.rs delete mode 100644 crates/parser/tree/invalidated_node.rs delete mode 100644 crates/parser/tree/labeled_statement.rs delete mode 100644 crates/parser/tree/member_expression.rs delete mode 100644 crates/parser/tree/mxml.rs delete mode 100644 crates/parser/tree/namespace_definition.rs delete mode 100644 crates/parser/tree/new_expression.rs delete mode 100644 crates/parser/tree/normal_configuration_directive.rs delete mode 100644 crates/parser/tree/null_literal.rs delete mode 100644 crates/parser/tree/numeric_literal.rs delete mode 100644 crates/parser/tree/object_initializer.rs delete mode 100644 crates/parser/tree/optional_chaining_expression.rs delete mode 100644 crates/parser/tree/package_concat_directive.rs delete mode 100644 crates/parser/tree/package_definition.rs delete mode 100644 crates/parser/tree/paren_expression.rs delete mode 100644 crates/parser/tree/program.rs delete mode 100644 crates/parser/tree/qualified_identifier.rs delete mode 100644 crates/parser/tree/regexp_literal.rs delete mode 100644 crates/parser/tree/reserved_namespace_expression.rs delete mode 100644 crates/parser/tree/return_statement.rs delete mode 100644 crates/parser/tree/sequence_expression.rs delete mode 100644 crates/parser/tree/string_literal.rs delete mode 100644 crates/parser/tree/super_expression.rs delete mode 100644 crates/parser/tree/super_statement.rs delete mode 100644 crates/parser/tree/switch_statement.rs delete mode 100644 crates/parser/tree/this_literal.rs delete mode 100644 crates/parser/tree/throw_statement.rs delete mode 100644 crates/parser/tree/tree_semantics.rs delete mode 100644 crates/parser/tree/try_statement.rs delete mode 100644 crates/parser/tree/type_definition.rs delete mode 100644 crates/parser/tree/type_expression.rs delete mode 100644 crates/parser/tree/type_parameter.rs delete mode 100644 crates/parser/tree/unary_expression.rs delete mode 100644 crates/parser/tree/use_namespace_directive.rs delete mode 100644 crates/parser/tree/variable_definition.rs delete mode 100644 crates/parser/tree/vector_literal.rs delete mode 100644 crates/parser/tree/while_statement.rs delete mode 100644 crates/parser/tree/with_statement.rs delete mode 100644 crates/parser/tree/xml_expression.rs delete mode 100644 crates/parser/util.rs delete mode 100644 crates/parser/util/arena.rs delete mode 100644 crates/parser/util/character_reader.rs delete mode 100644 crates/parser/util/css.rs delete mode 100644 crates/parser/util/escaping.rs delete mode 100644 crates/parser_test/Cargo.toml delete mode 100644 crates/parser_test/main.rs delete mode 100644 demo/Cargo.toml create mode 100644 demo/dist/as3_parser_demo.d.ts create mode 100644 demo/dist/as3_parser_demo.js create mode 100644 demo/dist/as3_parser_demo_bg.wasm create mode 100644 demo/dist/as3_parser_demo_bg.wasm.d.ts delete mode 100644 demo/src/lib.rs delete mode 100644 examples/asdoc/.gitignore delete mode 100644 examples/asdoc/Cargo.toml delete mode 100644 examples/asdoc/Example.as delete mode 100644 examples/asdoc/example.rs delete mode 100644 tests/parser/ASDoc.as delete mode 100644 tests/parser/ASDoc.diag delete mode 100644 tests/parser/ASDoc.tree delete mode 100644 tests/parser/Attributes.as delete mode 100644 tests/parser/Attributes.diag delete mode 100644 tests/parser/Attributes.tree delete mode 100644 tests/parser/Configuration.as delete mode 100644 tests/parser/Configuration.diag delete mode 100644 tests/parser/Configuration.tree delete mode 100644 tests/parser/E4X.as delete mode 100644 tests/parser/E4X.diag delete mode 100644 tests/parser/E4X.tree delete mode 100644 tests/parser/MXML1.diag delete mode 100644 tests/parser/MXML1.mxml delete mode 100644 tests/parser/MXML1.tree delete mode 100644 tests/parser/MXML2.diag delete mode 100644 tests/parser/MXML2.mxml delete mode 100644 tests/parser/MXML2.tree delete mode 100644 tests/parser/Misc.as delete mode 100644 tests/parser/Misc.diag delete mode 100644 tests/parser/Misc.tree delete mode 100644 tests/parser/Qualifier.as delete mode 100644 tests/parser/Qualifier.diag delete mode 100644 tests/parser/Qualifier.tree delete mode 100644 tests/parser/README.md delete mode 100644 tests/parser/Super.as delete mode 100644 tests/parser/Super.diag delete mode 100644 tests/parser/Super.tree delete mode 100644 tests/parser/css/mediaQuery.css delete mode 100644 tests/parser/css/mediaQuery.diag delete mode 100644 tests/parser/css/mediaQuery.tree delete mode 100644 tests/parser/css/selectors.css delete mode 100644 tests/parser/css/selectors.diag delete mode 100644 tests/parser/css/selectors.tree diff --git a/.github/workflows/demo.yml b/.github/workflows/demo.yml deleted file mode 100644 index cad5473..0000000 --- a/.github/workflows/demo.yml +++ /dev/null @@ -1,41 +0,0 @@ -name: Demo - -on: - push: - branches: [ "master" ] - pull_request: - branches: [ "master" ] - -permissions: - contents: write - -env: - CARGO_TERM_COLOR: always - -jobs: - build: - runs-on: ubuntu-latest - - steps: - - uses: actions/checkout@v4 - - name: Use nightly Rust - run: rustup default nightly - - name: Add wasm32 target - run: rustup target add wasm32-unknown-unknown - - name: Install wasm-bindgen CLI - run: cargo install wasm-bindgen-cli - - name: Build demo - run: cargo build -p as3_parser_demo --release --target wasm32-unknown-unknown - - name: Update demo/dist - run: wasm-bindgen --target web --out-dir demo/dist target/wasm32-unknown-unknown/release/as3_parser_demo.wasm - - name: Git commit report - run: | - git config --global user.name 'hydroper' - git config --global user.email 'matheusdiasdesouzads@gmail.com' - git switch -C demo - git rm --cached -r . - git add demo - git rm --cached -r demo/src - git rm --cached demo/Cargo.toml - git commit -m "Automated report" - git push origin -f demo diff --git a/.gitignore b/.gitignore deleted file mode 100644 index c41cc9e..0000000 --- a/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/target \ No newline at end of file diff --git a/Cargo.lock b/Cargo.lock deleted file mode 100644 index f33f668..0000000 --- a/Cargo.lock +++ /dev/null @@ -1,639 +0,0 @@ -# This file is automatically @generated by Cargo. -# It is not intended for manual editing. -version = 3 - -[[package]] -name = "aho-corasick" -version = "1.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" -dependencies = [ - "memchr", -] - -[[package]] -name = "anstream" -version = "0.6.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d96bd03f33fe50a863e394ee9718a706f988b9079b20c3784fb726e7678b62fb" -dependencies = [ - "anstyle", - "anstyle-parse", - "anstyle-query", - "anstyle-wincon", - "colorchoice", - "utf8parse", -] - -[[package]] -name = "anstyle" -version = "1.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8901269c6307e8d93993578286ac0edf7f195079ffff5ebdeea6a59ffb7e36bc" - -[[package]] -name = "anstyle-parse" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c75ac65da39e5fe5ab759307499ddad880d724eed2f6ce5b5e8a26f4f387928c" -dependencies = [ - "utf8parse", -] - -[[package]] -name = "anstyle-query" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e28923312444cdd728e4738b3f9c9cac739500909bb3d3c94b43551b16517648" -dependencies = [ - "windows-sys", -] - -[[package]] -name = "anstyle-wincon" -version = "3.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1cd54b81ec8d6180e24654d0b371ad22fc3dd083b6ff8ba325b72e00c87660a7" -dependencies = [ - "anstyle", - "windows-sys", -] - -[[package]] -name = "anyhow" -version = "1.0.82" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f538837af36e6f6a9be0faa67f9a314f8119e4e4b5867c6ab40ed60360142519" - -[[package]] -name = "as3_parser" -version = "1.0.17" -dependencies = [ - "bitflags", - "by_address", - "bytes", - "conv", - "file_paths", - "htmlentity", - "hydroper_source_text", - "late_format", - "lazy-regex", - "lazy_static", - "maplit", - "num-bigint", - "num-derive", - "num-traits", - "serde", - "serde_json", - "unicode-general-category", -] - -[[package]] -name = "as3_parser_demo" -version = "0.1.0" -dependencies = [ - "as3_parser", - "maplit", - "serde", - "serde_json", - "wasm-bindgen", - "web-sys", -] - -[[package]] -name = "as3_parser_test" -version = "0.4.0" -dependencies = [ - "as3_parser", - "clap", - "file_paths", - "maplit", - "serde", - "serde_json", -] - -[[package]] -name = "asdoc-example" -version = "0.1.0" -dependencies = [ - "as3_parser", -] - -[[package]] -name = "autocfg" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1fdabc7756949593fe60f30ec81974b613357de856987752631dea1e3394c80" - -[[package]] -name = "bitflags" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf4b9d6a944f767f8e5e0db018570623c85f3d925ac718db4e06d0187adb21c1" -dependencies = [ - "serde", -] - -[[package]] -name = "bumpalo" -version = "3.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" - -[[package]] -name = "by_address" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64fa3c856b712db6612c019f14756e64e4bcea13337a6b33b696333a9eaa2d06" - -[[package]] -name = "bytes" -version = "1.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "514de17de45fdb8dc022b1a7975556c53c86f9f0aa5f534b98977b171857c2c9" - -[[package]] -name = "cfg-if" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" - -[[package]] -name = "clap" -version = "4.5.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90bc066a67923782aa8515dbaea16946c5bcc5addbd668bb80af688e53e548a0" -dependencies = [ - "clap_builder", - "clap_derive", -] - -[[package]] -name = "clap_builder" -version = "4.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae129e2e766ae0ec03484e609954119f123cc1fe650337e155d03b022f24f7b4" -dependencies = [ - "anstream", - "anstyle", - "clap_lex", - "strsim", -] - -[[package]] -name = "clap_derive" -version = "4.5.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "528131438037fd55894f62d6e9f068b8f45ac57ffa77517819645d10aed04f64" -dependencies = [ - "heck", - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "clap_lex" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "98cc8fbded0c607b7ba9dd60cd98df59af97e84d24e49c8557331cfc26d301ce" - -[[package]] -name = "colorchoice" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7" - -[[package]] -name = "conv" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78ff10625fd0ac447827aa30ea8b861fead473bb60aeb73af6c1c58caf0d1299" -dependencies = [ - "custom_derive", -] - -[[package]] -name = "custom_derive" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef8ae57c4978a2acd8b869ce6b9ca1dfe817bff704c220209fdef2c0b75a01b9" - -[[package]] -name = "file_paths" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6655a548f719048f152b0349acf5f1b0fa7ce430acb49d4afc1d42513f160549" -dependencies = [ - "lazy-regex", -] - -[[package]] -name = "heck" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" - -[[package]] -name = "htmlentity" -version = "1.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bab11d4e4796b618b77cabd8f0729eb8033891609820303af715e9306dbb95cd" -dependencies = [ - "anyhow", - "lazy_static", - "thiserror", -] - -[[package]] -name = "hydroper_source_text" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cce3d21a188729674efc26164f9a201d567ab2fe28b6789cb802d7ca66ee7aaf" - -[[package]] -name = "itoa" -version = "1.0.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" - -[[package]] -name = "js-sys" -version = "0.3.69" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29c15563dc2726973df627357ce0c9ddddbea194836909d655df6a75d2cf296d" -dependencies = [ - "wasm-bindgen", -] - -[[package]] -name = "late_format" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c20a4c2785e13b46810cdd5b6df71b2bbacd6195d18d37b99098c6f52631dc6d" -dependencies = [ - "lazy-regex", - "maplit", -] - -[[package]] -name = "lazy-regex" -version = "3.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d12be4595afdf58bd19e4a9f4e24187da2a66700786ff660a418e9059937a4c" -dependencies = [ - "lazy-regex-proc_macros", - "once_cell", - "regex", -] - -[[package]] -name = "lazy-regex-proc_macros" -version = "3.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44bcd58e6c97a7fcbaffcdc95728b393b8d98933bfadad49ed4097845b57ef0b" -dependencies = [ - "proc-macro2", - "quote", - "regex", - "syn", -] - -[[package]] -name = "lazy_static" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" - -[[package]] -name = "log" -version = "0.4.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90ed8c1e510134f979dbc4f070f87d4313098b704861a105fe34231c70a3901c" - -[[package]] -name = "maplit" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e2e65a1a2e43cfcb47a895c4c8b10d1f4a61097f9f254f183aee60cad9c651d" - -[[package]] -name = "memchr" -version = "2.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c8640c5d730cb13ebd907d8d04b52f55ac9a2eec55b440c8892f40d56c76c1d" - -[[package]] -name = "num-bigint" -version = "0.4.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "608e7659b5c3d7cba262d894801b9ec9d00de989e8a82bd4bef91d08da45cdc0" -dependencies = [ - "autocfg", - "num-integer", - "num-traits", -] - -[[package]] -name = "num-derive" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "num-integer" -version = "0.1.46" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" -dependencies = [ - "num-traits", -] - -[[package]] -name = "num-traits" -version = "0.2.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da0df0e5185db44f69b44f26786fe401b6c293d1907744beaa7fa62b2e5a517a" -dependencies = [ - "autocfg", -] - -[[package]] -name = "once_cell" -version = "1.19.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" - -[[package]] -name = "proc-macro2" -version = "1.0.79" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e835ff2298f5721608eb1a980ecaee1aef2c132bf95ecc026a11b7bf3c01c02e" -dependencies = [ - "unicode-ident", -] - -[[package]] -name = "quote" -version = "1.0.35" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "291ec9ab5efd934aaf503a6466c5d5251535d108ee747472c3977cc5acc868ef" -dependencies = [ - "proc-macro2", -] - -[[package]] -name = "regex" -version = "1.10.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c117dbdfde9c8308975b6a18d71f3f385c89461f7b3fb054288ecf2a2058ba4c" -dependencies = [ - "aho-corasick", - "memchr", - "regex-automata", - "regex-syntax", -] - -[[package]] -name = "regex-automata" -version = "0.4.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86b83b8b9847f9bf95ef68afb0b8e6cdb80f498442f5179a29fad448fcc1eaea" -dependencies = [ - "aho-corasick", - "memchr", - "regex-syntax", -] - -[[package]] -name = "regex-syntax" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "adad44e29e4c806119491a7f06f03de4d1af22c3a680dd47f1e6e179439d1f56" - -[[package]] -name = "ryu" -version = "1.0.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e86697c916019a8588c99b5fac3cead74ec0b4b819707a682fd4d23fa0ce1ba1" - -[[package]] -name = "serde" -version = "1.0.197" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fb1c873e1b9b056a4dc4c0c198b24c3ffa059243875552b2bd0933b1aee4ce2" -dependencies = [ - "serde_derive", -] - -[[package]] -name = "serde_derive" -version = "1.0.197" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7eb0b34b42edc17f6b7cac84a52a1c5f0e1bb2227e997ca9011ea3dd34e8610b" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "serde_json" -version = "1.0.115" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12dc5c46daa8e9fdf4f5e71b6cf9a53f2487da0e86e55808e2d35539666497dd" -dependencies = [ - "itoa", - "ryu", - "serde", -] - -[[package]] -name = "strsim" -version = "0.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" - -[[package]] -name = "syn" -version = "2.0.58" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44cfb93f38070beee36b3fef7d4f5a16f27751d94b187b666a5cc5e9b0d30687" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[package]] -name = "thiserror" -version = "1.0.58" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03468839009160513471e86a034bb2c5c0e4baae3b43f79ffc55c4a5427b3297" -dependencies = [ - "thiserror-impl", -] - -[[package]] -name = "thiserror-impl" -version = "1.0.58" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c61f3ba182994efc43764a46c018c347bc492c79f024e705f46567b418f6d4f7" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "unicode-general-category" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2281c8c1d221438e373249e065ca4989c4c36952c211ff21a0ee91c44a3869e7" - -[[package]] -name = "unicode-ident" -version = "1.0.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" - -[[package]] -name = "utf8parse" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a" - -[[package]] -name = "wasm-bindgen" -version = "0.2.92" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4be2531df63900aeb2bca0daaaddec08491ee64ceecbee5076636a3b026795a8" -dependencies = [ - "cfg-if", - "wasm-bindgen-macro", -] - -[[package]] -name = "wasm-bindgen-backend" -version = "0.2.92" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "614d787b966d3989fa7bb98a654e369c762374fd3213d212cfc0251257e747da" -dependencies = [ - "bumpalo", - "log", - "once_cell", - "proc-macro2", - "quote", - "syn", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-macro" -version = "0.2.92" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1f8823de937b71b9460c0c34e25f3da88250760bec0ebac694b49997550d726" -dependencies = [ - "quote", - "wasm-bindgen-macro-support", -] - -[[package]] -name = "wasm-bindgen-macro-support" -version = "0.2.92" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7" -dependencies = [ - "proc-macro2", - "quote", - "syn", - "wasm-bindgen-backend", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-shared" -version = "0.2.92" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af190c94f2773fdb3729c55b007a722abb5384da03bc0986df4c289bf5567e96" - -[[package]] -name = "web-sys" -version = "0.3.69" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77afa9a11836342370f4817622a2f0f418b134426d91a82dfb48f532d2ec13ef" -dependencies = [ - "js-sys", - "wasm-bindgen", -] - -[[package]] -name = "windows-sys" -version = "0.52.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" -dependencies = [ - "windows-targets", -] - -[[package]] -name = "windows-targets" -version = "0.52.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7dd37b7e5ab9018759f893a1952c9420d060016fc19a472b4bb20d1bdd694d1b" -dependencies = [ - "windows_aarch64_gnullvm", - "windows_aarch64_msvc", - "windows_i686_gnu", - "windows_i686_msvc", - "windows_x86_64_gnu", - "windows_x86_64_gnullvm", - "windows_x86_64_msvc", -] - -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.52.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bcf46cf4c365c6f2d1cc93ce535f2c8b244591df96ceee75d8e83deb70a9cac9" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.52.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da9f259dd3bcf6990b55bffd094c4f7235817ba4ceebde8e6d11cd0c5633b675" - -[[package]] -name = "windows_i686_gnu" -version = "0.52.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b474d8268f99e0995f25b9f095bc7434632601028cf86590aea5c8a5cb7801d3" - -[[package]] -name = "windows_i686_msvc" -version = "0.52.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1515e9a29e5bed743cb4415a9ecf5dfca648ce85ee42e15873c3cd8610ff8e02" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.52.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5eee091590e89cc02ad514ffe3ead9eb6b660aedca2183455434b93546371a03" - -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.52.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77ca79f2451b49fa9e2af39f0747fe999fcda4f5e241b2898624dca97a1f2177" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.52.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32b752e52a2da0ddfbdbcc6fceadfeede4c939ed16d13e648833a61dfb611ed8" diff --git a/Cargo.toml b/Cargo.toml deleted file mode 100644 index d173730..0000000 --- a/Cargo.toml +++ /dev/null @@ -1,8 +0,0 @@ -[workspace] -members = [ - "crates/parser", - "crates/parser_test", - "demo", - "examples/asdoc", -] -resolver = "2" \ No newline at end of file diff --git a/LICENSE b/LICENSE deleted file mode 100644 index 9820eb1..0000000 --- a/LICENSE +++ /dev/null @@ -1,202 +0,0 @@ - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright 2024 Hydroper - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. \ No newline at end of file diff --git a/README.md b/README.md deleted file mode 100644 index e9b92ac..0000000 --- a/README.md +++ /dev/null @@ -1,19 +0,0 @@ -# ActionScript 3 Parser - -

- - - -

- -ActionScript 3 parser in the Rust language. - -[Online demo](https://hydroper.github.io/as3parser/demo) - -## Documentation - -Refer to the [wiki](https://github.com/hydroper/as3parser/wiki) of this repository for various informations, including a getting started point. - -## License - -Apache License 2.0, copyright 2024 Hydroper diff --git a/as3/promise/AggregateError.as b/as3/promise/AggregateError.as deleted file mode 100644 index c09f54c..0000000 --- a/as3/promise/AggregateError.as +++ /dev/null @@ -1,10 +0,0 @@ -package { - public class AggregateError extends Error { - public var errors: Array; - - public function AggregateError(errors: Array, message: String = "") { - super(message); - this.errors = errors.slice(0); - } - } -} \ No newline at end of file diff --git a/as3/promise/Promise.as b/as3/promise/Promise.as deleted file mode 100644 index 147b551..0000000 --- a/as3/promise/Promise.as +++ /dev/null @@ -1,354 +0,0 @@ -package { - import flash.utils.setTimeout; - import __AS3__.promise.*; - - /** - * The Promise object represents the eventual completion (or failure) - * of an asynchronous operation and its resulting value. - * - * For more information, consult [developer.mozilla.org](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise). - * - * # Examples - * - * ``` - * const promise = new Promise.<*>(function(resolve: Function, reject: Function): void { - * // - * }); - * - * promise - * .then(function(): * {}) - * .catch(function(error: *): * {}) - * .finally(function(): void {}); - * ``` - */ - public final class Promise. { - // Implementation based on - // https://github.com/taylorhakes/promise-polyfill - - private var m_state:Number = 0; - private var m_handled:Boolean = false; - private var m_value:* = undefined; - private var m_deferreds:Vector. = new Vector.; - - private static function bindFunction(fn:Function, thisArg:*):Function { - return function(...argumentsList):void { - fn.apply(thisArg, argumentsList); - }; - } - - public function Promise(fn: Function) { - doResolve(fn, this); - } - - private static function handle(self:Promise., deferred:PromiseHandler):void { - while (self.m_state === 3) { - self = self.m_value; - } - if (self.m_state === 0) { - self.m_deferreds.push(deferred); - return; - } - self.m_handled = true; - Promise.._immediateFn(function():void { - var cb:Function = self.m_state === 1 ? deferred.onFulfilled : deferred.onRejected; - if (cb === null) { - (self.m_state === 1 ? Promise..privateResolve : Promise..privateReject)(deferred.promise, self.m_value); - return; - } - var ret:* = undefined; - try { - ret = cb(self.m_value); - } - catch (e:*) { - Promise..privateReject(deferred.promise, e); - return; - } - Promise..privateResolve(deferred.promise, ret); - }); - } - - private static function privateResolve(self:Promise., newValue:*):void { - try { - // Promise Resolution Procedure: https://github.com/promises-aplus/promises-spec#the-promise-resolution-procedure - if (newValue === self) { - throw new TypeError('A promise cannot be resolved with itself.'); - } - if (newValue is Promise) { - self.m_state = 3; - self.m_value = newValue; - Promise..finale(self); - return; - } - self.m_state = 1; - self.m_value = newValue; - Promise..finale(self); - } - catch (e:*) { - Promise..privateReject(self, e); - } - } - - private static function privateReject(self:Promise., newValue:*):void { - self.m_state = 2; - self.m_value = newValue; - Promise..finale(self); - } - - private static function finale(self:Promise.):void { - if (self.m_state === 2 && self.m_deferreds.length === 0) { - Promise.._immediateFn(function():void { - if (!self.m_handled) { - Promise.._unhandledRejectionFn(self.m_value); - } - }); - } - - for (var i:Number = 0, len:Number = self.m_deferreds.length; i < len; i++) { - handle(self, self.m_deferreds[i]); - } - self.m_deferreds = null; - } - - /** - * Takes a potentially misbehaving resolver function and make sure - * `onFulfilled` and `onRejected` are only called once. - * - * Makes no guarantees about asynchrony. - */ - private static function doResolve(fn:Function, self:Promise.):void { - var done:Boolean = false; - try { - fn( - function(value:*):* { - if (done) return; - done = true; - Promise..privateResolve(self, value); - }, - function(reason:*):* { - if (done) return; - done = true; - Promise..privateReject(self, reason); - } - ); - } - catch (ex:*) { - if (done) return; - done = true; - Promise..privateReject(self, ex); - } - } - - /** - * The `Promise.allSettled()` static method takes an iterable of promises - * as input and returns a single Promise. - * This returned promise fulfills when all of the input's promises settle - * (including when an empty iterable is passed), with an array of objects that - * describe the outcome of each promise. - * - * # Example - * - * ``` - * const promise1 = Promise..resolve(3); - * const promise2 = new Promise.(function(resolve: Function, reject: Function): void { - * setTimeout(reject, 100, "foo"); - * }); - * Promise..allSettled([promise1, promise2]) - * .then(function(results: Array): void { - * for each (const result in results) { - * trace(result.status); - * } - * }); - * // Expected output: - * // "fulfilled" - * // "rejected" - * ``` - * - * @return A `Promise` that is: - * - * - **Already fulfilled,** if the iterable passed is empty. - * - **Asynchronously fulfilled,** when all promises in the given - * iterable have settled (either fulfilled or rejected). - * The fulfillment value is an array of objects, each describing the - * outcome of one promise in the iterable, in the order of the promises passed, - * regardless of completion order. Each outcome object has the following properties: - * - `status`: A string, either `"fulfilled"` or `"rejected"`, indicating the eventual state of the promise. - * - `value`: Only present if `status` is `"fulfilled"`. The value that the promise was fulfilled with. - * - `reason`: Only present if `status` is `"rejected"`. The reason that the promise was rejected with. - * - * If the iterable passed is non-empty but contains no pending promises, - * the returned promise is still asynchronously (instead of synchronously) fulfilled. - */ - public static function allSettled(promises: Array): Promise. { - return new Promise(function(resolve:Function, reject:Function):void { - var args:Array = promises.slice(0); - if (args.length === 0) { - resolve([]); - return; - } - var remaining:Number = args.length; - function res(i:Number, val:*):void { - if (val is Promise) { - Promise(val).then( - function(val:*):* { - res(i, val); - }, - function(e:*):* { - args[i] = { status: 'rejected', reason: e }; - if (--remaining === 0) { - resolve(args); - } - } - ); - return; - } - args[i] = { status: 'fulfilled', value: val }; - if (--remaining === 0) { - resolve(args); - } - } - for (var i:Number = 0; i < args.length; ++i) { - res(i, args[i]); - } - }); - } // allSettled - - /** - * [developer.mozilla.org](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/any) - */ - public static function any(promises:Array):Promise. { - return new Promise(function(resolve:Function, reject:Function):void { - var args:Array = promises.slice(0); - if (args.length === 0) { - reject(undefined); - return; - } - var rejectionReasons:Array = []; - for (var i:Number = 0; i < args.length; ++i) { - try { - Promise..resolve(args[i]) - .then(resolve) - .catch(function(error:*):* { - rejectionReasons.push(error); - if (rejectionReasons.length === args.length) { - reject( - new AggregateError( - rejectionReasons, - 'All promises were rejected' - ) - ); - } - }); - } - catch (ex:*) { - reject(ex); - } - } - }); - } // any - - public function finally(callback:Function):Promise. { - return this.then( - function(value:*):* { - return Promise..resolve(callback()).then(function(_:*):* { - return value; - }); - }, - function(reason:*):* { - return Promise..resolve(callback()).then(function(_:*):* { - return Promise..reject(reason); - }); - } - ); - } - - public function catch(onRejected: Function):Promise. { - return this.then(null, onRejected); - } - - public function then(onFulfilled: function(T): U, onRejected: function(*): E = null):Promise.<*> { - var prom = new Promise.<*>(function(_a:*, _b:*):void {}); - Promise..handle(this, new PromiseHandler(onFulfilled, onRejected, prom)); - return prom; - } - - /** - * [developer.mozilla.org](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/all) - */ - public static function all(promises: Array):Promise. { - return new Promise(function(resolve:Function, reject:Function):void { - var args:Array = promises.slice(0); - if (args.length === 0) { - resolve([]); - return; - } - var remaining:Number = args.length; - - function res(i:Number, val:*):void { - try { - if (val is Promise) { - Promise(val).then( - function(val): * { - res(i, val); - }, - reject - ); - return; - } - args[i] = val; - if (--remaining === 0) { - resolve(args); - } - } - catch (ex:*) { - reject(ex); - } - } - - for (var i:Number = 0; i < args.length; i++) { - res(i, args[i]); - } - }); - } // all - - /** - * [developer.mozilla.org](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/resolve) - */ - public static function resolve(value: *):Promise. { - if (value is Promise) { - return Promise.(value); - } - - return new Promise.(function(resolve: Function, reject: Function): void { - resolve(value); - }); - } - - /** - * [developer.mozilla.org](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/reject) - */ - public static function reject(value: *): Promise. { - return new Promise(function(resolve: Function, reject: Function): void { - reject(value); - }); - } - - /** - * [developer.mozilla.org](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/race) - */ - public static function race(promises:Array):Promise. { - return new Promise.(function(resolve:Function, reject:Function):void { - for each (var arg:* in promises) { - Promise..resolve(arg).then(resolve, reject); - } - }); - } - - private static function _immediateFn(fn:Function):void { - setTimeout(fn, 0); - } - - private static function _unhandledRejectionFn(err:*):void { - trace("Possible unhandled Promise rejection:", err); - } - } -} diff --git a/as3/promise/PromiseHandler.as b/as3/promise/PromiseHandler.as deleted file mode 100644 index 708f554..0000000 --- a/as3/promise/PromiseHandler.as +++ /dev/null @@ -1,16 +0,0 @@ -package __AS3__.promise { - /** - * @private - */ - public final class PromiseHandler { - public var onFulfilled: Function; - public var onRejected: Function; - public var promise: Promise; - - public function PromiseHandler(onFulfilled: Function, onRejected: Function, promise: Promise) { - this.onFulfilled = onFulfilled; - this.onRejected = onRejected; - this.promise = promise; - } - } -} diff --git a/crates/parser/Cargo.toml b/crates/parser/Cargo.toml deleted file mode 100644 index c33b82d..0000000 --- a/crates/parser/Cargo.toml +++ /dev/null @@ -1,34 +0,0 @@ -[package] -name = "as3_parser" -version = "1.0.17" -edition = "2021" -authors = ["hydroper "] -repository = "https://github.com/hydroper/as3parser" -keywords = ["actionscript", "as3", "parser"] -description = "ActionScript 3 parser" -license = "Apache-2.0" - -# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html - -[lib] -name = "as3_parser" -path = "lib.rs" - -[dependencies] -bitflags = { version = "2.4.1", features = ["serde"] } -bytes = "1" -file_paths = "1.0.0" -conv = "0.3.3" -htmlentity = "1.3.1" -late_format = "1.0.0" -maplit = "1.0.2" -num-bigint = "0.4" -num-derive = "0.4.1" -num-traits = "0.2.17" -lazy-regex = "3.0.2" -lazy_static = "1.4.0" -unicode-general-category = "0.6.0" -by_address = "1.1.0" -serde = { version = "1.0.192", features = ["rc", "derive"] } -serde_json = "1.0.108" -hydroper_source_text = "1.0.3" diff --git a/crates/parser/README.md b/crates/parser/README.md deleted file mode 100644 index 61237d1..0000000 --- a/crates/parser/README.md +++ /dev/null @@ -1,3 +0,0 @@ -# ActionScript 3 Parser - -Refer to the [crate repository](https://github.com/hydroper/as3parser) for full details. diff --git a/crates/parser/compilation_unit.rs b/crates/parser/compilation_unit.rs deleted file mode 100644 index 93b1777..0000000 --- a/crates/parser/compilation_unit.rs +++ /dev/null @@ -1,8 +0,0 @@ -//! Defines the compilation unit, comments, and source locations. - -mod compilation_unit; -pub use compilation_unit::*; -mod comment; -pub use comment::*; -mod location; -pub use location::*; \ No newline at end of file diff --git a/crates/parser/compilation_unit/comment.rs b/crates/parser/compilation_unit/comment.rs deleted file mode 100644 index 6046ab7..0000000 --- a/crates/parser/compilation_unit/comment.rs +++ /dev/null @@ -1,59 +0,0 @@ -use crate::ns::*; - -pub struct Comment { - pub(crate) multiline: bool, - pub(crate) content: RefCell, - pub(crate) location: RefCell, -} - -impl Comment { - pub fn new(multiline: bool, content: String, location: Location) -> Self { - Self { - multiline, - content: RefCell::new(content), - location: RefCell::new(location), - } - } - - pub fn multiline(&self) -> bool { - self.multiline - } - - /// The content of the comment. - /// * If it is a multi-line comment, it includes all the characters after `/*` until `*/` (exclusive). - /// * If it is a single-line comment, it includes all the characters after `//` - /// until the next line terminator (exclusive) or end of program. - pub fn content(&self) -> String { - self.content.borrow().clone() - } - - pub fn set_content(&self, content: String) { - self.content.replace(content); - } - - pub fn location(&self) -> Location { - self.location.borrow().clone() - } - - pub fn set_location(&self, location: Location) { - self.location.replace(location); - } - - /// Indicates whether the comment is an AsDoc comment preceding - /// a specific location. - pub fn is_asdoc(&self, location_to_precede: &Location) -> bool { - if self.multiline && self.content.borrow().starts_with('*') { - let mut i: usize = self.location.borrow().last_offset; - for (i_1, ch) in self.location.borrow().compilation_unit().text()[i..].char_indices() { - i = i_1; - if !(CharacterValidator::is_whitespace(ch) || CharacterValidator::is_line_terminator(ch)) { - break; - } - } - i += self.location.borrow().last_offset; - location_to_precede.first_offset == i - } else { - false - } - } -} \ No newline at end of file diff --git a/crates/parser/compilation_unit/compilation_unit.rs b/crates/parser/compilation_unit/compilation_unit.rs deleted file mode 100644 index fe900a5..0000000 --- a/crates/parser/compilation_unit/compilation_unit.rs +++ /dev/null @@ -1,245 +0,0 @@ -use std::{any::Any, cell::RefMut}; -use crate::ns::*; -use hydroper_source_text::SourceText; - -/// `CompilationUnit` identifies an AS3 compilation unit and contains -/// a source text. -pub struct CompilationUnit { - pub(crate) file_path: Option, - pub(crate) source_text: SourceText, - pub(crate) compiler_options: RefCell>>, - pub(crate) diagnostics: RefCell>, - pub(crate) error_count: Cell, - pub(crate) warning_count: Cell, - pub(crate) invalidated: Cell, - pub(crate) comments: RefCell>>, - pub(crate) included_from: RefCell>>, - pub(crate) nested_compilation_units: RefCell>>, -} - -impl Default for CompilationUnit { - fn default() -> Self { - Self { - file_path: None, - source_text: SourceText::new("".into()), - compiler_options: RefCell::new(None), - diagnostics: RefCell::new(vec![]), - invalidated: Cell::new(false), - error_count: Cell::new(0), - warning_count: Cell::new(0), - comments: RefCell::new(vec![]), - nested_compilation_units: RefCell::new(vec![]), - included_from: RefCell::new(None), - } - } -} - -impl CompilationUnit { - /// Constructs a source file in unparsed and non verified state. - pub fn new(file_path: Option, text: String) -> Rc { - Rc::new(Self { - file_path, - source_text: SourceText::new(text), - compiler_options: RefCell::new(None), - diagnostics: RefCell::new(vec![]), - invalidated: Cell::new(false), - error_count: Cell::new(0), - warning_count: Cell::new(0), - comments: RefCell::new(vec![]), - nested_compilation_units: RefCell::new(vec![]), - included_from: RefCell::new(None), - }) - } - - /// File path of the source or `None` if not a file. - pub fn file_path(&self) -> Option { - self.file_path.clone() - } - - /// Source text. - pub fn text(&self) -> &String { - &self.source_text.contents - } - - /// Compiler options. - pub fn compiler_options(&self) -> Option> { - self.compiler_options.borrow().clone() - } - - /// Set compiler options. - pub fn set_compiler_options(&self, options: Option>) { - self.compiler_options.replace(options); - } - - /// Whether the source contains any errors after parsing - /// and/or verification. - pub fn invalidated(&self) -> bool { - self.invalidated.get() - } - - /// The comments present in the source file. To get mutable access to the - /// collection of comments, use the `comments_mut()` method instead. - pub fn comments(&self) -> Vec> { - let mut collection = vec![]; - for c in self.comments.borrow().iter() { - collection.push(c.clone()); - } - collection - } - - /// The comments present in the source file, as a mutable collection. - pub fn comments_mut(&self) -> RefMut>> { - self.comments.borrow_mut() - } - - /// Contributes a comment if there is no other comment - /// in the same location. - pub fn add_comment(&self, comment: Rc) { - let mut dup = false; - let i = comment.location.borrow().first_offset(); - for c1 in self.comments.borrow().iter() { - if c1.location.borrow().first_offset == i { - dup = true; - break; - } - } - if !dup { - self.comments.borrow_mut().push(comment); - } - } - - /// Diagnostics of the source file after parsing and/or - /// verification. - pub fn diagnostics(&self) -> Vec { - self.diagnostics.borrow().clone() - } - - /// Diagnostics of the source file after parsing and/or - /// verification, including those of nested compilation units. - pub fn nested_diagnostics(&self) -> Vec { - let mut result = self.diagnostics(); - for unit in self.nested_compilation_units.borrow().iter() { - result.extend(unit.nested_diagnostics()); - } - result - } - - /// Sort diagnostics from the compilation unit - /// and any nested compilation units. - pub fn sort_diagnostics(&self) { - self.diagnostics.borrow_mut().sort(); - for unit in self.nested_compilation_units.borrow().iter() { - unit.sort_diagnostics(); - } - } - - /// Determines whether to skip contributing an error when it - /// occurs at the same offset of another error. - pub fn prevent_equal_offset_error(&self, location: &Location) -> bool { - let diag_list = self.diagnostics.borrow(); - for diag in diag_list.iter() { - if diag.is_warning() { - continue; - } - if diag.location.first_offset == location.first_offset { - return true; - } - } - false - } - - /// Determines whether to skip contributing a warning when it - /// occurs at the same offset of another warning. - pub fn prevent_equal_offset_warning(&self, location: &Location) -> bool { - let diag_list = self.diagnostics.borrow(); - for diag in diag_list.iter() { - if diag.is_error() { - continue; - } - if diag.location.first_offset == location.first_offset { - return true; - } - } - false - } - - /// If this compilation unit is subsequent of an include directive in another - /// compilation unit, returns the compilation unit of that include directive. - pub fn included_from(&self) -> Option> { - self.included_from.borrow().clone() - } - - pub(crate) fn set_included_from(&self, included_from: Option>) { - self.included_from.replace(included_from); - } - - pub(crate) fn include_directive_is_circular(&self, file_path: &str) -> bool { - if canonicalize_path(&self.file_path.clone().unwrap_or("".into())) == canonicalize_path(file_path) { - return true; - } - if let Some(included_from) = self.included_from() { - return included_from.include_directive_is_circular(file_path); - } - return false; - } - - pub fn nested_compilation_units(&self) -> Vec> { - let mut result = vec![]; - for unit in self.nested_compilation_units.borrow().iter() { - result.push(unit.clone()); - } - result - } - - pub fn add_nested_compilation_unit(&self, unit: Rc) { - self.nested_compilation_units.borrow_mut().push(unit); - } - - pub fn add_diagnostic(&self, diagnostic: Diagnostic) { - if diagnostic.is_warning() { - self.warning_count.set(self.warning_count.get() + 1); - } else { - self.error_count.set(self.error_count.get() + 1); - self.invalidated.set(true); - } - self.diagnostics.borrow_mut().push(diagnostic); - } - - pub fn error_count(&self) -> u32 { - self.error_count.get() - } - - pub fn warning_count(&self) -> u32 { - self.warning_count.get() - } - - /// Retrieves line number from an offset. The resulting line number - /// is counted from one. - pub fn get_line_number(&self, offset: usize) -> usize { - self.source_text.get_line_number(offset) - } - - /// Returns the zero based column of an offset. - pub fn get_column(&self, offset: usize) -> usize { - self.source_text.get_column(offset) - } - - /// Retrieves offset from line number (counted from one). - pub fn get_line_offset(&self, line: usize) -> Option { - self.source_text.get_line_offset(line) - } - - /// Retrieves the offset from the corresponding line of an offset. - pub fn get_line_offset_from_offset(&self, offset: usize) -> usize { - self.source_text.get_line_offset_from_offset(offset) - } - - pub fn get_line_indent(&self, line: usize) -> usize { - let line_offset = self.get_line_offset(line).unwrap(); - CharacterValidator::indent_count(&self.source_text.contents[line_offset..]) - } -} - -fn canonicalize_path(path: &str) -> String { - std::path::Path::new(path).canonicalize().unwrap_or(std::path::PathBuf::new()).to_string_lossy().into_owned() -} \ No newline at end of file diff --git a/crates/parser/compilation_unit/location.rs b/crates/parser/compilation_unit/location.rs deleted file mode 100644 index 44d46ed..0000000 --- a/crates/parser/compilation_unit/location.rs +++ /dev/null @@ -1,176 +0,0 @@ -use std::cmp::Ordering; -use std::fmt::Debug; -use serde::{Serialize, Deserialize, Serializer}; -use std::rc::Rc; -use crate::compilation_unit::*; -use crate::util::{CharacterReader, count_first_whitespace_characters}; - -/// Represents a source location. This location includes -/// spanning lines and columns and the reference compilation unit. -#[derive(Clone, Deserialize)] -pub struct Location { - /// The compilation unit that this location belongs to. - #[serde(skip)] - pub(crate) compilation_unit: Rc, - - /// First UTF-8 offset. - #[serde(skip)] - pub(crate) first_offset: usize, - - /// Last UTF-8 offset. - #[serde(skip)] - pub(crate) last_offset: usize, -} - -impl Serialize for Location { - fn serialize(&self, serializer: S) -> Result - where - S: Serializer, - { - serializer.serialize_str(&format!("{}:{}-{}:{}", self.first_line_number(), self.first_column() + 1, self.last_line_number(), self.last_column() + 1)) - } -} - -impl Debug for Location { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - write!(f, - "Location(first_line_number={}, first_column={}, first_offset={}, last_line_number={}, last_column={}, last_offset={})", - self.first_line_number(), - self.first_column(), - self.first_offset, - self.last_line_number(), - self.last_column(), - self.last_offset - ) - } -} - -impl Eq for Location {} - -impl PartialEq for Location { - fn eq(&self, other: &Self) -> bool { - Rc::ptr_eq(&self.compilation_unit, &other.compilation_unit) && - self.first_offset == other.first_offset && - self.last_offset == other.last_offset - } -} - -impl Ord for Location { - fn cmp(&self, other: &Self) -> Ordering { - self.partial_cmp(other).unwrap_or(Ordering::Equal) - } -} - -impl PartialOrd for Location { - fn partial_cmp(&self, other: &Self) -> Option { - self.first_offset.partial_cmp(&other.first_offset) - } -} - -impl Location { - /// Builds a location. - pub fn with_offsets( - compilation_unit: &Rc, - first_offset: usize, - last_offset: usize, - ) -> Self { - Self { - compilation_unit: compilation_unit.clone(), - first_offset, - last_offset, - } - } - - /// Builds a location. - pub fn with_offset(compilation_unit: &Rc, offset: usize) -> Self { - Self::with_offsets(compilation_unit, offset, offset) - } - - /// Build a location by combining two locations. `self` - /// serves as the first location, while `other` serves as the - /// last location. - pub fn combine_with(&self, other: Location) -> Self { - Self { - compilation_unit: self.compilation_unit.clone(), - first_offset: self.first_offset, - last_offset: other.last_offset, - } - } - - /// Build a location by combining two locations. `self` - /// serves as the first location, while the first column and first line - /// of `other` serve as the last location. - pub fn combine_with_start_of(&self, other: Location) -> Self { - Self { - compilation_unit: self.compilation_unit.clone(), - first_offset: self.first_offset, - last_offset: other.first_offset, - } - } - - /// The compilation unit that this location belongs to. - pub fn compilation_unit(&self) -> Rc { - self.compilation_unit.clone() - } - - /// First line number, counted from one. - pub fn first_line_number(&self) -> usize { - self.compilation_unit.get_line_number(self.first_offset) - } - - /// Last line number, counted from one. - pub fn last_line_number(&self) -> usize { - self.compilation_unit.get_line_number(self.last_offset) - } - - // The first byte offset of this location. - pub fn first_offset(&self) -> usize { - self.first_offset - } - - // The last byte offset of this location. - pub fn last_offset(&self) -> usize { - self.last_offset - } - - /// Zero based first column of the location in code points. - pub fn first_column(&self) -> usize { - self.compilation_unit.get_column(self.first_offset) - } - - /// Zero based last column of the location in code points. - pub fn last_column(&self) -> usize { - self.compilation_unit.get_column(self.last_offset) - } - - pub fn character_count(&self) -> usize { - self.compilation_unit.text()[self.first_offset..self.last_offset].chars().count() - } - - /// Indicates whether a previous location and a next location - /// have a line break in between. - pub fn line_break(&self, other: &Self) -> bool { - self.last_line_number() != other.first_line_number() - } - - /// Returns the source text comprising the source location. - pub fn text(&self) -> String { - self.compilation_unit.text()[self.first_offset..self.last_offset].to_owned() - } - - /// Shifts a count of characters off this location until end-of-file. - pub fn shift_until_eof(&self, count: usize) -> Location { - let mut ch = CharacterReader::from(&self.compilation_unit.text()[self.first_offset..]); - for _ in 0..count { - if ch.next().is_none() { - break; - } - } - Self::with_offsets(&self.compilation_unit, self.first_offset + ch.index(), self.last_offset) - } - - /// Shifts the count of whitespace characters in a text off this location. - pub fn shift_whitespace(&self, text: &str) -> Location { - self.shift_until_eof(count_first_whitespace_characters(text)) - } -} \ No newline at end of file diff --git a/crates/parser/diagnostics.rs b/crates/parser/diagnostics.rs deleted file mode 100644 index 34522bf..0000000 --- a/crates/parser/diagnostics.rs +++ /dev/null @@ -1,6 +0,0 @@ -//! Defines the diagnostics produced by the parser. - -mod diagnostics; -pub use diagnostics::*; -mod diagnostic_kind; -pub use diagnostic_kind::*; \ No newline at end of file diff --git a/crates/parser/diagnostics/diagnostic_kind.rs b/crates/parser/diagnostics/diagnostic_kind.rs deleted file mode 100644 index 6931fe4..0000000 --- a/crates/parser/diagnostics/diagnostic_kind.rs +++ /dev/null @@ -1,77 +0,0 @@ -#[repr(i32)] -#[derive(Eq, PartialEq, Clone, Copy)] -pub enum DiagnosticKind { - InvalidEscapeValue = 1024, - UnexpectedEnd = 1025, - UnallowedNumericSuffix = 1026, - StringLiteralMustBeTerminatedBeforeLineBreak = 1027, - Expecting = 1028, - ExpectingIdentifier = 1029, - ExpectingExpression = 1030, - ExpectingXmlName = 1031, - ExpectingXmlAttributeValue = 1032, - IllegalNullishCoalescingLeftOperand = 1033, - WrongParameterPosition = 1034, - DuplicateRestParameter = 1035, - NotAllowedHere = 1036, - MalformedRestParameter = 1037, - IllegalForInInitializer = 1038, - MultipleForInBindings = 1039, - UndefinedLabel = 1040, - IllegalContinue = 1041, - IllegalBreak = 1042, - ExpressionMustNotFollowLineBreak = 1043, - TokenMustNotFollowLineBreak = 1044, - ExpectingStringLiteral = 1045, - DuplicateAttribute = 1046, - DuplicateAccessModifier = 1047, - ExpectingDirectiveKeyword = 1048, - UnallowedAttribute = 1049, - UseDirectiveMustContainPublic = 1050, - MalformedEnumMember = 1051, - FunctionMayNotBeGenerator = 1052, - FunctionMayNotBeAsynchronous = 1053, - FunctionMustNotContainBody = 1054, - FunctionMustContainBody = 1055, - FunctionMustNotContainAnnotations = 1056, - NestedClassesNotAllowed = 1057, - UnexpectedDirective = 1058, - FailedParsingAsDocTag = 1059, - UnrecognizedAsDocTag = 1060, - UnrecognizedProxy = 1061, - EnumMembersMustBeConst = 1062, - ConstructorMustNotSpecifyResultType = 1063, - UnrecognizedMetadataSyntax = 1064, - FailedToIncludeFile = 1065, - ParentSourceIsNotAFile = 1066, - CircularIncludeDirective = 1067, - MalformedDestructuring = 1068, - XmlPrefixNotDefined = 1069, - RedefiningXmlAttribute = 1070, - InvalidXmlPi = 1071, - XmlPiUnknownAttribute = 1072, - XmlPiVersion = 1073, - XmlPiEncoding = 1074, - XmlMustConsistOfExactly1Element = 1075, - XmlNameAtMostOneColon = 1076, - UnexpectedCharacter = 1077, - InputEndedBeforeReachingClosingQuoteForString = 1078, - InputEndedBeforeReachingClosingSeqForCData = 1079, - InputEndedBeforeReachingClosingSeqForPi = 1080, - InputEndedBeforeReachingClosingSeqForXmlComment = 1081, - InputEndedBeforeReachingClosingSeqForMultiLineComment = 1082, - InputEndedBeforeReachingClosingSlashForRegExp = 1083, - InputEndedBeforeReachingClosingQuoteForAttributeValue = 1084, - ExpectingEitherSemicolonOrNewLineHere = 1085, - CssInvalidHexEscape = 1086, - ExpectingDirective = 1087, - ExpectingStatement = 1088, - Unexpected = 1089, - XmlClosingTagNameMustBeEquals = 1090, -} - -impl DiagnosticKind { - pub fn id(&self) -> i32 { - *self as i32 - } -} \ No newline at end of file diff --git a/crates/parser/diagnostics/diagnostics.rs b/crates/parser/diagnostics/diagnostics.rs deleted file mode 100644 index 351b58c..0000000 --- a/crates/parser/diagnostics/diagnostics.rs +++ /dev/null @@ -1,175 +0,0 @@ -use std::any::Any; - -use maplit::hashmap; -use crate::ns::*; - -#[path = "diagnostics_english_resources.rs"] -mod diagnostics_english_resources; - -/// Represents a diagnostic originated from a compilation unit. -/// -/// Arguments are formatted using integer keys counted from 1 (one). -#[derive(Clone)] -pub struct Diagnostic { - pub(crate) location: Location, - pub(crate) kind: DiagnosticKind, - pub(crate) is_warning: bool, - pub(crate) is_verify_error: bool, - pub(crate) arguments: Vec>, - pub(crate) custom_kind: RefCell>>, -} - -impl Eq for Diagnostic {} - -impl PartialEq for Diagnostic { - fn eq(&self, other: &Self) -> bool { - self.location == other.location && - self.kind == other.kind - } -} - -impl Ord for Diagnostic { - fn cmp(&self, other: &Self) -> std::cmp::Ordering { - self.location.cmp(&other.location) - } -} - -impl PartialOrd for Diagnostic { - fn partial_cmp(&self, other: &Self) -> Option { - self.location.partial_cmp(&other.location) - } -} - -impl Diagnostic { - pub fn new_syntax_error(location: &Location, kind: DiagnosticKind, arguments: Vec>) -> Self { - Self { - location: location.clone(), - kind, - is_verify_error: false, - is_warning: false, - arguments, - custom_kind: RefCell::new(None), - } - } - - pub fn new_verify_error(location: &Location, kind: DiagnosticKind, arguments: Vec>) -> Self { - Self { - location: location.clone(), - kind, - is_verify_error: true, - is_warning: false, - arguments, - custom_kind: RefCell::new(None), - } - } - - pub fn new_warning(location: &Location, kind: DiagnosticKind, arguments: Vec>) -> Self { - Self { - location: location.clone(), - kind, - is_verify_error: false, - is_warning: true, - arguments, - custom_kind: RefCell::new(None), - } - } - - pub fn location(&self) -> Location { - self.location.clone() - } - - pub fn kind(&self) -> DiagnosticKind { - self.kind.clone() - } - - pub fn is_warning(&self) -> bool { - self.is_warning - } - - pub fn is_error(&self) -> bool { - !self.is_warning - } - - pub fn is_syntax_error(&self) -> bool { - !self.is_verify_error && !self.is_warning - } - - pub fn is_verify_error(&self) -> bool { - self.is_verify_error - } - - pub fn arguments(&self) -> Vec> { - self.arguments.clone() - } - - pub fn id(&self) -> i32 { - self.kind.id() - } - - pub fn custom_kind(&self) -> Option> { - self.custom_kind.borrow().clone() - } - - pub fn set_custom_kind(&self, id: Option>) { - self.custom_kind.replace(id); - } - - /// Formats the diagnostic by overriding the message text. - pub fn format_with_message(&self, message: &str, id: Option) -> String { - let category = (if self.is_verify_error { - "Verify error" - } else if self.is_warning { - "Warning" - } else { - "Syntax error" - }).to_owned(); - - let file_path = self.location.compilation_unit.file_path.clone().map_or("".to_owned(), |s| format!("{s}:")); - let line = self.location.first_line_number(); - let column = self.location.first_column() + 1; - if let Some(id) = id { - format!("{file_path}{line}:{column}: {category} #{}: {message}", id.to_string()) - } else { - format!("{file_path}{line}:{column}: {category}: {message}") - } - } - - /// Formats the diagnostic in English. - pub fn format_english(&self) -> String { - self.format_with_message(&self.format_message_english(), Some(self.id())) - } - - pub fn format_message_english(&self) -> String { - self.format_message(&diagnostics_english_resources::DATA) - } - - pub fn format_message(&self, messages: &HashMap) -> String { - let mut string_arguments: HashMap = hashmap!{}; - let mut i = 1; - for argument in &self.arguments { - string_arguments.insert(i.to_string(), argument.to_string()); - i += 1; - } - use late_format::LateFormat; - let Some(msg) = messages.get(&self.id()) else { - let id = self.id(); - panic!("Message resource is missing for ID {id}"); - }; - msg.late_format(string_arguments) - } -} - -/// The `diagarg![...]` literal is used for initializing -/// diagnostic arguments. -/// -/// For example: `diagarg![token, "foo".to_owned()]`. -pub macro diagarg { - ($($value:expr),*) => { vec![ $(Rc::new($value)),* ] }, -} - -pub trait DiagnosticArgument: Any + ToString + 'static { -} - -impl DiagnosticArgument for String {} - -impl DiagnosticArgument for Token {} \ No newline at end of file diff --git a/crates/parser/diagnostics/diagnostics_english_resources.rs b/crates/parser/diagnostics/diagnostics_english_resources.rs deleted file mode 100644 index dd28ee6..0000000 --- a/crates/parser/diagnostics/diagnostics_english_resources.rs +++ /dev/null @@ -1,76 +0,0 @@ -use lazy_static::lazy_static; -use maplit::hashmap; -use crate::ns::*; - -lazy_static! { - pub static ref DATA: HashMap = hashmap! { - // DiagnosticKind::K.id() => ".".into(), - DiagnosticKind::InvalidEscapeValue.id() => "Invalid escape value.".into(), - DiagnosticKind::UnexpectedEnd.id() => "Unexpected end-of-file.".into(), - DiagnosticKind::UnallowedNumericSuffix.id() => "Unallowed numeric suffix.".into(), - DiagnosticKind::StringLiteralMustBeTerminatedBeforeLineBreak.id() => "A string literal must be terminated before the line break.".into(), - DiagnosticKind::Expecting.id() => "Expecting {1} before {2}.".into(), - DiagnosticKind::ExpectingIdentifier.id() => "Expecting identifier before {1}.".into(), - DiagnosticKind::ExpectingExpression.id() => "Expecting expression before {1}.".into(), - DiagnosticKind::ExpectingXmlName.id() => "Expecting XML name before {1}.".into(), - DiagnosticKind::ExpectingXmlAttributeValue.id() => "Expecting XML attribute value before {1}.".into(), - DiagnosticKind::IllegalNullishCoalescingLeftOperand.id() => "Illegal nullish coalescing left operand.".into(), - DiagnosticKind::WrongParameterPosition.id() => "Wrong parameter position.".into(), - DiagnosticKind::DuplicateRestParameter.id() => "Duplicate rest parameter.".into(), - DiagnosticKind::NotAllowedHere.id() => "{1} not allowed here.".into(), - DiagnosticKind::MalformedRestParameter.id() => "Malformed rest parameter.".into(), - DiagnosticKind::IllegalForInInitializer.id() => "Illegal 'for..in' initializer.".into(), - DiagnosticKind::MultipleForInBindings.id() => "Multiple 'for..in' bindings are not allowed.".into(), - DiagnosticKind::UndefinedLabel.id() => "Undefined label '{1}'.".into(), - DiagnosticKind::IllegalContinue.id() => "Illegal continue statement.".into(), - DiagnosticKind::IllegalBreak.id() => "Illegal break statement.".into(), - DiagnosticKind::ExpressionMustNotFollowLineBreak.id() => "Expression must not follow line break.".into(), - DiagnosticKind::TokenMustNotFollowLineBreak.id() => "Token must not follow line break.".into(), - DiagnosticKind::ExpectingStringLiteral.id() => "Expecting string literal before {1}.".into(), - DiagnosticKind::DuplicateAttribute.id() => "Duplicate attribute.".into(), - DiagnosticKind::DuplicateAccessModifier.id() => "Duplicate access modifier.".into(), - DiagnosticKind::ExpectingDirectiveKeyword.id() => "Expecting either 'var', 'const', 'function', 'class' or 'interface'.".into(), - DiagnosticKind::UnallowedAttribute.id() => "Unallowed attribute.".into(), - DiagnosticKind::UseDirectiveMustContainPublic.id() => "Use directive must contain the 'public' attribute.".into(), - DiagnosticKind::MalformedEnumMember.id() => "Malformed enumeration member.".into(), - DiagnosticKind::FunctionMayNotBeGenerator.id() => "Function may not be generator.".into(), - DiagnosticKind::FunctionMayNotBeAsynchronous.id() => "Function may not be asynchronous.".into(), - DiagnosticKind::FunctionMustNotContainBody.id() => "Function must not contain body.".into(), - DiagnosticKind::FunctionMustContainBody.id() => "Function must contain body.".into(), - DiagnosticKind::FunctionMustNotContainAnnotations.id() => "Function must not contain annotations.".into(), - DiagnosticKind::NestedClassesNotAllowed.id() => "Nested classes are not allowed.".into(), - DiagnosticKind::UnexpectedDirective.id() => "Unexpected directive.".into(), - DiagnosticKind::FailedParsingAsDocTag.id() => "Failed parsing contents of ASDoc tag: '@{1}'.".into(), - DiagnosticKind::UnrecognizedAsDocTag.id() => "Unrecognized ASDoc tag: '@{1}'.".into(), - DiagnosticKind::UnrecognizedProxy.id() => "Unrecognized proxy: '{1}'.".into(), - DiagnosticKind::EnumMembersMustBeConst.id() => "Enumeration members must be 'const'.".into(), - DiagnosticKind::UnrecognizedMetadataSyntax.id() => "Unrecognized meta-data syntax.".into(), - DiagnosticKind::FailedToIncludeFile.id() => "Failed to include file.".into(), - DiagnosticKind::ParentSourceIsNotAFile.id() => "Parent source is not a file.".into(), - DiagnosticKind::CircularIncludeDirective.id() => "Circular include directive.".into(), - DiagnosticKind::MalformedDestructuring.id() => "Malformed destructuring.".into(), - DiagnosticKind::XmlPrefixNotDefined.id() => "Prefix not defined: '{1}'.".into(), - DiagnosticKind::RedefiningXmlAttribute.id() => "Redefining attribute: '{1}'.".into(), - DiagnosticKind::InvalidXmlPi.id() => "Invalid processing instruction.".into(), - DiagnosticKind::XmlPiUnknownAttribute.id() => "Unknown attribute at processing instruction: '{1}'.".into(), - DiagnosticKind::XmlPiVersion.id() => "XML version must be '1.0'.".into(), - DiagnosticKind::XmlPiEncoding.id() => "XML encoding must be either 'utf-8' or 'utf-16'.".into(), - DiagnosticKind::XmlMustConsistOfExactly1Element.id() => "Document must consist of exactly one element.".into(), - DiagnosticKind::XmlNameAtMostOneColon.id() => "XML name may have at most one colon.".into(), - DiagnosticKind::UnexpectedCharacter.id() => "Unexpected character. '{1}' is not allowed here".into(), - DiagnosticKind::InputEndedBeforeReachingClosingQuoteForString.id() => "Input ended before reaching the closing quotation mark for a string literal.".into(), - DiagnosticKind::InputEndedBeforeReachingClosingSeqForCData.id() => "Input ended before reaching the closing ']]>' for a CDATA.".into(), - DiagnosticKind::InputEndedBeforeReachingClosingSeqForPi.id() => "Input ended before reaching the closing '?>' for a processing instruction.".into(), - DiagnosticKind::InputEndedBeforeReachingClosingSeqForXmlComment.id() => "Input ended before reaching the closing '-->' for a comment.".into(), - DiagnosticKind::InputEndedBeforeReachingClosingSeqForMultiLineComment.id() => "Input ended before reaching the closing '*/' for a comment.".into(), - DiagnosticKind::InputEndedBeforeReachingClosingSlashForRegExp.id() => "Input ended before reaching the closing slash for a regular expression.".into(), - DiagnosticKind::InputEndedBeforeReachingClosingQuoteForAttributeValue.id() => "Input ended before reaching the closing quotation mark for an attribute value.".into(), - DiagnosticKind::ExpectingEitherSemicolonOrNewLineHere.id() => "Expecting either a semicolon or a new line here.".into(), - DiagnosticKind::CssInvalidHexEscape.id() => "Invalid hexadecimal escape: '\\{1}'.".into(), - DiagnosticKind::ExpectingDirective.id() => "Expecting directive before {1}.".into(), - DiagnosticKind::ExpectingStatement.id() => "Expecting statement before {1}.".into(), - DiagnosticKind::Unexpected.id() => "Unexpected {1}.".into(), - DiagnosticKind::XmlClosingTagNameMustBeEquals.id() => "Closing tag name must be equals '{1}'.".into(), - // DiagnosticKind::K.id() => ".".into(), - }; -} diff --git a/crates/parser/lib.rs b/crates/parser/lib.rs deleted file mode 100644 index c82a279..0000000 --- a/crates/parser/lib.rs +++ /dev/null @@ -1,11 +0,0 @@ -#![feature(decl_macro)] -#![feature(try_blocks)] - -pub mod tree; -pub mod compilation_unit; -pub mod diagnostics; -pub mod operator; -pub mod parser; -pub mod util; - -pub mod ns; \ No newline at end of file diff --git a/crates/parser/ns.rs b/crates/parser/ns.rs deleted file mode 100644 index 09adc4b..0000000 --- a/crates/parser/ns.rs +++ /dev/null @@ -1,8 +0,0 @@ -//! The `ns` module is an union of all of the parser modules. - -pub use crate::tree::*; -pub use crate::compilation_unit::*; -pub use crate::diagnostics::*; -pub use crate::operator::*; -pub use crate::parser::*; -pub use crate::util::*; \ No newline at end of file diff --git a/crates/parser/operator.rs b/crates/parser/operator.rs deleted file mode 100644 index bbad3db..0000000 --- a/crates/parser/operator.rs +++ /dev/null @@ -1,6 +0,0 @@ -//! Defines the ActionScript 3 operators. - -mod operator; -pub use operator::*; -mod operator_precedence; -pub use operator_precedence::*; \ No newline at end of file diff --git a/crates/parser/operator/operator.rs b/crates/parser/operator/operator.rs deleted file mode 100644 index 69cd19a..0000000 --- a/crates/parser/operator/operator.rs +++ /dev/null @@ -1,127 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -/// Represents an ActionScript operator. -#[derive(Copy, Clone, PartialEq, Eq, Debug, Serialize, Deserialize)] -pub enum Operator { - PostIncrement, - PostDecrement, - NonNull, - Delete, - Void, - Typeof, - Await, - Yield, - PreIncrement, - PreDecrement, - Positive, - Negative, - BitwiseNot, - LogicalNot, - - Power, - Multiply, - Divide, - Remainder, - Add, - Subtract, - ShiftLeft, - ShiftRight, - ShiftRightUnsigned, - Lt, - Gt, - Le, - Ge, - Instanceof, - In, - NotIn, - Is, - IsNot, - As, - Equals, - NotEquals, - StrictEquals, - StrictNotEquals, - BitwiseAnd, - BitwiseXor, - BitwiseOr, - LogicalAnd, - LogicalXor, - LogicalOr, - NullCoalescing, -} - -/// Represents binary operator associativity. -#[derive(Copy, Clone, PartialEq, Eq)] -pub enum BinaryAssociativity { - LeftToRight, - RightToLeft, -} - -/// Represents an ActionScript binary operator. -#[derive(Copy, Clone, PartialEq, Eq)] -pub struct BinaryOperator(pub Operator, pub OperatorPrecedence, pub BinaryAssociativity); - -impl BinaryOperator { - pub fn operator(&self) -> Operator { - self.0 - } - - pub fn precedence(&self) -> OperatorPrecedence { - self.1 - } - - pub fn associativity(&self) -> BinaryAssociativity { - self.2 - } - - pub fn right_precedence(&self) -> OperatorPrecedence { - if self.operator() == Operator::NullCoalescing { - OperatorPrecedence::BitwiseOr - } else { - self.precedence().add(if self.associativity() == BinaryAssociativity::LeftToRight { 1 } else { 0 }).unwrap() - } - } -} - -impl TryFrom for BinaryOperator { - type Error = (); - /// Constructs `BinaryOperator` from abstract operator. - fn try_from(value: Operator) -> Result { - match value { - Operator::Multiply => Ok(BinaryOperator(value, OperatorPrecedence::Multiplicative, BinaryAssociativity::LeftToRight)), - Operator::Divide => Ok(BinaryOperator(value, OperatorPrecedence::Multiplicative, BinaryAssociativity::LeftToRight)), - Operator::Remainder => Ok(BinaryOperator(value, OperatorPrecedence::Multiplicative, BinaryAssociativity::LeftToRight)), - Operator::Add => Ok(BinaryOperator(value, OperatorPrecedence::Additive, BinaryAssociativity::LeftToRight)), - Operator::Subtract => Ok(BinaryOperator(value, OperatorPrecedence::Additive, BinaryAssociativity::LeftToRight)), - Operator::ShiftLeft => Ok(BinaryOperator(value, OperatorPrecedence::Shift, BinaryAssociativity::LeftToRight)), - Operator::ShiftRight => Ok(BinaryOperator(value, OperatorPrecedence::Shift, BinaryAssociativity::LeftToRight)), - Operator::ShiftRightUnsigned => Ok(BinaryOperator(value, OperatorPrecedence::Shift, BinaryAssociativity::LeftToRight)), - Operator::Lt => Ok(BinaryOperator(value, OperatorPrecedence::Relational, BinaryAssociativity::LeftToRight)), - Operator::Gt => Ok(BinaryOperator(value, OperatorPrecedence::Relational, BinaryAssociativity::LeftToRight)), - Operator::Le => Ok(BinaryOperator(value, OperatorPrecedence::Relational, BinaryAssociativity::LeftToRight)), - Operator::Ge => Ok(BinaryOperator(value, OperatorPrecedence::Relational, BinaryAssociativity::LeftToRight)), - Operator::As => Ok(BinaryOperator(value, OperatorPrecedence::Relational, BinaryAssociativity::LeftToRight)), - Operator::In => Ok(BinaryOperator(value, OperatorPrecedence::Relational, BinaryAssociativity::LeftToRight)), - Operator::NotIn => Ok(BinaryOperator(value, OperatorPrecedence::Relational, BinaryAssociativity::LeftToRight)), - Operator::Instanceof => Ok(BinaryOperator(value, OperatorPrecedence::Relational, BinaryAssociativity::LeftToRight)), - Operator::Is => Ok(BinaryOperator(value, OperatorPrecedence::Relational, BinaryAssociativity::LeftToRight)), - Operator::IsNot => Ok(BinaryOperator(value, OperatorPrecedence::Relational, BinaryAssociativity::LeftToRight)), - Operator::Equals => Ok(BinaryOperator(value, OperatorPrecedence::Equality, BinaryAssociativity::LeftToRight)), - Operator::NotEquals => Ok(BinaryOperator(value, OperatorPrecedence::Equality, BinaryAssociativity::LeftToRight)), - Operator::StrictEquals => Ok(BinaryOperator(value, OperatorPrecedence::Equality, BinaryAssociativity::LeftToRight)), - Operator::StrictNotEquals => Ok(BinaryOperator(value, OperatorPrecedence::Equality, BinaryAssociativity::LeftToRight)), - Operator::BitwiseAnd => Ok(BinaryOperator(value, OperatorPrecedence::BitwiseAnd, BinaryAssociativity::LeftToRight)), - Operator::BitwiseXor => Ok(BinaryOperator(value, OperatorPrecedence::BitwiseXor, BinaryAssociativity::LeftToRight)), - Operator::BitwiseOr => Ok(BinaryOperator(value, OperatorPrecedence::BitwiseOr, BinaryAssociativity::LeftToRight)), - Operator::LogicalAnd => Ok(BinaryOperator(value, OperatorPrecedence::LogicalAnd, BinaryAssociativity::LeftToRight)), - Operator::LogicalXor => Ok(BinaryOperator(value, OperatorPrecedence::LogicalXor, BinaryAssociativity::LeftToRight)), - Operator::LogicalOr => Ok(BinaryOperator(value, OperatorPrecedence::LogicalOrAndOther, BinaryAssociativity::LeftToRight)), - Operator::NullCoalescing => Ok(BinaryOperator(value, OperatorPrecedence::LogicalOrAndOther, BinaryAssociativity::LeftToRight)), - - Operator::Power => Ok(BinaryOperator(value, OperatorPrecedence::Exponentiation, BinaryAssociativity::RightToLeft)), - - _ => Err(()), - } - } -} \ No newline at end of file diff --git a/crates/parser/operator/operator_precedence.rs b/crates/parser/operator/operator_precedence.rs deleted file mode 100644 index 68b0abe..0000000 --- a/crates/parser/operator/operator_precedence.rs +++ /dev/null @@ -1,77 +0,0 @@ -use num_derive::FromPrimitive; -use num_traits::FromPrimitive; - -#[derive(FromPrimitive)] -#[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord)] -#[repr(u32)] -pub enum OperatorPrecedence { - Postfix = 16, - Unary = 15, - Exponentiation = 14, - Multiplicative = 13, - Additive = 12, - Shift = 11, - Relational = 10, - Equality = 9, - BitwiseAnd = 8, - BitwiseXor = 7, - BitwiseOr = 6, - LogicalAnd = 5, - LogicalXor = 4, - /// Includes logical OR and nullish coalescing (`??`). - LogicalOrAndOther = 3, - /// Includes assignment operators, conditional operator, function expression and `yield` operator. - AssignmentAndOther = 2, - List = 1, -} - -impl OperatorPrecedence { - pub fn add(&self, value: u32) -> Option { - FromPrimitive::from_u32(*self as u32 + value) - } - - pub fn value_of(&self) -> u32 { - *self as u32 - } - - pub fn includes(&self, other: &Self) -> bool { - *self <= *other - } -} - -impl TryFrom for OperatorPrecedence { - type Error = (); - fn try_from(value: u32) -> Result { - if let Some(v) = FromPrimitive::from_u32(value as u32) { Ok(v) } else { Err(()) } - } -} - -#[derive(FromPrimitive)] -#[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord)] -#[repr(u32)] -pub enum CssOperatorPrecedence { - Unary = 3, - MultiValue = 2, - Array = 1, -} - -impl CssOperatorPrecedence { - pub fn add(&self, value: u32) -> Option { - FromPrimitive::from_u32(*self as u32 + value) - } - - pub fn value_of(&self) -> u32 { - *self as u32 - } - - pub fn includes(&self, other: &Self) -> bool { - *self <= *other - } -} - -impl TryFrom for CssOperatorPrecedence { - type Error = (); - fn try_from(value: u32) -> Result { - if let Some(v) = FromPrimitive::from_u32(value as u32) { Ok(v) } else { Err(()) } - } -} \ No newline at end of file diff --git a/crates/parser/parser.rs b/crates/parser/parser.rs deleted file mode 100644 index 897a3e2..0000000 --- a/crates/parser/parser.rs +++ /dev/null @@ -1,23 +0,0 @@ -//! Defines the parser and the tokenizer. -//! -//! Using the methods of the `ParserFacade` structure is the most common way of parsing -//! programs until end-of-file. - -mod character_validator; -pub use character_validator::*; -mod context; -pub use context::*; -mod reserved_word; -pub use reserved_word::*; -mod parser; -pub use parser::*; -mod css_parser; -pub use css_parser::*; -mod css_tokenizer; -pub use css_tokenizer::*; -mod parser_error; -pub use parser_error::*; -mod token; -pub use token::*; -mod tokenizer; -pub use tokenizer::*; \ No newline at end of file diff --git a/crates/parser/parser/character_validator.rs b/crates/parser/parser/character_validator.rs deleted file mode 100644 index ef06b61..0000000 --- a/crates/parser/parser/character_validator.rs +++ /dev/null @@ -1,147 +0,0 @@ -//use lazy_regex::{Lazy, Regex, lazy_regex}; -use unicode_general_category::{get_general_category, GeneralCategory}; - -// pub(crate) static CR_OR_CRLF_REGEX: Lazy = lazy_regex!(r"\r\n?"); - -/// The `CharacterValidator` structure defines static methods for character -/// validation. -pub struct CharacterValidator; - -impl CharacterValidator { - /// Returns the count of indentation characters in a string. - pub fn indent_count(string: &str) -> usize { - let mut n: usize = 0; - for ch in string.chars() { - if !CharacterValidator::is_whitespace(ch) { - break; - } - n += 1; - } - n - } - - pub fn is_whitespace(ch: char) -> bool { - if ch == '\x20' || ch == '\x09' || ch == '\x08' - || ch == '\x0C' || ch == '\u{A0}' { - return true; - } - let category = get_general_category(ch); - category == GeneralCategory::SpaceSeparator - } - - pub fn is_line_terminator(ch: char) -> bool { - ch == '\x0A' || ch == '\x0D' || ch == '\u{2028}' || ch == '\u{2029}' - } - - pub fn is_bin_digit(ch: char) -> bool { - ch == '\x30' || ch == '\x31' - } - - pub fn is_dec_digit(ch: char) -> bool { - ch >= '\x30' && ch <= '\x39' - } - - pub fn is_hex_digit(ch: char) -> bool { - CharacterValidator::is_dec_digit(ch) || (ch >= '\x41' && ch <= '\x46') || (ch >= '\x61' && ch <= '\x66') - } - - /// Returns the mathematical value of a hexadecimal digit. - pub fn hex_digit_mv(ch: char) -> Option { - if ch >= 'A' && ch <= 'F' { - Some((ch as u32) - 0x41 + 10) - } else if ch >= 'a' && ch <= 'f' { - Some((ch as u32) - 0x61 + 10) - } else if ch >= '0' && ch <= '9' { - Some((ch as u32) - 0x30) - } else { - None - } - } - - /// Returns the mathematical value of a binary digit. - pub fn bin_digit_mv(ch: char) -> Option { - if ch >= '0' && ch <= '1' { - Some((ch as u32) - 0x30) - } else { - None - } - } - - pub fn is_css_identifier_start(ch: char) -> bool { - (ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z') - } - - pub fn is_css_identifier_part(ch: char) -> bool { - (ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z') || - (ch >= '0' && ch <= '9') || ch == '_' || ch == '-' - } - - pub fn is_identifier_start(ch: char) -> bool { - if ch == '\x5f' || ch == '\x24' { - return true; - } - let category = get_general_category(ch); - [ - GeneralCategory::LowercaseLetter, - GeneralCategory::UppercaseLetter, - GeneralCategory::ModifierLetter, - GeneralCategory::OtherLetter, - GeneralCategory::TitlecaseLetter, - GeneralCategory::LetterNumber, - ].contains(&category) - } - - pub fn is_identifier_part(ch: char) -> bool { - if ch == '\x5f' || ch == '\x24' { - return true; - } - let category = get_general_category(ch); - [ - GeneralCategory::LowercaseLetter, - GeneralCategory::UppercaseLetter, - GeneralCategory::ModifierLetter, - GeneralCategory::OtherLetter, - GeneralCategory::TitlecaseLetter, - GeneralCategory::LetterNumber, - GeneralCategory::NonspacingMark, - GeneralCategory::SpacingMark, - GeneralCategory::ConnectorPunctuation, - GeneralCategory::DecimalNumber, - ].contains(&category) - } - - pub fn is_xml_name_start(ch: char) -> bool { - if ch == '\x5f' || ch == ':' { - return true; - } - let category = get_general_category(ch); - [ - GeneralCategory::LowercaseLetter, - GeneralCategory::UppercaseLetter, - GeneralCategory::ModifierLetter, - GeneralCategory::OtherLetter, - GeneralCategory::TitlecaseLetter, - GeneralCategory::LetterNumber, - ].contains(&category) - } - - pub fn is_xml_name_part(ch: char) -> bool { - if ch == '\x5f' || ch == ':' || ch == '.' || ch == '-' { - return true; - } - let category = get_general_category(ch); - [ - GeneralCategory::LowercaseLetter, - GeneralCategory::UppercaseLetter, - GeneralCategory::ModifierLetter, - GeneralCategory::OtherLetter, - GeneralCategory::TitlecaseLetter, - GeneralCategory::LetterNumber, - GeneralCategory::DecimalNumber, - ].contains(&category) - } - - pub fn is_xml_whitespace(ch: char) -> bool { - ch == '\x20' || ch == '\x09' || ch == '\x0A' || ch == '\x0D' - } -} \ No newline at end of file diff --git a/crates/parser/parser/context.rs b/crates/parser/parser/context.rs deleted file mode 100644 index 3132d5b..0000000 --- a/crates/parser/parser/context.rs +++ /dev/null @@ -1,174 +0,0 @@ -use crate::ns::*; - -/// Context used to control the parsing of an expression. -#[derive(Clone)] -pub struct ParserExpressionContext { - pub min_precedence: OperatorPrecedence, - pub allow_in: bool, - pub allow_assignment: bool, -} - -impl Default for ParserExpressionContext { - fn default() -> Self { - Self { - min_precedence: OperatorPrecedence::List, - allow_in: true, - allow_assignment: true, - } - } -} - -#[derive(Clone)] -pub enum ParserDirectiveContext { - Default, - TopLevel, - PackageBlock, - ClassBlock { - name: String, - }, - InterfaceBlock, - EnumBlock, - ConstructorBlock { - super_statement_found: Rc>, - }, - WithControl { - super_statement_found: Option>>, - to_be_labeled: Option, - control_context: ParserControlFlowContext, - labels: HashMap, - }, -} - -impl ParserDirectiveContext { - pub fn may_contain_super_statement(&self) -> bool { - matches!(self, Self::ConstructorBlock { .. }) || matches!(self, Self::WithControl { .. }) - } - - pub fn super_statement_found(&self) -> bool { - match self { - Self::ConstructorBlock { super_statement_found } => super_statement_found.get(), - Self::WithControl { super_statement_found, .. } => super_statement_found.as_ref().or(Some(&Rc::new(Cell::new(false)))).unwrap().get(), - _ => false, - } - } - - pub fn set_super_statement_found(&self, value: bool) { - match self { - Self::ConstructorBlock { super_statement_found } => { super_statement_found.set(value) }, - Self::WithControl { super_statement_found, .. } => { - if let Some(found) = super_statement_found.as_ref() { - found.set(value); - } - }, - _ => {}, - } - } - - pub fn function_name_is_constructor(&self, name: &(String, Location)) -> bool { - if let ParserDirectiveContext::ClassBlock { name: ref name_1 } = self { - &name.0 == name_1 - } else { - false - } - } - - pub fn is_top_level_or_package(&self) -> bool { - matches!(self, ParserDirectiveContext::TopLevel) || matches!(self, ParserDirectiveContext::PackageBlock) - } - - pub fn is_type_block(&self) -> bool { - match self { - Self::ClassBlock { .. } | - Self::InterfaceBlock | - Self::EnumBlock => true, - _ => false, - } - } - - pub fn clone_control(&self) -> Self { - match self { - Self::WithControl { .. } => self.clone(), - _ => Self::Default, - } - } - - pub fn override_control_context(&self, label_only: bool, mut context: ParserControlFlowContext) -> Self { - let mut prev_context = None; - let mut label = None; - let mut super_statement_found: Option>> = None; - let mut labels = match self { - Self::WithControl { control_context, labels, to_be_labeled: label1, super_statement_found: super_found_1 } => { - prev_context = Some(control_context.clone()); - label = label1.clone(); - super_statement_found = super_found_1.clone(); - labels.clone() - }, - _ => HashMap::new(), - }; - if let Some(label) = label.clone() { - labels.insert(label, context.clone()); - } - if label_only { - context = prev_context.unwrap_or(ParserControlFlowContext { - breakable: false, - iteration: false, - }); - } - Self::WithControl { control_context: context, labels, to_be_labeled: None, super_statement_found } - } - - pub fn put_label(&self, label: String) -> Self { - match self { - Self::WithControl { control_context, labels, to_be_labeled: _, super_statement_found } => Self::WithControl { - to_be_labeled: Some(label), - control_context: control_context.clone(), - labels: labels.clone(), - super_statement_found: super_statement_found.clone(), - }, - _ => Self::WithControl { - to_be_labeled: Some(label), - control_context: ParserControlFlowContext { - breakable: false, - iteration: false, - }, - labels: HashMap::new(), - super_statement_found: match self { - Self::ConstructorBlock { super_statement_found } => Some(super_statement_found.clone()), - _ => None, - }, - }, - } - } - - pub fn is_label_defined(&self, label: String) -> bool { - self.resolve_label(label).is_some() - } - - pub fn resolve_label(&self, label: String) -> Option { - if let Self::WithControl { labels, .. } = &self { labels.get(&label).map(|c| c.clone()) } else { None } - } - - pub fn is_break_allowed(&self, label: Option) -> bool { - if let Some(label) = label { - let context = self.resolve_label(label); - if let Some(context) = context { context.breakable } else { false } - } else { - if let Self::WithControl { control_context, .. } = &self { control_context.breakable } else { false } - } - } - - pub fn is_continue_allowed(&self, label: Option) -> bool { - if let Some(label) = label { - let context = self.resolve_label(label); - if let Some(context) = context { context.iteration } else { false } - } else { - if let Self::WithControl { control_context, .. } = &self { control_context.iteration } else { false } - } - } -} - -#[derive(Clone)] -pub struct ParserControlFlowContext { - pub breakable: bool, - pub iteration: bool, -} \ No newline at end of file diff --git a/crates/parser/parser/css_parser.rs b/crates/parser/parser/css_parser.rs deleted file mode 100644 index c7f64a1..0000000 --- a/crates/parser/parser/css_parser.rs +++ /dev/null @@ -1,847 +0,0 @@ -use crate::ns::*; -use num_traits::ToPrimitive; - -pub struct CssParser<'input> { - tokenizer: CssTokenizer<'input>, - previous_token: (Token, Location), - token: (Token, Location), - locations: Vec, - expecting_token_error: bool, -} - -impl<'input> CssParser<'input> { - /// Constructs a tokenizer. - pub fn new(compilation_unit: &'input Rc, options: &ParserOptions) -> Self { - Self { - tokenizer: CssTokenizer::new(compilation_unit, options), - previous_token: (Token::Eof, Location::with_offset(&compilation_unit, 0)), - token: (Token::Eof, Location::with_offset(&compilation_unit, 0)), - locations: vec![], - expecting_token_error: false, - } - } - - fn options(&self) -> ParserOptions { - ParserOptions { - ..default() - } - } - - fn compilation_unit(&self) -> &Rc { - self.tokenizer.compilation_unit() - } - - fn token_location(&self) -> Location { - self.token.1.clone() - } - - fn mark_location(&mut self) { - self.locations.push(self.token.1.clone()); - } - - fn duplicate_location(&mut self) { - self.locations.push(self.locations.last().unwrap().clone()); - } - - fn push_location(&mut self, location: &Location) { - self.locations.push(location.clone()); - } - - fn pop_location(&mut self) -> Location { - self.locations.pop().unwrap().combine_with(self.previous_token.1.clone()) - } - - fn add_syntax_error(&self, location: &Location, kind: DiagnosticKind, arguments: Vec>) { - if self.compilation_unit().prevent_equal_offset_error(location) { - return; - } - self.compilation_unit().add_diagnostic(Diagnostic::new_syntax_error(location, kind, arguments)); - } - - /* - fn add_warning(&self, location: &Location, kind: DiagnosticKind, arguments: Vec>) { - if self.compilation_unit().prevent_equal_offset_warning(location) { - return; - } - self.compilation_unit().add_diagnostic(Diagnostic::new_warning(location, kind, arguments)); - } - */ - - fn next(&mut self) { - self.previous_token = self.token.clone(); - self.token = self.tokenizer.scan(); - } - - fn peek(&self, token: Token) -> bool { - self.token.0 == token - } - - fn peek_identifier(&self) -> Option<(String, Location)> { - if let Token::Identifier(id) = self.token.0.clone() { - let location = self.token.1.clone(); - Some((id, location)) - } else { - None - } - } - - fn peek_keyword(&self, name: &str) -> bool { - if let Token::Identifier(id) = self.token.0.clone() { id == name && self.token.1.character_count() == name.len() } else { false } - } - - fn consume(&mut self, token: Token) -> bool { - if self.token.0 == token { - self.next(); - true - } else { - false - } - } - - fn consume_identifier(&mut self) -> Option<(String, Location)> { - if let Token::Identifier(id) = self.token.0.clone() { - let location = self.token.1.clone(); - self.next(); - Some((id, location)) - } else { - None - } - } - - fn consume_keyword(&mut self, name: &str) -> bool { - if let Token::Identifier(name1) = self.token.0.clone() { - if name1 == name { - self.next(); - return true; - } - } - false - } - - /// Expects a token in non-greedy mode: if it fails, does not skip any token. - fn expect(&mut self, token: Token) { - if self.token.0 != token { - self.expecting_token_error = true; - self.add_syntax_error(&self.token_location(), DiagnosticKind::Expecting, diagarg![token.clone(), self.token.0.clone()]); - } else { - self.expecting_token_error = false; - self.next(); - } - } - - fn expect_identifier(&mut self) -> (String, Location) { - if let Token::Identifier(id) = self.token.0.clone() { - self.expecting_token_error = false; - let location = self.token.1.clone(); - self.next(); - (id, location) - } else { - self.expecting_token_error = true; - self.add_syntax_error(&self.token_location(), DiagnosticKind::ExpectingIdentifier, diagarg![self.token.0.clone()]); - (INVALIDATED_IDENTIFIER.to_owned(), self.tokenizer.cursor_location()) - } - } - - fn expect_unitless_number(&mut self) -> Option { - if let Token::CssNumber { value, .. } = self.token.0.clone() { - self.expecting_token_error = false; - self.next(); - Some(value) - } else { - self.expecting_token_error = true; - self.add_syntax_error(&self.token_location(), DiagnosticKind::Unexpected, diagarg![self.token.0.clone()]); - None - } - } - - fn expect_string(&mut self) -> (String, Location) { - if let Token::String(v) = self.token.0.clone() { - self.expecting_token_error = false; - let location = self.token.1.clone(); - self.next(); - (v, location) - } else { - self.expecting_token_error = true; - self.add_syntax_error(&self.token_location(), DiagnosticKind::ExpectingStringLiteral, diagarg![self.token.0.clone()]); - ("".into(), self.tokenizer.cursor_location()) - } - } - - pub fn expect_eof(&mut self) { - self.expect(Token::Eof); - } - - fn create_invalidated_directive(&self, location: &Location) -> Rc { - Rc::new(CssDirective::Invalidated(InvalidatedNode { - location: location.clone(), - })) - } - - fn create_invalidated_property_value(&self, location: &Location) -> Rc { - Rc::new(CssPropertyValue::Invalidated(InvalidatedNode { - location: location.clone(), - })) - } - - fn _create_invalidated_selector(&self, location: &Location) -> Rc { - Rc::new(CssSelector::Invalidated(InvalidatedNode { - location: location.clone(), - })) - } - - fn create_invalidated_selector_condition(&self, location: &Location) -> Rc { - Rc::new(CssSelectorCondition::Invalidated(InvalidatedNode { - location: location.clone(), - })) - } - - fn create_invalidated_media_query_condition(&self, location: &Location) -> Rc { - Rc::new(CssMediaQueryCondition::Invalidated(InvalidatedNode { - location: location.clone(), - })) - } - - fn eof(&self) -> bool { - matches!(self.token.0, Token::Eof) - } - - pub fn parse_document(&mut self) -> Rc { - self.mark_location(); - let just_eof = self.peek(Token::Eof); - let mut directives: Vec> = vec![]; - while !self.eof() { - directives.push(self.parse_directive()); - } - let loc = self.pop_location(); - Rc::new(CssDocument { - location: if just_eof { - self.token.1.clone() - } else { - loc - }, - directives, - }) - } - - fn parse_directive(&mut self) -> Rc { - if let Some(rule) = self.parse_opt_rule() { - Rc::new(CssDirective::Rule(rule)) - } else if self.peek(Token::CssAtNamespace) { - self.mark_location(); - self.next(); - let prefix = self.expect_identifier(); - let uri = if self.expecting_token_error { - (String::new(), self.tokenizer.cursor_location()) - } else { - self.expect_string() - }; - if !self.expecting_token_error { - self.expect(Token::CssSemicolons); - } - let loc = self.pop_location(); - Rc::new(CssDirective::NamespaceDefinition(CssNamespaceDefinition { - location: loc, - prefix, - uri, - })) - } else if self.peek(Token::CssAtMedia) { - self.parse_media_query() - } else if self.peek(Token::CssAtFontFace) { - self.parse_font_face() - } else { - self.add_syntax_error(&self.token.1, DiagnosticKind::ExpectingDirective, diagarg![self.token.0.clone()]); - let d = self.create_invalidated_directive(&self.tokenizer.cursor_location()); - self.next(); - d - } - } - - fn parse_media_query(&mut self) -> Rc { - self.mark_location(); - self.next(); - let mut conditions: Vec> = vec![]; - let condition = self.parse_opt_media_query_condition(); - if let Some(condition) = condition { - conditions.push(condition); - } else { - self.add_syntax_error(&self.token.1, DiagnosticKind::Unexpected, diagarg![self.token.0.clone()]); - } - loop { - if let Some(condition) = self.parse_opt_media_query_condition() { - conditions.push(condition); - } else if self.eof() || self.peek(Token::BlockOpen) { - break; - } else if !self.consume(Token::Comma) { - self.add_syntax_error(&self.token.1, DiagnosticKind::Unexpected, diagarg![self.token.0.clone()]); - self.next(); - } - } - let mut rules: Vec> = vec![]; - self.expect(Token::BlockOpen); - if !self.expecting_token_error { - while !(self.eof() || self.peek(Token::BlockClose)) { - if let Some(rule) = self.parse_opt_rule() { - rules.push(Rc::new(rule)); - } else { - self.add_syntax_error(&self.token.1, DiagnosticKind::Unexpected, diagarg![self.token.0.clone()]); - self.next(); - } - } - self.expect(Token::BlockClose); - } - Rc::new(CssDirective::MediaQuery(CssMediaQuery { - location: self.pop_location(), - conditions, - rules, - })) - } - - fn parse_font_face(&mut self) -> Rc { - self.mark_location(); - self.next(); - let mut properties: Vec> = vec![]; - self.expect(Token::BlockOpen); - if !self.expecting_token_error { - self.consume(Token::CssSemicolons); - while !(self.eof() || self.peek(Token::BlockClose)) { - properties.push(self.parse_property()); - if !self.consume(Token::CssSemicolons) { - break; - } - } - self.expect(Token::BlockClose); - } - Rc::new(CssDirective::FontFace(CssFontFace { - location: self.pop_location(), - properties, - })) - } - - fn parse_opt_media_query_condition(&mut self) -> Option> { - let mut base: Option> = None; - if self.peek_keyword("only") { - self.mark_location(); - self.next(); - let id = self.expect_identifier(); - base = Some(Rc::new(CssMediaQueryCondition::OnlyId { - location: self.pop_location(), - id, - })); - } - if let Some(id) = self.consume_identifier() { - base = Some(Rc::new(CssMediaQueryCondition::Id(id))); - } - if self.peek(Token::ParenOpen) { - self.mark_location(); - let property = self.parse_arguments().unwrap().parse_property(); - let loc = self.pop_location(); - base = Some(Rc::new(CssMediaQueryCondition::ParenProperty((property, loc)))); - } - if let Some(mut base) = base.clone() { - while self.consume_keyword("and") { - self.push_location(&base.location()); - if let Some(right) = self.parse_opt_media_query_condition() { - base = Rc::new(CssMediaQueryCondition::And { - location: self.pop_location(), - left: base, - right, - }); - } else { - self.add_syntax_error(&self.token.1, DiagnosticKind::Unexpected, diagarg![self.token.0.clone()]); - base = Rc::new(CssMediaQueryCondition::And { - location: self.pop_location(), - left: base, - right: self.create_invalidated_media_query_condition(&self.tokenizer.cursor_location()), - }); - } - } - return Some(base); - } - base - } - - fn parse_arguments(&mut self) -> Result { - if !self.peek(Token::ParenOpen) { - self.add_syntax_error(&self.token.1, DiagnosticKind::Expecting, diagarg![Token::ParenOpen, self.token.0.clone()]); - return Err(ParserError::Common); - } - let (byte_range, token) = self.tokenizer.scan_arguments(); - self.previous_token = self.token.clone(); - self.token = token; - self.next(); - Ok(CssParserFacade(self.compilation_unit(), ParserOptions { - byte_range: Some(byte_range), - ..self.options() - })) - } - - fn parse_opt_rule(&mut self) -> Option { - let mut selectors: Vec> = vec![self.parse_opt_selector()?]; - while self.consume(Token::Comma) { - if let Some(s) = self.parse_opt_selector() { - selectors.push(s); - } else { - self.add_syntax_error(&self.token.1, DiagnosticKind::Unexpected, diagarg![self.token.0.clone()]); - } - } - let mut properties: Vec> = vec![]; - self.expect(Token::BlockOpen); - if !self.expecting_token_error { - self.consume(Token::CssSemicolons); - while !(self.eof() || self.peek(Token::BlockClose)) { - properties.push(self.parse_property()); - if !self.consume(Token::CssSemicolons) { - break; - } - } - self.expect(Token::BlockClose); - } - self.push_location(&selectors[0].location()); - Some(CssRule { - location: self.pop_location(), - selectors, - properties, - }) - } - - fn parse_opt_selector(&mut self) -> Option> { - let mut base = self.parse_opt_base_selector()?; - - // Parse descendant combinators - while let Some(right) = self.parse_opt_base_selector() { - self.push_location(&base.location()); - base = Rc::new(CssSelector::Combinator(CssCombinatorSelector { - location: self.pop_location(), - left: base, - right, - combinator_type: CssCombinatorType::Descendant, - })); - } - - Some(base) - } - - fn parse_opt_base_selector(&mut self) -> Option> { - self.mark_location(); - let mut namespace_prefix: Option<(String, Location)> = None; - let mut element_name: Option<(String, Location)> = self.consume_identifier(); - let mut conditions: Vec> = vec![]; - if self.consume(Token::Pipe) { - namespace_prefix = element_name.clone(); - element_name = Some(self.expect_identifier()); - } - // Parse conditions as long as they are not separated by whitespace - while (element_name.is_none() && conditions.is_empty()) || (self.token.1.first_offset() - self.previous_token.1.last_offset() == 0) { - if let Some(condition) = self.parse_opt_selector_condition() { - conditions.push(condition); - } else { - break; - } - } - if element_name.is_none() && conditions.is_empty() { - self.pop_location(); - return None; - } - Some(Rc::new(CssSelector::Base(CssBaseSelector { - location: self.pop_location(), - namespace_prefix, - element_name, - conditions, - }))) - } - - fn parse_selector_condition(&mut self) -> Rc { - let Some(c) = self.parse_opt_selector_condition() else { - self.add_syntax_error(&self.token.1, DiagnosticKind::Unexpected, diagarg![self.token.0.clone()]); - return self.create_invalidated_selector_condition(&self.tokenizer.cursor_location()); - }; - c - } - - fn parse_opt_selector_condition(&mut self) -> Option> { - if self.peek(Token::Dot) { - self.mark_location(); - self.next(); - let class_name = self.expect_identifier().0; - return Some(Rc::new(CssSelectorCondition::Class((class_name, self.pop_location())))); - } - if let Token::CssHashWord(id_value) = self.token.0.clone() { - let loc = self.token.1.clone(); - self.next(); - return Some(Rc::new(CssSelectorCondition::Id((id_value, loc)))); - } - if self.peek(Token::Colon) { - self.mark_location(); - self.next(); - if self.consume_keyword("not") { - let condition = if let Ok(a) = self.parse_arguments() { - a.parse_selector_condition() - } else { - self.duplicate_location(); - let loc = self.pop_location(); - self.create_invalidated_selector_condition(&loc) - }; - return Some(Rc::new(CssSelectorCondition::Not { - location: self.pop_location(), - condition, - })); - } else { - let name = self.expect_identifier().0; - return Some(Rc::new(CssSelectorCondition::Pseudo((name, self.pop_location())))); - } - } - if self.peek(Token::ColonColon) { - self.mark_location(); - self.next(); - let name = self.expect_identifier().0; - return Some(Rc::new(CssSelectorCondition::PseudoElement((name, self.pop_location())))); - } - if self.peek(Token::SquareOpen) { - self.mark_location(); - self.next(); - let name = self.expect_identifier(); - let mut operator: Option = None; - let mut value: Option<(String, Location)> = None; - while let Some(t1) = self.consume_attribute_operator() { - operator = Some(t1); - } - while let Token::String(s1) = self.token.0.clone() { - value = Some((s1, self.token.1.clone())); - self.next(); - } - self.expect(Token::SquareClose); - return Some(Rc::new(CssSelectorCondition::Attribute { - location: self.pop_location(), - name, - operator, - value, - })); - } - None - } - - fn consume_attribute_operator(&mut self) -> Option { - if self.consume(Token::CssBeginsWith) { - Some(CssAttributeOperator::BeginsWith) - } else if self.consume(Token::CssEndsWith) { - Some(CssAttributeOperator::EndsWith) - } else if self.consume(Token::CssContains) { - Some(CssAttributeOperator::Contains) - } else if self.consume(Token::CssListMatch) { - Some(CssAttributeOperator::ListMatch) - } else if self.consume(Token::CssHreflangMatch) { - Some(CssAttributeOperator::HreflangMatch) - } else if self.consume(Token::Assign) { - Some(CssAttributeOperator::Equals) - } else { - None - } - } - - fn parse_property(&mut self) -> Rc { - self.mark_location(); - let name = self.expect_identifier(); - let mut value = self.create_invalidated_property_value(&self.tokenizer.cursor_location()); - if !self.expecting_token_error { - self.expect(Token::Colon); - if !self.expecting_token_error { - value = self.parse_property_value(CssOperatorPrecedence::Array); - } - } - Rc::new(CssProperty::new(self.pop_location(), name, value)) - } - - fn parse_property_value(&mut self, min_precedence: CssOperatorPrecedence) -> Rc { - let Some(v) = self.parse_opt_property_value(min_precedence) else { - self.add_syntax_error(&self.token.1, DiagnosticKind::Unexpected, diagarg![self.token.0.clone()]); - return self.create_invalidated_property_value(&self.tokenizer.cursor_location()); - }; - v - } - - fn parse_opt_property_value(&mut self, min_precedence: CssOperatorPrecedence) -> Option> { - let base: Option>; - let t1 = self.token.0.clone(); - - // #HHH - // #HHHHHH - if let Token::CssHashWord(word) = t1 { - self.mark_location(); - self.next(); - let loc = self.pop_location(); - if let Ok(v) = CssColorPropertyValue::from_hex(loc.clone(), &word) { - base = Some(Rc::new(CssPropertyValue::Color(v))); - } else { - base = Some(self.create_invalidated_property_value(&loc)); - } - // "..." - // '...' - } else if let Token::String(value) = t1 { - self.mark_location(); - self.next(); - base = Some(Rc::new(CssPropertyValue::String(CssStringPropertyValue { - location: self.pop_location(), - value - }))); - // DECIMAL - } else if let Token::CssNumber { value, unit } = t1 { - self.mark_location(); - self.next(); - let loc = self.pop_location(); - base = Some(Rc::new(CssPropertyValue::Number(CssNumberPropertyValue { - location: loc, - value, - unit, - }))); - } else if let Some(id) = self.peek_identifier() { - self.mark_location(); - self.next(); - let color_int = css_color_constant_to_int(&id.0); - // COLOR_NAME such as "red" - if let Some(color_int) = color_int { - base = Some(Rc::new(CssPropertyValue::Color(CssColorPropertyValue { - location: self.pop_location(), - color_int, - }))); - // rgb(...) - } else if id.0 == "rgb" && self.peek(Token::ParenOpen) { - if let Some(color_int) = self.parse_arguments().unwrap().parse_rgb() { - base = Some(Rc::new(CssPropertyValue::RgbColor(CssRgbColorPropertyValue { - location: self.pop_location(), - color_int, - }))); - } else { - let loc = self.pop_location(); - base = Some(self.create_invalidated_property_value(&loc)); - } - } else if id.0 == "ClassReference" && self.peek(Token::ParenOpen) { - let name = self.parse_arguments().unwrap().parse_text(); - base = Some(Rc::new(CssPropertyValue::ClassReference(CssClassReferencePropertyValue { - location: self.pop_location(), - name, - }))); - } else if id.0 == "PropertyReference" && self.peek(Token::ParenOpen) { - let name = self.parse_arguments().unwrap().parse_text(); - base = Some(Rc::new(CssPropertyValue::PropertyReference(CssPropertyReferencePropertyValue { - location: self.pop_location(), - name, - }))); - } else if id.0 == "url" && self.peek(Token::ParenOpen) { - let url = self.parse_arguments().unwrap().parse_text(); - let mut format: Option<(String, Location)> = None; - if self.consume_keyword("format") { - if let Ok(a) = self.parse_arguments() { - format = Some(a.parse_text()); - } - } - base = Some(Rc::new(CssPropertyValue::Url(CssUrlPropertyValue { - location: self.pop_location(), - url, - format, - }))); - } else if id.0 == "local" && self.peek(Token::ParenOpen) { - let name = self.parse_arguments().unwrap().parse_text(); - base = Some(Rc::new(CssPropertyValue::Local(CssLocalPropertyValue { - location: self.pop_location(), - name, - }))); - } else if id.0 == "Embed" && self.peek(Token::ParenOpen) { - let entries = self.parse_arguments().unwrap().parse_embed_entries(); - base = Some(Rc::new(CssPropertyValue::Embed(CssEmbedPropertyValue { - location: self.pop_location(), - entries, - }))); - } else { - if self.peek(Token::ParenOpen) { - self.add_syntax_error(&self.token_location(), DiagnosticKind::Unexpected, diagarg![self.token.0.clone()]); - self.parse_arguments().unwrap(); - } - base = Some(Rc::new(CssPropertyValue::Identifier(CssIdentifierPropertyValue { - location: self.pop_location(), - value: id.0, - }))); - } - } else if self.peek(Token::Plus) || self.peek(Token::Minus) - || self.peek(Token::Times) || self.peek(Token::Div) { - base = Some(self.create_invalidated_property_value(&self.token.1)); - self.next(); - } else { - return None; - } - - let mut base = base.unwrap(); - - loop { - if self.peek(Token::Comma) && min_precedence.includes(&CssOperatorPrecedence::Array) { - self.push_location(&base.location()); - let mut elements: Vec> = vec![base]; - while self.consume(Token::Comma) { - elements.push(self.parse_property_value(CssOperatorPrecedence::MultiValue)); - } - base = Rc::new(CssPropertyValue::Array(CssArrayPropertyValue { - location: self.pop_location(), - elements, - })); - } else if min_precedence.includes(&CssOperatorPrecedence::MultiValue) { - if let Some(mv1) = self.parse_opt_property_value(CssOperatorPrecedence::MultiValue.add(1).unwrap()) { - self.push_location(&base.location()); - let mut values: Vec> = vec![base, mv1]; - while let Some(mv1) = self.parse_opt_property_value(CssOperatorPrecedence::MultiValue.add(1).unwrap()) { - values.push(mv1); - } - base = Rc::new(CssPropertyValue::MultiValue(CssMultiValuePropertyValue { - location: self.pop_location(), - values, - })); - } else { - break; - } - } else { - break; - } - } - - Some(base) - } - - fn parse_embed_entry(&mut self) -> Rc { - self.mark_location(); - if let Some(key) = self.consume_identifier() { - if self.consume(Token::Assign) { - let value = self.expect_string(); - Rc::new(CssEmbedEntry { - location: self.pop_location(), - key: Some(key), - value, - }) - } else { - Rc::new(CssEmbedEntry { - location: self.pop_location(), - key: None, - value: key, - }) - } - } else { - let value = self.expect_string(); - Rc::new(CssEmbedEntry { - location: self.pop_location(), - key: None, - value, - }) - } - } -} - -fn rgb_bytes_to_integer(r: f64, g: f64, b: f64) -> u32 { - (calc_rgb_byte(r) << 16) | (calc_rgb_byte(g) << 8) | calc_rgb_byte(b) -} - -fn calc_rgb_byte(value: f64) -> u32 { - // Integer - if value.round() == value { - value.round().to_u32().unwrap_or(0).clamp(0, 255) - // Float - } else { - (value * 255.0).round().to_u32().unwrap_or(0).clamp(0, 255) - } -} - -/// A simplified interface for executing the CSS parser. -pub struct CssParserFacade<'input>(pub &'input Rc, pub ParserOptions); - -impl<'input> CssParserFacade<'input> { - fn create_parser(&self) -> CssParser<'input> { - CssParser::new(self.0, &self.1) - } - - /// Parses `CssDocument` until end-of-file. - pub fn parse_document(&self) -> Rc { - let mut parser = self.create_parser(); - parser.next(); - parser.parse_document() - } - - /// Parses either a string or return source text as is. - pub fn parse_text(&self) -> (String, Location) { - let mut parser = self.create_parser(); - while parser.tokenizer.consume_whitespace() { - // Consumed whitespace - } - let d = parser.tokenizer.characters().peek_or_zero(); - if ['"', '\''].contains(&d) { - parser.next(); - let mut v: (String, Location) = ("".into(), parser.tokenizer.cursor_location()); - while let Token::String(v1) = parser.token.0.clone() { - v = (v1, parser.token.1.clone()); - parser.next(); - } - parser.expect_eof(); - v - } else { - let mut s = String::new(); - let i = parser.tokenizer.characters().index(); - while let Some(ch) = parser.tokenizer.characters_mut().next() { - s.push(ch); - } - let j = parser.tokenizer.characters().index(); - (s, Location::with_offsets(parser.compilation_unit(), i, j)) - } - } - - /// Parses `CssSelectorCondition` until end-of-file. - pub fn parse_selector_condition(&self) -> Rc { - let mut parser = self.create_parser(); - parser.next(); - let r = parser.parse_selector_condition(); - parser.expect_eof(); - r - } - - pub fn parse_property(&self) -> Rc { - let mut parser = self.create_parser(); - parser.next(); - let r = parser.parse_property(); - parser.expect_eof(); - r - } - - pub fn parse_property_value(&self) -> Rc { - let mut parser = self.create_parser(); - parser.next(); - let r = parser.parse_property_value(CssOperatorPrecedence::Array); - parser.expect_eof(); - r - } - - pub fn parse_rgb(&self) -> Option { - let mut parser = self.create_parser(); - parser.next(); - let r = parser.expect_unitless_number()?; - let g: f64; - let b: f64; - if parser.consume(Token::Comma) { - g = parser.expect_unitless_number()?; - parser.expect(Token::Comma); - b = parser.expect_unitless_number()?; - } else { - g = parser.expect_unitless_number()?; - b = parser.expect_unitless_number()?; - } - parser.expect_eof(); - Some(rgb_bytes_to_integer(r, g, b)) - } - - pub fn parse_embed_entries(&self) -> Vec> { - let mut parser = self.create_parser(); - let mut entries: Vec> = vec![]; - parser.next(); - if !parser.eof() { - entries.push(parser.parse_embed_entry()); - } - while parser.consume(Token::Comma) { - entries.push(parser.parse_embed_entry()); - } - parser.expect_eof(); - entries - } -} diff --git a/crates/parser/parser/css_tokenizer.rs b/crates/parser/parser/css_tokenizer.rs deleted file mode 100644 index 8c12cae..0000000 --- a/crates/parser/parser/css_tokenizer.rs +++ /dev/null @@ -1,434 +0,0 @@ -use crate::ns::*; -use std::str::FromStr; - -pub struct CssTokenizer<'input> { - compilation_unit: Rc, - characters: CharacterReader<'input>, -} - -impl<'input> CssTokenizer<'input> { - /// Constructs a tokenizer. - pub fn new(compilation_unit: &'input Rc, options: &ParserOptions) -> Self { - let text: &'input str = compilation_unit.text(); - let compilation_unit = compilation_unit.clone(); - let characters: CharacterReader<'input>; - if let Some(range) = options.byte_range { - characters = CharacterReader::from_offset(&text[0..range.1], range.0); - } else { - characters = CharacterReader::from(text); - } - Self { - compilation_unit, - characters, - } - } - - pub fn compilation_unit(&self) -> &Rc { - &self.compilation_unit - } - - pub fn characters(&self) -> &CharacterReader<'input> { - &self.characters - } - - pub fn characters_mut(&mut self) -> &mut CharacterReader<'input> { - &mut self.characters - } - - fn character_ahead_location(&self) -> Location { - if self.characters.reached_end() { - return self.cursor_location(); - } - let offset = self.characters.index(); - let mut next_characters = self.characters.clone(); - next_characters.next().unwrap(); - Location::with_offsets(&self.compilation_unit, offset, next_characters.index()) - } - - pub fn cursor_location(&self) -> Location { - let offset = self.characters.index(); - Location::with_offset(&self.compilation_unit, offset) - } - - fn add_syntax_error(&self, location: &Location, kind: DiagnosticKind, arguments: Vec>) { - if self.compilation_unit().prevent_equal_offset_error(location) { - return; - } - self.compilation_unit().add_diagnostic(Diagnostic::new_syntax_error(location, kind, arguments)); - } - - fn add_unexpected_error(&self) { - if self.characters.has_remaining() { - self.add_syntax_error(&self.character_ahead_location(), DiagnosticKind::UnexpectedCharacter, diagarg![self.characters.peek_or_zero().to_string()]) - } else { - self.add_syntax_error(&self.cursor_location(), DiagnosticKind::UnexpectedEnd, vec![]) - } - } - - fn add_unexpected_eof_error(&self, kind: DiagnosticKind) { - self.add_syntax_error(&self.cursor_location(), kind, vec![]); - } - - pub fn scan(&mut self) -> (Token, Location) { - while self.consume_whitespace() || self.consume_comment() { - // Do nothing - } - let start = self.cursor_location(); - let ch = self.characters.peek_or_zero(); - - if let Some(id) = self.consume_css_id() { - return (Token::Identifier(id), start.combine_with(self.cursor_location())); - } - - // DECIMAL - // DECIMAL.PART - if CharacterValidator::is_dec_digit(ch) { - self.characters.next(); - while CharacterValidator::is_dec_digit(self.characters.peek_or_zero()) { - self.characters.next(); - } - if self.characters.peek_or_zero() == '.' { - self.characters.next(); - if !CharacterValidator::is_dec_digit(self.characters.peek_or_zero()) { - self.add_unexpected_error(); - } - while CharacterValidator::is_dec_digit(self.characters.peek_or_zero()) { - self.characters.next(); - } - } - return self.finish_number(start); - } - - if ch == '#' { - self.characters.next(); - let mut word = String::new(); - loop { - let ch = self.characters.peek_or_zero(); - if (ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z') || - (ch >= '0' && ch <= '9') || ch == '-' || ch == '_' { - word.push(ch); - self.characters.next(); - } else { - break; - } - } - if word.is_empty() { - self.add_unexpected_error(); - word = INVALIDATED_IDENTIFIER.to_owned(); - } - return (Token::CssHashWord(word), start.combine_with(self.cursor_location())); - } - - if ch == '@' { - // @namespace - if self.characters.peek_seq(10) == "@namespace" { - self.characters.skip_count_in_place(10); - return (Token::CssAtNamespace, start.combine_with(self.cursor_location())); - } - // @font-face - if self.characters.peek_seq(10) == "@font-face" { - self.characters.skip_count_in_place(10); - return (Token::CssAtFontFace, start.combine_with(self.cursor_location())); - } - // @media - if self.characters.peek_seq(6) == "@media" { - self.characters.skip_count_in_place(6); - return (Token::CssAtMedia, start.combine_with(self.cursor_location())); - } - } - - if ch == '!' && self.characters.peek_seq(10) == "!important" { - self.characters.skip_count_in_place(10); - return (Token::CssImportant, start.combine_with(self.cursor_location())); - } - - match ch { - // . - // .DECIMAL - '.' => { - self.characters.next(); - if CharacterValidator::is_dec_digit(self.characters.peek_or_zero()) { - while CharacterValidator::is_dec_digit(self.characters.peek_or_zero()) { - self.characters.next(); - } - return self.finish_number(start); - } - (Token::Dot, start.combine_with(self.cursor_location())) - }, - '"' | '\'' => { - self.scan_string(ch, start) - }, - ';' => { - while self.characters.peek_or_zero() == ';' { - self.characters.next(); - } - (Token::CssSemicolons, start.combine_with(self.cursor_location())) - }, - '^' => { - self.characters.next(); - if self.characters.peek_or_zero() != '=' { - self.add_unexpected_error(); - self.characters.next(); - self.scan() - } else { - self.characters.next(); - (Token::CssBeginsWith, start.combine_with(self.cursor_location())) - } - }, - '$' => { - self.characters.next(); - if self.characters.peek_or_zero() != '=' { - self.add_unexpected_error(); - self.characters.next(); - self.scan() - } else { - self.characters.next(); - (Token::CssEndsWith, start.combine_with(self.cursor_location())) - } - }, - '*' => { - self.characters.next(); - if self.characters.peek_or_zero() == '=' { - self.characters.next(); - (Token::CssContains, start.combine_with(self.cursor_location())) - } else { - (Token::Times, start.combine_with(self.cursor_location())) - } - }, - '~' => { - self.characters.next(); - if self.characters.peek_or_zero() == '=' { - self.characters.next(); - (Token::CssListMatch, start.combine_with(self.cursor_location())) - } else { - (Token::Tilde, start.combine_with(self.cursor_location())) - } - }, - '|' => { - self.characters.next(); - if self.characters.peek_or_zero() == '=' { - self.characters.next(); - (Token::CssHreflangMatch, start.combine_with(self.cursor_location())) - } else { - (Token::Pipe, start.combine_with(self.cursor_location())) - } - }, - '{' => { - self.characters.next(); - (Token::BlockOpen, start.combine_with(self.cursor_location())) - }, - '}' => { - self.characters.next(); - (Token::BlockClose, start.combine_with(self.cursor_location())) - }, - '[' => { - self.characters.next(); - (Token::SquareOpen, start.combine_with(self.cursor_location())) - }, - ']' => { - self.characters.next(); - (Token::SquareClose, start.combine_with(self.cursor_location())) - }, - '(' => { - self.characters.next(); - (Token::ParenOpen, start.combine_with(self.cursor_location())) - }, - ')' => { - self.characters.next(); - (Token::ParenClose, start.combine_with(self.cursor_location())) - }, - ',' => { - self.characters.next(); - (Token::Comma, start.combine_with(self.cursor_location())) - }, - '%' => { - self.characters.next(); - (Token::Percent, start.combine_with(self.cursor_location())) - }, - '=' => { - self.characters.next(); - (Token::Assign, start.combine_with(self.cursor_location())) - }, - ':' => { - self.characters.next(); - if self.characters.peek_or_zero() == ':' { - self.characters.next(); - (Token::ColonColon, start.combine_with(self.cursor_location())) - } else { - (Token::Colon, start.combine_with(self.cursor_location())) - } - }, - '>' => { - self.characters.next(); - (Token::Gt, start.combine_with(self.cursor_location())) - }, - '+' => { - self.characters.next(); - (Token::Plus, start.combine_with(self.cursor_location())) - }, - _ => { - if self.characters.reached_end() { - return (Token::Eof, start); - } - self.add_unexpected_error(); - self.characters.next(); - self.scan() - }, - } - } - - pub fn consume_whitespace(&mut self) -> bool { - let ch = self.characters.peek_or_zero(); - if [' ', '\t', '\n', '\r'].contains(&ch) { - self.characters.next(); - true - } else { - false - } - } - - fn consume_comment(&mut self) -> bool { - if self.characters.peek_or_zero() == '/' && self.characters.peek_at_or_zero(1) == '*' { - let start = self.cursor_location(); - self.characters.skip_count_in_place(2); - loop { - if self.characters.peek_or_zero() == '*' && self.characters.peek_at_or_zero(1) == '/' { - self.characters.skip_count_in_place(2); - break; - } else if self.characters.has_remaining() { - self.characters.skip_in_place(); - } else { - self.add_unexpected_eof_error(DiagnosticKind::InputEndedBeforeReachingClosingSeqForMultiLineComment); - break; - } - } - - let location = start.combine_with(self.cursor_location()); - let i = location.first_offset() + 2; - let j = decrease_last_offset(i, location.last_offset(), 2); - - self.compilation_unit.add_comment(Rc::new(Comment { - multiline: true, - content: RefCell::new(self.compilation_unit.text()[i..j].to_owned()), - location: RefCell::new(location), - })); - - true - } else { - false - } - } - - fn consume_css_id(&mut self) -> Option { - let i = self.characters.index(); - let mut prefix_n = 0; - if self.characters.peek_or_zero() == '_' { - prefix_n += 1; - if self.characters.peek_at_or_zero(prefix_n) == '_' { - prefix_n += 1; - if self.characters.peek_at_or_zero(prefix_n) == '_' { - prefix_n += 1; - } - } - } else if self.characters.peek_or_zero() == '-' { - prefix_n += 1; - } - if CharacterValidator::is_css_identifier_start(self.characters.peek_at_or_zero(prefix_n)) { - self.characters.skip_count_in_place(prefix_n + 1); - while CharacterValidator::is_css_identifier_part(self.characters.peek_or_zero()) { - self.characters.next(); - } - return Some(self.compilation_unit.text()[i..self.characters.index()].to_owned()); - } - None - } - - fn finish_number(&mut self, start: Location) -> (Token, Location) { - let digits = &self.compilation_unit.text()[start.first_offset..self.characters.index()]; - let mut mv = f64::from_str(digits).unwrap_or(f64::NAN); - let mut unit: Option = None; - if self.characters.peek_or_zero() == '%' { - self.characters.next(); - mv /= 100.0; - } else { - unit = self.consume_css_id(); - } - (Token::CssNumber { - value: mv, - unit, - }, start.combine_with(self.cursor_location())) - } - - fn scan_string(&mut self, delim: char, start: Location) -> (Token, Location) { - let mut builder = String::new(); - self.characters.next(); - loop { - let ch = self.characters.peek_or_zero(); - if ch == delim { - self.characters.next(); - break; - } else if ch == '\\' { - let mut loc = self.cursor_location(); - self.characters.next(); - let mut digits = String::new(); - for _ in 0..6 { - let ch = self.characters.peek_or_zero(); - if CharacterValidator::is_hex_digit(ch) { - digits.push(ch); - self.characters.next(); - } else { - break; - } - } - if digits.is_empty() { - self.add_unexpected_error(); - } else { - loc = loc.combine_with(self.cursor_location()); - let mv = u32::from_str_radix(&digits, 16).ok().and_then(|mv| char::from_u32(mv)); - if let Some(mv) = mv { - builder.push(mv); - } else { - self.add_syntax_error(&loc, DiagnosticKind::CssInvalidHexEscape, diagarg![digits]); - } - } - } else if self.characters.reached_end() { - self.add_unexpected_eof_error(DiagnosticKind::InputEndedBeforeReachingClosingQuoteForString); - break; - } else { - builder.push(ch); - self.characters.next(); - } - } - let loc = start.combine_with(self.cursor_location()); - (Token::String(builder), loc) - } - - pub fn scan_arguments(&mut self) -> ((usize, usize), (Token, Location)) { - let i = self.characters.index(); - let mut j: usize; - let mut nesting = 1; - let token: (Token, Location); - loop { - j = self.characters.index(); - let ch = self.characters.peek_or_zero(); - if ch == ')' { - self.characters.next(); - nesting -= 1; - if nesting == 0 { - token = (Token::ParenClose, Location::with_offsets(&self.compilation_unit, j, self.characters.index())); - break; - } - } else if ch == '(' { - self.characters.next(); - nesting += 1; - } else if self.characters.reached_end() { - self.add_syntax_error(&self.cursor_location(), DiagnosticKind::Expecting, diagarg![Token::ParenClose, Token::Eof]); - token = (Token::Eof, self.cursor_location()); - break; - } else { - self.characters.next(); - } - } - ((i, j), token) - } -} \ No newline at end of file diff --git a/crates/parser/parser/parser.rs b/crates/parser/parser/parser.rs deleted file mode 100644 index b71d433..0000000 --- a/crates/parser/parser/parser.rs +++ /dev/null @@ -1,5428 +0,0 @@ -use crate::ns::*; -use lazy_regex::*; - -pub struct Parser<'input> { - tokenizer: Tokenizer<'input>, - previous_token: (Token, Location), - token: (Token, Location), - locations: Vec, - activations: Vec, - ignore_xml_whitespace: bool, - expecting_token_error: bool, -} - -impl<'input> Parser<'input> { - /// Constructs a parser. - pub fn new(compilation_unit: &'input Rc, options: &ParserOptions) -> Self { - Self { - tokenizer: Tokenizer::new(compilation_unit, options), - previous_token: (Token::Eof, Location::with_offset(&compilation_unit, 0)), - token: (Token::Eof, Location::with_offset(&compilation_unit, 0)), - locations: vec![], - activations: vec![], - ignore_xml_whitespace: options.ignore_xml_whitespace, - expecting_token_error: false, - } - } - - fn options(&self) -> ParserOptions { - ParserOptions { - ignore_xml_whitespace: self.ignore_xml_whitespace, - ..default() - } - } - - fn compilation_unit(&self) -> &Rc { - self.tokenizer.compilation_unit() - } - - fn token_location(&self) -> Location { - self.token.1.clone() - } - - fn mark_location(&mut self) { - self.locations.push(self.token.1.clone()); - } - - fn duplicate_location(&mut self) { - self.locations.push(self.locations.last().unwrap().clone()); - } - - fn push_location(&mut self, location: &Location) { - self.locations.push(location.clone()); - } - - fn pop_location(&mut self) -> Location { - self.locations.pop().unwrap().combine_with(self.previous_token.1.clone()) - } - - fn add_syntax_error(&self, location: &Location, kind: DiagnosticKind, arguments: Vec>) { - if self.compilation_unit().prevent_equal_offset_error(location) { - return; - } - self.compilation_unit().add_diagnostic(Diagnostic::new_syntax_error(location, kind, arguments)); - } - - fn patch_syntax_error(&self, original: DiagnosticKind, kind: DiagnosticKind, arguments: Vec>) { - if self.compilation_unit().diagnostics.borrow().is_empty() { - return; - } - if self.compilation_unit().diagnostics.borrow().last().unwrap().kind == original { - let loc = self.compilation_unit().diagnostics.borrow_mut().pop().unwrap().location(); - self.compilation_unit().add_diagnostic(Diagnostic::new_syntax_error(&loc, kind, arguments)); - } - } - - /* - fn add_warning(&self, location: &Location, kind: DiagnosticKind, arguments: Vec>) { - if self.compilation_unit().prevent_equal_offset_warning(location) { - return; - } - self.compilation_unit().add_diagnostic(Diagnostic::new_warning(location, kind, arguments)); - } - */ - - fn next(&mut self) { - self.previous_token = self.token.clone(); - self.token = self.tokenizer.scan_ie_div(); - } - - fn next_ie_xml_tag(&mut self) { - self.previous_token = self.token.clone(); - self.token = self.tokenizer.scan_ie_xml_tag(); - } - - fn next_ie_xml_content(&mut self) { - self.previous_token = self.token.clone(); - self.token = self.tokenizer.scan_ie_xml_content(); - } - - fn peek(&self, token: Token) -> bool { - self.token.0 == token - } - - fn peek_identifier(&self, reserved_words: bool) -> Option<(String, Location)> { - if let Token::Identifier(id) = self.token.0.clone() { - let location = self.token.1.clone(); - Some((id, location)) - } else { - if reserved_words { - if let Some(id) = self.token.0.reserved_word_name() { - let location = self.token.1.clone(); - return Some((id, location)); - } - } - None - } - } - - fn peek_context_keyword(&self, name: &str) -> bool { - if let Token::Identifier(id) = self.token.0.clone() { id == name && self.token.1.character_count() == name.len() } else { false } - } - - fn consume(&mut self, token: Token) -> bool { - if self.token.0 == token { - self.next(); - true - } else { - false - } - } - - fn consume_and_ie_xml_tag(&mut self, token: Token) -> bool { - if self.token.0 == token { - self.next_ie_xml_tag(); - true - } else { - false - } - } - - fn consume_and_ie_xml_content(&mut self, token: Token) -> bool { - if self.token.0 == token { - self.next_ie_xml_content(); - true - } else { - false - } - } - - fn consume_identifier(&mut self, reserved_words: bool) -> Option<(String, Location)> { - if let Token::Identifier(id) = self.token.0.clone() { - let location = self.token.1.clone(); - self.next(); - Some((id, location)) - } else { - if reserved_words { - if let Some(id) = self.token.0.reserved_word_name() { - let location = self.token.1.clone(); - self.next(); - return Some((id, location)); - } - } - None - } - } - - fn _consume_context_keyword(&mut self, name: &str) -> bool { - if let Token::Identifier(id) = self.token.0.clone() { - if id == name && self.token.1.character_count() == name.len() { - self.next(); - true - } else { - false - } - } else { - false - } - } - - fn expect(&mut self, token: Token) { - if self.token.0 != token { - self.expecting_token_error = true; - self.add_syntax_error(&self.token_location(), DiagnosticKind::Expecting, diagarg![token.clone(), self.token.0.clone()]); - let expecting_identifier_name = token.is_identifier_name(); - while self.token.0 != Token::Eof && (if expecting_identifier_name { self.token.0.is_identifier_name() } else { true }) { - self.next(); - if self.token.0 == token { - return; - } - } - } else { - self.expecting_token_error = false; - self.next(); - } - } - - /// Expects a token; but if it fails, does not skip any token. - fn non_greedy_expect(&mut self, token: Token) { - if self.token.0 != token { - self.expecting_token_error = true; - self.add_syntax_error(&self.token_location(), DiagnosticKind::Expecting, diagarg![token.clone(), self.token.0.clone()]); - } else { - self.expecting_token_error = false; - self.next(); - } - } - - fn non_greedy_expect_virtual_semicolon(&mut self) { - self.expecting_token_error = false; - if !self.parse_semicolon() { - self.expecting_token_error = true; - self.add_syntax_error(&self.token_location(), DiagnosticKind::ExpectingEitherSemicolonOrNewLineHere, vec![]); - } - } - - fn expect_and_ie_xml_tag(&mut self, token: Token) { - if self.token.0 != token { - self.expecting_token_error = true; - self.add_syntax_error(&self.token_location(), DiagnosticKind::Expecting, diagarg![token.clone(), self.token.0.clone()]); - while self.token.0 != Token::Eof { - self.next_ie_xml_tag(); - if self.token.0 == token { - return; - } - } - } else { - self.expecting_token_error = false; - self.next_ie_xml_tag(); - } - } - - /// Expects a token; but if it fails, does not skip any token. - fn non_greedy_expect_and_ie_xml_tag(&mut self, token: Token) { - if self.token.0 != token { - self.expecting_token_error = true; - self.add_syntax_error(&self.token_location(), DiagnosticKind::Expecting, diagarg![token.clone(), self.token.0.clone()]); - } else { - self.expecting_token_error = false; - self.next_ie_xml_tag(); - } - } - - fn expect_and_ie_xml_content(&mut self, token: Token) { - if self.token.0 != token { - self.expecting_token_error = true; - self.add_syntax_error(&self.token_location(), DiagnosticKind::Expecting, diagarg![token.clone(), self.token.0.clone()]); - while self.token.0 != Token::Eof { - self.next_ie_xml_content(); - if self.token.0 == token { - return; - } - } - } else { - self.expecting_token_error = false; - self.next_ie_xml_content(); - } - } - - fn non_greedy_expect_and_ie_xml_content(&mut self, token: Token) { - if self.token.0 != token { - self.expecting_token_error = true; - self.add_syntax_error(&self.token_location(), DiagnosticKind::Expecting, diagarg![token.clone(), self.token.0.clone()]); - } else { - self.expecting_token_error = false; - self.next_ie_xml_content(); - } - } - - fn expect_identifier(&mut self, reserved_words: bool) -> (String, Location) { - if let Token::Identifier(id) = self.token.0.clone() { - self.expecting_token_error = false; - let location = self.token.1.clone(); - self.next(); - (id, location) - } else { - if reserved_words { - if let Some(id) = self.token.0.reserved_word_name() { - self.expecting_token_error = false; - let location = self.token.1.clone(); - self.next(); - return (id, location); - } - } - self.expecting_token_error = true; - self.add_syntax_error(&self.token_location(), DiagnosticKind::ExpectingIdentifier, diagarg![self.token.0.clone()]); - /* - while self.token.0 != Token::Eof && self.token.0.is_identifier_name() { - if let Some(id) = self.consume_identifier(reserved_words) { - return id; - } else { - self.next(); - } - } - */ - (INVALIDATED_IDENTIFIER.to_owned(), self.tokenizer.cursor_location()) - } - } - - fn _expect_context_keyword(&mut self, name: &str) { - if let Token::Identifier(id) = self.token.0.clone() { - if id == name && self.token.1.character_count() == name.len() { - self.expecting_token_error = false; - self.next(); - return; - } - } - self.expecting_token_error = true; - self.add_syntax_error(&self.token_location(), DiagnosticKind::Expecting, diagarg![format!("'{name}'"), self.token.0.clone()]); - while self.token.0 != Token::Eof && self.token.0.is_identifier_name() { - if self._consume_context_keyword(name) { - return; - } else { - self.next(); - } - } - } - - fn non_greedy_expect_context_keyword(&mut self, name: &str) { - if let Token::Identifier(id) = self.token.0.clone() { - if id == name && self.token.1.character_count() == name.len() { - self.expecting_token_error = false; - self.next(); - return; - } - } - self.expecting_token_error = true; - self.add_syntax_error(&self.token_location(), DiagnosticKind::Expecting, diagarg![format!("'{name}'"), self.token.0.clone()]); - } - - /// Expects a greater-than symbol. If the facing token is not greater-than, - /// but starts with a greater-than symbol, the first character is shifted off - /// from the facing token. - fn _expect_type_parameters_gt(&mut self) { - self.expecting_token_error = false; - if !self.consume_type_parameters_gt() { - self.expecting_token_error = true; - self.add_syntax_error(&self.token_location(), DiagnosticKind::Expecting, diagarg![Token::Gt, self.token.0.clone()]); - while self.token.0 != Token::Eof { - self.next(); - if self.consume_type_parameters_gt() { - return; - } - } - } - } - - fn non_greedy_expect_type_parameters_gt(&mut self) { - self.expecting_token_error = false; - if !self.consume_type_parameters_gt() { - self.expecting_token_error = true; - self.add_syntax_error(&self.token_location(), DiagnosticKind::Expecting, diagarg![Token::Gt, self.token.0.clone()]); - } - } - - /// Consumes a greater-than symbol. If the facing token is not greater-than, - /// but starts with a greater-than symbol, the first character is shifted off - /// from the facing token. - fn consume_type_parameters_gt(&mut self) -> bool { - match self.token.0 { - Token::Gt => { - self.next(); - true - }, - Token::Ge => { - self.token.0 = Token::Assign; - self.token.1.first_offset += 1; - true - }, - Token::RightShift => { - self.token.0 = Token::Gt; - self.token.1.first_offset += 1; - true - }, - Token::RightShiftAssign => { - self.token.0 = Token::Ge; - self.token.1.first_offset += 1; - true - }, - Token::UnsignedRightShift => { - self.token.0 = Token::RightShift; - self.token.1.first_offset += 1; - true - }, - Token::UnsignedRightShiftAssign => { - self.token.0 = Token::RightShiftAssign; - self.token.1.first_offset += 1; - true - }, - _ => { - false - }, - } - } - - fn offending_token_is_inline_or_higher_indented(&self) -> bool { - if !self.previous_token.1.line_break(&self.token.1) { - return true; - } - let i1 = self.compilation_unit().get_line_indent(self.previous_token.1.first_line_number()); - let i2 = self.compilation_unit().get_line_indent(self.token.1.first_line_number()); - i2 > i1 - } - - pub fn expect_eof(&mut self) { - self.expect(Token::Eof) - } - - fn create_invalidated_expression(&self, location: &Location) -> Rc { - Rc::new(Expression::Invalidated(InvalidatedNode { - location: location.clone(), - })) - } - - fn create_invalidated_directive(&self, location: &Location) -> Rc { - Rc::new(Directive::Invalidated(InvalidatedNode { - location: location.clone(), - })) - } - - pub fn parse_expression(&mut self, context: ParserExpressionContext) -> Rc { - if let Some(exp) = self.parse_opt_expression(context) { - exp - } else { - self.add_syntax_error(&self.token_location(), DiagnosticKind::ExpectingExpression, diagarg![self.token.0.clone()]); - self.create_invalidated_expression(&self.tokenizer.cursor_location()) - } - } - - pub fn parse_opt_expression(&mut self, context: ParserExpressionContext) -> Option> { - let exp: Option> = self.parse_opt_start_expression(context.clone()); - - // Parse subexpressions - if let Some(exp) = exp { - return Some(self.parse_subexpressions(exp, context.clone())); - } - None - } - - fn parse_subexpressions(&mut self, mut base: Rc, context: ParserExpressionContext) -> Rc { - loop { - if self.consume(Token::Dot) { - base = self.parse_dot_subexpression(base); - } else if self.consume(Token::OptionalChaining) { - base = self.parse_optional_chaining(base); - } else if self.peek(Token::SquareOpen) { - let asdoc = self.parse_asdoc(); - self.next(); - self.push_location(&base.location()); - let key = self.parse_expression(ParserExpressionContext { allow_in: true, min_precedence: OperatorPrecedence::List, ..default() }); - self.non_greedy_expect(Token::SquareClose); - base = Rc::new(Expression::ComputedMember(ComputedMemberExpression { - base, asdoc, key, location: self.pop_location() - })); - } else if self.consume(Token::Descendants) { - self.push_location(&base.location()); - let id = self.parse_qualified_identifier(); - base = Rc::new(Expression::Descendants(DescendantsExpression { - location: self.pop_location(), - base, - identifier: id, - })); - } else if self.peek(Token::ParenOpen) { - self.push_location(&base.location()); - let arguments = self.parse_arguments(); - base = Rc::new(Expression::Call(CallExpression { - location: self.pop_location(), - base, - arguments, - })); - } else if self.peek(Token::Increment) && !self.previous_token.1.line_break(&self.token.1) { - self.push_location(&base.location()); - self.next(); - base = Rc::new(Expression::Unary(UnaryExpression { - location: self.pop_location(), - expression: base, - operator: Operator::PostIncrement, - })); - } else if self.peek(Token::Decrement) && !self.previous_token.1.line_break(&self.token.1) { - self.push_location(&base.location()); - self.next(); - base = Rc::new(Expression::Unary(UnaryExpression { - location: self.pop_location(), - expression: base, - operator: Operator::PostDecrement, - })); - } else if self.peek(Token::Exclamation) && !self.previous_token.1.line_break(&self.token.1) { - self.push_location(&base.location()); - self.next(); - base = Rc::new(Expression::Unary(UnaryExpression { - location: self.pop_location(), - expression: base, operator: Operator::NonNull, - })); - // `not in` - } else if self.token.0 == Token::Not && context.allow_in && context.min_precedence.includes(&OperatorPrecedence::Relational) && !self.previous_token.1.line_break(&self.token.1) { - self.push_location(&base.location()); - self.next(); - self.non_greedy_expect(Token::In); - base = self.parse_binary_operator(base, Operator::NotIn, OperatorPrecedence::Relational.add(1).unwrap(), context.clone()); - // ConditionalExpression - } else if self.peek(Token::Question) && context.min_precedence.includes(&OperatorPrecedence::AssignmentAndOther) { - self.push_location(&base.location()); - self.next(); - let consequent = self.parse_expression(ParserExpressionContext { - min_precedence: OperatorPrecedence::AssignmentAndOther, - ..context.clone() - }); - let mut alternative = self.create_invalidated_expression(&self.tokenizer.cursor_location()); - self.non_greedy_expect(Token::Colon); - if !self.expecting_token_error { - alternative = self.parse_expression(ParserExpressionContext { - min_precedence: OperatorPrecedence::AssignmentAndOther, - ..context.clone() - }); - } - base = Rc::new(Expression::Conditional(ConditionalExpression { - location: self.pop_location(), - test: base, consequent, alternative, - })); - } else if let Some(binary_operator) = self.check_binary_operator(context.clone()) { - let BinaryOperator(operator, required_precedence, _) = binary_operator; - if context.min_precedence.includes(&required_precedence) { - self.next(); - base = self.parse_binary_operator(base, operator, binary_operator.right_precedence(), context.clone()); - } else { - break; - } - // AssignmentExpression - } else if self.peek(Token::Assign) && context.min_precedence.includes(&OperatorPrecedence::AssignmentAndOther) && context.allow_assignment { - self.push_location(&base.location()); - self.next(); - let left = base.clone(); - if !left.is_valid_assignment_left_hand_side() { - self.add_syntax_error(&left.location(), DiagnosticKind::MalformedDestructuring, vec![]) - } - let right = self.parse_expression(ParserExpressionContext { - min_precedence: OperatorPrecedence::AssignmentAndOther, - ..context.clone() - }); - base = Rc::new(Expression::Assignment(AssignmentExpression { - location: self.pop_location(), - left, compound: None, right, - })); - // CompoundAssignment and LogicalAssignment - } else if let Some(compound) = self.token.0.compound_assignment() { - if context.min_precedence.includes(&OperatorPrecedence::AssignmentAndOther) && context.allow_assignment { - self.push_location(&base.location()); - self.next(); - let left = base.clone(); - let right = self.parse_expression(ParserExpressionContext { - min_precedence: OperatorPrecedence::AssignmentAndOther, - ..context.clone() - }); - base = Rc::new(Expression::Assignment(AssignmentExpression { - location: self.pop_location(), - left, compound: Some(compound), right, - })); - } else { - break; - } - } else if self.peek(Token::Comma) && context.min_precedence.includes(&OperatorPrecedence::List) { - self.push_location(&base.location()); - self.next(); - let right = self.parse_expression(ParserExpressionContext { - min_precedence: OperatorPrecedence::AssignmentAndOther, - ..context.clone() - }); - base = Rc::new(Expression::Sequence(SequenceExpression { - location: self.pop_location(), - left: base, right, - })); - } else { - break; - } - } - - base - } - - fn parse_binary_operator(&mut self, base: Rc, mut operator: Operator, right_precedence: OperatorPrecedence, context: ParserExpressionContext) -> Rc { - // The left operand of a null-coalescing operation must not be - // a logical AND, XOR or OR operation. - if operator == Operator::NullCoalescing { - if let Expression::Unary(UnaryExpression { expression, operator, .. }) = base.as_ref() { - if [Operator::LogicalAnd, Operator::LogicalXor, Operator::LogicalOr].contains(&operator) { - self.add_syntax_error(&expression.location(), DiagnosticKind::IllegalNullishCoalescingLeftOperand, vec![]); - } - } - } - - if operator == Operator::Is && self.consume(Token::Not) { - operator = Operator::IsNot; - } - - self.push_location(&base.location()); - let right = self.parse_expression(ParserExpressionContext { - min_precedence: right_precedence, - ..context - }); - Rc::new(Expression::Binary(BinaryExpression { - location: self.pop_location(), - left: base, operator, right, - })) - } - - fn check_binary_operator(&self, context: ParserExpressionContext) -> Option { - if let Some(operator) = self.token.0.to_binary_operator() { - if operator == Operator::In && !context.allow_in { - return None; - } - BinaryOperator::try_from(operator).ok() - } else { - None - } - } - - fn parse_optional_chaining(&mut self, base: Rc) -> Rc { - self.push_location(&base.location()); - self.duplicate_location(); - let mut operation = Rc::new(Expression::OptionalChainingPlaceholder(OptionalChainingPlaceholder { - location: base.location(), - })); - if self.peek(Token::ParenOpen) { - let arguments: Vec> = self.parse_arguments(); - if arguments.len() == 1 && self.peek(Token::ColonColon) { - self.duplicate_location(); - let ql = self.pop_location(); - let q = Rc::new(Expression::Paren(ParenExpression { - location: ql.clone(), - expression: arguments[0].clone(), - })); - let identifier = self.finish_qualified_identifier(false, ql, q); - operation = Rc::new(Expression::Member(MemberExpression { - location: self.pop_location(), - base: operation, - identifier, - })); - } else { - operation = Rc::new(Expression::Call(CallExpression { - location: self.pop_location(), - base: operation, arguments - })); - } - } else if self.peek(Token::SquareOpen) { - let asdoc = self.parse_asdoc(); - self.next(); - let key = self.parse_expression(ParserExpressionContext { allow_in: true, min_precedence: OperatorPrecedence::List, ..default() }); - self.non_greedy_expect(Token::SquareClose); - operation = Rc::new(Expression::ComputedMember(ComputedMemberExpression { - location: self.pop_location(), - base: operation, asdoc, key, - })); - } else { - let identifier = self.parse_qualified_identifier(); - operation = Rc::new(Expression::Member(MemberExpression { - location: self.pop_location(), - base: operation, identifier - })); - } - - // Parse postfix subexpressions - operation = self.parse_optional_chaining_subexpressions(operation); - - Rc::new(Expression::OptionalChaining(OptionalChainingExpression { - location: self.pop_location(), - base, expression: operation, - })) - } - - fn parse_optional_chaining_subexpressions(&mut self, mut base: Rc) -> Rc { - loop { - if self.consume(Token::Dot) { - base = self.parse_dot_subexpression(base); - } else if self.consume(Token::OptionalChaining) { - base = self.parse_optional_chaining(base); - } else if self.peek(Token::SquareOpen) { - self.next(); - self.push_location(&base.location()); - let key = self.parse_expression(ParserExpressionContext { allow_in: true, min_precedence: OperatorPrecedence::List, ..default() }); - self.non_greedy_expect(Token::SquareClose); - base = Rc::new(Expression::ComputedMember(ComputedMemberExpression { - base, asdoc: None, key, location: self.pop_location() - })); - } else if self.consume(Token::Descendants) { - self.push_location(&base.location()); - let id = self.parse_qualified_identifier(); - base = Rc::new(Expression::Descendants(DescendantsExpression { - location: self.pop_location(), - base, - identifier: id, - })); - } else if self.peek(Token::ParenOpen) { - self.push_location(&base.location()); - let arguments = self.parse_arguments(); - base = Rc::new(Expression::Call(CallExpression { - location: self.pop_location(), - base, - arguments, - })); - } else if self.peek(Token::Exclamation) && !self.previous_token.1.line_break(&self.token.1) { - self.push_location(&base.location()); - self.next(); - base = Rc::new(Expression::Unary(UnaryExpression { - location: self.pop_location(), - expression: base, operator: Operator::NonNull, - })); - } else { - break; - } - } - - base - } - - fn parse_dot_subexpression(&mut self, base: Rc) -> Rc { - self.push_location(&base.location()); - if self.peek(Token::ParenOpen) { - let paren_location = self.token_location(); - let paren_exp = self.parse_paren_list_expression(); - if !matches!(paren_exp.as_ref(), Expression::Sequence(_)) && self.peek(Token::ColonColon) { - let q = Rc::new(Expression::Paren(ParenExpression { - location: paren_location.clone(), - expression: paren_exp.clone(), - })); - let id = self.finish_qualified_identifier(false, paren_location, q); - Rc::new(Expression::Member(MemberExpression { - location: self.pop_location(), - base, identifier: id - })) - } else { - Rc::new(Expression::Filter(FilterExpression { - location: self.pop_location(), - base, test: paren_exp - })) - } - } else if self.consume(Token::Lt) { - let mut arguments = vec![]; - arguments.push(self.parse_type_expression()); - while self.consume(Token::Comma) { - arguments.push(self.parse_type_expression()); - } - self.non_greedy_expect_type_parameters_gt(); - Rc::new(Expression::WithTypeArguments(ExpressionWithTypeArguments { - location: self.pop_location(), - base, arguments - })) - } else { - let id = self.parse_qualified_identifier(); - Rc::new(Expression::Member(MemberExpression { - location: self.pop_location(), - base, identifier: id - })) - } - } - - /// Ensures a parameter list consists of zero or more required parameters followed by - /// zero or more optional parameters optionally followed by a rest parameter. - fn validate_parameter_list(&mut self, params: Vec<(ParameterKind, Location)>) { - let mut least_kind = ParameterKind::Required; - let mut has_rest = false; - for (param_kind, param_loc) in params { - if !least_kind.may_be_followed_by(param_kind) { - self.add_syntax_error(¶m_loc, DiagnosticKind::WrongParameterPosition, vec![]); - } - least_kind = param_kind; - if param_kind == ParameterKind::Rest && has_rest { - self.add_syntax_error(¶m_loc, DiagnosticKind::DuplicateRestParameter, vec![]); - } - has_rest = param_kind == ParameterKind::Rest; - } - } - - fn parse_opt_start_expression(&mut self, context: ParserExpressionContext) -> Option> { - if let Token::Identifier(id) = self.token.0.clone() { - let id_location = self.token_location(); - self.next(); - Some(self.parse_expression_starting_with_identifier((id, id_location))) - } else if self.peek(Token::Null) { - self.mark_location(); - self.next(); - Some(Rc::new(Expression::NullLiteral(NullLiteral { - location: self.pop_location(), - }))) - } else if self.peek(Token::False) { - self.mark_location(); - self.next(); - Some(Rc::new(Expression::BooleanLiteral(BooleanLiteral { - location: self.pop_location(), - value: false, - }))) - } else if self.peek(Token::True) { - self.mark_location(); - self.next(); - Some(Rc::new(Expression::BooleanLiteral(BooleanLiteral { - location: self.pop_location(), - value: true, - }))) - } else if let Token::Number(n, suffix) = self.token.0.clone() { - self.mark_location(); - self.next(); - Some(Rc::new(Expression::NumericLiteral(NumericLiteral { - location: self.pop_location(), - value: n, - suffix, - }))) - } else if let Token::String(ref s) = self.token.0.clone() { - self.mark_location(); - self.next(); - Some(Rc::new(Expression::StringLiteral(StringLiteral { - location: self.pop_location(), - value: s.clone(), - }))) - } else if self.peek(Token::This) { - self.mark_location(); - self.next(); - Some(Rc::new(Expression::ThisLiteral(ThisLiteral { - location: self.pop_location(), - }))) - } else if self.peek(Token::Div) || self.peek(Token::DivideAssign) { - self.mark_location(); - self.token = self.tokenizer.scan_regexp_literal(self.token.1.clone(), if self.peek(Token::DivideAssign) { "=".into() } else { "".into() }); - let Token::RegExp { ref body, ref flags } = self.token.0.clone() else { - panic!(); - }; - self.next(); - Some(Rc::new(Expression::RegExpLiteral(RegExpLiteral { - location: self.pop_location(), - body: body.clone(), flags: flags.clone(), - }))) - // `@` - } else if self.peek(Token::Attribute) { - self.mark_location(); - let id = self.parse_qualified_identifier(); - Some(Rc::new(Expression::QualifiedIdentifier(id))) - // Parentheses - } else if self.peek(Token::ParenOpen) { - Some(self.parse_paren_list_expr_or_qual_id()) - // XMLList, XMLElement, XMLMarkup - } else if self.peek(Token::Lt) { - if let Some(token) = self.tokenizer.scan_xml_markup(self.token_location()) { - self.token = token; - } - let start = self.token_location(); - if let Token::XmlMarkup(content) = &self.token.0.clone() { - self.mark_location(); - self.next(); - Some(Rc::new(Expression::XmlMarkup(XmlMarkupExpression { - location: self.pop_location(), - markup: content.clone(), - }))) - } else { - Some(self.parse_xml_element_or_xml_list(start)) - } - // ArrayInitializer - } else if self.peek(Token::SquareOpen) { - Some(self.parse_array_initializer()) - // NewExpression - } else if self.peek(Token::New) && context.min_precedence.includes(&OperatorPrecedence::Unary) { - let start = self.token_location(); - self.next(); - Some(self.parse_new_expression(start)) - } else if self.peek(Token::BlockOpen) { - Some(self.parse_object_initializer()) - } else if self.peek(Token::Function) && context.min_precedence.includes(&OperatorPrecedence::AssignmentAndOther) { - Some(self.parse_function_expression(context.clone())) - // SuperExpression - } else if self.peek(Token::Super) && context.min_precedence.includes(&OperatorPrecedence::Postfix) { - Some(self.parse_super_expression_followed_by_property_operator()) - // AwaitExpression - } else if self.peek(Token::Await) && context.min_precedence.includes(&OperatorPrecedence::Unary) { - self.mark_location(); - let operator_token = self.token.clone(); - self.next(); - let base = self.parse_expression(ParserExpressionContext { - allow_in: true, - min_precedence: OperatorPrecedence::Unary, - ..default() - }); - if let Some(activation) = self.activations.last_mut() { - activation.uses_await = true; - } else { - self.add_syntax_error(&operator_token.1, DiagnosticKind::NotAllowedHere, diagarg![operator_token.0]); - } - Some(Rc::new(Expression::Unary(UnaryExpression { - location: self.pop_location(), - expression: base, operator: Operator::Await, - }))) - // YieldExpression - } else if self.peek(Token::Yield) && context.min_precedence.includes(&OperatorPrecedence::AssignmentAndOther) { - self.mark_location(); - let operator_token = self.token.clone(); - self.next(); - let base = self.parse_expression(ParserExpressionContext { - allow_in: true, - min_precedence: OperatorPrecedence::AssignmentAndOther, - ..default() - }); - if let Some(activation) = self.activations.last_mut() { - activation.uses_yield = true; - } else { - self.add_syntax_error(&operator_token.1, DiagnosticKind::NotAllowedHere, diagarg![operator_token.0]); - } - Some(Rc::new(Expression::Unary(UnaryExpression { - location: self.pop_location(), - expression: base, operator: Operator::Yield, - }))) - // Miscellaneous prefix unary expressions - } else if let Some((operator, subexp_precedence)) = self.check_prefix_operator() { - if context.min_precedence.includes(&OperatorPrecedence::Unary) { - self.mark_location(); - self.next(); - let base = self.parse_expression(ParserExpressionContext { min_precedence: subexp_precedence, ..default() }); - Some(Rc::new(Expression::Unary(UnaryExpression { - location: self.pop_location(), - expression: base, operator, - }))) - } else { - None - } - // ImportMeta - } else if self.peek(Token::Import) && context.min_precedence.includes(&OperatorPrecedence::Postfix) { - self.mark_location(); - self.next(); - self.non_greedy_expect(Token::Dot); - self.non_greedy_expect_context_keyword("meta"); - Some(Rc::new(Expression::ImportMeta(ImportMeta { - location: self.pop_location(), - }))) - // QualifiedIdentifier - } else if - self.peek(Token::Times) - || self.peek(Token::Public) || self.peek(Token::Private) - || self.peek(Token::Protected) || self.peek(Token::Internal) { - let id = self.parse_qualified_identifier(); - Some(Rc::new(Expression::QualifiedIdentifier(id))) - } else { - None - } - } - - fn parse_expression_starting_with_identifier(&mut self, id: (String, Location)) -> Rc { - let id_location = id.1.clone(); - let id = id.0; - - /* - // EmbedExpression - if self.peek(Token::BlockOpen) && id == "embed" && self.previous_token.1.character_count() == "embed".len() { - return self.finish_embed_expression(id_location); - } - */ - - let id = Rc::new(Expression::QualifiedIdentifier(QualifiedIdentifier { - location: id_location.clone(), - attribute: false, - qualifier: None, - id: QualifiedIdentifierIdentifier::Id((id, id_location.clone())), - })); - if self.peek(Token::ColonColon) { - self.push_location(&id_location.clone()); - let ql = self.pop_location(); - let id = self.finish_qualified_identifier(false, ql, id); - Rc::new(Expression::QualifiedIdentifier(id)) - } else { - id - } - } - - fn check_prefix_operator(&self) -> Option<(Operator, OperatorPrecedence)> { - match self.token.0 { - Token::Delete => Some((Operator::Delete, OperatorPrecedence::Postfix)), - Token::Void => Some((Operator::Void, OperatorPrecedence::Unary)), - Token::Typeof => Some((Operator::Typeof, OperatorPrecedence::Unary)), - Token::Increment => Some((Operator::PreIncrement, OperatorPrecedence::Postfix)), - Token::Decrement => Some((Operator::PreDecrement, OperatorPrecedence::Postfix)), - Token::Plus => Some((Operator::Positive, OperatorPrecedence::Unary)), - Token::Minus => Some((Operator::Negative, OperatorPrecedence::Unary)), - Token::Tilde => Some((Operator::BitwiseNot, OperatorPrecedence::Unary)), - Token::Exclamation => Some((Operator::LogicalNot, OperatorPrecedence::Unary)), - _ => None, - } - } - - fn parse_function_expression(&mut self, context: ParserExpressionContext) -> Rc { - self.mark_location(); - self.next(); - let mut name = None; - if let Token::Identifier(id) = self.token.0.clone() { - name = Some((id, self.token.1.clone())); - self.next(); - } - let common = self.parse_function_common(true, ParserDirectiveContext::Default, context.allow_in); - Rc::new(Expression::Function(FunctionExpression { - location: self.pop_location(), - name, - common, - })) - } - - fn parse_function_common(&mut self, function_expr: bool, block_context: ParserDirectiveContext, allow_in: bool) -> Rc { - self.mark_location(); - self.duplicate_location(); - let mut params: Vec> = vec![]; - let mut return_annotation = Some(self.create_invalidated_expression(&self.tokenizer.cursor_location())); - self.non_greedy_expect(Token::ParenOpen); - if !self.expecting_token_error { - if !self.peek(Token::ParenClose) { - params.push(self.parse_parameter()); - while self.consume(Token::Comma) { - params.push(self.parse_parameter()); - } - } - self.non_greedy_expect(Token::ParenClose); - if !self.expecting_token_error { - return_annotation = if self.consume(Token::Colon) { Some(self.parse_type_expression()) } else { None }; - } - self.validate_parameter_list(params.iter().map(|p| (p.kind, p.location.clone())).collect::>()); - } - - let signature_location = self.pop_location(); - - // Enter activation - self.activations.push(ParserActivation::new()); - - // Body - let body = if self.peek(Token::BlockOpen) { - Some(FunctionBody::Block(Rc::new(self.parse_block(block_context)))) - } else if !(self.offending_token_is_inline_or_higher_indented() || self.peek(Token::ParenOpen)) { - None - } else { - self.parse_opt_expression(ParserExpressionContext { - allow_in, - min_precedence: OperatorPrecedence::AssignmentAndOther, - ..default() - }).map(|e| FunctionBody::Expression(e)) - }; - - // Body is required by function expressions - if body.is_none() && function_expr { - self.non_greedy_expect(Token::BlockOpen); - } - - // Exit activation - let activation = self.activations.pop().unwrap(); - - Rc::new(FunctionCommon { - location: self.pop_location(), - contains_await: activation.uses_await, - contains_yield: activation.uses_yield, - signature: FunctionSignature { - location: signature_location, - parameters: params, - result_type: return_annotation, - }, - body, - }) - } - - fn parse_parameter(&mut self) -> Rc { - self.mark_location(); - let rest = self.consume(Token::Ellipsis); - let binding: Rc = Rc::new(self.parse_variable_binding(true)); - let has_initializer = binding.initializer.is_some(); - let location = self.pop_location(); - if rest && has_initializer { - self.add_syntax_error(&location.clone(), DiagnosticKind::MalformedRestParameter, vec![]); - } - Rc::new(Parameter { - location, - destructuring: binding.destructuring.clone(), - default_value: binding.initializer.clone(), - kind: if rest { - ParameterKind::Rest - } else if has_initializer { - ParameterKind::Optional - } else { - ParameterKind::Required - }, - }) - } - - fn parse_object_initializer(&mut self) -> Rc { - self.mark_location(); - self.non_greedy_expect(Token::BlockOpen); - let mut fields: Vec> = vec![]; - while !self.peek(Token::BlockClose) { - fields.push(self.parse_field()); - if !self.consume(Token::Comma) { - break; - } - } - self.non_greedy_expect(Token::BlockClose); - - Rc::new(Expression::ObjectInitializer(ObjectInitializer { - location: self.pop_location(), - fields, - })) - } - - fn parse_field(&mut self) -> Rc { - if self.peek(Token::Ellipsis) { - self.mark_location(); - self.next(); - let subexp = self.parse_expression(ParserExpressionContext { - allow_in: true, - min_precedence: OperatorPrecedence::AssignmentAndOther, - ..default() - }); - return Rc::new(InitializerField::Rest((subexp, self.pop_location()))); - } - - let name = self.parse_field_name(); - - let non_null = self.consume(Token::Exclamation); - let mut value = None; - - if self.consume(Token::Colon) { - value = Some(self.parse_expression(ParserExpressionContext { - allow_in: true, - min_precedence: OperatorPrecedence::AssignmentAndOther, - ..default() - })); - } else if !matches!(name.0, FieldName::Identifier(_)) { - self.non_greedy_expect(Token::Colon); - } - - Rc::new(InitializerField::Field { - name, - non_null, - value, - }) - } - - fn parse_field_name(&mut self) -> (FieldName, Location) { - if let Token::String(value) = &self.token.0.clone() { - let location = self.token_location(); - self.next(); - (FieldName::StringLiteral(Rc::new(Expression::StringLiteral(StringLiteral { - location: location.clone(), - value: value.clone(), - }))), location) - } else if let Token::Number(value, suffix) = &self.token.0.clone() { - let location = self.token_location(); - self.next(); - (FieldName::NumericLiteral(Rc::new(Expression::NumericLiteral(NumericLiteral { - location: location.clone(), - value: value.clone(), - suffix: *suffix, - }))), location) - } else if self.peek(Token::SquareOpen) { - self.mark_location(); - self.next(); - let key_expr = self.parse_expression(ParserExpressionContext { - allow_in: true, - min_precedence: OperatorPrecedence::List, - ..default() - }); - self.non_greedy_expect(Token::SquareClose); - let location = self.pop_location(); - (FieldName::Brackets(key_expr), location) - } else { - let id = self.parse_non_attribute_qualified_identifier(); - let l = id.location.clone(); - (FieldName::Identifier(id), l) - } - } - - fn parse_new_expression(&mut self, start: Location) -> Rc { - self.push_location(&start); - if self.consume(Token::Lt) { - let element_type = self.parse_type_expression(); - self.non_greedy_expect_type_parameters_gt(); - let mut elements: Vec = vec![]; - self.non_greedy_expect(Token::SquareOpen); - if !self.expecting_token_error { - while !self.peek(Token::SquareClose) { - if self.peek(Token::Ellipsis) { - self.mark_location(); - self.next(); - elements.push(Element::Rest((self.parse_expression(ParserExpressionContext { - allow_in: true, - min_precedence: OperatorPrecedence::AssignmentAndOther, - ..default() - }), self.pop_location()))); - } else { - elements.push(Element::Expression(self.parse_expression(ParserExpressionContext { - allow_in: true, - min_precedence: OperatorPrecedence::AssignmentAndOther, - ..default() - }))); - } - if !self.consume(Token::Comma) { - break; - } - } - self.non_greedy_expect(Token::SquareClose); - } - Rc::new(Expression::VectorLiteral(VectorLiteral { - location: self.pop_location(), - element_type, - elements, - })) - } else { - let base = self.parse_new_subexpression(); - let arguments = if self.peek(Token::ParenOpen) { Some(self.parse_arguments()) } else { None }; - Rc::new(Expression::New(NewExpression { - location: self.pop_location(), - base, arguments, - })) - } - } - - fn parse_new_expression_start(&mut self) -> Rc { - if self.peek(Token::New) { - let start = self.token_location(); - self.next(); - self.parse_new_expression(start) - } else if self.peek(Token::Super) { - self.parse_super_expression_followed_by_property_operator() - } else { - self.parse_primary_expression() - } - } - - fn parse_super_expression_followed_by_property_operator(&mut self) -> Rc { - self.mark_location(); - self.duplicate_location(); - self.next(); - let arguments = if self.peek(Token::ParenOpen) { Some(self.parse_arguments()) } else { None }; - let super_expr = Rc::new(Expression::Super(SuperExpression { - location: self.pop_location(), - object: arguments, - })); - - if self.consume(Token::SquareOpen) { - let key = self.parse_expression(ParserExpressionContext { allow_in: true, min_precedence: OperatorPrecedence::List, ..default() }); - self.non_greedy_expect(Token::SquareClose); - Rc::new(Expression::ComputedMember(ComputedMemberExpression { - location: self.pop_location(), - base: super_expr, asdoc: None, key, - })) - } else { - self.non_greedy_expect(Token::Dot); - let identifier = self.parse_qualified_identifier(); - Rc::new(Expression::Member(MemberExpression { - location: self.pop_location(), - base: super_expr, identifier, - })) - } - } - - fn parse_arguments(&mut self) -> Vec> { - self.non_greedy_expect(Token::ParenOpen); - let mut arguments = vec![]; - if !self.peek(Token::ParenClose) { - arguments.push(self.parse_expression(ParserExpressionContext { - allow_in: true, - min_precedence: OperatorPrecedence::AssignmentAndOther, - ..default() - })); - while self.consume(Token::Comma) { - arguments.push(self.parse_expression(ParserExpressionContext { - allow_in: true, - min_precedence: OperatorPrecedence::AssignmentAndOther, - ..default() - })); - } - } - self.non_greedy_expect(Token::ParenClose); - arguments - } - - fn parse_new_subexpression(&mut self) -> Rc { - let mut base = self.parse_new_expression_start(); - loop { - if self.consume(Token::SquareOpen) { - self.push_location(&base.location()); - let key = self.parse_expression(ParserExpressionContext { allow_in: true, min_precedence: OperatorPrecedence::List, ..default() }); - self.non_greedy_expect(Token::SquareClose); - base = Rc::new(Expression::ComputedMember(ComputedMemberExpression { - location: self.pop_location(), - base, asdoc: None, key, - })); - } else if self.consume(Token::Dot) { - self.push_location(&base.location()); - if self.consume(Token::Lt) { - let mut arguments = vec![]; - arguments.push(self.parse_type_expression()); - while self.consume(Token::Comma) { - arguments.push(self.parse_type_expression()); - } - self.non_greedy_expect_type_parameters_gt(); - base = Rc::new(Expression::WithTypeArguments(ExpressionWithTypeArguments { - location: self.pop_location(), - base, arguments - })); - } else { - let identifier = self.parse_qualified_identifier(); - base = Rc::new(Expression::Member(MemberExpression { - location: self.pop_location(), - base, identifier, - })); - } - } else { - break; - } - } - base - } - - fn parse_primary_expression(&mut self) -> Rc { - if let Token::Identifier(id) = self.token.0.clone() { - let id_location = self.token_location(); - self.next(); - - /* - // EmbedExpression - if self.peek(Token::BlockOpen) && id == "embed" && self.previous_token.1.character_count() == "embed".len() { - return self.finish_embed_expression(id_location); - } - */ - - let id = Rc::new(Expression::QualifiedIdentifier(QualifiedIdentifier { - location: id_location.clone(), - attribute: false, - qualifier: None, - id: QualifiedIdentifierIdentifier::Id((id, id_location.clone())), - })); - if self.peek(Token::ColonColon) { - self.push_location(&id_location.clone()); - let ql = self.pop_location(); - let id = self.finish_qualified_identifier(false, ql, id); - Rc::new(Expression::QualifiedIdentifier(id)) - } else { - id - } - } else if self.peek(Token::Null) { - self.mark_location(); - self.next(); - Rc::new(Expression::NullLiteral(NullLiteral { - location: self.pop_location(), - })) - } else if self.peek(Token::False) { - self.mark_location(); - self.next(); - Rc::new(Expression::BooleanLiteral(BooleanLiteral { - location: self.pop_location(), - value: false, - })) - } else if self.peek(Token::True) { - self.mark_location(); - self.next(); - Rc::new(Expression::BooleanLiteral(BooleanLiteral { - location: self.pop_location(), - value: true, - })) - } else if let Token::Number(n, suffix) = self.token.0.clone() { - self.mark_location(); - self.next(); - Rc::new(Expression::NumericLiteral(NumericLiteral { - location: self.pop_location(), - value: n, - suffix, - })) - } else if let Token::String(ref s) = self.token.0.clone() { - self.mark_location(); - self.next(); - Rc::new(Expression::StringLiteral(StringLiteral { - location: self.pop_location(), - value: s.clone(), - })) - } else if self.peek(Token::This) { - self.mark_location(); - self.next(); - Rc::new(Expression::ThisLiteral(ThisLiteral { - location: self.pop_location(), - })) - } else if self.peek(Token::Div) || self.peek(Token::DivideAssign) { - self.mark_location(); - self.token = self.tokenizer.scan_regexp_literal(self.token.1.clone(), if self.peek(Token::DivideAssign) { "=".into() } else { "".into() }); - let Token::RegExp { ref body, ref flags } = self.token.0.clone() else { - panic!(); - }; - self.next(); - Rc::new(Expression::RegExpLiteral(RegExpLiteral { - location: self.pop_location(), - body: body.clone(), flags: flags.clone(), - })) - // `@` - } else if self.peek(Token::Attribute) { - self.mark_location(); - let id = self.parse_qualified_identifier(); - Rc::new(Expression::QualifiedIdentifier(id)) - // Parentheses - } else if self.peek(Token::ParenOpen) { - return self.parse_paren_list_expr_or_qual_id(); - // XMLList, XMLElement, XMLMarkup - } else if self.peek(Token::Lt) { - if let Some(token) = self.tokenizer.scan_xml_markup(self.token_location()) { - self.token = token; - } - let start = self.token_location(); - if let Token::XmlMarkup(content) = &self.token.0.clone() { - self.mark_location(); - self.next(); - Rc::new(Expression::XmlMarkup(XmlMarkupExpression { - location: self.pop_location(), - markup: content.clone(), - })) - } else { - self.parse_xml_element_or_xml_list(start) - } - // ArrayInitializer - } else if self.peek(Token::SquareOpen) { - self.parse_array_initializer() - } else if self.peek(Token::BlockOpen) { - self.parse_object_initializer() - // QualifiedIdentifier - } else if - self.peek(Token::Times) - || self.peek(Token::Public) || self.peek(Token::Private) - || self.peek(Token::Protected) || self.peek(Token::Internal) { - let id = self.parse_qualified_identifier(); - Rc::new(Expression::QualifiedIdentifier(id)) - } else { - self.add_syntax_error(&self.token_location(), DiagnosticKind::ExpectingExpression, diagarg![self.token.0.clone()]); - self.create_invalidated_expression(&self.tokenizer.cursor_location()) - } - } - - /* - fn finish_embed_expression(&mut self, start: Location) -> Rc { - self.push_location(&start); - let descriptor = self.parse_object_initializer().clone(); - let Expression::ObjectInitializer(descriptor) = descriptor.as_ref() else { - panic!(); - }; - return Rc::new(Expression::Embed(EmbedExpression { - location: self.pop_location(), - description: descriptor.clone(), - })); - } - */ - - fn parse_array_initializer(&mut self) -> Rc { - self.mark_location(); - - let asdoc = self.parse_asdoc(); - - self.non_greedy_expect(Token::SquareOpen); - - let mut elements: Vec = vec![]; - - while !self.peek(Token::SquareClose) { - let mut ellipses = false; - while self.consume(Token::Comma) { - elements.push(Element::Elision); - ellipses = true; - } - if !ellipses { - if self.peek(Token::Ellipsis) { - self.mark_location(); - self.next(); - elements.push(Element::Rest((self.parse_expression(ParserExpressionContext { - allow_in: true, - min_precedence: OperatorPrecedence::AssignmentAndOther, - ..default() - }), self.pop_location()))); - } else { - elements.push(Element::Expression(self.parse_expression(ParserExpressionContext { - allow_in: true, - min_precedence: OperatorPrecedence::AssignmentAndOther, - ..default() - }))); - } - } - if !self.consume(Token::Comma) { - break; - } - } - self.non_greedy_expect(Token::SquareClose); - Rc::new(Expression::ArrayLiteral(ArrayLiteral { - location: self.pop_location(), - asdoc, - elements, - })) - } - - fn parse_xml_element_or_xml_list(&mut self, start: Location) -> Rc { - self.next_ie_xml_tag(); - if self.consume_and_ie_xml_content(Token::Gt) { - self.push_location(&start); - let content = self.parse_xml_content(); - self.non_greedy_expect_and_ie_xml_tag(Token::XmlLtSlash); - self.non_greedy_expect(Token::Gt); - return Rc::new(Expression::XmlList(XmlListExpression { - location: self.pop_location(), - content, - })); - } - - self.push_location(&start); - let element = Rc::new(self.parse_xml_element(start, true)); - return Rc::new(Expression::Xml(XmlExpression { - location: self.pop_location(), - element, - })); - } - - /// Parses XMLElement starting from its XMLTagContent. - fn parse_xml_element(&mut self, start: Location, ends_at_ie_div: bool) -> XmlElement { - self.push_location(&start); - let name = self.parse_xml_tag_name(); - let mut attributes: Vec> = vec![]; - let mut attribute_expression: Option> = None; - while self.consume_and_ie_xml_tag(Token::XmlWhitespace) { - if self.consume(Token::BlockOpen) { - let expr = self.parse_expression(ParserExpressionContext { allow_in: true, min_precedence: OperatorPrecedence::AssignmentAndOther, ..default() }); - self.expect_and_ie_xml_tag(Token::BlockClose); - attribute_expression = Some(expr); - self.consume_and_ie_xml_tag(Token::XmlWhitespace); - break; - } else if matches!(self.token.0, Token::XmlName(_)) { - self.mark_location(); - let name = self.parse_xml_name(); - self.consume_and_ie_xml_tag(Token::XmlWhitespace); - self.non_greedy_expect_and_ie_xml_tag(Token::Assign); - let mut value = XmlAttributeValue::Value(("".into(), self.token.1.clone())); - if !self.expecting_token_error { - self.consume_and_ie_xml_tag(Token::XmlWhitespace); - if self.consume(Token::BlockOpen) { - let expr = self.parse_expression(ParserExpressionContext { allow_in: true, min_precedence: OperatorPrecedence::AssignmentAndOther, ..default() }); - self.expect_and_ie_xml_tag(Token::BlockClose); - value = XmlAttributeValue::Expression(expr); - } else { - value = XmlAttributeValue::Value(self.parse_xml_attribute_value()); - } - } - attributes.push(Rc::new(XmlAttribute { - location: self.pop_location(), - name, value - })); - } else { - break; - } - } - - let mut content: Option>> = None; - let mut closing_name: Option = None; - - let is_empty; - - if ends_at_ie_div { - is_empty = self.consume(Token::XmlSlashGt); - } else { - is_empty = self.consume_and_ie_xml_content(Token::XmlSlashGt); - } - - if !is_empty { - self.expect_and_ie_xml_content(Token::Gt); - content = Some(self.parse_xml_content()); - self.non_greedy_expect_and_ie_xml_tag(Token::XmlLtSlash); - closing_name = Some(self.parse_xml_tag_name()); - self.consume_and_ie_xml_tag(Token::XmlWhitespace); - if ends_at_ie_div { - self.non_greedy_expect(Token::Gt); - } else { - self.non_greedy_expect_and_ie_xml_content(Token::Gt); - } - } - - XmlElement { - location: self.pop_location(), - name, - attributes, - attribute_expression, - content, - closing_name, - } - } - - fn parse_xml_attribute_value(&mut self) -> (String, Location) { - if let Token::XmlAttributeValue(value) = self.token.0.clone() { - let location = self.token_location(); - self.next_ie_xml_tag(); - return (value, location); - } else { - self.add_syntax_error(&self.token_location(), DiagnosticKind::ExpectingXmlAttributeValue, diagarg![self.token.0.clone()]); - ("".into(), self.tokenizer.cursor_location()) - } - } - - fn parse_xml_tag_name(&mut self) -> XmlTagName { - if self.consume(Token::BlockOpen) { - let expr = self.parse_expression(ParserExpressionContext { - allow_in: true, - min_precedence: OperatorPrecedence::AssignmentAndOther, - ..default() - }); - self.expect_and_ie_xml_tag(Token::BlockClose); - XmlTagName::Expression(expr) - } else { - XmlTagName::Name(self.parse_xml_name()) - } - } - - fn parse_xml_name(&mut self) -> (String, Location) { - if let Token::XmlName(name) = self.token.0.clone() { - let name_location = self.token_location(); - self.next_ie_xml_tag(); - return (name, name_location); - } else { - self.add_syntax_error(&self.token_location(), DiagnosticKind::ExpectingXmlName, diagarg![self.token.0.clone()]); - (INVALIDATED_IDENTIFIER.into(), self.tokenizer.cursor_location()) - } - } - - /// Parses XMLContent until a ` Vec> { - let mut content = vec![]; - while !self.peek(Token::XmlLtSlash) { - if self.consume(Token::BlockOpen) { - let expr = self.parse_expression(ParserExpressionContext { allow_in: true, min_precedence: OperatorPrecedence::AssignmentAndOther, ..default() }); - self.expect_and_ie_xml_content(Token::BlockClose); - content.push(Rc::new(XmlContent::Expression(expr))); - } else if let Token::XmlMarkup(markup) = self.token.0.clone() { - let location = self.token_location(); - self.next_ie_xml_content(); - content.push(Rc::new(XmlContent::Markup((markup, location)))); - } else if let Token::XmlText(text) = self.token.0.clone() { - if self.tokenizer.characters().reached_end() { - self.expect_and_ie_xml_content(Token::XmlLtSlash); - break; - } - let location = self.token_location(); - self.next_ie_xml_content(); - content.push(Rc::new(XmlContent::Characters((text, location)))); - } else if self.consume_and_ie_xml_tag(Token::Lt) { - let start = self.token_location(); - let element = self.parse_xml_element(start, false); - content.push(Rc::new(XmlContent::Element(Rc::new(element)))); - } else if self.peek(Token::Eof) { - break; - } else { - self.expect_and_ie_xml_content(Token::XmlLtSlash); - } - } - content - } - - fn finish_paren_list_expr_or_qual_id(&mut self, start: Location, left: Rc) -> Rc { - if self.peek(Token::ColonColon) && !matches!(left.as_ref(), Expression::Sequence(_)) { - self.push_location(&start); - let ql = self.pop_location(); - let left = Rc::new(Expression::Paren(ParenExpression { - location: ql.clone(), - expression: left, - })); - let id = self.finish_qualified_identifier(false, ql, left); - return Rc::new(Expression::QualifiedIdentifier(id)); - } - self.push_location(&start); - return Rc::new(Expression::Paren(ParenExpression { - location: self.pop_location(), - expression: left, - })); - } - - /// Parses either a ParenListExpression, (), or a QualifiedIdentifier - fn parse_paren_list_expr_or_qual_id(&mut self) -> Rc { - let start = self.token_location(); - self.non_greedy_expect(Token::ParenOpen); - - let expr = self.parse_expression(ParserExpressionContext { - min_precedence: OperatorPrecedence::List, - allow_in: true, - ..default() - }); - - self.non_greedy_expect(Token::ParenClose); - self.finish_paren_list_expr_or_qual_id(start, expr) - } - - fn parse_opt_reserved_namespace(&mut self) -> Option> { - let loc = self.token.1.clone(); - if self.consume(Token::Public) { - Some(Rc::new(Expression::ReservedNamespace(ReservedNamespaceExpression::Public(loc)))) - } else if self.consume(Token::Private) { - Some(Rc::new(Expression::ReservedNamespace(ReservedNamespaceExpression::Private(loc)))) - } else if self.consume(Token::Protected) { - Some(Rc::new(Expression::ReservedNamespace(ReservedNamespaceExpression::Protected(loc)))) - } else if self.consume(Token::Internal) { - Some(Rc::new(Expression::ReservedNamespace(ReservedNamespaceExpression::Internal(loc)))) - } else { - None - } - } - - fn parse_qualified_identifier(&mut self) -> QualifiedIdentifier { - self.mark_location(); - - let attribute = self.consume(Token::Attribute); - if attribute && self.peek(Token::SquareOpen) { - let brackets = self.parse_brackets(); - return QualifiedIdentifier { - location: self.pop_location(), - attribute, - qualifier: None, - id: QualifiedIdentifierIdentifier::Brackets(brackets), - }; - } - - // public, private, protected, internal - if let Some(qual) = self.parse_opt_reserved_namespace() { - if self.peek(Token::ColonColon) { - let ql = self.pop_location(); - return self.finish_qualified_identifier(attribute, ql, qual); - } else { - let id = QualifiedIdentifier { - location: self.pop_location(), - attribute, - qualifier: None, - id: QualifiedIdentifierIdentifier::Id((qual.to_reserved_namespace_string().unwrap(), qual.location())), - }; - return id; - } - } - - let mut id: Option = None; - - // IdentifierName - if let Token::Identifier(id_1) = self.token.0.clone() { - id = Some(id_1); - } else { - if let Some(id_1) = self.token.0.reserved_word_name() { - id = Some(id_1); - } else if self.peek(Token::Times) { - id = Some("*".to_owned()); - } - } - - if let Some(id) = id { - let id_location = self.token_location(); - self.next(); - if self.peek(Token::ColonColon) { - let id = QualifiedIdentifier { - location: id_location.clone(), - attribute: false, - qualifier: None, - id: QualifiedIdentifierIdentifier::Id((id, id_location.clone())), - }; - let id = Rc::new(Expression::QualifiedIdentifier(id)); - let ql = self.pop_location(); - return self.finish_qualified_identifier(attribute, ql, id); - } else { - let id = QualifiedIdentifier { - location: self.pop_location(), - attribute, - qualifier: None, - id: QualifiedIdentifierIdentifier::Id((id, id_location.clone())), - }; - return id; - } - } - - // (q)::x - if self.peek(Token::ParenOpen) { - let qual = self.parse_paren_expression(); - let ql = self.pop_location(); - let qual = Rc::new(Expression::Paren(ParenExpression { - location: ql.clone(), - expression: qual, - })); - return self.finish_qualified_identifier(attribute, ql, qual); - } - - self.add_syntax_error(&self.token_location(), DiagnosticKind::ExpectingIdentifier, diagarg![self.token.0.clone()]); - QualifiedIdentifier { - location: self.pop_location(), - attribute: false, - qualifier: None, - id: QualifiedIdentifierIdentifier::Id(("".into(), self.tokenizer.cursor_location())), - } - } - - fn parse_non_attribute_qualified_identifier(&mut self) -> QualifiedIdentifier { - self.mark_location(); - - let attribute = false; - - // public, private, protected, internal - if let Some(qual) = self.parse_opt_reserved_namespace() { - if self.peek(Token::ColonColon) { - let ql = self.pop_location(); - return self.finish_qualified_identifier(attribute, ql, qual); - } else { - let id = QualifiedIdentifier { - location: self.pop_location(), - attribute, - qualifier: None, - id: QualifiedIdentifierIdentifier::Id((qual.to_reserved_namespace_string().unwrap(), qual.location())), - }; - return id; - } - } - - let mut id: Option = None; - - // IdentifierName - if let Token::Identifier(id_1) = self.token.0.clone() { - id = Some(id_1); - } else { - if let Some(id_1) = self.token.0.reserved_word_name() { - id = Some(id_1); - } else if self.peek(Token::Times) { - id = Some("*".to_owned()); - } - } - - if let Some(id) = id { - let id_location = self.token_location(); - self.next(); - if self.peek(Token::ColonColon) { - let id = QualifiedIdentifier { - location: id_location.clone(), - attribute: false, - qualifier: None, - id: QualifiedIdentifierIdentifier::Id((id, id_location.clone())), - }; - let id = Rc::new(Expression::QualifiedIdentifier(id)); - let ql = self.pop_location(); - return self.finish_qualified_identifier(attribute, ql, id); - } else { - let id = QualifiedIdentifier { - location: self.pop_location(), - attribute, - qualifier: None, - id: QualifiedIdentifierIdentifier::Id((id, id_location.clone())), - }; - return id; - } - } - - // (q)::x - if self.peek(Token::ParenOpen) { - let qual = self.parse_paren_expression(); - let ql = self.pop_location(); - let qual = Rc::new(Expression::Paren(ParenExpression { - location: ql.clone(), - expression: qual, - })); - return self.finish_qualified_identifier(attribute, ql, qual); - } - - self.add_syntax_error(&self.token_location(), DiagnosticKind::ExpectingIdentifier, diagarg![self.token.0.clone()]); - QualifiedIdentifier { - location: self.pop_location(), - attribute: false, - qualifier: None, - id: QualifiedIdentifierIdentifier::Id(("".into(), self.tokenizer.cursor_location())), - } - } - - /// Expects a colon-colon and finishes a qualified identifier. - fn finish_qualified_identifier(&mut self, attribute: bool, start_location: Location, qual: Rc) -> QualifiedIdentifier { - self.push_location(&start_location); - self.non_greedy_expect(Token::ColonColon); - - // `::` may be followed by one of { IdentifierName, `*`, Brackets } - - // IdentifierName - if let Some(id) = self.consume_identifier(true) { - QualifiedIdentifier { - location: self.pop_location(), - attribute, - qualifier: Some(qual), - id: QualifiedIdentifierIdentifier::Id(id), - } - // `*` - } else if self.peek(Token::Times) { - let id_location = self.token_location(); - self.next(); - QualifiedIdentifier { - location: self.pop_location(), - attribute, - qualifier: Some(qual), - id: QualifiedIdentifierIdentifier::Id(("*".into(), id_location)), - } - // Brackets - } else if self.peek(Token::SquareOpen) { - let brackets = self.parse_brackets(); - QualifiedIdentifier { - location: self.pop_location(), - attribute, - qualifier: Some(qual), - id: QualifiedIdentifierIdentifier::Brackets(brackets), - } - } else { - self.add_syntax_error(&self.token_location(), DiagnosticKind::ExpectingIdentifier, diagarg![self.token.0.clone()]); - QualifiedIdentifier { - location: self.pop_location(), - attribute, - qualifier: Some(qual), - id: QualifiedIdentifierIdentifier::Id(("".into(), self.tokenizer.cursor_location())), - } - } - } - - fn parse_brackets(&mut self) -> Rc { - self.non_greedy_expect(Token::SquareOpen); - let expr = self.parse_expression(ParserExpressionContext { - min_precedence: OperatorPrecedence::List, - allow_in: true, - ..default() - }); - self.non_greedy_expect(Token::SquareClose); - expr - } - - fn parse_paren_expression(&mut self) -> Rc { - self.non_greedy_expect(Token::ParenOpen); - let expr = self.parse_expression(ParserExpressionContext { - min_precedence: OperatorPrecedence::AssignmentAndOther, - allow_in: true, - ..default() - }); - self.non_greedy_expect(Token::ParenClose); - expr - } - - fn parse_paren_list_expression(&mut self) -> Rc { - self.non_greedy_expect(Token::ParenOpen); - let expr = self.parse_expression(ParserExpressionContext { - min_precedence: OperatorPrecedence::List, - allow_in: true, - ..default() - }); - self.non_greedy_expect(Token::ParenClose); - expr - } - - fn parse_typed_destructuring(&mut self) -> TypedDestructuring { - self.mark_location(); - let mut destructuring: Rc; - if self.peek(Token::BlockOpen) { - destructuring = self.parse_object_initializer(); - } else if self.peek(Token::SquareOpen) { - destructuring = self.parse_array_initializer(); - } else { - let id = self.expect_identifier(true); - let id = QualifiedIdentifier { - location: id.1.clone(), - attribute: false, - qualifier: None, - id: QualifiedIdentifierIdentifier::Id(id.clone()), - }; - destructuring = Rc::new(Expression::QualifiedIdentifier(id)); - } - if self.consume(Token::Exclamation) { - self.push_location(&destructuring.location()); - destructuring = Rc::new(Expression::Unary(UnaryExpression { - location: self.pop_location(), - operator: Operator::NonNull, - expression: destructuring.clone(), - })); - } - if !destructuring.is_valid_destructuring() { - self.add_syntax_error(&destructuring.location(), DiagnosticKind::MalformedDestructuring, vec![]) - } - let type_annotation = if self.consume(Token::Colon) { Some(self.parse_type_expression()) } else { None }; - TypedDestructuring { - location: self.pop_location(), - destructuring, - type_annotation, - } - } - - pub fn parse_type_expression(&mut self) -> Rc { - let start = self.token_location(); - let (mut base, wrap_nullable) = self.parse_type_expression_start(); - - loop { - if self.consume(Token::Dot) { - base = self.parse_dot_subexpression(base); - } else if self.consume(Token::Question) { - self.push_location(&base.location()); - base = Rc::new(Expression::NullableType(NullableTypeExpression { - location: self.pop_location(), - base, - })); - } else if self.consume(Token::Exclamation) { - self.push_location(&base.location()); - base = Rc::new(Expression::NonNullableType(NonNullableTypeExpression { - location: self.pop_location(), - base, - })); - } else { - break; - } - } - - if wrap_nullable { - self.push_location(&start); - base = Rc::new(Expression::NullableType(NullableTypeExpression { - location: self.pop_location(), - base, - })); - } - - base - } - - fn parse_type_expression_start(&mut self) -> (Rc, bool) { - // Allow a `?` prefix to wrap a type into nullable. - let wrap_nullable = self.consume(Token::Question); - - // Parenthesized - if self.peek(Token::ParenOpen) { - self.mark_location(); - let expression = self.parse_type_expression(); - (Rc::new(Expression::Paren(ParenExpression { - location: self.pop_location(), - expression, - })), wrap_nullable) - } - // `function` - else if self.peek(Token::Function) { - (self.parse_function_type_expression(), wrap_nullable) - // `void` - } else if self.peek(Token::Void) { - self.mark_location(); - self.next(); - (Rc::new(Expression::VoidType(VoidTypeExpression { - location: self.pop_location(), - })), wrap_nullable) - // [T] - // [T1, T2, ...Tn] - } else if self.peek(Token::SquareOpen) { - let mut elements = vec![]; - self.mark_location(); - self.next(); - elements.push(self.parse_type_expression()); - if self.consume(Token::SquareClose) { - (Rc::new(Expression::ArrayType(ArrayTypeExpression { - location: self.pop_location(), - expression: elements[0].clone(), - })), wrap_nullable) - } else { - self.non_greedy_expect(Token::Comma); - elements.push(self.parse_type_expression()); - while self.consume(Token::Comma) { - if self.peek(Token::SquareClose) { - break; - } - elements.push(self.parse_type_expression()); - } - self.non_greedy_expect(Token::SquareClose); - (Rc::new(Expression::TupleType(TupleTypeExpression { - location: self.pop_location(), - expressions: elements, - })), wrap_nullable) - } - } else if self.peek(Token::Times) { - let location = self.token_location(); - self.next(); - (Rc::new(Expression::AnyType(AnyTypeExpression { - location, - })), wrap_nullable) - // Identifier - } else { - let id = self.parse_qualified_identifier(); - (Rc::new(Expression::QualifiedIdentifier(id)), wrap_nullable) - } - } - - fn parse_function_type_expression(&mut self) -> Rc { - self.mark_location(); - self.next(); - - let mut parameters = vec![]; - self.non_greedy_expect(Token::ParenOpen); - if !self.expecting_token_error { - if !self.peek(Token::ParenClose) { - parameters.push(self.parse_function_type_parameter()); - while self.consume(Token::Comma) { - parameters.push(self.parse_function_type_parameter()); - } - } - self.non_greedy_expect(Token::ParenClose); - self.validate_parameter_list(parameters.iter().map(|p| (p.kind, p.location.clone())).collect::>()); - } - - let mut result_type = self.create_invalidated_expression(&self.tokenizer.cursor_location()); - self.non_greedy_expect(Token::Colon); - if !self.expecting_token_error { - result_type = self.parse_type_expression(); - } - Rc::new(Expression::FunctionType(FunctionTypeExpression { - location: self.pop_location(), - parameters, - result_type: Some(result_type), - })) - } - - fn parse_function_type_parameter(&mut self) -> Rc { - self.mark_location(); - let rest = self.consume(Token::Ellipsis); - let type_expression: Option> = if rest && self.peek(Token::ParenClose) { - None - } else { - Some(self.parse_type_expression()) - }; - let optional = !rest && self.consume(Token::Assign); - let location = self.pop_location(); - Rc::new(FunctionTypeParameter { - location, - type_expression, - kind: if rest { - ParameterKind::Rest - } else if optional { - ParameterKind::Optional - } else { - ParameterKind::Required - }, - }) - } - - fn parse_variable_binding(&mut self, allow_in: bool) -> VariableBinding { - let destructuring = self.parse_typed_destructuring(); - let initializer = if self.consume(Token::Assign) { - Some(self.parse_expression(ParserExpressionContext { - allow_in, - min_precedence: OperatorPrecedence::AssignmentAndOther, - ..default() - })) - } else { - None - }; - VariableBinding { - destructuring, - initializer, - } - } - - fn parse_semicolon(&mut self) -> bool { - self.consume(Token::Semicolon) || self.peek(Token::BlockClose) || self.previous_token.1.line_break(&self.token.1) - } - - fn parse_substatement(&mut self, context: ParserDirectiveContext) -> (Rc, bool) { - self.parse_statement(context) - } - - fn parse_statement(&mut self, context: ParserDirectiveContext) -> (Rc, bool) { - // ExpressionStatement or LabeledStatement - if let Token::Identifier(id) = &self.token.0.clone() { - let id = (id.clone(), self.token_location()); - self.next(); - self.parse_statement_starting_with_identifier(context, id) - // SuperStatement or ExpressionStatement with `super` - } else if self.peek(Token::Super) { - self.mark_location(); - self.next(); - let arguments = if self.peek(Token::ParenOpen) { Some(self.parse_arguments()) } else { None }; - let mut semicolon = false; - if arguments.is_some() { - semicolon = self.parse_semicolon(); - } - if !semicolon && (self.peek(Token::Dot) || self.peek(Token::SquareOpen)) { - if !(self.peek(Token::Dot) || self.peek(Token::SquareOpen)) { - self.non_greedy_expect(Token::Dot); - } - self.duplicate_location(); - // ExpressionStatement (`super`...) - let mut expr = Rc::new(Expression::Super(SuperExpression { - location: self.pop_location(), - object: arguments, - })); - expr = self.parse_subexpressions(expr, ParserExpressionContext { - allow_in: true, - min_precedence: OperatorPrecedence::List, - ..default() - }); - let semicolon = self.parse_semicolon(); - (Rc::new(Directive::ExpressionStatement(ExpressionStatement { - location: self.pop_location(), - expression: expr, - })), semicolon) - } else { - // SuperStatement - let node = Rc::new(Directive::SuperStatement(SuperStatement { - location: self.pop_location(), - arguments: arguments.unwrap(), - })); - - // Check whether super statement is allowed here - let allowed_here; - if context.may_contain_super_statement() { - allowed_here = !context.super_statement_found(); - context.set_super_statement_found(true); - } else { - allowed_here = false; - } - - if !allowed_here { - self.add_syntax_error(&node.location(), DiagnosticKind::NotAllowedHere, diagarg![Token::Super]); - } - - (node, semicolon) - } - // EmptyStatement - } else if self.peek(Token::Semicolon) { - self.mark_location(); - self.next(); - (Rc::new(Directive::EmptyStatement(EmptyStatement { - location: self.pop_location(), - })), true) - // Block - } else if self.peek(Token::BlockOpen) { - let context = if context.is_top_level_or_package() || context.is_type_block() { - context.clone() - } else { - context.override_control_context(true, ParserControlFlowContext { - breakable: true, - iteration: false, - }) - }; - let block = self.parse_block(context); - (Rc::new(Directive::Block(block)), true) - // IfStatement - } else if self.peek(Token::If) { - self.parse_if_statement(context) - // SwitchStatement - // `switch type` - } else if self.peek(Token::Switch) { - self.parse_switch_statement(context) - // DoStatement - } else if self.peek(Token::Do) { - self.parse_do_statement(context) - // WhileStatement - } else if self.peek(Token::While) { - self.parse_while_statement(context) - // ForStatement - // `for..in` - // `for each` - } else if self.peek(Token::For) { - self.parse_for_statement(context) - // WithStatement - } else if self.peek(Token::With) { - self.parse_with_statement(context) - // BreakStatement - } else if self.peek(Token::Break) { - self.parse_break_statement(context) - // ContinueStatement - } else if self.peek(Token::Continue) { - self.parse_continue_statement(context) - // ReturnStatement - } else if self.peek(Token::Return) { - self.parse_return_statement(context) - // ThrowStatement - } else if self.peek(Token::Throw) { - self.parse_throw_statement(context) - // TryStatement - } else if self.peek(Token::Try) { - self.parse_try_statement(context) - // `default xml namespace = expression` - } else if self.peek(Token::Default) { - self.parse_default_xml_namespace_statement() - // ExpressionStatement - } else { - self.mark_location(); - - // Store offset for patching error - let i = self.tokenizer.characters().index(); - - let exp = self.parse_expression(ParserExpressionContext { - allow_in: true, min_precedence: OperatorPrecedence::List, ..default() - }); - - // Patch error - if i == self.tokenizer.characters().index() { - self.patch_syntax_error(DiagnosticKind::ExpectingExpression, DiagnosticKind::ExpectingStatement, diagarg![self.token.0.clone()]); - } - - let semicolon = if exp.is_invalidated() { - self.next(); - true - } else { self.parse_semicolon() }; - (Rc::new(Directive::ExpressionStatement(ExpressionStatement { - location: self.pop_location(), - expression: exp, - })), semicolon) - } - } - - fn parse_statement_starting_with_identifier(&mut self, context: ParserDirectiveContext, id: (String, Location)) -> (Rc, bool) { - self.push_location(&id.1); - let id_location = id.1.clone(); - - // LabeledStatement - if self.consume(Token::Colon) { - let (substatement, semicolon) = self.parse_substatement(context.put_label(id.0.clone())); - let labeled = Rc::new(Directive::LabeledStatement(LabeledStatement { - location: self.pop_location(), - label: id.clone(), - substatement, - })); - return (labeled, semicolon); - } - - let mut exp: Rc; - - /* - // EmbedExpression - if self.peek(Token::BlockOpen) && id.0 == "embed" && self.previous_token.1.character_count() == "embed".len() { - exp = self.finish_embed_expression(id_location); - } else { - */ - { - let id = Rc::new(Expression::QualifiedIdentifier(QualifiedIdentifier { - location: id_location.clone(), - attribute: false, - qualifier: None, - id: QualifiedIdentifierIdentifier::Id(id.clone()), - })); - if self.peek(Token::ColonColon) { - self.push_location(&id_location.clone()); - let ql = self.pop_location(); - let id = self.finish_qualified_identifier(false, ql, id); - exp = Rc::new(Expression::QualifiedIdentifier(id)); - } else { - exp = id; - } - } - - exp = self.parse_subexpressions(exp, ParserExpressionContext { - allow_in: true, min_precedence: OperatorPrecedence::List, ..default() - }); - let semicolon = self.parse_semicolon(); - (Rc::new(Directive::ExpressionStatement(ExpressionStatement { - location: self.pop_location(), - expression: exp, - })), semicolon) - } - - fn parse_qualified_identifier_statement_or_normal_config(&mut self, context: ParserDirectiveContext, id: (String, Location), asdoc: Option>) -> (Rc, bool) { - self.push_location(&id.1); - let id_location = id.1.clone(); - let id = Rc::new(Expression::QualifiedIdentifier(QualifiedIdentifier { - location: id_location.clone(), - attribute: false, - qualifier: None, - id: QualifiedIdentifierIdentifier::Id(id.clone()), - })); - self.push_location(&id_location.clone()); - let ql = self.pop_location(); - let id = self.finish_qualified_identifier(false, ql, id); - let mut exp = Rc::new(Expression::QualifiedIdentifier(id)); - exp = self.parse_subexpressions(exp, ParserExpressionContext { - allow_in: true, min_precedence: OperatorPrecedence::List, ..default() - }); - - // Parse CONFIG::VAR_NAME - if let Some(result) = self.parse_opt_normal_config(&exp, asdoc.clone(), context.clone()) { - return result; - } - - let semicolon = self.parse_semicolon(); - (Rc::new(Directive::ExpressionStatement(ExpressionStatement { - location: self.pop_location(), - expression: exp, - })), semicolon) - } - - fn parse_opt_normal_config(&mut self, exp: &Rc, asdoc: Option>, context: ParserDirectiveContext) -> Option<(Rc, bool)> { - if self.peek_annotatable_directive_identifier_name() { - match exp.to_normal_configuration_identifier(self) { - Ok(Some((q, constant_name, metadata))) => { - self.push_location(&exp.location()); - let mut context = AnnotatableContext { - start_location: exp.location(), - asdoc: self.parse_asdoc().or(asdoc), - attributes: metadata, - context, - directive_context_keyword: None, - }; - self.parse_attribute_keywords_or_expressions(&mut context); - let (directive, semicolon) = self.parse_annotatable_directive(context); - return Some((Rc::new(Directive::NormalConfigurationDirective(NormalConfigurationDirective { - location: self.pop_location(), - namespace: q, - constant_name, - directive, - })), semicolon)); - }, - Ok(None) => {}, - Err(MetadataRefineError1(MetadataRefineError::Syntax, loc)) => { - self.add_syntax_error(&loc, DiagnosticKind::UnrecognizedMetadataSyntax, diagarg![]); - }, - } - } - if self.peek(Token::BlockOpen) { - if let Some((q, constant_name)) = exp.to_normal_configuration_identifier_no_metadata() { - self.push_location(&exp.location()); - let block = self.parse_block(context); - return Some((Rc::new(Directive::NormalConfigurationDirective(NormalConfigurationDirective { - location: self.pop_location(), - namespace: q, - constant_name, - directive: Rc::new(Directive::Block(block)), - })), true)); - } - } - None - } - - fn parse_block(&mut self, context: ParserDirectiveContext) -> Block { - self.mark_location(); - self.non_greedy_expect(Token::BlockOpen); - let mut directives = vec![]; - if !self.expecting_token_error { - let mut semicolon = false; - while !self.peek(Token::BlockClose) && !self.peek(Token::Eof) { - if !directives.is_empty() && !semicolon { - self.non_greedy_expect_virtual_semicolon(); - } - let (directive, semicolon_1) = self.parse_directive(context.clone()); - directives.push(directive); - semicolon = semicolon_1; - } - self.non_greedy_expect(Token::BlockClose); - } - Block { - location: self.pop_location(), - directives, - } - } - - fn parse_if_statement(&mut self, context: ParserDirectiveContext) -> (Rc, bool) { - let context = context.override_control_context(true, ParserControlFlowContext { - breakable: true, - iteration: false, - }); - self.mark_location(); - self.next(); - let mut test = self.create_invalidated_expression(&self.tokenizer.cursor_location()); - let mut consequent: Rc = self.create_invalidated_directive(&self.tokenizer.cursor_location()); - let mut alternative: Option> = None; - let semicolon; - self.non_greedy_expect(Token::ParenOpen); - if self.expecting_token_error { - semicolon = self.parse_semicolon(); - } else { - test = self.parse_expression(ParserExpressionContext { allow_in: true, min_precedence: OperatorPrecedence::List, ..default() }); - consequent = self.create_invalidated_directive(&self.tokenizer.cursor_location()); - self.non_greedy_expect(Token::ParenClose); - if self.expecting_token_error { - semicolon = self.parse_semicolon(); - } else { - let (consequent_1, semicolon_1) = self.parse_substatement(context.clone()); - consequent = consequent_1; - if self.peek(Token::Else) { - if !semicolon_1 { - self.non_greedy_expect_virtual_semicolon(); - } - self.next(); - let (alternative_2, semicolon_2) = self.parse_substatement(context.clone()); - alternative = Some(alternative_2); - semicolon = semicolon_2; - } else { - semicolon = semicolon_1; - } - } - } - (Rc::new(Directive::IfStatement(IfStatement { - location: self.pop_location(), - test, consequent, alternative, - })), semicolon) - } - - fn parse_switch_statement(&mut self, context: ParserDirectiveContext) -> (Rc, bool) { - self.mark_location(); - self.next(); - if self.peek_context_keyword("type") { - self.forbid_line_break_before_token(); - self.next(); - return self.parse_switch_type_statement(context); - } - let context = context.override_control_context(false, ParserControlFlowContext { - breakable: true, - iteration: false, - }); - let mut discriminant = self.create_invalidated_expression(&self.tokenizer.cursor_location()); - let mut cases: Vec = vec![]; - self.non_greedy_expect(Token::ParenOpen); - if !self.expecting_token_error { - discriminant = self.parse_expression(ParserExpressionContext { allow_in: true, min_precedence: OperatorPrecedence::List, ..default() }); - self.non_greedy_expect(Token::ParenClose); - if !self.expecting_token_error { - self.non_greedy_expect(Token::BlockOpen); - if !self.expecting_token_error { - cases = self.parse_case_elements(context); - self.non_greedy_expect(Token::BlockClose); - } - } - } - (Rc::new(Directive::SwitchStatement(SwitchStatement { - location: self.pop_location(), - discriminant, cases, - })), true) - } - - fn parse_case_elements(&mut self, context: ParserDirectiveContext) -> Vec { - let mut cases = vec![]; - let mut semicolon = false; - while !self.peek(Token::BlockClose) { - if !cases.is_empty() && !semicolon { - self.non_greedy_expect_virtual_semicolon(); - } - if !(self.peek(Token::Case) || self.peek(Token::Default)) { - break; - } - self.mark_location(); - let mut labels = vec![]; - loop { - if self.peek(Token::Case) { - self.mark_location(); - self.next(); - let exp = self.parse_expression(ParserExpressionContext { - allow_in: true, - min_precedence: OperatorPrecedence::List, - ..default() - }); - self.non_greedy_expect(Token::Colon); - labels.push(CaseLabel::Case((exp, self.pop_location()))); - } else if self.peek(Token::Default) { - self.mark_location(); - self.next(); - self.non_greedy_expect(Token::Colon); - labels.push(CaseLabel::Default(self.pop_location())); - } else { - break; - } - } - let mut directives = vec![]; - semicolon = false; - while !(self.peek(Token::BlockClose) || self.peek(Token::Case) || self.peek(Token::Default)) { - if !directives.is_empty() && !semicolon { - self.non_greedy_expect_virtual_semicolon(); - } - let (directive, semicolon_1) = self.parse_directive(context.clone()); - directives.push(directive); - semicolon = semicolon_1; - } - cases.push(Case { - location: self.pop_location(), - labels, - directives, - }); - } - cases - } - - fn parse_switch_type_statement(&mut self, context: ParserDirectiveContext) -> (Rc, bool) { - let context = context.override_control_context(true, ParserControlFlowContext { - breakable: true, - iteration: false, - }); - let mut discriminant = self.create_invalidated_expression(&self.tokenizer.cursor_location()); - let mut cases: Vec = vec![]; - self.non_greedy_expect(Token::ParenOpen); - if !self.expecting_token_error { - discriminant = self.parse_expression(ParserExpressionContext { allow_in: true, min_precedence: OperatorPrecedence::List, ..default() }); - self.non_greedy_expect(Token::ParenClose); - if !self.expecting_token_error { - self.non_greedy_expect(Token::BlockOpen); - if !self.expecting_token_error { - cases = self.parse_type_case_elements(context); - self.non_greedy_expect(Token::BlockClose); - } - } - } - (Rc::new(Directive::SwitchTypeStatement(SwitchTypeStatement { - location: self.pop_location(), - discriminant, cases, - })), true) - } - - fn parse_type_case_elements(&mut self, context: ParserDirectiveContext) -> Vec { - let mut cases = vec![]; - while !self.peek(Token::BlockClose) && !self.peek(Token::Eof) { - if self.peek(Token::Default) { - self.mark_location(); - self.next(); - let block = Rc::new(self.parse_block(context.clone())); - cases.push(TypeCase { - location: self.pop_location(), - parameter: None, - block, - }); - } else { - self.mark_location(); - self.non_greedy_expect(Token::Case); - if !self.expecting_token_error { - self.non_greedy_expect(Token::ParenOpen); - if !self.expecting_token_error { - let parameter = Some(self.parse_typed_destructuring()); - self.non_greedy_expect(Token::ParenClose); - if !self.expecting_token_error { - let block = Rc::new(self.parse_block(context.clone())); - cases.push(TypeCase { - location: self.pop_location(), - parameter, - block, - }); - } - } - } - } - } - cases - } - - fn parse_do_statement(&mut self, context: ParserDirectiveContext) -> (Rc, bool) { - let context = context.override_control_context(false, ParserControlFlowContext { - breakable: true, - iteration: true, - }); - self.mark_location(); - self.next(); - - // Body - let (body, semicolon_1) = self.parse_substatement(context); - if !semicolon_1 { - self.non_greedy_expect_virtual_semicolon(); - } - - let mut test = self.create_invalidated_expression(&self.tokenizer.cursor_location()); - self.non_greedy_expect(Token::While); - if !self.expecting_token_error { - test = self.create_invalidated_expression(&self.tokenizer.cursor_location()); - self.non_greedy_expect(Token::ParenOpen); - if !self.expecting_token_error { - test = self.parse_expression(ParserExpressionContext { allow_in: true, min_precedence: OperatorPrecedence::List, ..default() }); - self.non_greedy_expect(Token::ParenClose); - } - } - - let semicolon = self.parse_semicolon(); - (Rc::new(Directive::DoStatement(DoStatement { - location: self.pop_location(), - body, test, - })), semicolon) - } - - fn parse_while_statement(&mut self, context: ParserDirectiveContext) -> (Rc, bool) { - let context = context.override_control_context(false, ParserControlFlowContext { - breakable: true, - iteration: true, - }); - self.mark_location(); - self.next(); - - // Test - let mut test = self.create_invalidated_expression(&self.tokenizer.cursor_location()); - let mut body = self.create_invalidated_directive(&self.tokenizer.cursor_location()); - let semicolon: bool; - self.non_greedy_expect(Token::ParenOpen); - if !self.expecting_token_error { - test = self.parse_expression(ParserExpressionContext { allow_in: true, min_precedence: OperatorPrecedence::List, ..default() }); - body = self.create_invalidated_directive(&self.tokenizer.cursor_location()); - self.non_greedy_expect(Token::ParenClose); - if !self.expecting_token_error { - let (body_1, semicolon_1) = self.parse_substatement(context); - body = body_1; - semicolon = semicolon_1; - } else { - semicolon = self.parse_semicolon(); - } - } else { - semicolon = self.parse_semicolon(); - } - - (Rc::new(Directive::WhileStatement(WhileStatement { - location: self.pop_location(), - test, body, - })), semicolon) - } - - /// Parses `for`, `for..in` or `for each`. - fn parse_for_statement(&mut self, context: ParserDirectiveContext) -> (Rc, bool) { - let context = context.override_control_context(false, ParserControlFlowContext { - breakable: true, - iteration: true, - }); - self.mark_location(); - self.next(); - - // `for each` - if self.peek_context_keyword("each") { - self.forbid_line_break_before_token(); - self.next(); - return self.parse_for_each_statement(context); - } - - self.non_greedy_expect(Token::ParenOpen); - if self.expecting_token_error { - let body = self.create_invalidated_directive(&self.tokenizer.cursor_location()); - let semicolon = self.parse_semicolon(); - return (Rc::new(Directive::ForStatement(ForStatement { - location: self.pop_location(), - init: None, test: None, update: None, body, - })), semicolon); - } - - let init_variable = if self.peek(Token::Var) || self.peek(Token::Const) { - Some(self.parse_simple_variable_definition(false)) - } else { - None - }; - - if init_variable.is_some() && self.consume(Token::In) { - return self.parse_for_in_statement_with_left_variable(context, init_variable.unwrap()); - } - - let mut init_exp = if init_variable.is_none() && !self.peek(Token::Semicolon) { - self.parse_opt_expression(ParserExpressionContext { - allow_in: false, - min_precedence: OperatorPrecedence::Postfix, - ..default() - }) - } else { - None - }; - - if init_exp.is_some() && self.consume(Token::In) { - return self.parse_for_in_statement_with_left_exp(context, init_exp.unwrap()); - } - - if init_exp.is_none() && init_variable.is_none() && !self.peek(Token::Semicolon) { - init_exp = Some(self.parse_expression(ParserExpressionContext { - allow_in: false, min_precedence: OperatorPrecedence::List, ..default() - })); - } else if let Some(exp) = init_exp.as_ref() { - init_exp = Some(self.parse_subexpressions(exp.clone(), ParserExpressionContext { - allow_in: false, min_precedence: OperatorPrecedence::List, ..default() - })); - } - - let init = if let Some(exp) = init_exp.as_ref() { - Some(ForInitializer::Expression(exp.clone())) - } else if let Some(variable) = init_variable.as_ref() { - Some(ForInitializer::VariableDefinition(Rc::new(variable.clone()))) - } else { - None - }; - - self.non_greedy_expect(Token::Semicolon); - let test = if self.peek(Token::Semicolon) { - None - } else { - Some(self.parse_expression(ParserExpressionContext { - allow_in: true, min_precedence: OperatorPrecedence::List, ..default() - })) - }; - self.non_greedy_expect(Token::Semicolon); - let update = if self.peek(Token::ParenClose) { - None - } else { - Some(self.parse_expression(ParserExpressionContext { - allow_in: true, min_precedence: OperatorPrecedence::List, ..default() - })) - }; - self.non_greedy_expect(Token::ParenClose); - - // Body - let (body, semicolon) = self.parse_substatement(context); - - (Rc::new(Directive::ForStatement(ForStatement { - location: self.pop_location(), - init, test, update, body, - })), semicolon) - } - - fn parse_for_each_statement(&mut self, context: ParserDirectiveContext) -> (Rc, bool) { - self.non_greedy_expect(Token::ParenOpen); - if self.expecting_token_error { - let left = ForInBinding::Expression(self.create_invalidated_expression(&self.tokenizer.cursor_location())); - let right = self.create_invalidated_expression(&self.tokenizer.cursor_location()); - let body = self.create_invalidated_directive(&self.tokenizer.cursor_location()); - let semicolon = self.parse_semicolon(); - return (Rc::new(Directive::ForInStatement(ForInStatement { - location: self.pop_location(), - each: true, left, right, body, - })), semicolon); - } - - let left = if self.peek(Token::Var) || self.peek(Token::Const) { - self.mark_location(); - let kind = (if self.peek(Token::Var) { VariableDefinitionKind::Var } else { VariableDefinitionKind::Const }, self.token_location()); - self.next(); - let binding = self.parse_variable_binding(false); - if let Some(init) = &binding.initializer { - self.add_syntax_error(&init.location(), DiagnosticKind::IllegalForInInitializer, vec![]); - } - ForInBinding::VariableDefinition(Rc::new(SimpleVariableDefinition { - location: self.pop_location(), - kind, - bindings: vec![Rc::new(binding)], - })) - } else { - ForInBinding::Expression(self.parse_expression(ParserExpressionContext { - allow_in: false, min_precedence: OperatorPrecedence::Postfix, ..default() - })) - }; - let mut right = self.create_invalidated_expression(&self.tokenizer.cursor_location()); - self.non_greedy_expect(Token::In); - if !self.expecting_token_error { - right = self.parse_expression(ParserExpressionContext { - allow_in: true, min_precedence: OperatorPrecedence::List, ..default() - }); - } - self.non_greedy_expect(Token::ParenClose); - - // Body - let (body, semicolon) = self.parse_substatement(context); - - (Rc::new(Directive::ForInStatement(ForInStatement { - location: self.pop_location(), - each: true, left, right, body, - })), semicolon) - } - - fn parse_for_in_statement_with_left_variable(&mut self, context: ParserDirectiveContext, left: SimpleVariableDefinition) -> (Rc, bool) { - let variable_binding = left.bindings[0].clone(); - - if let Some(init) = &variable_binding.initializer { - self.add_syntax_error(&init.location(), DiagnosticKind::IllegalForInInitializer, vec![]); - } - - if left.bindings.len() > 1 { - self.add_syntax_error(&left.kind.1.clone(), DiagnosticKind::MultipleForInBindings, vec![]); - } - - let right = self.parse_expression(ParserExpressionContext { - allow_in: true, min_precedence: OperatorPrecedence::List, ..default() - }); - self.non_greedy_expect(Token::ParenClose); - - // Body - let (body, semicolon) = self.parse_substatement(context); - - (Rc::new(Directive::ForInStatement(ForInStatement { - location: self.pop_location(), - each: false, left: ForInBinding::VariableDefinition(Rc::new(left)), right, body, - })), semicolon) - } - - fn parse_for_in_statement_with_left_exp(&mut self, context: ParserDirectiveContext, left: Rc) -> (Rc, bool) { - let right = self.parse_expression(ParserExpressionContext { - allow_in: true, min_precedence: OperatorPrecedence::List, ..default() - }); - self.non_greedy_expect(Token::ParenClose); - - // Body - let (body, semicolon) = self.parse_substatement(context); - - (Rc::new(Directive::ForInStatement(ForInStatement { - location: self.pop_location(), - each: false, left: ForInBinding::Expression(left), right, body, - })), semicolon) - } - - fn parse_simple_variable_definition(&mut self, allow_in: bool) -> SimpleVariableDefinition { - self.mark_location(); - let kind: VariableDefinitionKind; - let kind_location = self.token_location(); - if self.consume(Token::Const) { - kind = VariableDefinitionKind::Const; - } else { - self.non_greedy_expect(Token::Var); - kind = VariableDefinitionKind::Var; - } - let mut bindings = vec![Rc::new(self.parse_variable_binding(allow_in))]; - while self.consume(Token::Comma) { - bindings.push(Rc::new(self.parse_variable_binding(allow_in))); - } - SimpleVariableDefinition { - location: self.pop_location(), - kind: (kind, kind_location), - bindings, - } - } - - fn parse_with_statement(&mut self, context: ParserDirectiveContext) -> (Rc, bool) { - let context = context.override_control_context(true, ParserControlFlowContext { - breakable: true, - iteration: false, - }); - self.mark_location(); - self.next(); - - let mut object = self.create_invalidated_expression(&self.tokenizer.cursor_location()); - self.non_greedy_expect(Token::ParenOpen); - if !self.expecting_token_error { - object = self.parse_expression(ParserExpressionContext { allow_in: true, min_precedence: OperatorPrecedence::List, ..default() }); - } - self.non_greedy_expect(Token::ParenClose); - - // Body - let (body, semicolon) = self.parse_substatement(context); - - (Rc::new(Directive::WithStatement(WithStatement { - location: self.pop_location(), - object, body, - })), semicolon) - } - - fn parse_break_statement(&mut self, context: ParserDirectiveContext) -> (Rc, bool) { - self.mark_location(); - self.next(); - - let label = if self.previous_token.1.line_break(&self.token.1) { None } else { self.consume_identifier(false) }; - let label_location = label.clone().map(|label| label.1.clone()); - let label = label.map(|label| label.0.clone()); - - let semicolon = self.parse_semicolon(); - - let node = Rc::new(Directive::BreakStatement(BreakStatement { - location: self.pop_location(), - label: label.clone().map(|l| (l.clone(), label_location.clone().unwrap())), - })); - - if label.is_some() && !context.is_label_defined(label.clone().unwrap()) { - self.add_syntax_error(&label_location.unwrap(), DiagnosticKind::UndefinedLabel, diagarg![label.clone().unwrap()]); - } else if !context.is_break_allowed(label) { - self.add_syntax_error(&node.location(), DiagnosticKind::IllegalBreak, vec![]); - } - - (node, semicolon) - } - - fn parse_continue_statement(&mut self, context: ParserDirectiveContext) -> (Rc, bool) { - self.mark_location(); - self.next(); - - let label = if self.previous_token.1.line_break(&self.token.1) { None } else { self.consume_identifier(false) }; - let label_location = label.clone().map(|label| label.1.clone()); - let label = label.map(|label| label.0.clone()); - - let semicolon = self.parse_semicolon(); - - let node = Rc::new(Directive::ContinueStatement(ContinueStatement { - location: self.pop_location(), - label: label.clone().map(|l| (l.clone(), label_location.clone().unwrap())), - })); - - if label.is_some() && !context.is_label_defined(label.clone().unwrap()) { - self.add_syntax_error(&label_location.unwrap(), DiagnosticKind::UndefinedLabel, diagarg![label.clone().unwrap()]); - } else if !context.is_continue_allowed(label) { - self.add_syntax_error(&node.location(), DiagnosticKind::IllegalContinue, vec![]); - } - - (node, semicolon) - } - - fn parse_return_statement(&mut self, _context: ParserDirectiveContext) -> (Rc, bool) { - self.mark_location(); - self.next(); - - let expression = if self.previous_token.1.line_break(&self.token.1) { None } else { - self.parse_opt_expression(ParserExpressionContext { - allow_in: true, - min_precedence: OperatorPrecedence::List, - ..default() - }) - }; - - let semicolon = self.parse_semicolon(); - - let node = Rc::new(Directive::ReturnStatement(ReturnStatement { - location: self.pop_location(), - expression, - })); - - (node, semicolon) - } - - fn parse_throw_statement(&mut self, _context: ParserDirectiveContext) -> (Rc, bool) { - self.mark_location(); - self.next(); - - let line_break = self.previous_token.1.line_break(&self.token.1); - - let expression = self.parse_expression(ParserExpressionContext { - allow_in: true, - min_precedence: OperatorPrecedence::List, - ..default() - }); - - if line_break { - self.add_syntax_error(&expression.location(), DiagnosticKind::ExpressionMustNotFollowLineBreak, vec![]); - } - - let semicolon = self.parse_semicolon(); - - let node = Rc::new(Directive::ThrowStatement(ThrowStatement { - location: self.pop_location(), - expression, - })); - - (node, semicolon) - } - - fn parse_try_statement(&mut self, context: ParserDirectiveContext) -> (Rc, bool) { - self.mark_location(); - self.next(); - let context = context.clone_control(); - let block = Rc::new(self.parse_block(context.clone())); - let mut catch_clauses: Vec = vec![]; - let mut finally_clause: Option = None; - let mut found_catch = false; - loop { - if self.peek(Token::Catch) { - found_catch = true; - self.mark_location(); - self.next(); - self.non_greedy_expect(Token::ParenOpen); - if !self.expecting_token_error { - let parameter = self.parse_typed_destructuring(); - self.non_greedy_expect(Token::ParenClose); - if !self.expecting_token_error { - let block = Rc::new(self.parse_block(context.clone())); - catch_clauses.push(CatchClause { - location: self.pop_location(), - parameter, - block, - }); - } - } - } else if self.peek(Token::Finally) { - self.mark_location(); - self.next(); - let block = Rc::new(self.parse_block(context.clone())); - finally_clause = Some(FinallyClause { - location: self.pop_location(), - block, - }); - break; - } else { - break; - } - } - if !found_catch && finally_clause.is_none() { - self.non_greedy_expect(Token::Catch); - } - - let node = Rc::new(Directive::TryStatement(TryStatement { - location: self.pop_location(), - block, catch_clauses, finally_clause, - })); - - (node, true) - } - - fn parse_default_xml_namespace_statement(&mut self) -> (Rc, bool) { - self.mark_location(); - self.next(); - - let mut expression = self.create_invalidated_expression(&self.tokenizer.cursor_location()); - self.forbid_line_break_before_token(); - self.non_greedy_expect_context_keyword("xml"); - if !self.expecting_token_error { - expression = self.create_invalidated_expression(&self.tokenizer.cursor_location()); - self.forbid_line_break_before_token(); - self.non_greedy_expect_context_keyword("namespace"); - if !self.expecting_token_error { - expression = self.create_invalidated_expression(&self.tokenizer.cursor_location()); - self.non_greedy_expect(Token::Assign); - - if !self.expecting_token_error { - expression = self.parse_expression(ParserExpressionContext { - allow_in: true, - allow_assignment: false, - min_precedence: OperatorPrecedence::AssignmentAndOther, - ..default() - }); - } - } - } - - let semicolon = self.parse_semicolon(); - - let node = Rc::new(Directive::DefaultXmlNamespaceStatement(DefaultXmlNamespaceStatement { - location: self.pop_location(), - right: expression, - })); - - (node, semicolon) - } - - fn forbid_line_break_before_token(&mut self) { - if self.previous_token.1.line_break(&self.token.1) { - self.add_syntax_error(&self.token.1.clone(), DiagnosticKind::TokenMustNotFollowLineBreak, vec![]); - } - } - - fn parse_directive(&mut self, context: ParserDirectiveContext) -> (Rc, bool) { - let asdoc: Option> = if self.peek(Token::SquareOpen) { None } else { self.parse_asdoc() }; - // ConfigurationDirective or Statement - if let Token::Identifier(id) = &self.token.0 { - let id = (id.clone(), self.token_location()); - self.next(); - - if id.0 == "include" && id.1.character_count() == "include".len() && matches!(self.token.0, Token::String(_)) && !self.previous_token.1.line_break(&self.token.1) { - return self.parse_include_directive(context, id.1); - } - - if self.peek(Token::BlockOpen) && &id.0 == "configuration" && id.1.character_count() == "configuration".len() { - return self.parse_configuration_directive(context, id.1); - } - - // If there is a line break or offending token is "::", - // do not proceed into parsing an expression attribute or annotatble directive. - let eligible_attribute_or_directive - = !self.previous_token.1.line_break(&self.token.1) - && !(matches!(self.token.0, Token::ColonColon)); - - if eligible_attribute_or_directive && (self.peek_annotatable_directive_identifier_name() || self.lookbehind_is_annotatable_directive_identifier_name()) { - let mut context1: AnnotatableContext; - - if ["enum", "type", "namespace"].contains(&id.0.as_ref()) - && id.1.character_count() == id.0.len() - && self.token.0.is_identifier_name() { - context1 = AnnotatableContext { - start_location: id.1.clone(), - asdoc, - attributes: vec![], - context: context.clone(), - directive_context_keyword: Some(id.clone()), - }; - // self.parse_attribute_keywords_or_expressions(&mut context); - } else { - let mut first_attr_expr = self.parse_expression_starting_with_identifier(id); - first_attr_expr = self.parse_subexpressions(first_attr_expr, ParserExpressionContext { - allow_in: true, min_precedence: OperatorPrecedence::List, ..default() - }); - - // Do not proceed into parsing an annotatable directive - // if there is a line break after an expression attribute, - // or if the offending token is not an identifier name, - // or if the expression attribute is not a valid access modifier. - if !first_attr_expr.valid_access_modifier() || self.previous_token.1.line_break(&self.token.1) || !(matches!(self.token.0, Token::Identifier(_)) || self.token.0.is_reserved_word()) { - self.push_location(&first_attr_expr.location()); - - // Parse CONFIG::VAR_NAME - if let Some(result) = self.parse_opt_normal_config(&first_attr_expr, asdoc.clone(), context.clone()) { - return result; - } - - let semicolon = self.parse_semicolon(); - return (Rc::new(Directive::ExpressionStatement(ExpressionStatement { - location: self.pop_location(), - expression: first_attr_expr, - })), semicolon); - } - - let first_attr = self.keyword_or_expression_attribute_from_expression(&first_attr_expr); - - context1 = AnnotatableContext { - start_location: first_attr.location(), - asdoc, - attributes: vec![first_attr], - context: context.clone(), - directive_context_keyword: None, - }; - self.parse_attribute_keywords_or_expressions(&mut context1); - } - return self.parse_annotatable_directive(context1); - } else if self.peek(Token::ColonColon) { - self.parse_qualified_identifier_statement_or_normal_config(context, id, asdoc) - } else { - self.parse_statement_starting_with_identifier(context, id) - } - } else if self.peek(Token::Import) { - self.parse_import_directive_or_expression_statement(context) - } else if self.peek(Token::SquareOpen) { - self.mark_location(); - let exp = self.parse_expression(ParserExpressionContext { - allow_in: true, min_precedence: OperatorPrecedence::List, ..default() - }); - if self.peek_annotatable_directive_identifier_name() { - match exp.to_metadata(self) { - Ok(Some(metadata)) => { - let mut context = AnnotatableContext { - start_location: self.pop_location(), - asdoc: self.parse_asdoc(), - attributes: metadata, - context: context.clone(), - directive_context_keyword: None, - }; - self.parse_attribute_keywords_or_expressions(&mut context); - return self.parse_annotatable_directive(context); - }, - Ok(None) => {}, - Err(MetadataRefineError1(MetadataRefineError::Syntax, loc)) => { - self.add_syntax_error(&loc, DiagnosticKind::UnrecognizedMetadataSyntax, diagarg![]); - }, - } - } - let semicolon = self.parse_semicolon(); - (Rc::new(Directive::ExpressionStatement(ExpressionStatement { - location: self.pop_location(), - expression: exp, - })), semicolon) - } else if self.peek(Token::Public) || self.peek(Token::Private) || self.peek(Token::Protected) - || self.peek(Token::Internal) || self.peek(Token::Var) || self.peek(Token::Const) - || self.peek(Token::Function) || self.peek(Token::Class) || self.peek(Token::Interface) { - let is_public = self.peek(Token::Public); - let rns = self.parse_opt_reserved_namespace(); - let mut attributes: Vec = vec![]; - if let Some(rns) = rns { - // The public += ns.*; directive - if self.peek(Token::AddAssign) && is_public { - return self.parse_package_concat_directive(&rns.location(), context); - } - - // Do not proceed into parsing an annotatable directive - // if there is a "::" token. - if matches!(self.token.0, Token::ColonColon) { - self.push_location(&rns.location()); - let rns = Rc::new(Expression::QualifiedIdentifier(self.finish_qualified_identifier(false, rns.location(), rns))); - let rns = self.parse_subexpressions(rns, ParserExpressionContext { - allow_in: true, min_precedence: OperatorPrecedence::List, ..default() - }); - let semicolon = self.parse_semicolon(); - return (Rc::new(Directive::ExpressionStatement(ExpressionStatement { - location: self.pop_location(), - expression: rns, - })), semicolon); - } - attributes.push(rns.to_reserved_namespace_attribute().unwrap()); - } - let mut context = AnnotatableContext { - start_location: self.token_location(), - asdoc, - attributes, - context: context.clone(), - directive_context_keyword: None, - }; - self.parse_attribute_keywords_or_expressions(&mut context); - return self.parse_annotatable_directive(context); - } else if self.peek(Token::Use) { - self.parse_use_namespace_directive() - } else { - let i = self.tokenizer.characters().index(); - let r = self.parse_statement(context); - if i == self.tokenizer.characters().index() { - self.patch_syntax_error(DiagnosticKind::ExpectingStatement, DiagnosticKind::ExpectingDirective, diagarg![self.token.0.clone()]); - } - r - } - } - - fn parse_directives(&mut self, context: ParserDirectiveContext) -> Vec> { - let mut directives = vec![]; - let mut semicolon = false; - while !self.peek(Token::Eof) { - if !directives.is_empty() && !semicolon { - self.non_greedy_expect_virtual_semicolon(); - } - let (directive, semicolon_1) = self.parse_directive(context.clone()); - directives.push(directive); - semicolon = semicolon_1; - } - directives - } - - fn parse_expression_attribute(&mut self, id: &(String, Location)) -> Rc { - let mut result = Rc::new(Expression::QualifiedIdentifier(QualifiedIdentifier { - location: id.1.clone(), - attribute: false, - qualifier: None, - id: QualifiedIdentifierIdentifier::Id(id.clone()), - })); - loop { - if self.peek(Token::Dot) { - self.push_location(&result.location()); - self.next(); - let id = self.parse_qualified_identifier(); - result = Rc::new(Expression::Member(MemberExpression { - location: self.pop_location(), - base: result, identifier: id - })); - } else if self.consume(Token::SquareOpen) { - self.push_location(&result.location()); - let key = self.parse_expression(ParserExpressionContext { allow_in: true, min_precedence: OperatorPrecedence::List, ..default() }); - self.non_greedy_expect(Token::SquareClose); - result = Rc::new(Expression::ComputedMember(ComputedMemberExpression { - base: result, asdoc: None, key, location: self.pop_location() - })); - } else { - break; - } - } - result - } - - fn report_modifier_errors(&self, context: &AnnotatableContext) { - let mut i = 0usize; - while i < context.attributes.len() { - let a = &context.attributes[i]; - if Attribute::has(&context.attributes[..i], &a) { - self.add_syntax_error(&a.location(), DiagnosticKind::DuplicateAttribute, diagarg![]); - } - if Attribute::is_duplicate_access_modifier(&context.attributes[..i], &a) { - self.add_syntax_error(&a.location(), DiagnosticKind::DuplicateAccessModifier, diagarg![]); - } - i += 1; - } - } - - fn parse_annotatable_directive(&mut self, context: AnnotatableContext) -> (Rc, bool) { - if self.peek(Token::Var) || self.peek(Token::Const) { - self.report_modifier_errors(&context); - self.parse_variable_definition(context) - } else if self.consume(Token::Function) { - self.report_modifier_errors(&context); - self.parse_function_definition(context) - } else if self.consume(Token::Class) { - self.report_modifier_errors(&context); - self.parse_class_definition(context) - } else if context.has_directive_context_keyword("enum") { - self.report_modifier_errors(&context); - self.parse_enum_definition(context) - } else if context.has_directive_context_keyword("namespace") { - self.report_modifier_errors(&context); - self.parse_namespace_definition(context) - } else if self.consume(Token::Interface) { - self.report_modifier_errors(&context); - self.parse_interface_definition(context) - } else if context.has_directive_context_keyword("type") { - self.report_modifier_errors(&context); - self.parse_type_definition(context) - } else { - // In case there is a series of inline modifiers, - // report semicolon error between each. - let mut i = 0usize; - let mut error = false; - while i < context.attributes.len() { - if !context.attributes[i].is_metadata() { - let loc1 = context.attributes[i].location(); - if i + 1 < context.attributes.len() { - let loc2 = context.attributes[i + 1].location(); - if !loc1.line_break(&loc2) { - self.add_syntax_error(&loc2, DiagnosticKind::ExpectingEitherSemicolonOrNewLineHere, vec![]); - error = true; - } - } - } - i += 1; - } - - if !error { - self.add_syntax_error(&self.token_location(), DiagnosticKind::ExpectingDirectiveKeyword, diagarg![self.token.0.clone()]); - } - self.push_location(&context.start_location); - let loc = self.pop_location(); - (self.create_invalidated_directive(&loc), true) - } - } - - pub(crate) fn refine_metadata(&self, exp: &Rc, asdoc: Option>) -> Result, MetadataRefineError> { - if let Expression::Call(CallExpression { base, arguments, .. }) = exp.as_ref() { - let Ok(name) = self.refine_metadata_name(base) else { - return Err(MetadataRefineError::Syntax); - }; - Ok(Rc::new(Metadata { - location: exp.location(), - asdoc, - name, - entries: Some(self.refine_metadata_entries(arguments)?), - })) - } else { - if let Ok(name) = self.refine_metadata_name(exp) { - Ok(Rc::new(Metadata { - location: exp.location(), - asdoc, - name, - entries: None, - })) - } else { - Err(MetadataRefineError::Syntax) - } - } - } - - fn refine_metadata_name(&self, exp: &Rc) -> Result<(String, Location), MetadataRefineError> { - if let Expression::QualifiedIdentifier(id) = exp.as_ref() { - if id.attribute { - return Err(MetadataRefineError::Syntax); - } - let qual = id.qualifier.as_ref().and_then(|q| q.to_identifier_name().map(|n| n.0)); - if id.qualifier.is_some() && qual.is_none() { - return Err(MetadataRefineError::Syntax); - } - if let QualifiedIdentifierIdentifier::Id((s, _)) = &id.id { - if s == "*" { Err(MetadataRefineError::Syntax) } else { Ok((if let Some(q) = qual { format!("{q}::{s}") } else { s.to_string() }, exp.location())) } - } else { - Err(MetadataRefineError::Syntax) - } - } else { - Err(MetadataRefineError::Syntax) - } - } - - fn refine_metadata_entries(&self, list: &Vec>) -> Result>, MetadataRefineError> { - let mut r = Vec::>::new(); - for entry in list { - r.push(self.refine_metadata_entry(&entry)?); - } - Ok(r) - } - - fn refine_metadata_entry(&self, exp: &Rc) -> Result, MetadataRefineError> { - match exp.as_ref() { - Expression::Assignment(AssignmentExpression { compound, left, right, location }) => { - if compound.is_some() { - return Err(MetadataRefineError::Syntax); - } - let key = self.refine_metadata_name(left)?; - if matches!(right.as_ref(), Expression::QualifiedIdentifier(_)) { - return Err(MetadataRefineError::Syntax); - } - let value = self.refine_metadata_value(right)?; - Ok(Rc::new(MetadataEntry { - location: location.clone(), - key: Some(key), - value: Rc::new(value), - })) - }, - _ => { - let value = self.refine_metadata_value(exp)?; - Ok(Rc::new(MetadataEntry { - location: exp.location(), - key: None, - value: Rc::new(value), - })) - }, - } - } - - fn refine_metadata_value(&self, exp: &Rc) -> Result { - match exp.as_ref() { - Expression::QualifiedIdentifier(_) => { - let name = self.refine_metadata_name(&exp)?; - Ok(MetadataValue::IdentifierString(name)) - }, - Expression::StringLiteral(StringLiteral { value, .. }) => Ok(MetadataValue::String((value.clone(), exp.location()))), - _ => Err(MetadataRefineError::Syntax), - } - } - - fn parse_package_concat_directive(&mut self, start: &Location, context: ParserDirectiveContext) -> (Rc, bool) { - self.push_location(start); - self.next(); - let mut package_name: Vec<(String, Location)> = vec![self.expect_identifier(false)]; - let mut import_specifier = ImportSpecifier::Wildcard(self.token_location()); - - if !self.peek(Token::Dot) { - self.non_greedy_expect(Token::Dot); - } - - while self.consume(Token::Dot) { - if self.peek(Token::Times) { - import_specifier = ImportSpecifier::Wildcard(self.token_location()); - self.next(); - break; - } else if self.peek(Token::Power) { - import_specifier = ImportSpecifier::Recursive(self.token_location()); - self.next(); - break; - } else { - let id1 = self.expect_identifier(true); - if !self.peek(Token::Dot) { - import_specifier = ImportSpecifier::Identifier(id1.clone()); - break; - } else { - package_name.push(id1.clone()); - } - } - } - - let semicolon = self.parse_semicolon(); - - let node = Rc::new(Directive::PackageConcatDirective(PackageConcatDirective { - location: self.pop_location(), - package_name, - import_specifier, - })); - - if !(matches!(context, ParserDirectiveContext::PackageBlock)) { - self.add_syntax_error(&node.location(), DiagnosticKind::UnexpectedDirective, vec![]); - } - - (node, semicolon) - } - - fn parse_import_directive_or_expression_statement(&mut self, _context: ParserDirectiveContext) -> (Rc, bool) { - self.mark_location(); - self.next(); - if self.consume(Token::Dot) { - self.duplicate_location(); - self.non_greedy_expect_context_keyword("meta"); - let mut expression = Rc::new(Expression::ImportMeta(ImportMeta { - location: self.pop_location(), - })); - expression = self.parse_subexpressions(expression, ParserExpressionContext { - allow_in: true, - min_precedence: OperatorPrecedence::List, - ..default() - }); - let semicolon = self.parse_semicolon(); - (Rc::new(Directive::ExpressionStatement(ExpressionStatement { - location: self.pop_location(), - expression, - })), semicolon) - } else { - let mut alias: Option<(String, Location)> = None; - let mut package_name: Vec<(String, Location)> = vec![]; - let mut import_specifier = ImportSpecifier::Wildcard(self.token_location()); - let id1 = self.expect_identifier(false); - if self.consume(Token::Assign) { - alias = Some(id1.clone()); - package_name.push(self.expect_identifier(false)); - } else { - package_name.push(id1); - } - - if !self.peek(Token::Dot) { - self.non_greedy_expect(Token::Dot); - } - - while self.consume(Token::Dot) { - if self.peek(Token::Times) { - import_specifier = ImportSpecifier::Wildcard(self.token_location()); - self.next(); - break; - } else if self.peek(Token::Power) { - import_specifier = ImportSpecifier::Recursive(self.token_location()); - self.next(); - break; - } else { - let id1 = self.expect_identifier(true); - if !self.peek(Token::Dot) { - import_specifier = ImportSpecifier::Identifier(id1.clone()); - break; - } else { - package_name.push(id1.clone()); - } - } - } - - let semicolon = self.parse_semicolon(); - - let node = Rc::new(Directive::ImportDirective(ImportDirective { - location: self.pop_location(), - alias, - package_name, - import_specifier, - })); - - (node, semicolon) - } - } - - fn parse_include_directive(&mut self, context: ParserDirectiveContext, start: Location) -> (Rc, bool) { - self.push_location(&start); - let source_path_location = self.token_location(); - let Token::String(source) = &self.token.0.clone() else { - panic!(); - }; - let source = source.clone(); - self.next(); - let semicolon = self.parse_semicolon(); - - let nested_compilation_unit: Rc; - - // Select origin file path - let origin_file_path = if let Some(file_path) = self.tokenizer.compilation_unit().file_path.clone() { - Some(file_path) - } else { - std::env::current_dir().ok().map(|d| d.to_string_lossy().into_owned()) - }; - - // Resolve source - if let Some(origin_file_path) = origin_file_path { - let sub_file_path = file_paths::FlexPath::from_n_native([origin_file_path.as_ref(), "..", source.as_ref()]).to_string_with_flex_separator(); - if self.tokenizer.compilation_unit().include_directive_is_circular(&sub_file_path) { - self.add_syntax_error(&source_path_location.clone(), DiagnosticKind::CircularIncludeDirective, vec![]); - - // Use a placeholder compilation unit - nested_compilation_unit = CompilationUnit::new(None, "".into()); - } else { - if let Ok(content) = std::fs::read_to_string(&sub_file_path) { - nested_compilation_unit = CompilationUnit::new(Some(sub_file_path.clone()), content); - } else { - self.add_syntax_error(&source_path_location.clone(), DiagnosticKind::FailedToIncludeFile, vec![]); - - // Use a placeholder compilation unit - nested_compilation_unit = CompilationUnit::new(None, "".into()); - } - } - } else { - self.add_syntax_error(&source_path_location.clone(), DiagnosticKind::ParentSourceIsNotAFile, vec![]); - - // Use a placeholder compilation unit - nested_compilation_unit = CompilationUnit::new(None, "".into()); - } - - // Let it be such that the sub compilation unit is subsequent of - // the super compilation unit. - nested_compilation_unit.set_included_from(Some(self.tokenizer.compilation_unit().clone())); - - // Add sub compilation unit to super compilation unit - self.tokenizer.compilation_unit().add_nested_compilation_unit(nested_compilation_unit.clone()); - - // Parse directives from replacement source - let (nested_packages, nested_directives) = parse_include_directive_source(nested_compilation_unit.clone(), context); - - // Delegate sub compilation unit errors to super compilation unit - if nested_compilation_unit.invalidated() { - self.tokenizer.compilation_unit().invalidated.set(true); - } - - let node = Rc::new(Directive::IncludeDirective(IncludeDirective { - location: self.pop_location(), - source, - nested_packages, - nested_directives, - nested_compilation_unit: nested_compilation_unit.clone(), - })); - - (node, semicolon) - } - - fn parse_use_namespace_directive(&mut self) -> (Rc, bool) { - self.mark_location(); - self.next(); - let mut expression = self.create_invalidated_expression(&self.tokenizer.cursor_location()); - self.non_greedy_expect_context_keyword("namespace"); - if !self.expecting_token_error { - expression = self.parse_expression(ParserExpressionContext { - min_precedence: OperatorPrecedence::List, - ..default() - }); - } - let semicolon = self.parse_semicolon(); - - let node = Rc::new(Directive::UseNamespaceDirective(UseNamespaceDirective { - location: self.pop_location(), - expression, - })); - - (node, semicolon) - } - - fn parse_variable_definition(&mut self, context: AnnotatableContext) -> (Rc, bool) { - let AnnotatableContext { start_location, asdoc, attributes, context, .. } = context; - let has_static = Attribute::find_static(&attributes).is_some(); - self.push_location(&start_location); - let kind_location = self.token_location(); - let kind = if self.consume(Token::Const) { - VariableDefinitionKind::Const - } else { - self.non_greedy_expect(Token::Var); - VariableDefinitionKind::Var - }; - let mut bindings = vec![Rc::new(self.parse_variable_binding(true))]; - while self.consume(Token::Comma) { - bindings.push(Rc::new(self.parse_variable_binding(true))); - } - - // Forbid destructuring bindings in enumerations. - if !has_static && matches!(context, ParserDirectiveContext::EnumBlock) { - if kind != VariableDefinitionKind::Const { - self.add_syntax_error(&kind_location, DiagnosticKind::EnumMembersMustBeConst, diagarg![]); - } - for binding in &bindings { - let malformed = !matches!(binding.destructuring.destructuring.as_ref(), Expression::QualifiedIdentifier(_)) - || binding.destructuring.type_annotation.is_some(); - if malformed { - self.add_syntax_error(&binding.location(), DiagnosticKind::MalformedEnumMember, diagarg![]); - } - } - } - - for a in &attributes { - if a.is_metadata() { - continue; - } - match a { - Attribute::Static(_) => { - if !context.is_type_block() { - // Unallowed attribute - self.add_syntax_error(&a.location(), DiagnosticKind::UnallowedAttribute, diagarg![]); - } - }, - Attribute::Expression(_) | - Attribute::Public(_) | - Attribute::Private(_) | - Attribute::Protected(_) | - Attribute::Internal(_) => { - self.verify_visibility(&a, &context); - }, - _ => { - // Unallowed attribute - self.add_syntax_error(&a.location(), DiagnosticKind::UnallowedAttribute, diagarg![]); - }, - } - } - - let semicolon = self.parse_semicolon(); - let node = Rc::new(Directive::VariableDefinition(VariableDefinition { - location: self.pop_location(), - asdoc, - attributes, - kind: (kind, kind_location), - bindings, - })); - - (node, semicolon) - } - - fn parse_function_definition(&mut self, context: AnnotatableContext) -> (Rc, bool) { - let AnnotatableContext { start_location, asdoc, attributes, context, .. } = context; - let has_native = Attribute::find_native(&attributes).is_some(); - let has_abstract = Attribute::find_abstract(&attributes).is_some(); - self.push_location(&start_location); - let mut name = self.expect_identifier(true); - let mut getter = false; - let mut setter = false; - if self.peek_identifier(true).is_some() { - getter = Token::is_context_keyword(&self.previous_token, "get"); - setter = Token::is_context_keyword(&self.previous_token, "set"); - if getter || setter { - name = self.expect_identifier(true); - } - } - let constructor = !getter && !setter && context.function_name_is_constructor(&name); - let name = if getter { - FunctionName::Getter(name) - } else if setter { - FunctionName::Setter(name) - } else if constructor { - FunctionName::Constructor(name) - } else { - FunctionName::Identifier(name) - }; - let block_context = if constructor { - ParserDirectiveContext::ConstructorBlock { super_statement_found: Rc::new(Cell::new(false)) } - } else { - ParserDirectiveContext::Default - }; - let common = self.parse_function_common(false, block_context, true); - let semicolon = if common.has_block_body() { true } else { self.parse_semicolon() }; - - /* - if constructor && common.signature.result_type.is_some() { - self.add_syntax_error(&name.location(), DiagnosticKind::ConstructorMustNotSpecifyResultType, diagarg![]); - } - */ - - // Not all kinds of functions may be generators. - if common.contains_yield && (constructor || getter || setter) { - self.add_syntax_error(&name.location(), DiagnosticKind::FunctionMayNotBeGenerator, diagarg![]); - } - - // Not all kinds of functions may be asynchronous. - if common.contains_await && (constructor || getter || setter) { - self.add_syntax_error(&name.location(), DiagnosticKind::FunctionMayNotBeAsynchronous, diagarg![]); - } - - let interface_method = matches!(context, ParserDirectiveContext::InterfaceBlock); - - // Body verification. - // - // Note that interface methods must never have a body unlike in Java. - if (interface_method || has_native || has_abstract) && common.body.is_some() { - self.add_syntax_error(&name.location(), DiagnosticKind::FunctionMustNotContainBody, diagarg![]); - } else if !(interface_method || has_native || has_abstract) && common.body.is_none() { - self.add_syntax_error(&name.location(), DiagnosticKind::FunctionMustContainBody, diagarg![]); - } - - // Interface methods must not contain any annotations except for meta-data. - if !attributes.is_empty() && interface_method { - if !attributes.last().unwrap().is_metadata() { - self.add_syntax_error(&name.location(), DiagnosticKind::FunctionMustNotContainAnnotations, diagarg![]); - } - } - - for a in &attributes { - if a.is_metadata() { - continue; - } - match a { - Attribute::Static(_) => { - if !context.is_type_block() { - // Unallowed attribute - self.add_syntax_error(&a.location(), DiagnosticKind::UnallowedAttribute, diagarg![]); - } - }, - Attribute::Final(_) | - Attribute::Override(_) | - Attribute::Abstract(_) => { - if !context.is_type_block() || constructor { - // Unallowed attribute - self.add_syntax_error(&a.location(), DiagnosticKind::UnallowedAttribute, diagarg![]); - } - }, - - Attribute::Native(_) => {}, - - Attribute::Expression(_) | - Attribute::Public(_) | - Attribute::Private(_) | - Attribute::Protected(_) | - Attribute::Internal(_) => { - self.verify_visibility(&a, &context); - }, - _ => { - // Unallowed attribute - self.add_syntax_error(&a.location(), DiagnosticKind::UnallowedAttribute, diagarg![]); - }, - } - } - - let node = Rc::new(Directive::FunctionDefinition(FunctionDefinition { - location: self.pop_location(), - asdoc, - attributes, - name: name.clone(), - common, - })); - - (node, semicolon) - } - - fn parse_class_definition(&mut self, context: AnnotatableContext) -> (Rc, bool) { - let AnnotatableContext { start_location, asdoc, attributes, context, .. } = context; - self.push_location(&start_location); - let name = self.expect_identifier(true); - let type_parameters = self.parse_type_parameters_opt(); - let mut extends_clause: Option> = None; - if self.consume(Token::Extends) { - extends_clause = Some(self.parse_type_expression()); - } - let mut implements_clause: Option>> = None; - if self.consume(Token::Implements) { - implements_clause = Some(self.parse_type_expression_list()); - } - let block = Rc::new(self.parse_block(ParserDirectiveContext::ClassBlock { - name: name.0.clone(), - })); - - for a in &attributes { - if a.is_metadata() { - continue; - } - match a { - Attribute::Static(_) => {}, - Attribute::Final(_) => {}, - Attribute::Dynamic(_) => {}, - Attribute::Abstract(_) => {}, - - Attribute::Expression(_) | - Attribute::Public(_) | - Attribute::Private(_) | - Attribute::Protected(_) | - Attribute::Internal(_) => { - self.verify_visibility(&a, &context); - }, - _ => { - // Unallowed attribute - self.add_syntax_error(&a.location(), DiagnosticKind::UnallowedAttribute, diagarg![]); - }, - } - } - - // Nested classes not allowed - if !context.is_top_level_or_package() { - self.add_syntax_error(&name.1, DiagnosticKind::NestedClassesNotAllowed, diagarg![]); - } - - let node = Rc::new(Directive::ClassDefinition(ClassDefinition { - location: self.pop_location(), - asdoc, - attributes, - name: name.clone(), - type_parameters, - extends_clause, - implements_clause, - block, - })); - - (node, true) - } - - fn parse_enum_definition(&mut self, context: AnnotatableContext) -> (Rc, bool) { - let AnnotatableContext { start_location, asdoc, mut attributes, context, .. } = context; - self.push_location(&start_location); - let name = self.expect_identifier(true); - let mut as_clause: Option> = None; - if self.consume(Token::As) { - as_clause = Some(self.parse_type_expression()); - } - let block = Rc::new(self.parse_block(ParserDirectiveContext::EnumBlock)); - - for a in &attributes { - if a.is_metadata() { - continue; - } - match a { - Attribute::Expression(_) | - Attribute::Public(_) | - Attribute::Private(_) | - Attribute::Protected(_) | - Attribute::Internal(_) => { - self.verify_visibility(&a, &context); - }, - _ => { - // Unallowed attribute - self.add_syntax_error(&a.location(), DiagnosticKind::UnallowedAttribute, diagarg![]); - }, - } - } - - // Nested classes not allowed - if !context.is_top_level_or_package() { - self.add_syntax_error(&name.1, DiagnosticKind::NestedClassesNotAllowed, diagarg![]); - } - - let mut is_set = false; - let metadata = Attribute::find_metadata(&attributes); - for metadata in metadata { - if metadata.name.0 == "Set" { - is_set = true; - Attribute::remove_metadata(&mut attributes, &metadata); - } - } - - let node = Rc::new(Directive::EnumDefinition(EnumDefinition { - location: self.pop_location(), - asdoc, - attributes, - is_set, - name: name.clone(), - as_clause, - block, - })); - - (node, true) - } - - fn parse_interface_definition(&mut self, context: AnnotatableContext) -> (Rc, bool) { - let AnnotatableContext { start_location, asdoc, attributes, context, .. } = context; - self.push_location(&start_location); - let name = self.expect_identifier(true); - let type_parameters = self.parse_type_parameters_opt(); - let mut extends_clause: Option>> = None; - if self.consume(Token::Extends) { - extends_clause = Some(self.parse_type_expression_list()); - } - let block = Rc::new(self.parse_block(ParserDirectiveContext::InterfaceBlock)); - - // Interface block must only contain function definitions - for directive in block.directives.iter() { - if !(matches!(directive.as_ref(), Directive::FunctionDefinition(_))) { - self.add_syntax_error(&directive.location(), DiagnosticKind::UnexpectedDirective, diagarg![]); - } - } - - for a in &attributes { - if a.is_metadata() { - continue; - } - match a { - Attribute::Expression(_) | - Attribute::Public(_) | - Attribute::Private(_) | - Attribute::Protected(_) | - Attribute::Internal(_) => { - self.verify_visibility(&a, &context); - }, - _ => { - // Unallowed attribute - self.add_syntax_error(&a.location(), DiagnosticKind::UnallowedAttribute, diagarg![]); - }, - } - } - - // Nested classes not allowed - if !context.is_top_level_or_package() { - self.add_syntax_error(&name.1, DiagnosticKind::NestedClassesNotAllowed, diagarg![]); - } - - let node = Rc::new(Directive::InterfaceDefinition(InterfaceDefinition { - location: self.pop_location(), - asdoc, - attributes, - name: name.clone(), - type_parameters, - extends_clause, - block, - })); - - (node, true) - } - - fn parse_type_definition(&mut self, context: AnnotatableContext) -> (Rc, bool) { - let AnnotatableContext { start_location, asdoc, attributes, context, .. } = context; - self.push_location(&start_location); - let left = self.expect_identifier(true); - let mut right = self.create_invalidated_expression(&self.tokenizer.cursor_location()); - self.non_greedy_expect(Token::Assign); - if !self.expecting_token_error { - right = self.parse_type_expression(); - } - - for a in &attributes { - if a.is_metadata() { - continue; - } - match a { - Attribute::Expression(_) | - Attribute::Public(_) | - Attribute::Private(_) | - Attribute::Protected(_) | - Attribute::Internal(_) => { - self.verify_visibility(&a, &context); - }, - _ => { - // Unallowed attribute - self.add_syntax_error(&a.location(), DiagnosticKind::UnallowedAttribute, diagarg![]); - }, - } - } - - // Nested classes not allowed - if !context.is_top_level_or_package() { - self.add_syntax_error(&left.1, DiagnosticKind::NestedClassesNotAllowed, diagarg![]); - } - - let semicolon = self.parse_semicolon(); - - let node = Rc::new(Directive::TypeDefinition(TypeDefinition { - location: self.pop_location(), - asdoc, - attributes, - left: left.clone(), - right, - })); - - (node, semicolon) - } - - fn parse_namespace_definition(&mut self, context: AnnotatableContext) -> (Rc, bool) { - let AnnotatableContext { start_location, asdoc, attributes, context, .. } = context; - self.push_location(&start_location); - let left = self.expect_identifier(true); - let mut right: Option> = None; - if self.consume(Token::Assign) { - right = Some(self.parse_expression(ParserExpressionContext { - min_precedence: OperatorPrecedence::AssignmentAndOther, - ..default() - })); - } - - for a in &attributes { - if a.is_metadata() { - continue; - } - match a { - Attribute::Expression(_) | - Attribute::Public(_) | - Attribute::Private(_) | - Attribute::Protected(_) | - Attribute::Internal(_) => { - self.verify_visibility(&a, &context); - }, - Attribute::Static(_) => {}, - _ => { - // Unallowed attribute - self.add_syntax_error(&a.location(), DiagnosticKind::UnallowedAttribute, diagarg![]); - }, - } - } - - let semicolon = self.parse_semicolon(); - - let node = Rc::new(Directive::NamespaceDefinition(NamespaceDefinition { - location: self.pop_location(), - asdoc, - attributes, - left: left.clone(), - right, - })); - - (node, semicolon) - } - - fn parse_type_expression_list(&mut self) -> Vec> { - let mut list = vec![self.parse_type_expression()]; - while self.consume(Token::Comma) { - list.push(self.parse_type_expression()); - } - list - } - - fn verify_visibility(&self, a: &Attribute, context: &ParserDirectiveContext) { - let mut unallowed = false; - match a { - Attribute::Expression(_) => {}, - Attribute::Public(_) => {}, - Attribute::Private(_) | - Attribute::Protected(_) => { - if !context.is_type_block() { - unallowed = true; - } - }, - Attribute::Internal(_) => {}, - _ => {} - } - if unallowed { - // Unallowed attribute - self.add_syntax_error(&a.location(), DiagnosticKind::UnallowedAttribute, diagarg![]); - } - } - - fn parse_type_parameters_opt(&mut self) -> Option>> { - if !self.consume(Token::Dot) { - return None; - } - let mut list: Vec> = vec![]; - self.non_greedy_expect(Token::Lt); - if !self.expecting_token_error { - list.push(self.parse_type_parameter()); - while self.consume(Token::Comma) { - list.push(self.parse_type_parameter()); - } - self.non_greedy_expect_type_parameters_gt(); - } - Some(list) - } - - fn parse_type_parameter(&mut self) -> Rc { - self.mark_location(); - let name = self.expect_identifier(false); - Rc::new(TypeParameter { - location: self.pop_location(), - name, - }) - } - - fn parse_configuration_directive(&mut self, context: ParserDirectiveContext, start_location: Location) -> (Rc, bool) { - self.push_location(&start_location); - self.non_greedy_expect(Token::BlockOpen); - let subdirective = self.parse_configuration_subdirective(context.clone()); - self.non_greedy_expect(Token::BlockClose); - (Rc::new(Directive::ConfigurationDirective(ConfigurationDirective { - location: self.pop_location(), - directive: subdirective, - })), true) - } - - fn parse_configuration_subdirective(&mut self, context: ParserDirectiveContext) -> Rc { - if self.peek(Token::If) { - self.mark_location(); - self.next(); - let mut test = self.create_invalidated_expression(&self.tokenizer.cursor_location()); - self.non_greedy_expect(Token::ParenOpen); - if !self.expecting_token_error { - test = self.parse_configuration_expression(); - } - self.non_greedy_expect(Token::ParenClose); - let consequent = Rc::new(Directive::Block(self.parse_block(context.clone()))); - let mut alternative: Option> = None; - if self.consume(Token::Else) { - alternative = Some(self.parse_configuration_subdirective(context.clone())); - } - Rc::new(Directive::IfStatement(IfStatement { - location: self.pop_location(), - test, - consequent, - alternative, - })) - } else { - Rc::new(Directive::Block(self.parse_block(context.clone()))) - } - } - - fn parse_configuration_expression(&mut self) -> Rc { - let mut base = self.parse_configuration_primary_expression(); - if self.consume(Token::LogicalAnd) { - self.push_location(&base.location()); - let right = self.parse_configuration_expression(); - base = Rc::new(Expression::Binary(BinaryExpression { - location: self.pop_location(), - operator: Operator::LogicalAnd, - left: base.clone(), - right, - })); - } else if self.consume(Token::LogicalOr) { - self.push_location(&base.location()); - let right = self.parse_configuration_expression(); - base = Rc::new(Expression::Binary(BinaryExpression { - location: self.pop_location(), - operator: Operator::LogicalOr, - left: base.clone(), - right, - })); - } - base - } - - fn parse_configuration_primary_expression(&mut self) -> Rc { - if let Token::Identifier(_) = &self.token.0.clone() { - self.mark_location(); - let mut id = self.expect_identifier(false); - let mut qual: Option> = None; - if self.consume(Token::ColonColon) { - qual = Some(Rc::new(Expression::QualifiedIdentifier(QualifiedIdentifier { - location: id.1.clone(), - attribute: false, - qualifier: None, - id: QualifiedIdentifierIdentifier::Id(id.clone()), - }))); - id = self.expect_identifier(true); - } - let id_location = self.pop_location(); - let id = Rc::new(Expression::QualifiedIdentifier(QualifiedIdentifier { - location: id_location.clone(), - attribute: false, - qualifier: qual, - id: QualifiedIdentifierIdentifier::Id(id.clone()), - })); - let equality: Option = if self.consume(Token::Assign) { - Some(Operator::Equals) - } else if self.consume(Token::NotEquals) { - Some(Operator::NotEquals) - } else { - None - }; - if let Some(equality) = equality { - self.push_location(&id.location()); - self.mark_location(); - let mut value: String = "".into(); - if let Some((value_1, _)) = self.consume_identifier(false) { - value = value_1; - } else { - if let Token::String(s) = &self.token.0 { - value = s.clone(); - self.next(); - } else { - self.add_syntax_error(&self.token_location(), DiagnosticKind::ExpectingStringLiteral, diagarg![self.token.0.clone()]); - while self.token.0 != Token::Eof { - self.next(); - if let Token::String(s) = self.token.0.clone() { - self.pop_location(); - self.mark_location(); - value = s; - self.next(); - } - } - } - } - let right = Rc::new(Expression::StringLiteral(StringLiteral { - location: self.pop_location(), - value, - })); - Rc::new(Expression::Binary(BinaryExpression { - location: self.pop_location(), - operator: equality, - left: id.clone(), - right, - })) - } else { - id - } - } else if self.peek(Token::ParenOpen) { - self.mark_location(); - self.next(); - let expression = self.parse_configuration_expression(); - self.non_greedy_expect(Token::ParenClose); - Rc::new(Expression::Paren(ParenExpression { - location: self.pop_location(), - expression, - })) - } else if self.peek(Token::Exclamation) { - self.mark_location(); - self.next(); - let expression = self.parse_configuration_primary_expression(); - Rc::new(Expression::Unary(UnaryExpression { - location: self.pop_location(), - operator: Operator::LogicalNot, - expression, - })) - } else { - self.add_syntax_error(&self.token_location(), DiagnosticKind::ExpectingExpression, diagarg![self.token.0.clone()]); - self.create_invalidated_expression(&self.tokenizer.cursor_location()) - } - } - - fn keyword_or_expression_attribute_from_expression(&self, expr: &Rc) -> Attribute { - match expr.as_ref() { - Expression::QualifiedIdentifier(id) => { - if id.qualifier.is_some() || id.attribute { - return Attribute::Expression(expr.clone()); - } - match &id.id { - QualifiedIdentifierIdentifier::Id((id, location)) => { - if let Some(attr) = Attribute::from_identifier_name(&id, &location) { - return attr; - } - Attribute::Expression(expr.clone()) - }, - _ => Attribute::Expression(expr.clone()), - } - }, - _ => Attribute::Expression(expr.clone()), - } - } - - fn keyword_attribute_from_previous_token(&self) -> Option { - self.previous_token.0.to_attribute(&self.previous_token.1) - } - - fn _keyword_or_expression_attribute_from_previous_token(&mut self) -> Option { - if let Some(a) = self.keyword_attribute_from_previous_token() { - return Some(a); - } - match &self.previous_token.0 { - Token::Identifier(id) => Some(Attribute::Expression(self.parse_expression_attribute(&(id.clone(), self.previous_token.1.clone())))), - _ => None, - } - } - - fn parse_keyword_or_expression_attribute(&mut self) -> Option { - if let Some(a) = self.token.0.to_attribute(&self.token.1) { - self.next(); - return Some(a); - } - match &self.token.0 { - Token::Identifier(_) => { - let id = self.expect_identifier(false); - Some(Attribute::Expression(self.parse_expression_attribute(&id))) - }, - _ => None, - } - } - - fn peek_annotatable_directive_identifier_name(&self) -> bool { - if self.token.0.to_attribute(&self.token.1).is_some() { - return true; - } - match self.token.0 { - Token::Identifier(_) => true, - Token::Var | - Token::Const | - Token::Function | - Token::Class | - Token::Interface => true, - _ => false, - } - } - - fn lookbehind_is_annotatable_directive_identifier_name(&self) -> bool { - self.keyword_attribute_from_previous_token().is_some() - || matches!(&self.previous_token.0, Token::Identifier(_)) - || Token::is_context_keyword(&self.previous_token, "enum") - || Token::is_context_keyword(&self.previous_token, "type") - || Token::is_context_keyword(&self.previous_token, "namespace") - } - - fn parse_attribute_keywords_or_expressions(&mut self, context: &mut AnnotatableContext) { - if context.directive_context_keyword.is_some() { - unreachable!(); - } - loop { - if let Some(a) = self.parse_keyword_or_expression_attribute() { - if let Attribute::Expression(e) = &a { - let id = e.to_identifier_name(); - if let Some(id) = id { - if ["enum", "type", "namespace"].contains(&id.0.as_ref()) { - context.directive_context_keyword = Some(id); - break; - } - } - } - let last_attribute_is_identifier = context.attributes.last().map_or(false, |a| !a.is_metadata()); - if last_attribute_is_identifier { - self.forbid_line_break_before_token(); - } - context.attributes.push(a); - // self.next(); - } else { - if let Some(id) = self.peek_identifier(false) { - self.forbid_line_break_before_token(); - if ["enum", "type", "namespace"].contains(&id.0.as_ref()) { - self.next(); - context.directive_context_keyword = Some(id); - } - } - break; - } - } - // For meta-data that are not one of certain Flex meta-data, - // delegate the respective ASDoc to the annotatable directive. - let mut new_attributes = Vec::::new(); - for attr in &context.attributes { - if let Attribute::Metadata(metadata) = attr { - if !is_flex_documentable_meta_data(&metadata.name.0) && metadata.asdoc.is_some() { - new_attributes.push(Attribute::Metadata(Rc::new(Metadata { - location: metadata.location.clone(), - asdoc: None, - name: metadata.name.clone(), - entries: metadata.entries.clone(), - }))); - context.asdoc = metadata.asdoc.clone(); - } else { - new_attributes.push(attr.clone()); - } - } else { - new_attributes.push(attr.clone()); - } - } - context.attributes = new_attributes; - } - - pub fn parse_package_definition(&mut self) -> Rc { - self.mark_location(); - let asdoc = self.parse_asdoc(); - self.non_greedy_expect(Token::Package); - let mut name = vec![]; - if let Some(name1) = self.consume_identifier(false) { - name.push(name1.clone()); - while self.consume(Token::Dot) { - name.push(self.expect_identifier(true)); - } - } - let block = Rc::new(self.parse_block(ParserDirectiveContext::PackageBlock)); - Rc::new(PackageDefinition { - location: self.pop_location(), - asdoc, - name, - block, - }) - } - - pub fn parse_program(&mut self) -> Rc { - self.mark_location(); - let just_eof = self.peek(Token::Eof); - let mut packages = vec![]; - while self.peek(Token::Package) { - packages.push(self.parse_package_definition()); - } - let directives = self.parse_directives(ParserDirectiveContext::TopLevel); - Rc::new(Program { - location: if just_eof { - self.pop_location(); - self.token.1.clone() - } else { - self.pop_location() - }, - packages, - directives, - }) - } - - pub fn parse_asdoc(&mut self) -> Option> { - let comments = self.compilation_unit().comments.borrow(); - let last_comment = comments.last().map(|last_comment| last_comment.clone()); - drop(comments); - last_comment.and_then(|comment| { - if comment.is_asdoc(&self.token.1) { - self.compilation_unit().comments_mut().pop(); - let location = comment.location(); - let comment_prefix_length: usize = 3; - let location1 = Location::with_offsets(self.compilation_unit(), location.first_offset + comment_prefix_length, location.last_offset - 2); - let content = &comment.content.borrow()[1..]; - let (main_body, tags) = self.parse_asdoc_content(&location1, content); - Some(Rc::new(AsDoc { - location, - main_body, - tags, - })) - } else { - None - } - }) - } - - fn parse_asdoc_content(&mut self, location: &Location, content: &str) -> (Option<(String, Location)>, Vec<(AsDocTag, Location)>) { - let lines = self.split_asdoc_lines(location, content); - - let mut main_body: Option<(String, Location)> = None; - let mut tags: Vec<(AsDocTag, Location)> = vec![]; - let mut i = 0; - let line_count = lines.len(); - - let mut building_content_tag_name: Option<(String, Location)> = None; - let mut building_content: Vec<(String, Location)> = vec![]; - let mut inside_code_block = false; - - while i < line_count { - let line = &lines[i]; - let tag = if inside_code_block { None } else { - regex_captures!(r"^([\s\t]*\@)([^\s\t]+)(.*)", &line.content) - }; - if let Some((_, tag_prefix, tag_name, tag_content)) = tag { - self.parse_asdoc_tag_or_main_body( - &mut building_content_tag_name, - &mut building_content, - &mut main_body, - &mut tags, - ); - if regex_is_match!(r"^[\s\t]*```([^`]|$)", &tag_content) { - inside_code_block = true; - } - let tag_name_location = Location::with_offsets(self.compilation_unit(), line.location.first_offset() + tag_prefix.len() - 1, line.location.first_offset() + tag_prefix.len() + tag_name.len()); - building_content_tag_name = Some((tag_name.into(), tag_name_location)); - let tag_content_location = Location::with_offsets(self.compilation_unit(), line.location.first_offset() + tag_prefix.len() + tag_name.len(), line.location.last_offset()); - building_content.push((tag_content.into(), tag_content_location)); - - if ["private", "inheritDoc"].contains(&tag_name) { - self.parse_asdoc_tag_or_main_body( - &mut building_content_tag_name, - &mut building_content, - &mut main_body, - &mut tags, - ); - building_content_tag_name = None; - building_content.clear(); - } - } else { - if regex_is_match!(r"^[\s\t]*```([^`]|$)", &line.content) { - inside_code_block = !inside_code_block; - } - building_content.push((line.content.clone(), line.location.clone())); - } - i += 1; - } - - self.parse_asdoc_tag_or_main_body( - &mut building_content_tag_name, - &mut building_content, - &mut main_body, - &mut tags, - ); - - (main_body, tags) - } - - fn split_asdoc_lines(&mut self, location: &Location, content: &str) -> Vec { - let mut builder = String::new(); - let mut lines = vec![]; - let mut _line_number = location.first_line_number(); - let mut index = location.first_offset(); - let mut line_first_offset = index; - let mut characters = content.chars(); - while let Some(ch) = characters.next() { - if CharacterValidator::is_line_terminator(ch) { - lines.push(ParserAsDocLine { - content: builder, - location: Location::with_offsets(self.compilation_unit(), line_first_offset, index), - }); - index += ch.len_utf8(); - // sequence - if ch == '\r' && characters.clone().next().unwrap_or('\x00') == '\n' { - index += '\n'.len_utf8(); - characters.next(); - } - builder = String::new(); - _line_number += 1; - line_first_offset = index; - } else { - builder.push(ch); - index += ch.len_utf8(); - } - } - lines.push(ParserAsDocLine { - content: builder, - location: Location::with_offsets(self.compilation_unit(), line_first_offset, index), - }); - for line in &mut lines { - let line_content = line.content.to_owned(); - let prefix = regex_captures!(r"^\s*(\*\s?)", &line_content); - if let Some((prefix, _)) = prefix { - line.content = line.content[prefix.len()..].to_owned(); - line.location = Location::with_offsets(self.compilation_unit(), line.location.first_offset() + prefix.len(), line.location.last_offset()); - } - } - - lines - } - - fn parse_asdoc_tag_or_main_body( - &self, - building_content_tag_name: &mut Option<(String, Location)>, - building_content: &mut Vec<(String, Location)>, - main_body: &mut Option<(String, Location)>, - tags: &mut Vec<(AsDocTag, Location)> - ) { - if let Some((tag_name, ref tag_location)) = building_content_tag_name.as_ref() { - match tag_name.as_ref() { - // @author Author text - "author" => { - let (content, location) = join_asdoc_content(building_content); - // Content must be non empty - if regex_is_match!(r"^\s*$", &content) { - self.add_syntax_error(&tag_location, DiagnosticKind::FailedParsingAsDocTag, diagarg![tag_name.clone()]); - } - let location = tag_location.combine_with(location); - tags.push((AsDocTag::Author(content), location)); - }, - - // @copy reference - "copy" => { - let (content, c_location) = join_asdoc_content(building_content); - let location = tag_location.combine_with(c_location.clone()); - let reference_loc = c_location.shift_whitespace(&self.compilation_unit().text()[c_location.first_offset()..c_location.last_offset()]); - if let Some(reference) = self.parse_asdoc_reference(&content, &reference_loc, &tag_location, &tag_name) { - tags.push((AsDocTag::Copy(reference), location)); - } - }, - - // @created Date text - "created" => { - let (content, location) = join_asdoc_content(building_content); - // Content must be non empty - if regex_is_match!(r"^\s*$", &content) { - self.add_syntax_error(&tag_location, DiagnosticKind::FailedParsingAsDocTag, diagarg![tag_name.clone()]); - } - let location = tag_location.combine_with(location); - tags.push((AsDocTag::Created(content), location)); - }, - - // @default value - "default" => { - let (reference, location) = join_asdoc_content(building_content); - let location = tag_location.combine_with(location); - tags.push((AsDocTag::Default(reference), location)); - }, - - // @deprecated - "deprecated" => { - let (text, location) = join_asdoc_content(building_content); - let location = tag_location.combine_with(location); - - let mut message: Option = None; - - if !regex_is_match!(r"^\s*$", &text) { - message = Some(text.clone()); - } - - tags.push((AsDocTag::Deprecated { message }, location)); - }, - - // @eventType typeOrConstant - "eventType" => { - let (_, c_location) = join_asdoc_content(building_content); - let location = tag_location.combine_with(c_location.clone()); - let reference_loc = c_location.shift_whitespace(&self.compilation_unit().text()[c_location.first_offset()..c_location.last_offset()]); - let parser_options = ParserOptions { - byte_range: Some((reference_loc.first_offset(), reference_loc.last_offset())), - ..self.options() - }; - let exp = ParserFacade(self.compilation_unit(), parser_options).parse_expression(); - tags.push((AsDocTag::EventType(exp), location)); - }, - - // @example text - "example" => { - let (text, location) = join_asdoc_content(building_content); - let location = tag_location.combine_with(location); - tags.push((AsDocTag::Example(text), location)); - }, - - // @inheritDoc - "inheritDoc" => { - let (text, location) = join_asdoc_content(building_content); - let location = tag_location.combine_with(location); - - // Content must be empty - if !regex_is_match!(r"^\s*$", &text) { - self.add_syntax_error(&tag_location, DiagnosticKind::FailedParsingAsDocTag, diagarg![tag_name.clone()]); - } - - tags.push((AsDocTag::InheritDoc, location)); - }, - - // @internal text - "internal" => { - let (text, location) = join_asdoc_content(building_content); - let location = tag_location.combine_with(location); - - // Content must be non empty - if regex_is_match!(r"^\s*$", &text) { - self.add_syntax_error(&tag_location, DiagnosticKind::FailedParsingAsDocTag, diagarg![tag_name.clone()]); - } - - tags.push((AsDocTag::Internal(text), location)); - }, - - // @langversion text - "langversion" => { - let (text, location) = join_asdoc_content(building_content); - let location = tag_location.combine_with(location); - - // Content must be non empty - if regex_is_match!(r"^\s*$", &text) { - self.add_syntax_error(&tag_location, DiagnosticKind::FailedParsingAsDocTag, diagarg![tag_name.clone()]); - } - - tags.push((AsDocTag::Langversion(text), location)); - }, - - // @param paramName description - "param" => { - let (content, location) = join_asdoc_content(building_content); - let location = tag_location.combine_with(location); - - if let Some((_, name, description)) = regex_captures!(r"(?x) ([^\s]+) (.*)", &content) { - tags.push((AsDocTag::Param { name: name.into(), description: description.trim_start().into() }, location)); - } else { - tags.push((AsDocTag::Param { name: content, description: "".into() }, location)); - } - }, - - // @playerversion text - "playerversion" => { - let (text, location) = join_asdoc_content(building_content); - let location = tag_location.combine_with(location); - - // Content must be non empty - if regex_is_match!(r"^\s*$", &text) { - self.add_syntax_error(&tag_location, DiagnosticKind::FailedParsingAsDocTag, diagarg![tag_name.clone()]); - } - - tags.push((AsDocTag::Playerversion(text), location)); - }, - - // @private - "private" => { - let (text, location) = join_asdoc_content(building_content); - let location = tag_location.combine_with(location); - - // Content must be empty - if !regex_is_match!(r"^\s*$", &text) { - self.add_syntax_error(&tag_location, DiagnosticKind::FailedParsingAsDocTag, diagarg![tag_name.clone()]); - } - - tags.push((AsDocTag::Private, location)); - }, - - // @productversion text - "productversion" => { - let (text, location) = join_asdoc_content(building_content); - let location = tag_location.combine_with(location); - - // Content must be non empty - if regex_is_match!(r"^\s*$", &text) { - self.add_syntax_error(&tag_location, DiagnosticKind::FailedParsingAsDocTag, diagarg![tag_name.clone()]); - } - - tags.push((AsDocTag::Productversion(text), location)); - }, - - // @return text - "return" => { - let (text, location) = join_asdoc_content(building_content); - let location = tag_location.combine_with(location); - tags.push((AsDocTag::Return(text), location)); - }, - - // @see reference [displayText] - "see" => { - let (content, c_location) = join_asdoc_content(building_content); - let location = tag_location.combine_with(c_location.clone()); - let reference: String; - let display_text: Option; - let mut reference_loc = c_location.shift_whitespace(&self.compilation_unit().text()[c_location.first_offset()..c_location.last_offset()]); - if let Some((_, reference_1, display_text_1)) = regex_captures!(r"(?x) ([^\s]+) (.*)", &content) { - reference = reference_1.to_owned(); - reference_loc = Location::with_offsets(self.compilation_unit(), reference_loc.first_offset(), reference_loc.first_offset() + reference.len()); - display_text = Some(display_text_1.trim().to_owned()); - } else { - reference = content; - display_text = None; - } - if let Some(reference) = self.parse_asdoc_reference(&reference, &reference_loc, &tag_location, &tag_name) { - tags.push((AsDocTag::See { reference, display_text }, location)); - } - }, - - // @throws className description - "throws" => { - let (class_name_and_description, c_location) = join_asdoc_content(building_content); - let location = tag_location.combine_with(c_location.clone()); - - let class_name_and_description = regex_captures!(r"^([^\s]+)(\s.*)?", &class_name_and_description); - - if let Some((_, class_name, description)) = class_name_and_description { - let description = description.trim().to_owned(); - let description = if description.is_empty() { - None - } else { - Some(description) - }; - let mut reference_loc = c_location.shift_whitespace(&self.compilation_unit().text()[c_location.first_offset()..c_location.last_offset()]); - reference_loc = Location::with_offsets(self.compilation_unit(), reference_loc.first_offset(), reference_loc.first_offset() + class_name.len()); - let parser_options = ParserOptions { - byte_range: Some((reference_loc.first_offset(), reference_loc.last_offset())), - ..self.options() - }; - let exp = ParserFacade(self.compilation_unit(), parser_options).parse_type_expression(); - tags.push((AsDocTag::Throws { class_reference: exp, description }, location)); - } else { - self.add_syntax_error(&tag_location, DiagnosticKind::FailedParsingAsDocTag, diagarg![tag_name.clone()]); - } - }, - - // @version Version text - "version" => { - let (content, location) = join_asdoc_content(building_content); - // Content must be non empty - if regex_is_match!(r"^\s*$", &content) { - self.add_syntax_error(&tag_location, DiagnosticKind::FailedParsingAsDocTag, diagarg![tag_name.clone()]); - } - let location = tag_location.combine_with(location); - tags.push((AsDocTag::Version(content), location)); - }, - - // Unrecognized tag - _ => { - self.add_syntax_error(&tag_location, DiagnosticKind::UnrecognizedAsDocTag, diagarg![tag_name.clone()]); - }, - } - } else if !building_content.is_empty() { - let content = join_asdoc_content(building_content); - if !content.0.is_empty() { - *main_body = Some(content); - } - } - - *building_content_tag_name = None; - building_content.clear(); - } - - fn parse_asdoc_reference(&self, reference: &str, reference_loc: &Location, tag_location: &Location, tag_name: &str) -> Option> { - let split: Vec<&str> = reference.split("#").collect(); - if split.len() > 2 { - self.add_syntax_error(&tag_location, DiagnosticKind::FailedParsingAsDocTag, diagarg![tag_name.to_owned()]); - return None; - } - let mut base: Option> = None; - let base_text: String = split[0].to_owned(); - let instance_property_text: Option<(String, Location)> = split.get(1).and_then(|&f| if f.is_empty() { None } else { - Some((f.to_owned(), Location::with_offsets(self.compilation_unit(), reference_loc.first_offset() + base_text.len() + 1, reference_loc.last_offset()))) - }); - - if !base_text.is_empty() { - let parser_options = ParserOptions { - byte_range: Some((reference_loc.first_offset(), reference_loc.first_offset() + base_text.len())), - ..self.options() - }; - let exp = ParserFacade(self.compilation_unit(), parser_options).parse_expression(); - base = Some(exp); - } - - let mut instance_property: Option> = None; - if let Some(text) = instance_property_text { - let parser_options = ParserOptions { - byte_range: Some((text.1.first_offset(), text.1.last_offset())), - ..self.options() - }; - let exp = ParserFacade(self.compilation_unit(), parser_options).parse_qualified_identifier(); - instance_property = Some(Rc::new(exp)); - } - - if base.is_none() && instance_property.is_none() { - self.add_syntax_error(&tag_location, DiagnosticKind::FailedParsingAsDocTag, diagarg![tag_name.to_owned()]); - return None; - } - Some(Rc::new(AsDocReference { base, instance_property, })) - } - - /// Parses MXMLElement starting from its XMLTagContent. - fn parse_mxml_element(&mut self, start: Location, namespace: &Rc, encoding: &mut String) -> MxmlElement { - self.push_location(&start); - let namespace = Rc::new(MxmlNamespace::new(Some(namespace))); - let name = self.parse_xml_name(); - let mut attributes: Vec> = vec![]; - let mut plain_attributes: Vec = vec![]; - while self.consume_and_ie_xml_tag(Token::XmlWhitespace) { - if matches!(self.token.0, Token::XmlName(_)) { - self.mark_location(); - let name = self.parse_xml_name(); - self.consume_and_ie_xml_tag(Token::XmlWhitespace); - self.non_greedy_expect_and_ie_xml_tag(Token::Assign); - let mut value = ("".into(), self.token.1.clone()); - if !self.expecting_token_error { - self.consume_and_ie_xml_tag(Token::XmlWhitespace); - value = self.parse_xml_attribute_value(); - } - let attrib = PlainMxmlAttribute { - location: self.pop_location(), - name, - value, - }; - self.process_mxml_xmlns_attribute(&mut attributes, &attrib, &namespace); - plain_attributes.push(attrib); - } else { - break; - } - } - - for attrib in &plain_attributes { - self.process_mxml_attribute(&mut attributes, &attrib, &namespace); - } - - let name = self.process_mxml_tag_name(name, &namespace); - - let mut content: Option>> = None; - let mut closing_name: Option = None; - - let is_empty = self.consume_and_ie_xml_content(Token::XmlSlashGt); - - if !is_empty { - self.expect_and_ie_xml_content(Token::Gt); - content = Some(self.parse_mxml_content(false, &namespace, encoding)); - self.non_greedy_expect_and_ie_xml_tag(Token::XmlLtSlash); - let name_1 = self.parse_xml_name(); - let closing_name_1 = self.process_mxml_tag_name(name_1, &namespace); - if let Ok(equal) = name.equals_name(&closing_name_1, &namespace) { - if !equal { - self.add_syntax_error(&closing_name_1.location, DiagnosticKind::XmlClosingTagNameMustBeEquals, diagarg![name.to_string(&namespace)]); - } - } - closing_name = Some(closing_name_1); - self.consume_and_ie_xml_tag(Token::XmlWhitespace); - self.non_greedy_expect_and_ie_xml_content(Token::Gt); - } - - if let Some(content) = content.as_mut() { - self.filter_mxml_whitespace_out(content); - } - - MxmlElement { - location: self.pop_location(), - name, - attributes, - content, - closing_name, - namespace, - } - } - - /// Filters whitespace chunks out of a content list when - /// they include at least one child element. - fn filter_mxml_whitespace_out(&self, content: &mut Vec>) { - if !self.ignore_xml_whitespace { - return; - } - let mut inc_el = false; - for node in content.iter() { - inc_el = matches!(node.as_ref(), MxmlContent::Element(_)); - if inc_el { - break; - } - } - if inc_el { - let mut indices: Vec = vec![]; - for i in 0..content.len() { - let MxmlContent::Characters((ch, _)) = content[i].as_ref() else { - continue; - }; - if ch.trim().is_empty() { - indices.push(i); - } - } - for i in indices.iter().rev() { - content.remove(*i); - } - } - } - - fn process_mxml_xmlns_attribute(&mut self, output: &mut Vec>, attribute: &PlainMxmlAttribute, namespace: &Rc) { - // xml="uri" - if attribute.name.0 == "xmlns" { - let attribute_value = unescape_xml(&attribute.value.0); - namespace.set(MxmlNamespace::DEFAULT_NAMESPACE, &attribute_value); - output.push(Rc::new(MxmlAttribute { - location: attribute.location.clone(), - name: MxmlName { - location: attribute.name.1.clone(), - prefix: None, - name: "xmlns".into(), - }, - value: (attribute_value, attribute.value.1.clone()), - xmlns: true, - })); - // xmlns:prefix="uri" - } else if attribute.name.0.starts_with("xmlns:") { - let attribute_value = unescape_xml(&attribute.value.0); - namespace.set(&attribute.name.0[6..], &attribute_value); - if attribute.name.0[6..].find(':').is_some() { - self.add_syntax_error(&attribute.name.1, DiagnosticKind::XmlNameAtMostOneColon, vec![]); - } - output.push(Rc::new(MxmlAttribute { - location: attribute.location.clone(), - name: MxmlName { - location: attribute.name.1.clone(), - prefix: Some("xmlns".into()), - name: attribute.name.0[6..].to_owned(), - }, - value: (attribute_value, attribute.value.1.clone()), - xmlns: true, - })); - } - } - - fn process_mxml_attribute(&mut self, output: &mut Vec>, attribute: &PlainMxmlAttribute, namespace: &Rc) { - // attrib="value" - if !(attribute.name.0 == "xmlns" || attribute.name.0.starts_with("xmlns:")) { - let attribute_value = unescape_xml(&attribute.value.0); - let split = attribute.name.0.split(':').collect::>(); - if split.len() > 2 { - self.add_syntax_error(&attribute.name.1, DiagnosticKind::XmlNameAtMostOneColon, vec![]); - } - let prefix: Option = if split.len() > 1 { - Some(split[split.len() - 2].to_owned()) - } else { - None - }; - let name = split.last().unwrap(); - let attrib = Rc::new(MxmlAttribute { - location: attribute.location.clone(), - name: MxmlName { - location: attribute.name.1.clone(), - prefix, - name: (*name).to_owned(), - }, - value: (attribute_value, attribute.value.1.clone()), - xmlns: false, - }); - match attrib.name.resolve_prefix(namespace) { - Ok(_) => { - for prev_attrib in output.iter() { - if prev_attrib.name.equals_name(&attrib.name, namespace).unwrap_or(false) { - self.add_syntax_error(&attrib.name.location, DiagnosticKind::RedefiningXmlAttribute, diagarg![attrib.name.name.clone()]); - } - } - }, - Err(MxmlNameError::PrefixNotDefined(prefix)) => { - self.add_syntax_error(&attrib.name.location, DiagnosticKind::XmlPrefixNotDefined, diagarg![prefix]); - }, - } - output.push(attrib); - } - } - - fn process_mxml_tag_name(&mut self, name: (String, Location), namespace: &Rc) -> MxmlName { - let split = name.0.split(':').collect::>(); - if split.len() > 2 { - self.add_syntax_error(&name.1, DiagnosticKind::XmlNameAtMostOneColon, vec![]); - } - let prefix: Option = if split.len() > 1 { - Some(split[split.len() - 2].to_owned()) - } else { - None - }; - let name_str = split.last().unwrap(); - let name = MxmlName { - location: name.1.clone(), - prefix, - name: (*name_str).to_owned(), - }; - match name.resolve_prefix(namespace) { - Ok(_) => {}, - Err(MxmlNameError::PrefixNotDefined(prefix)) => { - self.add_syntax_error(&name.location, DiagnosticKind::XmlPrefixNotDefined, diagarg![prefix]); - }, - } - name - } - - /// Parses XMLContent until either the `, encoding: &mut String) -> Vec> { - let mut content = vec![]; - while if until_eof { self.tokenizer.characters().has_remaining() } else { !self.peek(Token::XmlLtSlash) } { - if let Token::XmlMarkup(markup) = self.token.0.clone() { - let location = self.token_location(); - self.next_ie_xml_content(); - // XMLCDATA - if markup.starts_with(" { - self.add_syntax_error(&location, DiagnosticKind::XmlPiUnknownAttribute, diagarg![name.clone()]); - }, - XmlPiError::Version => { - self.add_syntax_error(&location, DiagnosticKind::XmlPiVersion, vec![]); - }, - XmlPiError::Encoding => { - self.add_syntax_error(&location, DiagnosticKind::XmlPiEncoding, vec![]); - }, - } - } - content.push(Rc::new(MxmlContent::ProcessingInstruction { - location, - name, - data: if data.is_empty() { None } else { Some(data) }, - })); - } - } else if let Token::XmlText(text) = self.token.0.clone() { - let location = self.token_location(); - self.next_ie_xml_content(); - content.push(Rc::new(MxmlContent::Characters((unescape_xml(&text), location)))); - } else if self.consume_and_ie_xml_tag(Token::Lt) { - let start = self.token_location(); - let element = self.parse_mxml_element(start, namespace, encoding); - content.push(Rc::new(MxmlContent::Element(Rc::new(element)))); - } else if !until_eof { - self.non_greedy_expect_and_ie_xml_content(Token::XmlLtSlash); - if !self.tokenizer.characters().has_remaining() { - break; - } - } else if self.peek(Token::XmlLtSlash) { - self.add_syntax_error(&self.token_location(), DiagnosticKind::Expecting, diagarg![Token::Eof, self.token.0.clone()]); - self.next_ie_xml_tag(); - let _ = self.parse_xml_name(); - self.consume_and_ie_xml_tag(Token::XmlWhitespace); - self.non_greedy_expect_and_ie_xml_content(Token::Gt); - } - } - content - } - - fn parse_mxml(&mut self) -> Rc { - self.mark_location(); - let ns = Rc::new(MxmlNamespace::new(None)); - let mut encoding = "utf-8".to_owned(); - let mut content = self.parse_mxml_content(true, &ns, &mut encoding); - self.filter_mxml_whitespace_out(&mut content); - - let mut element_count = 0usize; - let mut character_count = 0usize; - - for node in content.iter() { - match node.as_ref() { - MxmlContent::Characters(_) | - MxmlContent::CData(_) => { - character_count += 1; - }, - MxmlContent::Element(_) => { - element_count += 1; - }, - _ => {}, - } - } - let location = self.pop_location(); - if element_count != 1 || character_count != 0 { - self.add_syntax_error(&location, DiagnosticKind::XmlMustConsistOfExactly1Element, vec![]); - } - Rc::new(Mxml { - location, - version: XmlVersion::Version10, - encoding, - content, - }) - } -} - -fn parse_include_directive_source(nested_compilation_unit: Rc, context: ParserDirectiveContext) -> (Vec>, Vec>) { - let mut parser = Parser::new(&nested_compilation_unit, &ParserOptions { - ..default() - }); - parser.next(); - let mut packages = vec![]; - if matches!(context, ParserDirectiveContext::TopLevel) { - while parser.peek(Token::Package) { - packages.push(parser.parse_package_definition()); - } - } - (packages, parser.parse_directives(context)) -} - -fn join_asdoc_content(content: &Vec<(String, Location)>) -> (String, Location) { - // Ignore first empty lines - let mut i = 0usize; - for content1 in content.iter() { - if content1.0.trim().is_empty() { - i += 1; - } else { - break; - } - } - - // Ignore last empty lines - let mut j = content.len(); - for content1 in content.iter().rev() { - if content1.0.trim().is_empty() { - j -= 1; - } else { - break; - } - } - - if i > j { - i = j; - } - - let s: Vec = content[i..j].iter().map(|c| c.0.clone()).collect(); - let s = s.join("\n").trim().to_owned(); - let location = if i == j { - content[i].1.clone() - } else { - content[i].1.combine_with(content[i..j].last().unwrap().1.clone()) - }; - (s, location) -} - -fn process_xml_pi(cu: &Rc, byte_range: (usize, usize), name: &str, encoding: &mut String) -> Vec { - if name != "xml" { - return vec![]; - } - let mut parser = Parser::new(&cu, &ParserOptions { - byte_range: Some(byte_range), - ..default() - }); - let mut errors = Vec::::new(); - parser.next_ie_xml_tag(); - while parser.consume_and_ie_xml_tag(Token::XmlWhitespace) { - if matches!(parser.token.0, Token::XmlName(_)) { - let name = parser.parse_xml_name(); - parser.consume_and_ie_xml_tag(Token::XmlWhitespace); - parser.expect_and_ie_xml_tag(Token::Assign); - parser.consume_and_ie_xml_tag(Token::XmlWhitespace); - let value = parser.parse_xml_attribute_value(); - match name.0.as_ref() { - "version" => { - if value.0 != "1.0" { - errors.push(XmlPiError::Version); - } - }, - "encoding" => { - let v = value.0.to_lowercase(); - if ["utf-8", "utf-16"].contains(&v.as_str()) { - *encoding = v; - } else { - errors.push(XmlPiError::Encoding); - } - }, - _ => { - errors.push(XmlPiError::UnknownAttribute(name.0.clone())); - }, - } - } else { - break; - } - } - parser.expect_eof(); - errors -} - -fn is_flex_documentable_meta_data(name: &str) -> bool { - ["Event", "SkinState"].contains(&name) -} - -enum XmlPiError { - UnknownAttribute(String), - Version, - Encoding, -} - -struct ParserAsDocLine { - content: String, - location: Location, -} - -#[derive(Clone)] -struct ParserActivation { - uses_yield: bool, - uses_await: bool, -} - -impl ParserActivation { - pub fn new() -> Self { - Self { - uses_yield: false, - uses_await: false, - } - } -} - -#[derive(Clone)] -struct AnnotatableContext { - start_location: Location, - asdoc: Option>, - attributes: Vec, - context: ParserDirectiveContext, - /// Previous token as a directive context keyword. - directive_context_keyword: Option<(String, Location)>, -} - -impl AnnotatableContext { - pub fn has_directive_context_keyword(&self, name: &str) -> bool { - if let Some((ref k, _)) = self.directive_context_keyword { - k == name - } else { - false - } - } -} - -struct PlainMxmlAttribute { - pub location: Location, - pub name: (String, Location), - pub value: (String, Location), -} - -/// A simplified interface for executing the parser. -pub struct ParserFacade<'input>(pub &'input Rc, pub ParserOptions); - -pub struct ParserOptions { - /// For MXML, indicates whether to ignore XML whitespace chunks when at - /// least one element appears. Default: true. - pub ignore_xml_whitespace: bool, - /// Indicates the range of characters that shall be parsed, - /// the first and last byte indices respectively. - pub byte_range: Option<(usize, usize)>, -} - -impl Default for ParserOptions { - fn default() -> Self { - Self { - ignore_xml_whitespace: true, - byte_range: None, - } - } -} - -impl<'input> ParserFacade<'input> { - fn create_parser(&self) -> Parser<'input> { - Parser::new(self.0, &self.1) - } - - /// Parses `Program` until end-of-file. - pub fn parse_program(&self) -> Rc { - let mut parser = self.create_parser(); - parser.next(); - parser.parse_program() - } - - /// Parses `ListExpression^allowIn` and expects end-of-file. - pub fn parse_expression(&self) -> Rc { - let mut parser = self.create_parser(); - parser.next(); - let exp = parser.parse_expression(ParserExpressionContext { - ..default() - }); - parser.expect_eof(); - exp - } - - /// Parses a qualified identifier and expects end-of-file. - pub fn parse_qualified_identifier(&self) -> QualifiedIdentifier { - let mut parser = self.create_parser(); - parser.next(); - let exp = parser.parse_qualified_identifier(); - parser.expect_eof(); - exp - } - - /// Parses `TypeExpression` and expects end-of-file. - pub fn parse_type_expression(&self) -> Rc { - let mut parser = self.create_parser(); - parser.next(); - let exp = parser.parse_type_expression(); - parser.expect_eof(); - exp - } - - /// Parses `Directives` until end-of-file. - pub fn parse_directives(&self, context: ParserDirectiveContext) -> Vec> { - let mut parser = self.create_parser(); - parser.next(); - parser.parse_directives(context) - } - - /// Parses `Mxml` until end-of-file. - pub fn parse_mxml(&self) -> Rc { - let mut parser = self.create_parser(); - parser.next_ie_xml_content(); - parser.parse_mxml() - } -} diff --git a/crates/parser/parser/parser_error.rs b/crates/parser/parser/parser_error.rs deleted file mode 100644 index 7921630..0000000 --- a/crates/parser/parser/parser_error.rs +++ /dev/null @@ -1,20 +0,0 @@ -use crate::ns::*; - -/// Indicates a fatal syntax error that leads the parser -/// to complete without a resulting node. -#[derive(Copy, Clone, Debug)] -pub enum ParserError { - Common, -} - -/// Returns the identifier name that is specially reserved -/// for invalidated identifiers that could not be parsed. -pub const INVALIDATED_IDENTIFIER: &'static str = "\x00"; - -#[derive(Clone)] -pub(crate) enum MetadataRefineError { - Syntax, -} - -#[derive(Clone)] -pub(crate) struct MetadataRefineError1(pub MetadataRefineError, pub Location); diff --git a/crates/parser/parser/reserved_word.rs b/crates/parser/parser/reserved_word.rs deleted file mode 100644 index 9a04596..0000000 --- a/crates/parser/parser/reserved_word.rs +++ /dev/null @@ -1,110 +0,0 @@ -use crate::ns::*; - -/// ActionScript reserved word validation. -pub struct As3ReservedWord; - -impl As3ReservedWord { - /// Checks if an *IdentifierName* is a reserved word. - pub fn test(name: &str) -> bool { - As3ReservedWord::token(name).is_some() - } - - /// Attempts to convert an *IdentifierName* into a reserved word token. - pub fn token(name: &str) -> Option { - match name.len() { - 1 => None, - 2 => { - match name { - "as" => Some(Token::As), - "do" => Some(Token::Do), - "if" => Some(Token::If), - "in" => Some(Token::In), - "is" => Some(Token::Is), - _ => None, - } - }, - 3 => { - match name { - "for" => Some(Token::For), - "new" => Some(Token::New), - "not" => Some(Token::Not), - "try" => Some(Token::Try), - "use" => Some(Token::Use), - "var" => Some(Token::Var), - _ => None, - } - }, - 4 => { - match name { - "case" => Some(Token::Case), - "else" => Some(Token::Else), - "null" => Some(Token::Null), - "this" => Some(Token::This), - "true" => Some(Token::True), - "void" => Some(Token::Void), - "with" => Some(Token::With), - _ => None, - } - }, - 5 => { - match name { - "await" => Some(Token::Await), - "break" => Some(Token::Break), - "catch" => Some(Token::Catch), - "class" => Some(Token::Class), - "const" => Some(Token::Const), - "false" => Some(Token::False), - "super" => Some(Token::Super), - "throw" => Some(Token::Throw), - "while" => Some(Token::While), - "yield" => Some(Token::Yield), - _ => None, - } - }, - 6 => { - match name { - "delete" => Some(Token::Delete), - "import" => Some(Token::Import), - "public" => Some(Token::Public), - "return" => Some(Token::Return), - "switch" => Some(Token::Switch), - "typeof" => Some(Token::Typeof), - _ => None, - } - }, - 7 => { - match name { - "default" => Some(Token::Default), - "extends" => Some(Token::Extends), - "finally" => Some(Token::Finally), - "package" => Some(Token::Package), - "private" => Some(Token::Private), - _ => None, - } - }, - 8 => { - match name { - "continue" => Some(Token::Continue), - "function" => Some(Token::Function), - "internal" => Some(Token::Internal), - _ => None, - } - }, - 9 => { - match name { - "interface" => Some(Token::Interface), - "protected" => Some(Token::Protected), - _ => None, - } - }, - 10 => { - match name { - "implements" => Some(Token::Implements), - "instanceof" => Some(Token::Instanceof), - _ => None, - } - }, - _ => None, - } - } -} \ No newline at end of file diff --git a/crates/parser/parser/token.rs b/crates/parser/parser/token.rs deleted file mode 100644 index f0913ae..0000000 --- a/crates/parser/parser/token.rs +++ /dev/null @@ -1,470 +0,0 @@ -use crate::ns::*; - -/// Represents a lexical token. -#[derive(Clone, PartialEq, Debug)] -pub enum Token { - Eof, - Identifier(String), - String(String), - /// Numeric literal token. - /// The numeric value is in character representation, which may be parsed - /// through data type specific methods such as [`NumericLiteral::parse_double()`]. - Number(String, NumberSuffix), - RegExp { - body: String, - flags: String, - }, - - CssNumber { - value: f64, - unit: Option, - }, - CssHashWord(String), - CssBeginsWith, - CssEndsWith, - CssContains, - CssListMatch, - CssHreflangMatch, - CssAtNamespace, - CssAtMedia, - CssAtFontFace, - CssImportant, - CssSemicolons, - - // Punctuator - ColonColon, - /// The `@` token. - Attribute, - /// The `..` token. - Descendants, - /// The `...` token. - Ellipsis, - ParenOpen, - ParenClose, - SquareOpen, - SquareClose, - BlockOpen, - BlockClose, - Dot, - Semicolon, - Comma, - Lt, - Gt, - /// `<=` - Le, - /// `>=` - Ge, - Equals, - NotEquals, - StrictEquals, - StrictNotEquals, - Plus, - Minus, - Times, - Div, - Percent, - Increment, - Decrement, - LeftShift, - RightShift, - UnsignedRightShift, - Ampersand, - Hat, - Pipe, - Tilde, - LogicalAnd, - LogicalXor, - LogicalOr, - Question, - Exclamation, - Colon, - Assign, - AddAssign, - SubtractAssign, - MultiplyAssign, - DivideAssign, - RemainderAssign, - LeftShiftAssign, - RightShiftAssign, - UnsignedRightShiftAssign, - BitwiseAndAssign, - BitwiseXorAssign, - BitwiseOrAssign, - LogicalAndAssign, - LogicalXorAssign, - LogicalOrAssign, - /// `**` - Power, - /// `**=` - PowerAssign, - /// `??` - NullCoalescing, - /// `??=` - NullCoalescingAssign, - /// `?.` - OptionalChaining, - - // Reserved words - As, - Await, - Break, - Case, - Catch, - Class, - Const, - Continue, - Default, - Delete, - Do, - Else, - Extends, - False, - Finally, - For, - Function, - If, - Implements, - Import, - In, - Instanceof, - Interface, - Internal, - Is, - New, - Not, - Null, - Package, - Private, - Protected, - Public, - Return, - Super, - Switch, - This, - Throw, - True, - Try, - Typeof, - Use, - Var, - Void, - While, - With, - Yield, - - XmlWhitespace, - XmlLtSlash, - XmlSlashGt, - XmlText(String), - XmlName(String), - XmlMarkup(String), - XmlAttributeValue(String), -} - -impl ToString for Token { - /// Converts the token into a readable string. - /// - /// The method `Token::to_string` returns the following possible values: - /// - /// * `"end of program"` - /// * `"identifier"` - /// * `"string"` for string literal - /// * `"number"` for numeric literal - /// * `"regular expression"` for regular expression literal - /// * `"'keyword'"` for reserved words - /// * `"'punctuator'"` for various punctuators - /// * `"punctuator"` for various punctuators - /// * `"XML whitespace"` - /// * `"''"` - /// * `"XML text"` - /// * `"XML name"` - /// * `"XML markup"` - /// * `"XML attribute value"` - fn to_string(&self) -> String { - (match self { - Token::Eof => "end-of-file", - Token::Identifier(_) => "identifier", - Token::String(_) => "string", - Token::Number(_, _) => "number", - Token::RegExp { .. } => "regular expression", - - Token::CssNumber { .. } => "number", - Token::CssHashWord(_) => "hash-word", - Token::CssBeginsWith => "'^='", - Token::CssEndsWith => "'$='", - Token::CssContains => "'*='", - Token::CssListMatch => "'~='", - Token::CssHreflangMatch => "'|='", - Token::CssAtNamespace => "at-namespace", - Token::CssAtMedia => "at-media", - Token::CssAtFontFace => "at-font-face", - Token::CssImportant => "'!important'", - Token::CssSemicolons => "semicolon", - - // Punctuators - Token::ColonColon => "colon-colon", - Token::Attribute => "'@'", - Token::Descendants => "'..'", - Token::Ellipsis => "'...'", - Token::ParenOpen => "paren-open", - Token::ParenClose => "paren-close", - Token::SquareOpen => "square-open", - Token::SquareClose => "square-close", - Token::BlockOpen => "block-open", - Token::BlockClose => "block-close", - Token::Dot => "dot", - Token::Semicolon => "semicolon", - Token::Comma => "comma", - Token::Lt => "less-than", - Token::Gt => "greater-than", - Token::Le => "'<='", - Token::Ge => "'>='", - Token::Equals => "'=='", - Token::NotEquals => "'!='", - Token::StrictEquals => "'==='", - Token::StrictNotEquals => "'!=='", - Token::Plus => "plus", - Token::Minus => "minus", - Token::Times => "times", - Token::Div => "slash", - Token::Percent => "percent", - Token::Increment => "'++'", - Token::Decrement => "'--'", - Token::LeftShift => "'<<'", - Token::RightShift => "'>>'", - Token::UnsignedRightShift => "'>>>'", - Token::Ampersand => "ampersand", - Token::Hat => "hat", - Token::Pipe => "pipe", - Token::Tilde => "tilde", - Token::LogicalAnd => "'&&'", - Token::LogicalXor => "'^^'", - Token::LogicalOr => "'||'", - Token::Question => "question-mark", - Token::Exclamation => "exclamation-mark", - Token::Colon => "colon", - Token::Assign => "'='", - Token::AddAssign => "'+='", - Token::SubtractAssign => "'-='", - Token::MultiplyAssign => "'*='", - Token::DivideAssign => "'/='", - Token::RemainderAssign => "'%='", - Token::LeftShiftAssign => "'<<='", - Token::RightShiftAssign => "'>>='", - Token::UnsignedRightShiftAssign => "'>>>='", - Token::BitwiseAndAssign => "'&='", - Token::BitwiseXorAssign => "'^='", - Token::BitwiseOrAssign => "'|='", - Token::LogicalAndAssign => "'&&='", - Token::LogicalXorAssign => "'^^='", - Token::LogicalOrAssign => "'||='", - Token::Power => "'**'", - Token::PowerAssign => "'**='", - Token::NullCoalescing => "'??'", - Token::NullCoalescingAssign => "'??='", - Token::OptionalChaining => "'?.'", - - // Reserved words - Token::As => "'as'", - Token::Await => "'await'", - Token::Break => "'break'", - Token::Case => "'case'", - Token::Catch => "'catch'", - Token::Class => "'class'", - Token::Const => "'const'", - Token::Continue => "'continue'", - Token::Default => "'default'", - Token::Delete => "'delete'", - Token::Do => "'do'", - Token::Else => "'else'", - Token::Extends => "'extends'", - Token::False => "'false'", - Token::Finally => "'finally'", - Token::For => "'for'", - Token::Function => "'function'", - Token::If => "'if'", - Token::Implements => "'implements'", - Token::Import => "'import'", - Token::In => "'in'", - Token::Instanceof => "'instanceof'", - Token::Interface => "'interface'", - Token::Internal => "'internal'", - Token::Is => "'is'", - Token::New => "'new'", - Token::Not => "'not'", - Token::Null => "'null'", - Token::Package => "'package'", - Token::Private => "'private'", - Token::Protected => "'protected'", - Token::Public => "'public'", - Token::Return => "'return'", - Token::Super => "'super'", - Token::Switch => "'switch'", - Token::This => "'this'", - Token::Throw => "'throw'", - Token::True => "'true'", - Token::Try => "'try'", - Token::Typeof => "'typeof'", - Token::Use => "'use'", - Token::Var => "'var'", - Token::Void => "'void'", - Token::While => "'while'", - Token::With => "'with'", - Token::Yield => "'yield'", - - Token::XmlWhitespace => "XML whitespace", - Token::XmlLtSlash => "' "'/>'", - Token::XmlText(_) => "XML text", - Token::XmlName(_) => "XML name", - Token::XmlMarkup(_) => "XML markup", - Token::XmlAttributeValue(_) => "XML attribute value", - }).into() - } -} - -impl Token { - pub fn is_context_keyword(token: &(Token, Location), keyword: &str) -> bool { - if let Token::Identifier(name) = &token.0 { - name == keyword && token.1.character_count() == name.len() - } else { - false - } - } - - /// Indicates whether the token is a reserved word. - pub fn is_reserved_word(&self) -> bool { - self.reserved_word_name().is_some() - } - - pub fn is_identifier_name(&self) -> bool { - matches!(self, Token::Identifier(_)) || self.is_reserved_word() - } - - /// Tests whether the token is a reserved word and returns - /// its *IdentifierName* string. - pub fn reserved_word_name(&self) -> Option { - match *self { - Token::As => Some("as".into()), - Token::Await => Some("await".into()), - Token::Break => Some("break".into()), - Token::Case => Some("case".into()), - Token::Catch => Some("catch".into()), - Token::Class => Some("class".into()), - Token::Const => Some("const".into()), - Token::Continue => Some("continue".into()), - Token::Default => Some("default".into()), - Token::Delete => Some("delete".into()), - Token::Do => Some("do".into()), - Token::Else => Some("else".into()), - Token::Extends => Some("extends".into()), - Token::False => Some("false".into()), - Token::Finally => Some("finally".into()), - Token::For => Some("for".into()), - Token::Function => Some("function".into()), - Token::If => Some("if".into()), - Token::Implements => Some("implements".into()), - Token::Import => Some("import".into()), - Token::In => Some("in".into()), - Token::Instanceof => Some("instanceof".into()), - Token::Interface => Some("interface".into()), - Token::Internal => Some("internal".into()), - Token::Is => Some("is".into()), - Token::New => Some("new".into()), - Token::Not => Some("not".into()), - Token::Null => Some("null".into()), - Token::Package => Some("package".into()), - Token::Private => Some("private".into()), - Token::Protected => Some("protected".into()), - Token::Public => Some("public".into()), - Token::Return => Some("return".into()), - Token::Super => Some("super".into()), - Token::Switch => Some("switch".into()), - Token::This => Some("this".into()), - Token::Throw => Some("throw".into()), - Token::True => Some("true".into()), - Token::Try => Some("try".into()), - Token::Typeof => Some("typeof".into()), - Token::Use => Some("use".into()), - Token::Var => Some("var".into()), - Token::Void => Some("void".into()), - Token::While => Some("while".into()), - Token::With => Some("with".into()), - Token::Yield => Some("yield".into()), - _ => None, - } - } - - /// Converts a compound assignment, a logical assignment, or a nullish coalescing assignment to an *Operator* value. - pub fn compound_assignment(&self) -> Option { - match self { - Self::AddAssign => Some(Operator::Add), - Self::SubtractAssign => Some(Operator::Subtract), - Self::MultiplyAssign => Some(Operator::Multiply), - Self::DivideAssign => Some(Operator::Divide), - Self::RemainderAssign => Some(Operator::Remainder), - Self::PowerAssign => Some(Operator::Power), - Self::LeftShiftAssign => Some(Operator::ShiftLeft), - Self::RightShiftAssign => Some(Operator::ShiftRight), - Self::UnsignedRightShiftAssign => Some(Operator::ShiftRightUnsigned), - Self::BitwiseAndAssign => Some(Operator::BitwiseAnd), - Self::BitwiseXorAssign => Some(Operator::BitwiseXor), - Self::BitwiseOrAssign => Some(Operator::BitwiseOr), - Self::LogicalAndAssign => Some(Operator::LogicalAnd), - Self::LogicalXorAssign => Some(Operator::LogicalXor), - Self::LogicalOrAssign => Some(Operator::LogicalOr), - Self::NullCoalescingAssign => Some(Operator::NullCoalescing), - _ => None, - } - } - - /// Converts this token into a binary operator, excluding - /// `not in`, and `is not`. - pub fn to_binary_operator(&self) -> Option { - match self { - Self::Times => Some(Operator::Multiply), - Self::Div => Some(Operator::Divide), - Self::Percent => Some(Operator::Remainder), - Self::Plus => Some(Operator::Add), - Self::Minus => Some(Operator::Subtract), - Self::LeftShift => Some(Operator::ShiftLeft), - Self::RightShift => Some(Operator::ShiftRight), - Self::UnsignedRightShift => Some(Operator::ShiftRightUnsigned), - Self::Lt => Some(Operator::Lt), - Self::Gt => Some(Operator::Gt), - Self::Le => Some(Operator::Le), - Self::Ge => Some(Operator::Ge), - Self::As => Some(Operator::As), - Self::In => Some(Operator::In), - Self::Is => Some(Operator::Is), - Self::Instanceof => Some(Operator::Instanceof), - Self::Equals => Some(Operator::Equals), - Self::NotEquals => Some(Operator::NotEquals), - Self::StrictEquals => Some(Operator::StrictEquals), - Self::StrictNotEquals => Some(Operator::StrictNotEquals), - Self::Ampersand => Some(Operator::BitwiseAnd), - Self::Hat => Some(Operator::BitwiseXor), - Self::Pipe => Some(Operator::BitwiseOr), - Self::LogicalAnd => Some(Operator::LogicalAnd), - Self::LogicalXor => Some(Operator::LogicalXor), - Self::LogicalOr => Some(Operator::LogicalOr), - Self::NullCoalescing => Some(Operator::NullCoalescing), - Self::Power => Some(Operator::Power), - _ => None, - } - } - - pub(crate) fn to_attribute(&self, location: &Location) -> Option { - match self { - Self::Public => Some(Attribute::Public(location.clone())), - Self::Private => Some(Attribute::Private(location.clone())), - Self::Protected => Some(Attribute::Protected(location.clone())), - Self::Internal => Some(Attribute::Internal(location.clone())), - Self::Identifier(ref name) => { - Attribute::from_identifier_name(name, &location) - }, - _ => None, - } - } -} \ No newline at end of file diff --git a/crates/parser/parser/tokenizer.rs b/crates/parser/parser/tokenizer.rs deleted file mode 100644 index fb43f34..0000000 --- a/crates/parser/parser/tokenizer.rs +++ /dev/null @@ -1,1305 +0,0 @@ -use crate::ns::*; - -pub struct Tokenizer<'input> { - compilation_unit: Rc, - characters: CharacterReader<'input>, -} - -impl<'input> Tokenizer<'input> { - /// Constructs a tokenizer. - pub fn new(compilation_unit: &'input Rc, options: &ParserOptions) -> Self { - let text: &'input str = compilation_unit.text(); - let compilation_unit = compilation_unit.clone(); - let characters: CharacterReader<'input>; - if let Some(range) = options.byte_range { - characters = CharacterReader::from_offset(&text[0..range.1], range.0); - } else { - characters = CharacterReader::from(text); - } - Self { - compilation_unit, - characters, - } - } - - pub fn compilation_unit(&self) -> &Rc { - &self.compilation_unit - } - - pub fn characters(&self) -> &CharacterReader<'input> { - &self.characters - } - - fn add_syntax_error(&self, location: &Location, kind: DiagnosticKind, arguments: Vec>) { - if self.compilation_unit.prevent_equal_offset_error(location) { - return; - } - self.compilation_unit.add_diagnostic(Diagnostic::new_syntax_error(location, kind, arguments)); - } - - /// Scans for an *InputElementDiv* token. - pub fn scan_ie_div(&mut self) -> (Token, Location) { - loop { - let ch = self.characters.peek_or_zero(); - if CharacterValidator::is_whitespace(ch) { - self.characters.next(); - } else if self.consume_line_terminator() || self.consume_comment() { - // Consumed line terminator or comment - } else { - break; - } - } - if let Some(result) = self.scan_identifier() { - return result; - } - if let Some(result) = self.scan_dot_or_numeric_literal() { - return result; - } - if let Some(result) = self.scan_string_literal(false) { - return result; - } - let start = self.cursor_location(); - match self.characters.peek_or_zero() { - ',' => { - // Comma - self.characters.next(); - let location = start.combine_with(self.cursor_location()); - return (Token::Comma, location); - }, - '(' => { - // ParenOpen - self.characters.next(); - let location = start.combine_with(self.cursor_location()); - return (Token::ParenOpen, location); - }, - ')' => { - // ParenClose - self.characters.next(); - let location = start.combine_with(self.cursor_location()); - return (Token::ParenClose, location); - }, - '[' => { - // SquareOpen - self.characters.next(); - let location = start.combine_with(self.cursor_location()); - return (Token::SquareOpen, location); - }, - ']' => { - // SquareClose - self.characters.next(); - let location = start.combine_with(self.cursor_location()); - return (Token::SquareClose, location); - }, - '{' => { - // BlockOpen - self.characters.next(); - let location = start.combine_with(self.cursor_location()); - return (Token::BlockOpen, location); - }, - '}' => { - // BlockClose - self.characters.next(); - let location = start.combine_with(self.cursor_location()); - return (Token::BlockClose, location); - }, - ':' => { - self.characters.next(); - // ColonColon - if self.characters.peek_or_zero() == ':' { - self.characters.next(); - let location = start.combine_with(self.cursor_location()); - return (Token::ColonColon, location); - } - // Colon - let location = start.combine_with(self.cursor_location()); - return (Token::Colon, location); - }, - '=' => { - self.characters.next(); - let ch = self.characters.peek_or_zero(); - // StrictEquals - if ch == '=' && self.characters.peek_at_or_zero(1) == '=' { - self.characters.skip_count_in_place(2); - let location = start.combine_with(self.cursor_location()); - return (Token::StrictEquals, location); - } - // Equals - if ch == '=' { - self.characters.next(); - let location = start.combine_with(self.cursor_location()); - return (Token::Equals, location); - } - // Assign - let location = start.combine_with(self.cursor_location()); - return (Token::Assign, location); - }, - '!' => { - self.characters.next(); - let ch = self.characters.peek_or_zero(); - // StrictNotEquals - if ch == '=' && self.characters.peek_at_or_zero(1) == '=' { - self.characters.skip_count_in_place(2); - let location = start.combine_with(self.cursor_location()); - return (Token::StrictNotEquals, location); - } - // NotEquals - if ch == '=' { - self.characters.next(); - let location = start.combine_with(self.cursor_location()); - return (Token::NotEquals, location); - } - // Exclamation - let location = start.combine_with(self.cursor_location()); - return (Token::Exclamation, location); - }, - '?' => { - self.characters.next(); - let ch = self.characters.peek_or_zero(); - // OptionalChaining - if ch == '.' { - self.characters.next(); - let location = start.combine_with(self.cursor_location()); - return (Token::OptionalChaining, location); - } - // NullCoalescingAssign - if ch == '?' && self.characters.peek_at_or_zero(1) == '=' { - self.characters.skip_count_in_place(2); - let location = start.combine_with(self.cursor_location()); - return (Token::NullCoalescingAssign, location); - } - // NullCoalescing - if ch == '?' { - self.characters.next(); - let location = start.combine_with(self.cursor_location()); - return (Token::NullCoalescing, location); - } - // Question - let location = start.combine_with(self.cursor_location()); - return (Token::Question, location); - }, - ';' => { - // Semicolon - self.characters.next(); - let location = start.combine_with(self.cursor_location()); - return (Token::Semicolon, location); - }, - '<' => { - self.characters.next(); - let ch = self.characters.peek_or_zero(); - // Le - if ch == '=' { - self.characters.next(); - let location = start.combine_with(self.cursor_location()); - return (Token::Le, location); - } - // LeftShiftAssign - if ch == '<' && self.characters.peek_at_or_zero(1) == '=' { - self.characters.skip_count_in_place(2); - let location = start.combine_with(self.cursor_location()); - return (Token::LeftShiftAssign, location); - } - // LeftShift - if ch == '<' { - self.characters.next(); - let location = start.combine_with(self.cursor_location()); - return (Token::LeftShift, location); - } - // Lt - let location = start.combine_with(self.cursor_location()); - return (Token::Lt, location); - }, - '>' => { - self.characters.next(); - let ch = self.characters.peek_or_zero(); - // Ge - if ch == '=' { - self.characters.next(); - let location = start.combine_with(self.cursor_location()); - return (Token::Ge, location); - } - // RightShiftAssign - if ch == '>' && self.characters.peek_at_or_zero(1) == '=' { - self.characters.skip_count_in_place(2); - let location = start.combine_with(self.cursor_location()); - return (Token::RightShiftAssign, location); - } - // UnsignedRightShiftAssign - if ch == '>' && self.characters.peek_seq(3) == ">>=" { - self.characters.skip_count_in_place(3); - let location = start.combine_with(self.cursor_location()); - return (Token::UnsignedRightShiftAssign, location); - } - // UnsignedRightShift - if ch == '>' && self.characters.peek_at_or_zero(1) == '>' { - self.characters.skip_count_in_place(2); - let location = start.combine_with(self.cursor_location()); - return (Token::UnsignedRightShift, location); - } - // RightShift - if ch == '>' { - self.characters.next(); - let location = start.combine_with(self.cursor_location()); - return (Token::RightShift, location); - } - // Gt - let location = start.combine_with(self.cursor_location()); - return (Token::Gt, location); - }, - '@' => { - // Attribute - self.characters.next(); - if let Some(token) = self.scan_string_literal(true) { - return token; - } - let location = start.combine_with(self.cursor_location()); - return (Token::Attribute, location); - }, - '+' => { - self.characters.next(); - let ch = self.characters.peek_or_zero(); - // Increment - if ch == '+' { - self.characters.next(); - let location = start.combine_with(self.cursor_location()); - return (Token::Increment, location); - } - // AddAssign - if ch == '=' { - self.characters.next(); - let location = start.combine_with(self.cursor_location()); - return (Token::AddAssign, location); - } - // Plus - let location = start.combine_with(self.cursor_location()); - return (Token::Plus, location); - }, - '-' => { - self.characters.next(); - let ch = self.characters.peek_or_zero(); - // Decrement - if ch == '-' { - self.characters.next(); - let location = start.combine_with(self.cursor_location()); - return (Token::Decrement, location); - } - // SubtractAssign - if ch == '=' { - self.characters.next(); - let location = start.combine_with(self.cursor_location()); - return (Token::SubtractAssign, location); - } - // Minus - let location = start.combine_with(self.cursor_location()); - return (Token::Minus, location); - }, - '*' => { - self.characters.next(); - let ch = self.characters.peek_or_zero(); - // PowerAssign - if ch == '*' && self.characters.peek_at_or_zero(1) == '=' { - self.characters.skip_count_in_place(2); - let location = start.combine_with(self.cursor_location()); - return (Token::PowerAssign, location); - } - // Power - if ch == '*' { - self.characters.next(); - let location = start.combine_with(self.cursor_location()); - return (Token::Power, location); - } - // MultiplyAssign - if ch == '=' { - self.characters.next(); - let location = start.combine_with(self.cursor_location()); - return (Token::MultiplyAssign, location); - } - // Times - let location = start.combine_with(self.cursor_location()); - return (Token::Times, location); - }, - '/' => { - self.characters.next(); - let ch = self.characters.peek_or_zero(); - // DivideAssign - if ch == '=' { - self.characters.next(); - let location = start.combine_with(self.cursor_location()); - return (Token::DivideAssign, location); - } - // Div - let location = start.combine_with(self.cursor_location()); - return (Token::Div, location); - }, - '%' => { - self.characters.next(); - let ch = self.characters.peek_or_zero(); - // RemainderAssign - if ch == '=' { - self.characters.next(); - let location = start.combine_with(self.cursor_location()); - return (Token::RemainderAssign, location); - } - // Percent - let location = start.combine_with(self.cursor_location()); - return (Token::Percent, location); - }, - '&' => { - self.characters.next(); - let ch = self.characters.peek_or_zero(); - // LogicalAndAssign - if ch == '&' && self.characters.peek_at_or_zero(1) == '=' { - self.characters.skip_count_in_place(2); - let location = start.combine_with(self.cursor_location()); - return (Token::LogicalAndAssign, location); - } - // LogicalAnd - if ch == '&' { - self.characters.next(); - let location = start.combine_with(self.cursor_location()); - return (Token::LogicalAnd, location); - } - // BitwiseAndAssign - if ch == '=' { - self.characters.next(); - let location = start.combine_with(self.cursor_location()); - return (Token::BitwiseAndAssign, location); - } - // BitwiseAnd - let location = start.combine_with(self.cursor_location()); - return (Token::Ampersand, location); - }, - '^' => { - self.characters.next(); - let ch = self.characters.peek_or_zero(); - // LogicalXorAssign - if ch == '^' && self.characters.peek_at_or_zero(1) == '=' { - self.characters.skip_count_in_place(2); - let location = start.combine_with(self.cursor_location()); - return (Token::LogicalXorAssign, location); - } - // LogicalXor - if ch == '^' { - self.characters.next(); - let location = start.combine_with(self.cursor_location()); - return (Token::LogicalXor, location); - } - // BitwiseXorAssign - if ch == '=' { - self.characters.next(); - let location = start.combine_with(self.cursor_location()); - return (Token::BitwiseXorAssign, location); - } - // BitwiseXor - let location = start.combine_with(self.cursor_location()); - return (Token::Hat, location); - }, - '|' => { - self.characters.next(); - let ch = self.characters.peek_or_zero(); - // LogicalOrAssign - if ch == '|' && self.characters.peek_at_or_zero(1) == '=' { - self.characters.skip_count_in_place(2); - let location = start.combine_with(self.cursor_location()); - return (Token::LogicalOrAssign, location); - } - // LogicalOr - if ch == '|' { - self.characters.next(); - let location = start.combine_with(self.cursor_location()); - return (Token::LogicalOr, location); - } - // BitwiseOrAssign - if ch == '=' { - self.characters.next(); - let location = start.combine_with(self.cursor_location()); - return (Token::BitwiseOrAssign, location); - } - // BitwiseOr - let location = start.combine_with(self.cursor_location()); - return (Token::Pipe, location); - }, - '~' => { - // BitwiseNot - self.characters.next(); - let location = start.combine_with(self.cursor_location()); - return (Token::Tilde, location); - }, - _ => { - if self.characters.has_remaining() { - self.add_unexpected_error(); - self.characters.next(); - return self.scan_ie_div(); - // Eof - } else { - return (Token::Eof, start) - } - }, - } - } - - /// Scans regular expression after a `/` or `/=` token has been scanned by - /// `scan_ie_div`. - pub fn scan_regexp_literal(&mut self, start: Location, mut body: String) -> (Token, Location) { - loop { - let ch = self.characters.peek_or_zero(); - if ch == '/' { - self.characters.next(); - break; - } else if ch == '\\' { - self.characters.next(); - body.push('\\'); - let ch = self.characters.peek_or_zero(); - if self.characters.reached_end() { - self.add_unexpected_eof_error(DiagnosticKind::InputEndedBeforeReachingClosingSlashForRegExp); - break; - } else if CharacterValidator::is_line_terminator(ch) { - self.add_unexpected_error(); - self.consume_line_terminator(); - } else { - self.characters.next(); - body.push(ch); - } - } else if CharacterValidator::is_line_terminator(ch) { - body.push('\n'); - self.consume_line_terminator(); - } else if self.characters.reached_end() { - self.add_unexpected_eof_error(DiagnosticKind::InputEndedBeforeReachingClosingSlashForRegExp); - break; - } else { - body.push(ch); - self.characters.next(); - } - } - - let mut flags = String::new(); - while let Some((ch, _)) = self.consume_identifier_part() { - flags.push(ch); - } - - let location = start.combine_with(self.cursor_location()); - (Token::RegExp { body, flags }, location) - } - - fn character_ahead_location(&self) -> Location { - if self.characters.reached_end() { - return self.cursor_location(); - } - let offset = self.characters.index(); - let mut next_characters = self.characters.clone(); - next_characters.next().unwrap(); - Location::with_offsets(&self.compilation_unit, offset, next_characters.index()) - } - - pub fn cursor_location(&self) -> Location { - let offset = self.characters.index(); - Location::with_offset(&self.compilation_unit, offset) - } - - fn add_unexpected_error(&self) { - if self.characters.has_remaining() { - self.add_syntax_error(&self.character_ahead_location(), DiagnosticKind::UnexpectedCharacter, diagarg![self.characters.peek_or_zero().to_string()]) - } else { - self.add_syntax_error(&self.cursor_location(), DiagnosticKind::UnexpectedEnd, vec![]) - } - } - - fn add_unexpected_eof_error(&self, kind: DiagnosticKind) { - self.add_syntax_error(&self.cursor_location(), kind, vec![]); - } - - // LineTerminator - fn consume_line_terminator(&mut self) -> bool { - let ch = self.characters.peek_or_zero(); - if ch == '\x0D' && self.characters.peek_at_or_zero(1) == '\x0A' { - self.characters.skip_count_in_place(2); - // self.line_number += 1; - return true; - } - if CharacterValidator::is_line_terminator(ch) { - self.characters.next(); - // self.line_number += 1; - return true; - } - false - } - - fn consume_comment(&mut self) -> bool { - let ch = self.characters.peek_or_zero(); - if ch != '/' { - return false; - } - let ch2 = self.characters.peek_at_or_zero(1); - if ch2 == '/' { - let start = self.cursor_location(); - self.characters.skip_count_in_place(2); - while !CharacterValidator::is_line_terminator(self.characters.peek_or_zero()) && self.characters.has_remaining() { - self.characters.skip_in_place(); - } - let location = start.combine_with(self.cursor_location()); - self.consume_line_terminator(); - - self.compilation_unit.add_comment(Rc::new(Comment { - multiline: false, - content: RefCell::new(self.compilation_unit.text()[(location.first_offset() + 2)..location.last_offset()].to_owned()), - location: RefCell::new(location), - })); - - return true; - } - if ch2 == '*' { - let start = self.cursor_location(); - self.characters.skip_count_in_place(2); - - loop { - if self.characters.peek_or_zero() == '*' && self.characters.peek_at_or_zero(1) == '/' { - self.characters.skip_count_in_place(2); - break; - } else if self.consume_line_terminator() { - // Consumed LineTerminator - } else if self.characters.has_remaining() { - self.characters.skip_in_place(); - } else { - self.add_unexpected_eof_error(DiagnosticKind::InputEndedBeforeReachingClosingSeqForMultiLineComment); - break; - } - } - - let location = start.combine_with(self.cursor_location()); - - let i = location.first_offset() + 2; - let j = decrease_last_offset(i, location.last_offset(), 2); - - self.compilation_unit.add_comment(Rc::new(Comment { - multiline: true, - content: RefCell::new(self.compilation_unit.text()[i..j].to_owned()), - location: RefCell::new(location), - })); - - return true; - } - false - } - - fn scan_identifier(&mut self) -> Option<(Token, Location)> { - let start = self.cursor_location(); - let mut escaped = false; - let Some((ch, escaped_2)) = self.consume_identifier_start() else { - return None; - }; - escaped = escaped || escaped_2; - let mut name = String::new(); - name.push(ch); - while let Some((ch, escaped_2)) = self.consume_identifier_part() { - escaped = escaped || escaped_2; - name.push(ch); - } - - let location = start.combine_with(self.cursor_location()); - if !escaped { - if let Some(token) = As3ReservedWord::token(name.as_ref()) { - return Some((token, location)); - } - } - Some((Token::Identifier(name), location)) - } - - /// Returns a tuple in the form (*character*, *escaped*). - fn consume_identifier_start(&mut self) -> Option<(char, bool)> { - let ch = self.characters.peek_or_zero(); - if CharacterValidator::is_identifier_start(ch) { - self.characters.next(); - return Some((ch, false)); - } - if self.characters.peek_or_zero() == '\\' { - self.characters.next(); - return Some((self.expect_unicode_escape_sequence(), true)); - } - None - } - - /// Returns a tuple in the form (*character*, *escaped*). - fn consume_identifier_part(&mut self) -> Option<(char, bool)> { - let ch = self.characters.peek_or_zero(); - if CharacterValidator::is_identifier_part(ch) { - self.characters.next(); - return Some((ch, false)); - } - if self.characters.peek_or_zero() == '\\' { - self.characters.next(); - return Some((self.expect_unicode_escape_sequence(), true)); - } - None - } - - /// Expects UnicodeEscapeSequence starting from `u`. - fn expect_unicode_escape_sequence(&mut self) -> char { - let start = self.cursor_location(); - if self.characters.peek_or_zero() != 'u' { - self.add_unexpected_error(); - return '\x5F'; - } - self.characters.next(); - - // Scan \uXXXX - if CharacterValidator::is_hex_digit(self.characters.peek_or_zero()) { - let r = char::from_u32(self.expect_hex_digit() << 12 - | (self.expect_hex_digit() << 8) - | (self.expect_hex_digit() << 4) - | self.expect_hex_digit()); - let Some(r) = r else { - self.add_syntax_error(&start.combine_with(self.cursor_location()), DiagnosticKind::InvalidEscapeValue, vec![]); - return '\x5F'; - }; - return r; - } - - // Scan \u{} - if self.characters.peek_or_zero() != '{' { - self.add_unexpected_error(); - return '\x5F'; - } - self.characters.next(); - while CharacterValidator::is_hex_digit(self.characters.peek_or_zero()) { - self.characters.next(); - } - if self.characters.peek_or_zero() != '}' { - self.add_unexpected_error(); - return '\x5F'; - } - self.characters.next(); - let location = start.combine_with(self.cursor_location()); - let r = u32::from_str_radix(&self.compilation_unit.text()[(start.first_offset + 2)..(location.last_offset - 1)], 16); - let Ok(r) = r else { - self.add_syntax_error(&location, DiagnosticKind::InvalidEscapeValue, vec![]); - return '\x5F'; - }; - let r = char::from_u32(r); - let Some(r) = r else { - self.add_syntax_error(&location, DiagnosticKind::InvalidEscapeValue, vec![]); - return '\x5F'; - }; - r - } - - fn expect_hex_digit(&mut self) -> u32 { - let ch = self.characters.peek_or_zero(); - let mv = CharacterValidator::hex_digit_mv(ch); - if mv.is_none() { - self.add_unexpected_error(); - return 0x5F; - } - self.characters.next(); - mv.unwrap() - } - - fn scan_dot_or_numeric_literal(&mut self) -> Option<(Token, Location)> { - let start = self.cursor_location(); - let ch = self.characters.peek_or_zero(); - let mut initial_dot = false; - if ch == '.' { - initial_dot = true; - self.characters.next(); - - let seq = self.characters.peek_seq(2); - // Ellipsis - if seq == ".." { - self.characters.skip_count_in_place(2); - return Some((Token::Ellipsis, start.combine_with(self.cursor_location()))); - } - let ch = seq.get(..1).map(|ch| ch.chars().next().unwrap()).unwrap_or('\x00'); - // Descendants - if ch == '.' { - self.characters.next(); - return Some((Token::Descendants, start.combine_with(self.cursor_location()))); - } - // Dot - if !CharacterValidator::is_dec_digit(ch) { - return Some((Token::Dot, start.combine_with(self.cursor_location()))); - } - - // NumericLiteral - while CharacterValidator::is_dec_digit(self.characters.peek_or_zero()) { - self.characters.next(); - self.consume_underscore_followed_by_dec_digit(); - } - } else if ch == '0' { - self.characters.next(); - let ch_2 = self.characters.peek_or_zero(); - - // HexLiteral - if ['X', 'x'].contains(&ch_2) { - self.characters.next(); - return self.scan_hex_literal(start.clone()); - } - - // BinLiteral; - if ['B', 'b'].contains(&ch_2) { - self.characters.next(); - return self.scan_bin_literal(start.clone()); - } - } else if CharacterValidator::is_dec_digit(ch) { - while CharacterValidator::is_dec_digit(self.characters.peek_or_zero()) { - self.characters.next(); - self.consume_underscore_followed_by_dec_digit(); - } - } else { - return None; - } - - if !initial_dot && self.characters.peek_or_zero() == '.' { - self.characters.next(); - if !CharacterValidator::is_dec_digit(self.characters.peek_or_zero()) { - self.add_unexpected_error(); - } - while CharacterValidator::is_dec_digit(self.characters.peek_or_zero()) { - self.characters.next(); - self.consume_underscore_followed_by_dec_digit(); - } - } - - // Decimal exponent - if ['E', 'e'].contains(&self.characters.peek_or_zero()) { - self.characters.next(); - if ['+', '-'].contains(&self.characters.peek_or_zero()) { - self.characters.next(); - } - if !CharacterValidator::is_dec_digit(self.characters.peek_or_zero()) { - self.add_unexpected_error(); - } - while CharacterValidator::is_dec_digit(self.characters.peek_or_zero()) { - self.characters.next(); - self.consume_underscore_followed_by_dec_digit(); - } - } - - let string = self.compilation_unit.text()[start.first_offset..self.characters.index()].to_owned(); - - let mut suffix = NumberSuffix::None; - if self.characters.peek_or_zero() == 'f' || self.characters.peek_or_zero() == 'F' { - suffix = NumberSuffix::F; - self.characters.next(); - } - self.unallow_numeric_suffix(); - - let location = start.combine_with(self.cursor_location()); - - Some((Token::Number(string, suffix), location)) - } - - fn scan_hex_literal(&mut self, start: Location) -> Option<(Token, Location)> { - if !CharacterValidator::is_hex_digit(self.characters.peek_or_zero()) { - self.add_unexpected_error(); - } - while CharacterValidator::is_hex_digit(self.characters.peek_or_zero()) { - self.characters.next(); - self.consume_underscore_followed_by_hex_digit(); - } - - let suffix = NumberSuffix::None; - self.unallow_numeric_suffix(); - - let location = start.combine_with(self.cursor_location()); - let s = self.compilation_unit.text()[location.first_offset..location.last_offset].to_owned(); - Some((Token::Number(s, suffix), location)) - } - - fn scan_bin_literal(&mut self, start: Location) -> Option<(Token, Location)> { - if !CharacterValidator::is_bin_digit(self.characters.peek_or_zero()) { - self.add_unexpected_error(); - } - while CharacterValidator::is_bin_digit(self.characters.peek_or_zero()) { - self.characters.next(); - self.consume_underscore_followed_by_bin_digit(); - } - - let suffix = NumberSuffix::None; - self.unallow_numeric_suffix(); - - let location = start.combine_with(self.cursor_location()); - let s = self.compilation_unit.text()[location.first_offset..location.last_offset].to_owned(); - Some((Token::Number(s, suffix), location)) - } - - fn consume_underscore_followed_by_dec_digit(&mut self) { - if self.characters.peek_or_zero() == '_' { - self.characters.next(); - if !CharacterValidator::is_dec_digit(self.characters.peek_or_zero()) { - self.add_unexpected_error(); - } - self.characters.next(); - } - } - - fn consume_underscore_followed_by_hex_digit(&mut self) { - if self.characters.peek_or_zero() == '_' { - self.characters.next(); - if !CharacterValidator::is_hex_digit(self.characters.peek_or_zero()) { - self.add_unexpected_error(); - } - self.characters.next(); - } - } - - fn consume_underscore_followed_by_bin_digit(&mut self) { - if self.characters.peek_or_zero() == '_' { - self.characters.next(); - if !CharacterValidator::is_bin_digit(self.characters.peek_or_zero()) { - self.add_unexpected_error(); - } - self.characters.next(); - } - } - - fn unallow_numeric_suffix(&self) { - if CharacterValidator::is_identifier_start(self.characters.peek_or_zero()) { - self.add_unexpected_error(); - } - } - - fn scan_string_literal(&mut self, raw: bool) -> Option<(Token, Location)> { - let delim = self.characters.peek_or_zero(); - if !['"', '\''].contains(&delim) { - return None; - } - let mut start = self.cursor_location(); - // Include the "@" punctuator as part of raw string literals - if raw { - start = Location::with_offset(&start.compilation_unit(), start.first_offset() - 1); - } - - self.characters.next(); - - // Triple string literal - if self.characters.peek_or_zero() == delim && self.characters.peek_at_or_zero(1) == delim { - self.characters.skip_count_in_place(2); - return self.scan_triple_string_literal(delim, start, raw); - } - - let mut value = String::new(); - - if raw { - loop { - let ch = self.characters.peek_or_zero(); - if ch == delim { - self.characters.next(); - break; - } else if CharacterValidator::is_line_terminator(ch) { - self.add_syntax_error(&self.character_ahead_location(), DiagnosticKind::StringLiteralMustBeTerminatedBeforeLineBreak, vec![]); - self.consume_line_terminator(); - } else if !self.characters.has_remaining() { - self.add_unexpected_eof_error(DiagnosticKind::InputEndedBeforeReachingClosingQuoteForString); - break; - } else { - value.push(ch); - self.characters.next(); - } - } - } else { - loop { - if let Some(s) = self.consume_escape_sequence() { - value.push_str(&s); - } else { - let ch = self.characters.peek_or_zero(); - if ch == delim { - self.characters.next(); - break; - } else if CharacterValidator::is_line_terminator(ch) { - self.add_syntax_error(&self.character_ahead_location(), DiagnosticKind::StringLiteralMustBeTerminatedBeforeLineBreak, vec![]); - self.consume_line_terminator(); - } else if !self.characters.has_remaining() { - self.add_unexpected_eof_error(DiagnosticKind::InputEndedBeforeReachingClosingQuoteForString); - break; - } else { - value.push(ch); - self.characters.next(); - } - } - } - } - - let location = start.combine_with(self.cursor_location()); - Some((Token::String(value), location)) - } - - fn scan_triple_string_literal(&mut self, delim: char, start: Location, raw: bool) -> Option<(Token, Location)> { - let mut lines: Vec = vec![]; - let mut builder = String::new(); - - if raw { - loop { - let ch = self.characters.peek_or_zero(); - if ch == delim && self.characters.peek_at_or_zero(1) == delim && self.characters.peek_at_or_zero(2) == delim { - self.characters.skip_count_in_place(3); - lines.push(builder.clone()); - break; - } else if CharacterValidator::is_line_terminator(ch) { - lines.push(builder.clone()); - builder.clear(); - self.consume_line_terminator(); - } else if !self.characters.has_remaining() { - self.add_unexpected_eof_error(DiagnosticKind::InputEndedBeforeReachingClosingQuoteForString); - lines.push(builder.clone()); - builder.clear(); - break; - } else { - builder.push(ch); - self.characters.next(); - } - } - } else { - loop { - if let Some(s) = self.consume_escape_sequence() { - builder.push_str(&s); - } else { - let ch = self.characters.peek_or_zero(); - if ch == delim && self.characters.peek_at_or_zero(1) == delim && self.characters.peek_at_or_zero(2) == delim { - self.characters.skip_count_in_place(3); - lines.push(builder.clone()); - break; - } else if CharacterValidator::is_line_terminator(ch) { - lines.push(builder.clone()); - builder.clear(); - self.consume_line_terminator(); - } else if !self.characters.has_remaining() { - self.add_unexpected_eof_error(DiagnosticKind::InputEndedBeforeReachingClosingQuoteForString); - lines.push(builder.clone()); - builder.clear(); - break; - } else { - builder.push(ch); - self.characters.next(); - } - } - } - } - - let location = start.combine_with(self.cursor_location()); - - if lines[0].is_empty() && lines.len() > 1 { - lines.remove(0); - } - - let last_line = lines.pop().unwrap(); - - let base_indent = CharacterValidator::indent_count(&last_line); - - let mut lines: Vec = lines.iter().map(|line| { - let indent = CharacterValidator::indent_count(line); - line[usize::min(base_indent, indent)..].to_owned() - }).collect(); - - let last_line = last_line[base_indent..].to_owned(); - if !last_line.is_empty() { - lines.push(last_line); - } - - let value = lines.join("\n"); - Some((Token::String(value), location)) - } - - fn consume_escape_sequence(&mut self) -> Option { - if self.characters.peek_or_zero() != '\\' { - return None; - } - self.characters.next(); - if !self.characters.has_remaining() { - self.add_unexpected_error(); - return Some("".into()); - } - if self.consume_line_terminator() { - return Some("".into()); - } - let ch = self.characters.peek_or_zero(); - match ch { - '\'' | '"' | '\\' => { - self.characters.next(); - Some(ch.into()) - }, - 'u' => { - Some(self.expect_unicode_escape_sequence().into()) - }, - 'x' => { - self.characters.next(); - let v = (self.expect_hex_digit() << 4) | self.expect_hex_digit(); - let v = char::from_u32(v).unwrap(); - Some(v.into()) - }, - 'b' => { - self.characters.next(); - Some('\x08'.into()) - }, - 'f' => { - self.characters.next(); - Some('\x0C'.into()) - }, - 'n' => { - self.characters.next(); - Some('\x0A'.into()) - }, - 'r' => { - self.characters.next(); - Some('\x0D'.into()) - }, - 't' => { - self.characters.next(); - Some('\x09'.into()) - }, - 'v' => { - self.characters.next(); - Some('\x0B'.into()) - }, - '0' => { - self.characters.next(); - if CharacterValidator::is_dec_digit(self.characters.peek_or_zero()) { - self.add_unexpected_error(); - } - Some('\x00'.into()) - }, - ch => { - if CharacterValidator::is_dec_digit(ch) { - self.add_unexpected_error(); - } - self.characters.next(); - Some(ch.into()) - }, - } - } - - /// Scans for an *InputElementXMLTag* token. - pub fn scan_ie_xml_tag(&mut self) -> (Token, Location) { - let start = self.cursor_location(); - let ch = self.characters.peek_or_zero(); - - // XmlName - if CharacterValidator::is_xml_name_start(ch) { - self.characters.next(); - while CharacterValidator::is_xml_name_part(self.characters.peek_or_zero()) { - self.characters.next(); - } - let location = start.combine_with(self.cursor_location()); - let name = self.compilation_unit.text()[location.first_offset..location.last_offset].to_owned(); - return (Token::XmlName(name), location); - } - - // XmlWhitespace - if CharacterValidator::is_xml_whitespace(ch) { - while CharacterValidator::is_xml_whitespace(self.characters.peek_or_zero()) { - if !self.consume_line_terminator() { - self.characters.next(); - } - } - let location = start.combine_with(self.cursor_location()); - return (Token::XmlWhitespace, location); - } - - match ch { - // Assign - '=' => { - self.characters.next(); - let location = start.combine_with(self.cursor_location()); - (Token::Assign, location) - }, - - // Gt - '>' => { - self.characters.next(); - let location = start.combine_with(self.cursor_location()); - (Token::Gt, location) - }, - - // XmlSlashGt - '/' => { - self.characters.next(); - if self.characters.peek_or_zero() != '>' { - self.add_unexpected_error(); - /* - while self.characters.has_remaining() { - self.characters.next(); - if self.characters.peek_or_zero() == '>' { - self.characters.next(); - let location = start.combine_with(self.cursor_location()); - return (Token::XmlSlashGt, location); - } - } - */ - let location = start.combine_with(self.cursor_location()); - return (Token::XmlSlashGt, location); - } - self.characters.next(); - let location = start.combine_with(self.cursor_location()); - (Token::XmlSlashGt, location) - }, - - // XmlAttributeValue - '"' | '\'' => { - let delim = ch; - self.characters.next(); - while self.characters.peek_or_zero() != delim && self.characters.has_remaining() { - if !self.consume_line_terminator() { - self.characters.next(); - } - } - if self.characters.reached_end() { - self.add_unexpected_eof_error(DiagnosticKind::InputEndedBeforeReachingClosingQuoteForAttributeValue); - let value = self.compilation_unit.text()[(start.first_offset + 1)..self.cursor_location().first_offset].to_owned(); - let location = start.combine_with(self.cursor_location()); - return (Token::XmlAttributeValue(value), location); - } - let value = self.compilation_unit.text()[(start.first_offset + 1)..self.cursor_location().first_offset].to_owned(); - self.characters.next(); - - let location = start.combine_with(self.cursor_location()); - (Token::XmlAttributeValue(value), location) - }, - - // BlockOpen - '{' => { - self.characters.next(); - let location = start.combine_with(self.cursor_location()); - (Token::BlockOpen, location) - }, - - _ => { - if self.characters.reached_end() { - return (Token::Eof, self.cursor_location()); - } - self.add_unexpected_error(); - self.characters.next(); - self.scan_ie_xml_tag() - }, - } - } - - /// Scans for an *InputElementXMLContent* token. - pub fn scan_ie_xml_content(&mut self) -> (Token, Location) { - let start = self.cursor_location(); - let ch = self.characters.peek_or_zero(); - - match ch { - '<' => { - self.characters.next(); - - // XmlMarkup - if let Some(r) = self.scan_xml_markup(start.clone()) { - return r; - } - - // XmlLtSlash - if self.characters.peek_or_zero() == '/' { - self.characters.next(); - let location = start.combine_with(self.cursor_location()); - return (Token::XmlLtSlash, location); - } - - // Lt - let location = start.combine_with(self.cursor_location()); - (Token::Lt, location) - }, - - // BlockOpen - '{' => { - self.characters.next(); - let location = start.combine_with(self.cursor_location()); - (Token::BlockOpen, location) - }, - - // XmlName - _ => { - if self.characters.reached_end() { - return (Token::Eof, self.cursor_location()); - } - loop { - let ch = self.characters.peek_or_zero(); - if ['<', '{'].contains(&ch) { - break; - } - if CharacterValidator::is_line_terminator(ch) { - self.consume_line_terminator(); - } else if self.characters.has_remaining() { - self.characters.next(); - } else { - break; - } - } - - let location = start.combine_with(self.cursor_location()); - let content = self.compilation_unit.text()[location.first_offset..location.last_offset].to_owned(); - (Token::XmlText(content), location) - }, - } - } - - /// Attempts to scan a XMLMarkup token after a `<` character. - pub fn scan_xml_markup(&mut self, start: Location) -> Option<(Token, Location)> { - // XMLComment - if self.characters.peek_seq(3) == "!--" { - self.characters.skip_count_in_place(3); - loop { - if self.characters.peek_or_zero() == '-' && self.characters.peek_seq(3) == "-->" { - self.characters.skip_count_in_place(3); - break; - } else if CharacterValidator::is_line_terminator(self.characters.peek_or_zero()) { - self.consume_line_terminator(); - } else if self.characters.reached_end() { - self.add_unexpected_eof_error(DiagnosticKind::InputEndedBeforeReachingClosingSeqForXmlComment); - break; - } else { - self.characters.next(); - } - } - - let location = start.combine_with(self.cursor_location()); - let content = self.compilation_unit.text()[location.first_offset..location.last_offset].to_owned(); - - return Some((Token::XmlMarkup(content), location)); - } - - // XMLCDATA - if self.characters.peek_seq(8) == "![CDATA[" { - self.characters.skip_count_in_place(8); - loop { - if self.characters.peek_or_zero() == ']' && self.characters.peek_seq(3) == "]]>" { - self.characters.skip_count_in_place(3); - break; - } else if CharacterValidator::is_line_terminator(self.characters.peek_or_zero()) { - self.consume_line_terminator(); - } else if self.characters.reached_end() { - self.add_unexpected_eof_error(DiagnosticKind::InputEndedBeforeReachingClosingSeqForCData); - break; - } else { - self.characters.next(); - } - } - - let location = start.combine_with(self.cursor_location()); - let content = self.compilation_unit.text()[location.first_offset..location.last_offset].to_owned(); - - return Some((Token::XmlMarkup(content), location)); - } - - // XMLPI - if self.characters.peek_or_zero() == '?' { - self.characters.next(); - loop { - if self.characters.peek_or_zero() == '?' && self.characters.peek_at_or_zero(1) == '>' { - self.characters.skip_count_in_place(2); - break; - } else if CharacterValidator::is_line_terminator(self.characters.peek_or_zero()) { - self.consume_line_terminator(); - } else if self.characters.reached_end() { - self.add_unexpected_eof_error(DiagnosticKind::InputEndedBeforeReachingClosingSeqForPi); - break; - } else { - self.characters.next(); - } - } - - let location = start.combine_with(self.cursor_location()); - let content = self.compilation_unit.text()[location.first_offset..location.last_offset].to_owned(); - - return Some((Token::XmlMarkup(content), location)); - } - - None - } -} \ No newline at end of file diff --git a/crates/parser/tree.rs b/crates/parser/tree.rs deleted file mode 100644 index e18f45d..0000000 --- a/crates/parser/tree.rs +++ /dev/null @@ -1,165 +0,0 @@ -//! Defines the syntactic nodes produced by the parser. - -mod invalidated_node; -pub use invalidated_node::*; - -// Expressions -mod expression; -pub use expression::*; -mod qualified_identifier; -pub use qualified_identifier::*; -mod paren_expression; -pub use paren_expression::*; -mod null_literal; -pub use null_literal::*; -mod boolean_literal; -pub use boolean_literal::*; -mod numeric_literal; -pub use numeric_literal::*; -mod string_literal; -pub use string_literal::*; -mod this_literal; -pub use this_literal::*; -mod regexp_literal; -pub use regexp_literal::*; -mod xml_expression; -pub use xml_expression::*; -mod array_literal; -pub use array_literal::*; -mod vector_literal; -pub use vector_literal::*; -mod object_initializer; -pub use object_initializer::*; -mod function_expression; -pub use function_expression::*; -mod import_meta; -pub use import_meta::*; -mod new_expression; -pub use new_expression::*; -mod member_expression; -pub use member_expression::*; -mod computed_member_expression; -pub use computed_member_expression::*; -mod descendants_expression; -pub use descendants_expression::*; -mod filter_expression; -pub use filter_expression::*; -mod super_expression; -pub use super_expression::*; -mod call_expression; -pub use call_expression::*; -mod expression_with_type_arguments; -pub use expression_with_type_arguments::*; -mod unary_expression; -pub use unary_expression::*; -mod optional_chaining_expression; -pub use optional_chaining_expression::*; -mod binary_expression; -pub use binary_expression::*; -mod conditional_expression; -pub use conditional_expression::*; -mod assignment_expression; -pub use assignment_expression::*; -mod sequence_expression; -pub use sequence_expression::*; -mod type_expression; -pub use type_expression::*; -mod reserved_namespace_expression; -pub use reserved_namespace_expression::*; - -// Destructuring -mod destructuring; -pub use destructuring::*; - -// Statements -mod empty_statement; -pub use empty_statement::*; -mod expression_statement; -pub use expression_statement::*; -mod super_statement; -pub use super_statement::*; -mod block; -pub use block::*; -mod labeled_statement; -pub use labeled_statement::*; -mod if_statement; -pub use if_statement::*; -mod switch_statement; -pub use switch_statement::*; -mod do_statement; -pub use do_statement::*; -mod while_statement; -pub use while_statement::*; -mod for_statement; -pub use for_statement::*; -mod continue_statement; -pub use continue_statement::*; -mod break_statement; -pub use break_statement::*; -mod with_statement; -pub use with_statement::*; -mod return_statement; -pub use return_statement::*; -mod throw_statement; -pub use throw_statement::*; -mod try_statement; -pub use try_statement::*; -mod default_xml_namespace_statement; -pub use default_xml_namespace_statement::*; - -// Directives -mod directive; -pub use directive::*; -mod configuration_directive; -pub use configuration_directive::*; -mod import_directive; -pub use import_directive::*; -mod use_namespace_directive; -pub use use_namespace_directive::*; -mod include_directive; -pub use include_directive::*; -mod normal_configuration_directive; -pub use normal_configuration_directive::*; -mod package_concat_directive; -pub use package_concat_directive::*; -mod directive_injection_node; -pub use directive_injection_node::*; - -// Miscellaneous -mod attributes; -pub use attributes::*; -mod asdoc; -pub use asdoc::*; -mod type_parameter; -pub use type_parameter::*; - -// Definitions -mod variable_definition; -pub use variable_definition::*; -mod function_definition; -pub use function_definition::*; -mod class_definition; -pub use class_definition::*; -mod enum_definition; -pub use enum_definition::*; -mod interface_definition; -pub use interface_definition::*; -mod type_definition; -pub use type_definition::*; -mod namespace_definition; -pub use namespace_definition::*; -mod package_definition; -pub use package_definition::*; -mod program; -pub use program::*; - -// MXML document -mod mxml; -pub use mxml::*; - -// CSS -mod css; -pub use css::*; - -mod tree_semantics; -pub use tree_semantics::*; \ No newline at end of file diff --git a/crates/parser/tree/array_literal.rs b/crates/parser/tree/array_literal.rs deleted file mode 100644 index 3ddf080..0000000 --- a/crates/parser/tree/array_literal.rs +++ /dev/null @@ -1,18 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -#[derive(Clone, Serialize, Deserialize)] -pub struct ArrayLiteral { - pub location: Location, - /// ASDoc. Always ignore this field; it is used solely - /// when parsing meta-data. - pub asdoc: Option>, - pub elements: Vec, -} - -#[derive(Clone, Serialize, Deserialize)] -pub enum Element { - Elision, - Expression(Rc), - Rest((Rc, Location)), -} \ No newline at end of file diff --git a/crates/parser/tree/asdoc.rs b/crates/parser/tree/asdoc.rs deleted file mode 100644 index 95d7756..0000000 --- a/crates/parser/tree/asdoc.rs +++ /dev/null @@ -1,52 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -#[derive(Clone, Serialize, Deserialize)] -pub struct AsDoc { - pub location: Location, - pub main_body: Option<(String, Location)>, - pub tags: Vec<(AsDocTag, Location)>, -} - -#[derive(Clone, Serialize, Deserialize)] -pub enum AsDocTag { - Author(String), - Copy(Rc), - Created(String), - Default(String), - Deprecated { - message: Option, - }, - EventType(Rc), - Example(String), - InheritDoc, - Internal(String), - Langversion(String), - Param { - name: String, - description: String, - }, - Playerversion(String), - Private, - Productversion(String), - Return(String), - See { - reference: Rc, - display_text: Option, - }, - Throws { - class_reference: Rc, - description: Option, - }, - Version(String), -} - -/// An ASDoc reference consisting of an optional base and -/// an optional instance property fragment (`#x`). -#[derive(Clone, Serialize, Deserialize)] -pub struct AsDocReference { - /// Base expression. - pub base: Option>, - /// Instance property fragment following the hash character. - pub instance_property: Option>, -} \ No newline at end of file diff --git a/crates/parser/tree/assignment_expression.rs b/crates/parser/tree/assignment_expression.rs deleted file mode 100644 index fbcfe64..0000000 --- a/crates/parser/tree/assignment_expression.rs +++ /dev/null @@ -1,14 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -#[derive(Clone, Serialize, Deserialize)] -pub struct AssignmentExpression { - pub location: Location, - pub compound: Option, - /// Assignment left-hand side. - /// - /// If the left-hand side is an `ObjectInitializer` or an `ArrayLiteral` - /// and there is no compound assignment, it is a destructuring pattern. - pub left: Rc, - pub right: Rc, -} \ No newline at end of file diff --git a/crates/parser/tree/attributes.rs b/crates/parser/tree/attributes.rs deleted file mode 100644 index 6e248d0..0000000 --- a/crates/parser/tree/attributes.rs +++ /dev/null @@ -1,170 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -#[derive(Clone, Serialize, Deserialize)] -pub enum Attribute { - Metadata(Rc), - Expression(Rc), - Public(Location), - Private(Location), - Protected(Location), - Internal(Location), - Final(Location), - Native(Location), - Static(Location), - Abstract(Location), - Override(Location), - Dynamic(Location), -} - -#[derive(Clone, Serialize, Deserialize)] -pub struct Metadata { - pub location: Location, - pub asdoc: Option>, - pub name: (String, Location), - pub entries: Option>>, -} - -#[derive(Clone, Serialize, Deserialize)] -pub struct MetadataEntry { - pub location: Location, - pub key: Option<(String, Location)>, - pub value: Rc, -} - -#[derive(Clone, Serialize, Deserialize)] -pub enum MetadataValue { - IdentifierString((String, Location)), - String((String, Location)), -} - -impl MetadataValue { - pub fn location(&self) -> Location { - match self { - Self::IdentifierString((_, l)) => l.clone(), - Self::String((_, l)) => l.clone(), - } - } -} - -impl Attribute { - pub fn location(&self) -> Location { - match self { - Self::Expression(m) => m.location(), - Self::Metadata(m) => m.location.clone(), - Self::Public(a) => a.clone(), - Self::Private(a) => a.clone(), - Self::Protected(a) => a.clone(), - Self::Internal(a) => a.clone(), - Self::Final(a) => a.clone(), - Self::Native(a) => a.clone(), - Self::Static(a) => a.clone(), - Self::Abstract(a) => a.clone(), - Self::Override(a) => a.clone(), - Self::Dynamic(a) => a.clone(), - } - } - - pub fn has_access_modifier(list: &[Attribute]) -> bool { - for a in list { - match a { - Self::Expression(_) | - Self::Public(_) | - Self::Private(_) | - Self::Protected(_) | - Self::Internal(_) => return true, - _ => {} - } - } - false - } - - pub fn remove_metadata(list: &mut Vec, metadata: &Rc) { - for i in 0..list.len() { - if let Attribute::Metadata(metadata_1) = &list[i] { - if Rc::ptr_eq(&metadata_1, metadata) { - list.remove(i); - break; - } - } - } - } - - pub fn find_metadata(list: &[Attribute]) -> Vec> { - let mut r = vec![]; - for a in list { - match &a { - Self::Metadata(e) => { - r.push(e.clone()); - }, - _ => {}, - } - } - r - } - pub fn find_expression(list: &[Attribute]) -> Option> { for a in list { match &a { Self::Expression(e) => return Some(e.clone()), _ => {} } }; None } - pub fn find_public(list: &[Attribute]) -> Option { for a in list { match &a { Self::Public(l) => return Some(l.clone()), _ => {} } }; None } - pub fn find_private(list: &[Attribute]) -> Option { for a in list { match &a { Self::Private(l) => return Some(l.clone()), _ => {} } }; None } - pub fn find_protected(list: &[Attribute]) -> Option { for a in list { match &a { Self::Protected(l) => return Some(l.clone()), _ => {} } }; None } - pub fn find_internal(list: &[Attribute]) -> Option { for a in list { match &a { Self::Internal(l) => return Some(l.clone()), _ => {} } }; None } - pub fn find_final(list: &[Attribute]) -> Option { for a in list { match &a { Self::Final(l) => return Some(l.clone()), _ => {} } }; None } - pub fn find_native(list: &[Attribute]) -> Option { for a in list { match &a { Self::Native(l) => return Some(l.clone()), _ => {} } }; None } - pub fn find_static(list: &[Attribute]) -> Option { for a in list { match &a { Self::Static(l) => return Some(l.clone()), _ => {} } }; None } - pub fn find_abstract(list: &[Attribute]) -> Option { for a in list { match &a { Self::Abstract(l) => return Some(l.clone()), _ => {} } }; None } - pub fn find_override(list: &[Attribute]) -> Option { for a in list { match &a { Self::Override(l) => return Some(l.clone()), _ => {} } }; None } - pub fn find_dynamic(list: &[Attribute]) -> Option { for a in list { match &a { Self::Dynamic(l) => return Some(l.clone()), _ => {} } }; None } - - pub fn has(list: &[Attribute], attribute: &Attribute) -> bool { - match attribute { - Self::Public(_) => Self::find_public(list).is_some(), - Self::Private(_) => Self::find_private(list).is_some(), - Self::Protected(_) => Self::find_protected(list).is_some(), - Self::Internal(_) => Self::find_internal(list).is_some(), - Self::Final(_) => Self::find_final(list).is_some(), - Self::Native(_) => Self::find_native(list).is_some(), - Self::Static(_) => Self::find_static(list).is_some(), - Self::Abstract(_) => Self::find_abstract(list).is_some(), - Self::Override(_) => Self::find_override(list).is_some(), - Self::Dynamic(_) => Self::find_dynamic(list).is_some(), - _ => false, - } - } - - pub fn is_duplicate_access_modifier(list: &[Attribute], attribute: &Attribute) -> bool { - match attribute { - Self::Expression(_) | - Self::Public(_) | - Self::Private(_) | - Self::Protected(_) | - Self::Internal(_) => Self::find_expression(list).is_some() || Self::find_public(list).is_some() || Self::find_private(list).is_some() || Self::find_protected(list).is_some() || Self::find_internal(list).is_some(), - _ => false, - } - } - - pub fn is_metadata(&self) -> bool { matches!(self, Self::Metadata(_)) } - pub fn is_public(&self) -> bool { matches!(self, Self::Public(_)) } - pub fn is_private(&self) -> bool { matches!(self, Self::Private(_)) } - pub fn is_protected(&self) -> bool { matches!(self, Self::Protected(_)) } - pub fn is_internal(&self) -> bool { matches!(self, Self::Internal(_)) } - pub fn is_final(&self) -> bool { matches!(self, Self::Final(_)) } - pub fn is_native(&self) -> bool { matches!(self, Self::Native(_)) } - pub fn is_static(&self) -> bool { matches!(self, Self::Static(_)) } - pub fn is_abstract(&self) -> bool { matches!(self, Self::Abstract(_)) } - pub fn is_override(&self) -> bool { matches!(self, Self::Override(_)) } - pub fn is_dynamic(&self) -> bool { matches!(self, Self::Dynamic(_)) } - - pub fn from_identifier_name(name: &str, location: &Location) -> Option { - if location.character_count() != name.chars().count() { - return None; - } - match name.as_ref() { - "final" => Some(Attribute::Final(location.clone())), - "native" => Some(Attribute::Native(location.clone())), - "static" => Some(Attribute::Static(location.clone())), - "abstract" => Some(Attribute::Abstract(location.clone())), - "override" => Some(Attribute::Override(location.clone())), - "dynamic" => Some(Attribute::Dynamic(location.clone())), - _ => None, - } - } -} \ No newline at end of file diff --git a/crates/parser/tree/binary_expression.rs b/crates/parser/tree/binary_expression.rs deleted file mode 100644 index 26bee27..0000000 --- a/crates/parser/tree/binary_expression.rs +++ /dev/null @@ -1,10 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -#[derive(Clone, Serialize, Deserialize)] -pub struct BinaryExpression { - pub location: Location, - pub operator: Operator, - pub left: Rc, - pub right: Rc, -} \ No newline at end of file diff --git a/crates/parser/tree/block.rs b/crates/parser/tree/block.rs deleted file mode 100644 index 1349d32..0000000 --- a/crates/parser/tree/block.rs +++ /dev/null @@ -1,9 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -/// Block statement. -#[derive(Clone, Serialize, Deserialize)] -pub struct Block { - pub location: Location, - pub directives: Vec>, -} \ No newline at end of file diff --git a/crates/parser/tree/boolean_literal.rs b/crates/parser/tree/boolean_literal.rs deleted file mode 100644 index 537f41f..0000000 --- a/crates/parser/tree/boolean_literal.rs +++ /dev/null @@ -1,8 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -#[derive(Clone, Serialize, Deserialize)] -pub struct BooleanLiteral { - pub location: Location, - pub value: bool, -} \ No newline at end of file diff --git a/crates/parser/tree/break_statement.rs b/crates/parser/tree/break_statement.rs deleted file mode 100644 index 4b75262..0000000 --- a/crates/parser/tree/break_statement.rs +++ /dev/null @@ -1,8 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -#[derive(Clone, Serialize, Deserialize)] -pub struct BreakStatement { - pub location: Location, - pub label: Option<(String, Location)>, -} \ No newline at end of file diff --git a/crates/parser/tree/call_expression.rs b/crates/parser/tree/call_expression.rs deleted file mode 100644 index 2f502b2..0000000 --- a/crates/parser/tree/call_expression.rs +++ /dev/null @@ -1,9 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -#[derive(Clone, Serialize, Deserialize)] -pub struct CallExpression { - pub location: Location, - pub base: Rc, - pub arguments: Vec>, -} \ No newline at end of file diff --git a/crates/parser/tree/class_definition.rs b/crates/parser/tree/class_definition.rs deleted file mode 100644 index fb9d6b3..0000000 --- a/crates/parser/tree/class_definition.rs +++ /dev/null @@ -1,14 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -#[derive(Clone, Serialize, Deserialize)] -pub struct ClassDefinition { - pub location: Location, - pub asdoc: Option>, - pub attributes: Vec, - pub name: (String, Location), - pub type_parameters: Option>>, - pub extends_clause: Option>, - pub implements_clause: Option>>, - pub block: Rc, -} diff --git a/crates/parser/tree/computed_member_expression.rs b/crates/parser/tree/computed_member_expression.rs deleted file mode 100644 index c869f5e..0000000 --- a/crates/parser/tree/computed_member_expression.rs +++ /dev/null @@ -1,12 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -#[derive(Clone, Serialize, Deserialize)] -pub struct ComputedMemberExpression { - pub location: Location, - pub base: Rc, - /// ASDoc. Always ignore this field; it is used solely - /// when parsing meta-data. - pub asdoc: Option>, - pub key: Rc, -} \ No newline at end of file diff --git a/crates/parser/tree/conditional_expression.rs b/crates/parser/tree/conditional_expression.rs deleted file mode 100644 index cbf1f8d..0000000 --- a/crates/parser/tree/conditional_expression.rs +++ /dev/null @@ -1,10 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -#[derive(Clone, Serialize, Deserialize)] -pub struct ConditionalExpression { - pub location: Location, - pub test: Rc, - pub consequent: Rc, - pub alternative: Rc, -} \ No newline at end of file diff --git a/crates/parser/tree/configuration_directive.rs b/crates/parser/tree/configuration_directive.rs deleted file mode 100644 index c22fccf..0000000 --- a/crates/parser/tree/configuration_directive.rs +++ /dev/null @@ -1,33 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -/// The `configuration {}` directive. -/// -/// # Syntax -/// -/// The directive consists of a block -/// of `if..else` branches, whose -/// condition is one of the following expressions: -/// -/// ```plain -/// // Check whether constant is "true" -/// q::x -/// x -/// // Check whether constant is "v" -/// k="v" -/// k=v // QualifiedIdentifier == StringLiteral -/// // Check whether constant is not "v" -/// k!="v" -/// k!=v // QualifiedIdentifier != StringLiteral -/// -/// x && y -/// x || y -/// -/// (x) -/// !x -/// ``` -#[derive(Clone, Serialize, Deserialize)] -pub struct ConfigurationDirective { - pub location: Location, - pub directive: Rc, -} \ No newline at end of file diff --git a/crates/parser/tree/continue_statement.rs b/crates/parser/tree/continue_statement.rs deleted file mode 100644 index 70338d7..0000000 --- a/crates/parser/tree/continue_statement.rs +++ /dev/null @@ -1,8 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -#[derive(Clone, Serialize, Deserialize)] -pub struct ContinueStatement { - pub location: Location, - pub label: Option<(String, Location)>, -} \ No newline at end of file diff --git a/crates/parser/tree/css.rs b/crates/parser/tree/css.rs deleted file mode 100644 index c10a14f..0000000 --- a/crates/parser/tree/css.rs +++ /dev/null @@ -1,471 +0,0 @@ -use std::{marker::PhantomData, str::FromStr}; - -use crate::ns::*; -use num_traits::ToPrimitive; -use serde::{Serialize, Deserialize}; - -/// CSS3 selector combinators. -/// -/// See also: [CSS3 selectors: combinators](http://www.w3.org/TR/css3-selectors/#combinators). -#[derive(Clone, Copy, PartialEq, Eq, Serialize, Deserialize)] -pub enum CssCombinatorType { - Descendant, - Child, - Preceded, - Sibling, -} - -impl ToString for CssCombinatorType { - /// Symbol that represents the combinator type. - fn to_string(&self) -> String { - match self { - Self::Descendant => " ".into(), - Self::Child => ">".into(), - Self::Preceded => "+".into(), - Self::Sibling => "~".into(), - } - } -} - -#[derive(Clone, Serialize, Deserialize)] -pub enum CssDirective { - Invalidated(InvalidatedNode), - FontFace(CssFontFace), - MediaQuery(CssMediaQuery), - NamespaceDefinition(CssNamespaceDefinition), - Rule(CssRule), -} - -impl CssDirective { - pub fn location(&self) -> Location { - match self { - Self::Invalidated(v) => v.location.clone(), - Self::FontFace(v) => v.location.clone(), - Self::MediaQuery(v) => v.location.clone(), - Self::NamespaceDefinition(v) => v.location.clone(), - Self::Rule(v) => v.location.clone(), - } - } -} - -#[derive(Clone, Serialize, Deserialize)] -pub enum CssPropertyValue { - Invalidated(InvalidatedNode), - /// Example: `yellow, #fff` - Array(CssArrayPropertyValue), - /// Example: `1px solid red` - MultiValue(CssMultiValuePropertyValue), - /// Example: `yellow`, `#fff` - Color(CssColorPropertyValue), - /// Example: `10, 10.0, 10pt` - Number(CssNumberPropertyValue), - /// Example: `rgb(10% 10% 10%)`, `rgb(10%, 10%, 10%)` - RgbColor(CssRgbColorPropertyValue), - /// Example: `"string"` - String(CssStringPropertyValue), - /// Example: `solid`, `_serif` - Identifier(CssIdentifierPropertyValue), - /// `ClassReference(...)` - ClassReference(CssClassReferencePropertyValue), - /// `PropertyReference(...)` - PropertyReference(CssPropertyReferencePropertyValue), - //// `url(...) [format(...)]` - Url(CssUrlPropertyValue), - /// `local(...)` - Local(CssLocalPropertyValue), - /// `Embed(...)` - Embed(CssEmbedPropertyValue), -} - -impl CssPropertyValue { - pub fn location(&self) -> Location { - match self { - Self::Invalidated(v) => v.location.clone(), - Self::Array(v) => v.location.clone(), - Self::MultiValue(v) => v.location.clone(), - Self::Color(v) => v.location.clone(), - Self::Number(v) => v.location.clone(), - Self::RgbColor(v) => v.location.clone(), - Self::String(v) => v.location.clone(), - Self::Identifier(v) => v.location.clone(), - Self::ClassReference(v) => v.location.clone(), - Self::PropertyReference(v) => v.location.clone(), - Self::Url(v) => v.location.clone(), - Self::Local(v) => v.location.clone(), - Self::Embed(v) => v.location.clone(), - } - } - - pub fn as_array(&self) -> Option<&CssArrayPropertyValue> { - let Self::Array(v) = self else { return None; }; - Some(v) - } -} - -#[derive(Clone, Serialize, Deserialize)] -pub enum CssSelector { - Invalidated(InvalidatedNode), - Base(CssBaseSelector), - Combinator(CssCombinatorSelector), -} - -impl CssSelector { - pub fn location(&self) -> Location { - match self { - Self::Invalidated(v) => v.location.clone(), - Self::Base(v) => v.location.clone(), - Self::Combinator(v) => v.location.clone(), - } - } -} - -/// Array property values are comma-separated values in CSS properties. -/// -/// For example: -/// -/// ```css -/// fillColors: #FFFFFF, #CCCCCC, #FFFFFF, #EEEEEE; -/// ``` -#[derive(Clone, Serialize, Deserialize)] -pub struct CssArrayPropertyValue { - pub location: Location, - pub elements: Vec>, -} - -/// Multi-value property values are space-separated values in CSS properties. -/// -/// For example: -/// -/// ```css -/// 1px solid blue -/// ``` -#[derive(Clone, Serialize, Deserialize)] -pub struct CssMultiValuePropertyValue { - pub location: Location, - pub values: Vec>, -} - -/// A CSS base selector. -#[derive(Clone, Serialize, Deserialize)] -pub struct CssBaseSelector { - pub location: Location, - pub namespace_prefix: Option<(String, Location)>, - pub element_name: Option<(String, Location)>, - pub conditions: Vec>, -} - -/// Supported condition types for [`CssSelectorCondition`]. -#[derive(Clone, Serialize, Deserialize)] -pub enum CssSelectorCondition { - Invalidated(InvalidatedNode), - /// For example: `s|Label.className` - Class((String, Location)), - /// For example: `s|Label#idValue` - Id((String, Location)), - /// For example: `s|Label:loadingState` - Pseudo((String, Location)), - /// For example: `s|Label::loadingState` - PseudoElement((String, Location)), - /// For example: `s|Panel:not(:first-child)` - Not { - location: Location, - condition: Rc, - }, - /// For example: `s|Label[loadingState]` - Attribute { - location: Location, - name: (String, Location), - operator: Option, - value: Option<(String, Location)>, - }, -} - -impl CssSelectorCondition { - pub fn location(&self) -> Location { - match self { - Self::Invalidated(v) => v.location.clone(), - Self::Class((_, l)) => l.clone(), - Self::Id((_, l)) => l.clone(), - Self::Pseudo((_, l)) => l.clone(), - Self::PseudoElement((_, l)) => l.clone(), - Self::Not { location, .. } => location.clone(), - Self::Attribute { location, .. } => location.clone(), - } - } -} - -#[derive(Clone, Copy, PartialEq, Eq, Serialize, Deserialize)] -pub enum CssAttributeOperator { - Equals, - BeginsWith, - EndsWith, - Contains, - ListMatch, - HreflangMatch, -} - -impl ToString for CssAttributeOperator { - fn to_string(&self) -> String { - match self { - Self::Equals => "=".into(), - Self::BeginsWith => "^=".into(), - Self::EndsWith => "$=".into(), - Self::Contains => "*=".into(), - Self::ListMatch => "~=".into(), - Self::HreflangMatch => "|=".into(), - } - } -} - -#[derive(Clone, Serialize, Deserialize)] -pub struct CssColorPropertyValue { - pub location: Location, - pub color_int: u32, -} - -impl CssColorPropertyValue { - pub fn from_hex(location: Location, token_text: &str) -> Result { - let mut token_text = if token_text.starts_with('#') { token_text.to_owned() } else { - "#".to_owned() + token_text - }; - if token_text.len() == 4 { - let mut six = String::new(); - let chars: Vec<_> = token_text.chars().collect(); - six.push('#'); - six.push(chars[1]); - six.push(chars[1]); - six.push(chars[2]); - six.push(chars[2]); - six.push(chars[3]); - six.push(chars[3]); - token_text = six; - } - Ok(Self { - location, - color_int: u32::from_str_radix(&token_text[1..], 16).map_err(|_| ParserError::Common)?.clamp(0x000000, 0xFFFFFF), - }) - } - - pub fn text(&self) -> String { - self.location.text() - } -} - -#[derive(Clone, Serialize, Deserialize)] -pub struct CssNumberPropertyValue { - pub location: Location, - pub value: f64, - pub unit: Option, -} - -#[derive(Clone, Serialize, Deserialize)] -pub struct CssRgbColorPropertyValue { - pub location: Location, - pub color_int: u32, -} - -impl CssRgbColorPropertyValue { - pub fn from_raw_arguments(location: &Location, raw_arguments: &[String]) -> Result { - Ok(CssRgbColorPropertyValue { - location: location.clone(), - color_int: (Self::parse_component(&raw_arguments[0])? << 16) - | (Self::parse_component(&raw_arguments[1])? << 8) - | Self::parse_component(&raw_arguments[2])?, - }) - } - - fn parse_component(input: &str) -> Result { - let i = input.find('%'); - let v: u32; - if let Some(i) = i { - let percent = f64::from_str(&input[..i]).map_err(|_| ParserError::Common)?.clamp(0.0, 100.0); - v = (255.0 * (percent / 100.0)).round().to_u32().ok_or(ParserError::Common)?; - } else if input.contains('.') { - let ratio = f64::from_str(input).map_err(|_| ParserError::Common)?.clamp(0.0, 1.0); - v = (255.0 * ratio).round().to_u32().ok_or(ParserError::Common)?; - } else { - v = u32::from_str(input).map_err(|_| ParserError::Common)?; - } - Ok(v.clamp(0, 255)) - } -} - -/// A CSS text is a string value written without quotes. -#[derive(Clone, Serialize, Deserialize)] -pub struct CssStringPropertyValue { - pub location: Location, - pub value: String, -} - -#[derive(Clone, Serialize, Deserialize)] -pub struct CssIdentifierPropertyValue { - pub location: Location, - pub value: String, -} - -#[derive(Clone, Serialize, Deserialize)] -pub struct CssClassReferencePropertyValue { - pub location: Location, - /// Name or "null". - pub name: (String, Location), -} - -#[derive(Clone, Serialize, Deserialize)] -pub struct CssPropertyReferencePropertyValue { - pub location: Location, - pub name: (String, Location), -} - -#[derive(Clone, Serialize, Deserialize)] -pub struct CssUrlPropertyValue { - pub location: Location, - pub url: (String, Location), - pub format: Option<(String, Location)>, -} - -#[derive(Clone, Serialize, Deserialize)] -pub struct CssLocalPropertyValue { - pub location: Location, - pub name: (String, Location), -} - -#[derive(Clone, Serialize, Deserialize)] -pub struct CssEmbedPropertyValue { - pub location: Location, - pub entries: Vec>, -} - -/// Represents a key-value entry for an `Embed` function call property value. -/// It may be a keyless entry. -#[derive(Clone, Serialize, Deserialize)] -pub struct CssEmbedEntry { - pub location: Location, - pub key: Option<(String, Location)>, - pub value: (String, Location), -} - -/// A CSS selector containing a combinator. -#[derive(Clone, Serialize, Deserialize)] -pub struct CssCombinatorSelector { - pub location: Location, - pub left: Rc, - pub right: Rc, - pub combinator_type: CssCombinatorType, -} - -/// The root object of a CSS DOM. The CSS3 DOM objects serve not only IDE -/// features in code model, but also CSS compilation. -#[derive(Clone, Serialize, Deserialize)] -pub struct CssDocument { - pub location: Location, - pub directives: Vec>, -} - -/// CSS DOM for an `@font-face` statement. -#[derive(Clone, Serialize, Deserialize)] -pub struct CssFontFace { - pub location: Location, - pub properties: Vec>, -} - -#[derive(Clone, Serialize, Deserialize)] -pub struct CssProperty { - pub location: Location, - pub name: (String, Location), - pub value: Rc, - #[serde(skip)] - _phantom: PhantomData<()>, -} - -impl CssProperty { - pub fn new(location: Location, name: (String, Location), value: Rc) -> Self { - Self { - location, - name: (Self::normalize(&name.0), name.1), - value, - _phantom: PhantomData::default(), - } - } - - /// Normalize CSS property names to camel-case style names. Names already in - /// camel-case will be returned as-is. - fn normalize(name: &str) -> String { - let mut split = name.split('-').map(|s| s.to_owned()).collect::>(); - let mut v = split[0].chars(); - let mut v1 = String::new(); - if let Some(ch) = v.next() { - v1.push_str(&ch.to_lowercase().to_string()); - for ch in v { - v1.push(ch); - } - } - split[0] = v1; - for i in 1..split.len() { - let mut v = split[i].chars(); - let mut v1 = String::new(); - if let Some(ch) = v.next() { - v1.push_str(&ch.to_uppercase().to_string()); - for ch in v { - v1.push(ch); - } - } - split[i] = v1; - } - split.join("") - } -} - -#[derive(Clone, Serialize, Deserialize)] -pub struct CssMediaQuery { - pub location: Location, - pub conditions: Vec>, - pub rules: Vec>, -} - -#[derive(Clone, Serialize, Deserialize)] -pub enum CssMediaQueryCondition { - Invalidated(InvalidatedNode), - /// Identifier. Example: "screen". - Id((String, Location)), - /// The `only` keyword followed by an identifier. - /// Example: "only screen". - OnlyId { - location: Location, - id: (String, Location), - }, - /// A parenthesized property, such as - /// `(application-dpi: 240)`. - ParenProperty((Rc, Location)), - /// A `condition1 and condition2` expression. - And { - location: Location, - left: Rc, - right: Rc, - }, -} - -impl CssMediaQueryCondition { - pub fn location(&self) -> Location { - match self { - Self::Invalidated(v) => v.location.clone(), - Self::Id((_, l)) => l.clone(), - Self::OnlyId { location, .. } => location.clone(), - Self::ParenProperty((_, l)) => l.clone(), - Self::And { location, .. } => location.clone(), - } - } -} - -#[derive(Clone, Serialize, Deserialize)] -pub struct CssRule { - pub location: Location, - pub selectors: Vec>, - pub properties: Vec>, -} - -#[derive(Clone, Serialize, Deserialize)] -pub struct CssNamespaceDefinition { - pub location: Location, - pub prefix: (String, Location), - pub uri: (String, Location), -} \ No newline at end of file diff --git a/crates/parser/tree/default_xml_namespace_statement.rs b/crates/parser/tree/default_xml_namespace_statement.rs deleted file mode 100644 index 08084e2..0000000 --- a/crates/parser/tree/default_xml_namespace_statement.rs +++ /dev/null @@ -1,8 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -#[derive(Clone, Serialize, Deserialize)] -pub struct DefaultXmlNamespaceStatement { - pub location: Location, - pub right: Rc, -} \ No newline at end of file diff --git a/crates/parser/tree/descendants_expression.rs b/crates/parser/tree/descendants_expression.rs deleted file mode 100644 index d4e7bce..0000000 --- a/crates/parser/tree/descendants_expression.rs +++ /dev/null @@ -1,9 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -#[derive(Clone, Serialize, Deserialize)] -pub struct DescendantsExpression { - pub location: Location, - pub base: Rc, - pub identifier: QualifiedIdentifier, -} \ No newline at end of file diff --git a/crates/parser/tree/destructuring.rs b/crates/parser/tree/destructuring.rs deleted file mode 100644 index 3205c3d..0000000 --- a/crates/parser/tree/destructuring.rs +++ /dev/null @@ -1,9 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -#[derive(Clone, Serialize, Deserialize)] -pub struct TypedDestructuring { - pub location: Location, - pub destructuring: Rc, - pub type_annotation: Option>, -} \ No newline at end of file diff --git a/crates/parser/tree/directive.rs b/crates/parser/tree/directive.rs deleted file mode 100644 index 2f0af6d..0000000 --- a/crates/parser/tree/directive.rs +++ /dev/null @@ -1,82 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -/// Directive attached with a source location. -#[derive(Clone, Serialize, Deserialize)] -pub enum Directive { - EmptyStatement(EmptyStatement), - ExpressionStatement(ExpressionStatement), - SuperStatement(SuperStatement), - Block(Block), - LabeledStatement(LabeledStatement), - IfStatement(IfStatement), - SwitchStatement(SwitchStatement), - SwitchTypeStatement(SwitchTypeStatement), - DoStatement(DoStatement), - WhileStatement(WhileStatement), - ForStatement(ForStatement), - ForInStatement(ForInStatement), - BreakStatement(BreakStatement), - ContinueStatement(ContinueStatement), - WithStatement(WithStatement), - ReturnStatement(ReturnStatement), - ThrowStatement(ThrowStatement), - DefaultXmlNamespaceStatement(DefaultXmlNamespaceStatement), - TryStatement(TryStatement), - Invalidated(InvalidatedNode), - ConfigurationDirective(ConfigurationDirective), - ImportDirective(ImportDirective), - UseNamespaceDirective(UseNamespaceDirective), - IncludeDirective(IncludeDirective), - NormalConfigurationDirective(NormalConfigurationDirective), - PackageConcatDirective(PackageConcatDirective), - DirectiveInjection(DirectiveInjectionNode), - VariableDefinition(VariableDefinition), - FunctionDefinition(FunctionDefinition), - ClassDefinition(ClassDefinition), - EnumDefinition(EnumDefinition), - InterfaceDefinition(InterfaceDefinition), - TypeDefinition(TypeDefinition), - NamespaceDefinition(NamespaceDefinition), -} - -impl Directive { - pub fn location(&self) -> Location { - match self { - Self::EmptyStatement(d) => d.location.clone(), - Self::ExpressionStatement(d) => d.location.clone(), - Self::SuperStatement(d) => d.location.clone(), - Self::Block(d) => d.location.clone(), - Self::LabeledStatement(d) => d.location.clone(), - Self::IfStatement(d) => d.location.clone(), - Self::SwitchStatement(d) => d.location.clone(), - Self::SwitchTypeStatement(d) => d.location.clone(), - Self::DoStatement(d) => d.location.clone(), - Self::WhileStatement(d) => d.location.clone(), - Self::ForStatement(d) => d.location.clone(), - Self::ForInStatement(d) => d.location.clone(), - Self::BreakStatement(d) => d.location.clone(), - Self::ContinueStatement(d) => d.location.clone(), - Self::WithStatement(d) => d.location.clone(), - Self::ReturnStatement(d) => d.location.clone(), - Self::ThrowStatement(d) => d.location.clone(), - Self::DefaultXmlNamespaceStatement(d) => d.location.clone(), - Self::TryStatement(d) => d.location.clone(), - Self::Invalidated(d) => d.location.clone(), - Self::ConfigurationDirective(d) => d.location.clone(), - Self::ImportDirective(d) => d.location.clone(), - Self::UseNamespaceDirective(d) => d.location.clone(), - Self::IncludeDirective(d) => d.location.clone(), - Self::NormalConfigurationDirective(d) => d.location.clone(), - Self::PackageConcatDirective(d) => d.location.clone(), - Self::DirectiveInjection(d) => d.location.clone(), - Self::VariableDefinition(d) => d.location.clone(), - Self::FunctionDefinition(d) => d.location.clone(), - Self::ClassDefinition(d) => d.location.clone(), - Self::EnumDefinition(d) => d.location.clone(), - Self::InterfaceDefinition(d) => d.location.clone(), - Self::TypeDefinition(d) => d.location.clone(), - Self::NamespaceDefinition(d) => d.location.clone(), - } - } -} \ No newline at end of file diff --git a/crates/parser/tree/directive_injection_node.rs b/crates/parser/tree/directive_injection_node.rs deleted file mode 100644 index bb73b64..0000000 --- a/crates/parser/tree/directive_injection_node.rs +++ /dev/null @@ -1,9 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -/// Node that allows modification to the directive sequence. -#[derive(Clone, Serialize, Deserialize)] -pub struct DirectiveInjectionNode { - pub location: Location, - pub directives: RefCell>>, -} \ No newline at end of file diff --git a/crates/parser/tree/do_statement.rs b/crates/parser/tree/do_statement.rs deleted file mode 100644 index 2c6400e..0000000 --- a/crates/parser/tree/do_statement.rs +++ /dev/null @@ -1,10 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -/// The `do..while` statement. -#[derive(Clone, Serialize, Deserialize)] -pub struct DoStatement { - pub location: Location, - pub body: Rc, - pub test: Rc, -} \ No newline at end of file diff --git a/crates/parser/tree/empty_statement.rs b/crates/parser/tree/empty_statement.rs deleted file mode 100644 index 73ac431..0000000 --- a/crates/parser/tree/empty_statement.rs +++ /dev/null @@ -1,7 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -#[derive(Clone, Serialize, Deserialize)] -pub struct EmptyStatement { - pub location: Location, -} \ No newline at end of file diff --git a/crates/parser/tree/enum_definition.rs b/crates/parser/tree/enum_definition.rs deleted file mode 100644 index b1892eb..0000000 --- a/crates/parser/tree/enum_definition.rs +++ /dev/null @@ -1,13 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -#[derive(Clone, Serialize, Deserialize)] -pub struct EnumDefinition { - pub location: Location, - pub asdoc: Option>, - pub attributes: Vec, - pub is_set: bool, - pub name: (String, Location), - pub as_clause: Option>, - pub block: Rc, -} \ No newline at end of file diff --git a/crates/parser/tree/expression.rs b/crates/parser/tree/expression.rs deleted file mode 100644 index 25e77da..0000000 --- a/crates/parser/tree/expression.rs +++ /dev/null @@ -1,276 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -/// Expression attached with a source location. -#[derive(Clone, Serialize, Deserialize)] -pub enum Expression { - QualifiedIdentifier(QualifiedIdentifier), - Paren(ParenExpression), - NullLiteral(NullLiteral), - BooleanLiteral(BooleanLiteral), - NumericLiteral(NumericLiteral), - StringLiteral(StringLiteral), - ThisLiteral(ThisLiteral), - RegExpLiteral(RegExpLiteral), - Xml(XmlExpression), - XmlMarkup(XmlMarkupExpression), - XmlList(XmlListExpression), - ArrayLiteral(ArrayLiteral), - VectorLiteral(VectorLiteral), - ObjectInitializer(ObjectInitializer), - Function(FunctionExpression), - ImportMeta(ImportMeta), - New(NewExpression), - Member(MemberExpression), - ComputedMember(ComputedMemberExpression), - Descendants(DescendantsExpression), - Filter(FilterExpression), - Super(SuperExpression), - Call(CallExpression), - WithTypeArguments(ExpressionWithTypeArguments), - Unary(UnaryExpression), - OptionalChaining(OptionalChainingExpression), - OptionalChainingPlaceholder(OptionalChainingPlaceholder), - Binary(BinaryExpression), - Conditional(ConditionalExpression), - Assignment(AssignmentExpression), - Sequence(SequenceExpression), - NullableType(NullableTypeExpression), - NonNullableType(NonNullableTypeExpression), - AnyType(AnyTypeExpression), - VoidType(VoidTypeExpression), - ArrayType(ArrayTypeExpression), - TupleType(TupleTypeExpression), - FunctionType(FunctionTypeExpression), - Invalidated(InvalidatedNode), - ReservedNamespace(ReservedNamespaceExpression), -} - -impl Expression { - pub fn location(&self) -> Location { - match self { - Self::QualifiedIdentifier(e) => e.location.clone(), - Self::Paren(e) => e.location.clone(), - Self::NullLiteral(e) => e.location.clone(), - Self::BooleanLiteral(e) => e.location.clone(), - Self::NumericLiteral(e) => e.location.clone(), - Self::StringLiteral(e) => e.location.clone(), - Self::ThisLiteral(e) => e.location.clone(), - Self::RegExpLiteral(e) => e.location.clone(), - Self::Xml(e) => e.location.clone(), - Self::XmlMarkup(e) => e.location.clone(), - Self::XmlList(e) => e.location.clone(), - Self::ArrayLiteral(e) => e.location.clone(), - Self::VectorLiteral(e) => e.location.clone(), - Self::ObjectInitializer(e) => e.location.clone(), - Self::Function(e) => e.location.clone(), - Self::ImportMeta(e) => e.location.clone(), - Self::New(e) => e.location.clone(), - Self::Member(e) => e.location.clone(), - Self::ComputedMember(e) => e.location.clone(), - Self::Descendants(e) => e.location.clone(), - Self::Filter(e) => e.location.clone(), - Self::Super(e) => e.location.clone(), - Self::Call(e) => e.location.clone(), - Self::WithTypeArguments(e) => e.location.clone(), - Self::Unary(e) => e.location.clone(), - Self::OptionalChaining(e) => e.location.clone(), - Self::OptionalChainingPlaceholder(e) => e.location.clone(), - Self::Binary(e) => e.location.clone(), - Self::Conditional(e) => e.location.clone(), - Self::Assignment(e) => e.location.clone(), - Self::Sequence(e) => e.location.clone(), - Self::NullableType(e) => e.location.clone(), - Self::NonNullableType(e) => e.location.clone(), - Self::AnyType(e) => e.location.clone(), - Self::VoidType(e) => e.location.clone(), - Self::ArrayType(e) => e.location.clone(), - Self::TupleType(e) => e.location.clone(), - Self::FunctionType(e) => e.location.clone(), - Self::Invalidated(e) => e.location.clone(), - Self::ReservedNamespace(e) => e.location(), - } - } - - pub(crate) fn to_metadata(&self, parser: &Parser) -> Result>, MetadataRefineError1> { - match self { - Self::ArrayLiteral(ArrayLiteral { elements, asdoc, .. }) => { - if elements.len() != 1 { - return Ok(None); - } - if let Element::Expression(ref exp) = elements[0] { - Ok(Some(vec![Attribute::Metadata(parser.refine_metadata(exp, asdoc.clone()).map_err(|e| MetadataRefineError1(e, exp.location()))?)])) - } else { - Ok(None) - } - }, - Self::ComputedMember(ComputedMemberExpression { base, asdoc, key, .. }) => { - let a = base.to_metadata(parser)?; - if a.is_none() { - return Ok(None); - } - let mut a = a.unwrap(); - if matches!(key.as_ref(), Self::Sequence(_)) { - return Ok(None); - } - a.push(Attribute::Metadata(parser.refine_metadata(key, asdoc.clone()).map_err(|e| MetadataRefineError1(e, key.location()))?)); - Ok(Some(a)) - }, - _ => Ok(None), - } - } - - pub fn to_identifier_name_or_asterisk(&self) -> Option<(String, Location)> { - match self { - Self::QualifiedIdentifier(id) => id.to_identifier_name_or_asterisk(), - _ => None, - } - } - - pub fn to_identifier_name(&self) -> Option<(String, Location)> { - match self { - Self::QualifiedIdentifier(id) => id.to_identifier_name(), - _ => None, - } - } - - pub fn valid_access_modifier(&self) -> bool { - match self { - Self::QualifiedIdentifier(id) => id.is_identifier_token(), - Self::Member(e) => e.base.valid_access_modifier(), - Self::ComputedMember(e) => e.base.valid_access_modifier(), - _ => false, - } - } - - pub(crate) fn to_reserved_namespace_string(&self) -> Option { - if let Self::ReservedNamespace(e) = self { - Some(e.to_string()) - } else { - None - } - } - - pub(crate) fn to_reserved_namespace_attribute(&self) -> Option { - if let Self::ReservedNamespace(e) = self { - Some(e.to_attribute()) - } else { - None - } - } - - pub fn is_invalidated(&self) -> bool { - matches!(self, Self::Invalidated(_)) - } - - pub fn is_non_null_operation(&self) -> bool { - match self { - Self::Unary(expr) => expr.operator == Operator::NonNull, - _ => false, - } - } - - pub fn is_valid_assignment_left_hand_side(&self) -> bool { - match self { - Self::Invalidated(_) => true, - Self::Unary(e) => e.expression.is_valid_assignment_left_hand_side(), - Self::ArrayLiteral(_) | Self::ObjectInitializer(_) => self.is_valid_destructuring(), - _ => true, - } - } - - pub fn is_valid_destructuring(&self) -> bool { - match self { - Self::Invalidated(_) => true, - Self::QualifiedIdentifier(id) => !id.attribute && id.qualifier.is_none() && match &id.id { - QualifiedIdentifierIdentifier::Id(id) => id.0 != "*", - _ => false, - }, - Self::ArrayLiteral(expr) => { - for el in &expr.elements { - match el { - Element::Elision => {}, - Element::Expression(expr) => { - if !expr.is_valid_destructuring() { - return false; - } - }, - Element::Rest((expr, _)) => { - if !expr.is_valid_destructuring() { - return false; - } - }, - } - } - true - }, - Self::ObjectInitializer(init) => { - for field in init.fields.iter() { - match field.as_ref() { - InitializerField::Field { value, .. } => { - if let Some(val) = value { - if !val.is_valid_destructuring() { - return false; - } - } - }, - InitializerField::Rest((expr, _)) => { - if !expr.is_valid_destructuring() { - return false; - } - }, - } - } - true - }, - Self::Unary(expr) => expr.operator == Operator::NonNull && expr.expression.is_valid_destructuring(), - _ => false, - } - } - - /// `CONFIG::VAR_NAME` - pub(crate) fn to_normal_configuration_identifier(&self, parser: &Parser) -> Result)>, MetadataRefineError1> { - if let Self::QualifiedIdentifier(id) = self { - if id.attribute { - return Ok(None); - } - if let Some(q) = &id.qualifier { - if let Some(q) = q.to_identifier_name() { - if let QualifiedIdentifierIdentifier::Id(id) = &id.id { - return Ok(Some((q, id.clone(), vec![]))); - } - } - } - } - if let Self::ComputedMember(ComputedMemberExpression { base, asdoc, key, .. }) = self { - let a = base.to_normal_configuration_identifier(parser)?; - if a.is_none() { - return Ok(None); - } - let (ns, name, mut a) = a.unwrap(); - if matches!(key.as_ref(), Self::Sequence(_)) { - return Ok(None); - } - a.push(Attribute::Metadata(parser.refine_metadata(key, asdoc.clone()).map_err(|e| MetadataRefineError1(e, key.location()))?)); - return Ok(Some((ns, name, a))); - } - Ok(None) - } - - /// `CONFIG::VAR_NAME` - pub(crate) fn to_normal_configuration_identifier_no_metadata(&self) -> Option<((String, Location), (String, Location))> { - if let Self::QualifiedIdentifier(id) = self { - if id.attribute { - return None; - } - if let Some(q) = &id.qualifier { - if let Some(q) = q.to_identifier_name() { - if let QualifiedIdentifierIdentifier::Id(id) = &id.id { - return Some((q, id.clone())); - } - } - } - } - None - } -} \ No newline at end of file diff --git a/crates/parser/tree/expression_statement.rs b/crates/parser/tree/expression_statement.rs deleted file mode 100644 index 779fc81..0000000 --- a/crates/parser/tree/expression_statement.rs +++ /dev/null @@ -1,8 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -#[derive(Clone, Serialize, Deserialize)] -pub struct ExpressionStatement { - pub location: Location, - pub expression: Rc, -} \ No newline at end of file diff --git a/crates/parser/tree/expression_with_type_arguments.rs b/crates/parser/tree/expression_with_type_arguments.rs deleted file mode 100644 index 8cf5e84..0000000 --- a/crates/parser/tree/expression_with_type_arguments.rs +++ /dev/null @@ -1,10 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -/// The `o.<...>` expression. -#[derive(Clone, Serialize, Deserialize)] -pub struct ExpressionWithTypeArguments { - pub location: Location, - pub base: Rc, - pub arguments: Vec>, -} \ No newline at end of file diff --git a/crates/parser/tree/filter_expression.rs b/crates/parser/tree/filter_expression.rs deleted file mode 100644 index 734b6e7..0000000 --- a/crates/parser/tree/filter_expression.rs +++ /dev/null @@ -1,10 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -/// Filter operation `o.(condition)`. -#[derive(Clone, Serialize, Deserialize)] -pub struct FilterExpression { - pub location: Location, - pub base: Rc, - pub test: Rc, -} \ No newline at end of file diff --git a/crates/parser/tree/for_statement.rs b/crates/parser/tree/for_statement.rs deleted file mode 100644 index f648a97..0000000 --- a/crates/parser/tree/for_statement.rs +++ /dev/null @@ -1,32 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -#[derive(Clone, Serialize, Deserialize)] -pub struct ForStatement { - pub location: Location, - pub init: Option, - pub test: Option>, - pub update: Option>, - pub body: Rc, -} - -#[derive(Clone, Serialize, Deserialize)] -pub enum ForInitializer { - Expression(Rc), - VariableDefinition(Rc), -} - -#[derive(Clone, Serialize, Deserialize)] -pub struct ForInStatement { - pub location: Location, - pub each: bool, - pub left: ForInBinding, - pub right: Rc, - pub body: Rc, -} - -#[derive(Clone, Serialize, Deserialize)] -pub enum ForInBinding { - Expression(Rc), - VariableDefinition(Rc), -} \ No newline at end of file diff --git a/crates/parser/tree/function_definition.rs b/crates/parser/tree/function_definition.rs deleted file mode 100644 index 6da842e..0000000 --- a/crates/parser/tree/function_definition.rs +++ /dev/null @@ -1,111 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -#[derive(Clone, Serialize, Deserialize)] -pub struct FunctionDefinition { - pub location: Location, - pub asdoc: Option>, - pub attributes: Vec, - pub name: FunctionName, - pub common: Rc, -} - -impl FunctionDefinition { - /// Indicates whether the function definition is not a getter, setter, - /// or constructor. - pub fn is_normal(&self) -> bool { - matches!(self.name, FunctionName::Identifier(_)) - } - pub fn is_getter(&self) -> bool { - matches!(self.name, FunctionName::Getter(_)) - } - pub fn is_setter(&self) -> bool { - matches!(self.name, FunctionName::Setter(_)) - } - pub fn is_constructor(&self) -> bool { - matches!(self.name, FunctionName::Constructor(_)) - } - pub fn name_identifier(&self) -> (String, Location) { - match &self.name { - FunctionName::Identifier(name) => name.clone(), - FunctionName::Getter(name) => name.clone(), - FunctionName::Setter(name) => name.clone(), - FunctionName::Constructor(name) => name.clone(), - } - } -} - -#[derive(Clone, Serialize, Deserialize)] -pub enum FunctionName { - Identifier((String, Location)), - Getter((String, Location)), - Setter((String, Location)), - /// A `FunctionName` is a `Constructor` variant - /// when the corresponding function definition is a constructor. - Constructor((String, Location)), -} - -impl FunctionName { - pub fn location(&self) -> Location { - match self { - Self::Identifier((_, l)) => l.clone(), - Self::Getter((_, l)) => l.clone(), - Self::Setter((_, l)) => l.clone(), - Self::Constructor((_, l)) => l.clone(), - } - } -} - -#[derive(Clone, Serialize, Deserialize)] -pub struct FunctionCommon { - pub location: Location, - /// Indicates whether the corresponding function - /// contains the `yield` operator. - pub contains_yield: bool, - /// Indicates whether the corresponding function - /// contains the `await` operator. - pub contains_await: bool, - pub signature: FunctionSignature, - pub body: Option, -} - -impl FunctionCommon { - pub(crate) fn has_block_body(&self) -> bool { - if let Some(ref body) = self.body { matches!(body, FunctionBody::Block(_)) } else { false } - } -} - -#[derive(Clone, Serialize, Deserialize)] -pub struct FunctionSignature { - pub location: Location, - pub parameters: Vec>, - pub result_type: Option>, -} - -#[derive(Clone, Serialize, Deserialize)] -pub struct Parameter { - pub location: Location, - pub kind: ParameterKind, - pub destructuring: TypedDestructuring, - pub default_value: Option>, -} - -#[derive(Copy, Clone, Serialize, Deserialize, PartialEq, Eq)] -#[repr(u32)] -pub enum ParameterKind { - Required = 1, - Optional = 2, - Rest = 3, -} - -impl ParameterKind { - pub fn may_be_followed_by(&self, other: Self) -> bool { - (*self as u32) <= (other as u32) - } -} - -#[derive(Clone, Serialize, Deserialize)] -pub enum FunctionBody { - Expression(Rc), - Block(Rc), -} \ No newline at end of file diff --git a/crates/parser/tree/function_expression.rs b/crates/parser/tree/function_expression.rs deleted file mode 100644 index 377512e..0000000 --- a/crates/parser/tree/function_expression.rs +++ /dev/null @@ -1,9 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -#[derive(Clone, Serialize, Deserialize)] -pub struct FunctionExpression { - pub location: Location, - pub name: Option<(String, Location)>, - pub common: Rc, -} \ No newline at end of file diff --git a/crates/parser/tree/if_statement.rs b/crates/parser/tree/if_statement.rs deleted file mode 100644 index cf84ca0..0000000 --- a/crates/parser/tree/if_statement.rs +++ /dev/null @@ -1,10 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -#[derive(Clone, Serialize, Deserialize)] -pub struct IfStatement { - pub location: Location, - pub test: Rc, - pub consequent: Rc, - pub alternative: Option>, -} \ No newline at end of file diff --git a/crates/parser/tree/import_directive.rs b/crates/parser/tree/import_directive.rs deleted file mode 100644 index 40b6cdf..0000000 --- a/crates/parser/tree/import_directive.rs +++ /dev/null @@ -1,27 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -#[derive(Clone, Serialize, Deserialize)] -pub struct ImportDirective { - pub location: Location, - pub alias: Option<(String, Location)>, - pub package_name: Vec<(String, Location)>, - pub import_specifier: ImportSpecifier, -} - -#[derive(Clone, Serialize, Deserialize)] -pub enum ImportSpecifier { - Wildcard(Location), - Recursive(Location), - Identifier((String, Location)), -} - -impl ImportSpecifier { - pub fn location(&self) -> Location { - match self { - Self::Wildcard(l) | - Self::Recursive(l) => l.clone(), - Self::Identifier((_, l)) => l.clone(), - } - } -} \ No newline at end of file diff --git a/crates/parser/tree/import_meta.rs b/crates/parser/tree/import_meta.rs deleted file mode 100644 index be968ce..0000000 --- a/crates/parser/tree/import_meta.rs +++ /dev/null @@ -1,8 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -/// The `import.meta` expression. -#[derive(Clone, Serialize, Deserialize)] -pub struct ImportMeta { - pub location: Location, -} \ No newline at end of file diff --git a/crates/parser/tree/include_directive.rs b/crates/parser/tree/include_directive.rs deleted file mode 100644 index 01faef3..0000000 --- a/crates/parser/tree/include_directive.rs +++ /dev/null @@ -1,12 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -#[derive(Clone, Serialize, Deserialize)] -pub struct IncludeDirective { - pub location: Location, - pub source: String, - #[serde(skip)] - pub nested_compilation_unit: Rc, - pub nested_packages: Vec>, - pub nested_directives: Vec>, -} \ No newline at end of file diff --git a/crates/parser/tree/interface_definition.rs b/crates/parser/tree/interface_definition.rs deleted file mode 100644 index 00dcb67..0000000 --- a/crates/parser/tree/interface_definition.rs +++ /dev/null @@ -1,13 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -#[derive(Clone, Serialize, Deserialize)] -pub struct InterfaceDefinition { - pub location: Location, - pub asdoc: Option>, - pub attributes: Vec, - pub name: (String, Location), - pub type_parameters: Option>>, - pub extends_clause: Option>>, - pub block: Rc, -} \ No newline at end of file diff --git a/crates/parser/tree/invalidated_node.rs b/crates/parser/tree/invalidated_node.rs deleted file mode 100644 index f15957d..0000000 --- a/crates/parser/tree/invalidated_node.rs +++ /dev/null @@ -1,8 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -/// Represents a construct that failed to parse. -#[derive(Clone, Serialize, Deserialize)] -pub struct InvalidatedNode { - pub location: Location, -} \ No newline at end of file diff --git a/crates/parser/tree/labeled_statement.rs b/crates/parser/tree/labeled_statement.rs deleted file mode 100644 index 81cb248..0000000 --- a/crates/parser/tree/labeled_statement.rs +++ /dev/null @@ -1,9 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -#[derive(Clone, Serialize, Deserialize)] -pub struct LabeledStatement { - pub location: Location, - pub label: (String, Location), - pub substatement: Rc, -} \ No newline at end of file diff --git a/crates/parser/tree/member_expression.rs b/crates/parser/tree/member_expression.rs deleted file mode 100644 index 66bb70e..0000000 --- a/crates/parser/tree/member_expression.rs +++ /dev/null @@ -1,9 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -#[derive(Clone, Serialize, Deserialize)] -pub struct MemberExpression { - pub location: Location, - pub base: Rc, - pub identifier: QualifiedIdentifier, -} \ No newline at end of file diff --git a/crates/parser/tree/mxml.rs b/crates/parser/tree/mxml.rs deleted file mode 100644 index d7dfbca..0000000 --- a/crates/parser/tree/mxml.rs +++ /dev/null @@ -1,217 +0,0 @@ -use std::collections::BTreeMap; - -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -#[derive(Clone, Serialize, Deserialize)] -pub struct Mxml { - pub location: Location, - pub version: XmlVersion, - pub encoding: String, - pub content: Vec>, -} - -#[derive(Copy, Clone, PartialEq, Eq, Serialize, Deserialize)] -pub enum XmlVersion { - /// XML version 1.0. - Version10, -} - -#[derive(Clone, Serialize, Deserialize)] -pub struct MxmlElement { - pub location: Location, - pub name: MxmlName, - /// Attribute list, including `xmlns` and `xmlns:` namespace prefixes. - pub attributes: Vec>, - /// The namespace mapping relative to the XML element. - #[serde(skip)] - pub namespace: Rc, - pub content: Option>>, - pub closing_name: Option, -} - -impl MxmlElement { - pub fn inner_text(&self) -> String { - let mut j = String::new(); - if let Some(c) = self.content.as_ref() { - for c1 in c.iter() { - j.push_str(&c1.inner_text()); - } - } - j - } -} - -#[derive(Clone, Serialize, Deserialize)] -pub struct MxmlAttribute { - pub location: Location, - /// Indicates whether the attribute is a `xmlns` or `xmlns:` attribute. - pub xmlns: bool, - pub name: MxmlName, - /// Attribute value. The location data includes the quotes. - pub value: (String, Location), -} - -#[derive(Clone, Serialize, Deserialize)] -pub struct MxmlName { - pub location: Location, - /// The unresolved prefix of the name. - pub prefix: Option, - pub name: String, -} - -impl MxmlName { - pub fn resolve_prefix(&self, namespace: &Rc) -> Result { - let Some(p) = self.prefix.as_ref() else { - return if let Some(v) = namespace.get(MxmlNamespace::DEFAULT_NAMESPACE) { - Ok(v) - } else { - Err(MxmlNameError::PrefixNotDefined(MxmlNamespace::DEFAULT_NAMESPACE.into())) - }; - }; - if let Some(v) = namespace.get(p) { - Ok(v) - } else { - Err(MxmlNameError::PrefixNotDefined(p.clone())) - } - } - - pub fn resolve_name(&self, namespace: &Rc) -> Result<(String, String), MxmlNameError> { - let p = self.resolve_prefix(namespace)?; - Ok((p, self.name.clone())) - } - - pub fn equals_name(&self, other: &Self, namespace: &Rc) -> Result { - if self.name != other.name { - return Ok(false); - } - let p1 = self.resolve_prefix(namespace)?; - let p2 = other.resolve_prefix(namespace)?; - Ok(&p1 == &p2) - } - - pub fn to_string(&self, namespace: &Rc) -> String { - self.resolve_name(namespace).map(|(uri, localname)| { - if uri.is_empty() { - return localname; - } - format!("{uri}:{localname}") - }).unwrap_or("[error]".into()) - } -} - -#[derive(Clone)] -pub enum MxmlNameError { - PrefixNotDefined(String), -} - -#[derive(Clone, Serialize, Deserialize)] -pub enum MxmlContent { - Characters((String, Location)), - /// A CDATA construct, including the first `` characters. - CData((String, Location)), - /// A comment construct, including the first `` characters. - Comment((String, Location)), - ProcessingInstruction { - location: Location, - name: String, - data: Option, - }, - Element(Rc), -} - -impl MxmlContent { - pub fn location(&self) -> Location { - match self { - Self::Characters((_, l)) => l.clone(), - Self::CData((_, l)) => l.clone(), - Self::Comment((_, l)) => l.clone(), - Self::ProcessingInstruction { location: l, .. } => l.clone(), - Self::Element(e) => e.location.clone(), - } - } - - pub fn inner_text(&self) -> String { - match self { - Self::Characters((data, _)) => data.clone(), - Self::CData((data, _)) => data[" String::new(), - Self::ProcessingInstruction { .. } => String::new(), - Self::Element(e) => e.inner_text(), - } - } -} - -/// Mapping of namespace prefixes. -#[derive(Clone, PartialEq)] -pub struct MxmlNamespace { - parent: Option>, - mappings: RefCell>, -} - -impl Default for MxmlNamespace { - fn default() -> Self { - Self::new(None) - } -} - -impl MxmlNamespace { - /// Returns the prefix used for the default XML namespace. - pub const DEFAULT_NAMESPACE: &'static str = ""; - - /// Constructs an empty set of namespace mappings. - pub fn new(parent: Option<&Rc>) -> Self { - let mut ns = Self { - parent: parent.map(|p| p.clone()), - mappings: RefCell::new(BTreeMap::new()), - }; - if ns.parent.is_none() { - ns.mappings.get_mut().insert(Self::DEFAULT_NAMESPACE.into(), "".into()); - ns.mappings.get_mut().insert("xmlns".into(), "http://www.w3.org/xml/xmlns".into()); - } - ns - } - - pub fn includes(&self, prefix: &str) -> bool { - self.mappings.borrow().contains_key(prefix) || match &self.parent { - Some(p) => p.includes(prefix), - None => false, - } - } - - /// Retrieves the value of a prefix either in the actual - /// set of mappings or in the parent set of mappings. - pub fn get(&self, prefix: &str) -> Option { - if let Some(value) = self.mappings.borrow().get(prefix) { - return Some(value.clone()); - } - self.parent.as_ref().and_then(|p| p.get(prefix)) - } - - pub fn set(&self, prefix: &str, value: &str) { - self.mappings.borrow_mut().insert(prefix.to_owned(), value.to_owned()); - } - - pub fn delete(&self, prefix: &str) -> bool { - self.mappings.borrow_mut().remove(prefix).is_some() - } - - pub fn clear(&self) { - self.mappings.borrow_mut().clear(); - } - - /// Returns the actual set of prefix mappings. - pub fn listing(&self) -> BTreeMap { - self.mappings.borrow().clone() - } - - /// Returns a concatenation of the parent set of prefix mappings - /// and the actual set of prefix mappings. - pub fn full_listing(&self) -> BTreeMap { - let mut listing = self.parent.as_ref().map_or(BTreeMap::new(), |p| p.full_listing()); - listing.extend(self.listing()); - listing - } -} diff --git a/crates/parser/tree/namespace_definition.rs b/crates/parser/tree/namespace_definition.rs deleted file mode 100644 index 1f77880..0000000 --- a/crates/parser/tree/namespace_definition.rs +++ /dev/null @@ -1,11 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -#[derive(Clone, Serialize, Deserialize)] -pub struct NamespaceDefinition { - pub location: Location, - pub asdoc: Option>, - pub attributes: Vec, - pub left: (String, Location), - pub right: Option>, -} \ No newline at end of file diff --git a/crates/parser/tree/new_expression.rs b/crates/parser/tree/new_expression.rs deleted file mode 100644 index 862e2da..0000000 --- a/crates/parser/tree/new_expression.rs +++ /dev/null @@ -1,9 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -#[derive(Clone, Serialize, Deserialize)] -pub struct NewExpression { - pub location: Location, - pub base: Rc, - pub arguments: Option>>, -} \ No newline at end of file diff --git a/crates/parser/tree/normal_configuration_directive.rs b/crates/parser/tree/normal_configuration_directive.rs deleted file mode 100644 index 3083db8..0000000 --- a/crates/parser/tree/normal_configuration_directive.rs +++ /dev/null @@ -1,13 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -/// Represents a `CONFIG::x ...` directive. -#[derive(Clone, Serialize, Deserialize)] -pub struct NormalConfigurationDirective { - pub location: Location, - /// The namespace, most commonly the `CONFIG` identifier. - pub namespace: (String, Location), - /// The constant name without including the qualifier. - pub constant_name: (String, Location), - pub directive: Rc, -} \ No newline at end of file diff --git a/crates/parser/tree/null_literal.rs b/crates/parser/tree/null_literal.rs deleted file mode 100644 index 6f286b7..0000000 --- a/crates/parser/tree/null_literal.rs +++ /dev/null @@ -1,7 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -#[derive(Clone, Serialize, Deserialize)] -pub struct NullLiteral { - pub location: Location, -} \ No newline at end of file diff --git a/crates/parser/tree/numeric_literal.rs b/crates/parser/tree/numeric_literal.rs deleted file mode 100644 index b695ebd..0000000 --- a/crates/parser/tree/numeric_literal.rs +++ /dev/null @@ -1,157 +0,0 @@ -use crate::ns::*; -use num_bigint::BigInt; -use serde::{Serialize, Deserialize}; -use std::str::FromStr; -use conv::ValueFrom; -use num_traits::ToPrimitive; - -#[derive(Clone, Serialize, Deserialize)] -pub struct NumericLiteral { - pub location: Location, - /// The numeric value in character representation. Such representation may be parsed - /// through data type specific methods such as [`NumericLiteral::parse_double()`]. - pub value: String, - pub suffix: NumberSuffix, -} - -#[derive(Debug, Copy, Clone, Serialize, Deserialize, PartialEq)] -pub enum NumberSuffix { - None, - F, -} - -impl NumericLiteral { - /// Parses a double-precision floating point either in - /// decimal, binary (`0b`) or hexadecimal (`0x`) notation. - pub fn parse_double(&self, negative: bool) -> Result { - let s = self.value.replace('_', ""); - if s.starts_with('0') { - if s[1..].starts_with('x') || s[1..].starts_with('X') { - let n = u64::from_str_radix(&(if negative { "-" } else { "" }.to_owned() + &s[2..]), 16); - return n.map_err(|_| ParserError::Common) - .and_then(|n| f64::value_from(n).map_err(|_| ParserError::Common)); - } else if s[1..].starts_with('b') || s[1..].starts_with('B') { - let n = u64::from_str_radix(&(if negative { "-" } else { "" }.to_owned() + &s[2..]), 2); - return n.map_err(|_| ParserError::Common) - .and_then(|n| f64::value_from(n).map_err(|_| ParserError::Common)); - } - } - f64::from_str(&(if negative { "-" } else { "" }.to_owned() + &s)).map_err(|_| ParserError::Common) - } - - /// Parses a single-precision floating point either in - /// decimal, binary (`0b`) or hexadecimal (`0x`) notation. - pub fn parse_float(&self, negative: bool) -> Result { - let s = self.value.replace('_', ""); - if s.starts_with('0') { - if s[1..].starts_with('x') || s[1..].starts_with('X') { - let n = u64::from_str_radix(&(if negative { "-" } else { "" }.to_owned() + &s[2..]), 16); - return n.map_err(|_| ParserError::Common) - .and_then(|n| f32::value_from(n).map_err(|_| ParserError::Common)); - } else if s[1..].starts_with('b') || s[1..].starts_with('B') { - let n = u64::from_str_radix(&(if negative { "-" } else { "" }.to_owned() + &s[2..]), 2); - return n.map_err(|_| ParserError::Common) - .and_then(|n| f32::value_from(n).map_err(|_| ParserError::Common)); - } - } - f32::from_str(&(if negative { "-" } else { "" }.to_owned() + &s)).map_err(|_| ParserError::Common) - } - - /// Parses a signed long either in - /// decimal, binary (`0b`) or hexadecimal (`0x`) notation. - pub fn parse_long(&self, negative: bool) -> Result { - let s = self.value.replace('_', ""); - if s.starts_with('0') { - if s[1..].starts_with('x') || s[1..].starts_with('X') { - let n = i64::from_str_radix(&(if negative { "-" } else { "" }.to_owned() + &s[2..]), 16); - return n.map_err(|_| ParserError::Common); - } else if s[1..].starts_with('b') || s[1..].starts_with('B') { - let n = i64::from_str_radix(&(if negative { "-" } else { "" }.to_owned() + &s[2..]), 2); - return n.map_err(|_| ParserError::Common); - } - } - i64::from_str(&s).map_err(|_| ParserError::Common) - } - - /// Parses a signed integer either in - /// decimal, binary (`0b`) or hexadecimal (`0x`) notation. - pub fn parse_int(&self, negative: bool) -> Result { - let s = self.value.replace('_', ""); - if s.starts_with('0') { - if s[1..].starts_with('x') || s[1..].starts_with('X') { - let n = i32::from_str_radix(&(if negative { "-" } else { "" }.to_owned() + &s[2..]), 16); - return n.map_err(|_| ParserError::Common); - } else if s[1..].starts_with('b') || s[1..].starts_with('B') { - let n = i32::from_str_radix(&(if negative { "-" } else { "" }.to_owned() + &s[2..]), 2); - return n.map_err(|_| ParserError::Common); - } - } - i32::from_str(&s).map_err(|_| ParserError::Common) - } - - /// Parses an unsigned integer either in - /// decimal, binary (`0b`) or hexadecimal (`0x`) notation. - pub fn parse_uint(&self) -> Result { - let s = self.value.replace('_', ""); - if s.starts_with('0') { - if s[1..].starts_with('x') || s[1..].starts_with('X') { - let n = u32::from_str_radix(&s[2..], 16); - return n.map_err(|_| ParserError::Common); - } else if s[1..].starts_with('b') || s[1..].starts_with('B') { - let n = u32::from_str_radix(&s[2..], 2); - return n.map_err(|_| ParserError::Common); - } - } - u32::from_str(&s).map_err(|_| ParserError::Common) - } - - /// Parses a big integer either in - /// decimal, binary (`0b`) or hexadecimal (`0x`) notation. - pub fn parse_big_int(&self, negative: bool) -> Result { - let s = self.value.replace('_', ""); - if s.starts_with('0') { - if s[1..].starts_with('x') || s[1..].starts_with('X') { - let mut digits: Vec = vec![]; - for ch in s[2..].chars() { - digits.push(CharacterValidator::hex_digit_mv(ch).unwrap().to_u8().unwrap()); - } - let n = BigInt::from_radix_be(if negative { num_bigint::Sign::Minus } else { num_bigint::Sign::Plus }, &digits, 16); - return n.map_or(Err(ParserError::Common), |n| Ok(n)); - } else if s[1..].starts_with('b') || s[1..].starts_with('B') { - let mut digits: Vec = vec![]; - for ch in s[2..].chars() { - digits.push(CharacterValidator::bin_digit_mv(ch).unwrap().to_u8().unwrap()); - } - let n = BigInt::from_radix_be(if negative { num_bigint::Sign::Minus } else { num_bigint::Sign::Plus }, &digits, 2); - return n.map_or(Err(ParserError::Common), |n| Ok(n)); - } - } - BigInt::from_str(&s).map_err(|_| ParserError::Common) - } -} - -mod tests { - #[allow(unused)] - use crate::ns::*; - #[allow(unused)] - use std::rc::Rc; - - #[test] - fn test_minimum_maximum() { - // Long.MIN_VALUE - let literal = NumericLiteral { - location: Location::with_offset(&Rc::new(CompilationUnit::default()), 0), - value: "0x8000_0000_0000_0000".to_owned(), - suffix: NumberSuffix::None, - }; - assert_eq!(i64::MIN, literal.parse_long(true).unwrap()); - - // Long.MAX_VALUE - let literal = NumericLiteral { - location: Location::with_offset(&Rc::new(CompilationUnit::default()), 0), - value: "0x7FFF_FFFF_FFFF_FFFF".to_owned(), - suffix: NumberSuffix::None, - }; - assert_eq!(i64::MAX, literal.parse_long(false).unwrap()); - } -} \ No newline at end of file diff --git a/crates/parser/tree/object_initializer.rs b/crates/parser/tree/object_initializer.rs deleted file mode 100644 index d7e6cbb..0000000 --- a/crates/parser/tree/object_initializer.rs +++ /dev/null @@ -1,63 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -#[derive(Clone, Serialize, Deserialize)] -pub struct ObjectInitializer { - pub location: Location, - pub fields: Vec>, -} - -#[derive(Clone, Serialize, Deserialize)] -pub enum InitializerField { - Field { - name: (FieldName, Location), - /// Non-null operator used for destructuring. - non_null: bool, - value: Option>, - }, - Rest((Rc, Location)), -} - -impl InitializerField { - pub fn location(&self) -> Location { - match self { - Self::Field { ref name, ref value, .. } => { - value.clone().map_or(name.1.clone(), |v| name.1.combine_with(v.location())) - }, - Self::Rest((_, ref l)) => l.clone(), - } - } - - pub fn shorthand(&self) -> Option<&QualifiedIdentifier> { - if let Self::Field { name, .. } = self { - if let FieldName::Identifier(qid) = &name.0 { - Some(qid) - } else { - None - } - } else { - None - } - } -} - -#[derive(Clone, Serialize, Deserialize)] -pub enum FieldName { - Identifier(QualifiedIdentifier), - Brackets(Rc), - StringLiteral(Rc), - NumericLiteral(Rc), -} - -impl FieldName { - pub(crate) fn id(&self) -> Option<&QualifiedIdentifier> { - let Self::Identifier(id) = &self else { - return None; - }; - Some(id) - } - - pub fn id_equals(&self, name: &str) -> bool { - self.id().map(|name1| name == name1.to_identifier_name_or_asterisk().map(|id| id.0.clone()).unwrap_or("".into())).unwrap_or(false) - } -} \ No newline at end of file diff --git a/crates/parser/tree/optional_chaining_expression.rs b/crates/parser/tree/optional_chaining_expression.rs deleted file mode 100644 index b78c630..0000000 --- a/crates/parser/tree/optional_chaining_expression.rs +++ /dev/null @@ -1,21 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -/// An expression followed by optional chaining operations. -#[derive(Clone, Serialize, Deserialize)] -pub struct OptionalChainingExpression { - pub location: Location, - pub base: Rc, - /// Optional chaining operations. - /// - /// An `OptionalChainingPlaceholder` node is is the topmost expression - /// in the `expression` field. - pub expression: Rc, -} - -/// Internal expression used as the topmost expression -/// of a sequence of optional chaining operations. -#[derive(Clone, Serialize, Deserialize)] -pub struct OptionalChainingPlaceholder { - pub location: Location, -} \ No newline at end of file diff --git a/crates/parser/tree/package_concat_directive.rs b/crates/parser/tree/package_concat_directive.rs deleted file mode 100644 index dfed500..0000000 --- a/crates/parser/tree/package_concat_directive.rs +++ /dev/null @@ -1,10 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -/// The `public += ns.*;` directive. -#[derive(Clone, Serialize, Deserialize)] -pub struct PackageConcatDirective { - pub location: Location, - pub package_name: Vec<(String, Location)>, - pub import_specifier: ImportSpecifier, -} \ No newline at end of file diff --git a/crates/parser/tree/package_definition.rs b/crates/parser/tree/package_definition.rs deleted file mode 100644 index 8b447ce..0000000 --- a/crates/parser/tree/package_definition.rs +++ /dev/null @@ -1,10 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -#[derive(Clone, Serialize, Deserialize)] -pub struct PackageDefinition { - pub location: Location, - pub asdoc: Option>, - pub name: Vec<(String, Location)>, - pub block: Rc, -} \ No newline at end of file diff --git a/crates/parser/tree/paren_expression.rs b/crates/parser/tree/paren_expression.rs deleted file mode 100644 index ee3a330..0000000 --- a/crates/parser/tree/paren_expression.rs +++ /dev/null @@ -1,8 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -#[derive(Clone, Serialize, Deserialize)] -pub struct ParenExpression { - pub location: Location, - pub expression: Rc, -} \ No newline at end of file diff --git a/crates/parser/tree/program.rs b/crates/parser/tree/program.rs deleted file mode 100644 index 2cabb41..0000000 --- a/crates/parser/tree/program.rs +++ /dev/null @@ -1,9 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -#[derive(Clone, Serialize, Deserialize)] -pub struct Program { - pub location: Location, - pub packages: Vec>, - pub directives: Vec>, -} \ No newline at end of file diff --git a/crates/parser/tree/qualified_identifier.rs b/crates/parser/tree/qualified_identifier.rs deleted file mode 100644 index 34d2cf2..0000000 --- a/crates/parser/tree/qualified_identifier.rs +++ /dev/null @@ -1,49 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -#[derive(Clone, Serialize, Deserialize)] -pub struct QualifiedIdentifier { - pub location: Location, - pub attribute: bool, - pub qualifier: Option>, - pub id: QualifiedIdentifierIdentifier, -} - -#[derive(Clone, Serialize, Deserialize)] -pub enum QualifiedIdentifierIdentifier { - Id((String, Location)), - Brackets(Rc), -} - -impl QualifiedIdentifier { - pub fn to_identifier_name_or_asterisk(&self) -> Option<(String, Location)> { - if self.attribute || self.qualifier.is_some() { - None - } else { - if let QualifiedIdentifierIdentifier::Id(id) = &self.id { - Some(id.clone()) - } else { - None - } - } - } - - pub fn to_identifier_name(&self) -> Option<(String, Location)> { - if self.attribute || self.qualifier.is_some() { - None - } else { - if let QualifiedIdentifierIdentifier::Id(id) = &self.id { - if id.0 == "*" { None } else { Some(id.clone()) } - } else { - None - } - } - } - - pub fn is_identifier_token(&self) -> bool { - self.qualifier.is_none() && !self.attribute && match &self.id { - QualifiedIdentifierIdentifier::Id((id, _)) => id != "*", - _ => false, - } - } -} \ No newline at end of file diff --git a/crates/parser/tree/regexp_literal.rs b/crates/parser/tree/regexp_literal.rs deleted file mode 100644 index 366bf7a..0000000 --- a/crates/parser/tree/regexp_literal.rs +++ /dev/null @@ -1,9 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -#[derive(Clone, Serialize, Deserialize)] -pub struct RegExpLiteral { - pub location: Location, - pub body: String, - pub flags: String, -} \ No newline at end of file diff --git a/crates/parser/tree/reserved_namespace_expression.rs b/crates/parser/tree/reserved_namespace_expression.rs deleted file mode 100644 index 0e6e509..0000000 --- a/crates/parser/tree/reserved_namespace_expression.rs +++ /dev/null @@ -1,41 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -#[derive(Clone, Serialize, Deserialize)] -pub enum ReservedNamespaceExpression { - Public(Location), - Private(Location), - Protected(Location), - Internal(Location), -} - -impl ReservedNamespaceExpression { - pub fn location(&self) -> Location { - match self { - Self::Public(l) => l.clone(), - Self::Private(l) => l.clone(), - Self::Protected(l) => l.clone(), - Self::Internal(l) => l.clone(), - } - } - - pub fn to_attribute(&self) -> Attribute { - match self { - Self::Public(l) => Attribute::Public(l.clone()), - Self::Private(l) => Attribute::Private(l.clone()), - Self::Protected(l) => Attribute::Protected(l.clone()), - Self::Internal(l) => Attribute::Internal(l.clone()), - } - } -} - -impl ToString for ReservedNamespaceExpression { - fn to_string(&self) -> String { - match self { - Self::Public(_) => "public".into(), - Self::Private(_) => "private".into(), - Self::Protected(_) => "protected".into(), - Self::Internal(_) => "internal".into(), - } - } -} \ No newline at end of file diff --git a/crates/parser/tree/return_statement.rs b/crates/parser/tree/return_statement.rs deleted file mode 100644 index d31d41a..0000000 --- a/crates/parser/tree/return_statement.rs +++ /dev/null @@ -1,8 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -#[derive(Clone, Serialize, Deserialize)] -pub struct ReturnStatement { - pub location: Location, - pub expression: Option>, -} \ No newline at end of file diff --git a/crates/parser/tree/sequence_expression.rs b/crates/parser/tree/sequence_expression.rs deleted file mode 100644 index c6b9dfc..0000000 --- a/crates/parser/tree/sequence_expression.rs +++ /dev/null @@ -1,10 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -/// Sequence expression (`x, y`). -#[derive(Clone, Serialize, Deserialize)] -pub struct SequenceExpression { - pub location: Location, - pub left: Rc, - pub right: Rc, -} \ No newline at end of file diff --git a/crates/parser/tree/string_literal.rs b/crates/parser/tree/string_literal.rs deleted file mode 100644 index 2361c16..0000000 --- a/crates/parser/tree/string_literal.rs +++ /dev/null @@ -1,8 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -#[derive(Clone, Serialize, Deserialize)] -pub struct StringLiteral { - pub location: Location, - pub value: String, -} \ No newline at end of file diff --git a/crates/parser/tree/super_expression.rs b/crates/parser/tree/super_expression.rs deleted file mode 100644 index 8d47cdd..0000000 --- a/crates/parser/tree/super_expression.rs +++ /dev/null @@ -1,18 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -/// Super expression. -/// -/// The super expression must always be followed by a property operator. -/// When the super expression appears in evaluation, the immediately -/// following property operator is limited to access a property from the base class -/// or invoke a method of the base class. -/// -/// ``` -/// super.f() -/// ``` -#[derive(Clone, Serialize, Deserialize)] -pub struct SuperExpression { - pub location: Location, - pub object: Option>>, -} \ No newline at end of file diff --git a/crates/parser/tree/super_statement.rs b/crates/parser/tree/super_statement.rs deleted file mode 100644 index 22a520a..0000000 --- a/crates/parser/tree/super_statement.rs +++ /dev/null @@ -1,8 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -#[derive(Clone, Serialize, Deserialize)] -pub struct SuperStatement { - pub location: Location, - pub arguments: Vec>, -} \ No newline at end of file diff --git a/crates/parser/tree/switch_statement.rs b/crates/parser/tree/switch_statement.rs deleted file mode 100644 index 652ec62..0000000 --- a/crates/parser/tree/switch_statement.rs +++ /dev/null @@ -1,46 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -#[derive(Clone, Serialize, Deserialize)] -pub struct SwitchStatement { - pub location: Location, - pub discriminant: Rc, - pub cases: Vec, -} - -#[derive(Clone, Serialize, Deserialize)] -pub struct Case { - pub location: Location, - pub labels: Vec, - pub directives: Vec>, -} - -#[derive(Clone, Serialize, Deserialize)] -pub enum CaseLabel { - Case((Rc, Location)), - Default(Location), -} - -impl CaseLabel { - pub fn location(&self) -> Location { - match self { - Self::Case((_, l)) => l.clone(), - Self::Default(l) => l.clone(), - } - } -} - -#[derive(Clone, Serialize, Deserialize)] -pub struct SwitchTypeStatement { - pub location: Location, - pub discriminant: Rc, - pub cases: Vec, -} - -#[derive(Clone, Serialize, Deserialize)] -pub struct TypeCase { - pub location: Location, - /// Case parameter. If `None`, designates a `default {}` case. - pub parameter: Option, - pub block: Rc, -} \ No newline at end of file diff --git a/crates/parser/tree/this_literal.rs b/crates/parser/tree/this_literal.rs deleted file mode 100644 index 4d4eeaf..0000000 --- a/crates/parser/tree/this_literal.rs +++ /dev/null @@ -1,7 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -#[derive(Clone, Serialize, Deserialize)] -pub struct ThisLiteral { - pub location: Location, -} \ No newline at end of file diff --git a/crates/parser/tree/throw_statement.rs b/crates/parser/tree/throw_statement.rs deleted file mode 100644 index 48b71ff..0000000 --- a/crates/parser/tree/throw_statement.rs +++ /dev/null @@ -1,8 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -#[derive(Clone, Serialize, Deserialize)] -pub struct ThrowStatement { - pub location: Location, - pub expression: Rc, -} \ No newline at end of file diff --git a/crates/parser/tree/tree_semantics.rs b/crates/parser/tree/tree_semantics.rs deleted file mode 100644 index f65afa6..0000000 --- a/crates/parser/tree/tree_semantics.rs +++ /dev/null @@ -1,230 +0,0 @@ -use crate::ns::*; -use by_address::ByAddress; - -const LARGE_BYTES: usize = 26_000; - -/// Represents a mapping of nodes to meaning (*symbols*). -/// -/// A limited set of nodes may be mapped to symbols within this -/// structure through using the implemented `TreeSemanticsAccessor` -/// methods, such as `.get()` and `.set()`. -pub struct TreeSemantics { - common: TreeSemantics1, - large_units: RefCell>, TreeSemantics1>>, -} - -impl TreeSemantics { - pub fn new() -> Self { - Self { - common: TreeSemantics1::new(), - large_units: RefCell::new(HashMap::new()), - } - } -} - -/// Defines access methods for the `TreeSemantics` structure, -/// used for attaching semantics to the syntactic tree, -/// where `T` is the node type, and `S` is the symbol type. -pub trait TreeSemanticsAccessor { - fn get(&self, node: &Rc) -> Option; - fn set(&self, node: &Rc, symbol: Option); - fn delete(&self, node: &Rc) -> bool; - fn has(&self, node: &Rc) -> bool; -} - -macro impl_semantics_with_loc_call { - (struct $tree_semantics_id:ident, $($nodetype:ident),*$(,)?) => { - $( - impl TreeSemanticsAccessor<$nodetype, S> for $tree_semantics_id { - fn get(&self, node: &Rc<$nodetype>) -> Option { - let cu = node.location().compilation_unit(); - if cu.text().len() < LARGE_BYTES { - self.common.get(node) - } else { - let large_units = self.large_units.borrow(); - let m1 = large_units.get(&ByAddress(cu)); - m1.and_then(|m1| m1.get(node)) - } - } - fn set(&self, node: &Rc<$nodetype>, symbol: Option) { - let cu = node.location().compilation_unit(); - if cu.text().len() < LARGE_BYTES { - self.common.set(node, symbol); - } else { - let mut large_units = self.large_units.borrow_mut(); - let m1 = large_units.get_mut(&ByAddress(cu.clone())); - if let Some(m1) = m1 { - m1.set(node, symbol); - } else { - let m1 = TreeSemantics1::new(); - m1.set(node, symbol); - large_units.insert(ByAddress(cu), m1); - } - } - } - fn delete(&self, node: &Rc<$nodetype>) -> bool { - let cu = node.location().compilation_unit(); - if cu.text().len() < LARGE_BYTES { - self.common.delete(node) - } else { - let mut large_units = self.large_units.borrow_mut(); - let m1 = large_units.get_mut(&ByAddress(cu)); - m1.map(|m1| m1.delete(node)).unwrap_or(false) - } - } - fn has(&self, node: &Rc<$nodetype>) -> bool { - let cu = node.location().compilation_unit(); - if cu.text().len() < LARGE_BYTES { - self.common.has(node) - } else { - let large_units = self.large_units.borrow(); - let m1 = large_units.get(&ByAddress(cu)); - m1.map(|m1| m1.has(node)).unwrap_or(false) - } - } - } - )* - }, -} - -macro impl_semantics_with_loc_field { - (struct $tree_semantics_id:ident, $($nodetype:ident),*$(,)?) => { - $( - impl TreeSemanticsAccessor<$nodetype, S> for $tree_semantics_id { - fn get(&self, node: &Rc<$nodetype>) -> Option { - let cu = node.location.compilation_unit(); - if cu.text().len() < LARGE_BYTES { - self.common.get(node) - } else { - let large_units = self.large_units.borrow(); - let m1 = large_units.get(&ByAddress(cu)); - m1.and_then(|m1| m1.get(node)) - } - } - fn set(&self, node: &Rc<$nodetype>, symbol: Option) { - let cu = node.location.compilation_unit(); - if cu.text().len() < LARGE_BYTES { - self.common.set(node, symbol); - } else { - let mut large_units = self.large_units.borrow_mut(); - let m1 = large_units.get_mut(&ByAddress(cu.clone())); - if let Some(m1) = m1 { - m1.set(node, symbol); - } else { - let m1 = TreeSemantics1::new(); - m1.set(node, symbol); - large_units.insert(ByAddress(cu), m1); - } - } - } - fn delete(&self, node: &Rc<$nodetype>) -> bool { - let cu = node.location.compilation_unit(); - if cu.text().len() < LARGE_BYTES { - self.common.delete(node) - } else { - let mut large_units = self.large_units.borrow_mut(); - let m1 = large_units.get_mut(&ByAddress(cu)); - m1.map(|m1| m1.delete(node)).unwrap_or(false) - } - } - fn has(&self, node: &Rc<$nodetype>) -> bool { - let cu = node.location.compilation_unit(); - if cu.text().len() < LARGE_BYTES { - self.common.has(node) - } else { - let large_units = self.large_units.borrow(); - let m1 = large_units.get(&ByAddress(cu)); - m1.map(|m1| m1.has(node)).unwrap_or(false) - } - } - } - )* - }, -} - -macro impl_semantics_1 { - (struct $tree_semantics_1_id:ident, fn $new_id:ident, $($nodetype:ident),*$(,)?) => { - #[allow(non_snake_case)] - struct $tree_semantics_1_id { - $($nodetype: RefCell>, Option>>,)* - } - - impl $tree_semantics_1_id { - pub fn $new_id() -> Self { - Self { - $($nodetype: RefCell::new(HashMap::new()),)* - } - } - } - - $( - impl TreeSemanticsAccessor<$nodetype, S> for $tree_semantics_1_id { - fn get(&self, node: &Rc<$nodetype>) -> Option { - self.$nodetype.borrow().get(&NodeAsKey(node.clone())).map(|v| v.clone().unwrap()) - } - fn set(&self, node: &Rc<$nodetype>, symbol: Option) { - self.$nodetype.borrow_mut().insert(NodeAsKey(node.clone()), symbol); - } - fn delete(&self, node: &Rc<$nodetype>) -> bool { - self.$nodetype.borrow_mut().remove(&NodeAsKey(node.clone())).is_some() - } - fn has(&self, node: &Rc<$nodetype>) -> bool { - self.$nodetype.borrow().contains_key(&NodeAsKey(node.clone())) - } - } - )* - }, -} - -impl_semantics_with_loc_call!( - struct TreeSemantics, - Expression, - InitializerField, - Directive, - MxmlContent, - CssDirective, - CssMediaQueryCondition, - CssSelectorCondition, - CssPropertyValue, - CssSelector, -); - -impl_semantics_with_loc_field!( - struct TreeSemantics, - FunctionCommon, - Block, - Program, - SimpleVariableDefinition, - Mxml, - MxmlElement, - MxmlAttribute, - CssProperty, - CssRule, - CssDocument, - QualifiedIdentifier, -); - -impl_semantics_1!( - struct TreeSemantics1, - fn new, - Expression, - InitializerField, - Directive, - FunctionCommon, - Block, - Program, - SimpleVariableDefinition, - QualifiedIdentifier, - Mxml, - MxmlContent, - MxmlElement, - MxmlAttribute, - CssDirective, - CssRule, - CssMediaQueryCondition, - CssSelectorCondition, - CssPropertyValue, - CssSelector, - CssProperty, - CssDocument, -); \ No newline at end of file diff --git a/crates/parser/tree/try_statement.rs b/crates/parser/tree/try_statement.rs deleted file mode 100644 index 31a1922..0000000 --- a/crates/parser/tree/try_statement.rs +++ /dev/null @@ -1,23 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -#[derive(Clone, Serialize, Deserialize)] -pub struct TryStatement { - pub location: Location, - pub block: Rc, - pub catch_clauses: Vec, - pub finally_clause: Option, -} - -#[derive(Clone, Serialize, Deserialize)] -pub struct CatchClause { - pub location: Location, - pub parameter: TypedDestructuring, - pub block: Rc, -} - -#[derive(Clone, Serialize, Deserialize)] -pub struct FinallyClause { - pub location: Location, - pub block: Rc, -} \ No newline at end of file diff --git a/crates/parser/tree/type_definition.rs b/crates/parser/tree/type_definition.rs deleted file mode 100644 index 95dce41..0000000 --- a/crates/parser/tree/type_definition.rs +++ /dev/null @@ -1,11 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -#[derive(Clone, Serialize, Deserialize)] -pub struct TypeDefinition { - pub location: Location, - pub asdoc: Option>, - pub attributes: Vec, - pub left: (String, Location), - pub right: Rc, -} \ No newline at end of file diff --git a/crates/parser/tree/type_expression.rs b/crates/parser/tree/type_expression.rs deleted file mode 100644 index 0b0eec9..0000000 --- a/crates/parser/tree/type_expression.rs +++ /dev/null @@ -1,56 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -#[derive(Clone, Serialize, Deserialize)] -pub struct NullableTypeExpression { - pub location: Location, - pub base: Rc, -} - -#[derive(Clone, Serialize, Deserialize)] -pub struct NonNullableTypeExpression { - pub location: Location, - pub base: Rc, -} - -#[derive(Clone, Serialize, Deserialize)] -pub struct AnyTypeExpression { - pub location: Location, -} - -#[derive(Clone, Serialize, Deserialize)] -pub struct VoidTypeExpression { - pub location: Location, -} - -#[derive(Clone, Serialize, Deserialize)] -pub struct ArrayTypeExpression { - pub location: Location, - pub expression: Rc, -} - -/// A tuple type expression consisting of at least two elements. -#[derive(Clone, Serialize, Deserialize)] -pub struct TupleTypeExpression { - pub location: Location, - pub expressions: Vec>, -} - -#[derive(Clone, Serialize, Deserialize)] -pub struct FunctionTypeExpression { - pub location: Location, - pub parameters: Vec>, - pub result_type: Option>, -} - -/// ```plain -/// function(T, T=, ...) -/// function(...[T]) -/// ``` -#[derive(Clone, Serialize, Deserialize)] -pub struct FunctionTypeParameter { - pub location: Location, - pub kind: ParameterKind, - /// Possibly `None` for the rest parameter. - pub type_expression: Option>, -} \ No newline at end of file diff --git a/crates/parser/tree/type_parameter.rs b/crates/parser/tree/type_parameter.rs deleted file mode 100644 index adf800c..0000000 --- a/crates/parser/tree/type_parameter.rs +++ /dev/null @@ -1,9 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -/// A type parameter as in `function f.(): void {}`. -#[derive(Clone, Serialize, Deserialize)] -pub struct TypeParameter { - pub location: Location, - pub name: (String, Location), -} \ No newline at end of file diff --git a/crates/parser/tree/unary_expression.rs b/crates/parser/tree/unary_expression.rs deleted file mode 100644 index 64fbcc3..0000000 --- a/crates/parser/tree/unary_expression.rs +++ /dev/null @@ -1,9 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -#[derive(Clone, Serialize, Deserialize)] -pub struct UnaryExpression { - pub location: Location, - pub operator: Operator, - pub expression: Rc, -} \ No newline at end of file diff --git a/crates/parser/tree/use_namespace_directive.rs b/crates/parser/tree/use_namespace_directive.rs deleted file mode 100644 index 7317395..0000000 --- a/crates/parser/tree/use_namespace_directive.rs +++ /dev/null @@ -1,8 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -#[derive(Clone, Serialize, Deserialize)] -pub struct UseNamespaceDirective { - pub location: Location, - pub expression: Rc, -} \ No newline at end of file diff --git a/crates/parser/tree/variable_definition.rs b/crates/parser/tree/variable_definition.rs deleted file mode 100644 index 234492f..0000000 --- a/crates/parser/tree/variable_definition.rs +++ /dev/null @@ -1,36 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -#[derive(Clone, Serialize, Deserialize)] -pub struct VariableDefinition { - pub location: Location, - pub asdoc: Option>, - pub attributes: Vec, - pub kind: (VariableDefinitionKind, Location), - pub bindings: Vec>, -} - -#[derive(Copy, Clone, Serialize, Deserialize, PartialEq, Eq)] -pub enum VariableDefinitionKind { - Var, - Const, -} - -#[derive(Clone, Serialize, Deserialize)] -pub struct SimpleVariableDefinition { - pub location: Location, - pub kind: (VariableDefinitionKind, Location), - pub bindings: Vec>, -} - -#[derive(Clone, Serialize, Deserialize)] -pub struct VariableBinding { - pub destructuring: TypedDestructuring, - pub initializer: Option>, -} - -impl VariableBinding { - pub fn location(&self) -> Location { - self.initializer.as_ref().map_or(self.destructuring.location.clone(), |init| self.destructuring.location.combine_with(init.location())) - } -} \ No newline at end of file diff --git a/crates/parser/tree/vector_literal.rs b/crates/parser/tree/vector_literal.rs deleted file mode 100644 index e506ed8..0000000 --- a/crates/parser/tree/vector_literal.rs +++ /dev/null @@ -1,9 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -#[derive(Clone, Serialize, Deserialize)] -pub struct VectorLiteral { - pub location: Location, - pub element_type: Rc, - pub elements: Vec, -} \ No newline at end of file diff --git a/crates/parser/tree/while_statement.rs b/crates/parser/tree/while_statement.rs deleted file mode 100644 index 2f20a97..0000000 --- a/crates/parser/tree/while_statement.rs +++ /dev/null @@ -1,9 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -#[derive(Clone, Serialize, Deserialize)] -pub struct WhileStatement { - pub location: Location, - pub test: Rc, - pub body: Rc, -} \ No newline at end of file diff --git a/crates/parser/tree/with_statement.rs b/crates/parser/tree/with_statement.rs deleted file mode 100644 index 0f254c3..0000000 --- a/crates/parser/tree/with_statement.rs +++ /dev/null @@ -1,9 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -#[derive(Clone, Serialize, Deserialize)] -pub struct WithStatement { - pub location: Location, - pub object: Rc, - pub body: Rc, -} \ No newline at end of file diff --git a/crates/parser/tree/xml_expression.rs b/crates/parser/tree/xml_expression.rs deleted file mode 100644 index 06857a8..0000000 --- a/crates/parser/tree/xml_expression.rs +++ /dev/null @@ -1,57 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -#[derive(Clone, Serialize, Deserialize)] -pub struct XmlExpression { - pub location: Location, - pub element: Rc, -} - -#[derive(Clone, Serialize, Deserialize)] -pub struct XmlMarkupExpression { - pub location: Location, - pub markup: String, -} - -#[derive(Clone, Serialize, Deserialize)] -pub struct XmlListExpression { - pub location: Location, - pub content: Vec>, -} - -#[derive(Clone, Serialize, Deserialize)] -pub struct XmlElement { - pub location: Location, - pub name: XmlTagName, - pub attributes: Vec>, - pub attribute_expression: Option>, - pub content: Option>>, - pub closing_name: Option, -} - -#[derive(Clone, Serialize, Deserialize)] -pub enum XmlTagName { - Name((String, Location)), - Expression(Rc), -} - -#[derive(Clone, Serialize, Deserialize)] -pub struct XmlAttribute { - pub location: Location, - pub name: (String, Location), - pub value: XmlAttributeValue, -} - -#[derive(Clone, Serialize, Deserialize)] -pub enum XmlAttributeValue { - Value((String, Location)), - Expression(Rc), -} - -#[derive(Clone, Serialize, Deserialize)] -pub enum XmlContent { - Characters((String, Location)), - Markup((String, Location)), - Element(Rc), - Expression(Rc), -} \ No newline at end of file diff --git a/crates/parser/util.rs b/crates/parser/util.rs deleted file mode 100644 index 256a627..0000000 --- a/crates/parser/util.rs +++ /dev/null @@ -1,36 +0,0 @@ -//! Miscellaneous. - -mod arena; -pub use arena::*; - -pub use by_address::ByAddress as NodeAsKey; - -mod character_reader; -pub use character_reader::*; - -mod escaping; -pub use escaping::*; - -mod css; -pub use css::*; - -pub use std::cell::{Cell, RefCell}; -pub use std::collections::{HashMap, HashSet}; -pub use std::rc::{Rc, Weak}; - -pub fn default() -> T { - T::default() -} - -/// Counts the first whitespace characters of a string. -pub fn count_first_whitespace_characters(input: &str) -> usize { - input.chars().count() - input.trim_start().chars().count() -} - -/// Decreases the last offset of a range without ever going behind the first offset. -pub fn decrease_last_offset(first_offset: usize, mut last_offset: usize, count: usize) -> usize { - for _ in 0..count { - last_offset = if first_offset < last_offset { last_offset - 1 } else { last_offset }; - } - last_offset -} \ No newline at end of file diff --git a/crates/parser/util/arena.rs b/crates/parser/util/arena.rs deleted file mode 100644 index e9027f4..0000000 --- a/crates/parser/util/arena.rs +++ /dev/null @@ -1,19 +0,0 @@ -use std::{cell::RefCell, rc::{Rc, Weak}}; - -pub struct Arena { - data: RefCell>>, -} - -impl Arena { - pub fn new() -> Self { - Self { - data: RefCell::new(vec![]), - } - } - - pub fn allocate(&self, value: T) -> Weak { - let obj = Rc::new(value); - self.data.borrow_mut().push(obj.clone()); - Rc::downgrade(&obj) - } -} \ No newline at end of file diff --git a/crates/parser/util/character_reader.rs b/crates/parser/util/character_reader.rs deleted file mode 100644 index c6af904..0000000 --- a/crates/parser/util/character_reader.rs +++ /dev/null @@ -1,138 +0,0 @@ -use std::str::CharIndices; - -/// `CharacterReader` may be used for iterating characters from left-to-right -/// in a string with miscellaneous operation methods. -#[derive(Clone)] -pub struct CharacterReader<'a> { - length: usize, - start_offset: usize, - char_indices: CharIndices<'a>, -} - -impl<'a> CharacterReader<'a> { - /// Constructs a `CharacterReader` from a string starting at the given offset. - pub fn from_offset(value: &'a str, offset: usize) -> Self { - CharacterReader { length: value.len(), start_offset: offset, char_indices: value[offset..].char_indices() } - } - - /// Indicates if there are remaining code points to read. - pub fn has_remaining(&self) -> bool { - self.clone().char_indices.next().is_some() - } - - /// Indicates if the reader has reached the end of the string. - pub fn reached_end(&self) -> bool { - self.clone().char_indices.next().is_none() - } - - /// Skips a code point in the reader. This is equivalent to - /// calling `next()`. - pub fn skip_in_place(&mut self) { - self.next(); - } - - /// Skips the given number of code points in the reader. - pub fn skip_count_in_place(&mut self, count: usize) { - for _ in 0..count { - if self.next().is_none() { - break; - } - } - } - - /// Returns the current byte offset in the string. - pub fn index(&self) -> usize { - self.clone().char_indices.next().map_or(self.length, |(i, _)| self.start_offset + i) - } - - /// Returns the next code point. If there are no code points - /// available, returns U+00. - pub fn next_or_zero(&mut self) -> char { - self.char_indices.next().map_or('\x00', |(_, cp)| cp) - } - - /// Peeks the next code point. - pub fn peek(&self) -> Option { - self.clone().char_indices.next().map(|(_, cp)| cp) - } - - /// Peeks the next code point. If there are no code points - /// available, returns U+00. - pub fn peek_or_zero(&self) -> char { - self.clone().next_or_zero() - } - - /// Peeks the next code point at the given zero based code point index. - pub fn peek_at(&self, index: usize) -> Option { - let mut indices = self.clone().char_indices; - for _ in 0..index { - if indices.next().is_none() { - break; - } - } - indices.next().map(|(_, cp)| cp) - } - - /// Peeks the next code point at the given zero based code point index. - /// If there are no code points available, returns U+00. - pub fn peek_at_or_zero(&self, index: usize) -> char { - self.peek_at(index).unwrap_or('\x00') - } - - /// Peeks a number of code points until the string's end. - pub fn peek_seq(&self, num_code_points: u64) -> String { - let mut r = String::new(); - let mut next_indices = self.char_indices.clone(); - for _ in 0..num_code_points { - match next_indices.next() { - None => { - break; - }, - Some(cp) => { - r.push(cp.1); - } - } - } - r - } -} - -impl<'a> From<&'a str> for CharacterReader<'a> { - /// Constructs a `CharacterReader` from a string. - fn from(value: &'a str) -> Self { - CharacterReader { length: value.len(), start_offset: 0, char_indices: value.char_indices() } - } -} - -impl<'a> From<&'a String> for CharacterReader<'a> { - /// Constructs a `CharacterReader` from a string. - fn from(value: &'a String) -> Self { - CharacterReader { length: value.len(), start_offset: 0, char_indices: value.char_indices() } - } -} - -impl<'a> Iterator for CharacterReader<'a> { - type Item = char; - - fn next(&mut self) -> Option { - self.char_indices.next().map(|(_, cp)| cp) - } -} - -#[cfg(test)] -mod test { - use super::CharacterReader; - #[test] - fn test() { - let mut reader = CharacterReader::from("foo"); - assert!(reader.has_remaining()); - assert_eq!(reader.peek_seq(5), "foo"); - assert_eq!(reader.peek_seq(1), "f"); - assert_eq!(reader.peek_or_zero(), 'f'); - for _ in 0..3 { - reader.next(); - } - assert_eq!(reader.peek_or_zero(), '\x00'); - assert!(reader.reached_end()); - } -} \ No newline at end of file diff --git a/crates/parser/util/css.rs b/crates/parser/util/css.rs deleted file mode 100644 index fa1fbf8..0000000 --- a/crates/parser/util/css.rs +++ /dev/null @@ -1,163 +0,0 @@ -use std::collections::HashMap; -use lazy_static::lazy_static; -use maplit::hashmap; - -/// Converts a CSS [color constant](http://www.w3schools.com/css/css_colorsfull.asp) into an integer. -pub fn css_color_constant_to_int(name: &str) -> Option { - COLOR_MAP.get(&name.to_lowercase()).map(|i| *i) -} - -lazy_static! { - /// Map color constant names to 24-bit RGB integer values. - /// - /// See also: [CSS colors](http://www.w3schools.com/css/css_colorsfull.asp) - static ref COLOR_MAP: HashMap = hashmap! { - "black".into() => 0x000000, - "navy".into() => 0x000080, - "darkblue".into() => 0x00008b, - "mediumblue".into() => 0x0000cd, - "blue".into() => 0x0000ff, - "darkgreen".into() => 0x006400, - "green".into() => 0x008000, - "teal".into() => 0x008080, - "darkcyan".into() => 0x008b8b, - "deepskyblue".into() => 0x00bfff, - "darkturquoise".into() => 0x00ced1, - "mediumspringgreen".into() => 0x00fa9a, - "lime".into() => 0x00ff00, - "springgreen".into() => 0x00ff7f, - "aqua".into() => 0x00ffff, - "cyan".into() => 0x00ffff, - "midnightblue".into() => 0x191970, - "dodgerblue".into() => 0x1e90ff, - "lightseagreen".into() => 0x20b2aa, - "forestgreen".into() => 0x228b22, - "seagreen".into() => 0x2e8b57, - "darkslategray".into() => 0x2f4f4f, - "darkslategrey".into() => 0x2f4f4f, - "limegreen".into() => 0x32cd32, - "mediumseagreen".into() => 0x3cb371, - "turquoise".into() => 0x40e0d0, - "royalblue".into() => 0x4169e1, - "steelblue".into() => 0x4682b4, - "darkslateblue".into() => 0x483d8b, - "mediumturquoise".into() => 0x48d1cc, - "indigo ".into() => 0x4b0082, - "darkolivegreen".into() => 0x556b2f, - "cadetblue".into() => 0x5f9ea0, - "cornflowerblue".into() => 0x6495ed, - "mediumaquamarine".into() => 0x66cdaa, - "dimgray".into() => 0x696969, - "dimgrey".into() => 0x696969, - "slateblue".into() => 0x6a5acd, - "olivedrab".into() => 0x6b8e23, - "slategray".into() => 0x708090, - "slategrey".into() => 0x708090, - "lightslategray".into() => 0x778899, - "lightslategrey".into() => 0x778899, - "mediumslateblue".into() => 0x7b68ee, - "lawngreen".into() => 0x7cfc00, - "chartreuse".into() => 0x7fff00, - "aquamarine".into() => 0x7fffd4, - "maroon".into() => 0x800000, - "purple".into() => 0x800080, - "olive".into() => 0x808000, - "gray".into() => 0x808080, - "grey".into() => 0x808080, - "skyblue".into() => 0x87ceeb, - "lightskyblue".into() => 0x87cefa, - "blueviolet".into() => 0x8a2be2, - "darkred".into() => 0x8b0000, - "darkmagenta".into() => 0x8b008b, - "saddlebrown".into() => 0x8b4513, - "darkseagreen".into() => 0x8fbc8f, - "lightgreen".into() => 0x90ee90, - "mediumpurple".into() => 0x9370d8, - "darkviolet".into() => 0x9400d3, - "palegreen".into() => 0x98fb98, - "darkorchid".into() => 0x9932cc, - "yellowgreen".into() => 0x9acd32, - "sienna".into() => 0xa0522d, - "brown".into() => 0xa52a2a, - "darkgray".into() => 0xa9a9a9, - "darkgrey".into() => 0xa9a9a9, - "lightblue".into() => 0xadd8e6, - "greenyellow".into() => 0xadff2f, - "paleturquoise".into() => 0xafeeee, - "lightsteelblue".into() => 0xb0c4de, - "powderblue".into() => 0xb0e0e6, - "firebrick".into() => 0xb22222, - "darkgoldenrod".into() => 0xb8860b, - "mediumorchid".into() => 0xba55d3, - "rosybrown".into() => 0xbc8f8f, - "darkkhaki".into() => 0xbdb76b, - "silver".into() => 0xc0c0c0, - "mediumvioletred".into() => 0xc71585, - "indianred ".into() => 0xcd5c5c, - "peru".into() => 0xcd853f, - "chocolate".into() => 0xd2691e, - "tan".into() => 0xd2b48c, - "lightgray".into() => 0xd3d3d3, - "lightgrey".into() => 0xd3d3d3, - "palevioletred".into() => 0xd87093, - "thistle".into() => 0xd8bfd8, - "orchid".into() => 0xda70d6, - "goldenrod".into() => 0xdaa520, - "crimson".into() => 0xdc143c, - "gainsboro".into() => 0xdcdcdc, - "plum".into() => 0xdda0dd, - "burlywood".into() => 0xdeb887, - "lightcyan".into() => 0xe0ffff, - "lavender".into() => 0xe6e6fa, - "darksalmon".into() => 0xe9967a, - "violet".into() => 0xee82ee, - "palegoldenrod".into() => 0xeee8aa, - "lightcoral".into() => 0xf08080, - "khaki".into() => 0xf0e68c, - "aliceblue".into() => 0xf0f8ff, - "honeydew".into() => 0xf0fff0, - "azure".into() => 0xf0ffff, - "sandybrown".into() => 0xf4a460, - "wheat".into() => 0xf5deb3, - "beige".into() => 0xf5f5dc, - "whitesmoke".into() => 0xf5f5f5, - "mintcream".into() => 0xf5fffa, - "ghostwhite".into() => 0xf8f8ff, - "salmon".into() => 0xfa8072, - "antiquewhite".into() => 0xfaebd7, - "linen".into() => 0xfaf0e6, - "lightgoldenrodyellow".into() => 0xfafad2, - "oldlace".into() => 0xfdf5e6, - "red".into() => 0xff0000, - "fuchsia".into() => 0xff00ff, - "magenta".into() => 0xff00ff, - "deeppink".into() => 0xff1493, - "orangered".into() => 0xff4500, - "tomato".into() => 0xff6347, - "hotpink".into() => 0xff69b4, - "coral".into() => 0xff7f50, - "darkorange".into() => 0xff8c00, - "lightsalmon".into() => 0xffa07a, - "orange".into() => 0xffa500, - "lightpink".into() => 0xffb6c1, - "pink".into() => 0xffc0cb, - "gold".into() => 0xffd700, - "peachpuff".into() => 0xffdab9, - "navajowhite".into() => 0xffdead, - "moccasin".into() => 0xffe4b5, - "bisque".into() => 0xffe4c4, - "mistyrose".into() => 0xffe4e1, - "blanchedalmond".into() => 0xffebcd, - "papayawhip".into() => 0xffefd5, - "lavenderblush".into() => 0xfff0f5, - "seashell".into() => 0xfff5ee, - "cornsilk".into() => 0xfff8dc, - "lemonchiffon".into() => 0xfffacd, - "floralwhite".into() => 0xfffaf0, - "snow".into() => 0xfffafa, - "yellow".into() => 0xffff00, - "lightyellow".into() => 0xffffe0, - "ivory".into() => 0xfffff0, - "white".into() => 0xffffff, - }; -} \ No newline at end of file diff --git a/crates/parser/util/escaping.rs b/crates/parser/util/escaping.rs deleted file mode 100644 index ffa020f..0000000 --- a/crates/parser/util/escaping.rs +++ /dev/null @@ -1,11 +0,0 @@ -/// Escapes XML special characters. -pub fn escape_xml(characters: &str) -> String { - let escaped = htmlentity::entity::encode(characters.as_ref(), &htmlentity::entity::EncodeType::NamedOrHex, &htmlentity::entity::CharacterSet::SpecialChars); - String::from_utf8_lossy(&escaped.bytes().into_owned()).into_owned() -} - -/// Unescapes XML entities conforming to HTML entities. -pub fn unescape_xml(input: &str) -> String { - let unescaped = htmlentity::entity::decode(input.as_ref()); - String::from_utf8_lossy(&unescaped.bytes().into_owned()).into_owned() -} \ No newline at end of file diff --git a/crates/parser_test/Cargo.toml b/crates/parser_test/Cargo.toml deleted file mode 100644 index ba62f77..0000000 --- a/crates/parser_test/Cargo.toml +++ /dev/null @@ -1,23 +0,0 @@ -[package] -name = "as3_parser_test" -version = "0.4.0" -edition = "2021" -authors = ["hydroper "] -repository = "https://github.com/hydroper/as3_parser" -keywords = ["actionscript", "as3", "parser"] -description = "ActionScript 3 Parser Test" -license = "Apache-2.0" - -# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html - -[[bin]] -name = "as3_parser_test" -path = "main.rs" - -[dependencies] -clap = { version = "4.4.8", features = ["derive"] } -file_paths = "1.0.0" -as3_parser = { path = "../parser", version = "1" } -maplit = "1.0.2" -serde = { version = "1.0.192", features = ["rc", "derive"] } -serde_json = "1.0.108" diff --git a/crates/parser_test/main.rs b/crates/parser_test/main.rs deleted file mode 100644 index 6abee8f..0000000 --- a/crates/parser_test/main.rs +++ /dev/null @@ -1,62 +0,0 @@ -use clap::Parser; -use file_paths::FlexPath; -use std::{env, fs, io}; -use as3_parser::ns::*; - -#[derive(Parser, Debug)] -#[command(author, version, about, long_about = None)] -struct Arguments { - #[arg(short, long)] - source_path: String, - - #[arg(short, long)] - file_log: bool, - - #[arg(short, long)] - mxml: bool, - - #[arg(short, long)] - css: bool, -} - -fn main() -> io::Result<()> { - let arguments = Arguments::parse(); - let source_path = FlexPath::from_n_native([env::current_dir().unwrap().to_string_lossy().into_owned().as_ref(), arguments.source_path.as_ref()]).to_string_with_flex_separator(); - - // Canonicalize path - // let source_path = std::path::Path::new(&source_path).canonicalize().unwrap().to_string_lossy().into_owned(); - - let source_path_ast_json = FlexPath::new_native(&source_path).change_extension(".tree").to_string_with_flex_separator(); - let source_path_diagnostics = FlexPath::new_native(&source_path).change_extension(".diag").to_string_with_flex_separator(); - let source_content = fs::read_to_string(&source_path)?; - let compilation_unit = CompilationUnit::new(Some(source_path), source_content); - if arguments.mxml { - let document = ParserFacade(&compilation_unit, default()).parse_mxml(); - if arguments.file_log { - fs::write(&source_path_ast_json, serde_json::to_string_pretty(&document).unwrap())?; - } - } else if arguments.css { - let document = CssParserFacade(&compilation_unit, default()).parse_document(); - if arguments.file_log { - fs::write(&source_path_ast_json, serde_json::to_string_pretty(&document).unwrap())?; - } - } else { - let program = ParserFacade(&compilation_unit, default()).parse_program(); - if arguments.file_log { - fs::write(&source_path_ast_json, serde_json::to_string_pretty(&program).unwrap())?; - } - } - let mut diagnostics = vec![]; - compilation_unit.sort_diagnostics(); - for diagnostic in compilation_unit.nested_diagnostics() { - diagnostics.push(diagnostic.format_english()); - } - if arguments.file_log { - fs::write(&source_path_diagnostics, diagnostics.join("\n"))?; - } else { - for diagnostic in diagnostics { - println!("{diagnostic}"); - } - } - Ok(()) -} \ No newline at end of file diff --git a/demo/Cargo.toml b/demo/Cargo.toml deleted file mode 100644 index 7614571..0000000 --- a/demo/Cargo.toml +++ /dev/null @@ -1,18 +0,0 @@ -[package] -name = "as3_parser_demo" -version = "0.1.0" -edition = "2021" - -[lib] -crate-type = ["cdylib"] - -[dependencies] -as3_parser = { path = "../crates/parser", version = "1" } -maplit = "1.0.2" -serde = { version = "1.0.192", features = ["rc", "derive"] } -serde_json = "1.0.108" -wasm-bindgen = "0.2.92" - -[dependencies.web-sys] -version = "0.3.4" -features = ["Document", "Window"] \ No newline at end of file diff --git a/demo/dist/as3_parser_demo.d.ts b/demo/dist/as3_parser_demo.d.ts new file mode 100644 index 0000000..68bc12b --- /dev/null +++ b/demo/dist/as3_parser_demo.d.ts @@ -0,0 +1,40 @@ +/* tslint:disable */ +/* eslint-disable */ +/** +* @param {string} input +* @param {string} source_type +* @returns {string} +*/ +export function parse(input: string, source_type: string): string; + +export type InitInput = RequestInfo | URL | Response | BufferSource | WebAssembly.Module; + +export interface InitOutput { + readonly memory: WebAssembly.Memory; + readonly parse: (a: number, b: number, c: number, d: number, e: number) => void; + readonly __wbindgen_add_to_stack_pointer: (a: number) => number; + readonly __wbindgen_malloc: (a: number, b: number) => number; + readonly __wbindgen_realloc: (a: number, b: number, c: number, d: number) => number; + readonly __wbindgen_free: (a: number, b: number, c: number) => void; +} + +export type SyncInitInput = BufferSource | WebAssembly.Module; +/** +* Instantiates the given `module`, which can either be bytes or +* a precompiled `WebAssembly.Module`. +* +* @param {SyncInitInput} module +* +* @returns {InitOutput} +*/ +export function initSync(module: SyncInitInput): InitOutput; + +/** +* If `module_or_path` is {RequestInfo} or {URL}, makes a request and +* for everything else, calls `WebAssembly.instantiate` directly. +* +* @param {InitInput | Promise} module_or_path +* +* @returns {Promise} +*/ +export default function __wbg_init (module_or_path?: InitInput | Promise): Promise; diff --git a/demo/dist/as3_parser_demo.js b/demo/dist/as3_parser_demo.js new file mode 100644 index 0000000..0e1f671 --- /dev/null +++ b/demo/dist/as3_parser_demo.js @@ -0,0 +1,199 @@ +let wasm; + +let WASM_VECTOR_LEN = 0; + +let cachedUint8Memory0 = null; + +function getUint8Memory0() { + if (cachedUint8Memory0 === null || cachedUint8Memory0.byteLength === 0) { + cachedUint8Memory0 = new Uint8Array(wasm.memory.buffer); + } + return cachedUint8Memory0; +} + +const cachedTextEncoder = (typeof TextEncoder !== 'undefined' ? new TextEncoder('utf-8') : { encode: () => { throw Error('TextEncoder not available') } } ); + +const encodeString = (typeof cachedTextEncoder.encodeInto === 'function' + ? function (arg, view) { + return cachedTextEncoder.encodeInto(arg, view); +} + : function (arg, view) { + const buf = cachedTextEncoder.encode(arg); + view.set(buf); + return { + read: arg.length, + written: buf.length + }; +}); + +function passStringToWasm0(arg, malloc, realloc) { + + if (realloc === undefined) { + const buf = cachedTextEncoder.encode(arg); + const ptr = malloc(buf.length, 1) >>> 0; + getUint8Memory0().subarray(ptr, ptr + buf.length).set(buf); + WASM_VECTOR_LEN = buf.length; + return ptr; + } + + let len = arg.length; + let ptr = malloc(len, 1) >>> 0; + + const mem = getUint8Memory0(); + + let offset = 0; + + for (; offset < len; offset++) { + const code = arg.charCodeAt(offset); + if (code > 0x7F) break; + mem[ptr + offset] = code; + } + + if (offset !== len) { + if (offset !== 0) { + arg = arg.slice(offset); + } + ptr = realloc(ptr, len, len = offset + arg.length * 3, 1) >>> 0; + const view = getUint8Memory0().subarray(ptr + offset, ptr + len); + const ret = encodeString(arg, view); + + offset += ret.written; + ptr = realloc(ptr, len, offset, 1) >>> 0; + } + + WASM_VECTOR_LEN = offset; + return ptr; +} + +let cachedInt32Memory0 = null; + +function getInt32Memory0() { + if (cachedInt32Memory0 === null || cachedInt32Memory0.byteLength === 0) { + cachedInt32Memory0 = new Int32Array(wasm.memory.buffer); + } + return cachedInt32Memory0; +} + +const cachedTextDecoder = (typeof TextDecoder !== 'undefined' ? new TextDecoder('utf-8', { ignoreBOM: true, fatal: true }) : { decode: () => { throw Error('TextDecoder not available') } } ); + +if (typeof TextDecoder !== 'undefined') { cachedTextDecoder.decode(); }; + +function getStringFromWasm0(ptr, len) { + ptr = ptr >>> 0; + return cachedTextDecoder.decode(getUint8Memory0().subarray(ptr, ptr + len)); +} +/** +* @param {string} input +* @param {string} source_type +* @returns {string} +*/ +export function parse(input, source_type) { + let deferred3_0; + let deferred3_1; + try { + const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); + const ptr0 = passStringToWasm0(input, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + const len0 = WASM_VECTOR_LEN; + const ptr1 = passStringToWasm0(source_type, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + const len1 = WASM_VECTOR_LEN; + wasm.parse(retptr, ptr0, len0, ptr1, len1); + var r0 = getInt32Memory0()[retptr / 4 + 0]; + var r1 = getInt32Memory0()[retptr / 4 + 1]; + deferred3_0 = r0; + deferred3_1 = r1; + return getStringFromWasm0(r0, r1); + } finally { + wasm.__wbindgen_add_to_stack_pointer(16); + wasm.__wbindgen_free(deferred3_0, deferred3_1, 1); + } +} + +async function __wbg_load(module, imports) { + if (typeof Response === 'function' && module instanceof Response) { + if (typeof WebAssembly.instantiateStreaming === 'function') { + try { + return await WebAssembly.instantiateStreaming(module, imports); + + } catch (e) { + if (module.headers.get('Content-Type') != 'application/wasm') { + console.warn("`WebAssembly.instantiateStreaming` failed because your server does not serve wasm with `application/wasm` MIME type. Falling back to `WebAssembly.instantiate` which is slower. Original error:\n", e); + + } else { + throw e; + } + } + } + + const bytes = await module.arrayBuffer(); + return await WebAssembly.instantiate(bytes, imports); + + } else { + const instance = await WebAssembly.instantiate(module, imports); + + if (instance instanceof WebAssembly.Instance) { + return { instance, module }; + + } else { + return instance; + } + } +} + +function __wbg_get_imports() { + const imports = {}; + imports.wbg = {}; + + return imports; +} + +function __wbg_init_memory(imports, maybe_memory) { + +} + +function __wbg_finalize_init(instance, module) { + wasm = instance.exports; + __wbg_init.__wbindgen_wasm_module = module; + cachedInt32Memory0 = null; + cachedUint8Memory0 = null; + + + return wasm; +} + +function initSync(module) { + if (wasm !== undefined) return wasm; + + const imports = __wbg_get_imports(); + + __wbg_init_memory(imports); + + if (!(module instanceof WebAssembly.Module)) { + module = new WebAssembly.Module(module); + } + + const instance = new WebAssembly.Instance(module, imports); + + return __wbg_finalize_init(instance, module); +} + +async function __wbg_init(input) { + if (wasm !== undefined) return wasm; + + if (typeof input === 'undefined') { + input = new URL('as3_parser_demo_bg.wasm', import.meta.url); + } + const imports = __wbg_get_imports(); + + if (typeof input === 'string' || (typeof Request === 'function' && input instanceof Request) || (typeof URL === 'function' && input instanceof URL)) { + input = fetch(input); + } + + __wbg_init_memory(imports); + + const { instance, module } = await __wbg_load(await input, imports); + + return __wbg_finalize_init(instance, module); +} + +export { initSync } +export default __wbg_init; diff --git a/demo/dist/as3_parser_demo_bg.wasm b/demo/dist/as3_parser_demo_bg.wasm new file mode 100644 index 0000000000000000000000000000000000000000..12b8346f0885996d2aee40967b861428275f7413 GIT binary patch literal 2513395 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

@W4N9wiiIGR3m8?YrM_O*$~ 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�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

008FZB<9qtkX&LZp+tY<7`9LZkcxZ>`*sV&3e6O zjA&?3d97Cbd|7_F^QXkW{;aod!>rxYM$WEXPGr}xU*?A$wI}Ayx<239 zO|{I@`f%484Jr)C-s|~u+cA@mOGe){5wCK8NKPi4=(BM8EW5)mcUMYu`uV7Wb%jUa zH>|AMZ1^73y=U^W>%*&FUia;(Oa6pLsp~>rMyx;E-uhiq4f~6i>g;-}zIV3H)f2`8 zkB3-|9KYnqQ~L#*F4gNeX5R9-uBqCnGOunq)bIGR^g{cQ>+Q$9yE3o##@n%}LDQBm~F=Ebm$(VB!SNTj{^6_p` zqD|#H1x^c>Uw(P~%9aL^LpzCra%%O;(TN9IejIyiL#fJ6r9)gDLOzW6S>6HQRjgLG$(Sp) z^Oj5)C$o3ll~BI2N8O9rmebqxw`%wHeZ#~mw@+T#{>eFD#>{Kq-yeK^+h?Qp&e7g> zr7W%NX7y~*&FRF4Izw7Nv@HGD<#ny^@slUttWl}?q{S|0pWhqr+UVAmWu1pE>e=Cm z-PM}Id^RKwy7O$&>4*(YVy$|#ZsooCzzK!v+<^NL!(&|UdG^`cvw1y|uS~jpz>I08O5>Zdr$j z(SzoUj<_aspZj)9lt(M;&?+bE8bS|iWYeBj+thTQTiYcSMtxk^H*t8i8v2h1<~YpU zQcm^x(aSY0u59`+rTJRx_=L*0-*p%mQtQKx8pCP~a1Y8W2>bX;dhyBR8IKi@8#$gE zljZaI*RX(>`oI@49%38A!fCUPoSb{+&7@Lqs)f6YqDyYCy`+<5kjut0j|Z(i;aIKt z(XCI;ho7|TaqjuAH;ZhpOg`VcdbLVER_m|UY}$ROX#bbc-9)A4gO=6%x4X<*`SiE-x(dM_skI3SN2PNN7f7=c~Id za#g_{uc<~|PyK7kV%v4nQ(?QymI)cV;NGhn%Ofo}w7Hv|U$Oj(fM2a1dN2Fa`MuZU zZ><-#j#2)a=JsxQUAvxdpL>7XbksQNSG7Msl-gnG^|aH&Db=sk=GS@6Yyp>~sFOeY~y4Gu>Zu_K*CrBO9+MZ(XB?!@7vRits5{SNTNx8r&XlGQDj- zI%dh$wWFmSEP6VO>M5!FOLhIp+OBC)C+7^XUNS>bMYguj%KH<7ow9p)yAKO|;j?wm z#vQ}bbJt4NzjbIaZ*1d+O+I?H*#B_Pqr?x^uO*p7tzCEDACq%wR)>!--Md9JY`${9 z@nH+s-MZD}^EgM_rSYFUelDE*=$w zSHOoV4+bB8QP(N-X0H+ny&g0_w8S-~^tcx`e{FCmkvDMbA*JiU=(FYbh-z%nCjI|G1rY(6Y?X<8N$}7v9rYI{e&NOX=4#r|m?`b2;Y+ZB9%c zS-VUZ92u~$+`2BKSi~ipJi9crNgAF89NNdDo1=9I()UvI@0*TPq_wRjbK)mK+wFVEh;}lk9(~iszKK6Rx zi$5)WBCHIq3wF=HU3THV*$D@h|5#FWvi-y3ox{%$w&-Nad44=<=@qL*fu>;B(-xN} z9$phTq@PR9?r<()-X9k{98NE*Rm;@z;|kgGyinVWaO(j}+T>33*=^7) z&CVPhf7eYKHRECX#?qeSw|+ZZ)@rlE)@7@notUsCRNHXoxzwtMtP_^3va+_TW$D!E z^RpWgtuV*I)%RZRKd#)oUf z6Tgb?#!X+gdCfhibvv~ol?T*!ew-OF;!whqes7Z|l=GRj({|LC=B4|ZMje~Dxnf!A ztt89z1G~zKCM`AIADvmClAUuFH$R@bZ0XidPcBSd{o2*f&i&BBU2bkidcUkzEq=m= zQ+g9?`qSfbMj4y7 zR{g!I4INP?XW-LQiErA*G;lq>XK9J~E!UlRd8yNT@9S~)3ug~+*7-}<3VZWZ2glp3 z7Pfu_9xH7nng572YyNXI2XMmLy*NCYwvWtyeI3jI3yZqmrXQ6+OP4ljp08uylQ?dSXOa#pGSm!IaG<=XG@q)`oqh9A{Q{5k)3^~x=GJxpi5STX;D zubwR>byg+>Y_n(nCy!1V>b7B_UHuEVS%lxF`rm5ET|?)-A2pP6*&;EmLwJb|?-$OI z4m@1d+0u7i@T6S78|fAI{kV~FUScb{=CrZ=)Yz(38V#6X(`kp()BM+(plk2zmT#}V zp;B!U)%y1Qgq>BBrejYXvl%_=j?IhKj|a}3`E&1c-|vonpEx=-tJUR9b+=!irmgUa zy4yHP09fnJAYUuU7WS}M$c8FTphFX&(+&)-|yIf%5fj2Kann&-KL`< z&-KN;)8aVCAC?P}7u;W+Kh8=KbRd0I@BRfN+a0}8u*1v#KtYqLGcujWuc*{|#(3pd zm)1va)!kixN4Ure8EJT5Pvt>5WN8&!3;2w0V1o^|&yX z>7$-*-*s@(&w?p@?8 zFFz@~&YB}>A7<|zad&Hw<>2FQZ)>`?I@V;6xArW*SFVQUVV3J zwsv=leVJx!dOOc+G0pa-Xusnczn*1>%x;+!So-rHwzf_BI81%tY2m=b*>PpIl<4l{ z-Y)Xm=aaQGJ5_N9E$?KB#Fc7VwX}E{`t)f1X7P@*Y+j#QT@W~U<&FEM=KELQ+U2;V zPlK`zUXQ8ht=ix9L?t`X{Z?C!Hdi$~)#m6MuRRl;ZCsBoZXGZxb8v;$Yj>pSYB=8C zR=K>5a>nh>M-%H+sFvzJ@m;wQd6J&0NiLVS%bqN<*1Zl{X1~MGX=BZZx_cLobC{&M zK55?LE{?f*lDBKeuXVd}@QEp@@r7#lD-B3^Vee^urkT`X=Z~Y-HzInhdEE1}eJTF| zH|zb_-gSD?#>+{@kFNe9RU5QvZ`eB5ReQ8&g&kH?ubtbRAKv9bsoG(!H;+@;XGV9t z*Jk0;n}J>nMlD+F?>hEfrPGIoiz_|re{g#3H6d1MuP2uHD0_3Nc8~X8)DG9}M(4d9 zqTie5=dDlQHr8#L%U`QoHeNC7{^%c%I&QRkcg^zn%n?3Qce_6OzR;o1^;gk$1HL~z z`LW@H+Wn8aWnEbP$oX_nk*`y`b+ab4w{9Rkp|$ik+MM;Ml=Gue)yvI&ex9_QI@PiC zlT#&pc3VaaJL%)=obzqcq75F^JKCKPonKI=yyeiZO)K40th{vX$Mhqe8im@{{9-ZD z_TaQr(LQaqCGMK*v?XU>){Dgc`(os^thaqwC|Z2rb%8>gv;Og*7xs1Z$8EyiVQBu7qUwtMojXH)&AaGTi=`h4BG zXU4e2eVbcMt}b!>>GtKb%&VU|?6AMZd*ycb-Wzjv{`y||aOBQccJKtZN*UT?C%krCBgDNd{Tdq?-e73Ky=d-6htc{b0H7w{> z@phdzy3b2%H*=U~Sh988o657bYbIq>^Y(MQo_{3zlU@1V@{^9Ml)E2WS@+8lZ+1EU zaZra`n?uhR*8gv&dCiBi)?cD@L%(+o7*O7-Lz2VB{DhVd zsxEHpJ$>$2yEEB0Z|(3LG5`Fyify+Cc)IMb{OrW^cGioNXFWU=6FS%O&6x*3w^stg z+s9+e;~u5#UIr`}xT5Omwd2B8+^f-SxU+F=&B%Jke8Vq!hn${~+r-i;?fD}8x5*x- z`d#ze89c}~e)RHjQEfIW_H~Q4dg^q`sm12t1YKad-?l7$=kwYVqG5NPUQC>Es>{Rp zsGDWOf7;Z_k*s+8)%W27)%_X4w|$&GS@^8HH23kVdk5F{^vsisn)!{NR^`y$XV(o* zn_DFewi(hz^I2rPR>#Ila<^<+uH&1jK{@s7h0G3H-9NlmU}@2sPj>!BefK@?1=sp` z#+9*|y?O4`=%}}AmY=ZNp0%p1W3uX|TWy>-L>k*U$3(4ehTUq9b^A}HZ6*G6FjCq<0=v%B5<=mq2A zms+*E)w5|0uLW5~t0%9be---Sz;{jUiwEpV*l*fj;Wb9@(r4n?%)6H37DZ+a=&-wa zzU7wHH<_d!=R@KV8UouDH5Hz05N^4-FV)aW;E+ zPs>xb{_kQBK5gD}rN!_$4>sBQ=2$hVZ;%b!biv}mFSi=bp!>*O_g(PICIb*a-P ziL9EO(lkmKv|@PUl$?%P8*OF{+&Auf!v*Ib{P6Yf8h_i-Ewbw+*ZzwaubZ!^_o;b9 z(ZeLK@Y>zSkMDluz&k@gOPdAXOt~-9*J<8nZfq276XZB5dv1sAM-9Nc+lHbz_2vyG4e5RVS6^4R z4c$i9`q`{Rzc1@|zPy!WCF_~KYK_m({a0Gf>-%)pH@m%?s@OW7y4(2dh`=%r2JCS8 zG`a2??|q)`i!OxLTsQH(W%JFt*=-wrSvGdG>+^1ZrrQlonlv!9|JJBAPirlI<5tyW z$~?zOYuD(a^Qiz>(G`>$2nv>*L(Px@e=Wj2#ivoAOfcZ{gN z$!p^6lV`5z$|eSTJaE_k(db6k%D1cMms`@(v)L=_D*OA}XsUIszoWv05v@u*bBKDA zb0yUJ<)*q}ua}M7U)%kBMv45YCvDQ_c*oa$KReTUX&XyTuc6Or6JOm*IitkYg3R2~t)E5uA6vcB?%>xU zlTXgb4=VTY-qf9Tu`WB>b-B8r=e%);G^g7(pSa2L@wf+P%WWRMc5|fzV-IYoZg=mc z+u@MAwVf7E)Oj{_Tjd-c*VI|PCgFAMIVs<7MTc50tZ%XC*z7cwX3&stvmVX04QW2O z;`g7UJ9WM#`8uF_Y3GRQlSlSku(|T21_O4zoPJlduwJvr&C1<7qsy3^TEC66ZN+AO zHA)`4Hmut8VP!X$PjVW$PZ77Ur}ED+?W}602MrJ{e|=z8h0Ueh^G?{Motin<=3JiM zHf+(MI8F*F38S2RFo8-mutTdxiD)z}g83 zH=EsD8E50y*n6r&+nFyLzOX$IXOo&Z<;RXKZVy~-+ieP;v-$bmOW8M@HL>m`bLw1u z;jg>PuT5~YJMhzf%g@{Mlw$85Lt{KzjZkfNl_sFFcd-vB*h_H&?79brt z<bD(l+nnqsZYAOY0x0xGw6}#l=p~?!Vq()n)nBo$|D)m1N6Ab==Z=CDiV6 zuJ69`nGrwF*sPb8Z?Q(bbi|0)$8GNZDCIPKmOPu$?kh=zq@U4$ViK$BX8!~ z3>d$t!4+$#Kdvp`msQv9SmIpoaT#YE77jjt?)A(+ySLR2`{o&2%3V6S=CJtrk&d{sCTM!74z z!>U;A*W>D2L4aSCLXI4Dg%*Chwa8)&>q;=# zu4P!x(oQi4TfaRqF2Qqf+X{B>B_}!7ZI=IXk9tk3K4Zr@$4I_Zo8#dV*HWgc*}p|g z%N5%{#q3p#uRmg7r-sg@N7!1e_)z!NP;XHs5J4M&zO=AOWD?V_-n!qnReovpa~6z-3oO2>($<@RUOKH+0wbyw+)q2 zMaQ4LvYT~>w|2WE_qyKWp7TRZ~hE9#vz5Wt=CUs1C zQ9zh{_EwMYS5>X*A3U^_$rR|FS*}zdsok{{^vK7<#|!= z*$*#-zH50k+^Ov>r+ukYtsQTVc71&~>dx&7KGoNk&2(^gcvegGX^CTE*!X%q@~695 zzp|RO*s0w5t?NF`Y5l{+`tqtv{lo5*pSv{2Xfe9oefxch==ztbLV0+08PSKCc)wc~a^7&h=eK zhyGfXJTm84lt8n|wUZ9?fY&7+={9ago(qgHm^>p5>p zT3B5decy6rpUL-LT>c`G?yRt?YD&-e3t5I9^&(r@`qUpEdw$>h2IXf>+4wGLq?7!Q zONL>evz%o=+eBUdF->GKq)POX770l|cZWzLer&Vxy)#)JUi!t?0iHd6ENu74F@L;M zpY=5^?o!W9Z2w?HBhgpy>RCM+R8WmA^?E|D9net{16Qh*u?(=agVE*5JxPdD1fd`>{EznlPEEZrZ+!JVQ21{{|z}$U1 z?kDsyb1#SbHiy3hrh5oNd=pV2bhetVSP6C_TpFf(l>%%4Y~BV08_e9bfWyt;@xS>e z*xdhU-ap-e7VcgtxeNL@^}UeIY3$gyI%QE1=5(M<$(&OIE1tZ0;W6Z0z3*Z^-FV@`ka=#d#fzG zCuQd6J;Kl#b_{CVzQSEZx@g7U%aj)0ypjo5u4LSmD-troUzNhhp<7sHH>z;+$?Pf> zcSjs|mJK9zLC=RO%;Pz5$W>Uf)#1A?1Y&;6^e83IN+&2QQZ3bWF;da%#2L$@X`gJ#R`v|vCz(#}I)4Uz} zV;7@3?CG9^kj@a;(I^+-K|D-hA;8D05xeCUgIlsObaSv*-R?c~Jq$hT_wcP(w|g&U zZcwkTSN(eb50VZj59q$^PJa!vv=^ff;QxPyhZ}n}#?-(j1~y}ObN5~tKCKlZvPeQ& z_P`IcdD4q7SD!w8P_8~b``4;hSSNYN6sn~V-pj)%e*L;V>i5uhDDwLjZiGw8jqWcA z^;!Y_#lZ}A`weainEHy~KlV3R@|%A(57+IGRnLR9M9&5=pdpIl$c7(t+&}8KIHm(O zPjlgK?ppu{QCWoe>-Nwifeu0*^WomYEYElO@K)B>(;ApRn@A&|MhJ( z3yY7T+%TOPiihK;Z-XXPrY2cFtgBg^MHtEh-7#zj)xNz?q1_Xt?*Y4}P{NpK_8UxdCfPZJ zi3-EHgN6x!oe+2X-{1v+{mtCVmEvd~!G8_Fo@VY%e}m5hrm-maF91yVM}Thut^t_p zK(OnNx}|wQfU^M8+%3SZ08=>x_&8wdpVd7*3+=4XUeq2vd$upM`v!kx=jmBwcb~WW zZ_{i7F&P!k(ULx>SE7%aLkaCgV}SA(Cdr0q68_??heD$Fz>VPyrN*eIJLHf^K{xpz zk4+}Eu(*!+>Lbj5o`1+nko8WMsZD_-!tr2e2Rf2QaA_AtV$~xKPTj+v?%gD@ybq-A69EGYkPLxIGN< zAgmqxBVJl-w8dDYyVL?444B$UfI|S&8bE+U0TV6};E8~J&EQRdDPF<-0AT8O|9HKa zu7tMt!F^VV&frm}4!a_X9WmT37Q%X>-{b!`VKs6&C}5B3J|2xIC=YU>i_*?PSQZ{P zr6G-sF2?r7bzBT{n2Kc8ctEt6g3|S9?_tyf^|xsg?$@!wmL^2i`6i<1ZCq11b%DVcCCTpZVVgamq6WFajoV-&tbH@JI~BddqANLP-8X?~y_{OA3nXz&Vx zrqU!@Z?w6NQVfn0S@c0V>FAI&zyCMVQ{#p|lKLC8CQXrfDP$xt$HNEcjf5!hpr=P; zi*3kTcjRduaDN4S|1koP0A4^lb?Z@ZsouZ=LO5^mJP4-=@Hz~7YIgyC1-RDV#w+`q zjImOf<*q26*QL1p{a5PFOeom<_~No-{@dwE6N<|q>(1`<_iRJBi+JWMwj9ZYf@@V+RqUO(OEm8h>j58127W~DjxUWp|4{2 zjE$k-t|CTT^x)$V;8eiQPy#H2ndWZ+mcm@!3{Hl*h8e7bner<5H^EG_jQ|h(4IT>E z-2XVhL<Q2*sEHZ9KpLf=~*=cx+N- zNZ*4AJc0xX1?1X+^JLLKQN(cde~#b&HD>jCq?dv`_Cm*@bypCSFu!($xf7Hh)W18w z60JZ#>X$Tc{O4n&h?z3F+drLOS?9+xfc3*C@K0-zXHeAd1o*{oFtwYx`v<_Z&Jz5O zMPaDj1$a7OnjbKqLBb5Ecc5}eDa-(8ki?!Pq1jWJOg<(uiAlF&Vy*QgHHHf^JOi=|Lm1yeuClKjQe-?SKfaJerIb|X3J4ir zLfoxThXDvDz;S?yt`XqwfN5-pL3uz4YczA1#xAv6KGH5;G`2reD8U9ot0a&Z$NI!; z_@y-$@kkP(BC)FdSJ%>YdvY`qR@R;dWg3O!B`0!YI}H*;(Hlsj4H}wOT#ymN3y*83krSz8QYU-UavUX^i#VxHWACDD->9?)nc)dma%g=eNlCl&Yd5sPa<)rT4g)!#=fF?bfXD$J}k@hxm$aZ%HX z^)d*qgcxlIRfOirbg{2k?BzwuON#@#OpnV{# z)F5uqKrHt36pP!nL)iAD+KVM=aMfecuaFqDN-ef7AgWqir;b?Ms~75|zZin45fw^E z^7kMNNF~Acpa65FM#>GKJfXayYD2YS`J)UX5$JVDk=CmhwEn1TasB$FVCc|+6d6!; z58yU-Yp6pMj@#bV%K zXb=c47Bd`+4;IW~F~hauuHj)Mw+iy5kP(@MljvR8@(7M1tUI{u4 z$^dkUeu+YZv8%_FqfvVWLdHF$q(aUau(+YfhZmKXCLy6pAuCem6)s^>cPbQdWew`v6m1(NtGjc^~6Hs zr0f?uu?91VURtuN-S(DbGu}c zD(;a6ndJ1)g<02;0jHob7`AEX!J}Rn3Na^HGPF!$>deriSywMgF-|Y@C=`my6^W_~ zvO-y}7Vu&bCNgVI+N!5_EYKx9(%9P#UV<=u;IKk+Bn5K0*=rYn>nhQMpa5P~V+X;^ z1BvmY$`>+2f=hpM{$HHTLl#L*)_X;uyP}h@>XGUHrW;}0adHt0>%^-glk!+7nUPY( z)#4V1_VtSFi0r?d@=G1r77%1g{uHBu9=A;$?Bh z$WrJ0<6SBAW9HG!h%F;E@qJk!4cM(ZGO5T4?{qNVL|5qzTnb1Jt!9v=;E5edoCjnk zNJNDtGQlUthb_#5PGgd&C~9DR88Z|HCtEI5p>KL{AVuRrUNkBQg=aA*qa9d2u|KGW zU|7h6FA6F_ErD1k!b6$Haz`JTiDi(yv3R69Nm60{&GJsA6^g}`or7d1zBmL@EGkJR zSJ#A2z+?iIU6eA?*Jyx3bP&$XlH(hLi;-&>iUeEqSR7E{AjY3QX?P0(6Ng?Rm8xV( zSlE!*;#8sjS#Yzul$x+TugPSVdZkRQmas@!M3e#M!1 z`9xum)eakOJ~Z zpQO=glCUvu%G7A2ERtjssAj4|i3*Q9nAMYzdCr#xiwTxnyh@SG8d#D|CuR|tD^8{Y z2LqF^Ga}>Gi)kP?vEne$fx)yC1!f!0o+SgemJ&PxW|dBinn z=z+J}*qoe%GJ^)E(=UH&MeJ?CL-<;Q2X+ZxTYQu7jl%b5S?=6GET(dWAr1H(4Q2pw z%%o#`i0ib)vWKS%Xr+qXbS^>au2_1}gG02xYLm|Klfjx~KTp84e^v88Ut?3YxLjdx zvZ+^N#^>WK7~9e!4Qcg3S_Md)&X)-AHNeE<7T{YvOl1{Q{fV(Ipep9(72qw*cxVEU zu?AY1;2ek8Z1q?e&ppIL`};z?F8~vNQGm|^rv0G+iCS#%z(h$>#M$8ldK-z}Q)8`1 zBGf_Sa}SDm1)I&O<_*E9Y+)@yR2=5zG+Nc0Pr`*wq5mJ_NoJW5A}R{tp<(Ma;uxAo z*$@B{LDN$g@Upm}6IsNdOpWv+_AZyOcs0)|-)9QrCNc)&HuxXA)xVM%E;hYcMvx5) z4brE*lWq87>(%1#^6`5Hy!`MOREl4Cl%FISPxtv@Rh=R8OUCNLFWKZL*ZE;?goR40 zkocuZl68J+sh=iAqxREi<$hW`uOciP{fJud!`l&lU=F9K{TTPt&zPq22L*!3Qm^or z=rW+duklYd`QxbybSi&Hnb$C0hCeX7zg*{!c>O64{)o!o2$pJkKyb1tATla3faNei zqQzf{XLkaDbkGhMlQ0KhHo)v1fR}(Y>Hs_ssZ<3}DFV={z`p@t0SAz!N)mt&GF>2G zxem`s(n1Pv!U1H4aN_rJ#wf6VIa4h0e?f31r_xh10a!-j&8iSYgUV46Atno;*(6W{ zPNb|038F8u zo*wP_4P?*v{AL#`LqG~1hD!fE3~%)h;b8x}-QU86k;iGxl8w{;meqKAaRT*3ev8ly z*8;&6)1(GPbP9?M4q^i`i1nwSWDK96WK)n7?;y!_K@4pKagX2y5#r$9%EYQj6~lIJ z7>vp>#hBR^;UU*f@f)O&9 zwO%mLDs?6Ll498jLF0vlVlD`Ygn_ke2*n!$2t^E$>q1zYhNOj1b3#i2CtYU>3Bg7W z9E6fh!vL6>o_#DbXCtK4P!+KlcXg{ zCG_4=m;?lDvJ6cehE5&EI&T;Y9R}}&SJWvg8UGGkAGwbYy!@;cQlTlDb zqkwGK5D1g&!c<`@M9swtmIOWiW`^Mfz^wL)VRdpZ3eN*(`Gk!*q?Lye^MDG&RWw0n zaZ_K@E5g{=3d0N2+VEskIEW2n8XJn?SX?V{Y)>98*D>;f2#auZ(r^R}H%6eFMzBsA z!8&6E>x>bw#7+;raAy{kV1C5mm4189KOo9)y zu2JO3njIjufY5V)1BLKZ9_GY%HQrp5UST(a3pnDaY#9X*j79womeHU?fyj!=!5ZBx z2gP6^3*7vMM+R|x`*%Cqd^NKz?#GCYBbk(P6T=&e<%T^bZ5CRn74{VpVnE@bLR8E` z@M_*Z=zI|dBGe*`k+cSgWPLD_a4u$mNGY)nBjvhChV>%}=SPBNCyB&a4UpK8=nj!M zk?}j>TWH7V-bh^}l8Mw4`5(y=gAQ6c64;#{E(HoEN-u5fmWrsmWuqK))IINj5g#st&SGlo=T$5`mBkz~2W z3;|HY;_Ool<~^fUz*fSSk3kCr78@KH9T6Mt7Z?;vl^cudi=`^(1LME zpemsO-^Wpd#sOjoFix(EV+b&g5FnjZAe_a0327CYfVG&}3~jMWW*T9uI3jlAkRiU= z`47b=tRMNFW444Wh6)%-#x&N4;L zLv_R%2>-_c8OIZAAU;W=i%&MiOUX={DxMaaI@Xf%SfIo~NIiaQL;mULg|4rh*VEi$A!Cmkz=j|yP3eCDr0l60x0aPB!ZiA9ubN|Is+GKsMUIbD{-c)}S;lmb0T33d+J5J~}+iT%SQxh_eW zk}T1Zj@F}(kpK-^pFUa)KKe4k0|tFM=Z=C>NCQ6~(I_$lSrj-c#llkFl_|(Oa-9kW zV_V(&9*yl4gV!M}FhTZyfoJBfs&a zC_p?p#*<^bf;93GPd>Q6l$@pHEF~8yxsX2vrK6y96qJsF(!q`w>P?fys!x-})x0Ll zNKqIm3L`~fq$n~-QSuq&m_d#i6m16i$j~Km-H8Thk`BFHmxMkF!a7ZvMEwg&mZaCH zm`Va?g%mb@!PFoXM4F6g>D;hJKfxcvk~$1d&=AD`nHhZs*h5Adwzc4*hsKP=JWi$# zmW)uag{DtSCjZQZ>!x%zn3POM4sz_RCY!K@hJivF9S+4-8AYPhF@_l#W$B~?HxM?b zZea$pPQk&_X#UG64sf+FQh6Kt@J2$aFyj1yPELGpe6c)+j(5Y62-X`+Gb(W)8UvPT z*n@!)*&q%L)9AFcmXsVmgmb){DGLw9V$hSKA~KYajE)Hf>KVF;6z+HFP#!E4^!jA9 zShC)jL`nutOA5>(3U0(!rB20t&>Faf0F5daC(XI@O*$<#5=JBNGBa{Ivtu!URL3i; z%sc6608}Pfx)yc78}%Stm=VL6ec3>U33~_7f!GUcz7XOn-pE40doqvwk_q`Gn^egL zlhjYAlLkw4QpR1!CMi%7m4;e?RECs86^x8PcS9$VCYz-AaRHcLlmM@WOJyliV#G_i zP9&A%WT!zY*WnmR^v1dNG0=qJQ-9y{K;gr3n7!!)h9N! z%To0ClamUQKF7WUBEcza6|<#@o;42BK*Dk@B}>z5Ni}ZD^ky_2s9{AjuME{n6cH&s zNCs3R&0+jZNuLaEpD8Kopljf-Wh;)GagWG<4lSM%)+ffEzpi1f#$&m*GS|3Ql7hDan&fav2di zI86;2NG|6zrt3H>9L10$M2cKxQ0wJt+)hV%L8v1d=&7VKt;_T&gnXbeAEawIKm)&MM16`}m%@IiUR4T) zQ;I4@6_lcqq^SC)sDo0}NDGQ6s}!{i|8!E&&>o;fBBeO5-e%NGJDAP1@T%7<;#GDAk zfM?9vaaU*{qLjEH4C)X@;C7ti!0^X@DR3zU6$b-LDj;FXKvSGjgUrzYSE4;x2AC~( zw+DqJBupxZVPnJ#Gk93gXzK&}A2>ont1cz&VSq)f>Pw|YSL!R*^`*@AMZA3xQD3&z z(U-iXq60{nmXXTH4YHH-NBL4gW27Q{D#E2AoXQVXuks^>+ELNQqfQk>y)+op39D+A zgu`Fxw>U+FYe-l>0Pmn50|PJv7$D%Nff%QWm=q{eXmYfmPRHqrROSY6Ivijlow_nU z1^@>9DRCUwQla&ADx&mNNwj2UI+;_+h@%0ZC+TBUF_f)h1%!^!$=JKaY)ev9XkoxK z%!vHNs59!(gE3#=5K>|PD>Sg=(JSGFW+Iw}$c+a<*#ju_jInLLQBfQ!a^wRSSzuPg z+$)d|ba5BAzA)e7fSpQ)QJGGPAr}ly{F8x%39WECPW3Syqr;cOFZ`+uFz*Y<7$clu zLL;1s|4?l+N&B$pg1y&L0WF{4U)DnyUkm1WbsxZB(*bWL# zdEwAHr{ipxOr;KjxIZl^!e=TqY)~e`XSe~5#5L4o2o0z-)VQDs3+qz=iZB7$Kz@PV zKy#hh?h3MwVaij!g#ZhO1vHu$y&4L$r;1y_;hZ8ScSb_12Fnr`H@=nU2B1EZT z^aTn^c#dgOl`c(%&0VER&$>1Z7IYpe3lye$;AE9PJqZe(jWoCuF@hL@pP`h9oSKid zw2EtLbaf=g;cC=o6lDNOK!K(M?V>V*w4p2*bwt3V5w$|-isn}+m{pjsVbpT*d z(Sx4{f@N1deC0#%a&<&67+SbkwK zqD}$H4oeeQEqVnu`{{^+8Z(n3m2_q#a)6OYYE-KPRz&u2x?U~U5sii^ADj|pnmWaR zzfMilCDE+V(19>XDE0W`q;rNEBS%fx6ljt(DHINBqD=tuIK`~!818V?>($hm)S!*1 z3os2QopE#;Rf?57{z^5|z#SrU2CeV$NyZ1Mlg3=|As2j->Fz5j5Lg(9TAUYF8`N4@ z(UJ+eELp9iY*N=(o8^f5yP7mmrpfq|Z#1b|PuyzC5;GJ=OxcElA86@n+<%1+N?M;z z>o@knwhzptn1RS)_{1s;nwAt<6QdW_h7=VhR?K&5gDM4^pxll$)n74yeDZEA@5Ldw z8gb+ee{l1lqibXYQu}8FQ)wA15i=`I>go*ESQ)G?GO0p9uAp;3XGUr>bPsf@7!B)- z8jKKP0h3C`+^(UHrD3Z!O!gT>8sMBM<{k~P192A~UO{n!0MIbHM3aKUx4=ajMH;rE zfZmXhMn%48jipCOP$L=@ozkU23Cffko@yGPP~emR1%i4;6kynD8Lq?mWNJs;t;Qc^ zW*TT}DJh(Aq>PXs4VD%NrO{<*(54zjUulpeIuoiKI_4rym*5r=P&TnpkPb`iWz06VPU4UdWeWC&OpP`Ta_Ja(hT4&9 zY5PX2)9Qk>j4)Y{P~MCNcJ>?q4nByxh@@LK zVnqkyk~U#zT}^~1qaT@utl-K?#2mXW$TZx$ z)e}*V2r=_htjHAUWX1%==sB$O8CeG!8iN)~aA0ugq#0?u1&a})R5<p)>F;LbaZXd1qxFmq|SiGVdRWDigcqI>C3hoEDi2xisFGKJMR z1qY^O69Q>+(rA(by-4JVE(>E6y-S~jV8pu%(lah7wIQ24^tc7c+LCb;F{Qu*h6>Fs zxL}dY(&J1i$CK>!xLH#lP6A?a5|RN zG?!ur0u@Hv5NuNAW>(G!sn;~mvbmE?%!d}jF1QI*_yUQf8}Y|dmg#cn+)xI;Rfoj_ z)g6~P+UAgx#v61J>f$^b3e+tFfzDw>5F~9(3WB2Q!u(E(GZO6w2+a+R?5RWI!>Wqq z7yy@V{>v8xv>4|?D+e;6IiT}@Ezu36IK*AZtEE6V4#RXFagzlX2T>Xn3qsNde^7I% zE2FkCR1>JCP{=7*oX9lTia5gkq!;&kTmdd83vf*4im5oRkPN#fu1PyOs zg(4d+L%{aP1TsL$(4Qy|>dhRxgc+%)gZ4l}WP^}EgFwW&0pi3l%(?9bZYKeKh?W>w zHxs(U@T48^W=zNQN*q00UL*~>bnKe}{syFDutgd(A}{!YYBMNc4UJiV>&u7&h60$D z#OcJN!?=*rEM(B&`VyPX*e;V6Gc-UsDNOAK>>7dx0^jI1xLd~)Y{Hk8EP|O(sJU5| zEx_)- zBV5TLOd~C@!Ms2PbGi(u6vUVo1BQ+&gX{z4Wh9Exh<^44Th*W|bDjo{H0a?1+= zmR&{@p*tx_DM-WW*{J2?00F{MztjD*!eVCjt1mq@CSRAwYAD7lf9nDWH& z(lbyUbTNY|Mpx6GHFlMWdCgLUiQ_(D9e^t_NB}lO0zzjR(luxR=}2MnMJFdLj4#(k zX$CK%{K?w9-7}I+jD*K-3+=SBy<#x883Qr{)C5@|J91qH)o2DPF@tEX42mTKh0MT4 zK(-_$lUfd&HSo`Nc$k)+DZ_zoZKhlYI#Qmg&D3RrmM|zX5iSczCyN4Q0TpM_Mnjfd zmqlwqh*^WC%%ZhK79oi&EO@i9B+R1qKo(+x0*=UH6LJ>OX<38_vnW=E*|S*FWl@D^ zp-@>YGbYyIpqosTtO;M4+9cPR!1OdBQWJuk(DzJeoNVSdn-Ndg?8rvC+2AheYVrIz7Jul8vC*2%4SQH#<|^*WwNC|B(E|BTygtJ4qzF>I=-c(q^$A>KAV=iThY( z44i+G-B%IjQuvBWL$)SwF8x;t3lYo|b{~`-?|%wBI`d`{+~&dikAbkfn!J5!*w=*_ z(OI-YJPlzcnVk|3+(+a690uH;_cQlm2@8LiDXmxt@eAh72LVU$eh$GL4KvA>w1c1S zy!|7j+ne`awkBj+!Hg_gSR!!+%n&PS(H#CYFw-5ihSe=BOfXa4ro!U@-hUb7b1-k; z8s_0JQ+-}830bMUJ%ybBGvzY^aZcmy#fWScZzef`IlP~;sE36xQ-03F{}PxO!c!B>KV+G zF2(2ykRoKIl+kU`ncjn~JAFHQecc77Mg8CO5T`dfJ`N$c&G>iv!C*Kjri*56Ei3mybZ zXC7&+@teqZgf(U!!v1csj;ZbNZ7xjp&X(BEgXPZ^qzJ6Gyy-g5LRfK_M%gM@{iwcJ z0;`Xte-f;Ic>$Ztjh}O%K8htD* zf2N^x9xR)4;p<@4dpG)bnS2lAPs8cRbKrMiwf%l{zBKus$eqQ0%rC*8^a2s($28PMqB)x3Cm78`g_BQ)h~S=rx;d0UJV~)I^EDY9G3m9uz55r zJE!6J@upKlU!M%8Am0}I=favFp6W>~V3i#TUu|54{`Iiheg;2oH2IU{Z-M1=E9~3_ zE1ug^_A%4%gRv)#+u_eMu=?>=e0~SkxV;Mg9#*~M(D@fEoB9K=zr*r#7&hD1`a0qc z#;qun3MZqZzZaekw_$qi7!R9JSZ zkS~Yj!$pk4OW+ehuq**%kiT^t)p0H(34*M?ZOg-+mJE^~F+K;wZ<+pQoG;#k)i3EiIiH&ReE2KVA4l0AjJJe;f#uuA)b%^8~W@ZDmrJuI*;sv&K0o6)y0gN>tXqD2|9PeI`_>&=P{Gth|Y_!%07$y16cm7 zME*UjcI}3|^?|<5Jh%%ioA+XKQ=O00+v6oQ`e2K z#=tg7tbt+q_5(407}mM?C-@au_J4#wG99fkzBL`KFu8OU4r?4vq}~loein80 zffdg);Sr{zaWxv2pDW<8u>6^j#IXv?=LPt@t?9H;+>A4+WCvI=$#ETL2CTM^z|I`g zNyUd8lXt;R5iH*(AulnOeg&+$&c%^Rlc%7#A1r?+;?IG`+rx(&PllJk^1lcA$H5xU z?On$?A65*-D`1Tu@%^yQo8p&YtpRji_zYH@)!u)>>%%FeKVaEU!{_9Kefd0>znc$h zoGd4Ght;mGJ@EsU{uhHd|G^rQdDt8bD?X+0=CJDR2Ty@jPdj)9tZ_9Do^ATA;R4es zhs$8~$B;EiF$;d6L1SUUfN$HS`keRw9U_526$0$6n|ffvKFe;9lOtg`RH zXTq|1415Kwm`s3Iz&b`I!FR*z)9vABOg;sE1D5?h@Tai)iybjWm=0oqZd^vN;u{i*9o)4v}1tFVsW1Cf7b@`K@@ zV8wQX%Q_fVyE-Fpb(nt~>AJfktg+n#?hdQotBG3=SZ%q2AFjz!ar&4%gLd^d`9}D; znejE0&4yKP>Oj6D&GfG$KN?nF%%rc!nf~Yf8L!66u`}6pHlXZI#(SZ^oADm-p0Ip# zadsA*3};ey4y^Ie9!D3zipi764}>*l%CWf&R$1wvVtgTj(_tMWpW@Hua0+}fIyb=T zmyh6kV9l8i!Oz2rTf5$@LtxeQ56XUJybpCH9qx~l2hdN2rL#NoUa;)9r|e)@eR>f- zkAzj%W#~_U)t1@l?`ra!(3u14cz+Ig2`rm8BR?3H|GOeT(RAj(7r?T44>qqc`Ap<@ z!5Yu^A%7HBT{Dos1j{$AY2Sf09(uqZz}_5)&R4L?zJdJTrn52pJFM8=04E*c>wJ%X z2Uz_+5M$}EY!2YZ1|}a2XBy8+B0g|3I(IR)`UWuWw#@HNqb6EBE#LgJw z4H%zW!fMwkJvnz6YhAY|tm9YxTL`ONC&87lY+j79MX=h~jo2Oz%jX@jd9?9H$d859 zt_%Azu3+`WDabE^W%ES%I#~U35_~T#f0n^d!x~E`!|%eX>s0u2San^;arBk(Bgnsl z)yC)GA7Rxi{uNf)qv7?B^vBWxaA#QkzJeHL!t(7P8y?*_}}-{85he2`87thl{RDmLy#Jj;yR)1WF??dr#mMX>5>N7~=`5(EdqvRRPC zInFo_KE`xs8?u{{yK8CG9Rh95Nf z4)D{k{M-rq&%?6+hRYh%8< z8izN-Tf&+*-hy|6RrW#JI}KJFPk{F}c_lXI!ivLG>dk|7?$9w(49k8x?W%%h^I_yi zz#50A!6(2PCuQiI1FNn}vA-Nv*-O#63YN|1;TvF;eF?q`R==DMKLP7FJp+CXmOuI~ z&$nQey%hcsmi@9M=5EtjK_C4SRt$@fe`oSH$^T^fSL4sGCjWd8JC63_ukYY)1 zPbf^2obJSY9xR(X!v)4S(5@m_{#-@bGFX0A)5a>}`;ae&WoIMG9stYEF7P47H)7`q z)7cpL(Qq<4=Tm5j>FkPpsqszdFEh@@*r~?r!)F?2!RNyA?Jd$puzcGO-!6yc&t~Xc zWt@rqYhgsrH24PNmDF{!@nXu}ZoC1Ccf+z@i~K?3gW$(u+20VIr%e9<50mFlhlkjbr z@ivUrQLyUmN7}-;KYnfn%l_`@Yzr&?bKvb@%^`ciyO?|yJRO!Dm$JK?{1T4qy|B9PiSdD2`fJL zz$;AWJale@#O*=TKd?7*i^E_ex6+bf8}tFUaA z!*82>M|9qURdy%%BV!J6=Tp;{ov&cUMEXC$^8X{!ucm(s%9@~7cFVAXp!Jjb{VG0cNiuXq70e{`-XGx;s>ez5#ey$8Up;9)2pZ1PQ9&Kv`)juzV0NGhRWTo?-g(`CQZ2bJdGr)q5lI%Zx`MzY3O}671XntKLoN-<7cHdI0$y zrt?)_uCq+8bK;{W*B7}x1FMZm@XN4bl?=aQ^7Y_MuRN7zfMdN_aQu}$sGdE9sgF}wg)JataL2v%FfR~SDA zUkA5Az9)8WGM)+FX1oV{xA6@40a$fSgC8+@A^fCqG5nly0sNBjeE4eBW{?&LMoOG<;mWA+o#(8ji;~Y2@RvaFuzcw)W?#MSb zo({Xlsc>K84)7pY{^*%VmdPXV2;(AnjPYQ2obgC_TUg`s0%E=+tTBH+yqn3F!+V?l zZ1m?E?*-=@cY}+JGvHEK{v^ZuntTDgpK&gHfbm@TP~)xOqm28&#~NqCC&G%4=9$w> zu6HEPHu+`jTMnzm_B7fiHlPLQMtoToXzc%?!@Q=pZ!@nAj zhm()<$I=A+S>O24WUi5ocSa`-md_ojcSGZUkndqS?U45}o{D~dSp7Z?&Vm)g_UH^Z zo!iKdHk})Z&(@}M5%O)}c5L($V;QV=?MV!)Va=0w^kiOwbscdhdZN}%p55lTf_8*01CzY5y3#;C*;Fn;<>H&Ov6IQ$O`*9vOeetIzAIrWkVU?YU z&F^8A75`#7gULHfeVy^(da!&*LMO%Kx`&Vo%YVr?f)(>*+S}XobsgFtmi8D)^cAdY2l@OPtg$Nl9gg?wRoOISmE8cAO}+25iOGk-y(~!m{}Ub(NZY5wWd?Rdxkwk?E{NaG>ejK)px6s_PK=7}M{` zSY2xRdIoxuvF?SQ4l521;s4pNd=Os0GW$!bc zpU`;_mOtXhVXc=QMdxLci{FIh!*qVUYw}HcbDeM85&pus4|?C4{_eEvM_B&6mdy1a zthi0X=I^k^z;5t*C-^)D?gXoi8E{v)9eg3Y39K=u_YVh~Tz$Q{$<-GVVU0b-a5}7c zQZdYfRhRCuFM!qFO|es9+yUMXRvT~Uc;DZ6cLWC;|47-xO+PJ(H6g6Fe1mVto6fy` z={u8aoq4+P5BPA7vF@ucht~!=$H~n7p z>6fN+HuZiD%b!n3Kbp?z$bUBZneZQ`e-@l{qTj}U5c77heCR@59gI&yr!y>@XTV)y z`OpR5HZpF5KbyjemAJp@i-*99XDgSv!sM;t(SZ&;4pzN8VRO9cCnKK(tFG?IrcYB)tzW6!Ebbi3_JXrmEGd$mP#3iuGs$VKiM}1LiI@`hr!zt(} zhD%@_??*Siad=GYxHQp2XGUGY$>Bf7(=Niv~FEZW- zzQTAed>yQ|OmZ0~#=UwoPGH6DPUgeA;AD6{ZNCRroR`wx`(efBha}D!u9jw04 zJA1#Fj`(+2zFi5oI?4C>P`DkebD^=yUT!+->lJVc`WkO{z_O!w z-f#Ny`B7N0dXcs~Y4Q}8=OrfB@%WO-+oSV_@s1RF&vZ^j{t+zuJK)b3u;O_w@^4J1 zGyH?e`zG-`7gif1{rGXR-!5@GSn_@@=Q88l@v|$evDBBo=mx7#`%;%{+z%cAtKL7T zYX~emTT*retaEgzjI73|MQIdC$Ww-o``;# zvDVDh#{b0b{%|teeB=kh^6g8~VX)dVhRTnG<-_LuSYkRCl0V*b)Gy17`{Cy)u-f$n z=`2|G^^WK{ChtIBUkIzNA-z~9nfy)SbB)OdqJM+&h$OB(j5mYtG)_b3K3H*1g&#AP z{5jJZhW<;i{J)jDUNia4$lr$LTU+Gs!t%KdWj{8ZO^|;M%l=#V_MPd-=FhO=vl%+S zn*0tp`4nGY&rni~B~LfrkhX6GYaDI`_k`u!Zv5yAD<;|4A7t`b#52qIb}AfhIx0IF zme2Q+#+lANjE4!vYS(1b{~6v9R=q#KyP5oZcn?^1zJuqOTxE0NWaN1+AjuRB7_f(OCp5K3lMJf8+kNK%*zmBs_Ge~sykLFYzT^-ku;Eyi=;I|4@k9^?D)=K)y# z@_J9^B9lJ{KMBjvjTsxyn@%VAWms`5B!;iT^5;1E>kU}-=ArWrtg>VA=Ob8SY$fu4 znmir*-x=SDfuCWO)qAz&1?hEUk8J)kzz$*JB z^==2NU9ZDajOEW%Sbl0uPJ`vY-aX#Sbi}h^#p()p9;~(>0vEz+`(bb?tg=VIHKub4 zd;pw+Tx0Jj(|?(|mcojI{5j2ZbSzw8I{P8N%(xQ17FN9n65E@M^?vy6u-Y|{WAiRJ z8CKbQOnwqJ?}z2TV*7}(V*4a4n+ve{yvdL3%W(=TCVTVabyzkRVDnAWQD3|VtG&7( z@+mAk3$gQ+>HHfz-bi&_TWhtg)x}!?%O=EKKi*?**s8zruO2#*f|=uP}Wb z?+2Ou8u&O^J{(2cm%;LXANt}{STPxbpJ&7C!z1AfO}-(1UT&PjzH4E{;R)il!t}+r z!m_Dne0LfTAb&3``==m(7?uw@7M_3=H{Iv?yUBH2ykh#L=)VQ4u1>DwylXo5;?GB> zvjy_cVbyy-^ZZw)zXChonp|V@M_Bb9PrH6GJ`r}#@XKnBY7I+A@87nA-9u(L6&vbC^ltYfDyEIT@`H#2@59%j5BZ5$0N<_A!AYm=Xjd=f1C z5B6mqhGl;xWp_5#v(f3WVz?vvvtZdNgmX=2Ec%78>|9S;V7zTV&ilqLW2O>TS#d3_ zm|sQ=4}|5v_;5G{z8qd^d1xv<7| zPyD>sbOtddA29BZ&4*3@X7rvgx!y;58kTREcV005n#^m)dIt0kth&2HmE zW7D~dVDx|$x7(2Sh2^Js5S#)(P1{GpI@de{PlR=U=2>_bSZ%)^{h7ws!Lwl5Ss%_Z z`J^PSe_+Lb3i2Y;nS#6&R@)`7HhCFiqt@i&Lt**Zm3o)JYVUH=QsarlY8fnlcEIN8 z#@oT?!t!T(>|bd5+oFFdEPuvf>FDJ=hM;4e+59R9|1#6Osh z`sm-r*TH`ne@lB?pXIl!J^Jgxs`pp89jvZoFP&{+*(`&%H?D@K!m=azt|tEso(U`dU%<0q`P>Jd zYn($2^I(;|h7^Hiza2UYVD*uBU*n(P#l}CvhnRi`_(+qBk2C%qKH2y;_$*jH^n=fX z+ZkVGIvK?LT3G%Zip~mH{=W;~0?Rka?=;pib)WG$@WZf@uqQ73#+|~+uvY4>rvd!fRo|73Eo+-V%VE>E-d>S5c7**_0jq+=Npq> zOWA9UTXS6BWPA%nU8Zb@86!Ll=k zahqy<7CITGa~D2r1k2_O^fxuW7kM98_6Kte_J?KXjb!FESoXgq4Ktnl(H{xR&du-^ zChtdkw}MqRi+abK&K<}n8{dQejLXu{i9);>I{IFnEXzBJ|31o`w-7% zCLf9XG*~`}&xPf~Rix#{cfgmx^5+(8US;wC+S?@&Nei%e}>RU zeT*ML(BJgMo58X_f|v}0pK`@^V-DI{l44HrgJ^= z+e}Ag?}Ae(EB!}cotvcpJgjy}{}q$p4!;k}x0~V5j6XsDTUhNn82%ZSpTk||C|Gv7 z6X(|F`E60zwy<<$vm-1W+38|Bo#72()s@wodC52(?r+=$&NlrX=#PM9N4y0r`|@XN zldpg$nf}9^LwA4`x5xOglj*c|84o7UBIYwqU-zZ=GR{Lj$Mp9^KhNZkV6zZb3_H@^ zePP991IjLj<fSY>;-+#84GoA^-E zzlpXSX`Bf!fmL>6_(WL!EBP6)X9qsl^snvfILl%Aa2@Gl*lRoWUTLh~wY=VRvKi+$ z!m@Kec5XG+??T>X`X!Wo!1V9O@WZg$`wjd!oC0f{yZ~#>roMX*)|yQ=zcION{sC)^ z_YmCa0{?#IQ}Cv+^dE<_Vd<#fw>Ex?zTO#Dy{{*8{K9(2UdqCWb1IqZVD)1+yQZ-Y00RW_HhnXt+pgnm!cUx7{^)5$?+ zkm>9LXT!2{3pyiAeg{0p^gqSU*0B8Vf_yvEIRyDmu>6^Tfn8wPc^LV0)434d)3}hb zbBtf@iLbDH*7Mx?CO;E-39R^tt6GJosCaUjYAP zyd7nKg%!g-$Xi|Lb0x7#fn{IMP&&hEi(-`t%jXg3_kz{l578e4%Qv+>3s%|Q#BBtu zwqJ$*DATzH9t+FPR0@qZoow83CF`KB-V6|mZSVPBrZ znZEc2WBu;Tt*~Mxz7uW(YYxB90(Bx?@dWbKNqNYaTlXmOq-`E;iPjb~UWFYaY81R@~Cy zn_<`e{OsLvHjNg0pvf!>X)bB-;IyMPOFQ3`}ZMFfmN@3PKDKW)zuAFU&yzf#wt4q zPBEJ!VU>Lhow3F*!sCr!hPQ*|!)uJ~olLIxaCS5KS;+T*)n4&FrZWhgeA9V{eMKhU zpf|@atoT2~k9}dqe2#&+38piQx#c92kEFe4 zz>0%-IjpwaM!lE9iq-S*wWcq=3Dy|f0sVVSM|1cirqj-)KVaFB&hsXh&MPMWoqcZ_ zznRQh&iEDNADjMi^uK`R!!Y9fy~&5d|ArM4z1#D_i9*n9%qid-gr9%H^C}98@>%zz4IAA_n5qddLM+fPClRZz5u7e%i#}U z+0@?<_{2CLAHINP=ij7nO@0zOKfGfC-UtC zSg|^R_@4sH&cjr4hROAJ7|w-dQ}T=96!u-YQN)8w7t`(fEHPvST= z{+V_?39GIr7$?t~{A+x85thwj^j|j}jrq4tN52pIfw6q}#B_e8%oniyyqrGz&g3tl z^ONx>jMZOY`SU64T;}r?)Y}GDz2{Q4J*+nBz4xxL+NF1~dYHTo`u$B`_w7YF)asvF5kkVI7+{Qnmorv2YVy4YS)BjbeN| zfhHdS9|Ft&JK>{DXBK>{$-jh`86Sw=>9BkgpAF0Y2*%HOuu(RH8|z(^4Pp7L_fIx9{)M_WH61;e?_=^}>KXvc|0LvD z#>wzV)7RfH+`?Gzv1|>?{?oK^Thm_;{T+;3!@HQiekXl~>EDkJdz#LD@IJ=BVJqKs zcE#{~Sg~3}-<80M$xg`2jV~o%X*>%5Yhd}aCqHV97a%{#_!;~>%y<`cjxzp(GRMGb z`~K8*qVd7-X|U=YjsBUYe<1R6O=mz)#;3_|LGiLcpL(w}`6$X>3$Krzx6of{@`dQ! zX8bI^-36cJ{WNDJ<)^aMSlS^`EkC!ce>L{X z_;R8$H=i#a$j#@=ovK{EXdzOG>D)4RGGFJ!cOJQX$F#qz(&byw^3WRW>gz$=;wra) ze`g+b%%YAv*b=^I8{VUX$B^Hh@5{^QtNjY%oDEgkzhD2XY`#7)l3iI-#+NT;XXW!X zCFR+C>5{%5rZ$`J_0FdGk;PejdlX-JlT}(FMbY=jG)N+kEKIVTIWxx%=1V z@NF~I#rZ>qWsS@lYQ^+@PC43{RaxaEwM}yh@o5v1=DtaMLvumIjp$3ybkArp`*q%$ z?0FoMFEcscsl#`zR#fv9S_1~E{RQ4vfZ`p4?3&(P6cdsrSGg(IW`Qgm*L{2-Pn4S=J2(CaCqNz@_Z?u3c5Abg+s=S_4>W0!tXCSyJ{NWbP<_S zR_#^6SHu>C%g-=-n*UYb%!K^zfvjDcvj@Ba}x5pXC~QFD?1m? zAAB=BwP#no=1zJ(5D+vy*U zOb_KQUl%gpCW>k)_}}#7R`a!bAuaEVrTpon0j)*lH6;aZUc}v>F94)Ij`{MkAzntd z`~xO#ydFVY{Nsh|30U)%wn6%y*lpB4%^6MFhjavKSH4;kFF9NVMY&Zj--owfF<%8+ zQcLBLGMDe(tKuvE3OKK#&*{b?H$-2=Lpi>Xhr?rk@9V_f(p;uK0*TLjSs)&lGS%=c zMm2mJ4BzHb+owaCHxDVqe7zpirGK<@ATfz?jFs`#EKEn5Xf+#*r2_xx^SsoQ5-Grj z=4WQ8s_Ojg!rVw<{-|MN@(V|f$txJW#mM};{4qnvj2tO-EI=RoPXwW%=3Vv^%@3JV#%UmRnGzx#PDNv(4t<@M2Ay^ORbTX|$>zm0!zq0$N4 z-ifN&0go)wX^|zq6WBSFPSv&LNu*SgVskR-6w;}rJiY{yZwJfg2d@)x>M z2glAx$ftac9o>hRvHBgbUnD=9Z&CKgS(`LF=2-~z!M=|D`eNtu(b^~Q|4_Us&2A)jra#cNimb3zo6rYxQ6<6#qRx7sx@nne~i55s@1Qrx-z>WS8LcZ zMJ6-dukT(OJX-cwd+Axo^pQgiMOEH7@mHQq{nR#hcJ`b(`{e5@ZwuUc)A^RalIpQz zYs&a?(~1ED=eZoF9G&wxKIXZcbZS@>orzDuao!6)5P!AqYK6awN8Q7yRFjssXc#bX z^;^TTJF<8PUlGW62Uq6~8OmCEl-F(NOM>HfkTBi+~p&g@P%`Im*>j5O9w;WCly zHok%|B<5O8*CqYAj_U8Sn(Obo-{0jM4f(=pPDlf~rg`U~$!s^Lj$F$Oq#f$gk;f&{(W4!6(J)ZO+-l)<`VsJvZf-mzI|6WSHIZ)01-^eud9Z z-MXha^N?wN(ly_o)qhV>ujY^7I1chb{{{Iq*MIfKvalqwxR`54Z>$$=H z^nH=GJ^cG3t3O6`Ga@ISFTQ2@I&2HObLy{O@o6jS(fV^!uEBJk_9pnT+#=SU3wO#S z*K4?c$;s-4Yp@7kWXpXLZr)r&+07`k`aU+kDh=lJcd5^t6IfH|nku=8Pq&PWj8>#H zC!=FV>x_&x(N9K3$BrE{GI})lNz33b;&txO;3uu4)3J%#lasq;wBpk>qjT5vb{*Sx z?cB9vmoA+YIE?pX`zN2~7P~{zi9X&d%+P^x*>Ij;!>+kN+p@#?j0Q5uT zXMFJON=fAJ@}NUHq7LbNdTiXm{wFw*koAqA?Acdt)&BXh^F8&A#q0!eU7c-uBZWKF z`E=$J7Ahb6czZ0{sdJ~;4x`jR`J+g6>fED4W@aZ^nb9MYPv_1(G>$X*$L_=rLi;ol zmSC4ZhRDTwB%Y+$qeDm4;}5sMcr&*_Ma|vD*Ir+)tJeeTtykZ^X2{}I8fi^d`(ns?_1D{}bMuw;9|7h!dyqTP7 zzN_CEz7H8~@xK9EQE{gzrPu3u^mNfi(MV5Ejp?s7$_QL(Yt8A@DK*u@^z@iNRNu90 zy1a^gGTS!gV7-m>g^dP(^%@(hH9gdMU|f3|uOw=uQ>U&pxl?9lYO7ZD7m+G4vyaHn zWoE`= zo|@jhd-uQ`*gds-_h9J7OmKjPS52V<#?zrpG)Njj4UM8eDN_SLCF#DP{>)5_kW!|4b(Ky0#MjSWstVel>a_x2s8-d5K8fwmXk|OCqcU3_f3-iT zpF!X?+v0Dw)h0fETjJy2HQkTCX|kcyJbUt7W_{aUVg2yT_l&TnN+RFOAiSaj& zGW;lX>6(s#=t-uT_4}@P{qI#z{rC_JMQTuQ=;K8*KK{t!VxtB`Th&$K} zuiXUA`ecx8dyq(bX}+ z@!)@aQFOlXls!BCZj@v3Mntn3U1djia_OWGKbyVY=Hg3NV7|ZWey(-|yaOOQo!BuQ z%{Og6zI?;_@p=u_)2zd>-b&)_*Q?S@p?9oDCzjas5hI3dqAfe1*?1$mnU|Z<1EHA^ z94DEXtrHzsmtT7k=o($=MC<4lr8f!K;Iu;b;h4JXUA4Zfp%!i z#2-4hgmxJE3j;GBZ(li1Y{5Ql>y~d?5aY`se{S+mO@rte)MNskG@!M~w|3(YiwOyk+&E9F1vuUD;mLUqU z_fw@n3%TEqnx?|nw~gDg`eevHjqAtnRgri}IOiLT^^E5y1;5+E z-RO;duYs}l(s*=Z`Nl2#Pb@)jqbEXvVqEgGnaEcOWopWLy9Hyfn> z4Ag@4a)Z4J~ho)xSUX z=%^umJNE-E@NeVO;O;U6l~QDqwacy+A%5eqfZ(i`^m1{+Pi7mIwQ^75&ZC;Kn6v4rLC!t-!=99Tzkhr z*r)nx{_mHCTNuybwrP(pXuEbw=PwWh|NLtK*(d-~oePtDsmf1v?tr#xxtI@CZn>({L$o zkKL;n_HWIpE3UVmQL=8<-^Z2qLqZ8Wox%|-Hi-ApUCLcSb4p+o#@Z1 z<)bID6uphBPtXMWHIT$j^foNNo8d2A?WY#6tMf1V+`}^xv&3(vD8ujcXmK2qhe)e* zt){&-bV%;WDB?AV4ga(^Xkp@(rcqC)PQj~B3b7aFhGOkKeAD35gL{Aa?iY-4W}gr7wF?XJ7%_3Ochbp1L)cziePL13ls@nK~G1#gWMig=yl zDXtC_RUl5*bcR)!s`I*qmpQ|q%uccP$P4o~H8!Eg_InjIe>tNngGyroSNZ6;(Ob_k z`}IFxHBT5#JcDd$%e~6*f;#<5+1PW;P|O2NPiI04g_Ec$Tnv3Z+7CXyLU5rK+uD9B zAH<0#N6r3tzm*o%<^Y$;XnqYrsC^9~1I7EFp=O8sNB%Ta=>L;keg>Zg{L=0Qb~P+k zp^g6HpAG-wpN2=r+Ss!SgLIYM(CBXZW7AMr(Gz)s*wmh$-Z9P*|6udpz6D!;=*1ap zStfC*=1r?%|668mwX~hI#6|gPnWONkjt~ogt;)jTi080>t+b{~_}FTKHyZqM3A z@2LL>M?JAbygiNPratl2{HZz5HM(Ehgu6rW$W(6?4A-96wP{>u*uK6lLm*o^<1PlFJN!zqw1DUB1A7%){K$!2UoS zv?@A_1%l>o14E&$@4TJ!Lh=y$)lo+y^N;62^ge2H{YlgdRoWty9Yrr17=sp`%Dd=S zRJjS~xuscIPG~4JJ{-LJb}AD)y?7Ser0*LOuJvCItOfcfYkT6vJ=<+q=d#b?aY6$trr( zoby?NPFzjRInO2NSb4t(n$ubx7eS?o_YVX4x^4Xt2*!B>+s3DvxXxjg;(Z$L#8ZD& zEtlGS7gtR<6LUIxB^TZuV~r5|sEju^)bCELOh77^c(B)BR??tU+}8Z8uT-2~EE82- zrH2sM37TtLn+;_)7PJ_}jvD{jMYMW~x9lN^ev3_o_?hATfiC?GpWwsaPKq@#flMdn zi7&ubf?~Z{)oH)>2ZWv?sNwvATodCX&L)mW)fv<+Yd@AO1injNX*r=RPdH-jD-5ZU+4jijL8holrjDOgt`Yx90*3h7Y+Pu-mA;f?)V~O=O z+|v5@G+3Jku4?k84}T7kg;;&wX+F5@sNeX1fwYnK*Vz^7d#~sJjOHb*{p(~C*7kL> z;r^;;nH03qo4BKyV2Td}p{EE#B!I zqrodrIZ)#N;9G(>p@m$WnMN`)k8!VLaCk>o0cOv0q7fVQ?DEapPk&zk;cUhpSEhL_(@8eaOuq7)ndvDJT+Pzyf`tgnXXS}ATg zP+?FrTmHu?Tum|`qN}?4e2SC#eo?D;+swR-t%76i_Z{=gHpjez20#&O`!uo{DqH~q(Ek+t1l;kA}JGkR==A$a(yKb#P7 zbQ?DW8o&P<7nnag6X)kz%e3IB^_o!iZySeN^JhnOZPXWP&N^Hdfz^t@+8Cd4Hls7Y z?`GV-W@LiDV-sxc?qT9;Wwm1PXBKWolbfURXS%#b>uOHp>eVqX>fIL;hVB=rKvS#V zSixpeg8inh5^Z%ITCX>=o~W7)bZ^0fDe>5QLX)A&$SOT8q($MSitOUh0gVr^@jT&lNb)CllKm;_o1h3Gst^ec{9TXlUv^wz$JbpJNq7MOs zJ+cyJ&+57#|M3W@PyR$Fyde-*U$}m6Z`dE+edjT|t}|@cTG=FAxHOS%=&@8 z^e4jV1m;h4^Z!v*v4}O(snBnHG_yol&AVZWz+V|gFP&|$MSlq^T%;~byRNhal31fd z)PnL2sLHL7!9N*8*9=h%yATzIAiTeUMy;+mT1BYZc#LZNXCdKoEtE~TPzz;4N(pF6 z!LKN^q)bRRKz$#o_oY7ex6YOKKhn_Ox$r;1R=Gf}(b7+LRrTEa}|*|!Jn(Yg|JRy!LTHT8b$v~S;6TJ5_2KN_&WCWcvW7{qq@ z=(!(vbE?IeCL<7ANH?jvW)$MCN1Dn|r3J-W9zNpakN^FTYsRy`rj^FKpziQ!Tt9xV z`Ytvvdhrdu4fcN~*zqln%XweYnb7|KnRYkS5Q~6!pMxKX_d62vaRK|U$%I~m2`24^ z;*ltCaCH>j5j#URM8TXW+wtQo;bC)P<$uL|{8eC!a{AM--j{c;$+)%HgK&X0>BxV^ zmX7hpCIN5G&>ijAWZ_-bWu)l?2<4^I# zeOhv(Lj_x+zpA=n2NP`6aUjv5#C$?|%f@O5kLJ36lcoOB|2b*Q@0L-c9>@W1GgKu{!PdE&q>&E1@~76Q2ZA z>$0mDf%p-;ibnpr#p1(PC)apj>Zt$E2^w#Ii}rf4X;F!F$}Nt-8Xtg7yj>Q&th2VZ zYrH)zG-&s3|1z7z@cgy^{C#Go<2Xr9veU|G?X+>$bJlm-I_;bkr@hm`>F9KFIy|{DUoK2if9oOmU^m2MTeVo2dKc~Mlfc!vbkh7UH z*cswvIoZxoq`}_`Z~k`JDwJuy^);nA+`JsYcBHepGs+q5jB&PDOTLeFwoLf9mDAFH zY0fxjYy8{B8ShMRwsj^tlbp%UcFy+5c5tRRJ32c#Q=OfiU7TH=Y0hrWbZ3S$)7jnG z!`ai>%h}tR<;-^GIQuwrog8PLwKLbrbMl>nI{zZkI26{|7q6}UnBRm>e2MyVvQy*~ zdzKbB3#0WnufI#8`lU|U8t|qZdlk;U^;oK`M^?8*RZg{28;97+A1 z1EXaRat?M5aSkPam?t~jIl?*8qobUooxed#oMW70o#VW6OP%AL6QC2FWuA`eYhGN| zX*DMTCp8((lbutV)QQz}Y72B@r9`Ji`!{h+Y47Qwz47H5%AL`KCufE%Cf2wvzb*pn zBCsw3>msl&0_!5ME&}T!ur31YBCsw3>msl&0_!5ME&}T!ur31YBCsw3>mu-(^#7M4a88S#9{(@3eqCG6$u24{jbvBWl$Av)v$OJZE9aMIS4QR+ zS5;TmW>;0_XBU?hL>6b|SLRknsydW}U zegqS_B}4MjoL^p9J7j3qsH~x$jX;!DS+&=jdLZubLW#qxC5}^57Fk>o$*+zSxKtZi z>=sg?8>y@;uN>>9RF}I&xn%_bC z9OqT)=z;AY*lx~t_1oyVHYB&Ey1X>EI+vD>%o^pjtfsoSB)hmeQc2UCt=`fr432Yf zlEW)9Yro!#^70bZyVB~No9ysXjuXueD6^HUhZJnq z>Fq|Uh*hK@uFOE{o^w!~C_lHPgoA(H^hi}rN%h#VHD!w`b1Mc6oadI8xeS|mlPfFd zxs0Ql$fdNW1F1Es7isnTx`eqZhjGcs8Zstw#4#*2B38?!N&V=RsQWhBK_>2lH)q#)K;!dH=|=I&qX7MF1VmtnIg zx5}-kjO*hrwWo|`zaaDO4)i_5|&mhXIeoV@#EGIuwQbG?6+ajThoZF~p zAL`k(jX&q+R#inRy_Of|7BjHMx}{mgRXLH;it5?{16SXh#(O9@6FAOxANYNADSf1Q zDac<&e*7AVOXHrjbPnF)Lw^q5j;-e4=kULnZDVurq3CK34s?S#_-bUqSh@zjo)nCw z74QwD8%eqDq~fZIl3WH=X+=q-G*VXW58BEIb1cJ1$G^7}aAV7al3M2`%Id?=bykvC zzEoA`XBXy13iC$|83ZoWm~h*7zP*&N@M zxh!wI!^E3rV-sxVM`^tN=s17SX`R?I`;=GCsKv9z15#4_IuScZp{M!>PAo62&_J76 zUcPPdeCK9lLECSETQI#jx1z6)?A}IN1MR9U%lD=-=X?B}g3YrzR}Ex4HMh3BrrK-W znmQ;#r>(r2;*x?$rFWL}+cW!Pe=gmgx(V$XXxn~~{Or>50-E<6wx?pV5A(9t5o@YJ zRbIEV+8dKK!W$+<#gz;mPK3GMx@+)1{A2to>eYHS$X`r;Bl5d270zIJeLEbCi96tM z{!a2UyajBevLd${+htXEh4k-+D|7RT%NFKVYTbMfNyn$`-AnS1^PGjOnw|T|YfY_v z_mfJC%Zf{DN^@9f#nt%$`({Q83ToMgeR+`lbk(&Jb>-FMFN{=IJ%lVcb{~eB^^0UM zT<(!TKD?rQ(V7Z=J&Wyv!rW{^TEQIe4eBdD@#m;V8Pht~a57@dMO;57ZYi^Z>#rG$ z3$^-Olv~MK)C;y-P#&pTi>?;c=2aFK=t_!?smghjw4CwWHh~`_zxcDXxb!%(CrD3{o+3R>dWQ5Y z={eH#q`#A1AgwT)VSW+$Q`iirmyo?odWG~V={3^pq&G-!lHMY{O?rnko{2?%hWTCc z?&oQ7={;oclRhAQNcxEMG3g(qPe`AVJ|lfj3fdm#FOXMbGn~}+f0ESpFG*jKz9xM` z`j+$^>3h--B>AXg^heTd|4fTZKOy@U>1WcvNxzVOCH+SFo%9DuCy17uSCY`zyr6oM z;k7uvxJ<~^<%;eB)M|uH{ldRSdW^caB!%1G3SXMj{?_QVA+1MRpVXGrjwHF_80HjY zsl+s#+9T^gQcOFtRZKgv?MzA~rIFG}T}Y>rWHZbe$O^C-PF<00K$6W3*>)p!Cv8O9 zn3PHCK?=7w%$u;UIc?t*J(tvz)Qi-c)Q2>Udexs{?u)#`muYdSAF}?W0VExh1KAED zZAKbQ8bZn?MtVUbk~O*9ygvDlT^!O#VqeFX9G$b07ZA5BWFQt_y>B z9GZ|nit~`-6YO6`ejD;F?z1VngIXtCPQ^EA{9;wi{!Q2q$7@AGyxvdjzXbiGiDx*z zqZ8skkGcktf-$M{&`{DA9FG+B(pWgy|24Ak7}oqc5?Qccb8UG4%7pzlC+uHBd&2df zOMY0$-XjV5Z!NzT=YTSnjocY7t>D%~b{;n$IX&es-XteiB2gi zEJx>dQZN>_r2nQ>M!1pVI9tIwwsl?^2hXo8uc^o>_6mi|Y|XxHNLq(zGv4whawY)V zl7j1oiMF4v_Vg!_pG;atk{{dIe!9WizdiXKY@hZ|fp;VY=ck?EsiFNl!@Gp?yTa2* z!FAGZ@N|;yjmzE)cqU2hRepE2dyrD;ceQ;_INaX7$WLTGRwNiq{AWh;J1sh#?7GBX z_j93g>Mx8LB4Hy4G)M4 zwha!eNM*dvJal#~i%jF1EzV{x@*TX3q>y6W*sC)#) zN+YFuc0~ZfbrqxIUvEV!7r>f}74wBKw^6;*d=4I#kXIjQUnyIT$-?3i)=T8e$g5wp zuN>xnW?^nsb(}91$V+n<=afYvJTB7}`p$Y<;zcOz&%Wq|Vl#FukI{0xXKuw+ZdrLX zw~Fm?9M9f#3za%6DWkfTs^Hb17juishcJ}A?$K>syT5`skZLwu`Y-=nemZq_qV8(8 z>Rb6y!#11`^M34GL|RO$CGAf-fOH_~Akx94Lr8~`4kH~-I)Zd0=_u0CB-wBMbDEQp zkp6}|n46Zs;e42nVc)T&<4E#hDd~9938WKAn)^;7olH7~bSmjIlG=I(=}eOBFQNW3 z6Vh48!(%0!5A)gRokKd8Bp=Qrolm-ew48Jy=_1m_q)SMbk}e}%PP&40B}rqk!@tv< z%!IVo#(>V&`Q>HR#q(=;u;85(mr?fu`g|bsljh1Gzc2X>LisB4ItS_#=+u}j$nTnv z-_i1GwLN7#!-#K^Gw+u)rxZVR9o3U6$$wV@I74q2KI;U?N5yq zR+pAnRc}{ZSydfmrk0n@k5pC1P7nz;Zp6kkyBDpq>rLeO@1>PMUTscs0r{KZV2yVR zTwbZOAJ3*k^4s9>edw^Sx3jOhygIie$L@UR)vGdgnX}1{xev|RG|Nlg#3pI zdHEaG*ZtCgq@esW33=Ubazpz!!e6y7&>u=(b4!pPNPaZ=V6LfPZq)sZAb%Ell@IdQ zlHZIx#k^1S8eOaJsRtG!WEU}6;<$Ea4>G}4&*t!M^s)GH=eakVc@I@;std>XPmeV*vU=wK zqN3vbqMUqt6ND31PF3;#thtIyi>vKAASCfG2~f{3;yHFM&*O`$Yopf*jLDF$m*XL5 zys_v-h7OOM{1QFmt|}=mi{!9A)M^$?0Anrm@xj=$hQS%BU(S zugd@@zDM!U{5XuDYE~`(Eg`jR@%H@mJ?a5 z3;E{H^{an6YVeV}7A?_R3}pOs=fqa&{1F+(ALmLP_szYh6qMVYa(yWGDs9#nR(cH% z_7|{!IIuaF1)h!_yUTVHc&bep%c_dKmnI_n))e!uO++tv z*gzZW&S{DKlnHm_BpBz_G4#0y2%8Q`u_V1Ul@B&I>A|&kA&yGNL+x zUl(GaH}W8VX+mDlS9^x`UrT=LP+rfH!uwZ}*SrevQ_&7 zJ)1!WR1_DC8|->_TiEK@88=Y%y@}LyWAH1sbfvT1geg;Zo-lLb4*1Y* zy?7sjwjV)(40Ltg2>c(9t~hANpLJk(6G9H}vPJykV-9}kp1GcHX`BXmJ@?W$uKO-e zPk&Acz0nht89;+HFV!t$MHtfq2D)2~b4Nz&(fLkg0vp4~tDl1WPUQ8>s=BxUpeg}lzcLH_at{mC4F@_#M%r@!*{j+&gRNVVUOgWINi*D}vjcTZ9<_Gx;GRPl4V|)FN~Lh`kX~cNBPUorcEEUHGiEs_qf!SZe7fDf+RJ(R>|{LXuNQ92K;* z>b0Vul@*&G=B4=a)E|HRamd>4yXd7yBvBNlwZuFLpNAEIj_@a znh!MxzX31C-(vVl1X{Cj4#SB5o=0vWW5X@a263TURt9b#rkOAxtZlCUr z*`3+8r|f)HT2o=gRU)QagpStt^}NLFa`#NrL zSGwI+RZ~$>Ua8mLc{@5%re~rBtE;USt#diIMe>V@9k1_tuNApWe~s13+|nW4d*(2S ztem=huLa9AK1GQmc1Z~qnkbf9 z6OIkFDV{5yl7hrbqI!2Vtp67J!N3d4AHdcw<$Fh}%vgBe+mxA5QW9Kld)MCYgnW1x zUW><7++x(;#ABlNUWd|h+3nB$-eO+kvVqZ`r`y~e;GTFVf1USSM}KbAeL}@P$PZ^e z*E5wMza{zXP=0IjeG>Az#t8IxNYK~$O!x1C{kj*Y^IeeF_1OQh_criZ&Ho?&H9`oP z5W-chT3NM{OjfO0wOBRX5Te$$+O)Q{ts8`-2q6g}6rmX1ST`s}VHiRPp$J70LJ0ro z>zwyzJG;vF%hzw;-|zqU|M%$GdA`s6b*^*sIiI^r&pQ|EJs}vsYq86Nvh)-unEzhk zmea8hF87JWTqC1&JhJlg$Bdw10ST|rCZ_4$A~c^{hsFm#>vy&eH~puG_{WI(cScNC zLQvP3TYg_+l??>r;Pm|>=C2bGA083ci&&rH;QEe=h?VvTPH#jUJZ4QI;(X%ZxiN$I zIQBnqmhs3fERHQ8`Geo}&!k;W4t)MUh=bezjX1b}mvJ#`y4{aBl{2!#!wd6A zd3Qdg>chO;gxQDUtonyXS357Ku&mN$|E+7#s*F~qdU*2L$1Nk>7@sA^Yc}l9!iXk_VQu%zOMbQ>Foy7 zecl(%PL#3_I5QuPi3x0X6x(&reiyrEy^AZK^}37q@^AXV=d8Z7{*}|JKjnk-ZDu}u zjQ2`ryTNInG0pBV8Pr-M@#xk6CdbWd&sMpZpR~yvGisQUo5RCdetU)@JNDrTM@D;j zq5q9EbwQzWB6G(2t<5$B_du*92=PbDdI+fxQtlW zxLe=L5%F5$;P&1mP6*7eSkwPT9%bkYjw_3KY{A{OcQCR`VBH_vwkq>onHKzhwz4cu zQhJkZVdp4`?!xNxd|5S*w;HZP?@b}N9;JV+{HEIapJRKybBbua%6-?Y zfqBZf%}gFcMZF9z8AZW$e#JWf?79rjr|UAdxh2e%*>X{Sj$R+IjC@)RW_Vea<8o+3 zO72d$6YYY@0_f18cb7q~OX0KY-lVjvi|@jf|L)58 zwz2Q-TG6peqwGU(J<1RdPTS6WiuIjq{;w@|%YH+=1Ni6hZNzk?Lxby6`C-+zdf8W} z`XJN}ajil0z}D^74Tn&uL1oX%(65478TwO)a4J=f^5@Vf6_8M8gl{^hxUx({+tU*{ zCxcx2y-c$dQMxL)P<%nb52Yt~dhV&m`tRXgZP=Tkj?F-Zdj4hFu!y1Fv9Gq_9Sn8M z?q;a>$R!N*uKpTB<(aX7|_`&kNpTN|bCUAdFe z{;oYu@Vi*e`YPMg^zz$6_sT06Q|#*Z2FDGo%p@3?SD7i$znEvvs1dxE1lPNZ?FDA) zOYPWPYB+N#2F7+*i$`n3!+!kCGRlk4XVr7mwd3)IYPUlZykD5dorkJtWaTVliqc19 z{Ti6I8~@Fy!TY?|mY~qD`%767mDafaW;KZR`VTmh&!Dt!Rl~slx&8y{A0O?Nlbpiv z6t+==pV3P{yH=wU*xm@XcR9ya??!v(Vg}o?lHY9eyEdjSc5O_9_l=eJRo|Vfw-=BF(ST@K3jH?}3_CQ?sSDlAJ zKZx;LST@MPj8i)N5I7VLgX!$I&heltZ60$X?|=dHz8nolfZmPu8MVV21pP>+4Q06? zdUrk=^m*%p^6}lZ74%~nKbvKP9LKl@a6IUpyQa^r%KTNANy0-u?_c!A&?W4bRrO)0 zd*6EYKZoJN92li#0(A$ydX>TZQWo>LdX>TP!x>KnNv~dIaQukM@olR;<4)wb`14n< zR~cM3hh_cGMtYn1m3N}=y&>-MPgSo{`51$lSJPCNEzQ-dQz>+MtK&Q z$;veL^NV|uJv^`=#d@(Ifu*`MJnRBDUUze+ZE9BaXLAhOYXRC9aS}ez?>*%l>dttn z@ftiIs9aF3`DAEIL;t(gyJ$D|$Hj%jHT?cwEsxR_m=`zl%gbH4(I`5E$f03)IIEy2 zhn#ha*<3-ja@+mZIDQsS<-Y5^S?|S_Wp*z85%%90lS> zN#wglqX0*6=ZUU|GuW?g!oyK}HNvA#za4iFuf76?!|6>al|TTwz@_gI?ytVY8*;%XIZa09l}g++|;kb(}*Fr zzL34%RnC&kc%@<8^ya+4WHOG^H00Ot=#rXBC65Be>G|g7^QYO`I)qgXBs7hAls>ms(RG~+xD zdMra1FCx}C;^I}r`mSAE5fQ&nth|fA`&U_t?Y^L@5s{`<|DP`huj%hiugf}L-1l%Q zC%5i%WTa$J@N9jljUzeGa+sRdP?3l#L0(4`^oF9gvwm-DJb-e&;#|J~%PTjIBX3d< zw5lc?*%V%@fd_YQt#SyBZmBY-67ixj6yQ=m+e#NZfBO1b<8Hs&?eEuBad8*omdxYg zZZ`d|lo8Kr;g=DUQCRc!2_ovIl(TK+eNF;yn}54pI^`rkKj8v~x_;dHl>ejkx!C1R zyZ8mBsk|V&xqp3j!}UyY@jzVHn~MkGy2o1z#7heX(~8QM9Z-024@$Ut<@x=#gyQ+W zf@#SbJa?<5*E0MrZ@fP5V&bAhWNC#yT;k{%V~_x1Knb z3$FK`{rozRZu;HCO1rxFCgS#i_(o#AE4b-XEdD!rv`R1QPuEOa+^uUA>pGorF3u(H z9Ei6Qt31w4@5?n5{4D(=;`1Wn3nSuT5%H*qxHuvn9}!Q8h}9N4xIbzO9gJs2#Ir2k zGyP{dh9vvKiGCHiqE=oSu=2D2&a%3GXd2Vf>zs?)FqveIx?|IbG?~t)J=g7}Oue*D zt1&dI@q1r7pGwii7qrsjaiqr<>FI_JN%7x$49O>u&%_2b$29g!gQS* zZhNOk%+rHdpREg}R%*;n&Z)AEy>t^vLGPMg*E%}%E_@7Hmrgld>zc0nP#BV6BK*}E zv<|JyZ6l0pT}dzzD%TS^gC-_{w--@++=tq;V(pvIJ8cc#hrF~;dTs%oM|ialYj9J3 z75&zF2jY2sbem{?R+PHzd`Q(paPd~IX~qBUFE2mrRZF7)!+WC&tJs1bxTrCfKeFYp ztZXW+xOH~_)9Z@2C(dr~#gufkn_u;t{cDNBk(Rujj-Z1|URnJbaJ(q{^?fSmU(NZ~ zh#hvz-$>e7??=reJ_KJS*XN(Cb4)=duN#%?Sk5|Qn7`(~kjfmb(EPT3x!<|A?|=1K z(ji<#@z5|DLXRLlH8L-M9HmNB$qNq~Ga}|>zns>s`*<#x!&$$Jk0n+*$i?Rn>$tgC z?YV;UE8i?Qzw*&_e{l0Fe=0ctC&YS}tij{x<*R#*RkGB38u^`k=8M?oji7yV@fQ5Q zu`fk5tVy@J#1q>2c~W_{FMsE`e5y`Z{y4;;1YAS?b?@6t*^=G-hBL93s?ahwi>5k7 zmo*Pg$mD#|GI3$OjGkY)eBLR3eftaeBHcQtFiu_)@1KLZ2P(bi;tj;Dh)=Wq(7YXR z(szZ$+Gy|ef=e&+UwYj--(j7)ht}YC@7+JW=Plp-HnyjG+Rxgz|H5`FuUwbi_HXi{ zUv2N_MZeEbY2!?WISgH1H2Syxs$NKKv8oY~rWyXvzpLsr>Yr6SET_0A6nqA&UM2|& z@{AxkwIW=;9P& zmG!!~7qOmaE8fqt#j;wy2JZopSy!PQr}_8)JhrQRO&3qaV*>FF zco@2JesPFAo{NaPF|AwvIGuMz!TFLI-$NC1>DN^~RCFhHWoA8aSC$i8rYGYEl3(Jz z40}C^51~Jr;{4z|s#8qGmi$6hIf&So7r3!1VXZzmgUjd{9gJ0HA{Z}Hvzr#~L=bY31e2vw((tdyA zIr+~|tvz;?5&UcIzC^CpGZUk|egld*cE<(wSI-%h8Sorb=2m94O7bqS2I`SzW8U|y z-pKU;uWZ)9dDt=9dr$SJdo|uQ1NDFZdWvwkGTYP-aXxjL)G?jEGLq{`E^(oc;66!4 zcYC&V7W@Ct58|ITCiT*1-sU-u)7hS$(c3}k#NZ!?wkG$ZTAoj38)WvWekZ?u@MWcR_R}x1>{CbhWa^Zf-W|PNdOPzj+aAF-T{(e^T{!`h{?=brg2@)E8WCxl z;s1PEs;0jP%lF?iNinRgQV?xVX-^-w_8pBUuT=L)7rU|>7rU|>7rU|>7rQbA7pL;D zR$jA<&yR@jiHOUI+c5wCR++?^y0P)cV>XnEyZv@$5-xUS5-xUS5;gr@j>{?ZS}@0T z^RKCM*vCWJR~PI1Q`%-|m+E={E_QkUE_QkUy;+Z3_l!PxU*N0o=*_`MBi2FDaXAYQ z#_Jf_k8xq9Y5D#*#ln6^9Nak7!+mB}TQBd445R{U+^;+-DlueK>zv}$WWOzWM}~Zq zP!dCKrJM{6&3+v+>|`9W(8(?uFXlLAcUXa?O8k zM0}pb?s%L}9NAX~xz66_qkA;cgX&_|wLTg~a@2L4VI^pOftV{}^BPO?TQzj!;U6OY zCk0zHGN&M-=MKuyvNA@xdbM`oa>;5Nl0g!p*iFzDi-u52r}dFfc5HXQUyc}tI;PDS z>RHu^q0W^v80wmL$8?BIcgJ=tvFZfgWW)J3-RpCOkE_1T2Xjm+`|!i9?qs#Js@j>1 z&7rr4EJ_2dGm^da;Wvc&^vaTaQhRvb zt)CZZpqJ7vMHx9cmC`3`1P4lCAl+wLHO*U3<$|ob(!D8xMVS_eys0Vaxx*{xXL_}` za*n`KHjj4sBi5_;z~FSf2L|KetS1<&Zdowadtxxo zj+mYk5nmJ$>%B6#{K$wnHzL-1r!}|vqxKm(W2*jY@R?VwASBFov)OEaE(W!Y`FDSR zAjIoH}qb|8@*q{E9^J!_wK>;R>M8m?+$uge&NV`me(JL zEL0F!*Gkr(4PqfmoXKM&5$tGZomrfS~ee4CT^66V$Y$<5os=5=vP;=R{L_sU|^i-u6CHnzEn zro3F5*qqGfZrRgqU6sx2RdLhLC-553rSI8Kfh!sFdPC3`&gZ5I;vNt6P#OE(Kd|3j z*jDg!oI$MjQ@1a-5i2jk#Y>1!4#ZDcZ0ClTkr2++k6w|ID)M&Mduh)q@=EW*_E-pW zzEPay*Vdtd&*|YJK0-#eK53W!-Fo$koFPtqJ!EH%DdblcX&{x$uV?u^Km6GmHNSrI zFg=`^GkiGRp3@tKwKE70T{dDgs4D~!uV5sMKXNKDE6pQ=X z@N9;<{ZpSmGN8sd{JJkey5Jq zocjN$b}p$saA2CZbme`CZ3NFdwLJ``af8#8#{K8d+dt`~QaN6Ed-fMQ{Ve|)8o++3 zY{SKBTcP9W;zq<_;>tRJRZWtu!fv4IysHq*afuJXcr)Qpv2NIt~Tw|Zx z%RT#hC4}Fw&)Ub`4E3%umEj16eK-cXUTbV${S5im=><7n+O}Q)=#bL2$8cV#9LmLN z$D(``_k6Yn1zsPyD_KVA5Vy~+@7ms#y>`<_HOsr}ehHuHpMRczo#!0*X|qtR0e+c~ z>bB?@|Mi^o$}`VaN6&Wjb2O3lC9xj2-UM9h{?FH|ha%Y$(o!DU}p+jdAkSHq<()pBT7SuEhU) zpM#u~Oz)?zLhR7K69=bHiI}c;)!_82Bc@*y z5qFD-l}{90{^^MIT^lj|I%4-u9b8WDq`?dmJ&}Xc^*pY@@4_o93;w>-%0Yg8oNGD$ zN;kN;JNv2Uri)b%D;S?h;zaRZy&t*ts6Mjpk1keSg5Y|S_w%RM;4!FHMn=}I_e?4~ z*DoWxjeXOz(8c%Sy6?Jp8LoSii)(XSg7eoS4$j|%xQ6d#)jkh__j#tD=YJkoruTR9 z6|UzTy*loLkR&)}!w!_{T@9oPG`Gou=2|dFQ9tBHCLd4EEEhZ?Nr#f&Hmq ze^e*PeUGl})_tDAR5nt6l8av_?h%M*6RUomI%x|Rdp{jVg%ACHyne|uuNn1^co+=N z%^z2_j*h%k>HW;DGoCnj46}&!d~wtBEUxKe<_cwVFQ{H7>ta_X>ta{_=VDj>=VDj> z$4B{Fe^mvwwpi7ONYf1ee;KZ|-Ezm>m9x6om9x6om9x6om9x6|f4iLZ2Hh~cFP6H$ zxZ5vR&gx=U&gx=U&iWU!okBB*R^>and&4BQse9Ak?U!sF>r!69R))%7aqC-R>vQoc zVwI`5_<1}Wh+n{UFNqmay?oZiu6)+T+$a;h8xtZxH-fv>aEPfqu=8;ocEn->$sh9{_)|RjNg8kMXc{Y&)qw49*ouIR~cgPT{n0fMzf)Reh&`5 zH3WWRN>Av$u#A>7F=ATQfXQGR5h=`wz zh}BP`@;u!9FI()FRd~IDdLLU4Zd?HBxfn~3$E;O193xp>%rqui&*aiZvC~1_5D_6#;M0>-eSGb7+!vGO%stoES#{#+k1e&Lc8ty#z8oN%<8R%PY! zVU-W1jfnQHab6KC*K;ZB34W%{#KH4!J8|$Be;YCVBjVtB6i@m#cwROmR+*>UZ^b&V z{_6XwTdpz79TiwlSK{D)o=qIQe<>XvJpa>)wV%~)nfAjWetxEYA*w@I?=&;B{XG3S z47n`yjPQTMutPXh$~e`7aMS#2+)u(YIkcAPI)~kKmo@F?*uiu?^WAj5Dtb*XDz2;s z>}F)1x;cKCft%O6#P%|4BJ=5(yZOkD;&)|u>!QCi?NcVxgZrd1)X9wFbPM$ecQ|Oe z`3xKC2T}C7^*4`k@&_2|ya~HM@1SKBsm}{HZ)D#W8*JGR8S44z=5uk4JsZ6@x?rys z)K|I4ud{jw`=Rru>K0YK_+%~zMf)o5!>#}S%6X0DRTlO>Lw(o5>t-9{bltdVk=IS_T>l(((<85&Sf=Z`ant|Rb(6xp+D|v{ zpItY_%%|(d&F9+VR(34IwAsv~d?GiGU;nT}xQy}oZryk(luE19Ua9?O83PD#wjhQXSZ8E@;aT&`ZR3{ z!{Bx5V)y;0GL!PQU9A4Gbx(G&`n3xsJsrmG)Vv5;u*ARkq;fFK2o%UL7&N;^6c(#KGgE z`-Pr$Zhgwz4hLer3kA2Y_m^P2JR*J~B7V~18oQVL$veh?eE%K8y%V_Dy#u(|rSV!wuZB>u58rB|Eg?sJDA_U~wq4kp0xNMW1C6z8LuD?fVksaW{^2=<}2kFST*| z+PG!Jx~BeW+SBcq-b-{}b8#%O?y)YOM6COai{}yRzTo1O#7YCZ_!;8U1F`N?Jp%DN zHeH`lpGB;|b^QlFx32%EY@E_&norwW1#VkMF+tCC7dIl-^UTG4iS?{>aXN8u-wTO@ z`#zai`+91-liRk5Z{4cpi0`^~`z-FH7R_UuHEj~pxKYD|@QEiJ-{6m#^KP9w=dMRT z{OIaSw!HlA#S#AK(7-`meYB_UZed|8!01w_AVQ`Nj1=eE;iLFRj_}&a7pxF1_No zb#J}-_U7jo+1Vxub8*r1Nq1a4a`LFW3HkkU$KEjd%5j%HFlO*Y{Zle7 z=+gJW?f1X<^rkmndEvbeUi)&_J>R(cr~m0N&1=gT3O&uS);THkz4rE65LO>w#`x;z zG(9#le{k7n1M?J-xu*0)8|Dd~1A2b>&26hMtLKngf6;((`Tjgb-m*F=bYAG$q;)4OPz}@{#U=%oILiwd#@eJ z_Ja3XUW+=l2)F2z9Imm0WGQ>v+p+B-9G6X?vM3kt#}}=7qAqr6K^H3>sQXqhR=Tjp z_E_l$vQdM-fj)DbfA4>u?J8~L;tz4%hk|jVK>Q`HbHPpjA|l=#5$o6l=U+#x`~kQ8 zYZ37e#Nohn^^c-s>E>@vto%k7#}g}m(#6fWzVxo-VzqfXBoM3JWH260tY?awzsROD zs&bs_fNGf<{eG%thzyJ@;et*c}E)=r(?E>A<2di_elS5FL_7GhpIopU&paF{5$!m zdRJ4LR=k9}?{ySApftFPbBU7zvAb^Fbo~ZGFIklP=3A9As~54kvaA9CZ|eaOWs z6H~dPi|-=Vd#j6Q6DuFy#kWMvuQIscXHdCgaDCH>^`7sRudwMgdRy4beK7Iz>hHNO zcK1cMe;=@ax}IG8k;QxY5o*6E#H;V;<-3Kpv5nyO---)G&k?t-cw*fnT-=#h&+N!N zoRlm4YpoYUrA0XnygwJaU`>+#!fFI!} z*abhsFYqhuhTq_K_yhFN(E8V~{dE!4*m+{9?378>)7UO{X>1p}G`5Rf8ao*Ox6|0W z*!PP#d@hacVwc7a#*LWI#V(EQVwc8t@n+^#n%c#iB4U@ucGF!N+r=)8?P8b4cCkxi zyV#|%UF@FKE_Tm07rSShi$`+~DUI#o;Iqw*bI-OKJD>g}4|Ue$>h~QNyEL|oT^ifP zE{*MCm!@{{qkLwisa@Yy`*01pd-J|{uC5LSmg3_-p zo`%N+;+yd>9KiSFzGvkn1>@RG3&saV#0N#h2S>zpBH}|L;zJ|i!-)IPx>@~|xvsFh zpVf0gs_Kdq6{q<>(?{nNd6{)thFiVI;rK8*d(R|}#@#u31WpsxEFF`2f$>M;uD=T2 zzN&pz<$o6E7pLdCE;NSdZKvpevP*!_HB+ni2~e}=iF>2t?X@c(#q|c7$N_KZ6+pJ6 zw~m(jl%1;e3feq$$+dnOF)pHC(5o3wR$D08FX-Jiuf7xgZRRuTeAGR>75t|MP*s33 zyl&yDe)_Pe^)P-PE~_m}JLY|gz}{7@X9wrLcmFJ;hs=!D!_%{dXS8pVkTJYn!m!L! zPivPkEF&R4p;1ISxf~CbH}&#r998d2b2IZOukt@VZ~m+=&Cs;!eQCPb^`+@z*O#V?U0<3mc718O z*!899;{T*CO}FfS+LxwV{w|K2uFo2~uUJ{9-ry(z3yUMc*#`=zHdS6_d z)N=M?INMV@u;vW=d!?OOg|@Fn^*P76Ts)4!gTH%uEV1$#H2pZ-Pv7{zd#T@))_b+4 z9ghc}A14sIb?RB?eiJh|UhS+Ze-qPwo-)ih_pEA&yWge^E~oOh;BQqnCU)AHi79Y}c1eaC}q7yS`+C zDVbUPyZ~R;-^rb)o)+huyU(@6GjH+l>$*SdyKY6I(xo-)&-BXy{`sl*_uf0>*zPFy zMdyyvxc^_T<4}{wzj$2!xOBg{d8p)8|GoPeJMJ!ikyy`s7gyjaCvdUyn_?njmBqN} z@8XRjV$~0H)4#>_J-c`p9^Bq<#KG;=;sn+C>gHFh=Sk&{wBze;^ZVFw^E}5q#|M^K zO|0@6H~k>)<;M}bbd9d6M3)g09?mZV=~u-&g<@{^)6Xg&aMw|5T<^|R^DEL%t7!?+ zEi9vai^^Lp9$a2!3x0l(?y3GX_w3MbVpgV8Y&kcrEz?q1;-9DGiwo%#yqMl5@^tsF zV1IR=UQJ@R9>ZYVFc2?iy5cl?(9Y^*zaplO&N%)4rrXbUxLZe0M#eDxpP$oy-y{A{ z*|m&smC)*BznAl(Vm=EyuTyoQ&Cq5+*Z?@@`y^-jr z@6@cr`rS{s!!Pf3%YVWA;lT1LPmB%3zu5ZR{67-wIqBkkI3KmYojZ1J*g3Id=fs9p z)4DS)xUT-h!F^9B*7e}lH7a7d>c6U7&`qCAthC>Rz_>dZr)RF4=Rsm!vo2OSf}Y#K z{V0oAM&%eX1%b0UdQ{Dy6N%U#~L%g?$vHwE5>ObTzmm>@R}KE@!-Hb<+co`6K#p|$ZulUGMi3ftJX7W zf4>i>O9RUdWZb{_y#Ciie~9@RQW#IOq-T~D=tA0CB^SJ5lm>!I?h;`jGZTcsBJ#5UV zf+0D>V;ePX+NgQedWu<2*I&z)|8BXKErZKlYRg@I`M+E4^2>wEO|s?O=Qx`<_?_x^ zse|zawf*zH12-qPOfus%Ps5H?<8HP2+&s4t>)dehy%F(45%bTFm_Cj8kihbn5bJpV z$)^q6ISTgr?WZ-X+L!UHOZ#8>oc2%PH2u7-f3qLPZwsjhv1ZLS&hhJf>^s-bk9VKv z4c4Ku9v5qcy3g|H3UTZ3(tS!7Dc{PWd*rE{=XDrro&@|f=m6>A%GOB)4=E(b^L#eF$V78&}+m%Ii&Y{V+ts2sj)O=HouhPC0IC_IC$&$T-ogVTD};aYwnJy#^pNJG_9sP z*1{}HQhN_pzdobOu^2d@N6Q2kjV~_jsMXx|Q=YjC{o6i@i>K zy%fS8Q@mU89@AT<)0cZzIB*4MKmFgQi5-Fugdt>gS@_P;Pj5Ryt>AmiGhD zdEW0qH@7X?8Z*-ALN+I_C@YWd-*d+1uy5X{R2REBMc#g-k4?|X^*Y!2lP!7c*vpn` z^s96~dUWr+=uigVpXvgtE}@H6pFy$CLw7xQ!Mg(gyz8+W61+Z>iQ~ufuJ?eSXW}Ik z?RfP|_lj9b3{<~IbY~fo388e>ISeu&6L_3@dF>+@>O9K<)gvK^8fwvyepMJMecD&j z+h99<4d1{H_!ho{?_nqW06)Sm_!)kIUtu@=2EW5Se4%9wpM~dOHLQW>LEC?U;fqiX zFTu<33RJ+W@EW`hYvB!e6W)S#@HV^y>)}0kA3lH$@F9EzJ{K6b^^Fa0Eodkx&ng2GxH$2I|9cpgKLO1JwXdgcG14grPAs zf+i3H&7di$-cKx?1TCN?#6fFl1t){*T%H2$;8bW29pE%bgwvrDbc7`63|*lMBttjo z0o@@5dcv7-2J{BCZS4zv;4Dak{?HEwg6id*182jzFbK|v^WXwdy}%)GA*91l$beyx z1(`4chC>cy!$`OYMuF-j=R+Q-%)0=Jpb%6Ct{BF_Sonjl^Ad&^!vwe#E{DrN*F_O@ z+XsiM7&i%~z+@P}xTy@UfwS>*U>bfsdh8p(@RKUxDp~k%iufke*9o~dDU>&>#@4(xz9^Qrb;XT*@ zAHa?9F?0@8R3PP~(1pop38W13$wq z_!WME-(WZV0lz~O$1DW<Oz!$!~qVxSo`1=Zt=g_EEKw1hZl4XvOJ#KXzZ7P8{F z#u=Utce38$#FxVr(3NprU?StMWjGCbLJ#N#DR3s70lgs=^qlPj`7A#Q3gAkXzgp{n z>);$C^-1eWucYyM5mU24jS-J|IhG(D*-hpS~TTs5w zYFGo$!wc{>ya?s+5;Sed^~dlPxEiLywQwEW3^PFcdJD{iTS5DJ8{7`FAh@qOUOHBH zGSt4_1=?3V`|pN(;9i&m+Sj?DeZ3#FuNrE<=fMN;AZVW-g88rjw9gMSd<3S!jc^mZ z3)){DU+tHUqmH50q0g>u>KMHa@4&AHgQr2%o|y@EL4|FW__73R~bS z_!73mHuwg<27P{gU;2FdK7NKP!0nfgnU3XB*abhqcknCx0++%BxD3*2@eG81p!}@? zpnlWOhI3#LoD1iH`UV^f7r=!u1md9$w1tVhpq|W7{jgt&pTe*`sL#O!I1M_0ehW7d zIzlIy#JrsuCP5dtinuGo$qc7JH#`}-Ll02?zUus_o{#GGT+KXZGE`rNy`c~Eg}QJ! zM1%J22!{1Q`*tM5qu^+$568fqbfhN!tnn5fy zhZdlHJBgwC+-(W1pf!Xb3ig40LHVTn!TxXn)P@7$AUGK6z#(ub90uty6f)o%wlU0x zSqw8_1Pq59$cB+{5sZRd$cH=_4FymHg)jz+VH}Kwi(x!m3YWlTFafTB%i&6x2-m}P za05((o8U&c8K%Q6FavIdnQ%MY26w)>5@2i}AA@BzFJAHoLs7(Rkcun|6mPvA4y3}3+K zuobqzSMVilhi&i;d=1~i4)`9vgCAfg`~*M3&#()Agg=PK+A`@nus z3)ElR{%|1FhJ)cCI0WjzVQ?rM4t3!Oh=wDf9vlrv!7-q|-j0J~;dp2OC&CHP5W>(H z8bK3?fo9MYnnNs{1T8@I@8X~}D1SX2hCv2oLKX~%5s(cza1ki4Jr_nn9^^v-jD|ue zf?^m0V__VOhl@dd#i?(#32+%)4p+cLxDqD8RWKQ*z}3(O+QP}u4o-pga4ICgY0v>q zheYTIouD%$K^N!>-5?pdLl5W)DbNeffHOgT;q`_-&==C+Ea(UQVE_z-vq6nMqF^7` z7iz(Nus<9Cwc$WG2o8oia0na6fr3Xkm!J@epcux$SQrQ6 z;bOQ1E`m0e8Y(FdOcMd*EJ}19Ra%xF6=h1Mna`1oL45JPeOO2|Nmq!9rLBi(v^o4yCXZ zmcepZ0Z+h_@D!|sRq!-C1G|pkUIo9vudo|_gB|cKdZf5upiWd17LqR5NgB0a1a~J{K6b^^Fa0Eodkx&nghNIvZ zs1L`%v2Z*zfD_>aXb53w42_@(#6UA>3e6!FPJ$ND65^mWw1PGe4<|!gI0f3lsn8xy zg9JDoIzUHAgwD_jxE`yLOR?9Lv5JBa2RAkCX9gLkOSE;5-x&KkPG>c2cw|?il7k2KrxJi zv2ZbrhfCoSxC|!16>vFR2@~Nem;_T`GF$^!!?iFKu7~U32ABpn!HsY;Oov-w2HXlW zL7z*X@ncT2xeVvP{cs;V0Q2A>cn}uAe0T&NhDV_U7Q$n&7#6|fumqMuDJ+L&@C2-Y zr{GCg1uNkhcp9FCGFT1I!Sk>NUW6CmB`Aki;AMCfD&Tc^4c>sY@D{uYZ^Jrx7v6#Q zU_E>Q@56_%0X~M0U=wVFPvH~z3^v0T@HuRSE$|h53EN>Cd;?#@x3B}ghwtDA*a<(u zkMJ|>f?wem_ziZ$AMiWW<~{j9I0z1gI&cUa3WtF@#*Bh}U|*;O`@#Nj0Mv(L;8-{g z8o=>T7Y>JLI0EXykq`^bp#_`-anKT4L2C#@LudqzAqJX2Q)mVWa2j-g(;*Q$LMP}9 z@z4g^!pYDMPJ#AtDx^R!I0MdvROk&!&;`0eH%Nx=a4wt=7r+oW3;M%AI0v#J2QGq< zkPD+A5AtCsq{A@CfK14O;V=T8gr}e!UV@k56?h*$fL-u2d!#!{>Ooy9c2HXNO;a0c}Zio4>03L=% zpadR;$6z7Mfw^!W+z<2M0eBD|f)(%ttb|3d7z$uCJPyipQa;WTP(fS>MNkZ5U^T3V z_h2o&0b^ktY=Nz?4K~6ixCAbR&tNx6w+ZBWI!fl!EhJ>*^mPl!AQu3QIH4uFd43b zwK05NcoW`&b?`R41Mk9mcn{u(4`2g)2p_@6un{)FC-5n3hR@)0_yV@TR#*nhVFf$^ zPr_5M5>~;}@C=l}v+x|OhBfd!yZ|pkIlKff!z)k$ufl8aI>eLiXajBGWM~JcKzle9 z65urG0H;GDbc9aO8Iqt2bcJq^4Bepz^n?`X1!usSkP5w_5A=mJI1Bnge;5D*;cPeu z2En;-9-I$@;R3i2hJY$dM!`O?FVuqlV1GCOYQuqW5F8A3;1DHpdS=5t`Nq;80gHnB)Afv2v@-*m;#gG8n_y+g{g2o zTn9J6G`I;`JOL}fA!Af`ro`z?k3|7N)@I0)67vTkX z3CiIWco|-W3V0n}gEwF;yajK<+prGag?HdRSPvh-`|u%bfREuL*aRElQ}_h7!B_A# zY=`gRJD9^ez+AWw?uU8s06Yi}!F*T%55pr+0*}IDun-o(Vpsx?Ln$nUWw0Dpz!UH! zJOwLZ6+8{kKp8v>&%tU~1JA>Y@G5lS-6{#XL09Mw$l(K^A1f2pA4IkPRc@A{Yg^ za3xHHt6&mLfyrXEr119M>x+zqd@4IsPKN3@^bO zuom8hci=r(4?n^W@HosNZ)Gmr2lvA~cmN)RhhRP|fQR7`D1k@eF<1zTU@M;PTri4q!6?cFqsXg^ zqD(M~GQlYF>!Qf3i=rGbigLgx$^oM&2aKW|Fp6@(D9Qn&$g_*03^0l^z$nT9qbLK6 zq6{#KL>oT=2m8RjPz&~h{ow$p4F|$Oa4^(?L*P(24C=z+5DiB_Jvb7Mf}^2690SL~ zanJychZEpL2tz|?1dSmEnm|)%2J7KHcppB14e%j+1Rujj*aV-zr?445gU{g$*aBPO zOZW=5!FKo>zJVR^Eqn*x!%p}CeuST37yJyrz^||f7Q+&F978h9RFfES@0UV@k56{vt$;Wc<2*1{X`CcFi=?-v!C1$V%ma2L#m zyWt+V7v{iRxF6=h1Mna`1oL45JPeOO2|Nmq!9rLBi{Wu7g{80zmct5o0-l1EPynN$ z5Q?A}#=uw@2jk&lxCAD^WpFuM0Tba$m;_hBWS9b1!!&>-@4&mT9^QlZ;RDzJAHqlQG0cIva39CTH8lHinc~SgMRa9sgWI!fl!EhJ>*^mPl!AQu3 zQIH4uPynN$5Q?A}#=uw@2jk&lxCAbR32+%)4p%@Dbb+qW4U(Zd^njj_0=?i2I1^H# zH}rwNkOpT#Kj;qwU?7|g=fEI17tVw8VK7_(7s3!|M5VvR5Ccu1DKvvvXbvslB#48S z&q<>qO4g}LgWuQgX)^mXR_@%6aYuX^blZTvudv$^W2Z!uSW^=;;=x4y$% z_1AZrs~-C<^K^W-`7k{6pnnWA&|2o1cy046ypH*Bysr5Oyqh;ete+8dsUV+aye-$q=SH1s5=Boc+YQ7d2-@Y&`E<8#bO29dwvum2EyzWJeeiTPppBJ;X^iR;Ootg#W$EAhi^1*fNwTG9^Ybq z0=~`sM0|&N7~g5$5Z`6q2;Xhq7!S?&k4X$(%e)C*+q@}W$GjO{*E|-lXWksIZ{7lL zV15!FHjl$&%v<8I=B@BJ^VWF0d0V`l`N?>Kc{@DO{1iONygi<5ekz_~ej1)?-T_ZD zKOG-no`?@J?}!gJ?}QIE?~G@fC*j%VUGQA4L;d?Dn8Zx zT6~)Mb@+7i>+zZ9)9_j5H{!F+Z^Gx8Psit(-;B>UpMjT{--0hPpNW^6--@p=zYSk$ zemh=fJ_}!Ceg|G|ekWdGJ{wr|GJgo)Z9X3lJ?x+J3-DUzC3tP~NAWu5kKuLA7vlBI7vc5I7vl}gm*8RZ z$MG2RQasjtDIRCO439Toj<+*kfhU+hfhU@;#FNZd;mPLD;3?*7@Kjvq?eq8m^B3^J z<}c!z=H+;<`Ac}Q`OEkO^H=c6<`wuf^H=eiI0LU8-z@Xj88O>@Ek4Km4Sb&YoA`Y5 zx9}44b@(FlxA9W*ckmVF@8T=X*W+d8@8N6A-^a_%Kfo)@H{ff{Kg8FWe}u0${}|t3 zz7gMOz6sxK{t3Rt{8N0J`DT2F`Dge}^Uv{J=3n5u&9~s8NBm>B6|ZIfC0^V7E4+^R zHoUI+cD$bX*LZ#NZ}0}@-{N6h=fih+toiqNy!lQ%!RG$~Pc;7#Pcr`rPd49$rJD^A8h_RKGggVJkwk|n{6J2=bG<>7nrMUWwE*1R*pAUTgwUN zYHK;sTx~BWo2%{RRCBe(oMx`JnA6SGHgl$V9ekF#+G@@=S6j_F=4!h+&s=Rc=bNi7 zXNkGmaxOAg+s;yRwe4JCuC|^l&DGYk%v^0h*O;sAXSuoBf>xNTE$CWvwGCZouC}4; z&DBKaWq zS6!o-=Kb+m=4!(}+gxqf=a{Q4`#f{CW1nw+K3-z3vh+pfL-A7cbbN(*2ENi<<@{yl zDvMuZo{g8A=in9QDxY6#t~yrh%vE;3-aH@QV6J*q8_f&x&E{%Lzr|d2w6>W~#CMoa z!grcqh3_&~-GJTZQ}NKF{`r3`Ud#MCyteuEcpdX;cwO@ucs+B~HK=c{`UefnRd+Lt zGw|9f$JzMNjEFZc#M_yxEpvkTSUk~u9G+yZwy4SGYLl8`uC}SE=4#uTW_~q3z+CN# z2bo`s4>ni(;-Thh!<%WYw!GQqYSWu*eluQRt~S2KI3L?%gXcS~@s|1P}L=2si$6*gXNnagav+BB~*SKH=t^Er5h z&98RA>&(^0d4svyId8W4)!uoFx!Npmvw76^d8dt68|Yo;sx!OW=23g-T95hXmD)wu zHZQ^Jn5#{CUGvBAdgcr9`sR!A2Igu<9maJW)K)###+Tx8=4!tjZ}Tj}6Kwo)Jkfjw zo`f^->J+D%t9|q!TT5tDSp+`7?O2c^N+5=2u(miRNlYKGj@p z%cq;GJ^U=3M zZJzJ(TyymoP=GV=`Z<_j^Z&$%$u^JL>rXXTyZ&kBYPUb#{8xOY`EU3v^WX8==6~RG z%tN(!R+>lQ^Ue3cOU(Dh7n#?>OU?JgSD5dQuQWdZFEg)=uQ5LmFE>93uP{FtUu#|m zUuS*@zTW&$e1rL6_(t=(_-6CN@h#?RzW^n*E2s3uW#M}Z(x2r9yV7S!x&uqb0QvR`^#QCbI z8^pP1^Tgn(=1uT4^QQO!^Je%U^H_Yad2@WIx!N*j;@Y2+@LU@ohZmT)#EZ>a;p5F) z;}gu|@rmYb@X6+CUpW=m`cKBE+jzCNoN41v!Drj}_V^t0Q}KD`3HW^T)9@1W4)`MT z)A3UCM0|yLM|`EZ+IN=W+MmvNxs6Z4E6ls#Yi*vc_{;<`?1v%!lBE z%!lHG&C~Ir=ELwzT;Ep)o@<_o7u!5p_;~Z-_yqG2_(bz;e6o2CKGpmpe46=4e7boq zKGS>@KFd50pKYFx&oM8+=b4Yj=bIPeCFVu=BJ*Or)O-xS!h9^g(tI3VW8Fuw;+G`|;5GM|Gdo6p5l%XUn3v$i=8xjz%^$-jm@mX9nlHj9n=i(vnlHhpnLmzCH!sC! znlHs?nJ>d zH-8SVFkg+YHD80TGk+dmZ~g+l!Td#hqj@>L+59DZi}}m=HuG2T9p)AIPV-msUFNUh zyUkz6Ly!CC|6073`5Sm`^EdH2=5OJ3&DY`e%-_cAo4ho3F=X%-_Rf&ELo4 z%s;^6%{Sof%s<2v%s;{t%|FJI%s1l6=9};o^H1=AYw(&A-5h zns31~&9~y&=3nBu=3n6j=G*XM^X>R}^RMv<=HK8G&3E9F&A-K`ntz8+Gyfi+ZoU(r zY5oH~%lt=tw)s!^9P?fHJoBIN`R2diCFZ~4i_CZ9rRKlkE6jh#SDOEUmzjt5bsjHdlW?bQ9lxeR1in7hsUs0~P`Y$RlSN}!D=IYOAyt(=_nqaQ} zjV79_FQLii>QiW{x%w8GX0ASlrkks;p_%6Db7+>i`W~8Xu0Dw7n5!?MdFJYqXui4n zCMq#kA4QAI)mKrex%wg#Box%xa> zZ?3+NHkhjqq>bk43u&{t`b64duD+4BnX8Ya9p>sQX{WjROxk6xzLR#Fs}H5nQvdu{ zUrM#i)u&QzbM>uM$6S3Z)iqaNOZCjv=Td$1bi9H2Fg$FYfybC<;<4sgc%1ogJl=c+ z-p)K5PcYBH6U{Helgvlr$>zCuiuou!)jSVRGtb8dn5&PhLFS|J!RCedQ1c=@)4UkZ zHXnoMnvcZ`%+U(Rlx%%LmYOcPxrkSfxuIc9Ln`@@| zM0}R{mH2G)N%$P|tMGZ|lkxfHQ}7b=tMNtVYI9p^uC});%+&^WrMcSTmYJ(f?izEo z%`G=q8{Gxy}8=(ZZKC{-i_vJ)4SPRZF{$vtBvnAbG7x|VXij6 zJI&ShcbB=^0Pi+eTj0<#|NK{*;9BNt8(iC5ZG`KXtF3TdbF~?+XRfxx_083WxPiIa z5{J#zrZ~o2ZHr^g)y6o^Ty2fx&DG|(ow?c`Czz`Za-zA~A}5)vO>(li+9s!%tBrE1 zx!NkHnX50T0p{uxYLL15h8k?HKB9)2tFNd`bM+aOZLYqfa?RC;RDrqrk}5V=pHkz^ z)wk3HbM-Mb(Oi8^O*U7bQ&Y{=_tZ3V^+7e=d?P;7d=oy){1be(`KS0C^Ue4?^Uv`4 z=IXnu#QY0^>I~ZuD-6;m~Y3+&DHl+g}M5`T5GPpu-2KY zPptLk>Kki=x%$Z3Xs*7pHk+%@tS#p1J8PS{`q0{8uD-N(nyXK(UFParYqz=j*a|K8 z&wur`Rm)s`Zq+tdTiH71YBO8cTy1CTnX3(LeRH*?ZD6i8wPAC$t&K5P8{1fOwY7~i zSDV{-bG5x~XRbE53Fc~xn`o{!xk=_~o11K|Ho7V1YO9-St~R@A=4!h;z+7#32brra z?_hJa>HU9LyZ^8}1h%BLtJHRmblv1 zOmU5^+2UGTGsbncW{vA@%^Ww_nmul`HG|w_YZkfL)=YAXt=Z&OTQkaSwq}*vZOtrq z*qUALv^B%rWowqX+ty5TkFD9}URyKHeYR$u`)$oU57?T09<((BJ!ESZdf3)Xbf9VE z`LEgNAX_ui!M0|lLu}1VhuWH*4zo2w9d2uuI>OdWb)>D?>L^T*um) zy^gargB@>c7CXV#Om?EJ+3X}+Gup}a08X*L$Eo%YIL-bMr`v-#!~O|p+CwMqu)lm zgPU#b)@Zf0XR{sa@2jJ~ z);^6=TRVozZ0(mQw*%~>tFSl1mG;KC%H9N5+d;U--W1o`o8dZpb6jr+;|6;R+-Pr! zo9wM{vmJt4?5%ODy$x=&x5e#tDDJSg!=3i_xXT`cyX`RCWAA`_?HzHSy%X-Y!|{N< zGaj^e!9(`0c-W4>foDga|GVKJdv_dc?}0IM+-lFjZT1Pc-A=_F_KCRDJ_&c( zGjX?_hI{Ojaj$&}?z2zD{dPJYuusE-_UU-YJ_8Ti894CV$n*b99Auw`gYC0%h@FW; zv3}jm!r}HT9O<{2jic;r9Bt>|7<&$mwddkEI~T{>^KgQF4o}zndeJyUWufwf& zIc~GB$L;nFxWm2?ciI)W%f1PB+c)DL`xe}5SK>bVR@`sjg$J;nhxgzizrF?!+xOu> z^T>1iejH>k#ldzh4zVA=q4t9~%zg-m+jTg?UWOy>hjEns2#&Vvag6;aj2?#&uvg$r`&pcAKZkSeW}IiQ#QFB~ zxX^w97uhYi*j|N8>=$vVy&9LJ@$LJ*M1-O z+1h?99TK>{Qm?8*`MNIyBCMppW#sZa~x)Wfy3=S9ASTn zBkiwnl>If1w)=66{SA(_zr}I(cR1c2zzO#EIMMzAC)q#ZWP1>&*gxS^`)8bH{|Ber zLpa0!1!vm7;%xgjoNEu`Jo|T?Z~uV{?LTpm9oU2Czr7JIu{Xx0_9nQ@4#MU3rnti1 z3|HEl<0?BCSKC|Q8hcAzYj1_?>=0aUZ;c!5ZE&N#EpDD0?D~wqtROeE^QNC*e5zKpbz!;RO32 zoM<16lk7uqvK^08>_c&?eHc!&569_t0?x3Hz?rsogJ;`E;aocr=h>5SzC8sO+Ea0n zorH_+X}H8r#-;W#xXeBlm)pnT3OfZ?+Q;K6`$SxA&%`zM$+*@&71!CP;d=WF++d%H z8||}klbwm1?JV44&%&+tY}{sN<90g-ci3}qr#%;U*}1seo`-wvb8xSHF7C7QaKAkt z57-OvpuG?e+4*?bJ`V?87$%h`ktx+S(HyW?z8AZS4e)u(caJ($?`Gi}--^rZ+ib?!fW(>o~#g!in~~ILUqw zC)@Ai6uSqf+8^UI`!k$w_u<OPpzcg|qFiajxBu^XwmSzCDBs?O$+_{VOiEf5RpA zFfO&nkL7ue^=GtwafQ7fuCgcL8o&JvTx)0IIy(#3+p}>qCv(Ll*b^#u+7vVv>5D(dl@vwb9 z4y+n^4qt$S>>?a&Ux-8Oi*TrYF%Gkfakza6j<7Gqk@jUc%3gw_?NS_LKNH1s+g^_2 z>?Ryv4(wGA^~-ahd%JF1KIB74~bm((b@j_UpLXegoIoZ{k|J6W7^q z;d=XR++e?h8|^OKWWS4>?e}nt{XTBByK$TS0dBWH#2xlWxYO>zUG~Sg+x`Ui*q`EF zyBGJ_pW%M{b39;wfd}nAJY;`~hwVTN&;J)kp8p%+AbVpRY;S@?>>wO!Z;He0&2YHA zIgYS{aiqNkjpn)ItveY-w(eyV+mX1$9*axu zak$Lh6PMdjxWe8GSK8xomAyBvwxe;4y$`On_r-Pgez@L_!43BQxY3?~o9v0W*^b36 z_5rxno`l=%197_@hdb9`y`xf&%`Nq8cwxO#%cB`INd%KXV~dD(>@Jn+o$7P`wX0C zXW)GMOk8N6g^TR7aj~6=OYAIMYR|%D_H0~kXX6Sx2Ups2aFsn5SKGO`#-4|3?Q?LQ zeJ-xI^KgSbA2-?yaFe|dH{1ER#V)|D_9EP7FUIZm`MATr6nEN};V!!bciWfa9{UR1 zYcIilb}8<+ufzlPRd~?88V}iJc-X!M2UOI$Y**tH`)-_S--FZa zdvUs5gEQ>=aHf4f&bF80T)P(M*$?1+`$1f2KZJ|yI$Ufo!zK2^xYT|Gm)Z5W++Pp;gZ&I{w3p*1y9qbjD{zbbEN-=*!)=xW@ufjd{i@4Wbjr;6Y+;6YJ1NKXJ&|Zs&>^3}Xufu^gBhUZ! zILLk(2ixs9#C`>b+OOg;`!yVHci;&7bsTBGfurmbCs?8&(*f>K-bv12VHCHE_9u( z`_T2a?nF1(x)uz+Dt^3ir4D>u&Xst^3u(w(eL5UK)A+>z;Lxt-IF2 zw(eVp*t&BaYU|#0n610l;kNEyN7%Z99ck-!R+OzZh95ly75(F>&929t(#wEwr+lv+qwZ(Ve1B1rLCJ_Rkm(|Rol7|R%7c% zSgoy_VRg1{hSl4;A=Y5e!j1N9++=6tW;+MB*t#*+YU}1$o2{E;?Y3@^b=bN=)@kb| zS(mMwWZkxIl=axUQPykgW?7$o1@5<(-~qc7587AaAzL@ihHc$A3#=V^p6kY0kgc0% z!M1Lmh1j}*7HaDTT9~byXyLYQqD9!ckrrv|Mp~4un`zOuZl=Z9x}g?p>xNpKt($7` zwr;8=*t)TnXzRvWlC7I-$+m8;rP#W`mTHfCi08b$Cr-DcaE84X&a}tlYxNsQt($H|wr;u=+q&^qV(Z3RsjZuDWwvga8>rfxY|Ah z*Vys6);<*1*@xkJ`*7S~C*Vd~H|3h_BXP5R6mGE-ajQKUx7ky0yFC?m*h#q4o`$>Z z>A2fI8u!@AxYs@g_u0Bx*Kg~F-GHqdc7wKV+6~#dX*X=^#$BLoT%2vs!@0I@_T|~S;g@gghF_trn|?*M zZu%A5y75_TOK`niiW}@J zaie_|ZnCe&&9-g}w%EEg*lJ&o+icw&Y`1lTu*233!cJQ^3A=3F_v^NA!#(!xxYw@2 zefAx=-@X$M*mvPUyBZJKcjICE9voOV^8CLS2iY|^*uD>k*!Sa5dnpdHYjL>!0FJO9 z#F6$xILfZW(e^SNV?T^z?MHB&U614KM{$Dv7*4bsaFYE5PPU)KDYot(rrM1-&DKrE zbo&{cVK2v-b`#FFSKwUxS)6A-hx6@bTxhSvMfUT!*nR<**e$r!UWLo-7je108dun@ zxYAyOtL&F>wY?VC*loDhUWe=K^|;>F?Z^gOw{mApb z7zf#x;9&bw9AaOFL+uhAW?zoO?JIDEy#zv6Ju15UAT#Hn@#PP1>q>GsVy!@dP)+Lbulz7^-%x8XedcARfl;X?Zk zTx8#gi|xB`iCv9L?YnWAeGe|T@5L2%4X(8B!&UbExY}NdYwTKFYd?VN><4kZ{Sa=j z>u{sJ3^&;i<7WF2++x?`R{K%hW?S;DufRk0vv}Bk4hLQydHy%!AbTYawx7o#_6s=F9{VTHe|sDbxA(*mb`*}Z z_rg*3cpPo-jbrR+9Bc1`b54%@mP8)zSS z{_Boxkga>N!M5(ohS<6<8*1y$Y?!Tkv*EVx&PLd}KO1T54sDdJd$iHE?$XBCx=$Nx z>rQQ)t$Vfcw(iy@*t%bvXzPw`lC68T$+qs=rr5e~n`-OMZJMonx9PU--e%akf17DX z;%s{?&b4(HH_z66+$KzJ}P~2u8hTHAKafh9N zJMANImwhDewvWO+b|UVzC*wYQ3huY3;sHAe58Bi4kUbp_+ehQTDn?GWt^35$w(buws9H-d2cbsbL?s1x}`^V|F?jUE_x`&);x8Q7h70$JFCppj7z2tmb zcasZk-A^vEbw|0_);;ACTX&U9ZQWNcvvp^=+}6G23R`!VD{b9huCjH9x!Tq}<{Ddf znQLv`XRfn#r@7wNz2*kH3pd*D;wJk&+-$#(TkLM!YJY&+><@9f{Sof4dvK@yG48TI z!QJ+!xX13rz4m9g&;A_u+h5=TyAKcAU*aMAD?Ds}jRUWaJpcP~ko^q~w!g(8_IEhc z9>8Jt_c+}C0Y}(B;z)ZCN7+B&X!~azWB&)o+Cw-Ke;tsB_swr*i(*t&_GY3nw2wyhi4xwdX)=h?cMop0-QcA>2s+C{c* zX&2kNsa<00wsxtl8{1{JZf%#_y189p>-Kh~tsC4`wr+7(+q%hJW9v3|t*sl~b+&GG z*W0?;-C*l>ccZNv-c7b{c{kg->D^-Mws)(o8{ciVZhg1gx`p0h>n3`qt=s5bwr-?% z+q#wBW9w#mudUnZeYS3>_uIOqK49yn`k;Lu9BfZSlt@LtRH`6O@-A=Exbwj<%)-CmFTQ}8f zY~5C`wRK~?&epB_+eW&;R78b z&wt&953+S5KG@c+_z+t+<3nxTjt{eSLq6QrE%^vrH{~O3-IkBCTX3|!3dh(l;#hk% zjuX?!dYB>p0JT z1Lxas;zGL<7uj#&V*71eV!wk+?Jitqzl+Q5_i%;%KCZO8ah3f6uC_nKHTFli*6zV| z_Q$y1{scGJpW;Tl7dP3T;b!}D++u%$TkSsFW`Bv>?XPf${Wb2i`*D~34eqwT#Xa_S zxYr)QefIab-~Is)*frri|LyzmkbOTMwwL0->m$$qS{!6QfP?J^aftm84z=rWn7s^# z+YjRi`w<*z*W)PrQ5 zoMx}U>GrcY!+s8D+RZrIUWs$<=W(9>0?xNvaG|{l7uhf3VtX|%v0HJey#|-rFX3`~ zEv~TJaHYKtSJ~@vwf!=#vDW6nxXFG4H`{OG7P}L-+Hc`D z`)%BAzk@sMF5GFqi@WUiaJT(F?yZB_D6WYPF%qA-=2(z>?wHIo{9r+ zj6DC7aF9I>2iwzeh=SXk zeG*QvXW~RV4JX+r<7E33oMNAfQ|)w|W}k-B?bC6FeFo07GjO(jCeF3b!g==DIN#31 zg?1J$vS;C9dp0hyvvH}NgUjqWxZIwLE9_icY0tw|_BpuPJ{Q;6dAQb|kL&COxZYlf z8|-}CXrG6h>;l|uFTyQ$A#Sx7<2L(z+-_fhJM1FdXeKGE_i*c`g3GTBm z#r^hWc)$*D9CXm$2oKpC<6(Of9C&l&`5%OX>`ig7y%`R%H^-rNFb=b~z~T0mIKtiv zN7^Ac%HA4B+uPt6ds`f9hvGPUI~;Fsj}z=MIMEKnN%jsn+1?SS*gN4=I~=FkJL7bF z7o1`5iZks9oNe!hbM4)6p1lXowmah*K@*V_|ugB^<-?E`R=Jqb742jUhx4!7C|;WqnV+-@I& zJM4JeX&;Ka?89)keK_v16L7D61n#qs#QpYBc)(7?gZ5-RWKY4v_Ea3`9C`jvo;mfH zVbAaHN(_JP^_?=tPD-iyb-UOsZOK;U3r zo|>1nXwj4l3v(8ol(k@PPGAZ{yu9}fO~;>rTqa&ncW&IB(&Cf4=>(dOunDg^LSv{_%c} z)9V*5n4MMl&$mzE^^@~9eB1QSHhc;vFPNuq%A%Zqz3uUOAAf(J{qz0I;GfMb%ql3H zwjg`MW6E@tGJS)mp0wd5J)F9*Abawn+4JW8jTt#}vkG(cqCf5^{?9+#@P7XO7kSrz zd&55&^{?{JM!mG*pC)JJ&H4N7`RD(5`R}(F^>6uY{F-?SvU7_5_21*{UlyDf8K)mS-b=NH~i~uXX3d9IXT%E2LAE9OXKxZc}7p?2|Z0u zHQqN*-vF-;Y;JF1>v3D+sTJ6cwxJNxnq*neKRL`U&KMK8oJ#3Bs-QclhL%wit)@=; zgubOeDCEpBf!%2WO`&k!-ySrccA-c*iO!*vrP~LxX$dW()$}PH#E-?v{PT|Hu0& z`1|LX|NRq6%>3v3*^Bq1=ig9S~o-pd=rT=<) z`M=)2iI-W``uF>5{?|WW$;*t2{Qb{g<>kmxFY8|V=#Qs+>!V-Zk}v)r{qko2dRe!^ zNB?u(9UuL2BrlKtzSa%y(f?fcyhp#Ro7khDC%R`n`eohQ9{sXzZjXLh_m1`R#9!aP z*Z=F~8~*k3qJO;HQBeZT$x*I&>1mA)uHXLcb! zv26J1WMKin%8SB`ZcHHU*Dde{`((m z7C-aP&h>{($QctzAN6e;`v3p&`1brSPe49KJs)fI^CFmE7yo}g2mk(9qo07`bH)T_ zjQTch^h_=|MT2SnfuTGK4JgG zkEJL1Kc0Aeo0|A|Cy)BJ?c|S_#p`C#Y|5q_nnQCbm-PD-{eJFT(oUW{9_P~nT1feH z9_h!Ees6ObzfSSTg}`DupDrN%o|)g?ZumXlWFDu`R7#?0G@Xv7WYYKlv2+~icgK71$Mgw(O1<l(MBV`*VJ!#HldA) z|7{xJOArE^(`K{<1=Cif-%D;y{4a^XwzLgxN1-%^wx=B^jP(1(9cgFcuW$pq(k`?c zMbI9!JB_7C+LOkSet#H6d((K@hoWge+L!jH7@9~E=s=o82a$eXcnBR#htZ*wK!?+j zbOa@me&08RCQ}kkrRg+{lIdtVj*g|{DTVZVL;c?GL`tQZbP}CRX>=-`LZ?wWok6G5 znUq0i(^-^7nKYYbQ4VF(T$)4kD3{Kqb7(&0(L!24=TSZ_q5@h>g>(U(Pkec0;36I` zq++_5E~QIIKQ0#0)QvGM;dNKgl~hV;ysnJLtLYScDwX5w=mR>9m(QS^@lBM8XVcGk z9*?u97 zr|21anr`NGD|l?8mDEiCp*8dpwT^n!>)L1?tsV8K*S$>bw0_j1UiT`!LLKxPy+N;2 zC%s8;(_7R<@6dbnE_KuUbOU`vAJWIvL!Z(o^cnTi7xX!ONqzJ+eMR3;KYd5v(hu|_ zeLw0^ultDx=~jAyexV`yjee!yX_)?`KWHPq&jPdwZA_a|5N%HS^THMsOk0uuJh3%} z(6+PJnGLHN7HmV zhLY(xI+l*76gq)skanNUC+$7CoPYl+y$`yUZlns*Jku>aYL=;zN6m<7-syIH8)=ql z7XQBHo2q$v0lu5ZdrA9U9^`Qi|7;nLns0iH$0R=X6Ffdi`m@w>nSZ8Ps5|)eY6WSh z;CVde(;_OM3+R0Mo&KOd=|`%kN9i$ooZ9IXdX=7_C#i#;qDFd}exhe+IW^JiG)U9v zuaEyM9-!ywX`W8{wR9ytPcKjly-lm=dwP*pQ!A~Zm*_28OKr4{#*gL4ACE87Ra8dT z(6w|E-AwviZ=p)MmGrsZMz>QHjs9Hq{iW}#J9*USdKc+))vx_`(>-)A)sQ~d`$(Vb zQqt$DM}6M4^Z-3b`kWu4I$B2hoFC@#5h|w}=tg>n^!e)hSD%-@AN75x_n~jQKBm5p zUZZ!Zi{7XA=mYAekLW}Cn0n|_`h-5CUiyMQr!T3GzNW9}8|tU;=v&gaU;n-I?bCmc zU+6OW>+{n0nZ7TdrXl(d{XoCbuXHgL(VEUx}9_&k8z~iNeA(GFdahibSNE0hf@L_K}V8qD;>pSB26aUSDM13ZY$}g z(o~#8(`Y&!P04f&9ZR~kbR3T+9wTWi>2n*$<6ocKo;Zs3qVcphMbkdCFX?mJkH;9=pC-^m3eZNhF>OLY zv?*;yn^Q1tL0i&R6hd3mHnc5eQ6|kM-Ito>#~dEBX)ev7d6Y}%(m6Dr@@OF~pz|o7 z7Eu8$rb4=a&Zi5hh%Tm!=n^WX%ji2MN(*5)R)zU-sAT6UhdW0UPN2#73r^o0CYM`g+NqU+ZX*oSZ zE2xQ{qi1O)HPZ|9JiSIQ(kg1D)$|grp*C7e>uDXe)64WKy+SSYI(5*S^ai~}o%9a9 zP47|{y-)Aa2h>d;(TDUg_0XsE34KPr^aXuRUs4}^O<&PB)KA~hxAZ*?(2w*3{X~QG zANrYop&|N>ex=`OnEs?cXroPeuF@v7F>Ojgv^i}?x^=DF*Sc-3Ti3c}9YVTYty|XH zk#1LyA>FFhEo$AS*6ryXNw=nTds?@pb!%F;q;*?bx1)7SdMriKo-~g3qA1#%#*=P6 z>-Mv5JL}f7ZaK%0Za3?ea~92_*_2JX=R1dVzgKsAb+1=S9f@Ie^+;R zb#GU9c6DD@cXf47S9f%EKUa5ibuU+Ua&;e9|KCyfaCHY)_isz+a=L<+P$}u2?NxLD zO`-!Sjt-)O=@8OgXx)R>9cbNuP9WWT)}3eFcTS|qG=-*85>2D&bTlQ?F?1{)M=5kX z&7c!Vca=}1lV~QT(aCfQ=`Yl^!$`Y}w6jRNinOChyNR@uNV|x%gGjrFv~x(ihO}cy zyM?qq3yD^EA_bQ@1M@pKDMH}G`(PB-s#>rOZBblXlh?R3jdH|%t~ zu7-50PB-dwn@%_Bbc;?m=yZEdH|KO~PB-RsTTVCSbW2V*#P}P%{FVMS+mTVVb<)jW|lRptQlp^CTk{Hv&fo3*6gunjx}qn8Dq^BYo=JU#F`=2 z?678rH7l$cVa*0>CRnq;ngQ1AuV#KV>#G@G&Gu@hSF^mD;nnP}W_C5Js~KI*=4vKa zv$&eU)$FZiZZ&JG8C%WPYNl4Rw3?yS?5t*HH7lzbS#7-7 z&9-W$Rreir*HQNzb;og-eka|J)ZIwki`1P+-G|g&$nE*LYZ8S~9PLg=(pZ{I<7f)$ z_ZNRzzozfY>yD*aq+eULgGsxWbdOkfh;@HhcZYRvSa*hXUs!jAbx&A#gmphycY}2= zSa*VTA6R#Rbq`o~fOY>@cYk&7S9gAO-&c2ibQF+=`cEi66h#8k|t9kO{FO` zjgshSnoh@1G95?9((#l+C(sN!ky2?UokS;78l6g~&}o!TXVB?%CS}msbQWdNU6kp^ z**wmo9LlD-G>7Ij^RE~Fy5m@cAAsF*IJOX+ed zp(S($T}h>MHC;v5P#IlE*V6S=PB+pGbQ4w3Ep#*8N|mH1k@D<@5}#peA~bo~4!4OfS&$w2E42HN8k{ zsFl{zOSF#K=w(_@uTVR^Mz7NA)Io338}t@+(mV7vy-Qv6KD|dDP&a)do?MYFz7mcUADV`3c!{~5Ipd;u=I*MZH0GdPxQXCyb2h$;xOvli% zbR4D7@svoDX$noHB$`I2(HV3molPgwOgfoPrCgdv=g_&7NAqa`Eu>7!qFFSXvMGn= z&|G?!o})HeN9*ZjdXL^G-A~Zngs-)ARnSdzGu=X!bSvrJ$n8`|%jjWxgzD*0dW;^Y8oH0}r=?U& z572}35H-;XYNiHyg7WD+dW!USPWpSC71Ykl1+<6?X)&#)E_#lb4Iy#Q0{kgP;KBF1@UC$)Sr}LE~8A!qFFSXvMGn=&|J!;d2|k)OL;V(7SKW}r6tr6#kZHZ32|8Cp(Fw1S?c=ct)h()08Jwa_Yh zkycYHt)Z7_Ew#})T2C)iJH0}$(rXmU?>i2lNpv8^(Lr=D9YXPRC>=(JQvw}9N77N0 zNRw#_O{FB7M$_qNN~UAzSUQeU=y;kzCr~P#NGH)uN~4qM6grjC=`=c>&Y%oBlg^^E zNncp95p7JHP!MfOo6+VJOk2>Fv=xQW*0c?6OQEzKZBJt;jCP|fWbPbi!b#yIVPvvwY z-9R@{1>Hh7)2&oVx6^HO2UXEsbSK?S)pRf2L-$b)Ev5VE0ji~k=s{XWb@T{5Opj7M zJx-6&6VyOY(UbHvHPUi=hE`A$Jx9;dN@}JT=y_U2Ewq|mq&3t^Yw0CgM{V>nt*2M0 zonE6?>2>O$H|Y&}i#q8YdYj&*E_$EdqYtQ?KB5olW9p$#=@aUwujyO*hJK_UsD?iS z+(-A*QmUl~=s|jj>S!4~Opj1KJxY(!L>3MpA zT4)u$NUN!p*3epdg|tss`*pQHSNn9QQ4(oCuJ+|_*oVtw8Gkm@pTqR1Ka*+it@hw* z&#m^}YOk&K+-i@l_S$N1t@hYzPp$UWYA>z!)M^i{_R?zatoG1q&#d;&YOk#J%xaIU z_R8i^Hfc|+_Qq;2toFoe53KgWYVWJ|z-rH{_P%PbtM z<7pp?ru}GN+Mi-bdrBve_L5E_?IG1((nIKAI+Wt+a5{{RpaeRKj-<(yNK`ag;*G(+oO+Qc1hLPNJEVMkmuLbSh~_*J*S*jiqt4 zCq>a-G@kaRXxfMNrTr*|_NNInkz(lpnnVXu934al(;*a3htgrBolx2Zr5#Y({iK~w z+V!LzPZLQyowUnIJDd(A?QGJnChcg_ZYJ$y(k>?LVAAd-?Of8XCGA+!Zly%hE+y?y zno8Q4q+LnVNxPA>6G^*}v;#@IkF@hhyN! zd81u7+Hs@ZHri>UT{hZbqun*yS)*Mw4fF&(Nl#HDJx$Nha%!R#^ejC`&9su9rx&P& zR?&;Jnp$ZMy+muNjn>h6dYRhk6?&CkqYiqV-k>*0`&hJxMf+E@cSZYFv}Z;8RkT+{ z`&4R3`%|GDP_zd{`%kp@MEg#(=S2HWwAV!YOti;D`%AR9MEgp# zr$qZnw3kHtNVJDU`$x3DM|*p;uSa`&w4X=O4^U3y*S#3qdhp+E=6f6xvIneH7Y5 zq5TuuJE46O+B2d3651=FeG=Luq5Tos8=-v>+7qGu5ZVi&eGu9Mq5Tiq`=EUf+Vi0O z4%+LWeGb~=p#2Tn+n{|7+S8!@4BE?}eGJ;ep#2NlyP$mw+Owej3filneG1y6p#2Hj zo1lFO+LNID2-=IFeF!CVIbA_ZsFbdxtLSPfqig6|x{k`}db)vbqzbx;ZYJ$b(Y_Sz zNzr~3?M2Z(6zxIL{uAvz(Y_PyInjO-?KP>P`{;gJO11O=JxC8x9WA4W=@F`@N9i$o zoEqo}dXltLK)VFALqNL&v@<}v0<@{1jof6t5p&b%SNjoF7D?&RWv>QS@ zA+!rZJ0P_CK|3F`>p?pnwA(>D9kk0qI~=sTK|33?t3f*&w3|UY8MKQ*I~cTkK|2?; zYe72}v|Ax_!A1eil52)sv*Vf>*Q~f^#5EhPnQ+a5YX)4i-thZ*oHQTM3Zq0IQ zhFi1Sn%UN@wq~?7o2{8_&0=c?TeH`ixz?<;W~?<^ok-dxpdA9*9iW{7+7+N30oo0q zodDVepdA33{nyODX8kqeui1Xh^lO%1GyIy}*UY|V^);if*?i69YZhNK_?o@f%)Msq zHDj;Ydd&`NW>~Yrni1A)ux5fa3#=Jn&HifUSF^sF@zrdvW_mTts~KL+?rLUNv$~qm z)oiY2ay5&q8C=cYYUWn6wwkfkY^`Q$HA|}*TFuUGn3?5qBifiYp&-)CxMsyQBd*zS z&4gajGLzeb799TVVJ;=mOBm5MzT$J$9a&Yp(j?ddqdJ{l+5`ug!CTVF?>Z0qaE zQ*8ZRUn=Iex`7l*_v??x8MeOGJk!?KoM+pqIM>$Kpy%28TJ(H-CN9K!|N6T0V!!@m zTw?3%)JtuBy?U9guUjv-_4Vr&w!V(N($2zF_AFd&&&D-&HmizmJaD&~48|^P~ll>KLw!g+Lc0X>lzrk(x zx47N@4tLlCxYPa~ciBJSZu>{vV-Mn9`zPFI|BUhM2{ykC3MATF<0N|#K}xW(Qdx7rhMn>`V?+mmpIeIV|%<8YUK5bm}Q z#y$2SxYs@u_t}Txe*17dU?<=~`v^Q_ABl(Uqj2Edk>`IR4zefXV0#J+L+;V9&>mHox5tG}#Mrvz?Dy?DKG| zU4Yx{MY!EA#2xlx+-aYWyX*^aw_SvL> zSAv7`MxOtd<6!#=9AYoQp>`<_v#-SA_Ek8-z8Xi`WjM;d21nc1;u!ln9BY^3IQs@1 zZ{LU$>r>Gth7!>+=a_8mCez7yx#)i}?-8|T~i z;6nReTx8eaV*5T^V&9KT?WMTPuEpi{1GvI|5Lem{;VQchSKG^Qja`px?MHE){TQyd zAIA-L18%gRz)kj(xY>RRx7dxi)qWbc+0Wp1dpYi~n{cPS0(aTXxZ7Tdd+Zl*uic9K zu%5ST@PPdi9$ z9Vgmv;3WG^oNRaE6#FflYQK%s?00aw-GwvkcX6iu9?rJk$GLVl&a*$j`Sypn(EbP) z**&<}{ur0opWssaQ(R{E;&S^lTw#BXEA20EmEDJ{?JseS{S~gYzs7ZTKd!gG!43Ae zxY7O&H`(9gW~}GK54hF-5x3iexYKX{6YjEq#@+URaF0ENd+lFvpZzQDw|~O}_Anl_ zf5$`iA9&dQ69*QIJeTyz2H6|oV0&X6Vr#ZC)Yfcen5|jMa9gvM5w>P8BW=xIM%kLh zjJ7q48DncUGu95lakgeP<894qCfJ(YOtdw-nPh90GuhTGXNs-a&Qx2oooTjaJ=1N? zdS=*~{misA`9Nw&7juVnn|s%YR&8)WA znqh6VHN)CwYo@i`*4N#1*qUwav^DG6WgmgNZGDYSkFBq{>9rGapFJ7(+f(p>Jrxhy znm-+~HGev6Yi2gEaOC-~8QLIQGql0BW@*350Btr^@X zTVGccZR=}|Vr+e_QLH@^$Jv@;kGD0$o?vU1J<--2dy;(yPPX;`(o^hAoN8y`GuU`fZGHVgldZ4aY{oon zm{o4`>(ApA?REj~urwq{fNY|Xaz+gITMTl2(&_BD9O z)_n1>tr^}x{>bxOv%EpJW_p9|n{bG&8Q)OMH+#cea=2fw`Q!*&v$c_a8_g<5`}LYx zjHM3mix6$l#grjYPaApzrALyBW%r)N7%uUYvr`yE_?_4#+!)>-^=G$$}(0ACHq3^W6#9g*#>bq^t*!S3)vG27tbKhrc z=Dy$74E}(v9R!0|-?!i6VOz8IK?Nhqps| z>yNfIw;yBwhGXsDah&}Jj<^5B33ebT5Jb|@~fx5K5jX8g*qz7NOX3cp@6f0cgy z4!GK{-x1f?JKQr70XWjud}S2YxA#CC;N2jc|$5S(bo<0Sh~oNOP4 zQ|!ZWs-1w->?3fxt@+Ljtk35tobA^q;#_+&&hy($!G&1g|5I^^-zEu{+S72EJsp?Z zN8<`R8CTlJ;3`{lq}5oT&vCfcuTQ~s_VKvho`DF{#`*RoxX`{77ulEL zV!H&F*q7r{`&wLPUx&->a$I3wk1OpPaFu-{uC^<1jeQfYwQt6C_AR*HuEY)Yt+>&? z4L8}h<7T@Gx7c^!R{KueX5WR|?P}a%-;F!%dvKS1FYdN$aF2Z-?zQj7efCn^Z`a}h z`vE*?KZu9yhw!jnhXad8p3lp0ko_sM?97osjYh`)M3!KZE1#m)S4la=RT@*stJ9`&C?JzlN*r z4qRiuj%)2VaGm`ouD3gJgZ&n6wBN=}_B*)Q?!qnhySUYU54YLx<953nci11`PWwaL zWq*Xb?H=4?e~f$WPjH|8Dekv>@qqmq9<)ElL-rSV*zUuD^GBZlU*aJ9D;#WpjYI5y z9BO}q!|ZQyxcwcDum^CY{XLGdf56f9k2uC2#Ig2IIL`hV$J_tG3HA_9w12@#_OCeE z{tc(t!#LIc9jDoU;B@;>oM8tx<@s-KgtP69ajv}y&a;DXzP%|fv^T>=_U5?Q)_$H6 zTl;!SZSCtRv$emc+}8e{3S0YpDsAoasj{`-r`pzjpBh{Herj#)`>C_F|EJ#8{+|Y0 z`+yp4?E`AEwI8V2)_$NCTl<1qZS4zcv$a2{-PZn~4qN+#I&JL}>aw+8sN0UjJ@#1K zYmdWy_MW)kj=}@>UU<+RkB98N@vyD^M1c!Np8wic6l7~(QLwH3MIpBK7lqo|XB1{@ zpHaB2{YDYCb_qq=+9?!eYqwCetsO%#wssB0+S)l3XK&a&WNQaef~{RdiMDnUCE40d zlx%B9QHrfyMX9!S7NyzRU6gJo;tYE-&a}1DDBIRebSV@_y7O@?qmNR-u*tm=bSln=A1LUQMP-K zyJfoa73v z%&5V#Jv(ZMY|oI&knLGgnX)}oDoeI!OAVFn8B@b#d)Aa!wr5Tam+je8*|I%@Do5_Y zx$=8BPyQRum*2+)@@8Bpe}Ic*dv;Z^{C8X;+q0}nWqYR89NC_2HBYu@TrHICSyyH9 zKXFjDXJ1vx_6)3uY|p}q%l1sHlx)w&s*~**S@p6#E2}}aXJ$3Z_Ux=C*`A@bT()Ov zt&r`RS}SFHw$>`yp0TxBwr6cM%l6EzHL~3++alXNv#qk-JKHAPJ+y0OyO(yIZ1>cz zm+ju#cG>Q+?T}k=r+g>gAm4?%UFZ+Q@vic zd#l@JyT`gi?!}$*Kkx?mBito_j5o?#aJT$Vyh;89_sE~(&2k^^l|RE<FY$JH8}^**tp8u(!SdI5i2M!CkhkMZ`CFVN+cS)ZVmqH~&oK7N_Kf0e*`80F zE8Fu7^Rb=Zw&xrc$@Wa*QVnCz4xT65vo*?Od(LJRwsWxdyv>Mg&)tm6_WaG1Y|r7W zlkIt&^|C#evq84!b2iHMoX#fMp4Yitw&!-PknQ=MD`k6*=PKEr=eb(8=Xy5F_I%GZ zvOVXsMYiXCw#xS0&ozUXGzo-^7j+w(@Z$oAaPKG~i>x>dI4kZzOhd8FHA zdoHP`UfW(gShnYs4w3D7r5Un4w=`3>=a**5_8ilpvOUjqm~79}@XGd#q2aPUUm{!f z@I1O4c@WN(cfon`PjJ3G7#GO9;zD^hTqN&~i{&A>MBW3J%6sBD@?LnJoPih0d*d>B z9~_i_imT*I9Fh0MartLBCGUspxCtxO^H;$+K~tJO|gyr{e~B zE^d_1z)kWzyj-4-SI7(SO8HE@N?wRp%V*(c`E0yK_Td(}47Xz2Z~F0Cxg4+8Fag{y z2XTiS!kuyj-XK@vF1ZSCl*71NUW7Nv)woBF;LUOk?viyXs!avX1!&%xW|1l}$u zvFCheJx}4maxESrFUA@25}Ya5;VgM69x5-x!{l?ZSFXpy<@0d1d_K;RFTlBS1J08# z#QE|?xIn%b7s`#eNWKIY%a`I3`7&H8H{m(*<#?Wa1zsp$iOb~WI4EC*tK_S3M7{>c z z{}~UHpTu7IDLh>6z}fQCI7fa4=gQCGJh>C+%g^Bg`FUI@zkrM64Y*i-5tqm>;Zpf! zJV)-r^W<0XLitr(CclP*@;E@+u)G})k-x{vKz^o`YHcxgwQ>$#Cm)N~%Oh~RJQ8=vxwumvg*V8fahE&>Z%balE>j5 z`8d2;&d0s-c)UfPfcxa*@m9G2Z<9~J+huz;xaUG={XYp0mJ9I^c_Pk`C*e$aGR~5V z@KAXQ9wrxKuRI+Omruso@+mk+F2T9-44fyQiu2{!xIjJ~7s_YgB6&V8me0f`@>#f4 z_Tf2l8J;Km@j|&Am&pMfl!LfR4&jJgf#Y%|PRUicP7dRGc@b`qt8t?o!A)`vUM@%R z3OR;X%5l6(J_oOs6S!GU;x%##x5%})Rkr7Zx5-QJTG^fnzD~AhgRhtE+2QT7Jwv=h zwr7WT%IDz?as%#?FT@+=i*UDmG2SFM;vV@Dyji{!_sW;yEpij?lP||x<=^08@=ENLufxOT-{NffcQ{90g>&WW zah`kw&X<3W3*^h?!p`8S8%u7jW@|};U4*I zyjlJW?v;D+7WqBgCx3vq%Ds4-{13cc{s?<6cGmNc@nCri9wL8%GvsYJQ~nBP$zS84 z@;7*xyd8VxBMxCb$M!ec(Ktsw2ItA6ae;=Pi3{a2TqOH(v0RQz+` zyil&hWpWh`%3)k3FTxSI8pq`bPRTX6PLASwIffhLIBt~B!A)`kFPD>eg`C1G+nYTVcac0f;Y*J;vRWD-Yh?cd*#RR7WoO>C%5CR@}KcG`ANK8ehPaUoprkd50;j{2U%CKaYpWFJP~{0S}j7#M$yoI7faN=gM6;PksgG%dg@B`88Z9 zZ^T9N>$q5c1DD8e;!?RA&ynB4^W?YjLisPaOx}cp@;kUn{wt2i@8Y=JgH!T*xK92X zu9x4(4f1B(D1U&P2Mr|G=wcPY&z9JP0?-yWlnQPjHJo7`Mv1;x>6V zyjI>Fuak%1_3|FLUEULS$a~>VIRkHy_r_iFK6s=2Q`{|EyA_*cYrmpL{u$mZ?}vM3 zYu93nyg%-f55QYxYwu#4Z0%lbm#zH^&n3?KZ|z_VmaRREA+oiLks(|A7@4xQlaVD` zdl^GzFCHczg1z#gc({BR&X$Mc9QkmZD<6ULu;JPMb|qj69kgRA5`9FfQ3xI7N0rfE(rGag$tt zm&+&M74nIArF;@zB^Tn=@!maWY+$K-OYvpNpom`C9%hPeYd@}Bk zPr;pX3Em*jz+Li8yiuNoyX8{6Nj??#$fx1W@@(8I&%s;d({Z0X7jKo%z}w_`c)L6w zdoFd>{{?ukd?p?uFT@%0SvXTZ8)wNrJX9{j!(>19%H?>t9KhLf5a-AtoGVx0Jh>9* z%T>5Q4&y?35iXLeaj_i1C2|cem7{o$9K-YEI9@0xaG9LMLAe%J$%}DBJ|D;B3vfzq zz;*J4xL&>pH^>*`M!69;$(P{e@}+o%d>LLTH{n(C<#@Gx1#XtF#B1c`xJAASx5`)J zHu)O7R$hVE$-lE!$x8UvaAF$^#XZ^nw50=;9A@XfFL%tnn%6H%_xdjiE@5IC8 zyRcWj8xNOTakl(NoFm_ZbLBtbJh=_$%lF~}`954I-;ayrwYXS*0GG%Q;!^n`JV#!K z=gAM_h4Le~Onwvx<@LBqehf$C$8lVK0;lA5Tqpk-*UL}h2Kg!6D0ko{`Dwgdeg?0Q zpT#TXPP|Hf4zHG<$IbE!c#XUPx5zKzR{15|Ccli=%3XM!{0d$#zlz)C*Kmit5qHY3 z;|=l~xJ!N$Z?LrsH);@HxZ0$ss$ktwTsch{=&ylVD=y|fWBfU_z_N2>X zYgalbTl>;gvb8fEk*&SyxNPlCr(|n?x=yxssOx2GkGes&cBva>YoEGFwsxwQ%hq1? z3fbDNUMXAq)vIJ{$9lDF?O8X=)~@v$+1j^mk*%HUR@vISZj-Iu>$S4Af4xq&cCgpW z)^=9AY;9?E$kvutr)+I&ZIFv_mplb;l&!6;ZrR%2+9Vg_9@*OB+ALceT)o)NlUTc4 zeX_O5wN1lV8(rIFYop6^xwD>In_YutYqM*JY;AaD$kv8erfh9`Wy#j2*HGEo_!=f# z8(&`8+WZ9_xw5qhmM2@AVEMAO5mq2u8)1dAwHa0dNWNQPh zRkk+J+GJ}JZLMr=qOFsyjkNW$wUO2?TbpSevbCAkDO($A8)R!ktxL8x)i%o3rdqdb zZLDpQt&O!F+1gy&EL)pvy|T5zwnaYl4%T`3FuYYBj|oo{S@M5su4K za7vzv>*Q&;UM|KB@^suNTbp%FvbABiT(&msR>;<--AdWov|A-x8+WT^YvZn2wl?q9 z$kygvi)?M+waV58UYl%f;;ohE;&t*Fc)dIix6AW!hr9rH%4gyY@$6?mImiMPvD*mI?`{)h2k+1l(IB3m1N8M3wE zmnmDDep#}$={HoiHvWdmOR-m8hKI}N;%vDd=g8;bT={&QCtrZ`FZMa9i7jKsD!@aV# zf4D_ni~D42lX0v3Al@cFgtyD0A~UWQl6=i=3JJ#LoI!)xU8af^HbZj~Ewn|vW&D_?}y$rt1GawBe+FTox1rMOeR z3~!K|aF={J-Y8#zyX7nKCV4sTk*~s=<*RY8d=1_rufTosuklv-TD(pE4c;!V#Gb31 z_5V6NSpF>@BL5C&$g6Osd_B&RZ@@$4-{WEOYV4J7#KYyAaJGCi&XJpOu6zs5lmCG8 zAdGg(Oq1=kgl5iqN8^q1F}PdK!JFh`agRI# zZD;MG6@)VpcPsKU%G@L6J<2-pf&X-Td1@bAlP%gnm@(f%o&%`D2ELWovhKoowyT zu9vMH+IHF6qwSEbUD{6B+Na$hTRXK~vb9&cQMPt#yJc&?c9U%F*!IZQp6zDY+O_SK zt$o`qvbA&DCtG{BTV-qacAISN-)@(^*mI4u{vUz|%ZK72@?khb9*#5R!*P~;1Rg3M ziHFJA*ef4}hs#IfZ21_RBj?~;`BkCCV4VmE*Iey z@)W#Mo{Cq=)9`A!7&pt)@f!JL+#;WXTjdhmCeOfY<(YV$JPWUvtzF`F+1e-Wkgc8K zPTATk-XL4M#a*(sU%XMac8t4aYtML-Z0#EN$kx8`X4%>~?v<^*<1Mnad)y~m`^Q^l zYX^CoZ0#X$m)o&tg|q(u84s49#6#q#aE9E0Gv%jomi!DJDnE;d$=0s2SGM+*hs)N^ za<**kE$7JA?sBed?Jwua)(&&NZ0#`@$kr}%p=|9l7s=L6bFpmgHJ8ZUxKw@%&ynB8 z^W?wah4Lm`CclG&@?UY4{4S2jJvc7Ehg0(3aGm@B)+$#6sHu*EWR{k8XlfS_0<*m3~{t|b{|H7T} zzwrin8}5?7!W-qUaku;p-XvSw);+SdalKi#wyt|+Yx8=GY;9ln$<_w;R@vIZ-X>d{ z*xO}m8{6}1XZ^P}vIoo7R`w9t+RV<7t?leg+1k*~lC3T6p|Z89JxsQ?wY{>nu{~V2 zwzjinYjZnCwzju(Wov^wPqwzW^JQz3yFj+KxeH}$qq|79wz`XDYqPsVwzj)VWoyHG zj%;mt&y%f9?}f6p?Oi5Y8{a|M+WM}Ntu6G3Y;B^)WosKfC0iTmb+WaUUN2jl=?${A zo!%&08|qE6wWYpXwl>vQ$hY8?vbC|kO18GvSIgGsdb4b8udk8QZLrJM7JI8~ZL+t? z);9ZE+1hAdCtF+X>t$=Ry3^&9}?ewz=n8XZ^P}&IilZ*7*?G+C0yY zt?lzn+1fzQlC3TDp|Z7!K1{Z@(Y>;@kv?3uw$ig@YcoAZwzkuAWott{Pqwzy^JQyO zy+F3M)eB{7W4%bWw$_VfYjeFswzk(xWov_dj%;nQ&y%f9_Jy*w&0Z#38|^{a+G?+o ztwfVkWwzl6_$kqn@O4-_i zUnN_c@T+BO8@^e#HsaUF)>eFrY;DH3%GP##n`~{!ua&JW`E|0jDZgG$w=FNX)4fCf zGwzh1#2e(NaF^VHH_A`rZuuF!Nq!dh$ennz{2cC;pT}F|7jU1v0dJLG#M|VT@OJrS z?D>te{&(TQ@+)|V{3_0nU&ER5Mw}(Tj)%%`;9>Hc*eiGA;qqHJTYeko$bZ4P@+O=o zzk~DTzv2S3+qKX8@&5st_o z;GeTu>3e4B0qsMh z-^I)2!YJ#%JQ1&yC*f7{WV~7~!p-s&yhfgiTjXiDRW8PD@^rjbJ{hl*Pr>Wu65KA& zz#Z~T+$qn(8{|^lC7+5n%BSIOc{bi8&%r(N>3Fj|7x&6%;4Shz+$Yb+Tjd3Kn|vnT zE-%EM>zwufEIe2~8xN6vI72SOnX(^e$>n&c9KgfmAoj{3JY258*>WY$k*jd79L9O_ zBAhQ*;{rK?3*{PIBu8-vFxgIyj=ix^AeB2~ofS1c28V6k=55gXM?%2~-ef3JF`^>kuS{kiHKH~e4#a|??4xph z`+36r6f}9T$Fm3Jk6(Ale|{muy04wD*XE9&xWK>6;<;dtJ-lAe!53VRJN}UK{mZ=P zA2M=6;hAOUp1;Q)d+xc{UKtsC@9p(YTwt&8`TWZ$r}`_V)Ws8XxmlRer85tggj1n} zKjInKeLmeMN0`#nolh~a-vYPaq@}4)(zDa+&ZOUIp?D}2wiz=m5vz^IB0*nzo(vqv zLK{ac8t|tkMtJwA-v%GRNeO>6Q04KQ#c+I!(m5Ls9EXqkRGZlWe=_6?N0XswlDAzP zs;P~n!oEm28Vbfzz8ZfjP!&r0qM;?}ZpkJ7xUVu13I(-<0*Oe)z6WP{c#N;-5XwC% zkD<(>JW2KGl)F_&!=43bHHMzY8OWGL~H95RB8BTTZ#uAjBf zWTk8OGg@im-;KDo*NjZmCR2ft75-2~VBDzuKt*1DdGNULd4cjker|qVUVgA*RC&di zim~G>#*Fh|78sdK1V%0n1xD7yf+G^it$c%)1| zz3siKVl^S&Fd7XdMve&h6P2-%iBM%YnPP-Cs&F(Isv8kV_*wiT!m(q=Rg5|=IC^w> zxqsBy+}u$WHgu@&*yPe^%3pVE?uh&mW74my3MZJb^vcF$c*?w4o=V=Ylj+E(EaQV_ zP}=AB<8m^A_`OBpWIWJ8V#BcYlQqfLM95}{OWf`#n$N4=p$B9`#hMniS+P#_fw zMwWU4yw?7+`546i_w$fB5RO*bwC5j^e&P8pZ}o$->CBl zqyG2*fO_75`p4A0)Q`&>GkR3+$Pvd@em-gP2RX+aeN^_5M;t!XVck9F*FACLlXpG#hg*L8=c_Nj zyY1mS9*O^{ef{d?*PMGv!*8y*Hu3K7zUuyD%eU{p{o%haTl?8R{Pf?sZY?bX*eKYi!T7q^B>%gg+yzWnP{a>Yg0FRgB@iPpzXi!8qCoC}wn zcU$ekMYD?oXHA@S`#*1e_VM>#dEuG2{_@gC+iv>w`~S=TrrX!k8>>xuV-?==SZy?z z^mvD7rI+3R^g9rUB|_=%a554OpjaYhUjt784SG*xwNCjHDenFm|IPNQn%CQZ zw*83U|LL;YvCZGHz3M%D=k3-1blf}EgH&Q<+@G?2H!DJV^H+34mS+~z{sbT3ILh>1 zz#I1`k|AgFJYmoDXQP)Vy}6#?^>pwW+ppR_*FLxXw~=mU4y6 zeCUAsHhdDXxmOcUc~dd(qF6ZU4M!0lHNp_@qEks*=PQrF3X+P6Fx#_c9y4@@!dxbAa32(cUwL+tds8g9>p-&fiCwQ|% zbya>2Q9{9^{%ftbNXhcvyACk$4X+K->pAD{g?suwbZ$7ineT*PEEvWCRh0r z>Gd?uG_yHLrw|925gbI6ofb-R;5cDIZFEV(AJ0Cj%*#UH(4vf2m3bHYBefyVISgL>nST24~^|2!==A^E=s%MB2|uV?|LIyJvqLH8Gt;e(^}zkkFU1x7H5Urfw8wz%=i&z9u7mbB<-oeF zO9Sf{{-Ayl_0#!or@x%665*h)HqOE6z}H;NFzHRLFTLs8X?%_JJJNe(|Ni5@w%!Iq z<+XP7|NmiwVV}YFPd0BZ!QNw?eZ)}ewhRs>Znx3+mt zjx2c{e}3`zkhjwQ%ujl=S!t^n$0%NVJteED#|~w~(ey&~I&Z}vAm`MEqJfaN!VXQ@ z>v;ognf?6HmhcAbl!H6`4?26(D`if4YMi6J8g@9|@{k?w*(7r0=e{&OsB`SgU%@$E zcSt`+4!jSW@@OCuOY+%%@Fu}fAY9{*xPy7q-^L$y)VoxL>ij?Kl^*^-^#~`u(OAms z_v(a-*VZC`!r863lRfZ-!EhxfGopc*{mq-=)1?+8|wX*7E<&Ivx$#A&niwa?*j5NTK9N z&Z`8fLn&7GnWM5i69%m7?)2Ggan65nG*=r<{l8gp2fXH-T7NVZt_bsWaAs_hwZ{1d zX>IHOIO)+deLG&gLtb}LdTYY=ovO64B|x7NUmM`Z^ zY%Pv*IL=n0zpMM9-LG)}hj+GH<*XQqP(_G!MV~7Dl~2~j zvm>=^uPVJx=cC{dRl=9@9j@v61Idl=sjJNWM3 zzn44bj4%Dkj^m2UaC+a)uua%Kj<_68u_LkR&JLu=wuq&%sYi{VgHPpLyw@1vsUd>L1?z7PE6`KOWxMC9*5z>*DDj{sD%y zW5;Q1@YwD7CbPY+j3t)N4kW_yRG=amhy*59hMcNzN?pp%p|gRQX3LpVt-i?-`>QVD zo5b#>dNx}@Te+Ru8Eicq@jC_YF`i5$3y4qgQ!XQRtZuRCu{@%*Q@%mE$-jvGZTx2r ze4Zh%kRGy`Y*9X;w0KxI>~9_Wd&Z70?RfM&a)Dy&m&MknE68%?YRX&4t>jDcZ*n0k z+{MJ&*R^(at$o({N*QGn`89crJfZxV@=4M`o+i&KU6db@Ps!&b)6RhsFA0+=^)RNPVxeIiM*+7qI`$EOWr3R zlF!I?tXDbzywd6u_F}Z|XMXn*gCchyq+5XIC+vhLpsUx z9c%B7T7kmcl7a+`7oeVx7T8A_FAmHUTeE`J1PDd%Y)1yrDQIdr!1g6i3Y*I!dBue5WL6W3_yhh$sHc`Gq zddNS>UYvl~oBWjgoOnqcX&`rzHu5F06WPBaUUCe{CC8Jgq=v*viZqbBNgH{Nbdk4+ z{XqCj;w5L3GEz@2AeWOBvlIdgyIgd0D zYtz!&vb1&$A0yUwVHbIoY$RV3J7KmzCl7~`gNT<*A;n|{DJ5r+`O2A;ma`OVi{U)d zK-Q86i9MIyp2u!^l5~(~Nc!38l&_IDh&>~{huE{sKPOwszlc4PJj2U!At#YSGDkUw z(sF^af^s$KB7J0+L!9hRY1xzPNA_2KPI(X+uGllrE!m1a_xxBgl8h$>k{p?>Jgw}H-ekQX&yW|$ zH^lQ5+n=v_9eIm*zTthze&j%M5XmM-lW`=U6p#~@LduC`GASZc$-U$?a>BQKZgLH| zmOM-P$T!6E9otOeB_qigl1FBcStL$UWHH%JGQVdNO6=JO6Ua%5-P6B-RFKEXljK?Q zJb9VCO5P-IlTCy<>)DI!O^zVhWCAH5Cy%_zTgg26AawoBScI}=}yBE~%HS}pX!rlweSdaOo!v`k_rclyZ+73C-S1}ip4mNTc0ZTh$7T0m*}YeG&y{Dl zL7s8D^SQ|Bq>NOO2673xjI@#a$RorvWRPc9GDO*vax6KHWRU&H{^UUNb266XlL_P`rHrzk zG?3M#ojgmPBOemaUc8PJlG8~UNstEeYvSQPj$+b4()SHf+PxhfeiS>B$`0}z*+5<*Z<9@m=VyaF`;z_0apXiYku;D?Nt1E~MuPO38e3Ht~}N@-%r?>7sm#H0(df^8i^#+DSKghj>>>i+hknhQEKOf}TL&>1rkL*tl zAVbMmavaGg$CJsVl*}j1s6k$HSZays!8v3#adR`J;v(Vd)4%1D^R$>XG*JV(07KS>|iN<7tkZc<1l zlTtFD1jrI{9=V3ty)SkzfG5U!NoJAD$Tj3<(nH=O?~~1>k9nM+oao5;=N z56W$nx05?bE4ha}OdeGpqkM`yO?G{KkY{(YC)t~1kpsvu@+&f)98XRpg`|i~RZgZX zC8v?w-e8+W+R2mTZL*1cO}3M)HyJO#*MxkmB4 z$9)MTmz+Qf$#gPPS@AdKF=;1Xk*>{@r04JK4@ocinEaD`Li)&e#M8@XBwgeUV)wM1 zLQ2Ve;`xN_J=v8UOb#K3lHtmcl$N8&Xp%>cBjc6hDJ_$fX_S`f$|;nV8DthYm7GTA zC}&Vw<|}7XTFz2@lomfJCqbo>auJD;1WA!4WGSg9=PM1Amy;{W@5wFXR&pD;liW=n zCApt5&7_osNt|3x`o3X46T33~-P<|Qe#b7J@el3dDI^E2+r{H0x4g8Ar;YS{O#f|k z|JperfAW4mVgL6N&z}zCq&g>_J|%lFroD+*xrEZvtTb?L!(s#MNwUdNWTfJww4{Gv z;O{d2PyfzPwwrT4y^r!M(!M+A9f*5g+s-$CO6)vujJW4v-SeXEc}e&Dp?iL>f{Be0 z_dJ?=zRW$(<(|(f%yiB}t)RS~xaU)My&3*sIRxyK{!aff?6;T}i0#|=F?PH^}4?*7=_kGlIucmL<^uiX8VyB~75L+ht-D_Oqf662OS-?Geaos^$T~4`_T=f)C-UQVB|q#>j4pNi@5ZXhsR56_ zGUVs#iu7Q<;!vG0{bOSKXU>WCTW2}H*mFTfzwD<^hEM;VSss`a4u<(9j33>~k*fR} zo`^-#9s2w1=vI?{&5W?!7Z3{CP&Gd?zy4N6md2|F3`!^8H0x%si2K9#TIYg;^gyNQ zF8t`0z6Rk(!=#qRL;qno-yFJ^N2(`rFGzKH`k$K0@_2bUzX1B9G4Am3N4U-z}YY<9&A?mYW>n|6y3C^MGN~zggSJ zcOGwv{gj>VJYd*pMRnkRGaWOho-+AAPYhRlaN+Kc-e69D=K*h!{;~YW!=7%xp*s^3 z4lJtn2h!JfFoXF;K9mRtsweh$ndx+4C>9)-{)EfJT-mgAu|E;!>XB-j%l#eaIvp7{ z%pGZoQ1$fblPRp8sH{xJY7+svoi@!kZFbsDkE#JZiU;;sG@!@H1AA1*2lP3mbf;be z`wZ++GoZ(efjyD~ddwc!BQ>DMoPj-Rs|WNs{gj=04eT?p$KnA!=JxkUU-#+G^I3Ks z%#PX3We+u6Qs(w8b*el1CzAS=zxuSmP!U)X zs0l2oHbeqTQh_D4L4UHUh;SXyj@Q_#&N@;wu$ym&({ZN(ZR@b}P_|tNhARAazg+*f z)V+kF$m!wh|Nb)d!H}=iF0bG!i=q%$6WJAFK`O4;X!(o6el9LxbBcwUU@GLF!lf6! ziAmN^-x=W`bCtT^s!P(fa=toKYGRARz8SG#`tm2=Bs!%(mD4>v^P+YM0vAT_JSbfj zh0~qVO3xh)xhTxg>G7p|xfOf6bO*a8%Dtm3JqBOtfG+mY?1IH`Fch0Y!F5;+>|@Dt zfmYBroz9i%OC|dIvG}c*y};>H7w58`WGou32uyM8n-%rVoI087vD`kvo%$3F=u^G( zi%uE%s_LCzb_%acr7z(Kat)GQ%E85(@o*sJOh}k9Io*7v13GFzdw~sG5wNY_)X7Ys zZRxoDiAxEcj&?1SRalV+tbYBgY-OM_P+sX=XJYGxU1s9Uftrxb?P=~MCAL`I9=5u3 zc}cllUE+3grl@~#XR6(vT(el+->Za5Wx__z{hW2F%7pc`{X=aexik{7U68Hx#py1- z+3J+u9kO%pKMZhp^i|1J6}#S0v^f25I2f2-#7fWAc+uJrwSI+S{R=)E=wH&tB(Iol zSF*wK=|!`BlfqFp7rt4#uF^WEySP{9(II8S&EayY9}K9`*gc2z>3;!Nxdz-_DEn>A zX>R%o2l#S2yVe0$`fwdtIN;2UFncv;xi~{RGlZ8-R_Aau9^eAMKsXtgK6{pJt?XvY zMgE#tvWiRC?BdLmsrY7F%{Pm4N$c60KtI+ z>^QjE>1Zl_)Ky{s+6dVA?DQ6N9q=C2={Gs$2k%1H9m5Qm{{E{1qbcpE(`%dd;kFWr zY~5=^?jUom5?vfi|5cDa3SjoQe;~wICGESxuEpu~f7)BJ{blRq4A;NyayDx*HY-k# z0h<~+Ci^?4wW)gVK=(RqI@H4vuRhtpQaAJ^fuGFB*Mw^WT0Yp z`fl{}9|P_mKgsk}mCnEEnVP zSk6(0WJMsEekb=Y5;m4jhyDekZ@VU_fBkSbGS1Nbf1m6;bpPKcI}hEzRCgY_f9duQ z9SJ1)WUM^)!E9j-SZ+MAz;^C6$=X0F@S``fKJJI~mD+{Gwdo~f-EB^!uPs(5_m3z| zO>N*u6Oukc`_W+;2V?f-A7xuPS&N%nV`J6UZKs2^^vCWWce-Y?y&vxTCz9#CkgZT$ zqsv`mu|)c>tn?Z-TV1$JIek(gmI$-N)1PgwIk9=ak1$AIy1?<0-kc z%5yU1u9UMVIbG(NuhOjtsM~owclbDUJL{LwaP^e-`U@#DD6gX2V?h7kQr~Mp|64Tt z?UXj&`zh^pZv6@BTvFwEh0>nG@d4$&l>egSvMJ9Vr)8y|9q=nkyG&^uC1)Ky<0)-A zPE_gEC#%0ZzNxCaN-X|Fp;^|_QbT`@|#oasvS zZ&v?@RNtWb`;_*6?(}^?-RA38ls2FDn&Z6Bp_KMM$5GnyE2QMKs%ILdeZD!A_Ib-x zuTg!e>X)j1Ev3zeW_ACg%16}y8P#7?{aw|!sJ>10T~Bx3Z(m9q-@%kN9XTq;tN#?$ zPgDJDN?WgM)O{JHtv^?)`wf)o^^MZj_clsSBYPgC zDF(cZp+^tezk_bnbMYXi%PeCuZDNu|9;io_kTe3hbTGy z?Rl2cmXBM1ox07Bw<+!W`cKtAr?llV=nUuc?n-H|+mF(QAFA>ob$5q9hPo|xcldnj zHb30)Pgi{brOlrRrH#+6pF`c&<2p*4Un?nXIlJ|HsN4GR2&GL=r|KJ3{~M*f|EH8T z{okp+*F2~G3rd^+2T=~8Je<QxAzZHx1Up1Q@8QB{qLr3pYI_`8*c}tO`kh_H+B2mA5z-u zzNEC_2hDee--pts&wYIsb(_EL@IP07cld*;+j1C1Y40bBk9e}VJ896@QzeKMtWUqET^=k`Bab+>;x zb(_8rrG36Qr7frPC~bKxr?lmLwYvYF(&m3Nr7fpcN_(AKe@NZk;h$3fm(=}jN_#(d z{O?e=@w@%srEZ_k-9LOr-9C@If7tCzXMVW*hrOxW`@8#xp{l$4hr?8N_YWhe+jP78 zhY9NM?jNS8?(QE-Rd@FfXR7Y*A1bKZ_}u+NLjB$S!+EN^`-dj#Hh9*>$Tf|BXygnc$e+G4XpShIwdCDkl z{RvUp^wq0=A*IcS6_hrA-1?2`{|EKISN+}k|t-quC`;_*%zM!<} zbnAo8a)#fX()u4rY5m>$;nZ#Zxzjs=x_$lvN_*d8N?ZTj`fPRgQQGH-P}=ZrJxblC zFGXqZ*GOsG1^4^6oVv}=YbXz;yq7Y){iC$$*g$E^ql?m(|9h%`Kxxzc1*HxD6{XG3 zA!j@Ddv8jc{|8c9clZ5|p#CfB?)w!{x9!qHyx!jL3=QwTUj=ph-0u4&sN4Ix@7F-x zmbd$Um#hEpDD8c3r?lyF>#eHar{UTuZN9nn7pdFl{41qR*JqTr{s*y*QQG@ODQ!E{Kxxa*tzV@2GQNj4z7l;O zizw}LHPYXv=Q2v0-Ww>byW78+x-IwF3~%q#rs3WC{nYLK9-y@Ks-4oN*L}YisoU${ zp|sb3LOJmLK2vx1{dXyI_RB*lZ9kr?`c&1=Rz0Qqa!MPYJNz}&ZM|`)=X&ZkKX0P6 z>AO?IyW?wBe|P%sReyK?MnmfujYEg{X$+hmfBdWjiwkqjzPxxa>vneoNv@PI*zlB zV<^TPN5A8Ix%m|NzTEK?<9)fON4eyHA0X|CoURs+%FSIoY83xdjJDu0lzC)q?qWL8 zg$`r*cl2Vq=8alR_p$stdhxj2#p6aT9tXxOJ}!50e(vJ&xt^?qv(6kyY0K)DDi5Z# zc|TnBY}JodeU$3sRG*;wNvcm)y;$`U)lXIZbk!G7+B$ody8BfRs$Qjfwdyg|6RIy( zeW~i_sotP^qw1Hbex>SHtA4HO*QtKJ>Z?_6R{d7h?@;|N)$dXLUezB^eVyv-RewVD zr&NDN_2*T8QFZqi<`wGpUHgklxBh{KbC=IQsN4K=m){okcb8Y6>Z2%ad2UtRU0&N% zcbC_8)!pUgNjmF=ySxTdAGo}BSKVD+d#dg(uf0`wmsh6h?(*7Cb$59kpt`%fey+N^ zyoRanF0X@CcbC_ps=LeUaMj)Am94tFypB=bU0x$pcbC^F)!pTlr@FhmoF6LE*QfBi zDyL~Db80l`D@i*L;GDc&5H&TH;J1PF({%=%!L=WfxprX3S>8Z2{ZNTOj4LP>b1L6= zIuGA+uQjsM@^+q{6P?lY$<={la=Yy`Hs`$q$=S7BaK*E1LOk@rp2M*;xwNJ{7MZLX zzd%^kuA>+*O1q?D;Mllof{Q%tIT$?Zh$|+n;^Su_YUvBY7_akK5Sz{^ZYBLQM8yxz zTu-(7z;W{w3T6*Kd8T*(%YbQ^?sOSAXvCSb&b)U1btcK_t|_vg5R?2wl74JY`lrU( zZY>ho@mqk#RnvcQg*wEXpKaWlu7--FmuV!m*FuH{~1^MFrO<;>_ANHe)6 zU_aj2PrJ4#YeF?qep9ql+Wnn$U54{!?u8i|k9!S>v%sRx+>ZvMk*KCvUHV69)8Wh> zdy>n5Im=J)(Sfry{i{{_ALotJ)GO^Ltbs30|D;vAW35dO>rCOSbU$bE;sXY;C6WGN zt$(4Ex?OzzOC}zO2jii5MLZmj@x!rw0csgOnSSp96OeSq-#@DU5hSaV{Cb`KfnY~Z z`?+ApduUeMeBrVU=Ud@SdjC&B&J5`Pb;GGHTNYUsUzX(D*kb1yUP~!$dwM>l9n)M+ zX~#I%QQ9%p?%M-2`oBbJ@ADR= z9dmz3Y5VJsDD7D8J4*YTXul=S`?|0H1$7($FiJbdI-Jt}HW))`fAdUIc`Bt%m!Hzc zAEmV6>M3n{-1>#;f3^CrrnJ|!QrhQvj52);$n;qG6m>iHe4WycJ$otbO6q@TIQN`^ zJO4gacenqS)NQ^Fs&l4mACNelq`nA+;KfRjLmd_oOHa&Mz+WS4Ax;wufQvG2{o4!s; z`yB4{zM=YN_5Xs>-hV5l&CjnXZT#-?*si)ef4)=Qv($P23`!fn`+mQmZsT#s=cR7b zF_O|g|4Ed#yxsM?h`N0)cmB;%-5vh|y>1buE&p@X|58f({MS<2^#4ZPZ=$sIp^ehk zho>m*^SJBp)2h4chFHuzfiZ&>rP(} zb^E+-{bTAj{aYw)zPW!>yWgMB>2BYvZ&VIm=6oJ^`R%5N zk(BoS?)o#Dx{crc{vJ==ro)|{iF%#8{{HZIu~hxt_1Q<=K94)SWz=o{yWgjB)!pS2 zRNbAvKw|P~q4FutWr*pE%>2uons3^~1tG3=tC`Y&u_D(J>MFxJ=gJP}qKZoYvT0mK z;+t5(@se-Bl0}u&{8m}EWKl_^qGW1hamn1s;#A4pIq|qIaL~03+I`yIGc{-N+`2km zvfzx9`?sU+cJGJV!Kw?K&$&otL}irH=BNAHj9X99-ToG>r?mCwQc64Sb?cW?xA}IZ z`d>$B%gL?Zr2fs6HvZdHy7gA-HoiYm+VX#l(!MWl-Q7+;M|WFZ&r{m_ZBY4=$}W|! zQrh@lSNX&5akqwho6`16@2Pa_XZf7(uX`@(hv$~u^|+VU+4||Or*8cVy4!SaRr#gL zf2sU8rA@!PUHOW-P49M<{$RvkGtvG*HU7$~^2z>M4y*0T*ol#He-!v>gJB{;sTdb! zMXPuoU@U#NKysqn%~!mmBgYu!6A2fs=wB{R;&l@fPU+{Ois@X3%=O_B9|P9-ZOEFa ze=(0ZWH6`jFHWY)x%g$0T>!&jrP(QKYA5-5{%5)KPcq3xoJqfLuD^;eM$*67%9Ou) zlKq3K%R|x1NrcxMt*G*cIS{E1PjXRSRh=x4#bc95O{^kjPL~OP6?ZsP)mR%A&c9*m zVV=@VhjdX}8J)LXA!nP7$&<2 zsD};DMKU({(gbrP9GI+(z?vn&DvjpJXCsPwOlqv87zFtTI%&G(Ls!cT9BPifG-f+kh1|#0;E5lK!YM zT`aAc5?N|1AJNgTwKgQT(DPNS-XfA zr^3@zQs*kr^gA$a-k>&7Q(Ij{f2X8g%eBW`Y;0E`JJ%eWY9ss`wp4@@F`nyKxztZz zYQED{rDu#zJeV{Fog$Se_NSPxD(7ET{bIXfjC*9#|ArI(Vp7S%H8L3@TRTHf& z^;h|qRQZZo4|e=LGeqz7|6aU{P*R7}oidXGlaGl@P$ zN0NJCSi#%_E$uk`X?qz=K!Kcsw!_xR@GyM@6uYF-_MJF z!=mFy--}`6`$yl4s2C0D-vN}hveZyi%y4F;A{!}t zfUVYmP%yV>&psv4pZo%k(>j*iv?1DW{VFz>~BTI-DnP6)-Trzpz* zdMw-4RFCU4M{y>Fwqsc+Rdho!13EK}^-$J`Y=a~F zX$k5~RsF%*;`iehjp2pq2P>*GNSgCig=ad((rkAx)t!gNb{-nbznoSXJi7B}{)x%@ z$5tV6-Wp_Z)|VR;H9Tw(vubSCKf{!7kol)`O$}^;+H-%I@1To`$f8 zdN1BJYlw$Nj~_I6^hiCqTh>Wrk2yXnR?F*1GM?K-!}L#VybO;D19zTkP%(NC z6`Qq^&6*H#QNxCZV>~AuIra9hfzkcLqee%x;bw@tqejQEH^Hit0lp-)$OnZZo;9O} zIaNcey3vRWkB?G^Xl|7mH#lZo_~2M}<+Omt{d;KG$N}sqM8|ngx3%twsHpznu2B}- zLHB3Jl~+^N=Xl?8i;e%l%6lwb zdB2VSgw%PKZ>;<+spr73HA-$d$qMKvqmZsjIcZcb`GX>IAs9c+9jQs3`>OIPkiS<|_%Wq(rd=gNa9 z>wCpojvYSxr2g&=QrE%OTka?I z`o~E9em|00{!Ur>9I4NL&C-?gP4}it5z8A${e2ly&#!3ZTdjOMsp(wb@=kl)jSr!$ z^{e}S_fyvEb+_zI>hIm_N7>^8Nqyc}OIIFGS?k+bq?X(Hq~_PxEEkh{eOF#?)iH@~GT7p1JvSCZ80l(BT>3O2qHsn1j0%C)TAfYkJMtgB3y=;6Rd%VA;D@Rk-=NMr*p48`e3e&RF_My}v8xp6QJ*M(Xd% zlNw)<)bd-)9(Uy?HoiHj{liXH4kNW3_b0WyyYV9_Yd&}5r`hvoTF$m~(`TNQpS66^ zaz3f)_?D$BCsEe?y4rFrsn74q>#gj*-)1XsBQ^c@Sh{kGl@D1SA@zE$e3Y_2$Iq6h zZTxvs(>d2H?{{|Q_E%55w=kb3`cQm^*_sqf#{ zGK$pux$;0ON0VCKVk})bp0a*7w?3b4&wt#WH`mgYpQWtn_6n)x;tf*o=gLbcYd&)8 z|92_t^Sbr-X3CmB-1q(1#vdd#zo%LLL}tymR=#HCf{%NDUyjuDs!8hg?;!Q}Ev($m z%3-9wcUQ|^q&}~Eejh8l@lp1?hb)KMcvp_Kay+T&Fu~H5r`UM+{?jPyd${fATpRxk zsn0#%(v{z`@ykg4-C7&(%3Ex_n_eGSc^9eQV?U|S<;n+byxYEhVdW#FeurPIoJnf> zU9xoLJWqJj%Pp@3tn9YWMJQ|k#l2p68}IhtD_YrY?{B57^>7W#x;EaG@36AlA8Jfl zzh8695F78xZ7FLyhFW&F@vhw4%5Hw?Yvq2VzV9$gR~}>ICy<){(@0IvCoG?~e93YV zsrkv3-?XxO{!%Niu;;&P>B<`^>wVn&?Xu^)?fG6S@3+4@Xz9vd+xT>Q{0B={{>{d_ z<>!=@&yiYAbItbN-<69}*7qq%>U)>7bmdAmz6z=7Ufa@@8`=1#q+Y)rsqg2?;WoZ2 zsrjI{r7K5L*82{!j3M=TMv|JpCs?}jBa}6NOeghvvq}BE+n;&H$}f}p``1am-eOXJ z_qL@gud?y(_10S1t#8-c^S4-TxACsL+sYr2`aB0L4_h9wbmPCHtk2^<-w#$kVb42h z>B{GA{AE(#C-;-y-w&d!@15Vug-N}CNlRBQYvU_eRwDIx)hz4S^ec=vt7tlY)2hvfsLUbnxcD-Wft&ok0;JgM#5M9TzH)612oT6sFD*PCPM z%Fk2QbeM1XI+^wRlbSDAlUfffw(=$$@1CD*Ww$-rVP$u|VULwRCiOm_Si17(lvRJ? zOUtiGy}v7`Q`UMogVg?%-^ROg?m6D`-TE`XmEHN1!d7XB9Y2EmOr7JI@ta;&e zQuFj%mae?i#xJ*AVVOi`t*auvbmez#{ChUu-FM{5IqU9ll~uoSYi~9f5IdSC#ngJt zz_wX~v{A(HfDvAmFJ=#(=T-b-9^p^Di}l`Xc$e?3+VtRIL!*ZG3ymJ&{SCdkdr#sK zUP5zX^Z;JMdxAI26NV4tqMa_{a>-7it|{&Fa2bU`@AJfu7)y(2S(Sr(bQw5E^~eS? z?S{SS{l@W@Ip?JbJf5}vCbb=!M{3$nv-1C`dSp-A`{k@hw!j{Dwy`<*tPc6T;JWgu;cf#_dJ?@@=iLySA zd%mkr>z;pw@mgkczvZQ?AM470wru8H7XPeXTp`{^^G9h?^G9V;pU;)6P|n)FvCO$F z<*Wzi+M>CW`%D`0IG=?#G%m+(X>M(qM&{zM?-x~%4DN{$FJA7 ze%BXe8-{cCMcJLla`r_T#bau7Jr4h5 zACzl(y>2QCuJ-AQJ<8NjE{nAL;ewl|4tv2 zTX_B-^+BorCtV+uM;Uf))aPPjl^c1Hvk%G|Ja#*pq7~YpJzSrZp$w}(N{K`iT$}ea z*Pqo_WH9*vrXYJCk<%&9fclA)+2$GYdAx`PScIH?NU9&nWmt|CSdWdkUf+`Y80XsD zSKpFHu#la7_4TN}9nayi(Mhddh`?)Df{Rdt3NK+HE~;^bN^Gm}Pxkre`uNMzgzI79vw+8eUSryy;M%ylNPx7+fDRfeepDB9@|FpyzHf6f2N~Z}AGLD8F6(N%jMMPdMM1f*4rG^tqmm?GVi~^`UH#c2G(FLlJNm{V3$$fopO<7_%hDq=C}r_tZOsW2Pgeb zRzx7GAPDNS(wB#RsZax<@TJoK7<>olhYGjj2>yw_zLM$Z>x2IdeSW=8zh3I|>%;7Q zbop}m4yi9D>uV{1t49)u1SO*+jALMDFmW1Lhwg@QFjPr`-0B6A3aP2*&id!N^%vB;b*k0%>Dib6l9*V<^D?;~CvIc?i07)Zzkmzyqf9kEGDcz&5-}5lt8+Y$RGdI2{Lo1P|Lt5i z3*x=;EYw%9`UhSJ^$RSn58(UmV4oAKuobVp!L}9enr)=)G(qfh48axVVR3!QwqqOL z9`PoEc|H=A`AwxE8si-#Ap>kq>7$iti9U$Hd0d7sABzZzqBOdrCw@Z)*wkjJlb=Ny zp$J1Bj(ugb3E)^!a+@beIg0Oa(lp}ON=BH|^*BGho{%?L#HKE*>Q zOIu{`TRfezAL_GvD7pl)4~6E;6OvMe-xB`YJf*7fy)g^(un>#jtHm_IE&Ns$5pE`u zlkhQ8Ft!2v)A$By@S9}TWqw@cx04S1UU!43#Cfs5-#4!>Ai$Rk`OyGP5R63DW$JTx zfvLv2tU5X)dtbYMr*B*JZ|nP%{tdB>^_KVoygu5RFfX-6Pv)HmaRuzA`Of8Gp2BN+ zJv+(WD4fqzk(6HOi*V+l;h4nyBm2#J%nPDE*Ce$#t7Kd(!F+-%CjSlW;-G_>PD+wV zAtl2UzmfG7Dwz(XL?9B0cu~o`vlKb|rvHY=(llSu5Ul#BuZT(*#yqwi-2z#5&=Y+z z7tdfd*5ZU|!8|DUngdnXXGFPbp2=hap29154Xcn`o%Jw^)#7*z>Px*Yg3uR<_!$?W zKGoHS`arlo)Dszg4h!*L=|kPeHoYuv#w|!@+ns{RcX-}fz_B`fi&>|_w}eFruJ7#< zECV+ogn4%s7Bb(uzM`}Gh%WT!eIhsDIobO}?m#&lJ>jE&&USc%?V|d`yo-4?3=cDp zPC^Rvs9XYv6}}S8qc>uMNzTtWJk0z!5tEUCZ;P-V!%3WiP8xTD`sSO69n1rJaSeX_ z63D!VP=4pmc+`B&Z~X&S^P9@<>iiu_@tc-MAgUm;HuDxnVJy@Ke0c<-GSsL0SojLk zPc$kS^%)yeh3Rk`eL^A*@rYzu9)Z2=E2vM;IHpBB#$YT`%yg!Slwx{RLB4#P*F+hV zM{@)tCO^{!BbYWLaUbh<8Ex7YX5EZ_=#Ny>vIyHt^h7W8Lw}4z0$LXJv?Zk<`Xdgb zF&+sR$~s{f_M1=0&u}a22dQCdkeJ$!@LK8Gc zM}#5)AMqQ1k5?-4_qYT<2Jo9prU~PBmuZ-R`PDpY$W2Jbc6?mj^9z}Q3bk0j;5OWg zaCF7++APx;fq0C=B&65j{ZWo(vH~h12z6LCB^BRc6U*jyEuU{PUEX3oLInCD9ux6A zDlF#xaVws{W%!ZEJhub;@rCBUrEFsnVSLNj|3C;r;rg6>kl_g2c8%i*%w^es8L3cz z^NG3sV_)-u%+KmGJ=oM_UtD~d^hu2%JdN9!N2@}W6Y3xct&nwbiTSd#=|;+UOu%Jx zka^~Fyu>^(AH7SmKE>-;j7#t%s}di_W@9-POTbFzm9v^>*d{E;mnM*HLSIB;A`+0j zFVBUPS0I&n=oGFp56OFh93vx~dE|b~G(T41+zei=#(aj&*oqz4hZG#ecjiaZj~>-M z-I!;3A&z-OCL;kSa1!;IN2D$5?=b9O-uMWqZ}2);_!irB1TEp15$U*$$fbNgBw`;@ z@CCj>8Y20vA4VcRz*k5^@^a2+AQKm{@-W*qe1yvwdWm@)A?$;6Lk~otJo7;XM6!-g z(0abG*T;QRQhnU_g!;H2hXlAj?jwuQ-z^eLupa~UnO(Obd6GVtQ37>Q-?Stp*xW@* zdvg!j89ht{DdWw<$ZYHNI24H%g#BLU1?KcWy)a&8^0~TpfY=JQ1XX6yQ8N z`kH11StlXPbSHZt9%C`GFo~M1E2Wv~Ov)3?^K3-QfnUkIDbF%* zzJm4UC+5l1*k8@_Eh)$F1M)KeNg)(Q4RbFkolO_A8zK;iXYo8%nysYlM+)NVcoIl? zzdqY;M84(oMPc@0&W~d*=3yb0;*tqqp38@VD29?KgFsY64b;Wz%N&ov$2=2?`=LH@ zUEk{Jn>+vuGwFL8tFQ&zkb(n9LlD2a+<_KoWkSf-XoGg>0QIpPhVJNzzKDeDb9o%Y z6U-!XG7_P_n4iQP%)?9g9)1KcZ{@-rXohgy2jA%cUm$|e2u&~%iFg_du>-rX7wO1^ z?+o7oA?7afJTBr2bkV#e!Z8S!;YYwZ=6T$JQYd4}ky75=Ojbl7s-gyJp^gb68=w(F z&<nZGJTOj+)Rg%-jzU3?v zE3g4uk<2=LH%{XmKC157N6IPIv8Pd;c~$C|hsZ&=gLQ9ne9SsmMllaRj0NT?=G&*S z%v>NZBAs>VIn-rcSr3V<8`ohAwj#9z{hlKe7vU=z;A@D+XoE!Tf$P&bu?&9?*LSlo zmcHf@j>(vV1^Ayn(Y-#=Gk**4oy3rn0luLKVIFUTtP2Uuhb2vEQp%c}NU2~dkx~uS zQQOod>!G39z-6lZch#7@p_nzCy|%u$Rg%#S%KByQc0F^Y$GJmWL45B z!ucaJg_MAzp6|&FoMhkU0&Zb{ry^FC=UhH6Fz;W)4{R&WVk4hzGtRJ$xCCEyPiQT+ zS?G;;jKQ;b0qe0Dd$1P=(1K;-F1+v-`)7EDd4BykJmycyBKfgP=Arga>?5n(r z#YjRT`zi~NjPG#*=a9%g$~?S?SFjXGNMKo&aF)$6*k`^Z4G)nUEoD58?WTk6}0# zsrVI{I1ArUwh0JFFFb%K^v76C!W{TEvFsua6Oo7+n2Q(j3SNirN4A65jYHU)=}9Ng zqVP$kFDjpA*+pYBiIius06Wb`{`J8nTO1R)qNGEYk)^K+Z3Jg+Us6zv0i-yC2& z4d3ShzQ@1hm>3JN2uY~JyipI6k$@C@iVN@y^M-Wdw+}-be%rQ4H6^&HT@HzO6v-y= z{an69`*Zo;|ElR&3g7ptjxpb$LF|=R!mFrm14fb1Evotk!4uVz;|EsN4|5;>ufG-~kpd2coGOFM%2blh!;0(^;CZ>Bu1fn{EOarnNLeL4}=!tA-KYJ`YJB5%u&68 zixZyaWDA_9C653zt{({g{3O@hQ{jGn~f- z`1tOHQOVRG>!CjGz`Z7d9Ezv#JW}yJRx)p=pUCBlWM4>Tm<&>`=4ZO#Q>Lw4W7^6X zrmf^*8IVWKIL`IRT&D2`Y{pg%GhH{~Q=C91uHhc0ac9(H8p{c$aR!oDCggpr$F(JV z4m2#pHW+ssUs2{01feN>#VI2Qy|Ax@r)^2rBWQl3r!UKllxLkIzH&T{`TTYg$!{?b zgD@CF@FeD99-hVvScs)augLF#kQk0D@hi*FNu+BKrr0)FNB72nRI@;6DWF-eMkhG5u`k9-Xxdd z9VB4`wqiT>VjohV3iVwOhj@&`1SH}S%*C_tb1qW0ux#!|x5A!0tm|Zo*~+m;GM?x6 zl5l>j`>~N_ZY$mkC6URpcLlro?e^j<&Y?ETo($%<9Ew*0Sl=PB81p}tV+B@Xm9jY3 zPtc*HXFr*O-u(6wi75DPVm*n1rU-c>N}~+Qp%I$kPBce*grgT$GGE9sesjshNt|Ze zb?^yZe>Ur26y+tJ~kzY(~7!LlxW%n?$Gmi3e-rIIPmx>~j|Z|ujtoU4&Zn2bwoBPE$_q|~eJi6Es5 z^H3jLWuEaPnR#U!QgHyEnuFvQIE6F#;Ib#=D(elTm}{gTaU4HRz(mZ#6L<>G;8{G6 zMR*;numhpY;c(V!Urd{-I8cO8R=k$^AEXg>Q`OvenYKoT}$Gq#%jWD35-SNPGK zCoiBW-&w+0){?5^{#QRpcP=gE3*>9Mex>eQ?cFcs`Y9^6#=B3;^;1-X@_3e7*H2OA zd!>B0QFi?lm3Y6DuQ_GcPtlL-OZiyc`dmLn;hReNx>I)j6#2H6^07PWbNv*ROD^T> zMcMUJl>R{}UvJ8;pQ4pJOZkRScKsCjKJ=dN`YGD;k=MSu>!&D{veq)LpQ3civnjiN zitbMJKCkPiDDV^Selpi@RPv{#RF%=^`ib%#^q%kfiTeCdDPIf5yMChH|J-|j*H2V3 zWlay)Pt*%vmQq!6pX(>8z!9cD<<`*mjKT!0HOb^5e2#OtfDQa!o3Ir-@HAiWS*U(j z&g=NDo`X9t_*icCk1zw*yZ=n}B~>463fKKr?@#9u-Th#0-+3YDzI8uE&hz5Bze4qL z-1%|UW6gg2?~W65?l-G`RxPNG)>w?kOVE87|MYzqn<}v%VLl+;eHb4zoQmxCW2965 z1=;V%xI#HsWlw%m3gJeSHaC&C;5Ji@lp5xCvJUE@A)1;NWH8#HBRZR@A?uf9*t>kA>AQyGp#ybN8(kHrW~$K!C<$+SOoz3rOYPjc7KbUw8= zbY4dLOzymlkL_MQ+=#NM>}MH4YxIWd+lC?M@&A8$dsyT@p4ZWN#Wd)6B?13L{oU=K zv8_SggVeu6ArwU^l)=rYh^A!KkV zqcg%0gE-8f$4nxnIoE)trBU5;X&>mB zOv;m{U=^;RqOiH0l<4Z7p`;8qv80SJ@uZA4s@o<%n4d^FVSXhg!#v8DkjKmnQf8Sa zNO{uCCFLpe3@Oi<7fAWSd_~GtQ-ys&scNc|Qqy!NrKjml%7dn05Yr2VO;J*co06oI zHf2e<$y6YvA}XQPRZlt2g-T;{Cn?QL3sPE{5K`_ky4OflH&uF@2TAE`3bG7KOVfuG z)jgK}Cc?-5GlH2ULzBfXZN{b-yj z$o?E$JswxT_+nvB9U-`w=PQl}WMQDUpMU2PrVm`b>S#WT9h zJJ8egC#5K#QFM$d?*1WNlanL7cRIesF~qSg7>SKO&rLigx0q(6vaqDFN; zrLtM!<1@gQ&%5sEu2UYNEXDcF#2x49T(jsN7Aeeo7RT+Vi%1N>Lx_dDzs=p}v6(G5lh5ubF5+Pi+gh`kE6MR(;lgYCo?R^RBr4 zJ$HY<&Xt}*Aiv=~aQAzRVE9uUG{?#B;qDvIeP~zUHzoM(>vzPoCXK)sm zjE{MwG|HRXNU32$$ewWL$#p(qI%Y!W6&B({=w5}UXlc}bfT;a|D5xH*u7yv-6PSa! zcp6Kv3@fqPyhpCbX5;Fwe@*!a(r^@+I0>D2aQRHJ+Rb&rO-o|l((XAu-f3EYSpxE(>b0}ap!P0`XkNcKSlqTufDn98tB!z?_B zxp)fC;zhiKSIn#A0=$klumsES4%Q>p{Ly{+x*uP4j79Z~b$zmrarfc7>s-@#{0TgX zxp)douncRk7VELu93ivcXYcBR>zriH`|DNb&edmj_3qsDG+ir=!UU*3^E5n%m#_+J zuo0V0GPw)fhT#js9cX|Mw8s=Yf=7+ci|f97oezH-@>Iz{Ai83)$y3hkitrBksGst=z8)q6V*AJNF*z2p6#821Z)gX+qih3d<>>n=JUuoeGZkN-ymvQ9&SnM=NcfAYM5&I$aL z^8tV7Jb>;4Qa!_e`aYm~b=i(1ZxFkDsEzOxL@8c?TP*CJ8Ry(MK+u`nGh+#MZswcJ($5D1M&x6i? z%z(~&{L%RioyQMY!oDx^B0mbD2yTV$yNSmmSc6kI57mhm)mhOs-9k$_RzwimBN7ww zC{{!D_#RoL+xc`Zzm(?d8vmucKR#rWH5#PQ}=Bq=HhxH79thC++O`c z)wc-2UFZnaHyn*b=zh+HaQDTfFs$=ux}P)W`Lmq$6aTB{)2>&q@p{*teAKzhivp$) z*$7Q=Ct4WYQ>yzpR6lYI5}|sMIqPxhezwwZ_y6Rq*X%3Av_J{mh|(yFo1pp=k(h`? zynq57EazLA{u#Z(`o3fy&JcRg73GH!L5Y&JH%aYR=v=XP~A|Oiq+VL9dPwT zzh+pn*AuP9buL}+3c+8g=eC6Bsb1+f_`CH;TT&lIT>UuJ8;yeMc{M}_+ym8_(Dm{} zBw+`3LUl<+^+?~r=lBY$M_Lc6ODc(223PMw_3u>g#a-`I{g+yB=Y>_@^v|x#*Sm@7 zWLlGwy*@`O<)h|1QdDnB3gZqmGvTB>h?!6w99ap~cghsKGoa*q1>hGLFF3w>|9=Pk94H$Oy40KU2d;LURAI^mCm(sP*)@Tn`Z_(Wc z&U4?y!yDRhg%OJXoLR9UjO!A=jUU+`YyW9K%R!~Gf zz3lZLu6Mm!_vh$(wYyI1>dUz6wXWWbtB0lwY=2ZA`2WT02-&Y6xa--jo>3F(6sew( z>KBQw_pgBJ8J&Qxcb~wYUH^CWtKIbpS1;**?lbZ3GvNp$s~&^y57hO1cVCmMzw7Eb zy7pe!!N{s#%eEFUkGg+KQRRavs+CxuOZmcpd4sm)TH z6m7~xn-I~aKv>mh(JEL}g+o~NWnmSkDjmMcrV1%lO?6Ugnp&jPG4)8PZyJ!&$TT7E zL^IQZlvXB$l)Fq@Qrerl$&Tn`LP-fT_mR@YbR(sQ=|#!|rVl9*CW@5)W*{kpOf)G& z&2Um;%?MKB&1h1_nhB&#G?U3hOf}O;VYQv*334``GS8CoB3{O;W)Uf`n>R^WVwRE1 zvBI#r*DBxlu6d7?_1J*T*os}|LsC9A`$%qJ;@2L!kCMq=V^5N+%OaN*J=&iy6VS z5m6f#qBbtX)sLCWu)Gb|{_+8a58^P?7M6Tvj*yaOj*{}7IZnzC<|k54m|scBz-g$? zja)F7NwuXDl!s*(QKmmB1I-{(qRmiJhMQPYMwoa~Mw_vuj5iOHGRY*6GR3G3Fqv)U zkTTCaP0F+8c~V|9FOxFgEFfi(d7YFu&0MAQ5^P$N(#EtSrGx26N+%OaN|?EilrE+lDLqUtQXVjUNQp2}r1UofNf~6KNf~N} zlM-u2kP>f3lQPzfC*@%?iIfC0g_Nmg8Y$DwOi~^2l#OOHDO=4pQns6&r0g~ylJb$+M@ou0K+31)ASs8< z7o>b;j*yaOj*{}7IZnzC<|k54m|scBFegblZO)Q%-drT*vbjo%ANebBT>z>-8i?u$ zLKB3b9m3HAkr;$HOhO{2V=kV@LM+Bgyo>j+4!>8AbT^Nu!qp=^%y2q>K=yj1=P4Je z>?uYT$Bm{QDGg0iQd*!T+M^>nn@33rs?D;6C^L|J2!qWKQq-21sNE>nc9hx{8w1rZ zonoevGR;gUWu|$Yl-XtuDf7(Jq&#b$C*?)+GAZ-T0#X*4*GYNPEGA{CSx(9dlSIlY zvxbzlW*sT(%|=o-o2{g5GuuhoX?BzHq4|iEeI|vJ1Ljjw4w}QHd||#K<%mfm<*50N z)b+hzjOzNzX>+~$zO6ZCmo}yyDIH8lQaYJXQo_uAq;xUeNaI>ZH^( zwMeOB>XG%)z%(MIiD^nobJLQPVAGnEHl`gZ9ZW}3I+;*X!pwc7bTQpX>0x@2@_^|> zN`#3brN0?S${-U>%1|?$lvp!@9ES;JA}I-G3Mo^~G*YG;wH+s_YcBJQ+O&BV&zl!X zdD+Y-Wr0~l%IoG$QWl$~q$HWOq^vXRN!e&Nld{!pBW1hULyE2y%K?-9zOREkcG!GD zitZ_tzgu74)st6y)T$@%?vMYo`@vj$2Fc~Tdhd}jUcLA7oVaL!&ghEn7=%agGTy^_ zY&4rmSI<3#;h&NFpjWTG38{MPL-80EU;{qIZ^+Mykz3Im-4TmfP(AnT_1lk9&R)O0 z!r}i|zr7pf?DgB{P|jYzUF}?}j{6_gbHA07E2`(tY0#{8t*3I#GZXVTX4s6aW*hkd z)ThBt>^3FxaTy1lpmx{d%pvk?q~RETz>oMD>aVC|eoqj258lE`oWN=5esd{Pfa3#H zKowL)b<~8~FYE=i^XBe@+{^G$sND_qgQRxfTA&rw_S=0>yKnu_A5$^H&iVLu1NccRGdf>Yrh+Ng+SOA@ezz2KBpe8uh8GCk@dI9ncx8%)8_!?1AoqEJxkFo6yKK zA*HElMFvCtdpwHAFdehu`u9*j4!exnSZ#&w=!L$BL_Z9`APmO{jKU+BjXCBeaz4}! zq1t4=fjV!xpZ5+l#Qjja@gotBckwA)d*Owt3s)5GzTasKKL+)MAc53<%iex?S?ar~ z9p`Sy*{Po}x^GzR{N_PJw8c=wL+!*qf<;h!aNk4iCf-J!HnkV4_B}trXZR7n znlq%Rtq!%9m3#}wE=UdJ{4X+UbNmC>zF~SD#^d%Njt`)Ia9%>}TV6eWwHG%DYC~rM zGI0{QmU!}!QrJ`>tE0A2d#+RPE_Oogd!B^aq>yS$Suddj)Xr-nreY0}aop5g=C%9U zhLn4u_Fo^yB&;;6$#=01?_&$LVw*WZX5cK;zTJ1rS;yiR{0jBEBfe|=)(C{!15z8Z zlAg;mCO7r}5kQ@f+{lZ3D1ze1-hOm2<>OHMT(=eV+TGB7|8K+HC)~a`*QfCara|pO z=E9w558Zby@fZcQ;q?esVgua$*t&?73)P|a_}W43cf=dD%l8P@AQ`TGBG=A9?Hi~+ z0@rSi?p>BNsQoWp984X;yEW|?*TKvpbGDE2Jdd5GPQ^Ls;$i@D zn}(#jZ~QKXLmGNIkh*U?a|mq$A&3iZjp5q)xG&ag=R@r*J_WV;Aggh8Xm_otiWBLFdsk{ts0{_hGDdMl$4i|z5S`b+D?+Y&t2`0G=}c| zmtT;fJVqk*N3R{Vw(O&+T_sg$&p<5}X=#C0m}n-G^0rw;%3*V!6xVM_zI-$VjkbZF z`$?IAiI{~aP_D8kglvmWW-j>*Uc$>*XkI7fE%Od3`;mfA%x9#Wf%+c_tit(TOf>3; zWDUN?QLL-#*+z=%k0iDl>v$wrXMY2`aU7ZO!&j5-4_?G!e2vSv2LJ7x7h+E0mG{Xe36Da73e;rg3! z_3_)VFCnhJ{5ZDZs`p--ZTJw3GcS{>&pv{AO%lvp@)b;E8$SuIUUv5S)T&dRy*{<- zRI48Kt5E&vYbd?YbKwoPeNdffQT=Cm1*!*Kb}_3c#2M9r7S~?M1%@xe)kpq*saF>{ zj%}}~uCSbj>ItjfuiDd8-QTSGzswVHcohqfnE&_NCvo+_u2;Y7diA(my(3rONOg+D z)f4LLV?ITsVVA`xN#H`M2^{NC}dj(Oej?ly*Xyt~i*-tn#a>vhMs ztr`Bi$G4C0H}3d$8^iASb`Qfkw!Pl*t&VZs@og}}(i%F>4K+Hx?T(zsx5+#vI;IsJ z&$?sUoX52xjQcCcwK}$S$F*A-79H2h$Ix-DJD$~XYyjMGY-@&f9IHNJCHrx!j$Pex z>n99nKW_b}k5hGgIvI)hE61sIO0aE&`V?$}rf7zi(D7?eWIuk*e!Qw<)@gVQI(8Ku zvr6{kR`qwLJf?Qm-0^Vk3f}Rsj)@zi8CsaTNXdSjJcaUWcoR#o6s{e0 z9XHF5_zAz74Duvuvu$mF#>jbGoz7$5;`ffPU3=8okFUQDWS`3%C;#ktyH3!5Jl@tZ z_uoCr4u=2iIQzb(-f{LLq>i)YJ*>wjY)1Cu?z+p^U%(w`gvQ8z9Ij*W ziRP~!hyTL!e}#_0<@j>XkEG~W{J+!jcmT)P@<+$xQy9Mn?_oWzcU)epB<(vu$LHCP z%coF&4_n}l%hmRu)Z^H@J{p?FUPKLAq-2-_OvX$ z`IX9Y{vTCQ9cuTu9>@Gm(A19q)xKd1=$K!0tS_Iz9q)g|u#Wj9`|cUWwIMgSAk5!GHC_%_edSBJ**)flORP za(<56@K8bagYi8wa0VCgP$3@2_sGCQg(+hs)GyBWIE9DU$BD%_Ovd-ffNSsiA@*O? z-u3rT{|Dh58}>pfzCa-R9Ssn|K0rsz#fymM9Jc!Pb@lJl*}kjaUe~Xs>$kT(+v+f+ zLVZXjvYpM|UzGZn>xGq2e`FzS@6-=jIC>#2&@+l0k3`HwIOiW8!8FW7_;Ag1s z%Q4ltUXH7^J=eP*;Hmmtr-k}cuZg>%exh7|ril#CgzMKd@GYJPcOQZJjcSBcxc3U&i-A=5op?!ST*b$REHtKZIZ$)MudjZaA8Y^9~5)9IyKIz21Ea3-fT! z0X++FuNlT80j_@r*KT~7f?oep*K0pMgmc4cn|Tr@V?NZcgZgvGfcl?`fa`zC_2=N) znRo3tyZ)$dDbD?UxDQ>i6KYr1^)r;o_DTJ=G-lfpj8uGqqfq}3uAhf+*6nIHJr!Rd zob_@qB;!M<{rTodXFaU`7F_$XuHAIkKKDY_Uuy3;ob{91yG+JsP(Om|hr#u`;Mxhz z*}p;}*PWk(YX{S{4;}d_(**kubKDBoE^+3!d_QC!^V-GS{Uh5^xOUdnp7e68KoV9# z?Mth@;yS1YwOi~v>Gi+h+L^84V}BSAn1@Me#xg1`%*)&pBjp1<6-jAlCXq7R6sW>^ zMHDhMNg2#CBty(FQesRTDI?7&Qg)i}N%_(IOv*3jH&Uk7^h_gVx|vDJ<7PG~bId$a zo;J^t^1S(+lrPN{Qf{s5xs8-+rUof@nQo-?Fuh25z!V5#x}lIMLP{}Hf|OFG3@PPI zc~WjM!B;tMM%ingMx-<`O-X5PT9OiMT9eYobReadd4QBYrU2_8X>J}MCBpP0MgLVo z0v2F}8JC;&G7>QrkDJ+~yk>&(a$JfY=!wVi1m>DOWC~8;H=IRYwu3ht*Unb4{9G49 zC)|tG*ow=zg1QB`UWQ=vAlU~IW+)kpId~qfovud1coOsQ6qcG*q^!YOY`{kB z#4db@y-2|!e2%a1jX6dhhaWz+*Lh4~vKUI@2Glh5Noi=BkkSmz(bBXb+oL1yL1%>H ze)L2i6G0BdSR~?6^CT%xnWdzxGVhYI0UNQ)>?LJCQg8riIELdmg$tljfh>7QDT-n! zi5pPU)F-8(X+}0jJG4hf+=I^Oik^4?ea!%JAjV+|9yO1XvoX&+N4|iU&3sZ8;x)X9 z#aNCN*nrL0j-B|>>?c!j0Eh57j^i@?D9S#Tlr%L-X@=%#XF8J78C}uCJU~8(zKFm8 z3`88pV78e@%2M+#DI2g6JI#lr?8j#~jIWVqj*-WaY0i*-6lI@KN}6`0bTr{)7Yx8a zB$`J_c^)rfwb?|<7Hq|Ce29;*9|z50Qqpl8nK+5F@D*bkq7@!QBBq*Yq&#lkAmuHy zh1`mrW;ZD*=1cM`q{EN9*`CU9#Nh?AnUsCzE7Ff$B|Lk`kFg&q=y-#tGZ}^+rWYxF z5rLWJNpcQWnfJ(b*lM9Z`gao{V1vrQExCTGwv#+oK7vV=4 z_T?+034+lT5g2YpkTMDh_y%eC85y_)KV18V<+-L*3FDD~t1F4OAXn|m~ zMjON+7Ne1Xw~>UsNWoV)f}1(MxCIer5;+;OFb6MT0p39pQs75u1%4MKm^0*M+{rOW zGu(rFF%xsJ5u30FDYy(j%CM0vi;Ad(_UM4l2t!ZPo0JDlUs5I`0c*`pQa-~$d~Gtx zlQ?Vqq!bQh`-t077m7Ot91^e#`|u^w&~+)_1(T3~{pL&Z2>hnWGF}Ir5r*D)0Ne2;&cnBy<46=hag;z= zR6=!AkCb7E#c#;KCHV2iVSW$n#$H^3{{p|^C7zEj;Ya?>zjJ5d3Z;a|fe4A}|;Uc+9LKWh4B^$2o`mC}Cf?v_eOOp%)^s5L@vBe#UwD(U@}` zccMFbARc4!6kfo5EWt|n(Xj}h4{NX$r*RQAit@Xl86t}D9J7p+caVhDxPls-BdLep zh{Y@<;bWxXJpAa)xs&@a29x313*OFf3VuQcF2RpRoKumz5r(lyK)N|g`f&s2?d2{c zV7i$}%9G|*QkEeJCy;?l@FNfB_@yX{p(JiVO;ewghNc-Q?a&?_aSu8p4ELcsdg4J0 zz(5Q~EJnkR2RTP1{g8k?NWqsXb4}nqtiw0(qaEjv!q6KL7>)#Nz*g*q9~C&qbTewB z9y-8}7MychfYZ2!{G8h_fI=vYQl=~^jZIUs89E>gy|DmGuoR!;3mk_ZcXQ4^46h>z z7vV>t3M2}0ZeN<1_GB1_BNlTp4@=BC(vSR{6O%%w3E33QO)FCFMi_b{0uPyJQs$Va zNO=(puncKjFSrOlN^;IknxiFpBMGap6{m0wFID0Bh`r4-noL03s=QY{rZ@a>?P7Ot zNVyHulZHq9gZK_ZSbrhH3?YYOtJzDY;5TI89QdE9EMl2Qxx5Q8T% z7k<<^%HwE-VBCXHgk#RP%^%sGSYrvJ7j(#CByhh+4&=V-r_L)xc4W1 zNAyM?L?Z4NuJ=I=ue5?6d4BT*l2XM~C99!^X+X-IrWq+M&>C&f9(S92NV(U9lhVa> zBfF!g=}pRmrY|XxravhI@eqcZcv8lhNu(s0S){yzg?Pg(BV`jZa0>nm*5jG{PIv|j zkc5>;HmRhXgCFmlWSK_pQ`E0V3k0Jh!f-z#@DTj?{2X;i@hdWL6@H98&vJz?k%nK8 zfs^o~$OT>>cOwkF5rG+)gLjaG)$pV1CB`ELv6zGe%)}gQF}uip_!?>W2^qKuKc2qq z`H0NGCHVd9AJE5`AI)f+D;O2&SGN*gqyNz)9Hnxh|2&UhBB@x|iT=34u#!Hx{G6!C zr0%ny1}t=#A{)#`W=~1Rc05C!MESjT`GfOu9su_s2C>N5KL2k#mVrySg1_4?zpnuG zO%Z}WYj1xK&&gAe^YCbC!b$0gD2&Aaw71VW{K6b-p*a4hy?xH>a8C8Vdwcusig6Ad z|3rKH|EJs8_m$*)E$2e-K`6q}9X(BNvd{lw?@r*X9{WCypF$X3m^B=YRg^`v3mF3n>_hzp9V^U)481f4}@QnKx~Qzp`)s0Y_8+f#%rT ze)%^rANogq@lUVF94kT}_cZ4C?neeDVltjXCZ=IJW+Mv=u^7v+0xPi!YoMO((!iRK z>eoKO9wXJSJ=gZ8UwfGh=6Nxi`N0+V1(Bzid!5KO4iymkwyS5mgnsQ~nIn{6Y&-dP z^kdJS!dxf5!k+eF@5>u@KU|NSZD0DaujXsB5&E%j=5i6{9E;&Vl*XYr0tu*$s;Gf1 z>`njmzq{YM`m6UvKRkjA%*H${!dqC5ckv-U#%k~gaA=hI5mZK1)I$R_L}Ro;GP)oQ z+muEBoPO)c`}6q>5$5`;AQ6{>$<0XZ;>@?f*nx?|EUr^S`&>d2F9^HPSsBp}%=Sea!#te&r>Zqmj_B`}g{EZ)9#| zkNb2pKd>JTKm}C9aj0ZfNI4O;a2n1)U8_&Znbwk&v+NvF+MpfI#d)~E+LO}JI+N1H zx{}fj-Oy$%%a;QsAJvdsITvAB<1>&Q8}dC!2E#>wJp3(q#d8vr4u@1e_l6-p^Ob9Wd+{HNB9_L z$MJR8ZYk6P^}^NE0LeG_4yPZawaE;wY%4Yn6YbWz}$1*I(R&2u#t1*Sw1G?H=aw*neEiRtQby$P7 z$iWZzhR;_LM_t7cILZ=9X^s{+3$2li^Kb#$qbs_hm-QyEM3G#6UmSqqC~2igDUCx= z4o9N`641c9k^4N;XN0_aXVVFEo_6=F%z>f7fFY53q}F~!a)!}~ru zp)|&b8H7qj^O7Y1${8X8n8`nq-`_XWogE-;TBkDjmt5{Ll}=o@i??-#DQqS zHoQ4f(GS0HOm-`pR^Wai*HSC-JK~3$Z2xg}Zysm-WM^E-&qp(RfcJriu&!^^gqi%E zFydqOHE;>XrMiNravq+N5qZusNg2F<)SYZ&$DnjEo+nsiUz4&EyYMsHQrUK3R4V%u z@*}oln++_*b_MOUt;9`Mgl*t{INajNBT)_&aGKR7rH;)e7hn;VU>TO<1FXWMam+O# zoo(rZxQcD4B(ZIjHONIbwtc;EEpA1mB2RVfhhiv!15w6~Adf_O9FG&M3MnUA4N~f% zKF+q*WE-@zQRE%C4-aBICg3qVjwkUHCgE8;kEK|FckrHlK>i55X%|N+RKRhlij!~) z2H+vQj8Cu*l`HX>;B1V?*U%gPG)zYp=HVAGSrWM#skpof$BZxsIw>X>k(1aCqB&Zi z4X(lUxDO8?7hm!ouo1~@o6kiW9>l}=5!$)<06Ex>{S%`OBM(P{)h5qCBQ!?(Db%;& zeoR0XK1ZY$e=}4=OC(zgIS`|ei7e!vO12@9{v`VysLFQ!B-F+ksB1T{4ZjIV)X=rV za@$Gf;tRH&vcbM1zsC;j#2IW;8{;P2j?ox{bc{!atsr;c2DY&`VsXi+#%zn^1GXEh z@fm(V1GWo|(cH$fEs*5poUaQlMDi0N?=b&`6VU^`(Fa2?6r(W(&tW69Xh{<^x5#@O zUxpSg$^D4WVr*;b;VN8<>oEkwFdXeZi+YCR<5GiTA_qGV`Gxz6TksLG@eOh; zvX%Kl#GxgU(Ge*afpk2JOuPUstaAP~uE$kK#jQxgNTg#H=3oJq;S*$I19GqxT9oB( z+>5txVglP3M6!8)Z6#Sid8Z2BBXMM0q#~DiN$cgCx6jT?Y`6RAo%#PR=xVo+GQb`q zWs*Hj$~3%+*KH0dzqda>>Ht1_+W)ovdY$vv5PQ3SA1T9whOnQna|Op^Pxkl!%KiMf zgn#VcYk$5u&c*q-1Ospz?!*}AoW+Bna}}#W=PF(YoqxCxI`?oBbbjGD=v=^0pmP9s z;`crmg#G)lAK!)dg|Hv5bN&v6&g-jyL<{@(8I0w>Z9l&e?+H4;Q2YDZ*VjIN*q_&a z{H6AL`}5kD*FOC2_TTIC{|(XDI+N1Hx{`m#{`|A0*&d>Bzy9ypuji#0kqk>?TO#_; zlBf#3Z`8D|q(pd)h%QQo#eRK3U$@_Z>?@wi)c;u8TQ^cJMGsts{!kBOIo;}$(hyD16zY#W z*d8NgA|_#~eMQPfe2edGGa33PpTwNjX*eC9nffJ5jYM7}P#@z;P%mT2-^ch3#^+7p zJrP6fW%3oghSxD0S*SUcmlsaOX;9DN(6{&&E)TG8NckR{@RNQ1G@l=^9$(>WY{a*w zKEa_^u=)k7CvfNs{34fM#dK6ZG%EB19?V$O2ly4tf%*Zf53r~Ya1GSLsW{!T$#p1t zILB$A{=bdU1bfm4SbcxbKoXjuxvBr}i#Ovme(ZR!hL3-!?ejqDjx zp2PE)W(h}fObL}u{ex?uj>Yy7ZpgfjB$@gMi~0z^ht*h%&_}p#Ip(&|9v$$2sb8=( zvMHpzU@wyr`T^fV-Tu9}-+p3_Nd18G_W?eg&v}i|7)>nn`3-%2)xWnVLjPWUw3m~t z0oe$bSPCh(+HIsfj)~x@pEqyx3@Ojy1*iw6Ot%k7`Nj6NFJ|bwn}1$vET1JpAKrtC zvHyuZou}GWoX<^AuT9x}Aln6K{%SjZC>fQ19!qmr1_AI)dY zs=#^Dn1i`kiskqeYw;a6VJCK>Swhr#q}+^KF$$xRfh_2QW)b|}JXu+;FOR*MCrje? z&2To_Aa!JCwziOWBKQTY{XZN+<+xfQKbWZUirW696tfbfl(bT$l(slh4zn_(9ARZiDQCx!Qr;3sInFAPQrW7K zQq8K9Qo|BSsb%%Z`e=woXktyt7HDN>lhWGSl9IY#RDV*gw}GS#w~^#1jJ7f4Slorj z@C2U5a(kD2AFJ$RQdZj|)`}OK8+BQ;l*e+5c9CMYTwm&Jw ztOO|~trRJxEsm7KtPCkfSXola*)gP)w**p-vr42?wyLC5v+AVOuv5s3kP*k<3yW+i zDH(@Tn}~F3C11lV%t54lR8dm)w_>D}u#%*dveKl)*$hDV8@YC z$tsgl)vA$F-D;4MXthW=&1#cU$Lf*Nz#5T~WM`7n%vzAr%FZUGwY4QB+0G;70=tNm z4%Ug3i|rCpQmi{EJ*+1wy{tDWee7ydQmsEJ*V^@@+-NtGa;x1&N}3HOWvC4&Wu%QF zWwebUCEe~ODU)p~DbLt*q-5HQq`Yj?NSSW0kuuX}lagigNSSX7 zNm*=fk+Q^=k+Q zHd1!jE>cQxtnCn##j&W0ny7=uXoWWDXq`#vVqHn;g}#`M*RdFHV--HZ27HUH*p8wV zql%Mq5DrEh4nw>hMIMVvR+*HlR*gIvi8vLF&=}2a2q|iAQ4=ZFo$P_j?Fv$^w5!Ne z^tbCsxeaL;Y(q&IZX-zA!S!jz%dCQiNvdmVH@~*v4%1T>B%Ez{vlr@%3 z$~yaol<#aaDM=Hf&LpLowIHRHolQz>YfDP9okz+Ab`dEZtP?30+a;u=Sa(u-SWi-V zS#MJMSQ;sVZ731E zBBi(WA?0ejiIiJx0C^kIY%nQ9Z8#}+*qx-L+ufwxZ{tXL$i|cMsAZ7yxIIbAM4L>? zR6K`Fyo_l!os`#XCMmNmi26=dQ)q#i(jZrqAd z7>&DeFYZHHDb5o?Mp@2TK@t-zT@iV|NaQG-hBoMhK^Sk3k`wT_Jw;B$6g-3H@CsJo zYwXWN#Q`Xek~kP;a0HG)9n?jAG(r-Zp@p4ICZi9AAp~45W0)j44Hw~Rq+>GPvdGtbAKZR@8P?O`IkC1(WGwkI<3q`~FUmw(le-wlld0>= zM2e9QFfLAJFy`Zat2)Q$ohv`w*JpN%&pSsZld&F; z)XU@Ze!pdWf8GBZ88bx@xrggDPG>xa+|HPi+sMeP;?*iWQugNP@3)w-{*F_8eiWCM96*X!}ixj8=X@AFRo=-(;nmiWjU{5}JGeTTc^Bf}Z%d36rL zdby#0Oyo$8|KM0?9d@n%+X9hhWDAlXx<7P&j?T+D80DaKM9U)qjnM?^Cw~$8q90a6 zeP(iz%r7+%sr<5IkdC`B4xiz3f6PbU5CdcdaX8VfokOTEH%HlRUFEjKZQ_p^#Cp-+JF&62#2a_=snRwBr zkuxw8^O66&;$@7(dBv-_{3+Jrb7(#HUC_ae5-5qQANhw6DWJi&W)#h6v}h9*xk4Es2`Y^P!#(1351{lU{8!x&^B3p)Sp1XRI^sE$*h&z5b_4qb6O?m#;7pQn~miN~)B-{-{LpLeFd zc(5KEPp?w1o|9xg?b+? zN3L}^mCFeIk0O)!RWTBypuU?rZ%qB}WVywjKlXclE_$-vRey^sk!wYA`F&6yN$3pq zsYta)$qC3t{`13rWxNxSBGLYIp&w}Is}%Yuh5kvO@fzC>t;h5Pey<;r&YM*~B(1|# zP(P&D_2@%Cq!bQzX2e@HzXa-sg9FQW*(nDW-W&)K_vOgh*W`Z48lxya@{@5}VR`FyaP?X2MgR@uvw zKn{eCS#3gEb>82gJ~!%nsRQT_9?$cl68rNAeg4w8-1G$gzXX40l(3TI={N&*(7+m# zl3p{~A5c5PLoot1d4Eo0yEYOh9UFBcDcL7;Kaez$*Ar^+`m2e=Y|atKSkvdScF;~| zGA_iW=!t>IW*d-;(AO|>6zhfIKr2Naj(8k_vN#=QpbqLoeG`+>5h^-RKSdp2?u}I3 ziZqNwIv#|2n5nO!3JESejpQ?-`sZi!{`NB>hcPdJ|J3>;U3kyE6=_i4!9Qy~jXhnj z;g9-k7j#@_MI7&i*a1pV{`L3{&zTcY#ZD$A!gIQ-p4U8YilGF`;%HRF@u-B#sD{M- z=vR)&;nDsP2atQy|GojY-(8=HWd2{;TNm4@i(ENDicQ#zE%+I`5az=#V@FStc)wJi!3+RQk&BdL>CcDD(F?sX2I;s9>Vq*38JL11 ze9eA103~q<;&3>sq8buW3#a0A)J7fDMFUfRp)=7Et#A(7;9ToSUW`kuC#hc01@);s zAd&lo;#QG75p_@>k<)lCv?1H_dru&LrS}czkEG%wsBi1%2z@&^>JeExksa(wMI&`t z_bmy>vhG^~9$Qv4l8J16Fxkrgv-TU03hTA*$7^7}$n&iIrpbp~gnl-su>Us(p%13| zUfzb3DQvG0d4^gIcKS215N~5UGIE*o!#pg)TUd^NSx@C)w!=t7T_haIuZ(Qoqc&p; ze!_O-;x68!79sz7bL#7@^;VL=m}%V z*Ij^2KFck`3f@!S#rw#{I&8pq zwuO|f_!U{a{&P_(fw>T@Kn|*LUr)w^cnA^RgAYLhPR34Nmy*rCs?=xOB`T^q8Hs3t z%im%BSKNZZ7=}AA70)74q;zBxQuvJCA2(tkl5in9pexdN4ya%C3Vejnw>mAZNMs(C zT3RVSmtzdlaW^JoDqg}Xn1Pv4f2@TF{jrvE`2(!Pr&xn*e2(?lgdgxD9^*0DhMmYo z4$s|Otl&Aj3z1XVUZN+@#l8sZ|KvQ++O+ry+p!b7p!F{#;RV){z=hU>yd04V|5(SP z9+%Zurz7;?_++TJx2ULcKOBH!D22ljk0WsuPDdToLu0f;=!5-5UwQ>W#d{x&=5gmW z@~K`Y_!?n-g=~6gsXwubG!Mn$Xo5^^L=Jw%ASOxobe*_a+%^mIvCtNi%di3;A*>hI zgdg1r-EcFe+H0g_A=IV*%;l|M)5LR?xmInCc+Q`I>bMx)aT%_}4Y&!j5h>5_iGB%D z14&88cvP#%{wr!(TT)UmQdynb<2XK>j)0DzyagS5cn9y<2joZCj9eu09@q&NqX&B8 z3PjkZ6hk;Z(S+w#C!`hUwS^JL#EWhU3LL0P0gui8ZBp~!l ztIy@ozej!h+d+lAyIub&vTy5EX??U@WLDsQBaLmzcqAOib{fC+X+M*b-#~re)%ScX?#3jj2i7!1cyBL; z5;zbCp*HGS1F|6+qa~8j5jy^(zUSFIL4StUEBg*P_*H+;4XkI3MOcXpe&<&)6U*@~ za*>7!2dD8=xd>3@X!~(8<(?+vmM4xm;0jbxs`bes;Z8EO`tt%0Z-({6zzX02iiwK_yj>pNUiL{dZ?nvhH&B(wTSd0%4 zIfVTUq;MOpEfC>*v_dNXr}YDh9K^T80Vst%UH`NJw{3>}{Uh5jz7Xmmc`>@6D=tM( z+<p7+HHyns8=7hH*iO<+tcOt@b^JrAC zw1e1(LRddx3YVWpBF_!=CG2V$JoX#$J+?vzk4{Ed|3rNa7eMP;e1tT%0a`af>(dQH zT0F-^p}u>cLVbs{p1{MHfXDDW2JzZg|H@&w9}nRLyoA>=%d*IYc+1r9@_nqd(D!mZ z<4xEMt*`PK_h}0f`P*uph!yOQY(NfvMRK|5Ityt>v!9JDo@-jaL=EezBf@j{U>t(8 z(FX01Qi9KEi16O4zLym&h3tc?k&6Df2Fbieu0krVMM62Ybx6Uj7>L`Ejt8OjSG4X* z8n4xP_yk)2BaLl{)|AM?n;6V2|S6(n2P5x1G5p^ z-*hSex57f7)Afwi-%jfasV~-V>reEi$0D-uCbIiR?Akz4oy#RJ;BlVC3t+%6ty)AJT z`k)^kz=N0xtrrp2iO9eHPU6YbcA+n{9?d{YW81d~EASE0*HI&YG`2mDAgqI;bw^K{ z$k#Fl^?P*-4{-fscmglrCCtFVn=8CqXY(n_-(!P8J*Ut)6f`14VW`N$KAV_c6snXz6L z*;C^4zU~6XJnTHl;v?F)-ceZN+|{#_oQ!x$&~>#O?u6psfp*8NIltQ^Hy_b;8X?%$J)OOlfr^H+&X_t$4K zewOh(kITLgz5Qm!d5;fceZO^#^Bxbzx?k@y=II_uW32BNKQ#LDMl#mVsmfTlU*+ph zWvu_tW~|@)9LBt?BPCvp)(iAttp9JtSl{n@#=8H>jP?Jc7;|Vca-*+*g|WVWn#YSg z9_jH%{`z#rmAKt^9%sH3y?;f9Mek4K<>>EIpRsg^_x?L7y zeXMzsvF^v@8PV&PG1lAfbdP`b_gl5(1^`|h_{mWsj-}^YmdOSM37X5uL zVyx%QV#fOVBYb@}W8I(280-0v!&qN8igDia|Mlqgk2BWeoy1t*=Xu8Zy;6Mre8&2H zQa#?lSU)F?v7T33{Pn9CS7BUaWc2IfW<~GMp^WwYt1?zrV4U}S^Ytfr+>5b(&*qGE zKQb8W{v3-Br5G1mPleS7rvInuW;&sew5V66LJpK;#v!`HWC ztk>6KfBo%@_4}^y_4j$a!C(IfW8MF)jP*FY$XNHQ>YV8Po6A`DD~Yil-<2Ns^7R}2 z^=XWCe|}-C`=8EO_djk_bUe#(DS8Uw;W>{rqf?uVAd7o8xh!pWl(J z=-1!j>k}C3=Z$BqzkgMayK{RzUWttLeK#=H-=h^{-QQ~5{!p@mZ~p;fU7zCd*NpZ1 z^z!X@d3>X(e~0#aLfI(&OeHr+a(>WBoqk80-D0r^hAcM(@uxjP-bz^*Dk1 ztL<}D#`?N@xn6&-WXAe^r!v<4>)`Q1#`^tJJkDXP`_qfDe&0_SYx{H~;63C@hXp>^*GzNznQV_Zw_Pq{AIqr z#JuSCC)?vx#`=CgGuH2aBV*nFL+_0Kypg{Cc*eSa>At=$W8FT(*I&R`&+EyI^*p=W zU%%M5@6T9|*DA)kKO=nm9AEz_+aFyYc_aGxKkVCAWvu%%iLoB9Iv&sVxD{i)&wuFe zx60SQ?ePZ2x?a%kuZ(ywN*O{?ypX2LqWvs7@EQnq|!q=BztlK@pSdU*T#(BRl_{*NCT>ihoPdcD1=)6*Qd>NX1N^>)8raH!YQ z@rv^h>Zj7U{CC#V>G()EMxx^+A7CX`S*XX_$XLR0lg(U~pP;&|A0|hI`nw{D%;zAi z`=d4BwC+zhjuO`YQ7x3H?nz?n_L}eFGbp+-r<=D94xi2Q*Xf0Nrm)^>5})~1x2Jl+ zO-PF4Gba9}E|338LT9Al7EHm@n1R^CnvNPg-#-DAcj3mhA=1!4jyhtslpTZbll` zLbYxA>)T39Vy+*dzAd(nE&n=A&3N9lL|CtBPwUuHc&-&xw-#HU_E*)T^?$Fh9&LB) z1m<5K@c&aCT6jN=6xn^^=Q9Whqjdu$r9?(v|h9PVO<*AV7juYIk@Qcc3YQ;)TRIp=rqo}J0g zsx-I%M7`ErP2g1c-%+m>`*;7l>$k$|DC}?UZ9P}){r^wbcZJ_4jcw8H)*}x4p{n)L z`jcTlv?7;P&y#;YRQ32_KXiBX_gaTI4Po8kx4E3Z4nLKBm0K_n+1Q1DsUu_Gr8r{i z$zu0&W9!RQpWY8)o!mdG-Yh&mvHR(&Lks6B&-H9P?y6T)z3nE1 z?OJR-S=ere>tpN7n()-%?j% z@Oz=34J0KU;}P~}s#V;xx-p&Kr0wV4){lkrpZ=;kvdeg#$ez}Xh4Y^N?E0~SJ|D#H zM<-L8q584#_YKc0P4e$c9a(t&>3LZTNoST33qlE2KIFC{HTid6C>c0wl|H~@= z&vjnm{JkN3Hjz+=6&~-+C8u?xc>#!PwDrN4|#0m zBU?>=3e|i|sFMnRm%pq2Dct{12NiyPn4b*wPWk`NI`=+yem}O(J;LAr_v)j<=k;yu zKS*r7RG2RfSy25{Qe1TYG`5Z^{2t+T7h4|{`~3P(*Gq-x+mF1~qzIpbMQh@UJ{Rj; zrP#Wv*xy43#r}@Esc?V8>!YCOM+(oCE0D(XL3LJ}cSh|bCHDS@@Auo^Ev9ZN|Ig96 z-{E=q+s~nfX?Jx^+P^A_@HwIkmybsHJQd0K=enmbpC9U;7B7z;7u?gjryOq2DLQ{! z-BbEI@oEuJVBJ&7yYYF)OZT+yDT~{)tMyym(<;U~-nXxHPaF7pO-t=--BXG8;v@I) z^`Y)5Yf%e z*74y#tL`a>@2C48>YnO+6s?0QsP1Vb*Hb?FTisLg$MKQMj6>a1+9&aO^$(%$sl@8& zaph3=l*IUOZXfENRx#Gshq|W{Yoc{fq3$V@F)!yxsC(MLxCrAtt$WJh_J?x&g6f`b zTpOQP-?FE5Pi3>Ce~(c2l*m}mw@~+#%vkkPq3&rbW7W?TRQELQv*_=$uXRrue7$~t zsC&xtxS+bHY_6}#?F*`V>hO8AZYR_|jbyCvAL^baGiLX2pX;8s^7VQ?7gYBY_eJ#e z66&6MG1l!v-BX&!1=T%`<9fZG{;s;GRlYx=?kR_{UY`ZkJ(c}3`uK*rr&f&h`0i=l zQ!j3>*Xy3vJ!Sgm{io`lvibSip8r{OPdR))Js(2dQ;GG_x|qMJ?r9v~Uq7#)x~EL8 z*Wa%ybw%tZME>o%C%&J)&%V|@MZSvGf&EtZ#8{92zScdZ@%4F+x9f_=F;+cPsC(M# z>qFgB+=l4m5$c{28SCr!wC<^uzdqDG^I(Qsg_rxw`q%Jhi)dHI5>gjPOk8dW!yw@vS7R`N07GmeW=JG^Y zhyHYR`nV5w+ zHkX`-`B(s*lO20r_GbPsjz6CIxFw)HI-)DC#(Vexst5ZF8}J=AVHIL47v#4bd8H zk-wiwKgRn~A2o}wn~(hc#+EQv&#~X@JC?)sKVXObyT`kB*T#(oK z31{)O3y{Ch!xF}^eIC@`VF&hg9;hKZ`?2TYwdVgW!tTz)>&O4g-!U(+gr5_89@QUx zj&I1uKKA^l*8JZeo&S`^ZH8bN_T)IoEN&Nj-u)8(ub}hp!}<2Ro2RYE+-*a|p7-0D z|7&YH|F=E5LgxYB44ntOxAS2Iod>A%|9(XN^SxS>X8U1-$iWzD!^u$?jVJJwO(JLD zb?oju_@(^6g!A9?im@rkPD1Q?WkdMCk;s33StO2nG}N*BWMd>_EFQum$iVK_Rmk6e z=ReuMNPUaOA_H3IA@mU}!iTRuoWRl->R&hr58+?VFXb5N;m~=Mry|r(7BnB2#%*50 zG%Uu4wwjdK^QlAM#N8bislyIV?7U(c|Cj%KXHB}O-ZKF@Z?hY&#Uz_UW?>1`??e48 zPsQnIisn#%OPyyr1<&AlyoN9F6@GyF0Mte}|GyKL2WZ|H>dTdm*AUjv*j;}@)irH1 z9Vb&Sp|7w7>YMOq_Y;~)&C6_?M~41FOSrrO`TGoIGghDe{C$RYFz%NS6? zi=4dsepdO<2h};DX}BL5n25=E4w;yS>6ncyEW~0g!wRg#Dy%^^)OW3Bji}HosA6KY zPtYl(>Ic*>NVNk^kiW0ZV~o`gWe0TpIMg+V`ian&H1tWyUnipTL)8ajCv?7Qsfp~* zp#rKw=dY^n?rL0%TQCrtaO5Oz2OS?(jqINE*EnD@e`i#Ij=NlgG`xWYwwe3|+ifSQ zesU$JaG#*_*v~@>)SoB~FXCm)L8#N#ak5R=1|2Wcj(Tk*LH$uva6N9uY-E|v#SZ6V zf6C=-Y{F*zggx!ImjC##`iG=qBMR!L6kDeg`i+Esy6S&a71gk(eUM(@wxR!V@=mtj z2>p-M_jo&E`yR*kH&Gv*J?itstl>d87?n{K_0Rwf(HL!zj4nvSHY8CSdM(m8heQ2G zGN699k^Sgt0QG%PU$}6bF^$VQ&pHF4@56E~zk|H~5A-Hbe}&k-3!xui=%f4Zo|j$F z@$@u$zwEXj%wE*Zst=X=JzS5_$0M7|`TJ$5??XHipnfgtQ=ALk^fFH{QDFDe`-4gED@`*(yosr=`sKf^Jd-_B2`SHm$- zuMW|1%jVE=<3Y&8eEinGkzNkX(GTjYtooqoP!B2zeIIoGMJ+Ug`Xa0Tpg&ZDAUZxf z2XiqW%di|D+iFts*TbAfpOrJL5vhJldvg4KGPhIR%m(ah9c@F76~@-lw&wo|>T9Sz zEltoA&CwEPqbt<6Mg0rrVm=l?y$mFOKabh;^H>%7deDQS5t2;3ZbZjnU%_1YJ?0eJwA znEGq0kIL@)d^e)+P?Gg0|J}YsO{g_#YAs0hDcX~I*!#JidK`-SFa3<&^&?B7MmqFy ziX{AVAKA1@(f+Zjzt4gCqt-l)=LlNhxBmRS_&fFH_lEirr9yo^LSJ_Esi}!1G{vR3 z0Ru1=>bEoy1@%c%pAhv2QZGaKt)F3Pk;pG2__~qNzGtCt$nVv+sZU#MAHUeXZNK#) zn)&;EV;|*u`ETyWtaU%;;bW|Z*8kXnGW2IY0$K;8HrgT?S`Q=@BQXkE7i22tVLsH~ z`Cs~zW%IhkANFbGHviNQ__JuAr!z?Pc~XBTQD2m2q5dV`K>eq_!5{UZ4Sl(Eo@rCG zG_5%yh3hcT8|Hi7FMpt)7LsuVQgJ)}-Fj`+1WD-x>V8oTHP91RplT$qH9h-vd>%m~ z>r6@)yM>eird?lo-Rdz<(hv_bSD-#%bra~@gXU;~0k{o!VhoZhMin`Z^Ndjf2jftS zCyzim9E%D#4wbAjDJS7n)V2C#Yn+D*(G@A^Zav5=aWzI`EbhiQdz^d%6EPjLF$ZsA zDOTVeti*T7K`u%h&#n~`P!T7h8hTY>9u`^l2DuQ6@h0BJQoM(iSdBGUhfNrABKHjs zBLk1)c}%w~asl47W#qefA0J>9R^v1Koct0S@HMvJSM0z}l&r?{1?5o@m8>!;C)!D5 z4V;G4(EyFm9v#pFm!UVVLSLlf8eEH;@B}8}Sv-%GSZ!-aS%>xb7T@DX`-R+&own;F zJ{O`WpSushfhdVmI2gy^SR~*?T!@PiTX)oP7xP8vfy+>W&r1j57%NYT)-RBT)|r$p z)|J%xpxtpPK4JSV@ocN5o!w5#8^)hJBHXn+^+>tIQb^$=be?BPdEQFsd z{dmlwUfAk`E$V%pfBg>Ce%=lpLz1qh{=Iv097#QWCBn8w>wtvgNMZYv#Q%xv5p_H% z^xa*_Wu4o+7CN4^5jv)%{%vxoC6emrHW8Wl2KkR8sc)eiQGzKSbcFg-j!#J+B2f#KSdGxQa9o9 z@AakD@tc0oF`RH5XE2v%+FWu07GW{egIm@?{kOLv7dkE@>USuOtqG~)F6wz0`X1_- zOLwT>p^mRemZ_(lc|#Wvg2?@byZ2?h0i>&|uR^ESxTH(2J_LQ-@LL;Zu-LH&Yt zyrKx|qXC*g$0^!acT&eA23hDg_%7r8{RU4d&9PFP2KAHEv4ysH!Coe3BDP;{S>Dr* z!s&JfDRoW#=Wat9hGIBI;7;T}Zm^KCoE*n4J8Iz!)I~isL?d)SM_hsw^ux6nY{SUm zxYKm3LDbJ*v@Stc9LAh_8PtO2=g-6W2>lIT=JG3e6|=C=-Xz~cn4eeAVmYWRuSYbs zVdQX3u>|Jdk3$tyMJ=mKs{ieg%(0h+=H%rf>p+ISiYZ*~ZkLgLa1BDgMfF?^^Y@`o zx908l!)aEVtcM16CMj3q8fZR$5FW=(7g68#AifpeUje=nyVI_3*8@@pB@0sPs?~rKn{LDSg$B`67MAl zeI3;Ic?-7UR}`HbRg9E_>;$qhs@r^0bJp2VPZG^hOXVrNX3-MoLi5vu@sdp=XJ95~ zAsGpaVn2LPC+f44$WIPwbrDh+O4Ey+Kc4Ncooy3x$QZaYns!RZ}A;|#1^PW zvZ&8RS7^@qN_=S>NKp@EDZf4HMRFd(d4h+t4J zktLB5d;a6+{GVujr|pRChkrfu!0HQJ&^&CBlK(m{dI^AlJ=I@R z^Os>gz!rz_*$aa)3`LlOlsagERJ(?}7Fq{x5MIJG%)o1yWnmsO^wZZoW>HkZNjMo= z@9i4XJmw%w!)&~XCD2@^)MU=_6lm^JYD06Fn!gNln3~62YoC+qAFp{zov#qiQ%K^n z#IBc8hdIN>I1|m#!Y(1@B}~U_Hiyi@JiLJynO{`@;F*|(Imp6lsGsnuM{xWA4XrV$ zImoB&SyD2gdB|5y>rYm|aX0~0p!FzgGVgc>>Y^UB&XDF68(C9Q-bd(*{Rx+|tq604 zC2=b1pguIOsGh2FE-pexbjB#$k8yYqiOeI0bp#u7xv_66f|%5$jsm# zB3nvI{<;7>a$ZYtZritB{6A zkpFz=G3*be<1MT}LF;Dx%yrs-+J@a7_trY2vB$Gxk26R1XS;&f68r0^%t!}2B(DPin-=@7OKFXv&`DT!r5qTZAnSC^GLbC zE+VCabt2_ryM&Y!>rP4!>q$y4>rF}@yPA|#>rcwHc0DOK;wIc;14tQYgUG=cYQxD9 zxE*(34DP}`xEJ?h9LD1jOh5)6wlxkL;lp2;u zN-e8L)<;7$LKACBwm>U8o0QhpmX!SaL+TmU-?U#OVSUHnJD*}Kx4R3E;R!sAdA6K< z2OnT1R@uj-thP0zWZODYzOePAY_N@_d~4s6qID&Iz!rq_J9Li6uh@p2sL8y1ighQY zhxH_-m-Qy4k6lels`V%3TDzW<8|`LNZnfJ;Ni&^yBBN~#Dd~1MDfim_q>QtNNEvUB zl9FMMlk%iZBxSNqCFL1=j+9J$k(8Hh8Y$E5HBx5UY*Ml?7jM`CQWn{pq`YlQNm*g< zlJdT-BxRL-Ov-9oLrS)-BjpQQPs#?{NXobNJt;Z1nUpQ|Gbvkb8!0<%7by|;`K74s zPf9T>K}tz0MM`OlBjqqFL&_0WmXvaK3@PO;ft2H{5-F9fDk;^hIw>_Qoc}a}u@vX1^;8j#Y+l1Mqznvv4NT9It+v>+B0s*4qYBHrltOd~Z3VY_=_={A^oE*=9RP z*<~dvaJ&RzedelMu8BHmj8)ga=(ouM&R5lz^%=RdBnyLq>txy@Fb!Ix=%YBa{+A&iISPBdpS1DX?=g*i5#OyG00KF^;D zeICC67oj~mT4(ZNq@Wuvwadt!=!HJ$YyHUnxXuQUl4gU+AsB(txZ55fA4UGp_4$u; z+`{MI0oaqz_2Kh;`1~F|PjC0<=s|qm8HN0P6T1Du=Z0|HV<*Qv_U5>U*1eViHinc4 z`ysLWga3`^cNVlivM0wYQhC4Xk87ZPjO(HOjL)&B=V$7@E*!^r*xU7*ye74s?h9?R zMj&j1wC%YU+UA7q#9Lg}Yg@-T^!ok?dR_mF^Lbs%AHBYt1+A0( zFUKp`Ca7+{33ox;g)D^m_cdIO@OqY_#-^xn{+-95rJYSmYimo&|JM2U!g+W0mHGR9 zVTJSV(YbfcxyxTQ@2&gWtFdG~Z)y`cH@ zQ2!I#-$eVjQq=Y*rI?ilxkL; zlp2;uN-aB$l-gE@lzP^Hltz|B%9+-Tlor;Cl(VfhDQzv8l=JKYQZBL%q;#^2Nx8&Q zNa=1pNa<<4Na<~TNV(clN$GFbl5)M>NXpH2D=D{G8YzQqC@I5jBq^h8G$~^&os_%n zUQ!;l3{oDqCrO!TlS!Fs&yez*Ws>ruy-dn9n@-AWHj|XumPN`un@`F@TTIGZwuF>r zwt|#*?R`>K+A2~$w$-Gpv20S-*%zd&w+*Chv~NlI-f~FUY+FeA*|w6h&32Ho%Std; z{b$afkL3G}#W+mBWN1EpIy8^I7`vN4-^%|N&YKs`n-|WT7tWh&?!0i`JUVy&-!g9= z>Vg04`SEV-UaHR=h#gAG;l`;e z5joP1BIRg1mXr!sk(A@@1X8NliKLulCzDdsP9fz~JDn8G^-Dc#KuRM^BIQhLMoJ57 zMV^IotPLsc>|9dLw+l&WZyibLY+Xp{YTZb=)Gj0Ca=U_*EA1*$`dU9yuCeP#xxsEG z~EF3pWXDrWP8CD=1AN!EY zAK53Qd}?b+`OH2iB+2y2MVONrJ zmGvd1pIt-Bb#?^)LGun$T3 z$UY(EQ(H^QXZATMU)oosd~M&5@||rW}Lm%Qrr$CYfef_JByTatPLsc>|9dLw+l&WZyibLY+Xp{YTZb= z)Gj0Ca=U_*EA1*$`dU9yuCeP#xxsEC}gV-wdYBB!CoTe6?>JG8TL9UvuqA2bL|aM7T6+E-n6$#S!&Bk zdB@%(YEVj}%;vR1ARXQb!;i4eMrhj_6aGU+FDXRv(HKS*3@HNezXX^ zVNO65JDHRw)b2=AYfef_JByTatPLsc>|9dLw+l&WZyibLY+Xp{YTZb=)Gj0Ca=U_* zD@`>=GRTIIGR#Jha=YC@%AGcrl)LO6Qtq<{NO{my+a$*`hb1Ri6;e*LlSnz)R0}1i z+Uca6VRcEVZw*OlY)wdMYRyS$X=jmgj{U``*z2UsvN@#8wKqsvY^q@s)v(Ej_7N$nW!sZ_wou1bb^qvj`K!q7c;J8{ zk;m`^UcgJ3f!8q;p)M_pT2=LXPPsbT7x*|P6;zkjt#CdrZ%(doKJLGJK5jvg=v>@l z@=d%A&BgsU%){kyKXgvG=Hd$H;i7YKh4XOHxwyi4xaeHmUCimoJ$4@{57>jGJZz7U zGQkSx;R@&BG#9t8^Kh}}ffUZmMd#+~GEX7(tsyCmtqCbjtvM+z?JQExu{NZ%vvWx~ z-!3Gjy>%p|vvnb*t92vgQoD?l%k2tMuC%L2>1+K+xyG&|7-Ln@IV= zekA25`-PNWZ96GDEtf3LyjL9dbzUz2{F`drq@Z~?)xOD|&c~@HP73GcqH}YF^Kymr za+;efoR^Ev&2?nHNDAlW{%_CAG4-w~`N$~td1bamSl?HQ(YIgX5_liO`F0B_ci3Ua zaV`dqtPxd?lzOO-BGD}&qGiRq0fC^F84SkD#Fh=1i6;M&yyT%)#aJYeL{VTZw6T!grDsqm_K#dM(eBqBUCNRZK@F zbwzFYeUs51UCzIV~OWGX7?Qo$jC8a^Bs5Yd`w56nk^+UqCAz_`6mZdrW23iY5UbDsI z68zEnAB}iEG{#`$U;iVl_n|dD@~`u8DdQfv0#{)Kw3dg~4iD>xKg{K@j)&Iph(}nL zBdo^}*44PK9LGPPwJ}8NV$8-|yp6CfMl;r~kgyKMR4!}Hi`}hbv4Qm~zOyZ){DNN* z)~%RNFN5Xy3H!2c#ir`)gCneytaT%5LhD3~ht`RZz7wNvB?ln?dJvB=j$IF8u}N(wi7tt!a5FFj794<$SqU(dC*!5^H9)w3g14>V}-DOLIT^Fn%L8I z53)INU;c-^`v8x!OxyoIq4y$H5eY?#fP_vUkkCOuf=U+&9Tg!6R$6ERih>mpkf0(R zLhlfofT9Gc3P`Aef&>BS=Kno2*S+uTyrH@7zI*(C?6IHYoF@@TGMQ)Qx#qgBJ1TAR z`^>t13kqds&IoR{UxD^0@ZG1t?MF~P`#V=4 z`FBwVnv?J5;ooe&y_;w6_NBbp9Q&Kit$$$$`^=&rhG00}!c5G8o1d(?@|EB}SKfD? zd_CSLYkBy&j#3G`}6N}+;Y!K8eE@tA>`c!0k&ABvmpq@2Qe zT*g(bFXA=xVIKcjVq!_ThCksc%DPQtG1*DUiCoBQ@{?C*L6n;ShF5(id;)Y34j5V)FZPJmMk=5KsN=}oTl>DY3DaB2BvI6Ru`lK{AkCXBw znxm!ZM0Uo97>6k)hLp9YLJ9f>kh&!G4CKRu2sh11aj)a5^NT9u%6W|^B^7U8$#$cC zD|=%g2H_p^F8K*gAQ1t-vmXi`Fl9(7hpGriGw4mRf+&Lb@e#&hJSN~%B;Y(Q;u3CL z;NL)X-b`zV#}STh=!Ho1!Rr`d-X!0~So0zI5x&4wOgHn%1z2U)lN+%EJ8=L%;jlSM z%1LvUl=J2)+4K+2|Ja0Y@I7{8FAm^1PMKfH(?~Gq$?J%}#9kIiFqvrNuZj@VMSUb9 z@+$j-BMKui7OSxqoA4d>BOWJ_fXm?2k?eUZGv_8bYV=xL-2LqK(TL&SUWhcJwHtHc9UGXaVo5AEz495tJG4GNx)AZ%% z{}S}OApZA%U4FLp(FnSqJ~xZVC5ScKNYT$-vYNbP0TeYsWH5BU)W9odF}VcGupBGR zx8!#0z(H)_zR>;T?iY97*LnUl5{%CIa>LH&?!4{JvpRRm`$p$Vapy_@^P|p-qI03> zTqwWeJakSJofCb}i|%}=`!yrn`R#V+F?as*KX2XaJmr5Ly486{=bq%wJC*o&75JZj z0{ML_jf$v@{ul_IkD{U9$?e#Qc<6j|!CWS5@Vgdf^m}_9?)=n<-#Op&llwjNJ^$z& zbPc}e3HSRJ$M2l~`Qi{CbLWW*-2P9TAO7ywFC+QgmA~V4Olp27)8anpaWEWXq2EnC zPyeT$m%H(Ax!>!5_w%xc=i@|V=D9X2%9tMHt)8Ff@cHA=V5~r-}UT_2v0!5OyOGnJ)A9q5+zs4ccQQ#$YZIk?ivq=RIwXaD#lHJ!FcIQrrZQH4uhYc*aDK&mj`;AR5{uIAwaSw@}SgC&SPX zjqy0b(Fz^V8BrL5p%{+Q7=y8RAJZ`tF<4-hkjt^!tR-Wy8C&oTw&6Q-fINspIE)jx zfs`4%Qj-~w71@vj#qkJ&P!8o$5tUE{!Ki^Sw8qnT#&jin;YIYt%VsDk!|^u8;9b0r z>6nQaEWko6#&WDiEVi0&$Zd!-@#JBgz&TtoDKhf?AvH1~E3zR6isKOkp&ZJiB7#xf zgppDo4bTXU@if|@JvyK(Ucpc^oO~1SU@YFlhZv7fFwuNUPR8f>0@E=QbFmz2%{p>D zzQPuKjctfCC&;S^$i(-H)X0P^$cFn+9FHIv)lE&Z4qBlN+L;Kl1G=IYUO^OwU^L#r zSiFbnn2Cj0jOAF3HHgJJY`{ir#uj{yZ*UMlAs&Zu0%vg!=aC{a-v_cF8}36@R5zhy z80w(`9z$b1j;44DEzk-b&=rF)1Vb?#AK??s$3m>cY7(iCkm7(+13yg|N+(fAxw%``Fw3$PHYO)R+)?s+MW+dtp{4#7h`IS(E{ z1ynLsNU4hYXowydWQLP65~HyOo3I(%@Ev}HCmXd~lr>dIsfG}Qq9xj(9XcQqFJUl- zVi;7v9*uV}5uf5_`v*3-kNXo%5RMjTW!jMK5P^|+6K`WIVz2;VdLj~0 zScoNN4Y>)Mu?4$u0P#451YCi~UYBGe??)hBMHGf%1g2xAi6Jk-!`|8tp)iV~1WF%9>7Crj+UkaDV@+6FW^N)VHCz5^u<67!4!OnY0&!>G8f13v-yQQjo-}g_z9jzIWHgz<1qo};VHxG zMiG|u98T!Lqscb$%#H@%Z%*^M9YI|8QjT#nR8iwwwwA}EHE2tqKz@Cu@^0pH;V z{Ek1NHwzwy-pi_oC!qJV+M_>)VgVLmF;-wD*5F&{dgTZFgk#V(%b(CDw#88fK`4(3 z2tzH@K_fIV;bdz(4fmeeJZ{f7i^(Nej@5`YdQVOE<5&EKiwKy-wFA;43$i0O0#Ovj z@hF0z{mdhA3@7k2PC@URDKW_1KKBu^r!IFMh-U#Nz}`;x}B!4e&R4G9ojIqByD|1l19WCJ0A6MByqt0o3V{ z7UfYH?_ew@BHF}}*Ac~gnG+F>I2^_`cv4bBMrk~TaJ+;lOu}Srz!vO=hqY;w5RDmd z`zyG0YaZ676+;j@p%-39f4qs&cn=@oL)>nin>w-YXi9bE8M!kt9-05 z?@I?E7!maF3`7)WsGrBgkn^EITg4EBx@d;hh{RyLfl-LTH;Bg{a2v&@$i~kY_0a@R zpci`MMZ9E&kPEOB%dirwumMl10R*BTikcv@9<*8Uqo`u4k)nMaen%qG+#ldc zZ!(cNkPEqy7iCZu6;T;gpuPzSMJ?1pJ%pn*qA?9Ku@eVy2#0YDNt-8ASImfV2u4+e zq8`FcOR^Q7#wd(4pOBv+2A81$cX~q|H6qXj-OwG+;T^n>5Ac!sn3QPDK>S1e{BaSNk)i;P58Q`}sDV(_G_}dr zh%vF`IV56yVZQGo0iK?SL|;Uq_QO0cmf_!lHkK|^fxi#+pkaLVG>or1_vdpwZtx5u z@GN>_4PvnsaX5pEMuYRppfc(r9Ieq79ncA{U;xHI`wD#m4cL1O;TVDUF&U~WtDfxo zW3(akr4ju1BYFNEO}@>2ft&Wt!~}Q>&F6Q?gp*I8x#>)HLnN*(;O|?-eT7K$M-)b4 zEXHG^nM_Lfc3uxa1M)6Hn>80j33NtR^Bk#OouL?p(U^g`_ywNtxerj+#F9G^kMq#x z&n*yvSD^uXPoV`S;!{kspiUO->GjG-8gx1a%m$?o@lnCCcDhTcaA zLqj}{rWkvK=WN8{S0vyH5>4DOK8^%jLHy73bl@a@#TopD1pEnYhP@G+u^n!|`9`OB zZb3L&;~BI^@6((U5O9XC58608B~qgR3Zf8-m|~=qKsi)EWdxgQq|`F?Noi;rkODR6W2oOI8>%4;4dD80BDmcJp7a0HcjEd? z^!~Bu62D{UhaceIZ=y}iGa?)6BOI*}fe{#sIf%i0Xwc-7SNS|%KqUT3Uy6oQzK0L+ zH4<FxOH+8lkbhYUPavjzm%wCSK8Bxh62IUKvZwV*uJ8Ih zpSxjlr{nq&`A`@SqZmq{G+LuATz~f0+&&ETXQxO{-PnYXQWFi}+ppb{&Q*mj4g0| z;zziB6jz~s@qmn8u5Y{s$Dyc+I#3U}G)GHxL?;X}YeM@tS#*>L(8Kg3<|GWmr zVW@`&cns=CZ;lq|h)x)6T%Y<{j%B_1ij-|o|N3t1!4Vt<7xJC}xW4up+?JZC1J~!? zlH1Y|oiNzA{`c)1%lFuYJ?0Q8WwUryAgea7E@e;- z>Gw zoSLT%HSl>R1$lm%FXrC5eF&>Dnw<}`T*f0*O5_&0IV zoFT=nM{w((+`5EMsRd3}O)!8y8pNmYdYPKr>j=oe>n)^48e~FNR6$jQ8n-T?NM`T4 zgjrd5J&c>JPYB4y-;FBpU8m58Gc zgRR(x?WW9qTvMZh(VByJdwH`u)-~&(%S{qTrgptzH_^*?wl9Qhmv{s@H z+VV0Rg zN(>f5YcwQ(9$sIg5FSP`Xx&Dcy!@Qt)^7w+OOR>^K@H>9bL`@HFMh;+xb+_wajW$xwZ7-~3>p$&3DwX8FPUMaOu%GJ!8~~4d7L91@**D! zqA-e}C?3HWbF=j>r@0n93*U7wTJPfey*&Y0m^q*2AFngr>qfoy6Zbk!ugOHOwM4I- zM6ZFwz20%JZ`|t`y*7~*Mz1X-nCJVd&~v=r$FE?%C&fLly7h5-k6F)s?tNtU{NtWK ze4j7$oT2yJB-Xg|vO5pE^QF#tzUMui??mT0aqF~Vv-7xzs}t)SB&xxR&L^Vtg6Q!t zzU!`3xAa|irN^#YcjX?Bw_9)Jzs^c^G5wzNl$*3(sU}$u9nclocuu(=+V`U8?i)aNG4s>bg{YlIL*U_+F=~cQQ3H;BNaS-Sw^dCvSCq+nUcm4d1>> zUF+&P_pkI(>blrn5383_eUv(v#u@cd>bh8clxLwnN_TynlJo1`_EGA3TG!9M{gXOh zyX)wux$XKWbv>;<%3kPgbbUP(e^)=HuF==Sw~tcK8?KMiU9YR3@+@@Ceycu8UB|0` z@@CiX$@Nw0dcG^vR~dz&7>+yXtJL+s`Y3g+@A@e9Jm;?WefueO-G2hU{gkQ$`1e!l z`oA7r|D<{+)iG?T~ zRQ(_vtuYvP+DED0N&mh{S9eIRe^Nb^t{xG{?GmVHDw7gyw2t4mpHg)SSD#3(E}{O( zh6smh3emV(-{Vz2cOCzi{g1BR@hrWMy{!*&Ofr3t0rWxkp#QNK24OHhf%+nU!EbQ= zk*+UNuc^YIx=93l`ypK&C5n&l#9pHwNX;^chx#CW>nHyGkLr2!?{`!^#q~K><90pV zNnfLf+K6f_fpB#dS3mLXTXgF}G*4kQ*22|QT)$##UMKq2QPg+np{7w8VQ~G11GpUp z|GvYue9X6AqTWLF6>6?nUgSq0H0Qqonjjo4(b}{nrJZR{4nP##oUxnD7xSMhwx2%} zkJIq&Gt@k>&_KQ?JY{;5GRTZ2Cqng`12}Asld9*WDCm`zlnls$TqZA>A4N=2Qi_{L z$Y6vZ6m`)MkDCZ`Bs`^forYhbenq|byj{PddKUFM|06`>U+Gtj=g+H7rL{w8Q4pGI z;nopV;dTgWLj8%FcQF}La23~)T)$#;S$+qhe#Jz1DsbF{eB9f&sD8y8@J!|T;7eZb z!SyeyM&{~cgSf4_Se|KI(xMPX;w^lQTlFuhN6}sXs6Vj})SsxjSsc`#sQTF@Tr)RF z)z5;U>!b*%KT&lwT{F2p#CUGI{zKKt!k`|*aI{7QUdHQieS=zC6_2y{9lG|qoBqKz zvv@6rXQ4jAU*P6>{2l#+#jjDX#GUpJ&gZ{X|6uhSeBbcxBUJz3HTc)_%F`oQ0Zq^p z{{4f#*JV``dF&WnpS3|(+(};{KiR+3KNv=hu`gV`F^YPlZ-1bxKdL{l0DSucRgZN2 zfzjM{{ej!Ly#s%xPcV{R!2jkx!H9Ic&x$ChU(ml#P@7lgLLk&9==uZKaCWzYYE$Z$3q}}R-&|GdRO*vEg*)k!^X-pQJz6#BTOeBTWh=s^|iS=wEEjrcTTRK?Phgo)u3T~n&Yx~3M)2^RQ^=b99sa_Wj-##`^;6L}T`Sz_Pl;P_R^7gH%p4}X`>syO_F8RK- z1U`NN>RYRXFw}gBFq?J&31v!>ele@oxmt?Kux z+p9P2j_UTi{(Jk*V)t-f#g90EtGJGwd+BFG1ysW02uDvuVkF+gbj-whY{WnM*tmVy z?^hi9=f1W(egDGE>vHd7XwzKv!Rh@B|2{bN!l@5VGriOYr~Wtfz1>Z}n|mKb{cgT} zZuk1xte@@g>eI6Km1^?RxD7hsb#N(=#MS#(a4fOdgS)NsYo5aG>ilo;-;Bha)cbE& z=l8GQ2d1G857q76`~+9OR}J6IPxy`7XK@w&b$r$GZ#GBaYd+`ZDEQX*RoB1OJO$PJ zHAmrQ_5Nr+w-u?d!X3|zV-RT9IGxbcUzBla}9j!?j17zPrY5W_P?{*Sh0Aini*%@@#If!~oT^Z%}c`_2_m4cyhiH9tUg@D6bG?>n6vpgMLC+*|-bf#zSa7D-#WEw)xPWTZ?z6T{5ExH)t|MlUiIgv;Ofk& z^U+6#x=?+2D59bD?(?t$$D#UiVQ3wDQ?$XY>dVQkWB-Fc^PgD9{&&=!dj}?8XHHS@ zKVMJwT?c=sb>*nie@|W6x1OwZ?l-F^PvCR^u6lBTFFDu1)s?j_UiD<(_3(eCu6(m~ z@r9;y-h=AQL$DB9|L$L3)_V91Gra5JRcEe;2&m3H3=81qbE(dJ3@30FSK;c;#b)TzO`WODJ>eLtTuhglJP^b3H{@2&F|2yi_{`F_|1F7!( zpRPCi*O@)ki~Z}%zU$AU`TVWw%ePy9{{KQ)rqwZ z+|`MPa(e;RLG@zQh;LRWE=j%jZq|9bI#ED-{+~Lp>bqJuts1Ymb%z$)xN=ZQqR@8XRU9Rn#Olsa~vO2 z4cFCiRm=5X*Q_pn`oRyAF5_1xs@w?Wii-FoEY)*+9w+N|ocZoP2| z>aUUtu0C6y+iqR)oz`P(R^Z>p&FZnP4jV_!RqKY`dSO?0yx1Qe_}5!ibN#XdZq8WUAIp6PS@x9ugkqxr}Wk-xytyL){&;+^|0uj<5XlJR-L~;AW4zf2^zj7r(wtTwi5|>KJw4`s)^R9lI1O%wk@%F2QoM zl3axjeCe-)n@RlZt%vydA5cFvF9SURoJxe3TS<63UZZ?GX^q~(7G54C;i+G5A?xWr z2~V?nD_3uuCed4vlE>&NLGl?+#X6O1`9_k0q!cy}lTyr-Af==!O-dP4mXz|QA}N(o z1yxN5DK$(ODYZ-;QZy1m8lWK>nI@z(HO)wQ(ljTfrD;t{Thoq|_ND_VolF-}x|wH5 zdEUH0icbB~+w>vjCG!d?ubcj)3`7)$n&G63G&W+w^B%|Yp&3t3z^7&kDW99Eq)az6 z$yu0VVn|tJmXNX>E3g`C@s-(1$~N;IDRJg|Qg)d=r0g?4l5zkCamXAd<)}GM%FpH$ zDZiRCq?|-DdlpH1(DS6EO zq~tUCNhx3ol2X__OiD3Rf|Qb`G%00FSyIX)7$GK<3_~qbpOl8C5h+bfQ}TU$2$uSL zVzCbK(E5$KygwtoO&?OUcEfl5##oMJHoij~c3?O5;s>*zl!NBqxnKKr{*55kinK=u z(}|QWrW+~Gn&(M*!So`fx9LO5OXd|)UNikj8DIvHGT6LD%G+iPDfjkkrrJor<${;hCl%ZxgDI?4% zQr-OY2P^f0|i>4Uy_83Qob3?*f_89~Y@^A;&@n=z!kYu+d2Lo<$)@n!-klgwmN zrkKx3nQEqyGQ-RwWsaFg%6zksl*MK#Da*}DQdXO_q^vU=NZDjIld{!(L&~>iJ1INN zPEvN8y`=nL_LFkZ93thgIZA5X%W0$cD&@Sn+543>dH+soo4TabHw{T?WSWrD)HEaI zNz1LiK<$3c0DTB>WQihumq>M6ek@B_~L(046eNsL& z<475ACXjl6voLF8XK65G$f^w zX+la<(~OiSO>@%FQnQ?tm1Z?5Yt1@RHkd7>XbqL@Fq#1`yUkuwelVH~ ze*u3O?OS{mLA=N7zdmWL-uJ!6>;&XM9=P{ai>G3~2;6+^+s(UeZPTf6zr zv3Z$^gNUB2vA_cqLdxTDxH*~KxIF|Dumm@ohq;~4{eqOcz4I?ClbUb&Jl?=$tiVqE zhO`t~3ZWWWpcmeR=3)BwBOm72w;ws*-hb{#ZqBi9Kk^ukefyEOa;%Wxm-<$|a+^!uL>JK@xBd7w`wtq+!%JatC^qBP$@x z)FI^w(}C=a*D(-p;vK}{01lhur^<6sxcfUtu%8#y8lGoj78Sk@7Q6<1!MFx+wPv!i?L$ID+F&cmcf- zTa5o6o)Y9EJf8Vwse}4xj1oL{rNf`R?m~ByF_G^R58@$&m>Q%!ZJr_Jh&e@`#((qs zWdGFn{~PB4+?(s_o$DIM+Rn51llw3ce^S&<#Gh>DmxwzFS-f1a5z6*zN6sM4Y zl<9dN2GvjlZlAuU+-{DR@SSfulw-{`^`9f7{r21(88_E7AOn9tlAH6=n2+CTj;ZFm ztidK|eyN++qJ8gt=a*jRI3Oec4m7vaf8I)CKGp&^n_KEX4`mzwt($}5$>g0`T7#^E zdT4;h&=|?hDb+laHQ0!+umxXZ8{C|dBiz<}67BIOnoE)rHQ+ywMEkiVH%z^cjNE_N0&QF~2j z4+*!-Z+e+8@Gq{jBzg&|F8iZdP+0Q<@5-TR*EAk6MQ+ z&EVFfYJQ_zf2!GyN%I@y?{1D_eXb!S=p3`?5sqgOiBV{pl52Ui&(3=qaC3;e@LF9u zm-UL~wSpwzGT1dMNeZ$6qL7FL7Oo^_&GL`=-R^l!&o83q645*@anBd)IhTt&&+B|H z?)v@_!{NWAg&GYDPNoB&bs-j?)TQsL3MLa-JDbXzKLdFikpAw=1DH) zyOa_9jKs|~(%yyQ&Z~L3evn6v`r{{p(?pULq{Q&v@U7l2);`Lj_miX)=gjBus+mBp zMeo4m>$#Eq`>Mmb`fLAE-umf8&atX5MNac_^#IiYu0Zoi+Cwu+r2fa%+1#;{@0Zq_*iEQz(Bl>zvDXcetrh|aW~hIq5SuCq3g*HF&+~!8B_2XzQ9!I z8q-~8&f#_p=EL_o^IMMNumd~IZgM{k8h8Eat~(bMPX0Pm*O>m-nM)q_UT4OVcYB?A zC)bxfi}E~MjK3Qva27*LFk2D(upifP1G>HxH&4@DXZl}P{x@GY{yX|BllD>B8*p!b z5w5|tzeohX_r0Lkf!lGj=Oz9VZN16ffz&|I7CO&Fn119yOu;nFFr2!Q>R@w8iNSm< zF)K+~Yxa_I$z%)U^(KN)12yp^n&TOa|`|qXax@s0HDm$(okWV{AI=)i`2S^BPgU zHI%YE!k3psKNoS|f8IcP0}za=sKwVVnfO|>B0mbCCSPkEq)7BiOG-y{LKJ@{x&2a4 zoTIJ)-H*b5mL!yvQK`N1^L-V-F5}^QOMxqAE{fX;hI@dL`&?XN&Lbq%a{CIao%VzS9y6lJp|CctJ_g#hSwHyE86h_qCFCD4!?3I z$`jlt(gH0Jzv_$;0b8*b+7GW5LU@f|19f<nD^6@N)fp-Ba*; zf=OlpDd%~uA}vyRwIZb>ueszS^93o>P3ecc{W7k!f2sH!w8Hjt`>mIKgc-%^+G+y~gN$zo+fyZzrbJ-rxLFv4Y-)Bg1 zkK;C3c>Ez9wG+vV``{km9sC~Gzw+2V~mN-kk?-_4wcH_xL}=V_*Ew1K~XObsl&MzUP5V zJnqGv4<6ulKKP#(I`c8nzPJ)+w2!Q4pIC9{j|9#k7g04M>!;xMZ%yvJqJ2~E=Dgy6 zK53GZ-+ySIPn}mb;jf-orf_c2zLGk>)JAXPf1YvsEGBop3HCYPjPpC+jNn}JCj8f1 zWVy=yjqD}|nG*#}K~f5%2#TQu_^r9K^&p;q-cPJ1f3gi?u?PF`6FhurlEUy7u1C@s z?rM*4*CxqCN*2RinY1-7r+SU1(=xv#xk;gPlY}2}(o#8oydL2co+OZzLZ%2QMNM&1 z9xMFs8komOX>1-RC6d<+@}kjx6*9Fw?_vr*$1H3&>Rs4{edb3}4w#=v zi8n_`Ic83fa?<=l%4zc(De8xiOXdoB6*o|Z*MSkHqh1rDv*}7ock>)6JxothBF&4W z^ffP&@~U~Al>TNQDN#mqy=1g`hm^7AJyJd}ACdC0`Gk~-=2KFl&1a;1VZJ0~x|vDJ zY%`aX7_)$sMP>;p%ghQ=R+%-V#9|#bm`$W?Hd{&g#(YakocW%VU1kp{`^=A|956qT z5^s)>a?G3{<)rzAl+)%nQWDJXq+Bq6kaF2vCFQ#LlN1lHsU?L;MM@fzj+6{06De6t zHd5|0IZ4TF@{;m^d61NcOdu(ROc7Fwn&PB9VoH(ns3}Xfz|H16Mf3XoBF6ICdIeTP zbLl+~d8HsFl}STNI+KBvOePB{+01>UMK2kTTZ1 zN6H80Q&OVMXQX^#z9eP3nMulQGnbSYvw)OEW(g_F%nDLgnKh)un)Re?G+&Xj#e7Z5 zHuD`Raprqcc9}h->@z=-a=`pVO1wEj$}w|-l#}KcQcj!SNJ%iilXAiQLCR%wm6Yq| zPg2qq;Q9x7ksrlT22~IWx8Fo-ZcAI!juh=PA>Gjn%diq#@D281KTbmXNnFM?q$uc> zmXwUhjBL0Mxy=1!eiSi9Nhxj~Axk3&*6VMdbjrWsAjJ7z2?@0kxs`N(`s$|q(bDW95XQa&?Zkn*LO zPRdL(o0PdGhLiq;xgiNqNrnAf=~yjg)?7067p*W(X<6%p0VpZPrKcmw5UwX)q?f`Sc|Zp)X$;!r|(AvG(mR^#zgZeIT@dsspOZKf!Uag#fZZx zq@r+<8flRMnUNE@@gS-o7}Zb%VW@+8<}orHJun>6SdLvdgLHd%j}0Mcj!2Bcbm;x; zBhVc62Pv9petHXNZu(egUi#NYLm~>|X79)P?wh5($31`Yybe!*cfVCi-2d3GQ}xI8 zrUUspC|xIUb6b{jEGtYb>FSk#aQiaWQBSzreKGrSojw4*^@cl{lRcDcun~9@THo!i zXS64#L|`P|#hvsi`_I*OeanGqc-}`(xVhQ~xP1sG@e8ga(PT@@xd}}$AF;TItL6qN z9^Om2w=X8={S2JzQ6CM^2uHp=)Owcz&^+^V$TN*z02IPV=(_D| z=$c1syM5PnYc2QhxVJwhwZFa8`QSg#(tq80{%h10@K^T7YAV2XHQd0T(6HS?^Lad(aPkQ> zH=W6D_{Y5JRRNyo5Q+YX!bpt8c--4h(_0U|x1T1zUqAEvb&~xxaBn|N)?&~MIR&3% zDrR67w0jrhvk+fS34B6aS( zXoJ6_&V6q`P2TgRSN7h1n$+(i5{Q)_0>8mz}=e2wk+9((a44nT_& zGa@sJqByD|1l19WCJ0A6MBysJ0s>eQ$8idJv=EIrcv9Zmhx1>pM{6PIy?r>ndvOlU zes3Snd;4%wW6V!aD4xT;eK`Mp_1XW|=0x4whm&~|)E8TuwxqN(?Mdl?j_7QFP7m#Fp4bbysCd!?z;On0AIAqMgAV366UWOk z=Jrrd^nA%Nt%9C?9KT4;d?KfZQi7*@*4#;J=m&F5%dsb0{@k8PF@2< zBBw{oGQ0Q9?a5BQ!Lh#n1deGj_DtrO@|-8=rQDtkWZstEudhMB+@5h9|IX+2{d=Nv zC;hq9d|uyAILEvy^Zdx?DGPX7aa^2i!{_fKKOUUh(~JymmD7`p3>=o*^EjEGWBt2h z-^lIZvd^=WWBt579+BJgJU`$Q9P8gp_>5!zfq>TD&o`Kx+f#*)H{e)bZ@QS=9!jsC zjvOniaIEiZ2FLn(Msm!L!?T0qoaDzG>+5}7@l>B+`%0>=sD7>)~(k%_sJzOJPl>*uwFW5!u|;yBj*HkQ9dfA4XQ_4ALh z<0~BN=M~4X?&r+Uc<|P)1~qL_djv0pVvu_^?P}R zWBonZ(&kC}{wlQh{`U*pPw zAy3lx`AvlP{)ot!$J2w4KhVMZ-^XUjlk{_m;8^!>Sk^qAxA=K}#BtK^Q(^D-|0#c7 zf8XrKz2E2Wd_L*%$LG`X1!eB&{qqUc@_0Vs&+BUz{ZD_d{;d9c{R|3V5GG@ed5~Ww z$-koYArE49+8D!_qlOSjvf}5BAE4ROK zCNzJ&iD^!1PHsnZ!Vsf=dxH|dv^U)WS8gcQwT4}*If23_ztcQy&@+!sceEt(cJcdh{7d>uzH{7%@VVi51DfeBn&mF-IJv4%Tyx!X;%0N*-JIs7{5Pxd zmDx(}#6jb~Zp+Opp24|F0(sIXgkmU;aweFp2F-=f3(ba?7N!-cIq?yuBPm_b1AWjR zgG>zR=EtX`SGxkLBE-}p#kZe(Fvp)^DyBp8_R+_;3UqN3#44e6~r>vFA7!UOmtJn8M zxPD(Z-#&qlsqfd#xlc2lITvvA?jPoMQIs+p$xVpIIrz@IFFk{GPG|0xZH(EQ4m@uf;lZnmmI)%<)cCCkmBa# z`}fVdx!pIYJh|OG{VLR`sv^`JCr`kC&i;)o%p*m;tls{_A*A{f1G0H({(e0~ z8aIc35XXbD5KFKeE0Ekg{*u&)N}~e$7|rD$j3rout=I<5=9e<}1$fG$f~iE_Y)=0n zK6ezqK=b+ote-H1bo0)`xGiq(c~@@tKqUI2N=|-OsD(PHXPzO&%}HO#?PXYD+}!lF z9LHikHo(nMUy#c?_kR_+8fy^?H~+tUZtf>kH=(542S9rP%rP;f_61mKv_C)r6vD$O zhLR}5n%&9>Mpd{u?$z$6W{es}y@j$1Zoh#2+>SSHzku=#uB!sKUqF3si}np@f!1*Q z2Ykfsk1-xW5B|?S0@b-4YTSMTGdYgI0xZO0EWxez7pO~Z$?YrP_7nJ!kI6WreFZMS zL*JnG6{uwWgW5|#)I%s?6};+`&5`gNe-1%hELDQrcVJ8}`l)fu+^RoLbMm|4S-5%m z{kS~@!|@hoVh(D3&+i$ud3_~RLl3-UhLJJ>lQ9MJpdoH)kPdl~4+T*eMNkxvV2lYm z%-@f>N4!pxXK|Y0Z)f59y6UjT`7vBO&-nm>yv`n^SNFD#Sr;Qodm(VX?2il{FVAdl z;6YP`l&4H2DWlDFQZ|}+Qm&i4b9i1w1rtt64>OXKFH9^c2h3$sa?bS%BBinEPRcM7 zP0A{>kCY20+dQt}P|7qQrL&15WujR|$}W>YN~RdE;-u6u5v24tACt1k#F28^q?^w* zCyJObQl2)ilJbFxA!VC6NlK~(UV)^9m{z3pHDgJcZMKkd%y<@Z|KmYZg_NgEBq^iK zbW%2&cv7yLyoxe-t-$NQp50N%`0;A|=k8CMDf6uOg&`nWss4)qFro zjM+xYNt0?h_dfzn2q~>hUsA@J*`#bS$4GI53Lad+?*OWpr$~u3qe+==Hj)x=u9K2? zrB?+~!c7lSMw%~3i8TjExomQ-;{HdFX-rCYGmMmIvx<~`<^n0%R(q8qrGe>8N|c#M z$}+QylmwG$4fj8an>wUKnEs@EY!;CcXHJunZmm}lQo_vBq`YcAASK3ZBjuz?70dmP zKoderE7O;hv1T?YTg)+1JnOt3B&CXZij+t*nw05gBPsFbIw^VAdsQGM-1H!2r1^rB zSaX1s%O>Xr?tcWC#-wyN!$^rXt4P^rE|8LKqgN?X8ko+cM45@CEHk@ENidl(l&4H2DWlDFQZ|}+ zQm&i4d%6En!Gx32!;B;)U^aC(S2b{-6 zWSz%*3n+=wsE>x|gf19_!I*$aSc>J?iQPDhbI2G&*%`%90<}>W?a=}KFaYB)9t*J; z+pz<`;tbNx=RF@3#={6jO|(Tjyn@&8K0d@e%*QwQ7C++@QZ8VWFAAU_s-ZesqBZ*9 zC5*wln1wmmjIB6|<48onLhgU$M`Z-#Ni;_<^u}9w8`CfY8?Xt7a2VHc19=v4|D!xA zqA8l;dAxuT7=_O<6>G5$`*9GLa0NLQbN{0Z%AygPpc|gWPz=XpOu8+?nOaSAE9UPz4sD2QsPj+SVRK6nXZ z@GfRy4mM*ej^a2H5x})VKIBJb1mj6GM=$ioTX-AOFasN~35ReP*Kh-QxMsK?I*ooaZi*v}x^+IM8LkZMIU9?9B^uqv*!+0#jVr<6_ z{E9P3%QZuK6vo2{MNPCtJG_F|@IF4oJj};8_!d9o6jH`=|Dym3q8h5BC0e5oUcwl> zi&>b1&De^gIF3XFaIKIJ`B53ccoNOg3%&6c-o`Y{zy@r>Asogv+&~_#8SY1UR76uW z!}E9nBQOe|V=C5S9roiOF5wDtaJ`TVWl$E4&;;G^EQVq@CSwX#Vm0>S2b{-6WaXM6 zJ4&K7>Z2h#p$i6KFeYFUmSQ<}VmHp>95QmfkQv2L0<}>W?a=}KFaYB)9t*J;+pz<` z;tbMq&5$02@i0PB6K&BBui!Pjj}I{q^YIP7#m_i}lw2>QMgbH=HB?7Sv_>DigfVy* zvoHsnu@y&g9Ek|vS|K0uqcVc=B$}fadgCp;jcJ&H4cLT3IE-t!fjnF@+>i38h^Aa)g;TeQO~cn$C4L(Ic`e1mWCGfpApcijIdfP$!o>S&49=!2Iq2Jd1P z=3q0n;wX+I5dqt||B)Y+5sW9%9KFyRZ{clB!whV|CLF?HT*D3IiR1o9c~nGGG{f_F z0V6O9pJOW4VjcG5ATHqwa_r##M;VkwBQ!xbJd2?ij>(vUl~|3v_yOl}5m~?I{zpla zMtw9yCv?Fe48{aZ!cr{9PVB~6oI}Q)-2W(s5~z*3Xpau)hXELe@mPq({~vpI0UyP^ z@Be=-yPFVPg0pzAxRD^i9fCX24FqCD&{BfC6{kp`xVvj9?k(EV0xeJ|6lja<@AcXJ zE+>b!=bm%V|99{G|88lYkM~S=Y{zH5^PR;RoWni*4AXg*KT4x4YN8f8qbvHNKc-?j z)?ouq;1qtuUFa{c{80iW5rXPykB&%1IwoNXR$&c};23_uExd#FBFi7e5QwU1jkZWa zZ;ZnPEW-*M#35Y64ZOk|xLsoT!x#Q&ftKin1dPHMd+ThPkENmQC21N&dfiAC^g7XG(uA}M+*$aFzmyA z9KlhXz)9#`?Bso*p%|v@CHLc)a)LYwT{gN$sM3IJh$d)?eaZpya~#G|9LGs$UFjdS zP!~fn411ORs-Yd)W4I#k6cm2SR#NQ6AsoR`lrF?`3aEfe@Papd5rjg8c~%c? zmG-1aKne^+>_SLU9koygbum;~NQ$LchLy^Xr1%N<@j&^Nl=lFZDav%g5B|8JJR?Qv z<#Ypimzv1H5NyUlv|7P-hGEKPatn517xrR5JXiAF;R`=BQ|^)C0UqLs^1~|bC*U@I z#9jP^`-<&H)_A@^rwk>7T21l3SOSxt(ySck1jIi3X&m3aoh13`*6`x}1*A_&!$P*T)Z&XHf?Dz4$CQk8v^ zXpat}78~*RU7o>|5&&Vkeq`W_TtnwQvEX@4I`0M>3 zJY(j}u?9P^NBQghAe?)$!Gt3cy_I34`0M>3_Vdp+ocpvxI3h6sgE0a#Fb5m33A?aI z*-svZZD++fQYadr5#li#97VEGRw;+{CN~0NCpc4im1EcZb@5kNcZ};&4zu|w&dol`@GaQbMIHSl(jXOe78+FkH*YOj6#ban!aj6bx5s<2>@i_a}$FV!w&6@MrHqe)WdozNH)$eIV~I{_uSef4v8S zYXsg?ya_w73%jBD|G|5S|9TIE{T&c}xR(CwJrF$G&9(P-MSk?X66ANZuHhYwTtho6 zu4G>1M*$RsCqBF{n91LkVI|JuhVla`Y(FZ`HF!4oz;PcjjAqdVazAmNvYvbn`4M_E zT;PFFC54;>4cFyHnBk0U@PgyMWCYDt{I7ZM!|s3l-rT?5%fS7Y>#R4_HK>e0R7Z1V zGIb8tU_b8REOig=;rfr%OTr!8!_RntN67mAS@|8dI%uNE57X=6gc2x;QYfR8Cq)JL zzz>0_s)UfDw$gwUjg%&&XoePOiB@Q%$U7PSC%l*8&wiJ#6sIymZW8^!Rxeu0K^%3W zr5r@cJ^rX3w3LHntp_djpR<;SNL}cER1aFpN*wi|rM#pz8sLw9Kkbj|K}*?+qaL)B zuN;EZgO)NDDPNJg(0^19TAz*aDpC(x>OW^KcWFlZKdJ})VL8kxy3bk<+ThCYl^Ud! z%hX3hG)6PD#fSBurQF6*|5?g!q`XGzJUhy3PSJb;S?fJJ%5OB>OOW!Lto5Iz-gDM+ z9H|5SNA;hjTu16Y3#tE{wcfLo^IU_YoX4B89pQ&y{JZs^9pyw)5Bi^}|6Gat9a7I( z%8#}t2HlZ>-blkxOu!^%4ml55>pM%ilhk*XvZq#PjTEF}Gyc_j&5m*@M?Ge# zzbxfZj(W>~RzF$FrlfwdltX2$k1S zdc|4GyZ)p4#ZnF?^^2t}Y!js1D{Fn?59<$08Q4G!g47)r|55#6DJyf7lSv(7DJOH3 zi~UcmH!S6JQbzZW>J2-}?f$I3u+$TFl;35oFDzwwQjRC(caHkPQjRC}g{2(t&*}#| z>IF+Vp8U>;qh9bImE$?;2Rq91KCCA!<$F>$IBUINM}6Nds@yJX{az`zbJXXRy1P!^<_Wp)2b{aZ&lo}(VFl;=quT&aI6<#>+zw^_^cf>n9mzf%9!QQr4qJzPim z-#@C4EA?=tOfUuiuhhd0=af!(TI_0)p=hIg_&ZyU-^W^`VgC#%)RgB}9Pj7(kDg<3 zyuT+0!_SF|@IVA&5Q`)@-rw`$9ryO|;d3v4_C6mib&SP_zYie4PbNy>U;Ul37WCuo z#q$mL6myY@mw1hLc*MQYcR1_A{YPkgIro74ewe(U_0c-kW&F|at;lb#ST@*ycjd$1 zSqWxPVw*CG^KTJOnWlKGl(%r)L0;|&indB&#w{w-zX(x2W*A}&{R>x?VRpnT&na9M zbs46}#qdNvC5#kp6j#O}iYOk8M--&rLMWrOqI+SYJCQ@-lv2Z~o@RvNPWKhStkqOS z1k)wI=iEzqM83d&rtuhJomp>i8xJABH=Kmqc!*d=kc8WKh*(CJgxh$CSkC#9a2pR1 zmV@&xoW&JbIA5!P&|KWt$7IaLbgie}P9_!@ocn*X14I_#Kq; z%nD&qc&(kh`p)(TBY!l*1>uTq#qr{tc8UEt2}_2XrZ&$beE6Kk2tH@=YrH|Tv$<*pd}eQ7PJ1odKYZ>ZKi$js zS)XbDK9y;g@ocAE#`EEG9v=Kne7Jo&woAu#zs&mz=&W=l#Xw~cDOeS4c99~OZKgUt zWm(NdK@0m}R7EiAp*{xTV@$wAm`n4#DJq~MIx_(g=z(+`!eQLTLkwf$X5liv!E3yM ze7Wo>iej*!0%|L5$u2OnuH;5O6hSeRK#ez)=fRDARzdiqE*hXAI-(oQ?8lrDqEshE zXQeAC!V!TeM5E7Bt)?Gj;r?}Bg)(_(?gQYj`zk!Q$%g#beU*Riy>fruSNYp}-~Oxa zt7K%I!-q}*R|yf^Ky`zn8XPWrF=D*ycZ z%|3ju*&0qcg`8~vXYPw+V_zzAASWuq0}+TpERyi=-XDq7{Nv}kukra)JO`(#8ZD=& zLa)dpHNvDglOmhKrKd*ZRJhdC2yU0!u<2<8my|YKN@_$Ag-b|zWI%5F*_0$jX{9VF z$}1H}QAw#n3QxtG6uyc-DFP7$xz-calp3T6Rce!>u2P>A4bccqlxC!8p|m7LYo#qI z+AAGN(OKzAif|>86w!*66y23LQgBIalR%0jr8g;3m2^_{RR)maBjsZ<1H+UNq!_J? zCnw+&WjZNl<5SF67LwvKWeF*kD=W!WSfi{b#b#wIDRy8d_Fx|lE5}H2QaMeEv&xsG zIImnJ#bxDdQe4HixTf47#Sh9YQtn1b zqAIE>HOWxOJr~hHX+(-9N;6Wlz*J1fcI?LiT*poH=K5HqD)Jk%!cm`OGRqxOd*+hyh$~IE$P`4u-(6jF+iqL@;G6eX3?q$sPDCq)IN5-F-E zo}`F?)Yp=F9pX9lE#AOU4?$Cm#h32_!{TC4>~!m71ierPLusJ*5FD8YxXk z(M)MUik3=iQnXdtlcJ;2nG{`>a8g7n(WI~{-ANIr^dd!ql0=H$N-8PRmA<6tuM8x` zAZ0KqhA6{GF+v$diZRMKQcO@Lkz$H6l@!x44-1rqr1(r(LW*U|3R0|6){tVIvVjzv zlr5y#rtBcaE@clX_9+KQaZou#iX+M~Qk+muk>ZSUjuc-h7f5kQxk8F>ly6CKO}Rme zACz09_))n_ihIh>q7@ugrXk8&>j)! zj${l%21a2rW+D^IupXPS72B{^`JDU$hj9dF@f9xO60YM%{EEkTif8C;u^UW^$(Re5 zl6E=BoXD$qlEP1^N{VWzj{3-2KPZ{@!5FTbEyMhVS7o+8L@HJ?7Cn@nq=;8~lOh#q z=z~ERq6{O&2xSy0#wg=RF+rI`iYdxeQcPE7l47>QtVOok>Y@IkQ9fMBcwQ{oFK(1&gcQw`7NlsYv?fJc zr9CM+DxFEuRS73Wq!LXEtJ0kmaY`>zBq&2jF-#djic!iKQjAk3kYbWDg%nej>7L~R{(LiZLiY7`k zQnXN7lA^WJmK5!kj-=?UbR|W&5=n|^#Y&3qN*pPADG8)VLO%>pJ|e|nWe6#TDI-WR zN*PaziOLjGOvQA}RA!UnQ)M107AOlz@tLxO6w8zqq*$kHA;mUj2Pt+bdq}ZQIY5eo z%285C9Yk?X`HB=5luM+zqWnre##7}v`4Up!uM@h!QSWab%^%k9bNpVjJI`jcz-7F` zOecPe0iWTI>aAs%v>GuCBQOfjgz5YBhsVm>VCyXpS~$hwd1P zPq7s{uuIuP9>gJ>!B5a%&}xb!5UtP)Be4KG@f9Ax#Eq3w2thj}VJw#5b9{}fxPjNm zcZoVmD1rbqM;O{78KW^4lduw>;|m$<((NGWd8Nc|3q@PGIG zP`r_QHTdiKA?5??>i>r4hjwY%M_@k=VjB09#18DkVVuK#ozE?z>gJUs# zAn#@iMSTpxPz+Z_l4CI*pJ9ozj9ib6koURmQTCHx;IML)yoUeiJtp#_sTEOE2_xI0 z6S^W&v68V!L^9Gb1QV6B~4IW#;In;RwI zjZm~i1mcm1WMp6yE-6<@@vpxBB#dWm6OfEFWMCE6;}{(8N3rk>ZW}C9{@wSb{HyOt z@h?evBQh`)BQP3XRXAryl9EBrKqi)AIo4u5wqiT>Vm}V!C{E)nF5)u2L)Q0un7p`; zi3;$BJkK74YN&-7n1=;eh^)`I|JnOM9M8RL{5Xy_V?HZ*1iu|v9KgjhJT(9Fc9^xh5;?Le262UXseK0`zm|TYq$`*1fc3=O*9{WBtYFID+FigD-IjU*jrR z+Pue3%QM!ze-Q2nMm1DNO*BIox*`KF5vt{P7?GjVYUUynXQ9zkzZ+H17-2|92Ie6X z2XPcr}L?8QFFJ4F5~-XkIpca%m(4xabNdTf9^@KF@y6)&OA`K{!rA1JP=f0 z9t7&a_S}>CjBZHAUYy0xkcV?T5sEs9MqdoVB*+6hjS;3yB^Tg2Zr}$+ldRP|8%6h{ z*)OSwam*8#wsn7AzpT^--dUl9k*)AyJ+ox~_G%-;-TjZ>OX6~kcf8>L)_XbrdLIY- z(+673D(nJp%+_36%8iI+I!)DWI!!2w@qmm43s37b>v8=apFijCFG-DF(>SkQ6NYuA z^|m^HoCezJ5C)T7xrZTKjg*n&xyepP-8ErW@>-}111;x)BG+5a=i#Vd=uNW^!q5_q z`i3277SW2-3Cs>hJ;WHAMM;bVkQN3R+_ z#$ah?9#uyJG=hhRT{Tj)MjPmuhvMC0yBte7RN^<~87cZKr#u{|aR#28Yl@>dhOV3! zhT{=_!9C9RL_6kpduW-rqJ$Djigqr%Uj}V+Qm+mpF$N7dwl>6G96+ty?4NK5hjB{z zj=YATJe+qR1l6!YX_8N?X^PMDbN+;5xP)39k7}bD$DSIfTga|HDQXvHeE1Y|QL89_ z!?WVNR|<95FV{sP`_LpjQ3Ba#2BEGpE0N!d#sc0P!>qEss*71Auinxyt86%Y$stTrO5yM&hcZn$#hnxt zmCB^>P`pUtqsSpn1SnNW5u#KlMNOp^De5ToNYOxPOp2yTb5evUtw_;EX-A3LLWv?pj1o(V9!gJA#4CxUNLErvk*4$^ML+b%KxGgqhF~a$D6`EI=j}DT_(56w9zeSxt(ySceVRge}T8ayxb_Uyz4z1V?ckCvZwRLyB|C zSERV0Tq4C4%8mOhzA?u@|(wG!YmFA?7_o|B&r4K0vEAmeDKYOqGBtDyhh4>7sa7Ou(JdexD z*QB_rd`F7w%J-zWsoW;T9pxud+*clu;<56K6ff`+Z{TTQdsd=I5u?PCqKDFx6!A(T zDUy{GQlu$;NYPIjK#Gr)k4cfCj3vc*Wg;miE1!^JnlghFvy?fcn5)buMW(Wd6pNLm zq*$)3B*kiFEh*M38%eQQ*-DD-%1%=3R`!x&KMvraa)=a1lw+hgp`0ScS>;PooL4TA z;a}YJt=M~w@GnF`H2+wl?SAFr2I;X$I4SuJXciBt>DRC@G377E+W_%8;U*;!cW+N@Y@bDBff{WO9ys z2uGAtq{!r4_X#w`?R2CtC`MA46&F&tDmh4zOUXlud`baQ6jTb6qNq}w6c(ivDat72 zNa3zjBt>P#gA`th4=MbV08#`g!KA3B)F4HuQkxWYmHMP;s5B-;Q>8g6!jx8|Xrr_v zMF*u5DY_`#ND-k#ks?NkB}EUVCn@5UL{cOxDWphK`jDcZGJq5xDIb#}Lm5hn;mSx- zj8?{yV!Seu6qA)tNHI;BPl`-s5h)fcOG&X@SxJi3%34yaS2mJjv$B;G+m)T9*sbg( z#eU^;QhcEtCdEE`H~dpm5Zdftb9$1tIBtzxUPIpikr%9QruB~BE@~> z0Vy6Szmnpy@{|R-{21J<2hbKSJKWzifqV^T*!m`N+Gfs$|&VX;jUC9tH2AssDYZO zr$mrR7^ZA3!?_FOMu#UNlqfO=-IX{}^imSYWTYtRr1%&a7^(~>#Ykl|DaI<}Nik8G zOo~sGX{4B;%p%1cWiBb^E19HNq%0=IQe`_zEsYW;-Yey6kjV>N%5U>ofO|I_ek-x@+&DqxmO}; zD|JaxUuj5+#!6FCG*`k%(MoAUigro|Qgl+fkfNIsL5e6Ph7_?%4^s40;z^OA3?;>I zWh5y^D`QD9UYSUW$;v0Bn5N7i#VlnGDM~G~D?^HMiaRMPDwRp$q473Ix<{&W)+zQDW^neqE-_Qsi0d3erSds7=pRVd~yL6DND$uSb^18i!C^d zyD)GA!wDw1AUpD*0E!|ARS|+32t{4gR~nOHh{p(IVh7ISXP7VYZg5mXTO?x)mSaD@ z$4eCD=7}HLArX_Y9LE)@L|hVo_P*^_yyuJ4e2saLn?^2MK74OkH}$zYpUeGy$9u~r zf97VpKj(N)S%)=ln*4nJ;d{tZRsWi`Zkl=APjI|f?9S)*_lm`<_l!OI!p&A!coOY$ z-}KG}`|sJUQ~hULbff&8`v|mi>8`nR+5Y=-t7vDin&-4je_K`ep;z2AGO-+wa3l2_C?3)sq>|PQ zm>GXwxL0VK78}HbCZ#Z;aWUcP$>C{9?6Vn;^dlzFY?Us;tApH0ltt=yOK z?2(jU^-M`mOthwWdPGO2bWie3v38G3O-t$TnVJ&q8J8Gi?dK7l5}9UA^@vNV5)kVh z7~|s;6&302@8#tk>zR}oZ4HmM#>ZFj_VBLi;breDAvruXEyg1ym1&su&`lFbE<^y> z3g7?jQ<`O-{rl6=qkl|FQnEEAJT)mjg-J@Y_Df@uygYnuQxqQ;B~xR0UYx^at%_vb5KtnQEf%`|n9Jr^)Zzd(oVAc-eQS zBJ23C(4KYtKYZ}{%@02Rnf9#X|DN`&N=&0x*uOL6apqN<152>WxD0x^eo%f44P-cmA}h&Ig94m zm;>9ic*aM@m5P@Y??L2lGeit>9%~T zg)bHvZ;6Rai?sBJOtnO@Y%DQWb}dQ$tuc-{%;0U`+uoOFLXvH-k>|0SZTtF3M;S2F zVxIw)v?NP+E4wQ8Mwax%xZdfGu~{0`4YowZrKKiEMq4e`emx>t-qsjRD8mV)f5-5o z9>09I567O`KQY=fK5{_+a3;E!eHl-t-;#8j37Liu`-zH-?!~$mZKZSB^F-PfmCTgX z^yK8E6vi({m$V+ts^s{{wAiGSgzF5`one)M{Nw9s%un1j>4|^q=lyVF;!-1-wK10W zf6;tF|8fi(%X%mKpHEqzxD97p$L7*3#}q!Y{bM=BrS-QhrP!qO#26+qA&#ZRG{smG zQ{Kq8}TUs~pX z`l~f2GA1U)nwrYyXki47Ht8g?4=Z)nfyN~DO^ixO>cv`;9G5H`vP^ztysSe1c9lG;BZJ}$8r zD|}LNh19f2HV4O?lA*BnC&t8E;}UI$ZHAJZ&W0125}9CSn{oVEwv)6t#%)PTPwSf! z$0|O+nv#^5^nSW*D|f2Z+Dld|))<;({@K1omZ|NXp2QYs?H6se##m!)6OfjaWQphC zZe>~64v&_o^wj>=e%9#pwD*Is{Vj%hBl9#mg$=t(jI~c3+mr3f@%`EKWttgSLS$lp z+n-Y%lP}|uPZ>*k0?Uq1S$AwBPD8~Aw9_Xj>SDGRW(&$?RRVgk z&q`(c-%LMpe3J7<+4ugwU-mC@szkSs=vKDj>5yYswe&<*;l7DA9`4&?|EjF?vhTEQ znS6gsRDaIC)Iosj=oj{L?CRtn?aOREGoCJd&f_Mw^65XCrsT-PxaeMSiQVbeh3yGNgLXN$mGZqsaO{tytZy-vK>o@6UrO_b^Txx& zlmFlE<7`I*wy3D2cowfZAh^DClSjU7W#e9IScGOY^HTPqmMWI_%RGW^Wt5iR|BFns z1Z&3fxlGI7*2&cL=xBCQvFY(GSVU}~Y{SwZN3G-(wt=MdRMr#Q0W3KwE;T8ULyKlP z!;y0w+N#KgOMh``ah#bCurIlUNc+w=%4%WPD|>%d)-3DYRr(L2f09uyrfTT$Za0PyQyKN%t~LSx;qI@`#b` zZ_-Tx$Z%yG(k$IcvkX6tW7Kd=$1-fg5qypNcmdN>)*raT7Y)%B@fd&!*o1p9Jaf|& zL3wx~7>yB$0T_+xSb+^ViLdb!G%WM{upj_+&>Ze;_;O7q>!*k=Q!oNLy&W1dbBh%O?%HTDZ8GZ|fdys+4GRoRsGE4h5K9}}?d;Hea z=*VQ*D{-&u4a_@%2aoyw6!je*3aJCv7 zpVYUxwY#IS6GyqQ$dpuTqr@~@f9#Xky#8)k%C)pCTgUnII-1vG103_H0Smnh{W;qA zF)@L(hj(h8<&@iYA;5u+BUtx%D<|IG9zN<4(b_#Sy1#8!Xa>J^(|FKtb;vg0XqRUi zv$h9(&@S^%_MwjMxjfgD&(fYuvz)g%K2M=pmZPJc#UNFO-nXaGEZc1`BX)H2G3{B0 zv6*(+{vDrhp*ia?$I{*?%je^0mTM(P_tNf(I$8cUk7j>VuHasyTDgj$j&6s_-?DT! zoaVBSdFAM4l=|C7mW`|rViV1d&*eKeM0j|se`>k(@v<)yIhx7-)(5gra(Ou%A6ghS!|7|mcC4z#db~6LtD^R-+dv;=Epl13u;P{M@TuQ zIi{}*(#QFNf1^C5z`vk?wC2e|8x_3ajuTOe_UpjwFm%qjO z`osqKl??ZgXI&k`lWkkpVMn{|xv4De@_s>?4#(&6?3Aphj`mTs%k&L&oW62mmloM? z&_H#3et&{*yY#Wf460e419-I>mdcjSU4w%MM#m?mrgJjgBQ7Dhw1wFwCy#Q~!#Qt= zC8mF(#ZpO5(IaE!YE<^_mQs#!%kxfE7p;sui)B!- z#jD@@X+6%2mF_*_$;v1WAJm3)C-S2LVmPkXQGY8! zdZHE@MyB?#*e}624o61I6|daTkwaubr-HU)NtPwf326^5k^3gfam!EL+DwV;>$q*A zsYXAtk8B6o=h^mlO(XlWQ?oU0EI2YV#OF>O-xKsJ^C6vX!g{xzWJGUk(aCM>X>e=qC+y9ug)9UZL0i!mT0+v%K8R-7w>a7t(rn4n zzMW>-7dt+`MYBwYqx~Vxa{T0ptjk%n2WzUtTpj*LW1CZ3XN*CY~3=hWk$jY%Ut8mUfb?^{oGPLq8Y zT83>lnQcQd8FkKjXM=5Udb8GGbT;X11JycfOnQUasJ9K8@fl49z1CrGlG zo48k5dGzjSW8MC+unuQCSagTcgmQ_W^0%R8 zS!tY&W@l%$GV06*otE!mVBW|vkk!awHW-{uY8BP;G0&kISf6xq9A(8a8FV^>*-5Rr zCW^TYOdxYg_CKs?W|LN{Gw7IJ`!?a^q%$#%GQ;FZ;LIxR#D<||IjDtcG8y$uCu=&# zYA0D4jVAhKNiZvIE5Dg)%O=)irb}a6r*(QgJv-_3the?>Y%mx!W?8l6saaM!nHlu0 zGa5}gmY97TWYaSkSlwB@*f{huOQe6jo)yBZwjZsQU;1Qi)fr@4b}~9KV`K;{WHYz$ z)Mn+xdZX2{7m#htWTtAEj-|#{r>Ao#9z?LM4>~p~Czd2Dx~#fdW*Uo6!;+_a`ca#p zmQ9UsY+{wNt;)MzK@Tyh}gU*<@Am!Y+D+S)T_%(A8C#uL_i{vDrVpP4tawb4mC-(JoSG`W_X zzayEM(!8MD01O?F>o>Uo&N#gIV;&CphsSn`BvS3Sf;6LZ7PK9s*U_siOLf=W)&*w~ z+>>k&e}eoJB-Q38AAXLJIR@ZRaGM08=zUVL|_7 zYnHB3rEK&ccBRUI>;)xq=1Cb(VihShu?@?1b<326r$olY^$TaRgSkxO3N1cPZr0ig zD=90c#3!P&Pi2d5K-UQFBipWPEqv#6eq^y4`MY_>>8Lv4uHfO}s7XJBeFgeQhV(_Qq!F)Z0;z6=mx{N^=>uKDYgx&G8{uk(9@9t2s+Y7P^sZ=d`47 z+l&pi*uIaHz{xLVO%oG8A!9z`(OC zj7RQ|*iSxHnNF0HNTvqcmVula^JQ#z7^DE%-XVYCdM%HA8q1J!ZhM5`bNH}1N^|w< zC989XCc1|;OKEvTyfv146)DUZ&V21f$1WDms$*FJTluhRE zdz3y@uYBg{XSM2gx9Z2yuPju@e7wVFvTe#VJFdBo(R>^yV3B_Vxuaki=u+8bkY$j& zyG!MPUFCigH%_@iVgrfdSsWfvqByZHWp2rGUnr%&#c`V|I!Ugr(rnjS%r{3-1;v9_ z##zIP$E+?}tO-2$#C{;mGvU$lgTCOYC2Y>y{6O^FR&f52v5~gj|DE z%U95L?2-E!vJAcYdGS<|myegPm!FrvSAbWbSCCg#Z!d3eZy#@8Z$EE;?*Q*W?;!80 zK3+cFK0ZFaK7Ky_J^?;~K0!WJeZ73WeSLg=ef@m>eFJ<0eS>_f`g!?z`}z3!`uX|! z`vv#~`UUw__4o4k_V@Ak_4o7l_Yd$7^bhi{8sHV+9pDq-8{ik<9}o}_7!VXtHP9>2 zJJ2W4H_$K8KQJILFfb^vDvz6Z2l)i~2Kfc~2L%KL1_cFGt;!@;W%N}UbX9t*%Aa_S zlKoE+zLP6wRI*;mdPJjb-QP#^`+G+G&C#v=F0Je<9PQz>m!jRio1<7O#c>fRrOZ;e zYX3y`ovCcKwkJN=9=o%EGVxk;rHW{{Ki~X4r$F9wGH;{e{7AR=DXZm;RY1V$zlV#KSyWZN+ zkKDIbrQh~RRo|0)pD{_4uS&77ZC_%0NF^@Oe!t@HI~~n%R+5576~1ynzr$o{wf3&pgm2sYdUkwx~qK;&NElC;ka99s9@>agCm}- zShDAih+x<+8MhoG&HSjdOtUK~+g4Fh)-T&CVP6RxPhLgZZpL$_z=4!U)k4@I%SYT^ zii@#YEbjJ)1}exp7@-MeIC5XL30aQpP0GHcKgs02ACC;-?~c&+-rx7XobF}&bxhYE z&QtXa*JZku{TCNQwr%fs-SPyNlxcV-bM9!n2P%7X_HTvl=bo~S1Y~KKa}C+%c(H+2 z&lRf^*TP&U>0F$$>2eryX>;rHIOWZqPn%!orYn@as8ca>32hl|PeU)=I{gOSZrvH( zIo)~J3(gmHmvmoiuRGn){b;zOdtiBFc&>Y?f2DOTA5x=vi%Ik6FBmv(>WoDjcaGd( zG&u)UuhH(ev*!%?3I+tWYd?79+I4&Uujd&xX5xH9_8htMRPgo-u2;WNCcFC5{Eud=f@)eh_I0sIivfShnQX@8Q(kHo-!uLIR*eUAq>vyf&%=y&Av%GuT zd6^48TfA)fnw`79FlKYjUo5z0y_QRtojjFkDpa^s*%~!}y#Mgsp~D7C>9XbAeS?A< zHf|c$x^24-ow{_3h_=S|O6@mj@YuyG*R9`wcI~>vq`gzSl^W=zH&oHb>b0I88AFTd zy>k{dlyNTZRLQBXAxFiGmBuoLG6r|EU$*9Th6Fkna4{DQsaI7WZFcr5;8apy#7P?( zWN6~#X>j4*N2sN|!PPlHAM8}vWN0V>76phMHO#ocF9=UtyH~iF2?M6gN-f$l?`qg zJF3OBc5UeFQoml2hUV7U8<|`(p4N9Mrf<+FP@lu>VytR%84^&)6rwNMPMgyw`>;=A z)3arKF}7)R_TgT+3QSr#w86q1L#vu98oC(Exzu-Ycgj0-eP?SELse7mP+28rJ~t1) zSkZaWk3)QOYKs|j7|cV)k1_Oe%C2`d<@zL|fpc25jHfQC=H&eK2jp|j=i1)6P{ybs z4fG>w=gdDmtc1~+aiNk^jgs2rD*D0(-H^}{xr3dwL(WzldOPD;g{B4G8niiG4MBW4 zcXO%cL)y3&V_E{tIq1~clyRc0%W!V5$bAzo;EiUJb8eTS*$TN9&YmlWYfeKheV#md zoeOB)37o*jDJk z;E?K#8h0H&kqf?f_CyLR)|qwKlsHHxuj4BxnW@4gF{9{n2&otZcX?!O*j8#!;uC>-B|=L*M8-nhH1p<6_|qNWUk8rfd(p(yyE{1$^vGwBzHA5B}E3B-U`?=Lx zBzAL$>83+v7I!>;q;a2pH5LuNv36&pr&Y2)+TFiv>!j0Tug&gs_iAeYT$L+demu?T zz}8Bcm#4(tX)^ZHBBuT?>i1q8aJ2c>;opB3KlJ;CGq=r}(5&u&?|&%!X#sQTB1PV$ z4DPqS=lFz)&n!7^J$dByw#9-OT}C`KZ}eZ$vYT&}J$p(w*u5#X(zx%2=DqEo(XaBF zKC9b$SzZ+w=Y4Wr$*>b4O{co`s&;3`)iu@k6{%QeZ{utIz8%pd>Q3t`+1D-dTa!@i zQm>W1N!5FwAJt>ct+SSDONO^^67kGyYZLA0DK$P0Ie&Udm2N@)dp?_A>nH!yT^o<7eP&1c$f2v7 z8e46=kvZV>^f5!GI!`-y?_r(P5``NTs{QKT!sppu9J+lkU#_JQpDxJrGWPh>=6(BK zFIV{d*`T2fW^UKK*<7ma^jYgIV}?d=7~d_`GJm~)+pgh>o7+b1{?;>K^72E)hOP8_ zHm2mgft4=os2yywxw_i)|DBcFZtaR={Fo$F35R`U9*o)0z+XgYuGn;t3ox5ret zywmBYh>q9l6|Sy7Q~35C--#7QmD!QBs+X5B>cH7a?XExXe}3y%OJ-sAISD>iuC{znUvicECR)n?+l zE6r|pTl?s~sqvx>KKbtU{w6GP-qS0U?;J~XTDM@eclj}2b}1EXF6zDa_~AK6+}pvQ?Wa1%n#FJfROP2dNsC0+; zWzBzm>azXUitAP;xtl5{HaK@z))oUa$Y~Zx){%+U)1aM;A=E5>{>IOlzLg zgFnl3-?G#6OU_%agWkNIaUlHU(Uhnajec%jyv5bsdtYzp`))waU3ur;xl?w7bHKCe zXI3s)eYef{$SE8878|cm&pvGW5w|iuAMSWE??Tz6x?i6CVZe)GYwGrLPjzb2_fXGa zQK#>J>T}Tx<{<=lK<;;DcUwW%Ly)M>m z=QqAqy;&<(_Ukn!ugfski@j<+oYHP@>kI7;_nLLG^rRDqbN33k|MT*(_qUDQyRUN9 znnmyF7Hyig;^J>U`7S*hXln7pl3`=7?`VB;ea$N;pL~6+RF_F*)^xbjz_&UO>Bz(U*tzG=;o|;m+3UV`JYn>fp;Z}HXpURZi70bj#;9% z#BO|7{K%dw?vCavy0Z^h>75eIAbO)B+KuGyR1PJi)L z$!0;DbGAKE>C-lYGv{faHtZQue_`v2AHTXjt;KNNf!PVQU!SO(_O(aVLIa}9*74qN zZvEDpoGhUn?{?@75vPhP+M{>F2rhqFgy ztNC_g{*{}r-dt1yqU|=I|LjSl^)qU>I%XW6&~M0- z%a;akS~)D_tEB_Yw~k)C;dACxc*KPmm(i2wG%o(C+^N9}uZMIQG1%C4PUeGOyCm(u zcIQCgc0G>9Htb(YIFzop63L=uB77X)AQuoU`R`)AeoBkGj_J4|(y` zjitBBO=$CS{pgw;wLzyl`%8I*V@tFUGE>z?p3pZX}LbXS^G(z*ZDin`l8Z+8+CR}`*q&bjcx-w zC)McG`F{NI-{#J&J@?Fm%Cnu8d8d>&@9`SGr}eO575lwA9JZ&qcjNojZryi}DdXR6 z-}A)*=en)UTR-Qt*?R+SOz&G{)bJ5cXU}rWyQ5~}@Qwr9e(!#(T-yGRzit2HnK8FK zzy7JPZ;M$CgOYxlF}Y-)hh2|;`KV^}-cH7BOLlKw(Yjaq0MpMoUnTrSBC z&eO5cov-%Xd^-10gztndS9YzsRHb*!{ds<0RIZw_e$$ziGn)0Eu&4W>T2J~m$h?|4 ztnKT}OONhH6lwHgW#yY=>ZWX&_r=HpkE=#~y6r+>*VPwJmpYX0Uex4QlthmwiI(0+EZ&x6>Yt*n6c_yV#b=cRKe! zHLk=b@#Q@xcYk`#r+)7%y)w48{^qmGMR#g`o4If1sWT%p7rTFXGRNXO8IK07d$WJo z@}s9V8Z+{oDis;uwMg|1i@$t1B;0IipV6y-bYbtq50)OByFSDzEx_xC6R#uo^j$gm z@xi%cjk)W-{$_8;j@9`uZ2skO-6{?9w|(`=gG0ZKtKyW~ZFb|L&8p=8wn+NcM-Ted zztCl0*XYcCoz6#nd2@9|w^=TJ5B)wmTA=rsS0i(*9*|?f$c*Wk&8n}x?ceo$p7w>l ztiSyFPUnRuJ4Osk8*^#(f{`7*oOQR!v6{(2i_cXuo-Ey_@341M&U{;jpl@o=>LqSYZ9KnN_|D^&8c!;Yjv6_2;@k&AQwDDSxXpx( z{uN(!587B~W$6}kBIn=rE^+Yjiy?=nM@m7Y*r6o;o z?JhP!@AB2t6-`T&Jk|8ff^Lx_CK@vL2T%Rd_#Nhn|)#G_a#;j@oF2|@N&~% z4tr`&1btK9ZP7cb$7^D~-~-xqC8`Cq>iNUM@iljEm_7QJ19Qrs zIC#76)mz(^<Rn4&*7fv^gH6T^+cwc>{LXQ`TI7B*AUynTQS0@rWro0QrGs)etem;*v)3&{ z2A?}*SWu5L&3W>5c=islt3KO#@A{W#BWfJjbZ%R& z2Q_D$TwZRr$?3%e?-GY^O}l$$*Sl89gB#WF`^%fJKF#^&m&gkXe3w4_dE8H1-yR*> z`lH01$B*ov)a$Otl9;yxqk9x_iQDsHed^)Q2AqCVy-JOeEtf_XnA_akWvT1Jy~gbm z;%?=9S>#}p%Wr2|G)in(?w5n#O@03TZ!b?iJowo+V>)f?6WpuIHwm+fUQh2-zru{? z)_l$*eOry$Te?HuUuJIF^>lE@aozVXt@NO>M~9yWW%f*a=(a61sNpx$t`=>-x%uMH zm*4yLW?22gd3NT#Nfo+gzkL#$zxb_7nKSOV6+8N3r)7QLh*LffN0#X}#UoF#t7-X8 zyKK*Rw{rQKEn9ZBE0gz=*+a75j@Wl0PodI3#Kr$S^Xa=AxhBn>d1%$cCld}tKQ8{V z=7i&$hP~N3qgU#NjUR1T`h1etp3IxOV?L^X_S^5i>3a6*|6%Pu0I6;t|No!&v5!46 z$|j0v(@sWvYnMVawD&HRXiAEvqGUu{NNG^ow6#MTBx&#ZJ+JQW&-kwY_y7O>-S@+* zHwVW#=Y5^yoY!@|56@38*ZFutyTQ(t<5F9B&aJsJE-w18tA1A3y#>A(u5TKDI^27f z|J++aad)y(=Bb@LH|52uuJgyMj0lXF+GTH0v3Vzb7r(9N3O=?n#ti&gi)@ubpFR zQro#33Y%2^tRHCGc3MPs{pF)Bn=c;GxBZX>%~jP?9GW?W{u-I^$)V`LgFLm1eH)!_ z=Kt&Xg(EfchwBfo_&$36n+`47H~3zb?sapvb^5VWuiWY{P2L)(-F;73w+-EHHBJqC zH*%f)tp4Mh!NcclS1h;@Tywm+*T-ANU4I=h>Da?HvAuDuRJqxwXXMFih246$TvN35 z+v1>8w@arq49^>0zI<~2lDRt<)N~)x^O)nbnST8pa@MV0)-!g}XT4jW)k0cT?yr~m z+M(>&D!2ZMPb-vHJiUKtSK5Jlm9Alxm#3%uI8VCJtK+zR=cD7I4P+NqX|}#}?1_o$ zy}4Q5?j|0`CKhVs?s*Uw5jFT}EfovB5QXRE%*xcfeqRT!b+I$(x};<3j-cRv?rb|y_2u!W0ms)nFPuHt?X_9K%*t=8hGh0{bHC@yflA}zXBj>H zy6=tMIL&C=XRppITOKob`_X%^s(d2d(neHl^_}tKlRRU&QN~MC`K9~%i&L(DKcZB+ z$1K5NM_z8<+dKQJ&EMs{`PPUoH65Eyc;0RI`Y@Mg7Z)wN?=nEkBXRPi$n2-tJ8~Z< z^*uUHxA&Fqmkv2tC9Cb-cr`h>qhX@VdSS!a)6Uyp9=_y!J+0NFWH%#Q4~Y8evgqT^ zuT69thRRkozQyzPxBe>Sw2Qg&Rk9PnNA}VD43|qA8WH;LW)tJ_Y_EgwO^);V_Yt206w!tQN zzhY`;{FlP5DQnkH_C7kc-Ox2U;n&XD&Az*UMFaIoWb z}IV5XOp57b&cwY=w-FO8H~PFQ&V=k zx~=J%%z4vZZ5!vmEcSMfj{Un^&PW_`wceTVY=<`8OE>O$930(aigMErDWe*7+i|z; zt+Yk+t`?NF-(270XQWa}$EUF)wuH^TzxHI)tGQE^`)+zP|I?}61Flbd?cqIP?Xpqr zV)t&@nTK&GwskFy)+`L|VR?d)_$Z&-Oq@A+8^wq&n< zqC9lV+?7WoJrC`Tj`V*w%e>%?huN#qhi+I7c0bgjrvEN?*L5RaNRO9~YIych$MNF| z%8uu>ZXB?xR(#vm-O}ysX4M&=x^h9weYMrK6~i}HrS-Qx=lklxxw|%9qgFT1eI7ew z#;|@ymFCO)x!#-A;dbwZ*Q2M6-E42ar{d_7QOAdc=s#QN2A|= z_v+T*aN*+O!pRXEiYh}Je>WQbX@uv_HS!**bC%XkXxDm6^ADe{Uu@(RZ#bxYqK5WG z+0wU1B7S`LU2Zxt?&7M>3rp5zU7NmrVYB{4K|6=fx)(QSW?fZ-g6)f)lzw(~i|KQ= z`o_M9*iS09AC~4mT-vH{>lxlxj81IvYCdObY)JGO$Cc4BvMm!%Z&+fY+eRg8#=!=k zazbSn-n1O~&|p=8y>Iord((TzTWnMwe(|O8_m4L!YwJe`sXslw?8EUS^JDLq?+%E` zT+r3B>RFTVSD#cgc2@JVh>om|UVn9mSD8L2Dgj5*=j{cie!R-fiuMCmI&c9Y!Wban3x(`f#{J|kxJyX~jL!h8*NGP-#h zx|ZflI-vS?cW}K+%X?4KxO{x|O&?e9tcdnse(tfqr1|UR{w~EWYwaGp_S1=5uW}22 zKD%$;WBCvr?`cOi?#^)QFk-X;EiKe_GYKW|t5Bu}x5x6t43 z|M@Qdpa1;*uk-(5`|H1Ndu;pn?cVwSzHR^h-?slzdi(QH>*FW>?eq1O}s__F32CI}iSI z+k;1Rnvedu{bGf(-MN+j+zw1X`*QZ)e{6@&HOX=)zVnamsPu_VW`{@oV>@G@qP_8$ z)PHOzyt-UiC-27J+woyW9szv@hyA^Mez#fF(cP1F|GnKx*ZRHV+DnChZ-;4Y_&mF1 z`^A5@J)UYFbt_g|oA775_oJSpm9JcQd*RP^Vyx|AACLKyzW>?o5qD&=bIRVcVp-(LL)y~VU`MrHJ-17Z$?IXQ6&x{q@q25M@jbHXIOKfj+Tx`epziaZN?$g?l zz06*UZS}MwzZ337SF^9ZjuzWbFD4AxOHtXeAT5hckL_){zA-!JRd66H_9@#}RjzEC zFlkujyuv06#nil=cCsbqtKOB@UUJg!Fh6Z&gV3E1CpOxi5ZJJJ3BTK3cWcdCK9A(P zerd;b<$*Weda1_S4NHrtw>93as5{4o!gsyq7tWesG0I|)W}`S zdUpz6D4Brs)dV0Imi!au?mA9-hSs(gSy{%Zk!oA zCFS^i|E{epDo^N^M_pSvs9r#T(azH>cF%8yEH zulR63IIVW1`njcFOXl1w80|2pZ~FlW2QOwPwis->E?b&B(4i9?U#XDET(vVvG6;yVQH@>xmS0$ zmIZ6CpA|g)!UbG(Z;#kPZF`F-0_AD}7wRz!-nPnk9uk%hWOtQ(p^Q!&! zokm;F8mAq8ZK+rJu4hHj*{4;Zt*g6UjWOstbKCslnJD(F3-PnC#%tX0U7N&Z1fQC7I)w&eA&2aMh%_ zn^)!cf4`}`Q&5cVwr>+OtJ=G7IkM?-Wcu*j6&-TzJ3ZGuD|@nV4XV~vy&6>N z`|;G);cXwkdg4Ahb9DWNIrt zGr4w9wRA6L!)5EvlXPAj8WbM&vss7b4<9TtTBD-T_)&Fovvy1R?5TBg$KaZd-Ew0q zubsY9_Vi}$3u=?oO}CHV-o$S6slB?(4m?yY7*|xLl^D676#RR*yc_WMpCQ9xr`1mUMKB&B^lk{Og;v z+j^8q?xs8Wty7=&&ipmkvoNK-U)71ijFpB~Pj@|DT@iYrQ_gyK>7d*ArjrUxYV1mn z-A&03>)_|zNv4@?Q8oUqlirPIPuESaHTaZvQnX?Dx!RRpQ4Q~p+3UXPe8eo%hjS9j z`(=F7&)?*8BB%a_;r;Ghum~xgd;8tb+Y{=)w>Z|!aeLpg)mozljYulrY+7C+9rSr# z`@q^ouAhqhP7U`9^0Y8Xuz4`e>g#*28Ixz`EbKCMpK{EK6kqc>UAw4;jD2)p=bq2k zwCFJ-P2%oHC@bBLj_zIj`F5sf8^5sYsXlpUw+@XC9~yor)h8#~Zlz|EtR-*V#=K3o zG%6l5D}8+AuOPeq-tyPi9PVm)#T2VGv9g-^DkPx!(rmRCU2>m!FM6JIBjxN-d18`A z;I{GB#v>A<)D7LoC|%KAJvToh<-S|ckf-BpZEQnVY;16^UzaX!5GdC%)b(`l{Ri+n%t|C;eP=_EfhhTKdJ;DJSMo{Kl`tGMr+T2E3g& zeaMD~kC(S?IXz%TPWhMWE&5ZwY%qDby3@6z1{HqUd!zwZ+~-ysWM8(;NL$zHu;O(8 zlECymCeIc*Cm3gH`1fc$ZqvMh8{!_1nAv696V2@SAIlaFd9@(#<+qBx9U|4Hg`F^5 zJIKiV@Uyu=X4em%Ut4$IokJ4`KN%6fId@0LN5|gnyBj&;;-u=<%AvRIs#f+Jq}}=G zyhn8_x~f=TZjih;WS`!axA1X&-t}wPlTtsU(I#z zZ&CG}eFmQF5R>ZLb$Ys*ajWKUXBfLQjQ)D##jtf7S8QGGnWf=6-*4;uF#UTuKbr@{ zjIF!6<^5)PTX)Aqja|6(=vOb-*J=iNhvY@a-YX3+AN^&+f)C!^j_waw{9$%pPIXBg ziw8}Nwu8e+Iyy_K=qT=Tqr*0_?fv$y z+&r>>SLa;(|ba& z*Ym-%&tz?nt$X-j;?u4{JB$J*#~umpc)Z%`k@gP1wh@EpXnnW+HSlF+a{p_pN3>G! zT#9%&eI0%_ux{@zvo#nEdHr>Dl`KUjRhJ*2;5%Qc@SmzWsMd+%FzY*}DT zwpaF+j;kZ9F3+AmA!hxtoTPrEIt$WgZO+WEOHLdIULIN8Vb{`SVFzN^gJtXkH= z_N~dg@5_~}KIcBEvhp5seNXknhHcXF9cJz|f8luRO?dy1Tdg&3Pd{+uj$PT5l>?^F z2n<#^x2#Lgu+altB0i44W^n98L5t-30l`xG=Xx3EmKBek_*wN@-<%Utv0Ky9ZHFD? zK0_0iOlxKm&{2M>D$M_Yr}5MtyP_n&FU9g2$KA7s-Pl@aeffQdj8AKnsu~x@Ha+ht zum5XG--H=clt(Y@(9Sw{Y{Hx!;Wxr63Ib)i*LsX;a7JU$xiRX`cFmr5s;^JL68Gj> zu3wg{e0+JpmdVMN<{$J-ICp&Ox=c-vnf^)3f8O_7zv4?;Uh_nqtLr}(h5YQ>{PW9C z1KxS{FgTO_ajD89Uz>UFh8S<^I(gOHrgNv}-%hC*eBe!;6T`Z@4nAetYr2+U&}8%K zov)@no-?WDQK0_wRqYC{-CVXI#W~$)z@>*POI-`yRl6o1jdn9Bc5W9lVRO#uvk~U{ zFWi+MUd~+e^?bb1=KD7fD%S0^Rd_^i+GcTn@FIh*!+RX*mZo(z^Mq2}R*kGSJ~$Fz zW^r3LENGv%tNp@hk5Z>3uDSkn#r2<6mBaS>=?yT7)IQj0M1zQSDRrlt&e$++^PAoe z&1QY7*VCZkwT2hkJoy#dcjcr#TkcLCm%C)%H_Znp+dNO#>@Vr{C>TF-$XA^kuQhG% z^xPx$EBVx^&FoNa&E<(sa@Mc=Ki{K6*EL z$7>kqcYb8qqkNt93g^nDO_V#PDPDD5@9&p6W?W`@V*6z#1A3%bd_MaAiKlA0MPcNq zxHNx*x^C}g7gj9YcRke1-*eo2=i<|iOgzi&ho~i3eKrUm`my_=@7wxX>}%BJf@9{! z(QliUJZj^eoOpNs)^7)QEs$P&Y%<=x@`b9pYlpa=;nn^z^{gU$?%k=ra?ZLlWsXiq zbKWMs**WOa%BtccAMPKVK6>nay?wzZCvU$?TDQ6W>y(m&2^Z7bKb&~^fZoTG@0@N7 zQfT}ziQKUA*Mkl3ULW|N_PTqw?+@>8%d}Fo{TvhdC8(C({@kv*-igWGyU#rK#{ER? zo3$sz8TMauZNy{W%2#J6*sKURAJ(A%=d!KirblONEzkJS=0}rRA({7=gzIM|+`z8 zy501T4VvX1Dxdw>xL@6I_NhJA)!ycj`8qOfRb;Sx+`sJ?7oBbk4&>q z4@-FQ?#$`|x^3=RPTv{jQvCG76w_}eu`7a?M=uYaJ3p!6!ZnY+#C?0Ya8Fj{&rNlr zjy-HVVD_@FNtU;Qceh()JKd@Oqvqq*53AR7*$BsowK2^&#=OgM zTCuW0*uW&c*H%}Txp*BIJHy#!>!FXMLp~TTnfATDPGJ4k+dN0Sm(IT3v~%sejCDEh zx-2!EHN|sg!}gb^ZLx7noosGjd{g^|?>C*FdeWYyH&)xdQr-Pxq>#dRJ`N~rx=p|T+|JZraf(@EaUC` zi&GbT7->~_^K{LwkyZf>&3_aiV{7b(_>aP?0T{H<-?=W$r;hkkAN-8IA zEjb>S-1Sp8g=ZV ziQ>TXK;wJaUV-adTg?b*8>h7`;oDZd=Qmr;R*W_{t5p^u`78(si8^b)YE-E6H^+Mw z9bzAR3CsBS$|cnQg#PkAx00bLx+*Q+oL5ia5okMdy_(QtQ8O z9eCHeUb^>{+#O$iM)qs^=3h_77se>1V`*ps2IW6*4m&vQE zyBIaHN|`?7*U15I#|&HDFl3n7cZcixjekw5a$Pzt%P;TlTE9U{(-!_Z>-(ee`MMvP zTzxm)HL?HjMOi8H+vQ9;)c#B(gH~5wHXrfydY!_0%Zifc4)5k2dU)~BqLJ4^=Zwnl zW9Bxzf4o&-llvGff=&ysUooD( z>iW74yy#-l^g(xvPK(X^xOU3yTk&~sd3(c>r<)Q+KK*j%Ns`^HyAO3u2d(|(J-p$z z(UF~JRwh?!=nni({YU0A{k@2XUYEam^9qXjROkPmk0s``1dW|3%Kd?JelHEl=h|>u zvF5~|`5@vn%-$P0gXKoW(x}0#H#Z?b%o~{cd(xP-SQv9A3)oE+y?!xKlCSmWdobNd zmd9kZE(S9B1Y=nsCY-FhXbg;WxX-KHf;>j}eggGUa36WduO4mm<>=4taS!s;SyF+ZJjtQ}{ zF{fi&hLpy7Oq4c$jws!9d-drp97}eq-NAsZ-w$=zCOf`3PIfaPF6nmZcG=^_yQ0bh zlCG8qq?SA{O_f#K>}mAICY{+386`=!M_Ofh9@$yAr|TeWsWNx}SR6%)ydHQTjxRG7Rj4Un9e*ez!!^zR7;l4Kc^Z# z&i_AJ%1ndjhe`Fc`7S1so|qiYbabZYiyv#w)bZaRSBUTS*JqfzudJ=4B~D+TS@oQn zdGO32H)c%*$w0}J^CmINoQqCUH;`+$5^E?l6+cr&GUdG?-k$?Nmo*D>LgcI zG>|lP+>MnK_AH>_ELW zavj@wKFwv!Eoo@2EoPQj%I#T5K*edh!Jo+`TAEzm;#T`7y=1>(3*IIQG#sNG-#x!Y*kCeQ05W(*VGoy zo0eRM*;`H;92G-+XBpF5*pHdu!U2bVPj6AMGDUx>6F*9vMP*5gbEhVCV1HtP4auCJ zD;At!Q4hJ9WX72I@6-vI;>ORVdA7B;7#27e zb=VgFi$Rt*u@=SeH}=urAOCCX_dmt(#;3&z6p}uBl!~M;o zuBNFG$oe)6=xSZ$bvP%I(Pg$FDq{=xQ&iEx$vXEQy zp9hP}utRW%r6RegG?hBYZKatEnHt;`-RCygO5FN*ldG#L1DA!}jp53ffBa`=5 z>ZsXRd7k8^Tc68Uq10GB5a7Eiq$W!CELYTyeZH9n_nOiOamUUzAeZ8}1FyyPsU+29 zVV-=Jev!Cq@5gO|lgX=D*M<>E-k;G*l81;(pU(sw=##KWf^7-J-M2t@&+ZDyK)nCNk=kPk#za)|1z?~>&T?G%IxfF6If?TCRzH2 z@~U7w_k!_;C90w3*6PMq@#>lOr!;shYUq*VZ`dfU#7Oqd-^At@6NQu$OxfqnLbXck z#G96ydrS}FRbdo{VGiofI} zE_22ues%F{{^QZ0MtzyXpT{c7G9HV_em`>XIOXww_jrNzpZ+{zux7QVe|yXzb2YFG z8^w*I^`HBE6&5iP_uai^%*_&`rL4C<_qEgi!~HCaCMo^Cbumwq2N53sSN8!5$%yr? z+R42C9-YNPiA$BOW$RS@#h5H(Ot#Xp_P2W7Al})jk#&PfNhJ;BDgG{&-~3%=Kds%i z|MGYHA(gsG3LAHO?NawNoq(1NO%qx+G7sqd&N899N3($5H6aOodQGzF%Q)PZao9Kb zT7s|ao=rblNooImWdQ@L%54TS4iC1LRS&L_77gK`Eo!oVjIo_H8;P-%Ayn)vc7Khn zjANz@$y|pj&Pr|6olGU`e;r-LXvoc3+}b6@|7v^{yEo&jl7jKIHD9a6SJwM4$5?Uq z&N5i+A7Y&S=T8x1E!Q@;Ds`z3M7;$mY| zl|jYa77F|CN4+2^p5@^f^H{iUf|~62c<0X}zEK+1l80W2G}h2s zwc0pdwWC>y>SXH@HGlgOjhT+tnm-!EYpOLW(Tr|vt!155qSYwHU#BLmL`UzJzn+?u zpjRp{)f=Rqp#N3N#?W7<)VQ}%fJtxTQnM1%fZDyyZR+&4N~j~V4>0!+DK!tBXk&5e zx{YOFae$>qsf|@lS%6hdd4kos7o}EHs%)%fZxXC)zLna1{no^`kzzLYk1Um@2v-y+ zWQv&zW!3S#pQ(_mPSl>JP*)qR7^9|UI6>jh$2uCxn2gP$l}fJ_syuj?DMB@O^RGxl1g1snQ<)VVc64V?uy73ojyqv#tTs<_J$t{(-sf zS#4K1DNj}lw+vOZQA8=!jK2Lo|1!lW#V9SAp`Su#@kE?k#i&}cNwVMPkR{tpWK7N- zZ^j~?fBj^QP=&0u*bTb7aPOtfN5zAJ-)}r9;|}pZz5V?m9w3Uhzuy0+Q~kFe_}`uW z?;rACe4GE_Q~$-O|37@_6kk(<(MCf{-ZT6yO=o;W;**Or~(&J ziAxYApUbGi6}*BdGKsQR5nkgec$gr&hBvs5w-5!Xcen{rCcA|XxQ&kxg{#lFi!Zo` zuegtIcmPp)dWatog|46AR?5Rqu1WA04};@h>sqk3Cl6=DLZz(H0|hj}p$BE!(19-a z+exMm0~o>xwO|Yrn8FOTQ3vL*fLI@#r>tbwuz@Y?V2`?RfFtUmKAgZ)DzXM}fh%|{ zENcXr%tO|MYznbncyqYH9WBuct)(IEu2lCg2Yy|uffIy5y5P~rZqcH|!5d!{Dla0p& zOvEHi#uQA&G)%_~%)~6r#xE|JIpkc-!+b2jLM(~T}Z@kBq5Z~CzB~i#ZtD@$-UTzM;> z3Ci&l&+r^CP=QLkL=|448n5vN@9_3dz9&E6BVzCgC-E6y@D<;qM*p z5EvJr43IKJj0yhAv|@fMat z98Y8g#4$itLLB>JH7+9(S0IjMS%`HI#{`LnIR3xPTttK~u*59tKNagfAXZ1FgS1e}IA z_EA2>@sG|x90N(LlbD18B;y=XAl5NV#RZ6CoQU-S#j$I|8i7S9#vR16wJj5eB zMhQw$h9@Y;Q#`|Syg&si@e);dg=)OUdx+ov6F%b$-r_61;Roj7C+6c97J$dFvfkkD zeOVvK(HAU_EAxd|fU6%^U02p0EV?Wk02XbQ4FrqK$_7EK2|O4I41p$wLJPy74L|5$ zICL=rdT0cFG=>41zz|Jggl4FP<}ijEOyCYvw162}qBdHg4qC$;ZD0W&vCAyc4pwLn zYk0s09bgMj*ue|-@J3zuzyTfMh)$@7&Zv(ra6(r&qZ=BaJ6zBMuIPz|=mmcSAP^%F zgkX%qXpF&FgkT)TV*(~(5+-8`reYeVV+Lko7G`4(=3*Y^V*wUo5kj#TE3pczu?CS? zizuu^G}dDSVi1ds*o4j4g00wwIBdrb#3KPau?vaVjU*%^1*zDBG^ArM_F+E`;2;j+ zFfwoinaDymjv@!ga2&Zffs;6eBAiAZ@^J=dQGjzej|;enOSp_HD8yAM@EKq5 z72oh3KkyU3Amd4Ro-dT~*P4uV%USc94?z`b5UX%&Kmkqg?37F!I?#n4^kD!)7@-!7 zVFFW_p*HHk92T&I6|7+cTiC%Kb>RR<)I)tZ!5IzU0#`IdV+5cH0?`yB(F{Roj$pW9 z6x=ZyEieWxF&3>5g4P&^HW-h#n1FVei1wHS4@^b}Oo1n+!VA;jjp^{g40Oaybiyoj z#%y%K9CXE8bi+J!$9(j_0`$Z}^ui+aMkxAVF~pjNOW=#8=!Y=$$1)5+IK=a=G8gta zQX+Sfa&i}`L?)8TD#$calT0VI$i1XCxsTK#_mjHh z0aA}VNa~Y^NCWaPX-H;}M&uE)7MV#JlUbw*nN6CKM@cg>hpbH=BkPdINpmunv>;EA zmgGs&iabSHlcz}=GLN(+^GQ4M3~5iECF_#sNJsJt=|aXEa=oW<`H@q|o#a$<7deeg zB&U1GMijZ9wk?hIpj+67`ci(POc_%$u;B&GLk$=t|d>A zQRHcI9hpZ)llkO&@(j6wJWIxq1!OFFj@(F|CpVE7$j#(MatnEh+)7?1w~<%KII@u3 zP8N|n$g5;Ld5ugUuai5;8{{tXCYeayB6pLw$t1FvOeXJ;Ddb%;mApspA@7rEFc6B%hO6xb3bZuaVK@b#gs< zgWN#gBxA^1WGs1`+(;Iao5(xlX7Vn%g}g^@CGV5l$OmK``H{wxr=;4CX(gkZt^LaL_Q;v$>(GW`GQO(E66=$C7DLPB-6<%axeLc+(%ZE`^nej z0kVcXNWLKtk#EVv322L}rtp$)n^KGKc(1=8`|i6XZ|wB>9UJ z2f&gbhZ2;b0#&F%9U4$T6I#%Q4s@XheHg$HMyLg2n7|ZfsEs->hXpKQ1#8&A7Iv^l zT{yrI^-v#9a7F{Tz!eSA2#wJMP0?yIhGhsx1eRk3R$>)aV+|s) z7ExG-XspKu#9%ufbMuNP6R;Dzkciz#LNZd2iakg}I`(28_TvB!;t&oa14odFEM(&- za&QdCk&6>JiBmX@JmljH&Y}S4a2^+M5tncoS5Sx|T*Wn9#|_-XE!;*i?%*!&;XWSV zAs*o|N>GY2JV800;u)Uf1u9U9m#D%kRO2;j@CI-34)5^+AMpvF@daP;4d3wtKk*Cd zR$K|tfCL5P(1a4SpbTxOKnJSOg&Itu2Q%oSHVjY)hA@W_EKm#eV2%2)ffH=u3_CP{ zJzP*1u5ds@IHCm_p(Prl6`G(mnxYMwp)H!D9o*0!?&u5;bU_Dng(tef3*F(39`M0n z^ubX0!Vmp10s}Dy{uqk@gdh;(FcRYtgb4`7M2x~DjK*?=Vg(jsC6-_nmSQ!+um;Nz ziEyk%1U4ZGo3RdC5RI)^k8Rk1IK*H(VzC1ok%D-nA_04_6KU9mbR=Rgc4Hrsupi0D z#sM6~LF8aEj$sOp<1o%+DlT9eE@C<^VFoTEA9rvScX18(FcbGN3olTD3Y4M}bMX@M zP=%-XjM?~tIrxhC_=W}ej(2dd;XLuYkP|tMUBQ`rN;V;T!XJ|nfGG&XRE)$l1YtUY zF$1G86QeN;V=xmfGT;K;+3`awZfIk8dh;cl> zJ(65t!R=Wj+oQ=b7>f{$!+10HPrlYPml;0?V-iE3pczu?CS?izuu^G}dDSVi1ds*o4j4g00wwIBdrb#3KPau?vaV zjU*%^1*zDBG^ArM_F+E`;2;j+FfwoinaDymjv@!ga2&Zffs;6e)5t?U&fqKxa1Q5j z0T*!zmvIG!D8f}-!*$%iP29q56ypx=;vVkf0UqKJ9-{=MD8m!HL=|448gKCq9!cyM z@Prq<;e(FogwE)KuIPsD=z*T-h2H3czVJmq^v3`U#2^gD5DdjI_+dCkz#jn!#7G1o z7^5&6V=xvW7>DtgfKV*P5-dd+mLVJwSdJA~iB(vQHHgGoL}4AGu^t-`gIH|DCTzwQ zY=vzy`z-8H7Y=YlJ=BL2oY4R-a79BjK~pqCbGX4BEzlCJ&>C&f7VXd;9_Rp1c)=S! z=!j0}j4tSkZs?94=!stFjXvlLU-UzN48TAP!e9)+Pz-|~hGPW$5r9C9L=b{83ZpRw zV-bRJ7>@~k*5M z*o4j4g00wwIBdrb#3KPau?vaVjU*%^1*zDBQT&`Vau}IT29SHn@#H=-ggiiQCl8Vl zZ1#s&=t<;h6d;k7xaKD zdZHnEp%HqcG5Vkh`l2a((G3029R1;j0dU7aw7?*=#9*|-5Xh7zUX!Ad1?I-c=)>}w z6jg6HgX2c>nv^&gsKjeh)T-eMirTy;#W6(D2po8n*W)B!&y#pPPU7`EiPz&KUeA+w zJx=2FJc-xiBwo*xcs-683~+}YT0kEyVSrXJL~9tK4Qin+jL{Cv>frS_iP!TaUXPP_ zJx}8GIEmNuBwmk`cs)$QTExN)E-C&RI zsEZzOKuP8IIuzj-wp8c#0Ev zhLd=XQ+R>Xs6ZYnk&l-+gDRZGD-@s_=kOZmQG*M3gNt~JOL&LNc#kXifI@sk5kBE6 zKI0m`;5xqI2EJjkiX_{JDcFRm*o zEUZH|qHz=(a11dxj!-SGJ1oX&EI}TYA|GKmgJn32a1u#c5*M)wm#`X_ zu?ANVi9)PJ5u$Jv>u?RxxQ_L>fepBc7~DcEZet^gu?csu8F#S-_plZBu?-IphlkjX zN7#YKh(`$$P>P)>!!A5QBFeEFPmzRYNXB!d;001qfjy{18eSqDRoIJH*oSKD$7>uw z4G!WB4&g20O}So>fYaECJnTX~5^)B*aTZA^Kr+rD1?Q293)q8;NW&$h<1+T*3ihE8 z`%#1gxQc_ghC{fH!?=MA+{6*wLMCn_3&qIB9UR47G5dFAFc7=W1=h*=nf*%*vD7=pPNig_4@`S8O6497x@z#@nenJpyPK@NK; zp)Qo+02Mew74@Ko`cQ`xG~f&c8bA{+(1I(p(GWUl1YIM_ZqXITmFPoWg2 zQHDG`K|acH2I4uOvv`IAJjXeR4zTC~iw>~p0*el?=mNjQB~;-uUf~Kv2Uv80MF&`P zfopITq5~|tz@h^zy1?&n1EK>gy1=3XEV{s=11!40q5~|tz@h^zy1=3XEV{s=11!40 z-|+yV1N;y_@d)A}(rj)P5@b+<91P(y?%rf-P=yB6p$P@F!Eo}s3#>!xLl1^9KrI-- z1jaA}yWj6FaBb28=CFb#Y+wyL*rG1%;RpxRM?E;h2`*@WhHyn=bm3QMN;W}rG=n?b z&Il^g>VcL2vk?FZ!b&24VmP zV-SX72>dV%BQP8R@W)65A{ap!jZqkjF&KvsOu%?dg4nI6U^1p*DrR6hW??4gVh-kG z9u{H&7QvUxEtC`;$fe{GEJGNUBLb_j3ei}H7<|NLY{C|ZZsm5;noJ<$u?st~8;M9k zGWH@J2e2O*IE+jj!BJ!*7sqiDpKumuQ1BRd|hR)IiSd=q>pM@BZWm z@;$!bGrr*~e&9QP;U^?6TfTuzbaUkp-CWVpRf8%-H&=9YMK@P;bVWB;3!}NOn=3lHqMIu^x}uvaI=Z5pD>}NOn=3lH77!g>(ajYdUD3(4MO}z)t|J^EI=P~o zD>}KNn=3lG4InzXqMIu^xuTmZI=P~oE4sL%lPjM46VCy9km5N&PqG6#p(8}+R&;Mg z=T>xYMdwy@Z$;-;bZ^CTi{d#(@torXQar~fo@?|a7jt=uPJ1{hy6h`R(PdvrithSa zawr)^ioe~(-|+tAdbR^d@wfa)as%7qxdic?!YESw%|C|R$j8T$v84DLU;M2vo+}OH z=ZnAn#d83Y$ZdRHJQq5Vk547z*cM&)9i(_JRXnE}N+z+rgcN_nFC|mijv&Qz2FuBP zY_A|iM|q|AINPhpL*#1G2hqr4TRgWQo?{TtIf&;Te7KJjU0~5s7F}i0Q5Ie0SrA=i z(S;SASkZ+QomkO@6`j~9D9Jp2cbCKYx9Bd54zuVkuYl+-iw^SvD04c|RTiCP(N&Iy z=qiiOvgj&{&a&t#i_Ws>DvQpt=qhi7=<05Q=qiizDZ0vAa12{<9O8aD7jY0><&+Q1xbVS#qAM0;4l1J>vO z8+gJNUa*5V?BRpD=m-aNf+ISk9=f1Dy21(F;Ee8QfF5u`Pq?BN8lpG2;r{M=OJrZj z;R_}7gEIO<1p}apfl$LBsADiRFa!z=g(ikU3x3eXaOhwJbP)i5j6@)U5rokgg|Qfe zaR|W#jK?HQ#1u@%G)%<|OvfzD#2n1VJj}%c%*P@u#A1YE6;@&mR%0z9u?|sKk7&eT z12!TSo3RO7u?2D1h8@_B1jJ((c49XYk&GmyA_ZyKgS|+{e(b|R9Kc~5!VzR33z;~I zY#c)la&a6daRPZbjWftc0nXw)&fy|1;4&_u5LZxyQ@Dn!xPj}qg_|hGZQR8j+{ZmU z!~;CWBb1^9Pf&)ZD93X=Lj_*oB`Wa>Rd|hRyg?1#;VnMkJwD+hzTh*y;VXXNJAUCO zBs#D%C_xStC_@dZ5M5`{c@|w~(RmhKXVG~UU1!mG7F}o2c@|w~(RmhKXVG~UU1!mG z7F}o2c@|w~(RmhKXVG~UU1!mGwt+S5V2ir2ha(&yy3V5WEV|C3^DMf~qVp`e&Z6@i z0MU64gy=kvgy=j6L3EyjAv({aAUe;ZAv({Z>nu9YqU$U=&!X!rI?tl(EIQAk>nu9Y zqU$U=&!X!rI?tl(EIQAk>+Av1b?yMsb@qhlI(tEMoxLHt&OQ)b=Z+9v=S~n^XVG~U zU1!mG7F}o2c@|w~(RmhKXVG~UU1!mG7F}o2c@|w~(RmJq=sYim=sYih=sYil=sbr( zbe@+%be_W@I?oYM;eJ?jAVn8abRb0+Qgk3i7gBT}MHfBS5TICvCzBzO#X zGan1ABmHfxW<<;MrhrpaTt< zzyLO|fD0Vp0}t#2#=vvHGO!=m7c2++gB9QaunMdM2ZGgL4LArK0uBc2z*=w^I20TX z)`N{;12_U~0!M)(!Sld#!Slh<;Dz7?pblOH0`OuGfe<7h2Ae?&#z6yY0WSfQU;;G3 z6nH6^1~Z@q=D;l23XTEWz_H-v;AP;I;1%H2;8oywa2z-hoB&P+CxKJJDd08WG;jtu z9lQ>_7Q6wx9=s8p3El+G0&f9t25$xTW_@`Z<9!(4&UjzOvl;Kl_zuSVGrp5izW;gP zTyOz6AG{Y_2rdHe1MdeHgAalafDeNYfscZZfJ?z8;Bs&o_&E3&xB`3vTm`NK*MO_R zC&9JgQ{Xyq1GpaC1a1VM1~-FSz-Pc`!L8tP;5P6D@Okhh@I~+y@MZ8d@Kx{)@OAJl z@J(ecZd>8xxd>{M>{1Ds)?gT#pKL$SoKLx)4KL@`8zXZPlzXrbpzXg8) zzXyK;e*}L4e+GX8e+B;le+T~p{{;U5{|5g9{{{DYGWQ46!2Q4wxIY*M4*(g9k8Q4`+NH*Z>~L-#0QoA8Y~-;_pW=z7QM<9?aj5VyuG~g9Zq|I0(T@ zKm@jc7)*c!Oo9|lfz6-^roq+VrQjOS0=I%0@L4bmZUb}RbKn^8ZLk%52MCAp??5<= z{{SxozXUG_zXHN({3m!N_!l@1JcRQ;}aNP$M{6X*E2qe@ePds$9N{=lNsO0xC`T1 zj89>F6XR1E-^}k{{Az@ zjf{U}+{E}N#v>U2%y=Z@Um1^L{2SwQ8UM}rJjO$x!u1E!;KksjAOI~8f*BBjSrCIc zkbq-A3bumH;8@TA+rT(@8F&eJIoJYT0VcpJ!6bMUm;$c`O>h!85q$aS>@VOe;0o|n za3%N}xC(q7Tn)Yft^wZ!*Me_>PlDUQb>I&0De!G@J@^i|0elzS2)+ky0^bKWgCBrT zgCBy=fFFTdz@6Y$a2NP2_%XN*`~-Xs{1kj1{0w{n{2Y7{`~rLlXxN545QG}J zFu^dezzDFxC~&~NfeY>fJaAv&gZqIoaDT85cmP-i9tfTT9t8FU4+i^zhk*UTL&0+J zFmM2PI9LH50ak)Xf>q#AU^RF&I1oGr90VQ<)_})>gTdp$A>avMEqEeW2c85D1^)*Q z15XC)!7ku%@D#8CJQZvNPXn94)4>to8Q@5;D>w=~6Fe8}2A&6Y2S@FK7`sDo#N0K6C^Kr|^*#(fzZjGMtrz&MxyTfhuxfn&fNI364aP6Q`_lfg;g zRB#G-4LA*)0Zs?61Fr>d0Ivsc1ZRRbfwRC{z?;F_z+1uD;O*d@;2q#y;2iKC@NRG( zI2T+1&Ij)W7lMnx`@s9b#o&YB1K`8pL*S#}Bj8eS3Ah|w20jix2Ce{~09S!4!8PD& z@JVnj_!PJf+yJfzH-Q_$r@_tO7VsJHS#T@(9Jmd90el{O349TJ1$-HN4SW@R1AHBP z3w#sY0d5E10pAAS1K$Nd0N)2c0zU+Ifjhyk!LPt?!EeByz#oCs8lQ_#D7D7tF-ooR z`HWI)EH%ecYb-U#Qfn+V$5Lx7HOEqGd=aD68cWTw)EZ08vD6w%&9T%POU<#=8cWTw z)EZ08vD6w%&9T%POU<#=8ehUFwZ@k+O0Dr_j8bcSIiu7Xe~eLTjX%yPwZ@-dlv?8} z7^T+uN=B(QzKT(5jjv{uT4Sj>mRe(}IhI=EPclla@pX(+Yy2rjsWrZyQEH8EV3b

vwerPf$#j-}T47DlNxmYQSX6brXlIK{#(UIkVH;S>wESUAPPEf!9( z_`kv_7H+X{iiKM&oMPb?3#VAP#lk5TZn1ERgg$Q)~d?6brZ51rG3m2lfGD;5lF!*bnRrmV^Dl3UB~e z1y+Is!D_Gu90U#l2ZMEBEf7xeq2O?^9tfv+0}xKJaEp%uM}p^p=Yr>hqrnTo3qT#b z2n688AOaysKnym66pVug*aBVxCcy*{PVp3Y8Q2D10bUMX4PFI~2giXE!3p4Ga1uBb zoC018&H!%&X9D36p9O?#doy?&cq=#?ydAs~yaT)ooCDqi-VM$J=Yk8s`QW|aLU0jy zA9z2w7zhXWW8ez#32+s-5?lkW2A>4if=_|#zzyJfa1*!@+zM_1w}H zA5dd_KI0JM3mAtPU&uJZ_#(zp#yaD@8DGr!2*!Z%k&GeZqZlK`M>EEZk6}z0m;aAF z2^;{P3RZxpftBFtU=?@;(=5dxOKk zv%z|xfy03gHUI-`1SZ%7EN}#{!I8iLM*$ZIr`-d>Y4^d=U<~XwQp1?YIPEpYXMrKG z2N(u>f)TJ67zKNSdxK|#`v48x7wAB^?FP6%Fu?13#VPU?ZRmnZo6>Wh1;i<-{uFR9cq%vqJPoV`PY3J3Gr*x>S8y13Cb%730`35pf^UP% zz<0pqKsfEfZ5K|vaNC8`F5GtEv1M0@r{a1L3y+1PHhNr$D&v zKLf&T|2eoG2&er9@Jnzb_!YPb{2JU0egi%YehWSWeg|#=zX!L1KLFvj{}J2<{scY; zgwy_cAe{Cu0O7QM5eTRKOW^O|%itg2E8w5ttKeVYYd|>d!fh8$yKviu(=Ob0;j|04 zT{!K+Z5K|vaNC8`F5GtEv13#a`8Ae?sLwhO0Sxb4De7jC<7+J)OLoOa>13#VPU z?ZRmnZo6>Wh1)KicHy=Qr(L-1!f6+7yKvft+b*1T;kFB>UAXPSX%}w0aN332E}VAZ zwhO0Sxb4De7jC<7+J)OLoOa>13#VPU?ZRmnZo6>Wh1)KicHy=Qr(L-1!f6+7yKvft z+b*2;{ef`Wh1)KicHy=Qr(L-1!f6+7yKvft+b*1T;kFB>UAXPSX%}w0aN332E}VAZ zwhO0Sxb4De7jC<7+J)OLoOa>13#VPU?ZRmnZo6>Wh1)KicHy=Qr(L-1!f6+7yKvft z+b*1T;kFB>UAXPSX%}w0aN332E}VAZwhO0Sxb4De7jC<7+J)OLoOa>13#VPU?ZRmn z@}+Rvh1)KicHy=Qr(L-1!f6+7yKvft+b*1T;kFB>UAXPSX%}w0aN332E}VAZwhO0S zxb4De7jC<7+J)OLoOa>13#VPU?ZRmnZo6>Wh1)KicHy=Qr(L-1!f6+7yKvft+b*1T z;kFB>UAXPSX%}w0aN332E}VAZwhO0Sxb4De7jC<7+J)OLoOa>13#VPU?ZRmnZo6>W zh1vjnyO&-+tMq!0((64-ulFjw-n;br*`?Pz`}mF0XN{L$zohhf zOX>AQ>Gfpk^;GF~v-EmrAOGsoX9)*Y=C}MgrSw{UE^|%(6tCs?%D;bG={UkoEsi66 z*W$JOyf{wrTK=v4`|@}7yyWjIo-g@%@!sNh#n)Z}I!`cggX| zvE+~NSBuxeQ7vA}&x`jKujSv$zrULI3*?WCQd1#+zhDtlf0n~cT3$$BGeg#0PL z7M_%FqvVggmi480EnF=5BiyI*?+7PL{_F~%w5U;D3$B02WAF7-F#OQR-fMSo7`WH+ zGyityy&mvyzE1z2UHX5de)6<=eonrm^3O9Wf0~_C)jvJ6>WBPnw|RcP`#e8?);vGo zW1gQ&9J=ZcG1kgIdsqHc5~bCDwCW#|NUi>3RR8#1XV3HVbLRQ^d*=E1h5TII`0t+b zppmIyGP&2I9vRG-_35BBleFq_GTGdFYcMleyY`d^-S)_PIjv-Ka%?@An{7@8v%%Qd zWFr5cnQhTzbn~{cv8iP1*jU5T!o*9HG}0YgH;t%vQ0JIqW7)CC#%7yalBsbzkB*IP z>b#tZf~op=Ql~j7M>0L#&|E!?w8*mTI2~GDb)@2m>(yE3pTH4XNi;itOu}(u+jR`f zN$tSV>?jO|H!S`*!PHc9mTwzQ$XRucX#}npg^?ROzV2ypI&xaAe9+le!Y3!kPPdYo znepb-*jRmRY}xqa^u#V)+L(W17#rJ|w8n!8F2gQqv$f0i53s6zuzl6Lvp4efyx2}+ z-SsuwO>I3&M-S}1QBx`RX|~avoSuXZUuKcy8!Bv1z#az1Nh_ zsJPC>*nPbxkDZ*TN6o3(WNKC}x#gLzZ5x*FreqpHNSHC$uGd7maO)*8}imaYGY%1c%Q7|!4Z>pCKE%BVx(KIIw zgDCOh`@M8oc3o$-P0a?!@+HT)f=vFY8R@diJkDP>TWh$LyLA6@FvDe`xulXo4N zz2IckkLuG+`R9i3JG$+LrmGu<=j+k^*H_(u?L0a>i{n$9>l5R%Nh_G(h>4-wk)y}D zZ8)B0nh&Ua7^9h)dg-VuW@dVxNjZ|~nV#mmj%o8GCFTPUsXDjn$uTn*b{+*Td?QU` z(=}rjh&1M|*bh3cw(~A-G!gLqW|G-Dmu0fJ)~4%6VH%jBWkiWt{3v~xpDH4#ZRlm_aie5;waz_TW0*wwY{I)^R!Nn zZ%K}s92;BDc;vd`bn2`noQPqjL6D|yVp|sTHGJ5?i@z%@IrSOVwq!DUX3fAb<23LM zUpHOPh#tPS>R6?D(lbfwvII;9tu1qMW^w4odg?iL6!|RR@gt5J@Oy4;j7N=n^O&SH z5lm0Zw9dY=vXyB;=UcCLn|xxQ_i z>^Fw(YpL<5LBBhjmVA8<&Cw#ybo{{g!#J{1({>;21&t=FV=I^$kG71BnU4N5_^u3TH0fet5|V)(3iLqsdut4tZy}^lh*9E zBZG;#q-U{Z?xc~aIW8-$;knx523R7n9qOGmf@^4Mu^)SSoP>#C_+j+;0XF~gthUTZ z3w&;>Bd27!PdFmm0j6hJhhx4?omntF!4ki$JdgS}@UH#0VY!Cs$G)NYw&6N<@Wi|4 zux_ZEK^S^w68N4QSx-8$d{V`v=4RwZ8e2H`q|5SYPS4h-^Se|(Ms5>V(+zZ!O$!X#a}rht zE46e#NmJj5pK{pZ&rU56V`DFWc{I_SnQJAld?lx+MSALB351#zrJfc&b$|ml!4F~*qFRjtf|@YNvzm?^l;Y~F8+&ROs3!9BA z!{A{4OeNFUXq?mB_(Uux63UBu+G|oTz%Q;k~ywn7KEm0SZ2TkG()}5RjV{Q`{!QBHfwk> zv&ITdEG*-&-V57fMdF)mPU^S^>;@a;^(OUldMv~7k_+p(z8KpwscGmsatv!Ghubzb;DHiob?M_-%6jl z9?aG!61BGy%!thdU&r-XG&I+7_wPMoaqHD1u{L-acByO|^(crMvWMGY>L)}SOv8>6 z?z;E#+-I6UBC{dEe4a_xOid*cUdVmY`G0>S&#=UDlwl`cPkm;hskVI2a}z(&49~P8 zD{&nE+1cqAOYPj$c+`}*hVr&JTP(qlb=fy{JVyM*u>-r;SoJL{pLhIk;s`AL%{jTd zfv)rLx>{fd>~K!B&!V5-#7U9>CoN4ZEe>sc*;qU=iHF}L*wJ~lGXL4K<$UYnpBqu4 z;|v65iW~0fq5GTx=G05)i0P!`Nn9U~v6$qg?E0}~*t!w>Nnkldw$gp~?VSNxKy7Oa ze}~&PHg-_%fo6d|&tC zX=uCnz^SP(U%qTtf)6ssBp6c1w5!mr^F<|g~;PKiN>|$?xul!CD&ZJ zv3t&|FI1k~-QOhN?|SAxVMey0)RJfgi$}WZ6^niBH_oN$_^~_o+}mzo`7vH`I=%rC1O!cYP=F95-@Vq_yP0d8WUb1r;~hvUOL-J+_iW(`?NZenRrgZ6{Y##m6%U1*x{e>&CMJ^=VRr^$wu zgUsyBt)_}B5;f&NH?f?Ml!qB@+^_p6-41HWFNs=BaWe4dLof1Un|QWo;nQzAaNac_ z&rXevk;h3|$FQY~4O*9E83zgiBQZidHqy{aqbNE;uQ(IsfAZu+vL7}A7SzBXp@oO- zVzVAOK)_aFg=N1VgUqviA_%F*lBQ`#9p3%%+g~Um{J&YgP%D{EW(!l@OfBM|x)l&z z^#d<{ZtnbdOvY}9ZRP6aSqwAx9F@74`;R&?4ky+;!--Oi-sE`)Eb{c&P>XvVn649g z1QZ?JA|&k{y(v3J=X`pMggh{jdpc{gL`dfAit!6Fjo`Yxfx0Nc_`pZ|*T1jrs^ z7RDV6mCl!wB1CGC=pjh!_*NP?FBo8{D^gY}8mF8q%Vtw`V~dz^$elA@xPDn{Ze}); z^eukg1oLzv*&IZ86D#wdh((YELDNa*BQ>ogb%WF;Vh}AV!%W00(RJJeb7BZtYB`cAlIfN->OKBne)_)3Yt6b^%%IBbaq zH`0wJy7K;|<&ZnDqB+rQbtQpV5hP64NF*hmcwS^gu}179Ny!#Zj;gTERAt(^I^rW~ zG@?j(FyG~luw9e#BMibK*Id$59ykuyUo(B(a6Q*Erw5q%L8}#P>j~hKezb{e#N1de zU1+_u@_3cD_39vEZ!NMRv&2fdY%HO!op=_fNWj91Tl2;R)pC>thg4ihZY060_I~L( z1YCmD_Dmd5EuE=6vFZySH;LbsGxeNU>cl~s*eSL&{)Fz$9#mMW$0S5ij!dFuoAzA3 zZ)b5-#0p8Pv9IudR>%nd7gtyu0^(wPwb_~p5ApOB|jUeIDF^TfY-3|#?Gt5^27FAHJcbY^Nl^5 zwFt|8+aZIP065UIvRvl&bnG}JvSKsjtFfsEFZ=(eqZPTKOB5l-=Jj2i;g{#vv}5!Z z%)92aaw@7fwJb}OI&3?sVI+|mC5*4w{?bwzk&+xuBMQjulN7Y92nQxLUWrfC%?HdJ zz&OGAo5Zwv8LQk>w!Z0ZOo}TZY-tk3w!&A{%X@sW92MjGu6%ZTr^=Q(A%duUbXROO z4IL|DXLV!KWVf(itz`!8%*43xx@MY^*4wx6W-MKUJf@vk+rJUaG{RPMD=C;(05fw#uyvF07}bj1_Gqzv8*FYT)$GRXG`r`7Tx)_~DXLcob6x-1RrpWHr70S=wUuUYsMAg4q=B!$2V z6P4V=l!;fP!c6LN|gk8ZsWAH;j#tT_>ef)H+89ROL;D^8h$A(W0$OxM2CHCtE zKLj*9Toae*gKZE#^2nXE6 zw|A(+3zu_EJ3-ZX)w9E=34v%o#OkozAoR7fYJ=M_xE(XtFLg0=gi_fc0Y)&;gB%Ri zBu&FN)fS!1+>xwCey^cmCI$gw!?P1|8tI#Bjb+(>A@L&EA~AM}%D_zq7_#ev>1Av7 zTwStqvtPr>8<*s$3Nk5+YYp!b+lxz>HYenZ;6tn~oO{`(8tn?iVzeP)l7ID`-D}mw~1n(Stg~H#%RDit!n~n&9an2GB0h<7q zzz!0Uxj47)8vGDZ8W1FlLn34m0lMhjwGCa|#p2Sd36V#zJ02R$wkg)66*4eS^S?rO z4}vge+v3S2+3&t*XB_n0!YW#DgDqmf^<+vOqaeb0G?=Wh1n<-6yg{rrn8d8gZ99^~ z#W6G2Np*-gp^LwKeoey_jFb9HRDnd&Y6(k!GS~t)E_)4=o|)stVM@?A)O6>9>NAiP zuDJgAaqGKGSs|OW=43}`1Xd!H1h`c?bb3d-u$HI47rZhmc1pB`a+J+#`DqXvfnh;# zgqUdz2lu_T!}|8kzOa2~LS#YUu6U+PNX^ykSQnd`jOP1lhv!EuPA|VKS#Fm&Gc1*&fQE0#sPH`aOi|&SF;{Ot_GbHY6dKiBf*Iw24%?n>CW42%hXPlVjQ&EFb zkXWumuchAmmW}h$Vhre4tX%}IO)sGs;Qh7dRxQmkD@w~V6Qi_32XRbJIZH0HI2IEQ zqrxGoOia{PF3ksOi()`a`fVzy%U6h1l~x0WMQZqjX@!A_cm2WIKskJwY9Z7BxEpTf=1v=7(%sA?5{qYwusn$0a?(oj_w5@F;4R#Y_t zTLxSz&j={aiJjmhwS5-hZ^%97P7VhQ!mP?gK3*Qa)Urt#wvEuQE17U6w zdJR5St7JM?E}Gp=UTbs6RSI2GmAaVJb5Voif4r9GemmAw_UsbS7vdXXTbOTRio+vR zE}F*n4iCO7MbI-TbuQ*M4DA_qm)G_TgeIQQ0{bAc_KJh zwwL!}F;4g?-*wY+zaBI%1DZhwnmZxT@HeJD0I1t*ZX2oGhUR%r_-_o>&3B5XoJ?%3(q)tk-k=3zm1PwGOaRDmaGDLLakSuMA4 zwWPqakQ7m}qSR$#Zc+j|Y!-NlCJ~XCs%F!=xu%uB*-M(#4sA|YV#Xsf^3$@AL;doI zhC%Tll)={b>4o0{pA%a?@+j1VGn)jTS@)MB%-yuiO@5pTii@UZ1b)I!(t z&0A}gl-81&vapRpzSgE3)P#_#!$I*sTeG`^mANsqahi0ftO7D8<+^f>n9M{0xNBbO z-B!z)1D%=IGo>rpV?s#FXf+A7Sd?b~A-A2f04* zKVLhh?=kDO3v*L)2O<)DaF7r)q|idh)e(l(7pfhLz8$I6jHoTItHNukXv}jcRHea_ zj7$?+P{5}9#o8$q5hixr9b~tx6JFrqLJM3`Q2lwn%Lz5hV%dT)Zc=msQzZV<0Godi zFDU1|xI9K0L8A{fpEzss<=Wh0@6gi2gWMo3aS6$Lrbe6=){y>{+L}I!jRd$=1g&?$ z?d8_!lnU8SOsoT{V`P1`wxauinU}LQ2UDcT@_IZ!*qR~qbe+VT^|ji;`IRUvf}--N zb2{@H1Fr93e7fW;i0F8B^z~ZK)9O5neY*hF5CzFE+X6KBZ^XH*2;)-j#B>NKJ#s}9&s!cFE7@h#Z9r9ExZF z9I=FA(dau%J4zJ5b_}?9u+v!Kzq_QPkSFn&piq`0CQy`quXgm}9>2+8TPT5j#an{~ z4r?G|f`(E>M->2HGz=U_+pdjE8WG5}zh67MV&$cXon&NLOJqrL{rhZMtg7U|!rEauy=7(NLA_F7zEuvj}}BKdfzB+{Ml=GvXYT z3{`S7x^QSy<~z3Qk7{Yp7nz$)y|J+)_&>#|ikd&uSq2voxz8Wh0E(z#kqz?AgiyD3 zXKj6Bn~+&ptFo1$p0Rf}s%2u6%5-m*xP`=DnrSLA4D~c+uelK0u-!1AJgu4g__H;Q(RSZ=nK**2huFeTYg>2b4nB@`6i_TJa}g;T-A3Ai zx@IY&`dQ5@t&`dEINr7X)muS4E|j*&u*1lqQr2)&Pj~d6*ZSxfi?dZF@Y9GWVM*Dz zQqQzC*F?v#i)>dc{>8XnRvhIB%gPgrTZjc+2zHR^*D)e|NuN_4_RAX5KJw^wFaGLS zg+awXh01BQ?LZ4CIks3(eag^()n`K}Q)KzfVgd@noVD=oJwK#K-nV{TYcAV$a&9&g zJIbT#>WgeF7+0-jN98Fse%>#L)U|%qF)|e8;+O!wRxU7P#+Ig$4bybeu;y>>@lX8i zJ^qQmyT?EA_xJcG{$bI&`f38*1bSp!j#lxEL ztdbDOL&O?f8P`ZG52_O^h4e4Al?$I%dqZkJ_*8WeIkljiq;Uur^{)dRroETJyfza* zB9cnP)3dz4?ewYQ@|at(<>2{H)30fNuN}CExWB9$y@DQk95O{xAN>Xj3N_~+i()Kg zM}n^&`4-s>F}X>tnE$N3vh3<)w2O?Bv?R+ed+Rz#O*qyfr`EG`qZ(qE6lXvKHxOWP z{#Bj8sNO*cn3O~{I%V`sSZd}{gc?G8YhqnS^6%PFN?M(bMnZoj!$?E8( zMqfxQ8QH@%$+Rwyq#(379}mQcKpzQG=64Vt_Mh| zQ=~HmSWP9`?3^&vqbk$2Hly_duTlt8D%X&$@@>PC%2q;jsGV4Z+@aYeCl0My*e~rA zYJ^H#giyOUDQRHqQu(9BEMf#So(Izq z5|UJIp1!ylndR2I)fhY|!<4E})nJ6NWtwLURTKf{a!^ZJ2lDqWpIOAi%j$qFW|?s$p_D{Kv@Kvh{noOM+b+&};*B$iI(Euy;6 zPF^>(ygXZqwWAo<=WBOG%}#iebIsp7>A_Y2-j+s#4Pg#*=#{&uLrsHn+VBpNp}$S|lSy z5Jjnfwpkizgi^1g86-dm;>YeAcj!LqRGm?&ME006X*9>q8tNj-XFKJ5PrYPi%N2Ts zbXFHp9=ba!qZFmUSY>~R-Zb>$#eH}2KeIyne)+_1xio}U;UO8e6TJV!a9SMZD4EA=iZc+r0j!{I>xx>c zl0t2RayVq^5-l;@B!UF^_Mz|!T(XJ9o+3Gq z44o&Jm*w7mC)-eWyh&v&6o=u6OiE~js8n^nMn(P_5jVp2u`R@+*bj_zhE|m4a`v>8 zZb7>syK9H^DIKBc&W5v3Ry0lDHT0aSC`#KsR9_#1tL-gf-BLGU+A-w^7;x_%T0{jy z+rumE+6`DExFxoeXfanxbKWyl$@A^K{@DqY$|lA7mcNQQ&b24hhd==(viJ*R`K@z@ zo}(^(uCk_h&ON&f)X)wAfq-k2zyOC2_9#uORY*1ojC8;TK;pMB!d0yP;|nDQ;J% zB2NY)pKBIZt_Ulfbwmt9ibJT;xNv9?_r1#Chz%q&p*tiLn^WfCzjx^FC!Ob)1kEb8 zBdN$E8*ba)`?`(CVgeQ8`Yu;aW=@_<)=Wa|`1U$GG%Td}qQTZuCYzGDr1DnB&NeO{ z@a;^-j z+Yzx%$ojxUgu?1LmkjoHH=(LJh1f#gFlOnxbg;JvCPp2MU^ux*A0^>sgS|bZ01qlB z^4uPY)iAkyu(!ji6XjLEC5`QdXqW)k9A0O=Psew=>nymr6L=Dx& zPYkVD)=h*e(Vsd?Y$abi5?Y_*v8xdZ#p}9auv0~h(=gKDSm~%vw7}6-Qji?yAHzXqKn_=o<$!IJG7MdSE0yWeN z**6UBS3XQ;@Kt6%d2=99dFniM7Kgx#f+R%F>c*i;jdJ;N#mVr^iu1|0bu5ysZYiQx zkwP5yS(ZsZ3~n0iN}HnHM5ri6Hc&KtZyuV+EYAhB$ullori)B!6&tVrCt0{l{SNlD z#E>B~vZ2}%`^LeiPWsb3_v7TjffY#A8nTy3lze7r0R1Nw^5dL|+42~9RA@s|N~7?W zp$(ba(986ZVgckP`Tsg`(?)}v zgQGLSqexSOIT28@EuHd3wtKipQt|ZQ3<)#ux*HD?OfT&f1HjuMQnpE_r4hniQr7hm(S5 zTInR}oSJh=;2=B6nM8;XtU;C#YtS?{q+sT2Lo*9lzsvo9iW|_?{t!E5vd4*pZTjnLcw`-As>p}az&=~k}c0O`|c}S5|lYq>uAy8JBWiA z&h0}>ta?IBF~G1u1V6EmG}i7IGP7@{q6dmd##NFYEQlUT>j|j`XrKT|7?k=4)YU?o zXnni-;pkm}ax(yhPw7=Avm$HzLj8eG90HY48)iyqd}nc!tN(DFi9vlelo}IVRH~>5 ztbVsYm6uKaj%ajFO7GT=4w&r}&k}j_btzZ*-q5^7{KdB|**)q<{Y^zYyi*=tGAV&c z$khJ+(BR!lDh19Rl%WTG`NMiU6PYqoHFLT<3PAuAoGEgWjdVHH2wM4GZ%4 zcMdI*Y#z={PS;g&8xIK@IS@xJgg7-q3aN3|&?^`F1$L~)HWzD1eJh6O9#Xc61?xCJ z9@6n?mDG6lh*w31iICHRh>$07OBmumSzMm5&$8g_Bc6n-VZ=~^4BNBApH`a@y|bb3 zQ1!m$f>pVE;#D+lUPkqsY;<72NG&d(ROwq=hxwR+91U0g$| z^I}><(C36j1Qo+yRC{oh)|6_5NM1m$CX|&xBv5!LAPsuI+>worz=B4Oh|oK%W>o5a zHRNxX5G3usR8Ex>AxA}nCBvda8O3X+_UoZVDdn-}j#E~xsNk8kSwz{RG$xr#PS-Mw zFtp;|RA29TE>L#ai?&UiA0}JEvd>kbeIo4(e%l{(?_Ky0n@TWd*w?b4JEk@Dky6=+ zk?FX}?}pa)q+Ar|LfNH z&}r36F=M0!QiI)s(npj?XzZj1uJh-i2i5DXcmjPbm5unzP#>-fE=Qq+&-oF<&}@?G=)rmkI{$yaThH$wcl-JMb7;@f z=FwKMkhGkX29vN5mLI(f1Jor#=U+qf6d18ds*;d|#f>6IUSpECAHj$K5zZYIIta6& zR`c(nT%o%Yy_lCeF7*pp5JzGeS%60fODLIYDRq6&IL!pz(Es!wbHRC~{KeAUBhoJl zq#+UwXc$<*e|N$$|2MRE=C&1V+~UC!yIi&g7zuPUN~DYvyF77^8$PJ#QOw=u1Gdd3 zrHYQK?O!qv)D?RHsy3)|9Y0(tJD~1YiQs_}x|HTjHgTt@pvgEM;wR`~3KNTNOSsSp zjJgws2T07$L7XU6ZxxMdIV=nZ8*L~`*mZ&+o_XSM4>b#Ufi0q1988Z_sOcjSN!>63 zYPwm_{7gG(xUX<8+ahvDtQ`}=NKhnD#ebvk9uXalHI#gzX`DRVw@md+Q6-6`s%unx z5v6AliRuI2h}=a$&W8paA=+ATddl$X?s%0t7PgVtDFxrGGs|Zh98$^Sp#M$BUMeKR z#HOSmICXf5j$s_Q(nnH}xh2tm+ENchY90@t%@{%?Z6*BI3?C@c2K6YJz#*p`D-$+Y z!C#kcVpCAkkgB(HFZn;MyPmM>iZ1Tec&k_e+AUffJ0@&EXat5PeIC5m4)^us$us@UrhMs4 zTw^_dK~r)yUs~Aav;dGc;3n}Mm^@@ZsRGs`<8?gF<+S_&(!mg|P4a0mCIh-earpYB z9}0Q)P&1JmOB_0=>FyhL;2Zjg1=5X%CBfBPbZgHXUZi^^(UrD)#ZrZ;2h1S2tWp&8 z#$iVl#FUF>GRghC;Y=*d3@)&Sc9mGtT;VvPi}G2+eZ3lbEySvpf4Q+}sg8)4Wm3Ut z#&258irEt-EmK)2W_RL{=IElijoiSSmwwAIrjaX&2oOP7^Mdp(i)r89eQGK`+=-WR z@jQAy2hctVKjB}x!CRMpen_TbLpmg+Xquph&fA8&8WK|_zj=!G-s2HFN!MRiw*Q5= zvFee9YSYXNbZ$5m}QAe2N?BSiQr`2-; zDb3obWmc%HBH)Dpo^HNtco7X_x@UhUf6ARj!I03FPB;)X zgLe=2c}&^*z8x`2T9?yz#)ze)oAk8%p5dOZGs>>p-mXId?F5zm5^)pBBCZdO;1HU} zWI))!XHz_PcvWVdOQ2SilV%%DQ4Y$>*!iJ&U0M4rWfUSFASNWSt~5ws?6`FILQ4F+ zVJAC|S~0VC^O84{!JW*CLsdoxvIs42FcR1mkU_N1A6}fsPCMFIawb-GDe19mVOg=F zQoKZr)VZMFNb7P^+uMHGNTX6TrrHseW&CAWyB7}UO=63kzFa*qla;4SJ6=*xTon{) zB&i@aB3p6ny?1yZJ}#15nOB+YLW;bg!9tA}1hqi-mlU zJO*fJA#MVV5$>KH7{&*xce=_DQr{!5L^C+39wY&}y+~JD(4pM;gTuKnc`Gr^pZ6kfxQpK3D8^eO5 zmeO;0;b<0#LoBT@WQ|EQxBly{WsY zFZ_NOT!@mxWJl^myKIl^N6MGD zUHb9ih58Rpk8eqifkm{OetpLz8>Nn(hfak9IbIA^kb(m&kCaGAqJLu8s(hI9WRI$; z;B67lfdv34#tJ<_g6FAW$at*F{@(u~?}mn0aexnd&F}%;zHku&X$6Gtw*)QR><#kr z5cM*1UZ8i-C;>N!aE}2mWJ?qu#&dqx)* zgTlLFn#-zAeuoGmi3(gr;z!|i#Y4Ez6)tPe1T)e2c-vkgEJ-++E^?u3!R*&RHQ%}M z2q_{2a?eT_B2%2COi21vac+=9kn}*1UMJLoaN705`wghyNXi?EwGNMsx@ew;8-}0P zmmSP(%3xx;LF$NyR|0q|#PnMrj3@2gXq9b;5-ZUx>&9wpymCJ*a!wNCn4J)zv^E)0 zRG8>a1+CL_Y^u&~8s4j_&jl48s*`7f#^q3fkufzfplm<5d3fK-rGeE-=|N`uJS>+Y zHALPXB_&8xQo5ab+NX!lsHi~B`b@QF)6!}VRj;b{F;-=5w0K&}rH3R1DZ+pnj$KHC zJ^ak@+bT|{s)N#!&Z+7^s{hiVB+zh zhV9a%o$hF;HRv)ZvLEt*&)kb)19QM0Wt?ahPHr&%98X%3-o4J@35- zdG35d7NTkln=rx7CFT=oUmG6pnU>02DW?kZc5B^}H{Xzjces3Rw#gIUoMK&($)8ae zm?ucgdNkEWh@5yIllJTP;Aeef_<3cCBT@wuJQ8^{qDuQnsqyW$N!xRizI)FCDJ>%~ zz@f|;5smr$Zw`C$1gbSu{1aVlzgn5UTDF|`r_^S038<%_APey{3W5^2G~XKTqP}Og zS`Vo_6Pm)S&R$@9=2h(tdgKvRpxnew=@(%~w-c9|zt^?O86B{R6Cqu+Oxjn=iDf;e zIW@@L*l-3dY~^cN!5zK+&b&q_Z6cJ@gfGo;D4J6KrF2B5t5@{x;mv)kK#o?CqV0b)JLLpT&{V4)PZe-~HgHJ9v&92Z3h9 zyiAxqf$_5)JDdhLD1vSz&plBg=jRKCEw~Ek`w$A@im8(LJjRnr&+|Q@I;4>$bwqTG z{>5-5pM4$|Nf97eI@u?4?IfAu2yD@9hxWq4XA9zA77^>hU+oS)p|Q#8)M`q_6v?DX z#TsY7#j&ywR(XhF>zj{38|YKD{-Aqib)l9{=E&)-+0P`idNONM!ktWV06%>J2E z_0dcx?m%?|f*#(lhxd_LkvBb5Ypl$gV$a#wz3X72Nl`QWFSJu|&VMtXfmQJ+vn*2m zrm`5&$+&8SJoG6GxeLZyQ-wno^poQDac&eI+pjttg z*TBstWgaKLAAVDXl{W)NS%geFN|H;m^ZE~i`a-gn&z2IG@-_k!7v)o`zylwxA3ga4 z4s=f#GTW6qB=+?L>yBJkP#H-@S_lqN#4VCmuJ^~`*&b?;nv*J~K((9r?QQjl?r4_! zz5ZY~CmcyX7irp7pAid9)+ZuT=!GHVA5uvKGwDzLOLEU9Uj)1|`C06yX*y4--CMm< zb6XZZ8~Q7a4yljx6NHifJbXm&1<72XE`cs}!=!)FG)I&tprdAuw2_3Gq*RqAjxaU- z6tYtEm;U4SoUme*$QictPBOFeP^(N4CA)-l7ja~|l4|f2Tvz|=@ZGFDl9Cyt3kWsK z2ymo{@wegq%Ug4nO6qmv5cdrxi0deyu3;is7m@WNv_a{48vlKGXG@ThBd6OIlxQa= zNN*uVa)3kbdQ*o6PQ8;>o0Vv&(#ab|@M67OHbl^u{u z#l59Q5R#FlVFHscfTIx8&7&`Hw!<>X{B6RVP4U%j&!jW(o~Adv@|$jWM%eSL_%>E zlUy6Vtz@&ZkhE!yZ*E``G{#doVNR3UZ4@-OqzpJK<)(I-5W+Ssi$1E zj-*J|%@V4*B;%AVol(zncS55P7d__@u_Pd)IcM(l3&%w>Q>28S!(+yvUSn%-I<2R1T)!%#3)Q zFntkqrYu6t5(2sJ>fFP@T31qPLr5832OW}x*75G89>_#df|l%PUDz;&E$cla?dU@u zM0v}}{~ zypewDOW#6NXxy$-O)*Wm%GI84DLcyZk~NzWr32Y1<-;SN#~jTZs-UFq|NMcrNe{h9 z1ilg!sZnQ&{0jzpw?ok=aZ7s7Xq3dd$%P~PWp<;|Ean1HL{uaR8)2PTAH>UJP*z(`N~U)-F^8y9TVA!!^^L|`(cFZp1aoX6`*a|L(m)l1ZhmCMuOivV zE+v6f;Ra;UR2~oL+bk<4f*w$ApjLczWFW$_!;{p z#|U;`y3_-)MB)gCQm{#HXT!M+vwUu5HbO;qlJLF+8>NBZ`fdi1G%sc8giTlriuJYp+9V9qz<5Ae`2JoE#QJ7p#}7;d6dghqX20W z3%+w~L*a~5_lgm>*l)T=v$rG zVJ*CBNk{1oC|rHF9Oaskpv)+0>*^8m}m*KqfZqZVJ8ID6J=MKC@GoE3-Cxtk#NXs zW>eSE(FUj760tm3YS)jfEX`J4N-`yAWtw(vvncBsp7I#WGQp!pb8z+?geQXtu7B*@ zFyIDXT#uXBg9lPGwK*9YknnF>

I4sj07HUjmOw1l?~up+mTV>klU)X;|@ji6;im?-`1$o`Ai ziZcHG9076;!BS2!Jl-dko3t3dZDfG_fuxt_SVhR}5+tb8dZOJ*LAu#OQuMHTC~fuQ z&yBpGY^D^hyX3M|6`Cqm$olu#m#nf}MyaGCfCWf;MTRju2=Xee=Gzz~H z*ryn0vG=u+N(rHPxEB>Ch~5YZ=M=X#ppr2#zCO^RrZcngC^g}QQBh($ZEcEK(Ea@M{d!+CfMPK|ST|A_Sq4Ii6#XHV_pPPc>L`XHat0xd zY&3af^Y*14h@wMuW~sVLQnVp$?~d+gE{~pxRj{HlH??I+%x>2W5IJYDh_GOhko@+@ z)ZN;56FYE@ejc5+o6L4;LKwxcy^-fmzB95!qQN=5(1bdD5^N;Jzc=#Y@@Ka91!*=WWx(rI zl~TLe$BN?TQXJ5ta7(o(X*DN`HYI$7=)@3DB{wWV6W9O#$m(u0Uxi8tC=|_+4;pW+ z7P;B6vAHQ>tti?w2XZ`*%M)8jWno@u{trg_l?$_rR8bC-=l>OTWl7T^LVwI8qQtb5 z+<^1Lk)!9$XqGQw=7*_*$Ww)Id79)gB|vwL^a*CnzuM%< zvMBFs0{0;io+0%>6i#u`e>`vyF!foebVnR0M>nVX*rEm1N zut_Vpu}$SV^<_UDz#zxX8e3G!=6GiB6~5dh{!?`I{3v7o({GyOqv+I4`k2z zp1<6|_lH8SL#uM5$DxFh`{9;=uXs$VAT$UNtY5T$lk7!9^p6(rl=c zVHo{xNNie*GEJ`|nXf`$ae;iq!MNrzA`c;y!?|k8kXbIX+8ui`i z+2i^Xvi#FXPX%x9-nA*;#*ib=%XlRU%h}M+*N9_UP(>kn6^{Ssk$8Z)-OmTzsEDSU zXu#XGkq{XULzJ9EmNeBO?=L&&W2CG+qLsu zvPMdGRHjPz2dD_;G2=7ivrRta$m|7+w)#;h)PNkUIkL~my zcmE=1v0btCq4P$NUpIq)j&${!%Pf+%*gD(y@>wo*I46YzWE$c*>E=a#ryh_BA|ggAQen(iVICvBJX)cW^e>n2MW z3|X3MAXsNxZuFm#=N8FZ6;mR1(v)k=hqfn^7`vTkd)`E|r+VNRu5ZGoCnfaXkxc$& zKBa_qrb{U$Q1vO7!ys8JJ#E7O-F+wKI%Z_TQ{quWgFthS8(q|uroM%$4?m!}BT{&p zcl_v%e4i6`=-nrdF5W>!U{~(e(i~K}P{Tz)VS$`)WckKPqdhK$dQR2;QMfQAp@qzF zP(^MiBGS@LlAn^5@vM^L6yc zAzd6Hu50P3qbJtxiNy)UhX6en%KenLkE;+Ph857?0Ht_6J#BHGT1^TUzX~V2}uV@w7Rg@@SupYy?L}t`!YU~fnElf(|4FOZN&oG*C$U~l(eyOWN`U8m_0O#;sz?Cn0! zh`}C$DkS&R58pB1+r{Q4qGsV_W0NND9PI6hP6idpHZ*?l+3et)(M6G2)y7uuQ$}<` zopKD!mmw_8v)!iaVsh_0b&YMejV+eHpbhg(PcQzG$^cfnw9M~fWJ zEon6$hZG0l!ol8-t;^g-g$e@&o^t%&!QM`z*$~laXwt+`Se)NC;M+aYOjL#uYs9M$ zql*T7dq}e`=@x?uAc|b}#fw|wNih@Vq6redwNCWo{fm2BOu0SGFxrY+1Q0Ck1EbsK zA#k*L2TH*!YOryvQxwi6KP|8o=tt=Kba#Osq&puR>_WMrEd828paLppqJ3zvw^NKt z^nsASP6UP?g&!X5?IE3y(g^J`JEGp)OFlB%)z5Of-fL%nY~W?0OBfSKCNqhI^G8Py zTP7Z9UclT65YpZdY~3WSxTt?FJB#zs;1R$e7|p~b%}dus?~>85%L^^2UdoT@4e(~{ zuPnN|N-@ETqH9%{UHo%{2EAk#AeAFo0AVV*bZ2}BErd18w=vVDH%?++HoD({(qv33 zy6D2mLhnj*H0$!wtv!*M6Oel|cH#0TQz(xI8r}*1PDcjLMIZA-eY`5Sorfe~;R~cSHnE2A^ zwz@4NJ9UN;aWMnO7+obMsf6D6M-U23NX>=>JCOLt(0 z{nbsbA8eP25qu7a+8{j;p$Kc;FnV{X;RSl=qK1_k0YXNYS~vCvquMpSDnE7jT+-s& zwhIEJjTYe;t~R!%OF$?_E*@5;8{IV8Rd%)AjZkF`m5^%IZY3||59vb!1;arO2V!aL z-8>5ALsG#-f%JCs8Cjr=xgaXD#gaf+mu-L+DI@^d?)6WP4qCARtp&zmg4PwJ2W*zl zj4odUZEkZi#SD$=K}((ylz6$3NbFQ0z(S?pSOmM=`|Mz|l*gVRK4o|GmSj@7w^i9fkf10)qmylJlhuDF)2is^(Ro-8_!1C35w51d^z(y# zHK_kOj(*6hCY{gXFN{8?wQY`=3H%gUY#{H?j?=Lrmo!3bGW$EFaZ_@~QwprYTCP5r1R=K%Idi(B*dFjlGw%)fd$6b?m0m%)}R@~ z0i!=5mD0(#M&JGa%?WliR(j45)&4`I1esm3-f@Z4-h&*PY@PQ$ z#U?@>5cO#mMxSgW`A+3&kzyvjzk^R;??DI_aM0?j1&7{2zb1y!nGi?TzdQQYiV2SO zuMD6aTN(O}a%gtg>N5+dZ=ie-g$J5hVfB4)^z4c=>u0MhX_ogNCL_I+2`^;-+UvPN z0+O0I)FY+qlw*Fsa^dPf>fL&BvT)6Jg3u;(()olT5j;m_{s*J4zbCJrNXYf971F0y z%plwWx^Zjf4@b|sC(lSOR>fK2?b4pgM?r}GI7F*|G3%wT zamDpgl>tPjsbnrFtV_I)l}FmBq!<-Pf)DAU$(E;D!c4QIjbf@JUy}Ggt9%$U5s4jt z7%Psmn)W8!c^D}VLn|(#3?51|th%3%o?me-D^+NgGy^M-RG6*v-toXmO{u$wenPdC zW&dLIl8UnwAuC!GO7R5zyH5T85^wwbhg+Y05ak|;=MjR5M5zVs$ffa%X#~Hl zG(+M9ssm)3xs0^Aq-)x94A~aqmF461oEgiFi6(DMdk7n8Bj;D6=T%(I_MO_{=cn>W z#Xa9RzIiI(>-VleK3gjC;pB>F66O2euSc(~I7#TsxI2W?;0cqemfjjWx}k0VkcZ_T zNO8LQym_ZA@i+=FE$T+-7YqUVH={RHoPXzR>oAfV84H1!oND#6)O}~6gLcmOC_YoB z%kttAdu9q>A|+jK5#yj2td;(@(!y6~PLKsBBwT=C8&{xhwOp4lVO{d z5&y2z?&_5>UDC7FdywZ&PPFO1Jr_$dQbHO*ZCNCjwcl4R^%J5(4A*`~uUEx!l)!Nk z&v(^=6nP*5*kq=oMAx-HR4(7OdsakPl;h6W{lM_IvP=e<;D z)1_iFN(eVX3jWWPX9n93BWOpbTi;QRlEcn-&2$o@W9ejQ7C zEc5p+pIO>_q>mU4$AiU&*x=Up8A~cCrt8Q~h3uIE4q^NX6l;G0PSII!i=I^7adVjr_-c=>G zt*(8p#HWJQ!rzqAZAIoJL8-`-$Zr#KM?8ZJXpqp*lx&C{{A09719V>gSJa%&J5^;G zi$RLsHYphz4@eU8pQFV0%NekCcCM3=Bh`eN#91JR=FsCD?O&bNdUo=!!BQTCRYRJB z#X6Z!$F_}skFG8Yd90pDj$I$jHcCyDvOP8BALt@LhL-j_Qdoh`tWTp2)9 zVCRAIf##Esf+j>ksA>Oqu(#7|)PW`|{n{W)de;92dpl8Y@y*abGX5WX@A)Rjb>DkF z-WL-v0ngpPz%O>azWeCfl>-)*1cHPJF+l_*+Lr9uitI54GouLvAzeS0Nz9Z;Dv%PB zM2SJ7NM$NgfueHGIp>^n+RyJ)Rd-c&^>mmX$S>Acml%X|y1MGrIlu4?2E<_VqKO@V z(V)o?i-$a{EqV)~b@4=FPx18R!m}4c(jQiyq?W1)zL0BiU>HIP7aban?-?8RB@;XL z9wKFiPqT^Y9ts5*onJc9mg*c%=8^uc4|dk2`fH$yWn4DuL3AlA*^BhB7;5e0kY#>%ub zXUX?KQ97QZX}*5N#1qQfp?a1IgbkL0Uuh?(U-J}GYUm3b3Wy^}TX11T@!=EHQNUN4 z%#4|Cl3Y2F4zc%cnI}|tUK>vq2>*EIA>{xh{;G+v_XlNQvT)_XguU>Tm0tF``PRKZ zK+i}K-<@o)8*sQNaj*sLr{EHM!O zBnx@*O(~g?Fh9zgpbkP4X>VS+z=Y?X3DF;3=52xtYb@8)J_JAVy$uL45N>Q=2WsDKiP$ zuEQgyl3lZ$l1lK7XRA&DO0&HBu(hJO{1pE&TNKDrO z6{b#_zM%2q);GZ-jUff^n&zjP(e|&cYZlc2 zmughc%cEhFBAbdO8&(@s32r@^mv;nSce3T>A(BWFHAGkzL{?;mw@sWxWX0KVbOemQ z-gCAmt|wx8tK!FAMRXjzV-$0}*afN* zguxvXH#A&ut*tfEdt96205H;}r4xrvm<)t7;>K5> zM4m1oQ8TcI$|CS$vIL~C>2SWNaYNo{t*sp2b~&hPmLoE4uRSl2PNHtW`eM;h6Tfrf zj)tcwsQ<;~&F$B!nkJ%GqbBcli6X{hqv}j>iut%3y}0ob8#{p`Ew{#*if-a5D9Ll~ z*5Uw9be7RVjT3yxHQjs3L{k$i2E`5r?1F^Y{y*d=WZpB~{*kV;_jK)7_F(ZjVhm8b zW)uFT1+v)2bPM4Q|E|V0nFaLg+w358&2oz53B4XTN`zG2(uAuMt6KN&#&ekWH(B2P zS=T)cFLAQm^PnRsCyOT5gL(z&F1)94H8$DTkMxk6CORjS)pHQ~XNC}}!w7=}kQ{=0 z81Gq06zTU)G?aLAYub@6Dj$0aKr(3Tz=#b|?2BNHkK`I7tFPpfj;d{vSC)@36)+gce&RksI z=(z$lhz=HHI;2zV1iI3Fjju<2){!1`eG)G1ESy6&S9@L@;yGB|naJ7(i3ODI<&6h$ zeco|hT+hp*7z}d-@Rf#f5RuFM6Av^zPEMzE@%&AS(XutS_ty~vgr2i;;B`Kxy;s*> zq`-yP1PKVEK8i7>|3KsRoFyaM-JZKMNxvx*aga7oeWI8Qc>?( zm580sY`dCZ&RZtV>DhRwKRoFGw}sKNHUoDf#f;PjMhv0_ zX==xLXrk>1)~S+iTk)T63@r>?^%RoM2;REw>ozU%Z?(|IMM#4V_}eCilF6ZQ8sTtm zgZBskNTzQeaySiO{BDs}qBwvq|2u{oPT&e_mEb`qV}=X+@Q}k(NT4uNC^Bkv)wOpH zH{247-V|piY}!mjSsoc~xSS8PJEaMp;t;RDYq;S7vWZBgArXXGg65j<9&UJul`O?U z;?^idMK^lSaKp*34L^c0h|F;ay6n9}4v)16GkR`c3fw9Q-Z!zgL!9sYRH4vwghE<7 zU-oju!J$oSH1*Juwan!G6PsN;!0a`p6t1X*;(e6tJ)~a1<`=s2FDaL+F)E6X1H03j zLnU0Os3_fG$QQdGn8i1=kKaW$e;EI8l){C%aUw z+2U7nOZ9tk#Nj)G!-QY#&!0!1e`~8q~YhMkM52|oML`1<$6@7G~ zP;FP-%*;Pl1xSEmD2Tv$=A%&y!*MG0BHjTyE9S?BTY|bNUH#C3{h>oLGCw}taOB14 zyQ2t)lpffM=o7;YM;j|(6`=tnFc97PB3g{ z^l-yH1G|hEeKcD4w9?Ga3^_anza*}NHq~H1O+P!_a1;eXto@*$pkf5${&T|($DS;O zr7zmw$X_MK=Z71PGPffbEC+u9WSoL83^_c6(+2ESoaZC(xL+J@cnaDGbv6WzEL1j) z^h-kycP))H2S6;HS!}wS};#XQQYjimSS9#^0Pc zZLiWGT3o4u4Xp%Dt(ft4j?1S~l*m2YM-O;ivKl2|>^5frq)Gx7AEfp!im z$gy7Khmh$QG#1-?5_lwy0@&#r5!Ol2VhGao?@lzKkT+WB8Mlw=k?Kp;DUL8rwa4v8v8ORakqFLu5F z;c)_;nmt9QX_A^hY^=R5E|U^3#sr)Q_p4oDq>JvJ=3r;yhK>#uLya9AXGM-Pf}kHw zT-|VYA;*cea286Bc3tHe4yxarMgCm7Rpe1R^hr$PLS$!*d?3=6)nIj+)+*}RLSWD3HCbhepyFcBB(Ks78d;X~CvyL24j{3zE%rgWprt-x~Z7`UKH!cO8}G})!x+y_F+&JrD6SlwKw<^ z#_Mcp+NC@3ZOHW~u{oStCYzDrTsC=HwbLWqYC+?#1?cr14c0InK39G`L;aYEC(5ml zP#E-L7!*|f63ctWq>=5W?G$1afa->H(a->FCCYA?LRlm_Z4g801{l%hllgip4oh{w z<*HVTa&jP1mTaiEiO;0UmQdmekxA7lQutR)`i**ec_m8P6m0}O%p!_QDcmNeKqU6c z$wz0`Th*E*ja#H7DW=o;54gEz9t$X(Bq_)biVZN!jH@QQx27zyTv}P7t9T~=r7g1M z*5soX%7M?>4WkFH;MJ3-H{FmyrlQ;n)ewq}O@GnTt!pNCq*uWccMCYnEx2jB!vaqAizwUH% zl@V#Q~PbzGqdS5{?KsD#UNzYiX>jAVS1f9? zj+f$y9Rw-Ay3Zc_jL(^TQn^x6G!LX!Rcd7ua+JE+#B%FU6iUP|`SL8_FxANlaq+?S z;kP7m^^)p z-5o3pR7QB9iGU(9XX3?WNh^6FksQHnkqj7xdb$P93+2GyT;G5IN+)#rdC)ttJ}uut9v3xJ}D`5y4RR?yUNjTnMd8l~rePvk>u!+lXcf1tC4(S%l$599G`h z&qlB2%*A8Enxxq(z9SI_B&|ZOc~wZ=tq@}(M_~@YBx#oZ;vIPmK))Ruj~2XZvCBw< zmrOQUR<;WxBq}*_?8w?8xAhpJFvl`|RJhrq1A<|?i+*El-8Fe;Eq2X=*ad2M1S{y2 zt+x2eK#^#Xa;iv#2P-aT0f!dhG!1jeweTQJ^X|!0ww$goabARIm(9dITI_YmYo?1=&vk8~zK$5sq^#lH4zHG9;2Elr?wzw+qMheuHhk+3=co?jie9FP)v zb&eiBFuAdlxptwhjC`0*O^4fxZwf!XV)FF*j+=d%o;nsn0S#0n<+?HLwAhPbLZ@l) z%KF3YzNcao2H=4kDk+18^^>ntn?{@ARmINVwBwW?2(r1D-cyWIWxTdN2k>m(VBVAf zH4!|ZUOj1NtF$R5JS*Ut9!-S93N*|NFzR#=Af?=@y=L-p*|=4)HH#4%r|P$$WU-qv zF>0@8zyM(vY&qNol1gG)T!Uj%f9>RBvYFQL809OkQ)QRUQg(iU6U*-xGE1|iB$WjZ zK~sD%u{6Wf3|W@fjeIQ{QcDykd?e#&j5*qalX`J*DqR!!HN?k&Z89UCRk;&hKqyV| zI1Jgp;Mcr?SeB!MFf|w}qRUq{Z$)xd zpr{JFSZ*e_5ekv`Zkf3M+QwT4-E4CQX^%F&ks=Wi$I`90-!}P=rEjUeJ54L~{T4PI zOFj{fRYbMgC#%7(#eVzbU@kUU-7oKemGJ#p6RQlxZ+Qld4v^L{VwM&O=sU*$5kPHH z!b)93dnW?2_%Oj>9$0qZr4|3Cp4bU-1WyT#xKNN=mi^Ajef4KqE23m&5jnJqY6r3^ zrVpqeBXoAu$bMwVHBNFg>;ory_vC5~;Gezt ztHgOqNK=GRq;x5hS4*1R|F9TS81b>`^O3AVw!|dW$nN2S8}FI?hx~a|FP~#AkE26~ zF8CLKI&%#A!S9{inbtyE*X|r1hDarGv&yXnPQnOxUa{V`GzhTon;cPPhiC6&9YD2! zI%i-8?;mv{*7voHJ8^Op;%vs%RQ#WoAP&_^E2LuUf^N@RX$(y1KU1*IeVbwOcMr5N5qw}qe$ zZy(fc$(i&IPc~|!P=(pb9!p-f^_3+UpamjFaJs^!fp5mdPW+J~sp*_=eS=<9HMl|y z8Tu3e`dSF?`}&toV>;5>4a!XxZ{VlgsKzSg&N zQly81ps3bVfvw`dOZ9^y5S=;m>ywWiIFwvJF3Y#&5dMkXryG&9(LMjhIPd2-$2r-z z#yQ!y$2r+|CiiEr{=kI^_5e~b>=LvTw? zc;8xEd`;?6d6k(G52O-3)d3q5TbMr?Xq2U;l({_*MedZsaP-rGM&Tb0z1n0fmeN#T zem2l3;!yZL2|)(zQ7a68K6#+i;O+cWY4v9HF~Z?BaRy?QaIC zHH~!E71n<((18}EGD|}OmTE=v+evNj-yNwhfC~OEa2;5cPAEt>3qr;3M$Ksh_^4rM zV(F=29O9+FpFDlQEm~E^i&mWM)8f$xr5M&AJTt5w{xCTZ@lRFL#Tc|OA!wnML;1`? zm>{Cxq8Wc2^~-Tf5nKjO$SX|Vr2T0}dUzpP7B+lpDqjL{*8V)XznaOYWEb+kB+^K6 ztZWkQo-LxPZTW18ak>3|BEbbcg(PwQGTED^U#@BAus_H?N}V9HL^!arcDRr?Qb(wb zKo`CiRASjP{N$pkF;4CTXjLFb&YLL8OU}hpCub}2LfodPD?|FBXljI)O#L;sA{>FZ z04EHEBpe0WrBgLRRl7j1iZ@ccmv;qaK`)|`jb9JcZsW445sO<1qVqmQc1}ZTc7gYd zktd>k1neBUXUx>uSTCP)n#6~xTw}H+n4O}gNoCCw+^dkx(UJ16nCf4f-`;*1bED}9 zg+fn)4R2jJHFAxa2Zw-#g){^@lz!q}HFdcAnyI|K+X*f6S`}iX)P?yk zNQ?u#-WhI0s0?X{BqSb|9!g`^PVFr!e@$X8twrhAb+lY`7&f%oQO*s)pTyyHQ&#mz zt*+xjT?EW6CkMv9rsdI7jh;C*jO_YT5kC>jYiJ2E;0xt`y=Tu8ia$Nr{zKWs5LZQO z8k8)38Jf=ivqoL&mQU1VVn>Xht>b9M^*eXXFyV>O0|2bJWrNngVd^o}v!QpDE6+Pw z4RB~Ff|Dj7P3hk_^0(HB7dcWxsLa4!-DgiV$<$^YX;jBRmPm_tRGlbc|5U8dRHRU$ z8I_CuE~)`MQx6Vg9Ab9cXBypQ(OMvWRTy+t%U3XPVT#i{)GaM|?*D%S3&`+bHxOwQ zf#bS#m@Ra;{O3)r_bqYlAHK!Rmb`*>#pXKBaqMY8zQ8PKo|oW0hL8PCQ^SxwK&>rp z#(2jRBAg;#r2eSV_O&rLk^sT+Jq=-R?dF~M5Xf*iry(_k2zHSA-t$L4lu3_46uF|o ziw=pcz2L7B*u{Pb&PX?PFclW+f458>%NN7|?Yd5vrTE7xUAka#eNmahJSqEuV@)<% z#rqMBizM)1z9CN!o$%JFGGairlWW~%G5rW=fFKZpN`#i&Hg%{Ryr{&A#!2z(p`1dZ zexF&t@nfd#yS@OMnDrRYZR4}yg4o~@L+$pdh4Pf$aGCBu$!f190F7ih{Ie`G0g4C0 zll5VsD?ua4yklyq)&f`QQY}}K`&m6W^QcHpsC}CoE6_3(vq{l23pXOZP>h-%62*uo zhXGX5;Dsmm<6cw*ag}ADo`AIWMK~wJ=n1Hf%O!QT$>(Y9!CJ zPfxZJXaY1_W~13Jzp&c!-?p$8h+3^essx@8~NrKxdrct_o?^KO+omU$VuYxsDbqFrg0c__u*h~qdjfUP!r)okP z3Z5VYw6#W^yzGtw)=MIUTq$>gEccw3P32Hqh4U%siF@`OSUv~aKW-sW%>uO%ISr}x z7-oo8PAWcUj&|QLVazdKg?LRU$h_44}rMs zr2Yd#jJ1)FWIIG23VtyB#a9e7md+Sp=+HGtGX21OyRsXyy%?j&TEDli{2tGjik6jUJK*b4lx#kA(3h%!^R^J zK+)@l7)x(Ojx5-fA^n5UdT@xbF%>tILfM~y<{-uN`eDZU6fP0W13B+eMX=v6#8{vj zrsg;%`im&5#?Bju7>m9&gmPVq!Cnfg_)Wu%1vjjrb%;@R=mom@<{`!s^zh!B$O!PQ zQQCgX5Mw#u(aiNJ#Ce7dnERn2#@dd_#cI@mh`=c(zIBMPuv1ac1wR!c?*z2+ZBs|O zas~xaY;!SBTU}q|C?=Sx>LgW)`zAmen>#^e9-BwgfBV$1C~OK(?Ekib?J}6KD0s(| z)mVV4HI*nFnbawejDxs~r1Zm6Pww-5a6sfZSRUwWp}ZNIu)r~Ah(m---Z^!mYxXWQ z*7l%F)a}wmflUS61dH}xU_xlo;`otH6{QC(wO8N-a*s$M78f`)SnPKV{cPBQpar7| z=>x}P(Y$*qm+WXl`NMKTU~3t-5WWQaJrz$D8x3C@t*iI&B?ur%0J~d=TP`p+NgXt} z@wIe(A7cJ{r~bWX)2AGLX1#`l8gQkwa~gk8sqD0XjbD9osp?i+et(pZ>DVAC8qh>b6Xyd{!?SW$MF)mU zbv$Yqqo8njKVc~T~=B!31ILuhCb41Kv1*d8Px zV04Zzil1)yp_3G-OJo8km<^RI0l~Nr7u#afDpg)ZlFAnJWI_v@eG#eL2%_{yPSQ0? z#7T@z0h_=GUd~6S?rIQ4Q2}h13UnsSBA_d0i^+l#=!A1az4J}sR}&&hz?e2A_<6lTJVXflfohM0rR3- zulWe0CT^I1a?}GM4I?n&kq-YA84t_()KJZYj!{Ut8RB&15*Onx6@6w0=KSo`J%7{le98Wz4jGklNX7v@l>gKNTPn+2 zfTN_3var>U*-;_20%eX}@ErDoN8MaYGAh;jqm}0>upm`Ej3~F&07S4AZI)!96C%7n+)qTWav+j!wd2 zm4<;7$-uB1CU9L)NW_)E#lFasZUyVD5GO7Eel5WK_uSz45xMP(;@vqyds1}BL19Nz z+2AaNNRWPM>b$OVIt%HjjtF%SRKnWEDJM2~3ag#@)tRE0Us4b~Cg&a)qg3n)P`D5Y zYxB!fr{*&kl{8h2IDK*JrYeb$i$wutX_uTeu)Z?2r%p}3Kr1S7a@=0Huv}P7x2S_8 z)KG|(5>len`RY&)T6w9J-)b>atG>|EC59y_>5hY1jQ_QhwD-k?_b&ZNA{Wu;{rX>} zz7F)!3S8W#aS_4CS^LIR4h~fd00axATyhJc>Y{u`kxe@63o6D~=a;-{9>e&gW`$81 zKn(Cl-<&$Pj_j=kibWl;NrZ1faq`fOGa_i#sg6+ss{QG=rgAQQU)*X16a|p|m^7|M zW5M;1mO@;GHo5-oshS$Q8ntgpGO7G+C9+td@-A-zRT`S>Xe-bcl^F0lQ%V3Z9Mk^cNs4r-gz?f)^&_K=!#MfTlv6ERtEz)C?iTE^YKkb$%E+`>f$aW) zYjMAwAGa$Om2I_zoMeYRAWfnzcWcZt5vD-lFm^diJ>w@+@U-%#d?&vi)>WiDfm+vD zlt6sFA{-I?&*cnH*H(@#WPj7L5YMy7jY(L5^LXJ;|4P>Z*eh< zMAH$HgY!_5l>_~VWQI>Y8C);-H2V3@1(d`BAWA@cVaY|K!2U%i2+qZ=Me3#Ve zh|gj23b_%Vb&Jg5m!nQZu@a>Z=0e~W(}4I_QwC(bL>hW68Wqw;lwhV{9ID<{E1+`< zQkNbJWD%ffzn)s{6K-bG$@G?1B{(WpYEMD$-1lqWI+od4+=!hFavJLBPH9v`znOY` zV_YFmSN2FkqD5%M?{BLqDyLeil=n}H{(H)Jw zKTiEaHX*S_Rm6dCLr|Mq=-U{#T4G;klQR8j>S>)?4<)fM zbu1lg2PHxigb;MHLx>}^1^zsBeM5C)$6N@Plsr=Hn$i%J)hH$}rDT9Q&tIl0o&-hl ztN1nhp1ck8NIMZj3%CedWsp$7kAbiz7fm-By@*s?F%vp*JtlKtsG2rnD1bT>dLS21 z|20s-i2VSw7ErJYh2Hlrna+Eu9WZAlQ_pxp3e}bMkwsJztc2-OpcIoi5SET}>GZzN zdg}l?lzv`r1BX^Mf#U{>1mULgs&g#5p&A@b{1H+j$;+nuk_%AP5u;O&W?2lZH+;r) zk0!l($%L7!@@y2e*csRlRGKXtoA2Y0XQ%Y(6KWP=boum!HLOQhz5iT{Y9&8h$Kg3q zK}R*P=^6l(xJuW~WDfw+(@UmOPCW|~1LKP6$Mo6~_N_;Yi=u#&#}ZPL;o{jw6VC|X zShxfePH^S)7LE`lh(=ZumM+S%D@u=d571Vja<3G`cZA(J}q< zubO^b)1xomhxW@Lkdn^l$U~r&T`oJ2tPG-hS1A zwljvO3GF&`chO3@b_{b`37T_oo9H;`E-}${W0;fpB{VJ6tbOtWHiT!6Va|wZ9nL&B z+hF`k$ndOj%t_G~b22;@*fd=;x_%6E+L{zx$jlubFP%8OVfx8E59>V64_7V}DC;RJ z7uG60m84pg?I^vWej1_kWCsZJI5$r3JRe!uSzucL+Tyosr1rC?3p`+FPp=0{`-caJ zwpn4|BLoPD#w&}QSLiuocq*KTAoYFO2~Yqxyys5uE0q8hPycjEg2L4oRo=ry{}OZ~ zc@3v=AyXT}u-*iyqtV4B(*`IzeO{#tNphbNutj5f?|C`pzp)fREJ;m=k5B@HErgP& zIN%pXFpPSLanp{?eDjXY{QMo8`2{;R^DR3z^Q}8J^KCme^X)q}^BvRu5WS|j6$8Pg zW`J#`mA-I#hp2SzSS`!l@IY}%Xc5gLZYIHc(aHK;s zQGj>8X}$O)eJ*M@K%But5dhW+GO+8rXRJX6u>}A=9Yh+8 z8jvFQo`i4k(jENj z1jq+{8hiIo+tr~(J1}p7Fo~!NwMd(3=70_~BiuO>{ekJ4qO=-UcIU|RSGf}i|Ap+r zt`Djh56o9g?=-WOm@JGfFA#HXJT#(LPM;Jo1V{*^k#P%V6AtmVf7M9{r!DXoaBEm3 z5#QB_UOhcBi5K1!DypE_kT^t)JbKMvrQ`#F7P(I!e{ghNW8Hu4^jMpQubW=z4znqK zY;2rp_ey2AR)Ka72vnhX`){*2dtoK~4=kNn-gZDzZYRhWn5Y?=&VxJt39mm%%Q-e2 zcrA`;gG{jE=nd27WP3#?QLFWYvxa7oxMXVlMd?OrK|D@0;8Eod$>U+oym30O6bDi} zB7ad8eE~%V6mA(nSYbyAh#C|>V`|24nm#St0^1Fs{D)kPoez^TJk1C;Eh>1MLVn3U z*aFa&;4c+`i16M#EgE}VQbQ-YTp!AcP_k3QGn6V6&EZa2NVaVCH~ZCJR0>b{8b-)2 zqGW-m5t0IL+3`<=gTNsk5E{YJqHX(-R0&H3wXEbP&5|vJ$vbVTtQkn3qPMVI?o|%* z8})A;#=9O%#rUn$xpza+4OOLw{6NZTY&l&^)!9`0LouECNOY*N0@K6=fd&QWNgOrb zHa!jv-@~i;HUWGPh13@Kc<@K`6cO8?tfs$x{2!5kqxY#@(}<)rpT_T)KBN3RvbEK& zF|%Ozb?VLNHLf59Dus~DXP_lg?MO-_^azp4i1mm27oZ^!puYo+$hHg=|Dt!Eg!2ff zk;y$p&>QJuAWe@k?Z>i_{Ry8yF=3)jv=v8mz9UhVlZdrS0TN z&d%#Xs|A89U7qlR(-${12I-y+*_;&H(}bf&jiliQ?Gej7(dZN;8+#GqMcV}#3pEYH zw*dSF+?6Q(&~y{_x*6^|RLiuus^+Phk+bCsWrz0lNYo|-wBUIkp1!l;ZZ)DSN4n0& znVuAI=g7P&aKQ3a0x%_CkCEyy3DR8iBhyU?@h*trNLSc3OBYbFd}T2>k(j)Yk`X37 zj{ni=+Z*m*!Sk%}L`J&0#+eQveIdvVmSkpVS-!%=L{|};7kt7{qPOjjH9q0SdB=Z+ zJ)dx5ThJ1DX+*jk8Mlv5H?{N8=PB!Yjdp$2Imic8RxNz|+Dq)9J3z@Mb>N+Wpt3$O zePh$Jt5YdW~x>#9=p)o2R1T1r#}-1C#u6_7!;NgV_DfXFcal`Wuy5Nb2P2x@5; zp&=Zhfd=9CQ`0-)B?;|W$euKf!IhISeEQ^MJanlM5W%|?K9>a#;WN|c_67dz&wEo@ zK9PkV6&hkhMUDC5IB@_}y2)p!yZjd_7zPD5tQVGH6cS;h3xZ9s7P+6B&QSSE1sqr+ zMpTtKD&+hGx*NEz7-v-)R+0DlX{%cEX(v-kT5X+lN0K$M&H>ObN>O2g-u@SO2J0Ji z79qPAp4ee>zF6YOA7G;*=9XkzS*A==3Wc3R!HK1nK>04@377m^Nu2m4|4ZJUjo@gq zK;x2+6&`_^|e#wmq8)TWc2pM(doTWtlS&Nb0ZK=V?dxOqGO1iHHCoH^4Zu zlHD}9AuEE^<_2;{(5XjM2a_b|q&R4JUzr}3#|lSJe2Q^hpdpAk`d6o)GDP}Y+dO%^ z)lH`5fXsGr2=@?Cp#WlkZM@TaXsNiu(#M;LlsfwQbU$o5eh;MU+&|Xwx$^T7^`j`L zB*#`agajI)e1SeG1QfO!V2|IJK2U3ytBR(Q+p1?5mDf7}pkxCQbTC*k;Oc#oiSora z9QYFxRBY=>)j~NxBJ*3LPGn(IV4}c415CsH+WGc$&Wz2{CUVNwN=y`+pri@ub#o*2 z78Gp-z`iYZf#9Kien^b(jCu(GKwK0<1LA2w=~nRF>9G9nWOX8i(HHetDm~qQLQI06 zV@?02;~pg&6rCqHK6Z$<8y?B#_fF0sfk;Kj37UYcIL<+d zV?VzKTrH9I39=03n~T;W7TY%NUVem!T=;|Of!P{%hpmC06YCAjdaTVwE%Jvu&{AO) zfTQ&s4=gy;Rp&?3hkEZBEo3a)o)uCq69h`IN=ff9rh7C;Rn3Li!PLYM5@<3CY!{~AA?eqy~YS~-j}{(vyHvKUl!ZH@<`U;6Z?i}DR*y8rx7 z)-$H(5%QT9w#ujtxaQBM&mHiNccb~#BVg%KN`rt(@BoO2h{le7KK&SVh_9bu2cSI1 z@sq9C<&}jEu!4c?46=H8C)viBA+TWTL3MZW#G&?-{$e_}uxut6ZEUUrG*|p0v$JB6 zVzMdfv+6AqL(KS>qwXv?1ZqB}=qYtvYHIGUMx6+CP$FVTr*a0sRQmPwo@$4-vW(m2 zD_Lufv<<+noj55SF#?v~3|W_6lEM}DmPU4(x+va)+Vv4M_-$jl-z@JrQo_(YRkKoP zIT@sEMt>i*g;29O?$X~)Ur^rA%gMt?*VV~8ShVF2PT@6?9|I*!1d3|>e)@my&02AJxdsivk#0o8JPlfe|fe!+m&d5c`IkNuPm;uWf zv|eagk66K~&2ePyM6Xy7=_hZU8 z473Apd_ZwLK&)L)|2%zP!vm$+6DtV};K${Vexyt6H5rYg;zK%_L2dnE5(QI%%rr*3 z0@2>TG~UY{uEWr@$rKK27w5-L5~8+;)V!Yrp?%S=2OIC@u~lI7n0F>3dp(Z(*?U3> z9Oc76-tbvHZ)*hkBqFyZg5#~${EK(p(QxH*2uSOXmgM%7e48dZluh2dwgnLk-wY@< zC@mYdamlWG8!izx4qng7bbH(Dw8vcg+8@#Lc0&7yX%DQIx^)aH>(X5hH(YB!IR8j5 zSHDU7a0JR*gHD+SmO@IA1u11qyKL8W4c}rh-S$>mo#J5HYa~rPdp>sRNlJzis*7)gx_0?4w_YO>LSJ4YI=;BkT4-UAPUwS! zxCiYQD{h3!;y}M**NAy@fT)jXU}B_37^fRojyjQxEjqkQm$U~+yk%as>&fL%W5E77 z;mgs*Rnj4ZhsgRezi7U10wI-}KTTYWzRe`Mde@*~w9yHpZEP)Q={h=K1|kyuno++i znz4}1P?pl2fbHA5cGQVzaia$aj}GG@11Z$&c6t4sVKV^`L-$;y`avsz_Tlt+=B|Nr zVXJgYVAuzUB;jHn17EV9wQCrxK+SSMS~l^iWg7y{yO!wFLB9fDE6pUsxqj4}g}j~! z49gaodU$QzF#c<$?t_PjjN7Pu@ZXo; z9tHj&nJ3p1^Nd;2QN=y| zM7Xx7JllaaqM9#!7+MaP+&y>K&U0ZLYWb*7i@bytqxAN?U60PbNk8ZfW)&NvnuZ+$ zdjYbEr1%;n`J0BFK%D%9Xbfx}5k1YgdDlN@MSfoBqd27nGa0DO(d4iU)7!Q?p@pOexQG;3AN)MqzkRzC@`RCOX37{*e2{{7Y)Yed$v0v3m*~+ z`n9-F(lpiY-R^{hhqwXu?amoy19{e z|F}PZo+?F2C*gyjwnXLwyZ*B;U?5it*@x>4Z6nnhZ;n!E04s?Qk$dYQ76LXR(y3$s z$sqjp(pT(y`kO&b!r(9vO~V14qcUEY?#!uhD}A$Ko0g@D#y0z|bucSGFj0_+eea>mwc2OnyNiN$xsGLp~5Ddcs752aRxrYKT+kb7xArVkE2 z6uA}HYsiCga?#3hUO&Xpgc77hpCn36eCDG!3_esACCb1cP+%pa@A<~Thk^k@Qrtp6 zgN7LL?Qa@lD2Pu46#@OR&8N2Y=D~+zs3Bfsw3QJn#K`Y0gAWa1e;5dY8K|a+1KmS| z57mr>(FxUPtZkwBzjcVA*tv_)x%8uPGLGLi_)xm@$md3&ZDbpc)3*;kRFfc_>?Hyi z1Yp2_#}Gqt2{b$b#}mn8Wb*J3LtRQIoZBfCA54v$cMdU>%uWZB$5Ta7+lU?+Vkk0X zbP7TsVQ~Z~@?C=u1+>pngaLwGG9FCHy9Xa?V5x%NI)Z*Mdoc-q&)`F8b<BY5GD4?dKaBh-V`P7Or#SnZz}VyKC;SwwRLS0Iun z|C2)uMU0fB-|*?FdE~;M8hogL1rXEcPQ@<1VcMsM7>Y<*#7<2+&vTQ+`pn=%A>DGB z5In&O*rw}#c8Hi**3pNZS6Y+NbjRY^?TFAYAFFpNGM zYPEPDnMj3wdDj^^)rcS*q}~I zDbeq$I44HL$;RR_AYe*R78?#_97DcC$B%9i4)SK0ey{j?%^)(~y0%Jn2}Oorfs3Oh zvPK+mp%Z?82JJlrpKomp;wRr+HzS~zZw ztQ<|2vmc|)wRPx1osL*5MN1J{7Qw3-2s+@GyUe^`l7Tw+trdNhcnz7*br6Rf1)3q& z^e8g&A|m)6|7zEH<%{UQ?1WMhL;j&mO8yaAaB z$n9?jx_7|*VId%B??8U??dW#{jiPCVOdLYgk|tQO_WNDghP-D_xVg9#D{IbBggSHm z&oUw(O|8ZA&L&!amgbk3x6wXgjEf$$g zsMM?y2!GI^(4N7@*~6#sPupGlDH1lsgY;@6WE?~9&)c1lsw4acB#~kzjTHQ4+Y^$< zajqmJ1w3ZUxM*hJ`eP*AevfXaODEP0-HT_o+2_<@YXt$!TF0hX=bD#ncS1_^REepW zq$+DoF5T{gwnu!4+Cyy6L!<_D*|sMntpY&^|AdqrI@dF{JE5}2MMEM8vB`B^|MKll zm=YAGG+{-Ki+-$r#o!Bs8W2u^P}=bNqz@5XIdgVbk-knC=$zCIjKUbq4r0In;A2QO zk#p5d7a^)Lp8_N);!{TUSzld3(qjREiM1u{fpeA_8em>(B`KYMYKhv_Gf%0-+FdMz zLS*=yG)2Or6kRl2Gw&3RnCxb-#ewSt*UX&gH$APK%;aXfBE~pyBle007wNY}By;U{ z7Xxq&RLvqOyb>cv?sbDN22#Tyh>^7k4QN(&`poTK3;ql#8wPr+=u_LC^{nkq2>b8Gb-`L270r5_JF!p|KTN-7!bUl0iZkrVv$m1e(vClmr#PR3EUL~L9~9t=M6s8 z2ajfZo&k*_;%G~68hofIBe{9-q14T(N5>dL^P#%#KY#F{PHIAUq4Q)V zP(^*?1%nS|fP-Z$5Dett$RTc-`InxUiTbk00BYpFdF!|AD|`U?7f~c^O;EYJ zb*6u50mCGU)ggpeO4gBg+st`AFQ-~GX{xSd@qb3>!}i`pj~?+zABbce+&=g{g2*nW zy11u8DKZ`Bj=_f#OXC*@w1rZMPwMl+!H0r~q>D+%3NcN`OUxI|3=BCfp>Shr1^~S9 zX@OY?3+&G7rZF&3Slsy*NbAV|4^HRBGp*VYsh$U1l8wdlH&-@! zvxhHrkvj2F7;@2(LL@q%ZEiT;OJ;gQD631ND+tIF7FnARwXtzz(bLT5Y}D>Ld0*h} znSZF`1u}251wjgMZ3&4y>mSgxpu~Oco|#AYd-YHS+$v6WtbrDGtOMpaF9|$ zlM{<(>;9RMwK2s2k*PrXgpLmg>1&w9z zl{16#gnQgKd3Qmj)0HAi!DN9G+JDtpCe=X)0XUH?Ldc8AJ7g>lz z7*Lt6QPj{~blh-*p!gMfubGLrj@7!Ox9spL6|bnO33D(we|cqnV=-b&#YP7ZANSax zeL)e>el3|weXHo&1qrcKlm+RGUuAXo9n$5v!e`suC|4KR8$x+c*I(EFbVm?SPa_gb zPNdX!-3JFh(#lXgBsS0!z}SE~p5Yj;@3)^)d4w2Fa70)qHVAL%I{<8J3dI>WY;+rv z@QwWjXxs{DJs3zv__svPn?`@-ATh+4y>sY;2!eU>=6;_|tf^D{0^@~=2|L?c`VGLE zhtj>2Rmtm!7a!_3z!SKR%~5XwB8Xh~t^EdoXTri9&k|fSa2++@)^C8$lJIO;(+;Ix zFb;3;Hy{B%C)E;7;t+WD@8~xGu^nCz%dsrswOGN!GpDimqZav!h(4(8nAGL?%JG0& z?Y`C3wUrAOQ7cl;MCw$`ik##jlvb&a#N2C~Am7>VgHbf1y2<@UR}-AQ_ej41K7<&g zY<+3~p=NpEyZQ~_pCN|~0G+m6fK$i2hux&%Qqaf_Y1^6z#H7i4hMfQw0h)C{F=8?Z zU_9>~b^>Y>vLS#37o|SSeP4H#sB0Um?#}yKEBo839@(Q3Wo=kY9?e}OqILiMNbG=WkR#cfVD%EMUIxi+Na1LRKVIu-Qy;Y{5ZEYH1+7?Gs6)1*5Q^$t@0-vR)13Y z2y~=lzBUs0h~KA)^@*9Vcck2<^|eG?zXXYWy(6P=X7)#w4+(+Y1vchDAPqTpv`^0b zpLqbS%A$zBum$q`=^4ePrOQ$)AK zO`R`{J{8bY!d*Cz0X-^B)4n+K_-xUt<+Qv>ZEr8tz@@(}{iza0K0UecZ&_`ByXaU% z`08J`s94j?*68kO(1SGnO9M>yL=jPMnhdNV*4{{ca3%nu48J_{&qKUUTT$R!SiUhY z7t012n7aLy@lA~&Cp}0DuS}Y`p%;C1=I`_Ov(Rg6=lpcCffmLDUSQ`nJ^EVje@cN( zbn+36#0r>b>+3XmIzme;>+BkYMR}+9@X}(`k3NZ+57;rlY>3ZbDwlp^fG1Ub?55Fv z>?ZI**hwHu{22Fi=bJMJORJ@M4OJhz*PcrlqcJHz-n5PnJNR1z%vHUx&Rld6`EuY( zKqUb4Prp6Dm#kh_`Ab4_vT+MFK+;o#O1?9bdsTM)3My?erOVav3YGK={X5;qY=uCW z%A)bznSL%OG}5GVF2}h6-3~fE;Q(Q#seNyzhP)D;y$nNmIC<(O;(L^W)-u;%hNJrh z)DmF2w1<2<{63pkf3Vehf&=WL^0#*bHk>3Ni^ri9q4OWibW?%4;ytwfZs(G3OUEr)H6B;nmPqgFP&#N`gpma$rS}Dk#Ne z9b>7IkcE2qtBVz`E#%){&OE;2t5U}qqOuZm{rs|LkHYA%pF}M174dt3_(I)5^g|&! zr>^y@nNhVs3_JPx65s_RH!`&#^)nX}5ZrtC%P^!-FPPrjL; z>=csu-24yn=hdR#3ug<(Iz6QUW|+U7c}#KWG?L+^->3co*)l33+#_TdEuewGIzh~{ z|Nd_1862>V2~d0Z?o_c8=l2ae#8&O6rp=-L?+=98_ zRPF1!a^yDIThJqmRT-j-XceG0LUSRfq|KxxEIe3 zBNnVAeoB*{hvZLXdJs}XbP*@M1_>i}FB#vJBN+{Zg-QZmb`F@kOUHZVxcf#HWeT5s z-vcFf+3Y_xl)KgfRFsYeYpZP5>kAwa;Oa7UT?kz?5kMM%?m`LEd&X>y6QS1LxydT{ zX*qEA?2((vN@GWpJ4Hd5BLyp@%V)`+@d{rkwrn+!H*a|z!CaQfk^D!Lnvv_?R4WFu z9r?QmaX@RNT5!c|Zl$!_HqlC)LmvH>M$T-~TJrsf8St0N>*6wS&V{Am z#LDJ|h|Mls5G-vb`5$l#XwK5X7ON35E5wtpo5gxql-;u#mV&395U4TF=}dk+lb?uk z4m`Tkvs3(T!4-?B`pPP|HTwYT7W&DIXfuSpio;ay*}s4n{)5&)h& zL^Ude>2qe!DH_aVzY1nZe88`@m6Qib2PL-Mdr;cSMc5Rf^Q3`E6ns-;Y0-1XKI8Ld zm&<`&cgwK*Pr90jm}6W35m@A%CtCx48*m2-bt;Ct7sV?8=VWD4eeVUUE<% z4367_WW$kt^RUkmBpFElKr~+x4n6((v%^$k@lxDeTP_C}=c+%cL;Xm&t!0Uo#T=oTlFV5kJAI2f6qz=_Eua*{S@s>XPpOqSR2-t5wK#G1>^Znh zafF{JEbv-)Ui#=5(-EU@V0(4iQ+a&JQ<)yJ0`VKYZ`blUq4gKeKBfF-X0Xn(#AQd6 zQpMG|W?0#ZqYVOOdisBGlPN7|v>6b>c+qTM;G9F4hI=nc;owXmz}?w@h#XQ5F#)Dy zp~QMGp6#kZW!t_w3?@VbU)$63*uIxC=aqQ=YCE3`c>BSdr*j4iLH4%*Q7@9O{EaeMI4xa1#$ z3ZSfa_w2vd@M{GtRj#wTHha)BNhC_dcpC-~m|6&XXx&j7y{G>*iG69R6Of?WNcmj9 zclQ5KkxnLcFJ3llB1RfuTWL%05oiet9M(%`ZS~IzR4y@f0mtRXj!?_um1SA7((|Gwnqo|`JmIu(BV3*O}{j>jb zpp7!8X$Pm|sPNQ+?xByv!J56m7YztqKc zUi`|Ypb~fW`-S!77%BLYWI`>3eE@1B6onifJ`&+8PVV$KR_njIz2Q{sJ$VbSqyn6O%?X79rw?_qj zvI59I6L1aCr+nXg&FmBEVQIEG#JIz+9Yd%>G#}Li7a1y*UDCd!)7rKzZ#g2c1)C1{ zV@s5iUpwA&fxRDm9giJF^y|hDhHcC3=Z<%!)iWq9FAZMvD7b8I)SU}RK=tQWr zn9)N6ZG2?pa5`vzQ({B6DtPPc6U%pb;0kUlSVxZZ7}jAKPYP`t6jtyzLdX}Sod33g zt|o~n6`Hn7hlY+~=)8TPQS_mSK3onL0+u*+-!afA9l?$Sl#?{)OwX|%9%vLOVmM7u z>(K~7N7;SnEQV+Gy`hq_s<`6-Z{4_K4?K{>Vw)65lo0?Lz)VZ1qeO z<1H{8@2)Pd!CqqI@6wHh<1Lzqh3lSr&~(#4y3#}PtoO`X!SacgVA%7FQr+!?v}TB2 z)>bZ9loE9dWT231s0k3Dv+cci_LL&^ZezQTJZfJl2v>EAYSBUmrAtu(OrL=saO%Eq zlu2w5Q7JDTwMGNiA@BX8OhVK~U?l1>bYu}I{=g`cKoDbxrS*-%5F&l%2S=HNl#-Gu z`!y_Xn9JseMw$efA|FI4fi&MnOFulyB*;}De+mSe$AeCU_mTelHK=!#%WS}@G_;{T zd~}r0)u72sb2VYJgAV0>Y@|s-Q~0V}Nn#s0=6ObJ?GP-T&{+a zVT$G>tfepl(fOHCCV^^dictfVf6&x{_t~QM-=HI;8np}mu`W?}dB>4RD9~`K0;?Gz z`lmr*{oHJC+EBwCDs?DMUtBvNjxsVU>_xUMME%H_iAkN$&*m-sN_(SMSwVzKgr6g4 zE4sNpw!0#I=6_-K@wF7QC9Q>E9q&@U*)nx;#Le3hY|<(ONC7NE+#!9#5{5w%#;Jis zy7|Taiv&ca&A~;B2O0%A;g|Xk5fX=^afHZ$N1F8I+5e|hP_A_VshlE-Q)&Uy5Hf(C znwUny2lvdc%$`~faEkn+`1MepS{)?$ICr=K@M3S!#bo@mr%D+ftqP+_K zI}E-y&?t7I6w04x1x_H6pkE(o6uFn4crj6voQj6=joAT^Ep+DiA6CXA5;C$xO;#t> z9|t%f3j2`vljNJT=T_HMQ+ie{tHBq{QKLmE4TljOwwwn134=v5_}1)swNt(f>0@mI zyeNt}r#)Js`ig(A!hufR2AVxS*lcV9oWo}E+q3`LGv9BH?mFfOIrp^Vk-#zqt3?(L z`b#Gu|IVz~J`#U4>?8dq?`Ap6USI-d2~g#wMaiM%*x#MqU&Jw4bE?p_>6E$}0vX3~ zZ3D4A%68;zp8vg(b`*3W(;a_PiHiCCy;02zKX(me_QwAi@CCJ5fe zX`=sl*4q1b$2K?q_Q;kGh>e;?5%>jwQW3hWKbd`8u27S8qfc9>#+In)v_4PGWkN`q zyege;!^|Q5HXSJk37x#P5%!DkcqIGC@@lb zr27Bc{zEtv!$9cI0r(~qfqpl8cCC~**VNwN*YK>uSFyFC|X>|@v}n+0umD#k)X4|;#$EU2OS6tl~Q8B z>l`8)?CXCTbRYm7G=IRWBD|CmAOCsaf%M=42}K2DiBa}nW(TEDtNv6wKnI2^M~+L# z7}!)BsQcSaY+N*#10p-HVRgg<=Q_5k!eaGX#W&82paO`*Ococ21cI;+ugCT;p36Nq zh8M#(sKO)&7ZKgr7(Z&4%pI(srrAQGF()7m{;PU8(#8XGq%>87^=J|Mt+R5o!iopM^A%ajmze|-XZH*0e!xVhR>BiF7@fZ(eH5aad(qv%;7)Y zBY4REqA2j5n>&eQh}%v1pG9*{+f#q_Y_tLDzG zPgYy&3TeCmYJ({6T+uH$qJE5)5ToIXAmYx^Kt$+++(zmD>bd{b^+mF^ssidInhG>) zk%Z+79g$y}zE9TxzIuw7O|o{d`zxUqM!f6bO&y^ftcBOi_3i7@57g>~R z=T>_@)S4SssSj8`>8gQA3D_>*gNaye}izqe6Wlz0>;aG&N$n zencfnME_k&-DmcifLb*$ZTk7O2?Ts7eljSwppERu&*E*Ui9tw#kdr~w!4^QVbkAW2 z5Y%~l(PyAEZR^+1Ir)tX0Lva#1#)75#b_ZE4Wo6GooRZ>GQl^G{oWOWP_k<6hPhL- zfmK+$`kf$0_~r@%w18ZRx(5rA{!{*Ju$WE1f48eO~!NP&aO<6?JG|{@^9SEXl3<8 zriGhdqFB>FB8YQmh&W$S{L^(2|@`JF90Wda+o;S9c0gTX( zr{aPlCfe`mO>-CZHVCXQwfgV>esi5pW1}n7>e}Kl@URz1OXv`Yj%025;HfwP%4gTs^g{RoL8PGHz2XlOg$^XLAx zYo7W(T~=(W?-7+~m^Q3ZY{0<4!~Mv8!QB5_3m1pROLVnn>Fzn$wxfy;NY!$0`7iK{ zZr%B>dD~y%Yo_?=K_TLRrJjeG!R>QHrRXZ(lS4jV?6Uf3eIT0%unnLt4PO0@xhIX` zIAUUt#q3eXiD7NhW3gX2m$~-lZ)Jh{P`}N9jD>42C|sMWB|7=2^s|$`Xzu?m7mWEi z18*+Nc8v(RjZu*f!I_G?W8OJ;P468ddv9yXLj^OF*ro&@9nm*b$vNWuWLc_9?O2q7Od1%}KamtN&Aa+v1VnXBaA@#W z(G2kIyXSgiCF{{#o$x4^07};v$dc(8cy0voJ=^|LBw~Q~e1ts{tOEVy-npjU{-LZ` zu~_cy!|^5gLZitsz)Ks^OXr$65#^Ct&eO6|Y_V;`2r#80y$N47_qcYUu(DV>TW|!D zh`?yS{K9?6f7_CxgfQ_zEz@h(to!Dk(EAzJBBuH=w&`W(l7q$o;6aFJWN=7*zP$fa zCb0rylA!0vc?}Wt{xMtz`;df5Oie3_^y`5EE&~Zz$X394pob%y^@_Ra1&UNHK{~xs zeqN$-AgHIg;@#|GP4hT#-6N#&Km;PZ^6I&MU7}8=UC)^gEgnstbe61I4eAy}3b3Jc zS`bisP56bOUIylGgBo3R0A!S7Kos4w!}@1(zB-ej^7&-)qR@s}cPZx4IlW z90ATqq0I_nFAd)`ch$g`Gm@R+Ru@C1l6H&Z>V${HaK@YGt{nJc4hjKijL!*a7Ve0M z@=@nU)aWg9|Fi2cbtUbT9+VUm9XNh9n=YqoOeN7*6$61pgX5w-3jPipHXQHhq5iKv zO@0sJDA+-`P7sUVI{Zrq4jV^#NT+53-ZV7d*8fvAmlsqJG{{z%rfI)@Zf;>=EncER ztG1kX%x(5OT8iy-+o29Oj1CbwGKNM%u_VfP_#}O<*v7$Lr$&Hy7Wja7{*^xWkr66= zU}E9D((7e?dtiLu#U5J?=?aQkuu5U|uo7d=-m>hOHuNEB)tI+Ya zOilX6G*~}0XYBpEuC{8m>WGXd<-L?aA`8ZL^x?Un=Z=#{L3#XEZbUXAp%p+;6QeslF9-SAk zC*hT*037}RGA^2yL@}QjVdnt`;?S={f&@Q7Kt!LMdt5z@%U+J=c8}CK^IHSk0_YKP zdcdUxRrRU4E>*fpLMZg!a}#c=LZ~bXcphbF`b8LzKy0Cok$igYaNe0$_dvA+@=n0P z=%>4E@gy^kO2ai2OJpX@W#-ZQ{?*9okz2JN(N3Sb6#JFyKK!w-`q< z6dT0=3_Z;+%z4!{Em8ss6Ct+Q6~jdFh@}+G+vV6~^TrqFMnTW%F0E@=@d2{(RJZ*v zjWmk^atExF2eZir?rMB_POE;6&Z}8~`z52pS{GESO(O56UzxMB4NHkqDGxa!A`}$j z#R~yNNN+*40sv%c4l*c6E&+}S)346$SwT{1Axf4gsH4%bXU{qOem}q6dxVTmELWi$ zDmn{V-mXb_2oD3H2-}XoHq2np7x7V%>BVIimh9Ju8H~*&TG`-KsN+yI556(?2LufAW^YU>#qUTT9?U>s6IC^iUt8rm0|j~Mv+2IK=&fH+=~@64UEotfpZu;Gof zxDb25mBBE++yCpOU=1EZpx81z>NV+&|5GnDVZ{duP ze82xk#$-5bMTiCj(vh@&FqTc1asitrSrBYeVC?P>w-Ve%gPCJWkmsL(sBh`0mg84>2)&13!q!tqHkG3x7Vq5C>$dg);;tUQP(@7Xu7I zk_r4S{9^b8farcXzz|qy5D{VLA}HYd?yvd}L3bO@EOZR~2Su{$*ZqgELsFNGz(4S& zBOmyi{zD*#(O8H7Y@`T_#P)Cd4}sYw)KD6DR0cMi)cRxpZw^EWRdRwmtX~lQHU89p2qkE!L6BBO?UN(n&;5rW zNRC+s9d?*t(jxy${~;h6D3pks3ufG!t6wyqSA4saB{|EfuC4|6k7eBS!y9V~&aC>s zoYTdLFQ)-8!4R?1kWG}7!@79BH(;ncd!hHj#=Hr7M$VWL3NzcW^S@~81WAb*`9k(g zJ&dIcK+E)!o&LZWO;JKW)&MRnMr2+(e+EaQsE#dkEEz%n0O1kVdGQl69}R!sa)EXr zki$&_R*ro6W%Ez&U!|*KaeC(1qzJJ4^}vyW1INiT=Ks0>?CpBqmPY`RMzA%xcv4-9 za@FNKdf`{h|I6T|hvO?-UOCYxtt(ohkXOXq{mS{irg?|EUF~|_b84PMBOV1Qgx+ZW zT{WKv$61t{g~P#;s1Ke1a)SiKam9evU?f7d#q)_m0H~;|=L=~%6&+W{fz~FesEp_6 zVjTgM6(Jaah}X<-Whdw0HoCGdxGJNyK|p7;o3j-`%@u zT+ZU@++^MHiexABT_n_w2@>&iegu+Or2ZW~0h`jJA5{-Di+WTCd~*00A9qkhin1nO zKyf~igbgV{h}^+5NB+iaxe@xj$l^utjh;2)JSMzfss^1QRhL>54e^HFdJBfdCwkk9;hocj6(+@N*j5uMP)u`My|D$b9U+I9?#$ch6SKt0j8YySUIfcZlI2xIv* zr0b+ok|IfjPY#|pV1wN7?!WGhyJ!B|-p79Ztggck2s``7rq!a(zK++8Dy2CH4#T7g zae54?N7?tzAFf4>MdPQ`4ivN6E#pO#vLhnU_~gNxOP%DU^GE96rB*u2*(x~#|IAEo zKEvR{U_KsXs>al}z#}^dE>Obtf|qS)+DaaSuXVtpfMH9k~ZD-;r7GpWi2; zUr0zy3rGp@9w2;M3>UehDx2c@@smQPq)W;p(zj#mK@q7Y0!5@Ieqer(J{`OvDE?As z13U(vsLV%k$9LA6hWekJcR}M7F6parXoM{vbBrtl_{KY%`mJ|(*vs7b4y&5qp z7B-|URJ;M+h3TtD+?#NX0iZy|QH;5w*n7=@w*X-uK&v4|{{(o}Ye)Qa^q1gCQtYHw zCGNtno8MRG)?J_}K(445($P7(sI1bF@S*wQsO@f|H+%l`RBbbR@<5zG>9!H4r(% zH-eU;2ej7J-#kAuNj7#-fdZ98>r9x?`ddbyiY_FG9Z<%&a#O^K9_k;Q0vF{aN(GaR z=wg(-wf_(gG`5FyG(1rpc5Lr${f9_72}qBID35eL{kQiYf_w&QWI(kjR6`Ln-_d_a z3abe~I$h@o;S?`@c)m$w1>F$o<|LWjbPozrgk+L|!T{a0^xdOR zg*7{(IMPT#)-5*O_w>K#77YQxX#qXPbA4otbA5D-bA4?7$>o}R#X`68n^W87 zx)k@7_uaxVWEL<5SxA=8$Gk`!4uty##tEz?q+*QTK0d}P{lt83p;IOZOF4a0^_&rv z6hCEXpcwKI3Vd?@e-wn^e85U5-U17`#61*dDx%P5WwYkw|I`>S_0waV>oa4V>$CGa ztmON-`7X|V1*o(?fJs`QYEUd#&Xx^bnp70ZgH%Hp%t<~!-$j(KOw-0YNe3m8Idfee zmLR(Tws6F9ph`3hV!klO`}f5$&h@1+&h_On&h?cs&h^##r)H&m)v3sM#f|o1G*fWx zKD@DZC^)gS5|ol}HBtzp^waXcB+T9jjwUop1XON8w*e)NvmUh(Y;wOg#_Rw3{4n0A zstR1z%RlYd>c$EAYHd#*+V zW*x+hfsz`rb&`BJJ78gAht zkg*IwrPPW*RTWLm#tg+e$tiqDK0Mu~?ZP{}65E*Smis;A+ZN&C} zJp>v80h=x7#`B(>8gP>40Rj%=-^~AOt!Cb}dP``CK2QtWLn8|JLV((a7Ddr-`>!kN zihw>Nl49gOfcyTg{}46|P?(Meq90tf9{qldE9DRK=eBX;xO9>CkN`_KLdrS7gP@e zzdlm{6-j*H*hXFv-CK4R>zS{^&BnO^SHcL*0w;C;GG7qpy7;%vYd}UlxLLaI=8WN!VriKvwNbhqy19~SOAi@UFRu$f&8@QCO(0iqY9yyxydeQ&&!y*^aI zPJo?0d;+oZWAfcQf3Z(qFR>M3d8${9Hwq^;p1rb}BJ8v5=k4BKN)HaGf~@LquA)&* zVQTHPoAW!)xsh~jIo6+u>hMf8YiengyZJj zeW6yckEp3Ss0InA(n+4*e+cSk0iARVO;N_9l=FiALuk^`kf4E0y#n05eM|o#;)#hr zJi!g01v&24{zDKAAekc-g7OIG#JFwu(5ajv7nGh=Jr0Dh2LT6;4~mYqb^Gp1dm{m| zS!&u!jej`!9++cb>7OEGjGPqBL1L{t`rjJ1g@AUQ2*BfK5Ew7)KZMc%w(z!rdzE-@ zYcJ|Q1VLI}PD;a6zi=Fi?(9EAE=k_x1my<&vGf=3^fPAk{a@oU?%6%K2>zC-wcKh?SZqPKu=M2K z{woVc6e8;)T#4mYoR}}|KLpsl208;U7nRl6uwT}Hh>K#3X#DDEWSWj2-Z#JyU<)M1 z8fxK=NJPH8{}7~z01!~M<;!Ep=-uCch!vs3Vg~%5CPqD=X*Ft=#_RiEfzMOLuhlT&W$4H!y`ldQhq@0GVGlt7>hh8K z#@$D1!5pC-M`rFHQ-X_b8Gp*n=dr?Q2!yM8{knK^!aG(u*bZ0_y5S^jZ#NX{kWhiJ}qkhxO@|%Q;gsM z3*WZ8XL*O*FvevbJ7y$p@g{it?r!8rUHsT5f)ku2#e+zg`|sF&R^DV%48=TtJtT)K z3Lq+u-SV-f5VgrrEsy{@{x|x=16+fWzW^>o#f6B_)!sS47<|j1&p`GSjWo=g9vNT^ zHGYdbs3QXcjLeANMNy&t{`Kfllr`0|$JNlKKwki!9vCCe3?S;}yIIop`Lo2Q;r;G^ zYo!H%W*-&A6sv|fdC%@vkLgu*lGS9YY1g1Hrxqfbft@UB=!n{f=6f6NRFT4!`z=c0 zBLl>4y-I}9&Qa-e!{C(0@7ul5^Q&}{&koJ3|IOkU#$VpBHR)EY2DsmHEJbYRL^L49v8H8%{P6B4_IS9#(rPORC1e+4Qv&ua z7mbJ@h*c=4MuRs$_{adSyfh`n>=OwW;Y*tz9bk;jMg&VgCFcRau7w{PV2mrV3Dqtf zovG4j;m3D(%V8JQVNnwjybT>5snYac%eF~O$sX;YN{K~*@rfO}p`YA+YIVElQCg>v zL16^qMX*eS(n>K|i{pSABT~G`&VFk5fnlcUh+d-JkR~Wt2>urH1nbjXMc-o28EsF% zG=}E1_=wU$L|frAJf!NC7W23FG@jAghH~BQ*Wx4R3DKORo=EbJqSj{zST&YKZ5F&H zI;!;fQ{!_3jG?ge|Fw7KQI=G7o>zO?ab`SIZ^^&rpYfmJ;0Sc=OC63jvPiX{2&mI% z?9Pt0Ubb18X)ZwNaRyX&a6v&)aY4Zal+^`X00rFl9aj)haRX6MK$*|)M!fgp#arTS znLU5B$3sfYcTDTNE}P zG{(c|U~+YotSF>o&t|wk9^)EB$0)vg983u@kbU^c7}ucoZ+p~upsheIkL)|gxW)z7 ziCP@+eN;X)-@a>%YfO@jP;E7smtfoxOPce`xqFOzfFprAu7QHNj{Jcg{cKl`CM~K- zcg3WMlPNe$^;jd~wCsB-{y8T^Dt;PC^Mnx%f4*x^A@1r^&*(;Dy_y;OgusXC5PISU zNkLsF{L_E2>)D46OT8b8i6E)tLSILegal25yu{8(REOE*ykE}o&hFiHRH5g}r}W6W zWTym?83EmebEJXeL+bx(jyLt|IkxqiIkxrNU5AyUlx+QOLv)UnfJAMtyLZ22OPP70 zMd+Fwd~L@LQSnKCx9fT1x3RUdv9-3gx=xY4V~;BFjx6Ik!=LJ?Vj01G)rUY%n7G`r ziW~5(*wgQ?z62tXh0CD_j~z;t5&eGGvnH7;rqP)zq{ms?49eSd?grrlb9^U%sD2Re zPdKW9)xPuKJgxADySw15jJUFk<D8)Dywz9w8}WPKd(vFb}qZd0fals$<6?ex@IWn~Y7 zt3`p1j6s;f6?9LlzQjcj75O#CfEQwge(;JhE&=U>=#7bqbZkI?dS&$`$W+rs>^K3A zSV^M4s``?^1Ex&eBeGN|kQt{}UlQUz9}8L5;dq9i+!@uE#MHyZJRDfG9#0*v$KcvI)kv8`9n>j7Ug$D4ZX zL~~)QFc->u_3P$%R~O9fu3lez=76(Ykslfb6lc@bWmrWh&@PLlDK4x6LKOKf#H=Fs z4Rd_73+LF@MKws79i$eDVuB@kW6kSP3pueRQe%6_>?mpGFf(iDkD6c~3b?i6S{vprt_bInj3s$pTnP~M|2|=9jgWuBr;Cj_!)K5Kz zg<^CfauUidkh`+c6AVb+n^KL^0`0A}5zdEQ%ffOqDL$rz-dOkrphRQ$l3K3lrbsd* z4wRrGKjfB&J&Y~7;4E5_fAwkD<;yjYeZuuZ6G3dgB0`=}dvC2QDU>yv2+wWz?(VsMWUG*okSGERMqU1;3(I=h%6FODAJXf>@(SW&*XlV%ulTmD@aH zKG0bJ+F9RR)phso=dUPv*B9a_TU`+m#}Ep@R0$&2A*J`h?H%~5YR?@|6hCo&zmP!2 zDvKitfoLxjK^-SON=sMIy~S&4hj%zMk%%@OzIw7MT#Woi5Kd0erqK}E&~(_5*KX4b zx~|i1mr*jL9yaoRAnXbQsefa2t7AYE5M8I<3h+9LG4Hg}k8S5be0(nE zrH>=$Q#HHy@w!GY>&aTOiT8>S(pu!@pwIa(_;1q={qWPZeOVl~)=x#r{-Ok0&wA;u zu6=>taqD?hsj#7_Ad8)9NIe0Zk8a&s%geFd7F2YEBkUUCINM1kG=gdx;t5NeiyO%79zx=PUlb1*qG_RoN44DiL@%YS&=obudCE zv8)|_w|4x{@1}RE3{lmU*-91!Fg18v)>V02>K5ZVSw=)CV zYH00%c_{b)O;-;cNZmHcEUU&)<2{7UYc z$1Cyq9|&&LOu#)svH59j1PQY0V;pOLE@vv$S^<6*r!4WW3YAL9-L+>_ewosjANzhU`>xcC&BD5CvE{}N0ULoR1W$8#%lN0yuvQnRb*B%9QLnpFga{JD*5OR zC`XW5hMjNm$}yAFQ|JELKMwv<)t`c)-&$HmBqw)VZEY4Id6wsRNM#^PhwmQ8lRwsupQ_2Nm0%@mamxU5++Dn=egjiElKOXw3Xi1)9H9`d zkG1%r+9BDjYsY3BwMAVu4VIQw|Jgy^i4b`wg7lL=)wFz4<-a7Skgy{CV8V1gUN&q342(0KLk zBeitePKMIdR7W~)O>m9iCTQT;6Yo*-#aT~7uj^*7lC0dM9*fr)<1@Uzq^vs`S`H`> z&?5FF)+ft${!-fk!+}DjPCZ_V-62^f5k(WB$@H(a++J|N%Nn_M9N(@)^PDZ@mf&Hq z`eJbfm@Ry)cH+>tQ*L$G$w4N(mO}0WAV>8^TwG4Azi{kkM`W{TnMsrwI*S>Y*2oLA z)9QPtZ@G7&IIQ4)LQgKT9q^nDKVhu`NBoNVh>4pSsk1udD}Haw?ekn7pv#h>jv*V_ zn@tVL(192M7O1=NE9)aH9?KoY`&ar-Si?tfPxhtY?VFGe1Py^Wq@BE~zCLse`}Q*F zaPZURX`4K}=$d|?s5%8JDSpC06VXkFxq5p2WkWmdOA%#<%zX1x6S({77C8t^>HNpS z9w_r1Z83ZRZ6;&NS<=?e*s*DI=1xtUvvzvgoL#TPyrSEn>smy*2!DAm^vUO5P2PmdjrkS!GjP9fRkr;HRQ|0>tC63IlFKNu&2v+_gNf?N^nZ>X25V|_jK zRM*f{A>YlQ1`+gHKfbV@4!vI0=BB+*3#WjP!-HX>NC_R}qWa$t{igEuy%dYJY$UYs znB}15;=1A6Z>;;R&3))%P*I~y(Ejy^L_CAzBUDL9r6|<8A0`p+#3Ohj!{@xI`Xyp( zNfH4*0PZka;Mf;We#gM+IXj?bNZEqgN%-d3n|RCYO}usTCXf=0iQiHKMRDRG{gV1{ z(VB92m_;GOj6A)Uzt^T6Xb7QevvFwX+$Q|>45M!A~7tLE3t-#VE z2^#S(^!V-D+x$DKrxvx-5Sc%0dZ=a*4ZXAa5=dJrjT^HNdQjCbtv_?<81ek-)X;+o zl7S}P^H?KvvST=PrS7}x<5nX2hPgYu9s)O{d9delI3!2uyQjG`KP2m;LsvmpB|-7| zvbu5T0Vj5YyJGHzCs9AP#2!0{4DttH{Ro{eum9uFG0Fa-ea?QaI?}ZhGzEPn&aau4 zTa5W5vK~koB7z2X^F7tCD1y6Wk+$(QR7Viqe{cOo`N312inBFcAO!`aYxak2$g=#@ zx6ntcTdLF>;md|f9O=YJ-1UO@jd4f9y7l}R>0f4#9=^Z+^kNNM;p{Y>&YQ>VsjXJ^ayX=SngFV1xq8@zC({y$^0nt5YUzLEV_Kqf9`EA`J7o`XH#M`WS`*Jxly>aZkY~2S_uLS;+lgU)M`{vNm=D15S7` z61W-Y-~elZ(wDd}=llRYAE{qFTpKe# z&2)TJ4jjCh_duIFM(`84#y?dh1K>80zajSI8%3%i`RIt_c=_IXk4fzfstZxfb1Qp} zP(6h(8#T-x0HOh9H@q9FS5HQZ!UxB*(87}3PH(I)51q^9n>%3e-E~0z#|P_)#M94B zQwkF54pFfObchY3X}Yjq&5v!{SU@(^g9P1pQZXscp&zeT+XQACRm+Ijd4MsPXi|%C z;3w);Hi7wtiQ`hy1N;Z>1jADEll6ZYdoZ&}*nf0V2NHFhQ3L1`MdDd&pi9Va1NWx- zh%|PVKkH2NVO`{>vu-C8n+&+Y7NBH!!lrq1J+EzLz`-Lo2y_!wPooF`kQF%-W$Na_ z;n!TihO$sF+i$5`hlZ=G%jMmxys|K6=u{JSQ!jxZ`l;$^YsFNLkhbH1Ke zN!0o7?e)1LF;v`;xl6GGTOpYM-bD-~(TlzKGxd2RF?#zmMZt~}p+zPPW}y4ooqV{@ z?eN2Wemkba7e<^d@+Fv9yMWVDDK?491&4{r3piBgi}PsYOVcz$jm5*YI-tUQI9BS+z_rq%p?dAE=#+c(zwYX zi@%i^TgJ0p5Nn}804EV=vjFXB44=O;%{Xwb5?HTqBW{S&rT*1@E>If}NLGJ)9*ulw znnsAiEFW!0#K{setLb;AX@s&caBvqxjRgHINB`bD8o6U0jeLI|jr?FlZm%4pZh3jw z1k5ND*F8G~Jdpgbo~vsNC@7cKSXn>1Rep9(+69G|e;N5g?Y_!u9p6 zIMse!|1SlL`|hqI&AV?6WXC$Fkfr6#C6Q7D zFpPjE3eU>G8!if@1O)^d1Kq^bR=FdjVQ+_1x8Czyux;=O4W! z79nU8I2^nf9?M56GBSU;twVqBjt%{){UH`j$iRcJj08fgSvA52EH7%%MoP%6M z48f1#9sis9f8_%ai=bR)Y#1}9t~K=E#|bqBD6@c;^N zbgbPs`kw=~{5(*- zwjhCEa8NO%NP?7j`iJ_if=Wrco+N*)ADL&IqeR^Fp1I1XpRD46@;S37OA0LvQAZgi z-KJpaKUhC{Ks(27jUfik*_+IO@Ev?c&PyJWRZkLt1J1|Maw25Amci;8yI}lra3L!e z{i!~L9F`gJuu^kT0L)9+4+(__`11ar>n|wgwzH)cL*&(!MOb14yIn5VF=7m)SY7GT zIx}y1X(d@?CkQ2c23Z8d9FY=oFyJtQ_~H8VCvTWjf4N0_M>%#G|a_zLVvtLQ1{wt5)36$5BNZULc*vc_zUB@ zvcDzO^ZXkwVq%q=OlAgu#QN%*g2lG~c{>ixz2f;mNc><;PKA$3kNMYeJ`?hFQrgkQ zj{`SF|1oMRy-9|NH^c(Lj2%9NmujSG9;uwx`=HQa1r zRkhF(mj77c&jN^82N%&oHwVUVkdXc`edKV@ZnRCs)ukO=eQAq$;X0{XBBN~4&6aO! zCz!75WPTB3w!wCu)5sCbYEjM*GCnV5CctIrWWv^|FQNPB9HwItsfJV~z zR_)i#>4q;DtHrzcgcK)0H6ux5w3zhPFDL|3zj%i9)Z)=*77E5D=*nfR-*k>lV2>;rj64Za@os!EWsLO;fclk}>&L`_%E=@YtUoEHGBOr#NsYO#m)P2<`zA{XRN0y8xb ziXh2=2E}z_Tm$9+27F3lIRaeh*w>G74M|*Zd5)1cbSkq7ydPbFfr*c~VF#p&X&Q*F{q871nPHqq+xu+I74cITtr`;OcM^dp?BjrL(2CC6PwJqPC>v;ypJ`G$oFiu z;2yTV7p&sSW&u>0EySg$UaVlye8q``Ljv)~#~ba$BYHA|2Khwe`PqSLXxg}pI_?1t z9w`Y9m=<%)>|v0CETSnQ-VTP zLCVp1wYrJ>`Kd<4u{w844RI=Sz*J7ndCMRdyHFY`N)4sK-$hLRdmt3zY%iioe|W zZ#`)a^^GrPrIGco%-Z@_tDc9YC;?HG;7=8XNH%?~kqe8f^liGe5@qS|qgI}~B9ka$ zL0nwrw=a9yNt;2qoE);zTH2>n1fW(^AEPV^!W}wR`gI9T3n}Mz>N)$hUG_OnQRAz} z4cZi98%&HS@eH?46)6YVR9RT)RR##9&a0PxaeN*IMZ19y(Q*jJq zk7gaXA2*(puP%A*bUE0+x8&m{ss$Eo~A8RA|3m&B57T`o@ElnN6N4E%|tJsAqwalw2*GyxELXJc!7 zdM+_V0GOaaVsmOB9ZiAgt}*&OoHC>=+Os^b#iqO9SjzK+8A31t!O7a!7XIw z-%A($=i?>We;hGM0j+|!s%RMFRw%EE%tBmEo1Kd%lgMel>{lk6`ZW~|D;nD;mP%f>&I zDvuKvHU$!ce9Tfn<-dglJ~oO`>>@x8do{hcu~ce*rpjhdUyKMgus%FX-!dsS{))qD zZ;@8@HCxKB`)D3wyMb@ua7vXLyOdv7zdjTMG2O%A9Z`1ZaQ1JiFQG7O7{J>>-=pJ| zCcmw|1m7^BAsXb9aH;Tv-&J1%S%FxbJOj01B*^{ysxPqtn!qKtS#uE_PQ&{LECOvd zOowk$lu{k^A@*Is{*Z!EL(hoVgtwh$tffdca1#CC)B+4j(%)C#FS#jGaww(;-~~F~ z1Jgt&f0*W?KUUwI?K1WG`IGrX)gNnG#5R* z%?ryTJGihsy0Z(*U#1!FzgEv66C$1gJ;!GyL#a!9tojlM*#Zrz4U^KlZ->#T%}P86 z0@wz^gI27TFe^H(`V#CFq#P|4P3R39)+?Gbo_k+8YXh%pj)a0`$My12=JZ*6J)@bU z8dUoO5(K1PQUcycOVNgcQ-5Z2jB>xLIV^#xr;`anE^ugZV=iVwx{EFOxz(3&%A|TrUW>xDXC&!)RU<~N-3r<0 z*zWMYbp7+2)}jA%-`3_+3do89i4>ZKDC_Iw)kW~jd3E!dDhu zp9#bqAS(HDPNc+MubXuaUeJX64lXuYj1zPn_lkku2}>_cRIc>Mw%OdshwwCnVDYR* zH2@raY`(tgAzTnISPwx94Lprh%o}EXhzpx@KH6T?H1k7p{!0!oRzJ0~O)dD&;ZtNu_}6)4>{4B+DlS_x~_h^*fvUF%B4~o0YM4L7Q}|( zTwFQyj>}=zF+;4?p_poKZkiN)*30j=RMY?m#%auT9ns`;yKQZ`c;o%(W>NNhW731{ve^WMf02ce7Ckxf&OT z-c10oLf4?Q>sYauUfPVu??{;K0aE;9bc1(-mkPXwJTC>_cQqmQkNZ4JE79^+oM76x zj^5|eNqpObABM$}x)+>bqEpTa!Mo@GA}*VMlb1IS%2w85j#JXgTN{$#jC`{HHfVN0 zRaj}b?`a-9=$~(_ZmlcXR8#oYqTT^A+e&Qry%ql+qMDC(vcHWueoQulfkFK^Qs-`)khVYL;*fuDd_^kxOzu=jZMm7nQs}22a$cvG_U2_ z=HIs=BC-yPs#R8U77TIwcZ)9;*N|l2nrNUw@q)Z0K@KL;5HYmtrs?ZbMjknnPSo8l> zt_h{vmtbIm)HV~ksQv`VBXtGdu6Z0=!uaFk-@pl5X}WaEgx&WQGjPVCngN6ptrzk; z+9#SXA9n<%NpSb|?`R2|0myUHN!S+CPc~;x2`ikWS|ONOw29gd0VDRMY2dpzHD@+Q z&4r9Navv20;X!P}qk&ot<~X>y8I}^k6DPIz1*bq~Dw?%GYWG4)y(01rs@%F|4xJzn z+S>^hnJ^5+=E_A?#&kc`EPEnO{3N_@kVaB98iYu^Vaf^wsqnd={+sc z^xNm$Vc*1vNX2kYL(Mqx;kqZEY0kUW(ewI*wT{$~X+jl^p*enb@bk@3S}DCj1`${g zLhyk`$xTZ?*L=yKH#kFw{Vy@#9Ex^g1e!a5$7p?i{(bhnM-P;RACt=Wpu$5t{X+A! z$M>!FeN~Zm7pVMD0cfxi21up4}D{(bhn$MUXsM{}qva;`!s zmdJZSUJ*iq4YUK1`G@PunZf;jbEt%)Qb{aaikPoO_RRzeN`@k_e$cc}4mS2JhU5|U zCLDx0{Q^D{S>s%H zk9Ve5V0AdKVhrh#me+!xG;Xn6`8y6RRswVHh6c@8V!KyVw zS&o7&Ht{V>bEQJ{^P?x8ydFsqq_@S*$^C#J;z#hBf52W{Vh$%mlOy-O0slf@Zf z9M0~)Y#xwNzt&eHN?*Ho2O&90R^*8K232@YhuB0z!@9TG$TOFj?x-p${i>N0LH zBVCkzeWIU1&7)KT5j+}#KENEQh96pJA#>dtvk7=_i>vD}WR^Dj+c+k8X^w3jdJE~Q zs!jFUOBH@PX!wnt$P*O0-@W?c}(5qlgE(Mg|9|FT|6q^nvCvLuYCB7en0x zr8#0LRaGbPMWNQV{?M-X_f|l=BoB0(94$ht1mum2;^7~wEFg6xlv4fcnLAWq^J1j}1VMn5eSLY~>KmtdG7 zLjWz>$6N`rCKzq}>K~f$2_W_8@t>OiYv>zk%Vem6?H(v^(7NIxMXN)4 zQMVQ`UWm+7aKiEzpuxojbhC8m_$0v10PEO zOqod@K04Ntnfl~X;kN@HpbG8SfBE;}pKka$vtlskL&MM`f(!qz&EYDa2b3U59Y7K) zpK(HU4e2V}pRK@ptOMrixAyC7djLShwa|q@$@b@Zr!GtuQo)yrvCm?$r>+V?@3e)S zb31g~%I|*w5lmKEAEYM0b&+qfE#Q5xSU7p;N_jx`H*GdC@ zJ$iq*z7!w1vKN6wwUDBLWa*j>nG~mLbSGZ9@OMLdRwUt;N#zNV2hz!anBa=NYGJeQ zXjQI?PX#pr6-G!01-vE63Jtv#bk&5lO`PFHr|(R+kcwcMh!PNzNZ2);v9N#W_>A>p zN}@Au0pZ=dU)WlTT89T~n3!}6XLOuI8-Q~9>UUkx&-&Ow~{V|wQ+?WffNx-1Pp)l zGL87Wg?}D;$>6){dFGCvPUo?4*K}O)L=>w`!!?}q7hXQJgT9X|d+x6NUVF|cyfZq1 za#GD&>qoymI}w$;7QM$7{=krTP^|OxS8w+NzGmWO<+amH_ScPgw+9^fRJGKKnJOtq z4VDl}6!8TMRmQb#n;JxC#fNhD?mT(>!qxS-^F}cqK`zY*feGrE06MSV*3aY(lRxK$ z3%O3kfW;%5Eyd%|iR=4C3cl@@r3OyJJrkh{*meMmT=SxdU+Ehszw0;6`>rpZW?H>@ z;aNjJ&+IQsyRqOk)%I#aLW6IR2&_8<5dN0R*;baM36|Gdz>&MTKzSDgu2zILhZaG5 zg*N%t%4VmU#FtDnSZ|x#V7-0e1w)6uyzI7AVAIJA94=8q_v1u=0wo#DVsM9JAAiTf za9hb?4T~tKWRXOUsknosB=lhcAz6T69X#@PF8u4zn{G$31$)ZgoO8CcCz-N(S1(9R zmeh0tovW z_MUo1r#~V>t&iXg+jKPgL7atGEIfU9`|ZMjvcui8Z%vj&yq!^=^F2Mm)l^H(CY<$Rq(T0L2cz@dp;3H?+&%rU(0|$zza^WG6!#B~vjjsW#jXvyY5;tp{`-$Uqk> zAnkyaw!zH%=+rwng6;u1h8L$7?hz}t@50Ha5 zrBEEe_(D?M`uM_dv!v`bXTs@ugnT&e&z;dnm7Pcf{*4C46F&GSMs=TOQ-pO3hYoRn zSlw3q$;mIdX~Z4pp8(%tCp79QnxrW*gg9(MSfV`R11ln!n)~FmfIG#r7r$=nT*-_DPpnQTT z4bkC3AtSi8`rRO)iIEFV(y07Wc294s?1TX!kVAbch`{n|#_b~(v@zC4WDU_7OH?)y z&baoO3BMqs4Rn||RKPOEpTPO-hy_tT1Q}Tq%_bDXsqRPYD6aRp3HwCP2ATvu7370M zOf?>N@_(YN7H>slE}!tEWvJ3y!QSNY|KWJZ(~o;He?QLx??|;gHDPJ=tre5?EAz2=**#~RxQ=fQpu*^SyqIQU(9b!INAW{eC5Gnby wLww_L2kpXtTq?QfG^;$^6P~sUO1lW=9lUpWH4K(Fp7x}TrM)W$C#P)wKcfolq5uE@ literal 0 HcmV?d00001 diff --git a/demo/dist/as3_parser_demo_bg.wasm.d.ts b/demo/dist/as3_parser_demo_bg.wasm.d.ts new file mode 100644 index 0000000..e814710 --- /dev/null +++ b/demo/dist/as3_parser_demo_bg.wasm.d.ts @@ -0,0 +1,8 @@ +/* tslint:disable */ +/* eslint-disable */ +export const memory: WebAssembly.Memory; +export function parse(a: number, b: number, c: number, d: number, e: number): void; +export function __wbindgen_add_to_stack_pointer(a: number): number; +export function __wbindgen_malloc(a: number, b: number): number; +export function __wbindgen_realloc(a: number, b: number, c: number, d: number): number; +export function __wbindgen_free(a: number, b: number, c: number): void; diff --git a/demo/src/lib.rs b/demo/src/lib.rs deleted file mode 100644 index 80e49c8..0000000 --- a/demo/src/lib.rs +++ /dev/null @@ -1,58 +0,0 @@ -use serde::{Deserialize, Serialize}; -use wasm_bindgen::prelude::*; -use as3_parser::ns::*; - -#[derive(Serialize, Deserialize)] -struct ParserResult { - program: Option>, - mxml: Option>, - css: Option>, - diagnostics: Vec, -} - -#[derive(Serialize, Deserialize)] -struct ParserDiagnosticResult { - warning: bool, - column1: usize, - column2: usize, - line1: usize, - line2: usize, - message: String, -} - -#[wasm_bindgen] -pub fn parse(input: &str, source_type: &str) -> String { - let compilation_unit = CompilationUnit::new(None, input.to_owned()); - - let mut program: Option> = None; - let mut mxml: Option> = None; - let mut css: Option> = None; - - let source_type = source_type.to_lowercase(); - - if source_type == "mxml" { - mxml = Some(ParserFacade(&compilation_unit, default()).parse_mxml()); - } else if source_type == "css" { - css = Some(CssParserFacade(&compilation_unit, default()).parse_document()); - } else { - program = Some(ParserFacade(&compilation_unit, default()).parse_program()); - } - let mut diagnostics = vec![]; - compilation_unit.sort_diagnostics(); - for diagnostic in compilation_unit.nested_diagnostics() { - diagnostics.push(ParserDiagnosticResult { - warning: diagnostic.is_warning(), - column1: diagnostic.location().first_column() + 1, - column2: diagnostic.location().last_column() + 1, - line1: diagnostic.location().first_line_number(), - line2: diagnostic.location().last_line_number(), - message: diagnostic.format_message_english(), - }); - } - serde_json::to_string_pretty(&ParserResult { - program, - mxml, - css, - diagnostics, - }).unwrap() -} \ No newline at end of file diff --git a/examples/asdoc/.gitignore b/examples/asdoc/.gitignore deleted file mode 100644 index ea8c4bf..0000000 --- a/examples/asdoc/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/target diff --git a/examples/asdoc/Cargo.toml b/examples/asdoc/Cargo.toml deleted file mode 100644 index d7c7409..0000000 --- a/examples/asdoc/Cargo.toml +++ /dev/null @@ -1,11 +0,0 @@ -[package] -name = "asdoc-example" -version = "0.1.0" -edition = "2021" - -[dependencies] -as3_parser = { path = "../../crates/parser", version = "1" } - -[[example]] -name = "asdoc" -path = "example.rs" \ No newline at end of file diff --git a/examples/asdoc/Example.as b/examples/asdoc/Example.as deleted file mode 100644 index d73fc3d..0000000 --- a/examples/asdoc/Example.as +++ /dev/null @@ -1,10 +0,0 @@ -package q1 { - public namespace q1ns - public class C1 { - /** - * @private - * Comment for q1.q1ns::x - */ - q1.q1ns var x - } -} \ No newline at end of file diff --git a/examples/asdoc/example.rs b/examples/asdoc/example.rs deleted file mode 100644 index 2e10ca1..0000000 --- a/examples/asdoc/example.rs +++ /dev/null @@ -1,61 +0,0 @@ -use std::env; -use as3_parser::ns::*; - -fn main() { - // Define source path - let source_path = env::current_dir().unwrap().join("Example.as").to_string_lossy().into_owned(); - - // Read source content - let source_content = include_str!("Example.as").to_owned(); - - // Create compilation unit - let compilation_unit = CompilationUnit::new(Some(source_path), source_content); - - // Parse program - let program = ParserFacade(&compilation_unit, default()).parse_program(); - visit_program(&program); - - // Report diagnostics - compilation_unit.sort_diagnostics(); - for diagnostic in compilation_unit.nested_diagnostics() { - println!("{}", diagnostic.format_english()); - } -} - -fn visit_program(program: &Rc) { - for package in program.packages.iter() { - for directive in package.block.directives.iter() { - // directive: Rc - - match directive.as_ref() { - Directive::ClassDefinition(defn) => { - visit_class(&defn); - }, - - _ => {}, - } - } - } -} - -fn visit_class(defn: &ClassDefinition) { - for directive in defn.block.directives.iter() { - if let Directive::VariableDefinition(defn) = directive.as_ref() { - // Print any found main body and @private tags - if let Some(asdoc) = &defn.asdoc { - print_asdoc(asdoc); - } - } - } -} - -fn print_asdoc(asdoc: &Rc) { - if let Some((text, loc)) = &asdoc.main_body { - println!("Found main body at {}:{}\n\n{}\n\n", loc.first_line_number(), loc.first_column() + 1, text); - } - for (tag, loc) in &asdoc.tags { - if matches!(tag, AsDocTag::Private) { - println!("Found @private tag at {}:{}\n\n", loc.first_line_number(), loc.first_column() + 1); - } - } -} \ No newline at end of file diff --git a/tests/parser/ASDoc.as b/tests/parser/ASDoc.as deleted file mode 100644 index c14a1cc..0000000 --- a/tests/parser/ASDoc.as +++ /dev/null @@ -1,24 +0,0 @@ -/** - * Main body. - * @copy C1#x - * @inheritDoc - * @see C1#x X description - */ -var x - -/** - * N1. - */ -[N1] -/** - * N2. Lorem - * ipsum. - */ -[N2] -var y - -/** - * @throws SyntaxError If a syntax error occurs. - */ -function m() { -} \ No newline at end of file diff --git a/tests/parser/ASDoc.diag b/tests/parser/ASDoc.diag deleted file mode 100644 index e69de29..0000000 diff --git a/tests/parser/ASDoc.tree b/tests/parser/ASDoc.tree deleted file mode 100644 index f8c14d8..0000000 --- a/tests/parser/ASDoc.tree +++ /dev/null @@ -1,235 +0,0 @@ -{ - "location": "7:1-24:2", - "packages": [], - "directives": [ - { - "VariableDefinition": { - "location": "7:1-7:6", - "asdoc": { - "location": "1:1-6:4", - "main_body": [ - "Main body.", - "2:4-2:14" - ], - "tags": [ - [ - { - "Copy": { - "base": { - "QualifiedIdentifier": { - "location": "3:10-3:12", - "attribute": false, - "qualifier": null, - "id": { - "Id": [ - "C1", - "3:10-3:12" - ] - } - } - }, - "instance_property": { - "location": "3:13-3:14", - "attribute": false, - "qualifier": null, - "id": { - "Id": [ - "x", - "3:13-3:14" - ] - } - } - } - }, - "3:4-3:14" - ], - [ - "InheritDoc", - "4:4-4:15" - ], - [ - { - "See": { - "reference": { - "base": { - "QualifiedIdentifier": { - "location": "5:9-5:11", - "attribute": false, - "qualifier": null, - "id": { - "Id": [ - "C1", - "5:9-5:11" - ] - } - } - }, - "instance_property": { - "location": "5:12-5:13", - "attribute": false, - "qualifier": null, - "id": { - "Id": [ - "x", - "5:12-5:13" - ] - } - } - }, - "display_text": "X description" - } - }, - "5:4-5:27" - ] - ] - }, - "attributes": [], - "kind": [ - "Var", - "7:1-7:4" - ], - "bindings": [ - { - "destructuring": { - "location": "7:5-7:6", - "destructuring": { - "QualifiedIdentifier": { - "location": "7:5-7:6", - "attribute": false, - "qualifier": null, - "id": { - "Id": [ - "x", - "7:5-7:6" - ] - } - } - }, - "type_annotation": null - }, - "initializer": null - } - ] - } - }, - { - "VariableDefinition": { - "location": "12:1-18:6", - "asdoc": { - "location": "13:1-16:4", - "main_body": [ - "N2. Lorem\nipsum.", - "14:4-15:10" - ], - "tags": [] - }, - "attributes": [ - { - "Metadata": { - "location": "12:2-12:4", - "asdoc": null, - "name": [ - "N1", - "12:2-12:4" - ], - "entries": null - } - }, - { - "Metadata": { - "location": "17:2-17:4", - "asdoc": null, - "name": [ - "N2", - "17:2-17:4" - ], - "entries": null - } - } - ], - "kind": [ - "Var", - "18:1-18:4" - ], - "bindings": [ - { - "destructuring": { - "location": "18:5-18:6", - "destructuring": { - "QualifiedIdentifier": { - "location": "18:5-18:6", - "attribute": false, - "qualifier": null, - "id": { - "Id": [ - "y", - "18:5-18:6" - ] - } - } - }, - "type_annotation": null - }, - "initializer": null - } - ] - } - }, - { - "FunctionDefinition": { - "location": "23:1-24:2", - "asdoc": { - "location": "20:1-22:4", - "main_body": null, - "tags": [ - [ - { - "Throws": { - "class_reference": { - "QualifiedIdentifier": { - "location": "21:12-21:23", - "attribute": false, - "qualifier": null, - "id": { - "Id": [ - "SyntaxError", - "21:12-21:23" - ] - } - } - }, - "description": "If a syntax error occurs." - } - }, - "21:4-21:49" - ] - ] - }, - "attributes": [], - "name": { - "Identifier": [ - "m", - "23:10-23:11" - ] - }, - "common": { - "location": "23:11-24:2", - "contains_yield": false, - "contains_await": false, - "signature": { - "location": "23:11-23:13", - "parameters": [], - "result_type": null - }, - "body": { - "Block": { - "location": "23:14-24:2", - "metadata": null, - "directives": [] - } - } - } - } - } - ] -} \ No newline at end of file diff --git a/tests/parser/Attributes.as b/tests/parser/Attributes.as deleted file mode 100644 index 96fc965..0000000 --- a/tests/parser/Attributes.as +++ /dev/null @@ -1,17 +0,0 @@ -q.x var y - -[N1] internal var z - -[N1(x = "y")] {} - -dynamic final class C1 {} - -/** - * Foo - */ -[N1] -/** - * @eventType FooEvent.FOO - */ -[Event(name = "foo", type = "FooEvent")] -class C1 {} \ No newline at end of file diff --git a/tests/parser/Attributes.diag b/tests/parser/Attributes.diag deleted file mode 100644 index e69de29..0000000 diff --git a/tests/parser/Attributes.tree b/tests/parser/Attributes.tree deleted file mode 100644 index ee105c8..0000000 --- a/tests/parser/Attributes.tree +++ /dev/null @@ -1,293 +0,0 @@ -{ - "location": "5:1-17:12", - "packages": [], - "directives": [ - { - "VariableDefinition": { - "location": "1:1-1:10", - "asdoc": null, - "attributes": [ - { - "Expression": { - "Member": { - "location": "1:1-1:4", - "base": { - "QualifiedIdentifier": { - "location": "1:1-1:2", - "attribute": false, - "qualifier": null, - "id": { - "Id": [ - "q", - "1:1-1:2" - ] - } - } - }, - "identifier": { - "location": "1:3-1:4", - "attribute": false, - "qualifier": null, - "id": { - "Id": [ - "x", - "1:3-1:4" - ] - } - } - } - } - } - ], - "kind": [ - "Var", - "1:5-1:8" - ], - "bindings": [ - { - "destructuring": { - "location": "1:9-1:10", - "destructuring": { - "QualifiedIdentifier": { - "location": "1:9-1:10", - "attribute": false, - "qualifier": null, - "id": { - "Id": [ - "y", - "1:9-1:10" - ] - } - } - }, - "type_annotation": null - }, - "initializer": null - } - ] - } - }, - { - "VariableDefinition": { - "location": "3:1-3:20", - "asdoc": null, - "attributes": [ - { - "Metadata": { - "location": "3:2-3:4", - "asdoc": null, - "name": [ - "N1", - "3:2-3:4" - ], - "entries": null - } - }, - { - "Internal": "3:6-3:14" - } - ], - "kind": [ - "Var", - "3:15-3:18" - ], - "bindings": [ - { - "destructuring": { - "location": "3:19-3:20", - "destructuring": { - "QualifiedIdentifier": { - "location": "3:19-3:20", - "attribute": false, - "qualifier": null, - "id": { - "Id": [ - "z", - "3:19-3:20" - ] - } - } - }, - "type_annotation": null - }, - "initializer": null - } - ] - } - }, - { - "Block": { - "location": "5:15-5:17", - "metadata": [ - { - "Metadata": { - "location": "5:2-5:13", - "asdoc": null, - "name": [ - "N1", - "5:2-5:4" - ], - "entries": [ - { - "location": "5:5-5:12", - "key": [ - "x", - "5:5-5:6" - ], - "value": { - "String": [ - "y", - "5:9-5:12" - ] - } - } - ] - } - } - ], - "directives": [] - } - }, - { - "ClassDefinition": { - "location": "7:1-7:26", - "asdoc": null, - "attributes": [ - { - "Dynamic": "7:1-7:8" - }, - { - "Final": "7:9-7:14" - } - ], - "name": [ - "C1", - "7:21-7:23" - ], - "type_parameters": null, - "extends_clause": null, - "implements_clause": null, - "block": { - "location": "7:24-7:26", - "metadata": null, - "directives": [] - } - } - }, - { - "ClassDefinition": { - "location": "12:1-17:12", - "asdoc": { - "location": "9:1-11:4", - "main_body": [ - "Foo", - "10:4-10:7" - ], - "tags": [] - }, - "attributes": [ - { - "Metadata": { - "location": "12:2-12:4", - "asdoc": null, - "name": [ - "N1", - "12:2-12:4" - ], - "entries": null - } - }, - { - "Metadata": { - "location": "16:2-16:40", - "asdoc": { - "location": "13:1-15:4", - "main_body": null, - "tags": [ - [ - { - "EventType": { - "Member": { - "location": "14:15-14:27", - "base": { - "QualifiedIdentifier": { - "location": "14:15-14:23", - "attribute": false, - "qualifier": null, - "id": { - "Id": [ - "FooEvent", - "14:15-14:23" - ] - } - } - }, - "identifier": { - "location": "14:24-14:27", - "attribute": false, - "qualifier": null, - "id": { - "Id": [ - "FOO", - "14:24-14:27" - ] - } - } - } - } - }, - "14:4-14:27" - ] - ] - }, - "name": [ - "Event", - "16:2-16:7" - ], - "entries": [ - { - "location": "16:8-16:20", - "key": [ - "name", - "16:8-16:12" - ], - "value": { - "String": [ - "foo", - "16:15-16:20" - ] - } - }, - { - "location": "16:22-16:39", - "key": [ - "type", - "16:22-16:26" - ], - "value": { - "String": [ - "FooEvent", - "16:29-16:39" - ] - } - } - ] - } - } - ], - "name": [ - "C1", - "17:7-17:9" - ], - "type_parameters": null, - "extends_clause": null, - "implements_clause": null, - "block": { - "location": "17:10-17:12", - "metadata": null, - "directives": [] - } - } - } - ] -} \ No newline at end of file diff --git a/tests/parser/Configuration.as b/tests/parser/Configuration.as deleted file mode 100644 index 38d8419..0000000 --- a/tests/parser/Configuration.as +++ /dev/null @@ -1,21 +0,0 @@ -package foo.bar { - /** - * Comment 1 (overriden by the "Communication facility" comment). - */ - CONFIG::DEBUG - /** - * Communication facility. - */ - [Adherence(type = "efficient")] - /** - * Dispatched when a message is received. - */ - [Event(name = "received", type = "foo.bar.MessageEvent")] - public class CommunicationCenter extends EventDispatcher { - CONFIG::DEBUG { - protected var x: T1, y: T2, z: T3; - protected function f1(): void {} - } - CONFIG::RELEASE protected var w: T4; - } -} \ No newline at end of file diff --git a/tests/parser/Configuration.diag b/tests/parser/Configuration.diag deleted file mode 100644 index e69de29..0000000 diff --git a/tests/parser/Configuration.tree b/tests/parser/Configuration.tree deleted file mode 100644 index f9cdbf8..0000000 --- a/tests/parser/Configuration.tree +++ /dev/null @@ -1,386 +0,0 @@ -{ - "location": "5:5-21:2", - "packages": [ - { - "location": "5:5-21:2", - "asdoc": null, - "name": [ - [ - "foo", - "1:9-1:12" - ], - [ - "bar", - "1:13-1:16" - ] - ], - "block": { - "location": "5:5-21:2", - "metadata": null, - "directives": [ - { - "NormalConfigurationDirective": { - "location": "14:62-20:6", - "namespace": [ - "CONFIG", - "5:5-5:11" - ], - "constant_name": [ - "DEBUG", - "5:13-5:18" - ], - "directive": { - "ClassDefinition": { - "location": "15:9-20:6", - "asdoc": { - "location": "6:5-8:8", - "main_body": [ - "Communication facility.", - "7:8-7:31" - ], - "tags": [] - }, - "attributes": [ - { - "Metadata": { - "location": "9:6-9:35", - "asdoc": null, - "name": [ - "Adherence", - "9:6-9:15" - ], - "entries": [ - { - "location": "9:16-9:34", - "key": [ - "type", - "9:16-9:20" - ], - "value": { - "String": [ - "efficient", - "9:23-9:34" - ] - } - } - ] - } - }, - { - "Metadata": { - "location": "13:6-13:61", - "asdoc": { - "location": "10:5-12:8", - "main_body": [ - "Dispatched when a message is received.", - "11:8-11:46" - ], - "tags": [] - }, - "name": [ - "Event", - "13:6-13:11" - ], - "entries": [ - { - "location": "13:12-13:29", - "key": [ - "name", - "13:12-13:16" - ], - "value": { - "String": [ - "received", - "13:19-13:29" - ] - } - }, - { - "location": "13:31-13:60", - "key": [ - "type", - "13:31-13:35" - ], - "value": { - "String": [ - "foo.bar.MessageEvent", - "13:38-13:60" - ] - } - } - ] - } - }, - { - "Public": "14:5-14:11" - } - ], - "name": [ - "CommunicationCenter", - "14:18-14:37" - ], - "type_parameters": null, - "extends_clause": { - "QualifiedIdentifier": { - "location": "14:46-14:61", - "attribute": false, - "qualifier": null, - "id": { - "Id": [ - "EventDispatcher", - "14:46-14:61" - ] - } - } - }, - "implements_clause": null, - "block": { - "location": "19:9-20:6", - "metadata": null, - "directives": [ - { - "NormalConfigurationDirective": { - "location": "15:9-18:10", - "namespace": [ - "CONFIG", - "15:9-15:15" - ], - "constant_name": [ - "DEBUG", - "15:17-15:22" - ], - "directive": { - "Block": { - "location": "15:23-18:10", - "metadata": null, - "directives": [ - { - "VariableDefinition": { - "location": "16:23-16:47", - "asdoc": null, - "attributes": [ - { - "Protected": "16:13-16:22" - } - ], - "kind": [ - "Var", - "16:23-16:26" - ], - "bindings": [ - { - "destructuring": { - "location": "16:27-16:32", - "destructuring": { - "QualifiedIdentifier": { - "location": "16:27-16:28", - "attribute": false, - "qualifier": null, - "id": { - "Id": [ - "x", - "16:27-16:28" - ] - } - } - }, - "type_annotation": { - "QualifiedIdentifier": { - "location": "16:30-16:32", - "attribute": false, - "qualifier": null, - "id": { - "Id": [ - "T1", - "16:30-16:32" - ] - } - } - } - }, - "initializer": null - }, - { - "destructuring": { - "location": "16:34-16:39", - "destructuring": { - "QualifiedIdentifier": { - "location": "16:34-16:35", - "attribute": false, - "qualifier": null, - "id": { - "Id": [ - "y", - "16:34-16:35" - ] - } - } - }, - "type_annotation": { - "QualifiedIdentifier": { - "location": "16:37-16:39", - "attribute": false, - "qualifier": null, - "id": { - "Id": [ - "T2", - "16:37-16:39" - ] - } - } - } - }, - "initializer": null - }, - { - "destructuring": { - "location": "16:41-16:46", - "destructuring": { - "QualifiedIdentifier": { - "location": "16:41-16:42", - "attribute": false, - "qualifier": null, - "id": { - "Id": [ - "z", - "16:41-16:42" - ] - } - } - }, - "type_annotation": { - "QualifiedIdentifier": { - "location": "16:44-16:46", - "attribute": false, - "qualifier": null, - "id": { - "Id": [ - "T3", - "16:44-16:46" - ] - } - } - } - }, - "initializer": null - } - ] - } - }, - { - "FunctionDefinition": { - "location": "17:23-17:45", - "asdoc": null, - "attributes": [ - { - "Protected": "17:13-17:22" - } - ], - "name": { - "Identifier": [ - "f1", - "17:32-17:34" - ] - }, - "common": { - "location": "17:34-17:45", - "contains_yield": false, - "contains_await": false, - "signature": { - "location": "17:34-17:42", - "parameters": [], - "result_type": { - "VoidType": { - "location": "17:38-17:42" - } - } - }, - "body": { - "Block": { - "location": "17:43-17:45", - "metadata": null, - "directives": [] - } - } - } - } - } - ] - } - } - } - }, - { - "NormalConfigurationDirective": { - "location": "19:9-19:45", - "namespace": [ - "CONFIG", - "19:9-19:15" - ], - "constant_name": [ - "RELEASE", - "19:17-19:24" - ], - "directive": { - "VariableDefinition": { - "location": "19:9-19:45", - "asdoc": null, - "attributes": [ - { - "Protected": "19:25-19:34" - } - ], - "kind": [ - "Var", - "19:35-19:38" - ], - "bindings": [ - { - "destructuring": { - "location": "19:39-19:44", - "destructuring": { - "QualifiedIdentifier": { - "location": "19:39-19:40", - "attribute": false, - "qualifier": null, - "id": { - "Id": [ - "w", - "19:39-19:40" - ] - } - } - }, - "type_annotation": { - "QualifiedIdentifier": { - "location": "19:42-19:44", - "attribute": false, - "qualifier": null, - "id": { - "Id": [ - "T4", - "19:42-19:44" - ] - } - } - } - }, - "initializer": null - } - ] - } - } - } - } - ] - } - } - } - } - } - ] - } - } - ], - "directives": [] -} \ No newline at end of file diff --git a/tests/parser/E4X.as b/tests/parser/E4X.as deleted file mode 100644 index fb18845..0000000 --- a/tests/parser/E4X.as +++ /dev/null @@ -1,18 +0,0 @@ -default xml namespace = myxmlns; - - ; - ; - ; - - - - - - Lorem ipsum - Lorem ipsum - {c} - - .(filterCondition) - ..d; - -<>; \ No newline at end of file diff --git a/tests/parser/E4X.diag b/tests/parser/E4X.diag deleted file mode 100644 index e69de29..0000000 diff --git a/tests/parser/E4X.tree b/tests/parser/E4X.tree deleted file mode 100644 index 44f7a88..0000000 --- a/tests/parser/E4X.tree +++ /dev/null @@ -1,324 +0,0 @@ -{ - "location": "1:1-18:7", - "packages": [], - "directives": [ - { - "DefaultXmlNamespaceStatement": { - "location": "1:1-1:33", - "right": { - "QualifiedIdentifier": { - "location": "1:25-1:32", - "attribute": false, - "qualifier": null, - "id": { - "Id": [ - "myxmlns", - "1:25-1:32" - ] - } - } - } - } - }, - { - "ExpressionStatement": { - "location": "3:1-3:19", - "expression": { - "XmlMarkup": { - "location": "3:1-3:17", - "markup": "" - } - } - } - }, - { - "ExpressionStatement": { - "location": "4:1-4:8", - "expression": { - "XmlMarkup": { - "location": "4:1-4:6", - "markup": "" - } - } - } - }, - { - "ExpressionStatement": { - "location": "5:1-5:27", - "expression": { - "XmlMarkup": { - "location": "5:1-5:25", - "markup": "" - } - } - } - }, - { - "ExpressionStatement": { - "location": "6:1-16:9", - "expression": { - "Descendants": { - "location": "6:1-16:8", - "base": { - "Filter": { - "location": "6:1-15:23", - "base": { - "Xml": { - "location": "6:1-14:5", - "element": { - "location": "6:1-14:5", - "name": { - "Name": [ - "t", - "6:2-6:3" - ] - }, - "attributes": [], - "attribute_expression": null, - "content": [ - { - "Characters": [ - "\r\n ", - "6:4-7:5" - ] - }, - { - "Element": { - "location": "7:6-7:9", - "name": { - "Name": [ - "t", - "7:6-7:7" - ] - }, - "attributes": [], - "attribute_expression": null, - "content": null, - "closing_name": null - } - }, - { - "Characters": [ - "\r\n ", - "7:9-8:5" - ] - }, - { - "Element": { - "location": "8:6-8:13", - "name": { - "Name": [ - "t", - "8:6-8:7" - ] - }, - "attributes": [], - "attribute_expression": { - "QualifiedIdentifier": { - "location": "8:9-8:10", - "attribute": false, - "qualifier": null, - "id": { - "Id": [ - "c", - "8:9-8:10" - ] - } - } - }, - "content": null, - "closing_name": null - } - }, - { - "Characters": [ - "\r\n ", - "8:13-9:5" - ] - }, - { - "Element": { - "location": "9:6-9:15", - "name": { - "Name": [ - "t", - "9:6-9:7" - ] - }, - "attributes": [ - { - "location": "9:8-9:13", - "name": [ - "k", - "9:8-9:9" - ], - "value": { - "Value": [ - "v", - "9:10-9:13" - ] - } - } - ], - "attribute_expression": null, - "content": null, - "closing_name": null - } - }, - { - "Characters": [ - "\r\n ", - "9:15-10:5" - ] - }, - { - "Element": { - "location": "10:6-10:15", - "name": { - "Name": [ - "t", - "10:6-10:7" - ] - }, - "attributes": [ - { - "location": "10:8-10:13", - "name": [ - "k", - "10:8-10:9" - ], - "value": { - "Expression": { - "QualifiedIdentifier": { - "location": "10:11-10:12", - "attribute": false, - "qualifier": null, - "id": { - "Id": [ - "v", - "10:11-10:12" - ] - } - } - } - } - } - ], - "attribute_expression": null, - "content": null, - "closing_name": null - } - }, - { - "Characters": [ - "\r\n Lorem ipsum\r\n ", - "10:15-12:5" - ] - }, - { - "Element": { - "location": "12:6-12:23", - "name": { - "Name": [ - "t", - "12:6-12:7" - ] - }, - "attributes": [], - "attribute_expression": null, - "content": [ - { - "Characters": [ - "Lorem ipsum", - "12:8-12:19" - ] - } - ], - "closing_name": { - "Name": [ - "t", - "12:21-12:22" - ] - } - } - }, - { - "Characters": [ - "\r\n ", - "12:23-13:5" - ] - }, - { - "Expression": { - "QualifiedIdentifier": { - "location": "13:6-13:7", - "attribute": false, - "qualifier": null, - "id": { - "Id": [ - "c", - "13:6-13:7" - ] - } - } - } - }, - { - "Characters": [ - "\r\n", - "13:8-14:1" - ] - } - ], - "closing_name": { - "Name": [ - "t", - "14:3-14:4" - ] - } - } - } - }, - "test": { - "QualifiedIdentifier": { - "location": "15:7-15:22", - "attribute": false, - "qualifier": null, - "id": { - "Id": [ - "filterCondition", - "15:7-15:22" - ] - } - } - } - } - }, - "identifier": { - "location": "16:7-16:8", - "attribute": false, - "qualifier": null, - "id": { - "Id": [ - "d", - "16:7-16:8" - ] - } - } - } - } - } - }, - { - "ExpressionStatement": { - "location": "18:1-18:7", - "expression": { - "XmlList": { - "location": "18:1-18:6", - "content": [] - } - } - } - } - ] -} \ No newline at end of file diff --git a/tests/parser/MXML1.diag b/tests/parser/MXML1.diag deleted file mode 100644 index e69de29..0000000 diff --git a/tests/parser/MXML1.mxml b/tests/parser/MXML1.mxml deleted file mode 100644 index 5d922ab..0000000 --- a/tests/parser/MXML1.mxml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/tests/parser/MXML1.tree b/tests/parser/MXML1.tree deleted file mode 100644 index d8eebd2..0000000 --- a/tests/parser/MXML1.tree +++ /dev/null @@ -1,215 +0,0 @@ -{ - "location": "1:1-16:17", - "version": "Version10", - "encoding": "utf-8", - "content": [ - { - "ProcessingInstruction": { - "location": "1:1-1:22", - "name": "xml", - "data": " version=\"1.0\"" - } - }, - { - "Comment": [ - "", - "2:1-2:37" - ] - }, - { - "Element": { - "location": "3:2-16:17", - "name": { - "location": "3:2-3:15", - "prefix": "s", - "name": "Application" - }, - "attributes": [ - { - "location": "3:16-3:56", - "xmlns": true, - "name": { - "location": "3:16-3:24", - "prefix": "xmlns", - "name": "fx" - }, - "value": [ - "http://ns.adobe.com/mxml/2009", - "3:25-3:56" - ] - }, - { - "location": "4:5-4:48", - "xmlns": true, - "name": { - "location": "4:5-4:12", - "prefix": "xmlns", - "name": "s" - }, - "value": [ - "library://ns.adobe.com/flex/spark", - "4:13-4:48" - ] - }, - { - "location": "5:5-5:46", - "xmlns": true, - "name": { - "location": "5:5-5:13", - "prefix": "xmlns", - "name": "mx" - }, - "value": [ - "library://ns.adobe.com/flex/mx", - "5:14-5:46" - ] - } - ], - "content": [ - { - "Element": { - "location": "6:6-8:16", - "name": { - "location": "6:6-6:14", - "prefix": "s", - "name": "layout" - }, - "attributes": [], - "content": [ - { - "Element": { - "location": "7:10-7:28", - "name": { - "location": "7:10-7:26", - "prefix": "s", - "name": "VerticalLayout" - }, - "attributes": [], - "content": null, - "closing_name": null - } - } - ], - "closing_name": { - "location": "8:7-8:15", - "prefix": "s", - "name": "layout" - } - } - }, - { - "Element": { - "location": "9:6-14:65", - "name": { - "location": "9:6-9:14", - "prefix": "s", - "name": "Button" - }, - "attributes": [ - { - "location": "10:9-10:21", - "xmlns": false, - "name": { - "location": "10:9-10:11", - "prefix": null, - "name": "id" - }, - "value": [ - "button1", - "10:12-10:21" - ] - }, - { - "location": "11:9-11:28", - "xmlns": false, - "name": { - "location": "11:9-11:14", - "prefix": null, - "name": "label" - }, - "value": [ - "Click here!", - "11:15-11:28" - ] - }, - { - "location": "12:9-12:20", - "xmlns": false, - "name": { - "location": "12:9-12:14", - "prefix": null, - "name": "width" - }, - "value": [ - "100", - "12:15-12:20" - ] - }, - { - "location": "13:9-13:22", - "xmlns": false, - "name": { - "location": "13:9-13:17", - "prefix": null, - "name": "fontSize" - }, - "value": [ - "12", - "13:18-13:22" - ] - }, - { - "location": "14:9-14:63", - "xmlns": false, - "name": { - "location": "14:9-14:14", - "prefix": null, - "name": "click" - }, - "value": [ - "text1.text='&& Thanks for the click!';", - "14:15-14:63" - ] - } - ], - "content": null, - "closing_name": null - } - }, - { - "Element": { - "location": "15:6-15:29", - "name": { - "location": "15:6-15:16", - "prefix": "s", - "name": "TextArea" - }, - "attributes": [ - { - "location": "15:17-15:27", - "xmlns": false, - "name": { - "location": "15:17-15:19", - "prefix": null, - "name": "id" - }, - "value": [ - "text1", - "15:20-15:27" - ] - } - ], - "content": null, - "closing_name": null - } - } - ], - "closing_name": { - "location": "16:3-16:16", - "prefix": "s", - "name": "Application" - } - } - } - ] -} \ No newline at end of file diff --git a/tests/parser/MXML2.diag b/tests/parser/MXML2.diag deleted file mode 100644 index e69de29..0000000 diff --git a/tests/parser/MXML2.mxml b/tests/parser/MXML2.mxml deleted file mode 100644 index 5c28b9b..0000000 --- a/tests/parser/MXML2.mxml +++ /dev/null @@ -1,4 +0,0 @@ - - - & Text & - \ No newline at end of file diff --git a/tests/parser/MXML2.tree b/tests/parser/MXML2.tree deleted file mode 100644 index 5eb2621..0000000 --- a/tests/parser/MXML2.tree +++ /dev/null @@ -1,38 +0,0 @@ -{ - "location": "1:1-4:11", - "version": "Version10", - "encoding": "utf-8", - "content": [ - { - "ProcessingInstruction": { - "location": "1:1-1:22", - "name": "xml", - "data": " version=\"1.0\"" - } - }, - { - "Element": { - "location": "2:2-4:11", - "name": { - "location": "2:2-2:9", - "prefix": null, - "name": "invalid" - }, - "attributes": [], - "content": [ - { - "Characters": [ - "\r\n & Text &\r\n", - "2:10-4:1" - ] - } - ], - "closing_name": { - "location": "4:3-4:10", - "prefix": null, - "name": "invalid" - } - } - } - ] -} \ No newline at end of file diff --git a/tests/parser/Misc.as b/tests/parser/Misc.as deleted file mode 100644 index ba1c996..0000000 --- a/tests/parser/Misc.as +++ /dev/null @@ -1,19 +0,0 @@ -namespace ns1 -namespace ns2 = "http://www.samsung.com" - -new [] - -v is T -v is not T -v instanceof T -k in o -k not in o - -x ? y : z - -10 ; -10f ; - -/(?:)/gi ; - -/=/ \ No newline at end of file diff --git a/tests/parser/Misc.diag b/tests/parser/Misc.diag deleted file mode 100644 index e69de29..0000000 diff --git a/tests/parser/Misc.tree b/tests/parser/Misc.tree deleted file mode 100644 index 893b52e..0000000 --- a/tests/parser/Misc.tree +++ /dev/null @@ -1,341 +0,0 @@ -{ - "location": "10:1-19:4", - "packages": [], - "directives": [ - { - "NamespaceDefinition": { - "location": "1:1-1:14", - "asdoc": null, - "attributes": [], - "left": [ - "ns1", - "1:11-1:14" - ], - "right": null - } - }, - { - "NamespaceDefinition": { - "location": "2:1-2:41", - "asdoc": null, - "attributes": [], - "left": [ - "ns2", - "2:11-2:14" - ], - "right": { - "StringLiteral": { - "location": "2:17-2:41", - "value": "http://www.samsung.com" - } - } - } - }, - { - "ExpressionStatement": { - "location": "4:1-4:11", - "expression": { - "VectorLiteral": { - "location": "4:1-4:11", - "element_type": { - "QualifiedIdentifier": { - "location": "4:6-4:7", - "attribute": false, - "qualifier": null, - "id": { - "Id": [ - "T", - "4:6-4:7" - ] - } - } - }, - "elements": [] - } - } - } - }, - { - "ExpressionStatement": { - "location": "6:1-6:7", - "expression": { - "Binary": { - "location": "6:1-6:7", - "operator": "Is", - "left": { - "QualifiedIdentifier": { - "location": "6:1-6:2", - "attribute": false, - "qualifier": null, - "id": { - "Id": [ - "v", - "6:1-6:2" - ] - } - } - }, - "right": { - "QualifiedIdentifier": { - "location": "6:6-6:7", - "attribute": false, - "qualifier": null, - "id": { - "Id": [ - "T", - "6:6-6:7" - ] - } - } - } - } - } - } - }, - { - "ExpressionStatement": { - "location": "7:1-7:11", - "expression": { - "Binary": { - "location": "7:1-7:11", - "operator": "IsNot", - "left": { - "QualifiedIdentifier": { - "location": "7:1-7:2", - "attribute": false, - "qualifier": null, - "id": { - "Id": [ - "v", - "7:1-7:2" - ] - } - } - }, - "right": { - "QualifiedIdentifier": { - "location": "7:10-7:11", - "attribute": false, - "qualifier": null, - "id": { - "Id": [ - "T", - "7:10-7:11" - ] - } - } - } - } - } - } - }, - { - "ExpressionStatement": { - "location": "8:1-8:15", - "expression": { - "Binary": { - "location": "8:1-8:15", - "operator": "Instanceof", - "left": { - "QualifiedIdentifier": { - "location": "8:1-8:2", - "attribute": false, - "qualifier": null, - "id": { - "Id": [ - "v", - "8:1-8:2" - ] - } - } - }, - "right": { - "QualifiedIdentifier": { - "location": "8:14-8:15", - "attribute": false, - "qualifier": null, - "id": { - "Id": [ - "T", - "8:14-8:15" - ] - } - } - } - } - } - } - }, - { - "ExpressionStatement": { - "location": "9:1-9:7", - "expression": { - "Binary": { - "location": "9:1-9:7", - "operator": "In", - "left": { - "QualifiedIdentifier": { - "location": "9:1-9:2", - "attribute": false, - "qualifier": null, - "id": { - "Id": [ - "k", - "9:1-9:2" - ] - } - } - }, - "right": { - "QualifiedIdentifier": { - "location": "9:6-9:7", - "attribute": false, - "qualifier": null, - "id": { - "Id": [ - "o", - "9:6-9:7" - ] - } - } - } - } - } - } - }, - { - "ExpressionStatement": { - "location": "10:1-10:11", - "expression": { - "Binary": { - "location": "10:1-10:11", - "operator": "NotIn", - "left": { - "QualifiedIdentifier": { - "location": "10:1-10:2", - "attribute": false, - "qualifier": null, - "id": { - "Id": [ - "k", - "10:1-10:2" - ] - } - } - }, - "right": { - "QualifiedIdentifier": { - "location": "10:10-10:11", - "attribute": false, - "qualifier": null, - "id": { - "Id": [ - "o", - "10:10-10:11" - ] - } - } - } - } - } - } - }, - { - "ExpressionStatement": { - "location": "12:1-12:10", - "expression": { - "Conditional": { - "location": "12:1-12:10", - "test": { - "QualifiedIdentifier": { - "location": "12:1-12:2", - "attribute": false, - "qualifier": null, - "id": { - "Id": [ - "x", - "12:1-12:2" - ] - } - } - }, - "consequent": { - "QualifiedIdentifier": { - "location": "12:5-12:6", - "attribute": false, - "qualifier": null, - "id": { - "Id": [ - "y", - "12:5-12:6" - ] - } - } - }, - "alternative": { - "QualifiedIdentifier": { - "location": "12:9-12:10", - "attribute": false, - "qualifier": null, - "id": { - "Id": [ - "z", - "12:9-12:10" - ] - } - } - } - } - } - } - }, - { - "ExpressionStatement": { - "location": "14:1-14:6", - "expression": { - "NumericLiteral": { - "location": "14:1-14:3", - "value": "10", - "suffix": "None" - } - } - } - }, - { - "ExpressionStatement": { - "location": "15:1-15:7", - "expression": { - "NumericLiteral": { - "location": "15:1-15:4", - "value": "10", - "suffix": "F" - } - } - } - }, - { - "ExpressionStatement": { - "location": "17:1-17:12", - "expression": { - "RegExpLiteral": { - "location": "17:1-17:9", - "body": "(?:)", - "flags": "gi" - } - } - } - }, - { - "ExpressionStatement": { - "location": "19:1-19:4", - "expression": { - "RegExpLiteral": { - "location": "19:1-19:4", - "body": "=", - "flags": "" - } - } - } - } - ] -} \ No newline at end of file diff --git a/tests/parser/Qualifier.as b/tests/parser/Qualifier.as deleted file mode 100644 index 837c5ba..0000000 --- a/tests/parser/Qualifier.as +++ /dev/null @@ -1,9 +0,0 @@ -* -; (q)::x -o.* -o.public -o.public::x -o.(q)::x -o.q::x -o.q::[k] -o.@x; \ No newline at end of file diff --git a/tests/parser/Qualifier.diag b/tests/parser/Qualifier.diag deleted file mode 100644 index e69de29..0000000 diff --git a/tests/parser/Qualifier.tree b/tests/parser/Qualifier.tree deleted file mode 100644 index d38b679..0000000 --- a/tests/parser/Qualifier.tree +++ /dev/null @@ -1,351 +0,0 @@ -{ - "location": "1:1-9:6", - "packages": [], - "directives": [ - { - "ExpressionStatement": { - "location": "1:1-2:2", - "expression": { - "QualifiedIdentifier": { - "location": "1:1-1:2", - "attribute": false, - "qualifier": null, - "id": { - "Id": [ - "*", - "1:1-1:2" - ] - } - } - } - } - }, - { - "ExpressionStatement": { - "location": "2:3-2:9", - "expression": { - "QualifiedIdentifier": { - "location": "2:3-2:9", - "attribute": false, - "qualifier": { - "Paren": { - "location": "2:3-2:6", - "expression": { - "QualifiedIdentifier": { - "location": "2:4-2:5", - "attribute": false, - "qualifier": null, - "id": { - "Id": [ - "q", - "2:4-2:5" - ] - } - } - } - } - }, - "id": { - "Id": [ - "x", - "2:8-2:9" - ] - } - } - } - } - }, - { - "ExpressionStatement": { - "location": "3:1-3:4", - "expression": { - "Member": { - "location": "3:1-3:4", - "base": { - "QualifiedIdentifier": { - "location": "3:1-3:2", - "attribute": false, - "qualifier": null, - "id": { - "Id": [ - "o", - "3:1-3:2" - ] - } - } - }, - "identifier": { - "location": "3:3-3:4", - "attribute": false, - "qualifier": null, - "id": { - "Id": [ - "*", - "3:3-3:4" - ] - } - } - } - } - } - }, - { - "ExpressionStatement": { - "location": "4:1-4:9", - "expression": { - "Member": { - "location": "4:1-4:9", - "base": { - "QualifiedIdentifier": { - "location": "4:1-4:2", - "attribute": false, - "qualifier": null, - "id": { - "Id": [ - "o", - "4:1-4:2" - ] - } - } - }, - "identifier": { - "location": "4:3-4:9", - "attribute": false, - "qualifier": null, - "id": { - "Id": [ - "public", - "4:3-4:9" - ] - } - } - } - } - } - }, - { - "ExpressionStatement": { - "location": "5:1-5:12", - "expression": { - "Member": { - "location": "5:1-5:12", - "base": { - "QualifiedIdentifier": { - "location": "5:1-5:2", - "attribute": false, - "qualifier": null, - "id": { - "Id": [ - "o", - "5:1-5:2" - ] - } - } - }, - "identifier": { - "location": "5:3-5:12", - "attribute": false, - "qualifier": { - "ReservedNamespace": { - "Public": "5:3-5:9" - } - }, - "id": { - "Id": [ - "x", - "5:11-5:12" - ] - } - } - } - } - } - }, - { - "ExpressionStatement": { - "location": "6:1-6:9", - "expression": { - "Member": { - "location": "6:1-6:9", - "base": { - "QualifiedIdentifier": { - "location": "6:1-6:2", - "attribute": false, - "qualifier": null, - "id": { - "Id": [ - "o", - "6:1-6:2" - ] - } - } - }, - "identifier": { - "location": "6:3-6:9", - "attribute": false, - "qualifier": { - "Paren": { - "location": "6:3-6:4", - "expression": { - "QualifiedIdentifier": { - "location": "6:4-6:5", - "attribute": false, - "qualifier": null, - "id": { - "Id": [ - "q", - "6:4-6:5" - ] - } - } - } - } - }, - "id": { - "Id": [ - "x", - "6:8-6:9" - ] - } - } - } - } - } - }, - { - "ExpressionStatement": { - "location": "7:1-7:7", - "expression": { - "Member": { - "location": "7:1-7:7", - "base": { - "QualifiedIdentifier": { - "location": "7:1-7:2", - "attribute": false, - "qualifier": null, - "id": { - "Id": [ - "o", - "7:1-7:2" - ] - } - } - }, - "identifier": { - "location": "7:3-7:7", - "attribute": false, - "qualifier": { - "QualifiedIdentifier": { - "location": "7:3-7:4", - "attribute": false, - "qualifier": null, - "id": { - "Id": [ - "q", - "7:3-7:4" - ] - } - } - }, - "id": { - "Id": [ - "x", - "7:6-7:7" - ] - } - } - } - } - } - }, - { - "ExpressionStatement": { - "location": "8:1-8:9", - "expression": { - "Member": { - "location": "8:1-8:9", - "base": { - "QualifiedIdentifier": { - "location": "8:1-8:2", - "attribute": false, - "qualifier": null, - "id": { - "Id": [ - "o", - "8:1-8:2" - ] - } - } - }, - "identifier": { - "location": "8:3-8:9", - "attribute": false, - "qualifier": { - "QualifiedIdentifier": { - "location": "8:3-8:4", - "attribute": false, - "qualifier": null, - "id": { - "Id": [ - "q", - "8:3-8:4" - ] - } - } - }, - "id": { - "Brackets": { - "QualifiedIdentifier": { - "location": "8:7-8:8", - "attribute": false, - "qualifier": null, - "id": { - "Id": [ - "k", - "8:7-8:8" - ] - } - } - } - } - } - } - } - } - }, - { - "ExpressionStatement": { - "location": "9:1-9:6", - "expression": { - "Member": { - "location": "9:1-9:5", - "base": { - "QualifiedIdentifier": { - "location": "9:1-9:2", - "attribute": false, - "qualifier": null, - "id": { - "Id": [ - "o", - "9:1-9:2" - ] - } - } - }, - "identifier": { - "location": "9:3-9:5", - "attribute": true, - "qualifier": null, - "id": { - "Id": [ - "x", - "9:4-9:5" - ] - } - } - } - } - } - } - ] -} \ No newline at end of file diff --git a/tests/parser/README.md b/tests/parser/README.md deleted file mode 100644 index b09ad3d..0000000 --- a/tests/parser/README.md +++ /dev/null @@ -1,17 +0,0 @@ -# Parsing tests - -To test parsing a program producing output to the command line, run: - -``` -cargo run --bin as3_parser_test -- --source-path tests/parser/Demo.as -``` - -To test parsing a program producing output to two files `.ast.json` and `.diag`, run: - -``` -cargo run --bin as3_parser_test -- --source-path tests/parser/Demo.as --file-log -``` - -For parsing MXML, pass the `--mxml` flag. - -For parsing CSS, pass the `--css` flag. \ No newline at end of file diff --git a/tests/parser/Super.as b/tests/parser/Super.as deleted file mode 100644 index 817fde3..0000000 --- a/tests/parser/Super.as +++ /dev/null @@ -1,12 +0,0 @@ -super() // ERROR -class C2 extends C1 { - function C2() { - if (true) { - super() - } - } - override protected function m(): void { - super.m() - super(this).m() - } -} \ No newline at end of file diff --git a/tests/parser/Super.diag b/tests/parser/Super.diag deleted file mode 100644 index 1eac2e5..0000000 --- a/tests/parser/Super.diag +++ /dev/null @@ -1 +0,0 @@ -C:\Users\mathe\UnsyncDocuments\as3parser\tests\parser\Super.as:1:1: Syntax error #1036: 'super' not allowed here \ No newline at end of file diff --git a/tests/parser/Super.tree b/tests/parser/Super.tree deleted file mode 100644 index 24fa1b4..0000000 --- a/tests/parser/Super.tree +++ /dev/null @@ -1,215 +0,0 @@ -{ - "location": "1:1-12:2", - "packages": [], - "directives": [ - { - "SuperStatement": { - "location": "1:1-1:8", - "arguments": [] - } - }, - { - "ClassDefinition": { - "location": "2:1-12:2", - "asdoc": null, - "attributes": [], - "name": [ - "C2", - "2:7-2:9" - ], - "type_parameters": null, - "extends_clause": { - "QualifiedIdentifier": { - "location": "2:18-2:20", - "attribute": false, - "qualifier": null, - "id": { - "Id": [ - "C1", - "2:18-2:20" - ] - } - } - }, - "implements_clause": null, - "block": { - "location": "2:21-12:2", - "metadata": null, - "directives": [ - { - "FunctionDefinition": { - "location": "3:5-7:6", - "asdoc": null, - "attributes": [], - "name": { - "Constructor": [ - "C2", - "3:14-3:16" - ] - }, - "common": { - "location": "3:16-7:6", - "contains_yield": false, - "contains_await": false, - "signature": { - "location": "3:16-3:18", - "parameters": [], - "result_type": null - }, - "body": { - "Block": { - "location": "3:19-7:6", - "metadata": null, - "directives": [ - { - "IfStatement": { - "location": "4:9-6:10", - "test": { - "BooleanLiteral": { - "location": "4:13-4:17", - "value": true - } - }, - "consequent": { - "Block": { - "location": "4:19-6:10", - "metadata": null, - "directives": [ - { - "SuperStatement": { - "location": "5:13-5:20", - "arguments": [] - } - } - ] - } - }, - "alternative": null - } - } - ] - } - } - } - } - }, - { - "FunctionDefinition": { - "location": "8:5-11:6", - "asdoc": null, - "attributes": [ - { - "Override": "8:5-8:13" - }, - { - "Protected": "8:14-8:23" - } - ], - "name": { - "Identifier": [ - "m", - "8:33-8:34" - ] - }, - "common": { - "location": "8:34-11:6", - "contains_yield": false, - "contains_await": false, - "signature": { - "location": "8:34-8:42", - "parameters": [], - "result_type": { - "VoidType": { - "location": "8:38-8:42" - } - } - }, - "body": { - "Block": { - "location": "8:43-11:6", - "metadata": null, - "directives": [ - { - "ExpressionStatement": { - "location": "9:9-9:18", - "expression": { - "Call": { - "location": "9:9-9:18", - "base": { - "Member": { - "location": "9:9-9:16", - "base": { - "Super": { - "location": "9:9-9:14", - "object": null - } - }, - "identifier": { - "location": "9:15-9:16", - "attribute": false, - "qualifier": null, - "id": { - "Id": [ - "m", - "9:15-9:16" - ] - } - } - } - }, - "arguments": [] - } - } - } - }, - { - "ExpressionStatement": { - "location": "10:9-10:24", - "expression": { - "Call": { - "location": "10:9-10:24", - "base": { - "Member": { - "location": "10:9-10:22", - "base": { - "Super": { - "location": "10:9-10:20", - "object": [ - { - "ThisLiteral": { - "location": "10:15-10:19" - } - } - ] - } - }, - "identifier": { - "location": "10:21-10:22", - "attribute": false, - "qualifier": null, - "id": { - "Id": [ - "m", - "10:21-10:22" - ] - } - } - } - }, - "arguments": [] - } - } - } - } - ] - } - } - } - } - } - ] - } - } - } - ] -} \ No newline at end of file diff --git a/tests/parser/css/mediaQuery.css b/tests/parser/css/mediaQuery.css deleted file mode 100644 index 5e64391..0000000 --- a/tests/parser/css/mediaQuery.css +++ /dev/null @@ -1,5 +0,0 @@ -@media (application-dpi: 240) and (os-platform: "Windows"),,,,,,,,, { - .myStyleName1 { - fontSize: 30 - } -} \ No newline at end of file diff --git a/tests/parser/css/mediaQuery.diag b/tests/parser/css/mediaQuery.diag deleted file mode 100644 index e69de29..0000000 diff --git a/tests/parser/css/mediaQuery.tree b/tests/parser/css/mediaQuery.tree deleted file mode 100644 index 209ae54..0000000 --- a/tests/parser/css/mediaQuery.tree +++ /dev/null @@ -1,92 +0,0 @@ -{ - "location": "1:1-5:2", - "directives": [ - { - "MediaQuery": { - "location": "1:1-5:2", - "conditions": [ - { - "And": { - "location": "1:8-1:59", - "left": { - "ParenProperty": [ - { - "location": "1:9-1:29", - "name": [ - "applicationDpi", - "1:9-1:24" - ], - "value": { - "Number": { - "location": "1:26-1:29", - "value": 240.0, - "unit": null - } - } - }, - "1:8-1:30" - ] - }, - "right": { - "ParenProperty": [ - { - "location": "1:36-1:58", - "name": [ - "osPlatform", - "1:36-1:47" - ], - "value": { - "String": { - "location": "1:49-1:58", - "value": "Windows" - } - } - }, - "1:35-1:59" - ] - } - } - } - ], - "rules": [ - { - "location": "2:5-4:6", - "selectors": [ - { - "Base": { - "location": "2:5-2:18", - "namespace_prefix": null, - "element_name": null, - "conditions": [ - { - "Class": [ - "myStyleName1", - "2:5-2:18" - ] - } - ] - } - } - ], - "properties": [ - { - "location": "3:9-3:21", - "name": [ - "fontSize", - "3:9-3:17" - ], - "value": { - "Number": { - "location": "3:19-3:21", - "value": 30.0, - "unit": null - } - } - } - ] - } - ] - } - } - ] -} \ No newline at end of file diff --git a/tests/parser/css/selectors.css b/tests/parser/css/selectors.css deleted file mode 100644 index fb64f56..0000000 --- a/tests/parser/css/selectors.css +++ /dev/null @@ -1,9 +0,0 @@ -.myStyleName1.anotherOne s|VGroup, #id1 { - fontSize: 24 -} - -.myStyleName1[attr^="."] { - color: red -} - -#myId1 #myId2 #myId3 {} \ No newline at end of file diff --git a/tests/parser/css/selectors.diag b/tests/parser/css/selectors.diag deleted file mode 100644 index e69de29..0000000 diff --git a/tests/parser/css/selectors.tree b/tests/parser/css/selectors.tree deleted file mode 100644 index 143402b..0000000 --- a/tests/parser/css/selectors.tree +++ /dev/null @@ -1,200 +0,0 @@ -{ - "location": "1:1-9:24", - "directives": [ - { - "Rule": { - "location": "1:1-3:2", - "selectors": [ - { - "Combinator": { - "location": "1:1-1:34", - "left": { - "Base": { - "location": "1:1-1:25", - "namespace_prefix": null, - "element_name": null, - "conditions": [ - { - "Class": [ - "myStyleName1", - "1:1-1:14" - ] - }, - { - "Class": [ - "anotherOne", - "1:14-1:25" - ] - } - ] - } - }, - "right": { - "Base": { - "location": "1:26-1:34", - "namespace_prefix": [ - "s", - "1:26-1:27" - ], - "element_name": [ - "VGroup", - "1:28-1:34" - ], - "conditions": [] - } - }, - "combinator_type": "Descendant" - } - }, - { - "Base": { - "location": "1:36-1:40", - "namespace_prefix": null, - "element_name": null, - "conditions": [ - { - "Id": [ - "id1", - "1:36-1:40" - ] - } - ] - } - } - ], - "properties": [ - { - "location": "2:5-2:17", - "name": [ - "fontSize", - "2:5-2:13" - ], - "value": { - "Number": { - "location": "2:15-2:17", - "value": 24.0, - "unit": null - } - } - } - ] - } - }, - { - "Rule": { - "location": "5:1-7:2", - "selectors": [ - { - "Base": { - "location": "5:1-5:25", - "namespace_prefix": null, - "element_name": null, - "conditions": [ - { - "Class": [ - "myStyleName1", - "5:1-5:14" - ] - }, - { - "Attribute": { - "location": "5:14-5:25", - "name": [ - "attr", - "5:15-5:19" - ], - "operator": "BeginsWith", - "value": [ - ".", - "5:21-5:24" - ] - } - } - ] - } - } - ], - "properties": [ - { - "location": "6:5-6:15", - "name": [ - "color", - "6:5-6:10" - ], - "value": { - "Color": { - "location": "6:12-6:15", - "color_int": 16711680 - } - } - } - ] - } - }, - { - "Rule": { - "location": "9:1-9:24", - "selectors": [ - { - "Combinator": { - "location": "9:1-9:21", - "left": { - "Combinator": { - "location": "9:1-9:14", - "left": { - "Base": { - "location": "9:1-9:7", - "namespace_prefix": null, - "element_name": null, - "conditions": [ - { - "Id": [ - "myId1", - "9:1-9:7" - ] - } - ] - } - }, - "right": { - "Base": { - "location": "9:8-9:14", - "namespace_prefix": null, - "element_name": null, - "conditions": [ - { - "Id": [ - "myId2", - "9:8-9:14" - ] - } - ] - } - }, - "combinator_type": "Descendant" - } - }, - "right": { - "Base": { - "location": "9:15-9:21", - "namespace_prefix": null, - "element_name": null, - "conditions": [ - { - "Id": [ - "myId3", - "9:15-9:21" - ] - } - ] - } - }, - "combinator_type": "Descendant" - } - } - ], - "properties": [] - } - } - ] -} \ No newline at end of file