From 433892f3d96bda04712234b302c7f41c23ed80bf Mon Sep 17 00:00:00 2001 From: Shreyash Raj Date: Sat, 23 Oct 2021 17:02:14 +0530 Subject: [PATCH 1/3] v3.1.0 - extra function now have all the editing options. - Small updates in readme --- assets/captcha/default.png | Bin 10039 -> 43989 bytes js-script/CaptchaGenerator.d.ts | 2 +- js-script/CaptchaGenerator.js | 2 +- js-script/captcha.d.ts | 5 +- js-script/captcha.js | 15 +++-- js-script/extra.d.ts | 15 +++-- js-script/extra.js | 47 ++++++-------- package-lock.json | 106 +++++++++++++++++++++++++++++++- package.json | 3 +- test.js | 19 +++--- test.ts | 9 --- ts-script/CaptchaGenerator.ts | 4 +- ts-script/captcha.ts | 18 +++--- ts-script/extra.ts | 60 +++++++++--------- 14 files changed, 205 insertions(+), 100 deletions(-) delete mode 100644 test.ts diff --git a/assets/captcha/default.png b/assets/captcha/default.png index 9322378e4a20db1baf1694a0c8fbd7603cb06682..e5c886b95ae3782101f445a8bc3dadf13a1e08dd 100644 GIT binary patch literal 43989 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 literal 10039 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 diff --git a/js-script/CaptchaGenerator.d.ts b/js-script/CaptchaGenerator.d.ts index 7e816d3..7f17fe2 100644 --- a/js-script/CaptchaGenerator.d.ts +++ b/js-script/CaptchaGenerator.d.ts @@ -28,7 +28,7 @@ export declare class CaptchaGenerator { * @type {string} * @since 2.0.3 */ - get text(): string; + get text(): string | undefined; /** * set dimension for your captcha image * @param {integer} height Height of captcha image. diff --git a/js-script/CaptchaGenerator.js b/js-script/CaptchaGenerator.js index 46ec47f..54563fa 100644 --- a/js-script/CaptchaGenerator.js +++ b/js-script/CaptchaGenerator.js @@ -23,7 +23,7 @@ class CaptchaGenerator { this.captcha = constants_1.defaultCaptchaOption; this.trace = constants_1.defaultTraceOptions; this.decoy = constants_1.defaultDecoyOptions; - this.captcha.text = (0, util_1.randomText)(this.captcha.characters); + this.captcha.text = (0, util_1.randomText)(this.captcha.characters || 6); } /** * Get the text of captcha. diff --git a/js-script/captcha.d.ts b/js-script/captcha.d.ts index c2d3429..01518ca 100644 --- a/js-script/captcha.d.ts +++ b/js-script/captcha.d.ts @@ -28,9 +28,9 @@ export declare class Captcha { get text(): string; /** * Get png image of captcha. - * @returns {Buffer} Get png image of captcha created. + * @returns {Buffer | Promise} Get png image of captcha created. */ - get png(): Buffer; + get png(): Buffer | Promise; /** * Draw image on your captcha. * @param {Image} image Choose image you want to add. @@ -57,4 +57,5 @@ export declare class Captcha { * @returns {Captcha} */ drawCaptcha(captchaOption?: SetCaptchaOption): Captcha; + toBuffer(): void; } diff --git a/js-script/captcha.js b/js-script/captcha.js index 7cef369..ba2ee52 100644 --- a/js-script/captcha.js +++ b/js-script/captcha.js @@ -38,7 +38,7 @@ class Captcha { } /** * Get png image of captcha. - * @returns {Buffer} Get png image of captcha created. + * @returns {Buffer | Promise} Get png image of captcha created. */ get png() { this._canvas.async = this.async; @@ -50,7 +50,7 @@ class Captcha { * @returns {Captcha} */ drawImage(image) { - this._ctx.drawImage(image, 0, 0); + this._ctx.drawImage(image, 0, 0, this._width, this._height); return this; } /** @@ -105,9 +105,9 @@ class Captcha { if (captchaOption.text) option.characters = captchaOption.text.length; if (!captchaOption.text && captchaOption.characters) - option.text = (0, util_1.randomText)(option.characters); + option.text = (0, util_1.randomText)(option.characters || 6); if (!option.text) - option.text = (0, util_1.randomText)(option.characters); + option.text = (0, util_1.randomText)(option.characters || 6); this._captcha = option; if (!this._coordinates[0]) this._coordinates = (0, util_1.getRandomCoordinate)(this._height, this._width, option.characters || 6); @@ -121,10 +121,10 @@ class Captcha { if (option.skew) { this._ctx.transform(1, Math.random(), (0, util_1.getRandom)(20) / 100, 1, 0, 0); } - if (option.rotate > 0) { + if (option.rotate && option.rotate > 0) { this._ctx.rotate((0, util_1.getRandom)(-option.rotate, option.rotate) * Math.PI / 180); } - if (((_a = option.colors) === null || _a === void 0 ? void 0 : _a.length) > 2) { + if (option.colors && ((_a = option.colors) === null || _a === void 0 ? void 0 : _a.length) > 2) { this._ctx.fillStyle = option.colors[(0, util_1.getRandom)(option.colors.length - 1)]; } this._ctx.fillText(option.text[n], 0, 0); @@ -133,5 +133,8 @@ class Captcha { ; return this; } + toBuffer() { + this._canvas.toBuffer('png'); + } } exports.Captcha = Captcha; diff --git a/js-script/extra.d.ts b/js-script/extra.d.ts index e7be30a..72cd062 100644 --- a/js-script/extra.d.ts +++ b/js-script/extra.d.ts @@ -1,5 +1,6 @@ /// -declare const captchaValue: {}; +import { Image } from "skia-canvas"; +import { SetCaptchaOption, SetDecoyOption, SetTraceOption } from "./constants"; interface captchaValueSync { image: Buffer; text: string; @@ -8,6 +9,12 @@ interface captchaValue { image: Promise; text: string; } +interface CreateCaptchaOptions { + captcha?: SetCaptchaOption; + trace?: SetTraceOption; + decoy?: SetDecoyOption; + background?: Image; +} /** * Create custom captcha from scratch. * @async @@ -16,13 +23,13 @@ interface captchaValue { * @param {string} [text] Captcha text. * @returns */ -export declare function createCaptcha(width: number, height: number, text?: string): captchaValue; +export declare function createCaptcha(width: number, height: number, option?: CreateCaptchaOptions): captchaValue; /** * Create captcha in sync mode. * @param {number} width captcha image width. * @param {number} height captcha image height. - * @param {string} [text] Captcha text. + * @param {CreateCaptchaOptions} [option] Captcha text. * @returns */ -export declare function createCaptchaSync(width: number, height: number, text?: string): captchaValueSync; +export declare function createCaptchaSync(width: number, height: number, option?: CreateCaptchaOptions): captchaValueSync; export {}; diff --git a/js-script/extra.js b/js-script/extra.js index 0382234..c6108d9 100644 --- a/js-script/extra.js +++ b/js-script/extra.js @@ -2,7 +2,6 @@ Object.defineProperty(exports, "__esModule", { value: true }); exports.createCaptchaSync = exports.createCaptcha = void 0; const _1 = require("."); -const captchaValue = {}; /** * Create custom captcha from scratch. * @async @@ -11,21 +10,17 @@ const captchaValue = {}; * @param {string} [text] Captcha text. * @returns */ -function createCaptcha(width, height, text) { +function createCaptcha(width, height, option = {}) { const captcha = new _1.Captcha(width, height); const decoyCount = Math.floor(width * height / 2500); - captcha.addDecoy({ - total: decoyCount, - opacity: 1 - }); - if (text) { - captcha.drawCaptcha({ text: text }); - } - else { - captcha.drawCaptcha(); - text = captcha.text; - } - captcha.drawTrace(); + if (!option.decoy) + option.decoy = {}; + if (!option.decoy.total) + option.decoy.total = decoyCount; + captcha.addDecoy(option.decoy); + captcha.drawCaptcha(option.captcha); + const text = captcha.text; + captcha.drawTrace(option.trace); captcha.addDecoy({ opacity: 1 }); return { image: captcha.png, text: captcha.text }; } @@ -35,25 +30,21 @@ exports.createCaptcha = createCaptcha; * Create captcha in sync mode. * @param {number} width captcha image width. * @param {number} height captcha image height. - * @param {string} [text] Captcha text. + * @param {CreateCaptchaOptions} [option] Captcha text. * @returns */ -function createCaptchaSync(width, height, text) { +function createCaptchaSync(width, height, option = {}) { const captcha = new _1.Captcha(width, height); const decoyCount = Math.floor(width * height / 2500); captcha.async = false; - captcha.addDecoy({ - total: decoyCount, - opacity: 1 - }); - if (text) { - captcha.drawCaptcha({ text: text }); - } - else { - captcha.drawCaptcha(); - text = captcha.text; - } - captcha.drawTrace(); + if (!option.decoy) + option.decoy = {}; + if (!option.decoy.total) + option.decoy.total = decoyCount; + captcha.addDecoy(option.decoy); + captcha.drawCaptcha(option.captcha); + const text = captcha.text; + captcha.drawTrace(option.trace); captcha.addDecoy({ opacity: 1 }); return { image: captcha.png, text: captcha.text }; } diff --git a/package-lock.json b/package-lock.json index d894d90..9f7c304 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "captcha-canvas", - "version": "3.0.3", + "version": "3.1.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "captcha-canvas", - "version": "3.0.3", + "version": "3.1.0", "license": "Apache-2.0", "dependencies": { "skia-canvas": "^0.9.25" @@ -15,6 +15,7 @@ "@types/node": "^14.11.8", "@types/skia-canvas": "^0.9.2", "better-docs": "^2.3.2", + "canvas": "^2.8.0", "eslint": "^7.27.0", "jsdoc": "^3.6.7", "typescript": "^4.0.2" @@ -971,6 +972,56 @@ "url": "https://opencollective.com/browserslist" } }, + "node_modules/canvas": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/canvas/-/canvas-2.8.0.tgz", + "integrity": "sha512-gLTi17X8WY9Cf5GZ2Yns8T5lfBOcGgFehDFb+JQwDqdOoBOcECS9ZWMEAqMSVcMYwXD659J8NyzjRY/2aE+C2Q==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "@mapbox/node-pre-gyp": "^1.0.0", + "nan": "^2.14.0", + "simple-get": "^3.0.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/canvas/node_modules/decompress-response": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-4.2.1.tgz", + "integrity": "sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw==", + "dev": true, + "dependencies": { + "mimic-response": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/canvas/node_modules/mimic-response": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-2.1.0.tgz", + "integrity": "sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/canvas/node_modules/simple-get": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-3.1.0.tgz", + "integrity": "sha512-bCR6cP+aTdScaQCnQKbPKtJOKDp/hj9EDLJo3Nw4y1QksqaovlW/bnptB6/c1e+qmNIDHRK+oXFDdEqBT8WzUA==", + "dev": true, + "dependencies": { + "decompress-response": "^4.2.0", + "once": "^1.3.1", + "simple-concat": "^1.0.0" + } + }, "node_modules/catharsis": { "version": "0.9.0", "resolved": "https://registry.npmjs.org/catharsis/-/catharsis-0.9.0.tgz", @@ -2424,6 +2475,12 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, + "node_modules/nan": { + "version": "2.15.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.15.0.tgz", + "integrity": "sha512-8ZtvEnA2c5aYCZYd1cvgdnU6cqwixRoYg70xPLWUws5ORTa/lnw+u4amixRS/Ac5U5mQVgp9pnlSUnbNWFaWZQ==", + "dev": true + }, "node_modules/nanocolors": { "version": "0.2.12", "resolved": "https://registry.npmjs.org/nanocolors/-/nanocolors-0.2.12.tgz", @@ -4638,6 +4695,45 @@ "integrity": "sha512-doiV5dft6yzWO1WwU19kt8Qz8R0/8DgEziz6/9n2FxUasteZNwNNYSmJO3GLBH8lCVE73AB1RPDPAeYbcO5Cvw==", "dev": true }, + "canvas": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/canvas/-/canvas-2.8.0.tgz", + "integrity": "sha512-gLTi17X8WY9Cf5GZ2Yns8T5lfBOcGgFehDFb+JQwDqdOoBOcECS9ZWMEAqMSVcMYwXD659J8NyzjRY/2aE+C2Q==", + "dev": true, + "requires": { + "@mapbox/node-pre-gyp": "^1.0.0", + "nan": "^2.14.0", + "simple-get": "^3.0.3" + }, + "dependencies": { + "decompress-response": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-4.2.1.tgz", + "integrity": "sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw==", + "dev": true, + "requires": { + "mimic-response": "^2.0.0" + } + }, + "mimic-response": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-2.1.0.tgz", + "integrity": "sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==", + "dev": true + }, + "simple-get": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-3.1.0.tgz", + "integrity": "sha512-bCR6cP+aTdScaQCnQKbPKtJOKDp/hj9EDLJo3Nw4y1QksqaovlW/bnptB6/c1e+qmNIDHRK+oXFDdEqBT8WzUA==", + "dev": true, + "requires": { + "decompress-response": "^4.2.0", + "once": "^1.3.1", + "simple-concat": "^1.0.0" + } + } + } + }, "catharsis": { "version": "0.9.0", "resolved": "https://registry.npmjs.org/catharsis/-/catharsis-0.9.0.tgz", @@ -5768,6 +5864,12 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, + "nan": { + "version": "2.15.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.15.0.tgz", + "integrity": "sha512-8ZtvEnA2c5aYCZYd1cvgdnU6cqwixRoYg70xPLWUws5ORTa/lnw+u4amixRS/Ac5U5mQVgp9pnlSUnbNWFaWZQ==", + "dev": true + }, "nanocolors": { "version": "0.2.12", "resolved": "https://registry.npmjs.org/nanocolors/-/nanocolors-0.2.12.tgz", diff --git a/package.json b/package.json index 8da922a..f2c9eb7 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "captcha-canvas", - "version": "3.0.4", + "version": "3.1.0", "description": "A captcha generator by using skia-canvas module.", "main": "./js-script/index.js", "files": [ @@ -32,6 +32,7 @@ "@types/node": "^14.11.8", "@types/skia-canvas": "^0.9.2", "better-docs": "^2.3.2", + "canvas": "^2.8.0", "eslint": "^7.27.0", "jsdoc": "^3.6.7", "typescript": "^4.0.2" diff --git a/test.js b/test.js index e87e650..7b9ee0d 100644 --- a/test.js +++ b/test.js @@ -1,9 +1,10 @@ -"use strict"; -exports.__esModule = true; -var fs_1 = require("fs"); -var js_script_1 = require("./js-script"); -var captcha = new js_script_1.CaptchaGenerator() - .setDimension(200, 200); -console.log(__filename + captcha.text); -(0, fs_1.writeFileSync)('assets/CaptchaGenerator/' + captcha.text + 'captcha.png', captcha.generateSync()); -console.log(captcha.text); +const { writeFileSync } = require('fs'); +const { createCaptchaSync } = require('./js-script/extra'); + +const captcha = createCaptchaSync(900, 300, { + captcha: { + size: 80, + }, +}); + +writeFileSync('assets/captcha/default.png', captcha.image); \ No newline at end of file diff --git a/test.ts b/test.ts deleted file mode 100644 index 02c1c0f..0000000 --- a/test.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { writeFileSync } from "fs"; -import { CaptchaGenerator } from "./js-script"; - -const captcha = new CaptchaGenerator() -.setDimension(200, 200); -console.log(__filename + captcha.text); -writeFileSync('assets/CaptchaGenerator/' + captcha.text + 'captcha.png', captcha.generateSync()); - -console.log(captcha.text); diff --git a/ts-script/CaptchaGenerator.ts b/ts-script/CaptchaGenerator.ts index 522aa9f..7e11275 100644 --- a/ts-script/CaptchaGenerator.ts +++ b/ts-script/CaptchaGenerator.ts @@ -26,14 +26,14 @@ export class CaptchaGenerator { this.captcha = defaultCaptchaOption; this.trace = defaultTraceOptions; this.decoy = defaultDecoyOptions; - this.captcha.text = randomText(this.captcha.characters); + this.captcha.text = randomText(this.captcha.characters || 6); } /** * Get the text of captcha. * @type {string} * @since 2.0.3 */ - get text(): string { + get text(): string | undefined { return this.captcha.text; } /** diff --git a/ts-script/captcha.ts b/ts-script/captcha.ts index ea37812..4710583 100644 --- a/ts-script/captcha.ts +++ b/ts-script/captcha.ts @@ -45,9 +45,9 @@ export class Captcha { } /** * Get png image of captcha. - * @returns {Buffer} Get png image of captcha created. + * @returns {Buffer | Promise} Get png image of captcha created. */ - get png(): Buffer { + get png(): Buffer | Promise { this._canvas.async = this.async; return this._canvas.png; } @@ -57,7 +57,7 @@ export class Captcha { * @returns {Captcha} */ drawImage(image: Image): Captcha { - this._ctx.drawImage(image, 0, 0); + this._ctx.drawImage(image, 0, 0, this._width, this._height); return this; } /** @@ -111,8 +111,8 @@ export class Captcha { drawCaptcha(captchaOption: SetCaptchaOption = {}): Captcha { const option = { ...this._captcha, ...captchaOption }; if(captchaOption.text) option.characters = captchaOption.text.length; - if(!captchaOption.text && captchaOption.characters) option.text = randomText(option.characters); - if(!option.text) option.text = randomText(option.characters); + if(!captchaOption.text && captchaOption.characters) option.text = randomText(option.characters || 6); + if(!option.text) option.text = randomText(option.characters || 6); this._captcha = option; if(!this._coordinates[0]) this._coordinates = getRandomCoordinate(this._height, this._width, option.characters || 6); @@ -126,12 +126,16 @@ export class Captcha { this._ctx.save(); this._ctx.translate(coordinates[n][0], coordinates[n][1]); if (option.skew) {this._ctx.transform(1, Math.random(), getRandom(20) / 100, 1, 0, 0);} - if (option.rotate > 0) {this._ctx.rotate(getRandom(-option.rotate, option.rotate) * Math.PI / 180);} - if (option.colors?.length > 2) {this._ctx.fillStyle = option.colors[getRandom(option.colors.length - 1)];} + if (option.rotate && option.rotate > 0) {this._ctx.rotate(getRandom(-option.rotate, option.rotate) * Math.PI / 180);} + if (option.colors && option.colors?.length > 2) {this._ctx.fillStyle = option.colors[getRandom(option.colors.length - 1)];} this._ctx.fillText(option.text[n], 0, 0); this._ctx.restore(); }; return this; } + + toBuffer() { + this._canvas.toBuffer('png'); + } } diff --git a/ts-script/extra.ts b/ts-script/extra.ts index 26314bb..d5e1ee6 100644 --- a/ts-script/extra.ts +++ b/ts-script/extra.ts @@ -1,6 +1,7 @@ +import { Image } from "skia-canvas"; import { Captcha } from "."; +import { SetCaptchaOption, SetDecoyOption, SetTraceOption } from "./constants"; -const captchaValue = {} interface captchaValueSync { image: Buffer, text: string @@ -10,6 +11,13 @@ interface captchaValue { image: Promise, text: string } + +interface CreateCaptchaOptions { + captcha?: SetCaptchaOption; + trace?: SetTraceOption; + decoy?: SetDecoyOption; + background?: Image; +} /** * Create custom captcha from scratch. * @async @@ -18,24 +26,22 @@ interface captchaValue { * @param {string} [text] Captcha text. * @returns */ -export function createCaptcha(width: number, height: number, text?: string): captchaValue { +export function createCaptcha(width: number, height: number, option: CreateCaptchaOptions = {}): captchaValue { const captcha = new Captcha(width, height); const decoyCount = Math.floor(width*height/2500); - captcha.addDecoy({ - total: decoyCount, - opacity: 1 - }); + if(!option.decoy) option.decoy = {}; + if(!option.decoy.total) option.decoy.total = decoyCount; + + captcha.addDecoy(option.decoy); - if (text) { - captcha.drawCaptcha({ text: text }); - } else { - captcha.drawCaptcha(); - text = captcha.text; - } + + captcha.drawCaptcha(option.captcha); + const text = captcha.text; - captcha.drawTrace(); - captcha.addDecoy({opacity: 1}); + captcha.drawTrace(option.trace); + + captcha.addDecoy({ opacity: 1 }); return { image: captcha.png, text: captcha.text }; }; @@ -43,28 +49,26 @@ export function createCaptcha(width: number, height: number, text?: string): cap * Create captcha in sync mode. * @param {number} width captcha image width. * @param {number} height captcha image height. - * @param {string} [text] Captcha text. + * @param {CreateCaptchaOptions} [option] Captcha text. * @returns */ -export function createCaptchaSync(width: number, height: number, text?: string): captchaValueSync { +export function createCaptchaSync(width: number, height: number, option: CreateCaptchaOptions = {}): captchaValueSync { const captcha = new Captcha(width, height); const decoyCount = Math.floor(width*height/2500); captcha.async = false; - captcha.addDecoy({ - total: decoyCount, - opacity: 1 - }); + if(!option.decoy) option.decoy = {}; + if(!option.decoy.total) option.decoy.total = decoyCount; + + captcha.addDecoy(option.decoy); + + + captcha.drawCaptcha(option.captcha); + const text = captcha.text; - if (text) { - captcha.drawCaptcha({ text: text }); - } else { - captcha.drawCaptcha(); - text = captcha.text; - } + captcha.drawTrace(option.trace); - captcha.drawTrace(); - captcha.addDecoy({opacity: 1}); + captcha.addDecoy({ opacity: 1 }); return { image: captcha.png, text: captcha.text }; }; From 91ed2ff627108f98cb7afdab5054a3e4c7df622f Mon Sep 17 00:00:00 2001 From: Shreyash Raj Date: Sat, 23 Oct 2021 17:16:13 +0530 Subject: [PATCH 2/3] Update - removed publish command yml from .github/workflows - Update in docs folder - Removed js-script - Updated extra.ts file - Defined a new type --- .github/workflows/npm-publish.yml | 47 -- docs/Captcha.html | 1226 +++++++++++++++++++++++++++++ docs/CaptchaGenerator.js.html | 2 +- docs/captcha.js.html | 15 +- docs/constants.js.html | 11 +- docs/extra.js.html | 49 +- docs/global.html | 240 +++++- js-script/CaptchaGenerator.d.ts | 131 --- js-script/CaptchaGenerator.js | 177 ----- js-script/captcha.d.ts | 61 -- js-script/captcha.js | 140 ---- js-script/constants.d.ts | 64 -- js-script/constants.js | 65 -- js-script/extra.d.ts | 35 - js-script/extra.js | 52 -- js-script/index.d.ts | 5 - js-script/index.js | 13 - js-script/util.d.ts | 3 - js-script/util.js | 31 - test.js | 10 - ts-script/constants.ts | 18 + ts-script/extra.ts | 13 +- 22 files changed, 1519 insertions(+), 889 deletions(-) delete mode 100644 .github/workflows/npm-publish.yml create mode 100644 docs/Captcha.html delete mode 100644 js-script/CaptchaGenerator.d.ts delete mode 100644 js-script/CaptchaGenerator.js delete mode 100644 js-script/captcha.d.ts delete mode 100644 js-script/captcha.js delete mode 100644 js-script/constants.d.ts delete mode 100644 js-script/constants.js delete mode 100644 js-script/extra.d.ts delete mode 100644 js-script/extra.js delete mode 100644 js-script/index.d.ts delete mode 100644 js-script/index.js delete mode 100644 js-script/util.d.ts delete mode 100644 js-script/util.js delete mode 100644 test.js diff --git a/.github/workflows/npm-publish.yml b/.github/workflows/npm-publish.yml deleted file mode 100644 index aa47c4e..0000000 --- a/.github/workflows/npm-publish.yml +++ /dev/null @@ -1,47 +0,0 @@ -# This workflow will run tests using node and then publish a package to GitHub Packages when a release is created -# For more information see: https://help.github.com/actions/language-and-framework-guides/publishing-nodejs-packages - -name: Node.js Package - -on: - release: - types: [created] - -jobs: - build: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v2 - - uses: actions/setup-node@v1 - with: - node-version: 12 - - run: npm ci - - run: npm test - - publish-npm: - needs: build - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v2 - - uses: actions/setup-node@v1 - with: - node-version: 12 - registry-url: https://registry.npmjs.org/ - - run: npm ci - - run: npm publish - env: - NODE_AUTH_TOKEN: ${{secrets.NPM_TOKEN}} - - publish-gpr: - needs: build - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v2 - - uses: actions/setup-node@v1 - with: - node-version: 12 - registry-url: https://npm.pkg.github.com/ - - run: npm ci - - run: npm publish - env: - NODE_AUTH_TOKEN: ${{secrets.GITHUB_TOKEN}} diff --git a/docs/Captcha.html b/docs/Captcha.html new file mode 100644 index 0000000..3a30fa3 --- /dev/null +++ b/docs/Captcha.html @@ -0,0 +1,1226 @@ + + + + + + + + Captcha + + + + + + + + + + + + + + + + + + + + +

+ + +
+
+ + + +
+
+
+ +
+
+
+

Class

+

Captcha

+
+ + + + + +
+ +
+ +

Captcha(widthopt, heightopt)

+ +

Captcha Generator

+ + +
+ +
+
+ + +
+
+
+
+ Constructor +
+ + + + +

+ # + + + + new Captcha(widthopt, heightopt) + + +

+ + + + +
+

Start captcha image creation.

+
+ + + + + + + + + + +
Parameters:
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeAttributesDescription
width + + +number + + + + + + <optional>
+ + + + + +

Width of captcha image.

height + + +number + + + + + + <optional>
+ + + + + +

Height of captcha image.

+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+ View Source + + captcha.js, line 10 + +

+ +
+ + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+ + + + + + + + + + + + + + +
+

Members

+
+ +
+ +

+ # + + + png + + +

+ + + + +
+

Get png image of captcha.

+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+ View Source + + captcha.js, line 43 + +

+ +
+ + + + + +
+ +
+ +

+ # + + + text + + +

+ + + + +
+

Get Captcha text.

+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+ View Source + + captcha.js, line 36 + +

+ +
+ + + + + +
+ +
+
+ + + +
+

Methods

+
+ +
+ + + +

+ # + + + + addDecoy(decoyOptionopt) → {Captcha} + + +

+ + + + +
+

Add decoy on your captcha image.

+
+ + + + + + + + + + +
Parameters:
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeAttributesDescription
decoyOption + + +SetDecoyOptions + + + + + + <optional>
+ + + + + +

Decoy option you want to customise

+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+ View Source + + captcha.js, line 61 + +

+ +
+ + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ + +
+ + +Captcha + + +
+ +
+ + +
+
+ + + + +
+ +
+ + + +

+ # + + + + drawCaptcha(captchaOptionopt) → {Captcha} + + +

+ + + + +
+

Draw captcha text on captcha image.

+
+ + + + + + + + + + +
Parameters:
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeAttributesDescription
captchaOption + + +SetCaptchaOptions + + + + + + <optional>
+ + + + + +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+ View Source + + captcha.js, line 102 + +

+ +
+ + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ + +
+ + +Captcha + + +
+ +
+ + +
+
+ + + + +
+ +
+ + + +

+ # + + + + drawImage(image) → {Captcha} + + +

+ + + + +
+

Draw image on your captcha.

+
+ + + + + + + + + + +
Parameters:
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
image + + +Image + + + +

Choose image you want to add.

+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+ View Source + + captcha.js, line 52 + +

+ +
+ + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ + +
+ + +Captcha + + +
+ +
+ + +
+
+ + + + +
+ +
+ + + +

+ # + + + + drawTrace(traceOptionopt) → {Captcha} + + +

+ + + + +
+

Draw trace line over your captcha.

+

Note: If you want to use custom text or change size of captcha text then drawCaptcha before drawTrace.

+
+ + + + + + + + + + +
Parameters:
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeAttributesDescription
traceOption + + +SetTraceOptions + + + + + + <optional>
+ + + + + +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+ View Source + + captcha.js, line 81 + +

+ +
+ + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ + +
+ + +Captcha + + +
+ +
+ + +
+
+ + + + +
+ +
+
+ + + + + +
+ +
+ + + + +
+ + + +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/docs/CaptchaGenerator.js.html b/docs/CaptchaGenerator.js.html index cdf2739..4f53136 100644 --- a/docs/CaptchaGenerator.js.html +++ b/docs/CaptchaGenerator.js.html @@ -110,7 +110,7 @@

CaptchaGenerator.js

this.captcha = constants_1.defaultCaptchaOption; this.trace = constants_1.defaultTraceOptions; this.decoy = constants_1.defaultDecoyOptions; - this.captcha.text = (0, util_1.randomText)(this.captcha.characters); + this.captcha.text = (0, util_1.randomText)(this.captcha.characters || 6); } /** * Get the text of captcha. diff --git a/docs/captcha.js.html b/docs/captcha.js.html index 42d544e..6b74fc5 100644 --- a/docs/captcha.js.html +++ b/docs/captcha.js.html @@ -125,7 +125,7 @@

captcha.js

} /** * Get png image of captcha. - * @returns {Buffer} Get png image of captcha created. + * @returns {Buffer | Promise<Buffer>} Get png image of captcha created. */ get png() { this._canvas.async = this.async; @@ -137,7 +137,7 @@

captcha.js

* @returns {Captcha} */ drawImage(image) { - this._ctx.drawImage(image, 0, 0); + this._ctx.drawImage(image, 0, 0, this._width, this._height); return this; } /** @@ -192,9 +192,9 @@

captcha.js

if (captchaOption.text) option.characters = captchaOption.text.length; if (!captchaOption.text && captchaOption.characters) - option.text = (0, util_1.randomText)(option.characters); + option.text = (0, util_1.randomText)(option.characters || 6); if (!option.text) - option.text = (0, util_1.randomText)(option.characters); + option.text = (0, util_1.randomText)(option.characters || 6); this._captcha = option; if (!this._coordinates[0]) this._coordinates = (0, util_1.getRandomCoordinate)(this._height, this._width, option.characters || 6); @@ -208,10 +208,10 @@

captcha.js

if (option.skew) { this._ctx.transform(1, Math.random(), (0, util_1.getRandom)(20) / 100, 1, 0, 0); } - if (option.rotate > 0) { + if (option.rotate && option.rotate > 0) { this._ctx.rotate((0, util_1.getRandom)(-option.rotate, option.rotate) * Math.PI / 180); } - if (((_a = option.colors) === null || _a === void 0 ? void 0 : _a.length) > 2) { + if (option.colors && ((_a = option.colors) === null || _a === void 0 ? void 0 : _a.length) > 2) { this._ctx.fillStyle = option.colors[(0, util_1.getRandom)(option.colors.length - 1)]; } this._ctx.fillText(option.text[n], 0, 0); @@ -220,6 +220,9 @@

captcha.js

; return this; } + toBuffer() { + this._canvas.toBuffer('png'); + } } exports.Captcha = Captcha; diff --git a/docs/constants.js.html b/docs/constants.js.html index a588f31..07e9330 100644 --- a/docs/constants.js.html +++ b/docs/constants.js.html @@ -87,7 +87,7 @@

constants.js

"use strict";
 Object.defineProperty(exports, "__esModule", { value: true });
-exports.defaultDimension = exports.defaultDecoyOptions = exports.defaultTraceOptions = exports.defaultCaptchaOption = void 0;
+exports.CreateCaptchaOptions = exports.defaultDimension = exports.defaultDecoyOptions = exports.defaultTraceOptions = exports.defaultCaptchaOption = void 0;
 ;
 ;
 ;
@@ -150,6 +150,15 @@ 

constants.js

height: 100, width: 300 }; +/** + * Create captcha options in functions. + * @typedef CreateCaptchaOptions + * @property {SetCaptchaOptions} [captcha] Captcha text options to customise text appearance and value. + * @property {SetDecoyOptions} [decoy] + * @property {SetTraceOptions} [trace] + * @property {Image} [background] + */ +exports.CreateCaptchaOptions = {};
diff --git a/docs/extra.js.html b/docs/extra.js.html index 47a2600..9d02d01 100644 --- a/docs/extra.js.html +++ b/docs/extra.js.html @@ -89,30 +89,25 @@

extra.js

Object.defineProperty(exports, "__esModule", { value: true }); exports.createCaptchaSync = exports.createCaptcha = void 0; const _1 = require("."); -const captchaValue = {}; /** * Create custom captcha from scratch. * @async * @param {number} width Width of captcha image. * @param {number} height Height of captcha image. - * @param {string} [text] Captcha text. + * @param {CreateCaptchaOptions} [option] Captcha text. * @returns */ -function createCaptcha(width, height, text) { +function createCaptcha(width, height, option = {}) { const captcha = new _1.Captcha(width, height); const decoyCount = Math.floor(width * height / 2500); - captcha.addDecoy({ - total: decoyCount, - opacity: 1 - }); - if (text) { - captcha.drawCaptcha({ text: text }); - } - else { - captcha.drawCaptcha(); - text = captcha.text; - } - captcha.drawTrace(); + if (!option.decoy) + option.decoy = {}; + if (!option.decoy.total) + option.decoy.total = decoyCount; + captcha.addDecoy(option.decoy); + captcha.drawCaptcha(option.captcha); + const text = captcha.text; + captcha.drawTrace(option.trace); captcha.addDecoy({ opacity: 1 }); return { image: captcha.png, text: captcha.text }; } @@ -122,25 +117,21 @@

extra.js

* Create captcha in sync mode. * @param {number} width captcha image width. * @param {number} height captcha image height. - * @param {string} [text] Captcha text. + * @param {CreateCaptchaOptions} [option] Captcha text. * @returns */ -function createCaptchaSync(width, height, text) { +function createCaptchaSync(width, height, option = {}) { const captcha = new _1.Captcha(width, height); const decoyCount = Math.floor(width * height / 2500); captcha.async = false; - captcha.addDecoy({ - total: decoyCount, - opacity: 1 - }); - if (text) { - captcha.drawCaptcha({ text: text }); - } - else { - captcha.drawCaptcha(); - text = captcha.text; - } - captcha.drawTrace(); + if (!option.decoy) + option.decoy = {}; + if (!option.decoy.total) + option.decoy.total = decoyCount; + captcha.addDecoy(option.decoy); + captcha.drawCaptcha(option.captcha); + const text = captcha.text; + captcha.drawTrace(option.trace); captcha.addDecoy({ opacity: 1 }); return { image: captcha.png, text: captcha.text }; } diff --git a/docs/global.html b/docs/global.html index 0b91d3b..ac8e81f 100644 --- a/docs/global.html +++ b/docs/global.html @@ -169,7 +169,7 @@

- createCaptcha(width, height, textopt) + createCaptcha(width, height, optionopt)

@@ -284,13 +284,13 @@
Parameters:
- text + option -string +CreateCaptchaOptions @@ -358,7 +358,7 @@
Parameters:

View Source - extra.js, line 14 + extra.js, line 13

@@ -410,7 +410,7 @@

- createCaptchaSync(width, height, textopt) + createCaptchaSync(width, height, optionopt)

@@ -525,13 +525,13 @@
Parameters:
- text + option -string +CreateCaptchaOptions @@ -599,7 +599,7 @@
Parameters:

View Source - extra.js, line 41 + extra.js, line 36

@@ -653,6 +653,230 @@

Type Definitions

+

+ # + + + CreateCaptchaOptions + + +

+ + + + +
+

Create captcha options in functions.

+
+ + + + + +
Properties:
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeAttributesDescription
captcha + + +SetCaptchaOptions + + + + + + <optional>
+ + + +

Captcha text options to customise text appearance and value.

decoy + + +SetDecoyOptions + + + + + + <optional>
+ + + +
trace + + +SetTraceOptions + + + + + + <optional>
+ + + +
background + + +Image + + + + + + <optional>
+ + + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+ View Source + + constants.js, line 66 + +

+ +
+ + + + + +
+ +
+

# diff --git a/js-script/CaptchaGenerator.d.ts b/js-script/CaptchaGenerator.d.ts deleted file mode 100644 index 7f17fe2..0000000 --- a/js-script/CaptchaGenerator.d.ts +++ /dev/null @@ -1,131 +0,0 @@ -/// -import { Image } from "skia-canvas"; -import { SetCaptchaOption, SetDecoyOption, SetTraceOption } from "./constants"; -/** - * Captcha generator class. - */ -export declare class CaptchaGenerator { - private height; - private width; - private captcha; - private trace; - private decoy; - private background?; - /** - * Initatiates the creation of captcha image generation. - * @example const captcha = new CaptchaGenerator({height: 200, width: 600}); - * @param {object} [options] Options for constructor. - * @param {integer} [options.height=100] Height of captcha image. - * @param {integer} [options.width=300] Width of captcha image. - * @since 2.0.0 - */ - constructor(options?: { - height: number; - width: number; - }); - /** - * Get the text of captcha. - * @type {string} - * @since 2.0.3 - */ - get text(): string | undefined; - /** - * set dimension for your captcha image - * @param {integer} height Height of captcha image. - * @param {integer} width Width of captcha image. - * @example - * const { CaptchaGenerator } = require("captcha-canvas"); - * const fs = require("fs") - * const captcha = new CaptchaGenerator(); - * captcha.setDimension(200, 600); - * const buffer = await captcha.generate() //generate image - * - * fs.writeFileSync("image.png", buffer) - * @since 2.0.0 - */ - setDimension(height: number, width: number): CaptchaGenerator; - /** - * Set background for captcha image. - * @param {buffer} image Buffer/url/path of image. - * @example - * const { CaptchaGenerator } = require("captcha-canvas"); - * const fs = require("fs") - * const captcha = new CaptchaGenerator(); - * captcha.setBackground("./path/toFile"); - * const buffer = await captcha.generate() //generate image - * - * fs.writeFileSync("image.png", buffer) - * @since 2.0.0 - */ - setBackground(image: string | Buffer): this; - /** - * Change captcha text options - * @param {SetCaptchaOptions} options Captcha appearance options. - * @example - * const { CaptchaGenerator } = require("captcha-canvas"); - * const fs = require("fs") - * const captcha = new CaptchaGenerator(); - * const options = {font: "Comic Sans", size: 60} - * captcha.setCaptcha(options) - * const buffer = await captcha.generate() //generate image - * - * fs.writeFileSync("image.png", buffer) - * @since 2.0.0 - */ - setCaptcha(option: SetCaptchaOption): this; - /** - * Change trace creation options. - * @param {SetTraceOptions} options Trace Line appearance options. - * @example - * const { CaptchaGenerator } = require("captcha-canvas"); - * const fs = require("fs") - * const captcha = new CaptchaGenerator(); - * const options = {size: 5, color: "deeppink"} - * captcha.setTrace(options) - * const buffer = await captcha.generate() //generate image - * - * fs.writeFileSync("image.png", buffer) - * @since 2.0.0 - */ - setTrace(option: SetTraceOption): this; - /** - * Change decoy options - * @param {SetDecoyOptions} options Decoy characters customisation options - * @since 2.0.0 - */ - setDecoy(option: SetDecoyOption): this; - /** - * Method which returns image buffer - * @async - * @returns {Promise} - * @example - * const { CaptchaGenerator } = require("captcha-canvas"); - * const fs = require("fs") - * const captcha = new CaptchaGenerator(); - * const buffer = await captcha.generate() //generate image - * - * fs.writeFileSync("image.png", buffer) - * @since 2.0.0 - */ - generate(): Promise; - /** - * Non asynchronous method to generate captcha image. - * > Note: It do not use `setBackground` method value for background image. If you want to set background - * and also use generateSync method then use background option in genrateSync method. - * @param {object} [options] Options to add extra values - * @param {Image} [options.background] Add background image. - * @example - * const { CaptchaGenerator, resolveImage } = require("captcha-canvas"); - * const fs = require("fs"); - * const img = await resolveImage("./path/to/file"); - * - * const captcha = new CaptchaGenerator() - * .generateSync({background: img}); - * - * fs.writeFileSync("image.png", captcha); - * @since 2.2.0 - */ - generateSync(option?: { - background?: Image; - }): Buffer; -} diff --git a/js-script/CaptchaGenerator.js b/js-script/CaptchaGenerator.js deleted file mode 100644 index 54563fa..0000000 --- a/js-script/CaptchaGenerator.js +++ /dev/null @@ -1,177 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.CaptchaGenerator = void 0; -const skia_canvas_1 = require("skia-canvas"); -const _1 = require("."); -const constants_1 = require("./constants"); -const util_1 = require("./util"); -/** - * Captcha generator class. - */ -class CaptchaGenerator { - /** - * Initatiates the creation of captcha image generation. - * @example const captcha = new CaptchaGenerator({height: 200, width: 600}); - * @param {object} [options] Options for constructor. - * @param {integer} [options.height=100] Height of captcha image. - * @param {integer} [options.width=300] Width of captcha image. - * @since 2.0.0 - */ - constructor(options = { height: 100, width: 300 }) { - this.height = options.height; - this.width = options.width; - this.captcha = constants_1.defaultCaptchaOption; - this.trace = constants_1.defaultTraceOptions; - this.decoy = constants_1.defaultDecoyOptions; - this.captcha.text = (0, util_1.randomText)(this.captcha.characters || 6); - } - /** - * Get the text of captcha. - * @type {string} - * @since 2.0.3 - */ - get text() { - return this.captcha.text; - } - /** - * set dimension for your captcha image - * @param {integer} height Height of captcha image. - * @param {integer} width Width of captcha image. - * @example - * const { CaptchaGenerator } = require("captcha-canvas"); - * const fs = require("fs") - * const captcha = new CaptchaGenerator(); - * captcha.setDimension(200, 600); - * const buffer = await captcha.generate() //generate image - * - * fs.writeFileSync("image.png", buffer) - * @since 2.0.0 - */ - setDimension(height, width) { - this.height = height; - this.width = width; - return this; - } - /** - * Set background for captcha image. - * @param {buffer} image Buffer/url/path of image. - * @example - * const { CaptchaGenerator } = require("captcha-canvas"); - * const fs = require("fs") - * const captcha = new CaptchaGenerator(); - * captcha.setBackground("./path/toFile"); - * const buffer = await captcha.generate() //generate image - * - * fs.writeFileSync("image.png", buffer) - * @since 2.0.0 - */ - setBackground(image) { - this.background = image; - return this; - } - /** - * Change captcha text options - * @param {SetCaptchaOptions} options Captcha appearance options. - * @example - * const { CaptchaGenerator } = require("captcha-canvas"); - * const fs = require("fs") - * const captcha = new CaptchaGenerator(); - * const options = {font: "Comic Sans", size: 60} - * captcha.setCaptcha(options) - * const buffer = await captcha.generate() //generate image - * - * fs.writeFileSync("image.png", buffer) - * @since 2.0.0 - */ - setCaptcha(option) { - this.captcha = { ...this.captcha, ...option }; - if (option.text) - this.captcha.characters = option.text.length; - if (!option.text && option.characters) - this.captcha.text = (0, util_1.randomText)(option.characters); - return this; - } - /** - * Change trace creation options. - * @param {SetTraceOptions} options Trace Line appearance options. - * @example - * const { CaptchaGenerator } = require("captcha-canvas"); - * const fs = require("fs") - * const captcha = new CaptchaGenerator(); - * const options = {size: 5, color: "deeppink"} - * captcha.setTrace(options) - * const buffer = await captcha.generate() //generate image - * - * fs.writeFileSync("image.png", buffer) - * @since 2.0.0 - */ - setTrace(option) { - this.trace = { ...this.trace, ...option }; - return this; - } - /** - * Change decoy options - * @param {SetDecoyOptions} options Decoy characters customisation options - * @since 2.0.0 - */ - setDecoy(option) { - this.decoy = { ...this.decoy, ...option }; - return this; - } - /** - * Method which returns image buffer - * @async - * @returns {Promise} - * @example - * const { CaptchaGenerator } = require("captcha-canvas"); - * const fs = require("fs") - * const captcha = new CaptchaGenerator(); - * const buffer = await captcha.generate() //generate image - * - * fs.writeFileSync("image.png", buffer) - * @since 2.0.0 - */ - async generate() { - const captchaCanvas = new _1.Captcha(this.width, this.height); - if (this.background) - captchaCanvas.drawImage(await (0, skia_canvas_1.loadImage)(this.background)); - if (this.decoy.opacity) - captchaCanvas.addDecoy(this.decoy); - if (this.captcha.opacity) - captchaCanvas.drawCaptcha(this.captcha); - if (this.trace.opacity) - captchaCanvas.drawTrace(this.trace); - return captchaCanvas.png; - } - /** - * Non asynchronous method to generate captcha image. - * > Note: It do not use `setBackground` method value for background image. If you want to set background - * and also use generateSync method then use background option in genrateSync method. - * @param {object} [options] Options to add extra values - * @param {Image} [options.background] Add background image. - * @example - * const { CaptchaGenerator, resolveImage } = require("captcha-canvas"); - * const fs = require("fs"); - * const img = await resolveImage("./path/to/file"); - * - * const captcha = new CaptchaGenerator() - * .generateSync({background: img}); - * - * fs.writeFileSync("image.png", captcha); - * @since 2.2.0 - */ - generateSync(option = {}) { - const captchaCanvas = new _1.Captcha(this.width, this.height); - captchaCanvas.async = false; - if (option.background) - captchaCanvas.drawImage(option.background); - if (this.decoy.opacity) - captchaCanvas.addDecoy(this.decoy); - if (this.captcha.opacity) - captchaCanvas.drawCaptcha(this.captcha); - if (this.trace.opacity) - captchaCanvas.drawTrace(this.trace); - return captchaCanvas.png; - } -} -exports.CaptchaGenerator = CaptchaGenerator; diff --git a/js-script/captcha.d.ts b/js-script/captcha.d.ts deleted file mode 100644 index 01518ca..0000000 --- a/js-script/captcha.d.ts +++ /dev/null @@ -1,61 +0,0 @@ -/// -import { Canvas, CanvasRenderingContext2D, Image } from "skia-canvas"; -import { SetCaptchaOption, SetDecoyOption, SetTraceOption } from "./constants"; -/** - * Captcha Generator - */ -export declare class Captcha { - protected _height: number; - protected _width: number; - protected _captcha: SetCaptchaOption; - protected _trace: SetTraceOption; - protected _decoy: SetDecoyOption; - protected _canvas: Canvas; - protected _ctx: CanvasRenderingContext2D; - protected _coordinates: number[][]; - async: Boolean; - /** - * Start captcha image creation. - * @param {number} [width] Width of captcha image. - * @param {number} [height] Height of captcha image. - * @constructor - */ - constructor(width?: number, height?: number); - /** - * Get Captcha text. - * @returns {string} Get captcha text. - */ - get text(): string; - /** - * Get png image of captcha. - * @returns {Buffer | Promise} Get png image of captcha created. - */ - get png(): Buffer | Promise; - /** - * Draw image on your captcha. - * @param {Image} image Choose image you want to add. - * @returns {Captcha} - */ - drawImage(image: Image): Captcha; - /** - * Add decoy on your captcha image. - * @param {SetDecoyOptions} [decoyOption] Decoy option you want to customise - * @returns {Captcha} - */ - addDecoy(decoyOption?: SetDecoyOption): Captcha; - /** - * Draw trace line over your captcha. - * - * Note: If you want to use custom text or change size of captcha text then drawCaptcha before drawTrace. - * @param {SetTraceOptions} [traceOption] - * @returns {Captcha} - */ - drawTrace(traceOption?: SetTraceOption): Captcha; - /** - * Draw captcha text on captcha image. - * @param {SetCaptchaOptions} [captchaOption] - * @returns {Captcha} - */ - drawCaptcha(captchaOption?: SetCaptchaOption): Captcha; - toBuffer(): void; -} diff --git a/js-script/captcha.js b/js-script/captcha.js deleted file mode 100644 index ba2ee52..0000000 --- a/js-script/captcha.js +++ /dev/null @@ -1,140 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.Captcha = void 0; -const skia_canvas_1 = require("skia-canvas"); -const constants_1 = require("./constants"); -const util_1 = require("./util"); -/** - * Captcha Generator - */ -class Captcha { - /** - * Start captcha image creation. - * @param {number} [width] Width of captcha image. - * @param {number} [height] Height of captcha image. - * @constructor - */ - constructor(width = constants_1.defaultDimension.width, height = constants_1.defaultDimension.height) { - this._height = height; - this._width = width; - this._captcha = constants_1.defaultCaptchaOption; - this._trace = constants_1.defaultTraceOptions; - this._decoy = constants_1.defaultDecoyOptions; - const canvas = new skia_canvas_1.Canvas(width, height); - const ctx = canvas.getContext('2d'); - ctx.lineJoin = 'miter'; - ctx.textBaseline = 'middle'; - this._canvas = canvas; - this._ctx = ctx; - this.async = true; - this._coordinates = []; - } - /** - * Get Captcha text. - * @returns {string} Get captcha text. - */ - get text() { - return this._captcha.text || ""; - } - /** - * Get png image of captcha. - * @returns {Buffer | Promise} Get png image of captcha created. - */ - get png() { - this._canvas.async = this.async; - return this._canvas.png; - } - /** - * Draw image on your captcha. - * @param {Image} image Choose image you want to add. - * @returns {Captcha} - */ - drawImage(image) { - this._ctx.drawImage(image, 0, 0, this._width, this._height); - return this; - } - /** - * Add decoy on your captcha image. - * @param {SetDecoyOptions} [decoyOption] Decoy option you want to customise - * @returns {Captcha} - */ - addDecoy(decoyOption = {}) { - const option = { ...this._decoy, ...decoyOption }; - if (!option.total) - option.total = Math.floor(this._width * this._height / 10000); - const decoyText = (0, util_1.randomText)(option.total); - this._ctx.font = `${option.size}px ${option.font}`; - this._ctx.globalAlpha = option.opacity; - this._ctx.fillStyle = option.color; - for (let i = 0; i < decoyText.length; i++) { - this._ctx.fillText(decoyText[i], (0, util_1.getRandom)(30, this._width - 30), (0, util_1.getRandom)(30, this._height - 30)); - } - return this; - } - /** - * Draw trace line over your captcha. - * - * Note: If you want to use custom text or change size of captcha text then drawCaptcha before drawTrace. - * @param {SetTraceOptions} [traceOption] - * @returns {Captcha} - */ - drawTrace(traceOption = {}) { - const option = { ...this._trace, ...traceOption }; - if (!this._coordinates[0]) - this._coordinates = (0, util_1.getRandomCoordinate)(this._height, this._width, this._captcha.characters || 6); - const coordinates = this._coordinates; - this._ctx.strokeStyle = option.color; - this._ctx.globalAlpha = option.opacity; - this._ctx.beginPath(); - this._ctx.moveTo(coordinates[0][0], coordinates[0][1]); - this._ctx.lineWidth = option.size; - for (let i = 1; i < coordinates.length; i++) { - this._ctx.lineTo(coordinates[i][0], coordinates[i][1]); - } - this._ctx.stroke(); - return this; - } - /** - * Draw captcha text on captcha image. - * @param {SetCaptchaOptions} [captchaOption] - * @returns {Captcha} - */ - drawCaptcha(captchaOption = {}) { - var _a; - const option = { ...this._captcha, ...captchaOption }; - if (captchaOption.text) - option.characters = captchaOption.text.length; - if (!captchaOption.text && captchaOption.characters) - option.text = (0, util_1.randomText)(option.characters || 6); - if (!option.text) - option.text = (0, util_1.randomText)(option.characters || 6); - this._captcha = option; - if (!this._coordinates[0]) - this._coordinates = (0, util_1.getRandomCoordinate)(this._height, this._width, option.characters || 6); - const coordinates = this._coordinates; - this._ctx.font = `${option.size}px ${option.font}`; - this._ctx.globalAlpha = option.opacity; - this._ctx.fillStyle = option.color; - for (let n = 0; n < coordinates.length; n++) { - this._ctx.save(); - this._ctx.translate(coordinates[n][0], coordinates[n][1]); - if (option.skew) { - this._ctx.transform(1, Math.random(), (0, util_1.getRandom)(20) / 100, 1, 0, 0); - } - if (option.rotate && option.rotate > 0) { - this._ctx.rotate((0, util_1.getRandom)(-option.rotate, option.rotate) * Math.PI / 180); - } - if (option.colors && ((_a = option.colors) === null || _a === void 0 ? void 0 : _a.length) > 2) { - this._ctx.fillStyle = option.colors[(0, util_1.getRandom)(option.colors.length - 1)]; - } - this._ctx.fillText(option.text[n], 0, 0); - this._ctx.restore(); - } - ; - return this; - } - toBuffer() { - this._canvas.toBuffer('png'); - } -} -exports.Captcha = Captcha; diff --git a/js-script/constants.d.ts b/js-script/constants.d.ts deleted file mode 100644 index acb8077..0000000 --- a/js-script/constants.d.ts +++ /dev/null @@ -1,64 +0,0 @@ -export interface SetDimensionOption { - height: number; - width: number; -} -export interface SetCaptchaOption { - characters?: number; - text?: string; - color?: string; - font?: string; - skew?: boolean; - colors?: string[] | []; - rotate?: number; - size?: number; - opacity?: number; -} -export interface SetDecoyOption { - color?: string; - font?: string; - size?: number; - opacity?: number; - total?: number; -} -export interface SetTraceOption { - color?: string; - size?: number; - opacity?: number; -} -/** - * Captcha text options to customise text appearance and value. - * @typedef SetCaptchaOptions - * @property {integer} [characters=6] Length of captcha text. - * @property {string} [text="Random UpperCase string"] Text of captcha - * @property {hexCode} [color="#32cf7e"] Color of captcha text. - * @property {font} [font="Sans"] Font of captcha text. - * @property {boolean} [skew=true] Skew captcha text. - * @property {array} [colors=[]] Array of hexCode will override color property. - * @property {number} [rotate=5] Range of angle to rotate text. - * @property {number} [size=40] Size of captcha text. - * @property {float} [opacity=1] Opcaity of captcha text. - */ -export declare const defaultCaptchaOption: SetCaptchaOption; -/** - * @typedef SetTraceOptions - * @property {hexCode} [color="#32cf7e"] Color of trace line. - * @property {number} [size=3] Width of trace line. - * @property {float} [opacity=1] Opacoty of trace line. - */ -export declare const defaultTraceOptions: SetTraceOption; -/** - * @typedef SetDecoyOptions - * @property {hexCode} [color="#646566"] Color of decoy characters. - * @property {font} [font="Sans"] Font of decoy characters. - * @property {number} [size=20] Size of decoy characters. - * @property {float} [opacity=0.8] Opacity of decoy characters. - * @property {number} [total] Total count of decoy characters. - */ -export declare const defaultDecoyOptions: SetDecoyOption; -/** - * Customise dimension of captcha image. - * @typedef SetDimensionOption - * @property {integer} [height=100] Height of captcha image. - * @property {integer} [width=300] Width of captcha image. - */ -export declare const defaultDimension: SetDimensionOption; diff --git a/js-script/constants.js b/js-script/constants.js deleted file mode 100644 index 63b39a5..0000000 --- a/js-script/constants.js +++ /dev/null @@ -1,65 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.defaultDimension = exports.defaultDecoyOptions = exports.defaultTraceOptions = exports.defaultCaptchaOption = void 0; -; -; -; -; -/** - * Captcha text options to customise text appearance and value. - * @typedef SetCaptchaOptions - * @property {integer} [characters=6] Length of captcha text. - * @property {string} [text="Random UpperCase string"] Text of captcha - * @property {hexCode} [color="#32cf7e"] Color of captcha text. - * @property {font} [font="Sans"] Font of captcha text. - * @property {boolean} [skew=true] Skew captcha text. - * @property {array} [colors=[]] Array of hexCode will override color property. - * @property {number} [rotate=5] Range of angle to rotate text. - * @property {number} [size=40] Size of captcha text. - * @property {float} [opacity=1] Opcaity of captcha text. - */ -exports.defaultCaptchaOption = { - characters: 6, - size: 40, - font: 'Sans', - skew: true, - colors: [], - rotate: 5, - color: '#32cf7e', - opacity: 0.8, -}; -/** - * @typedef SetTraceOptions - * @property {hexCode} [color="#32cf7e"] Color of trace line. - * @property {number} [size=3] Width of trace line. - * @property {float} [opacity=1] Opacoty of trace line. - */ -exports.defaultTraceOptions = { - size: 3, - color: '#32cf7e', - opacity: 1, -}; -/** - * @typedef SetDecoyOptions - * @property {hexCode} [color="#646566"] Color of decoy characters. - * @property {font} [font="Sans"] Font of decoy characters. - * @property {number} [size=20] Size of decoy characters. - * @property {float} [opacity=0.8] Opacity of decoy characters. - * @property {number} [total] Total count of decoy characters. - */ -exports.defaultDecoyOptions = { - color: '#646566', - font: 'Sans', - size: 20, - opacity: 0.8, -}; -/** - * Customise dimension of captcha image. - * @typedef SetDimensionOption - * @property {integer} [height=100] Height of captcha image. - * @property {integer} [width=300] Width of captcha image. - */ -exports.defaultDimension = { - height: 100, - width: 300 -}; diff --git a/js-script/extra.d.ts b/js-script/extra.d.ts deleted file mode 100644 index 72cd062..0000000 --- a/js-script/extra.d.ts +++ /dev/null @@ -1,35 +0,0 @@ -/// -import { Image } from "skia-canvas"; -import { SetCaptchaOption, SetDecoyOption, SetTraceOption } from "./constants"; -interface captchaValueSync { - image: Buffer; - text: string; -} -interface captchaValue { - image: Promise; - text: string; -} -interface CreateCaptchaOptions { - captcha?: SetCaptchaOption; - trace?: SetTraceOption; - decoy?: SetDecoyOption; - background?: Image; -} -/** - * Create custom captcha from scratch. - * @async - * @param {number} width Width of captcha image. - * @param {number} height Height of captcha image. - * @param {string} [text] Captcha text. - * @returns - */ -export declare function createCaptcha(width: number, height: number, option?: CreateCaptchaOptions): captchaValue; -/** - * Create captcha in sync mode. - * @param {number} width captcha image width. - * @param {number} height captcha image height. - * @param {CreateCaptchaOptions} [option] Captcha text. - * @returns - */ -export declare function createCaptchaSync(width: number, height: number, option?: CreateCaptchaOptions): captchaValueSync; -export {}; diff --git a/js-script/extra.js b/js-script/extra.js deleted file mode 100644 index c6108d9..0000000 --- a/js-script/extra.js +++ /dev/null @@ -1,52 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.createCaptchaSync = exports.createCaptcha = void 0; -const _1 = require("."); -/** - * Create custom captcha from scratch. - * @async - * @param {number} width Width of captcha image. - * @param {number} height Height of captcha image. - * @param {string} [text] Captcha text. - * @returns - */ -function createCaptcha(width, height, option = {}) { - const captcha = new _1.Captcha(width, height); - const decoyCount = Math.floor(width * height / 2500); - if (!option.decoy) - option.decoy = {}; - if (!option.decoy.total) - option.decoy.total = decoyCount; - captcha.addDecoy(option.decoy); - captcha.drawCaptcha(option.captcha); - const text = captcha.text; - captcha.drawTrace(option.trace); - captcha.addDecoy({ opacity: 1 }); - return { image: captcha.png, text: captcha.text }; -} -exports.createCaptcha = createCaptcha; -; -/** - * Create captcha in sync mode. - * @param {number} width captcha image width. - * @param {number} height captcha image height. - * @param {CreateCaptchaOptions} [option] Captcha text. - * @returns - */ -function createCaptchaSync(width, height, option = {}) { - const captcha = new _1.Captcha(width, height); - const decoyCount = Math.floor(width * height / 2500); - captcha.async = false; - if (!option.decoy) - option.decoy = {}; - if (!option.decoy.total) - option.decoy.total = decoyCount; - captcha.addDecoy(option.decoy); - captcha.drawCaptcha(option.captcha); - const text = captcha.text; - captcha.drawTrace(option.trace); - captcha.addDecoy({ opacity: 1 }); - return { image: captcha.png, text: captcha.text }; -} -exports.createCaptchaSync = createCaptchaSync; -; diff --git a/js-script/index.d.ts b/js-script/index.d.ts deleted file mode 100644 index f81c149..0000000 --- a/js-script/index.d.ts +++ /dev/null @@ -1,5 +0,0 @@ -export { createCaptcha, createCaptchaSync } from "./extra"; -export { loadImage as resolveImage } from "skia-canvas"; -export { Captcha } from "./captcha"; -export { CaptchaGenerator } from "./CaptchaGenerator"; -export declare const version: string; diff --git a/js-script/index.js b/js-script/index.js deleted file mode 100644 index b8df6f4..0000000 --- a/js-script/index.js +++ /dev/null @@ -1,13 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.version = exports.CaptchaGenerator = exports.Captcha = exports.resolveImage = exports.createCaptchaSync = exports.createCaptcha = void 0; -var extra_1 = require("./extra"); -Object.defineProperty(exports, "createCaptcha", { enumerable: true, get: function () { return extra_1.createCaptcha; } }); -Object.defineProperty(exports, "createCaptchaSync", { enumerable: true, get: function () { return extra_1.createCaptchaSync; } }); -var skia_canvas_1 = require("skia-canvas"); -Object.defineProperty(exports, "resolveImage", { enumerable: true, get: function () { return skia_canvas_1.loadImage; } }); -var captcha_1 = require("./captcha"); -Object.defineProperty(exports, "Captcha", { enumerable: true, get: function () { return captcha_1.Captcha; } }); -var CaptchaGenerator_1 = require("./CaptchaGenerator"); -Object.defineProperty(exports, "CaptchaGenerator", { enumerable: true, get: function () { return CaptchaGenerator_1.CaptchaGenerator; } }); -exports.version = require(`${__dirname}/../package.json`).version; diff --git a/js-script/util.d.ts b/js-script/util.d.ts deleted file mode 100644 index 9709291..0000000 --- a/js-script/util.d.ts +++ /dev/null @@ -1,3 +0,0 @@ -export declare function getRandom(start?: number, end?: number): number; -export declare function randomText(characters: number): string; -export declare function getRandomCoordinate(height: number, width: number, size: number): number[][]; diff --git a/js-script/util.js b/js-script/util.js deleted file mode 100644 index 12c2689..0000000 --- a/js-script/util.js +++ /dev/null @@ -1,31 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.getRandomCoordinate = exports.randomText = exports.getRandom = void 0; -const crypto_1 = require("crypto"); -function getRandom(start = 0, end = 0) { - return Math.round(Math.random() * Math.abs(end - start)) + Math.min(start, end); -} -exports.getRandom = getRandom; -; -function randomText(characters) { - return (0, crypto_1.randomBytes)(characters).toString('hex').toUpperCase().substr(0, characters); -} -exports.randomText = randomText; -; -function getRandomCoordinate(height, width, size) { - let coordinates = []; - for (let i = 0; i < size; i++) { - const widthGap = Math.floor(width / size); - const coordinate = []; - const randomWidth = widthGap * (i + 0.2); - coordinate.push(randomWidth); - const randomHeight = getRandom(30, height - 30); - coordinate.push(randomHeight); - coordinates.push(coordinate); - } - ; - coordinates = coordinates.sort((a, b) => a[0] - b[0]); - return coordinates; -} -exports.getRandomCoordinate = getRandomCoordinate; -; diff --git a/test.js b/test.js deleted file mode 100644 index 7b9ee0d..0000000 --- a/test.js +++ /dev/null @@ -1,10 +0,0 @@ -const { writeFileSync } = require('fs'); -const { createCaptchaSync } = require('./js-script/extra'); - -const captcha = createCaptchaSync(900, 300, { - captcha: { - size: 80, - }, -}); - -writeFileSync('assets/captcha/default.png', captcha.image); \ No newline at end of file diff --git a/ts-script/constants.ts b/ts-script/constants.ts index cbc480e..dd30c19 100644 --- a/ts-script/constants.ts +++ b/ts-script/constants.ts @@ -1,3 +1,5 @@ +import { Image } from "skia-canvas"; + export interface SetDimensionOption { height: number; width: number; @@ -28,6 +30,13 @@ export interface SetTraceOption { size?: number; opacity?: number; }; + +export interface CreateCaptchaOptions { + captcha?: SetCaptchaOption; + trace?: SetTraceOption; + decoy?: SetDecoyOption; + background?: Image; +} /** * Captcha text options to customise text appearance and value. * @typedef SetCaptchaOptions @@ -86,3 +95,12 @@ export const defaultDimension: SetDimensionOption = { height: 100, width: 300 }; +/** + * Create captcha options in functions. + * @typedef CreateCaptchaOptions + * @property {SetCaptchaOptions} [captcha] Captcha text options to customise text appearance and value. + * @property {SetDecoyOptions} [decoy] + * @property {SetTraceOptions} [trace] + * @property {Image} [background] + */ +export const CreateCaptchaOptions = {}; \ No newline at end of file diff --git a/ts-script/extra.ts b/ts-script/extra.ts index d5e1ee6..05388b1 100644 --- a/ts-script/extra.ts +++ b/ts-script/extra.ts @@ -1,6 +1,5 @@ -import { Image } from "skia-canvas"; import { Captcha } from "."; -import { SetCaptchaOption, SetDecoyOption, SetTraceOption } from "./constants"; +import { CreateCaptchaOptions } from "./constants"; interface captchaValueSync { image: Buffer, @@ -12,18 +11,12 @@ interface captchaValue { text: string } -interface CreateCaptchaOptions { - captcha?: SetCaptchaOption; - trace?: SetTraceOption; - decoy?: SetDecoyOption; - background?: Image; -} /** * Create custom captcha from scratch. * @async * @param {number} width Width of captcha image. * @param {number} height Height of captcha image. - * @param {string} [text] Captcha text. + * @param {CreateCaptchaOptions} [option] Captcha text. * @returns */ export function createCaptcha(width: number, height: number, option: CreateCaptchaOptions = {}): captchaValue { @@ -49,7 +42,7 @@ export function createCaptcha(width: number, height: number, option: CreateCaptc * Create captcha in sync mode. * @param {number} width captcha image width. * @param {number} height captcha image height. - * @param {CreateCaptchaOptions} [option] Captcha text. + * @param {CreateCaptchaOptions} [option] Captcha text. * @returns */ export function createCaptchaSync(width: number, height: number, option: CreateCaptchaOptions = {}): captchaValueSync { From da6da1b17344264720883b6e3ad3a336e1fe4898 Mon Sep 17 00:00:00 2001 From: Shreyash Raj Date: Sat, 23 Oct 2021 17:27:52 +0530 Subject: [PATCH 3/3] removed unused var and updated example --- examples/all.png | Bin 12568 -> 12625 bytes examples/captcha.png | Bin 13207 -> 13741 bytes examples/default.png | Bin 6487 -> 6063 bytes examples/dimension.png | Bin 12575 -> 10885 bytes ts-script/extra.ts | 1 - 5 files changed, 1 deletion(-) diff --git a/examples/all.png b/examples/all.png index b9d911404bc115f8d5279edc965a4ac8368db108..716f88d09e22633dd0c0b0d1d1fd4ffec8b7399e 100644 GIT binary patch literal 12625 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

pfS~@m- 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 MGAf`7sgJ?`2Oc$Rv;Y7A diff --git a/examples/captcha.png b/examples/captcha.png index b5af094bf2ab43ea3dc57d4165c4e14bb032c824..ef1f0bb5dffa8086686a7849ec3335b86ec2a641 100644 GIT binary patch literal 13741 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 TPZ!YVuK;pVN|Kf0#=-vw<25m) literal 13207 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 KSt)K5`2PS%fnmD< diff --git a/examples/default.png b/examples/default.png index e6e0ec8e12cd7b8c00050b972f335618e059b618..466b3229bb4bce1201c2cb147d42aef11d86fc76 100644 GIT binary patch literal 6063 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 JS|ywC{{!qVVs-!k literal 6487 zcmbt(~3?d+PGt$zHv@{6PIK)sR-OWgMgLDp!^fSEg zhvyG?t`FBazbnt#XYaMw+9yg!Ta^Gn13*DRAy8LS(nUc*w9G%{RsGyJ?*_CJNjds5FTy~tXD~RH|zdkMp1hDSplJzrqA-?YBOR>XWr56n~HR zc;ciHYSk8Me}%*`=3{ZSQQ^$?D|d$sg3QA)suOCN<1w3e;;Q`!-<^m5EKSb+a(xl! z=r3PHbg#RL{hyouE_sJ#)QE0=*%Ok*8K!MNxn{ZZIqa^VoU)|j0oq@#WK4!-#5&!? zUh4g21vM)*+Cw(Tq(kstb3xm=~BA=Zf!56OG3bHTuj0$4%{CXOG(HrzdSdMft!tK3`keXW<4m zeh~puSm+nM%vf*-y%deuauplt)^IdS16$~*-57Wnu~V`czfes%xdmk@Z@oe>kd9a{ zTCcjf+bH{6;;;n!#h=Hc5B5ce9lnv#u6h~ANu=&98#rCYbY4V>0^ctt_N`A_dc1cH zIjsD=uKO@t?UXnve5j84{48LDwI0FliaDV8lX{v^D0YsvwdXfP+*rHU{psuz!dPmd zj@t=lAY_MWFRTF0uf5hl0oK_4>8j~WT=IVZHxI^`wt2PF^yHi}wqDBk|0Wwd*A6GN zcz1yhd_Y0t(pl(}A-zdmZ3Nvp9?!drt#kpMraO4L-;^1c5;Xk*R^->}SK*0qN~UU`F27R%WRE$B6PIV8Z%S_Q zYAo7zF^@b^Ic2{cql6~De2;dRl6wuM%76d6hGdE%$+NvN2jd&{)J&*bMahIry6W=x z4Ef+XrsS#lK7zp6z;IMlYVrn~Gf90c<mB*f|eIP5;#A;5qvq6Fk>;^%)zGW zIPrVur@=pqvrldulb{e%;cv6k>2R@#^aOqlp#SwlhcF|YY=s#@$rLJ2vkf5x$g*)s zl-fKB-@kU+^`)R;d4Y^uMDV z(R3f4&li~!Cfef=pE^edME#lZz0P^*k)l1Roij}}ztsd^PR1HHcLb=(Zpq94gj&f1 zM@ZYB+n)RZbCa+&I>P!&NW~vLF+jASBuBEQ*ro24kY5~g&t?c8eo8`EL5}x!@&Kf2CRc+eyBZtbL1|-vKtchb&Tp_(w@4IXsn4JaIv)9q#?v89EbV@@HIfcXCb2V|hQnp} ztDsEt*#J_p(Gje)iq7?P4BmM^7qO~-3~Ev?1OMa~Va{qk(u>i(Z^n(zJr>v%*20U4 z?>rN2u2stxPKWqVs1f%*d(dY`#yEO7wY$D5*o|a+lgsf5 z&y!leTSlq9wCfw-m!?iv%3<%&%cXHfIR^RhC#6q zC}*B0TWb!szng)S@cN+lf1W7z{ALevIm=NaD{K!VIoQY$IRdCMft;pm?Fhc~#B;tx zle^rHWVpLXW}~k4a5SST|B`EaIFmqd^3}zEl8eSl-Fv4~Avmc*rN1v@dVH{<%HlL{+=-7) z2t6)KavPIMtrYpO=6f}SXNh}-&7pX*NLVuBvc)%l<4pORdg#v?vO6OtH?%|1v-97+ z57ooQ$0MRvXrSY=3&`#t40!xQZm>c$>CbRKFma~^M@!Fd_in9q#mlzf+Jw2P50fQ) zOSWToSBLZGA&qTMFy4Ue{NA0+N5E#zy@$c0Z7J(zKh*qsbtUsy`1}VC>HE>l!FalW zn=&lIsRIoeGo?$xt*?kYpVbF@yqOyZ_)pVj(Sw}!77i!b&}qV*Uh?URM!fl5pH1eS zirvU;xyzHUXFoDr92e^L1j@cDh8^AA-nI$PUSE?eBT#QL)%;H?b0`V|l6SrSF?{l0 zK1D=AjxrpgSw1CBYve^l**)hhlje`*e9E|Fx>Pxk)I5O@bx)4ySF@koo|yWLdf(pA zNjFE(Dh3$yRj0=sW%?O$#m_P<#tc0arRLVkupD&H9ADqhfskH14PNaI(=xp@3~Zz* zvkbV@`-Y4?4IEyw$drBX-q5*<2F!wNQf^~C`%sh+V6tS?-^^r0u7Zp7)W?HNTX?gX!4nc=+VbB2#fH}=oU z|D^PX76o!Oac}c+I$f@1Y@RCi7>meDe_f9e0h~N(S9W(14v(Z8{70a2gc`&Jc8bn< z_wRe*>>cdQGMlKZ@U)a++^IJ-ifx}x(ET$zxY4a){9Vb`MyD!Q` z$FMWwmg-5wBe>w|i6UzH381;#^d_3T!*%Z7Z)69;U8a7+HjwOdO|rP}VQl=_mc^L! zt7N@&2KM2p!KohAjf73h$65}y{b2LJS2hz3_);A9@T%} zT7B<)u8(~Gu2~}HYx{p*QPX}SK(9k|{&8fNYcl$T)!1)SfeDkIJ83zt*9-$`kB zE0fXgClEB6+FaseQijDFdlczyS#(#c!){j9qIB(t#E^KThi6sn%PX&9>7>xINsc0R z=cPq*BCdR@YR*=zGBQ7Z-Kkb##t;kYj&yhnxqwd*PAM4Dn8dly`3UuVz zKNR5|?UnvK`0OHD-FwwVyNqOy|5-FRl;Q)wy24XmYtZ{1R@aZ-Q58Q4j5q9QVi87S z5q?vf^lGM0#Ine3cw8r~J-E0yL9V9HLv=}&BM}@6Dyt%%zs35y0!+-jqnBzGD-?}u z_E2_s_ViIMtJFL^c}EE=6cZO+tK*HnA=uf67bV1QMpqHrV3UQ@g6 zlv?UH=VRXmJ$QZXruyOL+~p&`HMPbKYN)|moqWJhI01ttSD!OlBhO?$Z`r`AA^eCD z=bs__A8fsX0#7twwZ+ z>pJ+0xr}?02lVQgXj&D=u-|zbDz|5}&iX3N|K}pKa5d|DbtwL%P`klpxu@Z{)Uap5 ze0Ca3EBd-Vzoch~1g{?V)(x!Ky_)L#nwNMHzmqwbdj$5&pq($8mSR&W30KL9| zdCG5Y{6IE+1EtLv08_Hc7*^N=kRGQ%^s|4M1b+_qjq98Pv@g7)mWhUzI#7qVfglcPiRDg;M;J zZxhR}`hY(q*L+(+GMe*bq@J7ow7*WQ8Ev2RNn6!(%=$=R`r|8;hCQ$2SB7e@rsde(g%Ubb~GvCYb^Z z$J#Z8!|5g3IAwGfEoR<;sZ(Em`dgBv;U<{|-xGNDUc?LZW+8)IMH* zb6BT-$h^?3<<$YUO!L%SxCrQ@`0kcm77qOzO5n$xEW>Fsm2e&ZygA-@q3~-uOY&T| z23=kxi!_R;Sk7I{>ff-+3j~sx^TZe)xfw*@A%OuqHJJwz4y^Y_FpX*{g2s19On^;R57n{m(}1Q z7ONN%-G?-!>hN&=w39`6sTU1IL14*SLe9Lbpn5V!mb>sw-M1nonX{1&Y3vp_79En` zl)0PR(QGigEKszVgKU*zn5l^;yA@w|M`dj4LBxipH?kx?X1EP({vv5GLvofYY5p=^ zy(ktxzeX0nf&z1_?}VbQN{6jPQmg~eSm_7>oTZd>TQ}+cd)tNJq7!r`F5`Lf--FM{ zsd7J8Ym){(=w;&3>npwcGY6EnvV=#&@#YyAzppusH}>%)2xHw)bx9h)OrljLH-LSB zP)T_^@mYOFYtE~IMrCHzZPT7&!GM&(cSZ5+b-z-uZMh6ly1Vz-RTl7lW^-CGsi|^u z4qL7su_+@C^LYV|+}W*T56Ia(74f{siWC2MOOZ;Dqo^SI@p{E%gaa44Lp+Ljd>hQI zyh$oIjERSm=)TU3| z&2SwiJpNFM3aRvi_NN=Cs6VnE4n>DBYQSYmhA^zJBBoa`0*6B>w4xHBpUz#|F`MSD zeU8zLy}8>8?ZtM{nutug>y*pyRH;$n_-tIP*1bV1q!m-nNLpDV=WU)$d3C%zDYacoc~6izHgA~HEja`fe!Oy1rVaSDt^&T(FQdJ| zJtvEs(YOjxbGt*;hw@yDqe!*iNjB!$K*pCO#>K;cDrs_QUD3LvcfIV8j`YZ11Bv?J z{gW@s+-8{^wMmkLkmJ7CtR@3vy}jvd)ee0m`i&@}3E|n@hT6 z()*xRZ4_nm(wZ&H)#w9(jp5lFnd*TxO=|$TJ^VhadPRQ=Rrt#EU87#2@VMPYo3!uM zJ>y?bM9)G+7*yxsRc4#$`035$WGfW(L7*(Ksf%m?zqr@&huy$C{fW{_&d^P?XgI9q ztRnS|7i;~sY=amX_Z|tTS*J;-N#B?$h389|1fV6OLOc7vIP!3vk@pw1>#O|su)IJy zmFdh5Q$bFL2?wnOQ{mf!&Q*)EkD*KiU5X?xMg$;=oDvuw19Qc-s!e})q9=bl#yCsh z>zLaCY1i&yqENftr*)^a$2i8azPrIJ!;A0gP|pD6+*N)=hC7C9n;l0Xk+*+?yvI(! zo?tIkNISeQCoZ7FJ z?A7!~f%w8da4U(*c61Rq45;Bkl=6Yut-B@N^(~iKT9~7SL+3LX31Pfu+;RNbj>jbwnk6JIK`>+1PEO^vNL2WM%`3Y>7Q;XH zkq&}gBtJ2WFcaZqn!OdUHwA^|yScAgSCWbr`^(q74G$*XnQ*3pdXcDRsQE9R4Y14I zamaAq;KckxbhFwk9Emm3ehn;l_@AVr=&xiHUQ5_aT z(3Hu%SpSj^jN9WmwWOc;VphUo9JdbQCbSN*NC}rcXd>k9Us=b0J#}#Y|Ep*I1BECM zgVtswYjS7)O0+d^o+N``k1H`ZH|A=|fju45OYh^FL}|I)&?mMXXM!pFR%Ip_qQT|B zd5O@MhLV|_PZ-y=56X!EHC&BdHFCR%P7FvaPxc7a3E&dn8NV;94yWabpzj-v> zM6ONP)t(G5@3u?XvctAY#R0rK<;92o04kgq??WlPAuLs*b5s;!@as4{0Gn}Krr;7| zbCzmjWeelQ>6sDdz3Cq4B_6pbON-T*i4hHi;#nB8N_dtVi6v8Nwzo`G-#q$uc~x@v zhXs+AW5$%mHRJyYF%U-9eDht|jnJ)t<3rO1`mhn$I$AgG44TSxo9=;(W}5Z510p_6 zO*uKEFt;457>Nb42QWzrsm6qC-8}P~-meE7T8Ra>VtDX(X`9>?nnSr`J1sqmpTW6X zgzmlRtEF0mbg&NG)B@)WwYsy2rs&3E59u#|gps9OcP)-_8fO3ljij8r2|@EtIw;#p ze4qY#MB#qo;|?_RbkN##qnefKlmCLZ(kcHTW&XLc#<(B~#Iz=-5cJ_M2AtnzfU+W6 zBSh{z^wBg9GlG=6zXix;ZEz;iJ-y&PEGEx+T z<}yiN*E=-0J`bs${no)*5=Xct@qe%NlWlumBeT9O=fOZP>@cOkr-5uR?&h18YOE(wwD6qH7g?k+*;1`%llq+v!vN?N*+F6ok#ly1qPQ@Z zc0C)rx)IJCl^RLo6|FvOe!`K3$Y*M1pu7!Ni(f7s~ke(l_fICyO=j!qkZC;7kf#muT;1cFZ6 zDQ_uw#`h!KM%U{}!_=Rbfe{}#8Q|!&(h%KIqR1~EtN`q1MvYs7O{r&An<-8(s|z5B z&ZUv0>Z8Ky0RZNhaR)0%LA)$6;sJQs;_{@^RBpHe<#-j?fed)G0W3g24#)1Ni|Doz zHCAb1DOzV5NsFZI7a3B2E+_#L6E%I((gl$PQT45Q=_Agxb!YMJJ>+mC0M!W9oea(d zv{ig^)qQ?D*h?9VHzUi6yisV9t~lV#HhabdKA6o#CtKj{ekF4>x4o(oRnP37cgUG_ zG1G6WyVzL_0-($o(!npd!KcO`=wb<|pK7PryQ{3TduhNW2|ZTaq_9+&tDo6kTwdvo zmOVhipZA&58P$0;`T)`npVKurH|VF76_D`hinltAs3GhmlUXSYA=t)K=hr7hRP=*%VG@Dv*(Nrh>|Zsri%FgpR9YX1=oP>;ELHm`$?4l)8iy3(OEVLm#;UvL z)a@GbXe21p5$y@44(rJ5UoMPDBDEw5Gc83FG#p?3F+67&#}OM5@qjhYd6v9l_7u4? ze-|dQTHg~E4(2S&?fHpz~65N2B25YYf3Ku#UOp z^9ak{jc^cHnQiLYn{6PNBIQ?IP`kwojbf$3C+x5(=-0l{Zy2wa5oEQ&WPgeW$R8l#{gXLhBdCB_QrQ?FY)MxW`C-0?D#Eg3y*}7q0 z+Z+IVftaxRmo6HWfw9KO{?L|aCacZ6ChQyiZedddXj!Py5>4~{W>Y%ffk{r{jUGIW z%owILXmwe(e?nnL)RHi6bTDDioq;p-e+1|bCbzzNAPQMhMG%48LDx>8e$;N8nC zwJYIY=ydc>J3mnoWPIe)r>BkIoBk;f?JfEP-|X46joAawiReTRAR2QqQrg(Qqi6iS zqI@os{%bAN3)(te#P8fA8NSvk^Pd)5a21)$T5cX+^v2D@(MKbT;;)@CW>wUvfX`oQ zlG25N%$mj{Mi#{k66zj<&R%`Dz{n>Q*L|2?%Z(Bb$1r*>^W7Jqa6^b)+_(%s9m649U z`|IF30?uc_ema~^oqY7#w}|axv7OxpG-j$hK@zW+9%S#TqOO+ed>g{wTBXS0WRqpB z(UZoK7Vp4PLtUWa(-swro3<{kb!)WzQC4c;lN3^$N1#B4nn!$+fSClv&rYejSk&RV z-wHsBHbS&ta<+6>E_rDU+tv&pdo(g8!NdiQ&->&=7d4M7va`zlKVtYlX|P;n)V<`B zj>mbwX#R5`{;)2~L&8%^6*U5WC=@vXH7uG8gMrD3ww&6ZV~P~>TyYp>^f(k%J3{eS zpaOp8{PFeAD&O~}3>R8Ya}x0dDA;(?Q2`{CsK%%jo(Yf0_D{w1Hcfu;;PUwnVsAY$ zbz47ja9qoCri~bHzcPMG!{ZSFf3Pm*ynT7!Z7Ah22(~)$z%TB-30+Ix+l+v;4KO3+ZjK9rD6{%F~*14Pp=@ z^E^Z}t9)}kr5uE(H|pNsO>0x#__=)e`RIG++cQ%P*eYMeCX~&;S5usFr69F2czqwd z2N&W>LC{1N9OG(lTiHFcUu(J&0y%&c(o2{nO)x3qmc|%IQ0b zzj}5L#x~xAt)LtsNOPU~<1R-YQV|yw9i} zI6SToA&d29$Nx4Yqnz!4l6JAhG$X{8Hz7HEc-Gkeo)#R(zl~mnLDBkaw3>l)dwP?% zo&-*%Lb#rxHf{eP0D1;6irD0SHrgsV$uZj_StN_KahRBdBB_!i(KDFf%9g>RtQ_}P<6Wz)b=KMW2 zU(|6o6lq#wX`v3(w|}E~#gq#^}~zDTmags+Vd`6sm-$7L16 zqiIVFXgr(q7w?Z85)&l`oN-FM7IIawRg6NRRc$p|_7JZ+_)js{n9(6=2Zneef0!l{ z6~#^L7nIkMy}#rv8Q>NQo*j<2IND8?YtCG`&%RtzG0o136h3u!{rLQkwv$P1J=o9` zem|Ie=xNO;Q0e&w6r{1h(#%^lma&lB5aDK)($O`O(H2gg59Q9A=vWNOFVg!*Dtdm4 z%{O?)-%D-tEKzmqhDPsu$$<$cVL>|=Jx*YR9nIs6U^Vj;O=Obrnv-y$hu@O{ZU4Hk zy=y_x%SHP7x+JyMVS6j&Abc*~pb~4t%{=Ih?iOQHt}KCk{10Y4OUgc1A9(NL5WH*S zU-S8;#ikLBC^gc4;O7GJSV-(&E6sKE)^(x(lBI+uEF8X>9D#@RvU zjuAG`DEJQ~tm4+Vc#qMNUP?RU`M#PcLG<=4hx{-sdm=C{7+>OCF5&d$rk) zGoOJxQXhd?{O7rb&f3cP5o;9BVA$~`SX%DUHnKb7Vkejsrm6zIXAA6UULpKiHGg?9 zNi_OcyG6BgRSA0Wt`Xw;=2GgkZ))!!~-d#70Z zSDbi8c!qf-Ml0=z5uPZHtXIM&Uh~kB&&cAlX}vQ^+79;j?_Qp5lBIiwqJPLwTO`%o zQR>n`M6>-rDx|1YbTVExO_Vu#PSWhxDFtfTv2HF{(Lvx!1djhx& zMdLM7(ObtE=`{1?EVnXui~YzjUy0gvFwiYX425q8P%&kfGez>9&Od@}V0d9-?lj0h z<68a}8eQ3fnbu-}pJoc`J@6|QGt#ugi5L3G9bta34P2S*6YEGSMP!(`zds572!SM= zCR-(nSu8ugO}vrM?PE<#%YtmczWJ|wHE|=H#RZ-KZMVK&N$CyF8$~`SxTRZ< z)E;Fv@pBQac9UAf+Zb_zp+ztAuD?0VzWy*qTNXYEe%A0|5!a1yQ~ zY!hd!Gu}Nrp}^~69!qljC33WtFT3*7$iZTfUQE^-sSw2SBCC@Ysmxu8OPvHXQa@lh zqtC`>R`iA%K|QcLH2dtuxb>K^zdJ;nZ`&2i5P_5|p~ki%H~VLT@ONpvX{K^dI?kAW z)0Ep`IcYc1oAG;RT5~p8umeasTNM{+c}~pBCf(m>t?u;KA;AGSJ3S3oWUtrL(aOBM zJTc1?AMhZ4vbIQt5kbniAD^RZ=kH(=Bwp3&EvLuth=>g<`atIXxE#Hva}ed(ARHwX zF(x)1?aJ(_(Ga74UL1aFzh#3w`}gbt&1m)V!rQHW%FV)`6o(H_Q@~?jfWJX&wHZt> zv#YDC`J9m86vTy!MD6Dn=!TQDg$JcO!<<)&d`9stsV+u<-TRs?kCKW2bi-X<5-wB+ zq;Tr`_=STF^`rvpikH8~CFpJ`VWZ7GSYL@8rrI`4UkCiIJ(fE&#MGJfV6Sjqax6dS zB^bxKEBY&RF*SvnAi4YrrKP2z;i}d7%82_Q+L)dW4(jEe2`D1IazcAF zsC~sp_b7BQLz|r)I7w1VNY%JayMpraN*la6k}i5%O`Dk;w_k|)_th)ZZ0q5gM!o*`ZGK@Ue|sr^4}7M z#;HITu5gpjXH7YY73yqVp`HAlCzGv|+7wnK^hE-khG!HxdIWTCzZ{>!3U4S8|A;48-wXi{}M_k-F%`lw!U_|bPy9B z>Re;iL>o{fz65J62whBtif2`HI@G%^iVM=VB5v{$!26jD&z1k|NF%H?uv^9VW72gI znw-TE?-4mq{tClls@8<`M%0&&Hy&oC1y+6!i95QwTT^_qkTw?sK}SObX@fJ(w7$JN zDa?IrD_(poHy(|LgJuMA-XcuWBYw+E_^K{}G?I8Ol)WEkp(9gh%ncWL9CJF9_nBbr za+{0f1&9QNgaIg^nreX2X1&7mraM{{Fca=kZnexEW*p%IqP}@VQ*DU+)0p{IIq}^a zDQV{V4&%L%2PMx=FlTPRe>fDoKb6cYU<2REERwie+vSeg{}uUqwa3kAkQnx|HW}}DVL7Bw2@(z& zO&O{95D_kPt8uX+jvDdhtVV+(QO1_7f0E&Ev56KZKX&8ic23ccL!>>$j{G#m=HMp_V!Ym;~tN1Tm z?pQ?3q;dIy!Q?5lNBmS7^qlsdN4qrK0BvpkWu%4V6DeR=cTonsWy<^gSBaYjs%Lm6 zHVk|-6Gw?~I)(Z7-jcR`0OEG2`r95n6^&>0nvW-`j3h1ETy|v&jT}hVeufj{J$wk6BumZ}NmgsSeT)BYvx^B|Ib#Zc9HUh>V32I*r~q+qhr9Wu z8}NQ5{=ScJ;BWU2_K&3z@=hkW^;48+#d?x_g+t8&YT-gVcNF4q!HZ+IhU@rQSHCA# zK^5XLa=za?DSIDPzUcablV4A=16}q>ljt8g;M(bH*8akq_pNUd(VHsg54lkvaNta* zerI?GqSwoAyZQLz-)UX|oK1D>?X2AgUZ^6Hm?>2i+5NT{e&l345~ogMo<`S-+<*hm zAsK$TE9hhOt@%hJl$lQr=@b!2bu=ePVZ>-sGy`lLCqAa2R55&Is84}j@_r;PeP8vO z{)DP4tAH?g`>&?>HL4lzm#wwa9+F!zX&1yY;Y5(+Li$BdXi&?Lat6d*Ppyx^cyB?a zCmm^vO|F$#-}fKG>QnXMK8BX;FyHnz%Tm$Xt|%>+ic;n2rr6+?X%Ad3JhARfO^l;S zi;|xbv$LD=+X23+(pa#GFM&!1Y{$x?<~r3ZR-~f59}n-u?CtGU)76IHE@EPM+y`%j zL%HE^<)re==9R;X#nXOM1HcAC{76K#=HSRoXH!)DC|$n-E2ihs6wHWCscBy_Fyr;+ ztgu}uHhw(=JwZZcr&X6xo93zi1~cX|tqLX8uN|&MY#)eRv*DKf*MaR~%Ip+T3^Dp3 z<1;r#8dU~RcIQ)mVL?_gRJ>ul-vT?2*tL5MBC|kI&w!Xx1mS|x)R`B zwrf5Q>Bym4-hbwoqn`*U&4JJeLo(d#!c#t{Dza|43Lr$hOQ+yn!oR%hCIpiRExnw@6!u)D`ozhy)b92$0 zsQVvi8lC&5C%@bN_LNjWIeha^zfUn*tS~HnM`U6%C-2UU(s!1sJ+jmeX+0sA84dC-} z_#Jek8HODblDqn&(xKMdwS%dX-I`l(~^x9+2j59S5A?WoLUzg@I42eChw}c zm9{kkOVkJtMMI7hoAn{5G_Q6s*THTZEXrvU*Nh934WhD1lIIr6^oCjl!Juso)yP_8 z`bO$LqiL;j{k3yI>*htqxjj-&yg0Kfh^)`%S-yG<*Ysn3hz!U@{``yJUq|5IPfKMZ3EZdIE9G57A0_V=E~!&Q1xRZFH4 z*+h3&&4$DrxSiTyVfVv3V~uz^O6WD-ChF&oG}JMJ1^o;B8N==>2yDw$T&yqoNo@Af zz$q!6cPJ?{{^irmIRT+nDO9Rc>}Ea8{!h#e%uxSs$nDRFQ9rgoEW+5N^7w@BFUfn| zs}ZFcs0AE^?xKu0WTsYK@OLlIu`{NgFr;Ukk3*b`3Kug0;feiCBR9UgJ8S8)AR%0HwKbOb&&W=Vx)4Hro~ zXqc%#Qi=2#vc{4ZK?&l#$uLcl_bGsZ&emVgRd8Jp+Xn^2f6?tEti5^h_95Z446N0B z>Z*u4^x#PCWL0;Otbb3WC-Bs$LTuWoIgcK!))$r%qu<2{9|wx|E#)^N-glDE9I+uc z+WsuBf8^mHD=jyF#ZG2>EH5LoBLdKv#DU%d_Bvl@+g^b+=yuJnap7<1*k7hgc2AJo zc->uvZp(elPv3R0S6S1R#Xu(G(G(**=NZ)jNnfb^0iC2>5z6bTo+TA!D~1s&GtXhz zK{07_9SQFkZ*An)p7obeMo~L0AHsT3rbC4X!f(b@7c69cpLqF5LLRk(m6o;U?1s9Z z^`nREVvt=NPJoV|hHZv2B5modC1JOxC4DYR=!?e_&SO}0#5zrl(X%NJ`mEm_Qm=lu z>8scODl02fBEUdK+5}D&=+<1w5sOeI7kbn-^>Ivs-{@<}))*wMN@*jP3h$Ke8c?tc zv9_Jxkp&5(nF*dhwY(!WQ%0?b79}4Jp9bdVv`lU1MHcqCEjl`f3F${W3=A>FwHDXl z5n1hrS%szawYjygE*aQFixQbWF3|yBaZFrW%oR@uccfp`h+aw7T5e8}(Tp}EaCUEw zP8G$c6k|0%pK&^&!WOdb`z6Okc1j7hwAgPK$tQ%{b?5@6`c=O+c^w07Wbzuc)>`(# zWY2oD`uLM42@J-9-UkJe-#7HROveT!!=8Y!;G31K#xhrLkyy~svD9!vD za+IE5pVifR+;X4(#AQKVVd~+DU!SPS4=Z6Q75bkT`;Aw`{!bK4bxadgFJ+z^(H4ff*qKX96Y~Bhj*33H+LZ|WY=tm^*%oI;jpguUL2lNa<6>(fx+~IsBZ$VLy zy-|!V5SgTw`&k6@2OwLnABneYd`yui?^xRFlSh8d3vWRMXzV%D4*k}foXZEi;?ikV zvTa!A_~@z84&{J~cF_zHKSfH;i;A#x7CuX*%Q?|fYMPA(lk{2RuSlrWF+rh$ZinV_ z#Qq*=0A8^8Ee~j*CY4_tR4ht`qJ%9*F^%TrrH$Hu8n}L!?Y^JATAM?ZTLcb03BBp_ zOBz!#acZuUCK^Hc0lB2+1OuCQv~H14F&^BmcOq5iE4=M1ojKr4cwYLTaq}8<7VOH! zsFlSO$<-4)BMIIdzO+lanz%0~$Za!e=DbUUrbfsthZq~ZjhL0*D!H)Y;Qz6hBWjHE zbSmxT2^cDCM!rr);H;O(C4s@I9UwqwshR$5QWU%{^&Z)TUD-6dH_=>{jO5nkSchvL zl#>Itt&!k2TfjbodI|c)vzm>DU{IHX0M6<{VP+K(&R2#^-*Uq6CTZ;S?XTC?pFt(K zOk1VJG~%U+=C7mjZqjVHcg;s8TCr)Drkj{`wi&I|s$jTTR@%waF4;%GvY^4l8y%2N zlw_Ghs^y`mi4xWRtsv`%-Sa0re;jvs|E$9vo8z+<(*av(thwxd`12ahnS*d~!nW#8 zm)}o%6N1LZ_3RD;BsYnHj{LhfKH7QZY$sH|@*# zQ4jk}_kHKOZ;5t~o;EZ^pHg>DtE^=pU=w~xjBS=~)0kzfK)f-wqD8J$HQJ!PArh1k zURRBx;q_7tfPvQXqbKfToKcHoUuTHjb!aZwzZrGxlW(*8`PaNw8C_HU+!(wL`4J){ zLWY__pTl$DvH&sE{0NIVEtja30D#H)co$&yjGuQ)8l@RMvk!LKK*rA90)+sa`N=HT zItWo1^A9cC-10So-?5-2Onbz*JX&p9ipBbWSIv&@W`MzNgn#-98K)OOkml7RJUi{I z{NXA!^m8*t+a%_7WA$1)^8CxboYVK~xX4?c+N0BT{hesCI}!dfH|f7?IEaKfo=R+6YBiY0|ZBHrnwI%^<>A0P;@D=FTEWbtlJb`l2yVRhgCs z);ySg$%I2`JVj(D{vv_{S&U{HppX$T0DXT>FYA;JB&ry1_fBn;^IL-89^mjPS32%B zpurPBi#tE43EoS$r*<5ar>s)FYld+J$_Ij5NA^O>=k^h;M;WBI<7-?{P%;?L-wBTE ziZVwF%R(-tXQljrlY>>Yjl!U*U5i4u?LT@*GvF@Bu|yeVJi#$WwsbwH?(v#H_l2VN z^63;~N%PmrvwM0{s1hkl;b5WxxRL9jE;P+9Ei`@kSiNS%rxylqbnMoN7b#rt5rv{v@PXL;mC52U6g;0kWLKV!u2Cuw zK!uWAJ4+)<2D`i>8Q|he6tFJ<|Hr`|J8A<~J+LavNOgNl=z$N_?_j-=k7LGs@t@ z`m<#u`axLx%RJh3XePLfhffFU_TA-e;>@>f1amT+hplC#SN)4dIsd~EBVcc^|G5nI zcBG=QSJE-N(a>GY&Y3Hb@|MkShMoG=;5FbQgwiq;(@aYIHPmR6gcF6(s|(Agt-$3a z!67oY)qAfwD5-WTA`vb`ydO=qg6Yi(oT$j%|f-+GN!2#5w@cN2n(G+okroh5Y? z*d-o)tHzeVar=?nE9fPy|HBWAk9{$6Pu8v$8oh?2UIL*R1Ms*+YJPtH3m4G}Oq=vg z)7|cGgP%6vFzoE?bl19e4l#B+2SzYbQ}9$;SlU?qjwtG;%p(_l#__Z>4$=ziP#Q^u z0HUR>$c0Z>t-+O|bi@n2r`5AUg8K}I_s5?QJCZ%I97088tM7KC3-{5X3v9jq*D5o|8KO+-xJ(xh&{|Ouh;ffDUW@>bW)XJOZn@L9a%i<|)EQ8f z*sLuqs?{uU8ppd}eZGA2VOV&>Q3jXulG=}Ec^8{kY1d>QJ>LGZAc_a@9MFaX!dU-! z^U)v8eJW!RLglpjBY*2QH#3&@-x3?@sp=vFSMrH1q zYj+-(zk&7F@YzgJywCoMLGmyvSK*9FskVq;1N6;Czz6-sz2-E+N58}BjJyb zg^{}3NI9R-2S&(X^UUs2_-eGQp5ttXe7IcP5?;})qKfS$Q=p+YINtXkzab4NDJ(7~ zR~ne+baX$pLi8p>CA@`J-^$rfWsvqdkGZk@YrzR%VdoAJ?O^oer=)tPb?%sD{@nG^ zV;B(lQ&d&st1tJD8z~L5Bh-wV$^caN&#CvvxaLy_*-^pKwvy5}iu^ca;kN5|2wT>4 zVQ~CY%rsOBC?Jux6Uf*TORV;pJvg$VDE~@8Pr%<2227SXxzg!Z-tVS_x}j)QVpx>b z%6u;Uu3xehYSS)EluQh4@x$>7FWOS;Z!!s;@e_Je8KUq@UOsDzf*t*V4ft3{nBf-w zxHo)sbFI5;lm(QRMC2J-ZOtif@S~mh;Y{GAh9nT!2fA*8Z)09Z;fE)dL)_IgHDgZ) z$+CLeEO1&{vj?H#RoBu}vHAgNSH6(_n9CR?kIadrhuCgnWrc=9csrAVz{A{W!|*O)-D(LWq77 ztI!GhEQ@z!RgCkcdm<07jgLawqrt<32EVYRFv?gxC;QL*2Io_fBR*u6)IF?S?QH6u z4z>db-e@43Ykx!87(${6vXaoU`qan8CW208Rd;oE?F^eDmPn^dX6u^usPY~QoYMCxcvqj=c%5)-l7`*(OSV)kQG%Afyu2MRG z;pLHZHalZ>ECiN>IE&MZHTupT8p(hc%_Ch+jm;us-jsTA^a8eYQt^}n6G#jBG2#>q zMhpC$JUO`*>DSjdTy}6qz}%a#kqn{Tg!J})*t9{U4N&~oxxw)s;jTeXRKlR`ow|!v zzCO<85>P@(3*~)r>7j|q$#0VbZb*Rt!Lb>7Ww#V|a-{&Cj=r`we{JhDp5#-GnP~O3 z0nnGWGh=SC8D~p_{%5Ebq9QoXXe8sXp_vzdRPj|SE#th zpUX4m(8EaC|9l%4qptZ9{yU%f!%l%x*V}CgEfue&+C&NedcCH9W;GUcc%eZBR4Hpi=!ZHtQIbT1rF~;Rp4Uwi|+MFdBFBUw-7*;=lNLiS)mY5tWveVNa4orm}~^ z0|m1l5Nur6ZqD6BGR7=0sQaJGQSryiQ}n+=_<374uulH|Y{-W`{!L^lOCA)1`;;j? z{{^}ueZVNyy3wplA{`F3R3$hQ&J@-oYwMqGF($Yj#46a2iJH~=sXi4{Ea7)J(yCIQ;us$)dE&Xu*IZNrcML_|3nxk)% zlU)_pewi@i{a8&c{;qOSiJb$w3X~Z+;rH>xpCe04OYyhk%X10wCuVGB%NG)>zya+#pcP}00_JCnTxLoU5mH63<6zog>dXWn4I`g@{nVCx*lfHwM zA9+-wFbT{Emd0KJ^#0XR2dWv?dBUFpLWml%=_vis`ZZo=W2!l;wVf_$* zs}m!ba0y{o^LqalCJ`nP59LHHtlLk3*JPp=UA(@G7n9+*&Op}fbKyTEu{I0ky_`5=}~n^gf|L5g4|uQBdNoeYI}YD033V zB#ETY^xQ5@bxm30xg`LnJ0)J28yIOR>PpW53WJwr^$o|CgoajEb#hAuHTRLY^abkr zGUGR^=!0OMJX?5SGh~&_HkYq)9LX7Zis3@D2?loe!K5mQN(2{4E-Nl5^$6vemmf#w zd5Q1LZ?qsoibdb%=Cs6Kg~N`?#Y&yq%k^cPuG@oPG;95~2-ov#m1GwEy`n}jnGEA` zsd&R|p)RVqtwi&Qu5H~eJ>4Cpf;scZ$cF%cu%$t_|B2<8H3-(r z^CI*(WO*@RoBRe1$Cp!ea2_q#hK$RtNL}BTmZ(TgU7b8p*lA~@v=r%nrLjV);^p3W zmPyDPv6lfq0Y6*wNV{{M!$7fj03RWMpp%7cr24iaA7(s{Z=?@iJ5whlb|&j4x~;`i zh%0Nhd3iBYdiESaf7x;gw>l1N1Wo~W%%QNi7q--G>EBo9MFSmG{1D&tX!b%1u zEmp_DUXhe5uUf+X-wyQL1mW2rK4)iHcn3Le-sM@jp}M*&J{}A5=9kf*Y%oVAL>zWI z{l-d>*}1y%tCQ&AMW`b*VDgbtbUkIF>Re|nn!8X`&|ED(3}!4vbdHu^JF%LT_(08g zo>q+Um@c$=QpkTHitJr=wz`37(B6^r>!D+J#I~mBOT(Ta;DZ`a%RpoBSEpvrdzQsv zE+#)lS7C;@)*uOHOh+`6u}#f;=c;j2u>ZTe>(Of4^E0uaJL3;TU@`s&9;A!v=I~+H zF4N2b#ajX5MY|&R44^7U@3#@n(r;ug=}h+}lQn+K`A!!E^CM1ViJdk)UwsGJy%Nfy|XF4EH5n;kPke7_xCPvP25g3`~0{>Lxm7!p(9kt1&XebMG2eq^vhfM*)t zOi86xE^>#|x?O=8ePCwdt`1XHrR;n%QJN<1-jtXcf<$x9&SR>*DHoAJ4CboPyf+4Q z(3-RoLW!;R1DgF5DR86MqTdHc-jvBa{^dH-Jwu6kVL(ssp}_S{HJb|pCs;K-@-?HU zzr=FoS=!2ON9#(Z=533I+n~LNe&KY4!YfiEg6!<*UkQA98ahk*fr%MeJABYRTN!27 zM+pk=u8IvfO^?t@$ogf*m9bbCK8=`)(31tRhB}+rl(gsyj0MAJe}uiI(n#=yCUnH0 z>Ps3D%e`2h)+pUy-O|4raq4A)=%lHiu?$2#3^u}pV8(3GgHV+PE&be?FE--E^x53b zpRW7zKlrqtHYiWjrVl!ZUm*bSg{kjZ(O(1ivT!8Aj5#)NW&bX!T;fbbxex~~p@s?M zu<*huj(jj3-V5;NdS${>L9z8#=@k+0Ki<1&MO12JhwpT;vHgdN8KXr+OG|ov>`lcHnzJw(L08xyf`B{D3jW4JN6qFfaBfiI@L4+TWk>^Y+ zULvuJN}5@Jm?|gmKj&ymM{SNfC5T;!ia_IS&Dq8kHNlk#>tcDb0`)6mC)|y9*U|5gnn?x}$U8juhL)ZktTgH}&vH26b z#Uz^x;?7oP@odR}=}UVio>!($Ij~$Uf;Zr)s=u_5tb#bcb>j~_R3af?^QzgnA@|i2 zC=FU(q$MbmhP{9Qh{xo&CGXll7O(8O+e)BLBpePke?1;VS{&Dn%MeOgo9z0l&*k=@ zB}W0kc=rq@^2bcY5CKTe55YF&l@nZvD7}t`|G6ziv0jwT#U$Gdzs*~}zAauRie}s> z-P#D-fvCzO7AoqX?Ki*hPy-cteb8|1p_W;S9H)l$Dj0Y<1dpmmDG{-MLJpBFKNO06 z=)j8-**B2|Z$?QRPxejj#W=j^0O{A-lo_Tavfok6{hHy$Wz1SjYwR&T&o@N#14WhFX76WVBF_M$2U4qE zl3k6qT)x!fL2JuH>N%b3`n4L=8s3vku~%RJ?JQ1Ry4vrh^(=R1?=AgQ)8}})zPxae zn95q7!2r2)JtS&V%&oTZW@csv#VWc_F-5YgyF|q=prOU#{zmW*p?Vy9#^SZqs~#~X z2)2Ov*^5pST;t-93^DU>^Qu1=gCF@yGRbsjts0O#2 zHH}d)l}r6rD8KHm{G;a)XwuKRU2%~6W+qAb6H?kW!CMtPq^5W=3z#FjO^bYd*yH~U zd(MW+_%4~F`Ug)Q;SEs|O!9R(H2y~X=wMVw`CB3!CG{HZOv{NpN(08`F41odrbWVw zc@u#+b{tOKRZf#|n>P*=!woz|uEE`9`6<8`1n6QA{@W&W zqFtK~x#WcWH6zHPbfUGmC|~081OS}1?)71LjGYcCYUzky4Psv?u=^Eh_On=xkDh7l zE@9q900_ioiWUoKy`R+p05>Pm!J2ccC_ngM@FEdN0}HamDQ zuw9<2?rT+st-!A=2_`}BAOg6dE3}Q+e*9r<6o;M^jS+>oEZ;LzFg*5Nh^r%0>=ZIe+K+t_S z!Z|4CgHE35zw4Su)E9Y`J1!%2P%jrGf3ir|n(Jx13 z>nt&GEj$+4PUzIj%Q()nV}hkNFk&e==2fDsMefdSX{{}1)KM=LGU~F=FLg7p9ft`_ zgDRCCfNp-6GIE+^NI4SVXlY<4@>m7k+RmmuZEcu?vqTLR%s7b12_uMT3D{45Iev%2 zXp8WER@avoU%#j81$$xI@t;~Mqi21RH8$NILcZlGb0K=SO_}Gj<=S7F!Z;XFHhoYB}C&#D-J=sOMPCNYDEGrfs{+#XgnE0K!^@>zAn&To{i9p5Vws3n? z7eKW_bk|rpX59tBk-$%&W`Gq<`X#~{5&h@J83Yq+R8h}30j=Ysp4Cb#CiOYaarxoX zd{Mek)O2o~`<8KdcL5RXUZ=qZNSe za&BF)?r}l5;LO+Z003Y(a7h48FnifCC+z#a_>fkr66s=#1`NDH8w9r(nlVuaP+)dd z7>q`WSxD6~cs{4h-mQP6DWHz5C0&02)7LJaxluIz-^Uf-=jJ3zcKJcmY%LEPxpepa z*FXV}WNPpsV<0Xitr9S0(eI-7CMH>wW=@eFzgaP%{0vYVQtOWPlHh zkf0nt{bf!=Qp$3`Fb#8b^1Tq z6uJnGaT23vm)haeSpbmM8DI7{;!Bg&W4O3xevIG+k9qrbs&5`tAciO!`fvk&WbUJC zQq<|Ju^ZBlroPvU*jQ1F42zykhfZypuQ(t(XCZF18bI zz?|Ni=BAO%hkzR0d_M9eXf^T>L1VDdNVF?!oH>BLw_@ZH^P=_1)D1Qv0V%HB-p6m^ zNDE2rsm3?XIO;?O8g~7DSt#}~H*Eh6&S^}iDqETsGs@gT~5EIfcgHneVfU$69gd4z*&N6bmRviUM>(agHR$nFGH%c23gl* z_YFjyX=&k#e8eQ!MYpMBTwZu}?hyDWR@We^rI5YAT*kaBedpY{hlmH? znnIWa>8g%a*O}kwd79LuC>`|6Q0(em*w+hh%m)O-l4s7jfj<||O~9i)31KBafAU2k z6rI7Snl6-Sk=6qd8S83`RR<%!OQ7pOOED#C5^Y^>&=6Vazthfkwq&z3EROe{bk42S z{nLKW@j{AYsq90W73KpeB(`v=wL^QmZ|ci;Vu3&-3ZsdMhV zTC0dUnzS$F*$r;h`*t}H@F6)TZtak+xx3FJ*r0@k!!PVnikB`ej@X3E^j690A07BE z8MaOV+mb2=kFvkb&zX{{H{uk!nwZYtXQHp$GEs0O!00D z(v#X7Kh@)M8+A;OadkZx2b3(<<2rWva<*eqkBIKJ0rI8&{nbSNBR9zeS zEY){E8zB!H@Sy=1yLLLw2Y88h8fq-bQm_xM7k|1~o3-LfZZ#23*`s zrF-n3w`su#;Do71_^~>8gB*FzUWSCSzk9c|-C9qgrn>K*$1aAUOT~ohc~75*=OR|HkE#NuE8}JFe>DjEW^%J8y^-mY zjVlWe5`_p5M(vp)d`KgR5&9k#18*;wykQiYLPJ5jGK57V0?3aOSi}qg`}u1%Sej4y zsF&1TILw;y7Mr%e&d9ZU^>gLV(1nq?x6eEZbSHIb*pE0NE4oracIE9eC(bG!|4F%} z1WnFgrU)-Mj$Q;(?%4gStFfPFi3J_x%PH+qzKYHk@QOusFXRdk zvFmH6yd_p;b-@}ba4?HUIqei{n&!wGAW%I4;Dk(-YvS_$b!9;@&<_Z)4eta@Udf)f zGsg}_4zKcOID4g3r=#i;Y{y5kRd!4sUPUOqo$WdKqJsz+DgLX%8wX#hk)Wck6zk@= zGUsDk4(_+?H|$)-`thuv?9#WNtPOXU; z(PS(LvJ!L7H4ri~UMgabG#DG&r8Qf}Tod(e^?t0-bhHk94O1mf5q*|#ULDw8kUh<> z%m>D*ptVaf*#F^T4^kTGPTxozK#-}#GPn9T8u-;>VTsry6Mj;G*ggtC!@X^G-Rq8)FyIh9Ewu02K-E2lwWEgKff|!*0HU($d}H z{SA=NdmX%e85{Vat({|KkOX0ib9`|wR(~j(+fBM!DQ))w9dzRAvl`z?nt1G`t4_FH z04d-8r1^q#K8heF6Woq3|0M*tRixq`bc# zDTVnVXD6?L!zvrgSk1!>r$q!g=MhV#zt0~$5L5DD$B(eP&;Gyt5G$mJe`phP;_Osb5XM&f%5{G zwHt8^ko0tct!E)0(`^=_gE8}-UJeg0ES!$T&FMTa8Xi9tISkmykY16NDQJ;j;f4ul zHfBPAT{8(YZ8B5Y3tA=pm2f}30*IkLtaq>pVP@%&=Af$`3qw?wF$g_yr`V9e| z5;ajj0D+iZr$$z9PDMq)9{>vTG572&cszt(Wva}(efzVCe zBEg*Ps*8(N+Gubyj1F!P6{ccd@vsjX>| zDnqO?IY}y%(S)StG!sUhO{jYh@ifjC3f?P7;X^;*HjAUWFCf!fg{DV>Ei`8d9 z{{O{*wa+!MJ?#QaodYKtGF6h@Y@%IG!YH=?k^G7Qg#dmE*WLqc!iS6Ez&m*U44ag_ zv0VSrn7!iQ{bFT!p$15XdfVN?fe&QvFA}{z$Idbx$4gnr% z2>Q8V$zs3gkk>SIRGh55ICHi)hCCie34Gp}%2$@gmiMwyy#2nl+dwbkCm- zcC8yZwUK>c>~;g4ayh@H1L)g}mB14UBB3*w;uCWhBg=W!?bCgIv z#1^9$DV7VR_O`j6ZAMb;}%a1T7l7|x}P*5b(`v7$Iz^OZ`VarZ;E zo29-NQ>F>()qVZfD<9v2G`-+1+w>FdjRW~QCpEeRZWvMQjG7>#l#({7a{IW3HCd-; z(#qZ+78fTp+WH-e|&A$!-7pB-<26+?>q5{w_$U=t?#=2FCQA#J2IYit;(aebNlhs|K!3xsPO0K#-RuGIU5I22>PrC32 zJ|g5w8=OGBag`!OCD4EuSibLqQ^hN8A@dJr{ikg?-g@I^ z%8yu~;2frfq#r?o4j{G;t|#z?_er@}xe1$d%WmYHC*Th|h`Wjns>+AT_NC&H#(_`|Yhb{xw?@bA%N=g+wX8k9Z{bKz1OMNJ(*6yFImLA zxKf-x$nO3==l6eQ>e4##dF1}-+Gni0E7o3dCP(s-i2$30F>raM-fd;ezE_rD2+lqk%@8X^srB<64HGX z1mUa1!}pwWK^!9P%3B8F7l=4CfzyPoe^*`b&tf6WMz5miG&d00Yzy4b3 zO4`jo8_Yz=Dy~Frfno`DhrK~Xi}KUEaaYb%Rn=16UmEu?S_oj7XkO!yhMFgnCZo zt@tB{Z+SqSfZ*br&q2$M(Zk8vv~Y z);@4z~ z-zKuO@dVgxm>y@M&>PE^sMJG8#q-psx@U+})l*SUstQCZ=9ijtAmTF4l~EnbQ;75w zW|pI(IRvr)%IgX0b=OW~Vx}*v6y{sgDmOuL%hplz`iJPB|G{^p4uGkZogV?(_vFb~ zxt)2JOSqyl*EPo3`QsWAHiCv`iOH_p^xmg!65w{7e3n%j5*ei+WIM^Tdh3glNQBWP zdtXZ{K;Mv;v;EF2uf6lnu0@!mTuW5KjQ!|4byfny0AH%F0pHv00s(U{lLWljcJr-T z;~=1AqA;+uyziv?c}BpoX+P=U|0?;hT>z}c!`fe`XsSLLvq1O!PZMvNCu`|oasJ=q z+3)^G{1|1EgCfxiEG$hPR!1N&L58C5V2bW|@6%pwJ~QtaZpdA;1e+1!_GDg!8)Mev zZqjk#>|ClpkGo-r)j=pAGBkO5x__UHeS4YM83|&A-vHMvxB9#;YOxX}*XGT_$VJMU zzn@0rJ5KF zGfoYxX0t@LbL;<8LT3pq2)7)%{HG@|6^()94EeIypZhd;lzs@%Kqp#XB=6A7CP+XSjcSl)XK8^kHRnRc^J$j z%tYEBx&=mXRLH^60ZNw16`96r!Hr9Ekh7C1Mo0&t>c|H?RLA4uIKLW%|%Jf-+IWSU`(uW5S57Z zZ2PzzU{9V3A&wDl?iqRp(|;#2?e8VTneqaR!~$n(D$RIr$TcgGHh)#U>>oo_OL}Q) zYs;d#HZL?}f5}nrrws;C#UlP=H(nx^pIAL~0jM0(sc(PtO3D74>bYAS^?@-@?S5DDk@GW<*P2^@p`k$URW zXwW-!Ur9je+K2-eLEF|~6AV*k z!|CJlV+uhU9Xl4bd2#jNR`lvIxruglf_f3B#@)dzPk8mP=^}(6#wT^1$D9G1{q?s* zVrP2K-!ff?KoIOmMfG5)0h#0H~>_ZHT=hdY;RvN(#YW+OUph?lfzo`xpw_V{fYczk0bI)zq6pQ`|Y2l&5;zMwTIZ}N-z!-M`` zZ9Dbo!!;t654HY_d-8{PWvyI85DK8^ts3h~-lt1^r$Lvr+HBSFEW(*!K)aF+*K{I; zvw_Tt-Ja6SXZs#GX!vBSZwd&|m%Hf&gDKEm3$iPLN$ z@at>%_A3A|VMt^s;vLaD*XTwticLjbG72hj{v>1JFEh_!QilFKbUOhYLsH{ESf7q| zWGzRLmptiUIJDcvCGNt9n$R>e53Em12({KuP>fYRn7R3*5D7L+{-py^Ej|r02fI~3 z81-d(wVoRy9;n@kX z)X{wD@Q*!e%CNlpF@4M;GAB+1bOlcp>i|cP1Re_}vEE5k-E$ky>kZjMowrvm+HSj&j#Ogz9$2LQg<6d(CEW6b9URgi0EB%JQ+@KE#m+6QwAmE99N(D zMp2)^ixBz|*y91Q?034ygNe;8zE3ZQQ!h3ib=mInhg`atjTdNAm^!+go-~jI zOvKAu@<_(=LUeD8u;ikc)Q|W3=C{>3%e`P^HWFw!RRT+^JGEdu|6uF!Ow7Xc6=&xx z&ig`_BtlW}O+k)M8AGft=;+9Cl;nRi;V4ma`1SZm8!8Y2pM?Ki!S1i2a`d0mw*PI7 zJW7`>RECLpmmqZL0q-|^#YOQ5;%k20qO~hOiq42Z962iE_X42@Z!M0jJ56@v0$8>6 z)P3dLQjynQ-qY|)ubbA@WYd-CiZL>bb7%9g>md+z&+7}JHYEgvrelw_N z@+z|dmm2<2#SIj1kpYNkDe|f1JrrRENO=QiVE7)+e+y(YCDc-&=`^5F@G=bMfTkS_o&7NEpQEbv<6i~w5;8k9(Av1 z2}M5^{(b}oK1_73LL85>wU1#N+43`U#CH$?Hi5|`(w;n_;$ymncls5xl6t(na?0bb z_oE#bSWWO#DZwC~hnlH9r}BxTokYM1+_)@vR@O^1ued7v6HrB=7|Iu+X zKQ~8EI=JIQf+n=wcmFIS~=Qg$_pj-M}WTd6z}WM_Xf}QHg=>OoWW)_daM*gmZ1e^eASePj!K4| z>%aFZ5T(aZY#suDTFWx6tcW0(g5;qbc@R6vm3wD-Q(ZjGYlFf3a?i zbLZlvIEce}oStrg#$q+gQg2JEM)m8~@)4V*L(CsjqWSOp`hUO{4$$pFtK+%_RT!=v zCHDktHTMYm{@d5Knq^sYW9mTnda$SY2_qjC7?}4NAnSCms_c-y^aCHD#BVG_?W(-( zk=1yV{|dL&jZePyr+EJ>t8jc#Iq>P+DSOygtLxkRnKE*C3BcaJ{izk-*(Jp)`*d|Q zX;h_IHjnFf6l|?EoojBq0`pR?r>Z>D2}w2)*eMQPPveCv%Tmdg(ucb;9`Q$;e6MH} z>?8cmFHw^WCU@$S(uyF?3Yg?xTDP8LHiODzzrfUCcUzF4vxf&K`&VC