Index: clang/tools/clang-fuzzer/handle-llvm/handle_llvm.h =================================================================== --- clang/tools/clang-fuzzer/handle-llvm/handle_llvm.h +++ clang/tools/clang-fuzzer/handle-llvm/handle_llvm.h @@ -19,7 +19,7 @@ namespace clang_fuzzer { void HandleLLVM(const std::string &S, - const std::vector &ExtraArgs); + const std::vector &ExtraArgs); } // namespace clang_fuzzer #endif Index: clang/tools/clang-fuzzer/handle-llvm/handle_llvm.cpp =================================================================== --- clang/tools/clang-fuzzer/handle-llvm/handle_llvm.cpp +++ clang/tools/clang-fuzzer/handle-llvm/handle_llvm.cpp @@ -15,6 +15,7 @@ //===----------------------------------------------------------------------===// #include "handle_llvm.h" +#include "input_arrays.h" #include "llvm/ADT/Triple.h" #include "llvm/Analysis/TargetLibraryInfo.h" @@ -48,6 +49,9 @@ using namespace llvm; +// Define a type for the functions that are compiled and executed +typedef void (*LLVMFunc)(int*, int*, int*, int); + // Helper function to parse command line args and find the optimization level static void getOptLevel(const std::vector &ExtraArgs, CodeGenOpt::Level &OLvl) { @@ -68,6 +72,7 @@ } } +// Helper function to print error message and stop the fuzzer void ErrorAndExit(std::string message) { errs()<< "ERROR: " << message << "\n"; std::exit(1); @@ -117,11 +122,25 @@ return OS.str(); } -void CreateAndRunJITFun(const std::string &IR, CodeGenOpt::Level OLvl) { +// Takes a function and runs it on a set of inputs +// First determines whether f is the optimized or unoptimized function +void RunFuncOnInputs(LLVMFunc f, int x) { + if (x) { + for (int i = 0; i < NumArrays; i++) + f(OptArrays[i], OptArrays[(i + 1) % NumArrays], + OptArrays[(i + 2) % NumArrays], ArraySize); + } else { + for (int i = 0; i < NumArrays; i++) + f(UnoptArrays[i], UnoptArrays[(i + 1) % NumArrays], + UnoptArrays[(i + 2) % NumArrays], ArraySize); + } +} + +// Takes a string of IR and compiles it using LLVM's JIT Engine +void CreateJITFunc(const std::string &IR, CodeGenOpt::Level OLvl) { SMDiagnostic Err; LLVMContext Context; - std::unique_ptr M = parseIR(MemoryBufferRef(IR, "IR"), Err, - Context); + std::unique_ptr M = parseIR(MemoryBufferRef(IR, "IR"), Err, Context); if (!M) ErrorAndExit("Could not parse IR"); @@ -148,14 +167,11 @@ EE->finalizeObject(); EE->runStaticConstructorsDestructors(false); - typedef void (*func)(int*, int*, int*, int); - func f = reinterpret_cast(EE->getPointerToFunction(EntryFunc)); + LLVMFunc f = (LLVMFunc) EE->getPointerToFunction(EntryFunc); - // Define some dummy arrays to use an input for now - int a[] = {1}; - int b[] = {1}; - int c[] = {1}; - f(a, b, c, 1); + // Figure out if we are running the optimized func or the unoptimized func + int x = (OLvl == CodeGenOpt::None) ? 1 : 0; + RunFuncOnInputs(f, x); EE->runStaticConstructorsDestructors(true); } @@ -164,6 +180,10 @@ // Mimics the lli tool to JIT the LLVM IR code and execute it void clang_fuzzer::HandleLLVM(const std::string &IR, const std::vector &ExtraArgs) { + // Populate OptArrays and UnoptArrays with the arrays from InputArrays + memcpy(OptArrays, InputArrays, sizeof(int) * ArraySize * NumArrays); + memcpy(UnoptArrays, InputArrays, sizeof(int) * ArraySize * NumArrays); + // Parse ExtraArgs to set the optimization level CodeGenOpt::Level OLvl; getOptLevel(ExtraArgs, OLvl); @@ -171,8 +191,11 @@ // First we optimize the IR by running a loop vectorizer pass std::string OptIR = OptLLVM(IR, OLvl); - CreateAndRunJITFun(OptIR, OLvl); - CreateAndRunJITFun(IR, CodeGenOpt::None); - + CreateJITFunc(OptIR, OLvl); + CreateJITFunc(IR, CodeGenOpt::None); + + if (memcmp(OptArrays, UnoptArrays, sizeof(int) * ArraySize * NumArrays)) + ErrorAndExit("!!!BUG!!!"); + return; } Index: clang/tools/clang-fuzzer/handle-llvm/input_arrays.h =================================================================== --- /dev/null +++ clang/tools/clang-fuzzer/handle-llvm/input_arrays.h @@ -0,0 +1,125 @@ +//==-- input_arrays.h - Helper function for LLVM fuzzer inputs -------------==// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// +// +// Define a few static variables used by the LLVM Proto Fuzzer +// +//===----------------------------------------------------------------------===// + +#include +#include + +static const int ArraySize = 64; +static const int NumArrays = 100; + +// Define two arrays that will hold the input and output for the two functions +static int OptArrays[NumArrays][ArraySize]; +static int UnoptArrays[NumArrays][ArraySize]; + +// Define a corpus of possible inputs +static int InputArrays[NumArrays][ArraySize] = +{ {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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 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}, + {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, + {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, + {0, 0, 0, 5, 0, 2, 0, 8, 0, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8}, + {1, 1, 2, 1, 6, 0, 3, 1, 10, 10, 0, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10}, + {0, 0, 2, 0, 0, 7, 0, 4, 2, 0, 12, 12, 0, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12}, + {1, 1, 0, 2, 2, 9, 8, 0, 5, 3, 1, 14, 14, 14, 0, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14}, + {0, 0, 0, 4, 0, 1, 10, 9, 0, 6, 4, 2, 0, 16, 16, 16, 0, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16}, + {1, 1, 2, 3, 2, 3, 0, 11, 10, 0, 7, 5, 3, 1, 18, 18, 18, 18, 0, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18}, + {0, 0, 2, 5, 4, 0, 2, 13, 12, 11, 0, 8, 6, 4, 2, 0, 20, 20, 20, 20, 0, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20}, + {1, 1, 0, 1, 6, 2, 4, 1, 14, 13, 12, 0, 9, 7, 5, 3, 1, 22, 22, 22, 22, 22, 0, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22}, + {0, 0, 0, 0, 4, 4, 0, 3, 0, 15, 14, 13, 0, 10, 8, 6, 4, 2, 0, 24, 24, 24, 24, 24, 0, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24}, + {1, 1, 2, 2, 6, 6, 2, 5, 2, 17, 16, 15, 14, 0, 11, 9, 7, 5, 3, 1, 26, 26, 26, 26, 26, 26, 0, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26}, + {0, 0, 2, 4, 0, 8, 4, 0, 4, 1, 18, 17, 16, 15, 0, 12, 10, 8, 6, 4, 2, 0, 28, 28, 28, 28, 28, 28, 0, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28}, + {1, 1, 0, 3, 2, 5, 6, 2, 6, 3, 0, 19, 18, 17, 16, 0, 13, 11, 9, 7, 5, 3, 1, 30, 30, 30, 30, 30, 30, 30, 0, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30}, + {0, 0, 0, 5, 0, 7, 8, 4, 0, 5, 2, 21, 20, 19, 18, 17, 0, 14, 12, 10, 8, 6, 4, 2, 0, 32, 32, 32, 32, 32, 32, 32, 0, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32}, + {1, 1, 2, 1, 2, 9, 10, 6, 2, 7, 4, 1, 22, 21, 20, 19, 18, 0, 15, 13, 11, 9, 7, 5, 3, 1, 34, 34, 34, 34, 34, 34, 34, 34, 0, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34}, + {0, 0, 2, 0, 4, 1, 6, 8, 4, 0, 6, 3, 0, 23, 22, 21, 20, 19, 0, 16, 14, 12, 10, 8, 6, 4, 2, 0, 36, 36, 36, 36, 36, 36, 36, 36, 0, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36}, + {1, 1, 0, 2, 6, 3, 8, 10, 6, 2, 8, 5, 2, 25, 24, 23, 22, 21, 20, 0, 17, 15, 13, 11, 9, 7, 5, 3, 1, 38, 38, 38, 38, 38, 38, 38, 38, 38, 0, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38}, + {0, 0, 0, 4, 4, 0, 10, 12, 8, 4, 0, 7, 4, 1, 26, 25, 24, 23, 22, 21, 0, 18, 16, 14, 12, 10, 8, 6, 4, 2, 0, 40, 40, 40, 40, 40, 40, 40, 40, 40, 0, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40}, + {1, 1, 2, 3, 6, 2, 0, 7, 10, 6, 2, 9, 6, 3, 0, 27, 26, 25, 24, 23, 22, 0, 19, 17, 15, 13, 11, 9, 7, 5, 3, 1, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 0, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42}, + {0, 0, 2, 5, 0, 4, 2, 9, 12, 8, 4, 0, 8, 5, 2, 29, 28, 27, 26, 25, 24, 23, 0, 20, 18, 16, 14, 12, 10, 8, 6, 4, 2, 0, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 0, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44}, + {1, 1, 0, 1, 2, 6, 4, 11, 14, 10, 6, 2, 10, 7, 4, 1, 30, 29, 28, 27, 26, 25, 24, 0, 21, 19, 17, 15, 13, 11, 9, 7, 5, 3, 1, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 0, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46}, + {0, 0, 0, 0, 0, 8, 0, 13, 8, 12, 8, 4, 0, 9, 6, 3, 0, 31, 30, 29, 28, 27, 26, 25, 0, 22, 20, 18, 16, 14, 12, 10, 8, 6, 4, 2, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48}, + {1, 1, 2, 2, 2, 5, 2, 1, 10, 14, 10, 6, 2, 11, 8, 5, 2, 33, 32, 31, 30, 29, 28, 27, 26, 0, 23, 21, 19, 17, 15, 13, 11, 9, 7, 5, 3, 1, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 0, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50}, + {0, 0, 2, 4, 4, 7, 4, 3, 12, 16, 12, 8, 4, 0, 10, 7, 4, 1, 34, 33, 32, 31, 30, 29, 28, 27, 0, 24, 22, 20, 18, 16, 14, 12, 10, 8, 6, 4, 2, 0, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 0, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52}, + {1, 1, 0, 3, 6, 9, 6, 5, 14, 9, 14, 10, 6, 2, 12, 9, 6, 3, 0, 35, 34, 33, 32, 31, 30, 29, 28, 0, 25, 23, 21, 19, 17, 15, 13, 11, 9, 7, 5, 3, 1, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 0, 54, 54, 54, 54, 54, 54, 54, 54, 54}, + {0, 0, 0, 5, 4, 1, 8, 0, 0, 11, 16, 12, 8, 4, 0, 11, 8, 5, 2, 37, 36, 35, 34, 33, 32, 31, 30, 29, 0, 26, 24, 22, 20, 18, 16, 14, 12, 10, 8, 6, 4, 2, 0, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 0, 56, 56, 56, 56, 56, 56, 56}, + {1, 1, 2, 1, 6, 3, 10, 2, 2, 13, 18, 14, 10, 6, 2, 13, 10, 7, 4, 1, 38, 37, 36, 35, 34, 33, 32, 31, 30, 0, 27, 25, 23, 21, 19, 17, 15, 13, 11, 9, 7, 5, 3, 1, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 0, 58, 58, 58, 58, 58}, + {0, 0, 2, 0, 0, 0, 6, 4, 4, 15, 10, 16, 12, 8, 4, 0, 12, 9, 6, 3, 0, 39, 38, 37, 36, 35, 34, 33, 32, 31, 0, 28, 26, 24, 22, 20, 18, 16, 14, 12, 10, 8, 6, 4, 2, 0, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 0, 60, 60, 60}, + {1, 1, 0, 2, 2, 2, 8, 6, 6, 17, 12, 18, 14, 10, 6, 2, 14, 11, 8, 5, 2, 41, 40, 39, 38, 37, 36, 35, 34, 33, 32, 0, 29, 27, 25, 23, 21, 19, 17, 15, 13, 11, 9, 7, 5, 3, 1, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 0, 62}, + {0, 0, 0, 4, 0, 4, 10, 8, 0, 1, 14, 20, 16, 12, 8, 4, 0, 13, 10, 7, 4, 1, 42, 41, 40, 39, 38, 37, 36, 35, 34, 33, 0, 30, 28, 26, 24, 22, 20, 18, 16, 14, 12, 10, 8, 6, 4, 2, 0, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64}, + {1, 1, 2, 3, 2, 6, 0, 10, 2, 3, 16, 11, 18, 14, 10, 6, 2, 15, 12, 9, 6, 3, 0, 43, 42, 41, 40, 39, 38, 37, 36, 35, 34, 0, 31, 29, 27, 25, 23, 21, 19, 17, 15, 13, 11, 9, 7, 5, 3, 1, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66}, + {0, 0, 2, 5, 4, 8, 2, 12, 4, 5, 18, 13, 20, 16, 12, 8, 4, 0, 14, 11, 8, 5, 2, 45, 44, 43, 42, 41, 40, 39, 38, 37, 36, 35, 0, 32, 30, 28, 26, 24, 22, 20, 18, 16, 14, 12, 10, 8, 6, 4, 2, 0, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68}, + {1, 1, 0, 1, 6, 5, 4, 7, 6, 7, 0, 15, 22, 18, 14, 10, 6, 2, 16, 13, 10, 7, 4, 1, 46, 45, 44, 43, 42, 41, 40, 39, 38, 37, 36, 0, 33, 31, 29, 27, 25, 23, 21, 19, 17, 15, 13, 11, 9, 7, 5, 3, 1, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70}, + {0, 0, 0, 0, 4, 7, 0, 9, 8, 0, 2, 17, 12, 20, 16, 12, 8, 4, 0, 15, 12, 9, 6, 3, 0, 47, 46, 45, 44, 43, 42, 41, 40, 39, 38, 37, 0, 34, 32, 30, 28, 26, 24, 22, 20, 18, 16, 14, 12, 10, 8, 6, 4, 2, 0, 72, 72, 72, 72, 72, 72, 72, 72, 72}, + {1, 1, 2, 2, 6, 9, 2, 11, 10, 2, 4, 19, 14, 22, 18, 14, 10, 6, 2, 17, 14, 11, 8, 5, 2, 49, 48, 47, 46, 45, 44, 43, 42, 41, 40, 39, 38, 0, 35, 33, 31, 29, 27, 25, 23, 21, 19, 17, 15, 13, 11, 9, 7, 5, 3, 1, 74, 74, 74, 74, 74, 74, 74, 74}, + {0, 0, 2, 4, 0, 1, 4, 13, 12, 4, 6, 21, 16, 24, 20, 16, 12, 8, 4, 0, 16, 13, 10, 7, 4, 1, 50, 49, 48, 47, 46, 45, 44, 43, 42, 41, 40, 39, 0, 36, 34, 32, 30, 28, 26, 24, 22, 20, 18, 16, 14, 12, 10, 8, 6, 4, 2, 0, 76, 76, 76, 76, 76, 76}, + {1, 1, 0, 3, 2, 3, 6, 1, 14, 6, 8, 1, 18, 13, 22, 18, 14, 10, 6, 2, 18, 15, 12, 9, 6, 3, 0, 51, 50, 49, 48, 47, 46, 45, 44, 43, 42, 41, 40, 0, 37, 35, 33, 31, 29, 27, 25, 23, 21, 19, 17, 15, 13, 11, 9, 7, 5, 3, 1, 78, 78, 78, 78, 78}, + {0, 0, 0, 5, 0, 0, 8, 3, 8, 8, 0, 3, 20, 15, 24, 20, 16, 12, 8, 4, 0, 17, 14, 11, 8, 5, 2, 53, 52, 51, 50, 49, 48, 47, 46, 45, 44, 43, 42, 41, 0, 38, 36, 34, 32, 30, 28, 26, 24, 22, 20, 18, 16, 14, 12, 10, 8, 6, 4, 2, 0, 80, 80, 80}, + {1, 1, 2, 1, 2, 2, 10, 5, 10, 10, 2, 5, 22, 17, 26, 22, 18, 14, 10, 6, 2, 19, 16, 13, 10, 7, 4, 1, 54, 53, 52, 51, 50, 49, 48, 47, 46, 45, 44, 43, 42, 0, 39, 37, 35, 33, 31, 29, 27, 25, 23, 21, 19, 17, 15, 13, 11, 9, 7, 5, 3, 1, 82, 82}, + {0, 0, 2, 0, 4, 4, 6, 0, 12, 12, 4, 7, 0, 19, 14, 24, 20, 16, 12, 8, 4, 0, 18, 15, 12, 9, 6, 3, 0, 55, 54, 53, 52, 51, 50, 49, 48, 47, 46, 45, 44, 43, 0, 40, 38, 36, 34, 32, 30, 28, 26, 24, 22, 20, 18, 16, 14, 12, 10, 8, 6, 4, 2, 0}, + {1, 1, 0, 2, 6, 6, 8, 2, 14, 14, 6, 9, 2, 21, 16, 26, 22, 18, 14, 10, 6, 2, 20, 17, 14, 11, 8, 5, 2, 57, 56, 55, 54, 53, 52, 51, 50, 49, 48, 47, 46, 45, 44, 0, 41, 39, 37, 35, 33, 31, 29, 27, 25, 23, 21, 19, 17, 15, 13, 11, 9, 7, 5, 3}, + {0, 0, 0, 4, 4, 8, 10, 4, 0, 16, 8, 0, 4, 23, 18, 28, 24, 20, 16, 12, 8, 4, 0, 19, 16, 13, 10, 7, 4, 1, 58, 57, 56, 55, 54, 53, 52, 51, 50, 49, 48, 47, 46, 45, 0, 42, 40, 38, 36, 34, 32, 30, 28, 26, 24, 22, 20, 18, 16, 14, 12, 10, 8, 6}, + {1, 1, 2, 3, 6, 5, 0, 6, 2, 9, 10, 2, 6, 25, 20, 15, 26, 22, 18, 14, 10, 6, 2, 21, 18, 15, 12, 9, 6, 3, 0, 59, 58, 57, 56, 55, 54, 53, 52, 51, 50, 49, 48, 47, 46, 0, 43, 41, 39, 37, 35, 33, 31, 29, 27, 25, 23, 21, 19, 17, 15, 13, 11, 9}, + {0, 0, 2, 5, 0, 7, 2, 8, 4, 11, 12, 4, 8, 1, 22, 17, 28, 24, 20, 16, 12, 8, 4, 0, 20, 17, 14, 11, 8, 5, 2, 61, 60, 59, 58, 57, 56, 55, 54, 53, 52, 51, 50, 49, 48, 47, 0, 44, 42, 40, 38, 36, 34, 32, 30, 28, 26, 24, 22, 20, 18, 16, 14, 12}, + {1, 1, 0, 1, 2, 9, 4, 10, 6, 13, 14, 6, 10, 3, 24, 19, 30, 26, 22, 18, 14, 10, 6, 2, 22, 19, 16, 13, 10, 7, 4, 1, 62, 61, 60, 59, 58, 57, 56, 55, 54, 53, 52, 51, 50, 49, 48, 0, 45, 43, 41, 39, 37, 35, 33, 31, 29, 27, 25, 23, 21, 19, 17, 15}, + {0, 0, 0, 0, 0, 1, 0, 12, 0, 15, 16, 8, 0, 5, 26, 21, 16, 28, 24, 20, 16, 12, 8, 4, 0, 21, 18, 15, 12, 9, 6, 3, 0, 63, 62, 61, 60, 59, 58, 57, 56, 55, 54, 53, 52, 51, 50, 49, 0, 46, 44, 42, 40, 38, 36, 34, 32, 30, 28, 26, 24, 22, 20, 18}, + {1, 1, 2, 2, 2, 3, 2, 7, 2, 17, 18, 10, 2, 7, 0, 23, 18, 30, 26, 22, 18, 14, 10, 6, 2, 23, 20, 17, 14, 11, 8, 5, 2, 65, 64, 63, 62, 61, 60, 59, 58, 57, 56, 55, 54, 53, 52, 51, 50, 0, 47, 45, 43, 41, 39, 37, 35, 33, 31, 29, 27, 25, 23, 21}, + {0, 0, 2, 4, 4, 0, 4, 9, 4, 1, 10, 12, 4, 9, 2, 25, 20, 32, 28, 24, 20, 16, 12, 8, 4, 0, 22, 19, 16, 13, 10, 7, 4, 1, 66, 65, 64, 63, 62, 61, 60, 59, 58, 57, 56, 55, 54, 53, 52, 51, 0, 48, 46, 44, 42, 40, 38, 36, 34, 32, 30, 28, 26, 24}, + {1, 1, 0, 3, 6, 2, 6, 11, 6, 3, 12, 14, 6, 11, 4, 27, 22, 17, 30, 26, 22, 18, 14, 10, 6, 2, 24, 21, 18, 15, 12, 9, 6, 3, 0, 67, 66, 65, 64, 63, 62, 61, 60, 59, 58, 57, 56, 55, 54, 53, 52, 0, 49, 47, 45, 43, 41, 39, 37, 35, 33, 31, 29, 27}, + {0, 0, 0, 5, 4, 4, 8, 13, 8, 5, 14, 16, 8, 0, 6, 29, 24, 19, 32, 28, 24, 20, 16, 12, 8, 4, 0, 23, 20, 17, 14, 11, 8, 5, 2, 69, 68, 67, 66, 65, 64, 63, 62, 61, 60, 59, 58, 57, 56, 55, 54, 53, 0, 50, 48, 46, 44, 42, 40, 38, 36, 34, 32, 30}, + {1, 1, 2, 1, 6, 6, 10, 1, 10, 7, 16, 18, 10, 2, 8, 1, 26, 21, 34, 30, 26, 22, 18, 14, 10, 6, 2, 25, 22, 19, 16, 13, 10, 7, 4, 1, 70, 69, 68, 67, 66, 65, 64, 63, 62, 61, 60, 59, 58, 57, 56, 55, 54, 0, 51, 49, 47, 45, 43, 41, 39, 37, 35, 33}, + {0, 0, 2, 0, 0, 8, 6, 3, 12, 0, 18, 20, 12, 4, 10, 3, 28, 23, 18, 32, 28, 24, 20, 16, 12, 8, 4, 0, 24, 21, 18, 15, 12, 9, 6, 3, 0, 71, 70, 69, 68, 67, 66, 65, 64, 63, 62, 61, 60, 59, 58, 57, 56, 55, 0, 52, 50, 48, 46, 44, 42, 40, 38, 36}, + {1, 1, 0, 2, 2, 5, 8, 5, 14, 2, 0, 11, 14, 6, 12, 5, 30, 25, 20, 34, 30, 26, 22, 18, 14, 10, 6, 2, 26, 23, 20, 17, 14, 11, 8, 5, 2, 73, 72, 71, 70, 69, 68, 67, 66, 65, 64, 63, 62, 61, 60, 59, 58, 57, 56, 0, 53, 51, 49, 47, 45, 43, 41, 39}, + {0, 0, 0, 4, 0, 7, 10, 0, 8, 4, 2, 13, 16, 8, 0, 7, 0, 27, 22, 36, 32, 28, 24, 20, 16, 12, 8, 4, 0, 25, 22, 19, 16, 13, 10, 7, 4, 1, 74, 73, 72, 71, 70, 69, 68, 67, 66, 65, 64, 63, 62, 61, 60, 59, 58, 57, 0, 54, 52, 50, 48, 46, 44, 42}, + {1, 1, 2, 3, 2, 9, 0, 2, 10, 6, 4, 15, 18, 10, 2, 9, 2, 29, 24, 19, 34, 30, 26, 22, 18, 14, 10, 6, 2, 27, 24, 21, 18, 15, 12, 9, 6, 3, 0, 75, 74, 73, 72, 71, 70, 69, 68, 67, 66, 65, 64, 63, 62, 61, 60, 59, 58, 0, 55, 53, 51, 49, 47, 45}, + {0, 0, 2, 5, 4, 1, 2, 4, 12, 8, 6, 17, 20, 12, 4, 11, 4, 31, 26, 21, 36, 32, 28, 24, 20, 16, 12, 8, 4, 0, 26, 23, 20, 17, 14, 11, 8, 5, 2, 77, 76, 75, 74, 73, 72, 71, 70, 69, 68, 67, 66, 65, 64, 63, 62, 61, 60, 59, 0, 56, 54, 52, 50, 48}, + {1, 1, 0, 1, 6, 3, 4, 6, 14, 10, 8, 19, 22, 14, 6, 13, 6, 33, 28, 23, 38, 34, 30, 26, 22, 18, 14, 10, 6, 2, 28, 25, 22, 19, 16, 13, 10, 7, 4, 1, 78, 77, 76, 75, 74, 73, 72, 71, 70, 69, 68, 67, 66, 65, 64, 63, 62, 61, 60, 0, 57, 55, 53, 51}, + {0, 0, 0, 0, 4, 0, 0, 8, 0, 12, 0, 21, 12, 16, 8, 0, 8, 1, 30, 25, 20, 36, 32, 28, 24, 20, 16, 12, 8, 4, 0, 27, 24, 21, 18, 15, 12, 9, 6, 3, 0, 79, 78, 77, 76, 75, 74, 73, 72, 71, 70, 69, 68, 67, 66, 65, 64, 63, 62, 61, 0, 58, 56, 54}, + {1, 1, 2, 2, 6, 2, 2, 10, 2, 14, 2, 1, 14, 18, 10, 2, 10, 3, 32, 27, 22, 38, 34, 30, 26, 22, 18, 14, 10, 6, 2, 29, 26, 23, 20, 17, 14, 11, 8, 5, 2, 81, 80, 79, 78, 77, 76, 75, 74, 73, 72, 71, 70, 69, 68, 67, 66, 65, 64, 63, 62, 0, 59, 57}, + {0, 0, 2, 4, 0, 4, 4, 12, 4, 16, 4, 3, 16, 20, 12, 4, 12, 5, 34, 29, 24, 40, 36, 32, 28, 24, 20, 16, 12, 8, 4, 0, 28, 25, 22, 19, 16, 13, 10, 7, 4, 1, 82, 81, 80, 79, 78, 77, 76, 75, 74, 73, 72, 71, 70, 69, 68, 67, 66, 65, 64, 63, 0, 60}, + {1, 1, 0, 3, 2, 6, 6, 7, 6, 9, 6, 5, 18, 22, 14, 6, 14, 7, 0, 31, 26, 21, 38, 34, 30, 26, 22, 18, 14, 10, 6, 2, 30, 27, 24, 21, 18, 15, 12, 9, 6, 3, 0, 83, 82, 81, 80, 79, 78, 77, 76, 75, 74, 73, 72, 71, 70, 69, 68, 67, 66, 65, 64, 0}, + {0, 0, 0, 5, 0, 8, 8, 9, 0, 11, 8, 7, 20, 24, 16, 8, 0, 9, 2, 33, 28, 23, 40, 36, 32, 28, 24, 20, 16, 12, 8, 4, 0, 29, 26, 23, 20, 17, 14, 11, 8, 5, 2, 85, 84, 83, 82, 81, 80, 79, 78, 77, 76, 75, 74, 73, 72, 71, 70, 69, 68, 67, 66, 65}, + {1, 1, 2, 1, 2, 5, 10, 11, 2, 13, 10, 9, 22, 13, 18, 10, 2, 11, 4, 35, 30, 25, 42, 38, 34, 30, 26, 22, 18, 14, 10, 6, 2, 31, 28, 25, 22, 19, 16, 13, 10, 7, 4, 1, 86, 85, 84, 83, 82, 81, 80, 79, 78, 77, 76, 75, 74, 73, 72, 71, 70, 69, 68, 67}, + {0, 0, 2, 0, 4, 7, 6, 13, 4, 15, 12, 0, 0, 15, 20, 12, 4, 13, 6, 37, 32, 27, 22, 40, 36, 32, 28, 24, 20, 16, 12, 8, 4, 0, 30, 27, 24, 21, 18, 15, 12, 9, 6, 3, 0, 87, 86, 85, 84, 83, 82, 81, 80, 79, 78, 77, 76, 75, 74, 73, 72, 71, 70, 69}, + {1, 1, 0, 2, 6, 9, 8, 1, 6, 17, 14, 2, 2, 17, 22, 14, 6, 15, 8, 1, 34, 29, 24, 42, 38, 34, 30, 26, 22, 18, 14, 10, 6, 2, 32, 29, 26, 23, 20, 17, 14, 11, 8, 5, 2, 89, 88, 87, 86, 85, 84, 83, 82, 81, 80, 79, 78, 77, 76, 75, 74, 73, 72, 71}, + {0, 0, 0, 4, 4, 1, 10, 3, 8, 1, 16, 4, 4, 19, 24, 16, 8, 0, 10, 3, 36, 31, 26, 44, 40, 36, 32, 28, 24, 20, 16, 12, 8, 4, 0, 31, 28, 25, 22, 19, 16, 13, 10, 7, 4, 1, 90, 89, 88, 87, 86, 85, 84, 83, 82, 81, 80, 79, 78, 77, 76, 75, 74, 73}, + {1, 1, 2, 3, 6, 3, 0, 5, 10, 3, 18, 6, 6, 21, 26, 18, 10, 2, 12, 5, 38, 33, 28, 23, 42, 38, 34, 30, 26, 22, 18, 14, 10, 6, 2, 33, 30, 27, 24, 21, 18, 15, 12, 9, 6, 3, 0, 91, 90, 89, 88, 87, 86, 85, 84, 83, 82, 81, 80, 79, 78, 77, 76, 75}, + {0, 0, 2, 5, 0, 0, 2, 0, 12, 5, 10, 8, 8, 23, 14, 20, 12, 4, 14, 7, 0, 35, 30, 25, 44, 40, 36, 32, 28, 24, 20, 16, 12, 8, 4, 0, 32, 29, 26, 23, 20, 17, 14, 11, 8, 5, 2, 93, 92, 91, 90, 89, 88, 87, 86, 85, 84, 83, 82, 81, 80, 79, 78, 77}, + {1, 1, 0, 1, 2, 2, 4, 2, 14, 7, 12, 10, 10, 25, 16, 22, 14, 6, 16, 9, 2, 37, 32, 27, 46, 42, 38, 34, 30, 26, 22, 18, 14, 10, 6, 2, 34, 31, 28, 25, 22, 19, 16, 13, 10, 7, 4, 1, 94, 93, 92, 91, 90, 89, 88, 87, 86, 85, 84, 83, 82, 81, 80, 79}, + {0, 0, 0, 0, 0, 4, 0, 4, 8, 0, 14, 12, 0, 1, 18, 24, 16, 8, 0, 11, 4, 39, 34, 29, 24, 44, 40, 36, 32, 28, 24, 20, 16, 12, 8, 4, 0, 33, 30, 27, 24, 21, 18, 15, 12, 9, 6, 3, 0, 95, 94, 93, 92, 91, 90, 89, 88, 87, 86, 85, 84, 83, 82, 81}, + {1, 1, 2, 2, 2, 6, 2, 6, 10, 2, 16, 14, 2, 3, 20, 26, 18, 10, 2, 13, 6, 41, 36, 31, 26, 46, 42, 38, 34, 30, 26, 22, 18, 14, 10, 6, 2, 35, 32, 29, 26, 23, 20, 17, 14, 11, 8, 5, 2, 97, 96, 95, 94, 93, 92, 91, 90, 89, 88, 87, 86, 85, 84, 83}, + {0, 0, 2, 4, 4, 8, 4, 8, 12, 4, 18, 16, 4, 5, 22, 28, 20, 12, 4, 15, 8, 1, 38, 33, 28, 48, 44, 40, 36, 32, 28, 24, 20, 16, 12, 8, 4, 0, 34, 31, 28, 25, 22, 19, 16, 13, 10, 7, 4, 1, 98, 97, 96, 95, 94, 93, 92, 91, 90, 89, 88, 87, 86, 85}, + {1, 1, 0, 3, 6, 5, 6, 10, 14, 6, 0, 18, 6, 7, 24, 15, 22, 14, 6, 17, 10, 3, 40, 35, 30, 25, 46, 42, 38, 34, 30, 26, 22, 18, 14, 10, 6, 2, 36, 33, 30, 27, 24, 21, 18, 15, 12, 9, 6, 3, 0, 99, 98, 97, 96, 95, 94, 93, 92, 91, 90, 89, 88, 87}, + {0, 0, 0, 5, 4, 7, 8, 12, 0, 8, 2, 20, 8, 9, 26, 17, 24, 16, 8, 0, 12, 5, 42, 37, 32, 27, 48, 44, 40, 36, 32, 28, 24, 20, 16, 12, 8, 4, 0, 35, 32, 29, 26, 23, 20, 17, 14, 11, 8, 5, 2, 101, 100, 99, 98, 97, 96, 95, 94, 93, 92, 91, 90, 89}, + {1, 1, 2, 1, 6, 9, 10, 7, 2, 10, 4, 11, 10, 11, 0, 19, 26, 18, 10, 2, 14, 7, 0, 39, 34, 29, 50, 46, 42, 38, 34, 30, 26, 22, 18, 14, 10, 6, 2, 37, 34, 31, 28, 25, 22, 19, 16, 13, 10, 7, 4, 1, 102, 101, 100, 99, 98, 97, 96, 95, 94, 93, 92, 91}, + {0, 0, 2, 0, 0, 1, 6, 9, 4, 12, 6, 13, 12, 0, 2, 21, 28, 20, 12, 4, 16, 9, 2, 41, 36, 31, 26, 48, 44, 40, 36, 32, 28, 24, 20, 16, 12, 8, 4, 0, 36, 33, 30, 27, 24, 21, 18, 15, 12, 9, 6, 3, 0, 103, 102, 101, 100, 99, 98, 97, 96, 95, 94, 93}, + {1, 1, 0, 2, 2, 3, 8, 11, 6, 14, 8, 15, 14, 2, 4, 23, 30, 22, 14, 6, 18, 11, 4, 43, 38, 33, 28, 50, 46, 42, 38, 34, 30, 26, 22, 18, 14, 10, 6, 2, 38, 35, 32, 29, 26, 23, 20, 17, 14, 11, 8, 5, 2, 105, 104, 103, 102, 101, 100, 99, 98, 97, 96, 95}, + {0, 0, 0, 4, 0, 0, 10, 13, 0, 16, 0, 17, 16, 4, 6, 25, 16, 24, 16, 8, 0, 13, 6, 45, 40, 35, 30, 52, 48, 44, 40, 36, 32, 28, 24, 20, 16, 12, 8, 4, 0, 37, 34, 31, 28, 25, 22, 19, 16, 13, 10, 7, 4, 1, 106, 105, 104, 103, 102, 101, 100, 99, 98, 97}, + {1, 1, 2, 3, 2, 2, 0, 1, 2, 9, 2, 19, 18, 6, 8, 27, 18, 26, 18, 10, 2, 15, 8, 1, 42, 37, 32, 27, 50, 46, 42, 38, 34, 30, 26, 22, 18, 14, 10, 6, 2, 39, 36, 33, 30, 27, 24, 21, 18, 15, 12, 9, 6, 3, 0, 107, 106, 105, 104, 103, 102, 101, 100, 99}, + {0, 0, 2, 5, 4, 4, 2, 3, 4, 11, 4, 21, 20, 8, 10, 29, 20, 28, 20, 12, 4, 17, 10, 3, 44, 39, 34, 29, 52, 48, 44, 40, 36, 32, 28, 24, 20, 16, 12, 8, 4, 0, 38, 35, 32, 29, 26, 23, 20, 17, 14, 11, 8, 5, 2, 109, 108, 107, 106, 105, 104, 103, 102, 101}, + {1, 1, 0, 1, 6, 6, 4, 5, 6, 13, 6, 1, 22, 10, 12, 1, 22, 30, 22, 14, 6, 19, 12, 5, 46, 41, 36, 31, 54, 50, 46, 42, 38, 34, 30, 26, 22, 18, 14, 10, 6, 2, 40, 37, 34, 31, 28, 25, 22, 19, 16, 13, 10, 7, 4, 1, 110, 109, 108, 107, 106, 105, 104, 103}, + {0, 0, 0, 0, 4, 8, 0, 0, 8, 15, 8, 3, 12, 12, 0, 3, 24, 32, 24, 16, 8, 0, 14, 7, 0, 43, 38, 33, 28, 52, 48, 44, 40, 36, 32, 28, 24, 20, 16, 12, 8, 4, 0, 39, 36, 33, 30, 27, 24, 21, 18, 15, 12, 9, 6, 3, 0, 111, 110, 109, 108, 107, 106, 105}, + {1, 1, 2, 2, 6, 5, 2, 2, 10, 17, 10, 5, 14, 14, 2, 5, 26, 17, 26, 18, 10, 2, 16, 9, 2, 45, 40, 35, 30, 54, 50, 46, 42, 38, 34, 30, 26, 22, 18, 14, 10, 6, 2, 41, 38, 35, 32, 29, 26, 23, 20, 17, 14, 11, 8, 5, 2, 113, 112, 111, 110, 109, 108, 107}, + {0, 0, 2, 4, 0, 7, 4, 4, 12, 1, 12, 7, 16, 16, 4, 7, 28, 19, 28, 20, 12, 4, 18, 11, 4, 47, 42, 37, 32, 56, 52, 48, 44, 40, 36, 32, 28, 24, 20, 16, 12, 8, 4, 0, 40, 37, 34, 31, 28, 25, 22, 19, 16, 13, 10, 7, 4, 1, 114, 113, 112, 111, 110, 109}, + {1, 1, 0, 3, 2, 9, 6, 6, 14, 3, 14, 9, 18, 18, 6, 9, 30, 21, 30, 22, 14, 6, 20, 13, 6, 49, 44, 39, 34, 29, 54, 50, 46, 42, 38, 34, 30, 26, 22, 18, 14, 10, 6, 2, 42, 39, 36, 33, 30, 27, 24, 21, 18, 15, 12, 9, 6, 3, 0, 115, 114, 113, 112, 111}, + {0, 0, 0, 5, 0, 1, 8, 8, 8, 5, 16, 0, 20, 20, 8, 11, 0, 23, 32, 24, 16, 8, 0, 15, 8, 1, 46, 41, 36, 31, 56, 52, 48, 44, 40, 36, 32, 28, 24, 20, 16, 12, 8, 4, 0, 41, 38, 35, 32, 29, 26, 23, 20, 17, 14, 11, 8, 5, 2, 117, 116, 115, 114, 113}, + {1, 1, 2, 1, 2, 3, 10, 10, 10, 7, 18, 2, 22, 22, 10, 13, 2, 25, 34, 26, 18, 10, 2, 17, 10, 3, 48, 43, 38, 33, 58, 54, 50, 46, 42, 38, 34, 30, 26, 22, 18, 14, 10, 6, 2, 43, 40, 37, 34, 31, 28, 25, 22, 19, 16, 13, 10, 7, 4, 1, 118, 117, 116, 115}, + {0, 0, 2, 0, 4, 0, 6, 12, 12, 0, 10, 4, 0, 24, 12, 0, 4, 27, 18, 28, 20, 12, 4, 19, 12, 5, 50, 45, 40, 35, 30, 56, 52, 48, 44, 40, 36, 32, 28, 24, 20, 16, 12, 8, 4, 0, 42, 39, 36, 33, 30, 27, 24, 21, 18, 15, 12, 9, 6, 3, 0, 119, 118, 117}, + {1, 1, 0, 2, 6, 2, 8, 7, 14, 2, 12, 6, 2, 13, 14, 2, 6, 29, 20, 30, 22, 14, 6, 21, 14, 7, 0, 47, 42, 37, 32, 58, 54, 50, 46, 42, 38, 34, 30, 26, 22, 18, 14, 10, 6, 2, 44, 41, 38, 35, 32, 29, 26, 23, 20, 17, 14, 11, 8, 5, 2, 121, 120, 119}, + {0, 0, 0, 4, 4, 4, 10, 9, 0, 4, 14, 8, 4, 15, 16, 4, 8, 31, 22, 32, 24, 16, 8, 0, 16, 9, 2, 49, 44, 39, 34, 60, 56, 52, 48, 44, 40, 36, 32, 28, 24, 20, 16, 12, 8, 4, 0, 43, 40, 37, 34, 31, 28, 25, 22, 19, 16, 13, 10, 7, 4, 1, 122, 121}, + {1, 1, 2, 3, 6, 6, 0, 11, 2, 6, 16, 10, 6, 17, 18, 6, 10, 33, 24, 34, 26, 18, 10, 2, 18, 11, 4, 51, 46, 41, 36, 31, 58, 54, 50, 46, 42, 38, 34, 30, 26, 22, 18, 14, 10, 6, 2, 45, 42, 39, 36, 33, 30, 27, 24, 21, 18, 15, 12, 9, 6, 3, 0, 123}, + {0, 0, 2, 5, 0, 8, 2, 13, 4, 8, 18, 12, 8, 19, 20, 8, 12, 1, 26, 36, 28, 20, 12, 4, 20, 13, 6, 53, 48, 43, 38, 33, 60, 56, 52, 48, 44, 40, 36, 32, 28, 24, 20, 16, 12, 8, 4, 0, 44, 41, 38, 35, 32, 29, 26, 23, 20, 17, 14, 11, 8, 5, 2, 125}, + {1, 1, 0, 1, 2, 5, 4, 1, 6, 10, 0, 14, 10, 21, 22, 10, 14, 3, 28, 19, 30, 22, 14, 6, 22, 15, 8, 1, 50, 45, 40, 35, 62, 58, 54, 50, 46, 42, 38, 34, 30, 26, 22, 18, 14, 10, 6, 2, 46, 43, 40, 37, 34, 31, 28, 25, 22, 19, 16, 13, 10, 7, 4, 1}, + {0, 0, 0, 0, 0, 7, 0, 3, 0, 12, 2, 16, 0, 23, 24, 12, 0, 5, 30, 21, 32, 24, 16, 8, 0, 17, 10, 3, 52, 47, 42, 37, 32, 60, 56, 52, 48, 44, 40, 36, 32, 28, 24, 20, 16, 12, 8, 4, 0, 45, 42, 39, 36, 33, 30, 27, 24, 21, 18, 15, 12, 9, 6, 3}, + {1, 1, 2, 2, 2, 9, 2, 5, 2, 14, 4, 18, 2, 25, 26, 14, 2, 7, 32, 23, 34, 26, 18, 10, 2, 19, 12, 5, 54, 49, 44, 39, 34, 62, 58, 54, 50, 46, 42, 38, 34, 30, 26, 22, 18, 14, 10, 6, 2, 47, 44, 41, 38, 35, 32, 29, 26, 23, 20, 17, 14, 11, 8, 5}, + {0, 0, 2, 4, 4, 1, 4, 0, 4, 16, 6, 20, 4, 1, 14, 16, 4, 9, 34, 25, 36, 28, 20, 12, 4, 21, 14, 7, 0, 51, 46, 41, 36, 64, 60, 56, 52, 48, 44, 40, 36, 32, 28, 24, 20, 16, 12, 8, 4, 0, 46, 43, 40, 37, 34, 31, 28, 25, 22, 19, 16, 13, 10, 7}, + {1, 1, 0, 3, 6, 3, 6, 2, 6, 9, 8, 11, 6, 3, 16, 18, 6, 11, 0, 27, 38, 30, 22, 14, 6, 23, 16, 9, 2, 53, 48, 43, 38, 33, 62, 58, 54, 50, 46, 42, 38, 34, 30, 26, 22, 18, 14, 10, 6, 2, 48, 45, 42, 39, 36, 33, 30, 27, 24, 21, 18, 15, 12, 9} };