/* quadruple-precision exponential for x86_64

   _Float128 my_expf128 (const _Float128 x)

   Compile with: gcc -DNDEBUG -O3 -march=native

This file is distributed under the terms of the GNU Lesser General
Public License, version 2.1 or later - see the file COPYING.LIB for details.
If you did not receive a copy of the license with this program, please
see <https://www.gnu.org/licenses/> to obtain a copy.
*/

#include <stdint.h>
#include <x86intrin.h>   /* for _mulx_u64 */
#include <assert.h>
#include <xmmintrin.h>

/* table generated by search_alla(256,15,"C15a.h") */
static const uint64_t C[4*256] = {
0xe4f1d9cbfcfd8000ul,0x58b90bfbe8e7bcd5ul,0x2cbec4d9bc688000ul,0x5a827999fcef3242ul,
0x3927f613e0788000ul,0x580799e3f115ed5cul,0xe3d4b26c0ffbc000ul,0x5ac14be9d45cf868ul,
0x8d5e1264c8bac000ul,0x575627cbf9441de2ul,0xdaa66003d7138000ul,0x5b0049d42f6afbb5ul,
0xe1942eb11c344000ul,0x56a4b5b401724e68ul,0xaa9b6f173b278000ul,0x5b3f737751d915c7ul,
0x35ca4afd84e1c000ul,0x55f3439c09a07eeful,0x838b2f86f90a4000ul,0x5b7ec8f19468bbc8ul,
0x8a00674a00864000ul,0x5541d18411ceaf75ul,0x68b61e53783a4000ul,0x5bbe4a6164eb92f4ul,
0xde36839669594000ul,0x54905f6c19fcdffbul,0x1f86d3cf8b600000ul,0x5bfdf7e546520f3eul,
0x326c9fe2b81f0000ul,0x53deed54222b1082ul,0xd644d45ab2878000ul,0x5c3dd19bd0ba1c19ul,
0x86a2bc2f39218000ul,0x532d7b3c2a594108ul,0x8dc3cbbc2e5c4000ul,0x5c7dd7a3b17dcf74ul,
0xdad8d87b85958000ul,0x527c09243287718eul,0x55fd329d45ff0000ul,0x5cbe0a1bab4226dful,
0x2f0ef4c8084bc000ul,0x51ca970c3ab5a215ul,0x726939a2afbbc000ul,0x5cfe69229605cef5ul,
0x834511145a810000ul,0x511924f442e3d29bul,0x7fd618a6ed2d8000ul,0x5d3ef4d75f2ff504ul,
0xd77b2d60d7140000ul,0x5067b2dc4b120321ul,0xba6a8ce926b34000ul,0x5d7fad59099f22fdul,
0x2bb149ac8fb90000ul,0x4fb640c4534033a8ul,0x87716914c3a24000ul,0x5dc092c6adb825b7ul,
0x7fe765f9b0898000ul,0x4f04ceac5b6e642eul,0x6b80a021633dc000ul,0x5e01a53f7974fd86ul,
0xd41d8246106c4000ul,0x4e535c94639c94b4ul,0x9a862aadd74d8000ul,0x5e42e4e2b073d934ul,
0x28539e926c49c000ul,0x4da1ea7c6bcac53bul,0x54408fdb3e724000ul,0x5e8451cfac061b5ful,
0x7c89badee7714000ul,0x4cf0786473f8f5c1ul,0x44a7b9723854c000ul,0x5ec5ec25db3f6a41ul,
0xd0bfd72b224a4000ul,0x4c3f064c7c272647ul,0x24cd1164eef1c000ul,0x5f07b404c304c9f1ul,
0x24f5f3778e2d4000ul,0x4b8d9434845556ceul,0xddbfb72b9b6b0000ul,0x5f49a98bfe1bc11bul,
0x792c0fc3ff468000ul,0x4adc221c8c838754ul,0x740ae855f2ce4000ul,0x5f8bccdb3d398841ul,
0xcd622c0fa72ec000ul,0x4a2ab00494b1b7daul,0x7718367c7530000ul,0x5fce1e124712437cul,
0x2198485ce3e2c000ul,0x49793dec9cdfe861ul,0x3799d926927c8000ul,0x60109d50f86846d8ul,
0x75ce64a955ca4000ul,0x48c7cbd4a50e18e7ul,0x4370d151d6480000ul,0x60534ab7441b6546ul,
0xca0480f5be750000ul,0x481659bcad3c496dul,0x3e22beacd3b04000ul,0x6096266533384a2bul,
0x1e3a9d4219f24000ul,0x4764e7a4b56a79f4ul,0xb9a31df2c33ec000ul,0x60d9307ae507dd99ul,
0x7270b98e511d4000ul,0x46b3758cbd98aa7aul,0x4bdae5f1a8990000ul,0x611c69188f1eb339ul,
0xc6a6d5daf52e0000ul,0x46020374c5c6db00ul,0x58b7074deadac000ul,0x615fd05e7d6c83e4ul,
0x1adcf226f1648000ul,0x4550915ccdf50b87ul,0x907642b0bf224000ul,0x61a3666d124bb203ul,
0x6f130e73b1714000ul,0x449f1f44d6233c0dul,0x96be96da471c8000ul,0x61e72b64c690d8aeul,
0xc3492ac027dbc000ul,0x43edad2cde516c93ul,0x4c2f37cb575b0000ul,0x622b1f66299a6599ul,
0x177f470c4c220000ul,0x433c3b14e67f9d1aul,0x3954475220674000ul,0x626f4291e1603dd5ul,
0x6bb56358e9784000ul,0x428ac8fceeadcda0ul,0x9f156864bbb0c000ul,0x62b39508aa836d6eul,
0xbfeb7fa55283c000ul,0x41d956e4f6dbfe26ul,0xb5efc4344fc70000ul,0x62f816eb585de1ecul,
0x14219bf1b40e0000ul,0x4127e4ccff0a2eadul,0xaa8734587cbc8000ul,0x633cc85ad5122fbcul,
0x6857b83e05508000ul,0x407672b507385f33ul,0xeb590364e5e6c000ul,0x6381a978219b628eul,
0xbc8dd48aa1614000ul,0x3fc5009d0f668fb9ul,0x609d171cbb640000ul,0x63c6ba6455dcd8aeul,
0x10c3f0d6fafe0000ul,0x3f138e851794c040ul,0x2ca85fe402c84000ul,0x640bfb40a0b22959ul,
0x64fa0d236afdc000ul,0x3e621c6d1fc2f0c6ul,0x986d1a7db0454000ul,0x64516c2e47ff1622ul,
0xb930296fcae7e000ul,0x3db0aa5527f1214cul,0xd502ce3129b40000ul,0x64970d4ea8bf8765ul,
0xd6645bbe39bc000ul,0x3cff383d301f51d3ul,0x4070fc9527788000ul,0x64dcdec3371793d1ul,
0x619c6208a6568000ul,0x3c4dc625384d8259ul,0xe14c341694654000ul,0x6522e0ad7e639311ul,
0xb5d27e55091f0000ul,0x3b9c540d407bb2dful,0xd20da568425c0000ul,0x6569132f21483ba6ul,
0xa089aa15b8f4000ul,0x3aeae1f548a9e366ul,0x5a6980e6433bc000ul,0x65af7669d9c2cbe4ul,
0x5e3eb6edcf226000ul,0x3a396fdd50d813ecul,0x7a483e47aa31c000ul,0x65f60a7f79393e2eul,
0xb274d33a43ad2000ul,0x3987fdc559064472ul,0xaf6a8931e5ef0000ul,0x663ccf91e88a8872ul,
0x6aaef869dbc6000ul,0x38d68bad613474f9ul,0xc426e311a4b10000ul,0x6683c5c3281ee6e8ul,
0x5ae10bd319072000ul,0x382519956962a57ful,0x7b1b2092ae98c000ul,0x66caed354ff83222ul,
0xaf17281f7cb46000ul,0x3773a77d7190d605ul,0xf11ac1c7cccc4000ul,0x6712460a8fc24071ul,
0x34d446be6312000ul,0x36c2356579bf068cul,0x9415c227de078000ul,0x6759d0652ee352aeul,
0x578360b83f314000ul,0x3610c34d81ed3712ul,0x9329e39939028000ul,0x67a18c678c8c8c60ul,
0xabb97d04b6606000ul,0x355f51358a1b6798ul,0xb18aa8702ab6c000ul,0x67e97a341fca775aul,
0xffef9950e27e2000ul,0x34addf1d9249981eul,0x6b6a2e32c6554000ul,0x683199ed779592caul,
0x5425b59d6ffd6000ul,0x33fc6d059a77c8a5ul,0x618ee8be7b2c4000ul,0x6879ebb63ae2edc6ul,
0xa85bd1e9d5220000ul,0x334afaeda2a5f92bul,0x5c7ddc3762b8000ul,0x68c26fb128b4cd63ul,
0xfc91ee3655fd0000ul,0x329988d5aad429b1ul,0x87fa7604ef424000ul,0x690b2601182b5e55ul,
0x50c80a82bfe6c000ul,0x31e816bdb3025a38ul,0x912472be26e8000ul,0x69540ec8f895722dul,
0xa4fe26cf26266000ul,0x3136a4a5bb308abeul,0x1eac60ce08038000ul,0x699d2a2bd181482aul,
0xf934431b7e830000ul,0x3085328dc35ebb44ul,0xb7ecac564418c000ul,0x69e6784cc2cd61bcul,
0x4d6a5f67db5e0000ul,0x2fd3c075cb8cebcbul,0x7984d45eb1c58000ul,0x6a2ff94f04b962b0ul,
0xa1a07bb45a792000ul,0x2f224e5dd3bb1c51ul,0xac90ef7fd5cf4000ul,0x6a79ad55e7f6fd0ful,
0xf5d69800c7682000ul,0x2e70dc45dbe94cd7ul,0xe18ed74a2ad40000ul,0x6ac39484d5bae8c4ul,
0x4a0cb44d23c0a000ul,0x2dbf6a2de4177d5eul,0x6e59a8c49f0b4000ul,0x6b0daeff4fcde703ul,
0x9e42d09994288000ul,0x2d0df815ec45ade4ul,0xf3bb6b1b90534000ul,0x6b57fce8f09dd17eul,
0xf278ece5fe400000ul,0x2c5c85fdf473de6aul,0x1cd345dcc93d4000ul,0x6ba27e656b4eb57aul,
0x46af093262344000ul,0x2bab13e5fca20ef1ul,0xd03f0cea160f0000ul,0x6bed33988bcbfab4ul,
0x9ae5257ec1866000ul,0x2af9a1ce04d03f77ul,0x10ab37f1c4388000ul,0x6c381ca636d99642ul,
0xef1b41cb1d226000ul,0x2a482fb60cfe6ffdul,0xd024a07578834000ul,0x6c8339b26a25494dul,
0x43515e177d014000ul,0x2996bd9e152ca084ul,0xff439ef661350000ul,0x6cce8ae13c57ebdaul,
0x97877a640436c000ul,0x28e54b861d5ad10aul,0x270858820fbfc000ul,0x6d1a1056dd26c382ul,
0xebbd96b05e8cc000ul,0x2833d96e25890190ul,0xe204445929a60000ul,0x6d65ca379564e638ul,
0x3ff3b2fcd74f0000ul,0x278267562db73217ul,0x8f352883f78f4000ul,0x6db1b8a7c714a92aul,
0x9429cf492df28000ul,0x26d0f53e35e5629dul,0x9ec206ad57358000ul,0x6dfddbcbed791baaul,
0xe85feb958bb14000ul,0x261f83263e139323ul,0xde9ab349b0324000ul,0x6e4a33c89d278e48ul,
0x3c9607e207b10000ul,0x256e110e4641c3aaul,0x32cf1abd7112c000ul,0x6e96c0c284192610ul,
0x90cc242e72776000ul,0x24bc9ef64e6ff430ul,0x2b4b8da5aa3f0000ul,0x6ee382de69bc7bf8ul,
0xe502407ae00fe000ul,0x240b2cde569e24b6ul,0xee83d16cf4758000ul,0x6f307a412f074891ul,
0x39385cc73b48e000ul,0x2359bac65ecc553dul,0xf67727c56f0cc000ul,0x6f7da70fce881bf8ul,
0x8d6e7913ae7de000ul,0x22a848ae66fa85c3ul,0x235c094639d00000ul,0x6fcb096f5c782210ul,
0xe1a4956006988000ul,0x21f6d6966f28b649ul,0xad2af021b6524000ul,0x7018a18506ccf313ul,
0x35dab1ac6fda6000ul,0x2145647e7756e6d0ul,0x832c4a824e53c000ul,0x70666f76154a7088ul,
0x8a10cdf8e534c000ul,0x2093f2667f851756ul,0xae9e8375a41b4000ul,0x70b47367e994ae91ul,
0xde46ea45489ed000ul,0x1fe2804e87b347dcul,0x537e083c6434c000ul,0x7102ad7fff41e9b4ul,
0x327d0691b1ba8000ul,0x1f310e368fe17863ul,0xf072493b5e084000ul,0x71511de3ebec8912ul,
0x86b322de1ed5d000ul,0x1e7f9c1e980fa8e9ul,0x84dff483cb9d8000ul,0x719fc4b95f452d28ul,
0xdae93f2a4b1f0000ul,0x1dce2a06a03dd96ful,0x4a220ed5709a8000ul,0x71eea2262324cb0cul,
0x2f1f5b76e9c98000ul,0x1d1cb7eea86c09f6ul,0xb2f1220174208000ul,0x723db6501b9ed446ul,
0x835577c3529ca000ul,0x1c6b45d6b09a3a7cul,0x6a097797bb09c000ul,0x728d015d47136b40ul,
0xd78b940faa914000ul,0x1bb9d3beb8c86b02ul,0xf2f47a531528000ul,0x72dc8373be41a454ul,
0x2bc1b05c2135a000ul,0x1b0861a6c0f69b89ul,0x77c1e7fdc1094000ul,0x732c3cb9b459d38bul,
0x7ff7cca88b010000ul,0x1a56ef8ec924cc0ful,0x3e2563eb16f44000ul,0x737c2d55770fe711ul,
0xd42de8f4f71ed000ul,0x19a57d76d152fc95ul,0x716479200b368000ul,0x73cc556d6eadce5ful,
0x2864054158945000ul,0x18f40b5ed9812d1cul,0x3c8bc86859d68000ul,0x741cb5281e25ee34ul,
0x7c9a218dc5d21000ul,0x18429946e1af5da2ul,0x636219a370164000ul,0x746d4cac2325a155ul,
0xd0d03dda2304e000ul,0x1791272ee9dd8e28ul,0x7848e627aea94000ul,0x74be1c203627c62bul,
0x25065a2694c0b000ul,0x16dfb516f20bbeaful,0xb53bf5a162fcc000ul,0x750f23ab2a87593dul,
0x793c7672bdbbc000ul,0x162e42fefa39ef35ul,0x6816bad9d6d34000ul,0x75606373ee921c97ul,
0xcd7292bf619fe000ul,0x157cd0e702681fbbul,0xe87a4a8168c6c000ul,0x75b1dba18b9b4c1ful,
0x21a8af0bc4e5a000ul,0x14cb5ecf0a965042ul,0x13e7412206d30000ul,0x76038c5b260e5eeeul,
0x75decb57acee6000ul,0x1419ecb712c480c8ul,0x52dbb9afac624000ul,0x765575c7fd81d5a0ul,
0xca14e7a48dccd000ul,0x13687a9f1af2b14eul,0x300696db5bc8c000ul,0x76a7980f6cca15c2ul,
0x1e4b03f1074d4000ul,0x12b708872320e1d5ul,0x90e6d94742408000ul,0x76f9f358ea0c5248ul,
0x7281203d6cd1a000ul,0x1205966f2b4f125bul,0xa5778f018dd44000ul,0x774c87cc06d1812dul,
0xc6b73c89d3591000ul,0x11542457337d42e1ul,0xaad71864596d4000ul,0x779f559070195e35ul,
0x1aed58d63d68d000ul,0x10a2b23f3bab7368ul,0xa32b0e7b4baa0000ul,0x77f25ccdee6d7ae5ul,
0x6f237522a76df800ul,0xff1402743d9a3eeul,0x2b590a8e03608000ul,0x78459dac65f45bb5ul,
0xc359916eebe15800ul,0xf3fce0f4c07d474ul,0x9d87e85ec7c60000ul,0x78991853d684a284ul,
0x178fadbb7298c000ul,0xe8e5bf7543604fbul,0xb5bce0239a0ac000ul,0x78ecccec5bb84660ul,
0x6bc5ca07c0882800ul,0xddce9df5c643581ul,0xf44c054e73874000ul,0x7940bb9e2cffd89cul,
0xbffbe65444cdf800ul,0xd2b77c764926607ul,0x3c56ea48014000ul,0x7994e4919db5d74eul,
0x143202a0af8f0000ul,0xc7a05af6cc0968eul,0x522ca0c8de718000ul,0x79e947ef1d320d2dul,
0x68681eed16ef1800ul,0xbc8939774eec714ul,0x76b7f4fab594c000ul,0x7a3de5df36dcfeeful,
0xbc9e3b397f1b6000ul,0xb17217f7d1cf79aul,0x3dce863d7757c000ul,0x7a92be8a92436616ul,
0x10d45785e695f000ul,0xa65af67854b2821ul,0x32f2293e4fe40000ul,0x7ae7d219f329b948ul,
0x650a73d2428fe800ul,0x9b43d4f8d7958a7ul,0xc0c4bee52dce8000ul,0x7b3d20b6399fc236ul,
0xb940901eb78f9000ul,0x902cb3795a7892dul,0x68da487569204000ul,0x7b92aa886214411cul,
0xd76ac6b1f9d7000ul,0x851591f9dd5b9b4ul,0x7f486a4b6b4e8000ul,0x7be86fb985689ddcul,
0x61acc8b785473c00ul,0x79fe707a603ea3aul,0xdff9ae7e2d124000ul,0x7c3e7072d904a6cdul,
0xb5e2e503ef82fc00ul,0x6ee74efae321ac0ul,0x1a5bf0d8e4854000ul,0x7c94acddaeea5d3aul,
0xa190150571cd800ul,0x63d02d7b6604b47ul,0x9697049f21088000ul,0x7ceb252375c9cf9aul,
0x5e4f1d9cbec83c00ul,0x58b90bfbe8e7bcdul,0x3e12dd8a1956c000ul,0x7d41d96db915019dul,
0xb28539e91df19400ul,0x4da1ea7c6bcac53ul,0x37b3539348df8000ul,0x7d98c9e62113e1faul,
0x6bb56358e271400ul,0x428ac8fceeadcdaul,0x4ed2ff9cb059c000ul,0x7deff6b672f84e24ul,
0x5af17281f5c33e00ul,0x3773a77d7190d60ul,0xa2aeb10c14118000ul,0x7e47600890f223ddul,
0xaf278ece5f926000ul,0x2c5c85fdf473de6ul,0x429f9d2c992e8000ul,0x7e9f06067a4360baul,
0x35dab1ac08db600ul,0x2145647e7756e6dul,0x6233abd9c8e10000ul,0x7ef6e8da4b544f9aul,
0x5793c7672fc33600ul,0x162e42fefa39ef3ul,0xd6e92ccaf3f0c000ul,0x7f4f08ae3dc7c425ul,
0xabc9e3b397a79080ul,0xb17217f7d1cf79ul,0x980dd10bf7ba8000ul,0x7fa765aca88f6452ul,
0x0ul,0x0ul,0x0ul,0x8000000000000000ul,
0xabc9e3b398760e80ul,0xb17217f7d1cf79ul,0x94d589f609278000ul,0x8058d7d2d5e5f6b0ul,
0x5793c767308e3100ul,0x162e42fefa39ef3ul,0x25335719b72a8000ul,0x80b1ed4fd999ab6cul,
0x35dab1ac8419e00ul,0x2145647e7756e6dul,0xcef03ab14c18000ul,0x810b40a1d81406d4ul,
0xaf278ece61723200ul,0x2c5c85fdf473de6ul,0x7be56527bdc80000ul,0x8164d1f3bc030773ul,
0x5af17281f82a4a00ul,0x3773a77d7190d60ul,0xa047bab784748000ul,0x81bea1708dde6055ul,
0x6bb5635901d2c00ul,0x428ac8fceeadcdaul,0x9c7cd106d2420000ul,0x8218af4373fc25ebul,
0xb28539e928e78c00ul,0x4da1ea7c6bcac53ul,0x3793aa0d09300000ul,0x8272fb97b2a5894cul,
0x5e4f1d9cc2b50400ul,0x58b90bfbe8e7bcdul,0x3e2a475b47a40000ul,0x82cd8698ac2ba1d7ul,
0xa19015058670000ul,0x63d02d7b6604b47ul,0x90950cc78d4c8000ul,0x83285071e0fc4546ul,
0xb5e2e503f0997000ul,0x6ee74efae321ac0ul,0xe201d4ec3dce8000ul,0x8383594eefb6ee36ul,
0x61acc8b7c15ee400ul,0x79fe707a603ea3aul,0x334544588d758000ul,0x83dea15b9541b132ul,
0xd76ac6b21de0000ul,0x851591f9dd5b9b4ul,0x1af92eca14db8000ul,0x843a28c3acde4046ul,
0xb940901eb8964800ul,0x902cb3795a7892dul,0xf38ffeb806148000ul,0x8495efb3303efd2ful,
0x650a73d25050d800ul,0x9b43d4f8d7958a7ul,0xf03062c26c30000ul,0x84f1f656379c1a29ul,
0x10d45785e98ad000ul,0xa65af67854b2821ul,0x16c873d1d4278000ul,0x854e3cd8f9c8c95dul,
0xbc9e3b39818ed000ul,0xb17217f7d1cf79aul,0xc5c95b8c22040000ul,0x85aac367cc487b14ul,
0x68681eed1b315800ul,0xbc8939774eec714ul,0x3120da439f6a0000ul,0x86078a2f23642a9ful,
0x143202a0b2508000ul,0xc7a05af6cc0968eul,0xdb82dc49ef410000ul,0x8664915b923fba03ul,
0xbffbe6544f53a000ul,0xd2b77c764926607ul,0xd6437819d6710000ul,0x86c1d919caef5c87ul,
0x6bc5ca07e33de000ul,0xddce9df5c643581ul,0x3a1727c57cdf0000ul,0x871f61969e8d1010ul,
0x178fadbb854a0800ul,0xe8e5bf7543604fbul,0x48c8757fc36e0000ul,0x877d2afefd4e256cul,
0xc359916f15005000ul,0xf3fce0f4c07d474ul,0x9048eec50c8c8000ul,0x87db357ff698d791ul,
0x6f237522a8de8800ul,0xff1402743d9a3eeul,0x6eb1692fdd9a0000ul,0x88398146b919f1d4ul,
0x1aed58d645b25000ul,0x10a2b23f3bab7368ul,0x5df8d76c9b9e0000ul,0x88980e8092da8527ul,
0xc6b73c89e3911000ul,0x11542457337d42e1ul,0x75611f8097bc0000ul,0x88f6dd5af155ac6bul,
0x7281203d71f3c000ul,0x1205966f2b4f125bul,0x95d69926b5468000ul,0x8955ee03618e5fdcul,
0x1e4b03f11540d000ul,0x12b708872320e1d5ul,0xbdc116dc93298000ul,0x89b540a7902557a3ul,
0xca14e7a4a1e07000ul,0x13687a9f1af2b14eul,0x80ca1d92cfe0000ul,0x8a14d575496efd9aul,
0x75decb583ee77000ul,0x1419ecb712c480c8ul,0xe17c640bb8c80000ul,0x8a74ac9a79896e46ul,
0x21a8af0bd6cd3000ul,0x14cb5ecf0a965042ul,0x6ab9eeab40e0000ul,0x8ad4c6452c728924ul,
0xcd7292bf6a948000ul,0x157cd0e702681fbbul,0xe47705d435898000ul,0x8b3522a38e1e1031ul,
0x793c76733047b000ul,0x162e42fefa39ef35ul,0xfbe4628772b38000ul,0x8b95c1e3ea8bd6e6ul,
0x25065a2699224000ul,0x16dfb516f20bbeaful,0xf1ff1562d3788000ul,0x8bf6a434adde0084ul,
0xd0d03dda311fb000ul,0x1791272ee9dd8e28ul,0xfb85cd1e12d70000ul,0x8c57c9c4646f4dddul,
0x7c9a218dd29b0000ul,0x18429946e1af5da2ul,0x5bb0be2fc68e0000ul,0x8cb932c1bae97a95ul,
0x2864054178af6000ul,0x18f40b5ed9812d1cul,0xb4c7b4969b8e8000ul,0x8d1adf5b7e5ba9e5ul,
0xd42de8f4fc74c000ul,0x19a57d76d152fc95ul,0xf0b496d252230000ul,0x8d7ccfc09c50e2f7ul,
0x7ff7cca8e5960000ul,0x1a56ef8ec924cc0ful,0x8f395a216e360000ul,0x8ddf042022e69cd5ul,
0x2bc1b05c2da55000ul,0x1b0861a6c0f69b89ul,0x2ef0021f1bea8000ul,0x8e417ca940e35a01ul,
0xd78b940fc2b18000ul,0x1bb9d3beb8c86b02ul,0x2dc0144c88ac0000ul,0x8ea4398b45cd53c0ul,
0x835577c35a1e8000ul,0x1c6b45d6b09a3a7cul,0x44feee69250c8000ul,0x8f073af5a2013520ul,
0x2f1f5b76f4508000ul,0x1d1cb7eea86c09f6ul,0xcffb089109d0000ul,0x8f6a8117e6c8e5c4ul,
0xdae93f2a8f430000ul,0x1dce2a06a03dd96ful,0x5b6bed0a182f0000ul,0x8fce0c21c6726481ul,
0x86b322de291c9000ul,0x1e7f9c1e980fa8e9ul,0x775814a84e0e8000ul,0x9031dc431466b1dcul,
0x327d0691c303f000ul,0x1f310e368fe17863ul,0x25a59f955ef18000ul,0x9095f1abc540ca6bul,
0xde46ea45585df000ul,0x1fe2804e87b347dcul,0x97e9494a63308000ul,0x90fa4c8beee4b12aul,
0x8a10cdf8ef97e000ul,0x2093f2667f851756ul,0x4fb5577d6dd30000ul,0x915eed13c89689d3ul,
0x35dab1ac83b3c000ul,0x2145647e7756e6d0ul,0xfd6d8e0b00a8000ul,0x91c3d373ab11c336ul,
0xe1a49560218a6000ul,0x21f6d6966f28b649ul,0xfcc911ca9e670000ul,0x9228ffdc10a051acul,
0x8d6e7913b5c24000ul,0x22a848ae66fa85c3ul,0x155bef4f4d1b8000ul,0x928e727d9531f9acul,
0x39385cc78d036000ul,0x2359bac65ecc553dul,0x344958638cb50000ul,0x92f42b88f673aa7cul,
0xe502407b2f546000ul,0x240b2cde569e24b6ul,0xd339940ecac58000ul,0x935a2b2f13e6e92bul,
0x90cc242e79060000ul,0x24bc9ef64e6ff430ul,0xcf80bf3ced908000ul,0x93c071a0eef94bc0ul,
0x3c9607e2141ae000ul,0x256e110e4641c3aaul,0x78ae781e52300000ul,0x9426ff0fab1c04b6ul,
0xe85feb95b44fa000ul,0x261f83263e139323ul,0x38dd7bfe3ad70000ul,0x948dd3ac8ddb7ed3ul,
0x9429cf49527cc000ul,0x26d0f53e35e5629dul,0x2e8afad12f930000ul,0x94f4efa8fef70961ul,
0x3ff3b2fce34b2000ul,0x278267562db73217ul,0x179cdd2df12c0000ul,0x955c5336887894d5ul,
0xebbd96b0799d0000ul,0x2833d96e25890190ul,0xf52329c7ea760000ul,0x95c3fe86d6cc7feeul,
0x97877a643c526000ul,0x28e54b861d5ad10aul,0xd74b2295f9998000ul,0x962bf1cbb8d9755ful,
0x43515e17a7dfe000ul,0x2996bd9e152ca084ul,0x48ea9b683eb28000ul,0x96942d3720185a00ul,
0xef1b41cb3c574000ul,0x2a482fb60cfe6ffdul,0xd9ff779c35080000ul,0x96fcb0fb20ac4ba2ul,
0x9ae5257ed7ada000ul,0x2af9a1ce04d03f77ul,0x507a2ea920138000ul,0x97657d49f17ab08eul,
0x46af0932697a6000ul,0x2bab13e5fca20ef1ul,0xeaab35096020000ul,0x97ce9255ec4357abul,
0xf278ece6052ea000ul,0x2c5c85fdf473de6aul,0x46ad231830c18000ul,0x9837f0518db8a96ful,
0x9e42d09a1c9e8000ul,0x2d0df815ec45ade4ul,0x9a3f3f401b828000ul,0x98a1976f7597e995ul,
0x4a0cb44d3c816000ul,0x2dbf6a2de4177d5eul,0xce78e1804ea18000ul,0x990b87e266c189a9ul,
0xf5d69800cbf88000ul,0x2e70dc45dbe94cd7ul,0x42f869619eb50000ul,0x9975c1dd47518c77ul,
0xa1a07bb46d38a000ul,0x2f224e5dd3bb1c51ul,0xe43086cb3c070000ul,0x99e0459320b7fa64ul,
0x4d6a5f67fb2f8000ul,0x2fd3c075cb8cebcbul,0x58a6cf77e7060000ul,0x9a4b13371fd166caul,
0xf934431b96c1a000ul,0x3085328dc35ebb44ul,0x311a3b1ba0e80000ul,0x9ab62afc94ff864aul,
0xa4fe26cf2b690000ul,0x3136a4a5bb308abeul,0xebb5f9347b8f0000ul,0x9b218d16f441d63cul,
0x50c80a82c205a000ul,0x31e816bdb3025a38ul,0xa2a817a2a45a0000ul,0x9b8d39b9d54e5538ul,
0xfc91ee36778f0000ul,0x329988d5aad429b1ul,0x46ac2629cb0c0000ul,0x9bf93118f3aa4cc1ul,
0xa85bd1e9ffe02000ul,0x334afaeda2a5f92bul,0x4e586cdf71648000ul,0x9c6573682ec32c2dul,
0x5425b59d9d48a000ul,0x33fc6d059a77c8a5ul,0xcb406e3ae5cb8000ul,0x9cd200db8a0774caul,
0xffef995126c64000ul,0x34addf1d9249981eul,0xde494cf0545a8000ul,0x9d3ed9a72cffb750ul,
0xabb97d04ba088000ul,0x355f51358a1b6798ul,0x8cdc4dffe3940000ul,0x9dabfdff6367a2a9ul,
0x578360b8579cc000ul,0x3610c34d81ed3712ul,0xf9145acb910000ul,0x9e196e189d472420ul,
0x34d446c09476000ul,0x36c2356579bf068cul,0x4684614277628000ul,0x9e872a276f0b98fful,
0xaf17281f8be28000ul,0x3773a77d7190d605ul,0xa0911f09f2570000ul,0x9ef5326091a111adul,
0x5ae10bd31b1de000ul,0x382519956962a57ful,0x99c8473644880000ul,0x9f6386f8e28ba650ul,
0x6aaef86be1a2000ul,0x38d68bad613474f9ul,0xfb80d520c99b8000ul,0x9fd228256400dd05ul,
0xb274d33a4df74000ul,0x3987fdc559064472ul,0xdf8b6f4d07738000ul,0xa041161b3d0121bdul,
0x5e3eb6ede418e000ul,0x3a396fdd50d813ecul,0x192dc79edcd20000ul,0xa0b0510fb9714fc2ul,
0xa089aa17ecda000ul,0x3aeae1f548a9e366ul,0x3a47e99d67cc0000ul,0xa11fd9384a344cf7ul,
0xb5d27e55140e0000ul,0x3b9c540d407bb2dful,0x8221ca08682f0000ul,0xa18faeca8544b6e3ul,
0x619c6208b0ef0000ul,0x3c4dc625384d8259ul,0xbe9704c04f78000ul,0xa1ffd1fc25cea188ul,
0xd6645bc4494c000ul,0x3cff383d301f51d3ul,0x9b7a04ef82db8000ul,0xa27043030c496818ul,
0xb930296ff4d24000ul,0x3db0aa5527f1214cul,0x6f99f413933e0000ul,0xa2e102153e918f9eul,
0x64fa0d238030e000ul,0x3e621c6d1fc2f0c6ul,0x897a2c91583d8000ul,0xa3520f68e802bb92ul,
0x10c3f0d70aecc000ul,0x3f138e851794c040ul,0xe1e257751a958000ul,0xa3c36b345991b47bul,
0xbc8dd48aaae3c000ul,0x3fc5009d0f668fb9ul,0xd1db4831d950000ul,0xa43515ae09e6809eul,
0x6857b83e56968000ul,0x407672b507385f33ul,0xd76a1b6628c80000ul,0xa4a70f0c95768ec4ul,
0x14219bf1f3dfc000ul,0x4127e4ccff0a2eadul,0x6c5e7a37e0f68000ul,0xa5195786be9ef339ul,
0xbfeb7fa581574000ul,0x41d956e4f6dbfe26ul,0xa4780d7690738000ul,0xa58bef536dbeb6edul,
0x6bb563597a1ec000ul,0x428ac8fceeadcda0ul,0x1cbd7f62654a0000ul,0xa5fed6a9b15138eaul,
0x177f470c9c3c4000ul,0x433c3b14e67f9d1aul,0xc52d2157ad610000ul,0xa6720dc0be08a20bul,
0xc3492ac036d70000ul,0x43edad2cde516c93ul,0x9b778d4f09db8000ul,0xa6e594cfeee86b1dul,
0x6f130e73d3ccc000ul,0x449f1f44d6233c0dul,0x505a3450bc6f8000ul,0xa7596c0ec55ff55bul,
0x1adcf227bf134000ul,0x4550915ccdf50b87ul,0x9ec5b4d540ee8000ul,0xa7cd93b4e9653569ul,
0xc6a6d5dafe40c000ul,0x46020374c5c6db00ul,0x24da4dba360c0000ul,0xa8420bfa298f70d1ul,
0x7270b98eae618000ul,0x46b3758cbd98aa7aul,0x97a96426d40d0000ul,0xa8b6d5167b320e08ul,
0x1e3a9d422e714000ul,0x4764e7a4b56a79f4ul,0x3395e08087ab0000ul,0xa92bef41fa77771bul,
0xca0480f613f38000ul,0x481659bcad3c496dul,0x541e24ec6bc28000ul,0xa9a15ab4ea7c0ef8ul,
0x75ce64afc23d0000ul,0x48c7cbd4a50e18e7ul,0x26d192da39eb0000ul,0xaa1717a7b5693979ul,
0x2198485cf2fb8000ul,0x49793dec9cdfe861ul,0x76310121a7390000ul,0xaa8d2652ec907629ul,
0xcd622c10c3c04000ul,0x4a2ab00494b1b7daul,0x923d2e22a8dc8000ul,0xab0386ef48868de0ul,
0x792c0fc474b64000ul,0x4adc221c8c838754ul,0x658023b2ad3e8000ul,0xab7a39b5a93ed337ul,
0x24f5f377efd4c000ul,0x4b8d9434845556ceul,0xce6eb508ebd00000ul,0xabf13edf162675e8ul,
0xd0bfd72b52100000ul,0x4c3f064c7c272647ul,0x5e15b9a1deb88000ul,0xac6896a4be3fe929ul,
0x7c89badf08ee0000ul,0x4cf0786473f8f5c1ul,0xa6237303533c0000ul,0xace0413ff83e5d03ul,
0x28539e929a70c000ul,0x4da1ea7c6bcac53bul,0x4980a8c906560000ul,0xad583eea42a14ac6ul,
0xd41d824623f08000ul,0x4e535c94639c94b4ul,0xbd67b9843b68000ul,0xadd08fdd43d01491ul,
0x7fe765fab869c000ul,0x4f04ceac5b6e642eul,0x258dc0b576220000ul,0xae493452ca35b80eul,
0x2bb149ad58db4000ul,0x4fb640c4534033a8ul,0x2b0ae97541f50000ul,0xaec22c84cc5c9465ul,
0xd77b2d6113200000ul,0x5067b2dc4b120321ul,0xdf26101ced788000ul,0xaf3b78ad690a4374ul,
0x8345111491e74000ul,0x511924f442e3d29bul,0x5221c323176e8000ul,0xafb51906e75b8661ul,
0x2f0ef4c82638c000ul,0x51ca970c3ab5a215ul,0xb7ac952445280000ul,0xb02f0dcbb6e04583ul,
0xdad8d87baa78c000ul,0x527c09243287718eul,0x67c95709854f0000ul,0xb0a957366fb7a3c9ul,
0x86a2bc2f48738000ul,0x532d7b3c2a594108ul,0x87d037e971b28000ul,0xb123f581d2ac258ful,
0x326c9fe2dd254000ul,0x53deed54222b1082ul,0xe217d72c9ef20000ul,0xb19ee8e8c94feb08ul,
0xde3683969ebe8000ul,0x54905f6c19fcdffbul,0x7c38a6278c088000ul,0xb21a31a66618fe3bul,
0x8a00674a1a4b0000ul,0x5541d18411ceaf75ul,0x8546cb184a5a0000ul,0xb295cff5e47db4a3ul,
0x35ca4afdf8ecc000ul,0x55f3439c09a07eeful,0x3ecf14dcb6678000ul,0xb311c412a9112489ul,
0xe1942eb142784000ul,0x56a4b5b401724e68ul,0x8cda7939f2c58000ul,0xb38e0e38419fae17ul,
0x8d5e1268815b0000ul,0x575627cbf9441de2ul,0xe2b913df91110000ul,0xb40aaea2654b9840ul,
0x3927f6194b5e8000ul,0x580799e3f115ed5cul,0x4bd9aeb4e4bf0000ul,0xb487a58cf4a9c180ul,
};

