ack-2.12/0000755000076400007640000000000012247354203010656 5ustar andyandyack-2.12/test-pager0000755000076400007640000000032212215743470012657 0ustar andyandy#!/usr/bin/env perl use strict; use warnings; use Getopt::Long; my $skip; GetOptions( 'skip=i' => \$skip, ); while (<>) { if ( defined $skip && $. % $skip == 0 ) { next; } print; } ack-2.12/ack0000644000076400007640000020255612247353646011363 0ustar andyandy#!/usr/bin/perl use strict; use warnings; our $VERSION = '2.12'; # Check http://beyondgrep.com/ for updates use 5.008008; use Getopt::Long 2.35 (); use Carp 1.04 (); use App::Ack (); use App::Ack::ConfigLoader (); use App::Ack::Resources; use App::Ack::Resource::Basic (); # XXX Don't make this so brute force # See also: https://github.com/petdance/ack2/issues/89 use App::Ack::Filter (); use App::Ack::Filter::Default; use App::Ack::Filter::Extension; use App::Ack::Filter::FirstLineMatch; use App::Ack::Filter::Inverse; use App::Ack::Filter::Is; use App::Ack::Filter::Match; use App::Ack::Filter::Collection; # These are all our globals. MAIN: { $App::Ack::orig_program_name = $0; $0 = join(' ', 'ack', $0); if ( $App::Ack::VERSION ne $main::VERSION ) { App::Ack::die( "Program/library version mismatch\n\t$0 is $main::VERSION\n\t$INC{'App/Ack.pm'} is $App::Ack::VERSION" ); } # Do preliminary arg checking; my $env_is_usable = 1; for my $arg ( @ARGV ) { last if ( $arg eq '--' ); # Get the --thpppt, --bar, --cathy checking out of the way. $arg =~ /^--th[pt]+t+$/ and App::Ack::_thpppt($arg); $arg eq '--bar' and App::Ack::_bar(); $arg eq '--cathy' and App::Ack::_cathy(); # See if we want to ignore the environment. (Don't tell Al Gore.) $arg eq '--env' and $env_is_usable = 1; $arg eq '--noenv' and $env_is_usable = 0; } if ( !$env_is_usable ) { my @keys = ( 'ACKRC', grep { /^ACK_/ } keys %ENV ); delete @ENV{@keys}; } load_colors(); Getopt::Long::Configure('default', 'no_auto_help', 'no_auto_version'); Getopt::Long::Configure('pass_through', 'no_auto_abbrev'); Getopt::Long::GetOptions( 'help' => sub { App::Ack::show_help(); exit; }, 'version' => sub { App::Ack::print_version_statement(); exit; }, 'man' => sub { App::Ack::show_man(); exit; }, ); Getopt::Long::Configure('default', 'no_auto_help', 'no_auto_version'); if ( !@ARGV ) { App::Ack::show_help(); exit 1; } main(); } sub _compile_descend_filter { my ( $opt ) = @_; my $idirs = $opt->{idirs}; my $dont_ignore_dirs = $opt->{no_ignore_dirs}; # if we have one or more --noignore-dir directives, we can't ignore # entire subdirectory hierarchies, so we return an "accept all" # filter and scrutinize the files more in _compile_file_filter return if $dont_ignore_dirs; return unless $idirs && @{$idirs}; my %ignore_dirs; foreach my $idir (@{$idirs}) { if ( $idir =~ /^(\w+):(.*)/ ) { if ( $1 eq 'is') { $ignore_dirs{$2} = 1; } else { Carp::croak( 'Non-is filters are not yet supported for --ignore-dir' ); } } else { Carp::croak( qq{Invalid filter specification "$idir"} ); } } return sub { return !exists $ignore_dirs{$_} && !exists $ignore_dirs{$File::Next::dir}; }; } sub _compile_file_filter { my ( $opt, $start ) = @_; my $ifiles = $opt->{ifiles}; $ifiles ||= []; my $ifiles_filters = App::Ack::Filter::Collection->new(); foreach my $filter_spec (@{$ifiles}) { if ( $filter_spec =~ /^(\w+):(.+)/ ) { my ($how,$what) = ($1,$2); my $filter = App::Ack::Filter->create_filter($how, split(/,/, $what)); $ifiles_filters->add($filter); } else { Carp::croak( qq{Invalid filter specification "$filter_spec"} ); } } my $filters = $opt->{'filters'} || []; my $direct_filters = App::Ack::Filter::Collection->new(); my $inverse_filters = App::Ack::Filter::Collection->new(); foreach my $filter (@{$filters}) { if ($filter->is_inverted()) { # We want to check if files match the uninverted filters $inverse_filters->add($filter->invert()); } else { $direct_filters->add($filter); } } my %is_member_of_starting_set = map { (get_file_id($_) => 1) } @{$start}; my $ignore_dir_list = $opt->{idirs}; my $dont_ignore_dir_list = $opt->{no_ignore_dirs}; my %ignore_dir_set; my %dont_ignore_dir_set; foreach my $filter (@{ $ignore_dir_list }) { if ( $filter =~ /^(\w+):(.*)/ ) { if ( $1 eq 'is' ) { $ignore_dir_set{ $2 } = 1; } else { Carp::croak( 'Non-is filters are not yet supported for --ignore-dir' ); } } else { Carp::croak( qq{Invalid filter specification "$filter"} ); } } foreach my $filter (@{ $dont_ignore_dir_list }) { if ( $filter =~ /^(\w+):(.*)/ ) { if ( $1 eq 'is' ) { $dont_ignore_dir_set{ $2 } = 1; } else { Carp::croak( 'Non-is filters are not yet supported for --ignore-dir' ); } } else { Carp::croak( qq{Invalid filter specification "$filter"} ); } } return sub { # ack always selects files that are specified on the command # line, regardless of filetype. If you want to ack a JPEG, # and say "ack foo whatever.jpg" it will do it for you. return 1 if $is_member_of_starting_set{ get_file_id($File::Next::name) }; if ( $dont_ignore_dir_list ) { my ( undef, $dirname ) = File::Spec->splitpath($File::Next::name); my @dirs = File::Spec->splitdir($dirname); my $is_ignoring = 0; foreach my $dir ( @dirs ) { if ( $ignore_dir_set{ $dir } ) { $is_ignoring = 1; } elsif ( $dont_ignore_dir_set{ $dir } ) { $is_ignoring = 0; } } if ( $is_ignoring ) { return 0; } } # Ignore named pipes found in directory searching. Named # pipes created by subprocesses get specified on the command # line, so the rule of "always select whatever is on the # command line" wins. return 0 if -p $File::Next::name; # we can't handle unreadable filenames; report them unless ( -r _ ) { if ( $App::Ack::report_bad_filenames ) { App::Ack::warn( "${File::Next::name}: cannot open file for reading" ); } return 0; } my $resource = App::Ack::Resource::Basic->new($File::Next::name); return 0 if ! $resource; if ( $ifiles_filters->filter($resource) ) { return 0; } my $match_found = $direct_filters->filter($resource); # Don't bother invoking inverse filters unless we consider the current resource a match if ( $match_found && $inverse_filters->filter( $resource ) ) { $match_found = 0; } return $match_found; }; } sub show_types { my $resource = shift; my $ors = shift; my @types = filetypes( $resource ); my $types = join( ',', @types ); my $arrow = @types ? ' => ' : ' =>'; App::Ack::print( $resource->name, $arrow, join( ',', @types ), $ors ); return; } # Set default colors, load Term::ANSIColor sub load_colors { eval 'use Term::ANSIColor 1.10 ()'; eval 'use Win32::Console::ANSI' if $App::Ack::is_windows; $ENV{ACK_COLOR_MATCH} ||= 'black on_yellow'; $ENV{ACK_COLOR_FILENAME} ||= 'bold green'; $ENV{ACK_COLOR_LINENO} ||= 'bold yellow'; return; } sub filetypes { my ( $resource ) = @_; my @matches; foreach my $k (keys %App::Ack::mappings) { my $filters = $App::Ack::mappings{$k}; foreach my $filter (@{$filters}) { # clone the resource my $clone = $resource->clone; if ( $filter->filter($clone) ) { push @matches, $k; last; } } } # http://search.cpan.org/dist/Perl-Critic/lib/Perl/Critic/Policy/Subroutines/ProhibitReturnSort.pm @matches = sort @matches; return @matches; } # Returns a (fairly) unique identifier for a file. # Use this function to compare two files to see if they're # equal (ie. the same file, but with a different path/links/etc). sub get_file_id { my ( $filename ) = @_; if ( $App::Ack::is_windows ) { return File::Next::reslash( $filename ); } else { # XXX is this the best method? it always hits the FS if( my ( $dev, $inode ) = (stat($filename))[0, 1] ) { return join(':', $dev, $inode); } else { # XXX this could be better return $filename; } } } # Returns a regex object based on a string and command-line options. # Dies when the regex $str is undefined (i.e. not given on command line). sub build_regex { my $str = shift; my $opt = shift; defined $str or App::Ack::die( 'No regular expression found.' ); $str = quotemeta( $str ) if $opt->{Q}; if ( $opt->{w} ) { $str = "\\b$str" if $str =~ /^\w/; $str = "$str\\b" if $str =~ /\w$/; } my $regex_is_lc = $str eq lc $str; if ( $opt->{i} || ($opt->{smart_case} && $regex_is_lc) ) { $str = "(?i)$str"; } my $re = eval { qr/$str/ }; if ( !$re ) { die "Invalid regex '$str':\n $@"; } return $re; } { my @before_ctx_lines; my @after_ctx_lines; my $is_iterating; my $has_printed_something; BEGIN { $has_printed_something = 0; } sub print_matches_in_resource { my ( $resource, $opt ) = @_; my $passthru = $opt->{passthru}; my $max_count = $opt->{m} || -1; my $nmatches = 0; my $filename = $resource->name; my $break = $opt->{break}; my $heading = $opt->{heading}; my $ors = $opt->{print0} ? "\0" : "\n"; my $color = $opt->{color}; my $print_filename = $opt->{show_filename}; my $has_printed_for_this_resource = 0; $is_iterating = 1; local $opt->{before_context} = $opt->{output} ? 0 : $opt->{before_context}; local $opt->{after_context} = $opt->{output} ? 0 : $opt->{after_context}; my $n_before_ctx_lines = $opt->{before_context} || 0; my $n_after_ctx_lines = $opt->{after_context} || 0; @after_ctx_lines = @before_ctx_lines = (); my $fh = $resource->open(); if ( !$fh ) { if ( $App::Ack::report_bad_filenames ) { App::Ack::warn( "$filename: $!" ); } return 0; } my $display_filename = $filename; if ( $print_filename && $heading && $color ) { $display_filename = Term::ANSIColor::colored($display_filename, $ENV{ACK_COLOR_FILENAME}); } # check for context before the main loop, so we don't # pay for it if we don't need it if ( $n_before_ctx_lines || $n_after_ctx_lines ) { my $current_line = <$fh>; # prime the first line of input while ( defined $current_line ) { while ( (@after_ctx_lines < $n_after_ctx_lines) && defined($_ = <$fh>) ) { push @after_ctx_lines, $_; } local $_ = $current_line; my $former_dot_period = $.; $. -= @after_ctx_lines; if ( does_match($opt, $_) ) { if ( !$has_printed_for_this_resource ) { if ( $break && $has_printed_something ) { App::Ack::print_blank_line(); } if ( $print_filename && $heading ) { App::Ack::print_filename( $display_filename, $ors ); } } print_line_with_context($opt, $filename, $_, $.); $has_printed_for_this_resource = 1; $nmatches++; $max_count--; } elsif ( $passthru ) { chomp; # XXX proper newline handling? # XXX inline this call? if ( $break && !$has_printed_for_this_resource && $has_printed_something ) { App::Ack::print_blank_line(); } print_line_with_options($opt, $filename, $_, $., ':'); $has_printed_for_this_resource = 1; } last unless $max_count != 0; # I tried doing this with local(), but for some reason, # $. continued to have its new value after the exit of the # enclosing block. I'm guessing that $. has some extra # magic associated with it or something. If someone can # tell me why this happened, I would love to know! $. = $former_dot_period; # XXX this won't happen on an exception if ( $n_before_ctx_lines ) { push @before_ctx_lines, $current_line; shift @before_ctx_lines while @before_ctx_lines > $n_before_ctx_lines; } if ( $n_after_ctx_lines ) { $current_line = shift @after_ctx_lines; } else { $current_line = <$fh>; } } } else { local $_; while ( <$fh> ) { if ( does_match($opt, $_) ) { if ( !$has_printed_for_this_resource ) { if ( $break && $has_printed_something ) { App::Ack::print_blank_line(); } if ( $print_filename && $heading ) { App::Ack::print_filename( $display_filename, $ors ); } } print_line_with_context($opt, $filename, $_, $.); $has_printed_for_this_resource = 1; $nmatches++; $max_count--; } elsif ( $passthru ) { chomp; # XXX proper newline handling? if ( $break && !$has_printed_for_this_resource && $has_printed_something ) { App::Ack::print_blank_line(); } print_line_with_options($opt, $filename, $_, $., ':'); $has_printed_for_this_resource = 1; } last unless $max_count != 0; } } $is_iterating = 0; # XXX this won't happen on an exception # then again, do we care? ack doesn't really # handle exceptions anyway. return $nmatches; } sub print_line_with_options { my ( $opt, $filename, $line, $line_no, $separator ) = @_; $has_printed_something = 1; my $print_filename = $opt->{show_filename}; my $print_column = $opt->{column}; my $ors = $opt->{print0} ? "\0" : "\n"; my $heading = $opt->{heading}; my $output_expr = $opt->{output}; my $color = $opt->{color}; my @line_parts; if( $color ) { $filename = Term::ANSIColor::colored($filename, $ENV{ACK_COLOR_FILENAME}); $line_no = Term::ANSIColor::colored($line_no, $ENV{ACK_COLOR_LINENO}); } if($print_filename) { if( $heading ) { push @line_parts, $line_no; } else { push @line_parts, $filename, $line_no; } if( $print_column ) { push @line_parts, get_match_column(); } } if( $output_expr ) { while ( $line =~ /$opt->{regex}/og ) { my $output = eval $output_expr; App::Ack::print( join( $separator, @line_parts, $output ), $ors ); } } else { if ( $color ) { $line =~ /$opt->{regex}/o; # this match is redundant, but we need # to perfom it in order to get if # capture groups are set if ( @+ > 1 ) { # if we have captures while ( $line =~ /$opt->{regex}/og ) { my $offset = 0; # additional offset for when we add stuff my $previous_match_end = 0; for ( my $i = 1; $i < @+; $i++ ) { my ( $match_start, $match_end ) = ( $-[$i], $+[$i] ); next unless defined($match_start); next if $match_start < $previous_match_end; my $substring = substr( $line, $offset + $match_start, $match_end - $match_start ); my $substitution = Term::ANSIColor::colored( $substring, $ENV{ACK_COLOR_MATCH} ); substr( $line, $offset + $match_start, $match_end - $match_start, $substitution ); $previous_match_end = $match_end; # offsets do not need to be applied $offset += length( $substitution ) - length( $substring ); } pos($line) = $+[0] + $offset; } } else { my $matched = 0; # flag; if matched, need to escape afterwards while ( $line =~ /$opt->{regex}/og ) { $matched = 1; my ( $match_start, $match_end ) = ($-[0], $+[0]); next unless defined($match_start); my $substring = substr( $line, $match_start, $match_end - $match_start ); my $substitution = Term::ANSIColor::colored( $substring, $ENV{ACK_COLOR_MATCH} ); substr( $line, $match_start, $match_end - $match_start, $substitution ); pos($line) = $match_end + (length( $substitution ) - length( $substring )); } # XXX why do we do this? $line .= "\033[0m\033[K" if $matched; } } push @line_parts, $line; App::Ack::print( join( $separator, @line_parts ), $ors ); } return; } sub iterate { my ( $resource, $opt, $cb ) = @_; $is_iterating = 1; local $opt->{before_context} = $opt->{output} ? 0 : $opt->{before_context}; local $opt->{after_context} = $opt->{output} ? 0 : $opt->{after_context}; my $n_before_ctx_lines = $opt->{before_context} || 0; my $n_after_ctx_lines = $opt->{after_context} || 0; @after_ctx_lines = @before_ctx_lines = (); my $fh = $resource->open(); if ( !$fh ) { if ( $App::Ack::report_bad_filenames ) { # XXX direct access to filename App::Ack::warn( "$resource->{filename}: $!" ); } return; } # check for context before the main loop, so we don't # pay for it if we don't need it if ( $n_before_ctx_lines || $n_after_ctx_lines ) { my $current_line = <$fh>; # prime the first line of input while ( defined $current_line ) { while ( (@after_ctx_lines < $n_after_ctx_lines) && defined($_ = <$fh>) ) { push @after_ctx_lines, $_; } local $_ = $current_line; my $former_dot_period = $.; $. -= @after_ctx_lines; last unless $cb->(); # I tried doing this with local(), but for some reason, # $. continued to have its new value after the exit of the # enclosing block. I'm guessing that $. has some extra # magic associated with it or something. If someone can # tell me why this happened, I would love to know! $. = $former_dot_period; # XXX this won't happen on an exception if ( $n_before_ctx_lines ) { push @before_ctx_lines, $current_line; shift @before_ctx_lines while @before_ctx_lines > $n_before_ctx_lines; } if ( $n_after_ctx_lines ) { $current_line = shift @after_ctx_lines; } else { $current_line = <$fh>; } } } else { local $_; while ( <$fh> ) { last unless $cb->(); } } $is_iterating = 0; # XXX this won't happen on an exception # then again, do we care? ack doesn't really # handle exceptions anyway. return; } sub get_context { if ( not $is_iterating ) { Carp::croak( 'get_context() called outside of iterate()' ); } return ( scalar(@before_ctx_lines) ? \@before_ctx_lines : undef, scalar(@after_ctx_lines) ? \@after_ctx_lines : undef, ); } } { my $is_first_match; my $previous_file_processed; my $previous_line_printed; BEGIN { $is_first_match = 1; $previous_line_printed = -1; } sub print_line_with_context { my ( $opt, $filename, $matching_line, $line_no ) = @_; my $heading = $opt->{heading}; if( !defined($previous_file_processed) || $previous_file_processed ne $filename ) { $previous_file_processed = $filename; $previous_line_printed = -1; if( $heading ) { $is_first_match = 1; } } my $ors = $opt->{print0} ? "\0" : "\n"; my $match_word = $opt->{w}; my $is_tracking_context = $opt->{after_context} || $opt->{before_context}; my $output_expr = $opt->{output}; $matching_line =~ s/[\r\n]+$//g; my ( $before_context, $after_context ) = get_context(); if ( $before_context ) { my $first_line = $. - @{$before_context}; if ( $first_line <= $previous_line_printed ) { splice @{$before_context}, 0, $previous_line_printed - $first_line + 1; $first_line = $. - @{$before_context}; } if ( @{$before_context} ) { my $offset = @{$before_context}; if( !$is_first_match && $previous_line_printed != $first_line - 1 ) { App::Ack::print('--', $ors); } foreach my $line (@{$before_context}) { my $context_line_no = $. - $offset; if ( $context_line_no <= $previous_line_printed ) { next; } chomp $line; local $opt->{column}; print_line_with_options($opt, $filename, $line, $context_line_no, '-'); $previous_line_printed = $context_line_no; $offset--; } } } if ( $. > $previous_line_printed ) { if( $is_tracking_context && !$is_first_match && $previous_line_printed != $. - 1 ) { App::Ack::print('--', $ors); } print_line_with_options($opt, $filename, $matching_line, $line_no, ':'); $previous_line_printed = $.; } if($after_context) { my $offset = 1; foreach my $line (@{$after_context}) { # XXX improve this! if ( $previous_line_printed >= $. + $offset ) { $offset++; next; } chomp $line; if ( $opt->{regex} && does_match( $opt, $line ) ) { print_line_with_options($opt, $filename, $line, $. + $offset, ':'); } else { local $opt->{column}; print_line_with_options($opt, $filename, $line, $. + $offset, '-'); } $previous_line_printed = $. + $offset; $offset++; } } $is_first_match = 0; return; } } { my $match_column_number; # does_match() MUST have an $opt->{regex} set. sub does_match { my ( $opt, $line ) = @_; $match_column_number = undef; if ( $opt->{v} ) { return ( $line !~ /$opt->{regex}/o ); } else { if ( $line =~ /$opt->{regex}/o ) { # @- = @LAST_MATCH_START # @+ = @LAST_MATCH_END $match_column_number = $-[0] + 1; return 1; } else { return; } } } sub get_match_column { return $match_column_number; } } sub resource_has_match { my ( $resource, $opt ) = @_; my $has_match = 0; my $fh = $resource->open(); if ( !$fh ) { if ( $App::Ack::report_bad_filenames ) { # XXX direct access to filename App::Ack::warn( "$resource->{filename}: $!" ); } } else { my $opt_v = $opt->{v}; my $re = $opt->{regex}; while ( <$fh> ) { if (/$re/o xor $opt_v) { $has_match = 1; last; } } close $fh; } return $has_match; } sub count_matches_in_resource { my ( $resource, $opt ) = @_; my $nmatches = 0; my $fh = $resource->open(); if ( !$fh ) { if ( $App::Ack::report_bad_filenames ) { # XXX direct access to filename App::Ack::warn( "$resource->{filename}: $!" ); } } else { my $opt_v = $opt->{v}; my $re = $opt->{regex}; while ( <$fh> ) { ++$nmatches if (/$re/o xor $opt_v); } close $fh; } return $nmatches; } sub main { my @arg_sources = App::Ack::ConfigLoader::retrieve_arg_sources(); my $opt = App::Ack::ConfigLoader::process_args( @arg_sources ); $App::Ack::report_bad_filenames = !$opt->{dont_report_bad_filenames}; if ( $opt->{flush} ) { $| = 1; } if ( !defined($opt->{color}) && !$opt->{g} ) { my $windows_color = 1; if ( $App::Ack::is_windows ) { $windows_color = eval { require Win32::Console::ANSI; } } $opt->{color} = !App::Ack::output_to_pipe() && $windows_color; } if ( not defined $opt->{heading} and not defined $opt->{break} ) { $opt->{heading} = $opt->{break} = !App::Ack::output_to_pipe(); } if ( defined($opt->{H}) || defined($opt->{h}) ) { $opt->{show_filename}= $opt->{H} && !$opt->{h}; } if ( my $output = $opt->{output} ) { $output =~ s{\\}{\\\\}g; $output =~ s{"}{\\"}g; $opt->{output} = qq{"$output"}; } my $resources; if ( $App::Ack::is_filter_mode && !$opt->{files_from} ) { # probably -x $resources = App::Ack::Resources->from_stdin( $opt ); my $regex = $opt->{regex}; $regex = shift @ARGV if not defined $regex; $opt->{regex} = build_regex( $regex, $opt ); } else { if ( $opt->{f} || $opt->{lines} ) { if ( $opt->{regex} ) { App::Ack::warn( "regex ($opt->{regex}) specified with -f or --lines" ); App::Ack::exit_from_ack( 0 ); # XXX the 0 is misleading } } else { my $regex = $opt->{regex}; $regex = shift @ARGV if not defined $regex; $opt->{regex} = build_regex( $regex, $opt ); } my @start; if ( not defined $opt->{files_from} ) { @start = @ARGV; } if ( !exists($opt->{show_filename}) ) { unless(@start == 1 && !(-d $start[0])) { $opt->{show_filename} = 1; } } if ( defined $opt->{files_from} ) { $resources = App::Ack::Resources->from_file( $opt, $opt->{files_from} ); exit 1 unless $resources; } else { @start = ('.') unless @start; foreach my $target (@start) { if ( !-e $target && $App::Ack::report_bad_filenames) { App::Ack::warn( "$target: No such file or directory" ); } } $opt->{file_filter} = _compile_file_filter($opt, \@start); $opt->{descend_filter} = _compile_descend_filter($opt); $resources = App::Ack::Resources->from_argv( $opt, \@start ); } } App::Ack::set_up_pager( $opt->{pager} ) if defined $opt->{pager}; my $print_filenames = $opt->{show_filename}; my $max_count = $opt->{m}; my $ors = $opt->{print0} ? "\0" : "\n"; my $only_first = $opt->{1}; my $nmatches = 0; my $total_count = 0; RESOURCES: while ( my $resource = $resources->next ) { # XXX this variable name combined with what we're trying # to do makes no sense. # XXX Combine the -f and -g functions if ( $opt->{f} ) { # XXX printing should probably happen inside of App::Ack if ( $opt->{show_types} ) { show_types( $resource, $ors ); } else { App::Ack::print( $resource->name, $ors ); } ++$nmatches; last RESOURCES if defined($max_count) && $nmatches >= $max_count; } elsif ( $opt->{g} ) { my $is_match = ( $resource->name =~ /$opt->{regex}/o ); if ( $opt->{v} ? !$is_match : $is_match ) { if ( $opt->{show_types} ) { show_types( $resource, $ors ); } else { local $opt->{show_filename} = 0; print_line_with_options($opt, '', $resource->name, 0, $ors); } ++$nmatches; last RESOURCES if defined($max_count) && $nmatches >= $max_count; } } elsif ( $opt->{lines} ) { my $print_filename = $opt->{show_filename}; my $passthru = $opt->{passthru}; my %line_numbers; foreach my $line ( @{ $opt->{lines} } ) { my @lines = split /,/, $line; @lines = map { /^(\d+)-(\d+)$/ ? ( $1 .. $2 ) : $_ } @lines; @line_numbers{@lines} = (1) x @lines; } my $filename = $resource->name; local $opt->{color} = 0; iterate($resource, $opt, sub { chomp; if ( $line_numbers{$.} ) { print_line_with_context($opt, $filename, $_, $.); } elsif ( $passthru ) { print_line_with_options($opt, $filename, $_, $., ':'); } return 1; }); } elsif ( $opt->{count} ) { my $matches_for_this_file = count_matches_in_resource( $resource, $opt ); unless ( $opt->{show_filename} ) { $total_count += $matches_for_this_file; next RESOURCES; } if ( !$opt->{l} || $matches_for_this_file > 0) { if ( $print_filenames ) { App::Ack::print( $resource->name, ':', $matches_for_this_file, $ors ); } else { App::Ack::print( $matches_for_this_file, $ors ); } } } elsif ( $opt->{l} || $opt->{L} ) { my $is_match = resource_has_match( $resource, $opt ); if ( $opt->{L} ? !$is_match : $is_match ) { App::Ack::print( $resource->name, $ors ); ++$nmatches; last RESOURCES if $only_first; last RESOURCES if defined($max_count) && $nmatches >= $max_count; } } else { $nmatches += print_matches_in_resource( $resource, $opt ); if ( $nmatches && $only_first ) { last RESOURCES; } } } if ( $opt->{count} && !$opt->{show_filename} ) { App::Ack::print( $total_count, "\n" ); } close $App::Ack::fh; App::Ack::exit_from_ack( $nmatches ); } =head1 NAME ack - grep-like text finder =head1 SYNOPSIS ack [options] PATTERN [FILE...] ack -f [options] [DIRECTORY...] =head1 DESCRIPTION Ack is designed as a replacement for 99% of the uses of F. Ack searches the named input FILEs (or standard input if no files are named, or the file name - is given) for lines containing a match to the given PATTERN. By default, ack prints the matching lines. PATTERN is a Perl regular expression. Perl regular expressions are commonly found in other programming languages, but for the particulars of their behavior, please consult L. If you don't know how to use regular expression but are interested in learning, you may consult L. If you do not need or want ack to use regular expressions, please see the C<-Q>/C<--literal> option. Ack can also list files that would be searched, without actually searching them, to let you take advantage of ack's file-type filtering capabilities. =head1 FILE SELECTION If files are not specified for searching, either on the command line or piped in with the C<-x> option, I delves into subdirectories selecting files for searching. I is intelligent about the files it searches. It knows about certain file types, based on both the extension on the file and, in some cases, the contents of the file. These selections can be made with the B<--type> option. With no file selection, I searches through regular files that are not explicitly excluded by B<--ignore-dir> and B<--ignore-file> options, either present in F files or on the command line. The default options for I ignore certain files and directories. These include: =over 4 =item * Backup files: Files matching F<#*#> or ending with F<~>. =item * Coredumps: Files matching F =item * Version control directories like F<.svn> and F<.git>. =back Run I with the C<--dump> option to see what settings are set. However, I always searches the files given on the command line, no matter what type. If you tell I to search in a coredump, it will search in a coredump. =head1 DIRECTORY SELECTION I descends through the directory tree of the starting directories specified. If no directories are specified, the current working directory is used. However, it will ignore the shadow directories used by many version control systems, and the build directories used by the Perl MakeMaker system. You may add or remove a directory from this list with the B<--[no]ignore-dir> option. The option may be repeated to add/remove multiple directories from the ignore list. For a complete list of directories that do not get searched, run C. =head1 WHEN TO USE GREP I trumps I as an everyday tool 99% of the time, but don't throw I away, because there are times you'll still need it. E.g., searching through huge files looking for regexes that can be expressed with I syntax should be quicker with I. If your script or parent program uses I C<--quiet> or C<--silent> or needs exit 2 on IO error, use I. =head1 OPTIONS =over 4 =item B<--ackrc> Specifies an ackrc file to load after all others; see L. =item B<-A I>, B<--after-context=I> Print I lines of trailing context after matching lines. =item B<-B I>, B<--before-context=I> Print I lines of leading context before matching lines. =item B<--[no]break> Print a break between results from different files. On by default when used interactively. =item B<-C [I]>, B<--context[=I]> Print I lines (default 2) of context around matching lines. =item B<-c>, B<--count> Suppress normal output; instead print a count of matching lines for each input file. If B<-l> is in effect, it will only show the number of lines for each file that has lines matching. Without B<-l>, some line counts may be zeroes. If combined with B<-h> (B<--no-filename>) ack outputs only one total count. =item B<--[no]color>, B<--[no]colour> B<--color> highlights the matching text. B<--nocolor> suppresses the color. This is on by default unless the output is redirected. On Windows, this option is off by default unless the L module is installed or the C environment variable is used. =item B<--color-filename=I> Sets the color to be used for filenames. =item B<--color-match=I> Sets the color to be used for matches. =item B<--color-lineno=I> Sets the color to be used for line numbers. =item B<--[no]column> Show the column number of the first match. This is helpful for editors that can place your cursor at a given position. =item B<--create-ackrc> Dumps the default ack options to standard output. This is useful for when you want to customize the defaults. =item B<--dump> Writes the list of options loaded and where they came from to standard output. Handy for debugging. =item B<--[no]env> B<--noenv> disables all environment processing. No F<.ackrc> is read and all environment variables are ignored. By default, F considers F<.ackrc> and settings in the environment. =item B<--flush> B<--flush> flushes output immediately. This is off by default unless ack is running interactively (when output goes to a pipe or file). =item B<-f> Only print the files that would be searched, without actually doing any searching. PATTERN must not be specified, or it will be taken as a path to search. =item B<--files-from=I> The list of files to be searched is specified in I. The list of files are separated by newlines. If I is C<->, the list is loaded from standard input. =item B<--[no]filter> Forces ack to act as if it were receiving input via a pipe. =item B<--[no]follow> Follow or don't follow symlinks, other than whatever starting files or directories were specified on the command line. This is off by default. =item B<-g I> Print files where the relative path + filename matches I. This option can be combined with B<--color> to make it easier to spot the match. =item B<--[no]group> B<--group> groups matches by file name. This is the default when used interactively. B<--nogroup> prints one result per line, like grep. This is the default when output is redirected. =item B<-H>, B<--with-filename> Print the filename for each match. This is the default unless searching a single explicitly specified file. =item B<-h>, B<--no-filename> Suppress the prefixing of filenames on output when multiple files are searched. =item B<--[no]heading> Print a filename heading above each file's results. This is the default when used interactively. =item B<--help>, B<-?> Print a short help statement. =item B<--help-types>, B<--help=types> Print all known types. =item B<-i>, B<--ignore-case> Ignore case distinctions in PATTERN =item B<--ignore-ack-defaults> Tells ack to completely ignore the default definitions provided with ack. This is useful in combination with B<--create-ackrc> if you I want to customize ack. =item B<--[no]ignore-dir=I>, B<--[no]ignore-directory=I> Ignore directory (as CVS, .svn, etc are ignored). May be used multiple times to ignore multiple directories. For example, mason users may wish to include B<--ignore-dir=data>. The B<--noignore-dir> option allows users to search directories which would normally be ignored (perhaps to research the contents of F<.svn/props> directories). The I must always be a simple directory name. Nested directories like F are NOT supported. You would need to specify B<--ignore-dir=foo> and then no files from any foo directory are taken into account by ack unless given explicitly on the command line. =item B<--ignore-file=I> Ignore files matching I. The filters are specified identically to file type filters as seen in L. =item B<-k>, B<--known-types> Limit selected files to those with types that ack knows about. This is equivalent to the default behavior found in ack 1. =item B<--lines=I> Only print line I of each file. Multiple lines can be given with multiple B<--lines> options or as a comma separated list (B<--lines=3,5,7>). B<--lines=4-7> also works. The lines are always output in ascending order, no matter the order given on the command line. =item B<-l>, B<--files-with-matches> Only print the filenames of matching files, instead of the matching text. =item B<-L>, B<--files-without-matches> Only print the filenames of files that do I match. =item B<--match I> Specify the I explicitly. This is helpful if you don't want to put the regex as your first argument, e.g. when executing multiple searches over the same set of files. # search for foo and bar in given files ack file1 t/file* --match foo ack file1 t/file* --match bar =item B<-m=I>, B<--max-count=I> Stop reading a file after I matches. =item B<--man> Print this manual page. =item B<-n>, B<--no-recurse> No descending into subdirectories. =item B<-o> Show only the part of each line matching PATTERN (turns off text highlighting) =item B<--output=I> Output the evaluation of I for each line (turns off text highlighting) If PATTERN matches more than once then a line is output for each non-overlapping match. For more information please see the section L">. =item B<--pager=I>, B<--nopager> B<--pager> directs ack's output through I. This can also be specified via the C and C environment variables. Using --pager does not suppress grouping and coloring like piping output on the command-line does. B<--nopager> cancels any setting in ~/.ackrc, C or C. No output will be sent through a pager. =item B<--passthru> Prints all lines, whether or not they match the expression. Highlighting will still work, though, so it can be used to highlight matches while still seeing the entire file, as in: # Watch a log file, and highlight a certain IP address $ tail -f ~/access.log | ack --passthru 123.45.67.89 =item B<--print0> Only works in conjunction with -f, -g, -l or -c (filename output). The filenames are output separated with a null byte instead of the usual newline. This is helpful when dealing with filenames that contain whitespace, e.g. # remove all files of type html ack -f --html --print0 | xargs -0 rm -f =item B<-Q>, B<--literal> Quote all metacharacters in PATTERN, it is treated as a literal. =item B<-r>, B<-R>, B<--recurse> Recurse into sub-directories. This is the default and just here for compatibility with grep. You can also use it for turning B<--no-recurse> off. =item B<-s> Suppress error messages about nonexistent or unreadable files. This is taken from fgrep. =item B<--[no]smart-case>, B<--no-smart-case> Ignore case in the search strings if PATTERN contains no uppercase characters. This is similar to C in vim. This option is off by default, and ignored if C<-i> is specified. B<-i> always overrides this option. =item B<--sort-files> Sorts the found files lexicographically. Use this if you want your file listings to be deterministic between runs of I. =item B<--show-types> Outputs the filetypes that ack associates with each file. Works with B<-f> and B<-g> options. =item B<--type=[no]TYPE> Specify the types of files to include or exclude from a search. TYPE is a filetype, like I or I. B<--type=perl> can also be specified as B<--perl>, and B<--type=noperl> can be done as B<--noperl>. If a file is of both type "foo" and "bar", specifying --foo and --nobar will exclude the file, because an exclusion takes precedence over an inclusion. Type specifications can be repeated and are ORed together. See I for a list of valid types. =item B<--type-add I:I:I> Files with the given FILTERARGS applied to the given FILTER are recognized as being of (the existing) type TYPE. See also L. =item B<--type-set I:I:I> Files with the given FILTERARGS applied to the given FILTER are recognized as being of type TYPE. This replaces an existing definition for type TYPE. See also L. =item B<--type-del I> The filters associated with TYPE are removed from Ack, and are no longer considered for searches. =item B<-v>, B<--invert-match> Invert match: select non-matching lines =item B<--version> Display version and copyright information. =item B<-w>, B<--word-regexp> Force PATTERN to match only whole words. The PATTERN is wrapped with C<\b> metacharacters. =item B<-x> An abbreviation for B<--files-from=->; the list of files to search are read from standard input, with one line per file. =item B<-1> Stops after reporting first match of any kind. This is different from B<--max-count=1> or B<-m1>, where only one match per file is shown. Also, B<-1> works with B<-f> and B<-g>, where B<-m> does not. =item B<--thpppt> Display the all-important Bill The Cat logo. Note that the exact spelling of B<--thpppppt> is not important. It's checked against a regular expression. =item B<--bar> Check with the admiral for traps. =item B<--cathy> Chocolate, Chocolate, Chocolate! =back =head1 THE .ackrc FILE The F<.ackrc> file contains command-line options that are prepended to the command line before processing. Multiple options may live on multiple lines. Lines beginning with a # are ignored. A F<.ackrc> might look like this: # Always sort the files --sort-files # Always color, even if piping to a another program --color # Use "less -r" as my pager --pager=less -r Note that arguments with spaces in them do not need to be quoted, as they are not interpreted by the shell. Basically, each I in the F<.ackrc> file is interpreted as one element of C<@ARGV>. F looks in several locations for F<.ackrc> files; the searching process is detailed in L. These files are not considered if B<--noenv> is specified on the command line. =head1 Defining your own types ack allows you to define your own types in addition to the predefined types. This is done with command line options that are best put into an F<.ackrc> file - then you do not have to define your types over and over again. In the following examples the options will always be shown on one command line so that they can be easily copy & pasted. I searches for foo in all perl files. I tells you, that perl files are files ending in .pl, .pm, .pod or .t. So what if you would like to include .xs files as well when searching for --perl files? I does this for you. B<--type-add> appends additional extensions to an existing type. If you want to define a new type, or completely redefine an existing type, then use B<--type-set>. I defines the type I to include files with the extensions .e or .eiffel. So to search for all eiffel files containing the word Bertrand use I. As usual, you can also write B<--type=eiffel> instead of B<--eiffel>. Negation also works, so B<--noeiffel> excludes all eiffel files from a search. Redefining also works: I and I<.xs> files no longer belong to the type I. When defining your own types in the F<.ackrc> file you have to use the following: --type-set=eiffel:ext:e,eiffel or writing on separate lines --type-set eiffel:ext:e,eiffel The following does B work in the F<.ackrc> file: --type-set eiffel:ext:e,eiffel In order to see all currently defined types, use I<--help-types>, e.g. I In addition to filtering based on extension (like ack 1.x allowed), ack 2 offers additional filter types. The generic syntax is I<--type-set TYPE:FILTER:FILTERARGS>; I depends on the value of I. =over 4 =item is:I I filters match the target filename exactly. It takes exactly one argument, which is the name of the file to match. Example: --type-set make:is:Makefile =item ext:I[,I[,...]] I filters match the extension of the target file against a list of extensions. No leading dot is needed for the extensions. Example: --type-set perl:ext:pl,pm,t =item match:I I filters match the target filename against a regular expression. The regular expression is made case insensitive for the search. Example: --type-set make:match:/(gnu)?makefile/ =item firstlinematch:I I matches the first line of the target file against a regular expression. Like I, the regular expression is made case insensitive. Example: --type-add perl:firstlinematch:/perl/ =back More filter types may be made available in the future. =head1 ENVIRONMENT VARIABLES For commonly-used ack options, environment variables can make life much easier. These variables are ignored if B<--noenv> is specified on the command line. =over 4 =item ACKRC Specifies the location of the user's F<.ackrc> file. If this file doesn't exist, F looks in the default location. =item ACK_OPTIONS This variable specifies default options to be placed in front of any explicit options on the command line. =item ACK_COLOR_FILENAME Specifies the color of the filename when it's printed in B<--group> mode. By default, it's "bold green". The recognized attributes are clear, reset, dark, bold, underline, underscore, blink, reverse, concealed black, red, green, yellow, blue, magenta, on_black, on_red, on_green, on_yellow, on_blue, on_magenta, on_cyan, and on_white. Case is not significant. Underline and underscore are equivalent, as are clear and reset. The color alone sets the foreground color, and on_color sets the background color. This option can also be set with B<--color-filename>. =item ACK_COLOR_MATCH Specifies the color of the matching text when printed in B<--color> mode. By default, it's "black on_yellow". This option can also be set with B<--color-match>. See B for the color specifications. =item ACK_COLOR_LINENO Specifies the color of the line number when printed in B<--color> mode. By default, it's "bold yellow". This option can also be set with B<--color-lineno>. See B for the color specifications. =item ACK_PAGER Specifies a pager program, such as C, C or C, to which ack will send its output. Using C does not suppress grouping and coloring like piping output on the command-line does, except that on Windows ack will assume that C does not support color. C overrides C if both are specified. =item ACK_PAGER_COLOR Specifies a pager program that understands ANSI color sequences. Using C does not suppress grouping and coloring like piping output on the command-line does. If you are not on Windows, you never need to use C. =back =head1 ACK & OTHER TOOLS =head2 Vim integration F integrates easily with the Vim text editor. Set this in your F<.vimrc> to use F instead of F: set grepprg=ack\ -k That example uses C<-k> to search through only files of the types ack knows about, but you may use other default flags. Now you can search with F and easily step through the results in Vim: :grep Dumper perllib Miles Sterrett has written a Vim plugin for F which allows you to use C<:Ack> instead of C<:grep>, as well as several other advanced features. L =head2 Emacs integration Phil Jackson put together an F extension that "provides a simple compilation mode ... has the ability to guess what files you want to search for based on the major-mode." L =head2 TextMate integration Pedro Melo is a TextMate user who writes "I spend my day mostly inside TextMate, and the built-in find-in-project sucks with large projects. So I hacked a TextMate command that was using find + grep to use ack. The result is the Search in Project with ack, and you can find it here: L" =head2 Shell and Return Code For greater compatibility with I, I in normal use returns shell return or exit code of 0 only if something is found and 1 if no match is found. (Shell exit code 1 is C<$?=256> in perl with C or backticks.) The I code 2 for errors is not used. If C<-f> or C<-g> are specified, then 0 is returned if at least one file is found. If no files are found, then 1 is returned. =cut =head1 DEBUGGING ACK PROBLEMS If ack gives you output you're not expecting, start with a few simple steps. =head2 Use B<--noenv> Your environment variables and F<.ackrc> may be doing things you're not expecting, or forgotten you specified. Use B<--noenv> to ignore your environment and F<.ackrc>. =head2 Use B<-f> to see what files have been selected Ack's B<-f> was originally added as a debugging tool. If ack is not finding matches you think it should find, run F to see what files have been selected. You can also add the C<--show-types> options to show the type of each file selected. =head2 Use B<--dump> This lists the ackrc files that are loaded and the options loaded from them. So for example you can find a list of directories that do not get searched or where filetypes are defined. =head1 TIPS =head2 Use the F<.ackrc> file. The F<.ackrc> is the place to put all your options you use most of the time but don't want to remember. Put all your --type-add and --type-set definitions in it. If you like --smart-case, set it there, too. I also set --sort-files there. =head2 Use F<-f> for working with big codesets Ack does more than search files. C will create a list of all the Perl files in a tree, ideal for sending into F. For example: # Change all "this" to "that" in all Perl files in a tree. ack -f --perl | xargs perl -p -i -e's/this/that/g' or if you prefer: perl -p -i -e's/this/that/g' $(ack -f --perl) =head2 Use F<-Q> when in doubt about metacharacters If you're searching for something with a regular expression metacharacter, most often a period in a filename or IP address, add the -Q to avoid false positives without all the backslashing. See the following example for more... =head2 Use ack to watch log files Here's one I used the other day to find trouble spots for a website visitor. The user had a problem loading F, so I took the access log and scanned it with ack twice. ack -Q aa.bb.cc.dd /path/to/access.log | ack -Q -B5 troublesome.gif The first ack finds only the lines in the Apache log for the given IP. The second finds the match on my troublesome GIF, and shows the previous five lines from the log in each case. =head2 Examples of F<--output> Following variables are useful in the expansion string: =over 4 =item C<$&> The whole string matched by PATTERN. =item C<$1>, C<$2>, ... The contents of the 1st, 2nd ... bracketed group in PATTERN. =item C<$`> The string before the match. =item C<$'> The string after the match. =back For more details and other variables see L. This example shows how to add text around a particular pattern (in this case adding _ around word with "e") ack2.pl "\w*e\w*" quick.txt --output="$`_$&_$'" _The_ quick brown fox jumps over the lazy dog The quick brown fox jumps _over_ the lazy dog The quick brown fox jumps over _the_ lazy dog This shows how to pick out particular parts of a match using ( ) within regular expression. ack '=head(\d+)\s+(.*)' --output=' $1 : $2' input file contains "=head1 NAME" output "1 : NAME" =head2 Share your knowledge Join the ack-users mailing list. Send me your tips and I may add them here. =head1 FAQ =head2 Why isn't ack finding a match in (some file)? Probably because it's of a type that ack doesn't recognize. ack's searching behavior is driven by filetype. B Use the C<-f> switch to see a list of files that ack will search for you. You can use the C<--show-types> switch to show which type ack thinks each file is. =head2 Wouldn't it be great if F did search & replace? No, ack will always be read-only. Perl has a perfectly good way to do search & replace in files, using the C<-i>, C<-p> and C<-n> switches. You can certainly use ack to select your files to update. For example, to change all "foo" to "bar" in all PHP files, you can do this from the Unix shell: $ perl -i -p -e's/foo/bar/g' $(ack -f --php) =head2 Can I make ack recognize F<.xyz> files? Yes! Please see L. If you think that F should recognize a type by default, please see L. =head2 There's already a program/package called ack. Yes, I know. =head2 Why is it called ack if it's called ack-grep? The name of the program is "ack". Some packagers have called it "ack-grep" when creating packages because there's already a package out there called "ack" that has nothing to do with this ack. I suggest you make a symlink named F that points to F because one of the crucial benefits of ack is having a name that's so short and simple to type. To do that, run this with F or as root: ln -s /usr/bin/ack-grep /usr/bin/ack Alternatively, you could use a shell alias: # bash/zsh alias ack=ack-grep # csh alias ack ack-grep =head2 What does F mean? Nothing. I wanted a name that was easy to type and that you could pronounce as a single syllable. =head2 Can I do multi-line regexes? No, ack does not support regexes that match multiple lines. Doing so would require reading in the entire file at a time. If you want to see lines near your match, use the C<--A>, C<--B> and C<--C> switches for displaying context. =head2 Why is ack telling me I have an invalid option when searching for C<+foo>? ack treats command line options beginning with C<+> or C<-> as options; if you would like to search for these, you may prefix your search term with C<--> or use the C<--match> option. (However, don't forget that C<+> is a regular expression metacharacter!) =head2 Why does C<"ack '.{40000,}'"> fail? Isn't that a valid regex? The Perl language limits the repetition quanitifier to 32K. You can search for C<.{32767}> but not C<.{32768}>. =head1 ACKRC LOCATION SEMANTICS Ack can load its configuration from many sources. This list specifies the sources Ack looks for configuration; each one that is found is loaded in the order specified here, and each one overrides options set in any of the sources preceding it. (For example, if I set --sort-files in my user ackrc, and --nosort-files on the command line, the command line takes precedence) =over 4 =item * Defaults are loaded from App::Ack::ConfigDefaults. This can be omitted using C<--ignore-ack-defaults>. =item * Global ackrc Options are then loaded from the global ackrc. This is located at C on Unix-like systems, and C on Windows. This can be omitted using C<--noenv>. =item * User ackrc Options are then loaded from the user's ackrc. This is located at C<$HOME/.ackrc> on Unix-like systems, and C. If a different ackrc is desired, it may be overridden with the C<$ACKRC> environment variable. This can be omitted using C<--noenv>. =item * Project ackrc Options are then loaded from the project ackrc. The project ackrc is the first ackrc file with the name C<.ackrc> or C<_ackrc>, first searching in the current directory, then the parent directory, then the grandparent directory, etc. This can be omitted using C<--noenv>. =item * --ackrc The C<--ackrc> option may be included on the command line to specify an ackrc file that can override all others. It is consulted even if C<--noenv> is present. =item * ACK_OPTIONS Options are then loaded from the environment variable C. This can be omitted using C<--noenv>. =item * Command line Options are then loaded from the command line. =back =head1 DIFFERENCES BETWEEN ACK 1.X AND ACK 2.X A lot of changes were made for ack 2; here is a list of them. =head2 GENERAL CHANGES =over 4 =item * When no selectors are specified, ack 1.x only searches through files that it can map to a file type. ack 2.x, by contrast, will search through every regular, non-binary file that is not explicitly ignored via B<--ignore-file> or B<--ignore-dir>. This is similar to the behavior of the B<-a/--all> option in ack 1.x. =item * A more flexible filter system has been added, so that more powerful file types may be created by the user. For details, please consult L. =item * ack now loads multiple ackrc files; see L for details. =item * ack's default filter definitions aren't special; you may tell ack to completely disregard them if you don't like them. =back =head2 REMOVED OPTIONS =over 4 =item * Because of the change in default search behavior, the B<-a/--all> and B<-u/--unrestricted> options have been removed. In addition, the B<-k/--known-types> option was added to cause ack to behave with the default search behavior of ack 1.x. =item * The B<-G> option has been removed. Two regular expressions on the command line was considered too confusing; to simulate B<-G>'s functionality, you may use the new B<-x> option to pipe filenames from one invocation of ack into another. =item * The B<--binary> option has been removed. =item * The B<--skipped> option has been removed. =item * The B<--text> option has been removed. =item * The B<--invert-file-match> option has been removed. Instead, you may use B<-v> with B<-g>. =back =head2 CHANGED OPTIONS =over 4 =item * The options that modify the regular expression's behavior (B<-i>, B<-w>, B<-Q>, and B<-v>) may now be used with B<-g>. =back =head2 ADDED OPTIONS =over 4 =item * B<--files-from> was added so that a user may submit a list of filenames as a list of files to search. =item * B<-x> was added to tell ack to accept a list of filenames via standard input; this list is the list of filenames that will be used for the search. =item * B<-s> was added to tell ack to suppress error messages about non-existent or unreadable files. =item * B<--ignore-directory> and B<--noignore-directory> were added as aliases for B<--ignore-dir> and B<--noignore-dir> respectively. =item * B<--ignore-file> was added so that users may specify patterns of files to ignore (ex. /.*~$/). =item * B<--dump> was added to allow users to easily find out which options are set where. =item * B<--create-ackrc> was added so that users may create custom ackrc files based on the default settings loaded by ack, and so that users may easily view those defaults. =item * B<--type-del> was added to selectively remove file type definitions. =item * B<--ignore-ack-defaults> was added so that users may ignore ack's default options in favor of their own. =item * B<--bar> was added so ack users may consult Admiral Ackbar. =back =head1 AUTHOR Andy Lester, C<< >> =head1 BUGS Please report any bugs or feature requests to the issues list at Github: L =head1 ENHANCEMENTS All enhancement requests MUST first be posted to the ack-users mailing list at L. I will not consider a request without it first getting seen by other ack users. This includes requests for new filetypes. There is a list of enhancements I want to make to F in the ack issues list at Github: L Patches are always welcome, but patches with tests get the most attention. =head1 SUPPORT Support for and information about F can be found at: =over 4 =item * The ack homepage L =item * The ack-users mailing list L =item * The ack issues list at Github L =item * AnnoCPAN: Annotated CPAN documentation L =item * CPAN Ratings L =item * Search CPAN L =item * Git source repository L =back =head1 ACKNOWLEDGEMENTS How appropriate to have Inowledgements! Thanks to everyone who has contributed to ack in any way, including Fraser Tweedale, RaEl GundEn, Steffen Jaeckel, Stephan Hohe, Michael Beijen, Alexandr Ciornii, Christian Walde, Charles Lee, Joe McMahon, John Warwick, David Steinbrunner, Kara Martens, Volodymyr Medvid, Ron Savage, Konrad Borowski, Dale Sedivic, Michael McClimon, Andrew Black, Ralph Bodenner, Shaun Patterson, Ryan Olson, Shlomi Fish, Karen Etheridge, Olivier Mengue, Matthew Wild, Scott Kyle, Nick Hooey, Bo Borgerson, Mark Szymanski, Marq Schneider, Packy Anderson, JR Boyens, Dan Sully, Ryan Niebur, Kent Fredric, Mike Morearty, Ingmar Vanhassel, Eric Van Dewoestine, Sitaram Chamarty, Adam James, Richard Carlsson, Pedro Melo, AJ Schuster, Phil Jackson, Michael Schwern, Jan Dubois, Christopher J. Madsen, Matthew Wickline, David Dyck, Jason Porritt, Jjgod Jiang, Thomas Klausner, Uri Guttman, Peter Lewis, Kevin Riggle, Ori Avtalion, Torsten Blix, Nigel Metheringham, GEbor SzabE, Tod Hagan, Michael Hendricks, Evar ArnfjErE Bjarmason, Piers Cawley, Stephen Steneker, Elias Lutfallah, Mark Leighton Fisher, Matt Diephouse, Christian Jaeger, Bill Sully, Bill Ricker, David Golden, Nilson Santos F. Jr, Elliot Shank, Merijn Broeren, Uwe Voelker, Rick Scott, Ask BjErn Hansen, Jerry Gay, Will Coleda, Mike O'Regan, Slaven ReziE<0x107>, Mark Stosberg, David Alan Pisoni, Adriano Ferreira, James Keenan, Leland Johnson, Ricardo Signes, Pete Krawczyk and Rob Hoelz. =head1 COPYRIGHT & LICENSE Copyright 2005-2013 Andy Lester. This program is free software; you can redistribute it and/or modify it under the terms of the Artistic License v2.0. See http://www.perlfoundation.org/artistic_license_2_0 or the LICENSE.md file that comes with the ack distribution. =cut ack-2.12/record-options0000755000076400007640000000103112215743470013551 0ustar andyandy#!/usr/bin/env perl use strict; use warnings; use App::Ack::ConfigLoader (); use Getopt::Long; my $option_coverage_file = 'opts.coverage'; my @extra_options = ( 'type-add=s', 'type-set=s', 'dump', ); my $fh; open $fh, '>>', $option_coverage_file or die $!; my $arg_spec = App::Ack::ConfigLoader::get_arg_spec({}, undef); foreach my $k (keys %{$arg_spec}, @extra_options) { $arg_spec->{$k} = sub { print { $fh } "$k\n"; }; } Getopt::Long::Configure('pass_through'); GetOptions(%{$arg_spec}); close $fh; ack-2.12/Inverse.pm0000644000076400007640000000103112215743470012625 0ustar andyandypackage App::Ack::Filter::Inverse; use strict; use warnings; use base 'App::Ack::Filter'; sub new { my ( $class, $filter ) = @_; return bless { filter => $filter, }, $class; } sub filter { my ( $self, $resource ) = @_; my $filter = $self->{'filter'}; return !$filter->filter( $resource ); } sub invert { my $self = shift; return $self->{'filter'}; } sub is_inverted { return 1; } sub inspect { my ( $self ) = @_; my $filter = $self->{'filter'}; return "!$filter"; } 1; ack-2.12/FirstLineMatch.pm0000644000076400007640000000167312215743470014102 0ustar andyandypackage App::Ack::Filter::FirstLineMatch; use strict; use warnings; use base 'App::Ack::Filter'; sub new { my ( $class, $re ) = @_; $re =~ s{^/|/$}{}g; # XXX validate? $re = qr{$re}i; return bless { regex => $re, }, $class; } # This test reads the first 250 characters of a file, then just uses the # first line found in that. This prevents reading something like an entire # .min.js file (which might be only one "line" long) into memory. sub filter { my ( $self, $resource ) = @_; my $re = $self->{'regex'}; my $line = $resource->firstliney; return $line =~ /$re/; } sub inspect { my ( $self ) = @_; my $re = $self->{'regex'}; return ref($self) . " - $re"; } sub to_string { my ( $self ) = @_; (my $re = $self->{regex}) =~ s{\([^:]*:(.*)\)$}{$1}; return "first line matches /$re/"; } BEGIN { App::Ack::Filter->register_filter(firstlinematch => __PACKAGE__); } 1; ack-2.12/Extension.pm0000644000076400007640000000162212217212552013166 0ustar andyandypackage App::Ack::Filter::Extension; use strict; use warnings; use base 'App::Ack::Filter'; use App::Ack::Filter::ExtensionGroup; sub new { my ( $class, @extensions ) = @_; my $exts = join('|', map { "\Q$_\E"} @extensions); my $re = qr/[.](?:$exts)$/i; return bless { extensions => \@extensions, regex => $re, groupname => 'ExtensionGroup', }, $class; } sub create_group { return App::Ack::Filter::ExtensionGroup->new(); } sub filter { my ( $self, $resource ) = @_; my $re = $self->{'regex'}; return $resource->name =~ /$re/; } sub inspect { my ( $self ) = @_; my $re = $self->{'regex'}; return ref($self) . " - $re"; } sub to_string { my ( $self ) = @_; my $exts = $self->{'extensions'}; return join(' ', map { ".$_" } @{$exts}); } BEGIN { App::Ack::Filter->register_filter(ext => __PACKAGE__); } 1; ack-2.12/Basic.pm0000644000076400007640000000663612246427623012256 0ustar andyandypackage App::Ack::Resource::Basic; =head1 App::Ack::Resource::Basic =cut use warnings; use strict; use Fcntl (); use base 'App::Ack::Resource'; =head1 METHODS =head2 new( $filename ) Opens the file specified by I<$filename> and returns a filehandle and a flag that says whether it could be binary. If there's a failure, it throws a warning and returns an empty list. =cut sub new { my $class = shift; my $filename = shift; my $self = bless { filename => $filename, fh => undef, opened => 0, }, $class; if ( $self->{filename} eq '-' ) { $self->{fh} = *STDIN; $self->{opened} = 1; } return $self; } =head2 $res->name() Returns the name of the resource. =cut sub name { return $_[0]->{filename}; } =head2 $res->needs_line_scan( \%opts ) API: Tells if the resource needs a line-by-line scan. This is a big optimization because if you can tell from the outset that the pattern is not found in the resource at all, then there's no need to do the line-by-line iteration. If in doubt, return true. Base: Slurp up an entire file up to 100K, see if there are any matches in it, and if so, let us know so we can iterate over it directly. If it's bigger than 100K or the match is inverted, we have to do the line-by-line, too. =cut sub needs_line_scan { my $self = shift; my $opt = shift; return 1 if $opt->{v}; my $size = -s $self->{fh}; if ( $size == 0 ) { return 0; } elsif ( $size > 100_000 ) { return 1; } my $buffer; my $rc = sysread( $self->{fh}, $buffer, $size ); if ( !defined($rc) && $App::Ack::report_bad_filenames ) { App::Ack::warn( "$self->{filename}: $!" ); return 1; } return 0 unless $rc && ( $rc == $size ); my $regex = $opt->{regex}; return $buffer =~ /$regex/m; } =head2 $res->reset() Resets the resource back to the beginning. This is only called if C is true, but not always if C is true. =cut sub reset { my $self = shift; # return if we haven't opened the file yet if ( !defined($self->{fh}) ) { return; } if( !seek( $self->{fh}, 0, 0 ) && $App::Ack::report_bad_filenames ) { App::Ack::warn( "$self->{filename}: $!" ); } return; } =head2 $res->close() API: Close the resource. =cut sub close { my $self = shift; # return if we haven't opened the file yet if ( !defined($self->{fh}) ) { return; } if ( !close($self->{fh}) && $App::Ack::report_bad_filenames ) { App::Ack::warn( $self->name() . ": $!" ); } $self->{opened} = 0; return; } =head2 $res->clone() API: Clone this resource. =cut sub clone { my ( $self ) = @_; return __PACKAGE__->new($self->name); } sub firstliney { my ( $self ) = @_; my $fh = $self->open(); unless(exists $self->{firstliney}) { my $buffer = ''; my $rc = sysread( $fh, $buffer, 250 ); unless($rc) { # XXX handle this better? $buffer = ''; } $buffer =~ s/[\r\n].*//s; $self->{firstliney} = $buffer; $self->reset; } $self->close; return $self->{firstliney}; } sub open { my ( $self ) = @_; return $self->{fh} if $self->{opened}; unless ( open $self->{fh}, '<', $self->{filename} ) { return; } $self->{opened} = 1; return $self->{fh}; } 1; ack-2.12/Default.pm0000644000076400007640000000036412215743470012606 0ustar andyandypackage App::Ack::Filter::Default; use strict; use warnings; use base 'App::Ack::Filter'; sub new { my ( $class ) = @_; return bless {}, $class; } sub filter { my ( $self, $resource ) = @_; return -T $resource->name; } 1; ack-2.12/MANIFEST0000644000076400007640000001013312247354204012006 0ustar andyandyChanges LICENSE.md MANIFEST README.md Makefile.PL ack Ack.pm Basic.pm Collection.pm ConfigDefault.pm ConfigFinder.pm ConfigLoader.pm # Debug.pm This is a reminder for us to NOT put Debug.pm in MANIFEST Default.pm Extension.pm ExtensionGroup.pm Filter.pm FirstLineMatch.pm Inverse.pm Is.pm IsGroup.pm Match.pm Resource.pm Resources.pm record-options squash test-pager t/FilterTest.pm t/Util.pm t/00-load.t t/ack-1.t t/ack-color.t t/ack-column.t t/ack-create-ackrc.t t/ack-c.t t/ack-dump.t t/ack-files-from.t t/ack-filetypes.t t/ack-f.t t/ack-group.t t/ack-g.t t/ack-help.t t/ack-help-types.t t/ack-h.t t/ack-ignore-dir.t t/ack-interactive.t t/ack-invalid-ackrc.t t/ack-i.t t/ack-known-types.t t/ack-k.t t/ack-line.t t/ack-match.t t/ack-m.t t/ack-named-pipes.t t/ack-n.t t/ack-o.t t/ack-pager.t t/ack-passthru.t t/ack-print0.t t/ack-removed-options.t t/ack-show-types.t t/ack-s.t t/ack-type-del.t t/ack-type.t t/ack-v.t t/ack-w.t t/ack-x.t t/anchored.t t/asp-net-ext.t t/bad-ackrc-opt.t t/basic.t t/command-line-files.t t/config-backwards-compat.t t/config-finder.t t/config-loader.t t/context.t t/default-filter.t t/exit-code.t t/ext-filter.t t/file-permission.t t/filetypes.t t/filter.t t/firstlinematch-filter.t t/highlighting.t t/illegal-regex.t t/incomplete-last-line.t t/inverted-file-filter.t t/is-filter.t t/longopts.t t/match-filter.t t/mutex-options.t t/noackrc.t t/noenv.t t/process-substitution.t t/resource-iterator.t t/r-lang-ext.t t/runtests.pl t/zero.t t/etc/buttonhook.xml.xxx t/etc/shebang.empty.xxx t/etc/shebang.foobar.xxx t/etc/shebang.php.xxx t/etc/shebang.pl.xxx t/etc/shebang.py.xxx t/etc/shebang.rb.xxx t/etc/shebang.sh.xxx t/lib/00-coverage.t t/lib/Ack.t t/lib/Basic.t t/lib/Collection.t t/lib/ConfigDefault.t t/lib/ConfigFinder.t t/lib/ConfigLoader.t t/lib/Default.t t/lib/Extension.t t/lib/ExtensionGroup.t t/lib/Filter.t t/lib/FirstLineMatch.t t/lib/Inverse.t t/lib/Is.t t/lib/IsGroup.t t/lib/Match.t t/lib/Resource.t t/lib/Resources.t t/home/.ackrc t/swamp/#emacs-workfile.pl# t/swamp/0 t/swamp/CMakeLists.txt t/swamp/Makefile t/swamp/Makefile.PL t/swamp/MasterPage.master t/swamp/Rakefile t/swamp/Sample.ascx t/swamp/Sample.asmx t/swamp/blib/ignore.pir t/swamp/blib/ignore.pm t/swamp/blib/ignore.pod t/swamp/c-header.h t/swamp/c-source.c t/swamp/crystallography-weenies.f t/swamp/example.R t/swamp/file.bar t/swamp/file.foo t/swamp/fresh.css t/swamp/fresh.css.min t/swamp/fresh.min.css t/swamp/groceries/CVS/fruit t/swamp/groceries/CVS/junk t/swamp/groceries/CVS/meat t/swamp/groceries/RCS/fruit t/swamp/groceries/RCS/junk t/swamp/groceries/RCS/meat t/swamp/groceries/another_subdir/CVS/fruit t/swamp/groceries/another_subdir/CVS/junk t/swamp/groceries/another_subdir/CVS/meat t/swamp/groceries/another_subdir/RCS/fruit t/swamp/groceries/another_subdir/RCS/junk t/swamp/groceries/another_subdir/RCS/meat t/swamp/groceries/another_subdir/fruit t/swamp/groceries/another_subdir/junk t/swamp/groceries/another_subdir/meat t/swamp/groceries/fruit t/swamp/groceries/junk t/swamp/groceries/meat t/swamp/groceries/subdir/fruit t/swamp/groceries/subdir/junk t/swamp/groceries/subdir/meat t/swamp/html.htm t/swamp/html.html t/swamp/incomplete-last-line.txt t/swamp/javascript.js t/swamp/lua-shebang-test t/swamp/minified.js.min t/swamp/minified.min.js t/swamp/moose-andy.jpg t/swamp/not-an-#emacs-workfile# t/swamp/notaMakefile t/swamp/notaRakefile t/swamp/notes.md t/swamp/options-crlf.pl t/swamp/options.pl t/swamp/options.pl.bak t/swamp/parrot.pir t/swamp/perl-test.t t/swamp/perl-without-extension t/swamp/perl.cgi t/swamp/perl.handler.pod t/swamp/perl.pl t/swamp/perl.pm t/swamp/perl.pod t/swamp/perl.tar.gz t/swamp/perltoot.jpg t/swamp/pipe-stress-freaks.F t/swamp/sample.asp t/swamp/sample.aspx t/swamp/sample.rake t/swamp/service.svc t/swamp/solution8.tar t/swamp/stuff.cmake t/text/4th-of-july.txt t/text/boy-named-sue.txt t/text/freedom-of-choice.txt t/text/me-and-bobbie-mcgee.txt t/text/numbered-text.txt t/text/science-of-myth.txt t/text/shut-up-be-happy.txt xt/man.t xt/pod.t META.yml Module YAML meta-data (added by MakeMaker) META.json Module JSON meta-data (added by MakeMaker) ack-2.12/Filter.pm0000644000076400007640000000442312215743470012447 0ustar andyandypackage App::Ack::Filter; use strict; use warnings; use overload '""' => 'to_string'; use App::Ack::Filter::Inverse (); use Carp 1.04 (); my %filter_types; =head1 NAME App::Ack::Filter - Filter objects to filter files =head1 SYNOPSIS # filter implementation package MyFilter; use strict; use warnings; use base 'App::Ack::Filter'; sub filter { my ( $self, $resource ) = @_; } BEGIN { App::Ack::Filter->register_filter('mine' => __PACKAGE__); } 1; # users App::Ack::Filter->create_filter('mine', @args); =head1 DESCRIPTION App::Ack::Filter implementations are responsible for filtering filenames to be searched. =head1 METHODS =head2 App::Ack:Filter->create_filter($type, @args) Creates a filter implementation, registered as C<$type>. C<@args> are provided as additional arguments to the implementation's constructor. =cut sub create_filter { my ( undef, $type, @args ) = @_; if ( my $package = $filter_types{$type} ) { return $package->new(@args); } Carp::croak "Unknown filter type '$type'"; } =head2 App::Ack:Filter->register_filter($type, $package) Registers a filter implementation package C<$package> under the name C<$type>. =cut sub register_filter { my ( undef, $type, $package ) = @_; $filter_types{$type} = $package; return; } =head2 $filter->filter($resource) Must be implemented by filter implementations. Returns true if the filter passes, false otherwise. This method must B alter the passed-in C<$resource> object. =head2 $filter->invert() Returns a filter whose L method returns the opposite of this filter. =cut sub invert { my ( $self ) = @_; return App::Ack::Filter::Inverse->new( $self ); } =head2 $filter->is_inverted() Returns true if this filter is an inverted filter; false otherwise. =cut sub is_inverted { return 0; } =head2 $filter->to_string Converts the filter to a string. This method is also called implicitly by stringification. =cut sub to_string { my ( $self ) = @_; return '(unimplemented to_string)'; } =head2 $filter->inspect Prints a human-readable debugging string for this filter. Useful for, you guessed it, debugging. =cut sub inspect { my ( $self ) = @_; return ref($self); } 1; ack-2.12/LICENSE.md0000644000076400007640000002165612215743470012277 0ustar andyandyack is released under the [Artistic License 2.0][1]. [1]: http://www.perlfoundation.org/artistic_license_2_0 Artistic License 2.0 ==================== Copyright (c) 2000-2006, The Perl Foundation. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble -------- This license establishes the terms under which a given free software Package may be copied, modified, distributed, and/or redistributed. The intent is that the Copyright Holder maintains some artistic control over the development of that Package while still keeping the Package available as open source and free software. You are always permitted to make arrangements wholly outside of this license directly with the Copyright Holder of a given Package. If the terms of this license do not permit the full use that you propose to make of the Package, you should contact the Copyright Holder and seek a different licensing arrangement. Definitions ----------- "Copyright Holder" means the individual(s) or organization(s) named in the copyright notice for the entire Package. "Contributor" means any party that has contributed code or other material to the Package, in accordance with the Copyright Holder's procedures. "You" and "your" means any person who would like to copy, distribute, or modify the Package. "Package" means the collection of files distributed by the Copyright Holder, and derivatives of that collection and/or of those files. A given Package may consist of either the Standard Version, or a Modified Version. "Distribute" means providing a copy of the Package or making it accessible to anyone else, or in the case of a company or organization, to others outside of your company or organization. "Distributor Fee" means any fee that you charge for Distributing this Package or providing support for this Package to another party. It does not mean licensing fees. "Standard Version" refers to the Package if it has not been modified, or has been modified only in ways explicitly requested by the Copyright Holder. "Modified Version" means the Package, if it has been changed, and such changes were not explicitly requested by the Copyright Holder. "Original License" means this Artistic License as Distributed with the Standard Version of the Package, in its current version or as it may be modified by The Perl Foundation in the future. "Source" form means the source code, documentation source, and configuration files for the Package. "Compiled" form means the compiled bytecode, object code, binary, or any other form resulting from mechanical transformation or translation of the Source form. Permission for Use and Modification Without Distribution -------------------------------------------------------- (1) You are permitted to use the Standard Version and create and use Modified Versions for any purpose without restriction, provided that you do not Distribute the Modified Version. Permissions for Redistribution of the Standard Version ------------------------------------------------------ (2) You may Distribute verbatim copies of the Source form of the Standard Version of this Package in any medium without restriction, either gratis or for a Distributor Fee, provided that you duplicate all of the original copyright notices and associated disclaimers. At your discretion, such verbatim copies may or may not include a Compiled form of the Package. (3) You may apply any bug fixes, portability changes, and other modifications made available from the Copyright Holder. The resulting Package will still be considered the Standard Version, and as such will be subject to the Original License. Distribution of Modified Versions of the Package as Source (4) You may Distribute your Modified Version as Source (either gratis or for a Distributor Fee, and with or without a Compiled form of the Modified Version) provided that you clearly document how it differs from the Standard Version, including, but not limited to, documenting any non-standard features, executables, or modules, and provided that you do at least ONE of the following: (a) make the Modified Version available to the Copyright Holder of the Standard Version, under the Original License, so that the Copyright Holder may include your modifications in the Standard Version. (b) ensure that installation of your Modified Version does not prevent the user installing or running the Standard Version. In addition, the Modified Version must bear a name that is different from the name of the Standard Version. (c) allow anyone who receives a copy of the Modified Version to make the Source form of the Modified Version available to others under (i) the Original License or (ii) a license that permits the licensee to freely copy, modify and redistribute the Modified Version using the same licensing terms that apply to the copy that the licensee received, and requires that the Source form of the Modified Version, and of any works derived from it, be made freely available in that license fees are prohibited but Distributor Fees are allowed. Distribution of Compiled Forms of the Standard Version or Modified Versions without the Source ---------------------------------------------------------------------------------------------- (5) You may Distribute Compiled forms of the Standard Version without the Source, provided that you include complete instructions on how to get the Source of the Standard Version. Such instructions must be valid at the time of your distribution. If these instructions, at any time while you are carrying out such distribution, become invalid, you must provide new instructions on demand or cease further distribution. If you provide valid instructions or cease distribution within thirty days after you become aware that the instructions are invalid, then you do not forfeit any of your rights under this license. (6) You may Distribute a Modified Version in Compiled form without the Source, provided that you comply with Section 4 with respect to the Source of the Modified Version. Aggregating or Linking the Package ---------------------------------- (7) You may aggregate the Package (either the Standard Version or Modified Version) with other packages and Distribute the resulting aggregation provided that you do not charge a licensing fee for the Package. Distributor Fees are permitted, and licensing fees for other components in the aggregation are permitted. The terms of this license apply to the use and Distribution of the Standard or Modified Versions as included in the aggregation. (8) You are permitted to link Modified and Standard Versions with other works, to embed the Package in a larger work of your own, or to build stand-alone binary or bytecode versions of applications that include the Package, and Distribute the result without restriction, provided the result does not expose a direct interface to the Package. Items That are Not Considered Part of a Modified Version -------------------------------------------------------- (9) Works (including, but not limited to, modules and scripts) that merely extend or make use of the Package, do not, by themselves, cause the Package to be a Modified Version. In addition, such works are not considered parts of the Package itself, and are not subject to the terms of this license. General Provisions ------------------ (10) Any use, modification, and distribution of the Standard or Modified Versions is governed by this Artistic License. By using, modifying or distributing the Package, you accept this license. Do not use, modify, or distribute the Package, if you do not accept this license. (11) If your Modified Version has been derived from a Modified Version made by someone other than you, you are nevertheless required to ensure that your Modified Version complies with the requirements of this license. (12) This license does not grant you the right to use any trademark, service mark, tradename, or logo of the Copyright Holder. (13) This license includes the non-exclusive, worldwide, free-of-charge patent license to make, have made, use, offer to sell, sell, import and otherwise transfer the Package with respect to any patent claims licensable by the Copyright Holder that are necessarily infringed by the Package. If you institute patent litigation (including a cross-claim or counterclaim) against any party alleging that the Package constitutes direct or contributory patent infringement, then this Artistic License to you shall terminate on the date that such litigation is filed. (14) Disclaimer of Warranty: THE PACKAGE IS PROVIDED BY THE COPYRIGHT HOLDER AND CONTRIBUTORS "AS IS' AND WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES. THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR NON-INFRINGEMENT ARE DISCLAIMED TO THE EXTENT PERMITTED BY YOUR LOCAL LAW. UNLESS REQUIRED BY LAW, NO COPYRIGHT HOLDER OR CONTRIBUTOR WILL BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING IN ANY WAY OUT OF THE USE OF THE PACKAGE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ack-2.12/ConfigDefault.pm0000644000076400007640000001512212246427630013733 0ustar andyandypackage App::Ack::ConfigDefault; use warnings; use strict; sub options { my @options = split( /\n/, _options_block() ); @options = grep { /./ && !/^#/ } @options; return @options; } sub _options_block { return <<'HERE'; # This is the default ackrc for ack 2.0 # There are four different ways to match # # is: Match the filename exactly # # ext: Match the extension of the filename exactly # # match: Match the filename against a Perl regular expression # # firstlinematch: Match the first 250 characters of the first line # of text against a Perl regular expression. This is only for # the --type-add option. ### Directories to ignore # Bazaar --ignore-directory=is:.bzr # Codeville --ignore-directory=is:.cdv # Interface Builder --ignore-directory=is:~.dep --ignore-directory=is:~.dot --ignore-directory=is:~.nib --ignore-directory=is:~.plst # Git --ignore-directory=is:.git # Mercurial --ignore-directory=is:.hg # quilt --ignore-directory=is:.pc # Subversion --ignore-directory=is:.svn # Monotone --ignore-directory=is:_MTN # CVS --ignore-directory=is:CVS # RCS --ignore-directory=is:RCS # SCCS --ignore-directory=is:SCCS # darcs --ignore-directory=is:_darcs # Vault/Fortress --ignore-directory=is:_sgbak # autoconf --ignore-directory=is:autom4te.cache # Perl module building --ignore-directory=is:blib --ignore-directory=is:_build # Perl Devel::Cover module's output directory --ignore-directory=is:cover_db # Node modules created by npm --ignore-directory=is:node_modules # CMake cache --ignore-directory=is:CMakeFiles # Eclipse workspace folder --ignore-directory=is:.metadata ### Files to ignore # Backup files --ignore-file=ext:bak --ignore-file=match:/~$/ # Emacs swap files --ignore-file=match:/^#.+#$/ # vi/vim swap files --ignore-file=match:/[._].*\.swp$/ # core dumps --ignore-file=match:/core\.\d+$/ # minified Javascript --ignore-file=match:/[.-]min[.]js$/ --ignore-file=match:/[.]js[.]min$/ # minified CSS --ignore-file=match:/[.]min[.]css$/ --ignore-file=match:/[.]css[.]min$/ # PDFs, because they pass Perl's -T detection --ignore-file=ext:pdf # Common graphics, just as an optimization --ignore-file=ext:gif,jpg,jpeg,png ### Filetypes defined # Perl http://perl.org/ --type-add=perl:ext:pl,pm,pod,t,psgi --type-add=perl:firstlinematch:/^#!.*\bperl/ # Perl tests --type-add=perltest:ext:t # Makefiles http://www.gnu.org/s/make/ --type-add=make:ext:mk --type-add=make:ext:mak --type-add=make:is:makefile --type-add=make:is:Makefile --type-add=make:is:GNUmakefile # Rakefiles http://rake.rubyforge.org/ --type-add=rake:is:Rakefile # CMake http://www.cmake.org/ --type-add=cmake:is:CMakeLists.txt --type-add=cmake:ext:cmake # Actionscript --type-add=actionscript:ext:as,mxml # Ada http://www.adaic.org/ --type-add=ada:ext:ada,adb,ads # ASP http://msdn.microsoft.com/en-us/library/aa286483.aspx --type-add=asp:ext:asp # ASP.Net http://www.asp.net/ --type-add=aspx:ext:master,ascx,asmx,aspx,svc # Assembly --type-add=asm:ext:asm,s # Batch --type-add=batch:ext:bat,cmd # ColdFusion http://en.wikipedia.org/wiki/ColdFusion --type-add=cfmx:ext:cfc,cfm,cfml # Clojure http://clojure.org/ --type-add=clojure:ext:clj # C # .xs are Perl C files --type-add=cc:ext:c,h,xs # C header files --type-add=hh:ext:h # CoffeeScript http://coffeescript.org/ --type-add=coffeescript:ext:coffee # C++ --type-add=cpp:ext:cpp,cc,cxx,m,hpp,hh,h,hxx # C# --type-add=csharp:ext:cs # CSS http://www.w3.org/Style/CSS/ --type-add=css:ext:css # Dart http://www.dartlang.org/ --type-add=dart:ext:dart # Delphi http://en.wikipedia.org/wiki/Embarcadero_Delphi --type-add=delphi:ext:pas,int,dfm,nfm,dof,dpk,dproj,groupproj,bdsgroup,bdsproj # Elixir http://elixir-lang.org/ --type-add=elixir:ext:ex,exs # Emacs Lisp http://www.gnu.org/software/emacs --type-add=elisp:ext:el # Erlang http://www.erlang.org/ --type-add=erlang:ext:erl,hrl # Fortran http://en.wikipedia.org/wiki/Fortran --type-add=fortran:ext:f,f77,f90,f95,f03,for,ftn,fpp # Google Go http://golang.org/ --type-add=go:ext:go # Groovy http://groovy.codehaus.org/ --type-add=groovy:ext:groovy,gtmpl,gpp,grunit,gradle # Haskell http://www.haskell.org/ --type-add=haskell:ext:hs,lhs # HTML --type-add=html:ext:htm,html # Java http://www.oracle.com/technetwork/java/index.html --type-add=java:ext:java,properties # JavaScript --type-add=js:ext:js # JSP http://www.oracle.com/technetwork/java/javaee/jsp/index.html --type-add=jsp:ext:jsp,jspx,jhtm,jhtml # JSON http://www.json.org/ --type-add=json:ext:json # Less http://www.lesscss.org/ --type-add=less:ext:less # Common Lisp http://common-lisp.net/ --type-add=lisp:ext:lisp,lsp # Lua http://www.lua.org/ --type-add=lua:ext:lua --type-add=lua:firstlinematch:/^#!.*\blua(jit)?/ # Objective-C --type-add=objc:ext:m,h # Objective-C++ --type-add=objcpp:ext:mm,h # OCaml http://caml.inria.fr/ --type-add=ocaml:ext:ml,mli # Matlab http://en.wikipedia.org/wiki/MATLAB --type-add=matlab:ext:m # Parrot http://www.parrot.org/ --type-add=parrot:ext:pir,pasm,pmc,ops,pod,pg,tg # PHP http://www.php.net/ --type-add=php:ext:php,phpt,php3,php4,php5,phtml --type-add=php:firstlinematch:/^#!.*\bphp/ # Plone http://plone.org/ --type-add=plone:ext:pt,cpt,metadata,cpy,py # Python http://www.python.org/ --type-add=python:ext:py --type-add=python:firstlinematch:/^#!.*\bpython/ # R http://www.r-project.org/ --type-add=rr:ext:R # Ruby http://www.ruby-lang.org/ --type-add=ruby:ext:rb,rhtml,rjs,rxml,erb,rake,spec --type-add=ruby:is:Rakefile --type-add=ruby:firstlinematch:/^#!.*\bruby/ # Rust http://www.rust-lang.org/ --type-add=rust:ext:rs # Sass http://sass-lang.com --type-add=sass:ext:sass,scss # Scala http://www.scala-lang.org/ --type-add=scala:ext:scala # Scheme http://groups.csail.mit.edu/mac/projects/scheme/ --type-add=scheme:ext:scm,ss # Shell --type-add=shell:ext:sh,bash,csh,tcsh,ksh,zsh,fish --type-add=shell:firstlinematch:/^#!.*\b(?:ba|t?c|k|z|fi)?sh\b/ # Smalltalk http://www.smalltalk.org/ --type-add=smalltalk:ext:st # SQL http://www.iso.org/iso/catalogue_detail.htm?csnumber=45498 --type-add=sql:ext:sql,ctl # Tcl http://www.tcl.tk/ --type-add=tcl:ext:tcl,itcl,itk # LaTeX http://www.latex-project.org/ --type-add=tex:ext:tex,cls,sty # Template Toolkit http://template-toolkit.org/ --type-add=tt:ext:tt,tt2,ttml # Visual Basic --type-add=vb:ext:bas,cls,frm,ctl,vb,resx # Verilog --type-add=verilog:ext:v,vh,sv # VHDL http://www.eda.org/twiki/bin/view.cgi/P1076/WebHome --type-add=vhdl:ext:vhd,vhdl # Vim http://www.vim.org/ --type-add=vim:ext:vim # XML http://www.w3.org/TR/REC-xml/ --type-add=xml:ext:xml,dtd,xsl,xslt,ent --type-add=xml:firstlinematch:/<[?]xml/ # YAML http://yaml.org/ --type-add=yaml:ext:yaml,yml HERE } 1; ack-2.12/Makefile.PL0000644000076400007640000001256212246437331012641 0ustar andyandypackage main; require 5.008008; use strict; use warnings; use ExtUtils::MakeMaker; my $debug_mode = (grep { $_ eq '--debug' } @ARGV) ? '--debug' : ''; my %parms = ( NAME => 'ack', AUTHOR => 'Andy Lester ', ABSTRACT => 'A grep-like program for searching source code', VERSION_FROM => 'Ack.pm', PM => { 'Ack.pm' => '$(INST_LIBDIR)/App/Ack.pm', 'Resource.pm' => '$(INST_LIBDIR)/App/Ack/Resource.pm', 'Resources.pm' => '$(INST_LIBDIR)/App/Ack/Resources.pm', 'Basic.pm' => '$(INST_LIBDIR)/App/Ack/Resource/Basic.pm', 'ConfigDefault.pm' => '$(INST_LIBDIR)/App/Ack/ConfigDefault.pm', 'ConfigFinder.pm' => '$(INST_LIBDIR)/App/Ack/ConfigFinder.pm', 'ConfigLoader.pm' => '$(INST_LIBDIR)/App/Ack/ConfigLoader.pm', 'Filter.pm' => '$(INST_LIBDIR)/App/Ack/Filter.pm', 'Extension.pm' => '$(INST_LIBDIR)/App/Ack/Filter/Extension.pm', 'FirstLineMatch.pm' => '$(INST_LIBDIR)/App/Ack/Filter/FirstLineMatch.pm', 'Is.pm' => '$(INST_LIBDIR)/App/Ack/Filter/Is.pm', 'Match.pm' => '$(INST_LIBDIR)/App/Ack/Filter/Match.pm', 'Default.pm' => '$(INST_LIBDIR)/App/Ack/Filter/Default.pm', 'Inverse.pm' => '$(INST_LIBDIR)/App/Ack/Filter/Inverse.pm', 'Collection.pm' => '$(INST_LIBDIR)/App/Ack/Filter/Collection.pm', 'IsGroup.pm' => '$(INST_LIBDIR)/App/Ack/Filter/IsGroup.pm', 'ExtensionGroup.pm' => '$(INST_LIBDIR)/App/Ack/Filter/ExtensionGroup.pm', }, EXE_FILES => [ 'ack' ], PREREQ_PM => { 'Carp' => '1.04', 'Cwd' => '3.00', 'File::Basename' => '1.00015', 'File::Glob' => '1.00015', 'File::Next' => '1.10', 'File::Spec' => '3.00', 'File::Temp' => '0.19', # For newdir() 'Getopt::Long' => '2.35', 'Pod::Usage' => '1.26', 'Term::ANSIColor' => '1.10', 'Test::Harness' => '2.50', # Something reasonably newish 'Test::More' => '0.98', # For subtest() 'Text::ParseWords' => '3.1', ( $^O eq 'MSWin32' ? ('Win32::ShellQuote' => '0.002001') : () ), }, MAN3PODS => {}, # no need for man pages for any of the .pm files dist => { COMPRESS => 'gzip -9f', SUFFIX => 'gz', }, clean => { FILES => 'ack-2* nytprof* stderr.log stdout.log' }, ); if ( $ExtUtils::MakeMaker::VERSION =~ /^\d\.\d\d$/ and $ExtUtils::MakeMaker::VERSION > 6.30 ) { $parms{LICENSE} = 'artistic_2'; } if ( $ExtUtils::MakeMaker::VERSION ge '6.46' ) { $parms{META_MERGE} = { resources => { homepage => 'http://beyondgrep.com/', bugtracker => 'http://github.com/petdance/ack2', license => 'http://www.perlfoundation.org/artistic_license_2_0', repository => 'git://github.com/petdance/ack2.git', MailingList => 'http://groups.google.com/group/ack-users', } }; } if ( $ExtUtils::MakeMaker::VERSION ge '6.48' ) { $parms{MIN_PERL_VERSION} = 5.008008; } WriteMakefile( %parms ); package MY; # supress EU::MM test rule sub MY::test { return ''; } sub MY::postamble { my $file_next_filename = qx(perldoc -l File::Next); chomp $file_next_filename; my $postamble = sprintf(<<'MAKE_FRAG', $file_next_filename, $debug_mode); ACK = ack ALL_PM = \ Ack.pm \ Resource.pm Resources.pm Basic.pm \ ConfigDefault.pm ConfigFinder.pm ConfigLoader.pm \ Filter.pm Extension.pm FirstLineMatch.pm Is.pm Match.pm Default.pm Inverse.pm Collection.pm IsGroup.pm ExtensionGroup.pm TEST_VERBOSE=0 TEST_FILES=t/*.t t/lib/*.t TEST_XT_FILES=xt/*.t .PHONY: tags critic tags: ctags -f tags --recurse --totals \ --exclude=blib \ --exclude=.git \ --exclude='*~' \ --exclude=ack-standalone \ --languages=Perl --langmap=Perl:+.t \ critic: perlcritic -1 -q -profile perlcriticrc $(ACK) $(ALL_PM) t/*.t t/lib/*.t xt/*.t ack-standalone : $(ACK) $(ALL_PM) squash Makefile $(PERL) squash $(ACK) $(ALL_PM) %s %s > ack-standalone $(FIXIN) ack-standalone -$(NOECHO) $(CHMOD) $(PERM_RWX) ack-standalone $(PERL) -c ack-standalone bininst : $(ACK) $(CP) $(ACK) ~/bin/ack2 $(CP) ackrc ~/.ack2rc test: test_classic test_standalone fulltest: test_classic test_standalone test_xt test_classic: all $(FULLPERLRUN) t/runtests.pl 0 $(TEST_VERBOSE) "$(INST_LIB)" "$(INST_ARCHLIB)" $(TEST_FILES) test_standalone: all ack-standalone $(FULLPERLRUN) t/runtests.pl 1 $(TEST_VERBOSE) "$(INST_LIB)" "$(INST_ARCHLIB)" $(TEST_FILES) test_xt: all $(FULLPERLRUN) t/runtests.pl 0 $(TEST_VERBOSE) "$(INST_LIB)" "$(INST_ARCHLIB)" $(TEST_XT_FILES) PROF_ARGS = -Mblib blib/script/ack foo ~/parrot nytprof: all $(PERL) -d:NYTProf $(PROF_ARGS) >> /dev/null 2>&1 nytprofhtml TIMER_ARGS=foo ~/parrot > /dev/null time-ack196: time $(PERL) ./garage/ack196 --noenv $(TIMER_ARGS) time-ack202: time $(PERL) ./garage/ack202 --noenv $(TIMER_ARGS) time-ack20301: time $(PERL) ./garage/ack20301 --noenv $(TIMER_ARGS) time-ack20302: time $(PERL) ./garage/ack20302 --noenv $(TIMER_ARGS) time-head: ack-standalone time $(PERL) ./ack-standalone --noenv $(TIMER_ARGS) timings: ack-standalone ./dev/timings.pl MAKE_FRAG return $postamble; } 1; ack-2.12/Resources.pm0000644000076400007640000000413212215743470013171 0ustar andyandypackage App::Ack::Resources; use App::Ack; use File::Next 1.10; use warnings; use strict; =head1 SYNOPSIS This is the base class for App::Ack::Resources, an iterator factory for App::Ack::Resource objects. =head1 METHODS =head2 from_argv( \%opt, \@starting_points ) Return an iterator that does the file finding for us. =cut sub from_argv { my $class = shift; my $opt = shift; my $start = shift; my $self = bless {}, $class; my $file_filter = undef; my $descend_filter = $opt->{descend_filter}; if( $opt->{n} ) { $descend_filter = sub { return 0; }; } $self->{iter} = File::Next::files( { file_filter => $opt->{file_filter}, descend_filter => $descend_filter, error_handler => sub { my $msg = shift; App::Ack::warn( $msg ) }, sort_files => $opt->{sort_files}, follow_symlinks => $opt->{follow}, }, @{$start} ); return $self; } =head2 from_file( \%opt, $filename ) Return an iterator that reads the list of files to search from a given file. If I<$filename> is '-', then it reads from STDIN. =cut sub from_file { my $class = shift; my $opt = shift; my $file = shift; my $iter = File::Next::from_file( { error_handler => sub { my $msg = shift; App::Ack::warn( $msg ) }, warning_handler => sub { my $msg = shift; App::Ack::warn( $msg ) }, sort_files => $opt->{sort_files}, }, $file ) or return undef; return bless { iter => $iter, }, $class; } # This is for reading input lines from STDIN, not the list of files from STDIN sub from_stdin { my $class = shift; my $opt = shift; my $self = bless {}, $class; my $has_been_called = 0; $self->{iter} = sub { if ( !$has_been_called ) { $has_been_called = 1; return '-'; } return; }; return $self; } sub next { my $self = shift; my $file = $self->{iter}->() or return; return App::Ack::Resource::Basic->new( $file ); } 1; ack-2.12/ConfigFinder.pm0000644000076400007640000001004512246427630013555 0ustar andyandypackage App::Ack::ConfigFinder; =head1 App::Ack::ConfigFinder =head1 LOCATING CONFIG FILES First, ack looks for a global ackrc. =over =item On Windows, this is `ackrc` in either COMMON_APPDATA or APPDATA. If `ackrc` is present in both directories, ack uses both files in that order. =item On a non-Windows OS, this is `/etc/ackrc`. =back Then, ack looks for a user-specific ackrc if the HOME environment variable is set. This is either `$HOME/.ackrc` or `$HOME/_ackrc`. Then, ack looks for a project-specific ackrc file. ack searches up the directory hierarchy for the first `.ackrc` or `_ackrc` file. If this is one of the ackrc files found in the previous steps, it is not loaded again. It is a fatal error if a directory contains both `.ackrc` and `_ackrc`. After ack loads the options from the found ackrc files, ack looks at the ACKRC_OPTIONS environment variable. Finally, ack takes settings from the command line. =cut use strict; use warnings; use App::Ack (); use App::Ack::ConfigDefault; use Cwd 3.00 (); use File::Spec 3.00; use if ($^O eq 'MSWin32'), 'Win32'; =head1 METHODS =head2 new Creates a new config finder. =cut sub new { my ( $class ) = @_; return bless {}, $class; } sub _remove_redundancies { my ( @configs ) = @_; if ( $App::Ack::is_windows ) { # inode stat always returns 0 on windows, so just check filenames. my (%seen, @uniq); foreach my $path (map { $_->{path} } @configs) { push @uniq, $path unless $seen{$path}; $seen{$path} = 1; } return @uniq; } else { my %dev_and_inode_seen; foreach my $config ( @configs ) { my $path = $config->{path}; my ( $dev, $inode ) = (stat $path)[0, 1]; if( defined($dev) ) { if( $dev_and_inode_seen{"$dev:$inode"} ) { undef $config; } else { $dev_and_inode_seen{"$dev:$inode"} = 1; } } } return grep { defined() } @configs; } } sub _check_for_ackrc { return unless defined $_[0]; my @files = grep { -f } map { File::Spec->catfile(@_, $_) } qw(.ackrc _ackrc); die File::Spec->catdir(@_) . " contains both .ackrc and _ackrc.\n" . "Please remove one of those files.\n" if @files > 1; return wantarray ? @files : $files[0]; } # end _check_for_ackrc =head2 $finder->find_config_files Locates config files, and returns a list of them. =cut sub find_config_files { my @config_files; if ( $App::Ack::is_windows ) { push @config_files, map { +{ path => File::Spec->catfile($_, 'ackrc') } } ( Win32::GetFolderPath(Win32::CSIDL_COMMON_APPDATA()), Win32::GetFolderPath(Win32::CSIDL_APPDATA()), ); } else { push @config_files, { path => '/etc/ackrc' }; } if ( $ENV{'ACKRC'} && -f $ENV{'ACKRC'} ) { push @config_files, { path => $ENV{'ACKRC'} }; } else { push @config_files, map { +{ path => $_ } } _check_for_ackrc($ENV{'HOME'}); } my @dirs = File::Spec->splitdir(Cwd::getcwd()); while(@dirs) { my $ackrc = _check_for_ackrc(@dirs); if(defined $ackrc) { push @config_files, { project => 1, path => $ackrc }; last; } pop @dirs; } # XXX we only test for existence here, so if the file is # deleted out from under us, this will fail later. =( return _remove_redundancies( @config_files ); } =head2 read_rcfile Reads the contents of the .ackrc file and returns the arguments. =cut sub read_rcfile { my $file = shift; return unless defined $file && -e $file; my @lines; open( my $fh, '<', $file ) or App::Ack::die( "Unable to read $file: $!" ); while ( my $line = <$fh> ) { chomp $line; $line =~ s/^\s+//; $line =~ s/\s+$//; next if $line eq ''; next if $line =~ /^#/; push( @lines, $line ); } close $fh; return @lines; } 1; ack-2.12/t/0000755000076400007640000000000012247354203011121 5ustar andyandyack-2.12/t/ack-1.t0000644000076400007640000000340212217205137012177 0ustar andyandy#!perl use warnings; use strict; use Test::More tests => 13; use lib 't'; use Util; prep_environment(); SINGLE_TEXT_MATCH: { my @expected = ( 'Was before he left, he went and named me Sue.' ); my @files = qw( t/text ); my @args = qw( Sue -1 -h ); my @results = run_ack( @args, @files ); lists_match( \@results, \@expected, 'Looking for first instance of Sue!' ); } DASH_V: { my @expected = ( 'Well, my daddy left home when I was three', ); my @files = qw( t/text/boy-named-sue.txt ); my @args = qw( Sue -1 -h -v ); my @results = run_ack( @args, @files ); lists_match( \@results, \@expected, 'Looking for first non-match' ); } DASH_F: { my @files = qw( t/swamp ); my @args = qw( -1 -f ); my @results = run_ack( @args, @files ); my $test_path = File::Next::reslash( 't/swamp/' ); is( scalar @results, 1, 'Should only get one file back' ); like( $results[0], qr{^\Q$test_path\E}, 'One of the files from the swamp' ); } DASH_G: { my $regex = '\bMakefile\b'; my @files = qw( t/ ); my @args = ( '-1', '-g', $regex ); my @results = run_ack( @args, @files ); my $test_path = File::Next::reslash( 't/swamp/Makefile' ); is( scalar @results, 1, "Should only get one file back from $regex" ); like( $results[0], qr{^\Q$test_path\E(?:[.]PL)?$}, 'The one file matches one of the two Makefile files' ); } DASH_L: { my $target = 'the'; my @files = File::Next::reslash( 't/text' ); my @args = ( '-1', '-l', '--sort-files', $target ); my @results = run_ack( @args, @files ); my $expected = File::Next::reslash( 't/text/4th-of-july.txt' ); is( scalar(@results), 1, 'Should only get one matching file back' ); is( $results[0], $expected ); } ack-2.12/t/ack-group.t0000644000076400007640000000635412217205156013205 0ustar andyandy#!/usr/bin/perl use strict; use warnings; use Test::More tests => 12; use File::Next (); use lib 't'; use Util; prep_environment(); my $freedom = File::Next::reslash( 't/text/freedom-of-choice.txt' ); my $bobbie = File::Next::reslash( 't/text/me-and-bobbie-mcgee.txt' ); NO_GROUPING: { my @expected = split( /\n/, <<"EOF" ); $freedom:2:Nobody ever said life was free $freedom:4:But use your freedom of choice $freedom:6:I'll say it again in the land of the free $freedom:7:Use your freedom of choice $freedom:8:Your freedom of choice $freedom:28:I'll say it again in the land of the free $freedom:29:Use your freedom of choice $bobbie:12: Nothin' don't mean nothin' if it ain't free $bobbie:27: Nothin' don't mean nothin' if it ain't free EOF my @files = sort glob( 't/text/*.txt' ); my @arg_sets = ( [qw( --nogroup --nocolor free )], [qw( --nobreak --noheading --nocolor free )], ); for my $set ( @arg_sets ) { my @results = run_ack( @{$set}, @files ); lists_match( \@results, \@expected, 'No grouping' ); } } STANDARD_GROUPING: { my @expected = split( /\n/, <<"EOF" ); $freedom 2:Nobody ever said life was free 4:But use your freedom of choice 6:I'll say it again in the land of the free 7:Use your freedom of choice 8:Your freedom of choice 28:I'll say it again in the land of the free 29:Use your freedom of choice $bobbie 12: Nothin' don't mean nothin' if it ain't free 27: Nothin' don't mean nothin' if it ain't free EOF my @files = sort glob( 't/text/*.txt' ); my @arg_sets = ( [qw( --group --nocolor free )], [qw( --heading --break --nocolor free )], ); for my $set ( @arg_sets ) { my @results = run_ack( @{$set}, @files ); lists_match( \@results, \@expected, 'Standard grouping' ); } } HEADING_NO_BREAK: { my @expected = split( /\n/, <<"EOF" ); $freedom 2:Nobody ever said life was free 4:But use your freedom of choice 6:I'll say it again in the land of the free 7:Use your freedom of choice 8:Your freedom of choice 28:I'll say it again in the land of the free 29:Use your freedom of choice $bobbie 12: Nothin' don't mean nothin' if it ain't free 27: Nothin' don't mean nothin' if it ain't free EOF my @files = sort glob( 't/text/*.txt' ); my @arg_sets = ( [qw( --heading --nobreak --nocolor free )], ); for my $set ( @arg_sets ) { my @results = run_ack( @{$set}, @files ); lists_match( \@results, \@expected, 'Standard grouping' ); } } BREAK_NO_HEADING: { my @expected = split( /\n/, <<"EOF" ); $freedom:2:Nobody ever said life was free $freedom:4:But use your freedom of choice $freedom:6:I'll say it again in the land of the free $freedom:7:Use your freedom of choice $freedom:8:Your freedom of choice $freedom:28:I'll say it again in the land of the free $freedom:29:Use your freedom of choice $bobbie:12: Nothin' don't mean nothin' if it ain't free $bobbie:27: Nothin' don't mean nothin' if it ain't free EOF my @files = sort glob( 't/text/*.txt' ); my @arg_sets = ( [qw( --break --noheading --nocolor free )], ); for my $set ( @arg_sets ) { my @results = run_ack( @{$set}, @files ); lists_match( \@results, \@expected, 'No grouping' ); } } ack-2.12/t/r-lang-ext.t0000644000076400007640000000040512217375765013300 0ustar andyandy#!perl use strict; use warnings; use lib 't'; use Test::More tests => 2; use Util; prep_environment(); my @expected = qw( t/swamp/example.R ); my @args = qw( --rr -f ); my @results = run_ack( @args ); sets_match( \@results, \@expected, __FILE__ ); ack-2.12/t/etc/0000755000076400007640000000000012247354203011674 5ustar andyandyack-2.12/t/etc/shebang.pl.xxx0000644000076400007640000000015212217205300014452 0ustar andyandy#!/usr/bin/perl # NOTE: This must stay a very short file so that C<-B $open_fh> will # think it's binary. ack-2.12/t/etc/buttonhook.xml.xxx0000644000076400007640000000047312215743470015447 0ustar andyandy ack-2.12/t/etc/shebang.foobar.xxx0000644000076400007640000000002212215743470015320 0ustar andyandy#!/usr/bin/foobar ack-2.12/t/etc/shebang.empty.xxx0000644000076400007640000000000012215743470015202 0ustar andyandyack-2.12/t/etc/shebang.php.xxx0000644000076400007640000000001712215743470014643 0ustar andyandy#!/usr/bin/php ack-2.12/t/etc/shebang.sh.xxx0000644000076400007640000000001612215743470014465 0ustar andyandy#!/usr/bin/sh ack-2.12/t/etc/shebang.rb.xxx0000644000076400007640000000002012215743470014451 0ustar andyandy#!/usr/bin/ruby ack-2.12/t/etc/shebang.py.xxx0000644000076400007640000000002212215743470014500 0ustar andyandy#!/usr/bin/python ack-2.12/t/ack-v.t0000644000076400007640000000263712217375765012334 0ustar andyandy#!perl use warnings; use strict; use Test::More tests => 5; use File::Next (); use lib 't'; use Util; prep_environment(); NORMAL_CASE: { my @expected = ( 'Well, my daddy left home when I was three' ); my @args = qw( -v are -h -m1 ); my @files = qw( t/text/boy-named-sue.txt ); ack_lists_match( [ @args, @files ], \@expected, 'First line of a file that does not contain "are".' ); } DASH_L: { my @expected = qw( t/text/4th-of-july.txt t/text/boy-named-sue.txt t/text/freedom-of-choice.txt t/text/me-and-bobbie-mcgee.txt t/text/numbered-text.txt t/text/science-of-myth.txt t/text/shut-up-be-happy.txt ); my @args = qw( religion -i -v -l ); my @files = qw( t/text ); ack_sets_match( [ @args, @files ], \@expected, 'No religion please' ); ack_sets_match( [ '.*', '-l', '-v', 't/text' ], [], '-l -v with .* (which matches any line) should have no results' ); } DASH_C: { my @expected = qw( t/text/4th-of-july.txt:37 t/text/boy-named-sue.txt:72 t/text/freedom-of-choice.txt:50 t/text/me-and-bobbie-mcgee.txt:32 t/text/numbered-text.txt:20 t/text/science-of-myth.txt:24 t/text/shut-up-be-happy.txt:26 ); my @args = qw( religion -i -v -c ); my @files = qw( t/text ); ack_sets_match( [ @args, @files ], \@expected, 'Non-religion counts' ); } done_testing(); ack-2.12/t/ack-color.t0000644000076400007640000000354312217205141013156 0ustar andyandy#!perl use warnings; use strict; use Test::More; use File::Next (); use lib 't'; use Util; plan tests => 13; prep_environment(); my $match_start = "\e[30;43m"; my $match_end = "\e[0m"; my $line_end = "\e[0m\e[K"; NORMAL_COLOR: { my @files = qw( t/text/boy-named-sue.txt ); my @args = qw( called --color ); my @results = run_ack( @args, @files ); ok( grep { /\e/ } @results, 'normal match highlighted' ) or diag(explain(\@results)); } MATCH_WITH_BACKREF: { my @files = qw( t/text/boy-named-sue.txt ); my @args = qw( (called).*\1 --color ); my @results = run_ack( @args, @files ); is( @results, 1, 'backref pattern matches once' ); ok( grep { /\e/ } @results, 'match with backreference highlighted' ); } BRITISH_COLOR: { my @files = qw( t/text/boy-named-sue.txt ); my @args = qw( called --colour ); my @results = run_ack( @args, @files ); ok( grep { /\e/ } @results, 'normal match highlighted' ); } MULTIPLE_MATCHES: { my @files = qw( t/text/freedom-of-choice.txt ); my @args = qw( v.+?m|c.+?n -w --color ); my @results = run_ack( @args, @files ); is( @results, 1, 'multiple matches on 1 line' ); is( $results[0], "A ${match_start}victim${match_end} of ${match_start}collision${match_end} on the open sea$line_end", 'multiple matches highlighted' ); } ADJACENT_CAPTURE_COLORING: { my @files = qw( t/text/boy-named-sue.txt ); my @args = qw( (cal)(led) --color ); my @results = run_ack( @args, @files ); is( @results, 1, 'backref pattern matches once' ); # the double end + start is kinda weird; this test could probably be # more robust is( $results[0], "I ${match_start}cal${match_end}${match_start}led${match_end} him my pa, and he ${match_start}cal${match_end}${match_start}led${match_end} me his son,", 'adjacent capture groups should highlight correctly'); } ack-2.12/t/ack-column.t0000644000076400007640000000463612217205143013343 0ustar andyandy#!perl use warnings; use strict; use Test::More tests => 4; use File::Next (); use lib 't'; use Util; prep_environment(); my $weasel = File::Next::reslash( 't/text/science-of-myth.txt' ); my @base_args = qw( the -w -i --with-filename --noenv ); WITH_COLUMNS: { my @expected = split( /\n/, <<'HERE' ); 3:4:In the case of Christianity and Judaism there exists the belief 6:1:The Buddhists believe that the functional aspects override the myth 7:27:While other religions use the literal core to build foundations with 8:11:See, half the world sees the myth as fact, and it's seen as a lie by the other half 9:5:And the simple truth is that it's none of that 'cause 10:24:Somehow no matter what the world keeps turning 14:43:In fact, for better understanding we take the facts of science and apply them 16:17:But closing off the possibilities makes it hard to see the bigger picture 18:10:Consider the case of the woman whose faith helped her make it through 22:31:And if it works, then it gets the job done 23:24:Somehow no matter what the world keeps turning 26:9: -- "The Science Of Myth", Screeching Weasel HERE @expected = map { "${weasel}:$_" } @expected; my @files = ( $weasel ); my @args = ( @base_args, '--column' ); my @results = run_ack( @args, @files ); lists_match( \@results, \@expected, 'Checking column numbers' ); } WITHOUT_COLUMNS: { my @expected = split( /\n/, <<'HERE' ); 3:In the case of Christianity and Judaism there exists the belief 6:The Buddhists believe that the functional aspects override the myth 7:While other religions use the literal core to build foundations with 8:See, half the world sees the myth as fact, and it's seen as a lie by the other half 9:And the simple truth is that it's none of that 'cause 10:Somehow no matter what the world keeps turning 14:In fact, for better understanding we take the facts of science and apply them 16:But closing off the possibilities makes it hard to see the bigger picture 18:Consider the case of the woman whose faith helped her make it through 22:And if it works, then it gets the job done 23:Somehow no matter what the world keeps turning 26: -- "The Science Of Myth", Screeching Weasel HERE @expected = map { "${weasel}:$_" } @expected; my @files = ( $weasel ); my @args = ( @base_args, '--no-column' ); my @results = run_ack( @args, @files ); lists_match( \@results, \@expected, 'Checking without column numbers' ); } ack-2.12/t/ack-help.t0000644000076400007640000000271112217375765013010 0ustar andyandy#!perl use strict; use warnings; use Test::More; use lib 't'; use Util; { my $help_options; sub _populate_help_options { my ( $output, undef ) = run_ack_with_stderr( '--help' ); $help_options = []; foreach my $line (@{$output}) { if ( $line =~ /^\s+-/ ) { while ( $line =~ /(-[^\s=,]+)/g ) { my $option = $1; chop $option if $option =~ /\[$/; if ( $option =~ s/^--\[no\]/--/ ) { my $negated_option = $option; substr $negated_option, 2, 0, 'no'; push @{$help_options}, $negated_option; } push @{$help_options}, $option; } } } return; } sub get_help_options { unless ( $help_options ) { _populate_help_options(); } return @{ $help_options }; } } sub option_in_usage { my ( $expected_option ) = @_; my @help_options = get_help_options(); my $found; foreach my $option ( @help_options ) { if ( $option eq $expected_option ) { $found = 1; last; } } ok( $found, "Option '$expected_option' found in --help output" ); return; } my @options = get_options(); plan tests => scalar(@options); prep_environment(); foreach my $option ( @options ) { option_in_usage( $option ); } ack-2.12/t/ack-ignore-dir.t0000644000076400007640000001136512217205173014105 0ustar andyandy#!perl use warnings; use strict; use Test::More tests => 24; use File::Spec; use lib 't'; use Util; prep_environment(); my @files_mentioning_apples = qw( t/swamp/groceries/fruit t/swamp/groceries/junk t/swamp/groceries/another_subdir/fruit t/swamp/groceries/another_subdir/junk t/swamp/groceries/another_subdir/CVS/fruit t/swamp/groceries/another_subdir/CVS/junk t/swamp/groceries/another_subdir/RCS/fruit t/swamp/groceries/another_subdir/RCS/junk t/swamp/groceries/subdir/fruit t/swamp/groceries/subdir/junk t/swamp/groceries/CVS/fruit t/swamp/groceries/CVS/junk t/swamp/groceries/RCS/fruit t/swamp/groceries/RCS/junk ); my @std_ignore = qw( RCS CVS ); my( @expected, @results, $test_description ); sub set_up_assertion_that_these_options_will_ignore_those_directories { my( $options, $ignored_directories, $optional_test_description ) = @_; $test_description = $optional_test_description || join( ' ', @{$options} ); my $filter = join( '|', @{$ignored_directories} ); @expected = grep { ! m{/(?:$filter)/} } @files_mentioning_apples; @results = run_ack( @{$options}, '--noenv', '-l', 'apple', 't/swamp' ); # ignore everything in .svn directories my $svn_regex = quotemeta File::Spec->catfile( '', '.svn', '' ); # the respective filesystem equivalent of '/.svn/' @results = grep { ! m/$svn_regex/ } @results; return; } DASH_IGNORE_DIR: { set_up_assertion_that_these_options_will_ignore_those_directories( [ '--ignore-dir=subdir', ], [ @std_ignore, 'subdir', ], ); sets_match( \@results, \@expected, $test_description ); } DASH_IGNORE_DIR_WITH_SLASH: { set_up_assertion_that_these_options_will_ignore_those_directories( [ '--ignore-dir=subdir/', ], [ @std_ignore, 'subdir', ], ); sets_match( \@results, \@expected, $test_description ); } DASH_IGNORE_DIR_MULTIPLE_TIMES: { set_up_assertion_that_these_options_will_ignore_those_directories( [ '--ignore-dir=subdir', '--ignore-dir=another_subdir', ], [ @std_ignore, 'subdir', 'another_subdir', ], ); sets_match( \@results, \@expected, $test_description ); } DASH_NOIGNORE_DIR: { set_up_assertion_that_these_options_will_ignore_those_directories( [ '--noignore-dir=CVS', ], [ 'RCS', ], ); sets_match( \@results, \@expected, $test_description ); } DASH_NOIGNORE_DIR_MULTIPLE_TIMES: { set_up_assertion_that_these_options_will_ignore_those_directories( [ '--noignore-dir=CVS', '--noignore-dir=RCS', ], [ ], ); sets_match( \@results, \@expected, $test_description ); } DASH_IGNORE_DIR_WITH_DASH_NOIGNORE_DIR: { set_up_assertion_that_these_options_will_ignore_those_directories( [ '--noignore-dir=CVS', '--ignore-dir=subdir', ], [ 'RCS', 'subdir', ], ); sets_match( \@results, \@expected, $test_description ); } LAST_ONE_LISTED_WINS: { set_up_assertion_that_these_options_will_ignore_those_directories( [ '--noignore-dir=CVS', '--ignore-dir=CVS', ], [ @std_ignore, ], ); sets_match( \@results, \@expected, $test_description ); set_up_assertion_that_these_options_will_ignore_those_directories( [ '--noignore-dir=CVS', '--ignore-dir=CVS', '--noignore-dir=CVS', ], [ 'RCS', ], ); sets_match( \@results, \@expected, $test_description ); set_up_assertion_that_these_options_will_ignore_those_directories( [ '--ignore-dir=subdir', '--noignore-dir=subdir', ], [ @std_ignore, ], ); sets_match( \@results, \@expected, $test_description ); set_up_assertion_that_these_options_will_ignore_those_directories( [ '--ignore-dir=subdir', '--noignore-dir=subdir', '--ignore-dir=subdir', ], [ @std_ignore, 'subdir', ], ); sets_match( \@results, \@expected, $test_description ); } DASH_IGNORE_DIR_IGNORES_RELATIVE_PATHS: { set_up_assertion_that_these_options_will_ignore_those_directories( [ '--ignore-dir=' . File::Spec->catdir('t' ,'swamp', 'groceries' , 'another_subdir'), ], [ @std_ignore, 'another_subdir', ], 'ignore relative paths instead of just directory names', ); sets_match( \@results, \@expected, $test_description ); } NOIGNORE_SUBDIR_WINS: { set_up_assertion_that_these_options_will_ignore_those_directories( [ '--ignore-dir=another_subdir', '--noignore-dir=CVS' ], [ 'RCS', 'another_subdir(?!/CVS)' ], ); sets_match( \@results, \@expected, $test_description ); } ack-2.12/t/ack-known-types.t0000644000076400007640000000316012217375765014355 0ustar andyandy#!perl use strict; use warnings; use Test::More tests => 4; use lib 't'; use Util; prep_environment(); my @files = qw( t/swamp/0 t/swamp/Rakefile t/swamp/parrot.pir t/swamp/options-crlf.pl t/swamp/options.pl t/swamp/javascript.js t/swamp/html.html t/swamp/perl-without-extension t/swamp/sample.rake t/swamp/perl.cgi t/swamp/Makefile t/swamp/pipe-stress-freaks.F t/swamp/perl.pod t/swamp/html.htm t/swamp/perl-test.t t/swamp/perl.handler.pod t/swamp/perl.pl t/swamp/Makefile.PL t/swamp/MasterPage.master t/swamp/c-source.c t/swamp/perl.pm t/swamp/c-header.h t/swamp/crystallography-weenies.f t/swamp/CMakeLists.txt t/swamp/Sample.ascx t/swamp/Sample.asmx t/swamp/sample.asp t/swamp/sample.aspx t/swamp/service.svc t/swamp/stuff.cmake t/swamp/example.R t/swamp/fresh.css t/swamp/lua-shebang-test ); my @files_no_perl = qw( t/swamp/Rakefile t/swamp/parrot.pir t/swamp/javascript.js t/swamp/html.html t/swamp/sample.rake t/swamp/Makefile t/swamp/MasterPage.master t/swamp/pipe-stress-freaks.F t/swamp/html.htm t/swamp/c-source.c t/swamp/c-header.h t/swamp/crystallography-weenies.f t/swamp/CMakeLists.txt t/swamp/Sample.ascx t/swamp/Sample.asmx t/swamp/sample.asp t/swamp/sample.aspx t/swamp/service.svc t/swamp/stuff.cmake t/swamp/example.R t/swamp/fresh.css t/swamp/lua-shebang-test ); ack_sets_match( [ '--known-types', '-f', 't/swamp' ], \@files, '--known-types test #1' ); ack_sets_match( [ '--known-types', '--noperl', '-f', 't/swamp' ], \@files_no_perl, '--known-types test #2' ); ack_sets_match( [ '-k', '-f', 't/swamp' ], \@files, '-k test #1' ); ack_sets_match( [ '-k', '-f', '--noperl', 't/swamp' ], \@files_no_perl, '-k test #2' ); ack-2.12/t/config-finder.t0000644000076400007640000001712612246427630014033 0ustar andyandy#!perl use strict; use warnings; use lib 't'; use Util; use Cwd qw(getcwd realpath); use File::Spec; use File::Temp; use Test::Builder; use Test::More; use App::Ack::ConfigFinder; my $tmpdir = $ENV{'TMPDIR'}; my $home = $ENV{'HOME'}; chop $tmpdir if $tmpdir && $tmpdir =~ m{/$}; chop $home if $home && $home =~ m{/$}; if ( $tmpdir && $tmpdir =~ /^\Q$home/ ) { plan tests => 1; fail "Your \$TMPDIR ($tmpdir) is set to a descendant directory of ~; this test is known to fail with such a setting. Please set your TMPDIR to something else to get this test to pass."; exit; } plan tests => 26; # Set HOME to a known value, so we get predictable results: $ENV{'HOME'} = realpath('t/home'); sub touch_ackrc { my $filename = shift || '.ackrc'; write_file( $filename, () ); return; } { # The tests blow up on Windows if the global files don't exist, # so here we create them if they don't, keeping track of the ones # we make so we can delete them later. my @created_globals; sub set_up_globals { my (@files) = @_; foreach my $path (@files) { unless ( -e $path ) { touch_ackrc( $path ); push @created_globals, $path; } } } sub clean_up_globals { foreach my $path (@created_globals) { unlink $path; } } } sub no_home (&) { ## no critic (ProhibitSubroutinePrototypes) my ( $fn ) = @_; my $home = delete $ENV{'HOME'}; # localized delete isn't supported in # earlier perls $fn->(); $ENV{'HOME'} = $home; # XXX this won't work on exceptions... return; } my $finder; sub expect_ackrcs { local $Test::Builder::Level = $Test::Builder::Level + 1; my $expected = shift; my $name = shift; my @got = $finder->find_config_files; my @expected = @{$expected}; foreach my $element (@got, @expected) { $element->{'path'} = realpath($element->{'path'}); } is_deeply( \@got, \@expected, $name ) or diag(explain(\@got)); return; } my @global_files; if ( is_windows() ) { require Win32; @global_files = map { +{ path => File::Spec->catfile($_, 'ackrc') } } ( Win32::GetFolderPath(Win32::CSIDL_COMMON_APPDATA()), Win32::GetFolderPath(Win32::CSIDL_APPDATA()), ); } else { @global_files = ( { path => '/etc/ackrc' }, ); } if ( is_windows() || is_cygwin() ) { set_up_globals( @global_files ); } my @std_files = (@global_files, { path => File::Spec->catfile($ENV{'HOME'}, '.ackrc') }); my $wd = getcwd; my $tempdir = File::Temp->newdir; chdir $tempdir->dirname; $finder = App::Ack::ConfigFinder->new; expect_ackrcs \@std_files, 'having no project file should return only the top level files'; no_home { expect_ackrcs \@global_files, 'only system-wide ackrc is returned if HOME is not defined with no project files'; }; mkdir 'foo'; mkdir File::Spec->catdir('foo', 'bar'); mkdir File::Spec->catdir('foo', 'bar', 'baz'); chdir File::Spec->catdir('foo', 'bar', 'baz'); touch_ackrc; expect_ackrcs [ @std_files, { project => 1, path => File::Spec->rel2abs('.ackrc') }], 'a project file in the same directory should be detected'; no_home { expect_ackrcs [ @global_files, { project => 1, path => File::Spec->rel2abs('.ackrc') } ], 'a project file in the same directory should be detected'; }; unlink '.ackrc'; my $project_file = File::Spec->catfile($tempdir->dirname, 'foo', 'bar', '.ackrc'); touch_ackrc $project_file; expect_ackrcs [ @std_files, { project => 1, path => $project_file } ], 'a project file in the parent directory should be detected'; no_home { expect_ackrcs [ @global_files, { project => 1, path => $project_file } ], 'a project file in the parent directory should be detected'; }; unlink $project_file; $project_file = File::Spec->catfile($tempdir->dirname, 'foo', '.ackrc'); touch_ackrc $project_file; expect_ackrcs [ @std_files, { project => 1, path => $project_file } ], 'a project file in the grandparent directory should be detected'; no_home { expect_ackrcs [ @global_files, { project => 1, path => $project_file } ], 'a project file in the grandparent directory should be detected'; }; touch_ackrc; expect_ackrcs [ @std_files, { project => 1, path => File::Spec->rel2abs('.ackrc') } ], 'a project file in the same directory should be detected, even with another one above it'; no_home { expect_ackrcs [ @global_files, { project => 1, path => File::Spec->rel2abs('.ackrc') } ], 'a project file in the same directory should be detected, even with another one above it'; }; unlink '.ackrc'; unlink $project_file; touch_ackrc '_ackrc'; expect_ackrcs [ @std_files, { project => 1, path => File::Spec->rel2abs('_ackrc') } ], 'a project file in the same directory should be detected'; no_home { expect_ackrcs [ @global_files, { project => 1, path => File::Spec->rel2abs('_ackrc') } ], 'a project file in the same directory should be detected'; }; unlink '_ackrc'; $project_file = File::Spec->catfile($tempdir->dirname, 'foo', '_ackrc'); touch_ackrc $project_file; expect_ackrcs [ @std_files, { project => 1, path => $project_file } ], 'a project file in the grandparent directory should be detected'; no_home { expect_ackrcs [ @global_files, { project => 1, path => $project_file } ], 'a project file in the grandparent directory should be detected'; }; touch_ackrc '_ackrc'; expect_ackrcs [ @std_files, { project => 1, path => File::Spec->rel2abs('_ackrc') } ], 'a project file in the same directory should be detected, even with another one above it'; no_home { expect_ackrcs [ @global_files, { project => 1, path => File::Spec->rel2abs('_ackrc') } ], 'a project file in the same directory should be detected, even with another one above it'; }; unlink $project_file; touch_ackrc; my $ok = eval { $finder->find_config_files }; my $err = $@; ok( !$ok, '.ackrc + _ackrc is error' ); like( $err, qr/contains both \.ackrc and _ackrc/, 'Got the expected error' ); no_home { $ok = eval { $finder->find_config_files }; $err = $@; ok( !$ok, '.ackrc + _ackrc is error' ); like( $err, qr/contains both \.ackrc and _ackrc/, 'Got the expected error' ); }; unlink '.ackrc'; $project_file = File::Spec->catfile($tempdir->dirname, 'foo', '.ackrc'); touch_ackrc $project_file; expect_ackrcs [ @std_files, { project => 1, path => File::Spec->rel2abs('_ackrc') }], 'a lower-level _ackrc should be preferred to a higher-level .ackrc'; no_home { expect_ackrcs [ @global_files, { project => 1, path => File::Spec->rel2abs('_ackrc') } ], 'a lower-level _ackrc should be preferred to a higher-level .ackrc'; }; unlink '_ackrc'; do { local $ENV{'HOME'} = File::Spec->catdir($tempdir->dirname, 'foo'); my $user_file = File::Spec->catfile($tempdir->dirname, 'foo', '.ackrc'); touch_ackrc $user_file; expect_ackrcs [ @global_files, { path => $user_file } ], q{don't load the same ackrc file twice}; unlink($user_file); }; do { chdir $tempdir->dirname; local $ENV{'HOME'} = File::Spec->catfile($tempdir->dirname, 'foo'); my $user_file = File::Spec->catfile($ENV{'HOME'}, '.ackrc'); touch_ackrc $user_file; my $ackrc = File::Temp->new; close $ackrc; local $ENV{'ACKRC'} = $ackrc->filename; expect_ackrcs [ @global_files, { path => $ackrc->filename } ], q{ACKRC overrides user's HOME ackrc}; unlink $ackrc->filename; expect_ackrcs [ @global_files, { path => $user_file } ], q{ACKRC doesn't override if it doesn't exist}; touch_ackrc $ackrc->filename; chdir 'foo'; expect_ackrcs [ @global_files, { path => $ackrc->filename}, { project => 1, path => $user_file } ], q{~/.ackrc should still be found as a project ackrc}; unlink $ackrc->filename; }; clean_up_globals(); chdir $wd; ack-2.12/t/bad-ackrc-opt.t0000644000076400007640000000064612246427630013727 0ustar andyandy#!perl use strict; use warnings; use lib 't'; use Util; use Test::More tests => 4; prep_environment(); my ( $stdout, $stderr ) = run_ack_with_stderr( '--noenv', '--ackrc=./bad-ackrc', 'the', 't/text' ); is_empty_array( $stdout, 'Nothing to stdout' ); is( @{$stderr}, 1, 'only one line to stderr' ); like( $stderr->[0], qr/Unable to load ackrc/, 'Got the right message' ); isnt( get_rc(), 0, 'Non-zero return code' ); ack-2.12/t/exit-code.t0000644000076400007640000000047512217375765013212 0ustar andyandy#!perl use strict; use warnings; use lib 't'; use Test::More tests => 4; use Util; prep_environment(); run_ack( 'boy', 't/text/boy-named-sue.txt' ); is( get_rc(), 0, 'Exit code with matches should be 0' ); run_ack( 'foo', 't/text/boy-named-sue.txt' ); is( get_rc(), 1, 'Exit code with no matches should be 1' ); ack-2.12/t/command-line-files.t0000644000076400007640000000360612217375765014773 0ustar andyandy#!perl # This file validates behaviors of specifying files on the command line. use warnings; use strict; use Test::More tests => 4; use lib 't'; use Util; use File::Next (); prep_environment(); my @source_files = qw( t/swamp/options-crlf.pl t/swamp/options.pl t/swamp/options.pl.bak ); $_ = File::Next::reslash($_) for @source_files; JUST_THE_DIR: { my @expected = split( /\n/, <<"EOF" ); $source_files[0]:19:notawordhere $source_files[1]:19:notawordhere EOF my @files = qw( t/swamp ); my @args = qw( notaword ); ack_sets_match( [ @args, @files ], \@expected, q{One hit for specifying a dir} ); } # Even a .bak file gets searched if you specify it on the command line. SPECIFYING_A_BAK_FILE: { my @expected = split( /\n/, <<"EOF" ); $source_files[1]:19:notawordhere $source_files[2]:19:notawordhere EOF my @files = qw( t/swamp/options.pl t/swamp/options.pl.bak ); my @args = qw( notaword ); ack_sets_match( [ @args, @files ], \@expected, q{Two hits for specifying the file} ); } FILE_NOT_THERE: { my $file = File::Next::reslash( 't/swamp/perl.pod' ); my @expected_stderr; # I don't care for this, but it's the least of the evils I could think of if ( $ENV{'ACK_TEST_STANDALONE'} ) { @expected_stderr = split( /\n/, <<'EOF' ); ack-standalone: non-existent-file.txt: No such file or directory EOF } else { @expected_stderr = split( /\n/, <<'EOF' ); ack: non-existent-file.txt: No such file or directory EOF } my @expected_stdout = split( /\n/, <<"EOF" ); ${file}:3:=head2 There's important stuff in here! EOF my @files = ( 'non-existent-file.txt', $file ); my @args = qw( head2 ); my ($stdout, $stderr) = run_ack_with_stderr( @args, @files ); lists_match( $stderr, \@expected_stderr, q{Error if there's no file} ); lists_match( $stdout, \@expected_stdout, 'Find the one file that has a hit' ); } ack-2.12/t/home/0000755000076400007640000000000012247354203012051 5ustar andyandyack-2.12/t/home/.ackrc0000644000076400007640000000000012215743470013126 0ustar andyandyack-2.12/t/ack-h.t0000644000076400007640000000323612217205157012275 0ustar andyandy#!/usr/bin/perl use strict; use warnings; use Test::More tests => 12; use File::Next (); use lib 't'; use Util; prep_environment(); NO_SWITCHES_ONE_FILE: { my @expected = split( /\n/, <<'EOF' ); use strict; EOF my @files = qw( t/swamp/options.pl ); my @args = qw( strict ); my @results = run_ack( @args, @files ); lists_match( \@results, \@expected, 'Looking for strict in one file' ); } NO_SWITCHES_MULTIPLE_FILES: { my $target_file = File::Next::reslash( 't/swamp/options.pl' ); my @expected = split( /\n/, <<"EOF" ); $target_file:2:use strict; EOF my @files = qw( t/swamp/options.pl t/swamp/pipe-stress-freaks.F ); my @args = qw( strict ); my @results = run_ack( @args, @files ); lists_match( \@results, \@expected, 'Looking for strict in multiple files' ); } WITH_SWITCHES_ONE_FILE: { my $target_file = File::Next::reslash( 't/swamp/options.pl' ); for my $opt ( qw( -H --with-filename ) ) { my @expected = split( /\n/, <<"EOF" ); $target_file:2:use strict; EOF my @files = qw( t/swamp/options.pl ); my @args = ( $opt, qw( strict ) ); my @results = run_ack( @args, @files ); lists_match( \@results, \@expected, "Looking for strict in one file with $opt" ); } } WITH_SWITCHES_MULTIPLE_FILES: { for my $opt ( qw( -h --no-filename ) ) { my @expected = split( /\n/, <<"EOF" ); use strict; EOF my @files = qw( t/swamp/options.pl t/swamp/crystallography-weenies.f ); my @args = ( $opt, qw( strict ) ); my @results = run_ack( @args, @files ); lists_match( \@results, \@expected, "Looking for strict in multiple files with $opt" ); } } ack-2.12/t/ack-print0.t0000644000076400007640000000473212246427630013270 0ustar andyandy#!perl use warnings; use strict; use Test::More tests => 16; use File::Next (); # For the reslash() function use lib 't'; use Util; prep_environment(); G_NO_PRINT0: { my @expected = qw( t/text/4th-of-july.txt t/text/freedom-of-choice.txt t/text/science-of-myth.txt ); my $filename_regex = 'of'; my @files = qw( t/text/ ); my @args = ( '-g', $filename_regex ); my @results = run_ack( @args, @files ); sets_match( \@results, \@expected, 'Files found with -g and without --print0' ); is_empty_array( [ grep { /\0/ } @results ], ' ... no null byte in output' ); } G_PRINT0: { my $expected = join( "\0", map { File::Next::reslash($_) } qw( t/text/4th-of-july.txt t/text/freedom-of-choice.txt t/text/science-of-myth.txt ) ) . "\0"; # string of filenames separated and concluded with null byte my $filename_regex = 'of'; my @files = qw( t/text ); my @args = ( '-g', $filename_regex, '--sort-files', '--print0' ); my @results = run_ack( @args, @files ); is( scalar @results, 1, 'Only one line of output with --print0' ); is( $results[0], $expected, 'Files found with -g and with --print0' ); } F_PRINT0: { my @files = qw( t/text/ ); my @args = qw( -f --print0 ); my @results = run_ack( @args, @files ); # Checking for exact files is fragile, so just see whether we have \0 in output. is( scalar @results, 1, 'Only one line of output with -f and --print0' ); is_nonempty_array( [ grep { /\0/ } @results ], ' ... and null bytes in output' ); } L_PRINT0: { my $regex = 'of'; my @files = qw( t/text/ ); my @args = ( '-l', '--print0', $regex ); my @results = run_ack( @args, @files ); # Checking for exact files is fragile, so just see whether we have \0 in output. is( scalar @results, 1, 'Only one line of output with -l and --print0' ); is_nonempty_array( [ grep { /\0/ } @results ], ' ... and null bytes in output' ); } COUNT_PRINT0: { my $regex = 'of'; my @files = qw( t/text/ ); my @args = ( '--count', '--print0', $regex ); my @results = run_ack( @args, @files ); # Checking for exact files is fragile, so just see whether we have \0 in output. is( scalar @results, 1, 'Only one line of output with --count and --print0' ); is_nonempty_array( [ grep { /\0/ } @results ], ' ... and null bytes in output' ); is_nonempty_array( [ grep { /:\d+/ } @results ], ' ... and ":\d+" in output, so the counting also works' ); } ack-2.12/t/ack-n.t0000644000076400007640000000267212217375765012323 0ustar andyandy#!perl use strict; use warnings; use Test::More tests => 10; use lib 't'; use Util; my $expected_norecurse = <<'END'; t/swamp/groceries/fruit:1:apple t/swamp/groceries/junk:1:apple fritters END my $expected_recurse = <<'END'; t/swamp/groceries/another_subdir/fruit:1:apple t/swamp/groceries/another_subdir/junk:1:apple fritters t/swamp/groceries/fruit:1:apple t/swamp/groceries/junk:1:apple fritters t/swamp/groceries/subdir/fruit:1:apple t/swamp/groceries/subdir/junk:1:apple fritters END chomp $expected_norecurse; chomp $expected_recurse; if ( is_windows() ) { $expected_norecurse =~ s{/}{\\}g; $expected_recurse =~ s{/}{\\}g; } my @args; my $lines; prep_environment(); # We sort to ensure determinstic results. @args = ('-n', '--sort-files', 'apple', 't/swamp/groceries'); $lines = run_ack(@args); is_deeply $lines, $expected_norecurse; @args = ('--no-recurse', '--sort-files', 'apple', 't/swamp/groceries'); $lines = run_ack(@args); is_deeply $lines, $expected_norecurse; # Make sure that re-enabling recursion works. @args = ('-n', '-r', '--sort-files', 'apple', 't/swamp/groceries'); $lines = run_ack(@args); is_deeply $lines, $expected_recurse; @args = ('--no-recurse', '-R', '--sort-files', 'apple', 't/swamp/groceries'); $lines = run_ack(@args); is_deeply $lines, $expected_recurse; @args = ('--no-recurse', '--recurse', '--sort-files', 'apple', 't/swamp/groceries'); $lines = run_ack(@args); is_deeply $lines, $expected_recurse; ack-2.12/t/Util.pm0000644000076400007640000004236312246427630012410 0ustar andyandy use Carp (); use File::Next (); use App::Ack (); use Cwd (); use File::Spec (); use File::Temp (); use Term::ANSIColor (); use Test::More; my $orig_wd; my @temp_files; # We store temp files here to make sure they're properly reclaimed at interpreter shutdown. sub check_message { my $msg = shift; if ( !$msg ) { my (undef,undef,undef,$sub) = caller(1); Carp::croak( "You must pass a message to $sub" ); } return $msg; } sub prep_environment { delete @ENV{qw( ACK_OPTIONS ACKRC ACK_PAGER HOME ACK_COLOR_MATCH ACK_COLOR_FILENAME ACK_COLOR_LINE )}; $orig_wd = Cwd::getcwd(); } sub is_windows { return $^O eq 'MSWin32'; } sub is_cygwin { return $^O eq 'cygwin'; } sub is_empty_array { local $Test::Builder::Level = $Test::Builder::Level + 1; my $aref = shift; my $msg = shift; my $ok = defined($aref) && (ref($aref) eq 'ARRAY') && (scalar(@{$aref}) == 0); if ( !ok( $ok, $msg ) ) { diag( explain( $aref ) ); } return $ok; } sub is_nonempty_array { local $Test::Builder::Level = $Test::Builder::Level + 1; my $aref = shift; my $msg = shift; my $ok = defined($aref) && (ref($aref) eq 'ARRAY') && (scalar(@{$aref}) > 0); if ( !ok( $ok, $msg ) ) { diag( explain( $aref ) ); } return $ok; } sub build_ack_invocation { my @args = @_; my $options; foreach my $arg ( @args ) { if ( ref($arg) eq 'HASH' ) { if ( $options ) { Carp::croak('You may not specify more than one options hash'); } else { $options = $arg; } } } $options ||= {}; if ( my $ackrc = $options->{ackrc} ) { if ( ref($ackrc) eq 'SCALAR' ) { my $temp_ackrc = File::Temp->new; push @temp_files, $temp_ackrc; print { $temp_ackrc } $$ackrc, "\n"; close $temp_ackrc; $ackrc = $temp_ackrc->filename; } unshift @args, '--ackrc', $ackrc; } # The --noenv makes sure we don't pull in anything from the user # unless explicitly specified in the test if ( !grep { /^--(no)?env$/ } @args ) { unshift( @args, '--noenv' ); } if ( $ENV{'ACK_TEST_STANDALONE'} ) { unshift( @args, File::Spec->rel2abs( 'ack-standalone', $orig_wd ) ); } else { unshift( @args, File::Spec->rel2abs( 'blib/script/ack', $orig_wd ) ); } return @args; } # Use this instead of File::Slurp::read_file() sub read_file { my $filename = shift; open( my $fh, '<', $filename ) or die "Can't read $filename: \n"; my @lines = <$fh>; close $fh or die; return wantarray ? @lines : join( '', @lines ); } # Use this instead of File::Slurp::write_file() sub write_file { return _write_file( '>', 'create', @_ ); } # Use this instead of File::Slurp::append_file() sub append_file { return _write_file( '>>', 'append', @_ ); } sub _write_file { my $op = shift; my $verb = shift; my $filename = shift; my @lines = @_; open( my $fh, $op, $filename ) or die "Can't $verb $filename: \n"; for my $line ( @lines ) { print {$fh} $line; } close $fh or die; return; } sub break_up_lines { my $str = shift; return split( /\n/, $str ); } sub reslash_all { return map { File::Next::reslash( $_ ) } @_; } sub run_ack { local $Test::Builder::Level = $Test::Builder::Level + 1; my @args = @_; my ($stdout, $stderr) = run_ack_with_stderr( @args ); @args = grep { ref($_) ne 'HASH' } @args; if ( $TODO ) { fail( q{Automatically fail stderr check for TODO tests.} ); } else { is_empty_array( $stderr, "Should have no output to stderr: ack @args" ); } return wantarray ? @{$stdout} : join( "\n", @{$stdout} ); } { # scope for $ack_return_code; # capture returncode our $ack_return_code; # run the given command, assuming that the command was created with # build_ack_invocation (and thus writes its STDERR to $catcherr_file). # # sets $ack_return_code and unlinks the $catcherr_file # # returns chomped STDOUT and STDERR as two array refs sub run_cmd { my ( @cmd ) = @_; # my $cmd = join( ' ', @cmd ); # diag( "Running command: $cmd" ); my $options = {}; foreach my $arg (@cmd) { if ( ref($arg) eq 'HASH' ) { $options = $arg; } } @cmd = grep { ref($_) ne 'HASH' } @cmd; record_option_coverage(@cmd); my ( @stdout, @stderr ); if ( is_windows() ) { require Win32::ShellQuote; # Capture stderr & stdout output into these files (only on Win32). my $catchout_file = 'stdout.log'; my $catcherr_file = 'stderr.log'; open(SAVEOUT, ">&STDOUT") or die "Can't dup STDOUT: $!"; open(SAVEERR, ">&STDERR") or die "Can't dup STDERR: $!"; open(STDOUT, '>', $catchout_file) or die "Can't open $catchout_file: $!"; open(STDERR, '>', $catcherr_file) or die "Can't open $catcherr_file: $!"; my $cmd = Win32::ShellQuote::quote_system_string(@cmd); if ( my $input = $options->{input} ) { my $input_command = Win32::ShellQuote::quote_system_string(@{$input}); $cmd = "$input_command | $cmd"; } system $cmd; close STDOUT; close STDERR; open(STDOUT, ">&SAVEOUT") or die "Can't restore STDOUT: $!"; open(STDERR, ">&SAVEERR") or die "Can't restore STDERR: $!"; close SAVEOUT; close SAVEERR; @stdout = read_file($catchout_file); @stderr = read_file($catcherr_file); } else { my ( $stdout_read, $stdout_write ); my ( $stderr_read, $stderr_write ); pipe $stdout_read, $stdout_write or Carp::croak( "Unable to create pipe: $!" ); pipe $stderr_read, $stderr_write or Carp::croak( "Unable to create pipe: $!" ); my $pid = fork(); if ( $pid == -1 ) { Carp::croak( "Unable to fork: $!" ); } if ( $pid ) { close $stdout_write; close $stderr_write; while ( $stdout_read || $stderr_read ) { my $rin = ''; vec( $rin, fileno($stdout_read), 1 ) = 1 if $stdout_read; vec( $rin, fileno($stderr_read), 1 ) = 1 if $stderr_read; select( $rin, undef, undef, undef ); if ( $stdout_read && vec( $rin, fileno($stdout_read), 1 ) ) { my $line = <$stdout_read>; if ( defined( $line ) ) { push @stdout, $line; } else { close $stdout_read; undef $stdout_read; } } if ( $stderr_read && vec( $rin, fileno($stderr_read), 1 ) ) { my $line = <$stderr_read>; if ( defined( $line ) ) { push @stderr, $line; } else { close $stderr_read; undef $stderr_read; } } } waitpid $pid, 0; } else { close $stdout_read; close $stderr_read; if(my $input = $options->{'input'}) { # XXX check error open STDIN, '-|', @$input or die "Can't open: $!"; } open STDOUT, '>&', $stdout_write or die "Can't open: $!"; open STDERR, '>&', $stderr_write or die "Can't open: $!"; exec @cmd; } } # end else not Win32 my ($sig,$core,$rc) = (($? & 127), ($? & 128) , ($? >> 8)); $ack_return_code = $rc; ## XXX what do do with $core or $sig? chomp @stdout; chomp @stderr; return ( \@stdout, \@stderr ); } sub get_rc { return $ack_return_code; } } # scope for $ack_return_code sub run_ack_with_stderr { my @args = @_; my @stdout; my @stderr; @args = build_ack_invocation( @args ); if ( $ENV{'ACK_TEST_STANDALONE'} ) { unshift( @args, $^X ); } else { unshift( @args, $^X, "-Mblib=$orig_wd" ); } return run_cmd( @args ); } # pipe into ack and return STDOUT and STDERR as array refs sub pipe_into_ack_with_stderr { my $input = shift; my @args = @_; my $tempfile; if ( ref($input) eq 'SCALAR' ) { # XXX we could easily do this without temp files, # but that would take slightly more time than # I'm willing to spend on this right now. $tempfile = File::Temp->new; print {$tempfile} $$input . "\n"; close $tempfile; $input = $tempfile->filename; } return run_ack_with_stderr(@args, { # you might be wondering why we use perl here as opposed # to simply using 'cat'. The answer is that we have no # idea what the user's environment is like; they may not # have cat. We *do* know, however, that they have perl. input => [$^X, '-pe1', $input], }); } # pipe into ack and return STDOUT as array, for arguments see pipe_into_ack_with_stderr sub pipe_into_ack { my ($stdout, $stderr) = pipe_into_ack_with_stderr( @_ ); return @$stdout; } # Use this one if order is important sub lists_match { local $Test::Builder::Level = $Test::Builder::Level + 1; ## no critic my @actual = @{+shift}; my @expected = @{+shift}; my $msg = check_message( shift ); # Normalize all the paths for my $path ( @expected, @actual ) { $path = File::Next::reslash( $path ); ## no critic (Variables::ProhibitPackageVars) } return subtest "lists_match( $msg )" => sub { plan tests => 1; my $rc = eval 'use Test::Differences; 1;'; if ( $rc ) { $ok = eq_or_diff( [@actual], [@expected], $msg ); } else { $ok = is_deeply( [@actual], [@expected], $msg ); } if ( !$ok ) { diag( explain( actual => [@actual], expected => [@expected] ) ); } return $ok; }; } sub ack_lists_match { local $Test::Builder::Level = $Test::Builder::Level + 1; ## no critic my $args = shift; my $expected = shift; my $message = check_message( shift ); my @args = @{$args}; my @results = run_ack( @args ); return subtest "ack_lists_match( $message )" => sub { plan tests => 1; my $ok = lists_match( \@results, $expected, $message ); $ok or diag( join( ' ', '$ ack', @args ) ); }; } # Use this one if you don't care about order of the lines sub sets_match { local $Test::Builder::Level = $Test::Builder::Level + 1; ## no critic my @actual = @{+shift}; my @expected = @{+shift}; my $msg = check_message( shift ); return subtest "sets_match( $msg )" => sub { plan tests => 1; return lists_match( [sort @actual], [sort @expected], $msg ); }; } sub ack_sets_match { local $Test::Builder::Level = $Test::Builder::Level + 1; ## no critic my $args = shift; my $expected = shift; my $message = check_message( shift ); my @args = @{$args}; return subtest "ack_sets_match( $message )" => sub { plan tests => 2; my @results = run_ack( @args ); my $ok = sets_match( \@results, $expected, $message ); $ok or diag( join( ' ', '$ ack', @args ) ); return $ok; }; } sub record_option_coverage { my ( @command_line ) = @_; return unless $ENV{ACK_OPTION_COVERAGE}; return if $ENV{ACK_STANDALONE}; # We don't need to record the second time around. my $record_options = File::Spec->catfile($orig_wd, 'record-options'); if ( @command_line == 1 ) { my $command_line = $command_line[0]; # strip the command line up until 'ack' is found $command_line =~ s/^.*ack\b//; $command_line = "$^X $record_options $command_line"; system $command_line; } else { while ( @command_line && $command_line[0] !~ /ack/ ) { shift @command_line; } shift @command_line; # get rid of 'ack' itself unshift @command_line, $^X, $record_options; system @command_line; } return; } =head2 colorize( $big_long_string ) Turns a multi-line input string into its corresponding array of lines, with colorized transformations. gets turned to filename color. {text} gets turned to line number color. (text) gets turned to highlight color. =cut sub colorize { my $input = shift; my @lines = split( /\n/, $input ); for my $line ( @lines ) { # File name $line =~ s/<(.+?)>/Term::ANSIColor::colored($1, 'bold green')/eg; # Line number $line =~ s/\{(.+?)\}/Term::ANSIColor::colored($1, 'bold yellow')/eg; # Matches my $n; $n += $line =~ s/\((.+?)\)/Term::ANSIColor::colored($1, 'black on_yellow')/eg; $line .= "\033[0m\033[K" if $n; } return @lines; } BEGIN { my $has_io_pty = eval { require IO::Pty; 1; }; sub has_io_pty { return $has_io_pty; } if ($has_io_pty) { no strict 'refs'; *run_ack_interactive = sub { my ( @args) = @_; my @cmd = build_ack_invocation(@args); @cmd = grep { ref($_) ne 'HASH' } @cmd; record_option_coverage(@cmd); my $pty = IO::Pty->new; my $pid = fork; if($pid) { $pty->close_slave(); $pty->set_raw(); if(wantarray) { my @lines; while(<$pty>) { chomp; push @lines, $_; } close $pty; waitpid $pid, 0; return @lines; } else { my $output = ''; while(<$pty>) { $output .= $_; } close $pty; waitpid $pid, 0; return $output; } } else { $pty->make_slave_controlling_terminal(); my $slave = $pty->slave(); if(-t *STDIN) { # XXX is there something we can fall back on? Maybe # re-opening /dev/console? $slave->clone_winsize_from(\*STDIN); } $slave->set_raw(); open STDIN, '<&', $slave->fileno() or die "Can't open: $!"; open STDOUT, '>&', $slave->fileno() or die "Can't open: $!"; open STDERR, '>&', $slave->fileno() or die "Can't open: $!"; close $slave; exec @cmd; } }; } else { no strict 'refs'; require Test::More; *run_ack_interactive = sub { local $Test::Builder::Level = $Test::Builder::Level + 1; Test::More::fail(<<'END_FAIL'); Your system doesn't seem to have IO::Pty, and the developers forgot to check in this test file. Please file a bug report at https://github.com/petdance/ack2/issues with the name of the file that generated this failure. END_FAIL }; } } # This should not be treated as a complete list of the available # options, but it's complete enough to rely on until we find a # more elegant way to generate this list. sub get_options { return ( '--ackrc', '--after-context', '--bar', '--before-context', '--break', '--cathy', '--color', '--color-filename', '--color-lineno', '--color-match', '--colour', '--column', '--context', '--count', '--create-ackrc', '--dump', '--env', '--files-from', '--files-with-matches', '--files-without-matches', '--filter', '--flush', '--follow', '--group', '--heading', '--help', '--help-types', '--ignore-ack-defaults', '--ignore-case', '--ignore-dir', '--ignore-directory', '--ignore-file', '--invert-match', '--lines', '--literal', '--man', '--match', '--max-count', '--no-filename', '--no-recurse', '--nobreak', '--nocolor', '--nocolour', '--nocolumn', '--noenv', '--nofilter', '--nofollow', '--nogroup', '--noheading', '--noignore-dir', '--noignore-directory', '--nopager', '--nosmart-case', '--output', '--pager', '--passthru', '--print0', '--recurse', '--show-types', '--smart-case', '--sort-files', '--thpppt', '--type', '--type-add', '--type-del', '--type-set', '--version', '--with-filename', '--word-regexp', '-1', '-?', '-A', '-B', '-C', '-H', '-L', '-Q', '-R', '-c', '-f', '-g', '-h', '-i', '-l', '-m', '-n', '-o', '-r', '-s', '-v', '-w', '-x', ); } 1; ack-2.12/t/ack-interactive.t0000644000076400007640000001120412217375765014372 0ustar andyandy#!perl use strict; use warnings; use Test::More; use Term::ANSIColor qw(color); use lib 't'; use Util; if ( not has_io_pty() ) { plan skip_all => q{You need to install IO::Pty to run this test}; exit(0); } plan tests => 6; prep_environment(); INTERACTIVE_GROUPING_NOCOLOR: { my @args = qw( Sue --nocolor ); my @files = qw( t/text ); my $output = run_ack_interactive(@args, @files); is $output, <<'END_OUTPUT'; t/text/boy-named-sue.txt 6:Was before he left, he went and named me Sue. 13:I tell ya, life ain't easy for a boy named Sue. 27:Sat the dirty, mangy dog that named me Sue. 34:And I said: "My name is Sue! How do you do! Now you gonna die!" 62:Cause I'm the son-of-a-bitch that named you Sue." 70:Bill or George! Anything but Sue! I still hate that name! 72: -- "A Boy Named Sue", Johnny Cash END_OUTPUT } INTERACTIVE_NOHEADING_NOCOLOR: { my @args = qw( Sue --nocolor --noheading); my @files = qw( t/text ); my $output = run_ack_interactive(@args, @files); is $output, <<'END_OUTPUT'; t/text/boy-named-sue.txt:6:Was before he left, he went and named me Sue. t/text/boy-named-sue.txt:13:I tell ya, life ain't easy for a boy named Sue. t/text/boy-named-sue.txt:27:Sat the dirty, mangy dog that named me Sue. t/text/boy-named-sue.txt:34:And I said: "My name is Sue! How do you do! Now you gonna die!" t/text/boy-named-sue.txt:62:Cause I'm the son-of-a-bitch that named you Sue." t/text/boy-named-sue.txt:70:Bill or George! Anything but Sue! I still hate that name! t/text/boy-named-sue.txt:72: -- "A Boy Named Sue", Johnny Cash END_OUTPUT } INTERACTIVE_NOGROUP_NOCOLOR: { my @args = qw( Sue --nocolor --nogroup); my @files = qw( t/text ); my $output = run_ack_interactive(@args, @files); is $output, <<'END_OUTPUT'; t/text/boy-named-sue.txt:6:Was before he left, he went and named me Sue. t/text/boy-named-sue.txt:13:I tell ya, life ain't easy for a boy named Sue. t/text/boy-named-sue.txt:27:Sat the dirty, mangy dog that named me Sue. t/text/boy-named-sue.txt:34:And I said: "My name is Sue! How do you do! Now you gonna die!" t/text/boy-named-sue.txt:62:Cause I'm the son-of-a-bitch that named you Sue." t/text/boy-named-sue.txt:70:Bill or George! Anything but Sue! I still hate that name! t/text/boy-named-sue.txt:72: -- "A Boy Named Sue", Johnny Cash END_OUTPUT } INTERACTIVE_GROUPING_COLOR: { my @args = qw( Sue ); # --color is on by default my @files = qw( t/text ); my $CFN = color 'bold green'; my $CRESET = color 'reset'; my $CLN = color 'bold yellow'; my $CM = color 'black on_yellow'; my $LINE_END = "\e[0m\e[K"; my @expected_lines = ( qq{${CFN}t/text/boy-named-sue.txt$CRESET}, qq{${CLN}6${CRESET}:Was before he left, he went and named me ${CM}Sue${CRESET}.$LINE_END}, qq{${CLN}13${CRESET}:I tell ya, life ain't easy for a boy named ${CM}Sue${CRESET}.$LINE_END}, qq{${CLN}27${CRESET}:Sat the dirty, mangy dog that named me ${CM}Sue${CRESET}.$LINE_END}, qq{${CLN}34${CRESET}:And I said: "My name is ${CM}Sue${CRESET}! How do you do! Now you gonna die!"$LINE_END}, qq{${CLN}62${CRESET}:Cause I'm the son-of-a-bitch that named you ${CM}Sue${CRESET}."$LINE_END}, qq{${CLN}70${CRESET}:Bill or George! Anything but ${CM}Sue${CRESET}! I still hate that name!$LINE_END}, qq{${CLN}72${CRESET}: -- "A Boy Named ${CM}Sue${CRESET}", Johnny Cash$LINE_END}, ); my @lines = run_ack_interactive(@args, @files); lists_match( \@lines, \@expected_lines, 'INTERACTIVE_GROUPING_COLOR' ); } INTERACTIVE_SINGLE_TARGET: { my @args = qw( Sue --nocolor ); my @files = qw( t/text/boy-named-sue.txt ); my $output = run_ack_interactive(@args, @files); is $output, <<'END_OUTPUT'; Was before he left, he went and named me Sue. I tell ya, life ain't easy for a boy named Sue. Sat the dirty, mangy dog that named me Sue. And I said: "My name is Sue! How do you do! Now you gonna die!" Cause I'm the son-of-a-bitch that named you Sue." Bill or George! Anything but Sue! I still hate that name! -- "A Boy Named Sue", Johnny Cash END_OUTPUT } INTERACTIVE_NOCOLOR_REGEXP_CAPTURE: { my @args = qw( (Sue) --nocolor ); my @files = qw( t/text/boy-named-sue.txt ); my $output = run_ack_interactive(@args, @files); is $output, <<'END_OUTPUT'; Was before he left, he went and named me Sue. I tell ya, life ain't easy for a boy named Sue. Sat the dirty, mangy dog that named me Sue. And I said: "My name is Sue! How do you do! Now you gonna die!" Cause I'm the son-of-a-bitch that named you Sue." Bill or George! Anything but Sue! I still hate that name! -- "A Boy Named Sue", Johnny Cash END_OUTPUT } ack-2.12/t/swamp/0000755000076400007640000000000012247354203012250 5ustar andyandyack-2.12/t/swamp/Sample.ascx0000644000076400007640000000014612215743470014355 0ustar andyandy<%@ Control Language="C#" AutoEventWireup="true" CodeFile="Sample.ascx.cs" %>

Sample Control!

ack-2.12/t/swamp/perl.pm0000644000076400007640000000024312217205415013544 0ustar andyandy#!perl -T use warnings; use strict; use Test::More tests => 1; BEGIN { use_ok( 'App::Ack' ); } diag( "Testing App::Ack $App::Ack::VERSION, Perl $], $^X" ); ack-2.12/t/swamp/sample.aspx0000644000076400007640000000037312215743470014434 0ustar andyandy<% example.Text = "Example"; %> Sample ASP.Net Page
ack-2.12/t/swamp/not-an-#emacs-workfile#0000644000076400007640000000017712215743470016413 0ustar andyandyThis is NOT a scratch emacs workfile. It sort of looks like one, but it's not. The filename kind of matches, but not really. ack-2.12/t/swamp/options.pl0000644000076400007640000000034412217205377014305 0ustar andyandy#!/usr/bin/env perl use strict; use warnings; =head1 NAME options - Test file for ack command line options =cut [abc] @Q_fields = split(/\b(?:a|b|c)\b/) __DATA__ THIS IS ALL IN UPPER CASE this is a word here notawordhere ack-2.12/t/swamp/notaRakefile0000644000076400007640000000022012215743470014574 0ustar andyandyThis is just a plain old textfile that has a name that looks like "Rakefile" but indeed is not. However, it should not match --rake or --ruby. ack-2.12/t/swamp/parrot.pir0000644000076400007640000000266512215743470014307 0ustar andyandy=head1 INFORMATION This example shows the usage of C. =head1 FUNCTIONS =over 4 =item _main =cut .sub _main :main .local pmc stream load_bytecode "library/Stream/Sub.pir" load_bytecode "library/Stream/Replay.pir" find_type $I0, "Stream::Sub" new $P0, $I0 # set the stream's source sub .const .Sub temp = "_hello" assign $P0, $P1 find_type $I0,"Stream::Replay" stream = new $I0 assign stream, $P0 $S0 = stream."read_bytes"( 3 ) print "'hel': [" print $S0 print "]\n" stream = clone stream $P0 = clone stream $S0 = stream."read_bytes"( 4 ) print "'lowo': [" print $S0 print "] = " $S0 = $P0."read_bytes"( 4 ) print "[" print $S0 print "]\n" $S0 = stream."read"() print "'rld!': [" print $S0 print "]\n" $S0 = stream."read_bytes"( 100 ) print "'parrotis cool': [" print $S0 print "]\n" end .end =item _hello This sub is used as the source for the stream. It just writes some text to the stream. =cut .sub _hello :method self."write"( "hello" ) self."write"( "world!" ) self."write"( "parrot" ) self."write"( "is cool" ) .end =back =head1 AUTHOR Jens Rieks Eparrot at jensbeimsurfen dot deE is the author and maintainer. Please send patches and suggestions to the Perl 6 Internals mailing list. =head1 COPYRIGHT Copyright (C) 2004, The Perl Foundation. =cut ack-2.12/t/swamp/example.R0000644000076400007640000000001412215743470014024 0ustar andyandyprint('hi') ack-2.12/t/swamp/stuff.cmake0000644000076400007640000000003512215743470014402 0ustar andyandy# Not actually a cmake file! ack-2.12/t/swamp/html.htm0000644000076400007640000000034012215743470013726 0ustar andyandy Boring test file

but trying to be conforming anyway

ack-2.12/t/swamp/fresh.css0000644000076400007640000011534012215743470014100 0ustar andyandyhtml,.wp-dialog{background-color:#fff;}* html input,* html .widget{border-color:#dfdfdf;}textarea,input[type="text"],input[type="password"],input[type="file"],input[type="button"],input[type="submit"],input[type="reset"],select{border-color:#dfdfdf;background-color:#fff;}kbd,code{background:#eaeaea;}input[readonly]{background-color:#eee;}.find-box-search{border-color:#dfdfdf;background-color:#f1f1f1;}.find-box{background-color:#f1f1f1;}.find-box-inside{background-color:#fff;}a.page-numbers:hover{border-color:#999;}body,#wpbody,.form-table .pre{color:#333;}body>#upload-menu{border-bottom-color:#fff;}#postcustomstuff table,#your-profile fieldset,#rightnow,div.dashboard-widget,#dashboard-widgets p.dashboard-widget-links,#replyrow #ed_reply_toolbar input{border-color:#ccc;}#poststuff .inside label.spam,#poststuff .inside label.deleted{color:red;}#poststuff .inside label.waiting{color:orange;}#poststuff .inside label.approved{color:green;}#postcustomstuff table{border-color:#dfdfdf;background-color:#F9F9F9;}#postcustomstuff thead th{background-color:#F1F1F1;}#postcustomstuff table input,#postcustomstuff table textarea{border-color:#dfdfdf;background-color:#fff;}.widefat{border-color:#dfdfdf;background-color:#f9f9f9;}div.dashboard-widget-error{background-color:#c43;}div.dashboard-widget-notice{background-color:#cfe1ef;}div.dashboard-widget-submit{border-top-color:#ccc;}div.tabs-panel,.wp-tab-panel,ul.category-tabs li.tabs,ul.add-menu-item-tabs li.tabs,.wp-tab-active{border-color:#dfdfdf;background-color:#fff;}ul.category-tabs li.tabs,ul.add-menu-item-tabs li.tabs,.wp-tab-active{background-color:#fff;}input.disabled,textarea.disabled{background-color:#ccc;}#plugin-information .action-button a,#plugin-information .action-button a:hover,#plugin-information .action-button a:visited{color:#fff;}.widget .widget-top,.postbox h3,.stuffbox h3,.widefat thead tr th,.widefat tfoot tr th,h3.dashboard-widget-title,h3.dashboard-widget-title span,h3.dashboard-widget-title small,.find-box-head,.sidebar-name,#nav-menu-header,#nav-menu-footer,.menu-item-handle,#fullscreen-topbar{background-color:#f1f1f1;background-image:-ms-linear-gradient(top,#f9f9f9,#ececec);background-image:-moz-linear-gradient(top,#f9f9f9,#ececec);background-image:-o-linear-gradient(top,#f9f9f9,#ececec);background-image:-webkit-gradient(linear,left top,left bottom,from(#f9f9f9),to(#ececec));background-image:-webkit-linear-gradient(top,#f9f9f9,#ececec);background-image:linear-gradient(top,#f9f9f9,#ececec);}.widget .widget-top,.postbox h3,.stuffbox h3{border-bottom-color:#dfdfdf;text-shadow:#fff 0 1px 0;-moz-box-shadow:0 1px 0 #fff;-webkit-box-shadow:0 1px 0 #fff;box-shadow:0 1px 0 #fff;}.form-table th,.form-wrap label{color:#222;text-shadow:#fff 0 1px 0;}.description,.form-wrap p{color:#666;}strong .post-com-count span{background-color:#21759b;}.sorthelper{background-color:#ccf3fa;}.ac_match,.subsubsub a.current{color:#000;}.wrap h2{color:#464646;}.wrap .add-new-h2{background:#f1f1f1;}.subtitle{color:#777;}.ac_over{background-color:#f0f0b8;}.ac_results{background-color:#fff;border-color:#808080;}.ac_results li{color:#101010;}.alternate,.alt{background-color:#fcfcfc;}.available-theme a.screenshot{background-color:#f1f1f1;border-color:#ddd;}.bar{background-color:#e8e8e8;border-right-color:#99d;}#media-upload,#media-upload .media-item .slidetoggle{background:#fff;}#media-upload .slidetoggle{border-top-color:#dfdfdf;}div.error,.login #login_error{background-color:#ffebe8;border-color:#c00;}div.error a{color:#c00;}.form-invalid{background-color:#ffebe8!important;}.form-invalid input,.form-invalid select{border-color:#c00!important;}.submit{border-color:#DFDFDF;}.highlight{background-color:#e4f2fd;color:#000;}.howto,.nonessential,#edit-slug-box,.form-input-tip,.subsubsub{color:#666;}.media-item{border-bottom-color:#dfdfdf;}#wpbody-content #media-items .describe{border-top-color:#dfdfdf;}.media-upload-form label.form-help,td.help{color:#9a9a9a;}.post-com-count{background-image:url(../images/bubble_bg.gif);color:#fff;}.post-com-count span{background-color:#bbb;color:#fff;}.post-com-count:hover span{background-color:#d54e21;}.quicktags,.search{background-color:#ccc;color:#000;}.side-info h5{border-bottom-color:#dadada;}.side-info ul{color:#666;}.button,.button-secondary,.submit input,input[type=button],input[type=submit]{border-color:#bbb;color:#464646;}.button:hover,.button-secondary:hover,.submit input:hover,input[type=button]:hover,input[type=submit]:hover{color:#000;border-color:#666;}.button,.submit input,.button-secondary{background:#f2f2f2 url(../images/white-grad.png) repeat-x scroll left top;text-shadow:rgba(255,255,255,1) 0 1px 0;}.button:active,.submit input:active,.button-secondary:active{background:#eee url(../images/white-grad-active.png) repeat-x scroll left top;}input.button-primary,button.button-primary,a.button-primary{border-color:#298cba;font-weight:bold;color:#fff;background:#21759B url(../images/button-grad.png) repeat-x scroll left top;text-shadow:rgba(0,0,0,0.3) 0 -1px 0;}input.button-primary:active,button.button-primary:active,a.button-primary:active{background:#21759b url(../images/button-grad-active.png) repeat-x scroll left top;color:#eaf2fa;}input.button-primary:hover,button.button-primary:hover,a.button-primary:hover,a.button-primary:focus,a.button-primary:active{border-color:#13455b;color:#eaf2fa;}.button-disabled,.button[disabled],.button:disabled,.button-secondary[disabled],.button-secondary:disabled,a.button.disabled{color:#aaa!important;border-color:#ddd!important;}.button-primary-disabled,.button-primary[disabled],.button-primary:disabled{color:#9FD0D5!important;background:#298CBA!important;}a:hover,a:active,a:focus{color:#d54e21;}#wphead #viewsite a:hover,#adminmenu a:hover,#adminmenu ul.wp-submenu a:hover,#the-comment-list .comment a:hover,#rightnow a:hover,#media-upload a.del-link:hover,div.dashboard-widget-submit input:hover,.subsubsub a:hover,.subsubsub a.current:hover,.ui-tabs-nav a:hover,.plugins .inactive a:hover,#all-plugins-table .plugins .inactive a:hover,#search-plugins-table .plugins .inactive a:hover{color:#d54e21;}#the-comment-list .comment-item,#dashboard-widgets #dashboard_quick_press form p.submit{border-color:#dfdfdf;}#side-sortables .category-tabs .tabs a,#side-sortables .add-menu-item-tabs .tabs a,.wp-tab-bar .wp-tab-active a{color:#333;}#rightnow .rbutton{background-color:#ebebeb;color:#264761;}.submitbox .submit{background-color:#464646;color:#ccc;}.plugins a.delete:hover,#all-plugins-table .plugins a.delete:hover,#search-plugins-table .plugins a.delete:hover,.submitbox .submitdelete{color:#f00;border-bottom-color:#f00;}.submitbox .submitdelete:hover,#media-items a.delete:hover{color:#fff;background-color:#f00;border-bottom-color:#f00;}#normal-sortables .submitbox .submitdelete:hover{color:#000;background-color:#f00;border-bottom-color:#f00;}.tablenav .dots{border-color:transparent;}.tablenav .next,.tablenav .prev{border-color:transparent;color:#21759b;}.tablenav .next:hover,.tablenav .prev:hover{border-color:transparent;color:#d54e21;}div.updated,.login .message{background-color:#ffffe0;border-color:#e6db55;}.update-message{color:#000;}a.page-numbers{border-bottom-color:#B8D3E2;}.commentlist li{border-bottom-color:#ccc;}.widefat td,.widefat th{border-top-color:#fff;border-bottom-color:#dfdfdf;}.widefat th{text-shadow:rgba(255,255,255,0.8) 0 1px 0;}.widefat td{color:#555;}.widefat p,.widefat ol,.widefat ul{color:#333;}.widefat thead tr th,.widefat tfoot tr th,h3.dashboard-widget-title,h3.dashboard-widget-title span,h3.dashboard-widget-title small,.find-box-head{color:#333;}th.sortable a:hover,th.sortable a:active,th.sortable a:focus{color:#333;}h3.dashboard-widget-title small a{color:#d7d7d7;}h3.dashboard-widget-title small a:hover{color:#fff;}a,#adminmenu a,#poststuff #edButtonPreview,#poststuff #edButtonHTML,#the-comment-list p.comment-author strong a,#media-upload a.del-link,#media-items a.delete,.plugins a.delete,.ui-tabs-nav a{color:#21759b;}#adminmenu .awaiting-mod,#adminmenu .update-plugins,#sidemenu a .update-plugins,#rightnow .reallynow{background-color:#464646;color:#fff;-moz-box-shadow:rgba(255,255,255,0.5) 0 1px 0;-khtml-box-shadow:rgba(255,255,255,0.5) 0 1px 0;-webkit-box-shadow:rgba(255,255,255,0.5) 0 1px 0;box-shadow:rgba(255,255,255,0.5) 0 1px 0;}#plugin-information .action-button{background-color:#d54e21;color:#fff;}#adminmenu li.current a .awaiting-mod,#adminmenu li a.wp-has-current-submenu .update-plugins{background-color:#464646;color:#fff;-moz-box-shadow:rgba(255,255,255,0.5) 0 1px 0;-khtml-box-shadow:rgba(255,255,255,0.5) 0 1px 0;-webkit-box-shadow:rgba(255,255,255,0.5) 0 1px 0;box-shadow:rgba(255,255,255,0.5) 0 1px 0;}div#media-upload-header,div#plugin-information-header{background-color:#f9f9f9;border-bottom-color:#dfdfdf;}#currenttheme img{border-color:#666;}#dashboard_secondary div.dashboard-widget-content ul li a{background-color:#f9f9f9;}input.readonly,textarea.readonly{background-color:#ddd;}#ed_toolbar input,#ed_reply_toolbar input{background:#fff url("../images/fade-butt.png") repeat-x 0 -2px;}#editable-post-name{background-color:#fffbcc;}#edit-slug-box strong,.tablenav .displaying-num,#submitted-on,.submitted-on{color:#777;}.login #nav a,.login #backtoblog a{color:#21759b!important;}.login #nav a:hover,.login #backtoblog a:hover{color:#d54e21!important;}#footer{color:#777;border-color:#dfdfdf;}#media-items,.imgedit-group{border-color:#dfdfdf;}.checkbox,.side-info,.plugins tr,#your-profile #rich_editing{background-color:#fcfcfc;}.plugins .inactive,.plugins .inactive th,.plugins .inactive td,tr.inactive+tr.plugin-update-tr .plugin-update{background-color:#f4f4f4;}.plugin-update-tr .update-message{background-color:#fffbe4;border-color:#dfdfdf;}.plugins .active,.plugins .active th,.plugins .active td{color:#000;}.plugins .inactive a{color:#579;}#the-comment-list tr.undo,#the-comment-list div.undo{background-color:#f4f4f4;}#the-comment-list .unapproved{background-color:#ffffe0;}#the-comment-list .approve a{color:#006505;}#the-comment-list .unapprove a{color:#d98500;}table.widefat span.delete a,table.widefat span.trash a,table.widefat span.spam a,#dashboard_recent_comments .delete a,#dashboard_recent_comments .trash a,#dashboard_recent_comments .spam a{color:#bc0b0b;}.widget,#widget-list .widget-top,.postbox,#titlediv,#poststuff .postarea,.stuffbox{border-color:#dfdfdf;-moz-box-shadow:inset 0 1px 0 #fff;-webkit-box-shadow:inset 0 1px 0 #fff;box-shadow:inset 0 1px 0 #fff;-moz-border-radius:3px;-khtml-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;}.widget,#widget-list .widget-top,.postbox,.menu-item-settings{background-color:#f5f5f5;background-image:-ms-linear-gradient(top,#f9f9f9,#f5f5f5);background-image:-moz-linear-gradient(top,#f9f9f9,#f5f5f5);background-image:-o-linear-gradient(top,#f9f9f9,#f5f5f5);background-image:-webkit-gradient(linear,left top,left bottom,from(#f9f9f9),to(#f5f5f5));background-image:-webkit-linear-gradient(top,#f9f9f9,#f5f5f5);background-image:linear-gradient(top,#f9f9f9,#f5f5f5);}.postbox h3{color:#464646;}.widget .widget-top{color:#222;}.sidebar-name:hover h3,.postbox h3:hover{color:#000;}.curtime #timestamp{background-image:url(../images/date-button.gif);}#quicktags #ed_link{color:#00f;}#rightnow .youhave{background-color:#f0f6fb;}#rightnow a{color:#448abd;}.tagchecklist span a,#bulk-titles div a{background:url(../images/xit.gif) no-repeat;}.tagchecklist span a:hover,#bulk-titles div a:hover{background:url(../images/xit.gif) no-repeat -10px 0;}#update-nag,.update-nag{background-color:#FFFBCC;border-color:#E6DB55;color:#555;}.login #backtoblog a{color:#464646;}#wphead{border-bottom:#dfdfdf 1px solid;}#wphead h1 a{color:#464646;}#user_info{color:#555;}#user_info:hover,#user_info.active{color:#222;}#user_info.active{background-color:#f1f1f1;background-image:-ms-linear-gradient(bottom,#e9e9e9,#f9f9f9);background-image:-moz-linear-gradient(bottom,#e9e9e9,#f9f9f9);background-image:-o-linear-gradient(bottom,#e9e9e9,#f9f9f9);background-image:-webkit-gradient(linear,left bottom,left top,from(#e9e9e9),to(#f9f9f9));background-image:-webkit-linear-gradient(bottom,#e9e9e9,#f9f9f9);background-image:linear-gradient(bottom,#e9e9e9,#f9f9f9);border-color:#aaa #aaa #dfdfdf;}#user_info_arrow{background:transparent url(../images/arrows.png) no-repeat 6px 5px;}#user_info:hover #user_info_arrow,#user_info.active #user_info_arrow{background:transparent url(../images/arrows-dark.png) no-repeat 6px 5px;}#user_info_links{-moz-box-shadow:0 3px 2px -2px rgba(0,0,0,0.2);-webkit-box-shadow:0 3px 2px -2px rgba(0,0,0,0.2);box-shadow:0 3px 2px -2px rgba(0,0,0,0.2);}#user_info_links ul{background:#f1f1f1;border-color:#ccc #aaa #aaa;-moz-box-shadow:inset 0 1px 0 #f9f9f9;-webkit-box-shadow:inset 0 1px 0 #f9f9f9;box-shadow:inset 0 1px 0 #f9f9f9;}#user_info_links li:hover{background-color:#dfdfdf;}#user_info_links li:hover a,#user_info_links li a:hover{text-decoration:none;}#user_info a:link,#user_info a:visited,#footer a:link,#footer a:visited{text-decoration:none;}#footer a:hover{color:#000;text-decoration:underline;}div#media-upload-error,.file-error,abbr.required,.widget-control-remove:hover,table.widefat .delete a:hover,table.widefat .trash a:hover,table.widefat .spam a:hover,#dashboard_recent_comments .delete a:hover,#dashboard_recent_comments .trash a:hover #dashboard_recent_comments .spam a:hover{color:#f00;}#pass-strength-result{background-color:#eee;border-color:#ddd!important;}#pass-strength-result.bad{background-color:#ffb78c;border-color:#ff853c!important;}#pass-strength-result.good{background-color:#ffec8b;border-color:#fc0!important;}#pass-strength-result.short{background-color:#ffa0a0;border-color:#f04040!important;}#pass-strength-result.strong{background-color:#c3ff88;border-color:#8dff1c!important;}#quicktags{border-color:#ccc;background-color:#dfdfdf;background-image:url("../images/ed-bg.gif");}#ed_toolbar input{border-color:#C3C3C3;}#ed_toolbar input:hover{border-color:#aaa;background:#ddd;}#poststuff .wp_themeSkin .mceStatusbar{border-color:#dfdfdf;}#poststuff .wp_themeSkin .mceStatusbar *{color:#555;}#poststuff #edButtonPreview,#poststuff #edButtonHTML{background-color:#f1f1f1;border-color:#dfdfdf #dfdfdf #ccc;color:#999;}#poststuff #editor-toolbar .active{border-color:#ccc #ccc #e9e9e9;background-color:#e9e9e9;color:#333;}#post-status-info{background-color:#EDEDED;}.wp_themeSkin *,.wp_themeSkin a:hover,.wp_themeSkin a:link,.wp_themeSkin a:visited,.wp_themeSkin a:active{color:#000;}.wp_themeSkin table.mceLayout{border-color:#ccc #ccc #dfdfdf;}#editorcontainer #content,#editorcontainer .wp_themeSkin .mceIframeContainer{-moz-box-shadow:inset 1px 1px 2px rgba(0,0,0,0.1);-webkit-box-shadow:inset 1px 1px 2px rgba(0,0,0,0.1);box-shadow:inset 1px 1px 2px rgba(0,0,0,0.1);}.wp_themeSkin iframe{background:transparent;}.wp_themeSkin .mceStatusbar{color:#000;background-color:#f5f5f5;}.wp_themeSkin .mceButton{border-color:#ccc;background-color:#eee;background-image:-ms-linear-gradient(bottom,#ddd,#fff);background-image:-moz-linear-gradient(bottom,#ddd,#fff);background-image:-o-linear-gradient(bottom,#ddd,#fff);background-image:-webkit-gradient(linear,left bottom,left top,from(#ddd),to(#fff));background-image:-webkit-linear-gradient(bottom,#ddd,#fff);background-image:linear-gradient(bottom,#ddd,#fff);}.wp_themeSkin a.mceButtonEnabled:hover{border-color:#a0a0a0;background:#ddd;background-image:-ms-linear-gradient(bottom,#ccc,#fff);background-image:-moz-linear-gradient(bottom,#ccc,#fff);background-image:-o-linear-gradient(bottom,#ccc,#fff);background-image:-webkit-gradient(linear,left bottom,left top,from(#ccc),to(#fff));background-image:-webkit-linear-gradient(bottom,#ccc,#fff);background-image:linear-gradient(bottom,#ccc,#fff);}.wp_themeSkin a.mceButton:active,.wp_themeSkin a.mceButtonEnabled:active,.wp_themeSkin a.mceButtonSelected:active,.wp_themeSkin a.mceButtonActive,.wp_themeSkin a.mceButtonActive:active,.wp_themeSkin a.mceButtonActive:hover{background-color:#ddd;background-image:-ms-linear-gradient(bottom,#eee,#bbb);background-image:-moz-linear-gradient(bottom,#eee,#bbb);background-image:-o-linear-gradient(bottom,#eee,#bbb);background-image:-webkit-gradient(linear,left bottom,left top,from(#eee),to(#bbb));background-image:-webkit-linear-gradient(bottom,#eee,#bbb);background-image:linear-gradient(bottom,#eee,#bbb);border-color:#909090;}.wp_themeSkin .mceButtonDisabled{border-color:#ccc!important;}.wp_themeSkin .mceListBox .mceText,.wp_themeSkin .mceListBox .mceOpen{border-color:#ccc;background-color:#eee;background-image:-ms-linear-gradient(bottom,#ddd,#fff);background-image:-moz-linear-gradient(bottom,#ddd,#fff);background-image:-o-linear-gradient(bottom,#ddd,#fff);background-image:-webkit-gradient(linear,left bottom,left top,from(#ddd),to(#fff));background-image:-webkit-linear-gradient(bottom,#ddd,#fff);background-image:linear-gradient(bottom,#ddd,#fff);}.wp_themeSkin .mceListBox .mceOpen{border-left:0!important;}.wp_themeSkin table.mceListBoxEnabled:hover .mceOpen,.wp_themeSkin .mceListBoxHover .mceOpen,.wp_themeSkin .mceListBoxHover:active .mceOpen,.wp_themeSkin .mceListBoxSelected .mceOpen,.wp_themeSkin .mceListBoxSelected .mceText,.wp_themeSkin table.mceListBoxEnabled:active .mceText{background:#ccc;border-color:#999;}.wp_themeSkin table.mceListBoxEnabled:hover .mceText,.wp_themeSkin .mceListBoxHover .mceText,.wp_themeSkin table.mceListBoxEnabled:hover .mceOpen,.wp_themeSkin .mceListBoxHover .mceOpen{border-color:#909090;background-color:#eee;background-image:-ms-linear-gradient(bottom,#ccc,#fff);background-image:-moz-linear-gradient(bottom,#ccc,#fff);background-image:-o-linear-gradient(bottom,#ccc,#fff);background-image:-webkit-gradient(linear,left bottom,left top,from(#ccc),to(#fff));background-image:-webkit-linear-gradient(bottom,#ccc,#fff);background-image:linear-gradient(bottom,#ccc,#fff);}.wp_themeSkin select.mceListBox{border-color:#B2B2B2;background-color:#fff;}.wp_themeSkin .mceSplitButton a.mceAction,.wp_themeSkin .mceSplitButton a.mceOpen{border-color:#ccc;}.wp_themeSkin .mceSplitButton a.mceOpen:hover,.wp_themeSkin .mceSplitButtonSelected a.mceOpen,.wp_themeSkin table.mceSplitButtonEnabled:hover a.mceAction,.wp_themeSkin .mceSplitButton a.mceAction:hover{border-color:#909090;}.wp_themeSkin table.mceSplitButton td{background-color:#eee;background-image:-ms-linear-gradient(bottom,#ddd,#fff);background-image:-moz-linear-gradient(bottom,#ddd,#fff);background-image:-o-linear-gradient(bottom,#ddd,#fff);background-image:-webkit-gradient(linear,left bottom,left top,from(#ddd),to(#fff));background-image:-webkit-linear-gradient(bottom,#ddd,#fff);background-image:linear-gradient(bottom,#ddd,#fff);}.wp_themeSkin table.mceSplitButton:hover td{background-image:-ms-linear-gradient(bottom,#ccc,#fff);background-image:-moz-linear-gradient(bottom,#ccc,#fff);background-image:-o-linear-gradient(bottom,#ccc,#fff);background-image:-webkit-gradient(linear,left bottom,left top,from(#ccc),to(#fff));background-image:-webkit-linear-gradient(bottom,#ccc,#fff);background-image:linear-gradient(bottom,#ccc,#fff);}.wp_themeSkin .mceSplitButtonActive{background-color:#B2B2B2;}.wp_themeSkin div.mceColorSplitMenu table{background-color:#ebebeb;border-color:#B2B2B2;}.wp_themeSkin .mceColorSplitMenu a{border-color:#B2B2B2;}.wp_themeSkin .mceColorSplitMenu a.mceMoreColors{border-color:#fff;}.wp_themeSkin .mceColorSplitMenu a.mceMoreColors:hover{border-color:#0A246A;background-color:#B6BDD2;}.wp_themeSkin a.mceMoreColors:hover{border-color:#0A246A;}.wp_themeSkin .mceMenu{border-color:#ddd;}.wp_themeSkin .mceMenu table{background-color:#ebeaeb;}.wp_themeSkin .mceMenu .mceText{color:#000;}.wp_themeSkin .mceMenu .mceMenuItemEnabled a:hover,.wp_themeSkin .mceMenu .mceMenuItemActive{background-color:#f5f5f5;}.wp_themeSkin td.mceMenuItemSeparator{background-color:#aaa;}.wp_themeSkin .mceMenuItemTitle a{background-color:#ccc;border-bottom-color:#aaa;}.wp_themeSkin .mceMenuItemTitle span.mceText{color:#000;}.wp_themeSkin .mceMenuItemDisabled .mceText{color:#888;}.wp_themeSkin tr.mceFirst td.mceToolbar{background:#dfdfdf url("../images/ed-bg.gif") repeat-x scroll left top;border-color:#ccc;}.wp-admin #mceModalBlocker{background:#000;}.wp-admin .clearlooks2 .mceFocus .mceTop .mceLeft{background:#444;border-left:1px solid #999;border-top:1px solid #999;-moz-border-radius:3px 0 0 0;-webkit-border-top-left-radius:3px;-khtml-border-top-left-radius:3px;border-top-left-radius:3px;}.wp-admin .clearlooks2 .mceFocus .mceTop .mceRight{background:#444;border-right:1px solid #999;border-top:1px solid #999;border-top-right-radius:3px;-khtml-border-top-right-radius:3px;-webkit-border-top-right-radius:3px;-moz-border-radius:0 3px 0 0;}.wp-admin .clearlooks2 .mceMiddle .mceLeft{background:#f1f1f1;border-left:1px solid #999;}.wp-admin .clearlooks2 .mceMiddle .mceRight{background:#f1f1f1;border-right:1px solid #999;}.wp-admin .clearlooks2 .mceBottom{background:#f1f1f1;border-bottom:1px solid #999;}.wp-admin .clearlooks2 .mceBottom .mceLeft{background:#f1f1f1;border-bottom:1px solid #999;border-left:1px solid #999;}.wp-admin .clearlooks2 .mceBottom .mceCenter{background:#f1f1f1;border-bottom:1px solid #999;}.wp-admin .clearlooks2 .mceBottom .mceRight{background:#f1f1f1;border-bottom:1px solid #999;border-right:1px solid #999;}.wp-admin .clearlooks2 .mceFocus .mceTop span{color:#e5e5e5;}#titlediv #title{border-color:#ccc;}#editorcontainer{border-color:#ccc #ccc #dfdfdf;}#post-status-info{border-color:#dfdfdf #ccc #ccc;}.editwidget .widget-inside{border-color:#dfdfdf;}#titlediv #title{background-color:#fff;}#tTips p#tTips_inside{background-color:#ddd;color:#333;}#timestampdiv input,#namediv input,#poststuff .inside .the-tagcloud{border-color:#ddd;}#adminmenuback,#adminmenuwrap{background-color:#ececec;border-color:#ccc;}#adminmenushadow,#adminmenuback{background-image:url(../images/menu-shadow.png);background-position:top right;background-repeat:repeat-y;}#adminmenu li.wp-menu-separator{background:#dfdfdf;border-color:#cfcfcf;}#adminmenu div.separator{border-color:#e1e1e1;}#adminmenu li.wp-has-current-submenu.wp-menu-open .wp-menu-toggle,#adminmenu li.wp-has-current-submenu:hover .wp-menu-toggle{background:transparent url(../images/arrows-dark.png) no-repeat -1px 6px;}#adminmenu .wp-has-submenu:hover .wp-menu-toggle,#adminmenu .wp-menu-open .wp-menu-toggle{background:transparent url(../images/arrows.png) no-repeat -2px 6px;}#adminmenu a.menu-top,.folded #adminmenu li.menu-top,#adminmenu .wp-submenu .wp-submenu-head{border-top-color:#f9f9f9;border-bottom-color:#dfdfdf;}#adminmenu li.wp-menu-open{border-color:#dfdfdf;}#adminmenu li.wp-has-current-submenu a.wp-has-current-submenu,#adminmenu li.current a.menu-top,.folded #adminmenu li.wp-has-current-submenu,.folded #adminmenu li.current.menu-top,#adminmenu .wp-menu-arrow,#adminmenu .wp-has-current-submenu .wp-submenu .wp-submenu-head{background-color:#777;background-image:-ms-linear-gradient(bottom,#6d6d6d,#808080);background-image:-moz-linear-gradient(bottom,#6d6d6d,#808080);background-image:-o-linear-gradient(bottom,#6d6d6d,#808080);background-image:-webkit-gradient(linear,left bottom,left top,from(#6d6d6d),to(#808080));background-image:-webkit-linear-gradient(bottom,#6d6d6d,#808080);background-image:linear-gradient(bottom,#6d6d6d,#808080);}#adminmenu li.wp-has-current-submenu a.wp-has-current-submenu,#adminmenu li.current a.menu-top,#adminmenu .wp-has-current-submenu .wp-submenu .wp-submenu-head{text-shadow:0 -1px 0 #333;color:#fff;border-top-color:#808080;border-bottom-color:#6d6d6d;}.folded #adminmenu li.wp-has-current-submenu,.folded #adminmenu li.current.menu-top{border-top-color:#808080;border-bottom-color:#6d6d6d;}#adminmenu .wp-submenu a:hover{background-color:#EAF2FA!important;color:#333!important;}#adminmenu .wp-submenu li.current,#adminmenu .wp-submenu li.current a,#adminmenu .wp-submenu li.current a:hover{color:#333;}#adminmenu .wp-submenu ul{background-color:#fff;}.folded #adminmenu .wp-submenu-wrap,.folded #adminmenu .wp-submenu ul{border-color:#dfdfdf;}.folded #adminmenu .wp-submenu-wrap{-moz-box-shadow:2px 2px 5px rgba(0,0,0,0.4);-webkit-box-shadow:2px 2px 5px rgba(0,0,0,0.4);box-shadow:2px 2px 5px rgba(0,0,0,0.4);}#adminmenu .wp-submenu .wp-submenu-head{border-right-color:#dfdfdf;background-color:#ececec;}#adminmenu div.wp-submenu{background-color:transparent;}#collapse-menu{color:#aaa;}#collapse-menu:hover{color:#999;}#collapse-button{border-color:#ccc;background-color:#f4f4f4;background-image:-ms-linear-gradient(bottom,#dfdfdf,#fff);background-image:-moz-linear-gradient(bottom,#dfdfdf,#fff);background-image:-o-linear-gradient(bottom,#dfdfdf,#fff);background-image:-webkit-gradient(linear,left bottom,left top,from(#dfdfdf),to(#fff));background-image:-webkit-linear-gradient(bottom,#dfdfdf,#fff);background-image:linear-gradient(bottom,#dfdfdf,#fff);}#collapse-menu:hover #collapse-button{border-color:#aaa;}#collapse-button div{background:transparent url(../images/arrows.png) no-repeat 0 -72px;}.folded #collapse-button div{background-position:0 -108px;}#adminmenu .menu-icon-dashboard div.wp-menu-image{background:transparent url('../images/menu.png?ver=20100531') no-repeat scroll -60px -33px;}#adminmenu .menu-icon-dashboard:hover div.wp-menu-image,#adminmenu .menu-icon-dashboard.wp-has-current-submenu div.wp-menu-image,#adminmenu .menu-icon-dashboard.current div.wp-menu-image{background:transparent url('../images/menu.png?ver=20100531') no-repeat scroll -60px -1px;}#adminmenu .menu-icon-post div.wp-menu-image{background:transparent url('../images/menu.png?ver=20100531') no-repeat scroll -271px -33px;}#adminmenu .menu-icon-post:hover div.wp-menu-image,#adminmenu .menu-icon-post.wp-has-current-submenu div.wp-menu-image{background:transparent url('../images/menu.png?ver=20100531') no-repeat scroll -271px -1px;}#adminmenu .menu-icon-media div.wp-menu-image{background:transparent url('../images/menu.png?ver=20100531') no-repeat scroll -120px -33px;}#adminmenu .menu-icon-media:hover div.wp-menu-image,#adminmenu .menu-icon-media.wp-has-current-submenu div.wp-menu-image{background:transparent url('../images/menu.png?ver=20100531') no-repeat scroll -120px -1px;}#adminmenu .menu-icon-links div.wp-menu-image{background:transparent url('../images/menu.png?ver=20100531') no-repeat scroll -90px -33px;}#adminmenu .menu-icon-links:hover div.wp-menu-image,#adminmenu .menu-icon-links.wp-has-current-submenu div.wp-menu-image{background:transparent url('../images/menu.png?ver=20100531') no-repeat scroll -90px -1px;}#adminmenu .menu-icon-page div.wp-menu-image{background:transparent url('../images/menu.png?ver=20100531') no-repeat scroll -150px -33px;}#adminmenu .menu-icon-page:hover div.wp-menu-image,#adminmenu .menu-icon-page.wp-has-current-submenu div.wp-menu-image{background:transparent url('../images/menu.png?ver=20100531') no-repeat scroll -150px -1px;}#adminmenu .menu-icon-comments div.wp-menu-image{background:transparent url('../images/menu.png?ver=20100531') no-repeat scroll -30px -33px;}#adminmenu .menu-icon-comments:hover div.wp-menu-image,#adminmenu .menu-icon-comments.wp-has-current-submenu div.wp-menu-image,#adminmenu .menu-icon-comments.current div.wp-menu-image{background:transparent url('../images/menu.png?ver=20100531') no-repeat scroll -30px -1px;}#adminmenu .menu-icon-appearance div.wp-menu-image{background:transparent url('../images/menu.png?ver=20100531') no-repeat scroll 0 -33px;}#adminmenu .menu-icon-appearance:hover div.wp-menu-image,#adminmenu .menu-icon-appearance.wp-has-current-submenu div.wp-menu-image{background:transparent url('../images/menu.png?ver=20100531') no-repeat scroll 0 -1px;}#adminmenu .menu-icon-plugins div.wp-menu-image{background:transparent url('../images/menu.png?ver=20100531') no-repeat scroll -180px -33px;}#adminmenu .menu-icon-plugins:hover div.wp-menu-image,#adminmenu .menu-icon-plugins.wp-has-current-submenu div.wp-menu-image{background:transparent url('../images/menu.png?ver=20100531') no-repeat scroll -180px -1px;}#adminmenu .menu-icon-users div.wp-menu-image{background:transparent url('../images/menu.png?ver=20100531') no-repeat scroll -300px -33px;}#adminmenu .menu-icon-users:hover div.wp-menu-image,#adminmenu .menu-icon-users.wp-has-current-submenu div.wp-menu-image,#adminmenu .menu-icon-users.current div.wp-menu-image{background:transparent url('../images/menu.png?ver=20100531') no-repeat scroll -300px -1px;}#adminmenu .menu-icon-tools div.wp-menu-image{background:transparent url('../images/menu.png?ver=20100531') no-repeat scroll -210px -33px;}#adminmenu .menu-icon-tools:hover div.wp-menu-image,#adminmenu .menu-icon-tools.wp-has-current-submenu div.wp-menu-image,#adminmenu .menu-icon-tools.current div.wp-menu-image{background:transparent url('../images/menu.png?ver=20100531') no-repeat scroll -210px -1px;}#icon-options-general,#adminmenu .menu-icon-settings div.wp-menu-image{background:transparent url('../images/menu.png?ver=20100531') no-repeat scroll -240px -33px;}#adminmenu .menu-icon-settings:hover div.wp-menu-image,#adminmenu .menu-icon-settings.wp-has-current-submenu div.wp-menu-image{background:transparent url('../images/menu.png?ver=20100531') no-repeat scroll -240px -1px;}#adminmenu .menu-icon-site div.wp-menu-image{background:transparent url('../images/menu.png?ver=20100531') no-repeat scroll -360px -33px;}#adminmenu .menu-icon-site:hover div.wp-menu-image,#adminmenu .menu-icon-site.wp-has-current-submenu div.wp-menu-image{background:transparent url('../images/menu.png?ver=20100531') no-repeat scroll -360px -1px;}#icon-edit,#icon-post{background:transparent url(../images/icons32.png?ver=20100531) no-repeat -552px -5px;}#icon-index{background:transparent url(../images/icons32.png?ver=20100531) no-repeat -137px -5px;}#icon-upload{background:transparent url(../images/icons32.png?ver=20100531) no-repeat -251px -5px;}#icon-link-manager,#icon-link,#icon-link-category{background:transparent url(../images/icons32.png?ver=20100531) no-repeat -190px -5px;}#icon-edit-pages,#icon-page{background:transparent url(../images/icons32.png?ver=20100531) no-repeat -312px -5px;}#icon-edit-comments{background:transparent url(../images/icons32.png?ver=20100531) no-repeat -72px -5px;}#icon-themes{background:transparent url(../images/icons32.png?ver=20100531) no-repeat -11px -5px;}#icon-plugins{background:transparent url(../images/icons32.png?ver=20100531) no-repeat -370px -5px;}#icon-users,#icon-profile,#icon-user-edit{background:transparent url(../images/icons32.png?ver=20100531) no-repeat -600px -5px;}#icon-tools,#icon-admin{background:transparent url(../images/icons32.png?ver=20100531) no-repeat -432px -5px;}#icon-options-general{background:transparent url(../images/icons32.png?ver=20100531) no-repeat -492px -5px;}#icon-ms-admin{background:transparent url(../images/icons32.png?ver=20100531) no-repeat -659px -5px;}table.diff .diff-deletedline{background-color:#fdd;}table.diff .diff-deletedline del{background-color:#f99;}table.diff .diff-addedline{background-color:#dfd;}table.diff .diff-addedline ins{background-color:#9f9;}#att-info{background-color:#E4F2FD;}#sidemenu a{background-color:#f9f9f9;border-color:#f9f9f9;border-bottom-color:#dfdfdf;}#sidemenu a.current{background-color:#fff;border-color:#dfdfdf #dfdfdf #fff;color:#D54E21;}#screen-options-wrap,#contextual-help-wrap{background-color:#f1f1f1;border-color:#dfdfdf;}#screen-options-link-wrap,#contextual-help-link-wrap{background-color:#e3e3e3;border-right:1px solid transparent;border-left:1px solid transparent;border-bottom:1px solid transparent;background-image:-ms-linear-gradient(bottom,#dfdfdf,#f1f1f1);background-image:-moz-linear-gradient(bottom,#dfdfdf,#f1f1f1);background-image:-o-linear-gradient(bottom,#dfdfdf,#f1f1f1);background-image:-webkit-gradient(linear,left bottom,left top,from(#dfdfdf),to(#f1f1f1));background-image:-webkit-linear-gradient(bottom,#dfdfdf,#f1f1f1);background-image:linear-gradient(bottom,#dfdfdf,#f1f1f1);}#screen-meta-links a.show-settings{color:#777;}#screen-meta-links a.show-settings:hover{color:#000;}#replysubmit{background-color:#f1f1f1;border-top-color:#ddd;}#replyerror{border-color:#ddd;background-color:#f9f9f9;}#edithead,#replyhead{background-color:#f1f1f1;}#ed_reply_toolbar{background-color:#e9e9e9;}.vim-current,.vim-current th,.vim-current td{background-color:#E4F2FD!important;}.star-average,.star.star-rating{background-color:#fc0;}div.star.select:hover{background-color:#d00;}div.star img{border-left:1px solid #fff;border-right:1px solid #fff;}.widefat div.star img{border-left:1px solid #f9f9f9;border-right:1px solid #f9f9f9;}#plugin-information .fyi ul{background-color:#eaf3fa;}#plugin-information .fyi h2.mainheader{background-color:#cee1ef;}#plugin-information pre,#plugin-information code{background-color:#ededff;}#plugin-information pre{border:1px solid #ccc;}.inline-edit-row fieldset input[type="text"],.inline-edit-row fieldset textarea,#bulk-titles,#replyrow input{border-color:#ddd;}.inline-editor div.title{background-color:#EAF3FA;}.inline-editor ul.cat-checklist{background-color:#fff;border-color:#ddd;}.inline-editor .categories .catshow,.inline-editor .categories .cathide{color:#21759b;}.inline-editor .quick-edit-save{background-color:#f1f1f1;}#replyrow #ed_reply_toolbar input:hover{border-color:#aaa;background:#ddd;}fieldset.inline-edit-col-right .inline-edit-col{border-color:#dfdfdf;}.attention{color:#D54E21;}.meta-box-sortables .postbox:hover .handlediv{background:transparent url(../images/arrows.png) no-repeat 6px 7px;}.tablenav .tablenav-pages{color:#555;}.tablenav .tablenav-pages a{border-color:#e3e3e3;background:#eee url('../images/menu-bits.gif?ver=20100610') repeat-x scroll left -379px;}.tablenav .tablenav-pages a:hover,.tablenav .tablenav-pages a:focus{color:#d54e21;}.tablenav .tablenav-pages a.disabled,.tablenav .tablenav-pages a.disabled:hover,.tablenav .tablenav-pages a.disabled:focus{color:#aaa;}.tablenav .tablenav-pages .current{background:#dfdfdf;border-color:#d3d3d3;}#availablethemes,#availablethemes td{border-color:#ddd;}#current-theme img{border-color:#999;}#TB_window #TB_title a.tb-theme-preview-link,#TB_window #TB_title a.tb-theme-preview-link:visited{color:#999;}#TB_window #TB_title a.tb-theme-preview-link:hover,#TB_window #TB_title a.tb-theme-preview-link:focus{color:#ccc;}.misc-pub-section{border-top-color:#fff;border-bottom-color:#dfdfdf;}#minor-publishing{border-bottom-color:#dfdfdf;}#post-body .misc-pub-section{border-right-color:#eee;}.post-com-count span{background-color:#bbb;}.form-table .color-palette td{border-color:#fff;}.sortable-placeholder{border-color:#bbb;background-color:#f5f5f5;}#post-body ul.category-tabs li.tabs a,#post-body ul.add-menu-item-tabs li.tabs a,body.press-this ul.category-tabs li.tabs a{color:#333;}#wp_editimgbtn,#wp_delimgbtn,#wp_editgallery,#wp_delgallery{border-color:#999;background-color:#eee;}#wp_editimgbtn:hover,#wp_delimgbtn:hover,#wp_editgallery:hover,#wp_delgallery:hover{border-color:#555;background-color:#ccc;}#favorite-first{border-color:#c0c0c0;background:#f1f1f1;background:-moz-linear-gradient(bottom,#e7e7e7,#fff);background:-webkit-gradient(linear,left bottom,left top,from(#e7e7e7),to(#fff));}#favorite-inside{border-color:#c0c0c0;background-color:#fff;}#favorite-toggle{background:transparent url(../images/arrows.png) no-repeat 4px 2px;border-color:#dfdfdf;-moz-box-shadow:inset 1px 0 0 #fff;-webkit-box-shadow:inset 1px 0 0 #fff;box-shadow:inset 1px 0 0 #fff;}#favorite-actions a{color:#464646;}#favorite-actions a:hover{color:#000;}#favorite-inside a:hover{text-decoration:underline;}#screen-meta a.show-settings,.toggle-arrow{background:transparent url(../images/arrows.png) no-repeat right 3px;}#screen-meta .screen-meta-active a.show-settings{background:transparent url(../images/arrows.png) no-repeat right -33px;}.view-switch #view-switch-list{background:transparent url(../images/list.png) no-repeat 0 0;}.view-switch .current #view-switch-list{background:transparent url(../images/list.png) no-repeat -40px 0;}.view-switch #view-switch-excerpt{background:transparent url(../images/list.png) no-repeat -20px 0;}.view-switch .current #view-switch-excerpt{background:transparent url(../images/list.png) no-repeat -60px 0;}#header-logo{background:transparent url(../images/wp-logo.png?ver=20110504) no-repeat scroll center center;}.popular-tags,.feature-filter{background-color:#fff;border-color:#DFDFDF;}#theme-information .action-button{border-top-color:#DFDFDF;}.theme-listing br.line{border-bottom-color:#ccc;}div.widgets-sortables,#widgets-left .inactive{background-color:#fcfcfc;border-color:#dfdfdf;}#available-widgets .widget-holder{background-color:#fcfcfc;border-color:#dfdfdf;}#available-widgets .widget-description{color:#555;}.sidebar-name{color:#464646;text-shadow:#fff 0 1px 0;border-color:#dfdfdf;-moz-box-shadow:inset 0 1px 0 #fff;-webkit-box-shadow:inset 0 1px 0 #fff;box-shadow:inset 0 1px 0 #fff;}.sidebar-name:hover,#removing-widget{color:#d54e21;}#removing-widget span{color:black;}.sidebar-name-arrow{background:transparent url(../images/arrows.png) no-repeat 5px 9px;}.sidebar-name:hover .sidebar-name-arrow{background:transparent url(../images/arrows-dark.png) no-repeat 5px 9px;}.in-widget-title{color:#606060;}.deleting .widget-title *{color:#aaa;}.imgedit-menu div{border-color:#d5d5d5;background-color:#f1f1f1;}.imgedit-menu div:hover{border-color:#c1c1c1;background-color:#eaeaea;}.imgedit-menu div.disabled{border-color:#ccc;background-color:#ddd;filter:alpha(opacity=50);opacity:.5;}#dashboard_recent_comments div.undo{border-top-color:#dfdfdf;}.comment-ays,.comment-ays th{border-color:#ddd;}.comment-ays th{background-color:#f1f1f1;}#menu-management .menu-edit{border-color:#dfdfdf;}#post-body{background:#fff;border-top-color:#fff;border-bottom-color:#dfdfdf;}#nav-menu-header{border-bottom-color:#dfdfdf;}#nav-menu-footer{border-top-color:#fff;}#menu-management .nav-tabs-arrow a{color:#C1C1C1;}#menu-management .nav-tabs-arrow a:hover{color:#D54E21;}#menu-management .nav-tabs-arrow a:active{color:#464646;}#menu-management .nav-tab-active{border-color:#dfdfdf;}#menu-management .nav-tab{background:#fbfbfb;border-color:#dfdfdf;}.js .input-with-default-title{color:#aaa;}#cancel-save{color:#f00;}#cancel-save:hover{background-color:#F00;color:#fff;}.list-container{border-color:#DFDFDF;}.menu-item-handle{border-color:#dfdfdf;}.menu li.deleting .menu-item-handle{background-color:#f66;text-shadow:#ccc;}.item-type{color:#999;}.item-controls .menu-item-delete:hover{color:#f00;}.item-edit{background:transparent url(../images/arrows.png) no-repeat 8px 10px;border-bottom-color:#eee;}.item-edit:hover{background:transparent url(../images/arrows-dark.png) no-repeat 8px 10px;}.menu-item-settings{border-color:#dfdfdf;}.link-to-original{color:#777;border-color:#dfdfdf;}#cancel-save:hover{color:#fff!important;}#update-menu-item{color:#fff!important;}#update-menu-item:hover,#update-menu-item:active,#update-menu-item:focus{color:#eaf2fa!important;border-color:#13455b!important;}.submitbox .submitcancel{color:#21759B;border-bottom-color:#21759B;}.submitbox .submitcancel:hover{background:#21759B;color:#fff;}#menu-management .nav-tab-active,.menu-item-handle,.menu-item-settings{-moz-box-shadow:inset 0 1px 0 #fff;-webkit-box-shadow:inset 0 1px 0 #fff;box-shadow:inset 0 1px 0 #fff;}#menu-management .nav-tab-active{background:#f9f9f9;border-bottom-color:#f9f9f9;}#upload-form label{color:#777;}.fullscreen-overlay{background:#fff;}.wp-fullscreen-focus #wp-fullscreen-title,.wp-fullscreen-focus #wp-fullscreen-container{border-color:#ccc;}#fullscreen-topbar{border-bottom-color:#DFDFDF;}ack-2.12/t/swamp/00000644000076400007640000000017212217205373012332 0ustar andyandy#!/usr/bin/perl -w print "Every Perl programmer knows that 0 evaluates to false, and that it is a recipe for DANGER!\n"; ack-2.12/t/swamp/c-header.h0000644000076400007640000000052412215743470014075 0ustar andyandy/* perl.h * * Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998, 1999, * 2000, 2001, 2002, 2003, 2004, 2005, 2006, by Larry Wall and others * * You may distribute under the terms of either the GNU General Public * License or the Artistic License, as specified in the README file. * */ #ifndef H_PERL #define H_PERL 1 ack-2.12/t/swamp/moose-andy.jpg0000644000076400007640000001720512215743470015035 0ustar andyandyÿØÿàJFIFHHÿâHICC_PROFILE8appl mntrRGB XYZ Ð acspAPPLapplöÖÓ-appl cprtHdesc1wtptHrTRC\gTRC\bTRC\rXYZlgXYZ€bXYZ”vcgt¨0chadØ,dscmLêdesc sRGB Profile sRGB ProfileXYZ óQÌcurv3XYZ o¢8õXYZ b™·…ÚXYZ $ „¶ÏvcgtáHáHáHsf32 BÞÿÿó&“ýÿÿû¢ÿÿý£ÜÀntextCopyright 1998 - 2003 Apple Computer Inc., all rights reserved.mluc enUSÒesES2daDK pdeDEHfiFIÄfrFUôitITºnlNLnoNOÞptBR2svSEÞjaJP koKR¨zhTW zhCN^sRGB-profiilisRGB-profilProfil sRVBsRGB 0×0í0Õ0¡0¤0ësRGB ‚r_icÏðPerfil sRGBsRGB-ProfilsRGB cÏðe‡NösRGB-beskrivelsesRGB-profielsRGB Õ¸\Ó Ç|Profilo sRGBsRGB ProfileÿÛC   ÿÛCÿÀNdÿÄ  ÿÄ:!1"AQa #2BRq‘3¡±ð b’ÁÑÿÄÿÄ5 !1AQaq¡"#2‘±ÁÑðBáRbñÿÚ ?Îir>ä°ú«s5QM.\J£Çs!o¸>ÿ´,]TÄž-¶¢7¤ÈL…N‡øŠÂiE‘§ÔšR Î~©Õz¢WC¡R–@L6´‡gºy%綆0•(ä”íÏÛ›X÷H¿në|ÔƒN¸&f.–…G}Éù<[–ýb ªµúcGƒ$Ö•šT×ëøŒovo[òÍ•ŠßSËä#±q”sŒ|µ|‚7ˆ€¥|ÈÔ*'ŒZNñ)ŠW´ä꺗xEÆ•h¹!I³ãUTªD$Âö†ÙORz?jUTÎÔ¦°'²Ùÿæ®aNdt‚˜z]ãD¾Îk%Ááo£óž\_‰Ì†ÚB–ÞØòò ʈœh.-1¥òšÅㇸ §’’R74°îaÙ…ytÞÒëu­Ðû‚<ºU~ª ÌiO–KêHS(9çk¹Ú•çxO¿]J‚•(`o-j‘õ¶ÕSÄroÌq¡ä»±:'fK¿oÇnÆRPêÚgÌ^â ÀO8BŽ>œsÆ h-ÒRRbކ©÷H =a۬JEr‘F¯Qœb¡H™±$42‡ØqhZ~…*IΨI41 ‘¤wyƒÓ†Dd‡GM|¡šcÓ¬ð¥[¾"0”Ò#J¹*µ¾¡æü'b QŒà«Ì#¶si‚d¡µ%"¼"÷£Œ8i/˜„^‚Ý.—vZ5Z´#P‰a™¨+t©jÂÇ`¼¬mÏÔŽÇÆˆ†[ÎpO3°üÔÆ§™0§§¥),hVh¥rNæ¾Tv‹"Us¬÷–ú'Ñl Rö?nÑ>FBƒ{»à ‘ÜŽ3¦¼&]ÇjóƵþ¥9EÌØ³8D¸‘T~¼Š2xyXCÕ!ÇîrtƵF6ÝÌ}ן¡Ù´‡ë—=F5&šØÎ÷O+?$§º#¶¨>òSseeâ´¶*`[ÅE¡M~;«¸eBJ— X<‘Ûp÷}}»èz¦…*`ûyn`íHfú)×>õ®Í&’ýF•r‘9¶ÙQÆv•äã'ƒÛTœ·(íÌæ¾1_jõÌ? ”ú”F7­»ŽNÁʂҤŒ|òHÕì ~þœÄpËt"8z!áÆûG„ΛÔ-ËéËw«]6–ä‹®‰Kš‰r ÅSë}‰-yd¥. (…”’’°r[ Ö™m×ÔÒö&£ûóNäÆ=VmC›lENàÓíÎz­JÝñqÑh½OkCÿ®¶JÄiá yK¨ÓœZSñq”qÃn­µ9h©xÀRu©·ý]ÑT®Â¼¸Ç —T›º¯v¯#È÷s‡ µv3ן³âð!ª‡P¨S`ÑëHiÐVôÆÞB™|(cÔë ܬ~ èöÔXD©gðMé_˜¦ð1RÊbl-¡@ Hü‘üFŠýœ³EÕàËýEĸ§ãP!~fwKÑ@V}ö°›h%åÌÀ¹ô{õÆÿ[ƇD¥6@ئ¹‘V=¼}Ë´XµmËrBØ…±´Ç§0†Ò¥Fm°’WÙàsžúgÌm”””\ïû‡\¦…h,‘IräJ¬¼¨îT¡l>süyhls½Côüʽ»é-Ðî¤WÚ­»Ã³3Jeµ(‹PÖ«ûé-³nÒhŽõ&ÐuÖ[ÜóŠšÄuGrÏñ“ôZ»¥¦Âó632ìäÒæV“íváWÿˆî›Ù¶¼Š…µY¥ÞUµ‚ÛŠç˜Ó+ìâ‡ËåÜèdôÁB´'s°œNK²Fð¯t"ͼ|fõqº5åsJU† ™e.¶†Aô¥ ÆHÀ8ï¡êmZj7“h(¸}&ðÃÐköi²­ºGÂyk%åGCªsNT®HÝÏ^Å0çÔU$Ƈ,ÂR†Õ÷ÑNVgN>Õ¤»;èq ºÏ¶Pâ0¤Ž29þ{r¾ì“ÈN¶”Aƒ®2ÃC c8üfRo[G¢5þ›R¯JõåÒ©SYq†¦+ÍU)ô+-³ÈA9Fäàr2žÊÑŒ¥‹Õð‡…÷çÎjÊÁ¤øí|>`ÿ¸x4ñ7qô²¹gßv5öš‡U—ȵztÂ¥2ôD8Y”҆ךq * çò¨\q|89]"œŒSÂ'Ó:Uš½>½ûÆÃѺ·dݵª}íc¹U°(L­ædÑÛBBié}¢ÓñPà^‹‡TŠAÙ· )Õ wÄÀKo‚Ž=¸Ì8C­4P¥Wn£pzýcšUÁiÛÖmõG> ÃU¹LéHRžœ¶7y%#æ’âÀHîx:eN×ë* W1ýx”¡$6›Óó¼<:}¬¾¾Ï^„Z}ñMêý6²šÍfe.T: ¥76+ÒL”î!@¶âKê ‡s„ÙŒ9çf\Ji¯xËhp:>1b įøŸ~ÍØçÊL¾¼êM°ÿ7F¤ÿƒšà1|A¯¼å_Ï[u“Ó¦Fr?ÂÆvRÿ+©Ár;¸<­9Ü€“œg:ô““&0×SE!CÙPÁ’l)Dt5‡[ìÇdRo»„8ÖdJe Æ’rsÛEU(à4Hˆ0Ù¤¤Ô›ÆßÔ¨Š¨a–—ÆÝÊQ?Ϋºú[N•Š˜s•}ÕdÀ:ç´©”åÔœ‘q3!í™KiŽ;•+è}´¡:·T´3´´( ªð¨uÌ¡\ô©• Ž&$ôª;±]Î×Ðr’}lbËIsJqµ’®:A_- ifÆÑš4ö­µsViÒç¿tR¦8Döp)æ”í;„œ¤+¦æs*Üi*Ô#cæ>±–Íåç%ßQi$é;Šü¼£Aü>X•)ÖãkûæBiʘãM´P>!”«%ÓŒ¤,«±*<Ÿa«bhN‘K˜cÃCϲ]<-u¿J¦QR¦Ñ„TÐ’µ—rG³ÉúãÜöщ ÀÒ„«©3‚ºâ‹ÂYã&×¥ßíÐ#ÜTx5b$6–¡¬%Juô‚‚c…) gÄc¶©cŠ)y/°H&Æ!\T¢åôÞ3¸ôs§Ôõ½Ø´ÒâPZdyŒ¯'(P<‚FnÚ î#0Uu˜\D³4ØE6=諉Ûõ‰(HžÒVÙQÀfR2P¡’0r 3î•ν•›˜N!$¹UüDjOEo­Á>å—‡Î"e½Ò®©;þà‘B¢uÊ4IÉ¢D¤Æ !)zlöÑÂŽ •ž·^zo {Mí[™–P,DöÎÛ½ê6Øt;Â¥¾ût¦ ÊrÇ6Œð ׿°PIAˆ¦3ÒƒAÎ1Öí½/ý×W¤×kõ a岘kÁܤ¬€O½Éú}uzM”6j7Ž_Äßy:Tj7ðl@¶cO½nj¤ D5NŽä´å¤ã%õ÷YãéønLM"Þ zC5Ö¿­Ùô™TëNu¹*BL%)R%)Åg C …0G|ã¼h ê|r¶Õ¿Ø|àûXšYs…ã5ñIÕ+¾ây˜•ÓiÄ-ÇU"2¶ì 9Æì ;ÿ¦‡¢MÄ+ÃUÌZñq%ÄÒ£ÍÖÛªý2™gI›JaËb¹ ÙôÉNŸ1áa¤RTB?¥IàçT†â-rËöT“ÚÇyE‰ÌeÆšCèºT;Þ›w¼S-‹¶¹Ô(“nÖ$L¢\°TÔf§;-M4û(õO%K%ä(p0 q¨šË-¶•¦‚ÿ;Z(/7¸Î—ªª’í{Ã7dx˜¸lê{´ZÚ_¢Ô\'*u!;¿îBÇ ƒyơðv]*)ƒsY¡Ç˜Þ׋ý/­uç²ìI¯N{üg Ê—lü°?¾ˆ¿(Ê—ðíØÆH©6ŠwRÑqu[ÕKâ©I~[îuÆIÁO(zBy'=€LN[z~a("Ûžƒ÷ˬÆó‹RÒê"õê·LîªÚ‚¥SÍ£~=P úl´/â!`y%õ¸ –úSøjYå~ZTrTIÒ±DLM½ã<%*9Ÿû|í^µŒ‚C=¾ËziàytùpéðMÔ›½ÈÕΣL“dÒ¼öa´”½9Áù‚T2PÈÎ?6åwôu3Œ(š¦æ!*m5JED3’ºa[EÁØÞ뱘JŸØá'ki êO?Γž`“¼[LÀ¹†jÔ§À ÐÕªóÂ20ÒrÛyúŸ÷NÑàbº«[B;ct›§6EÙL¹èk’–n'U—éíÊ‘PS®¸â6¼æ-´¶(¨Ç@Ü((ò ú˜Þ²ìƒoáu j:«ò4¡ùµ×K¥­Êrh´˜‘Ô¢œ"3iÚÉìž8#RÏ8H©*<ã÷Ž¡t>Ƹ¢É‘•L‚T‡šd!ä,r cƒóÈïs Ä)£n‘`É¥BÞp²QúܬUéÔpj/&0S ”8ÞV0†É$$“ƒ¿¿¿°Õ0â–±¨ÅäÈÑ$R,¾%z«áÂúè¯ü›­²í[Q)²!4´¢Ÿ-¬´PËŠH!@dž}õó—.Ì¡TRl1Ê.K©€…K(TWÎ[rB4¸í¯.¥X–‚ý=:ASÃ*¨ãçÛ—&Ôóê¨á ÙÃC2èr»*ý årÚ=G¢ØN¥¢Ûœ¡9L6”¯>Q*ÿÄã:oT¡H:£6õÄ­iÑX]ªÐjVìkFì±\ Òd%HDɦØ[*HüCß$ 9UòlŠ'V¶Và4Ôî/^¶éqÜAÉt¥zIA´£®þê­Zì• ™£î(á>B[W)ìcÎ[˜(åA<'¿¹×¥²þ™D·skñ'ûaÀ^1LbwÖVTíºp—^§£ÈÝÓEªB¦ † ª„h艺4,©ä§8[Ç's§''ßlii„•)÷”T£[›BØ”Á´ºHµøÆ¥Áññ1K=<°nó 2_{dvÂ?w$¨ŽþÜãX]~Li&ZŸ8nÊ—R* •j0‰MªºÄx¡LDSj$þg3ØŸ–¸q•pÈ)ã¹-êåmç­Éz©È'ã$)Hpûú€9ÕC ¢oÈ@¿¦w¥&Ô¹¨VµåIq¡52ž¤K@.!™m—[ NH•‘Ï –…¿(ئ¡{ÐÆ¹èûH ’qTÔWkð=ÈúN%JJæSf*\U²„°¥¯vàœ§ ?»Ó‚q®Bþ\c0͹)>¦$íK”ÜÛÿ?¨£ˆPœ[ÎN¶¥Î}K'|wrœ}N{ûÿkÖ²JCcÆ@Q=xGŸ§q' ”ee tãþ˜õÓ¨Ô!6¥fôš–TŸ.Cña¾”¹cŽG<uãÆŸZEBcг2Œ¨ÑkûA5ÏCe÷S>Ï¥11-¨- AI8*gß]ÕÞ¢>'lÜ*ÑY«xôꤔ)˜Öa¸çà¤! qJÝÀ’Nq¨—<ºÐDˆÂ¥Tv‰Op/*ïUº_&ãßJ¦Rë.)¦”€Äµ²áòKžïÛ”„îÚ1¸ƒÆˆ½—fD±šX MéßóÎ:Æ¥DÐe*þúuãÂ46ò“2•xΙ­ÿ‰³nrqßBx{miBc®å*ir82RJÒ¬àŒý?ß¾£$&ñ÷Ö* TvŠ=Ji»¯*…qQ¢ü{1ÐÄ?7òÂÈüGP3ÂÉãpçdè›.:Tâü¼þ€MáHëM¹B‹V}Ræ¿S«–‹8· Ø þxí “òÎ& Ã ›Èq°²¢L"—õuç(â…Ò¥9 ¡Ž »{põ×X$Š‚ÂÈá ù‚y%²ØÜŸ´wØ´9#Èš´|Dè’ÂD¶äJRPH#±* iÌ&‚X¯Hqhn¡Tºs̼ÒZ<'sY#eÉ£ªîaÆXû±Ú$&-Õ[ui@ zZä{ê¥bx Þš•qùðY®<Û¨J”X”[@^0} à3ÇÏ^Ÿôqé g C£ª ‘ñ*éÜ}éòŒ[7å{mÆ4Vên“uÁûÂÄLS‚¼wOÓëÆ>šóû¯-µ—e$ÐŽ£xÝåÖi*MÁ¸êеÕàܱ¼Öc4ã`îÂOåÏþõ;šÔ›ZA¼ ë(¬[Ô鳪Ë5%';JÎÔûóªí¥M&ªÞ9-(hÚâ±^Ÿ1åÔ*NÍ”ÿ¤!eÁÊœ ÀìO¶¨­U%J‚O:ãMØÅRØéÌ™ïŠýN­K“kR[PYQ¥m‘¹œíPþùέʺ BRm oÞª70F>§PZzd+f ‚^Je*È”yÎGr8Õæœ*:B~°=S"žÔm¨TÚuË}”Ö|¨Ë,¼Ûå,8®JHÁÜGŽ5ŽHaÕ­É…Tï¤ZŸ¸Žs5<€”0(6©¼K¬B©!§iþ[L[R[ ”n$å@üŒÇ2íÍ%©¬,U<úÁ+76¦ ¦Ž’ùGrH.C~:Y¤‚Qù‡ßç¡’Ù X% *€Óo÷_ÍXrO´ð€M µ9MqÀ¢Û©#‘ò<|g{‹+ÍxòZ”#Íxë>Ð ‹·QK²èT62Èy ¡œ¹?è5SÒ«K2GHãÑãçÇ{¹üG}:¦ÏNìùŠŸMb¼ÝQ.©(-•DRÈZO¨S‚8=øÁ\ÁZK2ÉMõ:I¨áAù† IÅ=0UÁ±CÖ§ñ~‡^³/–;K¢[ôjd<5äÃd ÖË„“Î`¨œ­DóôÔ¢AÄO´\URªƒô }ü¢æeJ/æ 8Ý.«Ók­©R7®‰Tu0¨îR®ƒìB·e=ˆ ðr/˜²è}‡çZUÒˆU˯~|ñ¨àŒ²û2n¦¨q5ONc·(†¼åU¨´EÕ>%™lr•' þ¾Êÿ- JϬ&þüºuR{Ǩ•iæLp â R³ô××g ìDD’SC ]Ëi¹F©Ibs°*ÅÚqK8ZŠNr¶ÇËUQ8CÁ'áÚ?ER)¼Oôžè™U=VY«±!²=d¥N‘øk#ºIWæ;Š}Ö¥)“›y²°iAXÍg±¥!T" õ÷™‡pÕ­f#RÐjH;·½ ¤‚Fw ~ŸØQo -T©UÓnâ#3z’-¼D[uTÉîSÛP4çÊÔî¬ØùgZ&„!öÂÏÄ8ô…¹ÙÅ!Tá4ºìäG¦G.”6f»íÖ€Áä~ÎþÙÕü>X¥Þ…ü¯úˆ§UíºŽ ý¿qø¨Þh3dF§Dd²êÕ!^a9Þ¢Iíí§Å4Ü¢ŠRšêös "³ )F”·ÈGÿÙack-2.12/t/swamp/perl-without-extension0000644000076400007640000000014112215743470016647 0ustar andyandy#!/usr/bin/perl -w use strict; use warnings; print "I'm a Perl program without an extension\n"; ack-2.12/t/swamp/perl.cgi0000644000076400007640000000024312217205407013673 0ustar andyandy#!perl -T use warnings; use strict; use Test::More tests => 1; BEGIN { use_ok( 'App::Ack' ); } diag( "Testing App::Ack $App::Ack::VERSION, Perl $], $^X" ); ack-2.12/t/swamp/Makefile0000644000076400007640000000156012215743470013715 0ustar andyandy# This Makefile is for the ack extension to perl. # # It was generated automatically by MakeMaker version # 6.30 (Revision: Revision: 4535 ) from the contents of # Makefile.PL. Don't edit this file, edit Makefile.PL instead. # # ANY CHANGES MADE HERE WILL BE LOST! # # MakeMaker ARGV: () # # MakeMaker Parameters: # ABSTRACT => q[A grep-like program specifically for large source trees] # AUTHOR => q[Andy Lester ] # EXE_FILES => [q[ack]] # MAN3PODS => { } # NAME => q[ack] # PM => { Ack.pm=>q[$(INST_LIBDIR)/App/Ack.pm] } # PREREQ_PM => { Test::More=>q[0], Getopt::Long=>q[0], Term::ANSIColor=>q[0] } # VERSION_FROM => q[Ack.pm] # clean => { FILES=>q[ack-*] } # dist => { COMPRESS=>q[gzip -9f], SUFFIX=>q[gz] } There's not really anything here. It's just to have something that starts out like a makefile. ack-2.12/t/swamp/perl.pod0000644000076400007640000000007712217205416013720 0ustar andyandy=head1 Dummy document =head2 There's important stuff in here! ack-2.12/t/swamp/perl.pl0000644000076400007640000000024312217205412013540 0ustar andyandy#!perl -T use warnings; use strict; use Test::More tests => 1; BEGIN { use_ok( 'App::Ack' ); } diag( "Testing App::Ack $App::Ack::VERSION, Perl $], $^X" ); ack-2.12/t/swamp/perl.tar.gz0000644000076400007640000000072212215743470014345 0ustar andyandy‹`0 Jí—[kÛ0€ý¬_q’ÒAÒønph!¥¥äamYÃØC·¡&J"ËF’IËØŸ¯—µ”°R{]s¾É–­#Kç“pÆä²«™Ò{Úª ÛúþºŒÂð²Àõ=˱C×ö/p=Ëv<;ð-°+Ñr¥©°èÒL“Ï>·©ý?e§‘™ €îˆ\1XQ)¸˜©þúJiÉǺ¬ÌçÇñÇT2(ÒEÁþ8}BO†§ðƒ€Á<÷=]ìB{eq</Úð¡O~2át¶ Í¢Ó;Ü6Cë¶ÇŸ?] ÏN;p^Œ§õµ­o_šÅûÿzŠÞ5ÅêwW\ÏÓ\wÙµfBñT¼nŒMþ;¾óÈÿÀóô¿v½\ÉÞ½r#X‘'êßo ™äBCsØN€–¢f2IšÀï*à.‹.Eí}㋾7žñ*cüýùïzQˆþמÿÛÍÚÿlYiŒøïúú_èÿvSúŸTã%þ6ú_èÿvSúŸNªŒ±É;Šûï›ý¯ý9£Žò$¹I:Î&4!ëÛ.ŒæL²¶žd©ÔÔüû+O§À- tAAAAä­ó § F(ack-2.12/t/swamp/service.svc0000644000076400007640000000007112215743470014426 0ustar andyandy<%@ ServiceHost Language="C#" Service="SampleService" %> ack-2.12/t/swamp/perltoot.jpg0000644000076400007640000023233112215743470014631 0ustar andyandyÿØÿàJFshÿÛC     ÿÛC   ÿÀ¼8"ÿÄ ÿÄm !1A"Qa2q‘ #B¡±ÑRÁÔ$3brÒáð&Cu‚…’•–¢²´%4568DEFSUst†”âñGTVWcefvƒ„“³Â'(Xd£ÄÿÄÿÄ+!1AQ"2aBq#¡RbÑÿÚ ?ê4j;AÅ046<ôѹÀ ñ< â‚`ö…ePF‘hf‹Q… “´‰ Ðå-»§saéÚ#Y‘Šå06¬WgVÄŒ«õ!;y´>€ó·>bÉãÖ˜§Óßô™zb–ÓŽ[›—±ë[ÝÙ8†®î ®Ô*o›½6úßWµJ$ýðÞã²*‘É'lÆàò€¡{FÃÎL2L ÄfÛZ1cx —MÖH™H pé9VÁq>Ø™Sq¤ŽDG&]X»¥žï”ËíËhR„i<ºAǬsYÒ4-ïÊ5ÐGœ9»/«”h‰B“½¡ØèHÛ{_¬+@îÝBã CAVñµïqm¢[²¨ÖÉ'hݶnoÊ56 °º ’yD³Pä#BLj}ùF«Z¼À0YQM¡­7¹1¹{HîD!J‰Ür… wBn«Ÿ(TUš:âÈ%[yH´Üƒ Ë€’7ðTÙ'Õ0솄D×-j•ˆ¥ÔâËl¸BGœF•Ö°4ó‡¹JršxXX¤dãgCÔØqs¥EzH´$˜žT­ú‘´m—Õ†q ) Ì\OK$!À~°Œ;Õèi]Ô?™#Ïj ÊêÖ6ÒôãªÖß ‰j°Ûw~·šjŒÛ;­ÑwR¹ûã¶Ð„÷÷ënº¨ÒQ};mh`[o®ä$‘~qÑDºÛKg“¶<÷b&¥ÆÜGuZSÖ˜mÍVPåÔ)w#hD›32£u/E¹Ûx7SVM”à7ÜíkC›¶ôl„et´[c¸ˆ´Zm ¥KK¾·ò´J©ôË8ÚS©G®¨‰*YM„l*“{€oèÕf’: VнùE§EŸmIMŒrm U!½ñja¬zP8žbÑ´rYÑ2¯¥`aÁ*Šò‰DÂß½âc'<—R7ç 1´;!Wñ´fÛÁ-ªãh4s$0mçßdõ`o~À26ÔLUjÚ Œê‚ÔíŒl­ím£E7ªØ‚Ý|›ÞL¾tž¹l›C|ë* 1,õfaZH½‡Œ@ªóÊmJÐlzͼV”.Æç”Uø‚aàâ¯q¶j‘¤Ýq@’¥_~PÏ5\&ûÜiœ˜RI*Q0ÚäèR­xå”™qV9MTÔêM‡Âõ-K¸G.wƒ$(h•eÅ{ÂïAp¤nDfÙ¿ë]…¡Â¡]Ø«rÊBù@‡ÈÆUg :A7ŒZâ7Þ0@±dä5 Þ0æ6ÛFaX µs¦7ØF¹†4¤Ç!ü¥©š~QR¤Zqm±9<š µéÒ|ºû„uùå!ò¢T^œ ìu½2ñóPì&ÛB–“<øP²·FÊ´l±¤>q‚>ÏìG0Eã09Úà”¤(^6KdtŒ [qÒ7eØc¶ÑHÕ‹…•ÒCE*I¼:É>zmOfÐtÉs^¯B:A‰öB*k¼T“¼8iÛm£—§Gtw³R.zZ´ó´eI€ ¼!YTÆß-Mï±…|4”ØAa&ñ%PV ö¼l”m´ò‚I H ¦çxÕM “,­[ï (6îÁc¡·‡Ý—/´: -;Z5,”mk±ñ®$B¶š7~£¤Ë:Un†"_ÑI#º­¢,j! §‡c§­¡Ýé¤ ƒe&ÜàMȆ%õ¡:ºˆŒÖqz.9F±Vg?Ô½2Å2ó¯‘2Û3 Mômq2ªVŒ²Ö… #Â8þÜôõI¯D˜q¥©v Jˆ´tÆ¢Ô)Ôå1Vt>¢Ðá7R™d”Qæd|ö¦ñ;©Qµï oWß|›¦ð÷1Oe{%#—3¥‹‹Ï’ös!¨¾_=ä›A­HqÃhpL‚mmÀ…ÒÂâ€ûL.HÕ43|ÖFâÐr¥…¹ÄÅšÒ./mý°Ÿåö`geb±OË,Õ}ªBø3µIéÄÊÊ¡í¾‰*>º·¹í²:B–¶FÑ>¤¨Rš€R<Ï(±WØ£´Ë»§a¡ý½oñ‚Çb.Ói=܆Çöõ¿Æ:> ™rEnëÁ{›û¡ºa««apbØ=ˆ»NŸ÷“‡?¿­þ0Ø´à?ë' ŸíãŒ5†h9"²§H•,mJ —ZMío’Kö/í=-ºp.>ÚëŒ87Ù/µ#^®ÃßÖÿ>I!ó UÔÁEÕ} ¸•¥:– ŠŠ_³j©q¶ÂçÛ^Gã²yÚÂL8 xבü(k ý›,«Ù|IÔ›ZEÕ ›™J8¤¥ò›µ´¿,»Â‡û~ŸáC›µÃ"ßÌÓ/Ûˆü(ì, .ƒÊ7æÑS7„;[£ÿØ<ÿÒü(8aŽÖÃÿ˜;ü!ŠX¤/’%«kˆꊯògµ¿þjðoøB?…üšín ÿ™^ ÿGð øä$KT ]`o¼UCv·ÿÍ^ ÿGð£#ö·ø+Á¿áþ?ŽE|±-SË”%y°¤ªñZ9ÚÜóʼþáF‹ÂÝ­–,r¯úB?… ãžX’ºÄ£jl‚"­ÅRm4UqsSµŒÀ!Y]ƒÅü1üb9TÈþÕuKëË|&‹þm}ŒdðM•óD­1¡¢­;os6­dƒÈÅ“=ÙCµù%x &þä~0]Ž;O+ýáá¡ý¾oñŽwâÍ•ñDF^¨[ò…H®hNßœHWØÓ´úÇúÅÃCûzßã§±iôŸõ‘†Ïöõ¿Æ'ðæSò"ýŒj­•'œ&z]Á;r*Oc^Óèÿx¸hÿo[üccØçµ¿Ö.þþ·øÂüL†K,W²0´©~^1²m)ÕpA‰²»öŸYÿXøl{+­þ1Ÿç0íAÃÒ0F·õõ¿ÆâåúÌ‘DÓ-&ÝcG*ÈH61,=ŠûOŸ÷•‡?¿­þ1 Ìܢ͜ˆ’‘©æNf™B™y2Æ­KžDÓ,8£Ý„ܤW¼Cðæ•´j¼…ÐKÕe9@‚[§r%Züh¹IÙè¨Ú3tÂ_I󌓧#I±.!0npb\OXwô; #ÂŽ 1’nyÚ ‚0¡´qÊ_ƒ©e½´B“KœS.lêv>ÀP?ºŽÎ#Æ)Ž×ôf«]ñ“. /…*&~… ¦…-ž9M­b#Pw)?1Ð[^ÜÙ«mÈç¨äÛaÓíŒZûÆàZÁlͯ¸…  uH0{dXFM–.aÆÀ#—„Ú4¨‘ˬ"µ6¾]Ãã\?TŽè1¬PáIu%Ѥíhb9DfI%—[Ê$l,¨ ˆÃ&™Ù‰ßa… ŒpÈç t‚c„7ŒÎš * X¶ý *É6AlzB±‚ÝÑnf oÀ‹˜Å®6Ú2€«ùÀÆ…’èMŽ¡¹… ¶€9{á"Ð’I¶ÜÌ'~¦”-¬r¼"­.Ç5„X€Eá7QÚÊñ¥æxŠÔ§ü`äÖ¥Ût0Í–£ÍPø²y¯±È˶eJˆ:‘½ác-¦zHg¤ ›¨6Ô’ÛH²Ô°…Ô ¡,lOœKTkž„ó5q.ÂYpÙIîòˆ¤Ý6bµ8T‹%¡õ”m|eJ‹—šh(³0‡Mcb †0åZf”ãÒ…-Ûr§HÇxÚ ¾ŽL®ÝH&’šeë[á|+-Îx¤^ÞèèfqUÑhÓ縌†¸n$ +PñŠ&(Ò5ºýZ™S—5GÒ–¦¦nãMñQe4z*öÂc¥e2&Ÿ„ðÜËô9鉡(¢á–| é½”E¼ñ«†ŽI;%¡¡hmÆû— æBº(6IG„&"lª÷ÙBa´€Þ>øçqGŸL5½zT-²!´ôˆóÌ‚¥$[{˜JåiÆœs—æõˆi”´Ë·“¤r×%hvXã¨ë؆¦·mÖxÜÌp„¶(²•¿ŒwÉJ«öL—>5ê™ÿý£³ÃMXò;£°ùtÀHÄÐs¬#1Ê©0#xPíçÛÎ7®Ð´m ]£·H̺ #hPíTm ] j A@k´b7 qŸtm‘îŒ[Î7[μãx¤Þ*Hç”I s±†hêHU¤Y"㨙fÆ:J9Ãå?þËóKúÞ×ùËPPlPíó<’ne›ßÏH X~¤¥Q©Éÿ¥Ûâˆó9äÎÏ‘ž†)e1‚é´lè{BU,•GsF‚”ºH´yBVȸÞ ß”4ÉYƒ³Ö…FÚúÆÉ J¢)šxu·.q ‚±7 óz5Ããh“%ÂDe@)'`A»³Â ¹bÃδ¡e!jJ½ÛB¦ÂÇœLóGMá ÁÄtiÆ”Ô̤ûÍ© ØúÇôo ›ßÊ:¢ÎF'ý°bn ÙDAè@=m´S`Rî9BÅ6’Ð=m ’Ú‰­´âAßmã7²…mî‡)7 Û 'qÐÂ)d…@íhXÒ´ ( Þ3hÚ=‹Ø”¨s¿(”H#èÅŒG©ÌñžNýÛò‰S- åÉ­øUÛ,,7ÊÐyuß XxÌè¡+©Ô¨>U….öåyïR,€Hç)‰%;FŦØASª°àû‰i­k}°Æì”ÕvgHG€é m쮆ª­USK-1²ym §:©D¹DöGÉÓYL“¨ˆb®Õä©*(jç{ÍGÝ­tc8¾äGCët4…ÜØ’"@Æ—–@X*+ê¨9XRô½À-¶¥¨«p}‘(ž32@¶C©á vÅÅh“BP6ÔF÷0ëO™À’/ L?ÆAb#ig޵Áìî‚ö‰ôãUœ'1.Э ï¥KµmœM»Éý18Ú³R–,©‰fZ¶’'qàcuL¿#2‰†>ÖÕ©+ë®ÐÝÅ»R¤ÊÜ&ÁéTn¤ªÛ< iꑆH[س 0ãŒãV¦Pï´µ!;%d€|ºû„vm ‡¦]Gx¸ ÖØ Àýæ8‡ ÖÃUT¥Î$¹ ²Òn uVfušÄ“ Ž3Kú7 ¹ ¯ñŽŒsÿVgÃZ6Ƹ]¬/Z -²™y„ñ$t==Ѫ1èEÄðÆ´nmÞláäâL³Tê´Õ-AÄ(nK|•÷Ç6¢nm•…¤’@µ•¸1†UÂG¢¬b©TCŠP$€zM)Nåíó’Gˆ¥‘eL3ÔTIˆ»3i!¥ÉÕËsbÊ$é_º=ùG°õz K 8™e&-ë%*:‚½€‚…ÄyòN¢ SœÍ”˜T½A ¸çõ8M˜÷E%nѹvÊRw÷xD>ˆ ™–·µÌLÙõO[ÇE³ÓñÞŒ¸Ýô(\à· °¿(TP@-^3:X¦.­BþÈy‘•ZÚŸ‰„’Ì•¬'npøÛm IxD6Tb"4g§\)â  \ü–d¤¸Ž ;ò÷Æg§\Ò[d–Ñåë`{&¦½OÝdªö'kE¯ìÎM¯âÅQÌG7Áne ›Vy_ÀD;Ó™¦N¹+(‡§$2â¹ß•ºDâSKpÑ¿¶¯ËI§S òæc¡dQTŽia–Gm•Å:ŒüÌ»h˜-¤êµùÞ%2Œ±"Èm›¤u¶f] ;–üc Hñ޲,<#;:!Š´‚eš!j#ëtÔ•ŸŒ,ôrƒ·8)z“Ì £3¥*4t¶AçÙ}‰—ƒqL¤îê—+ }›ï î>-·8J§9ÃN‰«;'a-ˆiò•TJ²ës)N•¡ h‡LµË}M¹™j-„¤-Ú¼þEdž=ô©gðõEÿ¢]Œ¹Q䮂ñÔyW6ªrK^°Ù±×Ò;`ã-œsýK¡(Êpüõ<.üIe¶Pyú±Ès2èÔ’ -´u1­ªT\h(å¨ïm¹íåzÖqœËÕ9Í+²8ËÓo F3ÏoGŸ›ôI–R¦ÊA[óˆJa3*67¼Fš©Mκ–lbSD§q€×¥ÅnMŒ+¦-Õ”˜ôóä›NžÈ’@ô®Tû±Ârx}¢W§Xï’:;&K§Â½Rÿ´wxÒåfm4v4qÊ3ñnHã<ŽÌê6&­R°¤Ž#n›ˆér•š“›ajK©â²•+¸ÜÂn }døíø¡;ue ÙßÙ[a¹7'«’ùƚà •ºä̺ƒÈCi•,!M€9ñ-Â98;CcºGÊ-)QÅ5‰|­Ã¸š…ƒª¶ª¦žëÓÒ¯)K[\5é$‚Am ‡ª–eãœÃξٸ¢™Œ±ŽËìP¤R©ÒuGÙ•—©"M`Ì6„¬$:…ËL(, I+I½Àˆ6ìߘ¸—äíÌÚÅo WZÍšÆ+F(•§?MyºT»Œ¡!,)eRÕ¬_-<™vZ(ý±M¶[_ w¯©=Û(„‚ UÙ§Û.®ÿml“ÅÌ]Š0f"À¢~_R¦–Újnª¤Ò²úøZд -¤3{ ùRÏ^Ã8K0rމ’xƒÕçkÏáÌQ#,§énñ[i¤®ai°JBYBìV“u«M¯ó?ÍJŸÊ3xÇa§¦”Àn3^­QiÏDœê‘T%Ž?y #ŠÚw]Τ‘ëº{/öÏ9û˜X¿/q&©e¾>ÃM&fj=4™ ¦IHÔFãˆÙ¶›âH$^Öh,øÃ=›r¶«Ž±RžU>L¥¶¥eRüÓë6CM‚@ÔMÍɰ“°ŽoÊL¿Åß•C;qdÞ«ÊáZ†”—“®= ê$f] ÓÛå: [p =Åxš|£ÝŸ1hÞÎQ0“I›ÄTŠ£¹I-(ôÂÚmM¢ÊR€;:ÀG |¢Õ9,]ƒéù§’ø‡*ðþ/yôlC=8™–âíÃ'„‚Íõ&÷$‹Ü‹E[ˆ»LæZü¤™Ã@¢ÑñfhÊŠ›tŒ#SZ$¥Þ2´÷\JÊ›a qn°‚J·×&çmK7û'-òéü‘ÄÙi!L­±WÄ8ƒ0¦%˜á¶¶Ö%”´§ˆ,넹:€º‚œI=™¹!ò“æöhR2wc¼%;C“qúE=Ï¥A”§ÝRË)Òú’ë! B k6î^g¶57´7dìèÄ’ºÎ ÅJ‰Ub­FDï~Ÿ0Ü£«J™˜ºt(%€¤­µ]=ÝáÙUÛB“ýˆ2§Ö%±>7ÅX¦jf›F£ÎÔF«S™ô×¹•!%@Y ¾‚@SiÄ%ò—aÎ̱ó?açð}O2iµª£~l¿*Êeg\i ’©¥¦ÊVnä ˆ¨ŸìÙˆó¿äÿìщ(rcËàùÚ«µ\3$ÿf~IúŠË¡¥ õZ\'»u}%À6´w.Böј̬ٙÊì—\§Çþóœ•2£6™¦§¥7Sn„"êQ¶’;‹Þé"+ŒYò™Ì5SÆSØ&ëøÿ`ù•KV±|´òeÙh£öÅ6Ùm|DÞ¾¤÷l¢1^ö&ìíK—í)0ö@b\¬ÃtG‹5lkR™DûÓ²¶TÛr«6Rt¸®ñ›ÞäÁ‘U,õì3„³ (è™%ˆ1½^v¸ýCb‰e?KsŠÛM%s M‚RÊb´›¨¥Zmx{ísÛc9Ž;5Vò–ŸV{b§¨·.Ôër缩¦ºK‰)W hÒ”)wP¼Ñ°:.}Áuz– ÁÔ*¥f޼=WžbfrŽãÁåH¾¶Ò§.ÊJu/¦öÁÝ´0^oTGe|VÁ“xÏ`ºØ«âš~ ’\Ái|i7¸lµ©JP³ F«‘t‚H ÞxC+a:%qTÉú*ªr,NšmUž Ü¡q´¯‚ó{èq´©=€BÌ?”rv‹˜¸÷àL®æ-#½èø–µ'<™q&°¥%zá­N©·î›ðÔy Ä¿2»uÈà L’®·ƒæ¦ð^dÍ·&íbvsÑ¢8µ64¼ÁiZˆ Y ,~Ò»±^|¡˜S a,)TÄ4¨år¸F^ªÜ»X—T´Â×3©M«…ÂYZtWô;í¨ZûÏ®Ú/å®kËå~Ëš¶lf üç;K¦Í&U©sk)ÇJe¤ÛM»èÞê*ÖÔœg—½¾r9©¹sбæ¡áùŠ|Ú09SÓ)yižoN„ò·¥6«ªÀ‹ØÜZ+~ÙÝ”¦Okê¾fâ\ªÄù½—X’šÃJ”Á®¯Óéó­2Ó –Ûï):Y¿æý)Þé±èCò‰Ñ¦;/ãìÔ”Á³Íb>Å2¹‚êsbVbZeɦ¥ô—ƒjîŽ"ˆ%’Ú’BH¼BßùR'(5lq&EâªEÈ"b…>ÔÚ~¤ú›A 0Ç :Ò§m YZIKˆ^€h¦×ÙÑ{g’¨Y3VÁuŒY7Hü,ÄÔÕV«1/-QiiqÆH*B‚\p”¥ Ù R€Dó;2¯U¿œа}zsòff”ªç£Ó_ÍA5ë3VOÐðܾ½6Ыú¦/îͽ´ÎÌÝÅy_Š²ê§–˜æƒ(š‰¦ÏÎ&h;,KcV „iWÓ4l ¸VÆ:r8Ÿeþ(“ùV³?†êìaI¬Ô¬½uÉS"óÁ2m”èRû‹îƒ~ê¼ vÄç”Oý…ù¤õ{_ç-GGÇ8|¢ì-Í?ë{_ç-@˜t´$Sèh‚U8”@{VÓ^Ä9+ˆYi*q~ˆTsÝRV¯±< ™HmÒ‘Õ&jRnUrïè[kIIJ€"ÞÈós<ò88¦™  Q&Sé²¼!t”“mã}½‘ÕŽjñ¹Ê¢sãRï8Žãj#ÈAjmÖWº“æ"æùªMÁXÖQù+%QA+–S{s0¿"½ËÀuvT²’3*d8¤'qnp` Uîžð7Þ,'°JØx.YjÒÂp¸Ö‡šMÿ8 Ì2ìÍø²Etl¤•^Þbj«´%r–RlA"§¨ Ì¨ ¯î…ͷÉBƒ²l!K-¹ºE6TcB6* ^f€ç®ÛÄ^~wK…(7#섬ÎL™ˆé 5:ÈHj§M·y$[¾›t1Ï¢–âÉÜOr“˜ÂBndIh}“ÉH"Æ.3âèVu%CÈâÜ##W§q,ä£M¯š”’EúÇÌS¿d)J¨Þ;")—µ&(,¤SX–v`8´• í_;47 ùÇCm³Æòý )TæÊ€"Ñ/¥¡©RÞø®šÄ|ìMïʹ‹ZѧkÅÂLᎉæ8Ǭàì-7PM—0”èa¿Ïpì‘öÞ=Hì-’óùÙ³ áÚ²Ü5™„®§>Ó¼Ùyó­Mò曀|Á4ûe;Ý¥»MS=9‘1„pVš­@8.‡_¿Ð¶z¨^Ç¢UÕ X˜ô0cøãý±IÛ7ä XFcŒ¾Q|ÜÆØjw'rÃb°}O2q¥¿ˆ%n•e.K¶B)%SHUÒB¬Ý1ÔIÑõ¬öÀØ{8([P®z>;¯J.~IôGÕÇa uJ_(-&Â]ãe,ï-ÅÆKç¶í …Ĺ\ùþˆÄÚäšôGå´¾”!jF—…%ÄÚÛóØÇžô|²ÄÙEò¬ä–Ęú«˜¨oοOª×Tërꔩ‚Ë«¹.Yĺ £½–ÕŠß+;Rãü¬ù2«øŠˆªX²¯×‡åk3ó ˜~MµÉ2ê”…8MŽ––æ— ï¨f6{`l¥Ä¸7âºçÍU|a=óm_Ñ{Òæ5´›B’ŽóÍ ¬¤w¹ìm>&;Aä–7ÉÑÝ’$1VjV³:V{J¼ÚëË.½'4™Ù1ÃqD¬´½MiI'NƒùÑêdá‰Ìk—Ø’OªÍЪ*{ò²µI …°ü£ËA º… …$¥D+cÒ$|„|y%'Ú‹2qGb¼3–˜¦¹+³¸ÿò)ꑨ¼š¢R—¸ÅÅ>ÄØ­¦I¿ª•µïscº†bg¯lg»:aìÐÄy}„°–¨UéS*Z³¼)núæ µ•Ijä’.•“r¡`B G›X38³3-œía‘Ø—Tñ„îÁ5 å:⛨0 q!O$ê+O¤2 ­Z’¤.ÆÖyìׯÈùQF1¯§–›?”B¨ø¨’ká£û#Wö¾ç­êíËhôŠ1aïgZ¤åo³îXÔj3oÔ*˜^—1374âœu÷W(Ò–µ­D•)D’I7$’cš»æ(Æ »XS«ø–¯[§Q1Š¥©’•)÷fgÒê á°…¨†‘¥R²:é<ûÈúOhl·ÁUºÅn‰Jq ˜z4™wÜ@½ÚR”…‚Ú²’S¸‡Œ§ÊúKeÕ á†—¡Q˜àK!ç5¸n¢¥)Jê¥)JQ; ¨ØQåþNfÿhKòmbzî ­âŒ_F6rNj¤©‡ª59Z`”aK2åeKÙe»ºC‹P¶äZs‚bµŸXvO<ñ..¤¿LZ¦0~e˼ŠÛ3I”¶%m›¡._J”JN€¨ôv!ù©›ø7$°£˜“âL9EC¡34I.8A!BARÔ@'JA6ÚÀÇ3=¬óW<ÆxÚWç2´Üó¨ÃT| Jãaùt 6ÌÙ$©[€«¶²”uêÒ;Æ›‚°÷kÍ™[š¹ñL©Ój6Zj³P¦-³,ˎ˹gœ˜–R.¤-2šÂ,;®¨ •~Kv§ÊžÐÎͳ—ØÎKÍJ#ˆô˜mÙy„"àk༄,¦ä A6¹ûˆµ£ÏNÊØ6§ÚSµ|·iº.—Ëœ³“¦?G¤Ê$!UÕ+*}ÖÛ ¹Ý–Ò5X¨z°Š¿´OgÚ?i\Ö¯W± –'6ò°äêe]šHmÆË•!am(:IE·)I¾ÑhÀ€æ]eõ*ð5áÉOA¡Ñ¥Q)*έD!#šÖQ7$žd“Ö$p#”f#:òŒÀç”Oý…Ù¥ýoküå˜èøç”O~ÅÙ¥ýoküå¨ó ‡%ª‰O$µÛ<¿r By°E ž —lŠ GÏIm›6ŽÐ~aËxoreCs´o92¿Hdœ±½ìzF;Ç™i°• “x~’œI¶öZ9Wq+¸0¦R¼ù"Ç‘ñ‡®ƒL·%æ’FÆ[‰WXÓk/®×U‡H‘JN-Äï*I“T8€I†‡åõ“¶ñ KEá¸\’Jw ¼RûÈÊeÖlRªiKwQç4…æ %vÜ'•ý¢/é°ZÉ#ÙÎoÑÝÅ8§(Ú ´ŸHi=J‘½½âãß-£\2QȤp“sZT<’«ŒL©HJ’¡ÝëhˆW%DµUZEðÖŸ#Ö%´)2 ¯š¬ ŒrHú%ý _¥32ò„·qA%}ãÏÊ)„ðÔ4¬mkFjøƒÑ ¤ÌßJ|G¥*S…o.azÖµXôŠôc*Aó´Öæ‚Ð<ÁYâÍsËZSvUêø{"Û§•OI­:Iňh†vœâVžø7 qäâÎ øVHݼ³Š+JÅ>­ùD»Ni.4áºDarK–™R7œ:S^Ñ8 Uck‚_ ˜x“Ã"Q!J {àÓSúSªÛj;CÒ©¼›¨­-“p†Ž!íšµÖ•*ÁÓuC¤H°U1x—ÈI²4W@"¶B‘}°‰—\AæT­Q<Â9‰!Hzi‰t]K`²£ºÜ_‡‹QÞÌå‘$v ÁÈkÏÒ¥É ~ARæÂ÷]Ž“ñÛß)5CyjRUq¤ò<ã«2û:¤ëRrÍM½Â}´jQZ¯Ä±¸Š;IŠ.-ªK!²ôïd¤ foä»Ä³y5=•Jí[8 úM&Šª )G8áÕq” };¸B›HZ‚í¶“ß 1–4e¾Za,%éŸ8üÃH”¥zg …Çà2†¸š.­:´_MͯkžqÍ5.ÀÕjvrc¬a3Ž»€(˜íþ>$¡Sé̼äÒ”V§ S+WÐ’§!AI.*ÆÛG^À€ Â?&4–ìØîW;™uTÔÚÄNb) MH“2.K¸¶d´¶xËâ"ÍÜ÷Òo¦ÖÓ¼×'ûÕ0ž{Sów23N£šXΕO]6–ûÔ¦©­K4¤¸‚T–Ö¾"´ºè‘ë’nmnªSZù8j4ʶ)”Ë|ëÄ™o1Lâ§j¸VBQ/ ¸»k =ÄAd}U TÓRTÖÉg2û UæéÜ*;´É*Äÿì醜[jH™p,€êÂÕ¬‚@'m‡)äƒäž­å–XÑpÖ#Å'VdxÁúáD¤ëyn'è¥%R´£bo¢ýboወÌÇ!Œ\F`@/½£0 @Œ\F`@ŽpùD÷ì_šCÿWµþrÔt|s‡Ê#þÂüÓÿ˜5þrÔKÊš}NQ¤ ù°òDuÃóI]@ßö;cŸîDùù]³Ðã¬j)*Q±Ú¦eI¸½í æ'«€o ó5 ¾ýDbš—f£[ìÔI#h <@ByʃkQ±±„­¼^6‰­èͽè–RçÂ.b]N¨¢Àâ¼dØOáþMJN“{ÆÑ]–<ŒàZGxå‡-Ê\Þ”íx”ɺöÓШ&rY*ûà ò­¶é6¿”L. Iµá®vQ Ü"ñ¡HâÞѹBæžUb˜ÉU2aeÄ”§f<Ò|H¬0ÜÖ© £¶kxG õŠ4¦ ¦LSgØKÒS (qµxqŽke4ÖVâšk¤Î¹wÈçû“æ#šQg¯ãgOõ‘Z.a ëY‹Ãu#¼u_WáÙÖýAöf¤Vɰ[dÙ'Â6©K„¨¡^©Ú!(v~”ùp2½Cª ¢]+RUNšÓËAJ¬•t>1-Q žˆ.*§z+ÁmO3”;gÊ“t(ïUvY3RŽ îlb¾\·s„¡t”ý±ÝŽv¨òóÂ¥cµ ¨f”°|Ì?…‚9íT6¦ƒ¸Ú%2 [ÒÉ*õ†ÛDM ŸLIº D9¶êTl¾#’ë(!&ö‡™bmÅïÊ9dBìz“…\pC޵߬53d›ƒb|!XUÒ/Ê ÔSÆ-§B· ¿‘„¥kâžõùÞ d“ËÝШiðÑQq!¢ ½Í¹Ã£ª-³~QróÓ7 !´~&·boÑ…¤&ð†a(ûì…SŽpM®ood5ÍÌ!!k)Uí¼t$e)¤¨O2¤­*Q‘Q†IÊšÊ ZÓqµ´>ñXÓ¨{mÖ]¥:ù%á´tE%ÙÁ’RzAŒUÈÒ·ŠŠM÷éšÓ˨´ì±`óçhRÕ ¿Yå]]D>aœ0ªœè—§É—Þ; #—·Â.Óz%c•~Ì·2_ J×ÐÂê9©Öÿ;ø¡ÿ;éíHÍSÜ–˜-¥’ÏÖ$$÷n|lbš’¯Oaº»Œµ:©I¶[RP¯VÜÄOñ®$v½€é,baÄë¾êºGà"ŸÑŽt¾6Wós %]ëD£){AcNÍ8âKa•zu1)àÕèÎäã>Å ì¡ËÌ\³r¥ò Úå˜CM@Wˆ"*2àìñ-Üd.zanÑy!Œ0¤ßIñ¡æGUàSNÉBãÚ#c@ð½ãÀܢάSÙ?1?,0ZŒÅeIMf€¥ÌÓ`ó¢…Í•k‹ž„ˆöÇ#3« vËŠn4Âo:í*xPú4ºÃ©6[Kµ$ìlHð&;ã%%h¢ÃPbÂ3bÂå< X@c˜Å„fbÂÞP˜ @ @ŒX@æ#0 @ŒX@`@Å„fc˜·”f9ÃåþËóKþ`×ùËQÑñÎ?(Ÿû óKúÞ×ùË0æ§Þ þ»güQðÛÍ·@§‚FòÍòýè/6ù3Т÷zfû_¥¡¦mÛ걃ÊUkê„s);›Ãi¡¶#]”«‘s dí¨Cs«Ò|áD’”£qã 6„™+¶Ûtksí†yÕaµ¡Ñ yíÞG™ ±(¦»ÈùD2UÕ'­¢ELyD'¼o{%ˆ˜°y˜I8î±p˜Ã7 Fï&é;mCuλiá»àY ÂÃ3©ä\(ji߬Úú(CÏ T­´âìóëàj¾ÄÙöˆSd”6q=“á ôà·µ-â w¦>ËêN`RU)R`ója;8Ùñ8[ÉŒ·Ç“Xr¢éeàåÝpiKè<ˆ?e¼£’P~[“ª–™‡¤ZvúšJñTñ«†”Ù<­ D$Úگ簃MJ]–ŠÜ!6’c£µÕY}>ãKÙi6>ÈŠ×)*ôä-(%;‘a‰ª&­\š}¥ û¯8:l‚’@ÔDtFÓ8æ£4Ȥ^qÁ¡%%*) Žpó"ÓŒ;¤§»Ì—{Žžö‘ª÷Œ8HšIµ¹ɶrF*,]§c§œ*”Z’;¨B§‰rb‡Ù[v1oöcíy{'KUh²XzWá ù•Î7NvwÐß“}^±CšV ̤¤ïÔu£Ý¨;,‘ÄmH?ºI˜×.lo J/DuÙÞÑtÄ?ùŽáRUŒ•Ïæ8…IýV8Qª]·0qŸ [Í?¡¦½Ê~Wi¯EÆ)öw)®<|  Ù¿þ×·ú´*OÊI˜jÙÿ¥íþ­§E«¹¡;i‰D•cÕÜûÌGäKè莳¢SòfBùdgþ˜7ú´Ÿ”K2Õ˳ûáƒ_«E'V×0ñ/TJSº‡¾Èeþ< }?(fg+—gæý1kõhØ|¡ž®]Ÿ[ÿ ZýZ*ÆêͲ‡ÆµTE…”¾È—Ð,û,¿è‚æ‡ÿÇÖÏý1kõhÛú Y¤Gûÿ ZýZ+ög‚‡8P™´‘Ïãò%ôWãÃìœD 4¿þ>5þµú´cú ™¥ÿñõ¯ðůբgâ#C6‘ÔAùúÆÙ8WÊš çÙõ¿ðůՠ—~Q<Ëhw»?¶?éƒ_«D,¼•u„3aµƒÊðŸ‘%è_²nïÊO˜,zùv/oõhJçÊsŽ›=ì„Hÿ¥Íþ«„û)Q"Â"õV‚Æ3~LפgðÆËÐü§ØØsÈd…Íþ«þŠ5ÿÌ2ÂæÿUŽeœ›Sd÷¶†µO­DÙW‰ü©ý X"ub¾T\h9äB?ÂæÿV‚•ò¦c müÂþ£õhåÎ:ŠGX3ˆm~£œ/ËŸÒ/ñãöuùR±™ØdBÂÔ~«?*^3Hº²%ïj?VŽaTÖ”óÓ?>wöçÎåä~ž#¬òªâæÅÎE¢ßûÚÕa#Ÿ+N%gÖÈÔúXÕcŽjb”b>ìë“Ûï¯##ôŽiÆ+Híå|¯ôMÿ÷­?ªÅIÚ/·&8íIƒÎ N•ÀXVqhUT¦£éÓ3iBƒiPBJA;°ÞÛwnEÇVn´ÃÔ„™hv‚^D¨Î‡ÖPÛrèm¤”<ÿºÂÔ”â¶i²X*Ü{bÆøé.*êçeèÓĨÔP§Ô³±rI£EÉöH$çP€;Ö"¾xm¤^â"¬Ðç›;ÜÆfäæP6¸Y'œ'‘ûaê“‹‘­7Pø«ÔËÉòŒË©m¯Ö7‹ŒILňÒXøÃü¦1m;•€cŸ©“¯è(ûâE(¹•eª4å]›ÆV^ cfÐ@Öö´ãv9ë¥P&m²Œn5o\ˆJF…Ô1« #¾>1¿å³_ž"”G¤5-W½ ŒUˆYÁ”s9Q›a‡V>†Q×Â{ÂÉ7 yØÆ‹öè—$‘x9ZÓ²ÅϘŠ?µ>;i¬±¨ËÝO&Å)U‰ŠWfî(©Ì4Ü­MŠT«Úl%š ‹žZ×¹ö‹D 7«Æ‘‡$ènM9=?=y‰¹§—­G}€>ï²6Ž:{1”íQð™NÜ%]ÅÓT.ÎlM‰¸·X§˜oÑ^ï+cáì7V/2™gUô¨ËžbXòV|l¼N™y/²¤/Ö„kWJB»Â÷L'•–æð­Ä ” «Æ8:g³ü•‰”ú‚Ê”žê¬‘ã g ®°[Ô®ŠñoéewÀ G"9Á.úB–`~¬hŽY%BۤƒnFÒ ·ÛhFÔ‚]˜½ÔsÎZA˜;žèÛÎ*‰‹¡Í‚ÚT-r|< :¥qвTZð….„«uYv´n™»«IîØm ‹m²5[²Ô?4mÍ>x¨ ¡G{Cz&Ï)'ºG#ãɇBT¥§Æˆsäªam––w‰é´¾Í†Àu0Ãé) $ö0iž/2»äî:Ú%F˜þFÕ7PK%iSH¼=IL‡@ kîG(L$*p¬$•]J< ¹ñJÆ´”r#Æ-ÆöD'Åì›pȤÜy ÉWŸJ‚7çå•«!ÔiùANTUe¤’1ŠMŽQhf¨ÒPEÝS§Â¾ñBKd¤-o¼ìË£A¼%u)+XP+)ßxÝ3ŠI"Q€qØaåYia'0¿‚°9Á%¥€OÂ1”ÏCÝ ¦1kéˆý^I€“d¢G0…‘úœ³‹AŒÔ¬–B§™HRˆ´5åÌHféè<áµêk‰ßI¿²;!$ôa[Ræ›@øÄªN Ð·«ñˆ Ö­ 0óv;ó‡$R—În¢È 1Weü¼âÅAâŒÌ8ûã{Æ<Ù¯!Þ¯Žå©3²lºái‰‚´)i$¶Ö#qÎ+šæI¢j}ꦬ¦rbdë2ujrçÁÝî<Æ4Ìihͩ࠰TR|öв[Õi3)T¼û¨R ’ Ûœzx5™½˜ÍÉo'G—§UðûŒK°ðXšaÒ 9 I¾Û˜‡flÊgÜ”|øIIeÖóv±&†ZriJ˜á‚êNàž›{"»Äx‰ESÒî+¢ÛF…xŽƒ róN‚n:^å¦T€‡PB\o–ðŠnžÁ%L%ÆÏ@Uq\yÆŽ÷mx*ʲѡÖÓPlogǬŸÂ$R³A$‚"“«;*èqµ”¬r‰í¢y)C½Ç|Iç9pÖÑêàòÖDõl6û*ÐlOÛ ï1¤%(Üos1PJ@)VÜ¡G¤"e"çpc•hïu$#SE”lnIöCp©ð_UìPU±ö‡øì)KMož“ÎÝBQR[вw¡¢Î,‰¦)\ÍÏ0­&ûõŒ®gަöUù^ÖâÛ©Dø¦Ý#(x´Ðu§½·ŒiF<ÇF_I¸Ås±Œ½4\IО #0‰é¶¦P4©:Ⱥ­°ÞKºe)IQðö…VW/C”³)ZÉ)Ü+¤nà:V¡©cÕ¶ÛBu:ÕÛsH]ìHÑ+q…§¾V±½Ò9tKm2“¥M)<5(ÞÚmtÀvI¹‰D<Úõ)²mÒðÞgÛ™l[JÜ;v´Š‚ØÒÈÙiHœ*cRF®OL2•¶²€  OHsDúÝ—úAºFÞp€Ì‹iIá©gJ‡! W+3+3¥×O{Õ±Ä\Ü^‡ÉVBÔÒ I7]Ìè¼§¤¶¥ˆó†ôM.MãÅ_E;ÁOU…”9w ´yl %ó^Ç”`»)]Ó~Q!• U¶')Úʲ¹€yD§ß™$"ë ‚¥há?M¯Tƒe©`Â.JVT.w¡ ™UhaÅÔÊ® ¨OJÈ­©7_Qe æ}¾Èc8vyØW° Å¥HEbÊÞŸ~œ†¹LÍ¡+¿ˆÜÁÏf==%Ó%)0QmÚQ ;xûc§£†Ê‘tɆ m@û ¤6´›ÞÑjËâé‚®=¡J$’òonœàǤ鵖nÕ1  ÖÒöÜ\ùBH´B(•yªrÇ Õ ^äj°>صðîeÍ¢[„ð\ÃfýÞ"¼žÃ nêa R‚,a4²g)ëîñ?—”0MÙ}·˜²ë•S3!+aÎlºØR|yˆÖfŸ@Ƭ)³2ŠuQ_µ­ÏUG½Ç¾ãÂ*f*o­°@R¸XÚÞß(8U—*RáIRFà¤òˆ6Ó[+xf§ƒ§—/=.FÃȶ´žD+•Œ B¶l‰Í)yÙ%Ò+hLå-Ôè-;¨©ó’O":b¬·U^Z«KtÔ(Sj)iîjm˜±Ðùõˆ’3âã´*¦â…éNäĆW)@XÄFŒý /Ëc’ôɤ€.ûÓ’I0”ªÉb1¶êÞ ™ª©ëÙPÐÝ&wo wÜ“ QJœ°¼»»~äÆ|R7¶ôêÔáçJ²B†ð­Š<âÈ´³ŸÜä®›X±œ¿‰L6Ñ0r*[x9¼):Hú[Ù [ÂsdìÊþ—6V3dÿß·7ÒÛÃxFnãèW§Îô—WÂ6EìÌb zbâ¥ð|þ¡ûP¨àùάôÚ-I“dNaec–Ðä¹O(›+Οê${¡3˜&t“ô ‰mýwÒhj›—l6‹à)õÿµÌ'w.gõð‰VÌç½k”Àw<àƒJ±½ïyËZ€?ésåµDÿµÏÂ4M£ÑU*”£Ê fˆ³²“›YiQØ#Ý N\Ôv`Ÿt>Rú°b„‘ë&ðyj_s´XneåOê˘jžËzÓ¤Ù‚=°+oeq!L! ° Dù–×leî/ÎkÄÂQ•—úðDÉæ-¯L„ó¹öEÖ)hðŒ|Ø‹òÝ|ÛžÊ=xlý_²»—.Þãd_b–ù­¿Í|(9YÏ+Ê—×Í?d&{(ß_Õ":Cæ¶ü>ÈÇÍMž€û¡¬Bäs+™4óŸWdiüÃÝYJ‡²:xRÚÅ#á c]xPYÌìä£íòÞ!j2aó`zyGFüØ×„n$–ñ/…œ!Ú‹Ì`¬J¨K*œ,8@Ø"ãüŸ¶9™ÖXT²§ÖâC#u€„z9Û ±^Èúãl.YML¡Ç ¬¤¬~‚cÌ:œàp¢]’PÃCJAæ|Ï™Ž¬kŠ£Ÿ'v%›iÉ©‡Qº”oqÊ -i6=áRš”›ªÞÐÒµÛ`O(ÜÄa~P¨”øCtĈҤâH¹R±©;ùÂ7dT ¥ê€=‘™Ѻ7¬¼ÙaWÃóòÄi´!~–—I)°Pðåv©k¢AEÄ·B[xÜtTJ¥'5R ¤â§SOHÙJõI°>0õGÄj–!:­äyçžhìÇä8êE”&ÉÌFúPà€’b?OÄÒ“!-º8NyŒ9¶².¦ì´(ߟHãqq{=’2V‚'%ÝP±†àØC‹mÂBRw7‡£¥× lP-¿XÓÐn‚\@ …ÑJ´a(^ÐÅ3&´ÙM,) ï%%ö×½ÉßÕ"œ€ê’”¥;XFž€¶Â‘{›Ü›)£ŽCg¥Ùõ© NÛ‹AÈ© µ¤¿k…¬L89NKéÛ†ìwÞ6ôt¥*p%Îñé’„½nM¶ÊÐBGîwë5qTeeN…,›‚oå ¥ê“rn!jð‹ìYƒ_u!tw×ÖP¹…,Vð Ω ¤ ‹nØ$}°ÇtBåq´Ü½Š€_]Ä=Kc¹y£¦b]H æP¯ÆðþZËÙ¥‚†æšš……½ÛÆïRprX´¢æ_0K;û7U „Ó+÷n} I!ô€Gè0èª<´ÓåÂW4£>FßdE& ¹fY_û(£÷t£É>ð[L%°Ö­vÛqhTRb ¥&bœé[!a ÝIRwHøEÑÙË0%WWF®ºlâÒWu*ª…úßïŠÕUJ{CKÕ0«z²éâtñ áÎ6§¡n>ìÝ*• ³Þ+yzˆåel=yõ„ê‹Ýž’Èä6•"]µ ‹…{Û99Ioq,Ÿm¢¢Èlõbb€)µŠ¡T!hm•, t¦ÂÀ‚±;ƒ³Xõ4IJRëh-5P32q{\—Îá}7CpÊj`ôtŸtgù“Óm» Í0óSÍ «ÎÈÉÔ%'ë|=LÒÓ0„:òˆî¤j#Ÿ(`^3­T&hÒl6–jó –IºR·ÒOîE1+ ¾…-åE1³q.=â7–4äò`tWöÂøS¿…±kRçYs†©”‹¶ ír9çŹ!ˆiÌT)“lÏIÈ{–zí©7RõwÇ!s6ðD¥~"¤1 å9A P˜dmesÛrÂÖÑ×È]H°šq´(•oÒ4S)RËúu,5R«ruh ᯪI‡æn4®ämÎÓÙèE©ô!ôu!•—[ï+¼œªCkÖØFöçŠ]u¨‚¶‚&è“rJ °JmpSÊ  ØÒÔ¦¥¥ Y$õ‡æ$„›¬Ë‘gn£äyAøZŠôüû‡„¢†PV­H–©â&дéÖïªÛx‹4­w“RI¤aÆCžº­a±¸Ž í[*ª_h\Z‚=y„¹¿î“á…æ×O“i†SÝE‘s¹NÑǸi!Ó18ÚF·©òÏ/OÖîi'üXíÃôa嫎’34aZ½R<êIŸgX P'ÕVýmq·ŒuuÙ«È—4…ƒ±=²<Ç‘˜(HRV ¡ËLvodÜÐÑfpRg\ì’LÄ‹Šõ–ØæïÔŽbþ¼u£†MQdOÈ)‡­k¦"xŠ€l­ ¹àZ,ùÙA0ß-#˜¿?d1OS´!WH­ÎÐ>Ë«[9O4ð2jþÛeSLƒ` Ї„Uò}ZŸMɨ ï©Dê¼kF»N+@²¹û#š±ý6nVãJ<ãrÎïd¬Ù ê=a³TÄËËŠ´¢5<ÀõÔ?ݬ([ÝÆœ$tå¤+M'SÕ1=ï´Á³X¡÷J ÙGU]Gô´bÍß“—•PÔÚ[QüåÜÁn¹(ÓW/–@ 'ÚÞÝŸuâ­Ígui„Ü5s·à²¨p5b,\wþUFß\ëóe%çÔ[Gªƒ{'Ø:B9d;Û¨‚Vé7½¼(¢Dæ#j\ܸZÂ@:Á nvÛã·ˆ§¦]@TÒÙ@°Á#ÈrzC G(ÛRmTÄÐí-’ê¢R§é• ÚcUñ€}Ù•G_ÞŸ=²:C6sAºoà —ójiÖ' ®Ëˆ)Òû\ZÆÿ—ØîoÔ¶ÚdÂÄuɇR”4ŽªYè"’¥ãÖpÞ ® ¢]›wÑ钋غ³µìw°¼P9Õ™b\72ÄÄÛ¨”œ|±/*ÊÊ>øÙn¬ÃhäSx|#Ð-;Ûo*¥±̬U§ªs!Z ²Jq«ùor<À‰æ"μ1@ÃŒÕÕ:iômI-¨Ì¨*Ä|#²ŠO e›­9.Ó-Ê47PRq÷OªËdîI>€&9Ï83ª±«3Ì< f—dK ÷GÔly¾&G4Žã¢öœÄy£‰3ÓÛS©+˜wº–ÀúÀuƒî1eÑ36£=U´Íµ4þÈ[‰ok‹ :á<ÍåĜܼªÊ¦&%Ô—Þ'ÖVƒð鬬̇0NŸê¶ê´ ú%5µ(’ôÁž~¹>Ⱦ)šlèomT3aÆg} ¡Þ ”-¡&ö¹þ(i͜ʧáÉUͪu2ÔrGuD)o¸?©´›÷–O¸uŽ=ËJÌæ Å*<É;“ 9ÜÌí#ŠófyŠk«£ÐÊô³%,­%CóœPæzø@Š£ºÛU‚úÉÐÊ ­â`B£>lö}xç ÷×Dþø³ü(ÓòÛ Æ+¢í‹?ÂŽd샕×C_ýiŒ=Kv4Éõª€³ÿ¶çãøëì®Ñ«áCo鲋oë‹?ÂN:©°²ë‹?ÂŽY;ÎY)–Ø6n¬í ‰„¤¥†•8çyvÚûòÅR˜b–â&ªÊ”H…°ÈQÔA°ý>ÏhŒåŠ+²–Fö‘ë»˜ï ›ÛѾ,ÿ V<Ã?WÑoýqgøQæŸgnÎÍæö* šeÄQ$ììã ‘qѰ|OØ/-ØŸ)ËD¹‡\$¦œüc.0û5å*è»Q°âU¾*¢Ÿí‹?Â…òÙ‰…‡­Š¨·þ¸³ü(çiÞÅÙXÑIFsI¾Þ”¿Æ4g±vV¿°ÃÎþeÏÆA{amú:uœÉÂIçŠèŸß…ÿÛS2éµÜ'†(XŽ”âªOq&nuµ%-#p •Ôôò†V»åBø´$ïéN~1XgvCeNÀuiº}¦¨–&efËQ_¥ïî‡ú&**úV\áÖiш$Ÿ™P¸â:€‘ì„#4'$\[Ö©‰IîÙ·Ñ·ºñÁ؉T]Uù¹u.ZQ‘¤k#¾Nß`TDêj'Ö†Y)lª7R‰ƒL¹Å=÷.Mb t»IIiôAç°0ºZK K²Ùz±/:õöãL$¡>v¼s^B]‰µ¡”iH¶×¼'‘‘mé¶Ð¡t•XïÒ*Ћ‡â”Íj•§M2™dóÐâ{ÑX¾òC›º‹ø…FõJ,¤»ˆ ¶@Ós¼mK¡IM9¥Æ‰þÈÁ®Ãbtº‚MÜAjjfHý±¿f¡>ËJBüiE(ßöÂ"JŒžÂê?éoÿ¥TG(š¨É¢‹va²Ò#û¡[Z¿lGÄEörs öЇÿQª²ƒ ÿ¤øŠüby@|$PóTô>ÂmÄkH¹N¡¸†›€9Ú:99C…JIù½Wðâª22{ sOPÿâª+傊Læð°ÊKO–Ô.AÇC§&ðª¿Ú ¿üª¿595…Oûž³ÿÅWã æ€|3()yæÚx8ÒÂWá~q6ÃõÉz‹ˆgÒZ—yD%)y`$ÿeÒ,ôdŽPÞž¯g_Œ+k"°‚‡úœ«ÿÊ«ñŒå[ï|Q¦Sñ"ý.¡'vÖl²òmn¨¶f;áVpé'–Ó+#_ö+ËY×Üb·…]×J„ÒÇÜc)K UòÿÑJy_úÿìˆáÜÌ£KÔ‹NUä’ÂÍõ”{õÞ(¾ÖX†TÎ:kÒÓ’ÓÒ«¤²ÚÖÉZAÔ»‚Aµ÷Žá™ù?òbfIÞÖÒt¬M¸l~1VÊöË—‹‰TŠÁI Yõô>Øßñ½¦cšS’âÒ<ìŸaª£ì%i[wºT Å(’à,i5‚q5>· ú˜•u.$(ìmÐŽ±ÜŽvÀKt¥™UªÝ8Êüb_@ì;”ÉÔh.¼øæ¡4à¿ÛnQnÎ2ˆÓ!˜Xz±J‘¨|÷KHœaÄÒ¡Gu&ÄÜXÜoá §1MDé­ÓT;N7o…âMOìW“33/ áÇJRl?e¹øÄw3»e.¢)é >ãOtQšpþ˜9D¾rú"µº¾›“u¥Ö)ª¸²e7øÇ;fé´ÍË&vUÛ ¡iy'~›ƒ3“Ý”2³30š­ÇÜJÈI+NÞãrû dº9á—mÿ;sñ‚âL¥'èò­Sz]RT  Úµ4Ûˆï(æcÔÏçÉ[_òeßúÛŸŒ7Õ{äe®$Îq´ß™›sñÎË„›<ÂS¨úŠOµF [ «¼âUý”zNžÌÝžV«|ȳo ·U-Ùo³ÜÓˆmUkQ°qÎWÇÆ]g¢Þº}Æ5£–´ücÒ¼ÁìS•t¼<ìí/©¥%:µªiÅmñŽvg!pyYœ¥ò¿\áØþ9œº§sßOÆ4â \oçKìç€Ý”[RT9:¿~¡öfÀÎ4ƒ‡’éY}:Ç_lCÍöiG³0–Íõ$ù^/ÎËÙΜeüâeåµ ·Iø˜ízga, ~I·&0Êäw€›sñ…ƒ°fL¾wþ¸çã)ÄË‹‹ÑǸètzv>•ÅøV§#3JÄH3,ÉÌ!e©UÂMÀ ¿]Poeœâc a w-1:ļÚd„Ü©yħRÓté;›(Çb8VLiÿ[.[þxçãÿ8FLäÛ¿õÇ?|â?Ùló»5)=1é ¼”•w–ž ;õë µ ¦IJJ…¹ƒ¤+°FM\ÿKnÿÖÜücaØ'&OûÛwþ¶çã䉛‹<¦‘™JSšÒ,$ᵿñ·?\â 2GŸY•ˆd¨4y<E›CÒrÊϾÚÁ6µ®6)@ØyÜÅ`óÉ•öÇ« ì5“*á§ëŽ~1¸ì+“'oÉÇAÿ¹øÃåÔ,)³e§{á*Pç8êz;äá*¶pùz[ŸŒžq2çesèý¶l‹ó‡Á‚锉EÌÍÌË(+[‹]‚@ܘzzmm*ÆÀÇ-vÏÏ5aêä*d Œà[7)IäŸÆ>wù<žFOŽ+þžÞ_áɳŸ;Ifj³w1H¤,¢…"­d9¨ŸdŸ®(¸vw21]6A—TÆ·¼«`Z÷"ë>7è-á^iTjX–ÔMBx¾£ë%²vÍ\ý–ñŽæìM’ˆÁôË:¬°j‚4I!Á»,jߪ¼|=±èù>T|x'3‹–MENSdµ?*ðDH%O¥!sS ã:Gxû:dLä²RkÂǪi–AqÅ%rvˆo=¨ÔššdµñM÷RÀŽ,~t2+Š;—øüÓuJׇ l&àÛÆ —êkQ yZ0æ'ÄrÉvUô8Dáõ)÷’2~âé襱–Å3 q4ÆRUùËÓ{ÚËU°[ty*´Ê]ŸR¦TÚp„'dÝ•麄y›ÛsþWçeJ]¥q%ém¢žÎÅÓr»y•¨t|™eË^…—„ ¶„ßÍXna[98ñ>e)z¢²/j›*>7‹K¬RpÌ=&Êm°¿3mâ¢+Ó­Wñj'—7´†êƒ¼Y…+ÄŠ|Ià«z¢ð‰Õjpõ ·yoOA•—Ц 6…Øi½oßœ2L¯ˆò”MîbW„$ÊÊHÎÐt„•²ÛÁÒ¥¹á¹°÷DŒ$ž°’™*%$jÖ²nOœ)R­°;±ÎÞÎÕÑ…,õ1„D :Ô9îc*²T@‰ P¶Ñ¨UÎü£ 7Ü›F‚×çì\ɽ¶…m¶J¼%”o\:6ÈX1‰†²Bßl.e›q°Þ’,/ªU[£ÊqžQÙê£-#zNR‹&¹‰·’ÓIÏ3ä"¹¨gÜÝ2i ¢6eÖËÄ>£ÞÔ9C+©ÍÖ¦ ³+°ßC@÷Så:“lkSš‰ú l I1I´[mv«ÆàõNe£{‡Ô÷r‰¶í…Z Tµ9©Š„²JHd«{žqÊ«QIÜ$òÞp"ãdÚÛs†ðÁ飚kÙ×xƒåÅNκ)Ôé&$¯ÜKÀ­Vó7‰6íáHž—Äô,Tl©™.ðö”þØáƦ ʲ•½­eAÅEÞ*8£ˆy=_ËŒÃÁ8íEÊ Q‡W6”t.ÿ½;Ä®¿<Š\Y–£Ÿê‰lyAÄs´9´LIL¹,ò ÂÙYIëüí”û7@ǃç:zÀi3Ê:Øý×ç¶ r†Æ’›ÙÓøf©+4ë®%IQØÃ&pÊz]6Á *6Úݥɲ۳ª‡•0Œ-µrIÞgñè§)…Ì´r+;ÇT?zhÊ_§fùeW’Ám8™×.á$ì/h ëÃáÐÚ‹…]DsäåUÆË…;º¥Cž£¾Rg&_{q©="åŠý˜ü›è¾•Xr_O8‹õ(‚f³G× aĬx-²cžñP)ô˶¶äˆS¥PäáyôËÇOVj³ñݺg2öckË ŸÚ– àWÝCŒ»/Äà…ŽqWW[’×m¤êè"0¶Ð£}:má~õ&h¼¿þ§Ef$å=Œ:„M ¤4B;×¾ÑÇ‹úÁ;ƒzôÂE-‡ÝУb’²GÂQ©R%¤M9§Êñ  ¦ìÞ2YzT TÉzT!;Z'ØoS –Z=d,—`œ±Ã3’m©o¬ÚéâZ,zvRÐØ,‚7ÙÃOÉ‹—:㋊±ò•<§dYq¼/ãÄA.J&”ÚQ£H°&"³.§4kqèÁÚÑåËLr;Z©†‡±»NèR‡¶q4ô¥ÃZ;ò{%l™‰‚¥žvƒ䎱PLf5X¼ÒßÊ7^aV¥[ Xk~šbZ—ÐÒÙm-ñÒa4Ìâ˜äÚ”<„U'6ªÉP†”<ö…ò¹£Txo"ÚýŠˆnkýKãl²“4—’J‚ˆˆV(É×*ÓnV%_%ð/ÂYÙVè ¦3:a=ç©‹°æRoT|Ø”žYaM­“{©1?$«q)E/ã#|. ´‚[ZKja!}N, ì“yZ­:uô44•¯{_xÞ£B§L«BÀ > ‚ÝHÛ¶UrN8š˜tTÜD•ÌDäÂÒ…2IåªMàTK’©gÕ~vVâ•MzYvq6PòØÇ_%$cƃMUÉ5X3¨ö†z­ysS²Í©’‚\‘ÒRÁkÔ³¿œ6×eL9apà±÷ä„É3¯–Zhi&éæ ¤Ï©Dý6ƒÔ¿ÞƈB›ßO8(ABd”’P`·%;^iR¾§Ù8R›…XZkx©Ä$ÞäøÂõL¤iäJyuí:®Øòƒçñ™6x'`- ‚ì’¡æÔž Ã…*] ’Þ¢›DnL2žÄÏ.Ó¾ãŠÕk ¢©Ç:4Á­+* Óí¡ã¥Bþ‰+ æÅ2™uƒ'kÓkJ"ͤóZÏ$Ç—UZôÆ6ĵ\[[Ra+.¯®¢{ˆÒ=À¸{UçMG2ñ4®”pºÄ’ô­ ”éØ?ŒQ•™¹é,?Mt0°×Ñ ñß$â/ÝBýcÎÅŠ8®mSg£<®uÀìñ•ïçc¥ê€?6J¬MO9k$†Çï¹{#ÒiwÛa„2ÐKl¶„!‚@°ÊÑOä^Y3•XN¥&¤ý¦']Hæá¯±#h°\t!µ«q´|wå¼ùiÑô^7ñA_~Ètcé¹fŒ”ªËhµÖG2" À’¿>×KË'ˆåж ͪ™šÄ*eêMõyߤ'Àqz`)ij”û©‰–‘¤²ZS`@7µ¶‚m±½€Îu„õZÕÃÛ˜=k ‘ÅØÎ0•¬ßsa«­b[–ؘUMAuËá!æE({á͆MûÆ’¬èO+Ôœ©qÄ¥#rldÍÐáC¢.¦ò’’R„§R—nB3–Ü“ŠS£JR,ضä[s"Þ¦-J ÷Âjœ¯ Ë"ã¼vÒ"%FTÛ¡E ¥ãæzŠbfTôËèÚNÃì#+f…"¤‡ujÓcð‡D²V”ªåZ‡¬E ‰™oGN“ëfÉ8äÃ|5¥; ÆÉ˜$X ;.Öó‡ §%r¶Ç0 ˆ‚á¤YI*>B4—SEË6÷ \´«`aØ’iMÙÏ9e$ÐhUY‡UM˜:S­WôužJÂ:qY8íE”Ì3Q˸IR,AÂ<×.ËM!Iú.ÝTvÇe>ÐåÙtaºÛ†È·ÅŸWËÙ¹9E\YÑŒH³e²LËo8ö½é·8“Î`ÙÑOT´»m#»`T›ÄúF¿!> –_BÔz¼/umØ@1Áùyœ¶tþ4%¾'3Ïd ]÷Öéuµ©Fçc ©¹C\¤7¥®ïÌî#¤›áòDºÉ")yYŸRÁ‰w•1^©áŠõbª¦åéò,­÷ÞR¶B.L1a,˜í š8nGá\¿¥JPj âÉšíL32ã_Ue½Š†âý [ý´eƒ=š1ŠÓÜ6”ÞmG¼{ã»p2Cx'¤§Ë€üšcÙðòO$‘æyŒ$”O/&û ö¥›/a0/}«Cñ„ìö6íBÒµ …/ýzŒzÎyFÑÖñÆNÚ9Ôå™å\‡ežÕtõ]¼#…Eº|ùüq(¥ä¿kºZÐQ„0›‰OÕUtÛü¨ô®Ð-|ÿøš|ù>Ï>ÝÁÝ®f% åÎX"Úþ|Uÿʈê²sµ©{ˆ0. ÀVã“{£1¢ÇÒ3s“ížnÿ2.Ö—ïà ³çZ?Œ"ÈþÖ3Ê$à<ƒûš×ñÇ¥Ö˜®(\™æ¿g~ÕŒ=Äü‡ÁËQñ­ÿ;«g@ÕpjmáZþ8ôÔ @½ âƒ“G˜?ÎçÚ¤¦Çàâ|~{þ8:K³÷jÙ#ÝÀØ9^Úßñǧ0!ñ@äÙæ°ÉnÖA²0]ŽßêÑüarµz&8£`Ý\ÿÕ¯ãMíå‰â…moIå'kI)öf“€°Z–Ð $ÖÍÛŽàî×NºüÎp0Pÿ×jþz h|p»¢œäÕYçã¸?µÛ ús’GQ[W𠙬 ÚÚm­ ËŒ E â®?ÆB/çmÖŽ?AÎG åktœ¾Á öÖÏð ¹Ü©íi:¤(åö AAÔ4ÖÎÿãG£°!ðBäÏ9ßËN×oéÀX%°‘k Ñþe¼¸ízÙÿXx%Cδ…‹À‡Å äÏ=ÚÁ]®7Ëœ ³ç[Wð¡<ö]ö¶ž¶¬ºÀíÛókŠþz!%Â/ÐrgœMå?kÞ »Á¼ëgøPc™WÚÁÇ Õ—çÿ]«øQèÅÄ ˆ8Gè|äyÏüÊ{WyqÏöí_Â…²’]¦òÊBr³YÊ\?V¤Ê'5-B­j›-ƒuukP:v½£Ð»ˆÂ€RH;ƒÒÇr}œs>šN›‰h-TùÖÊÂ]N—P6R:)*â G4dUTì·ÇÊmÅ6¦±}a-„’= ì†æqäåR:¡M]?+4õ•3]˜*ùÎyJnZþ°'×sûl<Ô|"å않«V\Åõ5JI+D˜XÙouWž~'Ê**Ms61å>‹Fea—œL¬¢7m¡õÕÒöºãÒZ¢å¶¥Ðä’´›)h«6º”|É$ûãÃÿ-šx°¿ÙêÿŽÇ å¹ôÜ͇8Újlz#€(‚+jn–àØ5ÙTëzT°‘ämžG$”®GØTZÑBÖr®©]¬»6Ò€ ]÷2À™>ãèâ¾..LZR”z{h·ºoòJÁrÂÞ1ö˜¿Êx|bšiœÏçB¡®¿Ù¶YÚCkb¬ÿ)‰°ùD.³Ó>Œ¦×7¬‘º•¼]"¨ëò©lÌnŽ|¢ZŸ36úˆa†”âÉðH¹û£Ô^n × ž3ÉåÅ59hó´¥*JƒŽ†¦©N5$„ñ 7»ª±?¢!XòpRèò”Ôll$Õ]~ÛÃÕv¦qŽiÕ*ïM®iéµù R?É]czš§ª*ýâcÖÆù$Ï#¦ïÙR»êQé +S„Âé•èo~fos¼ns¡ÎŠÕÖ§ŒM8\yG¤)—O'‘"Љ?H»@I&ÁòÇK„oÈEýB‘t浈NþØ«rþ‘Ę–l¦ü–¨¸Â4 &2›:1ª1ÃÀÒ-Ëx0ò±l<£4èJño´6̹h]:èe™~×0Q ÕKÔ«DŠ…/È‘Ò"Òļðëº$µšIòƒeDwa‘£aÞ15ÀA9ZC«N¤ËvPØ«êŽþèŽSJ]J–›¡U¯ÌôûbâÁ”ÔPðÃO¯gÞadùì‘ðûã):: ­‰ñ à6ÃIÔáPm)'ÖYñòâ‡Æ4g1*—ÃrË7È<ãÇ“‹½÷>|ý‚:ÇRÜ«óïòa¥h å¬ÿ©—L4œ=T%^Wt„¸Fà(Çö6Û÷QËÛ³³¤SUFS­Í<ÊuHJ ½…¸‹&ÄíÓ†Ôå“§REÊ€æHçöì"mKÃH”“h¡:¸; ®â¶ûÌJixIͨ¬ ØiëmÉ>óöEÙYVUé‚‹Om>«®‚O—òåÆðá]>f êHiVYÈÜÅ¡Šäœ©UÃiMT@ѹ÷ÁÓ)/„röŸN–Ims J=£™û.!Å“$s|ãfj`¨éßí…²LZ#HÙ&ÆÞ&¢ZÁ´¨_JByAâ[ ØxGEèæPÕ(TŸ/Hü“|”7‡ÒÉba;²å_VäÁÈ19Ç$œ#ý1-k©£Ì(a·™–¨SÝ:A tÍ>Q˜“qSd¡Q!ÁÄÊOz;ýÄ=`¤À=‡w¢8¸³µ2r·ùG?-UejDÂ¥öA6 êmÜ›³“óÚ‹ŠCi±Åù_ˆfpN"–žeBTó|ÒR—ò´uõ;0édé6P3É äãhïÅyWé’YY‡]¨%d¤yDñ°Ã2¨Øjíˆuv]×RáD…Ùô,ŸV0ÅæáI·deñ²ZÙJöÙ™âvgÆ xÉÿž1Ù‚Oô—@þ·ËÿöÓÛRa'³f.î£&-ÿÎ3ñ‚?Öeúß/ÿÛL{~U—”~Ï3̃„Òcå„fõN@ @ @ƒÊ3 @€c¤f @#S¸1´kõ¡0<¥È”Ë»ƒñêHRN1«‹ùÁdjo„±çž2«œòÞnIG3IŸAãA£Wï,~ø‹{ñŽ«¨`É“o~„sïF¤IÑ)’”éS/%(ÒYe¤òJR,>è_ xF2”37Ëvkûc¦Š†¹”ï°ä„Á6þ¦¿Æ §èÓ)”-µ±ÓÚ-±´@³K·=GSèHâ´u—àAEäÇèõ<_2NJ* jäÂ;äÛ”Ii¹‰…ÿ(‰%£°õX[(¥Ê”„ŸižX“{=×-: ²”’uDS´v\RÄÛ9Vœñ“¡T'–@raa”“Ñ#¼¯·HŠÚ¢ï¤Í-Wæbw‹ô T¤ÙM´¿ß«¼~ñðŠøªÁk¿!¦cÒ>+#·ClúÁ]‡HNË|G’˜ÃêÔá0ª–Þ§Š!´heèU<½ ¡±á¤ËúDÛh·3¼4²·TL?a)>+ÊpŽ[\YwN)mçÈðJbn”{á¯ É DºmbS©^Øvð1ƒ:—@Ó-zQìƒBM„&›Pðˆ*ƹ×ðÇ6éÞÆæÜÜÃÛÀ¯nQip£ »0=±eRåÊ@·8aVxϧn±gJËÙ Û§HQ(ÿœ'¥¥S±yĤû/ü¾rbuZ”“i6º…À蔿DAò¶˜®‰§ r¨*ßóŽÃï12›u3UÀµîÚ.â¿zã#³·ØË_sÒ¦˜¤-d![8æ>±ûǺ#¹Ÿ0‰Z|”²S¥¶T R‘ÍgdS@œUWϤÜÝDuÖt›}±¢ZÕÌmÏË î,a8kGKÀ:9,ahC7L!…9#C¦ÌÔæYM²ÒœPvI‡èaÇØ>S0°.#³êR$+”Ùšd‘ëÞiM¨;(Ç qÙÿ.3··s71Fzbœ¹§VffBÃø1åJ±.ËN©­NiRuhZl«¨„Ü«½aœÚ 4pÎíI’yƒ‰]¬ã|½Â*­J/6ì¿¡©M¸¥$‚—Å—ZT VAQ)1‘‡°;™E‰ò/æ5:30ª!ÁŒªj^a—]Sº\Ò•hÖµ]VP ±OvçlÙû416íI™†^£c|ÂÂ5*UÊ16Ì¿¡©-¶¤¤§—BR¢PIH*F;<ü¢ø³+»4`j¾0Ë|gp´«îÉVóv¢]%åͺR SÁ(ShÔ¥ jN€v»»]g§g‡dϘ똑º>-®“@®ªBNu…½O(3l†Õé-”»² FÊX¿nP¦'<ê½…(½›ÈZÍV¬ø W¦dÖÌ£2ß8™¢_Ö‘Àp8’›9§¹eõ¸;[`µe¾nvÂ*|M*Tf”_œ,.’Ö­üt_ßFhvó©Q³Sà\°Ê*înOa4$âºlÚe™‘YðÒxn,¡¦É$¥@_I‰óýå¿ó«7=3¿2ñ=æ)ôÏOÕ§Ñm}:¾¶«ÛG{Ê8:»";»Ifµsd~1Î,=ŠêV0íCÌ:=çœqטK@”'S:”6 Ý!A[X8ß±1¯|ž(Ã8w7„±kx™8ÃòAºšç]˜2å²ãª#ˆ[!|0mt„úĈ½r¿å©Ws[à|ÉÉêîU¿ŒPU‡çç§S4ÔÙµÒ•Že²n‘nñ ZAÅWØOµ&sæoiüÔÃx¯ U'(°¤M¢jªÚÛÁZ}5H–Òþ"ÛK:M¸A[ÞÑkåOhüûÎÜÖÂté\›ŸË,(ÊœÅU c$êq`lÔÊ5\‹iVʹOz Ù.“Œòc¶æ}Òq\â±GÌL@º…3ËS”å%†YTôÀSÓºž"^BRβ@&;;ó~‰ySˆ±ö"KîR(¬]jU!Nº¥--¶ÚA ]KZ W;G;d¯oÚ¾aãÜAÅÙ3ˆ0/1éz¼©±=-6‚H.ii  SmÕºÓ{x¸»ZÑëØƒ 1]?àªfbN¾Ê檸¶ÛžgZJÒ•%I!Ä­6P:,uZ<øìß–“AÏü²{*2ÿ5r§72—1½3:âhEP]D¨tè)â„•ê^¢Ù±0Ú™WÛ:Sã¬íÂØ£ þFÏe‡baF£éBzMRfR Mè[B¬o³©Þ+6þSÖEàFån3¤bnßÏaì“X•Ù³C\Å5æÓU ùÖÞŠJGüVí¢÷â'ó„%ÊÌ#?~Nœ©¢c\¬ÌõNSúS˜wR–*r«j¡34ÓÏ2ãeI`ðÒ•‘pòlF `ÖÏü¥ÎìÜÏš™Ìº–Pd]”f¯‡j¨•™š˜BœSÄ)*BARÅÖt³°ºï ~MãÆù£†ó&“Š1 øê……ëÆ›AÆ3 i]Q‹¹rUõì”´»›¨À$ØD»åÂÈÆ™-F~ƒŽ±,”Ín[Òi¹(&g]BPêÇ'èB’››l®t^ÂL‡$(r—+E¢È6–‘’h6ÓIy’I;˜w£0ޱ˜ Fëo½­ äÖOV%©X#—¯*ûÿó6夛sx/%Äj–µ{íöÁ'‘ãóÈäzØs¸A*;KÓV²Qo88Í:¡Ì,€# Þ>5y²ðŠG¿øñ}³%×V7QÃŒ49Ž"È'¬>dÄ#4*ÈÑxkXItÛxœžVIÁ¢ñà„dЏ”§`w’|a»çY[ÛŽÝý°ªRe`‰r_)ç§{GŸS}#Ö”â»d–‹>™ !Å åcÚg£gkì%Ýr²º%E¹‘uùGOÕª¯ÓiÓ3ª—!¦RÔUÈ/ªšê5JÝ]Õd-@ŸÎZ´°˜úñ^+ŽIe’¦x_äs§²3Œ*¦zy÷ ÙÅ•eöû"14½ _Ö0®¤éuõoÊ*.÷’މöIhùVÛbs‘OQNZĈkõ”Œ:Ì+ƒ*†Ç…ÌRžûœî"ÇÀ”Î*åZ·í‹¹ŠòI¾<ËhÉ´]™qO¼Ò¶Í&ÂHk²Ê@ BR›X XAùÁ7îîwë5a½îc¤1FÀÞ'\·•¡|à ^gÝ$Ð Sïí ¸\t8Y\¨µM™œ|Ë Ô¯Ðí&*7s>¤¹Òãl0†ulÞ‹›yŸÒ)µ¢-#¤0D©V•Z,if·ÑËJ‡/5kq ¢Ç”bÀD3X²ÆÀ z aîK}Пpƒê*àSçf/m´ly‹’~Á ¨’ž‰A—I%fþ$þ݈•AK I2¥{{Ä }‘Á7³ÒÆ´Dòü-—uRë™_µGo³ï†*êý3O'Uømïûõ÷—ÐZLN¶bÛHK HÛd‹~‘f¾—ÔŠ€X\ÓIµÿtOéˆLÑŽ’Ó—ª¼ â8¡m­n_uâ=‰gW3Фeot¡²¢jšyÏX!|0{·è‰Ú*¡=1RZ®Ú·R íþ*b.Áš[‡ÖqEj¿žðáÙmh"]#t‹ÂæœJEˆ„•)Éi©ÔêVñ›Åèh©-°§OOÙ+3rQ%s2ÉxjIá–ïyD_ò’¤ú@f]t¢Tg¦Ÿ ̵ð\hžiŽfY)܈٦ÛJ‰$ ºÁ¯2­ö1¬S§&fPw†ÐêUkÇ)Rè*¾ãaô<ÚÂ\m@‚÷ÇDe½rõZlÂ\™æ“àTStŸqÔ=ÑËê¤I²«ÌΣ_æƒrbèËùÆ“…¤Ý—p¬É,¡*𲂇ùQmQÍ|ŽûÁËÔ),©@\§Ÿœ?MÐåf»@߬W9_:©ê*Ѹ!*é¨^,y9ÇP h›m{G;´Á”/jì"Œ¡©JJ4…Öª“rRtù`GeåL´Cm¬«€Ç¥øRMê~¤JÌ#‡0Ä›-8‹ƒ¥I@\mÌá¾ÎT»HöŽ{8¡3òåj“¤ $µ9UZlëÀˆi$mëv°¿}§Õëáìó3K”ŒÀ§iº´õ³nkÔ铳ê”–«LÊÎJ:¦žaÔIº¤8…¤‚•%@ A# À²ºÆcÇúzóÒ—Ø>‡Ú=¬þÅŽU)ÝŠÌÚž•z[ç%JùZ¤8\QUÝÔ4Y X}°ûbãZíc#0¡Šð+a)L][sJzEeÁ0ÚÔ–%Z-,’6Uέ:H§±Ï¿Ù§.&3eŽÐ8ê·_Z°D’ªmÉ95ĦH"Y²âæ.†Ë…` ,„¨ê(OtØãì‚ÏÜ×þg½£°½Nw1f°Ý/Uk¸[ci$k5,ABŸJ•u…8’$pu 7)}ŸðÖ>Å]€1þkãlÔĸ´UrëÓ¥0ýFinËK¡©YÄë/K¡çBœI@CˆJÁ».óHõ åhµãÄÌ÷ÃnÎ|”Ÿ+ɫϰąnzMt¦"ViOÌΩ/8ŽJ[~ޤ ô9ùÑ×½«1>`vxÀ9‘˜70ësx—×ݤ»«ïª‹lªi»ÝÅo¨ÆÒ7fÂÆÄw´óÆfo2ûv©ÉÌ-?›50VdL9K™“Å/‰‰I„­¤[Z”¢”…L6@ ˆÒ“1™·ûNçMO6ñ&UàÜ·ŸMNC ñÔ¼öÄ)—•¦|æó‚d-RHYyõ,­céÁKfèµÜQþ:Î<«Ç½•s£›õìNŒÚš’ùã ÌÙº\»3>ŠxlˤèM›š#VZ}È€S GÙßÚƒæ‡i<Ô¢«æÞÃØ> í!•4ÐúCÍ8ãjvtñÚ* SEA$@ B{ÝÉò|æÎ>ÍÞÏÓ¹—NŸ’Å”ºƒÔ·ß©IªUéÖІÜmò‚”îRèAP%²yÞ.|k›x;.k˜f‰q©‰fý+2¢:þ¤#†‹ Χ[þp‰ty©ò¢eÔÖ%í5Ù•mbºå Wë-ÐÚL„ÉlS²ß³e­êLIMÖ7ýŽ×æÄÓ´Ž'Ì7óÛ#»-a Ĭá†ê4ÎVq¯®«<Û <›—®ÅP“uJP ©N‚M½àGä¶+Ì>Î]¸å2fc40¦& *³LžÄ§¤Hx§I* ú3 ‚mÞl€ ïÞ#HÞ4;B`yÙjŒÅW c€óaÀ1¥cb?þÁý“ý)ã“ÿ¶•óƒ8rW&uÂø—¾ Ll}ï´3N×%¤À.>„5CþdRäPuδ’çÇçPñòN]húùdIvL¦¦eäŠ8«°Q°öÇ6öÒÆ£`FÄ«ü)§J[Òw·X#4»TáÜ2šLôÒ6CL÷Ž«}‘ÆY™š•œÞ®%Ù¥+€‚C2é$çík…n<•$pKÈQº{Ññ5j§2–ÄãÊRÕ`5ÂÏаƒ<®#ï J.óÞ9ï³öILÏÔ%êu6xrÈï%. _Î:õn&ZQ,K€„écÕÈ¡Q9#Í«“+nÑØo(«6RCóv–N½c¿Ø pE>†ˆÕÞš˜ÕÊÝÔ }ê?êžÚ5“+O Ñ5o•Mºú£ºŸÓÜ 5)*ƒpà +÷ÊÜýñÕãEñ·ìãÎÕÑ *Öô5ι­õoµáÄ+@q^\V¥ƒ$ÓĘH"Ôå‡!´MEÔ¥øAO(©Ãæ`:a–8“ÁvÙ;Åù—ò| Rœ#¼â¾Á®—îj#uªÑÐT Q+K—h ‘sí„ÊŠö:¥žq¸ã(Žq«ªI7ŒÍ¬G8éBL0NM„Þƒ+•PÊUr^VqI¹Kj$ù@› ÍŠ†Œ,Ë(W~fd[óR ûÈøEBÛEN!6ÝFÑÓÙ[’3ÙK{×PM*]*LŒ²¿«/ªîFÞØ¡ç) —ÇŠ) )œ é¾£¨™½³¯2®—èXFž… øI¿Â,zDšæ¦Zi´©J 8Zèô™T ¬€"ëËL(%¤­Í z¤K¤ÿ•²m#®!« œ.a &LÊ…ÕeAOÑK¤¸|;ˆ'ï0±±©À“¹&äB:ŒÀC5G4I+â£RÞÎõ¤ˆšã*±0I¸*UÏS{þ©5SšQ>›¬$£ñ1"Ã3Hú®Jµn[(Ä}G‡96áîŽ;Ä[ØŒS-ö94™fXp¤ž\M>Áqú>1Yá)Å=)‰ç†Ëâ:?¹Aý&&¸ÞdÈSŽ”Úò¢þd‹ý‘\àK˜~°’K8‚G]A#ôÆ•q'ý‘´ãþ†‚@Ô„¡Vó;}‰WÆ¥e¸ÌªÏIçaV ›¦J·kj|ßûÿÚ0˜Ü£ºmxÒ(¶ô7ÏÉR©Ê.L-O»áã™ìq).KR’H.@‡š¥é‡Á\]&ü#É^ÓÎ"øŠ‰116·›¦†Bˆ)JIöê9GT­œye$ÿT<Ñq'Î.©”¶mqh˜SÞiv‚Qä—˜inhi@A ½‡ßj{ºæ.ƒÜénF&Fn¶>T4°ÊÜèTbSpÕå_YšD¹FÁ²EÎÿÇYÅñÒ¶T.‚ŸŒDåäÚC„p•_¼mÌÄÃ[edMéÊq¾qÛ”•qol\-tÓ+´Ò£©)Cé¿…ˆ?m¡")òå¢CiIµ¯hxË)Œ]h쉉G·‰õ‡Ý)Z1Ž.;;3³MU3¹f­ÖÆ‚Š‘‰'i m=†p<8€ö1ÅsH¡Ñ™½Åwe9°&ÈMÉ6ðñЧ³¤ùbvE7KÅ6'ùxÇ]å–OQ±vwR±ÅNa©™Ü/Ouºu=v:}VTÁIðJJAñQ;XF˜R“Vrfut[½žrZ•YA‡°M+Sˆ§³û"i`k™˜QÔ몷U(Ÿ`°éX£c»çxÞÂ=3Ï3Wkö,g'þæVÌ^‹V!Yßg²×%ñö/¦5.ýJ‡êYV¦Ò¥2·X–qÔ%a*I)*@ ¯b9Àœ=”{ Ô;DvMË·*½ˆéYyRyùêž a„¸Ë¯5:ò.ÓÅc„•Ò¢’…wW3·bçïbÚ>lÍàŠîÄÕ ±Æ¸*\IPë´†ƒÜ `!…´¥ h¨¨lµp¢" Ùãå&Ë\g–ØÌÊÆ˜{ fy™ŠT“3•—"eÖš Z¸‰gR…Y×­}.Æý¦ñFíí—¹#+!Hs â8íbjqÖ]3Èy"x„¶°à@GìVö('uo¸°±<忥?æ…wc,À£ÍÑæñU¢“mæVÐ,ɇ4¦Å@‘¬\!)"$ÙyÙcò ±ÔÖD~Súw‡T¢üÿóO¦ÏÑø¦ú8þ¯½§˜¾ÇãîÜy–å̉s›NÄ-8~T4ûÉ—_æºëm©¶Èê G[D×3³ï/roÊâÜcŠéôl=6P%gJËÂkRu'‚–”íÓÞî¶ü ŸñÉãOÅ]Œ°®BÏci„«Nª¡-ˆ˜¦„ët»0±ª\º{ºfV›/p úD£3;»ž9†p~bfB»ŽðôÚçä1ü„‹rMÌV¤(0…€”Ð@P*-%W ågdÿhìµÏÊý_béü<8RÃ’À‚Aq·R• •X© &Çcì%Û»!qÖé6mõ¶p“° YÔHµï|©ì%?AÎ6eæŽkVs{PS4DÔ$Ó'/$H#_ 8½K$÷ /4;T*ù¿^Ì|«ÍšÖP×±aÆ©òI›—Pþ¨\oBÏ2n{Ä‘bMúÚ(„ºÓ̬-!BéRT6 ‚"8—.>RJ 723œU¬=„(Ø;®‡A\”¬Êæ§[KóM©N6•:§”°Ñ*BW¸€kþËÔþÖùJœ=\˜ÃŠb ÕJZ}†úB@ l©:’Rêö I½ö±‹ægc7sÇ"ðÎÌLÀ¨WqÞ›\ü†?‘nBi¹‚êÔ…¢‚Ú E¤ªá\­yLÿË©ì¨Vf3Œ)jÀ‰hºªá{K)Z4›Az»ºÕ¨kí¬í‰“™ý^z‰1Ìn°ÓjtÈ©‡å^Zë) y´×Mí–TöŸ ç 2óG5«9½‰( ©š"ji“—’$¯†^¥‹’ ÆûH,Àýƒ(t7{BKâLB¼KEÍú’çæ$š‘ôUÓAzeä„9Ä_ITÂJVRÚI½„ª±ÛÏ ¨ùÜ?™´™jû3UÖÔÛÆ]§AÒP¹ß$Ö,AÖˆxvÕ˜É.ÙX7.+³z‘–µ.åv©[¨!Ñ4ÃÓBR…‡4i*–hðÔ¢V@7"ÀV+ù'ë¸Ï.)Ø.¯Ú½R¢Ñƒ%9GK’Ôöl ¤ÄÀ..Å)Jõ$!:€M•·¡±Xä¯i\³í-P/1l¦#ò”Í4†aæu_ISN¡ Òll«XØïtqž ù:¿#ûcl†þh>—ùKTMKòƒæ]eÊ«G£úA×þ•µøƒ×å¶òlyØ{òÞ‰ÙÊŸùkè_Ì}r*â|ÕÄùÛÑ“*ž\aÀÕè¾.[_[oÔÐ ’3/°uJ§šx£ennW2Ž¡‹R!•§É¦m‰ÕG¸‚ÒÎ¥W$)J)Ó¨Åëù3NÈ\¶§auR§\êS³:ÄÁzfiå©j'Ø‘° Íɰ @<ö¶ì’¾Ós8 ­MÆ“XઊªTª£2B*i`©¥-)[ ¨VØÜìÙž=‹—Ôœ¼«ÌfN›86Q¦eñí.Q ¹4àBC«r\(•¬)a X ֤܂Aé˜Ìýž»Œ¥Í ®gc\}TÍLÆž•ôVªré–nV_k¥¦B—¤¾«pÔ«ôÄ#Er÷Æñ­¯Î<æì„°œ#ŽAÿËJÇùÁ ;%8FÇ#ÿm+çy¹ìθôr~cfž)Ä5b£1.Áä†Í€ŠÝêŽ!œq|jœÛ‚Ûêp›ÅÚîXU_$&AÂ.ì)ÈÜA:ÝÑLtÈ©1Š„#Ò:\ç'¶s§äüÄäßÒ8¥}b²"õÊ,;„èm15>¦—8 Ô\_/tM¨Ý—ëÓ¶S"\(ï¨nLé}” “54\'¢E¡:ª@–íŽæ®b]ìL¡°?5C”9ËfuiJQ0M­csÓ{3Q¤ÒJ”@úÛÄ”e] Q¦¦Œ²4K4§Tt²EÉû#èSÖÎ1í]ü°Ì×´¨®ZQ”4‚@Ô¯¼Ç;âéõÍT_.¨¬ßO-¶Ú'¸Ó&­V©M¡VvmŪ×õF«‘ýÍ¢©©»Å|ßs{“†5I~i[ÐóÖRÖ6†•a¤å™B|¯ ©k M£z0C¤©áI“ã ºï æ~‰” xAˆ/L¶ŸL H_’nÛ ‹ÆU@! lÑV`P&ÄlÚzÅŽÌÒÈD³D;q@OKCMVªB€7#¤3R.Ý òñ„Ë™‹Œef©YĮ̩W$_¤c-ð¸ûHÒûÉ—ZõÌ8>«crG¾*‚¥‘kÅÅÙÛ¦–ÅF¨´€óËL»dôHÝ_m¾¬?gFrEöe%i8u¹ FÄ£M™i;€6ŽÇØ*k眰˜eInri/¶¢6P&;j§QÖûL•wb¾Íú>¹&ÍIÖ‰œ¥6ÊÛQÓ¹O°‹ÇDâ¨Kl›åÞ^#œ”•H!§V9%bÿ¯¶Õ78Ó(i´†Ò‘ÐE7‘™É€¢ËËÉW%Þ©Í$²vpmêÚ,ŒGŠ%*² b]agPQ1åÍýqVÑJÃN¸µU³kxßðˆýVwU´ðúÐ'À Ÿ¶&\Ó$áê@tE+ÎppT‚·veDû“arg¢•\ùTŒÉ½ÊR7ýú¡¶t¾´žn̹‚¿eüƪK€‘Þš$“ÏœoP°¨K"÷i@ý¿ŒBlaÍ'‹rèl‰OÀD#-QA¨¨òô‚GÅ'ô˜fÚÇͯðD#/FŸ7²“2±þIý1¢_©û#Ñ¡(eZIÛŠâ¾D+.e*ñ…Y„“éR¤ô+ûBLGxDÒ4FÉ^‚]›í·œ š"cÖ²mG˜CÍïot4=%ß°Lj™OÌÝ7ÒÓ¾‘öÃä),qaÒÐR”%mÈF‰­ºëü&âí´dñ «G)Rãq Ï0ÓÏ %JÿS¥¹5*ÒÎÎÚÊHé iÔtYž:´­´êokï}ÄQКZQOžvéxq~‹)öÛIör ÉB<¾øn Î¦cL­$°Ríæb.È–¢_y_2ix‰¶R«¾£{ø(E«ŸsX¯ U°öfå¾$–—Åxi.%Ê3¯§…T•Y q’›î{»½,@Š^‚òeq¿¬¢£ì6ŽŸ£eî¯Ó%¦¦%Tâ–'Š¡¿XèÂÚèó3+ìè®ÊÝ©0¿jŠÍÏB¬Ê€ÝZˆò¾žIî Že{+¯¶ñwƒ}ãʬØÀÏö_Ärùã•ó"“;Ly¦ë”gT£+U—uÔ6B‡Ö>ðAú‰B©ÍB [àúT»oðï«N¤…ZöµùǧjÏ2J˜ãÖ*¾Ö?ìXÎOý̬ÿ˜½¬#«Rd«ô©ÚeNJ^£MerÓRsm%Ö_ii)[kB J’H) ‚ (G‰¨Ìl”wä¸o!ªb³}u Q($ïPTɨk…é¹A”îj½¾§8é5.¯CùGû*Óqçé<¦——¨qM×é(”©¥Ý^z¯çOÈ|´¤ÎR&ärï IÍÑÓ¦šü½YµÉ EveAljR•ݶê'™‡©¼¾ÂÓøÆKÍaºDÎ+‘`ÊÊ×^‘isÒìwm·Êu¥ˆçt;êñ0ᦥÍѰ&pP1Þqáü»ª|í4Î ÃuÜ$ÅF©QYX}m—nVW¤6°PAX)Õ¨ôqa %HìÛÙb‰s­†ñ 1s3˜gU°ÞºS®e m3Œº³ÂJ%ˆ* %$+oOqP`ö¥+ˆúÐ]]Ö³©D›­G©€2—1$pÉ]^˜©á)hÌÞbªA™:±{Ñ%VdÙp>âZZ  jRÓ{ò3,¥Ä”ÙÏ”«'çéXƘ,KaéÖœšÂ8}4©&ÔŠtú½–Áõ#’W0mÊñ*Y Ò^yFË}j_¸l?LDR»©J÷ÇiÊØŽ¢åܵü ¹Ë¯Ž¶‚¦Té‡ CvBÜ·(~† åÝÝ>B¬>Ávp*Þ ¼7¾¢§NüâC‡Ñ*·OÖ;DûX˜môÈJ-dîaÁUeøj¯M,„(Q¸P<ˆ#”&ÄdÍ ø$}ðmUatí@~j¹Fò^‰NŠÞSKeõViª|´“˲¸É@+ ùžB. ¡Æ3Ø•‰©™¹…8”¬6E…úýâ9ç6Ÿ\FEĤºÑ ·3¥_ÇCÚ[ÓÜ*²¦¦–¢û$üâÎ’‰Ñ†W2òuI‘Håu»xˆãWTÖ Gç¸mî‰<òÏ¢²›÷?tDñrøØMIˆà÷Z”ôKZ¾71 Á©þ“j å®aÂ?¹Oá<Ý©L(^Éi#ì´Cpqþ”@Ü©ÇÉþ(µÑR Ì"TY\}©ÑI{JB(zÇàDù)6þä‹I»¡I¶Ñ¤z6ƒÙ'mÂvÕ·„ -t aÒTÀ,€F>ŒÀ€ @€ F, 0 @€#, r˜ @1q F$’òñq«dO¢¶Å Ì·,6HIöõûo+Cj6‡ìK0fgœ¼G'—¥°˜ì£‹¶!Wy^dÃÛcÑ) [¼¨i’h¼úœ;T”¥±°HÞPÞ›¸»¹62a¯F’i°,@Þ#´IOJ¨´›l ÌIjNð¶áѪ_±ü¹ÃœœêXgYܶ#Èt•rÜÄ‚VêÚVˆ­•ctôËõ ‚ëª*èÑ"ôs¿œHE¼iè±÷Ɖ!Ãò%úå9¢=y†ÓñPŽ££Ljœ'ÉDG>áY@œEL6å0ƒ|^ti/©DdíñcÙK¡}eâfÑã C‹Ï)e?¸*/q&B¹mh^ ”ÓÌi´S—cIÑ[æÅ)uèá —/)R7 €möEË€ië¤Rpì¢Ð”p˜$-¨©j$ýƒáYæÂ¥•¥$ê:|o™ƒlQ ûªRT€ äBè1åg³ÒÃŽ¶X¯’P‘sÝl‹×P§0ÄÁßgkû"RçÒ(Í@ {¡’¸× =~®«ð=ìPR)¤O ›è}­ŽÿŒHª3*Éêñ½äˆ‹Ê‰JÿLчÚ˼6¥MÒ['üS´„öÆ\Ú`2ç[¥?¦ ¸I<,2ƒsrâϺê‹'5ÖÂüP«ÿb"»ÃdþO´ÙÐâ‡Ú¨Ñm.ÍqÚ¿Ðç€Pû-ù75Øžq1ƉãS¦’9…otW´ù½.éVѬP)S&r;¡çhEÂŽÀZd¦’AåÒëâ²wòÚgCz!¸¢«S’™lK¶Á¸.ê¹ý‡ªU&ÛPœi*RJˆ+ån†'ŽÈ52Òà>\¢=;…wQJA v1qèˆÇ{cDÜœË)âÍT¥ÙlpÈÔ¥|cl !é59‰Å%AŽ€³}¼ æ°Ð.YRÔ–óÚ”Cªi¿]÷,ÁŒ–¥¾”¶!­‰Ûe™3d4‹ò „Nðã…¦e—mH~£”@§TÊÒàDË Ìi‰U¹sãü‰š¸”çh,Õ:¼û¥²i•t•jd¹kŸ´ñ‰^Yü¤Ù唸6Ÿ…%…±…5^Vj½"úæÒ@J[R™y° }e£srvµh‰Æ¸*fHªe‘ÅbûÙiéïøâüA,©¼ËJAnË;koœ$èòçg\ÿE»??â »þ÷Ï~·+v}“þ·òóûÝ=úÜqÈ]Àå+±9³>(ì“òµçàÿ{ùyýïžýnôZóóÿ'òóûß=úÜqÁYöˆÀrÆÃh9°âŽÉ+^~˜2òßÖéïÖã#åiÏÒ?Ô »ÚùïÖãC„_xÏö¼ØqGdŸ•§?â»þ÷Îþ·|­9ømz]m>{õ¸ã5,øÆRú…·ÛÎ&QÙ£åeÏݿкÚùïÖãaò±çéåA˯ï|÷ëqÆAþ‡”n‰ƒ¸ÚLTvWôX³÷þ"˯ï|÷ëqò±çé$|×^ß›ç¿[Ž8K×ëïŒñ¹ï'd•‡?‰ÿPrèkç¿[ýüþÿˆ²ëûß=úÜq°|Ïolmé$p)²‡Ê»Úßê]{§¿[‘ò¬çúÔ(Ysë|÷ëqÆÂl”€OÛ ež%Ásq}Œ>B£²Uò¥ö‚KÌ´hys©ÀHÿCç¶Çö\,þ‰ÇhPú –ÿÞùÿÖãÚ|®¤‹ŸÚÛÞaèL› öƒ‘\¨)·hcþãe·÷¾õ¸Ñ5íÿå·÷¾õ¸åÔÌžwŒ™“np¹Ô_Ñ5í Ül¶þ÷Ïþ·ú&½¡¿âl¶þ÷Ïþ·¸&Hà ›uƒp:Œ|¦]¡È¿ÌÙmÿPŸýn OÊ_ÚGýGË_ï|÷ëqËiœ;vŒ™Õ$ùAÌ8LŸ”«´9ÿrrÓûß?úÜl~R~ÑýÉËOï|ÿëqÊÂ}Z¶6ƒÄù¶ê‡È\¥)h“Ê•–ŸÞùÿÖá¿vøí‹¨SÔu½°â'[,®§Gšô¶}b×ah "âå&×ÚÄ9½5 XÁÍÔŠUº¹ùÃRBâ\Yo˜s9q…åh4¹‚©V –VúRµºâÔTµ¨‘¹*$Ÿl©SSVÖ0 侇Oìô°%Gœn«\ôíc~‘©‡”yG`ZœÔžé±S¨zê¿”¡'¤áMöTö˜ÄÉÃùY<Â¥ú‹‰•MŽúy¯ìlyåYxJÈÎM”úÊSÍGVöºÅjªâ :²Š„›`)#þgô$ŒqöcÔ›iÏCe_DÏѦÝmÌüox£[1›­Ôã…é•(ï sËâ;`yvyzPµeÝÅ“ÔÇȦ*+=âéÍ(¸ñ'Æð½†½¸ÝBÐÜRV¿°Bc²K„$ŠYzeCžÉ0]YÑÄ;Ãì« §QÚE€:n}±u·ê•&¥e]yå„!}Dô„ÆI0r¿>§”“èÒöR”z« ‹úz[!:º)a¬!@bš á:ß_ç8yü9{¡<ÐH ÜH´ˆôÃ)[CsÍ£aÔýÿËã`qmùBút‹Ú÷åaöÅ…XvbÕé#¦äº [H(Y·QvN¼AO@;©Ñsã$¥1eÐ)çh¦\chN¹u¾ÿ#Ê]”²zÜ$l›ÜŸt/,7M— -…8­‡üá+oÔ^Yu%Õ/`ø¹26éPÆ’¶DÜ­ú<âT”…-'¸¥NÜýÑ. ÕMFQ¥º¿HrVm+ê5€6ò±ígb\œwLºâ5{„)G’}ÆòRpOL<ÓîñiJÛp«ý„ŸŒrN/¶t)Óât̸du†\X XT§aßR½ÄÃÔ¥•Pµùjç Xððè O˜ÛßÍjΤÿb’RôIÔ”áüuCõsJeY7¹ÖÝÉýèˆìѽ¢Fä¸ÞÞÅÃÞ!X[@ŠE‡¸š´7Ø«1Ò]’mV½ÐƒöEg‡…èV“0±ö˜µ±{~“@”tÔÂØ"®ÃÖD­MžÌ•á}âÒ3^$IpT[6ÙFÞ[EhË!ë_e§hµjퟛ¾³ú"©—t…¥}A)Tk¥V¶@ º’:Ãõ.¨”*Å_ha­`ïåe“p4û#JLÑI’Ô8—m¤Þ6q@ˆŽJ¿1,D’HTœM.ÑÒóÈm]ÔEWFŠKØä†;Är"1tÊY¥†Ò«-ÅZÞ]aC0¨ôä)nM¶¥ê6u(Äcwñn)kJKr¨ KmóÛÄùí¢Ù–\±é2L¦iô›)àˆŸáfÎS|â/2‡54¢ʆ’GÕ#‘‰ÖnÉ—JwÔ‹û13Õý “âZzçÔ Pò7¼KðÁà—e¯s÷õ+ÜBøôç·ÛŠ”ÛØð¢kD˜Ñ&åf–É1Ó³GÑ&¦Nð¦ÝmG–àG7v†ÃmÒ1:çYG ™²IHÛq¸÷~ÈèZ€,Ï4øÊ=(®;IS››ÁŒÏw%ÝMˆüÓüvŽø3Íš9˜+qc*½¹Â`åÏ(5'èG0j–-oÐ›Æ ïx˜Á>È`lÒ3{ØÁwåhÛ˜ç´m{«Ê0MÉÆ¶¿Xº}°”…^2›ƒÊ0“kFB¯•< WB ·8Ø*ÞqŽ&¯Â íÖ0†Ý d,“¼.•V•f‚·…²ë"ÐùJWsÕhxa´4Ñf­âo¨gP¼KfˆÐ{FÄ›_”PR÷€S´!ÐAÛòñ5«áG ^ÆûÚ )#TˆÙV"ß|ZÜtŒ–ïË”ÇB2‚ r›R¦…ൠ;@Háð¸—'{F…1²ÿ|>ÅAÈẗ H $À‡°¤z§·CZ¬“aïïHµì“èéÜwšRØ‘u\L—ß™™q- ›Ùd±)Ž{­TU=2¢Mîa©‡çe›JmÞn@RM¯ã6x·P6xéJ‘Œ¤ä$©»¥°½àšd©˜™Bª70TÂËïÒö‡Ú ²Yhº­® [£5R)l}AöÁT ?œ*¬¶Gtjö*qî+«QêbGäìÓóds:îç H]ˆ¦2ê¬"_¸,)x²y²[l–$’®JYæ¿pÛÚbõ6gbI*,ˆ*~iÐÒmÒüÉöGHÖ˜”ÃTÉ:€ ”h4 ~²þ²½æñ7lÒ+Ù©ÍT¥oÌÄrmÅnn9BùéDÛŸÙ óN“ÏÃìŠ,JùïÚÛy/å´#}Ínm¾öèÚezB¹­€}6š©·Ð²5ÜéBë(ø.P xš¯Ÿ¤RIJA;sä#¤ =²¬BG­·8¥¥\E\]@)¡w—îSü·Ž€¡2šÝNiµ¼Ê\óßþøÎOGF>Ƥ ]˜½€Ø$_h2$›mÂ4”ÙWµˆ¾ßt8Ì=P–h¯ÖWx/û£ΤÆ¡ÎTÖ/¥6 O5*ÛFpVJLkí6«€ÑJU;“öñˆ¦!A©Î>§*wˆ—ôÜ“¤¨}ž^Frªl·Š ™‰­ÊÝßÐ#ø¾0Hµ$ }m*ÿøãžeÙ fy›ý]`y‚?€Q'OÕÌ2ø¢9rª£³ ¶Íkó6¨,®÷[î8=š’ŸÿaY”¹% ú¼¼d•!ÁõOˆk¹ß”v®Ž¨Yªûr€MयV ½¯#ŽÑ²Mˆðo{FÝ-€:ÆD1<®`´doåðà ÏãöÚ×oÒ7ÜŒ.¯ddfßÏ«Ê1{Åà <¡[ ÈN 7…M'ºw€ - ¿¡lò¸¼HZlé†j>6‰H²v,Ñt%SdÛhÀA'xT¤î#R›yB($#Æ6½ÌA·8ÈM¯áé´k§p:AÉH±øÆ´+„)»˜/D*°‚–#}¡±ØÆ©ðaµöŒ á ;(žC¬6M”Ã4wt$“¨ìI>áÊP×kêIjœëM+ú¤ÇpÓ3LÂxw'ö$ƒ(PúÚnO¾ÄrÒ‰V•%ZÉŽÿ.Î-²¦¡ös—i´®©>½Ê%ÓouÌI?"p®h¦VA•»oÛïñ…U|fJTX·ŒBªç&w&%ÑI *&L‚ËzyX¤Z ÕÜ5IZ–ázܦðèüÓŽs0•ÎýïÒ}”A*ض‡œñu´úí¹ë¦æŸK2Úµû»xžM6¶UÄA²‡ÛÌUL O¦1°¸Ö‘ ’èúŠXJFäØE„Ë)£PÛoë%W™1 Âr®ÑX»m÷Õú"WZ[Õ™j|²K“.%¦Ð9•(ØŒgý”‹/³¾L»5|k8Žów”Õùç×Xöl>0óXžS)EEE_ü¿DJª´öp~¤áÉe¢I]PúιøßãÜü浨·ó„^‚&ž*6½ïáçü¼5<åÆûåü¾¦aÝ{‹ÿ/åÝžöÞQIe†U=2ÔîJºÔÿ/ÑÌ3ND³j›R,»pÙÛÔO´Ã¢ªuIR®”©jåa}¾;ùQ2E,Ù?ÔÛüOßñ ºëSÉœD¢fʬHúÊéîÑ8{ÓèãFZÂg$d™t¶y¤Ü~ŒrˬMK¬ì§WvÇ2@ëñû ÜÏÆ34¬ß©Ì%e(eI—q#ª”‚#/Ù#|rQM)YCîËÍzª) u¹ü~Èoǵ–ê´§iN/A›mIiåQÒ’¿í·9J–q Ö‚›¡[sÿ¸˜A^ZjjJ^R´¶­H7±±hJ6T‘QQ'žV+’•›ºfd4àWÖA6"$kÑñ«Š%3Ei)ù·¿ì„UÚÉÄ’5f[)u·›âòPÔ7„¸Rd³XkWwöVÊW³—ÙKh!¦už®®¹¹³-6‘~¤Ž_d-ÅÓRÎ0,HH@÷ãˆ=*wÐ)õ7T²U2ó ¤_rt‹ýðÿ‰gõ.yjõP¢¹H?|pK£¹4Ù[J¯ýVƒ`믠yÙ6t9Ë;Æi‚å…£Þ ÄFß™2²*'ºòÜU¿}¼H¤@C®³Ñ§ˆ÷*t*ÑV9àù¿HðwSkZHŠú²ï ã¹2{¥ÆÇÀˆ’àyÿG«ÏI.×J¯§ÞŠ"y µIÕ)s`¤(¥Jö*Ä}°El™tI*]Ù¶vÛW1àDAqcDÏÍ$zÊÒâOäbcPx.ZQàlJ¯ì·âb?‰Ø(Ÿã‘²Ðþ_ÛDXŽ–³ÀM÷PØÂ‡ÜZÓ½¡¶MòÒ¶åFð¤Ì VãÊt6Ô–iG©ˆ!dºÚý—‰¥d•2tƒ¹¹E>¶éDË$y*+b…73cȈ˜J^W L(mÄP@ûá‚§*txƒo¶ªîªN$Ï纥Xymúc¢ú<Êãfô[?Rm³¿Z} ÿ!å&lS$p!¦ ¼»±Càyw&k º½ši!j&,J•uoḬӖA–tŸiIí‰È¹2±KŠ%&ôÄëŠ7"jé>KlŸÑ>6@¾èU½Æ*”»Ã¤³2žé}M\Ž¥)R°0[º^p_¥ïïŽl«G^]r“)JÓrGˆò1Ä’òO¿/?q.µ„“àÈÆj5g$ܧ<… 4¸èÆ›Xó´m ³½Ä¶¾æ X°0eÄh¿t0žb5ß~‘º…¯}ã^›@6Þ`ƒ{!Lgñ#ª* QøÄrr ë·Üóñ€«˜Nò5_xêäaC{î-DܘJwé´&X“… ÊIŒî|àÂàO =ñ¢ÞO æ Añˆ­Y)“ˆW.1)~`ÕšÔÝÚšì¡¢!ƒá«JI©Õl§7÷E‹´æë¹ŽÝF`3NOòâtøs÷EZôÑ—’BÖ‹?%¦ M÷”l·Z¾C«]=–V2«zdôÓ¤ê*]‡³¤A_š%Å—<ý¼ÿ—Œ*ªT¸…Å\‘{á2¥¬î ;ïÐïü¾0¨Õ±cΗEÁóÛÏù}°ŽU…ÎM¶Ó`¬’›s7Ø/-÷‚RGÖ±>Ëÿ/¾%Yy&ó5-¥´ðÓÎ"äû…¾0ÅdªZU4éF¤ÂÁYHàÍ·1 ÄS…ÇÔîØØx‘#ž›,—}Ȱ¿‡Xƒ×&ÒßÕœá¢XÆkE5©[®éhéÀÓ6R£êïªê;Äö…$Œ™ŸÙ¥Òv¹1)ÆëùɺeGšg%*Wƒˆ÷FùÙIþŒ|Ë,N/ócË;môÛaɉ`,(\ãžå'^§MK8ÚŠVÙºHèoE®ÕNA'Ö<ÀècEýŽôÅï¼,“ßîG”5…å„ì¤ÃmðõL)}Þ^¶ß¦{pA;ÜßÂ%”eú{²2ÈMÈ{ºo̘Ç,RÙÑè”Î2ë5\7 ri/9ú>á ñDÉüœš'×}Å$_¯{»í‡yÙ6Ž-—| ¥’m·-(6ˆæ0uBRM°n„jZ®:ãËg •zê4ÈÓæ• ‘çuCÕwÒ¦Iž#$«Ú…ú~Øo¯²¤[`™d(n£øAx&sö\óg¼Ú,G¶ûåáh~ÐZæ>lÇêZ”s(IIöïú ÌÏôê#$\¶®(öÛbÉS¡™ût£„_¯ î“ÒsVi ¯¼… ¡`øô0ṟð’Áu‚R¡áÒy¨Vµ{çîƒêÍ94ºka¨4V|µIs30»n§–’|u­ÔQ':´#u$ÓätQåMÝŠÛšnN ¶GV+#î‚iµ²§Rέm­%'ÃIˆ³Õn¸³byq—-L#Ž­%Ñ¥¶“ë*ñ¥QŠw¤JÁ+ Ò“Эk#–×°ÿ$Äó!He.[uˆ\„«µÊ —lZRZÍ ÎßğŒXÒ!ºs²’,ÒwöÿÝxâɽØô¬Æ-®z$ý=¢­-¤¹î°¦'twSYÃn´¥×›S _™J½ÇîŽÆU£?X+í·q¤{ox¶2¾¬©šcM•¢‚ŸxåöÅñà“%O›hª©'iuµ‡.^J´¹~èžWf[ªáÙ–e´´‚•ê›Úÿl@qê†?©¥Kkp,û¡«ï¼<76]•_ÕE‡°Ã’ý­›qh®Œº˜˜[k½Òm,XØïM½Æ˜K¤Ü¸²|ù´%Fæ;"q='nq[˜Ð ÆÚ€€ ¾öƒÏ I¸ŒÅ€y;±°W(%'ŸŒd(^ÑUcµÁ¾Þb0OHÂomö€ ùÊUìFþ€÷ð€ ÞþΞ0¾L>È#Uì!&þf)mêžnÛ€’yrÞ‰Õ):[ék‹˜A [M„-'nQ/f–a[ƇqhÉWÂ0H´ ˜Þ߬wÚ0O„&†ŒòøF vŒ(ƪ_HYƒã¬yÀR·‚Ö¾]` 4VÞ1­ýСm¹Áw·8fǺoÎhUqÎXXêâÓËí„n»kÚ½6°$ûá“EECLꦦíx@äÙ=a<ëö¾ûBñ<¡¢EËœ·XN©»Fã°KÚ™©»!D“´Aê3Å^ú•¨ÃíRoK ¶Ñ/¸· å°„A»¤ÍÍ3.9bÌ“za °Ö[QSÓJ|òI°‰5V|—‹€-ÒýcX­2d‘5]RÏZ©Ó%×”«‘ ru»D#ÉÍp®q‘v:&h¸óàßcmúE•†™,>Àsº¥]×û>Á~—Ub²%À%*^¥Ð ÏÙêýY2åR¨6°ŠAaUº‘™t­„^Öˆ–)~Òˆep¹¹À½”u Þ1Jî„‘½Ì0"êWxí{Ä¢‘8Ý_¹Lx}+»/âoÍ#áŒEV¿Œ)4©w’´(¡i7t1—èÚd脯©"æð~'Uª†ßp‰Gì…\ì•rTž)â„„¨›¨ŽLjve¦“ÍÅ< )i—ôÂu¤ïµö19ÊÛN×ä®L¬¼oàÐ"¥ÁUÄUd•(µì¶Ú5 r1kåB±#ˆ€‰e}¤Óä¶Ž¬nÚ-gJkOk­·R¹wïˆ>.p™u€vN´‚<€‰§xؘïdÙÀ‘âJLFñ“)UÃiçU§ü±Q 9.md³&‹q 9záyu õ¬ƇŒÄwL u6MäÒ9õ Hý0Á•ï'Ò–Ù ëã×ôEq%»{~qLúæ›wN¦Ü[J¸õ“Óá ô9åÐç•pý•¸ð²OËš}f°!µ§ˆ“äA7† “ë(mÕ¤H¸óßô­ ½ŽØÎœ©ÅKT%3’§RVŸ®Ÿxfyªý)3ˆ6šlâŠ" ¬ºÖ’Ê‚’=f”y/1 iõdJ8fåF½Üe\âéфϠ58V±qååiwä ê‰fl)ùe6{ÅPb/Q®‰4(yZ-Y¬d¦§6ê²¶ĵ3§…ªÉ<áî&áêV­D¡SkªN¡*6JŽçÀu㽜¹sÅ*è’ʈ}ÄÝ©d*iFÝmÝ|1ͼ¹ùµ»k­Ã²OX‘=Tb“HlL “8»‘¸lrÚi•j(–LÁJ°„7å{fÝbörjZ"¬R]IhÌOÛ¢.–öCÖÁu‰ùÀò¥×¨ ‡\ñ=O³Ê&´üUH’A,†ïûØn¬æjÈ[l*ÛÚtí0›“T‘J1l“I±'ƒiúTò›W¬|"??Š‹(-²u¸²JÔ®ƒÊ!“u·gI˜QV«Êþ¡%*vÅC‰ÒçÖ!öLòÞ*¨/HMÆàïnQgå#êjžÊÉ%Z¹ÿ/dV3A/)  ‚éÝIðià”¢™HKê²fîò2/Dânì‚fKÈ{Ï©$•$îD+”M  ªX·¾â#Õ ¥U«S3«B‚^p¯½±"ûYV™24Ùé‚›î?ŽÑm§Ql­wR/d¦ßi?¦0OœÚ®l¸é£˜ÜnvŒ…mçl|có¼ I±ïkA)T¨ˆté&ûÀäyo’çhÈU·¼ 7ñ¸²†ß+P>Q°PÏÛ€Úå ‹û#`AÚ $+¤l• ó@)b÷¿‡H|¡$*pž€ -,mn§¬H°Ê@ZÔwïCô=‰[%¤\¿XHÒÆúÁšï½â aUÌ 8(8?8FªrÑ@ªçxÁsŸH#]Ï8œ·X€²…Ì–ÁZ¼)U Ÿ£.äªj˜KÍ›)$Ÿ=6æ*£‡d&8m§¼‘mâ&ÜM!"ý2q¤•)…é͹Cr—bFñhKS]“Ã3nÌñ\!IPäb§yë®÷øEE¹!J{ÄÛ€µ–“²¨ÒÝl¡<ö—ÿµÌ»ŸYQUt¨ø–?íDåÅ’w„ëtZÄÃraÂ$åÜâl~z7ÿÿµœ8‘þ­sö¢bãžw„O;`arbá='‡êtwTì¥yÆ\P±RY±#û¨ÒbŸW}enWÞqg©h~0ìë×öBe¬ªûíÍŠþn©§•iïþü`—éU…œ¬8±æØüaØ®ç}£U*l\P¬;3ÿ«ÿ§üq‡fmþ©*ÞHþ8{½öJ­6.(gù‚dõIgËGñÁiÃo!ÀàŸPX½ŽŽ_l>¸1‚­¡sb¤4ËS'd] —©¸ÒÅì¤&Ä_ßR5œIJt»+_›aÂ4• XÚ÷·?(‹Â R€ Ih<âÌV‡ø£ÎqA¸U÷ûà‰Œ]‰ÜAâ)µÎæ&ê5¨6x‹å·! >üË›Üþå"¾†›ûªƽ<ØDÍzna)@*ä<9 lOX’XT½Vi¥E+#ôÂtȺz[Ê52Žh0“H°àþ2Ä$—k3‹:tÝN“·‡8$bZ²ÊC•I­m–M¡˜6´ZZIÚâ¡7"SAy)•6þ"œ6î©bá_lMXËY‡ÚJ›Ä³ªB†«§‘ûbŸÚ%8WÔ0ãÈmNªbJà)•ïaäbÕÛû'e|Ò XÄ•¨lmÏï‚ÝÉó1rî!œYýнþØœÑêrÕÉ&æå2±{އ„ƒÖ)P¹2±þb ’/Y˜÷¶?ݼi>­jh_Áñ‹9(µïå$ xøÅÂ{*÷rExµ¹µéN¤añÛÈ©r€\›ÐÂB±øÅžp@ÜÙ ^+„äD±ÕéûùZ6þ`2‡rzþÁR[äG¾´àPHååh«N@J%WùöxùØFã eBú=>°E²NžcÂI0½U£³ü²TVšõE+<ȵÌ) ÙAÅ5mX§‰±÷^-ØÛ‘ Æå7¶ÀøÖ&ú*Srä\â •ú¡+³ä¬ÀºñE};ľ-²Ø={§mã<=osÒ€¨¿ÎDõz¡œdº×ªžÒlw·8ocÔCŸ=œdÒmóôÿÁ1¿ó·I\ˆ'öòL\î(¥Bãn‘µ´¥A&æþ0O§³|ÕêüLÙ¾FÛ×ê ø1n¶;Ê7ÁʦàÜù@<;6ÈåDsvl‘Wû¿Qû¸ÒR9ØßmãfÐQݸ¹ååê{5S×醢<=X»5È$ÿ® ¿±‹¡)¸¿=ö‡[¸ØV¼HÒ;5ST7Ä5+ùiŒÿ;U8|CR°ëÝ‹˜ ‹‡´FPžáÜ ùCè MîÎæOåJã§tDj¹•òX}’´×*ŠòC€}Â/JüÁaµ(†ÑKâ:“µ:ª%²ÏxþjG3 ÑH`ÃøF^»7¥Uú””ªO}çŸÛÝâaò/èm/…'‰«SŽ`ð·Ý SÁ‰™Zí=÷A@nYl Ÿ2n&#óRÒÒuM4õ]¢»£Ióå¶þÍB)\£CâïWjßãÂŒ–”?îý[ÿ¬?°(´IÚ²’eV?\½Â'ôœ²}Í%÷= AɇêPÌät£Çjý_Üèü!ÁŽÎÒïò¯ÕǵäþÓü¹•i#è®}ù+‚囨4Ÿ- ¹ÜNYc³4“· Ä•`zÙÔþã)Ù–A…… Y\G ô¤ümJÞa­ÃcÝœ"ʬx"ÞÈ?ryDæ£Ùž—2ÙmÌaˆ–•smÉ´¨|4ÆÌö< ºEñ=dxÙHü#¡§p#OsAAñÞpœí5ÁÀ}KEýUn-ä.I”ý3±&štq±]u ‰AEþè–³òwai–’ëXÒ¼¶Îà‚ßá4“¯Ê¸„- Õ~c—¿ù°peIsA7J½dŸ¾)Iû"Mú9vÂO¶ã8ޝ7 ñЇn¤¯óTø@Žãž•ji½/%+A!VP¸¸7ã4´GÈyª®ÅµÏã*PU­›V1¢k`ž[FT^p-{r,-~}` l#Éþ[ÆÊ°å·ŒM¨ïm®9ÁKVüï;¶÷´'ZÈò‚Äjòö=!#˽ùA®¯ P‹ï„¼å¹@ûæÖ0sË$Â'©Q›c4+ÚÑ¡?ÉM„i¼HFãÎ4½¹Æä^ P÷ÃD³]\£ Ü^0UsÊíË”1;o˜Œp-¨ÕjIR¹gÂ#õšp¥†Ä+­ÌC)=.«AtªwΨmÐAt XD¥1Nw×ÝIéãŒI¡4¤P²­¥³¹3xÅ#@ÒH¸M͹ÆÜ”Žíý±ºQ§Â i’£ÐÆvl£b@hÜé0bh츂t„ÂôÊ‚‘¼(j_JHœ™j ú#“8gWípÕ3@˜dÙ-)]v`·/µÎð¡©t(XýÐã•®Ìå>ˆvÆ`ùò—R§d6u¢lG˜ó‹êRa¹éVæP[n$)$xEAˆ°’'åì°´À°úÞ^Ø3,qºé¦“6lÙYRÁ:|Dwcš’8²AòæBOœnl€–Í®ms½Ä‹ ßœnbd64òõŒ„òä<ãd|ŒnŽ›_mà@‘oï éµï(ÛJJn€ ÄÓ¥)ò0¡ ºO‰ò„¬ ó·89µéUŽÐpIO1ìÐUp Èû !Z¹•ã#‡·1{@á[m·”o~ ì<`”ª×yZ2-ùt…ØrzxFRlI“qüp¿O„0$ZçÞc:l®öðJ\± \‹øÂ”’«té¼ $YC˜<¯!I¹U¶¼a ×å! «íh$¬G.±³iÜuë6‘{ eÅ¥•¥„øï¬5´‚‚9+œd6¥ó6¼$r±$Æê™@¿0Lcò’šý”Ùò¼”‘µýñ”íd¨òÜF©IL§èßmDøÁ€ üëBb²;Š.J«H$ÛÂ(©ÉW%«/¸«ß„FãÌ^:6£$AÊ6ÜE}Uà ô¸´Yµ {XMhiÑ[Rþšx&Ü…âèËl¬5'„üã óBU±>èŒá<°œ•Ì iY†õÊ)%ĹÌ)"ÄGXP© ʰ„”gEòІ…˜•BRÛ)@·€‰ ´ ¦ËJè¸ð…A’,M·‚¨ÅÈF%ÒØXAͲnD¤XyÆ#¥â’!³-¡ô^4Ð¸Ú Jo ’;Î)ôE‡6ƒcm¼n!|•Š»Éea-8®N·¾3µÅ¹Ã­. © ’”¨‘nôRH‡ØÃˆ0ôô•© ´~{fâÿ£ß T¤9!R@7H¸¾ÜÄZB½2ò TÐEŠH½ÄDjôæ½-·›HHÖ;£¥ö„Ò)OÑ%tÙ¤Ü[”cÆØ®_ Ë2]ïºã‰J[ôÜjW¸@ŒèŠ<å*m Óñ/¸åãK<à=Pҭ͹xÆJÀåÊñwÞÂ1Ä·X,?Uíå8«  ¾ XÆ¥{^€¥nmî‚TeN\à—H7åN.ÂЉõïÎþØ=ÕÜ—s±„À%ŨíÒP´ T|£U'Ê3¥ùƼùÁ Z5R<à  "Æâ XëØFŠ˜hÊzÆ…60iMù|#-²TyC!è$#VðT랇,¥‘sÈC»2š€ÚÆqKÀ¾‰dT]`xø@MŒòÌ*nfê¹ÜÞ$Id% '¤ ¤ËiϲR‹ ˆÂOgDAN‘°€*´nSÒ6C[Ä¥³veµ¨yÂÖØÓ8%•ó…í<ã&ÙÒ•š¶Ö«'aÖ %F²ÊV„‚A>P¡ºvíϬE1Ç¡·„¤'‘ƒØl¨(X–Iî‹[ÀÂùi@n,9B°á¡;m•m÷D+áµ0¯dÓ¡h º”øþp‹¤¶m`LlZneµ6ân…$¥I"÷œm ¸³˜Ôç1Ęy‡ÊBGѸŸÝ‘iÓ·8«rµåaìIV < ÿª6»Þöòó|"ØJB’o±V2µg‡%N lcakóøtÓµöq¦Óu¬#Î,‹7Jˆßaqä{¡ŽkHI\)ÝD ‚Eá–¦Í $x¨Â±Ñ86l$ßks„syY{—MÇ=â©©æÈ:æôÍDEç1ÒUrN+Î%É E—DÆ<”aj ‚ï…¡'óIÒOÐ}U4Þ.›º•! îV攫—Õ Âä>'E5˜íu0Sãcx=Yƒ.GªGßÞÍzméuFÝ!Á¬_6ȲÁPór‘Ðìãé5Ø©Zv‡q}9ÖÿoõŽkÝÏø0caE‰hCä.::Hã k|ß¿H)YM`•ûã›×œú¬ƒí0QÇ $ “ŠŽ‹{3¥Ò’dªÞ0Ù5šS$}PÚ|Ìsúñ\ãŠ?J@=#~±2ñÝõ›ùÂäUC2æÜ@¼âßê˜a›Ì-zƒ“Î9ìTT†ij;¨“팡·?FÚÕî„äØqE‚þ;d»ŽÔ˜OùtÝýED54¹×w )?¾Ú3‡§\#t${o²¨šÉcöÐE–¶Ï=•h™aüÒ}…ÙÔ~jÌTìa —lx ’akx:y“©©„߈" dK†±l}”‚¤¡Ûxó‡)Ù¼ÝÊGº9·Í×0ëÁÇYlo­Pû"óÁXÝšëmÅ}-¬oÏá¦g$NðóÔ¥©o!+m$–\W¬‰Ò<¢èd&Û¤%ÕèsÌ̶~‘µ&ßt\˜n¬ÍRI6°omCªO„KFl¶ÙѶðrZÒŸla…›mîƒìÂ÷wÙ›lJ¦ûâ÷Þ5R6±¶ûí ø!W}söEj„hA·/d)m³È‹52Éõƒ›@H›Á¨Ø îøA»¹¿”†²¿oGˆç“K¢ÍMìTÒ5$+–®Ÿl-H ‹¨‹Ö+<Äň©8)Ò‹ —lÝÕJPéìb[d2¯R›­Ï¹98á}ç:ž@tx@‚ l™É­O´í¾t…!ä­;}{ÒÍ8¶Ð²z”ˆJºs)¹HS_¼WãYèX ¶6 ïpvòTÛ ¥ÝcÁbßhC«º=é7‡`Gá®ðY}*=£ ^Üà°;{൪þÈÆ»|ॸ9ò0˜ºA¾ûBE‹ò…*%[Æ‹Eí¶Ñ-”¤b5-í T£U#xŠ)NÞ©Ðz›¾Çqáp÷µ ¡ …&0*>0±2úí´(jNä}ÐÒ`Ä(”Þö…mI_¤/jP j±éBv(† ,¦Y…¸mÝM÷é»Ë3sî¸Mõ¨˜°qsþ‹Fu\”» {ùÄ•+Ç}öÄOAlw’—)d×xT@HßodR›'œ2Wý‘Z¡9EÏ[FÉh‚l`ðÒA±0¥¢×;Z!³xÄLÓJ5CŒº/k0džC㠤功á„îw1›gL"n†‘}É>ðj^RË6óŒ-²-ŽIð‚–ÁZí¸ŒÙ¾ÅLMX Bðá,àP¸|L!–’^×L;1,S¸°¸´ØZ†²@ëÖ iL$oìñ…ìÈ‚’l.G+F¼ ö±a¦K_dL«ãÚ\úP—p§¨å¼X38ÆNY â.Ü“Žl­AÉ%'ÖF÷ˆ$Å~ja!{¨Zïå·Kšsk“âw‹S »¡Íírô Y{Y Ønb¨,¬%ðÔÊ”}Â¥0R×e)ù¨Åމ ]·Jñƒ’e%BŸE½°èVEiX ‚y$y D–O2ãGˆRGP¤ƒ WK§úϤžD_œ'™Íª\›d4AXë{à±]Óåe&&”¶†VTžï!úÀR¹{bu‹ó â 'eZJÀtJ&ÂÞÈ‚ïlËL—Hº”l‡É|#0à•ï½’ˆj§L9'6ÛÁŠyÊ'T v%&fe.mDo´&Éeð3еÐò‰ñÚðé+—Š;ú2[›˜¹pêiøŠIRe B†àsIð´>1ChG¸A@™MIeãœ0x)Gö"$²ä+w¡mì]tVͰtëÓÐÒæ_N®' >¤=Í6)Ëq§y²RS±±ž~iâ…6'Hä‘â|LL_#y%°©ŠjÛX!ô-_¿97.l´’Ÿ1´kAmªQ©I”)‚â´%Áµ•àDKªX:b€Â^p^\Q™)$ÍNºAÒ„(ºïyu)èôy§O2"þÈd¥TE=å¥áe…Aê/¼b·£·•U’6¤’\ä#kž°©rÁe:N›yD6k4™¥Óœ2y¦Iã©tn© î˜7D|¸ï²RCKI½‰‚f“tà¥OÈbÊYvϺ Äš[+ ­%7ØÞ%k²Kh§óFd92„!žŸOcÑг`H¤:æ“>WÑb5wŠýsNî’ê€éc¦âx9¿›'!rɹÑï0Zñ$”ª€*ö Ä]{#PØoÑ…“ÅãyVí¦ç÷¢¹˜ZOqµ‘ðˆ`EÏ!pùEɸòiDðÙýTa˜Â¤éÙIHò†¢ÖýDlM÷°öÀ‡kµ‰ii¹Ú©é—É*}Åß=ÊtÙ ©~!"°½^½]•§LTY¤%õh3iV„š­È_¬WºV0 u{Ÿjãq&3í‹Î­ÙɱǦµO®°¡¨)¤ÝCÄZþãž#À¸‹;­Ñ'iföÕ0Ê’“ìU­™7ôGš|à‚Ö•X‹BÒÓ¥`4•9~Zw‰¾Ræ ×TÞ&ÃÒUê4Å“0ÄÔ²Tã~ A"àïï„쀥X´Û«M…ï¯EÉ̈Φ°ÓÆ“<¡s/,ú›ZOüšÉÝ,Âì/ˆèHvg T®2›¨K:O‘å¾’~TÈ䞊3bÉŒ-Sne¥É :×E'¨öÇJR*­UdY›–V¶N¤›î<£•*ô:ž©¹#U‘~Ÿ8ÙÒ¶&)P÷³2g¦BlÑç¦]â *QÙ ðöKcº/fžS‰‹Tƒ©W½Ô ­6”©H¿KAèJÊ“±IÛœ!ŠjP¸ç!®WçÎÐPRÐO²#}ˆ·ã HÛœ„V ‘Ò6i²àïY$BŽ “µâ@ÃJ„•n!Æ]Ä©Þ7. ¾×´(i9éç Ò–Ø÷Œâ<*Vú'%Ga½Ò±µÇ‰+ íÒ„ ¦ÀßàÚŒ’ [òh. ,{ž°´l°Ú5™‘Tº–¦ÇÑZöð„ © 5ùƉÙ-’ï[er·8sba-ØÜ¢Ýi $‹Fÿ?¡"üAhd’,G//\£MÉ>ã ”-'‘(ò&•Kã"Jv~U æ†_ |"ЙÄí¶“©Ôûâ5UÆ’KÉç”-Ù}œÇ™Ù~p5m‹º©©gÉPqÁÞç½ÏS*a‰¦h©@ࡲ¦”¤ìwP7‰†xWå«ôfKgZÙ^ÄEe#0©š2´›8ÒÒ¡ã牒:&‘C¥±,Ž»AA?¶‚£çx\Å)–ÝÔ‹ ‘{ˆ€aùÚ¹”iHiK H ÛœHåW]x µùC»$Xô¹á,€’°E¹@ˆS4œBøºF“ɤUêwŸH)S#Æ•11VqI—Qj^öÔ7+ü ÏÉå$"iÐçBUq¶vŽ<}Gœj§Eͯ¼6´·W ïÛQÈ„¸w…`* ¿(ÑÅü¶€Ñºa} V±•bZ“A§½S©Í8b]”’TOSà“ µì}Œs3h—OxïÈÌÃŽÁØ·1æÄ® T*¯e 9u¸û⇾=ìýòqPðóLV3ñ^«ªË4¦‰ÌþåJæ³ì°öÇdÐðå/ H5#H§ÊÓdÚC­%´pŠŒ[2rHò§üy¿ˆƒoO±'BJºNÌ‚±îMí};äÈÆ(@/ãJRmÓÀqnÑè¹}¯ñ¥ì‡6ž<&>ML\Ú~‡Ò>m¸Ðb'Zì™ô¶Ö©Yi  OIy}VNˆ¿X Þð|h>VxÙ‹²_åê埦£þÆJšþí7OÛ,¶ìJHm]a¹†ÔÓ¨C­+e!`)$yˆ«1§f¼ÆÁÓ1BfŸ0½øôÿ¡Uül608ÉtRÈŸg“º¼cm §nqܘã°{ Uå¦Á$ú-A•à•¢àûÀŽ~Åý™ñFqß)“Ôä'Qƒ1.@åßA6÷ˆÏä®Ñ²§Ó)ß ó‰ìœ«-W0IžM䩲&¢òIõ€qnï:G¾^Á“íkT±b} ±&UÀ²=ÜÇÂqäÔ¼¦ Ãï]H¨MI¦UÄ(YM¡§þÈéþæ<ÿ2JpI}ž¿øåÇ+¿¡Ò¿—²µ™º}^š ”N¥ ú­®Ê€‘É!dÛÝæ(ÌeÎ~]„é}™OCm@p–¡Ýº¿xmì þ&â"¦©:t”Ã’¡BêJV¶Áö •D3´ëî á,Žãhy@¤n¶Ýî…ºZ<žLª/£Ö”¸¦ÎtžuO-E^²‰'ÏxF)Éá©`±}¿8p˜bê^æX)µÁG½ *¯ 77÷DfË $ØÂÒ–¾ìjÝ£%! 8ã·$ÞÝÓl êJ­Ê5f¸ïxXë<0”Ždó›z5Œ]–ŽšoæPÙý°Á…•ùi)Ìð[Z¹Xõ0Á„Zy2az5'ó¯kB\i%9S§Ì7/©Nký^f9ã'Èô&¿[ S¸ÂQÉÂ’Ú oníì=ýbÀ¥áÅ-–ç¥8¹2²¶[. >;o<¶¨Nη.”¶ØZÿluA(Ó³€•DÂyw/(ãáS²Ì &eN‚Ò‚R.çr|zGe&»<‡)_E8p}.©*‰úËm8ÊšW_1µ½©´LÍI¸ÜòéLu§ëeX›MÔé ³*û¥|4k\ÊÊÞ'³-¥é}GmI¹n<¯²i:=8G[9»7T]Äeî„ÚÀVãhœf“åÌ[=Ì+FñØ|ãÔÄ¿Tx9ŸîÀÖʵùÁÊ—ÒAŸdHÇÙ šµ›_xx˜è£™°Ùj[óKÐÒ5,o¤sŒ®AÆÖRêTÙœ£ /K÷Ûp©#Ï”9ӱʒ‰¥ñÿÒ'WÛÌD;ô%ý†aú]>iÕ"£Çm¥ZÓ ðý£Â%måÓÈG•7/U–<Úp— ÃuƒH˜qú{Œ4\–˜²Ù|x¾¤ÅN¤µQÁ¡Um¨È:»²÷üš¼|~1ÎÞhËž)S^ŽÌo \2Æ×ÙvŒÄ«Å¹©Gi“#mHî‹ûö1«”õ¡$-mÏ47ï'JÿŽ,Zn!f¬û”ªä¢XAÐPêm«ð0Š­—Ëe\Jzõ´¥[‚áÝ>ÃáŽ7Åòeñy‘á7ítLüLþ<~_\¡ôû À9Ù‰p9K4ÊŠ•(‹#45¶è:§Ý1—ù÷‡ó9¢Õå’žxiÓVq—‚IûŒslîIV—RÚµZúå%IëÔ~1I›£N»)0‡Y™aVZ±ê ò0dðåj\¡÷ÿég‹ÎýkŒÎ¼Ì>ʘ[´üÕ Ãu›=^]Ãû¤tö¦ÑÉY‹”ulXØ‘·%‹ –§52àÞ9ˆêþιÑ3Š™N¬Ì©U[Õ'2³rò@Ý =HŒ[XÏS³ÌRªì%ÊÓu0çG||¢u’<ârIOþ9ž]SêÓ´äÌHM».ëJî8ÚŠH±æ-ÙÛ¶#“¯ÊaÌjèPX 1R^ÊIØ ~#ϤrÖaà9Œ‹ªtY­AÙ'‹z’6Z~ª½âÆ"èOÀ¤¨‚“¶Ð¢ø•(©-ªæ†Qá¬Ü ®J¯,‚þØÓìX8ÍÅÂ’®£­ŽÆ<íÌ<¾ªå64™¢Tnk¾Ëé%æÏ%&;_±Þ<Ç`„T&ûô×}õø`’£}÷${¢ºíüÄšÂ/§Jjs í̵dþ1?ÒUVŒ"ÝÑÊÌVŒQBi/,zl° º5x*'©nÖýDrŽ\båálG-2f\!¤uIçs(„M´‡Pn…¤)$u”gF©ý„¶Ö¥n!jeÔ«Ûaá¢\€›Ÿg(P†û·° ‰Ù†evÀ’yÞËzÝ)i#ë/h-(•^¥›(âJÂçÞÒÒO GÛB±áUIå‘2— ÷Ñ¿Ú6ƒÙœ–uA Ì!j;è ¹Š®{ÓžQ¯Ið0‰¼3Qyж˭¨n’A /G€$ÁÜt0…-ÇÚG2µñвV‰&šK(ž›]¹hQ¿Ù’Š1J•NŸ™'ë8GÛµö.į‡èºÚ* ð)–’=ªåö`ÎÍL8¦%”„)d¥*è"ü¤vFij:uSÛ—™yÀ-zgbçÔ”ꜫ™KM•ŸÑ *4r¸º´æèjÃß ]ÄÇöJ”}±Þ²Ž0ÃIf£70G= J/÷Ãü—e|¿“°]1É¢:¼ñßáˆyb8ÖªÄéﺱS'ƒ§jKæëªê ÀG¦ÔÜŽÀ”»0Ô…ÇWÔ~Ø•Óðõ.’ØD>ZY#’Zh&)FÅó#ʺ§güeŠL­ TçuTT¹B=·U„Q8£ Ö2çÏaúÌ¢ä§å–ó æ“`máÖ=ÕR,‚d“à9G˜_(N 4Þдú‹©HMbA§T¤r*A(?r~0œiŠ99Zeù“›ˆ²ïU4ÃmÍÉ4èºuÓ;²ý)‚ôúÖz†Ðßx]Ù*§ó§gÌ¥©‰eKŸ- ".ZÇ샓ee+Ùÿ Ë$%h˜xõ*v×øgZÇ”tO&x™FQfGK-…iHº‰´)/‚SoßA÷˜—§(q@Ô ¥Ï26ã Ÿ ‹ÇšÏe¾úxê)"ÛÆÍ¸onp¹©eDZðs*%BŽMìßã£vȹ<¾ÊÚ~&“Oå%q³2]ZA[ +ö´$ôº@'ÛtäÞ ^cænÉIRg§[mÐ:7{¯üPcÚ© ir2òrÈ Ë˶–›@Ø%)ðPVöLÝGA *6¿Œ QÒsc0f˜™…AAe&Ü h>º(ÅÀç 4“Ê3¤ûc`¤õ6ŒjÚAFºncU¶• …¤(„\FÉUÉŒ©W;Â\ã~Ϲ˪á™/KWûzU ç­$ûo ÚË"§°.?L•3ÒÃòô´Ì378áp¥D()VÜë?hOIñŠ´MVo Ô_¨ºräaæ‚A'š’SµÁÕo„yþdTq9$zŸãó8f¦ôR½Œ…]N¿"–ÐÊèm¥m¤žã‰-¡`ûT•|R=ª‘ÃÆ¯°´ -ÓõH;øóÅרN”©iJ³…A)T©J±bp†ñ@ö¥œ\ÆgÔQ¯[M8¤m½ˆQìÞVó \Óÿ§½’W9dÈîpÙ2¥*öC“ÂêÒ! é>ßÎ=dr´4©•-[¡\¤°ä7´nã$yyÂùš *R´¦×*>Èh(4:¯½ùZ BDÄÛh¯ 0ÌÚV['ºmËœAat±ë. ­–=!¤·Mi´ žC¬fv•ÇN â×#IU݈±Ü|a7H<ÉÆÛ=t@DJfô8.›îB_—óát¾‰® ÆgWhõÞR¯%ÂΫ§’…ý—Žö˼ǡf5j\ê\—@%ä8lã\…ƒÊÑæwz`!â;§` ‡Ú$¾$—jeŠd½U M§†ò%âCƒÀÛœsâ‹ÆšfžFEäO—D“´-’ÆÙ¯\©SÔ—$ø‰e·SÉa)ÒT=¤Ek3 ^ ¶BO_YL¨ÅÓ p¨3‘x„}æ$TžÍ¹Xq-±NB6:Ïø Ã£ˆÞWæ5s)«ìU(óZJl—¥ÔO ôuJ€ûã|ÞÍJ®mâÕÖj‰ ¶”p¥å’¢PÊ<™;“fù<ó*¾P¹¥¢M•ZêZtÛãhµ°×Ét³¥U¼HIÚèfé;8B#7\ª1#Oas(¥ž¼ý‘ÜxbšõS¤ßG˜—Cj'󀎀À†0†oL»Î%Åzî¶‘­_Ùâ̧ä§…I96¡õŸp›û¢’!Îú9%)[ÇJo/xv¦`úÅ_iZdÛþ?|v=?P¨ö”™F<ÒЇ„´–€Ð„ ~äZ4¤G#’)ù‹jdMé<ËîÛÝx“S»*Ï›ßNÝwŠŽµÚß((‰¬Hq[÷e\/Ÿñˆoå Ê*iP”œ©Õ”?ñIº´.IpGK“ãŽùM0íØËì@”Ûƒ31"µþü!iÿ!Q!œùG¨Qð."©ƒ²Hl Ÿ`¼S½£sóöŽÁ²t<¯«S´ësÍL%W!BÖ)õBrO¢ãŽVtßa©òþKªPŸôEöÀð…¾:"ÿóC&³{:²v;K¥ài)¶æŸô‚äëéIJ´„ò✹Úc´eH÷(Xjš“ÑÁªßã˜jDü,ïrwµ÷¼ìí$ýŠk8^S­“.Þ“?è>pº Ó$%J¿#ÈA¬Óße串½ív©ÚÞØ[Ýi›i߯8LeCûØ› åºùÞÑ—¤คí˼ÂÁHÖ<¡P§òl`¯Ÿ³r§ˆF¦(Ò $\]:Gø¡qézÔc‘¾ML(Ù7R®-6~­PPèl>Òc®3âÚ³,tjA¹ Fæ&†ðUô(`7§@Õ{ëÞöðð‚ÊXØ‹@º<Ì Æ6i 8 ˜Ê…ÌóíË2§]ZZiêZÍ€f%èTk2ê%˜q×”!´•©DØÉŽÍÿ” †1#Âu<Ãô6Ô¶™Sê.’ujM€±òûaÓ·gk iJæ ÂU0·ßHDôÔ»œ’y¤åÎ<æ©Õ&j«M>äö­Õn[Çoü‹ŠèìÃú>O³Ôîúê™{3_.))™yÔK·¤iB.=äíãíÚÚš©\Ñžs’^A]Tm¼t'aÉéF»=ÓKë@t¬%]ä[ÜtçGi§=ZfkЧu4 ®OwÄŸÂ>z®N?ÙîÅò¹3œ`êænOHÂ¥n¶"ŸdêHÑ´³ á€zǤ„Èìܹ@MÏœ/“¤31Kã8ê’§)@îÚq€TT7·„B®då]iL—AB‘ÝóНbÆiôÿ@Z™x­Ë›ò°øCÖÃqä%µX«{Ä Q5åÍ&iM¡Gyk^ñiáÀx%öWÝO+¨ ùBšôpµì6½‡j²ìØRˆ;wFàCÎ\È”j^u/6–~°ˆ}_0q­>y —§Ê· …€T Zˆ¿SüQ6b¸j¬KL:ÚPê½dÚÛøÇ;¶tÅßH5.—lzò¼+’‘ï•,XÛ6´6K­O¡:W¦ÆýÕ[hzfd §.•Û˜¿H„è=töÔÕôéPI<¡³ÒÑLÍ<@K ©ÂUÈ6‡5Î-¹uB…­«¬EêòŸ=J¹&µØt*¯nàþ8uNÑŠv¶F굘§KJ6¡.YœèHóöÜÄ:¿ix )Ò¬Ù¶£¯´u‹Er’ÒíÊ4 ãM‚œ«Î ™•aJ% %$õL{˜#Æ >ÏÈšžG]ÿYÊ*Ì€S’ÈLóc«{+àb.þ­0lå.i'þHÇK&””L%ç õ¶¼HéxV·ZPD•.zpž\6VGÆÑ½·G$5ƒkØ&•4¢y}¹ŒµÄo1ÔÝØGoÑû8æmI-á÷XA*iA¿¼Äâ‘Ø«ÏªvvO˜Ô§Ø-öÅh\‘笮Rb'Us(~D¸?Êä®!y)¹(›þrÍãÐZ¿ctašC³³¸‹ÂIQC iÞ˜žeßeœ7G–œSî8¢v×€Q—-Ñæ”¶AÏ­_OUa”ø6ÙQDšÙ®RyÄ MT§Ô~¬»@_à z©KÉ C#Ѱô™Zy)Ôk?mâ[%G’§ "VU™tA¶Â~è4ÅÈó'ö'œ©!*c T8²€~ïº-,5Ø&h©êE*BÿðLj¯º;¿E¹ZÐ:Cg.Ð{S¤´ª›-Ír©i‹ ‹Ù‡ÒŠTóSêOGœ²~ ´\:G„j¡s)²¥Ì ¹ÃôS].+-2†[q-‚ @çsNÈþP`!18µ?6Ûî!N*×ÙF/\o-éjy½:®Ò‡ÙéØŽp7H¯Óɲåê/$§Ã½{¶u<´ßÊ ÓxNF‡5t0x Å’ 1¡Föµà(wbl”‹ï+dÜ›Ò΋Ë:7½¢€=¥ceìÀ¿8f 1¥•(¬¨êëDwyÀj¤ÛÙ ¹Œ“hÖ5ÓϤ ÏŒhûÉ——qŨ%IR”£°Æý (.Ó]ªeò)Êu‘J8“UU+MI!-¦ö pí~C­Žâ9ª¥™Ý¡ñ âMbÚnaÛŸG–Û¥ìNܽh`µ‡332ñ–aM•>¹é÷%)Ê^ü)T#O…öøyňބ;ô¼Eµ¤ìÙ :¬mÎýmÉÅ$VÓùgŠñ׈sCÔuzèmÂÒO—¬~èG-ÙË¥ÂìòªG9êš›'î- ªÅz‰…ˆ½ZRÑÔzk/•É ¢ÀÔð8rP‘õœgí0ù'F¢RR­&I‹rÑ.ú!Ȳên4iñ‚}ÅnFÑjNlÝŠJ@@Hè£ Ÿ]ȹ¿”ièë&Á&7n¨bÔUäÄkšrçr# ™Q;¨Â³NpïÝüã rû—#ÂB¶"S¦üÌYób‰Ó*‚Î6z`¬ž‰ð„ÊUùA€mã„_”xíæ©öÁˆ6åmï ·œ㉠)Ô VÖ‚_GRv[í±SÉÍJëK¬áb¡¤7`ä®ýå'n÷³Ëœzkƒñ•aé:í}ª2mm>Ѹ> Ž„r î#ÇloÕ̳À8Cν-9CÄ’É~^fXŸ¢YN®ïÉVßÎÆ-ÎÁùÝ=€sZG ¿4·pý}ÏG,]-Lôk¥Í’|oq ™ê<||µã¯’9Av mòç¨ùĈ";³eÍÊ®$¬JÒ$Q·e`§š+’]އ÷]C-©Ç„‹•(ØçüåÍzf)ÁØ¢WT8å:ßCdÙË{[šAâ®ÏŽÜØà:• Ôg‘P™-Ϊ\¡´A¿˜6´yô¼ÏÄ”ºûõ9¬Ä¤Ãšƒ‰mVBÒ¯Xò);ímïYœæ¸ÀéÅ­ÌŠVç^r§2ìÊÔêZ”¢£rna­.‚ ›€ ÚÂ7 hymòÞ£á½ÀŽn™ÐÝômUšR-‹O;C1œmR3Fêpð…ú{ŸŒf~¤“1u(¤«nDFÙžRÅÔ«•nAç¾>'7Éžg—›ãìQ1OJ,/Að;Ä·`e×T’ôÀçd â*‰Ž"@¾â,l¯©8eÔ­ùˆöRÙóÒm+:c³ Âóx5õLPä­Sç]•˜yæ‚Ö«HVþ(RL_²ÒÒ¨ÐÄ»M' BŽxȺ×̹9O¸L½fP<ášØŸiIèäÁTgÞÌí×£kÆ¡dÂ)šBø:ɵ}Ñ®V¹«ÈŸýû£9¢´£T ¹p•÷F™V8:Ÿn­'î1;´L¹ó€Œ q¶¨ f»×Î6·;ÀÒÞЂմâce'­¶~¨‡`6âxô™”óºŽPì–ð¦æ^=¦*À¦ µÛÚLu½E°¹'SȘãl{æ~Ô¸ÚC£ßJöÿEîÇZgg-°¤Z5@:lzA©7ÁnwMÄZº†Â4µ½‘°V¨ü!€Z€;ÞN¢òÎÎÇhY§Â˜MÙXò0¬þÙâ¥]:ö!¹1ï;Ƙl§º±‰*|acëÇ#ŸÔƒ›¯hü\¬ ‘˜Ú°ÚŠ^f–òP污'â¡^›sŽmù@æf%»8U Z›rrY„uoˆ !7¢ãÙCå6 V˺4¡cKª–CŠY½Ò¥ Gß¼JØ£½¤¬âL^Ø,h˜§ RêTú¨v—=.ÜÃ¥‚)ÛÞ9{¢[-’´Š.;GDeIÚLæ÷(í!* l¬µ´ |?0áJÂÔ®šA$ÇL+-°ä¤³Šô,¶ ¾ûÆhôŠ4‘0$عÎع#œ¿%\±ô„©µª,£örŒ±…vèbUŨsî’c¢;$ÓÄ·Nd"û"ñ½S^r_€;(›ÑŸ4P²™}V›#E:bܯô9/*ª­0]]=h@•(GHJÕ¥”Žè¼„$®ÔZv—1sݤ4ØùýIÊ)êÚ”KiÓÏT?±Ùò}-•-ö’‘½„\ÔÉ™9yF”Ú› n6¾Ð|Åi°ÒícÝ„ÛVT2ݞˈ TÚSqÐ@‹BˆÑèä’”FæÇÈñX7´âƒBäØF«¨¥Æi$¬l¡Ðn™›C[º­kè¹øG˜z"‡&VíôüãaÉÊY¯ÉŠ‹33tÀêLÒdÊC¥»îU°'Î"™3PN©•fy†úŸl,³2(ÐÒBD Zö[ùÏÚ¯›Rj*¥š¢a*ij™D–YZZJS¥*Z®½=l9˜ªéÕÙº%ZV£O}rsÒŽ¥æhÙHZM‡°Ãc³e}n< ¢é#Î'Ž‹÷gUào”G4°Ç ª”Ä–#a>²gÙ²Èýúlc¡0/Êq…êªiœS†g¨®+e¿$è™hY*ãi¥Ë}Œe3ùTþÉ¥í×àžÓ™e’×ÍX¶@<ç)y§8_Â˶ñfµ2ÛèK,:Ú…Ò¤ADsÛx”‹sñ‰¶ άs—îÉüUS¦¤QneE¯z Ò~¾I.öKÅÖnÊ´b<ÀÁ?(öcáâÛuÉjv$—H±.·Átß'o²:|¤¸<Ä¥v‘U Mº¤¶•6Øšh¨-t®¹‹YSôCÅ%ì½³Ç1›ËÌ2óNR™©t…A¶ê÷^v,ó*»ˆªó“Õf T¢4Ë­N«û%¬ð‹Oµßh'±f`NÊÒÜR¥%®Ìº—õR:О±ËU«‹tÌOwÊŸ<„щÛ+¬?ájñ¦V¥žÕ°Pxˆ®Û¨‘kŸ…RõP•È>ØéÝœmZ£´i5‘K¨áúòvNiµ.ßðkî¬û¿º:ù™€óiZMÒ¡q”uÆñF TªÕ©ÖšUú‹sŽÄÊlF1&uFó 'ÑÞýúv0K»0Ž´Mc:@âöÄÙHƒç ÈÁ5 ìxj…YYqƒéÃÿDŸº Í–8¸"¥¸Ù¥ýnWéBœ9}~èhMmë›À< r‚o Ê0¥ nohÅû¾ШÚÑ«,o &@S*•£‰é .‰Û.t¦ãÒåÕïå°íËdãLZÚ¤;[QÝ=ÒëjþÄĽ4™ÙRæí'Ù-:… ©3yvÏ”N˜¢ Ú6'Ê5PÒ/W[@:0­·¼hònÚ‡ˆ€û¼mV†‡«úA#ËÂ1>?K2<‰6Šò‡ŒÙb±9.âJT’Mˆæ"Q#‰Øž™á¤CÄE^„ý¹ów¼a/%d„O”m Æj­â?ŽpM+1p¥KVåÄÍ2}¢Ó¨½ˆð ô ØdHIåµüh&¢vYμžuŒ¸ÆTêÆ RئÖ5'‡sÊÜö™ßiy6Ò™Œ …g\NÜFêkl;\ÇO”Æ4’| ß¦6ÓíÐæ#í-2… `L&ÊU·z¦â­öÃ`c´ëÍðÑ@ÁrÍ^ãT˪·øÑÕ\Œb׆›û&—ÑËhÂý¦æÀ œÀ²@ý`Û«#ï‚Ê>ÑOΙ£Ž0Œ«ÊUÃZ¬=šcª¯s¼aBãxvÄµèæ„d®~LéÁI“˜”¢o‰Ï\®ÎܸË:¦#’Í™ÜDü©IrŸ/JKEH&Ê …Ç;Z;[ØÆªJV’ v7ƒe']£ÇšNnçÎ%©IÈ·YÄëKÎ%±ÂaI°&Û?|wµ;²ÅN›,íG5±âÜy¤­ÆÄò[ÒH¹ ŽŒL³H¶–Ÿ $m€`ߨ¥/£žìM‡B,þ7Ç'©UmÄýÐ#¡ù@‚ÈäÏœ§Ï3<¶ÙÖŽýH$)RôæÃ®4\˜"êqGVðã;1*‡ ’´wÚj­D¡³ïŽ~DS90¥žãÍÛÀªÐ‘ŠlÕJq©yt‰‡TÛMw”²yæõ” Ät`l1§iÖlR’åAwMÇq=ßñˆˆ›¥eG²¡-1D•ý#UX#˜rMÁÿã ïaz¬¾ÎSg> aCôG¾kBT@ÒÄí:QïÛ%p~é±ò/£ÀUÒ¦ÒN©g‡µ³´¦)>Ñù¿…èS=Gpz¥PD4Íeî x>£/÷òM es‰á*& ˆ6Þ7ir=±í}W,r¨¯Læûþ|›CôE ›9S“â¤'€¨ïíß[!mïý‚„Jƒl—–)d™æüA‰^Z:Âqª<˜¥6f¬y96?º ÛÀë)ü‹ÊÉÛ„àßF'«3¯ÿ+E ™økaœÍ' Ê;)*J8áç”éS€`OA{|cO‹ì˜å½"²¬ÖߨÏ>éRyå-crI„Íáù©‚›q2lõ;ëÞ§™‡æ\€JXm(Pï-›ž\¯ óu啼·³r¢«ÜEÐÌ™©JC`RÙý‘¸ô·¬\½“÷ùÃé3.•-Zœ;•ÌûaršS¤†Ó¹é*UÆ·;t‰ m 6R­Ê©¢àR@µ¡{RÊRŠŽâ7S)Ö,‘ãÝPЙ3ry˜ d\‘å m"Ö¹>]a3Ó¿«¿[„7BÀýoã ÂJTZX²¹¥P¦iEÀT”"×Û¬"[Åi "äz§Â©Š£ŒÙµî›Ø¤Ãœ´ÓjÝ) W0wÅÃRÍìoâ öàNÄ‹yD8&j¥DÂ>¤¡z’n[â[@¨Ì„”µ&›“sôÚMìµ:°ì›©+hI½¯¿Æ,JrZ¤ƒÂX0Þ6P>þqƒTwâÌúlšRÖ¶¥õ¸Ðjãtƒ{>¦ š¬0…¸‚«”îMíku±çÌDuÊäÚÔeœº4›ÞûŸ²7bd0èuÔ’€’¾ù°7µ¯‡8…{7–] ]U¶›SƒH$ |"3˜8­ì?JTËWX$¶•XÛYéeá U§ç–‰T)•)‘²ç=Œœ8F œ­¥Ö›d¦ŽÜú¥Ö¥ñt¶¿ÀÅÆ+žÎ|™_Q“3 \ÀœJ»êV«øœÑ«^—(Úʻֱ_KÖʹǶѧ•%8&ÉTztxÏe–ÝCmŽþp¡©²Vˆü«÷·„92ñÛxvÆ_½±Zd1 º°–¦Füc¶2*¸šv(«Ðœ!-M¡3²ûóPî¸?É>øó?ÕÜ¥Ö%fP¢•6àUǶ;R[Š4 °J“Oq.¾Õ¥ .†þè·ÑË5R³´SÊ2-x­‘ž%}™”¼Û¨ B/pEÄ"=éh¹JV¯b9ÆM—¢Mš—V ©X^Í+î•çúP§Ûþ ?tG«XÚ_eíJa´èJšq6P·(€a|嘠QÛ’Úô&Á@ƒ»þ‚Jš³£ÛshÖ9îc=ênåÐ|L6ÌgMuÒt‘ñ1b:WŒ„ƒu${áíI™t\ºý”sù£ˆ_%Ft'É)ˆ¥{2*NºÛoÔÔ¥l°¦c¦§.J‹Èï¹K˜ŠE£Þ™oû¡¢Õz©2ÂTjiê»Bg*3+õßqVñQ&'£«^Æ4¦ÒB¦ÚñPŽ1ÍìgN“í†ê¡à©vICŠI¿0@ûáõSI%k>óùš3iòH…ÛðšÚ.*âÏC¤ór†$YPšAºo±‚^Κ2GuË‘à Žj£O¶iRÿH“ÜÞª§,Øï:í1z3ߤ_¯g•?’P²?{ ïg³MÜ&]gÜ"Œ]vM;Ññ‚Ä’ ܾ›ã¯²¸Ë軦sÉõ(•6>*Ñ5›Ón.Ÿîâ¡V0§¤nò~0™ÌwMl~Ü ö¸û)b›ô<§Ô*¶mî1gP¶„«Îñmd—S¨Í¹32§•[utŽ[V9’oº°°ãœY™ö1|0áਠ‹ÞðrUB–)Å[Z;†PɲUsí…øŽÓ§\pÞàô‡ÖÖT€H‡dÐfÑ‚v·H×QŒ ÂöñŒ^ÛF·Œ(Ã$ÊŒfö´jM£R¢yÁ`eGs÷Æ &6æ›ô ¶÷C±Q˜ÅöŒÆ¥Pìfzsªöª FNý`Fº„dÑà»Ú÷¿•ã‹+–ÇœÊ{¢5"ëñÎz½¶‹"ü„wÉ‹S¤ázž:¯TÞàºZ——$^à•8¿†„|c‡œ»h*¿²;/³%êTÊ=£Jê/.l«Äê~ÄÄñäé’ßg “YÓ‡™F¡7¬ø%$˜ŒTûDÊ4âš”‘yë}uÙ"9¶­ˆ¥J-÷“t$\ÃVÆ_”‰R¥Ò@Q·ÎU6‹ú¥žÕ™Â¡.Ërã¡õŒFj8ú·T¸z îž¡Hˆ8zlt‚ƒÓ›‹[ßÁ!òlRå}Ùš‰aÇâíÍJ&)¾!$«n±]Õ±é•@V‹8NâWNvv¢†ø"Ës{ž@xŸ(˜´¶Â]¡Æe¤K0ëË%A ½£‘±|Ó“óï<åîòÔá>dß—¾:“V˜¤á§ÖÒµ<õÚlŽ¢Ýå/Æ9Z¼Ûμãö:®P‘¤r´%>lÖ0⬌M¢×)Ùsð„o´¹¥M2“µÅ‰þ^ØS(¦}N8ê.ÊW€°ë¸´4ÖnP-h°%=Ôktè<¢·( %_Yf×0Í9Qá%D êÞ2ûÅéÇƒÝØ_˜þFæš[ýÄú©æIëÆ‘»u"¢Sá¿”)–d;”²1½¡­Ö/{tçSªIji´®Á7 ”ì˜®Š„´Ú[XÔnT¥&Æ#ÕªKâ[ŠZ §íºá´I§f%åYcZÒï‚ÞÃRMü￲b ÚÕ$ÓO©.L7©!#H•¼¿Žˆ>£Â•š•}âõ"…x·el-n°±L¨³ëu‚‹ßôD‚UpHIë%JÁFð÷Æí'ZÍ…ÏX ’--ànE·>±©wäžK̬¶ò ÁèaÒŽ¶Ö΀• ¬G8PémÍ ¯ºmëP©0 ¦Ö•<êâPÛé:ím–zû¡Ör¥5Qul¶„­ÎKp^ÈI¶ÇÀÄvfI¾i7\ZpÍi QJ˜ ´•›%Õ\ø(ÆrIlÚ2oM’šT²¤åJ-¸~•Í]åM‰øÅÛR®âü„v„¥(¥ÍS õp¾ÑYJK6–‚䑤sÞ/ZeGÐe$åÂIi†’݇[/ñƒÇ\ådùrøà¢½žuTå§Í¸ÚÓ¡Æ”RAñ¤ÇyyÈÅ»Ú[¦‹Ž^¨J³Ã‘¨YÔ€,íÞOË( m(ìwÙ^>2µd¦‹Qô‰t›÷†Æ垸±1¤Mz$±‰”›×±¡95âH'hê܉¯µˆ°ŒÕi\M)( WT¨ä¹GF×;ÅŸ“˜Çò{KjV–œ! ð‹LÆjÑuemIR4ꎜ^™Š$Ò哨î¦ovÏÀj’ÈI»Èu¼U9»"æÌZ-r]òÅ>´‘%2¤› Ý 0µÌ%8½zæœ þî"MúEc†9Få*:o ¡y??2Ù Jõ” SbY:rô>î…xv_LüÇ‘“RJºÔ†ÞøÜâ¯á¤×&ËËY61†'ÿÓL«8©=Q%{1)-\q‚‘„Žf}1¸;ûb+üÏY—.!CY}*æ÷ð1¢ù£Kñ–›c£ù±$€«6¢b#XÇNÔgòZÒ„ˆ“±¤;ÈÈï §!;66ëdbùEšËÉa ÜÀ11MM ^];xˆ8O쵟 WĪžÆ5ù«€Ò’Ÿ b²ÇoM»X—uФ;¯¬u:)ÒÂöe{#Ÿ3½¤Ëb™B„„£X¾Þp(8É6ÄüˆÎ-F4=Ñ›ÄSTæ8jXF‘hqüÄ N¬uÜŃønaÉ%iþ¦!ÐÎ4ÛÁ«wŒT±_±~]*âTéÀõ¥¨juCû(59uTq}çn|Ì[…`ô…àøWÙ+ÌŸiR2ÆqGé·…-åJŠnãçÙaP µúÁEþÂm¨Cø‘/ÌÈý”ëywý1ú:œÛ~±* R&p^&eRïéJöÜó…3³&W¶m²¹A¸’x94ÎÖPäa¸¤Œ¾iäÔ™ÖøÇfhì:ëÚÖ@ÜDéµY¡}â¦ÉŠÔ¼Þe+WyÆ-F]BÒ H"&ÄÐ}ÏHέ «ßÙªÆÐ¬š *°ë•^4*70CË:M”!ØèR\0 á™—Žµ]Ë‘ç2ïëEü!Š…"ç®Ñ…ò‚Êöx€Áb Íq^©ZmÏx駬 ëÜF5xAÛ@Ú x›Ž76ö˜Ð }TÛÊ H!w ׬¹Æ‰MÀ3;M x¡‘Íj ñ1èN”ùƒS)m5¥’ͳËÁ"ÿmã𤡪ãj®ŸayúcÑ»„’OQxÒ ÙÏ—è‡ã©°åÔ:4¥`‚aŸ-˜f›#ôD¸÷0ᚣæe¦å'~CxdËêŠ$©¶ ('Ö&5¿G4{,4Õ@Uˆ«%² Øg]y•Ijã•¡Ž±Še (‚ ¸„Ú¢¶1c'U;Xemº ¾Ÿ|ZÆeX ˶ê &¦Ð’èQ± ŸªKÉŠÃRZż̪ë§SSǘðVöJ}çì$ø¾ ýR}Å÷¸Hµ¯m®|£ŽNôŽÈÇ©2=_œr¶‚ÕŠ‚uh¸½ŸË¤A&ð’Ü—ã>J û—R.,w¹ãnÂ.UCË$)Ek7´i‰©HBÕ.¦”ØMܽ‚‘Ð×mâà¨mÙPãåþNÓ}R奇, ®›\D✩8êœ ƒ²R´^Ø µ3P\ˈÒëêâYZ†„éä·;r¹Þ"uÊ4Š¥CËgѸNõÓ`..|AýŠ…ò©w«,X«t `$ªàÜ\Dëá&¤é­O°… T´Ÿ @~‘yºj›`pÛÕÆO­· æIð“‹F‰‘Çç{…>¹7ØCk¬€«‚<. É<âH6AW3çå K€(¦àÖ3³J$’˜™‰Ê/ !ùg´¸yØ„‹Š!›ˆ_˜ï(© í ®$¨ß¬-0[tjé¼>É¢@²Ó2ŠS€ë ØCB—qn^^lÄÇ‚Öë&×:·„:£R‹ ›Â¹2 ½ •R@;{#F*;BVU’ |Ë%$•”›{aKåJP!À«yD}¥¨­¯”8 K&Ê ±l¤ãÏ¿ÂqH NÂâ7š‘:6 õHæ 5ÌÔì¤ó´"(Y©s*ÛJOç ^ׂÙÈ_£% ´¢Iþ¤|@ó#o!hœÍ抋ô^ùÕ)'ŒðTÊ[ ÍK3^;sÈ/Ó›zÀÅÖÆ*¨NJ¢ÇŒÚÐF£õ¶ÞþqTâIKÔ: Ž #²\_ñ91§1±åjÒâMŒIhµ3 ¹ï ŒE›;”žG”(§Ì™W·Wtíµfì°¥çl. 9Sê¦Za%VP"ÖˆcÄr7ó‡i¥|a&&ŽÄ©03c$KJ ¨Ë4dY.·¸û¡Ì6±›x4”ðŸAØ…§cöˆŒöiÅÁ™·i/,pßN¤$øøDOIÍåžfÕi²i"F©iÙT‘°QõÒ=÷àéœR^ŽÇî®w*&ÞmF¤9oŒTSU†¤W¥j¼ÌL²ž©75’.Û)qHtîŒP›Wœ§TRܲIñ6òŒ¼j—?úW‘qKè³eñ´Â}dÞýU¹Š%™QIRE¼ãŽ(«¥D„¯dcòž¬°os´u~¨æá&t(Æ,’l ¶5{¶¦ÉZ9õ8’«m‚­Óh18š°[RMÏ´Cý„¾Ë¶Ÿˆùñ©…6¹‹JJµ)<Ð)uŽEQÇGÕɺ”Rð‘k2k7”ð‰j>R—¶v+‹@'K‰¿…ãŸóéJ5ye{(„ÊæÅq—Ò¢úÈ 1v,˜Ähe÷ö7ñœ•QÑÙÓ˜ðæ’ñáˆ~,¡KÖ@Õãl³®J?‡eKé+ ¶›Ã­[JÒ*Mʺ°’¾P6cÈ“•Û”m®†(ÒÆM-á͉¤Ì0—UÒ®F±¦«B‚½ù¼w Û”&yà’.~h]ÀÂêÚ‹xºUDìMŒ;b™ mÓan°É‰ÖQ‰d·Ü‘¼=â¡rH*;Z%ôRÓ.,ƒn¡NuÞ!*¶›Úþq{²ËIJMÄQ]žVÚ(K²»Àî ]LM¦ÞƒìÝm ÖÄÛœ&.ßÎ4\Èlnm:-wxhœšÒæž Hð„õZûrŒ“¨räb¼Åfv¤} øºlODòQöRó€¼ …òÕfZIHX6ê VÔÙ ìóÈ®·¹‡:|ÏÒ85\CHÏ‘<¦¯ëAÍÔÙ"ú¢f<÷ŒzZ“¸QEQ<‰£Õ6’.>0‰Úói;b$¹ây¨ÛÛ*pXÙ[P¹³ˆð>ÈNå}®ìFÄêS×x§@¹¿8¤ˆmoV]»Ð"Ϻ"U I0ÍA”¯¼ÓhJ6ä: tûáÏ2ëËsL8Ýî¡¡¶ÔuÓ` æwÚÃÊ#-3l  €Xßh–Û.:1U-L­N2«¤÷‡—”5ªÉ;°ÁhÙ~<‡(Nò/¿º3¢¢h›ù^4pZý#„“­w>B)!Špõ0¡µÝC¬6…|`æf4-´:rÕq´&*$ߤmÆ+ämêµúÄcs ëÒs=ÐL1(ƒ¼Ì‘ko‡d©‡“ªÇ¼CK+¢Î5>ÅÕ*u€wGñCL¬Â–­þø~§º´¨¦×B…”“¸"4Jôg-“­ªiŸ­ÚtjNžVµá &|ÊÌú3È ! MÂü´BŸHT¥4Ê4ƒd«R£ê×&b®Ãå:HcÃÛì„Õ1ªh›áÙ)W”ó,•¶[]›Uù\j >=D6æ©ÊbfZq“r<£Ê‚’¶š–Z}%çBX6Í­›Ä‚iù:šL²ÖN•+tçá¼l¤š2q|Š¡i('ÄFT­@(la½ i³î5²‘ë%C‘0Ö“k”;¤f5 £h{“{Çx‰K—f°B­mý°ÝXÌiÃo§nš¢¬Þ¤°è%}àH½¼ãU ¹¥Û-ªtà… Gxy§Oðæ"(ôç­ Vˆ§Âmû“¼lŽÐTtL­zÖ¤›òA‡ÂVO8ý—âêD¹0[•y{b…w´…-´Ü¥Ð Ø”WIíGŸœi‡,—M’]IãÁ¦‹¥S¤Ü^ TöÆÚ¡¢^ªÜܺm@¥BâÆ4zwIžb$´‡eNŸÕÖÞØdz~}#tMÝ;u´>ÂIŽª‰#Û˜².z˜¬HòÝ®â¨9d¨yAèî…[ÆO¨©fþ1‘éY,Êg\”Īu¥­ «¼9‹íÛ•9—ÍÖé>1TåJA«Î¼÷ÅŽ…¬t‡d=’ D€Ö°êVmÌs‚iΕUÈ :øÁR?écì‚厚¥‡#µ¤sÿ±=}Û³t°„xFœ¹ºŒÄÂÓt„éB|I?Å >‹ÏÂ%86U¶Ú*çñŒr:F˜•²ËÀ´%©ùuè,Ùm,Ø?4øÅ®Ü„» ÒTXRS-¾@7·!ÕBþýýÐÇ‚ØinÉ2¦R­W%"çcÖz£0Ìì«m¸PÛ` rÛí8àäìë!xÞ¬ì²æ›6Ai)@¾ö¹=mü¯Eg5Q™J%æV7¹µ¶xíh·1Ô›^ŽòJu¥Ãª¿CcËËaŸˆ\²–ëj).›©Wema¸ÿhìæ¶™0«ÔH˜SI>‹XñÐn ·è-¿„6!lLQê Ï(¸BCL ΞdÛÂÀûúÃÅE©Ùš7ê2bû¼Ä'·óDƒÉ—R€âêïïã0«‹6½¾(A›®Ì¼±bVl:6y6!(më©@.mrxƘYmÐB÷ IëäYSbüÎñy匳~ªÛﳸ˃Ú0ÍâBQsŽ˜f¨Là ŠeæîY!.ô1kR±j³èSOjM·­Seê´W„Ê5é½Q|®Ÿ˜gª\:¥5¨"Ê7Úñ´×Ì„­"fŠFêÄNMÔÃ’²Ê QÚäÄÃ/Ð)(y€å¹å5wT›uHt%C¨¿mŽoˆã/•*z]nNM…:³{Ê “Êz+`¹¢¢ÒR58ŒSnÎ;é-+Vð±ê¼Ðy¡ÄÚñ†ì·2Øzm§‘¥+ÞüàEO-X›MYÄN”¶«| Eñ#ÿÙ ack-2.12/t/swamp/blib/0000755000076400007640000000000012247354203013160 5ustar andyandyack-2.12/t/swamp/blib/ignore.pm0000644000076400007640000000024312215743470015003 0ustar andyandy#!perl -T use warnings; use strict; use Test::More tests => 1; BEGIN { use_ok( 'App::Ack' ); } diag( "Testing App::Ack $App::Ack::VERSION, Perl $], $^X" ); ack-2.12/t/swamp/blib/ignore.pir0000644000076400007640000000266512215743470015173 0ustar andyandy=head1 INFORMATION This example shows the usage of C. =head1 FUNCTIONS =over 4 =item _main =cut .sub _main :main .local pmc stream load_bytecode "library/Stream/Sub.pir" load_bytecode "library/Stream/Replay.pir" find_type $I0, "Stream::Sub" new $P0, $I0 # set the stream's source sub .const .Sub temp = "_hello" assign $P0, $P1 find_type $I0,"Stream::Replay" stream = new $I0 assign stream, $P0 $S0 = stream."read_bytes"( 3 ) print "'hel': [" print $S0 print "]\n" stream = clone stream $P0 = clone stream $S0 = stream."read_bytes"( 4 ) print "'lowo': [" print $S0 print "] = " $S0 = $P0."read_bytes"( 4 ) print "[" print $S0 print "]\n" $S0 = stream."read"() print "'rld!': [" print $S0 print "]\n" $S0 = stream."read_bytes"( 100 ) print "'parrotis cool': [" print $S0 print "]\n" end .end =item _hello This sub is used as the source for the stream. It just writes some text to the stream. =cut .sub _hello :method self."write"( "hello" ) self."write"( "world!" ) self."write"( "parrot" ) self."write"( "is cool" ) .end =back =head1 AUTHOR Jens Rieks Eparrot at jensbeimsurfen dot deE is the author and maintainer. Please send patches and suggestions to the Perl 6 Internals mailing list. =head1 COPYRIGHT Copyright (C) 2004, The Perl Foundation. =cut ack-2.12/t/swamp/blib/ignore.pod0000644000076400007640000000024312215743470015151 0ustar andyandy#!perl -T use warnings; use strict; use Test::More tests => 1; BEGIN { use_ok( 'App::Ack' ); } diag( "Testing App::Ack $App::Ack::VERSION, Perl $], $^X" ); ack-2.12/t/swamp/notaMakefile0000644000076400007640000000020612215743470014573 0ustar andyandyThis is just a plain old textfile that has a name that looks like "Makefile" but indeed is not. However, it should not match --make. ack-2.12/t/swamp/html.html0000644000076400007640000000024612215743470014107 0ustar andyandy Boring test file

but trying to be conforming anyway

ack-2.12/t/swamp/incomplete-last-line.txt0000644000076400007640000000011112215743470017032 0ustar andyandyThis is a file with three lines of text but no new line on the last line!ack-2.12/t/swamp/notes.md0000644000076400007640000000004312215743470013722 0ustar andyandy# Notes * One * Two * Three ack-2.12/t/swamp/Makefile.PL0000644000076400007640000000024312217205374014222 0ustar andyandy#!perl -T use warnings; use strict; use Test::More tests => 1; BEGIN { use_ok( 'App::Ack' ); } diag( "Testing App::Ack $App::Ack::VERSION, Perl $], $^X" ); ack-2.12/t/swamp/minified.js.min0000644000076400007640000000006312215743470015156 0ustar andyandyvar cssDir="./Stylesheets/";var NS4CSS="wango.css" ack-2.12/t/swamp/options.pl.bak0000644000076400007640000000035612215743470015043 0ustar andyandy#!/usr/bin/env perl use strict; use warnings; =head1 NAME Backup of options - Test file for ack command line options =cut [abc] @Q_fields = split(/\b(?:a|b|c)\b/) __DATA__ THIS IS ALL IN UPPER CASE this is a word here notawordhere ack-2.12/t/swamp/Rakefile0000644000076400007640000000420212215743470013716 0ustar andyandyrequire 'rubygems' require 'hoe' def announce(msg='') STDERR.puts msg end PKG_BUILD = ENV['PKG_BUILD'] ? '.' + ENV['PKG_BUILD'] : '' PKG_NAME = 'mechanize' PKG_VERSION = '0.6.4' + PKG_BUILD Hoe.new(PKG_NAME, PKG_VERSION) do |p| p.rubyforge_name = PKG_NAME p.author = 'Aaron Patterson' p.email = 'aaronp@rubyforge.org' p.summary = "Mechanize provides automated web-browsing" p.description = p.paragraphs_of('README.txt', 3).join("\n\n") p.url = p.paragraphs_of('README.txt', 1).first.strip p.changes = p.paragraphs_of('CHANGELOG.txt', 0..2).join("\n\n") files = (p.test_globs + ['test/**/tc_*.rb', "test/htdocs/**/*.{html,jpg}", 'test/data/server.*']).map { |x| Dir.glob(x) }.flatten + ['test/data/htpasswd'] p.extra_deps = ['hpricot'] p.spec_extras = { :test_files => files } end task :update_version do announce "Updating Mechanize Version to #{PKG_VERSION}" File.open("lib/mechanize/mech_version.rb", "w") do |f| f.puts "module WWW" f.puts " class Mechanize" f.puts " Version = '#{PKG_VERSION}'" f.puts " end" f.puts "end" end sh 'svn commit -m"updating version" lib/mechanize/mech_version.rb' end desc "Tag code" Rake::Task.define_task("tag") do |p| baseurl = "svn+ssh://#{ENV['USER']}@rubyforge.org//var/svn/#{PKG_NAME}" sh "svn cp -m 'tagged #{ PKG_VERSION }' . #{ baseurl }/tags/REL-#{ PKG_VERSION }" end desc "Branch code" Rake::Task.define_task("branch") do |p| baseurl = "svn+ssh://#{ENV['USER']}@rubyforge.org/var/svn/#{PKG_NAME}" sh "svn cp -m 'branched #{ PKG_VERSION }' #{baseurl}/trunk #{ baseurl }/branches/RB-#{ PKG_VERSION }" end desc "Update SSL Certificate" Rake::Task.define_task('ssl_cert') do |p| sh "openssl genrsa -des3 -out server.key 1024" sh "openssl req -new -key server.key -out server.csr" sh "cp server.key server.key.org" sh "openssl rsa -in server.key.org -out server.key" sh "openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt" sh "cp server.key server.pem" sh "mv server.key server.csr server.crt server.pem test/data/" sh "rm server.key.org" end ack-2.12/t/swamp/lua-shebang-test0000644000076400007640000000005212215743470015336 0ustar andyandy#!/usr/bin/env lua print 'Hello, World!' ack-2.12/t/swamp/c-source.c0000644000076400007640000000341212215743470014137 0ustar andyandy/* A Bison parser, made from plural.y by GNU Bison version 1.28 */ #define YYBISON 1 /* Identify Bison output. */ /* Contains the magic string --noenv which can be tricky to find. */ #define yyparse __gettextparse #define yylex __gettextlex #define yyerror __gettexterror #define yylval __gettextlval #define yychar __gettextchar #define yydebug __gettextdebug #define yynerrs __gettextnerrs #define EQUOP2 257 #define CMPOP2 258 #define ADDOP2 259 #define MULOP2 260 #define NUMBER 261 #line 1 "plural.y" /* Expression parsing for plural form selection. Copyright (C) 2000, 2001 Free Software Foundation, Inc. Written by Ulrich Drepper , 2000. This program is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ /* The bison generated parser uses alloca. AIX 3 forces us to put this declaration at the beginning of the file. The declaration in bison's skeleton file comes too late. This must come before because may include arbitrary system headers. */ static void yyerror (str) const char *str; { /* Do nothing. We don't print error messages here. */ } ack-2.12/t/swamp/file.foo0000644000076400007640000000002412215743470013673 0ustar andyandyThis is a foo file. ack-2.12/t/swamp/groceries/0000755000076400007640000000000012247354203014232 5ustar andyandyack-2.12/t/swamp/groceries/meat0000644000076400007640000000002212215743470015100 0ustar andyandypork beef chicken ack-2.12/t/swamp/groceries/another_subdir/0000755000076400007640000000000012247354203017242 5ustar andyandyack-2.12/t/swamp/groceries/another_subdir/meat0000644000076400007640000000002212215743470020110 0ustar andyandypork beef chicken ack-2.12/t/swamp/groceries/another_subdir/CVS/0000755000076400007640000000000012247354203017675 5ustar andyandyack-2.12/t/swamp/groceries/another_subdir/CVS/meat0000644000076400007640000000002212215743470020543 0ustar andyandypork beef chicken ack-2.12/t/swamp/groceries/another_subdir/CVS/junk0000644000076400007640000000005212215743470020567 0ustar andyandyapple fritters grape jam fried pork rinds ack-2.12/t/swamp/groceries/another_subdir/CVS/fruit0000644000076400007640000000002212215743470020746 0ustar andyandyapple pear grapes ack-2.12/t/swamp/groceries/another_subdir/junk0000644000076400007640000000005212215743470020134 0ustar andyandyapple fritters grape jam fried pork rinds ack-2.12/t/swamp/groceries/another_subdir/RCS/0000755000076400007640000000000012247354203017671 5ustar andyandyack-2.12/t/swamp/groceries/another_subdir/RCS/meat0000644000076400007640000000002212215743470020537 0ustar andyandypork beef chicken ack-2.12/t/swamp/groceries/another_subdir/RCS/junk0000644000076400007640000000005212215743470020563 0ustar andyandyapple fritters grape jam fried pork rinds ack-2.12/t/swamp/groceries/another_subdir/RCS/fruit0000644000076400007640000000002212215743470020742 0ustar andyandyapple pear grapes ack-2.12/t/swamp/groceries/another_subdir/fruit0000644000076400007640000000002212215743470020313 0ustar andyandyapple pear grapes ack-2.12/t/swamp/groceries/CVS/0000755000076400007640000000000012247354203014665 5ustar andyandyack-2.12/t/swamp/groceries/CVS/meat0000644000076400007640000000002212215743470015533 0ustar andyandypork beef chicken ack-2.12/t/swamp/groceries/CVS/junk0000644000076400007640000000005212215743470015557 0ustar andyandyapple fritters grape jam fried pork rinds ack-2.12/t/swamp/groceries/CVS/fruit0000644000076400007640000000002212215743470015736 0ustar andyandyapple pear grapes ack-2.12/t/swamp/groceries/junk0000644000076400007640000000005212215743470015124 0ustar andyandyapple fritters grape jam fried pork rinds ack-2.12/t/swamp/groceries/RCS/0000755000076400007640000000000012247354203014661 5ustar andyandyack-2.12/t/swamp/groceries/RCS/meat0000644000076400007640000000002212215743470015527 0ustar andyandypork beef chicken ack-2.12/t/swamp/groceries/RCS/junk0000644000076400007640000000005212215743470015553 0ustar andyandyapple fritters grape jam fried pork rinds ack-2.12/t/swamp/groceries/RCS/fruit0000644000076400007640000000002212215743470015732 0ustar andyandyapple pear grapes ack-2.12/t/swamp/groceries/fruit0000644000076400007640000000002212215743470015303 0ustar andyandyapple pear grapes ack-2.12/t/swamp/groceries/subdir/0000755000076400007640000000000012247354203015522 5ustar andyandyack-2.12/t/swamp/groceries/subdir/meat0000644000076400007640000000002212215743470016370 0ustar andyandypork beef chicken ack-2.12/t/swamp/groceries/subdir/junk0000644000076400007640000000005212215743470016414 0ustar andyandyapple fritters grape jam fried pork rinds ack-2.12/t/swamp/groceries/subdir/fruit0000644000076400007640000000002212215743470016573 0ustar andyandyapple pear grapes ack-2.12/t/swamp/minified.min.js0000644000076400007640000000006312215743470015156 0ustar andyandyvar cssDir="./Stylesheets/";var NS4CSS="wango.css" ack-2.12/t/swamp/options-crlf.pl0000755000076400007640000000036712217205376015240 0ustar andyandy#!/usr/bin/env perl use strict; use warnings; =head1 NAME options - Test file for ack command line options =cut [abc] @Q_fields = split(/\b(?:a|b|c)\b/) __DATA__ THIS IS ALL IN UPPER CASE this is a word here notawordhere ack-2.12/t/swamp/solution8.tar0000644000076400007640000000047112215743470014731 0ustar andyandy‹Á~'IíÖMKÃ0ðžó)þ²ÃnmÓ—” ÜM~é›X7’’´Â¾½ ÎÁڋݘ>¿K(-$äé“¶kû(˜XìÈ<ÿ…8÷î )™1Ó, (ŸzaÞ`ûÂ…ªw?=7vÿBu.ÿ·¢ÚX­Ân;Í>`‘eßçïÞ}þBHîòOÒ4 (žf9Çþyþ³«h°&*[uÙ26؆*­Ü®¨ž—÷´¸¥ùJëù ;÷bá×ùþ=¨úU»äÃjŠ9FûŸú/݇Â÷_Æý?6«›—V5´Z¯‰®î–O” ïŸï¯ Û‡¦œjŽÑþ»Ÿ½¯þs‘ùþÇ\¢ÿ§ÐvC×f(wÏz§Z3rüa° L²FÕ8.Åøê‡ê(ack-2.12/t/swamp/fresh.min.css0000644000076400007640000011534012215743470014662 0ustar andyandyhtml,.wp-dialog{background-color:#fff;}* html input,* html .widget{border-color:#dfdfdf;}textarea,input[type="text"],input[type="password"],input[type="file"],input[type="button"],input[type="submit"],input[type="reset"],select{border-color:#dfdfdf;background-color:#fff;}kbd,code{background:#eaeaea;}input[readonly]{background-color:#eee;}.find-box-search{border-color:#dfdfdf;background-color:#f1f1f1;}.find-box{background-color:#f1f1f1;}.find-box-inside{background-color:#fff;}a.page-numbers:hover{border-color:#999;}body,#wpbody,.form-table .pre{color:#333;}body>#upload-menu{border-bottom-color:#fff;}#postcustomstuff table,#your-profile fieldset,#rightnow,div.dashboard-widget,#dashboard-widgets p.dashboard-widget-links,#replyrow #ed_reply_toolbar input{border-color:#ccc;}#poststuff .inside label.spam,#poststuff .inside label.deleted{color:red;}#poststuff .inside label.waiting{color:orange;}#poststuff .inside label.approved{color:green;}#postcustomstuff table{border-color:#dfdfdf;background-color:#F9F9F9;}#postcustomstuff thead th{background-color:#F1F1F1;}#postcustomstuff table input,#postcustomstuff table textarea{border-color:#dfdfdf;background-color:#fff;}.widefat{border-color:#dfdfdf;background-color:#f9f9f9;}div.dashboard-widget-error{background-color:#c43;}div.dashboard-widget-notice{background-color:#cfe1ef;}div.dashboard-widget-submit{border-top-color:#ccc;}div.tabs-panel,.wp-tab-panel,ul.category-tabs li.tabs,ul.add-menu-item-tabs li.tabs,.wp-tab-active{border-color:#dfdfdf;background-color:#fff;}ul.category-tabs li.tabs,ul.add-menu-item-tabs li.tabs,.wp-tab-active{background-color:#fff;}input.disabled,textarea.disabled{background-color:#ccc;}#plugin-information .action-button a,#plugin-information .action-button a:hover,#plugin-information .action-button a:visited{color:#fff;}.widget .widget-top,.postbox h3,.stuffbox h3,.widefat thead tr th,.widefat tfoot tr th,h3.dashboard-widget-title,h3.dashboard-widget-title span,h3.dashboard-widget-title small,.find-box-head,.sidebar-name,#nav-menu-header,#nav-menu-footer,.menu-item-handle,#fullscreen-topbar{background-color:#f1f1f1;background-image:-ms-linear-gradient(top,#f9f9f9,#ececec);background-image:-moz-linear-gradient(top,#f9f9f9,#ececec);background-image:-o-linear-gradient(top,#f9f9f9,#ececec);background-image:-webkit-gradient(linear,left top,left bottom,from(#f9f9f9),to(#ececec));background-image:-webkit-linear-gradient(top,#f9f9f9,#ececec);background-image:linear-gradient(top,#f9f9f9,#ececec);}.widget .widget-top,.postbox h3,.stuffbox h3{border-bottom-color:#dfdfdf;text-shadow:#fff 0 1px 0;-moz-box-shadow:0 1px 0 #fff;-webkit-box-shadow:0 1px 0 #fff;box-shadow:0 1px 0 #fff;}.form-table th,.form-wrap label{color:#222;text-shadow:#fff 0 1px 0;}.description,.form-wrap p{color:#666;}strong .post-com-count span{background-color:#21759b;}.sorthelper{background-color:#ccf3fa;}.ac_match,.subsubsub a.current{color:#000;}.wrap h2{color:#464646;}.wrap .add-new-h2{background:#f1f1f1;}.subtitle{color:#777;}.ac_over{background-color:#f0f0b8;}.ac_results{background-color:#fff;border-color:#808080;}.ac_results li{color:#101010;}.alternate,.alt{background-color:#fcfcfc;}.available-theme a.screenshot{background-color:#f1f1f1;border-color:#ddd;}.bar{background-color:#e8e8e8;border-right-color:#99d;}#media-upload,#media-upload .media-item .slidetoggle{background:#fff;}#media-upload .slidetoggle{border-top-color:#dfdfdf;}div.error,.login #login_error{background-color:#ffebe8;border-color:#c00;}div.error a{color:#c00;}.form-invalid{background-color:#ffebe8!important;}.form-invalid input,.form-invalid select{border-color:#c00!important;}.submit{border-color:#DFDFDF;}.highlight{background-color:#e4f2fd;color:#000;}.howto,.nonessential,#edit-slug-box,.form-input-tip,.subsubsub{color:#666;}.media-item{border-bottom-color:#dfdfdf;}#wpbody-content #media-items .describe{border-top-color:#dfdfdf;}.media-upload-form label.form-help,td.help{color:#9a9a9a;}.post-com-count{background-image:url(../images/bubble_bg.gif);color:#fff;}.post-com-count span{background-color:#bbb;color:#fff;}.post-com-count:hover span{background-color:#d54e21;}.quicktags,.search{background-color:#ccc;color:#000;}.side-info h5{border-bottom-color:#dadada;}.side-info ul{color:#666;}.button,.button-secondary,.submit input,input[type=button],input[type=submit]{border-color:#bbb;color:#464646;}.button:hover,.button-secondary:hover,.submit input:hover,input[type=button]:hover,input[type=submit]:hover{color:#000;border-color:#666;}.button,.submit input,.button-secondary{background:#f2f2f2 url(../images/white-grad.png) repeat-x scroll left top;text-shadow:rgba(255,255,255,1) 0 1px 0;}.button:active,.submit input:active,.button-secondary:active{background:#eee url(../images/white-grad-active.png) repeat-x scroll left top;}input.button-primary,button.button-primary,a.button-primary{border-color:#298cba;font-weight:bold;color:#fff;background:#21759B url(../images/button-grad.png) repeat-x scroll left top;text-shadow:rgba(0,0,0,0.3) 0 -1px 0;}input.button-primary:active,button.button-primary:active,a.button-primary:active{background:#21759b url(../images/button-grad-active.png) repeat-x scroll left top;color:#eaf2fa;}input.button-primary:hover,button.button-primary:hover,a.button-primary:hover,a.button-primary:focus,a.button-primary:active{border-color:#13455b;color:#eaf2fa;}.button-disabled,.button[disabled],.button:disabled,.button-secondary[disabled],.button-secondary:disabled,a.button.disabled{color:#aaa!important;border-color:#ddd!important;}.button-primary-disabled,.button-primary[disabled],.button-primary:disabled{color:#9FD0D5!important;background:#298CBA!important;}a:hover,a:active,a:focus{color:#d54e21;}#wphead #viewsite a:hover,#adminmenu a:hover,#adminmenu ul.wp-submenu a:hover,#the-comment-list .comment a:hover,#rightnow a:hover,#media-upload a.del-link:hover,div.dashboard-widget-submit input:hover,.subsubsub a:hover,.subsubsub a.current:hover,.ui-tabs-nav a:hover,.plugins .inactive a:hover,#all-plugins-table .plugins .inactive a:hover,#search-plugins-table .plugins .inactive a:hover{color:#d54e21;}#the-comment-list .comment-item,#dashboard-widgets #dashboard_quick_press form p.submit{border-color:#dfdfdf;}#side-sortables .category-tabs .tabs a,#side-sortables .add-menu-item-tabs .tabs a,.wp-tab-bar .wp-tab-active a{color:#333;}#rightnow .rbutton{background-color:#ebebeb;color:#264761;}.submitbox .submit{background-color:#464646;color:#ccc;}.plugins a.delete:hover,#all-plugins-table .plugins a.delete:hover,#search-plugins-table .plugins a.delete:hover,.submitbox .submitdelete{color:#f00;border-bottom-color:#f00;}.submitbox .submitdelete:hover,#media-items a.delete:hover{color:#fff;background-color:#f00;border-bottom-color:#f00;}#normal-sortables .submitbox .submitdelete:hover{color:#000;background-color:#f00;border-bottom-color:#f00;}.tablenav .dots{border-color:transparent;}.tablenav .next,.tablenav .prev{border-color:transparent;color:#21759b;}.tablenav .next:hover,.tablenav .prev:hover{border-color:transparent;color:#d54e21;}div.updated,.login .message{background-color:#ffffe0;border-color:#e6db55;}.update-message{color:#000;}a.page-numbers{border-bottom-color:#B8D3E2;}.commentlist li{border-bottom-color:#ccc;}.widefat td,.widefat th{border-top-color:#fff;border-bottom-color:#dfdfdf;}.widefat th{text-shadow:rgba(255,255,255,0.8) 0 1px 0;}.widefat td{color:#555;}.widefat p,.widefat ol,.widefat ul{color:#333;}.widefat thead tr th,.widefat tfoot tr th,h3.dashboard-widget-title,h3.dashboard-widget-title span,h3.dashboard-widget-title small,.find-box-head{color:#333;}th.sortable a:hover,th.sortable a:active,th.sortable a:focus{color:#333;}h3.dashboard-widget-title small a{color:#d7d7d7;}h3.dashboard-widget-title small a:hover{color:#fff;}a,#adminmenu a,#poststuff #edButtonPreview,#poststuff #edButtonHTML,#the-comment-list p.comment-author strong a,#media-upload a.del-link,#media-items a.delete,.plugins a.delete,.ui-tabs-nav a{color:#21759b;}#adminmenu .awaiting-mod,#adminmenu .update-plugins,#sidemenu a .update-plugins,#rightnow .reallynow{background-color:#464646;color:#fff;-moz-box-shadow:rgba(255,255,255,0.5) 0 1px 0;-khtml-box-shadow:rgba(255,255,255,0.5) 0 1px 0;-webkit-box-shadow:rgba(255,255,255,0.5) 0 1px 0;box-shadow:rgba(255,255,255,0.5) 0 1px 0;}#plugin-information .action-button{background-color:#d54e21;color:#fff;}#adminmenu li.current a .awaiting-mod,#adminmenu li a.wp-has-current-submenu .update-plugins{background-color:#464646;color:#fff;-moz-box-shadow:rgba(255,255,255,0.5) 0 1px 0;-khtml-box-shadow:rgba(255,255,255,0.5) 0 1px 0;-webkit-box-shadow:rgba(255,255,255,0.5) 0 1px 0;box-shadow:rgba(255,255,255,0.5) 0 1px 0;}div#media-upload-header,div#plugin-information-header{background-color:#f9f9f9;border-bottom-color:#dfdfdf;}#currenttheme img{border-color:#666;}#dashboard_secondary div.dashboard-widget-content ul li a{background-color:#f9f9f9;}input.readonly,textarea.readonly{background-color:#ddd;}#ed_toolbar input,#ed_reply_toolbar input{background:#fff url("../images/fade-butt.png") repeat-x 0 -2px;}#editable-post-name{background-color:#fffbcc;}#edit-slug-box strong,.tablenav .displaying-num,#submitted-on,.submitted-on{color:#777;}.login #nav a,.login #backtoblog a{color:#21759b!important;}.login #nav a:hover,.login #backtoblog a:hover{color:#d54e21!important;}#footer{color:#777;border-color:#dfdfdf;}#media-items,.imgedit-group{border-color:#dfdfdf;}.checkbox,.side-info,.plugins tr,#your-profile #rich_editing{background-color:#fcfcfc;}.plugins .inactive,.plugins .inactive th,.plugins .inactive td,tr.inactive+tr.plugin-update-tr .plugin-update{background-color:#f4f4f4;}.plugin-update-tr .update-message{background-color:#fffbe4;border-color:#dfdfdf;}.plugins .active,.plugins .active th,.plugins .active td{color:#000;}.plugins .inactive a{color:#579;}#the-comment-list tr.undo,#the-comment-list div.undo{background-color:#f4f4f4;}#the-comment-list .unapproved{background-color:#ffffe0;}#the-comment-list .approve a{color:#006505;}#the-comment-list .unapprove a{color:#d98500;}table.widefat span.delete a,table.widefat span.trash a,table.widefat span.spam a,#dashboard_recent_comments .delete a,#dashboard_recent_comments .trash a,#dashboard_recent_comments .spam a{color:#bc0b0b;}.widget,#widget-list .widget-top,.postbox,#titlediv,#poststuff .postarea,.stuffbox{border-color:#dfdfdf;-moz-box-shadow:inset 0 1px 0 #fff;-webkit-box-shadow:inset 0 1px 0 #fff;box-shadow:inset 0 1px 0 #fff;-moz-border-radius:3px;-khtml-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;}.widget,#widget-list .widget-top,.postbox,.menu-item-settings{background-color:#f5f5f5;background-image:-ms-linear-gradient(top,#f9f9f9,#f5f5f5);background-image:-moz-linear-gradient(top,#f9f9f9,#f5f5f5);background-image:-o-linear-gradient(top,#f9f9f9,#f5f5f5);background-image:-webkit-gradient(linear,left top,left bottom,from(#f9f9f9),to(#f5f5f5));background-image:-webkit-linear-gradient(top,#f9f9f9,#f5f5f5);background-image:linear-gradient(top,#f9f9f9,#f5f5f5);}.postbox h3{color:#464646;}.widget .widget-top{color:#222;}.sidebar-name:hover h3,.postbox h3:hover{color:#000;}.curtime #timestamp{background-image:url(../images/date-button.gif);}#quicktags #ed_link{color:#00f;}#rightnow .youhave{background-color:#f0f6fb;}#rightnow a{color:#448abd;}.tagchecklist span a,#bulk-titles div a{background:url(../images/xit.gif) no-repeat;}.tagchecklist span a:hover,#bulk-titles div a:hover{background:url(../images/xit.gif) no-repeat -10px 0;}#update-nag,.update-nag{background-color:#FFFBCC;border-color:#E6DB55;color:#555;}.login #backtoblog a{color:#464646;}#wphead{border-bottom:#dfdfdf 1px solid;}#wphead h1 a{color:#464646;}#user_info{color:#555;}#user_info:hover,#user_info.active{color:#222;}#user_info.active{background-color:#f1f1f1;background-image:-ms-linear-gradient(bottom,#e9e9e9,#f9f9f9);background-image:-moz-linear-gradient(bottom,#e9e9e9,#f9f9f9);background-image:-o-linear-gradient(bottom,#e9e9e9,#f9f9f9);background-image:-webkit-gradient(linear,left bottom,left top,from(#e9e9e9),to(#f9f9f9));background-image:-webkit-linear-gradient(bottom,#e9e9e9,#f9f9f9);background-image:linear-gradient(bottom,#e9e9e9,#f9f9f9);border-color:#aaa #aaa #dfdfdf;}#user_info_arrow{background:transparent url(../images/arrows.png) no-repeat 6px 5px;}#user_info:hover #user_info_arrow,#user_info.active #user_info_arrow{background:transparent url(../images/arrows-dark.png) no-repeat 6px 5px;}#user_info_links{-moz-box-shadow:0 3px 2px -2px rgba(0,0,0,0.2);-webkit-box-shadow:0 3px 2px -2px rgba(0,0,0,0.2);box-shadow:0 3px 2px -2px rgba(0,0,0,0.2);}#user_info_links ul{background:#f1f1f1;border-color:#ccc #aaa #aaa;-moz-box-shadow:inset 0 1px 0 #f9f9f9;-webkit-box-shadow:inset 0 1px 0 #f9f9f9;box-shadow:inset 0 1px 0 #f9f9f9;}#user_info_links li:hover{background-color:#dfdfdf;}#user_info_links li:hover a,#user_info_links li a:hover{text-decoration:none;}#user_info a:link,#user_info a:visited,#footer a:link,#footer a:visited{text-decoration:none;}#footer a:hover{color:#000;text-decoration:underline;}div#media-upload-error,.file-error,abbr.required,.widget-control-remove:hover,table.widefat .delete a:hover,table.widefat .trash a:hover,table.widefat .spam a:hover,#dashboard_recent_comments .delete a:hover,#dashboard_recent_comments .trash a:hover #dashboard_recent_comments .spam a:hover{color:#f00;}#pass-strength-result{background-color:#eee;border-color:#ddd!important;}#pass-strength-result.bad{background-color:#ffb78c;border-color:#ff853c!important;}#pass-strength-result.good{background-color:#ffec8b;border-color:#fc0!important;}#pass-strength-result.short{background-color:#ffa0a0;border-color:#f04040!important;}#pass-strength-result.strong{background-color:#c3ff88;border-color:#8dff1c!important;}#quicktags{border-color:#ccc;background-color:#dfdfdf;background-image:url("../images/ed-bg.gif");}#ed_toolbar input{border-color:#C3C3C3;}#ed_toolbar input:hover{border-color:#aaa;background:#ddd;}#poststuff .wp_themeSkin .mceStatusbar{border-color:#dfdfdf;}#poststuff .wp_themeSkin .mceStatusbar *{color:#555;}#poststuff #edButtonPreview,#poststuff #edButtonHTML{background-color:#f1f1f1;border-color:#dfdfdf #dfdfdf #ccc;color:#999;}#poststuff #editor-toolbar .active{border-color:#ccc #ccc #e9e9e9;background-color:#e9e9e9;color:#333;}#post-status-info{background-color:#EDEDED;}.wp_themeSkin *,.wp_themeSkin a:hover,.wp_themeSkin a:link,.wp_themeSkin a:visited,.wp_themeSkin a:active{color:#000;}.wp_themeSkin table.mceLayout{border-color:#ccc #ccc #dfdfdf;}#editorcontainer #content,#editorcontainer .wp_themeSkin .mceIframeContainer{-moz-box-shadow:inset 1px 1px 2px rgba(0,0,0,0.1);-webkit-box-shadow:inset 1px 1px 2px rgba(0,0,0,0.1);box-shadow:inset 1px 1px 2px rgba(0,0,0,0.1);}.wp_themeSkin iframe{background:transparent;}.wp_themeSkin .mceStatusbar{color:#000;background-color:#f5f5f5;}.wp_themeSkin .mceButton{border-color:#ccc;background-color:#eee;background-image:-ms-linear-gradient(bottom,#ddd,#fff);background-image:-moz-linear-gradient(bottom,#ddd,#fff);background-image:-o-linear-gradient(bottom,#ddd,#fff);background-image:-webkit-gradient(linear,left bottom,left top,from(#ddd),to(#fff));background-image:-webkit-linear-gradient(bottom,#ddd,#fff);background-image:linear-gradient(bottom,#ddd,#fff);}.wp_themeSkin a.mceButtonEnabled:hover{border-color:#a0a0a0;background:#ddd;background-image:-ms-linear-gradient(bottom,#ccc,#fff);background-image:-moz-linear-gradient(bottom,#ccc,#fff);background-image:-o-linear-gradient(bottom,#ccc,#fff);background-image:-webkit-gradient(linear,left bottom,left top,from(#ccc),to(#fff));background-image:-webkit-linear-gradient(bottom,#ccc,#fff);background-image:linear-gradient(bottom,#ccc,#fff);}.wp_themeSkin a.mceButton:active,.wp_themeSkin a.mceButtonEnabled:active,.wp_themeSkin a.mceButtonSelected:active,.wp_themeSkin a.mceButtonActive,.wp_themeSkin a.mceButtonActive:active,.wp_themeSkin a.mceButtonActive:hover{background-color:#ddd;background-image:-ms-linear-gradient(bottom,#eee,#bbb);background-image:-moz-linear-gradient(bottom,#eee,#bbb);background-image:-o-linear-gradient(bottom,#eee,#bbb);background-image:-webkit-gradient(linear,left bottom,left top,from(#eee),to(#bbb));background-image:-webkit-linear-gradient(bottom,#eee,#bbb);background-image:linear-gradient(bottom,#eee,#bbb);border-color:#909090;}.wp_themeSkin .mceButtonDisabled{border-color:#ccc!important;}.wp_themeSkin .mceListBox .mceText,.wp_themeSkin .mceListBox .mceOpen{border-color:#ccc;background-color:#eee;background-image:-ms-linear-gradient(bottom,#ddd,#fff);background-image:-moz-linear-gradient(bottom,#ddd,#fff);background-image:-o-linear-gradient(bottom,#ddd,#fff);background-image:-webkit-gradient(linear,left bottom,left top,from(#ddd),to(#fff));background-image:-webkit-linear-gradient(bottom,#ddd,#fff);background-image:linear-gradient(bottom,#ddd,#fff);}.wp_themeSkin .mceListBox .mceOpen{border-left:0!important;}.wp_themeSkin table.mceListBoxEnabled:hover .mceOpen,.wp_themeSkin .mceListBoxHover .mceOpen,.wp_themeSkin .mceListBoxHover:active .mceOpen,.wp_themeSkin .mceListBoxSelected .mceOpen,.wp_themeSkin .mceListBoxSelected .mceText,.wp_themeSkin table.mceListBoxEnabled:active .mceText{background:#ccc;border-color:#999;}.wp_themeSkin table.mceListBoxEnabled:hover .mceText,.wp_themeSkin .mceListBoxHover .mceText,.wp_themeSkin table.mceListBoxEnabled:hover .mceOpen,.wp_themeSkin .mceListBoxHover .mceOpen{border-color:#909090;background-color:#eee;background-image:-ms-linear-gradient(bottom,#ccc,#fff);background-image:-moz-linear-gradient(bottom,#ccc,#fff);background-image:-o-linear-gradient(bottom,#ccc,#fff);background-image:-webkit-gradient(linear,left bottom,left top,from(#ccc),to(#fff));background-image:-webkit-linear-gradient(bottom,#ccc,#fff);background-image:linear-gradient(bottom,#ccc,#fff);}.wp_themeSkin select.mceListBox{border-color:#B2B2B2;background-color:#fff;}.wp_themeSkin .mceSplitButton a.mceAction,.wp_themeSkin .mceSplitButton a.mceOpen{border-color:#ccc;}.wp_themeSkin .mceSplitButton a.mceOpen:hover,.wp_themeSkin .mceSplitButtonSelected a.mceOpen,.wp_themeSkin table.mceSplitButtonEnabled:hover a.mceAction,.wp_themeSkin .mceSplitButton a.mceAction:hover{border-color:#909090;}.wp_themeSkin table.mceSplitButton td{background-color:#eee;background-image:-ms-linear-gradient(bottom,#ddd,#fff);background-image:-moz-linear-gradient(bottom,#ddd,#fff);background-image:-o-linear-gradient(bottom,#ddd,#fff);background-image:-webkit-gradient(linear,left bottom,left top,from(#ddd),to(#fff));background-image:-webkit-linear-gradient(bottom,#ddd,#fff);background-image:linear-gradient(bottom,#ddd,#fff);}.wp_themeSkin table.mceSplitButton:hover td{background-image:-ms-linear-gradient(bottom,#ccc,#fff);background-image:-moz-linear-gradient(bottom,#ccc,#fff);background-image:-o-linear-gradient(bottom,#ccc,#fff);background-image:-webkit-gradient(linear,left bottom,left top,from(#ccc),to(#fff));background-image:-webkit-linear-gradient(bottom,#ccc,#fff);background-image:linear-gradient(bottom,#ccc,#fff);}.wp_themeSkin .mceSplitButtonActive{background-color:#B2B2B2;}.wp_themeSkin div.mceColorSplitMenu table{background-color:#ebebeb;border-color:#B2B2B2;}.wp_themeSkin .mceColorSplitMenu a{border-color:#B2B2B2;}.wp_themeSkin .mceColorSplitMenu a.mceMoreColors{border-color:#fff;}.wp_themeSkin .mceColorSplitMenu a.mceMoreColors:hover{border-color:#0A246A;background-color:#B6BDD2;}.wp_themeSkin a.mceMoreColors:hover{border-color:#0A246A;}.wp_themeSkin .mceMenu{border-color:#ddd;}.wp_themeSkin .mceMenu table{background-color:#ebeaeb;}.wp_themeSkin .mceMenu .mceText{color:#000;}.wp_themeSkin .mceMenu .mceMenuItemEnabled a:hover,.wp_themeSkin .mceMenu .mceMenuItemActive{background-color:#f5f5f5;}.wp_themeSkin td.mceMenuItemSeparator{background-color:#aaa;}.wp_themeSkin .mceMenuItemTitle a{background-color:#ccc;border-bottom-color:#aaa;}.wp_themeSkin .mceMenuItemTitle span.mceText{color:#000;}.wp_themeSkin .mceMenuItemDisabled .mceText{color:#888;}.wp_themeSkin tr.mceFirst td.mceToolbar{background:#dfdfdf url("../images/ed-bg.gif") repeat-x scroll left top;border-color:#ccc;}.wp-admin #mceModalBlocker{background:#000;}.wp-admin .clearlooks2 .mceFocus .mceTop .mceLeft{background:#444;border-left:1px solid #999;border-top:1px solid #999;-moz-border-radius:3px 0 0 0;-webkit-border-top-left-radius:3px;-khtml-border-top-left-radius:3px;border-top-left-radius:3px;}.wp-admin .clearlooks2 .mceFocus .mceTop .mceRight{background:#444;border-right:1px solid #999;border-top:1px solid #999;border-top-right-radius:3px;-khtml-border-top-right-radius:3px;-webkit-border-top-right-radius:3px;-moz-border-radius:0 3px 0 0;}.wp-admin .clearlooks2 .mceMiddle .mceLeft{background:#f1f1f1;border-left:1px solid #999;}.wp-admin .clearlooks2 .mceMiddle .mceRight{background:#f1f1f1;border-right:1px solid #999;}.wp-admin .clearlooks2 .mceBottom{background:#f1f1f1;border-bottom:1px solid #999;}.wp-admin .clearlooks2 .mceBottom .mceLeft{background:#f1f1f1;border-bottom:1px solid #999;border-left:1px solid #999;}.wp-admin .clearlooks2 .mceBottom .mceCenter{background:#f1f1f1;border-bottom:1px solid #999;}.wp-admin .clearlooks2 .mceBottom .mceRight{background:#f1f1f1;border-bottom:1px solid #999;border-right:1px solid #999;}.wp-admin .clearlooks2 .mceFocus .mceTop span{color:#e5e5e5;}#titlediv #title{border-color:#ccc;}#editorcontainer{border-color:#ccc #ccc #dfdfdf;}#post-status-info{border-color:#dfdfdf #ccc #ccc;}.editwidget .widget-inside{border-color:#dfdfdf;}#titlediv #title{background-color:#fff;}#tTips p#tTips_inside{background-color:#ddd;color:#333;}#timestampdiv input,#namediv input,#poststuff .inside .the-tagcloud{border-color:#ddd;}#adminmenuback,#adminmenuwrap{background-color:#ececec;border-color:#ccc;}#adminmenushadow,#adminmenuback{background-image:url(../images/menu-shadow.png);background-position:top right;background-repeat:repeat-y;}#adminmenu li.wp-menu-separator{background:#dfdfdf;border-color:#cfcfcf;}#adminmenu div.separator{border-color:#e1e1e1;}#adminmenu li.wp-has-current-submenu.wp-menu-open .wp-menu-toggle,#adminmenu li.wp-has-current-submenu:hover .wp-menu-toggle{background:transparent url(../images/arrows-dark.png) no-repeat -1px 6px;}#adminmenu .wp-has-submenu:hover .wp-menu-toggle,#adminmenu .wp-menu-open .wp-menu-toggle{background:transparent url(../images/arrows.png) no-repeat -2px 6px;}#adminmenu a.menu-top,.folded #adminmenu li.menu-top,#adminmenu .wp-submenu .wp-submenu-head{border-top-color:#f9f9f9;border-bottom-color:#dfdfdf;}#adminmenu li.wp-menu-open{border-color:#dfdfdf;}#adminmenu li.wp-has-current-submenu a.wp-has-current-submenu,#adminmenu li.current a.menu-top,.folded #adminmenu li.wp-has-current-submenu,.folded #adminmenu li.current.menu-top,#adminmenu .wp-menu-arrow,#adminmenu .wp-has-current-submenu .wp-submenu .wp-submenu-head{background-color:#777;background-image:-ms-linear-gradient(bottom,#6d6d6d,#808080);background-image:-moz-linear-gradient(bottom,#6d6d6d,#808080);background-image:-o-linear-gradient(bottom,#6d6d6d,#808080);background-image:-webkit-gradient(linear,left bottom,left top,from(#6d6d6d),to(#808080));background-image:-webkit-linear-gradient(bottom,#6d6d6d,#808080);background-image:linear-gradient(bottom,#6d6d6d,#808080);}#adminmenu li.wp-has-current-submenu a.wp-has-current-submenu,#adminmenu li.current a.menu-top,#adminmenu .wp-has-current-submenu .wp-submenu .wp-submenu-head{text-shadow:0 -1px 0 #333;color:#fff;border-top-color:#808080;border-bottom-color:#6d6d6d;}.folded #adminmenu li.wp-has-current-submenu,.folded #adminmenu li.current.menu-top{border-top-color:#808080;border-bottom-color:#6d6d6d;}#adminmenu .wp-submenu a:hover{background-color:#EAF2FA!important;color:#333!important;}#adminmenu .wp-submenu li.current,#adminmenu .wp-submenu li.current a,#adminmenu .wp-submenu li.current a:hover{color:#333;}#adminmenu .wp-submenu ul{background-color:#fff;}.folded #adminmenu .wp-submenu-wrap,.folded #adminmenu .wp-submenu ul{border-color:#dfdfdf;}.folded #adminmenu .wp-submenu-wrap{-moz-box-shadow:2px 2px 5px rgba(0,0,0,0.4);-webkit-box-shadow:2px 2px 5px rgba(0,0,0,0.4);box-shadow:2px 2px 5px rgba(0,0,0,0.4);}#adminmenu .wp-submenu .wp-submenu-head{border-right-color:#dfdfdf;background-color:#ececec;}#adminmenu div.wp-submenu{background-color:transparent;}#collapse-menu{color:#aaa;}#collapse-menu:hover{color:#999;}#collapse-button{border-color:#ccc;background-color:#f4f4f4;background-image:-ms-linear-gradient(bottom,#dfdfdf,#fff);background-image:-moz-linear-gradient(bottom,#dfdfdf,#fff);background-image:-o-linear-gradient(bottom,#dfdfdf,#fff);background-image:-webkit-gradient(linear,left bottom,left top,from(#dfdfdf),to(#fff));background-image:-webkit-linear-gradient(bottom,#dfdfdf,#fff);background-image:linear-gradient(bottom,#dfdfdf,#fff);}#collapse-menu:hover #collapse-button{border-color:#aaa;}#collapse-button div{background:transparent url(../images/arrows.png) no-repeat 0 -72px;}.folded #collapse-button div{background-position:0 -108px;}#adminmenu .menu-icon-dashboard div.wp-menu-image{background:transparent url('../images/menu.png?ver=20100531') no-repeat scroll -60px -33px;}#adminmenu .menu-icon-dashboard:hover div.wp-menu-image,#adminmenu .menu-icon-dashboard.wp-has-current-submenu div.wp-menu-image,#adminmenu .menu-icon-dashboard.current div.wp-menu-image{background:transparent url('../images/menu.png?ver=20100531') no-repeat scroll -60px -1px;}#adminmenu .menu-icon-post div.wp-menu-image{background:transparent url('../images/menu.png?ver=20100531') no-repeat scroll -271px -33px;}#adminmenu .menu-icon-post:hover div.wp-menu-image,#adminmenu .menu-icon-post.wp-has-current-submenu div.wp-menu-image{background:transparent url('../images/menu.png?ver=20100531') no-repeat scroll -271px -1px;}#adminmenu .menu-icon-media div.wp-menu-image{background:transparent url('../images/menu.png?ver=20100531') no-repeat scroll -120px -33px;}#adminmenu .menu-icon-media:hover div.wp-menu-image,#adminmenu .menu-icon-media.wp-has-current-submenu div.wp-menu-image{background:transparent url('../images/menu.png?ver=20100531') no-repeat scroll -120px -1px;}#adminmenu .menu-icon-links div.wp-menu-image{background:transparent url('../images/menu.png?ver=20100531') no-repeat scroll -90px -33px;}#adminmenu .menu-icon-links:hover div.wp-menu-image,#adminmenu .menu-icon-links.wp-has-current-submenu div.wp-menu-image{background:transparent url('../images/menu.png?ver=20100531') no-repeat scroll -90px -1px;}#adminmenu .menu-icon-page div.wp-menu-image{background:transparent url('../images/menu.png?ver=20100531') no-repeat scroll -150px -33px;}#adminmenu .menu-icon-page:hover div.wp-menu-image,#adminmenu .menu-icon-page.wp-has-current-submenu div.wp-menu-image{background:transparent url('../images/menu.png?ver=20100531') no-repeat scroll -150px -1px;}#adminmenu .menu-icon-comments div.wp-menu-image{background:transparent url('../images/menu.png?ver=20100531') no-repeat scroll -30px -33px;}#adminmenu .menu-icon-comments:hover div.wp-menu-image,#adminmenu .menu-icon-comments.wp-has-current-submenu div.wp-menu-image,#adminmenu .menu-icon-comments.current div.wp-menu-image{background:transparent url('../images/menu.png?ver=20100531') no-repeat scroll -30px -1px;}#adminmenu .menu-icon-appearance div.wp-menu-image{background:transparent url('../images/menu.png?ver=20100531') no-repeat scroll 0 -33px;}#adminmenu .menu-icon-appearance:hover div.wp-menu-image,#adminmenu .menu-icon-appearance.wp-has-current-submenu div.wp-menu-image{background:transparent url('../images/menu.png?ver=20100531') no-repeat scroll 0 -1px;}#adminmenu .menu-icon-plugins div.wp-menu-image{background:transparent url('../images/menu.png?ver=20100531') no-repeat scroll -180px -33px;}#adminmenu .menu-icon-plugins:hover div.wp-menu-image,#adminmenu .menu-icon-plugins.wp-has-current-submenu div.wp-menu-image{background:transparent url('../images/menu.png?ver=20100531') no-repeat scroll -180px -1px;}#adminmenu .menu-icon-users div.wp-menu-image{background:transparent url('../images/menu.png?ver=20100531') no-repeat scroll -300px -33px;}#adminmenu .menu-icon-users:hover div.wp-menu-image,#adminmenu .menu-icon-users.wp-has-current-submenu div.wp-menu-image,#adminmenu .menu-icon-users.current div.wp-menu-image{background:transparent url('../images/menu.png?ver=20100531') no-repeat scroll -300px -1px;}#adminmenu .menu-icon-tools div.wp-menu-image{background:transparent url('../images/menu.png?ver=20100531') no-repeat scroll -210px -33px;}#adminmenu .menu-icon-tools:hover div.wp-menu-image,#adminmenu .menu-icon-tools.wp-has-current-submenu div.wp-menu-image,#adminmenu .menu-icon-tools.current div.wp-menu-image{background:transparent url('../images/menu.png?ver=20100531') no-repeat scroll -210px -1px;}#icon-options-general,#adminmenu .menu-icon-settings div.wp-menu-image{background:transparent url('../images/menu.png?ver=20100531') no-repeat scroll -240px -33px;}#adminmenu .menu-icon-settings:hover div.wp-menu-image,#adminmenu .menu-icon-settings.wp-has-current-submenu div.wp-menu-image{background:transparent url('../images/menu.png?ver=20100531') no-repeat scroll -240px -1px;}#adminmenu .menu-icon-site div.wp-menu-image{background:transparent url('../images/menu.png?ver=20100531') no-repeat scroll -360px -33px;}#adminmenu .menu-icon-site:hover div.wp-menu-image,#adminmenu .menu-icon-site.wp-has-current-submenu div.wp-menu-image{background:transparent url('../images/menu.png?ver=20100531') no-repeat scroll -360px -1px;}#icon-edit,#icon-post{background:transparent url(../images/icons32.png?ver=20100531) no-repeat -552px -5px;}#icon-index{background:transparent url(../images/icons32.png?ver=20100531) no-repeat -137px -5px;}#icon-upload{background:transparent url(../images/icons32.png?ver=20100531) no-repeat -251px -5px;}#icon-link-manager,#icon-link,#icon-link-category{background:transparent url(../images/icons32.png?ver=20100531) no-repeat -190px -5px;}#icon-edit-pages,#icon-page{background:transparent url(../images/icons32.png?ver=20100531) no-repeat -312px -5px;}#icon-edit-comments{background:transparent url(../images/icons32.png?ver=20100531) no-repeat -72px -5px;}#icon-themes{background:transparent url(../images/icons32.png?ver=20100531) no-repeat -11px -5px;}#icon-plugins{background:transparent url(../images/icons32.png?ver=20100531) no-repeat -370px -5px;}#icon-users,#icon-profile,#icon-user-edit{background:transparent url(../images/icons32.png?ver=20100531) no-repeat -600px -5px;}#icon-tools,#icon-admin{background:transparent url(../images/icons32.png?ver=20100531) no-repeat -432px -5px;}#icon-options-general{background:transparent url(../images/icons32.png?ver=20100531) no-repeat -492px -5px;}#icon-ms-admin{background:transparent url(../images/icons32.png?ver=20100531) no-repeat -659px -5px;}table.diff .diff-deletedline{background-color:#fdd;}table.diff .diff-deletedline del{background-color:#f99;}table.diff .diff-addedline{background-color:#dfd;}table.diff .diff-addedline ins{background-color:#9f9;}#att-info{background-color:#E4F2FD;}#sidemenu a{background-color:#f9f9f9;border-color:#f9f9f9;border-bottom-color:#dfdfdf;}#sidemenu a.current{background-color:#fff;border-color:#dfdfdf #dfdfdf #fff;color:#D54E21;}#screen-options-wrap,#contextual-help-wrap{background-color:#f1f1f1;border-color:#dfdfdf;}#screen-options-link-wrap,#contextual-help-link-wrap{background-color:#e3e3e3;border-right:1px solid transparent;border-left:1px solid transparent;border-bottom:1px solid transparent;background-image:-ms-linear-gradient(bottom,#dfdfdf,#f1f1f1);background-image:-moz-linear-gradient(bottom,#dfdfdf,#f1f1f1);background-image:-o-linear-gradient(bottom,#dfdfdf,#f1f1f1);background-image:-webkit-gradient(linear,left bottom,left top,from(#dfdfdf),to(#f1f1f1));background-image:-webkit-linear-gradient(bottom,#dfdfdf,#f1f1f1);background-image:linear-gradient(bottom,#dfdfdf,#f1f1f1);}#screen-meta-links a.show-settings{color:#777;}#screen-meta-links a.show-settings:hover{color:#000;}#replysubmit{background-color:#f1f1f1;border-top-color:#ddd;}#replyerror{border-color:#ddd;background-color:#f9f9f9;}#edithead,#replyhead{background-color:#f1f1f1;}#ed_reply_toolbar{background-color:#e9e9e9;}.vim-current,.vim-current th,.vim-current td{background-color:#E4F2FD!important;}.star-average,.star.star-rating{background-color:#fc0;}div.star.select:hover{background-color:#d00;}div.star img{border-left:1px solid #fff;border-right:1px solid #fff;}.widefat div.star img{border-left:1px solid #f9f9f9;border-right:1px solid #f9f9f9;}#plugin-information .fyi ul{background-color:#eaf3fa;}#plugin-information .fyi h2.mainheader{background-color:#cee1ef;}#plugin-information pre,#plugin-information code{background-color:#ededff;}#plugin-information pre{border:1px solid #ccc;}.inline-edit-row fieldset input[type="text"],.inline-edit-row fieldset textarea,#bulk-titles,#replyrow input{border-color:#ddd;}.inline-editor div.title{background-color:#EAF3FA;}.inline-editor ul.cat-checklist{background-color:#fff;border-color:#ddd;}.inline-editor .categories .catshow,.inline-editor .categories .cathide{color:#21759b;}.inline-editor .quick-edit-save{background-color:#f1f1f1;}#replyrow #ed_reply_toolbar input:hover{border-color:#aaa;background:#ddd;}fieldset.inline-edit-col-right .inline-edit-col{border-color:#dfdfdf;}.attention{color:#D54E21;}.meta-box-sortables .postbox:hover .handlediv{background:transparent url(../images/arrows.png) no-repeat 6px 7px;}.tablenav .tablenav-pages{color:#555;}.tablenav .tablenav-pages a{border-color:#e3e3e3;background:#eee url('../images/menu-bits.gif?ver=20100610') repeat-x scroll left -379px;}.tablenav .tablenav-pages a:hover,.tablenav .tablenav-pages a:focus{color:#d54e21;}.tablenav .tablenav-pages a.disabled,.tablenav .tablenav-pages a.disabled:hover,.tablenav .tablenav-pages a.disabled:focus{color:#aaa;}.tablenav .tablenav-pages .current{background:#dfdfdf;border-color:#d3d3d3;}#availablethemes,#availablethemes td{border-color:#ddd;}#current-theme img{border-color:#999;}#TB_window #TB_title a.tb-theme-preview-link,#TB_window #TB_title a.tb-theme-preview-link:visited{color:#999;}#TB_window #TB_title a.tb-theme-preview-link:hover,#TB_window #TB_title a.tb-theme-preview-link:focus{color:#ccc;}.misc-pub-section{border-top-color:#fff;border-bottom-color:#dfdfdf;}#minor-publishing{border-bottom-color:#dfdfdf;}#post-body .misc-pub-section{border-right-color:#eee;}.post-com-count span{background-color:#bbb;}.form-table .color-palette td{border-color:#fff;}.sortable-placeholder{border-color:#bbb;background-color:#f5f5f5;}#post-body ul.category-tabs li.tabs a,#post-body ul.add-menu-item-tabs li.tabs a,body.press-this ul.category-tabs li.tabs a{color:#333;}#wp_editimgbtn,#wp_delimgbtn,#wp_editgallery,#wp_delgallery{border-color:#999;background-color:#eee;}#wp_editimgbtn:hover,#wp_delimgbtn:hover,#wp_editgallery:hover,#wp_delgallery:hover{border-color:#555;background-color:#ccc;}#favorite-first{border-color:#c0c0c0;background:#f1f1f1;background:-moz-linear-gradient(bottom,#e7e7e7,#fff);background:-webkit-gradient(linear,left bottom,left top,from(#e7e7e7),to(#fff));}#favorite-inside{border-color:#c0c0c0;background-color:#fff;}#favorite-toggle{background:transparent url(../images/arrows.png) no-repeat 4px 2px;border-color:#dfdfdf;-moz-box-shadow:inset 1px 0 0 #fff;-webkit-box-shadow:inset 1px 0 0 #fff;box-shadow:inset 1px 0 0 #fff;}#favorite-actions a{color:#464646;}#favorite-actions a:hover{color:#000;}#favorite-inside a:hover{text-decoration:underline;}#screen-meta a.show-settings,.toggle-arrow{background:transparent url(../images/arrows.png) no-repeat right 3px;}#screen-meta .screen-meta-active a.show-settings{background:transparent url(../images/arrows.png) no-repeat right -33px;}.view-switch #view-switch-list{background:transparent url(../images/list.png) no-repeat 0 0;}.view-switch .current #view-switch-list{background:transparent url(../images/list.png) no-repeat -40px 0;}.view-switch #view-switch-excerpt{background:transparent url(../images/list.png) no-repeat -20px 0;}.view-switch .current #view-switch-excerpt{background:transparent url(../images/list.png) no-repeat -60px 0;}#header-logo{background:transparent url(../images/wp-logo.png?ver=20110504) no-repeat scroll center center;}.popular-tags,.feature-filter{background-color:#fff;border-color:#DFDFDF;}#theme-information .action-button{border-top-color:#DFDFDF;}.theme-listing br.line{border-bottom-color:#ccc;}div.widgets-sortables,#widgets-left .inactive{background-color:#fcfcfc;border-color:#dfdfdf;}#available-widgets .widget-holder{background-color:#fcfcfc;border-color:#dfdfdf;}#available-widgets .widget-description{color:#555;}.sidebar-name{color:#464646;text-shadow:#fff 0 1px 0;border-color:#dfdfdf;-moz-box-shadow:inset 0 1px 0 #fff;-webkit-box-shadow:inset 0 1px 0 #fff;box-shadow:inset 0 1px 0 #fff;}.sidebar-name:hover,#removing-widget{color:#d54e21;}#removing-widget span{color:black;}.sidebar-name-arrow{background:transparent url(../images/arrows.png) no-repeat 5px 9px;}.sidebar-name:hover .sidebar-name-arrow{background:transparent url(../images/arrows-dark.png) no-repeat 5px 9px;}.in-widget-title{color:#606060;}.deleting .widget-title *{color:#aaa;}.imgedit-menu div{border-color:#d5d5d5;background-color:#f1f1f1;}.imgedit-menu div:hover{border-color:#c1c1c1;background-color:#eaeaea;}.imgedit-menu div.disabled{border-color:#ccc;background-color:#ddd;filter:alpha(opacity=50);opacity:.5;}#dashboard_recent_comments div.undo{border-top-color:#dfdfdf;}.comment-ays,.comment-ays th{border-color:#ddd;}.comment-ays th{background-color:#f1f1f1;}#menu-management .menu-edit{border-color:#dfdfdf;}#post-body{background:#fff;border-top-color:#fff;border-bottom-color:#dfdfdf;}#nav-menu-header{border-bottom-color:#dfdfdf;}#nav-menu-footer{border-top-color:#fff;}#menu-management .nav-tabs-arrow a{color:#C1C1C1;}#menu-management .nav-tabs-arrow a:hover{color:#D54E21;}#menu-management .nav-tabs-arrow a:active{color:#464646;}#menu-management .nav-tab-active{border-color:#dfdfdf;}#menu-management .nav-tab{background:#fbfbfb;border-color:#dfdfdf;}.js .input-with-default-title{color:#aaa;}#cancel-save{color:#f00;}#cancel-save:hover{background-color:#F00;color:#fff;}.list-container{border-color:#DFDFDF;}.menu-item-handle{border-color:#dfdfdf;}.menu li.deleting .menu-item-handle{background-color:#f66;text-shadow:#ccc;}.item-type{color:#999;}.item-controls .menu-item-delete:hover{color:#f00;}.item-edit{background:transparent url(../images/arrows.png) no-repeat 8px 10px;border-bottom-color:#eee;}.item-edit:hover{background:transparent url(../images/arrows-dark.png) no-repeat 8px 10px;}.menu-item-settings{border-color:#dfdfdf;}.link-to-original{color:#777;border-color:#dfdfdf;}#cancel-save:hover{color:#fff!important;}#update-menu-item{color:#fff!important;}#update-menu-item:hover,#update-menu-item:active,#update-menu-item:focus{color:#eaf2fa!important;border-color:#13455b!important;}.submitbox .submitcancel{color:#21759B;border-bottom-color:#21759B;}.submitbox .submitcancel:hover{background:#21759B;color:#fff;}#menu-management .nav-tab-active,.menu-item-handle,.menu-item-settings{-moz-box-shadow:inset 0 1px 0 #fff;-webkit-box-shadow:inset 0 1px 0 #fff;box-shadow:inset 0 1px 0 #fff;}#menu-management .nav-tab-active{background:#f9f9f9;border-bottom-color:#f9f9f9;}#upload-form label{color:#777;}.fullscreen-overlay{background:#fff;}.wp-fullscreen-focus #wp-fullscreen-title,.wp-fullscreen-focus #wp-fullscreen-container{border-color:#ccc;}#fullscreen-topbar{border-bottom-color:#DFDFDF;}ack-2.12/t/swamp/perl-test.t0000644000076400007640000000024312217205406014350 0ustar andyandy#!perl -T use warnings; use strict; use Test::More tests => 1; BEGIN { use_ok( 'App::Ack' ); } diag( "Testing App::Ack $App::Ack::VERSION, Perl $], $^X" ); ack-2.12/t/swamp/perl.handler.pod0000644000076400007640000000002712217205411015322 0ustar andyandy=head1 I'm Here! =cut ack-2.12/t/swamp/CMakeLists.txt0000644000076400007640000000003512215743470015011 0ustar andyandy# Not actually a cmake file! ack-2.12/t/swamp/Sample.asmx0000644000076400007640000000017712215743470014373 0ustar andyandy<%@ WebService Language="C#" Class="Sample" %> using System; using System.Web.Services; public class Sample : WebService { } ack-2.12/t/swamp/crystallography-weenies.f0000644000076400007640000000052312215743470017306 0ustar andyandy PROGRAM FORMAT IMPLICIT NONE REAL :: X CHARACTER (LEN=11) :: FORM1 CHARACTER (LEN=*), PARAMETER :: FORM2 = "( F12.3,A )" FORM1 = "( F12.3,A )" X = 12.0 PRINT FORM1, X, ' HELLO ' WRITE (*, FORM2) 2*X, ' HI ' WRITE (*, "(F12.3,A )") 3*X, ' HI HI ' END ack-2.12/t/swamp/javascript.js0000644000076400007640000000016612215743470014762 0ustar andyandy// JavaScript goodness // Files and directory structures var cssDir = "./Stylesheets/"; var NS4CSS = "wango.css"; ack-2.12/t/swamp/file.bar0000644000076400007640000000002412215743470013654 0ustar andyandyThis is a bar file. ack-2.12/t/swamp/pipe-stress-freaks.F0000644000076400007640000000052312215743470016111 0ustar andyandy PROGRAM FORMAT IMPLICIT NONE REAL :: X CHARACTER (LEN=11) :: FORM1 CHARACTER (LEN=*), PARAMETER :: FORM2 = "( F12.3,A )" FORM1 = "( F12.3,A )" X = 12.0 PRINT FORM1, X, ' HELLO ' WRITE (*, FORM2) 2*X, ' HI ' WRITE (*, "(F12.3,A )") 3*X, ' HI HI ' END ack-2.12/t/swamp/MasterPage.master0000644000076400007640000000012312215743470015514 0ustar andyandy<%@ Master AutoEventWireup="true" CodeFile="MasterPage.master.cs" Language="C#" %> ack-2.12/t/swamp/sample.rake0000644000076400007640000000017312215743470014401 0ustar andyandytask :ruby_env do RUBY_APP = if RUBY_PLATFORM =~ /java/ "jruby" else "ruby" end unless defined? RUBY_APP end ack-2.12/t/swamp/fresh.css.min0000644000076400007640000011534012215743470014662 0ustar andyandyhtml,.wp-dialog{background-color:#fff;}* html input,* html .widget{border-color:#dfdfdf;}textarea,input[type="text"],input[type="password"],input[type="file"],input[type="button"],input[type="submit"],input[type="reset"],select{border-color:#dfdfdf;background-color:#fff;}kbd,code{background:#eaeaea;}input[readonly]{background-color:#eee;}.find-box-search{border-color:#dfdfdf;background-color:#f1f1f1;}.find-box{background-color:#f1f1f1;}.find-box-inside{background-color:#fff;}a.page-numbers:hover{border-color:#999;}body,#wpbody,.form-table .pre{color:#333;}body>#upload-menu{border-bottom-color:#fff;}#postcustomstuff table,#your-profile fieldset,#rightnow,div.dashboard-widget,#dashboard-widgets p.dashboard-widget-links,#replyrow #ed_reply_toolbar input{border-color:#ccc;}#poststuff .inside label.spam,#poststuff .inside label.deleted{color:red;}#poststuff .inside label.waiting{color:orange;}#poststuff .inside label.approved{color:green;}#postcustomstuff table{border-color:#dfdfdf;background-color:#F9F9F9;}#postcustomstuff thead th{background-color:#F1F1F1;}#postcustomstuff table input,#postcustomstuff table textarea{border-color:#dfdfdf;background-color:#fff;}.widefat{border-color:#dfdfdf;background-color:#f9f9f9;}div.dashboard-widget-error{background-color:#c43;}div.dashboard-widget-notice{background-color:#cfe1ef;}div.dashboard-widget-submit{border-top-color:#ccc;}div.tabs-panel,.wp-tab-panel,ul.category-tabs li.tabs,ul.add-menu-item-tabs li.tabs,.wp-tab-active{border-color:#dfdfdf;background-color:#fff;}ul.category-tabs li.tabs,ul.add-menu-item-tabs li.tabs,.wp-tab-active{background-color:#fff;}input.disabled,textarea.disabled{background-color:#ccc;}#plugin-information .action-button a,#plugin-information .action-button a:hover,#plugin-information .action-button a:visited{color:#fff;}.widget .widget-top,.postbox h3,.stuffbox h3,.widefat thead tr th,.widefat tfoot tr th,h3.dashboard-widget-title,h3.dashboard-widget-title span,h3.dashboard-widget-title small,.find-box-head,.sidebar-name,#nav-menu-header,#nav-menu-footer,.menu-item-handle,#fullscreen-topbar{background-color:#f1f1f1;background-image:-ms-linear-gradient(top,#f9f9f9,#ececec);background-image:-moz-linear-gradient(top,#f9f9f9,#ececec);background-image:-o-linear-gradient(top,#f9f9f9,#ececec);background-image:-webkit-gradient(linear,left top,left bottom,from(#f9f9f9),to(#ececec));background-image:-webkit-linear-gradient(top,#f9f9f9,#ececec);background-image:linear-gradient(top,#f9f9f9,#ececec);}.widget .widget-top,.postbox h3,.stuffbox h3{border-bottom-color:#dfdfdf;text-shadow:#fff 0 1px 0;-moz-box-shadow:0 1px 0 #fff;-webkit-box-shadow:0 1px 0 #fff;box-shadow:0 1px 0 #fff;}.form-table th,.form-wrap label{color:#222;text-shadow:#fff 0 1px 0;}.description,.form-wrap p{color:#666;}strong .post-com-count span{background-color:#21759b;}.sorthelper{background-color:#ccf3fa;}.ac_match,.subsubsub a.current{color:#000;}.wrap h2{color:#464646;}.wrap .add-new-h2{background:#f1f1f1;}.subtitle{color:#777;}.ac_over{background-color:#f0f0b8;}.ac_results{background-color:#fff;border-color:#808080;}.ac_results li{color:#101010;}.alternate,.alt{background-color:#fcfcfc;}.available-theme a.screenshot{background-color:#f1f1f1;border-color:#ddd;}.bar{background-color:#e8e8e8;border-right-color:#99d;}#media-upload,#media-upload .media-item .slidetoggle{background:#fff;}#media-upload .slidetoggle{border-top-color:#dfdfdf;}div.error,.login #login_error{background-color:#ffebe8;border-color:#c00;}div.error a{color:#c00;}.form-invalid{background-color:#ffebe8!important;}.form-invalid input,.form-invalid select{border-color:#c00!important;}.submit{border-color:#DFDFDF;}.highlight{background-color:#e4f2fd;color:#000;}.howto,.nonessential,#edit-slug-box,.form-input-tip,.subsubsub{color:#666;}.media-item{border-bottom-color:#dfdfdf;}#wpbody-content #media-items .describe{border-top-color:#dfdfdf;}.media-upload-form label.form-help,td.help{color:#9a9a9a;}.post-com-count{background-image:url(../images/bubble_bg.gif);color:#fff;}.post-com-count span{background-color:#bbb;color:#fff;}.post-com-count:hover span{background-color:#d54e21;}.quicktags,.search{background-color:#ccc;color:#000;}.side-info h5{border-bottom-color:#dadada;}.side-info ul{color:#666;}.button,.button-secondary,.submit input,input[type=button],input[type=submit]{border-color:#bbb;color:#464646;}.button:hover,.button-secondary:hover,.submit input:hover,input[type=button]:hover,input[type=submit]:hover{color:#000;border-color:#666;}.button,.submit input,.button-secondary{background:#f2f2f2 url(../images/white-grad.png) repeat-x scroll left top;text-shadow:rgba(255,255,255,1) 0 1px 0;}.button:active,.submit input:active,.button-secondary:active{background:#eee url(../images/white-grad-active.png) repeat-x scroll left top;}input.button-primary,button.button-primary,a.button-primary{border-color:#298cba;font-weight:bold;color:#fff;background:#21759B url(../images/button-grad.png) repeat-x scroll left top;text-shadow:rgba(0,0,0,0.3) 0 -1px 0;}input.button-primary:active,button.button-primary:active,a.button-primary:active{background:#21759b url(../images/button-grad-active.png) repeat-x scroll left top;color:#eaf2fa;}input.button-primary:hover,button.button-primary:hover,a.button-primary:hover,a.button-primary:focus,a.button-primary:active{border-color:#13455b;color:#eaf2fa;}.button-disabled,.button[disabled],.button:disabled,.button-secondary[disabled],.button-secondary:disabled,a.button.disabled{color:#aaa!important;border-color:#ddd!important;}.button-primary-disabled,.button-primary[disabled],.button-primary:disabled{color:#9FD0D5!important;background:#298CBA!important;}a:hover,a:active,a:focus{color:#d54e21;}#wphead #viewsite a:hover,#adminmenu a:hover,#adminmenu ul.wp-submenu a:hover,#the-comment-list .comment a:hover,#rightnow a:hover,#media-upload a.del-link:hover,div.dashboard-widget-submit input:hover,.subsubsub a:hover,.subsubsub a.current:hover,.ui-tabs-nav a:hover,.plugins .inactive a:hover,#all-plugins-table .plugins .inactive a:hover,#search-plugins-table .plugins .inactive a:hover{color:#d54e21;}#the-comment-list .comment-item,#dashboard-widgets #dashboard_quick_press form p.submit{border-color:#dfdfdf;}#side-sortables .category-tabs .tabs a,#side-sortables .add-menu-item-tabs .tabs a,.wp-tab-bar .wp-tab-active a{color:#333;}#rightnow .rbutton{background-color:#ebebeb;color:#264761;}.submitbox .submit{background-color:#464646;color:#ccc;}.plugins a.delete:hover,#all-plugins-table .plugins a.delete:hover,#search-plugins-table .plugins a.delete:hover,.submitbox .submitdelete{color:#f00;border-bottom-color:#f00;}.submitbox .submitdelete:hover,#media-items a.delete:hover{color:#fff;background-color:#f00;border-bottom-color:#f00;}#normal-sortables .submitbox .submitdelete:hover{color:#000;background-color:#f00;border-bottom-color:#f00;}.tablenav .dots{border-color:transparent;}.tablenav .next,.tablenav .prev{border-color:transparent;color:#21759b;}.tablenav .next:hover,.tablenav .prev:hover{border-color:transparent;color:#d54e21;}div.updated,.login .message{background-color:#ffffe0;border-color:#e6db55;}.update-message{color:#000;}a.page-numbers{border-bottom-color:#B8D3E2;}.commentlist li{border-bottom-color:#ccc;}.widefat td,.widefat th{border-top-color:#fff;border-bottom-color:#dfdfdf;}.widefat th{text-shadow:rgba(255,255,255,0.8) 0 1px 0;}.widefat td{color:#555;}.widefat p,.widefat ol,.widefat ul{color:#333;}.widefat thead tr th,.widefat tfoot tr th,h3.dashboard-widget-title,h3.dashboard-widget-title span,h3.dashboard-widget-title small,.find-box-head{color:#333;}th.sortable a:hover,th.sortable a:active,th.sortable a:focus{color:#333;}h3.dashboard-widget-title small a{color:#d7d7d7;}h3.dashboard-widget-title small a:hover{color:#fff;}a,#adminmenu a,#poststuff #edButtonPreview,#poststuff #edButtonHTML,#the-comment-list p.comment-author strong a,#media-upload a.del-link,#media-items a.delete,.plugins a.delete,.ui-tabs-nav a{color:#21759b;}#adminmenu .awaiting-mod,#adminmenu .update-plugins,#sidemenu a .update-plugins,#rightnow .reallynow{background-color:#464646;color:#fff;-moz-box-shadow:rgba(255,255,255,0.5) 0 1px 0;-khtml-box-shadow:rgba(255,255,255,0.5) 0 1px 0;-webkit-box-shadow:rgba(255,255,255,0.5) 0 1px 0;box-shadow:rgba(255,255,255,0.5) 0 1px 0;}#plugin-information .action-button{background-color:#d54e21;color:#fff;}#adminmenu li.current a .awaiting-mod,#adminmenu li a.wp-has-current-submenu .update-plugins{background-color:#464646;color:#fff;-moz-box-shadow:rgba(255,255,255,0.5) 0 1px 0;-khtml-box-shadow:rgba(255,255,255,0.5) 0 1px 0;-webkit-box-shadow:rgba(255,255,255,0.5) 0 1px 0;box-shadow:rgba(255,255,255,0.5) 0 1px 0;}div#media-upload-header,div#plugin-information-header{background-color:#f9f9f9;border-bottom-color:#dfdfdf;}#currenttheme img{border-color:#666;}#dashboard_secondary div.dashboard-widget-content ul li a{background-color:#f9f9f9;}input.readonly,textarea.readonly{background-color:#ddd;}#ed_toolbar input,#ed_reply_toolbar input{background:#fff url("../images/fade-butt.png") repeat-x 0 -2px;}#editable-post-name{background-color:#fffbcc;}#edit-slug-box strong,.tablenav .displaying-num,#submitted-on,.submitted-on{color:#777;}.login #nav a,.login #backtoblog a{color:#21759b!important;}.login #nav a:hover,.login #backtoblog a:hover{color:#d54e21!important;}#footer{color:#777;border-color:#dfdfdf;}#media-items,.imgedit-group{border-color:#dfdfdf;}.checkbox,.side-info,.plugins tr,#your-profile #rich_editing{background-color:#fcfcfc;}.plugins .inactive,.plugins .inactive th,.plugins .inactive td,tr.inactive+tr.plugin-update-tr .plugin-update{background-color:#f4f4f4;}.plugin-update-tr .update-message{background-color:#fffbe4;border-color:#dfdfdf;}.plugins .active,.plugins .active th,.plugins .active td{color:#000;}.plugins .inactive a{color:#579;}#the-comment-list tr.undo,#the-comment-list div.undo{background-color:#f4f4f4;}#the-comment-list .unapproved{background-color:#ffffe0;}#the-comment-list .approve a{color:#006505;}#the-comment-list .unapprove a{color:#d98500;}table.widefat span.delete a,table.widefat span.trash a,table.widefat span.spam a,#dashboard_recent_comments .delete a,#dashboard_recent_comments .trash a,#dashboard_recent_comments .spam a{color:#bc0b0b;}.widget,#widget-list .widget-top,.postbox,#titlediv,#poststuff .postarea,.stuffbox{border-color:#dfdfdf;-moz-box-shadow:inset 0 1px 0 #fff;-webkit-box-shadow:inset 0 1px 0 #fff;box-shadow:inset 0 1px 0 #fff;-moz-border-radius:3px;-khtml-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;}.widget,#widget-list .widget-top,.postbox,.menu-item-settings{background-color:#f5f5f5;background-image:-ms-linear-gradient(top,#f9f9f9,#f5f5f5);background-image:-moz-linear-gradient(top,#f9f9f9,#f5f5f5);background-image:-o-linear-gradient(top,#f9f9f9,#f5f5f5);background-image:-webkit-gradient(linear,left top,left bottom,from(#f9f9f9),to(#f5f5f5));background-image:-webkit-linear-gradient(top,#f9f9f9,#f5f5f5);background-image:linear-gradient(top,#f9f9f9,#f5f5f5);}.postbox h3{color:#464646;}.widget .widget-top{color:#222;}.sidebar-name:hover h3,.postbox h3:hover{color:#000;}.curtime #timestamp{background-image:url(../images/date-button.gif);}#quicktags #ed_link{color:#00f;}#rightnow .youhave{background-color:#f0f6fb;}#rightnow a{color:#448abd;}.tagchecklist span a,#bulk-titles div a{background:url(../images/xit.gif) no-repeat;}.tagchecklist span a:hover,#bulk-titles div a:hover{background:url(../images/xit.gif) no-repeat -10px 0;}#update-nag,.update-nag{background-color:#FFFBCC;border-color:#E6DB55;color:#555;}.login #backtoblog a{color:#464646;}#wphead{border-bottom:#dfdfdf 1px solid;}#wphead h1 a{color:#464646;}#user_info{color:#555;}#user_info:hover,#user_info.active{color:#222;}#user_info.active{background-color:#f1f1f1;background-image:-ms-linear-gradient(bottom,#e9e9e9,#f9f9f9);background-image:-moz-linear-gradient(bottom,#e9e9e9,#f9f9f9);background-image:-o-linear-gradient(bottom,#e9e9e9,#f9f9f9);background-image:-webkit-gradient(linear,left bottom,left top,from(#e9e9e9),to(#f9f9f9));background-image:-webkit-linear-gradient(bottom,#e9e9e9,#f9f9f9);background-image:linear-gradient(bottom,#e9e9e9,#f9f9f9);border-color:#aaa #aaa #dfdfdf;}#user_info_arrow{background:transparent url(../images/arrows.png) no-repeat 6px 5px;}#user_info:hover #user_info_arrow,#user_info.active #user_info_arrow{background:transparent url(../images/arrows-dark.png) no-repeat 6px 5px;}#user_info_links{-moz-box-shadow:0 3px 2px -2px rgba(0,0,0,0.2);-webkit-box-shadow:0 3px 2px -2px rgba(0,0,0,0.2);box-shadow:0 3px 2px -2px rgba(0,0,0,0.2);}#user_info_links ul{background:#f1f1f1;border-color:#ccc #aaa #aaa;-moz-box-shadow:inset 0 1px 0 #f9f9f9;-webkit-box-shadow:inset 0 1px 0 #f9f9f9;box-shadow:inset 0 1px 0 #f9f9f9;}#user_info_links li:hover{background-color:#dfdfdf;}#user_info_links li:hover a,#user_info_links li a:hover{text-decoration:none;}#user_info a:link,#user_info a:visited,#footer a:link,#footer a:visited{text-decoration:none;}#footer a:hover{color:#000;text-decoration:underline;}div#media-upload-error,.file-error,abbr.required,.widget-control-remove:hover,table.widefat .delete a:hover,table.widefat .trash a:hover,table.widefat .spam a:hover,#dashboard_recent_comments .delete a:hover,#dashboard_recent_comments .trash a:hover #dashboard_recent_comments .spam a:hover{color:#f00;}#pass-strength-result{background-color:#eee;border-color:#ddd!important;}#pass-strength-result.bad{background-color:#ffb78c;border-color:#ff853c!important;}#pass-strength-result.good{background-color:#ffec8b;border-color:#fc0!important;}#pass-strength-result.short{background-color:#ffa0a0;border-color:#f04040!important;}#pass-strength-result.strong{background-color:#c3ff88;border-color:#8dff1c!important;}#quicktags{border-color:#ccc;background-color:#dfdfdf;background-image:url("../images/ed-bg.gif");}#ed_toolbar input{border-color:#C3C3C3;}#ed_toolbar input:hover{border-color:#aaa;background:#ddd;}#poststuff .wp_themeSkin .mceStatusbar{border-color:#dfdfdf;}#poststuff .wp_themeSkin .mceStatusbar *{color:#555;}#poststuff #edButtonPreview,#poststuff #edButtonHTML{background-color:#f1f1f1;border-color:#dfdfdf #dfdfdf #ccc;color:#999;}#poststuff #editor-toolbar .active{border-color:#ccc #ccc #e9e9e9;background-color:#e9e9e9;color:#333;}#post-status-info{background-color:#EDEDED;}.wp_themeSkin *,.wp_themeSkin a:hover,.wp_themeSkin a:link,.wp_themeSkin a:visited,.wp_themeSkin a:active{color:#000;}.wp_themeSkin table.mceLayout{border-color:#ccc #ccc #dfdfdf;}#editorcontainer #content,#editorcontainer .wp_themeSkin .mceIframeContainer{-moz-box-shadow:inset 1px 1px 2px rgba(0,0,0,0.1);-webkit-box-shadow:inset 1px 1px 2px rgba(0,0,0,0.1);box-shadow:inset 1px 1px 2px rgba(0,0,0,0.1);}.wp_themeSkin iframe{background:transparent;}.wp_themeSkin .mceStatusbar{color:#000;background-color:#f5f5f5;}.wp_themeSkin .mceButton{border-color:#ccc;background-color:#eee;background-image:-ms-linear-gradient(bottom,#ddd,#fff);background-image:-moz-linear-gradient(bottom,#ddd,#fff);background-image:-o-linear-gradient(bottom,#ddd,#fff);background-image:-webkit-gradient(linear,left bottom,left top,from(#ddd),to(#fff));background-image:-webkit-linear-gradient(bottom,#ddd,#fff);background-image:linear-gradient(bottom,#ddd,#fff);}.wp_themeSkin a.mceButtonEnabled:hover{border-color:#a0a0a0;background:#ddd;background-image:-ms-linear-gradient(bottom,#ccc,#fff);background-image:-moz-linear-gradient(bottom,#ccc,#fff);background-image:-o-linear-gradient(bottom,#ccc,#fff);background-image:-webkit-gradient(linear,left bottom,left top,from(#ccc),to(#fff));background-image:-webkit-linear-gradient(bottom,#ccc,#fff);background-image:linear-gradient(bottom,#ccc,#fff);}.wp_themeSkin a.mceButton:active,.wp_themeSkin a.mceButtonEnabled:active,.wp_themeSkin a.mceButtonSelected:active,.wp_themeSkin a.mceButtonActive,.wp_themeSkin a.mceButtonActive:active,.wp_themeSkin a.mceButtonActive:hover{background-color:#ddd;background-image:-ms-linear-gradient(bottom,#eee,#bbb);background-image:-moz-linear-gradient(bottom,#eee,#bbb);background-image:-o-linear-gradient(bottom,#eee,#bbb);background-image:-webkit-gradient(linear,left bottom,left top,from(#eee),to(#bbb));background-image:-webkit-linear-gradient(bottom,#eee,#bbb);background-image:linear-gradient(bottom,#eee,#bbb);border-color:#909090;}.wp_themeSkin .mceButtonDisabled{border-color:#ccc!important;}.wp_themeSkin .mceListBox .mceText,.wp_themeSkin .mceListBox .mceOpen{border-color:#ccc;background-color:#eee;background-image:-ms-linear-gradient(bottom,#ddd,#fff);background-image:-moz-linear-gradient(bottom,#ddd,#fff);background-image:-o-linear-gradient(bottom,#ddd,#fff);background-image:-webkit-gradient(linear,left bottom,left top,from(#ddd),to(#fff));background-image:-webkit-linear-gradient(bottom,#ddd,#fff);background-image:linear-gradient(bottom,#ddd,#fff);}.wp_themeSkin .mceListBox .mceOpen{border-left:0!important;}.wp_themeSkin table.mceListBoxEnabled:hover .mceOpen,.wp_themeSkin .mceListBoxHover .mceOpen,.wp_themeSkin .mceListBoxHover:active .mceOpen,.wp_themeSkin .mceListBoxSelected .mceOpen,.wp_themeSkin .mceListBoxSelected .mceText,.wp_themeSkin table.mceListBoxEnabled:active .mceText{background:#ccc;border-color:#999;}.wp_themeSkin table.mceListBoxEnabled:hover .mceText,.wp_themeSkin .mceListBoxHover .mceText,.wp_themeSkin table.mceListBoxEnabled:hover .mceOpen,.wp_themeSkin .mceListBoxHover .mceOpen{border-color:#909090;background-color:#eee;background-image:-ms-linear-gradient(bottom,#ccc,#fff);background-image:-moz-linear-gradient(bottom,#ccc,#fff);background-image:-o-linear-gradient(bottom,#ccc,#fff);background-image:-webkit-gradient(linear,left bottom,left top,from(#ccc),to(#fff));background-image:-webkit-linear-gradient(bottom,#ccc,#fff);background-image:linear-gradient(bottom,#ccc,#fff);}.wp_themeSkin select.mceListBox{border-color:#B2B2B2;background-color:#fff;}.wp_themeSkin .mceSplitButton a.mceAction,.wp_themeSkin .mceSplitButton a.mceOpen{border-color:#ccc;}.wp_themeSkin .mceSplitButton a.mceOpen:hover,.wp_themeSkin .mceSplitButtonSelected a.mceOpen,.wp_themeSkin table.mceSplitButtonEnabled:hover a.mceAction,.wp_themeSkin .mceSplitButton a.mceAction:hover{border-color:#909090;}.wp_themeSkin table.mceSplitButton td{background-color:#eee;background-image:-ms-linear-gradient(bottom,#ddd,#fff);background-image:-moz-linear-gradient(bottom,#ddd,#fff);background-image:-o-linear-gradient(bottom,#ddd,#fff);background-image:-webkit-gradient(linear,left bottom,left top,from(#ddd),to(#fff));background-image:-webkit-linear-gradient(bottom,#ddd,#fff);background-image:linear-gradient(bottom,#ddd,#fff);}.wp_themeSkin table.mceSplitButton:hover td{background-image:-ms-linear-gradient(bottom,#ccc,#fff);background-image:-moz-linear-gradient(bottom,#ccc,#fff);background-image:-o-linear-gradient(bottom,#ccc,#fff);background-image:-webkit-gradient(linear,left bottom,left top,from(#ccc),to(#fff));background-image:-webkit-linear-gradient(bottom,#ccc,#fff);background-image:linear-gradient(bottom,#ccc,#fff);}.wp_themeSkin .mceSplitButtonActive{background-color:#B2B2B2;}.wp_themeSkin div.mceColorSplitMenu table{background-color:#ebebeb;border-color:#B2B2B2;}.wp_themeSkin .mceColorSplitMenu a{border-color:#B2B2B2;}.wp_themeSkin .mceColorSplitMenu a.mceMoreColors{border-color:#fff;}.wp_themeSkin .mceColorSplitMenu a.mceMoreColors:hover{border-color:#0A246A;background-color:#B6BDD2;}.wp_themeSkin a.mceMoreColors:hover{border-color:#0A246A;}.wp_themeSkin .mceMenu{border-color:#ddd;}.wp_themeSkin .mceMenu table{background-color:#ebeaeb;}.wp_themeSkin .mceMenu .mceText{color:#000;}.wp_themeSkin .mceMenu .mceMenuItemEnabled a:hover,.wp_themeSkin .mceMenu .mceMenuItemActive{background-color:#f5f5f5;}.wp_themeSkin td.mceMenuItemSeparator{background-color:#aaa;}.wp_themeSkin .mceMenuItemTitle a{background-color:#ccc;border-bottom-color:#aaa;}.wp_themeSkin .mceMenuItemTitle span.mceText{color:#000;}.wp_themeSkin .mceMenuItemDisabled .mceText{color:#888;}.wp_themeSkin tr.mceFirst td.mceToolbar{background:#dfdfdf url("../images/ed-bg.gif") repeat-x scroll left top;border-color:#ccc;}.wp-admin #mceModalBlocker{background:#000;}.wp-admin .clearlooks2 .mceFocus .mceTop .mceLeft{background:#444;border-left:1px solid #999;border-top:1px solid #999;-moz-border-radius:3px 0 0 0;-webkit-border-top-left-radius:3px;-khtml-border-top-left-radius:3px;border-top-left-radius:3px;}.wp-admin .clearlooks2 .mceFocus .mceTop .mceRight{background:#444;border-right:1px solid #999;border-top:1px solid #999;border-top-right-radius:3px;-khtml-border-top-right-radius:3px;-webkit-border-top-right-radius:3px;-moz-border-radius:0 3px 0 0;}.wp-admin .clearlooks2 .mceMiddle .mceLeft{background:#f1f1f1;border-left:1px solid #999;}.wp-admin .clearlooks2 .mceMiddle .mceRight{background:#f1f1f1;border-right:1px solid #999;}.wp-admin .clearlooks2 .mceBottom{background:#f1f1f1;border-bottom:1px solid #999;}.wp-admin .clearlooks2 .mceBottom .mceLeft{background:#f1f1f1;border-bottom:1px solid #999;border-left:1px solid #999;}.wp-admin .clearlooks2 .mceBottom .mceCenter{background:#f1f1f1;border-bottom:1px solid #999;}.wp-admin .clearlooks2 .mceBottom .mceRight{background:#f1f1f1;border-bottom:1px solid #999;border-right:1px solid #999;}.wp-admin .clearlooks2 .mceFocus .mceTop span{color:#e5e5e5;}#titlediv #title{border-color:#ccc;}#editorcontainer{border-color:#ccc #ccc #dfdfdf;}#post-status-info{border-color:#dfdfdf #ccc #ccc;}.editwidget .widget-inside{border-color:#dfdfdf;}#titlediv #title{background-color:#fff;}#tTips p#tTips_inside{background-color:#ddd;color:#333;}#timestampdiv input,#namediv input,#poststuff .inside .the-tagcloud{border-color:#ddd;}#adminmenuback,#adminmenuwrap{background-color:#ececec;border-color:#ccc;}#adminmenushadow,#adminmenuback{background-image:url(../images/menu-shadow.png);background-position:top right;background-repeat:repeat-y;}#adminmenu li.wp-menu-separator{background:#dfdfdf;border-color:#cfcfcf;}#adminmenu div.separator{border-color:#e1e1e1;}#adminmenu li.wp-has-current-submenu.wp-menu-open .wp-menu-toggle,#adminmenu li.wp-has-current-submenu:hover .wp-menu-toggle{background:transparent url(../images/arrows-dark.png) no-repeat -1px 6px;}#adminmenu .wp-has-submenu:hover .wp-menu-toggle,#adminmenu .wp-menu-open .wp-menu-toggle{background:transparent url(../images/arrows.png) no-repeat -2px 6px;}#adminmenu a.menu-top,.folded #adminmenu li.menu-top,#adminmenu .wp-submenu .wp-submenu-head{border-top-color:#f9f9f9;border-bottom-color:#dfdfdf;}#adminmenu li.wp-menu-open{border-color:#dfdfdf;}#adminmenu li.wp-has-current-submenu a.wp-has-current-submenu,#adminmenu li.current a.menu-top,.folded #adminmenu li.wp-has-current-submenu,.folded #adminmenu li.current.menu-top,#adminmenu .wp-menu-arrow,#adminmenu .wp-has-current-submenu .wp-submenu .wp-submenu-head{background-color:#777;background-image:-ms-linear-gradient(bottom,#6d6d6d,#808080);background-image:-moz-linear-gradient(bottom,#6d6d6d,#808080);background-image:-o-linear-gradient(bottom,#6d6d6d,#808080);background-image:-webkit-gradient(linear,left bottom,left top,from(#6d6d6d),to(#808080));background-image:-webkit-linear-gradient(bottom,#6d6d6d,#808080);background-image:linear-gradient(bottom,#6d6d6d,#808080);}#adminmenu li.wp-has-current-submenu a.wp-has-current-submenu,#adminmenu li.current a.menu-top,#adminmenu .wp-has-current-submenu .wp-submenu .wp-submenu-head{text-shadow:0 -1px 0 #333;color:#fff;border-top-color:#808080;border-bottom-color:#6d6d6d;}.folded #adminmenu li.wp-has-current-submenu,.folded #adminmenu li.current.menu-top{border-top-color:#808080;border-bottom-color:#6d6d6d;}#adminmenu .wp-submenu a:hover{background-color:#EAF2FA!important;color:#333!important;}#adminmenu .wp-submenu li.current,#adminmenu .wp-submenu li.current a,#adminmenu .wp-submenu li.current a:hover{color:#333;}#adminmenu .wp-submenu ul{background-color:#fff;}.folded #adminmenu .wp-submenu-wrap,.folded #adminmenu .wp-submenu ul{border-color:#dfdfdf;}.folded #adminmenu .wp-submenu-wrap{-moz-box-shadow:2px 2px 5px rgba(0,0,0,0.4);-webkit-box-shadow:2px 2px 5px rgba(0,0,0,0.4);box-shadow:2px 2px 5px rgba(0,0,0,0.4);}#adminmenu .wp-submenu .wp-submenu-head{border-right-color:#dfdfdf;background-color:#ececec;}#adminmenu div.wp-submenu{background-color:transparent;}#collapse-menu{color:#aaa;}#collapse-menu:hover{color:#999;}#collapse-button{border-color:#ccc;background-color:#f4f4f4;background-image:-ms-linear-gradient(bottom,#dfdfdf,#fff);background-image:-moz-linear-gradient(bottom,#dfdfdf,#fff);background-image:-o-linear-gradient(bottom,#dfdfdf,#fff);background-image:-webkit-gradient(linear,left bottom,left top,from(#dfdfdf),to(#fff));background-image:-webkit-linear-gradient(bottom,#dfdfdf,#fff);background-image:linear-gradient(bottom,#dfdfdf,#fff);}#collapse-menu:hover #collapse-button{border-color:#aaa;}#collapse-button div{background:transparent url(../images/arrows.png) no-repeat 0 -72px;}.folded #collapse-button div{background-position:0 -108px;}#adminmenu .menu-icon-dashboard div.wp-menu-image{background:transparent url('../images/menu.png?ver=20100531') no-repeat scroll -60px -33px;}#adminmenu .menu-icon-dashboard:hover div.wp-menu-image,#adminmenu .menu-icon-dashboard.wp-has-current-submenu div.wp-menu-image,#adminmenu .menu-icon-dashboard.current div.wp-menu-image{background:transparent url('../images/menu.png?ver=20100531') no-repeat scroll -60px -1px;}#adminmenu .menu-icon-post div.wp-menu-image{background:transparent url('../images/menu.png?ver=20100531') no-repeat scroll -271px -33px;}#adminmenu .menu-icon-post:hover div.wp-menu-image,#adminmenu .menu-icon-post.wp-has-current-submenu div.wp-menu-image{background:transparent url('../images/menu.png?ver=20100531') no-repeat scroll -271px -1px;}#adminmenu .menu-icon-media div.wp-menu-image{background:transparent url('../images/menu.png?ver=20100531') no-repeat scroll -120px -33px;}#adminmenu .menu-icon-media:hover div.wp-menu-image,#adminmenu .menu-icon-media.wp-has-current-submenu div.wp-menu-image{background:transparent url('../images/menu.png?ver=20100531') no-repeat scroll -120px -1px;}#adminmenu .menu-icon-links div.wp-menu-image{background:transparent url('../images/menu.png?ver=20100531') no-repeat scroll -90px -33px;}#adminmenu .menu-icon-links:hover div.wp-menu-image,#adminmenu .menu-icon-links.wp-has-current-submenu div.wp-menu-image{background:transparent url('../images/menu.png?ver=20100531') no-repeat scroll -90px -1px;}#adminmenu .menu-icon-page div.wp-menu-image{background:transparent url('../images/menu.png?ver=20100531') no-repeat scroll -150px -33px;}#adminmenu .menu-icon-page:hover div.wp-menu-image,#adminmenu .menu-icon-page.wp-has-current-submenu div.wp-menu-image{background:transparent url('../images/menu.png?ver=20100531') no-repeat scroll -150px -1px;}#adminmenu .menu-icon-comments div.wp-menu-image{background:transparent url('../images/menu.png?ver=20100531') no-repeat scroll -30px -33px;}#adminmenu .menu-icon-comments:hover div.wp-menu-image,#adminmenu .menu-icon-comments.wp-has-current-submenu div.wp-menu-image,#adminmenu .menu-icon-comments.current div.wp-menu-image{background:transparent url('../images/menu.png?ver=20100531') no-repeat scroll -30px -1px;}#adminmenu .menu-icon-appearance div.wp-menu-image{background:transparent url('../images/menu.png?ver=20100531') no-repeat scroll 0 -33px;}#adminmenu .menu-icon-appearance:hover div.wp-menu-image,#adminmenu .menu-icon-appearance.wp-has-current-submenu div.wp-menu-image{background:transparent url('../images/menu.png?ver=20100531') no-repeat scroll 0 -1px;}#adminmenu .menu-icon-plugins div.wp-menu-image{background:transparent url('../images/menu.png?ver=20100531') no-repeat scroll -180px -33px;}#adminmenu .menu-icon-plugins:hover div.wp-menu-image,#adminmenu .menu-icon-plugins.wp-has-current-submenu div.wp-menu-image{background:transparent url('../images/menu.png?ver=20100531') no-repeat scroll -180px -1px;}#adminmenu .menu-icon-users div.wp-menu-image{background:transparent url('../images/menu.png?ver=20100531') no-repeat scroll -300px -33px;}#adminmenu .menu-icon-users:hover div.wp-menu-image,#adminmenu .menu-icon-users.wp-has-current-submenu div.wp-menu-image,#adminmenu .menu-icon-users.current div.wp-menu-image{background:transparent url('../images/menu.png?ver=20100531') no-repeat scroll -300px -1px;}#adminmenu .menu-icon-tools div.wp-menu-image{background:transparent url('../images/menu.png?ver=20100531') no-repeat scroll -210px -33px;}#adminmenu .menu-icon-tools:hover div.wp-menu-image,#adminmenu .menu-icon-tools.wp-has-current-submenu div.wp-menu-image,#adminmenu .menu-icon-tools.current div.wp-menu-image{background:transparent url('../images/menu.png?ver=20100531') no-repeat scroll -210px -1px;}#icon-options-general,#adminmenu .menu-icon-settings div.wp-menu-image{background:transparent url('../images/menu.png?ver=20100531') no-repeat scroll -240px -33px;}#adminmenu .menu-icon-settings:hover div.wp-menu-image,#adminmenu .menu-icon-settings.wp-has-current-submenu div.wp-menu-image{background:transparent url('../images/menu.png?ver=20100531') no-repeat scroll -240px -1px;}#adminmenu .menu-icon-site div.wp-menu-image{background:transparent url('../images/menu.png?ver=20100531') no-repeat scroll -360px -33px;}#adminmenu .menu-icon-site:hover div.wp-menu-image,#adminmenu .menu-icon-site.wp-has-current-submenu div.wp-menu-image{background:transparent url('../images/menu.png?ver=20100531') no-repeat scroll -360px -1px;}#icon-edit,#icon-post{background:transparent url(../images/icons32.png?ver=20100531) no-repeat -552px -5px;}#icon-index{background:transparent url(../images/icons32.png?ver=20100531) no-repeat -137px -5px;}#icon-upload{background:transparent url(../images/icons32.png?ver=20100531) no-repeat -251px -5px;}#icon-link-manager,#icon-link,#icon-link-category{background:transparent url(../images/icons32.png?ver=20100531) no-repeat -190px -5px;}#icon-edit-pages,#icon-page{background:transparent url(../images/icons32.png?ver=20100531) no-repeat -312px -5px;}#icon-edit-comments{background:transparent url(../images/icons32.png?ver=20100531) no-repeat -72px -5px;}#icon-themes{background:transparent url(../images/icons32.png?ver=20100531) no-repeat -11px -5px;}#icon-plugins{background:transparent url(../images/icons32.png?ver=20100531) no-repeat -370px -5px;}#icon-users,#icon-profile,#icon-user-edit{background:transparent url(../images/icons32.png?ver=20100531) no-repeat -600px -5px;}#icon-tools,#icon-admin{background:transparent url(../images/icons32.png?ver=20100531) no-repeat -432px -5px;}#icon-options-general{background:transparent url(../images/icons32.png?ver=20100531) no-repeat -492px -5px;}#icon-ms-admin{background:transparent url(../images/icons32.png?ver=20100531) no-repeat -659px -5px;}table.diff .diff-deletedline{background-color:#fdd;}table.diff .diff-deletedline del{background-color:#f99;}table.diff .diff-addedline{background-color:#dfd;}table.diff .diff-addedline ins{background-color:#9f9;}#att-info{background-color:#E4F2FD;}#sidemenu a{background-color:#f9f9f9;border-color:#f9f9f9;border-bottom-color:#dfdfdf;}#sidemenu a.current{background-color:#fff;border-color:#dfdfdf #dfdfdf #fff;color:#D54E21;}#screen-options-wrap,#contextual-help-wrap{background-color:#f1f1f1;border-color:#dfdfdf;}#screen-options-link-wrap,#contextual-help-link-wrap{background-color:#e3e3e3;border-right:1px solid transparent;border-left:1px solid transparent;border-bottom:1px solid transparent;background-image:-ms-linear-gradient(bottom,#dfdfdf,#f1f1f1);background-image:-moz-linear-gradient(bottom,#dfdfdf,#f1f1f1);background-image:-o-linear-gradient(bottom,#dfdfdf,#f1f1f1);background-image:-webkit-gradient(linear,left bottom,left top,from(#dfdfdf),to(#f1f1f1));background-image:-webkit-linear-gradient(bottom,#dfdfdf,#f1f1f1);background-image:linear-gradient(bottom,#dfdfdf,#f1f1f1);}#screen-meta-links a.show-settings{color:#777;}#screen-meta-links a.show-settings:hover{color:#000;}#replysubmit{background-color:#f1f1f1;border-top-color:#ddd;}#replyerror{border-color:#ddd;background-color:#f9f9f9;}#edithead,#replyhead{background-color:#f1f1f1;}#ed_reply_toolbar{background-color:#e9e9e9;}.vim-current,.vim-current th,.vim-current td{background-color:#E4F2FD!important;}.star-average,.star.star-rating{background-color:#fc0;}div.star.select:hover{background-color:#d00;}div.star img{border-left:1px solid #fff;border-right:1px solid #fff;}.widefat div.star img{border-left:1px solid #f9f9f9;border-right:1px solid #f9f9f9;}#plugin-information .fyi ul{background-color:#eaf3fa;}#plugin-information .fyi h2.mainheader{background-color:#cee1ef;}#plugin-information pre,#plugin-information code{background-color:#ededff;}#plugin-information pre{border:1px solid #ccc;}.inline-edit-row fieldset input[type="text"],.inline-edit-row fieldset textarea,#bulk-titles,#replyrow input{border-color:#ddd;}.inline-editor div.title{background-color:#EAF3FA;}.inline-editor ul.cat-checklist{background-color:#fff;border-color:#ddd;}.inline-editor .categories .catshow,.inline-editor .categories .cathide{color:#21759b;}.inline-editor .quick-edit-save{background-color:#f1f1f1;}#replyrow #ed_reply_toolbar input:hover{border-color:#aaa;background:#ddd;}fieldset.inline-edit-col-right .inline-edit-col{border-color:#dfdfdf;}.attention{color:#D54E21;}.meta-box-sortables .postbox:hover .handlediv{background:transparent url(../images/arrows.png) no-repeat 6px 7px;}.tablenav .tablenav-pages{color:#555;}.tablenav .tablenav-pages a{border-color:#e3e3e3;background:#eee url('../images/menu-bits.gif?ver=20100610') repeat-x scroll left -379px;}.tablenav .tablenav-pages a:hover,.tablenav .tablenav-pages a:focus{color:#d54e21;}.tablenav .tablenav-pages a.disabled,.tablenav .tablenav-pages a.disabled:hover,.tablenav .tablenav-pages a.disabled:focus{color:#aaa;}.tablenav .tablenav-pages .current{background:#dfdfdf;border-color:#d3d3d3;}#availablethemes,#availablethemes td{border-color:#ddd;}#current-theme img{border-color:#999;}#TB_window #TB_title a.tb-theme-preview-link,#TB_window #TB_title a.tb-theme-preview-link:visited{color:#999;}#TB_window #TB_title a.tb-theme-preview-link:hover,#TB_window #TB_title a.tb-theme-preview-link:focus{color:#ccc;}.misc-pub-section{border-top-color:#fff;border-bottom-color:#dfdfdf;}#minor-publishing{border-bottom-color:#dfdfdf;}#post-body .misc-pub-section{border-right-color:#eee;}.post-com-count span{background-color:#bbb;}.form-table .color-palette td{border-color:#fff;}.sortable-placeholder{border-color:#bbb;background-color:#f5f5f5;}#post-body ul.category-tabs li.tabs a,#post-body ul.add-menu-item-tabs li.tabs a,body.press-this ul.category-tabs li.tabs a{color:#333;}#wp_editimgbtn,#wp_delimgbtn,#wp_editgallery,#wp_delgallery{border-color:#999;background-color:#eee;}#wp_editimgbtn:hover,#wp_delimgbtn:hover,#wp_editgallery:hover,#wp_delgallery:hover{border-color:#555;background-color:#ccc;}#favorite-first{border-color:#c0c0c0;background:#f1f1f1;background:-moz-linear-gradient(bottom,#e7e7e7,#fff);background:-webkit-gradient(linear,left bottom,left top,from(#e7e7e7),to(#fff));}#favorite-inside{border-color:#c0c0c0;background-color:#fff;}#favorite-toggle{background:transparent url(../images/arrows.png) no-repeat 4px 2px;border-color:#dfdfdf;-moz-box-shadow:inset 1px 0 0 #fff;-webkit-box-shadow:inset 1px 0 0 #fff;box-shadow:inset 1px 0 0 #fff;}#favorite-actions a{color:#464646;}#favorite-actions a:hover{color:#000;}#favorite-inside a:hover{text-decoration:underline;}#screen-meta a.show-settings,.toggle-arrow{background:transparent url(../images/arrows.png) no-repeat right 3px;}#screen-meta .screen-meta-active a.show-settings{background:transparent url(../images/arrows.png) no-repeat right -33px;}.view-switch #view-switch-list{background:transparent url(../images/list.png) no-repeat 0 0;}.view-switch .current #view-switch-list{background:transparent url(../images/list.png) no-repeat -40px 0;}.view-switch #view-switch-excerpt{background:transparent url(../images/list.png) no-repeat -20px 0;}.view-switch .current #view-switch-excerpt{background:transparent url(../images/list.png) no-repeat -60px 0;}#header-logo{background:transparent url(../images/wp-logo.png?ver=20110504) no-repeat scroll center center;}.popular-tags,.feature-filter{background-color:#fff;border-color:#DFDFDF;}#theme-information .action-button{border-top-color:#DFDFDF;}.theme-listing br.line{border-bottom-color:#ccc;}div.widgets-sortables,#widgets-left .inactive{background-color:#fcfcfc;border-color:#dfdfdf;}#available-widgets .widget-holder{background-color:#fcfcfc;border-color:#dfdfdf;}#available-widgets .widget-description{color:#555;}.sidebar-name{color:#464646;text-shadow:#fff 0 1px 0;border-color:#dfdfdf;-moz-box-shadow:inset 0 1px 0 #fff;-webkit-box-shadow:inset 0 1px 0 #fff;box-shadow:inset 0 1px 0 #fff;}.sidebar-name:hover,#removing-widget{color:#d54e21;}#removing-widget span{color:black;}.sidebar-name-arrow{background:transparent url(../images/arrows.png) no-repeat 5px 9px;}.sidebar-name:hover .sidebar-name-arrow{background:transparent url(../images/arrows-dark.png) no-repeat 5px 9px;}.in-widget-title{color:#606060;}.deleting .widget-title *{color:#aaa;}.imgedit-menu div{border-color:#d5d5d5;background-color:#f1f1f1;}.imgedit-menu div:hover{border-color:#c1c1c1;background-color:#eaeaea;}.imgedit-menu div.disabled{border-color:#ccc;background-color:#ddd;filter:alpha(opacity=50);opacity:.5;}#dashboard_recent_comments div.undo{border-top-color:#dfdfdf;}.comment-ays,.comment-ays th{border-color:#ddd;}.comment-ays th{background-color:#f1f1f1;}#menu-management .menu-edit{border-color:#dfdfdf;}#post-body{background:#fff;border-top-color:#fff;border-bottom-color:#dfdfdf;}#nav-menu-header{border-bottom-color:#dfdfdf;}#nav-menu-footer{border-top-color:#fff;}#menu-management .nav-tabs-arrow a{color:#C1C1C1;}#menu-management .nav-tabs-arrow a:hover{color:#D54E21;}#menu-management .nav-tabs-arrow a:active{color:#464646;}#menu-management .nav-tab-active{border-color:#dfdfdf;}#menu-management .nav-tab{background:#fbfbfb;border-color:#dfdfdf;}.js .input-with-default-title{color:#aaa;}#cancel-save{color:#f00;}#cancel-save:hover{background-color:#F00;color:#fff;}.list-container{border-color:#DFDFDF;}.menu-item-handle{border-color:#dfdfdf;}.menu li.deleting .menu-item-handle{background-color:#f66;text-shadow:#ccc;}.item-type{color:#999;}.item-controls .menu-item-delete:hover{color:#f00;}.item-edit{background:transparent url(../images/arrows.png) no-repeat 8px 10px;border-bottom-color:#eee;}.item-edit:hover{background:transparent url(../images/arrows-dark.png) no-repeat 8px 10px;}.menu-item-settings{border-color:#dfdfdf;}.link-to-original{color:#777;border-color:#dfdfdf;}#cancel-save:hover{color:#fff!important;}#update-menu-item{color:#fff!important;}#update-menu-item:hover,#update-menu-item:active,#update-menu-item:focus{color:#eaf2fa!important;border-color:#13455b!important;}.submitbox .submitcancel{color:#21759B;border-bottom-color:#21759B;}.submitbox .submitcancel:hover{background:#21759B;color:#fff;}#menu-management .nav-tab-active,.menu-item-handle,.menu-item-settings{-moz-box-shadow:inset 0 1px 0 #fff;-webkit-box-shadow:inset 0 1px 0 #fff;box-shadow:inset 0 1px 0 #fff;}#menu-management .nav-tab-active{background:#f9f9f9;border-bottom-color:#f9f9f9;}#upload-form label{color:#777;}.fullscreen-overlay{background:#fff;}.wp-fullscreen-focus #wp-fullscreen-title,.wp-fullscreen-focus #wp-fullscreen-container{border-color:#ccc;}#fullscreen-topbar{border-bottom-color:#DFDFDF;}ack-2.12/t/swamp/#emacs-workfile.pl#0000644000076400007640000000016012215743470015623 0ustar andyandy#!/usr/bin/perl ## no critic This is a scratch emacs workfile that has a shebang line but should not get read. ack-2.12/t/swamp/sample.asp0000644000076400007640000000020612215743470014237 0ustar andyandy ASP Example <% Response.Write "Hello!" %> ack-2.12/t/ack-files-from.t0000644000076400007640000000350012246427630014107 0ustar andyandy#!perl use strict; use warnings; use lib 't'; use File::Temp; use Test::More tests => 3; use Util; prep_environment(); subtest 'Basic reading from files, no switches' => sub { plan tests => 2; my $target_file = File::Next::reslash( 't/swamp/options.pl' ); my @expected = split( /\n/, <<"EOF" ); $target_file:2:use strict; EOF my $tempfile = fill_temp_file( qw( t/swamp/options.pl t/swamp/pipe-stress-freaks.F ) ); ack_lists_match( [ '--files-from=' . $tempfile->filename, 'strict' ], \@expected, 'Looking for strict in multiple files' ); unlink $tempfile->filename; }; subtest 'Non-existent file specified' => sub { plan tests => 3; my @args = qw( strict ); my ( $stdout, $stderr ) = run_ack_with_stderr( '--files-from=non-existent-file', @args); is_empty_array( $stdout, 'No STDOUT for non-existent file' ); is( scalar @{$stderr}, 1, 'One line of STDERR for non-existent file' ); like( $stderr->[0], qr/Unable to open non-existent-file:/, 'Correct warning message for non-existent file' ); }; subtest 'Source file exists, but non-existent files mentioned in the file' => sub { plan tests => 4; my $tempfile = fill_temp_file( qw( t/swamp/options.pl file-that-isnt-there ) ); my ( $stdout, $stderr ) = run_ack_with_stderr( '--files-from=' . $tempfile->filename, 'CASE'); is( scalar @{$stdout}, 1, 'One hit found' ); like( $stdout->[0], qr/THIS IS ALL IN UPPER CASE/, 'Find the one line in the file' ); is( scalar @{$stderr}, 1, 'One line of STDERR for non-existent file' ); like( $stderr->[0], qr/file-that-isnt-there: No such file/, 'Correct warning message for non-existent file' ); }; sub fill_temp_file { my @lines = @_; my $tempfile = File::Temp->new; print {$tempfile} "$_\n" for @lines; close $tempfile; return $tempfile; } ack-2.12/t/ack-type-del.t0000644000076400007640000000313412246427630013572 0ustar andyandy#!perl use strict; use warnings; use Test::More tests => 13; use lib 't'; use Util; prep_environment(); my ( $stdout, $stderr ); my $help_types_output; # sanity check ( $stdout, $stderr ) = run_ack_with_stderr('--perl', '-f', 't/swamp'); is( scalar(@{$stdout}), 11, 'Found initial 11 files' ); is_empty_array( $stderr, 'Nothing in stderr' ); ( $stdout, $stderr ) = run_ack_with_stderr('--type-del=perl', '--type-del=perltest', '--perl', '-f', 't/swamp'); is_empty_array( $stdout, 'Nothing in stdout' ); is_nonempty_array( $stderr, 'Got at least 1 error line' ); like( $stderr->[0], qr/Unknown option: perl/ ); ( $stdout, $stderr ) = run_ack_with_stderr('--type-del=perl', '--type-del=perltest', '--type-add=perl:ext:pm', '--perl', '-f', 't/swamp'); is( scalar(@{$stdout}), 1, 'Got one output line' ); is_empty_array( $stderr, 'Nothing in stderr' ); # more sanity checking $help_types_output = run_ack( '--help-types' ); like( $help_types_output, qr/\Q--[no]perl/ ); $help_types_output = run_ack( '--type-del=perl', '--type-del=perltest', '--help-types' ); unlike( $help_types_output, qr/\Q--[no]perl/ ); DUMP: { my @dump_output = run_ack( '--type-del=perl', '--type-del=perltest', '--dump' ); # discard everything up to the ARGV section while(@dump_output && $dump_output[0] ne 'ARGV') { shift @dump_output; } shift @dump_output; # discard ARGV shift @dump_output; # discard header foreach my $line (@dump_output) { $line =~ s/^\s+|\s+$//g; } lists_match( \@dump_output, ['--type-del=perl', '--type-del=perltest'], '--type-del should show up in --dump output' ); } ack-2.12/t/noackrc.t0000644000076400007640000000064612217375765012751 0ustar andyandy#!perl use strict; use warnings; use lib 't'; use Test::More tests => 1; use Util; prep_environment(); my @expected = ( 't/swamp/Makefile.PL', 't/swamp/options-crlf.pl', 't/swamp/options.pl', 't/swamp/perl.pl', ); my @args = ( '--ignore-ack-defaults', '--type-add=perl:ext:pl', '--perl', '-f' ); my @files = ( 't/swamp' ); ack_sets_match( [ @args, @files ], \@expected, __FILE__ ); done_testing(); ack-2.12/t/FilterTest.pm0000644000076400007640000000165112217375765013564 0ustar andyandypackage FilterTest; use strict; use warnings; use base 'Exporter'; use App::Ack::Resource::Basic; use File::Find; use Util; use Test::More; our @EXPORT = qw(filter_test); my @swamp_files; find(sub { push @swamp_files, $File::Find::name if -f; }, 't/swamp'); sub filter_test { local $Test::Builder::Level = $Test::Builder::Level + 1; my $filter_args = shift; my $expected_matches = shift; my $msg = shift or die 'Must pass a message to filter_test()'; return subtest "filter_test($msg)" => sub { my $filter = eval { App::Ack::Filter->create_filter(@{$filter_args}); }; ok($filter) or diag($@); my @matches = map { $_->name } grep { $filter->filter($_) } map { App::Ack::Resource::Basic->new($_) } @swamp_files; sets_match(\@matches, $expected_matches, $msg); }; } 1; ack-2.12/t/default-filter.t0000644000076400007640000000535712217205276014231 0ustar andyandy#!perl use strict; use warnings; use lib 't'; use FilterTest; use Test::More tests => 1; use App::Ack::Filter::Default; App::Ack::Filter->register_filter('default' => 'App::Ack::Filter::Default'); filter_test( [ 'default' ], [ 't/swamp/#emacs-workfile.pl#', 't/swamp/0', 't/swamp/c-header.h', 't/swamp/c-source.c', 't/swamp/crystallography-weenies.f', 't/swamp/example.R', 't/swamp/file.bar', 't/swamp/file.foo', 't/swamp/fresh.css', 't/swamp/fresh.min.css', 't/swamp/fresh.css.min', 't/swamp/html.htm', 't/swamp/html.html', 't/swamp/incomplete-last-line.txt', 't/swamp/javascript.js', 't/swamp/lua-shebang-test', 't/swamp/Makefile', 't/swamp/Makefile.PL', 't/swamp/MasterPage.master', 't/swamp/minified.js.min', 't/swamp/minified.min.js', 't/swamp/not-an-#emacs-workfile#', 't/swamp/notaMakefile', 't/swamp/notaRakefile', 't/swamp/notes.md', 't/swamp/options-crlf.pl', 't/swamp/options.pl', 't/swamp/options.pl.bak', 't/swamp/parrot.pir', 't/swamp/perl-test.t', 't/swamp/perl-without-extension', 't/swamp/perl.cgi', 't/swamp/perl.handler.pod', 't/swamp/perl.pl', 't/swamp/perl.pm', 't/swamp/perl.pod', 't/swamp/pipe-stress-freaks.F', 't/swamp/Rakefile', 't/swamp/Sample.ascx', 't/swamp/Sample.asmx', 't/swamp/sample.asp', 't/swamp/sample.aspx', 't/swamp/sample.rake', 't/swamp/service.svc', 't/swamp/blib/ignore.pir', 't/swamp/blib/ignore.pm', 't/swamp/blib/ignore.pod', 't/swamp/groceries/fruit', 't/swamp/groceries/junk', 't/swamp/groceries/meat', 't/swamp/groceries/another_subdir/fruit', 't/swamp/groceries/another_subdir/junk', 't/swamp/groceries/another_subdir/meat', 't/swamp/groceries/another_subdir/CVS/fruit', 't/swamp/groceries/another_subdir/CVS/junk', 't/swamp/groceries/another_subdir/CVS/meat', 't/swamp/groceries/another_subdir/RCS/fruit', 't/swamp/groceries/another_subdir/RCS/junk', 't/swamp/groceries/another_subdir/RCS/meat', 't/swamp/groceries/CVS/fruit', 't/swamp/groceries/CVS/junk', 't/swamp/groceries/CVS/meat', 't/swamp/groceries/RCS/fruit', 't/swamp/groceries/RCS/junk', 't/swamp/groceries/RCS/meat', 't/swamp/groceries/subdir/fruit', 't/swamp/groceries/subdir/junk', 't/swamp/groceries/subdir/meat', 't/swamp/stuff.cmake', 't/swamp/CMakeLists.txt', ], 'only non-binary files should be matched' ); ack-2.12/t/text/0000755000076400007640000000000012247354203012105 5ustar andyandyack-2.12/t/text/freedom-of-choice.txt0000644000076400007640000000165012215743470016126 0ustar andyandyA victim of collision on the open sea Nobody ever said life was free Sink, swim, go down with the ship But use your freedom of choice I'll say it again in the land of the free Use your freedom of choice Your freedom of choice In ancient Rome There was a poem About a dog Who found two bones He picked at one He licked the other He went in circles He dropped dead Freedom of choice Is what you got Freedom of choice! Then if you've got it, you don't want it Seems to be the rule of thumb Don't be tricked by what you see You've got two ways to go I'll say it again in the land of the free Use your freedom of choice Freedom of choice Freedom of choice Is what you got Freedom of choice! In ancient Rome There was a poem About a dog Who found two bones He picked at one He licked the other He went in circles He dropped dead Freedom of choice Is what you got Freedom from choice Is what you want -- "Freedom Of Choice", Devo ack-2.12/t/text/4th-of-july.txt0000644000076400007640000000162112215743470014733 0ustar andyandyAlone with the morning burning red On the canvas in my head Painting a picture of you And me driving across country In a dusty old RV Just the road and its majesty And I'm looking at you With the world in the rear view Chorus: You were pretty as can be, sitting in the front seat Looking at me, telling me you love me, And you're happy to be with me on the 4th of July We sang "Stranglehold" to the stereo Couldn't take no more of that rock and roll So we put on a little George Jones and just sang along Those white lines Get drawn into the sun If you ain't got no one To keep you hanging on And there you were Like a queen in your nightgown Riding shotgun from town to town Staking a claim on the world we found And I'm singing to you You're singing to me You were out of the blue to a boy like me Chorus And I'm lookin' for you In the silence that we shared Chorus -- "4th of July", Shooter Jennings ack-2.12/t/text/science-of-myth.txt0000644000076400007640000000241012215743470015640 0ustar andyandyIf you've ever questioned beliefs that you've hold, you're not alone But you oughta realize that every myth is a metaphor In the case of Christianity and Judaism there exists the belief That spiritual matters are enslaved to history The Buddhists believe that the functional aspects override the myth While other religions use the literal core to build foundations with See, half the world sees the myth as fact, and it's seen as a lie by the other half And the simple truth is that it's none of that 'cause Somehow no matter what the world keeps turning Somehow we get by without ever learning Science and religion are not mutually exclusive In fact, for better understanding we take the facts of science and apply them And if both factors keep evolving then we continue getting information But closing off the possibilities makes it hard to see the bigger picture Consider the case of the woman whose faith helped her make it through When she was raped and cut up, left for dead in her trunk, her beliefs held true It doesn't matter if it's real or not 'cause some things are better left without a doubt And if it works, then it gets the job done Somehow no matter what the world keeps turning Somehow we get by without ever learning -- "The Science Of Myth", Screeching Weasel ack-2.12/t/text/shut-up-be-happy.txt0000644000076400007640000000211712215743470015762 0ustar andyandyWe interrupt this program with a special bulletin: America is now under martial law. All Constitutional rights have been suspended. Stay in your homes. Do not attempt to contact loved ones, insurance agents or attorneys. Shut up. Do not attempt to think or depression may occur. Stay in your homes. Curfew is at 7 PM sharp after work. Anyone caught outside the gates of their subdivision sector after curfew will be shot. Remain calm. Do not panic. Your neighborhood watch officer will be by to collect urine samples in the morning. Anyone gaught intefering with the collection of urine samples will be shot. Stay in your homes, remain calm. The number one enemy of progress is questions. National security is more important than individual will. All sports broadcasts will proceed as normal. No more than two people may gather anywhere without permission. Use only the drugs prescribed by your boss or supervisor. Shut up! Be happy. Obey all orders without question. The comfort you've demanded is now mandatory. Be happy. At last everything is done for you. -- "Shut Up, Be Happy", Jello Biafra ack-2.12/t/text/numbered-text.txt0000644000076400007640000000050012215743470015427 0ustar andyandyThis is line 01 This is line 02 This is line 03 This is line 04 This is line 05 This is line 06 This is line 07 This is line 08 This is line 09 This is line 10 This is line 11 This is line 12 This is line 13 This is line 14 This is line 15 This is line 16 This is line 17 This is line 18 This is line 19 This is line 20 ack-2.12/t/text/me-and-bobbie-mcgee.txt0000644000076400007640000000241512215743470016312 0ustar andyandyBusted flat in Baton Rouge, waitin' for a train I was feelin' near as faded as my jeans Bobbie thumbed a diesel down just before it rained Took us all the way to New Orleans I pulled my harpoon out of my dirty red bandana I was playin' soft while Bobbie sang the blues Windshield wipers slappin' time Holdin' Bobbie's hand in mine We sang every song that driver knew Freedom's just another word for nothing left to lose Nothin' don't mean nothin' if it ain't free And feelin' good was easy, Lord, when she sang the blues Feeling good was good enough for me Good enough for me and my Bobbie McGee From the Kentucky coal mines to the California sun Bobbie shared the secrets of my soul Through all kinds of weather and everything we done Bobbie baby kept me from the cold One day up near Salinas, Lord, I let her slip away She's looking for that home and I hope she finds it But I'd trade all of my tomorrows for one single yesterday To be holding Bobbie's body next to mine Freedom's just another word for nothing left to lose Nothin' don't mean nothin' if it ain't free And feelin' good was easy, Lord, when she sang the blues Feeling good was good enough for me Good enough for me and my Bobbie McGee -- "Me & Bobbie McGee," Kris Kristofferson ack-2.12/t/text/boy-named-sue.txt0000644000076400007640000000537312215743470015326 0ustar andyandyWell, my daddy left home when I was three And he didn't leave very much for my Ma and me 'cept an old guitar and an empty bottle of booze. Now, I don't blame him 'cause he run and hid But the meanest thing that he ever did Was before he left, he went and named me Sue. Well, he must have thought that it was quite a joke And it got a lot of laughs from a' lots of folks, It seems I had to fight my whole life through. Some gal would giggle and I'd turn red And some guy'd laugh and I'd bust his head, I tell ya, life ain't easy for a boy named Sue. Well, I grew up quick and I grew up mean, My fists got hard and my wits got keen, I'd roam from town to town to hide my shame. But I made me a vow to the moon and stars That I'd search the honky-tonks and bars And kill that man who gave me that awful name. Well, it was Gatlinburg in mid-July And I just hit town and my throat was dry, I thought I'd stop and have myself a brew. At an old saloon on a street of mud, There at a table, dealing stud, Sat the dirty, mangy dog that named me Sue. Well, I knew that snake was my own sweet dad From a worn-out picture that my mother'd had, And I knew that scar on his cheek and his evil eye. He was big and bent and gray and old, And I looked at him and my blood ran cold And I said: "My name is Sue! How do you do! Now you gonna die!" Well, I hit him hard right between the eyes And he went down, but to my surprise, He come up with a knife and cut off a piece of my ear. And I busted a chair right across his teeth And we crashed through the wall and into the street Kicking and a-gouging in the mud and the blood and the beer. I tell ya, I've fought tougher men But I really can't remember when, He kicked like a mule and he bit like a crocodile. I heard him laugh and then I heard him cuss, He reached for his gun and I pulled mine first, He stood there lookin' at me and I saw him smile. And he said: "Son, this world is rough And if a man's gonna make it, he's gotta be tough And I knew I wouldn't be there to help ya along. So I give ya that name and I said goodbye I knew you'd have to get tough or die And it's the name that helped to make you strong." He said: "Now you just fought one hell of a fight And I know you hate me, and you got the right To kill me now, and I wouldn't blame you if you do. But ya oughta thank me, before I die, For the gravel in ya gut and the spit in ya eye Cause I'm the son-of-a-bitch that named you Sue." I got all choked up and I threw down my gun I called him my pa, and he called me his son, And I came away with a different point of view. And I think about him, now and then, Every time I try and every time I win, And if I ever have a son, I think I'm gonna name him Bill or George! Anything but Sue! I still hate that name! -- "A Boy Named Sue", Johnny Cash ack-2.12/t/ack-create-ackrc.t0000644000076400007640000000076612217205144014373 0ustar andyandy#!perl use strict; use warnings; use lib 't'; use Test::More tests => 3; use Util; use App::Ack::ConfigDefault (); prep_environment(); my @expected = App::Ack::ConfigDefault::options(); my @output = run_ack( 'ack', '--create-ackrc' ); ok(scalar(grep { $_ eq '--ignore-ack-defaults' } @output), '--ignore-ack-defaults should be present in output'); @output = grep { $_ ne '--ignore-ack-defaults' } @output; lists_match(\@output, \@expected, 'lines in output should match the default options'); ack-2.12/t/context.t0000644000076400007640000002374712246427630013013 0ustar andyandy#!perl use warnings; use strict; use Test::More tests => 32; use File::Next (); # for reslash function use lib 't'; use Util; prep_environment(); # checks also beginning of file BEFORE: { my @expected = split( /\n/, <<'EOF' ); Well, my daddy left home when I was three -- But the meanest thing that he ever did Was before he left, he went and named me Sue. EOF my $regex = 'left'; my @files = qw( t/text/boy-named-sue.txt ); my @args = ( '-B1', $regex ); ack_lists_match( [ @args, @files ], \@expected, "Looking for $regex - before" ); } BEFORE_WITH_LINE_NO: { my $target_file = File::Next::reslash( 't/text/boy-named-sue.txt' ); my @expected = split( /\n/, <<"EOF" ); $target_file-7- $target_file-8-Well, he must have thought that it was quite a joke $target_file:9:And it got a lot of laughs from a' lots of folks, $target_file-10-It seems I had to fight my whole life through. $target_file-11-Some gal would giggle and I'd turn red $target_file:12:And some guy'd laugh and I'd bust his head, -- $target_file-44-But I really can't remember when, $target_file-45-He kicked like a mule and he bit like a crocodile. $target_file:46:I heard him laugh and then I heard him cuss, EOF my $regex = 'laugh'; my @files = qw( t/text ); my @args = ( '-B2', $regex ); ack_lists_match( [ @args, @files ], \@expected, "Looking for $regex - before with line numbers" ); } # checks also end of file AFTER: { my @expected = split( /\n/, <<"EOF" ); I tell ya, life ain't easy for a boy named Sue. Well, I grew up quick and I grew up mean, -- -- "A Boy Named Sue", Johnny Cash EOF my $regex = '[nN]amed Sue'; my @files = qw( t/text/boy-named-sue.txt ); my @args = ( '-A2', $regex ); ack_lists_match( [ @args, @files ], \@expected, "Looking for $regex - after" ); } # context defaults to 2 CONTEXT_DEFAULT: { my @expected = split( /\n/, <<"EOF" ); And it got a lot of laughs from a' lots of folks, It seems I had to fight my whole life through. Some gal would giggle and I'd turn red And some guy'd laugh and I'd bust his head, I tell ya, life ain't easy for a boy named Sue. EOF my $regex = 'giggle'; my @files = qw( t/text/boy-named-sue.txt ); my @args = ( '-C', $regex ); ack_lists_match( [ @args, @files ], \@expected, "Looking for $regex - context defaults to 2" ); } # -1 must not stop the ending context from displaying CONTEXT_DEFAULT: { my @expected = split( /\n/, <<"EOF" ); And it got a lot of laughs from a' lots of folks, It seems I had to fight my whole life through. Some gal would giggle and I'd turn red And some guy'd laugh and I'd bust his head, I tell ya, life ain't easy for a boy named Sue. EOF my $regex = 'giggle'; my @files = qw( t/text/boy-named-sue.txt ); my @args = ( '-1', '-C', $regex ); ack_lists_match( [ @args, @files ], \@expected, "Looking for $regex with -1" ); } # -C with overlapping contexts (adjacent lines) CONTEXT_OVERLAPPING: { my @expected = split( /\n/, <<"EOF" ); This is line 03 This is line 04 This is line 05 This is line 06 This is line 07 This is line 08 EOF my $regex = '05|06'; my @files = qw( t/text/numbered-text.txt ); my @args = ( '-C', $regex ); ack_lists_match( [ @args, @files ], \@expected, "Looking for $regex with overlapping contexts" ); } # -C with contexts that touch CONTEXT_ADJACENT: { my @expected = split( /\n/, <<"EOF" ); This is line 01 This is line 02 This is line 03 This is line 04 This is line 05 This is line 06 This is line 07 This is line 08 This is line 09 This is line 10 EOF my $regex = '03|08'; my @files = qw( t/text/numbered-text.txt ); my @args = ( '-C', $regex ); ack_lists_match( [ @args, @files ], \@expected, "Looking for $regex with contexts that touch" ); } # -C with contexts that just don't touch CONTEXT_NONADJACENT: { my @expected = split( /\n/, <<"EOF" ); This is line 01 This is line 02 This is line 03 This is line 04 This is line 05 -- This is line 07 This is line 08 This is line 09 This is line 10 This is line 11 EOF my $regex = '03|09'; my @files = qw( t/text/numbered-text.txt ); my @args = ( '-C', $regex ); ack_lists_match( [ @args, @files ], \@expected, "Looking for $regex with contexts that just don't touch" ); } CONTEXT_OVERLAPPING_COLOR: { my $match_start = "\e[30;43m"; my $match_end = "\e[0m"; my $line_end = "\e[0m\e[K"; my @expected = split( /\n/, <<"EOF" ); This is line 03 This is line 04 This is line ${match_start}05${match_end}${line_end} This is line ${match_start}06${match_end}${line_end} This is line 07 This is line 08 EOF my $regex = '05|06'; my @files = qw( t/text/numbered-text.txt ); my @args = ( '--color', '-C', $regex ); ack_lists_match( [ @args, @files ], \@expected, "Looking for $regex with overlapping contexts" ); } CONTEXT_OVERLAPPING_COLOR_BEFORE: { my $match_start = "\e[30;43m"; my $match_end = "\e[0m"; my $line_end = "\e[0m\e[K"; my @expected = split( /\n/, <<"EOF" ); This is line 03 This is line 04 This is line ${match_start}05${match_end}${line_end} This is line ${match_start}06${match_end}${line_end} EOF my $regex = '05|06'; my @files = qw( t/text/numbered-text.txt ); my @args = ( '--color', '-B2', $regex ); ack_lists_match( [ @args, @files ], \@expected, "Looking for $regex with overlapping contexts" ); } CONTEXT_OVERLAPPING_COLOR_AFTER: { my $match_start = "\e[30;43m"; my $match_end = "\e[0m"; my $line_end = "\e[0m\e[K"; my @expected = split( /\n/, <<"EOF" ); This is line ${match_start}05${match_end}${line_end} This is line ${match_start}06${match_end}${line_end} This is line 07 This is line 08 EOF my $regex = '05|06'; my @files = qw( t/text/numbered-text.txt ); my @args = ( '--color', '-A2', $regex ); ack_lists_match( [ @args, @files ], \@expected, "Looking for $regex with overlapping contexts" ); } # -m3 should work properly and show only 3 matches with correct context # even though there is a 4th match in the after context of the third match # ("give _ya_ that name" in the last line) CONTEXT_MAX_COUNT: { my @expected = split( /\n/, <<"EOF" ); And some guy'd laugh and I'd bust his head, I tell ya, life ain't easy for a boy named Sue. -- I tell ya, I've fought tougher men But I really can't remember when, -- And if a man's gonna make it, he's gotta be tough And I knew I wouldn't be there to help ya along. So I give ya that name and I said goodbye EOF my $regex = 'ya'; my @files = qw( t/text/boy-named-sue.txt ); my @args = ( '-m3', '-C1', $regex ); ack_lists_match( [ @args, @files ], \@expected, "Looking for $regex with -m3" ); } # highlighting works with context HIGHLIGHTING: { my @ack_args = qw( July -C5 --color ); my @results = pipe_into_ack( 't/text/4th-of-july.txt', @ack_args ); my @escaped_lines = grep { /\e/ } @results; is( scalar @escaped_lines, 2, 'Only two lines are highlighted' ); is( scalar @results, 18, 'Expecting altogether 18 lines back' ); } # grouping works with context (single file) GROUPING_SINGLE_FILE: { my $target_file = File::Next::reslash( 't/etc/shebang.py.xxx' ); my @expected = split( /\n/, <<"EOF" ); $target_file 1:#!/usr/bin/python EOF my $regex = 'python'; my @args = ( '--python', '--group', '-C', $regex ); ack_lists_match( [ @args ], \@expected, "Looking for $regex in Python files with grouping" ); } # grouping works with context and multiple files # i.e. a separator line between different matches in the same file and no separator between files GROUPING_MULTIPLE_FILES: { my @target_file = ( File::Next::reslash( 't/text/boy-named-sue.txt' ), File::Next::reslash( 't/text/me-and-bobbie-mcgee.txt' ), File::Next::reslash( 't/text/science-of-myth.txt' ), ); my @expected = split( /\n/, <<"EOF" ); $target_file[0] 1:Well, my daddy left home when I was three -- 5-But the meanest thing that he ever did 6:Was before he left, he went and named me Sue. $target_file[1] 10- 11: Freedom's just another word for nothing left to lose -- 25- 26: Freedom's just another word for nothing left to lose $target_file[2] 18-Consider the case of the woman whose faith helped her make it through 19:When she was raped and cut up, left for dead in her trunk, her beliefs held true 20-It doesn't matter if it's real or not 21:'cause some things are better left without a doubt EOF my $regex = 'left'; my @files = qw( t/text/ ); my @args = ( '--group', '-B1', '--sort-files', $regex ); ack_lists_match( [ @args, @files ], \@expected, "Looking for $regex in multiple files with grouping" ); } # see https://github.com/petdance/ack2/issues/326 and links there for details WITH_COLUMNS_AND_CONTEXT: { my @files = qw( t/text/freedom-of-choice.txt ); my @expected = split( /\n/, <<"EOF" ); $files[0]-2-Nobody ever said life was free $files[0]-3-Sink, swim, go down with the ship $files[0]:4:15:But use your freedom of choice $files[0]-5- $files[0]-6-I'll say it again in the land of the free $files[0]:7:11:Use your freedom of choice $files[0]:8:7:Your freedom of choice $files[0]-9- $files[0]-10-In ancient Rome -- $files[0]-17-He dropped dead $files[0]-18- $files[0]:19:2:Freedom of choice $files[0]-20-Is what you got $files[0]:21:2:Freedom of choice! $files[0]-22- $files[0]-23-Then if you've got it, you don't want it -- $files[0]-27- $files[0]-28-I'll say it again in the land of the free $files[0]:29:11:Use your freedom of choice $files[0]:30:2:Freedom of choice $files[0]-31- $files[0]:32:2:Freedom of choice $files[0]-33-Is what you got $files[0]:34:2:Freedom of choice! $files[0]-35- $files[0]-36-In ancient Rome -- $files[0]-43-He dropped dead $files[0]-44- $files[0]:45:2:Freedom of choice $files[0]-46-Is what you got $files[0]:47:2:Freedom from choice $files[0]-48-Is what you want $files[0]-49- $files[0]:50:10: -- "Freedom Of Choice", Devo EOF my $regex = 'reedom'; my @args = ( '--column', '-C2', '-H', $regex ); ack_lists_match( [ @args, @files ], \@expected, "Looking for $regex in file $files[0] with columns and context" ); } ack-2.12/t/00-load.t0000644000076400007640000000071112217205133012433 0ustar andyandy#!perl -T use warnings; use strict; use Test::More tests => 1; use App::Ack; use App::Ack::Resource; use App::Ack::ConfigDefault; use App::Ack::ConfigFinder; use App::Ack::ConfigLoader; use File::Next; use Test::Harness; pass( 'All modules loaded' ); diag( "Testing App::Ack $App::Ack::VERSION, File::Next $File::Next::VERSION, Perl $], $^X" ); diag( "Using Test::More $Test::More::VERSION and Test::Harness $Test::Harness::VERSION" ); done_testing(); ack-2.12/t/ack-o.t0000644000076400007640000001017712246427630012312 0ustar andyandy#!perl use warnings; use strict; use Cwd (); use Test::More tests => 13; use File::Next (); use File::Spec (); use File::Temp (); use lib 't'; use Util; prep_environment(); NO_O: { my @files = qw( t/text/boy-named-sue.txt ); my @args = qw( the\\s+\\S+ ); my @expected = split( /\n/, <<'EOF' ); But the meanest thing that he ever did But I made me a vow to the moon and stars That I'd search the honky-tonks and bars Sat the dirty, mangy dog that named me Sue. Well, I hit him hard right between the eyes And we crashed through the wall and into the street Kicking and a-gouging in the mud and the blood and the beer. And it's the name that helped to make you strong." And I know you hate me, and you got the right For the gravel in ya gut and the spit in ya eye Cause I'm the son-of-a-bitch that named you Sue." EOF s/^\s+// for @expected; ack_lists_match( [ @args, @files ], \@expected, 'Find all the things without -o' ); } WITH_O: { my @files = qw( t/text/boy-named-sue.txt ); my @args = qw( the\\s+\\S+ -o ); my @expected = split( /\n/, <<'EOF' ); the meanest the moon the honky-tonks the dirty, the eyes the wall the street the mud the blood the beer. the name the right the gravel the spit the son-of-a-bitch EOF s/^\s+// for @expected; ack_lists_match( [ @args, @files ], \@expected, 'Find all the things with -o' ); } # give a output function and find match in multiple files (so print filenames, just like grep -o) WITH_OUTPUT: { my @files = qw( t/text/ ); my @args = qw/ --output=x$1x question(\\S+) /; my @target_file = ( File::Next::reslash( 't/text/science-of-myth.txt' ), File::Next::reslash( 't/text/shut-up-be-happy.txt' ), ); my @expected = ( "$target_file[0]:1:xedx", "$target_file[1]:15:xs.x", "$target_file[1]:21:x.x", ); ack_sets_match( [ @args, @files ], \@expected, 'Find all the things with --output function' ); } OUTPUT_DOUBLE_QUOTES: { my @files = qw( t/text/ ); my @args = ( '--output="$1"', 'question(\\S+)' ); my @target_file = ( File::Next::reslash( 't/text/science-of-myth.txt' ), File::Next::reslash( 't/text/shut-up-be-happy.txt' ), ); my @expected = ( qq{$target_file[0]:1:"ed"}, qq{$target_file[1]:15:"s."}, qq{$target_file[1]:21:"."}, ); ack_sets_match( [ @args, @files ], \@expected, 'Find all the things with --output function' ); } my $wd = Cwd::getcwd(); my $tempdir = File::Temp->newdir; mkdir File::Spec->catdir($tempdir->dirname, 'subdir'); PROJECT_ACKRC_OUTPUT_FORBIDDEN: { my @files = ( File::Spec->rel2abs('t/text/') ); my @args = qw/ --env question(\\S+) /; chdir $tempdir->dirname; write_file '.ackrc', "--output=foo\n"; my ( $stdout, $stderr ) = run_ack_with_stderr(@args, @files); is_empty_array( $stdout ); is_nonempty_array( $stderr ); like( $stderr->[0], qr/--output is illegal in project ackrcs/ ) or diag(explain($stderr)); chdir $wd; } HOME_ACKRC_OUTPUT_PERMITTED: { my @files = ( File::Spec->rel2abs('t/text/') ); my @args = qw/ --env question(\\S+) /; write_file(File::Spec->catfile($tempdir->dirname, '.ackrc'), "--output=foo\n"); chdir File::Spec->catdir($tempdir->dirname, 'subdir'); local $ENV{'HOME'} = $tempdir->dirname; my ( $stdout, $stderr ) = run_ack_with_stderr(@args, @files); is_nonempty_array( $stdout ); is_empty_array( $stderr ); chdir $wd; } ACKRC_ACKRC_OUTPUT_PERMITTED: { my @files = ( File::Spec->rel2abs('t/text/') ); my @args = qw/ --env question(\\S+) /; write_file(File::Spec->catfile($tempdir->dirname, '.ackrc'), "--output=foo\n"); chdir File::Spec->catdir($tempdir->dirname, 'subdir'); local $ENV{'ACKRC'} = File::Spec->catfile($tempdir->dirname, '.ackrc'); my ( $stdout, $stderr ) = run_ack_with_stderr(@args, @files); is_nonempty_array( $stdout ); is_empty_array( $stderr ); chdir $wd; } done_testing(); ack-2.12/t/ack-f.t0000644000076400007640000000507612217375765012314 0ustar andyandy#!perl use warnings; use strict; use Test::More tests => 6; use lib 't'; use Util; prep_environment(); DEFAULT_DIR_EXCLUSIONS: { my @expected = ( qw( t/swamp/0 t/swamp/c-header.h t/swamp/c-source.c t/swamp/crystallography-weenies.f t/swamp/example.R t/swamp/file.bar t/swamp/file.foo t/swamp/fresh.css t/swamp/groceries/another_subdir/fruit t/swamp/groceries/another_subdir/junk t/swamp/groceries/another_subdir/meat t/swamp/groceries/fruit t/swamp/groceries/junk t/swamp/groceries/meat t/swamp/groceries/subdir/fruit t/swamp/groceries/subdir/junk t/swamp/groceries/subdir/meat t/swamp/html.htm t/swamp/html.html t/swamp/incomplete-last-line.txt t/swamp/javascript.js t/swamp/lua-shebang-test t/swamp/Makefile t/swamp/Makefile.PL t/swamp/MasterPage.master t/swamp/notaMakefile t/swamp/notaRakefile t/swamp/notes.md t/swamp/options-crlf.pl t/swamp/options.pl t/swamp/parrot.pir t/swamp/perl-test.t t/swamp/perl-without-extension t/swamp/perl.cgi t/swamp/perl.handler.pod t/swamp/perl.pl t/swamp/perl.pm t/swamp/perl.pod t/swamp/pipe-stress-freaks.F t/swamp/Rakefile t/swamp/Sample.ascx t/swamp/Sample.asmx t/swamp/sample.asp t/swamp/sample.aspx t/swamp/sample.rake t/swamp/service.svc t/swamp/stuff.cmake t/swamp/CMakeLists.txt ), 't/swamp/not-an-#emacs-workfile#', ); my @args = qw( -f t/swamp ); ack_sets_match( [ @args ], \@expected, 'DEFAULT_DIR_EXCLUSIONS' ); is( get_rc(), 0, '-f with matches exits with 0' ); } COMBINED_FILTERS: { my @expected = qw( t/swamp/0 t/swamp/perl.pm t/swamp/Rakefile t/swamp/options-crlf.pl t/swamp/options.pl t/swamp/perl-without-extension t/swamp/perl.cgi t/swamp/Makefile.PL t/swamp/perl-test.t t/swamp/perl.handler.pod t/swamp/perl.pl t/swamp/perl.pod ); my @args = qw( -f t/swamp --perl --rake ); ack_sets_match( [ @args ], \@expected, 'COMBINED_FILTERS' ); is( get_rc(), 0, '-f with matches exits with 0' ); } EXIT_CODE: { my @expected; my @args = qw( -f t/swamp --type-add=baz:ext:baz --baz ); ack_sets_match( \@args, \@expected, 'EXIT_CODE' ); is( get_rc(), 1, '-f with no matches exits with 1' ); } done_testing(); ack-2.12/t/noenv.t0000644000076400007640000000446012246427630012443 0ustar andyandy#!perl use strict; use warnings; use Test::More tests => 5; use lib 't'; use Util; use App::Ack::ConfigLoader; use Cwd qw( realpath getcwd ); use File::Spec (); use File::Temp (); sub is_global_file { my ( $filename ) = @_; return unless -f $filename; my ( undef, $dir ) = File::Spec->splitpath($filename); my $wd = getcwd(); my $sep = is_windows() ? '\\' : '/'; chop $dir if $dir =~ m{$sep$}; chop $wd if $wd =~ m{$sep$}; return $wd !~ /^\Q$dir\E/; } sub remove_defaults_and_globals { my ( @sources ) = @_; return grep { $_->{name} ne 'Defaults' && !is_global_file($_->{name}) } @sources; } prep_environment(); my $wd = getcwd() or die; my $tempdir = File::Temp->newdir; chdir $tempdir->dirname or die; write_file( '.ackrc', <<'ACKRC' ); --type-add=perl:ext:pl,t,pm ACKRC subtest 'without --noenv' => sub { local @ARGV = ('-f', 'lib/'); local $ENV{'ACK_OPTIONS'} = '--perl'; my @sources = App::Ack::ConfigLoader::retrieve_arg_sources(); @sources = remove_defaults_and_globals(@sources); is_deeply( \@sources, [ { name => realpath(File::Spec->catfile($tempdir->dirname, '.ackrc')), contents => [ '--type-add=perl:ext:pl,t,pm' ], project => 1, }, { name => 'ACK_OPTIONS', contents => '--perl', }, { name => 'ARGV', contents => ['-f', 'lib/'], }, ], 'Get back a long list of arguments' ); }; subtest 'with --noenv' => sub { local @ARGV = ('--noenv', '-f', 'lib/'); local $ENV{'ACK_OPTIONS'} = '--perl'; my @sources = App::Ack::ConfigLoader::retrieve_arg_sources(); @sources = remove_defaults_and_globals(@sources); is_deeply( \@sources, [ { name => 'ARGV', contents => ['-f', 'lib/'], }, ], 'Short list comes back because of --noenv' ); }; NOENV_IN_CONFIG: { append_file( '.ackrc', "--noenv\n" ); local $ENV{'ACK_OPTIONS'} = '--perl'; my ( $stdout, $stderr ) = run_ack_with_stderr('--env', 'perl'); is_empty_array( $stdout ); is( @{$stderr}, 1 ); like( $stderr->[0], qr/--noenv found in (?:.*)[.]ackrc/ ) or diag(explain($stderr)); } chdir $wd or die; # Go back to the original directory to avoid warnings ack-2.12/t/runtests.pl0000644000076400007640000000126512217205370013346 0ustar andyandy#! /usr/bin/perl #--------------------------------------------------------------------- # Run tests for ack # # Windows makes it hard to temporarily set environment variables, and # has horrible quoting rules, so what should be a one-liner gets its # own script. #--------------------------------------------------------------------- use ExtUtils::Command::MM; $ENV{PERL_DL_NONLAZY} = 1; $ENV{ACK_TEST_STANDALONE} = shift; # make sure the tests' standard input is *never* a pipe (messes with # ack's filter detection) open STDIN, '<', '/dev/null'; printf("Running tests on %s\n", $ENV{ACK_TEST_STANDALONE} ? 'ack-standalone' : 'blib/script/ack'); test_harness(shift, shift, shift); ack-2.12/t/ack-dump.t0000644000076400007640000000145712246427630013022 0ustar andyandy#!perl use strict; use warnings; use lib 't'; use Util; use Test::More tests => 5; use App::Ack::ConfigDefault; prep_environment(); DUMP: { my @expected = split( /\n/, App::Ack::ConfigDefault::_options_block ); @expected = grep { /./ && !/^#/ } @expected; my @args = qw( --dump ); my @results = run_ack( @args ); is( $results[0], 'Defaults', 'header should be Defaults' ); splice @results, 0, 2; # remove header (2 lines) foreach my $result ( @results ) { $result =~ s/^\s*//; } sets_match( \@results, \@expected, __FILE__ ); my @perl = grep { /\bperl\b/ } @results; is( scalar @perl, 2, 'Two specs for Perl' ); my @ignore_dir = grep { /ignore-dir/ } @results; is( scalar @ignore_dir, 23, 'Twenty-three specs for ignoring directories' ); } ack-2.12/t/filter.t0000644000076400007640000000144412217205313012570 0ustar andyandy#!perl use strict; use warnings; use Test::More tests => 5; use App::Ack::Filter; my $filter; $filter = eval { App::Ack::Filter->create_filter('test'); }; ok( !$filter, 'Creating an unknown filter should fail' ); like( $@, qr/unknown filter/i, 'Got the expected error' ); App::Ack::Filter->register_filter(test => 'TestFilter'); $filter = eval { App::Ack::Filter->create_filter('test', qw/foo bar/); }; ok( $filter, 'Creating a registered filter should succeed' ) or diag($@); isa_ok( $filter, 'TestFilter', 'Creating a test filter should be a TestFilter' ); is_deeply( $filter, [qw/foo bar/], 'Extra arguments should get passed through to constructor' ); package TestFilter; use strict; use warnings; sub new { my ( $class, @args ) = @_; return bless \@args, $class; } 1; ack-2.12/t/incomplete-last-line.t0000644000076400007640000000113712217205316015332 0ustar andyandy#!perl use warnings; use strict; use Test::More tests => 2; use lib 't'; use Util; prep_environment(); # check that a match on the last line of a file without a proper # ending newline gets this newline append by ack INCOMPLETE_LAST_LINE: { my @expected = split( /\n/, <<"EOF" ); but no new line on the last line! At last everything is done for you. EOF my @args = qw( -h --nogroup last ); my @files = qw( t/swamp/incomplete-last-line.txt t/text/shut-up-be-happy.txt ); ack_lists_match( [ @args, @files ], \@expected, 'Incomplete line gets a newline appended.' ); } done_testing(); ack-2.12/t/ack-passthru.t0000644000076400007640000000437012217375765013734 0ustar andyandy#!perl use warnings; use strict; use Test::More tests => 6; use File::Next (); use lib 't'; use Util; prep_environment(); my @full_lyrics = ; chomp @full_lyrics; NORMAL: { my @expected = split( /\n/, <<'EOF' ); Painting a picture of you And I'm looking at you Looking at me, telling me you love me, And you're happy to be with me on the 4th of July If you ain't got no one To keep you hanging on And there you were Like a queen in your nightgown And I'm singing to you And I'm lookin' for you EOF my @files = qw( t/text/4th-of-july.txt ); my @args = qw( you ); my @results = run_ack( @args, @files ); lists_match( \@results, \@expected, q{I'm lookin' for you} ); } DASH_C: { my @expected = @full_lyrics; my @files = qw( t/text/4th-of-july.txt ); my @args = qw( you --passthru ); my @results = run_ack( @args, @files ); lists_match( \@results, \@expected, q{Still lookin' for you, in passthru mode} ); } SKIP: { skip 'Input options have not been implemented for Win32 yet', 2 if is_windows(); my @ack_args = qw( July --passthru --color ); my @results = pipe_into_ack( 't/text/4th-of-july.txt', @ack_args ); is( scalar @results, scalar @full_lyrics, 'Got all the lines back' ); my @escaped_lines = grep { /\e/ } @results; is( scalar @escaped_lines, 2, 'Only two lines are highlighted' ); } __DATA__ Alone with the morning burning red On the canvas in my head Painting a picture of you And me driving across country In a dusty old RV Just the road and its majesty And I'm looking at you With the world in the rear view Chorus: You were pretty as can be, sitting in the front seat Looking at me, telling me you love me, And you're happy to be with me on the 4th of July We sang "Stranglehold" to the stereo Couldn't take no more of that rock and roll So we put on a little George Jones and just sang along Those white lines Get drawn into the sun If you ain't got no one To keep you hanging on And there you were Like a queen in your nightgown Riding shotgun from town to town Staking a claim on the world we found And I'm singing to you You're singing to me You were out of the blue to a boy like me Chorus And I'm lookin' for you In the silence that we shared Chorus -- "4th of July", Shooter Jennings ack-2.12/t/ack-g.t0000644000076400007640000001715012246427630012300 0ustar andyandy#!perl use warnings; use strict; use Test::More tests => 18; use lib 't'; use Util; prep_environment(); subtest 'No starting directory specified' => sub { my $regex = 'non'; my @files = qw( t/foo/non-existent ); my @args = ( '-g', $regex ); my ($stdout, $stderr) = run_ack_with_stderr( @args, @files ); is_empty_array( $stdout, 'No STDOUT for non-existent file' ); is( scalar @{$stderr}, 1, 'One line of STDERR for non-existent file' ); like( $stderr->[0], qr/non-existent: No such file or directory/, 'Correct warning message for non-existent file' ); }; subtest 'regex comes before -g on the command line' => sub { my $regex = 'non'; my @files = qw( t/foo/non-existent ); my @args = ( $regex, '-g' ); my ($stdout, $stderr) = run_ack_with_stderr( @args, @files ); is_empty_array( $stdout, 'No STDOUT for non-existent file' ); is( scalar @{$stderr}, 1, 'One line of STDERR for non-existent file' ); like( $stderr->[0], qr/non-existent: No such file or directory/, 'Correct warning message for non-existent file' ); }; subtest 'No metacharacters' => sub { my @expected = qw( t/swamp/Makefile t/swamp/Makefile.PL t/swamp/notaMakefile ); my $regex = 'Makefile'; my @args = ( '-g', $regex ); my @files = qw( t/ ); ack_sets_match( [ @args, @files ], \@expected, "Looking for $regex" ); }; subtest 'With metacharacters' => sub { my @expected = qw( t/swamp/html.htm t/swamp/html.html ); my $regex = 'swam.......htm'; my @args = ( '-g', $regex ); my @files = qw( t/ ); ack_sets_match( [ @args, @files ], \@expected, "Looking for $regex" ); }; subtest 'Front anchor' => sub { my @expected = qw( t/file-permission.t t/filetypes.t t/filter.t ); my $regex = '^t.fil'; my @args = ( '-g', $regex ); my @files = qw( t ); ack_sets_match( [ @args, @files ], \@expected, "Looking for $regex" ); }; subtest 'Back anchor' => sub { my @expected = qw( t/runtests.pl t/swamp/options-crlf.pl t/swamp/options.pl t/swamp/perl.pl ); my $regex = 'pl$'; my @args = ( '-g', $regex ); my @files = qw( t ); ack_sets_match( [ @args, @files ], \@expected, "Looking for $regex" ); }; subtest 'Case-insensitive via -i' => sub { my @expected = qw( t/swamp/pipe-stress-freaks.F ); my $regex = 'PIPE'; my @args = ( '-i', '-g', $regex ); my @files = qw( t/swamp ); ack_sets_match( [ @args, @files ], \@expected, "Looking for -i -g $regex " ); }; subtest 'Case-insensitive via (?i:)' => sub { my @expected = qw( t/swamp/pipe-stress-freaks.F ); my $regex = '(?i:PIPE)'; my @files = qw( t/swamp ); my @args = ( '-g', $regex ); ack_sets_match( [ @args, @files ], \@expected, "Looking for $regex" ); }; subtest 'File on command line is always searched' => sub { my @expected = ( 't/swamp/#emacs-workfile.pl#' ); my $regex = 'emacs'; my @args = ( '-g', $regex ); my @files = ( 't/swamp/#emacs-workfile.pl#' ); ack_sets_match( [ @args, @files ], \@expected, 'File on command line is always searched' ); }; subtest 'File on command line is always searched, even with wrong filetype' => sub { my @expected = qw( t/swamp/parrot.pir ); my $regex = 'parrot'; my @files = qw( t/swamp/parrot.pir ); my @args = ( '--html', '-g', $regex ); ack_sets_match( [ @args, @files ], \@expected, 'File on command line is always searched, even with wrong type.' ); }; subtest '-Q works on -g' => sub { my @expected = qw( ); my $regex = 'ack-g.t$'; my @files = qw( t ); my @args = ( '-Q', '-g', $regex ); ack_sets_match( [ @args, @files ], \@expected, "Looking for $regex with quotemeta." ); @expected = ( 't/text/4th-of-july.txt', 't/text/freedom-of-choice.txt', 't/text/science-of-myth.txt', ); $regex = 'of'; @files = qw( t/text ); @args = ( '-Q', '-g', $regex ); ack_sets_match( [ @args, @files ], \@expected, "Looking for $regex with quotemeta." ); }; subtest '-w works on -g' => sub { my @expected = qw(); my $regex = 'free'; my @args = ( '-w', '-g', $regex ); # The -w means "free" won't match "freedom" my @files = qw( t/text/ ); ack_sets_match( [ @args, @files ], \@expected, "Looking for $regex with '-w'." ); @expected = ( 't/text/4th-of-july.txt', 't/text/freedom-of-choice.txt', 't/text/science-of-myth.txt', ); $regex = 'of'; @files = qw( t/text ); @args = ( '-w', '-g', $regex ); ack_sets_match( [ @args, @files ], \@expected, "Looking for $regex with '-w'." ); }; subtest '-v works on -g' => sub { my @expected = qw( t/text/boy-named-sue.txt t/text/me-and-bobbie-mcgee.txt t/text/numbered-text.txt t/text/shut-up-be-happy.txt ); my $file_regex = 'of'; my @args = ( '-v', '-g', $file_regex ); my @files = qw( t/text/ ); ack_sets_match( [ @args, @files ], \@expected, "Looking for file names that do not match $file_regex" ); }; subtest '--smart-case works on -g' => sub { my @expected = qw( t/swamp/pipe-stress-freaks.F t/swamp/crystallography-weenies.f ); my @files = qw( t/swamp ); my @args = ( '--smart-case', '-g', 'f$' ); ack_sets_match( [ @args, @files ], \@expected, 'Looking for f$' ); @expected = qw( t/swamp/pipe-stress-freaks.F ); @args = ( '--smart-case', '-g', 'F$' ); ack_sets_match( [ @args, @files ], \@expected, 'Looking for f$' ); }; subtest 'test exit codes' => sub { my $file_regex = 'foo'; my @files = ( 't/text/' ); run_ack( '-g', $file_regex, @files ); is( get_rc(), 1, '-g with no matches must exit with 1' ); $file_regex = 'boy'; run_ack( '-g', $file_regex, @files ); is( get_rc(), 0, '-g with matches must exit with 0' ); }; subtest 'test -g on a path' => sub { my $file_regex = 'text'; my @expected = ( 't/context.t', 't/text/4th-of-july.txt', 't/text/boy-named-sue.txt', 't/text/freedom-of-choice.txt', 't/text/me-and-bobbie-mcgee.txt', 't/text/numbered-text.txt', 't/text/science-of-myth.txt', 't/text/shut-up-be-happy.txt', ); my @args = ( '--sort-files', '-g', $file_regex ); ack_sets_match( [ @args ], \@expected, 'Make sure -g matches the whole path' ); }; subtest 'test -g with --color' => sub { my $file_regex = 'text'; my @expected = colorize( <<'END_COLOR' ); t/con(text).t t/(text)/4th-of-july.txt t/(text)/boy-named-sue.txt t/(text)/freedom-of-choice.txt t/(text)/me-and-bobbie-mcgee.txt t/(text)/numbered-(text).txt t/(text)/science-of-myth.txt t/(text)/shut-up-be-happy.txt END_COLOR my @args = ( '--sort-files', '-g', $file_regex ); my @results = run_ack(@args, '--color'); is_deeply( \@results, \@expected, 'Colorizing -g output with --color should work'); }; subtest q{test -g without --color; make sure colors don't show} => sub { unless(has_io_pty()) { plan skip_all => 'IO::Pty is required for this test'; return; } my $file_regex = 'text'; my $expected = <<'END_OUTPUT'; t/context.t t/text/4th-of-july.txt t/text/boy-named-sue.txt t/text/freedom-of-choice.txt t/text/me-and-bobbie-mcgee.txt t/text/numbered-text.txt t/text/science-of-myth.txt t/text/shut-up-be-happy.txt END_OUTPUT my @args = ( '--sort-files', '-g', $file_regex ); my $results = run_ack_interactive(@args); is( $results, $expected, 'Colorizing -g output without --color should have no color' ); }; done_testing(); ack-2.12/t/resource-iterator.t0000644000076400007640000000633512217375765015010 0ustar andyandy#!perl -w use warnings; use strict; use Test::More tests => 1; use File::Next 0.22; use lib 't'; use Util; prep_environment(); sub slurp { my $iter = shift; my @files; while ( defined ( my $file = $iter->() ) ) { push( @files, $file ); } return @files; } UNFILTERED: { my $iter = File::Next::files( { file_filter => undef, descend_filter => undef, }, 't/swamp' ); my @files = slurp( $iter ); sets_match( \@files, [qw( t/swamp/0 t/swamp/blib/ignore.pir t/swamp/blib/ignore.pm t/swamp/blib/ignore.pod t/swamp/c-header.h t/swamp/c-source.c t/swamp/crystallography-weenies.f t/swamp/example.R t/swamp/file.bar t/swamp/file.foo t/swamp/fresh.css t/swamp/fresh.css.min t/swamp/fresh.min.css t/swamp/groceries/another_subdir/CVS/fruit t/swamp/groceries/another_subdir/CVS/junk t/swamp/groceries/another_subdir/CVS/meat t/swamp/groceries/another_subdir/fruit t/swamp/groceries/another_subdir/junk t/swamp/groceries/another_subdir/meat t/swamp/groceries/another_subdir/RCS/fruit t/swamp/groceries/another_subdir/RCS/junk t/swamp/groceries/another_subdir/RCS/meat t/swamp/groceries/CVS/fruit t/swamp/groceries/CVS/junk t/swamp/groceries/CVS/meat t/swamp/groceries/fruit t/swamp/groceries/junk t/swamp/groceries/meat t/swamp/groceries/RCS/fruit t/swamp/groceries/RCS/junk t/swamp/groceries/RCS/meat t/swamp/groceries/subdir/fruit t/swamp/groceries/subdir/junk t/swamp/groceries/subdir/meat t/swamp/html.htm t/swamp/html.html t/swamp/incomplete-last-line.txt t/swamp/javascript.js t/swamp/lua-shebang-test t/swamp/Makefile t/swamp/Makefile.PL t/swamp/MasterPage.master t/swamp/minified.js.min t/swamp/minified.min.js t/swamp/moose-andy.jpg t/swamp/notaMakefile t/swamp/notaRakefile t/swamp/notes.md t/swamp/options-crlf.pl t/swamp/options.pl t/swamp/options.pl.bak t/swamp/parrot.pir t/swamp/perl-test.t t/swamp/perl-without-extension t/swamp/perl.cgi t/swamp/perl.pl t/swamp/perl.handler.pod t/swamp/perl.pm t/swamp/perl.pod t/swamp/perl.tar.gz t/swamp/perltoot.jpg t/swamp/pipe-stress-freaks.F t/swamp/Rakefile t/swamp/Sample.ascx t/swamp/Sample.asmx t/swamp/sample.asp t/swamp/sample.aspx t/swamp/sample.rake t/swamp/service.svc t/swamp/solution8.tar t/swamp/stuff.cmake t/swamp/CMakeLists.txt ), 't/swamp/#emacs-workfile.pl#', 't/swamp/not-an-#emacs-workfile#', ], 'UNFILTERED' ); } done_testing(); ack-2.12/t/ack-filetypes.t0000644000076400007640000000131612246427630014053 0ustar andyandy#!perl use strict; use warnings; use Test::More; use lib 't'; use Util; prep_environment(); my @filetypes = qw( actionscript ada asm batch cc cfmx clojure coffeescript cpp csharp css delphi elisp erlang fortran go groovy haskell hh html java js json jsp less lisp lua make objc objcpp ocaml parrot perl php plone python rake ruby rust sass scala scheme shell smalltalk sql tcl tex tt vb verilog vhdl vim xml yaml ); plan tests => scalar(@filetypes); foreach my $filetype ( @filetypes ) { my @args = ( '-f', "--$filetype" ); my ( undef, $stderr ) = run_ack_with_stderr( @args ); # Throw away stdout. We don't care. is_empty_array( $stderr, "--$filetype should print no errors" ); } done_testing(); ack-2.12/t/ack-removed-options.t0000644000076400007640000000135512246427630015204 0ustar andyandy#!perl use strict; use warnings; use Test::More; use lib 't'; use Util; prep_environment(); my @options = (qw{ -a --all -u }, ['-G', 'sue']); plan tests => scalar @options; foreach my $option (@options) { my @args = ref($option) ? @{$option} : ( $option ); $option = $option->[0] if ref($option); push @args, 'the', 't/text'; my ( $stdout, $stderr ) = run_ack_with_stderr( @args ); subtest "options = @args" => sub { is_empty_array( $stdout, 'Nothing in stdout' ); like( $stderr->[0], qr/Option '$option' is not valid in ack 2/, 'Found error message' ); if ( '-a' eq $option or '--all' eq $option ) { like( $stderr->[1], qr/-k/, 'Error mentions -k' ); } }; } ack-2.12/t/is-filter.t0000644000076400007640000000034312217375765013221 0ustar andyandy#!perl use strict; use warnings; use lib 't'; use FilterTest; use Test::More tests => 1; use App::Ack::Filter::Is; filter_test( [ is => 'Makefile' ], [ 't/swamp/Makefile' ], 'Only Makefile should be matched' ); ack-2.12/t/ack-type.t0000644000076400007640000000676312246427630013043 0ustar andyandy#!perl use strict; use warnings; use lib 't'; use Cwd (); use Test::More tests => 18; use File::Next (); use File::Temp (); use Util; prep_environment(); TEST_TYPE: { my @expected = split( /\n/, <<'EOF' ); t/swamp/0:1:#!/usr/bin/perl -w t/swamp/Makefile.PL:1:#!perl -T t/swamp/options-crlf.pl:1:#!/usr/bin/env perl t/swamp/options.pl:1:#!/usr/bin/env perl t/swamp/perl-test.t:1:#!perl -T t/swamp/perl-without-extension:1:#!/usr/bin/perl -w t/swamp/perl.cgi:1:#!perl -T t/swamp/perl.pl:1:#!perl -T t/swamp/perl.pm:1:#!perl -T EOF foreach my $line ( @expected ) { $line =~ s/^(.*?)(?=:)/File::Next::reslash( $1 )/ge; } my @args = ( '--type=perl', '--nogroup', '--noheading', '--nocolor' ); my @files = ( 't/swamp' ); my $target = 'perl'; my @results = run_ack( @args, $target, @files ); sets_match( \@results, \@expected, 'TEST_TYPE' ); } TEST_NOTYPE: { my @expected = split( /\n/, <<'EOF' ); t/swamp/c-header.h:1:/* perl.h t/swamp/Makefile:1:# This Makefile is for the ack extension to perl. EOF foreach my $line ( @expected ) { $line =~ s/^(.*?)(?=:)/File::Next::reslash( $1 )/ge; } my @args = ( '--type=noperl', '--nogroup', '--noheading', '--nocolor' ); my @files = ( 't/swamp' ); my $target = 'perl'; my @results = run_ack( @args, $target, @files ); sets_match( \@results, \@expected, 'TEST_NOTYPE' ); } TEST_UNKNOWN_TYPE: { my @args = ( '--ignore-ack-defaults', '--type-add=perl:ext:pl', '--type=foo', '--nogroup', '--noheading', '--nocolor' ); my @files = ( 't/swamp' ); my $target = 'perl'; my ( $stdout, $stderr ) = run_ack_with_stderr( @args, $target, @files ); is_empty_array( $stdout, 'Should have no lines back' ); is_nonempty_array( $stderr, 'Should get some errors' ); like( $stderr->[0], qr/Unknown type 'foo'/ ) or diag(explain($stderr)); } TEST_NOTYPES: { my @args = ( '--ignore-ack-defaults', '--type=perl', '--nogroup', '--noheading', '--nocolor' ); my @files = ( 't/swamp' ); my $target = 'perl'; my ( $stdout, $stderr ) = run_ack_with_stderr( @args, $target, @files ); is_empty_array( $stdout, 'Should have no lines back' ); is_nonempty_array( $stderr, 'Should get some errors' ); like( $stderr->[0], qr/Unknown type 'perl'/ ) or diag(explain($stderr)); } TEST_NOTYPE_OVERRIDE: { my @expected = ( File::Next::reslash('t/swamp/html.htm') . ':2:Boring test file ', File::Next::reslash('t/swamp/html.html') . ':2:Boring test file ', ); my @lines = run_ack('--nohtml', '--html', '--sort-files', '', 't/swamp'); is_deeply \@lines, \@expected; } TEST_TYPE_OVERRIDE: { my @lines = run_ack('--html', '--nohtml', '<title>', 't/swamp'); is_empty_array( \@lines ); } TEST_NOTYPE_ACKRC_CMD_LINE_OVERRIDE: { my $ackrc = <<'END_ACKRC'; --nohtml END_ACKRC my @expected = ( File::Next::reslash('t/swamp/html.htm') . ':2:<html><head><title>Boring test file ', File::Next::reslash('t/swamp/html.html') . ':2:Boring test file ', ); my @lines = run_ack('--html', '--sort-files', '', 't/swamp', { ackrc => \$ackrc, }); is_deeply \@lines, \@expected; } TEST_TYPE_ACKRC_CMD_LINE_OVERRIDE: { my $ackrc = <<'END_ACKRC'; --html END_ACKRC my @expected; my @lines = run_ack('--nohtml', '<title>', 't/swamp', { ackrc => \$ackrc, }); is_deeply \@lines, \@expected; } �������������ack-2.12/t/basic.t����������������������������������������������������������������������������������0000644�0000764�0000764�00000003221�12217205254�012363� 0����������������������������������������������������������������������������������������������������ustar �andy����������������������������andy�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!perl use strict; use warnings; use lib 't'; use File::Next; use Util; use Test::More tests => 12; prep_environment(); NO_SWITCHES_ONE_FILE: { my @expected = split( /\n/, <<'EOF' ); use strict; EOF my @files = qw( t/swamp/options.pl ); my @args = qw( strict ); my @results = run_ack( @args, @files ); lists_match( \@results, \@expected, 'Looking for strict in one file' ); } NO_SWITCHES_MULTIPLE_FILES: { my $target_file = File::Next::reslash( 't/swamp/options.pl' ); my @expected = split( /\n/, <<"EOF" ); $target_file:2:use strict; EOF my @files = qw( t/swamp/options.pl t/swamp/pipe-stress-freaks.F ); my @args = qw( strict ); my @results = run_ack( @args, @files ); lists_match( \@results, \@expected, 'Looking for strict in multiple files' ); } WITH_SWITCHES_ONE_FILE: { my $target_file = File::Next::reslash( 't/swamp/options.pl' ); for my $opt ( qw( -H --with-filename ) ) { my @expected = split( /\n/, <<"EOF" ); $target_file:2:use strict; EOF my @files = qw( t/swamp/options.pl ); my @args = ( $opt, qw( strict ) ); my @results = run_ack( @args, @files ); lists_match( \@results, \@expected, "Looking for strict in one file with $opt" ); } } WITH_SWITCHES_MULTIPLE_FILES: { for my $opt ( qw( -h --no-filename ) ) { my @expected = split( /\n/, <<"EOF" ); use strict; EOF my @files = qw( t/swamp/options.pl t/swamp/crystallography-weenies.f ); my @args = ( $opt, qw( strict ) ); my @results = run_ack( @args, @files ); lists_match( \@results, \@expected, "Looking for strict in multiple files with $opt" ); } } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ack-2.12/t/asp-net-ext.t����������������������������������������������������������������������������0000644�0000764�0000764�00000000555�12217375765�013475� 0����������������������������������������������������������������������������������������������������ustar �andy����������������������������andy�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!perl use strict; use warnings; use lib 't'; use Test::More tests => 2; use Util; prep_environment(); my @expected = qw( t/swamp/MasterPage.master t/swamp/Sample.ascx t/swamp/Sample.asmx t/swamp/sample.aspx t/swamp/service.svc ); my @args = qw( --aspx -f ); my @results = run_ack(@args); sets_match( \@results, \@expected, __FILE__ ); ���������������������������������������������������������������������������������������������������������������������������������������������������ack-2.12/t/process-substitution.t�������������������������������������������������������������������0000644�0000764�0000764�00000001657�12220402675�015545� 0����������������������������������������������������������������������������������������������������ustar �andy����������������������������andy�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!perl use strict; use warnings; use lib 't'; use Test::More; use Util; my @expected = ( 'THIS IS ALL IN UPPER CASE', 'this is a word here', ); prep_environment(); if ( is_windows() ) { plan skip_all => 'Test unreliable on Windows.'; } system 'bash', '-c', 'exit'; if ( $? ) { plan skip_all => 'You need bash to run this test'; exit; } plan tests => 1; my ( $read, $write ); pipe( $read, $write ); my $pid = fork(); my @output; if ( $pid ) { close $write; while(<$read>) { chomp; push @output, $_; } waitpid $pid, 0; } else { close $read; open STDOUT, '>&', $write or die "Can't open: $!"; open STDERR, '>&', $write or die "Can't open: $!"; my @args = build_ack_invocation( qw( --noenv --nocolor --smart-case this ) ); my $args = join( ' ', @args ); exec 'bash', '-c', "$args <(cat t/swamp/options.pl)"; } lists_match( \@output, \@expected, __FILE__ ); ���������������������������������������������������������������������������������ack-2.12/t/filetypes.t������������������������������������������������������������������������������0000644�0000764�0000764�00000005202�12246427630�013315� 0����������������������������������������������������������������������������������������������������ustar �andy����������������������������andy�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!perl -w use warnings; use strict; use Test::More; use lib 't'; use Util; { my %types_for_file; sub populate_filetypes { my ( $type_lines, undef ) = run_ack_with_stderr('--help-types'); my @types_to_try; foreach my $line (@$type_lines) { if($line =~ /^\s+--\[no\](\w+)/) { push @types_to_try, $1; } } foreach my $type (@types_to_try) { my ( $filenames, undef ) = run_ack_with_stderr('-f', "--$type", 't/swamp', 't/etc'); foreach my $filename (@$filenames) { push @{ $types_for_file{$filename} }, $type; } } } # XXX implement me with --show-types! sub filetypes { my $filename = File::Next::reslash(shift); if ( !%types_for_file ) { populate_filetypes(); } return @{ $types_for_file{$filename} || [] }; } } sub is_filetype { my ( $filename, $wanted_type ) = @_; for my $maybe_type ( filetypes( $filename ) ) { return 1 if $maybe_type eq $wanted_type; } return; } prep_environment(); sets_match( [filetypes( 't/swamp/perl.pod' )], [qw( parrot perl )], 'foo.pod can be multiple things' ); sets_match( [filetypes( 't/swamp/perl.pm' )], [qw( perl )], 't/swamp/perl.pm' ); sets_match( [filetypes( 't/swamp/Makefile.PL' )], [qw( perl )], 't/swamp/Makefile.PL' ); sets_match( [filetypes( 'Unknown.wango' )], [], 'Unknown' ); ok( is_filetype( 't/swamp/perl.pod', 'perl' ), 'foo.pod can be perl' ); ok( is_filetype( 't/swamp/perl.pod', 'parrot' ), 'foo.pod can be parrot' ); ok( !is_filetype( 't/swamp/perl.pod', 'ruby' ), 'foo.pod cannot be ruby' ); ok( is_filetype( 't/swamp/perl.handler.pod', 'perl' ), 'perl.handler.pod can be perl' ); ok( is_filetype( 't/swamp/Makefile', 'make' ), 'Makefile is a makefile' ); ok( is_filetype( 't/swamp/Rakefile', 'rake' ), 'Rakefile is a rakefile' ); is_empty_array( [filetypes('t/swamp/#emacs-workfile.pl#')], 'correctly skip files starting and ending with hash mark' ); MATCH_VIA_CONTENT: { my %lookups = ( 't/swamp/Makefile' => 'make', 't/swamp/Makefile.PL' => 'perl', 't/etc/shebang.php.xxx' => 'php', 't/etc/shebang.pl.xxx' => 'perl', 't/etc/shebang.py.xxx' => 'python', 't/etc/shebang.rb.xxx' => 'ruby', 't/etc/shebang.sh.xxx' => 'shell', 't/etc/buttonhook.xml.xxx' => 'xml', ); for my $filename ( sort keys %lookups ) { my $type = $lookups{$filename}; sets_match( [filetypes( $filename )], [ $type ], "Checking $filename" ); } } done_testing; ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ack-2.12/t/inverted-file-filter.t�������������������������������������������������������������������0000644�0000764�0000764�00000003624�12217375765�015350� 0����������������������������������������������������������������������������������������������������ustar �andy����������������������������andy�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!perl use strict; use warnings; use lib 't'; use Test::More tests => 2; use Util; prep_environment(); EXCLUDE_ONLY: { my @expected = ( qw( t/swamp/c-header.h t/swamp/c-source.c t/swamp/crystallography-weenies.f t/swamp/example.R t/swamp/file.bar t/swamp/file.foo t/swamp/fresh.css t/swamp/groceries/another_subdir/fruit t/swamp/groceries/another_subdir/junk t/swamp/groceries/another_subdir/meat t/swamp/groceries/fruit t/swamp/groceries/junk t/swamp/groceries/meat t/swamp/groceries/subdir/fruit t/swamp/groceries/subdir/junk t/swamp/groceries/subdir/meat t/swamp/html.htm t/swamp/html.html t/swamp/incomplete-last-line.txt t/swamp/javascript.js t/swamp/lua-shebang-test t/swamp/Makefile t/swamp/MasterPage.master t/swamp/notaMakefile t/swamp/notaRakefile t/swamp/notes.md t/swamp/parrot.pir t/swamp/pipe-stress-freaks.F t/swamp/Rakefile t/swamp/Sample.ascx t/swamp/Sample.asmx t/swamp/sample.asp t/swamp/sample.aspx t/swamp/sample.rake t/swamp/service.svc t/swamp/stuff.cmake t/swamp/CMakeLists.txt ), 't/swamp/not-an-#emacs-workfile#', ); my @args = qw( --noperl -f t/swamp ); ack_sets_match( [ @args ], \@expected, 'Exclude only' ); } INCLUDE_PLUS_EXCLUDE_ONLY: { my @expected = qw( t/swamp/0 t/swamp/perl.pm t/swamp/options-crlf.pl t/swamp/options.pl t/swamp/perl-without-extension t/swamp/perl.cgi t/swamp/Makefile.PL t/swamp/perl-test.t t/swamp/perl.pl ); my @args = ( '--type-add=pod:ext:pod', '--perl', '--nopod', '-f', 't/swamp' ); ack_sets_match( [ @args ], \@expected, 'Include plus exclude only' ); } ������������������������������������������������������������������������������������������������������������ack-2.12/t/ack-k.t����������������������������������������������������������������������������������0000644�0000764�0000764�00000002101�12217375765�012303� 0����������������������������������������������������������������������������������������������������ustar �andy����������������������������andy�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!perl use warnings; use strict; use Test::More tests => 2; use lib 't'; use Util; prep_environment(); subtest 'No restrictions on type' => sub { my $expected = <<'HERE'; t/etc/buttonhook.xml.xxx => xml t/etc/shebang.empty.xxx => t/etc/shebang.foobar.xxx => t/etc/shebang.php.xxx => php t/etc/shebang.pl.xxx => perl t/etc/shebang.py.xxx => python t/etc/shebang.rb.xxx => ruby t/etc/shebang.sh.xxx => shell HERE my @expected = reslash_all( break_up_lines( $expected ) ); my @args = qw( -f --show-types t/etc ); ack_sets_match( [ @args ], \@expected, 'No restrictions on type' ); }; subtest 'Only known types' => sub { local $TODO = '-k not added yet'; my $expected = <<'HERE'; t/etc/buttonhook.xml.xxx => xml t/etc/shebang.php.xxx => php t/etc/shebang.pl.xxx => perl t/etc/shebang.py.xxx => python t/etc/shebang.rb.xxx => ruby t/etc/shebang.sh.xxx => shell HERE my @expected = reslash_all( break_up_lines( $expected ) ); my @args = qw( -f -k --show-types t/etc ); ack_sets_match( [ @args ], \@expected, 'Only known types' ); }; done_testing(); ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ack-2.12/t/ack-m.t����������������������������������������������������������������������������������0000644�0000764�0000764�00000003023�12217375765�012311� 0����������������������������������������������������������������������������������������������������ustar �andy����������������������������andy�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!perl use strict; use warnings; use Test::More tests => 6; use lib 't'; use Util; prep_environment(); my @text = glob( 't/text/s*.txt' ); my $myth = File::Next::reslash( 't/text/science-of-myth.txt' ); my $happy = File::Next::reslash( 't/text/shut-up-be-happy.txt' ); my @expected = split( /\n/, <<"EOF" ); $myth:3:In the case of Christianity and Judaism there exists the belief $myth:6:The Buddhists believe that the functional aspects override the myth $myth:7:While other religions use the literal core to build foundations with $happy:10:Anyone caught outside the gates of their subdivision sector after curfew will be shot. $happy:12:Your neighborhood watch officer will be by to collect urine samples in the morning. $happy:13:Anyone gaught intefering with the collection of urine samples will be shot. EOF ack_lists_match( [ '-m', 3, '-w', 'the', @text ], \@expected, 'Should show only 3 lines per file' ); @expected = split( /\n/, <<"EOF" ); $myth:3:In the case of Christianity and Judaism there exists the belief EOF ack_lists_match( [ '-1', '-w', 'the', @text ], \@expected, 'We should only get one line back for the entire run, not just per file.' ); DASH_L: { my $target = 'the'; my @files = File::Next::reslash( 't/text' ); my @args = ( '-m', 3, '-l', '--sort-files', $target ); my @results = run_ack( @args, @files ); my @expected = map { File::Next::reslash( "t/text/$_" ) } ( '4th-of-july.txt', 'boy-named-sue.txt', 'freedom-of-choice.txt' ); is_deeply(\@results, \@expected); } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ack-2.12/t/highlighting.t���������������������������������������������������������������������������0000644�0000764�0000764�00000003156�12246427630�013764� 0����������������������������������������������������������������������������������������������������ustar �andy����������������������������andy�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!perl use warnings; use strict; use Test::More tests => 6; use lib 't'; use Util; use Term::ANSIColor; prep_environment(); my @HIGHLIGHT = qw( --color --group --sort-files ); BASIC: { my @args = qw( beliefs t/text/ ); my @expected = colorize( <<'END' ); <t/text/science-of-myth.txt> {1}:If you've ever questioned (beliefs) that you've hold, you're not alone {19}:When she was raped and cut up, left for dead in her trunk, her (beliefs) held true END my @results = run_ack( @args, @HIGHLIGHT ); is_deeply( \@results, \@expected, 'Basic highlights match' ); } METACHARACTERS: { my @args = qw( \w*din\w* t/text/ ); my @expected = colorize( <<'END' ); <t/text/4th-of-july.txt> {24}:(Riding) shotgun from town to town <t/text/me-and-bobbie-mcgee.txt> {8}:(Holdin)' Bobbie's hand in mine {24}:To be (holding) Bobbie's body next to mine <t/text/science-of-myth.txt> {14}:In fact, for better (understanding) we take the facts of science and apply them END my @results = run_ack( @args, @HIGHLIGHT ); is_deeply( \@results, \@expected, 'Metacharacters match' ); } CONTEXT: { my @args = qw( love -C1 t/text/ ); my @expected = colorize( <<'END' ); <t/text/4th-of-july.txt> {11}-You were pretty as can be, sitting in the front seat {12}:Looking at me, telling me you (love) me, {13}-And you're happy to be with me on the 4th of July <t/text/shut-up-be-happy.txt> {4}-Stay in your homes. {5}:Do not attempt to contact (love)d ones, insurance agents or attorneys. {6}-Shut up. END my @results = run_ack( @args, @HIGHLIGHT ); is_deeply( \@results, \@expected, 'Context is all good' ); } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ack-2.12/t/ack-named-pipes.t������������������������������������������������������������������������0000644�0000764�0000764�00000001466�12217205222�014244� 0����������������������������������������������������������������������������������������������������ustar �andy����������������������������andy�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!perl use strict; use warnings; use lib 't'; use File::Temp; use Test::More; use Util; sub has_mkfifo { system 'which mkfifo >/dev/null 2>/dev/null'; return $? == 0; } sub mkfifo { my ( $filename ) = @_; system 'mkfifo', $filename; } sub touch { my ( $filename ) = @_; my $fh; open $fh, '>>', $filename; close $fh; } prep_environment(); unless ( has_mkfifo() ) { plan skip_all => q{You need the 'mkfifo' command to be able to run this test}; } plan tests => 2; local $SIG{'ALRM'} = sub { fail 'Timeout'; exit; }; alarm 5; # should be plenty of time my $tempdir = File::Temp->newdir; mkdir "$tempdir/foo"; mkfifo "$tempdir/foo/test.pipe"; touch "$tempdir/foo/bar.txt"; my @results = run_ack( '-f', $tempdir ); is_deeply \@results, [ "$tempdir/foo/bar.txt", ]; ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ack-2.12/t/ack-pager.t������������������������������������������������������������������������������0000644�0000764�0000764�00000016366�12246427630�013160� 0����������������������������������������������������������������������������������������������������ustar �andy����������������������������andy�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!perl use strict; use warnings; use Cwd (); use File::Spec (); use File::Temp (); use Test::More; use lib 't'; use Util; if ( not has_io_pty() ) { plan skip_all => q{You need to install IO::Pty to run this test}; exit(0); } plan tests => 16; prep_environment(); NO_PAGER: { my @args = qw(--nocolor Sue t/text); my @expected = split /\n/, <<'END_TEXT'; t/text/boy-named-sue.txt 6:Was before he left, he went and named me Sue. 13:I tell ya, life ain't easy for a boy named Sue. 27:Sat the dirty, mangy dog that named me Sue. 34:And I said: "My name is Sue! How do you do! Now you gonna die!" 62:Cause I'm the son-of-a-bitch that named you Sue." 70:Bill or George! Anything but Sue! I still hate that name! 72: -- "A Boy Named Sue", Johnny Cash END_TEXT my @got = run_ack_interactive(@args); lists_match( \@got, \@expected, 'NO_PAGER' ); } PAGER: { my @args = qw(--nocolor --pager=./test-pager Sue t/text); my @expected = split /\n/, <<'END_TEXT'; t/text/boy-named-sue.txt 6:Was before he left, he went and named me Sue. 13:I tell ya, life ain't easy for a boy named Sue. 27:Sat the dirty, mangy dog that named me Sue. 34:And I said: "My name is Sue! How do you do! Now you gonna die!" 62:Cause I'm the son-of-a-bitch that named you Sue." 70:Bill or George! Anything but Sue! I still hate that name! 72: -- "A Boy Named Sue", Johnny Cash END_TEXT my @got = run_ack_interactive(@args); lists_match( \@got, \@expected, 'PAGER' ); } PAGER_WITH_OPTS: { my @args = ('--nocolor', '--pager=./test-pager --skip=2', 'Sue', 't/text'); my @expected = split /\n/, <<'END_TEXT'; t/text/boy-named-sue.txt 13:I tell ya, life ain't easy for a boy named Sue. 34:And I said: "My name is Sue! How do you do! Now you gonna die!" 70:Bill or George! Anything but Sue! I still hate that name! END_TEXT my @got = run_ack_interactive(@args); lists_match( \@got, \@expected, 'PAGER_WITH_OPTS' ); } FORCE_NO_PAGER: { my @args = ('--nocolor', '--pager=./test-pager --skip=2', '--nopager', 'Sue', 't/text'); my @expected = split /\n/, <<'END_TEXT'; t/text/boy-named-sue.txt 6:Was before he left, he went and named me Sue. 13:I tell ya, life ain't easy for a boy named Sue. 27:Sat the dirty, mangy dog that named me Sue. 34:And I said: "My name is Sue! How do you do! Now you gonna die!" 62:Cause I'm the son-of-a-bitch that named you Sue." 70:Bill or George! Anything but Sue! I still hate that name! 72: -- "A Boy Named Sue", Johnny Cash END_TEXT my @got = run_ack_interactive(@args); lists_match( \@got, \@expected, 'FORCE_NO_PAGER' ); } PAGER_ENV: { local $ENV{'ACK_PAGER'} = './test-pager --skip=2'; local $TODO = q{Setting ACK_PAGER in tests won't work for the time being}; my @args = ('--nocolor', 'Sue', 't/text'); my @expected = split /\n/, <<'END_TEXT'; t/text/boy-named-sue.txt 13:I tell ya, life ain't easy for a boy named Sue. 34:And I said: "My name is Sue! How do you do! Now you gonna die!" 70:Bill or George! Anything but Sue! I still hate that name! END_TEXT my @got = run_ack_interactive(@args); lists_match( \@got, \@expected, 'PAGER_ENV' ); } PAGER_ENV_OVERRIDE: { local $ENV{'ACK_PAGER'} = './test-pager --skip=2'; my @args = ('--nocolor', '--nopager', 'Sue', 't/text'); my @expected = split /\n/, <<'END_TEXT'; t/text/boy-named-sue.txt 6:Was before he left, he went and named me Sue. 13:I tell ya, life ain't easy for a boy named Sue. 27:Sat the dirty, mangy dog that named me Sue. 34:And I said: "My name is Sue! How do you do! Now you gonna die!" 62:Cause I'm the son-of-a-bitch that named you Sue." 70:Bill or George! Anything but Sue! I still hate that name! 72: -- "A Boy Named Sue", Johnny Cash END_TEXT my @got = run_ack_interactive(@args); lists_match( \@got, \@expected, 'PAGER_ENV_OVERRIDE' ); } PAGER_ACKRC: { my @args = ('--nocolor', 'Sue', 't/text'); my $ackrc = <<'END_ACKRC'; --pager=./test-pager --skip=2 END_ACKRC my @expected = split /\n/, <<'END_TEXT'; t/text/boy-named-sue.txt 13:I tell ya, life ain't easy for a boy named Sue. 34:And I said: "My name is Sue! How do you do! Now you gonna die!" 70:Bill or George! Anything but Sue! I still hate that name! END_TEXT my @got = run_ack_interactive(@args, { ackrc => \$ackrc, }); lists_match( \@got, \@expected, 'PAGER_ACKRC' ); } PAGER_ACKRC_OVERRIDE: { my @args = ('--nocolor', '--nopager', 'Sue', 't/text'); my $ackrc = <<'END_ACKRC'; --pager=./test-pager --skip=2 END_ACKRC my @expected = split /\n/, <<'END_TEXT'; t/text/boy-named-sue.txt 6:Was before he left, he went and named me Sue. 13:I tell ya, life ain't easy for a boy named Sue. 27:Sat the dirty, mangy dog that named me Sue. 34:And I said: "My name is Sue! How do you do! Now you gonna die!" 62:Cause I'm the son-of-a-bitch that named you Sue." 70:Bill or George! Anything but Sue! I still hate that name! 72: -- "A Boy Named Sue", Johnny Cash END_TEXT my @got = run_ack_interactive(@args, { ackrc => \$ackrc, }); lists_match( \@got, \@expected, 'PAGER_ACKRC_OVERRIDE' ); } PAGER_NOENV: { local $ENV{'ACK_PAGER'} = './test-pager --skip=2'; my @args = ('--nocolor', '--noenv', 'Sue', 't/text'); my @expected = split /\n/, <<'END_TEXT'; t/text/boy-named-sue.txt 6:Was before he left, he went and named me Sue. 13:I tell ya, life ain't easy for a boy named Sue. 27:Sat the dirty, mangy dog that named me Sue. 34:And I said: "My name is Sue! How do you do! Now you gonna die!" 62:Cause I'm the son-of-a-bitch that named you Sue." 70:Bill or George! Anything but Sue! I still hate that name! 72: -- "A Boy Named Sue", Johnny Cash END_TEXT my @got = run_ack_interactive(@args); lists_match( \@got, \@expected, 'PAGER_NOENV' ); } my $wd = Cwd::getcwd(); my $tempdir = File::Temp->newdir; my $pager = File::Spec->rel2abs('test-pager'); mkdir File::Spec->catdir($tempdir->dirname, 'subdir'); PROJECT_ACKRC_PAGER_FORBIDDEN: { my @files = ( File::Spec->rel2abs('t/text/') ); my @args = qw/ --env question(\\S+) /; chdir $tempdir->dirname; write_file '.ackrc', "--pager=$pager\n"; my ( $stdout, $stderr ) = run_ack_with_stderr(@args, @files); is_empty_array( $stdout ); is_nonempty_array( $stderr ); like( $stderr->[0], qr/--pager is illegal in project ackrcs/ ) or diag(explain($stderr)); chdir $wd; } HOME_ACKRC_PAGER_PERMITTED: { my @files = ( File::Spec->rel2abs('t/text/') ); my @args = qw/ --env question(\\S+) /; write_file(File::Spec->catfile($tempdir->dirname, '.ackrc'), "--pager=$pager\n"); chdir File::Spec->catdir($tempdir->dirname, 'subdir'); local $ENV{'HOME'} = $tempdir->dirname; my ( $stdout, $stderr ) = run_ack_with_stderr(@args, @files); is_nonempty_array( $stdout ); is_empty_array( $stderr ); chdir $wd; } ACKRC_ACKRC_PAGER_PERMITTED: { my @files = ( File::Spec->rel2abs('t/text/') ); my @args = qw/ --env question(\\S+) /; write_file(File::Spec->catfile($tempdir->dirname, '.ackrc'), "--pager=$pager\n"); chdir File::Spec->catdir($tempdir->dirname, 'subdir'); local $ENV{'ACKRC'} = File::Spec->catfile($tempdir->dirname, '.ackrc'); my ( $stdout, $stderr ) = run_ack_with_stderr(@args, @files); is_nonempty_array( $stdout ); is_empty_array( $stderr ); chdir $wd; } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ack-2.12/t/ack-i.t����������������������������������������������������������������������������������0000644�0000764�0000764�00000001076�12217375765�012313� 0����������������������������������������������������������������������������������������������������ustar �andy����������������������������andy�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!perl use strict; use warnings; use lib 't'; use Util; use Test::More tests => 4; prep_environment(); my @expected = ( 't/swamp/groceries/fruit:1:apple', 't/swamp/groceries/junk:1:apple fritters', ); my @targets = map { "t/swamp/groceries/$_" } qw/fruit junk meat/; my @args = ( qw( --nocolor APPLE -i ), @targets ); my @results = run_ack( @args ); lists_match( \@results, \@expected, '-i flag' ); @args = ( qw( --nocolor APPLE --ignore-case ), @targets ); @results = run_ack( @args ); lists_match( \@results, \@expected, '--ignore-case flag' ); ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ack-2.12/t/lib/�������������������������������������������������������������������������������������0000755�0000764�0000764�00000000000�12247354203�011667� 5����������������������������������������������������������������������������������������������������ustar �andy����������������������������andy�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ack-2.12/t/lib/Resources.t��������������������������������������������������������������������������0000644�0000764�0000764�00000000262�12217205337�014026� 0����������������������������������������������������������������������������������������������������ustar �andy����������������������������andy�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!perl -T use strict; use warnings; use Test::More tests => 1; use App::Ack::Resources; pass( 'App::Ack::Resources loaded with nothing else loaded first' ); done_testing(); ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ack-2.12/t/lib/Basic.t������������������������������������������������������������������������������0000644�0000764�0000764�00000000276�12217205325�013077� 0����������������������������������������������������������������������������������������������������ustar �andy����������������������������andy�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!perl -T use strict; use warnings; use Test::More tests => 1; use App::Ack::Resource::Basic; pass( 'App::Ack::Resource::Basic loaded with nothing else loaded first' ); done_testing(); ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ack-2.12/t/lib/Collection.t�������������������������������������������������������������������������0000644�0000764�0000764�00000000304�12246427630�014150� 0����������������������������������������������������������������������������������������������������ustar �andy����������������������������andy�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!perl -T use strict; use warnings; use Test::More tests => 1; use App::Ack::Filter::Collection; pass( 'App::Ack::Filter::Collection loaded with nothing else loaded first' ); done_testing(); ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ack-2.12/t/lib/00-coverage.t������������������������������������������������������������������������0000644�0000764�0000764�00000000775�12246427630�014101� 0����������������������������������������������������������������������������������������������������ustar �andy����������������������������andy�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!perl # Make sure we have a .t file each *.pm. This prevents a forgetful # developer from creating a .pm without making the test, too. # If you've made this test fail, it's because you need a t/lib/*.t # file to test your new module. use warnings; use strict; use Test::More; my @pms = glob( '*.pm' ); @pms = grep { !/Debug.pm/ } @pms; plan tests => scalar @pms; for my $pm ( @pms ) { my $t = $pm; $t =~ s/\.pm$/.t/; ok( -r "t/lib/$t", "$pm has a corresponding $t" ); } done_testing(); ���ack-2.12/t/lib/Default.t����������������������������������������������������������������������������0000644�0000764�0000764�00000000276�12217205330�013436� 0����������������������������������������������������������������������������������������������������ustar �andy����������������������������andy�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!perl -T use strict; use warnings; use Test::More tests => 1; use App::Ack::Filter::Default; pass( 'App::Ack::Filter::Default loaded with nothing else loaded first' ); done_testing(); ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ack-2.12/t/lib/Extension.t��������������������������������������������������������������������������0000644�0000764�0000764�00000000302�12217205331�014015� 0����������������������������������������������������������������������������������������������������ustar �andy����������������������������andy�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!perl -T use strict; use warnings; use Test::More tests => 1; use App::Ack::Filter::Extension; pass( 'App::Ack::Filter::Extension loaded with nothing else loaded first' ); done_testing(); ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ack-2.12/t/lib/Inverse.t����������������������������������������������������������������������������0000644�0000764�0000764�00000000276�12217205334�013471� 0����������������������������������������������������������������������������������������������������ustar �andy����������������������������andy�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!perl -T use strict; use warnings; use Test::More tests => 1; use App::Ack::Filter::Inverse; pass( 'App::Ack::Filter::Inverse loaded with nothing else loaded first' ); done_testing(); ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ack-2.12/t/lib/Resource.t���������������������������������������������������������������������������0000644�0000764�0000764�00000000260�12217205336�013640� 0����������������������������������������������������������������������������������������������������ustar �andy����������������������������andy�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!perl -T use strict; use warnings; use Test::More tests => 1; use App::Ack::Resource; pass( 'App::Ack::Resource loaded with nothing else loaded first' ); done_testing(); ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ack-2.12/t/lib/ConfigLoader.t�����������������������������������������������������������������������0000644�0000764�0000764�00000000270�12217205327�014406� 0����������������������������������������������������������������������������������������������������ustar �andy����������������������������andy�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!perl -T use strict; use warnings; use Test::More tests => 1; use App::Ack::ConfigLoader; pass( 'App::Ack::ConfigLoader loaded with nothing else loaded first' ); done_testing(); ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ack-2.12/t/lib/Is.t���������������������������������������������������������������������������������0000644�0000764�0000764�00000000264�12217205334�012426� 0����������������������������������������������������������������������������������������������������ustar �andy����������������������������andy�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!perl -T use strict; use warnings; use Test::More tests => 1; use App::Ack::Filter::Is; pass( 'App::Ack::Filter::Is loaded with nothing else loaded first' ); done_testing(); ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ack-2.12/t/lib/ConfigDefault.t����������������������������������������������������������������������0000644�0000764�0000764�00000000272�12217205326�014565� 0����������������������������������������������������������������������������������������������������ustar �andy����������������������������andy�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!perl -T use strict; use warnings; use Test::More tests => 1; use App::Ack::ConfigDefault; pass( 'App::Ack::ConfigDefault loaded with nothing else loaded first' ); done_testing(); ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ack-2.12/t/lib/ExtensionGroup.t���������������������������������������������������������������������0000644�0000764�0000764�00000000314�12246427630�015047� 0����������������������������������������������������������������������������������������������������ustar �andy����������������������������andy�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!perl -T use strict; use warnings; use Test::More tests => 1; use App::Ack::Filter::ExtensionGroup; pass( 'App::Ack::Filter::ExtensionGroup loaded with nothing else loaded first' ); done_testing(); ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ack-2.12/t/lib/Ack.t��������������������������������������������������������������������������������0000644�0000764�0000764�00000000234�12217205324�012545� 0����������������������������������������������������������������������������������������������������ustar �andy����������������������������andy�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!perl -T use strict; use warnings; use Test::More tests => 1; use App::Ack; pass( 'App::Ack loaded with nothing else loaded first' ); done_testing(); ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ack-2.12/t/lib/Filter.t�����������������������������������������������������������������������������0000644�0000764�0000764�00000000254�12217205332�013275� 0����������������������������������������������������������������������������������������������������ustar �andy����������������������������andy�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!perl -T use strict; use warnings; use Test::More tests => 1; use App::Ack::Filter; pass( 'App::Ack::Filter loaded with nothing else loaded first' ); done_testing(); ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ack-2.12/t/lib/ConfigFinder.t�����������������������������������������������������������������������0000644�0000764�0000764�00000000270�12217205327�014407� 0����������������������������������������������������������������������������������������������������ustar �andy����������������������������andy�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!perl -T use strict; use warnings; use Test::More tests => 1; use App::Ack::ConfigFinder; pass( 'App::Ack::ConfigFinder loaded with nothing else loaded first' ); done_testing(); ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ack-2.12/t/lib/FirstLineMatch.t���������������������������������������������������������������������0000644�0000764�0000764�00000000314�12217205333�014722� 0����������������������������������������������������������������������������������������������������ustar �andy����������������������������andy�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!perl -T use strict; use warnings; use Test::More tests => 1; use App::Ack::Filter::FirstLineMatch; pass( 'App::Ack::Filter::FirstLineMatch loaded with nothing else loaded first' ); done_testing(); ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ack-2.12/t/lib/IsGroup.t����������������������������������������������������������������������������0000644�0000764�0000764�00000000276�12246427630�013455� 0����������������������������������������������������������������������������������������������������ustar �andy����������������������������andy�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!perl -T use strict; use warnings; use Test::More tests => 1; use App::Ack::Filter::IsGroup; pass( 'App::Ack::Filter::IsGroup loaded with nothing else loaded first' ); done_testing(); ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ack-2.12/t/lib/Match.t������������������������������������������������������������������������������0000644�0000764�0000764�00000000272�12217205335�013107� 0����������������������������������������������������������������������������������������������������ustar �andy����������������������������andy�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!perl -T use strict; use warnings; use Test::More tests => 1; use App::Ack::Filter::Match; pass( 'App::Ack::Filter::Match loaded with nothing else loaded first' ); done_testing(); ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ack-2.12/t/ack-invalid-ackrc.t����������������������������������������������������������������������0000644�0000764�0000764�00000004236�12217375765�014573� 0����������������������������������������������������������������������������������������������������ustar �andy����������������������������andy�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!perl use strict; use warnings; use Cwd qw(getcwd); use File::Temp; use List::Util qw(sum); use Test::More; use lib 't'; use Util; plan skip_all => q{Don't yet have a reliable way to ignore the Unicode complaints from Pod::Perldoc}; my @types = ( perl => [qw{.pl .pod .pl .t}], python => [qw{.py}], ruby => [qw{.rb Rakefile}], ); plan tests => sum(map { ref($_) ? scalar(@$_) : 1 } @types) + 14; prep_environment(); my $wd = getcwd(); my $tempdir = File::Temp->newdir; chdir $tempdir->dirname; write_file '.ackrc', "--frobnicate\n"; my $output; $output = run_ack( '--env', '--help' ); like $output, qr/Usage: ack/; { my $stderr; ( $output, $stderr ) = run_ack_with_stderr( '--env', '--help-types' ); like join("\n", @{$output}), qr/Usage: ack/; $stderr = join("\n", @{$stderr}); like $stderr, qr/Unknown option: frobnicate/; # the following was shamelessly copied from ack-help-types.t for (my $i = 0; $i < @types; $i += 2) { my ( $type, $checks ) = @types[ $i , $i + 1 ]; my ( $matching_line ) = grep { /--\[no\]$type/ } @{$output}; ok $matching_line; foreach my $check (@{$checks}) { like $matching_line, qr/\Q$check\E/; } } } { ($output, my $stderr) = run_ack_with_stderr( '--env', '--man' ); # Don't worry if man complains about long lines, # or if the terminal doesn't handle Unicode: is( scalar(grep !/can't\ break\ line |Wide\ character\ in\ print |Unknown\ escape\ E<0x[[:xdigit:]]+>/x, @{$stderr}), 0, 'Should have no output to stderr: ack --env --man' ) or diag( join( "\n", 'STDERR:', @{$stderr} ) ); if ( is_windows() ) { like join("\n", @{$output}[0,1]), qr/^NAME\s+ack(?:-standalone)?\s/; } else { like $output->[0], qr/ACK(?:-STANDALONE)?\Q(1)\E/; } } $output = run_ack( '--env', '--thpppt' ); like $output, qr/ack --thpppt/; $output = run_ack( '--env', '--bar' ); like $output, qr/It's a grep/; $output = run_ack( '--env', '--cathy' ); like $output, qr/CHOCOLATE/; $output = run_ack( '--env', '--version' ); like $output, qr/ack 2[.]\d+/; chdir $wd; ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ack-2.12/t/ack-x.t����������������������������������������������������������������������������������0000644�0000764�0000764�00000012631�12246427630�012320� 0����������������������������������������������������������������������������������������������������ustar �andy����������������������������andy�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!perl use strict; use warnings; use File::Next (); use File::Spec (); use Test::More tests => 2; use lib 't'; use Util; sub do_parent { my %params = @_; my ( $stdout_read, $stderr_read, $stdout_lines, $stderr_lines ) = @params{qw/stdout_read stderr_read stdout_lines stderr_lines/}; while ( $stdout_read || $stderr_read ) { my $rin = ''; vec( $rin, fileno($stdout_read), 1 ) = 1 if $stdout_read; vec( $rin, fileno($stderr_read), 1 ) = 1 if $stderr_read; select( $rin, undef, undef, undef ); if ( $stdout_read && vec( $rin, fileno($stdout_read), 1 ) ) { my $line = <$stdout_read>; if ( defined( $line ) ) { push @{$stdout_lines}, $line; } else { close $stdout_read; undef $stdout_read; } } if ( $stderr_read && vec( $rin, fileno($stderr_read), 1 ) ) { my $line = <$stderr_read>; if ( defined( $line ) ) { push @{$stderr_lines}, $line; } else { close $stderr_read; undef $stderr_read; } } } chomp @{$stdout_lines}; chomp @{$stderr_lines}; } prep_environment(); my $freedom = File::Next::reslash( 't/text/freedom-of-choice.txt' ); my $fourth = File::Next::reslash( 't/text/4th-of-july.txt' ); my $science = File::Next::reslash( 't/text/science-of-myth.txt' ); my @expected = split /\n/, <<"EOF"; $freedom:1:A victim of collision on the open sea $freedom:3:Sink, swim, go down with the ship $freedom:6:I'll say it again in the land of the free $freedom:15:He licked the other $freedom:24:Seems to be the rule of thumb $freedom:28:I'll say it again in the land of the free $freedom:41:He licked the other $fourth:1:Alone with the morning burning red $fourth:2:On the canvas in my head $fourth:6:Just the road and its majesty $fourth:8:With the world in the rear view $fourth:11:You were pretty as can be, sitting in the front seat $fourth:13:And you're happy to be with me on the 4th of July $fourth:14:We sang "Stranglehold" to the stereo $fourth:19:Get drawn into the sun $fourth:22:And there you were $fourth:25:Staking a claim on the world we found $fourth:28:You were out of the blue to a boy like me $fourth:33:In the silence that we shared $science:3:In the case of Christianity and Judaism there exists the belief $science:6:The Buddhists believe that the functional aspects override the myth $science:7:While other religions use the literal core to build foundations with $science:8:See, half the world sees the myth as fact, and it's seen as a lie by the other half $science:9:And the simple truth is that it's none of that 'cause $science:10:Somehow no matter what the world keeps turning $science:14:In fact, for better understanding we take the facts of science and apply them $science:15:And if both factors keep evolving then we continue getting information $science:16:But closing off the possibilities makes it hard to see the bigger picture $science:18:Consider the case of the woman whose faith helped her make it through $science:22:And if it works, then it gets the job done $science:23:Somehow no matter what the world keeps turning EOF # XXX I don't care for doing all this low-level stuff outside of Util my @lhs_args = ( $^X, '-Mblib', build_ack_invocation( '-g', 'of', 't/text' ) ); my @rhs_args = ( $^X, '-Mblib', build_ack_invocation( '-x', 'the' ) ); # for now if ( $ENV{'ACK_TEST_STANDALONE'} ) { @lhs_args = grep { $_ ne '-Mblib' } @lhs_args; @rhs_args = grep { $_ ne '-Mblib' } @rhs_args; } my ($stdout, $stderr); if ( is_windows() ) { ($stdout, $stderr) = run_cmd("@lhs_args | @rhs_args"); } else { my ( $stdout_read, $stdout_write ); my ( $stderr_read, $stderr_write ); my ( $lhs_rhs_read, $lhs_rhs_write ); pipe( $stdout_read, $stdout_write ); pipe( $stderr_read, $stderr_write ); pipe( $lhs_rhs_read, $lhs_rhs_write ); my $lhs_pid; my $rhs_pid; $lhs_pid = fork(); if ( !defined($lhs_pid) ) { die 'Unable to fork'; } if ( $lhs_pid ) { $rhs_pid = fork(); if ( !defined($rhs_pid) ) { kill TERM => $lhs_pid; waitpid $lhs_pid, 0; die 'Unable to fork'; } } if ( $rhs_pid ) { # parent close $stdout_write; close $stderr_write; close $lhs_rhs_write; close $lhs_rhs_read; do_parent( stdout_read => $stdout_read, stderr_read => $stderr_read, stdout_lines => ($stdout = []), stderr_lines => ($stderr = []), ); waitpid $lhs_pid, 0; waitpid $rhs_pid, 0; } elsif ( $lhs_pid ) { # right-hand-side child close $stdout_read; close $stderr_read; close $stderr_write; close $lhs_rhs_write; open STDIN, '<&', $lhs_rhs_read or die "Can't open: $!"; open STDOUT, '>&', $stdout_write or die "Can't open: $!"; close STDERR; exec @rhs_args; } else { # left-hand side child close $stdout_read; close $stdout_write; close $lhs_rhs_read; close $stderr_read; open STDOUT, '>&', $lhs_rhs_write or die "Can't open: $!"; open STDERR, '>&', $stderr_write or die "Can't open: $!"; close STDIN; exec @lhs_args; } } sets_match( $stdout, \@expected, __FILE__ ); is_empty_array( $stderr ); �������������������������������������������������������������������������������������������������������ack-2.12/t/match-filter.t���������������������������������������������������������������������������0000644�0000764�0000764�00000000477�12215743470�013700� 0����������������������������������������������������������������������������������������������������ustar �andy����������������������������andy�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!perl use strict; use warnings; use lib 't'; use FilterTest; use Test::More tests => 1; use App::Ack::Filter::Match; filter_test( [ match => '/^.akefile/' ], [ 't/swamp/Makefile', 't/swamp/Makefile.PL', 't/swamp/Rakefile', ], 'only files matching /^.akefile/ should be matched', ); �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ack-2.12/t/ack-line.t�������������������������������������������������������������������������������0000644�0000764�0000764�00000011403�12246427630�012774� 0����������������������������������������������������������������������������������������������������ustar �andy����������������������������andy�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!perl use warnings; use strict; use Test::More; use lib 't'; use Util; if ( not has_io_pty() ) { plan skip_all => q{You need to install IO::Pty to run this test}; exit(0); } plan tests => 17; prep_environment(); LINE_1: { my @expected = ( 'Well, my daddy left home when I was three', ); my @files = qw( t/text/boy-named-sue.txt ); my @args = qw( --lines=1 ); ack_sets_match( [ @args, @files ], \@expected, 'Looking for line 1' ); } LINE_1_AND_5: { my @expected = ( 'Well, my daddy left home when I was three', 'But the meanest thing that he ever did', ); my @files = qw( t/text/boy-named-sue.txt ); my @args = qw( --lines=1 --lines=5 ); ack_sets_match( [ @args, @files ], \@expected, 'Looking for lines 1 and 5' ); } LINE_1_COMMA_5: { my @expected = ( 'Well, my daddy left home when I was three', 'But the meanest thing that he ever did', ); my @files = qw( t/text/boy-named-sue.txt ); my @args = ( '--lines=1,5' ); ack_sets_match( [ @args, @files ], \@expected, 'Looking for lines 1, 5' ); } LINE_1_TO_5: { my @expected = split( /\n/, <<"EOF" ); Well, my daddy left home when I was three And he didn't leave very much for my Ma and me 'cept an old guitar and an empty bottle of booze. Now, I don't blame him 'cause he run and hid But the meanest thing that he ever did EOF my @files = qw( t/text/boy-named-sue.txt ); my @args = qw( --lines=1-5 ); ack_sets_match( [ @args, @files ], \@expected, 'Looking for lines 1 to 5' ); } LINE_1_TO_5_CONTEXT: { my @expected = split( /\n/, <<"EOF" ); Well, my daddy left home when I was three And he didn't leave very much for my Ma and me 'cept an old guitar and an empty bottle of booze. Now, I don't blame him 'cause he run and hid But the meanest thing that he ever did EOF my @files = qw( t/text/boy-named-sue.txt ); my @args = qw( --lines=3 -C ); ack_lists_match( [ @files, @args ], \@expected, 'Looking for line 3 with two lines of context' ); } LINE_1_AND_5_AND_NON_EXISTENT: { my @expected = ( 'Well, my daddy left home when I was three', 'But the meanest thing that he ever did', ); my @files = qw( t/text/boy-named-sue.txt ); my @args = ( '--lines=1,5,1000' ); ack_sets_match( [ @args, @files ], \@expected, 'Looking for non existent line' ); } LINE_AND_PASSTHRU: { my @expected = split( /\n/, <<"EOF" ); =head1 Dummy document =head2 There's important stuff in here! EOF my @files = qw( t/swamp/perl.pod ); my @args = qw( --lines=2 --passthru ); ack_lists_match( [ @args, @files ], \@expected, 'Checking --passthru behaviour with --line' ); } LINE_1_MULTIPLE_FILES: { my @target_file = ( File::Next::reslash( 't/swamp/c-header.h' ), File::Next::reslash( 't/swamp/c-source.c' ) ); my @expected = split( /\n/, <<"EOF" ); $target_file[0]:1:/* perl.h $target_file[1]:1:/* A Bison parser, made from plural.y EOF my @files = qw( t/swamp/ ); my @args = qw( --cc --lines=1 ); ack_sets_match( [ @args, @files ], \@expected, 'Looking for first line in multiple files' ); } LINE_1_CONTEXT: { my @target_file = ( File::Next::reslash( 't/swamp/c-header.h' ), File::Next::reslash( 't/swamp/c-source.c' ) ); my @expected = split( /\n/, <<"EOF" ); $target_file[0]:1:/* perl.h $target_file[0]-2- * $target_file[0]-3- * Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998, 1999, $target_file[0]-4- * 2000, 2001, 2002, 2003, 2004, 2005, 2006, by Larry Wall and others -- $target_file[1]:1:/* A Bison parser, made from plural.y $target_file[1]-2- by GNU Bison version 1.28 */ $target_file[1]-3- $target_file[1]-4-#define YYBISON 1 /* Identify Bison output. */ EOF my @files = qw( t/swamp/ ); my @args = qw( --cc --lines=1 --after=3 --sort ); ack_lists_match( [ @args, @files ], \@expected, 'Looking for first line in multiple files' ); } LINE_NO_WARNINGS: { my @expected = ( 'Well, my daddy left home when I was three', ); my @files = qw( t/text/boy-named-sue.txt ); my @args = qw( --lines=1 ); my @output = run_ack_interactive( @args, @files ); is scalar(@output), 1, 'There must be exactly one line of output (with no warnings)'; } LINE_WITH_REGEX: { # Specifying both --line and a regex should result in an error. my @files = qw( t/text/boy-named-sue.txt ); my @args = qw( --lines=1 --match Sue ); my ($stdout, $stderr) = run_ack_with_stderr( @args, @files ); isnt( get_rc(), 0, 'Specifying both --line and --match must lead to an error RC' ); is_empty_array( $stdout, 'No normal output' ); is( scalar @{$stderr}, 1, 'One line of stderr output' ); like( $stderr->[0], qr/\Q(Sue)/, 'Error message must contain "(Sue)"' ); } done_testing(); �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ack-2.12/t/ack-show-types.t�������������������������������������������������������������������������0000644�0000764�0000764�00000001266�12217375765�014206� 0����������������������������������������������������������������������������������������������������ustar �andy����������������������������andy�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!perl use warnings; use strict; use Test::More tests => 6; use lib 't'; use Util; prep_environment(); my @exp_types = qw{ rake ruby }; sub get_types { my $line = shift; $line =~ s/.* => //; my @types = split( /,/, $line ); return \@types; } sub do_test { local $Test::Builder::Level = $Test::Builder::Level + 1; my @args = @_; my @results = run_ack( @args ); is( scalar @results, 1, "Only one file should be returned from 'ack @args'" ); sets_match( get_types( $results[0] ), \@exp_types , "'ack @args' must return all the expected types" ); } do_test( qw{ -f --show-types t/swamp/Rakefile } ); do_test( qw{ -g \bRakef --show-types t/swamp } ); ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ack-2.12/t/ack-s.t����������������������������������������������������������������������������������0000644�0000764�0000764�00000001125�12246427630�012307� 0����������������������������������������������������������������������������������������������������ustar �andy����������������������������andy�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!perl use strict; use warnings; use Test::More tests => 3; use lib 't'; use Util; prep_environment(); WITHOUT_S: { my @files = qw( non-existent-file.txt ); my @args = qw( search-term ); my (undef, $stderr) = run_ack_with_stderr( @args, @files ); is( @{$stderr}, 1 ); like( $stderr->[0], qr/\Qnon-existent-file.txt: No such file or directory\E/, q{Error if there's no file} ); } WITH_S: { my @files = qw( non-existent-file.txt ); my @args = qw( search-term -s ); my (undef, $stderr) = run_ack_with_stderr( @args, @files ); is_empty_array( $stderr ); } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ack-2.12/t/anchored.t�������������������������������������������������������������������������������0000644�0000764�0000764�00000002111�12217375765�013101� 0����������������������������������������������������������������������������������������������������ustar �andy����������������������������andy�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!perl # Make sure beginning-of-line anchor works use strict; use warnings; use Test::More tests => 5; use lib 't'; use Util; prep_environment(); my @files = qw( t/text ); FRONT_ANCHORED: { my @args = qw( -h -i ^science ); my @expected = split( /\n/, <<'EOF' ); Science and religion are not mutually exclusive EOF ack_lists_match( [ @args, @files ], \@expected, 'Looking for front-anchored "science"' ); } BACK_ANCHORED: { my @args = qw( -h -i done$ ); my @expected = split( /\n/, <<'EOF' ); Through all kinds of weather and everything we done And if it works, then it gets the job done EOF ack_sets_match( [ @args, @files ], \@expected, 'Looking for back-anchored "done"' ); } UNANCHORED: { my @args = qw( -h -i science ); my @expected = split( /\n/, <<'EOF' ); Science and religion are not mutually exclusive In fact, for better understanding we take the facts of science and apply them -- "The Science Of Myth", Screeching Weasel EOF ack_lists_match( [ @args, @files ], \@expected, 'Looking for unanchored science' ); } done_testing(); �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ack-2.12/t/ack-match.t������������������������������������������������������������������������������0000644�0000764�0000764�00000006075�12246427630�013152� 0����������������������������������������������������������������������������������������������������ustar �andy����������������������������andy�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!perl use strict; use warnings; use Cwd (); use File::Spec (); use File::Temp (); use Test::More; use lib 't'; use Util; prep_environment(); my @files = qw( t/text ); my @tests = ( [ qw/Sue/ ], [ qw/boy -i/ ], # case-insensitive is handled correctly with --match [ qw/ll+ -Q/ ], # quotemeta is handled correctly with --match [ qw/gon -w/ ], # words is handled correctly with --match ); plan tests => @tests + 11; test_match( @{$_} ) for @tests; # Giving only the --match argument (and no other args) should not result in an error. run_ack( '--match', 'Sue' ); # Not giving a regex when piping into ack should result in an error. my ($stdout, $stderr) = pipe_into_ack_with_stderr( 't/text/4th-of-july.txt', '--perl' ); isnt( get_rc(), 0, 'ack should return an error when piped into without a regex' ); is_empty_array( $stdout, 'ack should return no STDOUT when piped into without a regex' ); is( scalar @{$stderr}, 1, 'ack should return one line of error message when piped into without a regex' ) or diag(explain($stderr)); my $wd = Cwd::getcwd(); my $tempdir = File::Temp->newdir; mkdir File::Spec->catdir($tempdir->dirname, 'subdir'); PROJECT_ACKRC_MATCH_FORBIDDEN: { my @files = ( File::Spec->rel2abs('t/text/') ); my @args = qw/ --env /; chdir $tempdir->dirname; write_file '.ackrc', "--match=question\n"; my ( $stdout, $stderr ) = run_ack_with_stderr(@args, @files); is_empty_array( $stdout ); is_nonempty_array( $stderr ); like( $stderr->[0], qr/--match is illegal in project ackrcs/ ) or diag(explain($stderr)); chdir $wd; } HOME_ACKRC_MATCH_PERMITTED: { my @files = ( File::Spec->rel2abs('t/text/') ); my @args = qw/ --env /; write_file(File::Spec->catfile($tempdir->dirname, '.ackrc'), "--match=question\n"); chdir File::Spec->catdir($tempdir->dirname, 'subdir'); local $ENV{'HOME'} = $tempdir->dirname; my ( $stdout, $stderr ) = run_ack_with_stderr(@args, @files); is_nonempty_array( $stdout ); is_empty_array( $stderr ); chdir $wd; } ACKRC_ACKRC_MATCH_PERMITTED: { my @files = ( File::Spec->rel2abs('t/text/') ); my @args = qw/ --env /; write_file(File::Spec->catfile($tempdir->dirname, '.ackrc'), "--match=question\n"); chdir File::Spec->catdir($tempdir->dirname, 'subdir'); local $ENV{'ACKRC'} = File::Spec->catfile($tempdir->dirname, '.ackrc'); my ( $stdout, $stderr ) = run_ack_with_stderr(@args, @files); is_nonempty_array( $stdout ); is_empty_array( $stderr ); chdir $wd; } done_testing; # Call ack normally and compare output to calling with --match regex. # # Due to 2 calls to run_ack, this sub runs altogether 3 tests. sub test_match { local $Test::Builder::Level = $Test::Builder::Level + 1; my $regex = shift; my @args = @_; return subtest "test_match( @args )" => sub { my @results_normal = run_ack( @args, $regex, @files ); my @results_match = run_ack( @args, @files, '--match', $regex ); return sets_match( \@results_normal, \@results_match, "Same output for regex '$regex'." ); }; } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ack-2.12/t/config-backwards-compat.t����������������������������������������������������������������0000644�0000764�0000764�00000001661�12246427630�016003� 0����������������������������������������������������������������������������������������������������ustar �andy����������������������������andy�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!perl use strict; use warnings; use lib 't'; use Util; use File::Temp; use Test::More tests => 3; prep_environment(); my $old_config = <<'END_CONFIG'; # Always sort --sort-files # I'm tired of grouping --noheading --break # Handle .pmc files --type-set=pmc=.pmc # Handle .hwd files --type-set=hwd=.hwd # Handle .md files --type-set=md=.mkd --type-add=md=.md # Handle .textile files --type-set=textile=.textile # Hooray for smart-case! --smart-case --ignore-dir=nytprof END_CONFIG my $temp_config = File::Temp->new; print { $temp_config } $old_config; close $temp_config; my @args = ( '--ackrc=' . $temp_config->filename, '--md', 'One', 't/swamp/' ); my $file = File::Next::reslash('t/swamp/notes.md'); my $line = 3; my ( $stdout, $stderr ) = run_ack_with_stderr( @args ); is( scalar(@{$stdout}), 1, 'Got back exactly one line' ); like $stdout->[0], qr/\Q$file:$line\E.*[*] One/; is_empty_array( $stderr, 'No output to stderr' ); �������������������������������������������������������������������������������ack-2.12/t/ack-w.t����������������������������������������������������������������������������������0000644�0000764�0000764�00000002262�12217205242�012305� 0����������������������������������������������������������������������������������������������������ustar �andy����������������������������andy�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!perl use warnings; use strict; use Test::More tests => 6; use lib 't'; use Util; prep_environment(); TRAILING_PUNC: { my @expected = ( 'And I said: "My name is Sue! How do you do! Now you gonna die!"', 'Bill or George! Anything but Sue! I still hate that name!', ); my @files = qw( t/text ); my @args = qw( Sue! -w -h ); ack_lists_match( [ @args, @files ], \@expected, 'Looking for Sue!' ); } TRAILING_METACHAR_BACKSLASH_W: { my @expected = ( 'At an old saloon on a street of mud,', 'Kicking and a-gouging in the mud and the blood and the beer.', ); my @files = qw( t/text ); my @args = qw( mu\w -w -h ); ack_lists_match( [ @args, @files ], \@expected, 'Looking for mu\\w' ); } TRAILING_METACHAR_DOT: { local $TODO = q{I can't figure why the -w works from the command line, but not inside this test}; my @expected = ( 'At an old saloon on a street of mud,', 'Kicking and a-gouging in the mud and the blood and the beer.', ); my @files = qw( t/text ); my @args = ( 'mu.', qw( -w -h ) ); ack_lists_match( [ @args, @files ], \@expected, 'Looking for mu.' ); } done_testing(); ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ack-2.12/t/illegal-regex.t��������������������������������������������������������������������������0000644�0000764�0000764�00000001537�12220402675�014033� 0����������������������������������������������������������������������������������������������������ustar �andy����������������������������andy�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!perl use warnings; use strict; use Test::More; use lib 't'; use Util; prep_environment(); # test for behavior with illegal regexes my @tests = ( [ 'illegal pattern', '?foo', 't/' ], [ 'illegal -g regex', '-g', '?foo', 't/' ], ); plan tests => scalar @tests; for ( @tests ) { test_ack_with( @{$_} ); } sub test_ack_with { my $testcase = shift; my @args = @_; return subtest "test_ack_with( $testcase: @args )" => sub { my ( $stdout, $stderr ) = run_ack_with_stderr( @args ); is_deeply( $stdout, [], "No STDOUT for $testcase" ); is( scalar @{$stderr}, 2, "Two lines of STDERR for $testcase" ); like( $stderr->[0], qr/Invalid regex/, "Correct ack error message for $testcase" ); like( $stderr->[1], qr/^\s+Quantifier follows nothing/, "Correct type of error for $testcase" ); }; } �����������������������������������������������������������������������������������������������������������������������������������������������������������������ack-2.12/t/file-permission.t������������������������������������������������������������������������0000644�0000764�0000764�00000005362�12246427630�014425� 0����������������������������������������������������������������������������������������������������ustar �andy����������������������������andy�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!perl # Make sure ack can handle files it can't read. use warnings; use strict; use Test::More; use lib 't'; use Util; use File::Spec; use File::Copy; use File::Temp; use constant NTESTS => 6; plan skip_all => q{Can't be checked under Win32} if is_windows(); plan skip_all => q{Can't be run as root} if $> == 0; plan tests => NTESTS; prep_environment(); my $temp_dir = File::Temp::newdir('temp.XXXX', CLEANUP => 1, EXLOCK => 0, TMPDIR => 1); my $target = File::Spec->catfile( $temp_dir, 'foo' ); copy( $0, $target ) or die "Can't copy $0 to $target"; # Change permissions of this file to unreadable. my (undef, undef, $old_mode) = stat($target); chmod 0000, $target; my (undef, undef, $new_mode) = stat($target); sub o { return sprintf '%o', shift } SKIP: { skip q{Unable to modify test program's permissions}, NTESTS if $old_mode eq $new_mode; skip q{Program readable despite permission changes}, NTESTS if -r $target; isnt( o($new_mode), o($old_mode), "chmodded $target to be unreadable" ); # Execute a search on this file. check_with( 'regex 1', $target ); # --count takes a different execution path check_with( 'regex 2', '--count', $target, { expected_stdout => 1, } ); my($volume,$path) = File::Spec->splitpath($target); # Run another test on the directory containing the read only file. check_with( 'notinthere', $volume . $path ); # Change permissions back. my $rc = chmod $old_mode, $target; ok( $rc, "Succeeded chmodding $target to " . o($old_mode) ); my (undef, undef, $back_mode) = stat($target); is( o($back_mode), o($old_mode), "${target}'s are back to what we expect" ); } done_testing(); sub check_with { local $Test::Builder::Level = $Test::Builder::Level + 1; my ( @args ) = @_; return subtest "check_with( $args[0] )" => sub { plan tests => 4; my $opts = {}; foreach my $arg ( @args ) { if ( ref($arg) eq 'HASH' ) { $opts = $arg; } } @args = grep { ref ne 'HASH' } @args; my $expected_stdout = $opts->{expected_stdout} || 0; my ($stdout, $stderr) = run_ack_with_stderr( @args ); is( get_rc(), 1, 'Exit code 1 for no output for grep compatibility' ); ## XXX Should be 2 for best grep compatibility since there was an error ... ## but we agreed that wasn't required is( scalar @{$stdout}, $expected_stdout, 'No normal output' ) || diag(explain($stdout)); is( scalar @{$stderr}, 1, 'One line of stderr output' ) || diag(explain($stderr)); # Don't check for exact text of warning, the message text depends on LC_MESSAGES like( $stderr->[0], qr/\Q$target\E:/, 'Warning message OK' ); }; } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ack-2.12/t/ext-filter.t�����������������������������������������������������������������������������0000644�0000764�0000764�00000001037�12217205306�013366� 0����������������������������������������������������������������������������������������������������ustar �andy����������������������������andy�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!perl use strict; use warnings; use lib 't'; use FilterTest; use Test::More tests => 1; use App::Ack::Filter::Extension; filter_test( [ ext => qw/pl pod pm t/ ], [ 't/swamp/Makefile.PL', 't/swamp/blib/ignore.pm', 't/swamp/blib/ignore.pod', 't/swamp/options-crlf.pl', 't/swamp/options.pl', 't/swamp/perl-test.t', 't/swamp/perl.handler.pod', 't/swamp/perl.pl', 't/swamp/perl.pm', 't/swamp/perl.pod', ], 'only the given extensions should be matched' ); �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ack-2.12/t/ack-c.t����������������������������������������������������������������������������������0000644�0000764�0000764�00000005773�12217375765�012315� 0����������������������������������������������������������������������������������������������������ustar �andy����������������������������andy�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!perl use warnings; use strict; use Test::More tests => 13; use lib 't'; use Util; prep_environment(); DASH_L: { my @expected = qw( t/text/science-of-myth.txt ); my @args = qw( religion -i -l ); my @files = qw( t/text ); ack_sets_match( [ @args, @files ], \@expected, 'Looking for religion with -l' ); } DASH_CAPITAL_L: { my @expected = qw( t/text/4th-of-july.txt t/text/boy-named-sue.txt t/text/me-and-bobbie-mcgee.txt t/text/numbered-text.txt t/text/freedom-of-choice.txt t/text/shut-up-be-happy.txt ); my @switches = ( ['-L'], ['--files-without-matches'], ); for my $switches ( @switches ) { my @files = qw( t/text ); my @args = ( 'religion', @{$switches} ); ack_sets_match( [ @args, @files ], \@expected, "Looking for religion with @{$switches}" ); } } DASH_LV: { my @expected = qw( t/text/4th-of-july.txt t/text/boy-named-sue.txt t/text/me-and-bobbie-mcgee.txt t/text/numbered-text.txt t/text/freedom-of-choice.txt t/text/science-of-myth.txt t/text/shut-up-be-happy.txt ); my @switches = ( ['-l','-v'], ['-l','--invert-match'], ['--files-with-matches','-v'], ['--files-with-matches','--invert-match'], ); for my $switches ( @switches ) { my @files = qw( t/text ); my @args = ( 'religion', @{$switches} ); ack_sets_match( [ @args, @files ], \@expected, "-l -v will mostly likely match all input files" ); } } DASH_C: { my @expected = qw( t/text/4th-of-july.txt:1 t/text/boy-named-sue.txt:2 t/text/freedom-of-choice.txt:0 t/text/me-and-bobbie-mcgee.txt:0 t/text/numbered-text.txt:0 t/text/science-of-myth.txt:0 t/text/shut-up-be-happy.txt:0 ); my @args = qw( boy -i -c ); my @files = qw( t/text ); ack_sets_match( [ @args, @files ], \@expected, 'Boy counts' ); } DASH_LC: { my @expected = qw( t/text/science-of-myth.txt:2 ); my @args = qw( religion -i -l -c ); my @files = qw( t/text ); ack_sets_match( [ @args, @files ], \@expected, 'Religion counts -l -c' ); } PIPE_INTO_C: { my $file = 't/text/science-of-myth.txt'; my @args = qw( religion -i -c ); my @results = pipe_into_ack( $file, @args ); is( scalar @results, 1, 'Piping into ack --count should return one line of results' ); is( $results[0], '2', 'Piping into ack --count should return "<count>"' ); } DASH_HC: { my @args = qw( boy -i -c -h ); my @files = qw( t/text ); my @expected = ( '3' ); ack_sets_match( [ @args, @files ], \@expected, 'ack -c -h should return one line of results' ); } SINGLE_FILE_COUNT: { my @args = qw( boy -i -c -h ); my @files = ( 't/text/boy-named-sue.txt' ); my @expected = ( '2' ); ack_sets_match( [ @args, @files ], \@expected, 'ack -c -h should return one line of results' ); } done_testing(); �����ack-2.12/t/config-loader.t��������������������������������������������������������������������������0000644�0000764�0000764�00000015703�12246427630�014031� 0����������������������������������������������������������������������������������������������������ustar �andy����������������������������andy�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!perl use strict; use warnings; use lib 't'; use Util; use Test::More; use Carp qw(croak); use File::Temp; use App::Ack::Filter::Default; use App::Ack::ConfigLoader; local $ENV{PAGER}; local $ENV{ACK_PAGER}; local $ENV{ACK_PAGER_COLOR}; local $ENV{ACK_OPTIONS}; my %defaults = ( after_context => undef, before_context => undef, 'break' => undef, color => undef, column => undef, count => undef, dont_report_bad_filenames => undef, f => undef, files_from => undef, filters => [ App::Ack::Filter::Default->new ], flush => undef, follow => undef, g => undef, h => undef, H => undef, heading => undef, i => undef, l => undef, L => undef, m => undef, n => undef, output => undef, pager => undef, passthru => undef, print0 => undef, Q => undef, regex => undef, show_types => undef, smart_case => undef, sort_files => undef, v => undef, w => undef, ); test_loader( expected_opts => { %defaults }, expected_targets => [], 'empty inputs should result in default outputs' ); test_loader( argv => ['-A', '15'], expected_opts => { %defaults, after_context => 15 }, expected_targets => [], '-A should set after_context' ); test_loader( argv => ['--after-context=15'], expected_opts => { %defaults, after_context => 15 }, expected_targets => [], '--after-context should set after_context' ); test_loader( argv => ['-B', '15'], expected_opts => { %defaults, before_context => 15 }, expected_targets => [], '-B should set before_context' ); test_loader( argv => ['--before-context=15'], expected_opts => { %defaults, before_context => 15 }, expected_targets => [], '--before-context should set before_context' ); # XXX These tests should all be replicated to work off of the ack command line # tools instead of its internal APIs! do { local $ENV{'ACK_PAGER'} = './test-pager --skip=2'; test_loader( argv => [], expected_opts => { %defaults, pager => './test-pager --skip=2' }, expected_targets => [], 'ACK_PAGER should set the default pager', ); test_loader( argv => ['--pager=./test-pager'], expected_opts => { %defaults, pager => './test-pager' }, expected_targets => [], '--pager should override ACK_PAGER', ); test_loader( argv => ['--nopager'], expected_opts => { %defaults }, expected_targets => [], '--nopager should suppress ACK_PAGER', ); }; do { local $ENV{'ACK_PAGER_COLOR'} = './test-pager --skip=2'; test_loader( argv => [], expected_opts => { %defaults, pager => './test-pager --skip=2' }, expected_targets => [], 'ACK_PAGER_COLOR should set the default pager', ); test_loader( argv => ['--pager=./test-pager'], expected_opts => { %defaults, pager => './test-pager' }, expected_targets => [], '--pager should override ACK_PAGER_COLOR', ); test_loader( argv => ['--nopager'], expected_opts => { %defaults }, expected_targets => [], '--nopager should suppress ACK_PAGER_COLOR', ); local $ENV{'ACK_PAGER'} = './test-pager --skip=3'; test_loader( argv => [], expected_opts => { %defaults, pager => './test-pager --skip=2' }, expected_targets => [], 'ACK_PAGER_COLOR should override ACK_PAGER', ); test_loader( argv => ['--pager=./test-pager'], expected_opts => { %defaults, pager => './test-pager' }, expected_targets => [], '--pager should override ACK_PAGER_COLOR and ACK_PAGER', ); test_loader( argv => ['--nopager'], expected_opts => { %defaults }, expected_targets => [], '--nopager should suppress ACK_PAGER_COLOR and ACK_PAGER', ); }; do { local $ENV{'PAGER'} = './test-pager'; test_loader( argv => [], expected_opts => { %defaults }, expected_targets => [], q{PAGER doesn't affect ack by default}, ); test_loader( argv => ['--pager'], expected_opts => { %defaults, pager => './test-pager' }, expected_targets => [], 'PAGER is used if --pager is specified with no argument', ); test_loader( argv => ['--pager=./test-pager --skip=2'], expected_opts => { %defaults, pager => './test-pager --skip=2' }, expected_targets => [], 'PAGER is not used if --pager is specified with an argument', ); # XXX what if --pager is specified but PAGER isn't set? }; done_testing; sub test_loader { local $Test::Builder::Level = $Test::Builder::Level + 1; die 'Must pass key/value pairs, plus a message at the end' unless @_ % 2 == 1; my $msg = pop; my %opts = @_; return subtest "test_loader( $msg )" => sub { plan tests => 2; my ( $env, $argv, $expected_opts, $expected_targets ) = delete @opts{qw/env argv expected_opts expected_targets/}; $env = '' unless defined $env; $argv = [] unless defined $argv; my @files = map { $opts{$_} } sort { my ( $a_end ) = $a =~ /(\d+)/; my ( $b_end ) = $b =~ /(\d+)/; $a_end <=> $b_end; } grep { /^file\d+/ } keys %opts; foreach my $contents (@files) { my $file = File::Temp->new; print {$file} $contents; close $file or die $!; } my ( $got_opts, $got_targets ); do { local $ENV{'ACK_OPTIONS'} = $env; local @ARGV; my @arg_sources = ( { name => 'ARGV', contents => $argv }, map { +{ name => $_, contents => scalar read_file($_) } } @files, ); $got_opts = App::Ack::ConfigLoader::process_args( @arg_sources ); $got_targets = [ @ARGV ]; }; is_deeply( $got_opts, $expected_opts, 'Options match' ) or diag 'Options did not match'; is_deeply( $got_targets, $expected_targets, 'Targets match' ) or diag 'Targets did not match'; }; } �������������������������������������������������������������ack-2.12/t/firstlinematch-filter.t������������������������������������������������������������������0000644�0000764�0000764�00000001242�12217205314�015577� 0����������������������������������������������������������������������������������������������������ustar �andy����������������������������andy�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!perl use strict; use warnings; use lib 't'; use FilterTest; use Test::More tests => 1; use App::Ack::Filter::FirstLineMatch; filter_test( [ firstlinematch => '/^#!.*perl/' ], [ 't/swamp/#emacs-workfile.pl#', 't/swamp/0', 't/swamp/Makefile.PL', 't/swamp/options-crlf.pl', 't/swamp/options.pl', 't/swamp/options.pl.bak', 't/swamp/perl-test.t', 't/swamp/perl-without-extension', 't/swamp/perl.cgi', 't/swamp/perl.pl', 't/swamp/perl.pm', 't/swamp/blib/ignore.pm', 't/swamp/blib/ignore.pod', ], 'only files with "perl" in their first line should be matched' ); ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ack-2.12/t/zero.t�����������������������������������������������������������������������������������0000644�0000764�0000764�00000001242�12217375765�012301� 0����������������������������������������������������������������������������������������������������ustar �andy����������������������������andy�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!perl =pod Long ago there was a problem where ack would ignore a file named "0" because 0 is a false value in Perl. Here we check to make sure we don't fall prey to that again. =cut use warnings; use strict; use Test::More tests => 1; use File::Next 0.22; use lib 't'; use Util; prep_environment(); my $swamp = 't/swamp'; my @actual_swamp_perl = map { "$swamp/$_" } qw( 0 Makefile.PL options.pl options-crlf.pl perl.cgi perl.handler.pod perl.pl perl.pm perl.pod perl-test.t perl-without-extension ); DASH_F: { my @args = qw( -f --perl ); ack_sets_match( [ @args, $swamp ], \@actual_swamp_perl, 'DASH_F' ); } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ack-2.12/t/mutex-options.t��������������������������������������������������������������������������0000644�0000764�0000764�00000070477�12246427630�014164� 0����������������������������������������������������������������������������������������������������ustar �andy����������������������������andy�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!perl use strict; use warnings; use Test::More tests => 250; use lib 't'; use Util; prep_environment(); ## no critic ( ValuesAndExpressions::RequireInterpolationOfMetachars ) Way too many metacharacters in this file # --line are_mutually_exclusive('--line', '-l', ['--line=1', '-l', 't/text/science-of-myth.txt']); are_mutually_exclusive('--line', '-l', ['--line', 1, '-l', 't/text/science-of-myth.txt']); are_mutually_exclusive('--line', '--files-with-matches', ['--line=1', '--files-with-matches', 't/text/science-of-myth.txt']); are_mutually_exclusive('--line', '--files-with-matches', ['--line', 1, '--files-with-matches', 't/text/science-of-myth.txt']); are_mutually_exclusive('--line', '-L', ['--line=1', '-L', 't/text/science-of-myth.txt']); are_mutually_exclusive('--line', '-L', ['--line', 1, '-L', 't/text/science-of-myth.txt']); are_mutually_exclusive('--line', '--files-without-matches', ['--line=1', '--files-without-matches', 't/text/science-of-myth.txt']); are_mutually_exclusive('--line', '--files-without-matches', ['--line', 1, '--files-without-matches', 't/text/science-of-myth.txt']); are_mutually_exclusive('--line', '-o', ['--line=1', '-o', 't/text/science-of-myth.txt']); are_mutually_exclusive('--line', '-o', ['--line', 1, '-o', 't/text/science-of-myth.txt']); are_mutually_exclusive('--line', '--passthru', ['--line=1', '--passthru', 't/text/science-of-myth.txt']); are_mutually_exclusive('--line', '--passthru', ['--line', 1, '--passthru', 't/text/science-of-myth.txt']); are_mutually_exclusive('--line', '--match', ['--line=1', '--match', 't/text/science-of-myth.txt']); are_mutually_exclusive('--line', '--match', ['--line', 1, '--match', 't/text/science-of-myth.txt']); are_mutually_exclusive('--line', '-m', ['--line=1', '-m', 1, 't/text/science-of-myth.txt']); are_mutually_exclusive('--line', '-m', ['--line', 1, '-m', 1, 't/text/science-of-myth.txt']); are_mutually_exclusive('--line', '-m', ['--line', 1, '-m1', 't/text/science-of-myth.txt']); are_mutually_exclusive('--line', '--max-count', ['--line=1', '--max-count', 1, 't/text/science-of-myth.txt']); are_mutually_exclusive('--line', '--max-count', ['--line', 1, '--max-count', 1, 't/text/science-of-myth.txt']); are_mutually_exclusive('--line', '--max-count', ['--line=1', '--max-count=1', 't/text/science-of-myth.txt']); are_mutually_exclusive('--line', '--max-count', ['--line', 1, '--max-count=1', 't/text/science-of-myth.txt']); are_mutually_exclusive('--line', '-1', ['--line=1', '-1', 't/text/science-of-myth.txt']); are_mutually_exclusive('--line', '-1', ['--line', 1, '-1', 't/text/science-of-myth.txt']); are_mutually_exclusive('--line', '-H', ['--line=1', '-H', 't/text/science-of-myth.txt']); are_mutually_exclusive('--line', '-H', ['--line', 1, '-H', 't/text/science-of-myth.txt']); are_mutually_exclusive('--line', '--with-filename', ['--line=1', '--with-filename', 't/text/science-of-myth.txt']); are_mutually_exclusive('--line', '--with-filename', ['--line', 1, '--with-filename', 't/text/science-of-myth.txt']); are_mutually_exclusive('--line', '-h', ['--line=1', '-h', 't/text/science-of-myth.txt']); are_mutually_exclusive('--line', '-h', ['--line', 1, '-h', 't/text/science-of-myth.txt']); are_mutually_exclusive('--line', '--no-filename', ['--line=1', '--no-filename', 't/text/science-of-myth.txt']); are_mutually_exclusive('--line', '--no-filename', ['--line', 1, '--no-filename', 't/text/science-of-myth.txt']); are_mutually_exclusive('--line', '-c', ['--line=1', '-c', 't/text/science-of-myth.txt']); are_mutually_exclusive('--line', '-c', ['--line', 1, '-c', 't/text/science-of-myth.txt']); are_mutually_exclusive('--line', '--count', ['--line=1', '--count', 't/text/science-of-myth.txt']); are_mutually_exclusive('--line', '--count', ['--line', 1, '--count', 't/text/science-of-myth.txt']); are_mutually_exclusive('--line', '--column', ['--line=1', '--column', 't/text/science-of-myth.txt']); are_mutually_exclusive('--line', '--column', ['--line', 1, '--column', 't/text/science-of-myth.txt']); are_mutually_exclusive('--line', '-A', ['--line=1', '-A', 1, 't/text/science-of-myth.txt']); are_mutually_exclusive('--line', '-A', ['--line', 1, '-A', 1, 't/text/science-of-myth.txt']); are_mutually_exclusive('--line', '--after-context', ['--line=1', '--after-context', 1, 't/text/science-of-myth.txt']); are_mutually_exclusive('--line', '--after-context', ['--line', 1, '--after-context', 1, 't/text/science-of-myth.txt']); are_mutually_exclusive('--line', '--after-context', ['--line=1', '--after-context=1', 't/text/science-of-myth.txt']); are_mutually_exclusive('--line', '--after-context', ['--line', 1, '--after-context=1', 't/text/science-of-myth.txt']); are_mutually_exclusive('--line', '-B', ['--line=1', '-B', 1, 't/text/science-of-myth.txt']); are_mutually_exclusive('--line', '-B', ['--line', 1, '-B', 1, 't/text/science-of-myth.txt']); are_mutually_exclusive('--line', '--before-context', ['--line=1', '--before-context', 1, 't/text/science-of-myth.txt']); are_mutually_exclusive('--line', '--before-context', ['--line', 1, '--before-context', 1, 't/text/science-of-myth.txt']); are_mutually_exclusive('--line', '--before-context', ['--line=1', '--before-context=1', 't/text/science-of-myth.txt']); are_mutually_exclusive('--line', '--before-context', ['--line', 1, '--before-context=1', 't/text/science-of-myth.txt']); are_mutually_exclusive('--line', '-C', ['--line=1', '-C', 1, 't/text/science-of-myth.txt']); are_mutually_exclusive('--line', '-C', ['--line', 1, '-C', 1, 't/text/science-of-myth.txt']); are_mutually_exclusive('--line', '--context', ['--line=1', '--context', 1, 't/text/science-of-myth.txt']); are_mutually_exclusive('--line', '--context', ['--line', 1, '--context', 1, 't/text/science-of-myth.txt']); are_mutually_exclusive('--line', '--context', ['--line=1', '--context=1', 't/text/science-of-myth.txt']); are_mutually_exclusive('--line', '--context', ['--line', 1, '--context=1', 't/text/science-of-myth.txt']); are_mutually_exclusive('--line', '--print0', ['--line=1', '--print0', 't/text/science-of-myth.txt']); are_mutually_exclusive('--line', '--print0', ['--line', 1, '--print0', 't/text/science-of-myth.txt']); are_mutually_exclusive('--line', '-f', ['--line=1', '-f', 't/text/science-of-myth.txt']); are_mutually_exclusive('--line', '-f', ['--line', 1, '-f', 't/text/science-of-myth.txt']); are_mutually_exclusive('--line', '-g', ['--line=1', '-g', 't/text/science-of-myth.txt']); are_mutually_exclusive('--line', '-g', ['--line', 1, '-g', 't/text/science-of-myth.txt']); are_mutually_exclusive('--line', '--show-types', ['--line=1', '--show-types', 't/text/science-of-myth.txt']); are_mutually_exclusive('--line', '--show-types', ['--line', 1, '--show-types', 't/text/science-of-myth.txt']); # -l/--files-with-matches are_mutually_exclusive('-l', '-L', ['-l', '-L', 'science', 't/text/science-of-myth.txt']); are_mutually_exclusive('-l', '-o', ['-l', '-o', 'science', 't/text/science-of-myth.txt']); are_mutually_exclusive('-l', '--passthru', ['-l', '--passthru', 'science', 't/text/science-of-myth.txt']); are_mutually_exclusive('-l', '--output', ['-l', '--output', '$&', 'science', 't/text/science-of-myth.txt']); are_mutually_exclusive('-l', '--output', ['-l', '--output=$&', 'science', 't/text/science-of-myth.txt']); are_mutually_exclusive('-l', '--max-count', ['-l', '--max-count', 1, 'science', 't/text/science-of-myth.txt']); are_mutually_exclusive('-l', '--max-count', ['-l', '--max-count=1', 'science', 't/text/science-of-myth.txt']); are_mutually_exclusive('-l', '-h', ['-l', '-h', 'science', 't/text/science-of-myth.txt']); are_mutually_exclusive('-l', '--with-filename', ['-l', '--with-filename', 'science', 't/text/science-of-myth.txt']); are_mutually_exclusive('-l', '--no-filename', ['-l', '--no-filename', 'science', 't/text/science-of-myth.txt']); are_mutually_exclusive('-l', '--column', ['-l', '--column', 'science', 't/text/science-of-myth.txt']); are_mutually_exclusive('-l', '-A', ['-l', '-A', 1, 'science', 't/text/science-of-myth.txt']); are_mutually_exclusive('-l', '--after-context', ['-l', '--after-context', 1, 'science', 't/text/science-of-myth.txt']); are_mutually_exclusive('-l', '--after-context', ['-l', '--after-context=1', 'science', 't/text/science-of-myth.txt']); are_mutually_exclusive('-l', '-B', ['-l', '-B', 1, 'science', 't/text/science-of-myth.txt']); are_mutually_exclusive('-l', '--before-context', ['-l', '--before-context', 1, 'science', 't/text/science-of-myth.txt']); are_mutually_exclusive('-l', '--before-context', ['-l', '--before-context=1', 'science', 't/text/science-of-myth.txt']); are_mutually_exclusive('-l', '-C', ['-l', '-C', 1, 'science', 't/text/science-of-myth.txt']); are_mutually_exclusive('-l', '--context', ['-l', '--context', 1, 'science', 't/text/science-of-myth.txt']); are_mutually_exclusive('-l', '--context', ['-l', '--context=1', 'science', 't/text/science-of-myth.txt']); are_mutually_exclusive('-l', '--heading', ['-l', '--heading', 'science', 't/text/science-of-myth.txt']); are_mutually_exclusive('-l', '--break', ['-l', '--break', 'science', 't/text/science-of-myth.txt']); are_mutually_exclusive('-l', '--group', ['-l', '--group', 'science', 't/text/science-of-myth.txt']); are_mutually_exclusive('-l', '-f', ['-l', '-f', 't/text/science-of-myth.txt']); are_mutually_exclusive('-l', '-g', ['-l', '-g', 'science', 't/text/science-of-myth.txt']); are_mutually_exclusive('-l', '--show-types', ['-l', '--show-types', 'science', 't/text/science-of-myth.txt']); # -L/--files-without-matches are_mutually_exclusive('-L', '-l', ['-L', '-l', 'science', 't/text/science-of-myth.txt']); are_mutually_exclusive('-L', '-o', ['-L', '-o', 'science', 't/text/science-of-myth.txt']); are_mutually_exclusive('-L', '--passthru', ['-L', '--passthru', 'science', 't/text/science-of-myth.txt']); are_mutually_exclusive('-L', '--output', ['-L', '--output', '$&', 'science', 't/text/science-of-myth.txt']); are_mutually_exclusive('-L', '--output', ['-L', '--output=$&', 'science', 't/text/science-of-myth.txt']); are_mutually_exclusive('-L', '--max-count', ['-L', '--max-count', 1, 'science', 't/text/science-of-myth.txt']); are_mutually_exclusive('-L', '--max-count', ['-L', '--max-count=1', 'science', 't/text/science-of-myth.txt']); are_mutually_exclusive('-L', '-h', ['-L', '-h', 'science', 't/text/science-of-myth.txt']); are_mutually_exclusive('-L', '--with-filename', ['-L', '--with-filename', 'science', 't/text/science-of-myth.txt']); are_mutually_exclusive('-L', '--no-filename', ['-L', '--no-filename', 'science', 't/text/science-of-myth.txt']); are_mutually_exclusive('-L', '--column', ['-L', '--column', 'science', 't/text/science-of-myth.txt']); are_mutually_exclusive('-L', '-A', ['-L', '-A', 1, 'science', 't/text/science-of-myth.txt']); are_mutually_exclusive('-L', '--after-context', ['-L', '--after-context', 1, 'science', 't/text/science-of-myth.txt']); are_mutually_exclusive('-L', '--after-context', ['-L', '--after-context=1', 'science', 't/text/science-of-myth.txt']); are_mutually_exclusive('-L', '-B', ['-L', '-B', 1, 'science', 't/text/science-of-myth.txt']); are_mutually_exclusive('-L', '--before-context', ['-L', '--before-context', 1, 'science', 't/text/science-of-myth.txt']); are_mutually_exclusive('-L', '--before-context', ['-L', '--before-context=1', 'science', 't/text/science-of-myth.txt']); are_mutually_exclusive('-L', '-C', ['-L', '-C', 1, 'science', 't/text/science-of-myth.txt']); are_mutually_exclusive('-L', '--context', ['-L', '--context', 1, 'science', 't/text/science-of-myth.txt']); are_mutually_exclusive('-L', '--context', ['-L', '--context=1', 'science', 't/text/science-of-myth.txt']); are_mutually_exclusive('-L', '--heading', ['-L', '--heading', 'science', 't/text/science-of-myth.txt']); are_mutually_exclusive('-L', '--break', ['-L', '--break', 'science', 't/text/science-of-myth.txt']); are_mutually_exclusive('-L', '--group', ['-L', '--group', 'science', 't/text/science-of-myth.txt']); are_mutually_exclusive('-L', '-f', ['-L', '-f', 't/text/science-of-myth.txt']); are_mutually_exclusive('-L', '-g', ['-L', '-g', 'science', 't/text/science-of-myth.txt']); are_mutually_exclusive('-L', '--show-types', ['-L', '--show-types', 'science', 't/text/science-of-myth.txt']); are_mutually_exclusive('-L', '-c', ['-L', '-c', 'science', 't/text/science-of-myth.txt']); are_mutually_exclusive('-L', '--count', ['-L', '--count', 'science', 't/text/science-of-myth.txt']); # -o are_mutually_exclusive('-o', '--output', ['-o', '--output', '$&', 'science', 't/text/science-of-myth.txt']); are_mutually_exclusive('-o', '--output', ['-o', '--output=$&', 'science', 't/text/science-of-myth.txt']); are_mutually_exclusive('-o', '-c', ['-o', '-c', 'science', 't/text/science-of-myth.txt']); are_mutually_exclusive('-o', '--count', ['-o', '--count', 'science', 't/text/science-of-myth.txt']); are_mutually_exclusive('-o', '--column', ['-o', '--column', 'science', 't/text/science-of-myth.txt']); are_mutually_exclusive('-o', '-A', ['-o', '-A', 1, 'science', 't/text/science-of-myth.txt']); are_mutually_exclusive('-o', '--after-context', ['-o', '--after-context', 1, 'science', 't/text/science-of-myth.txt']); are_mutually_exclusive('-o', '--after-context', ['-o', '--after-context=1', 'science', 't/text/science-of-myth.txt']); are_mutually_exclusive('-o', '-B', ['-o', '-B', 1, 'science', 't/text/science-of-myth.txt']); are_mutually_exclusive('-o', '--before-context', ['-o', '--before-context', 1, 'science', 't/text/science-of-myth.txt']); are_mutually_exclusive('-o', '--before-context', ['-o', '--before-context=1', 'science', 't/text/science-of-myth.txt']); are_mutually_exclusive('-o', '-C', ['-o', '-C', 1, 'science', 't/text/science-of-myth.txt']); are_mutually_exclusive('-o', '--context', ['-o', '--context', 1, 'science', 't/text/science-of-myth.txt']); are_mutually_exclusive('-o', '--context', ['-o', '--context=1', 'science', 't/text/science-of-myth.txt']); are_mutually_exclusive('-o', '-f', ['-o', '-f', 'science', 't/text/science-of-myth.txt']); # --passthru are_mutually_exclusive('--passthru', '--output', ['--passthru', '--output', '$&', 'science', 't/text/science-of-myth.txt']); are_mutually_exclusive('--passthru', '--output', ['--passthru', '--output=$&', 'science', 't/text/science-of-myth.txt']); are_mutually_exclusive('--passthru', '-m', ['--passthru', '-m', 1, 'science', 't/text/science-of-myth.txt']); are_mutually_exclusive('--passthru', '--max-count', ['--passthru', '--max-count', 1, 'science', 't/text/science-of-myth.txt']); are_mutually_exclusive('--passthru', '--max-count', ['--passthru', '--max-count=1', 'science', 't/text/science-of-myth.txt']); are_mutually_exclusive('--passthru', '-1', ['--passthru', '-1', 'science', 't/text/science-of-myth.txt']); are_mutually_exclusive('--passthru', '-c', ['--passthru', '-c', 'science', 't/text/science-of-myth.txt']); are_mutually_exclusive('--passthru', '--count', ['--passthru', '--count', 'science', 't/text/science-of-myth.txt']); are_mutually_exclusive('--passthru', '--count', ['--passthru', '--count', 'science', 't/text/science-of-myth.txt']); are_mutually_exclusive('--passthru', '-A', ['--passthru', '-A', 1, 'science', 't/text/science-of-myth.txt']); are_mutually_exclusive('--passthru', '--after-context', ['--passthru', '--after-context', 1, 'science', 't/text/science-of-myth.txt']); are_mutually_exclusive('--passthru', '--after-context', ['--passthru', '--after-context=1', 'science', 't/text/science-of-myth.txt']); are_mutually_exclusive('--passthru', '-B', ['--passthru', '-B', 1, 'science', 't/text/science-of-myth.txt']); are_mutually_exclusive('--passthru', '--before-context', ['--passthru', '--before-context', 1, 'science', 't/text/science-of-myth.txt']); are_mutually_exclusive('--passthru', '--before-context', ['--passthru', '--before-context=1', 'science', 't/text/science-of-myth.txt']); are_mutually_exclusive('--passthru', '-C', ['--passthru', '-C', 1, 'science', 't/text/science-of-myth.txt']); are_mutually_exclusive('--passthru', '--context', ['--passthru', '--context', 1, 'science', 't/text/science-of-myth.txt']); are_mutually_exclusive('--passthru', '--context', ['--passthru', '--context=1', 'science', 't/text/science-of-myth.txt']); are_mutually_exclusive('--passthru', '-f', ['--passthru', '-f', 'science', 't/text/science-of-myth.txt']); are_mutually_exclusive('--passthru', '-g', ['--passthru', '-g', 'science', 't/text/science-of-myth.txt']); are_mutually_exclusive('--passthru', '--column', ['--passthru', '--column', 'science', 't/text/science-of-myth.txt']); # --output are_mutually_exclusive('--output', '-c', ['--output', '$&', '-c', 'science', 't/text/science-of-myth.txt']); are_mutually_exclusive('--output', '--count', ['--output', '$&', '--count', 'science', 't/text/science-of-myth.txt']); are_mutually_exclusive('--output', '-f', ['--output', '$&', '-f', 't/text/science-of-myth.txt']); are_mutually_exclusive('--output', '-g', ['--output', '$&', '-g', 'science', 't/text/science-of-myth.txt']); are_mutually_exclusive('--output', '-c', ['--output=$&', '-c', 'science', 't/text/science-of-myth.txt']); are_mutually_exclusive('--output', '--count', ['--output=$&', '--count', 'science', 't/text/science-of-myth.txt']); are_mutually_exclusive('--output', '-f', ['--output=$&', '-f', 't/text/science-of-myth.txt']); are_mutually_exclusive('--output', '-g', ['--output=$&', '-g', 'science', 't/text/science-of-myth.txt']); are_mutually_exclusive('--output', '-A', ['--output=$&', '-A2', 'science', 't/text/science-of-myth.txt']); are_mutually_exclusive('--output', '-B', ['--output=$&', '-B2', 'science', 't/text/science-of-myth.txt']); are_mutually_exclusive('--output', '-C', ['--output=$&', '-C2', 'science', 't/text/science-of-myth.txt']); are_mutually_exclusive('--output', '--after-context', ['--output=$&', '--after-context=2', 'science', 't/text/science-of-myth.txt']); are_mutually_exclusive('--output', '--before-context', ['--output=$&', '--before-context=2', 'science', 't/text/science-of-myth.txt']); are_mutually_exclusive('--output', '--context', ['--output=$&', '--context=2', 'science', 't/text/science-of-myth.txt']); # --match are_mutually_exclusive('--match', '-f', ['--match', 'science', '-f', 't/text/science-of-myth.txt']); are_mutually_exclusive('--match', '-g', ['--match', 'science', '-g', 't/text/science-of-myth.txt']); are_mutually_exclusive('--match', '-f', ['--match=science', '-f', 't/text/science-of-myth.txt']); are_mutually_exclusive('--match', '-g', ['--match=science', '-g', 't/text/science-of-myth.txt']); # --max-count are_mutually_exclusive('-m', '-1', ['-m', 1, '-1', 'science', 't/text/science-of-myth.txt']); are_mutually_exclusive('-m', '-c', ['-m', 1, '-c', 'science', 't/text/science-of-myth.txt']); are_mutually_exclusive('-m', '-f', ['-m', 1, '-f', 'science', 't/text/science-of-myth.txt']); are_mutually_exclusive('-m', '-g', ['-m', 1, '-g', 'science', 't/text/science-of-myth.txt']); are_mutually_exclusive('--max-count', '-1', ['--max-count', 1, '-1', 'science', 't/text/science-of-myth.txt']); are_mutually_exclusive('--max-count', '-c', ['--max-count', 1, '-c', 'science', 't/text/science-of-myth.txt']); are_mutually_exclusive('--max-count', '-f', ['--max-count', 1, '-f', 'science', 't/text/science-of-myth.txt']); are_mutually_exclusive('--max-count', '-g', ['--max-count', 1, '-g', 'science', 't/text/science-of-myth.txt']); are_mutually_exclusive('--max-count', '-1', ['--max-count=1', '-1', 'science', 't/text/science-of-myth.txt']); are_mutually_exclusive('--max-count', '-c', ['--max-count=1', '-c', 'science', 't/text/science-of-myth.txt']); are_mutually_exclusive('--max-count', '-f', ['--max-count=1', '-f', 'science', 't/text/science-of-myth.txt']); are_mutually_exclusive('--max-count', '-g', ['--max-count=1', '-g', 'science', 't/text/science-of-myth.txt']); # -h/--no-filename are_mutually_exclusive('-h', '-H', ['-h', '-H', 'science', 't/text/science-of-myth.txt']); are_mutually_exclusive('-h', '--with-filename', ['-h', '--with-filename', 'science', 't/text/science-of-myth.txt']); are_mutually_exclusive('-h', '-f', ['-h', '-f', 'science', 't/text/science-of-myth.txt']); are_mutually_exclusive('-h', '-g', ['-h', '-g', 'science', 't/text/science-of-myth.txt']); are_mutually_exclusive('-h', '--group', ['-h', '--group', 'science', 't/text/science-of-myth.txt']); are_mutually_exclusive('-h', '--heading', ['-h', '--heading', 'science', 't/text/science-of-myth.txt']); are_mutually_exclusive('--no-filename', '-H', ['--no-filename', '-H', 'science', 't/text/science-of-myth.txt']); are_mutually_exclusive('--no-filename', '--with-filename', ['--no-filename', '--with-filename', 'science', 't/text/science-of-myth.txt']); are_mutually_exclusive('--no-filename', '-f', ['--no-filename', '-f', 'science', 't/text/science-of-myth.txt']); are_mutually_exclusive('--no-filename', '-g', ['--no-filename', '-g', 'science', 't/text/science-of-myth.txt']); are_mutually_exclusive('--no-filename', '--group', ['--no-filename', '--group', 'science', 't/text/science-of-myth.txt']); are_mutually_exclusive('--no-filename', '--heading', ['--no-filename', '--heading', 'science', 't/text/science-of-myth.txt']); # -H/--with-filename are_mutually_exclusive('-H', '-h', ['-H', '-h', 'science', 't/text/science-of-myth.txt']); are_mutually_exclusive('-H', '--no-filename', ['-H', '--no-filename', 'science', 't/text/science-of-myth.txt']); are_mutually_exclusive('-H', '-f', ['-H', '-f', 'science', 't/text/science-of-myth.txt']); are_mutually_exclusive('-H', '-g', ['-H', '-g', 'science', 't/text/science-of-myth.txt']); are_mutually_exclusive('--with-filename', '-h', ['--with-filename', '-h', 'science', 't/text/science-of-myth.txt']); are_mutually_exclusive('--with-filename', '--no-filename', ['--with-filename', '--no-filename', 'science', 't/text/science-of-myth.txt']); are_mutually_exclusive('--with-filename', '-f', ['--with-filename', '-f', 'science', 't/text/science-of-myth.txt']); are_mutually_exclusive('--with-filename', '-g', ['--with-filename', '-g', 'science', 't/text/science-of-myth.txt']); # -c/--count are_mutually_exclusive('-c', '--column', ['-c', '--column', 'science', 't/text/science-of-myth.txt']); are_mutually_exclusive('-c', '-A', ['-c', '-A', 1, 'science', 't/text/science-of-myth.txt']); are_mutually_exclusive('-c', '--after-context', ['-c', '--after-context', 1, 'science', 't/text/science-of-myth.txt']); are_mutually_exclusive('-c', '-B', ['-c', '-B', 1, 'science', 't/text/science-of-myth.txt']); are_mutually_exclusive('-c', '--before-context', ['-c', '--before-context', 1, 'science', 't/text/science-of-myth.txt']); are_mutually_exclusive('-c', '-C', ['-c', '-C', 1, 'science', 't/text/science-of-myth.txt']); are_mutually_exclusive('-c', '--context', ['-c', '--context', 1, 'science', 't/text/science-of-myth.txt']); are_mutually_exclusive('-c', '--heading', ['-c', '--heading', 'science', 't/text/science-of-myth.txt']); are_mutually_exclusive('-c', '--group', ['-c', '--group', 'science', 't/text/science-of-myth.txt']); are_mutually_exclusive('-c', '--break', ['-c', '--break', 'science', 't/text/science-of-myth.txt']); are_mutually_exclusive('-c', '-f', ['-c', '-f', 'science', 't/text/science-of-myth.txt']); are_mutually_exclusive('-c', '-g', ['-c', '-g', 'science', 't/text/science-of-myth.txt']); are_mutually_exclusive('--count', '--column', ['--count', '--column', 'science', 't/text/science-of-myth.txt']); are_mutually_exclusive('--count', '-A', ['--count', '-A', 1, 'science', 't/text/science-of-myth.txt']); are_mutually_exclusive('--count', '--after-context', ['--count', '--after-context', 1, 'science', 't/text/science-of-myth.txt']); are_mutually_exclusive('--count', '-B', ['--count', '-B', 1, 'science', 't/text/science-of-myth.txt']); are_mutually_exclusive('--count', '--before-context', ['--count', '--before-context', 1, 'science', 't/text/science-of-myth.txt']); are_mutually_exclusive('--count', '-C', ['--count', '-C', 1, 'science', 't/text/science-of-myth.txt']); are_mutually_exclusive('--count', '--context', ['--count', '--context', 1, 'science', 't/text/science-of-myth.txt']); are_mutually_exclusive('--count', '--heading', ['--count', '--heading', 'science', 't/text/science-of-myth.txt']); are_mutually_exclusive('--count', '--group', ['--count', '--group', 'science', 't/text/science-of-myth.txt']); are_mutually_exclusive('--count', '--break', ['--count', '--break', 'science', 't/text/science-of-myth.txt']); are_mutually_exclusive('--count', '-f', ['--count', '-f', 'science', 't/text/science-of-myth.txt']); are_mutually_exclusive('--count', '-g', ['--count', '-g', 'science', 't/text/science-of-myth.txt']); # --column are_mutually_exclusive('--column', '-f', ['--column', '-f', 'science', 't/text/science-of-myth.txt']); are_mutually_exclusive('--column', '-g', ['--column', '-g', 'science', 't/text/science-of-myth.txt']); # -A/-B/-C/--after-context/--before-context/--context are_mutually_exclusive('-A', '-f', ['-A', 1, '-f', 'science', 't/text/science-of-myth.txt']); are_mutually_exclusive('-A', '-g', ['-A', 1, '-g', 'science', 't/text/science-of-myth.txt']); are_mutually_exclusive('--after-context', '-f', ['--after-context', 1, '-f', 'science', 't/text/science-of-myth.txt']); are_mutually_exclusive('--after-context', '-g', ['--after-context', 1, '-g', 'science', 't/text/science-of-myth.txt']); are_mutually_exclusive('-B', '-f', ['-B', 1, '-f', 'science', 't/text/science-of-myth.txt']); are_mutually_exclusive('-B', '-g', ['-B', 1, '-g', 'science', 't/text/science-of-myth.txt']); are_mutually_exclusive('--before-context', '-f', ['--before-context', 1, '-f', 'science', 't/text/science-of-myth.txt']); are_mutually_exclusive('--before-context', '-g', ['--before-context', 1, '-g', 'science', 't/text/science-of-myth.txt']); are_mutually_exclusive('-C', '-f', ['-C', 1, '-f', 'science', 't/text/science-of-myth.txt']); are_mutually_exclusive('-C', '-g', ['-C', 1, '-g', 'science', 't/text/science-of-myth.txt']); are_mutually_exclusive('--context', '-f', ['--context', 1, '-f', 'science', 't/text/science-of-myth.txt']); are_mutually_exclusive('--context', '-g', ['--context', 1, '-g', 'science', 't/text/science-of-myth.txt']); # -f are_mutually_exclusive('-f', '-g', ['-f', '-g', 'science', 't/text/science-of-myth.txt']); are_mutually_exclusive('-f', '--group', ['-f', '--group', 'science', 't/text/science-of-myth.txt']); are_mutually_exclusive('-f', '--heading', ['-f', '--heading', 'science', 't/text/science-of-myth.txt']); are_mutually_exclusive('-f', '--break', ['-f', '--break', 'science', 't/text/science-of-myth.txt']); # -g are_mutually_exclusive('-g', '--group', ['-g', '--group', 'science', 't/text/science-of-myth.txt']); are_mutually_exclusive('-g', '--heading', ['-g', '--heading', 'science', 't/text/science-of-myth.txt']); are_mutually_exclusive('-g', '--break', ['-g', '--break', 'science', 't/text/science-of-myth.txt']); subtest q{Verify that "options" that follow -- aren't factored into the mutual exclusivity} => sub { my ( $stdout, $stderr ) = run_ack_with_stderr('-A', 5, 'science', 't/text/science-of-myth.txt', '--', '-l'); ok(@{$stdout} > 0, 'Some lines should appear on standard output'); is(scalar(@{$stderr}), 1, 'A single line should be present on standard error'); like($stderr->[0], qr/No such file or directory/, 'The error message should indicate a missing file (-l)'); is(get_rc(), 0, 'The ack command should not fail'); }; subtest q{Verify that mutually exclusive options in different sources don't cause a problem} => sub { my $ackrc = <<'END_ACKRC'; --group END_ACKRC my @stdout = run_ack('--count', 't/text/science-of-myth.txt', { ackrc => \$ackrc, }); ok(@stdout > 0, 'Some lines should appear on standard output'); }; done_testing(); # Do this without system(). sub are_mutually_exclusive { local $Test::Builder::Level = $Test::Builder::Level + 1; my ( $opt1, $opt2, $args ) = @_; my @args = @{$args}; my ( $stdout, $stderr ) = run_ack_with_stderr(@args); return subtest "are_mutually_exclusive( $opt1, $opt2, @args )" => sub { plan tests => 4; isnt( get_rc(), 0, 'The ack command should fail' ); is_empty_array( $stdout, 'No lines should be present on standard output' ); is( scalar(@{$stderr}), 1, 'A single line should be present on standard error' ); my $opt1_re = quotemeta($opt1); my $opt2_re = quotemeta($opt2); my $error = $stderr->[0] || ''; # avoid undef warnings if ( $error =~ /Options '$opt1_re' and '$opt2_re' are mutually exclusive/ || $error =~ /Options '$opt2_re' and '$opt1_re' are mutually exclusive/ ) { pass( qq{Error message resembles "Options '$opt1' and '$opt2' are mutually exclusive"} ); } else { fail( qq{Error message does not resemble "Options '$opt1' and '$opt2' are mutually exclusive"} ); diag("Error message: '$error'"); } }; } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ack-2.12/t/longopts.t�������������������������������������������������������������������������������0000644�0000764�0000764�00000007200�12217205340�013144� 0����������������������������������������������������������������������������������������������������ustar �andy����������������������������andy�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!perl use strict; use warnings; =head1 DESCRIPTION This tests whether L<ack(1)>'s command line options work as expected. =cut use Test::More; use File::Next (); # For the reslash() function # --no-recurse is inconsistent w/--nogroup plan tests => 39; use lib 't'; use Util; prep_environment(); my $swamp = 't/swamp'; my $ack = './ack'; # Help for my $arg ( qw( --help ) ) { my @args = ($arg); my $results = run_ack( @args ); like( $results, qr{ ^Usage: .* Example: }xs, qq{$arg output is correct} ); } # Version for my $arg ( qw( --version ) ) { my @args = ($arg); my $results = run_ack( @args ); like( $results, qr{ ^ack .* Copyright }xs, qq{$arg output is correct} ); } # Ignore case for my $arg ( qw( -i --ignore-case ) ) { my @args = ( $arg, 'upper case' ); my @files = ( 't/swamp/options.pl' ); my $results = run_ack( @args, @files ); like( $results, qr{UPPER CASE}, qq{$arg works correctly for ascii} ); } SMART_CASE: { my @files = 't/swamp/options.pl'; my $opt = '--smart-case'; like( +run_ack( $opt, 'upper case', @files ), qr{UPPER CASE}, qq{$opt turn on ignore-case when PATTERN has no upper} ); unlike( +run_ack( $opt, 'Upper case', @files ), qr{UPPER CASE}, qq{$opt does nothing when PATTERN has upper} ); like( +run_ack( $opt, '-i', 'UpPer CaSe', @files ), qr{UPPER CASE}, qq{-i overrides $opt, forcing ignore case, even when PATTERN has upper} ); } # Invert match # this test was changed from using unlike to using like because # old versions of Test::More::unlike (before 0.48_2) cannot # work with multiline output (which ack produces in this case). for my $arg ( qw( -v --invert-match ) ) { my @args = ( $arg, 'use warnings' ); my @files = qw( t/swamp/options.pl ); my $results = run_ack( @args, @files ); like( $results, qr{use strict;\n\n=head1 NAME}, # no 'use warnings' in between here qq{$arg works correctly} ); } # Word regexp for my $arg ( qw( -w --word-regexp ) ) { my @args = ( $arg, 'word' ); my @files = qw( t/swamp/options.pl ); my $results = run_ack( @args, @files ); like( $results, qr{ word }, qq{$arg ignores non-words} ); unlike( $results, qr{notaword}, qq{$arg ignores non-words} ); } # Literal for my $arg ( qw( -Q --literal ) ) { my @args = ( $arg, '[abc]' ); my @files = qw( t/swamp/options.pl ); my $results = run_ack( @args, @files ); like( $results, qr{\Q[abc]\E}, qq{$arg matches a literal string} ); } my $expected = File::Next::reslash( 't/swamp/options.pl' ); # Files with matches for my $arg ( qw( -l --files-with-matches ) ) { my @args = ( $arg, 'use strict' ); my @files = qw( t/swamp/options.pl ); my $results = run_ack( @args, @files ); like( $results, qr{\Q$expected}, qq{$arg prints matching files} ); } # Files without match for my $arg ( qw( -L --files-without-matches ) ) { my @args = ( $arg, 'use snorgledork' ); my @files = qw( t/swamp/options.pl ); my $results = run_ack( @args, @files ); like( $results, qr{\Q$expected}, qq{$arg prints matching files} ); } LINE: { my @files = 't/swamp/options.pl'; my $opt = '--line=1'; my @lines = run_ack( $opt, @files ); is @lines, 1, 'only one line of output should be returned'; is $lines[0], '#!/usr/bin/env perl', 'The first line should match'; } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ack-2.12/t/ack-help-types.t�������������������������������������������������������������������������0000644�0000764�0000764�00000001375�12217375765�014157� 0����������������������������������������������������������������������������������������������������ustar �andy����������������������������andy�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!perl use strict; use warnings; use List::Util qw(sum); use Test::More; use lib 't'; use Util; prep_environment(); my @types = ( perl => [qw{.pl .pod .pl .t}], python => [qw{.py}], ruby => [qw{.rb Rakefile}], ); my @options = ('--help-types', '--help=types'); plan tests => 12; foreach my $option ( @options ) { my @output = run_ack($option); while ( my ($type,$checks) = splice( @types, 0, 2 ) ) { my ( $matching_line ) = grep { /--\[no\]$type/ } @output; ok( $matching_line, "A match should be found for --$type in the output for $option" ); foreach my $check (@{$checks}) { like( $matching_line, qr/\Q$check\E/, "Line for --$type in output for $option contains $check" ); } } } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ack-2.12/xt/����������������������������������������������������������������������������������������0000755�0000764�0000764�00000000000�12247354203�011311� 5����������������������������������������������������������������������������������������������������ustar �andy����������������������������andy�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ack-2.12/xt/man.t�����������������������������������������������������������������������������������0000644�0000764�0000764�00000005326�12246427630�012263� 0����������������������������������������������������������������������������������������������������ustar �andy����������������������������andy�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!perl use strict; use warnings; use lib 't'; use Test::More; use Util; sub strip_special_chars { my ( $s ) = @_; $s =~ s/.[\b]//g; $s =~ s/\e\[?.*?[\@-~]//g; return $s; } { my $man_options; sub _populate_man_options { my ( $man_output, undef ) = run_ack_with_stderr( '--man' ); my $in_options_section; my @option_lines; foreach my $line ( @{$man_output} ) { $line = strip_special_chars($line); if ( $line =~ /^OPTIONS/ ) { $in_options_section = 1; } elsif ( $in_options_section ) { if ( $line =~ /^\S/ ) { $in_options_section = 0; last; } else { push @option_lines, $line; } } } my $min_indent; foreach my $line ( @option_lines ) { if ( my ( $indent ) = $line =~ /^(\s+)/ ) { $indent =~ s/\t/ /; $indent = length($indent); if ( !defined($min_indent) || $indent < $min_indent ) { $min_indent = $indent; } } } $man_options = []; foreach my $line ( @option_lines ) { if ( $line =~ /^(\s+)/ ) { my $indent_str = $1; $indent_str =~ s/\t/ /; my $indent = length($indent_str); next unless $indent == $min_indent; my @options; while ( $line =~ /(-[^\s=,]+)/g ) { my $option = $1; chop $option if $option =~ /\[$/; if ( $option =~ s/^--\[no\]/--/ ) { my $negated_option = $option; substr $negated_option, 2, 0, 'no'; push @{$man_options}, $negated_option; } push @{$man_options}, $option; } } } return; } sub get_man_options { _populate_man_options() unless $man_options; return @{ $man_options }; } } sub check_for_option_in_man_output { my ( $expected_option ) = @_; local $Test::Builder::Level = $Test::Builder::Level + 1; my @options = get_man_options(); my $found; foreach my $option ( @options ) { if ( $option eq $expected_option ) { $found = 1; last; } } return ok( $found, "Option '$expected_option' found in --man output" ); } my @options = get_options(); plan tests => scalar(@options); prep_environment(); foreach my $option ( @options ) { check_for_option_in_man_output( $option ); } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ack-2.12/xt/pod.t�����������������������������������������������������������������������������������0000644�0000764�0000764�00000000345�12217211316�012254� 0����������������������������������������������������������������������������������������������������ustar �andy����������������������������andy�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!perl -Tw use warnings; use strict; use Test::More; if ( eval 'use Test::Pod 1.14; 1;' ) { ## no critic (ProhibitStringyEval) all_pod_files_ok(); } else { plan skip_all => 'Test::Pod 1.14 required for testing POD'; } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ack-2.12/Resource.pm��������������������������������������������������������������������������������0000644�0000764�0000764�00000004343�12215743470�013012� 0����������������������������������������������������������������������������������������������������ustar �andy����������������������������andy�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������package App::Ack::Resource; use App::Ack; use warnings; use strict; use overload '""' => 'name'; sub FAIL { require Carp; Carp::confess( 'Must be overloaded' ); } =head1 SYNOPSIS This is the base class for App::Ack::Resource and any resources that derive from it. =head1 METHODS =head2 new( $filename ) Opens the file specified by I<$filename> and returns a filehandle and a flag that says whether it could be binary. If there's a failure, it throws a warning and returns an empty list. =cut sub new { return FAIL(); } =head2 $res->name() Returns the name of the resource. =cut sub name { return FAIL(); } =head2 $res->is_binary() Tells whether the resource is binary. If it is, and ack finds a match in the file, then ack will not try to display a match line. =cut sub is_binary { return FAIL(); } =head2 $res->open() Opens a filehandle for reading this resource and returns it, or returns undef if the operation fails (the error is in C<$!>). Instead of calling C<close $fh>, C<$res-E<gt>close> should be called. =cut sub open { return FAIL(); } =head2 $res->needs_line_scan( \%opts ) API: Tells if the resource needs a line-by-line scan. This is a big optimization because if you can tell from the outset that the pattern is not found in the resource at all, then there's no need to do the line-by-line iteration. If in doubt, return true. Base: Slurp up an entire file up to 100K, see if there are any matches in it, and if so, let us know so we can iterate over it directly. If it's bigger than 100K or the match is inverted, we have to do the line-by-line, too. =cut sub needs_line_scan { return FAIL(); } =head2 $res->reset() Resets the resource back to the beginning. This is only called if C<needs_line_scan()> is true, but not always if C<needs_line_scan()> is true. =cut sub reset { return FAIL(); } =head2 $res->close() API: Close the resource. =cut sub close { return FAIL(); } =head2 $res->clone Clones this resource. =cut sub clone { return FAIL(); } =head2 $res->firstliney Returns the first line (or first 250 characters, whichever comes first of a resource). Resource subclasses are encouraged to cache this value. =cut sub firstliney { return FAIL(); } 1; ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ack-2.12/README.md����������������������������������������������������������������������������������0000644�0000764�0000764�00000002070�12215743470�012137� 0����������������������������������������������������������������������������������������������������ustar �andy����������������������������andy�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# ack 2.0 ack is a code-searching tool, similar to grep but optimized for programmers searching large trees of source code. It runs in pure Perl, is highly portable, and runs on any platform that runs Perl. ack is written and maintained by Andy Lester (andy@petdance.com). * Project home page: http://beyondgrep.com/ * Code home page: https://github.com/petdance/ack2 * Issue tracker: https://github.com/petdance/ack2/issues * Mailing list for users: https://groups.google.com/d/forum/ack-users * Mailing list for developers: https://groups.google.com/d/forum/ack-dev # Building ack requires Perl 5.8.8 or higher. Perl 5.8.8 was released January 2006. # Required perl Makefile.PL make make test sudo make install # for a system-wide installation (recommended) # - or - make ack-standalone cp ack-standalone ~/bin/ack2 # for a personal installation Build status: [![Build Status](https://travis-ci.org/petdance/ack2.png?branch=dev)](https://travis-ci.org/petdance/ack2) # Development [Developer's Guide](DEVELOPERS.md) # Community TODO ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ack-2.12/META.yml�����������������������������������������������������������������������������������0000664�0000764�0000764�00000001774�12247354203�012142� 0����������������������������������������������������������������������������������������������������ustar �andy����������������������������andy�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������--- abstract: 'A grep-like program for searching source code' author: - 'Andy Lester <andy@petdance.com>' build_requires: ExtUtils::MakeMaker: 0 configure_requires: ExtUtils::MakeMaker: 0 dynamic_config: 1 generated_by: 'ExtUtils::MakeMaker version 6.82, CPAN::Meta::Converter version 2.132830' license: artistic_2 meta-spec: url: http://module-build.sourceforge.net/META-spec-v1.4.html version: 1.4 name: ack no_index: directory: - t - inc requires: Carp: 1.04 Cwd: 3.00 File::Basename: 1.00015 File::Glob: 1.00015 File::Next: 1.10 File::Spec: 3.00 File::Temp: 0.19 Getopt::Long: 2.35 Pod::Usage: 1.26 Term::ANSIColor: 1.10 Test::Harness: 2.50 Test::More: 0.98 Text::ParseWords: 3.1 perl: 5.008008 resources: MailingList: http://groups.google.com/group/ack-users bugtracker: http://github.com/petdance/ack2 homepage: http://beyondgrep.com/ license: http://www.perlfoundation.org/artistic_license_2_0 repository: git://github.com/petdance/ack2.git version: 2.12 ����ack-2.12/IsGroup.pm���������������������������������������������������������������������������������0000644�0000764�0000764�00000001211�12217212552�012574� 0����������������������������������������������������������������������������������������������������ustar �andy����������������������������andy�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������package App::Ack::Filter::IsGroup; use strict; use warnings; use base 'App::Ack::Filter'; use File::Spec 3.00 (); sub new { my ( $class ) = @_; return bless { data => {}, }, $class; } sub add { my ( $self, $filter ) = @_; $self->{data}->{ $filter->{filename} } = 1; } sub filter { my ( $self, $resource ) = @_; my $data = $self->{'data'}; my $base = (File::Spec->splitpath($resource->name))[2]; return exists $data->{$base}; } sub inspect { my ( $self ) = @_; return ref($self) . " - $self"; } sub to_string { my ( $self ) = @_; return join(' ', keys %{$self->{data}}); } 1; ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ack-2.12/Match.pm�����������������������������������������������������������������������������������0000644�0000764�0000764�00000001337�12215743470�012257� 0����������������������������������������������������������������������������������������������������ustar �andy����������������������������andy�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������package App::Ack::Filter::Match; use strict; use warnings; use base 'App::Ack::Filter'; use File::Spec 3.00; sub new { my ( $class, $re ) = @_; $re =~ s{^/|/$}{}g; # XXX validate? $re = qr/$re/i; return bless { regex => $re, }, $class; } sub filter { my ( $self, $resource ) = @_; my $re = $self->{'regex'}; my $base = (File::Spec->splitpath($resource->name))[2]; return $base =~ /$re/; } sub inspect { my ( $self ) = @_; my $re = $self->{'regex'}; print ref($self) . " - $re"; } sub to_string { my ( $self ) = @_; my $re = $self->{'regex'}; return "filename matches $re"; } BEGIN { App::Ack::Filter->register_filter(match => __PACKAGE__); } 1; �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ack-2.12/ExtensionGroup.pm��������������������������������������������������������������������������0000644�0000764�0000764�00000001423�12217212552�014202� 0����������������������������������������������������������������������������������������������������ustar �andy����������������������������andy�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������package App::Ack::Filter::ExtensionGroup; use strict; use warnings; use base 'App::Ack::Filter'; use File::Spec 3.00 (); sub new { my ( $class ) = @_; return bless { data => {}, }, $class; } sub add { my ( $self, $filter ) = @_; my $data = $self->{'data'}; my $extensions = $filter->{'extensions'}; foreach my $ext (@{$extensions}) { $data->{lc $ext} = 1; } } sub filter { my ( $self, $resource ) = @_; if ($resource->name =~ /[.]([^.]*)$/) { return exists $self->{'data'}->{lc $1}; } return 0; } sub inspect { my ( $self ) = @_; return ref($self) . " - $self"; } sub to_string { my ( $self ) = @_; my $data = $self->{'data'}; return join(' ', map { ".$_" } (keys %$data)); } 1; ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ack-2.12/META.json����������������������������������������������������������������������������������0000664�0000764�0000764�00000003330�12247354203�012300� 0����������������������������������������������������������������������������������������������������ustar �andy����������������������������andy�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������{ "abstract" : "A grep-like program for searching source code", "author" : [ "Andy Lester <andy@petdance.com>" ], "dynamic_config" : 1, "generated_by" : "ExtUtils::MakeMaker version 6.82, CPAN::Meta::Converter version 2.132830", "license" : [ "artistic_2" ], "meta-spec" : { "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", "version" : "2" }, "name" : "ack", "no_index" : { "directory" : [ "t", "inc" ] }, "prereqs" : { "build" : { "requires" : { "ExtUtils::MakeMaker" : "0" } }, "configure" : { "requires" : { "ExtUtils::MakeMaker" : "0" } }, "runtime" : { "requires" : { "Carp" : "1.04", "Cwd" : "3.00", "File::Basename" : "1.00015", "File::Glob" : "1.00015", "File::Next" : "1.10", "File::Spec" : "3.00", "File::Temp" : "0.19", "Getopt::Long" : "2.35", "Pod::Usage" : "1.26", "Term::ANSIColor" : "1.10", "Test::Harness" : "2.50", "Test::More" : "0.98", "Text::ParseWords" : "3.1", "perl" : "5.008008" } } }, "release_status" : "stable", "resources" : { "bugtracker" : { "web" : "http://github.com/petdance/ack2" }, "homepage" : "http://beyondgrep.com/", "license" : [ "http://www.perlfoundation.org/artistic_license_2_0" ], "repository" : { "url" : "git://github.com/petdance/ack2.git" }, "x_MailingList" : "http://groups.google.com/group/ack-users" }, "version" : "2.12" } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ack-2.12/squash�������������������������������������������������������������������������������������0000755�0000764�0000764�00000004275�12215743470�012123� 0����������������������������������������������������������������������������������������������������ustar �andy����������������������������andy�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!perl # Squashes together the parts of ack into the single ack app. use warnings; use strict; use File::Next; # make clear that ack is not supposed to be edited my $NO_EDIT_COMMENT = <<'EOCOMMENT'; # # This file, ack, is generated code. # Please DO NOT EDIT or send patches for it. # # Please take a look at the source from # http://github.com/petdance/ack2 # and submit patches against the individual files # that build ack. # EOCOMMENT my $debug_mode = grep { $_ eq '--debug' } @ARGV; @ARGV = grep { $_ ne '--debug' } @ARGV; my $code = "#!/usr/bin/env perl\n$NO_EDIT_COMMENT\n"; for my $arg ( @ARGV ) { my $filename = $arg; if ( $arg =~ /::/ ) { my $key = "$arg.pm"; $key =~ s{::}{/}g; $filename = $INC{$key} or die "Can't find the file for $arg"; } warn "Reading $filename\n"; open( my $fh, '<', $filename ) or die "Can't open $filename: $!"; my $was_in_pod = 0; my $in_pod = 0; $code .= "#line 1 '$filename'\n" if $debug_mode && $filename ne 'ack'; while ( <$fh> ) { next if /^use (?:File::Next|App::Ack)/; s/^use base (.+)/BEGIN {\n our \@ISA = $1\n}/; if ( $was_in_pod && !$in_pod ) { $was_in_pod = 0; if ($debug_mode) { $code .= "#line $. '$filename'\n"; } } # See if we're in module POD blocks if ( $filename ne 'ack' ) { $was_in_pod = $in_pod; if ( /^=(\w+)/ ) { $in_pod = ($1 ne 'cut'); next; } elsif ( $in_pod ) { next; } } # Replace the shebang line and append 'no edit' comment if ( s{^#!.+}{package main;} ) { # skip the shebang line and replace it with package statement } # Remove Perl::Critic comments. # I'd like to remove all comments, but this is a start s{\s*##.+critic.*}{}; $code .= $_; } close $fh; } # We only use two of the four constructors in File::Next, so delete the other two. for my $unused_func ( qw( dirs everything ) ) { $code =~ s/^sub $unused_func\b.*?^}//sm; # It's OK if we can't find it } print $code; exit 0; �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ack-2.12/Is.pm��������������������������������������������������������������������������������������0000644�0000764�0000764�00000001513�12217212552�011564� 0����������������������������������������������������������������������������������������������������ustar �andy����������������������������andy�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������package App::Ack::Filter::Is; use strict; use warnings; use base 'App::Ack::Filter'; use File::Spec 3.00 (); use App::Ack::Filter::IsGroup; sub new { my ( $class, $filename ) = @_; return bless { filename => $filename, groupname => 'IsGroup', }, $class; } sub create_group { return App::Ack::Filter::IsGroup->new(); } sub filter { my ( $self, $resource ) = @_; my $filename = $self->{'filename'}; my $base = (File::Spec->splitpath($resource->name))[2]; return $base eq $filename; } sub inspect { my ( $self ) = @_; my $filename = $self->{'filename'}; return ref($self) . " - $filename"; } sub to_string { my ( $self ) = @_; my $filename = $self->{'filename'}; return $filename; } BEGIN { App::Ack::Filter->register_filter(is => __PACKAGE__); } 1; �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ack-2.12/Ack.pm�������������������������������������������������������������������������������������0000644�0000764�0000764�00000044533�12247353437�011733� 0����������������������������������������������������������������������������������������������������ustar �andy����������������������������andy�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������package App::Ack; use warnings; use strict; =head1 NAME App::Ack - A container for functions for the ack program =head1 VERSION Version 2.12 =cut our $VERSION; our $COPYRIGHT; BEGIN { $VERSION = '2.12'; $COPYRIGHT = 'Copyright 2005-2013 Andy Lester.'; } our $fh; BEGIN { $fh = *STDOUT; } our %types; our %type_wanted; our %mappings; our %ignore_dirs; our $is_filter_mode; our $output_to_pipe; our $dir_sep_chars; our $is_cygwin; our $is_windows; use File::Spec 1.00015 (); BEGIN { # These have to be checked before any filehandle diddling. $output_to_pipe = not -t *STDOUT; $is_filter_mode = -p STDIN; $is_cygwin = ($^O eq 'cygwin'); $is_windows = ($^O eq 'MSWin32'); $dir_sep_chars = $is_windows ? quotemeta( '\\/' ) : quotemeta( File::Spec->catfile( '', '' ) ); } =head1 SYNOPSIS If you want to know about the F<ack> program, see the F<ack> file itself. No user-serviceable parts inside. F<ack> is all that should use this. =head1 FUNCTIONS =cut =head2 remove_dir_sep( $path ) This functions removes a trailing path separator, if there is one, from its argument =cut sub remove_dir_sep { my $path = shift; $path =~ s/[$dir_sep_chars]$//; return $path; } =head2 warn( @_ ) Put out an ack-specific warning. =cut sub warn { return CORE::warn( _my_program(), ': ', @_, "\n" ); } =head2 die( @_ ) Die in an ack-specific way. =cut sub die { return CORE::die( _my_program(), ': ', @_, "\n" ); } sub _my_program { require File::Basename; return File::Basename::basename( $0 ); } =head2 filetypes_supported() Returns a list of all the types that we can detect. =cut sub filetypes_supported { return keys %mappings; } sub _get_thpppt { my $y = q{_ /|,\\'!.x',=(www)=, U }; $y =~ tr/,x!w/\nOo_/; return $y; } sub _thpppt { my $y = _get_thpppt(); App::Ack::print( "$y ack $_[0]!\n" ); exit 0; } sub _bar { my $x; $x = <<'_BAR'; 6?!I'7!I"?%+! 3~!I#7#I"7#I!?!+!="+"="+!:! 2?#I!7!I!?#I!7!I"+"=%+"=# 1?"+!?*+!=#~"=!+#?"="+! 0?"+!?"I"?&+!="~!=!~"=!+%="+" /I!+!?)+!?!+!=$~!=!~!="+!="+"?!="?! .?%I"?%+%='?!=#~$=" ,,!?%I"?(+$=$~!=#:"~$:!~! ,I!?!I!?"I"?!+#?"+!?!+#="~$:!~!:!~!:!,!:!,":#~! +I!?&+!="+!?#+$=!~":!~!:!~!:!,!:#,!:!,%:" *+!I!?!+$=!+!=!+!?$+#=!~":!~":#,$:",#:!,!:! *I!?"+!?!+!=$+!?#+#=#~":$,!:",!:!,&:" )I!?$=!~!=#+"?!+!=!+!=!~!="~!:!~":!,'.!,%:!~! (=!?"+!?!=!~$?"+!?!+!=#~"=",!="~$,$.",#.!:!=! (I"+"="~"=!+&=!~"=!~!,!~!+!=!?!+!?!=!I!?!+"=!.",!.!,":! %I$?!+!?!=%+!~!+#~!=!~#:#=!~!+!~!=#:!,%.!,!.!:" $I!?!=!?!I!+!?"+!=!~!=!~!?!I!?!=!+!=!~#:",!~"=!~!:"~!=!:",&:" '-/ $?!+!I!?"+"=!+"~!,!:"+#~#:#,"=!~"=!,!~!,!.",!:".!:! */! !I!t!'!s! !a! !g!r!e!p!!! !/! $+"=!+!?!+"~!=!:!~!:"I!+!,!~!=!:!~!,!:!,$:!~".&:"~!,# (-/ %~!=!~!=!:!.!+"~!:!,!.!,!~!=!:$.!,":!,!.!:!~!,!:!=!.#="~!,!:" ./! %=!~!?!+"?"+!=!~",!.!:!?!~!.!:!,!:!,#.!,!:","~!:!=!~!=!:",!~! ./! %+"~":!~!=#~!:!~!,!.!~!:",!~!=!~!.!:!,!.",!:!,":!=":!.!,!:!7! -/! %~",!:".#:!=!:!,!:"+!:!~!:!.!,!~!,!.#,!.!,$:"~!,":"~!=! */! &=!~!=#+!=!~",!.!:",#:#,!.",+:!,!.",!=!+!?! &~!=!~!=!~!:"~#:",!.!,#~!:!.!+!,!.",$.",$.#,!+!I!?! &~!="~!:!~":!~",!~!=!~":!,!:!~!,!:!,&.$,#."+!?!I!?!I! &~!=!~!=!+!,!:!~!:!=!,!:!~&:$,!.!,".!,".!,#."~!+!?$I! &~!=!~!="~!=!:!~":!,!~%:#,!:",!.!,#.",#I!7"I!?!+!?"I" &+!I!7!:#~"=!~!:!,!:"~$.!=!.!,!~!,$.#,!~!7!I#?!+!?"I"7! %7#?!+!~!:!=!~!=!~":!,!:"~":#.!,)7#I"?"I!7& %7#I!=":!=!~!:"~$:"~!:#,!:!,!:!~!:#,!7#I!?#7) $7$+!,!~!=#~!:!~!:!~$:#,!.!~!:!=!,":!7#I"?#7+=!?! $7#I!~!,!~#=!~!:"~!:!,!:!,#:!=!~",":!7$I!?#I!7*+!=!+" "I!7$I!,":!,!.!=":$,!:!,$:$7$I!+!?"I!7+?"I!7!I!7!,! !,!7%I!:",!."~":!,&.!,!:!~!I!7$I!+!?"I!7,?!I!7',! !7(,!.#~":!,%.!,!7%I!7!?#I"7,+!?!7* 7+:!,!~#,"=!7'I!?#I"7/+!7+ 77I!+!7!?!7!I"71+!7, _BAR App::Ack::__pic($x); } sub _cathy { my $x = <<'CATHY'; 0+!--+! 0|! "C!H!O!C!O!L!A!T!E!!! !|! 0|! "C!H!O!C!O!L!A!T!E!!! !|! 0|! "C!H!O!C!O!L!A!T!E!!! !|! 0|! $A"C!K!!! $|! 0+!--+! 6\! 1:!,!.! ! 7\! /.!M!~!Z!M!~! 8\! /~!D! "M! ! 4.! $\! /M!~!.!8! +.!M# 4 0,!.! (\! .~!M!N! ,+!I!.!M!.! 3 /?!O!.!M!:! '\! .O!.! +~!Z!=!N!.! 4 ..! !D!Z!.!Z!.! '\! 9=!M".! 6 /.! !.!~!M".! '\! 8~! 9 4M!.! /.!7!N!M!.! F 4.! &:!M! !N"M# !M"N!M! #D!M&=! = :M!7!M#:! !~!M!7!,!$!M!:! #.! !O!N!.!M!:!M# ; 8Z!M"~!N!$!D!.!N!?! !I!N!.! (?!M! !M!,!D!M".! 9 (?!Z!M!N!:! )=!M!O!8!.!M!+!M! !M!,! !O!M! +,!M!.!M!~!Z!N!M!:! &:!~! 0 &8!7!.!~!M"D!M!,! &M!?!=!8! !M!,!O! !M!+! !+!O!.!M! $M#~! !.!8!M!Z!.!M! !O!M"Z! %:!~!M!Z!M!Z!.! + &:!M!7!,! *M!.!Z!M! !8"M!.!M!~! !.!M!.!=! #~!8!.!M! !7!M! "N!Z#I! !D!M!,!M!.! $."M!,! !M!.! * 2$!O! "N! !.!M!I! !7" "M! "+!O! !~!M! !d!O!.!7!I!M!.! !.!O!=!M!.! !M",!M!.! %.!$!O!D! + 1~!O! "M!+! !8!$! "M! "?!O! %Z!8!D!M!?!8!I!O!7!M! #M!.!M! "M",!M! 4 07!~! ".!8! !.!M! "I!+! !.!M! &Z!D!.!7!=!M! !:!.!M! #:!8"+! !.!+!8! !8! 3 /~!M! #N! !~!M!$! !.!M! !.!M" &~!M! "~!M!O! "D! $M! !8! "M!,!M!+!D!.! 1 #.! #?!M!N!.! #~!O! $M!.!7!$! "?" !?!~!M! '7!8!?!M!.!+!M"O! $?"$!D! !.!O! !$!7!I!.! 0 $,!M!:!O!?! ".! !?!=! $=!:!O! !M! "M! !M! !+!$! (.! +.!M! !M!.! !8! !+"Z!~! $:!M!$! !.! ' #.!8!.!I!$! $7!I! %M" !=!M! !~!M!D! "7!I! .I!O! %?!=!,!D! !,!M! !D!~!8!~! %D!M! ( #.!M"?! $=!O! %=!N! "8!.! !Z!M! #M!~! (M!:! #.!M" &O! !M!.! !?!,! !8!.!N!~! $8!N!M!,!.! % *$!O! &M!,! "O! !.!M!.! #M! (~!M( &O!.! !7! "M! !.!M!.!M!,! #.!M! !M! & )=!8!.! $.!M!O!.! "$!.!I!N! !I!M# (7!M(I! %D"Z!M! "=!I! "M! !M!:! #~!D! ' )D! &8!N!:! ".!O! !M!="M! "M! (7!M) %." !M!D!."M!.! !$!=! !M!,! + (M! &+!.!M! #Z!7!O!M!.!~!8! +,!M#D!?!M#D! #.!Z!M#,!Z!?! !~!N! "N!.! !M! + 'D!:! %$!D! !?! #M!Z! !8!.! !M"?!7!?!7! '+!I!D! !?!O!:!M!:! ":!M!:! !M!7".!M! "8!+! !:!D! !.!M! * %.!O!:! $.!O!+! !D!.! #M! "M!.!+!N!I!Z! "7!M!N!M!N!?!I!7!Z!=!M'D"~! #M!.!8!$! !:! !.!M! "N!?! !,!O! ) !.!?!M!:!M!I! %8!,! "M!.! #M! "N! !M!.! !M!.! !+!~! !.!M!.! ':!M! $M! $M!Z!$! !M!.! "D! "M! "?!M! ( !7!8! !+!I! ".! "$!=! ":!$! "+! !M!.! !O! !M!I!M".! !=!~! ",!O! '=!M! $$!,! #N!:! ":!8!.! !D!~! !,!M!.! !:!M!.! & !:!,!.! &Z" #D! !.!8!."M!.! !8!?!Z!M!.!M! #Z!~! !?!M!Z!.! %~!O!.!8!$!N!8!O!I!:!~! !+! #M!.! !.!M!.! !+!M! ".!~!M!+! $ !.! 'D!I! #?!M!.!M!,! !.!Z! !.!8! #M&O!I!?! (~!I!M"." !M!Z!.! !M!N!.! "+!$!.! "M!.! !M!?!.! "8!M! $ (O!8! $M! !M!.! ".!:! !+!=! #M! #.!M! !+" *$!M":!.! !M!~! "M!7! #M! #7!Z! "M"$!M!.! !.! # '$!Z! #.!7!+!M! $.!,! !+!:! #N! #.!M!.!+!M! +D!M! #=!N! ":!O! #=!M! #Z!D! $M!I! % $,! ".! $.!M" %$!.! !?!~! "+!7!." !.!M!,! !M! *,!N!M!.$M!?! "D!,! #M!.! #N! + ,M!Z! &M! "I!,! "M! %I!M! !?!=!.! (Z!8!M! $:!M!.! !,!M! $D! #.!M!.! ) +8!O! &.!8! "I!,! !~!M! &N!M! !M!D! '?!N!O!." $?!7! "?!~! #M!.! #I!D!.! ( 3M!,! "N!.! !D" &.!+!M!.! !M":!.":!M!7!M!D! 'M!.! "M!.! "M!,! $I! ) 3I! #M! "M!,! !:! &.!M" ".!,! !.!$!M!I! #.! !:! !.!M!?! "N!+! ".! / 1M!,! #.!M!8!M!=!.! +~!N"O!Z"~! *+!M!.! "M! 2 0.!M! &M!.! 8:! %.!M!Z! "M!=! *O!,! % 0?!$! &N! )." .,! %."M! ":!M!.! 0 0N!:! %?!O! #.! ..! &,! &.!D!,! "N!I! 0 CATHY App::Ack::__pic($x); } sub __pic { my($compressed) = @_; $compressed =~ s/(.)(.)/$1x(ord($2)-32)/eg; App::Ack::print( $compressed ); exit 0; } =head2 show_help() Dumps the help page to the user. =cut sub show_help { my $help_arg = shift || 0; return show_help_types() if $help_arg =~ /^types?/; App::Ack::print( <<"END_OF_HELP" ); Usage: ack [OPTION]... PATTERN [FILES OR DIRECTORIES] Search for PATTERN in each source file in the tree from the current directory on down. If any files or directories are specified, then only those files and directories are checked. ack may also search STDIN, but only if no file or directory arguments are specified, or if one of them is "-". Default switches may be specified in ACK_OPTIONS environment variable or an .ackrc file. If you want no dependency on the environment, turn it off with --noenv. Example: ack -i select Searching: -i, --ignore-case Ignore case distinctions in PATTERN --[no]smart-case Ignore case distinctions in PATTERN, only if PATTERN contains no upper case. Ignored if -i is specified -v, --invert-match Invert match: select non-matching lines -w, --word-regexp Force PATTERN to match only whole words -Q, --literal Quote all metacharacters; PATTERN is literal Search output: --lines=NUM Only print line(s) NUM of each file -l, --files-with-matches Only print filenames containing matches -L, --files-without-matches Only print filenames with no matches --output=expr Output the evaluation of expr for each line (turns off text highlighting) -o Show only the part of a line matching PATTERN Same as --output='\$&' --passthru Print all lines, whether matching or not --match PATTERN Specify PATTERN explicitly. -m, --max-count=NUM Stop searching in each file after NUM matches -1 Stop searching after one match of any kind -H, --with-filename Print the filename for each match (default: on unless explicitly searching a single file) -h, --no-filename Suppress the prefixing filename on output -c, --count Show number of lines matching per file --[no]column Show the column number of the first match -A NUM, --after-context=NUM Print NUM lines of trailing context after matching lines. -B NUM, --before-context=NUM Print NUM lines of leading context before matching lines. -C [NUM], --context[=NUM] Print NUM lines (default 2) of output context. --print0 Print null byte as separator between filenames, only works with -f, -g, -l, -L or -c. -s Suppress error messages about nonexistent or unreadable files. File presentation: --pager=COMMAND Pipes all ack output through COMMAND. For example, --pager="less -R". Ignored if output is redirected. --nopager Do not send output through a pager. Cancels any setting in ~/.ackrc, ACK_PAGER or ACK_PAGER_COLOR. --[no]heading Print a filename heading above each file's results. (default: on when used interactively) --[no]break Print a break between results from different files. (default: on when used interactively) --group Same as --heading --break --nogroup Same as --noheading --nobreak --[no]color Highlight the matching text (default: on unless output is redirected, or on Windows) --[no]colour Same as --[no]color --color-filename=COLOR --color-match=COLOR --color-lineno=COLOR Set the color for filenames, matches, and line numbers. --flush Flush output immediately, even when ack is used non-interactively (when output goes to a pipe or file). File finding: -f Only print the files selected, without searching. The PATTERN must not be specified. -g Same as -f, but only select files matching PATTERN. --sort-files Sort the found files lexically. --show-types Show which types each file has. --files-from=FILE Read the list of files to search from FILE. -x Read the list of files to search from STDIN. File inclusion/exclusion: --[no]ignore-dir=name Add/remove directory from list of ignored dirs --[no]ignore-directory=name Synonym for ignore-dir --ignore-file=filter Add filter for ignoring files -r, -R, --recurse Recurse into subdirectories (default: on) -n, --no-recurse No descending into subdirectories --[no]follow Follow symlinks. Default is off. -k, --known-types Include only files of types that ack recognizes. --type=X Include only X files, where X is a recognized filetype. --type=noX Exclude X files. See "ack --help-types" for supported filetypes. File type specification: --type-set TYPE:FILTER:FILTERARGS Files with the given FILTERARGS applied to the given FILTER are recognized as being of type TYPE. This replaces an existing definition for type TYPE. --type-add TYPE:FILTER:FILTERARGS Files with the given FILTERARGS applied to the given FILTER are recognized as being type TYPE. --type-del TYPE Removes all filters associated with TYPE. Miscellaneous: --[no]env Ignore environment variables and global ackrc files. --env is legal but redundant. --ackrc=filename Specify an ackrc file to use --ignore-ack-defaults Ignore default definitions included with ack. --create-ackrc Outputs a default ackrc for your customization to standard output. --help, -? This help --help-types Display all known types --dump Dump information on which options are loaded from which RC files --[no]filter Force ack to treat standard input as a pipe (--filter) or tty (--nofilter) --man Man page --version Display version & copyright --thpppt Bill the Cat --bar The warning admiral --cathy Chocolate! Chocolate! Chocolate! Exit status is 0 if match, 1 if no match. This is version $VERSION of ack. END_OF_HELP return; } =head2 show_help_types() Display the filetypes help subpage. =cut sub show_help_types { App::Ack::print( <<'END_OF_HELP' ); Usage: ack [OPTION]... PATTERN [FILES OR DIRECTORIES] The following is the list of filetypes supported by ack. You can specify a file type with the --type=TYPE format, or the --TYPE format. For example, both --type=perl and --perl work. Note that some extensions may appear in multiple types. For example, .pod files are both Perl and Parrot. END_OF_HELP my @types = filetypes_supported(); my $maxlen = 0; for ( @types ) { $maxlen = length if $maxlen < length; } for my $type ( sort @types ) { next if $type =~ /^-/; # Stuff to not show my $ext_list = $mappings{$type}; if ( ref $ext_list ) { $ext_list = join( '; ', map { $_->to_string } @{$ext_list} ); } App::Ack::print( sprintf( " --[no]%-*.*s %s\n", $maxlen, $maxlen, $type, $ext_list ) ); } return; } sub show_man { require Pod::Usage; Pod::Usage::pod2usage({ -input => $App::Ack::orig_program_name, -verbose => 2, -exitval => 0, }); return; } =head2 get_version_statement Returns the version information for ack. =cut sub get_version_statement { require Config; my $copyright = get_copyright(); my $this_perl = $Config::Config{perlpath}; if ($^O ne 'VMS') { my $ext = $Config::Config{_exe}; $this_perl .= $ext unless $this_perl =~ m/$ext$/i; } my $ver = sprintf( '%vd', $^V ); return <<"END_OF_VERSION"; ack ${VERSION} Running under Perl $ver at $this_perl $copyright This program is free software. You may modify or distribute it under the terms of the Artistic License v2.0. END_OF_VERSION } =head2 print_version_statement Prints the version information for ack. =cut sub print_version_statement { App::Ack::print( get_version_statement() ); return; } =head2 get_copyright Return the copyright for ack. =cut sub get_copyright { return $COPYRIGHT; } # print subs added in order to make it easy for a third party # module (such as App::Wack) to redefine the display methods # and show the results in a different way. sub print { print {$fh} @_; return; } sub print_first_filename { App::Ack::print( $_[0], "\n" ); return; } sub print_blank_line { App::Ack::print( "\n" ); return; } sub print_separator { App::Ack::print( "--\n" ); return; } sub print_filename { App::Ack::print( $_[0], $_[1] ); return; } sub print_line_no { App::Ack::print( $_[0], $_[1] ); return; } sub print_column_no { App::Ack::print( $_[0], $_[1] ); return; } sub print_count { my $filename = shift; my $nmatches = shift; my $ors = shift; my $count = shift; my $show_filename = shift; if ($show_filename) { App::Ack::print( $filename ); App::Ack::print( ':', $nmatches ) if $count; } else { App::Ack::print( $nmatches ) if $count; } App::Ack::print( $ors ); return; } sub print_count0 { my $filename = shift; my $ors = shift; my $show_filename = shift; if ($show_filename) { App::Ack::print( $filename, ':0', $ors ); } else { App::Ack::print( '0', $ors ); } return; } sub set_up_pager { my $command = shift; return if App::Ack::output_to_pipe(); my $pager; if ( not open( $pager, '|-', $command ) ) { App::Ack::die( qq{Unable to pipe to pager "$command": $!} ); } $fh = $pager; return; } =head2 output_to_pipe() Returns true if ack's input is coming from a pipe. =cut sub output_to_pipe { return $output_to_pipe; } =head2 exit_from_ack Exit from the application with the correct exit code. Returns with 0 if a match was found, otherwise with 1. The number of matches is handed in as the only argument. =cut sub exit_from_ack { my $nmatches = shift; my $rc = $nmatches ? 0 : 1; exit $rc; } =head1 COPYRIGHT & LICENSE Copyright 2005-2013 Andy Lester. This program is free software; you can redistribute it and/or modify it under the terms of the Artistic License v2.0. =cut 1; # End of App::Ack ���������������������������������������������������������������������������������������������������������������������������������������������������������������������ack-2.12/Collection.pm������������������������������������������������������������������������������0000644�0000764�0000764�00000002407�12217464471�013320� 0����������������������������������������������������������������������������������������������������ustar �andy����������������������������andy�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������package App::Ack::Filter::Collection; use strict; use warnings; use base 'App::Ack::Filter'; use File::Spec 3.00 (); sub new { my ( $class ) = @_; return bless { groups => {}, ungrouped => [], }, $class; } sub filter { my ( $self, $resource ) = @_; for my $group (values %{$self->{'groups'}}) { if ($group->filter($resource)) { return 1; } } for my $filter (@{$self->{'ungrouped'}}) { if ($filter->filter($resource)) { return 1; } } return 0; } sub add { my ( $self, $filter ) = @_; if (exists $filter->{'groupname'}) { my $groups = $self->{'groups'}; my $group_name = $filter->{'groupname'}; my $group; if (exists $groups->{$group_name}) { $group = $groups->{$group_name}; } else { $group = $groups->{$group_name} = $filter->create_group(); } $group->add($filter); } else { push @{$self->{'ungrouped'}}, $filter; } return; } sub inspect { my ( $self ) = @_; return ref($self) . " - $self"; } sub to_string { my ( $self ) = @_; my $ungrouped = $self->{'ungrouped'}; return join(', ', map { "($_)" } @{$ungrouped}); } 1; ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ack-2.12/Changes������������������������������������������������������������������������������������0000644�0000764�0000764�00000015521�12247353407�012162� 0����������������������������������������������������������������������������������������������������ustar �andy����������������������������andy�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������History file for ack. http://beyondgrep.com/ 2.12 Tue Dec 3 07:05:02 CST 2013 ==================================== [SECURITY FIXES] This verison of ack prevents the --pager, --regex and --output options from being used from project-level ackrc files. It is possible to execute malicious code with these options, and we want to prevent the security risk of acking through a potentially malicious codebase, such as one downloaded from an Internet site or checked out from a code repository. The --pager, --regex and --output options may still be used from the global /etc/ackrc, your own private ~/.ackrc, the ACK_OPTIONS environment variable, and of course from the command line. [ENHANCEMENTS] Now ignores Eclipse .metadata directory. Thanks, Steffen Jaeckel. [INTERNALS] Removed the Git revision tracking in the --version. 2.11_02 Sun Oct 6 12:39:21 CDT 2013 ==================================== [FIXES] 2.11_01 was mispackaged. This fixes that. 2.11_01 Sun Sep 29 13:15:41 CDT 2013 ==================================== [FIXES] Fixed a race condition in t/file-permission.t that was causing failures if tests were run in parallel. 2.10 Tue Sep 24 16:24:11 CDT 2013 ==================================== [ENHANCEMENTS] Add --perltest for *.t files. Added Matlab support. Thanks, Zertrin. [FIXES] Fix the test suite for Win32. Many thanks to Christian Walde for bringing the severity of this issue to our attention, as well as providing a Win32 development environment for us to work with. Fixed Win32-detection in the Makefile.PL. Thanks, Michael Beijen and Alexandr Ciornii. More compatibility fixes for Perl 5.8.8. 2.08 Thu Aug 22 23:11:45 CDT 2013 ==================================== [ENHANCEMENTS] ack now ignores CMake's build/cache directories by default. Thanks, Volodymyr Medvid. Add shebang matching for --lua files. Add documentation for --ackrc. Add Elixir filetype. Add --cathy option. Thanks to Joe McMahon. Add some helpful debugging tips when an invalid option is found. Thanks to Charles Lee. Ignore PDF files by default, because Perl will detect them as text. Ignore .gif, .jpg, .jpeg and .png files. They won't normally be selected, but this is an optimization so that ack doesn't have to open them to know. [FIXES] Ack's colorizing of output would get confused with multiple sets of parentheses. This has been fixed. (Issue #276) Ack would get confused when trying to colorize the output in DOS-format files. This has been fixed. (Issue #145) 2.06 ==================================== This mistake of an upload lived for only about 15 minutes. 2.05_01 Tue May 28 10:12:04 CDT 2013 ==================================== [ENHANCEMENTS] We now ignore the node_modules directories created by npm. Thanks, Konrad Borowski. --pager without an argument implies --pager=$PAGER. --perl now recognizes Plack-style .psgi files. Thanks, Ron Savage. Added filetypes for Coffescript, JSON, LESS, and Sass. [FIXES] Command-line options now override options set in ackrc files. ACK_PAGER and ACK_PAGER_COLOR now work as advertised. Fix a bug resulting in uninitialized variable warnings when more than one capture group was specified in the search pattern. Make sure ack is happy to build and test under cron and other console-less environments. Colored output is now supported and on by default on Windows. 2.04 Fri Apr 26 22:47:55 CDT 2013 ==================================== ack now runs on a standard Perl 5.8.8 install with no module updates. The minimum Perl requirement for ack is now explicitly 5.8.8. Anything before 5.8.8 will not work, and we've added checks. Thanks, Michael McClimon. [FIXES] ack was colorizing captured groups even if --nocolor was given. Thanks, Dale Sedivic. [ENHANCEMENTS] The --shell file type now recognizes the fish shell. We now ignore minified CSS or Javascript, in the form of either *.css.min or *.min.css, or *.js.min or *.min.js. Added support for the Dart language. ack 2.02 was much slower than ack 1.96, up to 8x slower in some cases. These slowdowns have been mostly eliminated, and in some cases ack 2.04 is now faster than 1.96. 2.02 Thu Apr 18 23:51:52 CDT 2013 ==================================== [ENHANCEMENTS] The firstlinematch file type detection option now only searches the first 250 characters of the first line of the file. Otherwise, ack would read entire text files that were only one line long, such as minified JavaScript, and that would be slow. Thanks, Michael McClimon. [DOCUMENTATION] Many clarifications and cleanups. Thanks, Michael McClimon. 2.00 Wed Apr 17 22:49:41 CDT 2013 ==================================== The first version of ack 2.0. # Incompatibilities with ack 1.x ack 2 makes some big changes in its behaviors that could trip up users who are used to the idiosyncracies of ack 1.x. These changes could affect your searching happiness, so please read them. * ack's default behavior is now to search all files that it identifies as being text. ack 1.x would only search files that were of a file type that it recognized. * Removed the `-a` and `-u` options since the default is to search all text files. * Removed the `--binary` option. ack 2.0 will not find and search through binary files. * Removed the `--skipped` option. * Removed the `--invert-file-match` option. `-v` now works with `-g`. To list files that do not match `/foo/` ack -g foo -v * `-g` now obeys all regex options: `-i`, `-w`, `-Q`, `-v` * Removed the `-G` switch, because it was too confusing to have two regexes specified on the command line. Now you use the `-x` switch to pipe filenames from one `ack` invocation into another. To search files with filename matching "sales" for the string "foo": ack -g sales | ack -x foo # New features in ack 2.0 ack 2.0 will: * By default searches all text files, as identified by Perl's `-T` operator * We will no longer have a `-a` switch. * improved flexibility in defining filetype selectors * name equality ($filename eq 'Makefile') * glob-style matching (`*.pl` identifies a Perl file) * regex-style matching (`/\.pl$/i` identifies a Perl file) * shebang-line matching (shebang line matching `/usr/bin/perl/` identifies a Perl file) * support for multiple ackrc files * global ackrc (/etc/ackrc) * https://github.com/petdance/ack/issues/#issue/79 * user-specific ackrc (~/.ackrc) * per-project ackrc files (~/myproject/.ackrc) * you can use --dump to figure which options are set where * all inclusion/exclusion rules will be in the ackrc files * ack 2.0 has a set of definitions for filetypes, directories to include or exclude, etc, *but* these are only included so you don't need to ship an ackrc file to a new machine. You may tell ack to disregard these defaults if you like. * In addition to the classic `--thpppt` option to draw Bill the Cat, `ack --bar` will draw (of course) Admiral Ackbar. �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ack-2.12/ConfigLoader.pm����������������������������������������������������������������������������0000644�0000764�0000764�00000056274�12246427630�013572� 0����������������������������������������������������������������������������������������������������ustar �andy����������������������������andy�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������package App::Ack::ConfigLoader; use strict; use warnings; use App::Ack (); use App::Ack::ConfigDefault (); use App::Ack::ConfigFinder (); use App::Ack::Filter; use App::Ack::Filter::Default; use Carp 1.04 (); use Getopt::Long 2.35 (); use Text::ParseWords 3.1 (); =head1 App::Ack::ConfigLoader =head1 FUNCTIONS =head2 process_args( @sources ) =cut my @INVALID_COMBINATIONS; BEGIN { my @context = qw( -A -B -C --after-context --before-context --context ); my @pretty = qw( --heading --group --break ); my @filename = qw( -h -H --with-filename --no-filename ); @INVALID_COMBINATIONS = ( # XXX normalize [qw(-l)] => [@context, @pretty, @filename, qw(-L -o --passthru --output --max-count --column -f -g --show-types)], [qw(-L)] => [@context, @pretty, @filename, qw(-l -o --passthru --output --max-count --column -f -g --show-types -c --count)], [qw(--line)] => [@context, @pretty, @filename, qw(-l --files-with-matches --files-without-matches -L -o --passthru --match -m --max-count -1 -c --count --column --print0 -f -g --show-types)], [qw(-o)] => [@context, qw(--output -c --count --column --column -f --show-types)], [qw(--passthru)] => [@context, qw(--output --column -m --max-count -1 -c --count -f -g)], [qw(--output)] => [@context, qw(-c --count -f -g)], [qw(--match)] => [qw(-f -g)], [qw(-m --max-count)] => [qw(-1 -f -g -c --count)], [qw(-h --no-filename)] => [qw(-H --with-filename -f -g --group --heading)], [qw(-H --with-filename)] => [qw(-h --no-filename -f -g)], [qw(-c --count)] => [@context, @pretty, qw(--column -f -g)], [qw(--column)] => [qw(-f -g)], [@context] => [qw(-f -g)], [qw(-f)] => [qw(-g), @pretty], [qw(-g)] => [qw(-f), @pretty], ); } sub process_filter_spec { my ( $spec ) = @_; if ( $spec =~ /^(\w+):(\w+):(.*)/ ) { my ( $type_name, $ext_type, $arguments ) = ( $1, $2, $3 ); return ( $type_name, App::Ack::Filter->create_filter($ext_type, split(/,/, $arguments)) ); } elsif ( $spec =~ /^(\w+)=(.*)/ ) { # Check to see if we have ack1-style argument specification. my ( $type_name, $extensions ) = ( $1, $2 ); my @extensions = split(/,/, $extensions); foreach my $extension ( @extensions ) { $extension =~ s/^[.]//; } return ( $type_name, App::Ack::Filter->create_filter('ext', @extensions) ); } else { Carp::croak "invalid filter specification '$spec'"; } } sub uninvert_filter { my ( $opt, @filters ) = @_; return unless defined $opt->{filters} && @filters; # Loop through all the registered filters. If we hit one that # matches this extension and it's inverted, we need to delete it from # the options. for ( my $i = 0; $i < @{ $opt->{filters} }; $i++ ) { my $opt_filter = @{ $opt->{filters} }[$i]; # XXX Do a real list comparison? This just checks string equivalence. if ( $opt_filter->is_inverted() && "$opt_filter->{filter}" eq "@filters" ) { splice @{ $opt->{filters} }, $i, 1; $i--; } } } sub process_filetypes { my ( $opt, $arg_sources ) = @_; Getopt::Long::Configure('default', 'no_auto_help', 'no_auto_version'); # start with default options, minus some annoying ones Getopt::Long::Configure( 'no_ignore_case', 'no_auto_abbrev', 'pass_through', ); my %additional_specs; my $add_spec = sub { my ( undef, $spec ) = @_; my ( $name, $filter ) = process_filter_spec($spec); push @{ $App::Ack::mappings{$name} }, $filter; $additional_specs{$name . '!'} = sub { my ( undef, $value ) = @_; my @filters = @{ $App::Ack::mappings{$name} }; if ( not $value ) { @filters = map { $_->invert() } @filters; } else { uninvert_filter( $opt, @filters ); } push @{ $opt->{'filters'} }, @filters; }; }; my $set_spec = sub { my ( undef, $spec ) = @_; my ( $name, $filter ) = process_filter_spec($spec); $App::Ack::mappings{$name} = [ $filter ]; $additional_specs{$name . '!'} = sub { my ( undef, $value ) = @_; my @filters = @{ $App::Ack::mappings{$name} }; if ( not $value ) { @filters = map { $_->invert() } @filters; } push @{ $opt->{'filters'} }, @filters; }; }; my $delete_spec = sub { my ( undef, $name ) = @_; delete $App::Ack::mappings{$name}; delete $additional_specs{$name . '!'}; }; my %type_arg_specs = ( 'type-add=s' => $add_spec, 'type-set=s' => $set_spec, 'type-del=s' => $delete_spec, ); foreach my $source (@{$arg_sources}) { my ( $source_name, $args ) = @{$source}{qw/name contents/}; if ( ref($args) ) { # $args are modified in place, so no need to munge $arg_sources local @ARGV = @{$args}; Getopt::Long::GetOptions(%type_arg_specs); @{$args} = @ARGV; } else { ( undef, $source->{contents} ) = Getopt::Long::GetOptionsFromString($args, %type_arg_specs); } } $additional_specs{'k|known-types'} = sub { my ( undef, $value ) = @_; my @filters = map { @{$_} } values(%App::Ack::mappings); push @{ $opt->{'filters'} }, @filters; }; return \%additional_specs; } sub removed_option { my ( $option, $explanation ) = @_; $explanation ||= ''; return sub { warn "Option '$option' is not valid in ack 2\n$explanation"; exit 1; }; } sub get_arg_spec { my ( $opt, $extra_specs ) = @_; my $dash_a_explanation = <<EOT; This is because we now have -k/--known-types which makes it only select files of known types, rather than any text file (which is the behavior of ack 1.x). You may have options in a .ackrc, or in the ACKRC_OPTIONS environment variable. Try using the --dump flag. EOT =for Adding-Options *** IF YOU ARE MODIFYING ACK PLEASE READ THIS *** If you plan to add a new option to ack, please make sure of the following: * Your new option has a test underneath the t/ directory. * Your new option is explained when a user invokes ack --help. (See App::Ack::show_help) * Your new option is explained when a user invokes ack --man. (See the POD at the end of ./ack) * Add your option to t/config-loader.t * Go through the list of options already available, and consider whether your new option can be considered mutually exclusive with another option. =cut return { 1 => sub { $opt->{1} = $opt->{m} = 1 }, 'A|after-context=i' => \$opt->{after_context}, 'B|before-context=i' => \$opt->{before_context}, 'C|context:i' => sub { shift; my $val = shift; $opt->{before_context} = $opt->{after_context} = ($val || 2) }, 'a' => removed_option('-a', $dash_a_explanation), 'all' => removed_option('--all', $dash_a_explanation), 'break!' => \$opt->{break}, c => \$opt->{count}, 'color|colour!' => \$opt->{color}, 'color-match=s' => \$ENV{ACK_COLOR_MATCH}, 'color-filename=s' => \$ENV{ACK_COLOR_FILENAME}, 'color-lineno=s' => \$ENV{ACK_COLOR_LINENO}, 'column!' => \$opt->{column}, count => \$opt->{count}, 'create-ackrc' => sub { print "$_\n" for ( '--ignore-ack-defaults', App::Ack::ConfigDefault::options() ); exit; }, 'env!' => sub { my ( undef, $value ) = @_; if ( !$value ) { $opt->{noenv_seen} = 1; } }, f => \$opt->{f}, 'files-from=s' => \$opt->{files_from}, 'filter!' => \$App::Ack::is_filter_mode, flush => \$opt->{flush}, 'follow!' => \$opt->{follow}, g => \$opt->{g}, G => removed_option('-G'), 'group!' => sub { shift; $opt->{heading} = $opt->{break} = shift }, 'heading!' => \$opt->{heading}, 'h|no-filename' => \$opt->{h}, 'H|with-filename' => \$opt->{H}, 'i|ignore-case' => \$opt->{i}, 'ignore-directory|ignore-dir=s' # XXX Combine this version with the negated version below => sub { my ( undef, $dir ) = @_; $dir = App::Ack::remove_dir_sep( $dir ); if ( $dir !~ /^(?:is|match):/ ) { $dir = 'is:' . $dir; } push @{ $opt->{idirs} }, $dir; }, 'ignore-file=s' => sub { my ( undef, $file ) = @_; push @{ $opt->{ifiles} }, $file; }, 'lines=s' => sub { shift; my $val = shift; push @{$opt->{lines}}, $val }, 'l|files-with-matches' => \$opt->{l}, 'L|files-without-matches' => \$opt->{L}, 'm|max-count=i' => \$opt->{m}, 'match=s' => \$opt->{regex}, 'n|no-recurse' => \$opt->{n}, o => sub { $opt->{output} = '$&' }, 'output=s' => \$opt->{output}, 'pager:s' => sub { my ( undef, $value ) = @_; $opt->{pager} = $value || $ENV{PAGER}; }, 'noignore-directory|noignore-dir=s' => sub { my ( undef, $dir ) = @_; # XXX can you do --noignore-dir=match,...? $dir = App::Ack::remove_dir_sep( $dir ); if ( $dir !~ /^(?:is|match):/ ) { $dir = 'is:' . $dir; } if ( $dir !~ /^(?:is|match):/ ) { Carp::croak("invalid noignore-directory argument: '$dir'"); } @{ $opt->{idirs} } = grep { $_ ne $dir } @{ $opt->{idirs} }; push @{ $opt->{no_ignore_dirs} }, $dir; }, 'nopager' => sub { $opt->{pager} = undef }, 'passthru' => \$opt->{passthru}, 'print0' => \$opt->{print0}, 'Q|literal' => \$opt->{Q}, 'r|R|recurse' => sub { $opt->{n} = 0 }, 's' => \$opt->{dont_report_bad_filenames}, 'show-types' => \$opt->{show_types}, 'smart-case!' => \$opt->{smart_case}, 'sort-files' => \$opt->{sort_files}, 'type=s' => sub { my ( $getopt, $value ) = @_; my $cb_value = 1; if ( $value =~ s/^no// ) { $cb_value = 0; } my $callback = $extra_specs->{ $value . '!' }; if ( $callback ) { $callback->( $getopt, $cb_value ); } else { Carp::croak( "Unknown type '$value'" ); } }, 'u' => removed_option('-u'), 'unrestricted' => removed_option('--unrestricted'), 'v|invert-match' => \$opt->{v}, 'w|word-regexp' => \$opt->{w}, 'x' => sub { $opt->{files_from} = '-' }, 'version' => sub { App::Ack::print_version_statement(); exit; }, 'help|?:s' => sub { shift; App::Ack::show_help(@_); exit; }, 'help-types' => sub { App::Ack::show_help_types(); exit; }, 'man' => sub { App::Ack::show_man(); exit; }, $extra_specs ? %{$extra_specs} : (), }; # arg_specs } sub process_other { my ( $opt, $extra_specs, $arg_sources ) = @_; Getopt::Long::Configure('default', 'no_auto_help', 'no_auto_version'); # start with default options, minus some annoying ones Getopt::Long::Configure( 'bundling', 'no_ignore_case', ); my $argv_source; my $is_help_types_active; foreach my $source (@{$arg_sources}) { my ( $source_name, $args ) = @{$source}{qw/name contents/}; if ( $source_name eq 'ARGV' ) { $argv_source = $args; last; } } if ( $argv_source ) { # This *should* always be true, but you never know... my @copy = @{$argv_source}; local @ARGV = @copy; Getopt::Long::Configure('pass_through'); Getopt::Long::GetOptions( 'help-types' => \$is_help_types_active, ); Getopt::Long::Configure('no_pass_through'); } my $arg_specs = get_arg_spec($opt, $extra_specs); foreach my $source (@{$arg_sources}) { my ( $source_name, $args ) = @{$source}{qw/name contents/}; my $args_for_source = $arg_specs; if ( $source->{project} ) { my $illegal = sub { my ( $option ) = @_; return sub { die "Option $option is illegal in project ackrcs"; }; }; $args_for_source = { %$args_for_source, 'output=s'=> $illegal->('--output'), 'pager:s' => $illegal->('--pager'), 'match=s' => $illegal->('--match'), }; } my $ret; if ( ref($args) ) { local @ARGV = @{$args}; $ret = Getopt::Long::GetOptions( %{$args_for_source} ); @{$args} = @ARGV; } else { ( $ret, $source->{contents} ) = Getopt::Long::GetOptionsFromString( $args, %{$args_for_source} ); } if ( !$ret ) { if ( !$is_help_types_active ) { my $where = $source_name eq 'ARGV' ? 'on command line' : "in $source_name"; App::Ack::die( "Invalid option $where" ); } } if ( $opt->{noenv_seen} ) { App::Ack::die( "--noenv found in $source_name" ); } } # XXX We need to check on a -- in the middle of a non-ARGV source return; } sub should_dump_options { my ( $sources ) = @_; foreach my $source (@{$sources}) { my ( $name, $options ) = @{$source}{qw/name contents/}; if($name eq 'ARGV') { my $dump; local @ARGV = @{$options}; Getopt::Long::Configure('default', 'pass_through', 'no_auto_help', 'no_auto_version'); Getopt::Long::GetOptions( 'dump' => \$dump, ); @{$options} = @ARGV; return $dump; } } return; } sub explode_sources { my ( $sources ) = @_; my @new_sources; Getopt::Long::Configure('default', 'pass_through', 'no_auto_help', 'no_auto_version'); my %opt; my $arg_spec = get_arg_spec(\%opt); my $add_type = sub { my ( undef, $arg ) = @_; # XXX refactor? if ( $arg =~ /(\w+)=/) { $arg_spec->{$1} = sub {}; } else { ( $arg ) = split /:/, $arg; $arg_spec->{$arg} = sub {}; } }; my $del_type = sub { my ( undef, $arg ) = @_; delete $arg_spec->{$arg}; }; foreach my $source (@{$sources}) { my ( $name, $options ) = @{$source}{qw/name contents/}; if ( ref($options) ne 'ARRAY' ) { $source->{contents} = $options = [ Text::ParseWords::shellwords($options) ]; } for ( my $j = 0; $j < @{$options}; $j++ ) { next unless $options->[$j] =~ /^-/; my @chunk = ( $options->[$j] ); push @chunk, $options->[$j] while ++$j < @{$options} && $options->[$j] !~ /^-/; $j--; my @copy = @chunk; local @ARGV = @chunk; Getopt::Long::GetOptions( 'type-add=s' => $add_type, 'type-set=s' => $add_type, 'type-del=s' => $del_type, ); Getopt::Long::GetOptions( %{$arg_spec} ); push @new_sources, { name => $name, contents => \@copy, }; } } return \@new_sources; } sub compare_opts { my ( $a, $b ) = @_; my $first_a = $a->[0]; my $first_b = $b->[0]; $first_a =~ s/^--?//; $first_b =~ s/^--?//; return $first_a cmp $first_b; } sub dump_options { my ( $sources ) = @_; $sources = explode_sources($sources); my %opts_by_source; my @source_names; foreach my $source (@{$sources}) { my ( $name, $contents ) = @{$source}{qw/name contents/}; if ( not $opts_by_source{$name} ) { $opts_by_source{$name} = []; push @source_names, $name; } push @{$opts_by_source{$name}}, $contents; } foreach my $name (@source_names) { my $contents = $opts_by_source{$name}; print $name, "\n"; print '=' x length($name), "\n"; print ' ', join(' ', @{$_}), "\n" foreach sort { compare_opts($a, $b) } @{$contents}; } return; } sub remove_default_options_if_needed { my ( $sources ) = @_; my $default_index; foreach my $index ( 0 .. $#$sources ) { if ( $sources->[$index]{'name'} eq 'Defaults' ) { $default_index = $index; last; } } return $sources unless defined $default_index; my $should_remove = 0; # Start with default options, minus some annoying ones. Getopt::Long::Configure('default', 'no_auto_help', 'no_auto_version'); Getopt::Long::Configure( 'no_ignore_case', 'no_auto_abbrev', 'pass_through', ); foreach my $index ( $default_index + 1 .. $#$sources ) { my ( $name, $args ) = @{$sources->[$index]}{qw/name contents/}; if (ref($args)) { local @ARGV = @{$args}; Getopt::Long::GetOptions( 'ignore-ack-defaults' => \$should_remove, ); @{$args} = @ARGV; } else { ( undef, $sources->[$index]{contents} ) = Getopt::Long::GetOptionsFromString($args, 'ignore-ack-defaults' => \$should_remove, ); } } Getopt::Long::Configure('default'); Getopt::Long::Configure('default', 'no_auto_help', 'no_auto_version'); return $sources unless $should_remove; my @copy = @{$sources}; splice @copy, $default_index, 1; return \@copy; } sub check_for_mutually_exclusive_options { my ( $arg_sources ) = @_; my %mutually_exclusive_with; my @copy = @{$arg_sources}; for(my $i = 0; $i < @INVALID_COMBINATIONS; $i += 2) { my ( $lhs, $rhs ) = @INVALID_COMBINATIONS[ $i, $i + 1 ]; foreach my $l_opt ( @{$lhs} ) { foreach my $r_opt ( @{$rhs} ) { push @{ $mutually_exclusive_with{ $l_opt } }, $r_opt; push @{ $mutually_exclusive_with{ $r_opt } }, $l_opt; } } } while( @copy ) { my %set_opts; my $source = shift @copy; my ( $source_name, $args ) = @{$source}{qw/name contents/}; $args = ref($args) ? [ @{$args} ] : [ Text::ParseWords::shellwords($args) ]; foreach my $opt ( @{$args} ) { next unless $opt =~ /^[-+]/; last if $opt eq '--'; if( $opt =~ /^(.*)=/ ) { $opt = $1; } elsif ( $opt =~ /^(-[^-]).+/ ) { $opt = $1; } $set_opts{ $opt } = 1; my $mutex_opts = $mutually_exclusive_with{ $opt }; next unless $mutex_opts; foreach my $mutex_opt ( @{$mutex_opts} ) { if($set_opts{ $mutex_opt }) { die "Options '$mutex_opt' and '$opt' are mutually exclusive\n"; } } } } } sub process_args { my $arg_sources = \@_; my %opt = ( pager => $ENV{ACK_PAGER_COLOR} || $ENV{ACK_PAGER}, ); check_for_mutually_exclusive_options($arg_sources); $arg_sources = remove_default_options_if_needed($arg_sources); if ( should_dump_options($arg_sources) ) { dump_options($arg_sources); exit(0); } my $type_specs = process_filetypes(\%opt, $arg_sources); process_other(\%opt, $type_specs, $arg_sources); while ( @{$arg_sources} ) { my $source = shift @{$arg_sources}; my ( $source_name, $args ) = @{$source}{qw/name contents/}; # All of our sources should be transformed into an array ref if ( ref($args) ) { if ( $source_name eq 'ARGV' ) { @ARGV = @{$args}; } elsif (@{$args}) { Carp::croak "source '$source_name' has extra arguments!"; } } else { Carp::croak 'The impossible has occurred!'; } } my $filters = ($opt{filters} ||= []); # Throw the default filter in if no others are selected. if ( not grep { !$_->is_inverted() } @{$filters} ) { push @{$filters}, App::Ack::Filter::Default->new(); } return \%opt; } sub retrieve_arg_sources { my @arg_sources; my $noenv; my $ackrc; Getopt::Long::Configure('default', 'no_auto_help', 'no_auto_version'); Getopt::Long::Configure('pass_through'); Getopt::Long::Configure('no_auto_abbrev'); Getopt::Long::GetOptions( 'noenv' => \$noenv, 'ackrc=s' => \$ackrc, ); Getopt::Long::Configure('default', 'no_auto_help', 'no_auto_version'); my @files; if ( !$noenv ) { my $finder = App::Ack::ConfigFinder->new; @files = $finder->find_config_files; } if ( $ackrc ) { # We explicitly use open so we get a nice error message. # XXX This is a potential race condition!. if(open my $fh, '<', $ackrc) { close $fh; } else { die "Unable to load ackrc '$ackrc': $!" } push( @files, { path => $ackrc } ); } push @arg_sources, { name => 'Defaults', contents => [ App::Ack::ConfigDefault::options() ], }; foreach my $file ( @files) { my @lines = App::Ack::ConfigFinder::read_rcfile($file->{path}); if(@lines) { push @arg_sources, { name => $file->{path}, contents => \@lines, project => $file->{project}, }; } } if ( $ENV{ACK_OPTIONS} && !$noenv ) { push @arg_sources, { name => 'ACK_OPTIONS', contents => $ENV{ACK_OPTIONS}, }; } push @arg_sources, { name => 'ARGV', contents => [ @ARGV ], }; return @arg_sources; } 1; # End of App::Ack::ConfigLoader ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������