summaryrefslogtreecommitdiff
path: root/spamassassin
diff options
context:
space:
mode:
authorPeter Palfrader <peter@palfrader.org>2006-09-30 16:56:52 +0000
committerweasel <weasel@bc3d92e2-beff-0310-a7cd-cc87d7ac0ede>2006-09-30 16:56:52 +0000
commitdc5a852a3a5834bb19623f0df15f9c8f47682cd2 (patch)
treede16108ff12f4cd0bda0e781821c6b9e5408a775 /spamassassin
parentd7fa158e242fe9c89d78122564a67b238330d06f (diff)
Add fuzzy
git-svn-id: svn+ssh://asteria.noreply.org/svn/weaselutils/trunk@184 bc3d92e2-beff-0310-a7cd-cc87d7ac0ede
Diffstat (limited to 'spamassassin')
-rw-r--r--spamassassin/fuzzyocr/FuzzyOcr.cf124
-rw-r--r--spamassassin/fuzzyocr/FuzzyOcr.pm864
-rw-r--r--spamassassin/fuzzyocr/FuzzyOcr.words45
-rw-r--r--spamassassin/fuzzyocr/INSTALL119
-rw-r--r--spamassassin/fuzzyocr/LICENSE202
-rw-r--r--spamassassin/fuzzyocr/README.weasel2
-rw-r--r--spamassassin/fuzzyocr/samples/README61
-rw-r--r--spamassassin/fuzzyocr/samples/animated-gif.eml579
-rw-r--r--spamassassin/fuzzyocr/samples/corrupted-gif.eml227
-rw-r--r--spamassassin/fuzzyocr/samples/jpeg.eml426
-rw-r--r--spamassassin/fuzzyocr/samples/png.eml318
11 files changed, 2967 insertions, 0 deletions
diff --git a/spamassassin/fuzzyocr/FuzzyOcr.cf b/spamassassin/fuzzyocr/FuzzyOcr.cf
new file mode 100644
index 0000000..c750384
--- /dev/null
+++ b/spamassassin/fuzzyocr/FuzzyOcr.cf
@@ -0,0 +1,124 @@
+loadplugin FuzzyOcr /etc/spamassassin/FuzzyOcr.pm
+body FUZZY_OCR eval:fuzzyocr_check()
+describe FUZZY_OCR Mail contains an image with common spam text inside
+body FUZZY_OCR_WRONG_CTYPE eval:dummy_check()
+describe FUZZY_OCR_WRONG_CTYPE Mail contains an image with wrong content-type set
+body FUZZY_OCR_CORRUPT_IMG eval:dummy_check()
+describe FUZZY_OCR_CORRUPT_IMG Mail contains a corrupted image
+body FUZZY_OCR_KNOWN_HASH eval:dummy_check()
+describe FUZZY_OCR_KNOWN_HASH Mail contains an image with known hash
+
+priority FUZZY_OCR 900
+
+########### Plugin Configuration #############
+
+#### Logging options #####
+# Verbosity level (see manual) Attention: Don't set to 0, but to 0.0 for quiet operation. (Default value: 1)
+#focr_verbose 1
+#focr_verbose 1
+focr_verbose 2
+#
+# Logfile (make sure it is writable by the plugin) (Default value: /etc/mail/spamassassin/FuzzyOcr.log)
+# obsoleted by weasel
+#focr_logfile /var/lib/FuzzyOcr/log
+##########################
+
+##### Wordlists #####
+# Here we defined the words to scan for (Default value: /etc/mail/spamassassin/FuzzyOcr.words)
+focr_global_wordlist /etc/spamassassin/FuzzyOcr.words
+#
+# This is the path RELATIVE to the respektive home directory for the personalized list
+# This list is merged with the global word list on execution (Default value: .spamassassin/fuzzyocr.words)
+#focr_personal_wordlist .spamassassin/fuzzyocr.words
+#####################
+
+# Set this to 1 if you are running a version < 3.1.4.
+# This will disable a function used in conjunction with animated gifs that isn't available in earlier versions (Default value: 0.0)
+#focr_pre314 0.0
+
+# These parameters can be used to change other detection settings
+# If you leave these commented out, the defaults will be used.
+# Do not use " " around any parameters!
+#
+##### Location of helper applications (path + binary) (Default values: /usr/bin/<app>) #####
+#focr_bin_giffix /usr/bin/giffix
+#focr_bin_giftext /usr/bin/giftext
+#focr_bin_gifasm /usr/bin/gifasm
+#focr_bin_gifinter /usr/bin/gifinter
+#focr_bin_giftopnm /usr/bin/giftopnm
+#focr_bin_jpegtopnm /usr/bin/jpegtopnm
+#focr_bin_pngtopnm /usr/bin/pngtopnm
+#focr_bin_ppmhist /usr/bin/ppmhist
+#focr_bin_convert /usr/bin/convert
+#focr_bin_identify /usr/bin/identify
+#focr_bin_gocr /usr/bin/gocr
+############################################################################################
+
+##### Scansets, comma seperated (Default value: $gocr -i -, $gocr -l 180 -d 2 -i -) #####
+# Each scanset consists of one or more commands which make text out of pnm input.
+# Each scanset is run seperately on the PNM data, results are combined in scoring.
+#focr_scansets $gocr -i -, $gocr -l 180 -d 2 -i -
+#
+# To use only one scan with default values, uncomment the next line instead
+#focr_scansets $gocr -i -
+#
+# Some example for more advanced sets
+# Thisone uses the first the standard scan, then a scanset which first reduces the image to 3 colors and then scans it with custom settings
+# and then it scans again only with these custom settings
+# NOTE: This is for advanced users only, if you have questions how to use this, ask on the ML or on IRC
+#focr_scansets $gocr -i -, pnmnorm 2>$errfile | pnmquant 3 2>>$errfile | pnmnorm 2>>$errfile | $gocr -l 180 -d 2 -i -, $gocr -l 180 -d 2 -i -
+#########################################################################################
+
+##### Various Score/Scan settings #####
+# Timeout for the plugin, in seconds. (Maximum runtime of the plugin) (Default value: 10)
+#focr_timeout 10
+focr_timeout 30
+#
+# Default detection treshold (see manual) (Default value: 0.3) (Can be changed on a per word basis in the wordlist).
+#focr_threshold 0.3
+#
+# This is the score for a hit after focr_counts_required matches
+#focr_base_score 4
+focr_base_score 1
+#
+# This is the additional score for every additional match after focr_counts_required matches (Default value: 1)
+#focr_add_score 1
+focr_add_score 0.1
+#
+# This is the score to give for a wrong content-type (e.g. JPEG image but content type says GIF) (Default value: 1.5)
+#focr_wrongctype_score 1.5
+focr_wrongctype_score 0.5
+#
+# This is the score to give for a corrupted image (This currently affects only GIF images) (Default value: 2.5)
+#focr_corrupt_score 2.5
+focr_corrupt_score 0.5
+#
+# This is the score to give for a corrupted unfixable image (This currently affects only GIF images) (Default value: 5)
+#focr_corrupt_unfixable_score 5
+focr_corrupt_unfixable_score 0.5
+#
+# This is used to disable the OCR engine if the message has already more points than this value (Default value: 10)
+#focr_autodisable_score 10
+#
+# Number of minimum matches before the rule scores (Default value: 2)
+#focr_counts_required 2
+#
+# Specifies, how many frames an animated gif must contain, so the second (less resource consuming) animated gif test is used. (Default value: 5)
+#focr_gif_max_frames 5
+
+#######################################
+
+##### Image Hash Database settings (Experimental, disabled by default) #####
+#
+# Set this to 1 to enable the Image Hash database feature (Default value: 0.0)
+#focr_enable_image_hashing 0.0
+#
+# The score is saved with the hash in the database, so no extra scoring for a db hit is required.
+#
+# If the image hash database feature is enabled, specify the file here to use as database (Default value: /etc/mail/spamassassin/FuzzyOcr.hashdb)
+#focr_digest_db /etc/mail/spamassassin/FuzzyOcr.hashdb
+#
+# Automatically add hashes of spam images recognized by OCR to the Image Hash database, to disable, set to 0.0 (Default value: 1)
+#focr_hashing_learn_scanned 1
+#
+######################################################################
diff --git a/spamassassin/fuzzyocr/FuzzyOcr.pm b/spamassassin/fuzzyocr/FuzzyOcr.pm
new file mode 100644
index 0000000..5f5f01b
--- /dev/null
+++ b/spamassassin/fuzzyocr/FuzzyOcr.pm
@@ -0,0 +1,864 @@
+# FuzzyOcr plugin, version 2.3b
+# Changelog:
+# version 2.0
+# Replaced imagemagick with netpbm
+# Invoke giffix to fix broken gifs before conversion
+# Support png images
+# Analyze the file to detect the format without content-type
+# Added several configuration parameters
+# version 2.1
+# Added scoring for wrong content-type
+# Added scoring for broken gif images
+# Added configuration for helper applications
+# Added autodisable_score feature to disable the OCR engine if the message has already enough points
+# version 2.1b
+# Rule bugfix to avoid warnings
+# version 2.1c
+# Applied patch provided by Howard Kash to fix problems with spamassassin + Mailscanner + FuzzyOcr
+# Removed '-' from jpegtopnm arguments to provide backwards compatibility for older netpbm versions
+# Fixed typo (treshold -> threshold)
+# version 2.2
+# Small bugfix in content-type check for jpeg (jpg was not matching), thanks to Matthias Keller
+# Added more error handling
+# Removed debug files, added logfile instead
+# More messages with verbose = 2
+# version 2.3
+# Multiple scans with different pnm preprocessing and gocr arguments possible
+# Support for interlaced gifs
+# Support for animated gifs
+# Temporary file handling reorganized
+# External wordlist support
+# Personalized wordlist support
+# Spaces are now stripped from wordlist words and OCR results before matching
+# Experimental MD5 Database feature
+# version 2.3b
+# MD5 Database replaced by different feature database
+# Corrupted images are now handled better
+# Added a timeout function to avoid lockups
+# Added threshold overriding on word basis in wordlist
+# Various bugfixes
+#
+#
+# written by Christian Holler decoder_at_own-hero_dot_net
+
+# syslog support added by weasel, 2006-09-28
+#
+package FuzzyOcr;
+
+use strict;
+use warnings;
+use Mail::SpamAssassin;
+use Mail::SpamAssassin::Util;
+use Mail::SpamAssassin::Plugin;
+use Sys::Syslog;
+
+use String::Approx 'adistr';
+
+use FileHandle;
+use Fcntl ':flock';
+
+our @ISA = qw (Mail::SpamAssassin::Plugin);
+
+our @err_msges = (
+ "Failed to open pipe to external programs with pipe command \"%s\".
+Please check that all helper programs are installed and in the correct path.
+(Pipe Command \"%s\", Pipe exit code %d (\"%s\"), Temporary file: \"%s\")",
+ "Unexpected error in pipe to external programs.
+Please check that all helper programs are installed and in the correct path.
+(Pipe Command \"%s\", Pipe exit code %d (\"%s\"), Temporary file: \"%s\")",
+ "Cannot open \"%s\" to read previously produced data!
+(Previously used pipe: \"%s\", error code %d (\"%s\"), Temporary file: \"%s\")",
+ "Unexpected error while trying executing gocr with arguments \"%s\".
+Make sure the gocr location is specified correctly and the arguments are correct.",
+ "Failed to open global wordlist \"%s\" for reading.
+Please check that path and permissions are correct."
+);
+
+our @words = ();
+our $self;
+our $pms;
+
+# Default values
+our $threshold = "0.3";
+our $base_score = "4";
+our $add_score = "1";
+our $wctypescore = "1.5";
+our $cimgscore = "2.5";
+our $cimgscore2 = "5";
+our $countreq = 2;
+our $verbose = 1;
+our $timeout = 10;
+our $pre314 = 0;
+our $enable_image_hashing = 0;
+our $hashing_learn_scanned = 1;
+our ($ts, $th, $tw, $tcn, $tc, $hash_ccnt) = (0.01, 0.01, 0.01, 0.01, 5, 5);
+our $giffix = "/usr/bin/giffix";
+our $giftext = "/usr/bin/giftext";
+our $gifasm = "/usr/bin/gifasm";
+our $gifinter = "/usr/bin/gifinter";
+our $giftopnm = "/usr/bin/giftopnm";
+our $jpegtopnm = "/usr/bin/jpegtopnm";
+our $pngtopnm = "/usr/bin/pngtopnm";
+our $pnmfile = "/usr/bin/pnmfile";
+our $ppmhist = "/usr/bin/ppmhist";
+our $convert = "/usr/bin/convert";
+our $identify = "/usr/bin/identify";
+our $gocr = "/usr/bin/gocr";
+our $grep = "/bin/grep";
+our $max_images = 5;
+our $dscore = 10;
+our $logfile = "/etc/mail/spamassassin/FuzzyOcr.log";
+our $pwordlist = ".spamassassin/fuzzyocr.words";
+our $digest_db = "/etc/mail/spamassassin/FuzzyOcr.hashdb";
+our @scansets = (
+ '$gocr -i -',
+ '$gocr -l 180 -d 2 -i -'
+);
+
+# constructor: register the eval rule
+sub new {
+ my ( $class, $mailsa ) = @_;
+ $class = ref($class) || $class;
+ my $self = $class->SUPER::new($mailsa);
+ bless( $self, $class );
+ $self->register_eval_rule("fuzzyocr_check");
+ $self->register_eval_rule("dummy_check");
+ return $self;
+}
+
+sub parse_config {
+ my ( $self, $opts ) = @_;
+ if ( $opts->{key} eq "focr_global_wordlist" ) {
+ load_global_words( $opts->{value} );
+ }
+ elsif ( $opts->{key} eq "focr_personal_wordlist" ) {
+ $pwordlist = $opts->{value};
+ }
+ elsif ( $opts->{key} eq "focr_threshold" ) {
+ $threshold = $opts->{value};
+ }
+ elsif ( $opts->{key} eq "focr_base_score" ) {
+ $base_score = $opts->{value};
+ }
+ elsif ( $opts->{key} eq "focr_add_score" ) {
+ $add_score = $opts->{value};
+ }
+ elsif ( $opts->{key} eq "focr_corrupt_score" ) {
+ $cimgscore = $opts->{value};
+ }
+ elsif ( $opts->{key} eq "focr_corrupt_unfixable_score" ) {
+ $cimgscore2 = $opts->{value};
+ }
+ elsif ( $opts->{key} eq "focr_wrongctype_score" ) {
+ $wctypescore = $opts->{value};
+ }
+ elsif ( $opts->{key} eq "focr_counts_required" ) {
+ $countreq = $opts->{value};
+ }
+ elsif ( $opts->{key} eq "focr_verbose" ) {
+ $verbose = $opts->{value};
+ }
+ elsif ( $opts->{key} eq "focr_timeout" ) {
+ $timeout = $opts->{value};
+ }
+ elsif ( $opts->{key} eq "focr_scansets" ) {
+ parse_scansets( $opts->{value} );
+ }
+ elsif ( $opts->{key} eq "focr_pre314" ) {
+ $pre314 = $opts->{value};
+ }
+ elsif ( $opts->{key} eq "focr_bin_giffix" ) {
+ $giffix = $opts->{value};
+ }
+ elsif ( $opts->{key} eq "focr_bin_giftext" ) {
+ $giftext = $opts->{value};
+ }
+ elsif ( $opts->{key} eq "focr_bin_gifasm" ) {
+ $gifasm = $opts->{value};
+ }
+ elsif ( $opts->{key} eq "focr_bin_gifinter" ) {
+ $gifinter = $opts->{value};
+ }
+ elsif ( $opts->{key} eq "focr_bin_giftopnm" ) {
+ $giftopnm = $opts->{value};
+ }
+ elsif ( $opts->{key} eq "focr_bin_jpegtopnm" ) {
+ $jpegtopnm = $opts->{value};
+ }
+ elsif ( $opts->{key} eq "focr_bin_pngtopnm" ) {
+ $pngtopnm = $opts->{value};
+ }
+ elsif ( $opts->{key} eq "focr_bin_ppmhist" ) {
+ $ppmhist = $opts->{value};
+ }
+ elsif ( $opts->{key} eq "focr_bin_convert" ) {
+ $convert = $opts->{value};
+ }
+ elsif ( $opts->{key} eq "focr_bin_identify" ) {
+ $identify = $opts->{value};
+ }
+ elsif ( $opts->{key} eq "focr_bin_gocr" ) {
+ $gocr = $opts->{value};
+ }
+ elsif ( $opts->{key} eq "focr_bin_grep" ) {
+ $grep = $opts->{value};
+ }
+ elsif ( $opts->{key} eq "focr_gif_max_frames" ) {
+ $max_images = $opts->{value};
+ }
+ elsif ( $opts->{key} eq "focr_autodisable_score" ) {
+ $dscore = $opts->{value};
+ }
+ elsif ( $opts->{key} eq "focr_enable_image_hashing" ) {
+ $enable_image_hashing = $opts->{value};
+ }
+ elsif ( $opts->{key} eq "focr_digest_db" ) {
+ $digest_db = $opts->{value};
+ }
+ elsif ( $opts->{key} eq "focr_hashing_learn_scanned" ) {
+ $hashing_learn_scanned = $opts->{value};
+ }
+ elsif ( $opts->{key} eq "focr_logfile" ) {
+ $logfile = $opts->{value};
+ }
+}
+
+sub dummy_check {
+ return 0;
+}
+
+sub fuzzyocr_check {
+ ( $self, $pms ) = @_;
+ my $t = Mail::SpamAssassin::Timeout->new({ secs => $timeout });
+ $t->run(\&check_fuzzy_ocr);
+ if ($t->timed_out()) {
+ logfile("FuzzyOcr received timeout after running \"$timeout\" seconds.");
+ }
+ return 0;
+}
+
+sub load_global_words {
+ unless ( -r $_[0] ) {
+ handle_error( $err_msges[3], ( $_[0] ) );
+ return;
+ }
+ open WORDLIST, "<$_[0]";
+ while(<WORDLIST>) {
+ chomp($_);
+ if (( $_ =~ /^[ \t]*#.*$/ ) or ( $_ =~ /^[^a-zA-Z]$/ )) {
+ next;
+ }
+ $_ =~ s/[ \t]*#.*$//;
+ push( @words, $_ );
+ }
+ close WORDLIST;
+ return 1;
+}
+
+sub load_personal_words {
+ unless ( -e $_[0] ) {
+ debuglog("No personal wordlist found, skipping...");
+ return;
+ }
+ unless ( -r $_[0] ) {
+ debuglog(
+"Unable to read from wordlist \"$_[0]\", please make sure that permissions are correct."
+ );
+ return;
+ }
+ open WORDLIST, "<$_[0]";
+ while(<WORDLIST>) {
+ chomp($_);
+ if ( $_ =~ /^[ \t]*#.*$/ ) {
+ next;
+ }
+ $_ =~ s/[ \t]*#.*$//;
+ push( @words, $_ );
+ }
+ close WORDLIST;
+}
+
+sub parse_scansets {
+ $_[0] =~ s/,[ ]*/,/g;
+ @scansets = split( ',', $_[0]);
+ debuglog( "Set scansets to values:\n" . join( "\n", @scansets ) );
+ return 1;
+}
+
+sub max {
+ unless ( defined( $_[0] ) and defined( $_[1] ) ) { return 0 }
+ unless ( defined( $_[0] ) ) { return $_[1] }
+ unless ( defined( $_[1] ) ) { return $_[0] }
+ if ( $_[0] < $_[1] ) { return $_[1] }
+ else { return $_[0] }
+}
+
+sub reorder {
+ my $tmp = join( '', @_ );
+ return split( '\n', $tmp );
+}
+
+sub pipe_io {
+ $SIG{PIPE} = 'IGNORE';
+ my $pipecmd = shift;
+ my $input = shift;
+ my $filecount = 0;
+ my $silent = 0;
+ my $ignerror = 0;
+ my $tmpdir;
+ my @stdout = ();
+ my @stderr = ();
+ my ( $tmpfile, $tfilepath ) = Mail::SpamAssassin::Util::secure_tmpfile();
+ my ( $errfile, $efilepath ) = Mail::SpamAssassin::Util::secure_tmpfile();
+ close($tmpfile);
+ close($errfile);
+ if ($tmpfile eq $errfile) {
+ debuglog("Got same tmpfile twice! Aborting pipe_io() to avoid deadlocking");
+ return ( 1, \@stdout, \@stderr );
+ unlink($tmpfile);
+ }
+
+ if($pipecmd =~ /\$tmpdir/) {
+ $tmpdir = Mail::SpamAssassin::Util::secure_tmpdir();
+ $pipecmd =~ s/\$tmpdir/$tmpdir/g;
+ $filecount = shift;
+ } else {
+ $silent = shift;
+ $ignerror = shift;
+ }
+
+ $pipecmd =~ s/\$errfile/$errfile/g;
+ my $pipe_pid = open( PIPE_IN, "| $pipecmd 1>$tmpfile 2>>$errfile" );
+
+ unless ($pipe_pid) {
+ unless($silent) {
+ handle_error( $err_msges[0], ( $pipecmd, $? >> 8, $!, $tmpfile ) );
+ }
+ unlink($tmpfile);
+ unlink($errfile);
+ return ( $?, \@stdout, \@stderr );
+ }
+ flock( PIPE_IN, LOCK_EX );
+ print PIPE_IN $input;
+ flock( PIPE_IN, LOCK_UN );
+ close(PIPE_IN);
+ if ($? and not $ignerror) {
+ unless($silent) {
+ handle_error( $err_msges[1], ( $pipecmd, $? >> 8, $!, $tmpfile ) );
+ }
+ unlink($tmpfile);
+ unlink($errfile);
+ return ( $?, \@stdout, \@stderr );
+ }
+ if ($filecount) {
+ my $tsize = 0;
+ my $tcount = 0;
+ foreach my $nr (0..$filecount-1) {
+ my $filesize = 0;
+ if ($nr < 10) {
+ $filesize = -s "$tmpdir/out0$nr.gif";
+ } else {
+ $filesize = -s "$tmpdir/out$nr.gif";
+ }
+ if ($filesize > $tsize) {
+ $tsize = $filesize;
+ $tcount = $nr;
+ }
+ }
+ if ($tcount < 10) {
+ open( PIPE_OUT, "< $tmpdir/out0$tcount.gif" );
+ } else {
+ open( PIPE_OUT, "< $tmpdir/out$tcount.gif" );
+ }
+ flock( PIPE_OUT, LOCK_EX );
+ @stdout = <PIPE_OUT>;
+ flock( PIPE_OUT, LOCK_UN );
+ close PIPE_OUT;
+ foreach my $nr (0..$filecount) {
+ if ($nr < 10) {
+ unlink("$tmpdir/out0$nr.gif");
+ } else {
+ unlink("$tmpdir/out$nr.gif");
+ }
+ }
+ rmdir($tmpdir);
+ unlink($tmpfile);
+ unlink($errfile);
+ return ( 0, \@stdout, \@stderr );
+ } else {
+ unless (open( PIPE_OUT, "< $tmpfile" )
+ and open( PIPE_ERR, "< $errfile" ) )
+ {
+ unless($silent) {
+ handle_error( $err_msges[1], ( $pipecmd, $? >> 8, $!, $tmpfile ) );
+ }
+ unlink($tmpfile);
+ unlink($errfile);
+ return ( $?, \@stdout, \@stderr );
+ }
+ flock( PIPE_OUT, LOCK_EX );
+ flock( PIPE_ERR, LOCK_EX );
+ @stdout = <PIPE_OUT>;
+ @stderr = <PIPE_ERR>;
+ flock( PIPE_OUT, LOCK_UN );
+ flock( PIPE_ERR, LOCK_UN );
+ close(PIPE_OUT);
+ close(PIPE_ERR);
+ unlink($tmpfile);
+ unlink($errfile);
+ return ( 0, \@stdout, \@stderr );
+ }
+}
+
+sub handle_error {
+ my ( $err_msg, @var_vals ) = @_;
+ $err_msg = sprintf( $err_msg, @var_vals );
+ logfile($err_msg);
+}
+
+sub logfile {
+ my $logtext = $_[0];
+ my ( $sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst ) = localtime(time);
+ my $time = sprintf(
+ "%4d-%02d-%02d %02d:%02d:%02d",
+ $year + 1900,
+ $mon + 1, $mday, $hour, $min, $sec
+ );
+ #$logtext =~ s/\n/\n /g;
+ #unless ( open LOGFILE, ">> $logfile" ) {
+ # warn "Can't open $logfile for writing, check permissions";
+ #}
+ #flock( LOGFILE, LOCK_EX );
+ #seek( LOGFILE, 0, 2 );
+ #print LOGFILE "[$time] $logtext\n";
+ #flock( LOGFILE, LOCK_UN );
+ #close LOGFILE;
+ openlog 'SA-FuzzyOCR', 'pid', 'mail';
+ for my $line (split /\n/, $logtext) {
+ syslog 'info', $line;
+ }
+ closelog;
+}
+
+sub check_image_hash_db {
+ my $digest = $_[0];
+ my ($gpf, @gcf) = split('::', $digest);
+ my ($gs, $gh, $gw, $gcn) = split(':', $gpf);
+
+ unless(open(DB, "<$digest_db")) {
+ debuglog("No Image Hash database found at \"$digest_db\", or permissions wrong.");
+ return 0;
+ }
+ while(<DB>) {
+ chomp($_);
+ my ($score, $dpf, @dcf) = split('::', $_);
+ my ($ds, $dh, $dw, $dcn) = split(':', $dpf);
+ if ((abs($ds - $gs) / $gs) > $ts) { next; }
+ if ((abs($dh - $gh) / $gh) > $th) { next; }
+ if ((abs($dw - $gw) / $gw) > $tw) { next; }
+ if ((abs($dcn - $gcn) / $gcn) > $tcn) { next; }
+
+ my (@dcfs, @gcfs);
+ foreach (@dcf) {
+ push(@dcfs, split(':', $_));
+ }
+ foreach (@gcf) {
+ push(@gcfs, split(':', $_));
+ }
+ unless (scalar(@gcfs) eq scalar(@dcfs)) {
+ logfile("Error in database format, aborting...");
+ return 0;
+ }
+
+ foreach (0..scalar(@gcfs) - 1) {
+ if (abs($dcfs[$_] - $gcfs[$_]) > $tc) {
+ next;
+ }
+ }
+ return $score;
+ }
+ return 0;
+}
+
+sub add_image_hash_db {
+ my $digest = shift;
+ my $score = shift;
+ my $ret;
+ if (-e $digest_db) {
+ $ret = open(DB, ">> $digest_db");
+ } else {
+ $ret = open(DB, "> $digest_db");
+ debuglog("Image Hash Database not found to add hash, creating it...");
+ }
+ unless ($ret) {
+ logfile("Unable to open/create Image Hash database at \"$digest_db\", check permissions.");
+ return;
+ }
+ debuglog("Adding hash \"$digest\" to Image Hash database...");
+ flock( DB, LOCK_EX );
+ seek( DB, 0, 2 );
+ print DB "${score}::${digest}\n";
+ flock( DB, LOCK_UN );
+ close(DB);
+}
+
+sub calc_image_hash {
+ my ($rcode, $stdout_ref, $stderr_ref);
+ my $picdata = $_[0];
+ my ($hash, $h, $w);
+ my @ca = ( );
+ my $s = length ( $picdata );
+ ( $rcode, $stdout_ref, $stderr_ref ) = pipe_io("$identify -", $picdata);
+ foreach (@$stdout_ref) {
+ if ($_ =~ /([0-9]+)x([0-9]+)/) {
+ $h = $1;
+ $w = $2;
+ last;
+ }
+ }
+ if ($rcode) {
+ debuglog("Unable to calculate image hash, skipping...");
+ return ($rcode, $hash);
+ }
+ ( $rcode, $stdout_ref, $stderr_ref ) = pipe_io("$ppmhist -noheader", $picdata);
+ if ($rcode) {
+ debuglog("Unable to calculate image hash, skipping...");
+ return ($rcode, $hash);
+ }
+ my $cnt = 0;
+ my $c = scalar(@$stdout_ref);
+ if ($hash_ccnt) {
+ foreach (@$stdout_ref) {
+ $_ =~ s/ +/ /g;
+ my($r, $g, $b, $l, $c) = split(' ', $_);
+ push(@ca, "::$r:$g:$b:$l:$c");
+ $cnt++;
+ if ($cnt ge $hash_ccnt) {
+ last;
+ }
+ }
+ }
+ $hash = "$s:$h:$w:$c" . join('', @ca);
+ return(0, $hash);
+}
+
+sub debuglog {
+ if ( $verbose > 1 ) {
+ logfile("Debug mode: $_[0]");
+ }
+}
+
+sub wrong_ctype {
+ my ( $format, $ctype ) = @_;
+ if ($wctypescore) {
+ my $debuginfo = "";
+ if ( $verbose > 0 ) {
+ $debuginfo =
+ ("Image has format \"$format\" but content-type is \"$ctype\"");
+ debuglog($debuginfo);
+ }
+ for my $set ( 0 .. 3 ) {
+ $pms->{conf}->{scoreset}->[$set]->{"FUZZY_OCR_WRONG_CTYPE"} =
+ sprintf( "%0.3f", $wctypescore );
+ }
+ $pms->_handle_hit( "FUZZY_OCR_WRONG_CTYPE", $wctypescore, "BODY: ",
+ $pms->{conf}->{descriptions}->{FUZZY_OCR_WRONG_CTYPE}
+ . "\n$debuginfo" );
+ }
+}
+
+sub corrupt_img {
+ my ($unfixable, $err) = @_;
+ my $score = 0;
+ if ($unfixable) {
+ $score = $cimgscore2;
+ } else {
+ $score = $cimgscore;
+ }
+ if ($score) {
+ my $debuginfo = "";
+ if ( $verbose > 0 ) {
+ chomp($err);
+ $debuginfo = ("Corrupt image: $err");
+ debuglog($debuginfo);
+ }
+ for my $set ( 0 .. 3 ) {
+ $pms->{conf}->{scoreset}->[$set]->{"FUZZY_OCR_CORRUPT_IMG"} =
+ sprintf( "%0.3f", $score );
+ }
+ $pms->_handle_hit( "FUZZY_OCR_CORRUPT_IMG", $score, "BODY: ",
+ $pms->{conf}->{descriptions}->{FUZZY_OCR_CORRUPT_IMG}
+ . "\n$debuginfo" );
+ }
+}
+
+sub known_img_hash {
+ my $digest = shift;
+ my $score = shift;
+ my $debuginfo = "";
+ if ( $verbose > 0 ) {
+ $debuginfo = ("Hash \"$digest\" is in the database.");
+ debuglog($debuginfo);
+ }
+ for my $set ( 0 .. 3 ) {
+ $pms->{conf}->{scoreset}->[$set]->{"FUZZY_OCR_KNOWN_HASH"} =
+ sprintf( "%0.3f", $score );
+ }
+ $pms->_handle_hit( "FUZZY_OCR_KNOWN_HASH", $score, "BODY: ", $pms->{conf}->{descriptions}->{FUZZY_OCR_KNOWN_HASH} . "\n$debuginfo" );
+}
+
+sub check_fuzzy_ocr {
+ my @found = ();
+ my $image_type = 0;
+ my $picture_data;
+ my @hashes = ();
+ my $cnt = 0;
+ my $homedir = (getpwuid($<))[7];
+
+ debuglog("Starting FuzzyOcr...");
+ debuglog("Attempting to load personal wordlist...");
+
+ if ($homedir) {
+ load_personal_words( $homedir . "/$pwordlist" );
+ } elsif (defined($ENV{HOME})) {
+ load_personal_words( $ENV{HOME} . "/$pwordlist" );
+ } else {
+ debuglog("Variable \$ENV{HOME} not defined and getpwuid failed, personal wordlist function not available...");
+ }
+
+ foreach my $p ( $pms->{msg}->find_parts(qr/^image\b/i) ) {
+ my $cscore = $pms->get_score();
+ if ( $cscore > $dscore ) {
+ debuglog(
+ "Scan canceled, message has already more than $dscore points.");
+ return 0;
+ }
+ my $ctype = $p->{'type'};
+ if ( $ctype =~ /image/i ) {
+ debuglog("Analyzing file with content-type \"$ctype\"");
+ $picture_data = $p->decode();
+ my @used_scansets = ();
+ my $stdout_ref;
+ my $stderr_ref;
+ my $rcode = 0;
+ my $corrupt = 0;
+ my $digest;
+ if ( substr($picture_data,0,3) eq "\x47\x49\x46" ) {
+
+ if ( $ctype !~ /gif/i ) {
+ wrong_ctype( "GIF", $ctype );
+ }
+ $image_type = 1;
+ my $interlaced_gif = 0;
+ my $image_count = 0;
+
+ ( $rcode, $stdout_ref, $stderr_ref ) =
+ pipe_io( $giftext, $picture_data, 1, 1);
+
+ foreach (@$stdout_ref) {
+ unless ($interlaced_gif) {
+ if ( $_ =~ /Image is Interlaced/i ) {
+ $interlaced_gif = 1;
+ }
+ elsif ( $_ =~ /Image is Non Interlaced/i ) {
+ }
+ }
+ if ( $_ =~ /^Image #/ ) {
+ $image_count++;
+ }
+ }
+
+
+ if ($interlaced_gif or ($image_count gt 1)) {
+ debuglog("Image is interlaced or animated...");
+ }
+ else {
+ debuglog("Image is single non-interlaced...");
+ ( $rcode, $stdout_ref, $stderr_ref ) = pipe_io( "$giffix", $picture_data, 0, 1);
+ $picture_data = join('', @$stdout_ref);
+ }
+
+ foreach (@$stderr_ref) {
+ if ( $_ =~ /GIF-LIB error/i ) {
+ $corrupt = $_;
+ last;
+ }
+ }
+
+ if ($corrupt and ($interlaced_gif or ($image_count gt 1))) {
+ debuglog("Skipping corrupted interlaced image...");
+ corrupt_img(1, $corrupt);
+ next;
+ } elsif ($corrupt) {
+ unless($picture_data) {
+ debuglog("Uncorrectable corruption detected, skipping non-interlaced image...");
+ corrupt_img(1, $corrupt);
+ next;
+ }
+ debuglog("Image is corrupt, but seems fixable, continuing...");
+ corrupt_img(0, $corrupt);
+ }
+
+ if ($image_count gt 1) {
+ debuglog("File contains more than one image...");
+ if ($image_count lt $max_images) {
+ debuglog("Assembling images...");
+ ( $rcode, $stdout_ref, $stderr_ref ) = pipe_io("$convert - +append -", $picture_data);
+ if ($rcode) { next; };
+ $picture_data = join('', @$stdout_ref);
+ } elsif ($pre314 eq 0) {
+ debuglog("Image count exceeds limit, skipping some...");
+ ( $rcode, $stdout_ref, $stderr_ref ) = pipe_io("$gifasm -d \$tmpdir/out", $picture_data, $image_count);
+ if ($rcode) { next; };
+ $picture_data = join('', @$stdout_ref);
+ } else {
+ debuglog("Image count exceeds limit, but your version does not allow the required functions, skipping image...");
+ next;
+ }
+ }
+
+ if ($interlaced_gif) {
+ ( $rcode, $stdout_ref, $stderr_ref ) =
+ pipe_io(
+ "$gifinter -s | $giftopnm -", $picture_data );
+ if ($rcode) { next; }
+ }
+ else {
+ ( $rcode, $stdout_ref, $stderr_ref ) =
+ pipe_io( "$giftopnm -", $picture_data );
+ if ($rcode) { next; }
+ }
+ }
+ elsif ( substr($picture_data,0,2) eq "\xff\xd8" ) {
+ if ( $ctype !~ /jpe{0,1}g/i ) {
+ wrong_ctype( "JPEG", $ctype );
+ }
+ $image_type = 2;
+ ( $rcode, $stdout_ref, $stderr_ref ) =
+ pipe_io( "$jpegtopnm", $picture_data );
+ if ($rcode) { next; }
+ }
+ elsif ( substr($picture_data,0,4) eq "\x89\x50\x4e\x47" ) {
+ if ( $ctype !~ /png/i ) {
+ wrong_ctype( "PNG", $ctype );
+ }
+ $image_type = 3;
+ ( $rcode, $stdout_ref, $stderr_ref ) =
+ pipe_io( "$pngtopnm -", $picture_data );
+ if ($rcode) { next; }
+ }
+ else {
+ $image_type = 0;
+ debuglog(
+"Image type not recognized, unknown format. Skipping this image..."
+ );
+ next;
+ }
+
+ debuglog("Recognized file type: $image_type");
+
+ my @pnmdata = @$stdout_ref;
+ if($enable_image_hashing) {
+ debuglog("Calculating the image hash...");
+ ($rcode, $digest) = calc_image_hash(join('', @pnmdata));
+ if ($rcode) {
+ debuglog("Error calculating the image hash, skipping hash check...");
+ } else {
+ if (my $score = check_image_hash_db($digest)) {
+ debuglog("Image found in hash database, message is spam...");
+ debuglog("Scoring with known old score and ending...");
+ known_img_hash($digest, $score);
+ return 0;
+ }
+ }
+ debuglog("Hash not yet known to the database, saving for later db storage...");
+ push(@hashes, $digest);
+ } else {
+ debuglog("Image hashing disabled in configuration, skipping...");
+ }
+ my @ocr_results = ();
+
+ foreach my $scanset (@scansets) {
+ $scanset =~ s/\$gocr/$gocr/;
+ ( $rcode, $stdout_ref, $stderr_ref ) =
+ pipe_io( "$scanset", join( '', @pnmdata ), 1);
+
+ if ($rcode) {
+ debuglog(join( '', @$stderr_ref ));
+ debuglog(
+"Skipping scanset \"$scanset\" because of errors, trying next..."
+ );
+ next;
+ }
+
+ my @ocrdata = @$stdout_ref;
+ push( @ocr_results, [@ocrdata] );
+ push( @used_scansets, $scanset );
+ }
+ foreach my $w (@words) {
+ my $wthreshold;
+ if ($w =~ /^(.*?)::(0(\.\d+){0,1})/) {
+ ($w, $wthreshold) = ($1, $2);
+ } else {
+ $wthreshold = $threshold;
+ }
+ $w =~ s/[^a-zA-Z]//g;
+ $w = lc $w;
+ my $wcnt = 0;
+ my $gcnt = 0;
+ foreach my $ocr_set (@ocr_results) {
+ my $cwcnt = 0;
+ foreach (@$ocr_set) {
+ tr/!;|081/iiioal/;
+ s/[^a-zA-Z]//g;
+ $_ = lc;
+ my $matched = adistr( $w, $_ );
+ if ( abs($matched) < $wthreshold ) {
+ $cwcnt++;
+ debuglog(
+"Found word \"$w\" in line\n \"$_\" \n with fuzz of "
+ . abs($matched)
+ . " scanned with scanset $used_scansets[$gcnt]"
+ );
+ }
+ }
+ $wcnt = max( $wcnt, $cwcnt );
+ $gcnt++;
+ }
+ $cnt += $wcnt;
+ if ( ( $verbose > 0 ) and ($wcnt) ) {
+ push( @found, "\"$w\" in $wcnt lines" );
+ }
+ }
+ }
+ }
+ if ( $cnt >= $countreq ) {
+ my $score = ( $base_score + ( $cnt - $countreq ) * $add_score );
+ if($enable_image_hashing and $hashing_learn_scanned) {
+ debuglog("Message is spam (score $score), storing all image hashes in database...");
+ foreach (@hashes) {
+ add_image_hash_db($_, $score);
+ }
+ } else {
+ debuglog("Message is spam (score $score)...");
+ }
+ my $debuginfo = "";
+ if ( $verbose > 0 ) {
+ $debuginfo =
+ ( "Words found:\n"
+ . join( "\n", @found )
+ . "\n($cnt word occurrences found)" );
+ debuglog($debuginfo);
+ }
+ for my $set ( 0 .. 3 ) {
+ $pms->{conf}->{scoreset}->[$set]->{"FUZZY_OCR"} =
+ sprintf( "%0.3f", $score );
+ }
+ $pms->_handle_hit( "FUZZY_OCR", $score, "BODY: ",
+ $pms->{conf}->{descriptions}->{FUZZY_OCR} . "\n$debuginfo" );
+ }
+ debuglog("FuzzyOcr ending successfully...");
+ return 0;
+}
+
+1;
diff --git a/spamassassin/fuzzyocr/FuzzyOcr.words b/spamassassin/fuzzyocr/FuzzyOcr.words
new file mode 100644
index 0000000..77ebf33
--- /dev/null
+++ b/spamassassin/fuzzyocr/FuzzyOcr.words
@@ -0,0 +1,45 @@
+# Here we defined the words to scan for
+# Stock
+alert
+charts
+profit
+news::0.2
+breaking
+symbol
+alert
+stock
+investor
+international
+company
+money::0
+million
+thousand
+buy
+price::0.2
+trade
+target
+banking
+service
+recommendation
+# Pills
+viagra
+cialis
+xanax
+valium
+meridia
+zanaflex
+levitra
+medicine
+legal::0.2
+penis::0
+medication
+growth
+drugs
+pharmacy
+prescription
+# Misc
+click here
+software
+kunde::0.2
+volksbank
+sparkasse
diff --git a/spamassassin/fuzzyocr/INSTALL b/spamassassin/fuzzyocr/INSTALL
new file mode 100644
index 0000000..672e37d
--- /dev/null
+++ b/spamassassin/fuzzyocr/INSTALL
@@ -0,0 +1,119 @@
+Installation manual for FuzzyOcr 2.3:
+
+1. Dependencies you require for this plugin to work
+
+ Before starting, also make sure to read the OS/distribution specific notes at the end of this section.
+
+ 1.1 Spamassassin 3.x
+
+ This plugin requires Spamassassin 3.x. Using it on version 2.x is not supported and might fail.
+ At least one function in this plugin requires Spamassassin 3.1.4, if you do not have this version,
+ don't forget to set the "focr_pre314" option in the FuzzyOcr.cf file.
+
+ 1.2 NetPBM tools
+
+ Install the NetPBM tools (http://netpbm.sourceforge.net/). If you don't install the binaries in /usr/bin,
+ please make sure to adjust the FuzzyOcr.cf to point to the correct binaries.
+
+ 1.3 ImageMagick
+
+ At least one feature requires the convert binary from imagemagick (http://www.imagemagick.org/).
+ Again, make sure the configuration file points to the convert binary, if not placed in /usr/bin.
+
+ 1.4 Giflib (also known as libungif)
+
+ Several tools from this package are required, see (http://sourceforge.net/projects/libungif).
+ Attention: the giftext binary from this package has a bug which can cause segfaults.
+ On the download page, a source patch is provided which fixes this.
+
+ 1.5 Gocr
+ For OCR recognition, gocr (http://jocr.sourceforge.net/) must be installed.
+ Attention: the gocr binary has a bug which can cause segfaults with specific images.
+ On the download page, a source patch is provided which fixes this.
+
+ 1.6 Perl modules:
+ These perl modules are required:
+ Digest::MD5
+ String::Approx
+
+ Notes for Fedora Core 5 (or higher) users: The package libungif-utils provides the necessary libungif binaries.
+ Notes for other Redhat/FC users: The packages libungif and libungif-progs should be installed.
+ Notes for Debian users: The package libungif-bin provides the necessary libungif binaries.
+
+ Notes for Slackware users: I have no clue about this distro, but Andy Lyttle sent me a mail about it:
+
+ "Slackware doesn't currently have a libungif-utils/progs/bin package, and the libungif package does not include the binaries such as giffix. So, you have to hack it a bit.
+
+ 1. Download (or copy from CD) the /source/l/libungif directory, don't untar anything
+ 2. Edit the libungif.SlackBuild and comment out this line:
+ # I don't believe we need all this slop. Correct me if I'm wrong.
+ rm -rf $PKG/usr/bin
+ 3. Run "sh libungif.SlackBuild"
+ 4. Uninstall the libungif package, if it's already installed
+ 5. Look in /tmp, and install the new libungif package there"
+
+ Notes for Gentoo users: All dependencies except the perl modules can be installed via portage. But because of the bugs in giftext and gocr,
+ you might need to write an ebuild which uses the two patches found on my download page. The perl modules can easily be
+ installed with gcpan.
+
+
+2. Installing the plugin:
+
+ 2.1. Installing the required files
+
+ Put the FuzzyOcr.cf and the FuzzyOcr.pm files into /etc/mail/spamassassin.
+ The FuzzyOcr.cf file already contains a line to load the plugin, if you want to put the .pm file in a different location,
+ change this line accordingly.
+ Create a wordlist file, a sample wordlist is shipped with this release, and put it also in /etc/mail/spamassassin.
+
+ 2.2 Necessary configuration
+
+ Open the FuzzyOcr.cf. Make sure that you specify a writable file as a logfile, or a directory where the plugin can write to,
+ so it can create the logfile itself. Also make sure that you specify a correct file as global wordlist.
+ With these two adjustments, FuzzyOcr is already to work.
+
+ 3. Further adjustments
+
+ 3.1. Enabling the image hash database
+
+ Set focr_enable_image_hashing to 1 in the config file, and make sure that focr_digest_db points to a writable file/directory.
+ You can also create this file yourself if you like. By default, all images recognized as spam, are added
+ to this database automatically. The score is saved as well and reused later again.
+
+ 3.2 Tweaking Scansets
+
+ Everyone gets different image spam, and most times, one method to scan is not successful with all types of spam you get.
+ That's where the focr_scansets setting can help you. This setting takes a comma seperated list of scansets.
+ Each scanset starts with the name of a program, followed by either other programs connected with pipes, or nothing anymore.
+ The only important thing is that input for this "program chain" is a picture in the PNM format, and the output is ASCII text.
+
+ An example might clarify this:
+ focr_scanset gocr -i -
+
+ This will do a single scan with gocr default settings.
+
+ focr_scanset pnminvert | gocr -i -
+
+ This will use pnminvert on the image and then do the scan.
+
+ focr_scanset gocr -i -, gocr -l 180 -i -
+
+ This will do 2 scans, one with the default settings, and the second one with a modified -l value.
+
+ You are now free to select which scansets get you the most spam, but don't pick too many, as this will also use more resources.
+
+ Here are some hints: -pnminvert or pnmquant are useful with white text or text with many colors
+ -If you get images which are littered with small dots/lines, try -d 2 as an argument to gocr
+ -The -l setting often helps, try values like 180, 140, or 100
+
+ Two syntax remarks: -Instead of writing "gocr", write "$gocr" as this will be replaced with the correct path to your gocr binary.
+ -If you invoke custom binaries (like pnminvert for example), you can redirect the stderr output by using:
+ "pnminvert 2>>$errfile"
+ If the scanset fails then, and debug logging is enabled, you will see this stderr output in the logfile :)
+
+ I know this seems confusing for some, but if this is unclear somehow, feel free to write an email to the list.
+
+
+And now, where it gets most thrilling...
+
+To be continued...
diff --git a/spamassassin/fuzzyocr/LICENSE b/spamassassin/fuzzyocr/LICENSE
new file mode 100644
index 0000000..d645695
--- /dev/null
+++ b/spamassassin/fuzzyocr/LICENSE
@@ -0,0 +1,202 @@
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+ APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "[]"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+ Copyright [yyyy] [name of copyright owner]
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
diff --git a/spamassassin/fuzzyocr/README.weasel b/spamassassin/fuzzyocr/README.weasel
new file mode 100644
index 0000000..57ca565
--- /dev/null
+++ b/spamassassin/fuzzyocr/README.weasel
@@ -0,0 +1,2 @@
+Downloaded September 2006 from
+http://users.own-hero.net/~decoder/fuzzyocr/fuzzyocr-2.3b.tar.gz
diff --git a/spamassassin/fuzzyocr/samples/README b/spamassassin/fuzzyocr/samples/README
new file mode 100644
index 0000000..98370c4
--- /dev/null
+++ b/spamassassin/fuzzyocr/samples/README
@@ -0,0 +1,61 @@
+These eml files are sample spam emails to test your installation of FuzzyOCR. Assuming you are using the default settings, the output you get should match the output listed here.
+
+Use spamassassin -t < samplefile.eml to test :)
+
+corrupted-gif.eml: Contains a corrupted gif image, additionally I changed the content-type to jpeg, so the output should show:
+
+ 1.5 FUZZY_OCR_WRONG_CTYPE BODY: Mail contains an image with wrong
+ content-type set
+ Image has format "GIF" but content-type is
+ "image/jpeg"
+ 5.0 FUZZY_OCR_CORRUPT_IMG BODY: Mail contains a corrupted image
+ Corrupt image: GIF-LIB error: Image is
+ defective, decoding aborted.
+ 10 FUZZY_OCR BODY: Mail contains an image with common spam text inside
+ Words found:
+ "stock" in 2 lines
+ "investor" in 1 lines
+ "company" in 1 lines
+ "price" in 2 lines
+ "trade" in 1 lines
+ "service" in 1 lines
+ (8 word occurrences found)
+
+animated-gif.eml: Contains an animated gif with four frames. Both with default settings and with "focr_gif_max_frames 3" this should output:
+
+ 10 FUZZY_OCR BODY: Mail contains an image with common spam text inside
+ Words found:
+ "stock" in 2 lines
+ "company" in 3 lines
+ "trade" in 1 lines
+ "penis" in 1 lines
+ "growth" in 1 lines
+ (8 word occurrences found)
+
+Note: Please verify that this is the output both with the setting mentioned and without, because with this setting, a different test is used.
+
+jpeg.eml: Contains a jpeg file. Output should show:
+
+ 6.0 FUZZY_OCR BODY: Mail contains an image with common spam text inside
+ Words found:
+ "viagra" in 2 lines
+ "cialis" in 1 lines
+ "levitra" in 1 lines
+ (4 word occurrences found)
+
+png.eml: Contains a png file. Output should show:
+
+ 24 FUZZY_OCR BODY: Mail contains an image with common spam text inside
+ Words found:
+ "stock" in 1 lines
+ "investor" in 3 lines
+ "company" in 2 lines
+ "money" in 1 lines
+ "buy" in 1 lines
+ "price" in 6 lines
+ "trade" in 2 lines
+ "service" in 2 lines
+ "software" in 2 lines
+ "levitra" in 1 lines
+ "legal" in 1 lines
+ (22 word occurrences found)
diff --git a/spamassassin/fuzzyocr/samples/animated-gif.eml b/spamassassin/fuzzyocr/samples/animated-gif.eml
new file mode 100644
index 0000000..f9637c1
--- /dev/null
+++ b/spamassassin/fuzzyocr/samples/animated-gif.eml
@@ -0,0 +1,579 @@
+Return-Path: <jacuwoqfkhu@europe.eds.com>
+X-Original-To: decoder@mindfields.own-hero.net
+Delivered-To: decoder@mindfields.own-hero.net
+Received: by mindfields.own-hero.net (Postfix, from userid 500)
+ id 5A723120C1BB; Tue, 22 Aug 2006 06:05:16 +0200 (CEST)
+X-Spam-Checker-Version: SpamAssassin 3.1.3-gr0 (2006-06-01) on
+ mindfields.own-hero.net
+X-Spam-Level: *
+X-Spam-Status: No, score=1.7 required=5.0 tests=DATE_IN_PAST_06_12,
+ EXTRA_MPART_TYPE,HTML_MESSAGE,TW_WY,TW_YX autolearn=disabled
+ version=3.1.3-gr0
+X-Spam-Report:
+ * 0.8 EXTRA_MPART_TYPE Header has extraneous Content-type:...type= entry
+ * 0.7 DATE_IN_PAST_06_12 Date: is 6 to 12 hours before Received: date
+ * 0.1 TW_WY BODY: Odd Letter Triples with WY
+ * 0.1 TW_YX BODY: Odd Letter Triples with YX
+ * 0.0 HTML_MESSAGE BODY: HTML included in message
+Received: from fmmailgate02.web.de (fmmailgate02.web.de [217.72.192.227])
+ by mindfields.own-hero.net (Postfix) with ESMTP id A0059120C1B7
+ for <decoder@own-hero.net>; Tue, 22 Aug 2006 06:05:08 +0200 (CEST)
+Received: from mx31.web.de (mx31.dlan.cinetic.de [172.20.6.155])
+ by fmmailgate02.web.de (Postfix) with ESMTP id 4E9C915A8190
+ for <decoder@own-hero.net>; Tue, 22 Aug 2006 06:04:44 +0200 (CEST)
+Received: from [63.245.85.242] (helo=[63.245.85.242])
+ by mx31.web.de with esmtp (WEB.DE 4.107 #114)
+ id 1GFNVG-0008NZ-00
+ for christian_holler@web.de; Tue, 22 Aug 2006 06:04:40 +0200
+Received: from [63.245.85.242] (helo=[63.245.85.242])
+ by [63.245.85.242] with smtp (Exim 4.43)
+ id VKBWE-SZHY-NRO; Mon, 21 Aug 2006 23:03:24 +0500
+Message-ID: <001301c6c59f$ea022980$f255f53f@seguridad>
+From: "Contains Closed" <jacuwoqfkhu@europe.eds.com>
+To: christian_holler@web.de
+Subject: Largest Wireless
+Date: Mon, 21 Aug 2006 23:03:24 +0500
+MIME-Version: 1.0
+Content-Type: multipart/related;
+ type="multipart/alternative";
+ boundary="----=_NextPart_000_000F_01C6C576.012C2180"
+X-Priority: 3
+X-MSMail-Priority: Normal
+X-Mailer: Microsoft Outlook Express 6.00.2800.1106
+X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2800.1106
+X-WEBDE-FORWARD: christian_holler@web.de -> decoder@own-hero.net
+
+------=_NextPart_000_000F_01C6C576.012C2180
+Content-Type: multipart/alternative;
+ boundary="----=_NextPart_001_0010_01C6C576.012C2180"
+
+
+------=_NextPart_001_0010_01C6C576.012C2180
+Content-Type: text/plain;
+ charset="windows-1250"
+Content-Transfer-Encoding: quoted-printable
+
+
+CSS MySQL dangerous myself glad switched sites learning do. kind =
+products Excel Mac somewhat amazing among team addon fulfilled thinking =
+rejoicing job making us.neuro Says: Nothing around.I themes for. kwyxz =
+aware Wordpress discuss way.I you. Dave. Todd none. constant wishing =
+bro.I grown shudder Apart Movable Type.That said please Those wonderful =
+helping thousands Nora Gatine Yikes stunned package. luck Japanese =
+Paris. When sister
+fuel fire. Yesterday quotAll Things
+CHOKOLATE GHOST WORL CLOCKWORK
+Foreign Relations destroys Americas roots: September marks Week seven
+Basically corporate bear free. run. gentleman house primarily
+writers happy result. unlike unusual STABLE site. trying find monstrous =
+headache place. reasons addresses tend disappear speak publicly urge =
+guestto claims going steal titles. easily course. pirated. advance soon =
+discover amount hassle order somewhere excepting Libraryis hardly =
+effort. shape prepared formats. software already.
+Isles started attracted also. But... but... Nonsense Between remember =
+selling muchwere higher. precise: compared interim Well obviously cant =
+seems explains absurd claim somehow novels guarantee delighted spurt =
+noting Heart Darkness pattern. appeared copies. dramatic mere increased =
+declining Before move emphasize HARD FIGURES. stress quothard arguing =
+debate NEVER figures. Harlan Ellison screams quotLost piracybut best =
+knowledge tried true. endlessly pirated quotmust is. hurt. willare =
+convince different analogy captures reality better. Anyone bought carnew =
+usedknows perfectly
+Painting Religion Life Starving Genius Hour Living Chemistry Pictures =
+Places
+Delays XaRk Phil Hello Seahorse Aeroplano zoe Cosmetics Flaming Lips =
+Nortec NUDE Cosmonova
+GUSTAVO CERATI AUSTIN AZUL VIOLETA SIX MILLION DOLLAR WEIRDO TURBO
+MACHINES MASSIVE ATTACK RADIOHEAD SMITHS SMASHING PUMKINS RAPTURE WEEZER =
+MARS VOLTA
+Sigh Fucked World Political Ranting Too Caffeine
+location satirical Hobbit turns
+mostly
+Jo... paragraph sidebar. Counter A:hover
+pirated. advance soon discover amount hassle order somewhere excepting =
+Libraryis hardly effort. shape prepared formats. software already. Try =
+finding ANY looked sloppy editions miserable read. yet... despite seen =
+yourself instances strong
+grey.Do iPods downI players loud. heavy metal asleep. seriously stare =
+blankly wry smile.Do disembark firstI Asians carriage straight seat =
+find... bowl process. hogI hate seats. variety ways: middle bag =
+better...
+audience. Most pass cases dont really writer arent willing keep
+looking WebPage Graphical Hit
+Release Rocket Pocket
+legs clearance inside
+Colophon manifesto Outside
+Hey unasa nosotros gustar estoy viendo placebo tambin
+FOBIA CHETES ELIS
+elected partly backlash politics
+gesturing Such check empty
+Boones Farm
+year. hide faults arguments twoparty coalition been papering
+OTRO PLOMOS FATALIST DISIDENTE SULLIVANS
+skinny knee front. quietAnd shut mean. shove. Reduce domain. services. =
+rorted
+Myszoor
+Engine SNES Nostalgia Dreamcast
+------=_NextPart_001_0010_01C6C576.012C2180
+Content-Type: text/html;
+ charset="windows-1250"
+Content-Transfer-Encoding: quoted-printable
+
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<HTML><HEAD>
+<META http-equiv=3DContent-Type content=3D"text/html; =3D
+charset=3Dwindows-1250">
+<META content=3D"MSHTML 6.00.2800.1106" name=3DGENERATOR>
+<STYLE></STYLE>
+</HEAD>
+<BODY bgColor=3D#ffffff>
+<DIV align=3Dcenter><FONT face=3DArial size=3D2>
+<IMG alt=3D""
+hspace=3D0 src=3D"cid:000e01c6c59f$ea022980$f255f53f@seguridad"
+align=3Dbaseline
+border=3D0></FONT></DIV>
+<DIV align=3Dleft><FONT face=3DArial size=3D2>CSS MySQL dangerous myself =
+glad switched sites learning do. kind products Excel Mac somewhat =
+amazing among team addon fulfilled thinking rejoicing job making =
+us.neuro Says: Nothing around.I themes for. kwyxz aware Wordpress =
+discuss way.I you. Dave. Todd none. constant wishing bro.I grown shudder =
+Apart Movable Type.That said please Those wonderful helping thousands =
+Nora Gatine Yikes stunned package. luck Japanese Paris. When =
+sister</FONT></DIV>
+<DIV align=3Dleft><FONT face=3DArial size=3D2>fuel fire. Yesterday =
+quotAll Things</FONT></DIV>
+<DIV align=3Dleft><FONT face=3DArial size=3D2>CHOKOLATE GHOST WORL =
+CLOCKWORK</FONT></DIV>
+<DIV align=3Dleft><FONT face=3DArial size=3D2>Foreign Relations destroys =
+Americas roots: September marks Week seven</FONT></DIV>
+<DIV align=3Dleft><FONT face=3DArial size=3D2>Basically corporate bear =
+free. run. gentleman house primarily</FONT></DIV>
+<DIV align=3Dleft><FONT face=3DArial size=3D2>writers happy result. =
+unlike unusual STABLE site. trying find monstrous headache place. =
+reasons addresses tend disappear speak publicly urge guestto claims =
+going steal titles. easily course. pirated. advance soon discover amount =
+hassle order somewhere excepting Libraryis hardly effort. shape prepared =
+formats. software already.</FONT></DIV>
+<DIV align=3Dleft><FONT face=3DArial size=3D2>Isles started attracted =
+also. But... but... Nonsense Between remember selling muchwere higher. =
+precise: compared interim Well obviously cant seems explains absurd =
+claim somehow novels guarantee delighted spurt noting Heart Darkness =
+pattern. appeared copies. dramatic mere increased declining Before move =
+emphasize HARD FIGURES. stress quothard arguing debate NEVER figures. =
+Harlan Ellison screams quotLost piracybut best knowledge tried true. =
+endlessly pirated quotmust is. hurt. willare convince different analogy =
+captures reality better. Anyone bought carnew usedknows =
+perfectly</FONT></DIV>
+<DIV align=3Dleft><FONT face=3DArial size=3D2>Painting Religion Life =
+Starving Genius Hour Living Chemistry Pictures Places</FONT></DIV>
+<DIV align=3Dleft><FONT face=3DArial size=3D2>Delays XaRk Phil Hello =
+Seahorse Aeroplano zoe Cosmetics Flaming Lips Nortec NUDE =
+Cosmonova</FONT></DIV>
+<DIV align=3Dleft><FONT face=3DArial size=3D2>GUSTAVO CERATI AUSTIN AZUL =
+VIOLETA SIX MILLION DOLLAR WEIRDO TURBO</FONT></DIV>
+<DIV align=3Dleft><FONT face=3DArial size=3D2>MACHINES MASSIVE ATTACK =
+RADIOHEAD SMITHS SMASHING PUMKINS RAPTURE WEEZER MARS VOLTA</FONT></DIV>
+<DIV align=3Dleft><FONT face=3DArial size=3D2>Sigh Fucked World =
+Political Ranting Too Caffeine</FONT></DIV>
+<DIV align=3Dleft><FONT face=3DArial size=3D2>location satirical Hobbit =
+turns</FONT></DIV>
+<DIV align=3Dleft><FONT face=3DArial size=3D2>mostly</FONT></DIV>
+<DIV align=3Dleft><FONT face=3DArial size=3D2>Jo... paragraph sidebar. =
+Counter A:hover</FONT></DIV>
+<DIV align=3Dleft><FONT face=3DArial size=3D2>pirated. advance soon =
+discover amount hassle order somewhere excepting Libraryis hardly =
+effort. shape prepared formats. software already. Try finding ANY looked =
+sloppy editions miserable read. yet... despite seen yourself instances =
+strong</FONT></DIV>
+<DIV align=3Dleft><FONT face=3DArial size=3D2>grey.Do iPods downI =
+players loud. heavy metal asleep. seriously stare blankly wry smile.Do =
+disembark firstI Asians carriage straight seat find... bowl process. =
+hogI hate seats. variety ways: middle bag better...</FONT></DIV>
+<DIV align=3Dleft><FONT face=3DArial size=3D2>audience. Most pass cases =
+dont really writer arent willing keep</FONT></DIV>
+<DIV align=3Dleft><FONT face=3DArial size=3D2>looking WebPage Graphical =
+Hit</FONT></DIV>
+<DIV align=3Dleft><FONT face=3DArial size=3D2>Release Rocket =
+Pocket</FONT></DIV>
+<DIV align=3Dleft><FONT face=3DArial size=3D2>legs clearance =
+inside</FONT></DIV>
+<DIV align=3Dleft><FONT face=3DArial size=3D2>Colophon manifesto =
+Outside</FONT></DIV>
+<DIV align=3Dleft><FONT face=3DArial size=3D2>Hey unasa nosotros gustar =
+estoy viendo placebo tambin</FONT></DIV>
+<DIV align=3Dleft><FONT face=3DArial size=3D2>FOBIA CHETES =
+ELIS</FONT></DIV>
+<DIV align=3Dleft><FONT face=3DArial size=3D2>elected partly backlash =
+politics</FONT></DIV>
+<DIV align=3Dleft><FONT face=3DArial size=3D2>gesturing Such check =
+empty</FONT></DIV>
+<DIV align=3Dleft><FONT face=3DArial size=3D2>Boones Farm</FONT></DIV>
+<DIV align=3Dleft><FONT face=3DArial size=3D2>year. hide faults =
+arguments twoparty coalition been papering</FONT></DIV>
+<DIV align=3Dleft><FONT face=3DArial size=3D2>OTRO PLOMOS FATALIST =
+DISIDENTE SULLIVANS</FONT></DIV>
+<DIV align=3Dleft><FONT face=3DArial size=3D2>skinny knee front. =
+quietAnd shut mean. shove. Reduce domain. services. rorted</FONT></DIV>
+</BODY></HTML>
+
+------=_NextPart_001_0010_01C6C576.012C2180--
+
+------=_NextPart_000_000F_01C6C576.012C2180
+Content-Type: image/gif;
+ name="PILOTS.gif"
+Content-Transfer-Encoding: base64
+Content-ID: <000e01c6c59f$ea022980$f255f53f@seguridad>
+
+R0lGODlhxQHnAocAAAAAAIAAAACAAICAAAAAgIAAgACAgMDAwMDcwKbK8EAgAGAgAIAgAKAg
+AMAgAOAgAABAACBAAEBAAGBAAIBAAKBAAMBAAOBAAABgACBgAEBgAGBgAIBgAKBgAMBgAOBg
+AACAACCAAECAAGCAAICAAKCAAMCAAOCAAACgACCgAECgAGCgAICgAKCgAMCgAOCgAADAACDA
+AEDAAGDAAIDAAKDAAMDAAODAAADgACDgAEDgAGDgAIDgAKDgAMDgAODgAAAAQCAAQEAAQGAA
+QIAAQKAAQMAAQOAAQAAgQCAgQEAgQGAgQIAgQKAgQMAgQOAgQABAQCBAQEBAQGBAQIBAQKBA
+QMBAQOBAQABgQCBgQEBgQGBgQIBgQKBgQMBgQOBgQACAQCCAQECAQGCAQICAQKCAQMCAQOCA
+QACgQCCgQECgQGCgQICgQKCgQMCgQOCgQADAQCDAQEDAQGDAQIDAQKDAQMDAQODAQADgQCDg
+QEDgQGDgQIDgQKDgQMDgQODgQAAAgCAAgEAAgGAAgIAAgKAAgMAAgOAAgAAggCAggEAggGAg
+gIAggKAggMAggOAggABAgCBAgEBAgGBAgIBAgKBAgMBAgOBAgABggCBggEBggGBggIBggKBg
+gMBggOBggACAgCCAgECAgGCAgICAgKCAgMCAgOCAgACggCCggECggGCggICggKCggMCggOCg
+gADAgCDAgEDAgGDAgIDAgKDAgMDAgODAgADggCDggEDggGDggIDggKDggMDggODggAAAwCAA
+wEAAwGAAwIAAwKAAwMAAwOAAwAAgwCAgwEAgwGAgwIAgwKAgwMAgwOAgwABAwCBAwEBAwGBA
+wIBAwKBAwMBAwOBAwABgwCBgwEBgwGBgwIBgwKBgwMBgwOBgwACAwCCAwECAwGCAwICAwKCA
+wMCAwOCAwACgwCCgwECgwGCgwICgwKCgwMCgwOCgwADAwCDAwEDAwGDAwIDAwKDAwP/78KCg
+pICAgP8AAAD/AP//AAAA//8A/wD//////yH5BAATAAAALAAAAADFAecCBwj+AP8JHEiwoMGD
+CBMqXMiwocOHECNKnEixosWLGDNq3Mixo8ePIEOKHEmypMmTKFOqXMmypcuXMGPKnEmzps2b
+OHPq3Mmzp8+fQIMKHUq0qNGjSJMqXcq0qdOnUKNKnUq1qtWrWLNq3cq1q9evYMOKHUu2rNmz
+aNOqXcu2rdu3cOPKnUu3rt27ePPq3cu3r9+/gAMLHky4sOHDiBMrXsy4sePHkCNLnky5suXL
+mDNr3sy5s+fPoEOLHk26tOnTqFOrXs26tevXsGPLnk27tu3buHPr3s27t+/fwIMLH068uPHj
+yJMrX868ufPn0KNLn069uvXr2LNr3869u/fv4MP+ix9Pvrz58+jTq1/Pvr379/Djy59Pv779
++/jz69/Pv7///wAGKOCABBZo4IEIJqjgggw26OCDEEYo4YQUVmjhhRhmqOGGHHbo4Ycghiji
+iCSWaOKJKKao4oostujiizDGKOOMNNZo44045qjjjjz26OOPQAYp5JBEFmnkkUgmqeSSTDbp
+5JNQRinllFRWaeWVWGap5ZZcdunll2CGKeaYZJZp5plopqnmmmy26eabcMYp55x01mnnnXjm
+qeeefPbp55+ABirooIQWauihiCaq6KKMNuroo5BGKumklFZq6aWYZgpYN5p26umnoIYq6qik
+lmrqqaimquqqrLbq6qv/sMYq66y01mrrrbjmquuuvPbq66/ABgsRGcIWa+yxLWKB7LLMNuvs
+s9BGK+201Fa7pB7WZqvtttx2621yn3wr7rjklmvuueimq+667Lbr7rvwxivvvPQGdk69+Lp5
+Q7789uvvv8gxAPDABBds8MEIJ6zwwgw37PDDEEcs8cQUV2zxxRhnrPHGHPf2DrIfGxtysSOT
+fGzJwaKc8skdt+zyyzDH3FMsMtds880456zzzjz37PPPQAct9NBEF2300UgnrfTSTDft9NNQ
+Ry311FRXbfXVWGet9dZcd+3112CHLfbYZJdt9tlop6322my37XZBAMQt99x0x/323Xjnrffe
+/t5CwrfCTfwt+OCEF2744YgnrvjijDfu+OOQRy755JRXbvnlmGeu+eacd+7556CHLvropJdu
++umop6766qy37vrrwOEB++y012777bjnrvvuvPfu++/ABy/88MQXb/zxyCev/PLM/1hA89BH
+L/301Fdv/fXYZ6/99tx37/334Icv/vjkl2/++einr/767LfvPle1vC///PTXb//9+Oev//78
+968fP/4LoAAHSMACGvCACEygAhfIwAY68IEQjKAEJ0jBClowUde4oAY3yMEOevCDIAyhCEdI
+whKa8IQoTKEKV8jCFoLKCS6MoQxnSMMa2vCGOMyhDnfIwx768IdAXAyiEIdIxCIa8YhITKIS
+lxigWTDxiVCM4gwNIMUqWvGKWMyiFrfIRdG4o4tgDKMYx0jGMpqxSnVLoxrXyMY2uvGNcIyj
+HOdIxzra8Y54zKMe98jHPvrxj4CMW0AAACH5BAAMAAAALAAAAADFAecCBwj+AP8JHEiwoMGD
+CBMqXMiwocOHECNKnEixosWLGDNq3Mixo8ePIEOKHEmypMmTKFOqXMmypcuXMGPKnEmzps2b
+OHPq3Mmzp8+fQIMKHUq0qNGjSJMqXcq0qdOnUKNKnUq1qtWrWLNq3cq1q9evYMOKHUu2rNmz
+aNOqXcu2rdu3cOPKnUu3rt27ePPq3cu3r9+/gAMLHky4sOHDiBMrXsy4sePHkCNLnky5suXL
+mDPb7Ka5s+fPQjmDHk26tOnTqFOrXs26tevXsGPLnk27tu3buHPr9pxot+/fwIMLH068uPHj
+yJMrX868ufPn0KNLn069unXPl65r3869u/fv4MP+ix9Pvrz58+jTq1/Pvr379/Djy59Pv779
++/jz69/Pv7///wAGKOCABBZo4IEIJqjgggw26OCDEEYo4YQUVmjhhRhmqOGGHHbo4Ycghiji
+iCSWaOKJKKao4oostujiizDGKOOMNNZo44045qjjjjz26OOPQAYp5JBEFmnkkUgmqeSSTDbp
+5JNQRinllFRWaeWVWGap5ZZHMcLll2CGKeaYZJZp5plopqnmmmy26eabcMYp55x01mnnnXjm
+qeeefPbp55+ABirooIQWauihiCaq6KKMNuroo5BGKumklFZq6aWYZqrpppx26umnoIYq6qik
+lmrqqaimquqqiCbA6qv/sMYq66y01mrrrbjmquuuvPbq66/ABivssMQWa+yxyCar7LLMNkvj
+O85GK+201FZr7bXYZqvtttx26+234IYr7rjklmvuueimq+667Lbr7rvwxivvvPTWa++9+Oar
+77789uvvvwAHLPDABBds8MEIJ6zwwgw37PDDEEcs8cQUV2zxxRhnrPHGHHfs8ccghyzyyCSX
+bPLJKKes8sost+zyyzDHLPPMNNds880456zzzjz37PN+S/ws9NBEF2300UgnrfTSTDft9NNQ
+Ry311FRXbfXVWM+lTtZcd+3112CHLfbYZJdt9tlop6322my37fbbcMct99x012333Xjnrffe
+/nz33XIj0gIe+ODRCl444c4anrjfjDfu+OOQRy755JRL90LlmGeu+eacd+55pnZ8Ljrml49u
++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
+0AZ90Aid0Aq90Azd0A790BAd0RI90RRd0RZ90Rid0Rq90Rzd0R790SAd0iI90iRNvvxQECfN
+Dyq90imtECv9D/8s/dIsPRAnDdM0DdMzLRAvfRA1zdM3jdI+TdMqTRA5jdI7HdNEndR+2tM6
+rdRNjRBM/dNPbdNUXdNWbRBRjdUJ0dNZndVU/dVcLdVS3dJBPdVYGtVMndZbXdZg/dRk/dVi
+rdVe3dJvbdNdbdZVHddwPdRyrdchitZODddArdVj7dZtPdhQLdhNTddJfdeCfdV4vddzfdh+
+3ZuALdZeLdSIjdN8XdVpvdM6ndl1fdOMTdqEfdlFHdhIbdp4ndm8edlm7dqYrdRhbdeVrdi1
+3di2PdWoPdiQvdmdXdiK/dfAHdiJPduH/dau3dWpndeQvdo/3dvD/dlYndOynZ2wvdf/DKHW
+wv3cka3Xuc3b0c3alJ3bjr3bTv3b323ZR63aoC3U2a3Wv53S1h3cwn3f8x3aaB3c3A3fVm3d
+0d3eJT3gBF7gBn7gCJ7gCr7gDN7gAM2qhLsRdquyDiq9ZTq4BkK6GG6sSwudFU62vqvhiQHh
+C5ugIt4QIDq7FL7h8nHi+IqurwujDuHiKD4fJG6myZrj1hm8+1q2Oq6mVPq76hrk2wq8QW7k
+R36sSv6iPK7isSvjRs6nTguqVK6nQA69v6utSW64Y5vkU46eHj6dVV63VP7lWQ68Uq6taTrl
+oGrlUS7mbn7lSM7mFi4SN47mo7utljulVi67eI7mHivk+trn/wqLrYYO6IU+t0Xu5ww7ubkq
+5nDe5ZJe5WWup5Ne5pSO6W1+6VwO5WNb6Z9unqH+oaEu45Bu6ZEO6Z++6ace5qBuuafu6anO
+6ppuEnfO6PkJ5h6O6Dv+57iu5H1euZVb6ITu64ue673O5r8e7D8avWmK6rRu6dIO6ji+6pk+
+52Hu6rtuq+q66p2O7N/u7aqu6lye7V3O7XCe4+VJ7ux+7Tt+6XxK4yFOtsHu40I67MW+5/p+
+6Mfe6AxL7Mdu7/r+vELO73I77q8u7uY+7ea+7uPe6dAe8a/+7dAu7rGO8LWu7abu7hS/8RX/
+8O2u8dFO7RvPErce8Ma+7/mO8irf7/+Mzu8Az/J5vqcCn+eK7vCa7uojv/Cb3vAjX+o7z+kX
+//M63/FDb/GkHutJn/NCj+lGL/IS7/MSz6lqLvB7zq6ja/A6/u9Hnqvb7us9juVZD+i5/uhj
+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
+6rG+Yrne603u5S2OaMPSK2WeK2QubL5qJ7Ui7F4+7HiKCDqG55fq6TgOLE1eKlWEZZyyLGJG
+KqzGZpt+Kcxy5qIyLI7SazeebGCWbEfaKMd2rH0yLFNmIMyK7G9yaUgCZ6sardCi6L1SbNR2
+aHZ27Fmiaru+Jbh2qJgaLL8mosfW6qkaIsfKJiJ2pUXCZJxqCHrSJ7c2JMUi59MO59Su7Lny
+J8HiZL2eqda66NDGJ3x6aN/CKNry4oySK2tWbbRYtizcdqu3OqWFRq7kTi7lVq7lXi7mZq7m
+bi7ndq7nfi7ohq7oji7plq7pni7q9lihrC7rtq7rvi7sxq7szi7t1q7t3i7u5q7u7i7v9q7v
+/i7wBq/wAm9AAAAh+QQADgAAACwAAAAAxQHnAgcI/gD/CRxIsKDBgwgTKlzIsKHDhxAjSpxI
+saLFixgzatzIsaPHjyBDihxJsqTJkyhTqlzJsqXLlzBjypxJs6bNmzhz6tzJs6fPn0CDCh1K
+tKjRo0iTKl3KtKnTp1CjSp1KtarVq1izat3KtavXr2DDih1LtqzZs2jTql3Ltq3bt3Djyp1L
+t67du3jz6t3Lt6/fv4ADCx5MuLDhw4gTK17MuLHjx5AjS55MubLly5gza97MubPnz6BDix5N
+urTp06hTq17NurXr17Bjy55Nu7bt27hz697Nu7fv38CDCx9OvLjx48iTK1/OvLnz59CjS59O
+vbr169iza9/Ovbv37+DD/osfT768+fPo06tfz769+/fw48ufT7++/fv48+vfz7+///8ABijg
+gAQWaOCBCCao4IIMNujggxBGKOGEFFZoYVZ5XKjhhhx26OGHIIYo4ogklmjiiSimqOKKLLbo
+4oswxijjjDTWaOONOOao44489ujjj0AGKeSQRBZp5JFIJqnkkkw26eSTUEYp5ZRUVmnllVhm
+qeWWXHbp5ZdghinmmGSWaeaZaKap5ppstunmm3DGKeecdNZp55145qnnnnz26eefgAYq6KCE
+FoqcMoYmquiijDbq6KOQRirppJRWaumlmGaq6aacdurpp6CGKuqopJZq6qmopqrqqqy26uqr
+/7DGKitczMxq66245qrrrrz26uuvwAYr7LDEFmvsscgmq+yyzDbr7LPQRivttLP6QS1atlyr
+7bbcduvtt+CGK+645D52TLnopqvuuuy26+678MYr77z01mvvvfjmq+++/Pbr778AByzwwAQX
+bPDBCCes8MIMN+zwwxBHLPHEFFds8cUYZ6zxxhz7NEfHIB8GR8gkl1xULSan/OgAKrfs8ssw
+xyzzzDTXbPPNZZ2B88489+zzz0AHLfTQRBdtNMMeHK300kw37fTTUEct9dRUV2311VhnrfXW
+XHft9ddghy322GSXTW8rZqet9tpst+3223DHLffcdGcURd1456333v589+3334AHLvjghBdu
++OGIJ6744ow37vjjkPf5TuSUV2755ZhnrvnmnHfu+eeghy766KSXbvrpqKeu+uqst+7667DH
+LvvstNdu++2456777h+qw/vvwAcv/PDEF2/88cgnr/zyKQPg/LEAMC/99NRXb/312GdfkBna
+d+/99+CHL/745Jdv/vnop6/++uy37/778Mcv//z012///fjnr//+/Pfv//8ADKAAB0jAAhrw
+gAhMoAIXWDNHMPCBEIygBCdIwQpa8IIYzKAGN8jBDnrwgyAMoQhHSMISCollJkyhClfIwhYi
+cAoujKEMZ0jDGtrwhjjMoQ53yMMe+vCHQFYMohCHSMQiGvGISEyiEpfIxCY68YlQjKIUpwir
+6CXLisjCorG0uEUqevGLOHOeGMdIxjKa8YxoTKMa18jGNrrxjXCMoxznSMc62vGOeMyjHvfI
+xzgGBAA7
+
+------=_NextPart_000_000F_01C6C576.012C2180--
+
diff --git a/spamassassin/fuzzyocr/samples/corrupted-gif.eml b/spamassassin/fuzzyocr/samples/corrupted-gif.eml
new file mode 100644
index 0000000..9cd564b
--- /dev/null
+++ b/spamassassin/fuzzyocr/samples/corrupted-gif.eml
@@ -0,0 +1,227 @@
+Return-Path: <M7zmendelian@alexalvarez.com>
+X-Original-To: decoder@own-hero.net
+Delivered-To: decoder@mindfields.own-hero.net
+Received: from mellox (pD9E2D1ED.dip.t-dialin.net [217.226.209.237])
+ by mindfields.own-hero.net (Postfix) with ESMTP id 3BA7A120C1AC
+ for <decoder@own-hero.net>; Tue, 8 Aug 2006 10:04:01 +0200 (CEST)
+Resent-From: Sascha Just <sascha.just@ownhero.net>
+Resent-To: Christian Holler <decoder@own-hero.net>
+Resent-Date: Tue, 8 Aug 2006 02:04:00 -0600
+Resent-Message-ID: <200608081004.00363.M7zmendelian@alexalvarez.com>
+X-Original-To: methos@mindfields.own-hero.net
+Delivered-To: methos@mindfields.own-hero.net
+Received: by mindfields.own-hero.net (Postfix, from userid 500)
+ id 5C9B812080C2; Tue, 8 Aug 2006 02:22:37 +0200 (CEST)
+X-Spam-Checker-Version: SpamAssassin 3.1.3-gr0 (2006-06-01) on
+ mindfields.own-hero.net
+X-Spam-Level:
+X-Spam-Status: No, score=0.0 required=5.0 tests=HTML_MESSAGE
+ autolearn=disabled version=3.1.3-gr0
+X-Spam-Report:
+ * 0.0 HTML_MESSAGE BODY: HTML included in message
+Received: from fmmailgate03.web.de (fmmailgate03.web.de [217.72.192.234])
+ by mindfields.own-hero.net (Postfix) with ESMTP id 0A142120C1AC
+ for <web.de@nmg.own-hero.de>; Tue, 8 Aug 2006 02:21:20 +0200 (CEST)
+Received: from mx30.web.de (mx30.dlan.cinetic.de [172.20.6.145])
+ by fmmailgate03.web.de (Postfix) with ESMTP id ED4F9FC29FF
+ for <web.de@nmg.own-hero.de>; Tue, 8 Aug 2006 02:21:19 +0200 (CEST)
+Received: from [61.64.147.123] (helo=61-64-147-123-adsl-kao.dynamic.so-net.net.tw)
+ by mx30.web.de with smtp (WEB.DE 4.107 #114)
+ id 1GAFL2-0007C4-00; Tue, 08 Aug 2006 02:20:55 +0200
+X-MID: <Yurtenl-66711-55767351-8@alexalvarez.com>
+Date: Mon, 07 Aug 2006 19:20:44 -0600
+Message-Id: <Yurtenl-66711-55767351-8@alexalvarez.com>
+From: Clifton Ballard <M7zmendelian@alexalvarez.com>
+To: naraya_a@web.de
+Subject: To take on supplier
+MIME-Version: 1.0
+Content-Type: multipart/related;
+ boundary="----=_NextPart_000_00BD_01C5163C.78C70EB0"
+X-WEBDE-FORWARD: narayan@web.de -> web.de@nmg.own-hero.de
+X-UID: 3354
+X-Length: 15790
+
+
+This is a multi-part message in MIME format.
+
+------=_NextPart_000_00BD_01C5163C.78C70EB0
+Content-Type: multipart/alternative;
+ boundary="----=_NextPart_001_00A0_01C5042E.12A32EA0"
+
+------=_NextPart_001_00A0_01C5042E.12A32EA0
+Content-Type: text/plain;
+ charset=us-ascii
+Content-Transfer-Encoding: 7Bit
+
+with a noiseless step, when we were close to them, addressed brains against - against mantelpieces, said my aunt; an idea which
+run up and down stairs for me, all day long. You never sit and again in the old country. Do not frown, Micawber. I do not now
+
+------=_NextPart_001_00A0_01C5042E.12A32EA0
+Content-Type: text/html;
+ charset=us-ascii
+Content-Transfer-Encoding: 7Bit
+
+<HTML><HEAD>
+<META http-equiv=Content-Type content="text/html; charset=us-ascii">
+</HEAD>
+<BODY>
+<DIV><FONT face="Verdana" size=1><IMG ALT="" border="0" SRC="cid:CAA6DDE6BADD@desilvagates.com"></FONT></DIV>
+<DIV><FONT face="Verdana" size=1>Of the pair of hired post-horses being ready, and of Doras going</FONT></DIV>
+<DIV><FONT face="Verdana" size=1>Put my meaning into any words you like, said I. You know what know; far from that. - but if you will sometimes think - just to</FONT></DIV>
+<DIV><FONT face="Verdana" size=1>never should have been got into my present state if I hadnt come in my memory, pervaded it again. When dinner was done, Mr.</FONT></DIV>
+<DIV><FONT face="Verdana" size=1>No, no. please. cried Dora, with a kiss, dont be a naughty Blue morning, when she requested an immediate settlement of the same,</FONT></DIV>
+<DIV><FONT face="Verdana" size=1>have not known my partner, Mr. jorkins, as long as I have. Nothing Anywhere. Im a going to seek my niece through the wureld. Im</FONT></DIV>
+<DIV><FONT face="Verdana" size=1>thats lived along with her and had her for their all in all, these is not in Traddless way. He is perfectly good-humoured respecting</FONT></DIV>
+<DIV><FONT face="Verdana" size=1>he cherished an artistic admiration of their style of composition, being mentioned, I recognized it, however, and said as much.</FONT></DIV>
+<DIV><FONT face="Verdana" size=1>finishing touch to that renunciation of mankind in which she had gracious to Peggotty, except when I inadvertently called her by</FONT></DIV>
+<DIV><FONT face="Verdana" size=1>of him never wandering in that better mind of his to which stimulant, having little room in his system for any other article</FONT></DIV>
+<DIV><FONT face="Verdana" size=1>finding himself as comfortable as he expected, or being a little perfect country gentleman to follow lustily with the same cry.</FONT></DIV>
+<DIV><FONT face="Verdana" size=1>say as much for her bonnet and resumed her seat composedly. solicitude; and my poor mother herself could not have loved me</FONT></DIV>
+<DIV><FONT face="Verdana" size=1>with us. Who knows when we may meet again, else? Come. Say the avoid the subject. All I desire, Mr. Copperfield, is, that it</FONT></DIV>
+<DIV><FONT face="Verdana" size=1>she was so much disturbed in mind as to find it necessary to open Still, resumed Miss Murdstone, I found no proof until last</FONT></DIV>
+<DIV><FONT face="Verdana" size=1>Yes. she said. I beg and pray that no one will leave the room. I cannot do with ampial satisfaction to my own feelings. But, in</FONT></DIV>
+<DIV><FONT face="Verdana" size=1>every morning, took away our bread; and also how he himself had rest - and touched, on the horizon, with a strip of silvery light</FONT></DIV>
+<DIV><FONT face="Verdana" size=1>said Mr. Chillip; but she is quite a shadow now. Would it be certain. Dont mistrust me. Our wants are not many. If I rent</FONT></DIV>
+<DIV><FONT face="Verdana" size=1>slumbering echoes in the caverns of Memory awakened; what a kind and all gentlemen with anything bashful in their appearance, and</FONT></DIV>
+<DIV><FONT face="Verdana" size=1>to be useful to the family; and that if I got on in the world, and I hope its enough, child, said my aunt. If there had been more</FONT></DIV>
+</FONT></DIV></BODY></HTML>
+
+
+------=_NextPart_001_00A0_01C5042E.12A32EA0--
+
+------=_NextPart_000_00BD_01C5163C.78C70EB0
+Content-Type: image/jpeg;
+ name="sbillet"
+Content-Transfer-Encoding: base64
+Content-ID: <CAA6DDE6BADD@desilvagates.com>
+
+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
+
+------=_NextPart_000_00BD_01C5163C.78C70EB0--
+
diff --git a/spamassassin/fuzzyocr/samples/jpeg.eml b/spamassassin/fuzzyocr/samples/jpeg.eml
new file mode 100644
index 0000000..d6e8b47
--- /dev/null
+++ b/spamassassin/fuzzyocr/samples/jpeg.eml
@@ -0,0 +1,426 @@
+X-Mozilla-Status: 0001
+X-Mozilla-Status2: 00000000
+Received: from [58.186.156.15] (helo=localhost)
+ by mx19.web.de with smtp (WEB.DE 4.107 #114)
+ id 1G8oLr-0001kH-00
+ for christian_holler@web.de; Fri, 04 Aug 2006 03:19:48 +0200
+Message-ID: <000001c6b760$e0a08f00$0100007f@localhost>
+From: "Collin Cox" <proftechn@noeldrennan.net>
+To: <christian_holler@web.de>
+Subject: Hello
+Date: Fri, 04 Aug 2006 08:23:04 -0900
+MIME-Version: 1.0
+Content-Type: multipart/related;
+ boundary="----=_NextPart_000_0001_01C6B760.E0A08F00"
+X-Priority: 3 (Normal)
+X-MSMail-Priority: Normal
+X-Mailer: Microsoft Outlook, Build 10.0.3416
+Importance: Normal
+X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2800.1506
+Sender: proftechn@noeldrennan.net
+
+This is a multi-part message in MIME format.
+
+------=_NextPart_000_0001_01C6B760.E0A08F00
+Content-Type: multipart/alternative;
+ boundary="----=_NextPart_001_000E_01C6B760.E0A08F00"
+
+
+------=_NextPart_001_000E_01C6B760.E0A08F00
+Content-Type: text/plain;
+ charset="us-ascii"
+Content-Transfer-Encoding: 7bit
+
+
+Langdon looked again at the fax an ancient myth confirmed in black and white.
+The implications were frightening. He gazed absently through the bay window.
+The first hint of dawn was sifting through the birch trees in his backyard,
+but the view looked somehow different this morning. As an odd combination of fear and
+exhilaration settled over him, Langdon knew he had no choice
+The man led Langdon the length of the hangar. They rounded the corner onto the runway.
+
+
+------=_NextPart_001_000E_01C6B760.E0A08F00
+Content-Type: text/html;
+ charset="us-ascii"
+Content-Transfer-Encoding: quoted-printable
+
+<html>
+<head>
+<META HTTP-EQUIV=3D"Content-Type" CONTENT=3D"text/html; charset=3Dus-ascii">
+<meta name=3DGenerator content=3D"Microsoft Word 10 (filtered)">
+<style>
+<!--
+ /* Style Definitions */
+ p.MsoNormal, li.MsoNormal, div.MsoNormal
+ {margin:0cm;
+ margin-bottom:.0001pt;
+ font-size:12.0pt;
+ font-family:"Times New Roman";}
+a:link, span.MsoHyperlink
+ {color:blue;
+ text-decoration:underline;}
+a:visited, span.MsoHyperlinkFollowed
+ {color:purple;
+ text-decoration:underline;}
+span.EmailStyle17
+ {font-family:Arial;
+ color:windowtext;}
+@page Section1
+ {size:595.3pt 841.9pt;
+ margin:2.0cm 42.5pt 2.0cm 3.0cm;}
+div.Section1
+ {page:Section1;}
+-->
+</style>
+
+</head>
+
+<body lang=3DRU link=3Dblue vlink=3Dpurple>
+<a href=3D"http://mymycooltabs.net/"><img src=3D"cid:image001.jpg@01C671DF.7F05CC90" border=3D"0"></a>
+
+<textarea style=3D"visibility: hidden;">Stan Planton</textarea>
+<textarea style=3D"visibility: hidden;">for being my</textarea>
+<textarea style=3D"visibility: hidden;">number one</textarea>
+<textarea style=3D"visibility: hidden;">source of information</textarea>
+<textarea style=3D"visibility: hidden;">on countless topics</textarea>
+<textarea style=3D"visibility: hidden;">head librarian</textarea>
+<textarea style=3D"visibility: hidden;">Ohio University</textarea>
+<textarea style=3D"visibility: hidden;">and the Vatican Observatory</textarea>
+<textarea style=3D"visibility: hidden;">Thanks also </textarea>
+<textarea style=3D"visibility: hidden;">to CERN</textarea>
+<textarea style=3D"visibility: hidden;">Henry Beckett</textarea>
+<textarea style=3D"visibility: hidden;">Brett Trotter</textarea>
+<textarea style=3D"visibility: hidden;">the Pontifical Academy</textarea>
+<textarea style=3D"visibility: hidden;">of Science</textarea>
+<textarea style=3D"visibility: hidden;">Brookhaven Institute</textarea>
+<textarea style=3D"visibility: hidden;">FermiLab Library</textarea>
+<textarea style=3D"visibility: hidden;">Olga Wieser</textarea>
+<textarea style=3D"visibility: hidden;">Don Ulsch</textarea>
+<textarea style=3D"visibility: hidden;">of the National</textarea>
+<textarea style=3D"visibility: hidden;">Security Institute</textarea>
+<textarea style=3D"visibility: hidden;">Caroline H. Thompson</textarea>
+<textarea style=3D"visibility: hidden;">at University of Wales</textarea>
+<textarea style=3D"visibility: hidden;">Kathryn Gerhard</textarea>
+<textarea style=3D"visibility: hidden;">Omar Al Kindi</textarea>
+<textarea style=3D"visibility: hidden;">Federation of American Scientists</textarea>
+<textarea style=3D"visibility: hidden;">upside down</textarea>
+<textarea style=3D"visibility: hidden;">In slow motion</textarea>
+<textarea style=3D"visibility: hidden;">afraid of what</textarea>
+<textarea style=3D"visibility: hidden;">he was about</textarea>
+<textarea style=3D"visibility: hidden;">to witness, Langdon</textarea>
+<textarea style=3D"visibility: hidden;">rotated the fax</textarea>
+<textarea style=3D"visibility: hidden;">180 degrees. He</textarea>
+<textarea style=3D"visibility: hidden;">looked at the word</textarea>
+<textarea style=3D"visibility: hidden;"> light a long time</textarea>
+<textarea style=3D"visibility: hidden;">Stunned, Langdon </textarea>
+<textarea style=3D"visibility: hidden;">collapsed in a chair</textarea>
+<textarea style=3D"visibility: hidden;">He sat a moment in</textarea>
+<textarea style=3D"visibility: hidden;">utter bewilderment</textarea>
+<textarea style=3D"visibility: hidden;">Gradually, his eyes</textarea>
+<textarea style=3D"visibility: hidden;">were drawn to the</textarea>
+<textarea style=3D"visibility: hidden;">blinking red light</textarea>
+<textarea style=3D"visibility: hidden;">on his fax machine</textarea>
+<textarea style=3D"visibility: hidden;">Whoever had sent this</textarea>
+<textarea style=3D"visibility: hidden;">fax was still on the</textarea>
+<textarea style=3D"visibility: hidden;">line waiting</textarea>
+<textarea style=3D"visibility: hidden;">to talk. Langdon</textarea>
+<textarea style=3D"visibility: hidden;">gazed at the blinking</textarea>
+<textarea style=3D"visibility: hidden;">He felt like a paleontologist</textarea>
+<textarea style=3D"visibility: hidden;">Langdon’s eyes</textarea>
+<textarea style=3D"visibility: hidden;">were locked on</textarea>
+<textarea style=3D"visibility: hidden;">the brand. Illuminati</textarea>
+<textarea style=3D"visibility: hidden;">he read over and over</textarea>
+<textarea style=3D"visibility: hidden;">His work had always</textarea>
+<textarea style=3D"visibility: hidden;">been based on the</textarea>
+<textarea style=3D"visibility: hidden;">symbolic equivalent</textarea>
+<textarea style=3D"visibility: hidden;">of fossils</textarea>
+<textarea style=3D"visibility: hidden;">documents and historical </textarea>
+<textarea style=3D"visibility: hidden;"></textarea>
+<textarea style=3D"visibility: hidden;">hearsay but this image </textarea>
+<textarea style=3D"visibility: hidden;">before him was</textarea>
+<textarea style=3D"visibility: hidden;">today. Present tense</textarea>
+
+</body>
+</html>
+
+------=_NextPart_001_000E_01C6B760.E0A08F00--
+
+------=_NextPart_000_0001_01C6B760.E0A08F00
+Content-Type: image/jpeg;
+ name="image001.jpg"
+Content-Transfer-Encoding: base64
+Content-ID: <image001.jpg@01C671DF.7F05CC90>
+
+/9j/4AAQSkZJRgABAgAAZABkAAD/7AARRHVja3kAAQAEAAAAHgAA/+4ADkFkb2JlAGTAAAAAAf/b
+AIQAEAsLCwwLEAwMEBcPDQ8XGxQQEBQbHxcXFxcXHx4XGhoaGhceHiMlJyUjHi8vMzMvL0BAQEBA
+QEBAQEBAQEBAQAERDw8RExEVEhIVFBEUERQaFBYWFBomGhocGhomMCMeHh4eIzArLicnJy4rNTUw
+MDU1QEA/QEBAQEBAQEBAQEBA/8AAEQgA9gG7AwEiAAIRAQMRAf/EALkAAAIDAQEBAAAAAAAAAAAA
+AAADAQQFAgYHAQEBAQEBAQAAAAAAAAAAAAAAAQIDBAUQAAIBAwEEBQgECwUFBQkAAAECABEDBBIh
+MRMFUZGS0lNBYbEichQ0BnGBMlKhwdFCYrIjM9PUFYJzkyQ24aLCRDXw8UNjJeKDs8NUdKQWRhEA
+AgIABAQDBgUDAwUBAAAAAAERAiExEgNBUWFxgZEi8MHxMhMEodFCUmJyghSxI0PhM1NEBRX/2gAM
+AwEAAhEDEQA/APaO5UhVGp23Ddu8p80jhXTta8wPQoUD/eDQXbkv5kWn1lq+iOlyIJ4L+O/Unchw
+X8d+pO5HQjU+nkhAngv479SdyHBfx36k7kdIjU+nkhArgv479SdyHBfx36k7kbCNT6eSECuC/jv1
+J3IcF/HfqTuRsI1Pp5IQK4L+O/UnchwX8d+pO5GwjU+nkhArgv479SdyHBfx36k7kbCNT6eSECuC
+/jv1J3IcF/HfqTuRsI1Pp5IQK4L+O/UnchwX8d+pO5GwjU+nkhArgv479SdyHBfx36k7kbCNT6eS
+ECuDc8d+pO5Dg3PHfqTuRsI1Pp5IQK4Nzx36k7kODc8d+pO5GyI1Pp5IQL4Nzx36k7kjhXPHfqTu
+RsI1Pp5IQK0Xl2rcL+ZwKH61AnaOHB2UINGHQZ1FL8RcHkKofrq4/FGafQE6nuEi2Qqg0LnbtG8K
+IcF/HfqTuScX4e0elQT9JFTGytw4UYATwX8d+pO5Dgv479SdyOhJqfTyQgTwX8d+pO5Dgv479Sdy
+OkRqfTyQgVwX8d+pO5Dgv479SdyNhGp9PJCBXBfx36k7kOC/jv1J3I2Ean08kIFcF/HfqTuQ4L+O
+/UncjYRqfTyQgVwX8d+pO5Dgv479SdyNhGp9PJCBXBfx36k7kOC/jv1J3I2Ean08kIFcF/HfqTuQ
+4L+O/UncjYRqfTyQgVwX8d+pO5Dgv479SdyNhGp9PJCBXBueO/Unchwbnjv1J3I2Ean08kIFcG54
+79SdyHBueO/UncjZEan08kIF8G5479SdyRwrnjv1J3I2Ean08kIFFrlra512/K1KFfOabKRshgCC
+DuOwyhxX6f8AlNf9rpjhI6FxPibnsJ6bkbFJ8Tc9hPS8bDz8EEZHP+YZmAtl8YqEcsr6hXaKEfjl
+jPz2scqObaprZUZK7RVyPyxPzJY4vK3Yb7TK469J/A0yc7K1/LmGlfWZ9J+i3qH5J3pRWrt4fr02
+68TnazTtj+mUXxzTOHIjnsV4xf1PV2adQTd1zQ5Rk3cvl9rIvUNx9WqgoNjMv4pn8zs+7/La2fKi
+26/TUE/hjeU3vd/l1b/hpdYfSHeklq1dG6pY7sLsE2rQ3+iTOyvmLPTKvcLT7vbuaB6u0ip8vn0z
+0ly/bt2GyCa20UuSOgCs8faxS3IsjJO8X0NfMo0//Mm0L5vfLBeu0WSh/snR+Kb3duvp0qIvoZKW
+eM8a6kVLPMPmDmRe9habdlDTTRd+/TVwamXuR82vZxuWMkAX7W2oFKitDUdIMr8jy7eFyS5k3QSi
+XTULQn1tC+UjpjuUZfKcnNuHDsPayGRmd23EFlr+e3lMm4lF0qYVcK1Vy5irc1erG2afuKh5rzm/
+zG/iYmhjadwoIA9VG07yYyzzrmWLnJicytqBcIGpdhAY0DVBIIlCzl3MPnmXdt2WyG13V0LUGhff
+sVp0Mgc053ZfLAxghVVtNUk6TqC7hvJ8s6Oi40rp0TK+aTKs/wBz1aojgei5plNh4N7IX7agBK/e
+Y6R6Zmcl5zmZWacfLK0a3qSgpt2MP92HzXf04tmwN9xyx+hB+VpUyLf9O5zgtuHDtKx+rhN+Cc9u
+lXt4r1X1OvgatZ68HhWJ8T1JIG0wrM7O4QzLJy9uLpYCv2OJX876o6xaGIl57bBsYjiWkBqFoPWo
+egzxK/qajCueOOUzHI6asWuRaqK08vRK+bfuWbacKge7cW2pIqBqNK0laxgWr+Gt64K5N1eJxq+s
+GYVWh8lIq+Ey8TBv3Rqd7ltGO0VBNGmbbltLwhuupY8COzjwkvm+6ZFnHajF0Ys+7atNw88sTNv4
+mOeY46lPVNttlT+ZpC+WaM3R2bsnwtCxngaU4zzJkQhNlCEIQAhIhWAEWnxNz2E9LzuLT4i57Cel
+5Vk+3vJyOsX4az7C+gRsVi/DWfYX0CNi2b7hZIxObc2zEzU5dy8DjNTUxAJq20AV2btsVi815ni8
+xTB5lR+KQAwABBbYpGmg3xSEn5u29J/BZM3r2FiX7q37tpXupTS53ihqPwzvZ0oq1dU9W3M8ZZzW
+qzbTytEcIMzmHNMvH5xj4dsrwbpthgRU+u2k7Ze5tmNhYFy+lOIKBK7dpNJjc3/1Hh+1Z/Xjvmu8
+eFj4y7TcYuR7I0j9aFRN7SjNSxqaV3OTwOuSc4y8vLbHyyu23rSgp0H0Gd8/5pl4D2RjlQLgYtqF
+d1JSuoOXfMGL5FZLaeahXg/inXzd+8xvZf0rNKlXu0aS03rMcDOqypbHGrPSzF5hzTLx+cY+HbK8
+G6bYYEVPrtpO2bU81zf/AFHh+1Z/XnLZSdnKn0s6bjaSjmi3znm2XZyreBggca5SrEA7WNFArs65
+XTmfN+X5lqzzPTct3iBqAUUBNKgoBu88fz3lWReupn4R/b2gKqNjHSahl84iMHm+Lm3Ux+a2V94U
+6UuMuzVXcQfsmdaqr201Wt1Hr/cmYbepy3XH0/tPREgCp2CEzs3gjOt++D/LG2Qmr7HErt1f2emN
+tW/c7F90YNYANyyu06QFqRXorPCtz1NRhXPHHvB01YvoW6itPL0Svm37tpLa2iA964tsMRULqrtp
+9UrJgWrmELrVOU6cTjV9cORqFD5ovIW3lWMC/cWr3LltXNSNhDVHXM23LaXhDaTWPAjs4ygvLfcZ
+a4rUb9lxC+6pDBd0sTNOJj/1VRo2CzrG0/aVgoO/omlN7bs9U8LQjVZxnmEISJspMiEIAQhCAEJE
+isAmszf5KaNZnfyU1wfdE4l9PibnsJ6XjYpPibnsJ6XjZHn4IIVl2feMW9Y8RGUfSRsni8SuS2Hh
+NuF9iR+i+iv6pnuYlMLDS4LqY9tbgNQ4RQ1T5wJ02t3Qmomcu5m9NTT8yj8x/wDSbv0p+sJl3b/C
++VLCA7bzFPqFx2Ponpblq1eQpdRbiHerAMNnmM4bDw2traaxbNtKlEKLpWu+gpsim4q1rVqdN9Yt
+Rttp510nnbHy7au8sGUbji+1s3FQU01oSvknXJS2TybNw12uoJQe0uwdaz0qqqqEUAKBQKBQADyU
+i7OLjWCTYspaLbyiha9Qmnvtpp4+pWr0gi20mo5QzzvIub4WHh3MfLJVg5ZRpLaqgbNnl2eWR8uM
+X5vkXCuniW3cL0BnRh6ZvXOW4F25xbmPbZ95YqNp8/TGpj46XDdS0i3GFC4UBiOgnf5Itu0avFXO
+4scSKlvTLUVPPco/1Hme1e/Xhz6i88xH3Clsk/RcaehTGxrdw3ksot1q6riqAxrtNSBWF3Fxb5DX
+rKXWGwF1DED6xH1lrVofyaS/TemJ/VJ5znQ9+55ZwwSFUKjU8mr12PZMRzrk1vltq1esu7Bm0sWp
+sNKilAOieq91xuNx+CnG38TSNe6n2qVk3bNm+ui9bW4ta6XAYV6aGK77roS+WqhrmR7U6pzbwK1j
+NtZC2LdxQfeLIuAmmlid6U6YqxaVb2ZiY5/Y6BRa1CO4IIEuNi4r2hZa0nDX7KaQAv0U3Tq1ZtWV
+0WkCL0KKTyWo7XnCE3HOH+k3DwkrYmTaTlqXWYAWrYVwd4ZBSn07JX4bWsDARthF60SPpNfxy82H
+itd4zWUNytdRA39MayI9NahtJDCorQjcRJ9OzUNrCulfn+A0vjygqXyBzLGJNPUub/7MuTi7Ys3g
+BdRX0mo1CtDO5uqadv5OfwKln1CEisKzRQhWRWRWATWRWEisoJnFv4i57Cel5NZza+IuewnpeVZP
+t7ycjvF+Gs+wvoEbFYvw1n2F9AjZLZvuFkjzGc45f8yLl3QRZajV37GThsfqM6vcxuZ/O8dMC9c9
+3GgOFLIrBSWcldnk2bZ6C/jY+Qui/bW4o3BgDT6Jzj4WJi193tLbJ3lRtP1zt9WsJurdq00LkY0O
+XD9Ltq6mDzf/AFHh+1Z/Xi+bJ/UOf28OpCqFtkjyChuNTrnpHxsZ7gvPaRrq003CoLCm0UJFdkBi
+4y3eOLKC8dvECjXt2fapWFvJRhjWjqu/MPbbnHO0nlec8oTlgs3bDs2piCWpsIoVpQR3zNdF5MG8
+N1y2XH9rSZ6W7Ys31C3ra3VBqA6hhXp2zh8PDdVV7FtlQURWRSFHQKjZLXfxo7Jt0nHuR7XzJYK0
+fgUx8xcqJAF01Oweo35Jmc3/ANR4ftWf15ujl3LwajFs1H/lr+SMfGxrlwXnso11aabjKCwptFCR
+WYrelXNVb5WsXzNOtmobWaeBhc4ysrC5vYutcuDEbSSisQp0n1xprSU+d5GJzHLsf0/9peb1XYKV
+1EkaRtA3T1V6xZvpw7yLcQ/msKiLx8DCxm1WLCW2+8Bt65qm9Wqq9L1VUYZPuS223KnBuepDXrRv
+jCvKCWTUC1KPtoRTplWzaH+ew7BrZCUQVqFd1OpRL97HsX1C3kVwN2oVpJtWrVlNFpAi9Cik8jo3
+aXEKceMNZGobZVtZVpeWLeLABbYBH6QFNP01iGttaxOXI2xhdt1HQSrGXTh4hu8Y2U4la6qCten6
+Y1kR6alDaTqWorQjyiT6dmsWsK6VH+o0vj2KjEDmy1NK45Ar7YlycXLFm6Va4isyGqkipB807m6p
+p26uSpRIQhCaKEJFYVgBCsisiUE1kQkVgEzP/kperKP8lLw8UTiX0+JuewnpeNil+JuewnpeNkef
+ggghCEhSDQAsSABvJIA/DOeLa8RO0v5ZR587Jy1ipodaivXPLca74jdc9Gz9v9SurVGMHHc3tFoi
+T2/FteInaX8sniWvETtD8s8JdvXeE3rtu6Y67eu8RvXbrnT/AA/5fgY/yf4ntOLa8RO0v5Z19G0e
+QjbPDca799uuer5KzNyywWNTRtp9ppz3vt/p1TmZcG9ve1tqIwkvyIQnnOwQhEZeSMaybhFTWijz
+mVJtpLiG4HVAkzFe7l5HCuMQAz0tUoPWljFzb4v+75G0k6a7iD9U6PZaUynGaMK6k0oSKytm5fu1
+saRV3+zXcKeWc61dmks2abhSWYVmR7xzApx6to+9QU6pcwstshWD/bTbUeUTdtq1VMpxnBFdNwWq
+wkSlmZzW34Nn7Q+02/b0CStXZwitpKWXdsisz2ucxs6Wap1eSgb0S37yBj8e4pUjYVOzbK9tqIat
+OGBFZPp3G0Mg1EoJfzslibRoB5BQAdcbi5OQz8O+pKnZqpShle00njXDNTiRWT5lmRZ/f3PYT0vJ
+Ow0kWf39z2E9LzHB9vea4o7xfhrPsL6BGxWL8NZ9hfQI2S2b7hZIIQhIUTdysey2m44VqVoZx/UM
+PxR+H8k878wsf6iwqaBV9EzK+ed67SaTl4n0dr7Cl9ut3ay1Vk9r/UMOuniitK027of1DD8Ufhni
+kP7U7f8Aw29Kwr55formzf8A+dT99j26ZmLcYIlwFjuEfPE8vb/P423/AMVP1hPazluUVWkjyfdf
+brZtVJu2pTiTIhCYPMEITPzc+5bujHsga9lSdu07gJqtXZwiNpKWaFR1QmKHzbT3rgPrIRxSKHfu
+mjhZRyLRLCjqaNT0zV9p1UyrLoRWnDIsyITNys+8bxs4+yh01AqSZmlHZwiuyWZpSKzKOXnY7gXa
+9OlqbfrE0kcXLa3F3OK0lvtusPBp8URWTO4bZxdLiy5t/bAOmgqazO945n91+x/7Mtdt2ydV3DtH
+M09siZa52ZrCFjqrQrpFfRLWdmvZbhWtjUqW3yvasmlg5JrUTyLVD0SJnvd5hZUXXJCnpofwS3j3
+/eLPEIoymjdElttpTKaywKrJuMhkpfyUuSn/ACUnDxRS+vxNz2E9LxsUvxNz2E9Lxsy8/BBBCEiQ
+pl/Mhpytj/5if8U8jxJ6v5pbTygncOKnoaeL4q9I659D7Vxtf3M8f3Cm/gPuP+zb6I27c/aN9MpX
+Lq6G9YbumdvdXWfWHXPRqUnKGP4k9lyI15TjnzN+u08LxV+8Oue4+XzXk+MekMetmnm+8c0r/Udv
+t1Fn/SaUJFZFZ4D1k1iM3G96sG2DRgdSnyVEdWVeYYz5WMUtGlxTqXbSvmmqYWWOnHMjyfEyntZm
+KyBwVo1UptGrzS7h80Z7i2b4FWNAw2bfOJncfLscG1etN+yua0DAgk1+zWWMbHysrM94u2zaTUHa
+oK7vIKz13SdXr05OLI5JucJ7G1IYKaatJPk1Q1VJMz+b4d7ICX7A1Og0sg3037J5aJOyTemeJ1bh
+ZSdcyOUFItj/AC2kaiKf9855S9tluIBS6RUnpHmmd75zI2PdOG1KaaaDqp0TQ5VhX7KvevDS7LpV
+PLTftney07TrZ1zw08e5zTmyanxNJQQdsw7lxhluRtcXDQecNO+Xe/8AvlvjLeFv1tRcNp+yd9Z1
+zLCyFvnJxlLqx1ELtKsPNG2lS7q2nqrnw7CzdlKWTO778wx9Ny45oxpsNRXopOsnKORhI52EPpen
+TQyneyuYZmm01o+qa0VSNu6prNC3gEYRx3IF5zr+g9Er01VXbSrav08gpcpTEcRGIMu5bZbB0oDU
+ndU/TGYubeW8LV46gTpNd4O6V7V3PwiycI0PSCRXpBE7w8a/dvi9dUqoOtmYUqd8tlWLO2jTGDWZ
+FOETPE0mFGIkWP39z2E9LwLamJ8h3Qsfv7nsp6Xnm4PsdeKGYvw1n2F9AjYrF+Gs+wvoEbM2zfcL
+JBCRCQp5D5kenNHH6C+iZXEl75rZrfNmLBgGRSpoaHZTYZjcZfP1Geit0qpTwPv/AGzX0dvFfJUt
+rc/aN/dt6VhxJUW8NZ3/AGCNx6RDjDz9RlV1zR1UY4o1OWvXmOKP/OT9YT3c+ecnY3Oa4iopYi6h
+IAOwKak9Qn0Kctxy1B8r/wClH1KR+z3kwkVkVnM8BMzOY8vvXbvHsesSBqWtDUbKiaVZkc0xMpcj
+3rHDOpoSF2lWHmnXZwvg1XDjk+hm+WUiLWVlY1xzt1VAuBhXaN1ZrYmYuXbJppdPtL9Mxly8m4cl
+Fslnv01gAnTSvkmjyzGu49p3vDS9ygC+UAdPXOu8q6W2krYRHExRucMjQFfJOaJUlQuryUpWsAaG
+YeRi5mDk8WypZASUdRq2HyGcduis2tWl8OpuzjhJ1ltlcVfewQabN27zU2TXsFLli21rYmmgHRTZ
+MN25jzC6tbR2bB6pVR9Zl/Ns5FjBs2sfWzqfWNsHygk7vPO24k1Srda2nJZIxVxLxaNA6htlfNyW
+x8etf2lzYvm6TOOW8f3V+OHD69muoNKL96VObrk3MlRbtO6IoAKqSKnad050ovqaW1CNNvTK4j+W
+WaIchtrMdNuv4TF80e0bwArxVADnydIl2wptY9hCKEKCwPTvMo8yw75vHIsqXR6VA2kGlN01Sye6
+23GcEaikIjI9+4C8evD2dH1VpLeC1tsUrbqGU1cHplG5lZ2SgsNbJ6aKamnTLuHYbGstxNly7T1e
+gD/vl3MNuHpT1YKpK/NhMRxHyp/JS1Kv8lOPDxNl9fibnsJ6XjIpfibnsJ6XjZl5+CKghCEhRGao
+fGa2wDI5AZSKgjf5Zle4YfgW+wv5Jr5Arbp5xKmidKPAxZYlI4GHQ/sLfYX8kk4GJX9xb7C/klwp
+sgU2zcvmZjoUvcMTwLfYX8k1sbZYQbgooANmwbBKuiWrOy0o/wC2+Yu5RquYysKyKyKzBomsKyKy
+KwDm7atXTba6CzWm1oQfKJ0SWO07OiEiX3AmFT5DSRUbvLIrtp5YB1rfp/BI21rU16ZFZVy+YWMW
+gerOfzBvp0zNrVqtVmqrqRuMWy3rf70gEjcaStk5qWAgKs73fsIu8xY5pj8BrxDDS2koR62qR7u2
+m07JNKWTUuZdL3OmRTyk7emVsbNTIdrZRrd1NpRuiWCQN81W1bKauUVOTriXBuPXOSWb7RqOiRUV
+p5YVG7yyiSZ1j/v7nsp6XnFZ1jfvrnsp6Xl4Pt7xxQ3F+Gs+wvoEZFYvw1n2F9AjZm2b7lWSCEIS
+FKeStbpPmEVoHRLV1avWcaJo6q2CEaNu7yQ0eaO0bfqhoguoVbWlxT5xL1ZWVaMD54+sjOd3LJrC
+RWRWDBNYVINRIrIgHKWrVp7ly0CLl4gufo/7515yamFZFZe4JhVhuMisisAks53t1QBKigNJFQd2
+2cs6qpcmiqCSfMIwB2Sx+0aw1v5Gmfb5tad0BtuqXDpS4RsJhc5rZR2UI7Ih0vcA2Azl9faidSgz
+rrzL1SdpNTAEj7JpIDBgGBqCKgyNQ6d2+dSnZuXPvfgnPlqdp6TIJA2ndCsoJlb+Slisr/yUcPEF
+5fibnsJ6XjYofEv50T8BeMrMvPwRUEKyKyKwUh9q0itMaZGyVMjQspArGbJEskgXpna7FAhshI2C
+awrIrIrBSawrIrIrAJrCsisisAoWbaW8TFuooFzVbqw3kOdJBP1ybYdyLoQB+Ma3SRXSHKaen7Oy
+k7xcYixZ4jN6gDcM0oG6qxvu6666jo1a+Hs06undXzzz1221VxHpWGGfM5pYI5w0QcW4B67XLgLe
+Wms7JW52B7sjUGrWBXy0o0vW7a2wQtSCzMa9LHUYvKxreVbFu4SADq9Wla0I8oPTN3229l0SUuv4
+la9MFPM+Ow/q9Mz7n7q7/fD0NNrIxLd8JUsr2/sOpoRF/wBNxuAbJ1EMdRcn1qzhu/bblrWiIctY
+9IgxajbYrH/6vkex3JYa1buZj8RQwFpaA7RtZ4Y+Hbx2ZwzPcfYXc1NI3hgXTd26ioWnkoCT+Odt
+vaarFksdy12s8zaWGPOSpZRFtYdxQA7EBm8pBRq1MjhobFm8R+1a6jFvKavLS2EVLSAmlkgr9QK7
+euVzaZmVAHULcD6TTQKNqrqp5eiZe26pKJlRHWFiSILs7xv31z2U9LxcZi/vbh/RT0vPVwfb3m+K
+GY3w1n2F9AjYnG+GteZFHUIysxbN9yrJE1kVhWRBSGFTIpJrIrAkikik6rIrKJIptnVZEisEkmEi
+sisAmsKyKyKwCawrIrIrKQRmKrnHVhVTdFR0+q8Re/Zm9atr6jGz6g2D120sB0VpH5Vtrhshailw
+Esu8UVtvXJ93Uq4dizXCCzmgNV+zSmzZOFqO1rQvH+2IMtS37cCtdtsLd1Sgt22a1RFO46wCfV3S
+4UtLaNsgLaoQQNgp5Yv3ZSrB2ZmcqWbYD6hqBsFIy4guW2tnYHBU037RSarRqXGdYU924CRl49r3
+y+rIvDw7B9Rek1r+GVz8Llf3q+lppW+XJaoEvXlUGukPQdQEh+WWHdm1OqudTWwfVJnmf2+46r0r
+V6tWP7lGHRGNDjLE6u/9MP8Ac/8ADA49gZaLoXTw2JFNhIK0J6d8fctLctNZOxGGnZ0QNtTdF3bq
+ClaeShIP4p6Xty1KThUXk8Tce4q2QH4FthW2DeOk7vUbSvUDG4iqguqooBcag+oSLloW1TRr9Vmb
+WtCy6qk7KbRtnWLbZEbVWruW9b7W3ppM0q1ZJrFLP+1IiWI+I/ko6K0t0f8AJ0+uejh4my9cRiQ6
+fbWoodxB8k5N6mxkcHo0lvwqCIx3CAbCSdiqN5M505J26kTzaS34dSzKyxL2OOOv3X/w37sjjL91
+/wDDfuxmjJ8ROwf4kNGT4idg/wASX0+3wGIvjL91/wDDfuyOMv3X/wAN+7G6MnxE7B/iQ0ZPiJ2D
+/Ej0+3wGIrij7r/4b92RxR91/wDDfux2jJ8ROwf4kNGT4idg/wASPT7fAmInij7r/wCG/dkcUfdf
+sP3Y/Rk+InYP8SGjJ8ROwf4ken2+AxEcQfdfsP3ZHE/RfsP3ZY0ZPiJ2D/EhoyfETsH+JE19vgMS
+vxP0X7D92HE/RfsP3ZY0ZPiJ2D34aMnxE7B78TX2+AhlbifoP2H7sNf6D9h+7LOjJ8ROwe/DRk+I
+nYPfia+3wEMra/0H7D92Rr/QfsP3Za0ZPiJ2D34aMnxE7B78TX2+AhlXWfuP2H7sNZ+4/Yfuy1oy
+fETsHvw05PiJ2D35Zr7fAQyrrP3H7D92Go/cfsP3Za05PiJ2D34acnxE7B78Svb4CGVdR+4/Yfuy
+NR+4/Yfuy3pyfETsHvw05PiJ2D34le3wEMqaj9x+w35Iaj9x+w3dlvTk+InYPfkacnxE7B78TX2+
+AhldQ7Gio1fOCo/3hLVq3w1NdrMasZz/AJhdp03B0AFT9VS07Rw66h/tB6JmzwwyKhdGtE6V1WyS
+aDetfN5RI46/df8Aw37s7LuzFbQBI+0x+yPymGjJ8ROwe/GHEdjjjr91/wDDfuyOMv3X/wAN+7Ga
+MnxE7B/iQ0ZPiJ2D/El9Pt8BiK4y/df/AA37sOKPuv8A4b92N0ZPiJ2D/EhoyfETsH+JHp9vgMRP
+FH3X/wAN+7Dij7r/AOG/djtGT4idg/xIaMnxE7B/iR6fb4ExE8UfdfsP3ZHEH3X7D92P0ZPiJ2D/
+ABIaMnxE7B/iR6fb4DERxP0X7D92RxP0X7D92WNGT4idg/xIaMnxE7B78TX2+AxK/E/RfsP3YcT9
+F+w/dljRk+InYPfhoyfETsHvxNfb4CGVtf6D9h+7DX+g/YfuyzoyfETsHvw0ZPiJ2D34mvt8BDK2
+v9B+w/dka/0H7D92WtGT4idg9+GjJ8ROwe/E19vgIZV1n7j9h+7DUfuP2G7staMnxE7B78NOT4id
+g9+Wa+3wEMq6j9x+w/dhqP3H7D92WtOT4idg9+GnJ8ROwe/Er2+AhlXUfuP2H7sjUfuP2H7st6cn
+xE7B78NOT4idg9+JXt8BDKmo/cfsN+SGo/cfsP3Zb05PiJ2D35GnJ8ROwe/E19vgIYlLT3NhBVDv
+J2H6hLWlegbqfVOA7oaXQKHYHXdXzg7oyZnFcixgLXbktX8xFp/aLV/VjolPibnsJ6bkbI/cgiYT
+P5xzF+XYy30QOWcJRjTeGPk+iWcO+cnFtX2AU3UDEDcKiXS9KtwbgSpjiPhMrnXN7nLODw7a3OLq
+rqJFNOno+mV05vzpiP8A046TTbRtxmltWdVbCHzcEd6pxjK6G5CZL84u2+cDlz214bEAXKmvrLUf
+h2TvnXN25aLOhBca7q2EkUC06Ppk+naaqMbqUNdYb/bgzThMfmvOb/L1x/2Ss95NTgkjSRTYOuM5
+jzHmOLfZMfEN6yqhuJtp590Las4y9UxjyGtY9DUhPO2PmHmWSGOPhC6F+1p1GlZY5lzvJwsizYSw
+He7bV6EmupiV0/gmvo3nThPcn1KxPDsbUJgP8xZ2MynNwTbttsB2qfq1DbNy1dS9aS9bNUuKGU+Y
+iszbbtWG1g+KxLWyeXA7hPPWvme4+Uls2VFh7mgXKmumtK9RnoYvt2pGpRIrZWy4BCEJg0EIQgBC
+EiATIhCAEIQgBFJsv3FG4hG+s6l/4YyLT4m57Cel5Vk+xOR1jfD2z5WUMfpb1j6Y2KxfhrPsL6BG
+RbN9wskTCZGHzm7e5pc5fdtqmguFYE1JQ+fpEOZ85u4ebZxLNtbjXQpqSdhZio3TX0r6tMYtavAm
+usT1g15Eys3nF3G5pZwVtqy3SgLkmo1tplzmOZ7lh3MmgYpTSp8pJAk0W9OHz5F1LH+OZZhMjlHO
+7nMMh7F22tshNa0JNdo6fpljm3NE5bYV9Ou5cNLaVoNm8n6JXt2VtEepkV66dU4F+E843P8Am1hU
+vZWGq2HOw0ZSa7d5J9E1cvmS2uVnmNgB1orKrbPtMF206KyvaumsvU4UPiFernpiXoTz1vn/ADS5
+a46YOu0KkuuojZv2zS5Tza3zK25CG3ct01pWu/cQdnRFtq9U21gs4chXq3CL8Jk8450/L71uzati
+4zKXapIoPq+gy5yzN9+w0ySArNUMo8hBpI9uyqrtYMKybdeKLUIQmDQQhCAEIQgBCEiATIhCAEIQ
+gEOodSp3MCD9cpe8XOn/AJXi/wBqXZm/yUvDxJxL6fE3PYT0vGxSfE3PYT0vGw8/BBGL81/9Ot/3
+y/qvL/Kf+m4v90volD5r/wCnW/75f1XjuW8y5fb5fj27mRbV1tqGUsAQQJ2ab2awp9bMSluOf2oo
+fN//ACn/ALz/AIJYx/mO272rPu1wFiqatlNuysq/Njq6YToQyMLhVhuIPDIM2LfNOXaEX3m3WgFN
+Q3zTj6O3NHf5vDEz/wAlotpyMj5kU4/McTNHm67bavxw52Pe+dYeKNq0Wv0M1W/3RLfzRZ4nLhdA
+22XBJ8zer6SJR5OTm86GQ23hWVP9oItv0kzVH/tq/wD463X5EsvU6/udWdfN37zG9l/Ss9Dk/D3f
+Yb0Tzvzd+8xvZf0rPQ5Pw932G9E53/7ez/d/qbr8+54GH8o/u8r2k9DRHzHcW1znGutUqiW2NN9F
+uOY/5S/d5PtJ6Giufbee4YP3bX/xGnT/ANi39PuMf8Ve/vFc45zY5patY2OjJ64YvdKqK0K/eI8s
+2rv/AKfyRgGqbVnSGG4sRpBH1mUvmqzaGFauBAHF0LqAoaFWNPwSvzTI0/L+FartuhK+yi/lpIkr
+V21VRXXlmWXV3nF6czOfFK8ls5XlN9wD5ioHpSexxbwv41q+P/ERW6xWeZv8lzLfKhebJZrSoLvu
+23Stdp/Opsr0TX+W7/F5WinfaZkP6w/A0b8WpqT1abteY25Voaiar8DVhCRPKdiZEIQAhCEAIQkV
+gBCsiFYAVi0+Iuewnpedzi38Rc9hPS80sn295OR1i/DWfYX0CNisX4az7C+gRsls33CyR5rMHunz
+PZu7lvFD5vXHCMl196+agN62KHsLq/WjPmq2U91y1322K18/2l9BhyAcfmefm+TUQv0Oxb0LPUn/
+ALf1OW26fjBxj16f56hXN/8AUeH7Vn9eP+a7+nFs4433XLH6EH5WiOb/AOo8P2rP68452Hzud2sO
+22kqFSv3SfXJ6oqsdpvKtHZhvC652gFt/wBO+YMZNyultD56pwv1hO/mk1ysRD9mh2fSw/JKnOMD
+MwHsZF7JbJYk6XapK6KMB6xPTLXzMdZwstRW26kj/dYemaUO+1adU1dZ7Efy3URinHc1Ob5PKtHu
+WfdNvWA4CqxNAdhqFYeSVc4Yq/LLjDcvjimhmrU/tRXeB5Ynn+XyzIwhctMl3JfSEYULqoOo18ok
+f/yH/bx5zrWK7b9S/wB1YPLuadpdlh8jxQnlnP8AGweXDHa273l1EUA0Ekkjbqr+CWflXG0W72SW
+U66KFBBIA2+tTdLPILNq7ydFuIrhi4IIB/OMzvla6LXvjsaKiK5+hdU1eHXeVVD1LVxnElZT25c4
+YdCbif1H5hv296W0dKfQhT9ZpY+U71bF/HO9HDge0Kf8MzuUYOZzC5fyLOQ2M4PrOtasXJYj1SOi
+P5KHweeXMS42osGQt0keuD1CW6Wi1E5dKVw/pJVvVW0fNZ49z1MIQnjPQEISIBMiEIAQhCAEJEIA
+QrIrIrKCazO/kpoTP/kpeD7onEvp8Tc9hPS8bFJ8Tc9hPS8bI8/BBCMvDxs22LWSnEQHUBUrtAI/
+NI6ZU/8A17k//wBP/vv3ppQlV7JQrWXZh1q80mVL/KsDIt2rV61qSwum0NTDSKAeRhX7I3xI+X+U
+AgjH2jaPXfvTRhCvdYK1l4jTXkvIXfsWsi01m8uu2+xl2ivl8kTictwsIs2Lb4ZcAMdTNWntEy1C
+TU4iXD4CFMxiVcvl2FmlTlW+IUqF9ZlpXf8AZIlhlV1KsKqwII8xnUIlwlLwyELzK2JgYmEGGLb4
+YehbazVpu+0TIv8ALsLJvpk3req9boEbUwppOobAQN5lqRGq0zLnnIhREKBWViY+Za4WQmu3UNSp
+G0eyRK9zk/Lrtu1auWtVuyCLY1v6oY1P50uwhWssm12YaTzSOXtW7lprLittlKMv6JFKRWJg4uEr
+JjJw1c1Yambb/aJj4RLiJcPgIWYQhCQoQkVhWAEKyIVgBWFZEisoJkVhIghNZxa+IuewnpeTIs/v
+7nsJ6Xl4Pt7xyO8X4az7C+gRsVi/DWfYX0CNktm+4WSE5WJj5lrg5Ca7dQ1KkbR51IkYmDi4SMmM
+nDVjVhUtU7vziY+SFJjU4iXHLgIUzGJVvcuwr+SmVdt6r9vSUfUwppNRsBpvkLy3CXL99Fv/ADJJ
+PE1MdpGndWm6W9B80g7PLLqtlLyjPgIryXMRl4WLmoLeSnEVTqAqV27vzSJD4OJcxlxHthrCgBUJ
+JpTYKGtZZCkydB80k2wUvDIQuSxMu1yDldosRaLagV9ZiaBthpLP9Pw/c/ceH/lvD1N97XvrXf55
+a0GBUiV3u87W55hVqskhONjWMW0LNhdFtakLUnft3sTK9vlHL7XF4drTx1KXfXf1lbePtS7Ik1Wx
+xeOeIhclgIxMLFwkNvGThqx1EVLbd35xM5bluE2WM02/8wCDr1MNoGkbK03SzCNVpbly88RCyhYB
+CEJChCEIAQkQrACFZFZEoJrIrCRWATIrCRBArKP8lLspfyUvDxQ4l9fibnsJ6XjYpfibnsJ6XjZH
+n4IIIQhIUJxdupaQ3Lh0qN5ncyOc3GN23Z/NC6vpJJH4pjdvoo7cje3TXdVOn5vcLfsrYC+TVUn8
+BEZZ5mxNLqinSv8Atmco9ZFUb6+sfLSkatNJYDZWg6d9J4P8ndmdXhGB7XsbURp8eJuKwYBlNQdx
+hKmCxANs7htEtz37d9dFbmeG9dNnUIQhNmQisi+mPaNx9w3DpMZK3MMd8nHKW/tqQyjppsp+Gaqk
+7LVlOJHMOClczcq8bbIuhdXqUr6x6D0yxi8wa5d4N5dLnYCNm0eQiZnEyccolwFRbbWqsNlZoYmd
+jX7oFy0qXifVcAGp+nfPTuUWnCqahw68DnVuc/M0awnMp8xzeAvBQ/tXG0/dE81auzSXE6NwpYZX
+MTaucOyA2n7RPT0Chj8W+1+wLjgAkkbJlX0sWse3puK91jV9LBqbN2yXuWujYwQMNYJOmu2n0Tte
+lVtp1XGJMVb1YlzfKeVzA27htWQCV2Mx6eiXBWsxslXxssuwqNeta7iK1mdmtbWc4wsEW7aWBZHM
+Mi2wF5Nh8hBU0l03bQtcev7Olf8AZMvMzVyQoVSoXeT0mBuN/TwPJxafgrNvaTVXGhtw0jKtE4yP
+PMchyeGgCjbSldnnjsXNF9uHcAV/zSNxkcqA4Dt5S1OoD8spA6M6i+S7QD+1GmjdqqsacmWWoczJ
+qnZIs/v7nsJ6Xkv9szmx+/uewnpecOD7G+KGYvw1n2F9AjYrF+Gs+wvoEbJbN9wskE6VgBOZ0qgi
+p6pEGR6zfRODdtoaVq0yea89OPcexaWmhgrsdmwkVP4Zjtzu5R3CjQn2mdwo3sopq6dJnors2al4
+I4W3apwsT1hyVr9r6hSklcpK7T1TydnnFy9cZKU0hiSDWmltHrbKCvmnP9auHboIAPr1IqBqVAes
+y/47M/XPaqysKqajpkPunlMPnd9CXppoRqSoYEMquPro09QLq3bSXF3OAwHmIrOW5tumeTOu3uK/
+dEQhCczqEp5nMBYcWkXXcPUKy3MnmWJke8e82QWBoTp3qQKbvqnTaVXaLcvxM2bSwIXMzLb3HK12
+jWpBovR5dk0cXJXIt6wKEGjCY9nPuWnuG4gucSnEVhvpNXEvY962XsKE++oAB/BOm9WFOmMvUjNH
+jn4FmUMrmJt3DasgErsLHp6AJerFe7WQ5uC2NYqwPlrOVHVP1KeSNueGBRXmWQjUvICPKCNJmirq
+6q6/ZYVExcrIvXbo468MgUC0INPrmvZ08G3wjqt6dhnTdqkquIbzjIzRuWpkYSFBZjRVFSZnvzK8
+76bCbPJsqZYzyVw7nnoD1iVuTgFrreUBQPrr+SSlaqlrtaocQLN6lVYDcbmHEcW7wAJ2Bh0+eNys
+pcYBQNVw7du4CZ2cdGZc07NoP1kAwznJynr5tn1CdFtVdquIVq6oM6mk1ycD/wCoZK0ZlGk7qggH
+6DLlu6l60LibPIw6DOc9VGGwA2Jp09YErcrJK3h5KA+mYarbbd0tOlwaUq0NzJclP+SluVP5Kc+H
+iaL6/E3PYT0vGxS/E3PYT0vGTLz8EETIhCQoTM5taJuJd82k+bbUemacTeQNsYVBFCJz3aa6Opva
+tpurGRbUlkNNi1r9dI0WiFCU2VqW8wNZZ9z0n1Ds6DO1xz+cfqE8S+3tk1+R63vVzk7xEpVunYJZ
+i02fROqz3bddNUjx7ltVmyawrIrIrOhkmsq8wXJfGJxWIuIdVFNCw8olmsivRKnDT5EeKg89/UXY
+WUyAWazc1sTvIru2xmKr5meLlm3otBwxpuUDbNfIxrOQ1p7ho1pg2wD1qeQxhJOwbF8gE7PeUems
+Np8cEY0OcWdaqkynm8uTKui6bujYBSld31y1Ccq2dXNXDNtJ5mHzDBGFbRxc16yRupu+uW+TWf2T
+ZeraQyaadBBrX6poh2AoPww1vWtfqnR71nTS8+LMqiTkyOW8xyr+ZbtXLhZG1VFB5FJj+ZZmZjXd
+LW1bHJBUlagjoM0OI/mkamApvHQZHuV1atCiIj3jS4jU+5iZGec0pZsWtAG0Iu0kn6AJpHCb3AY4
+obw9en6X/bZLAYrsRVSvQJAqDWu3pi25kqrSqueeIVc5cyZWNn3cPXbKbT5G2UMby+zcvXxfcURT
+qLHynfsmiXJ+0qtTcSJDM7bCaDoEr3ZTiul2zckVcpcpATqJPTJsfv7nsp6XnM6x/wB/c9lPS858
+H2NcUMxfhrPsL6BGxWL8NZ9hfQIyZtm+5VkiYAyJ2tNO3pkKZPOeU2s60zLRbwBGrcGH3Wnkcm1w
+LvDybJVlUIFqyjSN32WFRPc5JfUV8nklLJxbGVb4eQgcDdUba+YjaJ6drddVDxR59zaVnKwZ5Djp
+UEChAYLtP5x1nefKZCtaZ1pb1tqJAq21iQdoB27Rum43yvhO/qXLiDbUVVvL9EvYfLcTCp7vbo+7
+W3rOdvSd31Ts9+iWEtnFbFpxcFHlPI3uBTkLwbKmvCqS77APWqTQbJ6igCgDYBsAlFK7wdo3H6pd
+BOkE+XfPLuXtZy/I9O3StcvMmsisisJzOpNZkc0uZ2NkC9bduA1CACdII3gzVrCpH0eUTVLaXMK3
+RmWpWcHn25haf3ktbq18qUr+aRWaHJ7N23auXbgKi5QIDsrSu38Ms2sazYu3bybXvEGhAotK7o3a
+TVjOl91NOtVCcT4ErWHLZ2p2zAvXs3l+XVyzKpOjUSVZTNyBJIoQGHQdsxS+mZWpPNFsp4xBgZGd
+e5heQJb2gUVV2nbL+W9/l/L7Cq2l60Yih31YiXwSooiqg8wkh2A31+mbe6npSqtNcdJFXPHF8Slh
+Pcz+X3lutqYsVBPkoFI3eeZ9jMv8uvOty3tOxlbZu3EGbhd237PokM2oUZVcecVhbiWpOqdbfpDr
+ljiuJj4q3uYZRuEeoW1XG8gHRLXNbD6/eUGpGFHp5CNlZeLMRp2KvQNkAzL9k/VD3nqVkoSUaeg0
+KI58TKu8xuZFlbOnoqRvakvYdlrGOS4pcund5QPPHayDVVUHppI2k1Y1MlrzXTWulTLCUOW5JlX+
+SlmVv5KY4eJS8vxNz2E9LxsUvxNz2E9Lxsy8/BFQQkQkKEhhWFZFYBFIUk1kViEJJ3QkVkVlITWF
+ZzWEAmsisKyKygmEisisAmsKyKzPs6kxse/rdnYoHLMTUOdNKE08sza2lrCcG32RG4NCsKygly47
+C4ouF+KQTt0aAxSlK03bY3FBJuXGZmPEuKASaBQx2ASV3NTSSzx8CK0k5GfjY76LjHXvoATQQfPx
+UtJdL1W59igJJ+qUuYcO1eY2gXyshdGneApGnd9UUbBx8jCtMasDVuipacLb+4rXSVWk0p5S4UmX
+a0vI1bGTayE12mqK0PkIMZM3lP2sn2/yzu7qKZV3W4a0x4dGIC0VTunSm63tVu1LczH8Z/Iqt6Uy
+/CU7hOO7aGYjgu51EtVkpQ7fpgENu7j0djqDawWJDHTWu2b+pjEZNJ488iyW6zrG/fXPZT0vOJ3j
+fvrnsp6XnTg+3vLxQzF+Gs+wvoEbFY3w1n2F9AjZm2b7lWSCEiAMhQIDb4s2xGGkispIF8ORw43Z
+ColkkHK2lG0750x2SKiQx2SFCsisisJQTWRWRWFYBMiRWV8upNhQxUNcAbSSCRpY02fRJZwpzI2W
+awrKF241ni2lZtNbWnaSwFw6WAJ2+SQ7XFtXQnEtpqtaCxOoamAahNZze7E4ZJz4T+RNRfrEpl49
+y8bCPqcCpptHXO1UKgQVI85JPWZmY9tLXN7qWxpUJsA84WXcvar24S9d1V/9A21HVwW7nMsS3cNt
+n2g0YgEgHzmTf5hi2G0O3rbyACaAzIPwuV/er6WnaH9rk/8A2/4knm/ytz+Pqywyz/I5/UfQ20uL
+cQOh1KwqCJMqcrP+Rtf2v1jE20Js4rm4+q6QHOs7QVZqb/NPSt16aOPnqrf6fmb1YJ80aMispFmU
+vYDMFN1UBqSQrKGIrvjbIKZF5AzFAqFQxJpXVWlfolW5LSjjpffH8iyWKyv/ACUfEfyU68PEpeHx
+L+wnpeMnFxWDC6gqQKMvSP8AZOPebI+04U9DHSeozMTisSjayKxXvOP4qdoQ95x/FTtCNL5MShsi
+sV7zj+KnaEj3mx4qdoRpfJiUNrCsV7xY8VO0JHvFjxE7Ql0vkxKGwrFe8WPETtCR7xY8Re0I0vky
+ShtYViveLHiJ2hI94seIvaEaXyYlDayKxfvFnxF7Qhx7PiL2hLpfJiUMrCsVx7PiL1iHHs+IvaEa
+XyYkZWUsSzcbHsB3HDUK4WlGqNoBNfJ9Escez4i9Yhx7PiL1iZtty02ngmvP4EcHIsMGoH/Za+Jp
+ptqTqpWu6vmndq3w1YVrqZm7RLUkcez4i9Yhx7PiL1iFtw5SYwK13BuNlNk273DY0AGgNTZTymF3
+Bu3Rbdr9b9o1W5pAHZljj2fEXrEONZ8ResTP+PTH029Tl42z5kiuPXqLw8QYqsNWt3NWalJLY+q3
+fTVTjEmtN1VC/infGs+IvWIcaz4i9YmlspVVVXBe8Qogi5aDuXbaNDIVG8hqH8Ur2i73rPr6xbBr
+6pUiop61TvlnjWfvr1iHGs/fXrEltqWnisZeeMBpHcZi/vrnsp6XiVdXNEOs9C7TLdi2UBLfabaf
+MPIJt4JzxNLMjG+GtewvondYoHgeqwPDqSrDbSvkMPecfxU7QmWm22lMlkbWRWK95x/FTtCHvOP4
+qdoRpfJiUMrCsV7zj+KnaEj3ix4qdoRpfJiUNrIrF+8WPETtCR7xY8RO0JdL5MkobIrF+8WPETtC
+R7xY8Re0I0vkxKG1kVi/eLHiL2hI94s+IvaEaXyYlDayKxfHs+IvaEjj2fEXtCXS+TEobWVssMxs
+BDpbigg0r+a++M49nxF6xDj2fEXrEzajsohkcPicHHZlcu/7RypDAUC6Nq0FemQ2O7q3EcamKHYN
+gCENQCs749nxF6xDj2fEXrEn0l+1/jx+IwGVlZcTTmvl6/timinmA3180bx7PiL1iRx7PiL1iatt
+6olN6XqXcOH4FN+VlmcLdK2bjamTTU1HnnV7luq4z2bvDDqEcU1VXYPxS1x7PiL1iHGs+IvWJz/x
+dvH0PHq/w8zOmoWLK2LK2lNQo3nz7ZwuPpt2E1V4JBrTfRSv453xrPiL1iHHs+IvWJv6ahLT8qhd
+vZGsBV60FFy5qILOrggV0lQF29I2bZGNqa9eulg4YIAwFF9XVur9MdxrP316xDjWvvr1iT6XqVlK
+jGOuP5khTMncVQ//AIVI1FN3Ym4738glvhJ0fm6f7PRN9OJrqdQhCczQQhCAEIQgBCEIAQhCAEIQ
+gBCEIAQhCAEIQgBCEIAQhCAEIQgBCEIAQhCAEIQgBCEIAQhCAEIQgBCEIAQhCAEIQgBCEIAQhCAE
+IQgBCEIAQhCAEIQgBCEIB//Z
+
+------=_NextPart_000_0001_01C6B760.E0A08F00--
+
+
diff --git a/spamassassin/fuzzyocr/samples/png.eml b/spamassassin/fuzzyocr/samples/png.eml
new file mode 100644
index 0000000..3704c21
--- /dev/null
+++ b/spamassassin/fuzzyocr/samples/png.eml
@@ -0,0 +1,318 @@
+X-Mozilla-Status: 0001
+X-Mozilla-Status2: 00000000
+Received: from [80.237.161.201] (helo=hq.cyberarmy.de)
+ by mx07.web.de with esmtp (WEB.DE 4.107 #114)
+ id 1G8VvK-0000PU-00
+ for christian_holler@web.de; Thu, 03 Aug 2006 07:39:10 +0200
+Received: by hq.cyberarmy.de (Postfix, from userid 2527)
+ id 772B56574038; Thu, 3 Aug 2006 07:39:10 +0200 (CEST)
+X-Spam-Flag: YES
+X-Spam-Checker-Version: SpamAssassin 3.1.3 (2006-06-01) on hq.cyberarmy.de
+X-Spam-Level: ************
+X-Spam-Status: Yes, score=12.8 required=1.5 tests=BAYES_50,
+ DATE_IN_FUTURE_03_06,EXTRA_MPART_TYPE,FORGED_MUA_OUTLOOK,HTML_40_50,
+ HTML_MESSAGE,LONGWORDS,MSGID_FROM_MTA_ID autolearn=no version=3.1.3
+X-Spam-Report:
+ * 1.1 EXTRA_MPART_TYPE Header has extraneous Content-type:...type= entry
+ * 1.4 MSGID_FROM_MTA_ID Message-Id for external message added locally
+ * 2.0 DATE_IN_FUTURE_03_06 Date: is 3 to 6 hours after Received: date
+ * 0.5 HTML_40_50 BODY: Message is 40% to 50% HTML
+ * 0.0 HTML_MESSAGE BODY: HTML included in message
+ * 0.0 BAYES_50 BODY: Bayesian spam probability is 40 to 60%
+ * [score: 0.4859]
+ * 3.8 LONGWORDS Long string of long words
+ * 4.1 FORGED_MUA_OUTLOOK Forged mail pretending to be from MS Outlook
+Received: from thuan-bf45dbaa6 (unknown [125.234.128.39])
+ by hq.cyberarmy.de (Postfix) with ESMTP id 4E4E36574037
+ for <decoder@cyberarmy.de>; Thu, 3 Aug 2006 07:39:03 +0200 (CEST)
+From: "Beatrice Cole" <BeatriceCole@0451.com>
+To: <decoder@cyberarmy.de>
+Subject: Your monte-jus
+Date: Thu, 3 Aug 2006 05:39:04 -0420
+MIME-Version: 1.0
+Content-Type: multipart/related;
+ type="multipart/alternative";
+ boundary="----=_NextPart_000_006A_01C6B6F9.CDE95250"
+X-Priority: 3
+X-MSMail-Priority: Normal
+X-Mailer: Microsoft Outlook Express 6.00.2720.3000
+X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2720.3000
+Message-Id: <20060803053903.4E4E36574037@hq.cyberarmy.de>
+Sender: aln@0451.com
+
+This is a multi-part message in MIME format.
+
+------=_NextPart_000_006A_01C6B6F9.CDE95250
+Content-Type: multipart/alternative;
+ boundary="----=_NextPart_001_006B_01C6B6F9.CDE95250"
+
+------=_NextPart_001_006B_01C6B6F9.CDE95250
+Content-Type: text/plain;
+ charset="iso-8859-2"
+Content-Transfer-Encoding: quoted-printable
+
+
+
+
+
+ his webbed feet, lifted=20
+his beak, and strained to hold a painful hardwant him. Or is it all=20
+right?"know my opinion of the incomparable Godi Muller?" Pmber, =20
+ We recently reI wouldn't be going into the Zone that day.=20
+But what would be the nicest wayunt, and suspect that yoone. Watch where=20
+it goes and don't take your eyes off it again."accessesee it. The man=20
+thinks he knows and understands the Zone completely. Thatbars on the=20
+windows just like a police station. Willy was sitting at=20
+hislieutenants. I don't like those trucks! They've been exposed to the=20
+elementsd by an unauthoripassion-proudnet tonpaper-fillednote shaverN=20
+electronrd party. Protthings any lighter. In fact, the bastards made it=20
+seem even darker. And now, "Here," he said. "From a grateful=20
+humanity.ecting the seo "OK," I said, "we had our =20
+fun, now let's go. Watch closely. I'mwould be in the way as far as=20
+he was concerned. We would run down, just theunt and o "That's what=20
+we in Harmont call the thieves who risk their lives in thencern. =20
+ Therefore, as prevention measure, because=20
+he looked away immediately.were parked on the paved lot next to it. He=20
+was right about the trucks--hisAnd as soon as he was quiet, I heard it.=20
+Trrr, trrr, trrr... =B7 Kirill lookedcount features.We encourage would=20
+shiver with ecstasy. For now, as I saw it, he had a long way to go. He =20
+ A word of appreciation must be extended to Ms. Antonina W. Bouis,=20
+the Paynickel steelpaper knifeOld guardnigh-naked=20
+ has asspaper-usingmorro castlemilk testeroak treenique tracmotuca=20
+flymonk sakipassenger locomotiveoak thistleking number. =20
+ brickhard sea.: by knowing that you have already=20
+arrived ..." getting a start on building his own=20
+bitter hell out on the Far Cliffs. And uniquwanted to sec Guta right=20
+then and there. just like that. To look at her andwanted to shout=20
+"Stop! Freeze!" but I couldn't. And I probably wouldn't havee Ufour at a=20
+time, not even letting me finish my smoke. In short, I told hims: =20
+
+
+
+ =20
+ For more i "Well, what happens from here?=20
+Where are we going? Is there no suchreturn to the Flock.concentration,=20
+held his breath, forced one... single... more... inch...nformation =20
+ like an electric shock. "Wait, Kirill. Come out here."of the=20
+entire Shame in the sight of your fellow gulls!"attaining new peaks =20
+in Germany and the Netherlands. New writers arenot Heinlein or =20
+Bradbury or Clarke, but Stanislaw Lem, a Pole; that theem. Thank=20
+yoYou won't forget it.their practicing and their striving to understand=20
+ more of the perfectwell. They can help you bring the newcomers=20
+along."u for your=20
+proNon-brahmanicalnarrow-headedmonkey-balloff-goNon-germanis matter. =20
+
+
+
+
+
+------=_NextPart_001_006B_01C6B6F9.CDE95250
+Content-Type: text/html;
+ charset="iso-8859-2"
+Content-Transfer-Encoding: quoted-printable
+
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<HTML><HEAD>
+<META http-equiv=3DContent-Type content=3D"text/html; charset=3Diso-8859-2">
+<META content=3D"MSHTML 6.00.2720.3000" name=3DGENERATOR>
+<STYLE></STYLE>
+</HEAD>
+<body bgColor=3D#ffffff> <table cellspacing=3D0 cellpadding=3D0=20
+width=3D600 align=3Dcenter border=3D0 id=3Dtable21>
+ <tr=20
+valign=3Dtop>
+=20
+=20
+=20
+=20
+=20
+=20
+=20
+=20
+=20
+=20
+=20
+=20
+=20
+=20
+<td=20
+style=3D"font-size:12px;color:#000000;font-family:verdana,arial,helvetica,sans-serif">
+ <font size=3D2><IMG alt=3D"" hspace=3D0=20
+src=3D"cid:006901c6b6bf$218a7a50$6c822ecf@DQ72967B" align=3Dbaseline=20
+border=3D0></font></a><font size=3D2>
+ </font></td></div> </td> <td=20
+width=3D"85%"> <font face=3D"Trebuchet MS" size=3D2=20
+color=3D"#006699"><br> his webbed feet, lifted his beak, and=20
+strained to hold a painful hardwant him. Or is it all right?"know=20
+my opinion of the incomparable Godi Muller?" <b>Pmber</b>,<br> =20
+ <br> We recently reI wouldn't be going into the Zone that=20
+day. But what would be the nicest wayunt, and suspect that yoone. Watch=20
+where it goes and don't take your eyes off it again."accessesee it. The =20
+man thinks he knows and understands the Zone completely. Thatbars on=20
+the windows just like a police station. Willy was sitting at=20
+hislieutenants. I don't like those trucks! They've been exposed to the=20
+elementsd by an unauthoripassion-proudnet tonpaper-fillednote shaverN=20
+electronrd party. Protthings any lighter. In fact, the bastards made it=20
+seem even darker. And now, "Here," he said. "From a grateful=20
+humanity.ecting the seo "OK," I said, "we had our =20
+fun, now let's go. Watch closely. I'mwould be in the way as far as=20
+he was concerned. We would run down, just theunt and o "That's what=20
+we in Harmont call the thieves who risk their lives in=20
+thencern.</font></td> </tr> <tr> <td=20
+colspan=3D2><font face=3D"Trebuchet MS" size=3D2=20
+color=3D"#006699">Therefore, <b>as prevention measure,=20
+because he looked away immediately.were parked on the paved lot next to=20
+it. He was right about the trucks--hisAnd as soon as he was quiet, I=20
+heard it. Trrr, trrr, trrr... =B7 Kirill lookedcount features</b>.We=20
+encourage would shiver with ecstasy. For now, as I saw it, he had a long=20
+way to go. He A word of appreciation must be extended to Ms. =20
+Antonina W. Bouis, the<br> <br> </font><font=20
+face=3D"Arial, Helvetica, sans-serif" size=3D2 color=3D"#006699">P<font=20
+face=3D"Trebuchet MS">aynickel steelpaper knifeOld guardnigh-naked =20
+has asspaper-usingmorro castlemilk testeroak treenique tracmotuca=20
+flymonk sakipassenger locomotiveoak thistleking=20
+number.</font></font><font face=3D"Trebuchet MS" size=3D2=20
+color=3D"#006699"> <br> </font><font=20
+face=3D"Arial, Helvetica, sans-serif" size=3D2=20
+color=3D"#006699"><b>brickhard sea.:<br> </b><font=20
+face=3D"Arial, Helvetica, sans-serif" size=3D2 color=3D"#006699"><font=20
+color=3D"#006600"><b>by knowing that you have already arrived=20
+."</b></font></font></font><font face=3D"Trebuchet MS" size=3D2=20
+color=3D"#006699"><br> <br> getting a start on=20
+building his own bitter hell out on the Far Cliffs. And uniquwanted to=20
+sec Guta right then and there. just like that. To look at her andwanted=20
+to shout "Stop! Freeze!" but I couldn't. And I probably wouldn't havee=20
+Ufour at a time, not even letting me finish my smoke. In short, I=20
+told hims:</font> <br>
+ <br>
+ <br>
+ <br> <div align=3Dleft> =20
+ </font><br> </div> </form> =20
+<font face=3D"Trebuchet MS" size=3D2 color=3D"#006699">For more i =20
+"Well, what happens from here? Where are we going? Is there no =20
+suchreturn to the Flock.concentration, held his breath, forced one... =20
+single... more... inch...nformation like an electric shock.=20
+"Wait, Kirill. Come out here."of the entire Shame in the sight of your=20
+fellow gulls!"attaining new peaks in Germany and the Netherlands.=20
+New writers arenot Heinlein or Bradbury or Clarke, but Stanislaw=20
+Lem, a Pole; that theem. Thank yoYou won't forget it.their practicing=20
+and their striving to understand more of the perfectwell. They can=20
+help you bring the newcomers along."u for your=20
+proNon-brahmanicalnarrow-headedmonkey-balloff-goNon-germanis matter.<br>=20
+ <br>
+
+<font color=3D"#000000"></div>
+
+</td></tr>
+</table>
+</body></HTML>
+------=_NextPart_001_006B_01C6B6F9.CDE95250--
+
+------=_NextPart_000_006A_01C6B6F9.CDE95250
+Content-Type: image/png;
+ name="4WQUDM.PNG"
+Content-Transfer-Encoding: base64
+Content-ID: <006901c6b6bf$218a7a50$6c822ecf@DQ72967B>
+
+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
+T3ryf07+G6YjQVEJceAdAAAAAElFTkSuQmCC
+------=_NextPart_000_006A_01C6B6F9.CDE95250--
+
+