ABI

 view release on metacpan or  search on metacpan

ABI.pm  view on Meta::CPAN

=head1 VERSION

Version 1.0

=cut

our $VERSION = '1.0';

=head1 SYNOPSIS

  my $abi = ABI->new(-file=>"mysequence.abi");
  my $seq = $abi->get_sequence(); # To get the sequence
  my @trace_a = $abi->get_trace("A"); # Get the raw traces for "A"
  my @trace_g = $abi->get_trace("G"); # Get the raw traces for "G"
  my @base_calls = $abi->get_base_calls(); # Get the base calls

=head1 DESCRIPTION

An ABI chromatogram file is in binary format. It contain several 
information only some of which is required for normal use. This
module only gives access to the most used information stored in
ABI file. All the accesses are read only.

If you have edited the file using a trace editor, then you can use the corresponding 
method to access the edited sequence and base calls.



=head1 CONSTRUCTOR

=head2 new()

  Usage : $abi = ABI->new(-file=>"filename");
          $abi = ABI->new("filename"); # same thing

=cut

sub new {
	my $class = shift;
	my $self  = {};
	bless $self, ref($class) || $class;
	$self->_init(@_);

	#print "****", $self->{_mac_header}, "\n";
	return $self;
}

sub _init {
	my ( $self, @args ) = @_;
	my ($file) = $self->_rearrange( ["FILE"], @args );
	if ( !defined($file) ) {
		croak "Can't open the input file\n";
	} else {
		$self->set_file_handle($file);
	}
	$self->{_sequence}             = "";
	$self->{_sequence_corrected}   = "";
	$self->{_sample}               = "";
	$self->{A}                     = [];
	$self->{T}                     = [];
	$self->{G}                     = [];
	$self->{C}                     = [];
	$self->{_basecalls}            = [];
	$self->{_basecalls_corrected}  = [];
	$self->{_trace_length}         = 0;
	$self->{_seq_length}           = 0;
	$self->{_seq_length_corrected} = 0;
	$self->{_abs_index}            = 26;
	$self->{_index}                = undef;
	$self->{PLOC1}                 = undef;
	$self->{PLOC}                  = undef;
	$self->{_a_start}              = undef;
	$self->{_g_start}              = undef;
	$self->{_c_start}              = undef;
	$self->{_t_start}              = undef;
	$self->{DATA9}                 = undef;
	$self->{DATA10}                = undef;
	$self->{DATA11}                = undef;
	$self->{DATA12}                = undef;
	$self->{PBAS1}                 = undef;
	$self->{PBAS2}                 = undef;
	$self->{FWO}                   = undef;
	$self->{_mac_header}           = 0;
	$self->{_maximum_trace}        = 0;

	if ( $self->_is_abi() ) {

		#print "ABI FILE\n";
		$self->_set_index();
		$self->_set_base_calls();
		$self->_set_corrected_base_calls();
		$self->_set_seq();
		$self->_set_corrected_seq();
		$self->_set_traces();
		$self->_set_max_trace();
		$self->_set_sample_name();
		close( $self->{_fh} );
	}
	return $self;
}

sub set_file_handle {
	my $self = shift;
	my $path = shift;
	my $fh   = IO::File->new();
	if ( $fh->open("< $path") ) {
		binmode($fh);
		$self->{_fh} = $fh;
	} else {
		croak "Could not open $path in ABITrace::set_file_handle\n";
	}
}

sub _rearrange {
	my ( $self, $order, @param ) = @_;
	return unless @param;
	return @param unless ( defined( $param[0] ) && $param[0] =~ /^-/ );
	for ( my $i = 0 ; $i < @param ; $i += 2 ) {
		$param[$i] =~ s/^\-//;
		$param[$i] =~ tr/a-z/A-Z/;
	}

	# Now we'll convert the @params variable into an associative array.
	local ($^W) = 0;    # prevent "odd number of elements" warning with -w.
	my (%param) = @param;
	my (@return_array);

	# What we intend to do is loop through the @{$order} variable,
	# and for each value, we use that as a key into our associative
	# array, pushing the value at that key onto our return array.
	my ($key);
	foreach $key ( @{$order} ) {
		my ($value) = $param{$key};
		delete $param{$key};
		push( @return_array, $value );
	}

#    print "\n_rearrange() after processing:\n";
#    my $i; for ($i=0;$i<@return_array;$i++) { printf "%20s => %s\n", ${$order}[$i], $return_array[$i]; } <STDIN>;
	return (@return_array);
}

sub _is_abi {
	my $self = shift;
	my $fh   = $self->{"_fh"};
	my $buf;
	seek( $fh, 0, 0 );
	read( $fh, $buf, 3 );

	#my $a = unpack("n*", $buf);
	if ( $buf eq "ABI" ) {
		return 1;
	} else {
		seek( $fh, 128, 0 );
		read( $fh, $buf, 3 );
		if ( $buf eq "ABI" ) {
			$self->_set_mac_header();
			return 1;
		} else {
			return 0;
		}
	}
}

sub _set_mac_header {
	my $self = shift;
	$self->{_mac_header} = 128;
}

