From 020bc1279c2a1ffef944f1d5c6a3dac79bc500b7 Mon Sep 17 00:00:00 2001 From: Hana Date: Thu, 22 Feb 2024 12:05:06 +0800 Subject: [PATCH] refactor: align configCases runner (#5620) chore: align configCases runner --- packages/rspack/jest.config.js | 1 + packages/rspack/src/rspack.ts | 20 +- packages/rspack/tests/ConfigCase.template.ts | 647 - .../rspack/tests/ConfigTestCases.basictest.js | 5 + .../rspack/tests/ConfigTestCases.template.js | 766 + packages/rspack/tests/TestCases.template.js | 543 + ...snap => ConfigTestCases.basictest.js.snap} | 134 +- packages/rspack/tests/configCase.test.ts | 5 - .../a.js => asset/data-url-condition/img.png} | 0 .../asset/data-url-condition/index.js | 9 +- .../asset/data-url-condition/large.png | Bin 78117 -> 0 bytes .../configCases/asset/issue#2283/img.png | Bin 78117 -> 0 bytes .../configCases/asset/issue#2283/index.js | 9 - .../b.js => asset/rspack-issue-2283/img.png} | 0 .../asset/rspack-issue-2283/index.js | 7 + .../webpack.config.js | 0 .../builtin-swc-loader/issue-4597/index.js | 3 +- .../issue-4597/node_modules/aaaaa/es/index.js | 2 +- .../react-refresh-false/webpack.config.js | 1 + .../react-runtime-automic/webpack.config.js | 1 + .../react-runtime-classic/webpack.config.js | 1 + .../builtin-swc-loader/source-map/index.js | 2 +- .../builtin-swc-loader/source-map/source.txt | 4 + .../source-map/webpack.config.js | 7 + .../styled-components/index.jsx | 2 - .../styled-components/webpack.config.js | 1 + .../builtins/banner/test.config.js | 5 + .../builtins/banner/webpack.config.js | 6 + .../configCases/builtins/css-auto/index.js | 2 +- .../builtins/html-entry-order/test.config.js | 5 + .../html-entry-order/webpack.config.js | 3 + .../configCases/builtins/html-inject/index.js | 14 +- .../builtins/html-public-path-auto/index.js | 2 +- .../html-public-path-auto/webpack.config.js | 6 +- .../html-with-output-public-path/index.js | 4 +- .../builtins/minify-ascii-only/test.config.js | 5 + .../minify-ascii-only/webpack.config.js | 3 + .../minify-comment-all/test.config.js | 5 + .../minify-comment-all/webpack.config.js | 3 + .../test.config.js | 5 + .../webpack.config.js | 3 + .../minify-comment-some/test.config.js | 5 + .../minify-comment-some/webpack.config.js | 3 + .../builtins/minify-exclude/test.config.js | 5 + .../builtins/minify-exclude/webpack.config.js | 3 + .../builtins/minify-extract-comments/index.js | 2 +- .../builtins/minify-include/test.config.js | 5 + .../builtins/minify-include/webpack.config.js | 3 + .../builtins/minify-test/test.config.js | 5 + .../builtins/minify-test/webpack.config.js | 3 + .../builtins/minify-with-boolean/index.js | 5 +- .../configCases/builtins/minify/index.js | 5 +- .../configCases/builtins/provide/index.js | 4 +- .../issue-3896/webpack.config.js | 1 + .../chunk-loading/issue-4754/test.config.js | 5 + .../issue-4754/webpack.config.js | 4 + .../startup-async-node-1/test.config.js | 5 + .../startup-async-node-2/test.config.js | 5 + .../startup-async-node-3/test.config.js | 5 + .../startup-require/test.config.js | 5 + .../rebuild-module/webpack.config.js | 32 +- .../1-container-full/webpack.config.js | 4 +- .../1-transitive-overriding/webpack.config.js | 2 +- .../2-container-full/webpack.config.js | 4 +- .../2-transitive-overriding/webpack.config.js | 2 +- .../3-container-full/webpack.config.js | 2 +- .../webpack.config.js | 2 +- .../css/rspack-issue-4844/index.js | 2 +- .../css/rspack-issue-4844/test.config.js | 5 + .../css/rspack-issue-4844/webpack.config.js | 3 + .../tests/configCases/css/urls/index.js | 2 +- .../configCases/css/urls/webpack.config.js | 6 +- .../entry/chunk-loading/webpack.config.js | 3 + .../entry/runtime-false/webpack.config.js | 3 + .../entry/runtime/webpack.config.js | 3 + .../rspack-issue-4504}/errors.js | 0 .../rspack-issue-4504}/index.js | 0 .../rspack-issue-4504}/webpack.config.js | 0 .../configCases/externals/custom-url/index.js | 2 +- .../index.js | 5 +- .../webpack.config.js | 9 +- .../externals/module/test.config.js | 5 + .../externals/module/webpack.config.js | 2 +- .../externals/node-module/test.config.js | 5 + .../externals/node-module/webpack.config.js | 2 +- .../after-process-assets/webpack.config.js | 2 +- .../hooks/asset-emitted/webpack.config.js | 5 +- .../hooks/check-asset/webpack.config.js | 2 +- .../configCases/hooks/create-module/index.js | 4 +- .../hooks/create-module/webpack.config.js | 18 +- .../index.js | 0 .../webpack.config.js | 5 +- .../index.css | 0 .../index.js | 12 +- .../webpack.config.js | 11 +- .../hooks/runtime-module/test.config.js | 5 + .../hooks/runtime-module/webpack.config.js | 3 + .../hooks/should-emit-2/webpack.config.js | 7 +- .../additional-data-async-fn/index.js | 2 +- .../less-loader/additional-data-fn/index.js | 2 +- .../additional-data-string/index.js | 2 +- .../less-loader/with-source-map/index.js | 15 +- .../with-source-map/webpack.config.js | 7 + .../library/amd-named/webpack.config.js | 9 +- .../library/amd-unnamed/webpack.config.js | 9 +- .../configCases/library/esm-external/index.js | 5 +- .../library/esm-external/webpack.config.js | 2 +- .../library/esmodule/webpack.config.js | 2 +- .../test.config.js | 5 + .../webpack.config.js | 1 + .../configCases/loader/context-path/index.js | 5 +- .../loader/context-resource/index.js | 5 +- .../configCases/loader/file-loader/index.js | 10 +- .../configCases/loader/file-loader/logo.png | Bin 10487 -> 0 bytes .../configCases/loader/loader-raw/index.js | 13 +- .../configCases/loader/loader-raw/logo.png | Bin 10487 -> 0 bytes .../loader/loader-raw/webpack.config.js | 2 +- .../loader/module-build-error/index.js | 17 +- .../configCases/loader/pitching/index.js | 6 +- .../loader/pitching/webpack.config.js | 9 +- .../index.js | 0 .../{issue-3418 => rspack-issue-3418}/lib.js | 0 .../loader.js | 0 .../webpack.config.js | 0 .../index.js | 0 .../webpack.config.js | 0 ...41\343\201\257\344\270\226\347\225\214.js" | 0 ...40\345\245\275\344\270\226\347\225\214.js" | 0 ...30\354\204\270\354\203\201\354\225\204.js" | 0 .../rspack-issue-4838/a.js} | 0 .../rspack-issue-4838/b.js} | 0 .../index.js | 0 .../node_modules/loader1.js | 0 .../webpack.config.js | 0 .../configCases/module/function-use/index.js | 4 +- .../configCases/module/match-all/img.svg | 0 .../configCases/module/match-all/index.js | 2 +- .../configCases/module/match-all/large.svg | 20255 ---------------- .../module/match-module-type/img.png | 0 .../module/match-module-type/img.svg | 0 .../module/match-module-type/index.js | 8 +- .../module/match-module-type/large.png | Bin 2719804 -> 0 bytes .../module/match-module-type/large.svg | 20255 ---------------- .../module/match-module-type/logo.png | Bin 729 -> 0 bytes .../module/match-module-type/logo.svg | 12 - .../tests/configCases/module/resolve/index.js | 5 +- .../dynamic.js | 0 .../index.js | 2 +- .../webpack.config.js | 0 .../answer.js | 0 .../index.js | 2 +- .../webpack.config.js | 4 +- .../index.js | 0 .../index.scss | 0 .../webpack.config.js | 0 .../index.js | 0 .../loader.js | 0 .../sub/a.js | 0 .../sub/b.js | 0 .../sub/c.js | 0 .../sub/d.js | 0 .../sub/e.js | 0 .../sub/f.js | 0 .../sub/g.js | 0 .../sub/h.js | 0 .../webpack.config.js | 0 .../dynamic.js | 0 .../index.js | 2 +- .../webpack.config.js | 0 .../index.js | 0 .../{issue-4784 => rspack-issue-4784}/m.js | 0 .../test.config.js | 0 .../webpack.config.js | 9 +- .../single-runtime/test.config.js | 5 + .../single-runtime/webpack.config.js | 2 +- .../output/chunk-filename/index.js | 13 +- .../output/chunk-filename/test.config.js | 5 + .../output/chunk-filename/webpack.config.js | 6 +- .../output/script-type/test.config.js | 5 + .../output/script-type/webpack.config.js | 2 +- .../output/source-map-filename/test.config.js | 5 + .../source-map-filename/webpack.config.js | 1 + .../plugins/internal-entrypoints/index.js | 2 +- .../index.js | 4 +- .../internal-processAssets/webpack.config.js | 4 +- .../plugins/minify-ascii-only/test.config.js | 5 + .../minify-ascii-only/webpack.config.js | 3 + .../plugins/minify-comment-all/test.config.js | 5 + .../minify-comment-all/webpack.config.js | 3 + .../minify-comment-some/test.config.js | 5 + .../minify-comment-some/webpack.config.js | 3 + .../test.config.js | 5 + .../webpack.config.js | 3 + .../minify-disabled-on-empty-array/index.js | 5 +- .../plugins/minify-exclude/test.config.js | 5 + .../plugins/minify-exclude/webpack.config.js | 3 + .../plugins/minify-extract-comments/index.js | 2 +- .../plugins/minify-module/webpack.config.js | 10 +- .../plugins/minify-test/test.config.js | 5 + .../plugins/minify-test/webpack.config.js | 3 + .../index.js | 0 .../webpack.config.js | 0 .../index.js | 0 .../webpack.config.js | 0 .../child.js | 0 .../index.js | 0 .../webpack.config.js | 2 +- .../index.js | 0 .../webpack.config.js | 0 .../index.js | 0 .../webpack.config.js | 0 .../index.js | 4 +- .../test.config.js | 5 + .../webpack.config.js | 3 + .../plugins/swc-js-minifier/index.js | 4 +- .../plugins/swc-js-minifier/test.config.js | 5 + .../plugins/swc-js-minifier/webpack.config.js | 5 +- .../postcss-loader/pxtorem/index.js | 5 +- .../with-previous-source-map/index.js | 9 +- .../webpack.config.js | 8 +- .../postcss-loader/with-source-map/index.js | 6 +- .../with-source-map/webpack.config.js | 8 +- .../configCases/sass/additional-data/index.js | 2 +- .../configCases/sass/import-alias/index.js | 2 +- .../sass/import-from-npm-org-pkg/index.js | 2 +- .../tests/configCases/sass/use-alias/index.js | 2 +- .../configCases/sass/with-source-map/index.js | 9 +- .../sass/with-source-map/webpack.config.js | 8 +- .../configCases/source-map/basic/index.js | 2 +- .../source-map/cheap-module/index.js | 4 +- .../configCases/source-map/cheap/index.js | 4 +- .../source-map/eval-only/webpack.config.js | 1 + .../configCases/source-map/hidden/index.js | 2 +- .../configCases/source-map/inline/index.js | 2 +- .../relative-source-map-path/index.js | 2 +- .../source-map/source-map/index.js | 2 +- .../source-map/source-map/webpack.config.js | 8 +- .../verify-bundle-css-minify/index.js | 8 +- .../source-map/verify-bundle-css/index.js | 8 +- .../source-map/verify-css-js-mix/index.js | 17 +- .../source-map/verify-es6-minify/index.js | 8 +- .../source-map/verify-es6/index.js | 8 +- .../webpack.config.js | 5 + .../chunks-function/test.config.js | 3 + .../chunks-function/webpack.config.js | 3 + .../split-chunks/css-simple/test.config.js | 3 + .../split-chunks/css-simple/webpack.config.js | 3 + .../webpack.config.js | 1 + .../webpack.config.js | 1 + .../custom-filename/webpack.config.js | 1 + .../test.config.js | 5 + .../test.config.js | 5 + .../test.config.js | 0 .../bar.js | 0 .../foo.js | 0 .../index.js | 0 .../test.config.js | 0 .../webpack.config.js | 0 .../src/another.js | 0 .../src/index.js | 0 .../src/shared.js | 0 .../rspack-issue-3646/test.config.js | 5 + .../webpack.config.js | 1 + .../chunk.js | 0 .../file-A2.js | 0 .../file-B2.js | 0 .../file-a1.js | 0 .../file-b1.js | 0 .../index.js | 0 .../test.config.js | 0 .../webpack.config.js | 0 .../src/index.js | 0 .../src/lib/a.js | 0 .../test.config.js | 0 .../webpack.config.js | 1 + .../test.config.js | 5 + .../split-chunks-dot-name/test.config.js | 3 + .../svg/different-module-by-loaders/index.js | 2 +- .../webpack.config.js | 1 + .../tree-shaking/new-url/webpack.config.js | 4 + .../tests/configCases/version/all/index.js | 6 +- .../tests/configCases/version/array/index.js | 6 +- .../source-map => lib/util}/checkSourceMap.js | 0 packages/rspack/tests/lib/util/filterUtil.js | 54 + packages/rspack/tests/lib/util/identifier.js | 377 + scripts/test/diff-exclude.cjs | 4 + webpack-test/ConfigTestCases.template.js | 960 +- webpack-test/TestCases.template.js | 49 +- webpack-test/helpers/warmup-webpack.js | 3 +- 289 files changed, 2979 insertions(+), 42002 deletions(-) delete mode 100644 packages/rspack/tests/ConfigCase.template.ts create mode 100644 packages/rspack/tests/ConfigTestCases.basictest.js create mode 100644 packages/rspack/tests/ConfigTestCases.template.js create mode 100644 packages/rspack/tests/TestCases.template.js rename packages/rspack/tests/__snapshots__/{configCase.test.ts.snap => ConfigTestCases.basictest.js.snap} (77%) delete mode 100644 packages/rspack/tests/configCase.test.ts rename packages/rspack/tests/configCases/{loader/issue-4838/a.js => asset/data-url-condition/img.png} (100%) delete mode 100644 packages/rspack/tests/configCases/asset/data-url-condition/large.png delete mode 100644 packages/rspack/tests/configCases/asset/issue#2283/img.png delete mode 100644 packages/rspack/tests/configCases/asset/issue#2283/index.js rename packages/rspack/tests/configCases/{loader/issue-4838/b.js => asset/rspack-issue-2283/img.png} (100%) create mode 100644 packages/rspack/tests/configCases/asset/rspack-issue-2283/index.js rename packages/rspack/tests/configCases/asset/{issue#2283 => rspack-issue-2283}/webpack.config.js (100%) create mode 100644 packages/rspack/tests/configCases/builtin-swc-loader/source-map/source.txt create mode 100644 packages/rspack/tests/configCases/builtins/banner/test.config.js create mode 100644 packages/rspack/tests/configCases/builtins/html-entry-order/test.config.js create mode 100644 packages/rspack/tests/configCases/builtins/minify-ascii-only/test.config.js create mode 100644 packages/rspack/tests/configCases/builtins/minify-comment-all/test.config.js create mode 100644 packages/rspack/tests/configCases/builtins/minify-comment-default-false/test.config.js create mode 100644 packages/rspack/tests/configCases/builtins/minify-comment-some/test.config.js create mode 100644 packages/rspack/tests/configCases/builtins/minify-exclude/test.config.js create mode 100644 packages/rspack/tests/configCases/builtins/minify-include/test.config.js create mode 100644 packages/rspack/tests/configCases/builtins/minify-test/test.config.js create mode 100644 packages/rspack/tests/configCases/chunk-loading/issue-4754/test.config.js create mode 100644 packages/rspack/tests/configCases/chunk-loading/startup-async-node-1/test.config.js create mode 100644 packages/rspack/tests/configCases/chunk-loading/startup-async-node-2/test.config.js create mode 100644 packages/rspack/tests/configCases/chunk-loading/startup-async-node-3/test.config.js create mode 100644 packages/rspack/tests/configCases/chunk-loading/startup-require/test.config.js create mode 100644 packages/rspack/tests/configCases/css/rspack-issue-4844/test.config.js rename packages/rspack/tests/configCases/{output/issue-4504 => errors/rspack-issue-4504}/errors.js (100%) rename packages/rspack/tests/configCases/{output/issue-4504 => errors/rspack-issue-4504}/index.js (100%) rename packages/rspack/tests/configCases/{output/issue-4504 => errors/rspack-issue-4504}/webpack.config.js (100%) create mode 100644 packages/rspack/tests/configCases/externals/module/test.config.js create mode 100644 packages/rspack/tests/configCases/externals/node-module/test.config.js rename packages/rspack/tests/configCases/hooks/{issue-4395 => rspack-issue-4395}/index.js (100%) rename packages/rspack/tests/configCases/hooks/{issue-4395 => rspack-issue-4395}/webpack.config.js (85%) rename packages/rspack/tests/configCases/hooks/{issue-5571 => rspack-issue-5571}/index.css (100%) rename packages/rspack/tests/configCases/hooks/{issue-5571 => rspack-issue-5571}/index.js (53%) rename packages/rspack/tests/configCases/hooks/{issue-5571 => rspack-issue-5571}/webpack.config.js (84%) create mode 100644 packages/rspack/tests/configCases/hooks/runtime-module/test.config.js create mode 100644 packages/rspack/tests/configCases/library/umd-named-define-runtime-chunk/test.config.js rename packages/rspack/tests/configCases/loader/{issue-3418 => rspack-issue-3418}/index.js (100%) rename packages/rspack/tests/configCases/loader/{issue-3418 => rspack-issue-3418}/lib.js (100%) rename packages/rspack/tests/configCases/loader/{issue-3418 => rspack-issue-3418}/loader.js (100%) rename packages/rspack/tests/configCases/loader/{issue-3418 => rspack-issue-3418}/webpack.config.js (100%) rename packages/rspack/tests/configCases/loader/{issue-4630 => rspack-issue-4630}/index.js (100%) rename packages/rspack/tests/configCases/loader/{issue-4630 => rspack-issue-4630}/webpack.config.js (100%) rename "packages/rspack/tests/configCases/loader/issue-4630/\343\201\223\343\202\223\343\201\253\343\201\241\343\201\257\344\270\226\347\225\214.js" => "packages/rspack/tests/configCases/loader/rspack-issue-4630/\343\201\223\343\202\223\343\201\253\343\201\241\343\201\257\344\270\226\347\225\214.js" (100%) rename "packages/rspack/tests/configCases/loader/issue-4630/\344\275\240\345\245\275\344\270\226\347\225\214.js" => "packages/rspack/tests/configCases/loader/rspack-issue-4630/\344\275\240\345\245\275\344\270\226\347\225\214.js" (100%) rename "packages/rspack/tests/configCases/loader/issue-4630/\353\260\230\352\260\221\352\265\254\353\202\230\354\204\270\354\203\201\354\225\204.js" => "packages/rspack/tests/configCases/loader/rspack-issue-4630/\353\260\230\352\260\221\352\265\254\353\202\230\354\204\270\354\203\201\354\225\204.js" (100%) rename packages/rspack/tests/configCases/{parsing/.gitkeep => loader/rspack-issue-4838/a.js} (100%) rename packages/rspack/tests/configCases/{umd/.gitkeep => loader/rspack-issue-4838/b.js} (100%) rename packages/rspack/tests/configCases/loader/{issue-4838 => rspack-issue-4838}/index.js (100%) rename packages/rspack/tests/configCases/loader/{issue-4838 => rspack-issue-4838}/node_modules/loader1.js (100%) rename packages/rspack/tests/configCases/loader/{issue-4838 => rspack-issue-4838}/webpack.config.js (100%) create mode 100644 packages/rspack/tests/configCases/module/match-all/img.svg delete mode 100644 packages/rspack/tests/configCases/module/match-all/large.svg create mode 100644 packages/rspack/tests/configCases/module/match-module-type/img.png create mode 100644 packages/rspack/tests/configCases/module/match-module-type/img.svg delete mode 100644 packages/rspack/tests/configCases/module/match-module-type/large.png delete mode 100644 packages/rspack/tests/configCases/module/match-module-type/large.svg delete mode 100644 packages/rspack/tests/configCases/module/match-module-type/logo.png delete mode 100644 packages/rspack/tests/configCases/module/match-module-type/logo.svg rename packages/rspack/tests/configCases/module/{issue-1652 => rspack-issue-1652}/dynamic.js (100%) rename packages/rspack/tests/configCases/module/{issue-5548 => rspack-issue-1652}/index.js (74%) rename packages/rspack/tests/configCases/module/{issue-1652 => rspack-issue-1652}/webpack.config.js (100%) rename packages/rspack/tests/configCases/module/{issue-2791 => rspack-issue-2791}/answer.js (100%) rename packages/rspack/tests/configCases/module/{issue-2791 => rspack-issue-2791}/index.js (90%) rename packages/rspack/tests/configCases/module/{issue-2791 => rspack-issue-2791}/webpack.config.js (72%) rename packages/rspack/tests/configCases/module/{issue-4224 => rspack-issue-4224}/index.js (100%) rename packages/rspack/tests/configCases/module/{issue-4224 => rspack-issue-4224}/index.scss (100%) rename packages/rspack/tests/configCases/module/{issue-4224 => rspack-issue-4224}/webpack.config.js (100%) rename packages/rspack/tests/configCases/module/{issue-4777 => rspack-issue-4777}/index.js (100%) rename packages/rspack/tests/configCases/module/{issue-4777 => rspack-issue-4777}/loader.js (100%) rename packages/rspack/tests/configCases/module/{issue-4777 => rspack-issue-4777}/sub/a.js (100%) rename packages/rspack/tests/configCases/module/{issue-4777 => rspack-issue-4777}/sub/b.js (100%) rename packages/rspack/tests/configCases/module/{issue-4777 => rspack-issue-4777}/sub/c.js (100%) rename packages/rspack/tests/configCases/module/{issue-4777 => rspack-issue-4777}/sub/d.js (100%) rename packages/rspack/tests/configCases/module/{issue-4777 => rspack-issue-4777}/sub/e.js (100%) rename packages/rspack/tests/configCases/module/{issue-4777 => rspack-issue-4777}/sub/f.js (100%) rename packages/rspack/tests/configCases/module/{issue-4777 => rspack-issue-4777}/sub/g.js (100%) rename packages/rspack/tests/configCases/module/{issue-4777 => rspack-issue-4777}/sub/h.js (100%) rename packages/rspack/tests/configCases/module/{issue-4777 => rspack-issue-4777}/webpack.config.js (100%) rename packages/rspack/tests/configCases/module/{issue-5548 => rspack-issue-5548}/dynamic.js (100%) rename packages/rspack/tests/configCases/module/{issue-1652 => rspack-issue-5548}/index.js (74%) rename packages/rspack/tests/configCases/module/{issue-5548 => rspack-issue-5548}/webpack.config.js (100%) rename packages/rspack/tests/configCases/output-module/{issue-4784 => rspack-issue-4784}/index.js (100%) rename packages/rspack/tests/configCases/output-module/{issue-4784 => rspack-issue-4784}/m.js (100%) rename packages/rspack/tests/configCases/output-module/{issue-4784 => rspack-issue-4784}/test.config.js (100%) rename packages/rspack/tests/configCases/output-module/{issue-4784 => rspack-issue-4784}/webpack.config.js (69%) create mode 100644 packages/rspack/tests/configCases/output-module/single-runtime/test.config.js create mode 100644 packages/rspack/tests/configCases/output/chunk-filename/test.config.js create mode 100644 packages/rspack/tests/configCases/output/script-type/test.config.js create mode 100644 packages/rspack/tests/configCases/output/source-map-filename/test.config.js create mode 100644 packages/rspack/tests/configCases/plugins/minify-ascii-only/test.config.js create mode 100644 packages/rspack/tests/configCases/plugins/minify-comment-all/test.config.js create mode 100644 packages/rspack/tests/configCases/plugins/minify-comment-some/test.config.js create mode 100644 packages/rspack/tests/configCases/plugins/minify-disable-mangle-compress/test.config.js create mode 100644 packages/rspack/tests/configCases/plugins/minify-exclude/test.config.js create mode 100644 packages/rspack/tests/configCases/plugins/minify-test/test.config.js rename packages/rspack/tests/configCases/plugins/{issue-4757 => rspack-issue-4757}/index.js (100%) rename packages/rspack/tests/configCases/plugins/{issue-4757 => rspack-issue-4757}/webpack.config.js (100%) rename packages/rspack/tests/configCases/plugins/{issue-4797 => rspack-issue-4797}/index.js (100%) rename packages/rspack/tests/configCases/plugins/{issue-4797 => rspack-issue-4797}/webpack.config.js (100%) rename packages/rspack/tests/configCases/plugins/{issue-4982 => rspack-issue-4982}/child.js (100%) rename packages/rspack/tests/configCases/plugins/{issue-4982 => rspack-issue-4982}/index.js (100%) rename packages/rspack/tests/configCases/plugins/{issue-4982 => rspack-issue-4982}/webpack.config.js (94%) rename packages/rspack/tests/configCases/plugins/{issue-5068-1 => rspack-issue-5068-1}/index.js (100%) rename packages/rspack/tests/configCases/plugins/{issue-5068-1 => rspack-issue-5068-1}/webpack.config.js (100%) rename packages/rspack/tests/configCases/plugins/{issue-5068-2 => rspack-issue-5068-2}/index.js (100%) rename packages/rspack/tests/configCases/plugins/{issue-5068-2 => rspack-issue-5068-2}/webpack.config.js (100%) create mode 100644 packages/rspack/tests/configCases/plugins/source-map-dev-tool-plugin-source-root/test.config.js create mode 100644 packages/rspack/tests/configCases/plugins/swc-js-minifier/test.config.js create mode 100644 packages/rspack/tests/configCases/split-chunks/chunks-function/test.config.js create mode 100644 packages/rspack/tests/configCases/split-chunks/css-simple/test.config.js create mode 100644 packages/rspack/tests/configCases/split-chunks/disable-reuse-existing-chunk-simple/test.config.js create mode 100644 packages/rspack/tests/configCases/split-chunks/extract-css-to-single-chunk/test.config.js rename packages/rspack/tests/configCases/split-chunks/{rspack-issue-5657 => reuse-existing-chunk-simple}/test.config.js (100%) rename packages/rspack/tests/configCases/split-chunks/{issue-17332 => rspack-issue-17332}/bar.js (100%) rename packages/rspack/tests/configCases/split-chunks/{issue-17332 => rspack-issue-17332}/foo.js (100%) rename packages/rspack/tests/configCases/split-chunks/{issue-17332 => rspack-issue-17332}/index.js (100%) rename packages/rspack/tests/configCases/split-chunks/{issue-17332 => rspack-issue-17332}/test.config.js (100%) rename packages/rspack/tests/configCases/split-chunks/{issue-17332 => rspack-issue-17332}/webpack.config.js (100%) rename packages/rspack/tests/configCases/split-chunks/{issue-3646 => rspack-issue-3646}/src/another.js (100%) rename packages/rspack/tests/configCases/split-chunks/{issue-3646 => rspack-issue-3646}/src/index.js (100%) rename packages/rspack/tests/configCases/split-chunks/{issue-3646 => rspack-issue-3646}/src/shared.js (100%) create mode 100644 packages/rspack/tests/configCases/split-chunks/rspack-issue-3646/test.config.js rename packages/rspack/tests/configCases/split-chunks/{issue-3646 => rspack-issue-3646}/webpack.config.js (93%) rename packages/rspack/tests/configCases/split-chunks/{issue-5267 => rspack-issue-5267}/chunk.js (100%) rename packages/rspack/tests/configCases/split-chunks/{issue-5267 => rspack-issue-5267}/file-A2.js (100%) rename packages/rspack/tests/configCases/split-chunks/{issue-5267 => rspack-issue-5267}/file-B2.js (100%) rename packages/rspack/tests/configCases/split-chunks/{issue-5267 => rspack-issue-5267}/file-a1.js (100%) rename packages/rspack/tests/configCases/split-chunks/{issue-5267 => rspack-issue-5267}/file-b1.js (100%) rename packages/rspack/tests/configCases/split-chunks/{issue-5267 => rspack-issue-5267}/index.js (100%) rename packages/rspack/tests/configCases/split-chunks/{issue-5267 => rspack-issue-5267}/test.config.js (100%) rename packages/rspack/tests/configCases/split-chunks/{issue-5267 => rspack-issue-5267}/webpack.config.js (100%) rename packages/rspack/tests/configCases/split-chunks/{issue-5485 => rspack-issue-5485}/src/index.js (100%) rename packages/rspack/tests/configCases/split-chunks/{issue-5485 => rspack-issue-5485}/src/lib/a.js (100%) rename packages/rspack/tests/configCases/split-chunks/{issue-5485 => rspack-issue-5485}/test.config.js (100%) rename packages/rspack/tests/configCases/split-chunks/{issue-5485 => rspack-issue-5485}/webpack.config.js (96%) create mode 100644 packages/rspack/tests/configCases/split-chunks/should-not-reuse-existing-chunk-simple-if-cache-group-name-specified/test.config.js create mode 100644 packages/rspack/tests/configCases/split-chunks/split-chunks-dot-name/test.config.js rename packages/rspack/tests/{configCases/source-map => lib/util}/checkSourceMap.js (100%) create mode 100644 packages/rspack/tests/lib/util/filterUtil.js create mode 100644 packages/rspack/tests/lib/util/identifier.js diff --git a/packages/rspack/jest.config.js b/packages/rspack/jest.config.js index 1ca92e555dcc..e154f8421449 100644 --- a/packages/rspack/jest.config.js +++ b/packages/rspack/jest.config.js @@ -6,6 +6,7 @@ const config = { testMatch: [ "/tests/*.test.ts", "/tests/*.basictest.ts", + "/tests/*.basictest.js", "/tests/*.longtest.ts", "/tests/*.unittest.ts", "/tests/copyPlugin/*.test.js", diff --git a/packages/rspack/src/rspack.ts b/packages/rspack/src/rspack.ts index 9d586cfa95d8..b7d5f11a9596 100644 --- a/packages/rspack/src/rspack.ts +++ b/packages/rspack/src/rspack.ts @@ -103,9 +103,17 @@ function rspack( options: MultiRspackOptions | RspackOptions, callback?: Callback | Callback ) { - asArray(options).every(opts => { - validate(opts, rspackOptions); - }); + try { + for (let o of asArray(options)) { + validate(o, rspackOptions); + } + } catch (e) { + if (e instanceof Error) { + callback?.(e); + return; + } + throw e; + } const create = () => { if (isMultiRspackOptions(options)) { const compiler = createMultiCompiler(options); @@ -139,10 +147,8 @@ function rspack( } else { const { compiler, watch } = create(); if (watch) { - util.deprecate( - () => {}, - "A 'callback' argument needs to be provided to the 'rspack(options, callback)' function when the 'watch' option is set. There is no way to handle the 'watch' option without a callback." - )(); + util.deprecate(() => {}, + "A 'callback' argument needs to be provided to the 'rspack(options, callback)' function when the 'watch' option is set. There is no way to handle the 'watch' option without a callback.")(); } return compiler; } diff --git a/packages/rspack/tests/ConfigCase.template.ts b/packages/rspack/tests/ConfigCase.template.ts deleted file mode 100644 index 475d3dbe57fa..000000000000 --- a/packages/rspack/tests/ConfigCase.template.ts +++ /dev/null @@ -1,647 +0,0 @@ -"use strict"; -import { Configuration, StatsValue, rspack } from "../src"; -import { - ensureRspackConfigNotExist, - ensureWebpackConfigExist, - isValidTestCaseDir -} from "./utils"; - -const path = require("path"); -const fs = require("graceful-fs"); -const vm = require("vm"); -const { URL, pathToFileURL, fileURLToPath } = require("url"); -const rimraf = require("rimraf"); -const checkArrayExpectation = require("./checkArrayExpectation"); -const createLazyTestEnv = require("./helpers/createLazyTestEnv"); -const deprecationTracking = require("./helpers/deprecationTracking"); -const FakeDocument = require("./helpers/FakeDocument"); -const CurrentScript = require("./helpers/CurrentScript"); - -const prepareOptions = require("./helpers/prepareOptions"); -const captureStdio = require("./helpers/captureStdio"); -const asModule = require("./helpers/asModule"); -const filterInfraStructureErrors = require("./helpers/infrastructureLogErrors"); -// fake define -const define = function (...args) { - const factory = args.pop(); - factory(); -}; - -const PATH_QUERY_FRAGMENT_REGEXP = - /^((?:\0.|[^?#\0])*)(\?(?:\0.|[^#\0])*)?(#.*)?$/; - -// In webpack, it is declared in ../lib/util/identifier -const parseResource = str => { - const match = PATH_QUERY_FRAGMENT_REGEXP.exec(str)!; - return { - resource: str, - path: match[1].replace(/\0(.)/g, "$1"), - query: match[2] ? match[2].replace(/\0(.)/g, "$1") : "", - fragment: match[3] || "" - }; -}; - -const casesPath = path.join(__dirname, "configCases"); -const categories = fs - .readdirSync(casesPath) - .filter(isValidTestCaseDir) - .map(cat => { - return { - name: cat, - tests: fs - .readdirSync(path.join(casesPath, cat)) - .filter(isValidTestCaseDir) - .filter(folder => - fs.lstatSync(path.join(casesPath, cat, folder)).isDirectory() - ) - .sort() - }; - }); - -const createLogger = appendTarget => { - return { - log: l => appendTarget.push(l), - debug: l => appendTarget.push(l), - trace: l => appendTarget.push(l), - info: l => appendTarget.push(l), - warn: console.warn.bind(console), - error: console.error.bind(console), - logTime: () => {}, - group: () => {}, - groupCollapsed: () => {}, - groupEnd: () => {}, - profile: () => {}, - profileEnd: () => {}, - clear: () => {}, - status: () => {} - }; -}; - -export const describeCases = config => { - describe(config.name, () => { - let stderr; - beforeEach(() => { - stderr = captureStdio(process.stderr, true); - }); - afterEach(() => { - stderr.restore(); - }); - - for (const category of categories) { - // eslint-disable-next-line no-loop-func - describe(category.name, () => { - for (const testName of category.tests) { - // eslint-disable-next-line no-loop-func - const testDirectory = path.join(casesPath, category.name, testName); - - ensureRspackConfigNotExist(testDirectory); - ensureWebpackConfigExist(testDirectory); - - const configFile = path.join(testDirectory, "webpack.config.js"); - describe(testName, function () { - const filterPath = path.join(testDirectory, "test.filter.js"); - if ( - fs.existsSync(filterPath) && - (typeof require(filterPath)() === "string" || - !require(filterPath)()) - ) { - describe.skip(testName, () => { - it("filtered", () => {}); - }); - return; - } - const infraStructureLog = []; - const outBaseDir = path.join(__dirname, "js"); - const testSubPath = path.join(config.name, category.name, testName); - // const outputDirectory = path.join(outBaseDir, testSubPath); - const outputDirectory = path.join(testDirectory, "dist"); - const cacheDirectory = path.join(outBaseDir, ".cache", testSubPath); - let options, optionsArr, testConfig; - - beforeAll(() => { - options = {}; - if (fs.existsSync(configFile)) { - options = prepareOptions(require(configFile), { - testPath: outputDirectory - }); - } - optionsArr = [].concat(options); - optionsArr.forEach((options, idx) => { - if (!options.context) options.context = testDirectory; - if (!options.mode) options.mode = "development"; - // if (!options.optimization) options.optimization = {}; - // if (options.optimization.minimize === undefined) - // options.optimization.minimize = false; - // if (options.optimization.minimizer === undefined) { - // options.optimization.minimizer = [ - // new (require("terser-webpack-plugin"))({ - // parallel: false - // }) - // ]; - // } - if (!options.entry) - options.entry = { - main: "./" - }; - if (!options.target) options.target = "node"; - if (!options.output) options.output = {}; - if (!options.output.path) options.output.path = outputDirectory; - // if (typeof options.output.pathinfo === "undefined") - // options.output.pathinfo = true; - // if (!options.output.filename) - // options.output.filename = - // "bundle" + - // idx + - // (options.experiments && options.experiments.outputModule - // ? ".mjs" - // : ".js"); - // if (config.cache) { - // options.cache = { - // cacheDirectory, - // name: `config-${idx}`, - // ...config.cache - // }; - // options.infrastructureLogging = { - // debug: true, - // console: createLogger(infraStructureLog) - // }; - // } - // if (!options.snapshot) options.snapshot = {}; - // if (!options.snapshot.managedPaths) { - // options.snapshot.managedPaths = [ - // path.resolve(__dirname, "../node_modules") - // ]; - // } - }); - testConfig = { - findBundle: function (i: number, options: Configuration) { - const ext = path.extname( - parseResource(options.output!.filename).path - ); - if ( - fs.existsSync( - path.join(options.output!.path, "bundle" + i + ext) - ) - ) { - return "./bundle" + i + ext; - } - return "./main.js"; - }, - timeout: 30000 - }; - try { - // try to load a test file - testConfig = Object.assign( - testConfig, - require(path.join(testDirectory, "test.config.js")) - ); - } catch (e) { - // ignored - } - // if (testConfig.timeout) setDefaultTimeout(testConfig.timeout); - }); - afterAll(() => { - // cleanup - options = undefined; - optionsArr = undefined; - testConfig = undefined; - }); - beforeAll(() => { - rimraf.sync(cacheDirectory); - }); - const handleFatalError = (err, done) => { - const fakeStats = { - errors: [ - { - message: err.message, - stack: err.stack - } - ] - }; - if ( - checkArrayExpectation( - testDirectory, - fakeStats, - "error", - "Error", - done - ) - ) { - return; - } - // Wait for uncaught errors to occur - setTimeout(done, 200); - return; - }; - it(`${testName} should compile`, done => { - // console.info("running:", testName); - // console.time(testName); - rimraf.sync(outputDirectory); - fs.mkdirSync(outputDirectory, { recursive: true }); - infraStructureLog.length = 0; - const deprecationTracker = deprecationTracking.start(); - const onCompiled = (err, stats) => { - const deprecations = deprecationTracker(); - if (err) { - return handleFatalError(err, done); - } - const statOptions: StatsValue = { - preset: "verbose", - colors: false - }; - fs.mkdirSync(outputDirectory, { recursive: true }); - // fs.writeFileSync( - // path.join(outputDirectory, "stats.txt"), - // stats.toString(statOptions), - // "utf-8" - // ); - const jsonStats = stats.toJson({ - errorDetails: true - }); - // fs.writeFileSync( - // path.join(outputDirectory, "stats.json"), - // JSON.stringify(jsonStats, null, 2), - // "utf-8" - // ); - if ( - checkArrayExpectation( - testDirectory, - jsonStats, - "error", - "Error", - done - ) - ) { - return; - } - if ( - checkArrayExpectation( - testDirectory, - jsonStats, - "warning", - "Warning", - done - ) - ) { - return; - } - const infrastructureLogging = stderr.toString(); - if (infrastructureLogging) { - return done( - new Error( - "Errors/Warnings during build:\n" + infrastructureLogging - ) - ); - } - if ( - checkArrayExpectation( - testDirectory, - { deprecations }, - "deprecation", - "Deprecation", - done - ) - ) { - return; - } - const infrastructureLogErrors = filterInfraStructureErrors( - infraStructureLog, - { - run: 3, - options - } - ); - if ( - infrastructureLogErrors.length && - checkArrayExpectation( - testDirectory, - { infrastructureLogs: infrastructureLogErrors }, - "infrastructureLog", - "infrastructure-log", - "InfrastructureLog", - done - ) - ) { - return; - } - - let filesCount = 0; - if (testConfig.noTests) return process.nextTick(done); - if (testConfig.beforeExecute) testConfig.beforeExecute(); - const results = []; - for (let i = 0; i < optionsArr.length; i++) { - const options = optionsArr[i]; - const bundlePath = testConfig.findBundle(i, optionsArr[i]); - if (bundlePath) { - filesCount++; - const document = new FakeDocument(outputDirectory); - const globalContext = { - console: console, - expect: expect, - setTimeout: setTimeout, - clearTimeout: clearTimeout, - document, - getComputedStyle: - document.getComputedStyle.bind(document), - location: { - href: "https://test.cases/path/index.html", - origin: "https://test.cases", - toString() { - return "https://test.cases/path/index.html"; - } - } - }; - - const requireCache = Object.create(null); - const esmCache = new Map(); - const esmIdentifier = `${category.name}-${testName}-${i}`; - const baseModuleScope = { - console: console, - it: _it, - beforeEach: _beforeEach, - afterEach: _afterEach, - expect, - jest, - __STATS__: jsonStats, - nsObj: m => { - Object.defineProperty(m, Symbol.toStringTag, { - value: "Module" - }); - return m; - } - }; - - let runInNewContext = false; - if ( - options.target === "web" || - options.target === "webworker" - ) { - // @ts-ignore - baseModuleScope.window = globalContext; - // @ts-ignore - baseModuleScope.self = globalContext; - // @ts-ignore - baseModuleScope.URL = URL; - // @ts-ignore - baseModuleScope.Worker = - require("./helpers/createFakeWorker")({ - outputDirectory - }); - runInNewContext = true; - } - if (testConfig.moduleScope) { - testConfig.moduleScope(baseModuleScope); - } - const esmContext = vm.createContext(baseModuleScope, { - name: "context for esm" - }); - - // eslint-disable-next-line no-loop-func - const _require = ( - currentDirectory, - options, - module, - esmMode, - parentModule - ) => { - if (testConfig === undefined) { - throw new Error( - `_require(${module}) called after all tests from ${category.name} ${testName} have completed` - ); - } - if (Array.isArray(module) || /^\.\.?\//.test(module)) { - let content; - let p; - let subPath = ""; - if (Array.isArray(module)) { - p = path.join(currentDirectory, ".array-require.js"); - content = `module.exports = (${module - .map(arg => { - return `require(${JSON.stringify(`./${arg}`)})`; - }) - .join(", ")});`; - } else { - p = path.join(currentDirectory, module); - content = fs.readFileSync(p, "utf-8"); - const lastSlash = module.lastIndexOf("/"); - let firstSlash = module.indexOf("/"); - - if (lastSlash !== -1 && firstSlash !== lastSlash) { - if (firstSlash !== -1) { - let next = module.indexOf("/", firstSlash + 1); - let dir = module.slice(firstSlash + 1, next); - - while (dir === ".") { - firstSlash = next; - next = module.indexOf("/", firstSlash + 1); - dir = module.slice(firstSlash + 1, next); - } - } - - subPath = module.slice( - firstSlash + 1, - lastSlash + 1 - ); - } - } - const isModule = - // p.endsWith(".mjs") && - options.experiments && - options.experiments.outputModule; - - if (isModule) { - if (!vm.SourceTextModule) - throw new Error( - "Running this test requires '--experimental-vm-modules'.\nRun with 'node --experimental-vm-modules node_modules/jest-cli/bin/jest'." - ); - let esm = esmCache.get(p); - if (!esm) { - esm = new vm.SourceTextModule(content, { - identifier: esmIdentifier + "-" + p, - url: pathToFileURL(p).href + "?" + esmIdentifier, - context: esmContext, - initializeImportMeta: (meta, module) => { - meta.url = pathToFileURL(p).href; - }, - importModuleDynamically: async ( - specifier, - module - ) => { - const result = await _require( - path.dirname(p), - options, - specifier, - "evaluated", - module - ); - return await asModule(result, module.context); - } - }); - esmCache.set(p, esm); - } - if (esmMode === "unlinked") return esm; - return (async () => { - await esm.link( - async (specifier, referencingModule) => { - return await asModule( - await _require( - path.dirname( - referencingModule.identifier - ? referencingModule.identifier.slice( - esmIdentifier.length + 1 - ) - : fileURLToPath(referencingModule.url) - ), - options, - specifier, - "unlinked", - referencingModule - ), - referencingModule.context, - true - ); - } - ); - // node.js 10 needs instantiate - if (esm.instantiate) esm.instantiate(); - await esm.evaluate(); - if (esmMode === "evaluated") return esm; - const ns = esm.namespace; - return ns.default && ns.default instanceof Promise - ? ns.default - : ns; - })(); - } else { - if (p in requireCache) { - return requireCache[p].exports; - } - const m = { - exports: {} - }; - requireCache[p] = m; - const moduleScope = { - ...baseModuleScope, - require: _require.bind( - null, - path.dirname(p), - options - ), - importScripts: url => { - expect(url).toMatch( - /^https:\/\/test\.cases\/path\// - ); - // @ts-ignore - _require( - outputDirectory, - options, - `.${url.slice( - "https://test.cases/path".length - )}` - ); - }, - module: m, - exports: m.exports, - __dirname: path.dirname(p), - __filename: p, - _globalAssign: { expect }, - define - }; - if (testConfig.moduleScope) { - testConfig.moduleScope(moduleScope); - } - if (!runInNewContext) - content = `Object.assign(global, _globalAssign);\n ${content}`; - const args = Object.keys(moduleScope); - const argValues = args.map(arg => moduleScope[arg]); - const code = `(function(${args.join( - ", " - )}) {${content}\n})`; - - let oldCurrentScript = document.currentScript; - document.currentScript = new CurrentScript(subPath); - const fn = runInNewContext - ? vm.runInNewContext(code, globalContext, p) - : vm.runInThisContext(code, p); - fn.call( - testConfig.nonEsmThis - ? testConfig.nonEsmThis(module) - : m.exports, - ...argValues - ); - document.currentScript = oldCurrentScript; - return m.exports; - } - } else if ( - testConfig.modules && - module in testConfig.modules - ) { - return testConfig.modules[module]; - } else { - return require(module.startsWith("node:") - ? module.slice(5) - : module); - } - }; - if (Array.isArray(bundlePath)) { - for (const bundlePathItem of bundlePath) { - results.push( - // @ts-ignore - _require( - outputDirectory, - options, - "./" + bundlePathItem - ) - ); - } - } else { - results.push( - // @ts-ignore - _require(outputDirectory, options, bundlePath) - ); - } - } - } - // give a free pass to compilation that generated an error - if ( - !jsonStats.errors.length && - filesCount !== optionsArr.length - ) { - return done( - new Error( - "Should have found at least one bundle file per webpack config" - ) - ); - } - Promise.all(results) - .then(() => { - if (testConfig.afterExecute) testConfig.afterExecute(); - for (const key of Object.keys(global)) { - if (key.includes("webpack")) delete global[key]; - } - if (getNumberOfTests() < filesCount) { - return done(new Error("No tests exported by test case")); - } - done(); - }) - .catch(done); - }; - try { - rspack(optionsArr, onCompiled); - } catch (err) { - onCompiled(err, undefined); - } - } /* 30000 */); - - const { - it: _it, - beforeEach: _beforeEach, - afterEach: _afterEach, - setDefaultTimeout, - getNumberOfTests - } = createLazyTestEnv(10000); - }); - } - }); - } - }); -}; diff --git a/packages/rspack/tests/ConfigTestCases.basictest.js b/packages/rspack/tests/ConfigTestCases.basictest.js new file mode 100644 index 000000000000..8c8e0933c668 --- /dev/null +++ b/packages/rspack/tests/ConfigTestCases.basictest.js @@ -0,0 +1,5 @@ +const { describeCases } = require("./ConfigTestCases.template"); + +describeCases({ + name: "ConfigTestCases" +}); diff --git a/packages/rspack/tests/ConfigTestCases.template.js b/packages/rspack/tests/ConfigTestCases.template.js new file mode 100644 index 000000000000..da78300ad321 --- /dev/null +++ b/packages/rspack/tests/ConfigTestCases.template.js @@ -0,0 +1,766 @@ +"use strict"; + +require("./helpers/warmup-webpack"); + +const path = require("path"); +const fs = require("graceful-fs"); +const vm = require("vm"); +const { URL, pathToFileURL, fileURLToPath } = require("url"); +const rimraf = require("rimraf"); +const checkArrayExpectation = require("./checkArrayExpectation"); +const createLazyTestEnv = require("./helpers/createLazyTestEnv"); +const deprecationTracking = require("./helpers/deprecationTracking"); +const FakeDocument = require("./helpers/FakeDocument"); +const CurrentScript = require("./helpers/CurrentScript"); + +const prepareOptions = require("./helpers/prepareOptions"); +const { parseResource } = require("./lib/util/identifier"); +const captureStdio = require("./helpers/captureStdio"); +const asModule = require("./helpers/asModule"); +const filterInfraStructureErrors = require("./helpers/infrastructureLogErrors"); + +const casesPath = path.join(__dirname, "configCases"); +const categories = fs.readdirSync(casesPath).map(cat => { + return { + name: cat, + tests: fs + .readdirSync(path.join(casesPath, cat)) + .filter(folder => !folder.startsWith("_")) + .sort() + }; +}); + +const createLogger = appendTarget => { + return { + log: l => appendTarget.push(l), + debug: l => appendTarget.push(l), + trace: l => appendTarget.push(l), + info: l => appendTarget.push(l), + warn: console.warn.bind(console), + error: console.error.bind(console), + logTime: () => {}, + group: () => {}, + groupCollapsed: () => {}, + groupEnd: () => {}, + profile: () => {}, + profileEnd: () => {}, + clear: () => {}, + status: () => {} + }; +}; + +const TIMEOUT = 10_000; + +const describeCases = config => { + describe(config.name, () => { + let stderr; + beforeEach(() => { + stderr = captureStdio(process.stderr, true); + }); + afterEach(() => { + if (stderr) { + stderr.restore(); + } + }); + jest.setTimeout(TIMEOUT); + + for (const category of categories) { + // eslint-disable-next-line no-loop-func + describe(category.name, () => { + for (const testName of category.tests) { + // eslint-disable-next-line no-loop-func + describe(testName, function () { + const testDirectory = path.join(casesPath, category.name, testName); + const filterPath = path.join(testDirectory, "test.filter.js"); + if (fs.existsSync(filterPath) && !require(filterPath)()) { + describe.skip(testName, () => { + it("filtered", () => {}); + }); + return; + } + const infraStructureLog = []; + const outBaseDir = path.join(__dirname, "js"); + const testSubPath = path.join(config.name, category.name, testName); + const outputDirectory = path.join(outBaseDir, testSubPath); + const cacheDirectory = path.join(outBaseDir, ".cache", testSubPath); + let options, optionsArr, testConfig; + beforeAll(() => { + expect(() => { + options = prepareOptions( + require(path.join(testDirectory, "webpack.config.js")), + { testPath: outputDirectory } + ); + }).not.toThrow(); + optionsArr = [].concat(options); + optionsArr.forEach((options, idx) => { + if (!options.context) options.context = testDirectory; + if (!options.mode) options.mode = "production"; + if (!options.optimization) options.optimization = {}; + if (options.optimization.minimize === undefined) + options.optimization.minimize = false; + if (!options.experiments) { + options.experiments = {}; + } + if (!options.experiments.rspackFuture) { + options.experiments.rspackFuture = { + newTreeshaking: true + }; + } + // CHANGE: use rspack internal swc minimizer + // if (options.optimization.minimizer === undefined) { + // options.optimization.minimizer = [ + // new (require("terser-webpack-plugin"))({ + // parallel: false + // }) + // ]; + // } + if (!options.entry) options.entry = "./index.js"; + if (!options.target) options.target = "async-node"; + if (!options.output) options.output = {}; + if (!options.devtool) options.devtool = false; + if (options.cache === undefined) options.cache = false; + if (!options.output.path) options.output.path = outputDirectory; + // CHANGE: rspack does not support `pathinfo` yet. + // if (typeof options.output.pathinfo === "undefined") + // options.output.pathinfo = true; + if (!options.output.filename) + options.output.filename = + "bundle" + + idx + + (options.experiments && options.experiments.outputModule + ? ".mjs" + : ".js"); + if (config.cache) { + options.cache = { + cacheDirectory, + name: `config-${idx}`, + ...config.cache + }; + options.infrastructureLogging = { + debug: true, + console: createLogger(infraStructureLog) + }; + } + if (!options.snapshot) options.snapshot = {}; + // CHANGE: rspack does not support `snapshot.managedPaths` yet + // if (!options.snapshot.managedPaths) { + // options.snapshot.managedPaths = [ + // path.resolve(__dirname, "../node_modules") + // ]; + // } + }); + testConfig = { + findBundle: function (i, options) { + const ext = path.extname( + parseResource(options.output.filename).path + ); + if ( + fs.existsSync( + path.join(options.output.path, "bundle" + i + ext) + ) + ) { + return "./bundle" + i + ext; + } + }, + timeout: TIMEOUT + }; + try { + // try to load a test file + testConfig = Object.assign( + testConfig, + require(path.join(testDirectory, "test.config.js")) + ); + } catch (e) { + // ignored + } + if (testConfig.timeout) setDefaultTimeout(testConfig.timeout); + }); + afterAll(() => { + // cleanup + options = undefined; + optionsArr = undefined; + testConfig = undefined; + }); + beforeAll(() => { + rimraf.sync(cacheDirectory); + }); + const handleFatalError = (err, done) => { + const fakeStats = { + errors: [ + { + message: err.message, + stack: err.stack + } + ] + }; + if ( + checkArrayExpectation( + testDirectory, + fakeStats, + "error", + "Error", + done + ) + ) { + return; + } + // Wait for uncaught errors to occur + setTimeout(done, 200); + return; + }; + if (config.cache) { + it( + `${testName} should pre-compile to fill disk cache (1st)`, + done => { + rimraf.sync(outputDirectory); + fs.mkdirSync(outputDirectory, { recursive: true }); + infraStructureLog.length = 0; + const deprecationTracker = deprecationTracking.start(); + require("@rspack/core").rspack(options, err => { + deprecationTracker(); + const infrastructureLogging = stderr.toString(); + if (infrastructureLogging) { + return done( + new Error( + "Errors/Warnings during build:\n" + + infrastructureLogging + ) + ); + } + const infrastructureLogErrors = filterInfraStructureErrors( + infraStructureLog, + { + run: 1, + options + } + ); + if ( + infrastructureLogErrors.length && + checkArrayExpectation( + testDirectory, + { infrastructureLogs: infrastructureLogErrors }, + "infrastructureLog", + "infrastructure-log", + "InfrastructureLog", + done + ) + ) { + return; + } + if (err) return handleFatalError(err, done); + done(); + }); + }, + TIMEOUT + ); + it( + `${testName} should pre-compile to fill disk cache (2nd)`, + done => { + rimraf.sync(outputDirectory); + fs.mkdirSync(outputDirectory, { recursive: true }); + infraStructureLog.length = 0; + const deprecationTracker = deprecationTracking.start(); + require("..")(options, (err, stats) => { + deprecationTracker(); + if (err) return handleFatalError(err, done); + const { errorsCount } = stats.toJson({ + all: false, + modules: true, + errorsCount: true + }); + if (errorsCount === 0) { + const infrastructureLogging = stderr.toString(); + if (infrastructureLogging) { + return done( + new Error( + "Errors/Warnings during build:\n" + + infrastructureLogging + ) + ); + } + const allModules = children + ? children.reduce( + (all, { modules }) => all.concat(modules), + modules || [] + ) + : modules; + if ( + allModules.some( + m => m.type !== "cached modules" && !m.cached + ) + ) { + return done( + new Error( + `Some modules were not cached:\n${stats.toString({ + all: false, + modules: true, + modulesSpace: 100 + })}` + ) + ); + } + } + const infrastructureLogErrors = filterInfraStructureErrors( + infraStructureLog, + { + run: 2, + options + } + ); + if ( + infrastructureLogErrors.length && + checkArrayExpectation( + testDirectory, + { infrastructureLogs: infrastructureLogErrors }, + "infrastructureLog", + "infrastructure-log", + "InfrastructureLog", + done + ) + ) { + return; + } + done(); + }); + }, + TIMEOUT + ); + } + it( + `${testName} should compile`, + done => { + rimraf.sync(outputDirectory); + fs.mkdirSync(outputDirectory, { recursive: true }); + infraStructureLog.length = 0; + const deprecationTracker = deprecationTracking.start(); + const onCompiled = (err, stats) => { + const deprecations = deprecationTracker(); + if (err) return handleFatalError(err, done); + const statOptions = { + preset: "verbose", + colors: false + }; + fs.mkdirSync(outputDirectory, { recursive: true }); + fs.writeFileSync( + path.join(outputDirectory, "stats.txt"), + stats.toString(statOptions), + "utf-8" + ); + const jsonStats = stats.toJson({ + errorDetails: true + }); + fs.writeFileSync( + path.join(outputDirectory, "stats.json"), + JSON.stringify(jsonStats, null, 2), + "utf-8" + ); + if ( + checkArrayExpectation( + testDirectory, + jsonStats, + "error", + "Error", + done + ) + ) { + return; + } + if ( + checkArrayExpectation( + testDirectory, + jsonStats, + "warning", + "Warning", + done + ) + ) { + return; + } + const infrastructureLogging = stderr.toString(); + if (infrastructureLogging) { + return done( + new Error( + "Errors/Warnings during build:\n" + + infrastructureLogging + ) + ); + } + if ( + checkArrayExpectation( + testDirectory, + { deprecations }, + "deprecation", + "Deprecation", + done + ) + ) { + return; + } + const infrastructureLogErrors = filterInfraStructureErrors( + infraStructureLog, + { + run: 3, + options + } + ); + if ( + infrastructureLogErrors.length && + checkArrayExpectation( + testDirectory, + { infrastructureLogs: infrastructureLogErrors }, + "infrastructureLog", + "infrastructure-log", + "InfrastructureLog", + done + ) + ) { + return; + } + + let filesCount = 0; + + if (testConfig.noTests) return process.nextTick(done); + if (testConfig.beforeExecute) testConfig.beforeExecute(); + const results = []; + for (let i = 0; i < optionsArr.length; i++) { + const options = optionsArr[i]; + const bundlePath = testConfig.findBundle(i, optionsArr[i]); + if (bundlePath) { + filesCount++; + const document = new FakeDocument(outputDirectory); + const globalContext = { + console: console, + expect: expect, + setTimeout: setTimeout, + clearTimeout: clearTimeout, + document, + getComputedStyle: + document.getComputedStyle.bind(document), + location: { + href: "https://test.cases/path/index.html", + origin: "https://test.cases", + toString() { + return "https://test.cases/path/index.html"; + } + } + }; + + const requireCache = Object.create(null); + const esmCache = new Map(); + const esmIdentifier = `${category.name}-${testName}-${i}`; + const baseModuleScope = { + console: console, + it: _it, + beforeEach: _beforeEach, + afterEach: _afterEach, + expect, + jest, + __STATS__: jsonStats, + nsObj: m => { + Object.defineProperty(m, Symbol.toStringTag, { + value: "Module" + }); + return m; + } + }; + + let runInNewContext = false; + if ( + options.target === "web" || + options.target === "webworker" + ) { + baseModuleScope.window = globalContext; + baseModuleScope.self = globalContext; + baseModuleScope.URL = URL; + baseModuleScope.Worker = + require("./helpers/createFakeWorker")({ + outputDirectory + }); + runInNewContext = true; + } + if (testConfig.moduleScope) { + testConfig.moduleScope(baseModuleScope); + } + const esmContext = vm.createContext(baseModuleScope, { + name: "context for esm" + }); + + // eslint-disable-next-line no-loop-func + const _require = ( + currentDirectory, + options, + module, + esmMode, + parentModule + ) => { + if (testConfig === undefined) { + throw new Error( + `_require(${module}) called after all tests from ${category.name} ${testName} have completed` + ); + } + if (Array.isArray(module) || /^\.\.?\//.test(module)) { + let content; + let p; + let subPath = ""; + if (Array.isArray(module)) { + p = path.join( + currentDirectory, + ".array-require.js" + ); + content = `module.exports = (${module + .map(arg => { + return `require(${JSON.stringify(`./${arg}`)})`; + }) + .join(", ")});`; + } else { + p = path.join(currentDirectory, module); + content = fs.readFileSync(p, "utf-8"); + const lastSlash = module.lastIndexOf("/"); + let firstSlash = module.indexOf("/"); + + if (lastSlash !== -1 && firstSlash !== lastSlash) { + if (firstSlash !== -1) { + let next = module.indexOf("/", firstSlash + 1); + let dir = module.slice(firstSlash + 1, next); + + while (dir === ".") { + firstSlash = next; + next = module.indexOf("/", firstSlash + 1); + dir = module.slice(firstSlash + 1, next); + } + } + + subPath = module.slice( + firstSlash + 1, + lastSlash + 1 + ); + } + } + const isModule = + p.endsWith(".mjs") && + options.experiments && + options.experiments.outputModule; + + if (isModule) { + if (!vm.SourceTextModule) + throw new Error( + "Running this test requires '--experimental-vm-modules'.\nRun with 'node --experimental-vm-modules node_modules/jest-cli/bin/jest'." + ); + let esm = esmCache.get(p); + if (!esm) { + esm = new vm.SourceTextModule(content, { + identifier: esmIdentifier + "-" + p, + url: + pathToFileURL(p).href + "?" + esmIdentifier, + context: esmContext, + initializeImportMeta: (meta, module) => { + meta.url = pathToFileURL(p).href; + }, + importModuleDynamically: async ( + specifier, + module + ) => { + const result = await _require( + path.dirname(p), + options, + specifier, + "evaluated", + module + ); + return await asModule(result, module.context); + } + }); + esmCache.set(p, esm); + } + if (esmMode === "unlinked") return esm; + return (async () => { + await esm.link( + async (specifier, referencingModule) => { + return await asModule( + await _require( + path.dirname( + referencingModule.identifier + ? referencingModule.identifier.slice( + esmIdentifier.length + 1 + ) + : fileURLToPath(referencingModule.url) + ), + options, + specifier, + "unlinked", + referencingModule + ), + referencingModule.context, + true + ); + } + ); + // node.js 10 needs instantiate + if (esm.instantiate) esm.instantiate(); + await esm.evaluate(); + if (esmMode === "evaluated") return esm; + const ns = esm.namespace; + return ns.default && ns.default instanceof Promise + ? ns.default + : ns; + })(); + } else { + if (p in requireCache) { + return requireCache[p].exports; + } + const m = { + exports: {} + }; + requireCache[p] = m; + const moduleScope = { + ...baseModuleScope, + require: _require.bind( + null, + path.dirname(p), + options + ), + importScripts: url => { + expect(url).toMatch( + /^https:\/\/test\.cases\/path\// + ); + _require( + outputDirectory, + options, + `.${url.slice( + "https://test.cases/path".length + )}` + ); + }, + module: m, + exports: m.exports, + __dirname: path.dirname(p), + __filename: p, + _globalAssign: { expect } + }; + if (testConfig.moduleScope) { + testConfig.moduleScope(moduleScope); + } + if (!runInNewContext) + content = `Object.assign(global, _globalAssign); ${content}`; + const args = Object.keys(moduleScope); + const argValues = args.map(arg => moduleScope[arg]); + const code = `(function(${args.join( + ", " + )}) {${content}\n})`; + + let oldCurrentScript = document.currentScript; + document.currentScript = new CurrentScript(subPath); + const fn = runInNewContext + ? vm.runInNewContext(code, globalContext, p) + : vm.runInThisContext(code, p); + fn.call( + testConfig.nonEsmThis + ? testConfig.nonEsmThis(module) + : m.exports, + ...argValues + ); + document.currentScript = oldCurrentScript; + return m.exports; + } + } else if ( + testConfig.modules && + module in testConfig.modules + ) { + return testConfig.modules[module]; + } else { + return require(module.startsWith("node:") + ? module.slice(5) + : module); + } + }; + + try { + if (Array.isArray(bundlePath)) { + for (const bundlePathItem of bundlePath) { + results.push( + _require( + outputDirectory, + options, + "./" + bundlePathItem + ) + ); + } + } else { + results.push( + _require(outputDirectory, options, bundlePath) + ); + } + } catch (err) { + // Abort early if `_require` throws + return handleFatalError(err, done); + } + } + } + // give a free pass to compilation that generated an error + if ( + !jsonStats.errors.length && + filesCount !== optionsArr.length + ) { + return done( + new Error( + "Should have found at least one bundle file per webpack config" + ) + ); + } + Promise.all(results) + .then(() => { + if (testConfig.afterExecute) testConfig.afterExecute(); + for (const key of Object.keys(global)) { + if (key.includes("webpack")) delete global[key]; + } + if (getNumberOfTests() < filesCount) { + return done( + new Error( + "No tests exported by test case" + + getNumberOfTests() + + " " + + filesCount + ) + ); + } + done(); + }) + .catch(done); + }; + if (config.cache) { + try { + const compiler = require("..")(options); + compiler.run(err => { + if (err) return handleFatalError(err, done); + compiler.run((error, stats) => { + compiler.close(err => { + if (err) return handleFatalError(err, done); + onCompiled(error, stats); + }); + }); + }); + } catch (e) { + handleFatalError(e, done); + } + } else { + require("..")(options, onCompiled); + } + }, + TIMEOUT + ); + + const { + it: _it, + beforeEach: _beforeEach, + afterEach: _afterEach, + setDefaultTimeout, + getNumberOfTests + } = createLazyTestEnv(TIMEOUT); + }); + } + }); + } + }); +}; + +exports.describeCases = describeCases; diff --git a/packages/rspack/tests/TestCases.template.js b/packages/rspack/tests/TestCases.template.js new file mode 100644 index 000000000000..cb9e5d8ba6c5 --- /dev/null +++ b/packages/rspack/tests/TestCases.template.js @@ -0,0 +1,543 @@ +"use strict"; + +// require("./helpers/warmup-webpack"); +const path = require("path"); +const fs = require("graceful-fs"); +const vm = require("vm"); +const { pathToFileURL, URL } = require("url"); +const rimraf = require("rimraf"); +const checkArrayExpectation = require("./checkArrayExpectation"); +const createLazyTestEnv = require("./helpers/createLazyTestEnv"); +const deprecationTracking = require("./helpers/deprecationTracking"); +const captureStdio = require("./helpers/captureStdio"); +const asModule = require("./helpers/asModule"); +const filterInfraStructureErrors = require("./helpers/infrastructureLogErrors"); + +const casesPath = path.join(__dirname, "cases"); +let categories = fs.readdirSync(casesPath); +categories = categories.map(cat => { + return { + name: cat, + tests: fs + .readdirSync(path.join(casesPath, cat)) + .filter(folder => folder.indexOf("_") < 0) + }; +}); + +const createLogger = appendTarget => { + return { + log: l => appendTarget.push(l), + debug: l => appendTarget.push(l), + trace: l => appendTarget.push(l), + info: l => appendTarget.push(l), + warn: console.warn.bind(console), + error: console.error.bind(console), + logTime: () => {}, + group: () => {}, + groupCollapsed: () => {}, + groupEnd: () => {}, + profile: () => {}, + profileEnd: () => {}, + clear: () => {}, + status: () => {} + }; +}; + +const describeCases = config => { + describe(config.name, () => { + let stderr; + beforeEach(() => { + stderr = captureStdio(process.stderr, true); + }); + afterEach(() => { + stderr.restore(); + }); + categories.forEach(category => { + describe(category.name, function () { + jest.setTimeout(20000); + + category.tests + .filter(test => { + const testDirectory = path.join(casesPath, category.name, test); + const filterPath = path.join(testDirectory, "test.filter.js"); + if (fs.existsSync(filterPath) && !require(filterPath)(config)) { + describe.skip(test, () => { + it("filtered", () => {}); + }); + return false; + } + return true; + }) + .forEach(testName => { + let infraStructureLog = []; + + describe(testName, () => { + const testDirectory = path.join( + casesPath, + category.name, + testName + ); + const outputDirectory = path.join( + __dirname, + "js", + config.name, + category.name, + testName + ); + const cacheDirectory = path.join( + __dirname, + "js/.cache", + config.name, + category.name, + testName + ); + let testConfig = {}; + const testConfigPath = path.join(testDirectory, "test.config.js"); + if (fs.existsSync(testConfigPath)) { + testConfig = require(testConfigPath); + } + const TerserPlugin = require("terser-webpack-plugin"); + const terserForTesting = new TerserPlugin({ + parallel: false + }); + let options = { + ...testConfig, + context: casesPath, + entry: "./" + category.name + "/" + testName + "/", + target: config.target || "async-node", + devtool: config.devtool, + mode: config.mode || "none", + optimization: config.mode + ? { + emitOnErrors: true, + minimizer: [terserForTesting], + ...testConfig.optimization + } + : { + removeAvailableModules: true, + removeEmptyChunks: true, + mergeDuplicateChunks: true, + flagIncludedChunks: true, + sideEffects: true, + providedExports: true, + usedExports: true, + mangleExports: true, + emitOnErrors: true, + concatenateModules: + !!testConfig?.optimization?.concatenateModules, + innerGraph: true, + // CHANGE: size is not supported yet + // moduleIds: "size", + // chunkIds: "size", + moduleIds: "named", + chunkIds: "named", + minimizer: [terserForTesting], + ...config.optimization + }, + performance: { + hints: false + }, + node: { + __dirname: "mock", + __filename: "mock" + }, + cache: config.cache && { + cacheDirectory, + ...config.cache + }, + output: { + pathinfo: "verbose", + path: outputDirectory, + filename: config.module ? "bundle.mjs" : "bundle.js" + }, + resolve: { + modules: ["web_modules", "node_modules"], + mainFields: [ + "webpack", + "browser", + "web", + "browserify", + "main" + ], + aliasFields: ["browser"], + extensions: [".webpack.js", ".web.js", ".js", ".json"] + }, + resolveLoader: { + modules: [ + "web_loaders", + "web_modules", + "node_loaders", + "node_modules" + ], + mainFields: ["webpackLoader", "webLoader", "loader", "main"], + extensions: [ + ".webpack-loader.js", + ".web-loader.js", + ".loader.js", + ".js" + ] + }, + module: { + rules: [ + { + test: /\.coffee$/, + loader: "coffee-loader" + }, + { + test: /\.pug/, + loader: "pug-loader" + }, + { + test: /\.wat$/i, + loader: "wast-loader", + type: "webassembly/async" + } + ] + }, + plugins: (config.plugins || []) + .concat(testConfig.plugins || []) + .concat(function () { + this.hooks.compilation.tap("TestCasesTest", compilation => { + [ + // CHANGE: the follwing hooks are not supported yet, so comment it out + // "optimize", + // "optimizeModules", + // "optimizeChunks", + // "afterOptimizeTree", + // "afterOptimizeAssets" + ].forEach(hook => { + compilation.hooks[hook].tap("TestCasesTest", () => + compilation.checkConstraints() + ); + }); + }); + }), + experiments: { + asyncWebAssembly: true, + topLevelAwait: true, + backCompat: false, + // CHANGE: Rspack enables `css` by default. + // Turning off here to fallback to webpack's default css processing logic. + + rspackFuture: testConfig?.experiments?.rspackFuture ?? { + newTreeshaking: true + }, + css: false, + ...(config.module ? { outputModule: true } : {}) + }, + infrastructureLogging: config.cache && { + debug: true, + console: createLogger(infraStructureLog) + } + }; + const cleanups = []; + afterAll(() => { + options = undefined; + testConfig = undefined; + for (const fn of cleanups) fn(); + }); + beforeAll(done => { + rimraf(cacheDirectory, done); + }); + if (config.cache) { + it( + `${testName} should pre-compile to fill disk cache (1st)`, + done => { + const oldPath = options.output.path; + options.output.path = path.join( + options.output.path, + "cache1" + ); + infraStructureLog.length = 0; + const deprecationTracker = deprecationTracking.start(); + const webpack = require("@rspack/core").rspack; + webpack(options, err => { + deprecationTracker(); + options.output.path = oldPath; + if (err) return done(err); + const infrastructureLogErrors = + filterInfraStructureErrors(infraStructureLog, { + run: 1, + options + }); + if ( + infrastructureLogErrors.length && + checkArrayExpectation( + testDirectory, + { infrastructureLogs: infrastructureLogErrors }, + "infrastructureLog", + "infrastructure-log", + "InfrastructureLog", + done + ) + ) { + return; + } + done(); + }); + }, + testConfig.timeout || 60000 + ); + it( + `${testName} should pre-compile to fill disk cache (2nd)`, + done => { + const oldPath = options.output.path; + options.output.path = path.join( + options.output.path, + "cache2" + ); + infraStructureLog.length = 0; + const deprecationTracker = deprecationTracking.start(); + const webpack = require("@rspack/core").rspack; + webpack(options, err => { + deprecationTracker(); + options.output.path = oldPath; + if (err) return done(err); + const infrastructureLogErrors = + filterInfraStructureErrors(infraStructureLog, { + run: 2, + options + }); + if ( + infrastructureLogErrors.length && + checkArrayExpectation( + testDirectory, + { infrastructureLogs: infrastructureLogErrors }, + "infrastructureLog", + "infrastructure-log", + "InfrastructureLog", + done + ) + ) { + return; + } + done(); + }); + }, + testConfig.cachedTimeout || testConfig.timeout || 10000 + ); + } + it( + testName + " should compile", + done => { + infraStructureLog.length = 0; + const webpack = require("@rspack/core").rspack; + const compiler = webpack(options); + const run = () => { + const deprecationTracker = deprecationTracking.start(); + compiler.run((err, stats) => { + const deprecations = deprecationTracker(); + if (err) return done(err); + const infrastructureLogErrors = + filterInfraStructureErrors(infraStructureLog, { + run: 3, + options + }); + if ( + infrastructureLogErrors.length && + checkArrayExpectation( + testDirectory, + { infrastructureLogs: infrastructureLogErrors }, + "infrastructureLog", + "infrastructure-log", + "InfrastructureLog", + done + ) + ) { + return; + } + compiler.close(err => { + if (err) return done(err); + const statOptions = { + preset: "verbose", + colors: false, + modules: true, + reasonsSpace: 1000 + }; + fs.mkdirSync(outputDirectory, { recursive: true }); + fs.writeFileSync( + path.join(outputDirectory, "stats.txt"), + stats.toString(statOptions), + "utf-8" + ); + const jsonStats = stats.toJson({ + errorDetails: true, + modules: false, + assets: false, + chunks: false + }); + if ( + checkArrayExpectation( + testDirectory, + jsonStats, + "error", + "Error", + done + ) + ) { + return; + } + if ( + checkArrayExpectation( + testDirectory, + jsonStats, + "warning", + "Warning", + done + ) + ) { + return; + } + const infrastructureLogging = stderr.toString(); + if (infrastructureLogging) { + done( + new Error( + "Errors/Warnings during build:\n" + + infrastructureLogging + ) + ); + } + + expect(deprecations).toEqual(config.deprecations || []); + + Promise.resolve().then(done); + }); + }); + }; + if (config.cache) { + // pre-compile to fill memory cache + const deprecationTracker = deprecationTracking.start(); + compiler.run(err => { + deprecationTracker(); + if (err) return done(err); + run(); + }); + } else { + run(); + } + }, + testConfig.cachedTimeout || + testConfig.timeout || + (config.cache ? 20000 : 60000) + ); + + it( + testName + " should load the compiled tests", + done => { + const esmContext = vm.createContext({ + it: _it, + expect, + process, + global, + URL, + Buffer, + setTimeout, + setImmediate, + nsObj: function (m) { + Object.defineProperty(m, Symbol.toStringTag, { + value: "Module" + }); + return m; + } + }); + cleanups.push(() => (esmContext.it = undefined)); + function _require(module, esmMode) { + if (module.startsWith("./")) { + const p = path.join(outputDirectory, module); + const content = fs.readFileSync(p, "utf-8"); + if (p.endsWith(".mjs")) { + let esm; + try { + esm = new vm.SourceTextModule(content, { + identifier: p, + context: esmContext, + initializeImportMeta: (meta, module) => { + meta.url = pathToFileURL(p).href; + }, + importModuleDynamically: async ( + specifier, + module + ) => { + const result = await _require( + specifier, + "evaluated" + ); + return await asModule(result, module.context); + } + }); + cleanups.push(() => (esmContext.it = undefined)); + } catch (e) { + console.log(e); + e.message += `\nwhile parsing ${p}`; + throw e; + } + if (esmMode === "unlinked") return esm; + return (async () => { + await esm.link(async (specifier, module) => { + return await asModule( + await _require(specifier, "unlinked"), + module.context, + true + ); + }); + // node.js 10 needs instantiate + if (esm.instantiate) esm.instantiate(); + await esm.evaluate(); + if (esmMode === "evaluated") return esm; + const ns = esm.namespace; + return ns.default && ns.default instanceof Promise + ? ns.default + : ns; + })(); + } else { + const fn = vm.runInThisContext( + "(function(require, module, exports, __dirname, __filename, it, expect) {" + + "global.expect = expect;" + + 'function nsObj(m) { Object.defineProperty(m, Symbol.toStringTag, { value: "Module" }); return m; }' + + content + + "\n})", + p + ); + const m = { + exports: {}, + webpackTestSuiteModule: true + }; + fn.call( + m.exports, + _require, + m, + m.exports, + outputDirectory, + p, + _it, + expect + ); + return m.exports; + } + } else return require(module); + } + _require.webpackTestSuiteRequire = true; + Promise.resolve() + .then(() => _require("./" + options.output.filename)) + .then(() => { + if (getNumberOfTests() === 0) + return done( + new Error("No tests exported by test case") + ); + done(); + }, done); + }, + 10000 + ); + + const { it: _it, getNumberOfTests } = createLazyTestEnv( + testConfig.timeout || 10000 + ); + }); + }); + }); + }); + }); +}; + +exports.describeCases = describeCases; diff --git a/packages/rspack/tests/__snapshots__/configCase.test.ts.snap b/packages/rspack/tests/__snapshots__/ConfigTestCases.basictest.js.snap similarity index 77% rename from packages/rspack/tests/__snapshots__/configCase.test.ts.snap rename to packages/rspack/tests/__snapshots__/ConfigTestCases.basictest.js.snap index 889a08e43e38..aa248c097fa3 100644 --- a/packages/rspack/tests/__snapshots__/configCase.test.ts.snap +++ b/packages/rspack/tests/__snapshots__/ConfigTestCases.basictest.js.snap @@ -1,48 +1,48 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP -exports[`configCases builtins css-auto exported tests css/auto can handle css module correctly 1`] = ` +exports[`ConfigTestCases builtins css-auto exported tests css/auto can handle css module correctly 1`] = ` { - "style": "index-module-css__style", + "style": "_5c2d5551d80e7ce1ba5f", } `; -exports[`configCases builtins css-modules-composes exported tests css modules composes 1`] = ` +exports[`ConfigTestCases builtins css-modules-composes exported tests css modules composes 1`] = ` { - "simple-bar": "index-css__simple-bar imported-simple-css__imported-simple", - "simple-foo": "index-css__simple-foo imported-simple-css__imported-simple", + "simple-bar": "_0e180c50fc723d21893f e45545294690ac1f111b", + "simple-foo": "_64c341554d21f0338d15 e45545294690ac1f111b", } `; -exports[`configCases builtins css-modules-composes-preprocessers exported tests css modules with css preprocessers 1`] = ` +exports[`ConfigTestCases builtins css-modules-composes-preprocessers exported tests css modules with css preprocessers 1`] = ` { - "class": "index-css__class less-file-less__lessClass", - "ghi": "index-css__ghi", - "other": "index-css__other scss-file-scss__scssClass", - "otherClassName": "index-css__otherClassName globalClassName", + "class": "df80f3b0f4e4a348c22a _4658e34db45b67e69001", + "ghi": "b40af806355ae2a77e71", + "other": "_5c221b4c6b52ae1c3f04 _64a6a8c8c9df5bc70d58", + "otherClassName": "e8f69e8c0cf8a7addae3 globalClassName", } `; -exports[`configCases builtins css-modules-composes-sass exported tests css modules in scss 1`] = ` +exports[`ConfigTestCases builtins css-modules-composes-sass exported tests css modules in scss 1`] = ` { - "bar": "index-scss__bar foo-scss__foo", + "bar": "ced11c340af4be27ae9a df69808451aa79e0bb0e", } `; -exports[`configCases builtins css-modules-dedupe exported tests css modules dedupe 1`] = ` +exports[`ConfigTestCases builtins css-modules-dedupe exported tests css modules dedupe 1`] = ` { - "backButton": "source-css__backButton buttons-secondary-button-css__secondaryButton buttons-button-css__button", - "nextButton": "source-css__nextButton buttons-primary-button-css__primaryButton buttons-button-css__button", + "backButton": "e584739154dc3b504aac _7b415a244cf0005470b1 _4370a95c3b5bb2e782b3", + "nextButton": "ef4e163a567c697d018d _2188a2bc321e703ef769 _4370a95c3b5bb2e782b3", } `; -exports[`configCases builtins css-modules-exports-only exported tests css modules exportsOnly 1`] = ` +exports[`ConfigTestCases builtins css-modules-exports-only exported tests css modules exportsOnly 1`] = ` { - "simple-bar": "index-css__simple-bar imported-simple-css__imported-simple", - "simple-foo": "index-css__simple-foo imported-simple-css__imported-simple", + "simple-bar": "_0e180c50fc723d21893f e45545294690ac1f111b", + "simple-foo": "_64c341554d21f0338d15 e45545294690ac1f111b", } `; -exports[`configCases builtins css-modules-local-ident-name-hash exported tests css modules localIdentName with hash 1`] = ` +exports[`ConfigTestCases builtins css-modules-local-ident-name-hash exported tests css modules localIdentName with hash 1`] = ` { "#": "_2d1f13069a34dadb8112", "##": "ae8301fd6f3598539bfd", @@ -95,7 +95,7 @@ exports[`configCases builtins css-modules-local-ident-name-hash exported tests c } `; -exports[`configCases builtins css-modules-local-ident-name-path exported tests css modules localIdentName with path 1`] = ` +exports[`ConfigTestCases builtins css-modules-local-ident-name-path exported tests css modules localIdentName with path 1`] = ` { "#": "src-index__#", "##": "src-index__##", @@ -148,85 +148,69 @@ exports[`configCases builtins css-modules-local-ident-name-path exported tests c } `; -exports[`configCases builtins css-modules-locals-convention-camelCase exported tests css modules localsConvention with camelCase 1`] = ` +exports[`ConfigTestCases builtins css-modules-locals-convention-camelCase exported tests css modules localsConvention with camelCase 1`] = ` { - "btn--info_is-disabled_1": "index-css__btn--info_is-disabled_1", - "btn-info_is-disabled": "index-css__btn-info_is-disabled", - "btnInfoIsDisabled": "index-css__btn-info_is-disabled", - "btnInfoIsDisabled1": "index-css__btn--info_is-disabled_1", - "fooBar": "index-css__foo_bar", - "foo_bar": "index-css__foo_bar", - "simple": "index-css__simple", + "btn--info_is-disabled_1": "be5d658eb22137a006e0", + "btn-info_is-disabled": "_779fe26757a96701fe9b", + "btnInfoIsDisabled": "_779fe26757a96701fe9b", + "btnInfoIsDisabled1": "be5d658eb22137a006e0", + "fooBar": "f6ab18360b31088c39ba", + "foo_bar": "f6ab18360b31088c39ba", + "simple": "a883f99892916cc2d8fd", } `; -exports[`configCases builtins css-modules-locals-convention-camelCaseOnly exported tests css modules localsConvention with camelCaseOnly 1`] = ` +exports[`ConfigTestCases builtins css-modules-locals-convention-camelCaseOnly exported tests css modules localsConvention with camelCaseOnly 1`] = ` { - "btnInfoIsDisabled": "index-css__btn-info_is-disabled", - "btnInfoIsDisabled1": "index-css__btn--info_is-disabled_1", - "fooBar": "index-css__foo_bar", - "simple": "index-css__simple", + "btnInfoIsDisabled": "_779fe26757a96701fe9b", + "btnInfoIsDisabled1": "be5d658eb22137a006e0", + "fooBar": "f6ab18360b31088c39ba", + "simple": "a883f99892916cc2d8fd", } `; -exports[`configCases builtins css-modules-locals-convention-dashes exported tests css modules localsConvention with dashes 1`] = ` +exports[`ConfigTestCases builtins css-modules-locals-convention-dashes exported tests css modules localsConvention with dashes 1`] = ` { - "btn--info_is-disabled_1": "index-css__btn--info_is-disabled_1", - "btn-info-is-disabled": "index-css__btn-info_is-disabled", - "btn-info-is-disabled-1": "index-css__btn--info_is-disabled_1", - "btn-info_is-disabled": "index-css__btn-info_is-disabled", - "foo-bar": "index-css__foo_bar", - "foo_bar": "index-css__foo_bar", - "simple": "index-css__simple", + "btn--info_is-disabled_1": "be5d658eb22137a006e0", + "btn-info-is-disabled": "_779fe26757a96701fe9b", + "btn-info-is-disabled-1": "be5d658eb22137a006e0", + "btn-info_is-disabled": "_779fe26757a96701fe9b", + "foo-bar": "f6ab18360b31088c39ba", + "foo_bar": "f6ab18360b31088c39ba", + "simple": "a883f99892916cc2d8fd", } `; -exports[`configCases builtins css-modules-pseudo exported tests css modules pseudo syntax 1`] = ` +exports[`ConfigTestCases builtins css-modules-pseudo exported tests css modules pseudo syntax 1`] = ` { - "bar": "index-css__bar", - "bav": "index-css__bav", - "foo": "index-css__foo", - "four": "index-css__four", - "one": "index-css__one", - "three": "index-css__three", - "two": "index-css__two", + "bar": "cacc1496e2b72da608be", + "bav": "db3f1cc506f178423160", + "foo": "e19c45648c68713ed25f", + "four": "f182e3b95198a17baa9e", + "one": "_6f07ddfd0780cc1659ae", + "three": "_3f1fe9cfd1b2534d3f7f", + "two": "eea2bec7b16040ba9d36", } `; -exports[`configCases builtins css-modules-simple exported tests css modules simple test 1`] = ` +exports[`ConfigTestCases builtins css-modules-simple exported tests css modules simple test 1`] = ` { - "style": "index-module-css__style", + "style": "_5c2d5551d80e7ce1ba5f", } `; -exports[`configCases chunk-index available-modules-order-index exported tests should compile 1`] = ` -"/* #region "./m.css" */ -/* -- type: css -*/ -.m { +exports[`ConfigTestCases chunk-index available-modules-order-index exported tests should compile 1`] = ` +".m { color: red; } -/* #endregion "./m.css" */ - -/* #region "./n.css" */ -/* -- type: css -*/ .n { color: blue; } -/* #endregion "./n.css" */ - " `; -exports[`configCases css urls exported tests css urls should works 1`] = ` -"/* #region "./urls.css" */ -/* -- type: css -*/ -/* @supports (background-image: url("unknown.png")) { +exports[`ConfigTestCases css urls exported tests css urls should works 1`] = ` +"/* @supports (background-image: url("unknown.png")) { div { a195: url("img.png"); } @@ -278,14 +262,12 @@ div { 50% 50%/191px no-repeat; } -/* #endregion "./urls.css" */ - " `; -exports[`configCases plugins chunk-modules exported tests chunk-modules 1`] = ` +exports[`ConfigTestCases plugins chunk-modules exported tests chunk-modules 1`] = ` { - "async": { + "515": { "entryModules": [], "modules": [ { @@ -295,7 +277,7 @@ exports[`configCases plugins chunk-modules exported tests chunk-modules 1`] = ` }, ], }, - "main": { + "909": { "entryModules": [ { "context": "", diff --git a/packages/rspack/tests/configCase.test.ts b/packages/rspack/tests/configCase.test.ts deleted file mode 100644 index bea33f1abdd2..000000000000 --- a/packages/rspack/tests/configCase.test.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { describeCases } from "./ConfigCase.template"; -describeCases({ - name: "configCases", - casePath: "configCases" -}); diff --git a/packages/rspack/tests/configCases/loader/issue-4838/a.js b/packages/rspack/tests/configCases/asset/data-url-condition/img.png similarity index 100% rename from packages/rspack/tests/configCases/loader/issue-4838/a.js rename to packages/rspack/tests/configCases/asset/data-url-condition/img.png diff --git a/packages/rspack/tests/configCases/asset/data-url-condition/index.js b/packages/rspack/tests/configCases/asset/data-url-condition/index.js index bf57175b1be0..d984261976f9 100644 --- a/packages/rspack/tests/configCases/asset/data-url-condition/index.js +++ b/packages/rspack/tests/configCases/asset/data-url-condition/index.js @@ -1,10 +1,5 @@ -import fs from "fs"; -import path from "path"; - -import LARGE from "./large.png"; +import IMG from "./img.png"; it("should inline the content if `rule.type` is sat to `asset` and the size of the asset doesn't exceeds the `dataUrlCondition.maxSize`", () => { - const png = fs.readFileSync(path.join(__dirname, "../large.png")); - expect(png.length <= 100 * 1024).toBeTruthy(); - expect(LARGE.startsWith("data:image/png;base64,")).toBeTruthy(); + expect(IMG.startsWith("data:image/png;base64,")).toBeTruthy(); }); diff --git a/packages/rspack/tests/configCases/asset/data-url-condition/large.png b/packages/rspack/tests/configCases/asset/data-url-condition/large.png deleted file mode 100644 index b74b839e2b868d2df9ea33cc1747eb7803d2d69c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 78117 zcmZU*2RxPG`#<855eJcU>?4~Zo9s;_+c|bw2Mt+Kl2x|MtgH|jku9>a zl0EHE_x=7~uakOuo#%e;`x@`-y586Ic%-eVLP^F-MnFJ7sft$AB_JSl1b-$- ziNXII&ZV}2zaXBvD)I#HzpyV65TFQD73FUGKvvR80!$2^p2jOD+8CCO`+pelXMfJn zF436-sqGTF;$nDLUhBd|obtXfj*JgWgUHI>4MQU0R{7TIcZCcS1q+PpHTO@ybSRkc z`Pw4gCIdZ#cmGInI&DqXE(EO))b5TyT$AFt!iR$5Khqx2EbYbH9b-62?zcX5Qnz2i z(3t=AsZ%3R{!Y-*%e{(2JG2A`ku9xHJk#-{LqPu5XM-8SY{`NXR>1nU{Sl#^U%}JCXaDPQ;OR0bg0^qfxZT$kU!8MHeG5}ue=r_ zH;gsQh*!Si+2Q}Y7798~i-BzGbOc2WydgMeV#f(_{QrF=f(G*yNm>LfI#FK1Jqv)<(`r^Ly$J8h6Mup-3SM2P31hY9e=icHZqK2a@XHF5v?22t_ zN&oM|z`rqKFpF+$)CrR=k!pqRBjP~X#5IZ=W>3#nYxIVWBU}zS8h7xwVF+OsjoqJY zPD!OEuwAKMogCWpYz__%YU;X=YyKX>=Ow21P{V@!ug$4*6A-SlcLXe!ktQxHr`)?q zU&`!~K`v$7V8Q+OOjt#lX|@VQ?KyG$9gX*)BDxU-O{=(6?n)sjaoHu_w&b>d{+|ZC6dLt+pSa>S4F2kFf)<07I9E#1UPs6> zHBs{H)D=2-lU*x;~%+q%T4omsnqlIXQ zRI?s{H~eJ!XGZQ}1eD^FWPh*H=`h$Ft4{*l@hD|4KbnS^=P0=55!DWKhy;97n(8)Ti1MiFqwPHcO3_lzZu3y}mES`?|Md5SyHV2d;=og9QoIm9 zX%Q&P-%NYgnZF)l-4=X4<2xZV#dFoHqs6Bsr+Ne&9lw<;{3wN!P^UmuN^mn{t@!CMOH%YHwHg;ghd zmejeucM4NdxmC5k&wKWL3=ynKr6)wwmL9+Sv^`X$?@L5?>%(YnWPeofx14dHR%fX< zjAlGTNi2f^u&mbW$vtNP#cW@Xnz@WSV{b(B=hweR>q?*b z>-E@;#sj>z5x1bp&Q4TF4gEkSMbFnII8-^z$Yc5jZmN-^RA@BGhyAaK_yZKFZqE?M z?-X?#W|8@3wy{@%GlU{;nU7NunoghFIQ#)+hG}A4Iid+t!I2(fbUl@a*Eex^pq0^B`5rh7c_doxJN>z(n>rAifL@=HxHF4|yDAz)bi>*tUz>>ko|U?M%Og51mDt z2e8Ehd(-D-P2fqcw2ju1Y!9Xg07SM6-nc6a|0I`5yKuz3$!x-tI{RN>{e%WS5Yy;$ z4X@)*w+M(+WSwq8d|{%}-~RZ@z?l^@nQH==+D21}mlW^dcZN8RN0v@ko7dn9#46rZ z(Zx*>>->w-I@EM%0_;##n}*1UKHs!a-9IQ20MPP|{=(5?{K@>lBSw8XlB&MwlE#*2 zK!5J%&?XayKbz$YhKhbc{>-I5b6+UrqmEj*nKc`@C59WL>STVwQ*2HM{p{*v9a=i~ zIMijKK*>2tpBDXf6Y)Ax{5>N|n1~e9-XXswZeJE=s)?KfVxlWEGIrSeNr*kXe$W5 zou`KJAJqNe_FWWMTqL{^b)9gN`u1zQT}pMQKHsIldS>OVnIE#vdG*?BDB&HeQ3M+B z+V*awHV3%n58Pr?ipFS?xcXe8<;S)`9L$7wTBWBUeqbVw1GGgOe0b|sgGxzNTetDkdS^hdaJkp9Z{3g_|qYqWrlzqWN>&=vbz3Iv*q?MIs}R5gpB>ng=QH6VP2eXw&}2ob$Roz(qR8$Yd$C*z zc=D}jUTx?jq{5V0-QXZ_HMVM75uHe!Qm{Bh+!_qQTWO*e#%(aMHw~X?R;d#tHGI^b z@yBt=m73^B;(g6a1GQT?LAg&kS-fN>@%IrCAlGoJNudNd0TK-}*vn8EQp;?qNjko1 z4(J>0ZN`o+k&%!|oz#>wpFYCpWW8~A;KC=0AO<-Rxx+jsL!GB_2Pie}d@=lHP}1RW zTzKUu<4W)O0Y*c_*T&LWWJj%rzA4`DUlZvqHi_>u-B&qWKZM(>|#`t&o z8j0@?hbKeqH=WORhc*PJu3PE!U4*U}L@p0P#4fg3qN9B^$I|;3+c6K<6XKt(AsFQB zsq2%82i(5*i_E>hMU3ZWJZRILo^t;zaTGgM5d5p;2-v~o>UBq8Ztm<5^}!P&bC+-#s+miN9s%kH z9$JCzY=x~h5C`fM8-_d0M1Oul8|n<%aV;+VI1mY*qmA)J!C+8(EsgYtWu z+L}0;hMM*Y_`{h&vOcRvZ|f#CLmDK9w{K1!kiu~;U&+4(HhBf2-Vq_k+4O-8BpY$9 zR)bm4u!$wIvLpd{URm7{#$Oy{qOC6C@ z`MUV)6$6bT(Fb?k0{QKA{U;iBZjjQCU8hKU4ty6a1JQJ)>wRJX5*T+J0l&#_$8I`OC}QV>r~^o%sJ1aSL_JP3+`A#nUQvZH6#nD``kLi71U6u?l+h@W%{y|3DbXP`P}Db5OSBp} zdP8J4*q{6M-A4-v#8(a=lkXi4sLwFOJ(eJna=5ST9X7D#jCTcO5xi`!&74A8sr4d$eVhE*7n403g?o9j zPqS=AS0JCQ)AM`zC~dRhWeu--3$5>TpCx1ndEi1}u$#b|66Fc#GcN0V)$e$TAWYJ| zc==IuqnV<}VAxP}7xYyErJ&zDKpoELDRfK5;$m3xXpJInf$tbqB~asVL)q{A>lA6e(dL+owc3hxMVw z_MYV`gvrO=-V@!)`il1a_&UU$*VOdUv6KH%DG^r1p7DCG3`E={+{yWq*s5g*$RFaL z|IMmFbpAz084Pf#j~<%*$y)AXq|>5o`MUgG-4a}zq}L@hytq{Kg4X(AI1_*v16xm{WFmc%J81;rV6+YQU% zGao3kT;_woXK0G5Ks!$|eVF06#!k3JsVHSBg~~@Fmf%e>pD<%QV0cEM_SWPY>=or1 zJxLjORnm8QYn+d+7V&lRcZu}z+oTZjojW(hY0_T!lM{j zu^X9UcL0`)#DHw0MLKL5hgpJ&%p?&H8H`$7`zXVq{OKHgu-GwYpsK!pK?i_AQLT5js{;XcDeI3ZEsA(L!4imM*PM?RRe1L`T^H28M)##ouR(XVb9sqmU?W}PRhioEnaa*O0Reyb!Tz)js=0BI*n9M0$|+5|ih;Eqb%~g|Fi8Pq zKgHUG=Xb~(j~|HlUzNcgI~hC4%iG<3ex0voxv0tVzZ6MlIB;Q#Qy-CN9lYUQ)7-}66b%2f0Uk2&r!_Vl@mY6@y}i8OrT()2Qm@uCF& z(r35PLj!UQm#8(nvjv}k1=X%+^zcK}31q3rt|J<-a|uz^FeJqx{YYdbJM9UwpNkxn zmYFr;d`0IDeikV~^5hSQfveanc1+15<>%UChM$q)t2Th%DZF=mb?8K%6A&L?#GUWk zaKpjp9dGsADyCjF3>$sv*(aVW9kcMJPkGw0SpM7y@$R~)7R9%rHxLwTu z>f9^7!S+ia`cv=#U(WoJd5LeD4??l|8WF6>QNS&hRv10J#)55$8rfy!*{zQWw0{~k z2iAPVhgrZl=Qf{+*S(p*lvAZlVq1Nn&lOt47i-(Od1L?Xk`IuI6=4>0O6W!tDD&VU zYAr0HmfJiu`$fUKiIj?azrOcxTKL@5k>%Mf!C{hMqZV0$ibf<8yUFnv63!&JJIw9B zq26Hna<$D#9iRF5DFR@O-}r5PcJSZG4!g`5&W?H-s^tjp=PB04GzdlBt#@+S9})EW zY@>R4dHSZt=*df)U0sKSx^0qGW{cK=&!(uq$J!me-8Nh&dXooOJ=6-m!uS$nhr|4a ziMU5jSZ6M((bRM@k6S54ecGj%w6BZA9kOP{hr`BswEG#JFck~jKgq%%_a^#7w%bq^ z3~_-hrL4UHHD&Dtagm7_15%Nh3Io5#eu*dsn8;nNPnI_$17sh!_(ny;F46jGO?-LG zw)A81o@DW|CaLocc7|A_G)HHt0I!2L@zk)Fd}nS^4l4D$5Af>Vmk3L5tj?$o3vj_I z_(rVJ_@WOFJXwK&(CcOtt39jhOXU- zlHYvLxRw0bR5OK|pVp265EA=qr!VD_@Bg$e-}9&2AON{3=OSM|8fr@0Xpu%$&Dk(T zzE2z0sZ$&Bb8~ljsEU(zC*zZBdF&8GuA#b+wm<-zL~n0T-FcnlXj6uf@m7LR2++P^ z-$px)M)Glkv@&zi)pG!P7ZZX0g}!bu;hQfMjb&LgwjJh(Q0^-cbRz~_iElS-@6noY zj3pP3_L;phnxMU)f=ggZ5c=Up0@WRxoJcrI=Y~a~;sv--C9q?AH>@MKi?pQ$lklruX8&ICelY0Ap@g3V2lN@@jHX;Yq z7$m=%{6U!)FbxR;-0*%KC&=0N;!+}J2&`y0aqL_N;ukK6LOQ?TGcPVE=a*Ai&~;iC zEy8g7Y?;_(;FXm$xvrF*PKU>vembapoHt%8$5}J4ajVQ$vW{oj?ti)Qp7WR{Pf=@H zQEbr)W=5o;E|a}ZpGZ#e5fSY zg|}bF-iQo9T6ajqFOi)ih-kBqOCAD#7dUo`QhHBLiW)(v6<5b7Kzr{gO6NcWn2}|cAWHi2+ui;14cKo+25A%rX6Tdy+%LWUztu1(ykZ^cp)C z9zEHkgtMz zJej_yENG-F69@Z&0No@;%`sA6s64MARYa$>jd>tCLq4n~JnFUzub|5j@2oIA-_NdU$1l2xD6<+hLJ^2Dt9yhA(?EzrK1?{t0LpF`U?{RCc3 z>$e&{4xJfu9FSg$l4W&pePE+9SN(1zJ|al$wqCvxbcfEqjcd7%u0e+U;T)mH5!-fS zdZyLnF1P=0^?JE>Me0TMbE=I#_+)yW=aRiNgaUmq?|gku2OT`HU18W@>R!;_H{JD_ z@KwSBzG>FYuN_{_Ty*brlntGvGhti#eo#o=g5czs!n9ZT>OIvOyC_h4-;ssx0+q#ag>5=PNf#qRT&v~!bkd{U+fZxd`? zZ|aEAMMa=!TtENH#{+NJm}twXqC(HMl`NFvUvaKZuB{ZVhQ8Vv5vj96iiv0D&H;Vb;Za3^#cZwDW@6nsZ}gQ( z>j#mSl2|QLBkKPa54@!AuN)L5wc$x{3vJcVBPOrGzLu17>2~Wtmv0(xosDTPYVKye zdruLij5}LY11j#q?OWC%T*TP?j>SRZZj1nqoH7{lJ^bo+(plNmh<8egMOZ%I8YuXm z%hx`|86d2>hn}RIlZ=>SQH)BBM|-edjRWoWMk*)?Yv?Al-?=XSgL5ppw&|V>wxn-E zJf`R}_jBeVK@ek^@O(3^Y=Hzw1LJ?=KsF@Wf%FuAV|(WvPZ2NAxKnsgo^seVJS%ZX zI_)c%TH>ZLl~V*TW7tu~gIYcES=ZNxS_*BxXT*&v=$s06HX5dX2U*Kj_z{EATG&zi z_tDXJrk*HkOGE99u3a^5o@TuIaH#A3u2+=848%vgc{xa;1xN#Ejn+Pm9G)VUIXi)0 zxrd=xRlygd_-}kuA{Xx-3=X>R0&oK!u;$APmoJ69k|VmS8{NnxVDmY%aPEVHoP)N6 ze#?QK>P2WvS)iy>m6o!tXU%LvoM31MYxys!u&o8MG!^MsM`;ycIB8a0m;J*CV#;4= z-|?)IA<9Z1Ce3*kpy=bzdf3PKjMzT=#i;6FG)Qc<@eC08(WX$p*C4kk2_P>b5DlYw6Ks~JJr={yR^vVXBKHEY_bjUADn8FjBhycLc~ZnbZnGwYDe?Y zHHHQw6e-K!0SZXfn#<`9Wz_TzCr@>KRFo^S|K6MSS&-Pq@lUs(R6IS$aX4H#91#{b zpfYfE=k%1Ur}AF+36V9X#7OrloqH50AtD<$OXq1D6=dn}6C%gRtIst{ex84zcb7MI zq_U=zH)M=a@xDR>Oa4WGEOZ;JSbiCcdCsj!LRt>zA7!nC$Isy$!35uC=6F*E=b{vRu!Q;f`>A#E&4125Uc0=iuup1*u zc1_PCR-YaiJ#*BrW6oD@Bkxr=Dtx8z1me^M=I?^HFX_NGL~e2o`!R1OD4He>dqiN~ zI}6L-T`jd`wfjOdkLT~Dd9}5<6d%XqOs@3_3=kh?KlHOx`F%ZzDFvUTr7R@SZQ zq@ss-N%;;Mk%bQsS=W58>XA-EWZ7R`cKZc-gX&Aknp?R_e3epB9XXfBkp0q-PelNW z*ac|9{I_fJ$C~6XVWj^{Cy$gFLm${HK7r7xenx=Y)V1C6(Wdpf)STgE8_V3m~Pr57t)i-j~2c*OrNSYcHxWq>fK!b zWCG65ObYtbk;4e9N3AB%){)4aD|Gt3mw&63MR;4|OLa&noZX({^B;8b@kv%DlE;)3 z?6gg;rQx1tF}vu*S-zEqug#JOeiVU3FmmH=$3UNUYPI~Dz? zS-jnYwhXhK^`99aNvDF44d_PP8l#gReDotUaF@Y4rj>ofE1n+2u-{bWI)O4?p4_LA zl?AD@OfJ^bPbEIUUx=W^R-<{LKM=Vh$4Uzl!fd$~ zVL5NhFB|mf*Ut(F>@4Y`Mz=gP1A&Pw6uJV2I0&q(1fEphRu%7*Fd%7Zk~gY8a$Yi} zF)wSlc2SSmruCt#))ymf)+ez;cMUDLu@~SJy*r&NGqNlRJ$bjEbd1XuGLVfE`*Lz0 zSKnXsb}K%~15=n=gMN`99L>=m1IT&Q0#z^So2BN}u`{`12=+AVC>xT$eOKb6|?^QZ94Tz6$XlEB+1OewW78;G)^-QlG6^PM$+L)dH z3PaYMuqvVkVz-T{NQjP~Enf1u0X9mv!2sZcd4Y4Qt870=D$0uwUzJNmtQn6*UtM97 zCb?>6b;y1 zV4@{Zlv8zBW(!z?L>OVe$81eL&tt#_Vp@3wfdN(FlA|Zv}t$;$W9}u195|%{D@_ zHMwHp@0*{qT~+aA5G^kw+~a`rg#z!f*0$wnr)g9ulAJr-)8!SMAeagCq2TrmvTupG z=L;H8lMBz&E7Hu82gC+J2G!^UGs5X@2Exqzh^VrQKO1U7>n zPbo`2KH4<0L|roS54vI2_Rygy^&NhmC-slfHmoHv zf2Ri<4WZ0jHhK?Gcw+eh`XO{3&G-jyLVV63Ydr%KBVlgpxM&0Nqq=c_;$Lx*210WJ z+8#`EYB*%*P=!$iW8s{T5c%h_5lI~ksm)nHLP0yv_Yv=IwxS;bW;tUe?`_31lLL>T z9M2SC1#heOf2`1&CI&OAeC~8$T}^0ILtHEYr@m~*>2%=)?xlRGRV_4LlMwSKNzg-@6CCtAE;(YI)?Te%~?xbX{ zyeID*l#{I{P3-*npzON3wJ2aWe7|1at0RY(?Y?*~vMrWMa5~qs#`U_QB{cWu9OOdv zKVo@H?OJf}pSxLa5^UX7bnpWXbl2iAIVy%&#3t`gIn-6CvY3PBUBc$vJ!@vznFF6$>bV4rf63 zYfjhz@PHb$d-E4o9@<*`0%1cp0!7sSwk`yD$&EMt7G-}vzB?*{3}7#1@ysp2lcTIk zm~Ztu6PE8qeX7z3S2;sAxUF0z!^H>CmgEVjit-nSeH81L@>TGiX%9fVdR;oCWnPwF zF-?^i5im6Ii%+#l)Rdv$?rsTi6vER)6)vjz&xd@H2~G=djQe(Kb5K9Y!l~#CD}#=s zH7dR=PFj)Jf7b%RelbSbD2>J!AToYV0Y$L3;&hpC6GmrS;D7!3g3MRnVN{n!vhfWl z%MW;LUbYhm=+zOEE02F~bcBpU1$R-dVcDtgO6o@|tgOv+XrH`IDE3nkjCAl{hgE{6 zO`|?E#r9`lwy`hqEXtC1x5#%|wohv4A)+RD)%J{H{x3t{NH}{FWl1t8hvs~gtcr^K zu^L6N1KY`Zr>H0rOVI{$bI_Bv5XQE=$IJjBgcYO}=AH$ye=!nOp78+5of9s*3v`{6=rVZxb zke$ntL_AZQ0~S#Ftg+POP{9cGt9P~XpIHMJOr#k9w7j9sOzBHk^De~1_Ep?qUTCAG z;+`LQ!bju}gY!JWXVnG1z_5dfyzk0cjsvZ0T#nK}1yJ_%efuibz+I+}3wRDH4xe;f zyXSeiQ2{}+X=PtUzS)37l15`;MkU+M9)==yrwFcukNCnA|3R=qU5fh{c{RH9K*0Qv z@y!U?Z6d3@aBmnuMcfWAn(O(t<+c#M8s`c4kl)4?$T~-!8!S0zM>B`STc(?UvQ_jfJ=6<3RQIUT(+YK(htc zh$WQ=i71e6(jiiB6P@(g$-k_?*>Uq~^vBk)tD*kP+QW*dX*$(-{r-D?E%*~8(a-bD zPJeDe`={6cQun#!bANE+$t`(Ke9=m<8-_yT%Ym^ z&ol4E)6Bgrtbs&Fa=W49)aO4afa#fWW7ZeHjuqs5Ilrd*v3RNKhGB9Z80y4f zc-@PpuwKGfG7uXq_IWc$>qAl*0?3?151=GQN$E1JPh4)&bHDoT3(t9zCS7D5wE@&J zBW<-;=6Jw0#G<5v_!}dwjZQ!7Tx%cl&$rA2IgjeS=K}-&Z&DSG36pwA*!l^bY_RzQcv>l zxGe!ZS<&L5srC-{lT+&z(}5e#h9=)6^Zca;loo>5Ejh1|yqs!35uaFVPK3ht-adz> zN8Rk^#!bDtmRLvCSt)P?ZSsd;y(kwl? z{zKY6&uut}FiYjBKuw|ld57Ewz3q!rKjMp-=4>xilWe+>20o!&E%C0qW~@U?A;3Oi z*7CtV!kZpn`JEv;N^Ga7J|1~BMJT5@VSd!ZNBu~r{^v*X@6l2}G^7oXI;zVIe`h;I z*Df5*1VV4EVq{>JgIu$IiwfbDyoukEKxe9y2f=C?{ht>A>Xgs=Q%naxw_jmybH`HP z%OKZ15$o&oF{ieGWiHkOelFd5Z|(V>RV`^LGwVml3;XvugN4iqWf=;vchynZZ)hw2 zZ|C9uMyk1gNb_KgRnB@5J`JfD#7OSvwPd+3(sZy3Zfl>~ml3z@Y zzb8}qd~lt|wmzc6@LW`8>t9d0dpF`&$(+DG6dz2@WBXqxyhLvw9$uM?L}*!! z5BzOQNzEA`YOj8%BTsaxYkPJXtz zDVncqa8ced#}qb?{}El!b&1ab(=FQOv+>qEgVju%ETMz1E~V4tDt;-tElS|+ylv2AP2>Jo#==oBkE=%9Q zUQ0*lILRGkl1wa;@F4s0xfGh2WkSW8e)~9Nf6c2;>mX!|KWs~u} z(~x{gxf4>BABn7m5@b+++Ro*RiseQW2JI4S3eh3V)MrH*IKLJAiFhQ9^C#g`)IrMV zj#Y5`%NRZp2BTwmDXr(X%Q1s}&^G`hI@4oPkJWGQBj#%O40@LD@o7Jnv!QKXeQx22 z{0~ClP`&UKx8#9`-Y_aE;8C)ZI9?bP;IC%QcAqYYP-28_Hu9jFceSO%^ zy!xQ;?+Ho3G*@)u0{*=L@M%=VccV5r8I@nQ?u5KjPH_?-nm>U^M;>!p3(upc!mVqH zbRC^QPo?RkmGa1~s!sWS0CWFTQ@+mb4e-N)Bg5 z)--_@iP7=$;ky0Bk5xj{e4{sT$C^E=bLb|;(abJlli|OHfbqq5s`A>SG=PI$v8{Q;!7a+i{Y8 z=a{#f8+`PA9XipUp}J8$o&O3PAje65j8w970lagq2B)r2>a3BH-n1*8^KjYgLKS=9 zTVaVc`NjnKfpZe7H$Un`mrA;a{*+s5nn_7WS2lVwK7OrG3b6?S0pOVj(4Mae?+X0W z`ZaVWhlAI%r+5s3zm9FChsjb4KD-A;+p~)VkP;{WAp%RVarGsd3HCgA0eC$qeU9N| z^gNW6#nJRmyKK2e6!V*e*Z(6$-6WKPKYE^hql=sf&um=BmnM{y;(L>v-S3Jb`>3Q; zpVMkfV%!N$!_D0=M{v>dRE7P^&*3Xdin(t=5q{N#LtOX&Q8NeZbBe+yS^sLCrwF2A z)w}%r>^pYi<5TE&O!dxFPPgdS%bxK@0zMuCY1pD*h-Kxr=3esFQ)P@1OtL*xV?5GU zw?UifAHJa_u%@6VMQ+d$UHs7H(oXUAk6%&N59JEC(mCw~{ zyqC+_7As1+=@d{wB+t8gK_ch)1BCV^ax+O8^D4pCXkDA@-@@*Zn4BrYSfosfi2r41 zd|!K8dQeo!x8U~Q#v&xa%%UP~o_YuFtd5Ij;|wow>oW~tBJ3u3@qkAC3ae@G9UCA? z7je1O>-0m}n*ZDe1r?&RZw|8zdUTWhZXv0IAHL}Ur*sQhX&qm?E-fi(Hp_RxzCJ60 zO>Qd9C3G>h9HMIR<AmsT#Ub1VDtY{cSR3hTFzQt}Jt1k2QNvOib@_1VusV&}5=`@G6T{_A=8w=^;{ zWuu!{mFnBIE z_{RKN{4e%N8`DIydhrNWX-T&G0;IoWkv-A28e>U82HVBW`Z7|_pOO4@kU>8j{(W^+ zAx$RztULj+a{2FXaHk zyPZ9ob}1O>T7-)AV~p#OlDDr0$_a;loTQc9(k&6e=IbZ4k}{Mw zV1?r9&Z8S`p@vHiqC~2WZxO2R*e*v!(o$-MGCDLu@G-+5Zhg>i&6=T*f@F(759p!A zTuHUlrT1(S)xOyy_OZNPf#fj8fwII=V6iCQZ84qn^|i`KD{h_oDb6&7W&` z7KY5_I5AD%aF-}G9@SD4rwBC$vD~M&zMJo*d8v}{@SzR;PF7w*PO2|nA}irwMvKLO8R!h5I`4ML34n%2P%xT_V|5 z_jZA@;3@ScGlhf}-@T1b=|sG%vzP;f;sl2w1%ENUTkkWA*6OTuw?2wB{(NO<92n`i zV7K$@uE&=i_wq{y!WmOEiEl<88V`M5NH5@M`m72H%A^Ax5ju)W2r;qpeU{j~q4kh^ zfQ#YKI~TKPQx0^YK^SJANkhrpd`|=$O6u@VD(Z8Jl;zc`RKVI_)3h*oPfVuzyvZ=m zz($ei;M3TBzC@STHS~DfkEl5o;UP``c zZ-h{euk&g@)C3Ov9NQjCAj4stV1B%6JFOk$OWQZ9-$T@cT02%Q2S*&ih>d+W3)Vj> zzormpwol1E;E$TW**7-?RAL`$n!{Z%Y^6(Qkx8TA|Hv@`^9P2!xN=@WT4LzBdFsA6 z(z0Xt$O%vmbaQ22kEmWp@J-V|V((vf@~Khp7I(~F)ppYRQMzp(K5um*PEo0^XJp+y zLCCu*h5>D!w2SV!?T=uCC3a34H1r9X$ge#Mim0Oq*cEPE_?_8{p#k@4VW&1yai|BW zh-oxx^VgD#J3H$M8mdprob(!AHeeHVer@_j zv)m^RhIHca^Nc=t0?R@G>$TEy%??BD_B9}}Cy-g79`1Geem>!fOHPxw?p+x`bUY#8 zKfX^TzhAH`r%6U~_g2Z8aoo;$%tzx@+gcN`L5s{-rIz*Z0L~vNoUYBgwzFUM z5Sg&-+Zp2MSBt6-7ou+=6kwUkTX{MUK?)w@%?uj`Yk}rD8)9*dJX1 zu8>mJjSUuNXK7RKIzF4N@Pr-Oa>YMcrqe#rcje+qR|d#FTN^uIAxALpzDA}2qgF44oq<`P#z_w*yq2asbVg_E>M_}=ocTY4% zY(n8{G@}u;(>pltKFq!!!`m8g;!XXy;XIasKeN|-qE_NuV&_7Uf!_h;g?w6`UFkQ) zym&N(Xz#V-+!U&0r*E&HpRS1wnmfu{?AUKPHvuE~2?AXxOr)dZ#j*4_yC+LRcLis+ z8)>Jm5At@!=4y&ldgEg}ib!qPS5dePe^GvdX4IlVb==q&oO6wNBmU^ywXBB_{sZYx z!StKKI5`?d1-LyKc=h;Q>gZUtN;7_Bl5biD>ru^mfzOm!tUdlu@#|bU4P?)qJpVAZ zQHNqBY)m8$b&HOIau4zb%N$Wc-yUQ-+_A!MpP*EX7_Xj0gY7n5gJM<}j$|%U395 z^W)9}>7UPh7P1gZ^1zGZj$c9wc%%1WDL8%`DQFxhAg*dW-k(sSRBfb%F1c&n){z4a}$T)VV3&s5xdY?1#o>mo>{AS3?41|+#+)!LRv+_5VxN9a zKxE|7kFV0Uc$i(Yu7bbvg>C-Gd$Pb6iDGN}BkrDV7@ua}J(R>g4}LF(I&bFXk_D=b zaFX3g6J4=){`bBuSm>#Qb@bb^I$v#>h4bNfV9542Yv!pqwm(Q&B~qXFED!qjTswG0 zMvSb!%I0uJBUfwyp zHK%Pfr^U-t@<{8+astK*=ErThgIqCBjmhL4`P_C-7Gi4ZPj#P(qLR=wZ_L4<8P(MU z|Df=Zx^r#WI%r)MyrrXO@+ik{sU{M2^S7z`^08iQZmg{R^Y-)D#7P$KaFqf#CPT7^=m*iCu4RM)fIA`$M)%qxs+Biq^uyH~b-=n6Z@9fa! z%~x$N_?6ytMN5GfAkc^x0A)h*3*PFH9A-Z^m3VX;S>C0vzWSVLm^~3C;M=CW)s;B* zJ_GTx&ONzNtRr8SYIwKRM((2PU_uCf3QQTwI}N?bCbZGA1YLi+CX9W>n)@4o>8Xjs z;lc(Hn3D|3I|Oga-=*NkO=a%)L3LX+=7@Lc?(jlDx0jpqOQ<)CzJ{l0T0#4#%aR{R ze*Qk+x*4g|+CP|+5ML{77uWHWE7g6VD~D# z#^LtO79nqK-qrT_!bY-Rhx7$+@&nhBOUcB9E_AZnPsf56nXb&!<)Tnp;(b-O99_A< z+@5<%W2 z=l!xja2?iKd##y!?wK_+dnrO9!k7I^h^VM;QY#P}_F``b4<1y0;Ou2NpMsoqAJ7b{ zQ%+T{rezIPXW*WDt%IIW9<7yxWjAiG zS+vxPr!6i*>C2J)gpae^OTKmX#sWFZ0av|ka3vuT!<9C1k9w-LOOJAGhaUtxJq7a? zI|By>^Vd*rAB%fKo5U8rvMCKM6lIijr)}5CX^C1Hbk@ZHBiL1>tMh;Q9~_&05e{ed z7QUCtW+?COD3UDZt{_~H1PUgJfef9YbV8@w60a-tl4MMd4)7u^-I>K}sYd5K`8E#2 zFb|6v{JmsjRlWlnm(VgF-c6Ow1*2C*ek&?1_{c5+9a!`a!(vahXdyW*RfQ2sT0KL@gvc!zdCRBCy#}C*SgNZ>?8Ww8*d9lbQC9O{H#kxrH|) zENFt-%&H4_S=PliceHvQQaBuW7o}kPu<(Dz2mF1nO|xnDyzohH=@t@@#Jj|6K0UlN zRQY4RV7=kR!!Ds@eg*dj?GTeIx7-sh3jt|dA|e@chG_nTKu!B8eUEZ0kFGcP*toi| zrprJxoJ_^M<~z)IUYd!fB#;8L5ry&%7p+dn3BLak%ZK1OJ9Ar1@D1m_K#kAWnlZ4w zuiya{P~LDM6to#yN!lTX7t6mTYq#1A&*CkfySR*{{Me{YaCS6rxJAb*CV7I^%wby~ z-A40!W=#bRi)8w!%U6Od7wHD5d?5Bao9*wOhaM#Y<*Q}|)YX*u#&n4_>UhXM#mR77 zTWBmMz93Qj(o|-Xyc9lpJ1A{|DcRv`y^`d7gs3Wyw4>j>)B_+=`PXnP^{IaTDHTUP zB59zm{^Cbqr-KN28nH1 z=KBjH(j*Fug0(wa+^zjw!>3^(xi3d(F85=mR-AogO2T6NaQemFp8?821ihDkS|z8q zx3RgK4U^wayWi)++Ds~z0{anzmMKfCir4pQolOWuq@2Ja0D;`f(&XHb8gZoGe>ZRK*tu^WZMmB_ilh z%}dPPY%IAR_QS^Qx=Si2IETteu7^**Y3sa;D`gi#o~T_dx=#zIhM|svw9YCyoUmV2 zkjvpp8vyCS(r-rdPW9e)==JQX1se<=MEN8j8R-YsVtkEdSh6hT9`pKC4qjRKs_*E~ z0fV&ReICDoJ>xCna`q?pzCOQ+MNLH>`OM?>DF;N0UU6T*k_hhu$ssqPIlq6g=ID$e z>4N#8aQ3~pyxGf--a#B1yiI?4qSvo3mL+^poIFer$9ppnONSwqoQ@4c>3nh{G;cTS zh_lsHjVRt$wSBIqBmrGRU(BRg!JKj6A(Da>$Hq@e#T{wqXu{MjC-J9Vd7e-RO-M`f9ym?aT>odkDwcrxSvt_C_qXHa2C1wG0GKR(8zOvw7mqb8E4Lv$5jDaqe zGW_1|h@B|#M=X5*AXV1DTO%$N3@f_*6_@8F5AIja;?P|rE$0!e#`7d(7JXYM2ilze zF931Mc1r=A(P}YL{TIp>;^PJ+ydS-qT>lOL;_(>Bkqy084LoDG?(%_x`?yO=KPWlR zP^iyPl8hP&?e~6=Eqh_PC&EI=Ly~Pq)G*?KQWjI}auC{~{zF$ywB2O3JdQzCvQc*!EGu0r-*R zkSU5WMBlJuq3Z8Z^V%y^*R9D+Cr1TRrE-pi>;RhBZ5)0&n;sGi6$`B?+%?!?p?5mo zG{~1-9;u7z5JX1nGRSWdju_2typn&v{2UmdaqYqL+Px^3SY(WwEltH5FOc zOZHtjpr8mW{PabjL?}vok9K3vo6ubQ3$IVVGHNttX_mj&rS_*k*HlqOAhziI0Q?z+ zZf+>`ndSe`1T!==w-Mb{T#cC8w)Zr}wj)|SAH%lh9S&1ldnP5BDs`VaPIDknv`;q3 z1K(uSpDw3Ko zB9yj6{>^3l3au{K?kZ?$Q^gW&mE`RpDheiaNQVJJ&OXW@HpD%)O|sUpF5;Xo4!~Jw zlkZ`DYNsMwv>>40G-Z4cM4khK?b{1Z9`I4^+gs|ZrH&J0ncOQ$!+ZE)?`W=L@i2U) zH(dzkM;X(}mbEM1-FM7_*&g9uM&}1=zHg=}CyimR%ScxDfJM`02_|%+8v;cxI zS@|9!K#Cz?oo`86D0qFW>-(mf^DY@W$F8)xD!5Z~GY;8{#X@3jKlCU$N8ZtSRv(@r zn+Mb%g@j~SaudgqWz!LPrYmy4-u(cBzUnQol2dqZ$kc2=CmI?Npy8ZzF`R_(I+It- zIqrt{rFBm7GDAp_<|f`b%I4AVTN!qP(<9zj`VTg31}Pr;cM=1B?oqN^%q=zv1`k^t zpk%jHtJ+{6Yu20oQ-{6Pp*)qoB^AJC3+El<7gsdZr`_uQ6CoIRtg*K(=M_JkKY9Fd zU%agPY@YOZwg@kJHWlJKvArXpCBIamVE2$=*?7JXd^T>6;4Zr5x2HZq90L$$ZV}7` zzfW8K5&%OW%<{$sn%8gxeb9OaQUWw;*7g@gaVefrRj;$CdpBMfPyW`e5yDmGWi{QZ zt;^_W>=0&`1YMj4z6JdXmF@Z*-|e^~j`6~c*NP<=vt}iH$zp$9akBT(g1@6*NwR|- zAR%v=Nf;vt+5BiUrj~(h6!Wj*7F08^DI+4yw)O6u#Q;5zI(3>TahO%-K?+{8xN?4Fl(D#H>6 zJRd%pvB0@^TAdq6zH$Lz>hn@q_(;=wW3aDi3zF-*mtZ297QKV*JfI4f7L@TG7t zxhBR8??~cXs&p`dO8&F^f<)u(;CB`z_j${Y5|^~a`XyFtP*8GHs?{YK$R(frK^**vr4;JV@x$zyj;-4*eE zPv{hFRB}8y=Wjwv-Q-UiY#KSTxiC5{K!rN3(*E4kk!3L=(#1hM0u$7Mn|-tnn`=E) zSeOA@f}Ll&Yr^NyW^MaHmftJ+ z>T=YQ7Nh(^ddy)>&_<(4bvPxzrE_%fVDKO?bpo{Hn7qF1WM0o1IY%E&0M2HVQM`h2 zu~#o}U{XPvO%I54NIqR+d2+OL8E!mV($YgIR41xtCiE5MeHc3?GM{IKbh zpSk^J2bbQm_~bza4WAr{hM=&PTYQ4(2dxzpI~(53adQ1${X%{HdmzE{tt{>;jOE<` z((cD=Zym0$*3E7|!VVK0tGbo;uL*Z7_;F=t!3zzhNs2%&@=qZ$yn9r}Zi+qi$3r6D z*f}`1sgwY1>??aL#ws6g4l{XZ^w{=VJ4f7}|05EhDl5c2XQm&zc) zptIOL=4Nm8&KpvXR^7}EtFcWZ4QpZ*a`%f)`Yp+~1TBMD9GJN5GR@@JejOQnhXQ$@ zCbwQLj4bI6x*y^rjYD7NZ_^YsT2li9BS zYym8m*~UG$tz$J)<4#b5GRSQ*BIlz}Wg-^1R4s zzolXcTzokIg2Ee@a8w-KygHCjN`2|%B%pcp5rTH8e*Z9qZ3j?CW7{(A@`~sX<`hK} zxG)aEdg=x@(ki=aaMph7R7K`gB@WRTC#+5{$YxG!52UhS2-{sXi8b&^TTJt3 zpz%t?$3|zs2P!t*|0J&C1N277pgVp3-l@=dw2#bE)UM6SH|*Pl;i|xnXI}gSl-j7?_iYm>;`%ru}$%f%ZkVGg^Aw4+Xm*Wwj{WPH*M?dHCReC0ipdih`!1{=_82?AJk0)g8>z*Xy)!E|3HMeyoBz zyodLtWGcU0V5%mA{0#<|T|<1a8>!;@vkc`JQFbRA8X6uMUZ@qEu)d=-7v91uM?&%p z!&D&XwU{1o3wpcqc4IRXFEUPM=&9eL!nO&7O+j!&r(ci5wD}6g6V;1nC9RM%)at&I zq+_oaNX={%;>UJ0r!PXc?Hm(Hb?BA=ebJ%(0%H5Jeak$;w&VphCeJZXdN@ml_dmM` zd2Kc;Yer9{2Lq{utKJ&1pzZG)B{2}Ph_o`0tVSS4mXgGIUWugcPG6#7=F_~+1YD3h zk_s0n*qqQj36**_M#64CAk$U1&Y+t0yv^kb^Aq)(*?8Vd_gTMbSEsF^colDnG&L{q zJ8cCjM+TQyKz|K?5FOl+Vch8ybImiGtizTnqAY{Y#RT5BNJLj#AYxj zJI)zUXjbrO7D-Aj?y2vswK-m!Wx9fgzT=${UF@df(4Zeag{1i67pd7uKdnXldG77C zYxK5;#7)%@Uot#P0|m+r+a;YY-5g(N&PAc4YGq%@|eT*&pSfE>Wx3i$=G~0;|XEV3I(BM4` z6>zRj^{uL~3v90pZoGO37jN7zK_wZGE zs>-mzFRg)+Kz3CVTbitWgR@Me4D*Q}8viUC_w8|@EhklELp5=l{C??P1a;`SRGJE~ zX-=$&tY|QaZ%$`#umT;b#;xKWVk0@HzQQdF+T%VrvctKD+*PK%(m)Ibn)%HuOFQ@D zteu87AejcOhGMNaqhxU}{L#RMQP!BH!5mp-DlcJ*C&L3%sNG1ye!<3vCQ#SwuL)Jdo0BDorBgmEty8`1YZ>6O^0`k5PtPdv6y*2<5%F?_@>ab_moQqoCIw@8aJyo1)bQEf`{z zT60)GbgD<&DBf3-aJGr%EcDBc6fTb=n=Uhpe3{VWtGj6<4YxeL`q+5A>@iSo%5!J& z1oUG9t{EMqyS%lS|6^eLHUnfHe(A^5y7}${OMP*G)UC%Oho-!mn~?tQiBkL{bXZsecW@t|N0> z9#|pdT0(DW(Favk2%7L*`RWFFuGjgkbB|3`Vlt>)>k*mw-Y@8dxOeuisR3AG;6Gq9TpzAk;=t1`%X8CfLGZL(rjflQmqDte0f^< z#_k1I)|>(E)1PYN}FSGmmc946N9kw3wa=*!3e z?q3FKjP31mW-&N#w>U}P46@Qm=V){0zGQU+sSt-9mW>-p$Y*;k)rYBcTG~P<>+ea+YBQ|*5y7&^J;UJr+dJ<_B&?_H9N@EiNXKkB7% zvf2B5$8PM|jHllG{*-SJVHR3%Lr}Ls4<0NKM)t6f0eZe^KB~dvm;s8pgg5|yIqZ9f zzNmPmFDkFfYrZhW9Yg&V3GIjG3EEJWxaghLz)H8>Xo|j9*Ryg?+{TvFX#R= zez`fk_9Zva#6shJdKegmm?$JKYtBa$!IO0f*WufGdO%X&F%>O(EfR`0awDdI0F3!AFvsGHN5#;+YrZ7WdT12J?2Z2X1# z1P>rJ#)A1v?$OVa>-{r8K&wnRtxOoX^lYsYM_VjshDhU zZj63`87~VnkBq-frEKh)o#lZ#Q1XC?v#XgB=H6Au!^WA>v}Z0*BLMZg4!`&=Yyp0% zXi$5q+4NznH}r=9cZy`j$SEB3w8XZXA(M!CmPF0wYUC3K1)aDSBZXyUeJ82pSiz3A zpKxWYT#-vck$F_mDjotI9%qROB~H2qbc5Ja0e-fdQpXg?~RD_MnJ8>C2i?{Gu1_*zo_F~adg zL;hS>A?|xwU}ii-evJL5=9fw9+rpy13Z`^ zWFzC7&7p*d7@N^|bdOaG1VND(uAAY#xGm#IR9sbQTlLCchfl)s?+F_Y9$>CO#~**7 z9>X?pt2F;Sj||ZGTA$C2*a)cE`-`rp+R(t8%^#4f&EEHB82+9yL#G3O_+Ut|@;2U0 z!gN9(=&+0Ki#33|?c1|RhPTn>fawQRtq*HAJ@vzCt3ip!Ud)$?p{hV5D|hjZXnx0m zc}fQ~7gX;t&-ERB`nES>8c^y^2@AFzM%=yggXQ)-|f$rJz5P}itHy=c1( z&RV=*o{n0`X}MW0y*!an^8r6vvFnvygyV68)}gR(@&=i7ixqqM>c@sTYw$je(#ith zO&?x4ZFkWSm`CGA439rrTs@H2Z(zFS>U;M`x1H|iH%%A0X9rvlR~s4H<&QvFeZ1w#7Wuz(xVxWQXiCzi zX4Cv{tki;L?+XSh{DBBt-%4`tvr$%N-WWxBFH>i7)C$y3M)evMecZgO`1^*?ClJlbns zeE~mWv%%Ea@qe@XP=f9*q!MgKh;g8nnpN1OCI47l zpsIh8a*1bxXf8e>ppDQ2ijh3OK5d|Mm%Qvq=+mo-JY`luV!xR5>^qCbPMs8?y1#$I zhaP*O1LfjZ)wfkh-=V<3Sbq%NxtOgty=wR>l17DI3Um9IWpH~w0XMPqF34jTU^ze^ zEgpzc;C4S|dGdSJv`@@?j?LPc)?XBSOIv`@0HL-zo=m=h+_#}DGlDx${X$MkKS0#) z_pl8gb=amTWDk95yS7ffRRm2n2L(j3C#I8=ICv2QB|Sa$)2|`WmM`H;v-@&?mx_ef zZSR%QCHlMm6}|;vH5eH@+xqpNi)|5ReL0&_Q0?Ec4KA^%x0exUO-DG9N@#;_O4)SX z6*P62i-?yubxbHoubh*Uv%AhKgucRurs87k2)<6|hV!lEOC$1 zU?7OKN^!RO)grC*!PRp`RCw4>KL0E86h;4N$6$mQewCTA$%mD)+_UX%um0Ao#xct? z*T|*OgOL3$07Y?U#M=J+tNy^3%}@=HZ}S*)=HE7fi(ty4|B7meFuHE#PvII|kJ z*&E!Z&gL?kiy!NF4`HANx(kP51@kKNCB9(Th%B}6(Q~yk>8Y~H4qRXQp%8AA9~v1B zNC*li5`YS-uZ^gS;L)rtEnQe>QYcn=v?#7ySePl&Hm`U0MS~%L4Ot^Y)(;>+^26%C z5gZLIR7o6Y9dKVg=S`1H*NeGdv2WWMZoPJ0wNLBYwJNPS(&nAY1mQ%tsJO{{Gpa!K z3ueZMrg~Br=ooONIj06jFEAFQQDW>nj;FTleU3`iB1Q*~uL z+`Xy~`Uk&pA6o=PXTOSfO@zKnb)rW3p3C)ZC`WU6%G;cz#=Z94!v3&^HzeQ{ED}g- z?WRq8E8u(21RXE;8s+2ax_ZzzA)h1t#cyw8JeMpFI-{G4j5DnHZH;AP;x%2Q1zD|v zD)gGz^RXcs7E?T@pBO>r3@vqXUO&sq>l|mwN{TcaWpzCqxHmPlf2`MkQ$3(BwfPc4 zX9J%;+z}^Vv=xysWc+u(G~F}So80FWEC$lA-PhOl7(;(UzG?ooOjwZ9hUeB)ZTWq< zUX))95S8FAh8PBKjI^)sr{>~jJ2~CI^^*UC}nE9NZnFxv;`A!E` zD_|Eaxe6pL+sxg4>ZGhT$Vp$>a$peA)KaE%HuvGU-3VvMr_{v;zk;EKkJ&KXT+DXs zuNS+DGE!yv>cKNv+qB=a68jia+h`(HLtKg{*G$v!{p0bN&%6|IYcY(y0;|KZ84dE( z71hS%Ni%*yt&Aw7jd>nHJwfNE<-Gqi>|PLFo=aU6d`<_TdfAVvN4^Otvku8dE-T5;xhKiIC(nz$;_;t07s$dx}e}`KMMR zok<9NmJ}AE(O}f=pp^i}PFbt@SckDVW7r&HY&(e&J#a^%+?MOPg8#e0JAlwcoVQxM zVr$gV!ZSO8>Q{{a)X@|LFB=F8{0g#+axr*J#TmvFvvKdRd^GC&AiGG(uDqHsYi*N` z>gu$9f%Lero@HU5k)C#utY6_#%zVTf_E!M*Jd^THD#pQgN zmTJ)yCj#9c{E^{m>ZF<3t4v2H3!)zh-zO&y1y8pXD{JomoB0t3UnP#5GgXZqt~vjB z6%O`7GxX9rk|7vPHIYQR%*pny3~eZtxKO-JIU!L4>tTKSs*&sHdNLY3e8PI+|Abxe z$RzR2Ag-Rc%7m7)i@n*&M4H@6(&+u<_%_wi;O5Wt!+?#Q(X0ePwQ~64pB7 z_LoBjT`6_IhA1H#nW5KFRBBi<){1!=rsbau)dd!Ziz^9KBjDZX62z% zHj0S;TK0a)UN{5SdL4^29c*=-k!yx)`b(mTlD)O0W5WS`X2r%3(&wOkBJg>Ltl_I^ z%NANvbBUPOonqtf(xs&{hBgY|oRMmT$OJev+FXs=Jg$GH#YAuRGi1oOwsZ{<8nw*! zdTv2GhE(b<#x-)wY9cL4=3H)$WyGo|UjXYJWFd`~UaWkVq^R&Aatwt3J!11*x11>1 z3jO+Q0Zx-bPg*>1-|bqcX=NF^=sAt+1thi0zxEHI&OTndKfu8N2TtYyyGNMgdHoZ% z(bT0)t&k)kDL1Nq6Aw`Xk6qtz;`zlm-%8Iq$Kh#xYDr-{U>aGtV!SQGL&MK0^ND28h z#OW{i{0jD&ZcIBtXu+<367k#f2`2GP`$yRypNxl};K^GBwcp0=_ZMYY)qRw>zEb~? zwY}ZyZT)@i>-+&0pjLw$?W6#*J*UjI(P^%xCU1&$e5(w6yOmNZ&E(`kp4)OnT4DS~ ze2+z3bp=UdB<=`Z_Uzt_ZZmpd$au(UIafv)ICCsh)fX7m>58TdWnH**eLOWXb|ZI8 zLZBu(XeW*`I(T9&#yJ>#vTe5EkQdBv!TIy(;q`OJ_7VbS(5lksVT3F|y00Wx;|G{~ zqPNaeeon5up(l#hF5I6to4u)CURW(P#Jdfg5xQ@m{b+RgO`B5c-?Y05kPWu@XY`HG zTxTb{z^m-m^rg>ii%J5**HD{DH@$(Tvp&X@t5MsH&sDAoHp}siZj%BkPc_#|H;=bS zQx5{dy1S&11w8Q8x%Y;{!0LL_(h2i&_x7OOEql{dvz%{T*BfWxwdDc_(!UO+G9?WC znby>7>j5kjAnK$5klz3028dLxAqur-s7dpb(>_CPB-{4@>eCQsBi|dbQg{pZJv!b3 z374F7U6468hcC$7D!GDfIL~OF+?_j4w$RET`f^va*rN57)gUbqW%0%ZF0h}rGGyEW zVr}eIfgbK(F(sX-&A*#Q9I(HyNd4l*yzJNSwCy1>7;wV4r-PXn%w zz7Gl)AU5hPUYQ$y-B$PYiQPM#4G52?J-bOqzN{If@ed8z``*5wVLZP0F-vV2e~_*w z)KvpHlSg}7(jxg4L}T$`;c*;fo=I5`BB~QunhB=u@jGrHE_?*lO>qu(+c3oTt>}<1 zTFD}#{}X)*cqzx#1@w&&W0}=5?0Ih<291vrlSdY2KQ5atf8Y|r03U?os$2YmH1%0N zH6wW@fLlX}{vzqf{ue^4#Z`V{af`z})G7VNK$2mhLG(p|T%X_`mI8NkW`xa-_a#m# zZ%cF(yWuAl0dRsEftMC(fEkI}js4LZkOwOSu%X8oVm zh_PQ5m(dMx*)#M3u4?nHQgosk)%^{R$LFgt7|nhbX{Dp~;`^~f*pCbsu)ynbq90%* zPjw9*khCyUYlvBB$1++|XQK#O5~b_Q8HYby;@LzFo77v>#cJ*x%ahImRnOkb% z&2qX=Tjsu>r+a&LhIp`W#O+G)Pq?0uax9{*QVmfy|E%A>K9LG1c|LuXmsgqH6R0Vo zDJ(Kf+<5Nr+w%qn2N9KZ141C}bloRAkrmhN_`E=#n%&cCZq&?aR(`UuQmxyf{=qw~ zR*H~NU2$CJm=6=!<~3EwaVpN1coXqin9#h}k%8WQt@1(D0!d9zGV<7heGKx{f)X!i zR5Sw@_LmAV1?wlNh?%V@{utz0jZSAU<_n!_Pj34BF0n)$E1Jc zH0z39?;%LPXM9Er^wFkGZO$B646TdxG+ifKIr#MdfyePMI+3fetJCWWaigwCa#m%TIB%ff%YXJ4li=@O?jK-}8Y+Q0xT}!Fr>xl7By)l}0abg?!3A&x%aqmGt^je7f-tgW9ZrUQ}` zdW*U?nhP$Y7H`kWT`gQ$=XBY;F#nC64x9Mluifxp|Fg?(d+Goet8|?!RHs$Twwce# zjb)Pik}I{k-;OS&LFPx)Bw0J;3aHpdL70X;-1obwwb5>Yr8v1dR|UZhUGqRxD$CXMSFG6=}-J_fNM?Zr{N&`!L2lUHn!QkRc}r zsP$*4b;0?%%sBNw4Z#D+5kxTv3S>&SIY~O`H@FiUw)Ps={ThezZ~(RMk#b(QFpwnO zZw7+*LK$`G3Ieya$ElXj8ev8>H#x#bbK&#x>^fOd&I!{s8`WoD|H&EBq0S43V8n;g zs*);^5e!%#DOLD~pQv&UIG|7L6RK@D+_V1jUPZUd=*3lhPPG}i>{ncTYHSf&(JEyM zOOhRk|K>jaZpt_UWLEZ@YeNJOg$JgJ>`ckDG;M08T`A0jg%GRZGrW^(2}+?PX`GYu zN-;C@@eXa4wTPtA(WX`hCLzvJ^q~-_kakv2d@+)eKp|99_kFDV%*?T90O<>X2Ov@h zM*7b24!9w>&3Qc_6^wckd%L;I-bC#YLW6Rf6X0nokQf7ZEEaWAfL%axy4L}>Ae98>(VcYZ{LG7XV*u z4*!>j{{60X7-LUGZj`X2q|pz`19CwvCAxY6T^gGNTW4#hMON6_Z?^g< z*F0jdwXJ72CxIaIr{q|LtM_y-nCS4d9J>reBeE;i-+5Ui^6@w}PMPOP{13TGv3JuG zieNN?iNE|@NeUESGQ2pNT=eCTzRo%_;uZQey!zzy6Kv(3>v84|G8ae;Vs_4U)~Hcs z<{b|I^|i`r2;+87+W747hocrY+IeHoI$(GpWXMK&zlN?IgE!!X&qbVZxW=KDW>;0* z)+?O?H5u|;FPxScc*v>|H4zb!PzO4NLn&FZMODRk#&JvLDC+sz{q8K}eslP~2&e`V z79I}64(9M>jDHT*ubL+?_C^2YC54SL`=DLvxRkxH5165AI}v!$(1Vs`gF|D^Lk+3N z!>`HZ4+)0RT%Ql5jW54>s%HHsou}N8FRe}esrm6z`m;Hso}6>fS`CHjD{9OAMX`GF z=LuqXn_z}3>Fg~cB#{iC+_}=(P!mRY^Bv+O%6yD|DB?;A)Fv?TQcYU(TQS`w6aJB(E{3SIH*~Aqd0oR!Q=oXl&JTuv=|HN0r5|}fZeE9-s2du9Kz^r9Tiy) zu3OE4gR!it18_KW#@#a{ouq7(FS|?p7GGy#Ub=oYUz1iG9-jlY6PHW@_3D9z2N9nB z@{BX`cPwk5L+rDA>F1}15%c-^{wH=sdH4X}rD5Lg&QnX431&)Me=vb}@Iym|0m=9% z|4ua3WHwWF zkgz*%Cq?soR7gpr@@_TqX}SC>)_Cd9@q)0tmbzk;xsVPM%u;6TK$gQgGlRKxbkciutioZGZ$UQ9e2J3B8`hr)|M_ha=- zN=F^^;)YEB&LQ{lNrpZAVsF1fP`d$}%I<&eY4UEu9v_Qq;={K=yZO3o?6)tb2IBOZi;J@d zb*u!J=Ea(sVgn>2dW{Y?0+s5Q*Z^h(T~s+~G+lkW8qH{Xym@Eud zo2O^*z&cZli(bA2;oraCw7hbk5-9Hk{AF;H+5S%8=n>th_9r!jYYAb{i+Lye1^fNe z_}MV!x$y#K;J)gQ8mx0WE)Xnmh_xLu)Nn#%HL$*JIfM497|{HkuLGXtO!4gOmzkch z5ibmy>pgQ-P4&`u4W>%MgqQczvjOnceRACdi7cb=!Ml_S^j}%$1!{s`+Ht-RVtarE2Kt) zub8wy*y#SArRL)exzp7jzVkn!0M?C+RX~D;*B;i90AFWm6P28PFB0Ld7a^lrwKvp` z)p4R0eW=>zUa;h4&Qw`q{9k}%6r`a;dBS^6Myo?ve`Gqb^*7$`_o#`5_DF5I&?yse z#IdiWNf&?h`C{M5WOyud+%6cRwmc%@$bF2DDbcfeQ~#C^&#bPB7124?UAH)@{r5z3 zNO;cq^I_PUF2Jpmd`fv5p8O2TIdbU?z2&4E)gc?m_UlRg~l-_ovmpcpd*iLg6^S z$IC90nZo+I=L}fgH3_I$$Tf}a6D4h7POA390ioW-2r;~X-}ual5=|W_Lf3%hC_=#K_0|4gLPe(%Nbfx&N+?=ZYKj$Y$b!BvJ!jO?lI( z3|F(R!8_qUlOa9zoP~#dGL33}$mFEoOOU+^$QuyoxL`VkJ%>*B7q+ME962{Q$z(c6 zqdRR^h-eEq907hrIOSQ(0`F+M`1h%f^i4D@2olb2$xxlQttCXOz*xNGTMnw#LX50V za6AjkRTJ}a*r(4Rq$vuctle)F@JY$ZTZQw*Tk6_`F5w8D>M$t;Xy(!}=;JRbbr0wg z_Mg~`d#d$%pnCEw*?`!sqW;=HDAN|X%hX|$mbcrWRJ^_8d9g)_7vl)4qnIQj9qcfi zI{sS8%DqIDu+X!ch=jq-0Rp-$Ck6^nkMuHZUg+b|O;noMS(mafn?h;Ky-s;lt)|oA ziSRA|i|84_ipM)ZdFANhCrUP>NG3-S7Zg|Dw=&}him0_SU$k)@_x+#@ z6gg>buR%b&>+x$FR~zG6RC{}~*s({W480i=U?v^_PO`n)m}!FK@*!IOW=rdKyMphw zEzj>bh4@f#UheNFyUE}lyS9i~#n0`x^NbZr=u-rqrOL_TB$hRLWu0824U_}@z!3K3jrmp5Mb9( z2W40yI#4akETV|gA4T5H8bh2@7NjFSB6~HN5^WT(^8VIDx$Q`fS8NS8=79)~6Oh5` zzX4pk^=aYig$Tx)rc~Lp-Ki}d$+)9C8vw^epn!vGG>q3O3Wk;})9gHXL5Pck#jK}2 z--;$mLR2c>O5$1I{${;IxoIs|?$>4K{U)4kU6t{&&G#Ro(xczcrYlgHpbf5!iiCf!Na*0=xpxNH)ggoR`JRyy8u$Eb==e!141YYQ##ISD?APo*E#;sLLWfiJJ{hH^ezyc&OD2}~#{9uiO)uEwt= z-?CAMrIMGf?-WlSJIw8YgCjcw^pL_Eg8&A$O8)?(ar=aH(9ouQ>=7@QrG}aR^rMQQ zwL>}M*p(a=>uM`R)lVBp%|5uD^Nbr3P93Bws{NSfX}e3#|A4CPFaDxDF_ z26n*~P{bds31J|ZTfJ$O+x_fwM^Z6P8$mHIvCkRGe+;r5B$Y6^cPfZWk-suNC$)>w zOTX}tC7gb_@PvcjH^I|J4!QG#KafWg2CBkK=xvQh2=X-nn6n<{%ytx6TP3V$dFbRR z#s0c>G%68>dbJYvJC5tNM;&p1T6}AWp^4M*YGOFzH(R&JD~QXoyHoVB_G9N?c!OGe zZBx>+!b@1TtNkYC#jtT>0OJx&(kl@)Iut*x0ui1E;fw_nbdg=;5z#o)XWBC5Kx0EggC1>#;AmO+2iT ziKj|qmx_Wvi^UK`S)}@~&V!=MZB?EmvAIs=syZ${_ zl|!RmRC4a0HfxzokBuO$M%ilNwwtFWGR%ZZ@-;v3&L-FG(|35CM2zCf-OtH7ZIad= zS2*PXd8ix4VK4smE69Qg?gJ{M166HsyM081VU$sg4xsD1o^!#oe#Ao7jeE#v$>pT< z_8%=;9xYDFmtJqKvv7c5KVTJ?E9vs`sd};1NwC!9WdSl4IVYOO$*%u`H%o79H>O91 z8;z%s4!?9Lay@?)eD(0X_haMZlp^<42BZ7Ka>m0N&~eoDZxQ*~)Zw(I^a9 zw)s56i~^>WcNJQaZZN5 zP^Y${-y%AqULlgxAv`&1qqy#OSl%`wSjdlPQS%bsko`)Bh4p#^0A&o|HVrj+C3+p| z^xqq?7d?Lhcua1t*o=jh%nQ>4XY_Id+J5GwUYl|{Mr`w8^E#3tDr{4)oel6uT@sm@ z@S#jNI%*U+>KeavVPM;^B_xBUCn)&0&Z3ul%&D8kzL`m40|7hRx6;+xKW%!0I-XEK z_mgu^A5YzZ#pk+t9Ui?s8+D%TkCb~KQ-0tT^;0iFH@2%R_-xbv5#V6vFV^Q)%>oBd zDb5b2uB75P~sa*hdfsQ_UH9uAPLJ)IGl$qCo6) zqsQ0l4E_@L@%N+?5S&gW$~AjHL(=83mW4C2L5If^^X-~shIilgSvn0`@8hPvXqzSM z)HVku5XYZrkGG3kyj7pTMj5O_<(L0c0emDP>p|^gP4h@tH7OpY(lSD2Bj&{)IF$7P zTiNhDpaCwxlGrFvHq_;EnGRJ>0fZ0$LPsQFvmkui2Ez*xzkziByx^AsJ`{eE#CBrZ*GSYI!Er zZuP(^p-rj;O8v6GbHE|jKF0sK1`J*?|J7r==ljUk)(Pny?}ix~R5zmX!p_KpN#%E` zRa*arpE*IE{b87p3M3%*y#ML1?gRHXKO{e` zwa0kPO}h3(THSFptGae7&NbEE4R+BR=g7SeJLWXMd36~l(X1>QS>Byh|3CKL`Yr0M zdmmRy5NQOFMna^Nluo5VX@->U?hX|YX&9s%L>QU@hEzeiyHUCk>HO@$^E~hK{S&^| z_59*txDI>v?AO{W?)zSAKA>W#({M59`#sNp)s*iqD&9;q&ly4_I<>~;yrkq4jtRK! zOdjAZVXqgT0b|3`l3PzCElJ$9z;`|k-3gqxj?H8KPW`+nN>`|%ekR*naiwDXZ8I9$ z(PMmSkZa<0$5}^m+`E_?BY7J&W;3ipy=80r8x)tARp7b7Z2g2D-d;s#tvt~f?{ z!o|f{lSVpfCm(L1*xm=lYY|P9^sU>WDewnNW$GadnS>N3NtzRs%0xS89F?DD zQ_1=35^~kYNeJDi9la{y*A_N^our=iqsA%+z37nc3H%9|*h`gEU0>ZmT^ExkEky~^ zsgL`LPQ%XftyW4PRNe}70JY3J$pmA%1rUNWueyuX0RUF*1jDd~D>En&Iib}po6~pX z%seZ-$o>pkOBxPzxHS0glMEgcuu9ytcFo<0i$#)s?VCY$B zSRv>eRO*|3R7pVP)2($?4CUXs&(efBu zJ;Ls@KS*XGI_UdF4}(cb(x{*dte^UfuBGq8UJJKcVIu}s)W$px2j+&SVvzY@W+Qsg zC39gTkEaN@aRp+M#+8Y*zcY4AVm7O_;P=0d+Oh}QffQ}O-JXih-dC5crmJJZCL>ZlS z>x#O*EEf{-&71jhKK?S^3{8J&Z7$8!Wc}xU$U4i?*RX^NZEKD}{JqMSEcA7K;i|w{ z)ytXQ=tJB39pUq|9r5!#=uFwezk7cKj88x%V-;{Mr!uNK{@dl~kSJDpBx!-JM~DhD zD(vPUAJl6SpqDN_8X9)iP^IA;;G#+j?p9RZ+wsWYuhlWZ&Ai{}XZh2saZ!&^gXqRp zo`{1?0kU-j?^gj0Shp>&U9k z(I>2igK>@C*GZt0D-k!Ebl!l;y-|g>n|BNy__O{3l*Pl6qqlK#tyUhwF{zIIh;;{_uZ6dZX$D$qd zYRJu+G%Cnq)HHvM31D&~+ZG2E^jD{8qntmN2+8I-xc2CRxf#x!HSa*Z;Z}exiM-DEVj#NRQhFjO(Sjc6{)D$Ptl4XP+Q1pc{&QoBnSJ0pTy1?kif!ok zO6NA>?dCGx7`j)(J$7!Cb=h*K!*cXF&Z!9tKHls`J-BQlKYI*bk(Fd{$7`hH#3iJ8 zwMpZV4m1Q)?1s$M*SV9^S2?nLtXh@6eB#$nr}R_{u8$gmP0iZON{@!KM|GxgI|)#j z@N>kI81l;Lg)}Pr-@$Db-Re~1_8O|9!ymBs@EJ?Bpo4O}QSX!NkI;bcC{Uy6l1!bh z?P;F0X6)|z_xJO}b+u7s?s$AZ2@N3iZXop3DphxnN|zCU(1#Mk zYc|{0rPU8^+`}tm*}@t35r}8FmydY)uYVtNzuNr8K*8KAhgY&FhKtB3fwm( zR5X0d)D|6T`*=${jqbMZ^#EJ6%}|Qgff#)>+h>Wv4q5i>rnSA`c1J_%(!S()cOi9Y zZ?*W2vKosRSQyvzdr!NW^?vpx^~n%8DAP=2=+C4mzXZU1#$Bx^JM&60K z&-;XhG=tLRv$Rx8uGh0ATR)u59T_FX!=`_n;u{7&Zp`!g0R}>d?`CUn3zI_Bd%>`x zHqnFKWaJe_(*p#=8duK=zJqRyinGD>Zq#xZ8Bj!A!Tp)mdaX<&wnnwDp8DnqotWi~ ztWk+T%Fr;572>9WtT2k64AU`lmaYS0h+#te;N{UL&{U?oLrP;BcpH+KpUEGop;la zjy&m-chWQSc>B8t9>D^&Qm`EN&eyY`D_BDnn3shstY+0Ie@p?C@V8LdfuE^+zWI^t zb~`%jyJMsnbe&&aA1XAxN_61nV8?ViZHn54qF%()HXGKF^!xW^#nMV#kUwdy=}X=< zC(~}DGg3C;uX+n4_kj#7ARIUs_C5h)5EzsV6%`wOc9YunYj>6rikqc4ZidZKY?lmJ{g;4_M!wBTE)%yzYehgPkdVlH!CFv!l|}WvQCw zFXIu+vGx=M7Ycc7D<&xWRU3?<}2wN@&QmK*lJfLSbX{;d4cnSfT0?d zq7W~YHNCwqxq1*2{(iNat)C-{QT@&}bL$VOPW12l%TtTkZB~nQ16^aImf6t^`m$K0 zKe`_v`4m)wg~+Kui{JIY+j!j8x$ALUw2TlnOPI-ik=st0N_O&WI<|kcl%kktbw$KfZ*MRq@Ad*I5 z9amdOyj({uM_9xCVfIP|Ek&t$%=5|{8Oy!_$coEIR@36={l|TBP%Nf|j&jI(-#fGW zbm@ciB5u!2au{)Lpft=a;NNZgc`uOE2fnZvd}DtiTsew^(!#8gXN^NR_{Cq zsQr?(a9AK~=tG3Y%iaj(z1W=nHmkY1fh~K>Z`h_49)}vF@Be;$UTgsWCPkxyBxC@c z^~DLbc}eVbk3o?v)!pTbH=cpl4zrc=*%vzvew=!uy7OlZezjvkKda!_Qr55BcCz^O z2RAbBT(Uvj+^1s4v@9`^K|G-43aq-_e7`yD76>w0T@Lby-?nalbq9^!HGX4sh_(Dixqlw5rlC&!{Wx@O&-;~!)x zw&U5-wY(my?{_1GeQ4z_QQ%($Yd%Hh&bJdJ!CfFni4&Qk8HTELwEb_91Vpg)`!6?^W9u*{Xg=3zs#zMHtv)c;t zkK!#*1KibW!pIQhy=5$`ESIH9L+D+Wy@1Q?wDQumkv0mx>haprBX8`>oluN^f@{Rp0jPh&%(NIz&ErY@mE3oo_CYa_%D#Jn&?u*x1ma!? zvCh`U5g?uV^#zi)$e25gV;p=h zt{hLrJa-yh^~ahMQi8l|mfr?*Eklt>Vqe|Bml~c9-%`zv40D*|zmrFAf(0K*~vS}+$Vb~`76>$^&sI1&x4DPf3P+XfqP z!?N9+@m;SO$gTy~05$P4r^ExDRU7@-d%s-$ko$$FE#Xr*&8vyDhGrv`mgz61#rJ`yo*>@X`P9*sK zEz-4Y`AMgifL>igv8LICElKzW$+?Ac1b z(D~`LIX%!^rd+yZ((KMde>t7KnwJ3a*xF9ek7$Xeh!4Jzl~u`s;$7WF2oqQ~W<*Ox zgsanf21(amY#+oQCUxerNt}#&e)4$L;`Lq}UguDNVbX=ZwZpcB#lD_>IA`4Q3Q;)F zQZC#XcwfrrwQSiqY|TJY%t&+Ng)5pWx_E z`(?buwD@6ZQ+lau8_~MM1M6H4fhIp-nIBd=Ph8_vEFxHyNYO5zoDMnq`US>*FYy`j z00j`Fv_vjRrRs+A0Oa9K^O(fhv^!EW~9)l zswf~&ta-UkxgmayNQpgWuu-69^N)LLT*Twv={CHZ^uYJyX)H zB%kN6FIO*YE-mspZR~hjo%cKm(5vM_yGr=rspx$`KfOszb~(ro`(v>Cam zu;>9Ua?x?p(!?5(xyOlA3A@`Fa8H-7z|2VELA>}Uw0WLQ!zzRYwP4Gc{b_q<2Kgb2g*tXGYq^VNeNHibod$8gFIdt*`)2)zI|Jmyb`%Dz03)^)(V(Yjk)xS8hrAox z(aA}o{O<0~NyxeeGCmr7OK|05c#RK$CrKsIDlHuLKLO4ZfDXvKviZrHZE=2w=*!I{ z?I-^7>&?}m12II1Ms##K#7#?l>b58^A$6H#;zto)AoF-$s8Vc3ePekv`^b{WzHjXr z((UBh)-W0+<4N}frJzsdp)7vtTwHU1tWN#rX}jbij(5Z$FWWQc18q(# z%LJoqHaXknV1ocY1ZNtmi{x6;1id1GNpw^uQ~auaLEdnwLDE701Kqn{9h%?QyxSAJ z^zF?lV$~|FM;~!6toa*p++&rc2k;}UUS86v5XjU5fPj{4VV(ah>VsS~L-HjsIb=0x zbD%OM%Hv%<<6;z68{M`SeL;LWUV~woiBQ_{%G1@bow}N@G~D`{AoW9cV>Fjv+{zjkk7pGcXZRcH%v#L`+&eDbn z-`Ks_Q(&S&{G}g(-BXa3sck9uYqN1QG%Hz`9*#V;nQbF<8lcl@ks}7;WvAK1T9Jx7 z61z9zTxG5|Ih4U%3vW=&kdumFMv1iEj+Zrv_=eOcpPw6vr7q}6H-$&LYj z0y5#Fzr3DaBGD=H%eJMoppBJH*zkN{&Y-TXR4*3@DZmqa zL%cvK@UfQSA=u_#j+n7(rP+I3=If+p4d9d>uTsV^J^RYuywYwtVVt31d8DLMV#Tv> zar37;clXA&c4oMofS_JC(`#C(ZhcbOqAjAgl)c9#CbzBR2V%a|=dewrY({XH6b;QLd@I`e`gc|;Fdoi=3XB+hEI@NZ=N0s5b9Pde@6$8MU=y&0h=T`# z@)+odZtw@B$uaDu=f4+Sd}73JDmLaP+&5}4r8Z6@3X1)U^)&UNO!N*}`{3HOesrnZj#pXFNDS&)MXO4$B~8_SWnI1T_t|4sy#xW6$4Ur^2Z)K8S<0Qp zaZh$2yEUSIkjR?JrT%#`47G{X;hDXXhNRpGr$D)&1N_@mcDph1hP0z69~=#;R%&)* z@0P|PvDWaARe9Zy-lrEVe0GT$R@wMPFaCKNG{nH)X1!W^fIOH*6dgEU2PH>Br-2zP zRtMnqpaINPB3I*hTbSE1>Ea5MMm%f(?DH*16xh^aDem0t6ErS#B4r4JjrAR9I1^r` zOm{Sv?VZOvgiE2_5E%b|-fjf>b|lLlH+Iemn(R2?#YovQ$2f&1&ARMY&-x_LA;oBc zxI|}xKOMgL-!R`Q(mdZyee>v7%gt*TL0SBP{{TbaO@tS0deujs%rr>Q;0ya=7BX|{ zl%%D|f8%42dWTFS%i4GRBEZxZYQl_qsrwy5o|=`+ZfetoValM~k$5@BCx7(?y#Z@Tz>3jB z9~jrIKoW2(NU#9>0Is6TrrxGfovl8O+9Xw3EOw|e_bc$zaVCCM7ec! z+HP(GPT$ia6nk#`$Sss6WWqb@GC+o08)+3c|A@U6i>Um+m&l)xTykc3tg zO@IpotqeuXS)@DpzfEF}JiqgQuaG}w0H=6rBe8~yJk|fM@ekkouV4KO#{Tz;Ks@^I z^?{c(2X-%#f{y@|%)kB|cwXFptqx6?*<_kN-Quf6noLNBI9C zQ~qa#|GFgqyU73NZ2sp91O69I{<$0f^bP#$ru_dWoG2|}5t}l~s;Q|hxu#P6ZK}dI z3S>|FmFw)J8yeO16W>7dd}=mxj|~mN@)T~b$={@`dAeCVx(`H;T~lm= z5bwuSfIJ2XKtL(_%Xl{^GR1DTH6bLdq5)c=ce2=b+~QZ1x+1; zHJ5qDf3pXQP_g+LVnD=~gRY`eF{&Ro9R&d8rlfh$90^op^y^-i)=?bspib@f1@crb z=c3&5LQj9{zTLky+ycvO(4x8hNrK;7CX#V*UwwS-9!ekpM6s8uI3J5*ndG&03LC7m zB}T5XyEo{v6N%0&6zmL={>@8{oB3RzWYvO}6=2Ojn`G=Mv};S87rI4uG&gs;7<)S0?eJ zfk0nh;2J5Yye^QZOVqTNM*o{o8DJs%+_oiIwvv~M{07O;bV1VTYzZeTDn(;W`wi4t zor}YoU8Rg{af+^jzN4Z7HyPJLI#QeA^atpcE&92SG5SLZ{%i8J4EWSU4D&-g*PzMg z5uOrg;sQdzLmWjr+NTiY#|^|K1!BN`tE@?MDNt9OfVQ$;>OW!}6r`YY$a_)a=O`CJNmw7vYlT z>d|NqM7ZJYBd#vKuR%A)A=ZH&`^#u4`{(KYtg)AzoP(I8;0>$5cfrUh%J&wX%xcVl`6lM(z(34O&=kwzr{Ft{`rn`9@1`q zbAO)GA};{4Gc3{aG_h4HLYKmZ3~{;hG5wi}HaVNUWedDK9Xka#9fLsBL|Sy?KSr0qamshga@s;oO`&-@Jni>GNV5Jv)(dt@j5C;Rji78?VEXDbG%39*~W^ zXjqQ!ww`PzadSz}R0PZ0{#yL{lkl-(_*ietv)G5ECFYnbj*HxtUCRjf?NmwUC0d-Z z^pQ+hQy^cqVIOaf#I4(j=pO*z&-EXN@I zvoab2bgGWFTVX6@)furUTfj)yV4ar-PU2v$`=utF&nSX|!uV)ajsg7}XN%QpTPTUJ)y@T}*zzUCv`Ck^H8*$HG-I@*I z)eYt@@|D1jYN0)4-tWmnUBXdZ_CIF1zYlngJs|?=7f3gNStwRD$0O+Mz;`-00o=fF z>Yu7IOs&q0->1(wYvn5&s`F(v?2V_zv@-eE{?m>|As6_Kcs3-zn?mqU6Or6lBh}`K zh~DxEX59kXpX$BlofXebWwEVbpeZ(=%VJiuY0a%*(_CULe zA2K&~FGk0`!oRm%wMFwg0}>pl9ZX`!dd&$TdPkgJ25)*~HUsBIMge}w(t#_`yXfh% z;Zz8--wG|+OTCE{^+-qY!fr?*5=fJGR|&j@ zA*Ib?C-Zw)^cxa;k6b8E7D@)cJ!#+L-`$Og`<1$AH3TC z?G4@p_}hI>!ezv>cl+v%(fNX?7L=@pd4VrYcBe!|wU0~L3g7UX+))m5R#whjnTfBt z4#+u}&G&y9-!#z{I{Gy0R37MTm3BmO5_R(}FLyoa6y~%Vz8X;G@*x**L02I%Mk?_R zTx&zR zo}~y`v$fa`1O^IkbH8@(ag^penGEraBT-?$aZ2u@*An5Zfm!cv97N-k^>LF1QoZ+L z?A96^()rv*Sv)uI1andH%B+ph4xsFC%!z{JK#1IDWv{9pt?4Cn+lUcn+n+zJLjjC0 zac|@7=Pz#6wx0;R?WeOLX4SG5F)R*9QlZ>GU+9@}-i6Z;XW<;2%ju3}KN6zMz@#W4 z{ciWrfEBdfp5{usA=r+_- z;$Fu#@n+6d5c(=Z%vQ@PTkr8cepXGYWUX~{+e4fNGIV1%GIT)G6^J=%R9u|Ar2{&; zO5qIX>fOqKga>DG{SUMe>c^#E%*TcoRPue&OyT!GF;j)>xc!EIVsm(A{i?LK2}mJ1 zO&E!`meAOd$L2c^^DRjp$lvz`P5YoD_wH$bQ1wuc3LdGFJ5pm~OT3m$$T2VKruklP zHg-jAx>hn*V>9}2jrgMfj)v1(P`p-BY2gK1o`0jSRwnJhOOWL7q988z;%guC%W?5T zU<8`U=oW5m#b(l#wa>3EKB9T9rHVM6%JkwFVoA@j7rB{kkTHR$;vjZ2JD@Yv=d^E7 zI8U`fhdIicycJu6#Lg;~vGKEe^v-HUPd`-nSx4`$Jz4~DMQNmaGD-K9p(+ z?Wepb)oxv}t>+rswNpN$sK)5xWvtdP~91Oc3ruw0mwxdOFOG|8`>&V^MPFWom zKD_BRIqsK_Dd3=_vG=Qe?RO+s=TnsrUzYYkI+;|G(6M8gqTr+NVz4ckK+ydZi!!SMdv!6enQ58hI1=U=q##CUf`lU}1M2T>p{o&1OQyMD@Vv zwG%?J*U3LSLPg2V+Q!V1zUZLvZkZF}=tS%feZcVKV}?Wy7KgEK+1IGNU??o-)Y;|j zJN-8Mqo4ki6vcqVVJT-R@lK!nkunW4uUsTDyi}QmlG7&3CAp}mb4K4(ITlhaJ&7C|BW(> zD{gDdJPsTLrLxtU(VXxxcM6s@4->a4Ef_v2q}r^&OCGfaWD*r@Ow{#KbFcfe?BwbD+ly3*8hMX!v2q!HbR_^aV;-c5UYx@MF=ADf zyE2XV*v~El=NYi5tF;sl-}bIS%FDi5-ChqneTEn}h>KI_2}3XDMmqu&C!C2aq}kpZ z7CC4dsX^ZQPNTFmW_OLS-4ih~SfTo^VsssH8CFEz*gFb@Uuvpn^+R$Mu}gTQ2XWf+ zeBNYqt8Ar?rfVOG0N3;czu@$+pE|jy=+0e+N0YFqS8TfpP`{>Ut>8Z%CdqTAUIxd( z(;^-${zM1RB8G@24dR?4hip^C&TJ(^7B^bc+2}7)whp#(JN%E18WB$ zyrMdH^{_vGo8(=`__dnICsQ((N}k8Fx=&HaZ=NqroZpS?k4N%!$5uG-t_atkxhoUM zNTP+Nw3UHO*`Pt}VQ=`G4DhU2CP*!AnUZqXgn06woB5XdD9y9fyHB}(eLftxqtlJ=K+)b|0US~!=#X^td30{YQ$$HNto4cMSx`mCWK zYd4+EzA8LvI}J8))OcCfFgZ{b$tQ-8myZPQ(+mZ_#rk_>R1MMa-nfH^;vcH8LP`2?4T*Hf7hPLZf{&Z{b zLT>l*CqEqL=)P+sI^*L@1j+q0@mBFavjFTRLN;f6XwNcOyoZJfjh9~PNw^^6gmj|h zmG{*Yuf3f6fpXHDM*(7?=$xv*md}&F9yL7Lm#WF-ALX@RR*)zDRUjy!L1!Mja|n;+ zKdQ^iRNbpFKNwJvS-s!>Vbr0TQ~c*#`p*$rsyD$5ufof)tgYRLf906u&WTqhQI!3_xiI$PN0o zc8^J`QUOGW%aDKlh!y$Lu+c~_t@4-qPue3O1=|J*I4bcEx3>%MyuNXr(;H6Koab6s z#8fNl50GrUHP1>Wk0cTSacpn$Y@@>wl5m0y`tEi?>1S~CCb>kLhCCj98v`wRZftr3 zy-6BpJ}Jv@1bihA;XU&HY$WFgd8j7805N7>8s8nFUd<-@3n1LhRKrLfzr#0=*H-q(yM&#(V-|PiK5G_Zg@3P;%(z?!k z?jeIrMY`7egDG=0jkkjRKRl|m)x_Aw9nJ2wE&V-2z-47UwEZP3LAIJ0bDjJtga5J28aqwRa<{Vj zo_hG40!4$$FmmjPUaoPO?-6`nWDORsFZn#j{3E-31hnvstN^n6bSQ{pp+ow3L3wHC z<)=84^MUL(E7#fqR_n4+iIl?4IvAsTZjBsULt`;~Qs=H`ZWBSC!2b9be!C@W(3?O8 zzPyG{HL*KKRik6fE28N}d>)E+wwmX4ZXz9T_I52a#`)9TMsm~X+cwN^a%*fKnl!<` zh|izrG@O;5B5GKG2)pP0`kf&6L!~v=S#Nvq6N|6+K|nEZU~+JOw3$oBY*QMCt@#P^ z!vLPA&A3S(HEM{ZQdz7?ZDU0;ZO$i^C`_@_!WjiUmH!wH1wck-o9UmWD?Vr!AeZG) z?Pb`6KoStBfw^Q(-vx#wb%EZ)>R*E~m(e^3i17!zJ7pus;?^2gtM>Bbts3}~lyL6e z^ao33{C2p*c^Q|S2Rq4rM`0uPrNq;7UPVM8>12`TO2s9W)Vb6vA?qQYmmfE!bV^wk zi>apeZ#Dh)@k3!#U1rr=`Q60+r_AMwJ(t;z%zs?T(P`YWu|e?)3}|65WrNJ`Kf0kb z&l#ejphl;hRb}V@QcqtStADJT)C+-{A=nctvHjeBb9D5|?M}SYnU1nQ-wzfU)qq&q z=zsJ(nm*LFFnzn#iMP-HV56Mi^E*gYaHOV@b~LvwY;?gP%hrB`k4o>?Nt2nJ3o~|X z-dZ(x+aH(C@0hdh6Y_~-wL>4c;+D$)oOc%Ir7Yv(OsudK{S#Io%zwiQlu2};{tp<_ z<-1fkPHw)tcE02@OK9kg(6w}X?WOcN%iFnNvpce)*EHWlv3{qmUUAe_>YP`iM+ojuN4MMUeLcgr}jDK=q7*$n+L zzM*coK#j(ZoY(@ipJ_<>73=IP^Z9%vpmF`kVTe|HKhCjDWuPtVqrwwI`v{Glwjl1r zc_y~FeR&p_>*OY7$XKi0nJ4pFZ_tp+Y_pm7IBSYI{?X-1n%)=Tud zLpiYp{W{NloLYK?~P?MU`Z@wVvO=W|z<0cKq#|$u$>_D^ENf zRPxluH_njbjh}NEk~#zAKnmkf#7Y zxZKmp)$fv37%2=9<;$5>9rrO$)*sdpRTiX6TgwSeXK)J%LW<$;`nVrer4TH-k>X&6dmLV z%YceEnfaPzaPfNK+W!=8#!=Y%5JoL`ULhuLRHDosP5EUvCfHTff55s6BAZY2$Mzah zD_MVPf9y&W4>w|5NrZf*$ zi1K)n7ly2vZDiW#+Lg;GhQ^TpAnoQ0S?v}s)#zwmEycOWKZTb6xqo~7CZ^nJzu&c)DXPbRNIlgcHcSQXiP-ZYJdKdg+=;^SCz zuB!P>@EJr~CeiNDsQtSd^?N}>5_Zh%+r8~pxdXTgh9P#Z%1Di;a}2wMaFy_`$X|!Q z()S7y@^GWB^D%L+Tg-Dxg6AS`s)4`&WMJt4a9KA<<7AjFYvf@X^74>x_qe5MdsZbuHBR7h-t6#q` zx=meY`h8~(5D@dB3_?DvY|-*NrHx5$LN_`H2x$4K6D=(>L=$(X zcn!}Hgs4=zI_vo{2-hEQS%tBFi0MoiPNyevUog;OtJWm6M-KT~xRJIFl``GAc#-qY zB77zA(--%^iGwLRLPY5%&)TJCo<9FbUS$rrs!&O+0icNwroaQEqIZ*uFiqECI{mm*k?Vbb;{%dHX4J!vpbLrvtXHYiJnP zHeVIT4;Km>nP|f>Y!JjFB1{7pKnJ%{>Df8XT>;1IwKA$5urXbvXcTy^Q;G}OCW4%x zL2Yegn=Mv)n!E@MYcXt+zmA9Hj|(s9D)Ksk8GHb0xqI3hzg$tRKaK;WZZt;7*wUrQ zL;`x`$q0s5U%6KKY?k<{n+V}1tnEY@=iOtpN*h9lxc7;K9J(0Z{}A!J;g^Z_G0s9hjevh$ebpg%3`)j?xS~PI;^Y_WqFa+3|>`71Z6#%;V#PG+pX-iOL52Z zs!L4p6i0ZdHL0gnfr5wSMnUCzWM%14OJZ=I>L`SbVoL;Oo5dpq?WOnn?4|?h_6DsF z*xTcI6e}bWR|lt*4JCamFH|+NhznkNV@Y$OG$F=zs32w?O=N?J=0@4M@yqQkZ=2>n zwg&xDnQ)G*r`JLn<5Sf6-UBuqkO9>;_^YXuejRni3OVbP0fCn-JNkY4^J{E*WcjOe zw|ryVOsP$f;RQL4V<-o4GfB4y)H^-&d&Pk6kq$h_)vB{{QLfXvRwB}sH8?N)VK#f$ z5G!lqZdv;gF>b{j#26R#+h@SQSb7dAPbD&PDRKklw~KiA2dGIqb8pi~b%UwO%@2 zJ&psjAd_h;6z23a{!HS5f)UdtRLsYwDpizQxyj!q(1c!af90g`;OJ$HHsZcvQxlbH zY`&yYGly_tZ?N9Th1l_(DeqiUrF&kL_dXe{ljVfHbi3a(C-wUPH_fR=A6+p1tdeOr zpNGxnvT_vekTto%iH$Zlc-XJ;{q2hAZEsq?H!p&h=qKBPEjpFm7H6uGo;T1arZ*au zHSApplwwQ|;kaI<(0IKKKt*Aqj%5Jz?O28DpI6A95A#+_ET zC0Gy#UOm5B=T`2!W z(1OGRf<|XR1G;>!p&+g#_deraV?Jnlss~lDe$O}z`MmsEOW+7S74v%j+J0B4C0C%N zN^f|!=jlBz)O+_VF;VaFhkbl2)AcphbeVOD{uc4#Qm@?lp1J81MN@9OurMeDl#OY&ACHIlJ)t3ph&NQa$f~kA< zh4~H>0^Hrg60+>KyWP#h3rS(G`$S>Y6f-<)UzVBvIpMk4tF4Fbm%ZV$!z^P= zHCcsZXif?=Fy=OM3xVIJ(l~C7hum!WMqCB9G}b})rtyd6T!wYJvNAa4V$|OYDfpTU zCElC3M^3&QIZ7BN$b;ddAL?J(>zdn_9u${kg(@;LxmF_04ykLw;tzhC3<@M4VoL)7k9Jn{ z&uYD+dPPFfvS}#v`2-Z@lMxLAF3M5W!LI$*tAUE|+L0>5OfqL%`b28{S?t@4b_#XV z49~wIx@Xci(X99v_{)mMvMl{7meWJCY}9qlRAAvQAYmjNdh!+)BZTjKOaxk!xFd;i$XMb%nHsvr8dI`Kho{}1^&y}8xu`A6Ct!H^4vYs`}mD(-&x0}E*-f#3uXK(+D^B-Xb`$G7vH$^ zu(3bN1B6LQ1gtU7V40JRs&)+<-XV57IZjhU+JlH=%n?XCbG>@licrKDH;25_r-K*S zg5|}-py+k7;Fo-i|NOyi)r%@nfMib^Z9G`|;LcgNtG(0YKKG!;VIAV$OKso~t`DjI z^XN)~rW{S~(Bw3T>~co5mwE}otQB6UC6Iil>fXXLyhs6%$^80a>kebt+-VVhs3*rj?6Hb`T(zKl+ciKM6`$d*nG6W&Fe zl4!~I{-pc+`*Puy9#2X=m3$KC=dR1~JGhSi9!93Tccy=-rx+Cq9DWQ9n5`9Z)a5wt zG~SqPp(0?uTNq*czH;_s1&uBCaM~k*O=ng0`Yg}Q{grq=UP{jQ+)BYuP^yE=zHE(Lp!GVvY*n#ojA096hy*$%Xn5 zG&+om<6cQEd1hYlmSb-x)y>Y28fH2^qO9}e&E28+OQ34C4(xT9y{xGxFYk!39})7d zmpsWGIag?lLJ9Q2FB3G6n!LE+OPL{deHk~(+~!1-TfqvuZP!?DVJ7PSJtMJpUg#{@ z+DOh(M2YJt=?+R`eC}C}^gTCoWUk21wID+vWp>o!Kw0RtLIK?Lu0cB{XVAU;OaXMh6t!zBo_XrZ=*1R&Q z(}#B#?XI|C5lXx_&tCZjC)D4zD%U4&o`ENBTSsrjPQdrA_inL(`)n@cx0XaU+%$J&a5V+qAo?UBpxZP%oMB1`nXr7jYlIp@w+?T9uI|jnz z))DO)iMHcyb*+>o^YaUsgh4wt?~sv0nS*N8&i^Q)IQM$EdwlmIv>E@gKwwq=7DVN^ zJM!U{)!(QQrzo@eW|9}<<1?N{P1kBQnP#nq*@zLZlJAFa6&)3_!%Yu9ebMI4QJ=4O zeROOILpOb|=^V$@u#V@WUyujkd5ukO+pECJhi&^XWVxy=m5LbiM688G?OFp%{Eiwo zi`1A~sqZ^?G{g0s`L0aMb*`X(nZ%gHF)bG{JUd;B?`wZTqDWNBy-yhJ z95Qy+?71h6@1hCO7#7Cp51jD~%Rilcn_KX>_?4QILUYxR6~P(XAq6d^eGgLGOy1lI ze))!F4-hq8>$=Tvb{z+GDc$R(G@&#Y3;LD8HkTzB>h%rA98+FQFnUSn{$puwCl{-6 z=6J`e?Q%1Xquw=zXZHh2APV7w`Q{-#28Q+|NyPoV&wdnL7~kNy+YxMN7JgNj`ddmZ z>047yfz8$zX3FD69m-QWd^Y_LQ#Ei6UV1q&TI=s1-Y&US4gg>|#mP2HQ`4>?AbSJVrE&If#G#=)SC{(MzY z1dVUjY%Qfmf+L=s{MY7>)d(&QIy1ljzu=~k4<`TSEOoOjVA=nP30 z->I}z2!lsIZ0K4tC0MJ*EIMK12uUl2h1`)m3+&B%%>f=@a5zBe*SUWxSpp- zQl!WQ<5@!M9V_NumWKtpIAa~qdfN9!Y0(VD@EHnX%(n_H=_oqs3DUV3rdXB6pZ3cu z8!^V?>vz-nri3qsZX$&X9*3{>s`SM>v3jidjn3_NTxWH7{r^M?8;vK)cU;V`p6Mwo z;HIGjzQUT=ies9a_?bSs6_{po}D4sI2R9CpK&+%HLqQX|I5E z76gl5mL68gTqq0(%hSl;jWbM9h3=@_v(NI4Ce63Zq7I{UWL^-d4l^~CxQV0$)#TMD zV!KyT_*lb)@Oi+dL> zR?e_3pYgbxLDBAWYXB>=MU+fyK(TNX_4F{MFyhDMN#ODhOAWiDHSgLWKRODG#t?-z zf9ZKvNyU8~CTpU&QxGaP=|~>QXoRbzKruhz_wDAU3)L3A-9HGRd*9@knlBOgS+4Fp zZzOqXa+<-*C%HDJQT;I#-?olKa{7^Bcb#~km;#y&q_S5#Lpw$8g5t7q+Vv9p@;GAJ zz)7@rRlUYCWyP7{^UPVlYB(Lv_4>T%uAj$l5fag~4?2crZ&z~Ww~ z8eX*LzQ)Lxp>(Qn>Y2!1d>}Vo;o^38`UTf{J^59`#N}DcxGqtrr?JJE#^_+In*Tw^ z*PX3G-!vypX?0f3&z+te`qJ|c)W54v>Y)|e`o&s&_`%O8$D=oX9JOzaS|9iL2Y zA?0oK%c7T~9@6#hhJla0g$4&-UHxNatzYe``kBf%x&0U3$45J=>KjcyQ<%qd+O9hg ztjL+undDi~6;~59M1212IUe-_dy;UAE3+b^swF+5UYw6(S8sAHUCk>BO^JA_vf=^{ zJf$*O`8RfYbDw%Mti5nhtKi{;RDeMVnCcnv-C|B&9?BF0t=xoVZ$J5K!)Mtbda;Uk zAAZl?NJD#hSm+?y=#h$2%{Sx9*SwYvY4QWtA|gNx64l$6I@GS0Utn>BtO)2Jcs z#r#ksE9;FZ5fo_lx@e+}rU)m|qFlXIA(P5CWc#j|4s2#?X8Z1d{$z_<Kb%P&-6Y-JPs%!XM0xJ-hbI%(U9k0{=Flg%5InN3kf6n>)+5yG zZ)7pAVaXU!JvgVQk9HZYY256)rX8R{fmT>{o>AJxj+H77$9E|Gc8S>jy4>rIInrSH z!IyH9KH`>Y(V3ts|Ixeeg80ud0~1}1zsCke7F#LZwc^(@dJK`?QOXz*WNEvycW?gH zV@1XM^ZHg6wcK?29HCYV}Q^m;Lp;g`7JvrdZ}78r-_DCAjF} ztm+WobA>utX-y(nb-KPIocy3&-eFv|AD#Zo;h=!>s;r|nG}pq z%Q6s(*r3uE&%O6Hcq=mOJP8?vi6XG|Y#I4)hh~HKX60Haz3R=K;nv$|PV#i4P8S$r*Az)+60+CC!M#q_zGsv@WXlJO0AjM$=%6*G zn_oozqQeQbfF~~vDWdUoaj#)cXHcLKY0BU;Hsx==jz9H~rL^ujr>&3xWiV#=gdO2c z6Ym&qC%%IkS+QBWs5M^gHGZD^lrqr-%_C@Z*)p!w72EVl-tH;NfBB~(q-Oi5p$XZa zejE7hVKnvReyx^97Yjj<>C|Pz?Wf-+rq+$^Jh@9X%5Hj;5R~u7Z5qlv@6h{I zhF`bSoxVDC79Z{aFml4)(Tzv(X|Kjxu}9b@F)={|Pesu)&JI!VYG>WsAMfBA^FFaZ zhJ19ClJ6^1Gko`1pz*d|`J|=)2U4&N-qw1Va6l3H!nb15+lM1q#yYRx{DS3uWMP0u zV+NaoC${C+?^;^s#+8H+0Hb4_IVI%$APGoSkRkK=h97ffTl&c}A;1Pb%xTBjNzW|B zr<`G5vzaI`N%1)JXAQkiwzklOqPXe0bl<$YRQ9eszisn7j{5N^Ye9I&^cplM_4lI_ zR|6c@@^M9Gvy8&(;sc)76%@8*6ICQ?O8C2mkx!Ny3N?zx2MpJ*(`Y`kh?okoQ!%)q z!1;uum?a~X3j;fB9|CZy%vjZl3th-Znds3SyglObNF_gUP*5btN!ArRbTZM6?Ezg0uH*IK(n|-<28{bE=sKIK!(*Rp`kP=i%!be-y zRcmEimW=ga?}vTb;4-O9d-P>(=ZAd*nyA`NCBjhWvI#|wePB@x#8)%BRWCqBIQjyO zVb-$^4;HO{$w83v?b-@AXZgF>W9gISuoyejbEn7Hm+_M98V&kSpKmxmOV11^(WC*o zKVp^Wb)AU7R55BQE)V8eCY#+wJ&EwCC+6ndwye&fYHzQX&669fot^ONX~hn&6|oxp zwx?*zKGsDrQ;~Gy?qI1&_UT3o(B-~(yh(ux@}{%UNeaB~z!Q)XQgT$bGBhCu9m&?N z%@GyV{?4DG|}_bRt8No;L(ve%k($ zS5MS!36DzM>~89B8q%7UwU9Qo*6VSV_lIS)rG!SA8`RU!a8A#80gD*>0F*rAGQ7PG zn+sD4?fcoV+!$rpz|WxBM+oh^dZi=8wjWXI`VnwfJ@gh(dnD8E<0oF~o7rxo^i2s< zhT$m^f}TMlwnpaXNyaG+)Dji5j!>)4_U{93eZgnpmhT!8m`{YK3c|1a8f}ti0Wrk5 zF7BAYHA>|z%>h5U%Jb7n>!`iwr8_`pwWjw+@sE}nXf*rK*EWz&A9ah_!Z`qYP!vZu zHa@P{V-WxHGxt%6;ZSn)s@|(}4zlw`&j;=}c%?cWNYXj#yEg6%-1+Dy@Mrt099a^Y zTlhf5kAZr0y--@m;oLTHj@(iMr7fO$uw*Kjt+ul~*})U{#TSPTq=8M=YI7~nt3-0j z>aBAEcJx|0$~_+vPF>d#O?+-jup6ay{D+vf=UMIw&2pTj{j9R$HLIltUjy2GlDB$3 zW7?uv{@1>h?N)Dr3JiBpMGu7JQ zW;x`DFxyb6NgXT@nC9(jalIA;qOb)yax2G?PUFW zsJ*6eF&-ITBwR0BvNUQ@HRL3dmJFt#s%4o6+$M&S}t8BpWS<2kExtk9&HEKEpL`Lt<%es|!sh?LVNJAU$UbohK z50!qBRjPurOai-bNj1ap4Eo?WDH2gFXt)M+o?a7*o8MYjc~MuLq+uVwzA*iycEgaX zm6Y}t2OYv|A2qPzjC4sp3HVS(lEA0`O^3n%g`EAgX~2nvXK+Xz`CZl2&Ff)k8H?2G zhT5e3Jxhi0W}dfeSr&Yxd+N)t9*rbI5Jls)D&$U} z`PSj~Eq;=&^QJ zk4+|Z!op|C<T@&D_ zIO(;=6Fv6uJ2mIyjlFn#cY#0@uD*nOd@oynqsJgrcSq?C>0#n8`~9AWwMV6 zLA|BZwyDSLBdQ6WJ`MhEs^b&@#HGaJF&pH!U=dLpq=<|H{K-2l|%UV%an|cCBT2Sd}WromT>0DfEBaf+o zx2hrkJMDsB>vy&TLCC}olmvKnc+)pq*SUdHVE%QS(zU$o|lPvr^6oaUnVg+Wv`w+^ZGr?1gD&82$w9yIGMhD5%Jzp>P)6Mebxqe zahimBMuz4I=tVxGcE7T1p`5&qJ*$xmC?j!sFQ8Pa8h9{mwwhfq5DyZp2|3x1*A}m7 zn9%hd;RnC|W%r&vea^i;yG-n29Z$IH6)##>s3Z;8A@0n9eWc7X4o<`V=v@XpX9!%5 zELeKv^yJ;JoflRx9YN8A+K;r>5vRnTM^EK|=tl1$(wTa!AmdsMt2!lKuqL&?9q4W^ z7EGIzoWivGy0^uXmYCiO)gH7Z-ex9KB}2)aa5IlVJ7%T$`9&L?52d1#_WvvhD03qB|tH{8JvCnG9FygcbcLiuO3Mni;7$-or zojzE_;0Y;q+t>dl{^7EP)-vn8}$FiEmy|`@s+2`3`{vBUYR+& zJ*shZrn5LM^*^`|Y9lC$1*)N^6UhN``F_&Ro+R+vpnS}O|JQJVFx?(fqj?bv>_@Mu zGjR=ebkX-AT9}rlD|V1R1qmfyA_ce549R36m(mNkL)9lD&Ysp0 z8#C%z)6p_L>gaEKRe!H5Ea)4!7gp{3)y7sep74|Rj5_%BJb(X8bg3q2WF{%dE;QlZ?(@EjkNC&xnZR>@@rltOADP8m0I|aO^%{loME)HR-fa zyehsp-bsHeJwMy)aWOTWeJP#G4!-B9)_7qQCVw~d=(XJ38NZ5`qlT!&(`M<3@}fPL z0}KFg1@P^Z`{Mt*)g=BE!bWWtQNmsDZhU zr_eitJ~~&83`jlAB4+SF?^__5gQ}(rylCR15>M!|1bTDs zo%$IqCLkI(>LZ+wSu8R>m9}w`e}h8Jyp$Gyor+X>yUkBYckNnZEIkB^(heDqnyb>f zp^ci0+Q&^az8syWo=7|obC_4?F5ExY8wU8_UQB)MX< z@s?M(V{oUEpk0sFHYt9u4d3h2m>}33&UiTI*ps?`kJVc~0xGF?deCVSi)RB^LD6Ab z>oc;8r0)$pra-7nLGiUjs24d1$d%nBR`@tkCkA2&lRxU4jCm$`bsFp^ZkKCgu2-S= zRYJe-R!NWLvzM|(1aJDjPw8-)GJ}q#s3XH{NYH(-HW3BcsG3r>Z@wv}r;Nw@X$I$>%E-!yg~n-eNyFBBQl31xAb*s*Y0*Q zNk!B!dK+^FVj82;)D_ZF(p=?PG-}>sidg1FQ+NwNBWumF-@Dc8E_-yJX5n{|+grsM zJN3=Thh2qy<68bDZ#;(390>Egv6#+6xn10&?>7nJbDV*ja})-Irh` z4k9(?+ghSE%^=-+(wcRhieB@WLps+BdHg?|o}7F?nJo7|@E`>W|QP62*| zph|)Y=w7N5i-1b?lit`poP5L`odTy;(Ag^v$^q}(x=|ra2ltcdhjh$)elgzyh`3np zuJrhuV5?h))xfJ}plpJQ=H>z}el00-R?AZ7hdN8GDvd+g=6!0F6FQbEke^BxE|ZBF zg`wkfY|kGtfnl*K9@Eh|$o3tJBw zpbTD{9zU&eW>xH)5j_jZ#KoRs)s2H%r*sSV0lP3&6#R?Q=-XLLt)i^&v}^+=x-(=f z85-OSszWEi+){4&a{is-xg$aI)@iIm@f_x76n~$>M^}mBHvOW-^pp=90K|;deD=d8 zW%TJzKVOrfc>r*;SWnatN*861ul66Kt2FuS9LZ0V!yeEtypwzg-hQUD=Yr{=C@*5G z)3ZOWdvvPG7_&TE7*Alw8LX-d4J66zFHsXx)6NZ*TJ&@~mI2gI_QYm6A-;zdYC4#X zH&3vtamGh>MF()SnVX4WRq&A&D8c)%AYl&n08ZDiGv($Fs-ma!hNJo9>E%hq{KsHN zX5w3EG!Q%SW4)wab@!6U10w`C;r>Fa0#$(Q&1{FXuTi3;qb(yzMXPanc{1+w1y$e; zptdiNzP_3Mk=|LIW-t0bEX?vq@ruvOE9@1P<4Ukyv)R~7)a+K-A;do1O zs?BSkKX%|$Y5Pf-+evX1lqApox#r;qftx~5ozcsRtytS$x(0mX7Ww_nxP{oUlLg?s z<>Ssu?LAd#!w=3Q-qg}twy_W5t{KVLE0F1~->y2(wRtRBRnX(8KwB@vcEJsfSI<4! zCA*hA5t_&(Ra1xSaF_ENfc}&3mis>Hm<}u8_2w!vakP%G8)7ddDEA(a9-Od3<`Cup zhSCpUPVXQxs1SHT<|Z|SN5!(L$BObVxjK`PeB&ojrTn!aer7*@eo!9em#$WauEyYj z=RME&LA6;f4=b{YCIx!sk$(?bg-9Pf%$xoVsRTKsoMw?Qm~i}y176*>I+YNNKtEfj zi74ajW?c_d^CoxM5+bXSo8zQRIV`a2Gu=U@3;}1yC8V%OUVV-k@F6cEW5a|Ngt<2& zxef8je(8W_Jen`e7~%dV;ihSLtM>Fuj{wISJ2AJ8C8q7vRDc0H`{Q(6rB<*yC7Vv9 zF+e_xYFE+(O+QD@+Y96sPs%`Z2p>(?^9e7KS_=Sg)PJ>d4{v&@QL7WTzHF>Xg~a}bWTuKDnnyOz=5(%Ov*QaeX{bVo(i>u z^10O+||U2j%2N(n`UB}nJ-L3*RZoe>#e)Zr1k=#Q)A`v@>rC( zDGZG0)Ns@BQfCw~=G=Z2kjO>by+{^6Ic&`Z_5zKhqJI>)Ge`_?>oS+X5~bgI-OSVK zL=F}C-&bBI8E=|m@RYScMrm`#g=@Yk_QRhw(%lHr9)LmFM30T^mlf?NOUHEXyF#5o zG22mrdO`53dFns6cQhD$Z@yae@0pvh0yNNA{xC5p%6D(l^ffUh;$3EKVQHu_!NHq$ zOc{~JbUL<#%DA~Nx6z28#iNYmCogw{o_f0slRWXlC?w`ET9^A#cGY1Kez`TE{r)*`Gl*W=srqak+d)ek)#m` zXedW-;Pw#Y?M8HUd9pE8%>MqtyMCR{)=ksjeviB;?N|>S*ovh05t2Uh^^I9(4#u|k zqFRvH9r!ZX(DY$ZLrj8ph2-CeXdoflSgnrj9=m@ptEes+`4L03-gPiTQEvgeyNd809|5zR&;rZY4F^gER806*M~85{r6v@xEo7lucky}aa{cN;NE}x zfrqY>E^aRg)Yrl6T6;SVMP6w*Mh4_NM0W1o5z~h~#o&Y5@%@3Pu}jy4A_^W>o5~-? zN`4s_Y4q3Llg5gE@Fnsr@wCF)1?%5L-QMmh!~FX8UF*dVp@}shZ~zctsc!JDB8;tD#jSui~LSDNsgG!-kD7#|be!o15*s$ouK|5bn`T;@5oWeb^uLK-Fj!y@ALl)E{4fl*zhKC!_IIAhZet}c zsGQMvL}pcsG21Bs*Ou*6vv_x`&a50m*_3P3FcuHDKVyrLi<@ybZ;Tb1nqn5#>PNld z`ENBv3A>-ZJk3k@fKyJ(vdFnN^K0a~H_t3UJ?VKn>+;5T+?#i-cB2R#pH1s94{IYt zYPLRd6WP><7*_Is8BYuwP2#$0Xo}<^Gy6Zo>|x;2RURUJO*x%8&ti)`3>+I#8hm!r zX{D-^mh%aW`-Yz<-pLOs!E*R>%J>}i#}|sNF{Te-{OmNraW5F1yk2y&n~bkMDsyr( zeq#7dPx6`q`=2qz3V{53b)2F{&Q4^|g`FeaTP$&U%Z3G~8O~W8Y1(hX_}ix&zo^&j zZ=JdzNUg}>ZG-0DAX7bJrMAbHwa@1m`uZ;UzCD3B|F`pwG@2~=8=v$4_|+u~5#-gP zn;i1j+D9=xd^JjeH8MSn2Q)hgvN0dVsyDRx8p|YjghLkN0RG;k&0#qI`HGK|i>m#S zk2(XA^WS(^j6+I0Lj~ur&BFNQKMVptp32pIm%wLNa?L`{gR2rL= zKc^ZmHuilE1sX*x?t8qY<|5V>o#TnF9|!4Q!*Tx|@=Y%EsPe>jh2A#5KelRfs7=nj zEWn%!wii;>p2>2wTm?~Z4u@Gp8AYe-Gp~G}9tTG8ExZlTveB4+N=5W|w)Q9Pc6!gc znXe{vir;bLWl>mv=syoc@El#orOwZ;HjDlpf!;W~(rFhj)$M-8?AeTQcF|gczemWe zdNTz(Pi35dJ8)4ag&qXgaf-L{N(a zi>iz@_mjEbtjzz8hW&gBsDU0Fn<#foFfBHn(W#~Gt=m}QLUP{+s}6W(Cw}J8ZReNe z{`S|$q6`yTBUknK34XDf?bXVXwo`$ZMtf)7LW*I>_KpK`r?m@RxVxJ-CaNF-UW

T}Ke+!9t-m?i2X-;f#-{#p<{2~ia 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

