blob: 072fbd8234d56f531a25dbf4a6dcb53f6463eb7d [file] [log] [blame]
Linus Torvalds1da177e2005-04-16 15:20:36 -07001/*
Bob Pearson78dff412012-03-23 15:02:24 -07002 * Aug 8, 2011 Bob Pearson with help from Joakim Tjernlund and George Spelvin
3 * cleaned up code to current version of sparse and added the slicing-by-8
4 * algorithm to the closely similar existing slicing-by-4 algorithm.
5 *
Linus Torvalds1da177e2005-04-16 15:20:36 -07006 * Oct 15, 2000 Matt Domsch <Matt_Domsch@dell.com>
7 * Nicer crc32 functions/docs submitted by linux@horizon.com. Thanks!
8 * Code was from the public domain, copyright abandoned. Code was
9 * subsequently included in the kernel, thus was re-licensed under the
10 * GNU GPL v2.
11 *
12 * Oct 12, 2000 Matt Domsch <Matt_Domsch@dell.com>
13 * Same crc32 function was used in 5 other places in the kernel.
14 * I made one version, and deleted the others.
15 * There are various incantations of crc32(). Some use a seed of 0 or ~0.
16 * Some xor at the end with ~0. The generic crc32() function takes
17 * seed as an argument, and doesn't xor at the end. Then individual
18 * users can do whatever they need.
19 * drivers/net/smc9194.c uses seed ~0, doesn't xor with ~0.
20 * fs/jffs2 uses seed 0, doesn't xor with ~0.
21 * fs/partitions/efi.c uses seed ~0, xor's with ~0.
22 *
23 * This source code is licensed under the GNU General Public License,
24 * Version 2. See the file COPYING for more details.
25 */
26
Bob Pearsonfbedceb2012-03-23 15:02:22 -070027/* see: Documentation/crc32.txt for a description of algorithms */
28
Linus Torvalds1da177e2005-04-16 15:20:36 -070029#include <linux/crc32.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070030#include <linux/module.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070031#include <linux/types.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070032#include "crc32defs.h"
Bob Pearson60e58d52012-03-23 15:02:22 -070033
Bob Pearson9a1dbf62012-03-23 15:02:23 -070034#if CRC_LE_BITS > 8
Bob Pearsonce4320d2012-03-23 15:02:23 -070035# define tole(x) ((__force u32) __constant_cpu_to_le32(x))
Linus Torvalds1da177e2005-04-16 15:20:36 -070036#else
Joakim Tjernlund4f2a94632010-03-05 13:43:55 -080037# define tole(x) (x)
38#endif
39
Bob Pearson9a1dbf62012-03-23 15:02:23 -070040#if CRC_BE_BITS > 8
Bob Pearsonce4320d2012-03-23 15:02:23 -070041# define tobe(x) ((__force u32) __constant_cpu_to_be32(x))
Joakim Tjernlund4f2a94632010-03-05 13:43:55 -080042#else
43# define tobe(x) (x)
Linus Torvalds1da177e2005-04-16 15:20:36 -070044#endif
Bob Pearson60e58d52012-03-23 15:02:22 -070045
Linus Torvalds1da177e2005-04-16 15:20:36 -070046#include "crc32table.h"
47
48MODULE_AUTHOR("Matt Domsch <Matt_Domsch@dell.com>");
Darrick J. Wong46c58012012-03-23 15:02:25 -070049MODULE_DESCRIPTION("Various CRC32 calculations");
Linus Torvalds1da177e2005-04-16 15:20:36 -070050MODULE_LICENSE("GPL");
51
Bob Pearson9a1dbf62012-03-23 15:02:23 -070052#if CRC_LE_BITS > 8 || CRC_BE_BITS > 8
Joakim Tjernlundddcaccb2009-12-14 18:01:33 -080053
Bob Pearson324eb0f2012-03-23 15:02:24 -070054/* implements slicing-by-4 or slicing-by-8 algorithm */
Joakim Tjernlundddcaccb2009-12-14 18:01:33 -080055static inline u32
Joakim Tjernlund836e2af2010-05-24 14:33:31 -070056crc32_body(u32 crc, unsigned char const *buf, size_t len, const u32 (*tab)[256])
Joakim Tjernlundddcaccb2009-12-14 18:01:33 -080057{
Andrew Morton0d2daf52010-05-25 23:43:03 -070058# ifdef __LITTLE_ENDIAN
Joakim Tjernlund57423322012-01-10 15:10:18 -080059# define DO_CRC(x) crc = t0[(crc ^ (x)) & 255] ^ (crc >> 8)
Bob Pearson324eb0f2012-03-23 15:02:24 -070060# define DO_CRC4 (t3[(q) & 255] ^ t2[(q >> 8) & 255] ^ \
61 t1[(q >> 16) & 255] ^ t0[(q >> 24) & 255])
62# define DO_CRC8 (t7[(q) & 255] ^ t6[(q >> 8) & 255] ^ \
63 t5[(q >> 16) & 255] ^ t4[(q >> 24) & 255])
Joakim Tjernlundddcaccb2009-12-14 18:01:33 -080064# else
Joakim Tjernlund57423322012-01-10 15:10:18 -080065# define DO_CRC(x) crc = t0[((crc >> 24) ^ (x)) & 255] ^ (crc << 8)
Bob Pearson324eb0f2012-03-23 15:02:24 -070066# define DO_CRC4 (t0[(q) & 255] ^ t1[(q >> 8) & 255] ^ \
67 t2[(q >> 16) & 255] ^ t3[(q >> 24) & 255])
68# define DO_CRC8 (t4[(q) & 255] ^ t5[(q >> 8) & 255] ^ \
69 t6[(q >> 16) & 255] ^ t7[(q >> 24) & 255])
Joakim Tjernlundddcaccb2009-12-14 18:01:33 -080070# endif
Joakim Tjernlund4f2a94632010-03-05 13:43:55 -080071 const u32 *b;
Joakim Tjernlundddcaccb2009-12-14 18:01:33 -080072 size_t rem_len;
Bob Pearson0292c492012-03-23 15:02:24 -070073# ifdef CONFIG_X86
74 size_t i;
75# endif
Joakim Tjernlund57423322012-01-10 15:10:18 -080076 const u32 *t0=tab[0], *t1=tab[1], *t2=tab[2], *t3=tab[3];
Thiago Rafael Becker49ac5722012-07-30 14:41:26 -070077# if CRC_LE_BITS != 32
Bob Pearson324eb0f2012-03-23 15:02:24 -070078 const u32 *t4 = tab[4], *t5 = tab[5], *t6 = tab[6], *t7 = tab[7];
Thiago Rafael Becker49ac5722012-07-30 14:41:26 -070079# endif
Bob Pearson324eb0f2012-03-23 15:02:24 -070080 u32 q;
Joakim Tjernlundddcaccb2009-12-14 18:01:33 -080081
82 /* Align it */
Joakim Tjernlund4f2a94632010-03-05 13:43:55 -080083 if (unlikely((long)buf & 3 && len)) {
Joakim Tjernlundddcaccb2009-12-14 18:01:33 -080084 do {
Joakim Tjernlund4f2a94632010-03-05 13:43:55 -080085 DO_CRC(*buf++);
86 } while ((--len) && ((long)buf)&3);
Joakim Tjernlundddcaccb2009-12-14 18:01:33 -080087 }
Bob Pearson324eb0f2012-03-23 15:02:24 -070088
89# if CRC_LE_BITS == 32
Joakim Tjernlundddcaccb2009-12-14 18:01:33 -080090 rem_len = len & 3;
Joakim Tjernlundddcaccb2009-12-14 18:01:33 -080091 len = len >> 2;
Bob Pearson324eb0f2012-03-23 15:02:24 -070092# else
93 rem_len = len & 7;
94 len = len >> 3;
95# endif
96
Joakim Tjernlund4f2a94632010-03-05 13:43:55 -080097 b = (const u32 *)buf;
Bob Pearson0292c492012-03-23 15:02:24 -070098# ifdef CONFIG_X86
99 --b;
100 for (i = 0; i < len; i++) {
101# else
Joakim Tjernlundddcaccb2009-12-14 18:01:33 -0800102 for (--b; len; --len) {
Bob Pearson0292c492012-03-23 15:02:24 -0700103# endif
Bob Pearson324eb0f2012-03-23 15:02:24 -0700104 q = crc ^ *++b; /* use pre increment for speed */
105# if CRC_LE_BITS == 32
106 crc = DO_CRC4;
107# else
108 crc = DO_CRC8;
109 q = *++b;
110 crc ^= DO_CRC4;
111# endif
Joakim Tjernlundddcaccb2009-12-14 18:01:33 -0800112 }
113 len = rem_len;
114 /* And the last few bytes */
115 if (len) {
116 u8 *p = (u8 *)(b + 1) - 1;
Bob Pearson0292c492012-03-23 15:02:24 -0700117# ifdef CONFIG_X86
118 for (i = 0; i < len; i++)
119 DO_CRC(*++p); /* use pre increment for speed */
120# else
Joakim Tjernlundddcaccb2009-12-14 18:01:33 -0800121 do {
122 DO_CRC(*++p); /* use pre increment for speed */
123 } while (--len);
Bob Pearson0292c492012-03-23 15:02:24 -0700124# endif
Joakim Tjernlundddcaccb2009-12-14 18:01:33 -0800125 }
126 return crc;
Joakim Tjernlund4f2a94632010-03-05 13:43:55 -0800127#undef DO_CRC
Joakim Tjernlund836e2af2010-05-24 14:33:31 -0700128#undef DO_CRC4
Bob Pearson324eb0f2012-03-23 15:02:24 -0700129#undef DO_CRC8
Joakim Tjernlundddcaccb2009-12-14 18:01:33 -0800130}
131#endif
Bob Pearson60e58d52012-03-23 15:02:22 -0700132
Randy Dunlap2f721002006-06-25 05:48:59 -0700133/**
134 * crc32_le() - Calculate bitwise little-endian Ethernet AUTODIN II CRC32
135 * @crc: seed value for computation. ~0 for Ethernet, sometimes 0 for
136 * other uses, or the previous crc32 value if computing incrementally.
137 * @p: pointer to buffer over which CRC is run
138 * @len: length of buffer @p
139 */
Darrick J. Wong46c58012012-03-23 15:02:25 -0700140static inline u32 __pure crc32_le_generic(u32 crc, unsigned char const *p,
141 size_t len, const u32 (*tab)[256],
142 u32 polynomial)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700143{
Bob Pearson60e58d52012-03-23 15:02:22 -0700144#if CRC_LE_BITS == 1
Linus Torvalds1da177e2005-04-16 15:20:36 -0700145 int i;
146 while (len--) {
147 crc ^= *p++;
148 for (i = 0; i < 8; i++)
Darrick J. Wong46c58012012-03-23 15:02:25 -0700149 crc = (crc >> 1) ^ ((crc & 1) ? polynomial : 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700150 }
Bob Pearson60e58d52012-03-23 15:02:22 -0700151# elif CRC_LE_BITS == 2
152 while (len--) {
153 crc ^= *p++;
Darrick J. Wong46c58012012-03-23 15:02:25 -0700154 crc = (crc >> 2) ^ tab[0][crc & 3];
155 crc = (crc >> 2) ^ tab[0][crc & 3];
156 crc = (crc >> 2) ^ tab[0][crc & 3];
157 crc = (crc >> 2) ^ tab[0][crc & 3];
Bob Pearson60e58d52012-03-23 15:02:22 -0700158 }
159# elif CRC_LE_BITS == 4
160 while (len--) {
161 crc ^= *p++;
Darrick J. Wong46c58012012-03-23 15:02:25 -0700162 crc = (crc >> 4) ^ tab[0][crc & 15];
163 crc = (crc >> 4) ^ tab[0][crc & 15];
Bob Pearson60e58d52012-03-23 15:02:22 -0700164 }
165# elif CRC_LE_BITS == 8
Bob Pearson9a1dbf62012-03-23 15:02:23 -0700166 /* aka Sarwate algorithm */
167 while (len--) {
168 crc ^= *p++;
Darrick J. Wong46c58012012-03-23 15:02:25 -0700169 crc = (crc >> 8) ^ tab[0][crc & 255];
Bob Pearson9a1dbf62012-03-23 15:02:23 -0700170 }
171# else
Bob Pearsonce4320d2012-03-23 15:02:23 -0700172 crc = (__force u32) __cpu_to_le32(crc);
Joakim Tjernlundddcaccb2009-12-14 18:01:33 -0800173 crc = crc32_body(crc, p, len, tab);
Bob Pearsonce4320d2012-03-23 15:02:23 -0700174 crc = __le32_to_cpu((__force __le32)crc);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700175#endif
Bob Pearson60e58d52012-03-23 15:02:22 -0700176 return crc;
177}
Darrick J. Wong46c58012012-03-23 15:02:25 -0700178
179#if CRC_LE_BITS == 1
180u32 __pure crc32_le(u32 crc, unsigned char const *p, size_t len)
181{
182 return crc32_le_generic(crc, p, len, NULL, CRCPOLY_LE);
183}
184u32 __pure __crc32c_le(u32 crc, unsigned char const *p, size_t len)
185{
186 return crc32_le_generic(crc, p, len, NULL, CRC32C_POLY_LE);
187}
188#else
189u32 __pure crc32_le(u32 crc, unsigned char const *p, size_t len)
190{
Joe Mario8f243af2012-10-04 17:12:15 -0700191 return crc32_le_generic(crc, p, len,
192 (const u32 (*)[256])crc32table_le, CRCPOLY_LE);
Darrick J. Wong46c58012012-03-23 15:02:25 -0700193}
194u32 __pure __crc32c_le(u32 crc, unsigned char const *p, size_t len)
195{
Joe Mario8f243af2012-10-04 17:12:15 -0700196 return crc32_le_generic(crc, p, len,
197 (const u32 (*)[256])crc32ctable_le, CRC32C_POLY_LE);
Darrick J. Wong46c58012012-03-23 15:02:25 -0700198}
199#endif
Bob Pearson60e58d52012-03-23 15:02:22 -0700200EXPORT_SYMBOL(crc32_le);
Darrick J. Wong46c58012012-03-23 15:02:25 -0700201EXPORT_SYMBOL(__crc32c_le);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700202
Randy Dunlap2f721002006-06-25 05:48:59 -0700203/**
204 * crc32_be() - Calculate bitwise big-endian Ethernet AUTODIN II CRC32
205 * @crc: seed value for computation. ~0 for Ethernet, sometimes 0 for
206 * other uses, or the previous crc32 value if computing incrementally.
207 * @p: pointer to buffer over which CRC is run
208 * @len: length of buffer @p
209 */
Darrick J. Wong46c58012012-03-23 15:02:25 -0700210static inline u32 __pure crc32_be_generic(u32 crc, unsigned char const *p,
211 size_t len, const u32 (*tab)[256],
212 u32 polynomial)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700213{
Bob Pearson60e58d52012-03-23 15:02:22 -0700214#if CRC_BE_BITS == 1
Linus Torvalds1da177e2005-04-16 15:20:36 -0700215 int i;
216 while (len--) {
217 crc ^= *p++ << 24;
218 for (i = 0; i < 8; i++)
219 crc =
Darrick J. Wong46c58012012-03-23 15:02:25 -0700220 (crc << 1) ^ ((crc & 0x80000000) ? polynomial :
Linus Torvalds1da177e2005-04-16 15:20:36 -0700221 0);
222 }
Bob Pearson60e58d52012-03-23 15:02:22 -0700223# elif CRC_BE_BITS == 2
224 while (len--) {
225 crc ^= *p++ << 24;
Darrick J. Wong46c58012012-03-23 15:02:25 -0700226 crc = (crc << 2) ^ tab[0][crc >> 30];
227 crc = (crc << 2) ^ tab[0][crc >> 30];
228 crc = (crc << 2) ^ tab[0][crc >> 30];
229 crc = (crc << 2) ^ tab[0][crc >> 30];
Bob Pearson60e58d52012-03-23 15:02:22 -0700230 }
231# elif CRC_BE_BITS == 4
232 while (len--) {
233 crc ^= *p++ << 24;
Darrick J. Wong46c58012012-03-23 15:02:25 -0700234 crc = (crc << 4) ^ tab[0][crc >> 28];
235 crc = (crc << 4) ^ tab[0][crc >> 28];
Bob Pearson60e58d52012-03-23 15:02:22 -0700236 }
237# elif CRC_BE_BITS == 8
Bob Pearson9a1dbf62012-03-23 15:02:23 -0700238 while (len--) {
239 crc ^= *p++ << 24;
Darrick J. Wong46c58012012-03-23 15:02:25 -0700240 crc = (crc << 8) ^ tab[0][crc >> 24];
Bob Pearson9a1dbf62012-03-23 15:02:23 -0700241 }
242# else
Bob Pearsonce4320d2012-03-23 15:02:23 -0700243 crc = (__force u32) __cpu_to_be32(crc);
Joakim Tjernlundddcaccb2009-12-14 18:01:33 -0800244 crc = crc32_body(crc, p, len, tab);
Bob Pearsonce4320d2012-03-23 15:02:23 -0700245 crc = __be32_to_cpu((__force __be32)crc);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700246# endif
Bob Pearson60e58d52012-03-23 15:02:22 -0700247 return crc;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700248}
Darrick J. Wong46c58012012-03-23 15:02:25 -0700249
250#if CRC_LE_BITS == 1
251u32 __pure crc32_be(u32 crc, unsigned char const *p, size_t len)
252{
253 return crc32_be_generic(crc, p, len, NULL, CRCPOLY_BE);
254}
255#else
256u32 __pure crc32_be(u32 crc, unsigned char const *p, size_t len)
257{
Joe Mario8f243af2012-10-04 17:12:15 -0700258 return crc32_be_generic(crc, p, len,
259 (const u32 (*)[256])crc32table_be, CRCPOLY_BE);
Darrick J. Wong46c58012012-03-23 15:02:25 -0700260}
261#endif
Linus Torvalds1da177e2005-04-16 15:20:36 -0700262EXPORT_SYMBOL(crc32_be);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700263
Bob Pearson3863ef32012-03-23 15:02:22 -0700264#ifdef CONFIG_CRC32_SELFTEST
Linus Torvalds1da177e2005-04-16 15:20:36 -0700265
Bob Pearson3863ef32012-03-23 15:02:22 -0700266/* 4096 random bytes */
267static u8 __attribute__((__aligned__(8))) test_buf[] =
Linus Torvalds1da177e2005-04-16 15:20:36 -0700268{
Bob Pearson3863ef32012-03-23 15:02:22 -0700269 0x5b, 0x85, 0x21, 0xcb, 0x09, 0x68, 0x7d, 0x30,
270 0xc7, 0x69, 0xd7, 0x30, 0x92, 0xde, 0x59, 0xe4,
271 0xc9, 0x6e, 0x8b, 0xdb, 0x98, 0x6b, 0xaa, 0x60,
272 0xa8, 0xb5, 0xbc, 0x6c, 0xa9, 0xb1, 0x5b, 0x2c,
273 0xea, 0xb4, 0x92, 0x6a, 0x3f, 0x79, 0x91, 0xe4,
274 0xe9, 0x70, 0x51, 0x8c, 0x7f, 0x95, 0x6f, 0x1a,
275 0x56, 0xa1, 0x5c, 0x27, 0x03, 0x67, 0x9f, 0x3a,
276 0xe2, 0x31, 0x11, 0x29, 0x6b, 0x98, 0xfc, 0xc4,
277 0x53, 0x24, 0xc5, 0x8b, 0xce, 0x47, 0xb2, 0xb9,
278 0x32, 0xcb, 0xc1, 0xd0, 0x03, 0x57, 0x4e, 0xd4,
279 0xe9, 0x3c, 0xa1, 0x63, 0xcf, 0x12, 0x0e, 0xca,
280 0xe1, 0x13, 0xd1, 0x93, 0xa6, 0x88, 0x5c, 0x61,
281 0x5b, 0xbb, 0xf0, 0x19, 0x46, 0xb4, 0xcf, 0x9e,
282 0xb6, 0x6b, 0x4c, 0x3a, 0xcf, 0x60, 0xf9, 0x7a,
283 0x8d, 0x07, 0x63, 0xdb, 0x40, 0xe9, 0x0b, 0x6f,
284 0xad, 0x97, 0xf1, 0xed, 0xd0, 0x1e, 0x26, 0xfd,
285 0xbf, 0xb7, 0xc8, 0x04, 0x94, 0xf8, 0x8b, 0x8c,
286 0xf1, 0xab, 0x7a, 0xd4, 0xdd, 0xf3, 0xe8, 0x88,
287 0xc3, 0xed, 0x17, 0x8a, 0x9b, 0x40, 0x0d, 0x53,
288 0x62, 0x12, 0x03, 0x5f, 0x1b, 0x35, 0x32, 0x1f,
289 0xb4, 0x7b, 0x93, 0x78, 0x0d, 0xdb, 0xce, 0xa4,
290 0xc0, 0x47, 0xd5, 0xbf, 0x68, 0xe8, 0x5d, 0x74,
291 0x8f, 0x8e, 0x75, 0x1c, 0xb2, 0x4f, 0x9a, 0x60,
292 0xd1, 0xbe, 0x10, 0xf4, 0x5c, 0xa1, 0x53, 0x09,
293 0xa5, 0xe0, 0x09, 0x54, 0x85, 0x5c, 0xdc, 0x07,
294 0xe7, 0x21, 0x69, 0x7b, 0x8a, 0xfd, 0x90, 0xf1,
295 0x22, 0xd0, 0xb4, 0x36, 0x28, 0xe6, 0xb8, 0x0f,
296 0x39, 0xde, 0xc8, 0xf3, 0x86, 0x60, 0x34, 0xd2,
297 0x5e, 0xdf, 0xfd, 0xcf, 0x0f, 0xa9, 0x65, 0xf0,
298 0xd5, 0x4d, 0x96, 0x40, 0xe3, 0xdf, 0x3f, 0x95,
299 0x5a, 0x39, 0x19, 0x93, 0xf4, 0x75, 0xce, 0x22,
300 0x00, 0x1c, 0x93, 0xe2, 0x03, 0x66, 0xf4, 0x93,
301 0x73, 0x86, 0x81, 0x8e, 0x29, 0x44, 0x48, 0x86,
302 0x61, 0x7c, 0x48, 0xa3, 0x43, 0xd2, 0x9c, 0x8d,
303 0xd4, 0x95, 0xdd, 0xe1, 0x22, 0x89, 0x3a, 0x40,
304 0x4c, 0x1b, 0x8a, 0x04, 0xa8, 0x09, 0x69, 0x8b,
305 0xea, 0xc6, 0x55, 0x8e, 0x57, 0xe6, 0x64, 0x35,
306 0xf0, 0xc7, 0x16, 0x9f, 0x5d, 0x5e, 0x86, 0x40,
307 0x46, 0xbb, 0xe5, 0x45, 0x88, 0xfe, 0xc9, 0x63,
308 0x15, 0xfb, 0xf5, 0xbd, 0x71, 0x61, 0xeb, 0x7b,
309 0x78, 0x70, 0x07, 0x31, 0x03, 0x9f, 0xb2, 0xc8,
310 0xa7, 0xab, 0x47, 0xfd, 0xdf, 0xa0, 0x78, 0x72,
311 0xa4, 0x2a, 0xe4, 0xb6, 0xba, 0xc0, 0x1e, 0x86,
312 0x71, 0xe6, 0x3d, 0x18, 0x37, 0x70, 0xe6, 0xff,
313 0xe0, 0xbc, 0x0b, 0x22, 0xa0, 0x1f, 0xd3, 0xed,
314 0xa2, 0x55, 0x39, 0xab, 0xa8, 0x13, 0x73, 0x7c,
315 0x3f, 0xb2, 0xd6, 0x19, 0xac, 0xff, 0x99, 0xed,
316 0xe8, 0xe6, 0xa6, 0x22, 0xe3, 0x9c, 0xf1, 0x30,
317 0xdc, 0x01, 0x0a, 0x56, 0xfa, 0xe4, 0xc9, 0x99,
318 0xdd, 0xa8, 0xd8, 0xda, 0x35, 0x51, 0x73, 0xb4,
319 0x40, 0x86, 0x85, 0xdb, 0x5c, 0xd5, 0x85, 0x80,
320 0x14, 0x9c, 0xfd, 0x98, 0xa9, 0x82, 0xc5, 0x37,
321 0xff, 0x32, 0x5d, 0xd0, 0x0b, 0xfa, 0xdc, 0x04,
322 0x5e, 0x09, 0xd2, 0xca, 0x17, 0x4b, 0x1a, 0x8e,
323 0x15, 0xe1, 0xcc, 0x4e, 0x52, 0x88, 0x35, 0xbd,
324 0x48, 0xfe, 0x15, 0xa0, 0x91, 0xfd, 0x7e, 0x6c,
325 0x0e, 0x5d, 0x79, 0x1b, 0x81, 0x79, 0xd2, 0x09,
326 0x34, 0x70, 0x3d, 0x81, 0xec, 0xf6, 0x24, 0xbb,
327 0xfb, 0xf1, 0x7b, 0xdf, 0x54, 0xea, 0x80, 0x9b,
328 0xc7, 0x99, 0x9e, 0xbd, 0x16, 0x78, 0x12, 0x53,
329 0x5e, 0x01, 0xa7, 0x4e, 0xbd, 0x67, 0xe1, 0x9b,
330 0x4c, 0x0e, 0x61, 0x45, 0x97, 0xd2, 0xf0, 0x0f,
331 0xfe, 0x15, 0x08, 0xb7, 0x11, 0x4c, 0xe7, 0xff,
332 0x81, 0x53, 0xff, 0x91, 0x25, 0x38, 0x7e, 0x40,
333 0x94, 0xe5, 0xe0, 0xad, 0xe6, 0xd9, 0x79, 0xb6,
334 0x92, 0xc9, 0xfc, 0xde, 0xc3, 0x1a, 0x23, 0xbb,
335 0xdd, 0xc8, 0x51, 0x0c, 0x3a, 0x72, 0xfa, 0x73,
336 0x6f, 0xb7, 0xee, 0x61, 0x39, 0x03, 0x01, 0x3f,
337 0x7f, 0x94, 0x2e, 0x2e, 0xba, 0x3a, 0xbb, 0xb4,
338 0xfa, 0x6a, 0x17, 0xfe, 0xea, 0xef, 0x5e, 0x66,
339 0x97, 0x3f, 0x32, 0x3d, 0xd7, 0x3e, 0xb1, 0xf1,
340 0x6c, 0x14, 0x4c, 0xfd, 0x37, 0xd3, 0x38, 0x80,
341 0xfb, 0xde, 0xa6, 0x24, 0x1e, 0xc8, 0xca, 0x7f,
342 0x3a, 0x93, 0xd8, 0x8b, 0x18, 0x13, 0xb2, 0xe5,
343 0xe4, 0x93, 0x05, 0x53, 0x4f, 0x84, 0x66, 0xa7,
344 0x58, 0x5c, 0x7b, 0x86, 0x52, 0x6d, 0x0d, 0xce,
345 0xa4, 0x30, 0x7d, 0xb6, 0x18, 0x9f, 0xeb, 0xff,
346 0x22, 0xbb, 0x72, 0x29, 0xb9, 0x44, 0x0b, 0x48,
347 0x1e, 0x84, 0x71, 0x81, 0xe3, 0x6d, 0x73, 0x26,
348 0x92, 0xb4, 0x4d, 0x2a, 0x29, 0xb8, 0x1f, 0x72,
349 0xed, 0xd0, 0xe1, 0x64, 0x77, 0xea, 0x8e, 0x88,
350 0x0f, 0xef, 0x3f, 0xb1, 0x3b, 0xad, 0xf9, 0xc9,
351 0x8b, 0xd0, 0xac, 0xc6, 0xcc, 0xa9, 0x40, 0xcc,
352 0x76, 0xf6, 0x3b, 0x53, 0xb5, 0x88, 0xcb, 0xc8,
353 0x37, 0xf1, 0xa2, 0xba, 0x23, 0x15, 0x99, 0x09,
354 0xcc, 0xe7, 0x7a, 0x3b, 0x37, 0xf7, 0x58, 0xc8,
355 0x46, 0x8c, 0x2b, 0x2f, 0x4e, 0x0e, 0xa6, 0x5c,
356 0xea, 0x85, 0x55, 0xba, 0x02, 0x0e, 0x0e, 0x48,
357 0xbc, 0xe1, 0xb1, 0x01, 0x35, 0x79, 0x13, 0x3d,
358 0x1b, 0xc0, 0x53, 0x68, 0x11, 0xe7, 0x95, 0x0f,
359 0x9d, 0x3f, 0x4c, 0x47, 0x7b, 0x4d, 0x1c, 0xae,
360 0x50, 0x9b, 0xcb, 0xdd, 0x05, 0x8d, 0x9a, 0x97,
361 0xfd, 0x8c, 0xef, 0x0c, 0x1d, 0x67, 0x73, 0xa8,
362 0x28, 0x36, 0xd5, 0xb6, 0x92, 0x33, 0x40, 0x75,
363 0x0b, 0x51, 0xc3, 0x64, 0xba, 0x1d, 0xc2, 0xcc,
364 0xee, 0x7d, 0x54, 0x0f, 0x27, 0x69, 0xa7, 0x27,
365 0x63, 0x30, 0x29, 0xd9, 0xc8, 0x84, 0xd8, 0xdf,
366 0x9f, 0x68, 0x8d, 0x04, 0xca, 0xa6, 0xc5, 0xc7,
367 0x7a, 0x5c, 0xc8, 0xd1, 0xcb, 0x4a, 0xec, 0xd0,
368 0xd8, 0x20, 0x69, 0xc5, 0x17, 0xcd, 0x78, 0xc8,
369 0x75, 0x23, 0x30, 0x69, 0xc9, 0xd4, 0xea, 0x5c,
370 0x4f, 0x6b, 0x86, 0x3f, 0x8b, 0xfe, 0xee, 0x44,
371 0xc9, 0x7c, 0xb7, 0xdd, 0x3e, 0xe5, 0xec, 0x54,
372 0x03, 0x3e, 0xaa, 0x82, 0xc6, 0xdf, 0xb2, 0x38,
373 0x0e, 0x5d, 0xb3, 0x88, 0xd9, 0xd3, 0x69, 0x5f,
374 0x8f, 0x70, 0x8a, 0x7e, 0x11, 0xd9, 0x1e, 0x7b,
375 0x38, 0xf1, 0x42, 0x1a, 0xc0, 0x35, 0xf5, 0xc7,
376 0x36, 0x85, 0xf5, 0xf7, 0xb8, 0x7e, 0xc7, 0xef,
377 0x18, 0xf1, 0x63, 0xd6, 0x7a, 0xc6, 0xc9, 0x0e,
378 0x4d, 0x69, 0x4f, 0x84, 0xef, 0x26, 0x41, 0x0c,
379 0xec, 0xc7, 0xe0, 0x7e, 0x3c, 0x67, 0x01, 0x4c,
380 0x62, 0x1a, 0x20, 0x6f, 0xee, 0x47, 0x4d, 0xc0,
381 0x99, 0x13, 0x8d, 0x91, 0x4a, 0x26, 0xd4, 0x37,
382 0x28, 0x90, 0x58, 0x75, 0x66, 0x2b, 0x0a, 0xdf,
383 0xda, 0xee, 0x92, 0x25, 0x90, 0x62, 0x39, 0x9e,
384 0x44, 0x98, 0xad, 0xc1, 0x88, 0xed, 0xe4, 0xb4,
385 0xaf, 0xf5, 0x8c, 0x9b, 0x48, 0x4d, 0x56, 0x60,
386 0x97, 0x0f, 0x61, 0x59, 0x9e, 0xa6, 0x27, 0xfe,
387 0xc1, 0x91, 0x15, 0x38, 0xb8, 0x0f, 0xae, 0x61,
388 0x7d, 0x26, 0x13, 0x5a, 0x73, 0xff, 0x1c, 0xa3,
389 0x61, 0x04, 0x58, 0x48, 0x55, 0x44, 0x11, 0xfe,
390 0x15, 0xca, 0xc3, 0xbd, 0xca, 0xc5, 0xb4, 0x40,
391 0x5d, 0x1b, 0x7f, 0x39, 0xb5, 0x9c, 0x35, 0xec,
392 0x61, 0x15, 0x32, 0x32, 0xb8, 0x4e, 0x40, 0x9f,
393 0x17, 0x1f, 0x0a, 0x4d, 0xa9, 0x91, 0xef, 0xb7,
394 0xb0, 0xeb, 0xc2, 0x83, 0x9a, 0x6c, 0xd2, 0x79,
395 0x43, 0x78, 0x5e, 0x2f, 0xe5, 0xdd, 0x1a, 0x3c,
396 0x45, 0xab, 0x29, 0x40, 0x3a, 0x37, 0x5b, 0x6f,
397 0xd7, 0xfc, 0x48, 0x64, 0x3c, 0x49, 0xfb, 0x21,
398 0xbe, 0xc3, 0xff, 0x07, 0xfb, 0x17, 0xe9, 0xc9,
399 0x0c, 0x4c, 0x5c, 0x15, 0x9e, 0x8e, 0x22, 0x30,
400 0x0a, 0xde, 0x48, 0x7f, 0xdb, 0x0d, 0xd1, 0x2b,
401 0x87, 0x38, 0x9e, 0xcc, 0x5a, 0x01, 0x16, 0xee,
402 0x75, 0x49, 0x0d, 0x30, 0x01, 0x34, 0x6a, 0xb6,
403 0x9a, 0x5a, 0x2a, 0xec, 0xbb, 0x48, 0xac, 0xd3,
404 0x77, 0x83, 0xd8, 0x08, 0x86, 0x4f, 0x48, 0x09,
405 0x29, 0x41, 0x79, 0xa1, 0x03, 0x12, 0xc4, 0xcd,
406 0x90, 0x55, 0x47, 0x66, 0x74, 0x9a, 0xcc, 0x4f,
407 0x35, 0x8c, 0xd6, 0x98, 0xef, 0xeb, 0x45, 0xb9,
408 0x9a, 0x26, 0x2f, 0x39, 0xa5, 0x70, 0x6d, 0xfc,
409 0xb4, 0x51, 0xee, 0xf4, 0x9c, 0xe7, 0x38, 0x59,
410 0xad, 0xf4, 0xbc, 0x46, 0xff, 0x46, 0x8e, 0x60,
411 0x9c, 0xa3, 0x60, 0x1d, 0xf8, 0x26, 0x72, 0xf5,
412 0x72, 0x9d, 0x68, 0x80, 0x04, 0xf6, 0x0b, 0xa1,
413 0x0a, 0xd5, 0xa7, 0x82, 0x3a, 0x3e, 0x47, 0xa8,
414 0x5a, 0xde, 0x59, 0x4f, 0x7b, 0x07, 0xb3, 0xe9,
415 0x24, 0x19, 0x3d, 0x34, 0x05, 0xec, 0xf1, 0xab,
416 0x6e, 0x64, 0x8f, 0xd3, 0xe6, 0x41, 0x86, 0x80,
417 0x70, 0xe3, 0x8d, 0x60, 0x9c, 0x34, 0x25, 0x01,
418 0x07, 0x4d, 0x19, 0x41, 0x4e, 0x3d, 0x5c, 0x7e,
419 0xa8, 0xf5, 0xcc, 0xd5, 0x7b, 0xe2, 0x7d, 0x3d,
420 0x49, 0x86, 0x7d, 0x07, 0xb7, 0x10, 0xe3, 0x35,
421 0xb8, 0x84, 0x6d, 0x76, 0xab, 0x17, 0xc6, 0x38,
422 0xb4, 0xd3, 0x28, 0x57, 0xad, 0xd3, 0x88, 0x5a,
423 0xda, 0xea, 0xc8, 0x94, 0xcc, 0x37, 0x19, 0xac,
424 0x9c, 0x9f, 0x4b, 0x00, 0x15, 0xc0, 0xc8, 0xca,
425 0x1f, 0x15, 0xaa, 0xe0, 0xdb, 0xf9, 0x2f, 0x57,
426 0x1b, 0x24, 0xc7, 0x6f, 0x76, 0x29, 0xfb, 0xed,
427 0x25, 0x0d, 0xc0, 0xfe, 0xbd, 0x5a, 0xbf, 0x20,
428 0x08, 0x51, 0x05, 0xec, 0x71, 0xa3, 0xbf, 0xef,
429 0x5e, 0x99, 0x75, 0xdb, 0x3c, 0x5f, 0x9a, 0x8c,
430 0xbb, 0x19, 0x5c, 0x0e, 0x93, 0x19, 0xf8, 0x6a,
431 0xbc, 0xf2, 0x12, 0x54, 0x2f, 0xcb, 0x28, 0x64,
432 0x88, 0xb3, 0x92, 0x0d, 0x96, 0xd1, 0xa6, 0xe4,
433 0x1f, 0xf1, 0x4d, 0xa4, 0xab, 0x1c, 0xee, 0x54,
434 0xf2, 0xad, 0x29, 0x6d, 0x32, 0x37, 0xb2, 0x16,
435 0x77, 0x5c, 0xdc, 0x2e, 0x54, 0xec, 0x75, 0x26,
436 0xc6, 0x36, 0xd9, 0x17, 0x2c, 0xf1, 0x7a, 0xdc,
437 0x4b, 0xf1, 0xe2, 0xd9, 0x95, 0xba, 0xac, 0x87,
438 0xc1, 0xf3, 0x8e, 0x58, 0x08, 0xd8, 0x87, 0x60,
439 0xc9, 0xee, 0x6a, 0xde, 0xa4, 0xd2, 0xfc, 0x0d,
440 0xe5, 0x36, 0xc4, 0x5c, 0x52, 0xb3, 0x07, 0x54,
441 0x65, 0x24, 0xc1, 0xb1, 0xd1, 0xb1, 0x53, 0x13,
442 0x31, 0x79, 0x7f, 0x05, 0x76, 0xeb, 0x37, 0x59,
443 0x15, 0x2b, 0xd1, 0x3f, 0xac, 0x08, 0x97, 0xeb,
444 0x91, 0x98, 0xdf, 0x6c, 0x09, 0x0d, 0x04, 0x9f,
445 0xdc, 0x3b, 0x0e, 0x60, 0x68, 0x47, 0x23, 0x15,
446 0x16, 0xc6, 0x0b, 0x35, 0xf8, 0x77, 0xa2, 0x78,
447 0x50, 0xd4, 0x64, 0x22, 0x33, 0xff, 0xfb, 0x93,
448 0x71, 0x46, 0x50, 0x39, 0x1b, 0x9c, 0xea, 0x4e,
449 0x8d, 0x0c, 0x37, 0xe5, 0x5c, 0x51, 0x3a, 0x31,
450 0xb2, 0x85, 0x84, 0x3f, 0x41, 0xee, 0xa2, 0xc1,
451 0xc6, 0x13, 0x3b, 0x54, 0x28, 0xd2, 0x18, 0x37,
452 0xcc, 0x46, 0x9f, 0x6a, 0x91, 0x3d, 0x5a, 0x15,
453 0x3c, 0x89, 0xa3, 0x61, 0x06, 0x7d, 0x2e, 0x78,
454 0xbe, 0x7d, 0x40, 0xba, 0x2f, 0x95, 0xb1, 0x2f,
455 0x87, 0x3b, 0x8a, 0xbe, 0x6a, 0xf4, 0xc2, 0x31,
456 0x74, 0xee, 0x91, 0xe0, 0x23, 0xaa, 0x5d, 0x7f,
457 0xdd, 0xf0, 0x44, 0x8c, 0x0b, 0x59, 0x2b, 0xfc,
458 0x48, 0x3a, 0xdf, 0x07, 0x05, 0x38, 0x6c, 0xc9,
459 0xeb, 0x18, 0x24, 0x68, 0x8d, 0x58, 0x98, 0xd3,
460 0x31, 0xa3, 0xe4, 0x70, 0x59, 0xb1, 0x21, 0xbe,
461 0x7e, 0x65, 0x7d, 0xb8, 0x04, 0xab, 0xf6, 0xe4,
462 0xd7, 0xda, 0xec, 0x09, 0x8f, 0xda, 0x6d, 0x24,
463 0x07, 0xcc, 0x29, 0x17, 0x05, 0x78, 0x1a, 0xc1,
464 0xb1, 0xce, 0xfc, 0xaa, 0x2d, 0xe7, 0xcc, 0x85,
465 0x84, 0x84, 0x03, 0x2a, 0x0c, 0x3f, 0xa9, 0xf8,
466 0xfd, 0x84, 0x53, 0x59, 0x5c, 0xf0, 0xd4, 0x09,
467 0xf0, 0xd2, 0x6c, 0x32, 0x03, 0xb0, 0xa0, 0x8c,
468 0x52, 0xeb, 0x23, 0x91, 0x88, 0x43, 0x13, 0x46,
469 0xf6, 0x1e, 0xb4, 0x1b, 0xf5, 0x8e, 0x3a, 0xb5,
470 0x3d, 0x00, 0xf6, 0xe5, 0x08, 0x3d, 0x5f, 0x39,
471 0xd3, 0x21, 0x69, 0xbc, 0x03, 0x22, 0x3a, 0xd2,
472 0x5c, 0x84, 0xf8, 0x15, 0xc4, 0x80, 0x0b, 0xbc,
473 0x29, 0x3c, 0xf3, 0x95, 0x98, 0xcd, 0x8f, 0x35,
474 0xbc, 0xa5, 0x3e, 0xfc, 0xd4, 0x13, 0x9e, 0xde,
475 0x4f, 0xce, 0x71, 0x9d, 0x09, 0xad, 0xf2, 0x80,
476 0x6b, 0x65, 0x7f, 0x03, 0x00, 0x14, 0x7c, 0x15,
477 0x85, 0x40, 0x6d, 0x70, 0xea, 0xdc, 0xb3, 0x63,
478 0x35, 0x4f, 0x4d, 0xe0, 0xd9, 0xd5, 0x3c, 0x58,
479 0x56, 0x23, 0x80, 0xe2, 0x36, 0xdd, 0x75, 0x1d,
480 0x94, 0x11, 0x41, 0x8e, 0xe0, 0x81, 0x8e, 0xcf,
481 0xe0, 0xe5, 0xf6, 0xde, 0xd1, 0xe7, 0x04, 0x12,
482 0x79, 0x92, 0x2b, 0x71, 0x2a, 0x79, 0x8b, 0x7c,
483 0x44, 0x79, 0x16, 0x30, 0x4e, 0xf4, 0xf6, 0x9b,
484 0xb7, 0x40, 0xa3, 0x5a, 0xa7, 0x69, 0x3e, 0xc1,
485 0x3a, 0x04, 0xd0, 0x88, 0xa0, 0x3b, 0xdd, 0xc6,
486 0x9e, 0x7e, 0x1e, 0x1e, 0x8f, 0x44, 0xf7, 0x73,
487 0x67, 0x1e, 0x1a, 0x78, 0xfa, 0x62, 0xf4, 0xa9,
488 0xa8, 0xc6, 0x5b, 0xb8, 0xfa, 0x06, 0x7d, 0x5e,
489 0x38, 0x1c, 0x9a, 0x39, 0xe9, 0x39, 0x98, 0x22,
490 0x0b, 0xa7, 0xac, 0x0b, 0xf3, 0xbc, 0xf1, 0xeb,
491 0x8c, 0x81, 0xe3, 0x48, 0x8a, 0xed, 0x42, 0xc2,
492 0x38, 0xcf, 0x3e, 0xda, 0xd2, 0x89, 0x8d, 0x9c,
493 0x53, 0xb5, 0x2f, 0x41, 0x01, 0x26, 0x84, 0x9c,
494 0xa3, 0x56, 0xf6, 0x49, 0xc7, 0xd4, 0x9f, 0x93,
495 0x1b, 0x96, 0x49, 0x5e, 0xad, 0xb3, 0x84, 0x1f,
496 0x3c, 0xa4, 0xe0, 0x9b, 0xd1, 0x90, 0xbc, 0x38,
497 0x6c, 0xdd, 0x95, 0x4d, 0x9d, 0xb1, 0x71, 0x57,
498 0x2d, 0x34, 0xe8, 0xb8, 0x42, 0xc7, 0x99, 0x03,
499 0xc7, 0x07, 0x30, 0x65, 0x91, 0x55, 0xd5, 0x90,
500 0x70, 0x97, 0x37, 0x68, 0xd4, 0x11, 0xf9, 0xe8,
501 0xce, 0xec, 0xdc, 0x34, 0xd5, 0xd3, 0xb7, 0xc4,
502 0xb8, 0x97, 0x05, 0x92, 0xad, 0xf8, 0xe2, 0x36,
503 0x64, 0x41, 0xc9, 0xc5, 0x41, 0x77, 0x52, 0xd7,
504 0x2c, 0xa5, 0x24, 0x2f, 0xd9, 0x34, 0x0b, 0x47,
505 0x35, 0xa7, 0x28, 0x8b, 0xc5, 0xcd, 0xe9, 0x46,
506 0xac, 0x39, 0x94, 0x3c, 0x10, 0xc6, 0x29, 0x73,
507 0x0e, 0x0e, 0x5d, 0xe0, 0x71, 0x03, 0x8a, 0x72,
508 0x0e, 0x26, 0xb0, 0x7d, 0x84, 0xed, 0x95, 0x23,
509 0x49, 0x5a, 0x45, 0x83, 0x45, 0x60, 0x11, 0x4a,
510 0x46, 0x31, 0xd4, 0xd8, 0x16, 0x54, 0x98, 0x58,
511 0xed, 0x6d, 0xcc, 0x5d, 0xd6, 0x50, 0x61, 0x9f,
512 0x9d, 0xc5, 0x3e, 0x9d, 0x32, 0x47, 0xde, 0x96,
513 0xe1, 0x5d, 0xd8, 0xf8, 0xb4, 0x69, 0x6f, 0xb9,
514 0x15, 0x90, 0x57, 0x7a, 0xf6, 0xad, 0xb0, 0x5b,
515 0xf5, 0xa6, 0x36, 0x94, 0xfd, 0x84, 0xce, 0x1c,
516 0x0f, 0x4b, 0xd0, 0xc2, 0x5b, 0x6b, 0x56, 0xef,
517 0x73, 0x93, 0x0b, 0xc3, 0xee, 0xd9, 0xcf, 0xd3,
518 0xa4, 0x22, 0x58, 0xcd, 0x50, 0x6e, 0x65, 0xf4,
519 0xe9, 0xb7, 0x71, 0xaf, 0x4b, 0xb3, 0xb6, 0x2f,
520 0x0f, 0x0e, 0x3b, 0xc9, 0x85, 0x14, 0xf5, 0x17,
521 0xe8, 0x7a, 0x3a, 0xbf, 0x5f, 0x5e, 0xf8, 0x18,
522 0x48, 0xa6, 0x72, 0xab, 0x06, 0x95, 0xe9, 0xc8,
523 0xa7, 0xf4, 0x32, 0x44, 0x04, 0x0c, 0x84, 0x98,
524 0x73, 0xe3, 0x89, 0x8d, 0x5f, 0x7e, 0x4a, 0x42,
525 0x8f, 0xc5, 0x28, 0xb1, 0x82, 0xef, 0x1c, 0x97,
526 0x31, 0x3b, 0x4d, 0xe0, 0x0e, 0x10, 0x10, 0x97,
527 0x93, 0x49, 0x78, 0x2f, 0x0d, 0x86, 0x8b, 0xa1,
528 0x53, 0xa9, 0x81, 0x20, 0x79, 0xe7, 0x07, 0x77,
529 0xb6, 0xac, 0x5e, 0xd2, 0x05, 0xcd, 0xe9, 0xdb,
530 0x8a, 0x94, 0x82, 0x8a, 0x23, 0xb9, 0x3d, 0x1c,
531 0xa9, 0x7d, 0x72, 0x4a, 0xed, 0x33, 0xa3, 0xdb,
532 0x21, 0xa7, 0x86, 0x33, 0x45, 0xa5, 0xaa, 0x56,
533 0x45, 0xb5, 0x83, 0x29, 0x40, 0x47, 0x79, 0x04,
534 0x6e, 0xb9, 0x95, 0xd0, 0x81, 0x77, 0x2d, 0x48,
535 0x1e, 0xfe, 0xc3, 0xc2, 0x1e, 0xe5, 0xf2, 0xbe,
536 0xfd, 0x3b, 0x94, 0x9f, 0xc4, 0xc4, 0x26, 0x9d,
537 0xe4, 0x66, 0x1e, 0x19, 0xee, 0x6c, 0x79, 0x97,
538 0x11, 0x31, 0x4b, 0x0d, 0x01, 0xcb, 0xde, 0xa8,
539 0xf6, 0x6d, 0x7c, 0x39, 0x46, 0x4e, 0x7e, 0x3f,
540 0x94, 0x17, 0xdf, 0xa1, 0x7d, 0xd9, 0x1c, 0x8e,
541 0xbc, 0x7d, 0x33, 0x7d, 0xe3, 0x12, 0x40, 0xca,
542 0xab, 0x37, 0x11, 0x46, 0xd4, 0xae, 0xef, 0x44,
543 0xa2, 0xb3, 0x6a, 0x66, 0x0e, 0x0c, 0x90, 0x7f,
544 0xdf, 0x5c, 0x66, 0x5f, 0xf2, 0x94, 0x9f, 0xa6,
545 0x73, 0x4f, 0xeb, 0x0d, 0xad, 0xbf, 0xc0, 0x63,
546 0x5c, 0xdc, 0x46, 0x51, 0xe8, 0x8e, 0x90, 0x19,
547 0xa8, 0xa4, 0x3c, 0x91, 0x79, 0xfa, 0x7e, 0x58,
548 0x85, 0x13, 0x55, 0xc5, 0x19, 0x82, 0x37, 0x1b,
549 0x0a, 0x02, 0x1f, 0x99, 0x6b, 0x18, 0xf1, 0x28,
550 0x08, 0xa2, 0x73, 0xb8, 0x0f, 0x2e, 0xcd, 0xbf,
551 0xf3, 0x86, 0x7f, 0xea, 0xef, 0xd0, 0xbb, 0xa6,
552 0x21, 0xdf, 0x49, 0x73, 0x51, 0xcc, 0x36, 0xd3,
553 0x3e, 0xa0, 0xf8, 0x44, 0xdf, 0xd3, 0xa6, 0xbe,
554 0x8a, 0xd4, 0x57, 0xdd, 0x72, 0x94, 0x61, 0x0f,
555 0x82, 0xd1, 0x07, 0xb8, 0x7c, 0x18, 0x83, 0xdf,
556 0x3a, 0xe5, 0x50, 0x6a, 0x82, 0x20, 0xac, 0xa9,
557 0xa8, 0xff, 0xd9, 0xf3, 0x77, 0x33, 0x5a, 0x9e,
558 0x7f, 0x6d, 0xfe, 0x5d, 0x33, 0x41, 0x42, 0xe7,
559 0x6c, 0x19, 0xe0, 0x44, 0x8a, 0x15, 0xf6, 0x70,
560 0x98, 0xb7, 0x68, 0x4d, 0xfa, 0x97, 0x39, 0xb0,
561 0x8e, 0xe8, 0x84, 0x8b, 0x75, 0x30, 0xb7, 0x7d,
562 0x92, 0x69, 0x20, 0x9c, 0x81, 0xfb, 0x4b, 0xf4,
563 0x01, 0x50, 0xeb, 0xce, 0x0c, 0x1c, 0x6c, 0xb5,
564 0x4a, 0xd7, 0x27, 0x0c, 0xce, 0xbb, 0xe5, 0x85,
565 0xf0, 0xb6, 0xee, 0xd5, 0x70, 0xdd, 0x3b, 0xfc,
566 0xd4, 0x99, 0xf1, 0x33, 0xdd, 0x8b, 0xc4, 0x2f,
567 0xae, 0xab, 0x74, 0x96, 0x32, 0xc7, 0x4c, 0x56,
568 0x3c, 0x89, 0x0f, 0x96, 0x0b, 0x42, 0xc0, 0xcb,
569 0xee, 0x0f, 0x0b, 0x8c, 0xfb, 0x7e, 0x47, 0x7b,
570 0x64, 0x48, 0xfd, 0xb2, 0x00, 0x80, 0x89, 0xa5,
571 0x13, 0x55, 0x62, 0xfc, 0x8f, 0xe2, 0x42, 0x03,
572 0xb7, 0x4e, 0x2a, 0x79, 0xb4, 0x82, 0xea, 0x23,
573 0x49, 0xda, 0xaf, 0x52, 0x63, 0x1e, 0x60, 0x03,
574 0x89, 0x06, 0x44, 0x46, 0x08, 0xc3, 0xc4, 0x87,
575 0x70, 0x2e, 0xda, 0x94, 0xad, 0x6b, 0xe0, 0xe4,
576 0xd1, 0x8a, 0x06, 0xc2, 0xa8, 0xc0, 0xa7, 0x43,
577 0x3c, 0x47, 0x52, 0x0e, 0xc3, 0x77, 0x81, 0x11,
578 0x67, 0x0e, 0xa0, 0x70, 0x04, 0x47, 0x29, 0x40,
579 0x86, 0x0d, 0x34, 0x56, 0xa7, 0xc9, 0x35, 0x59,
580 0x68, 0xdc, 0x93, 0x81, 0x70, 0xee, 0x86, 0xd9,
581 0x80, 0x06, 0x40, 0x4f, 0x1a, 0x0d, 0x40, 0x30,
582 0x0b, 0xcb, 0x96, 0x47, 0xc1, 0xb7, 0x52, 0xfd,
583 0x56, 0xe0, 0x72, 0x4b, 0xfb, 0xbd, 0x92, 0x45,
584 0x61, 0x71, 0xc2, 0x33, 0x11, 0xbf, 0x52, 0x83,
585 0x79, 0x26, 0xe0, 0x49, 0x6b, 0xb7, 0x05, 0x8b,
586 0xe8, 0x0e, 0x87, 0x31, 0xd7, 0x9d, 0x8a, 0xf5,
587 0xc0, 0x5f, 0x2e, 0x58, 0x4a, 0xdb, 0x11, 0xb3,
588 0x6c, 0x30, 0x2a, 0x46, 0x19, 0xe3, 0x27, 0x84,
589 0x1f, 0x63, 0x6e, 0xf6, 0x57, 0xc7, 0xc9, 0xd8,
590 0x5e, 0xba, 0xb3, 0x87, 0xd5, 0x83, 0x26, 0x34,
591 0x21, 0x9e, 0x65, 0xde, 0x42, 0xd3, 0xbe, 0x7b,
592 0xbc, 0x91, 0x71, 0x44, 0x4d, 0x99, 0x3b, 0x31,
593 0xe5, 0x3f, 0x11, 0x4e, 0x7f, 0x13, 0x51, 0x3b,
594 0xae, 0x79, 0xc9, 0xd3, 0x81, 0x8e, 0x25, 0x40,
595 0x10, 0xfc, 0x07, 0x1e, 0xf9, 0x7b, 0x9a, 0x4b,
596 0x6c, 0xe3, 0xb3, 0xad, 0x1a, 0x0a, 0xdd, 0x9e,
597 0x59, 0x0c, 0xa2, 0xcd, 0xae, 0x48, 0x4a, 0x38,
598 0x5b, 0x47, 0x41, 0x94, 0x65, 0x6b, 0xbb, 0xeb,
599 0x5b, 0xe3, 0xaf, 0x07, 0x5b, 0xd4, 0x4a, 0xa2,
600 0xc9, 0x5d, 0x2f, 0x64, 0x03, 0xd7, 0x3a, 0x2c,
601 0x6e, 0xce, 0x76, 0x95, 0xb4, 0xb3, 0xc0, 0xf1,
602 0xe2, 0x45, 0x73, 0x7a, 0x5c, 0xab, 0xc1, 0xfc,
603 0x02, 0x8d, 0x81, 0x29, 0xb3, 0xac, 0x07, 0xec,
604 0x40, 0x7d, 0x45, 0xd9, 0x7a, 0x59, 0xee, 0x34,
605 0xf0, 0xe9, 0xd5, 0x7b, 0x96, 0xb1, 0x3d, 0x95,
606 0xcc, 0x86, 0xb5, 0xb6, 0x04, 0x2d, 0xb5, 0x92,
607 0x7e, 0x76, 0xf4, 0x06, 0xa9, 0xa3, 0x12, 0x0f,
608 0xb1, 0xaf, 0x26, 0xba, 0x7c, 0xfc, 0x7e, 0x1c,
609 0xbc, 0x2c, 0x49, 0x97, 0x53, 0x60, 0x13, 0x0b,
610 0xa6, 0x61, 0x83, 0x89, 0x42, 0xd4, 0x17, 0x0c,
611 0x6c, 0x26, 0x52, 0xc3, 0xb3, 0xd4, 0x67, 0xf5,
612 0xe3, 0x04, 0xb7, 0xf4, 0xcb, 0x80, 0xb8, 0xcb,
613 0x77, 0x56, 0x3e, 0xaa, 0x57, 0x54, 0xee, 0xb4,
614 0x2c, 0x67, 0xcf, 0xf2, 0xdc, 0xbe, 0x55, 0xf9,
615 0x43, 0x1f, 0x6e, 0x22, 0x97, 0x67, 0x7f, 0xc4,
616 0xef, 0xb1, 0x26, 0x31, 0x1e, 0x27, 0xdf, 0x41,
617 0x80, 0x47, 0x6c, 0xe2, 0xfa, 0xa9, 0x8c, 0x2a,
618 0xf6, 0xf2, 0xab, 0xf0, 0x15, 0xda, 0x6c, 0xc8,
619 0xfe, 0xb5, 0x23, 0xde, 0xa9, 0x05, 0x3f, 0x06,
620 0x54, 0x4c, 0xcd, 0xe1, 0xab, 0xfc, 0x0e, 0x62,
621 0x33, 0x31, 0x73, 0x2c, 0x76, 0xcb, 0xb4, 0x47,
622 0x1e, 0x20, 0xad, 0xd8, 0xf2, 0x31, 0xdd, 0xc4,
623 0x8b, 0x0c, 0x77, 0xbe, 0xe1, 0x8b, 0x26, 0x00,
624 0x02, 0x58, 0xd6, 0x8d, 0xef, 0xad, 0x74, 0x67,
625 0xab, 0x3f, 0xef, 0xcb, 0x6f, 0xb0, 0xcc, 0x81,
626 0x44, 0x4c, 0xaf, 0xe9, 0x49, 0x4f, 0xdb, 0xa0,
627 0x25, 0xa4, 0xf0, 0x89, 0xf1, 0xbe, 0xd8, 0x10,
628 0xff, 0xb1, 0x3b, 0x4b, 0xfa, 0x98, 0xf5, 0x79,
629 0x6d, 0x1e, 0x69, 0x4d, 0x57, 0xb1, 0xc8, 0x19,
630 0x1b, 0xbd, 0x1e, 0x8c, 0x84, 0xb7, 0x7b, 0xe8,
631 0xd2, 0x2d, 0x09, 0x41, 0x41, 0x37, 0x3d, 0xb1,
632 0x6f, 0x26, 0x5d, 0x71, 0x16, 0x3d, 0xb7, 0x83,
633 0x27, 0x2c, 0xa7, 0xb6, 0x50, 0xbd, 0x91, 0x86,
634 0xab, 0x24, 0xa1, 0x38, 0xfd, 0xea, 0x71, 0x55,
635 0x7e, 0x9a, 0x07, 0x77, 0x4b, 0xfa, 0x61, 0x66,
636 0x20, 0x1e, 0x28, 0x95, 0x18, 0x1b, 0xa4, 0xa0,
637 0xfd, 0xc0, 0x89, 0x72, 0x43, 0xd9, 0x3b, 0x49,
638 0x5a, 0x3f, 0x9d, 0xbf, 0xdb, 0xb4, 0x46, 0xea,
639 0x42, 0x01, 0x77, 0x23, 0x68, 0x95, 0xb6, 0x24,
640 0xb3, 0xa8, 0x6c, 0x28, 0x3b, 0x11, 0x40, 0x7e,
641 0x18, 0x65, 0x6d, 0xd8, 0x24, 0x42, 0x7d, 0x88,
642 0xc0, 0x52, 0xd9, 0x05, 0xe4, 0x95, 0x90, 0x87,
643 0x8c, 0xf4, 0xd0, 0x6b, 0xb9, 0x83, 0x99, 0x34,
644 0x6d, 0xfe, 0x54, 0x40, 0x94, 0x52, 0x21, 0x4f,
645 0x14, 0x25, 0xc5, 0xd6, 0x5e, 0x95, 0xdc, 0x0a,
646 0x2b, 0x89, 0x20, 0x11, 0x84, 0x48, 0xd6, 0x3a,
647 0xcd, 0x5c, 0x24, 0xad, 0x62, 0xe3, 0xb1, 0x93,
648 0x25, 0x8d, 0xcd, 0x7e, 0xfc, 0x27, 0xa3, 0x37,
649 0xfd, 0x84, 0xfc, 0x1b, 0xb2, 0xf1, 0x27, 0x38,
650 0x5a, 0xb7, 0xfc, 0xf2, 0xfa, 0x95, 0x66, 0xd4,
651 0xfb, 0xba, 0xa7, 0xd7, 0xa3, 0x72, 0x69, 0x48,
652 0x48, 0x8c, 0xeb, 0x28, 0x89, 0xfe, 0x33, 0x65,
653 0x5a, 0x36, 0x01, 0x7e, 0x06, 0x79, 0x0a, 0x09,
654 0x3b, 0x74, 0x11, 0x9a, 0x6e, 0xbf, 0xd4, 0x9e,
655 0x58, 0x90, 0x49, 0x4f, 0x4d, 0x08, 0xd4, 0xe5,
656 0x4a, 0x09, 0x21, 0xef, 0x8b, 0xb8, 0x74, 0x3b,
657 0x91, 0xdd, 0x36, 0x85, 0x60, 0x2d, 0xfa, 0xd4,
658 0x45, 0x7b, 0x45, 0x53, 0xf5, 0x47, 0x87, 0x7e,
659 0xa6, 0x37, 0xc8, 0x78, 0x7a, 0x68, 0x9d, 0x8d,
660 0x65, 0x2c, 0x0e, 0x91, 0x5c, 0xa2, 0x60, 0xf0,
661 0x8e, 0x3f, 0xe9, 0x1a, 0xcd, 0xaa, 0xe7, 0xd5,
662 0x77, 0x18, 0xaf, 0xc9, 0xbc, 0x18, 0xea, 0x48,
663 0x1b, 0xfb, 0x22, 0x48, 0x70, 0x16, 0x29, 0x9e,
664 0x5b, 0xc1, 0x2c, 0x66, 0x23, 0xbc, 0xf0, 0x1f,
665 0xef, 0xaf, 0xe4, 0xd6, 0x04, 0x19, 0x82, 0x7a,
666 0x0b, 0xba, 0x4b, 0x46, 0xb1, 0x6a, 0x85, 0x5d,
667 0xb4, 0x73, 0xd6, 0x21, 0xa1, 0x71, 0x60, 0x14,
668 0xee, 0x0a, 0x77, 0xc4, 0x66, 0x2e, 0xf9, 0x69,
669 0x30, 0xaf, 0x41, 0x0b, 0xc8, 0x83, 0x3c, 0x53,
670 0x99, 0x19, 0x27, 0x46, 0xf7, 0x41, 0x6e, 0x56,
671 0xdc, 0x94, 0x28, 0x67, 0x4e, 0xb7, 0x25, 0x48,
672 0x8a, 0xc2, 0xe0, 0x60, 0x96, 0xcc, 0x18, 0xf4,
673 0x84, 0xdd, 0xa7, 0x5e, 0x3e, 0x05, 0x0b, 0x26,
674 0x26, 0xb2, 0x5c, 0x1f, 0x57, 0x1a, 0x04, 0x7e,
675 0x6a, 0xe3, 0x2f, 0xb4, 0x35, 0xb6, 0x38, 0x40,
676 0x40, 0xcd, 0x6f, 0x87, 0x2e, 0xef, 0xa3, 0xd7,
677 0xa9, 0xc2, 0xe8, 0x0d, 0x27, 0xdf, 0x44, 0x62,
678 0x99, 0xa0, 0xfc, 0xcf, 0x81, 0x78, 0xcb, 0xfe,
679 0xe5, 0xa0, 0x03, 0x4e, 0x6c, 0xd7, 0xf4, 0xaf,
680 0x7a, 0xbb, 0x61, 0x82, 0xfe, 0x71, 0x89, 0xb2,
681 0x22, 0x7c, 0x8e, 0x83, 0x04, 0xce, 0xf6, 0x5d,
682 0x84, 0x8f, 0x95, 0x6a, 0x7f, 0xad, 0xfd, 0x32,
683 0x9c, 0x5e, 0xe4, 0x9c, 0x89, 0x60, 0x54, 0xaa,
684 0x96, 0x72, 0xd2, 0xd7, 0x36, 0x85, 0xa9, 0x45,
685 0xd2, 0x2a, 0xa1, 0x81, 0x49, 0x6f, 0x7e, 0x04,
686 0xfa, 0xe2, 0xfe, 0x90, 0x26, 0x77, 0x5a, 0x33,
687 0xb8, 0x04, 0x9a, 0x7a, 0xe6, 0x4c, 0x4f, 0xad,
688 0x72, 0x96, 0x08, 0x28, 0x58, 0x13, 0xf8, 0xc4,
689 0x1c, 0xf0, 0xc3, 0x45, 0x95, 0x49, 0x20, 0x8c,
690 0x9f, 0x39, 0x70, 0xe1, 0x77, 0xfe, 0xd5, 0x4b,
691 0xaf, 0x86, 0xda, 0xef, 0x22, 0x06, 0x83, 0x36,
692 0x29, 0x12, 0x11, 0x40, 0xbc, 0x3b, 0x86, 0xaa,
693 0xaa, 0x65, 0x60, 0xc3, 0x80, 0xca, 0xed, 0xa9,
694 0xf3, 0xb0, 0x79, 0x96, 0xa2, 0x55, 0x27, 0x28,
695 0x55, 0x73, 0x26, 0xa5, 0x50, 0xea, 0x92, 0x4b,
696 0x3c, 0x5c, 0x82, 0x33, 0xf0, 0x01, 0x3f, 0x03,
697 0xc1, 0x08, 0x05, 0xbf, 0x98, 0xf4, 0x9b, 0x6d,
698 0xa5, 0xa8, 0xb4, 0x82, 0x0c, 0x06, 0xfa, 0xff,
699 0x2d, 0x08, 0xf3, 0x05, 0x4f, 0x57, 0x2a, 0x39,
700 0xd4, 0x83, 0x0d, 0x75, 0x51, 0xd8, 0x5b, 0x1b,
701 0xd3, 0x51, 0x5a, 0x32, 0x2a, 0x9b, 0x32, 0xb2,
702 0xf2, 0xa4, 0x96, 0x12, 0xf2, 0xae, 0x40, 0x34,
703 0x67, 0xa8, 0xf5, 0x44, 0xd5, 0x35, 0x53, 0xfe,
704 0xa3, 0x60, 0x96, 0x63, 0x0f, 0x1f, 0x6e, 0xb0,
705 0x5a, 0x42, 0xa6, 0xfc, 0x51, 0x0b, 0x60, 0x27,
706 0xbc, 0x06, 0x71, 0xed, 0x65, 0x5b, 0x23, 0x86,
707 0x4a, 0x07, 0x3b, 0x22, 0x07, 0x46, 0xe6, 0x90,
708 0x3e, 0xf3, 0x25, 0x50, 0x1b, 0x4c, 0x7f, 0x03,
709 0x08, 0xa8, 0x36, 0x6b, 0x87, 0xe5, 0xe3, 0xdb,
710 0x9a, 0x38, 0x83, 0xff, 0x9f, 0x1a, 0x9f, 0x57,
711 0xa4, 0x2a, 0xf6, 0x37, 0xbc, 0x1a, 0xff, 0xc9,
712 0x1e, 0x35, 0x0c, 0xc3, 0x7c, 0xa3, 0xb2, 0xe5,
713 0xd2, 0xc6, 0xb4, 0x57, 0x47, 0xe4, 0x32, 0x16,
714 0x6d, 0xa9, 0xae, 0x64, 0xe6, 0x2d, 0x8d, 0xc5,
715 0x8d, 0x50, 0x8e, 0xe8, 0x1a, 0x22, 0x34, 0x2a,
716 0xd9, 0xeb, 0x51, 0x90, 0x4a, 0xb1, 0x41, 0x7d,
717 0x64, 0xf9, 0xb9, 0x0d, 0xf6, 0x23, 0x33, 0xb0,
718 0x33, 0xf4, 0xf7, 0x3f, 0x27, 0x84, 0xc6, 0x0f,
719 0x54, 0xa5, 0xc0, 0x2e, 0xec, 0x0b, 0x3a, 0x48,
720 0x6e, 0x80, 0x35, 0x81, 0x43, 0x9b, 0x90, 0xb1,
721 0xd0, 0x2b, 0xea, 0x21, 0xdc, 0xda, 0x5b, 0x09,
722 0xf4, 0xcc, 0x10, 0xb4, 0xc7, 0xfe, 0x79, 0x51,
723 0xc3, 0xc5, 0xac, 0x88, 0x74, 0x84, 0x0b, 0x4b,
724 0xca, 0x79, 0x16, 0x29, 0xfb, 0x69, 0x54, 0xdf,
725 0x41, 0x7e, 0xe9, 0xc7, 0x8e, 0xea, 0xa5, 0xfe,
726 0xfc, 0x76, 0x0e, 0x90, 0xc4, 0x92, 0x38, 0xad,
727 0x7b, 0x48, 0xe6, 0x6e, 0xf7, 0x21, 0xfd, 0x4e,
728 0x93, 0x0a, 0x7b, 0x41, 0x83, 0x68, 0xfb, 0x57,
729 0x51, 0x76, 0x34, 0xa9, 0x6c, 0x00, 0xaa, 0x4f,
730 0x66, 0x65, 0x98, 0x4a, 0x4f, 0xa3, 0xa0, 0xef,
731 0x69, 0x3f, 0xe3, 0x1c, 0x92, 0x8c, 0xfd, 0xd8,
732 0xe8, 0xde, 0x7c, 0x7f, 0x3e, 0x84, 0x8e, 0x69,
733 0x3c, 0xf1, 0xf2, 0x05, 0x46, 0xdc, 0x2f, 0x9d,
734 0x5e, 0x6e, 0x4c, 0xfb, 0xb5, 0x99, 0x2a, 0x59,
735 0x63, 0xc1, 0x34, 0xbc, 0x57, 0xc0, 0x0d, 0xb9,
736 0x61, 0x25, 0xf3, 0x33, 0x23, 0x51, 0xb6, 0x0d,
737 0x07, 0xa6, 0xab, 0x94, 0x4a, 0xb7, 0x2a, 0xea,
738 0xee, 0xac, 0xa3, 0xc3, 0x04, 0x8b, 0x0e, 0x56,
739 0xfe, 0x44, 0xa7, 0x39, 0xe2, 0xed, 0xed, 0xb4,
740 0x22, 0x2b, 0xac, 0x12, 0x32, 0x28, 0x91, 0xd8,
741 0xa5, 0xab, 0xff, 0x5f, 0xe0, 0x4b, 0xda, 0x78,
742 0x17, 0xda, 0xf1, 0x01, 0x5b, 0xcd, 0xe2, 0x5f,
743 0x50, 0x45, 0x73, 0x2b, 0xe4, 0x76, 0x77, 0xf4,
744 0x64, 0x1d, 0x43, 0xfb, 0x84, 0x7a, 0xea, 0x91,
745 0xae, 0xf9, 0x9e, 0xb7, 0xb4, 0xb0, 0x91, 0x5f,
746 0x16, 0x35, 0x9a, 0x11, 0xb8, 0xc7, 0xc1, 0x8c,
747 0xc6, 0x10, 0x8d, 0x2f, 0x63, 0x4a, 0xa7, 0x57,
748 0x3a, 0x51, 0xd6, 0x32, 0x2d, 0x64, 0x72, 0xd4,
749 0x66, 0xdc, 0x10, 0xa6, 0x67, 0xd6, 0x04, 0x23,
750 0x9d, 0x0a, 0x11, 0x77, 0xdd, 0x37, 0x94, 0x17,
751 0x3c, 0xbf, 0x8b, 0x65, 0xb0, 0x2e, 0x5e, 0x66,
752 0x47, 0x64, 0xac, 0xdd, 0xf0, 0x84, 0xfd, 0x39,
753 0xfa, 0x15, 0x5d, 0xef, 0xae, 0xca, 0xc1, 0x36,
754 0xa7, 0x5c, 0xbf, 0xc7, 0x08, 0xc2, 0x66, 0x00,
755 0x74, 0x74, 0x4e, 0x27, 0x3f, 0x55, 0x8a, 0xb7,
756 0x38, 0x66, 0x83, 0x6d, 0xcf, 0x99, 0x9e, 0x60,
757 0x8f, 0xdd, 0x2e, 0x62, 0x22, 0x0e, 0xef, 0x0c,
758 0x98, 0xa7, 0x85, 0x74, 0x3b, 0x9d, 0xec, 0x9e,
759 0xa9, 0x19, 0x72, 0xa5, 0x7f, 0x2c, 0x39, 0xb7,
760 0x7d, 0xb7, 0xf1, 0x12, 0x65, 0x27, 0x4b, 0x5a,
761 0xde, 0x17, 0xfe, 0xad, 0x44, 0xf3, 0x20, 0x4d,
762 0xfd, 0xe4, 0x1f, 0xb5, 0x81, 0xb0, 0x36, 0x37,
763 0x08, 0x6f, 0xc3, 0x0c, 0xe9, 0x85, 0x98, 0x82,
764 0xa9, 0x62, 0x0c, 0xc4, 0x97, 0xc0, 0x50, 0xc8,
765 0xa7, 0x3c, 0x50, 0x9f, 0x43, 0xb9, 0xcd, 0x5e,
766 0x4d, 0xfa, 0x1c, 0x4b, 0x0b, 0xa9, 0x98, 0x85,
767 0x38, 0x92, 0xac, 0x8d, 0xe4, 0xad, 0x9b, 0x98,
768 0xab, 0xd9, 0x38, 0xac, 0x62, 0x52, 0xa3, 0x22,
769 0x63, 0x0f, 0xbf, 0x95, 0x48, 0xdf, 0x69, 0xe7,
770 0x8b, 0x33, 0xd5, 0xb2, 0xbd, 0x05, 0x49, 0x49,
771 0x9d, 0x57, 0x73, 0x19, 0x33, 0xae, 0xfa, 0x33,
772 0xf1, 0x19, 0xa8, 0x80, 0xce, 0x04, 0x9f, 0xbc,
773 0x1d, 0x65, 0x82, 0x1b, 0xe5, 0x3a, 0x51, 0xc8,
774 0x1c, 0x21, 0xe3, 0x5d, 0xf3, 0x7d, 0x9b, 0x2f,
775 0x2c, 0x1d, 0x4a, 0x7f, 0x9b, 0x68, 0x35, 0xa3,
776 0xb2, 0x50, 0xf7, 0x62, 0x79, 0xcd, 0xf4, 0x98,
777 0x4f, 0xe5, 0x63, 0x7c, 0x3e, 0x45, 0x31, 0x8c,
778 0x16, 0xa0, 0x12, 0xc8, 0x58, 0xce, 0x39, 0xa6,
779 0xbc, 0x54, 0xdb, 0xc5, 0xe0, 0xd5, 0xba, 0xbc,
780 0xb9, 0x04, 0xf4, 0x8d, 0xe8, 0x2f, 0x15, 0x9d,
781};
Linus Torvalds1da177e2005-04-16 15:20:36 -0700782
Bob Pearson3863ef32012-03-23 15:02:22 -0700783/* 100 test cases */
784static struct crc_test {
785 u32 crc; /* random starting crc */
786 u32 start; /* random 6 bit offset in buf */
787 u32 length; /* random 11 bit length of test */
788 u32 crc_le; /* expected crc32_le result */
789 u32 crc_be; /* expected crc32_be result */
Darrick J. Wong577eba92012-03-23 15:02:26 -0700790 u32 crc32c_le; /* expected crc32c_le result */
Bob Pearson3863ef32012-03-23 15:02:22 -0700791} test[] =
Linus Torvalds1da177e2005-04-16 15:20:36 -0700792{
Darrick J. Wong577eba92012-03-23 15:02:26 -0700793 {0x674bf11d, 0x00000038, 0x00000542, 0x0af6d466, 0xd8b6e4c1,
794 0xf6e93d6c},
795 {0x35c672c6, 0x0000003a, 0x000001aa, 0xc6d3dfba, 0x28aaf3ad,
796 0x0fe92aca},
797 {0x496da28e, 0x00000039, 0x000005af, 0xd933660f, 0x5d57e81f,
798 0x52e1ebb8},
799 {0x09a9b90e, 0x00000027, 0x000001f8, 0xb45fe007, 0xf45fca9a,
800 0x0798af9a},
801 {0xdc97e5a9, 0x00000025, 0x000003b6, 0xf81a3562, 0xe0126ba2,
802 0x18eb3152},
803 {0x47c58900, 0x0000000a, 0x000000b9, 0x8e58eccf, 0xf3afc793,
804 0xd00d08c7},
805 {0x292561e8, 0x0000000c, 0x00000403, 0xa2ba8aaf, 0x0b797aed,
806 0x8ba966bc},
807 {0x415037f6, 0x00000003, 0x00000676, 0xa17d52e8, 0x7f0fdf35,
808 0x11d694a2},
809 {0x3466e707, 0x00000026, 0x00000042, 0x258319be, 0x75c484a2,
810 0x6ab3208d},
811 {0xafd1281b, 0x00000023, 0x000002ee, 0x4428eaf8, 0x06c7ad10,
812 0xba4603c5},
813 {0xd3857b18, 0x00000028, 0x000004a2, 0x5c430821, 0xb062b7cb,
814 0xe6071c6f},
815 {0x1d825a8f, 0x0000002b, 0x0000050b, 0xd2c45f0c, 0xd68634e0,
816 0x179ec30a},
817 {0x5033e3bc, 0x0000000b, 0x00000078, 0xa3ea4113, 0xac6d31fb,
818 0x0903beb8},
819 {0x94f1fb5e, 0x0000000f, 0x000003a2, 0xfbfc50b1, 0x3cfe50ed,
820 0x6a7cb4fa},
821 {0xc9a0fe14, 0x00000009, 0x00000473, 0x5fb61894, 0x87070591,
822 0xdb535801},
823 {0x88a034b1, 0x0000001c, 0x000005ad, 0xc1b16053, 0x46f95c67,
824 0x92bed597},
825 {0xf0f72239, 0x00000020, 0x0000026d, 0xa6fa58f3, 0xf8c2c1dd,
826 0x192a3f1b},
827 {0xcc20a5e3, 0x0000003b, 0x0000067a, 0x7740185a, 0x308b979a,
828 0xccbaec1a},
829 {0xce589c95, 0x0000002b, 0x00000641, 0xd055e987, 0x40aae25b,
830 0x7eabae4d},
831 {0x78edc885, 0x00000035, 0x000005be, 0xa39cb14b, 0x035b0d1f,
832 0x28c72982},
833 {0x9d40a377, 0x0000003b, 0x00000038, 0x1f47ccd2, 0x197fbc9d,
834 0xc3cd4d18},
835 {0x703d0e01, 0x0000003c, 0x000006f1, 0x88735e7c, 0xfed57c5a,
836 0xbca8f0e7},
837 {0x776bf505, 0x0000000f, 0x000005b2, 0x5cc4fc01, 0xf32efb97,
838 0x713f60b3},
839 {0x4a3e7854, 0x00000027, 0x000004b8, 0x8d923c82, 0x0cbfb4a2,
840 0xebd08fd5},
841 {0x209172dd, 0x0000003b, 0x00000356, 0xb89e9c2b, 0xd7868138,
842 0x64406c59},
843 {0x3ba4cc5b, 0x0000002f, 0x00000203, 0xe51601a9, 0x5b2a1032,
844 0x7421890e},
845 {0xfc62f297, 0x00000000, 0x00000079, 0x71a8e1a2, 0x5d88685f,
846 0xe9347603},
847 {0x64280b8b, 0x00000016, 0x000007ab, 0x0fa7a30c, 0xda3a455f,
848 0x1bef9060},
849 {0x97dd724b, 0x00000033, 0x000007ad, 0x5788b2f4, 0xd7326d32,
850 0x34720072},
851 {0x61394b52, 0x00000035, 0x00000571, 0xc66525f1, 0xcabe7fef,
852 0x48310f59},
853 {0x29b4faff, 0x00000024, 0x0000006e, 0xca13751e, 0x993648e0,
854 0x783a4213},
855 {0x29bfb1dc, 0x0000000b, 0x00000244, 0x436c43f7, 0x429f7a59,
856 0x9e8efd41},
857 {0x86ae934b, 0x00000035, 0x00000104, 0x0760ec93, 0x9cf7d0f4,
858 0xfc3d34a5},
859 {0xc4c1024e, 0x0000002e, 0x000006b1, 0x6516a3ec, 0x19321f9c,
860 0x17a52ae2},
861 {0x3287a80a, 0x00000026, 0x00000496, 0x0b257eb1, 0x754ebd51,
862 0x886d935a},
863 {0xa4db423e, 0x00000023, 0x0000045d, 0x9b3a66dc, 0x873e9f11,
864 0xeaaeaeb2},
865 {0x7a1078df, 0x00000015, 0x0000014a, 0x8c2484c5, 0x6a628659,
866 0x8e900a4b},
867 {0x6048bd5b, 0x00000006, 0x0000006a, 0x897e3559, 0xac9961af,
868 0xd74662b1},
869 {0xd8f9ea20, 0x0000003d, 0x00000277, 0x60eb905b, 0xed2aaf99,
870 0xd26752ba},
871 {0xea5ec3b4, 0x0000002a, 0x000004fe, 0x869965dc, 0x6c1f833b,
872 0x8b1fcd62},
873 {0x2dfb005d, 0x00000016, 0x00000345, 0x6a3b117e, 0xf05e8521,
874 0xf54342fe},
875 {0x5a214ade, 0x00000020, 0x000005b6, 0x467f70be, 0xcb22ccd3,
876 0x5b95b988},
877 {0xf0ab9cca, 0x00000032, 0x00000515, 0xed223df3, 0x7f3ef01d,
878 0x2e1176be},
879 {0x91b444f9, 0x0000002e, 0x000007f8, 0x84e9a983, 0x5676756f,
880 0x66120546},
881 {0x1b5d2ddb, 0x0000002e, 0x0000012c, 0xba638c4c, 0x3f42047b,
882 0xf256a5cc},
883 {0xd824d1bb, 0x0000003a, 0x000007b5, 0x6288653b, 0x3a3ebea0,
884 0x4af1dd69},
885 {0x0470180c, 0x00000034, 0x000001f0, 0x9d5b80d6, 0x3de08195,
886 0x56f0a04a},
887 {0xffaa3a3f, 0x00000036, 0x00000299, 0xf3a82ab8, 0x53e0c13d,
888 0x74f6b6b2},
889 {0x6406cfeb, 0x00000023, 0x00000600, 0xa920b8e8, 0xe4e2acf4,
890 0x085951fd},
891 {0xb24aaa38, 0x0000003e, 0x000004a1, 0x657cc328, 0x5077b2c3,
892 0xc65387eb},
893 {0x58b2ab7c, 0x00000039, 0x000002b4, 0x3a17ee7e, 0x9dcb3643,
894 0x1ca9257b},
895 {0x3db85970, 0x00000006, 0x000002b6, 0x95268b59, 0xb9812c10,
896 0xfd196d76},
897 {0x857830c5, 0x00000003, 0x00000590, 0x4ef439d5, 0xf042161d,
898 0x5ef88339},
899 {0xe1fcd978, 0x0000003e, 0x000007d8, 0xae8d8699, 0xce0a1ef5,
900 0x2c3714d9},
901 {0xb982a768, 0x00000016, 0x000006e0, 0x62fad3df, 0x5f8a067b,
902 0x58576548},
903 {0x1d581ce8, 0x0000001e, 0x0000058b, 0xf0f5da53, 0x26e39eee,
904 0xfd7c57de},
905 {0x2456719b, 0x00000025, 0x00000503, 0x4296ac64, 0xd50e4c14,
906 0xd5fedd59},
907 {0xfae6d8f2, 0x00000000, 0x0000055d, 0x057fdf2e, 0x2a31391a,
908 0x1cc3b17b},
909 {0xcba828e3, 0x00000039, 0x000002ce, 0xe3f22351, 0x8f00877b,
910 0x270eed73},
911 {0x13d25952, 0x0000000a, 0x0000072d, 0x76d4b4cc, 0x5eb67ec3,
912 0x91ecbb11},
913 {0x0342be3f, 0x00000015, 0x00000599, 0xec75d9f1, 0x9d4d2826,
914 0x05ed8d0c},
915 {0xeaa344e0, 0x00000014, 0x000004d8, 0x72a4c981, 0x2064ea06,
916 0x0b09ad5b},
917 {0xbbb52021, 0x0000003b, 0x00000272, 0x04af99fc, 0xaf042d35,
918 0xf8d511fb},
919 {0xb66384dc, 0x0000001d, 0x000007fc, 0xd7629116, 0x782bd801,
920 0x5ad832cc},
921 {0x616c01b6, 0x00000022, 0x000002c8, 0x5b1dab30, 0x783ce7d2,
922 0x1214d196},
923 {0xce2bdaad, 0x00000016, 0x0000062a, 0x932535c8, 0x3f02926d,
924 0x5747218a},
925 {0x00fe84d7, 0x00000005, 0x00000205, 0x850e50aa, 0x753d649c,
926 0xde8f14de},
927 {0xbebdcb4c, 0x00000006, 0x0000055d, 0xbeaa37a2, 0x2d8c9eba,
928 0x3563b7b9},
929 {0xd8b1a02a, 0x00000010, 0x00000387, 0x5017d2fc, 0x503541a5,
930 0x071475d0},
931 {0x3b96cad2, 0x00000036, 0x00000347, 0x1d2372ae, 0x926cd90b,
932 0x54c79d60},
933 {0xc94c1ed7, 0x00000005, 0x0000038b, 0x9e9fdb22, 0x144a9178,
934 0x4c53eee6},
935 {0x1aad454e, 0x00000025, 0x000002b2, 0xc3f6315c, 0x5c7a35b3,
936 0x10137a3c},
937 {0xa4fec9a6, 0x00000000, 0x000006d6, 0x90be5080, 0xa4107605,
938 0xaa9d6c73},
939 {0x1bbe71e2, 0x0000001f, 0x000002fd, 0x4e504c3b, 0x284ccaf1,
940 0xb63d23e7},
941 {0x4201c7e4, 0x00000002, 0x000002b7, 0x7822e3f9, 0x0cc912a9,
942 0x7f53e9cf},
943 {0x23fddc96, 0x00000003, 0x00000627, 0x8a385125, 0x07767e78,
944 0x13c1cd83},
945 {0xd82ba25c, 0x00000016, 0x0000063e, 0x98e4148a, 0x283330c9,
946 0x49ff5867},
947 {0x786f2032, 0x0000002d, 0x0000060f, 0xf201600a, 0xf561bfcd,
948 0x8467f211},
949 {0xfebe4e1f, 0x0000002a, 0x000004f2, 0x95e51961, 0xfd80dcab,
950 0x3f9683b2},
951 {0x1a6e0a39, 0x00000008, 0x00000672, 0x8af6c2a5, 0x78dd84cb,
952 0x76a3f874},
953 {0x56000ab8, 0x0000000e, 0x000000e5, 0x36bacb8f, 0x22ee1f77,
954 0x863b702f},
955 {0x4717fe0c, 0x00000000, 0x000006ec, 0x8439f342, 0x5c8e03da,
956 0xdc6c58ff},
957 {0xd5d5d68e, 0x0000003c, 0x000003a3, 0x46fff083, 0x177d1b39,
958 0x0622cc95},
959 {0xc25dd6c6, 0x00000024, 0x000006c0, 0x5ceb8eb4, 0x892b0d16,
960 0xe85605cd},
961 {0xe9b11300, 0x00000023, 0x00000683, 0x07a5d59a, 0x6c6a3208,
962 0x31da5f06},
963 {0x95cd285e, 0x00000001, 0x00000047, 0x7b3a4368, 0x0202c07e,
964 0xa1f2e784},
965 {0xd9245a25, 0x0000001e, 0x000003a6, 0xd33c1841, 0x1936c0d5,
966 0xb07cc616},
967 {0x103279db, 0x00000006, 0x0000039b, 0xca09b8a0, 0x77d62892,
968 0xbf943b6c},
969 {0x1cba3172, 0x00000027, 0x000001c8, 0xcb377194, 0xebe682db,
970 0x2c01af1c},
971 {0x8f613739, 0x0000000c, 0x000001df, 0xb4b0bc87, 0x7710bd43,
972 0x0fe5f56d},
973 {0x1c6aa90d, 0x0000001b, 0x0000053c, 0x70559245, 0xda7894ac,
974 0xf8943b2d},
975 {0xaabe5b93, 0x0000003d, 0x00000715, 0xcdbf42fa, 0x0c3b99e7,
976 0xe4d89272},
977 {0xf15dd038, 0x00000006, 0x000006db, 0x6e104aea, 0x8d5967f2,
978 0x7c2f6bbb},
979 {0x584dd49c, 0x00000020, 0x000007bc, 0x36b6cfd6, 0xad4e23b2,
980 0xabbf388b},
981 {0x5d8c9506, 0x00000020, 0x00000470, 0x4c62378e, 0x31d92640,
982 0x1dca1f4e},
983 {0xb80d17b0, 0x00000032, 0x00000346, 0x22a5bb88, 0x9a7ec89f,
984 0x5c170e23},
985 {0xdaf0592e, 0x00000023, 0x000007b0, 0x3cab3f99, 0x9b1fdd99,
986 0xc0e9d672},
987 {0x4793cc85, 0x0000000d, 0x00000706, 0xe82e04f6, 0xed3db6b7,
988 0xc18bdc86},
989 {0x82ebf64e, 0x00000009, 0x000007c3, 0x69d590a9, 0x9efa8499,
990 0xa874fcdd},
991 {0xb18a0319, 0x00000026, 0x000007db, 0x1cf98dcc, 0x8fa9ad6a,
992 0x9dc0bb48},
Bob Pearson3863ef32012-03-23 15:02:22 -0700993};
Linus Torvalds1da177e2005-04-16 15:20:36 -0700994
Bob Pearson3863ef32012-03-23 15:02:22 -0700995#include <linux/time.h>
996
Darrick J. Wong577eba92012-03-23 15:02:26 -0700997static int __init crc32c_test(void)
998{
999 int i;
1000 int errors = 0;
1001 int bytes = 0;
1002 struct timespec start, stop;
1003 u64 nsec;
1004 unsigned long flags;
1005
1006 /* keep static to prevent cache warming code from
1007 * getting eliminated by the compiler */
1008 static u32 crc;
1009
1010 /* pre-warm the cache */
1011 for (i = 0; i < 100; i++) {
1012 bytes += 2*test[i].length;
1013
1014 crc ^= __crc32c_le(test[i].crc, test_buf +
1015 test[i].start, test[i].length);
1016 }
1017
1018 /* reduce OS noise */
1019 local_irq_save(flags);
1020 local_irq_disable();
1021
1022 getnstimeofday(&start);
1023 for (i = 0; i < 100; i++) {
1024 if (test[i].crc32c_le != __crc32c_le(test[i].crc, test_buf +
1025 test[i].start, test[i].length))
1026 errors++;
1027 }
1028 getnstimeofday(&stop);
1029
1030 local_irq_restore(flags);
1031 local_irq_enable();
1032
1033 nsec = stop.tv_nsec - start.tv_nsec +
1034 1000000000 * (stop.tv_sec - start.tv_sec);
1035
1036 pr_info("crc32c: CRC_LE_BITS = %d\n", CRC_LE_BITS);
1037
1038 if (errors)
1039 pr_warn("crc32c: %d self tests failed\n", errors);
1040 else {
1041 pr_info("crc32c: self tests passed, processed %d bytes in %lld nsec\n",
1042 bytes, nsec);
1043 }
1044
1045 return 0;
1046}
1047
1048static int __init crc32_test(void)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001049{
Bob Pearson3863ef32012-03-23 15:02:22 -07001050 int i;
1051 int errors = 0;
1052 int bytes = 0;
1053 struct timespec start, stop;
1054 u64 nsec;
1055 unsigned long flags;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001056
Bob Pearson3863ef32012-03-23 15:02:22 -07001057 /* keep static to prevent cache warming code from
1058 * getting eliminated by the compiler */
1059 static u32 crc;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001060
Bob Pearson3863ef32012-03-23 15:02:22 -07001061 /* pre-warm the cache */
1062 for (i = 0; i < 100; i++) {
1063 bytes += 2*test[i].length;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001064
Bob Pearson3863ef32012-03-23 15:02:22 -07001065 crc ^= crc32_le(test[i].crc, test_buf +
1066 test[i].start, test[i].length);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001067
Bob Pearson3863ef32012-03-23 15:02:22 -07001068 crc ^= crc32_be(test[i].crc, test_buf +
1069 test[i].start, test[i].length);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001070 }
1071
Bob Pearson3863ef32012-03-23 15:02:22 -07001072 /* reduce OS noise */
1073 local_irq_save(flags);
1074 local_irq_disable();
Linus Torvalds1da177e2005-04-16 15:20:36 -07001075
Bob Pearson3863ef32012-03-23 15:02:22 -07001076 getnstimeofday(&start);
1077 for (i = 0; i < 100; i++) {
1078 if (test[i].crc_le != crc32_le(test[i].crc, test_buf +
1079 test[i].start, test[i].length))
1080 errors++;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001081
Bob Pearson3863ef32012-03-23 15:02:22 -07001082 if (test[i].crc_be != crc32_be(test[i].crc, test_buf +
1083 test[i].start, test[i].length))
1084 errors++;
1085 }
1086 getnstimeofday(&stop);
1087
1088 local_irq_restore(flags);
1089 local_irq_enable();
1090
1091 nsec = stop.tv_nsec - start.tv_nsec +
1092 1000000000 * (stop.tv_sec - start.tv_sec);
1093
1094 pr_info("crc32: CRC_LE_BITS = %d, CRC_BE BITS = %d\n",
1095 CRC_LE_BITS, CRC_BE_BITS);
1096
1097 if (errors)
1098 pr_warn("crc32: %d self tests failed\n", errors);
1099 else {
1100 pr_info("crc32: self tests passed, processed %d bytes in %lld nsec\n",
1101 bytes, nsec);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001102 }
1103
Linus Torvalds1da177e2005-04-16 15:20:36 -07001104 return 0;
1105}
1106
Darrick J. Wong577eba92012-03-23 15:02:26 -07001107static int __init crc32test_init(void)
1108{
1109 crc32_test();
1110 crc32c_test();
1111 return 0;
1112}
1113
Bob Pearson3863ef32012-03-23 15:02:22 -07001114static void __exit crc32_exit(void)
1115{
1116}
1117
Darrick J. Wong577eba92012-03-23 15:02:26 -07001118module_init(crc32test_init);
Bob Pearson3863ef32012-03-23 15:02:22 -07001119module_exit(crc32_exit);
1120#endif /* CONFIG_CRC32_SELFTEST */