/* table generated by search_alla2(256,15,"C15a2.h") */
static const uint64_t C2[4*256] = {
0xd5e4f1d9cbedb800ul,0x58b90bfbe8e7bcul,0xcf9d0da47dd48000ul,0x7fd3ab290e46d768ul,
0x5c3927f618648180ul,0x580799e3f115edul,0x6bc859752ccd0000ul,0x7fd403c37e8d53bbul,
0xe28d5e1264a03dc0ul,0x575627cbf9441dul,0x5a369cf3d3efc000ul,0x7fd45c5e2c3e2a09ul,
0x68e1942eb1330840ul,0x56a4b5b401724eul,0x90fba04ed79f0000ul,0x7fd4b4f9175984e4ul,
0xef35ca4afd8d3300ul,0x55f3439c09a07eul,0x23ad1a0e2ee00000ul,0x7fd50d943fdf8edful,
0x758a006748ee8ac0ul,0x5541d18411ceaful,0x4362c38766648000ul,0x7fd5662fa5d0728bul,
0xfbde368396624a40ul,0x54905f6c19fcdful,0x3eb66d51b03cc000ul,0x7fd5becb492c5a7bul,
0x82326c9fe2c2af80ul,0x53deed54222b10ul,0x81c413ba08b0c000ul,0x7fd6176729f37141ul,
0x886a2bc2ef7a540ul,0x532d7b3c2a5941ul,0x9629f3375f2cc000ul,0x7fd670034825e170ul,
0x8edad8d87b9c7b80ul,0x527c0924328771ul,0x23089cded4a54000ul,0x7fd6c89fa3c3d59bul,
0x152f0ef4c7f1c000ul,0x51ca970c3ab5a2ul,0xed030ad806830000ul,0x7fd7213c3ccd7853ul,
0x9b83451114655200ul,0x511924f442e3d2ul,0xd63eb4d165f20000ul,0x7fd779d91342f42dul,
0x21d77b2d60b7b2c0ul,0x5067b2dc4b1203ul,0xde63a4749f8ec000ul,0x7fd7d276272473bbul,
0xa82bb149ad2c0b80ul,0x4fb640c4534033ul,0x229c89db0fbc4000ul,0x7fd82b1378722191ul,
0x2e7fe765f9a5da00ul,0x4f04ceac5b6e64ul,0xdd96d00246308000ul,0x7fd883b1072c2840ul,
0xb4d41d8246106840ul,0x4e535c94639c94ul,0x6782b140970a0000ul,0x7fd8dc4ed352b25eul,
0x3b28539e926a1d00ul,0x4da1ea7c6bcac5ul,0x36134bb9ba410000ul,0x7fd934ecdce5ea7dul,
0xc17c89baded45780ul,0x4cf0786473f8f5ul,0xdc7eb5d379444000ul,0x7fd98d8b23e5fb30ul,
0x47d0bfd72b414b80ul,0x4c3f064c7c2726ul,0xb7e12aa6af48000ul,0x7fd9e629a8530f0dul,
0xce24f5f377afb9c0ul,0x4b8d9434845556ul,0x914da686bd870000ul,0x7fda3ec86a2d50a5ul,
0x54792c0fc4085100ul,0x4adc221c8c8387ul,0x59aceb510ec50000ul,0x7fda97676974ea8eul,
0xdacd622c106807c0ul,0x4a2ab00494b1b7ul,0x6ddea5075242c000ul,0x7fdaf006a62a075bul,
0x612198485cddb8c0ul,0x49793dec9cdfe8ul,0xf4a8f631c60ac000ul,0x7fdb48a6204cd1a0ul,
0xe775ce64a934c440ul,0x48c7cbd4a50e18ul,0x32557457f5708000ul,0x7fdba145d7dd73f3ul,
0x6dca0480f5b78b80ul,0x481659bcad3c49ul,0x88b13c75c9958000ul,0x7fdbf9e5ccdc18e6ul,
0xf41e3a9d42271080ul,0x4764e7a4b56a79ul,0x770d0770a9018000ul,0x7fdc5285ff48eb0ful,
0x7a7270b98e5e4b00ul,0x46b3758cbd98aaul,0x9a3d3e8ca4934000ul,0x7fdcab266f241502ul,
0xc6a6d5daf0c840ul,0x46020374c5c6dbul,0xac9a0fe1b2a1c000ul,0x7fdd03c71c6dc154ul,
0x871adcf2275e02c0ul,0x4550915ccdf50bul,0x85ff82d0f9810000ul,0x7fdd5c6807261a9aul,
0xd6f130e73a79fc0ul,0x449f1f44d6233cul,0x1bcd8c7a26840000ul,0x7fddb5092f4d4b69ul,
0x93c3492ac0193500ul,0x43edad2cde516cul,0x80e82430d4140000ul,0x7fde0daa94e37e55ul,
0x1a177f470c8708c0ul,0x433c3b14e67f9dul,0xe5b757f1fe3a8000ul,0x7fde664c37e8ddf4ul,
0xa06bb56358f0e240ul,0x428ac8fceeadcdul,0x982760d984a7c000ul,0x7fdebeee185d94dcul,
0x26bfeb7fa559e800ul,0x41d956e4f6dbfeul,0x3a8b797bb4d0000ul,0x7fdf17903641cda2ul,
0xad14219bf1c46000ul,0x4127e4ccff0a2eul,0xb13028e709134000ul,0x7fdf70329195b2daul,
0x336857b83e19d700ul,0x407672b507385ful,0x4736ea0194ca4000ul,0x7fdfc8d52a596f1cul,
0xb9bc8dd48a756020ul,0x3fc5009d0f668ful,0x89baad1700150000ul,0x7fe02178008d2cfcul,
0x4010c3f0d6f6c920ul,0x3f138e851794c0ul,0x5a3db5c230c04000ul,0x7fe07a1b14311711ul,
0xc664fa0d236269c0ul,0x3e621c6d1fc2f0ul,0xb7c6ed7f28614000ul,0x7fe0d2be654557f0ul,
0x4cb930296fd571c0ul,0x3db0aa5527f121ul,0xbee1f820e9990000ul,0x7fe12b61f3ca1a30ul,
0xd30d6645bc403760ul,0x3cff383d301f51ul,0xa99f48476c230000ul,0x7fe18405bfbf8867ul,
0x59619c6208a69880ul,0x3c4dc625384d82ul,0xcf9433d59eafc000ul,0x7fe1dca9c925cd2bul,
0xdfb5d27e54feb980ul,0x3b9c540d407bb2ul,0xa5db0867771ec000ul,0x7fe2354e0ffd1313ul,
0x660a089aa171e460ul,0x3aeae1f548a9e3ul,0xbf131fc810b64000ul,0x7fe28df2944584b5ul,
0xec5e3eb6edd856e0ul,0x3a396fdd50d813ul,0xcb60f467d8ec4000ul,0x7fe2e69755ff4ca8ul,
0x72b274d33a427fc0ul,0x3987fdc5590644ul,0x986e35d2c9d7c000ul,0x7fe33f3c552a9583ul,
0xf906aaef86984a00ul,0x38d68bad613474ul,0x1169dd26b345c000ul,0x7fe397e191c789ddul,
0x7f5ae10bd314f1e0ul,0x382519956962a5ul,0x3f084189918f0000ul,0x7fe3f0870bd6544cul,
0x5af17281f53f3e0ul,0x3773a77d7190d6ul,0x47832c9ff3540000ul,0x7fe4492cc3571f68ul,
0x8c034d446bdc0740ul,0x36c2356579bf06ul,0x6e99ef036c294000ul,0x7fe4a1d2b84a15c8ul,
0x12578360b8386ac0ul,0x3610c34d81ed37ul,0x159174b9172b0000ul,0x7fe4fa78eaaf6204ul,
0x98abb97d04731400ul,0x355f51358a1b67ul,0xbb3459a826100000ul,0x7fe5531f5a872eb2ul,
0x1effef9951194600ul,0x34addf1d924998ul,0xfbd2fe107f260000ul,0x7fe5abc607d1a66bul,
0xa55425b59cecfc80ul,0x33fc6d059a77c8ul,0x91439b016aa6c000ul,0x7fe6046cf28ef3c7ul,
0x2ba85bd1e9e5b940ul,0x334afaeda2a5f9ul,0x52e256d04a954000ul,0x7fe65d141abf415dul,
0xb1fc91ee3643d640ul,0x329988d5aad429ul,0x3591598f66bfc000ul,0x7fe6b5bb8062b9c5ul,
0x3850c80a82b88a20ul,0x31e816bdb3025aul,0x4bb8e184c0680000ul,0x7fe70e6323798797ul,
0xbea4fe26ce8000c0ul,0x3136a4a5bb308aul,0xc54757a0f920c000ul,0x7fe7670b0403d56bul,
0x44f934431b8bbb40ul,0x3085328dc35ebbul,0xefb163f643d34000ul,0x7fe7bfb32201cddaul,
0xcb4d6a5f67e81fa0ul,0x2fd3c075cb8cebul,0x35f2022f69558000ul,0x7fe8185b7d739b7dul,
0x51a1a07bb458e9e0ul,0x2f224e5dd3bb1cul,0x208a9606d495c000ul,0x7fe87104165968ebul,
0xd7f5d69800c29340ul,0x2e70dc45dbe94cul,0x5582ffbdb20e0000ul,0x7fe8c9acecb360bdul,
0x5e4a0cb44d2e99c0ul,0x2dbf6a2de4177dul,0x9869b0931b1a0000ul,0x7fe922560081ad8cul,
0xe49e42d099901da0ul,0x2d0df815ec45adul,0xca53bf3b501c8000ul,0x7fe97aff51c479f1ul,
0x6af278ece5feba60ul,0x2c5c85fdf473deul,0xe9dcfc5700990000ul,0x7fe9d3a8e07bf085ul,
0xf146af09326580c0ul,0x2bab13e5fca20eul,0x132806eaa1c30000ul,0x7fea2c52aca83be2ul,
0x779ae5257ebcd6c0ul,0x2af9a1ce04d03ful,0x7fde60d5d2f78000ul,0x7fea84fcb649869ful,
0xfdef1b41cb1d3160ul,0x2a482fb60cfe6ful,0x8730834ad079c000ul,0x7feadda6fd5ffb57ul,
0x8443515e17472c40ul,0x2996bd9e152ca0ul,0x9dd5f345f4a50000ul,0x7feb365181ebc4a3ul,
0xa97877a6403f720ul,0x28e54b861d5ad1ul,0x560d560546620000ul,0x7feb8efc43ed0d1dul,
0x90ebbd96b06f3560ul,0x2833d96e258901ul,0x5f9c858017d74000ul,0x7febe7a74363ff5eul,
0x173ff3b2fccef400ul,0x278267562db732ul,0x87d0a4deb0828000ul,0x7fec40528050c600ul,
0x9d9429cf4933b380ul,0x26d0f53e35e562ul,0xb97e34f2079dc000ul,0x7fec98fdfab38b9dul,
0x23e85feb95a008e0ul,0x261f83263e1393ul,0xfd0128ab8bf08000ul,0x7fecf1a9b28c7acful,
0xaa3c9607e1ffa1a0ul,0x256e110e4641c3ul,0x783cf994f9e94000ul,0x7fed4a55a7dbbe31ul,
0x3090cc242e695120ul,0x24bc9ef64e6ff4ul,0x6e9cbc483fc18000ul,0x7feda301daa1805cul,
0xb6e502407adf9cc0ul,0x240b2cde569e24ul,0x411334e770128000ul,0x7fedfbae4addebebul,
0x3d39385cc7397460ul,0x2359bac65ecc55ul,0x6e1aeb94c2860000ul,0x7fee545af8912b78ul,
0xc38d6e7913a93a20ul,0x22a848ae66fa85ul,0x91b640eaa2680000ul,0x7feead07e3bb699eul,
0x49e1a49560136ca0ul,0x21f6d6966f28b6ul,0x656f8273cc00c000ul,0x7fef05b50c5cd0f8ul,
0xd035dab1ac78d8a0ul,0x2145647e7756e6ul,0xc058ff2377954000ul,0x7fef5e6272758c20ul,
0x568a10cdf8deacc0ul,0x2093f2667f8517ul,0x970d1bcd92d90000ul,0x7fefb7101605c5b2ul,
0xdcde46ea44d98a30ul,0x1fe2804e87b347ul,0xfbae679f08be8000ul,0x7ff00fbdf70da848ul,
0x63327d0691ab8350ul,0x1f310e368fe178ul,0x1de7b096162ec000ul,0x7ff0686c158d5e7ful,
0xe986b322de1b81a0ul,0x1e7f9c1e980fa8ul,0x4aec17fab0140000ul,0x7ff0c11a718512f0ul,
0x6fdae93f2a86f540ul,0x1dce2a06a03dd9ul,0xed7726d6f3784000ul,0x7ff119c90af4f037ul,
0xf62f1f5b76ee9b20ul,0x1d1cb7eea86c09ul,0x8dcce26fa6d64000ul,0x7ff17277e1dd20f1ul,
0x7c835577c35777f0ul,0x1c6b45d6b09a3aul,0xd1b9e0bcc8710000ul,0x7ff1cb26f63dcfb8ul,
0x2d78b940fbb4370ul,0x1bb9d3beb8c86bul,0x7c935ce22b140000ul,0x7ff223d648172729ul,
0x892bc1b05c276ab0ul,0x1b0861a6c0f69bul,0x6f374ba820ecc000ul,0x7ff27c85d76951dful,
0xf7ff7cca8892ed0ul,0x1a56ef8ec924ccul,0xa80c6ff434be4000ul,0x7ff2d535a4347a76ul,
0x95d42de8f4d68700ul,0x19a57d76d152fcul,0x43026f41f116c000ul,0x7ff32de5ae78cb8bul,
0x1c28640541545180ul,0x18f40b5ed9812dul,0x7991e61bb5a78000ul,0x7ff38695f6366fb9ul,
0xa27c9a218dbc48b0ul,0x18429946e1af5dul,0xa2bc7c939b5d4000ul,0x7ff3df467b6d919dul,
0x28d0d03dda2e9a20ul,0x1791272ee9dd8eul,0x330cfabc65c3c000ul,0x7ff437f73e1e5bd4ul,
0xaf25065a2697de30ul,0x16dfb516f20bbeul,0xbc975d22835fc000ul,0x7ff490a83e48f8f9ul,
0x35793c7672ff41d0ul,0x162e42fefa39eful,0xeef8e9451bc5c000ul,0x7ff4e9597bed93aaul,
0xbbcd7292bf63d4b0ul,0x157cd0e702681ful,0x9758420f2c1a0000ul,0x7ff5420af70c5684ul,
0x4221a8af0bc81ea0ul,0x14cb5ecf0a9650ul,0xa0657c50b1aa4000ul,0x7ff59abcafa56c23ul,
0xc875decb58320a50ul,0x1419ecb712c480ul,0x125a3337e2be4000ul,0x7ff5f36ea5b8ff25ul,
0x4eca14e7a49e3960ul,0x13687a9f1af2b1ul,0x12f99cca759f8000ul,0x7ff64c20d9473a26ul,
0xd51e4b03f10457b0ul,0x12b708872320e1ul,0xe5909e5ef5c98000ul,0x7ff6a4d34a5047c3ul,
0x5b7281203d6c0160ul,0x1205966f2b4f12ul,0xeaf5e1162742c000ul,0x7ff6fd85f8d4529bul,
0xe1c6b73c89d74ad0ul,0x11542457337d42ul,0xa189e654783c0000ul,0x7ff75638e4d3854bul,
0x681aed58d6368270ul,0x10a2b23f3bab73ul,0xa5371c3b80dc0000ul,0x7ff7aeec0e4e0a70ul,
0xee6f237522a84420ul,0xff1402743d9a3ul,0xaf71f22391164000ul,0x7ff8079f75440ca8ul,
0x74c359916f0f6198ul,0xf3fce0f4c07d4ul,0x9738ed154d080000ul,0x7ff8605319b5b691ul,
0xfb178fadbb77cc38ul,0xe8e5bf7543604ul,0x5114bc43571f0000ul,0x7ff8b906fba332c9ul,
0x816bc5ca07df7c60ul,0xddce9df5c6435ul,0xef184d8408bf8000ul,0x7ff911bb1b0cabedul,
0x7bffbe65447f8a8ul,0xd2b77c7649266ul,0xa0e0e1cb38f74000ul,0x7ff96a6f77f24c9dul,
0x8e143202a0ac0a60ul,0xc7a05af6cc096ul,0xb39621a4116fc000ul,0x7ff9c32412543f76ul,
0x1468681eed15b660ul,0xbc8939774eec7ul,0x91ea31aaf181c000ul,0x7ffa1bd8ea32af17ul,
0x9abc9e3b397f0970ul,0xb17217f7d1cf7ul,0xc419c7075f94c000ul,0x7ffa748dff8dc61eul,
0x2110d45785e2d120ul,0xa65af67854b28ul,0xefec3be608980000ul,0x7ffacd435265af2aul,
0xa7650a73d24dd200ul,0x9b43d4f8d7958ul,0xd8b3a3f2cdacc000ul,0x7ffb25f8e2ba94daul,
0x2db940901eb80cf0ul,0x902cb3795a789ul,0x5f4ce0d2e01e0000ul,0x7ffb7eaeb08ca1cdul,
0xb40d76ac6b17abe8ul,0x851591f9dd5b9ul,0x821fb69eeb6d0000ul,0x7ffbd764bbdc00a1ul,
0x3a61acc8b78827c0ul,0x79fe707a603eaul,0x5d1ee05d4d854000ul,0x7ffc301b04a8dbf6ul,
0xc0b5e2e503efb620ul,0x6ee74efae321aul,0x29c8247c5d630000ul,0x7ffc88d18af35e6bul,
0x470a190150569d54ul,0x63d02d7b6604bul,0x3f24694cbf928000ul,0x7ffce1884ebbb29ful,
0xcd5e4f1d9cbff79cul,0x58b90bfbe8e7bul,0x11c7c97bc9204000ul,0x7ffd3a3f50020332ul,
0x53b28539e926ff40ul,0x4da1ea7c6bcacul,0x33d1a88df0a8c000ul,0x7ffd92f68ec67ac3ul,
0xda06bb56358ff600ul,0x428ac8fceeadcul,0x54ecc7594d904000ul,0x7ffdebae0b0943f2ul,
0x605af17281f63a94ul,0x3773a77d7190dul,0x424f5880257dc000ul,0x7ffe4465c4ca895ful,
0xe6af278ece5f2134ul,0x2c5c85fdf473dul,0xe6bb14eb87f58000ul,0x7ffe9d1dbc0a75a9ul,
0x6d035dab1ac721aaul,0x2145647e7756eul,0x4a7d5045f8384000ul,0x7ffef5d5f0c93372ul,
0xf35793c7672fef9ful,0x162e42fefa39eul,0x936f0d7625440000ul,0x7fff4e8e6306ed58ul,
0x79abc9e3b397900dul,0xb17217f7d1cful,0x4f51319b0124000ul,0x7fffa74712c3cdfdul,
0x0ul,0x0ul,0x0ul,0x8000000000000000ul,
0x79abc9e3b3987ff5ul,0xb17217f7d1cful,0x30c5fa5256f8000ul,0x800058b92abbae02ul,
0xf35793c76730e7bdul,0x162e42fefa39eul,0xaa22beacca950000ul,0x8000b17292f702a3ul,
0x6d035dab1ac89798ul,0x2145647e7756eul,0xaed7bf5d327a8000ul,0x80010a2c38b22885ul,
0xe6af278ece602818ul,0x2c5c85fdf473dul,0xe84c2e1a46348000ul,0x800162e61bed4a48ul,
0x605af17281f846a0ul,0x3773a77d7190dul,0x4b2d15e0b0480000ul,0x8001bba03ca8928eul,
0xda06bb56359a0a84ul,0x428ac8fceeadcul,0xe9b3d4c106478000ul,0x8002145a9ae42bf6ul,
0x53b28539e928b02cul,0x4da1ea7c6bcacul,0xf3a6305b00870000ul,0x80026d1536a04123ul,
0xcd5e4f1d9cc2a34cul,0x58b90bfbe8e7bul,0xb6566a58c04a0000ul,0x8002c5d00fdcfcb6ul,
0x470a19015058ca38ul,0x63d02d7b6604bul,0x9ca354ea23bf0000ul,0x80031e8b269a8950ul,
0xc0b5e2e503f0f854ul,0x6ee74efae321aul,0x2ef8674028830000ul,0x800377467ad91193ul,
0x3a61acc8b78878b8ul,0x79fe707a603eaul,0x134dd2085c278000ul,0x8003d0020c98c020ul,
0xb40d76ac6b209a98ul,0x851591f9dd5b9ul,0xd2893e85b000000ul,0x800428bddbd9bf99ul,
0x2db940901eb92d28ul,0x902cb3795a789ul,0xfd9a8df95d190000ul,0x80048179e89c3a9ful,
0xa7650a73d251d6b8ul,0x9b43d4f8d7958ul,0xe3429843d1650000ul,0x8004da3632e05bd6ul,
0x2110d45785eb3360ul,0xa65af67854b28ul,0xda4c963b071c0000ul,0x800532f2baa64ddful,
0x9abc9e3b3984a7d8ul,0xb17217f7d1cf7ul,0x1c718b38e54c0000ul,0x80058baf7fee3b5dul,
0x1468681eed1dd470ul,0xbc8939774eec7ul,0xf7aef9b09e0000ul,0x8005e46c82b84ef1ul,
0x8e143202a0b294e8ul,0xc7a05af6cc096ul,0xfcb28217df4b0000ul,0x80063d29c304b33dul,
0x7bffbe6544e7818ul,0xd2b77c7649266ul,0xa202e287fb4f8000ul,0x800695e740d392e6ul,
0x816bc5ca07e29fc8ul,0xddce9df5c6435ul,0xa0d7201492b30000ul,0x8006eea4fc25188dul,
0xfb178fadbb7ced58ul,0xe8e5bf7543604ul,0xc6ab10da36330000ul,0x80074762f4f96ed5ul,
0x74c359916f1071f0ul,0xf3fce0f4c07d4ul,0xfe8825c385e98000ul,0x8007a0212b50c061ul,
0xee6f237522ab02f8ul,0xff1402743d9a3ul,0x51057f054c5d0000ul,0x8007f8df9f2b37d5ul,
0x681aed58d645ead0ul,0x10a2b23f3bab73ul,0xe448009aa7910000ul,0x8008519e5088ffd2ul,
0xe1c6b73c89dd9850ul,0x11542457337d42ul,0xfc0266c1406d0000ul,0x8008aa5d3f6a42fdul,
0x5b7281203d713eb0ul,0x1205966f2b4f12ul,0xf9755a75904a8000ul,0x8009031c6bcf2bf9ul,
0xd51e4b03f10b5050ul,0x12b708872320e1ul,0x5b6f85ef34ba8000ul,0x80095bdbd5b7e56aul,
0x4eca14e7a4a8c3a0ul,0x13687a9f1af2b1ul,0xbe4da91d516d8000ul,0x8009b49b7d2499f2ul,
0xc875decb58390aa0ul,0x1419ecb712c480ul,0xdbfaae23005b0000ul,0x800a0d5b62157436ul,
0x4221a8af0bd1a680ul,0x14cb5ecf0a9650ul,0x8befbdd3d0360000ul,0x800a661b848a9edaul,
0xbbcd7292bf795000ul,0x157cd0e702681ful,0xc334543050e08000ul,0x800abedbe4844481ul,
0x35793c7673029850ul,0x162e42fefa39eful,0x945e54e2ae1a0000ul,0x800b179c82028fd0ul,
0xaf25065a269adfc0ul,0x16dfb516f20bbeul,0x2f921fbb58bb8000ul,0x800b705d5d05ab6bul,
0x28d0d03dda3ab640ul,0x1791272ee9dd8eul,0xe282a52dbd978000ul,0x800bc91e758dc1f5ul,
0xa27c9a218dca6b00ul,0x18429946e1af5dul,0x18717acd0ae78000ul,0x800c21dfcb9afe15ul,
0x1c2864054160c350ul,0x18f40b5ed9812dul,0x5a2eefc903fa0000ul,0x800c7aa15f2d8a6dul,
0x95d42de8f4fad480ul,0x19a57d76d152fcul,0x4e1a216ae2d08000ul,0x800cd363304591a3ul,
0xf7ff7cca89cd720ul,0x1a56ef8ec924ccul,0xb8210f9248258000ul,0x800d2c253ee33e5bul,
0x892bc1b05c28f0b0ul,0x1b0861a6c0f69bul,0x79c0b13239810000ul,0x800d84e78b06bb3bul,
0x2d78b940fc1ca70ul,0x1bb9d3beb8c86bul,0x920508ce2dc68000ul,0x800dddaa14b032e7ul,
0x7c835577c35b05c0ul,0x1c6b45d6b09a3aul,0x1d8938f7278d8000ul,0x800e366cdbdfd005ul,
0xf62f1f5b76f652d0ul,0x1d1cb7eea86c09ul,0x567798c8de040000ul,0x800e8f2fe095bd39ul,
0x6fdae93f2a8b30d0ul,0x1dce2a06a03dd9ul,0x9489c866f3da0000ul,0x800ee7f322d22529ul,
0xe986b322de283460ul,0x1e7f9c1e980fa8ul,0x4d08c57a3c7d8000ul,0x800f40b6a295327bul,
0x63327d0691c9cfb0ul,0x1f310e368fe178ul,0x12ccffae0f650000ul,0x800f997a5fdf0fd4ul,
0xdcde46ea45ad7130ul,0x1fe2804e87b347ul,0x963e6d2da9cc0000ul,0x800ff23e5aafe7d9ul,
0x568a10cdf91a24e0ul,0x2093f2667f8517ul,0xa5549f219dde0000ul,0x80104b029307e531ul,
0xd035dab1ac920740ul,0x2145647e7756e6ul,0x2b96d62d51ca0000ul,0x8010a3c708e73282ul,
0x49e1a49560205d80ul,0x21f6d6966f28b6ul,0x321c16ec8b180000ul,0x8010fc8bbc4dfa71ul,
0xc38d6e7913b883e0ul,0x22a848ae66fa85ul,0xdf8b3e71093b0000ul,0x80115550ad3c67a4ul,
0x3d39385cc756e600ul,0x2359bac65ecc55ul,0x781b16c02e380000ul,0x8011ae15dbb2a4c3ul,
0xb6e502407aeced60ul,0x240b2cde569e24ul,0x5d926b50b5668000ul,0x801206db47b0dc73ul,
0x3090cc242e7cc500ul,0x24bc9ef64e6ff4ul,0xf481d88787d0000ul,0x80125fa0f137395bul,
0xaa3c9607e216e8c0ul,0x256e110e4641c3ul,0x2a23393a42c28000ul,0x8012b866d845e621ul,
0x23e85feb95b56e40ul,0x261f83263e1393ul,0x689b0923b2630000ul,0x8013112cfcdd0d6cul,
0x9d9429cf4945e7a0ul,0x26d0f53e35e562ul,0xa2b72b6b280f8000ul,0x801369f35efcd9e3ul,
0x173ff3b2fce2cbc0ul,0x278267562db732ul,0xce0fa61dc4ea0000ul,0x8013c2b9fea5762dul,
0x90ebbd96b0806ca0ul,0x2833d96e258901ul,0xfdccfbad765f8000ul,0x80141b80dbd70cf1ul,
0xa97877a640f41e0ul,0x28e54b861d5ad1ul,0x62a83f6f10710000ul,0x80147447f691c8d7ul,
0x8443515e17a183e0ul,0x2996bd9e152ca0ul,0x4aeb2a1876328000ul,0x8014cd0f4ed5d485ul,
0xfdef1b41cb3b1280ul,0x2a482fb60cfe6ful,0x22702e3ed0538000ul,0x801525d6e4a35aa3ul,
0x779ae5257ede7cc0ul,0x2af9a1ce04d03ful,0x72a28cd4d1fa8000ul,0x80157e9eb7fa85d8ul,
0xf146af09326d2680ul,0x2bab13e5fca20eul,0xe27e69a90bbe8000ul,0x8015d766c8db80ccul,
0x6af278ece61858a0ul,0x2c5c85fdf473deul,0x3690dfe44d1d8000ul,0x8016302f17467628ul,
0xe49e42d0999a7580ul,0x2d0df815ec45adul,0x50f81688138b8000ul,0x801688f7a33b9092ul,
0x5e4a0cb44da0a820ul,0x2dbf6a2de4177dul,0x316354ed08ce8000ul,0x8016e1c06cbafab3ul,
0xd7f5d69800cb2240ul,0x2e70dc45dbe94cul,0xf51317418d5a0000ul,0x80173a8973c4df32ul,
0x51a1a07bb46ead80ul,0x2f224e5dd3bb1cul,0xd6d9230854c08000ul,0x80179352b85968b9ul,
0xcb4d6a5f682f7f20ul,0x2fd3c075cb8cebul,0x2f189b970bc58000ul,0x8017ec1c3a78c1f0ul,
0x44f934431b948900ul,0x3085328dc35ebbul,0x73c616950fa10000ul,0x801844e5fa23157eul,
0xbea4fe26cf2c5280ul,0x3136a4a5bb308aul,0x3867b07a33408000ul,0x80189daff7588e0dul,
0x3850c80a82d9c000ul,0x31e816bdb3025aul,0x2e15210d91508000ul,0x8018f67a32195645ul,
0xb1fc91ee3663c0c0ul,0x329988d5aad429ul,0x2377cfe46d9c8000ul,0x80194f44aa6598cful,
0x2ba85bd1e9f33c00ul,0x334afaeda2a5f9ul,0x4cae8e1249b0000ul,0x8019a80f603d8054ul,
0xa55425b59d905aa0ul,0x33fc6d059a77c8ul,0xdbdb70b228ae0000ul,0x801a00da53a1377cul,
0x1effef995125cde0ul,0x34addf1d924998ul,0xd00859510ddb8000ul,0x801a59a58490e8f2ul,
0x98abb97d060dc700ul,0x355f51358a1b67ul,0x26429681a4800000ul,0x801ab270f30cbf5ful,
0x12578360b8539840ul,0x3610c34d81ed37ul,0x410d32511e0f8000ul,0x801b0b3c9f14e56bul,
0x8c034d446beb0820ul,0x36c2356579bf06ul,0xa07d61954a088000ul,0x801b640888a985c0ul,
0x5af17281f84ed40ul,0x3773a77d7190d6ul,0xe23a986bd3e80000ul,0x801bbcd4afcacb08ul,
0x7f5ae10bd31c6180ul,0x382519956962a5ul,0xc17e9eb999310000ul,0x801c15a11478dfedul,
0xf906aaef86ba3540ul,0x38d68bad613474ul,0x1715a4aa09c38000ul,0x801c6e6db6b3ef19ul,
0x72b274d33a4bb6a0ul,0x3987fdc5590644ul,0xd95e572e96f28000ul,0x801cc73a967c2334ul,
0xec5e3eb6edfdd460ul,0x3a396fdd50d813ul,0x1c49f47e31118000ul,0x801d2007b3d1a6ebul,
0x660a089aa189e300ul,0x3aeae1f548a9e3ul,0x115c6094d2b00000ul,0x801d78d50eb4a4e6ul,
0xdfb5d27e551c56e0ul,0x3b9c540d407bb2ul,0x7ac39b31ad78000ul,0x801dd1a2a72547d0ul,
0x59619c6208ac16e0ul,0x3c4dc625384d82ul,0x6be2ecddf4b70000ul,0x801e2a707d23ba53ul,
0xd30d6645bc4dbfe0ul,0x3cff383d301f51ul,0xc83cca5e4e020000ul,0x801e833e90b0271aul,
0x4cb930296fe62460ul,0x3db0aa5527f121ul,0xc4891a40db348000ul,0x801edc0ce1cab8d0ul,
0xc664fa0d237fa880ul,0x3e621c6d1fc2f0ul,0x262a30d5ea5e0000ul,0x801f34db70739a20ul,
0x4010c3f0d711aee0ul,0x3f138e851794c0ul,0xd015833143db0000ul,0x801f8daa3caaf5b3ul,
0xb9bc8dd48afeb460ul,0x3fc5009d0f668ful,0xc2d3bbaa199f8000ul,0x801fe6794670f636ul,
0x336857b83eb7a940ul,0x407672b507385ful,0x1c80ce5b03c98000ul,0x80203f488dc5c654ul,
0xad14219bf1f55b80ul,0x4127e4ccff0a2eul,0x18cc0da20cb48000ul,0x8020981812a990b7ul,
0x26bfeb7fa56d9e80ul,0x41d956e4f6dbfeul,0x10f83ea0cb008000ul,0x8020f0e7d51c800bul,
0xa06bb5635901a4c0ul,0x428ac8fceeadcdul,0x7bdbadbc888b0000ul,0x802149b7d51ebefbul,
0x1a177f470ca42340ul,0x433c3b14e67f9dul,0xede0431e78fa0000ul,0x8021a28812b07833ul,
0x93c3492ac0371cc0ul,0x43edad2cde516cul,0x19039733fdf88000ul,0x8021fb588dd1d660ul,
0xd6f130e73e7dd40ul,0x449f1f44d6233cul,0xccd7072ef9e80000ul,0x802254294683042bul,
0x871adcf227658180ul,0x4550915ccdf50bul,0xf67fc98630350000ul,0x8022acfa3cc42c42ul,
0xc6a6d5db132100ul,0x46020374c5c6dbul,0xa0b70275b4df8000ul,0x802305cb70957951ul,
0x7a7270b98e96c440ul,0x46b3758cbd98aaul,0xf3c9d87f68e78000ul,0x80235e9ce1f71603ul,
0xf41e3a9d422f9d40ul,0x4764e7a4b56a79ul,0x359988eb86538000ul,0x8023b76e90e92d06ul,
0x6dca0480f63bac80ul,0x481659bcad3c49ul,0xc99b7c4939848000ul,0x802410407d6be904ul,
0xe775ce64a95ca7c0ul,0x48c7cbd4a50e18ul,0x30d95aef480f8000ul,0x80246912a77f74acul,
0x612198485cf6dd40ul,0x49793dec9cdfe8ul,0x9f1217cc8fb0000ul,0x8024c1e50f23faa9ul,
0xdacd622c10a65700ul,0x4a2ab00494b1b7ul,0x11153559e6ac8000ul,0x80251ab7b459a5a8ul,
0x54792c0fc421cfc0ul,0x4adc221c8c8387ul,0x200c7938b2440000ul,0x8025738a9720a056ul,
0xce24f5f377ba9580ul,0x4b8d9434845556ul,0x2e326196047c0000ul,0x8025cc5db7791560ul,
0x47d0bfd72bbd3880ul,0x4c3f064c7c2726ul,0x5077093a6c300000ul,0x8026253115632f73ul,
0xc17c89badeede6c0ul,0x4cf0786473f8f5ul,0xb95f45bb2aa70000ul,0x80267e04b0df193cul,
0x3b28539e92936f80ul,0x4da1ea7c6bcac5ul,0xb904bbfb40dc8000ul,0x8026d6d889ecfd69ul,
0xb4d41d82467ce880ul,0x4e535c94639c94ul,0xbd15f4ac86fc0000ul,0x80272faca08d06a7ul,
0x2e7fe765f9c01880ul,0x4f04ceac5b6e64ul,0x50d670d0d4700000ul,0x80278880f4bf5fa4ul,
0xa82bb149ad6e5880ul,0x4fb640c4534033ul,0x1d1ebe3b37230000ul,0x8027e1558684330dul,
0x21d77b2d60eb6cc0ul,0x5067b2dc4b1203ul,0xe85c8c1135c70000ul,0x80283a2a55dbab8ful,
0x9b834511147d6300ul,0x511924f442e3d2ul,0x9692bf4c23710000ul,0x802892ff62c5f3daul,
0x152f0ef4c8326d40ul,0x51ca970c3ab5a2ul,0x2959873a7f958000ul,0x8028ebd4ad43369bul,
0x8edad8d87bb23cc0ul,0x527c0924328771ul,0xbfde720164b18000ul,0x802944aa35539e7ful,
0x886a2bc2f53a840ul,0x532d7b3c2a5941ul,0x96e4811e05cc8000ul,0x80299d7ffaf75636ul,
0x82326c9fe2dfb0c0ul,0x53deed54222b10ul,0x8c43de739078000ul,0x8029f655fe2e886eul,
0xfbde368396776340ul,0x54905f6c19fcdful,0x8d6bce0f11748000ul,0x802a4f2c3ef95fd4ul,
0x758a00674a8f7d80ul,0x5541d18411ceaful,0xba5f082486af8000ul,0x802aa802bd580718ul,
0xef35ca4afdbf3300ul,0x55f3439c09a07eul,0x42b7881529978000ul,0x802b00d9794aa8e9ul,
0x68e1942eb1d9d440ul,0x56a4b5b401724eul,0xf724c3aeeae50000ul,0x802b59b072d16ff4ul,
0xe28d5e1266aa2880ul,0x575627cbf9441dul,0xc5ec1f21eac68000ul,0x802bb287a9ec86eaul,
0x5c3927f618e79340ul,0x580799e3f115edul,0xbae9018258d18000ul,0x802c0b5f1e9c1879ul,
};

