File Coverage

blib/lib/Binary/Heap/Array.pm
Criterion Covered Total %
statement 3029 4449 68.0
branch 992 2228 44.5
condition 242 808 29.9
subroutine 535 624 85.7
pod 1 9 11.1
total 4799 8118 59.1


line stmt bran cond sub pod time code
1             #!/usr/bin/perl
2             #-------------------------------------------------------------------------------
3             # An extensible array implemented as a binary heap in 100% Pure Perl
4             # Philip R Brenan at gmail dot com, Appa Apps Ltd, 2017
5             #-------------------------------------------------------------------------------
6              
7             package Binary::Heap::Array;
8             require v5.16.0;
9 1     1   536 use warnings FATAL => qw(all);
  1         1  
  1         27  
10 1     1   3 use strict;
  1         2  
  1         14  
11 1     1   2 use Carp;
  1         1  
  1         59  
12 1     1   459 use Data::Table::Text 2017.114 qw(:all);
  1         15110  
  1         191  
13 1     1   433 use Time::HiRes qw(time);
  1         967  
  1         3  
14             our $VERSION = 2017.121;
15              
16             saveToS3('BinaryHeapArray') if 0; # Save to S3:- this will not work, unless you're me, or you happen, to know the key
17              
18             my @speedChars = split //, 'ipsw'; # The names of the optimisations
19             my @packages; # The names of the generated packages
20             our @optimisations; # All combinations of optimizations
21              
22             for my $speedNo(0..(1<<@speedChars)-1) # Create a package for each combination of optimisations
23             {my $pack = '';
24             my $opts = '';
25             for(keys @speedChars) # Each optimisation available
26             {my $c = ($speedNo>>$_) % 2;
27             $pack .= $c ? uc($speedChars[$_]) : lc($speedChars[$_]);
28             $opts .= $c ? lc($speedChars[$_]) : '';
29             }
30             push @optimisations, $opts; # All optimization possibilities
31              
32             my $code = &code; # Base code
33             my $s = <
34             package Binary::Heap::Array::$pack;
35             use Data::Dump qw(dump);
36             use Data::Table::Text 2017.114 qw(:all);
37             use Carp;
38              
39             sub speedNo{$speedNo} # Speed number
40              
41             $code
42             END
43 1 0 0 1   3 eval $s; # Generate and optimise the package
  1 0 0 1   1  
  1 0 0 1   53  
  1 0 0 1   3  
  1 0 0 1   13  
  1 0 0 1   159  
  1 0 0 1   3  
  1 0 0 1   1  
  1 0 0 1   109  
  1 0 0 1   3  
  1 0 0 1   1  
  1 0 0 1   49  
  1 0 0 1   3  
  1 0 0 1   0  
  1 0 0 1   48  
  1 0 0 1   2  
  1 0 0 1   1  
  1 0 0 1   58  
  1 0 0 1   3  
  1 0 0 1   1  
  1 0 0 1   55  
  1 0 0 1   5  
  1 0 0 1   1  
  1 0 0 1   73  
  1 0 0 1   3  
  1 0 0 1   1  
  1 0 0 1   51  
  1 0 0 1   3  
  1 0 0 1   1  
  1 0 0 1   1503  
  1 0 0 1   4  
  1 0 0 1   1  
  1 0 33 1   10  
  1 0 33 1   5  
  1 0 33 1   1  
  1 0 33 1   50  
  1 0 33 1   3  
  1 0 33 1   12  
  1 0 33 1   155  
  1 0 33 1   4  
  1 0 33 1   0  
  1 0 33 1   104  
  1 0 33 1   3  
  1 0 33 1   1  
  1 0 33 1   51  
  1 0 33 1   3  
  1 0 33 1   1  
  1 0 33 1   45  
  1 0 0 1   2  
  1 0 0 1   1  
  1 0 66 1   53  
  1 0 0 1   3  
  1 0 0 1   1  
  1 0 66 1   48  
  1 0 0 1   3  
  1 0 66 1   1  
  1 0 0 1   49  
  1 0 66 1   14  
  1 0 0 1   1  
  1 0 66 1   52  
  1 0 66 1   3  
  1 0 66 1   0  
  1 0 66 1   1748  
  1 0 0 1   4  
  1 0 66 1   2  
  1 0 0 1   5  
  1 0 66 1   4  
  1 0 66 1   2  
  1 0 0 1   39  
  1 0 66 1   3  
  1 0 66 1   12  
  1 0 0 1   155  
  1 0 0 1   4  
  1 0 0 1   1  
  1 0 0 1   106  
  1 0 0 1   3  
  1 0 66 1   1  
  1 0 0 1   49  
  1 0 66 1   3  
  1 0 66 1   1  
  1 0 0 1   47  
  1 0 66 1   2  
  1 0 0 1   1  
  1 0 66 1   53  
  1 0 0 1   3  
  1 0 0 1   1  
  1 0 66 1   50  
  1 0 66 1   3  
  1 0 66 1   1  
  1 0 66 1   49  
  1 0 0 1   3  
  1 0 66 1   0  
  1 0 0 1   45  
  1 0 66 1   3  
  1 0 0 1   0  
  1 0 0 1   1471  
  1 50 0 1   5  
  1 100 33 1   1  
  1 50 33 1   6  
  1 100 0 1   5  
  1 50 0 1   2  
  1 100 33 1   57  
  1 50 33 1   4  
  1 100 0 1   14  
  1 50 33 1   156  
  1 100 0 1   4  
  1 50 0 1   1  
  1 100 33 1   99  
  1 50 0 1   4  
  1 100 33 1   1  
  1 50 0 1   64  
  1 100 33 1   3  
  1 50 0 1   1  
  1 100 66 1   46  
  1 50 66 1   3  
  1 100 0 1   1  
  1 50 0 1   60  
  1 100 0 1   3  
  1 50 0 1   1  
  1 100 66 1   54  
  1 50 66 1   6  
  1 100 0 1   1  
  1 50 0 1   47  
  1 100 66 1   3  
  1 50 66 1   0  
  1 100 66 1   48  
  1 50 66 1   2  
  1 100 0 1   1  
  1 50 0 1   1433  
  1 100 66 1   5  
  1 100 66 1   1  
  1 50 0 1   8  
  1 100 66 1   4  
  1 100 0 1   1  
  1 50 66 1   43  
  1 100 0 1   5  
  1 100 0 1   12  
  1 50 0 1   152  
  1 100 66 1   4  
  1 100 66 1   1  
  1 50 66 1   129  
  1 100 66 1   4  
  1 100 0 1   1  
  1 50 0 1   50  
  1 100 66 1   4  
  1 100 33 1   0  
  1 50 33 1   49  
  1 100 33 1   3  
  1 100 33 1   1  
  1 50 33 1   55  
  1 100 33 1   5  
  1 100 33 1   1  
  1 50 33 1   51  
  1 100 66 1   3  
  1 100 33 1   1  
  1 50 33 1   46  
  1 100 33 1   3  
  1 100 33 1   1  
  1 50 33 1   47  
  1 100 33 1   3  
  1 100 33 1   1  
  1 50 33 1   1424  
  1 100 33 1   4  
  1 100 33 1   1  
  1 50 33 1   5  
  1 100 66 1   4  
  1 100 33 1   1  
  1 50 33 1   40  
  1 100 66 1   3  
  1 100 33 1   12  
  1 50 33 1   154  
  1 100 66 1   3  
  1 100 33 1   1  
  1 50 33 1   104  
  1 100 33 1   3  
  1 100 33 1   4  
  1 50 33 0   49  
  1 100 66 13664   3  
  1 100 33 9704   1  
  1 50 33 9704   45  
  1 100 33 9704   3  
  1 100 33 13640   2  
  1 50 33 13674   56  
  1 100 33 13640   3  
  1 100 33 9704   4  
  1 50 33 13664   71  
  1 100 66 13643   4  
  1 100 33 9704   1  
  1 50 33 9704   77  
  1 100 66 9704   3  
  1 100 33 9704   1  
  1 50 33 13664   54  
  1 100 0 13643   3  
  1 100 0 547   1  
  1 50 66 547   1443  
  1 100 33 3712   4  
  1 100 0 547   1  
  1 50 66 3733   5  
  1 100 0 3712   4  
  1 100 0 3712   2  
  1 50 66 3712   41  
  1 100 33 547   3  
  1 100 33 547   14  
  1 50 0 547   172  
  1 100 0 3733   4  
  1 100 0 3733   1  
  1 50 66 3737   114  
  1 100 33 547   4  
  1 100 0 547   1  
  1 50 0 9937   47  
  1 100 0 9928   3  
  1 100 0 9157   2  
  1 50 0 9157   44  
  1 100 0 9157   4  
  1 100 0 9931   0  
  1 50 0 9931   57  
  1 100 0 9931   3  
  1 100 0 9157   0  
  1 50 0 9157   50  
  1 100 0 9928   4  
  1 100 0 9157   1  
  1 50 0 9931   63  
  1 100 0 9157   3  
  1 100 0 9931   1  
  1 100 100 9157   73  
  1 100 100 4257   5  
  1 100 100 4257   1  
  1 50 100 4257   1487  
  1 100 100 4257   4  
  1 0 100 4257   1  
  1 0 100 4257   5  
  1 50 100 4257   5  
  1 100 100 4257   1  
  1 0 100 4257   44  
  1 0 100 4257   4  
  1 50 100 4257   17  
  1 100 100 4257   171  
  1 0 100 4257   5  
  1 0 100 4257   0  
  1 50 100 4257   100  
  1 100 33 4257   3  
  1 100 0 0   1  
  1 100 33 0   51  
  1 50 0 0   3  
  1 100 66 0   1  
  1 100 33 0   46  
  1 100 33 0   3  
  1 50 0 0   4  
  1 100 66 0   55  
  1 100 33 0   6  
  1 100 66 0   1  
  1 50 33 0   50  
  1 100 33 0   3  
  1 100 0 0   1  
  1 100 33 0   47  
  1 50 0 0   3  
  1 100 66 0   1  
  1 100 33 0   44  
  1 100 33 0   4  
  1 50 0 941725   1  
  1 100 33 0   1423  
  1 0 0 0   7  
  1 0 33 941725   1  
  1 50 0 0   6  
  1 100 66 60179   4  
  1 0 33 0   1  
  1 0 66 941725   45  
  1 50 33 0   3  
  1 100 66 941725   12  
  1 0 33 60179   151  
  1 0 66 60204   4  
  1 50 33 60179   1  
  1 100   0   99  
  1 0   80892   3  
  1 0   0   1  
  1 50   80923   46  
  1 100   80923   4  
  1 0   0   1  
  1 0   1292606   72  
  1 50   1292606   3  
  1 100   0   1  
  1 100   0   58  
  1 100   0   4  
  1 50   0   0  
  1 100   0   49  
  1 100   1292606   3  
  1 100   0   1  
  1 50   1292606   47  
  1 0   80881   3  
  1 0   9   1  
  1 0   9   72  
  1 0   9   7  
  1 0   9   1  
  1 0   9   1382  
  1 0   9   4  
  1 0   9   1  
  1 0   9   8  
  1 0   9   5  
  1 0   9   1  
  1 0   9   40  
  1 0   9   14  
  1 0   9   15  
  1 0   9   160  
  1 0   9   4  
  1 0   9   1  
  1 0   36350   101  
  1 50   36329   4  
  1 0   36329   1  
  1 0   333714   61  
  1 50   36350   3  
  1 0   36331   1  
  1 50   333714   47  
  1 0   333714   3  
  1 50   333714   0  
  1 0   333714   55  
  1 50   333714   3  
  1 50   36329   1  
  1 50   333714   51  
  1 50   333714   4  
  1 0   36350   1  
  1 50   36350   49  
  1 0   0   3  
  1 50   3465362   1  
  1 50   0   42  
  1 0   2817727   3  
  1 50   0   1  
  1 50   0   1461  
  1 0   181243   5  
  1 0   3128036   1  
  1 0   223837   9  
  1 0   162182   7  
  1 0   0   2  
  1 50   204728   58  
  1 0   0   4  
  1 50   3775671   14  
  1 50   0   162  
  1 50   0   3  
  1 50   152204   1  
  1 50   152204   99  
  1 50   133144   3  
  1 50   1936991   1  
  1 50   979047   51  
  1 50   1936991   3  
  1 50   90579   1  
  1 50   1289356   55  
  1 50   90593   3  
  1 50   109618   1  
  1 50   109618   53  
  1 50   979047   3  
  1 50   1626682   1  
  1 50   1289356   48  
  1 50   133144   3  
  1 50   1626682   2  
  1 50   1734   48  
  1 50   297683   3  
  1 50   297683   2  
  1 50   1734   42  
  1 50   1734   3  
  1 50   297683   1  
  1 50   297683   1490  
  1 50   1734   5  
  1 50   297683   1  
  1 50   1734   5  
  1 50   1734   4  
  1 50   297683   1  
  1 50   1734   41  
  1 50   297683   3  
  1 50   1735   14  
  1 100   297683   158  
  1 100   0   4  
  1 100   48989   1  
  1 100   67957   132  
  1 100   0   4  
  1 100   0   1  
  1 100   0   50  
  1 100   0   4  
  1 100   48982   1  
  1 100   67957   49  
  1 100   0   3  
  1 100   0   1  
  1 100   48982   112  
  1 100   67960   4  
  1 100   67960   1  
  1 100   48982   56  
  1 0   0   4  
  1 50   0   1  
  1 0   16575   51  
  1 50   16588   3  
  1 0   0   1  
  1 0   35594   50  
  1 50   0   7  
  1 50   16575   0  
  1 50   0   1405  
  1 50   0   4  
  1 0   0   1  
  1 50   35588   5  
  1 0   16575   4  
  1 50   35588   2  
  1 0   35594   41  
  1 0   0   4  
  1 50   0   12  
  1 50   37807   154  
  1 50   333714   4  
  1 50   333714   1  
  1 50   37806   99  
  1 50   333714   4  
  1 50   333714   1  
  1 50   333714   51  
  1 50   37807   3  
  1 50   37806   2  
  1 50   37808   46  
  1 50   333714   2  
  1 50   37807   1  
  1 50   333714   87  
  1 50   333714   4  
  1 50   37806   1  
  1 100   37807   55  
  1 50   827   3  
  1 0   828   1  
  1 0   827   48  
  1 0   827   3  
  1 0   827   1  
  1 0   827   49  
  1 0   827   7  
  1 0   827   0  
  1 0   827   1426  
  1 0   827   4  
  1 0   827   1  
  1 50   827   6  
  1 100   827   4  
  1 0   827   2  
  1 50   827   40  
  1 50   827   4  
  1 50   19059   13  
  1 50   310353   152  
  1 50   310353   4  
  1 50   19015   1  
  1 100   310353   104  
  1 50   310353   3  
  1 100   310353   2  
  1 100   19059   52  
  1 50   310353   56  
  1 100   19018   2  
  1 0   19018   45  
  1 50   19077   3  
  1 50   310353   2  
  1 50   19059   56  
  1 50   310353   3  
  1 50   19015   2  
  1 50   0   47  
  1 50   0   3  
  1 50   0   1  
  1 100   0   49  
  1 100   0   3  
  1 50   0   1  
  1 100   0   63  
  1 50   0   5  
  1 0   0   2  
  1 0   0   1440  
  1 0   0   5  
  1 0   0   1  
  1 0   0   6  
  1 0   0   6  
  1 0   0   1  
  1 0   0   44  
  1 0   3434540   4  
  1 0   7210211   12  
  1 50   403372   177  
  1 100   3124231   4  
  1 50   198644   1  
  1 0   441578   106  
  1 0   175159   4  
  1 0   5294343   1  
  1 0   5914961   47  
  1 0   156079   3  
  1 0   356402   1  
  1 0   2786925   44  
  1 0   217741   3  
  1 0   318278   1  
  1 0   6589593   55  
  1 50   2476616   2  
  1 100   6613348   1  
  1 0   727241   53  
  1 50   576769   3  
  1 50   758012   1  
  1 50   10389019   46  
  1 50   7579397   6  
  1 50   7258334   1  
  1 50   522513   48  
  1 50   10397124   3  
  1 50   6934411   1  
  1 100   538422   1429  
  1 100   560829   4  
  1 50   10386370   1  
  1 100   10399773   5  
  1 0   762259   4  
  1 50   723135   1  
  1 50   647721   40  
  1 50   124645   3  
  1 50   958074   13  
  1 50   958074   154  
  1 50   181590   4  
  1 50   181590   1  
  1 50   647721   132  
  1 100   181602   5  
  1 100   124607   1  
  1 50   181602   47  
  1 100   958074   3  
  1 50   124607   1  
  1 0   647721   50  
  1 0   124607   3  
  1 0   647721   0  
  1 0   958074   56  
  1 0   60137   3  
  1 0   120359   1  
  1 0   60140   50  
  1 0   941726   3  
  1 0   120359   1  
  1 0   1883451   50  
  1 50   1883451   3  
  1 100   941726   2  
  1 0   1883451   48  
  1 50   60140   3  
  1 50   1883451   1  
  1 50   60137   1423  
  1 50   120409   4  
  1 50   941726   2  
  1 50   941726   5  
  0 100   120359   0  
  0 50   1279008   0  
  0 100   1279008   0  
  0 100   78954   0  
  0 50   2571609   0  
  0 100   159784   0  
  0 50   2571609   0  
  0 0   1279008   0  
  0 0   1279008   0  
  0 0   78903   0  
  0 0   2571609   0  
  0 0   78954   0  
  0 0   159803   0  
  0 0   159868   0  
  0 0   159868   0  
  0 0   78903   0  
  0 0   2571609   0  
  0 50   190851   0  
  0 100   309838   0  
  0 50   1660047   0  
  0 0   681000   0  
  0 0   142837   0  
  0 0   100285   0  
  0 0   2280709   0  
  0 0   1638988   0  
  0 0   275981   0  
  0 0   110271   0  
  0 0   991353   0  
  0 0   157634   0  
  0 0   1328635   0  
  0 50   2955317   0  
  0 100   3575979   0  
  0 0   219889   0  
  0 50   0   0  
  0 50   0   0  
  0 50   0   0  
  0 50   0   0  
  0 50   0   0  
  0 50   0   0  
  0 50   0   0  
  0 50   0   0  
  0 100   0   0  
  0 100   0   0  
  0 50   0   0  
  0 100   0   0  
  0 50   0   0  
  0 0   0   0  
  0 0   0   0  
  0 0   0   0  
  0 0   782   0  
  0 0   782   0  
  0 0   782   0  
  0 0   782   0  
  0 0   782   0  
  0 0   785   0  
  0 0   782   0  
  0 50   782   0  
  0 100   782   0  
  0 0   782   0  
  0 50   782   0  
  0 50   782   0  
  0 50   782   0  
  0 50   782   0  
  0 50   782   0  
  0 50   782   0  
  0 100   42565   0  
  0 50   647630   0  
  0 100   647630   0  
  0 100   647630   0  
  0 50   647635   0  
  0 100   42592   0  
  0 50   42565   0  
  0 0   647630   0  
  0 0   647635   0  
  0 0   647635   0  
  0 0   42586   0  
  0 0   42592   0  
  0 0   647635   0  
  0 0   42586   0  
  0 0   42570   0  
  0 0   42565   0  
  0 0       0  
  0 50       0  
  0 100       0  
  0 0       0  
  0 50       0  
  0 50       0  
  0 50       0  
  0 50       0  
  0 50       0  
  0 50       0  
  0 100       0  
  0 50       0  
  0 100       0  
  0 100       0  
  0 50       0  
  0 0       0  
  0 50       0  
  0 50       0  
  0 0       0  
  0 0       0  
  0 0       0  
  0 0       0  
  0 50       0  
  0 50       0  
  0 0       0  
  0 0       0  
  0 50       0  
  0 50       0  
  0 50       0  
  0 50       0  
  0 0       0  
  0 0       0  
  0 50       0  
  0 50       0  
  0 0       0  
  0 50       0  
  0 0       0  
  0 50       0  
  0 0       0  
  0 0       0  
  0 0       0  
  0 50       0  
  0 50       0  
  0 50       0  
  0 50       0  
  0 0       0  
  0 0       0  
  0 50       0  
  0 50       0  
  0 100       0  
  0 50       0  
  0 50       0  
  0 50       0  
  0 50       0  
  0 50       0  
  0 50       0  
  0 50       0  
  0 100       0  
  0 100       0  
  0 50       0  
  0 0       0  
  0 0       0  
  0 50       0  
  0 50       0  
  0 50       0  
  0 50       0  
  0 50       0  
  0 50       0  
  0 50       0  
  0 100       0  
  0 50       0  
  0 50       0  
  0 0       0  
  0 0       0  
  0 50       0  
  0 50       0  
  0 50       0  
  0 50       0  
  0 50       0  
  0 50       0  
  0 50       0  
  0 100       0  
  0 50       0  
  0 50       0  
  0 0       0  
  0 50       0  
  0 50       0  
  0 50       0  
  0 50       0  
  0 50       0  
  0 50       0  
  0 50       0  
  0 50       0  
  0 100       0  
  0 100       0  
  0 50       0  
  0 0       0  
  0 0       0  
  0 50       0  
  0 50       0  
  0 50       0  
  0 50       0  
  0 50       0  
  0 50       0  
  0 50       0  
  0 100       0  
  0 50       0  
  0 50       0  
  0 0       0  
  0 0       0  
  0 50       0  
  0 50       0  
  0 50       0  
  0 50       0  
  0 50       0  
  0 50       0  
  0 50       0  
  0 100       0  
  0 50       0  
  0 50       0  
  0 0       0  
  0 0       0  
  0 50       0  
  0 50       0  
  0 50       0  
  0 50       0  
  0 50       0  
  0 50       0  
  0 50       0  
  0 100       0  
  0 50       0  
  0 50       0  
  0 50       0  
  0 100       0  
  0 50       0  
  0 50       0  
  0 50       0  
  0 50       0  
  0 50       0  
  0 50       0  
  0 50       0  
  0 100       0  
  0 100       0  
  0 50       0  
  0 0       0  
  0 50       0  
  0 50       0  
  0 50       0  
  0 50       0  
  0 50       0  
  0 50       0  
  0 50       0  
  0 50       0  
  0 100       0  
  0 100       0  
  0 50       0  
  0 0       0  
  0 50       0  
  0 50       0  
  0 50       0  
  0 50       0  
  0 50       0  
  0 50       0  
  0 50       0  
  0 50       0  
  0 100       0  
  0 100       0  
  0 50       0  
  0 0       0  
  0 0       0  
  0 50       0  
  0 50       0  
  0 50       0  
  0 50       0  
  0 50       0  
  0 50       0  
  0 50       0  
  0 100       0  
  0 50       0  
  0 50       0  
  0 50       0  
  0 100       0  
  0 50       0  
  0 50       0  
  0 50       0  
  0 50       0  
  0 50       0  
  0 50       0  
  0 50       0  
  0 100       0  
  0 100       0  
  13664 50       1803247  
  13664 0       15045  
  13664 0       45252  
  13664 50       22112  
  3733 50       4958  
  9704 50       2711238  
  9704 50       16051  
  9704 50       32286  
  9704 50       20983  
  547 50       926  
  9704 100       2571081  
  9704 50       13261  
  9704 50       31503  
  9704 0       19322  
  547 0       690  
  9704 50       2504889  
  9704 50       12550  
  9704 50       35811  
  9704 50       21115  
  547 50       690  
  13640 50       2139222  
  13640 50       16847  
  13640 100       42219  
  13640 50       23029  
  3712 50       4936  
  13674 0       2100740  
  13674 50       16239  
  13674 50       50081  
  13674 50       23434  
  3737 50       4942  
  13640 50       2965225  
  13640 50       15894  
  13640 50       42196  
  13640 50       22041  
  3712 100       4084  
  9704 100       2467477  
  9704 50       13835  
  9704 50       37791  
  9704 100       18966  
  547 50       684  
  13664 50       2277232  
  13664 50       16931  
  13664 50       50788  
  13664 50       23495  
  3733 50       5343  
  13643 50       1909383  
  13643 100       16354  
  13643 100       42455  
  13643 100       24138  
  3712 0       4788  
  9704 50       2826671  
  9704 100       15518  
  9704 50       32464  
  9704 50       21075  
  547 100       758  
  9704 50       2719994  
  9704 50       13383  
  9704 100       37792  
  9704 50       19275  
  547 50       812  
  9704 100       2674774  
  9704 50       13429  
  9704 50       37125  
  9704 100       19175  
  547 0       796  
  9704 50       2554397  
  9704 100       12789  
  9704 0       38014  
  9704 50       19489  
  547 100       882  
  13664 0       2176465  
  13664 50       15260  
  13664 100       46761  
  13664 0       23747  
  3733 50       4581  
  13643 100       1809457  
  13643 50       15168  
  13643 50       40534  
  13643 100       23137  
  3712 50       4415  
  547 50       554  
  547 100       602  
  547 50       669  
  547 50       664  
  547 100       1013  
  3718 0       2681  
  3718 50       5351  
  1441 100       1065  
  1441 50       3051  
  894 50       661  
  0 100       0  
  547 0       441  
  547 50       558  
  547 100       555  
  547 0       548  
  547 50       963  
  3718 50       2134  
  3718 0       4435  
  1441 0       953  
  1441 0       2526  
  894 50       663  
  0 0       0  
  3712 0       2998  
  3712 0       3523  
  3712 50       3602  
  3712 100       3608  
  3712 100       5429  
  12214 50       7777  
  12214 50       14670  
  6721 100       4518  
  6721 50       12310  
  3009 50       2446  
  0 50       0  
  547 0       477  
  547 0       492  
  547 0       619  
  547 50       533  
  547 100       870  
  3718 100       2239  
  3718 50       4449  
  1441 50       1016  
  1441 0       2854  
  894 0       678  
  0 0       0  
  3733 50       2861  
  3733 0       3977  
  3733 0       3828  
  3733 0       3562  
  3733 50       7243  
  11913 100       7481  
  11913 100       14530  
  7529 50       5272  
  7529 50       12730  
  3796 100       3011  
  0 50       0  
  3712 50       2853  
  3712 50       3294  
  3712 100       3661  
  3712 50       3332  
  3712 50       5080  
  12145 50       7845  
  12145 0       14894  
  7250 0       4773  
  7250 0       12633  
  3538 50       2833  
  0 0       0  
  3712 0       3198  
  3712 0       3345  
  3712 50       3766  
  3712 0       3611  
  3712 0       5832  
  12145 0       7783  
  12145 50       15476  
  7250 100       5212  
  7250 100       12830  
  3538 50       2991  
  0 50       0  
  3712 100       2822  
  3712 50       3309  
  3712 50       3614  
  3712 0       3339  
  3712 0       5283  
  12214 0       7623  
  12214 0       14808  
  6721 0       4857  
  6721 0       12149  
  3009 0       2373  
  0 0       0  
  547 0       460  
  547 0       524  
  547 0       660  
  547 0       581  
  547 0       821  
  3718 0       2234  
  3718 0       4389  
  1441 0       920  
  1441 0       2875  
  894 0       707  
  0 0       0  
  547 0       420  
  547 50       521  
  547 50       530  
  547 0       565  
  547 0       734  
  3718 0       2232  
  3718 0       4439  
  1441 50       884  
  1441 50       2699  
  894 50       670  
  0 50       0  
  547 50       467  
  547 50       550  
  547 100       529  
  547 50       528  
  547 0       792  
  3718 0       2124  
  3718 0       4492  
  1441 0       969  
  1441 50       2639  
  894 50       697  
  0 50       0  
  3733 50       2870  
  3733 50       3407  
  3733 50       4243  
  3733 100       3824  
  3733 50       6128  
  11913 50       7671  
  11913 50       14312  
  7529 50       5114  
  7529 50       13184  
  3796 100       2901  
  0 50       0  
  3733 0       3198  
  3733 0       3365  
  3733 0       3987  
  3733 0       3794  
  3733 50       5690  
  11913 50       7539  
  11913 0       14628  
  7529 0       5240  
  7529 0       13481  
  3796 0       3043  
  0 50       0  
  3737 50       2761  
  3737 50       3295  
  3737 50       3734  
  3737 50       4087  
  3737 50       6877  
  11921 100       8224  
  11921 50       14854  
  7533 0       5091  
  7533 0       12924  
  3796 0       3047  
  0 0       0  
  547 50       499  
  547 50       570  
  547 0       633  
  547 0       577  
  547 0       1189  
  3718 0       2111  
  3718 50       4500  
  1441 50       1006  
  1441 0       2650  
  894 0       699  
  0 0       0  
  547 0       512  
  547 50       592  
  547 50       699  
  547 50       619  
  547 50       876  
  3718 50       2396  
  3718 50       4836  
  1441 100       1087  
  1441 50       3239  
  894 50       746  
  0 50       0  
  9937 50       7817  
  9937 50       10510  
  9937 100       11569  
  9937 50       10886  
  9937 50       17935  
  72393 50       44022  
  72393 50       87637  
  19517 50       16436  
  19517 100       41271  
  9580 50       9573  
  0 50       0  
  9928 50       7715  
  9928 50       9435  
  9928 50       10361  
  9928 100       9686  
  9928 50       16431  
  64475 50       38222  
  64475 100       75945  
  14748 50       11811  
  14748 0       35926  
  4820 50       4088  
  0 0       0  
  9157 50       7771  
  9157 0       9202  
  9157 50       9213  
  9157 100       9015  
  9157 50       15708  
  68323 100       43292  
  68323 50       85007  
  13286 100       10214  
  13286 50       36400  
  4129 0       4260  
  0 50       0  
  9157 100       7489  
  9157 50       9769  
  9157 100       8925  
  9157 50       10760  
  9157 0       16300  
  68323 50       40962  
  68323 100       81811  
  13286 50       11860  
  13286 100       35599  
  4129 50       3707  
  0 0       0  
  9157 50       8543  
  9157 0       9163  
  9157 50       11016  
  9157 0       10693  
  9157         17276  
  68326         43347  
  68326         83009  
  13286         10677  
  13286         34174  
  4129         5037  
  0         0  
  9931         8242  
  9931         9105  
  9931         10633  
  9931         9817  
  9931         15497  
  72387         43284  
  72387         86378  
  19511         13843  
  19511         40659  
  9580         8397  
  0         0  
  9931         8307  
  9931         9384  
  9931         11288  
  9931         10145  
  9931         16517  
  72387         43026  
  72387         89171  
  19511         13594  
  19511         41171  
  9580         8525  
  0         0  
  9931         7731  
  9931         9975  
  9931         10112  
  9931         9411  
  9931         17396  
  72387         42195  
  72387         86238  
  19511         15151  
  19511         37441  
  9580         8574  
  0         0  
  9157         8007  
  9157         8171  
  9157         8998  
  9157         9209  
  9157         16195  
  68326         41525  
  68326         81756  
  13286         10941  
  13286         35018  
  4129         4082  
  0         0  
  9157         7358  
  9157         9551  
  9157         9596  
  9157         9867  
  9157         15475  
  68323         41602  
  68323         82216  
  13286         10021  
  13286         34289  
  4129         4019  
  0         0  
  9928         8443  
  9928         8913  
  9928         10948  
  9928         9366  
  9928         16356  
  64475         39522  
  64475         79671  
  14748         11015  
  14748         36002  
  4820         4300  
  0         0  
  9157         8806  
  9157         9401  
  9157         9574  
  9157         10713  
  9157         19536  
  68323         42722  
  68323         84654  
  13286         11212  
  13286         35781  
  4129         4394  
  0         0  
  9931         7813  
  9931         8747  
  9931         10392  
  9931         9822  
  9931         15552  
  64809         38883  
  64809         75970  
  15159         12687  
  15159         32787  
  5228         4614  
  0         0  
  9157         7694  
  9157         9171  
  9157         11968  
  9157         11262  
  9157         18425  
  68326         41583  
  68326         84952  
  13286         20757  
  13286         33436  
  4129         3902  
  0         0  
  9931         7609  
  9931         9087  
  9931         10615  
  9931         9053  
  9931         16402  
  64809         38444  
  64809         76473  
  15159         10329  
  15159         35281  
  5228         4642  
  0         0  
  9157         7775  
  9157         9788  
  9157         9356  
  9157         9270  
  9157         15897  
  68326         40619  
  68326         84670  
  13286         10237  
  13286         34092  
  4129         3974  
  0         0  
  4257         3770  
  4257         4677  
  4257         4314  
  4257         3191  
  4257         6828  
  39259         50611  
  24743         20666  
  24743         16600  
  24743         20840  
  4257         4819  
  4257         4377  
  4257         4773  
  4257         24765  
  4257         7698  
  4257         81188  
  4257         4064  
  4257         5044  
  4257         4806  
  4257         2960  
  4257         6569  
  36004         45204  
  18768         16433  
  18768         12679  
  18768         16071  
  4257         4851  
  0         0  
  0         0  
  0         0  
  0         0  
  4257         81759  
  4257         4099  
  4257         4835  
  4257         4604  
  4257         3325  
  4257         6967  
  36004         44986  
  18768         17063  
  18768         13138  
  18768         16772  
  4257         4792  
  0         0  
  0         0  
  0         0  
  0         0  
  4257         77895  
  4257         4029  
  4257         5410  
  4257         4761  
  4257         3191  
  4257         6053  
  36004         44635  
  18768         16364  
  18768         12826  
  18768         15703  
  4257         4588  
  0         0  
  0         0  
  0         0  
  0         0  
  4257         76413  
  4257         3800  
  4257         4678  
  4257         4762  
  4257         3207  
  4257         6254  
  39259         50022  
  24743         22328  
  24743         18207  
  24743         20611  
  4257         5782  
  4257         4723  
  4257         4249  
  4257         25146  
  4257         8106  
  4257         74401  
  4257         3936  
  4257         4393  
  4257         4495  
  4257         3202  
  4257         5942  
  39786         49152  
  22620         18843  
  22620         14750  
  22620         18888  
  4257         5211  
  4257         4386  
  4257         4231  
  4257         16344  
  4257         7250  
  4257         76589  
  4257         3525  
  4257         4668  
  4257         4625  
  4257         3211  
  4257         6148  
  39844         48228  
  20233         16948  
  20233         13281  
  20233         17631  
  4257         4553  
  4257         4514  
  4257         4147  
  4257         16648  
  4257         6871  
  4257         71945  
  4257         3601  
  4257         4400  
  4257         4450  
  4257         3520  
  4257         6243  
  39844         48549  
  20233         18445  
  20233         13630  
  20233         17767  
  4257         4854  
  4257         4266  
  4257         4112  
  4257         16711  
  4257         7150  
  4257         74377  
  4257         3727  
  4257         4968  
  4257         4582  
  4257         3025  
  4257         6272  
  39786         52072  
  22620         19511  
  22620         15823  
  22620         20203  
  4257         5257  
  4257         4679  
  4257         4635  
  4257         16461  
  4257         7408  
  4257         77466  
  4257         3973  
  4257         5869  
  4257         5759  
  4257         3710  
  4257         6617  
  35978         48123  
  18768         17389  
  18768         13227  
  18768         16512  
  4257         5072  
  0         0  
  0         0  
  0         0  
  0         0  
  4257         82865  
  4257         4221  
  4257         5097  
  4257         5646  
  4257         3620  
  4257         7033  
  36004         45116  
  18768         16992  
  18768         12871  
  18768         16737  
  4257         5249  
  0         0  
  0         0  
  0         0  
  0         0  
  4257         80554  
  4257         3950  
  4257         5178  
  4257         4988  
  4257         3472  
  4257         6143  
  35978         44992  
  18768         16374  
  18768         12952  
  18768         16551  
  4257         4995  
  0         0  
  0         0  
  0         0  
  0         0  
  4257         79634  
  4257         4199  
  4257         4696  
  4257         4937  
  4257         3177  
  4257         6150  
  35978         44549  
  18768         17157  
  18768         12799  
  18768         16165  
  4257         4802  
  0         0  
  0         0  
  0         0  
  0         0  
  4257         79048  
  4257         4284  
  4257         5060  
  4257         4850  
  4257         3426  
  4257         6399  
  35978         49607  
  18768         18021  
  18768         12988  
  18768         16568  
  4257         4904  
  0         0  
  0         0  
  0         0  
  0         0  
  4257         81552  
  4257         3902  
  4257         4473  
  4257         4333  
  4257         2946  
  4257         6227  
  39259         49054  
  24743         22281  
  24743         17264  
  24743         20747  
  4257         4837  
  4257         4576  
  4257         4955  
  4257         24937  
  4257         7672  
  4257         73830  
  4257         3738  
  4257         4554  
  4257         4311  
  4257         3497  
  4257         5696  
  39259         47422  
  24743         20918  
  24743         16685  
  24743         20469  
  4257         4718  
  4257         4130  
  4257         4690  
  4257         24449  
  4257         7109  
  4257         71710  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  941725         618924  
  941725         750987  
  941725         1495272  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  941725         618792  
  941725         747811  
  941725         1481937  
  0         0  
  0         0  
  0         0  
  60179         42150  
  60179         54446  
  60179         134626  
  0         0  
  0         0  
  0         0  
  941725         614464  
  941725         760703  
  941725         1601661  
  0         0  
  0         0  
  0         0  
  941725         613924  
  941725         736369  
  941725         1452704  
  60179         40589  
  60179         51017  
  60179         117828  
  60204         41963  
  60204         55315  
  60204         122520  
  60179         42523  
  60179         48859  
  60179         119266  
  0         0  
  0         0  
  0         0  
  80892         54641  
  80892         62513  
  80892         180964  
  0         0  
  0         0  
  0         0  
  80923         55054  
  80923         63201  
  80923         186333  
  80923         54462  
  80923         63926  
  80923         194319  
  0         0  
  0         0  
  0         0  
  1292606         820406  
  1292606         1033727  
  1292606         2937488  
  1292606         873502  
  1292606         990883  
  1292606         3221834  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  1292606         873493  
  1292606         1042436  
  1292606         2957885  
  0         0  
  0         0  
  0         0  
  1292606         891315  
  1292606         999260  
  1292606         3289404  
  80881         55490  
  80881         66769  
  80881         193179  
  9         12  
  9         16  
  9         15  
  9         14  
  9         14  
  45         51  
  9         22  
  9         11  
  9         16  
  9         14  
  9         16  
  9         18  
  45         51  
  9         19  
  9         10  
  9         17  
  9         17  
  9         24  
  9         19  
  45         52  
  9         21  
  9         13  
  9         22  
  9         16  
  9         21  
  9         22  
  45         54  
  9         25  
  9         14  
  9         23  
  9         16  
  9         16  
  9         23  
  45         56  
  9         24  
  9         15  
  9         17  
  9         15  
  9         23  
  9         21  
  45         55  
  9         25  
  9         15  
  9         24  
  9         23  
  9         19  
  9         16  
  45         52  
  9         23  
  9         11  
  9         14  
  9         14  
  9         16  
  9         17  
  45         47  
  9         20  
  9         13  
  9         13  
  9         14  
  9         16  
  9         13  
  45         55  
  9         20  
  9         17  
  9         19  
  9         20  
  9         22  
  9         17  
  45         62  
  9         27  
  9         16  
  9         18  
  9         17  
  9         20  
  9         17  
  45         52  
  9         22  
  9         22  
  9         22  
  9         21  
  9         27  
  9         29  
  45         65  
  9         27  
  9         13  
  9         18  
  9         15  
  9         19  
  9         16  
  45         52  
  9         27  
  9         15  
  9         20  
  9         18  
  9         20  
  9         22  
  45         54  
  9         27  
  9         10  
  9         26  
  9         10  
  9         17  
  9         12  
  45         47  
  9         19  
  9         19  
  9         19  
  9         16  
  9         22  
  9         25  
  45         51  
  9         24  
  36350         24184  
  36350         30938  
  36350         34022  
  36350         47220  
  69622         114383  
  1974         3605  
  36329         24230  
  36329         33351  
  36329         35834  
  36329         53210  
  69581         117014  
  1971         3018  
  36329         28234  
  36329         34161  
  36329         35562  
  36329         44825  
  69581         131381  
  1971         3141  
  333714         245961  
  333714         288073  
  333714         357550  
  333714         383283  
  645181         1128935  
  13609         20283  
  36350         25212  
  36350         32378  
  36350         34880  
  36350         42538  
  69622         121564  
  1971         2861  
  36331         24965  
  36331         33964  
  36331         33999  
  36331         56795  
  69582         123813  
  1973         3107  
  333714         232114  
  333714         303180  
  333714         325989  
  333714         376397  
  645181         1109337  
  13609         19465  
  333714         231830  
  333714         295060  
  333714         310099  
  333714         382999  
  645186         1105950  
  13604         21128  
  333714         221685  
  333714         288636  
  333714         316980  
  333714         436863  
  645181         1091273  
  13609         22607  
  333714         231433  
  333714         275331  
  333714         318497  
  333714         444512  
  645186         1079637  
  13604         20306  
  333714         225623  
  333714         308938  
  333714         334768  
  333714         377748  
  645186         1098483  
  13604         20351  
  36329         24384  
  36329         32082  
  36329         35890  
  36329         43167  
  69581         118678  
  1971         2880  
  333714         215942  
  333714         298191  
  333714         315724  
  333714         424992  
  645181         1053872  
  13609         21796  
  333714         221618  
  333714         298479  
  333714         318081  
  333714         434537  
  645186         1061197  
  13604         22585  
  36350         28198  
  36350         35298  
  36350         35250  
  36350         45580  
  69622         123708  
  1974         3001  
  36350         23963  
  36350         34556  
  36350         37467  
  36350         55726  
  69622         124944  
  1971         3302  
  0         0  
  0         0  
  0         0  
  3465362         2208887  
  3465362         2731870  
  3465362         6723646  
  0         0  
  0         0  
  0         0  
  2817727         1812115  
  2817727         2154970  
  2817727         5631675  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  181243         116894  
  181243         140790  
  181243         368529  
  3128036         2098427  
  3128036         2375885  
  3128036         6158261  
  223837         139729  
  223837         170643  
  223837         413953  
  162182         115124  
  162182         128750  
  162182         330104  
  0         0  
  0         0  
  0         0  
  204728         129608  
  204728         157591  
  204728         409464  
  0         0  
  0         0  
  0         0  
  3775671         2426350  
  3775671         2989342  
  3775671         7333165  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  152204         99601  
  152204         129520  
  152204         117825  
  152204         97321  
  152204         128676  
  152204         1086229  
  152204         181497  
  152204         93477  
  152204         125878  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  133144         82590  
  133144         109222  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  1936991         1291292  
  1936991         1572498  
  1936991         1456386  
  1936991         1197955  
  1936991         1638216  
  1936991         13175380  
  1936991         2245636  
  979047         617535  
  979047         812088  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  1936991         1204091  
  1936991         1613739  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  90579         58916  
  90579         74534  
  90579         69736  
  90579         58605  
  90579         75025  
  90579         632026  
  90579         103984  
  1289356         805404  
  1289356         1059721  
  1289356         968647  
  1289356         795950  
  1289356         1036308  
  1289356         9895172  
  1289356         1505016  
  90593         58323  
  90593         77060  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  109618         76114  
  109618         97063  
  109618         83902  
  109618         69164  
  109618         90451  
  109618         803677  
  109618         126223  
  109618         71104  
  109618         96295  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  979047         599993  
  979047         767090  
  979047         762951  
  979047         620987  
  979047         785683  
  979047         7365585  
  979047         1138891  
  1626682         1036763  
  1626682         1342682  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  1289356         810333  
  1289356         1036254  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  133144         89633  
  133144         110206  
  133144         106055  
  133144         89725  
  133144         109328  
  133144         944817  
  133144         158628  
  1626682         1013633  
  1626682         1288493  
  1626682         1184771  
  1626682         1001144  
  1626682         1271320  
  1626682         10858486  
  1626682         1813582  
  1734         1993  
  1734         2106  
  1734         2827  
  1709         2023  
  1709         3141  
  1709         2243  
  1709         1813  
  1709         30824  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  297683         239559  
  297683         264968  
  297683         348356  
  297658         263032  
  0         0  
  0         0  
  0         0  
  0         0  
  297658         264346  
  297658         265475  
  297658         279886  
  297658         362487  
  587780         403969  
  587780         711937  
  297658         215981  
  297658         337058  
  290122         184353  
  290122         164815  
  290122         458513  
  290122         281273  
  297658         319931  
  1603         1164  
  1603         1699  
  1603         1845  
  1603         2790  
  1603         2374  
  296055         273295  
  0         0  
  296055         249596  
  296055         288295  
  296055         417086  
  296055         6729308  
  296055         417075  
  296055         575027  
  296055         270575  
  297658         728550  
  0         0  
  297683         215272  
  297683         279189  
  297683         331547  
  297658         250540  
  0         0  
  0         0  
  0         0  
  0         0  
  297658         279302  
  297658         288442  
  297658         270112  
  297658         427710  
  587780         393537  
  587780         703338  
  297658         207289  
  297658         333245  
  290122         213298  
  290122         176502  
  290122         444595  
  290122         276009  
  297658         345618  
  1603         2001  
  1603         2095  
  1603         3017  
  1603         2281  
  1603         2755  
  296055         279195  
  296055         271606  
  0         0  
  296055         349300  
  296055         435933  
  296055         6980042  
  296055         429072  
  296055         681557  
  296055         256707  
  297658         764579  
  0         0  
  1734         2011  
  1734         2300  
  1734         2838  
  1709         1747  
  1709         2082  
  1709         2008  
  1709         1720  
  1709         30606  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  1734         1726  
  1734         2031  
  1734         3126  
  1709         1802  
  1709         2111  
  1709         1964  
  1709         1621  
  1709         29213  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  297683         217186  
  297683         278294  
  297683         359563  
  297658         264654  
  0         0  
  0         0  
  0         0  
  0         0  
  297658         254464  
  297658         281359  
  297658         273707  
  297658         392694  
  587780         397652  
  587780         726047  
  297658         210861  
  297658         339743  
  290122         191225  
  290122         184407  
  290122         472726  
  290122         272766  
  297658         344468  
  1603         1645  
  1603         3115  
  1603         2666  
  1603         3235  
  1603         3174  
  296055         266328  
  0         0  
  296055         241143  
  296055         286916  
  296055         424794  
  296055         6889916  
  296055         410888  
  296055         673958  
  296055         251358  
  297658         799159  
  0         0  
  297683         217797  
  297683         281084  
  297683         363820  
  297658         264904  
  0         0  
  0         0  
  0         0  
  0         0  
  297658         259431  
  297658         285004  
  297658         267869  
  297658         410058  
  587780         399898  
  587780         746891  
  297658         235112  
  297658         369627  
  290122         188128  
  290122         185423  
  290122         513985  
  290122         273680  
  297658         328641  
  1603         1559  
  1603         2080  
  1603         1828  
  1603         2550  
  1603         2854  
  296055         280305  
  0         0  
  296055         249265  
  296055         296603  
  296055         442547  
  296055         7106845  
  296055         400993  
  296055         683232  
  296055         269490  
  297658         806086  
  0         0  
  1734         1816  
  1734         2445  
  1734         2503  
  1709         1657  
  1709         2002  
  1709         2303  
  1709         1584  
  1709         29503  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  297683         244192  
  297683         270388  
  297683         338600  
  297658         248689  
  0         0  
  0         0  
  0         0  
  0         0  
  297658         274252  
  297658         298840  
  297658         267275  
  297658         418963  
  587780         409456  
  587780         751362  
  297658         215937  
  297658         347675  
  290122         199112  
  290122         172472  
  290122         450436  
  290122         296921  
  297658         340608  
  1603         1445  
  1603         2236  
  1603         2367  
  1603         2196  
  1603         2987  
  296055         281262  
  296055         262230  
  0         0  
  296055         394094  
  296055         466322  
  296055         7034837  
  296055         429157  
  296055         580629  
  296055         278146  
  297658         761792  
  0         0  
  1734         1897  
  1734         2251  
  1734         3666  
  1709         1810  
  1709         1952  
  1709         1964  
  1709         1650  
  1709         31132  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  1734         1939  
  1734         2042  
  1734         2894  
  1709         1956  
  1709         2006  
  1709         2054  
  1709         1619  
  1709         28979  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  297683         217374  
  297683         286866  
  297683         355233  
  297658         265094  
  0         0  
  0         0  
  0         0  
  0         0  
  297658         242933  
  297658         273547  
  297658         264191  
  297658         426533  
  587780         393160  
  587780         729137  
  297658         211553  
  297658         351720  
  290122         185092  
  290122         176957  
  290122         433098  
  290122         266999  
  297658         316000  
  1603         1594  
  1603         2199  
  1603         3299  
  1603         2636  
  1603         3355  
  296055         262822  
  296055         266846  
  0         0  
  296055         362050  
  296055         418804  
  296055         6850018  
  296055         432089  
  296055         670902  
  296055         271068  
  297658         741184  
  0         0  
  1734         1798  
  1734         2195  
  1734         2853  
  1709         1708  
  1709         2063  
  1709         1937  
  1709         1606  
  1709         30716  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  297683         241277  
  297683         313230  
  297683         369730  
  297658         258644  
  0         0  
  0         0  
  0         0  
  0         0  
  297658         259078  
  297658         305121  
  297658         283216  
  297658         405637  
  587780         387657  
  587780         739598  
  297658         241057  
  297658         347731  
  290122         201427  
  290122         170117  
  290122         502285  
  290122         295875  
  297658         344766  
  1603         1508  
  1603         3077  
  1603         2141  
  1603         2196  
  1603         3226  
  296055         279923  
  0         0  
  296055         269951  
  296055         314953  
  296055         488959  
  296055         7028960  
  296055         415490  
  296055         592833  
  296055         272955  
  297658         813131  
  0         0  
  1735         1873  
  1735         2015  
  1735         2901  
  1710         1721  
  1710         1982  
  1710         2059  
  1710         1587  
  1710         30435  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  297683         224078  
  297683         277918  
  297683         363363  
  297658         265830  
  0         0  
  0         0  
  0         0  
  0         0  
  297658         245626  
  297658         279381  
  297658         276141  
  297658         414752  
  587780         404348  
  587780         732594  
  297658         233610  
  297658         361405  
  290122         191873  
  290122         169282  
  290122         452362  
  290122         281065  
  297658         320860  
  1603         2057  
  1603         2676  
  1603         2743  
  1603         3273  
  1603         2822  
  296055         265688  
  296055         261405  
  0         0  
  296055         350098  
  296055         424979  
  296055         6883195  
  296055         422104  
  296055         585739  
  296055         275748  
  297658         753606  
  0         0  
  0         0  
  0         0  
  0         0  
  48989         36777  
  48989         41995  
  48989         127698  
  67957         46099  
  67957         58208  
  67957         160047  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  48982         35831  
  48982         44244  
  48982         132436  
  67957         47175  
  67957         56601  
  67957         174489  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  48982         35388  
  48982         42312  
  48982         128024  
  67960         49106  
  67960         58171  
  67960         168370  
  67960         47236  
  67960         57222  
  67960         161984  
  48982         34132  
  48982         39889  
  48982         122018  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  16575         10950  
  16575         15322  
  16575         31988  
  16588         11609  
  16588         15388  
  16588         30581  
  0         0  
  0         0  
  0         0  
  35594         25440  
  35594         29506  
  35594         62805  
  0         0  
  0         0  
  0         0  
  16575         11090  
  16575         14241  
  16575         29879  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  35588         24491  
  35588         32166  
  35588         60484  
  16575         11517  
  16575         16334  
  16575         31938  
  35588         25520  
  35588         30942  
  35588         65484  
  35594         24633  
  35594         31239  
  35594         58954  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  37807         38056  
  37807         38038  
  37807         34183  
  1457         1545  
  1456         1437  
  1456         1529  
  1         4  
  1         2  
  1         2  
  1         4  
  1         13  
  36350         33963  
  36350         34898  
  36350         37383  
  34379         27981  
  34379         51387  
  29181         22523  
  29181         35386  
  29181         18188  
  29181         42883  
  29181         27424  
  29181         25961  
  0         0  
  34379         23642  
  34379         43203  
  34379         33237  
  34379         39374  
  1971         2310  
  1971         4594  
  1971         47516  
  1971         5414  
  6062         14865  
  1971         2111  
  1971         2259  
  1971         3505  
  1971         2100  
  0         0  
  1971         2511  
  1971         4955  
  37807         1268563  
  333714         255421  
  333714         307820  
  333714         294419  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  333714         291028  
  333714         294895  
  333714         303528  
  320105         226492  
  320105         337974  
  279999         200526  
  279999         323677  
  279999         165530  
  279999         368781  
  279999         259536  
  0         0  
  279999         334417  
  320105         196740  
  320105         350970  
  320105         285359  
  320105         272182  
  13609         14627  
  13609         25150  
  13609         340951  
  13609         36674  
  45077         106579  
  13609         14336  
  13609         15867  
  0         0  
  0         0  
  13609         40603  
  13609         15161  
  13609         26991  
  333714         1690150  
  333714         249884  
  333714         289258  
  333714         292210  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  333714         283590  
  333714         296805  
  333714         317044  
  320110         229831  
  320110         339594  
  280019         184904  
  280019         332325  
  280019         170953  
  280019         360784  
  280019         276344  
  0         0  
  280019         339564  
  320110         214778  
  320110         349199  
  320110         287085  
  320110         277113  
  13604         13931  
  13604         27899  
  13604         347551  
  13604         34691  
  45057         118099  
  13604         13727  
  13604         16726  
  0         0  
  0         0  
  13604         43348  
  13604         13986  
  13604         30541  
  333714         1770645  
  37806         38664  
  37806         39784  
  37806         34646  
  1477         1712  
  1477         1518  
  1477         1855  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  36329         36859  
  36329         38875  
  36329         38791  
  34358         28673  
  34358         41972  
  29162         21535  
  29162         37601  
  29162         18304  
  29162         41662  
  29162         27213  
  0         0  
  29162         38745  
  34358         22893  
  34358         42081  
  34358         31798  
  34358         33786  
  1971         2362  
  1971         4048  
  1971         47999  
  1971         5265  
  6061         15531  
  1971         2024  
  1971         2354  
  0         0  
  0         0  
  1971         6217  
  1971         2471  
  1971         4722  
  37806         1318935  
  333714         247909  
  333714         279665  
  333714         281829  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  333714         288551  
  333714         302323  
  333714         323969  
  320110         235395  
  320110         397070  
  280019         208903  
  280019         323101  
  280019         162730  
  280019         369007  
  280019         253432  
  280019         237127  
  0         0  
  320110         209265  
  320110         354562  
  320110         293177  
  320110         335126  
  13604         13872  
  13604         28325  
  13604         348887  
  13604         34627  
  45057         121785  
  13604         15264  
  13604         15919  
  13604         23847  
  13604         15021  
  0         0  
  13604         16638  
  13604         30360  
  333714         1717079  
  333714         251215  
  333714         297560  
  333714         306252  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  333714         308847  
  333714         307838  
  333714         320309  
  320105         246809  
  320105         412915  
  279999         217389  
  279999         333091  
  279999         165489  
  279999         380975  
  279999         264739  
  279999         236365  
  0         0  
  320105         222962  
  320105         368015  
  320105         297545  
  320105         352804  
  13609         15441  
  13609         28782  
  13609         363733  
  13609         35564  
  45077         124471  
  13609         13380  
  13609         19348  
  13609         26721  
  13609         15268  
  0         0  
  13609         18085  
  13609         30550  
  333714         1696771  
  333714         276272  
  333714         283400  
  333714         290627  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  333714         309904  
  333714         329307  
  333714         332902  
  320105         231043  
  320105         356145  
  279999         187760  
  279999         341491  
  279999         165368  
  279999         360992  
  279999         272560  
  0         0  
  279999         338580  
  320105         210223  
  320105         342865  
  320105         290828  
  320105         290142  
  13609         14175  
  13609         31724  
  13609         358943  
  13609         36618  
  45077         119651  
  13609         14950  
  13609         17456  
  0         0  
  0         0  
  13609         42404  
  13609         18016  
  13609         26783  
  333714         1745654  
  37807         35520  
  37807         38850  
  37807         32708  
  1457         1550  
  1456         1361  
  1456         1606  
  1         4  
  1         1  
  1         3  
  1         3  
  1         7  
  36350         35916  
  36350         33408  
  36350         35629  
  34379         28425  
  34379         38047  
  29181         19840  
  29181         34493  
  29181         17295  
  29181         38163  
  29181         27578  
  0         0  
  29181         35243  
  34379         22672  
  34379         38302  
  34379         32157  
  34379         29629  
  1971         1964  
  1971         3678  
  1971         44551  
  1971         4515  
  6062         13465  
  1971         1884  
  1971         2107  
  0         0  
  0         0  
  1971         5373  
  1971         2097  
  1971         3922  
  37807         1226934  
  37806         35777  
  37806         39410  
  37806         33898  
  1477         1553  
  1477         1502  
  1477         1572  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  36329         35750  
  36329         33488  
  36329         34923  
  34358         28268  
  34358         48781  
  29162         22038  
  29162         34740  
  29162         18045  
  29162         43294  
  29162         27798  
  29162         26420  
  0         0  
  34358         24746  
  34358         43558  
  34358         33028  
  34358         40613  
  1971         2052  
  1971         4141  
  1971         46596  
  1971         4658  
  6061         15117  
  1971         1964  
  1971         2306  
  1971         3372  
  1971         2044  
  0         0  
  1971         2529  
  1971         4248  
  37806         1270914  
  37808         35160  
  37808         36900  
  37808         34549  
  1477         1613  
  1477         1470  
  1477         1603  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  36331         34829  
  36331         35372  
  36331         34397  
  34358         26985  
  34358         46767  
  29162         20352  
  29162         34353  
  29162         17030  
  29162         40441  
  29162         27232  
  29162         26404  
  0         0  
  34358         24499  
  34358         41882  
  34358         32130  
  34358         37673  
  1973         1931  
  1973         3724  
  1973         43169  
  1973         4464  
  6062         13000  
  1973         1906  
  1973         2337  
  1973         3478  
  1973         1974  
  0         0  
  1973         2476  
  1973         4170  
  37808         1221373  
  333714         253471  
  333714         286582  
  333714         288312  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  333714         304600  
  333714         298968  
  333714         306120  
  320110         233142  
  320110         345564  
  280019         185181  
  280019         332940  
  280019         165518  
  280019         369412  
  280019         259834  
  0         0  
  280019         335256  
  320110         204729  
  320110         342977  
  320110         292078  
  320110         286490  
  13604         14510  
  13604         30171  
  13604         363048  
  13604         35432  
  45057         119898  
  13604         14640  
  13604         15509  
  0         0  
  0         0  
  13604         43029  
  13604         16512  
  13604         30528  
  333714         1706585  
  37807         34491  
  37807         38532  
  37807         36293  
  1457         1510  
  1456         1382  
  1456         1646  
  1         4  
  1         2  
  1         2  
  1         5  
  1         8  
  36350         34162  
  36350         33188  
  36350         34048  
  34376         26614  
  34376         46935  
  29174         21034  
  29174         32900  
  29174         17837  
  29174         40344  
  29174         25909  
  29174         24118  
  0         0  
  34376         23672  
  34376         41339  
  34376         30554  
  34376         37870  
  1974         1973  
  1974         3297  
  1974         43769  
  1974         4222  
  6072         13151  
  1974         1713  
  1974         2143  
  1974         3136  
  1974         1803  
  0         0  
  1974         2561  
  1974         3915  
  37807         1200155  
  333714         246752  
  333714         287890  
  333714         310750  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  333714         301154  
  333714         311422  
  333714         318839  
  320105         246905  
  320105         422464  
  279999         207686  
  279999         330477  
  279999         174219  
  279999         372093  
  279999         265656  
  279999         233355  
  0         0  
  320105         215763  
  320105         357228  
  320105         287741  
  320105         358767  
  13609         13901  
  13609         27716  
  13609         364519  
  13609         36576  
  45077         117521  
  13609         14805  
  13609         16015  
  13609         24986  
  13609         16540  
  0         0  
  13609         17268  
  13609         32219  
  333714         1663035  
  333714         240270  
  333714         273061  
  333714         287193  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  333714         296229  
  333714         303892  
  333714         311759  
  320110         233284  
  320110         407583  
  280019         196969  
  280019         320178  
  280019         164508  
  280019         357934  
  280019         262102  
  280019         235790  
  0         0  
  320110         213857  
  320110         356443  
  320110         294485  
  320110         332501  
  13604         15441  
  13604         26077  
  13604         341468  
  13604         33905  
  45057         115918  
  13604         13125  
  13604         14485  
  13604         23584  
  13604         13667  
  0         0  
  13604         16674  
  13604         31057  
  333714         1684333  
  37806         34839  
  37806         38307  
  37806         33314  
  1477         1663  
  1477         1386  
  1477         1685  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  36329         32474  
  36329         35747  
  36329         35366  
  34358         25884  
  34358         39317  
  29162         18636  
  29162         34606  
  29162         18075  
  29162         37836  
  29162         27743  
  0         0  
  29162         35440  
  34358         22221  
  34358         37008  
  34358         31106  
  34358         32185  
  1971         1937  
  1971         3429  
  1971         43769  
  1971         4488  
  6061         13144  
  1971         1812  
  1971         2144  
  0         0  
  0         0  
  1971         5194  
  1971         2091  
  1971         3855  
  37806         1218799  
  37807         35960  
  37807         37929  
  37807         35014  
  1457         1643  
  1456         1403  
  1456         1690  
  1         6  
  1         3  
  1         26  
  1         3  
  1         8  
  36350         35224  
  36350         37389  
  36350         37636  
  34376         28543  
  34376         40283  
  29174         21492  
  29174         35311  
  29174         17813  
  29174         40613  
  29174         28399  
  0         0  
  29174         36985  
  34376         24020  
  34376         40758  
  34376         31922  
  34376         32001  
  1974         2256  
  1974         4036  
  1974         47945  
  1974         5081  
  6072         16013  
  1974         1906  
  1974         2372  
  0         0  
  0         0  
  1974         6325  
  1974         2290  
  1974         4328  
  37807         1280693  
  827         1332  
  827         1662  
  827         1746  
  823         1727  
  823         1404  
  0         0  
  0         0  
  823         863  
  823         2626  
  823         1263  
  823         2690  
  823         18264  
  828         966  
  828         953  
  828         1167  
  824         965  
  824         1148  
  824         945  
  824         869  
  0         0  
  0         0  
  0         0  
  0         0  
  824         11456  
  827         976  
  827         1037  
  827         1082  
  823         901  
  823         1030  
  823         855  
  823         801  
  0         0  
  0         0  
  0         0  
  0         0  
  823         11067  
  827         982  
  827         1081  
  827         1267  
  823         1068  
  823         1103  
  823         925  
  823         777  
  0         0  
  0         0  
  0         0  
  0         0  
  823         10872  
  827         954  
  827         1001  
  827         1131  
  823         957  
  823         1130  
  823         846  
  823         859  
  0         0  
  0         0  
  0         0  
  0         0  
  823         11067  
  827         1400  
  827         1468  
  827         1575  
  823         1694  
  823         1663  
  0         0  
  0         0  
  823         880  
  823         3019  
  823         1501  
  823         2747  
  823         19835  
  827         1189  
  827         1859  
  827         1952  
  823         1639  
  823         1740  
  0         0  
  0         0  
  823         968  
  823         3024  
  823         1096  
  823         2817  
  823         17517  
  827         1364  
  827         1595  
  827         1693  
  823         1676  
  823         1678  
  0         0  
  0         0  
  823         744  
  823         2850  
  823         1090  
  823         2940  
  823         15909  
  827         1388  
  827         2017  
  827         2112  
  823         1834  
  823         1616  
  0         0  
  0         0  
  823         757  
  823         3148  
  823         1002  
  823         2746  
  823         18362  
  827         1290  
  827         1102  
  827         1263  
  823         867  
  823         986  
  823         788  
  823         752  
  0         0  
  0         0  
  0         0  
  0         0  
  823         11319  
  827         851  
  827         1012  
  827         1253  
  823         891  
  823         994  
  823         736  
  823         805  
  0         0  
  0         0  
  0         0  
  0         0  
  823         10914  
  827         847  
  827         1065  
  827         1117  
  823         992  
  823         1128  
  823         887  
  823         774  
  0         0  
  0         0  
  0         0  
  0         0  
  823         10418  
  827         1231  
  827         1638  
  827         1445  
  823         1491  
  823         1148  
  0         0  
  0         0  
  823         971  
  823         2700  
  823         909  
  823         2416  
  823         16409  
  827         968  
  827         1050  
  827         1163  
  823         941  
  823         1075  
  823         803  
  823         816  
  0         0  
  0         0  
  0         0  
  0         0  
  823         11343  
  827         1314  
  827         1477  
  827         1416  
  823         1456  
  823         1332  
  0         0  
  0         0  
  823         768  
  823         2420  
  823         1095  
  823         2582  
  823         15274  
  827         1166  
  827         1594  
  827         1431  
  823         1662  
  823         1404  
  0         0  
  0         0  
  823         1027  
  823         2679  
  823         1277  
  823         2921  
  823         18792  
  19059         14869  
  19059         18828  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  310353         208076  
  310353         296091  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  310353         196565  
  310353         270525  
  310353         202891  
  310353         266667  
  310353         821117  
  310309         283766  
  310309         214498  
  310309         421341  
  4008952         4371711  
  4008952         2682881  
  310353         293983  
  0         0  
  0         0  
  0         0  
  310353         249301  
  19015         13549  
  19015         18161  
  19015         14266  
  19015         18340  
  19015         62282  
  19015         17940  
  19015         14181  
  19015         25953  
  249371         274762  
  249371         168610  
  19015         20187  
  19015         19488  
  19015         20422  
  19015         27430  
  0         0  
  310353         198625  
  310353         299893  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  310353         208442  
  310353         277661  
  310353         227252  
  310353         276733  
  310353         854431  
  310309         298551  
  310309         223735  
  310309         393839  
  4008952         4410439  
  4008952         2699596  
  310353         310581  
  0         0  
  0         0  
  0         0  
  310353         268339  
  310353         208519  
  310353         269483  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  19059         14495  
  19059         18612  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  310353         203547  
  310353         297169  
  310353         217982  
  310353         278021  
  310353         890657  
  310309         296139  
  310309         223630  
  310309         424621  
  2941662         3263629  
  2941662         2037087  
  310353         296111  
  0         0  
  0         0  
  0         0  
  310353         267811  
  19018         13426  
  19018         19848  
  19018         13959  
  19018         18105  
  19018         59256  
  19018         19847  
  19018         13168  
  19018         26454  
  250108         278179  
  250108         168258  
  19018         19388  
  19018         19443  
  19018         18978  
  19018         26966  
  0         0  
  19018         15090  
  19018         19526  
  19018         14178  
  19018         19517  
  19018         59138  
  19018         20580  
  19018         13771  
  19018         32402  
  250108         274685  
  250108         170286  
  19018         18799  
  19018         21422  
  19018         20473  
  19018         25782  
  0         0  
  19077         13638  
  19077         19482  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  310353         216446  
  310353         276939  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  19059         13598  
  19059         17880  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  310353         210249  
  310353         308388  
  310353         215699  
  310353         289774  
  310353         922181  
  310309         318454  
  310309         227806  
  310309         385979  
  2941662         3278052  
  2941662         2022369  
  310353         314131  
  0         0  
  0         0  
  0         0  
  310353         277597  
  19015         15126  
  19015         18325  
  19015         14513  
  19015         18718  
  19015         61993  
  19015         18190  
  19015         13801  
  19015         34388  
  249371         274721  
  249371         165995  
  19015         19295  
  19015         18941  
  19015         18942  
  19015         25017  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  3434540         2742808  
  7210211         5429022  
  403372         301222  
  3124231         2359189  
  198644         156018  
  441578         325027  
  175159         142141  
  5294343         3923985  
  5914961         4494695  
  156079         129835  
  356402         273839  
  2786925         2241594  
  217741         171912  
  318278         237502  
  6589593         5142249  
  2476616         1907842  
  6613348         9450095  
  727241         1070666  
  576769         835183  
  758012         1123439  
  10389019         14785478  
  7579397         10999292  
  7258334         10606606  
  522513         814818  
  10397124         14628637  
  6934411         9853574  
  538422         804349  
  560829         837631  
  10386370         14479368  
  10399773         14923937  
  762259         1088132  
  723135         1061573  
  647721         541650  
  124645         102261  
  958074         776630  
  958074         758194  
  181590         138212  
  181590         144729  
  647721         537835  
  181602         139216  
  124607         96965  
  181602         144658  
  958074         790348  
  124607         96911  
  647721         543503  
  124607         99073  
  647721         518163  
  958074         820211  
  60137         49939  
  120359         98547  
  60140         53314  
  941726         770643  
  120359         97948  
  1883451         1437807  
  1883451         1447981  
  941726         751438  
  1883451         1435071  
  60140         53168  
  1883451         1430005  
  60137         51963  
  120409         95962  
  941726         739400  
  941726         770101  
  120359         98694  
  1279008         1032335  
  1279008         1046357  
  78954         64928  
  2571609         1971457  
  159784         120988  
  2571609         1972861  
  1279008         1004121  
  1279008         1018183  
  78903         67400  
  2571609         1977705  
  78954         60652  
  159803         120099  
  159868         123057  
  159868         119398  
  78903         67439  
  2571609         1993593  
  190851         125828  
  190851         451162  
  309838         200457  
  309838         702327  
  1660047         1056069  
  1660047         3322084  
  681000         461570  
  681000         1078516  
  142837         92352  
  142837         303778  
  100285         67949  
  100285         248004  
  2280709         1479624  
  2280709         4639389  
  1638988         1018603  
  1638988         2581360  
  275981         177648  
  275981         643578  
  110271         76603  
  110271         250816  
  991353         643415  
  991353         1578213  
  157634         104067  
  157634         318799  
  1328635         876782  
  1328635         2035668  
  2955317         1876399  
  2955317         5632671  
  3575979         2299958  
  3575979         7236617  
  219889         145519  
  219889         495519  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  782         1016  
  782         2359  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  782         786  
  782         1827  
  782         3500  
  782         26268  
  782         1041  
  782         1777  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  782         761  
  782         1407  
  782         3186  
  782         25797  
  782         731  
  782         863  
  774         819  
  774         747  
  774         881  
  8         12  
  8         13  
  8         14  
  8         37  
  8         13  
  8         13  
  8         16  
  0         0  
  0         0  
  0         0  
  782         14489  
  782         1323  
  782         1420  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  782         665  
  782         1259  
  782         2907  
  782         21676  
  782         787  
  782         803  
  771         803  
  771         735  
  771         858  
  11         17  
  11         15  
  0         0  
  0         0  
  11         20  
  11         16  
  11         17  
  0         0  
  0         0  
  0         0  
  782         15189  
  785         853  
  785         877  
  776         987  
  776         849  
  776         996  
  9         15  
  9         18  
  9         17  
  9         41  
  9         20  
  9         19  
  9         15  
  0         0  
  0         0  
  0         0  
  785         15969  
  782         988  
  782         1717  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  782         779  
  782         1723  
  782         3274  
  782         22410  
  782         1166  
  782         1236  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  782         734  
  782         1604  
  782         2991  
  782         22199  
  782         797  
  782         852  
  774         747  
  774         776  
  774         866  
  8         12  
  8         13  
  0         0  
  0         0  
  8         11  
  8         13  
  8         14  
  0         0  
  0         0  
  0         0  
  782         15153  
  782         1184  
  782         1987  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  782         689  
  782         1228  
  782         2909  
  782         21837  
  782         1157  
  782         1782  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  782         940  
  782         1809  
  782         3478  
  782         25167  
  782         1019  
  782         1439  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  782         1030  
  782         1817  
  782         3081  
  782         24937  
  782         813  
  782         829  
  774         791  
  774         825  
  774         905  
  8         12  
  8         12  
  0         0  
  0         0  
  8         11  
  8         15  
  8         16  
  0         0  
  0         0  
  0         0  
  782         15042  
  782         782  
  782         841  
  774         802  
  774         734  
  774         877  
  8         12  
  8         12  
  8         12  
  8         30  
  8         11  
  8         13  
  8         11  
  0         0  
  0         0  
  0         0  
  782         15086  
  782         746  
  782         912  
  771         779  
  771         801  
  771         959  
  11         14  
  11         13  
  11         18  
  11         43  
  11         15  
  11         14  
  11         28  
  0         0  
  0         0  
  0         0  
  782         15913  
  782         795  
  782         915  
  774         781  
  774         747  
  774         906  
  8         15  
  8         13  
  0         0  
  0         0  
  8         15  
  8         13  
  8         14  
  0         0  
  0         0  
  0         0  
  782         15074  
  42565         27231  
  42565         39459  
  42565         32400  
  42565         36507  
  42565         39551  
  42565         58177  
  348997         440013  
  42565         54006  
  647630         419554  
  647630         520901  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  647630         412258  
  647630         557606  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  647630         423189  
  647630         579147  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  647635         426501  
  647635         555497  
  647635         447009  
  647635         564679  
  647635         585426  
  647635         854793  
  5944615         7256152  
  647635         739617  
  42592         28120  
  42592         34686  
  42592         29511  
  42592         38971  
  42592         39318  
  42592         64549  
  346895         426746  
  42592         49165  
  42565         27357  
  42565         38250  
  42565         30051  
  42565         39665  
  42565         40736  
  42565         66215  
  348997         435768  
  42565         50810  
  647630         434220  
  647630         587765  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  647635         418666  
  647635         544376  
  647635         448026  
  647635         553272  
  647635         579416  
  647635         856174  
  5944615         7367220  
  647635         758688  
  647635         424667  
  647635         518887  
  647635         432854  
  647635         557903  
  647635         570586  
  647635         802237  
  5944615         7170205  
  647635         740778  
  42586         28051  
  42586         41648  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  42592         27829  
  42592         35564  
  42592         33721  
  42592         36982  
  42592         39123  
  42592         58942  
  346895         431817  
  42592         51188  
  647635         452490  
  647635         567412  
  647635         466958  
  647635         559905  
  647635         605683  
  647635         854997  
  5944615         7353102  
  647635         778282  
  42586         27308  
  42586         34765  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  42570         29431  
  42570         36931  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  42565         29636  
  42565         35175  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
44             $@ and confess $@;
45             }
46              
47             #1 Methods
48             sub new(*) # Create a new binary heap array. A string of flags enables optimizations to the base version, which uses the minimum amount of memory at all times, to use more memory to obtain shorter run times, These flags are: 'i' - retain memory for subsequent reuse rather than freeing it as soon as possible; 'p' - add two fields to each array to optimize shift/unshift operations; 's' - add a field to each array to cache the size of the array; 'w' - add a field each array to cache the current width of the array of subarrays.
49 4785     4785 1 7689 {my ($flags) = @_; # Optimization flags ipsw in any order surrounding quotes are not necessary
50 4785         7345 my $f = $flags;
51 4785         6469 my $name = 'Binary::Heap::Array::';
52 4785         11308 for(@speedChars) # Generate package name matching requested optimisations
53 19140 100       112072 {if ($f =~ m/$_/i)
54 9572         38824 { $f =~ s/$_//gi;
55 9572         17757 $name .= uc($_);
56             }
57             else
58 9568         15471 {$name .= lc($_);
59             }
60             }
61 4785 50       16645 $f =~ /\A\s*\Z/ or confess "Invalid flags '$f' in '$flags'"; # Check flags syntax
62              
63 4785         92693 return bless [], $name; # Bless into appropriately optimized package
64             } # new
65              
66 16     16 0 20 sub code {<<'END'} # Code to be optimised
67             sub speedInUse{(speedNo>>0)%2} ## Use a vec() in each array to mark which sub arrays can be reused rather than being freed immediately
68             sub speedPp {(speedNo>>1)%2} ## Use pre/post to skip over elements at the start/end at the cost of two additional fields per array
69             sub speedSize {(speedNo>>2)%2} ## Cache the current size of the array at the cost of an additional field per array
70             sub speedWidth{(speedNo>>3)%2} ## Cache the current width of the array at the cost of an additional field per array
71              
72             sub subarray ## An array, always a power of 2 wide, containing sub arrays which contain the caller's data or slots which are empty, each of the sub arrays is a power of 2 wide which depends on its position in the array of sub arrays so that all of these arrays make good use of memory provided via a buddy memory allocation system to construct the binary heap array
73             {my ($array) = @_;
74             no overloading;
75             $array->[0] //= [] # Field 1
76             }
77             sub speed :lvalue ## Algorithm to use
78             {my ($array) = @_;
79             no overloading;
80             $array->[1] //= (my $v = 0) # Field 2
81             }
82             sub inUse :lvalue ## A vec() of bits, the same width as subarray where each bit tells us whether the corresponding sub array is in use or not.
83             {my ($array) = @_;
84             no overloading;
85             confess unless speedInUse;
86             $array->[2] //= (my $v = '') # Field 3
87             }
88             sub pre :lvalue ## The number of entries to ignore at the beginning to assist with shift/unshift
89             {my ($array) = @_;
90             no overloading;
91             confess unless speedPp;
92             $array->[3] //= (my $v = 0) # Field 4
93             }
94             sub post :lvalue ## The number of entries to ignore at the end to assist with pop/push
95             {my ($array) = @_;
96             no overloading;
97             confess unless speedPp;
98             $array->[4] //= (my $v = 0) # Field 5
99             }
100             sub currentSize :lvalue ## The current size of the array
101             {my ($array) = @_;
102             no overloading;
103             confess unless speedSize;
104             $array->[5] //= (my $v = 0) # Field 6
105             }
106             sub currentWidth :lvalue ## The current width of the array
107             {my ($array) = @_;
108             no overloading;
109             confess unless speedWidth;
110             $array->[6] //= (my $v = 0) # Field 7
111             }
112              
113             sub at($$) :lvalue # Address the element at a specified index so that it can get set or got
114             {my ($array, $index) = @_; # Array, index of element
115             my $n = size($array); # Array size
116             return undef if $index < -$n or $index >= $n; # Index out of range
117             return &atUp(@_) if $index >= 0;
118             &atDown(@_)
119             } # at # It would be nice to use overload @{} here but this requires flattening the array which would be very expensive on large arrays
120              
121             sub inUseVector ($) :lvalue ## Sub arrays in use
122             {my ($array) = @_;
123             return inUse($array) if speedInUse;
124             my $v = '';
125             my @a = @{subarray($array)};
126             vec($v, $_, 1) = !!$a[$_] for 0..$#a;
127             $v
128             }
129              
130             sub pop($) # Pop the topmost element from the leading full array and spread the remainder of its contents as sub arrays of the correct size for each preceding empty slot
131             {my ($array) = @_; # Array from which an element is to be popped
132             my $N = size($array); # Size of array
133             return undef unless $N; # Cannot pop from an empty array
134              
135             if (speedPp) # Fast with pre and post
136             {my $element = at($array, -1);
137             post($array)++;
138             currentSize($array)-- if speedSize; # Decrease cached size of array if possible - has to be done late to avoid confusion over at
139             return $element;
140             }
141             else
142             {currentSize($array)-- if speedSize; # Decrease cached size of array if possible - has to be done late to avoid confusion over at
143             my $S = subarray($array); # Sub array list for this array
144             my $v = inUseVector($array); # Sub arrays in use
145              
146             for my $i(keys @$S) # Index to each sub array
147             {my $s = $S->[$i]; # Sub array
148             if (vec($v, $i, 1)) # Full sub array
149             {my $pop = CORE::pop @$s; # Pop an element off the first full sub array
150             for my $I(0..$i-1) # Distribute the remaining elements of this sub array so that each sub array is always a power of two wide which depends on teh position of the sub array in the array of sub arrays
151             {my $j = 1<<$I;
152             splice @{$S->[$I]}, 0, $j, splice @$s, -$j, $j; # Copy block across
153             vec(inUse($array), $I, 1) = 1 if speedInUse; # Mark this sub array as in use
154             }
155             if ($N == 1) # We are popping the last element in a binary heap array
156             {$#{subarray($array)} = -1; # Remove all sub arrays
157             inUse($array) = '' if speedInUse; # Mark all sub arrays as not in use and shorten the vec() string at the same time
158             currentWidth($array) = 0 if speedWidth; # New width of array of sub arrays
159             @$S = (); # Empty the array of sub arrays
160             }
161             else # Pop an element that is not the last element in a binary heap array
162             {if (speedInUse)
163             {vec(inUse($array), $i, 1) = 0; # Mark sub array as not in use
164             }
165             else
166             {$S->[$i] = undef; # Free sub array as it is no longer in use
167             }
168             my $W = width($array); # Get current width
169             my $w = containingPowerOfTwo($W); # Current width is contained by this power of two
170             inUse($array) = substr(inUse($array), 0, 1<<($w-3)) if speedInUse; # Keep vec() string length in bounds - the 3 is because there 2**3 bits in a byte as used by vec()
171             splice @$S, 1<<$w if @$S > 1<<$w; # Shorten the array of sub arrays while leaving some room for a return to growth
172             $S->[$_] = undef for $W..(1<<$w)-1; # Remove outer inactive arrays but keep inner inactive arrays to reduce the allocation rate - the whole point of the inUse array
173             currentWidth($array) = $w+1 # New width of array of sub arrays
174             if speedWidth and currentWidth($array) <= $w;
175             }
176             return $pop # Return popped element
177             }
178             } # for each subarray
179             }
180             confess "This should not happen" # We have already checked that there is at least one element on the array and so an element can be popped so we should not arrive here
181             } # pop
182              
183             sub push($$) # Push a new element on to the top of the array by accumulating the leading full sub arrays in the first empty slot or create a new slot if none already available
184             {my ($array, $element) = @_; # Array, element to push
185             currentSize($array)++ if speedSize; # Increase cached size of array if possible
186              
187             if (speedPp and my $p = post($array)) # Allow for post
188             {if (size($array)) # Quick push
189             {post($array)--;
190             at($array, -1) = $element;
191             }
192             else # Push first element
193             {post($array) = pre($array) = 0; @{subarray($array)} = ();
194             inUse($array) = '' if speedInUse;
195             $array->push($element);
196             }
197             }
198             else # No pops we can replace
199             {my $S = subarray($array); # Sub array list
200             my $v = inUseVector($array); # Sub arrays in use
201             if (defined (my $z = firstEmptySubArray($array))) # First empty sub array will be the target used to hold the results of the push
202             {$S->[$z] = (); # Empty target array
203             for my $i(reverse 0..$z-1) # Index to each sub array preceding the target array
204             {my $s = $S->[$i]; # Sub array
205             if (vec($v, $i, 1)) # Sub array in use
206             {CORE::push @{$S->[$z]}, @$s; # Push in use sub array
207             if (speedInUse)
208             {vec(inUse($array), $i, 1) = 0; # Mark this array as no longer in use
209             }
210             else
211             {$S->[$i] = undef; # Free this array as is is no longer in use
212             }
213             }
214             }
215             CORE::push @{$S->[$z]}, $element; # Save element on target array
216             vec(inUse($array), $z, 1) = 1 if speedInUse; # Mark target array as in use
217             currentWidth($array) = $z+1 if speedWidth and currentWidth($array) <= $z; # Cache new width if possible and greater
218             }
219             else # All the current sub arrays are in use
220             {my $w = width($array); # Current width of array of sub arrays
221             my $W = 1<
222             my $a = $S->[$w] = []; # Create new target sub array
223             CORE::push @$a, vec($v, $_, 1) ? @{$S->[$_]} : () for reverse 0..$w-1; # Push all sub arrays onto target
224             CORE::push @$a, $element; # Push element onto target
225             if (speedInUse)
226             {vec(inUse($array), $_, 1) = 0 for 0..$w-1; # All original sub arrays are no longer in use
227             vec(inUse($array), $w, 1) = 1; # Newly built target sub array is in use
228             }
229             else
230             {$S->[$_] = undef for 0..$w-1; # All original sub arrays are no longer in use
231             }
232             currentWidth($array) = $w+1 if speedWidth and currentWidth($array) <= $w; # Cache new width if possible and greater
233             $S->[$_] = undef for $w+1..$W-1; # Pad out array of subs arrays so it is a power of two wide
234             }
235             }
236             $array
237             } # push
238              
239             sub size($) # Find the number of elements in the binary heap array
240             {my ($array) = @_; # Array
241             return currentSize($array) if speedSize; # Use cached size if possible
242             my $n = 0; # Element count, width of current sub array
243             my $s = subarray($array); # Array of sub arrays
244             if ($s and @$s) # Sub array
245             {my $v = inUseVector($array); # Sub arrays in use
246             my $p = 1; # Width of current sub array
247             for(0..$#$s) # Each sub array
248             {$n += $p if vec($v, $_, 1); # Add number of elements in this sub array if there are any
249             $p += $p; # Width of next sub array
250             }
251             }
252             if (speedPp)
253             {my $p = pre($array); # Allow for pre and post
254             my $q = post($array);
255             return $n - $p - $q # Count of elements found with modifications from pre and post
256             }
257             $n # Count of elements found
258             } # size
259              
260             sub shift($) # Remove and return the current first element of the array
261             {my ($array) = @_; # Array
262             my $n = size($array); # Size of array
263             return undef unless $n; # Use cached size if possible
264             my $element = at($array, 0); # Check that there is a first element
265             if (speedPp)
266             {pre($array)++; # Skip over the first element
267             currentSize($array)-- if speedSize; # Decrease cached size of array if possible
268             }
269             else # Pop all elements and then push then on again one level down
270             {my @a; # save area for array
271             CORE::unshift @a, $array->pop for 0..$n-1; # Undo the existing array
272             shift @a; # Remove the shifted element
273             $array->push($_) for @a; # Restore each element one place down
274             }
275             $element # Return successfully removed element
276             } # shift
277              
278             sub unshift($$) # Insert an element at the start of the array
279             {my ($array, $element) = @_; # Array, element to be inserted
280              
281             if (speedPp and pre($array))
282             {pre($array)--; # Skip over the existing preceding element
283             currentSize($array)++ if speedSize; # Increase cached size of array if possible
284             at($array, 0) = $element; # Insert new element
285             }
286             elsif (speedPp) # Add a new sub array
287             {my $w = width($array);
288             if (speedInUse)
289             {vec(inUse($array), $w, 1) = 1;
290             vec(inUse($array), $_, 1) = 0 for $w+1..$w+$w-1;
291             }
292             currentWidth($array) = $w+1 if speedWidth and currentWidth($array) <= $w; # Cache new width if possible and greater
293             subarray($array)->[$w][pre($array) = (1<<$w)-1] = $element; # Insert element
294             currentSize($array)++ if speedSize; # Increase cached size of array if possible
295             }
296             else # Pop all elements and then push then on again one level down
297             {my @a; # Save area for array
298             CORE::unshift @a, $array->pop for 0..size($array)-1; # Undo the existing array
299             $array->push($_) for $element, @a; # Place new element followed by existing elements
300             }
301             $array # Return array so we can chain operations
302             } # unshift
303              
304             sub width($) ## Current width of array of sub arrays where the sub arrays hold data in use
305             {my ($array) = @_; # Array
306             return currentWidth($array) if speedWidth; # Use cached width if possible
307             my $w = -1; # Width
308             my $s = subarray($array); # Array of sub arrays
309             my $v = inUseVector($array); # Sub arrays in use
310             for(keys @$s) {$w = $_ if vec($v, $_, 1)}
311             $w + 1 # Count of elements found
312             } # width
313              
314             sub firstEmptySubArray($) ## First unused sub array
315             {my ($array) = @_; # Array
316             my $w = width($array); # Width of array of sub arrays
317             my $v = inUseVector($array); # Sub arrays in use
318             for(0..$w-1) # Each sub array
319             {return $_ unless vec($v, $_, 1); # First sub array not in use
320             }
321             undef # All sub arrays are in use
322             } # firstEmptySubArray
323              
324             sub atUp($$) :lvalue ## Get the element at a specified positive index by going up through the array of sub arrays
325             {my ($array, $index) = @_; # Array, index of element
326             $index += pre($array) if speedPp; # Allow for pre and post
327             my $S = subarray($array); # Sub array list
328             my $v = inUseVector($array); # Sub arrays in use
329             for my $i(reverse 0..$#$S) # Start with the widest sub array
330             {my $width = 1 << $i; # Width of array at this position in the array of sub arrays
331             next unless vec($v, $i, 1);
332             my $s = $S->[$i]; # Sub array at this position
333             return $s->[$index] if $index < $width; # Get the indexed element from this sub array if possible
334             $index -= $width; # Reduce the index by the size of this array and move onto the next sub array
335             }
336             undef
337             } # atUp
338              
339             sub atDown($$) :lvalue ## Get the element at a specified negative index by going down through the array of sub arrays
340             {my ($array, $index) = @_; # Array, index of element
341             $index -= post($array) if speedPp; # Allow for pre and post
342             my $S = subarray($array); # Sub array list
343             my $v = inUseVector($array); # Sub arrays in use
344             for my $i(0..$#$S) # Start with the narrowest sub array
345             {my $width = 1 << $i; # Width of array at this position in the array of sub arrays
346             next unless vec($v, $i, 1);
347             my $s = $S->[$i]; # Sub array at this position
348             return $s->[$index] if -$index <= $width; # Get the indexed element from this sub array if possible
349             $index += $width; # Reduce the index by the size of this array and move onto the next sub array
350             }
351             undef
352             } # atDown
353              
354             use overload # Operator overloading
355             '@{}'=>\&convertToArray, # So we can process with a for loop
356             '""' =>\&convertToString, # So we can convert to string
357             'eq' =>\= # Check whether two arrays are equal
358              
359             sub convertToArray($) ## Convert to normal perl array so we can use it in a for loop
360             {my ($array) = @_; # Array to convert
361             my $w = width($array); # Width of array of sub arrays
362             my $v = inUseVector($array); # Sub arrays in use
363             my @a;
364             for(reverse 0..$w-1) # Each sub array
365             {next unless vec($v, $_, 1);
366             my $a = subarray($array)->[$_];
367             CORE::push @a, @{subarray($array)->[$_]};
368             }
369             if (speedPp) # Allow for pre and post
370             {my $p = pre($array);
371             my $q = post($array);
372             splice @a, 0, $p if $p;
373             splice @a, -$q, $q if $q;
374             }
375             [@a]
376             }
377              
378             sub unpackVector($) # Unpack the in use vector
379             {my ($array) = @_;
380             my $v = inUseVector($array);
381             $v ? unpack("b*", $v) : ''
382             }
383              
384             sub convertToString($) ## Convert to string
385             {my ($array) = @_; # Array to convert
386              
387             my $e = sub
388             {my $a = subarray($array);
389             return '' unless $a and @$a;
390             'subarrays='.nws(dump($a))
391             }->();
392              
393             my $i = sub # Array has inUse vector
394             {return "inUse=".unpackVector($array).', ' if speedInUse && width($array);
395             ''
396             }->();
397              
398             my $p = speedPp ? sub # Array has pre/post
399             {my $s = '';
400             my $p = pre($array); $s .= "pre=$p, " if $p;
401             my $q = post($array); $s .= "post=$q, " if $q;
402             $s
403             }->() : '';
404              
405             my $s = sub # Size of array
406             {my $s = size($array);
407             return "size=$s, " if $s;
408             '';
409             }->();
410              
411             my $w = sub # Width of array of sub arrays
412             {my $w = width($array);
413             return "width=$w, " if $w;
414             '';
415             }->();
416              
417             __PACKAGE__."($s$w$p$i$e)" # String representation of array
418             }
419              
420             sub equals($$) ## Equals check whether two arrays are equal
421             {my ($A, $B) = @_; # Arrays to check
422             my $nA = $A->size;
423             my $nB = $B->size;
424             return 0 unless $nA == $nB; # Different sized arrays cannot be equal
425             for(0..$nA-1) # Check each element
426             {return 0 unless $A->at($_) eq $B->at($_);
427             }
428             1
429             }
430             END
431             # Test
432 1 100 66 1 0 533 sub test{eval join('', ) or die $@} # Tests
  1 100 100 256 0 11469  
  1 100 50 12560 0 7  
  256 100   16960 0 70022  
  256 50   4784 0 441  
  256 100   16 0 4429  
  256 50   16 0 92565  
  256 50   1   76909  
  256         80400  
  12560         14709  
  12560         213882  
  12560         56661  
  12464         32211  
  12464         345444  
  112700         1609625  
  65928         99725  
  16960         34830  
  4784         13111  
  4784         13119  
  4784         89758  
  4784         10979  
  4784         76655  
  16         26  
  16         37  
  16         332  
  3632         134939  
  3632         1006682  
  3632         922488  
  16         598  
  16         4132  
  16         30  
  16         28  
  16         51  
  4112         101519  
  4112         1786901  
  4112         1217022  
  16         288  
  16         4801  
  1         180  
433              
434             test unless caller;
435              
436             # Documentation
437             #extractDocumentation() unless caller; # Extract the documentation
438              
439             1;
440              
441             =encoding utf-8
442              
443             =head1 Name
444              
445             Binary::Heap::Array - Extensible array each of whose component arrays is an
446             integral power of two wide.
447              
448             =head1 Synopsis
449              
450             my $a = Binary::Heap::Array::new(ipsw);
451              
452             $a->push(1)->push(2);
453             ok $a->size == 2;
454             ok $a->at( 0) == 1;
455             ok $a->at( 1) == 2;
456             ok $a->at(-1) == 2;
457             ok $a->at(-2) == 1;
458             $a->at( 0) = 2;
459             ok $a->at(-2) == 2;
460             ok $a->pop == 2;
461             ok $a->size == 1;
462             ok $a->shift == 2;
463             ok $a->size == 0;
464             $a->unshift(3);
465             ok $a->size == 1;
466             $a->unshift(2);
467             ok $a->size == 2;
468             $a->unshift(1);
469             ok $a->size == 3;
470              
471             =head1 Methods
472              
473             =head2 new($flags)
474              
475             sub new(*) # Create a new binary heap array. A string of flags enables optimizations to the base version, which uses the minimum amount of memory at all times, to use more memory to obtain shorter run times, These flags are: 'i' - retain memory for subsequent reuse rather than freeing it as soon as possible; 'p' - add two fields to each array to optimize shift/unshift operations; 's' - add a field to each array to cache the size of the array; 'w' - add a field each array to cache the current width of the array of subarrays.
476              
477             Parameter Description
478             1 $flags Optimization flags ipsw in any order surrounding quotes are not necessary
479              
480             =head2 at :lvalue($array, $index)
481              
482             Address the element at a specified index so that it can get set or got
483              
484             Parameter Description
485             1 $array Array
486             2 $index index of element
487              
488             =head2 pop($array)
489              
490             Pop the topmost element from the leading full array and spread the remainder of its contents as sub arrays of the correct size for each preceding empty slot
491              
492             Parameter Description
493             1 $array Array from which an element is to be popped
494              
495             =head2 push($array, $element)
496              
497             Push a new element on to the top of the array by accumulating the leading full sub arrays in the first empty slot or create a new slot if none already available
498              
499             Parameter Description
500             1 $array Array
501             2 $element element to push
502              
503             =head2 size($array)
504              
505             Find the number of elements in the binary heap array
506              
507             Parameter Description
508             1 $array Array
509              
510             =head2 shift($array)
511              
512             Remove and return the current first element of the array
513              
514             Parameter Description
515             1 $array Array
516              
517             =head2 unshift($array, $element)
518              
519             Insert an element at the start of the array
520              
521             Parameter Description
522             1 $array Array
523             2 $element element to be inserted
524              
525             =head1 Index
526              
527             L
528             L
529             L
530             L
531             L
532             L
533             L
534              
535             =head1 Installation
536              
537             This module is written in 100% Pure Perl in a single file and is thus easy to
538             read, modify and install.
539              
540             Standard Module::Build process for building and installing modules:
541              
542             perl Build.PL
543             ./Build
544             ./Build test
545             ./Build install
546              
547             =head1 See also
548              
549             The arrays used to construct the binary heap array are all an integral power of
550             two wide and thus make good use of the memory allocated by
551             L or similar.
552              
553             =head1 Author
554              
555             philiprbrenan@gmail.com
556              
557             http://www.appaapps.com
558              
559             =head1 Copyright
560              
561             Copyright (c) 2017 Philip R Brenan.
562              
563             This module is free software. It may be used, redistributed and/or modified
564             under the same terms as Perl itself.
565              
566             =cut
567              
568             __DATA__