ent-1.1debian/0000755000175000017500000000000010664211465011463 5ustar wjlwjlent-1.1debian/randtest.c0000644000175000017500000001062010664211465013452 0ustar wjlwjl/* Apply various randomness tests to a stream of bytes by John Walker -- September 1996 http://www.fourmilab.ch/ */ #include #define FALSE 0 #define TRUE 1 #define log2of10 3.32192809488736234787 static int binary = FALSE; /* Treat input as a bitstream */ static long ccount[256], /* Bins to count occurrences of values */ totalc = 0; /* Total bytes counted */ static double prob[256]; /* Probabilities per bin for entropy */ /* LOG2 -- Calculate log to the base 2 */ static double log2(double x) { return log2of10 * log10(x); } #define MONTEN 6 /* Bytes used as Monte Carlo co-ordinates. This should be no more bits than the mantissa of your "double" floating point type. */ static int mp, sccfirst; static unsigned int monte[MONTEN]; static long inmont, mcount; static double a, cexp, incirc, montex, montey, montepi, scc, sccun, sccu0, scclast, scct1, scct2, scct3, ent, chisq, datasum; /* RT_INIT -- Initialise random test counters. */ void rt_init(int binmode) { int i; binary = binmode; /* Set binary / byte mode */ /* Initialise for calculations */ ent = 0.0; /* Clear entropy accumulator */ chisq = 0.0; /* Clear Chi-Square */ datasum = 0.0; /* Clear sum of bytes for arithmetic mean */ mp = 0; /* Reset Monte Carlo accumulator pointer */ mcount = 0; /* Clear Monte Carlo tries */ inmont = 0; /* Clear Monte Carlo inside count */ incirc = 65535.0 * 65535.0;/* In-circle distance for Monte Carlo */ sccfirst = TRUE; /* Mark first time for serial correlation */ scct1 = scct2 = scct3 = 0.0; /* Clear serial correlation terms */ incirc = pow(pow(256.0, (double) (MONTEN / 2)) - 1, 2.0); for (i = 0; i < 256; i++) { ccount[i] = 0; } totalc = 0; } /* RT_ADD -- Add one or more bytes to accumulation. */ void rt_add(void *buf, int bufl) { unsigned char *bp = buf; int oc, c, bean; while (bean = 0, (bufl-- > 0)) { oc = *bp++; do { if (binary) { c = !!(oc & 0x80); } else { c = oc; } ccount[c]++; /* Update counter for this bin */ totalc++; /* Update inside / outside circle counts for Monte Carlo computation of PI */ if (bean == 0) { monte[mp++] = oc; /* Save character for Monte Carlo */ if (mp >= MONTEN) { /* Calculate every MONTEN character */ int mj; mp = 0; mcount++; montex = montey = 0; for (mj = 0; mj < MONTEN / 2; mj++) { montex = (montex * 256.0) + monte[mj]; montey = (montey * 256.0) + monte[(MONTEN / 2) + mj]; } if ((montex * montex + montey * montey) <= incirc) { inmont++; } } } /* Update calculation of serial correlation coefficient */ sccun = c; if (sccfirst) { sccfirst = FALSE; scclast = 0; sccu0 = sccun; } else { scct1 = scct1 + scclast * sccun; } scct2 = scct2 + sccun; scct3 = scct3 + (sccun * sccun); scclast = sccun; oc <<= 1; } while (binary && (++bean < 8)); } } /* RT_END -- Complete calculation and return results. */ void rt_end(double *r_ent, double *r_chisq, double *r_mean, double *r_montepicalc, double *r_scc) { int i; /* Complete calculation of serial correlation coefficient */ scct1 = scct1 + scclast * sccu0; scct2 = scct2 * scct2; scc = totalc * scct3 - scct2; if (scc == 0.0) { scc = -100000; } else { scc = (totalc * scct1 - scct2) / scc; } /* Scan bins and calculate probability for each bin and Chi-Square distribution */ cexp = totalc / (binary ? 2.0 : 256.0); /* Expected count per bin */ for (i = 0; i < (binary ? 2 : 256); i++) { prob[i] = (double) ccount[i] / totalc; a = ccount[i] - cexp; chisq = chisq + (a * a) / cexp; datasum += ((double) i) * ccount[i]; } /* Calculate entropy */ for (i = 0; i < (binary ? 2 : 256); i++) { if (prob[i] > 0.0) { ent += prob[i] * log2(1 / prob[i]); } } /* Calculate Monte Carlo value for PI from percentage of hits within the circle */ montepi = 4.0 * (((double) inmont) / mcount); /* Return results through arguments */ *r_ent = ent; *r_chisq = chisq; *r_mean = datasum / totalc; *r_montepicalc = montepi; *r_scc = scc; } ent-1.1debian/iso8859.c0000644000175000017500000000075010664211465012761 0ustar wjlwjl /* ISO 8859/1 Latin-1 alphabetic and upper and lower case bit vector tables. */ /* LINTLIBRARY */ unsigned char isoalpha[32] = { 0,0,0,0,0,0,0,0,127,255,255,224,127,255,255,224,0,0,0,0,0,0,0,0,255,255, 254,255,255,255,254,255 }; unsigned char isoupper[32] = { 0,0,0,0,0,0,0,0,127,255,255,224,0,0,0,0,0,0,0,0,0,0,0,0,255,255,254,254, 0,0,0,0 }; unsigned char isolower[32] = { 0,0,0,0,0,0,0,0,0,0,0,0,127,255,255,224,0,0,0,0,0,0,0,0,0,0,0,1,255,255, 254,255 }; ent-1.1debian/ent.c0000644000175000017500000001554310664211465012425 0ustar wjlwjl/* ENT -- Entropy calculation and analysis of putative random sequences. Designed and implemented by John "Random" Walker in May 1985. Multiple analyses of random sequences added in December 1985. Bit stream analysis added in September 1997. Terse mode output, getopt() command line processing, optional stdin input, and HTML documentation added in October 1998. For additional information and the latest version, see http://www.fourmilab.ch/random/ */ #include #include #include #include #ifndef _MSDOS #include #endif #include "iso8859.h" #include "randtest.h" #define UPDATE "October 20th, 1998" #define FALSE 0 #define TRUE 1 #ifdef M_PI #define PI M_PI #else #define PI 3.14159265358979323846 #endif #define V (void) /* Table of chi-square Xp values versus corresponding probabilities */ static double chsqt[2][10] = { { 0.5, 0.25, 0.1, 0.05, 0.025, 0.01, 0.005, 0.001, 0.0005, 0.0001, }, { 0.0, 0.6745, 1.2816, 1.6449, 1.9600, 2.3263, 2.5758, 3.0902, 3.2905, 3.7190 } }; /* HELP -- Print information on how to call */ static void help() { V printf("ent -- Calculate entropy of file. Call"); V printf("\n with ent [options] [input-file]"); V printf("\n"); V printf("\n Options: -b Treat input as a stream of bits"); V printf("\n -c Print occurrence counts"); V printf("\n -f Fold upper to lower case letters"); V printf("\n -u Print this message\n"); V printf("\nBy John Walker"); V printf("\n http://www.fourmilab.ch/"); V printf("\n %s\n", UPDATE); } /* GETOPT -- Dumb version of getopt for brain-dead MS-DOS. */ #ifdef _MSDOS static int optind = 1; static int getopt(int argc, char *argv[], char *opts) { static char *opp = NULL; int o; while (opp == NULL) { if ((optind >= argc) || (*argv[optind] != '-')) { return -1; } opp = argv[optind] + 1; optind++; if (*opp == 0) { opp = NULL; } } o = *opp++; if (*opp == 0) { opp = NULL; } return strchr(opts, o) == NULL ? '?' : o; } #endif /* Main program */ int main(int argc, char *argv[]) { int i, oc, opt; long ccount[256]; /* Bins to count occurrences of values */ long totalc = 0; /* Total character count */ char *samp; double a, montepi, chip, scc, ent, mean, chisq; FILE *fp = stdin; int counts = FALSE, /* Print character counts */ fold = FALSE, /* Fold upper to lower */ binary = FALSE, /* Treat input as a bitstream */ terse = FALSE; /* Terse (CSV format) output */ while ((opt = getopt(argc, argv, "bcftu?hBCFTUH")) != -1) { switch (toISOlower(opt)) { case 'b': binary = TRUE; break; case 'c': counts = TRUE; break; case 'f': fold = TRUE; break; case 't': terse = TRUE; break; case '?': case 'u': case 'h': help(); return 0; } } if (optind < argc) { if (optind != (argc - 1)) { V printf("Duplicate file name.\n"); help(); return 2; } if ((fp = fopen(argv[optind], "rb")) == NULL) { V printf("Cannot open file %s\n", argv[optind]); return 2; } } samp = binary ? "bit" : "byte"; memset(ccount, 0, sizeof ccount); /* Initialise for calculations */ rt_init(binary); /* Scan input file and count character occurrences */ while ((oc = fgetc(fp)) != EOF) { unsigned char ocb; if (fold && isISOalpha(oc) && isISOupper(oc)) { oc = toISOlower(oc); } ocb = (unsigned char) oc; totalc += binary ? 8 : 1; if (binary) { int b; unsigned char ob = ocb; for (b = 0; b < 8; b++) { ccount[ob & 1]++; ob >>= 1; } } else { ccount[ocb]++; /* Update counter for this bin */ } rt_add(&ocb, 1); } V fclose(fp); /* Complete calculation and return sequence metrics */ rt_end(&ent, &chisq, &mean, &montepi, &scc); if (terse) { V printf("0,File-%ss,Entropy,Chi-square,Mean,Monte-Carlo-Pi,Serial-Correlation\n", binary ? "bit" : "byte"); V printf("1,%ld,%f,%f,%f,%f,%f\n", totalc, ent, chisq, mean, montepi, scc); } /* Calculate probability of observed distribution occurring from the results of the Chi-Square test */ chip = sqrt(2.0 * chisq) - sqrt(2.0 * (binary ? 1 : 255.0) - 1.0); a = fabs(chip); for (i = 9; i >= 0; i--) { if (chsqt[1][i] < a) { break; } } chip = (chip >= 0.0) ? chsqt[0][i] : 1.0 - chsqt[0][i]; /* Print bin counts if requested */ if (counts) { if (terse) { V printf("2,Value,Occurrences,Fraction\n"); } else { V printf("Value Char Occurrences Fraction\n"); } for (i = 0; i < (binary ? 2 : 256); i++) { if (terse) { V printf("3,%d,%ld,%f\n", i, ccount[i], ((double) ccount[i] / totalc)); } else { if (ccount[i] > 0) { V printf("%3d %c %10ld %f\n", i, /* The following expression shows ISO 8859-1 Latin1 characters and blanks out other codes. The test for ISO space replaces the ISO non-blanking space (0xA0) with a regular ASCII space, guaranteeing it's rendered properly even when the font doesn't contain that character, which is the case with many X fonts. */ (!isISOprint(i) || isISOspace(i)) ? ' ' : i, ccount[i], ((double) ccount[i] / totalc)); } } } if (!terse) { V printf("\nTotal: %10ld %f\n\n", totalc, 1.0); } } /* Print calculated results */ if (!terse) { V printf("Entropy = %f bits per %s.\n", ent, samp); V printf("\nOptimum compression would reduce the size\n"); V printf("of this %ld %s file by %d percent.\n\n", totalc, samp, (short) ((100 * ((binary ? 1 : 8) - ent) / (binary ? 1.0 : 8.0)))); V printf( "Chi square distribution for %ld samples is %1.2f, and randomly\n", totalc, chisq); V printf("would exceed this value %1.2f percent of the times.\n\n", chip * 100); V printf( "Arithmetic mean value of data %ss is %1.4f (%.1f = random).\n", samp, mean, binary ? 0.5 : 127.5); V printf("Monte Carlo value for Pi is %1.9f (error %1.2f percent).\n", montepi, 100.0 * (fabs(PI - montepi) / PI)); V printf("Serial correlation coefficient is "); if (scc >= -99999) { V printf("%1.6f (totally uncorrelated = 0.0).\n", scc); } else { V printf("undefined (all values equal!).\n"); } } return 0; } ent-1.1debian/iso8859.h0000644000175000017500000000206510664211465012767 0ustar wjlwjl /* ISO 8859/1 Latin-1 "ctype" macro replacements. */ extern unsigned char isoalpha[32], isoupper[32], isolower[32]; #define isISOspace(x) ((isascii(((unsigned char) (x))) && isspace(((unsigned char) (x)))) || ((x) == 0xA0)) #define isISOalpha(x) ((isoalpha[(((unsigned char) (x))) / 8] & (0x80 >> ((((unsigned char) (x))) % 8))) != 0) #define isISOupper(x) ((isoupper[(((unsigned char) (x))) / 8] & (0x80 >> ((((unsigned char) (x))) % 8))) != 0) #define isISOlower(x) ((isolower[(((unsigned char) (x))) / 8] & (0x80 >> ((((unsigned char) (x))) % 8))) != 0) #define isISOprint(x) ((((x) >= ' ') && ((x) <= '~')) || ((x) >= 0xA0)) #define toISOupper(x) (isISOlower(x) ? (isascii(((unsigned char) (x))) ? \ toupper(x) : (((((unsigned char) (x)) != 0xDF) && \ (((unsigned char) (x)) != 0xFF)) ? \ (((unsigned char) (x)) - 0x20) : (x))) : (x)) #define toISOlower(x) (isISOupper(x) ? (isascii(((unsigned char) (x))) ? \ tolower(x) : (((unsigned char) (x)) + 0x20)) \ : (x)) ent-1.1debian/Makefile0000644000175000017500000000131610664211465013124 0ustar wjlwjlCC=gcc CFLAGS = -Wall -Werror -O3 all: ent ent.1 ent: ent.o iso8859.o randtest.o $(CC) $(CFLAGS) ent.o iso8859.o randtest.o -o ent -lm ent.c: iso8859.h randtest.h clean: rm -f *.o ent ent.1 test/actual .PHONY: test test: ent ./ent entitle.gif >test/actual ./ent -c entitle.gif >test/actual ./ent -fc entitle.gif >>test/actual ./ent -b entitle.gif >>test/actual ./ent -bc entitle.gif >>test/actual ./ent -t entitle.gif >>test/actual ./ent -ct entitle.gif >>test/actual ./ent -ft entitle.gif >>test/actual ./ent -bt entitle.gif >>test/actual ./ent -bct entitle.gif >>test/actual diff -s test/expected test/actual %.1: %.1.txt asciidoc -b docbook -d manpage $< docbook2x-man $*.1.xml rm -f $*.1.xml ent-1.1debian/test/0000755000175000017500000000000010664211465012442 5ustar wjlwjlent-1.1debian/test/expected0000644000175000017500000005250210664211465014172 0ustar wjlwjlValue Char Occurrences Fraction 0 497 0.042775 1 103 0.008865 2 90 0.007746 3 107 0.009209 4 113 0.009725 5 68 0.005852 6 82 0.007057 7 70 0.006025 8 103 0.008865 9 75 0.006455 10 50 0.004303 11 40 0.003443 12 55 0.004734 13 47 0.004045 14 32 0.002754 15 35 0.003012 16 95 0.008176 17 77 0.006627 18 49 0.004217 19 63 0.005422 20 40 0.003443 21 32 0.002754 22 51 0.004389 23 39 0.003357 24 64 0.005508 25 48 0.004131 26 37 0.003184 27 40 0.003443 28 43 0.003701 29 36 0.003098 30 47 0.004045 31 36 0.003098 32 86 0.007402 33 ! 72 0.006197 34 " 47 0.004045 35 # 32 0.002754 36 $ 37 0.003184 37 % 36 0.003098 38 & 29 0.002496 39 ' 53 0.004561 40 ( 58 0.004992 41 ) 50 0.004303 42 * 40 0.003443 43 + 33 0.002840 44 , 58 0.004992 45 - 32 0.002754 46 . 30 0.002582 47 / 20 0.001721 48 0 97 0.008348 49 1 71 0.006111 50 2 41 0.003529 51 3 61 0.005250 52 4 46 0.003959 53 5 35 0.003012 54 6 35 0.003012 55 7 49 0.004217 56 8 65 0.005594 57 9 58 0.004992 58 : 52 0.004475 59 ; 51 0.004389 60 < 42 0.003615 61 = 51 0.004389 62 > 29 0.002496 63 ? 18 0.001549 64 @ 99 0.008521 65 A 53 0.004561 66 B 54 0.004648 67 C 38 0.003271 68 D 62 0.005336 69 E 43 0.003701 70 F 53 0.004561 71 G 31 0.002668 72 H 66 0.005680 73 I 46 0.003959 74 J 50 0.004303 75 K 37 0.003184 76 L 29 0.002496 77 M 28 0.002410 78 N 30 0.002582 79 O 39 0.003357 80 P 84 0.007230 81 Q 56 0.004820 82 R 63 0.005422 83 S 43 0.003701 84 T 48 0.004131 85 U 44 0.003787 86 V 32 0.002754 87 W 26 0.002238 88 X 38 0.003271 89 Y 33 0.002840 90 Z 61 0.005250 91 [ 32 0.002754 92 \ 41 0.003529 93 ] 30 0.002582 94 ^ 31 0.002668 95 _ 22 0.001893 96 ` 70 0.006025 97 a 47 0.004045 98 b 30 0.002582 99 c 47 0.004045 100 d 24 0.002066 101 e 27 0.002324 102 f 36 0.003098 103 g 27 0.002324 104 h 52 0.004475 105 i 32 0.002754 106 j 41 0.003529 107 k 56 0.004820 108 l 31 0.002668 109 m 22 0.001893 110 n 25 0.002152 111 o 24 0.002066 112 p 60 0.005164 113 q 32 0.002754 114 r 41 0.003529 115 s 60 0.005164 116 t 42 0.003615 117 u 43 0.003701 118 v 26 0.002238 119 w 28 0.002410 120 x 41 0.003529 121 y 35 0.003012 122 z 51 0.004389 123 { 59 0.005078 124 | 32 0.002754 125 } 14 0.001205 126 ~ 27 0.002324 127 22 0.001893 128 112 0.009639 129 63 0.005422 130 64 0.005508 131 79 0.006799 132 100 0.008607 133 51 0.004389 134 42 0.003615 135 35 0.003012 136 68 0.005852 137 35 0.003012 138 52 0.004475 139 36 0.003098 140 69 0.005939 141 31 0.002668 142 56 0.004820 143 31 0.002668 144 63 0.005422 145 37 0.003184 146 38 0.003271 147 42 0.003615 148 66 0.005680 149 42 0.003615 150 36 0.003098 151 28 0.002410 152 58 0.004992 153 40 0.003443 154 31 0.002668 155 29 0.002496 156 68 0.005852 157 34 0.002926 158 35 0.003012 159 34 0.002926 160 91 0.007832 161 46 0.003959 162 61 0.005250 163 40 0.003443 164 47 0.004045 165 68 0.005852 166 51 0.004389 167 34 0.002926 168 62 0.005336 169 42 0.003615 170 59 0.005078 171 30 0.002582 172 30 0.002582 173 51 0.004389 174 34 0.002926 175 22 0.001893 176 77 0.006627 177 44 0.003787 178 33 0.002840 179 23 0.001980 180 38 0.003271 181 50 0.004303 182 28 0.002410 183 17 0.001463 184 35 0.003012 185 37 0.003184 186 30 0.002582 187 22 0.001893 188 32 0.002754 189 48 0.004131 190 31 0.002668 191 25 0.002152 192 63 0.005422 193 47 0.004045 194 47 0.004045 195 36 0.003098 196 47 0.004045 197 25 0.002152 198 38 0.003271 199 29 0.002496 200 45 0.003873 201 41 0.003529 202 37 0.003184 203 33 0.002840 204 30 0.002582 205 31 0.002668 206 40 0.003443 207 25 0.002152 208 65 0.005594 209 37 0.003184 210 33 0.002840 211 36 0.003098 212 32 0.002754 213 24 0.002066 214 51 0.004389 215 19 0.001635 216 39 0.003357 217 27 0.002324 218 34 0.002926 219 25 0.002152 220 32 0.002754 221 22 0.001893 222 28 0.002410 223 16 0.001377 224 74 0.006369 225 32 0.002754 226 30 0.002582 227 23 0.001980 228 28 0.002410 229 29 0.002496 230 22 0.001893 231 36 0.003098 232 38 0.003271 233 25 0.002152 234 26 0.002238 235 28 0.002410 236 35 0.003012 237 22 0.001893 238 27 0.002324 239 27 0.002324 240 63 0.005422 241 23 0.001980 242 22 0.001893 243 26 0.002238 244 38 0.003271 245 23 0.001980 246 19 0.001635 247 37 0.003184 248 46 0.003959 249 26 0.002238 250 27 0.002324 251 25 0.002152 252 32 0.002754 253 31 0.002668 254 63 0.005422 255 15 0.001291 Total: 11619 1.000000 Entropy = 7.787095 bits per byte. Optimum compression would reduce the size of this 11619 byte file by 2 percent. Chi square distribution for 11619 samples is 6567.22, and randomly would exceed this value 0.01 percent of the times. Arithmetic mean value of data bytes is 110.0003 (127.5 = random). Monte Carlo value for Pi is 3.392561983 (error 7.99 percent). Serial correlation coefficient is 0.098324 (totally uncorrelated = 0.0). Value Char Occurrences Fraction 0 497 0.042775 1 103 0.008865 2 90 0.007746 3 107 0.009209 4 113 0.009725 5 68 0.005852 6 82 0.007057 7 70 0.006025 8 103 0.008865 9 75 0.006455 10 50 0.004303 11 40 0.003443 12 55 0.004734 13 47 0.004045 14 32 0.002754 15 35 0.003012 16 95 0.008176 17 77 0.006627 18 49 0.004217 19 63 0.005422 20 40 0.003443 21 32 0.002754 22 51 0.004389 23 39 0.003357 24 64 0.005508 25 48 0.004131 26 37 0.003184 27 40 0.003443 28 43 0.003701 29 36 0.003098 30 47 0.004045 31 36 0.003098 32 86 0.007402 33 ! 72 0.006197 34 " 47 0.004045 35 # 32 0.002754 36 $ 37 0.003184 37 % 36 0.003098 38 & 29 0.002496 39 ' 53 0.004561 40 ( 58 0.004992 41 ) 50 0.004303 42 * 40 0.003443 43 + 33 0.002840 44 , 58 0.004992 45 - 32 0.002754 46 . 30 0.002582 47 / 20 0.001721 48 0 97 0.008348 49 1 71 0.006111 50 2 41 0.003529 51 3 61 0.005250 52 4 46 0.003959 53 5 35 0.003012 54 6 35 0.003012 55 7 49 0.004217 56 8 65 0.005594 57 9 58 0.004992 58 : 52 0.004475 59 ; 51 0.004389 60 < 42 0.003615 61 = 51 0.004389 62 > 29 0.002496 63 ? 18 0.001549 64 @ 99 0.008521 91 [ 32 0.002754 92 \ 41 0.003529 93 ] 30 0.002582 94 ^ 31 0.002668 95 _ 22 0.001893 96 ` 70 0.006025 97 a 100 0.008607 98 b 84 0.007230 99 c 85 0.007316 100 d 86 0.007402 101 e 70 0.006025 102 f 89 0.007660 103 g 58 0.004992 104 h 118 0.010156 105 i 78 0.006713 106 j 91 0.007832 107 k 93 0.008004 108 l 60 0.005164 109 m 50 0.004303 110 n 55 0.004734 111 o 63 0.005422 112 p 144 0.012393 113 q 88 0.007574 114 r 104 0.008951 115 s 103 0.008865 116 t 90 0.007746 117 u 87 0.007488 118 v 58 0.004992 119 w 54 0.004648 120 x 79 0.006799 121 y 68 0.005852 122 z 112 0.009639 123 { 59 0.005078 124 | 32 0.002754 125 } 14 0.001205 126 ~ 27 0.002324 127 22 0.001893 128 112 0.009639 129 63 0.005422 130 64 0.005508 131 79 0.006799 132 100 0.008607 133 51 0.004389 134 42 0.003615 135 35 0.003012 136 68 0.005852 137 35 0.003012 138 52 0.004475 139 36 0.003098 140 69 0.005939 141 31 0.002668 142 56 0.004820 143 31 0.002668 144 63 0.005422 145 37 0.003184 146 38 0.003271 147 42 0.003615 148 66 0.005680 149 42 0.003615 150 36 0.003098 151 28 0.002410 152 58 0.004992 153 40 0.003443 154 31 0.002668 155 29 0.002496 156 68 0.005852 157 34 0.002926 158 35 0.003012 159 34 0.002926 160 91 0.007832 161 46 0.003959 162 61 0.005250 163 40 0.003443 164 47 0.004045 165 68 0.005852 166 51 0.004389 167 34 0.002926 168 62 0.005336 169 42 0.003615 170 59 0.005078 171 30 0.002582 172 30 0.002582 173 51 0.004389 174 34 0.002926 175 22 0.001893 176 77 0.006627 177 44 0.003787 178 33 0.002840 179 23 0.001980 180 38 0.003271 181 50 0.004303 182 28 0.002410 183 17 0.001463 184 35 0.003012 185 37 0.003184 186 30 0.002582 187 22 0.001893 188 32 0.002754 189 48 0.004131 190 31 0.002668 191 25 0.002152 215 19 0.001635 223 16 0.001377 224 137 0.011791 225 79 0.006799 226 77 0.006627 227 59 0.005078 228 75 0.006455 229 54 0.004648 230 60 0.005164 231 65 0.005594 232 83 0.007143 233 66 0.005680 234 63 0.005422 235 61 0.005250 236 65 0.005594 237 53 0.004561 238 67 0.005766 239 52 0.004475 240 128 0.011016 241 60 0.005164 242 55 0.004734 243 62 0.005336 244 70 0.006025 245 47 0.004045 246 70 0.006025 247 37 0.003184 248 85 0.007316 249 53 0.004561 250 61 0.005250 251 50 0.004303 252 64 0.005508 253 53 0.004561 254 91 0.007832 255 15 0.001291 Total: 11619 1.000000 Entropy = 7.431477 bits per byte. Optimum compression would reduce the size of this 11619 byte file by 7 percent. Chi square distribution for 11619 samples is 10272.80, and randomly would exceed this value 0.01 percent of the times. Arithmetic mean value of data bytes is 116.2962 (127.5 = random). Monte Carlo value for Pi is 3.185950413 (error 1.41 percent). Serial correlation coefficient is 0.100692 (totally uncorrelated = 0.0). Entropy = 0.984961 bits per bit. Optimum compression would reduce the size of this 92952 bit file by 1 percent. Chi square distribution for 92952 samples is 1931.17, and randomly would exceed this value 0.01 percent of the times. Arithmetic mean value of data bits is 0.4279 (0.5 = random). Monte Carlo value for Pi is 3.392561983 (error 7.99 percent). Serial correlation coefficient is 0.047734 (totally uncorrelated = 0.0). Value Char Occurrences Fraction 0 53175 0.572069 1 39777 0.427931 Total: 92952 1.000000 Entropy = 0.984961 bits per bit. Optimum compression would reduce the size of this 92952 bit file by 1 percent. Chi square distribution for 92952 samples is 1931.17, and randomly would exceed this value 0.01 percent of the times. Arithmetic mean value of data bits is 0.4279 (0.5 = random). Monte Carlo value for Pi is 3.392561983 (error 7.99 percent). Serial correlation coefficient is 0.047734 (totally uncorrelated = 0.0). 0,File-bytes,Entropy,Chi-square,Mean,Monte-Carlo-Pi,Serial-Correlation 1,11619,7.787095,6567.223255,110.000258,3.392562,0.098324 0,File-bytes,Entropy,Chi-square,Mean,Monte-Carlo-Pi,Serial-Correlation 1,11619,7.787095,6567.223255,110.000258,3.392562,0.098324 2,Value,Occurrences,Fraction 3,0,497,0.042775 3,1,103,0.008865 3,2,90,0.007746 3,3,107,0.009209 3,4,113,0.009725 3,5,68,0.005852 3,6,82,0.007057 3,7,70,0.006025 3,8,103,0.008865 3,9,75,0.006455 3,10,50,0.004303 3,11,40,0.003443 3,12,55,0.004734 3,13,47,0.004045 3,14,32,0.002754 3,15,35,0.003012 3,16,95,0.008176 3,17,77,0.006627 3,18,49,0.004217 3,19,63,0.005422 3,20,40,0.003443 3,21,32,0.002754 3,22,51,0.004389 3,23,39,0.003357 3,24,64,0.005508 3,25,48,0.004131 3,26,37,0.003184 3,27,40,0.003443 3,28,43,0.003701 3,29,36,0.003098 3,30,47,0.004045 3,31,36,0.003098 3,32,86,0.007402 3,33,72,0.006197 3,34,47,0.004045 3,35,32,0.002754 3,36,37,0.003184 3,37,36,0.003098 3,38,29,0.002496 3,39,53,0.004561 3,40,58,0.004992 3,41,50,0.004303 3,42,40,0.003443 3,43,33,0.002840 3,44,58,0.004992 3,45,32,0.002754 3,46,30,0.002582 3,47,20,0.001721 3,48,97,0.008348 3,49,71,0.006111 3,50,41,0.003529 3,51,61,0.005250 3,52,46,0.003959 3,53,35,0.003012 3,54,35,0.003012 3,55,49,0.004217 3,56,65,0.005594 3,57,58,0.004992 3,58,52,0.004475 3,59,51,0.004389 3,60,42,0.003615 3,61,51,0.004389 3,62,29,0.002496 3,63,18,0.001549 3,64,99,0.008521 3,65,53,0.004561 3,66,54,0.004648 3,67,38,0.003271 3,68,62,0.005336 3,69,43,0.003701 3,70,53,0.004561 3,71,31,0.002668 3,72,66,0.005680 3,73,46,0.003959 3,74,50,0.004303 3,75,37,0.003184 3,76,29,0.002496 3,77,28,0.002410 3,78,30,0.002582 3,79,39,0.003357 3,80,84,0.007230 3,81,56,0.004820 3,82,63,0.005422 3,83,43,0.003701 3,84,48,0.004131 3,85,44,0.003787 3,86,32,0.002754 3,87,26,0.002238 3,88,38,0.003271 3,89,33,0.002840 3,90,61,0.005250 3,91,32,0.002754 3,92,41,0.003529 3,93,30,0.002582 3,94,31,0.002668 3,95,22,0.001893 3,96,70,0.006025 3,97,47,0.004045 3,98,30,0.002582 3,99,47,0.004045 3,100,24,0.002066 3,101,27,0.002324 3,102,36,0.003098 3,103,27,0.002324 3,104,52,0.004475 3,105,32,0.002754 3,106,41,0.003529 3,107,56,0.004820 3,108,31,0.002668 3,109,22,0.001893 3,110,25,0.002152 3,111,24,0.002066 3,112,60,0.005164 3,113,32,0.002754 3,114,41,0.003529 3,115,60,0.005164 3,116,42,0.003615 3,117,43,0.003701 3,118,26,0.002238 3,119,28,0.002410 3,120,41,0.003529 3,121,35,0.003012 3,122,51,0.004389 3,123,59,0.005078 3,124,32,0.002754 3,125,14,0.001205 3,126,27,0.002324 3,127,22,0.001893 3,128,112,0.009639 3,129,63,0.005422 3,130,64,0.005508 3,131,79,0.006799 3,132,100,0.008607 3,133,51,0.004389 3,134,42,0.003615 3,135,35,0.003012 3,136,68,0.005852 3,137,35,0.003012 3,138,52,0.004475 3,139,36,0.003098 3,140,69,0.005939 3,141,31,0.002668 3,142,56,0.004820 3,143,31,0.002668 3,144,63,0.005422 3,145,37,0.003184 3,146,38,0.003271 3,147,42,0.003615 3,148,66,0.005680 3,149,42,0.003615 3,150,36,0.003098 3,151,28,0.002410 3,152,58,0.004992 3,153,40,0.003443 3,154,31,0.002668 3,155,29,0.002496 3,156,68,0.005852 3,157,34,0.002926 3,158,35,0.003012 3,159,34,0.002926 3,160,91,0.007832 3,161,46,0.003959 3,162,61,0.005250 3,163,40,0.003443 3,164,47,0.004045 3,165,68,0.005852 3,166,51,0.004389 3,167,34,0.002926 3,168,62,0.005336 3,169,42,0.003615 3,170,59,0.005078 3,171,30,0.002582 3,172,30,0.002582 3,173,51,0.004389 3,174,34,0.002926 3,175,22,0.001893 3,176,77,0.006627 3,177,44,0.003787 3,178,33,0.002840 3,179,23,0.001980 3,180,38,0.003271 3,181,50,0.004303 3,182,28,0.002410 3,183,17,0.001463 3,184,35,0.003012 3,185,37,0.003184 3,186,30,0.002582 3,187,22,0.001893 3,188,32,0.002754 3,189,48,0.004131 3,190,31,0.002668 3,191,25,0.002152 3,192,63,0.005422 3,193,47,0.004045 3,194,47,0.004045 3,195,36,0.003098 3,196,47,0.004045 3,197,25,0.002152 3,198,38,0.003271 3,199,29,0.002496 3,200,45,0.003873 3,201,41,0.003529 3,202,37,0.003184 3,203,33,0.002840 3,204,30,0.002582 3,205,31,0.002668 3,206,40,0.003443 3,207,25,0.002152 3,208,65,0.005594 3,209,37,0.003184 3,210,33,0.002840 3,211,36,0.003098 3,212,32,0.002754 3,213,24,0.002066 3,214,51,0.004389 3,215,19,0.001635 3,216,39,0.003357 3,217,27,0.002324 3,218,34,0.002926 3,219,25,0.002152 3,220,32,0.002754 3,221,22,0.001893 3,222,28,0.002410 3,223,16,0.001377 3,224,74,0.006369 3,225,32,0.002754 3,226,30,0.002582 3,227,23,0.001980 3,228,28,0.002410 3,229,29,0.002496 3,230,22,0.001893 3,231,36,0.003098 3,232,38,0.003271 3,233,25,0.002152 3,234,26,0.002238 3,235,28,0.002410 3,236,35,0.003012 3,237,22,0.001893 3,238,27,0.002324 3,239,27,0.002324 3,240,63,0.005422 3,241,23,0.001980 3,242,22,0.001893 3,243,26,0.002238 3,244,38,0.003271 3,245,23,0.001980 3,246,19,0.001635 3,247,37,0.003184 3,248,46,0.003959 3,249,26,0.002238 3,250,27,0.002324 3,251,25,0.002152 3,252,32,0.002754 3,253,31,0.002668 3,254,63,0.005422 3,255,15,0.001291 0,File-bytes,Entropy,Chi-square,Mean,Monte-Carlo-Pi,Serial-Correlation 1,11619,7.431477,10272.800671,116.296153,3.185950,0.100692 0,File-bits,Entropy,Chi-square,Mean,Monte-Carlo-Pi,Serial-Correlation 1,92952,0.984961,1931.173122,0.427931,3.392562,0.047734 0,File-bits,Entropy,Chi-square,Mean,Monte-Carlo-Pi,Serial-Correlation 1,92952,0.984961,1931.173122,0.427931,3.392562,0.047734 2,Value,Occurrences,Fraction 3,0,53175,0.572069 3,1,39777,0.427931 ent-1.1debian/CHANGES0000644000175000017500000000033010664211465012452 0ustar wjlwjl1.1debian Updated documentation and test. Rolled in all previous debian changes. -- Wesley J. Landaker 2007-08-25 1.0 Original Release -- http://www.fourmilab.ch/random/ 1998-10-20 ent-1.1debian/ent.1.txt0000644000175000017500000002412110664211465013151 0ustar wjlwjlent(1) ====== Wesley J. Landaker NAME ---- ent - pseudorandom number sequence test SYNOPSIS -------- _ent_ [options] [file] DESCRIPTION ----------- image:entitle.gif[ENT Logo] _ent_ performs a variety of tests on the stream of bytes in _file_ (or standard input if no _file_ is specified) and produces output on standard output; for example: .......................................................................... Entropy = 7.980627 bits per character. Optimum compression would reduce the size of this 51768 character file by 0 percent. Chi square distribution for 51768 samples is 1542.26, and randomly would exceed this value 0.01 percent of the times. Arithmetic mean value of data bytes is 125.93 (127.5 = random). Monte Carlo value for Pi is 3.169834647 (error 0.90 percent). Serial correlation coefficient is 0.004249 (totally uncorrelated = 0.0). .......................................................................... The values calculated are as follows: Entropy ~~~~~~~ The information density of the contents of the file, expressed as a number of bits per character. The results above, which resulted from processing an image file compressed with JPEG, indicate that the file is extremely dense in information--essentially random. Hence, compression of the file is unlikely to reduce its size. By contrast, the C source code of the program has entropy of about 4.9 bits per character, indicating that optimal compression of the file would reduce its size by 38%. [Hamming, pp. 104-108] Chi-square Test ~~~~~~~~~~~~~~~ The chi-square test is the most commonly used test for the randomness of data, and is extremely sensitive to errors in pseudorandom sequence generators. The chi-square distribution is calculated for the stream of bytes in the file and expressed as an absolute number and a percentage which indicates how frequently a truly random sequence would exceed the value calculated. We interpret the percentage as the degree to which the sequence tested is suspected of being non-random. If the percentage is greater than 99% or less than 1%, the sequence is almost certainly not random. If the percentage is between 99% and 95% or between 1% and 5%, the sequence is suspect. Percentages between 90% and 95% and 5% and 10% indicate the sequence is "almost suspect". Note that our JPEG file, while very dense in information, is far from random as revealed by the chi-square test. Applying this test to the output of various pseudorandom sequence generators is interesting. The low-order 8 bits returned by the standard Unix rand(1) function, for example, yields: ................................................................... Chi square distribution for 500000 samples is 0.01, and randomly would exceed this value 99.99 percent of the times. ................................................................... While an improved generator [Park & Miller] reports: ................................................................... Chi square distribution for 500000 samples is 212.53, and randomly would exceed this value 95.00 percent of the times. ................................................................... Thus, the standard Unix generator (or at least the low-order bytes it returns) is unacceptably non-random, while the improved generator is much better but still sufficiently non-random to cause concern for demanding applications. Contrast both of these software generators with the chi-square result of a genuine random sequence created by timing radioactive decay events[1]: ................................................................... Chi square distribution for 32768 samples is 237.05, and randomly would exceed this value 75.00 percent of the times. ................................................................... See [Knuth, pp. 35-40] for more information on the chi-square test. An interactive chi-square calculator[2] is available at this site. Arithmetic Mean ~~~~~~~~~~~~~~~ This is simply the result of summing the all the bytes (bits if the _-b_ option is specified) in the file and dividing by the file length. If the data are close to random, this should be about 127.5 (0.5 for _-b_ option output). If the mean departs from this value, the values are consistently high or low. Monte Carlo Value for Pi ~~~~~~~~~~~~~~~~~~~~~~~~ Each successive sequence of six bytes is used as 24 bit X and Y coordinates within a square. If the distance of the randomly-generated point is less than the radius of a circle inscribed within the square, the six-byte sequence is considered a "hit". The percentage of hits can be used to calculate the value of Pi. For very large streams (this approximation converges very slowly), the value will approach the correct value of Pi if the sequence is close to random. A 32768 byte file created by radioactive decay yielded: ................................................................ Monte Carlo value for Pi is 3.139648438 (error 0.06 percent). ................................................................ Serial Correlation Coefficient ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This quantity measures the extent to which each byte in the file depends upon the previous byte. For random sequences, this value (which can be positive or negative) will, of course, be close to zero. A non-random byte stream such as a C program will yield a serial correlation coefficient on the order of 0.5. Wildly predictable data such as uncompressed bitmaps will exhibit serial correlation coefficients approaching 1. See [Knuth, pp. 64-65] for more details. OPTIONS ------- -b:: The input is treated as a stream of bits rather than of 8-bit bytes. Statistics reported reflect the properties of the bitstream. -c:: Print a table of the number of occurrences of each possible byte (or bit, if the _-b_ option is also specified) value, and the fraction of the overall file made up by that value. Printable characters in the ISO-8859-1 (Latin-1) character set are shown along with their decimal byte values. In non-terse output mode, values with zero occurrences are not printed. -f:: Fold upper case letters to lower case before computing statistics. Folding is done based on the ISO-8859-1 (Latin-1) character set, with accented letters correctly processed. -t:: Terse mode: output is written in Comma Separated Value (CSV) format, suitable for loading into a spreadsheet and easily read by any programming language. See Terse Mode Output Format below for additional details. -u:: Print how-to-call information. FILES ----- If no _file_ is specified, _ent_ obtains its input from standard input. Output is always written to standard output. TERSE MODE ---------- Terse mode is selected by specifying the _-t_ option on the command line. Terse mode output is written in Comma Separated Value (CSV) format, which can be directly loaded into most spreadsheet programs and is easily read by any programming language. Each record in the CSV file begins with a record type field, which identifies the content of the following fields. If the _-c_ option is not specified, the terse mode output will consist of two records, as follows: ........................................................................ 0,File-bytes,Entropy,Chi-square,Mean,Monte-Carlo-Pi,Serial-Correlation 1,file_length,entropy,chi_square,mean,Pi_value,correlation ........................................................................ where the italicised values in the type 1 record are the numerical values for the quantities named in the type 0 column title record. If the_ -b_ option is specified, the second field of the type 0 record will be "File-bits", and the file_length field in type 1 record will be given in bits instead of bytes. If the _-c_ option is specified, additional records are appended to the terse mode output which contain the character counts: .................................................... 2,Value,Occurrences,Fraction 3,v,count,fraction ... .................................................... If the _-b_ option is specified, only two type 3 records will appear for the two bit values v=0 and v=1. Otherwise, 256 type 3 records are included, one for each possible byte value. The second field of a type 3 record indicates how many bytes (or bits) of value v appear in the input, and fraction gives the decimal fraction of the file which has value v (which is equal to the count value of this record divided by the file_length field in the type 1 record). BUGS ---- Note that the "optimal compression" shown for the file is computed from the byte- or bit-stream entropy and thus reflects compressibility based on a reading frame of the chosen width (8-bit bytes or individual bits if the _-b_ option is specified). Algorithms which use a larger reading frame, such as the Lempel-Ziv [Lempel & Ziv] algorithm, may achieve greater compression if the file contains repeated sequences of multiple bytes. COPYING ------- This software is in the public domain. Permission to use, copy, modify, and distribute this software and its documentation for any purpose and without fee is hereby granted, without any conditions or restrictions. This software is provided "as is" without express or implied warranty. Original text and program by John Walker[3] October 20th, 1998 Modifications by Wesley J. Landaker , released under the same terms as above. SEE ALSO -------- Introduction to Probability and Statistics[4] [Hamming]:: Hamming, Richard W. Coding and Information Theory. Englewood Cliffs NJ: Prentice-Hall, 1980. [Knuth]:: Knuth, Donald E. The Art of Computer Programming, Volume 2 / Seminumerical Algorithms. Reading MA: Addison-Wesley, 1969. ISBN 0-201-89684-2. [Lempel & Ziv]:: Ziv J. and A. Lempel. "A Universal Algorithm for Sequential Data Compression". IEEE Transactions on Information Theory 23, 3, pp. 337-343. [Park & Miller]:: Park, Stephen K. and Keith W. Miller. "Random Number Generators: Good Ones Are Hard to Find". Communications of the ACM, October 1988, p. 1192. [1]:: http://www.fourmilab.ch/hotbits/ [2]:: http://www.fourmilab.ch/rpkp/experiments/analysis/chiCalc.html [3]:: http://www.fourmilab.ch/ [4]:: http://www.fourmilab.ch/rpkp/experiments/statistics.html ent-1.1debian/randtest.h0000644000175000017500000000036210664211465013461 0ustar wjlwjl /* Random test function prototypes */ extern void rt_init(int binmode); extern void rt_add(void *buf, int bufl); extern void rt_end(double *r_ent, double *r_chisq, double *r_mean, double *r_montepicalc, double *r_scc); ent-1.1debian/entitle.gif0000644000175000017500000002654310664211465013630 0ustar wjlwjlGIF87aq{{s{!!s!!{!!!!!!))s))))))11s11{1111111199s99{99999999BBsBB{BBBBBBJJJJJsJJJJJJRRRRRZRRkRRsRR{RRRRRRRRRRRRZZZZZcZZkZZsZZ{ZZZZZZZZZZccccckccscc{cccccccccccckkkkkskk{kkkkkkkkkkkksssss{ssssssssssssssss{{{{{{{{{{{{{{{ƌƔƔΜΥΥ֭ƭֵƵεֵ޽ƽνֽ,qQ H*\ȰÇ#JHŋ3jȱǏ CIɓ(SaFʃyJ,yD7vܔL/G˘AԌF:5iӧOjU)֭6mD$PTEI75VYrmUUUk،, Tj2<8p:@ T<@11u&P`0ta6'P@UY @AC("HajcX*?1KA!!P2t*PiFqo!@IetP ("MD$1bV@<@nt'!!Olr5}rknu]`'.{pQ"V%:4{lF1]$j!(f[Js1% (8g4CDHcJd#D$wb49.r%B\9+ӆRJ(\={AV|\uDŽɟz4 30qg\'!Ѩ '8 b eދbf3hIvZF+Z]6⍍ .PPb)'3`ki,0!a4Z)9:\a"% `!`B= `C˝Ġ8@4b3%X Ee; 6Equ\CKP'4.*@#bH=*rr0KPz", +`C0B@G`.(Cp3FTQf dTTIx O`%`".1yz'},`GG(kB@lrA=)O(h! t0)Q}ӟ'HEJ҄z,0D$(́ B BOzҒT€@49DK x {';sAz8BLo:TԤ3 >S;, ZSN4ݪM婀 U*֊Ч3H!wZ%^' P U(XySq:Wt1e?: ஂ504%j[,VG"!Ãx] i=жKD1+T-PQ!˙n6ŭi+~3nlusKV8q{0b/qKisC^]ژݛNlmGcWZ'YZЁF8܅3D 4;3\mtN- „f\Hq|@a%!@<M-OyT1:,ww1T, ~`b$!h0aH"9-,pf o'A^8L2M {! @̐f! Ex7"302Qh0EvJA`hQ >bv\A =h¶~xB`L,[C0."bkFL8F&:zj@%(Wv/y'+zCҩj0DYE\zإyp0 8Eh1Dp`w!;C6C24T}Ѓ4z΅~:}^ Qۂxas@'pzO }3x=X""@ ͽA6tgH@nw>r`O`KPҝ01 P˝$K~0,H }ry[fhtQ@@ W f, 872Mp>@rAo P` `DfaPn>hָXW;dWR)@op8wHczEe'ZX]Xlӊ = xx`3t (X^a0|x H qDܸX0X194Y0]>T~'i/2 p6$j!':9 ;/10 @Kkh5aA v= #!\9R~ݘaUQZ9(0U%v%M;wϑWǓyk\6z 9p;ן;&IquqY37(RӰhp'yajA0r2 zsŦ! n  7 눏Zx^Of4AXػ7as12Zb43j񀠧.:~\:ak,c;;ම 78\iќ9uPuQyz;HW71 u,".[0uZ0A0CVf[Nx(#7zKl7'**|x`"EEfQ1q'fFRF20)(UŪafH,cB`PGT1$dF[ u^sIJ1t0d⪼+*1QM:*00<zPc\xܻl_`TItDMzЃvkkT4|HM Ɵ:ȸZ"#@e6``\xrk!T5Oi K`ԗ#9̜PE\*p\FYe>E Q9Sl°ʉ5QluP*`4%_\U\\Lȋ<0eˬeR,l]dίΦ\jɻQtJR=)p\uR٪E#6uai04t=[|@  U= ՒUՒa$aVgIA<SuHgPԳqfOSBpϑl[EgF9PH< =9*Vx[iok 7dd 'u<gƦg-?<ςm< ~0g mu5qjXa  nf`iGpFБjR VtL6,Բ%F;j,!0h";IkqW9F.ֽ̺5z9_Y; ;-]u0<܅ U)q+mzD`B (S;yuKA|p[k2A ч/H g +K$!7 K"{> gk*rPmNӀ9H'G[P:1>"cHUr0S ueHp<7ar@r kF1;=1@.y;r32f^~0L@8pHnxeR7t'Җ;.j3@){\I.ß; 0Y[<,A&|$-Mh:QPtru>5-[R|wKd nݣϨLP Eu^HΘH8CEg1)9S-j1j_b1};&<  "^Ǣ.{_B.I(t!hL G.$I3 BOJV! lD-a0*=Å*F@=HzPP&A2@IcHA(Ysɔ#fHSϏM>hĠCODq$i(RP~hfTT:4KșP8zDEO<=˰*YZe^A.ST jUVF\^n*ulY&]Y/ `Pi296D/hyP`Q' |JEv3P`#Eh #j6eNBPXM #&8t ȄLLd7DQg$N@ 䂂"@sO` b3F1(- c'bS^Nu 0P)B J"L@@EP1;l#3z=@0i(t'I%  4 C(%"8zR, DTf5Bѫ&+ѯ鵼'D>=J`kAN,3,3Q\=4LRuP[^Yebafz8wf,0)YفΈVJ @Rn92 Q#VK1=|% dVv_rՉDJ)3F^ #E"@jP`Q RIsE>Q>h?=tѵxۡ]ʋ h ʤ4Q  Wb(P5R_Q q!a_ "d/hj"2 oj)S zG=`Ǫ0 i`适/P \HƦ/'sQ)LZr*f1F#~^@EDL ScB@2p0@o(E@F7% pP3\ 16h SrSV[!p3%Гi1`(Db F8CA'}bw+ ICT@ !DψlK1=OAĥLjĒ@m/  p*l҅gЃL#(3. \u0y.\1@p<؄,5́`AvyC k~SYlI@:gӞLN=s.'UI5Ək@pAy92!;5C%Hi8zPtp9pҕ9k)Ka*ӕR$ HAA0JlT#9͢1 II@3Q7A* T QP0tի_kX:0! pC "Q45 ʼn( vT`Dhn&!H OC aVlf1Y³X+W4Ů{ C҆- 4P4|I k#)Vyj¸q2]q+]䆂+J\݄6QM1 =-LU;ءrf, @sH: 0# ;yI<`S~Ɂ|kP1)E2u8C/۔O t7 |E:xu,-@Q '!ax{dg x#P@̯)!HGph]6eTpy^rp 775wHʶ5ڰkD`p@0l0 tFW6!< H: P82k"5#i(Tr#F(1 .SDy6!=P1H&Fn9n6u9]SNC9I`;Xmin2:ny[pOHm{a9NZa;e|D:7NdAj}2ʵFӆ3'd3T2 H@W'@TpUg!zpr N,(No7<@%U;{aS Zò=ؘ &ɿ8:{19>Ta? 2/J?T@u7K,j-7+@ Z (IPX˘:Z'-2-y"#"| )ǻ $|ӲB B@ ](7ĭڈh$?8"N۔+%Et y0@2YI 0 '0,7H>04`7At@1 JHJ& IڹPxVXSpVts;hʹʼJ-YOI-(X692M3hGFN?<0/h73(37hAND30GGqJ ʖ,D񄎑K:I%;h!4o+|A89'(3!r8!@Q*?4@DcPQ:ȣM8<05),@Q:@0pDE=@0RJY4ݣ>QI!R${24ߊb:=इpS,pL7 7 pSl&=#5q&8@ #p\B%S=X3;Ճy77&?ͣDS{I],EՃBM$r‹=|B'hTP=-C J&Ō-5V9.<l5dK9/gMd*`=-Pw:ַm_m6BPV\͘HU٨=V<Э| ֋V(F|TKfw _P3Be )fJh9b;UPe  s: ^FOh[ͱ0@ Y,ȶp8?ځeSS&NDc\0c5S>N`~G0㬀E$0Wi$֊ ARh* 빶 ΀k뻖 lkƀ k nhqMH Ђq.XAP@[dh Әa{m(O`88~J6^b O T2)mG)0O80HI+ni0P;Ђ jQooczB ̎O%Y'A*0M08PNP^^o0I 0cΪo[pC>$BH"n⎟Ⴂpu@8qO%zʊ o?UYH؃Rr,Tr1zP%Tr-@%W+"ք@H ngРȀ[vr{ 0B PDgF_tB'D Ij!:q+.:*\nFH3'jO8Ђ3LoM0\]^_vAwx,{0UuFNJkuFq.Xs'Ks(Uږ0tFvF;H0ЂQugvwwx-ЂJyLu*tapYu(AOfO 6߃4 x'# qK;xx;'7y=Ch7;u`;ЉK!)[ax WwsJ8 z첗OۺIZ88w"^ЈF(sG8)7z7*/ x7GWgXv{F,r7,ɏrɊ]{|Mx{ɢ|[.swׇؗw'Yx.KwWwz g~m~y~ۧx70շC'0L~-oK0} ;