typedef struct {
  int sign;         /* 1 bit */
  int exp;          /* unbiased exponent (15 bits) */
  uint64_t mant[3]; /* significand (with explicit leading bit)
                       shifted to the left (msb) in mant[0-1].
                       mant[2] is kept for left shift. */
} binary128_struct;
typedef binary128_struct binary128_t[1];

#define BIAS 16382

/* little endian version */
static void
extract_binary128 (binary128_t s, _Float128 x)
{
  uint64_t *p = (uint64_t*) &x;
  /* p[1] contains 1 bit of sign, 15 bits of exponent, 48 bits of significand,
     p[0] contains the low 64 bit of significand */
  s->sign = (p[1] >> 63) ? -1 : 1;
  int biased_exp = (p[1] >> 48) & 0x7fff;
  s->exp = biased_exp - BIAS;
  if (biased_exp == 0) /* subnormal numbers */
    s->mant[1] = ((0xffffffffffff & p[1]) << 15) + (p[0] >> 49);
  else
    s->mant[1] = (((1UL << 48) | p[1]) << 15) + (p[0] >> 49);
  s->mant[0] = p[0] << 15;
}

static void
normalize (binary128_t s)
{
  int cnt;
  if (s->mant[1] != 0)
    {
      cnt = __builtin_clzl (s->mant[1]);
      if (cnt)
        {
          s->mant[1] = (s->mant[1] << cnt) | (s->mant[0] >> (64 - cnt));
          s->mant[0] = s->mant[0] << cnt;
          s->exp -= cnt;
        }
    }
  else if (s->mant[0] != 0)
    {
      cnt = __builtin_clzl (s->mant[0]);
      s->mant[1] = s->mant[0] << cnt;
      s->exp -= 64 + cnt;
    }
  else
    {
      /* if 0, nothing to do, we force to the smallest exponent */
      s->exp = -BIAS;
    }
}