T}Ke+!9t-m?i2X-;f#-{#p<{2~ia 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 { - const png = fs.readdirSync(__dirname).find(file => file.endsWith(".png")); - expect(fs.readFileSync(__dirname + "/" + png)).toEqual( - fs.readFileSync(__dirname + "/../" + "img.png") - ); -}); diff --git a/packages/rspack/tests/configCases/loader/issue-4838/b.js b/packages/rspack/tests/configCases/asset/rspack-issue-2283/img.png similarity index 100% rename from packages/rspack/tests/configCases/loader/issue-4838/b.js rename to packages/rspack/tests/configCases/asset/rspack-issue-2283/img.png diff --git a/packages/rspack/tests/configCases/asset/rspack-issue-2283/index.js b/packages/rspack/tests/configCases/asset/rspack-issue-2283/index.js new file mode 100644 index 000000000000..046232001338 --- /dev/null +++ b/packages/rspack/tests/configCases/asset/rspack-issue-2283/index.js @@ -0,0 +1,7 @@ +import fs from "fs"; + +it("should create the same asset as input", () => { + expect(fs.readFileSync(__dirname + "/" + require("./img.png"), "utf-8")).toBe( + "" + ); +}); diff --git a/packages/rspack/tests/configCases/asset/issue#2283/webpack.config.js b/packages/rspack/tests/configCases/asset/rspack-issue-2283/webpack.config.js similarity index 100% rename from packages/rspack/tests/configCases/asset/issue#2283/webpack.config.js rename to packages/rspack/tests/configCases/asset/rspack-issue-2283/webpack.config.js diff --git a/packages/rspack/tests/configCases/builtin-swc-loader/issue-4597/index.js b/packages/rspack/tests/configCases/builtin-swc-loader/issue-4597/index.js index f6e6d524febd..f135786a83c4 100644 --- a/packages/rspack/tests/configCases/builtin-swc-loader/issue-4597/index.js +++ b/packages/rspack/tests/configCases/builtin-swc-loader/issue-4597/index.js @@ -3,6 +3,7 @@ import fs from "fs"; it("should generate css successfully", () => { const dir = fs.readdirSync(__dirname); - expect(dir).toStrictEqual(["main.css", "main.js"]); + expect(dir.includes("bundle0.js")).toBeTruthy(); + expect(dir.includes("bundle0.css")).toBeTruthy(); expect(Button).toBe("button"); }); diff --git a/packages/rspack/tests/configCases/builtin-swc-loader/issue-4597/node_modules/aaaaa/es/index.js b/packages/rspack/tests/configCases/builtin-swc-loader/issue-4597/node_modules/aaaaa/es/index.js index 30df6a6d7cef..572dc5f080de 100644 --- a/packages/rspack/tests/configCases/builtin-swc-loader/issue-4597/node_modules/aaaaa/es/index.js +++ b/packages/rspack/tests/configCases/builtin-swc-loader/issue-4597/node_modules/aaaaa/es/index.js @@ -1 +1 @@ -import {default as Button} from './button'; \ No newline at end of file +import {default as Button} from 'aaaaa/es/button'; diff --git a/packages/rspack/tests/configCases/builtin-swc-loader/react-refresh-false/webpack.config.js b/packages/rspack/tests/configCases/builtin-swc-loader/react-refresh-false/webpack.config.js index f8de9ff7dbb6..bc22007f080f 100644 --- a/packages/rspack/tests/configCases/builtin-swc-loader/react-refresh-false/webpack.config.js +++ b/packages/rspack/tests/configCases/builtin-swc-loader/react-refresh-false/webpack.config.js @@ -1,4 +1,5 @@ module.exports = { + entry: "./index.jsx", resolve: { extensions: ["...", ".ts", ".tsx", ".jsx"] }, diff --git a/packages/rspack/tests/configCases/builtin-swc-loader/react-runtime-automic/webpack.config.js b/packages/rspack/tests/configCases/builtin-swc-loader/react-runtime-automic/webpack.config.js index d62938004182..70da00081147 100644 --- a/packages/rspack/tests/configCases/builtin-swc-loader/react-runtime-automic/webpack.config.js +++ b/packages/rspack/tests/configCases/builtin-swc-loader/react-runtime-automic/webpack.config.js @@ -1,4 +1,5 @@ module.exports = { + entry: "./index.jsx", resolve: { extensions: ["...", ".ts", ".tsx", ".jsx"] }, diff --git a/packages/rspack/tests/configCases/builtin-swc-loader/react-runtime-classic/webpack.config.js b/packages/rspack/tests/configCases/builtin-swc-loader/react-runtime-classic/webpack.config.js index da00820a97ca..516a16ff0586 100644 --- a/packages/rspack/tests/configCases/builtin-swc-loader/react-runtime-classic/webpack.config.js +++ b/packages/rspack/tests/configCases/builtin-swc-loader/react-runtime-classic/webpack.config.js @@ -1,4 +1,5 @@ module.exports = { + entry: "./index.jsx", resolve: { extensions: ["...", ".ts", ".tsx", ".jsx"] }, diff --git a/packages/rspack/tests/configCases/builtin-swc-loader/source-map/index.js b/packages/rspack/tests/configCases/builtin-swc-loader/source-map/index.js index 976f3d340f0f..690ab0d80ef5 100644 --- a/packages/rspack/tests/configCases/builtin-swc-loader/source-map/index.js +++ b/packages/rspack/tests/configCases/builtin-swc-loader/source-map/index.js @@ -6,7 +6,7 @@ it("should generate correct sourceMap", async () => { const source = fs.readFileSync(__filename + ".map", "utf-8"); const map = JSON.parse(source); const sourceContent = fs.readFileSync( - path.resolve(__dirname, "../a.ts"), + __dirname + "/" + require("!!./a.ts?resource"), "utf-8" ); expect(map.sources).toContain("webpack:///./a.ts"); diff --git a/packages/rspack/tests/configCases/builtin-swc-loader/source-map/source.txt b/packages/rspack/tests/configCases/builtin-swc-loader/source-map/source.txt new file mode 100644 index 000000000000..ec127c18f7ae --- /dev/null +++ b/packages/rspack/tests/configCases/builtin-swc-loader/source-map/source.txt @@ -0,0 +1,4 @@ +let foo: string = "f1"; +let bar: string = "b1"; +let baz: string = "b2"; +const boo = "abc"; diff --git a/packages/rspack/tests/configCases/builtin-swc-loader/source-map/webpack.config.js b/packages/rspack/tests/configCases/builtin-swc-loader/source-map/webpack.config.js index f5a8f1d99d46..a6f5d2881154 100644 --- a/packages/rspack/tests/configCases/builtin-swc-loader/source-map/webpack.config.js +++ b/packages/rspack/tests/configCases/builtin-swc-loader/source-map/webpack.config.js @@ -22,6 +22,13 @@ module.exports = { } ], type: "javascript/auto" + }, + { + resourceQuery: /resource/, + type: "asset/resource", + generator: { + filename: "source.txt" + } } ] } diff --git a/packages/rspack/tests/configCases/builtin-swc-loader/styled-components/index.jsx b/packages/rspack/tests/configCases/builtin-swc-loader/styled-components/index.jsx index 44e5565cab4c..5f63de1c27de 100644 --- a/packages/rspack/tests/configCases/builtin-swc-loader/styled-components/index.jsx +++ b/packages/rspack/tests/configCases/builtin-swc-loader/styled-components/index.jsx @@ -2,11 +2,9 @@ import { Container } from "./Button"; import { Container as Container2 } from "./Button2"; it("styled components", () => { - expect(Container.displayName).toMatch("Button__Container"); expect(Container.styledComponentId).toMatch( /^Button__Container-rspack-test__/ ); - expect(Container2.displayName).toMatch("Button2__Container"); expect(Container2.styledComponentId).toMatch( /^Button2__Container-rspack-test__/ ); diff --git a/packages/rspack/tests/configCases/builtin-swc-loader/styled-components/webpack.config.js b/packages/rspack/tests/configCases/builtin-swc-loader/styled-components/webpack.config.js index 11bd6cb711c6..ec413d6b090d 100644 --- a/packages/rspack/tests/configCases/builtin-swc-loader/styled-components/webpack.config.js +++ b/packages/rspack/tests/configCases/builtin-swc-loader/styled-components/webpack.config.js @@ -1,5 +1,6 @@ /** @type {import('@rspack/core').Configuration}*/ module.exports = { + entry: "./index.jsx", resolve: { alias: { "@xstyled/styled-components": "styled-components" diff --git a/packages/rspack/tests/configCases/builtins/banner/test.config.js b/packages/rspack/tests/configCases/builtins/banner/test.config.js new file mode 100644 index 000000000000..89647663beea --- /dev/null +++ b/packages/rspack/tests/configCases/builtins/banner/test.config.js @@ -0,0 +1,5 @@ +module.exports = { + findBundle: (i, options) => { + return ["main.js"]; + } +}; diff --git a/packages/rspack/tests/configCases/builtins/banner/webpack.config.js b/packages/rspack/tests/configCases/builtins/banner/webpack.config.js index 8ba2dc0b748c..b339a5ed7a34 100644 --- a/packages/rspack/tests/configCases/builtins/banner/webpack.config.js +++ b/packages/rspack/tests/configCases/builtins/banner/webpack.config.js @@ -5,10 +5,16 @@ module.exports = { main: "./index", a: "./a" }, + target: "node", output: { + filename: "[name].js", + chunkFilename: "[name].js", assetModuleFilename: "[name][ext]" }, devtool: "source-map", + optimization: { + chunkIds: "named" + }, module: { rules: [ { diff --git a/packages/rspack/tests/configCases/builtins/css-auto/index.js b/packages/rspack/tests/configCases/builtins/css-auto/index.js index 127a8e08744e..461efcae309a 100644 --- a/packages/rspack/tests/configCases/builtins/css-auto/index.js +++ b/packages/rspack/tests/configCases/builtins/css-auto/index.js @@ -8,6 +8,6 @@ it("css/auto can handle css module correctly", () => { it("css/auto can handle css correctly", () => { require("./index.css"); - const css = fs.readFileSync(path.resolve(__dirname, "main.css"), "utf-8"); + const css = fs.readFileSync(path.resolve(__dirname, "bundle0.css"), "utf-8"); expect(css.includes("aliceblue")).toBe(true); }); diff --git a/packages/rspack/tests/configCases/builtins/html-entry-order/test.config.js b/packages/rspack/tests/configCases/builtins/html-entry-order/test.config.js new file mode 100644 index 000000000000..89647663beea --- /dev/null +++ b/packages/rspack/tests/configCases/builtins/html-entry-order/test.config.js @@ -0,0 +1,5 @@ +module.exports = { + findBundle: (i, options) => { + return ["main.js"]; + } +}; diff --git a/packages/rspack/tests/configCases/builtins/html-entry-order/webpack.config.js b/packages/rspack/tests/configCases/builtins/html-entry-order/webpack.config.js index 60fcb1f39ec3..566b16b81b88 100644 --- a/packages/rspack/tests/configCases/builtins/html-entry-order/webpack.config.js +++ b/packages/rspack/tests/configCases/builtins/html-entry-order/webpack.config.js @@ -6,6 +6,9 @@ module.exports = { polyfill: "./polyfill.js", main: "./index.js" }, + output: { + filename: "[name].js" + }, plugins: [ new rspack.HtmlRspackPlugin({ template: "./index.html" diff --git a/packages/rspack/tests/configCases/builtins/html-inject/index.js b/packages/rspack/tests/configCases/builtins/html-inject/index.js index 1d427ecf57e2..0dd22ce1dd15 100644 --- a/packages/rspack/tests/configCases/builtins/html-inject/index.js +++ b/packages/rspack/tests/configCases/builtins/html-inject/index.js @@ -5,7 +5,7 @@ it("body-index.html inject", () => { const htmlPath = path.join(__dirname, "./body-index.html"); const htmlContent = fs.readFileSync(htmlPath, "utf-8"); expect( - htmlContent.includes('') + htmlContent.includes('') ).toBe(true); }); @@ -13,28 +13,28 @@ it("head-index.html inject", () => { const htmlPath = path.join(__dirname, "./head-index.html"); const htmlContent = fs.readFileSync(htmlPath, "utf-8"); expect( - htmlContent.includes('') + htmlContent.includes('') ).toBe(true); }); it("true-blocking-index.html inject", () => { const htmlPath = path.join(__dirname, "./true-blocking-index.html"); const htmlContent = fs.readFileSync(htmlPath, "utf-8"); - expect(htmlContent.includes('')).toBe( - true - ); + expect( + htmlContent.includes('') + ).toBe(true); }); it("true-defer-index.html inject", () => { const htmlPath = path.join(__dirname, "./true-defer-index.html"); const htmlContent = fs.readFileSync(htmlPath, "utf-8"); expect( - htmlContent.includes('') + htmlContent.includes('') ).toBe(true); }); it("false-index.html inject", () => { const htmlPath = path.join(__dirname, "./false-index.html"); const htmlContent = fs.readFileSync(htmlPath, "utf-8"); - expect(htmlContent.includes('