Bio-SCF-1.03/0000755000175000017500000000000011321650645012140 5ustar lsteinlsteinBio-SCF-1.03/t/0000755000175000017500000000000011321650645012403 5ustar lsteinlsteinBio-SCF-1.03/t/scf.t0000644000175000017500000000220410432637156013345 0ustar lsteinlstein#-*-Perl-*- ## Bioperl Test Harness Script for Modules # Before `make install' is performed this script should be runnable with # `make test'. After `make install' it should work as `perl test.t' use strict; use ExtUtils::MakeMaker; use constant TEST_COUNT => 18; BEGIN { # to handle systems with no installed Test module # we include the t dir (where a copy of Test.pm is located) # as a fallback eval { require Test; }; if( $@ ) { use lib 't'; } use Test; plan test => TEST_COUNT; } use Bio::SCF; # object-oriented interface my $scf = Bio::SCF->new('./test.scf'); ok($scf); ok($scf->bases_length,1525); ok($scf->samples_length,18610); ok($scf->base(10),'C'); ok($scf->score(10),6); ok($scf->index(10),151); ok($scf->base_score('C',10),6); ok($scf->sample('C',10)>$scf->sample('G',10)); ok($scf->write('./temp.scf')); ok(-S './temp.scf',-S './test.scf'); # tied interface my %h; tie %h,'Bio::SCF','./test.scf'; ok(tied %h); ok($h{bases_length},1525); ok($h{bases_length},scalar @{$h{bases}}); ok($h{samples_length},18610); ok($h{bases}[10],'C'); ok($h{C}[10],6); ok($h{index}[10],151); ok($h{samples}{C}[10]>$h{samples}{G}[10]); Bio-SCF-1.03/eg/0000755000175000017500000000000011321650645012533 5ustar lsteinlsteinBio-SCF-1.03/eg/write_test_obj.pl0000755000175000017500000000055210367530305016117 0ustar lsteinlstein#!/usr/bin/perl -w use lib '..','../blib/lib','../blib/arch'; use strict; use SCF; die "Usage : ./write_test.pl [file to read] [file to write]\n" unless defined $ARGV[1]; my $obj = SCF->new($ARGV[0]); for (0...$obj->bases_length-1){ $obj->base($_, "A"); } $obj->write($ARGV[1]) or die "Cannot write to $ARGV[1]\n"; warn "Wrote all A's into $ARGV[1]\n"; Bio-SCF-1.03/eg/write_test_tied.pl0000755000175000017500000000062010367530305016266 0ustar lsteinlstein#!/usr/bin/perl -w use lib '..','../blib/lib','../blib/arch'; use strict; use SCF; die "Usage : ./write_test.pl [file to read] [file to write]\n" unless defined $ARGV[1]; my %scf; tie %scf, 'SCF', $ARGV[0]; for (0...$scf{bases_length}-1){ $scf{bases}[$_] = "A"; $scf{index}[$_] = 10; } (tied %scf)->write($ARGV[1]) or die "Cannot write to $ARGV[1]\n"; warn "Wrote all A's into $ARGV[1]\n"; Bio-SCF-1.03/eg/read_test_obj.pl0000755000175000017500000000106710367530305015702 0ustar lsteinlstein#!/usr/bin/perl -w use lib '..','../blib/lib','../blib/arch'; use SCF; my $obj = SCF->new(shift || '../test.scf'); 1; for (my $i = 0; $i<$obj->bases_length; $i++){ my $peak = $obj->index($i); print sprintf("%s (%02d) %02d %02d %02d %02d | %5d | %04d %04d %04d %04d\n", $obj->base($i), $obj->score($i), $obj->base_score('A',$i), $obj->base_score('C',$i), $obj->base_score('G',$i), $obj->base_score('T',$i), $peak, $obj->sample('A',$peak), $obj->sample('C',$peak), $obj->sample('G',$peak), $obj->sample('T',$peak) ); } print "\n"; Bio-SCF-1.03/eg/read_test_tied.pl0000755000175000017500000000076010367530305016054 0ustar lsteinlstein#!/usr/bin/perl -w use lib './','../blib/lib','../blib/arch'; use SCF; my %scf; tie %scf, 'SCF', (shift || '../test.scf'); for (my $i = 0; $i<$scf{bases_length}; $i++){ my $peak = $scf{index}[$i]; print sprintf("%s %02d %02d %02d %02d | %5d | %04d %04d %04d %04d\n", $scf{bases}[$i], $scf{A}[$i], $scf{C}[$i], $scf{G}[$i], $scf{T}[$i], $peak, $scf{samples}{A}[$peak], $scf{samples}{C}[$peak], $scf{samples}{G}[$peak], $scf{samples}{T}[$peak], ); } print "\n"; Bio-SCF-1.03/SCF/0000755000175000017500000000000011321650645012553 5ustar lsteinlsteinBio-SCF-1.03/SCF/Arrays.pm0000644000175000017500000000230710432637155014357 0ustar lsteinlsteinpackage Bio::SCF::Arrays; use strict; require DynaLoader; use constant WHAT => { index => 0, A => 1, C => 2, G => 3, T => 4, bases => 5, spare1 => 6, spare2 => 7, spare3 => 8, sample_A => 11, sample_C => 12, sample_G => 13, sample_T => 14 }; sub TIEARRAY { my $class = shift; my $scf_pointer = shift; my $what_str = shift; my $ret_val = { scf_pointer => $scf_pointer, what => WHAT->{$what_str}, }; return bless $ret_val, $class; } sub FETCH { my ($self, $index) = @_; return Bio::SCF::get_at($self->{scf_pointer}, $index, $self->{what}); } sub STORE { my ($self, $index, $value) = @_; if ( $self->{what} == WHAT->{bases} ){ Bio::SCF::set_base_at($self->{scf_pointer}, $index, $self->{what}, $value); }else{ Bio::SCF::set_at($self->{scf_pointer}, $index, $self->{what}, $value); } } sub FETCHSIZE { my $self = shift; my $field = $self->{what} >= WHAT->{sample_A} ? Bio::SCF::HEADER_FIELDS()->{samples_length} : Bio::SCF::HEADER_FIELDS()->{bases_length}; return Bio::SCF::get_from_header($self->{scf_pointer}, $field); } 1; __END__ Bio-SCF-1.03/DISCLAIMER0000644000175000017500000000216011140347677013505 0ustar lsteinlsteinThe Bio::SCF package and all associated files are Copyright (c) 2006 Cold Spring Harbor Laboratory. This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself. See the Artistic License file in the main Perl distribution for specific terms and conditions of use. In addition, the following disclaimers apply: CSHL makes no representations whatsoever as to the SOFTWARE contained herein. It is experimental in nature and is provided WITHOUT WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE OR ANY OTHER WARRANTY, EXPRESS OR IMPLIED. CSHL MAKES NO REPRESENTATION OR WARRANTY THAT THE USE OF THIS SOFTWARE WILL NOT INFRINGE ANY PATENT OR OTHER PROPRIETARY RIGHT. By downloading this SOFTWARE, your Institution hereby indemnifies CSHL against any loss, claim, damage or liability, of whatsoever kind or nature, which may arise from your Institution's respective use, handling or storage of the SOFTWARE. If publications result from research using this SOFTWARE, we ask that CSHL be acknowledged and/or credit be given to CSHL scientists, as scientifically appropriate. Bio-SCF-1.03/README0000644000175000017500000000102410367530672013023 0ustar lsteinlsteinThe Perl SCF module allows you to read and update (in a restricted way) SCF chromatographic sequence files. It is an interface to Roger Staden's io-lib. See the installation directions for further instructions. - This software is free. You can use it under the terms of the Perl Artistic License Please. Please see DISCLAIMER for limitations of warranty, the academic citation policy and other legalese. Support is available by writing to Lincoln Stein . Lincoln Stein lstein@cshl.org January 30, 2006 Bio-SCF-1.03/SCF.pm0000644000175000017500000003073411242271013013106 0ustar lsteinlsteinpackage Bio::SCF; use strict; use vars qw($VERSION @ISA); require DynaLoader; use Bio::SCF::Arrays; use Carp 'croak'; @ISA = qw(DynaLoader); $VERSION = '1.03'; use constant KEYS => { index => 0, A => 1, C => 2, G => 3, T => 4, bases => 5, spare1 => 6, spare1 => 7, spare1 => 8, samplesA => 11, samplesC => 12, samplesG => 13, samplesT => 14 }; use constant HEADER_FIELDS => { samples_length => 0, bases_length => 1, version => 2, sample_size => 3, code_set => 4, }; bootstrap Bio::SCF $VERSION; sub new { my $class = shift; my $file_name = shift; my $sample_hash = shift || 0; defined $file_name or die "SCF :: Unable to tie hash to undefined file name\n"; my $scf_pointer; if ($sample_hash) { $scf_pointer = $file_name; # file name became scf pointer } else { if ( defined fileno($file_name)){ $scf_pointer = get_scf_fpointer($file_name); # file_name here is file handle }else{ $scf_pointer = get_scf_pointer($file_name); # actually reads scf file into memory } } my $scf_file = { file_name => $file_name, scf_pointer => $scf_pointer, sample_hash => $sample_hash, cache => {} }; return bless $scf_file, $class; } sub TIEHASH { shift->new(@_); } sub FETCH { my $self = shift; my $key = shift; my @array; if ($self->{sample_hash}) { my $k = "sample_$key"; return $self->{cache}{$k} if exists $self->{cache}{$k}; tie @array, 'Bio::SCF::Arrays', $self->{scf_pointer}, $k; return $self->{cache}{$k} = \@array; } else { if (defined( my $header_field = HEADER_FIELDS->{$key})) { return get_from_header($self->{scf_pointer}, $header_field); } elsif ($key eq "comments") { return get_comments($self->{scf_pointer}); } elsif ($key eq 'samples') { return $self->{cache}{$key} if exists $self->{cache}{$key}; my %sample; tie %sample, 'Bio::SCF', $self->{scf_pointer}, 1; $self->{cache}{key} = \%sample; return \%sample; } elsif (exists KEYS->{$key}) { return $self->{cache}{$key} if exists $self->{cache}{$key}; tie @array, 'Bio::SCF::Arrays', $self->{scf_pointer}, $key; $self->{cache}{$key} = \@array; return \@array; } } } sub bases_length { my $self = shift; get_from_header($self->{scf_pointer},HEADER_FIELDS->{bases_length}); } sub samples_length { my $self = shift; get_from_header($self->{scf_pointer},HEADER_FIELDS->{samples_length}); } sub sample_size { my $self = shift; get_from_header($self->{scf_pointer},HEADER_FIELDS->{sample_size}); } sub code_set { my $self = shift; get_from_header($self->{scf_pointer},HEADER_FIELDS->{code_set}); } sub index { my $self = shift; my $index = shift; my $d = $self->at('index',$index); $self->set('index',$index,shift) if @_; $d; } sub sample { my $self = shift; my $base = uc shift; my $index = shift; my $d = $self->at("samples${base}",$index); $self->set("samples${base}",$index,shift) if @_; $d; } sub base { my $self = shift; my $index = shift; my $d = $self->at('bases',$index); $self->set('bases',$index,shift) if @_; $d; } sub base_score { my $self = shift; my $base = uc shift; my $index = shift; my $d = $self->at($base,$index); $self->set($base,$index,shift) if @_; $d; } sub score { my $self = shift; my $index = shift; my $base = uc $self->base($index); my $d = exists KEYS->{$base} ? $self->base_score($base,$index) : 0; $self->set($base,$index,shift) if @_; $d; } sub comments { my $self = shift; get_comments($self->{scf_pointer}); } sub at { my $self = shift; # possible keys { bases, A, C, G, T, spare1/2/3, sampleA/C/G/T } my $key = shift; my $index = shift; return get_at($self->{scf_pointer}, $index, KEYS->{$key}); } sub set { my $self = shift; # possible keys { bases, A, C, G, T, spare1/2/3, sampleA/C/G/T } my $key = shift; my $index = shift; my $value = shift or die "Bio::SCF::set(...) value not defined\n"; if ( $key eq "bases" ){ set_base_at($self->{scf_pointer}, $index, KEYS->{$key}, $value); }else{ set_at($self->{scf_pointer}, $index, KEYS->{$key}, $value); } } sub write { my $self = shift; my $file_name = shift || $self->{file_name}; return scf_write($self->{scf_pointer}, $file_name); } sub fwrite { my $self = shift; my $file_handle = shift || die "Bio::SCF::fwrite(...) : file handle is not defined\n"; return scf_fwrite($self->{scf_pointer}, $file_handle); } sub STORE { my $self = shift; my $key = shift; my $value = shift; SWITCH: { $key eq "comments" && do { set_comments($self->{scf_pointer}, $value); last SWITCH; }; die "Bio::SCF::STORE field $key doesn't exist or not allowed to be modified\n"; } } sub FIRSTKEY { my $self = shift; my $a = keys %{KEYS()}; each %{KEYS()} } sub NEXTKEY { my $self = shift; each %{KEYS()}; } sub CLEAR { croak "The Bio::SCF module does not support this operation"; } sub DELETE { croak "The Bio::SCF module does not support this operation"; } sub DESTROY { my $self = shift; Bio::SCF::scf_free($self->{scf_pointer}) unless $self->{sample_hash}; } # Autoload methods go after =cut, and are processed by the autosplit program. 1; __END__ =head1 NAME Bio::SCF - Perl extension for reading and writting SCF sequence files =head1 SYNOPSIS use Bio::SCF; # tied interface tie %hash,'Bio::SCF','my_scf_file.scf'; my $sequence_length = $hash{bases_length}; my $chromatogram_sample_length = $hash{samples_length}; my $third_base = $hash{bases}[2]; my $quality_score = $hash{$third_base}[2]; my $sample_A_at_time_1400 = $hash{samples}{A}[1400]; # change the third base and write out new file $hash{bases}[2] = 'C'; tied (%hash)->write('new.scf'); # object-oriented interface my $scf = Bio::SCF->new('my_scf_file.scf'); my $sequence_length = $scf->bases_length; my $chromatogram_sample_length = $scf->samples_length; my $third_base = $scf->bases(2); my $quality_score = $scf->score(2); my $sample_A_at_time_1400 = $scf->sample('A',1400); # change the third base and write out new file $scf->bases(2,'C'); $scf->write('new.scf'); =head1 DESCRIPTION This module provides a perl interface to SCF DNA sequencing files. It has both tied hash and an object-oriented interfaces. It provides the ability to read fields from SCF files and limited ability to modify them and write them back. =head2 Tied Methods =over 4 =item $obj = tie %hash,'Bio::SCF',$filename_or_handle Tie the Bio::SCF module to a filename or filehandle. If successful, tie() will return the object. =item $value = $hash{'key'} Fetch a field from the SCF file. Valid keys are as follows: Key Value --- ----- bases_length Number of called bases in the sequence (read-only) samples_length Number of samples in the file (read-only) version SCF version (read-only) code_set Code set used to code bases (read-only) comments Structured comments (read-only) bases Array reference to a list of the base calls index Array reference to a list of the sample position for each of the base calls (e.g. the position of the base calling peak) A An array reference that can be used to determine the probability that the base in position $i is an "A". G An array reference that can be used to determine the probability that the base in position $i is a "G". C An array reference that can be used to determine the probability that the base in position $i is a "C". T An array reference that can be used to determine the probability that the base in position $i is a "T". samples A hash reference with keys "A", "C", "G" and "T". The value of each hash is an array reference to the list of intensity values for each sample. To get the length of the called sequence: $scf{bases_length} To get the value of the called sequence at position 3: $scf{bases}[3] To get the sample position at which base 3 was called: $scf{index}[3] To get the value of the "C" curve under base 3: $scf{samples}{C}[$scf{index}[3]] To get the probability that base 3 is a "C": $scf{C}[3] To print out the chromatogram as a four-column list: my $samples = $scf{samples}; for (my $i = 0; $i<$scf{samples_length}; $i++) { print join "\t",$samples->{C}[$i],$samples->{G}[$i], $samples->{A}[$i],$samples->{T}[$i],"\n"; } =item $scf{bases}[$index] = $new_value The base call probability scores, base call values, base call positions, and sample values are all read/write, so that you can change them: $samples->{C}[500] = 0; =item each %scf Will return keys and values for the tied object. =item delete $scf{$key} =item %scf = () These operations are not supported and will return a run-time error =back =head2 Object Methods =over 4 =item $scf = Bio::SCF->new($scf_file_or_filehandle) Create a new Bio::SCF object. The single argument is the name of a file or a previously-opened filehandle. If successful, new() returns the Bio::SCF object. =item $length = $scf->bases_length Return the length of the called sequence. =item $samples = $scf->samples_length Return the length of the list of chromatogram samples in the file. There are four sample series, one for each base. =item $sample_size = $scf->sample_size Returns the size of each sample (bytes). =item $code_set = $scf->code_set Return the code set used for base calling. =item $base = $scf->base($base_no [,$new_base]) Get the base call at the indicated position. If a new value is provided, will change the base call to the indicated base. =item $index = $scf->index($base_no [,$new_index]) Translates the indicated base position into the sample index for that called base. Here is how to fetch the intensity values at base number 5: my $sample_index = $scf->index(5); my ($g,$a,$t,$c) = map { $scf->sample($_,$sample_index) } qw(G A T C); If you provide a new value for the sample index, it will be updated. =item $base_score = $scf->base_score($base,$base_no [,$new_score]) Get the probability that the indicated base occurs at position $base_no. Here is how to fetch the probabilities for the four bases at base position 5: my ($g,$a,$t,$c) = map { $scf->base_score($_,5) } qw(G A T C); If you provide a new value for the base probability score, it will be updated. =item $score = $scf->score($base_no) Get the quality score for the called base at the indicated position. =item $intensity = $scf->sample($base,$sample_index [,$new_value]) Get the intensity value for the channel corresponding to the indicated base at the indicated sample index. You may update the intensity by providing a new value. =item $scf->write('file_path') Write the updated SCF file to the indicated file path. =item $scf->fwrite($file_handle) Write the updated SCF file to the indicated filehandle. The file must previously have been opened for writing. The filehandle is actually reopened in append mode, so you can call fwrite() multiple times and interperse your own record separators. =back =head1 EXAMPLES Reading information from a preexisting file: tie %scf, 'Bio::SCF', "data.scf"; print "Base calls:\n"; for ( my $i=0; $i<$scf{bases}; $i++ ){ print "$scf{base}[$i] "; } print "\n"; print "Intensity values for the A curve\n"; for ( my $i=0; $i<$scf{samples}; $i++ ){ print "$scf{sample}{A}[$i]; } print "\n"; Another example, where we set all bases to "A", indexes to 10 and write the file back: my $obj = tie %scf,'Bio::SCF','data.scf'; for (0...@{$scf{bases}}-1){ $scf{base}[$_] = "A"; $obj->set('index', $_, 10); } $obj->write('data.scf'); =head1 AUTHOR Dmitri Priimak, priimak@cshl.org (1999) with some cleanups by Lincoln Stein, lstein@cshl.edu (2006) This package and its accompanying libraries is free software; you can redistribute it and/or modify it under the terms of the GPL (either version 1, or at your option, any later version) or the Artistic License 2.0. Refer to LICENSE for the full license text. In addition, please see DISCLAIMER for disclaimers of warranty. =head1 SEE ALSO perl(1). =cut Bio-SCF-1.03/SCF.xs0000644000175000017500000002213410432637155013134 0ustar lsteinlstein#ifdef __cplusplus extern "C" { #endif #include "EXTERN.h" #include "perl.h" #include "XSUB.h" #include #include #include #include #include #include #include #define SV_SETUV(A) { ret_val = newSViv(1); sv_setuv(ret_val, (A)); } #ifdef __cplusplus } #endif MODULE = Bio::SCF PACKAGE = Bio::SCF SV * get_scf_pointer(file_name) char *file_name CODE: Scf *scf_data = NULL; /* internal representation of data from scf file */ struct stat *file_stat; SV *ret_val; /* SV which content scf data */ int i; /* checking for existance of file and its permissions */ if( file_name == NULL ) croak("readScf(...) : file_name is NULL"); file_stat = malloc(sizeof(struct stat)); i = stat(file_name, file_stat); if( i == -1 ){ switch(errno){ case ENOENT : croak("get_scf_pointer(...) : file %s doesn't exist\n", file_name); break; case EACCES : croak("get_scf_pointer(...) : permission denied on file %s\n", file_name); break; case ENAMETOOLONG : croak("get_scf_pointer(...) : file name %s too long\n", file_name); break; default : croak("get_scf_pointer(...) : unable to get stat on file %s, errno %d\n", file_name, errno); break; } } free(file_stat); /* Reading SCF file, into internal structure */ if ( (scf_data = read_scf(file_name)) == NULL ) croak("get_scf_pointer(...) : failed on read_scf(%s)\n", file_name); ret_val = newSViv((int)scf_data); RETVAL = ret_val; OUTPUT: RETVAL SV * get_scf_fpointer(file_handle) FILE *file_handle CODE: Scf *scf_data = NULL; /* internal representation of data read from scf file */ SV *ret_val; /* SV which content scf data */ mFILE *mf; /* we don't need to check existance of file and its permissions becouse we operate here with already opened file handle */ if( file_handle == NULL ) croak("get_scf_fpointer(...) : file_handle is NULL"); /* Reading SCF file, into internal structure */ mf = mfreopen(NULL,"r",file_handle); if (mf == NULL) croak("get_scf_fpointer(...) : failed on mfreopen(...)\n"); if ( (scf_data = mfread_scf(mf)) == NULL ) croak("get_scf_fpointer(...) : failed on fread_scf(...)\n"); ret_val = newSViv((int)scf_data); RETVAL = ret_val; OUTPUT: RETVAL void scf_free(scf_pointer) int scf_pointer CODE: scf_deallocate((Scf *)scf_pointer); SV * get_comments(scf_pointer) int scf_pointer CODE: Scf *scf_data = (Scf *)scf_pointer; SV *ret_val; if ( scf_data == NULL ) croak("get_comments(...) : scf_pointer is NULL\n"); ret_val = newSVpv(scf_data->comments, strlen(scf_data->comments)); RETVAL = ret_val; OUTPUT: RETVAL void set_comments(scf_pointer, comments) int scf_pointer char *comments CODE: Scf *scf_data = (Scf *)scf_pointer; if ( comments == NULL ) croak("set_comments(...) : comments is NULL\n"); if ( scf_data == NULL ) croak("set_comments(...) : scf_pointer is NULL\n"); free(scf_data->comments); scf_data->comments = malloc(strlen(comments)); memcpy(scf_data->comments, comments, strlen(comments)); (scf_data->header).comments_size = strlen(comments); SV * scf_write(scf_pointer, file_name) int scf_pointer char *file_name CODE: Scf *scf_data = (Scf *)scf_pointer; if ( file_name == NULL ) croak("scf_write(...) : file_name is NULL\n"); if ( scf_data == NULL ) croak("scf_write(...) : scf_pointer is NULL\n"); if( write_scf(scf_data, file_name) == 0) RETVAL=(SV *)&PL_sv_yes; else RETVAL=(SV *)&PL_sv_no; OUTPUT: RETVAL SV * scf_fwrite(scf_pointer, file_handle) int scf_pointer FILE *file_handle CODE: mFILE *mf; Scf *scf_data = (Scf *)scf_pointer; if ( file_handle == NULL ) croak("scf_fwrite(...) : file_handle is NULL\n"); if ( scf_data == NULL ) croak("scf_fwrite(...) : scf_pointer is NULL\n"); mf = mfreopen(NULL,"a",file_handle); if ( mf == NULL ) croak("scf_fwrite(...) : could not reopen filehandle for writing\n"); if( mfwrite_scf(scf_data, mf) == 0) RETVAL=(SV *)&PL_sv_yes; else RETVAL=(SV *)&PL_sv_no; mfflush(mf); mfdestroy(mf); OUTPUT: RETVAL SV * get_from_header(scf_pointer, what) int scf_pointer int what CODE: /* what = { 0 samples, 1 bases, 2 version, 3 sample size, 4 code_set } */ Scf *scf_data = (Scf *)scf_pointer; SV *ret_val; switch(what) { case 0 : ret_val = newSViv(1); sv_setuv(ret_val, (scf_data->header).samples); break; case 1 : ret_val = newSViv(1); sv_setuv(ret_val, (scf_data->header).bases); break; case 2 : ret_val = newSVpv((scf_data->header).version, 4); break; case 3 : ret_val = newSViv(1); sv_setuv(ret_val, (scf_data->header).sample_size); break; case 4 : ret_val = newSViv(1); sv_setuv(ret_val, (scf_data->header).code_set); break; default: croak("get_from_header(..., %d) : what out of range\n", what); ret_val = NULL; } RETVAL = ret_val; OUTPUT: RETVAL SV * get_at(scf_pointer, index, what) int scf_pointer int index int what CODE: /* what = { 0 peak_index, 1 prob_A, 2 prob_C, 3 prob_G, 4 prob_T, 5 base } <= for bases * what = { 11 sample_A, 12 sample_C, 13 sample_G, 14 sample_T } <= for samples */ Scf *scf_data = (Scf *)scf_pointer; SV *ret_val; if ( scf_data == NULL ) croak("get_at(...) : scf_pointer is NULL\n"); if( ( what < 9 && what > -1 && ( index<0 || index>(scf_data->header).bases-1 ) )|| ( what > 10 && what < 15 && ( index<0 || index>(scf_data->header).samples-1 ) ) ){ croak("get_at(..., %d, ...) : index/what out of range\n", index); ret_val = NULL; }else{ switch(what){ case 0 : SV_SETUV((scf_data->bases+index)->peak_index); break; case 1 : SV_SETUV((scf_data->bases+index)->prob_A); break; case 2 : SV_SETUV((scf_data->bases+index)->prob_C); break; case 3 : SV_SETUV((scf_data->bases+index)->prob_G); break; case 4 : SV_SETUV((scf_data->bases+index)->prob_T); break; case 5 : ret_val = newSVpv(&((scf_data->bases+index)->base), 1); break; case 6 : case 7 : case 8 : SV_SETUV((scf_data->bases+index)->spare[what-6]); break; case 11: /* samples_A */ if( scf_data->header.sample_size == 1 ) SV_SETUV(((scf_data->samples).samples1+index)->sample_A) else SV_SETUV(((scf_data->samples).samples2+index)->sample_A); break; case 12: /* samples_C */ if( scf_data->header.sample_size == 1 ) SV_SETUV(((scf_data->samples).samples1+index)->sample_C) else SV_SETUV(((scf_data->samples).samples2+index)->sample_C); break; case 13: /* samples_G */ if( scf_data->header.sample_size == 1 ) SV_SETUV(((scf_data->samples).samples1+index)->sample_G) else SV_SETUV(((scf_data->samples).samples2+index)->sample_G); break; case 14: /* samples_T */ if( scf_data->header.sample_size == 1 ) SV_SETUV(((scf_data->samples).samples1+index)->sample_T) else SV_SETUV(((scf_data->samples).samples2+index)->sample_T); break; default: croak("get_at(..., ..., %d) : what out of range\n", what); ret_val = NULL; } } RETVAL = ret_val; OUTPUT: RETVAL void set_base_at(scf_pointer, index, what, value) int scf_pointer int index int what char value CODE: Scf *scf_data = (Scf *)scf_pointer; if ( scf_data == NULL ) croak("get_at(...) : scf_pointer is NULL\n"); if( what == 5 && ( index<0 || index>(scf_data->header).bases-1 ) ) croak("set_base_at(..., %d, ...) : index/what out of range\n", index); else (scf_data->bases+index)->base = value; void set_at(scf_pointer, index, what, value) int scf_pointer int index int what unsigned int value CODE: Scf *scf_data = (Scf *)scf_pointer; if ( scf_data == NULL ) croak("get_at(...) : scf_pointer is NULL\n"); if( ( what < 9 && what > -1 && ( index<0 || index>(scf_data->header).bases-1 ) )|| ( what > 10 && what < 15 && ( index<0 || index>(scf_data->header).samples-1 ) )|| what == 5 ) croak("set_at(..., %d, ...) : index/what out of range\n", index); else{ switch(what){ case 0 : (scf_data->bases+index)->peak_index = value; break; case 1 : (scf_data->bases+index)->prob_A = value; break; case 2 : (scf_data->bases+index)->prob_C = value; break; case 3 : (scf_data->bases+index)->prob_G = value; break; case 4 : (scf_data->bases+index)->prob_T = value; break; case 5 : (scf_data->bases+index)->base = (char)value; break; case 6 : case 7 : case 8 : (scf_data->bases+index)->spare[what-6] = value; break; case 11 : if( scf_data->header.sample_size == 1 ) ((scf_data->samples).samples1+index)->sample_A = value; else ((scf_data->samples).samples2+index)->sample_A = value; break; case 12 : if( scf_data->header.sample_size == 1 ) ((scf_data->samples).samples1+index)->sample_C = value; else ((scf_data->samples).samples2+index)->sample_C = value; break; case 13 : if( scf_data->header.sample_size == 1 ) ((scf_data->samples).samples1+index)->sample_G = value; else ((scf_data->samples).samples2+index)->sample_G = value; break; case 14 : if( scf_data->header.sample_size == 1 ) ((scf_data->samples).samples1+index)->sample_T = value; else ((scf_data->samples).samples2+index)->sample_T = value; break; default: croak("set_at(..., ..., %d, ...) : what out of range\n", what); } } Bio-SCF-1.03/Changes0000644000175000017500000000015511242271077013434 0ustar lsteinlsteinVersion 1.03 - Changed Makefile.PL to link to libstaden-read, which was renamed starting from version 1.12.Bio-SCF-1.03/test.scf0000644000175000017500000050705406772463640013642 0ustar lsteinlstein.scfHF2.00@@@@@@@@@@@@@@@@@@@@@@@@@/@@@@@@j@@@@@o@@@LK@ k@p@>O@&zmmEU~LLcK,aL% H;$<m|$F  $` C>8.<]B~LU=2XPZ.F2U C U$MA8.Zm.1IgLabz|+qm<I zeX9%8k1~-cb 0*xH\aG#:6/e9CKQaf/pS|C4M!6 (r/^IE7Z02> h1G 3$cG ;,a23V3wx'1=^KE]ua&B[bP@ (@|@@@ 8@@o@f@@@"@@`l@@ @@+@@ @@@@@f@@@q@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@>@@@@@@@@@@@@@@@@@M@@@@@@j@@*@@@@@@W@u@ @]@Jt<%53*@f-jDVP2IX3OB;@A+}'*ss16\8L5O+$_:tx 9!eh8zACWL&Dyw3H~nLY)6@)@(@+@,@&@@@"@`$J 4L  oo` K0#J]D 5tx\nQcMVICDE/A_AI\,|bGdpzW&U%w3n0$,Xz:My >K+<L;MAIW@D2 = A[hBi"e1C j fYo$->?>- !?.Jj;CFO>YXn"vV @R7q0&d/eEH3xi`j )TW LCW? }z~Pi8)-a@wG=(Y7%_ @B G >RAAWNG vppD4(D{'}{tsgJ&;=58 UnRr }S 'WFpT2W<vN|yr#="y"}:&u# vAQK@!>Kg !@$@/@6@:@:@9@8>8#9,8@4@.@%@@Q %,n4\Go1nT"25xCIITFJ]6xt=,FZ1o)xIxNo:0\): SA#%Y6!Lz L'zi:> NB`?8SB%Sf?Ve-l~1A(xAT  J! Vi{ZudQ<'.H68*h(i^B@N,c *NV0"p,O=q6HW=1^<*2LFQSP8@C-,07?\{mv=%o1S*S1  8PMr[Ra?[8JC2ex\F2 >[ 1U%MP|,[oo0 N&2l86p7/g  6t]oJ8%/F -1]+%:HqWD:iqY{G-*(z6 2zIkD\SOePT^VUgSRZrzonot F`O}NkGqa})UN6| 0 4"'<$p4kGF(|buN =j0#k )M_HXu\u`9.NyB39L3u-x2% YE0L*sLcV0LkDqC@OnU2D MbK?k*p`?|+wYr\_'`jmOX_W\k^fX%w> a%'u  xo2hoU{>S+ :# pj f<kP'-MNY*LYVVTPVZZJ jN}rd-R>E)_*; [ sv -"7zZo -Vb5<xGA]6&4yX:(p*f%4QaqZrFFH6,+%$!@"&0)y+*&]E Fi vBF7$`uW ;!):lG% M LE:/m'O#/"! +d;@@@(@:/JTX4W@S@M@H@E@E@GHGeA4 Zk|{5iYIX:b,B  ej>2c)5;M-% n/"(*)#  z {^<zpGu}v&vA>}R/0e7jJ4#G \tU GYlz>B)he"k!.+HEqT<(r  JiB+M:HU/e{(`,8}c% H11ymbVI</D$  #(?x3uKN_m4r*pgYSHO9~+ .[GZ \mYEo/ u5%uw*0 ,}( lK)H P%+.S44eo.T$ N] [Ny q8[]OAqkp9%' {oc.V~I :U* Q z(UN-X]GRY=c|*cO$\)*R 6F<:00 ' WE +X+2ax:ffS`A,/d$ r[]&N[|bkIUp&XqWCC?1  o{[Px2;0`t@K`G,BIa~maYWRJI>,%CU8 'a$qL-5qb= DNXYc:cm Gt >xIw^urqzoonRo/pni`>UvKD@><R7-Br-Dh"[{dQD[=;B@IaUb{&p mK0=R0;:=`BE);U)Ewb_QB=3X%9v'kf&3\vAKRZVx^LYox=h $ 1 ON]rJlyDMr+upOW.n;w>htR<K1@7QtK pr ( 1{4I0: 'B^ E)O1z3/#+>*qh\=T&auNwr"62ucj & RZ9Ns3q^GKy;g-$#)]f6FRNVclan,;i _ P>*t!+l%lKS"%K #A&M*'Yw \?z&9r1'W/C!<E>R{g'Jzee[KXXXXZ ^cdl>vLgpA] slZ>Bh0q6pv(,1~ Pg-) n9)z(NI lb3B:(s0  $Lo~qK `4Y?n"! oe"3G&:YK W][sRRF7;":69CSckorRm_Km3( A ]F/9+gr]2NZrd#qAqeP@5 ^X c+vgXI?<2+&# uK C]G_R#`d$F47JdD{S1.gaBv[?$C; [s_awO[>.!wGC p6*%:"nxjoV9'hnz~+ oq&/aG.VwL:Em xmz"-`64 8+l]vR[LkJNU e_lz#'; )TA'aj#/%&vRf1Q@|4uwg^4ZJZY]^`YbNb@_Y3W*K%;@%'@&'#X dqhS`)+}|yK};!\GVqqhYUL<1&6 Q Zn)_0VHUOvF_< 2@+ *B3D+ZrI_XgIm* y;DWnHYFa$8s EFJ"KE9(ht<*@xh^ZZ^AiNyb 4Ri'Mk 3S>~.=&&0,w5>wDEm@6(^Jc_X H! =/kE Q!"GdX#s -|}[?W&3/QEVHP(/u*X/&($cH1+j"/98<5&%/z0fHA.|7x oaieaM[UR+G:O+wVU7 9  z  ) 0{  @Xms5XSL-<HtHGlC<6[1a.+ -C+"&] P3o!E6pZCA/3M`@0@ o"*5BBO_eZ&bc \GPM>"* A *_(9FnMME9X*^@c2t:O/gqL0ce8g @.[ h_EA !fJC@)F3?"LQ#  L:C3L|h@%G5mK ?a#9fIRjWP3C-qF~1OWVFektkz&KELm [*6Q:ZBsh`h]>`@fqms-sl^H.LwI|e7nBz5V<mrV* A>tf;2-u7<,L}HXu~u%l30 owIscXp+^ZW:#w> {3H+D-RkaF,~-7 >$b"Fq'6-Y ,% Ofoo iudYM?.d? =`"-:4n6|8[>Q{- [I  :mU_NbbIt u0@/ ,kL'$3^%zA- ^%-K QxJ!/sD\ I~9D+X%^mRLW/sFwgW IW{=+1I$a `& 'h 1&L0zRU:6~xTK8J# |yO ${97"DsQ>n|4hipR8$j,0t(U2VF:I=f<9| 68C?L`7nv<mTD@#yp6j`gmdR^ SA)sTuf60`pZJ=3<* Ktq Ar]z$b~{%P0j?QZy]Z8"q"-Y<IKH7L741 SVXg0?T7),NF|oMy1yF' ]`;(d Z & W.o ]$Fx& 119@0p*I`VQgrFU}A@},DILKBE:/n.V"@n0=#~x "! .-T2Lm$Ie1I:h=mY@N24hv3kP>uC)>X%9sdB&,(##i,OM5g \4ypj65.YG_r~|rwfi\^UVRPSLVGZ?^4_&_^ \]d sW-k'gr>N9\f)~ZYd,0VBIeazK% >*Jp`&WV!^qjRxGBZD@^{s9ynre} _E]m:_!!Ct(WTH>+t6w8`Z **m"  N-A+SNW_$Nb]N+9"* tA_yp ES l9 b" -5lmB/&vW BV3#S%'&/$XA :boG+}|#a:X+s_;PF@@:9}5r-|%}:Vc .x)BX?l{zI~$v<b GO(= }SHLIHN(Az 01/eU|e]8A <XhAP*Nl8N\9D) k]n|nTR d;&B(S  $"2S@dH& IB 3D O95H5lok AWEx^5'G _= FcoTQRag4{iYrI:R,"WvE G#%*,<*##h  VbawHnbWJ,:n(+/d,t2rP4$ f3>zT;(a caW _BhgOS><Q!DSQB|c^K6t# )J|>e m`ONKlBprNs8I(;'SU aF;3 ?(+@<o0(KCUgTJFCEcEHEERhC6@:\30* i @Kc~3bi D)3W&oV6 HWXqb?d^SRD:9u 20>B38N;;;g7}I2/1k:V2bL p/k>WFHE=;7*9Kra2 eu[np|+>! rN'3! 1 yR0\h-2XH ,k)V7 PQ"vlhXbWmUJ <x.6-&"793 % l|R")Q3^6;0#}Bn\x&L@w7:&0*6"xRvQN'f? #H";F+jE^6dr~dq`N>^3 /O/}2NF6!7625.w,e0e:L#cY~v;MhMCRy(xa OfEBfHE LwRW(W@S)Iw;c(N;3(z4\jMKZT(T]=,+>]h+,|9d;feC"L`U&e)e2-u|vfY7NHM`DCvC&oC#A>9D3<+~ #unh[dMd`fj"m)o(.p,/s *~"a  o1. F*4$_6<H0>#D<` xcxE `h+~tmjjmWqturllcHX1O3IRFFG"IaIG|FM/F|IQf^o6| c`w!jFYVLC8J;9862,$sxcqXSQ R2S!hR.O8H;s?6E5)* )Wsw_0- p!#!h "\ ?6*>vfQ@_#d `ZS^@+,(K./8_tZZ36%M7by 3 m,p'8"[4IkqR  S#,s79J7^RrN}obU6YSPNPpR5jT^|WRY\ja8kz8Ug R(6}9ul_N<j/\0cTHT\ j_|v:h  ~t]vG3V0!t!#ir5.|[ke`]}^`jUz,oL,k"/|4u6zk i^XQK6HD::]13,/=+.]-.1-/0O11911-.%)>" q+p> V-+Jf~<K/so&Y;K*9e9K\$I'g D#+9%65":6,JZ ^pAp@XDD`)5NScrQywm\kGh0%~ATXh,J #[ & 2eDS\`k\R6CF2N"A  `}?WqEEcTkgF:/*$ l )  B r ~M W$i'mf* R*,I&rTB}$J#'tB)>,/2h5-6520//14#7851*# K   gB|06>)w-;'T3C: ;5`Q)I| #R?tJi;c^YTNF0=_2&o #;F2XY uuH *&C{ Fc_ ;g"d&*,,.*R#T.x2nz ?02I`5tKw`Vt^z|ph bz__`6 `]VL?/{k[Lj<.aY"*S n,oI:H7 6@ x.T*Mn#^; 6oTVS`'scT^F;>v4|27f*B Qc~sn~^QEx5k"Z$K=74[-&*'{%I#(  Y  Pi 8;.oa'65B(? h\i|&E;d daC?,XJ": lEyVhN/5`T!umgGODMR)>D5K+:N;u Z2[@*gqT:-2Jo?ur ZW_#RYw8`L:9+ }$5 IB ;5}9z)D~P7!3 "/x;264f]Fe1J%g Wjj!1%z(*)$%Wrge1 3HPpld2xo~Z=K>2 '`rc1L }ton`SF;_2+%!vK"+?9(IZ7kbw38jk|>tkeRc#iu;w2B.]Uugg4!qZlF :6=J\nwz{ n[wE->VMFZX/".[T:DdS3grsl_NM>:'WJ jv]]Qw I ]#{,XN1)3 21[2 5=IWgFt}}se"U9E8l/*_2())wQ(Nn#0mX<'$7^n C"tI+6OzaXiAFgNH\ `J5@H|I92m.qK}"3oAFIM2R-Q:H\:) Xu`\WooGjA!E^$@'3%:W HpI 8I 9_?y*28GgqT6]f `^VJQ6:*`sX>Zg>r_v )9c3E7-61) W76U# $T!eK  l`v [n; /+oPYTB")/-_,WM%>1Ao} #.T7 L#*96DHG7@F78-&"$+4Q?GLCLsH?r5L+$"%- 8BDNSSLB6+a$V"h&/: E`MQOuI=?4+|%g%u(09@CCJA$9+WQ qAJBv->H\?,GA' R^b!_ SBae.Z? a?z7R=6! uZr$k&r5t?2#%yPiU f0i*lR?8BWq0dyA.VJrfZ}NB6)  !1+ ?xGvBJIa C 9$,hW *_#$SonHx^ dk5;:NK|3-@vc@i\aN@@2)$\2 ]R!O+49S<& <82U)  ` =#'/*?K"R&f'y=# v{[x\z~~ _znaVRO'OT%_XlxRyiS08.$\KA^  uXB1$5] 6B] /RW(, ("g vONbQ:=B68,!FB  1`+ |,)]?GSR4g#zA:GY{ q7iaZR_ IQ=^0e!Lkg8N9g;,p{ +N|R2%*9\WC4":'.111,|U%O2H|[]I=50..1(6#V<({B)F&FXA 7 )+l%BC<=xYUU<2E+HP?ZW% F[^F=  {pDmr $f- ~=%]YR"fhO>0% 0QaV+z|V@tN*}lk{u/#kQt,In2+? e;Pzf ( e$!&j% B?Lw.sX_YFgeNfTF:/%WKMMyqK& I :{| OD!  >TBc~%W:$>.Li9{'2zvF^wPwrR1UiG0T12 WnG jOUE8.(%$%(N+,,G+z**r+4-J/]12S/+fe%  _@'3 LQ>}&$i!5FTf]q^`WeWH3(OC{Q $pUvI3l\}o`SfIKAD>U={?AB @;0">F_?7?a}ofcd"gXkmlh`|R4@-:l q0B`6:jh'Hv<qE/ ]!z#h$[%P"A$; &6&1%,"&   'C[i"j$_"N;. *1BVeeOg!*~G.cjFx+tyVMJ2_2QY6z v)~M"|#n_STf\K5 $23 l%Xk[HsOT/>0*,n),[r2:vBuIE6MpONJFA=9751+h!/i4G Y&- R {3=^0KQ"Hi{uTjfG=<f)SIEF%JQ]Zetf0 :SES[rYv~?&Gw,@v&*bI[$ @m8oL9D2q3~;lG<+Uag>sgbgX@J:5*4 ubFI^rOG<)" S6 FQ E`[MZ%zj%{ {wiXH:-"h6 D!j@>"YLjv 1,rDVpeHoIq6k,]H /LAkq}fQ0ZS )v\@Ip;0s&J<W & K 3 LfX&ApyRg* 48xy> L #F#^!imqy&.48986422!250:+*"qDeu /~Z.<3p@cp59 G@KI-Q&M_cQ`,`i  Bi#E\o_RH>5-&%M{ }f]e|_iV9e5DkTj@Q1I(V$w%).354-#k ?)~o)h#Pxrojhfc_;ZcQEk6$Dq<I.3|jNV1`B$W&_ rS,C$XZh1rsX/n#bSA/DATp0G*1y(^H 5""?`}j4<)"X*+%mD 28Ww89fl10k#WJ?83.,)F "Y `T2WC_PN)k pvZUN4IH H1IYHGD?;60 )! (d  j "oMZ>m'|I{I*HI7HPUwSI1nzh{V_D23$*i> ]p)$q&=gV Toz?(:nI4 i/(N /irL!.BpKH6-6{s#L/.:9CPI\KhI}D>71\--/38,:j:4~d)mS#7E1 L` &hYw@caO'<T*= pAMyf"d&A}>d'H* ]FW Jpy|Ms.]C+     $ ))"  0 K ex}qQ*Ww*?RuCdZRJ;@g5':MSG */">&SMWx[2eBYTQ4EE5b5I&! b8 l v+Z!)0H6d;L=:">-S@#xCIPW _ejn$p:qNs`wt}G{jm~XU~>e3Y <+qc~  cgRUJAHK}OvNT-XZ\^gJxUNNqaWR"Q5S@WI\Uagdc`YN.>*i{3a'N]HCgH 0z]=2=^(1}qT c]R@M-*:,r7gsvVs>,  ?s| .l"$v $/n!1N#i-8A{EsBs8' MZ=pn 9QNY2JTy^ t%52Y87X#08i$2EpKcD+= t{nDnd'[nQG <"1%fW O\L0KK+HDv@1W=;;<$=)?h*4@&>8n93-*JDlt])R'2m)y([@F 58 .'k["!F |VW=,!~AH 9p<S1.eAp6 dz\X{VDTiRQsO>M&IcE1@:`:3+ pB"OR3@ Wz)8z(f:=pI!V` ;i gs } Ae(gWwWq6Qd!=z~[EAs6&.:+,+K/4:AKuXnZlC/L cJ >w_Y>d'ILsZVG B5d0^/2#8zl>LC8G@.Hq)G(D(A(<4(9g%5 31138uC+Toj8ZSK^iQ]N;)8sI0 ;x8ui^aZ \W-QnJTAD5;(5/ fy),#EM5 4mX(MUHUHIKgOMNM=_J`k#FCB[CcE6J<vQmhZZbMMh?j0g!`TD|2iW E3  RIn%|bX> +* 4 ?Og|. [D)JvfYM:AI5*E!N0_]}"u h"\MQpH?8z49S2r236+;ArG@L-PkSVuWVV<R'LD:/$$9X[:: DmNxFZ01'cmDk"52b~ co[nG3? ajC*Hc>p#  ";JK9+KY`GSuzbTpJAA91O+E(9 EqQ2Z+Q_H`x]]3UC HH/n?8'=7417@?jP)=>0'H kQ ?3+~$O9 F$(_+,w,"[*<E'%I2$,P 2W 5a6r532125 8;k= <*9cf2(>]  }N[~F<<BWN7\yitK,{}wfkeZ?TG53H R>cAB 8NiM-:I-%] %;K0X=Mb*Gi k]3m\2g,t8?[A5=3' CLtgL"De J75i#DK;|w: D agP$UKPGIHHMS[ ld SlKqUuAtuq]j/^vO?-|ZL , -?N]l~& -" .><Oh^l.+y Vx%2z0<@~<q/aO<B)EAT@LuK?< NHNLE,1tirnI~Fh{QM;8&<X6Ge&H7GWc}mKsut*'o~fX[9OB}4] &T-d4 %!Da%oj4&2c><ywAgCRYAOG;yF2=&60$M*E(&_$v%',4= HR[ a!d"d(_5 VF KZ>m0| ~lK"OJBj- |(ir]L>2(& 5?A9 #!Y;|6 {F ,08(DMR_TKQK&A25s|'/  |uo$j)d)^ X QKJC}:2U."'3oRL\|( du s^8 !8+OzRg5 }e`)V h T<H_A}ADIMPR'QmNIn9B0;84,E%%|d, Ft =x%|N> "#$4%x$# \r}x ouK$wp|w[-ml+> e^HV|3h"RE< l&"<xeH\ ! /,%5f;"y=%^<&Y(9$hU4 p-y%nSQ ' >z? 8Ntc^xK:* j6QHIDBrZI91!.8,O*c(u'&% y#a 8)4?sI$4S{[aE*f ijFjirj`kTEnKgsDw<z3y(ul`ZPz>S*[V4}) l,sx4 p;)S4J:W9y:2\%l>hQ(2ra\S;/9nZ'o[\&qf^d+&W}XzW<' [z!)H}^ 8`&+ HT{lvi:`s .t]P6"7$CnK?&H.f5 :q=3 <n92O'?k P(~ _1p*Pv%Is%++^KWQX93@Ym-~pFF$>vZ u?dbRFqAj/N !^P\ L $7 2 $E[r0Bz  OybO#?O2y+,9Uw `^S ?l b = !"$'**\()$)Acy#^Xxi[~NHC08D/X'l  {Q( { IA. &h,.C2s8 :$:Ch6k71,'#T#q!aec eqbWXiM!D8+CbJ ty=]Jf>A"73 1 /,)I$H/|q)-Q~jY{?.&$%'~(z(w&u#vz z@qvB4xiG%.5<DzQ[i'aefWuea:\vUPODIQDyy>4:6|}33^4a5%8m<AFJKPK gKIbF fB>e:6*,3"`0-b*E*'.Ms$ {)@P k z {xlo_eT\MUJOLNQSU_XtZ[ZVQK!F'B?<97]b79-:;C<g<;95f*/O!&>,2P+ 'T$ "L$)F/F47: <G =t>>=#;29H5g0*#l SY|8 = bT"f#NaM|jEau_7c]jpvy{yypujmdc\ZSQHJ=C0>%;999865 4(5077:<<B??HCgNISQXX\`+_h\aqc{elyy4fe\rJWbQn@#. Xo(pP@M;x  g%\HqTtOJJE&?k6i-8$6s "@Y"j=tcukV3jP>^}i-UxAo/0Zq;#V8crM/oY;\zAg1zW:$#++j  i=.!`*3<DERyLFT;Q7T"VV fTQILF1>_;6<2.2&BjS K@ {` ?#$(F2v:]@CTBx>  8c/&K $!  ?}6B n^=k$l.P57(:3 m: 6h.$)d14(!>uHw. ~yY;"4^oCR );\\}llja.Y[z9Y WT/OQcHb-'@_p6I*"WlPl:%!,R"wi> f< c+,b0}u`H*4b%(1(HDB (1;EiN*WM^c_c"(X`NYM<o'VJ E:5_3- 1B1Cb3/4 531X0// .G*& VPrl8sU+CfM:KG-%!WcG 2! %) -253)3_^#pXD{sWA.-UO%|?M[xbS!JDGeJOUZ\[VOG?m7N1/' r\@ c3. 1m({Znqe"_[MVPIB: M/# #o( ,[01I3i34nU4[210/oK.Zb-H,7-,'ep.0 23_ 5377G8Q6X2Z-Y'T!I7" i f 'Jj0)Rvh^RY;XXYX/WSUhSlP_lKCFAW=:5z/f&alo3OV/lU+Nq[S9$Oyr-qPl"h z't57DoP[a{cc^5aFo[2P"BG2 "g:[ng_Fydcot12plT@R2+("(p+.2D5Zv8,::875Y0g!(LX5#:R 1TvZUD= +6S- v0&U ]B."!*3'0<<CDOSJ^^MmdO|!eP#bO#[L SHKCC= ;862%2+A.#Y,l<)un(s)e+H\/2'46i8"*: _95Z-(y#U 4Dt1.mQ&Dz<$D <&I{e((MsY71EWfq y!%'((%n S/ a'CO$K K#$! #7SEF;{#qleUEAN4u$m %buM/K*IC & 3'z-OV9$T F9v^7`(".(g/p588;: 967o41r/Q\)`ZK$_?!O5!1j/" +%*'5)(nd)):(* '*%(#$!wkc]ZVS O%K*G-E /D0D .E*F&H!HHW3FfB=i7/['j  oAG])u l7 ^S6 }Vofa"_&$aD#gWm]&tVhzB~#^T<hL | Ma6xXXA=~2ev+k)a,oV3\L:\CAm;E6EU2A 1971-j|24 6+8dL<;\A]ENH1J JKK8oKt;KIGMDD?zf; J550/Pm)[#W3E')Y r qq AXB (|  9Y~q-+d[Y|OF<{ 3^*&6"q j]%//i[!S9MX@J}HF}FIEK CBAB&EUHLPRS R9NqvGb>L484+{"N7G\I:<i"m>/yr= .Siosg\PK/>95g.*m'8%J&)7/~i7X?5F3NTZ]F]ppZAUOSKG]DmF0?K8- 0j&E ;[f]zBf.XLOnJZFB? <NF8&x 1]({.Yy? + 3WWk-(mH_sCy "ch}QEB50)g[8.>KUXTF0@xJ=l(=Ui~upnpw|W+VmAUw\BC)j5`dF&N k|rQ1:(U C d+:\zuFL\U(D_kiY>TT4$(SGuXb[-SQzHw9?n 9eQ4\2T2LX5E""9>H>7iC1J,pP(RW%;]#)b"c"a$j\'?U+ M-C-*9+>F-'X# zy >  1gv-jWb~ZSJA 79,p! >Q Aqh,hD$~[4 2{bO' CvamZJh=2 *P%"{"`!J < 7n=8Nin/Eg"~$$:!vxZ4/XoxsNe.D $&(/Q(P&y" 2Rfmg_U9%cc9#Fd}}pe\UPLIzHxGxHyJzL{N|PPOMKIFB> :731/.A-Iw*(%30!m{-   $h~J:n d0(\\Y(62$-%:aRd;xdK87)Z v $')l*@***s*7#)`)'J&#@f-a + s { _ A; "w  *+}uoiLa?XmLE?1#;6ge.:Xs    1DU$e)q-w/v/m.[*A%> \#"ks=  ,Qt}]pI F:%"-)D$+q./0!/J,z'!6Po[4NU\,@ Bm#|i.XHNJ] =\R0H$$ ^n(=Ub^YZaHx*0qd> DkhSB72148;=;82W+#En#6dl#2S%H=$Z*!jx   L?kX%'MlGrt_D3(k zJ#Jv_)7e~_C' DFo:O)(Nr[I-Y<a&4//1u4BW7f?9,;<? A B C D0 FE G[IrJIF!B$>'<+<-<x/=H.= %->X+?~(?.&>%;?"6As/( v y c 4 T  a]=" Gt  %e$+*V034J 2I/+h$';Vxkb{RE;3,&    ,9EOW ^dghhge`WG1    c ,  P $ 2s4<YEKJKLW4JnWCk;n3c*J!%; Zv_-xbQE=98;?EKPTXZZWQH>2' tG5W|M&$"_((!#R yFl`UKjA A8 0)%"!~ R%!Af qL-Cm  Am!byL 6?`;7*)g/ej4|ncZR cK=DEt*@;W6)(0_)"    2kW+!*3#<4D5\<K(9bP STT~QE@L eD:/#{v kEU  I_{)T )~KY}2  :1^\yiP;E*t_Q G ,%I f{~ytnf^UJ=y1p'd!T ?##-<Rnu>*hN8m -d!idS>o* PV, X1g1@mlL6- 1D?aVut|o Y.=I\ed6[wnIR/01sd 9(:-@S9%yj`LtY{<V.V_X\laCd#9f jeb]gV@N3D^9- rUc]=L> 57/U,d*e^*X>2)> T'{#y>#Ii[+ 8hrY; >q{d<T_IB=:8766420.YR- --!+d)K&$!#6<7b'J6%'Lvk<,Y!% (y(p&!%n%&Ko$+pq"1u7x>|EM#TA\\dq)i|;lwTkruhlcnd]UZV3O&N DVG9@-9b 3!. 4(S"[n X6 e+:K s#m 17A?tKSVBUhmPPG<<+-:k_ 2    uM" "$3%c%i$R"@!1!&D"f#$ $$%A&~')m )MS(('&#AbXt4w lU5 w<Bad:F!c-*5?GMIO{OOO*OeNLtHHD>%7.. ,%\64i  ZT){HnyaUI|?n5+d,>]$JWNSHO7N%M.M:MIK\iGr1C>:6T0$**$Mq~k ]T7NTLnLPV`ksurj]'#LO!7}Jwj3OMs{2Thg3XKA94/i*P;&9c!s%F  -GxXh`e_oTC, 2Pf sv p_E $ !-! Ont`UT_ t x\=$+)N/i3z67{8l6T)46J0m+&!   4\zX 3@rnVsO@O/("%Sy~N&"(-4:AG K4tNgENLG(>ju3C%=Yijh`S!LAD.2i &v8? ^$28t7P=.4c"-E fqQ|3^$"<V##!Z88"`&*-n.F+9&>X gn|x|O;p&t\ B #   5\~yV6mN@,q-fQ?n8ctdTzHtAo5BjTJfmZbs_]ZWw Rf>LQsD;;$2 )N{ sg}ZML<>d.V 3bS+l~z\Er 5]%+EG')o) /8B;MtXud]nHu6:y%^yyw r*kNcwYwMZ>5,8 d~R*hBQp ^ <O uD:1('  8K!$b3 {G`~zH  5\uH$ dA &M}{adL%D9`$* N l I (  -DO#O&D'/&%#!~8@]C Be}X9  1AQ`p   )QmA$\P")9>8*x.cMRrE=:b97:F=p@CF H  iG )TD FG?a>9{:39-8&9<?CE D3?E9U2e+q#z~~yo`K40]d:2_}[)FziJg'SH;E_LyZjqM6'lQ!)2.O Dsd_4  VsX$< 4h!saL~$qf^OYWoVSV;W([bjt  ~N7Vszw.p?VI<K D5;^kUW#9FW8s+!mG $ ,>Qf|'2894?'pOV#V*"Kzskg"A_]Y$U,T2T86Uf7}W7oX5kX/qV%RLE>6"/G(j"wO&{< Tl 2 nQD6s} xs8oWkqzhNe*`[S/LMEsj>P711+'#!   $),-*" +$S)-r0L4"6?7l76b52 4@2d/-*'|$et)":qG  u`t`<~ q C`cK~3Avn^H4 k$EK~( # U oVD97!>'M,b1}566[4,0!+>&Z wrR4 *ChfK* Q z Y ; "":JST"L#<##3"V ~W "KR':[v{phta[\@V#EPqJE B Bp KCJ G% N X2ectyka[X>Xi\bec db2f5Sglg|f$b;{]TOxVm&dMID%;2( q "pC6`ISZGk=|3*m"T>,   '4<AB>5&Etq4J^% 4Miu`M;,rB Sd#2Ae.bhF-ySZ:<Xn{k[}QnKUL5Q ]m{D k9! 069_=<x7b/P#A>5h*" {gUE!4$%'+ .027=EOW`ir{xi,TZ; 7jtG'1:DOf[L8f6]p#yiI(Ary*aPGr-  y@pbhaZQiH =?*7L2l.,S)&$(=J}OiKY>L'D ?=;::jc:E9 %7 53#/=,Q']"_WG*2BYn! #&*"-(1,4.6.y6+a6'F7#( 8&:B;]; v;|:[8<6 2,$+@Q`mvzxn_K,5NusHJn!f#HF 0n$ , 3B9v d?W3C6NCn@91'w^? I]r9x^+J4   ytq$o+o2p;qErOsYrcplmsiudr_hYXT@O#J)GUFGJaN<R<W`\|`dggeax0[^OU@oN IDAAACf.EN=G8FH$KIKJGI#=HK,DvA=;:9?l8YO6l53y!/+'{ o]$ F2-AQ`ltwvlr<Ujf@_,P<& )E\lw{x*ygGqXfdMRD=<%3 *!5[  {n?cbY P I B=<>D P$ `)t-01/+&'P"owJ" y0QF-] sgQ<,o ^PE&;33C-T(e$u$%(+/244}3i0Q.7+%(.%4"6 6G2xt,_$G0 3HV]^%Y.P6A> 0E L RVXWQH;y-hW  E;3!r#$(- 26k6bT:>>*CHM$QHTlWY[]adfggfffg:f[dYa+\UM EYH=$p4*[ 1/GZiruqhZH04U}w .QC+PWWQ&EqE5Sc%9 !  2~ RlwZG5##Ge~     $:Nw`oqj g&j+q0}578x8j8W6@4$0,8'Q#g }xbL<4|4m<YK? a #}%(*, t.1Y/SB/r0/#// .(.5.E-X*m&o!V9$?WskWz>*yjV>1#T{v1T]24HU[s\fVY KM@9@_!3}'}X/3Lm k Z-"K6>?8]p74[0*G,1( '%&Q'{(((s'[&E%.-$C"X!l"$(+.02r3U486$7M9y:<>t@1RB^0CDEEED.B@{?Nh:WX3YJ,U=%J17'/S  y M  +vEIZ jsvtm c W$ H9 7P %j  %-5 :>??+>D=^ :x730-+)&$~!paUI@?|9`]4=0  .-,,- , + '!$ 8IV_caZN?/$=)`.10+k%!TB;]"s  "Cgz g5R[x:i\QH@70p*W"&? #) 5Lcy ~pe\VROMK?HapDZAF=68)1 )%;K !U$"Z5 [LYfSKA6+} m0] CMP?Z1_$`\ SG7.#C [woY'G7:@3A1:5-=K\q[91Lg~fO8$          : ebD)    +# D(U.^2`5\6T4G1)7+?#%W p   pV:     ' 7Kc|bD' =a!##y&eFS`%Ct@3]%|r$eAYXrPjeIuYE|OBC4x:8t3Ak-N_*]P)n@*/+, -,+)'*%?!Rrb\nHu5 v$ qe2UH?_%vqI#(6FUe~teRC9:2\,({%i%W' D+&12::J BWK_Td+^bDg\aqQyD7+ #A[s}tjq-_bEqSU_YFK|<7C&=60(n!4AMd x|aK=77p<ZF@T$ez 0pV_PC7-!4N4dNwju!f9TO>c%s ~|spZaCO/9!" - !69;Q=i;71}+l#]P C86/L)b$v|i V F 6 (   o3TZ9)Ts^I>5a#.BjWNm3    :Vprt_[MB=)-$2BfSMd4v !0ASe w   y/ `DE\(w z9ZX:vvd$VGKlC<62009/fP .Fb*&p1%{H _v|p`K~4 vcT#+I):@0G8:Q1EX+O\&X["^VaNbDc*6cD&b`^}XOE;2*b%,F!7, >!@'=/69+CK RWZZZ1WISaMzE;0$rdXK?3&6Vw}sh\QE7;U0s' se%WBI]<u0 % !1BxVbkK4   (@Zu {^"A2%E Z}r jX I<0&wmgeh o zxk^RF:/:%Yx}j2XDFR6.^)`dfbZ WN > *  \  |  ^)A+)"B!ZrjnE[J:-"|e P=( ygVE4!6Tt%5A~JqNdO/VJJJ@e@294 1//29CkPQ`8o" >]u{cQA1!&?Zv#+5@vJiT\^PgEp;z3,%w la UH39I(`qv_M=0&q)Z :EH2R Y ]]XN ? -7Sr {.fSUu J C?>@FO[jzuX :'9Mbxwrrtzyropt{n^M=/" .CZqudRC7- %!3ALU[]Z QD3'5EXmrR3,8BvLgW[dNsA2"8XvjO2 ";Vpwg)X=IP;b,q um tf)e`IVXhEP4H"?70( 7W{}q f;\URoI?5+"zm _ O) @; 2L &\ l }    " ' , / 1 23444$3*3/14/8+<'?"BCDDEFHJLNPRUW|YkZY[F[0[[4ZQXpVSPM~JgHNF54 EN DeDzDDCCB|@k>^; S7H2%;-1/'>#!LYe q{ /D[ntQ1 &7Jn\Uo@ / #    $,4;?BDE#D6B|J=r]6jn.a'X MA6+"!{(q2h@_SVgL|C:2-){'q&e%X$L$@$-5%E,&^#&w$"      / >Oat~paO=+o5 _LR`Es7)  .ASfx}m ]K,9A%XoxbK3s`N>1% /DZp xl`SF8)5M}duzme[RJD?;875+4@1V.l*k%V !@)) 6FWhx u!l,c6\>VDQIK)MF>NAVM:q}J2uD*q;"p/o o o$o/q6u8z4, ylaVLD=5/s'f [1OCDU ;g3w-(%$%(/9FWi}xj/ZAHT6i $    9rX_zL : (%Dbo`RG=6/)"zi X F 94n U"V s< "    "3xBdNPW =[.]4!^L]f ZUOH@7-9"[!:Pa ~mnt ^uMq)>h:1\N$Nb=w*qY@*(9IZl~xky_fUVLHE;>06&.(%8F Tbnyyq gZK:'#'E,k02344< 6ey9j= ^ATDLH FJDM+DN3HO4NN/WL&bGn?|6," hTC5+$  !! wo ga,\=WQTeQ{NLIFC@w ;+o6Dj2]g.vd*b#'`'"`*a+a,`- \- 2U, HL*]C%r;5/( +vAdXQp <%  kO/5@P]goysquht_sUqJ ow@!ll76ha1KcU+`]K&xVBP;K6 F1B+ >&,9 K4j0+(%$## ##$$'%*#.28?GPX`gnu{wgWF4    o_QC7+(4AN[gs}.>Ny^sk{ownk`fP&`@=[0VVpQMHB<5|@-wd$rmid`[VQKFA&<97I1W,bu'il"nco[nSiK`C S< C350*H X eo$y,5@JU`kwysqejWbJZ*?SD6M^.Jv(H$H"I#I$H&C'='6&/%*$%##1#?#O"|` wrrlf_WOF?9!4$0&.&,&+$,!.0231,'"y]=4LbwcD ( '7FS^eiigaZQF9* !<Xt #+2 8};u#<l7:bO6Vj2J.>,3 *)( &$+#>$M%Y&b'h%k#j fa[TLE=7 2 / . .148<%@+C2E7E<B?>@7@-> v!;j8.^3@T-RK&bC r<61 -z,e,P.=1+6< CKT\elsy}s,i7"^A.SJ<IPNASc:R|4N/{I)uC"p@k?fAbF]NXW Rc Lq F@;62/-* (&%%&(+.15;CKU^xfmmarXwO|G?6- % |zyx(w1v6t8q7p!3n$.m&)j'$g'c']'W'P&H$A!#;-591G,W(j$zgR!=$)'(* -04!6.592C-K(Q$V!Y[\\YSKB 8"-#!!; Wqwqno u }   zgVF8,!!(/8@HPYdquj_TH;/ #) < N [ dfd^TH8(&4@JT_is||xvsp lgaZSJ @ 6, %6ER]ejnnmje_WOHA;72- %*7DP]iu)r6eD[RR_IlAx ;7557;?EMxV{i`vWlqCxk-e^WQLJ JKLJGB=5,'8HV`glpsuwwvspnmnrw} ulb W,L7CA<J8R7X8\:_<` =_>]?Y @T#BN$CI#DC"C=!?7901*'$ &3 >!E!I!I!H EB?; 7"2%.**0'7%@#I"S#^%k*x19AIPUWUQI>0  *=PdtrYB, '~3u>unJifV\a_N]g?[k/\n]n_kagb`cWaM^D Y;R3H-&=)01(;$)F+Q.\0g3r6 ~9=0AEB[Bq?9 1'&&;0O< aJpZ|l#'())('{%t"me]WR ONOPQRRQOLHwCg=X5I+="}2v)m# dZPG>5," !%*.1u2d3S3C332$10/. --%-2-@,N*\&i#u }q%g0];TFM RE^>j7v0$**$06<C LVaksy|{v nb%T1D=4G%NQ P#K+C38<,BG JJJJKMN"P%P'O(N )N*N,P'/Q/3}S5;yS:ErR=SjP@e_MCzUIELFGDBH>=H87G22F,,F&&D"" B2?@;J 7Q3U.U"+S&(N+%G1">83A%KV`jrz $).4;AH|O~wVps _`qiPp%t?p/0q7"s?uF zKNNMKH%D3A> >E<I$=J3?GBAAOE9\I1gN(rS|W[ ^^^^\[XUQNJGB=6~/{&xwjs]n QhFa<~X3{L+|?%0!" $ (. 5 > IVds $. 8)D0P5]7i5v2-'" wog#^)U/L5D:;?3E)LU_jty}bKs5e V G7&~wo ha\Y%W+W/V2U5S9Q>OFNNNXNbOmQxSUXYZZZYXWVUTSTUWXY[^cipw~{vqlheddeinv|x uqlg`YQIA:40,) % $.7>C"F %G)G-E1C5@7=8;6:2<,A%GNV^fnv 0>M\l}}xsohtXeO\HSAI9>21*#"-9EOYahotx{rd|Wv%+Np;=HmQKGjfVHhy_KfgMdmNbsO`yO]PXPQQHP=N1I&B;5 /)#   |*o6c@XsGMgJD\K=SI 9LG7EC7>@98=;38=.2@+, C(&#E##'H".K $7L&BL)MK,XH.bC/j=/q7.v2.{,-&, *(#  {uplifca` `*a4b=cFdPc[`g[tUNF>4*'9Mau-CWj}  %-5}=vxDodHgQK_?LV.LLK@I4F 'A<4,!#!   z l ^QE9,$ + 3:A H)O3U>[H^S`\^d[jVnQsLwHzE}CCDGKOS{Wu[n^gb_fXjRnMqIrEqC&n@4k?Ag=Kd=Ta=[`>a_=f_;k_8na4qd1si-uo*vv%x} {~~yurqrtx yo e]#W,T2U7Y:]=b?fAiClFpIsKvMxOyOyOxNvMsMpMlNfNaN[KVGRBN<K7H1E+ D$ C B B B C C C EGI M!S"Y"aq#h`#pQ#wC"~3!#!"%(, 1 5:?DI M$O)R-T0U3W6}X8|Y:}Z<}[>~\?}]A|_CyaEvcHqfKmhOijRgjTfjWghZhf]kcanadp^hrZjsWkuRlyMk}IjEhAe?a=]<X;R9L8F6@5;47222.1(|1#v2o3h 4a5 \6V#9O+<H3?@:A:@C5FD1LE.RF+YG(`H$eJiLlPoSqWsZt^tbsgplksdy\~QF:0&  # (.4:!@!%F0+K=2OK:SX@|WeGw[rLq`~RjdXdj^]neWsmQvvKwDy=y6y1y,v&r mgb]XSMF?6."&.9CLU\ c g zhqhhf]bQ\ET9H .;$%+*18? FLRX^djipx{xww vtql%f,`3\:ZA[G]L`PeTjVrV}RK|Bv:p2j-c*\(T'M'D';'2)(+.1 5:@FL Q VY\z\q%\i-Yc4T_=M]FE\P<[[3Yf)Ur Q~NLLORUWXXWW VVU"U'S)Q*N+J*G)C'?%;#6!0 *# !!"""""#!##$$$$$#$#%#%"'!)+.}1 w3q6k8 f:a;];Y;U:Q9$K7*E51?2::/C5,L1)V-&a)$k$#u##%& ( +/4:AIR[dmu }$*059;< =>ADHLNQ|S wTrTnSjQfM bG ']> 0W3 8Q& ?KEFJCOAU?[>b<#h;&n:(r:z(t;k(w<^)y<Q*|;E*98)6+&3 /,*'%#!#&}*y-u0q1m2i2c3^3Y3V3S3P1O/O,P(Q#TVY#[ '\,[0Y4U9O?IFDM?V<_9i7u41-)$   (07 ?FNU\bfjmnoonkifdccccccdefghhhgda^Zw+Vn6Tg?Q`GNYMJSPFNQCHP@AO=:M:3M8+L4#K/K)J# JJ JJK" K,K7JCIMFTCX@Y>X=U=Q>M>J?G@DAAB>C<C9B8?6:553 /2)1#113# 5(7-82977;5>1?.?+=(:&6%1&-'')"++*($! $1= G!P'Y.`6g<mArEuIxLyPzS{V}VUSPMKJGD>7 0*%! # $%#  zto j gd ` [SI=/ $!$*"*0#14"88!?: F;L=Q@VB[E`FdFfE fC dA `?[=T<M;G:%B8,>639294-@/(F*#M%S"Y _ cgjllkifc` ^ \![#Z%['[)\,[/"Y1&W2*U2/T13T09U0=V1BV2EU2HU1IV/KY-M\*O_)Q`)R^(MT*KQ,HO-DO.@Q/;T.6Y-1^,-b)(f&%i"!kosx|    |wrmi c#])U!. L'0D,1=0.94)(87$389@::M<;[>;h?9 v@7@5?2>/<-9,6+1+++%+ * ( % ! $ ( * , .16:?CDCw? o8f1](T!%J,@279. @'G!MTZ`gnuz~  ~{"w*r3m<gE`N&ZX-Ta7Nj@IrKCzT<^3h*s   *2|9p?cE{UKqFQg8V^)ZW]P ^I_B_8 a,dhk%m+n2l8j=hBhHjNmUo^oikrb{XOIFG&K5NFQZ~SnwWn\ec\kRtI|>3& 9Qhvm+d9[EQPFZ;b/i"nqrrojbVG 5 ) 9IXfqzkL/~w pha[zVtRoOkLfKaJ\L XNUQSURXP\N^K^G\BY>T:O:J<EA@E:H4J-K'L!MNOOLG ? 6 -'#!!          " &*,./147;>A"C$C%D$D#E GIKMNQSUVWVUSR P"M%I'E+A.<2763:.?*C&G"IKLLLLMM M#M%L'K'J&H$G"ECB ?=: 6 30- * ( &$" !#% & ' '&$!  !!!!!           *>Vp&:.LG^+`p9yGUamv~u~iwr`ne[c|YYXlO\M]HbDOBk<D?x6=?2:B0<G0CO2MX6[c=lqE}P\hu}hQ9 ry`cvNNh<:[,(MA6 ,% !, 8#B'J,P0R5R9R= RARFRJQPNU IZ#C `&=f(9l)8r'7x%7~"7!6 3#/'+,(1'6(8,919698;9@9F9K7 tJ. qM- oQ-mV-lZ,ka* kh( ln( ns)qt,ss0up4vk9vf<ua?t]@!sZ?$rY>(qW=-pT;3oO:8mI8<kD4=h@->f@$>cB>`F?]JA[MDYNGWNKTMOQKRMJUIHVFHXCGY@E\>B`;;d83h5)j1 l/l,l*l(m&n$ p#q"q!r qpmid_"Z&!W+%U/)U3+V7,X9+[;*^<)`<+b<-c<0c<3b<4`<3]<1[<.W<-S<.O;1J:6E9=?8C97I26 M+5P$4R4U4'Z3-b 22k05t-7}*8&;">CHNTZ`eimo#o'n*m,l,m,o,rz-vq/zh0}`1X1P/J,C)=&7#1 ,'~$ {$w%r)l-# g1& b5) ^9+ Y<- TA/ NF2 HM4AT5<[67a44f23i.1l,0n+-q+!*t.&%y0( 4*6+8+8+ 8+ 7, 7-7.8.9-9+8(6%2"-")"&$#'")!**)' &')+--,*'$!   yrlfa]YVR NKGDB@????@@@@@?!>'<,:2866:4=4?4@6@8>;;>7?4?1=/9.5.10-3+6(:&>$B!FLRZbinp q ppqr s%s(q)n*j+e,_-Z/T1N2G2?28101)2 #357 8'7-624518/:-<,?+A*B(C&C%A $?$<'8+ 30.7)=#%D*!J1O7S;W>Z?\>]<]9[7W4Q2J1C0<06/0/+/&/ !01357876 5 421/+(%#$& (*+,-.02320,&! $&(()***))((((%* *,-0.4.8-<+@*D)H(K&L#L!JF@9"1'*,$145!4$1'-)'* !)&(+' 0&4%8$=#A"E!HK M&M+L.I/F/B-?*;'8%4!"/$!*( $,16 :> B E H"L'N+Q/R3S6R8P9M:I;E<?>9@4B/C*B&A "@??@%B,D3E9D?BD?G<I8K6M5O4Q3S3T3S"3Q&3N*3K,2I.0H-,I+)J)%K&#K#!I!G!E#C%B(B+D.F1I4K7L:K=JAJCJEMDQBU?X;Y7V1K.F+C(A$@ ?><9 5$1!*.&/**5(/9'3='7?(9@(;@(;@(;>'9='7;'48(04)-/))** %%) !!' %$ #!#"$ "& !( *- 0$3&5' 6' 5' 4& 2&0&/'.).+-+-++)('$$ !!$ &"&#%$$#*& .*2/74 <:A?HBNCSBVAW?V=T< Q;N<K>H? D?#@>&<;)67.023*-:$)@'F'L)P +T-V.Y.\._.d/h1k2o3q3t2v1x/z,| *} (~'}&{%x$$t&"o' k(g*d,b0a4_7[9W:!Q9"J7"E5 @4=2;1907/5/3./-++'(#$ !#'* %-+1 1589@=H@OCUE[F_EcDgAm=t8{2+$  %,~3w:%oA*gF.^J1UN6LQ:CT?;VC2WG+XI$WKWL VMUOTOQP#MP&IQ(ER(BT'?V&=Y$;\"9^8a7d6h7m9r;w<{=~>>}?x?q"@i(Aa.AY5AS<BLDAFM@?T=7Z9.]5%^1].Z,V,R. M/ H1C2=3,649.5E%7O:Y<a ?iApCvC|CB @?=#x<.p<8g;B`;HZ9MV7PR5QM3RG0R?-S5*S)%TTRPL+H5D=BCBFDHGHLGPDSAU=W7Y0\*`%d!ghh!e#`%[)U.P4K=FH AT :_2i(qx%/9DNXbks{"(08zAoJ`}SP{[?xb/u iqpkve$}^)V,N/G2@48505'41.)%!"'-39=ADGKOUyZl__dS hHk=m4"o,(p$.p!4o*9l3=i;AdBE^HIXLNRPULR\FTe?Um8Wv1Y})[!%[-Z4Y :V?TCPGMKHOBR:V3[,a&zg#rm"hr"]v!RyF};1(       !(0"8*A2H:OAUGZL^QaWc^oefYgnB iw- j~lmmmlkihfda^YS|Mt Em=f)6^6.WA'OL !FW!=b!4m!+x #     #&)-16:>@AA@>;84/* $   #%& & &'(y*o-f1\5R8H ;>%=3*?*.B!1G3M4T4\4e 3n 1x / , )%! %5GZsle~X LB8',1:A G J MP SV Z!\!^" ^"'\!-Y0U2Q3M4H 7D:@?<C7E2D-?)7&-%#&({+m .b0$W1*N2/D24:3924?*6E%:J"=O @RBUDXE]Ed EmDwCA?=:8 657:?EKQW#['_p*c_,fM-j=%,m03*o%A'pM"oYndkmht ex`x\vVtP"rJ&sC'u=%x6 z0{+z&w"s p  mkjj&j.i5 g; b?[BQBFB;A0@#&?)@/@5 A;AAAF@K?O>S?WAZC]E^E^&C\0@Y;<VH7ST2P^.Nf*Lk&Jn"GoDq@t;w6z1|*}#|ytn haY1QDGY<o1&  !$'y+%f.*T2.A63/;6?8 D8 G8K6N3P0$S-+V*2X&:Z"AZHZPXYUcQlLvH~C>8 3 -'" z)o8cGVVHe;t/ #   $ +3;C#K(R+Z,b.k/u2|~5v9o<h?a@[@U?O>H=A=:=2=,<&v: j8 _6 S4H2 >15/+-"+( $  #&'''(*-!/$1'1+0.-1)2&2#1!"/""$,,$&*5'((?++)G.-*O//+W/2-]-5-d*7,k(9)q&9%w'7!|)5,4.5.8|-=x+Cs)J n)Ph*Ua.YZ2]S5bL8gF9m@8r:7w56|05+5&7#9;<=;6/ '  } vnhda_\Y U P K E ? #9 (5 -1 103/5.8,<)B$IPW \ ` cgjot!y$&&%! }$y-t7m@eI[PPUFX;Y0Z$[\ \\[YVTQNLK'J4IAHMFYBd<o4y+ "   $(+/37;$?+B2}E8uF=kGB`FETDGGAG:=F.9E"4B.? (';/!745647 47697;8?7D5G2I/I,F)C&@" >>&?6@F@X?k>~<:751,& &-48;;963/+%      "#"! !#$#!  '1z ;t Fo PkYc\Fb@g?k=l=k>fA_FVNLWAb5n )y"%&%"   #,38<#@(D,H0L4Pv7Sk:U`<UU>TJ?T?@U4?W)>Z=^;c :g9l9o8r7s5s4r2o0l/h,b*\$&T."K7C<;>6=3:354/5(8"!:";#< #>"?!A !C DEEC?!;'4,-1 %59= ?BCB@ =94"0'-)+*)+'+$+!-/ 1 3 4 4 4 3 3 3 3 2 !1 %/ ',*(,#06;@BB ? ;631 135 6 66 5 44 5!6 "8'#;/"=5!?; ??=A9A4A /@!*?"'>"#>"=!; 72+ $!" $$$ ##"%!' ('%%%%&&$!   # & )-26:<==;851-*&$##$&)+./0/-* '#"%'())*, / 4 9>C G J MQUY^bfiklkifb ^Z#U-P6K=FCBH?K>N>N@LCIFEHAI;J5J/K(L"MNMLIFA<60!*&#,4;AF H I HFB>; 867:> CH KNOONK F A< 8421122 21.)$$)-147:;;85!0%,&)%'#(),/ 368:;<====<;97555542.(" %),./0/-+'" !%(*,,)% '5A M W `flpqqniaWM C;!4*13091?4B7D:E<D=C>A?@@>C;F8J5N1S-W)Z%_djo twwtpkfdccbb`]\[\]_aabbcegikkkkjhea]YVVVW X X X Y \ `flpsttk?:=@DFGHIJKLLLKIGDA=;:<?EKPSUUUUVWXWURLF?81*"   %*-/0'0109/?0D0J1Q1Z1e|Mk]ocshvlzopmjkHEJHLKOJRJUITISHSJRLGA G/A:CNCPTe Gt GTCAGCA G G A T TG-A8!TH$GV$Ga%Tm(Tx(T(TATAG T G C T G G. A8TE TUCiCsCTGCTGAAA T T C T! C4 T9 CK TY T^ Cp TGCCG CATG&T&GA$A$G(A5A@GN G^ Ch CxTTG C T TCCCT TCC A0CAANT[!Gh'At'T$T$G$T$AAGATNTCCT!AA&G3G; CF CUT\CfCrCAGCTGCGT(GGA A C T+G8(TE1GR#A^"Gj!Ts!C!A"A&T&TAAA C CTCT TT#C.C<TI&TW&Td$Ao$T{$A"A"ATT ACC CAGT C T C ,"A 7"G D!G Q$T ]$A hT tT T C C T T A "T "C G T !G $G $T $A *,T 6,G C1A O G ZA gA oC }G G &A -T -T 1A "A "T "A "C "A "G &T &T &&G 1&T >&G K&T V"A b"A n"G w"C "C "A "G "C "T "C "C "T &T -A -T 1A 1A !1T ,-A 8-A D%A P%T Z%C g%T r%C ~!T !C !T "C !C !C $T $C $T $C "T "C &T G &C 2C ? T J"C V"T a"C o$A z$T &C &T &A ,T ,G ,T ,A ,T ,G ,T,A ,T,G%-T1,A<,TH,CS&T`"Gm!Tx!C!A"T"C$T$A"T"CTCCT'A&T &A-$A8$GD$TQ&T]$Gi$Tu$T$T$C$T$T(T$T!G!A!G$A$A$C$T"C("T5"GA"AM"CY TdAqA| C"A!T"A$G$A!C!A!T$T$A(A (A1T#1A.-A;-AG%CQ%A^%Ai-Tv-T-T,G,T-A-T-A%C%T%G%A%A-T-A1A*1T71TB1AN1TZ1Af-Tq-A}&A&C&T&A&C%T%G%C%T%T-G&G&G-G)%G4%TA%GK%TW%Ge%Go%T{%T-G%T%G%T%T(G-T1G1T1G#G #T#G"#A0#G<#GH-GT1Ga-Gl#Ty!GTAGAA!A$T$G"TCTAGG)G6G@TMTYGbApT{CTAGCCTAACACC&TT+C7C?AOGXAfTtG|ACCCTAGGT"T!CT GG$C0C;TG"TTT`Cj CuCCAAAGAGTCC!T!G!G!T(!C2!TT>T>1T>BA>LC>V G>eG>s G>~ G>G>T>C>G>C>A>T>G>G? A?G?(T?9A?DC?RA?XA?gG?{G?G?G?G?C?A?G?G?A?N?N@ A@G@(A@,T@2T@MT@UG@^C@sG@|C@G@A@C@A@T@G@G@T@TA TA TA#TA; TADTATTA]AAtAA}AATATAGACAGAGAGAAA GBAB TB"GB4GB:TBHTBZGBnGBqCBTBGB TBCBCBCBGBABTC GCAC#GC3 ACB TCN TC]AChGCuACACCCCCTCGC CCTCTCTCTD GDTD' TD1TD?TDJADTGDdTDmTDvTDCDGDGDTDTD CDGDGDTE CEAEGE,TE:TEACEHGEeGEjAE|CETETE TEGEGEAETETEGFGF TF!TF0 TF? TFK GFZTFfTFxGF}GFGFTF AFTFTFTFAFAFGG AG AG&GG0 GG<GGI TGX GGcTGtTGTG GG TG GGGGGGAG TGGHTHTH" TH-TH6THF THU TH\THrNHNHGHGHTSIGN=A=608,C=768,G=598,T=586 SPAC= 7.67 PRIM=984 MACH= DYEP= NAME= LANE= 0 GELN= PROC=plan version=0.970729.a RTRK= CONV=phred version=0.961028.i COMM= SRCE=Bio-SCF-1.03/Makefile.PL0000644000175000017500000000065611242270754014122 0ustar lsteinlsteinuse ExtUtils::MakeMaker; # See lib/ExtUtils/MakeMaker.pm for details of how to influence # the contents of the Makefile that is written. WriteMakefile( 'NAME' => 'Bio::SCF', 'VERSION_FROM' => 'SCF.pm', # finds $VERSION 'LICENSE' => 'perl', 'LIBS' => ['-lstaden-read -lz'], # e.g., '-lm' 'DEFINE' => '-DLITTLE_ENDIAN', # e.g., '-DHAVE_SOMETHING' 'INC' => '', # e.g., '-I/usr/include/other' ); Bio-SCF-1.03/META.yml0000664000175000017500000000051711321650645013416 0ustar lsteinlstein--- #YAML:1.0 name: Bio-SCF version: 1.03 abstract: ~ license: perl author: ~ generated_by: ExtUtils::MakeMaker version 6.42 distribution_type: module requires: meta-spec: url: http://module-build.sourceforge.net/META-spec-v1.3.html version: 1.3 Bio-SCF-1.03/INSTALL0000644000175000017500000000062611321650625013173 0ustar lsteinlsteinIn order to install this perl extension you have to install io-lib version 1.12 or higher from the Staden library (staden.sourceforge.net). To confirm that the package installed correctly look for a library named "libstaden-read". You will also need the zlib library which can be found at http://www.zlib.net/. To install this extension: perl Makefile.PL make make test make install Dmitri Priimak Bio-SCF-1.03/MANIFEST0000644000175000017500000000040711321650645013272 0ustar lsteinlsteinChanges INSTALL MANIFEST Makefile.PL DISCLAIMER README SCF.pm SCF.xs SCF/Arrays.pm eg/read_test_obj.pl eg/read_test_tied.pl eg/write_test_obj.pl eg/write_test_tied.pl t/scf.t test.scf META.yml Module meta-data (added by MakeMaker)