#if 0
#include <gmp.h>
void
print_binary128 (binary128_t s)
{
  gmp_printf ("(%d,%d,%Nd)\n", s->sign, s->exp, s->mant, 2);
}
#endif

/* align to exponent 0 */
static void
align_binary128 (binary128_t s)
{
  assert (s->exp <= 0);
  int e = -s->exp;
  /* shift the significand by e bits to the right */
  if (e < 64)
    {
      if (e > 0)
        {
          s->mant[0] = (s->mant[1] << (64 - e)) | (s->mant[0] >> e);
          s->mant[1] = s->mant[1] >> e;
        }
    }
  else
    {
      if (e == 64)
        s->mant[0] = s->mant[1];
      else if (e < 128)
        s->mant[0] = s->mant[1] >> (e - 64);
      else
        s->mant[0] = 0;
      s->mant[1] = 0;
    }
  s->exp = 0; /* useless */
}

/* {r,2} -> a * b */
static void
mul1 (uint64_t *r, uint64_t a, uint64_t b)
{
  r[0] = _mulx_u64 (a, b, (unsigned long long*) r + 1);
}

/* Addition with carry (detected by GCC and other good compilers). */
#define ADD_LIMB(u,v,c) ((u) += (v), (c) = (u) < (v))

/* {r,2} -> high({a,2} * {b,2}), ignoring a[0]*b[0], and the carries
   from a[0]*b[1] and a[1]*b[0] */