sub _set_index {
	my $self         = shift;
	my $data_counter = 0;
	my $pbas_counter = 0;
	my $ploc_counter = 0;
	my ( $num_records, $buf );

	#print $self->{_fh}, "\n";
	#print $self->{_mac_header}, "\n";
	seek( $self->{_fh}, $self->{_abs_index} + $self->{_mac_header}, 0 );
	read( $self->{_fh}, $buf, 4 );
	$self->{_index} = unpack( "N", $buf );

	#print $self->{_index};
	seek( $self->{_fh}, $self->{_abs_index} - 8 + $self->{_mac_header}, 0 );
	read( $self->{_fh}, $buf, 4 );
	$num_records = unpack( "N", $buf );
	for ( my $i = 0 ; $i <= $num_records - 1 ; $i++ ) {
		seek( $self->{_fh}, $self->{_index} + ( $i * 28 ), 0 );
		read( $self->{_fh}, $buf, 4 );
		if ( $buf eq "FWO_" ) {
			$self->{FWO} = $self->{_index} + ( $i * 28 ) + 20;
		}
		if ( $buf eq "DATA" ) {
			$data_counter++;
			if ( $data_counter == 9 ) {
				$self->{DATA9} = $self->{_index} + ( $i * 28 ) + 20;
			}
			if ( $data_counter == 10 ) {
				$self->{DATA10} = $self->{_index} + ( $i * 28 ) + 20;
			}
			if ( $data_counter == 11 ) {
				$self->{DATA11} = $self->{_index} + ( $i * 28 ) + 20;
			}
			if ( $data_counter == 12 ) {
				$self->{DATA12} = $self->{_index} + ( $i * 28 ) + 20;
			}
		}
		if ( $buf eq "PBAS" ) {
			$pbas_counter++;
			if ( $pbas_counter == 1 ) {
				$self->{PBAS1} = $self->{_index} + ( $i * 28 ) + 20;
			}
			if ( $pbas_counter == 2 ) {
				$self->{PBAS2} = $self->{_index} + ( $i * 28 ) + 20;
			}
		}
		if ( $buf eq "PLOC" ) {
			$ploc_counter++;
			if ( $ploc_counter == 1 ) {
				$self->{PLOC1} = $self->{_index} + ( $i * 28 ) + 20;
			}
			if ( $ploc_counter == 2 ) {
				$self->{PLOC} = $self->{_index} + ( $i * 28 ) + 20;
			}
		}
		if ( $buf eq "SMPL" ) {
			$self->{SMPL} = $self->{_index} + ( $i * 28 ) + 20;
		}
	}
	seek( $self->{_fh}, $self->{DATA12} - 8, 0 );
	read( $self->{_fh}, $buf, 4 );
	$self->{_trace_length} = unpack( "N", $buf );
	seek( $self->{_fh}, $self->{PBAS2} - 4, 0 );
	read( $self->{_fh}, $buf, 4 );
	$self->{_seq_length} = unpack( "N", $buf );
	seek( $self->{_fh}, $self->{PBAS1} - 4, 0 );
	read( $self->{_fh}, $buf, 4 );
	$self->{_seq_length_corrected} = unpack( "N", $buf );
	$self->{PLOC}   = $self->_get_int( $self->{PLOC} ) + $self->{_mac_header};
	$self->{PLOC1}  = $self->_get_int( $self->{PLOC1} ) + $self->{_mac_header};
	$self->{DATA9}  = $self->_get_int( $self->{DATA9} ) + $self->{_mac_header};
	$self->{DATA10} = $self->_get_int( $self->{DATA10} ) + $self->{_mac_header};
	$self->{DATA11} = $self->_get_int( $self->{DATA11} ) + $self->{_mac_header};
	$self->{DATA12} = $self->_get_int( $self->{DATA12} ) + $self->{_mac_header};
	$self->{PBAS1}  = $self->_get_int( $self->{PBAS1} ) + $self->{_mac_header};
	$self->{PBAS2}  = $self->_get_int( $self->{PBAS2} ) + $self->{_mac_header};
	$self->{SMPL} += $self->{_mac_header};
}

sub _set_base_calls {
	my $self = shift;
	my $buf;
	my $length = $self->{_seq_length} * 2;
	my $fh     = $self->{_fh};
	seek( $fh, $self->{PLOC}, 0 );
	read( $fh, $buf, $length );
	@{ $self->{_basecalls} } = unpack( "n" x $length, $buf );

	# print "@{$self->{_basecalls}}" , "\n";
}

sub _set_corrected_base_calls {
	my $self = shift;
	my $buf;
	my $length = $self->{_seq_length_corrected} * 2;
	my $fh     = $self->{_fh};
	seek( $fh, $self->{PLOC1}, 0 );
	read( $fh, $buf, $length );
	@{ $self->{_basecalls_corrected} } = unpack( "n" x $length, $buf );
}

sub _set_seq {
	my $self = shift;
	my $buf;
	my $length = $self->{_seq_length};
	my $fh     = $self->{_fh};
	seek( $fh, $self->{PBAS2}, 0 );
	read( $fh, $buf, $length );
	$self->{_sequence} = $buf;

	#my @seq = unpack( "C" x $length, $buf);
	#print $buf, "\n";
}

sub _set_corrected_seq {
	my $self = shift;
	my $buf;
	my $length = $self->{_seq_length_corrected};
	my $fh     = $self->{_fh};
	seek( $fh, $self->{PBAS1}, 0 );
	read( $fh, $buf, $length );
	$self->{_sequence_corrected} = $buf;
}

