summaryrefslogtreecommitdiff
path: root/perllib
diff options
context:
space:
mode:
authorAnas Nashif <anas.nashif@intel.com>2012-11-05 12:56:51 -0800
committerAnas Nashif <anas.nashif@intel.com>2012-11-05 12:56:51 -0800
commit300d4816804c8ceb4a4601a49ec3ec479c1951b5 (patch)
tree7164fe3883806d0d464103fd37dcebbdd2855a1e /perllib
downloadnasm-300d4816804c8ceb4a4601a49ec3ec479c1951b5.tar.gz
nasm-300d4816804c8ceb4a4601a49ec3ec479c1951b5.tar.bz2
nasm-300d4816804c8ceb4a4601a49ec3ec479c1951b5.zip
Imported Upstream version 2.09.08upstream/2.09.08
Diffstat (limited to 'perllib')
-rw-r--r--perllib/README5
-rw-r--r--perllib/crc64.ph158
-rwxr-xr-xperllib/gensv.pl34
-rw-r--r--perllib/phash.ph226
-rw-r--r--perllib/random_sv_vectors.ph67
5 files changed, 490 insertions, 0 deletions
diff --git a/perllib/README b/perllib/README
new file mode 100644
index 0000000..8f067ec
--- /dev/null
+++ b/perllib/README
@@ -0,0 +1,5 @@
+This directory contains the following Perl modules from CPAN:
+
+Graph-0.84
+
+See the .pod documentation for copyright and license terms.
diff --git a/perllib/crc64.ph b/perllib/crc64.ph
new file mode 100644
index 0000000..30a4775
--- /dev/null
+++ b/perllib/crc64.ph
@@ -0,0 +1,158 @@
+# -*- perl -*-
+#
+# Pure Perl implementation of the same CRC64 implementation used
+# elsewhere in NASM.
+#
+# Note: Perl may have 32- or 64-bit integers; we need to handle both
+# without overflowing into floating point (yuck), so handle them as
+# pairs of 32-bit numbers. Ordering is BIGENDIAN.
+#
+
+@crc64_tab = (
+ [0x00000000, 0x00000000], [0x7ad870c8, 0x30358979],
+ [0xf5b0e190, 0x606b12f2], [0x8f689158, 0x505e9b8b],
+ [0xc038e573, 0x9841b68f], [0xbae095bb, 0xa8743ff6],
+ [0x358804e3, 0xf82aa47d], [0x4f50742b, 0xc81f2d04],
+ [0xab28ecb4, 0x6814fe75], [0xd1f09c7c, 0x5821770c],
+ [0x5e980d24, 0x087fec87], [0x24407dec, 0x384a65fe],
+ [0x6b1009c7, 0xf05548fa], [0x11c8790f, 0xc060c183],
+ [0x9ea0e857, 0x903e5a08], [0xe478989f, 0xa00bd371],
+ [0x7d08ff3b, 0x88be6f81], [0x07d08ff3, 0xb88be6f8],
+ [0x88b81eab, 0xe8d57d73], [0xf2606e63, 0xd8e0f40a],
+ [0xbd301a48, 0x10ffd90e], [0xc7e86a80, 0x20ca5077],
+ [0x4880fbd8, 0x7094cbfc], [0x32588b10, 0x40a14285],
+ [0xd620138f, 0xe0aa91f4], [0xacf86347, 0xd09f188d],
+ [0x2390f21f, 0x80c18306], [0x594882d7, 0xb0f40a7f],
+ [0x1618f6fc, 0x78eb277b], [0x6cc08634, 0x48deae02],
+ [0xe3a8176c, 0x18803589], [0x997067a4, 0x28b5bcf0],
+ [0xfa11fe77, 0x117cdf02], [0x80c98ebf, 0x2149567b],
+ [0x0fa11fe7, 0x7117cdf0], [0x75796f2f, 0x41224489],
+ [0x3a291b04, 0x893d698d], [0x40f16bcc, 0xb908e0f4],
+ [0xcf99fa94, 0xe9567b7f], [0xb5418a5c, 0xd963f206],
+ [0x513912c3, 0x79682177], [0x2be1620b, 0x495da80e],
+ [0xa489f353, 0x19033385], [0xde51839b, 0x2936bafc],
+ [0x9101f7b0, 0xe12997f8], [0xebd98778, 0xd11c1e81],
+ [0x64b11620, 0x8142850a], [0x1e6966e8, 0xb1770c73],
+ [0x8719014c, 0x99c2b083], [0xfdc17184, 0xa9f739fa],
+ [0x72a9e0dc, 0xf9a9a271], [0x08719014, 0xc99c2b08],
+ [0x4721e43f, 0x0183060c], [0x3df994f7, 0x31b68f75],
+ [0xb29105af, 0x61e814fe], [0xc8497567, 0x51dd9d87],
+ [0x2c31edf8, 0xf1d64ef6], [0x56e99d30, 0xc1e3c78f],
+ [0xd9810c68, 0x91bd5c04], [0xa3597ca0, 0xa188d57d],
+ [0xec09088b, 0x6997f879], [0x96d17843, 0x59a27100],
+ [0x19b9e91b, 0x09fcea8b], [0x636199d3, 0x39c963f2],
+ [0xdf7adabd, 0x7a6e2d6f], [0xa5a2aa75, 0x4a5ba416],
+ [0x2aca3b2d, 0x1a053f9d], [0x50124be5, 0x2a30b6e4],
+ [0x1f423fce, 0xe22f9be0], [0x659a4f06, 0xd21a1299],
+ [0xeaf2de5e, 0x82448912], [0x902aae96, 0xb271006b],
+ [0x74523609, 0x127ad31a], [0x0e8a46c1, 0x224f5a63],
+ [0x81e2d799, 0x7211c1e8], [0xfb3aa751, 0x42244891],
+ [0xb46ad37a, 0x8a3b6595], [0xceb2a3b2, 0xba0eecec],
+ [0x41da32ea, 0xea507767], [0x3b024222, 0xda65fe1e],
+ [0xa2722586, 0xf2d042ee], [0xd8aa554e, 0xc2e5cb97],
+ [0x57c2c416, 0x92bb501c], [0x2d1ab4de, 0xa28ed965],
+ [0x624ac0f5, 0x6a91f461], [0x1892b03d, 0x5aa47d18],
+ [0x97fa2165, 0x0afae693], [0xed2251ad, 0x3acf6fea],
+ [0x095ac932, 0x9ac4bc9b], [0x7382b9fa, 0xaaf135e2],
+ [0xfcea28a2, 0xfaafae69], [0x8632586a, 0xca9a2710],
+ [0xc9622c41, 0x02850a14], [0xb3ba5c89, 0x32b0836d],
+ [0x3cd2cdd1, 0x62ee18e6], [0x460abd19, 0x52db919f],
+ [0x256b24ca, 0x6b12f26d], [0x5fb35402, 0x5b277b14],
+ [0xd0dbc55a, 0x0b79e09f], [0xaa03b592, 0x3b4c69e6],
+ [0xe553c1b9, 0xf35344e2], [0x9f8bb171, 0xc366cd9b],
+ [0x10e32029, 0x93385610], [0x6a3b50e1, 0xa30ddf69],
+ [0x8e43c87e, 0x03060c18], [0xf49bb8b6, 0x33338561],
+ [0x7bf329ee, 0x636d1eea], [0x012b5926, 0x53589793],
+ [0x4e7b2d0d, 0x9b47ba97], [0x34a35dc5, 0xab7233ee],
+ [0xbbcbcc9d, 0xfb2ca865], [0xc113bc55, 0xcb19211c],
+ [0x5863dbf1, 0xe3ac9dec], [0x22bbab39, 0xd3991495],
+ [0xadd33a61, 0x83c78f1e], [0xd70b4aa9, 0xb3f20667],
+ [0x985b3e82, 0x7bed2b63], [0xe2834e4a, 0x4bd8a21a],
+ [0x6debdf12, 0x1b863991], [0x1733afda, 0x2bb3b0e8],
+ [0xf34b3745, 0x8bb86399], [0x8993478d, 0xbb8deae0],
+ [0x06fbd6d5, 0xebd3716b], [0x7c23a61d, 0xdbe6f812],
+ [0x3373d236, 0x13f9d516], [0x49aba2fe, 0x23cc5c6f],
+ [0xc6c333a6, 0x7392c7e4], [0xbc1b436e, 0x43a74e9d],
+ [0x95ac9329, 0xac4bc9b5], [0xef74e3e1, 0x9c7e40cc],
+ [0x601c72b9, 0xcc20db47], [0x1ac40271, 0xfc15523e],
+ [0x5594765a, 0x340a7f3a], [0x2f4c0692, 0x043ff643],
+ [0xa02497ca, 0x54616dc8], [0xdafce702, 0x6454e4b1],
+ [0x3e847f9d, 0xc45f37c0], [0x445c0f55, 0xf46abeb9],
+ [0xcb349e0d, 0xa4342532], [0xb1eceec5, 0x9401ac4b],
+ [0xfebc9aee, 0x5c1e814f], [0x8464ea26, 0x6c2b0836],
+ [0x0b0c7b7e, 0x3c7593bd], [0x71d40bb6, 0x0c401ac4],
+ [0xe8a46c12, 0x24f5a634], [0x927c1cda, 0x14c02f4d],
+ [0x1d148d82, 0x449eb4c6], [0x67ccfd4a, 0x74ab3dbf],
+ [0x289c8961, 0xbcb410bb], [0x5244f9a9, 0x8c8199c2],
+ [0xdd2c68f1, 0xdcdf0249], [0xa7f41839, 0xecea8b30],
+ [0x438c80a6, 0x4ce15841], [0x3954f06e, 0x7cd4d138],
+ [0xb63c6136, 0x2c8a4ab3], [0xcce411fe, 0x1cbfc3ca],
+ [0x83b465d5, 0xd4a0eece], [0xf96c151d, 0xe49567b7],
+ [0x76048445, 0xb4cbfc3c], [0x0cdcf48d, 0x84fe7545],
+ [0x6fbd6d5e, 0xbd3716b7], [0x15651d96, 0x8d029fce],
+ [0x9a0d8cce, 0xdd5c0445], [0xe0d5fc06, 0xed698d3c],
+ [0xaf85882d, 0x2576a038], [0xd55df8e5, 0x15432941],
+ [0x5a3569bd, 0x451db2ca], [0x20ed1975, 0x75283bb3],
+ [0xc49581ea, 0xd523e8c2], [0xbe4df122, 0xe51661bb],
+ [0x3125607a, 0xb548fa30], [0x4bfd10b2, 0x857d7349],
+ [0x04ad6499, 0x4d625e4d], [0x7e751451, 0x7d57d734],
+ [0xf11d8509, 0x2d094cbf], [0x8bc5f5c1, 0x1d3cc5c6],
+ [0x12b59265, 0x35897936], [0x686de2ad, 0x05bcf04f],
+ [0xe70573f5, 0x55e26bc4], [0x9ddd033d, 0x65d7e2bd],
+ [0xd28d7716, 0xadc8cfb9], [0xa85507de, 0x9dfd46c0],
+ [0x273d9686, 0xcda3dd4b], [0x5de5e64e, 0xfd965432],
+ [0xb99d7ed1, 0x5d9d8743], [0xc3450e19, 0x6da80e3a],
+ [0x4c2d9f41, 0x3df695b1], [0x36f5ef89, 0x0dc31cc8],
+ [0x79a59ba2, 0xc5dc31cc], [0x037deb6a, 0xf5e9b8b5],
+ [0x8c157a32, 0xa5b7233e], [0xf6cd0afa, 0x9582aa47],
+ [0x4ad64994, 0xd625e4da], [0x300e395c, 0xe6106da3],
+ [0xbf66a804, 0xb64ef628], [0xc5bed8cc, 0x867b7f51],
+ [0x8aeeace7, 0x4e645255], [0xf036dc2f, 0x7e51db2c],
+ [0x7f5e4d77, 0x2e0f40a7], [0x05863dbf, 0x1e3ac9de],
+ [0xe1fea520, 0xbe311aaf], [0x9b26d5e8, 0x8e0493d6],
+ [0x144e44b0, 0xde5a085d], [0x6e963478, 0xee6f8124],
+ [0x21c64053, 0x2670ac20], [0x5b1e309b, 0x16452559],
+ [0xd476a1c3, 0x461bbed2], [0xaeaed10b, 0x762e37ab],
+ [0x37deb6af, 0x5e9b8b5b], [0x4d06c667, 0x6eae0222],
+ [0xc26e573f, 0x3ef099a9], [0xb8b627f7, 0x0ec510d0],
+ [0xf7e653dc, 0xc6da3dd4], [0x8d3e2314, 0xf6efb4ad],
+ [0x0256b24c, 0xa6b12f26], [0x788ec284, 0x9684a65f],
+ [0x9cf65a1b, 0x368f752e], [0xe62e2ad3, 0x06bafc57],
+ [0x6946bb8b, 0x56e467dc], [0x139ecb43, 0x66d1eea5],
+ [0x5ccebf68, 0xaecec3a1], [0x2616cfa0, 0x9efb4ad8],
+ [0xa97e5ef8, 0xcea5d153], [0xd3a62e30, 0xfe90582a],
+ [0xb0c7b7e3, 0xc7593bd8], [0xca1fc72b, 0xf76cb2a1],
+ [0x45775673, 0xa732292a], [0x3faf26bb, 0x9707a053],
+ [0x70ff5290, 0x5f188d57], [0x0a272258, 0x6f2d042e],
+ [0x854fb300, 0x3f739fa5], [0xff97c3c8, 0x0f4616dc],
+ [0x1bef5b57, 0xaf4dc5ad], [0x61372b9f, 0x9f784cd4],
+ [0xee5fbac7, 0xcf26d75f], [0x9487ca0f, 0xff135e26],
+ [0xdbd7be24, 0x370c7322], [0xa10fceec, 0x0739fa5b],
+ [0x2e675fb4, 0x576761d0], [0x54bf2f7c, 0x6752e8a9],
+ [0xcdcf48d8, 0x4fe75459], [0xb7173810, 0x7fd2dd20],
+ [0x387fa948, 0x2f8c46ab], [0x42a7d980, 0x1fb9cfd2],
+ [0x0df7adab, 0xd7a6e2d6], [0x772fdd63, 0xe7936baf],
+ [0xf8474c3b, 0xb7cdf024], [0x829f3cf3, 0x87f8795d],
+ [0x66e7a46c, 0x27f3aa2c], [0x1c3fd4a4, 0x17c62355],
+ [0x935745fc, 0x4798b8de], [0xe98f3534, 0x77ad31a7],
+ [0xa6df411f, 0xbfb21ca3], [0xdc0731d7, 0x8f8795da],
+ [0x536fa08f, 0xdfd90e51], [0x29b7d047, 0xefec8728]
+ );
+
+sub crc64($$) {
+ my ($cv, $str) = @_;
+ my $c;
+ my @cc = @$cv;
+ $cc[0] %= 4294967296;
+ $cc[1] %= 4294967296;
+
+ foreach $c (unpack("C*", $str)) {
+ my @ct = @{$crc64_tab[($cc[1] & 0xff) ^ $c]};
+
+ $cc[1] = $ct[1] ^
+ ((($cc[1] & 0xffffff00) >> 8) | (($cc[0] & 0xff) << 24));
+ $cc[0] = $ct[0] ^ (($cc[0] & 0xffffff00) >> 8);
+ }
+
+ return @cc;
+}
diff --git a/perllib/gensv.pl b/perllib/gensv.pl
new file mode 100755
index 0000000..b80ccbe
--- /dev/null
+++ b/perllib/gensv.pl
@@ -0,0 +1,34 @@
+#!/usr/bin/perl
+#
+# Generate a list of rotation vectors so we always use the same set.
+# This needs to be run on a platform with /dev/urandom.
+#
+
+($n) = @ARGV;
+
+sysopen(UR, '/dev/urandom', O_RDONLY) or die;
+
+$maxlen = 78;
+
+print "\@random_sv_vectors = (\n";
+$outl = ' ';
+
+for ($i = 0; $i < $n; $i++) {
+
+ die if (sysread(UR, $x8, 8) != 8);
+ @n = unpack("V*", $x8);
+
+ $xl = sprintf(" [0x%08x, 0x%08x]%s",
+ $n[0], $n[1],
+ ($i == $n-1) ? '' : ',');
+ if (length($outl.$xl) > $maxlen) {
+ print $outl, "\n";
+ $outl = ' ';
+ }
+ $outl .= $xl;
+}
+close(UR);
+
+print $outl, "\n";
+print ");\n";
+print "1;\n";
diff --git a/perllib/phash.ph b/perllib/phash.ph
new file mode 100644
index 0000000..6b31f0a
--- /dev/null
+++ b/perllib/phash.ph
@@ -0,0 +1,226 @@
+# -*- perl -*-
+#
+# Perfect Minimal Hash Generator written in Perl, which produces
+# C output.
+#
+
+require 'random_sv_vectors.ph';
+require 'crc64.ph';
+
+#
+# Compute the prehash for a key
+#
+# prehash(key, sv, N)
+#
+sub prehash($$$) {
+ my($key, $n, $sv) = @_;
+ my @c = crc64($sv, $key);
+
+ # Create a bipartite graph...
+ $k1 = (($c[1] & ($n-1)) << 1) + 0; # low word
+ $k2 = (($c[0] & ($n-1)) << 1) + 1; # high word
+
+ return ($k1, $k2);
+}
+
+#
+# Walk the assignment graph, return true on success
+#
+sub walk_graph($$$$) {
+ my($nodeval,$nodeneigh,$n,$v) = @_;
+ my $nx;
+
+ # print STDERR "Vertex $n value $v\n";
+ $$nodeval[$n] = $v;
+
+ foreach $nx (@{$$nodeneigh[$n]}) {
+ # $nx -> [neigh, hash]
+ my ($o, $e) = @$nx;
+
+ # print STDERR "Edge $n,$o value $e: ";
+ my $ov;
+ if (defined($ov = $$nodeval[$o])) {
+ if ($v+$ov != $e) {
+ # Cyclic graph with collision
+ # print STDERR "error, should be ", $v+$ov, "\n";
+ return 0;
+ } else {
+ # print STDERR "ok\n";
+ }
+ } else {
+ return 0 unless (walk_graph($nodeval, $nodeneigh, $o, $e-$v));
+ }
+ }
+ return 1;
+}
+
+#
+# Generate the function assuming a given N.
+#
+# gen_hash_n(N, sv, \%data, run)
+#
+sub gen_hash_n($$$$) {
+ my($n, $sv, $href, $run) = @_;
+ my @keys = keys(%{$href});
+ my $i, $sv;
+ my $gr;
+ my $k, $v;
+ my $gsize = 2*$n;
+ my @nodeval;
+ my @nodeneigh;
+ my %edges;
+
+ for ($i = 0; $i < $gsize; $i++) {
+ $nodeneigh[$i] = [];
+ }
+
+ %edges = ();
+ foreach $k (@keys) {
+ my ($pf1, $pf2) = prehash($k, $n, $sv);
+ ($pf1,$pf2) = ($pf2,$pf1) if ($pf1 > $pf2); # Canonicalize order
+
+ my $pf = "$pf1,$pf2";
+ my $e = ${$href}{$k};
+ my $xkey;
+
+ if (defined($xkey = $edges{$pf})) {
+ next if ($e == ${$href}{$xkey}); # Duplicate hash, safe to ignore
+ if (defined($run)) {
+ print STDERR "$run: Collision: $pf: $k with $xkey\n";
+ }
+ return;
+ }
+
+ # print STDERR "Edge $pf value $e from $k\n";
+
+ $edges{$pf} = $k;
+ push(@{$nodeneigh[$pf1]}, [$pf2, $e]);
+ push(@{$nodeneigh[$pf2]}, [$pf1, $e]);
+ }
+
+ # Now we need to assign values to each vertex, so that for each
+ # edge, the sum of the values for the two vertices give the value
+ # for the edge (which is our hash index.) If we find an impossible
+ # sitation, the graph was cyclic.
+ @nodeval = (undef) x $gsize;
+
+ for ($i = 0; $i < $gsize; $i++) {
+ if (scalar(@{$nodeneigh[$i]})) {
+ # This vertex has neighbors (is used)
+ if (!defined($nodeval[$i])) {
+ # First vertex in a cluster
+ unless (walk_graph(\@nodeval, \@nodeneigh, $i, 0)) {
+ if (defined($run)) {
+ print STDERR "$run: Graph is cyclic\n";
+ }
+ return;
+ }
+ }
+ }
+ }
+
+ # for ($i = 0; $i < $n; $i++) {
+ # print STDERR "Vertex ", $i, ": ", $g[$i], "\n";
+ # }
+
+ if (defined($run)) {
+ printf STDERR "$run: Done: n = $n, sv = [0x%08x, 0x%08x]\n",
+ $$sv[0], $$sv[1];
+ }
+
+ return ($n, $sv, \@nodeval);
+}
+
+#
+# Driver for generating the function
+#
+# gen_perfect_hash(\%data)
+#
+sub gen_perfect_hash($) {
+ my($href) = @_;
+ my @keys = keys(%{$href});
+ my @hashinfo;
+ my $n, $i, $j, $sv, $maxj;
+ my $run = 1;
+
+ # Minimal power of 2 value for N with enough wiggle room.
+ # The scaling constant must be larger than 0.5 in order for the
+ # algorithm to ever terminate.
+ my $room = scalar(@keys)*0.8;
+ $n = 1;
+ while ($n < $room) {
+ $n <<= 1;
+ }
+
+ # Number of times to try...
+ $maxj = scalar @random_sv_vectors;
+
+ for ($i = 0; $i < 4; $i++) {
+ printf STDERR "%d vectors, trying n = %d...\n",
+ scalar @keys, $n;
+ for ($j = 0; $j < $maxj; $j++) {
+ $sv = $random_sv_vectors[$j];
+ @hashinfo = gen_hash_n($n, $sv, $href, $run++);
+ return @hashinfo if (defined(@hashinfo));
+ }
+ $n <<= 1;
+ }
+
+ return;
+}
+
+#
+# Read input file
+#
+sub read_input() {
+ my $key,$val;
+ my %out;
+ my $x = 0;
+
+ while (defined($l = <STDIN>)) {
+ chomp $l;
+ $l =~ s/\s*(\#.*|)$//;
+
+ next if ($l eq '');
+
+ if ($l =~ /^([^=]+)\=([^=]+)$/) {
+ $out{$1} = $2;
+ $x = $2;
+ } else {
+ $out{$l} = $x;
+ }
+ $x++;
+ }
+
+ return %out;
+}
+
+#
+# Verify that the hash table is actually correct...
+#
+sub verify_hash_table($$)
+{
+ my ($href, $hashinfo) = @_;
+ my ($n, $sv, $g) = @{$hashinfo};
+ my $k;
+ my $err = 0;
+
+ foreach $k (keys(%$href)) {
+ my ($pf1, $pf2) = prehash($k, $n, $sv);
+ my $g1 = ${$g}[$pf1];
+ my $g2 = ${$g}[$pf2];
+
+ if ($g1+$g2 != ${$href}{$k}) {
+ printf STDERR "%s(%d,%d): %d+%d = %d != %d\n",
+ $k, $pf1, $pf2, $g1, $g2, $g1+$g2, ${$href}{$k};
+ $err = 1;
+ } else {
+ # printf STDERR "%s: %d+%d = %d ok\n",
+ # $k, $g1, $g2, $g1+$g2;
+ }
+ }
+
+ die "$0: hash validation error\n" if ($err);
+}
+
+1;
diff --git a/perllib/random_sv_vectors.ph b/perllib/random_sv_vectors.ph
new file mode 100644
index 0000000..db2dc6e
--- /dev/null
+++ b/perllib/random_sv_vectors.ph
@@ -0,0 +1,67 @@
+@random_sv_vectors = (
+ [0x076259c3, 0xe291c26c], [0xaee7ac5c, 0xcabdec91],
+ [0x5d3862fb, 0x2e8a3060], [0x6fb3635c, 0x4783593a],
+ [0x13f0eafb, 0x407e486a], [0x7436afdd, 0xd04c4829],
+ [0xace2d0e4, 0x80575791], [0x2dd9a392, 0xdc1e869e],
+ [0x199c3e38, 0x026a9d67], [0x9f911c85, 0x3a489c87],
+ [0x9ac31028, 0x0b6e14b2], [0x2ccfbcf9, 0x3f9f2308],
+ [0x2e0210fb, 0x392f380f], [0x14ab403a, 0x81a11065],
+ [0xd496f63c, 0x53196b13], [0x48a34d7f, 0x2ffc6036],
+ [0x34ea8e9d, 0xcd1ed098], [0x2da1a3f2, 0x3d6c23f2],
+ [0xca7374da, 0x06054f89], [0xc909a0bb, 0x31d6c0d2],
+ [0x87454496, 0x15b360d7], [0x9eebbd12, 0x89532131],
+ [0x1119c65b, 0xd9e49705], [0x60c3be0b, 0xd6cc7c8a],
+ [0x117723cd, 0x40af090f], [0xfc284f51, 0x3dcf4c06],
+ [0xb41fcda4, 0xec03644c], [0xd99e1ea7, 0x84eaf76d],
+ [0x534b956a, 0x06d3fb8d], [0x2da4bb09, 0x078092eb],
+ [0x6a5be463, 0xbfa51a88], [0xc4e8be95, 0xe7eec27c],
+ [0x15a1fbb9, 0xfadc08cd], [0x0bcfab08, 0xbccade0f],
+ [0x629f1f6c, 0x90ccede7], [0x5c2b26aa, 0x1f0b1fce],
+ [0xdfe0e3fd, 0xbd7c3cfb], [0xa1628ca9, 0x90a05686],
+ [0xbf0267f2, 0xd2964139], [0x8009a9b9, 0xd2195918],
+ [0xfcc7b5f8, 0xc108c643], [0xf447d4b0, 0x71953863],
+ [0x95d091ed, 0xdbe01948], [0x81dec325, 0x2bfecda2],
+ [0x2ed2acaa, 0x7eeaa0d0], [0xb7b0a20e, 0x8bf5c01b],
+ [0x75eb3917, 0xfd2f758f], [0xb33a5b49, 0x8a8cedf6],
+ [0x3aaf2757, 0x69b319a9], [0x32cfa41b, 0xeba36f19],
+ [0xf54209dd, 0x941f3a08], [0x232703bb, 0x786a6f84],
+ [0x4937b242, 0xc9f07398], [0x74dc5d39, 0x550a58e8],
+ [0x6c9aebdc, 0x8fda5069], [0x5ae6d62a, 0x05cd24a3],
+ [0x8111e50a, 0xc1c6d19b], [0xb980a92b, 0x448b4d1f],
+ [0x568cf58a, 0x8bcb93ca], [0xfe96002f, 0x410cd2f1],
+ [0xaf511e45, 0x99e4872f], [0x822c20bc, 0x3db49ddd],
+ [0x184fec4e, 0xbb82ec52], [0x30ca5326, 0xf3180297],
+ [0x97962aa4, 0x7d4bc6d4], [0x9199a315, 0x8e9f18c6],
+ [0xead69a7e, 0x3262a683], [0xe261ec00, 0x81edc47a],
+ [0x06080c0e, 0x6d18fa9f], [0x1771ec43, 0x6747ed66],
+ [0xe71fe587, 0xe81ad0f3], [0xf083e80c, 0x0898bcd8],
+ [0x30328c5a, 0x2efb4ee7], [0xd04fa5d7, 0xec9c9f18],
+ [0x87820480, 0x48932224], [0xb1f18815, 0x1b27e3e3],
+ [0x79aa440c, 0xdf17a8fc], [0x8a83d404, 0x10fdec8c],
+ [0x7d4dfe60, 0x573561ee], [0x60315c7d, 0xa0692af6],
+ [0xb3ca4d52, 0x89ca832f], [0x9ebc5c79, 0xa84a28fc],
+ [0xdfa76008, 0x7772cf7c], [0xb0e3a15f, 0xbdc35aee],
+ [0x6e252b03, 0x32b2107d], [0x20dcc2a3, 0x21987229],
+ [0x848e3ad8, 0xe692a0c6], [0xdd07fa50, 0x0b64e1ae],
+ [0xc4072bc2, 0x2f120bba], [0xdb3af26e, 0xacab0c48],
+ [0xd7d4b59a, 0xcf72a7a7], [0x4628de45, 0x4dfb2750],
+ [0x7519211f, 0x4798b536], [0x19984af3, 0xffd2aa19],
+ [0x1372d9c0, 0x7512153a], [0x295d19da, 0x497416e5],
+ [0x70932c73, 0x8a9bf591], [0xa0960860, 0xfaa7dc61],
+ [0xd425f548, 0x43aeda4d], [0xaa2573c7, 0x01a2553d],
+ [0x988e71d7, 0xd3c004a4], [0x3da87545, 0x2197af10],
+ [0x2f89e592, 0xa686e2fc], [0x7b88018a, 0xae66d575],
+ [0x93215591, 0xed69e6ea], [0x4fcacc4a, 0x4d2aba97],
+ [0xbedb923b, 0x500b2f1a], [0x0b6d8aa0, 0x232511b0],
+ [0x282fb3ee, 0x23695de0], [0x0c455dfe, 0x820cca3f],
+ [0xe893868c, 0x87f698f6], [0xb6428730, 0x56e576ce],
+ [0xf3843ee7, 0xba79bc28], [0xa1c9ca45, 0x30c479c1],
+ [0xbfc244c2, 0xa9af65f0], [0x6eeb88eb, 0x62b4479c],
+ [0xcc328fe5, 0x60f5c9bf], [0x31aa2c21, 0xc55575fb],
+ [0x9429492d, 0x8e80612a], [0xb12fe59e, 0xf0e1e97b],
+ [0xc2501dad, 0x4a9f4bbf], [0x65ae8366, 0x3e8b0983],
+ [0xd5fc062a, 0xba74f808], [0x7398cc0a, 0x39a6a269],
+ [0x5581dd60, 0xff79d28c], [0xea5e52b3, 0x9be66c71],
+ [0x8f6e02a4, 0xe27318b5], [0xe8bceb99, 0xa48a7f2c],
+);
+1;