static void
mul2h (uint64_t *r, uint64_t *a, uint64_t *b)
{
  mul1 (r, a[1], b[1]);
  long long unsigned int t;
  uint64_t cy;
  _mulx_u64 (a[0], b[1], &t);
  ADD_LIMB(r[0],t,cy);
  r[1] += cy;
  _mulx_u64 (a[1], b[0], &t);
  ADD_LIMB(r[0],t,cy);
  r[1] += cy;
}

static void
mul1h (uint64_t *r, uint64_t *a, uint64_t *b)
{
  mul1 (r, a[1], b[1]);
}

/* compare {a,2} and {b,2} */
static inline int
cmp2 (uint64_t *a, uint64_t *b)
{
  if (a[1] > b[1])
    return 1;
  else if (a[1] < b[1])
    return -1;
  else
    return (a[0] > b[0]) ? 1 : (a[0] == b[0]) ? 0 : -1;
}

/* compare {a,3} and {b,3} */
static inline int
cmp3 (uint64_t *a, uint64_t *b)
{
  if (a[2] > b[2])
    return 1;
  else if (a[2] < b[2])
    return -1;
  else /* a[2] == b[2] */
    return cmp2 (a, b);
}

/* {r,2} -> {a,2} + {b,2}, assume no carry */
static void
add2 (uint64_t *r, uint64_t *a, uint64_t *b)
{
  uint64_t t = a[0]; /* save in case r=a */
  r[0] = a[0] + b[0];
  r[1] = a[1] + b[1] + (r[0] < t);
}

