From a7ba76423ef58d31d64d47e7142d1403eaed89b7 Mon Sep 17 00:00:00 2001 From: Juan Picado Date: Tue, 30 Jun 2020 21:55:14 +0200 Subject: [PATCH] refactor: test api refactor (#1826) * test: add test for whoami * Update middleware.ts * test for user api * more test for user api * remove repeated code * refactor * Update index.spec.ts * add package test refactor others * chore: upgrade deps * chore: add test for package * chore: update test * update lock file * Update ci.yml * Update ci.yml * Update package.spec.ts * chore: update ci settings * chore: update deps * chore: update test --- .eslintignore | 3 + .eslintrc | 99 +------- .github/workflows/ci.yml | 12 +- .../workflows/docker-publish-pre-check.yml | 6 - .github/workflows/docker-publish.yml | 2 + debug/DEBUGGING.md | 23 ++ package.json | 39 +-- .../api/__mocks__/@verdaccio/logger/index.js | 19 ++ packages/api/package.json | 6 +- packages/api/src/index.ts | 1 - packages/api/src/package.ts | 2 +- packages/api/src/publish.ts | 4 +- packages/api/src/user.ts | 12 - packages/api/test/.eslintrc | 8 + packages/api/test/integration/_helper.ts | 70 ++++++ .../api/test/integration/config/package.yaml | 30 +++ .../api/test/integration/config/ping.yaml | 30 +++ .../api/test/integration/config/publish.yaml | 30 +++ .../api/test/integration/config/user.yaml | 36 +++ .../api/test/integration/config/whoami.yaml | 36 +++ packages/api/test/integration/package.spec.ts | 83 ++++++ packages/api/test/integration/ping.spec.ts | 16 ++ packages/api/test/integration/publish.spec.ts | 179 +++++++++++++ packages/api/test/integration/user.spec.ts | 237 ++++++++++++++++++ packages/api/test/integration/whoami.spec.ts | 53 ++++ .../__snapshots__/publish.spec.ts.snap | 0 packages/api/test/{ => unit}/publish.spec.ts | 4 +- .../validate.api.params.middleware.spec.ts | 3 +- packages/auth/package.json | 2 +- packages/cli/package.json | 2 +- packages/commons/src/helpers/pkg.ts | 8 +- packages/hooks/package.json | 4 +- packages/logger-prettify/package.json | 2 +- packages/logger/package.json | 2 +- packages/middleware/package.json | 2 +- packages/middleware/src/middleware.ts | 203 +++++++-------- packages/middleware/types/custom.d.ts | 14 +- packages/proxy/package.json | 6 +- packages/server/src/server.ts | 4 +- packages/server/test/.eslintrc | 8 + packages/server/test/api/index.spec.ts | 161 ------------ packages/server/types/custom.d.ts | 6 - packages/store/package.json | 8 +- packages/utils/package.json | 2 +- packages/utils/test/.eslintrc | 8 + packages/web/package.json | 2 +- packages/web/types/custom.d.ts | 6 - tsconfig.json | 2 +- yarn.lock | Bin 978569 -> 939466 bytes 49 files changed, 1059 insertions(+), 436 deletions(-) create mode 100644 debug/DEBUGGING.md create mode 100644 packages/api/__mocks__/@verdaccio/logger/index.js create mode 100644 packages/api/test/.eslintrc create mode 100644 packages/api/test/integration/_helper.ts create mode 100644 packages/api/test/integration/config/package.yaml create mode 100644 packages/api/test/integration/config/ping.yaml create mode 100644 packages/api/test/integration/config/publish.yaml create mode 100644 packages/api/test/integration/config/user.yaml create mode 100644 packages/api/test/integration/config/whoami.yaml create mode 100644 packages/api/test/integration/package.spec.ts create mode 100644 packages/api/test/integration/ping.spec.ts create mode 100644 packages/api/test/integration/publish.spec.ts create mode 100644 packages/api/test/integration/user.spec.ts create mode 100644 packages/api/test/integration/whoami.spec.ts rename packages/api/test/{ => unit}/__snapshots__/publish.spec.ts.snap (100%) rename packages/api/test/{ => unit}/publish.spec.ts (98%) rename packages/api/test/{ => unit}/validate.api.params.middleware.spec.ts (90%) create mode 100644 packages/server/test/.eslintrc create mode 100644 packages/utils/test/.eslintrc diff --git a/.eslintignore b/.eslintignore index 6a0f1134b..e4c97f862 100644 --- a/.eslintignore +++ b/.eslintignore @@ -13,6 +13,9 @@ Dockerfile *.html *.scss *.png +*.json +*.name +*.tgz *.jpg *.sh **/partials/** diff --git a/.eslintrc b/.eslintrc index afbb0e594..28db2d51c 100644 --- a/.eslintrc +++ b/.eslintrc @@ -1,102 +1,21 @@ { "extends": [ - "eslint:recommended", - "google", - "plugin:react/recommended", - "plugin:jest/recommended", - "plugin:@typescript-eslint/eslint-recommended", - "plugin:@typescript-eslint/recommended", - "plugin:import/typescript", - "plugin:jsx-a11y/recommended", - "prettier" + "@verdaccio" ], - "plugins": ["import", "jest", "jsx-a11y", "react-hooks"], - "env": { - "es6": true, - "node": true, - "jest": true - }, - "globals": { - "__APP_VERSION__": true - }, - "parserOptions": { - "allowImportExportEverywhere": true, - "sourceType": "module", - "ecmaVersion": 11, - "ecmaFeatures": { - "impliedStrict": true, - "jsx": true - } - }, - "settings": { - "import/resolver": { - "node": { - "extensions": [".js", ".jsx", ".ts", ".tsx"] - } - } - }, - "parser": "@typescript-eslint/parser", "rules": { - "curly": ["error", "all"], - "react/prop-types": 0, - "jest/no-export": 0, - "jest/no-test-callback": 0, - "jest/expect-expect": 0, - "jest/no-try-expect": 0, - "jest/no-done-callback": "off", - "jest/no-conditional-expect": "off", - "keyword-spacing": "off", - "no-tabs": "off", - "no-useless-escape": "off", - "padded-blocks": "off", - "require-jsdoc": "off", - "valid-jsdoc": "off", - "import/order": ["error"], - "eol-last": "error", - "no-irregular-whitespace": "error", - "no-mixed-spaces-and-tabs": ["error", "smart-tabs"], - "no-trailing-spaces": "error", - "camelcase": "off", - "guard-for-in": "error", - "new-cap": "error", - "max-len": ["error", 180], - "no-console": ["error", { "allow": ["warn"] }], - "no-constant-condition": "error", - "no-debugger": "error", - "no-empty": "error", - "no-fallthrough": "error", - "no-invalid-this": "error", - "no-new-require": "error", - "no-undef": "error", - "no-unreachable": "error", - "no-var": "error", - "one-var": "error", - "prefer-rest-params": "error", - "prefer-spread": "error", - "handle-callback-err": 0, - "prefer-const": 0, - "@typescript-eslint/camelcase": 0, - "@typescript-eslint/ban-ts-ignore": 0, "@typescript-eslint/no-var-requires": 0, + "@typescript-eslint/ban-ts-ignore": 0, "@typescript-eslint/no-inferrable-types": 0, "@typescript-eslint/no-empty-function": 0, - "@typescript-eslint/no-this-alias": 0, + "@typescript-eslint/no-this-alias": ["warn"], "@typescript-eslint/no-use-before-define": 0, - "@typescript-eslint/array-type": ["error"], + "@typescript-eslint/array-type": ["warn"], "@typescript-eslint/no-explicit-any": 0, "@typescript-eslint/indent": 0, - "@typescript-eslint/ban-ts-comment": 0, - "@typescript-eslint/ban-types": 0, - "@typescript-eslint/explicit-module-boundary-types": 0, - - // rules to fix - "no-unused-vars": ["warn", { "vars": "all", "args": "none" }], - "jest/no-identical-title": ["warn"], - "prefer-promise-reject-errors": ["warn"], - "jest/no-disabled-tests": ["warn"], - "jest/no-commented-out-tests": ["warn"], - "@typescript-eslint/prefer-optional-chain": ["warn"], - "@typescript-eslint/explicit-member-accessibility": ["warn"], - "@typescript-eslint/no-unused-vars": ["warn"] + "@typescript-eslint/interface-name-prefix": 0, + "import/order": 0, + "handle-callback-err": 1, + "prefer-const": 1, + "prefer-promise-reject-errors": 1 } } diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 7bb7d84d0..b9d23b953 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -1,6 +1,16 @@ name: CI -on: [push, pull_request] +on: + push: + branches: + - master + pull_request: + paths: + - .github/workflows/ci.yml + - 'packages/**' + - 'jest/**' + - 'package.json' + - 'lerna.json' jobs: ci: diff --git a/.github/workflows/docker-publish-pre-check.yml b/.github/workflows/docker-publish-pre-check.yml index 8a4a232d3..e4ee0dc79 100644 --- a/.github/workflows/docker-publish-pre-check.yml +++ b/.github/workflows/docker-publish-pre-check.yml @@ -1,12 +1,6 @@ name: Docker & Publish Pre-check on: - push: - paths: - - 'packages/**' - - 'docker-bin/**' - - 'package.json' - - 'lerna.json' pull_request: paths: - .github/workflows/docker-publish-pre-check.yml diff --git a/.github/workflows/docker-publish.yml b/.github/workflows/docker-publish.yml index 394a75a77..a3bcee1e2 100644 --- a/.github/workflows/docker-publish.yml +++ b/.github/workflows/docker-publish.yml @@ -2,6 +2,8 @@ name: Docker publish to GitHub registry on: push: + branches: + - master paths: - .github/workflows/docker-publish.yml - 'packages/**' diff --git a/debug/DEBUGGING.md b/debug/DEBUGGING.md new file mode 100644 index 000000000..4c9e03232 --- /dev/null +++ b/debug/DEBUGGING.md @@ -0,0 +1,23 @@ +# Debuging Documentation + + +## Debugging tests + + + +### Running a single test + +```bash +yarn test test/integration/package.spec.ts --runInBand +``` + +Using `--runInBand` allows you to see the `console.log` prints, without that `jest` hidde them. + +#### Display additional information + +You can take advance of `debug` module used by many dependencies, eg: + +* `supertest`: `DEBUG=superagent yarn test test/integration/package.spec.ts --runInBand` +* `express`: `DEBUG=express:* yarn test test/integration/package.spec.ts --runInBand` +* `nock`: `DEBUG=nock yarn test test/integration/package.spec.ts --runInBand` +* All of if: `DEBUG=* yarn test test/integration/package.spec.ts --runInBand` diff --git a/package.json b/package.json index bd7949d6a..32dfcf2f8 100644 --- a/package.json +++ b/package.json @@ -21,18 +21,19 @@ "@commitlint/cli": "8.3.5", "@commitlint/config-conventional": "8.2.0", "@octokit/rest": "17.0.0", - "@types/async": "3.0.3", - "@types/express": "4.17.1", + "@types/async": "3.2.3", + "@types/express": "4.17.6", "@types/http-errors": "1.6.3", - "@types/jest": "25.2.3", - "@types/lodash": "4.14.151", + "@types/jest": "26.0.1", + "@types/lodash": "4.14.156", "@types/mime": "2.0.2", "@types/minimatch": "3.0.3", - "@types/node": "12.12.21", + "@types/node": "14.0.14", "@types/request": "2.48.3", "@types/semver": "7.2.0", - "@verdaccio/babel-preset": "9.4.0", - "@verdaccio/eslint-config": "9.0.0", + "@types/supertest": "2.0.9", + "@verdaccio/babel-preset": "9.6.1", + "@verdaccio/eslint-config": "9.3.2", "@verdaccio/types": "9.5.0", "codecov": "3.6.1", "cross-env": "7.0.2", @@ -42,22 +43,22 @@ "get-stdin": "7.0.0", "husky": "2.7.0", "in-publish": "2.0.0", - "jest": "26.0.1", - "jest-environment-node": "26.0.1", - "jest-junit": "10.0.0", + "jest": "26.1.0", + "jest-environment-node": "26.1.0", + "jest-junit": "11.0.1", "kleur": "3.0.3", - "lerna": "3.21.0", + "lerna": "3.22.1", "lint-staged": "8.2.1", - "nock": "11.7.2", + "nock": "12.0.3", "prettier": "1.19.1", - "rimraf": "3.0.0", + "rimraf": "3.0.2", "selfsigned": "1.10.7", - "standard-version": "7.0.1", + "standard-version": "8.0.0", "supertest": "4.0.2", - "typescript": "3.9.2", - "verdaccio": "4.6.2", - "verdaccio-auth-memory": "9.3.0", - "verdaccio-memory": "9.3.0" + "typescript": "3.9.5", + "verdaccio": "4.7.1", + "verdaccio-auth-memory": "9.7.0", + "verdaccio-memory": "9.7.0" }, "scripts": { "bootstrap": "lerna bootstrap", @@ -73,7 +74,7 @@ "release:prerelease": "lerna version --conventional-commits --conventional-prerelease --preid next --registry http://localhost:4873", "release:publish": "lerna publish from-git", "release:publish-prerelease": "lerna publish from-git --pre-dist-tag next", - "lint": "eslint \"packages/**/@(src|tests)/**\"", + "lint": "eslint \"packages/**/@(src|tests|test)/**\"", "test": "lerna run test --concurrency 1", "test:e2e:cli": "cross-env NODE_ENV=test jest --config ./test/e2e-cli/jest.config.e2e.cli.js --passWithNoTests", "website:lint": "cd website && yarn lint", diff --git a/packages/api/__mocks__/@verdaccio/logger/index.js b/packages/api/__mocks__/@verdaccio/logger/index.js new file mode 100644 index 000000000..722dd194c --- /dev/null +++ b/packages/api/__mocks__/@verdaccio/logger/index.js @@ -0,0 +1,19 @@ +const setup = jest.fn(); +const logger = { + child: jest.fn(() => ({ + debug: jest.fn(), + trace: jest.fn(), + warn: jest.fn(), + info: jest.fn(), + error: jest.fn(), + fatal: jest.fn(), + })), + debug: jest.fn(), + trace: jest.fn(), + warn: jest.fn(), + info: jest.fn(), + error: jest.fn(), + fatal: jest.fn(), +}; + +export { setup, logger } diff --git a/packages/api/package.json b/packages/api/package.json index 52ebfbd98..37b915d36 100644 --- a/packages/api/package.json +++ b/packages/api/package.json @@ -24,11 +24,12 @@ "license": "MIT", "dependencies": { "@verdaccio/auth": "5.0.0-alpha.0", - "@verdaccio/commons-api": "9.4.0", + "@verdaccio/commons-api": "9.6.1", "@verdaccio/dev-commons": "5.0.0-alpha.0", "@verdaccio/hooks": "5.0.0-alpha.0", "@verdaccio/logger": "5.0.0-alpha.0", "@verdaccio/middleware": "5.0.0-alpha.0", + "@verdaccio/store": "5.0.0-alpha.0", "@verdaccio/utils": "5.0.0-alpha.0", "body-parser": "1.19.0", "cookies": "0.8.0", @@ -38,7 +39,8 @@ }, "devDependencies": { "@verdaccio/dev-types": "5.0.0-alpha.0", - "@verdaccio/types": "9.3.0" + "@verdaccio/types": "9.5.0", + "express": "4.17.1" }, "gitHead": "7c246ede52ff717707fcae66dd63fc4abd536982" } diff --git a/packages/api/src/index.ts b/packages/api/src/index.ts index c3f994681..7ddf2a253 100644 --- a/packages/api/src/index.ts +++ b/packages/api/src/index.ts @@ -37,7 +37,6 @@ export default function(config: Config, auth: IAuth, storage: IStorageHandler): app.param('_rev', match(/^-rev$/)); app.param('org_couchdb_user', match(/^org\.couchdb\.user:/)); app.param('anything', match(/.*/)); - app.use(auth.apiJWTmiddleware()); app.use(bodyParser.json({ strict: false, limit: config.max_body_size || '10mb' })); // @ts-ignore diff --git a/packages/api/src/package.ts b/packages/api/src/package.ts index dd358c289..425b8c2a7 100644 --- a/packages/api/src/package.ts +++ b/packages/api/src/package.ts @@ -15,7 +15,7 @@ const downloadStream = (packageName: string, filename: string, storage: any, req }); stream.on('error', function(err): void { - return res.report_error(err); + return res.locals.report_error(err); }); res.header(HEADERS.CONTENT_TYPE, HEADERS.OCTET_STREAM); diff --git a/packages/api/src/publish.ts b/packages/api/src/publish.ts index 3712cf301..bab18dfcb 100644 --- a/packages/api/src/publish.ts +++ b/packages/api/src/publish.ts @@ -139,7 +139,7 @@ export function publishPackage(storage: IStorageHandler, config: Config, auth: I storage.mergeTags(packageName, tags, cb); }; - const afterChange = function(error, okMessage, metadata): void { + const afterChange = function(error, okMessage, metadata: Package): void { const metadataCopy: Package = { ...metadata }; const { _attachments, versions } = metadataCopy; @@ -326,7 +326,7 @@ export function uploadPackageTarball(storage: IStorageHandler) { }); stream.on('error', function(err) { - return res.report_error(err); + return res.locals.report_error(err); }); stream.on('success', function() { diff --git a/packages/api/src/user.ts b/packages/api/src/user.ts index 10b09681d..187d568af 100644 --- a/packages/api/src/user.ts +++ b/packages/api/src/user.ts @@ -74,16 +74,4 @@ export default function(route: Router, auth: IAuth, config: Config): void { ok: API_MESSAGE.LOGGED_OUT, }); }); - - // placeholder 'cause npm require to be authenticated to publish - // we do not do any real authentication yet - route.post('/_session', Cookies.express(), function(req: $RequestExtend, res: $ResponseExtend, next: $NextFunctionVer): void { - res.cookies.set('AuthSession', String(Math.random()), createSessionToken()); - - next({ - ok: true, - name: 'somebody', - roles: [], - }); - }); } diff --git a/packages/api/test/.eslintrc b/packages/api/test/.eslintrc new file mode 100644 index 000000000..ff8b4a8b8 --- /dev/null +++ b/packages/api/test/.eslintrc @@ -0,0 +1,8 @@ +{ + "rules": { + "@typescript-eslint/explicit-function-return-type": 0, + "@typescript-eslint/explicit-member-accessibility": 0, + "@typescript-eslint/no-unused-vars": 2, + "no-console": 0 + } +} diff --git a/packages/api/test/integration/_helper.ts b/packages/api/test/integration/_helper.ts new file mode 100644 index 000000000..19a8898df --- /dev/null +++ b/packages/api/test/integration/_helper.ts @@ -0,0 +1,70 @@ +import path from "path"; +import express, {Application} from 'express'; +import supertest from 'supertest'; + +import {parseConfigFile} from '@verdaccio/utils'; +import { Config } from '@verdaccio/config'; +import { Storage } from '@verdaccio/store'; +import { final, handleError, errorReportingMiddleware } from '@verdaccio/middleware'; +import { Auth } from '@verdaccio/auth'; +import apiEndpoints from '../../src'; +import {IAuth} from "@verdaccio/dev-types"; +import {HEADER_TYPE, HTTP_STATUS, generatePackageMetadata} from "@verdaccio/dev-commons"; +import {HEADERS} from "@verdaccio/commons-api"; + +const getConf = (conf) => { + const configPath = path.join(__dirname, 'config', conf); + + return parseConfigFile(configPath); +}; + +export async function initializeServer(configName): Promise { + const app = express(); + const config = new Config(getConf(configName)); + const storage = new Storage(config); + await storage.init(config, []); + const auth: IAuth = new Auth(config); + // @ts-ignore + app.use(errorReportingMiddleware); + // @ts-ignore + app.use(apiEndpoints(config, auth, storage)); + // @ts-ignore + app.use(handleError); + // @ts-ignore + app.use(final); + + app.use(function(request, response) { + response.status(590); + console.log('respo', response); + response.json({error: 'cannot handle this'}); + }); + + return app; +} + +export function publishVersion(app, configFile, pkgName, version): supertest.Test { + const pkgMetadata = generatePackageMetadata(pkgName, version); + + return supertest(app) + .put(`/${encodeURIComponent(pkgName)}`) + .set(HEADER_TYPE.CONTENT_TYPE, HEADERS.JSON) + .send(JSON.stringify(pkgMetadata)) + .set('accept', HEADERS.GZIP) + .set(HEADER_TYPE.ACCEPT_ENCODING, HEADERS.JSON) + .set(HEADER_TYPE.CONTENT_TYPE, HEADERS.JSON); +} + +export async function publishTaggedVersion(app, configFile, pkgName: string, version: string, tag: string) { + const pkgMetadata = generatePackageMetadata(pkgName, version, { + [tag]: version + }); + + return supertest(app) + .put(`/${encodeURIComponent(pkgName)}/${encodeURIComponent(version)}/-tag/${encodeURIComponent(tag)}`) + .set(HEADER_TYPE.CONTENT_TYPE, HEADERS.JSON) + .send(JSON.stringify(pkgMetadata)) + .expect(HTTP_STATUS.CREATED) + .set('accept', HEADERS.GZIP) + .set(HEADER_TYPE.ACCEPT_ENCODING, HEADERS.JSON) + .set(HEADER_TYPE.CONTENT_TYPE, HEADERS.JSON); +} diff --git a/packages/api/test/integration/config/package.yaml b/packages/api/test/integration/config/package.yaml new file mode 100644 index 000000000..eb4758b26 --- /dev/null +++ b/packages/api/test/integration/config/package.yaml @@ -0,0 +1,30 @@ +store: + memory: + limit: 1000 + +auth: + auth-memory: + users: + test: + name: test + password: test + +web: + enable: true + title: verdaccio + +publish: + allow_offline: false + +uplinks: + +logs: { type: stdout, format: pretty, level: trace } + +packages: + '@*/*': + access: $anonymous + publish: $anonymous + '**': + access: $anonymous + publish: $anonymous +_debug: true diff --git a/packages/api/test/integration/config/ping.yaml b/packages/api/test/integration/config/ping.yaml new file mode 100644 index 000000000..4ecd6c5fa --- /dev/null +++ b/packages/api/test/integration/config/ping.yaml @@ -0,0 +1,30 @@ +store: + memory: + limit: 10 + +auth: + auth-memory: + users: +web: + enable: true + title: verdaccio + +uplinks: + +logs: { type: stdout, format: pretty, level: trace } + +packages: + '@*/*': + access: $all + publish: $all + unpublish: $all + proxy: npmjs + 'verdaccio': + access: $all + publish: $all + '**': + access: $all + publish: $all + unpublish: $all + proxy: npmjs +_debug: true diff --git a/packages/api/test/integration/config/publish.yaml b/packages/api/test/integration/config/publish.yaml new file mode 100644 index 000000000..eb4758b26 --- /dev/null +++ b/packages/api/test/integration/config/publish.yaml @@ -0,0 +1,30 @@ +store: + memory: + limit: 1000 + +auth: + auth-memory: + users: + test: + name: test + password: test + +web: + enable: true + title: verdaccio + +publish: + allow_offline: false + +uplinks: + +logs: { type: stdout, format: pretty, level: trace } + +packages: + '@*/*': + access: $anonymous + publish: $anonymous + '**': + access: $anonymous + publish: $anonymous +_debug: true diff --git a/packages/api/test/integration/config/user.yaml b/packages/api/test/integration/config/user.yaml new file mode 100644 index 000000000..2389e1b7b --- /dev/null +++ b/packages/api/test/integration/config/user.yaml @@ -0,0 +1,36 @@ +store: + memory: + limit: 1000 + +auth: + auth-memory: + users: + test: + name: test + password: test + +web: + enable: true + title: verdaccio + +uplinks: + npmjs: + url: https://registry.npmjs.org/ + +logs: { type: stdout, format: pretty, level: trace } + +packages: + '@*/*': + access: $all + publish: $all + unpublish: $all + proxy: npmjs + 'verdaccio': + access: $all + publish: $all + '**': + access: $all + publish: $all + unpublish: $all + proxy: npmjs +_debug: true diff --git a/packages/api/test/integration/config/whoami.yaml b/packages/api/test/integration/config/whoami.yaml new file mode 100644 index 000000000..2389e1b7b --- /dev/null +++ b/packages/api/test/integration/config/whoami.yaml @@ -0,0 +1,36 @@ +store: + memory: + limit: 1000 + +auth: + auth-memory: + users: + test: + name: test + password: test + +web: + enable: true + title: verdaccio + +uplinks: + npmjs: + url: https://registry.npmjs.org/ + +logs: { type: stdout, format: pretty, level: trace } + +packages: + '@*/*': + access: $all + publish: $all + unpublish: $all + proxy: npmjs + 'verdaccio': + access: $all + publish: $all + '**': + access: $all + publish: $all + unpublish: $all + proxy: npmjs +_debug: true diff --git a/packages/api/test/integration/package.spec.ts b/packages/api/test/integration/package.spec.ts new file mode 100644 index 000000000..1bda9bddf --- /dev/null +++ b/packages/api/test/integration/package.spec.ts @@ -0,0 +1,83 @@ +import supertest from 'supertest'; + +import {initializeServer, publishTaggedVersion, publishVersion} from './_helper'; +import { HTTP_STATUS } from '@verdaccio/commons-api'; +import {HEADER_TYPE, HEADERS} from '@verdaccio/dev-commons'; +import {$RequestExtend, $ResponseExtend} from "@verdaccio/dev-types"; + +const mockApiJWTmiddleware = jest.fn(() => + (req: $RequestExtend, res: $ResponseExtend, _next): void => { + req.remote_user = { name: 'foo', groups: [], real_groups: []} + _next(); + } +); + +jest.mock('@verdaccio/auth', () => ({ + Auth: class { + apiJWTmiddleware() { + return mockApiJWTmiddleware(); + } + allow_access (_d, f_, cb) { + cb(null, true) + } + allow_publish (_d, f_, cb) { + cb(null, true) + } + } +})); + +describe('package', () => { + let app; + beforeAll(async () => { + app = await initializeServer('package.yaml'); + await publishVersion(app, 'package.yaml', 'foo', '1.0.0'); + }); + + test('should return a package', async (done) => { + + return supertest(app) + .get('/foo') + .set('Accept', HEADERS.JSON) + .expect(HEADER_TYPE.CONTENT_TYPE, HEADERS.JSON_CHARSET) + .expect(HTTP_STATUS.OK) + .then(response => { + expect(response.body.name).toEqual('foo'); + done(); + }); + }); + + test('should return a package by version', async (done) => { + return supertest(app) + .get('/foo/1.0.0') + .set('Accept', HEADERS.JSON) + .expect(HEADER_TYPE.CONTENT_TYPE, HEADERS.JSON_CHARSET) + .expect(HTTP_STATUS.OK) + .then(response => { + expect(response.body.name).toEqual('foo'); + done(); + }); + }); + + // TODO: investigate the 404 + test.skip('should return a package by dist-tag', async (done) => { + await publishVersion(app, 'package.yaml', 'foo-tagged', '1.0.0'); + await publishTaggedVersion(app, 'package.yaml', 'foo-tagged', '1.0.1', 'test'); + return supertest(app) + .get('/foo-tagged/1.0.0') + .set('Accept', HEADERS.JSON) + .expect(HEADER_TYPE.CONTENT_TYPE, HEADERS.JSON_CHARSET) + .expect(HTTP_STATUS.CREATED) + .then(response => { + expect(response.body.name).toEqual('foo'); + done(); + }); + }); + + test('should return 404', async () => { + return supertest(app) + .get('/404-not-found') + .set('Accept', HEADERS.JSON) + .expect(HEADER_TYPE.CONTENT_TYPE, HEADERS.JSON_CHARSET) + .expect(HTTP_STATUS.NOT_FOUND); + }); +}); diff --git a/packages/api/test/integration/ping.spec.ts b/packages/api/test/integration/ping.spec.ts new file mode 100644 index 000000000..08901d586 --- /dev/null +++ b/packages/api/test/integration/ping.spec.ts @@ -0,0 +1,16 @@ +import supertest from 'supertest'; + +import {initializeServer } from './_helper'; +import { HTTP_STATUS } from '@verdaccio/commons-api'; +import {HEADER_TYPE, HEADERS} from '@verdaccio/dev-commons'; + +describe('ping', () => { + test('should return the reply the ping', async () => { + return supertest(await initializeServer('ping.yaml')) + .get('/-/ping') + .set('Accept', HEADERS.JSON) + .expect(HEADER_TYPE.CONTENT_TYPE, HEADERS.JSON_CHARSET) + .expect(HTTP_STATUS.OK) + .then(response => expect(response.body).toEqual({})); + }); +}); diff --git a/packages/api/test/integration/publish.spec.ts b/packages/api/test/integration/publish.spec.ts new file mode 100644 index 000000000..31ac8c1b4 --- /dev/null +++ b/packages/api/test/integration/publish.spec.ts @@ -0,0 +1,179 @@ +import {initializeServer, publishVersion} from './_helper'; +import { HTTP_STATUS } from '@verdaccio/commons-api'; +import {API_ERROR, API_MESSAGE, generatePackageMetadata, HEADER_TYPE, HEADERS} from '@verdaccio/dev-commons'; +import {$RequestExtend, $ResponseExtend} from '@verdaccio/dev-types'; +import supertest from "supertest"; + +const mockApiJWTmiddleware = jest.fn(() => + (req: $RequestExtend, res: $ResponseExtend, _next): void => { + req.remote_user = { name: 'foo', groups: [], real_groups: []} + _next(); + } +); + +jest.setTimeout(50000000); + +jest.mock('@verdaccio/auth', () => ({ + Auth: class { + apiJWTmiddleware() { + return mockApiJWTmiddleware(); + } + allow_access (_d, f_, cb) { + cb(null, true) + } + allow_publish (_d, f_, cb) { + cb(null, true) + } + + allow_unpublish (_d, f_, cb) { + cb(null, true) + } + } +})); + +// const mockStorage = jest.fn(() => { +// const { Storage } = jest.requireActual('@verdaccio/store'); +// return { +// Storage: class extends Storage { +// addPackage(name, metadata, cb) { +// super.addPackage(name, metadata, cb); +// } +// } +// }; +// }); + +// jest.mock('@verdaccio/store', () => { +// const { Storage } = jest.requireActual('@verdaccio/store'); +// return ({ +// Storage: class extends Storage { +// addPackage(name, metadata, cb) { +// // super.addPackage(name, metadata, cb); +// return mockStorage(name, metadata, cb); +// } +// } +// }) +// }); + +describe('publish', () => { + describe('handle invalid publish formats', () => { + const pkgName = 'test'; + const pkgMetadata = generatePackageMetadata(pkgName, '1.0.0'); + test('should fail on publish a bad _attachments package', async (done) => { + const app = await initializeServer('publish.yaml'); + return supertest(app) + .put(`/${encodeURIComponent(pkgName)}`) + .set(HEADER_TYPE.CONTENT_TYPE, HEADERS.JSON) + .send(JSON.stringify(Object.assign({}, pkgMetadata, { + _attachments: {} + }))) + .set('accept', HEADERS.GZIP) + .expect(HTTP_STATUS.BAD_REQUEST) + .then(response => { + console.log("response.body", response.body); + expect(response.body.error).toEqual(API_ERROR.UNSUPORTED_REGISTRY_CALL); + done(); + }); + }); + + test('should fail on publish a bad versions package', async (done) => { + const app = await initializeServer('publish.yaml'); + return supertest(app) + .put(`/${encodeURIComponent(pkgName)}`) + .set(HEADER_TYPE.CONTENT_TYPE, HEADERS.JSON) + .send(JSON.stringify(Object.assign({}, pkgMetadata, { + versions: '' + }))) + .set('accept', HEADERS.GZIP) + .expect(HTTP_STATUS.BAD_REQUEST) + .then(response => { + console.log("response.body", response.body); + expect(response.body.error).toEqual(API_ERROR.UNSUPORTED_REGISTRY_CALL); + done(); + }); + }); + }); + + describe('publish a package', () => { + test('should publish a package', async (done) => { + const app = await initializeServer('publish.yaml'); + return publishVersion(app, 'publish.yaml', 'foo', '1.0.0') + .expect(HTTP_STATUS.CREATED) + .then(response => { + expect(response.body.ok).toEqual(API_MESSAGE.PKG_CREATED); + done(); + }); + }); + + test('should publish a new package', async (done) => { + const pkgName = 'test'; + const pkgMetadata = generatePackageMetadata(pkgName, '1.0.0'); + const app = await initializeServer('publish.yaml'); + return supertest(app) + .put(`/${encodeURIComponent(pkgName)}`) + .set(HEADER_TYPE.CONTENT_TYPE, HEADERS.JSON) + .send(JSON.stringify(Object.assign({}, pkgMetadata, { + _attachments: null + }))) + .set('accept', HEADERS.GZIP) + .expect(HTTP_STATUS.CREATED) + .then(response => { + expect(response.body.ok).toEqual(API_MESSAGE.PKG_CREATED); + done(); + }); + }); + + test('should publish a new package with no readme', async (done) => { + const pkgName = 'test'; + const pkgMetadata = generatePackageMetadata(pkgName, '1.0.0'); + const app = await initializeServer('publish.yaml'); + return supertest(app) + .put(`/${encodeURIComponent(pkgName)}`) + .set(HEADER_TYPE.CONTENT_TYPE, HEADERS.JSON) + .send(JSON.stringify(Object.assign({}, pkgMetadata, { + versions: { + ['1.0.0'] : { + readme: null + } + } + }))) + .set('accept', HEADERS.GZIP) + .expect(HTTP_STATUS.CREATED) + .then(response => { + expect(response.body.ok).toEqual(API_MESSAGE.PKG_CREATED); + done(); + }); + }); + + }); + + + test('should fails on publish a duplicated package', async (done) => { + const app = await initializeServer('publish.yaml'); + await publishVersion(app, 'publish.yaml', 'foo', '1.0.0'); + return publishVersion(app, 'publish.yaml', 'foo', '1.0.0') + .expect(HTTP_STATUS.CONFLICT) + .then(response => { + console.log("response.body", response.body); + expect(response.body.error).toEqual(API_ERROR.PACKAGE_EXIST); + done(); + }); + }); + + describe('unpublish a package', () => { + let app; + + beforeEach(async () => { + app = await initializeServer('publish.yaml'); + await publishVersion(app, 'publish.yaml', 'foo', '1.0.0'); + }) + + test('should unpublish a package', () => { + + }) + }); + + describe('star a package', () => { + + }); + +}); diff --git a/packages/api/test/integration/user.spec.ts b/packages/api/test/integration/user.spec.ts new file mode 100644 index 000000000..f58b45646 --- /dev/null +++ b/packages/api/test/integration/user.spec.ts @@ -0,0 +1,237 @@ +import supertest from 'supertest'; + +import { initializeServer } from './_helper'; +import { HTTP_STATUS, API_ERROR } from '@verdaccio/commons-api'; +import {HEADERS, HEADER_TYPE, API_MESSAGE} from '@verdaccio/dev-commons'; +import {$RequestExtend, $ResponseExtend} from "@verdaccio/dev-types"; +import {getBadRequest, getConflict, getUnauthorized} from "@verdaccio/commons-api/lib"; +import _ from "lodash"; + +const mockApiJWTmiddleware = jest.fn(() => + (req: $RequestExtend, res: $ResponseExtend, _next): void => { + req.remote_user = { name: 'test', groups: [], real_groups: []}; + _next(); + } +); + +const mockAuthenticate = jest.fn(() => (_name, _password, callback): void => { + return callback(null, ['all']); + } +); + +const mockAddUser = jest.fn(() => (_name, _password, callback): void => { + return callback(getConflict(API_ERROR.USERNAME_ALREADY_REGISTERED)); + } +); + +jest.mock('@verdaccio/auth', () => ({ + getApiToken: () => 'token', + Auth: class { + apiJWTmiddleware() { + return mockApiJWTmiddleware(); + } + allow_access (_d, f_, cb) { + cb(null, true); + } + add_user (name, password, callback) { + mockAddUser()(name, password, callback); + } + authenticate (_name, _password, callback) { + mockAuthenticate()(_name, _password, callback); + } + } +})); + +describe('user', () => { + const credentials = { name: 'test', password: 'test' }; + + test('should test add a new user', async (done) => { + mockApiJWTmiddleware.mockImplementationOnce(() => + (req: $RequestExtend, res: $ResponseExtend, _next): void => { + req.remote_user = { name: undefined}; + _next(); + } + ); + + mockAddUser.mockImplementationOnce(() => (_name, _password, callback): void => { + return callback(null, true); + } + ); + supertest(await initializeServer('user.yaml')) + .put(`/-/user/org.couchdb.user:newUser`) + .send({ + name: 'newUser', + password: 'newUser' + }) + .expect(HEADER_TYPE.CONTENT_TYPE, HEADERS.JSON_CHARSET) + .expect(HTTP_STATUS.CREATED) + .end(function(err, res) { + if (err) { + return done(err); + } + expect(res.body.ok).toBeDefined(); + expect(res.body.token).toBeDefined(); + const token = res.body.token; + expect(typeof token).toBe('string'); + expect(res.body.ok).toMatch(`user 'newUser' created`); + done(); + }); + }); + + test('should test fails on add a existing user with login', async (done) => { + mockApiJWTmiddleware.mockImplementationOnce(() => + (req: $RequestExtend, res: $ResponseExtend, _next): void => { + req.remote_user = { name: undefined}; + _next(); + } + ); + supertest(await initializeServer('user.yaml')) + .put('/-/user/org.couchdb.user:jotaNew') + .send(credentials) + .expect(HEADER_TYPE.CONTENT_TYPE, HEADERS.JSON_CHARSET) + .expect(HTTP_STATUS.CONFLICT) + .end(function(err, res) { + if (err) { + return done(err); + } + expect(res.body.error).toBeDefined(); + expect(res.body.error).toMatch(API_ERROR.USERNAME_ALREADY_REGISTERED); + done(); + }); + }); + + test('should log in as existing user', async (done) => { + supertest(await initializeServer('user.yaml')) + .put(`/-/user/org.couchdb.user:${credentials.name}`) + .send(credentials) + .expect(HEADER_TYPE.CONTENT_TYPE, HEADERS.JSON_CHARSET) + .expect(HTTP_STATUS.CREATED) + .end((err, res) => { + if (err) { + return done(err); + } + + expect(res.body).toBeTruthy(); + expect(res.body.ok).toMatch(`you are authenticated as \'${credentials.name}\'`); + done(); + }); + }); + + test('should test fails add a new user with missing name', async (done) => { + mockApiJWTmiddleware.mockImplementationOnce(() => + (req: $RequestExtend, res: $ResponseExtend, _next): void => { + req.remote_user = { name: undefined }; + _next(); + } + ); + mockAddUser.mockImplementationOnce(() => (_name, _password, callback): void => { + return callback(getBadRequest(API_ERROR.USERNAME_PASSWORD_REQUIRED)); + } + ); + const credentialsShort = _.cloneDeep(credentials); + delete credentialsShort.name; + + supertest(await initializeServer('user.yaml')) + .put(`/-/user/org.couchdb.user:${credentials.name}`) + .send(credentialsShort) + .expect(HEADER_TYPE.CONTENT_TYPE, HEADERS.JSON_CHARSET) + .expect(HTTP_STATUS.BAD_REQUEST) + .end(function(err, res) { + if (err) { + return done(err); + } + + expect(res.body.error).toBeDefined(); + expect(res.body.error).toMatch(API_ERROR.USERNAME_PASSWORD_REQUIRED); + done(); + }); + }); + + test('should test fails add a new user with missing password', async (done) => { + mockApiJWTmiddleware.mockImplementationOnce(() => + (req: $RequestExtend, res: $ResponseExtend, _next): void => { + req.remote_user = { name: undefined}; + _next(); + } + ); + const credentialsShort = _.cloneDeep(credentials); + delete credentialsShort.password; + + supertest(await initializeServer('user.yaml')) + .put(`/-/user/org.couchdb.user:${credentials.name}`) + .send(credentialsShort) + .expect(HEADER_TYPE.CONTENT_TYPE, HEADERS.JSON_CHARSET) + .expect(HTTP_STATUS.BAD_REQUEST) + .end(function(err, res) { + if (err) { + return done(err); + } + + expect(res.body.error).toBeDefined(); + // FIXME: message is not 100% accurate + // eslint-disable-next-line new-cap + expect(res.body.error).toMatch(API_ERROR.PASSWORD_SHORT()); + done(); + }); + }); + + test('should test fails add a new user with wrong password', async (done) => { + mockApiJWTmiddleware.mockImplementationOnce(() => + (req: $RequestExtend, res: $ResponseExtend, _next): void => { + req.remote_user = { name: 'test'}; + _next(); + } + ); + mockAuthenticate.mockImplementationOnce(() => (_name, _password, callback): void => { + return callback(getUnauthorized(API_ERROR.BAD_USERNAME_PASSWORD)); + } + ); + const credentialsShort = _.cloneDeep(credentials); + credentialsShort.password = 'failPassword'; + + supertest(await initializeServer('user.yaml')) + .put('/-/user/org.couchdb.user:test') + .send(credentialsShort) + .expect(HEADER_TYPE.CONTENT_TYPE, HEADERS.JSON_CHARSET) + .expect(HTTP_STATUS.UNAUTHORIZED) + .end(function(err, res) { + if (err) { + return done(err); + } + + expect(res.body.error).toBeDefined(); + expect(res.body.error).toMatch(API_ERROR.BAD_USERNAME_PASSWORD); + done(); + }); + }); + + test('should be able to logout an user', async (done) => { + mockApiJWTmiddleware.mockImplementationOnce(() => + (req: $RequestExtend, res: $ResponseExtend, _next): void => { + req.remote_user = { name: 'test'}; + _next(); + } + ); + mockAuthenticate.mockImplementationOnce(() => (_name, _password, callback): void => { + return callback(getUnauthorized(API_ERROR.BAD_USERNAME_PASSWORD)); + } + ); + const credentialsShort = _.cloneDeep(credentials); + credentialsShort.password = 'failPassword'; + + supertest(await initializeServer('user.yaml')) + .delete('/-/user/token/someSecretToken') + .send(credentialsShort) + .expect(HEADER_TYPE.CONTENT_TYPE, HEADERS.JSON_CHARSET) + .expect(HTTP_STATUS.OK) + .end(function(err, res) { + if (err) { + return done(err); + } + + expect(res.body.ok).toMatch(API_MESSAGE.LOGGED_OUT); + done(); + }); + }); + +}); diff --git a/packages/api/test/integration/whoami.spec.ts b/packages/api/test/integration/whoami.spec.ts new file mode 100644 index 000000000..13227fa90 --- /dev/null +++ b/packages/api/test/integration/whoami.spec.ts @@ -0,0 +1,53 @@ +import supertest from 'supertest'; + +import {initializeServer } from './_helper'; +import { HTTP_STATUS } from '@verdaccio/commons-api'; +import { HEADERS} from '@verdaccio/dev-commons'; +import {$RequestExtend, $ResponseExtend} from "@verdaccio/dev-types"; + +const mockApiJWTmiddleware = jest.fn(() => + (req: $RequestExtend, res: $ResponseExtend, _next): void => { + req.remote_user = { name: 'foo', groups: [], real_groups: []} + _next(); + } +); + +jest.mock('@verdaccio/auth', () => ({ + Auth: class { + apiJWTmiddleware() { + return mockApiJWTmiddleware(); + } + allow_access (_d, f_, cb) { + cb(null, true) + } + } +})); + +describe('whoami', () => { + test.skip('should test referer /whoami endpoint', async (done) => { + return supertest(await initializeServer('whoami.yaml')) + .get('/whoami') + .set('referer', 'whoami') + .expect(HTTP_STATUS.OK) + .end(done); + }); + + test.skip('should test no referer /whoami endpoint', async (done) => { + return supertest(await initializeServer('whoami.yaml')) + .get('/whoami') + .expect(HTTP_STATUS.NOT_FOUND) + .end(done); + }); + + + test('should return the logged username', async () => { + return supertest(await initializeServer('whoami.yaml')) + .get('/-/whoami') + .set('Accept', HEADERS.JSON) + .expect('Content-Type', HEADERS.JSON_CHARSET) + .expect(HTTP_STATUS.OK) + .then(response => { + expect(response.body.username).toEqual('foo'); + }); + }); +}); diff --git a/packages/api/test/__snapshots__/publish.spec.ts.snap b/packages/api/test/unit/__snapshots__/publish.spec.ts.snap similarity index 100% rename from packages/api/test/__snapshots__/publish.spec.ts.snap rename to packages/api/test/unit/__snapshots__/publish.spec.ts.snap diff --git a/packages/api/test/publish.spec.ts b/packages/api/test/unit/publish.spec.ts similarity index 98% rename from packages/api/test/publish.spec.ts rename to packages/api/test/unit/publish.spec.ts index f535770c9..1cff6b6e5 100644 --- a/packages/api/test/publish.spec.ts +++ b/packages/api/test/unit/publish.spec.ts @@ -1,4 +1,4 @@ -import { addVersion, uploadPackageTarball, removeTarball, unPublishPackage, publishPackage } from '../src/publish'; +import { addVersion, uploadPackageTarball, removeTarball, unPublishPackage, publishPackage } from '../../src/publish'; import { HTTP_STATUS, API_ERROR } from '@verdaccio/dev-commons'; const REVISION_MOCK = '15-e53a77096b0ee33e'; @@ -82,7 +82,7 @@ describe('Publish endpoints - upload package tarball', () => { pipe: jest.fn(), on: jest.fn(), }; - res = { status: jest.fn(), report_error: jest.fn() }; + res = { status: jest.fn(), locals: { report_error: jest.fn() }}; next = jest.fn(); }); diff --git a/packages/api/test/validate.api.params.middleware.spec.ts b/packages/api/test/unit/validate.api.params.middleware.spec.ts similarity index 90% rename from packages/api/test/validate.api.params.middleware.spec.ts rename to packages/api/test/unit/validate.api.params.middleware.spec.ts index d0387155a..e91da244a 100644 --- a/packages/api/test/validate.api.params.middleware.spec.ts +++ b/packages/api/test/unit/validate.api.params.middleware.spec.ts @@ -1,3 +1,4 @@ +/* eslint-disable curly */ // ensure that all arguments are validated import path from 'path'; import fs from 'fs'; @@ -13,7 +14,7 @@ import fs from 'fs'; */ describe('api endpoint app.param()', () => { let m; - const requirePath = path.normalize(path.join(__dirname, '../src/index.ts')); + const requirePath = path.normalize(path.join(__dirname, '../../src/index.ts')); const source = fs.readFileSync(requirePath, 'utf8'); const very_scary_regexp = /\n\s*app\.(\w+)\s*\(\s*(("[^"]*")|('[^']*'))\s*,/g; const appParams = {}; diff --git a/packages/auth/package.json b/packages/auth/package.json index 345249668..99b6e8d25 100644 --- a/packages/auth/package.json +++ b/packages/auth/package.json @@ -23,7 +23,7 @@ }, "license": "MIT", "dependencies": { - "@verdaccio/commons-api": "9.4.0", + "@verdaccio/commons-api": "9.6.1", "@verdaccio/dev-commons": "5.0.0-alpha.0", "@verdaccio/loaders": "5.0.0-alpha.0", "@verdaccio/logger": "5.0.0-alpha.0", diff --git a/packages/cli/package.json b/packages/cli/package.json index 869112cfe..76e578b81 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -31,7 +31,7 @@ "@verdaccio/config": "5.0.0-alpha.0", "@verdaccio/node-api": "5.0.0-alpha.0", "@verdaccio/utils": "5.0.0-alpha.0", - "commander": "3.0.2", + "commander": "5.1.0", "envinfo": "7.4.0", "kleur": "3.0.3", "semver": "7.3.2" diff --git a/packages/commons/src/helpers/pkg.ts b/packages/commons/src/helpers/pkg.ts index 734ae4217..d17fd45b7 100644 --- a/packages/commons/src/helpers/pkg.ts +++ b/packages/commons/src/helpers/pkg.ts @@ -1,12 +1,16 @@ import { Package } from "@verdaccio/types"; -export function generatePackageMetadata(pkgName: string, version = '1.0.0'): Package { +export interface DistTags { + [key: string]: string; +} + +export function generatePackageMetadata(pkgName: string, version = '1.0.0', distTags: DistTags = {['latest']: version}): Package { // @ts-ignore return { "_id": pkgName, "name": pkgName, "dist-tags": { - "latest": version + ...distTags }, "versions": { [version]: { diff --git a/packages/hooks/package.json b/packages/hooks/package.json index 41f08d4a3..87cd572b2 100644 --- a/packages/hooks/package.json +++ b/packages/hooks/package.json @@ -15,14 +15,14 @@ "license": "MIT", "homepage": "https://verdaccio.org", "dependencies": { - "@verdaccio/commons-api": "9.4.0", + "@verdaccio/commons-api": "9.6.1", "@verdaccio/logger": "5.0.0-alpha.0", "handlebars": "4.5.3", "request": "2.87.0" }, "devDependencies": { "@verdaccio/dev-commons": "5.0.0-alpha.0", - "@verdaccio/types": "9.3.0" + "@verdaccio/types": "9.5.0" }, "scripts": { "clean": "rimraf ./build", diff --git a/packages/logger-prettify/package.json b/packages/logger-prettify/package.json index e51ec67a4..d521333f2 100644 --- a/packages/logger-prettify/package.json +++ b/packages/logger-prettify/package.json @@ -24,7 +24,7 @@ "build": "npm run build:js && npm run build:types" }, "dependencies": { - "@verdaccio/commons-api": "9.4.0", + "@verdaccio/commons-api": "9.6.1", "@verdaccio/dev-commons": "5.0.0-alpha.0", "dayjs": "1.8.19", "fast-safe-stringify": "2.0.7", diff --git a/packages/logger/package.json b/packages/logger/package.json index 66c3f89b5..4abbde61b 100644 --- a/packages/logger/package.json +++ b/packages/logger/package.json @@ -29,7 +29,7 @@ }, "devDependencies": { "@types/pino": "6.0.1", - "@verdaccio/types": "9.3.0" + "@verdaccio/types": "9.5.0" }, "gitHead": "7c246ede52ff717707fcae66dd63fc4abd536982" } diff --git a/packages/middleware/package.json b/packages/middleware/package.json index 4b8645444..864c31d63 100644 --- a/packages/middleware/package.json +++ b/packages/middleware/package.json @@ -22,7 +22,7 @@ "build": "npm run build:js && npm run build:types" }, "dependencies": { - "@verdaccio/commons-api": "9.4.0", + "@verdaccio/commons-api": "9.6.1", "@verdaccio/dev-commons": "5.0.0-alpha.0", "@verdaccio/logger": "5.0.0-alpha.0", "@verdaccio/utils": "5.0.0-alpha.0", diff --git a/packages/middleware/src/middleware.ts b/packages/middleware/src/middleware.ts index b11262f04..f34b2a2fc 100644 --- a/packages/middleware/src/middleware.ts +++ b/packages/middleware/src/middleware.ts @@ -1,3 +1,4 @@ + import _ from 'lodash'; import { @@ -13,6 +14,7 @@ import { $ResponseExtend, $RequestExtend, $NextFunctionVer, IAuth } from '@verda import { Config, Package, RemoteUser } from '@verdaccio/types'; import { logger } from '@verdaccio/logger'; import { VerdaccioError } from '@verdaccio/commons-api'; +import {HttpError} from "http-errors"; export function match(regexp: RegExp): any { return function(req: $RequestExtend, res: $ResponseExtend, next: $NextFunctionVer, value: string): void { @@ -110,8 +112,7 @@ export function allow(auth: IAuth): Function { const packageName = req.params.scope ? `@${req.params.scope}/${req.params.package}` : req.params.package; const packageVersion = req.params.filename ? getVersionFromTarball(req.params.filename) : undefined; const remote: RemoteUser = req.remote_user; - logger.trace({ action, user: remote.name }, `[middleware/allow][@{action}] allow for @{user}`); - + logger.trace({ action, user: remote?.name }, `[middleware/allow][@{action}] allow for @{user}`); auth['allow_' + action]({ packageName, packageVersion }, remote, function(error, allowed): void { req.resume(); if (error) { @@ -148,7 +149,8 @@ export function final(body: FinalBody, req: $RequestExtend, res: $ResponseExtend if (typeof body === 'object' && _.isNil(body) === false) { if (typeof (body as MiddlewareError).error === 'string') { - res._verdaccio_error = (body as MiddlewareError).error; + res.locals._verdaccio_error = (body as MiddlewareError).error; + // res._verdaccio_error = (body as MiddlewareError).error; } body = JSON.stringify(body, undefined, ' ') + '\n'; } @@ -181,121 +183,122 @@ export const LOG_STATUS_MESSAGE = "@{status}, user: @{user}(@{remoteIP}), req: ' export const LOG_VERDACCIO_ERROR = `${LOG_STATUS_MESSAGE}, error: @{!error}`; export const LOG_VERDACCIO_BYTES = `${LOG_STATUS_MESSAGE}, bytes: @{bytes.in}/@{bytes.out}`; -export function log(config: Config) { - return function (req: $RequestExtend, res: $ResponseExtend, next: $NextFunctionVer): void { - // logger - req.log = logger.child({ sub: 'in' }); +export function log(req: $RequestExtend, res: $ResponseExtend, next: $NextFunctionVer): void { + // logger + req.log = logger.child({ sub: 'in' }); - const _auth = req.headers.authorization; - if (_.isNil(_auth) === false) { - req.headers.authorization = ''; - } + const _auth = req.headers.authorization; + if (_.isNil(_auth) === false) { + req.headers.authorization = ''; + } - const _cookie = req.headers.cookie; - if (_.isNil(_cookie) === false) { - req.headers.cookie = ''; + const _cookie = req.headers.cookie; + if (_.isNil(_cookie) === false) { + req.headers.cookie = ''; + } + + req.url = req.originalUrl; + req.log.info({ req: req, ip: req.ip }, "@{ip} requested '@{req.method} @{req.url}'"); + req.originalUrl = req.url; + + if (_.isNil(_auth) === false) { + req.headers.authorization = _auth; + } + + if (_.isNil(_cookie) === false) { + req.headers.cookie = _cookie; + } + + let bytesin = 0; + req.on('data', function(chunk): void { + bytesin += chunk.length; + }); + + let bytesout = 0; + const _write = res.write; + // FIXME: res.write should return boolean + // @ts-ignore + res.write = function(buf): boolean { + bytesout += buf.length; + /* eslint prefer-rest-params: "off" */ + // @ts-ignore + _write.apply(res, arguments); + }; + + const log = function(): void { + const forwardedFor = req.headers['x-forwarded-for']; + const remoteAddress = req.connection.remoteAddress; + const remoteIP = forwardedFor ? `${forwardedFor} via ${remoteAddress}` : remoteAddress; + let message; + if (res.locals._verdaccio_error) { + message = LOG_VERDACCIO_ERROR; + } else { + message = LOG_VERDACCIO_BYTES; } req.url = req.originalUrl; - // avoid log noise data from static content - if (req.originalUrl.match(/static/) === null) { - req.log.info({req: req, ip: req.ip}, "@{ip} requested '@{req.method} @{req.url}'"); - } + req.log.warn( + { + request: { + method: req.method, + url: req.url, + }, + level: 35, // http + user: (req.remote_user && req.remote_user.name) || null, + remoteIP, + status: res.statusCode, + error: res.locals._verdaccio_error, + bytes: { + in: bytesin, + out: bytesout, + }, + }, + message + ); req.originalUrl = req.url; + }; - if (_.isNil(_auth) === false) { - req.headers.authorization = _auth; - } + req.on('close', function(): void { + log(); + }); - if (_.isNil(_cookie) === false) { - req.headers.cookie = _cookie; - } - - let bytesin = 0; - if (config?.experiments?.bytesin_off !== true) { - req.on('data', function(chunk): void { - bytesin += chunk.length; - }); - } - - let bytesout = 0; - const _write = res.write; - // FIXME: res.write should return boolean - // @ts-ignore - res.write = function(buf): boolean { + const _end = res.end; + res.end = function(buf): void { + if (buf) { bytesout += buf.length; - /* eslint prefer-rest-params: "off" */ - // @ts-ignore - _write.apply(res, arguments); - }; - - let logHasBeenCalled = false; - const log = function(): void { - if (logHasBeenCalled) { - return; - } - logHasBeenCalled = true; - - const forwardedFor = req.headers['x-forwarded-for']; - const remoteAddress = req.connection.remoteAddress; - const remoteIP = forwardedFor ? `${forwardedFor} via ${remoteAddress}` : remoteAddress; - let message; - if (res._verdaccio_error) { - message = LOG_VERDACCIO_ERROR; - } else { - message = LOG_VERDACCIO_BYTES; - } - - req.url = req.originalUrl; - // avoid log noise data from static content - if (req.url.match(/static/) === null) { - req.log.warn( - { - request: { - method: req.method, - url: req.url, - }, - level: 35, // http - user: (req.remote_user && req.remote_user.name) || null, - remoteIP, - status: res.statusCode, - error: res._verdaccio_error, - bytes: { - in: bytesin, - out: bytesout, - }, - }, - message - ); - req.originalUrl = req.url; - } } + /* eslint prefer-rest-params: "off" */ + // @ts-ignore + _end.apply(res, arguments); + log(); + }; + next(); +} - req.on('close', function(): void { - log(); - }); - - const _end = res.end; - res.end = function(buf): void { - if (buf) { - bytesout += buf.length; - } - /* eslint prefer-rest-params: "off" */ - // @ts-ignore - _end.apply(res, arguments); - log(); - }; - next(); +export function handleError(err: HttpError, req: $RequestExtend, res: $ResponseExtend, next: $NextFunctionVer) { + if (_.isError(err)) { + if (err.code === 'ECONNABORT' && res.statusCode === HTTP_STATUS.NOT_MODIFIED) { + return next(); + } + if (_.isFunction(res.locals.report_error) === false) { + // in case of very early error this middleware may not be loaded before error is generated + // fixing that + errorReportingMiddleware(req, res, _.noop); + } + res.locals.report_error(err); + } else { + // Fall to Middleware.final + return next(err); } } // Middleware export function errorReportingMiddleware(req: $RequestExtend, res: $ResponseExtend, next: $NextFunctionVer): void { - res.report_error = - res.report_error || + res.locals.report_error = + res.locals.report_error || function(err: VerdaccioError): void { if (err.status && err.status >= HTTP_STATUS.BAD_REQUEST && err.status < 600) { - if (!res.headersSent) { + if (_.isNil(res.headersSent) === false) { res.status(err.status); next({ error: err.message || API_ERROR.UNKNOWN_ERROR }); } diff --git a/packages/middleware/types/custom.d.ts b/packages/middleware/types/custom.d.ts index 733e88c70..fa554d09c 100644 --- a/packages/middleware/types/custom.d.ts +++ b/packages/middleware/types/custom.d.ts @@ -1,4 +1,7 @@ +// + import { Logger, RemoteUser } from "@verdaccio/types"; +import * as http from "http"; declare global { namespace Express { @@ -7,10 +10,11 @@ declare global { log: Logger; } - export interface Response { - report_error: any; - _verdaccio_error: any; - socket?: any; - } + // FIXME: + // export interface Response extends http.ServerResponse, Express.Response { + // report_error: any; + // _verdaccio_error: any; + // socket?: any; + // } } } diff --git a/packages/proxy/package.json b/packages/proxy/package.json index c21280560..838f45226 100644 --- a/packages/proxy/package.json +++ b/packages/proxy/package.json @@ -24,16 +24,16 @@ }, "dependencies": { "@verdaccio/dev-commons": "5.0.0-alpha.0", - "@verdaccio/local-storage": "9.5.0", + "@verdaccio/local-storage": "9.6.1", "@verdaccio/logger": "5.0.0-alpha.0", - "@verdaccio/streams": "9.5.0", + "@verdaccio/streams": "9.6.1", "@verdaccio/utils": "5.0.0-alpha.0", "JSONStream": "1.3.5", "request": "2.87.0" }, "devDependencies": { "@verdaccio/dev-types": "5.0.0-alpha.0", - "@verdaccio/types": "9.3.0" + "@verdaccio/types": "9.5.0" }, "gitHead": "7c246ede52ff717707fcae66dd63fc4abd536982" } diff --git a/packages/server/src/server.ts b/packages/server/src/server.ts index d4232a6f3..9071176f8 100644 --- a/packages/server/src/server.ts +++ b/packages/server/src/server.ts @@ -85,12 +85,12 @@ const defineAPI = function(config: IConfig, storage: IStorageHandler): any { if (err.code === 'ECONNABORT' && res.statusCode === HTTP_STATUS.NOT_MODIFIED) { return next(); } - if (_.isFunction(res.report_error) === false) { + if (_.isFunction(res.locals.report_error) === false) { // in case of very early error this middleware may not be loaded before error is generated // fixing that errorReportingMiddleware(req, res, _.noop); } - res.report_error(err); + res.locals.report_error(err); } else { // Fall to Middleware.final return next(err); diff --git a/packages/server/test/.eslintrc b/packages/server/test/.eslintrc new file mode 100644 index 000000000..ff8b4a8b8 --- /dev/null +++ b/packages/server/test/.eslintrc @@ -0,0 +1,8 @@ +{ + "rules": { + "@typescript-eslint/explicit-function-return-type": 0, + "@typescript-eslint/explicit-member-accessibility": 0, + "@typescript-eslint/no-unused-vars": 2, + "no-console": 0 + } +} diff --git a/packages/server/test/api/index.spec.ts b/packages/server/test/api/index.spec.ts index aa8fcfe3e..961488a1d 100644 --- a/packages/server/test/api/index.spec.ts +++ b/packages/server/test/api/index.spec.ts @@ -5,7 +5,6 @@ import path from 'path'; import endPointAPI from '@verdaccio/server'; import { HEADERS, - API_ERROR, HTTP_STATUS, HEADER_TYPE, API_MESSAGE, @@ -85,67 +84,7 @@ describe('endpoint unit test', () => { }); describe('Registry API Endpoints', () => { - - describe('should test ping api', () => { - test('should test endpoint /-/ping', (done) => { - request(app) - .get('/-/ping') - .expect(HEADER_TYPE.CONTENT_TYPE, HEADERS.JSON_CHARSET) - .expect(HTTP_STATUS.OK) - .end(function(err) { - if (err) { - return done(err); - } - done(); - }); - }); - }); - - describe('should test whoami api', () => { - test('should test referer /whoami endpoint', (done) => { - request(app) - .get('/whoami') - .set('referer', 'whoami') - .expect(HTTP_STATUS.OK) - .end(done); - }); - - test('should test no referer /whoami endpoint', (done) => { - request(app) - .get('/whoami') - .expect(HTTP_STATUS.NOT_FOUND) - .end(done); - }); - - test('should test /-/whoami endpoint', (done) => { - request(app) - .get('/-/whoami') - .expect(HEADER_TYPE.CONTENT_TYPE, HEADERS.JSON_CHARSET) - .expect(HTTP_STATUS.OK) - .end(function(err) { - if (err) { - return done(err); - } - done(); - }); - }); - - test('should test /whoami endpoint', (done) => { - request(app) - .get('/-/whoami') - .expect(HEADER_TYPE.CONTENT_TYPE, HEADERS.JSON_CHARSET) - .expect(HTTP_STATUS.OK) - .end(function(err) { - if (err) { - return done(err); - } - done(); - }); - }); - }); - describe('should test user api', () => { - describe('should test authorization headers with tokens only errors', () => { test('should fails on protected endpoint /-/auth-package bad format', (done) => { request(app) @@ -219,106 +158,6 @@ describe('endpoint unit test', () => { }); }); }); - - test('should test fails add a new user with missing name', (done) => { - - const credentialsShort = _.cloneDeep(credentials); - delete credentialsShort.name; - - request(app) - .put(`/-/user/org.couchdb.user:${credentials.name}`) - .send(credentialsShort) - .expect(HEADER_TYPE.CONTENT_TYPE, HEADERS.JSON_CHARSET) - .expect(HTTP_STATUS.BAD_REQUEST) - .end(function(err, res) { - if (err) { - return done(err); - } - - expect(res.body.error).toBeDefined(); - expect(res.body.error).toMatch(API_ERROR.USERNAME_PASSWORD_REQUIRED); - done(); - }); - }); - - test('should test fails add a new user with missing password', (done) => { - - const credentialsShort = _.cloneDeep(credentials); - delete credentialsShort.password; - - request(app) - .put(`/-/user/org.couchdb.user:${credentials.name}`) - .send(credentialsShort) - .expect(HEADER_TYPE.CONTENT_TYPE, HEADERS.JSON_CHARSET) - .expect(HTTP_STATUS.BAD_REQUEST) - .end(function(err, res) { - if (err) { - return done(err); - } - - expect(res.body.error).toBeDefined(); - // FIXME: message is not 100% accurate - /* eslint new-cap: 0 */ - expect(res.body.error).toMatch(API_ERROR.PASSWORD_SHORT()); - done(); - }); - }); - - test('should test add a new user with login', (done) => { - const newCredentials = _.cloneDeep(credentials); - newCredentials.name = 'jotaNew'; - - request(app) - .put('/-/user/org.couchdb.user:jotaNew') - .send(newCredentials) - .expect(HEADER_TYPE.CONTENT_TYPE, HEADERS.JSON_CHARSET) - .expect(HTTP_STATUS.CREATED) - .end(function(err, res) { - if (err) { - return done(err); - } - expect(res.body).toBeTruthy(); - done(); - }); - }); - - test('should test fails on add a existing user with login', (done) => { - request(app) - .put('/-/user/org.couchdb.user:jotaNew') - .send(credentials) - .expect(HEADER_TYPE.CONTENT_TYPE, HEADERS.JSON_CHARSET) - .expect(HTTP_STATUS.CONFLICT) - .end(function(err, res) { - if (err) { - return done(err); - } - expect(res.body.error).toBeDefined(); - expect(res.body.error).toMatch(API_ERROR.USERNAME_ALREADY_REGISTERED); - done(); - }); - }); - - test('should test fails add a new user with wrong password', (done) => { - - const credentialsShort = _.cloneDeep(credentials); - credentialsShort.password = 'failPassword'; - - request(app) - .put('/-/user/org.couchdb.user:jota') - .send(credentialsShort) - .expect(HEADER_TYPE.CONTENT_TYPE, HEADERS.JSON_CHARSET) - .expect(HTTP_STATUS.UNAUTHORIZED) - .end(function(err, res) { - if (err) { - return done(err); - } - - expect(res.body.error).toBeDefined(); - expect(res.body.error).toMatch(/unauthorized/); - done(); - }); - }); - }); describe('should test package api', () => { diff --git a/packages/server/types/custom.d.ts b/packages/server/types/custom.d.ts index 733e88c70..9c7e201cc 100644 --- a/packages/server/types/custom.d.ts +++ b/packages/server/types/custom.d.ts @@ -6,11 +6,5 @@ declare global { remote_user: RemoteUser; log: Logger; } - - export interface Response { - report_error: any; - _verdaccio_error: any; - socket?: any; - } } } diff --git a/packages/store/package.json b/packages/store/package.json index d82d50ae9..51f22e97d 100644 --- a/packages/store/package.json +++ b/packages/store/package.json @@ -23,20 +23,20 @@ "build": "npm run build:js && npm run build:types" }, "dependencies": { - "@verdaccio/commons-api": "9.4.0", + "@verdaccio/commons-api": "9.6.1", "@verdaccio/dev-commons": "5.0.0-alpha.0", "@verdaccio/loaders": "5.0.0-alpha.0", - "@verdaccio/local-storage": "9.5.0", + "@verdaccio/local-storage": "9.6.1", "@verdaccio/logger": "5.0.0-alpha.0", "@verdaccio/proxy": "5.0.0-alpha.0", - "@verdaccio/streams": "9.5.0", + "@verdaccio/streams": "9.6.1", "@verdaccio/utils": "5.0.0-alpha.0", "async": "3.1.1", "lodash": "4.17.15", "semver": "7.1.2" }, "devDependencies": { - "@verdaccio/types": "9.3.0" + "@verdaccio/types": "9.5.0" }, "gitHead": "7c246ede52ff717707fcae66dd63fc4abd536982" } diff --git a/packages/utils/package.json b/packages/utils/package.json index b6322a4a0..ec9c3752e 100644 --- a/packages/utils/package.json +++ b/packages/utils/package.json @@ -16,7 +16,7 @@ "homepage": "https://verdaccio.org", "dependencies": { "@verdaccio/dev-commons": "5.0.0-alpha.0", - "@verdaccio/readme": "9.5.0", + "@verdaccio/readme": "9.6.1", "js-yaml": "3.13.1", "jsonwebtoken": "8.5.1", "minimatch": "3.0.4", diff --git a/packages/utils/test/.eslintrc b/packages/utils/test/.eslintrc new file mode 100644 index 000000000..fa58451d3 --- /dev/null +++ b/packages/utils/test/.eslintrc @@ -0,0 +1,8 @@ +{ + "rules": { + "@typescript-eslint/explicit-function-return-type": 0, + "@typescript-eslint/explicit-member-accessibility": 0, + "no-console": 0, + "@typescript-eslint/no-unused-vars": 1 + } +} diff --git a/packages/web/package.json b/packages/web/package.json index 3eb248f74..148711ac0 100644 --- a/packages/web/package.json +++ b/packages/web/package.json @@ -16,7 +16,7 @@ }, "devDependencies": { "@verdaccio/dev-types": "5.0.0-alpha.0", - "@verdaccio/types": "9.3.0" + "@verdaccio/types": "9.5.0" }, "scripts": { "clean": "rimraf ./build", diff --git a/packages/web/types/custom.d.ts b/packages/web/types/custom.d.ts index 733e88c70..9c7e201cc 100644 --- a/packages/web/types/custom.d.ts +++ b/packages/web/types/custom.d.ts @@ -6,11 +6,5 @@ declare global { remote_user: RemoteUser; log: Logger; } - - export interface Response { - report_error: any; - _verdaccio_error: any; - socket?: any; - } } } diff --git a/tsconfig.json b/tsconfig.json index 1e4432661..da7d75c93 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -5,7 +5,7 @@ "module": "commonjs", "declaration": true, "noImplicitAny": false, - "incremental": true, + "incremental": false, "strict": true, "strictNullChecks": true, "resolveJsonModule": true, diff --git a/yarn.lock b/yarn.lock index 809eb90e7c5cff92a9bb2b0fc9ab8613078d0ccb..89370ea2f67764a4a7d8ea8ebc4d9383f8d75b95 100644 GIT binary patch delta 65517 zcmbTe2ec$tbvC-HdeXg7z$ZcqXPA_zt*S?3o? zlEDTHN*Xu?HbZCWV^=L1_geO$pS=s)hu+@Va?&_+>zw&0VSYOmg{Bx;(N#gE zK_XgZcvaF!K~Xi1R(X~p1dgFuO+>f;+OjXLyGEiG$r9}ek*%h+c8Kfc+__1n7AtXi zR&u)B1+7~nMh>rCXsC&PH7AnkD#H}ojjG$(BFKonkXD`cnpG;tBi=Gm6$H2Oe8n-5OA|CP-<(X+?!-NyTOZ(Q&8=`DxXyDdsO4MRffG^Ys~rE(g>vpk{7BB^nV zBru%LszfCj%ie?396>MN|^*3?W>`xFrvIcR?Ih(S3eT|%+R z<^`N2(3$^(9feQhj;9ul#}=}NRJzc-JyShmevpR`O+~spu;W7G-8(*Rh`Zfu%Z}WA z0md5G-V^Apoh{^a-4*xlUl)|7WKkkik)tJ^1SwfYXLU{?S&kJIT9p+_Vkz3V@0W{d zwbK*AX`k$FCnk{uF=}{(Mp!G!d6JaLq^p`35_BvX@!9BvOciLhIjX8^CRwICiX>Hu zd>}4xF=yY+$46u(=_$#fh$C!BKUqSzoSNG@n-%W`A2A5^h*4iWVO+WIyXcIFZ86Tg zbjv69i4rjG*$ms0f5W5u&Wpn!urFKC@|$ z@z}-<=~|P?9m!bo&Th{uMcubtIOQP`!;LQzg}Aj)ONztR^PKYDh~pbj6L&JDlUl;MbR^Wkfz zf(4K5LOZU)wx50ea1XPbeiM(LIfm~!Z-;?+!DF^{@iofg{zg(^XDs+Dic;ksVOI3O!C&>;&x_#Z+RTw?MR0#+^^? zGai2Z#j9KF$FDc{6_So)SD2r7M6m{2nDjvyxi|o?R1rP2fLiJEIP$jSI9N1(*c3i zJKK-()_&s~H1itW-pF~+F$JnZGCHB?5+%^ICJ8hl!Tys-g=Z+R)I7tHGQk?V-ncJK zG=fTkV{)CSldg4Z)_%!FvdVB28%Pc=9!$GxE-<<&(Mi|G3Aq$#r^5MihZAjytiP8Y z_*x~YGa$5pZCK^?8qGu_$zcIh=0(PJTena5-Qh#i5B|#O=>P3gdyON%ey!2}#O2$K zGvdMZRmqDq$thrWB@v`yWl7`(Ue{Te28JehO=TEHCyj-_SWI~a$qFTvqpC2GwRX8u zDYn(HD>)u@y*?@2V^bX>SBZDML7$7Zk)9YmtadAnkUcvY4f)z2SJo;*mJIY5J{e3E zxPB`hDWezi+YcDTZ99$k35QmdJ!tuvM0=riw}G|ypu$Dif#0D*9(*0SK07qbiq6ZF zpePE@lcFXmsz_0^40>Kyb&{hrMqy^NQ%<{VMNc#Xa&R$0>?QL+RbWMKwmmDgC3=4q0YWJMHd(1|+1O?QJB7)yGv>FBW~ zipUR0t0NZ=t4b~>4Vn`_Iq1Q@2|CINg=$aIT1(C}RK8ivM8@?zIjY7ZqOMiFLw(e1 z_Iy-cXJG~>#noPedN^Wy>hv7?{5{yb@yXX;@|qHCG465r)+LY?ngiRa2&AOImZn9L z5p+#w6i$?NMv!=3mcY+2UWo5Yw|OfKu7x`mN>(B=6{%;VmB_F{SRK)EzSiyb>(0y2XYRpv8sBmLb}dbuvllo{mq?Z6IdG_1T4On$(B;A{%MMRY$mIJ#)fEEy0nb0|r zrU`}?MM4l5lH&-4MUQ`J`yO=5u1yL!olh(+VV_og9&7MjczEK1wF-*_2K6m)LG&==V?7mfe~0HshkV zMGe#A2}S?Scqnp-VT)~?jlsL$yvKMVvSHIK#4v7s^I^Ds-MXVU`_VbFNfK;vPyo6h zE2IEEt|&?ZtJ4sAXqryTnhef5g>JpWvY4sZtQ8?*&!$tOXm7-Xg1)ibN;+#JU$f2m zMbZ_w)q_QQuE91V>6kxV_O@D;m_J9ST)jXx)=~AC7}RUL#^}XNxExQ28Mm!yTo+GH zr|QMTqVahA{~Avvj~c<<^G2b6)FA$T!)y2q)y%0AYrZ)tupFZc62~)wtT7xXg4+iZ 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 delta 86829 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ēh?Yq|r>g-YqtrI9c=5sZle;S$jq{r`>W|^U`rz9Z(AALogf`6I`vR zjOMASzBt?73o5dmD-?R^=uRjO&!YGJ?NRi=>vy7W|J_OSO8Gb}_0$GNAfON02e+C) zF3;JzjtsOlfWa6nkL;y1pz?ewM+Itx7=pwpVE2|B5<9M1!!K(q9^4kJEDH1r-P_B_*(9o2DCS}w1< zojl>@6pQlOT4u!1CX=s@XQ94O5HtCChDe6v{jlh%ezoGuH6>M&j56(Y#<5}4uG3*C zgU z0p8BSW+@x?Q@?mfJaneE%lGcBUevWZ$E zTNV;>Xzt=}y{)vve9ez4y4CQ2%E7zcxWi?{s3RFBKX>6YFU)#4y6maSS+>TxlaBGMcw$Gc*_*kCI8b|PA853@}JvZDax?P-LM zj-bN@`pUDz751Y~7H-+}5sC&H8q_{IX8~fZ>n3!J20)q&!2s0`36kRkD8vHwrP3Y= zlR_)ot(mMkW35PLh&yp8C#QBSWNO54OiuFEcvo%5n2b1W1DIcSD7p`FlyI(yx8{Yk z)D3a{WaF+kNPB!*zEFUavPw z>(4%T|7_{z&F61w3<=^5P`ZJX7qW#GXdg@#=vBaJLAMD~ETCT(;oCt0n@KhbIh86` zqJ<E z$CRK4TsQ5aauU7aZF|sLYJ1Uv%5n4yZ`*sDMZ@7Dp(6nW8Hj-l6Mh;tWJq8Kfhe>= z4q=;%gYVdO!=gXlyS-Erq_#b;^=lcQtphDHGIcDYaNUB)V$-hHPqNJ}F;b_!Y0PPi zN)i+-IvXSHnKH@MOW{7_UI_ zp{-pN3Jkp3hWUs0t!b6lT{3ttdb)ZT{oRA5WdwMtdI+8W`M}`IYC70EXm~;M#R>ud zTRH{R8q3qbLj#`+&?0E-pbQ16Z2(@ks?A=W@Yo_&3{B#x=G@jwM$QXQL(_~iDQ9!F zQiJo$QCjg@l<0eMyis@KeT8m>+Wl^1GT?HNNllpJwug6>D#){fCvU%GP7(xz}HhGU^?hbtzE00%( zF;v((05>LJVBmd3rB-o*e(SayXpQf2^nXBfpR%D19ZCuV~bj~O8 zY%y0PTvcy5Q!-ody_hI8CcQ$X)5T|vnpKzuijW}7-m@$Xo_qaqR5VYb`+w$0u0rDNW4uY;ZPj&G?}f=|#c;cn+nkL$L@bU^JU6LxnRI#@ zF=z1z@EF-_#oTxpH=*Z@-RReCqTze2_}#&8cPGV3}85Lt~?Op2D|~{`WW;`xmcI+N0e`j=_-Y{ za*d8bHfAx%=WLQSYE!ywdFhefm=4ocbUYeKeczuB@q9NI9q4MZk!WRyPADffrqgIB zl3^0;tVC_GCHLw*yaN_{=h|QC=Kx@{uR}Tesy$p?d%_-HRdxJE;}E*|i+j)q8kc>O zU>KW%O@gYB)OcRAAj}#RV^Jh1ig{4((tw}XXs;NW}Q^jA;vAm&tX9x~j}4yad9L=?II=xjx?P%&bzqB_s+J!-&s1`Ne~u zgJ$GnF_0^rMo%=?eKV-APPa}x+}e(EFTN@woo*dnd#qJlSr%WXTQ|X(KN0*oddKe^ z20~;*g9Q89I*J}^-35tdU4vvnTP`q`0DTDXj{z!S3NTp#3=YVWaZsfJt_6wZWp>x9 z60bB`6;JBxjqF5F?NqfiC7UyXD)1_1IXwKWQK|YQ?Z|jn5KA@z+0_G!OY~sS>E<$@;pu% z(Hu4^hd>BwBr0`UOXlg;ARQie2HvPnB@3}hxK~@&1c8C)2M0Erm0;0OSE98x|j`Y%Ivg1*mRJfF6NPTyKi`ltY`jTv@=fMwplv+V*6W zDe@7;z?wE!;BszR>j+-5Y^3|JdwrX9=n_qi8eYFJ6owaDJh%Pdb0&{8aCEsaI-X^ON!|vnk_n_P9V$C zgP7_J+LYN&q>HohB$)~~CYgG?tz=S~j86*KEKiu2)$OOXW!MO8c>EjCUTvvzVYSQ8 z(2r-QHEwmyaE}=o^PVp8EwJvMIfICqq2v;F>nEO6n8!N%FJSYRHX_u=2P|jT*gw(94E8_<({x~_{YCd77_D7OO(mw{RMlEy5NqP~ zgvHl#$uirFYN0t@q30zZlTDS2T{>{++i$#nt@59~w*3l!f6Fhjn@cr7#TV#)S(C&` zAe4bJAV>k`mLR`U(A9$g6grsoZV-QE+xF6!@}Nd3lt8Wz}@JlZ#FUWureP z2l-51n6k}bJX@MMcBWb>Ni`RA&uK3#C=DnH^X3E}NJ+QV63SthmIm{McJA6hX?AwG z8(;tX>(Fn#^NQ5@&^vEkyY-ijte|KA{t~_&oV)`l_}yE7X-nUw8KwpLCP*kyCcyfE z&H=9%2op#L9ERZlX90#3XK(__@ zC{V|Ma%(w1namSX0V^ew$zC&FtK-0*minn?Cq14HB3#?`vsrOK_Q(7*$yHTel;UlR zqg$dyBpUr;DpGAtTB=`5xice{Rcm5ZVyZA6xO5R1k9uGadg+%Bqc1*r8h)m?cse@t z=rQ={y0rlSu?YW{1DkE+g?AqczCeSE=Qepap5!>z0Fo5ay#4M6|`8c3x8KPG7d zWNMVYc(SnVn1V~iL?{#Gb z=z5fV_%)k8LW9qOk{>sNe#zuuM8O9Bm(W0pL_tP0SwO*Pe6eyHxO21P3w|OS6MBx% zurZT~iWpmS`Xg7Gn3$bSmWItK+3@{lqhfK{JWvXaSwm_N5ruJM64y+{aK6cp6u$%F zhN>1xv{RL3Jl+@;0p#woiX0HUW!n^N&(jY{S8od#vX*>!?=@RL*Z!aLYZo60t)Ndl za=GKb@a~h#_ZJ_zd-L?s6bC&p%r^i_#6X`9@IKDdIt2wwARGhLH7!`cNCXpO<#CTr zka=q|Xz39mGy}o6OUBcQRJ$xwts+a&st|1nO}{_LwMN<6xY4dmoo>rZd1lcGmx}zf z9ve>CUUx!|t4xZmT6lV)tp-B8Wms50fpgfL-~W~FmFC>M_WE}dD+s>Z*6cc)4t3$( zkxf$sm@|esSkP|ppiu_H41#5WwAUdpz!)+_1?YY44S2tw?AC3V&de2^da=prP19ra zRC^T9r3UH7utMumwKy@Dq}I`@qUhmVjvlJp^I}8@;l22p#;@ohuj6Tg)TtBB!T6eLVOGy|TD0aMHjt3_ybbjQ|z1 z0az;mqB2e6VGd3J1Pr)Sa2sn`yG(rykB%b6h!=4Owkt4Vc535}MLFGCE8fVbhPkQO zEb+EEFI64O7}-K)K=z!hVr#v5+VQDuEKdvNhE%CGXVyIFT21a%nuBkj-m|G{+K`bi z(d2(;%Hfh23ItF~YU9v*+gBIXK?DK2*Iro^uL)Y@OCwxco(Cuq*4bBx;tXsjOj~Le zM0SYnlx2e23l#qZ3||Tqqmk_5nWwHfR-VF0O-~$UqZpQFnqf|kk1ZntLYN*`&d${y z-?Jl?hRg}MP%KZiv|1=rwE>p2BN-vYj9(m3?9jY)CSgiz%M{mD zk7RQYc(5T_Sa_F25;x*cW!C8=g>pE%SK>Je^O@SMNE@ORC zI?ptkV!t%YC(U6&Efzo&H1W$7*HL1TNHaRhU>IFYvx;rW?Y2^m#&f_NOzj3cY8!4X zW8ksow4BIBZJkVk20qMbvHl#L{X$Uk!L;#rSJB`D?$$_h=+Wco_21pMcIbo0SArKo zB-wfr)$i^{hdy}griL9_Ie`POv;zSityvlcL;(eT9;1VvoznrU;8?hU;C>h;Y*G2R zm$ce^HXT47k*RClc@+rp^}N#sFSYMJ8XE4>~cP!pK%!B49Kq z+iVXtMyuwTdVdzh!&wmmCk(I#6HjN+zwQA{dV}r>?EU_~?nm^mT~T8Nn+PATefZa4 z6TkPbR~93|`w#!x{m$D3RmYvR?GqDO=bO7)4?heB1tCa{um!CSfiK} zYP>kkjO%94^}34f)bi`1hyc?*H9owoLZ13i@ya843_bOs)wTSG-4%Foa3UZPA%WXT> zj{oNMD~tSJZrhHY_>F5XW4w?Dmfxe}zj5>78IBq zj4%hvaiFoD*?xF&FtUF~Dcr5*`_d#|>(63SoXv&cqKX97%ITV|#s{jvMw4|-pQeV> zT#aut-5F>4w4T9+NuaKTkw2432qj}qZmSIf2E!RTafJt-`RLoOGIsGF|8m>@wQqbh zwz7P+r8GIT{=qjsdh2G50(ch;j2OTM1I!l;I2vD7mxmMV;?VP_4RFh`v1Kiedo_^L0@}p7s@?$mA@SeK3@CX z#}2P7zyE8H)-H*b#{z(Fo%M!HO;Q3+Qf4suOT$b&kPW~<5)dn4UJUF536i-u``5sx zf@sL*(`gKPma^40lWiD#VVKaUU^RubUDt+|6EouBSw!VDcjOP7iJ{L%u}QWrT0=Hp zZ?vsSVVuIce!S6&V^gU!Bk;|zAJoZT{rJOM_vz)2lWQOR1VFZ5`}isJx5VWn_SKJ{ zKp*@BvAID4OW794Q(2gnF<{~cuKj?6$HC||Ny94};(x#luWP8ND%8KVMt2e#${{i4 zX4r`7%Nb9JGoq!kg?w@-*T)lv%uOOCe3O4ETdP6<{)E>a*rH}V5c zNWoZN{R%T)_sU-M+~Zel2JyW!Yxh3!7BJ=Uoq_j&^5X&u8k*pDU-!h#;5+Mc%RCH^ zSw2WbZm?=rBj zYy4q>drzT*Fus&~!)|o@r?cpRPwqmWfAWe#pZMM#YmHBSd}a9^Fa=wT+XbIto5n#m z7AU_00Ts-Kf-=_tP=J6k2~Yt8<^ch}1kYN|4=G#huZCzn94Zr)M1--O{2)^84cbk+R-D&kcv?0);?OB=bZf!% z!dA=HxmcJ9*ts#_icWvJjK2M;UFg)OUN!FvTeR_RgWpwB$qK-M7f~GvQ)jB=b1r6nD>Z!f{3P^PO0237M#=o zroejTp(Fyg;5Rb9+6p(-l2^*Lp%%}V8g&2=v%){pw^S}a>Z9~O<>?3d@A5@*3TaFkx)vqgu(GzAhcyDiql}g5iZbS zNE$d;0_4@i;=yMD@6T14T47YBa-?4dD1)~Mof{-)oQJzAnNLw25R3UB1QcEg0a8#I~cCss^Ad5V{4EI zJnO|zi!0zsyS9xw=4Gnt=}#v%QxcFE0*q-wQeth(AbB9gK^h0Z4U~u$0M8&c=5cn3 zXqHFis#|l#itk|QWU(ZMBW9#0c|FnUr3xvzoW<*8oSWKAzQuXj!KC8lYI!&3;uRPz z7$csbW_trD`|xWor&x(Ui_71!+hPw?9AoU7nHmY{LX#L$Q)FA-~Zl?%W4mP zZmsq-68uBAVKx@#O5pA#5(a~C&_qL%4B~v~L3M-Xjm6-bFb{5r`~=1;6d7#khl{Vc78gsUi+Hk}7%Hl)C~Ui@HgvC|I^_nQ z3l+@nLD)S4D&qb4~vv{1C8w_82XY!nUGnb#|{ zTNJ%izhccSkif?BEY+`vrU{kRtNBQm>)RQ%JgCq;tT`3DMd6*$7j4BYF8F51^p*gXZiAAc3^3;?~F2Um|em>J@ z;X0@E^mfILG$KiljAx{fo>oR=sHxQD#Y3OkzHZSaNeN6jZ2(Uu{!wF9`yF7&Vn1QxA+7=fFShYXcp>MU_U_X z1EB%HC{tqrjshYduK(en=h$_4aprqFwwFTyVWzs0-D2CK*r}wk|KsR zm{H%)(DFFzhazy}hSyWlx=CST6&S6Vi(#y%%I$>XC5c9z&8M=)jCGgs?$U7ZrF!<@ z1AEc4-#>`{@^ihb_VVGU;hvMnZU}yS^ywcx{PdBnrNregw|2uYiw9kAFiZm37=}oo zGd5TN+kuthbjZj!2b?xw8Ow7zN;aD{n9mu+dxb`^DrE?+()0R~+F-m|)d`vH2I=)| zyYGhE0-FhUVB&F^%)GJ z#4ysz7?nxOCD{~JsquYnEKQR(MP+ksy=O=%vjkP1822VVTpBfO&B{sM&Sb=Fl`u+f zJ~k`%#)b>zrrJ*GWXKCwE-6P|`UZ*4d~wHeZI^uKi7%~gtaZzjCT?0L+&*Xs1Piyw z!Ocrh^8_^~35$oTqjW(4>UDiWkV?-mV9)r3#f~BwKkm#ai6`4FKh!Qep=nx^Xy}Km z*@&kG*)q?mN(lrI_+-WnDWYY!m0~rU=c#g)t+#EiJ*%}KMQv7X{V%9nPYpa+^wuw2 zx3=>SF0L%Tb}ig?w5fkM_{S#}Z~bFvgW!9#^AGOY%rF#0HUcEoBxh(gNOwu#Y2YFw z4Gs?oA)p3eg8Armw&ty!{oBhKzERB#3tgi!9yZ2)zA5+NZOhKpsF?5OvZWfG*GEaC zUlRIwVVJc1Os737iOC|)&1hb=eZE?8K=C^;G2Nxv^iV1-gY=~ve}Y???*GaTxUCIv z^koHi8eRO#?qzW3f8hqS_`~~OZS=KkyS`Xh*=DuvpK9~9XxA5Cv#I6@<_6(JkqlfI zK*DGR1++ORPC=Z+L$_&iZh>;rb;t8`85YjQjqV zcA%g6(iJuM`mSD!;H$Ogza#+&@ui*rj*-D%KmVoMHw}dwDnN7vBs=sICNxB#eSnr0 zZU}?>oB-tnAA|XF(}MK7f3?JRsBF6g7k=19S7H-J(d9iY7q>KPmSkL*IddZlsjC?( zM8K3!DITK+In%2S6{irf$}rhl?o$=1V-2U3JUNq?rdVFA{Lg)tqWsoPJdAF8GvIt* zIE>PNM4;dJqoY41M4)|NKDQAb1Ol#Vf}RLQ89+WC3|c_lz<>+lK=iOcnh?M)@{8xM zg~?ATQknFI)n=&}(O^9uv?VD&#P-vptP<8TbZ?q8cqcTehsL8)dYo;>3#}@VEtLlu zorfEp{Ma}Zbxpb9f=n?fRH0B3;f6L7dz0dP$VC`TN|S^*A&$r8o} z#fOQ*)FMdCq}ITu`f4PX_2KuU89a))#ZfKXjk75X#L?4w4@Ls3Nx#NB?O3wZ)Qw5k zt4=^vRvHx@JQR;~r*f3&jVj%dUk%xk_zN%QI#)M^iHMqGV$|q_Gd`i_N8y%XLBK&P zvpWD#kD*EwAa;_Wzh*a;Wn+p zRcSDrO?C8o$ql6iRY|d3xXzT}hJL2lZHF;#Xhg?-%T3iRJSwRvnQ-cT4$EXMA(<+V zL|wzjwNBe(%^}n`#}-fgKCJ$xXXjT&=o9F5FYR0V`m-liko@eSP36E7UpgFofxiCi zWdv1#OO1eWG2li$P-ep@8AzF6gaj@cfC~n2U}fNHJ)2l)^WCdTXCh6FnUSM}6!9{{;|^{`Z}i$+Uxi{JPDw2^ZynfFIH%Tq6RKP-vYk0`3SSY+%lS#N~tJ zqS=d=+d$y<6}aiPWK*t4xb|hH5yWLxDtTk zyjrs$P2Ev6L06R4L>(Dc7aNQ`H`?HGsin7GN#O2A^%w3(^7A{d(l0Mw{2dVj3y0U#KRL4kFILed>gBE91PNp}h-C7loL}=1m7rr(rBPHP`1=oOc|_j9T+v z)fg3ubE@x~Bh#5^scE@2oiHiKOr$%i=!#OiIO}BDdQ&y}@c%BCqY*r9M0qg%-X*^M z+)oaoxBRKO^{i=sdehpWZ(P5!y*~t<{ALRj*s<>$H(y5H3?63K;SNn4PLmEd)DZ-L zh;UUS4(&AvZ6NkShhQzer5trfWku-dop3La7YW~OC#v`%*tE8d12EEh*ug&Ye2zCfZzfAn})d`*c#AZ6TsS; z(7^#AhA;8MvQX*|@NqI4V}@0nh!vxPI~6x3(P&+Og#~TYE0JQ(6md z2Z6CgAbD7j0zfqlcgf&7q-_rF^9Ic=NN(5n0P4*`#Gkoh;s0msJ-{WY>a_8vs`}mu zcXAHE42T4KpsT8@lZok^b8Zo)y1F{&-0do2&Y)L0>Z0JctYRXV+AO%PVPyqeUDppJ zh^T7>3>e}6R)?88%*F4o&%@L`Roz|ZRGswuy&>px#EgMVP>Mx7Ts+VlcincMEHq6v zYoT8j0$z1!P{jg8Fb!lw$KU*!E8kWCbhs~YYc*% z%pyVvY&5VA=pzUg0Kv)U0acL%ZmM*~hrJL-QN@btlnF_f)Dd(_jL+;37$c97e7(40=jQMn|I}C~W0>sfIZl>jDn&wuOntbp_ z&wb{KL#fH`2QDSeWor3Cyft`HWF-Qq#L+Q4BK|}v z06`xpASjy-1At6M$dcoY5yAa7@lYVnb2Au*G1%`!a((ENx#dotZ*|OdH6$tqW{=G< z_NeF;40xra@&8 z!WN>DGiY}0!5t^@KiePLzWT8TpZW59a{EKAXC~WLw?DM;leayLaOSPw-J$%kdi>!{ z3QqfEd{8O7?cr0KXh_ZgkuHM~V!%cOJsw#q=!!tX7!*uBwquA+0gX0=q{h@esI!&R zxmq$G4XgEms43x$NBDZjD3wv3ZD&gySIbypVzQ=o^h%n#6!W3}NM>=3ir7bFtSZ~f)|#lSm`U-WK+{$XTN~_HKhmge?hfy%R!gZQLL<+E zUi(Xa%B-v&{|UFc`w{axZ1>6|yH2CIY+AkRCkIciXb@9I{s!S>%zaqbK)w^5#|Xtm zhyvrQhpmDx?2#+9WQ$J-$F5Yy*IUb7#o^=vqn&^Y=LYpug$P#&ta136O8 z7)#+qIGKUwc(TF`22OpVl=P2USxuv7$vT5o=--Ie3ac)2fto_Uo~qAI_Z{DQ^bqhp zhN%GR=_{QX!R)0!J))2q6%rbJ7!(TQR10A7x57r-b?Sl>e|R1VJ+PcnSTU?1cmu*|PM_WSKqQUSvGGlttkKiAD@g>QQDUswP9BQo%rHEPZdRG_o2*$H~yX8OaAqLnCZL-SlPbSYkqn9B?{Jz z`0i&mkwZUZ4v>5PPVZSYuK;B6k}33syy*wbIRIpwJw1(smDSJxW#_41o%{EgwtjU)31&X{+cgc+ z{I@Nun;+XgefT)PddJ<{PTiHVSi+KY)+F~lHC3*eHT7&6wWe8=w#Q0i|LM07czicu ze=xm;&GVsZN%{JBtxzn2$oKwf^FhF^xK;Lv5$SEA*3nq_TC@6GtDQY3xMdlcFeKDHR(XgFb)wYJnbf&@c-%23 z9lb^&=NrkQ*US}b`M5igsibut^&*vXE>fZgl-TT)2|Q~#L}EzOKrKV*f9F%rdB@i` zD$&E8}G#HA_A= zo-Gx!X}Eg5Bo+ekDS{V`GF`RiHc&h8_*wGyCF<FsC_3xamtEBP_${VL`SMc(V&8o9BQ890hdQz!B{~2 zdj`gc^^KWPiTCh{NW@q$G_8<2lHCELyV$FCv$YD_kVb*A(Zz#%l&uw;TtMGq&0O5s z31@A6XGqftl5YyDP2= z;Y^zklB3tJERkbdD90)24va_09b2e9CtDWTUL}uX5THNBn_&Q@n7fyA)yKW0FRIg*DuS&Zskd5?j`CM>@o_>ZIUH`TXz(;l!+yINjs(-9 zxh_U?e9h$xo5$mf8A6${Q9Y$=v~vi`2hsum$;bz}b}MBeJq8r#FfjcDCXZ zO-QZ*qlox2*s$6>Qq?TD&%og-0a@e`5UUY+a`dAs2V#QR!41>ept<63wSrkwM<_Q7 z70zGN^=%o!2UvxxZ?09g@T;1fj1ig6m4IH;c__4&ny_csdZZ2N(`n6kXORh}o$L z&%Saf5bl*tjj&5^@oBVGQ>o-L7CpZ3AjJs-Fhn&DmlWy-+!?cEa2Fhzv?tev)?KPJ z5{4K^%{Eso+HY9uAZMCK*|sZ^1lAVvAe%QY6ivEvtyvYjvJxgqp0W&?>zyplLegb% z2-@8#?LH3FATYeZ426muCuFB;&{!>L!8$-xgvSx&%ZTV-+8+tq3i@cP?}&CJlNl=g zz<;;{$#&CI3N-2wcfACemzTE}NoU(A#khLgsSb zRqyrdWaj`$HFjxvYIQ>bd#GKCx6Ss|m;F{zQ9eZaJE@B(EeY+U_LJ*(QVLO$`)8UZ z>^^D}`Nd9ZFSd7c$PT#oNQ83G_Cg(Cs|6mfK>!^OuwO|FNdyV-S(%^pn{n3P3He8w zJ{w9pGWKHFqt|C!<)TYHW<3Re!;sG8nD;UtIJs}LdCoOw+PAz&cyqP!dr4Fv|Pc^CS zrY@z)y?ZHTIiV#t?4|Zkhi~P8{BrMf^JOBqYTwCz2z(Xbi;xZjyb+iy4uhHwnNdLG zSjeVh|A>d17svdA2)_IS>NLP!G_HD zp$cV})Ukm$D)y|L+LkZ0id@+4R5!~8u^Vpn<6yJ72ub#Oh;*p=heetnqFgxraI-O=m-jn_|&*o-AR$OeKn zz@nV)G+e6E`W$Cz=&D)Bl1Dt)Z)=mlg5EX55KdK@l!j82<2-I^X zPYG0%+O?)n%e6)qt_9?3J+*Igm7e-CwfoGonn}V)yGYTe)XcMC75B1dMrD+XG zt3&N3OL1!FU zHcP=2AqOyDZ)GBEyQRr%>=;o~QlW0^cm2tfHSTGajB=1|cRFyW8+SXImd|Z>fX^8Z znZ~uIolOj@es!greF?+;cP3^_K&-P(Z>i`xA>OP>kU{wofS{B?hjAMc# zS%h^tG6N8dq%MT)kEzRf!ey*xs|RDJ5E!yY_qD9KG|K!8#G3592}&aW$02z ztzFJous4H6vomeg_*?39wp$HI?%beUugBB_TSrbsvvGWV$|$6T@^nW@ZhI}Bz~0X@ zJIME6OYKmOc9KgzzH#U5=)SjMb&0a)lExP{UP4B%qpZ`qe&uzTr zcYb)|!Rdk0lGB5SUQf+R{Gp^)7=BO90<|6HIFt0C$xS~mM=R8F2cq8U` zrSW!6>s@O|l~c9e_9o2zr(W{zo7UWZ9=0j@JX9Yc=4yl+18`LEXM_zF;;q@~TLax@ z!xS(P50=5;x71_aV$EQUsDqv;NV_9_fXhZ~ZBw&QN{8FRAk71HI`)lqAr}($Lk$qy z>Tpw%&FNsWD2qK`$mlP2qX|d5l?vyJ)7w{G@=Yfn9TBfa6s-GZ>Vm^3%hsuu^62(W zFIaSfLbZ_9B&~3Gjyc5VoQub%Ec`?3-(sUqZ&-Lq!)G>ivn1;+Z&oT1({bZ^43Gd1U9y!=@~CPd+aMNamfo zEjJtOE<{P!)adBRHxF8>K)zuR1wIFE1rl^iu&I?`IR#)GlK6E*o)`YgHTTI$;>%qQoO7ky~sadN|3sg2}=Z>J8Q zoMYf90sBxGFhL1do5$W5`4FI>O~Beg^(33k13-e!3c32fHtdh_8MV2rF?fT~I3LR= z+1zMsff(_yZPGy(P?t^x;;oiduBcs@R^nE_B1!e;J>;@?WBc^MtGDbWpM3{9<*9ymcojju#hb|G^EnCb zEkYL2JfHwgaL$8I3U-Nr2_V9kSNw_%pd%_0SPk#M)epK2TDLWtj$i~y4o2xvtXt|~ z*YAsF(?*RypLA$jHhWIf5sh}+C^IhAwH7fIYxVM_wkD`?j^TT3H)g7wkctcb>S!@; zERkP*Y~wcN@m)fG^Uu`zB=k<~1W(=e_uff8=j1yFm?QjX6ms`Ci z@ASJ}!Y8f zw*UVf`Pu8JeT)t--MR09+TRmt&1|~7^*U-ls{;slHc+sF9y2_Gi(nn*a)70qj6gR6 zT7``tSeC$Y>fq)??)}cz{qeNXYHuV4sjLtlnDuFmsb>Q&GnF5+`BEL=Be|Dghn1Ye z6z^u79%w>WY`VIyA|_yB5wuyjMmdtKiVYiU_GFp~mo-}V*!!sGQKEVC#>3?3Tk$@5 zG%G9M1#Bf>Ce%6Pi>i%V$j=GYUYg!9!8~}7M)Iz)22H`C^mO>*$$g9kqc zs0W0mf!~loL_%tpg^&W|yI@HPK`0iEGoTk>F?1jnic}I6a~S;gw%3^*Tl2PH1FnKv zquPOYRmA4llInYVNm-6W;x?nBJV=2u9uLGbKD}2)e>H13snya1N`^|pZ*8>1LK5TV zsrCTc=9BxBrg;Bs_;@#^ogSQ;u~GBNvY=$F&La*P$?<&K5)dUHx0?)a)% z(G#&a(`{ojFdj%|JMT$U2K78UYL#8Fjx8dUBW$f#9%%x#j6XHdRjTTWlf3;Hp4*NA zy^$QbnLa>*@1^WVv}kfAMn0bcy3?Kf6}<9dD#7E)_V-Yqrq(>AX`QC4n`xb3qo)Nx zI-5gCGY@vGtVlj#UV~w+5tI5f(+w66dH9!`_eZnca=+y^spTlwa@2#s6&MPIWG$vH zc`*tvLdGm>#-?;;+%TIn8oPL z(@v{XiX49p*4Fa%lw<9lqg<*rHIqB9r{vT29JAsVzMncmpLuobMr?A=EWZB(>wZb{ zU#P}l9ygE7e}7c*E`Me)n5GLDko}ddH{M{qA>sdfo3nG+FoR>pzQK?%F1~ z^&5y=Xg*I#>-^%)Us$(EtY2F9{=V^LeD#@4;<;np8@cOFY|YQSI{I(xe)kW)Mjcn3 zdG#gVqH^ne$%p=f@~l(5;V$Z)b&7xepVW!HRhInsEZ{=VoBe( zH`;o$+3u2fHdzW9;_h75XR{71-BQWr&pC5V7bc`wy4q=^L^<(NNX*@w4 zA)9`o+D6!4Vb}Y%ud6mp?)(WwXrlW*6(Aq{8MOcQ&VV1!N^o5CteOq5h>zsG{;_8vh`D*P_0uMSZ)4fL$JazHdae%p}AcN`)rLc zfa?*jVW8G}!!d2C)M#hRT%}<%=^~v(*legp`J$L?R7_EKpCylPq0cApJ3=2J*ZvLC zWY-+U(Ivk|1@c!TmY}h1TbUgDU+T&&f0%c&)I+XaG`(bm_%T_C7UGr!`{fns>XySPx)%G$?elW*A1iLP`zK92iZ39rsY!r!INCD;6oI-7i> zfsn%WC-9%g{z$19?WOw3lYgXMu2LG^PwxCHwObj#rz127Hc<2dc>)$Q*m^0>m6AS> z4Y&!S@7SelrJOFSB@bPP4WsCeR(wLrhA}p;6FW9Bm`V2Zx^kgx%qQb8Q0mAi2+P`d z-Zd2adQ(0Y<4!#)61vLO6V^&jJ&j9M;cET*_MY^t|hM!2%3 zTaw0|SF1&@#*lLNvX!>Q)Cuc~dEP0zvo*KI()Kj{1z%Dln_{}Gw;i{Dj@NI*1KOOJ zC^gNx=@u!piQYVMAEBS7VJpm%ryo#SdMkn(2aYfABOm)7BA5@JM_;>>>^nyL$rpt+ zHBcPJkPpV}1!X7LvI8ij#5$lpYQo~w1Pm1tX_7SKHr3rRZBNkVt%0&0Qn>*x2Lr*n zLvR*r?otpIgRzP;T5kK}YGcLa9gKsmC?u8ivEaB;wbZO5dnVX)Kw7ElY`L_SjH^EI z*+|%hgkO5c#&cMR4%0c0#U=LqV_n9b00K}7q*CHy;kkjl;u|ZwSA+g- z*L@S>DgK#d}b?PwJvqh z4%2_vw1j~LDGwfO@JWCOfD(s<0u~g$Wmv649t@If9Ik*YD+3(^F5NR_#evq_s5sgk zLqQiAx|*IqG!E$bxT4Wz&7PD=7$wZHLe;5rjm$o_n)Z*PabtQcXHx;YI`8rLtwWQw zR|>mEJP_FOfE*6dhn}q_YZEETBgFG0uME-qE}5|^bBbUF{IC@WJRFbUr2sfGSS)!6 z@F;TjN>~zVx-&IT&v4YK^ul6z;IWv?IcpW{(7It@Q-k1E8HaknN5}FVDBuXeu&&hQ zVq@Un!ZDu~u0WYiavZS63yH3&p)P7Ubra~1ZpSf;yST#iE^u9=cct@DbtLVG;q7L|ojs$Xbny|ze~b@(koi!LbIlC6@E;*(>0r>T!-Sl(Mpv`caT zyu@;{TIRIPLLXbMZex%M4af}<`tr4lv^PDueAeW`DBYyjCYKb`k!mTcncNnq^QR?> zPM*;u>D}vp<|S$RxfHpruyQGRtV^$u&t>Sdj?Jbs(3&{|Mpl5yA!%lk6+=W5&`OXq zXAx$`o)HS7xz*bq*&mY|!Gyo;_SHp$BN0aWxRjK%>P*+J$;9*{V~%hhP2IShCb#YO_oEva1E(#pB4k|_gW zK}df|V^MUu(`G&36p)ZTfqmY8TuxVsyG@@?oupoNOZ0P5T_1V-SCEg6eStmNy8KRDurlyVP5M7P; zgn=*A88<3*T{9(FG|jQt_r=0_zMPG#^(AoxrxG!(*H}u8ZZ8sLTO)hCGE{*2F(D3D z(di6~Hr);6$0aY=a+utA1sx$rUbD>39)IyldXGk!uV=t-VG;92qz#&IaGixI3Wva! zUKXLIAi!!IaT7?Y&ib~kr!AVrXe0;^OtD)_H()PS9-GHnh+cF}!Dd;LOmpLSVVHHm6#+=^CW0qj^fGvSI}B=OOD>4 ztj2ck#X{_vusiLggu0mKX3hTF0!&J?Z6&=a3ujY_)jjYb<8-ev|p8SVMe-K%#|{LTCg6zW+1l6J2n?;-kS`#%jd9N) zqUI9*aB#r88^Lzlk!$GE!II5ew-lR+thYIU$A-ll@CUpDzaYeuK31Qiv=D$OfWJ)oeYFb zg$V`sZDbo*u>O!9MD_$adgRXS+xEx9@w`W0Ze`)TN$*J;+T(Jtl4--zq3vj~Vksbn8|dqPAq%6%mZ0Z@-k8UnijT`Rmu{6;1~-#^MdmL*fX|ABg1%`4aYT$3g@`-Ey7W>%$yppBG-@i{56EM6EEF!c z0&2Dwtyt4_zr#_K9PLGy+(@pf(IFLoDaVnYRxs>+>k9hp$&NZLFL8=-6eLs{iX7A; z%!TXFU)MjwPud+Uf64hlq!Axtm!^;FFh-%-unFEDpU;E7ti){dP-&15zJr$rk9P}- zcrYF|Obv64Vr`J$c3)+quDv%zpzvO7RJ<~eh(WCc~iw5*sbw6_9fIffn zjRF1M)7I{)5lY`RqHm(sV&asAUr{p&y^Q_~ePGQhq*JQr+H$ASF7~jtD!zjL{j;AP zUq#Lo)Z7-M5^!Y?So-BxIoyBeE-1(TH>dVWvaVR1CV_eEx5zS4LuMl;c zhPp_%?FctAreKK;6;fen%7_hb4`S2h#1PGNfZUi`R!u@z)1RRBuC3#^CbltaRy5@7 zSJO`-@1s4B+~(eN8M)^@^d@rRHS`W7P-ePbpuWID1gdMG4jW*JD+7-PTU;pn3S1T} zH_%v-i_K3-JaI?cEm`%3OtaG9%0Z(SJVe$ia2ju-Xf|82{;U`sN{Gpb(l8`>vo?#^ zR~wTJ$GC6cEoOe~>5o!E%oK8r*@4UzrNF3GaFWfhrO#T%?o`3_ZhtMkpIBduWeD@7 z&6m#Z_nOzz=Kv5mozrvB=D`jWI~KhlV#jYXLXHwBUOWnDk0V*fOPD;TN~#f`o)5s= zK4i6dc~G01QJahHNLa!5JE?9aP)b+*7K0YPG#1gx*&)iGPWaSvNoTJlBiS}&i-mNc zWR3?c^+;KrEex84vLCH}lst9?pg8r{(eGx+?+;>~G;LMf_wUMM=oC zY4yenHcu{mGyUPy;&9WUf;<#e9h^M<7Wz*#+52|dvNqZ`yWq-+>hRMjh$P3;{ zA79(WrWa_)JKjnE`OMG#_BTuWC!c*6{qSkMa`utQZG?V;BFu2hwC!y3hl>@j9^)!# zhk)v1#DyRtOtPU~WWw?RUfCFTWI$JE@JPGA5G!kJ4pXaH@TEqQ8X>(}L7i&23}(Js zvKxEe9?XoRHGj-yl>_PVC};CJave{nV(SkCKHiZ#)_M^tK)E36M0CyQ5p0X0XDj*O z=MaN><@NL)^2hhm7t!2#q#j;APEPzYeRR%X7qAUOunA8YYWE29K-wF-FEGLJz$FNm zArA@JGIH)#W`8`9cWF}A5F5^hD>{p=+4HqxKD+EFM2ywE)#J)|ycKsnW2#lsId#vN z9i`aHxSO(vhxUpv$fP_Sqsy%}RBF80mnzqVv{y>aW?_tz%fxs+0y^)!p1ypYr?cUG z^w-G4@1wah&rL3VKdoEu@$_z>cTnW$4VV${dmsAajT$_tqwl8=&SlI1gTW3BqM}HU z0L6plok5bYmIjIwVJM~*?`8>F|ZDP`j{U2CB0#C z*^Ttq)~msx|3e4q>)wUAZQ3_)you(I&F6H$Fhul2*ocC*3-UM%usx7fs1Ga@O)xIU znj2ux4`O<2cQOTo>{F+tVP{z3Q&mgX> zWWIbey#-4VTr?f{w1~tRkQ&CTHrowDAs>3!=o`?&HbCMZ!iJC{AUl7c+8<3xTpbDD zl&fSbCLjpW&yQQ(T1bd$J0opO3k?dsTLJH~FidO4a=aon!%`SAoNB=#cx%aVGO25n zlIdt>(6w6Be57L+rh**g6(6R3M7IL~qffmGvm$PEE75+0K6GqGU)4gD+5ll5aBGm` zg`x`#IiL&-&o?8W+d9NMv3Af-kzOgI+G|D_ybnVTxuLGqT6J%`Rgmp!SdXyXayscq z8zP}lyOBr_>MdKjR~ZM@Fu2P3Y&v~Aozlf}Nx59N2YsG&&@C4QYs%X*zvxBe;~%CE zlSe;HYu9<`?@`zWBjUb33aO4rD;;(RICB$B4K5_{RY|t%G=-`E@%KMUA0y&d z=%ev9^Zsmftu}IEr-%^C?BJ4lMP?BsS)omHfClP;9)!Og2V^}Y2@SwrAw?o*B?xi= zkUiaHCi-?MWr!NYP_bjNmij~gz-$hLvpqNsbn^jIBsWSquq1bTYCSl*x+(>(8*~)J zPBl`pw_5#%ubZ`6O5l8moZa7P+SP#!RyO44AEU)}9?pr6)6Z9(Sx#=ho&E#)(kCzu zeR>B1Cp$hx?}c^%)~mCg0U)^|xC%XLB}oJwp*%)n31oKQd0^y-$PwiG1ajxf(*CPN zV=Tf4bP2o1>NC0Qp0+tZ=xgI{E}LoTSl1}m7}#uygua=trwy5bQx__iO6q#lR&3k4 z&ZIWw^*0jUV8Lk|M>XEQt_Q5nq?m{Xb0b@Am~B;)Q8`v@ z2^zz&RW*~zCu#4Q?LRsADf(|qvwhu(&tPQof1chy-#`fq0z zPugFkw=?UMzxyk6V4c;`Wy6&tlf!q?=bX0TIQK=^d*#1Mt0=&=sE^S{BWLu%XM~^i zKu~Dslq4mAY03la2**wni_nxHD-YSESTW+=MLa^1jRID%`=ic6JgbRRG=1k#2w3~A zUZfXwu}+sI?9D>hr0I;Bq?oDd7*=CGSEf*@z#m=DLL+9_%hu`!PtTfFcOd6e3`?b! z$l@-crF=U!!OE&(QvVwL$93xb@Y0suled1IerSnoxSM|QnJc@;&)K?f(z=`e>v|*U ztM8>xgHKO;1=)7*)+3YKzDsXi=OdHv{TCfuul%y_(LjqhLD3RGTi2nH-^GU_-_!c zYWIs7!IqH+ep|8O;(A?QH)tND!z1WXryY%yT*m4>Huh^1!G5@E8H7c9)9YyIYFYuD zYD9g^UU!La4!R|T)@#Ln)e;|*w?BZqtMos3JFGvTuUe;0hq^k_<78EZF0@ zlCxB=8_PvYyRJ5+1cTiaONwF-n^xd`AE2!?n*FMuViXQtxV%Dy`{<9%QTDh05rxMe zq_<7B-B17P0%d=)l%RCay#g0=we$shH<*q%eXXe0Q;k)SXRrHov8-pz`kMCaI2)=%{axRgu0YwJ(;lT& zZvQcT)!MeW^cVDQ;(L@nIC;e*$ooC>)C8wq$Na+zUvR3fkg-Rg9kH`K)~2W;Vy2kn zu;PHEKV~=uK?f=;Kii-8vo_h+)`g*P;x!C)rHI$)F%5doLBteHjB?!AW=@+@4s*C~ zZggCUax{^(6)H8%lj6v(FAn)|GT|%^`cBbalyg$coXv+N@`2ydHKm?A9;12XUs1h$ z0lDT^^f}~?U(ous)w||5Sd$<5CD!C;ly3Po{qJX%{^d9HyZ>L${#TFD7oBPkCFi9m zjTq1fiV+`b5AX#HRIr%Gk{H6nybeUU8T7czbN&JdQ^uIqY_rFm16!%%@*$gENO{Y> zKqOmfj%|Kl)}ZnDYXz&UDY*P52j2Q}qvDfC>cSw_^Eq_&Tr_OZ*z@65J3NHpuY7>8 zPi@^u?tYw3@3^#AmphW!1R_vblwd<2*>;Hdo}k-n+aUBSdKdZoWAuT^=HFo>zW%AF ze^1K{(H>MCU7I)SwOiFGF9AzBg`R-;0#*)l5Cjq~IYig-l3-1wL$Cqbbs)SWPoEXh zHqd85xC9nZkL-&DM|RF(t@_96wzjP8>p)g@j;qbSBQp{Wq3|#p9f`V@$XDH-+$e7{ zckM&Zpge4rYeCR9+F@tBKNP!>LggpFRdVkd9ipSNO z0&B9sdC6+13ywfO*)kh!g@oMiu!1_8(T#M*K{=+i_MDNp!957uI$f^R&q!^5q89JQ zW3>(xi(=})(9#bZ#&sgzx}pR|Hj-QaLT@xcd}l^=Sg=)*xB-3_bU z3l|59XYTgthu(3;;pN%yufF|%p@;D>bN19@6@N^>4|b!}Mr89RyZ??@6%e^?P; zfbhls>0gSX#Xg8DoO?e5Gva$UkR4CaOH-ca)+d(_E={#oi18`P_+7HMqLUu^pU$ms`QI(_J(*4}OmziSkn!O$eSz*rQ+< z3?c;*j>=qb#I6egL2_qw(3-L5ddaL<%lm@ioI>CJ^n=V7s2OtpC$C$+ zZ1y_;f@T!{z^o47NZaXdk~NWx>ZKznwLdb_&^;{L})0NTNPivKki9{giO5T z@efk^WF2rG(KJr8sj(x;>~i)T?=t>o`gS(Wyfs~(A!AuNAwm&nI0Pp?RCGR&$>>TpL2^?M_|-O}pC z8}TID9cjINQ@g9{t+oyvBv))^F8#-Y(EXd4qbCO;>=BhnkCX)`O-c1BB3o0OZyqjG zFda}LM3_vb+2L5bDEd7CUEe+qvs#O@VNS;-Pb^n4>s`V~*VlS^u^tHFid;bFv?Mrl zCvC0-;Xde3c|~m!A&z7vSqM}@A=%#QNPNK(QIikc2fo7{U)j2aJn+q}+woKc^4K@G z?jaAYFuRagn;t*4mDxIN`sTlHJwP;D7|oIbFw>ISX6DE;9)J=vZ*FG5Z`%SniBIlf zUPPwVTs#|Ok%9UF+6S^oNQ5Cp$U^oa4{d6!Bt?jjLotuVu5^m-gJg$^@A|tMzQ#8b znt(QGsvCUyp(kQ>6vpaKrQ&ne0=W@*Sx`h2ExqB;S1jt|MakZ7THW=!H8Ct|ExlaR z9xp>x(dD+4bn2om>p}!4hd_1gx*m*Jv@66atDwETW%St0(eVGGMM(TE}Z!<=UB5l*DRVW zLX?mD#(ux1ZD~f6_GI0ib_w=CBT$WxB$Fp$wT2UL!&T=ZP9angtPs+&eA@7u#f7q`54RvhxdinJXI z2ZAhOONuV1$b&hF3~5$*aPYL}r8!_B=o0!Njgf6O`9R5It=F5ycHEx{RxL&_TPogi zChV)FlWfqJjavDRolk=sGDTzV=iRE>5-EJcQc2U6e)U^G;jzU>HI($#gvlSC^o(8MeDPeU+_jC zHLZ{`zyMS1Iw6;#1T++#M4(}Fm~<3ToJ2;=3aLma8}wK^0Dw40?S#jrhZucJE*iPG zw$e7)bt#LhV)d#6-BH%T!icV(DI{V=O^bI1hsAy$Q6!9B+IYVpI4jwDsuL#R-ORyB zXcx1STAuEkkCUsnFnh@pA^;=PWz=JPm>rtM)=*IjgqSpf1;AKn5%f}213)9f|BRdw z5KVY)8$qs7~wZlc(f2Uz`%sL0{}eHWCV>wfFgJneG`cuWcFB5 zKh<%Ji(mx1G*(1Nyn(i65NTxGxxUFYDAzjn?g&zw<7%qc3wwS2QKy+}xW#?U_##QbIL_nDvEx@Yq1ih8 zn!JEzo<6Pgm51AduJw zd+r^Ve2Qbh%q9fjK~2HdvGCx_>lofp*%V2 zUfQ1%n}bxMmQFOoTA`*X8MuDi+>C&7U`>YWnT&%|*PB5bn@s428ApDQ4Ax-B!GmCz z&%vfF>4s)hy#(-(pAE|`qgap}u0Uz3`6FWcR9Dp45tF!J+ip?|Fh}Qie_eq2(tPVX zxje)`L}2;|362kv*Myn-=GPS?%o|km<3A^uz~Z`4iunWid2P#i^UpQY%yY1yn>{G# z?n5D2vF8RdK;n1~Ht{)-L~P`*)=U*=#3+opR8tI3 zF3m8{XXZE8dMWeGc^xcQFzQ9U`&TlrnqM-ZB<4JNJN6OBj*9h8=@R&&$wP97ce8`s zEinfsFPE9d()>IAP-e=@Yx~|;dd&XGYg)`gJ7luG!@P0vD<9}GH!Y3>edc;<)5*?4 zb`J5?+lS0O3z>|ckC{Ktf8}Q{WB7T?6ZUH6Y;xHvnVTn$S1~*17f(*ShWXIq{&&2A z87;o#%Wq_!Gx_wJPS$_&r?)aoiwC!S4fECcFWh?#bMNBLKKgdXw0O?Hei!q$#rMAE zJxp|Q{LuBx1&iO_egkvg;wyi019R?V&j*;_&I>-YBkEhxLW&}9$O*{7C}e$*VUXRHK`+kc zpfJP(2dm?!QR8<|s>HzWN)&i|&?WjK!|b@=@R$nSaxiFZyNxWobex>f9+r4xY7k5s zdqcguWY0#da4BzDyE(JFAUML-Y?5ayrbs6yjI;$$)zK@EgP&lm^M;l`fwe*5t*Y(h zj!m1-n-|{lN#;T<_-A=}K8ryX$#?@N!{ABApbMc|#TXYDW9Z^3J87unnG|GC!foxs zjJnoNbdB+Fy&tOT!S=GnDz##&W*(Vif(Ld%g}gJK68yn-Mjh8=fYR;cM%Bnb+j0il zrg&Co_H;y-Z1ax;KDijl1;eEIDdy_=Tl$wzG23a<`4t%V{4FXhT)qmbbaBEQR5oAJ z)e8(e0X0GZO9m#Ng~t(aUzipElf#-z3nc+K)Io%rdI{)9V{P0Z`_uZi1`>1{kHu7r zb$sQ~u-#|VS#F#)hO9}euUY5~^VYG&orw=dyf(shH7Tz=2&s)Vdw{oAjJ9rDXz@^@ zh3G=GF(p)Nze!;>)1ZakwjWLg@BbYf?+Ck%9ADW1gZs=*KLEaJOD>o1#hVNEDv>Ztx6te33akWt?;W$?PZY&of(K z?4d-RKw#cSuKGN)cNUW(x2QHAB;WWVvu{~ZyEuNugi{z#D@eUW+b{PCXuCFX|3 zcyQO3nHN$!b*DASf?l(ByuH#-A0@>*n2Y9I3}nyYt^o{;tf+m!#v4+a99(?>3B__2 zSt#(&z|BxLmua)UN6a%ST3Wzd2RoAN7==>iV#3cA`U8hC@2=^caw;7QC)Ay^ zx)q7&V%DlyE3_5cVVf~yZq^3s%Fq*a6+DGPVgyZoJ-OmeEO~U~syng%{%L8;apftx z<|7z*XJDMcUjq))in<&y|1tpAG9Ys%RzdKKSrZZ{N^CgZ(6=0wrX03ghEl7`rqb2q z*qj&!tWj$w7cWQ=h*ngKHjU9Xst(KLppb8bq<$>PI-OooBPF`pc7K>LG<2nA)1%g~ z^}erIRl;Xv$7p4lZ2LC^j;^_r*)#d}oy_@*3Fhi=VoCV`L{KL?zs~6BXL$zm!2%Zt zkIgU)@SKM75%fi}K=UhX9{5fp=nW+~5llrEyB=i5xLMb0w*w7phO>d}InwrfrDDI* z3-ac&owq?b#cePGa+Wm6iB6#zh-ICuH^{~9QAi*9W7Vj(&xQQ;s@+r0^&4F|Vy=i? zfCFciv5y6|Pu~A6W*1G)y>!K{H2hX_)?LhIvgI!3tf>UTd{qX6Q6r-9SUy5>9F|Ae zs{up{+%PYL7Yc9;VuX6qA_{9ltx2kr=CZ%qZ#1N|GdAcJ&82X3Xp=nVk*gWjHR!60vLl-)_df)lm$P;%l z0&)E(bMEXu?|sXX>-5_`2cz5UrU48Ax(KRs62OZBGAjr@AOwN*DcH9%thYF9=Y^>> z^>t4m>uByZTc6qgs5o3ORuG-@|x>zg<-zkg8YFctl$c+q%KvLWF z;{|LXA||TT9sGQ7z^)AaHc)^qwcU=jCU<9y~(Q3IlF!7v28g@^i@T zcQfjF7tI2clVdpuE5fuEYI^9Kz#kz;BC`SnO`r?{$y)#ll^t?o%*Obff2>a!MPt#* zaRG;IQ18Wb!w6du5*W<49$_w>T=!p$izYX^mw|NoDzkyS z?IFxOFZ^%xlw<#mv1c|}=E40EBpsKR5p))jG2Z%Z}J+VcBwkP;PNDR#)u04$r zY@3|D1cyzB+m{Vmjhc4ct*uo}uy6DBdj5V!BZ%R8xK@;5>o4-ozb%*!Va{(!k-F|gkJL*}++ zLa%IDtgc@55TiXd%hdx+FTmr`2uDQ4f*tRdV8Uz)xF=%!S@5Ni4H6BjJJknbMI(eu zwfZ3M)MR6ge7I2z_Us`DnGbAfy(ix-S^2o&vv%tlA?fy6`~GM>&)NF!kUnk7*aE%8 z$Y_scdGokt&L_EaM~~SEBhyjk?k`yV(eKY&J^nN6>XAP}dHd%VD78`2Dvs64k?pJ3 z{(9%?ZI2xxpZ+nkiyV9v!eWJ|01JKe$INpn9#aoXUhoJrKCDB$62_Er^%7X1bmZ`7IjsI*W#`!^c`>Yj3RPppcR?RXtoX6gCC*W=_!K z3>WiP5;ZyNq<9bkKP7otwE7B!6}%cphB}y6k@Mxo7go&F4)$L z2=P+eSP;y`VMpf`l7i3JmhS_~Q83-XH7ZzXs^&P5LF3-z@ z`&FvN4P1UuwNQzi96YS*FRp+0S*mLm$Lu+(mBq2`i0UtkW9PZ5OBTm3KTnmWKt|`t zzdc8#-gfM0w%r(XfbFT4I$iQ>-M0Ocr=Fwwz~YW?zEE}7$&X&Fx_EJX>+@9M#qp+N zs;|zE$@eZ%ePe$2H(jdw-r|z0S=GkHCGX%=U!Gr*=2ic?sNe>jYR}q{`ZB$0@8m^# z)m@v{&M_zcvb=Y4%&fX_@y(Z8RMO&`%XXD|@;j@lzBq}3n-)9V{T|hu7r*sUpX##3 zHNW$#h8ySi(@m&eMIF*}&sdFO(*Y3y4jxYr|85aYA@P*z7{HwhN(l0000u*C0M>y} zSCkR?Q4pR;9>8}8q%bWww8-=*;|O?h*a0@2wW2-ii^Eu66K-m2!R9!h@mYr36{dnu_n()^LmLD)Rk`75OMA?p`ZE6&` z#u#cEfo7wl?*|&mq{-FqS_`@W=Z!d;@uFxh_G5irT4yXM3)zflPe%haZOb+`M&n$( z?d&(d4~c z&N4_J#ggjAlLeKSl^0K$9ZrL#ZRsKCEM+x$l_o|*E*Iuu3&d)t`z3NkoJ9^)Z zsGX+J+oqR{Nt)iCh3o<{<`>ym)@fK!@SFr?VnQ}nT#i@#Z)yx!AIv8 z&QAXL^QzMsZ|X1N`TffmRWMzf#<3<}{*vn0;`n!8J~bhncc*KfvY9bG-j?5RRitR#HZ-n~>bYDeK;}DuQVe<*EJ{_Rukd6fO zRh$P7#-ITXN+n}P2U!rV?sU|2<+>@@m;fHY|$O%xQQ31UNGP(Y7>-@TK)GVgf4?{{6lYyOy(_3rHKwe~8{dY=2a z?~-gdXc|jad(#{@#I(&yOJ26j^m+dJB%X`q?qR^!##&u!a?NkCU*WM|Sv(q$2nG9j zD;d19_{RmsB=zdz`en=1#}oOV77r)Q*A^EiSG=}}RHf>A@gBA#R*-*uZTV{Q`#&rm z#kCY1?r^ptZw?>_WM+WD4=zHmDCTu+@D^mT$fiV|#w=}H--;CtgPb!R)|d?TjH%f+ zCdObq?~X#9RInWx$}*Lv2b|^UE;PyWRb^qAszgjiZ&s=bD{BfzUvEn55-PvKKU8Ld z>QM)(8nc$(`Nu^QU>pm7S`5J<@RipWRXjFOC?mgqeeqaw_`{3Lgn@#thHC~u!!BIar7t)5)YduAC~F661mZ&vZB6b1r+TF^ki$qI-MG87QIXH#{+ z0L!KrvA_~gI%>Gcrr)fw=>j%oNM&^)$;xI;TLNu!3y1u=$I}_fYPq1cnrl}bKD)t? zuJlr%DUmjTo^H3R{e0M4?l%UdemH0Blyhk?cz8n%&yeiBgtwJ^Yc=l^+!WrmhIbFw z74NR$ndky={Cb|8Y+}8NgRvvi754iH>+tJz5?K~PunVhtP_euKGTaV-&J^ABK z-aPbx3M1|K;)i%a5LTEqTTbN4i`IhcJ6p0aw`6f%vbtX&Xe!2CF04t|$AE;jmI1kn^293)hBcoV?#s zs`y_-c~Y`J!h4qc8$R1;pL{6JYtr&n30{tt#i#JDq2(WZj8~=Q<4)ySXnA-VZ+?hT zrFl2g`oCs)`{|7QL!Kw6n$DLcKTjwBc706f7T~>Tj>t>^)q?< z$bF|T8p$`#=IsFU1N9!kMWoVdAxR1nG$0Wah(01i6?~TnqG(~KLaI>*i0)LJ&1vuh z;TQEATK!@+h{Qja+@`igOO8fm6sgN1v3SrMla0GB_$oWCl0MV(=mt7VC=L1CuwtP0 zMH}smC*#)Cw4+Et9&E=Y3KQ|1&2!CqmRxf-@6n0nEZ+JBQs2uvf$Q(@?L9DQ?)emN zel|c^GI{^gyiK$twta@Tmp1;JpXH5cryO???-Y8?MW3H9cLe3llT}~f3AsO#o%?uq zb3gj0eLM~Q&as#AUZt0ubOpX6CG)pJO8?D!i|kumLBZ8mUdh`I^gGZiQ*$2)*@zee zCjq${A_L^ht+oos08-n^}1f=ACHuY;^og@$i~?ESf5 zGx0yo->?j`&UGcv%C!&=I`5SazR0t4ExgWm6^#W>;$P-%qn&Wp)x71j6Hq>C^24w2 zQgmB7^4bFnU+C*RC9VJbH+l4sNl-p)^5bvuw$i(xV)NwvZ}ZZ0kQ%N>#oiluG&nf< zuN!%LxED&EzXgAM<7VFP=mVi5NPkB+;Vtsl{>LhVm!O>@DDQ*r1jUe7HE30lSl)oyYu@P$8^$7(q^iGy_Gv)bMs3 z&4MhJs8#&!K475{XS(X~I1TRM$fA`h6<%9E?F_hF!=|@UX^j2-R=!o~MOsmCJaziH zZpJ-3k4>K|cqdj~fG_XD()gu20UuP&yyy^`Nh$O?HV++nWr$*cO9YTDINw0w3Q~S} zqgY()6n+!!0WVQAChEaa*{8IbI)%EnKR`6Y9CM8F-DFJN@7Wqdds*SBcQqrcG*yKq zm$bEvHg7c9k@j8vLf)I~sWl_@uvu4XOUk+|H<%QD%v-fU9*v2qi}32Zcw4zdT^Yb) zpo)R38PQ7_^1-o!!_kl6C9Bg3c`4|%E43u>dALR|{*H(jRt>eXMrE8#I|5ayHxzVN z98yWQn~O^Iv6fq}8xJL+fJX01$A_SSs+9*FZ^U1h77|XUtYhz6QWfY)CJT0lKUWCm z{D!VUIwM)|UkR^%|8CyjxE1B}`&cXH9^R$Pi2QyY7gHj``+4_s7ofPE>#S_UfRBrhS>$+AQANx-o5m9JPECT=np)_B8yVSF#A|?SKWKS?!{hKnK;(d`(`YT!MQLJH=&oGO(C?K7JvSy5T!DrDGZ+UOPnhDY3O=QonmMR>3RPS|w*p2D0kmbLP3 z$f)u4Ib(2Ilr2fKCJ z7nG4Z-s43MJQ?tG@9~(4`hA|1&UQTS+R51;@b0JE7h6HzSmg7`3yb{2CZAfy{|Mc@ z=6{;tPx@tR00TQ{G$O9QQlMa8>Pqqi!{0i`iLpEf$RY&)0b(ssZos66hP;Ypyhf}N zcxlkr0A{>54GIKlIcBn4SHSB@L{ol&=t@fJ%ZP0vzjRJ*dE5830ATCoNtvV0}e zPSw;=W!y1p+fDUICoSunYGzl#UUbTXhTa6r z8KTQi4T4A`(Jne;+K?4n zw82!>)MjJf6BFm~*tC5)iwREsv!q+j&!H~8U zam!Hc8K{~CS9X-v+Pv<7x6=a?aAzpZR=atr$)O8cOZtWlDh~l`0dznawXdm)Xi7R? zsw}BwJJq7I8?9QBIYY~?Zu!Dw?-Q^h_DJ}y$t%b6zef+!Usmytr{nw{HDc%QX!tL3 zv+)HjpLzmb)bU^EYEj%i`J0~qA-dx3IDv1a<;IEp9=+W)dk`jBb~68R`bSi3r;8fO zYbU=k@qe^HZrdqXGb15;%*0kR@9V*~kjQ(^IjTyD2Cp7PYv!zj6V6OK3+oB7`*^?!-ilRev3E|RK+ ze=O1dT*R3eWZIDZ7XGhkE1$CQkD}!T2meTFXY6wGcXIV4=HcH-{(9RXCKB`V*UlR( z*RkS=dJQ&MEnut)HAwxCrh~Db&BEMGgX#*$XR@CFP!`CTMymR#V9&K`=>bw95<_p= z9(GpaMU^%ib(j^#2sW%t(%N)K^kaLp;1lrDi? zuHs^$R#Ta*sRqP;nRq+-$q$*s$;B5kJaWTT%-U)FQqia#g#UjkDafpH)L z0H{VRR<7#z4UvAs%;o?A% z^kjXNk=j<3o6Oy4&S~~X+cuSRIFx&J<$_m%S^$lJl?YSerK^{3Bwsv(FPfY_=08H;oa!t-HLOYV)BMB8 zjc4<(;}(nQ=kZ?tYfC?$^C|u-2R=V}pm-R`ox{I&>E~Ua;s18&XXUvEeV*t)JKwU2 z`+WXyX4g*S7x0U8u6^}$e9pBw`TB)?6*oS~j(z;2CW0^UH&WNvF<0`>pu70>U*fyy zKwkJNf8)Y5Bb$2=!`Jw`C9|z453v@&qX3aY8ann`C^YNUT8$3*%PhG&pkA26WQUc% zDe8oOrJBxzx1*eP<)Hhd>qk0$XRBGYXkB(^uW0kBM*d7%lJq$eu25StY@|KWYCdQT zH+Wyy zZxnKU^V;|LN6_K6=KFjtZFAsO{?};v{oD9!MKg~9J(hpuKK>EZZ-B-jI}+g>4ZM25 z65|LU&&ri@5VRp*3MLM+?&NarEMrQ@s@UI$vq%jP{IaxxohJ!G5-49qa2>V@gwqw-CrO7~=L~!rU(V678VJVey9L0e2&n zjx{vhY7yK+Re7qAkEH?w9I}br3heh;M=%WeGstlQ2okF$*mzV(!Nq0?rTY}we=~Lr^{4_N9S_*}4dcuZ>CSbq>Q;32nx$bi zC*8TAC9I4TR2@^dnCRzwnbz2*aXOX3p2t@7TdFv6rn<6zD5QzI1_8Cj-;;J?VRFq! z7Iw|LKK}@x`T&3M2;a3pw%sYDqvzO1`A6=WIpo!ORs{;~F)hOUN-%>VH4p@&P@RA> zH>-gRp~##zKLZM(t1M0&$Yd^iChAK{HQ-`@x(1BZ0=&LmnfGiYG+M1j7c)2^*CRKK-v1o_^~zmgAPn=G;l$@ zd?z>6zx5bjx@!hkgCh#qdC&rb9~iv~S?vr6Wl|t(MlK`x?-UsTCR3VyH*ek$@f4Mi zgwMKMZ8+(I_O7R6>^CGGb2w$oXTqhp$!ZH%tUX0E?N<6Vwd5#db?WkFcUm7x2l|7) zCpwV!&1y$7jBO~_&esb0zKyK8j`sA9*I{9v`!xSU@_WYcGE?o{#k%PR+0l40&zvLUZ z_NQf9NOD5n5XnWLgN5)mDu8@|U82G^jJ!P%fhtln!j+^qUk){#VDdAV{Az2gA!`pB zxt^nu%$n7@YEIiQ)iP0gw9=76Ku+3pMs0PSZIEf(Et=ubBp zMhv0RlA(qUIGlXuX}$*R1_!k~ztmr|@C<*;Wc&TN!`Bc`afb8r&4e9=nVkyT3Fnt)jruq4{DL2-~* z$!iT=y=EUkj#;N@PTMJ9S2H-ci1c}!WFP+xU&}4utDfhdx@_sxLd8e9sigyP6eQ6h z1HjVA>y(JSLw5?)sCxF)flLLYgyEPpRl>v3(V>u5)Ny-lvld6Ap%vKuR7EmKG?T5YrzlND2PtR6st?G0rI2bs)@*}j zI7_Pmy)`k}h@>I1{RO^!-vw`fY~PM|guqwsARm93ubW~g*OJ3u#8F>O9(*Zvw1tW%6$42{;{Z;#&tC5Eanwxun{&$=Tt~Y21E*JY!Ikm zS?+-2XNTf!nuYy&FiK_3m{bpGu{1Jr6ka8w+lfp- zsVN5h5E93}sWv&R|pLB`(EztT=MoL8y61UcLK9v-AW~h`O?n*nK|DnkiWJ^O}`dR{g)j;y;&$_~Gxc_o|N|UpSsGCCqF5 z@8M7EehmD@bmqSG8o!LHQ-43LI^*~JtEZdu_CLUQX20ioM!bmx{s@@~*`)qQ{+fja zEjjy7{K2g6Zv8W618#NNU-%O8$}=nI2)gAj{M{T0FUU8Li2S>2Ws;j;x>|R&BM? zN{h`C^>_1;qF)Pkh4!-{kM%_IMWAtwJUTtBV2NC!7Uw0)pmnYN{X!66!RZv>B3WE`Y8SoX-w@BWM9V zbk1gp7GzDUzmpHS#u|&hohvFlalLe`kTrE9)6f^R=Z&s{xf+bNy9Im46Y6NQwWb-; z5g9k+Ua~RIxIOMg0Ic0Xc3iu_nOM`u{{8#>4eZ7<`SE^!inXeZy--ZafD?bc7liHFOXMv^UU*y z-!|ENgy0I=+8-S)_|>enlP?}4xSO6tvNAz|cFr&40vazSRh8h#iAE`y<7iPaM_1gf zK5!w*8z&pIf>qS_u=^u|OX(dSIYB@@G6eM-CTD+Ca6LWCX^et9=^@}fv!F=JHJjiA z?q;Ox68w^T>Y!UdkA9Qyc?5+1M$jjiBbsmW3ldyCL3tCoGaxv0a$-<02RmFC5`1(i zq~)(+!3OerSnwA4?F!zZKPVV;(iwbB~F!^p$@CwOqVyGhqpLdaWPZ7MtUHj6< z1k~R$5uGZKa!nz|(*OaaxRpImnqTF*Vji=PrmCx`D9 z{D}S1h$f(a`WWQa|L7i)jj74OtgIA`2renCpTY+QS|f$ zf}hhrqT-*le9J|G811M>zkr7^ULyDu{Ua*AN6Y73Dp<#riI-re-g}wg)AWz1pePdZ z#ub9Mxo-T+e+zi@JO8>;KmkV|d{J;ecg4@XB%mPriS)~Y+v$*d?kj?0CR@HLpcsvb z&$E#Q*8N#|MGXOk136BOw$UjM>;aUm#gC(B+EPz399 zFVWXTP~1Lw=w-n>oEMoq_(uVS(_i!_fr+kfUw#7vz7s3bG1xh)6*EPlS{NZF^#Puy*aB2!)f7@N-c_rPZtHVzcZ6;`b{CHT;5O{ zWRa*pH#&d+EcWpjoNU?pOq>cO>0!;P_;c3j|I*UUKKe$i+9LBvRYjtxwf60Rg?LRowQF=Qug$0|PK zpyiZ+IeCG+u~!6E0AnDR99(SBZh^QnGER|ipi?2X%{s$Cq`t`8 z7_EhsDu8@F-b~IIh%};gZ3&_b=6ctl4Vg5BQO0A4jcr5uSZYEJa1@%|217SqZ72aa zu_xu$Ts2q$cYYbj*igbY7`s7Vo*s}-3mF^tMxGKftEqSIg;mTkWbG>EUhZ%Bd?6j= zowW>oTjX==n5Vc)3hSBqo^}5QW)6P8W)pKHeW5pPW{#S?wS`$tdq#XXqoJd~xs9RA z+a$i7IedXU{vCml+`5A~94YQIuTq|6bB2l+8$(m6LFEd3s}@PQdPLdSjB0SDY1k~O zHQ+@`Swi5K?s!a2qoQ25hhs^l4J9G zpe;Q0LrjfM-(P%~d5gM5AK%UVp0@lhIrAE=zd_5?xt=DgPGmMtPCS9Rox9nsA7$v4 zOpZH=d1~ol{ic(c^^+YZGjxe3@;wYSD338P_skxX>^Cq!GViDMgUi?1Jnx`Wt_C32LXs<9u852(p3-$x^{76xLm(JcGU7@q@};EL7we9@35&WUGmTBjA<|HNYF*2K>S5Lx zjQXTeb)Zz256Y&Nl`QBNHm@qCIvje2rA{l6@p_S$ypv$KopEwklF`w(@G)jLZL9X< z%u%$QJM}>4_fKPPhYp4>mYCz{S05`gb5@s2tIRT5e|3$S8&vn# znGb0F&zcMky-!|jG5cx#uRF{lEx*=f{+pK1>mT^tC&$e5%ZMYqd=0s23xD@y#hJ`u zbW@d|!%%~meC9LEPzP`N6&W@xl*apKuHa`rzxU*b6?(XqP;x@I2FLAL^maIGtVziC?C`H;_;N!#=#sN1GI zE|n!$mvqC!k~Ee9ZFM2nN?KZNND^d{=1MpqcPAC5y0IOu+TkHJl)@fsTV@G>`bH7T zjI0sez$KYJ>fPrr@W}ah!KJhQM{w!vx}I6XmX0FlW7{D5^O@4LA$xCN)=vvBeRhE* zo0OAZpU<4Qq-h_&0J{h3XBlf~k20&0Bh44oN_m#l6B(ju;L-G8b%s9?$Zf5f>_201 zV?SfNeIc`RTKMq~nImQ)(NivDR!*xgsJhV);D0;KprF6kQw-=)xc5O!4Z3nY!VuvKV_2Jn(8TrBJhgCu4UHyMIDuOpU< zTit52F`Wyk0*-{g=QV^X@;}?Rdt=*^EsdkZ~6?_Q1(d0@SgtY5HUMQH<5>b$ZVXwv>#u}h^DV;|AowEKAOb3 zS@(aA*|2QSsRTSBRx({M-uWB`d3ztTb^cPoC#BJY7m$@E2mb*8JYfEU_760jb@@De z!*a-;D5j~}k)BTHb*7Z5W_JuY?@-aS7E8sT(U9s6lJ?jjR0_I{W@EqtM7*gJ960`|4AWC4l z`7{6pt1#ve{DRjNNjM5*Y{~%K*9$jBRMwy|mI>9>qi93s>UvXstwim$tCP~MrC@e9 zwb5W88d7&njb6+b9F`?@hXnc{?q1g;(!qyN2VF_>z#Q?KHLsK;$>tH4BXyaE{ZUarIt3? za*d>+oACP_eVsEkbepA}NYgdUbzL^Uq|mWf!H^RUm31(^CXZase013cHr4*%1Ya-( zsKJjYosGTVe=~h9ED+R4n*1kiMp#FjdUdo2&m)+S1TFRC(MI^ZrF+Xx?_JJMgdK=lsIvfk zlfWq}HbQQ)VysFn*>cU?>5uwaQ)%Q%s3qo3xF7X}GP!!QjSOI0EAK8yn+UyR%jv-& zpx4#G5G?UIx{|y^T{lEimTJE))eQVQ#CjzIMoTQ}WWGo|@o)b6 zL)gs#4ZD2F%z5mKFzab!AYBPG3TThz8tAvAky-@lcd)#$r&ieWILsjZIs;z#6Y+u^ z?o@D8iVaI~pA$mNVOOs?4#Wm^e<~OEI~wkgx))Q)i{Jo*Q0_RZmueldfYa70Acj*6 zhvm7x-q{R=8u~ytRc)65xNfxe8SdIi9=#W|Pv83zHmB*zaQRKlngtno={#oVbb**{ z*1oHl!>21j{VGN=Eo{4$*)}cAaXpuOc45=B=ALgcvweKNkg#j!^iRGoGe=_P;om_4 zR5`iFyh1S>#dmy}StpxbGTra-n$r-rQK*19N5~W?fh>a4hyo*4h20(;YoN~sV>~PV znN9nm!4agk+u2Za5HbYy(nP1|9@OfCyd)T^s*8D9#bm1%4H-)=nb4<#t%j=Mt);>M zshi}QKtRQzD3o(nEu0F^H zlYV81wFv4l$Qpx0O$Cz+`V!C%L#6~?D^SFMIb@a4ip{6V-aADIkEE9IL)M_K>nx@c z4hZse(zU2p-VErI-fFrKZ07sz`atcj72Lr%Qayc6U9T&3D4|!YO$|!O<7sJ3DOJ_2 z)~78leX*^rw;J}CA3=moL~sow-Lho0gWP?lm}~E1g|s^dO|>sx!yG*yooo_H9`Q>} z9&rRYOEek3lEvU(LGT0SzVpu8M7>;F%>nFt$OqfF1A2qiQ_ zm$Ol*N43tBN+S*Dz_*ahHM@Epgf=BzAZ$HeS;80_jfyrsaMp=HDxwS-9kOtw8cO-p zZev)^Ej;sRnw6$2Zl46=7x0DK|e2W$%{ zBOsLx7ZkfrAu|MF)@k76tY*PF0G%nwB*ukAKO^oAT8NhYDZ5!^XlV@1N~n~Jb@MKRHP8hN+)yj_n)RsKHf)FZ>vSQ3Z)wWmlmb7n0!+scjt5OPa+QEdK)N+H_dMi! zIrxz)&;klZ=52RPl|(I>95=H5e7CO6yXBdd(iSjSqn^6jUVvESP?~q->TXLT?M>Aq z!!$z60ePovFx!otoK32*+M1odbkLRrCOfZVPFiXNU-wPs0B#k?2+XStuq+CUhAbR> zDK-}}p9kkx9@xbU;<^C1?5_fp1LuJ>7?S3JtT9SKfLG3Rr7c5o?Ci8P`Cz~~vKg$U zf=d}UtBQGj#gVqy)rCq&)m0_6m60b{Yz!hAd#omH=p61=F=fw&TJD37m(#P!&%VX1 zT(@NDVD)dS{oFx|hW^{kmierMsE`~aS%4YlQVKXEp{N9;GK_jPJQ_KeA;=8NX~~+? zuv%-%v0+8#a3w2#M>O1TX*ya(&PP&8I;_0HzU;6CgH>m!pS*r#egICu3TgK(Z$* z=&<1Ell2<1!E%*Ez@^cS6WU6}sOr^xRfobnRGS7a!#Im6r?z+{jj_=l><^9OK|`K& zCz3L4*gCAF{56=naD|q!dT$|9!~ON|!nl}j&(y;GU&rauxd>=Kf-~22o&3S|jAmN! z)16mz!+-AAr`^iT_Urk^J>Rcc^JPJ^Zw*wXmJ1=;`12c>W0!Q3=|*PDe4j{xF&DT1 zg&Y_QtUOs@Yhg0y6kxMN3J}zGSr)GROj*}dQUr<#Yt7&-KrkjAgAi(1;mgn#t7<>7D*+IaBLKQ?*XkQ>%=;m8dnXZyEue>6G-dar^)1 zrUNIP)ns@R?Zp4Ean_LME-ovwC>C- z2}~vvt|liVM7LTrZ9Ax!N~vmToNLc0zUZUxz|i1;uB@`PJd0F$JUJ9eKwZd&++|se z3B5uEq0bzm7XTWvCy-9S7I$YYwwTpmQ4JhUMKa|urzNF|C0qs7m&Ir7xZ~Ld&id|R z*j`CSoP$C|De>rXBWr0~^k}L%mC|oEnOuH@yg06e%nk4i9tsO#{@~=$@5AwQz+k9- ze~C3NN6wmF1vXh7+)LUtixFbkIKaIK*bwr&6wn?(&K(Puj+BR4Nye&`xZRSJPSz@F z!iIX-9ZA|pfktd#v4-{?-qt800e?N#Q1~@@D8#wT zoroST+|dxzeaF75j}{Z}4>)7H_5;R@z#`3E%7AHJ1Yv1E+xm@tPzh=qIL7ZnC#i3Zm(7!=vOt;rl(}~ghDp?JSzfkaOx7A?m!2(WaX?S5FjdLQ(eyg zaMNwf7O+TB{{!qTBs8m)powJ@n!!-20#*C;(5uP9*8)!F926U-vp;P2JGvT^+F%-# zTA|XQB=O}#Av?_5j!m1Y*mOBVxGHh@U8$U--1Yl%#zYpaALI&TuLqNez8evL`e;Xx)ZT@|$sKDJ8B#k6jh*CwWBdpm3efg2iy>@=f7pHt8Q_J0X~(YB*#ow$1>j3$LgQ#Vnu&)a2>wCi-TP9TmGi76wRnbDvpubVzlM^Qb)Pms#%9^uOZSj zT7r37N8YdpeIv7WG%VYs14&nA^Eu6Noljm-Dn_ANRx3%V9mP7bds_i(#;K~y_uX?W z&UAM$5>o#$vs|!i&}dhd>@d^E-8kQ2Sg$|^2PGigkXHaQP`Dp8DlM#gSq6l&kYIsi zkxVn=Gi~})iIhU(tPg6XWZ9)3YMXjvBU$W9AeWo5n#@*%)Z`p?n)Y$d+z({(QKLIH zHkD$dhQwlPhe`oYEZH?#8~ReH?@87ThKBB-$6Y<&TNcSZ-(0r#XiQwNeIv>ZigK+Q z-YN|+!pPQQeZnj~0c3`h3e8mEOQ8>_Rh7EhSc6N~<>=WJ&S0(Xs_N8-@;RtF>EFsmeUkc>=k5MCxxql_ndO;D8^} zddrToD{Tua{Y6>5;xG+zz_uzil2NKsj~mpneAH{00T*5}@kEo-&luh^^2FDWZ{K^2 zISr=slh3Uki{PPLsey(#Ke3Gfr)W?thn%PE!!`bH;3bmP>@jMfz9r)}E z%x`GG^R8Ez^Ju;QcTAR+?|hAk)AF`IFnwCS>W@tAAYQB&tjo4dG=FB=^opBbXZF(a z34g`a+*98C2BTgePf1s-AuIMXJGdE-+M_0?>}Q^#4|Kvi%m(_EX4@79V zTmAN*0637pEED>d2HWv@(5@8((yWybCMnFJ#rbL)7^(;=ay`gU88w4x`N8Fc;M)EC5SXYmZ{iB*& zuJ2bJ4S#yn@%fbrgQ}P*LmMUFsCLQ@DdJE@2z01CR&7jGimLk|Wx=k`unYhh`E*5J z{VTwZAL9$JB-&le){v1vXq=UPCJ>Hhr6?mjhHb;-Y(^MZ%XOM$n{fN&pN9$CG=$yV zDSViAj`c|4nOvDX`XS-_T%SF4l<-+PNN(LF^w9Ehwa`Pqn$`#f^sB4&!Xqb_X@&Fm ziV8oyu=Ek(jl9jfQq9sHu+Ks2;2?LYnzYVXkY9eX@M!oqKsi61Ua;99Lk0f~Agx*? zzAE5Q0AB>uCgeJVr}NODNW&JNrdounC8xY8^;Ya@iy}5u=Ys=XSYB#KhM0=xZa3PG zH|_2kh*1J2T{EV1XEYsqE2;`>GagOb;OnUJR)tUBF?6*dOSk7$bmH&?PIc*?Jz2Pm zoct+9u(pvd=Q7=0@ah-Y*b?g_m@s?LUjD8sBIA3={<9A;qY*1ed5>@nEFMa?pao|* zOf~Qez~=!&R0DUNS^++K92+onV9OzzomG)F_c9wpwYDNxvQ{0%w%*{V)|!E;As5PO z4GpB1_e;T0u|6Kb>a?n=5g(3=+M3VY%Y|*~e9SI$)^T31yJg{Wr3fHUJgno(@x!)-~j4nBU^a+1LzvvfIOycGFi%JOqbVU}!Ff0>qzU3b%?RJ)rqAP9;T#9`d`{@1{Ua|4=gZQCW#KXOhIiG3 zN0FB+LJH!Xetx_v{5^L+e5RnF$rE+qvGjY(n!96kvCB9&EvWGE0Ws1U^jdX4pILv$MB3c)+5o2)re zv@umynGM;h(N`&jl8#O)UQyM;7G)W13K= zuQd;#!R&~6?RMR`Ss&}io|G#NVYkGTzp9pN7jg<1>I>H|t|O;)1xIj=x#%Y0^RzFz z-xEGS_e9e~_+{*OcL)RAg|<6|>*;j<{Jj_g7u-#U0GWQi`X2gug3og~G?7D2Mi!b{IP3sDl!nlNLQQtwylmaJu`ZbL zO6nbRLgzAf{Mj&)kp`N6xl&C4f_K?Hf{mnczfi|L=S}wuzeF1pc~GdNPR!B3@C&xZ7yyFn^@<;e) zvio@l8fhk=){I;nb;Ym(6ycrQQj3qiw0G-!(W~iiEnPs2GsNY|WJuSbat%uYMqF zCJ>FP zbzl_qAhD6N%!9zC%HgjDJXk4%*7TIWnd}_mf&INiU*@+Dll?IcKp|wpq$8$AKr(EO z{IP!72SQo6*c$zDQ{i?f6>VqSS90V>4QnIOw<$Xs%V5yXRy?CvF9?E(P%`Ltdb869 zCa1n4+y;TB)Qbx{U2}#`X{}Mq)w@{5X9bYPvf!fWPOnB_4pR#e<2*DRFxglPEuJ_7 z2(TJncErfjStZ%Kn!hpHaFm7-pTw7{RU(x^xoC)5@YI2UHP(*CHb!i<$h$qQc57Wg`Xh+8BMt#w z6>Sb~1s0VO)^-MMb=oZ-8k1^kraS7T%R>uX2ytI1mmak;Zf$fVPY>nwklqn#1!85S zfz@2)sLSbY>+<$uckGaRqPqIXl(l#b(u^&WkdyuIAQ~}MeE;}G%f;l@mq4BK1hc>p z-38z;l#$>v(J5SmZ(SyuV=7-gL^KCFzPl*;Hl4lS7Kn6ov0o62wogPN(YstPApu#m zb#lyd(VRcSze4o41@gp3!EW-VP{bqsRid>V1A#6FoDKjXh>^mvnNuLEO@(7JfW#_f zuOj9PZYvGhSrl&y`y%1?2%XlI`gP-I!5gWWG{bDXWOfeS0AK4eR(01M@P(mU+VKU- zl1MHvtk?Y`t;(e|xlJi)$X6~Kt7%Zexq~``cVLhV$ii#OH&67dMRWA5;!u%&k=(w9 zKI`=xL|c#NM!OubFT`;b@IfNzl85>(Xw?ydgt#pW70)2gQ9Bdu36FH)qSF!@cI=r{ zMJM;$n&a3Y;2MrA5_O{MS2~7xghaL(56B%xjTPC%V{0}UZ&&=Kx=L@Anq3i7K9?(v zOGaI@o6y&rV`NZ&4CM5m*eJSl_NItoljudF-8|=VX>S%iNItY#bkvM0aoX3P+$`G0 zap%Dcq)_4nq}IrxP^!p*^%(##AU+W8gWw9VZ%C5P0P5@DZ8*)Y3@Q^rsV-a&t7CX5 z>A=^p`yzgOpIU1m;~f`U z1B8(KTC04zC)OLa&K~mQXF*2y{6%vqfKO}@QETX|!$e=EX6DgHh&T&&^8OK`J#>hn zeB`9`AyJ7A!fC|^M~mhdaLKVE+bV8Ee?oWQ{dPYhq888Oz7s^t=+u7fMA4_HIh8Pq zmeG-(HH+qG`%hX#4=%E&2-5N(W$E@Vaw0CaiUj05i)gKkJy&p~bF2o8Oob5)FR22O zP5=&OWGn{*m}KF5fx@^vrax3TH1wbXnLi$RK3E^5-C3AVbz}8uFTY-~d6NsF_NJM^oCS#hxw7hc1Vq z5FUjhwu0L;lnw{xWT)blN8q9_BobbwB^!*Xk{-X;VvdBZk|Lzv+!2$+Se1lE?zq8Q zAB?5t5oCjVT~}m4JT{Sqdof?MiD(khMDG-xLHGH)JfhFg7vu4X-k>kW5)sX9`e97; z9<4v)<059^^2>O;$t|afPUL9Kp=}6d8W4T~dJ2v>C97GbR|0CG0s0JtV#*9MXH(N~ zV6++aS^RQM7$-`FG!LRUxg+Zv^_ouB_KA4prhX?C$^_E`O(UD_Hv zyIfI&Sre?pR6|Wb()Ah##k|s3X!Zu=ywgMuZmvFi+I)P!aQb{mP2Nd~XlCDJcUJUA zx+CoohfS0hhkJGQ@FA@ESmXEzmG(R9bf4S&6?(6pu5v7#A_6kvyj)Oz4 z6x~Xj`|YblM@@eJMbSLZ5Eb)mrZc`GnhTa3_jS<JTYhW&UFt`qKfOY|%)U;Xz3t=syJ=;ni-cJI6RrTy=U z?x9!T{!h_$OHZno{7bZB^7(&>3`;66e_yn7^1*u;b4!v(_k4hMpY(y~V9n}Fwt%C) z_ixd9?*8N~k$B?|zAZK`{Y<3G#49ITmWgTN=kzMFY8Ov9dEgN7mjN<1HcFRT_{d{Ad@Jyg7Ta@nEc^ADi`f7jl(UhL(5bFyWl z_^hQrch4r=?5<7X5xu~$MN9_^L0L|2Jxt7zQBH0?T-;iK^?2kqF->De)y7G0n^;G` zf9rPfk+l5V9pVbN!jWT+7Vjj3qr}&7V+Wt#=2iysVTpJvF&-y=o|{GZOtVL&$BXBy z-buT}KO@iH&REEsQt|dBkxJHwlmX&fiCjzMp5$^Mp#v#h3T!B#R!k$QkL4`POe5$r zS<;gPH)6`!_U0=}WdZUEtwKNV3@K$DcLK@yI!UNqsrF?CkH3+%+3b*U2ZRaPY~f;} z?&$ln65YsSs>>23i?2~AR|}mwjpD63jEg_AIE@1W$?!tL1x92({)R0|cpGIiPhJ}u zWZhk*sWVTrTQ_-om-sdgrG*9_NGN5);Xt(IRA>f-yaC{p!pQb}UIyh)Bhr$?B-2oO(5Z`#vf$g;0mu;Oqcaqpj?{u6&JZCk#$uyrw1ZDZeZV~UG zZnKt4`~V$hdpu&gOOi7};=?BQ2E|9y3-`yxhjJGZly^>cCB>nGD!zS+nC?16_;E3} zhmyBGE`Eq>!+ocUYjhjdXT=iw!?m3F5!yCGNt~j${Z3hYKljy9MVzOX|Dh^=hBow} zhIsEmUGe6b3x`iSodZq&peL3RVNd)zcPD(_LhrP5AYMbuCk(}x(DE-w;>Bf$9>0T* zERalNVC`1H_FPyydHoY&)j_Mnlb^)owVZKahW+6z@$r+h&lJxSwo!2|z4>6Tcm*y0 z*QdnhgKp)&cbRIk_8jp%%yjl=#Phx6iF4;YJdvI!?$b`V;R5mL>t@X(S6?MQW^&Ti zVliDX-na%UQ{`)7>P#hU1-a~6@lThhs?AilxT~J(mipvn+oCOm1}~}0!F%x^H82t> zI7kalniLLptd)q=Y&Bf^KpSU44Gowe#ImzU`2o6r8oG`5ntDxR>Z@gnT3qF|DlGX7KuIN+jb=d!)ww2kRq4ZcB--f(je#yK4dv4mE<7221*D`MN%Fbrh%vkGBT9=pr0F#hQ{)q#{h;9vqytK zmZG0&l$!~Ew;hi3l*UmsmiN2mb$>n@Osi{2;3RWuTit7lMAgcGM`}!JG{bzXU6Yx@ zv4%$yua0$5a`tD%$K85^_~r$2R~mAlJ8lsR$scYMujTxa;Hp+bfJ_BE1dt>+Bq19R z$*38mw5W4hBn=`kfJ8x-+a@NrY0A#1Io9sV+AcjZD$0FJcZ_6Hlfz`_K`awc-H6o@ z7)JdvP0$o=wv^eLxuIy3GzMcckuoPz;b2>%HCl=gXp|2MmSoaZ_$WE^W-Jgl-6ZbO z1!DI^oTJ0~OSg#?2hr2tAzn9m;|}rR^n!Ii7B55N&VrxSe3y6=$M^|fGlbfp2M6pa zx>(QVy}{uM@oyb~;8>-zARSjtQ6y1yYdE$g%jS-Lpz4mp%CNs^a<*bwQ$`tdCk7+E zQ{gqr>NT}{ED0gQy4sIrn&nj3X77Xn%huS7`IbuF3t4;v-N0BIwq3s7s4#i^t^*cB z{~qzJbc(5eBA(lO=ie`W_WxV5_{$H7cXHkXB-9I_mWJAU{*6x5B-oVw@j4 zf~t7CATt_t)8y{g;Y>5zqQh{f+{*XrAY0a&TF@c1 z)Q8o&%Gl6)v)QULUJR+4@q*en9#q^dr(P>hMh%9#QDQc`>sGA>nhABYrDU|HqEVeg zrU^xW@z_M(T(*3}M7g-Uyf9gJ$nxzAldE{k=Y&5`@t6B(oBvN=*BT~QQKp}POu{5p z9b@hZAsLcDViWsv`ig?|y{BjTe(yz~@Av8J^v#Iix+p%NvN4p)8ifTG1z{5ej>2ZS zttf&)7FK08l`K9HS(QP8<86cT&D2fX4bX z=-0AY4c=Sg*NqO^WxF+^b!G}ab!yg@O&HvUPOnid~=ls&o!_z=}^;aJ_inH*VqM)8Hs zM9&S{!8zm{QNN8`$mb25aPrxH%`}-7U)fH^{!*Mso_g_)&!0;s_MA@Kc8Sc}c3Lwn zQn^WTb~`RRxj6g<;~SQVzc_=*SYm)%bW{W1qy<5wfJqsCA#m>@qbUt43=k!PEkg^| zP$@N4$1FFUu`y!ml-u25OA}DVI@W~2uj&>1TD1>?kHy@AGvV<1bt<17*pv)tt*vv~ zY9$bhHbqNnCQ{9^XmayorR}^hG;u~fX{x91T)yx!eIekuRo>wA$#E|({iFZ6%SY4riJzt-fVVRoa3rSS*@m!x7U$LhX+yvL#{QFjV?VO{S2E z&)X^^Z@*FLL|O~&MzlWbbo)k8!$51OJIbL!U+inh$4@g7UtC4kiCgt#?699PkdbVe zvZp^lxR2*cA0&JDB=pS1q|3{57BbD7qh}>!x5HI7vYfAnpPeCN_W{b&;;%h~lSzwe zAK}Z1_z6Gx74MT_kpDKD4H0fPpB*NAC(KaZCf*z&+@~wP8YO!9x$ZbW!2_A1I!VSI zIdLgjD<=MmJkKZI6CcJ+LRXNN7Y&RZ@+i1GL$=C3`z(M=MoEr3t4CZxinF9mc_Rc5 z!HsTa35JMf@U8j6<&0F5$Xf>|aOZEqRDP`VsOH zuYT7@$$r@jC91C>8~Aw!=5P#)!tTS3Yl|(ny+b7H9C=g#+>X#wX?x|&D9J0L*78t=`)V}QHS96>4p_sq!ZB_XFL{X zXBbEX0(y-$h(zu|A3@VW+T^I~drrOcKx@-x_Q+>p4Q<{5jL03wmu-MR=%SvfmO&YG zJG=bpWmD{qTgetl@N)x*Emz-0v~bo~ZzC7rPvbV?V$p9eUp;9+*h0;|i_?=*>XVxN z0hi?Pw3a+KUZai$vLDMubAo5aAwWH_-*5>jG^4+AOn$P_4?nopBu z?52mwnxzZ(pdt_#g)Vkh35Fjg4NbjYL?>j1y?(LM{{;0@7^KDrY0}bs^iZC#op~{O1?qg1h1>`VgG7 z8%u?r-sTP_Z8KOLRc%ioR%-!l5N6N52Pm(PJwkMB?eWRYQ=M+QE%9<_*d<5Frm3+O z)c^HflZz@*OnNcnV)2wWgN`UvS1@}?VjP(a@R;cWHm5lV3TQx^Z2&k7SC)V*(UdO~ zGHPIZeBg4m z5(}PMVYZrz>*CpjqwQ)d%_*m}K;QTn(M#{Oli7}v^~`sCa*7>$ge+g|InASFi@10s zkD(twPTnhbHaqfdvQOOo1mP}M5hsj1w(#cn$+dj2{q^%CCyxsD#(xsd*m&%}$apJr z{ZGkwqxOdv$%ps|LwT=QJ5I(Pk!$|@L#nbcm^Dk+%Up6A&C|!Gnd|6J$joevLpM zd+{5qw#3>qc2C(|pP5x_yNReWAJ_B@X=B?rGgJ1?)%BjJQy;Bp3lRgr^9!}2G48X+ z8m(S6*{V7lo>4*9(-!NIxn{FB$`^ADb4Y0{X@cU*zat`l=i5#YnHx{M^&OJoZ>V^e zjDsd9Zxes{N5VBs#P?3nG2xhUIhAP++1?fOxcmvDxK&i0MbrFS{kxTPIWK>O&>JV& zRX@bS(O5%Qd;o@Jx0IhR7lz6;*y0u4^B*|FMeR(*bMUOTHR6~lIR^&b(nx>5&sx^*r66f&kI zn$jyb(iQB_>**R98jR#6h-nz%4F!*j7I`z$k3+4{j3i)C(LuQo(bwFPl5xaqHspGd zbS)4Ok{R&s%%*J%{RL%3ZLq6MobEE4qLyyl(2m43l|a!Gwz^Eh zj4H3z0sCBy3i#ZgAOZ)^anSvzkY~cybU5TVS48;EK|RYURqPW@y>V;Xa#+Q;*y_ zm&WOFkhWiaCmynypc}DsT8jB2d&L9^00U^$Ojvm`={yFXUV|jWjDY-eI2eKZT2gh2 zw)Hc0$h`)Kqo6BRt_K^9o{*l?ra)TNZ~KeZglj&RiMMn4(rhE#bLCZ`dfB1(G{LH` zboB;)dl%4)Zqu6RTa5F{Rw`C=TfHp(K9C{q_`(X1HR_=!CX2nFEACFxV|*mOo1zZh z=blR`-xXc-VH)J8*=3X`k{`O9ZsaTT(E{Zb7ejfYm?_aF|DVMZzbR90b}iL-uu8u# zj}3NUp7MRMw?Q@B47>w{^vT{sk2Oj(~o#Br|ZlT;>{*PPeeu>aLek;|;y>!E^ zbejLrL$}j$_Vntn(gXYscil;UBv-%gu9I#4z}M&#d|=#sgzjbc9HvjQM}Ce4=F^Ai zE+p7+Ob5^fIVh)s$|-HgY0SEU9>iAI%H@&YD)CVkz>Jp>BqpTTLMLSf7ALNp^H;oD zxNBNq1?mU#o|sbbhev`}Q`N*frp|mVE|_zvVRFt~^Sf+%XE6|S7pm&YY`s#p$4n`8 zeI^qN2FiVB$5<2#_tHBj*r8V@)$Ee{=sFN&E=>c-RR>julwJ&636Ni4ZZ9A|503@c z6a)aS5wY>1}oC9};|6jFogD5x`eOWBO6oG=cWmO|1~%p=J&?hV?kafhwx z54SwgL@}u~%x5hIO*9fyTdRRqp_CmO>Z865&=lRUIB3RA?4@6ULhN<#@-1xoej1Y7 zdH?;?#|O%D-=yDNgZSfVQ!j{X;>*El{~+Bp7HI}>#sGaFETwQGA`ef1PYq;)(9eLy zV*+;x()6>M;R!N{irjM`{~3aFI$Z8jqAf!$jg%pq)gFZ_bl zSR}MiZu&B@p2HIBnd0;Lxn3%!omc-7%(2jc;&Zjkq;<1w`*7)cjAjagIC>8$(9Lyxj%b@+VB(r~VuF@sHh zzLm{*lGf2crSJ5sWk?{pbu-EV0E0rg+7i@Z>5YWtmr0MT7GHXps?PX-`eY@$^f7w& zxI6SZfFZ#uqJ#c%T0q7*?7}>lz|46`)f9@pkaO0Um}Zk=W2D(hMh$6GqS~6B_hkd2 zqSNc{s+)CpzL~F&hDnf&C;`fkX?yjK35@oZvbGdP;3MDdc4pj>Rwd^5mt6W;y>l)V zN|(*iKsU{fJUy|M9bR?jR_uP?_zqpi{zT8D69PM2TDAG$8=#zNKTfwR0291m$GDqV zFfp}(P3%2GEp^8fd+l*_ri3Jvj9bLc)KV$|;|+f<}5dBZa>&Jk)Ss}bVMsrNM_mbeMkDuh(4_asbeqhF?#HIsNU8*0bj8ZXjL)= z5a>G8MO&m*w9FYY%AhKo3KkmukZZ1H#`m#BdZSHeqDQ26+Qkd&*ac70sgp-|)s-iY z8c%{7Udm1e#om+jJod3~(Su0*UjGC=z`p-ox@FN1fOOKU#{RFUl?x*N( z{1>tup-)SllgNF>4URrVH!j}!M^DkSrGj|hx9OeS2f6=C5RXm#*XGEB;7d;I?LQLNR?XtKjLxIDB3nj-q{qVu3G%zbA_A;!CR( z+z1nKV$H6{M>bF}Zzes}jV^{AzwYZ(lzfZvdT4AN)+EXp{#bz_J9iuuEOSz4G zT{4}@rwxOwC+@fOtEEgxZF4T9to3BK5J@`K;2H2Zbpn$7O+{_AT-FRd{d!pM3Tb;t z@&>n7CnIU(Z4n=xk%rxjT_N!rYQ>~o@ep@PZJSldo_w}tPVv~uw8tC0iuK~3<`m!K cruOrG#W7yKE2IeX_FNHBO!9_XA64A{zw|}^a{vGU