sub _set_traces {
	my $self = shift;
	my $buf;
	my ( @pointers, @A, @G, @C, @T );
	my (@datas) =
	  ( $self->{DATA9}, $self->{DATA10}, $self->{DATA11}, $self->{DATA12} );
	my $fh = $self->{_fh};
	seek( $fh, $self->{FWO}, 0 );
	read( $fh, $buf, 4 );
	my @order = split( //, $buf );

	#print "@order", "\n";
	for ( my $i = 0 ; $i < 4 ; $i++ ) {
		if ( $order[$i] =~ /A/i ) {
			$pointers[0] = $datas[$i];
		} elsif ( $order[$i] =~ /C/i ) {
			$pointers[1] = $datas[$i];
		} elsif ( $order[$i] =~ /G/i ) {
			$pointers[2] = $datas[$i];
		} elsif ( $order[$i] =~ /T/i ) {
			$pointers[3] = $datas[$i];
		} else {
			croak "Wrong traces\n";
		}
	}
	for ( my $i = 0 ; $i < 4 ; $i++ ) {
		seek( $fh, $pointers[$i], 0 );
		read( $fh, $buf, $self->{_trace_length} * 2 );
		if ( $i == 0 ) {
			@A = unpack( "n" x $self->{_trace_length}, $buf );
		}
		if ( $i == 1 ) {
			@C = unpack( "n" x $self->{_trace_length}, $buf );
		}
		if ( $i == 2 ) {
			@G = unpack( "n" x $self->{_trace_length}, $buf );
		}
		if ( $i == 3 ) {
			@T = unpack( "n" x $self->{_trace_length}, $buf );
		}
	}
	@{ $self->{A} } = @A;
	@{ $self->{G} } = @G;
	@{ $self->{T} } = @T;
	@{ $self->{C} } = @C;
}

sub _get_int {
	my $self = shift;
	my $buf;
	my $pos = shift;
	my $fh  = $self->{_fh};
	seek( $fh, $pos, 0 );
	read( $fh, $buf, 4 );
	return unpack( "N", $buf );
}

sub _set_max_trace {
	my $self = shift;
	my @A    = @{ $self->{A} };
	my @T    = @{ $self->{T} };
	my @G    = @{ $self->{G} };
	my @C    = @{ $self->{C} };
	my $max  = 0;
	for ( my $i = 0 ; $i < @T ; $i++ ) {
		if ( $T[$i] > $max ) { $max = $T[$i]; }
		if ( $A[$i] > $max ) { $max = $A[$i]; }
		if ( $G[$i] > $max ) { $max = $G[$i]; }
		if ( $C[$i] > $max ) { $max = $C[$i]; }
	}
	$self->{_maximum_trace} = $max;
}

sub _set_sample_name {
	my $self = shift;
	my $buf;
	my $fh = $self->{_fh};
	seek( $fh, $self->{SMPL}, 0 );
	read( $fh, $buf, 1 );
	my $length = unpack( "C", $buf );
	read( $fh, $buf, $length );
	$self->{_sample} = $buf;
}

=head1 METHODS

=head2 get_max_trace()

  Title    :  get_max_trace()
  Usage    :  $max = $abi->get_max_trace();
  Function :  Returns the maximum trace value of all the traces.
  Args     :  Nothing
  Returns  :  A scalar

=cut

sub get_max_trace {
	my $self = shift;
	return $self->{_maximum_trace};
}

=head2 get_trace()

  Title    :  get_trace()
  Usage    :  my @a = $abi->get_trace("A");
  Function :  Returns the raw traces as array.
  Args     :  "A" or "G" or "C" or "T"
  Returns  :  An array

=cut

sub get_trace {
	my $self   = shift;
	my $symbol = shift;
	if ( $symbol =~ /A/i ) {
		return @{ $self->{A} };
	} elsif ( $symbol =~ /G/i ) {
		return @{ $self->{G} };
	} elsif ( $symbol =~ /C/i ) {
		return @{ $self->{C} };
	} elsif ( $symbol =~ /T/i ) {
		return @{ $self->{T} };
	} else {
		croak "Illegal symbol\n";
	}
}

=head2 get_sequence()

  Title    : get_sequence()
  Usage    : my $seq = $abi->get_sequence();
  Function : Returns the original unedited sequence as string. If you want to access the edited
             sequence use "get_corrected_sequence()" instead.
  Args     : Nothing
  Returns  : A scalar

=cut

sub get_sequence {
	my $self = shift;
	return $self->{_sequence};
}

=head2 get_corrected_sequence()

  Title    : get_corrected_sequence()
  Usage    : my $seq = $abi->get_corrected_sequence();
  Function : Returns the corrected sequence as string. If you want to access the original 
             unedited sequence, use "get_sequence()" instead.
  Args     : Nothing
  Returns  : A scalar

=cut

sub get_corrected_sequence {
	my $self = shift;
	return $self->{_sequence_corrected};
}

=head2 get_sequence_length()

  Title    : get_sequence_length()
  Usage    : my $seq_length = $abi->get_sequence_length();
  Function : Returns the sequence length of the orginal unedited sequence.
  Args     : Nothing
  Returns  : A scalar

=cut

sub get_sequence_length {
	my $self = shift;
	return $self->{_seq_length};
}

=head2 get_corrected_sequence_length()

  Title    : get_corrected_sequence_length()
  Usage    : my $seq_length = $abi->get_corrected_sequence_length();
  Function : Returns the length of the edited sequence. 
  Args     : Nothing
  Returns  : A scalar

=cut

sub get_corrected_sequence_length {
	my $self = shift;

	#print STDERR "**ABI**",$self->{_seq_length_corrected},"\n";
	return $self->{_seq_length_corrected};
}

=head2 get_trace_length()

  Title    : get_trace_length()
  Usage    : my $trace_length = $abi->get_trace_length();
  Function : Returns the trace length
  Args     : Nothing
  Returns  : A scalar

=cut

sub get_trace_length {
	my $self = shift;
	return $self->{_trace_length};
}

=head2 get_base_calls()

  Title    : get_base_calls()
  Usage    : my @base_calls = $abi->get_base_calls();
  Function : Returns the called bases by the base caller. This method will return the unedited 
  	         original basecalls created by the basecaller.
  Args     : Nothing
  Returns  : An array

=cut

sub get_base_calls {
	my $self = shift;
	return @{ $self->{_basecalls} };
}

=head2 get_corrected_base_calls()

  Title    : get_corrected_base_calls()
  Usage    : my @base_calls = $abi->get_corrected_base_calls();
  Function : If you have edited the trace file you can get the corrected base call 
             with this method
  Args     : Nothing
  Returns  : An array

=cut

sub get_corrected_base_calls {
	my $self = shift;
	return @{ $self->{_basecalls_corrected} };
}

=head2 get_sample_name()

  Title    : get_sample_name()
  Usage    : my $sample = $abi->get_sample_name();
  Function : Returns hard coded sample name
  Args     : Nothing
  Returns  : A scalar

=cut

sub get_sample_name {
	my $self = shift;
	return $self->{_sample};
}

=head1 AUTHOR

Malay <malay@bioinformatics.org>

=head1 BUGS

Please report any bugs or feature requests to
C<bug-abi at rt.cpan.org>, or through the web interface at

Changes  view on Meta::CPAN

#$Id: Changes,v 1.1.1.1.2.2 2006/11/20 03:18:12 malay Exp $

Revision history for Perl extension ABI.

1.0  Sat Nov  18  04:22:53 2006
	- Changed to Module::Build system
	- Added test data
	- Changed to Test::More
	- Access to user modified sequence
	- Access to user modified basecalls
	

0.01  Thu May  2 04:22:53 2002
	- original version; created by h2xs 1.21 with options
		-XA -n ABI

LICENSE  view on Meta::CPAN





                         The "Artistic License"

                                Preamble

The intent of this document is to state the conditions under which a
Package may be copied, such that the Copyright Holder maintains some
semblance of artistic control over the development of the package,
while giving the users of the package the right to use and distribute
the Package in a more-or-less customary fashion, plus the right to make
reasonable modifications.

Definitions:

        "Package" refers to the collection of files distributed by the
        Copyright Holder, and derivatives of that collection of files
        created through textual modification.

        "Standard Version" refers to such a Package if it has not been
        modified, or has been modified in accordance with the wishes
        of the Copyright Holder as specified below.

        "Copyright Holder" is whoever is named in the copyright or
        copyrights for the package.

        "You" is you, if you're thinking about copying or distributing
        this Package.

        "Reasonable copying fee" is whatever you can justify on the
        basis of media cost, duplication charges, time of people involved,
        and so on.  (You will not be required to justify it to the
        Copyright Holder, but only to the computing community at large
        as a market that must bear the fee.)

        "Freely Available" means that no fee is charged for the item
        itself, though there may be fees involved in handling the item.
        It also means that recipients of the item may redistribute it
        under the same conditions they received it.

1. You may make and give away verbatim copies of the source form of the
Standard Version of this Package without restriction, provided that you
duplicate all of the original copyright notices and associated disclaimers.

2. You may apply bug fixes, portability fixes and other modifications
derived from the Public Domain or from the Copyright Holder.  A Package
modified in such a way shall still be considered the Standard Version.

3. You may otherwise modify your copy of this Package in any way, provided
that you insert a prominent notice in each changed file stating how and
when you changed that file, and provided that you do at least ONE of the
following:

    a) place your modifications in the Public Domain or otherwise make them
    Freely Available, such as by posting said modifications to Usenet or
    an equivalent medium, or placing the modifications on a major archive
    site such as uunet.uu.net, or by allowing the Copyright Holder to include
    your modifications in the Standard Version of the Package.

    b) use the modified Package only within your corporation or organization.

    c) rename any non-standard executables so the names do not conflict
    with standard executables, which must also be provided, and provide
    a separate manual page for each non-standard executable that clearly
    documents how it differs from the Standard Version.

    d) make other distribution arrangements with the Copyright Holder.