/* {r,2} -> {a,2} - {b,2}, assume {a,2} >= {b,2} (no borrow) */
static void
sub2 (uint64_t *r, uint64_t *a, uint64_t *b)
{
  /* warning: we might have r = a or r = b */
  uint64_t cy = b[0] > a[0];
  r[0] = a[0] - b[0];
  r[1] = a[1] - b[1] - cy;
}

/* assume a and c have same sign, same exponent */
static void
sub_inplace (binary128_t a, binary128_t c)
{
  assert (a->exp == c->exp);
  if (cmp2 (a->mant, c->mant) >= 0)
    sub2 (a->mant, a->mant, c->mant);
  else
    {
      sub2 (a->mant, c->mant, a->mant);
      a->sign = -a->sign;
    }
}

/* a <- b + c, assume sign(c) = 1, and no carry */
static void
addu (binary128_t a, binary128_t b, uint64_t *c)
{
  if (b->sign == 1)
    {
      add2 (a->mant, b->mant, c);
      a->sign = 1;
    }
  else
    {
      if (cmp2 (b->mant, c) >= 0)
        {
          /* |b| >= |c| */
          sub2 (a->mant, b->mant, c);
          a->sign = -1;
        }
      else
        {
          sub2 (a->mant, c, b->mant);
          a->sign = 1;
        }
    }
}

