Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/usr/bin/perl -w
- # a suite of text filters to annoy people :D
- #
- # author: cj_ <cjones@insub.org>
- #
- # "If used sparingly, and in good taste, ASCII art generally
- # is very well-received !"
- # -- Some Sucker
- #
- # credits:
- # fucter for translating to xchat2, only cli-fags use irssi
- # ben for banner leetness
- # Pi for the popeye filter
- # j0no for entirety of 8.7 release features and bugfixes
- # zb for adding ansi color support and putting this in ports :D
- # sisko for the original color script
- # various ideas from: tosat, jej, twid, cappy, rob
- # uke for the inspiration for the checker
- # hlprmnky for the jigs and for debugging
- # various stolen things: emacs spook file, jwz's scrambler script
- #
- #
- # Copyright (C) 2003-2008 cj_ <cjones@insub.org>
- #
- # This program is free software; you can redistribute it and/or
- # modify it under the terms of the GNU General Public License
- # as published by the Free Software Foundation; either version 2
- # of the License, or (at your option) any later version.
- #
- # This program is distributed in the hope that it will be useful,
- # but WITHOUT ANY WARRANTY; without even the implied warranty of
- # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- # GNU General Public License for more details.
- #
- # You should have received a copy of the GNU General Public License
- # along with this program; if not, write to the Free Software
- # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
- #
- # needs throttle, banner needs some cleaning , cmd, usages, general cleanup of code, smileys
- #msg works, code looks shitty
- #use strict;
- #use Text::Wrap;
- #use IPC::Open3; #we dont need anymore
- Xchat::register("gay", "12.0", "a suite of annoying ascii color/art text filters", "");
- IRC::print "gay.pl by cjones, made for xchat by chuck wolfe";
- #Did you know cjones was a fag, he actually sucked dick and liked it
- IRC::print "For usage help, try /gay -help";
- #Xchat::hook_command("gay", "process");
- IRC::add_command_handler("gay", "process");
- my $throttle = 0;
- my $USAGE;
- $USAGE = "/gay.pl\n";
- $USAGE .= "
- [-usage|-help|-version|-colors] [filters ...] [text ...]
- FILTERS:
- [-YES] [-blink] [-jive] [-exec] [-cow] [-cowfile <cow>] [-capchk] [-think]
- [-fig] [-font <font>] [-box] [-3d] [-arrow] [-diag] [-banner]
- [-banstyle <phrase|line|letter|char:?>] [-check] [-matrix] [-strip]
- [-spook] [-scramble] [-mirror] [-rotate] [-rev] [-leet] [-hug] [-flip]
- [-fake] [-ircii] [-jigs] [-tree] [-popeye] [-sine] [-chalk]
- [-throttle <ms>] [-repeat <#>] [-rainbow <map>] [-skew <#>] [-msg <nick>]
- [-pre <str>] [-cmd <cmd>] [-smiley <file>]";
- sub process {
- my @args = split(' ', shift(@_));
- my $flags;
- my $text; my $repeat; my @text; my $style; my $map; my $skew; my $sendto; my $force; my $smilefile;
- while(@args) {
- my $arg = shift(@args); last if (!defined $arg);
- if ($arg =~ /^-msg/) { $sendto = shift(@args); next }
- if ($arg =~ /^-pre/) { $prefix = shift(@args); next }
- if ($arg =~ /^-cmd/) { $cmd = shift(@args); next }
- if ($arg =~ /^-blink/) { $flags .= "b"; next }
- if ($arg =~ /^-jive/) { $flags .= "j"; next }
- if ($arg =~ /^-exec/) { $flags .= "e"; next }
- if ($arg =~ /^-cowfile/) { $cowfile = shift(@args); next }
- if ($arg =~ /^-cow/) { $flags .= "c"; next }
- if ($arg =~ /^-fig/) { $flags .= "f"; next }
- if ($arg =~ /^-font/) { $figfont = shift(@args); next }
- if ($arg =~ /^-banstyle/) { $banstyle = shift(@args); next }
- if ($arg =~ /^-utf8/) { $flags .= "8"; next }
- if ($arg =~ /^-box/) { $flags .= "o"; next }
- if ($arg =~ /^-3d/) { $flags .= "3"; next }
- if ($arg =~ /^-arrow/) { $flags .= "a"; next }
- if ($arg =~ /^-diag/) { $flags .= "D"; next }
- if ($arg =~ /^-banner/) { $flags .= "B"; next }
- if ($arg =~ /^-check/) { $flags .= "C"; next }
- if ($arg =~ /^-capchk/) { $flags .= "h"; next }
- if ($arg =~ /^-matrix/) { $flags .= "m"; next }
- if ($arg =~ /^-strip/) { $flags .= "n"; next }
- if ($arg =~ /^-spook/) { $flags .= "s"; next }
- if ($arg =~ /^-scramble/) { $flags .= "S"; next }
- if ($arg =~ /^-mirror/) { $flags .= "M"; next }
- if ($arg =~ /^-rotate/) { $flags .= "4"; next }
- if ($arg =~ /^-rev/) { $flags .= "R"; next }
- if ($arg =~ /^-leet/) { $flags .= "l"; next }
- if ($arg =~ /^-hug/) { $flags .= "H"; next }
- if ($arg =~ /^-flip/) { $flags .= "F"; next }
- if ($arg =~ /^-fake/) { $flags .= "I"; next }
- if ($arg =~ /^-ircii/) { $flags .= "d"; next }
- if ($arg =~ /^-jigs/) { $flags .= "J"; next }
- if ($arg =~ /^-tree/) { $flags .= "t"; next }
- if ($arg =~ /^-think/) { $flags .= "T"; next }
- if ($arg =~ /^-unused/) { $flags .= "u"; next }
- if ($arg =~ /^-popeye/) { $flags .= "p"; next }
- if ($arg =~ /^-sine/) { $flags .= "w"; next }
- if ($arg =~ /^-wave/) { $flags .= "w"; next } # bck compat
- if ($arg =~ /^-YES/i) { $force = 1; next }
- if ($arg =~ /^-chalk/i) { $flags .= "P"; next }
- if ($arg =~ /^-thro/) { $throttle = shift(@args); next }
- if ($arg =~ /^-repeat/) { $repeat = shift(@args); next }
- if ($arg =~ /^-rain/) { $map = shift(@args); $flags .= 'r'; next }
- if ($arg =~ /^-help/) { IRC::print($USAGE); return 1; next }
- if ($arg =~ /^-usage/) { IRC::print($USAGE);return 1; next }
- if ($arg =~ /^-skew/) { $skew = shift(@args); next }
- if ($arg =~ /^-smiley/) { $flags .= "E"; $smilefile = shift(@args); next }
- # this is getting trickier
- if ($arg =~ /^-(\d+)$/) {
- $flags .= "r";
- if ($1 == 1) { $style = 'rainbow' }
- elsif ($1 == 2) { $style = 'usa' }
- elsif ($1 == 3) { $style = 'random' }
- elsif ($1 == 4) { $style = 'randcol' }
- elsif ($1 == 5) { $style = 'grey' }
- elsif ($1 == 6) { $style = 'scale' }
- elsif ($1 == 7) { $style = 'xmas' }
- elsif ($1 == 8) { $style = 'canada' }
- next;
- } elsif ($arg =~ /^-4(\w+)$/) {
- $flags .= "r";
- $style = $1;
- next;
- }
- # doesn't match arguments, must be text!
- push(@text, $arg);
- }
- $text = join(" ", @text);
- $text =~ s/\\n/\n/sg;
- ########################################
- # sanity check before applying filters #
- ########################################
- if ($flags =~ /c/ and $flags =~ /T/) {
- cprint("This cow cannot THINK and SPEAK at the same time.");
- return;
- }
- if ($flags =~ /c/) { $thoughts = "\\" }
- if ($flags =~ /T/) { $thoughts = "o" }
- # this stuff tries to protect you from yourself
- # .. using -YES will skip this
- unless ($force) {
- if ($flags =~ /h/ and $flags =~ /M/) {
- cprint("Combining -capchk and -mirror is bad, mkay (try -YES)");
- return;
- }
- if ($flags =~ /s/ and $flags =~ /f/) {
- cprint("Spook and figlet is probably a bad idea (see: -YES)");
- return;
- }
- }
- # for outlining, precedence must be set
- # 3dbox > arrow > box
- $flags =~ s/(o|a)//g if $flags =~ /3/;
- $flags =~ s/o//g if $flags =~ /a/;
- # check should override rainbow for now
- $flags =~ s/r//g if $flags =~ /C/;
- # ... so should capchk, unless it's a cow, in which case
- # we invoke cowcut-fu
- #my $cowcut = 0;
- #if ($flags =~ /h/) {
- # # yes, capchk was specified
- # if ($flags =~ /c/ and $flags =~ /r/) {
- # $cowcut = 1;
- # } else {
- # $flags =~ s/r//g;
- # }
- #}
- # capchk takes precedence over check
- $flags =~ s/C//g if $flags =~ /h/;
- # the TREE cannot be colored
- $flags =~ s/r//g if $flags =~ /t/;
- # the smiley cannot be colored
- $flags =~ s/r//g if $flags =~ /E/;
- if (defined $repeat) {
- $repeat =~ s/[^0-9]//g;
- if ($repeat > 1) {
- $text = $text x $repeat;
- }
- }
- ##############################
- # filter text based on flags #
- ##############################
- my $flag_list = "348BCDFHIJMRSTabcdefhjlmnoprstuvwxPE";
- # flag sanity check. because there are a lot of flags,
- # require master list to contain all viable flags
- if ($flag_list =~ /(.).*\1/) {
- cprint("There was an internal error with flag processing: duplicate ($1)");
- return;
- }
- foreach my $f (split(//, $flags)) {
- if ($flag_list !~ /$f/) {
- cprint("There was an internal error with flag processing: missing ($f)");
- return;
- }
- }
- # validate utf8 support, only works in 5.8+
- my $utf8 = ($flags =~ /8/ && $] >= 5.008);
- # most useful command yet
- if ($flags =~ /u/) {
- cprint("Sorry, the -unused flag is unsupported.");
- return;
- }
- # where to get text
- #if $flags =~ /v/;
- #$text = shift
- $text = execute($text) if $flags =~ /e/;
- $text = slurp($text, $utf8) if $flags =~ /x/;
- $text = spookify($text) if $flags =~ /s/;
- # change the text contents itself
- $text = jive($text) if $flags =~ /j/;
- $text = scramble($text) if $flags =~ /S/;
- $text = leet($text) if $flags =~ /l/;
- $text = reverse_ascii($text) if $flags =~ /R/;
- $text = jigs($text) if $flags =~ /J/;
- # change the text appearance
- $text = sine($text) if $flags =~ /w/;
- $text = diagonal($text) if $flags =~ /D/;
- $text = popeye($text) if $flags =~ /p/;
- $text = matrix($text) if $flags =~ /m/;
- $text = figlet($text, $figfont) if $flags =~ /f/;
- $text = banner($text, $banstyle) if $flags =~ /B/;
- $text = hug($text) if $flags =~ /H/;
- $text = rotate($text) if $flags =~ /4/;
- $text = gwrap($text) if $flags !~ /[f4]/;
- $text = chalkboard($text) if $flags =~ /P/;
- # change the text presentation
- $text = checker($text) if $flags =~ /h/;
- $text = reverse_ascii($text) if $flags =~ /M/;
- $text = cowsay($text, $cowfile, $cowcut) if $flags =~ /(c|T)/;
- $text = reverse_ascii($text) if $flags =~ /M/ and $flags =~ /(c|T)/;
- $text = upside_down($text) if $flags =~ /F/;
- $text = checker($text) if $flags =~ /C/;
- # draw a box, pass a style flag
- $text = outline($text, 0) if $flags =~ /o/;
- $text = outline($text, 1) if $flags =~ /3/;
- $text = outline($text, 2) if $flags =~ /a/;
- # change the final products visual appearance
- $text = rainbow($text, $style, $map, $skew) if $flags =~ /r/;
- $text = tree($text) if $flags =~ /t/;
- $text = blink($text) if $flags =~ /b/;
- # stuff to bust ircii :D
- $text = ircii_fake($text) if $flags =~ /I/;
- $text = ircii_drop($text) if $flags =~ /d/;
- $text = smiley($smilefile) if $flags =~ /E/;
- $text = prefix($text, $prefix) if $prefix;
- $text = strip($text) if $flags =~ /n/;
- ########################
- # output final product #
- ########################
- # don't go the final mile if a filter returned an error
- #return unless (defined $text && (length($text) >= 1));
- # html needs to be handled with kids gloves
- if(!defined $sendto){
- cprint($text);
- }
- else{
- cprintmsg($text, $sendto);
- }
- return 1;
- }
- sub cprintmsg {
- my ($text, $sendto) = @_;
- @t = split(/\n/, $text);
- IRC::print $sendto;
- my $tline; # = shift(@t);
- if(!@t){
- IRC::command("/msg $sendto $text");}
- else{
- while(@t){
- $tline = shift(@t);
- IRC::command("/msg $sendto $tline");
- #$tline = shift(@t);
- }
- }
- }
- sub cprint {
- #my $text = shift;
- #$text =~ s/\n//g;
- #IRC::command("/say $text");
- #Xchat::print($text);
- my $text = shift;
- @t = split(/\n/, $text);
- my $tline; # = shift(@t);
- if(!@t){
- IRC::command("/say $text");}
- else{
- while(@t){
- $tline = shift(@t);
- IRC::command("/say $tline");
- if ($throttle) {
- my $start = time();
- my $current = time() - $start;
- IRC::print $start;
- IRC::print $current;
- #while ($current < $throttle){
- #$current = time() - $start;
- #};
- #sleep($throttle); #locks xchat
- }
- #$tline = shift(@t);
- }
- }
- }
- my $settings = {
- cowfile => "default",
- cowpath => undef,
- figfont => "standard",
- linewrap => 70,
- rainbow_offset => 0,
- rainbow_keepstate => 1,
- keepstate_file => $ENV{HOME} . "/.gay-state",
- default_style => 1,
- check_size => 3,
- check_text => 0,
- check_colors => "4,2",
- matrix_size => 6,
- matrix_spacing => 2,
- colcat_max => 2048,
- jive_cmd => "jive",
- spook_words => 6,
- hug_size => 5,
- sine_height => 5,
- sine_frequency => "0.3",
- sine_background => " ",
- banner_style => "phrase",
- };
- # wrap settings routines.. irssi cares about type
- # perl doesn't.. go figure
- sub settings_get_str {
- my $key = shift;
- if ($CONTEXT eq 'irssi') {
- return Irssi::settings_get_str($key);
- } else {
- return $settings->{$key};
- }
- }
- sub settings_get_int {
- my $key = shift;
- if ($CONTEXT eq 'irssi') {
- return Irssi::settings_get_int($key);
- } else {
- return $settings->{$key};
- }
- }
- sub settings_get_bool {
- my $key = shift;
- if ($CONTEXT eq 'irssi') {
- return Irssi::settings_get_bool($key);
- } else {
- return $settings->{$key};
- }
- }
- sub settings_set_int {
- my $key = shift;
- my $val = shift;
- if ($CONTEXT eq 'irssi') {
- Irssi::settings_set_int($key, $val);
- } else {
- $settings->{$key} = $val;
- }
- }
- #######################
- # define some globals #
- #######################
- # type of cow variable
- my $thoughts;
- # usage/contact info
- my $blink = "\x1b[5m";
- my $ansi_map = {
- 0 => 'white',
- 1 => 'black',
- 2 => 'blue',
- 3 => 'green',
- 4 => 'bold red',
- 5 => 'red',
- 6 => 'magenta',
- 7 => 'yellow',
- 8 => 'bold yellow',
- 9 => 'bold green',
- 10 => 'cyan',
- 11 => 'bold cyan',
- 12 => 'bold blue',
- 13 => 'bold magenta',
- 14 => 'bold black',
- 15 => 'bold white',
- };
- my $colorCodeMap = {
- r => 5,
- o => 4,
- y => 7,
- Y => 8,
- g => 3,
- G => 9,
- c => 10,
- C => 11,
- b => 2,
- B => 12,
- m => 6,
- M => 13,
- 0 => 1,
- 1 => 14,
- 2 => 15,
- w => 0,
- };
- my $has_color = 0;
- my $prev_fg_color;
- my $prev_bg_color;
- sub do_color {
- my $text = shift;
- my $fg_col = shift;
- my $bg_col = shift;
- my $format = shift || 'mirc';
- if ($format eq 'code') {
- $fg_col = $colorCodeMap->{$fg_col} if defined $fg_col;
- $bg_col = $colorCodeMap->{$bg_col} if defined $bg_col;
- }
- $has_color = 1;
- my $ret = "\003$fg_col";
- if (defined $bg_col) {
- $ret .= ",$bg_col";
- }
- # if first char is a , or number,
- # we need some esc char's so the color thingy
- # doesn't get confused
- my $ord = ord(substr($text, 0, 1));
- if (($ord >= 48 and $ord <= 57) or $ord == 44) {
- $ret .= "\26\26";
- }
- # mIRC remove formatting character
- #return ($ret . $text . "\x0F");
- return ($ret . $text );
- #return ($text);
- }
- sub show_colmap {
- foreach my $color (sort { $a <=> $b } keys %$ansi_map) {
- my $color_name = $ansi_map->{$color};
- my $msg = sprintf("%2d: %s\n", $color, $color_name);
- my $bg = ($color == 1) ? 0 : undef; # use white background for black
- cprint(do_color($msg, $color, $bg));
- }
- }
- # spook array.. in a perfect world this would
- # be in its own file. this is stolen right out of emacs,
- # with some more modern stuff tacked on
- my @spook_lines = (
- "\$400 million in gold bullion",
- "[Hello to all my fans in domestic surveillance]", "AK-47",
- "ammunition", "arrangements", "assassination", "BATF", "bomb", "CIA",
- "class struggle", "Clinton", "Cocaine", "colonel",
- "counter-intelligence", "cracking", "Croatian", "cryptographic",
- "Delta Force", "DES", "domestic disruption", "explosion", "FBI", "FSF",
- "fissionable", "Ft. Bragg", "Ft. Meade", "genetic", "Honduras",
- "jihad", "Kennedy", "KGB", "Khaddafi", "kibo", "Legion of Doom",
- "Marxist", "Mossad", "munitions", "Nazi", "Noriega", "North Korea",
- "NORAD", "NSA", "nuclear", "Ortega", "Panama", "Peking", "PLO",
- "plutonium", "Qaddafi", "quiche", "radar", "Rule Psix",
- "Saddam Hussein", "SDI", "SEAL Team 6", "security", "Semtex",
- "Serbian", "smuggle", "South Africa", "Soviet ", "spy", "strategic",
- "supercomputer", "terrorist", "Treasury", "Uzi", "Waco, Texas",
- "World Trade Center", "Liberals", "Cheney",
- # mine
- "Eggs", "Libya", "Bush", "Kill the president", "GOP", "Republican",
- "Shiite", "Muslim", "Chemical Ali", "Ashcroft", "Terrorism",
- "Al Qaeda", "Al Jazeera", "Hamas", "Israel", "Palestine", "Arabs",
- "Arafat", "Patriot Act", "Voter Fraud", "Punch-cards", "Diebold",
- "conspiracy", "Fallujah", "IndyMedia", "Skull and Bones", "Free Masons",
- "Kerry", "Grass Roots", "9-11", "Rocket Propelled Grenades",
- "Embedded Journalism", "Lockheed-Martin", "war profiteering",
- # from blogs about the spooks
- "Kill the President", "anarchy", "echelon", "nuclear",
- "assassinate", "Roswell", "Waco", "World Trade Center", "Soros",
- "Whitewater", "Lebed", "HALO", "Spetznaz", "Al Amn al-Askari",
- "Glock 26", "Steak Knife", "Rewson", "SAFE", "Waihopai", "ASPIC",
- "MI6", "Information Security", "Information Warfare", "Privacy",
- "Information Terrorism", "Terrorism", "Defensive Information",
- "Defense Information Warfare", "Offensive Information",
- "Offensive Information Warfare", "Ortega Waco", "assasinate",
- "National Information Infrastructure", "InfoSec",
- "Computer Terrorism", "DefCon V", "Encryption", "Espionage", "NSA",
- "CIA", "FBI", "White House", "Undercover", "Compsec 97", "Europol",
- "Military Intelligence", "Verisign", "Echelon",
- "Ufologico Nazionale", "smuggle", "Bletchley Park", "Clandestine",
- "Counter Terrorism Security", "Enemy of the State", "20755-6000",
- "Electronic Surveillance", "Counterterrorism", "eavesdropping",
- "nailbomb", "Satellite imagery", "subversives", "World Domination",
- "wire transfer", "jihad", "fissionable", "Sayeret Mat'Kal",
- "HERF pipe-bomb", "2.3 Oz. cocaine", "Yellow Van",
- );
- # leet mapping
- my $leet_map = {
- a => [ "4", "/\\", "@", "a", "A" ],
- b => [ "|o", "b", "B" ],
- c => [ "C", "c", "<" ],
- d => [ "d", "D", "|)" ],
- e => [ "e", "E", "3" ],
- f => [ "f", "F", "/=" ],
- g => [ "g", "G", "6" ],
- h => [ "h", "H", "|-|" ],
- i => [ "i", "I", "|", "1" ],
- j => [ "j", "J" ],
- k => [ "keke", "x", "X", "k", "K", "|<" ],
- l => [ "l", "L", "7", "|_" ],
- m => [ "|V|", "|\\/|", "m", "M" ],
- n => [ "n", "N", "|\\|" ],
- o => [ "0", "o", "O", "()", "[]", "<>" ],
- p => [ "p", "P", "9" ],
- q => [ "q", "Q" ],
- r => [ "r", "R" ],
- s => [ "s", "S", "5" ],
- t => [ "t", "T", "7" ],
- u => [ "|_|", "u", "U", "\\/" ],
- v => [ "v", "V", "\\/" ],
- w => [ "w", "W", "uu", "UU", "uU", "Uu", "\\/\\/" ],
- x => [ "x", "X", "><" ],
- y => [ "y", "Y" ],
- z => [ "z", "Z", "5" ],
- };
- # 'jigs' mapping
- my $jigs_map = {
- 7 => "8",
- 8 => "9",
- 9 => "0",
- 0 => "-",
- '-' => "=",
- '=' => "7",
- y => "u",
- h => "j",
- n => "m",
- u => "i",
- j => "k",
- m => ".",
- i => "o",
- k => "l",
- "," => ".",
- o => "p",
- l => ";",
- "." => "/",
- p => "[",
- ";" => "'",
- "/" => "n",
- "[" => "]",
- "]" => '\\',
- '"' => "h",
- '\\' => "u",
- };
- my @bash_map = (
- "a",
- "d",
- "D{[^{]*}",
- "e",
- "h",
- "H",
- "j",
- "l",
- "n",
- "r",
- "s",
- "t",
- "T",
- "@",
- "A",
- "u",
- "v",
- "V",
- "w",
- "W",
- "!",
- "#",
- "\\\$",
- "\\d{1,3}",
- "\\\\",
- "\\[",
- "\\]",
- );
- # random text for text substitution
- # needless to say if someone has this string
- # in their text, it'll get clobbered.
- my $rnd = "rAnDoM";
- # markup stuff
- ###########
- # FILTERS #
- ###########
- sub prefix {
- my ($text, $prefix) = @_;
- return if (!defined $text || !defined $prefix);
- my @new;
- foreach my $line (split(/\n/, $text)) {
- $line = "$prefix $line";
- push(@new, $line);
- }
- $text = join("\n", @new);
- return $text;
- }
- my $COWPATH;
- sub find_cowpath {
- $COWPATH = $ENV{COWPATH} || "";
- return if -d $COWPATH;
- $COWPATH = settings_get_str("cowpath") || "";
- return if -d $COWPATH;
- my $cowsay_cmd = whereis("cowsay");
- if ($cowsay_cmd) {
- if (open(IN, "< $cowsay_cmd")) {
- while (my $line = <IN>) {
- if ($line =~ m!^\$cowpath = \$ENV\{'COWPATH'\} \|\| '(.*?)';!) {
- $COWPATH = $1;
- last;
- }
- }
- close IN;
- }
- }
- $COWPATH ||= "";
- return if -d $COWPATH;
- $COWPATH = undef;
- cprint("I could not figure out your COWPATH!!");
- }
- sub cowsay {
- # my cowsay implementation.. because normal cowsay
- # messes up bubble-size if you have imbedded
- # color codes.. this works pretty much the same,
- # except it doesn't have support for stuff like
- # tongue and eyes.
- my $text = shift;
- return if (!defined $text);
- my $cowfile = shift || "default";
- my $cowcut = shift;
- # my mother tried to find my cowpath once.. once.
- unless ($COWPATH) { find_cowpath() }
- unless ($COWPATH) {
- cprint("I cannot continue with cowsay, for there is no COWPATH!");
- return $text;
- }
- my @output;
- # this is the whole point of doing my own cowsay
- my $length = 0;
- my @text = split(/\n/, $text);
- foreach my $line (@text) {
- my $l = clean_length($line);
- $length = $l if $l > $length;
- }
- # add filler to the end
- foreach my $line (@text) {
- $line .= (" " x ($length - clean_length($line)));
- }
- my $div = " " . ("-" x ($length+2));
- push(@output, $div);
- push(@output, $COWCUT) if $cowcut;
- my $count = 0;
- my $total = scalar(@text) - 1;
- foreach my $line (@text) {
- if ($total == 0) {
- push(@output, "< $line >");
- } elsif ($count == 0) {
- push(@output, "/ $line \\");
- } elsif ($count == $total) {
- push(@output, "\\ $line /");
- } else {
- push(@output, "| $line |");
- }
- $count++;
- }
- # this is rainbow() markup for toggling colorize
- push(@output, $COWCUT) if $cowcut;
- push(@output, $div);
- if ($cowfile =~ /^<rand(om)?>$/i) {
- my @cowfiles;
- foreach my $dir (split(/:/, $COWPATH)) {
- unless (opendir(COWDIR, $dir)) {
- cprint("failed to open: $dir");
- return;
- }
- push(@cowfiles, grep(/\.cow$/, readdir(COWDIR)));
- close COWDIR;
- }
- $cowfile = $cowfiles[rand(@cowfiles)];
- }
- my $full;
- $cowfile .= ".cow" unless ($cowfile =~ /\.cow$/);
- if ($cowfile =~ m!/!) {
- $full = $cowfile;
- } else {
- foreach my $path (split(/:/, $COWPATH)) {
- if (-f "$path/$cowfile") {
- $full = "$path/$cowfile";
- last;
- }
- }
- }
- unless (-f $full) {
- cprint("could not find cowfile: $cowfile");
- return;
- }
- my $the_cow = "";
- my $eyes = "oo";
- my $tongue = " ";
- # very odd.. unless $thoughts is addressed in some
- # fasion in this scope, eval doesn't notice it
- # i say this is a perl bug
- $thoughts = $thoughts;
- unless (open(IN, "<$full")) {
- cprint("couldn't read $full: $!");
- return;
- }
- my $cow_code = join('', <IN>);
- close IN;
- eval $cow_code;
- push(@output, split(/\n/, $the_cow));
- return join("\n", @output);
- }
- sub figlet {
- # pass text through figlet
- my $text = shift;
- return if (!defined $text);
- my $figlet_font = shift || 'standard';
- my $figlet_wrap = settings_get_int('linewrap');
- if ($figlet_font =~ /random/i) {
- chomp(my $fontdir = run(command => "figlet", args => "-I2"));
- if (opendir(FONTDIR, $fontdir)) {
- my @fonts = grep(s/\.flf$//, readdir(FONTDIR));
- close FONTDIR;
- $figlet_font = $fonts[rand(@fonts)];
- } else {
- cprint("could not open $fontdir");
- $figlet_font = "standard";
- }
- }
- my $output = run(
- command => "figlet",
- args => "-f $figlet_font -w $figlet_wrap",
- stdin => $text,
- ) || return $text;
- $output =~ s/^\s+\n//g; # sometimes it leaves leading blanks too!
- $output =~ s/\n\s+\n$//s; # figlet leaves a trailing blank line.. sometimes
- return $output;
- }
- sub jive {
- # pass text through jive filter
- my $text = shift;
- return if (!defined $text);
- # see if we can find the program
- my $jive_cmd = settings_get_str('jive_cmd');
- $jive_cmd = -x $jive_cmd ? $jive_cmd : whereis("jive");
- unless (-x $jive_cmd) {
- cprint("$jive_cmd not found or not executable!");
- return;
- }
- my $pid = open3(
- \*WRITE, \*READ, \*ERR,
- $jive_cmd
- );
- print WRITE $text;
- close WRITE;
- $text = join('', <READ>);
- close READ;
- # check for errors
- cprint_lines(join('', <ERR>));
- close ERR;
- waitpid($pid, 0);
- return $text;
- }
- sub checker {
- # checker filter. thanks to uke
- my $text = shift;
- return if (!defined $text);
- my $checksize = settings_get_int('check_size');
- my $checktext = settings_get_int('check_text');
- my @colors = split(/\s*,\s*/, settings_get_str("check_colors"));
- my $rownum = 0;
- my $offset = 0;
- my @text = split(/\n/, $text);
- # what is the longest line?
- my $length = 0;
- foreach my $line (@text) {
- $length = length($line) if length($line) > $length;
- }
- foreach my $line (@text) {
- # pad line with whitespace
- $line .= (" " x ($length - length($line)));
- my $newline;
- my $state = 0;
- for (my $i = 0; $i < length($line); $i = $i + $checksize) {
- my $chunk = substr($line, $i, $checksize);
- my $index = ($state + $offset); $index -= scalar(@colors) if $index >= scalar(@colors);
- # add color
- $newline .= do_color($chunk, $checktext, $colors[$index]);
- $state++; $state = 0 if $state >= scalar(@colors);
- }
- $line = $newline;
- # increment rowcount/swap offset
- $rownum++;
- if ($rownum == $checksize) {
- $rownum = 0;
- $offset++; $offset = 0 if $offset >= scalar(@colors);
- }
- }
- return join("\n", @text);
- }
- sub get_state {
- my $state;
- $state = settings_get_int("rainbow_offset");
- $state ||= 0;
- return $state;
- }
- sub set_state {
- my $state = shift;
- settings_set_int("rainbow_offset", $state);
- }
- # New way of doing it
- my $rainbowMap = {
- rainbow => 'rrooyyYYGGggccCCBBbbmmMM', # -1
- usa => 'oowwBB', # -2
- blue => 'bB', # -4blue
- green => 'gG', # -4green
- purple => 'mM', # -4purple
- grey => '12', # -4grey (-5)
- yellow => 'yY', # -4yellow
- red => 'or', # -4red
- scale => 'ww22CC11CC22', # -6
- xmas => 'og', # -7
- canada => 'ooww', # -8
- };
- sub rainbow {
- my $text = shift;
- my $style = shift || 'rainbow';
- my $map = shift;
- my $skew = shift || 1;
- return if !defined $text;
- my $offset = settings_get_bool('rainbow_keepstate') ? get_state() : 0;
- $map = $rainbowMap->{$style} if (!defined $map && exists $rainbowMap->{$style});
- #$map = $colorCodeMap; ########################################
- return $text if !defined $map;
- my $colorize = 1;
- my $output = '';
- foreach my $line (split(/\r?\n/, $text)) {
- if (!$colorize % 2) { $output .= "$line\n"; next }
- my $i = 0;
- foreach my $char (split('', $line)) {
- my $color = substr($map, ($offset + $i) % length($map), 1);
- $output .= do_color($char, $color, undef, 'code');
- $i++;
- }
- $offset += $skew;
- $output .= "\n";
- }
- set_state($offset) if settings_get_bool('rainbow_keepstate');
- return $output
- }
- sub blink {
- # make the text blink
- my $text = shift;
- return if (!defined $text);
- my @newtext;
- foreach my $line (split(/\n/, $text)) {
- push(@newtext, $blink . $line);
- }
- return join("\n", @newtext);
- }
- sub clean_length {
- my $text = shift;
- return if (!defined $text);
- # generic mIRC color syntax
- $text =~ s/\x03\d{0,2}(,\d{0,2})?//g;
- # bold ^b, inverse ^v, underline ^_, clear ^O
- $text =~ s/\x02|\x16|\x1F|\x0F//g;
- # ansi
- $text =~ s/\x1b\[\d+(?:,\d+)?m//g;
- #html
- $text =~ s/<span[^>]+>//g;
- $text =~ s/<\/span>//g;
- return length($text);
- }
- sub matrix {
- # 0-day greetz to EnCapSulaTE1!11!one
- my $text = shift;
- return if (!defined $text);
- my $size = settings_get_int("matrix_size");
- my $spacing = settings_get_int("matrix_spacing");
- $size = 1 if ($size < 1);
- # first, let's dispense with the newlinesa
- # because they have no meaning up/down
- $text =~ s/\n/ /sg;
- my @text;
- for (my $i = 0; $i < length($text); $i += $size) {
- my $chunk = substr($text, $i, $size);
- for (my $j = 0; $j < length($chunk); $j++) {
- $text[$j] .= substr($chunk, $j, 1) . (" " x $spacing);
- }
- }
- return join("\n", @text);
- }
- sub outline {
- # draw a box around text.. thanks 2 twid
- # for the idea
- my $text = shift;
- return if (!defined $text);
- my $style = shift;
- my ($_3d, $_arrow);
- if ($style == 1) {
- $_3d = 1;
- } elsif ($style == 2) {
- # arrow-style, thanks to rob
- $_arrow = 1;
- }
- my @text = split(/\n/, $text);
- # what is the longest line
- my $length = 0;
- foreach my $line (@text) {
- $length = clean_length($line) if clean_length($line) > $length;
- }
- # add box around each line
- my $lc = "|"; my $rc = "|";
- if ($_arrow) { $lc = ">"; $rc = "<" }
- foreach my $line (@text) {
- $line = "$lc $line" . (" " x ($length - clean_length($line) + 1)) . "$rc";
- $line .= " |" if ($_3d);
- }
- # top/bottom frame
- my ($top_frame, $bottom_frame);
- if ($_arrow) {
- $top_frame = "\\" . ("^" x ($length + 2)) . "/";
- $bottom_frame = "/" . ("^" x ($length + 2)) . "\\";
- } else {
- $top_frame = "+" . ("-" x ($length + 2)) . "+";
- $bottom_frame = $top_frame;
- }
- if ($_3d) {
- push(@text, $bottom_frame . "/");
- unshift(@text, $top_frame . " |");
- } else {
- push(@text, $bottom_frame);
- unshift(@text, $top_frame);
- }
- if ($_3d) {
- unshift(@text, " /" . (" " x ($length + 2)) . "/|");
- unshift(@text, " " . ("_" x ($length + 3)));
- }
- return join("\n", @text);
- }
- sub slurp {
- # read in a file with max setting (useful for catting /dev/urandom :D )
- # maybe make this read in chunks, not by line, or something.. seems clumsy
- my $file = shift || return;
- my $utf8 = shift;
- # expand ~
- $file =~ s!^~([^/]*)!$1 ? (getpwnam($1))[7] : ($ENV{HOME} || $ENV{LOGDIR} || (getpwuid($>))[7])!ex;
- {
- my $result;
- if ($utf8) { eval '$result = open(IN, "<:utf8", "$file");' }
- else { $result = open(IN, "<$file"); }
- unless ($result) {
- cprint("could not open $file: $!");
- return;
- }
- }
- my $max = settings_get_int("colcat_max");
- my $text;
- while (my $line = <IN>) {
- $text .= $line;
- last if length($text) >= $max;
- }
- close IN;
- return $text;
- }
- sub draw_box {
- # taken from a busted script distributed with irssi
- # just a simple ascii line-art around help text
- my ($title, $text, $footer, $color) = @_;
- $footer = $title unless($footer);
- my $box;
- $box .= '%R,--[%n%9%U' . $title . '%U%9%R]%n' . "\n";
- foreach my $line (split(/\n/, $text)) {
- $box .= '%R|%n ' . $line . "\n";
- }
- $box .= '%R`--<%n' . $footer . '%R>->%n';
- $box =~ s/%.//g unless $color;
- return $box;
- }
- sub spookify {
- # add emacs spook text. if there is previously existing text, it appends
- my $text = shift;
- my $count = settings_get_int('spook_words') || return $text;
- my @spook_words;
- for (my $i = 0; $i < $count; $i++) {
- my $word = $spook_lines[int(rand(0) * scalar(@spook_lines))];
- push(@spook_words, $word);
- }
- $text = join(" ", @spook_words) . " $text";
- return $text;
- }
- sub gwrap {
- # fix that shit
- my $text = shift;
- return if (!defined $text);
- my $wrap = return $text;
- $Text::Wrap::columns = $wrap;
- my @output;
- foreach my $line (split(/\n/, $text)) {
- local $^W = undef; # silence spurious warnings
- if (length($line) > $wrap) {
- ($line) = Text::Wrap::wrap(undef, undef, $line);
- }
- $line =~ s/\t/ /g;
- push(@output, $line);
- }
- $text = join("\n", @output);
- return $text;
- }
- sub leet {
- # leet speak :(
- my $text = shift;
- return if (!defined $text);
- my @output;
- foreach my $line (split(/\n/, $text)) {
- my $newline;
- for (my $i = 0; $i < length($line); $i++) {
- my $char = lc(substr($line, $i, 1));
- if ($leet_map->{$char}) {
- my @possibles = @{$leet_map->{$char}};
- $char = $possibles[int(rand(0) * scalar(@possibles))];
- }
- $newline .= $char;
- }
- push(@output, $newline);
- }
- return join("\n", @output);
- }
- sub hug {
- my $text = shift;
- return if (!defined $text);
- my @text = split(/\n/, $text);
- my $size = settings_get_int("hug_size");
- # what is the longest line
- my $length = 0;
- foreach my $line (@text) {
- $length = clean_length($line) if clean_length($line) > $length;
- }
- my @output;
- foreach my $line (@text) {
- $line = ("{" x $size) . ' ' . $line . (' ' x ($length - length($line))) . ' ' . ("}" x $size);
- push(@output, $line);
- }
- return join("\n", @output);
- }
- sub reverse_ascii {
- #####################
- # reverse ascii art #
- #####################
- my $text = shift;
- return if (!defined $text);
- my @lines = split(/\n/, $text);
- # how big is the longest line
- my $length = 0;
- foreach my $line (@lines) {
- my $line_length = clean_length($line);
- $length = $line_length if ($line_length > $length);
- }
- my @output;
- foreach my $line (@lines) {
- $line =~ s!/!$rnd!g; $line =~ s!\\!/!g; $line =~ s!$rnd!\\!g;
- $line =~ s!{!$rnd!g; $line =~ s!}!{!g; $line =~ s!$rnd!}!g;
- $line =~ s!\(!$rnd!g; $line =~ s!\)!(!g; $line =~ s!$rnd!)!g;
- $line =~ s!\[!$rnd!g; $line =~ s!\]![!g; $line =~ s!$rnd!]!g;
- $line =~ s!<!$rnd!g; $line =~ s!>!<!g; $line =~ s!$rnd!>!g;
- push(@output, sprintf("%" . $length . "s", scalar(reverse($line))));
- }
- return join("\n", @output);
- }
- sub upside_down {
- # kind of like reverse_ascii, only on a different axis
- my $text = shift;
- return if (!defined $text);
- my @output;
- foreach my $line (split(/\n/, $text)) {
- $line =~ s!/!$rnd!g; $line =~ s!\\!/!g; $line =~ s!$rnd!\\!g;
- $line =~ s!v!$rnd!g; $line =~ s!\^!v!g; $line =~ s!$rnd!^!g;
- $line =~ s!w!$rnd!g; $line =~ s!m!w!g; $line =~ s!$rnd!m!g;
- $line =~ s!_!-!g;
- unshift(@output, $line);
- }
- return join("\n", @output);
- }
- # irssi is not friendly to require semantic
- # so just use perl's shellwords.pl here
- sub shellwords {
- my $text = join('', @_);
- return if (!defined $text);
- my (@words, $snippet, $field);
- $text =~ s/^\s+//;
- # fix deep recursion case (can't escape newline :P)
- # found by hlprmnky
- if ($text =~ /(?:[^\\]|^)\x5c$/) {
- cprint("Unmatched escape");
- return;
- }
- while ($text ne '') {
- $field = '';
- for (;;) {
- if ($text =~ s/^"(([^"\\]|\\.)*)"//) {
- ($snippet = $1) =~ s#\\(.)#$1#g;
- } elsif ($text =~ /^"/) {
- cprint("Unmatched double quote");
- return;
- } elsif ($text =~ s/^'(([^'\\]|\\.)*)'//) {
- ($snippet = $1) =~ s#\\(.)#$1#g;
- } elsif ($text =~ /^'/) {
- cprint("Unmatched single quote");
- return;
- } elsif ($text =~ s/^\\(.)//) {
- $snippet = $1;
- } elsif ($text =~ s/^([^\s\\'"]+)//) {
- $snippet = $1;
- } else {
- $text =~ s/^\s+//;
- last;
- }
- $field .= $snippet;
- }
- push(@words, $field);
- }
- return @words;
- }
- sub scramble {
- # stupid blog meme about mixing up
- # the inside letters
- my $text = shift;
- return if (!defined $text);
- my @newtext;
- foreach my $line (split(/\n/, $text)) {
- my @newline;
- foreach my $word (split(/\s+/, $line)) {
- my @letters = split(//, $word);
- my $first = shift(@letters);
- my $last = pop(@letters);
- fisher_yates_shuffle(\@letters) if scalar(@letters) > 0;
- my $newline = $first . join('', @letters) . $last;
- push(@newline, $newline);
- }
- push(@newtext, join(" ", @newline));
- }
- $text = join("\n", @newtext);
- return $text;
- }
- sub fisher_yates_shuffle {
- # safe randomizing
- my $array = shift;
- my $i;
- for ($i = @$array; --$i; ) {
- my $j = int rand ($i+1);
- next if $i == $j;
- @$array[$i,$j] = @$array[$j,$i];
- }
- }
- sub ircii_fake {
- # some ansi stuff to obscure the <nick>
- my $text = shift;
- return if (!defined $text);
- my @new;
- foreach my $line (split(/\n/, $text)) {
- $line = "\x85\x8d$line";
- push(@new, $line);
- }
- $text = join("\n", @new);
- return $text;
- }
- sub ircii_drop {
- # this is just evil. move the cursor somewhere
- # inconvenient
- my $text = shift;
- return if (!defined $text);
- $text .= ("\x84" x 23);
- return $text;
- }
- # shift ascii homerow, code by hlprmnky
- # hella copped from leet, above
- sub jigs {
- my $text = shift;
- return if (!defined $text);
- my @output;
- foreach my $line (split(/\n/, $text)) {
- my $newline;
- for (my $i = 0; $i < length($line); $i++) {
- my $char = lc(substr($line, $i, 1));
- if ($jigs_map->{$char}) {
- $char = $jigs_map->{$char};
- }
- $newline .= $char;
- }
- push(@output, $newline);
- }
- return join("\n", @output);
- }
- #######################
- ### christmas stuff ###
- #######################
- sub tree {
- # this is the hardest filter i've ever written :(
- # there must be a more graceful, or at least ideomatic,
- # way of doing this, but i can't think of it.
- my $text = shift;
- return if (!defined $text);
- # bulbs.. only bright primary colors
- my @bulbs = (2,4,6,8,12);
- # don't do this in the loop or you don't get
- # random numbers
- srand(time());
- # cache green
- my $green = 3;
- my @output;
- foreach my $line (split(/\n/, $text)) {
- # it's gotta be at least 3 chars long to work
- unless (length($line) > 2) {
- push(@output, $line);
- next;
- }
- # the inside can't be all whitespace
- if ($line =~ /^.\s+.$/) {
- push(@output, $line);
- next;
- }
- # split line into an array of characters
- my @row = split(//, $line);
- # determine which points can be changed
- my @map;
- for (my $i = 0; $i < scalar(@row); $i++) {
- my $char = $row[$i];
- if ($i == 0 or $i == $#row) {
- push(@map, 0);
- } elsif ($char =~ /\s/) {
- push(@map, 0);
- } else {
- push(@map, 1);
- }
- }
- # (int(rand(0) * (max - min + 1))) + min
- my $max = grep(($_ == 1), @map);
- my $min = 1;
- my $map_pos = (int(rand(0) * ($max - $min + 1))) + $min;
- # god this is such a hack...
- # figure out which part of @map we mean
- my $count = 0;
- my $actual;
- for (my $i = 0; $i < scalar(@map); $i++) {
- my $map = $map[$i];
- if ($map == 1) {
- $count++;
- }
- if ($count == $map_pos) {
- $actual = $i;
- last;
- }
- }
- my ($head, $bulb, $foot);
- my $switch = 0;
- for (my $i = 0; $i < scalar(@row); $i++) {
- if ($i == $actual) {
- my $color = $bulbs[rand(@bulbs)];
- $bulb = do_color("*", $color);
- $switch++;
- } elsif ($switch == 0) {
- $head .= $row[$i];
- } elsif ($switch == 1) {
- $foot .= $row[$i];
- }
- }
- my $newline = do_color($head, $green) . $bulb . do_color($foot, $green);
- push(@output, $newline);
- }
- $text = join("\n", @output);
- return $text;
- }
- sub rotate {
- my $text = shift;
- return if (!defined $text);
- my @lines = split(/\r?\n/, $text);
- my @new;
- foreach my $line (reverse @lines) {
- my @cols = reverse split('', $line);
- for (my $i = 0; $i < @cols; $i++) {
- $new[$i] .= $cols[$i];
- }
- }
- $text = join("\n", reverse @new);
- return $text;
- }
- sub diagonal {
- my $text = shift;
- return if (!defined $text);
- my $new;
- for (my $i = 0; $i < length($text); $i++) {
- $new .= sprintf "%s%s\n", (" " x $i), substr($text, $i, 1);
- }
- return $new;
- }
- sub popeye {
- my $text = shift;
- return if (!defined $text);
- my $spacer = 0;
- my $new;
- foreach my $word (split(/\s+/, $text)) {
- $new .= (" " x $spacer) . $word . "\n";
- $spacer += length($word);
- }
- return $new;
- }
- sub sine {
- my $text = shift;
- return if (!defined $text);
- my $freq = settings_get_str("sine_frequency");
- my $height = settings_get_int("sine_height");
- my $bg = settings_get_str("sine_background");
- $bg ||= " ";
- return unless ($freq > 0);
- my @output;
- my $lineNO = 0;
- foreach my $line (split(/\n/, $text)) {
- my @chrs = split(//, $line);
- my $width = @chrs * $freq;
- my $plot = {};
- my $x = 0;
- foreach my $chr (@chrs) {
- my $y = int($height * sin($x)) + $height;
- $plot->{$x}->{$y} = $chr;
- $x += $freq;
- }
- for (my $y = 0; $y <= $height * 2; $y++) {
- for (my $x = 0; $x <= $width; $x += $freq) {
- if (exists $plot->{$x}->{$y}) {
- $output[$lineNO] .= $plot->{$x}->{$y};
- } else {
- $output[$lineNO] .= $bg;
- }
- }
- $lineNO++;
- }
- }
- my @cleaned;
- foreach my $line (@output) {
- next if $line =~ /^[$bg]+$/;
- $line =~ s/[$bg]+$//;
- push(@cleaned, $line);
- }
- $text = join("\n", @cleaned);
- return $text;
- }
- sub banner {
- my $text = shift;
- return if (!defined $text);
- my $style = shift;
- my @chrs = split(//, $text);
- my $iter = 0;
- my $output;
- foreach my $chr (@chrs) {
- $chr =~ s/[\r\n]/ /;
- my $banner = perlBanner($chr);
- #next if (!defined $banner); # remove if you don't want to die for unknowns
- while(0){ ##fix for getting it to work in xchat, need to fuck with styles
- if ($style eq "phrase") {
- foreach my $bchr (split(//, $banner)) {
- if ($bchr =~ s/#/$chr/) {
- $iter = 0 if ++$iter >= @chrs;
- }
- $output .= $bchr;
- }
- }
- elsif ($style eq "line") {
- foreach my $line (split(/\n/, $banner)) {
- if ($line =~ s/#/$chr/g) {
- $iter = 0 if ++$iter > (@chrs - 1);
- }
- $output .= "$line\n";
- }
- }
- elsif ($style eq "letter") {
- $banner =~ s/#/$chr/g;
- $output .= $banner;
- }
- elsif ($style =~ /char:(.)/) {
- my $chr = $1;
- $banner =~ s/#/$chr/g;
- $output .= $banner;
- }
- } $output = $banner; #remove if i get styles working
- }
- return $output;
- }
- ####################################
- # port of c banner utility to perl #
- ####################################
- # defaults/constants
- my $MAXMSG = 1024;
- my $DWIDTH = 132;
- my $NCHARS = 128;
- my $NBYTES = 9470; # This really ought to be generated from the array
- # Pointers into data_table for each ASCII char
- my @asc_ptr = (
- # 0 1 2 3 4 5 6 7 Octal :(
- 0, 0, 0, 0, 0, 0, 0, 0, # ^@ 000
- 0, 0, 0, 0, 0, 0, 0, 0, # ^H 010
- 0, 0, 0, 0, 0, 0, 0, 0, # ^P 020
- 0, 0, 0, 0, 0, 0, 0, 0, # ^X 030
- 1, 3, 50, 81, 104, 281, 483, 590, # 040
- 621, 685, 749, 851, 862, 893, 898, 921, # ( 050
- 1019, 1150, 1200, 1419, 1599, 1744, 1934, 2111, # 0 060
- 2235, 2445, 2622, 2659, 9271, 2708, 9371, 2715, # 8 070
- 2857, 3072, 3273, 3403, 3560, 3662, 3730, 3785, # @ 100
- 3965, 4000, 4015, 4115, 4281, 4314, 4432, 4548, # H 110
- 4709, 4790, 4999, 5188, 5397, 5448, 5576, 5710, # P 120
- 5892, 6106, 6257, 0, 0, 0, 0, 0, # X 130
- 50, 6503, 6642, 6733, 6837, 6930, 7073, 7157, # ` 140
- 7380, 7452, 7499, 7584, 7689, 7702, 7797, 7869, # h 150
- 7978, 8069, 8160, 8222, 8381, 8442, 8508, 8605, # p 160
- 8732, 8888, 9016, 0, 0, 0, 0, 0 # x 170
- );
- # Table of stuff to print. Format:
- # 128+n -> print current line n times.
- # 64+n -> this is last byte of char.
- # else, put m chars at position n (where m
- # is the next elt in array) and goto second
- # next element in array.
- # If you add new data, please be sane and add it to the end :<
- my @data_table = (
- # 0 1 2 3 4 5 6 7 8 9
- 129, 227, 130, 34, 6, 90, 19, 129, 32, 10, # 0
- 74, 40, 129, 31, 12, 64, 53, 129, 30, 14, # 10
- 54, 65, 129, 30, 14, 53, 67, 129, 30, 14, # 20
- 54, 65, 129, 31, 12, 64, 53, 129, 32, 10, # 30
- 74, 40, 129, 34, 6, 90, 19, 129, 194, 130, # 40
- 99, 9, 129, 97, 14, 129, 96, 18, 129, 95, # 50
- 22, 129, 95, 16, 117, 2, 129, 95, 14, 129, # 60
- 96, 11, 129, 97, 9, 129, 99, 6, 129, 194, # 70
- 129, 87, 4, 101, 4, 131, 82, 28, 131, 87, # 80
- 4, 101, 4, 133, 82, 28, 131, 87, 4, 101, # 90
- 4, 131, 193, 129, 39, 1, 84, 27, 129, 38, # 100
- 3, 81, 32, 129, 37, 5, 79, 35, 129, 36, # 110
- 5, 77, 38, 129, 35, 5, 76, 40, 129, 34, # 120
- 5, 75, 21, 103, 14, 129, 33, 5, 74, 19, # 130
- 107, 11, 129, 32, 5, 73, 17, 110, 9, 129, # 140
- 32, 4, 73, 16, 112, 7, 129, 31, 4, 72, # 150
- 15, 114, 6, 129, 31, 4, 72, 14, 115, 5, # 160
- 129, 30, 4, 71, 15, 116, 5, 129, 27, 97, # 170
- 131, 30, 4, 69, 14, 117, 4, 129, 30, 4, # 180
- 68, 15, 117, 4, 132, 30, 4, 68, 14, 117, # 190
- 4, 129, 27, 97, 131, 30, 5, 65, 15, 116, # 200
- 5, 129, 31, 4, 65, 14, 116, 4, 129, 31, # 210
- 6, 64, 15, 116, 4, 129, 32, 7, 62, 16, # 220
- 115, 4, 129, 32, 9, 61, 17, 114, 5, 129, # 230
- 33, 11, 58, 19, 113, 5, 129, 34, 14, 55, # 240
- 21, 112, 5, 129, 35, 40, 111, 5, 129, 36, # 250
- 38, 110, 5, 129, 37, 35, 109, 5, 129, 38, # 260
- 32, 110, 3, 129, 40, 27, 111, 1, 129, 193, # 270
- 129, 30, 4, 103, 9, 129, 30, 7, 100, 15, # 280
- 129, 30, 10, 99, 17, 129, 33, 10, 97, 6, # 290
- 112, 6, 129, 36, 10, 96, 5, 114, 5, 129, # 300
- 39, 10, 96, 4, 115, 4, 129, 42, 10, 95, # 310
- 4, 116, 4, 129, 45, 10, 95, 3, 117, 3, # 320
- 129, 48, 10, 95, 3, 117, 3, 129, 51, 10, # 330
- 95, 4, 116, 4, 129, 54, 10, 96, 4, 115, # 340
- 4, 129, 57, 10, 96, 5, 114, 5, 129, 60, # 350
- 10, 97, 6, 112, 6, 129, 63, 10, 99, 17, # 360
- 129, 66, 10, 100, 15, 129, 69, 10, 103, 9, # 370
- 129, 39, 9, 72, 10, 129, 36, 15, 75, 10, # 380
- 129, 35, 17, 78, 10, 129, 33, 6, 48, 6, # 390
- 81, 10, 129, 32, 5, 50, 5, 84, 10, 129, # 400
- 32, 4, 51, 4, 87, 10, 129, 31, 4, 52, # 410
- 4, 90, 10, 129, 31, 3, 53, 3, 93, 10, # 420
- 129, 31, 3, 53, 3, 96, 10, 129, 31, 4, # 430
- 52, 4, 99, 10, 129, 32, 4, 51, 4, 102, # 440
- 10, 129, 32, 5, 50, 5, 105, 10, 129, 33, # 450
- 6, 48, 6, 108, 10, 129, 35, 17, 111, 10, # 460
- 129, 36, 15, 114, 7, 129, 40, 9, 118, 4, # 470
- 129, 193, 129, 48, 18, 129, 43, 28, 129, 41, # 480
- 32, 129, 39, 36, 129, 37, 40, 129, 35, 44, # 490
- 129, 34, 46, 129, 33, 13, 68, 13, 129, 32, # 500
- 9, 73, 9, 129, 32, 7, 75, 7, 129, 31, # 510
- 6, 77, 6, 129, 31, 5, 78, 5, 129, 30, # 520
- 5, 79, 5, 129, 20, 74, 132, 30, 4, 80, # 530
- 4, 129, 31, 3, 79, 4, 129, 31, 4, 79, # 540
- 4, 129, 32, 3, 78, 4, 129, 32, 4, 76, # 550
- 6, 129, 33, 4, 74, 7, 129, 34, 4, 72, # 560
- 8, 129, 35, 5, 72, 7, 129, 37, 5, 73, # 570
- 4, 129, 39, 4, 74, 1, 129, 129, 193, 130, # 580
- 111, 6, 129, 109, 10, 129, 108, 12, 129, 107, # 590
- 14, 129, 97, 2, 105, 16, 129, 99, 22, 129, # 600
- 102, 18, 129, 105, 14, 129, 108, 9, 129, 194, # 610
- 130, 63, 25, 129, 57, 37, 129, 52, 47, 129, # 620
- 48, 55, 129, 44, 63, 129, 41, 69, 129, 38, # 630
- 75, 129, 36, 79, 129, 34, 83, 129, 33, 28, # 640
- 90, 28, 129, 32, 23, 96, 23, 129, 32, 17, # 650
- 102, 17, 129, 31, 13, 107, 13, 129, 30, 9, # 660
- 112, 9, 129, 30, 5, 116, 5, 129, 30, 1, # 670
- 120, 1, 129, 194, 130, 30, 1, 120, 1, 129, # 680
- 30, 5, 116, 5, 129, 30, 9, 112, 9, 129, # 690
- 31, 13, 107, 13, 129, 32, 17, 102, 17, 129, # 700
- 32, 23, 96, 23, 129, 33, 28, 90, 28, 129, # 710
- 34, 83, 129, 36, 79, 129, 38, 75, 129, 41, # 720
- 69, 129, 44, 63, 129, 48, 55, 129, 52, 47, # 730
- 129, 57, 37, 129, 63, 25, 129, 194, 129, 80, # 740
- 4, 130, 80, 4, 129, 68, 2, 80, 4, 94, # 750
- 2, 129, 66, 6, 80, 4, 92, 6, 129, 67, # 760
- 7, 80, 4, 90, 7, 129, 69, 7, 80, 4, # 770
- 88, 7, 129, 71, 6, 80, 4, 87, 6, 129, # 780
- 72, 20, 129, 74, 16, 129, 76, 12, 129, 62, # 790
- 40, 131, 76, 12, 129, 74, 16, 129, 72, 20, # 800
- 129, 71, 6, 80, 4, 87, 6, 129, 69, 7, # 810
- 80, 4, 88, 7, 129, 67, 7, 80, 4, 90, # 820
- 7, 129, 66, 6, 80, 4, 92, 6, 129, 68, # 830
- 2, 80, 4, 94, 2, 129, 80, 4, 130, 193, # 840
- 129, 60, 4, 139, 41, 42, 131, 60, 4, 139, # 850
- 193, 130, 34, 6, 129, 32, 10, 129, 31, 12, # 860
- 129, 30, 14, 129, 20, 2, 28, 16, 129, 22, # 870
- 22, 129, 24, 19, 129, 27, 15, 129, 31, 9, # 880
- 129, 194, 129, 60, 4, 152, 193, 130, 34, 6, # 890
- 129, 32, 10, 129, 31, 12, 129, 30, 14, 131, # 900
- 31, 12, 129, 32, 10, 129, 34, 6, 129, 194, # 910
- 129, 30, 4, 129, 30, 7, 129, 30, 10, 129, # 920
- 33, 10, 129, 36, 10, 129, 39, 10, 129, 42, # 930
- 10, 129, 45, 10, 129, 48, 10, 129, 51, 10, # 940
- 129, 54, 10, 129, 57, 10, 129, 60, 10, 129, # 950
- 63, 10, 129, 66, 10, 129, 69, 10, 129, 72, # 960
- 10, 129, 75, 10, 129, 78, 10, 129, 81, 10, # 970
- 129, 84, 10, 129, 87, 10, 129, 90, 10, 129, # 980
- 93, 10, 129, 96, 10, 129, 99, 10, 129, 102, # 990
- 10, 129, 105, 10, 129, 108, 10, 129, 111, 10, # 1000
- 129, 114, 7, 129, 117, 4, 129, 193, 129, 60, # 1010
- 31, 129, 53, 45, 129, 49, 53, 129, 46, 59, # 1020
- 129, 43, 65, 129, 41, 69, 129, 39, 73, 129, # 1030
- 37, 77, 129, 36, 79, 129, 35, 15, 101, 15, # 1040
- 129, 34, 11, 106, 11, 129, 33, 9, 109, 9, # 1050
- 129, 32, 7, 112, 7, 129, 31, 6, 114, 6, # 1060
- 129, 31, 5, 115, 5, 129, 30, 5, 116, 5, # 1070
- 129, 30, 4, 117, 4, 132, 30, 5, 116, 5, # 1080
- 129, 31, 5, 115, 5, 129, 31, 6, 114, 6, # 1090
- 129, 32, 7, 112, 7, 129, 33, 9, 109, 9, # 1100
- 129, 34, 11, 106, 11, 129, 35, 15, 101, 15, # 1110
- 129, 36, 79, 129, 37, 77, 129, 39, 73, 129, # 1120
- 41, 69, 129, 43, 65, 129, 46, 59, 129, 49, # 1130
- 53, 129, 53, 45, 129, 60, 31, 129, 193, 129, # 1140
- 30, 4, 129, 30, 4, 100, 1, 129, 30, 4, # 1150
- 100, 3, 129, 30, 4, 100, 5, 129, 30, 76, # 1160
- 129, 30, 78, 129, 30, 80, 129, 30, 82, 129, # 1170
- 30, 83, 129, 30, 85, 129, 30, 87, 129, 30, # 1180
- 89, 129, 30, 91, 129, 30, 4, 132, 193, 129, # 1190
- 30, 3, 129, 30, 7, 129, 30, 10, 112, 1, # 1200
- 129, 30, 13, 112, 2, 129, 30, 16, 112, 3, # 1210
- 129, 30, 18, 111, 5, 129, 30, 21, 111, 6, # 1220
- 129, 30, 23, 112, 6, 129, 30, 14, 47, 8, # 1230
- 113, 6, 129, 30, 14, 49, 8, 114, 5, 129, # 1240
- 30, 14, 51, 8, 115, 5, 129, 30, 14, 53, # 1250
- 8, 116, 4, 129, 30, 14, 55, 8, 116, 5, # 1260
- 129, 30, 14, 56, 9, 117, 4, 129, 30, 14, # 1270
- 57, 9, 117, 4, 129, 30, 14, 58, 10, 117, # 1280
- 4, 129, 30, 14, 59, 10, 117, 4, 129, 30, # 1290
- 14, 60, 11, 117, 4, 129, 30, 14, 61, 11, # 1300
- 116, 5, 129, 30, 14, 62, 11, 116, 5, 129, # 1310
- 30, 14, 63, 12, 115, 6, 129, 30, 14, 64, # 1320
- 13, 114, 7, 129, 30, 14, 65, 13, 113, 8, # 1330
- 129, 30, 14, 65, 15, 111, 9, 129, 30, 14, # 1340
- 66, 16, 109, 11, 129, 30, 14, 67, 17, 107, # 1350
- 12, 129, 30, 14, 68, 20, 103, 16, 129, 30, # 1360
- 14, 69, 49, 129, 30, 14, 70, 47, 129, 30, # 1370
- 14, 71, 45, 129, 30, 14, 73, 42, 129, 30, # 1380
- 15, 75, 38, 129, 33, 12, 77, 34, 129, 36, # 1390
- 10, 79, 30, 129, 40, 6, 82, 23, 129, 44, # 1400
- 3, 86, 15, 129, 47, 1, 129, 193, 129, 129, # 1410
- 38, 3, 129, 37, 5, 111, 1, 129, 36, 7, # 1420
- 111, 2, 129, 35, 9, 110, 5, 129, 34, 8, # 1430
- 110, 6, 129, 33, 7, 109, 8, 129, 32, 7, # 1440
- 110, 8, 129, 32, 6, 112, 7, 129, 31, 6, # 1450
- 113, 6, 129, 31, 5, 114, 6, 129, 30, 5, # 1460
- 115, 5, 129, 30, 5, 116, 4, 129, 30, 4, # 1470
- 117, 4, 131, 30, 4, 117, 4, 129, 30, 4, # 1480
- 79, 2, 117, 4, 129, 30, 5, 78, 4, 117, # 1490
- 4, 129, 30, 5, 77, 6, 116, 5, 129, 30, # 1500
- 6, 76, 8, 115, 6, 129, 30, 7, 75, 11, # 1510
- 114, 6, 129, 30, 8, 73, 15, 112, 8, 129, # 1520
- 31, 9, 71, 19, 110, 9, 129, 31, 11, 68, # 1530
- 26, 107, 12, 129, 32, 13, 65, 14, 82, 36, # 1540
- 129, 32, 16, 61, 17, 83, 34, 129, 33, 44, # 1550
- 84, 32, 129, 34, 42, 85, 30, 129, 35, 40, # 1560
- 87, 27, 129, 36, 38, 89, 23, 129, 38, 34, # 1570
- 92, 17, 129, 40, 30, 95, 11, 129, 42, 26, # 1580
- 129, 45, 20, 129, 49, 11, 129, 193, 129, 49, # 1590
- 1, 129, 49, 4, 129, 49, 6, 129, 49, 8, # 1600
- 129, 49, 10, 129, 49, 12, 129, 49, 14, 129, # 1610
- 49, 17, 129, 49, 19, 129, 49, 21, 129, 49, # 1620
- 23, 129, 49, 14, 65, 9, 129, 49, 14, 67, # 1630
- 9, 129, 49, 14, 69, 9, 129, 49, 14, 71, # 1640
- 10, 129, 49, 14, 74, 9, 129, 49, 14, 76, # 1650
- 9, 129, 49, 14, 78, 9, 129, 49, 14, 80, # 1660
- 9, 129, 49, 14, 82, 9, 129, 49, 14, 84, # 1670
- 9, 129, 30, 4, 49, 14, 86, 10, 129, 30, # 1680
- 4, 49, 14, 89, 9, 129, 30, 4, 49, 14, # 1690
- 91, 9, 129, 30, 4, 49, 14, 93, 9, 129, # 1700
- 30, 74, 129, 30, 76, 129, 30, 78, 129, 30, # 1710
- 81, 129, 30, 83, 129, 30, 85, 129, 30, 87, # 1720
- 129, 30, 89, 129, 30, 91, 129, 30, 4, 49, # 1730
- 14, 132, 193, 129, 37, 1, 129, 36, 3, 77, # 1740
- 3, 129, 35, 5, 78, 11, 129, 34, 7, 78, # 1750
- 21, 129, 33, 7, 79, 29, 129, 32, 7, 79, # 1760
- 38, 129, 32, 6, 80, 4, 92, 29, 129, 31, # 1770
- 6, 80, 5, 102, 19, 129, 31, 5, 80, 6, # 1780
- 107, 14, 129, 31, 4, 81, 5, 107, 14, 129, # 1790
- 30, 5, 81, 6, 107, 14, 129, 30, 4, 81, # 1800
- 6, 107, 14, 130, 30, 4, 81, 7, 107, 14, # 1810
- 129, 30, 4, 80, 8, 107, 14, 130, 30, 5, # 1820
- 80, 8, 107, 14, 129, 30, 5, 79, 9, 107, # 1830
- 14, 129, 31, 5, 79, 9, 107, 14, 129, 31, # 1840
- 6, 78, 10, 107, 14, 129, 32, 6, 76, 11, # 1850
- 107, 14, 129, 32, 8, 74, 13, 107, 14, 129, # 1860
- 33, 10, 71, 16, 107, 14, 129, 33, 15, 67, # 1870
- 19, 107, 14, 129, 34, 51, 107, 14, 129, 35, # 1880
- 49, 107, 14, 129, 36, 47, 107, 14, 129, 37, # 1890
- 45, 107, 14, 129, 39, 41, 107, 14, 129, 41, # 1900
- 37, 107, 14, 129, 44, 32, 107, 14, 129, 47, # 1910
- 25, 111, 10, 129, 51, 16, 115, 6, 129, 119, # 1920
- 2, 129, 193, 129, 56, 39, 129, 51, 49, 129, # 1930
- 47, 57, 129, 44, 63, 129, 42, 67, 129, 40, # 1940
- 71, 129, 38, 75, 129, 37, 77, 129, 35, 81, # 1950
- 129, 34, 16, 74, 5, 101, 16, 129, 33, 11, # 1960
- 76, 5, 107, 11, 129, 32, 9, 77, 5, 110, # 1970
- 9, 129, 32, 7, 79, 4, 112, 7, 129, 31, # 1980
- 6, 80, 4, 114, 6, 129, 31, 5, 81, 4, # 1990
- 115, 5, 129, 30, 5, 82, 4, 116, 5, 129, # 2000
- 30, 4, 82, 4, 116, 5, 129, 30, 4, 82, # 2010
- 5, 117, 4, 131, 30, 5, 82, 5, 117, 4, # 2020
- 129, 31, 5, 81, 6, 117, 4, 129, 31, 6, # 2030
- 80, 7, 117, 4, 129, 32, 7, 79, 8, 117, # 2040
- 4, 129, 32, 9, 77, 9, 116, 5, 129, 33, # 2050
- 11, 75, 11, 116, 4, 129, 34, 16, 69, 16, # 2060
- 115, 5, 129, 35, 49, 114, 5, 129, 37, 46, # 2070
- 113, 5, 129, 38, 44, 112, 6, 129, 40, 41, # 2080
- 112, 5, 129, 42, 37, 113, 3, 129, 44, 33, # 2090
- 114, 1, 129, 47, 27, 129, 51, 17, 129, 193, # 2100
- 129, 103, 2, 129, 103, 6, 129, 104, 9, 129, # 2110
- 105, 12, 129, 106, 15, 129, 107, 14, 135, 30, # 2120
- 10, 107, 14, 129, 30, 17, 107, 14, 129, 30, # 2130
- 25, 107, 14, 129, 30, 31, 107, 14, 129, 30, # 2140
- 37, 107, 14, 129, 30, 42, 107, 14, 129, 30, # 2150
- 46, 107, 14, 129, 30, 50, 107, 14, 129, 30, # 2160
- 54, 107, 14, 129, 30, 58, 107, 14, 129, 59, # 2170
- 32, 107, 14, 129, 64, 30, 107, 14, 129, 74, # 2180
- 23, 107, 14, 129, 81, 18, 107, 14, 129, 86, # 2190
- 16, 107, 14, 129, 91, 14, 107, 14, 129, 96, # 2200
- 25, 129, 100, 21, 129, 104, 17, 129, 107, 14, # 2210
- 129, 111, 10, 129, 114, 7, 129, 117, 4, 129, # 2220
- 120, 1, 129, 193, 129, 48, 13, 129, 44, 21, # 2230
- 129, 42, 26, 129, 40, 30, 92, 12, 129, 38, # 2240
- 34, 88, 20, 129, 36, 37, 86, 25, 129, 35, # 2250
- 39, 84, 29, 129, 34, 13, 63, 12, 82, 33, # 2260
- 129, 33, 11, 67, 9, 80, 36, 129, 32, 9, # 2270
- 70, 7, 79, 38, 129, 31, 8, 72, 46, 129, # 2280
- 30, 7, 74, 22, 108, 11, 129, 30, 6, 75, # 2290
- 19, 111, 9, 129, 30, 5, 75, 17, 113, 7, # 2300
- 129, 30, 5, 74, 16, 114, 6, 129, 30, 4, # 2310
- 73, 16, 115, 6, 129, 30, 4, 72, 16, 116, # 2320
- 5, 129, 30, 4, 72, 15, 117, 4, 129, 30, # 2330
- 4, 71, 16, 117, 4, 129, 30, 5, 70, 16, # 2340
- 117, 4, 129, 30, 5, 70, 15, 117, 4, 129, # 2350
- 30, 6, 69, 15, 116, 5, 129, 30, 7, 68, # 2360
- 17, 115, 5, 129, 30, 9, 67, 19, 114, 6, # 2370
- 129, 30, 10, 65, 22, 113, 6, 129, 31, 12, # 2380
- 63, 27, 110, 9, 129, 32, 14, 60, 21, 84, # 2390
- 9, 106, 12, 129, 33, 47, 85, 32, 129, 34, # 2400
- 45, 86, 30, 129, 35, 43, 88, 26, 129, 36, # 2410
- 40, 90, 22, 129, 38, 36, 93, 17, 129, 40, # 2420
- 32, 96, 10, 129, 42, 28, 129, 44, 23, 129, # 2430
- 48, 15, 129, 193, 129, 83, 17, 129, 77, 27, # 2440
- 129, 36, 1, 74, 33, 129, 35, 3, 72, 37, # 2450
- 129, 34, 5, 70, 41, 129, 33, 6, 69, 44, # 2460
- 129, 33, 5, 68, 46, 129, 32, 5, 67, 49, # 2470
- 129, 31, 5, 66, 17, 101, 16, 129, 31, 5, # 2480
- 66, 11, 108, 10, 129, 30, 4, 65, 9, 110, # 2490
- 9, 129, 30, 4, 64, 8, 112, 7, 129, 30, # 2500
- 4, 64, 7, 114, 6, 129, 30, 4, 64, 6, # 2510
- 115, 5, 129, 30, 4, 64, 5, 116, 5, 129, # 2520
- 30, 4, 64, 5, 117, 4, 131, 30, 4, 65, # 2530
- 4, 117, 4, 129, 30, 5, 65, 4, 116, 5, # 2540
- 129, 31, 5, 66, 4, 115, 5, 129, 31, 6, # 2550
- 67, 4, 114, 6, 129, 32, 7, 68, 4, 112, # 2560
- 7, 129, 32, 9, 69, 5, 110, 9, 129, 33, # 2570
- 11, 70, 5, 107, 11, 129, 34, 16, 72, 5, # 2580
- 101, 16, 129, 35, 81, 129, 37, 77, 129, 38, # 2590
- 75, 129, 40, 71, 129, 42, 67, 129, 44, 63, # 2600
- 129, 47, 57, 129, 51, 49, 129, 56, 39, 129, # 2610
- 193, 130, 34, 6, 74, 6, 129, 32, 10, 72, # 2620
- 10, 129, 31, 12, 71, 12, 129, 30, 14, 70, # 2630
- 14, 131, 31, 12, 71, 12, 129, 32, 10, 72, # 2640
- 10, 129, 34, 6, 74, 6, 129, 194, 130, 34, # 2650
- 6, 74, 6, 129, 32, 10, 72, 10, 129, 31, # 2660
- 12, 71, 12, 129, 30, 14, 70, 14, 129, 20, # 2670
- 2, 28, 16, 70, 14, 129, 22, 22, 70, 14, # 2680
- 129, 24, 19, 71, 12, 129, 27, 15, 72, 10, # 2690
- 129, 31, 9, 74, 6, 129, 194, 129, 53, 4, # 2700
- 63, 4, 152, 193, 130, 99, 7, 129, 97, 13, # 2710
- 129, 96, 16, 129, 96, 18, 129, 96, 19, 129, # 2720
- 97, 19, 129, 99, 6, 110, 7, 129, 112, 6, # 2730
- 129, 114, 5, 129, 34, 6, 57, 5, 115, 4, # 2740
- 129, 32, 10, 54, 12, 116, 4, 129, 31, 12, # 2750
- 53, 16, 117, 3, 129, 30, 14, 52, 20, 117, # 2760
- 4, 129, 30, 14, 52, 23, 117, 4, 129, 30, # 2770
- 14, 52, 25, 117, 4, 129, 31, 12, 52, 27, # 2780
- 117, 4, 129, 32, 10, 53, 10, 70, 11, 116, # 2790
- 5, 129, 34, 6, 55, 5, 73, 10, 115, 6, # 2800
- 129, 74, 11, 114, 7, 129, 75, 12, 112, 9, # 2810
- 129, 76, 13, 110, 10, 129, 77, 16, 106, 14, # 2820
- 129, 78, 41, 129, 80, 38, 129, 81, 36, 129, # 2830
- 82, 34, 129, 84, 30, 129, 86, 26, 129, 88, # 2840
- 22, 129, 92, 14, 129, 194, 129, 55, 15, 129, # 2850
- 50, 25, 129, 47, 32, 129, 45, 13, 70, 12, # 2860
- 129, 43, 9, 76, 10, 129, 42, 6, 79, 8, # 2870
- 129, 41, 5, 81, 7, 129, 40, 4, 84, 6, # 2880
- 129, 39, 4, 59, 12, 85, 6, 129, 38, 4, # 2890
- 55, 19, 87, 5, 129, 37, 4, 53, 23, 88, # 2900
- 4, 129, 36, 4, 51, 8, 71, 6, 89, 4, # 2910
- 129, 36, 4, 51, 6, 73, 4, 89, 4, 129, # 2920
- 36, 4, 50, 6, 74, 4, 90, 3, 129, 35, # 2930
- 4, 50, 5, 75, 3, 90, 4, 129, 35, 4, # 2940
- 50, 4, 75, 4, 90, 4, 131, 35, 4, 50, # 2950
- 5, 75, 4, 90, 4, 129, 36, 4, 51, 5, # 2960
- 75, 4, 90, 4, 129, 36, 4, 51, 6, 75, # 2970
- 4, 90, 4, 129, 36, 4, 53, 26, 90, 4, # 2980
- 129, 37, 4, 54, 25, 90, 4, 129, 37, 4, # 2990
- 52, 27, 90, 3, 129, 38, 4, 52, 4, 89, # 3000
- 4, 129, 39, 4, 51, 4, 88, 4, 129, 40, # 3010
- 4, 50, 4, 87, 5, 129, 41, 4, 50, 4, # 3020
- 86, 5, 129, 42, 4, 50, 4, 85, 5, 129, # 3030
- 43, 3, 50, 4, 83, 6, 129, 44, 2, 51, # 3040
- 5, 80, 7, 129, 46, 1, 52, 6, 76, 9, # 3050
- 129, 54, 28, 129, 56, 23, 129, 60, 16, 129, # 3060
- 193, 129, 30, 4, 132, 30, 5, 129, 30, 8, # 3070
- 129, 30, 12, 129, 30, 16, 129, 30, 4, 37, # 3080
- 12, 129, 30, 4, 41, 12, 129, 30, 4, 44, # 3090
- 13, 129, 30, 4, 48, 13, 129, 52, 13, 129, # 3100
- 56, 12, 129, 58, 14, 129, 58, 4, 64, 12, # 3110
- 129, 58, 4, 68, 12, 129, 58, 4, 72, 12, # 3120
- 129, 58, 4, 75, 13, 129, 58, 4, 79, 13, # 3130
- 129, 58, 4, 83, 13, 129, 58, 4, 87, 13, # 3140
- 129, 58, 4, 91, 12, 129, 58, 4, 95, 12, # 3150
- 129, 58, 4, 96, 15, 129, 58, 4, 93, 22, # 3160
- 129, 58, 4, 89, 30, 129, 58, 4, 85, 36, # 3170
- 129, 58, 4, 81, 38, 129, 58, 4, 77, 38, # 3180
- 129, 58, 4, 73, 38, 129, 58, 4, 70, 37, # 3190
- 129, 58, 4, 66, 37, 129, 58, 41, 129, 58, # 3200
- 37, 129, 54, 38, 129, 30, 4, 50, 38, 129, # 3210
- 30, 4, 46, 38, 129, 30, 4, 42, 38, 129, # 3220
- 30, 4, 38, 39, 129, 30, 43, 129, 30, 39, # 3230
- 129, 30, 35, 129, 30, 31, 129, 30, 27, 129, # 3240
- 30, 24, 129, 30, 20, 129, 30, 16, 129, 30, # 3250
- 12, 129, 30, 8, 129, 30, 5, 129, 30, 4, # 3260
- 132, 193, 129, 30, 4, 117, 4, 132, 30, 91, # 3270
- 137, 30, 4, 80, 4, 117, 4, 138, 30, 4, # 3280
- 80, 5, 116, 5, 129, 30, 5, 79, 6, 116, # 3290
- 5, 130, 30, 6, 78, 8, 115, 6, 129, 31, # 3300
- 6, 77, 9, 115, 6, 129, 31, 7, 76, 11, # 3310
- 114, 6, 129, 31, 8, 75, 14, 112, 8, 129, # 3320
- 32, 8, 74, 16, 111, 9, 129, 32, 9, 73, # 3330
- 19, 109, 10, 129, 33, 10, 71, 24, 106, 13, # 3340
- 129, 33, 13, 68, 12, 83, 35, 129, 34, 16, # 3350
- 64, 15, 84, 33, 129, 35, 43, 85, 31, 129, # 3360
- 36, 41, 86, 29, 129, 37, 39, 88, 25, 129, # 3370
- 38, 37, 90, 21, 129, 40, 33, 93, 15, 129, # 3380
- 42, 29, 96, 9, 129, 45, 24, 129, 49, 16, # 3390
- 129, 193, 129, 63, 25, 129, 57, 37, 129, 53, # 3400
- 45, 129, 50, 51, 129, 47, 57, 129, 45, 61, # 3410
- 129, 43, 65, 129, 41, 69, 129, 39, 73, 129, # 3420
- 38, 25, 92, 21, 129, 36, 21, 97, 18, 129, # 3430
- 35, 18, 102, 14, 129, 34, 16, 106, 11, 129, # 3440
- 33, 14, 108, 10, 129, 32, 12, 111, 8, 129, # 3450
- 32, 10, 113, 6, 129, 31, 10, 114, 6, 129, # 3460
- 31, 8, 115, 5, 129, 30, 8, 116, 5, 129, # 3470
- 30, 7, 116, 5, 129, 30, 6, 117, 4, 130, # 3480
- 30, 5, 117, 4, 131, 31, 4, 116, 5, 129, # 3490
- 32, 4, 116, 4, 129, 32, 5, 115, 5, 129, # 3500
- 33, 4, 114, 5, 129, 34, 4, 112, 6, 129, # 3510
- 35, 4, 110, 7, 129, 37, 4, 107, 9, 129, # 3520
- 39, 4, 103, 12, 129, 41, 4, 103, 18, 129, # 3530
- 43, 4, 103, 18, 129, 45, 5, 103, 18, 129, # 3540
- 48, 5, 103, 18, 129, 51, 1, 129, 193, 129, # 3550
- 30, 4, 117, 4, 132, 30, 91, 137, 30, 4, # 3560
- 117, 4, 135, 30, 5, 116, 5, 130, 30, 6, # 3570
- 115, 6, 130, 31, 6, 114, 6, 129, 31, 7, # 3580
- 113, 7, 129, 32, 7, 112, 7, 129, 32, 8, # 3590
- 111, 8, 129, 33, 9, 109, 9, 129, 33, 12, # 3600
- 106, 12, 129, 34, 13, 104, 13, 129, 35, 15, # 3610
- 101, 15, 129, 36, 19, 96, 19, 129, 37, 24, # 3620
- 90, 24, 129, 39, 73, 129, 40, 71, 129, 42, # 3630
- 67, 129, 44, 63, 129, 46, 59, 129, 49, 53, # 3640
- 129, 52, 47, 129, 56, 39, 129, 61, 29, 129, # 3650
- 193, 129, 30, 4, 117, 4, 132, 30, 91, 137, # 3660
- 30, 4, 80, 4, 117, 4, 140, 30, 4, 79, # 3670
- 6, 117, 4, 129, 30, 4, 77, 10, 117, 4, # 3680
- 129, 30, 4, 73, 18, 117, 4, 132, 30, 4, # 3690
- 117, 4, 130, 30, 5, 116, 5, 130, 30, 7, # 3700
- 114, 7, 129, 30, 8, 113, 8, 129, 30, 11, # 3710
- 110, 11, 129, 30, 18, 103, 18, 132, 193, 129, # 3720
- 30, 4, 117, 4, 132, 30, 91, 137, 30, 4, # 3730
- 80, 4, 117, 4, 132, 80, 4, 117, 4, 136, # 3740
- 79, 6, 117, 4, 129, 77, 10, 117, 4, 129, # 3750
- 73, 18, 117, 4, 132, 117, 4, 130, 116, 5, # 3760
- 130, 114, 7, 129, 113, 8, 129, 110, 11, 129, # 3770
- 103, 18, 132, 193, 129, 63, 25, 129, 57, 37, # 3780
- 129, 53, 45, 129, 50, 51, 129, 47, 57, 129, # 3790
- 45, 61, 129, 43, 65, 129, 41, 69, 129, 39, # 3800
- 73, 129, 38, 25, 92, 21, 129, 36, 21, 97, # 3810
- 18, 129, 35, 18, 102, 14, 129, 34, 16, 106, # 3820
- 11, 129, 33, 14, 108, 10, 129, 32, 12, 111, # 3830
- 8, 129, 32, 10, 113, 6, 129, 31, 10, 114, # 3840
- 6, 129, 31, 8, 115, 5, 129, 30, 8, 116, # 3850
- 5, 129, 30, 7, 116, 5, 129, 30, 6, 117, # 3860
- 4, 130, 30, 5, 117, 4, 131, 30, 5, 75, # 3870
- 4, 116, 5, 129, 31, 5, 75, 4, 116, 4, # 3880
- 129, 31, 6, 75, 4, 115, 5, 129, 32, 7, # 3890
- 75, 4, 114, 5, 129, 32, 9, 75, 4, 112, # 3900
- 6, 129, 33, 11, 75, 4, 110, 7, 129, 34, # 3910
- 15, 75, 4, 107, 9, 129, 35, 44, 103, 12, # 3920
- 129, 36, 43, 103, 18, 129, 38, 41, 103, 18, # 3930
- 129, 39, 40, 103, 18, 129, 41, 38, 103, 18, # 3940
- 129, 44, 35, 129, 48, 31, 129, 52, 27, 129, # 3950
- 61, 18, 129, 193, 129, 30, 4, 117, 4, 132, # 3960
- 30, 91, 137, 30, 4, 80, 4, 117, 4, 132, # 3970
- 80, 4, 140, 30, 4, 80, 4, 117, 4, 132, # 3980
- 30, 91, 137, 30, 4, 117, 4, 132, 193, 129, # 3990
- 30, 4, 117, 4, 132, 30, 91, 137, 30, 4, # 4000
- 117, 4, 132, 193, 129, 44, 7, 129, 40, 13, # 4010
- 129, 37, 17, 129, 35, 20, 129, 34, 22, 129, # 4020
- 33, 23, 129, 32, 24, 129, 32, 23, 129, 31, # 4030
- 6, 41, 13, 129, 31, 5, 42, 11, 129, 30, # 4040
- 5, 44, 7, 129, 30, 4, 132, 30, 5, 130, # 4050
- 31, 5, 129, 31, 6, 117, 4, 129, 31, 8, # 4060
- 117, 4, 129, 32, 9, 117, 4, 129, 33, 11, # 4070
- 117, 4, 129, 34, 87, 129, 35, 86, 129, 36, # 4080
- 85, 129, 37, 84, 129, 38, 83, 129, 40, 81, # 4090
- 129, 42, 79, 129, 45, 76, 129, 50, 71, 129, # 4100
- 117, 4, 132, 193, 129, 30, 4, 117, 4, 132, # 4110
- 30, 91, 137, 30, 4, 76, 8, 117, 4, 129, # 4120
- 30, 4, 73, 13, 117, 4, 129, 30, 4, 70, # 4130
- 18, 117, 4, 129, 30, 4, 67, 23, 117, 4, # 4140
- 129, 65, 26, 129, 62, 31, 129, 59, 35, 129, # 4150
- 56, 29, 89, 7, 129, 53, 29, 91, 7, 129, # 4160
- 50, 29, 93, 7, 129, 47, 29, 95, 6, 129, # 4170
- 30, 4, 45, 29, 96, 7, 129, 30, 4, 42, # 4180
- 29, 98, 7, 129, 30, 4, 39, 30, 100, 6, # 4190
- 129, 30, 4, 36, 30, 101, 7, 129, 30, 33, # 4200
- 103, 7, 117, 4, 129, 30, 30, 105, 6, 117, # 4210
- 4, 129, 30, 27, 106, 7, 117, 4, 129, 30, # 4220
- 25, 108, 7, 117, 4, 129, 30, 22, 110, 11, # 4230
- 129, 30, 19, 111, 10, 129, 30, 16, 113, 8, # 4240
- 129, 30, 13, 115, 6, 129, 30, 11, 116, 5, # 4250
- 129, 30, 8, 117, 4, 129, 30, 5, 117, 4, # 4260
- 129, 30, 4, 117, 4, 130, 30, 4, 130, 193, # 4270
- 129, 30, 4, 117, 4, 132, 30, 91, 137, 30, # 4280
- 4, 117, 4, 132, 30, 4, 144, 30, 5, 130, # 4290
- 30, 7, 129, 30, 8, 129, 30, 11, 129, 30, # 4300
- 18, 132, 193, 129, 30, 4, 117, 4, 132, 30, # 4310
- 91, 132, 30, 4, 103, 18, 129, 30, 4, 97, # 4320
- 24, 129, 30, 4, 92, 29, 129, 30, 4, 87, # 4330
- 34, 129, 81, 40, 129, 76, 45, 129, 70, 49, # 4340
- 129, 65, 49, 129, 60, 49, 129, 55, 49, 129, # 4350
- 50, 48, 129, 44, 49, 129, 39, 48, 129, 33, # 4360
- 49, 129, 30, 47, 129, 34, 37, 129, 40, 26, # 4370
- 129, 46, 19, 129, 52, 19, 129, 58, 19, 129, # 4380
- 64, 19, 129, 70, 19, 129, 76, 19, 129, 82, # 4390
- 19, 129, 30, 4, 88, 18, 129, 30, 4, 94, # 4400
- 18, 129, 30, 4, 100, 18, 129, 30, 4, 106, # 4410
- 15, 129, 30, 91, 137, 30, 4, 117, 4, 132, # 4420
- 193, 129, 30, 4, 117, 4, 132, 30, 91, 132, # 4430
- 30, 4, 107, 14, 129, 30, 4, 104, 17, 129, # 4440
- 30, 4, 101, 20, 129, 30, 4, 99, 22, 129, # 4450
- 96, 25, 129, 93, 28, 129, 91, 28, 129, 88, # 4460
- 29, 129, 85, 29, 129, 82, 29, 129, 79, 29, # 4470
- 129, 76, 29, 129, 74, 29, 129, 71, 29, 129, # 4480
- 68, 29, 129, 65, 29, 129, 62, 29, 129, 60, # 4490
- 29, 129, 57, 29, 129, 54, 29, 129, 51, 29, # 4500
- 129, 49, 28, 129, 46, 29, 129, 43, 29, 129, # 4510
- 40, 29, 117, 4, 129, 37, 29, 117, 4, 129, # 4520
- 35, 29, 117, 4, 129, 32, 29, 117, 4, 129, # 4530
- 30, 91, 132, 117, 4, 132, 193, 129, 63, 25, # 4540
- 129, 57, 37, 129, 53, 45, 129, 50, 51, 129, # 4550
- 47, 57, 129, 45, 61, 129, 43, 65, 129, 41, # 4560
- 69, 129, 39, 73, 129, 38, 21, 92, 21, 129, # 4570
- 36, 18, 97, 18, 129, 35, 14, 102, 14, 129, # 4580
- 34, 11, 106, 11, 129, 33, 10, 108, 10, 129, # 4590
- 32, 8, 111, 8, 129, 32, 6, 113, 6, 129, # 4600
- 31, 6, 114, 6, 129, 31, 5, 115, 5, 129, # 4610
- 30, 5, 116, 5, 130, 30, 4, 117, 4, 132, # 4620
- 30, 5, 116, 5, 130, 31, 5, 115, 5, 129, # 4630
- 31, 6, 114, 6, 129, 32, 6, 113, 6, 129, # 4640
- 32, 8, 111, 8, 129, 33, 10, 108, 10, 129, # 4650
- 34, 11, 106, 11, 129, 35, 14, 102, 14, 129, # 4660
- 36, 18, 97, 18, 129, 38, 21, 92, 21, 129, # 4670
- 39, 73, 129, 41, 69, 129, 43, 65, 129, 45, # 4680
- 61, 129, 47, 57, 129, 50, 51, 129, 53, 45, # 4690
- 129, 57, 37, 129, 63, 25, 129, 193, 129, 30, # 4700
- 4, 117, 4, 132, 30, 91, 137, 30, 4, 80, # 4710
- 4, 117, 4, 132, 80, 4, 117, 4, 134, 80, # 4720
- 5, 116, 5, 131, 80, 6, 115, 6, 130, 81, # 4730
- 6, 114, 6, 129, 81, 8, 112, 8, 129, 81, # 4740
- 9, 111, 9, 129, 82, 10, 109, 10, 129, 82, # 4750
- 13, 106, 13, 129, 83, 35, 129, 84, 33, 129, # 4760
- 85, 31, 129, 86, 29, 129, 88, 25, 129, 90, # 4770
- 21, 129, 93, 15, 129, 96, 9, 129, 193, 129, # 4780
- 63, 25, 129, 57, 37, 129, 53, 45, 129, 50, # 4790
- 51, 129, 47, 57, 129, 45, 61, 129, 43, 65, # 4800
- 129, 41, 69, 129, 39, 73, 129, 38, 21, 92, # 4810
- 21, 129, 36, 18, 97, 18, 129, 35, 14, 102, # 4820
- 14, 129, 34, 11, 106, 11, 129, 33, 10, 108, # 4830
- 10, 129, 32, 8, 111, 8, 129, 32, 6, 113, # 4840
- 6, 129, 31, 6, 114, 6, 129, 31, 5, 115, # 4850
- 5, 129, 30, 5, 116, 5, 130, 30, 4, 39, # 4860
- 2, 117, 4, 129, 30, 4, 40, 4, 117, 4, # 4870
- 129, 30, 4, 41, 5, 117, 4, 129, 30, 4, # 4880
- 41, 6, 117, 4, 129, 30, 5, 40, 8, 116, # 4890
- 5, 129, 30, 5, 39, 10, 116, 5, 129, 31, # 4900
- 5, 38, 11, 115, 5, 129, 31, 18, 114, 6, # 4910
- 129, 32, 17, 113, 6, 129, 32, 16, 111, 8, # 4920
- 129, 33, 15, 108, 10, 129, 33, 14, 106, 11, # 4930
- 129, 32, 17, 102, 14, 129, 31, 23, 97, 18, # 4940
- 129, 31, 28, 92, 21, 129, 30, 82, 129, 30, # 4950
- 80, 129, 30, 11, 43, 65, 129, 30, 10, 45, # 4960
- 61, 129, 31, 8, 47, 57, 129, 32, 6, 50, # 4970
- 51, 129, 33, 5, 53, 45, 129, 35, 4, 57, # 4980
- 37, 129, 38, 2, 63, 25, 129, 193, 129, 30, # 4990
- 4, 117, 4, 132, 30, 91, 137, 30, 4, 76, # 5000
- 8, 117, 4, 129, 30, 4, 73, 11, 117, 4, # 5010
- 129, 30, 4, 70, 14, 117, 4, 129, 30, 4, # 5020
- 67, 17, 117, 4, 129, 65, 19, 117, 4, 129, # 5030
- 62, 22, 117, 4, 129, 59, 25, 117, 4, 129, # 5040
- 56, 28, 117, 4, 129, 53, 31, 117, 4, 129, # 5050
- 50, 34, 117, 4, 129, 47, 29, 80, 5, 116, # 5060
- 5, 129, 30, 4, 45, 29, 80, 5, 116, 5, # 5070
- 129, 30, 4, 42, 29, 80, 5, 116, 5, 129, # 5080
- 30, 4, 39, 30, 80, 6, 115, 6, 129, 30, # 5090
- 4, 36, 30, 80, 6, 115, 6, 129, 30, 33, # 5100
- 81, 6, 114, 6, 129, 30, 30, 81, 8, 112, # 5110
- 8, 129, 30, 27, 81, 9, 111, 9, 129, 30, # 5120
- 25, 82, 10, 109, 10, 129, 30, 22, 82, 13, # 5130
- 106, 13, 129, 30, 19, 83, 35, 129, 30, 16, # 5140
- 84, 33, 129, 30, 13, 85, 31, 129, 30, 11, # 5150
- 86, 29, 129, 30, 8, 88, 25, 129, 30, 5, # 5160
- 90, 21, 129, 30, 4, 93, 15, 129, 30, 4, # 5170
- 96, 9, 129, 30, 4, 130, 193, 129, 30, 18, # 5180
- 130, 30, 18, 89, 15, 129, 30, 18, 85, 23, # 5190
- 129, 34, 11, 83, 27, 129, 34, 9, 81, 31, # 5200
- 129, 33, 8, 79, 35, 129, 33, 6, 78, 16, # 5210
- 106, 9, 129, 32, 6, 77, 15, 109, 7, 129, # 5220
- 32, 5, 76, 14, 111, 6, 129, 31, 5, 75, # 5230
- 14, 113, 5, 129, 31, 4, 74, 15, 114, 5, # 5240
- 129, 31, 4, 74, 14, 115, 4, 129, 30, 4, # 5250
- 73, 15, 116, 4, 129, 30, 4, 73, 14, 116, # 5260
- 4, 129, 30, 4, 73, 14, 117, 4, 129, 30, # 5270
- 4, 72, 15, 117, 4, 130, 30, 4, 71, 15, # 5280
- 117, 4, 130, 30, 4, 70, 15, 117, 4, 129, # 5290
- 30, 5, 70, 15, 117, 4, 129, 30, 5, 69, # 5300
- 15, 116, 5, 129, 30, 6, 68, 16, 115, 5, # 5310
- 129, 31, 6, 67, 16, 114, 6, 129, 31, 7, # 5320
- 66, 17, 113, 6, 129, 32, 7, 64, 18, 111, # 5330
- 8, 129, 32, 8, 62, 19, 109, 9, 129, 33, # 5340
- 9, 60, 20, 107, 10, 129, 34, 11, 57, 22, # 5350
- 103, 13, 129, 35, 43, 103, 18, 129, 36, 41, # 5360
- 103, 18, 129, 38, 38, 103, 18, 129, 39, 35, # 5370
- 103, 18, 129, 41, 31, 129, 43, 27, 129, 46, # 5380
- 22, 129, 49, 14, 129, 193, 129, 103, 18, 132, # 5390
- 110, 11, 129, 113, 8, 129, 114, 7, 129, 116, # 5400
- 5, 130, 117, 4, 132, 30, 4, 117, 4, 132, # 5410
- 30, 91, 137, 30, 4, 117, 4, 132, 117, 4, # 5420
- 132, 116, 5, 130, 114, 7, 129, 113, 8, 129, # 5430
- 110, 11, 129, 103, 18, 132, 193, 129, 117, 4, # 5440
- 132, 56, 65, 129, 50, 71, 129, 46, 75, 129, # 5450
- 44, 77, 129, 42, 79, 129, 40, 81, 129, 38, # 5460
- 83, 129, 36, 85, 129, 35, 86, 129, 34, 20, # 5470
- 117, 4, 129, 33, 17, 117, 4, 129, 32, 15, # 5480
- 117, 4, 129, 32, 13, 117, 4, 129, 31, 12, # 5490
- 129, 31, 10, 129, 31, 9, 129, 30, 9, 129, # 5500
- 30, 8, 130, 30, 7, 132, 31, 6, 130, 31, # 5510
- 7, 129, 32, 6, 129, 32, 7, 129, 33, 7, # 5520
- 129, 34, 7, 129, 35, 8, 129, 36, 9, 117, # 5530
- 4, 129, 38, 9, 117, 4, 129, 40, 10, 117, # 5540
- 4, 129, 42, 12, 117, 4, 129, 44, 77, 129, # 5550
- 46, 75, 129, 50, 71, 129, 56, 43, 100, 21, # 5560
- 129, 117, 4, 132, 193, 129, 117, 4, 132, 115, # 5570
- 6, 129, 110, 11, 129, 105, 16, 129, 101, 20, # 5580
- 129, 96, 25, 129, 92, 29, 129, 87, 34, 129, # 5590
- 83, 38, 129, 78, 43, 129, 74, 47, 129, 70, # 5600
- 42, 117, 4, 129, 65, 42, 117, 4, 129, 60, # 5610
- 43, 117, 4, 129, 56, 42, 129, 51, 42, 129, # 5620
- 46, 43, 129, 42, 43, 129, 37, 44, 129, 33, # 5630
- 43, 129, 30, 42, 129, 33, 34, 129, 38, 25, # 5640
- 129, 42, 16, 129, 47, 15, 129, 52, 15, 129, # 5650
- 57, 15, 129, 61, 16, 129, 66, 16, 129, 71, # 5660
- 16, 129, 76, 16, 129, 80, 16, 129, 85, 16, # 5670
- 117, 4, 129, 90, 16, 117, 4, 129, 95, 16, # 5680
- 117, 4, 129, 100, 21, 129, 105, 16, 129, 110, # 5690
- 11, 129, 114, 7, 129, 117, 4, 132, 193, 129, # 5700
- 117, 4, 132, 115, 6, 129, 110, 11, 129, 105, # 5710
- 16, 129, 101, 20, 129, 96, 25, 129, 92, 29, # 5720
- 129, 87, 34, 129, 83, 38, 129, 78, 43, 129, # 5730
- 74, 47, 129, 70, 42, 117, 4, 129, 65, 42, # 5740
- 117, 4, 129, 60, 43, 117, 4, 129, 56, 42, # 5750
- 129, 51, 42, 129, 46, 43, 129, 42, 43, 129, # 5760
- 37, 44, 129, 33, 43, 129, 30, 42, 129, 33, # 5770
- 34, 129, 38, 25, 129, 42, 16, 129, 47, 15, # 5780
- 129, 52, 15, 129, 57, 15, 129, 61, 16, 129, # 5790
- 65, 17, 129, 60, 27, 129, 56, 36, 129, 51, # 5800
- 42, 129, 46, 43, 129, 42, 43, 129, 37, 44, # 5810
- 129, 33, 43, 129, 30, 42, 129, 33, 34, 129, # 5820
- 38, 25, 129, 42, 16, 129, 47, 15, 129, 52, # 5830
- 15, 129, 57, 15, 129, 61, 16, 129, 66, 16, # 5840
- 129, 71, 16, 129, 76, 16, 129, 80, 16, 129, # 5850
- 85, 16, 117, 4, 129, 90, 16, 117, 4, 129, # 5860
- 95, 16, 117, 4, 129, 100, 21, 129, 105, 16, # 5870
- 129, 110, 11, 129, 114, 7, 129, 117, 4, 132, # 5880
- 193, 129, 30, 4, 117, 4, 132, 30, 4, 115, # 5890
- 6, 129, 30, 4, 112, 9, 129, 30, 6, 109, # 5900
- 12, 129, 30, 9, 106, 15, 129, 30, 11, 103, # 5910
- 18, 129, 30, 14, 100, 21, 129, 30, 4, 38, # 5920
- 9, 98, 23, 129, 30, 4, 40, 10, 95, 26, # 5930
- 129, 30, 4, 43, 9, 92, 29, 129, 46, 9, # 5940
- 89, 32, 129, 49, 8, 86, 28, 117, 4, 129, # 5950
- 51, 9, 83, 28, 117, 4, 129, 54, 9, 80, # 5960
- 28, 117, 4, 129, 57, 8, 77, 28, 117, 4, # 5970
- 129, 59, 9, 74, 28, 129, 62, 37, 129, 64, # 5980
- 33, 129, 66, 28, 129, 63, 28, 129, 60, 28, # 5990
- 129, 57, 28, 129, 54, 33, 129, 51, 39, 129, # 6000
- 48, 29, 83, 9, 129, 30, 4, 45, 29, 86, # 6010
- 9, 129, 30, 4, 42, 29, 89, 9, 129, 30, # 6020
- 4, 39, 29, 92, 8, 129, 30, 4, 36, 29, # 6030
- 94, 9, 129, 30, 32, 97, 9, 129, 30, 29, # 6040
- 100, 8, 117, 4, 129, 30, 26, 103, 8, 117, # 6050
- 4, 129, 30, 23, 105, 9, 117, 4, 129, 30, # 6060
- 20, 108, 13, 129, 30, 18, 111, 10, 129, 30, # 6070
- 15, 113, 8, 129, 30, 12, 116, 5, 129, 30, # 6080
- 9, 117, 4, 129, 30, 6, 117, 4, 129, 30, # 6090
- 4, 117, 4, 132, 193, 129, 117, 4, 132, 114, # 6100
- 7, 129, 111, 10, 129, 108, 13, 129, 105, 16, # 6110
- 129, 102, 19, 129, 100, 21, 129, 96, 25, 129, # 6120
- 93, 28, 129, 90, 31, 129, 87, 34, 129, 84, # 6130
- 30, 117, 4, 129, 30, 4, 81, 30, 117, 4, # 6140
- 129, 30, 4, 78, 30, 117, 4, 129, 30, 4, # 6150
- 75, 30, 117, 4, 129, 30, 4, 72, 30, 129, # 6160
- 30, 69, 129, 30, 66, 129, 30, 63, 129, 30, # 6170
- 60, 129, 30, 57, 129, 30, 54, 129, 30, 51, # 6180
- 129, 30, 48, 129, 30, 51, 129, 30, 4, 73, # 6190
- 12, 129, 30, 4, 76, 12, 129, 30, 4, 80, # 6200
- 12, 129, 30, 4, 83, 12, 129, 87, 12, 129, # 6210
- 90, 12, 117, 4, 129, 94, 11, 117, 4, 129, # 6220
- 97, 12, 117, 4, 129, 101, 12, 117, 4, 129, # 6230
- 104, 17, 129, 108, 13, 129, 111, 10, 129, 115, # 6240
- 6, 129, 117, 4, 134, 193, 129, 30, 1, 103, # 6250
- 18, 129, 30, 4, 103, 18, 129, 30, 7, 103, # 6260
- 18, 129, 30, 9, 103, 18, 129, 30, 12, 110, # 6270
- 11, 129, 30, 15, 113, 8, 129, 30, 18, 114, # 6280
- 7, 129, 30, 21, 116, 5, 129, 30, 24, 116, # 6290
- 5, 129, 30, 27, 117, 4, 129, 30, 30, 117, # 6300
- 4, 129, 30, 33, 117, 4, 129, 30, 4, 37, # 6310
- 28, 117, 4, 129, 30, 4, 40, 28, 117, 4, # 6320
- 129, 30, 4, 42, 29, 117, 4, 129, 30, 4, # 6330
- 45, 29, 117, 4, 129, 30, 4, 48, 29, 117, # 6340
- 4, 129, 30, 4, 51, 29, 117, 4, 129, 30, # 6350
- 4, 54, 29, 117, 4, 129, 30, 4, 57, 29, # 6360
- 117, 4, 129, 30, 4, 59, 30, 117, 4, 129, # 6370
- 30, 4, 62, 30, 117, 4, 129, 30, 4, 65, # 6380
- 30, 117, 4, 129, 30, 4, 68, 30, 117, 4, # 6390
- 129, 30, 4, 71, 30, 117, 4, 129, 30, 4, # 6400
- 74, 30, 117, 4, 129, 30, 4, 77, 30, 117, # 6410
- 4, 129, 30, 4, 80, 30, 117, 4, 129, 30, # 6420
- 4, 83, 30, 117, 4, 129, 30, 4, 86, 35, # 6430
- 129, 30, 4, 89, 32, 129, 30, 4, 91, 30, # 6440
- 129, 30, 4, 94, 27, 129, 30, 5, 97, 24, # 6450
- 129, 30, 5, 100, 21, 129, 30, 7, 103, 18, # 6460
- 129, 30, 8, 106, 15, 129, 30, 11, 109, 12, # 6470
- 129, 30, 18, 112, 9, 129, 30, 18, 115, 6, # 6480
- 129, 30, 18, 117, 4, 129, 30, 18, 120, 1, # 6490
- 129, 193, 129, 42, 8, 129, 38, 16, 129, 36, # 6500
- 20, 129, 34, 24, 71, 5, 129, 33, 26, 69, # 6510
- 10, 129, 32, 28, 68, 13, 129, 31, 30, 68, # 6520
- 14, 129, 31, 9, 52, 9, 68, 15, 129, 30, # 6530
- 8, 54, 8, 69, 14, 129, 30, 7, 55, 7, # 6540
- 71, 4, 78, 6, 129, 30, 6, 56, 6, 79, # 6550
- 5, 129, 30, 6, 56, 6, 80, 4, 130, 31, # 6560
- 5, 56, 5, 80, 4, 129, 31, 5, 56, 5, # 6570
- 79, 5, 129, 32, 5, 55, 5, 78, 6, 129, # 6580
- 33, 5, 54, 5, 77, 7, 129, 34, 6, 52, # 6590
- 6, 74, 9, 129, 35, 48, 129, 33, 49, 129, # 6600
- 32, 49, 129, 31, 49, 129, 30, 49, 129, 30, # 6610
- 47, 129, 30, 45, 129, 30, 41, 129, 30, 6, # 6620
- 129, 30, 4, 129, 30, 3, 129, 30, 2, 129, # 6630
- 193, 129, 30, 4, 117, 4, 130, 31, 90, 136, # 6640
- 37, 5, 72, 5, 129, 35, 5, 74, 5, 129, # 6650
- 33, 5, 76, 5, 129, 32, 5, 77, 5, 129, # 6660
- 31, 5, 78, 5, 129, 31, 4, 79, 4, 129, # 6670
- 30, 5, 79, 5, 131, 30, 6, 78, 6, 129, # 6680
- 30, 7, 77, 7, 129, 31, 8, 75, 8, 129, # 6690
- 31, 11, 72, 11, 129, 32, 15, 67, 15, 129, # 6700
- 33, 48, 129, 34, 46, 129, 35, 44, 129, 37, # 6710
- 40, 129, 39, 36, 129, 42, 30, 129, 46, 22, # 6720
- 129, 193, 129, 48, 18, 129, 43, 28, 129, 41, # 6730
- 32, 129, 39, 36, 129, 37, 40, 129, 35, 44, # 6740
- 129, 34, 46, 129, 33, 13, 68, 13, 129, 32, # 6750
- 9, 73, 9, 129, 32, 7, 75, 7, 129, 31, # 6760
- 6, 77, 6, 129, 31, 5, 78, 5, 129, 30, # 6770
- 5, 79, 5, 129, 30, 4, 80, 4, 133, 31, # 6780
- 3, 79, 4, 129, 31, 4, 79, 4, 129, 32, # 6790
- 3, 78, 4, 129, 32, 4, 76, 6, 129, 33, # 6800
- 4, 74, 7, 129, 34, 4, 72, 8, 129, 35, # 6810
- 5, 72, 7, 129, 37, 5, 73, 4, 129, 39, # 6820
- 4, 74, 1, 129, 129, 193, 129, 46, 22, 129, # 6830
- 42, 30, 129, 39, 36, 129, 37, 40, 129, 35, # 6840
- 44, 129, 34, 46, 129, 33, 48, 129, 32, 15, # 6850
- 67, 15, 129, 31, 11, 72, 11, 129, 31, 8, # 6860
- 75, 8, 129, 30, 7, 77, 7, 129, 30, 6, # 6870
- 78, 6, 129, 30, 5, 79, 5, 131, 31, 4, # 6880
- 79, 4, 129, 31, 5, 78, 5, 129, 32, 5, # 6890
- 77, 5, 129, 33, 5, 76, 5, 129, 35, 5, # 6900
- 74, 5, 117, 4, 129, 37, 5, 72, 5, 117, # 6910
- 4, 129, 30, 91, 136, 30, 4, 130, 193, 129, # 6920
- 48, 18, 129, 43, 28, 129, 41, 32, 129, 39, # 6930
- 36, 129, 37, 40, 129, 35, 44, 129, 34, 46, # 6940
- 129, 33, 13, 55, 4, 68, 13, 129, 32, 9, # 6950
- 55, 4, 73, 9, 129, 32, 7, 55, 4, 75, # 6960
- 7, 129, 31, 6, 55, 4, 77, 6, 129, 31, # 6970
- 5, 55, 4, 78, 5, 129, 30, 5, 55, 4, # 6980
- 79, 5, 129, 30, 4, 55, 4, 80, 4, 132, # 6990
- 30, 4, 55, 4, 79, 5, 129, 31, 3, 55, # 7000
- 4, 78, 5, 129, 31, 4, 55, 4, 77, 6, # 7010
- 129, 32, 3, 55, 4, 75, 7, 129, 32, 4, # 7020
- 55, 4, 73, 9, 129, 33, 4, 55, 4, 68, # 7030
- 13, 129, 34, 4, 55, 25, 129, 35, 5, 55, # 7040
- 24, 129, 37, 5, 55, 22, 129, 39, 4, 55, # 7050
- 20, 129, 55, 18, 129, 55, 16, 129, 55, 11, # 7060
- 129, 193, 129, 80, 4, 129, 30, 4, 80, 4, # 7070
- 130, 30, 78, 129, 30, 82, 129, 30, 85, 129, # 7080
- 30, 87, 129, 30, 88, 129, 30, 89, 129, 30, # 7090
- 90, 130, 30, 4, 80, 4, 115, 6, 129, 30, # 7100
- 4, 80, 4, 117, 4, 129, 80, 4, 105, 6, # 7110
- 117, 4, 129, 80, 4, 103, 10, 116, 5, 129, # 7120
- 80, 4, 102, 19, 129, 80, 4, 101, 19, 129, # 7130
- 101, 19, 129, 101, 18, 129, 102, 16, 129, 103, # 7140
- 12, 129, 105, 6, 129, 193, 129, 12, 10, 59, # 7150
- 11, 129, 9, 16, 55, 19, 129, 7, 20, 53, # 7160
- 23, 129, 6, 7, 23, 5, 32, 6, 51, 27, # 7170
- 129, 4, 7, 25, 16, 50, 29, 129, 3, 6, # 7180
- 27, 16, 49, 31, 129, 2, 6, 28, 16, 48, # 7190
- 33, 129, 1, 6, 27, 18, 47, 35, 129, 1, # 7200
- 6, 27, 31, 71, 12, 129, 1, 5, 26, 15, # 7210
- 44, 10, 75, 8, 129, 1, 5, 25, 14, 45, # 7220
- 7, 77, 7, 129, 1, 5, 25, 13, 45, 5, # 7230
- 79, 5, 129, 1, 5, 24, 14, 45, 4, 80, # 7240
- 4, 129, 1, 5, 24, 13, 45, 4, 80, 4, # 7250
- 129, 1, 5, 23, 14, 45, 4, 80, 4, 129, # 7260
- 1, 5, 23, 13, 45, 4, 80, 4, 129, 1, # 7270
- 6, 22, 13, 45, 5, 79, 5, 129, 1, 6, # 7280
- 21, 14, 45, 7, 77, 7, 129, 1, 7, 21, # 7290
- 13, 46, 8, 75, 8, 129, 1, 8, 20, 13, # 7300
- 46, 12, 71, 12, 129, 1, 10, 18, 15, 47, # 7310
- 35, 129, 2, 30, 48, 33, 129, 3, 29, 49, # 7320
- 32, 129, 4, 27, 50, 31, 129, 5, 25, 51, # 7330
- 27, 80, 2, 86, 4, 129, 7, 21, 53, 23, # 7340
- 80, 3, 85, 6, 129, 9, 17, 55, 19, 80, # 7350
- 12, 129, 12, 12, 59, 11, 81, 11, 129, 82, # 7360
- 10, 129, 84, 7, 129, 86, 4, 129, 193, 129, # 7370
- 30, 4, 117, 4, 130, 30, 91, 136, 30, 4, # 7380
- 72, 5, 129, 30, 4, 74, 5, 129, 75, 5, # 7390
- 129, 76, 5, 129, 76, 6, 129, 77, 6, 130, # 7400
- 77, 7, 130, 76, 8, 129, 30, 4, 75, 9, # 7410
- 129, 30, 4, 72, 12, 129, 30, 54, 129, 30, # 7420
- 53, 130, 30, 52, 129, 30, 51, 129, 30, 49, # 7430
- 129, 30, 46, 129, 30, 42, 129, 30, 4, 130, # 7440
- 193, 129, 30, 4, 80, 4, 129, 30, 4, 80, # 7450
- 4, 100, 6, 129, 30, 54, 98, 10, 129, 30, # 7460
- 54, 97, 12, 129, 30, 54, 96, 14, 131, 30, # 7470
- 54, 97, 12, 129, 30, 54, 98, 10, 129, 30, # 7480
- 54, 100, 6, 129, 30, 4, 130, 193, 129, 7, # 7490
- 6, 129, 4, 11, 129, 3, 13, 129, 2, 14, # 7500
- 129, 1, 15, 130, 1, 3, 6, 9, 129, 1, # 7510
- 3, 7, 6, 129, 1, 3, 130, 1, 4, 129, # 7520
- 1, 5, 80, 4, 129, 1, 7, 80, 4, 100, # 7530
- 6, 129, 2, 82, 98, 10, 129, 3, 81, 97, # 7540
- 12, 129, 4, 80, 96, 14, 129, 5, 79, 96, # 7550
- 14, 129, 7, 77, 96, 14, 129, 10, 74, 97, # 7560
- 12, 129, 14, 70, 98, 10, 129, 19, 65, 100, # 7570
- 6, 129, 193, 129, 30, 4, 117, 4, 130, 30, # 7580
- 91, 136, 30, 4, 57, 9, 129, 30, 4, 55, # 7590
- 12, 129, 52, 17, 129, 50, 20, 129, 48, 24, # 7600
- 129, 46, 27, 129, 44, 21, 69, 6, 129, 41, # 7610
- 22, 70, 6, 80, 4, 129, 30, 4, 39, 21, # 7620
- 72, 6, 80, 4, 129, 30, 4, 36, 22, 73, # 7630
- 11, 129, 30, 26, 75, 9, 129, 30, 23, 76, # 7640
- 8, 129, 30, 21, 78, 6, 129, 30, 19, 79, # 7650
- 5, 129, 30, 16, 80, 4, 129, 30, 14, 80, # 7660
- 4, 129, 30, 12, 129, 30, 10, 129, 30, 7, # 7670
- 129, 30, 5, 129, 30, 4, 130, 193, 129, 30, # 7680
- 4, 117, 4, 130, 30, 91, 136, 30, 4, 130, # 7690
- 193, 129, 30, 4, 80, 4, 130, 30, 54, 136, # 7700
- 30, 4, 72, 5, 129, 30, 4, 74, 5, 129, # 7710
- 75, 5, 129, 76, 5, 129, 30, 4, 75, 7, # 7720
- 129, 30, 4, 74, 9, 129, 30, 54, 132, 30, # 7730
- 53, 129, 30, 52, 129, 30, 51, 129, 30, 48, # 7740
- 129, 30, 4, 72, 5, 129, 30, 4, 74, 5, # 7750
- 129, 75, 5, 129, 76, 5, 129, 30, 4, 75, # 7760
- 7, 129, 30, 4, 74, 9, 129, 30, 54, 132, # 7770
- 30, 53, 129, 30, 52, 129, 30, 51, 129, 30, # 7780
- 48, 129, 30, 4, 130, 193, 129, 30, 4, 80, # 7790
- 4, 130, 30, 54, 136, 30, 4, 72, 5, 129, # 7800
- 30, 4, 74, 5, 129, 75, 5, 129, 76, 5, # 7810
- 129, 76, 6, 129, 77, 6, 130, 77, 7, 130, # 7820
- 76, 8, 129, 30, 4, 75, 9, 129, 30, 4, # 7830
- 72, 12, 129, 30, 54, 129, 30, 53, 130, 30, # 7840
- 52, 129, 30, 51, 129, 30, 49, 129, 30, 46, # 7850
- 129, 30, 42, 129, 30, 4, 130, 193, 129, 48, # 7860
- 18, 129, 43, 28, 129, 41, 32, 129, 39, 36, # 7870
- 129, 37, 40, 129, 35, 44, 129, 34, 46, 129, # 7880
- 33, 13, 68, 13, 129, 32, 9, 73, 9, 129, # 7890
- 32, 7, 75, 7, 129, 31, 6, 77, 6, 129, # 7900
- 31, 5, 78, 5, 129, 30, 5, 79, 5, 129, # 7910
- 30, 4, 80, 4, 132, 30, 5, 79, 5, 130, # 7920
- 31, 5, 78, 5, 129, 31, 6, 77, 6, 129, # 7930
- 32, 7, 75, 7, 129, 32, 9, 73, 9, 129, # 7940
- 33, 13, 68, 13, 129, 34, 46, 129, 35, 44, # 7950
- 129, 37, 40, 129, 39, 36, 129, 41, 32, 129, # 7960
- 43, 28, 129, 48, 18, 129, 193, 129, 1, 3, # 7970
- 80, 4, 130, 1, 83, 137, 37, 5, 72, 5, # 7980
- 129, 35, 5, 74, 5, 129, 33, 5, 76, 5, # 7990
- 129, 32, 5, 77, 5, 129, 31, 5, 78, 5, # 8000
- 129, 31, 4, 79, 4, 129, 30, 5, 79, 5, # 8010
- 131, 30, 6, 78, 6, 129, 30, 7, 77, 7, # 8020
- 129, 31, 8, 75, 8, 129, 31, 11, 72, 11, # 8030
- 129, 32, 15, 67, 15, 129, 33, 48, 129, 34, # 8040
- 46, 129, 35, 44, 129, 37, 40, 129, 39, 36, # 8050
- 129, 42, 30, 129, 46, 22, 129, 193, 129, 46, # 8060
- 22, 129, 42, 30, 129, 39, 36, 129, 37, 40, # 8070
- 129, 35, 44, 129, 34, 46, 129, 33, 48, 129, # 8080
- 32, 15, 67, 15, 129, 31, 11, 72, 11, 129, # 8090
- 31, 8, 75, 8, 129, 30, 7, 77, 7, 129, # 8100
- 30, 6, 78, 6, 129, 30, 5, 79, 5, 131, # 8110
- 31, 4, 79, 4, 129, 31, 5, 78, 5, 129, # 8120
- 32, 5, 77, 5, 129, 33, 5, 76, 5, 129, # 8130
- 35, 5, 74, 5, 129, 37, 5, 72, 5, 129, # 8140
- 1, 83, 136, 1, 3, 80, 4, 130, 193, 129, # 8150
- 30, 4, 80, 4, 130, 30, 54, 136, 30, 4, # 8160
- 68, 6, 129, 30, 4, 70, 6, 129, 71, 7, # 8170
- 129, 72, 7, 129, 73, 7, 129, 74, 7, 129, # 8180
- 74, 8, 129, 75, 8, 130, 69, 15, 129, 67, # 8190
- 17, 129, 66, 18, 129, 65, 19, 130, 65, 18, # 8200
- 130, 66, 16, 129, 67, 13, 129, 69, 8, 129, # 8210
- 193, 129, 30, 13, 64, 8, 129, 30, 13, 61, # 8220
- 14, 129, 30, 13, 59, 18, 129, 30, 13, 57, # 8230
- 22, 129, 33, 8, 56, 24, 129, 32, 7, 55, # 8240
- 26, 129, 32, 6, 54, 28, 129, 31, 6, 53, # 8250
- 16, 77, 6, 129, 31, 5, 53, 14, 79, 4, # 8260
- 129, 30, 5, 52, 14, 80, 4, 129, 30, 5, # 8270
- 52, 13, 80, 4, 129, 30, 4, 52, 13, 80, # 8280
- 4, 129, 30, 4, 52, 12, 80, 4, 129, 30, # 8290
- 4, 51, 13, 80, 4, 130, 30, 4, 50, 13, # 8300
- 79, 5, 129, 30, 4, 50, 13, 78, 5, 129, # 8310
- 30, 5, 49, 14, 77, 6, 129, 31, 4, 49, # 8320
- 13, 76, 6, 129, 31, 5, 48, 14, 75, 7, # 8330
- 129, 32, 5, 47, 14, 73, 8, 129, 32, 6, # 8340
- 45, 16, 71, 13, 129, 33, 27, 71, 13, 129, # 8350
- 34, 26, 71, 13, 129, 35, 24, 71, 13, 129, # 8360
- 37, 20, 129, 39, 16, 129, 43, 9, 129, 193, # 8370
- 129, 80, 4, 131, 41, 56, 129, 37, 60, 129, # 8380
- 35, 62, 129, 33, 64, 129, 32, 65, 129, 31, # 8390
- 66, 129, 30, 67, 130, 30, 11, 80, 4, 129, # 8400
- 30, 9, 80, 4, 129, 30, 8, 80, 4, 129, # 8410
- 31, 7, 80, 4, 129, 31, 6, 129, 32, 5, # 8420
- 129, 33, 5, 129, 35, 4, 129, 38, 3, 129, # 8430
- 193, 129, 80, 4, 130, 42, 42, 129, 38, 46, # 8440
- 129, 35, 49, 129, 33, 51, 129, 32, 52, 129, # 8450
- 31, 53, 130, 30, 54, 129, 30, 12, 129, 30, # 8460
- 9, 129, 30, 8, 129, 30, 7, 130, 31, 6, # 8470
- 130, 32, 6, 129, 33, 5, 129, 34, 5, 129, # 8480
- 35, 5, 80, 4, 129, 37, 5, 80, 4, 129, # 8490
- 30, 54, 136, 30, 4, 130, 193, 129, 80, 4, # 8500
- 130, 77, 7, 129, 74, 10, 129, 70, 14, 129, # 8510
- 66, 18, 129, 62, 22, 129, 59, 25, 129, 55, # 8520
- 29, 129, 51, 33, 129, 47, 37, 129, 44, 32, # 8530
- 80, 4, 129, 40, 32, 80, 4, 129, 36, 32, # 8540
- 129, 32, 33, 129, 30, 31, 129, 33, 24, 129, # 8550
- 36, 17, 129, 40, 12, 129, 44, 12, 129, 48, # 8560
- 12, 129, 51, 13, 129, 55, 13, 129, 59, 13, # 8570
- 80, 4, 129, 63, 13, 80, 4, 129, 67, 17, # 8580
- 129, 71, 13, 129, 74, 10, 129, 78, 6, 129, # 8590
- 80, 4, 131, 193, 129, 80, 4, 130, 77, 7, # 8600
- 129, 74, 10, 129, 70, 14, 129, 66, 18, 129, # 8610
- 62, 22, 129, 59, 25, 129, 55, 29, 129, 51, # 8620
- 33, 129, 47, 37, 129, 44, 32, 80, 4, 129, # 8630
- 40, 32, 80, 4, 129, 36, 32, 129, 32, 33, # 8640
- 129, 30, 31, 129, 33, 24, 129, 36, 17, 129, # 8650
- 40, 12, 129, 44, 12, 129, 47, 13, 129, 44, # 8660
- 20, 129, 40, 28, 129, 36, 31, 129, 32, 32, # 8670
- 129, 30, 30, 129, 33, 24, 129, 36, 17, 129, # 8680
- 40, 12, 129, 44, 12, 129, 48, 12, 129, 51, # 8690
- 13, 129, 55, 13, 129, 59, 13, 80, 4, 129, # 8700
- 63, 13, 80, 4, 129, 67, 17, 129, 71, 13, # 8710
- 129, 74, 10, 129, 78, 6, 129, 80, 4, 131, # 8720
- 193, 129, 30, 4, 80, 4, 130, 30, 4, 79, # 8730
- 5, 129, 30, 5, 77, 7, 129, 30, 6, 74, # 8740
- 10, 129, 30, 8, 72, 12, 129, 30, 11, 69, # 8750
- 15, 129, 30, 13, 67, 17, 129, 30, 4, 37, # 8760
- 8, 64, 20, 129, 30, 4, 39, 8, 62, 22, # 8770
- 129, 41, 8, 59, 25, 129, 43, 8, 57, 27, # 8780
- 129, 45, 8, 55, 22, 80, 4, 129, 47, 27, # 8790
- 80, 4, 129, 49, 23, 129, 47, 22, 129, 44, # 8800
- 23, 129, 42, 22, 129, 30, 4, 39, 27, 129, # 8810
- 30, 4, 37, 31, 129, 30, 27, 62, 8, 129, # 8820
- 30, 25, 64, 8, 129, 30, 22, 66, 8, 80, # 8830
- 4, 129, 30, 20, 68, 8, 80, 4, 129, 30, # 8840
- 17, 70, 8, 80, 4, 129, 30, 15, 73, 11, # 8850
- 129, 30, 12, 75, 9, 129, 30, 10, 77, 7, # 8860
- 129, 30, 7, 79, 5, 129, 30, 5, 80, 4, # 8870
- 129, 30, 4, 80, 4, 130, 193, 129, 4, 5, # 8880
- 80, 4, 129, 2, 9, 80, 4, 129, 1, 11, # 8890
- 77, 7, 129, 1, 12, 74, 10, 129, 1, 12, # 8900
- 70, 14, 129, 1, 12, 66, 18, 129, 1, 11, # 8910
- 62, 22, 129, 2, 9, 59, 25, 129, 4, 11, # 8920
- 55, 29, 129, 7, 12, 51, 33, 129, 10, 12, # 8930
- 47, 37, 129, 14, 12, 44, 32, 80, 4, 129, # 8940
- 17, 13, 40, 32, 80, 4, 129, 21, 13, 36, # 8950
- 32, 129, 25, 40, 129, 29, 32, 129, 33, 24, # 8960
- 129, 36, 17, 129, 40, 12, 129, 44, 12, 129, # 8970
- 48, 12, 129, 51, 13, 129, 55, 13, 129, 59, # 8980
- 13, 80, 4, 129, 63, 13, 80, 4, 129, 67, # 8990
- 17, 129, 71, 13, 129, 74, 10, 129, 78, 6, # 9000
- 129, 80, 4, 131, 193, 129, 30, 1, 71, 13, # 9010
- 129, 30, 3, 71, 13, 129, 30, 6, 71, 13, # 9020
- 129, 30, 9, 75, 9, 129, 30, 11, 77, 7, # 9030
- 129, 30, 14, 79, 5, 129, 30, 17, 79, 5, # 9040
- 129, 30, 19, 80, 4, 129, 30, 22, 80, 4, # 9050
- 129, 30, 25, 80, 4, 129, 30, 27, 80, 4, # 9060
- 129, 30, 4, 36, 24, 80, 4, 129, 30, 4, # 9070
- 38, 25, 80, 4, 129, 30, 4, 41, 24, 80, # 9080
- 4, 129, 30, 4, 44, 24, 80, 4, 129, 30, # 9090
- 4, 46, 25, 80, 4, 129, 30, 4, 49, 25, # 9100
- 80, 4, 129, 30, 4, 52, 24, 80, 4, 129, # 9110
- 30, 4, 54, 30, 129, 30, 4, 57, 27, 129, # 9120
- 30, 4, 59, 25, 129, 30, 4, 62, 22, 129, # 9130
- 30, 4, 65, 19, 129, 30, 5, 67, 17, 129, # 9140
- 30, 5, 70, 14, 129, 30, 7, 73, 11, 129, # 9150
- 30, 9, 76, 8, 129, 30, 13, 78, 6, 129, # 9160
- 30, 13, 81, 3, 129, 30, 13, 129, 193, 2, # 9170
- 9, 59, 25, 129, 4, 11, 55, 29, 129, 7, # 9180
- 12, 51, 33, 129, 10, 12, 47, 37, 129, 14, # 9190
- 12, 44, 32, 80, 4, 129, 17, 13, 40, 32, # 9200
- 80, 4, 129, 21, 13, 36, 32, 129, 25, 40, # 9210
- 129, 29, 32, 129, 33, 24, 129, 36, 17, 129, # 9220
- 40, 12, 129, 44, 12, 129, 48, 12, 129, 51, # 9230
- 13, 129, 55, 13, 129, 59, 13, 80, 4, 129, # 9240
- 63, 13, 80, 4, 129, 67, 17, 129, 71, 13, # 9250
- 129, 74, 10, 129, 78, 6, 129, 80, 4, 131, # 9260
- 193, 129, 65, 21, 129, 64, 23, 129, 63, 25, # 9270
- 129, 62, 27, 129, 61, 29, 129, 60, 31, 129, # 9280
- 59, 16, 76, 16, 129, 58, 16, 77, 16, 129, # 9290
- 57, 16, 78, 16, 129, 56, 16, 78, 16, 129, # 9300
- 55, 16, 79, 16, 129, 54, 16, 80, 16, 129, # 9310
- 53, 16, 81, 16, 129, 52, 16, 82, 16, 129, # 9320
- 51, 16, 83, 16, 129, 50, 16, 84, 16, 129, # 9330
- 49, 16, 85, 16, 129, 48, 16, 86, 16, 129, # 9340
- 47, 16, 87, 16, 129, 46, 16, 88, 16, 129, # 9350
- 45, 16, 89, 16, 129, 46, 14, 90, 14, 129, # 9360
- 193, 129, 46, 14, 90, 14, 129, 45, 16, 89, # 9370
- 16, 129, 46, 16, 88, 16, 129, 47, 16, 87, # 9380
- 16, 129, 48, 16, 86, 16, 129, 49, 16, 85, # 9390
- 16, 129, 50, 16, 84, 16, 129, 51, 16, 83, # 9400
- 16, 129, 52, 16, 82, 16, 129, 53, 16, 81, # 9410
- 16, 129, 54, 16, 80, 16, 129, 55, 16, 79, # 9420
- 16, 129, 56, 16, 78, 16, 129, 57, 16, 78, # 9430
- 16, 129, 58, 16, 77, 16, 129, 59, 16, 76, # 9440
- 16, 129, 60, 31, 129, 61, 29, 129, 62, 27, # 9450
- 129, 63, 25, 129, 64, 23, 129, 65, 21, 129, # 9460
- 193 # 9470
- );
- sub perlBanner {
- my $message = shift;
- return if (!defined $message);
- my $width = 50;
- my $output;
- my @print;
- for (my $i = 0; $i < $width; $i++) {
- my $j = $i * 132 / $width;
- $print[$j] = 1;
- }
- # Have now read in the data. Next get the message to be printed.
- my @message;
- {
- $message =~ s/\n//g;
- @message = split(//, $message);
- }
- # check message to make sure it's legal
- for (my $i = 0; $i < @message; $i++) {
- my $chr = $message[$i];
- my $asc = ord($chr);
- if ($asc >= $NCHARS || $asc_ptr[$asc] == 0) {
- cprint("the character '$chr' is not in my character set");
- return undef;
- }
- }
- # Now have message. Print it one character at a time.
- my @line;
- for (my $i = 0; $i < @message; $i++) {
- for (my $j = 0; $j < $DWIDTH; $j++) {
- $line[$j] = ' ';
- }
- my $chr = $message[$i];
- my $asc = ord($chr);
- my $pc = $asc_ptr[$asc];
- my $term = 0;
- my $max = 0;
- my $linen = 0;
- while (!$term) {
- if ($pc < 0 || $pc > $NBYTES) {
- cprint("I'm somewhere where I don't know where I am! banner array position: $pc (lol)");
- return undef;
- }
- my $x = $data_table[$pc] & 0377;
- if ($x >= 128) {
- if ($x > 192) {
- $term++;
- }
- $x = $x & 63;
- while ($x--) {
- if ($print[$linen++]) {
- for (my $j = 0; $j <= $max; $j++) {
- if ($print[$j]) {
- $output .= $line[$j];
- }
- }
- $output .= "\n";
- }
- }
- for (my $j = 0; $j < $DWIDTH; $j++) {
- $line[$j] = ' ';
- }
- $pc++;
- } else {
- my $y = $data_table[$pc + 1];
- $max = $x + $y;
- while ($x < $max) {
- $line[$x++] = '#';
- }
- $pc += 2;
- }
- }
- }
- return $output;
- }
- sub chalkboard {
- my $message = shift;
- #######looks like shit on all fonts
- my $boardTemplate = <<CHALKBOARD;
- _____________________________________________________________
- | \$text1 ^^^^^^^^\\ |
- | \$text2 | | |
- | \$text3 |_ __ | |
- | \$text4 (.(. ) | |
- | \$partial _ (_ ) |
- | \\\\ /___/' / |
- | _\\\\_ \\ | |
- | (( ) /====| |
- | \\ <.__._- \\ |
- |___________________________________________ <//___. ||
- CHALKBOARD
- my @message;
- for (my $i = 1; $i <= (int(225 / (length($message) + 1)) + 1); $i++) {
- push(@message, uc($message));
- }
- $message = substr(join(' ', @message), 0, 225);
- my $text = {};
- for (my $i = 1; $i <= 5; $i++) {
- $text->{$i} = substr($message, (($i - 1) * 46), 46);
- }
- my $output = $boardTemplate;
- $message = uc($message) . (' ' x (46 - length($message)));
- my $partial = substr($message, 0, 41);
- $partial = uc($partial) . (' ' x (41 - length($partial)));
- $output =~ s/\$text([1-4])/$text->{$1}/g;
- $output =~ s/\$partial/$partial/g;
- return $output;
- }
- # run a command and return output
- sub run {
- my %params = @_;
- my $command = $params{command};
- my $args = $params{args};
- my $stdin = $params{stdin};
- # see if we can find the program
- $command = whereis($command);
- if (!-x $command) {
- cprint("$command not found or not executable!");
- return;
- }
- #my $pid = open3(\*WRITE, \*READ, \*ERR, "$command $args");
- #if ($stdin) { print WRITE $stdin }
- #close WRITE;
- #my $output = join('', <READ>);
- #close READ;
- # check for errors
- #while (my $line = <ERR>) {
- # next if $line eq "Message: "; # hack for banner :(
- # cprint_lines($line);
- #}
- #close ERR;
- #waitpid($pid, 0);
- my $output = ` $command $args $stdin `;
- return $output;
- }
- sub strip {
- my $text = shift;
- return if (!defined $text);
- my $output;
- foreach my $line (split(/\r?\n/, $text)) {
- $output .= "$line\n" unless ($line =~ /^\s*$/);
- }
- return $output;
- }
- sub whereis {
- # evaluate $PATH, since this doesn't seem to be inherited
- # in sh subproccess in irssi.. odd
- my $cmd = shift;
- my $path;
- # generate a lot of possible locations for cowsay path
- $path .= $ENV{PATH};
- $path .= ":/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin";
- $path .= ":/usr/local/cowsay/bin:/opt/cowsay/bin";
- foreach my $path (split(/:/, $path)) {
- next unless $path;
- if (-x "$path/$cmd") {
- return "$path/$cmd";
- }
- }
- }
- sub execute {
- # execute command and return output
- my $text = shift;
- return if (!defined $text);
- #my $pid = open3(
- # \*WRITE, \*READ, \*ERR,
- # $text
- #);
- #close WRITE;
- #$text = join('', <READ>);
- #close READ;
- # check for errors
- #cprint_lines(join('', <ERR>));
- #close ERR;
- #waitpid($pid, 0);
- my $output = ` $text `;
- return $output;
- }
- sub smiley {
- my $smilefile = shift;
- $smilefile .= ".txt" unless ($smilefile =~ /\.txt$/);
- #should i bother to find any apth, or let the user specify?
- my $path = "~/.xchat2/smilies/";
- my $full = $path . $smilefile;
- #unless (-f $full) {
- # cprint("could not find smilefile: $full");
- # return;
- # }
- #all xchat2 should support exec, so it's a nice shirtcut for us
- IRC::command("/exec -o cat $full");
- #must actally exit now, for now, we return empty string
- return " ";
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement