react-ascii-text
Version:
React hook to render and animate ASCII text art
3,490 lines (3,465 loc) • 2.93 MB
JavaScript
import { useRef, useEffect, useCallback } from 'react';
import figlet from 'figlet';
var __defProp = Object.defineProperty;
var __getOwnPropNames = Object.getOwnPropertyNames;
var __knownSymbol = (name, symbol) => {
return (symbol = Symbol[name]) ? symbol : Symbol.for("Symbol." + name);
};
var __esm = (fn, res) => function __init() {
return fn && (res = (0, fn[__getOwnPropNames(fn)[0]])(fn = 0)), res;
};
var __export = (target, all) => {
for (var name in all)
__defProp(target, name, { get: all[name], enumerable: true });
};
var __async = (__this, __arguments, generator) => {
return new Promise((resolve, reject) => {
var fulfilled = (value) => {
try {
step(generator.next(value));
} catch (e) {
reject(e);
}
};
var rejected = (value) => {
try {
step(generator.throw(value));
} catch (e) {
reject(e);
}
};
var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected);
step((generator = generator.apply(__this, __arguments)).next());
});
};
var __forAwait = (obj, it, method) => (it = obj[__knownSymbol("asyncIterator")]) ? it.call(obj) : (obj = obj[__knownSymbol("iterator")](), it = {}, method = (key, fn) => (fn = obj[key]) && (it[key] = (arg) => new Promise((yes, no, done) => (arg = fn.call(obj, arg), done = arg.done, Promise.resolve(arg.value).then((value) => yes({ value, done }), no)))), method("next"), method("return"), it);
// src/fonts/Slant.js
var Slant_exports = {};
__export(Slant_exports, {
default: () => Slant_default
});
var Slant_default;
var init_Slant = __esm({
"src/fonts/Slant.js"() {
Slant_default = `flf2a$ 6 5 16 15 10 0 18319
Slant by Glenn Chappell 3/93 -- based on Standard
Includes ISO Latin-1
figlet release 2.1 -- 12 Aug 1994
Permission is hereby given to modify this font, as long as the
modifier's name is placed on a comment line.
Modified by Paul Burton <solution@earthlink.net> 12/96 to include new parameter
supported by FIGlet and FIGWin. May also be slightly modified for better use
of new full-width/kern/smush alternatives, but default output is NOT changed.
$$@
$$ @
$$ @
$$ @
$$ @
$$ @@
__@
/ /@
/ / @
/_/ @
(_) @
@@
_ _ @
( | )@
|/|/ @
$ @
$ @
@@
__ __ @
__/ // /_@
/_ _ __/@
/_ _ __/ @
/_//_/ @
@@
__@
_/ /@
/ __/@
(_ ) @
/ _/ @
/_/ @@
_ __@
(_)_/_/@
_/_/ @
_/_/_ @
/_/ (_) @
@@
___ @
( _ ) @
/ __ \\/|@
/ /_/ < @
\\____/\\/ @
@@
_ @
( )@
|/ @
$ @
$ @
@@
__@
_/_/@
/ / @
/ / @
/ / @
|_| @@
_ @
| |@
/ /@
/ / @
_/_/ @
/_/ @@
@
__/|_@
| /@
/_ __| @
|/ @
@@
@
__ @
__/ /_@
/_ __/@
/_/ @
@@
@
@
@
_ @
( )@
|/ @@
@
@
______@
/_____/@
$ @
@@
@
@
@
_ @
(_)@
@@
__@
_/_/@
_/_/ @
_/_/ @
/_/ @
@@
____ @
/ __ \\@
/ / / /@
/ /_/ / @
\\____/ @
@@
___@
< /@
/ / @
/ / @
/_/ @
@@
___ @
|__ \\@
__/ /@
/ __/ @
/____/ @
@@
_____@
|__ /@
/_ < @
___/ / @
/____/ @
@@
__ __@
/ // /@
/ // /_@
/__ __/@
/_/ @
@@
______@
/ ____/@
/___ \\ @
____/ / @
/_____/ @
@@
_____@
/ ___/@
/ __ \\ @
/ /_/ / @
\\____/ @
@@
_____@
/__ /@
/ / @
/ / @
/_/ @
@@
____ @
( __ )@
/ __ |@
/ /_/ / @
\\____/ @
@@
____ @
/ __ \\@
/ /_/ /@
\\__, / @
/____/ @
@@
@
_ @
(_)@
_ @
(_) @
@@
@
_ @
(_)@
_ @
( ) @
|/ @@
__@
/ /@
/ / @
\\ \\ @
\\_\\@
@@
@
_____@
/____/@
/____/ @
$ @
@@
__ @
\\ \\ @
\\ \\@
/ /@
/_/ @
@@
___ @
/__ \\@
/ _/@
/_/ @
(_) @
@@
______ @
/ ____ \\@
/ / __ \`/@
/ / /_/ / @
\\ \\__,_/ @
\\____/ @@
___ @
/ |@
/ /| |@
/ ___ |@
/_/ |_|@
@@
____ @
/ __ )@
/ __ |@
/ /_/ / @
/_____/ @
@@
______@
/ ____/@
/ / @
/ /___ @
\\____/ @
@@
____ @
/ __ \\@
/ / / /@
/ /_/ / @
/_____/ @
@@
______@
/ ____/@
/ __/ @
/ /___ @
/_____/ @
@@
______@
/ ____/@
/ /_ @
/ __/ @
/_/ @
@@
______@
/ ____/@
/ / __ @
/ /_/ / @
\\____/ @
@@
__ __@
/ / / /@
/ /_/ / @
/ __ / @
/_/ /_/ @
@@
____@
/ _/@
/ / @
_/ / @
/___/ @
@@
__@
/ /@
__ / / @
/ /_/ / @
\\____/ @
@@
__ __@
/ //_/@
/ ,< @
/ /| | @
/_/ |_| @
@@
__ @
/ / @
/ / @
/ /___@
/_____/@
@@
__ ___@
/ |/ /@
/ /|_/ / @
/ / / / @
/_/ /_/ @
@@
_ __@
/ | / /@
/ |/ / @
/ /| / @
/_/ |_/ @
@@
____ @
/ __ \\@
/ / / /@
/ /_/ / @
\\____/ @
@@
____ @
/ __ \\@
/ /_/ /@
/ ____/ @
/_/ @
@@
____ @
/ __ \\@
/ / / /@
/ /_/ / @
\\___\\_\\ @
@@
____ @
/ __ \\@
/ /_/ /@
/ _, _/ @
/_/ |_| @
@@
_____@
/ ___/@
\\__ \\ @
___/ / @
/____/ @
@@
______@
/_ __/@
/ / @
/ / @
/_/ @
@@
__ __@
/ / / /@
/ / / / @
/ /_/ / @
\\____/ @
@@
_ __@
| | / /@
| | / / @
| |/ / @
|___/ @
@@
_ __@
| | / /@
| | /| / / @
| |/ |/ / @
|__/|__/ @
@@
_ __@
| |/ /@
| / @
/ | @
/_/|_| @
@@
__ __@
\\ \\/ /@
\\ / @
/ / @
/_/ @
@@
_____@
/__ /@
/ / @
/ /__@
/____/@
@@
___@
/ _/@
/ / @
/ / @
/ / @
/__/ @@
__ @
\\ \\ @
\\ \\ @
\\ \\ @
\\_\\@
@@
___@
/ /@
/ / @
/ / @
_/ / @
/__/ @@
//|@
|/||@
$ @
$ @
$ @
@@
@
@
@
@
______@
/_____/@@
_ @
( )@
V @
$ @
$ @
@@
@
____ _@
/ __ \`/@
/ /_/ / @
\\__,_/ @
@@
__ @
/ /_ @
/ __ \\@
/ /_/ /@
/_.___/ @
@@
@
_____@
/ ___/@
/ /__ @
\\___/ @
@@
__@
____/ /@
/ __ / @
/ /_/ / @
\\__,_/ @
@@
@
___ @
/ _ \\@
/ __/@
\\___/ @
@@
____@
/ __/@
/ /_ @
/ __/ @
/_/ @
@@
@
____ _@
/ __ \`/@
/ /_/ / @
\\__, / @
/____/ @@
__ @
/ /_ @
/ __ \\@
/ / / /@
/_/ /_/ @
@@
_ @
(_)@
/ / @
/ / @
/_/ @
@@
_ @
(_)@
/ / @
/ / @
__/ / @
/___/ @@
__ @
/ /__@
/ //_/@
/ ,< @
/_/|_| @
@@
__@
/ /@
/ / @
/ / @
/_/ @
@@
@
____ ___ @
/ __ \`__ \\@
/ / / / / /@
/_/ /_/ /_/ @
@@
@
____ @
/ __ \\@
/ / / /@
/_/ /_/ @
@@
@
____ @
/ __ \\@
/ /_/ /@
\\____/ @
@@
@
____ @
/ __ \\@
/ /_/ /@
/ .___/ @
/_/ @@
@
____ _@
/ __ \`/@
/ /_/ / @
\\__, / @
/_/ @@
@
_____@
/ ___/@
/ / @
/_/ @
@@
@
_____@
/ ___/@
(__ ) @
/____/ @
@@
__ @
/ /_@
/ __/@
/ /_ @
\\__/ @
@@
@
__ __@
/ / / /@
/ /_/ / @
\\__,_/ @
@@
@
_ __@
| | / /@
| |/ / @
|___/ @
@@
@
_ __@
| | /| / /@
| |/ |/ / @
|__/|__/ @
@@
@
_ __@
| |/_/@
_> < @
/_/|_| @
@@
@
__ __@
/ / / /@
/ /_/ / @
\\__, / @
/____/ @@
@
____@
/_ /@
/ /_@
/___/@
@@
__@
_/_/@
_/_/ @
< < @
/ / @
\\_\\ @@
__@
/ /@
/ / @
/ / @
/ / @
/_/ @@
_ @
| |@
/ /@
_>_>@
_/_/ @
/_/ @@
/\\//@
//\\/ @
$ @
$ @
$ @
@@
_ _ @
(_)(_)@
/ _ | @
/ __ | @
/_/ |_| @
@@
_ _ @
(_)_(_)@
/ __ \\ @
/ /_/ / @
\\____/ @
@@
_ _ @
(_) (_)@
/ / / / @
/ /_/ / @
\\____/ @
@@
_ _ @
(_)_(_)@
/ __ \`/ @
/ /_/ / @
\\__,_/ @
@@
_ _ @
(_)_(_)@
/ __ \\ @
/ /_/ / @
\\____/ @
@@
_ _ @
(_) (_)@
/ / / / @
/ /_/ / @
\\__,_/ @
@@
____ @
/ __ \\@
/ / / /@
/ /_| | @
/ //__/ @
/_/ @@
160 NO-BREAK SPACE
$$@
$$ @
$$ @
$$ @
$$ @
$$ @@
161 INVERTED EXCLAMATION MARK
_ @
(_)@
/ / @
/ / @
/_/ @
@@
162 CENT SIGN
__@
__/ /@
/ ___/@
/ /__ @
\\ _/ @
/_/ @@
163 POUND SIGN
____ @
/ ,__\\@
__/ /_ @
_/ /___ @
(_,____/ @
@@
164 CURRENCY SIGN
/|___/|@
| __ / @
/ /_/ / @
/___ | @
|/ |/ @
@@
165 YEN SIGN
____@
_| / /@
/_ __/@
/_ __/ @
/_/ @
@@
166 BROKEN BAR
__@
/ /@
/_/ @
__ @
/ / @
/_/ @@
167 SECTION SIGN
__ @
_/ _)@
/ | | @
| || | @
| |_/ @
(__/ @@
168 DIAERESIS
_ _ @
(_) (_)@
$ $ @
$ $ @
$ $ @
@@
169 COPYRIGHT SIGN
______ @
/ _____\\ @
/ / ___/ |@
/ / /__ / @
| \\___/ / @
\\______/ @@
170 FEMININE ORDINAL INDICATOR
___ _@
/ _ \`/@
_\\_,_/ @
/____/ @
$ @
@@
171 LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
____@
/ / /@
/ / / @
\\ \\ \\ @
\\_\\_\\@
@@
172 NOT SIGN
@
______@
/___ /@
/_/ @
$ @
@@
173 SOFT HYPHEN
@
@
_____@
/____/@
$ @
@@
174 REGISTERED SIGN
______ @
/ ___ \\ @
/ / _ \\ |@
/ / , _/ / @
| /_/|_| / @
\\______/ @@
175 MACRON
______@
/_____/@
$ @
$ @
$ @
@@
176 DEGREE SIGN
___ @
/ _ \\@
/ // /@
\\___/ @
$ @
@@
177 PLUS-MINUS SIGN
__ @
__/ /_@
/_ __/@
__/_/_ @
/_____/ @
@@
178 SUPERSCRIPT TWO
___ @
|_ |@
/ __/ @
/____/ @
$ @
@@
179 SUPERSCRIPT THREE
____@
|_ /@
_/_ < @
/____/ @
$ @
@@
180 ACUTE ACCENT
__@
/_/@
$ @
$ @
$ @
@@
181 MICRO SIGN
@
__ __@
/ / / /@
/ /_/ / @
/ ._,_/ @
/_/ @@
182 PILCROW SIGN
_______@
/ _ /@
/ (/ / / @
\\_ / / @
/_/_/ @
@@
183 MIDDLE DOT
@
_ @
(_)@
$ @
$ @
@@
184 CEDILLA
@
@
@
@
_ @
/_)@@
185 SUPERSCRIPT ONE
___@
< /@
/ / @
/_/ @
$ @
@@
186 MASCULINE ORDINAL INDICATOR
___ @
/ _ \\@
_\\___/@
/____/ @
$ @
@@
187 RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
____ @
\\ \\ \\ @
\\ \\ \\@
/ / /@
/_/_/ @
@@
188 VULGAR FRACTION ONE QUARTER
___ __ @
< / _/_/ @
/ /_/_/___@
/_//_// / /@
/_/ /_ _/@
/_/ @@
189 VULGAR FRACTION ONE HALF
___ __ @
< / _/_/__ @
/ /_/_/|_ |@
/_//_/ / __/ @
/_/ /____/ @
@@
190 VULGAR FRACTION THREE QUARTERS
____ __ @
|_ / _/_/ @
_/_ < _/_/___@
/____//_// / /@
/_/ /_ _/@
/_/ @@
191 INVERTED QUESTION MARK
_ @
(_)@
_/ / @
/ _/_ @
\\___/ @
@@
192 LATIN CAPITAL LETTER A WITH GRAVE
__ @
_\\_\\@
/ _ |@
/ __ |@
/_/ |_|@
@@
193 LATIN CAPITAL LETTER A WITH ACUTE
__@
_/_/@
/ _ |@
/ __ |@
/_/ |_|@
@@
194 LATIN CAPITAL LETTER A WITH CIRCUMFLEX
//|@
_|/||@
/ _ | @
/ __ | @
/_/ |_| @
@@
195 LATIN CAPITAL LETTER A WITH TILDE
/\\//@
_//\\/ @
/ _ | @
/ __ | @
/_/ |_| @
@@
196 LATIN CAPITAL LETTER A WITH DIAERESIS
_ _ @
(_)(_)@
/ _ | @
/ __ | @
/_/ |_| @
@@
197 LATIN CAPITAL LETTER A WITH RING ABOVE
(())@
/ |@
/ /| |@
/ ___ |@
/_/ |_|@
@@
198 LATIN CAPITAL LETTER AE
__________@
/ ____/@
/ /| __/ @
/ __ /___ @
/_/ /_____/ @
@@
199 LATIN CAPITAL LETTER C WITH CEDILLA
______@
/ ____/@
/ / @
/ /___ @
\\____/ @
/_) @@
200 LATIN CAPITAL LETTER E WITH GRAVE
__ @
_\\_\\@
/ __/@
/ _/ @
/___/ @
@@
201 LATIN CAPITAL LETTER E WITH ACUTE
__@
_/_/@
/ __/@
/ _/ @
/___/ @
@@
202 LATIN CAPITAL LETTER E WITH CIRCUMFLEX
//|@
_|/||@
/ __/ @
/ _/ @
/___/ @
@@
203 LATIN CAPITAL LETTER E WITH DIAERESIS
_ _ @
(_)(_)@
/ __/ @
/ _/ @
/___/ @
@@
204 LATIN CAPITAL LETTER I WITH GRAVE
__ @
_\\_\\@
/ _/@
_/ / @
/___/ @
@@
205 LATIN CAPITAL LETTER I WITH ACUTE
__@
_/_/@
/ _/@
_/ / @
/___/ @
@@
206 LATIN CAPITAL LETTER I WITH CIRCUMFLEX
//|@
_|/||@
/ _/ @
_/ / @
/___/ @
@@
207 LATIN CAPITAL LETTER I WITH DIAERESIS
_ _ @
(_)(_)@
/ _/ @
_/ / @
/___/ @
@@
208 LATIN CAPITAL LETTER ETH
____ @
/ __ \\@
__/ /_/ /@
/_ __/ / @
/_____/ @
@@
209 LATIN CAPITAL LETTER N WITH TILDE
/\\//@
_//\\/ @
/ |/ / @
/ / @
/_/|_/ @
@@
210 LATIN CAPITAL LETTER O WITH GRAVE
__ @
__\\_\\@
/ __ \\@
/ /_/ /@
\\____/ @
@@
211 LATIN CAPITAL LETTER O WITH ACUTE
__@
__/_/@
/ __ \\@
/ /_/ /@
\\____/ @
@@
212 LATIN CAPITAL LETTER O WITH CIRCUMFLEX
//|@
_|/||@
/ __ \\@
/ /_/ /@
\\____/ @
@@
213 LATIN CAPITAL LETTER O WITH TILDE
/\\//@
_//\\/ @
/ __ \\ @
/ /_/ / @
\\____/ @
@@
214 LATIN CAPITAL LETTER O WITH DIAERESIS
_ _ @
(_)_(_)@
/ __ \\ @
/ /_/ / @
\\____/ @
@@
215 MULTIPLICATION SIGN
@
@
/|/|@
> < @
|/|/ @
@@
216 LATIN CAPITAL LETTER O WITH STROKE
_____ @
/ _// \\@
/ //// /@
/ //// / @
\\_//__/ @
@@
217 LATIN CAPITAL LETTER U WITH GRAVE
__ @
__\\_\\_@
/ / / /@
/ /_/ / @
\\____/ @
@@
218 LATIN CAPITAL LETTER U WITH ACUTE
__ @
__/_/_@
/ / / /@
/ /_/ / @
\\____/ @
@@
219 LATIN CAPITAL LETTER U WITH CIRCUMFLEX
//| @
_|/||_@
/ / / /@
/ /_/ / @
\\____/ @
@@
220 LATIN CAPITAL LETTER U WITH DIAERESIS
_ _ @
(_) (_)@
/ / / / @
/ /_/ / @
\\____/ @
@@
221 LATIN CAPITAL LETTER Y WITH ACUTE
__ @
__/_/_@
\\ \\/ /@
\\ / @
/_/ @
@@
222 LATIN CAPITAL LETTER THORN
__ @
/ /_ @
/ __ \\@
/ ____/@
/_/ @
@@
223 LATIN SMALL LETTER SHARP S
____ @
/ __ \\@
/ / / /@
/ /_| | @
/ //__/ @
/_/ @@
224 LATIN SMALL LETTER A WITH GRAVE
__ @
__\\_\\_@
/ __ \`/@
/ /_/ / @
\\__,_/ @
@@
225 LATIN SMALL LETTER A WITH ACUTE
__ @
__/_/_@
/ __ \`/@
/ /_/ / @
\\__,_/ @
@@
226 LATIN SMALL LETTER A WITH CIRCUMFLEX
//| @
_|/||_@
/ __ \`/@
/ /_/ / @
\\__,_/ @
@@
227 LATIN SMALL LETTER A WITH TILDE
/\\//@
_//\\/_@
/ __ \`/@
/ /_/ / @
\\__,_/ @
@@
228 LATIN SMALL LETTER A WITH DIAERESIS
_ _ @
(_)_(_)@
/ __ \`/ @
/ /_/ / @
\\__,_/ @
@@
229 LATIN SMALL LETTER A WITH RING ABOVE
__ @
__(())@
/ __ \`/@
/ /_/ / @
\\__,_/ @
@@
230 LATIN SMALL LETTER AE
@
____ ___ @
/ __ \` _ \\@
/ /_/ __/@
\\__,_____/ @
@@
231 LATIN SMALL LETTER C WITH CEDILLA
@
_____@
/ ___/@
/ /__ @
\\___/ @
/_) @@
232 LATIN SMALL LETTER E WITH GRAVE
__ @
_\\_\\@
/ _ \\@
/ __/@
\\___/ @
@@
233 LATIN SMALL LETTER E WITH ACUTE
__@
_/_/@
/ _ \\@
/ __/@
\\___/ @
@@
234 LATIN SMALL LETTER E WITH CIRCUMFLEX
//|@
_|/||@
/ _ \\ @
/ __/ @
\\___/ @
@@
235 LATIN SMALL LETTER E WITH DIAERESIS
_ _ @
(_)(_)@
/ _ \\ @
/ __/ @
\\___/ @
@@
236 LATIN SMALL LETTER I WITH GRAVE
__ @
\\_\\@
/ / @
/ / @
/_/ @
@@
237 LATIN SMALL LETTER I WITH ACUTE
__@
/_/@
/ / @
/ / @
/_/ @
@@
238 LATIN SMALL LETTER I WITH CIRCUMFLEX
//|@
|/||@
/ / @
/ / @
/_/ @
@@
239 LATIN SMALL LETTER I WITH DIAERESIS
_ _ @
(_)_(_)@
/ / @
/ / @
/_/ @
@@
240 LATIN SMALL LETTER ETH
|| @
=||=@
___ || @
/ __\` | @
\\____/ @
@@
241 LATIN SMALL LETTER N WITH TILDE
/\\//@
_//\\/ @
/ __ \\ @
/ / / / @
/_/ /_/ @
@@
242 LATIN SMALL LETTER O WITH GRAVE
__ @
__\\_\\@
/ __ \\@
/ /_/ /@
\\____/ @
@@
243 LATIN SMALL LETTER O WITH ACUTE
__@
__/_/@
/ __ \\@
/ /_/ /@
\\____/ @
@@
244 LATIN SMALL LETTER O WITH CIRCUMFLEX
//|@
_|/||@
/ __ \\@
/ /_/ /@
\\____/ @
@@
245 LATIN SMALL LETTER O WITH TILDE
/\\//@
_//\\/ @
/ __ \\ @
/ /_/ / @
\\____/ @
@@
246 LATIN SMALL LETTER O WITH DIAERESIS
_ _ @
(_)_(_)@
/ __ \\ @
/ /_/ / @
\\____/ @
@@
247 DIVISION SIGN
@
_ @
__(_)_@
/_____/@
(_) @
@@
248 LATIN SMALL LETTER O WITH STROKE
@
_____ @
/ _// \\@
/ //// /@
\\_//__/ @
@@
249 LATIN SMALL LETTER U WITH GRAVE
__ @
__\\_\\_@
/ / / /@
/ /_/ / @
\\__,_/ @
@@
250 LATIN SMALL LETTER U WITH ACUTE
__ @
__/_/_@
/ / / /@
/ /_/ / @
\\__,_/ @
@@
251 LATIN SMALL LETTER U WITH CIRCUMFLEX
//| @
_|/||_@
/ / / /@
/ /_/ / @
\\__,_/ @
@@
252 LATIN SMALL LETTER U WITH DIAERESIS
_ _ @
(_) (_)@
/ / / / @
/ /_/ / @
\\__,_/ @
@@
253 LATIN SMALL LETTER Y WITH ACUTE
__ @
__/_/_@
/ / / /@
/ /_/ / @
\\__, / @
/____/ @@
254 LATIN SMALL LETTER THORN
__ @
/ /_ @
/ __ \\@
/ /_/ /@
/ .___/ @
/_/ @@
255 LATIN SMALL LETTER Y WITH DIAERESIS
_ _ @
(_) (_)@
/ / / / @
/ /_/ / @
\\__, / @
/____/ @@
`;
}
});
// src/utils.ts
function createSpacing(text, spacing) {
return text.replace(/.(?=.)/g, `$&${" ".repeat(spacing)}`);
}
function replaceText(text, index, character) {
return text.substring(0, index) + character + text.substring(index + character.length);
}
function getRandomCharacter(characterSet) {
return characterSet[Math.floor(Math.random() * characterSet.length)];
}
function replaceNonWhitespaceWithRandom(string, characterSet) {
return string.split("").map((char) => /\s/.test(char) ? char : getRandomCharacter(characterSet)).join("");
}
// src/verticalFrames.ts
function createVerticalAnimationFrames({
asciiText,
animationDirection,
animationCharacters,
animationCharacterSpacing
}) {
return asciiText.reduce(
(result, textLine, index) => {
if (index === 0)
return result;
const prevFrame = (result == null ? void 0 : result[result.length - 1]) ? [...result[result.length - 1]] : void 0;
if (!prevFrame)
return result;
const firstLineHasChar = /\S/.test(prevFrame[index - 1]);
const lastindex = prevFrame.length - index;
const lastLineHasChar = /\S/.test(prevFrame[lastindex]);
let newFrame = [...prevFrame];
if (firstLineHasChar && (animationDirection === "up" || animationDirection === "vertical")) {
if (prevFrame == null ? void 0 : prevFrame[index]) {
prevFrame[index] = replaceNonWhitespaceWithRandom(
prevFrame[index],
createSpacing(animationCharacters, animationCharacterSpacing)
);
}
if (prevFrame == null ? void 0 : prevFrame[index - 1]) {
prevFrame[index - 1] = " ".repeat(textLine.length);
}
if (newFrame[index]) {
newFrame[index] = replaceNonWhitespaceWithRandom(
newFrame[index],
animationCharacters
);
}
}
if (lastLineHasChar && (animationDirection === "down" || animationDirection === "vertical")) {
if (prevFrame == null ? void 0 : prevFrame[lastindex]) {
prevFrame[lastindex] = replaceNonWhitespaceWithRandom(
prevFrame[lastindex],
createSpacing(animationCharacters, animationCharacterSpacing)
);
}
if (prevFrame == null ? void 0 : prevFrame[lastindex + 1]) {
prevFrame[lastindex + 1] = " ".repeat(textLine.length);
}
if (newFrame == null ? void 0 : newFrame[lastindex]) {
newFrame[lastindex] = replaceNonWhitespaceWithRandom(
newFrame[lastindex],
animationCharacters
);
}
}
if (firstLineHasChar || lastLineHasChar) {
result.push(newFrame, prevFrame);
}
if (index === asciiText.length - 1 && animationDirection === "up") {
const lastFrame = [...prevFrame];
lastFrame[lastFrame.length - 1] = " ".repeat(
lastFrame[lastFrame.length - 1].length
);
result.push(lastFrame);
}
if (index === asciiText.length - 1 && animationDirection === "down") {
const nextFrame = [...prevFrame];
nextFrame[newFrame.length - index] = " ".repeat(
nextFrame[newFrame.length - index].length
);
result.push(nextFrame);
const nextFrame2 = [...nextFrame];
const hasChar = /\S/.test(nextFrame2[0]);
if (!hasChar)
return result;
nextFrame2[0] = replaceNonWhitespaceWithRandom(
nextFrame2[0],
createSpacing(animationCharacters, animationCharacterSpacing)
);
result.push(nextFrame2);
const nextFrame3 = [...nextFrame2];
if (!/\S/.test(nextFrame3[0]))
return result;
nextFrame3[0] = replaceNonWhitespaceWithRandom(
nextFrame3[0],
createSpacing(animationCharacters, animationCharacterSpacing)
);
result.push(nextFrame3);
const nextFrame4 = [...nextFrame3];
if (!/\S/.test(nextFrame4[0]))
return result;
nextFrame4[0] = " ".repeat(nextFrame4[0].length);
result.push(nextFrame4);
}
if (index === asciiText.length - 1 && animationDirection === "up") ;
return result;
},
[[...asciiText]]
);
}
// src/horizontalFrames.ts
var CENTER_Y = 1;
function createHorizontalAnimationFrames({
asciiText,
animationDirection,
animationCharacters
}) {
const newFrames = [[...structuredClone(asciiText)]];
const frameStringLength = asciiText[0].length / (animationDirection === "left" || animationDirection === "right" ? 1 : 2);
for (let index = 0; index < frameStringLength; index++) {
if (index === 0) {
newFrames.push(asciiText);
continue;
}
const newFrame = newFrames[index].map((item, index2, array) => {
const firstCharIndex = item.search(/\S/);
const lastCharIndex = item.search(/\S(?!.*\S)/);
if (firstCharIndex === -1 || lastCharIndex === -1)
return item;
const animationCharacterOffset = index2 > CENTER_Y ? -1 : 1;
if (animationDirection === "left" || animationDirection === "horizontal") {
item = replaceText(item, firstCharIndex, " ");
}
if (animationDirection === "right" || animationDirection === "horizontal") {
item = replaceText(item, lastCharIndex, " ");
}
if (lastCharIndex - firstCharIndex <= 2)
return item;
if (animationDirection === "left" || animationDirection === "horizontal") {
const animationChar = getRandomCharacter(animationCharacters);
array[index2 + animationCharacterOffset] = replaceText(
array[index2 + animationCharacterOffset],
firstCharIndex + 1,
animationChar
);
}
return item;
});
newFrames.push(newFrame);
}
return newFrames;
}
// src/createFrames.ts
function createFrames(_0) {
return __async(this, arguments, function* ({
asciiText,
animationDirection,
animationCharacters,
animationCharacterSpacing,
fadeInOnly = false,
fadeOutOnly = false
}) {
try {
if (animationDirection === "down" || animationDirection === "up" || animationDirection === "vertical") {
const verticalFrames = createVerticalAnimationFrames({
asciiText,
animationDirection,
animationCharacters,
animationCharacterSpacing
});
if (fadeOutOnly)
return verticalFrames;
const verticalFramesReversed = structuredClone(verticalFrames).reverse();
if (fadeInOnly)
return verticalFramesReversed;
const verticalFramesLoop = verticalFramesReversed.concat(verticalFrames);
return verticalFramesLoop;
}
const horizontalFrames = createHorizontalAnimationFrames({
asciiText,
animationDirection,
animationCharacters,
animationCharacterSpacing
});
if (fadeInOnly)
return structuredClone(horizontalFrames).reverse();
const horizontalFramesReversed = structuredClone(horizontalFrames).reverse();
if (fadeOutOnly)
return horizontalFrames;
const horizontalFramesLoop = horizontalFramesReversed.concat(horizontalFrames);
return horizontalFramesLoop;
} catch (error) {
throw error + " @createFrames";
}
});
}
var DEFAULT_FONT = "Slant";
function createAsciiText(text, font) {
return __async(this, null, function* () {
const fontImport = !font ? (yield Promise.resolve().then(() => (init_Slant(), Slant_exports))).default : "";
figlet.parseFont(DEFAULT_FONT, font || fontImport);
const createFigletText = (textItem) => __async(this, null, function* () {
return yield new Promise((resolve, reject) => {
figlet.text(
textItem,
{
font: DEFAULT_FONT
},
(err, data) => {
if (err)
reject("Failed to load font");
if (!data)
reject("No ASCII text generated");
else
resolve(data.split("\n"));
}
);
});
});
const asciiText = [];
try {
for (var iter = __forAwait(Array.isArray(text) ? text : [text]), more, temp, error; more = !(temp = yield iter.next()).done; more = false) {
const textItem = temp.value;
const figletText = yield createFigletText(textItem);
asciiText.push(figletText);
}
} catch (temp) {
error = [temp];
} finally {
try {
more && (temp = iter.return) && (yield temp.call(iter));
} finally {
if (error)
throw error[0];
}
}
return asciiText;
});
}
// src/useAsciiText.ts
var CHARACTER_SET = "/*+#";
function useAsciiText({
animationCharacters = CHARACTER_SET,
animationCharacterSpacing = 1,
animationDelay = 500,
animationDirection = "horizontal",
animationInterval = 1e3,
animationIteration = 1,
animationLoop = true,
animationSpeed = 20,
fadeInOnly = false,
fadeOutOnly = false,
font,
isAnimated = true,
isPaused = false,
text = ["React", "ASCII", "Text"]
}) {
const outputRef = useRef();
const asciiTextRef = useRef({
animationFrameId: 0,
animationIndex: 0,
animationIterationCount: 1,
animations: null,
frameId: 0,
frameIndex: 0,
isPaused: false,
isTimeout: false,
previousTimeStamp: 0,
timeoutId: 0
});
const render = (timeStamp) => __async(this, null, function* () {
const { animations, isPaused: isPaused2, isTimeout, previousTimeStamp } = asciiTextRef.current;
if (!outputRef.current || !(animations == null ? void 0 : animations.length) || isPaused2 || isTimeout)
return;
const elapsedTimeSinceLastRender = timeStamp - previousTimeStamp;
if (elapsedTimeSinceLastRender > animationSpeed) {
const {
animationIndex,
animationIterationCount,
animations: animations2,
frameId,
frameIndex
} = asciiTextRef.current;
const frameData = animations2 == null ? void 0 : animations2[animationIndex];
if (!frameData || isTimeout)
return;
const isFirstFrame = frameIndex === 0;
const isLastFrame = frameIndex === frameData.length - 1;
const isLastAnimation = animationIndex === animations2.length - 1;
outputRef.current.textContent = frameData[frameIndex].join("\n");
if (!animationLoop && animationIterationCount === animationIteration && isLastAnimation && isLastFrame) {
cancelAnimationFrame(frameId);
return;
}
asciiTextRef.current.previousTimeStamp = timeStamp;
const isMidFrame = frameIndex === Math.floor(frameData.length / 2);
const isFadeIn = fadeInOnly || fadeOutOnly;
const delay = (time) => __async(this, null, function* () {
yield new Promise((resolve) => {
asciiTextRef.current.isTimeout = true;
setTimeout(resolve, time);
});
asciiTextRef.current.isTimeout = false;
});
if (isFadeIn && isLastFrame && animationDelay) {
yield delay(animationDelay);
}
if (isFadeIn && isFirstFrame && animationInterval) {
yield delay(animationInterval);
}
if (!isFadeIn && isMidFrame && animationDelay) {
yield delay(animationDelay);
}
if (!isFadeIn && isLastFrame && animationInterval) {
yield delay(animationInterval);
}
if (isLastFrame) {
asciiTextRef.current.frameIndex = 0;
asciiTextRef.current.animationIndex++;
asciiTextRef.current.animationIterationCount++;
} else {
asciiTextRef.current.frameIndex++;
}
if (animationLoop && asciiTextRef.current.animationIndex === animations2.length) {
asciiTextRef.current.animationIndex = 0;
}
}
asciiTextRef.current.frameId = requestAnimationFrame(render);
});
useEffect(() => {
if (isPaused) {
asciiTextRef.current.isPaused = true;
cancelAnimationFrame(asciiTextRef.current.frameId);
} else {
asciiTextRef.current.isPaused = false;
asciiTextRef.current.frameId = requestAnimationFrame(render);
}
}, [isPaused, asciiTextRef]);
const init = useCallback(() => __async(this, null, function* () {
try {
const asciiText = yield createAsciiText(text, font);
if (!isAnimated && outputRef.current) {
outputRef.current.textContent = asciiText[0].join("\n");
} else if (asciiText.length === (Array.isArray(text) ? text : [text]).length) {
asciiTextRef.current.animations = yield Promise.all([
...asciiText.map(
(text2) => __async(this, null, function* () {
return yield createFrames({
asciiText: text2,
animationDirection,
animationCharacters,
animationCharacterSpacing,
fadeInOnly,
fadeOutOnly
});
})
)
]);
requestAnimationFrame(render);
}
} catch (error) {
console.error({ error });
}
}), []);
useEffect(() => {
init();
}, [text, init]);
return outputRef;
}
// src/fonts/1Row.js
var Row_default = `flf2a$ 2 1 8 -1 13
1row font by unknown
=======================
-> Conversion to FigLet font by MEPH. (Part of ASCII Editor Service Pack I)
(http://studenten.freepage.de/meph/ascii/editor/_index.htm)
-> Defined: ASCII code alphanumeric
-> Uppercase characters only.
Was a part of a '1row' font collection. Author unknown.
$@
$@@
@
@@
@
@@
@
@@
@
@@
@
@@
@
@@
@
@@
@
@@
@
@@
@
@@
@
@@
@
@@
@
@@
@
@@
@
@@
(\\) @
@@
'| @
@@
^/_ @
@@
-} @
@@
+| @
@@
;~ @
@@
(o @
@@
"/ @
@@
{} @
@@
"| @
@@
@
@@
@
@@
@
@@
@
@@
@
@@
@
@@
@
@@
/\\ @
@@
]3 @
@@
( @
@@
|) @
@@
[- @
@@
/= @
@@
(_, @
@@
|-| @
@@
| @
@@
_T @
@@
/< @
@@
|_ @
@@
|\\/| @
@@
|\\| @
@@
() @
@@
|^ @
@@
()_ @
@@
/? @
@@
_\\~ @
@@
~|~ @
@@
|_| @
@@
\\/ @
@@
\\/\\/ @
@@
>< @
@@
\`/ @
@@
~/_ @
@@
@
@@
@
@@
@
@@
@
@@
@
@@
@
@@
/\\ @
@@
]3 @
@@
( @
@@
|) @
@@
[- @
@@
/= @
@@
(_, @
@@
|-| @
@@
| @
@@
_T @
@@
/< @
@@
|_ @
@@
|\\/| @
@@
|\\| @
@@
() @
@@
|^ @
@@
()_ @
@@
/? @
@@
_\\~ @
@@
~|~ @
@@
|_| @
@@
\\/ @
@@
\\/\\/ @
@@
>< @
@@
\`/ @
@@
~/_ @
@@
@
@@
@
@@
@
@@
@
@@
@
@@
@
@@
@
@@
@
@@
@
@@
@
@@
@
@@
`;
// src/fonts/3-D.js
var D_default = `flf2a$ 8 8 20 -1 6
3-D font created by Daniel Henninger <dahennin@eos.ncsu.edu>
---
Font modified June 17, 2007 by patorjk
This was to widen the space character.
$ $@
$ $@
$ $@
$ $@
$ $@
$ $@
$ $@
$ $@@
**@
/**@
/**@
/**@
/**@
// @
**@
// @@
* *@
/* /*@
/ / @
@
@
@
@
@@
@
** ** @
************@
///**////**/ @
/** /** @
************@
///**////**/ @
// // @@
* @
*****@
/*/*/ @
/*****@
///*/*@
*****@
///*/ @
/ @@
@
** ** @
// ** @
** @
** @
** @
** ** @
// // @@
** @
*/ * @
/ ** @
*/ * *@
* / * @
/* /* @
/ **** *@
//// / @@
**@
//*@
/ @
@
@
@
@
@@
**@
** @
** @
/** @
/** @
//** @
//**@
// @@
** @
//** @
//**@
/**@
/**@
** @
** @
// @@
** @
** /** ** @
//** /** ** @
**************@
///**//**//**/ @
** /** //** @
// /** // @
// @@
@
* @
/* @
*********@
/////*/// @
/* @
/ @
@@
@
@
@
@
@
**@
//*@
/ @@
@
@
@
*****@
///// @
@
@
@@
@
@
@
@
@
**@
/**@
// @@
**@
** @
** @
** @
** @
** @
** @
// @@
**** @
*///**@
/* */*@
/* * /*@
/** /*@
/* /*@
/ **** @
//// @@
** @
*** @
//** @
/** @
/** @
/** @
****@
//// @@
**** @
*/// *@
/ /*@
*** @
*// @
* @
/******@
////// @@
**** @
*/// *@
/ /*@
*** @
/// *@
* /*@
/ **** @
//// @@
** @
*/* @
* /* @
******@
/////* @
/* @
/* @
/ @@
******@
/*//// @
/***** @
///// *@
/*@
* /*@
/ **** @
//// @@
**** @
*/// *@
/* / @
/***** @
/*/// *@
/* /*@
/ **** @
//// @@
******@
//////*@
/*@
* @
* @
* @
* @
/ @@
**** @
*/// *@
/* /*@
/ **** @
*/// *@
/* /*@
/ **** @
//// @@
**** @
*/// *@
/* /*@
/ **** @
///* @
* @
* @
/ @@
@
@
@
@
**@
// @
**@
// @@
@
@
@
**@
// @
**@
//*@
/ @@
**@
**/ @
**/ @
**/ @
// ** @
// ** @
// **@
// @@
@
@
******@
////// @
******@
////// @
@
@@
** @
// ** @
// ** @
// **@
**/ @
**/ @
**/ @
// @@
**** @
**//**@
/** /**@
// ** @
** @
// @
** @
// @@
**** @
*/// *@
/* **/*@
/*/* /*@
/*/ ** @
/* // @
/ *****@
///// @@
** @
**** @
**//** @
** //** @
**********@
/**//////**@
/** /**@
// // @@
****** @
/*////** @
/* /** @
/****** @
/*//// **@
/* /**@
/******* @
/////// @@
****** @
**////**@
** // @
/** @
/** @
//** **@
//****** @
////// @@
******* @
/**////** @
/** /**@
/** /**@
/** /**@
/** ** @
/******* @
/////// @@
********@
/**///// @
/** @
/******* @
/**//// @
/** @
/********@
//////// @@
********@
/**///// @
/** @
/******* @
/**//// @
/** @
/** @
// @@
******** @
**//////**@
** // @
/** @
/** *****@
//** ////**@
//******** @
//////// @@
** **@
/** /**@
/** /**@
/**********@
/**//////**@
/** /**@
/** /**@
// // @@
**@
/**@
/**@
/**@
/**@
/**@
/**@
// @@
**@
/**@
/**@
/**@
/**@
** /**@
//***** @
///// @@
** **@
/** ** @
/** ** @
/**** @
/**/** @
/**//** @
/** //**@
// // @@
** @
/** @
/** @
/** @
/** @
/** @
/********@
//////// @@
**** ****@
/**/** **/**@
/**//** ** /**@
/** //*** /**@
/** //* /**@
/** / /**@
/** /**@
// // @@
**** **@
/**/** /**@
/**//** /**@
/** //** /**@
/** //**/**@
/** //****@
/** //***@
// /// @@
******* @
**/////** @
** //**@
/** /**@
/** /**@
//** ** @
//******* @
/////// @@
******* @
/**////**@
/** /**@
/******* @
/**//// @
/** @
/** @
// @@
******* @
**/////** @
** //** @
/** /** @
/** **/** @
//** // ** @
//******* **@
/////// // @@
******* @
/**////** @
/** /** @
/******* @
/**///** @
/** //** @
/** //**@
// // @@
********@
**////// @
/** @
/*********@
////////**@
/**@
******** @
//////// @@
**********@
/////**/// @
/** @
/** @
/** @
/** @
/** @
// @@
** **@
/** /**@
/** /**@
/** /**@
/** /**@
/** /**@
//******* @
/////// @@
** **@
/** /**@
/** /**@
//** ** @
//** ** @
//**** @
//** @
// @@
** **@
/** /**@
/** * /**@
/** *** /**@
/** **/**/**@
/**** //****@
/**/ ///**@
// // @@
** **@
//** ** @
//** ** @
//*** @
**/** @
** //** @
** //**@
// // @@
** **@
//** ** @
//**** @
//** @
/** @
/** @
/** @
// @@
********@
//////** @
** @
** @
** @
** @
********@
//////// @@
*****@
/**// @
/** @
/** @
/** @
/** @
/*****@
///// @@
** @
//** @
//** @
//** @
//** @
//** @
//**@
// @@
*****@
////**@
/**@
/**@
/**@
/**@
*****@
///// @@
** @
**/ ** @
** // **@
// // @
@
@
@
@@
@
@
@
@
@
@
*****@
///// @@
**@
/* @
/ @
@
@
@
@
@@
@
@
****** @
//////** @
******* @
**////** @
//********@
//////// @@
** @
/** @
/** @
/****** @
/**///**@
/** /**@
/****** @
///// @@
@
@
***** @
**///**@
/** // @
/** **@
//***** @
///// @@
**@
/**@
/**@
******@
**///**@
/** /**@
//******@
////// @@
@
@
***** @
**///**@
/*******@
/**//// @
//******@
////// @@
****@
/**/ @
******@
///**/ @
/** @
/** @
/** @
// @@
@
***** @
**///**@
/** /**@
//******@
/////**@
***** @
///// @@
** @
/** @
/** @
/****** @
/**///**@
/** /**@
/** /**@
// // @@
**@
// @
**@
/**@
/**@
/**@
/**@
// @@
**@
// @
**@
/**@
/**@
**/**@
//*** @
/// @@
** @
/** @
/** **@
/** ** @
/**** @
/**/** @
/**//**@
// // @@
**@
/**@
/**@
/**@
/**@
/**@
***@
/// @@
@
@
********** @
//**//**//**@
/** /** /**@
/** /** /**@
*** /** /**@
/// // // @@
@
@
******* @
//**///**@
/** /**@
/** /**@
*** /**@
/// // @@
@
@
****** @
**////**@
/** /**@
/** /**@
//****** @
////// @@
@
****** @
/**///**@
/** /**@
/****** @
/**/// @
/** @
// @@
@
**** @
**//** @
/** /** @
//***** @
////** @
/***@
/// @@
@
@
******@
//**//*@
/** / @
/** @
/*** @
/// @@
@
@
******@
**//// @
//***** @
/////**@
****** @
////// @@
** @
/** @
******@
///**/ @
/** @
/** @
//** @
// @@
@
@
** **@
/** /**@
/** /**@
/** /**@
//******@
////// @@
@
@
** **@
/** /**@
//** /** @
//**** @
//** @
// @@
@
@
*** **@
//** * /**@
/** ***/**@
/****/****@
***/ ///**@
/// /// @@
@
@
** **@
//** ** @
//*** @
**/** @
** //**@
// // @@
@
** **@
//** ** @
//*** @
/** @
** @
** @
// @@
@
@
******@
////** @
** @
** @
******@
////// @@
***@
**/ @
/** @
*** @
///** @
/** @
//***@
/// @@
*@
/*@
/*@
/ @
*@
/*@
/*@
/ @@
*** @
///** @
/** @
//***@
**/ @
/** @
*** @
/// @@
** *** @
//***//**@
/// // @
@
@
@
@
@@
@
@
@
@
@
@
@
@@
@
@
@
@
@
@
@
@@
@
@
@
@
@
@
@
@@
@
@
@
@
@
@
@
@@
@
@
@
@
@
@
@
@@
@
@
@
@
@
@
@
@@
@
@
@
@
@
@
@
@@
`;
// src/fonts/3D Diagonal.js
var D_Diagonal_default = `flf2a$ 16 15 19 63 20 0 24511 0
Author : nabis, LG Beard, Markus Gebhard and others
Date : 2004/8/3 9:50:08
Version: 1.0
-------------------------------------------------
-------------------------------------------------
This font has been created using JavE's FIGlet font export assistant.
Have a look at: http://www.jave.de
Permission is hereby given to modify this font, as long as the
modifier's name is placed on a comment line.
---
Modified June 17, 2007 by Patrick Gillespie (patorjk@gmail.com)
- Widened the space character.
Modified 2012-06 by Patrick Gillespie (patorjk@gmail.com)
- Updated single character FIGchars to have an even width
- Added the 0xCA0 character.
$ $#
$ $#
$ $#
$ $#
$ $#
$ $#
$ $#
$ $#
$ $#
$ $#
$ $#
$ $#
$ $#
$ $#
$ $#
$ $##
,---, #
,\`--.' | #
| : : #
' ' ; #
| | | #
' : ; #
| | ' #
' : | #
; | ; #
\`---'. | #
\`--..\`; #
.--,_ #
| |\`. #
\`-- -\`, ; #
'---\`" #
##
___ ___ #
/ ./ .\\ #
\\_ ;\\_ ; | #
/ ,/ ," #
--' --' #
#
#
#
#
#
#
#
#
#
#
##
##
#
#
#
#
#
#
#
#
#
#
#
#
#
#
##
$#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
##
#
___ ,--, #
/ .\\ / .\`| #
\\ ; | /' / ; #
\`--" / / .' #
/ / ./ #
/ ./ / #
/ / / #
/ / / #
; / / ___ #
./__; / / .\\ #
| : / \\ ; | #
; |/ \`--" #
\`---' #
#
##
&#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
##
,---, #
,\`--.' | #
| : : #
| | ' #
' : | #
; |.' #
'---' #
#
#
#
#
#
#
#
#
##
#
.-''-,--. #
.\` \\ \\ #
; \\.. \\ #
\` -'. /'' / #
: / \\/___/ #
| : / #
; | | #
. ' . #
| : \\ ___ #
: \\ /\\ \\ #
. -,\` \\,, \\ #
; /\`\` / #
\`. / / #
\`-,,-'--' #
##
#
.--,-\`\`-. #
/ / '. #
/ ../ ; #
\\ \`\`\\ .\`- ' #
\\___\\/ \\ : #
\\ : | #
| | ; #
. \` . #
___ / : | #
/ /\\ / : #
/ ,,/ ',- . #
\\ ''\\ ; #
\\ \\ .' #
\`--\`-,,-' #
##
*#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
##
+#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
##
#
#
#
#
#
#
#
#
#
#
#
___ #
/ .\\ #
\\_ ; | #
/ ," #
'--' ##
#
#
#
#
,---,. #
,' .' | #
,---.' , #
| | | #
: : .' #
: |.' #
\`---' #
#
#
#
#
##
#
#
#
#
#
#
#
#
#
#
#
___ #
/ .\\ #
\\ ; | #
\`--" #
##
#
#
,--, #
/ .\`| #
/' / ; #
/ / .' #
/ / ./ #
/ ./ / #
/ / / #
/ / / #
; / / #
./__; / #
| : / #
; |/ #
\`---' #
##
#
#
,----.. #
/ / \\ #
/ . : #
. / ;. \\ #
. ; / \` ; #
; | ; \\ ; | #
| : | ; | ' #
. | ' ' ' : #
' ; \\; / | #
\\ \\ ', / #
; : / #
\\ \\ .' #
\`---\` #
##
#
#
,---, #
,\`--.' | #
/ / : #
: |.' ' #
\`----': | #
' ' ; #
| | | #
' : ; #
| | ' #
' : | #
; |.' #
'---' #
#
##
#
#
,----, #
.' .' \\ #
,----,' | #
| : . ; #
; |.' / #
\`----'/ ; #
/ ; / #
; / /-, #
/ / /.\`| #
./__; : #
| : .' #
; | .' #
\`---' #
##
#
.--,-\`\`-. #
/ / '. #
/ ../ ; #
\\ \`\`\\ .\`- ' #
\\___\\/ \\ : #
\\ : | #
/ / / #
\\ \\ \\ #
___ / : | #
/ /\\ / : #
/ ,,/ ',- . #
\\ ''\\ ; #
\\ \\ .' #
\`--\`-,,-' #
##
#
,--, #
,--.'| #
,--, | : #
,---.'| : ' #
; : | | ; #
| | : _' | #
: : |.' | #
| ' ' ; : #
\\ \\ .'. | #
\`---\`: | ' #
' ; | #
| : ; #
' ,/ #
'--' #
##
,----,. #
,' ,' | #
,' .' | #
,----.' .' #
| | .' #
: : |--, #
: | ;.' \\ #
| | | #
\`----'.'\\ ; #
__ \\ . | #
/ /\\/ / : #
/ ,,/ ',- . #
\\ ''\\ ; #
\\ \\ .' #
\`--\`-,-' #
##
#
#
#
,---. #
/ \\ #
/ / ' #
. ' / #
' / ; #
| : \\ #
; | \`\`. #
' ; \\ #
' | .\\ | #
| : '; : #
\\ \\ / #
\`---\`--\` #
##
,----, #
.' .\`| #
.' .' ; #
,---, ' .' #
| : ./ #
; | .' / #
\`---' / ; #
/ ; / #
; / / #
/ / / #
./__; / #
| : / #
; |/ #
\`---' #
#
##
,---.-, #
' ,' '. #
/ / \\ #
. ; ,/. : #
' | | : ; #
' | ./ : #
| : , #
\\ \\ / #
; , '\\ #
/ / \\ #
. ; ,/. : #
' | | : ; #
' | ./ : #
| : / #
\\ \\ .' #
\`---\`-' ##
#
,---.-, #
' ,' '. #
/ / \\ #
. ; ,/. : #
' | | : ; #
' | ./ : #
| : , #
\\ \\ | #
\`---\`--- ; #
| | | #
' : ; #
| | ' #
; |.' #
'---' #
##
#
___ #
/ .\\ #
\\ ; | #
\`--" #
#
#
#
#
#
___ #
/ .\\ #
\\ ; | #
\`--" #
#
##
#
___ #
/ .\\ #
\\ ; | #
\`--" #
#
#
#
#
___ #
/ .\\ #
\\_ ; | #
/ ," #
'--' #
#
##
#
#
#
,--. #
/ /| #
' / ' #
/ / / #
/ / , #
\\ '\\ \\ #
\\ \\ ' #
\\ . | #
\\__\\. #
#
#
#
##
#
#
#
,---,. ,---,#
,' .' |,' .'|#
,---.' ,---.' |#
| | | | ;#
: : .: : .'#
: |.' : |.' #
\`---' \`---' #
#
#
#
#
#
##
#
#
#
.--, #
|\\ \\ #
\` \\ \` #
\\ \\ \\ #
, \\ \\ #
/ /\` / #
\` / / #
| . / #
./__/ #
#
#
#
##
_.--,-\`\`\`-. #
/ / '. #
/ ../ ; #
\\ \`\`\\ .\`\`- '#
\\ ___\\/ \\ :#
\\ : |#
| ; . #
; ; : #
/ : : #
\`---'. | #
\`--..\`; #
.--,_ #
| |\`. #
\`-- -\`, ; #
'---\`" #
##
@#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
##
#
#
,---, #
' .' \\ #
/ ; '. #
: : \\ #
: | /\\ \\ #
| : ' ;. : #
| | ;/ \\ \\ #
' : | \\ \\ ,' #
| | ' '--' #
| : : #
| | ,' #
\`--'' #
#
##
#
#
,---,. #
,' .' \\ #
,---.' .' | #
| | |: | #
: : : / #
: | ; #
| : \\ #
| | . | #
' : '; | #
| | | ; #
| : / #
| | ,' #
\`----' #
##
#
#
,----.. #
/ / \\ #
| : : #
. | ;. / #
. ; /--\` #
; | ; #
| : | #
. | '___ #
' ; : .'| #
' | '/ : #
| : / #
\\ \\ .' #
\`---\` #
##
#
#
,---, #
.' .' \`\\ #
,---.' \\ #
| | .\`\\ | #
: : | ' | #
| ' ' ; : #
' | ; . | #
| | : | ' #
' : | / ; #
| | '\` ,/ #
; : .' #
| ,.' #
'---' #
##
#
#
,---,. #
,' .' | #
,---.' | #
| | .' #
: : |-, #
: | ;/| #
| : .' #
| | |-, #
' : ;/| #
| | \\ #
| : .' #
| | ,' #
\`----' #
##
#
#
,---,. #
,' .' | #
,---.' | #
| | .' #
: : : #
: | |-, #
| : ;/| #
| | .' #
' : ' #
| | | #
| : \\ #
| | ,' #
\`----' #
##
#
#
,----.. #
/ / \\ #
| : : #
. | ;. / #
. ; /--\` #
; | ; __ #
| : |.' .' #
. | '_.' : #
' ; : \\ | #
' | '/ .' #
| : / #
\\ \\ .' #
\`---\` #
##
#
,--, #
,--.'| #
,--, | : #
,---.'| : ' #
| | : _' | #
: : |.' | #
| ' ' ; : #
' | .'. | #
| | : | ' #
' : | : ; #
| | ' ,/ #
; : ;--' #
| ,/ #
'---' #
##
#
#
,---, #
,\`--.' | #
| : : #
: | ' #
| : | #
' ' ; #
| | | #
' : ; #
| | ' #
' : | #
; |.' #
'---' #
#
##
#
,---._ #
.-- -.' \\ #
| | :#
: ; |#
: |#
| : :#
: #
| ; |#
___ l #
/ /\\ J :#
/ ../ \`..- ,#
\\ \\ ; #
\\ \\ ,' #
"---....--' #
##
#
,--. #
,--/ /| #
,---,': / ' #
: : '/ / #
| ' , #
' | / #
| ; ; #
: ' \\ #
| | ' #
' : |. \\ #
| | '_\\.' #
' : | #
; |,' #
'-