// GENERATED FILE - DO NOT EDIT.
// Generated by gen_builtin_symbols.py using data from builtin_variables.json and
// builtin_function_declarations.txt.
//
// Copyright 2020 The ANGLE Project Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
//
// ImmutableString_autogen.cpp: Wrapper for static or pool allocated char arrays, that are
// guaranteed to be valid and unchanged for the duration of the compilation. Implements
// mangledNameHash using perfect hash function from gen_builtin_symbols.py

#include "compiler/translator/ImmutableString.h"

namespace sh
{

std::ostream &operator<<(std::ostream &os, const ImmutableString &str)
{
    return os.write(str.data(), str.length());
}

}  // namespace sh

#if defined(_MSC_VER)
#    pragma warning(disable : 4309)  // truncation of constant value
#endif

namespace
{

constexpr int mangledkT1[] = {2264, 213,  1028, 1475, 1361, 1474, 233,  1572, 1397, 712,
                              1166, 1429, 81,   1838, 2549, 1083, 2011, 7,    1824, 646,
                              195,  1823, 1551, 150,  1328, 1880, 1024, 1905, 420,  228,
                              1082, 428,  561,  2148, 2379, 1166, 279,  1087, 947,  193};
constexpr int mangledkT2[] = {1950, 181,  2214, 2065, 1240, 1307, 1106, 2540, 2567, 1310,
                              307,  711,  1470, 2521, 1206, 999,  1423, 955,  464,  2624,
                              1556, 2648, 2452, 104,  51,   869,  721,  1639, 2301, 239,
                              42,   1055, 1733, 1366, 1972, 2393, 1386, 1369, 2129, 975};
constexpr int mangledkG[]  = {
    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
    0,    0,    0,    0,    0,    0,    1719, 0,    0,    625,  0,    0,    0,    1691, 0,    0,
    1028, 0,    894,  183,  0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    679,
    0,    0,    0,    0,    0,    0,    0,    752,  0,    0,    0,    0,    0,    2451, 0,    1405,
    1745, 0,    0,    2237, 1384, 0,    0,    0,    0,    0,    0,    37,   0,    1989, 0,    0,
    0,    1563, 0,    991,  0,    0,    0,    0,    0,    0,    0,    0,    110,  0,    0,    0,
    0,    0,    0,    878,  1999, 0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
    0,    2185, 1225, 0,    0,    219,  0,    232,  0,    0,    85,   0,    0,    0,    0,    0,
    0,    0,    0,    0,    0,    0,    1622, 0,    1160, 0,    883,  0,    0,    304,  0,    0,
    0,    1600, 887,  396,  2042, 1103, 0,    0,    0,    0,    0,    0,    0,    0,    0,    613,
    0,    30,   2594, 0,    0,    2379, 0,    2447, 0,    0,    0,    0,    946,  0,    289,  0,
    0,    0,    0,    777,  2208, 351,  0,    138,  0,    812,  0,    0,    2641, 2556, 2371, 270,
    48,   0,    0,    0,    1871, 2438, 0,    0,    2553, 0,    0,    0,    1775, 0,    963,  1495,
    2099, 0,    0,    0,    1477, 0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
    0,    0,    0,    0,    1139, 1198, 518,  1355, 0,    0,    0,    1620, 1516, 0,    0,    1963,
    0,    2108, 0,    0,    0,    0,    0,    982,  806,  1035, 0,    1505, 0,    0,    0,    0,
    0,    0,    0,    0,    0,    0,    0,    1708, 0,    1406, 0,    0,    0,    0,    1383, 880,
    0,    0,    0,    0,    1352, 2028, 0,    0,    0,    351,  0,    0,    0,    494,  1105, 0,
    895,  2273, 0,    1152, 0,    0,    41,   0,    0,    0,    1883, 0,    1407, 0,    0,    0,
    1726, 101,  0,    0,    99,   0,    0,    0,    2467, 0,    0,    2115, 216,  2343, 764,  0,
    1170, 475,  0,    1602, 0,    0,    880,  0,    0,    2219, 1873, 1005, 0,    0,    1634, 0,
    0,    1198, 0,    0,    0,    1514, 0,    2012, 1192, 0,    0,    0,    275,  1969, 0,    0,
    1823, 116,  1690, 215,  1595, 423,  1723, 283,  222,  0,    0,    0,    2283, 2354, 0,    0,
    944,  2604, 0,    1641, 0,    760,  0,    1172, 0,    102,  2325, 0,    0,    0,    0,    1713,
    0,    0,    0,    0,    713,  0,    1664, 0,    0,    0,    0,    701,  0,    799,  0,    0,
    559,  1845, 1400, 1761, 2591, 0,    0,    0,    2343, 0,    0,    0,    0,    134,  286,  1078,
    1810, 883,  0,    0,    0,    2541, 0,    382,  0,    2330, 1387, 0,    0,    0,    1074, 1183,
    2667, 0,    1014, 461,  1087, 343,  0,    444,  126,  0,    0,    1986, 0,    0,    0,    2332,
    0,    2531, 2218, 0,    1721, 1127, 1671, 0,    1097, 0,    0,    1230, 0,    1823, 0,    0,
    0,    0,    993,  2634, 0,    0,    1195, 952,  2158, 0,    788,  1620, 0,    1979, 2440, 0,
    0,    0,    157,  898,  0,    0,    1310, 0,    0,    2611, 0,    457,  1405, 0,    1109, 0,
    1794, 0,    0,    916,  0,    0,    1678, 0,    2615, 798,  0,    2303, 0,    534,  0,    0,
    1840, 0,    0,    0,    0,    0,    0,    0,    0,    1300, 0,    1157, 940,  0,    1676, 175,
    629,  0,    0,    0,    0,    1025, 0,    1776, 0,    0,    0,    1184, 0,    993,  92,   0,
    1126, 0,    0,    1464, 2605, 2391, 0,    0,    0,    0,    1273, 0,    0,    0,    0,    835,
    1325, 1026, 1378, 0,    1115, 0,    0,    0,    2518, 203,  0,    0,    9,    0,    0,    1717,
    0,    0,    68,   0,    0,    0,    0,    1634, 1053, 0,    0,    770,  0,    0,    0,    0,
    0,    2268, 0,    0,    0,    2087, 1507, 0,    0,    391,  0,    0,    0,    332,  0,    330,
    11,   1175, 126,  0,    1566, 462,  0,    0,    975,  2218, 71,   262,  220,  0,    0,    1117,
    0,    1515, 0,    0,    0,    0,    16,   0,    0,    0,    0,    1823, 0,    0,    0,    902,
    0,    0,    91,   2414, 1316, 364,  0,    1796, 0,    0,    0,    316,  0,    0,    700,  0,
    0,    0,    430,  0,    0,    714,  572,  1917, 0,    0,    0,    978,  308,  2087, 2399, 0,
    268,  0,    2616, 431,  0,    544,  300,  2516, 0,    0,    2301, 897,  752,  0,    0,    0,
    2086, 205,  754,  0,    1323, 2153, 242,  940,  0,    0,    118,  0,    1223, 0,    1332, 358,
    136,  0,    405,  2587, 0,    0,    0,    2307, 0,    0,    544,  0,    0,    267,  0,    0,
    0,    2224, 0,    2302, 1951, 0,    2329, 2223, 0,    0,    662,  0,    1510, 1148, 0,    0,
    1099, 112,  0,    172,  0,    1514, 0,    2333, 1224, 617,  0,    535,  0,    0,    0,    0,
    0,    1129, 0,    1398, 0,    1238, 0,    0,    0,    2027, 0,    0,    1022, 184,  1047, 1274,
    0,    0,    0,    0,    0,    0,    37,   1066, 0,    0,    1134, 2480, 0,    763,  2207, 970,
    609,  1113, 0,    2530, 846,  0,    2189, 703,  0,    0,    0,    0,    0,    2019, 360,  0,
    0,    527,  601,  0,    157,  197,  0,    0,    1760, 0,    1790, 0,    1088, 0,    1394, 641,
    598,  0,    0,    0,    2299, 1407, 0,    0,    1231, 0,    0,    0,    0,    2661, 1786, 0,
    0,    1181, 0,    0,    0,    447,  0,    0,    0,    0,    0,    0,    2430, 0,    0,    2575,
    0,    450,  427,  2523, 1968, 1321, 419,  1420, 0,    1977, 2291, 368,  533,  58,   941,  708,
    2621, 2432, 0,    0,    1603, 817,  0,    1862, 0,    547,  0,    1790, 0,    0,    0,    0,
    0,    0,    0,    0,    0,    0,    847,  0,    2567, 777,  0,    1628, 2,    301,  1080, 0,
    0,    2551, 466,  0,    0,    0,    0,    0,    0,    1061, 979,  1983, 0,    212,  0,    357,
    1065, 0,    0,    2162, 2489, 240,  347,  0,    1165, 2262, 580,  46,   0,    704,  2476, 0,
    0,    2447, 0,    0,    2519, 1688, 359,  0,    0,    0,    2526, 0,    0,    0,    1322, 0,
    920,  0,    1407, 522,  0,    0,    0,    592,  0,    0,    171,  2462, 0,    0,    1892, 644,
    0,    954,  734,  0,    0,    0,    1885, 0,    122,  0,    23,   0,    0,    795,  0,    1655,
    1653, 379,  2632, 188,  2384, 0,    440,  490,  0,    0,    0,    0,    501,  0,    1895, 1272,
    0,    710,  294,  44,   0,    2159, 875,  2013, 2158, 0,    335,  1551, 0,    127,  1852, 1727,
    0,    0,    0,    0,    273,  0,    1097, 2073, 21,   2084, 0,    693,  0,    573,  276,  2077,
    493,  0,    0,    354,  526,  0,    0,    874,  0,    0,    2059, 1212, 0,    0,    0,    0,
    0,    1081, 0,    1174, 187,  987,  561,  0,    1541, 59,   0,    1223, 0,    1590, 2294, 1094,
    1172, 923,  0,    1540, 564,  833,  1966, 0,    0,    649,  0,    0,    0,    1856, 1847, 1492,
    0,    494,  1840, 599,  1646, 468,  0,    0,    456,  0,    857,  0,    622,  0,    1845, 1326,
    781,  0,    834,  195,  0,    297,  2377, 158,  0,    2300, 0,    0,    487,  0,    750,  1427,
    1199, 594,  1848, 110,  0,    2053, 1975, 0,    0,    876,  0,    826,  0,    1238, 883,  0,
    0,    0,    339,  900,  0,    0,    0,    0,    0,    549,  0,    1357, 1995, 507,  0,    761,
    0,    0,    0,    0,    0,    2326, 587,  0,    0,    2630, 1674, 0,    1516, 2538, 1984, 1156,
    159,  2398, 607,  2365, 0,    571,  0,    1063, 923,  0,    0,    0,    0,    2678, 434,  44,
    19,   0,    0,    957,  528,  1656, 2269, 0,    0,    78,   2186, 0,    0,    0,    1030, 2476,
    1834, 0,    2505, 106,  0,    1415, 1578, 0,    1671, 2633, 0,    1617, 1053, 521,  0,    519,
    0,    0,    0,    0,    1145, 0,    0,    340,  0,    0,    0,    0,    0,    1864, 0,    1666,
    0,    1933, 2457, 0,    421,  1111, 1064, 2465, 2573, 1467, 1370, 373,  0,    700,  0,    0,
    1094, 0,    349,  0,    1202, 2411, 2053, 816,  1816, 0,    0,    0,    260,  0,    786,  0,
    0,    879,  870,  0,    2594, 0,    0,    504,  0,    2284, 0,    1166, 309,  2656, 0,    7,
    0,    0,    0,    0,    526,  1092, 0,    0,    0,    1302, 0,    0,    0,    992,  0,    0,
    565,  0,    2386, 566,  0,    0,    550,  96,   850,  1223, 0,    0,    603,  1371, 1572, 442,
    0,    0,    465,  859,  1162, 2449, 0,    1402, 1653, 0,    1587, 0,    1118, 2632, 360,  0,
    0,    0,    2267, 1869, 0,    958,  1605, 0,    0,    0,    0,    2321, 0,    0,    138,  424,
    2348, 173,  1766, 0,    2457, 431,  1782, 0,    1076, 1675, 1432, 1698, 0,    0,    1898, 0,
    0,    0,    2428, 563,  1597, 0,    2350, 0,    275,  1219, 0,    2536, 457,  370,  0,    1152,
    1101, 1194, 0,    0,    1657, 0,    2187, 2614, 0,    0,    0,    0,    2430, 1163, 0,    1964,
    296,  982,  60,   2263, 627,  0,    0,    791,  0,    0,    0,    0,    943,  90,   558,  0,
    0,    0,    0,    0,    356,  1750, 818,  0,    0,    0,    0,    1269, 1234, 2145, 15,   682,
    771,  1373, 0,    2658, 0,    0,    0,    0,    250,  37,   560,  540,  2616, 897,  1004, 0,
    1272, 2182, 120,  974,  547,  0,    515,  535,  1987, 851,  690,  0,    639,  0,    1202, 837,
    0,    254,  0,    0,    2073, 0,    0,    870,  375,  470,  254,  0,    0,    0,    1420, 341,
    18,   0,    311,  416,  0,    225,  0,    600,  963,  0,    0,    601,  763,  0,    0,    1714,
    1116, 876,  870,  1467, 0,    2499, 0,    0,    0,    1027, 514,  841,  324,  0,    676,  46,
    0,    0,    0,    263,  0,    0,    1866, 1332, 1846, 0,    1356, 0,    680,  369,  0,    548,
    1133, 0,    0,    652,  0,    2268, 0,    0,    1518, 1251, 0,    705,  0,    0,    0,    117,
    0,    593,  2596, 0,    552,  0,    765,  2476, 1307, 0,    2519, 451,  1387, 0,    0,    2513,
    1246, 233,  0,    0,    0,    1266, 0,    1487, 2394, 0,    0,    814,  463,  98,   1410, 0,
    0,    1781, 0,    1636, 0,    0,    152,  997,  892,  86,   1207, 0,    0,    465,  436,  757,
    426,  227,  1875, 1614, 266,  1962, 0,    1898, 0,    1005, 1323, 0,    2505, 88,   0,    0,
    1904, 424,  1191, 1668, 0,    0,    764,  1835, 1397, 237,  0,    0,    1130, 0,    939,  166,
    1490, 488,  0,    0,    0,    708,  1630, 2338, 748,  873,  648,  1767, 1878, 299,  0,    205,
    0,    133,  2636, 2422, 0,    1177, 337,  469,  1002, 0,    532,  2355, 0,    1215, 438,  1011,
    562,  721,  0,    0,    1339, 2233, 0,    884,  0,    2283, 5,    0,    0,    0,    251,  1693,
    0,    0,    1102, 0,    0,    15,   2204, 70,   757,  0,    2067, 1852, 0,    80,   0,    2574,
    1382, 421,  0,    0,    1322, 678,  1506, 0,    2158, 1548, 0,    75,   0,    0,    0,    0,
    0,    0,    0,    0,    545,  0,    0,    935,  1157, 0,    0,    0,    65,   190,  0,    2680,
    2347, 0,    474,  0,    0,    2642, 0,    0,    1294, 182,  566,  431,  189,  438,  1353, 63,
    1991, 823,  2640, 2330, 2141, 0,    724,  2041, 1331, 0,    2530, 1350, 0,    0,    2,    0,
    39,   749,  1292, 0,    719,  1334, 480,  620,  543,  1203, 2467, 0,    0,    2177, 0,    0,
    1522, 0,    928,  300,  0,    0,    2005, 1848, 1331, 831,  1427, 1421, 0,    0,    476,  1435,
    0,    1054, 1153, 2004, 0,    0,    0,    176,  0,    1099, 330,  1397, 0,    323,  0,    2218,
    0,    2225, 0,    491,  0,    0,    460,  0,    1843, 0,    1036, 673,  0,    2033, 0,    0,
    1239, 0,    0,    0,    1173, 1115, 0,    2152, 2613, 293,  1247, 0,    2576, 2606, 1411, 0,
    0,    321,  0,    332,  1284, 609,  2304, 0,    576,  2548, 0,    2565, 2486, 2440, 0,    1013,
    2640, 271,  0,    171,  486,  492,  0,    715,  0,    1493, 554,  0,    796,  6,    1580, 0,
    0,    0,    0,    2559, 1780, 28,   272,  1023, 478,  0,    0,    0,    0,    298,  0,    0,
    0,    108,  0,    0,    0,    0,    2173, 137,  0,    2606, 0,    1059, 0,    235,  0,    1164,
    1399, 0,    0,    0,    529,  0,    2086, 0,    52,   2004, 0,    256,  1419, 2582, 1288, 273,
    1437, 1108, 0,    1174, 0,    600,  462,  1108, 2611, 8,    430,  1290, 1328, 305,  1705, 1317,
    1368, 1237, 1602, 360,  1405, 1866, 0,    228,  0,    1521, 2366, 177,  0,    0,    926,  0,
    0,    0,    0,    1998, 2281, 2477, 0,    0,    0,    572,  0,    0,    0,    2208, 1,    0,
    0,    0,    1941, 0,    1573, 0,    0,    0,    443,  0,    0,    0,    0,    0,    2543, 1005,
    0,    0,    1470, 179,  0,    301,  2429, 2419, 1135, 0,    2651, 0,    956,  0,    236,  0,
    0,    199,  0,    1209, 0,    1858, 0,    872,  1836, 0,    0,    573,  381,  489,  0,    2313,
    415,  0,    287,  0,    0,    0,    745,  0,    0,    0,    61,   1158, 0,    0,    517,  0,
    1848, 0,    1527, 1377, 1298, 133,  0,    0,    0,    0,    2610, 0,    0,    2076, 519,  1414,
    98,   0,    582,  104,  0,    2279, 0,    0,    643,  0,    1450, 773,  0,    269,  0,    1019,
    1031, 0,    0,    0,    2485, 169,  830,  0,    835,  305,  1252, 0,    0,    556,  624,  988,
    240,  1658, 758,  2015, 158,  0,    236,  216,  0,    0,    0,    1221, 0,    0,    1831, 902,
    0,    0,    353,  914,  0,    1828, 0,    2446, 0,    119,  934,  0,    0,    822,  0,    1066,
    910,  0,    1232, 422,  0,    1587, 2350, 967,  945,  33,   1193, 0,    1847, 620,  2142, 0,
    0,    1756, 0,    0,    408,  0,    1675, 193,  2136, 1249, 1150, 784,  0,    610,  0,    554,
    2192, 949,  1251, 0,    0,    616,  1403, 0,    0,    471,  2091, 0,    1617, 1528, 0,    1132,
    1628, 2243, 1848, 0,    0,    0,    994,  449,  0,    2515, 449,  0,    0,    988,  1067, 0,
    0,    0,    2071, 686,  0,    1061, 1050, 0,    0,    788,  47,   2052, 1926, 1396, 1330, 0,
    1078, 539,  997,  0,    1801, 290,  257,  0,    2060, 0,    1070, 2522, 1475, 0,    1933, 124,
    698,  1062, 2648, 0,    855,  682,  0,    0,    0,    695,  0,    628,  0,    1415, 1961, 1353,
    0,    0,    0,    0,    0,    755,  1226, 1152, 2414, 1104, 1376, 0,    2276, 940,  787,  831,
    2660, 462,  733,  754,  0,    328,  0,    0,    0,    0,    0,    0,    0,    1243, 0,    1287,
    1519, 1669, 443,  439,  350,  2147, 2161, 0,    203,  0,    0,    1683, 1595, 1082, 0,    2479,
    0,    786,  1997, 337,  979,  0,    0,    0,    0,    0,    0,    1094, 727,  2574, 1595, 0,
    0,    732,  0,    2442, 0,    2133, 2195, 666,  1127, 1386, 687,  0,    199,  0,    1106, 1280,
    1222, 1358, 1071, 0,    1701, 2008, 1212, 1822, 0,    2468, 2126, 2450, 976,  1159, 0,    307,
    0,    1297, 0,    133,  1176, 386,  0,    524,  0,    94,   410,  1043, 0,    0,    45,   0,
    0,    0,    0,    2156, 0,    2362, 1954, 1203, 1029, 1704, 381,  529,  576,  880,  0,    36,
    2586, 1951, 852,  1916, 1303, 1308, 1047, 1044, 618,  2558, 0,    0,    0,    0,    0,    1736,
    285,  2054, 1216, 177,  968,  0,    390,  2125, 0,    299,  57,   404,  66,   0,    0,    0,
    0,    1459, 1821, 0,    2299, 0,    985,  0,    89,   1233, 0,    780,  0,    0,    1446, 1259,
    1122, 275,  2298, 0,    1268, 333,  0,    1614, 506,  2430, 0,    1009, 1527, 0,    1704, 1682,
    1697, 1201, 324,  0,    0,    2620, 0,    304,  1527, 2099, 0,    2392, 0,    1463, 2022, 0,
    1183, 0,    213,  1320, 0,    279,  467,  0,    947,  0,    0,    1613, 0,    0,    502,  248,
    0,    0,    0,    226,  1015, 1204, 0,    0,    569,  0,    1922, 342,  1266, 2288, 0,    149,
    1316, 163,  336,  1143, 1813, 0,    482,  0,    319,  2580, 1010, 0,    1122, 1215, 1299, 1060,
    2539, 0,    0,    0,    2459, 594,  0,    0,    689,  340,  1363, 0,    1292, 675,  699,  317,
    0,    774,  0,    519,  1187, 2162, 1886, 318,  884,  685,  409,  0,    0,    197,  0,    2567,
    0,    0,    393,  0,    1948, 0,    405,  318,  1873, 0,    0,    595,  0,    2511, 2137, 114,
    991,  0,    2053, 1091, 514,  0,    171,  364,  1607, 2538, 378,  1155, 0,    759,  0,    430,
    55,   1828, 813,  0,    382,  0,    0,    0,    0,    919,  736,  0,    2391, 303,  0,    0,
    0,    0,    2461, 529,  1174, 237,  915,  0,    1391, 2618, 0,    2327, 672,  0,    972,  909,
    539,  563,  0,    2654, 1655, 1375, 1426, 0,    0,    0,    0,    0,    810,  1045, 2330, 2568,
    495,  0,    0,    2254, 451,  0,    307,  0,    0,    751,  2346, 2520, 178,  1424, 1940, 289,
    0,    2578, 719,  0,    406,  183,  0,    1280, 0,    116,  0,    1811, 1166, 1360, 2673, 0,
    2105, 2061, 26,   1957, 1126, 0,    2352, 2426, 2002, 2639, 1528, 1073, 0,    2376, 0,    625,
    1363, 0,    0,    100,  0,    1354, 340,  0,    1411, 1346, 739,  0,    537,  223,  840,  150,
    912,  2561, 0,    0,    0,    2447, 1170, 92,   0,    862,  1250, 0,    0,    0,    288,  0,
    1276, 90,   0,    1151, 0,    0,    575,  2027, 1711, 1322, 614,  772,  1286, 505,  788,  1570,
    2,    123,  629,  0,    1375, 0,    717,  0,    0,    441,  569,  876,  244,  2130};

int MangledHashG(const char *key, const int *T)
{
    int sum = 0;

    for (int i = 0; key[i] != '\0'; i++)
    {
        sum += T[i] * key[i];
        sum %= 2686;
    }
    return mangledkG[sum];
}

int MangledPerfectHash(const char *key)
{
    if (strlen(key) > 40)
        return 0;

    return (MangledHashG(key, mangledkT1) + MangledHashG(key, mangledkT2)) % 2686;
}

constexpr int unmangledkT1[] = {283, 267, 280, 232, 95,  248, 66,  107, 84,  33,  160,
                                206, 18,  302, 134, 298, 236, 304, 179, 314, 206, 70,
                                266, 310, 227, 269, 170, 226, 288, 163, 197, 233};
constexpr int unmangledkT2[] = {242, 246, 285, 184, 312, 257, 16,  193, 254, 203, 268,
                                162, 73,  81,  83,  86,  51,  114, 275, 312, 164, 297,
                                55,  203, 192, 149, 54,  64,  254, 247, 226, 90};
constexpr int unmangledkG[]  = {
    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   100, 108, 0,   0,   0,   75,  0,   0,   0,
    0,   0,   0,   0,   0,   29,  0,   0,   65,  0,   0,   0,   45,  253, 90,  0,   123, 168, 0,
    0,   300, 0,   94,  125, 0,   289, 0,   0,   98,  237, 0,   0,   83,  0,   0,   0,   0,   2,
    0,   0,   7,   38,  0,   0,   0,   4,   0,   0,   0,   289, 62,  0,   0,   0,   34,  134, 41,
    0,   74,  0,   0,   0,   0,   312, 30,  0,   0,   12,  38,  261, 303, 40,  0,   0,   0,   0,
    1,   2,   0,   9,   0,   161, 145, 0,   122, 27,  0,   0,   0,   59,  140, 56,  108, 0,   0,
    279, 126, 315, 0,   153, 25,  0,   0,   61,  145, 0,   268, 105, 194, 183, 271, 157, 175, 156,
    0,   168, 4,   0,   0,   0,   0,   263, 0,   0,   91,  0,   179, 138, 221, 0,   0,   79,  68,
    271, 240, 72,  208, 0,   125, 149, 307, 1,   0,   0,   55,  53,  26,  253, 107, 41,  14,  87,
    0,   202, 60,  128, 0,   4,   28,  97,  159, 205, 21,  283, 0,   109, 23,  299, 23,  158, 150,
    0,   32,  0,   50,  280, 7,   0,   133, 153, 0,   210, 253, 118, 162, 230, 26,  0,   0,   0,
    273, 86,  158, 0,   0,   61,  268, 0,   0,   0,   160, 0,   0,   18,  4,   115, 0,   107, 0,
    131, 82,  82,  0,   0,   0,   0,   25,  0,   295, 138, 22,  0,   111, 311, 69,  47,  16,  266,
    0,   0,   78,  103, 103, 1,   262, 178, 275, 0,   0,   0,   81,  0,   0,   0,   67,  293, 159,
    121, 29,  0,   240, 0,   54,  305, 0,   314, 23,  0,   0,   52,  264, 172, 0,   230, 0,   36,
    146, 58,  103, 0,   0,   0,   62,  20,  0,   142, 121, 89,  146, 59,  263, 96,  33,  219, 0,
    147, 0,   0,   64,  177, 0,   306, 5,   98,  0,   0,   116};

int UnmangledHashG(const char *key, const int *T)
{
    int sum = 0;

    for (int i = 0; key[i] != '\0'; i++)
    {
        sum += T[i] * key[i];
        sum %= 316;
    }
    return unmangledkG[sum];
}

int UnmangledPerfectHash(const char *key)
{
    if (strlen(key) > 32)
        return 0;

    return (UnmangledHashG(key, unmangledkT1) + UnmangledHashG(key, unmangledkT2)) % 316;
}

}  // namespace

namespace sh
{

template <>
const size_t ImmutableString::FowlerNollVoHash<4>::kFnvPrime = 16777619u;

template <>
const size_t ImmutableString::FowlerNollVoHash<4>::kFnvOffsetBasis = 0x811c9dc5u;

template <>
const size_t ImmutableString::FowlerNollVoHash<8>::kFnvPrime =
    static_cast<size_t>(1099511628211ull);

template <>
const size_t ImmutableString::FowlerNollVoHash<8>::kFnvOffsetBasis =
    static_cast<size_t>(0xcbf29ce484222325ull);

uint32_t ImmutableString::mangledNameHash() const
{
    return MangledPerfectHash(data());
}

uint32_t ImmutableString::unmangledNameHash() const
{
    return UnmangledPerfectHash(data());
}

}  // namespace sh
