From dfb15b55382772ba4fd34fc21922a2d83e9d34d3 Mon Sep 17 00:00:00 2001 From: Marak Date: Tue, 30 Sep 2014 22:41:24 +0200 Subject: [PATCH] [refactor] [major] Code cleanup. Node has changed a bit since 2010. [api] Added ability to safely require colors without messing with String.prototype [api] Removed browser functionality [dist] Add travis file --- .travis.yml | 6 + MIT-LICENSE.txt | 7 +- ReadMe.md | 145 ++++++-- colors.js | 342 ------------------ example.html | 76 ---- example.js | 77 ---- examples/normal-usage.js | 74 ++++ examples/safe-string.js | 76 ++++ lib/colors.js | 175 +++++++++ lib/custom/trap.js | 44 +++ lib/custom/zalgo.js | 103 ++++++ lib/extendStringPrototype.js | 113 ++++++ lib/index.js | 12 + lib/maps/america.js | 12 + lib/maps/rainbow.js | 13 + lib/maps/random.js | 8 + lib/maps/zebra.js | 5 + lib/styles.js | 77 ++++ lib/system/supports-colors.js | 61 ++++ package.json | 7 +- safe.js | 9 + screenshots/colors.png | Bin 0 -> 82801 bytes test.js => tests/basic-test.js | 32 +- tests/safe-test.js | 45 +++ .../{winston-light.js => generic-logging.js} | 0 themes/winston-dark.js | 12 - 26 files changed, 962 insertions(+), 569 deletions(-) create mode 100644 .travis.yml delete mode 100644 colors.js delete mode 100644 example.html delete mode 100644 example.js create mode 100644 examples/normal-usage.js create mode 100644 examples/safe-string.js create mode 100644 lib/colors.js create mode 100644 lib/custom/trap.js create mode 100644 lib/custom/zalgo.js create mode 100644 lib/extendStringPrototype.js create mode 100644 lib/index.js create mode 100644 lib/maps/america.js create mode 100644 lib/maps/rainbow.js create mode 100644 lib/maps/random.js create mode 100644 lib/maps/zebra.js create mode 100644 lib/styles.js create mode 100644 lib/system/supports-colors.js create mode 100644 safe.js create mode 100644 screenshots/colors.png rename test.js => tests/basic-test.js (57%) create mode 100644 tests/safe-test.js rename themes/{winston-light.js => generic-logging.js} (100%) delete mode 100644 themes/winston-dark.js diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000..ec43125 --- /dev/null +++ b/.travis.yml @@ -0,0 +1,6 @@ +language: node_js +node_js: + - "0.11" + - "0.10" + - "0.8" + - "0.6" \ No newline at end of file diff --git a/MIT-LICENSE.txt b/MIT-LICENSE.txt index 7dca107..3de4e33 100644 --- a/MIT-LICENSE.txt +++ b/MIT-LICENSE.txt @@ -1,7 +1,8 @@ -Copyright (c) 2010 +Original Library + - Copyright (c) Marak Squires -Marak Squires -Alexis Sellier (cloudhead) +Additional Functionality + - Copyright (c) Sindre Sorhus (sindresorhus.com) Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/ReadMe.md b/ReadMe.md index 0eda52d..b61ce48 100644 --- a/ReadMe.md +++ b/ReadMe.md @@ -1,42 +1,107 @@ -# colors.js - get color and style in your node.js console ( and browser ) like what +# colors.js - +## get color and style in your node.js console + + ## Installation - npm install colors + npm install colors -g ## colors and styles! -- bold -- italic -- underline -- inverse -- yellow -- cyan -- white -- magenta -- green -- red -- grey -- blue -- rainbow -- zebra -- random +### text colors + + - black + - red + - green + - yellow + - blue + - magenta + - cyan + - white + - gray + - grey + +### background colors + + + + - bgBlack + - bgRed + - bgGreen + - bgYellow + - bgBlue + - bgMagenta + - bgCyan + - bgWhite + +### styles + + - reset + - bold + - dim + - italic + - underline + - inverse + - hidden + - strikethrough + +### extras + + - rainbow + - zebra + - america + - trap + - random + ## Usage -``` js -var colors = require('./colors'); +By popular demand, `colors` now ships with two types of usages! + +The super nifty way + +```js +require('colors'); console.log('hello'.green); // outputs green text console.log('i like cake and pies'.underline.red) // outputs red underlined text console.log('inverse the color'.inverse); // inverses the color -console.log('OMG Rainbows!'.rainbow); // rainbow (ignores spaces) +console.log('OMG Rainbows!'.rainbow); // rainbow +console.log('Run the trap'.trap); // Drops the bass + ``` -# Creating Custom themes +or a slightly less nifty way which doesn't extend `String.prototype` + +```js +var colors = require('colors/safe'); + +console.log(colors.green('hello')); // outputs green text +console.log(colors.red.underline('i like cake and pies')) // outputs red underlined text +console.log(colors.inverse('inverse the color')); // inverses the color +console.log(colors.rainbow('OMG Rainbows!')); // rainbow +console.log(colors.trap('Run the trap')); // Drops the bass + +``` + +I prefer the first way. Some people seem to be afraid of extending `String.prototype` and prefer the second way. + +If you are writing good code you will never have an issue with the first approach. If you really don't want to touch `String.prototype`, the second usage will not touch `String` native object. + +## Disabling Colors + +To disable colors you can pass the following arguments in the command line to your application: + +```bash +node myapp.js --no-color +``` + +## Custom themes + +### Using standard API ```js @@ -62,16 +127,34 @@ console.log("this is an error".error); console.log("this is a warning".warn); ``` +### Using string safe API -### Contributors +```js +var colors = require('colors/safe'); -Marak (Marak Squires) -Alexis Sellier (cloudhead) -mmalecki (Maciej Małecki) -nicoreed (Nico Reed) -morganrallen (Morgan Allen) -JustinCampbell (Justin Campbell) -ded (Dustin Diaz) +// set single property +var error = colors.red; +error('this is red'); +// set theme +colors.setTheme({ + silly: 'rainbow', + input: 'grey', + verbose: 'cyan', + prompt: 'grey', + info: 'green', + data: 'grey', + help: 'cyan', + warn: 'yellow', + debug: 'blue', + error: 'red' +}); -#### , Marak Squires , Justin Campbell, Dustin Diaz (@ded) +// outputs red text +console.log(colors.error("this is an error")); + +// outputs yellow text +console.log(colors.warn("this is a warning")); +``` + +*Protip: There is a secret undocumented style in `colors`. If you find the style you can summon him.* \ No newline at end of file diff --git a/colors.js b/colors.js deleted file mode 100644 index 7a537d8..0000000 --- a/colors.js +++ /dev/null @@ -1,342 +0,0 @@ -/* -colors.js - -Copyright (c) 2010 - -Marak Squires -Alexis Sellier (cloudhead) - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - -*/ - -var isHeadless = false; - -if (typeof module !== 'undefined') { - isHeadless = true; -} - -if (!isHeadless) { - var exports = {}; - var module = {}; - var colors = exports; - exports.mode = "browser"; -} else { - exports.mode = "console"; -} - -// -// Prototypes the string object to have additional method calls that add terminal colors -// -var addProperty = function (color, func) { - exports[color] = function (str) { - return func.apply(str); - }; - String.prototype.__defineGetter__(color, func); -}; - -function stylize(str, style) { - - var styles; - - if (exports.mode === 'console') { - styles = { - //styles - 'bold' : ['\x1B[1m', '\x1B[22m'], - 'italic' : ['\x1B[3m', '\x1B[23m'], - 'underline' : ['\x1B[4m', '\x1B[24m'], - 'inverse' : ['\x1B[7m', '\x1B[27m'], - 'strikethrough' : ['\x1B[9m', '\x1B[29m'], - //text colors - //grayscale - 'white' : ['\x1B[37m', '\x1B[39m'], - 'grey' : ['\x1B[90m', '\x1B[39m'], - 'black' : ['\x1B[30m', '\x1B[39m'], - //colors - 'blue' : ['\x1B[34m', '\x1B[39m'], - 'cyan' : ['\x1B[36m', '\x1B[39m'], - 'green' : ['\x1B[32m', '\x1B[39m'], - 'magenta' : ['\x1B[35m', '\x1B[39m'], - 'red' : ['\x1B[31m', '\x1B[39m'], - 'yellow' : ['\x1B[33m', '\x1B[39m'], - //background colors - //grayscale - 'whiteBG' : ['\x1B[47m', '\x1B[49m'], - 'greyBG' : ['\x1B[49;5;8m', '\x1B[49m'], - 'blackBG' : ['\x1B[40m', '\x1B[49m'], - //colors - 'blueBG' : ['\x1B[44m', '\x1B[49m'], - 'cyanBG' : ['\x1B[46m', '\x1B[49m'], - 'greenBG' : ['\x1B[42m', '\x1B[49m'], - 'magentaBG' : ['\x1B[45m', '\x1B[49m'], - 'redBG' : ['\x1B[41m', '\x1B[49m'], - 'yellowBG' : ['\x1B[43m', '\x1B[49m'] - }; - } else if (exports.mode === 'browser') { - styles = { - //styles - 'bold' : ['', ''], - 'italic' : ['', ''], - 'underline' : ['', ''], - 'inverse' : ['', ''], - 'strikethrough' : ['', ''], - //text colors - //grayscale - 'white' : ['', ''], - 'grey' : ['', ''], - 'black' : ['', ''], - //colors - 'blue' : ['', ''], - 'cyan' : ['', ''], - 'green' : ['', ''], - 'magenta' : ['', ''], - 'red' : ['', ''], - 'yellow' : ['', ''], - //background colors - //grayscale - 'whiteBG' : ['', ''], - 'greyBG' : ['', ''], - 'blackBG' : ['', ''], - //colors - 'blueBG' : ['', ''], - 'cyanBG' : ['', ''], - 'greenBG' : ['', ''], - 'magentaBG' : ['', ''], - 'redBG' : ['', ''], - 'yellowBG' : ['', ''] - }; - } else if (exports.mode === 'none') { - return str + ''; - } else { - console.log('unsupported mode, try "browser", "console" or "none"'); - } - return styles[style][0] + str + styles[style][1]; -} - -function applyTheme(theme) { - - // - // Remark: This is a list of methods that exist - // on String that you should not overwrite. - // - var stringPrototypeBlacklist = [ - '__defineGetter__', '__defineSetter__', '__lookupGetter__', '__lookupSetter__', 'charAt', 'constructor', - 'hasOwnProperty', 'isPrototypeOf', 'propertyIsEnumerable', 'toLocaleString', 'toString', 'valueOf', 'charCodeAt', - 'indexOf', 'lastIndexof', 'length', 'localeCompare', 'match', 'replace', 'search', 'slice', 'split', 'substring', - 'toLocaleLowerCase', 'toLocaleUpperCase', 'toLowerCase', 'toUpperCase', 'trim', 'trimLeft', 'trimRight' - ]; - - Object.keys(theme).forEach(function (prop) { - if (stringPrototypeBlacklist.indexOf(prop) !== -1) { - console.log('warn: '.red + ('String.prototype' + prop).magenta + ' is probably something you don\'t want to override. Ignoring style name'); - } - else { - if (typeof(theme[prop]) === 'string') { - addProperty(prop, function () { - return exports[theme[prop]](this); - }); - } - else { - addProperty(prop, function () { - var ret = this; - for (var t = 0; t < theme[prop].length; t++) { - ret = exports[theme[prop][t]](ret); - } - return ret; - }); - } - } - }); -} - - -// -// Iterate through all default styles and colors -// -var x = ['bold', 'underline', 'strikethrough', 'italic', 'inverse', 'grey', 'black', 'yellow', 'red', 'green', 'blue', 'white', 'cyan', 'magenta', 'greyBG', 'blackBG', 'yellowBG', 'redBG', 'greenBG', 'blueBG', 'whiteBG', 'cyanBG', 'magentaBG']; -x.forEach(function (style) { - - // __defineGetter__ at the least works in more browsers - // http://robertnyman.com/javascript/javascript-getters-setters.html - // Object.defineProperty only works in Chrome - addProperty(style, function () { - return stylize(this, style); - }); -}); - -function sequencer(map) { - return function () { - if (!isHeadless) { - return this.replace(/( )/, '$1'); - } - var exploded = this.split(""), i = 0; - exploded = exploded.map(map); - return exploded.join(""); - }; -} - -var rainbowMap = (function () { - var rainbowColors = ['red', 'yellow', 'green', 'blue', 'magenta']; //RoY G BiV - return function (letter, i, exploded) { - if (letter === " ") { - return letter; - } else { - return stylize(letter, rainbowColors[i++ % rainbowColors.length]); - } - }; -})(); - -exports.themes = {}; - -exports.addSequencer = function (name, map) { - addProperty(name, sequencer(map)); -}; - -exports.addSequencer('rainbow', rainbowMap); -exports.addSequencer('zebra', function (letter, i, exploded) { - return i % 2 === 0 ? letter : letter.inverse; -}); - -exports.setTheme = function (theme) { - if (typeof theme === 'string') { - try { - exports.themes[theme] = require(theme); - applyTheme(exports.themes[theme]); - return exports.themes[theme]; - } catch (err) { - console.log(err); - return err; - } - } else { - applyTheme(theme); - } -}; - - -addProperty('stripColors', function () { - return ("" + this).replace(/\x1B\[\d+m/g, ''); -}); - -// please no -function zalgo(text, options) { - var soul = { - "up" : [ - '̍', '̎', '̄', '̅', - '̿', '̑', '̆', '̐', - '͒', '͗', '͑', '̇', - '̈', '̊', '͂', '̓', - '̈', '͊', '͋', '͌', - '̃', '̂', '̌', '͐', - '̀', '́', '̋', '̏', - '̒', '̓', '̔', '̽', - '̉', 'ͣ', 'ͤ', 'ͥ', - 'ͦ', 'ͧ', 'ͨ', 'ͩ', - 'ͪ', 'ͫ', 'ͬ', 'ͭ', - 'ͮ', 'ͯ', '̾', '͛', - '͆', '̚' - ], - "down" : [ - '̖', '̗', '̘', '̙', - '̜', '̝', '̞', '̟', - '̠', '̤', '̥', '̦', - '̩', '̪', '̫', '̬', - '̭', '̮', '̯', '̰', - '̱', '̲', '̳', '̹', - '̺', '̻', '̼', 'ͅ', - '͇', '͈', '͉', '͍', - '͎', '͓', '͔', '͕', - '͖', '͙', '͚', '̣' - ], - "mid" : [ - '̕', '̛', '̀', '́', - '͘', '̡', '̢', '̧', - '̨', '̴', '̵', '̶', - '͜', '͝', '͞', - '͟', '͠', '͢', '̸', - '̷', '͡', ' ҉' - ] - }, - all = [].concat(soul.up, soul.down, soul.mid), - zalgo = {}; - - function randomNumber(range) { - var r = Math.floor(Math.random() * range); - return r; - } - - function is_char(character) { - var bool = false; - all.filter(function (i) { - bool = (i === character); - }); - return bool; - } - - function heComes(text, options) { - var result = '', counts, l; - options = options || {}; - options["up"] = options["up"] || true; - options["mid"] = options["mid"] || true; - options["down"] = options["down"] || true; - options["size"] = options["size"] || "maxi"; - text = text.split(''); - for (l in text) { - if (is_char(l)) { - continue; - } - result = result + text[l]; - counts = {"up" : 0, "down" : 0, "mid" : 0}; - switch (options.size) { - case 'mini': - counts.up = randomNumber(8); - counts.min = randomNumber(2); - counts.down = randomNumber(8); - break; - case 'maxi': - counts.up = randomNumber(16) + 3; - counts.min = randomNumber(4) + 1; - counts.down = randomNumber(64) + 3; - break; - default: - counts.up = randomNumber(8) + 1; - counts.mid = randomNumber(6) / 2; - counts.down = randomNumber(8) + 1; - break; - } - - var arr = ["up", "mid", "down"]; - for (var d in arr) { - var index = arr[d]; - for (var i = 0 ; i <= counts[index]; i++) { - if (options[index]) { - result = result + soul[index][randomNumber(soul[index].length)]; - } - } - } - } - return result; - } - return heComes(text); -} - - -// don't summon zalgo -addProperty('zalgo', function () { - return zalgo(this); -}); diff --git a/example.html b/example.html deleted file mode 100644 index 7a2ae60..0000000 --- a/example.html +++ /dev/null @@ -1,76 +0,0 @@ - - - - - Colors Example - - - - - - \ No newline at end of file diff --git a/example.js b/example.js deleted file mode 100644 index b1e03a4..0000000 --- a/example.js +++ /dev/null @@ -1,77 +0,0 @@ -var colors = require('./colors'); - -//colors.mode = "browser"; - -var test = colors.red("hopefully colorless output"); -console.log('Rainbows are fun!'.rainbow); -console.log('So '.italic + 'are'.underline + ' styles! '.bold + 'inverse'.inverse); // styles not widely supported -console.log('Chains are also cool.'.bold.italic.underline.red); // styles not widely supported -//console.log('zalgo time!'.zalgo); -console.log(test.stripColors); -console.log("a".grey + " b".black); -console.log("Zebras are so fun!".zebra); -console.log('background color attack!'.black.whiteBG) - -// -// Remark: .strikethrough may not work with Mac OS Terminal App -// -console.log("This is " + "not".strikethrough + " fun."); -console.log(colors.rainbow('Rainbows are fun!')); -console.log(colors.italic('So ') + colors.underline('are') + colors.bold(' styles! ') + colors.inverse('inverse')); // styles not widely supported -console.log(colors.bold(colors.italic(colors.underline(colors.red('Chains are also cool.'))))); // styles not widely supported -//console.log(colors.zalgo('zalgo time!')); -console.log(colors.stripColors(test)); -console.log(colors.grey("a") + colors.black(" b")); - -colors.addSequencer("america", function(letter, i, exploded) { - if(letter === " ") return letter; - switch(i%3) { - case 0: return letter.red; - case 1: return letter.white; - case 2: return letter.blue; - } -}); - -colors.addSequencer("random", (function() { - var available = ['bold', 'underline', 'italic', 'inverse', 'grey', 'yellow', 'red', 'green', 'blue', 'white', 'cyan', 'magenta']; - - return function(letter, i, exploded) { - return letter === " " ? letter : letter[available[Math.round(Math.random() * (available.length - 1))]]; - }; -})()); - -console.log("AMERICA! F--K YEAH!".america); -console.log("So apparently I've been to Mars, with all the little green men. But you know, I don't recall.".random); - -// -// Custom themes -// - -// Load theme with JSON literal -colors.setTheme({ - silly: 'rainbow', - input: 'grey', - verbose: 'cyan', - prompt: 'grey', - info: 'green', - data: 'grey', - help: 'cyan', - warn: 'yellow', - debug: 'blue', - error: 'red' -}); - -// outputs red text -console.log("this is an error".error); - -// outputs yellow text -console.log("this is a warning".warn); - -// outputs grey text -console.log("this is an input".input); - -// Load a theme from file -colors.setTheme('./themes/winston-dark.js'); - -console.log("this is an input".input); - diff --git a/examples/normal-usage.js b/examples/normal-usage.js new file mode 100644 index 0000000..2818741 --- /dev/null +++ b/examples/normal-usage.js @@ -0,0 +1,74 @@ +var colors = require('../lib/index'); + +console.log("First some yellow text".yellow); + +console.log("Underline that text".yellow.underline); + +console.log("Make it bold and red".red.bold); + +console.log(("Double Raindows All Day Long").rainbow) + +console.log("Drop the bass".trap) + +console.log("DROP THE RAINBOW BASS".trap.rainbow) + + +console.log('Chains are also cool.'.bold.italic.underline.red); // styles not widely supported + +console.log('So '.green + 'are'.underline + ' ' + 'inverse'.inverse + ' styles! '.yellow.bold); // styles not widely supported +console.log("Zebras are so fun!".zebra); + +// +// Remark: .strikethrough may not work with Mac OS Terminal App +// +console.log("This is " + "not".strikethrough + " fun."); + +console.log('Background color attack!'.black.bgWhite) +console.log('Use random styles on everything!'.random) +console.log('America, Heck Yeah!'.america) + + +console.log('Setting themes is useful') + +// +// Custom themes +// +console.log('Generic logging theme as JSON'.green.bold.underline); +// Load theme with JSON literal +colors.setTheme({ + silly: 'rainbow', + input: 'grey', + verbose: 'cyan', + prompt: 'grey', + info: 'green', + data: 'grey', + help: 'cyan', + warn: 'yellow', + debug: 'blue', + error: 'red' +}); + +// outputs red text +console.log("this is an error".error); + +// outputs yellow text +console.log("this is a warning".warn); + +// outputs grey text +console.log("this is an input".input); + +console.log('Generic logging theme as file'.green.bold.underline); + +// Load a theme from file +colors.setTheme(__dirname + '/../themes/generic-logging.js'); + +// outputs red text +console.log("this is an error".error); + +// outputs yellow text +console.log("this is a warning".warn); + +// outputs grey text +console.log("this is an input".input); + +//console.log("Don't summon".zalgo) \ No newline at end of file diff --git a/examples/safe-string.js b/examples/safe-string.js new file mode 100644 index 0000000..111b363 --- /dev/null +++ b/examples/safe-string.js @@ -0,0 +1,76 @@ +var colors = require('../safe'); + +console.log(colors.yellow("First some yellow text")); + +console.log(colors.yellow.underline("Underline that text")); + +console.log(colors.red.bold("Make it bold and red")); + +console.log(colors.rainbow("Double Raindows All Day Long")) + +console.log(colors.trap("Drop the bass")) + +console.log(colors.rainbow(colors.trap("DROP THE RAINBOW BASS"))); + +console.log(colors.bold.italic.underline.red('Chains are also cool.')); // styles not widely supported + + +console.log(colors.green('So ') + colors.underline('are') + ' ' + colors.inverse('inverse') + colors.yellow.bold(' styles! ')); // styles not widely supported + +console.log(colors.zebra("Zebras are so fun!")); + +console.log("This is " + colors.strikethrough("not") + " fun."); + + +console.log(colors.black.bgWhite('Background color attack!')); +console.log(colors.random('Use random styles on everything!')) +console.log(colors.america('America, Heck Yeah!')); + +console.log('Setting themes is useful') + +// +// Custom themes +// +//console.log('Generic logging theme as JSON'.green.bold.underline); +// Load theme with JSON literal +colors.setTheme({ + silly: 'rainbow', + input: 'grey', + verbose: 'cyan', + prompt: 'grey', + info: 'green', + data: 'grey', + help: 'cyan', + warn: 'yellow', + debug: 'blue', + error: 'red' +}); + +// outputs red text +console.log(colors.error("this is an error")); + +// outputs yellow text +console.log(colors.warn("this is a warning")); + +// outputs grey text +console.log(colors.input("this is an input")); + + +// console.log('Generic logging theme as file'.green.bold.underline); + +// Load a theme from file +colors.setTheme(__dirname + '/../themes/generic-logging.js'); + +// outputs red text +console.log(colors.error("this is an error")); + +// outputs yellow text +console.log(colors.warn("this is a warning")); + +// outputs grey text +console.log(colors.input("this is an input")); + +// console.log(colors.zalgo("Don't summon him")) + + + diff --git a/lib/colors.js b/lib/colors.js new file mode 100644 index 0000000..156879f --- /dev/null +++ b/lib/colors.js @@ -0,0 +1,175 @@ +/* + +The MIT License (MIT) + +Original Library + - Copyright (c) Marak Squires + +Additional functionality + - Copyright (c) Sindre Sorhus (sindresorhus.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +*/ + +var colors = {}; +module['exports'] = colors; + +colors.themes = {}; + +var ansiStyles = colors.styles = require('./styles'); +var defineProps = Object.defineProperties; + +colors.supportsColor = require('./system/supports-colors'); + +if (typeof colors.enabled === "undefined") { + colors.enabled = colors.supportsColor; +} + +colors.strip = function(str){ + return ("" + str).replace(/\x1B\[\d+m/g, ''); +}; + +var stylize = colors.stylize = function stylize (str, style) { + return ansiStyles[style].open + str + ansiStyles[style].close; +} + +var matchOperatorsRe = /[|\\{}()[\]^$+*?.]/g; +var escapeStringRegexp = function (str) { + if (typeof str !== 'string') { + throw new TypeError('Expected a string'); + } + return str.replace(matchOperatorsRe, '\\$&'); +} + +function build(_styles) { + var builder = function builder() { + return applyStyle.apply(builder, arguments); + }; + builder._styles = _styles; + // __proto__ is used because we must return a function, but there is + // no way to create a function with a different prototype. + builder.__proto__ = proto; + return builder; +} + +var styles = (function () { + var ret = {}; + ansiStyles.grey = ansiStyles.gray; + Object.keys(ansiStyles).forEach(function (key) { + ansiStyles[key].closeRe = new RegExp(escapeStringRegexp(ansiStyles[key].close), 'g'); + ret[key] = { + get: function () { + return build(this._styles.concat(key)); + } + }; + }); + return ret; +})(); + +var proto = defineProps(function colors() {}, styles); + +function applyStyle() { + var args = arguments; + var argsLen = args.length; + var str = argsLen !== 0 && String(arguments[0]); + if (argsLen > 1) { + for (var a = 1; a < argsLen; a++) { + str += ' ' + args[a]; + } + } + + if (!colors.enabled || !str) { + return str; + } + + var nestedStyles = this._styles; + + var i = nestedStyles.length; + while (i--) { + var code = ansiStyles[nestedStyles[i]]; + str = code.open + str.replace(code.closeRe, code.open) + code.close; + } + + return str; +} + +function applyTheme (theme) { + for (var style in theme) { + (function(style){ + colors[style] = function(str){ + return colors[theme[style]](str); + }; + })(style) + } +} + +colors.setTheme = function (theme) { + if (typeof theme === 'string') { + try { + colors.themes[theme] = require(theme); + applyTheme(colors.themes[theme]); + return colors.themes[theme]; + } catch (err) { + console.log(err); + return err; + } + } else { + applyTheme(theme); + } +}; + +function init() { + var ret = {}; + Object.keys(styles).forEach(function (name) { + ret[name] = { + get: function () { + return build([name]); + } + }; + }); + return ret; +} + +var sequencer = function sequencer (map, str) { + var exploded = str.split(""), i = 0; + exploded = exploded.map(map); + return exploded.join(""); +}; + +// custom formatter methods +colors.trap = require('./custom/trap'); +colors.zalgo = require('./custom/zalgo'); + +// maps +colors.maps = {}; +colors.maps.america = require('./maps/america'); +colors.maps.zebra = require('./maps/zebra'); +colors.maps.rainbow = require('./maps/rainbow'); +colors.maps.random = require('./maps/random') + +for (var map in colors.maps) { + (function(map){ + colors[map] = function (str) { + return sequencer(colors.maps[map], str); + } + })(map) +} + +defineProps(colors, init()); \ No newline at end of file diff --git a/lib/custom/trap.js b/lib/custom/trap.js new file mode 100644 index 0000000..5a8f2a4 --- /dev/null +++ b/lib/custom/trap.js @@ -0,0 +1,44 @@ +module['exports'] = function runTheTrap (text, options) { + var result = ""; + text = text.split(''); + var trap = { + a: ["\u0040", "\u0104", "\u023a", "\u0245", "\u0394", "\u039b", "\u0414"], + b: ["\u00df", "\u0181", "\u0243", "\u026e", "\u03b2", "\u0e3f"], + c: ["\u00a9", "\u023b", "\u03fe"], + d: ["\u00d0", "\u018a", "\u0500" , "\u0501" ,"\u0502", "\u0503"], + e: ["\u00cb", "\u0115", "\u018e", "\u0258", "\u03a3", "\u03be", "\u04bc", "\u0a6c"], + f: ["\u04fa"], + g: ["\u0262"], + h: ["\u0126", "\u0195", "\u04a2", "\u04ba", "\u04c7", "\u050a"], + i: ["\u0f0f"], + j: ["\u0134"], + k: ["\u0138", "\u04a0", "\u04c3", "\u051e"], + l: ["\u0139"], + m: ["\u028d", "\u04cd", "\u04ce", "\u0520", "\u0521", "\u0d69"], + n: ["\u00d1", "\u014b", "\u019d", "\u0376", "\u03a0", "\u048a"], + o: ["\u00d8", "\u00f5", "\u00f8", "\u01fe", "\u0298", "\u047a", "\u05dd", "\u06dd", "\u0e4f"], + p: ["\u01f7", "\u048e"], + q: ["\u09cd"], + r: ["\u00ae", "\u01a6", "\u0210", "\u024c", "\u0280", "\u042f"], + s: ["\u00a7", "\u03de", "\u03df", "\u03e8"], + t: ["\u0141", "\u0166", "\u0373"], + u: ["\u01b1", "\u054d"], + v: ["\u05d8"], + w: ["\u0428", "\u0460", "\u047c", "\u0d70"], + x: ["\u04b2", "\u04fe", "\u04fc", "\u04fd"], + y: ["\u00a5", "\u04b0", "\u04cb"], + z: ["\u01b5", "\u0240"] + } + text.forEach(function(c){ + c = c.toLowerCase(); + var chars = trap[c] || [" "]; + var rand = Math.floor(Math.random() * chars.length); + if (typeof trap[c] !== "undefined") { + result += trap[c][rand]; + } else { + result += c; + } + }); + return result; + +} diff --git a/lib/custom/zalgo.js b/lib/custom/zalgo.js new file mode 100644 index 0000000..e94ef9a --- /dev/null +++ b/lib/custom/zalgo.js @@ -0,0 +1,103 @@ +// please no +var zalgo = module['exports'] = function zalgo(text, options) { + var soul = { + "up" : [ + '̍', '̎', '̄', '̅', + '̿', '̑', '̆', '̐', + '͒', '͗', '͑', '̇', + '̈', '̊', '͂', '̓', + '̈', '͊', '͋', '͌', + '̃', '̂', '̌', '͐', + '̀', '́', '̋', '̏', + '̒', '̓', '̔', '̽', + '̉', 'ͣ', 'ͤ', 'ͥ', + 'ͦ', 'ͧ', 'ͨ', 'ͩ', + 'ͪ', 'ͫ', 'ͬ', 'ͭ', + 'ͮ', 'ͯ', '̾', '͛', + '͆', '̚' + ], + "down" : [ + '̖', '̗', '̘', '̙', + '̜', '̝', '̞', '̟', + '̠', '̤', '̥', '̦', + '̩', '̪', '̫', '̬', + '̭', '̮', '̯', '̰', + '̱', '̲', '̳', '̹', + '̺', '̻', '̼', 'ͅ', + '͇', '͈', '͉', '͍', + '͎', '͓', '͔', '͕', + '͖', '͙', '͚', '̣' + ], + "mid" : [ + '̕', '̛', '̀', '́', + '͘', '̡', '̢', '̧', + '̨', '̴', '̵', '̶', + '͜', '͝', '͞', + '͟', '͠', '͢', '̸', + '̷', '͡', ' ҉' + ] + }, + all = [].concat(soul.up, soul.down, soul.mid), + zalgo = {}; + + function randomNumber(range) { + var r = Math.floor(Math.random() * range); + return r; + } + + function is_char(character) { + var bool = false; + all.filter(function (i) { + bool = (i === character); + }); + return bool; + } + + + function heComes(text, options) { + var result = '', counts, l; + options = options || {}; + options["up"] = options["up"] || true; + options["mid"] = options["mid"] || true; + options["down"] = options["down"] || true; + options["size"] = options["size"] || "maxi"; + text = text.split(''); + for (l in text) { + if (is_char(l)) { + continue; + } + result = result + text[l]; + counts = {"up" : 0, "down" : 0, "mid" : 0}; + switch (options.size) { + case 'mini': + counts.up = randomNumber(8); + counts.min = randomNumber(2); + counts.down = randomNumber(8); + break; + case 'maxi': + counts.up = randomNumber(16) + 3; + counts.min = randomNumber(4) + 1; + counts.down = randomNumber(64) + 3; + break; + default: + counts.up = randomNumber(8) + 1; + counts.mid = randomNumber(6) / 2; + counts.down = randomNumber(8) + 1; + break; + } + + var arr = ["up", "mid", "down"]; + for (var d in arr) { + var index = arr[d]; + for (var i = 0 ; i <= counts[index]; i++) { + if (options[index]) { + result = result + soul[index][randomNumber(soul[index].length)]; + } + } + } + } + return result; + } + // don't summon him + return heComes(text); +} diff --git a/lib/extendStringPrototype.js b/lib/extendStringPrototype.js new file mode 100644 index 0000000..97e7c6c --- /dev/null +++ b/lib/extendStringPrototype.js @@ -0,0 +1,113 @@ +var colors = require('./colors'), + styles = require('./styles'); + +module['exports'] = function () { + + // + // Extends prototype of native string object to allow for "foo".red syntax + // + var addProperty = function (color, func) { + String.prototype.__defineGetter__(color, func); + }; + + var sequencer = function sequencer (map, str) { + return function () { + var exploded = this.split(""), i = 0; + exploded = exploded.map(map); + return exploded.join(""); + } + }; + + var stylize = function stylize (str, style) { + return styles[style].open + str + styles[style].close; + } + + addProperty('strip', function () { + return colors.strip(this); + }); + + addProperty("trap", function(){ + return colors.trap(this); + }); + + addProperty("zalgo", function(){ + return colors.zalgo(this); + }); + + addProperty("zebra", function(){ + return colors.zebra(this); + }); + + addProperty("rainbow", function(){ + return colors.rainbow(this); + }); + + addProperty("random", function(){ + return colors.random(this); + }); + + addProperty("america", function(){ + return colors.america(this); + }); + + // + // Iterate through all default styles and colors + // + var x = Object.keys(colors.styles); + x.forEach(function (style) { + addProperty(style, function () { + return stylize(this, style); + }); + }); + + function applyTheme(theme) { + // + // Remark: This is a list of methods that exist + // on String that you should not overwrite. + // + var stringPrototypeBlacklist = [ + '__defineGetter__', '__defineSetter__', '__lookupGetter__', '__lookupSetter__', 'charAt', 'constructor', + 'hasOwnProperty', 'isPrototypeOf', 'propertyIsEnumerable', 'toLocaleString', 'toString', 'valueOf', 'charCodeAt', + 'indexOf', 'lastIndexof', 'length', 'localeCompare', 'match', 'replace', 'search', 'slice', 'split', 'substring', + 'toLocaleLowerCase', 'toLocaleUpperCase', 'toLowerCase', 'toUpperCase', 'trim', 'trimLeft', 'trimRight' + ]; + + Object.keys(theme).forEach(function (prop) { + if (stringPrototypeBlacklist.indexOf(prop) !== -1) { + console.log('warn: '.red + ('String.prototype' + prop).magenta + ' is probably something you don\'t want to override. Ignoring style name'); + } + else { + if (typeof(theme[prop]) === 'string') { + addProperty(prop, function () { + return colors[theme[prop]](this); + }); + } + else { + addProperty(prop, function () { + var ret = this; + for (var t = 0; t < theme[prop].length; t++) { + ret = exports[theme[prop][t]](ret); + } + return ret; + }); + } + } + }); + } + + colors.setTheme = function (theme) { + if (typeof theme === 'string') { + try { + colors.themes[theme] = require(theme); + applyTheme(colors.themes[theme]); + return colors.themes[theme]; + } catch (err) { + console.log(err); + return err; + } + } else { + applyTheme(theme); + } + }; + +}; \ No newline at end of file diff --git a/lib/index.js b/lib/index.js new file mode 100644 index 0000000..96d2b84 --- /dev/null +++ b/lib/index.js @@ -0,0 +1,12 @@ +var colors = require('./colors'); +module['exports'] = colors; + +// Remark: By default, colors will add style properties to String.prototype +// +// If you don't wish to extend String.prototype you can do this instead and native String will not be touched +// +// var colors = require('colors/safe); +// colors.red("foo") +// +// +var extendStringPrototype = require('./extendStringPrototype')(); \ No newline at end of file diff --git a/lib/maps/america.js b/lib/maps/america.js new file mode 100644 index 0000000..a07d832 --- /dev/null +++ b/lib/maps/america.js @@ -0,0 +1,12 @@ +var colors = require('../colors'); + +module['exports'] = (function() { + return function (letter, i, exploded) { + if(letter === " ") return letter; + switch(i%3) { + case 0: return colors.red(letter); + case 1: return colors.white(letter) + case 2: return colors.blue(letter) + } + } +})(); \ No newline at end of file diff --git a/lib/maps/rainbow.js b/lib/maps/rainbow.js new file mode 100644 index 0000000..a7ce24e --- /dev/null +++ b/lib/maps/rainbow.js @@ -0,0 +1,13 @@ +var colors = require('../colors'); + +module['exports'] = (function () { + var rainbowColors = ['red', 'yellow', 'green', 'blue', 'magenta']; //RoY G BiV + return function (letter, i, exploded) { + if (letter === " ") { + return letter; + } else { + return colors[rainbowColors[i++ % rainbowColors.length]](letter); + } + }; +})(); + diff --git a/lib/maps/random.js b/lib/maps/random.js new file mode 100644 index 0000000..5027f08 --- /dev/null +++ b/lib/maps/random.js @@ -0,0 +1,8 @@ +var colors = require('../colors'); + +module['exports'] = (function () { + var available = ['underline', 'inverse', 'grey', 'yellow', 'red', 'green', 'blue', 'white', 'cyan', 'magenta']; + return function(letter, i, exploded) { + return letter === " " ? letter : letter[available[Math.round(Math.random() * (available.length - 1))]]; + }; +})(); \ No newline at end of file diff --git a/lib/maps/zebra.js b/lib/maps/zebra.js new file mode 100644 index 0000000..bf7dcde --- /dev/null +++ b/lib/maps/zebra.js @@ -0,0 +1,5 @@ +var colors = require('../colors'); + +module['exports'] = function (letter, i, exploded) { + return i % 2 === 0 ? letter : colors.inverse(letter); +}; \ No newline at end of file diff --git a/lib/styles.js b/lib/styles.js new file mode 100644 index 0000000..067d590 --- /dev/null +++ b/lib/styles.js @@ -0,0 +1,77 @@ +/* +The MIT License (MIT) + +Copyright (c) Sindre Sorhus (sindresorhus.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +*/ + +var styles = {}; +module['exports'] = styles; + +var codes = { + reset: [0, 0], + + bold: [1, 22], + dim: [2, 22], + italic: [3, 23], + underline: [4, 24], + inverse: [7, 27], + hidden: [8, 28], + strikethrough: [9, 29], + + black: [30, 39], + red: [31, 39], + green: [32, 39], + yellow: [33, 39], + blue: [34, 39], + magenta: [35, 39], + cyan: [36, 39], + white: [37, 39], + gray: [90, 39], + grey: [90, 39], + + bgBlack: [40, 49], + bgRed: [41, 49], + bgGreen: [42, 49], + bgYellow: [43, 49], + bgBlue: [44, 49], + bgMagenta: [45, 49], + bgCyan: [46, 49], + bgWhite: [47, 49], + + // legacy styles for colors pre v1.0.0 + blackBG: [40, 49], + redBG: [41, 49], + greenBG: [42, 49], + yellowBG: [43, 49], + blueBG: [44, 49], + magentaBG: [45, 49], + cyanBG: [46, 49], + whiteBG: [47, 49] + +}; + +Object.keys(codes).forEach(function (key) { + var val = codes[key]; + var style = styles[key] = []; + style.open = '\u001b[' + val[0] + 'm'; + style.close = '\u001b[' + val[1] + 'm'; +}); \ No newline at end of file diff --git a/lib/system/supports-colors.js b/lib/system/supports-colors.js new file mode 100644 index 0000000..3e008aa --- /dev/null +++ b/lib/system/supports-colors.js @@ -0,0 +1,61 @@ +/* +The MIT License (MIT) + +Copyright (c) Sindre Sorhus (sindresorhus.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +*/ + +var argv = process.argv; + +module.exports = (function () { + if (argv.indexOf('--no-color') !== -1 || + argv.indexOf('--color=false') !== -1) { + return false; + } + + if (argv.indexOf('--color') !== -1 || + argv.indexOf('--color=true') !== -1 || + argv.indexOf('--color=always') !== -1) { + return true; + } + + if (process.stdout && !process.stdout.isTTY) { + return false; + } + + if (process.platform === 'win32') { + return true; + } + + if ('COLORTERM' in process.env) { + return true; + } + + if (process.env.TERM === 'dumb') { + return false; + } + + if (/^screen|^xterm|^vt100|color|ansi|cygwin|linux/i.test(process.env.TERM)) { + return true; + } + + return false; +})(); \ No newline at end of file diff --git a/package.json b/package.json index 7af24a1..279ea7a 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "colors", "description": "get colors in your node.js console like what", - "version": "0.6.2", + "version": "1.0.0", "author": "Marak Squires", "homepage": "https://github.com/Marak/colors.js", "bugs": "https://github.com/Marak/colors.js/issues", @@ -10,8 +10,11 @@ "type": "git", "url": "http://github.com/Marak/colors.js.git" }, + "scripts": { + "test": "node tests/basic-test.js && node tests/safe-test.js" + }, "engines": { "node": ">=0.1.90" }, - "main": "colors" + "main": "./lib/index" } diff --git a/safe.js b/safe.js new file mode 100644 index 0000000..a6a1f3a --- /dev/null +++ b/safe.js @@ -0,0 +1,9 @@ +// +// Remark: Requiring this file will use the "safe" colors API which will not touch String.prototype +// +// var colors = require('colors/safe); +// colors.red("foo") +// +// +var colors = require('./lib/colors'); +module['exports'] = colors; \ No newline at end of file diff --git a/screenshots/colors.png b/screenshots/colors.png new file mode 100644 index 0000000000000000000000000000000000000000..9f4f0748b8e711aee873856fc9e0707e2bd7dc40 GIT binary patch literal 82801 zcmaI6W0a<`voG4VZBE;^t!dk~ZA{y?ZQGc(ZQIt{y7S-r+;jF?XWjdJN~-Etm8vHz zNmUY|@LK{N1_uTR2nb$EQd9{D2!sm=2zVX}i3oi}y&=cnVw^0w!7$J@T~)y8r2al|%RQ96VY8oNLkS$YUc$|B!{>=$%N zxHK{LJ)isG*S8PB?(S>f?z6|%>T|c=si)qltKO;3Y4^+}L_k$85;Ah65fD){mYma; z>94(;25le#XvP3gA|P-JD1Jrc(3h8$y`S#hI6?C6+{r}Oue|0Tci^Hr{bWR-a6a0X zmzW3WKkWoSE=lrWR5(Dint5Y^XHd*DLFpl2@WF4)*pQziawb<_xUb&_oIE%pGiX3) ztY9EiKtLN}l$hbq&;ed&7C`+>$i9EV>obA=dhrK>=>xTQ6G@QM(q>1?3(@X>5qg1q zgQ7z1{G9zl0{I^3`v9>X43!HiBoT&o?9==9-x(A(&hPWn^|||vihf`Mo@X;>59te4 z`WwkvFdO^K-0(|64;k6^=uKh=2hDaLjtTY%4ss;D>vO=FiI_eV=~3`qO|l(51Mw^P zfXHieLud-DAzVJ0>4~p{E?LVbziE>&wxupFg6gjWM!}ZUeysm{pkl*s|Kt1nz>!w} z_W>}O2aiP|Kkh)Vc?NF?RzP?`t3M#f>r|eZ)OqXyzOP*W zi)<4E3;)ap;dsuBRfKgsV=B;B^zjWcLsJmWR)hvDaq4FRo;B>lwWZWGCcyWG^V#-0QsDncfp0^SANpt{Rkr z@C(fPkYYcK*F56iPcPDM+uOcwv`56lI0$YkZq+>~Yh)oPT3A3C_^Q4d zHe9GqmH)_LoGupAnXYOyvN$FH8-O(wx)0Kbg?{EJ63veXs!I9gj`q{V(b)f!)@JPg zOa|5+_5~I7!h;2Wio%Ex7fuQe4kiwZHMqPWFWw(?MoK}NUz}eKGG@(?0ovbqSjUEL zc=@A_;fD)UA$JFyfB1Fr2k8*n-F_oXRMMlY}4~6D0sC z0qYksSEvcm`j}@iT7|G3@w6o5!XG#ih6GC!g7;9H{5eV-G}uT?vd}~c%X~ORHA?d( zeia~U6!bXm*a=be{0W6sg_v@LCFLd9B{VDGmPiN-D^^@BB)X^-LENJ2xvu$d3lsn& zH-1hSy~t{z_MVPUY_2dv;VKg+9E&&*DXhc--eJ)FfT$6I@o&Q!<60veCPb!Lrp0u! zDfU#1$v-J0R)%!-H)}vwz&0@Kh}wa+{ro|@kF+m52w}!U5r<3rHn08QhbRtZ4rJ}P z?QUB{H*|LBaih)$CHI{kJiNe!G4cbL2X*_mhhcY3Z-i(|XrE}(Xl7_#RN-jjXr5@x zXtrn~XoQsPRM?baR4tU(l)hAll(PzYr8WguW!WWL#YV*_WeX)vr7)%3(yD^0GSA^w zK~@==nOfmmNgILO;Q%OC;AgoDy9>(;R~&L2Djeg?9#$sS4AvCZYgPu!R7*?CVGDQ* z_eJqVvjw$z{`{QcFQHLc3JG(eQ<*eTb6adnoR0-%+HNAjZBSH4P8z7#T zgup!tXfFcOQy2Rq*F>tbTf^*7oiEz$3?d2s>LD|<)<>;D!1rC2O(qLZwoBEqV`s^2W*A}6aeB}c1z6}y(r8P*=+ z(d`lQ77SJs+$&lvn(?>(*KZ{eX3<7bCqWpp5^8ix)nCgDF^OtP2#NFw1jz#v786LO z6DH!OmL~9~#-`RLWyfnr)yIj)H)Fo3m6U`H56H*g$6Z)#fs-G(K<aD$44l70Z>=RZ->M6_{0V zR`nKZ*4YbZD}SwUEXgfft!k|+EXAz1R{(`{RrrOvHGE~HwTETSnx{3j@$^D%D(=$q zg0nKWi95-?`TRnCvi>82YyGSFgL{7piVf@c*@kAtVZ?tGK@_nW(;bS8T$5WQ>5`w5 z`?A3t0184Os6RE1EW#RM>frJrtnFq$DkS zR$*IHStq(i!B31VkdK-Tsx75jc#k5iX|5fw^|WHP#WnX`1~}KdQ#yIvmY=1ctsVcp zIyzUme%f9idyjsk!Guo3O8c$uwc1mwT5D}bZntiyeDiP+EgzT6rV4&eJIGvpe9+_tEhZcGGt%bt`pO{W$2=;i>9vi+lxT8mwv$duwz{ zMrfSplLxL3x~sG6DWKbD(}(!o`Mv(_4BQFK1^gHY2=ok$5*iUY{nHDP1*s3G2ipK! z0k;nA3fqG$j(mc?B5OhtibNRt7(xg~7#$xg8Ic~j6v>O(A=*fyDoU*QQJ7h%X%N4O zON#7FV#ck;&`S9-3cL#H3W<$~g7`8bHJlUufn<;2PX?T{mo%3_neM^r2#DV=SQr{J zydBDs8k8DMGK;(7c6z2Y#Qz_;d_@%|jUZ=-O_DVHjcAufq7wJOt- z9V!MddCpPc*Yt4W+2;6?3KbUD8(E>sQkb z9=(3QZtra4gyRhEwCJopi!S?Q0>Qd=XMRB7T>fyYwnh3 zui=N0!(USq8<*R& zrS#jit;xAG{ZZpl4t@NL{@=xYW*#{l<1Csl;t$g?R4oJ3 zCFWD7aSvFP3E#wzXKW+y+P z0=w9>l&5g+QP$pB zeBxY~A>q(DsS1g%WP>8tJcp5&kvW3RNWg;MXyV3vbiiPnqjjm<_ss1d5=?*6TvLygh;^Q&~ z{f-4SCaw3H$X2b&kx#Au=cSEGTzPxHj%mFz{oCF6c@6KfI?INTgIa^C5x!0K)sNU~ zc6^K+azr?S3*H5f>MgQey6vIOre~9*^O&7vb8o;Azzy&LF@p#|q~e2|9Sy_PKZ+KO z-iV>q2kX0{we?5Uf6?G-<8CN@A~p9lXEC$({OF%S!1Jdy2w^IupagLar*=Zo6zwPq zo%=BObOF8$Fdpd{+AV4q))Y;V(3O1*aQmYdMjUZZ%#taV#}-(V`UOt`i@BBJspLuX z-uY$@#t++ziG$Hg;UxBytP$K^6Wsnc)g(`)!6hI%ajMg%ODD2B2BdE=)2L4=#3?AU zg*xqmrv>L33Z5*+K9i%Ru=&|l!?pJu;ganf6ZaSP4aWjwDKi1@>$lk`-A}5o`r$YT;N`Le7J&<1|<_GFC_^jb2u6vIu1Sp=y^J*BP8N5*=QMg z_U|b^6{mLQiW|w%`M{$L<0=YD4_D_qUO6zR`%Z3k@M+8 z<%2dX1g!b2JqAmvq|RL5nHyE%lZmFP=j(9?%!KrKRjMlSa+y`F{$*dU%b)Yo3A(gR zCfC!8OB@JX0k-`taP8(B?q;vuC>tK9A6aij3DeUWNIFEGJ+I||X>nIq*|pTyqID1Y zEd4Y3D<%RO+zBE&Umy3@Q=#|K@!4p@wBv^QCu(G!9QpQ6eCb2kruoS()9ghb;+F#F zDqCMCQDgg$@-t>-3F)wnw5_bY24l67joKA39(1;p4)oSN?|nCukKyMI z2tv??Ft6}#2#**-)I`+pNYilZaCw2p2dxJNG!isR z^s3~kWV7TXRZ-R4DgtF?r7SgpD#P-IVo$|MJzNX@)%7Boip^@w;@O&Adxt@VRfpxX zP{;C!=5dKd>ZX2O6o;Jh`nx8y79Vp}JGuJ(CQn=Mfmj0uqo4WxRO9ZX3YMnF=1IBL zAv^Y)ts6qVO!u;D$4#0}chlXWFVEZoJph>7VB)KCp7bu7fPjAzP=cV#o~(kzT}gcL z+?QddD8@nB-A?$$n2VBRvRtzdob!~{)mz}oA2P>?`!3Wa6l~N!JRE^f63e@>rXu;I zt~gixTkiRkg%kki^}zVd6C}27S#A!&cs6%ae2bSGsW*!`{!J~cXVUu@xNQjhDP$yu zv;$@^!-f8aHV)+LG+?qv-He*Owo#2roo5xV+if3kxDk>i+s10=y;8EY${x*X#}UE7 z(~8%tz0JK5+EKUl`)usO#=rh8{J6nvwfAO-Z`eTs_v&lKeBIv^i31Jrc?{c?u*39` zR!8whaal$0iP#uTO#h8YS$5Kn3qR@xeF zyE!u1GTCa0ofPC`_(XR~5A7)f16^OCgFch;xU!~Li1=}jRoMpFGbs+394eiZt=Ban zqaVRsSDpXjUZY{byyl@Yc}3~CS(qC>V_ZE{{g$<+k8#y%DDE9q*{ zQW4_cExrJL3qp0AzSJ{^Gc}aSgg29?hAmVSDqG81iZtfmd8w0lW0B)00Drs|hfgnHhJANwb9+?5bJJTTMb?%TH^I|3_?`vW}^i`y#ltX?7j zX~>a0*j^~YYrNCU@Ep9X6@Tw*zS-;-iH(qXc~5=XwA4P+n(*2kE#;5-_JVfJ_at+k z$5p@poQZ+nIO^X(ymYQJ2>Su{!I*MV1WC%o$Yj#%v0sfb2Vtk)0xA#}>{fU&Vl;(( z^X3LK7T}~I_d_a1{D#X7qxB-3OgbobAa!AN`3A+D(hbts;#~0ZL-OTv<%A0wb8w4* z`R`&L`8pAS38WDyEa&uJ=^GiZ4fz^&jVSBUYwzoX&PZIEoVQNM?e|-&p4lGk9+U4j z@9gi^V6o5u=nPnyD21r0$kyUqj*;iL+G zBzIA0WWIlVnQMw{xMk@&_k$*Gnvd7}`Stxq{?+DQ>ml{-{)O%Z7tsLG1$F|F0Pz_1 zkz6grKSqTdKiVp4V0eR&lA9B=E;l~)?V{diA%e6nX*u>7?z6x&_&}! zb|trol*`-c^Z@}w0bP%Jfu5kx;VjYOT;YA5rV<@iou?|QR%~@+2dyt=smIEqJ!u)w zYjuyH^jgZ>?KC&+AWp55+uJD@Ah38quPTOQm z_;C8nA4`YAALBc(J@LccG}UI*mwDIYQFA}q^c)fMK5efp;Adz1qa|RlqKcC~6un>= zk7yT2kWQr~f`vr&7w%p>aj$JRRCYi%j&lOX?|rzOe#yNV4e!hOj2{ktYO>fEqJC=) z>54R)_XZ>vJ5OprRuRIPl%e9F;=RJ#;=mH!0`tu3><`u()(F;P`c}q!hCm~0Q?4nj zA;&4w>0jp=$7iSAqw!<8BiJK%)Or+Fj0MycbS8`zWM|CRl<;KP#EE43go*^)6x`%I z^}o~+lvx$Ql_ynv3i=C2i;XL>s~wd*m2oTz9B}N^Y<{K_h9|vMYo9eGFwxB9HYryN zSG$~*Jf=MUPA!gI#{(@qzOysE!C%^XOu-cV!oBx?LyR-L_{~U0=w3Nvc)4f|f=)3P z;R%t`fykx$KK_OC1s_u45?)C?v0uE3xmI~Eq}u|I{651y2g|Cvm9uR3tBx(69K&{O%bLsbY$NRR>}k8pcKCLrt;%jX zo(7)|Cyq{SlCz6t(6dJ$ClJ)3L1C&A4n?R8_I*lO7P(7ai@Y`5&R;ouHY*=7T(|GF z;8Y$flAp4lMoqt3pYAVX>z|3hXV zA^I;77i&He4LJoO5ql?7A~t#^dS()S7$PDfUMCYXZY5Fi{{{co<0G+fadF^gU~qSL zr*~(ew|6pUVB+H9Vqj!uU}mQKCqd`zY3E|-L1*Vo`rk_aUp=Cx&c;rb4lb7Vc0~Wt zYiMNe>cU4t@*hM0`}^;4ntE9NA4_)5|I4j^4l?|Q!@xw($nd{)|AX@Whsv#B>0xT4 zA!=!BYUljV20t4+7w><`|6iQ{WAT3=HUAHim7VQ>BL4^He<67p{^P*^aOl6I^sll(HqXH(1rh=vrI7SQ|Oal!qHRdau zm|-&G|Lmf!znJ7QiwvS7;K{tKYTt9K-B(%Lb^`(=fCU^4^sjasfZPvd0LBRNe|P(j zqXVv-e&cc2YOZ_E&(Bqzk8Y2)6TeO8LCI!uDNi1+D*D>cjATbi{df+&FZ(}$STQp( zAb#6#^mLW$SA?XTi-0{KX6C3-d|La(QNq1J!-06xWI@Mw_@9U@f{;#Q)}orzdw9+l zhD2dZwI_I5NoUuq@>c$Vl2vRNyBNuj^b?WrO zoC($|9C+~25hwD$WIfJgwuN>?`k#-U3heas#tpw>I;P3`J!AIQ6JWvy(u}FiBe^fq zU)}M5Xz%!+FSh~{1G%`npVxW&-TW%_1QHC}1%DrL7|AS?6ag1J|3K8M2!%27h&W2K z@9;hUi%_8DRcY`By?+WLM&zHDfS1nPo8})PJhwVNqpc{90P)hr)c^TM#n3_RN@HoY z{z=>Oi=z)fXX2+uYkd;A{qcIc+2{Wl$>nF}d*0NA@}ZjMSF1}+byj9O6agOPG$;vY z&9B$~q$I?0=k>Dq3F9;P5fxncJbR=&kn@?_R8VKT{Fh7Sfn^Z*jM~R+e{|iM-^=wR zJsPY9q|%W7-E7s{>SJ|URxnPO*T5iHRY$? z;vJ)R@Evw1Gg;QdE#=31-)V)pp!;3sX0prfZ7*0u)xn`2Bt1ID9Pz99ye5Ruc{#74 zoQQ+JxvIOK_9B(SEP9>_ZDeBbl|uH1(R<)THO_4G5^bQhaCWEtIzzSDf*A(LRy$V{ z4x`%RzM#9<0)(Wh!D+OML7>ZuL+-pt1diVZIS#Wr!|`yf*a97hy=vOZrkcz1sm-2W z_s#JZ=eXzX4l7Z0GVnR79qC!_eJZnKZ(fIl#@b&)xBhso8Js4!Q-Fbr0K}SweHjm6 z_hk$lL3>Bir*n>?O(2N`0`Nb`7JJ7=b`WiMcs2@LfD#eBObwCocTpCW{+5=v-wBe} z_jFM~VRD4O4BPbwT=ja&nA2(`qJwu%sp`|}4g=aLr;AhN+rT`Z#xgt3=C?fb9Io#f zV7)%ui}!{OWAulK?{=72I_63a=9sJk!duL$zpi2(% zh(-9?aKBEYczpU@a!{NEIcL5)*bcX-`sh^J_)PHv-PHwpz*Ue^oGa6Sp*e6_u{qt^ zU`5w-vSqO-5*vekuhmH}cPu$0gmzvgU;WD6al&5#e-7J}m@u>YzrCY-BNc|{Vzrck zYUu{8-;f#HLAed2P#z}1h%rqGts&WzzqDB}7Z&JpPrXH#eG~5j!>5YNG9`UC3WS?a zev|ec7#p5Bnc4G89NT{|1zr%%9Ve-jsZ-UGP2$}RA7jQV5xmU-DZU?LR7oImmq?^L zNs8wykNyyl9oH>A4FU>ssOWxIrRaL>S?{hQ?$wBhH~wn+@z!g)F@C>gYNJoeQDe*BWL-CL)c@j4j-%|Niyae@N474wIdsTXxFi+Oznk z8ffju>^(E%Y!fy7&YpT>sMW$Y+RB@oCI>a9eWwbo8&I7GV4SAP@ZX8Vd7@h;ES&oF z@rSoP$T+L4h8H5Cnri(=aUjUD_~Gx`eCEF`;Lkug1MGm84_-A9Tw><)KJX=%1a#Mx&#b9)Q%xif0NAUqmgMk2`xCW8~UA9=%dGVjA>xX{wmbJ2|6!+w!q4Vw*h z(;Dke?DRkJq%=(@M1CJeigKR!h-_9>dQ>;^dURukSAM)nF=_HRF*`9n-K4HKR>q^| zt-P{)fB&nm_wor(W^(^xQdN8~l;k4T-P@K|zPKsFZu*|8(|M(pv&_(R*)GPTfdBV~ zgSLQ2mCc)T$PqQ|O6X}OM`o^lHe0S4ep5Yw7dqteb^Z(8&2@wsj`y2!hFc}*pB9e{ zi@JXco{;+Jj4${)k#@fq6ToEF$A=tO0!?_8M^^n$?ML*Hoki)^s;|7+rT3^LtlaDG zGs-($vs2jl-4a`?c?iUj?3IBjug~_kV_&-D(ejGdgxdEc=do?x{L8x!*!83< z?VY!}4;QL*H+?-?>_xYScWAutIqwz7F5B9F><0&;;-k zC)>AnChFqJPQA&qI}4}Q?HWElDT{Fj&MUxXrm!t@(6(82UB~NxK6Zj=d_}^LPA)bI z7Qrw4sLm_7A7InEdy=@-2e)FWrOo7h)!*B$>e9kHJ}f*x+9g*Pj4LO=)pfh**;&vG7pC&c^hs zDrSz?03wDTp9x^(pD|$xL;D3LU0mULU+3QRn0MDVEY6MM!n1P&>kd{ikeqQEcgwIo z(Yp1??YZ>{d0CeTSD#*+FSm$S`aea2szYh-D+fN6Kui8@7M={qAd39&Fazj0C7Yad zK<+SSqT(Njj=MRvfOh#fHjl|u=Tw;Zg|Wr(VaU1NhTcGUNUuK?Yr2If(Vg4G|Vb=DQ%P4bkQ?ZE?zIc2Ee`s zOv2k|yTf_!s1yxCOtIfobJ#v1(9i1fj#I0{)o@K67=wg z^Vq_cn2W4VNGAUOo@idO`CZ{)U`Y9W;xm5_%SYadA8>F73^t!$l5RZN*%d{Ttk*0=(an1j;P z0!V8Yai3atikdS%dHDIBzI91a)6YazQ8KvB_h+Y# zf0)U81j{F%9`tX@LX|cVyN9s}&6<#pUwV9)jeNpl_rZ06=@3VfD5Q&q_5(!h3vOz0l(n%@q7jpg9#=1)Lao3qAX#kg z?^0fBeI7dAK6GjMzf-*v-W4-|TPU@@_v(*xTQZsozW>l-!I9#5d=zw>uXvL`>qGTS z2xCrKigo?^MJC~yh*s@(DOF5fzE!TRy$=N^gpJ2PM>mH^p!eu+{X@;cg34t+{cT^w zsjOB3y+pC<>cqFIAap!B(r&mXljs6H-hH-#wY1o%<;|6u%4CH{pm!+Zu-?-Pgddxm z(r5BqDaPeh$S9%5H{<(Y^PSqUM3Pfm=s)$SKmXk70+=j7L$< z`2G#yFYSQv&y>s^dYY0L>K&j<<{8erWCxKc;l{hy?_(?pxKa|$t+xc~AcPcfPh9Sgt{7cbK3R{Zaj+FA&! z<*ggv<6nwr@s}P|fRkO%8to$J&! zgaKQQDHf0#GGMju_NC^OC$0my9)?2teJA6cf2VSCGXtI8w6NUAN!*%wqB8o- zu0ivE56`kcb~?N!^efK4+)k;K(n$=bcwbU6fKqqZQl)uh@NXx}=y~C0Qu~kP{uTih zC^qoRdo(>A@bK*qm395y72Bw!o2B2`0JnkUKjRSr52VxTJb}_0^V_WQE^VmS>pVUF z_s--3U^i{VY;t*Vi$jSs#B%jW{-FN-ZuT0B{pPseH!u7?Cc$yznLV86Vs^{`xR`5@ z$8?-*!OfsRw0}FT`Ly`PN;F&@k8?h;1@1cKYe}^N5s%HDwU`cz za(KepOP76aaeK0?@J3dOd3=phx0UaBOVZ`-$e>^@zCO%3`$a4UNr<5*5_3$OqR(e^ zVQ!5Tk?Q}~$@jbcElNq6`o3oo(65}9i^ISOd@J@|yw+8tb<5ojKWXyrYrqR zMe0KJm@w@mtifEwD`t-{=$X*(dG+-cTbOY%?x(xsC<#$u&D*g5sUz+bUPKuUoyWXJ zVlZ4zz(4y?E0ci7&u_Y+8U5A{0pIg9$=P0fDLfIN`yBVf`%I|bQacytzia99nKj$y z|KY8^6cAk{aU4B?pDO6G9SMu-IWO8LeVo^K``D3O*_y;qA|MF^cuTm-8pR>R5~oaJ zdA)vhtEQl+jhtBpVvNp*#_j0rI66UGy{2P}O9#wVTas?`B>bY$|301i>MLBr<^OzI zJ*tqO&Po+S$Jd_s$FM^->-zZGMsK=x%4nVn6DY_2QBlo8C#Z$hLgeGwPauroRJsQq zC#~zT)LN07;Ytw;>HBgzx*K;wO7R)Oe?2u-bd{T&&uh==&VaosopPJzsM^I)Te8-V zI9{~oIv@dP5qQlqIC|BWxB9q0RU{ljBdR0kJnff0?w>cAZ6%2&n+8fK{Yz4BAK0`p zKW%a5$3u5N{HI*wZnqY()4Uh4DmSl7z}-OVxY~NcQ;Z=wOw{I>?AnKxM!PUbxJsLN2NFE^o-Nrf9@L1 z)Uw&@#ZRNR=7)2IMslfLEE4n!Sqe!&%xUS6I{+MztAW2qk56D~9S1C_&`|xhHWy{*`<|2KgvLs>r`E-X5gF z3mr=n%FqqCy2luZN_gu<=YJ!=i!DYv-_6!JPx8#X(zE%OlyP|DyK+XAkxb7+mMSW} z7c&a!V@T8Hl~J6X8B_71!&SU_ptw*0qVPbU^cUuItjjiM5`S9(1-V-c-tdG~rur(2 zf;XaBa=lNZ4v6TlPd|`kPd2GIzp5%I^HNT^9UUUREN|*~Q>OQfn4A@AhyM0+w6%=t z0&7=qDtWr&xa=$Du?x>j)^GSUxAU-pTP~yC?mYVaZMJ-@=?{pOR$Ut#KGP`r2;BjU z2g3Anw*u;RJnlDPtUjC3h2)5*q7z+{EL$_mi6d)&vy4Z^263+X-w&9x@dkHNf3vtx z<;cVl;}q;ZKcbNLwAY~t&w5Rfzi7cVytQK`6Y{HQ?au6rGqwJE0O@;xC<3eDv}bpl zMpy`;vj0q&?X1LUQk@o%CNHd}PLYzNdy_?@(dm((pEv<3gXR=D#vn@l;Qn>?i5c}y zs6N?d-`$x-EuVd>YxE6re$K~Eqy5@8i_kQw;61(XuCE(ainxJ0!6lWX!mlWMF)3X4 z$qo75_4U&3M4%)yJSx{uc17G};xaqq@A*Ra$A!3F3;vv)V6y>mO~<#KxQId9aeg6m zNA4=4J$wT%)Ak}NW5{SbQ`l|2Fldl%2V|V{X8IGR{gyh1*$y%$U_Z0KBR&!uU^l1h z-*}gD%#W?EhO?jGq902fYQ3Q@x4_rI^KmbR7|R$O798B1_w%(IweD`wK;n6s93;OJ z4Q||&c<8EtUM~A(IY2w3_3*X-lXIk0X1ZKlPVtqIVHc6C!M}a*u}rFPJm5`6sNZNb zMTGy^9Q_<7phxQV(%xb6ezQ4JIc;0=t*wF2 zCQoM(-&+vdTewlz?QA!m1`QGXmIf?1G&OV_Y;{DMtt`-4M|_N=2wDo?nQqri=#ee0 zT7fY~d>_VqsD2MUI2{!izc@X}8};EWMlQO56B&T1M1)SR43VG?YGi3@MSi=vzl8Zl z3TXuQ@8dt`eV+IBsusyFUbQgVRCR~mNQY~DKhA&-jNe__@eS$Xxsv@ND7$ACHF)iY zJXPCb^%S-{*|W&`U7|o06u7S8`j#bslfC+iD;f9ob_kr0NRF8|SQA!r+}E8VP!|VD z%rK-gA~pE`QLq00uV(*;>o830aGu@ZGHg1XlDM}8&D5>D-<2sBGE6Rio+f=8f%r1| zPd7a=*p_XI-Nm++=`2;f2D`mA+OP5Sl>1elaPQ|S)0U=OcOGR`MueB{MC379y*AO= zT@#~opTqA1VIhs;1z6^R+<(RN{*usu&F{*2CKiI|>tVHZxtL9yR~Rx?{OIVs?pb+< z(+d_qwTq*D2jlpr&&xygsOo9K~Q`^J(?$bG8M{vuT1XTMvb*kM+WUO@3V$C`Y zsBWn=2KJ_=|DeYSbzzAOb&Q)1WPs&|xJo87d>fJWu_jr? zQ!bb8QvA0X|3?--CYy8p-FLVkV(Ub!{rf!|N?A7bi%NHUnSSwNq-^rE)h#BBA(@v% zfQ7cCXYqo}KEA=me~@Wd`8*JY zg5RVni07JG$_*cdly9y>wd)p#MJJB?E$!M;39Nnmb@>=3jx?zbn_8F*>%E*du74-Z zYdP0G-t|uO48s)|3J(^m99T$Om$A@=ULcJWi|=yKMCVF2xn-`}AF-Hggu6w|hfQD2 zcvcv*uqH@LL`h*(xUJ+`@3uB)xA_=+ZcB-fnydh3xaIy%qq0(WOl_^bPs^CQVIN?A zGp!&|sgLEL_vv}qwgh}*D?{wK`5yISg%jVWYj+~}>AqLk|H&)nkJtVRjJ&4J))*K{SF<=;J7fDZ)p8j!PW8DMxsilH+~j_-$azg<;_3zQsf`r z%kcJAD$T|6Zd<`!wYT0cV&(o$pgkx8UAZA#SsrBA#Pofey5|um>W6wVsM5jgjY1aS zwj1g3+CfX}(OUmg(|JB4l%$&^b>d<=(PL<=3pd^~7gMi`Z3RWc;O<8fH>v;Y&G_0lMo$ z%mj_?{9tf8rlAVJRP6g|t2Q9jEfd{w{0aCqF-THkBywVd^UN4eli+`}bi|<=d%9z~ zTGnZv3Xh#OI32haU))^nxT@~~SeE`Pb5VDb+67VEX~0p&-S)GdBmW7Ch!F1TScAZR zLtToBLgZU~5qCDc=dWt>t)f2De{kP%*GZg+uREfJQmtf*j*n?6{uxP`XLR3v(YdC* zIL5%Ow)(R9;l1YcWd9vU96?K(8f%nR^Pon^u6;EE^@I#kpLKBVn0d(y?)W9w@0&br zW{Cwh#|}8dsY~mH_0S1BL&5M_ z?0Ntjs0hup>DGN#MsxuV3e!5B-OUx&g2I3+a^Fopyz1VQ%oSuS!){nF~X=}Q@fp1-(nlhF0{ohnBI z&rBupsPp_5y|*w*9#S#yyMM15AwyY~zOFk>yFQz%QXKueG>z*?Y82`B>m0O$|Dl;c z^(?=j{JSS@G7gl{(+x1BTmf#M(MBGtzuK5qB{-CDL7``>_a-z_uF+`Le5?PsnRP5x zl?q2hn?=paf{NDZmBgYiBMo0hf=i>tUR%2X?mlle(#Pt)7cNRN-ucviTB_3Bkwhc7 zwYkHPNr;mtDVbdLV0P|Sa|n0w8%vH2bqc-4#S^NW|DgFqA!4MjrPI^ECK+zWiq)eS z0nJ%y!htn-Sn*WI8}q}0eO;<$7Ci}7yms-*9aoyKzavZuPqMsae^U?9JJ(kx&J@Plma746ZqA~K zjIr62R`%YHFQ4t-LYolBk)h|kXD<1vT_$788T#?E$0`U=VmbHQ-if)InD=vGNocO~ zV~=sNt%k78$+P`KkkY4mMuAHtk`c*@ni1OVV)cghkoSc$Sl0g1Qf8g!X}-ics536U z!;f~wD>Ie|P*M3(L%vOfQW_ZnZmpSMH5nev#OI$;7RX2N$bU|#6o?P_S+}}`^4RAC zauhL8l{XC=5Cqay6v`kQqGU6K*jrpty^>2v)Zp*wZ)!I>cDsgEhK{O~itzVU8;TMb zp2@0oq=M(3w8E?{_3odOFXaD)`AJCXz=TAUb-nPbsf)QgT}3AA^zvO5;Yy&o5FWj- z%7T~&{w(KB^@6SA${pHnLQ687I7lU$AG>KNp`i``4GbFv^YIY3YR&;3iOWB#r%d7U)6PE+S*bi#G_`-@)s_`#F~PA0ce%q8BxaAp=(?{ z#AxXbfz-19$xO~>d1W`^lTZZeGY$057unKUJ-MPBLe}8TSYun`-tLC!5~r0J&hkFT ziVFc|Ne~uE-0>n0FRVJ@4}jIvn^3Zc)L1vLDhnL_{LDjsNs*c08950{_75@?5(wW@ z72bz>uGb^lm_y4q_Wd>cDka|Ge$=GWrgWSn)B}^|{8g0nI@JE(;* z%l)<0IAGji-IzixrlfWSi`zoTz}uRENAx%~SVz2bX3U{z%xoi2Tk_8W#&Ow%gH`t3^$GfMD+wAh%z z@8FIjx3-}K)w=gjV(6uyx+w1=0Td1(3`+r796#Ceh8jcGl|kzb=?Xk|D^?%z@P)rT zq{s*ifDjmETP0f3d^~-sEoe5CL&`=4F-`P`nhB<&M&4i9E_^p zXvWBvwwGbgFch6j`hrCwPPl3=omJ-6J% zEIO5K8&&3|TB@6U9Mx|Rkep_ce?qx0qks}Ib~)7bhM|2Psf%QLEVDXN%%mbM50QlT z%dLJW?s@g#e|R-nH9_wJq9hkcaWqLyr=p1i)UO+Ii08*4=kxdRr(P7bNB&WT?K5C_ zxJk$p_OPfPtobLlMVm-LqmHfJB$!#?T~R&q|5E>(u^C@rz{n0z9(>N}93YL&XA3Dxo~H@|lM zHj-#&b`izlBDbjH6>7=wTKuike)@2ZpWD&IVkcKr?Q%S`xQMx`%+uMjL6JuGTAO6< z>lGJ8#Rvi{(m&f;nXA_-f#-Y^Hp)o$ULpp;88G5~gBNJUB7droj|?alINL6IY>)6y zDMnNt23;?Q3~j=Uo%NwhxX1w-ZMd!aOVeM<+gn?Z*r*mMH4C3Nh2Y!)UxccsmHNE3 zy)@z0=5S9CC}=KNN(>Y$mUeMAycKJ&ZkqnV8!5&3U$zTDSuE^&+oo#oINul3$F6M4j&d z)>lN#{JdhO@xm@2dYk|?$1-0lHs^E$oB|PnfNeMPQ7PQptb|q#p2s`!C$T;A%cBFhU&?kSKY4&jN=w%BNkNT2Y6eW?z)eQzE38*Z#1KX zJYHU#8O$O(-UXkx^6^4Nax&}0FbkBT@Y;V_m03bS+d0H$TZ`Q6vh~^9H2x;|iuGHm zyrZt7$d$$_#$mD4cvaXaTV^&)JJRmb`)%3;*h#@ifv=X zwr$(CZQHhO+sT*r-DjWu?Nhsse$T3>=bT;L{fu#6V|36W^n)R*EP6CtXbtf5Do?Uo z=e$H8{@sTA1d}yVBWdZOB(^ER^Y`Dj-_#isnMZa`VJLL3o2B%`N z=lBQUkhQ1e>$Y27LZ%^FqacH3N%HKKa z70*UEA;=#eZzpxqS&w#BFM~Kv@9?B{-T_7C|COr4E*CWv%JXk7rO7M#9Q z20f!kB<6ML=Qw#np+DI<-3DJ9wg}EJ(2e2CBkZ#+eXX#I6mUAUUB!Ijzu3zU6*ysW zLG@KyBwM3L?^{e?F!#tHwB>9d)F3VrA+&aZ8ce$FwNT#Hs(`dZ$Vau)u1uw33MvoJWOYwb-nW-EMM0Ypv(Y-?hi;!WgAI-WpzT7rU0(*7zEe-Ca5o|t0bG#f2{FMywlax_s#fg zSON{O6^u5UBz{I-{(Y~li>K)^P8gm#>W80vfd$;CzQayPCMH(6y@f-Nt^lufUZ1+C z)~JWYE*odawoUt=0L%Yp!|MNpGkqm6e7zj30(*1jk-+oUqtL_ILuRaVj-^9#r^857 zotV?1-j%_-Nr$c@V9p|b>DQjz>U-lYA2>5J2>xK6J9i>J=H)Q43ZkuWsaCAkTcbLe z78sTI>>(vh98=9#94F59NNP0vO1-~SYv7gbQ zwVC@A$PAQ+bgl`anplz-r`*2u@nlC7CUmN!X|Ns5p=|qHR-fjfRqn$Bx(jr9{)I|& zj6vAm%k8W&Uuw=7NpxA6uMW1~+~$FUM#1#2YdSd$mwUIO=`Pi3+$lJuw2BC>49?0$ zFWW%2q_C=s57DGuOZ;PNlXdjl%Z8`LGr4fK0FP+C+w`SmRKn$ko2mUyu_d^CcjLQF zJUbGQOupn7&wifTi}>>fAa59eQI$Xsm0f7X?}M1idu2L#B26NR0QJXIo;6qd z-)o`JE&u6|-Q|EiAK2&TvKp2j+@K9hoc;N6)tno-9F)vv;w#Vc6+zXr`R`OZ}1! z9me~&ilu;~*TDW+=Q-sUJm9AkKD?Q}bp)R`e~*9V8U5K~EneL4?SI&1(TNYyY}AZ$ zELWXDU%Paf5;>2MOx~rGSO41&)Ui|=O7P7G@AV42zc?G~1p7q(tv?3_N_}XD+-K_E**Xh7~RM(#uzyo8F+%YgzFYzVIfh^c*$+F#G-! zHxTt<#{f9MpHtLAW`H0_$awi(9Ml>oj(Po(E_+F{2haMxlTcRkV%JX*KpP8Xm)}+s z$l(t}cPgxpUndg|i9F(f50n6;)HC1S2o9Lbc1?clX&aDB6N2Aj6CZmt0&1@VV52tXY9zQCl z(M*uV=DAG9ffiw``*%(8HLNjhCv>RHf(3?=mBHX4hvPI2Hse&INX%_C>>u%QEa%U_ zVjW>(7fFnkAD65^`9D3f5U4aaeZhG7J`s2o?w@JTU}&HFH!d#gzBV^|r7-e(d7@v_ z7_%+lKQn%_ybsOE2^4Z#ps@A&owY}TQ8|(LQj8GDi zglO%!vTM1FjOl(h72@^V2vY~rRsrKG>mEjzGs_g`Iwcq?^kC2^EtS;Dy-1biebB-wd= zg9ZVC5FK^o*q5HJaP(6niHly#Mri8MPKpgx7D99<}#Oe zo(mHLl~Gy!_RELTJ`&`Fxi@#Wg=nyLWDcui{)F8=p@8>}I)-V*6`SIUqRWbyRVkjg z^H`_z;81(p93}GpaJ9w8`QBwYj}_D%SH})L;&;-Z^+J_4QnkOIQrhY`jJuZmg`Kgn zv~+G)Mct)QIh?$kYc4#!@C)kC;DTsJRKw`?VsM++F|r(YTlpzKzV(zpIaV(4C;}|- z;FyEd3L@>8{r>QDd8w7mh3co6#@y3WOPvZzpOJVzCRrMG8&iUA!mBh6imJ-<@^sC3 z3zIqOmr7l1Gdw8gG-GWHbP(ca!{7b%=)|12W!08qr$ji@#GI?R6^-3qR#oa5SK?``uQQZvWRcMvMu|4WynQZ8?FPL*~ypOhnnp| z)xI2*g7qT)or;f_;XDGT`|p1au0g*BQK_5FbyCC=w4}s8&g-$XKPa8H6p371os~Z+wr5xfF{?|V`@^MoX&}+!X_=MaG6UoZWV?$wGOra!K_Z91G`wW>IrcH8zkN)WF@3wio zt(MXFb6e_cSV3*$Sij>gI_#bo#dup1{X(KA9?@eI4PYtiA!TZy#+e-0nSN%+HZcN2 zN+z30avwO=sd?7dk9$OEw&Vv*#AZ*S-bHam&OacKs!RS#HymxIsesN63>@$ZkHZqoO4c!TxL>`f=5 zotz}?Q01p-oWLLaucxB)El#ooMr>nBw8N@#_zIInfO_Wnz|?F3v_J(7&qk%h&BS|X zM&gIQZiU1vG8}$(tite8BkY!}%>w@2Hh9L%ahhoi7Nek0093-yUyh7|ix24|V^G6X z-NR0@CnKp@sf8pH`3ZQ8xx}QjlQ59+a~;D0;b<7uJz3Cq1Pppk4DVVAEYxKwAFWmz z6}MmZEs2A%-Xtj8<6B`tiP{pkm*8E!094PrGa&WN@fP{~+^Cw?pf_pBf(7X60bSLx z7B?Vrmu)p+EQLoOfV{72fS{4(fEW;erg<~Je-2a#cQva0Fd-&y660=ZL?n&v;9kPd zYcISn(ELipx;NglKPPQHbn${>hOw;nB)Hh;Y_6)7r(H)k&MZE3ckV1*eH*QLN3~h% zR~lC+BbBP)P?8&*-e+Ats+0 zQ$FB@Z{6U|b7x&*Av{65yO4!2Y)o0gk$73QH^AJnV^u6#_vPmakHmHNjP))0m38qq z2sJ)??55!$xI9JFv&HZQme@v^xTjVr5S*j5QN1i?LK2Uz&5(N$(wu|ZCI#VN6QCgd zL1oDN`aoV1H(&UiBE@G<-i(rPLxC%}8eZ^76dg2Jlgw>80YA{cONKtTv#)Y<$1*K$ zb`5i<={JY7c7{1;2E@|Wyr^o5@z>UFHYex)5>r{OQtSQ0!{FnBXu%>+D~*~ecvH2p z=ZfM=Bw|Y+;?4?{O9(zzh(bjA=<9@?F?^mz6pNW}mEj3g_irLwxIJ4%$Lp5c#^Y-j@ki*XBAM!90f2@Pw10+fy zQjnWXGv-6}r=sM%(p%v}PY12QIq;%>5MNt6*{L4|=Ju!wMx|D6Rz}bibl*4NW{2fu z!qYs(f@M57ZXbS#Ep>=H6Dq!YVg9JKu3&k&l@jyTs>n`zs-phvCb}Z3ZbWsYPV>&% z+wdB4t~mm{sR!A3KiQl`70$FoO1Wl9NKxn#msYv&!)V)kt;LN0S&wV^OD7t~T6L_* z>x7?&Vd)PKA;qKpiH}o(k2Ysw-)#fXJ^Of;Fgj7}Phs~C3v=lGThHF`M-g1I5Z?Q0 zRZ*CNc~|b!e$nm9OVzgRLCX#P9}fXd!~_-ZX&IK?cq)xk&l1jh_v}RTJ9-St_Ux{N z3R{nQh~cm~e}iY}|jPS`&R0KmoD(er2=cw|2|VYdu%-!&d)YHzyS zDO4~5PhEdp_0eMSCK7D!<`ic4_falzf>@T#i8kEIgS!eErhfI*G@+Cq7b!UlX)wL^ zR1_bmJd3}~+IaivBrI$>`pKwO8l85e6Olg!$DYaN<1&KE?>qcTGaBe}z{|z_OzrJx>ke5v1yv5nZt>K#z&S&e3tvt*_ehy+9Z*;tqN)|uI&Xoi6_>nvy5+K= zO$HMjsI$jqXHPdY!nkgd5ByhmC=QFk+x52kbv3LCmo_Tb_+I9V(*Hr4x7Z=>L;?cI zYQ7FU+~uP#2q9u)NTi!CkL{_j*f|g7; z=*)pNKMNrJz5Ye%`JXyFc&4@7M#({KT?QO`)lHxob+oC?bTI#*`-(EV^Tp#2?Xxs_ zxPL3zilOnw$H;_xGc2hrBTrBG1EU{li~4_R{Rz;e32~YOGP!ToY_`U0CT8l<6aD6| zr^DBL*aZmlVw<9n`CvV&MbdwEf8;Qou^fiDSCCv8RJ1Z6>2%n#|3iE;eIKG{zG22ouyv-sr5Z4`>6)D4ST1H}TkW%wy;LzxAP5X#kxt`jI0In3AEv?2XLATCUdw={h`*SBzLiLiW!G7qG_5qw|83In z|AP?zuh8NHDbU1MSy#duuaVRrj9*guHd@An{-Uv63R|*kyr_ff{|b0tY8b$`joB{o zX7NmaI7?=yl($5Nk)=SR@|asEFjzqJUgblRMGEo@QH~9`B|*KdPq^8bYZ`fm)B9L5;~YI<8qe{31M}5XBTJq- zL*eDKZHdSNT0&}o4672aiZcJp`E-qTMp|38HBl?Z#to0Mu4al)DxCA}>N;R*f5a19 zz@$p3=#*>(U#lPjeLUzhuQR{$A>~1yL=4p4J!M4wO%=+`i4mg_lo}VUIO)y3T*QRi zBz76rrS8p(U><~PB>J-|weDSFLF4Xwb}GY>iyOg#&T-XB3|odbbkwD8??dpPjRS!X zz_{`%V1?Cc6V)GRYMDOeL!pwDAgH&M)@Lz@UuX|?z%q-41g`k*RI5r&l4L8Oxr$IK zG7t*0s)5dd0NyK9+HRelUa7-ionuCXBca|5{{&5Y3Il(ZZKcG^mG5W(obOMT!1c_#|nQx zWbmJpj1K7g6N`zVwx01L#$78{QW0uwsxSImJVLXhPL9nmd-y%PZQz4zo&6)-s6L&v zAh>N$ycZcn|INSdsDOZ2pjHGQ8lGd1{0<#;nbc*=1T;60iN{jEynwi@nTc81$w5e! zBqYvrR<|UN7%D_p7dGRR#^;nDm2_9F)cP(nm<|q{z(L`b!^VnoFsXO=UYo0Hn>_|a zSPS75q1deSO9v9-C>j`qgANkssDwgo&s#3<|4UxN#GmkWtbX21luy9;>SvgV7Ly;H zj$0Vz?=!}yk?d;z7+BdSq2BVsmg%TfREd7(1cls>N&>Usm)Dv_SPyfr-_+GpWg@j`%QBu&)Z(3HQH@`62u?9dN?xHG#mhC5V&WX zx|-u4ZcZ=EWFVjljCT{)4-k3&Ry`-8@@s2ys)4O!4dXAV2QS>n*Q<$yhV$}D`78AJ zO8SVy6?h9N_cu6L#@x)MtZtC=mO}YJboGr%d5a_{z$5?C%$K-uBhKff@KcfV{v6e%~Gy1$=5Y|>XC0wSs9ul&ksF}OtmpJ;gQAu?PUhQcyEkK`b=;j*$2>#~H*DL-^^tIUIOLqA;v z-?uQ|h%&z=E*!EN^oXE{e7ur$yuS`ZOWdH#8g7(wdgZLy@ls6~_C7HvU=6z^0oT=~ z(9~GuSyRzzVL~nt!JBXuravmM4y@~mf}m$<)a#OptkRr94ly=_|w=~iF-?_V4mV!+~UAO|r&r8HZK_yN)FaQuYNXQfeg*(dZd zB-7e+WA@+k+xBBN5dWY|E+t->O;j2-Smr>GY?sG0b-TG&O6V1|IK`2d+bm5MW`dR4 zN)O+KgBUTm5i0#ri8Eq~HUs3NdKaPDXH7%kV`(QOGBR+{`8oh5%yPtD>d`($W^F2`MEZ$?@|mfJ?4uAy(|0vpu4X==lB_UMd$dSy5Ss;s! zaul7%KkW_x1p!S?O`Wz|Y%C03>KMN&O`18fb8tri>&K& z+`~&~gh(A=uB>Gq#Z%~)z^I+7x0Tg*V|_a{1)D~3Cj(akPEw3|7Jb^6fN7uC&lEk} z2V4UbhkUY$X(mFvQXAjyg{5UP3rDz`qO%l8$qDdUW`_F9H!yk|A7blx}E(qO9CqewAJENhG%thG_lHTS)QG z#z)F7hJ_XEghJ{0LbcVFbH@G=b0?ZncQeAJU~AJu?0|x3fW>rg4|+;_02C&TA7z53 z8q`KufGZnw%nVss&(K&%MWB{^;{qdFmg++(<5AU-NxQKRCpk2JQ)0JRW{YlU-%bjg zoAz2d%eOvJ?9>um5`g0PV={@g@qbNjqR8O|=C0A(jKRbhV)7S<_%-jh?~ zbl>eZ3DbDXdb(H4a~sQiGpaR`iVCO4_J=yTwsFWKBW~H}wifZGX%d`yQAZ8;aqMlo z(iPl)N5Vm>j+$tI6Knmdy({W>*h2i14Nl=p8okhbXApd!DF6>de)9$`=DgsT7i*(k za&YG%_i#)Zslx#D2?`j+yhF9o5S39=0l0b?sfu-I?otD^+C@h)^0`)LT!ghF)YRk9en42UH(W)nSiDqxiVulyir#oQbr8-Hep%Bt4yW3eIA9_zDkDS|t@hK9GqQ}D)``3w4_z8> zIg43i^|Of}`cNb#Ij8#iP&9`24yNTx4B>rQkNfJ@#3S_ZHSc6v8rtb+IDrg=ca8(U z6j<1<94U=p|5Ffy|W-IEYoXEK_}&b0o|m$s9ETVR%h* zw3IHhMBMlF7*2NoS*|3@f#YCV1owr3J_rNQ_Xn|s)hC6_fcs3B)YXOfG#POWE|DP| zqLd=zlt=G#-QrR@M+CUTzp=(R2u3^MoB}z?!8(H{Ia@mbOx;`WcIvO5H$>LL9S)M} z2lr{{=g;Xx0yKo`kd1Qh1>ey8vCwiBqalS8GmNJ)g#y>_^pMRxbkII-lpc-He8wi?rDbry4Usr=*x9|XA5Z^IE0m7?TS71 zp@}MST1a3})6ztuo~;7U@@2C;RsBk;v|F3H!+N*41jMK?(9#$x$ZroF)W*aT+3#kP z9?u%n*B7&U)%0?UN7MauN4`d*Yvg)n{oF(f;Qj^V83Ir)5>M4Qsd*S8CO9NrrT9(E z|6Ghk3=yqnj?gF;p~=%+U+1MhK;SlQn!>S%|JKBdI1G`>(&S(?JabNY(2OxxXTafY zd2Qx2k|&U0dN!k1rkgkC;LwjKL7zn^_f~8mfLeuxxi%>DgxJYXCe$jYu_xODyk@lHV86MZVc^vvJBdmv_UhntH}m&CMhrLdH{wps zmGh$w3sbt4ro80y}J*DU(Hl+A`GD&XezTd`wFc6cjTW^ z8X^)0l06|!=<^=@ zo{!SM%?tTtPq@xj3Zh(%q);mm$e`92?>j>*#Iw>p9DC#lCy1^L?06In8z3cwM^zYH7~&6dpU)8^L~D;+BcdDiebQU+L-KAHtxwAj+O zG@8H1qKoZNRX;n$ng{MSt{M%kc5dUzpfEKzHvL)~zuzzzz$E8&JrWb1D&9Tlk6 z$5!UW>C6rt}O*~GX?Xw#lYl-V1 zGB1_SeT$q{An*514UrZkEI7B7edpTBhR3krQz|a4hDqw?7ol~mY{-KXEky<0iI+1{ zXo|XV4W@($^wTx)IGwyigBLe-Q)!NrjHl?1@W!SfE=*Fq9{QYdmCtrW$$acj@4KfG zyz~vL0RkMRkZEay)#BZqqSk0cIynlH@Y{p$_FFYUmA|!-PoxQIxt=*cHx&Xrf38A5 zfa>yt!UnZBtm64I2gMW)R%Z7a8tppr{6NX@`NBX7zg>q&WYvo&XteQF5#sus ze)6MF7Q2xLz+JFF8dWm$%d;01ZuQXPs%mjgPW62FIR1X53x|wLi}i&G^@crZ`cZPO zyVsi-T_W$x;WR96?Qqgi@^H4DL-L-t`Z%I3%0jMZ(a*tR6ovnbd+|RPAN~KbBmQ43 z>5<_v1X z_T5_d%*yuwxU(x{k0I^sHo_st4|ntNj_Y%$M>@s( zu}}!Cb0=8hj=lV`if*o-;CJeAd<=*7^h&!?7`LsXkIK>8Wbs|B zNsZ1vKiQzM67?kw>CWML1=03#6m-yyE!2lt{T;z*5)mRi(%zy$?8uYI$8l@4T0f9X z{u@SVUvQ&zz8IJ4ujkLO<;=Ve!na*exzd5~dr8OptMHkwgbK!}8BqwEZp7wvdNJAr zyTO~AkY!PmCgmhr^DE*>F@`+rOFnf>UeEF_Vzec2>2P6&z1fo4g3CuXBL6+mgJefr zupCPu7sCgb^$rcWer9BmAs~KD zXUA^C9GpI|z~R6`X8u;ok8wp&kHgsOq3(&en@)oz4I$AOPO z?=}l*Yq{U5tav`1K&FiBOL;*vAq88OsBEr9h?5;<-_8(qN+qs64KF7E?@5+J2M(f*->y%tU%uP_ENA|zwq zS$vUmq$h^NKKCW6(%kczR-XI5K9T{CG*5TXi}0*5pm?NGm>h0UE9>K#Sr_RNasydj zo5Snwc}WOPsUF=(@)3XN-9flkr~p!IUFvOT|LlL12W{n(b!i)g{Ov+(ajv||NakP> zL@sq`NHL5xGrnwnvXmHy-n@z5WZ`4MfO2H(u5z*)?lSxhHrnvZZ?g3aNTHG#PFfUq zh873kwNpKpR74hs`Eh7bG)<_Yi4Vu^Yce#nl~tZo^^eqxgF3A{Hn#Hnd7A)xGa9G5 zrB1ON7uuElA3AJwz^FRfiIs(vb^S%b#V`uCcQg`UCs7H}<=(O*Kk?mlWCi0vDKb|% z(*)n9sy@fcs~g~yiQ55)gnL7!erctFJixZy+%VZZ*mEvprms_v_+R3wZ^uRF!6Z~Z zxGS_xW&4w$)b6L6;M|;wPK_dHdp1sEhBs(ab56rLQw*zEjO^6CS3m);*py$eqg7|uu7NE^j%kJXALR}z6Tv? z_vrkj#1ZgAs3X~|ygnKomA8ujSHp!o~PLmjj4`Lk=6fkhZx6o7BtFaKyE(2xl{weSXK0-f*ihh4DpT<;P3*xpH z!>h4u^3$LL8QFyMTN&zJedoYNKL&)@WFakvD}0^` zEg~KWejRP`UYxr3t4Rn6>>)E_i=?i%7*1ecFn7ff2v&?XjO+;<@(OV*C$2BIRn(ce zsUN@!p&XYs711V28g@~WzMUo@5ZP*tiHs?qYQLDxz^D-FBT~l)my60orX?w}oJwU+ zE_&uS{E*G(>s>r(Nu~r)&W2_}U?qs!up{yX-W=SX-I&kC-`AZSMIVHh$p1Uj604&+ z05{=nIkA>-f|3B1rv=OxA)lIw{A6!= znFpOAvgp_hlVU+|mYwu)vr1{^6o~X+Opj6R#V*q;%|j{D{)>1_fpSC?SS*!(7SfUm zD(uxGYA%S^M;Jh?WnLD`{vW3EQpFrQKm)9}EuB6LDmv=H68CxStih~2u$t(eLcLBk zv1WJdKm;1-xfnoc^7&Q>C0-AWIRP|i`i!?=W2Keud|NZ-2;|%{wG`)RcB1*2}R1((Mm5GSr!EFRc_Eq z+z19$CE%m&W#AC91o0B8KJSe@&b(wKZCTz-fV7{ZuP#gKRX7DE$ ziyEPkj76hHcrRPC7iXpNwU|+8Io_0h%E&pPPX;Ak9LEy%N!;ea5jF6-42!8=S?`3CSU8-i3+^Dj*IBUK`1O9OTKg1 zh(E6{3TN28_*l=L?ruQ%QsV0Bxa6X*DOL$~G1(Q1Hdt@k)djkqH^%)t$0e>Ogv#6YG1c32!)KE zi7L#$$0a0YP6#O?TL#!Ud3g_3Fk14;v%Ks#7CAtP9;Hj`y6G$1Jc9nkp>^|8G0-g& zf+O}wR7nnx!7nU9y2zvg(@n<*i+(%iDn8DG?8nKAm-d*8hU_1M83VxmKwQ~sz z+h`(TG&bP!_U`EAhXyz4p zjwR{9fPsn44T^ZO2s)Ijn7wCmXn+OLrS?nMbu;r_Z_(ac#Cu#-hY=2LC5-1q8ZEW31MoD~eg=bO`+a=n8#_B=yFIcusmc9=ZP4{z(J zXoO7RufDsk&P$w^0_DO?=DEikEk-exr6oz_SO!qr62}?Z7626AW2>;AhBFOEs3l0(mDF+_SoOaSm2QhBE z3YUIXa;T)GUBGACHsuXz>5w3g6ClLsmtzcMkR@{(IJwXqnsVO!Aw`C(_cl<1ESn07 zu;UB}lA@ZjZ2ow_))yN%(bf+AE4fg19*ec-LRe-SJ8&yCu;0+(9>h!ESTHK&l`LKu zx41|^EcQVU5Bo+T_%*FJu>DOkBA=6Mm*{ApY%oeGU3$GGZ^cE~v-yC!*(ean0Z8Sg zq2d#8XLk9kO2pE*uY5{X#4#x)Q%#{-85#KQ=7;rC9cBTdP4^}Y2f&p4Oy(A56}O0D zK3>(EYFv~ytTbFkILuvB6hWd$?EkZ$g3x?8bZ~id{nYy{0d}gSm|xP~9+J#WI2M7u z0`zgD9NiUG7fowqIjm*zjGvE09lf|=e3M=fJ{YMXc~1Vg%$_@YCHWf=Ih$(c$$_m1j-Te{^k-46 zU}>PK9wm5BiGU#rHMlh%ItBxrS4Vl3nsYyus>7o@R-)jUXM@yDZ;^TtGzu&(cBLF2VDnvUSi z?E8AxyzvE!P)72qmJaE~JS;8GW{EM~yCl61!B}(Ux$TAnOIoq9HlKJY-T8L-?(bYCvJ3!`PG&n8`0#>oKHPf8BNWY&-mq#*4I{@s;0<4>^ zTs$8#IIkHe$u2sJXM9wWq?)&8UmO+WWJ*<3QoXX0Ob|9j$41vz_SFZa|ueGTfGw19>}8E{^OFz4nz#d4k4Nt~NhJHQ^B9!)a0Sdn9S0M}21e>3We? z)~S6X5>-Lf-6#a|!_UV>qYxW2>;lLflesj2N<9HWpJJrG-mq6 zP)nJkjvr@me2SCmk^c_@MXH4z(~BgrM81!m*K$wpMLBvSBMCSi;$GOe4{+L-+eumU zUorTEd7c$SU62&|dUSrbOmk>le#cyBSfH69vBD6$aQt%gw}n&@=;~6Wy*1V2Ay8Ke z|6n5W$8snESOK+~7!ox0>Lnq<%#tpp5qCWw{g=~clfr!hECh*2n6@bWpAkxYkJEUv zrXVP!oq*7BVs?Y!%81|w&pQZd<|_>DWnqz)BtcG;pRR`)NBGDd0*;4eT$oAOdS!RU zDNQh(+RY**7MrOsSLTtxT<`04tEbW>HuMy?+xjS^vtk8@UVd1-bfP_Huymiq&?lmU z@uYrJdaHLy$C$jRe7y;t8nJvdNCyD?VZ7+!eEH0Cx(`dfS{Zh05LDRQ+05}F-Eu4P zBwVkCbyk>@U{QaJ;RAE>QUE z!Q!tV8WI3nE)S$ayhGamU<|??Tz?y1OYG!R)P0v9XN^u6+GUf(#EAKT`1w)ffW)B6 z_QaVjp+3u5qBTzwoopJ1Ndpuj`emrwga@=EDr;Hse!$(46`f_SKrhr7UDYw0m+c13+2nxJ`EK+%Yd`xGcE>G@?G&);^(X5%IaB6EIL0y_qO(kQ_xly zg)W1Oh@_v&cR)VD@^ZYS4m4Jaw2-nBd3u}5F;saE>eZ8`2l4uePt|DvxptZf*&Nwm`xq={(4sVI+KnC0|vkp5a z9Jxb%a8!VtTqXZN?r9O4NyA|j82rce)iw=|zmPq`Q<71Z5JE?+uzc4 z=~iOZp&6UWoMaQIf=j8lSqH5!2>Qh7@!Gol*$FtorXuTKg!3wk8Om?3Fc)|eMcFe_|qA$vp~yy>os)r{`TCsg^n9yG~1R=Yk*SD4;Z;po!bX44Z-b5 zYWBF(yKl`YtSsSDMf8N{#+&;)Q1zku`ne>cCjQb=n@iZ`${YiZ6w-de6Ce$|P5&xL zyGlWP6-^R{5X202?Bsl;F5y_0QNf9SKj z*07rje@;s-lOisyR_?>5SMs!#3+05grpr_3FNz=FY~cdLspz0leqXQhQCxUsOIztD z)C?02>b?>cn119!tA;#k5lVV>NjVxum|OZA$DpyX^>1eI;;lnbqvO*kC*$qMjl(v@ah%_39#ti(TkmookzbmiaG}oUdeGkVktc3 za1Zz{6%DRv5X6J&Tp!+OZCO^;qNj7NtIrYC8uWy!@XG&Ponl{ly*w&OTqOmU$tcK% z2o28H7oMW^?VP2WE>h7#)Oo^p5Y*j zn6sYXB<^$MEG_D4ey*aVwBLz>nmJwLatHGJ|}Wqzd>%95u$n|TR38#PrBI4w*Nkj^bS)L5LS5e%&Wq^k)4q~Q9W zXajt3%k?O@!R!JFz_q_`a|dfQ`2gwO#0IPjIv=y=1*PYS;z`yjoH#6xCm&DgJnm*UU-tfAs*q2YGSO3l`9aF-F>YjApttS3rA>EVzNznVAqX1^I@kX}arj`P~3O+_|s1EsvH?p>EUHJgYeD!5};XVH1?be>{Ns&oR?s0R2v?fo5RpXW<^m?s(BN@f}I?q(gtH5!H>RY+idY1M znu_4QKK-(h43YDrs1qa@*`qp^WS{1X%E4FO>0Ma0wu%n7{ahe0z{W=oxBK9^0W>&j zjqn9n)r9VaiorLX(({P4s485q^LZs2`{X1mcZ{t#J&He-r^IosArsriiZ;L;Vz-KO z6_4b|BMxI1uRJT|Y7@WEXjT`!vo=;OjDJu3o&nUgsVc9mtYU9->enX#M=F}0mQni2 z!*!N4OKF$+p^E>ah$^^eSPb)$n0q-(+JX*Z~iXG$Vey%~`-+ItlkD!}gYFd)`DoQx z-m@amU5x;17IC-QI>Ify+n1_VM8@Y_U^Q>|KyveeUTp4C{5;EQ067!^Zdig+SUAW6 za+#AZGoCk2eB>Om|0o{GdRVXJ+x^JS8yrj}XOztp2a1XH-p`w|`Of*cGQ#f$Wd9II z_|f2Btelipt{jB)3@)cr*UZbp?o*v80AZ*KK@u$8sF;#jMMwUWZND;l`9a5&al=v| z9b6{$1e)1&e%g~pD?b?cxFw?@yOR8n=D)|u#q1vHJiEYXJnv8Y*gyj}F>BUhYb zv%OW5Zq`gh)UOx571z4|n@k9011U}!CFGTfNAePG^oci`=~9#5>&Y9+&sLt+ z$II%z2a`=#>5ES?qK{Z9>flVsQ2sIRcN{6nt+t2%FFnQ+#x(9WtjkTB+z+1yN2!mdiD){&^iF6T zHX+?FsX22kz<=yXE(yd#WC?N-GV>nT&0njnoVpw?DMxyc`gZt3X>Nw^yhVnLAEY_; z1AYbK3pMQk)WvhxB_uQ0=tSmd8#9?8i4UGX--Noo0zElDpz2b94ro6J!rOuC^coG~{+D~;@qwV6 zZ$tqii*z0Zbll9mVIlc4< z=1@h)7`Had?1LCl{seGdD+y6!12KRAeqApq14)~at6lZC#E5z7$!l*p%ojWODB2hM z1VGQf=FzV8v&HEK$Es>Sc}CJz<dKXR~$6hytv3M%-Ct*_y0I={O#Z! z7fXP+^`c5mA{*FfYfuxDyooxd#_EJcsabVlRy!M&tdz+XSDo={aoEfx%Jl{XbXtwN z3%Pkf?)G_eKYl4zmNuNRNLd!nUhXYrb^+q;pAB#vCdc(c@C{0+F$3Dd z7aH)4yQq;J$a+i9$`{0jgDTGL)}(Ccgh52~0K7E%!3!PN1QyP{pw1$YDmv_d=f+n^ z7-}`kfd#5wwjlpeHE#s@YtUL$^_ivQ+I>n*;IPO)R-JmeJJK_XsW(~-&GC|ChuB9~`^J z_VS0r!ew*14aCCJJHn8gkeF=-G`50rH zHh^>XE+d9P-Rz5C!c4-Pus^rqekK(~)oyJ*rz8n64gpM)>CgY)f{BOL~iuvtqOMDYpg; zcJ*a(*!4IV&xFn;pxarBS99ZP#clZ$JUS<}>-BiE*ByTdyll@Yt+pXKMNdOsuTmIF z-TWV&k-$9X0sa5UD)m4CHkrr{KTGnH!2;}V;a6*JA%Gx>)a)~df}nqMn7q_ebx?5O zAfZ<4-KoP?W$}HOnXj7_Z;p5j8;9JU!#;C2GFd)Qicto&h4D%)XD)2D%*%UR9N)91 zrl%aokM$JpYv-%s3dn6`TrW=lRgay;Ga905fZlJOo5$3Yv7TJ%Gb? z8r;$(T-#Y3?x`kF*v!{j_rX=@icEhRkNY=yw!FWda_)g=Fy(MjwGC#^2wWzi$i>h? z?Xx?OCi{XOed=rtPKM)6Zk;8j@rI^g{O2~gUPLOtpNeIR=H44fMh%WlXfy(~HFrA> z$dHZ7OB8o=r7#(s(%mkOP%QfGbz}++B8p-2%~mq>nuUSGzkGCj7{5kXCju4pWi zi?V7_6THpSX$jBU6B2M9Q=5Q11GY{F3n{0;oqz>>KLuPWCnPHy76zgjxq8bPxzzFe zYO?+zyLew*h^+f7-xCyGeqvE9)Nm~)F!SXaz7poEhHNdAbsWJy?s1A-R%5+Fp{%D) zMAVn!fUKvRwG1PRjQs+x=jjs0-xk{oo_sJ0q$@N^%9J!VKb(nExT9;qg_qF(YCMpb zZ*_UtlyZ7%M%aR$cE0av{(OImk`Z~@x4_|Fv*<#@<#dr(Sz{i}5mpPmX;%%?9O@pa zT{{Y1o+GLEwtHbhrC?OIo%r;tjj>f9N%@Wz`Cw@lb?A$zs|S1*16c2xm|!0GTCj#eXA3VFwHc$tO1-dn0D z14^9fwiN7MI#=tlhM-1$j*}im@Jrl*_@EI{5bYHmKsL=Qyqn+K7at5zAXxa_fxAP% z*g@Qw{dxnS047~$xgJM?hR451t$wD549MnUa`}1|3kzh0`grjDNMbDtLEuGByFr-> zBLgo~DkBE#sJjqzE+`oB%w&|E##&AG3VI7jcX7MT>V751Dn8|+n5M$;)siwc92VEv zKFHc?|L(^j@`864sr^J89O!nQBpeE7i27&JYb^s(gq9CeFq1RBp{CwqFwLN|&N0a% z^5a12o?;@oOx}R^{s7K-CTOa2%v$K6(F-9XWQ!H2+&d4m;q2>u3D*9U_i~4hg=OLO z$&!ZEU0hA*hy=yP#6W1P66+~nZ0o|I@W_I_)@I&&v3ie6s~z8+kDdu;UlAU%Z};9H z?y-8BXCP7>9^S``dDbPlbb8SjQLVw9)Il;xv;C;y*DJhQ#WRzb<%04^1 zx8tXI;+}%!`fpQaKtV)lH+Jo4@f2{6{FPrfW>LuFl$lV?x2tA)!`EY3DOXQ;`xiDh z@|ECJG;3T@m|drN0xuR`A^Fu5k_7?B`b&`5YG40)C?ZgP8x&;m2x|>&cU+V&4VHUG z>cg)CWc}H=l>z6us!=bvm=vLUDK>dU1U@X>E`5eV8L5Tu)ZD_=1N6i1nYUtg&^du% z-1%Rd4o`@m0vssOzJ<?VvdsnJ&G zA1a0ONxmG-s|(= zCIuN?*z&sXzJ0%TR!7<^2}f04SbA|1ZPAUA#sQ)gofqORW53QTw+bT)+)vWo5tbww z%Z^XN4L-Cx+Dvo?%0Qa1(+7x2WqfR1?t$9?6^?(u)l>NRyVYoErg%%;Cl5$K z*BWXfY>rPX!~cJIv$=M5Yk)GxiLs*t;=)bB;Sv`>wq@>#VOK{rv=TcOthdTr9*@BAn>IS&1(n$VX)P$L#)#1(M%}!IRB9*F#V` zn^(7!iTtda)zZtbj=T5Xpqxth{bra3HVQug2|1W%=YC8Evy95UNesh48a5+8 z|Dy$uS%(eZPxzO8>@J;}C2m-HQ)z@{P?SVFU0@*Gw{|hrBh644D~0%#Jh<#pHaVkO zr|U;jpzq&LEwck%buy}o$mvVAnKIYA42yW%v{N!_z6v`1jL3<1qL^2H`yAVPZ}4+( zDkcb4BPT6$WOdpeg1%fz#rV;;`D0>Sz%aChp_k|%^1rwHc+}d4{*!5N3Io{8(WF^b zL>!n7o(qaUST@N_pJ|0tmCB-0tx_CWJ4Fos(Q;w>(}(UcBAi{s?<4{(1;jpXDIp;i6$_&wmL^#jKULl7u&! zEay^2G|<%q&?q{1$oI$Gg+!H04$-sKjVJ%>)7X6JV^>c!` zy@krFtbHPv$%Qgc`a$GvICR~GRerTLPrWi|m!9od1(gLirNFu(Qh>qvg>A2Tj@VBz zjhd*Hjuo9`4o|3_;7ey0?uq|!XasvSR7**P$Niv82R9ya#&w&sEiE7IEUoNUgqmlY zr7CXOypchkLUYh$=MOyx5R#Mdb7?|6qqk=1aSVKN?q1}8HBZduNkWZAi`h3m#XWnrlJckK^f>KZ_-+f~w zP07_kVisPVb4izYJfuj(FdU!aS_&D-zJ1@*%E3F_Wy^wAlqf9^%(gI5JKC@?K9s*R z=%cHb4v1Mx;RQ;vX(?$aSlP+Z(DWs2b~gWVsZwmJyWp6zJf)S&%AFa7*^<2bd=mCp zE-^O!U07J*VT$HhlCMV$R8daX#fu2vR8&X&^wqW`<2&C$l{VF~N!`cVT-|ZCM+6o( zncaxGQ}>E_5smrs5RvmnIJ8@mP@i2(TplSkH*dpqdAM<)zQNdk@((2b`1PoSHZCo` zaD_zqptt&V-G^E~D>BN)eQwJML`mrhJDFK!r4`_SCc(3Z!HdY0xNaH~ zr5bTvmt*Vsn*!OF2ByG1@YEuER`mmkTfz&|(j4*WL3wKS7Uc`bD~3K=D)qZ0tt{Vl zp~tI|>MUK_yx0SPM_Dx-!`BK@22%@awnO5(c%VzTk?1#I7Ue{X``*KqJA0D*+f&J` zoX_Zi5a9uTG$k*mK1gK=fUWYyxtu&8JvU>Zic-v$HvknS2&1?5GI$GCSjR`rIs5;u z1+b7X++Zs?l}+SmKiIO;!qrg5VN$lrkc8ueZ8fq_*UY6&wzUxtAC<5oTqyXUj<`?O zU2f>T%ln8dA~b?h=SLwwj>MAQ)lMIMXnTlfZMB2z;+{Mv6u_8&qXCf+&sM}Q56I`B z^6+|o14}FI?5?3^JY2qV6hT{>EDF=%xG3bn7)yPueCeTdO34yIgfX!ka+1E9IK={U>SYz=Jai3P}KX!Ktv0VSr0?Ym>(q zG73+Eq7uC{mOWevU(BXORPYySTKYDHXc%M>Z;p)K-E!0A+V1G6m}`aT)WA}6)75=! zRQ^wb!vhjmr63|B6aiKJZbe-+WWcFIG$RNDY55Ly=2Si@_Uh>*S?p_zi|niEjybtB zY|blVX!}wWW0ewy8-P!}s16@f(}sg-$AGn72d*pH(!2sfY$cYU3Ew47pdj7E>GX23 zn#nJ(ue2)GMEo^+ilRV}SUip~Waw7jnwXwM2);wlbcW$SFLB%uFM{fP7(5LG^lovi zv3JU&vrk1C@VP+|z9oRN50Lk;OJMhr_wqGc!eKzjBDtsr0QrJEQ>{W=*b=fjWsq6T zGw%AEPM-CCbkNXqnvycE0TJZ=38$&wi8VkR8L8|fAD$s0ceM7ql!g1kA>xSO+6H~$ z@0ADd;Yqr7uZ zQ>u43F@%TUFTS;qRrc(OXGNeq^3)|uo@~7cMg{#r^D)nTZ_#pEce_197@oVvU7aC` zg%&ERJsW_)c^OS|SrfkV1QQFd8%jQi)>7dyt@HF7jH<9(zFo|Dy&F#Fsd<&fo3*r^B;rm; z<4BG7ds9(NpfUZx&#@=Bzd^SKcZA?A11vWDOmKlZs-?9dvgsl-5n6N;0#|*LJ z>xawDcl(>jeC+Q9_)*AVRVbrUS>dGgMIi*@sibte2s8|RwBSz*@zOiwG@B^HY6JK=O>HQ>)W1ZLeufmR(Dc4YrPH=Ks zLo!m|*6g+<{k?`u9yrH^V7)bj!1qNoHe3N4R$^h6gu)h4-2R1&Wavx%9cGZTJHS#b zhh<|GGkKJ&5HP)nk6jLP)NiK7B~+3nN%6P2)4FdFI~N z;O)6jz+ZuWbexn|bwQT4KOK<@Q$57jiCo9;8O76b+!4=K*!L^O`54nz{@^Kd_1fgR znjH>qz!6|z4;y2Um@39)KKTgsNV#s`kIvPPcX*c1dZg1Aseab^IQuTKH*zY z0iZMs<{ih(f;ARFQ8+@u6pRAe@iDz3WHKOIT6*uZUdIq%L>+UB^<`mn17syKL24`< z$S4T+SLE*LBkWvUEr&c=gHo^FnZDMp8$)`L0fkFJJul5_Ohv8g;F@u>`6M#GF=hE`bXob@XKxh1Moxmh(lbX z1|OsC9{R`^@J)*u)y)sK{(j7?OKYOmN$H0?oY;Q=IAyI5?)i;8xI@J7q42XXUazvm@&~ax!J7@I^#ve!j(37Mmliq|4b_yxuD=l%UyvyZL zCQ3VG&J%6k^7pBR_cMXGx%#<2CiI&T1WeQT+7US73=;Zl%s3#82~$eKAad8Mw!%*R zR)`u23rn}*Y%Xzt@hXW!2j|aINI(kZHEwa~rB33NaF<0j$oIZ()SeA)zBxSD%+>$=4 zIn$?Mc~q>&C%U69(vw_eE~dh;&hbPn(9KHg-9L0>mpbcstcsi+<%r_aB!{&gkLtA& zua&SRe_9rX$`qMGX9N*_L2J#OP=-lHs__0eMrQOWU%akvb8``CuMcwAI&r?`(h@3? zirs0g6-X!H7m=xZPp%2FCt_^`R7v|siw>-h!C$QD$=?d=X&n!fs&FQGdjDgurar# zm&vgWIT#`O2)M3-cRq1OzeB)@SR8Giv}RVhqhPpAU` zwGuwtjJ66cksqvlXYPtn=0sqRr~~vx(?4t?^Dz-eHTmyJku!P!ARypC{1=pIj?9yz zI0!rP-)=FzRYc6duUsU~SzU#L$kVUZSQ}cl%mC;H>$npcSAJd{ajq8e)vMXeJXJeS zb1R!_)BNoWpxWth5BO>1-aW8b3V>N#bxfX5gV>|Yrr%}^m*q;($!5) zYj&q~745sRb9up4-6lkwDf{oFXI=o%A(7xpvbGH)L%czIL{c$xLLc%t@_d4BAx15` zfnUE73D*w55hmUwFX7`m@ll=@q)hqwV7T|`2l0w!2s=~{sNHjZZAa>b;zj#% z@`|WS?i7cwfru;Gj6d_bkR zha6!fDi0htpJ2HqXaLPRhys6w?6>dH$SE z5K-++c?0PvQ=u16&^c)p@ily$tqJlCkaI1S|i33*DNJfjU{v@wAHCc#}S1c-CJo;V&=G0dxU-xfL6n%!HXo5o>Jm)Ydii) zPSY7?Ukvw|#H3iOYGxL|fxz$#5(>^u(FW|?ze^29FV;7}Y+%G_5cbK#QD+n@gF|o# z-RD;!*R6IJl=A8a)kF1xeZqLffPvW^zY6wmt7l(^tQ)$|l3qT%)!hMTaJlhs%|1yG zERJEI-?7*PFur0KuXEugJz(TaWm))Y^W7XIK3X(Nr)3s3SX_VU9ti@YB^6m(@f?F= z5d+G5PhnbQznnAgH5*`8FZXoZuC3#z$))#v9!6MLe(Y1s12%pt z!|-gPm0|W