/* a <- b + 2^64*c, assume sign(c) = 1, and no carry */
static void
addu1 (binary128_t a, const binary128_t b, const uint64_t c)
{
  if (b->sign == 1)
    {
      a->mant[1] = b->mant[1] + c;
      a->mant[0] = b->mant[0];
      a->sign = 1;
    }
  else
    {
      if (b->mant[1] >= c)
        {
          a->mant[1] = b->mant[1] - c;
          a->mant[0] = b->mant[0];
          a->sign = -1;
        }
      else
        {
          a->mant[1] = c - b->mant[1] - (b->mant[0] != 0);
          a->mant[0] = -b->mant[0];
          a->sign = 1;
        }
    }
}

/* shift a->mant by e bits to the right, updating the exponent accordingly */
static void
shift_right (binary128_t a, int e)
{
  assert (e > 0);
  if (e < 64) /* 0 < e < 64 */
    {
      a->mant[0] = (a->mant[1] << (64 - e)) | (a->mant[0] >> e);
      a->mant[1] = a->mant[1] >> e;
    }
  else if (e < 128)/* 64 <= e < 128 */
    {
      a->mant[0] = a->mant[1] >> (e - 64);
      a->mant[1] = 0;
    }
  else /* e >= 128 */
    {
      a->mant[0] = a->mant[1] = 0;
    }
  a->exp += e;
}

/* shift a->mant by e bits to the left, updating the exponent accordingly */
static void
shift_left (binary128_t a, int e)
{
  assert (e > 0 && e < 64);
  a->mant[2] = a->mant[1] >> (64 - e);
  a->mant[1] = (a->mant[1] << e) | (a->mant[0] >> (64 - e));
  a->mant[0] = a->mant[0] << e;
  a->exp -= e;
}

/* a <- a + b */
static void
add_inplace (binary128_t a, binary128_t b)
{
  if (a->exp > b->exp)
    shift_right (b, a->exp - b->exp);
  else if (b->exp > a->exp)
    shift_right (a, b->exp - a->exp);
  assert (a->exp == b->exp);
  if (a->sign == b->sign)
    add2 (a->mant, a->mant, b->mant);
  else if (cmp2 (a->mant, b->mant) >= 0)
    sub2 (a->mant, a->mant, b->mant);
  else
    {
      sub2 (a->mant, b->mant, a->mant);
      a->sign = -a->sign;
    }
}

