10888a09821a98ac0680fad765217302858e70fa4Paul Duffin/*
20888a09821a98ac0680fad765217302858e70fa4Paul Duffin * Copyright (C) 2014 The Guava Authors
30888a09821a98ac0680fad765217302858e70fa4Paul Duffin *
40888a09821a98ac0680fad765217302858e70fa4Paul Duffin * Licensed under the Apache License, Version 2.0 (the "License");
50888a09821a98ac0680fad765217302858e70fa4Paul Duffin * you may not use this file except in compliance with the License.
60888a09821a98ac0680fad765217302858e70fa4Paul Duffin * You may obtain a copy of the License at
70888a09821a98ac0680fad765217302858e70fa4Paul Duffin *
80888a09821a98ac0680fad765217302858e70fa4Paul Duffin * http://www.apache.org/licenses/LICENSE-2.0
90888a09821a98ac0680fad765217302858e70fa4Paul Duffin *
100888a09821a98ac0680fad765217302858e70fa4Paul Duffin * Unless required by applicable law or agreed to in writing, software
110888a09821a98ac0680fad765217302858e70fa4Paul Duffin * distributed under the License is distributed on an "AS IS" BASIS,
120888a09821a98ac0680fad765217302858e70fa4Paul Duffin * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
130888a09821a98ac0680fad765217302858e70fa4Paul Duffin * See the License for the specific language governing permissions and
140888a09821a98ac0680fad765217302858e70fa4Paul Duffin * limitations under the License.
150888a09821a98ac0680fad765217302858e70fa4Paul Duffin */
160888a09821a98ac0680fad765217302858e70fa4Paul Duffin
170888a09821a98ac0680fad765217302858e70fa4Paul Duffinpackage com.google.common.base;
180888a09821a98ac0680fad765217302858e70fa4Paul Duffin
190888a09821a98ac0680fad765217302858e70fa4Paul Duffinimport com.google.caliper.BeforeExperiment;
200888a09821a98ac0680fad765217302858e70fa4Paul Duffinimport com.google.caliper.Benchmark;
210888a09821a98ac0680fad765217302858e70fa4Paul Duffinimport com.google.caliper.Param;
220888a09821a98ac0680fad765217302858e70fa4Paul Duffin
230888a09821a98ac0680fad765217302858e70fa4Paul Duffinimport java.util.ArrayList;
240888a09821a98ac0680fad765217302858e70fa4Paul Duffinimport java.util.Collections;
250888a09821a98ac0680fad765217302858e70fa4Paul Duffinimport java.util.List;
260888a09821a98ac0680fad765217302858e70fa4Paul Duffin
270888a09821a98ac0680fad765217302858e70fa4Paul Duffin@SuppressWarnings("unused") // Nested enums used reflectively in setUp.
280888a09821a98ac0680fad765217302858e70fa4Paul Duffinpublic class EnumsBenchmark {
290888a09821a98ac0680fad765217302858e70fa4Paul Duffin
300888a09821a98ac0680fad765217302858e70fa4Paul Duffin  @Param({"Small", "Medium", "Large"})
310888a09821a98ac0680fad765217302858e70fa4Paul Duffin  String enumSize;
320888a09821a98ac0680fad765217302858e70fa4Paul Duffin  @Param({"0.2", "0.8"})
330888a09821a98ac0680fad765217302858e70fa4Paul Duffin  float hitRate;
340888a09821a98ac0680fad765217302858e70fa4Paul Duffin
350888a09821a98ac0680fad765217302858e70fa4Paul Duffin  private Class<? extends Enum> enumType;
360888a09821a98ac0680fad765217302858e70fa4Paul Duffin  private String[] sampleData;
370888a09821a98ac0680fad765217302858e70fa4Paul Duffin
380888a09821a98ac0680fad765217302858e70fa4Paul Duffin  @BeforeExperiment
390888a09821a98ac0680fad765217302858e70fa4Paul Duffin  @SuppressWarnings("unchecked")
400888a09821a98ac0680fad765217302858e70fa4Paul Duffin  void setUp() throws ClassNotFoundException {
410888a09821a98ac0680fad765217302858e70fa4Paul Duffin    Preconditions.checkArgument(hitRate >= 0 && hitRate <= 1,
420888a09821a98ac0680fad765217302858e70fa4Paul Duffin        "hitRate must be in the range [0,1]");
430888a09821a98ac0680fad765217302858e70fa4Paul Duffin
440888a09821a98ac0680fad765217302858e70fa4Paul Duffin    enumType = (Class<? extends Enum>)
450888a09821a98ac0680fad765217302858e70fa4Paul Duffin        Class.forName(EnumsBenchmark.class.getCanonicalName() + "$" + enumSize + "Enum");
460888a09821a98ac0680fad765217302858e70fa4Paul Duffin
470888a09821a98ac0680fad765217302858e70fa4Paul Duffin    Enum<?>[] allConstants = enumType.getEnumConstants();
480888a09821a98ac0680fad765217302858e70fa4Paul Duffin    List<String> hits = new ArrayList<String>();
490888a09821a98ac0680fad765217302858e70fa4Paul Duffin    for (int i = 0; i < hitRate * 256 / 3; ++i) {
500888a09821a98ac0680fad765217302858e70fa4Paul Duffin      hits.add(allConstants[0].name());
510888a09821a98ac0680fad765217302858e70fa4Paul Duffin      hits.add(allConstants[allConstants.length / 2].name());
520888a09821a98ac0680fad765217302858e70fa4Paul Duffin      hits.add(allConstants[allConstants.length - 1].name());
530888a09821a98ac0680fad765217302858e70fa4Paul Duffin    }
540888a09821a98ac0680fad765217302858e70fa4Paul Duffin
550888a09821a98ac0680fad765217302858e70fa4Paul Duffin    List<String> misses = new ArrayList<String>();
560888a09821a98ac0680fad765217302858e70fa4Paul Duffin    for (int i = 0; i < 256 - hits.size(); ++i) {
570888a09821a98ac0680fad765217302858e70fa4Paul Duffin      misses.add("INVALID");
580888a09821a98ac0680fad765217302858e70fa4Paul Duffin    }
590888a09821a98ac0680fad765217302858e70fa4Paul Duffin
600888a09821a98ac0680fad765217302858e70fa4Paul Duffin    List<String> sampleDataList = new ArrayList<String>();
610888a09821a98ac0680fad765217302858e70fa4Paul Duffin    sampleDataList.addAll(hits);
620888a09821a98ac0680fad765217302858e70fa4Paul Duffin    sampleDataList.addAll(misses);
630888a09821a98ac0680fad765217302858e70fa4Paul Duffin    Collections.shuffle(sampleDataList);
640888a09821a98ac0680fad765217302858e70fa4Paul Duffin    sampleData = sampleDataList.toArray(new String[sampleDataList.size()]);
650888a09821a98ac0680fad765217302858e70fa4Paul Duffin  }
660888a09821a98ac0680fad765217302858e70fa4Paul Duffin
670888a09821a98ac0680fad765217302858e70fa4Paul Duffin  @Benchmark
680888a09821a98ac0680fad765217302858e70fa4Paul Duffin  void getIfPresent(int repetitions) {
690888a09821a98ac0680fad765217302858e70fa4Paul Duffin    for (int i = 0; i < repetitions; ++i) {
700888a09821a98ac0680fad765217302858e70fa4Paul Duffin      Enums.getIfPresent(enumType, sampleData[i & 255]);
710888a09821a98ac0680fad765217302858e70fa4Paul Duffin    }
720888a09821a98ac0680fad765217302858e70fa4Paul Duffin  }
730888a09821a98ac0680fad765217302858e70fa4Paul Duffin
740888a09821a98ac0680fad765217302858e70fa4Paul Duffin  private enum SmallEnum {
750888a09821a98ac0680fad765217302858e70fa4Paul Duffin    X0, X1, X2
760888a09821a98ac0680fad765217302858e70fa4Paul Duffin  }
770888a09821a98ac0680fad765217302858e70fa4Paul Duffin
780888a09821a98ac0680fad765217302858e70fa4Paul Duffin  private enum MediumEnum {
790888a09821a98ac0680fad765217302858e70fa4Paul Duffin    X0, X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X12, X13, X14, X15, X16, X17, X18,
800888a09821a98ac0680fad765217302858e70fa4Paul Duffin    X19, X20, X21, X22, X23, X24, X25, X26, X27, X28, X29, X30, X31, X32, X33, X34, X35, X36, X37,
810888a09821a98ac0680fad765217302858e70fa4Paul Duffin    X38, X39, X40, X41, X42, X43, X44, X45, X46, X47, X48, X49, X50, X51, X52, X53, X54, X55, X56,
820888a09821a98ac0680fad765217302858e70fa4Paul Duffin    X57, X58, X59, X60, X61, X62, X63, X64, X65, X66, X67, X68, X69, X70, X71, X72, X73, X74, X75,
830888a09821a98ac0680fad765217302858e70fa4Paul Duffin    X76, X77, X78, X79, X80, X81, X82, X83, X84, X85, X86, X87, X88, X89, X90, X91, X92, X93, X94,
840888a09821a98ac0680fad765217302858e70fa4Paul Duffin    X95, X96, X97, X98, X99
850888a09821a98ac0680fad765217302858e70fa4Paul Duffin  }
860888a09821a98ac0680fad765217302858e70fa4Paul Duffin
870888a09821a98ac0680fad765217302858e70fa4Paul Duffin  private enum LargeEnum {
880888a09821a98ac0680fad765217302858e70fa4Paul Duffin    X0, X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X12, X13, X14, X15, X16, X17, X18, X19, X20,
890888a09821a98ac0680fad765217302858e70fa4Paul Duffin    X21, X22, X23, X24, X25, X26, X27, X28, X29, X30, X31, X32, X33, X34, X35, X36, X37, X38, X39,
900888a09821a98ac0680fad765217302858e70fa4Paul Duffin    X40, X41, X42, X43, X44, X45, X46, X47, X48, X49, X50, X51, X52, X53, X54, X55, X56, X57, X58,
910888a09821a98ac0680fad765217302858e70fa4Paul Duffin    X59, X60, X61, X62, X63, X64, X65, X66, X67, X68, X69, X70, X71, X72, X73, X74, X75, X76, X77,
920888a09821a98ac0680fad765217302858e70fa4Paul Duffin    X78, X79, X80, X81, X82, X83, X84, X85, X86, X87, X88, X89, X90, X91, X92, X93, X94, X95, X96,
930888a09821a98ac0680fad765217302858e70fa4Paul Duffin    X97, X98, X99, X100, X101, X102, X103, X104, X105, X106, X107, X108, X109, X110, X111, X112,
940888a09821a98ac0680fad765217302858e70fa4Paul Duffin    X113, X114, X115, X116, X117, X118, X119, X120, X121, X122, X123, X124, X125, X126, X127, X128,
950888a09821a98ac0680fad765217302858e70fa4Paul Duffin    X129, X130, X131, X132, X133, X134, X135, X136, X137, X138, X139, X140, X141, X142, X143, X144,
960888a09821a98ac0680fad765217302858e70fa4Paul Duffin    X145, X146, X147, X148, X149, X150, X151, X152, X153, X154, X155, X156, X157, X158, X159, X160,
970888a09821a98ac0680fad765217302858e70fa4Paul Duffin    X161, X162, X163, X164, X165, X166, X167, X168, X169, X170, X171, X172, X173, X174, X175, X176,
980888a09821a98ac0680fad765217302858e70fa4Paul Duffin    X177, X178, X179, X180, X181, X182, X183, X184, X185, X186, X187, X188, X189, X190, X191, X192,
990888a09821a98ac0680fad765217302858e70fa4Paul Duffin    X193, X194, X195, X196, X197, X198, X199, X200, X201, X202, X203, X204, X205, X206, X207, X208,
1000888a09821a98ac0680fad765217302858e70fa4Paul Duffin    X209, X210, X211, X212, X213, X214, X215, X216, X217, X218, X219, X220, X221, X222, X223, X224,
1010888a09821a98ac0680fad765217302858e70fa4Paul Duffin    X225, X226, X227, X228, X229, X230, X231, X232, X233, X234, X235, X236, X237, X238, X239, X240,
1020888a09821a98ac0680fad765217302858e70fa4Paul Duffin    X241, X242, X243, X244, X245, X246, X247, X248, X249, X250, X251, X252, X253, X254, X255, X256,
1030888a09821a98ac0680fad765217302858e70fa4Paul Duffin    X257, X258, X259, X260, X261, X262, X263, X264, X265, X266, X267, X268, X269, X270, X271, X272,
1040888a09821a98ac0680fad765217302858e70fa4Paul Duffin    X273, X274, X275, X276, X277, X278, X279, X280, X281, X282, X283, X284, X285, X286, X287, X288,
1050888a09821a98ac0680fad765217302858e70fa4Paul Duffin    X289, X290, X291, X292, X293, X294, X295, X296, X297, X298, X299, X300, X301, X302, X303, X304,
1060888a09821a98ac0680fad765217302858e70fa4Paul Duffin    X305, X306, X307, X308, X309, X310, X311, X312, X313, X314, X315, X316, X317, X318, X319, X320,
1070888a09821a98ac0680fad765217302858e70fa4Paul Duffin    X321, X322, X323, X324, X325, X326, X327, X328, X329, X330, X331, X332, X333, X334, X335, X336,
1080888a09821a98ac0680fad765217302858e70fa4Paul Duffin    X337, X338, X339, X340, X341, X342, X343, X344, X345, X346, X347, X348, X349, X350, X351, X352,
1090888a09821a98ac0680fad765217302858e70fa4Paul Duffin    X353, X354, X355, X356, X357, X358, X359, X360, X361, X362, X363, X364, X365, X366, X367, X368,
1100888a09821a98ac0680fad765217302858e70fa4Paul Duffin    X369, X370, X371, X372, X373, X374, X375, X376, X377, X378, X379, X380, X381, X382, X383, X384,
1110888a09821a98ac0680fad765217302858e70fa4Paul Duffin    X385, X386, X387, X388, X389, X390, X391, X392, X393, X394, X395, X396, X397, X398, X399, X400,
1120888a09821a98ac0680fad765217302858e70fa4Paul Duffin    X401, X402, X403, X404, X405, X406, X407, X408, X409, X410, X411, X412, X413, X414, X415, X416,
1130888a09821a98ac0680fad765217302858e70fa4Paul Duffin    X417, X418, X419, X420, X421, X422, X423, X424, X425, X426, X427, X428, X429, X430, X431, X432,
1140888a09821a98ac0680fad765217302858e70fa4Paul Duffin    X433, X434, X435, X436, X437, X438, X439, X440, X441, X442, X443, X444, X445, X446, X447, X448,
1150888a09821a98ac0680fad765217302858e70fa4Paul Duffin    X449, X450, X451, X452, X453, X454, X455, X456, X457, X458, X459, X460, X461, X462, X463, X464,
1160888a09821a98ac0680fad765217302858e70fa4Paul Duffin    X465, X466, X467, X468, X469, X470, X471, X472, X473, X474, X475, X476, X477, X478, X479, X480,
1170888a09821a98ac0680fad765217302858e70fa4Paul Duffin    X481, X482, X483, X484, X485, X486, X487, X488, X489, X490, X491, X492, X493, X494, X495, X496,
1180888a09821a98ac0680fad765217302858e70fa4Paul Duffin    X497, X498, X499, X500, X501, X502, X503, X504, X505, X506, X507, X508, X509, X510, X511, X512,
1190888a09821a98ac0680fad765217302858e70fa4Paul Duffin    X513, X514, X515, X516, X517, X518, X519, X520, X521, X522, X523, X524, X525, X526, X527, X528,
1200888a09821a98ac0680fad765217302858e70fa4Paul Duffin    X529, X530, X531, X532, X533, X534, X535, X536, X537, X538, X539, X540, X541, X542, X543, X544,
1210888a09821a98ac0680fad765217302858e70fa4Paul Duffin    X545, X546, X547, X548, X549, X550, X551, X552, X553, X554, X555, X556, X557, X558, X559, X560,
1220888a09821a98ac0680fad765217302858e70fa4Paul Duffin    X561, X562, X563, X564, X565, X566, X567, X568, X569, X570, X571, X572, X573, X574, X575, X576,
1230888a09821a98ac0680fad765217302858e70fa4Paul Duffin    X577, X578, X579, X580, X581, X582, X583, X584, X585, X586, X587, X588, X589, X590, X591, X592,
1240888a09821a98ac0680fad765217302858e70fa4Paul Duffin    X593, X594, X595, X596, X597, X598, X599, X600, X601, X602, X603, X604, X605, X606, X607, X608,
1250888a09821a98ac0680fad765217302858e70fa4Paul Duffin    X609, X610, X611, X612, X613, X614, X615, X616, X617, X618, X619, X620, X621, X622, X623, X624,
1260888a09821a98ac0680fad765217302858e70fa4Paul Duffin    X625, X626, X627, X628, X629, X630, X631, X632, X633, X634, X635, X636, X637, X638, X639, X640,
1270888a09821a98ac0680fad765217302858e70fa4Paul Duffin    X641, X642, X643, X644, X645, X646, X647, X648, X649, X650, X651, X652, X653, X654, X655, X656,
1280888a09821a98ac0680fad765217302858e70fa4Paul Duffin    X657, X658, X659, X660, X661, X662, X663, X664, X665, X666, X667, X668, X669, X670, X671, X672,
1290888a09821a98ac0680fad765217302858e70fa4Paul Duffin    X673, X674, X675, X676, X677, X678, X679, X680, X681, X682, X683, X684, X685, X686, X687, X688,
1300888a09821a98ac0680fad765217302858e70fa4Paul Duffin    X689, X690, X691, X692, X693, X694, X695, X696, X697, X698, X699, X700, X701, X702, X703, X704,
1310888a09821a98ac0680fad765217302858e70fa4Paul Duffin    X705, X706, X707, X708, X709, X710, X711, X712, X713, X714, X715, X716, X717, X718, X719, X720,
1320888a09821a98ac0680fad765217302858e70fa4Paul Duffin    X721, X722, X723, X724, X725, X726, X727, X728, X729, X730, X731, X732, X733, X734, X735, X736,
1330888a09821a98ac0680fad765217302858e70fa4Paul Duffin    X737, X738, X739, X740, X741, X742, X743, X744, X745, X746, X747, X748, X749, X750, X751, X752,
1340888a09821a98ac0680fad765217302858e70fa4Paul Duffin    X753, X754, X755, X756, X757, X758, X759, X760, X761, X762, X763, X764, X765, X766, X767, X768,
1350888a09821a98ac0680fad765217302858e70fa4Paul Duffin    X769, X770, X771, X772, X773, X774, X775, X776, X777, X778, X779, X780, X781, X782, X783, X784,
1360888a09821a98ac0680fad765217302858e70fa4Paul Duffin    X785, X786, X787, X788, X789, X790, X791, X792, X793, X794, X795, X796, X797, X798, X799, X800,
1370888a09821a98ac0680fad765217302858e70fa4Paul Duffin    X801, X802, X803, X804, X805, X806, X807, X808, X809, X810, X811, X812, X813, X814, X815, X816,
1380888a09821a98ac0680fad765217302858e70fa4Paul Duffin    X817, X818, X819, X820, X821, X822, X823, X824, X825, X826, X827, X828, X829, X830, X831, X832,
1390888a09821a98ac0680fad765217302858e70fa4Paul Duffin    X833, X834, X835, X836, X837, X838, X839, X840, X841, X842, X843, X844, X845, X846, X847, X848,
1400888a09821a98ac0680fad765217302858e70fa4Paul Duffin    X849, X850, X851, X852, X853, X854, X855, X856, X857, X858, X859, X860, X861, X862, X863, X864,
1410888a09821a98ac0680fad765217302858e70fa4Paul Duffin    X865, X866, X867, X868, X869, X870, X871, X872, X873, X874, X875, X876, X877, X878, X879, X880,
1420888a09821a98ac0680fad765217302858e70fa4Paul Duffin    X881, X882, X883, X884, X885, X886, X887, X888, X889, X890, X891, X892, X893, X894, X895, X896,
1430888a09821a98ac0680fad765217302858e70fa4Paul Duffin    X897, X898, X899, X900, X901, X902, X903, X904, X905, X906, X907, X908, X909, X910, X911, X912,
1440888a09821a98ac0680fad765217302858e70fa4Paul Duffin    X913, X914, X915, X916, X917, X918, X919, X920, X921, X922, X923, X924, X925, X926, X927, X928,
1450888a09821a98ac0680fad765217302858e70fa4Paul Duffin    X929, X930, X931, X932, X933, X934, X935, X936, X937, X938, X939, X940, X941, X942, X943, X944,
1460888a09821a98ac0680fad765217302858e70fa4Paul Duffin    X945, X946, X947, X948, X949, X950, X951, X952, X953, X954, X955, X956, X957, X958, X959, X960,
1470888a09821a98ac0680fad765217302858e70fa4Paul Duffin    X961, X962, X963, X964, X965, X966, X967, X968, X969, X970, X971, X972, X973, X974, X975, X976,
1480888a09821a98ac0680fad765217302858e70fa4Paul Duffin    X977, X978, X979, X980, X981, X982, X983, X984, X985, X986, X987, X988, X989, X990, X991,
1490888a09821a98ac0680fad765217302858e70fa4Paul Duffin    X992, X993, X994, X995, X996, X997, X998, X999, X1000, X1001, X1002, X1003, X1004, X1005, X1006,
1500888a09821a98ac0680fad765217302858e70fa4Paul Duffin    X1007, X1008, X1009, X1010, X1011, X1012, X1013, X1014, X1015, X1016, X1017, X1018, X1019,
1510888a09821a98ac0680fad765217302858e70fa4Paul Duffin    X1020, X1021, X1022, X1023, X1024, X1025, X1026, X1027, X1028, X1029, X1030, X1031, X1032,
1520888a09821a98ac0680fad765217302858e70fa4Paul Duffin    X1033, X1034, X1035, X1036, X1037, X1038, X1039, X1040, X1041, X1042, X1043, X1044, X1045,
1530888a09821a98ac0680fad765217302858e70fa4Paul Duffin    X1046, X1047, X1048, X1049, X1050, X1051, X1052, X1053, X1054, X1055, X1056, X1057, X1058,
1540888a09821a98ac0680fad765217302858e70fa4Paul Duffin    X1059, X1060, X1061, X1062, X1063, X1064, X1065, X1066, X1067, X1068, X1069, X1070, X1071,
1550888a09821a98ac0680fad765217302858e70fa4Paul Duffin    X1072, X1073, X1074, X1075, X1076, X1077, X1078, X1079, X1080, X1081, X1082, X1083, X1084,
1560888a09821a98ac0680fad765217302858e70fa4Paul Duffin    X1085, X1086, X1087, X1088, X1089, X1090, X1091, X1092, X1093, X1094, X1095, X1096, X1097,
1570888a09821a98ac0680fad765217302858e70fa4Paul Duffin    X1098, X1099, X1100, X1101, X1102, X1103, X1104, X1105, X1106, X1107, X1108, X1109, X1110,
1580888a09821a98ac0680fad765217302858e70fa4Paul Duffin    X1111, X1112, X1113, X1114, X1115, X1116, X1117, X1118, X1119, X1120, X1121, X1122, X1123,
1590888a09821a98ac0680fad765217302858e70fa4Paul Duffin    X1124, X1125, X1126, X1127, X1128, X1129, X1130, X1131, X1132, X1133, X1134, X1135, X1136,
1600888a09821a98ac0680fad765217302858e70fa4Paul Duffin    X1137, X1138, X1139, X1140, X1141, X1142, X1143, X1144, X1145, X1146, X1147, X1148, X1149,
1610888a09821a98ac0680fad765217302858e70fa4Paul Duffin    X1150, X1151, X1152, X1153, X1154, X1155, X1156, X1157, X1158, X1159, X1160, X1161, X1162,
1620888a09821a98ac0680fad765217302858e70fa4Paul Duffin    X1163, X1164, X1165, X1166, X1167, X1168, X1169, X1170, X1171, X1172, X1173, X1174, X1175,
1630888a09821a98ac0680fad765217302858e70fa4Paul Duffin    X1176, X1177, X1178, X1179, X1180, X1181, X1182, X1183, X1184, X1185, X1186, X1187, X1188,
1640888a09821a98ac0680fad765217302858e70fa4Paul Duffin    X1189,
1650888a09821a98ac0680fad765217302858e70fa4Paul Duffin    X1190, X1191, X1192, X1193, X1194, X1195, X1196, X1197, X1198, X1199, X1200, X1201, X1202,
1660888a09821a98ac0680fad765217302858e70fa4Paul Duffin    X1203, X1204, X1205, X1206, X1207, X1208, X1209, X1210, X1211, X1212, X1213, X1214, X1215,
1670888a09821a98ac0680fad765217302858e70fa4Paul Duffin    X1216, X1217, X1218, X1219, X1220, X1221, X1222, X1223, X1224, X1225, X1226, X1227, X1228,
1680888a09821a98ac0680fad765217302858e70fa4Paul Duffin    X1229, X1230, X1231, X1232, X1233, X1234, X1235, X1236, X1237, X1238, X1239, X1240, X1241,
1690888a09821a98ac0680fad765217302858e70fa4Paul Duffin    X1242, X1243, X1244, X1245, X1246, X1247, X1248, X1249, X1250, X1251, X1252, X1253, X1254,
1700888a09821a98ac0680fad765217302858e70fa4Paul Duffin    X1255, X1256, X1257, X1258, X1259, X1260, X1261, X1262, X1263, X1264, X1265, X1266, X1267,
1710888a09821a98ac0680fad765217302858e70fa4Paul Duffin    X1268, X1269, X1270, X1271, X1272, X1273, X1274, X1275, X1276, X1277, X1278, X1279, X1280,
1720888a09821a98ac0680fad765217302858e70fa4Paul Duffin    X1281, X1282, X1283, X1284, X1285, X1286, X1287, X1288, X1289, X1290, X1291, X1292, X1293,
1730888a09821a98ac0680fad765217302858e70fa4Paul Duffin    X1294, X1295, X1296, X1297, X1298, X1299, X1300, X1301, X1302, X1303, X1304, X1305, X1306,
1740888a09821a98ac0680fad765217302858e70fa4Paul Duffin    X1307, X1308, X1309, X1310, X1311, X1312, X1313, X1314, X1315, X1316, X1317, X1318, X1319,
1750888a09821a98ac0680fad765217302858e70fa4Paul Duffin    X1320, X1321, X1322, X1323, X1324, X1325, X1326, X1327, X1328, X1329, X1330, X1331, X1332,
1760888a09821a98ac0680fad765217302858e70fa4Paul Duffin    X1333, X1334, X1335, X1336, X1337, X1338, X1339, X1340, X1341, X1342, X1343, X1344, X1345,
1770888a09821a98ac0680fad765217302858e70fa4Paul Duffin    X1346, X1347, X1348, X1349, X1350, X1351, X1352, X1353, X1354, X1355, X1356, X1357, X1358,
1780888a09821a98ac0680fad765217302858e70fa4Paul Duffin    X1359, X1360, X1361, X1362, X1363, X1364, X1365, X1366, X1367, X1368, X1369, X1370, X1371,
1790888a09821a98ac0680fad765217302858e70fa4Paul Duffin    X1372, X1373, X1374, X1375, X1376, X1377, X1378, X1379, X1380, X1381, X1382, X1383, X1384,
1800888a09821a98ac0680fad765217302858e70fa4Paul Duffin    X1385, X1386, X1387, X1388, X1389, X1390, X1391, X1392, X1393, X1394, X1395, X1396, X1397,
1810888a09821a98ac0680fad765217302858e70fa4Paul Duffin    X1398, X1399, X1400, X1401, X1402, X1403, X1404, X1405, X1406, X1407, X1408, X1409, X1410,
1820888a09821a98ac0680fad765217302858e70fa4Paul Duffin    X1411, X1412, X1413, X1414, X1415, X1416, X1417, X1418, X1419, X1420, X1421, X1422, X1423,
1830888a09821a98ac0680fad765217302858e70fa4Paul Duffin    X1424, X1425, X1426, X1427, X1428, X1429, X1430, X1431, X1432, X1433, X1434, X1435, X1436,
1840888a09821a98ac0680fad765217302858e70fa4Paul Duffin    X1437, X1438, X1439, X1440, X1441, X1442, X1443, X1444, X1445, X1446, X1447, X1448, X1449,
1850888a09821a98ac0680fad765217302858e70fa4Paul Duffin    X1450, X1451, X1452, X1453, X1454, X1455, X1456, X1457, X1458, X1459, X1460, X1461, X1462,
1860888a09821a98ac0680fad765217302858e70fa4Paul Duffin    X1463, X1464, X1465, X1466, X1467, X1468, X1469, X1470, X1471, X1472, X1473, X1474, X1475,
1870888a09821a98ac0680fad765217302858e70fa4Paul Duffin    X1476, X1477, X1478, X1479, X1480, X1481, X1482, X1483, X1484, X1485, X1486, X1487, X1488,
1880888a09821a98ac0680fad765217302858e70fa4Paul Duffin    X1489, X1490, X1491, X1492, X1493, X1494, X1495, X1496, X1497, X1498, X1499, X1500, X1501,
1890888a09821a98ac0680fad765217302858e70fa4Paul Duffin    X1502, X1503, X1504, X1505, X1506, X1507, X1508, X1509, X1510, X1511, X1512, X1513, X1514,
1900888a09821a98ac0680fad765217302858e70fa4Paul Duffin    X1515, X1516, X1517, X1518, X1519, X1520, X1521, X1522, X1523, X1524, X1525, X1526, X1527,
1910888a09821a98ac0680fad765217302858e70fa4Paul Duffin    X1528, X1529, X1530, X1531, X1532, X1533, X1534, X1535, X1536, X1537, X1538, X1539, X1540,
1920888a09821a98ac0680fad765217302858e70fa4Paul Duffin    X1541, X1542, X1543, X1544, X1545, X1546, X1547, X1548, X1549, X1550, X1551, X1552, X1553,
1930888a09821a98ac0680fad765217302858e70fa4Paul Duffin    X1554, X1555, X1556, X1557, X1558, X1559, X1560, X1561, X1562, X1563, X1564, X1565, X1566,
1940888a09821a98ac0680fad765217302858e70fa4Paul Duffin    X1567, X1568, X1569, X1570, X1571, X1572, X1573, X1574, X1575, X1576, X1577, X1578, X1579,
1950888a09821a98ac0680fad765217302858e70fa4Paul Duffin    X1580, X1581, X1582, X1583, X1584, X1585, X1586, X1587, X1588, X1589, X1590, X1591, X1592,
1960888a09821a98ac0680fad765217302858e70fa4Paul Duffin    X1593, X1594, X1595, X1596, X1597, X1598, X1599, X1600, X1601, X1602, X1603, X1604, X1605,
1970888a09821a98ac0680fad765217302858e70fa4Paul Duffin    X1606, X1607, X1608, X1609, X1610, X1611, X1612, X1613, X1614, X1615, X1616, X1617, X1618,
1980888a09821a98ac0680fad765217302858e70fa4Paul Duffin    X1619, X1620, X1621, X1622, X1623, X1624, X1625, X1626, X1627, X1628, X1629, X1630, X1631,
1990888a09821a98ac0680fad765217302858e70fa4Paul Duffin    X1632, X1633, X1634, X1635, X1636, X1637, X1638, X1639, X1640, X1641, X1642, X1643, X1644,
2000888a09821a98ac0680fad765217302858e70fa4Paul Duffin    X1645, X1646, X1647, X1648, X1649, X1650, X1651, X1652, X1653, X1654, X1655, X1656, X1657,
2010888a09821a98ac0680fad765217302858e70fa4Paul Duffin    X1658, X1659, X1660, X1661, X1662, X1663, X1664, X1665, X1666, X1667, X1668, X1669, X1670,
2020888a09821a98ac0680fad765217302858e70fa4Paul Duffin    X1671, X1672, X1673, X1674, X1675, X1676, X1677, X1678, X1679, X1680, X1681, X1682, X1683,
2030888a09821a98ac0680fad765217302858e70fa4Paul Duffin    X1684, X1685, X1686, X1687, X1688, X1689, X1690, X1691, X1692, X1693, X1694, X1695, X1696,
2040888a09821a98ac0680fad765217302858e70fa4Paul Duffin    X1697, X1698, X1699, X1700, X1701, X1702, X1703, X1704, X1705, X1706, X1707, X1708, X1709,
2050888a09821a98ac0680fad765217302858e70fa4Paul Duffin    X1710, X1711, X1712, X1713, X1714, X1715, X1716, X1717, X1718, X1719, X1720, X1721, X1722,
2060888a09821a98ac0680fad765217302858e70fa4Paul Duffin    X1723, X1724, X1725, X1726, X1727, X1728, X1729, X1730, X1731, X1732, X1733, X1734, X1735,
2070888a09821a98ac0680fad765217302858e70fa4Paul Duffin    X1736, X1737, X1738, X1739, X1740, X1741, X1742, X1743, X1744, X1745, X1746, X1747, X1748,
2080888a09821a98ac0680fad765217302858e70fa4Paul Duffin    X1749, X1750, X1751, X1752, X1753, X1754, X1755, X1756, X1757, X1758, X1759, X1760, X1761,
2090888a09821a98ac0680fad765217302858e70fa4Paul Duffin    X1762, X1763, X1764, X1765, X1766, X1767, X1768, X1769, X1770, X1771, X1772, X1773, X1774,
2100888a09821a98ac0680fad765217302858e70fa4Paul Duffin    X1775, X1776, X1777, X1778, X1779, X1780, X1781, X1782, X1783, X1784, X1785, X1786, X1787,
2110888a09821a98ac0680fad765217302858e70fa4Paul Duffin    X1788, X1789, X1790, X1791, X1792, X1793, X1794, X1795, X1796, X1797, X1798, X1799, X1800,
2120888a09821a98ac0680fad765217302858e70fa4Paul Duffin    X1801, X1802, X1803, X1804, X1805, X1806, X1807, X1808, X1809, X1810, X1811, X1812, X1813,
2130888a09821a98ac0680fad765217302858e70fa4Paul Duffin    X1814, X1815, X1816, X1817, X1818, X1819, X1820, X1821, X1822, X1823, X1824, X1825, X1826,
2140888a09821a98ac0680fad765217302858e70fa4Paul Duffin    X1827, X1828, X1829, X1830, X1831, X1832, X1833, X1834, X1835, X1836, X1837, X1838, X1839,
2150888a09821a98ac0680fad765217302858e70fa4Paul Duffin    X1840, X1841, X1842, X1843, X1844, X1845, X1846, X1847, X1848, X1849, X1850, X1851, X1852,
2160888a09821a98ac0680fad765217302858e70fa4Paul Duffin    X1853, X1854, X1855, X1856, X1857, X1858, X1859, X1860, X1861, X1862, X1863, X1864, X1865,
2170888a09821a98ac0680fad765217302858e70fa4Paul Duffin    X1866, X1867, X1868, X1869, X1870, X1871, X1872, X1873, X1874, X1875, X1876, X1877, X1878,
2180888a09821a98ac0680fad765217302858e70fa4Paul Duffin    X1879, X1880, X1881, X1882, X1883, X1884, X1885, X1886, X1887, X1888, X1889, X1890, X1891,
2190888a09821a98ac0680fad765217302858e70fa4Paul Duffin    X1892, X1893, X1894, X1895, X1896, X1897, X1898, X1899, X1900, X1901, X1902, X1903, X1904,
2200888a09821a98ac0680fad765217302858e70fa4Paul Duffin    X1905, X1906, X1907, X1908, X1909, X1910, X1911, X1912, X1913, X1914, X1915, X1916, X1917,
2210888a09821a98ac0680fad765217302858e70fa4Paul Duffin    X1918, X1919, X1920, X1921, X1922, X1923, X1924, X1925, X1926, X1927, X1928, X1929, X1930,
2220888a09821a98ac0680fad765217302858e70fa4Paul Duffin    X1931, X1932, X1933, X1934, X1935, X1936, X1937, X1938, X1939, X1940, X1941, X1942, X1943,
2230888a09821a98ac0680fad765217302858e70fa4Paul Duffin    X1944, X1945, X1946, X1947, X1948, X1949, X1950, X1951, X1952, X1953, X1954, X1955, X1956,
2240888a09821a98ac0680fad765217302858e70fa4Paul Duffin    X1957, X1958, X1959, X1960, X1961, X1962, X1963, X1964, X1965, X1966, X1967, X1968, X1969,
2250888a09821a98ac0680fad765217302858e70fa4Paul Duffin    X1970, X1971, X1972, X1973, X1974, X1975, X1976, X1977, X1978, X1979, X1980, X1981, X1982,
2260888a09821a98ac0680fad765217302858e70fa4Paul Duffin    X1983, X1984, X1985, X1986, X1987, X1988, X1989, X1990, X1991, X1992, X1993, X1994, X1995,
2270888a09821a98ac0680fad765217302858e70fa4Paul Duffin    X1996, X1997, X1998, X1999, X2000, X2001, X2002, X2003, X2004, X2005, X2006, X2007, X2008,
2280888a09821a98ac0680fad765217302858e70fa4Paul Duffin    X2009, X2010, X2011, X2012, X2013, X2014, X2015, X2016, X2017, X2018, X2019, X2020, X2021,
2290888a09821a98ac0680fad765217302858e70fa4Paul Duffin    X2022, X2023, X2024, X2025, X2026, X2027, X2028, X2029, X2030, X2031, X2032, X2033, X2034,
2300888a09821a98ac0680fad765217302858e70fa4Paul Duffin    X2035, X2036, X2037, X2038, X2039, X2040, X2041, X2042, X2043, X2044, X2045, X2046, X2047,
2310888a09821a98ac0680fad765217302858e70fa4Paul Duffin    X2048, X2049, X2050, X2051, X2052, X2053, X2054, X2055, X2056, X2057, X2058, X2059, X2060,
2320888a09821a98ac0680fad765217302858e70fa4Paul Duffin    X2061, X2062, X2063, X2064, X2065, X2066, X2067, X2068, X2069, X2070, X2071, X2072, X2073,
2330888a09821a98ac0680fad765217302858e70fa4Paul Duffin    X2074, X2075, X2076, X2077, X2078, X2079, X2080, X2081, X2082, X2083, X2084, X2085, X2086,
2340888a09821a98ac0680fad765217302858e70fa4Paul Duffin    X2087, X2088, X2089, X2090, X2091, X2092, X2093, X2094, X2095, X2096, X2097, X2098, X2099,
2350888a09821a98ac0680fad765217302858e70fa4Paul Duffin    X2100, X2101, X2102, X2103, X2104, X2105, X2106, X2107, X2108, X2109, X2110, X2111, X2112,
2360888a09821a98ac0680fad765217302858e70fa4Paul Duffin    X2113, X2114, X2115, X2116, X2117, X2118, X2119, X2120, X2121, X2122, X2123, X2124, X2125,
2370888a09821a98ac0680fad765217302858e70fa4Paul Duffin    X2126, X2127, X2128, X2129, X2130, X2131, X2132, X2133, X2134, X2135, X2136, X2137, X2138,
2380888a09821a98ac0680fad765217302858e70fa4Paul Duffin    X2139, X2140, X2141, X2142, X2143, X2144, X2145, X2146, X2147, X2148, X2149, X2150, X2151,
2390888a09821a98ac0680fad765217302858e70fa4Paul Duffin    X2152, X2153, X2154, X2155, X2156, X2157, X2158, X2159, X2160, X2161, X2162, X2163, X2164,
2400888a09821a98ac0680fad765217302858e70fa4Paul Duffin    X2165, X2166, X2167, X2168, X2169, X2170, X2171, X2172, X2173, X2174, X2175, X2176, X2177,
2410888a09821a98ac0680fad765217302858e70fa4Paul Duffin    X2178, X2179, X2180, X2181, X2182, X2183, X2184, X2185, X2186, X2187, X2188, X2189, X2190,
2420888a09821a98ac0680fad765217302858e70fa4Paul Duffin    X2191, X2192, X2193, X2194, X2195, X2196, X2197, X2198, X2199, X2200, X2201, X2202, X2203,
2430888a09821a98ac0680fad765217302858e70fa4Paul Duffin    X2204, X2205, X2206, X2207, X2208, X2209, X2210, X2211, X2212, X2213, X2214, X2215, X2216,
2440888a09821a98ac0680fad765217302858e70fa4Paul Duffin    X2217, X2218, X2219, X2220, X2221, X2222, X2223, X2224, X2225, X2226, X2227, X2228, X2229,
2450888a09821a98ac0680fad765217302858e70fa4Paul Duffin    X2230, X2231, X2232, X2233, X2234, X2235, X2236, X2237, X2238, X2239, X2240, X2241, X2242,
2460888a09821a98ac0680fad765217302858e70fa4Paul Duffin    X2243, X2244, X2245, X2246, X2247, X2248, X2249, X2250, X2251, X2252, X2253, X2254, X2255,
2470888a09821a98ac0680fad765217302858e70fa4Paul Duffin    X2256, X2257, X2258, X2259, X2260, X2261, X2262, X2263, X2264, X2265, X2266, X2267, X2268,
2480888a09821a98ac0680fad765217302858e70fa4Paul Duffin    X2269, X2270, X2271, X2272, X2273, X2274, X2275, X2276, X2277, X2278, X2279, X2280, X2281,
2490888a09821a98ac0680fad765217302858e70fa4Paul Duffin    X2282, X2283, X2284, X2285, X2286, X2287, X2288, X2289, X2290, X2291, X2292, X2293, X2294,
2500888a09821a98ac0680fad765217302858e70fa4Paul Duffin    X2295, X2296, X2297, X2298, X2299, X2300, X2301, X2302, X2303, X2304, X2305, X2306, X2307,
2510888a09821a98ac0680fad765217302858e70fa4Paul Duffin    X2308, X2309, X2310, X2311, X2312, X2313, X2314, X2315, X2316, X2317, X2318, X2319, X2320,
2520888a09821a98ac0680fad765217302858e70fa4Paul Duffin    X2321, X2322, X2323, X2324, X2325, X2326, X2327, X2328, X2329, X2330, X2331, X2332, X2333,
2530888a09821a98ac0680fad765217302858e70fa4Paul Duffin    X2334, X2335, X2336, X2337, X2338, X2339, X2340, X2341, X2342, X2343, X2344, X2345, X2346,
2540888a09821a98ac0680fad765217302858e70fa4Paul Duffin    X2347, X2348, X2349, X2350, X2351, X2352, X2353, X2354, X2355, X2356, X2357, X2358, X2359,
2550888a09821a98ac0680fad765217302858e70fa4Paul Duffin    X2360, X2361, X2362, X2363, X2364, X2365, X2366, X2367, X2368, X2369, X2370, X2371, X2372,
2560888a09821a98ac0680fad765217302858e70fa4Paul Duffin    X2373, X2374, X2375, X2376, X2377, X2378, X2379, X2380, X2381, X2382, X2383, X2384, X2385,
2570888a09821a98ac0680fad765217302858e70fa4Paul Duffin    X2386, X2387, X2388, X2389, X2390, X2391, X2392, X2393, X2394, X2395, X2396, X2397, X2398,
2580888a09821a98ac0680fad765217302858e70fa4Paul Duffin    X2399, X2400, X2401, X2402, X2403, X2404, X2405, X2406, X2407, X2408, X2409, X2410, X2411,
2590888a09821a98ac0680fad765217302858e70fa4Paul Duffin    X2412, X2413, X2414, X2415, X2416, X2417, X2418, X2419, X2420, X2421, X2422, X2423, X2424,
2600888a09821a98ac0680fad765217302858e70fa4Paul Duffin    X2425, X2426, X2427, X2428, X2429, X2430, X2431, X2432, X2433, X2434, X2435, X2436, X2437,
2610888a09821a98ac0680fad765217302858e70fa4Paul Duffin    X2438, X2439, X2440, X2441, X2442, X2443, X2444, X2445, X2446, X2447, X2448, X2449, X2450,
2620888a09821a98ac0680fad765217302858e70fa4Paul Duffin    X2451, X2452, X2453, X2454, X2455, X2456, X2457, X2458, X2459, X2460, X2461, X2462, X2463,
2630888a09821a98ac0680fad765217302858e70fa4Paul Duffin    X2464, X2465, X2466, X2467, X2468, X2469, X2470, X2471, X2472, X2473, X2474, X2475, X2476,
2640888a09821a98ac0680fad765217302858e70fa4Paul Duffin    X2477, X2478, X2479, X2480, X2481, X2482, X2483, X2484, X2485, X2486, X2487, X2488, X2489,
2650888a09821a98ac0680fad765217302858e70fa4Paul Duffin    X2490, X2491, X2492, X2493, X2494, X2495, X2496, X2497, X2498, X2499
2660888a09821a98ac0680fad765217302858e70fa4Paul Duffin  }
2670888a09821a98ac0680fad765217302858e70fa4Paul Duffin}
268