D|YSco-V1I-(JKUyh~CLU3binUzLt6tvc=bd&2I9|`1eb&yh$zq2i zv?L+im@BNKElIp-<^oDCM!>zLo-o8~5=s3Pj5h;N`qcc4WSgEKcb;sn+ZtujdvI@N zqd^kl^ro%a2IS8d`dZ1U>7`eoJqPUp^mzarUiT@nxuPMwD3B^&h%h`J&UinEfe93c z)FeCif-T$eOpR8yD3UAHk?VIKB7nJa5Js(;!42$|P3xtk1c+MT`4*n!NYj1tn<&N2 zuaw`gLkYCBR=MVzlP0|gwU`mk{+*i!-6N{h^QRNXP_b>yxIr~%#5YTZ41HcBVMuq^ z(Mtvnh0n=2sq5=g`XUL z{$Q|#{;IBcZwFskE*={bbEZTo%O&4INHE?fvU+=kjRn_`Y>)TP1kT@g+jz0~V^w{v zB~{WPli>!-PTmsoA{r`l(%DmEk&Eh88tm*hW1#Ky_rkpVY>9}hFqoB{{9fOpVrVz)EqWr?7Hn6IsPmLNWG0>s0HWhlyzm+aBXbiV^ zL9*m*Lo`3QxdMTQ%{$-*kQClwPbZH(sD3G!fyAg$rb+NuPnaq8>lK4y+fZ36$`75t zHGOW&3&%6AI3QFOOY;FJGombK1+?vrao(vyjpS?tt&6x30If>OfzEe>)uyETJz?YSm?4Dza&LBpPseo7205WQ(rF>BGJHnAYTlFYtn&(6qjGY9HQoCG~%!}$-EQz zzlrd_*7ZbE>sy>q9Rf2Oe!urN}E#hqyokEO^o8IMn%otZ>U}!JY zi8Z(Xa+Lp_e%OGm*}wdtMR}T-Fg$yTzx1s<&3T^v#~HhxTtt3FlQudxKyx5tUglxZ zTtFJ9|H!s>l$#f%ihVH=jKUTyjV72UPPOa<3dJ<+N3i3@Ar~MaI_!(N^L7wtkq)*B z%+|A4>2>s=c&07C9;Hm(y=0NrMLt3hmb6p2B6@?S9Fm{}6#%tj**bZ;46O$9*mvB%`~jI54TOQYR* z&T1eo%z$nMM8FkG-QRsQrT9n7dy1~ApB1$YdhAZBe|JN!5LMsb@(FAc1X@|gU8iTFHcYk&b6RfFWYcor6JpCSgq^{SV(HA(4XB)3yY|o94#{W} zW1+x4xmC>6XwdytFR&n{gD=AHB<)L7LFys-2Dwl%Z^LR37JgsdsyI? z1}&S5Fm#Fs`^j*p*Ec!E1hI`U2Qdl;P230+sIzhV38a5C?r?`|B;#EV@cIV(My5a7 zG>^-2fp5}4R4$Hph`V6Oom0p4KXsN*NksdZr)5xmTrZ%W*{cys)ZNztK;y)`Y&$w~ zGuUeTe z!p=7yVjIoPDk_ZMZ+Hk1&th#Te?p*|F5V2*XU=PW&&Qdmarjj`8L1#=VUys1Lx)I7 ziLSahRHAiOu_YXBB+7~Oc73a16!9{p1AKNLXf(PCcWo#Y6JVf3{I9*_1j30ZpCj61 zJL4}FCK85&+r{5b(XP$L+n2ORJVNIH3j81wv zwV{&APM+_m*`e#QUWl;EWQAAgHrWa^+MC%4fxd$PE2V~+SM|4;Py*zJdvXr~J*LBl zL(wO-PrD{E-QA_v=@|PBfdiLSxhKO)As`cn0IEPePYGskfv>;Jn>|?L`A;B zkKXPR3LTQ zrbIux@U0JFXHsx7E8d*Pn4U4MlM@$nPl6}e9w%G0f2QRxN8wSd$iU^}Oa)UprWIg7 zcoPqf?LSVi(CTmkXFV8Z_!w#9>}~MN2g8YNo$!aI(NQxOAM=d6>+6~Z8(AhkOt5XG zBE*3G5=YEkOek78WxTSerm>24I@+~=lWXoO8ALa%C?p|Cs4cjuH_c9{L=YMag`C(} zdsxlKV&4RIPMVq4(R;FAr5kX05_iXCvWz3zu_2o%`04JvHq=F-0aox$5b>pila&8J z&c`U+Y_5A<&8WZ%C;qKSTu(RE*m#DR-?>2z^e{?{FG#7RM0+O%tP35zW+-CIHDx%NF>Jvxcbq6OG%vh6G>-gk zil<5gv(!MhX6)#n)xEScy;aKwc`O17f?YRXpf6SC9l}5JK+_5tq^`h>ULjfIW9ie# zalQ4U_w`^0jN#6G#M=Z^X)AY`7i21Iv7JruRjbT&I{VUx1;5)*F$8~Qq)Lj4d97C* zMQ#l^{>H%;?wwD_$&Psd-a&s*N=diEhm88={PseSr-G~Ma8o6FX_b6U$WYWo}Pc_WUc8`I~7jT1>$u4LSM ziBz(9p@BR&6EZ-wa0#Ul#bWa8`F&^;mI%TQXl|e0Dp?!vLC=?08y_OVxvpjK@etI! zKIiOG$(;sr?5N@UY}&PP%`-RT0#(vmo;xF`5@{h20{Uw5D%AlMqw6;I3Zw9BbPHG_ z%RD!vC<}x=0-=Q$e&^A)U1P^P`suTKyFR2n5iMaVIuZ#czD1iSs_2C|uapyBluh1B zQPE5X=cKTx46 z6WSxW&3g86yevMP%K<&d#xInj`ERz-vf&7w3}l6+=P@{^v#b7HyFBDh-NaiXAu%bZ zYB@9#VEFtWBXf-c7g^|t$WYv>r2bqSY`L?^A{*KzMa;H$t?Vucyhr)-v9ha=$2R&O zg?xCv^Pe?S3N6@F#DKNZKxrl3!XbAiIX@fEjQ*5v+mS zdJ2Bo!~}Y1LL|jyS6quCxa?e_JEWpLooV)<{Pdp9Sd|;(LbyJm^$+bpB6>+$BK(q0ikga;1e~F*^iJq4s$Uxew#gA;kuc-5{3?exGiS2ju0IAw)f>JrS z8Z9=Rq>#HF_z5ei0-{ORv>PLscIrA9QHbype+%Kcj|MhqS6CTY9=EBQ=HWGv5CDE) zXQ1A7QZ@4F=_uZ-7C^7isOCX#LV+Iz|J=|!{_ROzR0d$KR6EedI+4TtZHt2NQncmj zA!rKCHb)wCjNp=Oco2p-9Cl@J9Ia?^zkNFv!)I&DExO|_v?F<5b`BGruC`V8b~gIB z*x&E8E2q_pO@^hxW!CJ4Wbn8ApHZVG0Z2_%n_!Q2wdFI5d&V;U3Yd5266AQ~zt4`r zZJBtN-FRwVR3ZJ`y@(p)p0QM7036`K3h~Y2x%ITI11};p#5PxXl5)#~m%!a}N?XN=2*d}420%o^K zcGcM2iMMVSQYQ{n=6 z;J{}qFn_LAMIjZcz%xEZLvCi>JT!C`F+WcKHXL;X2yn0u*)@c>AfxIx{ zOMvPam9bhcwc2QwK5O}Iy|?aj3EcIptV8?_kw^x5uJ+V(mGMe&c4lOehX}D%DR+3+ z(f4NLnP@RoAvO>IHQgz^%bdu(Yoo#ZkvX$1S`e26WfTHPAq-;1*d>Dz9aZazediZI z;}vM;@3X0iw+rX-Z3}4a*}Ku(T)T@s@IP~Ms;G!8MBD|yZun@0PlxE2_=VIUM54=|*)UM26ev;vt9!O8X%XkN zED)EEhi*KCqGc$#rg|lV#-FXFW=3AgLB$6UM_vs2{cM;CP?$b?UJ`Xf`fK*BMZPX( zPI8Cu#90~WZ0eN}!Fc5OnK$J%>*LZz*R(7zZ4nG=ZvF*usIu9Qy|F)ZD-6JBR+0BX z-xkM(t={Y(?o61f1rK!8;i}|0Ly^4P@JCG1e%tgUYl!HO#(18sopraXonB{pf5SpT zal=+wNYKn_!*@>go39vOhuE|Wkym9v%u;i-&JDJ4sX)M+Z( znM;qFlEW>D*RjTj?m5&Ug3_wd<{~BLX^@)R=V2+@ALUF;jQeGf%y&;mRH?IBOU5o2 z(e7w8q>5&wJ4F$2KIpE7Eg+Ea?(era5f~>rW#|6ZubRKjNRAL!ctASl%idm#o?Dag zy<87qNIf*6Y|TRn_QwGD#s&C|G7>guuaEVzCF^V2l`YbZ=f%s! zux60>*SqOg&q$?52CZs+zr2mh9aKSvu~9uxciGj_jo0Fe|dzu@_t8A+&!XuyZp&O3nCr; zc7%}+qqCBD=KptDpBw*C3mylng1dLFS&><$4}3!tyv5_MQm2vsr$XaVPVqODI%XDm zGxgYCtfHL;e1u}(Hvkydom=r9rzPDF9j|x~*;>XuozvJ+aY<3&16a+4XUY1jCw}dh=` zz*Z{SmbW+BQKRi`(~s6ka|DU{hBJm-$Rb(#R#j7II$*Z_WE_lpOdA!s;#nE6M=ZC5 zUe|UZZ=XZZ(C-yuEyimvz~syFaN9`9JIm=4y^d!O6D8`B>L*p>_uF_ykeEJ!tJ0&Q z>GJa^z(tVEqb_=Boz|4|nE$rtGCb^umd1tx1f<2nEj+c|fP8@}Q{4F&YHuEW^AR45 zH}8l|i;I;XL^+h%sFUJ_(UY~~aPBg6P-ph-wS6k0|jw~>4v)ewJ%4AnV> zBXR!LBJY4h_B4x)7Sn5-2({eRDqHl2xM{6Dim8~Qq8;dilRU>Oa`X7OcTC@{qS*>3 zg0{fsnWF;ttJ2o}&gH|2y4YBQ2;L8~j z0@i2IEB8a7#zAV;?dWLxwODJs9`P-2Z4CJgZ6QZ78K~T+c$cmy?$;wq^%DIi^*kz* zQ5ORTgQ&Hk3S>YcncADPZ@H69P6$DwvfvKo@qBClcg3DdvlUg;lI_ zCPyAQIq3K_Yki(8sd&+G6=g_*Fo`lt^6FMCZ$EC(dB|{UU9Ow%#E+yJF`~KrkpymO z$u=zPaBEF+7#sna>Zq6m82K1JA_l^oqSm3R{H|HU-1a4Wp~N|+bl&_8;LKvF@oQQ4 z9BXJ27Ll`{8D79wRvWMe+yhHN>FNTDZZU_y<_<(EdaPIW2aeja583H8iE5DGUw;mT zibr;OlRC)5t0?N}BxML>L%tv16;2tyzgo+k^LWfE)+Ra=H9ioR0RK{qiH4%RHOJi8 z5oLhhP>gkUUS_smBpY;C9u!RPE3Qfvh^z(c6!3954v+i=B%*J>@>)Ts4%$g%cI=oq z(==jw8^En$`|m}jtMQ%;K&+iXK)Uh3!M@pWvHI9Xpg<^Ot#RG9PB3O`^ZebwdnWPR zZNV8={J3M*$L7Y{C;W}0R6$}9F~5Y|ndwN`ZCncOaFZ65&lF!;RWNC<*SoK$Y#x z#*QuB9s_5Ph(3SlwiiMnWzzB%gc4l3r278^lY5q>z|QD+Q0EU-7#y(o0nPNkiT1!? z=z(Hf188F3K0zOmc8uD$HkPMGj!G^PiRlM+(Xy=0f#qIdg4d3+!@Ifp)9g5Wsrlnb z%?yJc0YpYE8vOIJxj;C4AV2YC)>~ZU*O)oWsg@q+!fH)w`ZZ1Iqu6@t3+*VK8tp#T z@=F3S{fE4=87gHd^ws))SGG6gRe8`T$TokUNoW_5#-uyi4!$x)LO(0QdwGSyVGAZ z5OGrOt-qU?J$!R#e1L90p^95oOI6_F+lU7OScIY&O=m)US+DI3^&EB-@%~a`1mMZ7 zd*1i&-Ig=k_X0#*{6T%-l;xA&q2Wk~m2UTz;Bl;&ChNM=DSXs6+k&ZKJV|sXJnyI6 zs{9wANG!VCt=#?ng2O>(!#Uj{oX_cpD|&FEJLW_^*O3Z!maV!en5Y=1sNo}F5vx^D z-4`J8j1&gDR(p6AJ4F{G%lcghb9TSjLygLw_ZzFvU;wfhQZBk`Vy8)1xZmJnAt5&T zd!0E1M&C!n4(Oh)W+9`I3YeJFU~Dw+IHh8ye*jB7yz0q2T)GET+q7SFAW7@6{i!45@PNE+Ie4fTY08dF5=BFxO)e})_DWC~ zW1TXJyqnt8`>lFlV}~x$bNMS~lx3aCBQfR2x8c>7US0i2$530v_NCf_IWiP(7i2mt zOoxUEyCM8KRPIMkb!Nl-;=-75o)3#UK%ZS)pn%lUqv)&{wI1-V2PKNvjw$RG1*M)3 z%fIG=M^zD?JnIVEe_nRyX=v)x*zKbRjmXvs;b!6IghOpJ(}BB-YtH{_h-g;FrZ?lS z@d(Sf*=b19#zR^~PpJ~or0jMd4kZr*i6GvWPcX-FbqG={OpkpK>$KCzFCyMEpMq?V zx1$qCXKo^)c!QLMoS$=kUjFd3_oQXXj&ii63StolpO=N~FN$?lk+}{$gYt^?l-5sH zx{>dkDx6fPXEm0I*zBbx_maH0a2c%t6K^kMYx;qhwpT^E?{J{H=rII}&0AE>g*n^L z10&=0aTnW{4LnT!(;XHbL;81*0o)!K{V*+hV1j(xS$4~m<=pf{q&%d%1J7{gr?TDR zu3gWulGR;@)RBMv*kLXT0=j^$TIXNeQ=E%#{f$7#{OlG&v9x5mdAbF^b4CX5>cX*m zkhIB^-;$f%Evb%wR&bX1GE$yo>A>LXI{4uAj(O2IPF~DBT>rj#Rq#HpDwCpWZ=jlD zZg1%7=p-z$0E~fB$JTu=udkbs$w{P z?syCHv>|oE%6Ch{vQL#Z_Bu|@oJLyyniJa077hZv&Z=|xK7g0jCV$&I27Dn>nPjYU z!Oy@MIGLkGBZ=a!9)N5j$1qI^>$J;m|}Q)MVX4B-z9J;;X>ID!eL03LD^M>>m?XrCx4i zL{lvRnMJ}kY@?v_8i;Pyrb!4&YZ@rnNu6HVu(iXgy9Z!wjcwbuZ6_OVY}>YN-|YL=S9PoI{pb7h%$zedb7s1y z`r`uN~6&8g+!Yp|=%7*<}$lEJM_Cuma-1lBrc(#Khd`Py- zGcV<;u7}jlOEe&H4V#hCdfvDOx9>hbRWD9nr^QKmUe^IGVe?x_tk&s2uV6jyTk$0; z39EY}8YvI~FHCmOn0~&<*Rv`K?h&TJFH>?z9iGncA4lC(p8rD8)N8AE_w1uyLVkxB z&ga@VUtN{Z zvH#H_+$|7AsRf@17V8?_Tphi=WLg%k!}*=D1hWgZda1$!&>*9v>;RAaE7W^BzjSNf|_ZC z5LXYVX%EzTB@~n+8k8`g!=wO~ikgq9`ssa>gfM+B0~1MT7+{1W*sX;+7FoSS@0dU& zHaP}MFoLz%Z0ec#i#kclcSJ$g-RNmB=BSE(SNiDD^l-x4#Fiejdb8Eu&U+?sMOxRL zg@Q`;Cpdy|z~}H|AqhM$79rB zPvvWVOyop-GCLDJztmJU;Zwv4q0_v2ah)KWZPq+mDp%kf&VuFK_df+k-f5hS$ymux zt9!Dsyykn^B@;OB$x3j_TE$eZ#+74w^#t3SKWv{xSRIBOEMKSXTAzx7U$#N+xYO^+ zQm}Ky*O*BpNz4{7Fi=smxnS?84HJ|gx4fn{7Je&ZQScs(8+5;$*;v4VS?`^@IqvE{jVQfAA+g0H?EZYm zlnhIG4WlTh?CKneQ^PKO21V(&8APcBN9Iom(015tO~=c;K>>M+(QYw3(-nKM7WCWO zK2;0h@9581D-k_BNmJglFpIt-U>MV5do&FB6T;mVXF4d`3biE{LRyQ5{{sSc9{R;HIT2D zsSJr?A@G1(2Lxwu@_PRMo9N@iff}10JA&Vp*uuM$9S4)SWBJ{UKp9vBIhH4@3Dncb z`%pOGL#`$3^YI?XA{Cwgyf5lxxCJQe@Jyqz!Sa#ffkbE2-7V4MqUrMJj(MxbDFIPZ zvjXed%got+Ed5@#hCz^w0=UEbP&6>;(RNO^>mNFhcX!^Tf$_(C1IIT8crQ%pDU2kKS zgI|ZM8`gP>_6M62fAald3=V;s^UYt6?xZ^NN5@BmIJ+}iv6z<{(pn^rcM4aT4F5Fe z`-4?Mm_LiP7yCe=EevPk7WV78%fgC>9&-~RX0ZAW@zNX1{lj(wkdn0W6b8Y8IZR&6 zuUw-3`uzw!#hHmoae3dco`b{mx{TFT=^xwgTf3Tx9ANhRNi9(&3!T$myalDxnR_}m z7V_=ZSl|KYRhREz|3GGJ$l0G`nfaK{l;D??rirV=PhbUkfcFcxFeeN=KNuGN_eX@6-_w$yoC?JE%Deecgi z%XsW14?aVrU%lJ8_&u$n_Sg8Z6j+L5io<;JOKKS;Uu=AxVI#r8R(~MZhmCEqmp`D@ za;TT^_K=Q8+1PiF`5#e&L>`Tf&UCmsX;d~x{7sFzRwR&M*kCXHO5B|P-}crxnUUA8 zCmL*2-e$*&O-uf^JGJ)K(~N;unL!_(Y&G=|SEwB8qy*-!++(4HmGyabr{6h0NBhjVxd~0^AzbTq8*4+~SEU6}WcX{#^+FL+yNvrJ(8aLg+jkO9-AJjLlR#ec+ z(#n<8$QZDIU;doI8~UZ9{aTbcM9#8*NrW5q$mXs-6`Ym)k+sf;_O*M}D3mABpi!F) zF@IWSL!R#+P(eQ$l=F>d0s;5r25I{wdv3E4Lr|r_Wl;)4eoFY8aJzLzt!tmIUMUuV zDPq4;p{a4}v<{QD^Kl9{JtFfs4*M@EA9gO5h~HF21GP`8yTNCwU){Ko>OEf}>h%wC@j8u0ta`24@z@N9nPuY-~R5 zUJ1>41xa5{sn;L=*{S2Jg^7PVtOWgu|3slrcyr1i_3JoMQG$_a=kYTKP=7*ScK@c> zzxDZ;{64_@4H zG^C%lI+gHe_!qyS-aJixG$HY%G9w;Rxw|ZEX12aha*Z`&0!aZTHd~JNB+p-9!=KL; zl|IdUau<4_z*^vqNK&fZtxQmUt}Z8Ns#yMLPR zL*?FvBcJOGh25M{WOKZfldA(d*fF4DGGE^m=qxsN#ws4Q93^(nrfLHU(c0k)ezmab z+;ndZ1PHTy5yh3!2q>Fb8Bg%%{t9r9_F;wT;G`yC-&?Y=tif<=@LwGdz1jYuB4Yah zFNH4ieIPgr1vR8H&GS_EtA3W3Ft3QjS5C|*By1C#=F{SbuFfu*wf)$R=6B#yu&*{i zl=wkp9l2);Ewk%)RY<-;1BNw6#B;$#BOj);@6A|RX1)-Z=!;e<84<%y9Bvb>ZQ^^F zl5*(j$P_FVAu8{ij6fW~)17b)q4{W$cZ!lancS^^h%<8Ow}Yutq<1=ADXmU(L|wez zkFh2z-*WJ_@t2q<@hHo)vR)sC5siqg9aJq)S2 z`Ma~E*sRq45o?Wiwfy9`vP%a$>MxJK3*Vi}WA|&tFLyiD`+^V1=E(8)2{0AyO1-rN zFPi*cttiIV;XwB-Et&8)LHAa=63|NjTzzxHj+juBSIRHzaT&k=re(JcNw0CGNC7s6 zJH~Qe62Pyl8Vvevc52k~l6I!)YRL6sg*f*BQ{RdID_5sPoCV=KfCCx~Y>!$q-{ffC zus=~J|IJb4uPHSnsaU=0;rLH7jh(pihLzzx{0GMP1vw#MpD(~C^54I%fX%?T4v*lU zWI$DFRH)~O8rWESihsC&Q@ve^I=k*f?|X6vplEazP8~t?9sT;mj>nT=vHU=*bJ+(H z>#%dH`9s0YET|qR(#O`oNW{ZfaEZ$g{deykYIbjU_lt4nW4o?Zrf@TS!k zleQ0I;_V}VA2`6H9KG7hH`r6G!>>198hzUsSg;PO^%~7tVu%sVo%Giqq*Q(q%lR4l zL%swD3wKBL)ZRO#{CaS*nA*&4AqqIw!)4S$_Wqqy$p&U}9*c@atCJ3E0pArZSq~W3$bf4YSd|LX&N;;46;8ww zz0UY)rech&8hWziq>>MRB$NaLFmDtvPgbI7Qs)mhiiOW_{yVt1GNRz$p_n3A1mx+} zdrdlZLW>!3kM`2C$tythKkbJg&c*=Rw>7P0=Wr-V8vbB{nW)fZw)W%AV)f0rJsA0q zPs+btjTJ;nf%D(7X_xRy{JVl0RzIS8%vbetauVd?SdE<*U&%y~{A?ao;c{Z(f*g*Y zyd@EFcLFy`X=2>#dap*GqA;^Ov$0ieMX$>%oN#Jx4BT`?b3(q7p6*dBPD*>xrqJuD z9gM7XtT&~VC^jZDaQ2J?0$LFckYgb+e{*S?OONc6-<4`JHPTSweVRE84yoZ+dmAen z`~LNew|aA#D{$%0s}Y`mx^&G|yQTm-3&&A_?4bbtiu+)-lNg&75s?b!zvdtZl-bO^ zXo^ELJoK1wMnwT}D%2gV3UoK@JjI5u>wtdgkutK%z86MIk_8|84qaBT>B3i(oqhcI zE9@z1Y(~xP@@emop-kQoFrC-@q+f^#{jhl#)lJ_beAx5&k>{N*4asMFtxBBY|XeE6Q)nB!7SVU3U@1=UgaS03-ucmjGu{Y!> zt*Fc2G!#aT!Bq6=H%-i2qqFAtA1Op8&p3ubY&Y$2S7PLO%;n0(w- zNZV{ux25|Kon4P2Qo7Yv&Nn;DvgY*nUi$NtKcyVO`4oRC?QMW~p~}r`XgZu`_I4=k zN^v~`B0>D3B%L_) z&bv6FZCOV(u3^9=Rj+75U=r_w^27J{ZES-HwV<{hkN_M+O{MRphh0`to1u^ZKF^_D zf@6{f{rs#+i<)dPv=o7l;x?1Tl~iwSegj#NO^RMZU{qJatrQF!>B|=l_@u&^eAGW? z(}WQ?nUSR;gXuc17M!n9<956z_*ay7H{CaCc>GDab(KAPGmXy{i@P50ckx=( z+q*d4dSDgz>sJ8@NAFAQlRi-tEJmS2!;E}}Vy$o7bHb1-x#~8R8+Y=N9sVG{lRNN+AMlcY8xMe8B6VH&6c#tqo!jIeULLXo=d0XaJ2>pqOEd<{n zSGgHCw$2I#-FBjO_@ha0g4^@ZMKGJ<@X_Z{(IJkmRr_n9se*or7A-y15PG;0(;IZ{ z3Vq?-Q}Va#lS@7tZX_HLp5=%sOHhe<7`;L6+I48*L*1Fnu^LkOr zzFPk}g4GqR?bUdAcOE|-Q#hgq5>eY73@%KuUU?j>MCr}Xg6DvC$VPMQt%Ku2qaz?E zEQuJ}1lWyLi^~7Hvzloj7q@@r7U2PA>!cq_sJHn1spPZF7qVK9c(OWAChly?B`X<* z==bsC*!aLk%V{zW_BKo@Rb2ljx2P+tfTJZ{Y4hXOm4|JEUHz1swTzR!orpqLCB3RQ z*flcibV9}zXK)(2FfnDJ*{SnhVT5Yk=V++9XaR!C)kq+GiN?pa-A_3ST(2Fyu%T&zWQITrd9Y)L}{;>Y^kCn+!`pDDGPbXHd}cUXnb;O<|~|EIt0Z;ov!;>pt!g!Usc9 z*nRC9%X+n{1@&yI^$9~!2kGF-UqmEk%%^0bTg|yv!jXc01b_>MnMvZw8?{oF&~0IJ zppHO|GM0DXKC#c;7q$uf#hS_YDZq0%Ut-Vi^(?k#8Dqfw_J zKU*0(?#t^N0i78yC_eV9#5hSG3CIn?!@-^4x-IefLo5G>rs%nW0%hi@54RiyukEYt z;nVLQZxZ!U~-fxa7m)l_4JxRJ&O$!la5h-QCFYqeLIdp$;(4tcRtmU4WU}Or{%w%fu z7uFI`(?4oX(#1jJn~qHB=U+F}2;c z2@}Og6YqDZ>3Yj-)L%KN$2EV-KQ4_utC58!kSGldnhl8N8UkBbJq8xcWg{5t77W}Jc_YAA_m z5h!*C{V##peuZp;wv@D54YN8UQhOfaH69@yC4H)H&y_&{^`Y26iS(MqbEM_Z>H4Eu zYVwhZN*PRj@SFxN`(m?wxItxor8{|XEPdC(`>FEa8t7}}aDgQ;dHMOSo0wZfRS0m# zCiQC$U{Q*^cI$t?Xf$zP^_7GW-d+gG5f)_J%ngoP$&jaFa5?5FwZLi`lfT16UCYe5 zN7h{U7Tl0+@0srcu=+bQaVSl?khhA3hg)wor7PJsY^}WWZ3u@yQK4f5Vv~s4ig}^Q z90$8q-|aC;2~q|G18%Xek)0fPnJmY_XsOu*ulxSbD2*DzAOFd38U`V61^PD1JXkmc zMBi4*K(_i}p+WCVD9O5hP85j?>Go83WN4c*n{2HFTr1~%*_#oICgV>x2DOP1?bifS z@6GchbS^>`j(fa1axz93O{}gN>7IuGj7=C5jyN%#{hgcI{b|i-kA`puKYUq>-|dgm ztwr!>WV#r|pSmjp238Hxi@3@XJyl3uN85L;x?4z*qbe{lN&YP|Rv4xT)KhDWv(T3@##TIt z>4keraOV;hOi zda@FWCZ)7CpQn28KVK&`veh}ygLY~Q{2K8zy#!sG+b-%TDR}ob_yveSr%;>qU(vl5 z@Gd3_Si4}E&Oh&A#3FE!K{i5s!2t_i$b1Z$9-Y;v0F4`IR37AxnA*P%aB5DmBcl(H_ z)Rc8le%6A%9XboNiiE{bes3tit-Q<8-73oJfR9Pu@;BxlN);$Sj}U<=JheQ#@s6Kp zlqMBOdfK^=C#v4bzDUQ^VD8n`r{$=`eBUh!Z4Vv{8U*zE+AyX_7#Fvl zMR_!B2!)qtOp93(*n(MZX%RW|N}h8--`I5hCic9v@m!V1yA_4v`3;r(P!35ur09+e z0tFl>a3u_MQofmDDq#=^Bm_isolE5FxDb%MN7?aR3nY~L^!==IHO5TJ_+9IZ3AF9HQcg4A_;Ofk0Gx1Es*Hq-G_ z(`o_j0Gk&{2n%z!uS&BQTA=#7PrfQpw$#eIYXlwKfqUfrB@BOMhFgW%)hLFwt*2ZC z^7?E;frz@r3EcrR@*o(^+-;i$`9%{MDEHUU+LO<7PhHUcNxecnnnT z*Gv#g@UM*CYk`~RCeK1;XP`h~<_%9Byg!4U_? zl{e6Zq1rb`?lU1s0#J^4Ah;cld*d@oT>LUqN>r~V=W$eqC)ozVNl{a?E?N7ba{N4<)dh~Vr2 zk${ucPBS$`^z(Jlo`&-~EWfPhvwAyAtE2q>Ipylhs^Ho>qUklfSF4fm*OGT!4_$q6 z_&S#}fwZ;NhjOo29n&bpQ2f_9g!{ng?8M)DKB zD#oY#`~Jun89e6U@%HblC3Y4j_hI1x5}vm02SF>*nWXpiUWRJEV&mLkfyF;51f3~r9VuBNHc zbLOo)aDbD1-%r}1Yl-5G7Sxf0g;mGo3JL%M5DxJbw#eFiLFcQu8V(Q+^MS^LO{;MB&s zm=-Y6o;Ul%YfY$5iPZZs|0Wh1q%35t=fYus>xAXB$Z=KFX4c3`iyU(%eH1geq6=GCm@dGkY>97uzTm6>mlV%{82p_~? zNFW=50`|e!s+vwZTzJrxflfK~PU6Zu3lOo1uuQiSQoT~A)VwD`)M!z`<|&dx;d^FA z0>cD0;`YruRr1`ry~(hJ^b8E3rw{JkSts%E8iGS@F%uUQlZKw2Ji_g%Nfz97ueqS%eQb%6O;}t)L>iJn(N1n_xha(Y8EElKL>~oL6;v|%upimGqF*OM zga8AoE$P69r(kYGA9Q>N_>|&o933Z*gi6k@7r7I(;hcimmU=YfUmJLGg)L|&uA@#$kJQ;bI-;nqK+}*PIP`qq5}5ne^Lj6$qV+y`Ty+)E`+s?S59s9S#kyB zyThTjF0z{-m}mZQca8*Dq_E``H)i~x82+(~Dgqu0J<+r~C>_;ck3$hme(|}l1EfFO z27phg%~v+vB_v-@AIja~7p?~L6EH{{#OVqH708Zdl|$0uq+>h=9UzP{DfPOtjZ7wd zD765hc&yQd+7gqI&QY9@qV~m*zybiX(U^p&0?ygv{y0AB^NwqcBer?C)IF0d->y>{x;vH(@uaakYD=5M)lG|F?%>F7K1%=y zaZ}cJwv`wALubQt-^{sn#%8)&){XLbg1IPgzR5n&mtS2w$|YFltpW-(B$WS06!L3u{`eem7E+s_U+r5XN+G&o0I@2Pha&5^O2WkWkal44y0ccBt@5JbIH0LbD+Xatd;KH~mAX zOU&qjQJ9D}+YephEo(>|nuq~)etpP0dChkA( zR^~ytYiF~Clk>WApK)ojp{!GM^J9wc{!yY(+Gp5)@_i#%zSlu)z6ux>*sVJDHb(^r z!T2A2AC~mY9mqdOnT2xKkddl?>3Y?pW>=wQe+1Yoc6!u=iP!CUtI(9q13N?4v^@PQ2JoM`=U#J?QsTINEBQ=M}$eR@X>h% zM?$`4;|+y+e_DpTObHy0mWbs6QM5`nn`fq;1Y>_#ps>7%Tg`8>}lz(~FA=2uZ+ zHLLyXQtRr$-4$RbJ0MP3W4mKxn2y@drClFTRql2xWOra02*XkThyLa7q8$Ehdg;Pm zc!*IdmDT$O|6rfMuKOIf^Q)_gsRm0f^nOxrYx_i~FCY7gwr^(jbO8p1vKO~Omp&QP z2tLCNZGGg4IycTCMC*@qMk=d2XC@R$9{*|FC8F*nl`}T_D6$t9jyDVzBT7j(gNJDC z&C9UIAUJ$Z#&Fqhw_bpH^Y(qilK!VvA4HE!ucVFlI+cvJ z{q_q2lcd@VXr{m`L+-G4TZy%2rx4Sg9_^l|FA}_gPkx8IOt{@?n`c~;?S88-&Ec8I zM3--z%tie6WlIXd6A@#qwb{K$FYLoAZ`qbJyAaa$&<;c!Q772Z6_wB)*(8bSt@ z?*(U0KSlI$pPQe8A%FS#E}g-=Q{&C>)jU|<1*gnxwweDuI1c>5WAoy*BBdv5vhIiE z`E=g)S4BH)JGXu)ztA?Y7@@Zo9#1WFG`p(uqRImF`$8Fu=+NBoU5rY92OLs;e+=^! zT5<{ofPR?kuM3IYA%Sb$5Cb&!>pQs<&7W)6*V)9x2@m?ztKZWYG=vg6Gt!yyd@~~* zLSaO-P^gWU9C%VnYS*Hxqu^9ye4~H$I$8X3DO%$a_d9-U+x?xV#S*9AN89N=@@gF5 zp-csx;y@7!dxm_rsJ_KW6_f203)o6 z(=~*A?OLOogQt3^L2t$1*i0N269Z$TQ1x2kbMfm4S|+9FaT25gmg(4+5LOODoBppY z4{Mw=D8vqT@-Z=_Wb4cgS;$$K1U zYDX4LP`C;98Xxj?6T4w_#35d#jU>M)#L@>6nI&Ndyqz&D+`t$j1Y# z@}qN42imnY)GGu`gLXHVL#D?TNd#20f>fwui3hYNU?2?Pw!|IK9qx#RsI~v?{xX5J zIQS;J$T#HAGoS|&|JeK$0DBo|!zQKEKzlb8z^kXH5)izeQa! z%jUIzH_D0j;l=9S7FS|YXT0=}tXn|O#D~I9kDsmWjExiX<4H|WzBSG1tdhOAniS>@mrmpQrh4KC) z76!OOJjSJ-}y9)Au}_Z`T?L1Q6`oZz7jVG6KD(46tu_ zmSZM|Owz5szlFWMv&(x#0g-AABv8BePm=5tT0g(ISTIicYpv#!xY|R`}%93TV1z2)l&y_lWU)9xlI-C%>n zlUp!DXYliTS4&gel+lgSSDPsgA4FSwK?c6m-l4}-B)qro-kux0++h+z26lr+0qOdv z!wvzgEx1snEwz02Z3un^PIU~Fd@RR(9}Nf!`*K4*=N1tZ{R2P*pa{X-`Mw!OAKrO{ ze*9BYP=1hjz=aj~_dk4R|2b>_PyIgx;~#4Auj>2t|Mg?{50IuUEkV1;X#A@K@NtUz zw)1>;>3ZU)&2RxnPaz+*r0_OzM6{&M^cV^2!0zub%F2rTA4vc=wzJ#Zlh`jB)k`#({cVQmsJf6@VY0~eb1vxYk zhygZwKW5idmEARZ<68dh5-G%boqY~7+*-f#$JHjBk)*Y}S0K~+&pPHW=IlLA7nTq} z>N@}@kPZij+~q5zE(?ou`zM|KQ<7`#dYJ^STzk8V2V*XE)=3xj5+^B-U(;ji%94>et5zoW(*(oN>M$2UmPOt+YE~=0he4KL zmHnL2Rz-R>N`|1z_vZFCT8+?u=#Z_?za}smqCZ!6OO{UbgdXJl7#a2V&(N$=on{A27Zhy{@d4tU=F3ihktx1MxeYAb%~QQg@wdy3QSx&1$)x>QYmAZRWo|t2 zKM;U#Rq^&PhCJQsa51sfjP%k3>5xTY4X# z$|E1z4+AN3)^gg8zFEtq`$;}{mx$|sqE_R)$^_+ekbQI#*hV+}G|T7NK0ECn5S%%X z*)%^Pta1dE@huL#64?Tq-1y-EF()0AO#xN@F z_n{>dThr@b&P5Ok0aIDjmy;1kiF7`njFq@++3|%0e=|N~QvYHMKSVq%rhlT?f$mq` zW(q*Z#Tme+Mh@i&lwC<{jf9PcnRCcuh{FHtME6W)`sHEBqgpS(Ue(Tp^sm6B=@9hAY|X~ljL7VaQ&)hRlwj*^YO+^eVg|wXum2^n|OO} z8d?qOD@Ezw59p@?y0BuZR@LVDeD~&(`xU~=XEb)IJmf^g891Mv##u=1k|Oe ztG$|NwzA0)X*1DWt>t{eHZ9a%=N=`0KzIAxgz%dYB|H~ZoY>9Yh79pA8$vv1u-wJayw)-4ZhQWlQ-zGfUSlOx~6>)Z|G^r1wr z!FUFO607}N&fY=-eG{n(2)3;(T4k6ED{S6a$n=c}7{{5i8j@| zCh>BdK!@`cGL)&Zt7fvt5%<2AG-2)!n>#7kjWh-7Bvp z7{13MKm!6OuK4Hk4OLkeql>ecqpgWY$`%Dl)6muFT2RZI7MB#0#+V{(_uHQFTmTY= zuz3I{C^oA&{I*ZRCV;=dDM8zoN4B*PIoTw%@nHYDOZu-_nytG1V}p<1K`H4d zWjH4{z=zx1#5+L`YhNDc@sd^LW4zhk7-E{ZVVCJV`PcKw7`GT{lSdo-P(J(`qB{=! zWVl7(MAv%6)5dM(c+XtTA4JTX4ukBRXtkk*EeoRzoKSCky^TtTX5RS=b%jZ-fUyv>$)mmheEb+IaSnwm-K;jLqgSD zEKk1W74BORrb_1!?YV_v&P?ST1>^o_?-HmH$yGb123e^Dn3dJ=a6inH5>72+UG1wX z;^gxNN9R2mZ7tv)L*Guft7?0JxP>8JUX3`QIQouh`e$!kK&6m8V2Ve6T5pHPSHJGg zN!`0gi4_cf`JR|y;1XR?uOJb8&q6m0n0rjM0Vz4ZgVXvT0T#m3vTMzLtKzIc(K?a6 zDhy;`B6Qq51izIN+E9#f;|U`MddQ^ub|<15JwJLzQjGW?moJQnCc}t|j0hQW2SR?V z!|fGt@nP<0G{t{{4+!q&{Z8~aw(_oAgB~A=kXm^J946nGK#nH9x{?~tx}0W%BkX<4 zkT_2?tB;{O9S`R9x82X|l5Y9#CX2bSXyGHHI{_W4wc~3t{3r1SWYc9LES~B7CMfd8 z&VI2z3_#@vQxLopOQkvIFY#^Y3S0^Jnp0io*NzZeWT8Rn0QWFtRgV}-d{a$--*}~K ze6GTQf{&@%@>G@7Um*2iD9)RW^w2_8#PaoSW9r}lW22Y-K{1|+MI0jZ zx_{5&);}D5@w(sMNH7K0*Y_O#(N?`ZCf}6PhR0yB9~ZOU=<8wj(Bljz`&>)j{RFrytVBZsN<{09joiCS4u(84UiLkxiP`{yHaffX6{z zjkO;Xqv*Hk!X@C_$t+aU+I@UiFEsN6wSRkwKM}ly&Txf4@MG=;V`-M1W*XwveJ;?- z?N5QPpih<)NHSTvQ!+kz%x|8$=Z~ebGi&f04H8>Z@GuzzRkF85&0Cnr$qm355U*kj z5CbKYArmRe4+sp&0UG|@8zSPcEmcVRXF>&on|-Ok^MCfolyL3`rvQh1p?P&JDHo}k z^?qfP;l%tOX|11kG_~P&c4cJQ+k$bb;cHQuu%asFlVAwQ)m6k_-Mb->wbtnMrYwm<4=>gSkMa(Wsv+Im93%Nu= z=3lHs0J|_7?dqdY-LF3W&5?57p0opT7QRA}s&gnVC%&vWF(Z-hzjXNnB)%P0-n1Yr zr@_)l*~drC<6TJ&FfqF9N?6k%!;RcoG7_La6J~KJe{p7xsA_PorQ#Oi;+^V75BwwI z!rw_t?B2=B%1TA$;9RF;uUb|pJPBpy-zM?DHyr;jqtg#R*w>9fPc?a9V}e)4gcRYQ zrPM`)L|}76y8V%?oQR)+^!v**NtQ;D@LK@?`=uk*x1H-ml^KflKLw!w3P4Lk$^NI{ z|MP~+SGLnk7{jq61d>F#f`n*@S1c$d9G9>SkX*sxx<4**u^vxjofz1u0^^awikk73@ zvaN)hl50M$B=6b#S*&4;fQ?vzefk8<16GtMeB(=HFBX>hMWkk^HIKK}f^5^6(dBG< zI4!l4@Wlz8&}JKZN5!^uqaOPA({pm@~aSLArOR%jx^5+n;EF*PAn-ku5HMyRl! zPIN$MeoA|pv_pN(ykTnP*D+%r9bWUA!AUzJ{@NMIZyl5P3F+~n5H``xi{QdHLcz={ z2oOs^kp5;e32%eV&u6XY&(4)Po#e8%3GrIVv!>-sia|W~z$b>rXnh+K&uD%E(9Kkv zw#UuhMkBQ_ExN0`zzvj#i@Wwkn}NBu>pjrCIJ_5+N?TM) z22O+n0C4c&7auv-biM2Phy)%2gOO&3k4OKn95UL4UVbfq+ZZu`vz6??zO zP{sL2Xr*Tce7QNz@gcDHa&cKropLyw(Tadji&;&kr`7Dff!^3`e%}fICwp2Y6OeLG zeoqWtn_5Vwuhw+g2N?`<)+Q>>PD6^0C|2Y8Wp>_Qk%925XM3t}KFdZ1y2!FEyk<*! zRcazkC>%~NH8Hu4C%THo249|plYZS>&zZwPL&)Ji>Zp0QyKcYL?VUH?`!Jj=Dq}g$ z$TB9adFSgediU5~c3=hm{eDuL12cRPt;^t68ji1Nm^{0y9223K z);OtYnhesJPZ%Aw?%ubG(hbufbVOH-VRc!~tI#YKm}nXcj3x_Qb+tiLMEGPSvawcb z0RFM4faUiJHVvxhA5**4-89IWax-q0dG8K$Y$e5@;K5W-ebZ5Fx3xokiCZb>zX=I49T`>ivP^;_r>|MjvtPR~x&W}G#+zkyRw${DY zn0?z!x<}#2W@*T~M0QDj{fO1Gdro*aQ|6x3jROgz{$dJ3%h1?Bb^KDK;f)0(@-S2x z++qale>N!*q!|rIA|1nlICg9^a5ho!vdpL1&a(pe((H;cK{ZQTS}-#@sTt!LiGrul z4CXM3 zzo+Mub3VM6UhfUvH&dfgqm?oAmcjlY*V#jeG5vh(V$33ny1YNy&&P&BZZLn#KSqojoclKjloFL^hN-_&K|t&f3RET?OCw%e*WD|^8fu>CC#AsMAFY0*4| z7m}lGPRZA5&DZE>bpgqbuUCQ*AMu69Yx8!iv7-~+w(3u>qboDsWq<`aNiiVn7a*|_ zc2UM4Tfpx5xk|~PX7-ySt<%~H!Vl>lg`k-;u=M@Z+LNnqEB&37VofR`^_GC^<3bqa z=9O4Q;%oWssc7wnC;jO&yO0Qfzs`zBt_;M4jyxG3kxmRh6TeU7fF3LG-A2^QD4yi| z2tnze@>{NpypS1mSS3)44A7#p^%<%ic|#nxHKiYD`Mv`P(DAXj2YcgIzpiUz zR-7^Q>vy#`FzZ4g+S*nsK7wH!mpiz8>f2y#oP6UW+NJlZVQTU7bNtI$8M^ChIp|Mv zhDO3gTTT>&&tERqsYp_b?kO!R6-%mr|2*nJ(z0I<4iPagS%0i?ly@k&1`Wx%?hPqo zgPthd%#lk?$mu@3MC|!X?raDTedrFB4<#(_Ew0OQqQ%6(8o^6TGR1wFn*8NukL}jn zL3`P4$6+$*3UlB{P%2Ins)}UQ{=}CPE%xqoS7tyioA+9e!1+~CTqH;zcT+zyaG>V0 zH%IlUx=+u2p}H)R>{C`iqEerkS?c90H(9+cg+7{uQ=tBeuS(E5BIq3GdjYkqft6@} zh*-U0&yd4<9@l1ziZ-AyL+{LDY;@YR`tD#Wlf<%BSvvm9HAozSi%D33-p2Sl;965L zXj0oFw4jusvgw(Lbu(OpG5wdak*(-@Bv!1VN7ume@qCw%s3?j*dcZVD+b$1BY5M)X zx|E_KGFUW#H4Mh~yjPa1bRzhqqBtQue0Lk8F))48BJakuC`DNrwQ;W{P1-U#9ZNyk z+lieo>uAgSlL^JTO2g;{!vMA?jMKv0$NnWJ}6`Y8YlmCo3G(1Zf2MsDjJkCQT5x9U4e>t8BP~W3P z^2retNJ_)AQN zA`Wz$gFGL9qNhNtAcLSI)fQGHKI%CHp^{i5CAGZ;`LDEo;xE6;x>|HyMG%K6j9CkJ@Ge774@uB8H>_mgn%n>MTy%)2@i%=hOo*xL_1t z7B-%j$G1k`tuTHxl?>lbePeHIaktCKT|BKpXCyJ>3mE4Vy-q6p?B4JPiX@PMKq$b{ zZQ+u_X~GnItnMg`wv?Tk6+M5i7d5?N%SsK%Cvfo4_N(X59_%aiT~?j#4{J4kGFTw5 zH!DHT-Hn14cKoSsUw06IV;OOc7W9ycM49YGm{ftWIHOUcSErKAhkdH0@N~0&=ZX*BNMOy3&1C z#f?gb$tFD9>blax@MG2uqB7nqzA?Gl$@7+KHyDx1e+y&}atPo{^sb>f=+IBB;>Be? znZWDv`Itt&lWC?U!DvpYJBbF9yy1N3-a`-j$vlnk-@TJ-?uDBJAoCi0g=(EWwNF_nmK7X!j zm-)7az+iLmU{B)ZZ{OULBNiirxrbNcZ|V0wQ-2}#hX~HpF>dEk##6F?EJ?BbpVGc5 zI+HHiHc7{}ZQHiL7#-WT-7!11ZQHhObZk4h`R{o+@AuYQjZsy5*Y=uotu;L^lk`ff z=&ar9*nbXkF#Og5r6CPs5>{lze#fsYZ7$o^BCi->i-f6az{2BW%w2GIVdHv2Y3pUN zfe)idMEW=&=q_mQ+t9K)e;Y2Vni%29+R*6qZxH9nIGz!bx97A!XZow+QXkJTxh?Sz z<2qO`&!wxSRdTlOPc=f`48TH?Z_IRqa9Zn{r1Vq-$s>9V;$G_-t41vT_TKIxETf== z#s%5*DD|wOEe_xAFMi{$F#g0&&q$Ue8cY`cX8bA;D1QZfAEDAAU^?T^tV$`bTHC{7 zac4ni{&mRAi)2$5@N>$UvQ7gQJ4^w*Fd7BD3puvnA3lNs=^Vc{5T7>=h1}W2puo4b z;7^;nRZNo7CZIjAkCIUPY1}c=CZCZ6fpVNl$4V~HUWO3(nuKprM`>6@%8obi2ck2y&fKcy{SvA7A_IQ?#0x1mWrK{M)2g@<>m$jEf2oz zWYKsG0_~hy!-d<6%m#_xBFUR<7+|&hOzmNEkv)X!oDhn(=Dg;If7xz1dI-vytT-2s zB|ZEi2UIM;ib57*LraSUGIC;H4&d3-^vFH-l2PG7|}Gl8(Bt)5R?7BC%xEXqic z;|y~zwMr$B8S$vn?bbRUi^UAx{O&iqE4w_pKw9_Hw`O9?VCWg+0%&$Q=9YoLvhcj! zX9Xk_Gy6MZ31&{x1_q{5=5Sqr{{~62By42S+bAKhmczzFE)=jjwEuU@D@`S>rm+yD zJ(B*64-5SHAwCZ!XE>|R*t^W`9<{}8>+|tYXL<|@I>AQw!>TL27g2}T;$~LG;(gih z=VY-8X9Hw7mm96(FBE$pSkhj~NDSzsRh2KZ0T< z5iF$N!1XzxwDRcs_}6V^SuQ08rUY=BGt6mZ>a8qCUYC{smwl&1M}vQw-3 z&{R>usN@!e8Ay@hOy!I_!KRkM5x3`2L>3moz-c`Yg((Omby_?&q30dP4~Y;*F1EP| z$g%s~uP?7CtJ!MsJ>Awhk)&N*v)y2f9O^wEGQ+YwO^TNk#Yck)UgDYQo=ZhVxcZQ~ zashZ(CyO?X#A@FkxU47+MK;rzGz(p0CAR*tf@t}znY8=WKWfdEcnP@=VC)TzyXZcK z{xOi~(nS39eVeSn&zV9X$=i8B|i&3ogF3q#DaGC}Cfqj;kr4V_(v-lnEsqRGbgG326t^38&<> z(@mrss4gN@42L$Y1hO@yMNK3`;m6j5W}+HR*akG>Pj~~VPVou_f$>+5 z_!cRq25;r+Xh&|*n?Y+rAV+znb(K0c?Bfz!Xi9tkV9&a34K584#1yn$QaugpNkLg; z8biJ-JqCt@`*GIuE&C3inhqJ}e|^IZ7py4Q1?5XPR4zQ8w`yk47cD0z1kdIhuKz|r z^Y-05jM8JOJUXMsdH-MJY`0t3zYfvfuMnoQ+2vw2&1j^z-TUN3s_xUfuAJsQrq6~r z4+g~$Yer{_KuWyqf5_Tr9+2m(>iG0$DzqFfwWu0}KD+t&sFiG?bm;y7-~aJluMyhq zUQms=fqQ>WM8o)WXhOx^P-7sq=>0y*-cxhfES zj46~9)?xhMqYXMG_Q5m1j{De_=IZ-|n%0VeIWKXkKngsiR!V48Mi~c9ku)Gozn={k2DzK2`h-}hS4QBa{F0^RY=w5vnr4A z^}+jNLG}QUM#fXaWX83#FhW>tK)W_Ndj>O8>B*tpcJF+f)!vlTaH8uOP>QZkv_q~FYR`u z8izA*<8N^MG?oR_UqX&Q{#XHZP7rd~uvb1DTbwHKUrs!S3!=e$d_J~ECTpZAz4O#W z>#7rpZUbgvJ23a&;S%Igz$U5$W;@ZG9gOghWMlK7EW^h8$Jx`ypz;kM{c4g+!H$G# z&sZSwoE%b=4jabdB+J3=(vM3=<>UmjCd{YK^#*>AQ6w8cz7Ab8H=<*wnxMo+nYVyF#99n;xxhF664M`YXL(5q|m_;{sYA_ zbR*EawL|Ul-ft#_A^Hqf8;7~`Q9_;=yjq_R--WZ4Z;vVQQO3Etad*h71JZH0+1J-L zz#fQX!Gp@gifUTdGM(BV7ESg@C9`4cGyVm~>hd{XE*7!d4v-Hyn5QxWYaQfXgBUG(LJpS=w15lIqNCGT zT9RPX-Xlogq^M>{g=Ev&(eR`mbi2j9zUg)Z%Z4=au$>CALE8i>^hu3a6q<(fQ4HsDYnyW9sHC+(P@hI6;tefFe`atvaFLevXhsn(QZOOTGQf1Ptyiw+s{3sQ+ zxau%77=+;22=PuJ?m_+1fq3)joC{Svr^bH>RD+pgHc9AV)_H)Ypo zgL@lbXu=&Xwq3sbUdoGVP8J}PJ9IRSqoS-~B^mvs3m zbC@tLp179>uZ~t%Y2)? zQ*DlQ0EneitrEMmOou((xCu&-u4@o87veVj9piPFMT?cv%rb7!!|na2E@UXRzhfdq zC7z=zS#e|NRkvmwg5+1JY1N75vGBgsl>>R(aMH8JK3@aWS9%X}gntfQoT zDOMdD_;xEY3s~ZL&TFC^RL6xsnvPfEFj@Ba1`zP$OFB{VXm}mv^kijGUHp_pTkc&alh=8t7URPvWkg^=1 zRwYjeAez=^*pYu{-hhZoJsNIvuSG)}`@MJl)ROeYi2R|>>_n)n7+{NVcz);~5I-Xr z;n*Udg>9{-l1TD+fWF&hQ+Z9gu4sggW>qkSEUnll1y8$a^90HrWge9JVWMxwgwHb7 zmQP;(P2rR}n}b0(YX?rtlhkr%qoz{5k^jbwmeeOn5)9VniH~_Q5u+jNxkgk~AO17( zVdZ6)JXZ#7Bpd^z~y%SvIR-cATmYMn$NVb}G?7ZOaz2C{1zK>37J zb0DpxMNmW($%YXo^{J^*jC6L^s1C<=TPA69!{uB$9$OAG#2J_S1d8Ul0$7>8VowjC zmy9-`_CaH|wVyDZaSQrL7b6q(e`!QSK%<_J>mZQiy<##sK?TKtqk!Q#=lY%|YNquV zbPIhOQ&Z3CB4wgN3oGs+X@!NOI50HU^JMI!+{|kCC{UvShI%$%_x*}`Qh?~k>lXMV zqVIi4Rm59TN$oo5`jFi)0S-Y9R&7X`fAEedbkIqm$Q#8IYaYgw2HfI`QF;h1sXdA} zB+j4ktS1Nl?HOrP$ht%ZM-wWLyBAr_TKZY2WGOXe+V&@H8Vh`TeAx>9!AE$0NYyUh zx85oFGjASyNwwur`;~W^=a+GQAQE=XGHAu=ddw@fXZVc4-2}dn%{&leNxLY~PV{?U z!rtsuig$9>pH#CsIhnzaMhC1t^7GRb?(qdh>ioQpwDs&a)lkk`nZk9d`~9i}Qpf(` zVsmRjiv-;QEf3Ng$Tspu@F17LNXD8$WkdM5-a)_cf_XlQ{f2%Ew>ENA$=t&|-9ZZ= z6-Cyvp^c8ViVyYhjhWv*@z3Kuo<~6hn-uZ|uF&}E^4kJhq>~FC=|NFIcaQ;=-7Kq* zXT=fFsG(V`-_zrdnoZ>K)kXJohouYLkc5gSPng!|M)OAzC)PxF`R0QwKrQomplTW9=aSTD;|*f}}GseBEurQc)&41&`c7HURHhbS2F1$YP5U@Z+4X^`wcx z?zv>?fx#8TvcoPJ3R??}f5_Ta^x>1Sjn`pY9OMuj`(`HV&% z_+JquVWN1DgwX710V%ay;SIP&O9-~)TKw5taKFZ1=IUftGpsR|(J)v$F-6MfNT zN@>E4O(~zUdYw5_v?N>+QL3pP*Ct?;^-cKwI*AT!LSLZfX_+5R)7ziZwGe7o=wj5i zxz?@Ud~-Ws202xxUH6)ph8)LjK4vbe7N8T#LaIiO|% ze#Lw%usmS}*F#Go#}D(90gV_^f**S5C;saCH%-kKoZ9K)>2@mQ99U1hXMDIV(jkA` zV`-}l*w5)o$_2prb2zl4pTqkt*6IDCIJyapExtc0f6e+Zo2}~Zb{q0Lyhb*qPAgmn zmn~5eJp;2_(q_Nfedgvr*5p08$Ma<-FcnuTbsv&YL`rMf9MCfnvzTZ3l=LTZur85l zR}_DwpMC2IeV&a5pxk29V;!RSFDbwv5HC!GO;8uuyvo#9f4Th#V6EW-0a4LPi3+Ja z_#ydxU8J+2kZr4fNF3n15*caN9W>MJB0z=57NSO#?>>ES7<_hln+;63>AtRz7}>j! zg=g^t@p$6Jo{v~AOz4WXC9MM5{9Mrne@=49WZtp(uXlH)Q zyq)epw9a;Rx3df5(RCyR(5?Zlkd6dzR%lk_27JHa}-jik1ZuRR-BhA$@SNm%tK z-><2>Mp=Qe;JOQDX(~Hvh%Fj9Eeex&-5&Ci%+aPjZJ8^NnlLCmW|cJ8L93FF^^Js= z-U(m0+p7JmX?aJim(%~z7>FQi8D-;M8V_tn$bTCQOnQ2M8*r+S;Sa7snM-UQkwr!@ zgM!ukRaL4FIpD^q_ZdzyGTX({!(4fI4y~yuB)3j`PbgBbPe~n7Dy0Knatwnqen*Ryy*Qyj)$0lp&HeZ`_bK4$;%(H>k_^fA`g}3 zG2Z&m2+l|?(pKF%I_TtqP2+LK-YO^+XeQXw{M0$urHPJ|8amhz*16D+=dW%$#EQPr z7qazPdJhE}+EC*gqBaGQYl(e9{W!mO6pbnoT>6Z;7+8=kS9$);t%JX+md$uD$tER& z>4G^2lE7ALcxV4rtLx>pS!r>s0tT#+fXlr z0(NNi%%lm8tW41ovEJ(aHfVB8$3OmS8~P3_Ky7!1g*$mUNw3o}&+mku25nsZqFG-N zD(ZOUiSD1n?7Z;Q8yQ zJLw=jj(&10bW&@&VW|dH9c)!1KcnSISr|X!w$>CPdBl3+)*nC#cYY#D$k<*cnJINe zVVc7BG4{jMwvsnwKi+9ZV-x7qZShV<7qJ8M{uOzD^v5xGuLtL{clMrPm7>a*=0u{D zdP~RlyP{!euvYF!rwrZcpW{OQL3TNPTZ^yiKq-b{T$$^VI7(dt?i&|$dvaNj6zWT3 z#pzXx{Dk$Y(9^tya=j0e|b5m<0zC%SRYaA2`<-VR>mreT5Xo&CUpL^_FzM;lRD&R2Szi zR55QRr47aHtx`R>7;9+Ext;0&0kGU4Jk05Df>?x%-b~DwOo~>8q-LceZa~BNpFZbk zt(`r?1}GBGh^*ach$eDBk&7}|3yURulM%Oep^7I5|4*=H0-Fh28&>@oP=r;+Ip40{ zS&cNm@BDmyLwC}(0>x1X_-9~0O!VS~#;rEp9y37Q5P1BcEGBVBb-Qcn)T|J(++-Hx9_Qq3Su1sbFg;*R z@YxQo_AT|3G9hv@<=8YS=r)Mi+4Y^{@{TF`-8+#SEoW4%zXV^DFa+m1j*~sZpJvNSgaDQngsq zE*wKp9y*3nUtr&mS8~PSb0{6Y>>+5& zVd~%U88>*v2wOtS24O_ro(fx87okLkAKmhEbsNc4`o~h*HQGLzh%{Z!EpIA3b`$*l zh}Wo1Q#q}f3*!F$7eIl5|YiIX}hnwa07cxGJNXBVI zGQL=Cmk`y0f!V4p`$j5VJP^u?d|Je~Ii=mw3brhBcp+Sa*Qk_`s}XJ?x@A0&$R^YS zW}6;M%{k0_qPBFuE%Wm27Mpm0g$TcfddF&FkKvzI#rpvfdMft?6OO_hGf^=egTxII z<8CZxGkS-S6vN*OjpPGMral?L{XlYEI&3u(u3nx23OX4*i`uAJzj0s%J#=l@6uMmH z+-m_kZX_A5)=b$;(qmKslx|S2I0RcmB77?Aqv@0dztSvmSWWbSl}~$My6CgvvZUB5E@1*P}CpjyS?p%kIMvi^}rHcgAqx86UamxWX2&9sXNKHuqPZWwgO#d5!hHBt-tWR%G$5 z*tRDcV35Vx$f1i}z1b&yur_Q&Bh`)WhxN zw?~Jcw=(Kc*a43Wnz3c@gmm$k2c8!-f}Dv1@i7uPq<})s#B24zN}TDS zw7Cdr*2+Fv@zhWoHtT8=Y!1gw1?vWnrN8X3KFH}B}%mw0T3rdp8F&&Pd`$(IAE*O zZWE?}FX)MW9Ob(o2bQBhFCS2x6BiVsuSpoGBXG;E68(xd1ScCXK2tZ-9BC@v zTrGTE!ufHwe6)UAH}ELBKNBl&-kb_==&)GHZ(lGliB;4$H^IN?n4LeL;nHn!k@5~62*nzznztv`{wDaI@jq9|XmbHtcSC<}P zpq7~2s3&7p1p@BNv1M#~>KdtS;O zha+m0g$YAel1zKCj(_?I&k!^q+&jiouerEfj6p zza{{K6iGb1L-aEYZA~rPs|m;k9kiL`iQHgt(kp|4%N`d@KHeu#O!sI|nCQ%H-x)L_ z`1?>di;N#(6kkl!0U54~z0ujs9ZN`=t-w{r&i>Bth^LwGPYsCP9lLtjZFEkllmCv7 zS^~XCB2Ou|t+_>Mtid=zZA=;4b96F$N9Q+0CbNT)gHmLp#xONPzdF(c>Uw4JCjr!7vGKSlWrdR52y z)8_H%q|oEyd*r(K^l(>j-1gA;@%b5P={_s`v|15FaSI9`4&!~_RjQs7AORo@u#mu8 zQfj3n`!&W?F_t)VDXgk~X;sJ_VEY;L^bp#2s>gAhGW@{9I&VdKX;>lj7?keRIOyJ; zPJ|=Lt=k`;=HNr9X?>tFBhw+~oqFqg?}z zn1~wUcg+(Wp&OTfDhs;Z@U+ei-Ey|%3jx4crwsvW2IC>NiUz(}Z_G6gQkHDGeKvC* zReK5F7S$=Li~NTirI124H854fp^0=eIAevro%Ls?S;!bLqAw&zG6fls9yTS z-TTPoI@qAsKDSrxe64VLDF6GBQsHU^5*^a*JFsKB#BCsCLp5bLJ^z z9$7I2Cof&>Db>;{s#lN*4Ui5+}$co880R(qW!S0 z_#rtZ3kQry?u0WCc5LZcS6|z?MB8{oJ4SDqGzyZJ=-5Nijn=i6J_2zZ+;d=yRz7OB zn#wOC(=GNyU!9#aGLW1u+l#SS!FM@rl<%wkl9R*2(*YTnC=Z|>{EOz6$s5Yhn&bpL z%=Q&{o$G+A^+db9ZC!Sbn5wUL@mN%jP7AO@kEK~)s5A8FNrOKwGSs`7Jln`fI9YhR z@%R*h+16|;N=oC=E!c(-?r%tZ2EnpS{XxpI0Ino92vB6>W0ZZ6uU0(LAoheVQ>%6F zwG#{*iLN+`q(KjvefJAWwhyAWLrD8tl|OapKd50aXU6_R@mCz+yl<#p4s4*B+V1R%xA??=e#%mPm#FIj z!{PWCwQ0b@#k9_xIIurV?9}?h8lG|>j7v^(fj06l6k8yrlsRKlk%@BYtp%U4KS56w zryH&r*vy+vCT>qTS3C;|wI0;q@!6rcw)VDU1sx2#4mzkG^&AUVIC#_qtcnXYnXFt%p$%s4J!O0 z2iSK6N!d<2BLAk^r21p;=IEAw8dE{BOwm{%14099R~;)KkeS+h$SzkI3*HNAURRqMjwx6ktg)zfqlODv$IU2@!ZGI4~g;W@W}ew)Qw()P%Lrs(Ab6 zUebDN+}vxN4yC=R&o5%Yh(~W0Vw8SAf&bp-sh6;u5mG!%emO&CX{)QH=a+`0Q&?RK zWcx-iG3ha0XpnlYK10Ll+^qrTP}s>@J00iRu7AsMrKEfDW@Vi(!nnVW-B%!$h$6am z_FaF>(?&F4SaLB~2(3JBdQ^6R(vh{+d+;u?$t`Nw~!#(5Z21^8g zdI}qoF?IGU+TQFBP}lkD=`>NdW6`D@d4jph`UC~dwA&)rUtTOiELd)5a&OntHnjJy zF?VoVdc?4No~+C*J;xS^60wKWvToImhVp?xdQHr+NkS;jK=9@})|PbNPP&H=gp88U z!oI76L|4b$!@}a?;o`29bm%oyw*^y~uZSc&?aw) zh_B;~S^yLa_Jk^38%KKTil*beV5QHNzGY0I*aBlwt&;W4wzwU^!B5P3oyJN$3^&}g zuLOAe!99)mB~FU8+;j8bZ;~1l9TR}LXwZKd+csOKZ*rt%vl~^_$g-Os;d`r*A#P7i zAl)IpR#$>kM_E2Kb??5pTYuH2kX4H~puB~4i)(K?5S&xr-uL76hd?5N5F^<;0r0M5 zsHtlmSf3FJOGQCm{1ZYw-a64lsi_rw8#}Iz#12nBcLJ_Lj*73X&Yt_jtH%O-&=Vq{ z2gX&SpAU1P6YYPZq;D*J?GgkmHhXPum>i_z+lRB3p4BK(y=sJdJ*=D&eUd{G-=qOL zwl#nCI&-1RVpYnWUA)$oZ0hC|c1%HeK)OzOWC86AcD*h%x1C<@kcAbV?%-QH`vH#t zHIOE{91~SMBQ7Es;h*SS*PB@)F~tRyp3?lFOBM9AM`(l~4|m{f*5~4CS~5|NMqgd; zd%+sXV1O{OjtPo2rNRo~jfBgD*enyMS9;WNdwcO#%2{0g8MZM2EPWLh;00|}|6J#X z6Dz9Q8z_I*R1A={Dc9CoW}hEo`Vo92Z)!-9>`g6SntckD?y9eB*eD^0Vh&OY|9_7B z-t86z+R}2+Gd=H;RY`3??!jLc)c$m20BfUh*pPUU+!B&qqSNuvnbkqU6AMH<0YEmE zRFJ=WzAAkU@6eok9YA$RB>O&HwI653As#SuI%X=+O2HyPMNkh#(vB06X69lD+(smg?G#jw<&d3 za6UhOdFg>^Xj|d2I=q7XIPl_PG~#auDjIguv_s=w5TQ{1okeK)on>hDTqJb$56#u5 z2@dBv(6ULBRWuCo!~(Lm22NiR1EsVO4bA@QdVliff=|5M<<~JFZ~lz0-i@{liXT=G zC)Gf9vFW=iuv>O~TYtKG9cG97<_zNoUGJY@Pm+S7K{T9J^(~cWHjGLuxz9`joYYU; zj3VUkMO75-u;Z`XTKbsrvDwW?-wCG~y>8#Go43c#58XM}M`H8q_EJDagl1_dJ}P{} zeycn=IlL=@@R;$-VSLhz-qxdNF64i%BpZmetPm&siQb;^N0ud+2hn(F?#|K0C*dLI zp*tCFtrXB9#`VAfG(|ZNc#RRQAk$^BGt1UX$mvqwx$2vxO-s!iP3Lo$Ev(F={)nvt zh_$&D-dS&PY&)~*1qnmkfo{R1BAcDH*vm=E%Exqg7e%wG+Ei|Md{*O#W@U}1(@9-0 zy5FX|na?}2u+NV1OnaTtoe{JZigLo;%sy_RQBC?A1x6;=l z74m~@bKifbVl#kfghw}G8A0XCXcRr4)=zt{0{MztBssg(k`)x`{Q&C8RHurgMn={5 z>eJU~mM_t$9MZcoqb_2(rFbw?jXyGwSoKwp8x6wp5rght-)jSHIUo!yyH?BRa!V@L zl|c#i#`T!=r&elYKP;NW-Zu@3>=s9m<=oYU+JaT3Fp+TTYJYH=Pm3?n_%_Hi6*$ z94rWk+Lxy#*nj*pf5Xnlywv;VMyNS5EDqL+ow6Q;KnP68SkNXe!R2}LL1;Z|GLM1B z_zFe9D*4U#MhAK=Wi_qNXUJ7?2QY8|xaL1JG!{ZkdrYP?<8ZmjsPOQ#&SkunK0Ed2 zj6ndqsk7R_Ag2*Ci$|sDzPGO_@>DfcMjX?H;bbmzd|Iv09OgDL!{Mjp+vlp5>a*Hb zxos^D@cob$0fEnXw$lvPqxvJ?bGDallNgD7MwKpj2X9ER3TcH1Oyl?x9AB-$Uc2A= zi$7r?6mpfO5&47a&J4?C1V)-D*{O&VNS?k=qUzg7{v{Mdgv15zIagiRhWluCjfz%<*W5#xm`J2~02yPqRyjMG?=hZLbU>q` z!KePWvE}D>*3nvU=V?HWrax!N{z*7DQ{VQh2�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 literal 0 HcmV?d00001 diff --git a/test.js b/tests/basic-test.js similarity index 57% rename from test.js rename to tests/basic-test.js index c32417d..fda8af4 100644 --- a/test.js +++ b/tests/basic-test.js @@ -1,5 +1,5 @@ var assert = require('assert'), - colors = require('./colors'); + colors = require('../lib/index'); var s = 'string'; @@ -11,8 +11,8 @@ function aE(s, color, code) { assert.equal(s[color], a(s, code)); assert.equal(colors[color](s), a(s, code)); assert.equal(s[color], colors[color](s)); - assert.equal(s[color].stripColors, s); - assert.equal(s[color].stripColors, colors.stripColors(s)); + assert.equal(s[color].strip, s); + assert.equal(s[color].strip, colors.strip(s)); } function h(s, color) { @@ -28,7 +28,9 @@ assert.equal(s.italic, '\x1B[3m' + s + '\x1B[23m'); assert.equal(s.underline, '\x1B[4m' + s + '\x1B[24m'); assert.equal(s.strikethrough, '\x1B[9m' + s + '\x1B[29m'); assert.equal(s.inverse, '\x1B[7m' + s + '\x1B[27m'); + assert.ok(s.rainbow); + aE(s, 'white', 37); aE(s, 'grey', 90); aE(s, 'black', 30); @@ -38,6 +40,7 @@ aE(s, 'green', 32); aE(s, 'magenta', 35); aE(s, 'red', 31); aE(s, 'yellow', 33); + assert.equal(s, 'string'); colors.setTheme({error:'red'}); @@ -45,26 +48,3 @@ colors.setTheme({error:'red'}); assert.equal(typeof("astring".red),'string'); assert.equal(typeof("astring".error),'string'); -colors.mode = 'browser'; -assert.equal(s.bold, '' + s + ''); -assert.equal(s.italic, '' + s + ''); -assert.equal(s.underline, '' + s + ''); -assert.equal(s.strikethrough, '' + s + ''); -assert.equal(s.inverse, '' + s + ''); -assert.ok(s.rainbow); -stylesColors.forEach(function (color) { - assert.equal(s[color], h(s, color)); - assert.equal(colors[color](s), h(s, color)); -}); - -assert.equal(typeof("astring".red),'string'); -assert.equal(typeof("astring".error),'string'); - -colors.mode = 'none'; -stylesAll.forEach(function (style) { - assert.equal(s[style], s); - assert.equal(colors[style](s), s); -}); - -assert.equal(typeof("astring".red),'string'); -assert.equal(typeof("astring".error),'string'); diff --git a/tests/safe-test.js b/tests/safe-test.js new file mode 100644 index 0000000..daad4f9 --- /dev/null +++ b/tests/safe-test.js @@ -0,0 +1,45 @@ +var assert = require('assert'), + colors = require('../safe'); + +var s = 'string'; + +function a(s, code) { + return '\x1B[' + code.toString() + 'm' + s + '\x1B[39m'; +} + +function aE(s, color, code) { + assert.equal(colors[color](s), a(s, code)); + assert.equal(colors.strip(s), s); +} + +function h(s, color) { + return '' + s + ''; +} + +var stylesColors = ['white', 'black', 'blue', 'cyan', 'green', 'magenta', 'red', 'yellow']; +var stylesAll = stylesColors.concat(['bold', 'italic', 'underline', 'inverse', 'rainbow']); + +colors.mode = 'console'; +assert.equal(colors.bold(s), '\x1B[1m' + s + '\x1B[22m'); +assert.equal(colors.italic(s), '\x1B[3m' + s + '\x1B[23m'); +assert.equal(colors.underline(s), '\x1B[4m' + s + '\x1B[24m'); +assert.equal(colors.strikethrough(s), '\x1B[9m' + s + '\x1B[29m'); +assert.equal(colors.inverse(s), '\x1B[7m' + s + '\x1B[27m'); + +assert.ok(colors.rainbow); + +aE(s, 'white', 37); +aE(s, 'grey', 90); +aE(s, 'black', 30); +aE(s, 'blue', 34); +aE(s, 'cyan', 36); +aE(s, 'green', 32); +aE(s, 'magenta', 35); +aE(s, 'red', 31); +aE(s, 'yellow', 33); + +assert.equal(s, 'string'); +colors.setTheme({error:'red'}); + +assert.equal(typeof(colors.red("astring")), 'string'); +assert.equal(typeof(colors.error("astring")), 'string'); \ No newline at end of file diff --git a/themes/winston-light.js b/themes/generic-logging.js similarity index 100% rename from themes/winston-light.js rename to themes/generic-logging.js diff --git a/themes/winston-dark.js b/themes/winston-dark.js deleted file mode 100644 index 49a905b..0000000 --- a/themes/winston-dark.js +++ /dev/null @@ -1,12 +0,0 @@ -module['exports'] = { - silly: 'rainbow', - input: 'black', - verbose: 'cyan', - prompt: 'grey', - info: 'green', - data: 'grey', - help: 'cyan', - warn: 'yellow', - debug: 'blue', - error: 'red' -}; \ No newline at end of file