static void
mul (binary128_t a, binary128_t b, binary128_t c)
{
  mul2h (a->mant, b->mant, c->mant);
  a->sign = b->sign * c->sign;
}

/* only multiplies the upper limbs */
static void
mul_short (binary128_t a, binary128_t b, binary128_t c)
{
  mul1h (a->mant, b->mant, c->mant);
  a->sign = b->sign * c->sign;
}

static void
setu (binary128_t a, const uint64_t *b, int sign)
{
  a->mant[0] = b[0];
  a->mant[1] = b[1];
  a->sign = sign;
  a->exp = 0;
}

/* subtract j*log(2) */
static void
reduce (binary128_t x, int j)
{
  assert (j != 0);
  if (j > 0)
    assert (x->sign == 1);
  else
    assert (x->sign == -1);
  uint64_t t[3], u[2];
  int absj = (j > 0) ? j : -j;
  /* compute j*log(2) in t: LOG2_2*2^128 + LOG2_1*2^64 + LOG2_0
     is 2^192*log(2) rounded to nearest */
#define LOG2_0 0x40f343267298b62eul
#define LOG2_1 0xc9e3b39803f2f6aful
#define LOG2_2 0xb17217f7d1cf79abul
  mul1 (t, LOG2_1, absj);
  mul1 (u, LOG2_0, absj);
  t[0] += u[1];
  t[1] += t[0] < u[1];
  /* there can be no overflow in t[1] here, since j <= 16495 */
  mul1 (u, LOG2_2, absj);
  t[1] += u[0];
  t[2] = u[1] + (t[1] < u[0]);
  /* now align x with t: the "exponent" of t is 0 */
  assert (-1 <= x->exp && x->exp <= 14);
  int sh = x->exp;
  if (sh == -1)
    {
      shift_right (x, 1);
      x->mant[2] = 0;
    }
  else if (sh == 0)
    x->mant[2] = 0;
  else /* shift x to the left in u */
    shift_left (x, sh);
  /* now subtract */
  int c3 = cmp3 (x->mant, t);
  int c2 = cmp2 (x->mant, t);
  if (c3 >= 0) /* compute x - t */
    {
      sub2 (x->mant, x->mant, t);
      if (x->mant[2] == t[2])
        assert (c2 >= 0);
      else /* x[2] > t[2] */
        {
          assert (c2 < 0);
          assert (x->mant[2] == t[2] + 1);
        }
    }
  else /* compute t - x */
    {
      sub2 (x->mant, t, x->mant);
      if (x->mant[2] == t[2])
        assert (c2 <= 0);
      else /* t[2] > x[2] */
        assert (c2 > 0 && t[2] == x->mant[2] + 1);
      x->sign = -x->sign;
    }
  x->exp = 0;
  normalize (x);
}

#if 0
static int
equal (binary128_t a, binary128_t b)
{
  return a->sign == b->sign && a->exp == b->exp &&
    a->mant[0] == b->mant[0] && a->mant[1] == b->mant[1];
}
#endif

/* little endian version: round and convert s to _Float128,
   and multiply by 2^j */
static _Float128
unpack (binary128_t s, int j)
{
  if (s->mant[1] == 0)
    return (_Float128) 0;
  _Float128 x[1];
  uint64_t sign = (s->sign == 1) ? 0 : 1;
  int exp = s->exp + j + BIAS;
  if (exp < 0) /* subnormal */
    {
      shift_right (s, -exp);
      exp = 0;
    }
  /* the biased exponent should fit on 15 bits */
  assert (exp < 32768);
  uint64_t *p = (uint64_t*) x;
  /* round: the 15 low-order bits are flushed */
  uint64_t rnd = 1UL << (14 + (exp == 0));
  s->mant[0] += rnd;
  uint64_t cy = s->mant[0] < rnd;
  s->mant[1] += cy;
  if (s->mant[1] < cy)
    {
      s->mant[0] = (s->mant[1] << 63) | (s->mant[0] >> 1);
      s->mant[1] = (1UL << 63) | (s->mant[1] >> 1);
      exp += 1;
      /* for the largest x = 0x2.c5c85fdf473de6af278ece600fcap+12,
         exp(x) should round to (1-497799229/2^128)*2^16384, thus if
         the error is at most 1 ulp no overflow can occur in this case */
      assert (exp < 32768);
    }
  if (exp > 0)
    {
      p[1] = (sign << 63) | ((uint64_t) exp << 48)
        | ((s->mant[1] >> 15) & 0xfffffffffffful);
      p[0] = (s->mant[1] << 49) | (s->mant[0] >> 15);
    }
  else /* subnormal case */
    {
      p[1] = (sign << 63) | ((uint64_t) exp << 48) | (s->mant[1] >> 16);
      p[0] = (s->mant[1] << 48) | (s->mant[0] >> 16);
    }
  return x[0];
}

_Float128
my_expf128 (const _Float128 x)
{
  binary128_t xl;
  extract_binary128 (xl, x);

  if (xl->exp >= 14)
    {
      if (xl->exp == 16385) /* NaN, +Inf or -Inf */
        {
#define TWO16383 0x8p+16380q
          if ((xl->mant[1] << 1) != 0 || xl->mant[0] != 0) /* NaN */
            return TWO16383 * x;
          else if (xl->sign == +1) /* +Inf */
            return TWO16383 * x;
          else /* -Inf */
            return +0.0q;
        }

      /* XMAX = 11356.523...: exp(XMAX) < 2^16384 < exp(next(XMAX)) */
      static _Float128 _XMAX = 0x2.c5c85fdf473de6af278ece600fcap+12q;

      if (xl->sign == 1 && x > _XMAX)
        return 1e4932q + 1e4932q; /* should raise the overflow exception */

      /* XMIN = -11433.46...: exp(prev(XMIN)) < 1/2*2^-16494 < exp(XMIN) */
      static _Float128 _XMIN = -0x2.ca9767658e7d760b3f576a0dfe66p+12q;
      if (xl->sign == -1 && x < _XMIN)
#define TINY 1.0e-4900q
        return TINY * TINY; /* Should raise the underflow exception.
                               FIXME: optimized by the compiler to return 0. */
    }

  if (x == 0.0q)
    return 1.0q; /* only exact case */

  /* set inexact flag */
  _mm_setcsr (_mm_getcsr () | _MM_EXCEPT_INEXACT);

  /* now |x| < 2^14 */

#define INV_LOG2 0xb8aa3b295c17f0bcul /* 2^63/log(2) rounded to nearest */
  uint64_t h = 0;
  _mulx_u64 (xl->mant[1], INV_LOG2, (unsigned long long*) &h);
  /* h*2^64 approximates 2^64*xl/2^exp * 2^63/log(2) thus
     h approximates xl/2^exp * 2^63/log(2) */
  /* since |x| < 2^14, xl->exp <= 14, thus we can shift h right by
     14 - xl->exp bits */
  if (xl->exp > -50)
    h = h >> (14 - xl->exp);
  else
    h = 0;
  /* now h approximates xl/log(2) * 2^49 */
  int n, i, j, k;
  n = (h + 0x100000000ul) >> 33;
  if (xl->sign == -1)
    n = -n;
  /* now n approximates 2^16 * xl/log(2) */
  /* now write n = i * 2^16 + j * 2^8 + k, with -128 <= j,k < 128 */
  if (n >= 0)
    i = (n + 32896) >> 16; /* -32896 <= j * 2^8 + k < 32640 */
  else
    i = -(((-n) + 32639) >> 16);
  n = n - (i << 16);
  if (n >= 0)
    j = (n + 128) >> 8;
  else
    j = -(((-n) + 127) >> 8);
  k = n - (j << 8);

  /* now x = i*log(2) + j*log(2)/2^8 + k*log(2)/2^16 + xl */

  if (i != 0)
    reduce (xl, i);
  /* now |xl| <= log(2)/2 */
  assert (-128 <= j && j < 128);
  assert (-128 <= k & k < 128);

  /* write x = x[j] + xl with -128 <= j < 128, such that
     exp(x) = exp(x[j]) * exp(xl) with |xl| <= log(2)/2^9,
     and exp(x[j]) has at least 113+15=128 bits of accuracy */

  /* C is a table of 256*4 uint64_t:
     C[4*j],C[4*j+1] represent the x[j] values (little endian, without sign)
     C[4*j+2],C[4*j+3] represent the exp(x[j])/2 values */

  binary128_t cj, exp_cj;
  j = j + 128; /* now 0 <= j < 256 */
  /* align the significand */
  align_binary128 (xl);
  /* subtract x[j] */
  setu (cj, C + 4 * j, (j < 128) ? -1 : 1);
  sub_inplace (xl, cj);
  setu (exp_cj, C + 4 * j + 2, 1);

  /* now |xl| <= log(2)/2^9, but still with exponent 0:
     the upper 9 bits of xl->mant[1] are zero */

  binary128_t ck, exp_ck;
  k = k + 128; /* now 0 <= k < 256 */
  setu (ck, C2 + 4 * k, (k < 128) ? -1 : 1);
  sub_inplace (xl, ck);
  setu (exp_ck, C2 + 4 * k + 2, 1);

  /* exp_cjk <- exp_cj * exp_ck */
  binary128_t exp_cjk;
  mul (exp_cjk, exp_cj, exp_ck);
  /* since exp_cj and exp_ck are divided by 2, we multiply exp_jk by 2 */
  shift_left (exp_cjk, 1);
  exp_cjk->exp = 0; /* reset the exponent to 0 */
  
  /* now |xl| <= log(2)/2^17, but still with exponent 0:
     the upper 17 bits of xl->mant[1] are zero */

  /* polynomial generated by sollya new256a2.sollya: for coefficients of
     degree 4 and higher, 64 bits is enough */
  /* we divide all coefficients by 2, to avoid an overflow in the last
     addition P1 + ... where P1 is near 1 */
  /* #define P1 0x1.000000000000000000000000000000ap+0 */
  static uint64_t Pq[] = {0x50ul, 0x8000000000000000ul,
  /* #define P2 0x8.0000000000000000000000006af3f78p-4 */
                          0x3579fbcul, 0x4000000000000000ul,
  /* #define P3 0x2.aaaaaaaaaaaaaaaaaaa80cd5b9d88f6p-4 */
                          0x55554066adcec47bul, 0x1555555555555555ul,
  /* #define P4 0xa.aaaaaaaaaaaaaap-8 */
                          0, 0x555555555555555ul,
  /* #define P5 0x2.2222222224dce8p-8 */
                          0, 0x111111111126e74ul,
  /* #define P6 0x5.b05b43776501cp-12 */
                          0, 0x2d82da1bbb280eul};

  binary128_t yq, tq;
  tq->exp = 0;
  setu (yq, Pq + 10, 1); /* P6 */
  mul_short (tq, xl, yq);
  addu1 (yq, tq, Pq[9]); /* P5 */
  mul_short (tq, xl, yq);
  addu1 (yq, tq, Pq[7]); /* P4 */
  mul_short (tq, xl, yq);
  addu (yq, tq, Pq + 4); /* P3 */
  mul (tq, xl, yq);
  addu (yq, tq, Pq + 2); /* P2 */
  mul (tq, xl, yq);
  addu (yq, tq, Pq); /* P1 */
  /* now yq approximates (exp(xl)-1)/2xl,
     we want 2 * exp(x[j]) * exp(x2[k]) * (1+xl*yq) */
  mul (tq, xl, yq);
  /* now tq approximates (exp(xl)-1)/2,
     we want 2 * exp(x[j]) * exp(x2[k]) + 2 * exp(x[j]) * exp(x2[k]) * tq */
  mul (yq, tq, exp_cjk);
  yq->exp += 1; /* since we divided the P[1-9] coefficients by 2 */
  add_inplace (yq, exp_cjk);
  /* since exp_cjk stores exp(x[j])*exp(x2[k])/2, we have to multiply by 2 */
  yq->exp += 1;
  /* normalize */
  normalize (yq);
  return unpack (yq, i);
}