4. You may distribute the programs of this Package in object code or
executable form, provided that you do at least ONE of the following:

    a) distribute a Standard Version of the executables and library files,
    together with instructions (in the manual page or equivalent) on where
    to get the Standard Version.

    b) accompany the distribution with the machine-readable source of
    the Package with your modifications.

    c) give non-standard executables non-standard names, and clearly
    document the differences in manual pages (or equivalent), together
    with instructions on where to get the Standard Version.

    d) make other distribution arrangements with the Copyright Holder.

5. You may charge a reasonable copying fee for any distribution of this
Package.  You may charge any fee you choose for support of this
Package.  You may not charge a fee for this Package itself.  However,
you may distribute this Package in aggregate with other (possibly
commercial) programs as part of a larger (possibly commercial) software
distribution provided that you do not advertise this Package as a
product of your own.  You may embed this Package's interpreter within
an executable of yours (by linking); this shall be construed as a mere
form of aggregation, provided that the complete Standard Version of the

Makefile.PL  view on Meta::CPAN

# Note: this file was auto-generated by Module::Build::Compat version 0.03
use ExtUtils::MakeMaker;
WriteMakefile
(
          'PL_FILES' => {},
          'INSTALLDIRS' => 'site',
          'NAME' => 'ABI',
          'EXE_FILES' => [],
          'VERSION_FROM' => 'ABI.pm',
          'PREREQ_PM' => {
                           'Test::More' => 0
                         }
        )
;

README  view on Meta::CPAN

ABI.pm
================

Perl module to parse chromatogram file generated by Applied Biosystems (ABI)
automated DNA sequencer.

The README is used to introduce the module and provide instructions on
how to install the module, any machine dependencies it may have (for
example C compilers and installed libraries) and any other information
that should be provided before the module is installed.

A README file is required for CPAN modules since CPAN extracts the
README file from a module distribution so that people browsing the
archive can use it get an idea of the modules uses. It is usually a
good idea to provide version information here so that people can
decide whether fixes for the module are worth downloading.

INSTALLATION

To install this module type the following:

   perl Makefile.PL
   make
   make test
   make install

 - or -
 
  perl Build.PL
  ./Build
  ./Build test
  ./Build install

DEPENDENCIES

This module requires Test::More

COPYRIGHT AND LICENCE

Copyright (C) 2002,2006 Malay Kumar Basu <malay@bioinformatics.org>

This module is distributed under Perl artistic license. See "License" file
for details.

t/test.t  view on Meta::CPAN

use Test::More qw(no_plan);

#BEGIN { plan tests => 1 };
require_ok("ABI");
my $abi = ABI->new("t/TEST_modified.ab1");
isa_ok( $abi, "ABI" );
my @base_calls = $abi->get_base_calls;

#print STDERR "@base_calls";
my @b_calls =
  qw(20 33 46 56 67 82 89 102 111 124 136 151 163 174 185 192 204 215
  225 233 246 258 274 285 297 308 324 340 349 356 369 383 393 403 413
  422 434 447 458 467 477 487 499 513 523 529 544 552 562 570 581 593
  603 615 624 634 644 657 668 680 690 702 714 726 736 746 756 766 776
  784 796 808 820 830 842 854 863 874 884 897 906 918 930 940 949 960
  972 983 996 1005 1017 1027 1039 1049 1063 1074 1086 1097 1109 1117 1131
  1143 1153 1163 1174 1186 1196 1208 1218 1232 1243 1255 1266 1278 1288
  1298 1310 1323 1333 1345 1357 1368 1380 1392 1402 1413 1425 1436 1448
  1459 1469 1481 1493 1504 1513 1524 1537 1547 1559 1570 1583 1595 1606
  1616 1629 1638 1650 1664 1673 1684 1694 1704 1716 1727 1737 1749 1761
  1774 1786 1796 1810 1820 1834 1844 1855 1865 1874 1887 1900 1913 1926
  1937 1946 1958 1970 1983 1994 2007 2019 2029 2040 2055 2066 2075 2088
  2102 2112 2121 2134 2146 2159 2169 2180 2192 2206 2218 2230 2239 2254
  2264 2276 2286 2302 2314 2323 2338 2350 2360 2371 2382 2395 2408 2418
  2432 2442 2454 2467 2479 2489 2502 2516 2528 2540 2551 2565 2574 2587
  2598 2610 2621 2634 2644 2656 2667 2682 2693 2705 2716 2727 2740 2753
  2766 2778 2790 2803 2816 2827 2838 2852 2865 2876 2887 2898 2912 2924
  2934 2945 2957 2969 2982 2992 3005 3016 3028 3040 3053 3065 3075 3091
  3103 3115 3128 3138 3151 3164 3176 3189 3201 3214 3226 3237 3251 3262
  3276 3285 3299 3313 3322 3337 3350 3360 3373 3385 3398 3410 3423 3435
  3445 3460 3472 3484 3496 3509 3520 3531 3544 3557 3569 3581 3593 3604
  3615 3628 3640 3653 3664 3674 3687 3700 3714 3725 3739 3751 3763 3773
  3787 3797 3810 3821 3834 3847 3859 3871 3883 3897 3909 3921 3935 3946
  3959 3970 3982 3994 4007 4019 4031 4044 4057 4069 4078 4091 4101 4116
  4127 4142 4154 4166 4176 4190 4202 4215 4227 4240 4252 4265 4277 4288
  4301 4313 4326 4337 4351 4362 4373 4385 4397 4410 4422 4436 4448 4459
  4471 4484 4497 4508 4523 4535 4545 4558 4569 4582 4596 4608 4621 4633
  4645 4656 4670 4681 4695 4708 4719 4733 4744 4755 4768 4781 4794 4806
  4819 4830 4842 4856 4867 4880 4891 4902 4915 4928 4941 4954 4966 4979
  4991 5002 5016 5027 5039 5052 5065 5077 5089 5103 5115 5128 5139 5153
  5166 5177 5190 5203 5214 5225 5238 5251 5262 5274 5285 5298 5310 5323
  5336 5348 5360 5372 5386 5399 5412 5423 5437 5450 5462 5473 5488 5499
  5510 5523 5535 5547 5558 5570 5584 5596 5609 5622 5635 5646 5658 5670
  5681 5692 5706 5718 5732 5744 5756 5770 5782 5797 5810 5822 5835 5847
  5860 5872 5884 5897 5908 5921 5934 5948 5959 5971 5983 5996 6008 6020
  6033 6046 6059 6072 6085 6096 6110 6123 6134 6149 6161 6172 6187 6200
  6210 6224 6235 6248 6259 6272 6285 6299 6312 6324 6339 6352 6364 6375
  6389 6402 6414 6426 6439 6451 6463 6477 6489 6502 6513 6528 6541 6554
  6568 6580 6593 6603 6617 6632 6644 6658 6671 6682 6695 6709 6721 6734
  6747 6758 6770 6783 6795 6807 6820 6833 6845 6858 6871 6884 6895 6908
  6920 6934 6947 6960 6972 6985 6996 7011 7024 7038 7051 7063 7077 7088
  7100 7115 7127 7140 7151 7162 7176 7191 7203 7220 7230 7241 7254 7267
  7279 7294 7307 7322 7335 7347 7361 7371 7383 7395 7410 7423 7434 7450
  7461 7473 7487 7499 7510 7520 7533 7548 7559 7570 7583 7597 7610 7622
  7637 7653 7663 7673 7684 7699 7711 7723 7735 7747 7761 7774 7789 7801
  7813 7828 7838 7851 7864 7876 7888 7901 7917 7930 7941 7954 7967 7980
  7995 8008 8020 8032 8043 8054 8065 8074 8086 8099 8112 8126 8140 8153
  8164 8177 8188 8202 8211 8221 8230 8239 8249 8262 8274 8287 8301 8315
  8326 8342 8354 8366 8378 8391 8406 8419 8431 8443 8456 8471 8481 8490
  8499 8508 8519 8530 8541 8552 8566 8579 8592 8604 8616 8629 8642 8655
  8668 8680 8693 8708 8723 8734 8745 8756 8769 8780 8792 8804 8814 8829
  8842 8851);
is_deeply( \@b_calls, \@base_calls );
is( 1600, $abi->get_max_trace );
is( "M3", $abi->get_sample_name );
my $seq = "TTTTGACGCNCCTTACGCAAATCTCGNCACGAACCTTCCCCTGAAGAAATTGCCAATCTGC
 TCGAAAAACCCGTCGCAGAGGTCAAGCGCATGCTTGGACTGAATGAGCGGGTGTCCTCGGTG
 GATGTTTCTTTAGGCCCTGATTCCGATAAAACCCTGCTCGATACCCTGACAGATGATCGACCT
 ACAGATCCTTGCTAGCTGCTTCAGGACGATGACCTGTCGCAAAGTATCGATCAGTGGTTGTCT
 GAACTTACAGACAAGCAGCGTGAGGTGGTGATTCGCCGCTTCGGGTTGCGTGGTCATGAAAGC
 AGTACCCTCGAAGATGTTGGTCTGGAGATTGGTCTGACACGCGAACGTGTTCGGCAGATTCAA
 GTCGAGGGGCTCAAGCGTTTGCGCGAGATCCTTGAGCGCAACGGTTTGTCCAGTGAGTCGCTG
 TTTCAGTAACAGGCATCCTGCTCGCTAAAAAGCCCCGAAATATTCGGGGCTTTTTTGTGCCCG
 CAGAATCTGGACCGCTGCTGCCAAGGGGTTTTTTTGAGTGCGTGCGGGTGACCGGTCAGTCTC
 AAAAGTGCAGTCAGGCAGGGGTTGGAACTTTATCTGTCATGGGCTGTAAGCCTTTGCTTACCT
 TTNATGTAAGCCAAGGGCGAAAACAGGCTTGCGGATAGNTTCGCTTCTGACTTTTCATAGGTT
 GNAACTGATTGAAATTTAAACATTNTNATTGTTNTGNTAAGAN";
$seq =~ s/\n//g;
$seq =~ s/\s//g;
is( $seq, $abi->get_sequence() );

#print STDERR $abi->get_sequence_length();
is( 733, $abi->get_sequence_length() );
my @trace = qw(0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
  0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
  0 0 0 0 0 1 3 6 8 11 12 10 7 4 1 0 12 42 92 161 251 341 416 460 462 423
  349 254 163 90 38 8 0 0 0 0 0 0 0 0 1 4 8 13 20 26 34 44 56 72 90 110 128
  146 163 183 207 242 287 342 405 475 548 622 698 775 852 929 1008 1093 1187
  1294 1417 1556 1600 1600 1600 1600 1600 1600 1600 1600 1600 1565 1395 1265
  1174 1101 1020 914 775 611 439 281 159 75 25 2 0 0 0 0 0 0 0 0 0 0 0 0 0
  0 0 0 0 0 0 0 0 13 73 182 339 533 739 898 976 956 843 663 455 276 138 48
  4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 23 101 236 420 642 857
  1007 1063 1022 913 784 681 633 641 678 706 694 625 507 368 248 183 197
  295 458 647 817 928 956 905 800 683 597 570 609 695 793 863 877 821 704
  548 381 235 127 54 13 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
  0 0 0 0 0 1 4 6 8 10 9 7 4 2 0 0 0 0 0 0 0 0 0 0 0 0 5 59 163 314 495 691
  835 892 850 720 533 346 191 80 17 0 0 0 0 0 0 0 0 0 0 0 0 53 165 337 554
  803 1005 1112 1099 969 754 509 301 141 42 0 0 5 10 15 20 26 28 30 33 36
  41 46 51 54 53 46 35 29 46 110 243 454 729 1028 1292 1461 1491 1380 1165
  915 711 618 662 824 1048 1257 1383 1383 1251 1018 735 465 253 109 29 0
  0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
  0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
  0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2
  51 147 285 448 623 743 783 743 650 552 500 522 618 755 880 940 906
  776 579 379 209 86 17 0 0 0 0 0 0 0 57 204 438 732 1063 1342 1490
  1489 1375 1218 1102 1081 1158 1283 1377 1368 1230 992 730 537 480
  578 792 1040 1232 1299 1214 998 705 439 222 77 3 0 0 0 0 0 0 0 0 0
  0 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
  0 0 0 0 32 127 282 483 709 902 997 967 826 629 452 372 439 652 958
  1272 1499 1570 1462 1201 854 534 275 99 10 0 0 0 0 0 0 0 0 0 0 0 0
  0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
  0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
  0 0 0 0 0 0 0 0 0 0 37 135 289 484 699 872 947 906 773 602 467 428
  512 696 919 1100 1172 1108 934 718 545 485 562 748 971 1145 1205
  1130 955 752 604 569 656 824 998 1099 1080 943 745 563 478 531
  713 965 1201 1339 1329 1171 903 605 349 157 42 0 0 0 0 0 0 0
  0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
  0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
  0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 73 182 333 510 688 805 833
  768 626 443 275 141 51 6 0 0 0 0 0 0 0 0 1 57 173 349 571
  823 1024 1126 1102 961 737 491 283 128 35 0 5 10 12 11 12
  9 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
  0 36 159 370 652 978 1282 1460 1466 1299 1011 690 432 314 361
  548 806 1045 1190 1195 1060 824 555 325 150 42 0 0 0 0 0 0 0 0
  0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
  0 0 0 43 139 284 463 663 817 884 847 715 523 336 180 70 10 0 0 0
  0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
  0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 1 2 2 1 1 0 0 0 0 0
  0 0 0 0 0 0 0 0 34 135 304 528 789 1030 1177 1196 1084 868 601 367
  182 61 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
  39 145 315 531 773 976 1072 1037 885 670 465 341 344 476 693 924
  1095 1150 1070 877 621 386 196 69 6 1 6 9 10 10 10 6 2 0 0 0 0 0
  0 0 0 0 0 66 217 450 743 1077 1351 1494 1472 1294 1005 677 399 188
  57 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 4 5 6 5 4 2 1 0 0 0 1 2 3 3
  2 1 0 0 0 0 0 2 3 4 5 5 4 3 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 3 7
  10 13 15 13 10 6 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
  0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
  0 0 0 0 1 1 1 1 0 0 0 0 0 0 1 2 3 3 3 2 1 0 0 0 0 0 0 0 0 0 0 0 0
  0 0 0 1 4 8 13 17 19 17 13 9 4 2 3 6 10 15 19 20 19 14 9 5 2 0 0 0
  0 0 0 0 0 12 77 196 364 566 775 923 975 919 771 567 365 199 83 19 0
  1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
  0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
  0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 5 67 186 359 570
  798 968 1039 998 856 650 428 246 113 33 0 0 0 0 0 0 0 0 0 0 0 0 0 0
  0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
  0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 46 137
  269 430 609 745 806 779 673 515 342 198 92 27 0 0 0 0 0 0 0 0 0 0
  0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
  0 0 0 0 0 0 0 0 4 50 137 265 421 590 719 776 749 647 493 327 189 87 25
  0 0 0 0 0 0 15 58 127 220 338 458 551 595 582 513 415 323 280 315 433
  608 793 931 978 913 751 536 335 198 179 292 517 791 1056 1237 1287 1197
  997 751 533 405 400 510 690 879 1014 1053 981 819 606 391 219 97 26 0 0
  0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
  0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
  0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 14 76 187 340 523
  708 837 881 831 701 520 338 190 82 20 0 0 0 0 0 0 24 84 181 307 454 586
  669 685 631 521 381 244 134 57 14 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
  0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
  0 45 133 263 424 605 746 817 802 708 558 384 233 117 42 5 0 0 0 0 0 38 127
  267 447 660 846 963 984 908 755 560 362 206 95 29 0 0 0 0 0 0 0 0 0 0 23 96
  222 395 605 813 964 1023 978 839 640 424 247 115 34 0 0 2 2 2 2 2 0 0 0 0 0 0
  0 0 0 0 0 0 0 29 128 302 541 830 1119 1327 1407 1344 1153 882 587 344 163 52
  2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 29 107 236
  406 609 799 925 960 900 758 569 373 214 99 30 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
  0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 32 120 265 456 685 901 1047 1094 1032 878
  668 445 260 125 41 3 0 0 0 0 0 3 65 185 365 589 846 1055 1172 1176 1067
  874 639 409 229 104 32 1 0 0 0 0 0 0 0 0 1 55 167 337 550 797 1001 1118
  1123 1017 826 593 373 201 84 20 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
  0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
  0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 27 89
  182 302 443 565 641 656 608 510 382 249 144 67 20 0 0 0 0 0 0 0 0 0 0 0 0
  0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
  0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
  0 0 0 0 0 24 116 276 499 769 1045 1249 1341 1303 1147 910 641 397 212 88
  21 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 57 172 346 566 825 1042 1174
  1195 1104 923 693 455 264 126 42 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 52 161
  327 536 780 985 1107 1122 1027 848 620 398 222 97 25 0 0 0 0 0 0 0 0 0 0 0 0
  0 0 0 0 0 0 0 0 0 24 104 239 424 650 877 1044 1118 1086 957 761 541 336 182
  77 20 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
  0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
  0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 10 64 163 303 473 655 793 858 841 752
  621 492 402 378 422 515 624 709 739 700 599 463 327 231 202 251 368 528 690
  817 877 858 764 618 448 286 160 73 22 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3
  37 99 190 301 424 519 566 555 488 379 257 153 72 21 0 0 0 0 0 0 0 0 0 0 0 0
  0 0 0 0 0 0 0 1 2 3 3 3 2 1 0 0 0 0 0 0 0 0 8 53 135 253 401 563 694 768 770
  703 581 429 277 158 72 21 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 15 72 174 318
  499 691 848 939 948 875 738 565 389 235 124 53 14 0 0 0 0 0 0 0 0 0 0 0 0 0
  0 0 0 0 0 0 0 1 2 3 3 3 2 1 0 0 2 3 4 4 4 2 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
  0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
  0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
  0 0 0 0 0 2 42 117 228 365 518 637 699 691 619 508 393 311 290 340 449 591
  728 823 852 808 701 553 393 245 135 60 18 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
  0 0 0 0 0 0 0 0 0 0 0 0 0 0 39 123 254 421 621 800 921 961 916 796 626 439
  272 145 61 15 0 0 0 0 0 0 33 111 235 399 597 781 911 964 930 821 660 478 306
  173 81 26 2 0 0 0 0 0 0 0 0 0 33 103 212 354 526 681 791 834 803 707 566 408
  258 143 64 19 0 0 0 0 0 0 8 56 147 278 441 621 764 843 845 775 659 532 430 381
  392 451 535 612 657 653 600 507 393 276 173 95 44 15 2 0 0 0 0 0 0 0 0 0 0 0
  0 0 0 0 0 0 0 0 3 35 97 189 307 442 558 632 651 612 524 409 285 174 93 40 10
  0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 2 2 2 2 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
  0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 35 95 189 314 464 605 714 771 766 702
  593 460 325 206 116 56 21 5 2 5 8 11 15 16 17 16 15 13 10 7 5 2 1 0 0 0 0 0
  0 0 0 0 0 0 3 6 11 17 22 25 26 24 20 17 13 10 9 10 12 15 17 19 19 20 20 19
  18 16 12 8 5 1 0 0 0 0 0 0 0 0 0 0 1 2 4 6 8 9 10 10 11 10 8 6 4 1 0 0 27 87
  185 316 481 640 766 834 833 764 642 490 335 202 105 42 9 0 0 0 0 0 0 0 0 0 0
  0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 2 4 6 7 8 9 9 9 10 11 12 14 16 18 19 19 17 13
  9 5 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
  0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
  0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 1 3 3 4 4 3 1 0 0 0 0 0 0 0 0 0 0 0 0
  0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
  0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
  0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
  0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 6 38 100 190 304 434 545 619 641 608 527
  415 292 181 97 40 9 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 26 84 179 308
  472 631 759 832 836 774 666 539 429 364 359 414 511 622 716 767 762 701 602
  490 395 340 336 381 462 551 627 668 665 616 533 429 321 221 141 80 41 18 8 3
  2 1 1 0 0 0 0 0 0 0 0 0 0 0 0 15 48 103 179 275 372 453 503 517 490 430 348
  260 176 107 58 27 9 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 19 49 93 149 213
  270 308 323 312 280 232 179 127 83 48 25 11 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0
  0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
  0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 9 38 89 162 254 354 438 494 513 495 449
  388 332 297 292 317 366 424 475 504 501 465 402 320 234 154 90 45 18 4 0
  0 0 0 0 5 34 91 179 297 437 569 672 728 728 672 572 447 317 201 113 53 18
  5 5 8 11 12 11 9 5 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
  0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
  0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
  0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 16 54 116 196 295 389 461 499 497 458 390
  306 218 138 78 36 12 0 0 0 0 0 0 0 26 83 175 300 457 611 734 807 817 763 657 521
  376 241 138 67 24 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
  0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
  0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 13 42 87 147 222 294 352 386 392 371 325
  264 198 135 81 44 19 6 0 0 0 0 20 59 119 198 296 389 463 507 515 487 427 348 261
  177 106 56 24 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
  0 0 0 0 0 0 0 0 0 0 0 0 22 65 134 227 343 455 547 602 615 585 522 442 367 311 285
  290 320 363 405 431 434 411 365 303 234 167 109 63 32 13 3 0 0 0 0 0 0 0 0 0 0 0
  0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
  0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
  0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 9 32 68 116 174 232 277 302 307 290
  256 210 160 110 67 36 15 3 0 0 0 0 0 0 0 9 35 81 145 228 317 395 451 474 462 417
  348 265 183 111 59 25 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 7
  37 90 169 272 389 497 578 619 616 575 509 436 374 338 333 354 391 429 454 458 434
  387 323 252 181 119 69 35 15 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
  0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 16 43 83 135 197 253 295 316 314 289 247 197
  145 98 61 35 18 8 4 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 2 2 1 1 0 0 0 0 0 0 0 0 0
  0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
  0 0 0 0 0 0 18 54 112 190 289 388 473 530 553 539 494 431 368 318 293 298 327 370
  413 443 450 432 391 332 266 200 140 91 54 28 13 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
  0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
  0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
  0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 14 44 93 161
  249 339 421 482 513 511 477 417 340 257 178 111 62 29 10 1 0 0 0 0 0 7 37 91 171
  274 392 499 580 622 620 576 499 403 302 208 131 73 36 14 3 0 0 0 0 0 0 0 0 0 0 0
  0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
  0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 11 34 71 120 182 241 290 321 330 318 286 242 191 141
  96 60 33 16 6 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
  0 0 0 0 0 0 0 11 34 69 118 181 244 300 341 361 360 342 313 282 259 247 249 261 280
  296 303 297 274 237 191 142 97 60 32 15 5 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
  0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
  0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
  0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 8 28 61 109 174 247 317 378 421 442 437 407 358 297
  232 168 114 70 39 18 7 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 3 4 5 4 4 2 1 0 0 0 0 4
  17 38 69 112 163 216 268 312 342 354 346 320 278 227 174 123 79 46 23 9 2 0 0 0 0
  0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
  0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
  0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
  0 0 10 35 74 127 198 273 341 395 428 437 420 382 328 266 201 141 90 51 25 9 1 0
  0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 7 23 47 77 113 146 169 182 183 178 168 160 161 172
  195 228 266 301 328 341 336 315 281 239 193 150 111 78 51 31 17 7 2 0 6 23 54 98
  159 228 298 359 402 422 415 385 336 278 216 160 111 73 43 23 11 4 0 0 0 0 0 0 0
  0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 11 28 55 92 138 185 228 261 279 281
  264 232 191 145 101 62 34 15 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
  0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
  0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
  0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 7 24 52 88 134 178 216 242 254
  253 245 234 227 231 247 276 314 354 390 414 421 411 387 356 327 309 306 323 355 396
  436 466 480 474 452 419 385 357 343 345 362 388 416 438 448 442 422 394 366 347 344
  361 395 439 483 516 529 517 479 421 350 276 207 148 102 68 42 25 13 5 1 0 0 0 0 0 0
  0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
  0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 14 30 53 86 123 160 194 221 237 242 237 227 216
  209 210 220 237 257 276 290 295 292 281 267 253 243 240 245 255 266 274 276 267 248
  220 186 148 112 79 51 30 15 6 2 4 12 27 49 79 115 154 190 219 238 244 235 216 187
  155 122 91 64 41 24 12 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
  0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 2 3 5 7 9 11 11 11 9 6 4 2 0 0 1 3 5 8 9 9 8
  6 5 4 4 5 5 3 2 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
  0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
  0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
  0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
  0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
  0 0 0 0 0 7 24 49 83 125 166 199 221 230 225 209 184 154 123 94 67 46 29 16
  8 3 0 0 0 2 12 30 58 96 141 185 225 255 271 277 273 265 260 261 271 288 309
  328 340 340 327 302 267 225 182 141 104 73 49 29 16 8 2 0 0 0 0 0 0 0 0 0
  0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 2 3 4 4 3 2
  1 0 0 0 0 0 0 0 0 8 22 44 75 116 159 201 237 264 279 279 265 241 207 170
  132 98 68 43 25 13 6 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
  0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1
  1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
  0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 11 29 55
  91 133 175 214 245 264 272 270 260 247 234 226 225 232 245 261 277 289
  292 286 269 244 212 177 140 107 76 50 30 17 8 4 4 6 8 9 9 9 10 11 13
  16 19 20 20 17 13 9 5 2 0 0 0 1 2 5 7 9 10 8 6 4 2 0 0 0 0 0 0 0 0 0
  0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
  0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
  0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 8
  19 36 60 87 116 144 168 186 195 196 188 173 152 127 101 74 49 29 15
  4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
  0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
  0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
  0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
  0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 12 27 47 74 105 138 170 201 227 246
  256 255 244 224 196 166 134 105 80 59 43 31 22 14 8 4 1 0 0 0 0 0 0 0 0
  0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
  0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 6 13 26 45 68 96 125 154 180 200 209 209 198
  178 152 123 95 68 46 28 15 7 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
  0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 15 33 58 92
  130 168 202 230 250 260 263 260 253 247 244 244 249 256 264 271 274 272 264 252
  236 221 210 203 201 205 210 216 221 222 219 213 205 196 188 184 184 187 193 199
  203 202 196 183 165 142 118 94 72 51 33 20 11 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
  0 0 0 0 0 3 11 21 30 38 40 35 26 16 7 1 0 0 0 0 0 0 0 0 0 5 14 28 47 71 96 118 136
  147 151 147 136 120 103 84 66 51 37 25 15 9 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
  0 0 0 0 0 0 0 0 0 0 4 13 26 45 67 90 111 128 140 148 149 144 134 118 99 77 55 35 20
  10 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 8 17 31 49 69 89
  105 117 122 122 116 105 90 74 58 42 27 16 8 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
  0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
  0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 13 27 47 73 101 128 152
  171 183 189 191 190 190 190 194 201 209 219 226 229 226 216 199 176 152 126 101 79
  61 44 29 18 10 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
  0 0 0 0 0 0 3 12 26 46 72 100 127 150 166 176 178 173 161 144 124 102 79 58 40 25
  14 7 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
  0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 5 9 12 13 12 9 5 2 0 0 0 0 0 3 10 21 36 56 78 100 121
  140 153 160 161 155 142 125 106 84 63 44 27 15 7 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
  0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
  0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 6
  12 21 34 50 68 86 103 119 131 141 149 155 160 165 170 175 180 185 187 189 186 180
  169 155 137 118 99 82 66 53 42 34 27 21 16 11 7 4 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
  0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
  0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
  0 0 0 0 0 0 0 0 0 0 0 0 0 0 6 18 34 54 80 104 126 142 152 154 149 137 121 102 83
  62 44 27 15 6 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
  0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 9 19 33 51 73 95 117
  138 158 173 182 184 180 170 155 138 119 101 83 65 48 31 18 9 3 0 0 0 0 0 0 0 0 0 0 0 0 0
  0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 10 18 29 42 52 59 65 70 76 84 95 107 121 136 149 160 169
  175 178 178 174 166 156 143 128 113 97 80 62 44 28 16 6 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
  0 0 0 0 0 0 0 0 0 0 0 1 6 14 25 40 58 77 96 116 134 149 159 165 165 162 156 151 147 145
  145 148 151 154 155 152 146 136 122 106 88 72 55 41 27 17 9 4 1 0 0 0 0 0 0 0 0 0 0 0
  0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
  5 12 25 44 68 94 120 143 162 178 188 195 197 196 193 189 184 181 179 180 181 182 182
  180 176 170 163 154 148 143 142 143 148 155 163 171 178 182 185 184 181 176 172 168
  167 167 167 168 165 160 152 140 126 111 96 81 67 55 44 35 29 26 26 30 38 51 66 84 103
  122 139 153 162 164 160 150 136 118 99 82 66 52 41 32 25 19 14 11 9 8 6 5 4 2 1 0 0
  0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
  0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
  0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 3 7 14 22 31 40 49 56 64 69 74 76 76 72 65 55 43
  31 20 11 5 2 0 0 0 2 5 11 18 28 39 50 60 69 76 79 78 74 67 57 47 37 29 21 14 9
  5 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 6
  15 26 36 45 46 39 28 18 8 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
  0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 2 2 1 0 0 0 0 0 0 0 0 0 0 0
  0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 8 17 29 45 61 77 91 104 115
  124 128 130 126 119 108 93 77 59 43 28 17 9 4 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
  0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 6 10 12 13 11 8 5 1 0 0 0 0 0 1 6 14
  25 41 59 79 100 119 138 152 162 165 162 153 139 123 105 87 72 59 49 41 37
  35 35 36 39 42 47 54 63 73 82 91 97 101 100 95 87 77 64 51 41 33 28 25 24
  23 21 18 14 9 6 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
  0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2
  5 10 16 25 33 42 50 58 66 74 82 90 100 110 120 131 140 148 153 158 159
  159 158 153 147 139 130 119 107 93 78 61 44 28 16 7 2 0 0 0 0 0 0 0 0 0
  0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 9 17 27 39 49 57 62 65 64 61
  58 52 44 35 24 15 8 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
  0 0 0 0 0 0 5 12 23 37 55 73 89 103 113 118 121 122 123 125 129 134 137
  138 135 131 123 116 110 106 102 100 96 89 78 64 47 31 18 8 2 0 0 0 0 0
  0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 10 20 32 46 59 70 77 82 87 92
  99 108 120 134 150 165 178 189 197 199 198 194 187 180 173 168 163 161
  159 159 158 157 154 150 143 136 126 116 106 97 87 79 69 60 50 42 36
  34 36 42 52 63 77 90 102 112 120 124 125 123 117 108 98 85 72 58 46
  34 23 14 8 3 1 0 0 0 0 0 0 0 0 0 0 0 3 8 13 19 24 26 25 20 14 8 4 0
  0 0 0 0 0 0 0 0 2 5 10 15 20 24 24 23 18 13 8 4 2 0 0 0 0 0 2 5 9 16
  25 36 50 63 77 89 99 107 112 114 114 111 103 93 80 66 52 39 27 18 11
  6 3 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 4 6 7 7 6 4 
  2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 4 9 15 22 30 36 40 42 40 36 29 20 12 6 1 0 0 0 
  0 0 0 0 0 0 0 0 1 3 6 9 12 14 14 12 9 6 3 1 0 0 0 0 0 1 1 1 1 0 0 0 2 7 13 19 
  27 32 36 39 42 47 54 62 72 82 91 100 107 113 119 124 129 135 141 149 156 162 
  166 168 167 163 157 148 138 126 114 104 94 87 81 77 72 67 60 53 45 38 32 29 
  29 31 35 40 45 51 56 59 59 48 37 26 14 2 0 72 275 433
);
my @array = $abi->get_trace("A");
is_deeply(\@trace, \@array);

@array = $abi->get_trace("G");


@trace = qw(
0 0 0 0 0 0 0 7 22 46 78 120 161 196 219 232 235 236 240 254 277 305 331 347 344 324 292 258 229 215 217 229 243 250 242 218 181 137 92 55 28 11 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
8 42 103 194 313 444 560 638 664 632 551 438 315 205 120 68 46 48 64 88 116 145 175 206 239 273 310 350 395 446 501 560 616 670 720 769 822 888 968 1063 1163 1254 1317 1338 1305 1222 1097 950 800 664 551 462 392 334 282 233 188 154 137 145 

 view all matches for this distribution
 view release on metacpan -  search on metacpan

( run in 0.958 second using v1.00-cache-2.02-grep-82fe00e-cpan-cec75d87357c )